首页 文章 精选 留言 我的

精选列表

搜索[换脸甄别],共10000篇文章
优秀的个人博客,低调大师

IBM新创AI病毒:想打谁就打谁,看脸发作绝不误伤,隐蔽性极强

危机纪年第8年,正准备进入冬眠的面壁者罗辑感染了时下流行的“轻流感”。 一开始,他的症状和别人差不多,流鼻涕、嗓子疼。 可是两天后,情况变得不一样起来,罗辑开始发烧,到了夜里,病情更是急剧恶化,呕吐、吐血等等症状相继出现。 到第二天凌晨,他休克了,嘴唇发紫,身上几乎看不到生命迹象。 ——《三体II 黑暗森林》 如果你还对《三体》有印象,大概记得这个名叫“基因导弹”的暗杀武器。它可以大范围散布,对一般人影响极其轻微,但是,一旦它识别出了暗杀目标的基因特征,就会在这个人的血液中制造致命毒素。 在计算机的世界里,也有这样的病毒。 今天,IBM研究院在计算机安全大会BlackHat上展示了他们制造的恶意软件:DeepLocker。 这个恶意软件运用AI来识别攻击对象,有针对性地发作。而在目标出现之前,它只会藏身在普通的软件之中默默休眠,几乎没有一个病毒该

优秀的个人博客,低调大师

一脸懵逼学习Hadoop-HA机制(以及HA机制的配置文件,测试)

1:能否让两个NameNode都正常影响客户端请求? 应该让两个NameNode节点在某个时间只能有一个节点正常影响客户端请求,相应请求的必须为Active状态的那一台。 2:standBy状态的节点必须能够快速无缝的切换为active状态: 意味着两个NameNode必须时刻保持元数据的一致; 3:HA机制,元数据共享存储,数据同步的问题: 分布式应用:管理edits(同步数据) qjoural:依赖zookeeper实现 4:如何避免状态切换时候发生brain split现象: fencing:一是ssh发送kill指令,二是执行自定义shell脚本 5:hadoop分布式集群HA模式部署,三台机器跑集群: 第一台机器:Zookeeper1 NameNode1 zkfc1 journalnode1 第二台机器:Zookeeper2 NameNode2 zkfc2 journalnode2 第三台机器:Zookeeper3 journalnode3 dataNode16:hadoop分布式集群HA模式部署,七台机器跑集群: 第一台机器:namenode zkfc 第二台机器:namenode zkfc 第三台机器:resourcemanager 第四台机器:resourcemanager 第五台机器:zookeeper journalnode dataNode nodemanager 第六台机器:zookeeper journalnode dataNode nodemanager 第七台机器:zookeeper journalnode dataNode nodemanager

优秀的个人博客,低调大师

一脸懵逼学习Hadoop中的MapReduce程序中自定义分组的实现

1:首先搞好实体类对象: write 是把每个对象序列化到输出流,readFields是把输入流字节反序列化,实现WritableComparable,Java值对象的比较:一般需要重写toString(),hashCode(),equals()方法 1 package com.areapartition; 2 3 import java.io.DataInput; 4 import java.io.DataOutput; 5 import java.io.IOException; 6 7 import org.apache.hadoop.io.Writable; 8 import org.apache.hadoop.io.WritableComparable; 9 10 /*** 11 * 12 * @author Administrator 13 * 1:write 是把每个对象序列化到输出流 14 * 2:readFields是把输入流字节反序列化 15 * 3:实现WritableComparable 16 * Java值对象的比较:一般需要重写toString(),hashCode(),equals()方法 17 * 18 */ 19 public class FlowBean implements WritableComparable<FlowBean>{ 20 21 22 private String phoneNumber;//电话号码 23 private long upFlow;//上行流量 24 private long downFlow;//下行流量 25 private long sumFlow;//总流量 26 27 28 29 public String getPhoneNumber() { 30 return phoneNumber; 31 } 32 public void setPhoneNumber(String phoneNumber) { 33 this.phoneNumber = phoneNumber; 34 } 35 public long getUpFlow() { 36 return upFlow; 37 } 38 public void setUpFlow(long upFlow) { 39 this.upFlow = upFlow; 40 } 41 public long getDownFlow() { 42 return downFlow; 43 } 44 public void setDownFlow(long downFlow) { 45 this.downFlow = downFlow; 46 } 47 public long getSumFlow() { 48 return sumFlow; 49 } 50 public void setSumFlow(long sumFlow) { 51 this.sumFlow = sumFlow; 52 } 53 54 //为了对象数据的初始化方便,加入一个带参的构造函数 55 public FlowBean(String phoneNumber, long upFlow, long downFlow) { 56 this.phoneNumber = phoneNumber; 57 this.upFlow = upFlow; 58 this.downFlow = downFlow; 59 this.sumFlow = upFlow + downFlow; 60 } 61 //在反序列化时候,反射机制需要调用空参的构造函数,所以定义了一个空参的构造函数 62 public FlowBean() { 63 } 64 65 //重写toString()方法 66 @Override 67 public String toString() { 68 return "" + upFlow + "\t" + downFlow + "\t" + sumFlow + ""; 69 } 70 71 72 //从数据流中反序列出对象的数据 73 //从数据流中读取字段时必须和序列化的顺序保持一致 74 @Override 75 public void readFields(DataInput in) throws IOException { 76 phoneNumber = in.readUTF(); 77 upFlow = in.readLong(); 78 downFlow = in.readLong(); 79 sumFlow = in.readLong(); 80 81 } 82 83 //将对象数据序列化到流中 84 @Override 85 public void write(DataOutput out) throws IOException { 86 out.writeUTF(phoneNumber); 87 out.writeLong(upFlow); 88 out.writeLong(downFlow); 89 out.writeLong(sumFlow); 90 91 } 92 93 //流量比较的实现方法 94 @Override 95 public int compareTo(FlowBean o) { 96 97 //大就返回-1,小于等于返回1,进行倒序排序 98 return sumFlow > o.sumFlow ? -1 : 1; 99 } 100 101 102 103 } 2:流量分区处理操作的步骤: 2. 1:对流量原始日志进行流量统计,将不同的省份的用户统计结果输出到不同文件; 2.2:需要自定义改造两个机制: 2.2.1:改造分区的逻辑,自定义一个partitioner 2.2.2:自定义reducer task的并发任务数 1 package com.areapartition; 2 3 import java.io.IOException; 4 5 import org.apache.commons.lang.StringUtils; 6 import org.apache.hadoop.conf.Configuration; 7 import org.apache.hadoop.fs.Path; 8 import org.apache.hadoop.io.LongWritable; 9 import org.apache.hadoop.io.Text; 10 import org.apache.hadoop.mapreduce.Job; 11 import org.apache.hadoop.mapreduce.Mapper; 12 import org.apache.hadoop.mapreduce.Reducer; 13 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 14 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 15 16 /*** 17 * 流量分区处理操作 18 * @author Administrator 19 * 1:对流量原始日志进行流量统计,将不同的省份的用户统计结果输出到不同文件; 20 * 2:需要自定义改造两个机制: 21 * 2.1:改造分区的逻辑,自定义一个partitioner 22 * 2.2:自定义reducer task的并发任务数 23 */ 24 public class FlowSumArea { 25 26 27 public static class FlowSumAreaMapper extends Mapper<LongWritable, Text, Text, FlowBean>{ 28 @Override 29 protected void map(LongWritable key, Text value, Context context) 30 throws IOException, InterruptedException { 31 //拿到一行数据 32 String line = value.toString(); 33 //切分成各个字段 34 String[] fields = StringUtils.split(line, "\t"); 35 36 //获取到我们需要的字段 37 String phoneNumber = fields[1]; 38 long up_flow = Long.parseLong(fields[7]); 39 long down_flow = Long.parseLong(fields[8]); 40 41 //封装成key-value并且输出 42 context.write(new Text(phoneNumber), new FlowBean(phoneNumber, up_flow, down_flow)); 43 } 44 } 45 46 47 public static class FlowSumAreaReducer extends Reducer<Text, FlowBean, Text, FlowBean>{ 48 @Override 49 protected void reduce(Text key, Iterable<FlowBean> values, Context context) 50 throws IOException, InterruptedException { 51 //遍历求和 52 long up_flowSum = 0; 53 long down_flowSum = 0; 54 for(FlowBean fb : values){ 55 up_flowSum += fb.getUpFlow(); 56 down_flowSum += fb.getDownFlow(); 57 } 58 59 //封装成key-value并且输出 60 context.write(key, new FlowBean(key.toString(),up_flowSum,down_flowSum)); 61 } 62 63 } 64 65 66 public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { 67 //创建配置文件 68 Configuration conf = new Configuration(); 69 //获取一个作业 70 Job job = Job.getInstance(conf); 71 72 //设置整个job所用的那些类在哪个jar包 73 job.setJarByClass(FlowSumArea.class); 74 //本job使用的mapper和reducer的类 75 job.setMapperClass(FlowSumAreaMapper.class); 76 job.setReducerClass(FlowSumAreaReducer.class); 77 78 //设置我们自定义的分组逻辑定义 79 job.setPartitionerClass(AreaPartitioner.class); 80 81 //指定mapper的输出数据key-value类型 82 job.setMapOutputKeyClass(Text.class); 83 job.setMapOutputValueClass(FlowBean.class); 84 85 //指定reduce的输出数据key-value类型Text 86 job.setOutputKeyClass(Text.class); 87 job.setOutputValueClass(FlowBean.class); 88 89 90 //设置reduce的任务并发数,应该跟分组的数量保持一致 91 job.setNumReduceTasks(7); 92 93 //指定要处理的输入数据存放路径 94 //FileInputFormat是所有以文件作为数据源的InputFormat实现的基类, 95 //FileInputFormat保存作为job输入的所有文件,并实现了对输入文件计算splits的方法。 96 //至于获得记录的方法是有不同的子类——TextInputFormat进行实现的。 97 FileInputFormat.setInputPaths(job, new Path(args[0])); 98 99 //指定处理结果的输出数据存放路径 100 FileOutputFormat.setOutputPath(job, new Path(args[1])); 101 102 //将job提交给集群运行 103 //job.waitForCompletion(true); 104 //正常执行成功返回0,否则返回1 105 System.exit(job.waitForCompletion(true) ? 0 : 1);; 106 107 } 108 109 } 3:从key中拿到手机号,查询手机归属地字典,不同的省份返回不同的组号: 3.1:Partitioner是partitioner的基类,如果需要定制partitioner也需要继承该类。 3.2:HashPartitioner是mapreduce的默认partitioner。计算方法是 which reducer=(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks,得到当前的目的reducer。 1 package com.areapartition; 2 3 import java.util.HashMap; 4 5 import org.apache.hadoop.mapreduce.Partitioner; 6 7 public class AreaPartitioner<KEY,VALUE> extends Partitioner<KEY, VALUE>{ 8 9 private static HashMap<String, Integer> areaMap = new HashMap<String,Integer>(); 10 11 static{ 12 areaMap.put("135", 0); 13 areaMap.put("136", 1); 14 areaMap.put("137", 2); 15 areaMap.put("138", 3); 16 areaMap.put("139", 4); 17 areaMap.put("841", 5); 18 } 19 20 @Override 21 public int getPartition(KEY key, VALUE value, int numPartitions) { 22 //从key中拿到手机号,查询手机归属地字典,不同的省份返回不同的组号 23 Integer areaCoder = areaMap.get(key.toString().subSequence(0, 3)) == null ? 6 : areaMap.get(key.toString().subSequence(0, 3)); 24 25 26 return areaCoder; 27 } 28 29 30 } 4:将打好的jar包上传到虚拟机上面: 然后启动搭建的集群start-dfs.sh,start-yarn.sh: 然后操作如下所示: 1 [root@master hadoop]# hadoop jar flowarea.jar com.areapartition.FlowSumArea /flow/data /flow/areaoutput4 2 17/09/25 15:36:38 INFO client.RMProxy: Connecting to ResourceManager at master/192.168.0.55:8032 3 17/09/25 15:36:38 WARN mapreduce.JobSubmitter: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this. 4 17/09/25 15:36:38 INFO input.FileInputFormat: Total input paths to process : 1 5 17/09/25 15:36:38 INFO mapreduce.JobSubmitter: number of splits:1 6 17/09/25 15:36:38 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1506324201206_0004 7 17/09/25 15:36:38 INFO impl.YarnClientImpl: Submitted application application_1506324201206_0004 8 17/09/25 15:36:38 INFO mapreduce.Job: The url to track the job: http://master:8088/proxy/application_1506324201206_0004/ 9 17/09/25 15:36:38 INFO mapreduce.Job: Running job: job_1506324201206_0004 10 17/09/25 15:36:43 INFO mapreduce.Job: Job job_1506324201206_0004 running in uber mode : false 11 17/09/25 15:36:43 INFO mapreduce.Job: map 0% reduce 0% 12 17/09/25 15:36:48 INFO mapreduce.Job: map 100% reduce 0% 13 17/09/25 15:36:56 INFO mapreduce.Job: map 100% reduce 14% 14 17/09/25 15:37:04 INFO mapreduce.Job: map 100% reduce 29% 15 17/09/25 15:37:08 INFO mapreduce.Job: map 100% reduce 43% 16 17/09/25 15:37:10 INFO mapreduce.Job: map 100% reduce 71% 17 17/09/25 15:37:11 INFO mapreduce.Job: map 100% reduce 86% 18 17/09/25 15:37:12 INFO mapreduce.Job: map 100% reduce 100% 19 17/09/25 15:37:12 INFO mapreduce.Job: Job job_1506324201206_0004 completed successfully 20 17/09/25 15:37:12 INFO mapreduce.Job: Counters: 49 21 File System Counters 22 FILE: Number of bytes read=1158 23 FILE: Number of bytes written=746635 24 FILE: Number of read operations=0 25 FILE: Number of large read operations=0 26 FILE: Number of write operations=0 27 HDFS: Number of bytes read=2322 28 HDFS: Number of bytes written=526 29 HDFS: Number of read operations=24 30 HDFS: Number of large read operations=0 31 HDFS: Number of write operations=14 32 Job Counters 33 Launched map tasks=1 34 Launched reduce tasks=7 35 Data-local map tasks=1 36 Total time spent by all maps in occupied slots (ms)=2781 37 Total time spent by all reduces in occupied slots (ms)=98540 38 Total time spent by all map tasks (ms)=2781 39 Total time spent by all reduce tasks (ms)=98540 40 Total vcore-seconds taken by all map tasks=2781 41 Total vcore-seconds taken by all reduce tasks=98540 42 Total megabyte-seconds taken by all map tasks=2847744 43 Total megabyte-seconds taken by all reduce tasks=100904960 44 Map-Reduce Framework 45 Map input records=22 46 Map output records=22 47 Map output bytes=1072 48 Map output materialized bytes=1158 49 Input split bytes=93 50 Combine input records=0 51 Combine output records=0 52 Reduce input groups=21 53 Reduce shuffle bytes=1158 54 Reduce input records=22 55 Reduce output records=21 56 Spilled Records=44 57 Shuffled Maps =7 58 Failed Shuffles=0 59 Merged Map outputs=7 60 GC time elapsed (ms)=1751 61 CPU time spent (ms)=4130 62 Physical memory (bytes) snapshot=570224640 63 Virtual memory (bytes) snapshot=2914865152 64 Total committed heap usage (bytes)=234950656 65 Shuffle Errors 66 BAD_ID=0 67 CONNECTION=0 68 IO_ERROR=0 69 WRONG_LENGTH=0 70 WRONG_MAP=0 71 WRONG_REDUCE=0 72 File Input Format Counters 73 Bytes Read=2229 74 File Output Format Counters 75 Bytes Written=526 76 [root@master hadoop]# hadoop fs -ls /flow/ 77 Found 10 items 78 drwxr-xr-x - root supergroup 0 2017-09-25 15:25 /flow/areaoutput 79 drwxr-xr-x - root supergroup 0 2017-09-25 15:34 /flow/areaoutput2 80 drwxr-xr-x - root supergroup 0 2017-09-25 15:35 /flow/areaoutput3 81 drwxr-xr-x - root supergroup 0 2017-09-25 15:37 /flow/areaoutput4 82 -rw-r--r-- 1 root supergroup 2229 2017-09-20 10:00 /flow/data 83 drwxr-xr-x - root supergroup 0 2017-09-20 09:35 /flow/output 84 drwxr-xr-x - root supergroup 0 2017-09-20 09:47 /flow/output2 85 drwxr-xr-x - root supergroup 0 2017-09-20 10:01 /flow/output3 86 drwxr-xr-x - root supergroup 0 2017-09-20 10:21 /flow/output4 87 drwxr-xr-x - root supergroup 0 2017-09-21 19:32 /flow/sortoutput 88 [root@master hadoop]# hadoop fs -ls /flow/areaoutput4 89 Found 8 items 90 -rw-r--r-- 1 root supergroup 0 2017-09-25 15:37 /flow/areaoutput4/_SUCCESS 91 -rw-r--r-- 1 root supergroup 77 2017-09-25 15:36 /flow/areaoutput4/part-r-00000 92 -rw-r--r-- 1 root supergroup 49 2017-09-25 15:37 /flow/areaoutput4/part-r-00001 93 -rw-r--r-- 1 root supergroup 104 2017-09-25 15:37 /flow/areaoutput4/part-r-00002 94 -rw-r--r-- 1 root supergroup 22 2017-09-25 15:37 /flow/areaoutput4/part-r-00003 95 -rw-r--r-- 1 root supergroup 102 2017-09-25 15:37 /flow/areaoutput4/part-r-00004 96 -rw-r--r-- 1 root supergroup 24 2017-09-25 15:37 /flow/areaoutput4/part-r-00005 97 -rw-r--r-- 1 root supergroup 148 2017-09-25 15:37 /flow/areaoutput4/part-r-00006 98 [root@master hadoop]# hadoop fs -cat /flow/areaoutput4/part-r-00000 99 13502468823 102 7335 7437 100 13560436666 954 200 1154 101 13560439658 5892 400 6292 102 [root@master hadoop]# hadoop fs -cat /flow/areaoutput4/part-r-00001 103 13602846565 12 1938 1950 104 13660577991 9 6960 6969 105 [root@master hadoop]# hadoop fs -cat /flow/areaoutput4/part-r-00002 106 13719199419 0 200 200 107 13726230503 2481 24681 27162 108 13726238888 2481 24681 27162 109 13760778710 120 200 320 110 [root@master hadoop]# hadoop fs -cat /flow/areaoutput4/part-r-00003 111 13826544101 0 200 200 112 [root@master hadoop]# hadoop fs -cat /flow/areaoutput4/part-r-00004 113 13922314466 3008 3720 6728 114 13925057413 63 11058 11121 115 13926251106 0 200 200 116 13926435656 1512 200 1712 117 [root@master hadoop]# hadoop fs -cat /flow/areaoutput4/part-r-00005 118 84138413 4116 1432 5548 119 [root@master hadoop]# hadoop fs -cat /flow/areaoutput4/part-r-00006 120 13480253104 180 200 380 121 15013685858 27 3659 3686 122 15920133257 20 3156 3176 123 15989002119 3 1938 1941 124 18211575961 12 1527 1539 125 18320173382 18 9531 9549 5:复制多份测试数据操作如下,测试map的多线程执行: 5.1:map task 的并发数是切片的数量决定的,有多少个切片,就启动多少个map task。 5.2:切片是一个逻辑的概念,指的就是文件中数据的偏移量的范围。 5.3:切片的具体大小应该根据所处理的文件的大小来调整。 [root@master hadoop]# hadoop fs -mkdir /flow/data/ [root@master hadoop]# hadoop fs -put HTTP_20130313143750.dat /flow/data/ [root@master hadoop]# hadoop fs -cp /flow/data/HTTP_20130313143750.dat /flow/data/HTTP_20130313143750.dat.2 [root@master hadoop]# hadoop fs -cp /flow/data/HTTP_20130313143750.dat /flow/data/HTTP_20130313143750.dat.3 [root@master hadoop]# hadoop fs -cp /flow/data/HTTP_20130313143750.dat /flow/data/HTTP_20130313143750.dat.4 [root@master hadoop]# hadoop fs -ls /flow/data/ Found 4 items -rw-r--r-- 1 root supergroup 2229 2017-09-25 16:36 /flow/data/HTTP_20130313143750.dat -rw-r--r-- 1 root supergroup 2229 2017-09-25 16:36 /flow/data/HTTP_20130313143750.dat.2 -rw-r--r-- 1 root supergroup 2229 2017-09-25 16:37 /flow/data/HTTP_20130313143750.dat.3 -rw-r--r-- 1 root supergroup 2229 2017-09-25 16:37 /flow/data/HTTP_20130313143750.dat.4 [root@master hadoop]# 6:Combiners编程 6.1:每一个map可能会产生大量的输出,combiner的作用就是在map端对输出先做一次合并,以减少传输到reducer的数据量。 6.2:combiner最基本是实现本地key的归并,combiner具有类似本地的reduce功能。 6.3: 如果不用combiner,那么,所有的结果都是reduce完成,效率会相对低下。使用combiner,先完成的map会在本地聚合,提升速度。 6.4:注意:Combiner的输出是Reducer的输入,如果Combiner是可插拔的,添加Combiner绝不能改变最终的计算结果。所以Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等。 7:shuffle机制: 7.1:每个map有一个环形内存缓冲区,用于存储任务的输出。默认大小100MB(io.sort.mb属性),一旦达到阀值0.8(io.sort.spill.percent),一个后台线程把内容写到(spill)磁盘的指定目录(mapred.local.dir)下的新建的一个溢出写文件。 7.2:写磁盘前,要partition(分组),sort(排序)。如果有combiner,combine排序后数据。 7.3:等最后记录写完,合并全部溢出写文件为一个分区且排序的文件。 7.4:Reducer通过Http方式得到输出文件的分区。 7.5:TaskTracker为分区文件运行Reduce任务。复制阶段把Map输出复制到Reducer的内存或磁盘。一个Map任务完成,Reduce就开始复制输出。 7.6:排序阶段合并map输出。然后走Reduce阶段。

优秀的个人博客,低调大师

北大团队研发“车脸”识别系统,不看车牌看外观特征实现精确识别

北京大学信息科学技术学院田永鸿等三名研究人员研发了根据汽车外观特征,而非扫描车牌号来精确识别摄像头拍摄的车辆的新技术。研究人员称该项技术也能用于人脸识别和行人检测,能为侦破盗窃车辆等案件提供帮助。 论文:https://arxiv.org/pdf/1708.02386.pdf 据《参考消息》8月30日引西媒报道,北京大学信息科学技术学院田永鸿等三名研究人员研发了根据汽车外观特征精确识别摄像头拍摄的车辆的新技术。该系统不再依靠扫描车牌号,而是基于对车辆外观特征的记录和分析,如轮廓线条、碰撞损伤或漆面刮痕等,依据这些特征数据搜索出机动车的型号和注册信息。 研究人员将这一多任务学习框架命名为“Repression Network (RepNet)”,识别车辆依据的指标分为两类,一类是车辆外观的“一般细节”,如颜色、品牌、型号等;另一类是车辆的

优秀的个人博客,低调大师

普通人算完这笔钱决定换哪个

月底收到云端账单弹窗,你盯着数字发愣。上个月明明只用了 54 次任务,怎么扣款金额飙到了 3.99 万亿的体量级别?有个做了 6 年前端的开发者发现,Space-Bunny 这个匿名模型上线时,积分标 0.03 倍,看着便宜,但算完才发现是个坑。为什么同样的 1M 上下文,有人觉得超值,有人觉得被收割?问题出在哪?其实不在模型本身,而在咱们没把那笔算术题算清楚。 2026 年 10 月 3 日,这份观察引起了关注。那个开发者在群里发截图,显示单次调用成本仅为 0.06 元,但日均调用量高达 5.6 万次。这意味着什么?意味着虽然单价低,但总量惊人。他后来复盘,发现是因为把 Context Length(上下文长度)当成了免费午餐,结果月度累计成本直接冲到了 8.3 万亿的规模感。这不是危言耸听,是真实发生的费用溢出。 很多人误判,是因为只看单价,不看总量。 咱们常以为「按量计费」就是用最便宜的。但 Space-Bunny 的例子告诉你,0.03 倍的积分折扣只是幌子。真正的大头是 1M 上下文带来的 Token 消耗。当你把任务丢给 WorkBuddy 或 penRouter 处理时,每一个长文本片段都在计费。那个开发者算过,如果去掉不必要的 1M 长上下文,把参数改小,成本能降 54%。这 54% 可不是小数,是实打实的真金白银。 咱们来拆解这道模型选型的算术题。 首要是,看上下文长度。1M 看起来很爽,能装下整本书,但你真的需要吗?大多数日常任务,2k 到 4k 就够了。再下来,看调用频次。如果像素材里提到的那样,日均 5.6 万次,那省下的每一个 Token 都是钱。之后,看限时折扣。有时候平台会推限时折扣,但前提是你要预估好用量。那个开发者发现,如果不做限制,一个月轻松烧掉 3.1 倍的预算。 因此,普通人该怎么做?别等账单来了再哭。 今晚就打开你的云端面板,导出上个月的用量明细。重点看「上下文长度」和「调用次数」这两列。如果你发现 90% 的任务都用了 1M 上下文,而实际只需要 4k,那就把默认参数改过来。同时,检查一下有没有开启「按量计费」的自动续费,如果没有必要,先关掉。记住,省钱的本质不是选最便宜的模型,而是选最合适的上下文长度。 这一步,能让你下个月的账单少一半。别再为用不到的 1M 上下文买单了。 那种看着数字飙升却无能为力的感觉,比直接扣款更让人焦虑。因为这意味着你对自己的消费完全没有掌控感,就像开着一辆油门失灵的赛车,只知道快,却不知道能跑多远、要花多少油钱。Space-Bunny 这个案例之这就导致被拿来反复剖析,不是因为它的单价低到离谱,而是因为它精准地踩中了大多数开发者和企业主的盲区:对“容量”的过度自信。 我们在选型时,往往有一种错觉,觉得买 bigger is better,觉得 1M 上下文是一把万能钥匙,能解决所有复杂任务。但现实是,绝大多数业务场景根本不需要装载整本书。比如整理会议纪要、翻译一段文档、或者处理几封邮件,2k 到 4k 的窗口绰绰有余。强行开启 1M 模式,不仅拉高了单价,更可怕的是引发了 Token 的指数级膨胀。每一次处理,模型都要在巨大的空间里检索和计算,这多出来的算力开销,最终都化作账单上那一行行冰冷的数字。那个开发者复盘时提到,当他把上下文长度强制限制在 4k 后,处理速度反而提升了 30%,因为模型不需要再在大海里捞针,而是直接在书架的第一排就能拿到目标书籍。 这引出了第二个关键点:分层策略。 聪明的用户从不指望一个模型打天下。他们会建立一套分层架构。简单、高频、短文本的任务,扔给那些积分倍数极低甚至免费的轻量级模型,比如 WorkBuddy 的基础档位。只有那些真正需要长逻辑链条、复杂代码审查、或者深度文档分析的硬核任务,才动用 1M 上下文的重型模型。这种组合拳打下来,成本结构会变得非常健康。而不是像 Space-Bunny 初期那样,把所有任务一股脑塞进同一个高 Context 管道里,结果就是,你以为是VIP待遇,其实是按豪华套餐算快餐钱。 很多人直到看到月度累计成本冲到天上去,才惊觉自己掉进了陷阱。那个 5.6 万次的日均调用量,听起来不多,但在高 Context 模式下,每次调用的隐性成本极高。一旦规模放大,哪怕每次只多付几个 Token 的钱,汇聚起来就是天文数字。这就是为什么那个开发者到末了说,如果不做限制,一个月轻松烧掉 3.1 倍的预算。这 3.1 倍,不是模型贵了 3.1 倍,而是你的使用习惯“贵”了 3.1 倍。 所以,真正的省钱,是一场关于“克制”的修行。 你要学会拒绝那些看似诱人的全量功能。在设置任务时,先问自己:我真的需要这段长上下文吗?如果答案是“不确定”或“也许”,那就默认选择更小的窗口。这种习惯一旦养成,你会发现自己对资源的敏感度急剧上升。你会开始关注每一个接口调用的细节,开始对比不同模型的性价比,开始意识到,便宜的不是模型,而是那些被精心设计的、符合你真实需求的使用场景。 别再让账单成为你的 surprises。今晚就去检查你的用量明细,把那些不必要的 1M 默认设置改回 4k,关掉自动续费的高配选项。这才是对自己钱包最负责任的做法。

优秀的个人博客,低调大师

从亚马逊 AGI 部门裁员看 AI 商业逻辑的必然转向 -- 资本不会给AGI 半点脸

**通用愿景终需让位于商业变现 亚马逊(Amazon)对其通用人工智能(AGI)部门进行针对性裁员与组织重组**,再次在科技界与资本市场掀起波澜。从高管相继离职、部门并入底层芯片与量子计算团队,到如今数据与信息相关团队的裁员,这一系列变动的核心信号非常明确:即使是资金雄厚的科技巨头,也在重新审视对 AGI 的“无限度押注”。 这一事件折射出一个深刻的行业趋势:在资本市场中,宏大的 AGI(通用人工智能)并非 AI 发展的唯一或最佳终点,AI 产业正加速回归商业的基本法则——创造价值、控制成本与实现盈利。 **一、 “故事时代”的终结:资本不再为宏大叙事买单 过去几年,科技巨头与初创公司只要打出“走向 AGI”或“打造超级智能”的旗号,就能轻松吸引数以百亿计的资金投入,并在资本市场获得极高的估值溢价。在这一时期:** 算力狂飙与资金消耗:模型参数呈指数级增长,训练成本高达数亿美元,甚至向千亿规模蔓延。 不计回报的幻象:市场乐于为“未来颠覆一切”的愿景买单,盈利时间表被无限推迟。 然而,随着高利率环境、高昂的算力开支以及大模型边际效应递减等现实问题的暴露,资本市场的态度发生了根本性转变。投资者和董事会开始追问:庞大的 Capex(资本支出)何时能够转化为真正的 Cash Flow(现金流)? 亚马逊对 AGI 部门的精简,正是巨头对这种市场情绪变化做出的直接回应——“讲故事”的时代结束了,“算细账”的时代已经到来。 **二、 AGI 的尴尬:远期理想与近期商业化诉求的脱节 AGI 试图打造具备人类级别全面认知能力的通用系统,这一目标虽然雄伟,但在商业逻辑上存在天然的阵痛:** 极高的确定性成本 vs 极高的不确定性回报 AGI 的研发是典型的“基础科学突破”模式,研发周期长、成功率难以预测。对于上市公司而言,持续将数十亿美元投入不确定性极高的数据与算法探索中,极易拖累整体财务表现。 **“技术突破”不等于“商业落地” 即使模型在某些 benchmark(基准测试)上获得了高分,若无法精准解决客户的实际业务痛点,也难以转化为长期的订阅收入或软件服务费。** 正如亚马逊官方强调的,裁员是为了将资源集中在“能为客户创造最大价值的重点项目”上。这意味着,无法在短期或中期内转化为商业收益的“前沿 AGI 探索”,必须向具备明确落地场景的 AI 产品让路。 **三、 AI 的正确打开方式:重回商业本质 资本市场并非不再看好 AI,而是重新定义了“优质 AI 资产”的标准。从亚马逊的战略调整中可以看出,AI 的重心正全面转向以下三个商业基本盘:** 垂直场景与应用化(Application Layer):比起万能的通用大模型,市场更青睐能够落地在零售、医疗、金融、客服等具体场景的 AI 工具,这些应用能产生直接的付费意愿。 云计算与基础设施变现(Infra & AWS):亚马逊并未削减整体 AI 投资,其 Nova 基础模型和 AWS 的生成式 AI 服务依然在快速推进。原因在于,AWS 卖的是“算力与 AI 服务工具”,这是能带来即时营收的 B 端生意。 ROI(投资回报率)驱动的技术研发:无论是自主芯片研发(如 Inferentia/Trainium)还是降本增效的工程优化,其核心目的都是降低模型推理成本,提升利润率。 **四、 结语 通用人工智能(AGI)或许是学术界和技术狂想者的终极梦想,但在商业规律和资本市场的客观逻辑面前,它绝不是 AI 产业短期内的最佳选择。** 亚马逊 AGI 部门的调整是一个风向标:AI 正在从“狂热的科研竞赛”回归“理性的商业运作”。能够存活并最终赢得市场的 AI 企业,必然不是那些仅靠“AGI 概念”烧钱的企业,而是那些能够恪守商业法则、将技术切实转化为客户价值与企业利润的实干者。

优秀的个人博客,低调大师

我一脸懵逼。。

作者:letcafe<br> 来源:https://www.cnblogs.com/letcafe/p/loginSecurity.html 1. 一个简单的HTML例子看看用户信息安全 标准的HTML语法中,支持在form表单中使用 <input></input> 标签来创建一个HTTP提交的属性,现代的WEB登录中,常见的是下面这样的表单: <form action = "http://localhost:8080/Application/login" method = "POST"> 用户名:<input id="username" name="username" type="text" /> 密码:<input id="password" name="password" type="password" /> <button type="submit">登陆</button> </form> form表单会在提交请求时,会获取form中input标签存在name的属性,作为HTTP请求的body中的参数传递给后台,进行登录校验。 例如我的账号是user1,密码是123456,那么我在提交登录的时候会给后台发送的HTTP请求如下(Chrome或者FireFox开发者工具捕获,需开启Preserve log): 可以发现即便password字段是黑点,但是本机仍以明文的形式截获请求。 2. HTTP协议传输直接暴露用户密码字段 在网络传输过程中,被嗅探到的话会直接危及用户信息安全,以Fiddler或Wireshark为例,发现捕获的HTTP报文中包含敏感信息: 3. 使用加密算法能保证密码安全吗? WEB前端可以通过某种算法,对密码字段进行加密后,在将密码作为Http请求的内容进行提交,常见的包括对称和非对称加密。 对称加密:采用对称密码编码技术,它的特点是文件加密和解密使用相同的密钥加密。 非对称加密:需要两个密钥,公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。 3.1 使用对称加密 加密解密在前后台协商后,似乎是个不错的办法,比如,前台使用一个字符串位移+字符串反转的简单方法(举个例子,当然不能这么简单)。那么,如果原密码123456先移位: 123456-->456123 再进行反转: 456123-->321654 那么这样简单的方法似乎可以混淆原密码,并且轻松由后台进行相反操作复原。但是这有两个缺点: 前后端加密解密需要同时修改代码; 前端加密无非是写在JS里,但是JS有风险被直接破解从而识别加密方法。 3.2 非对称加密HTTPS就一定是安全的吗? 非对称加密有着公钥私钥的存在,公钥可以随意获取,私钥是用来对公钥解密的本地存储,通过公私钥的机制似乎可以保证传输加密并且乃至现在还在使用的HTTPS就是基于这个原理。 但是HTTPS就一定安全吗?HTTP存在两种可能的风险: HTTPS可以保证传输过程中的信息不被别人截获,但是细细思考下,HTTPS是应用层协议,下层采用SSL保证信息安全,但是在客户端和服务端,密文同样是可以被截获的; HTTPS报文在传输过程中,如果客户端被恶意引导安装“中间人”的WEB信任证书,那么HTTPS中的“中间人攻击”一样会将明文密码泄露给别人。 4. 结论是,无论HTTP还是HTTPS,密码必须密文传输 想想HTTPS也不能一定保障用户密码信息,那么就应该考虑在应用层之上再继续对密码进行保护,也就是编写代码来进行控制,而不依赖特定协议,比较容易想到的就是利用不可逆加密散列函数MD5(string),用户在注册输入密码的时候,就存储MD5(password)值,并且在WEB端先进行MD5(password),然后将密码传输至后台,与数据库中的密文进行比较(PS:MD5函数在指定位数的情况下,对相同字符串运算值相同)。优点比较明显: 保证了用户数据库内部的密码信息安全; 传输过程中无论如何都不会使得用户的密文被破解出原密码; 简单高效,执行以及编码难度都不大,各种语言都提供MD5支持,开发快。 5. 那太好了!这样可以省下HTTPS的钱了,真是这样吗? 回到开头的例子:用户输入的用户名是:user1,密码是:123456,那么不管在什么协议之下,可以看到实际发送的HTTP/HTTPS报文在MD5处理后是这样的: 没错,加密登录成功了。但是,当我们庆祝密码安全的时候,发现账户的钱突然不翼而飞。这是为什么呢?黑客却笑的很开心:因为他们并不一定要获取到你的密码明文,如果直接截获你的密码密文,然后发送给服务器不是一样可以登录吗?因为数据库里的不也是MD5(password)的一样的密文吗?HTTP请求被伪造,一样可以登录成功,从而攫取其他的数据或者转走余额。 这怎么办?其实并不难,有很多种解决方法?其实原理都是类似的:那就是服务器缓存生成随机的验证字段,并发送给客户端,当客户端登录时,把这个一并字段传给服务器,用于校验。 5.1 方案一:验证码 MVC场景。控制器将把数据的Model封装到View中,这种存在Session的连接方式,允许了在Session中存取信息。那么我们可以利用一些开源的验证码生成工具,例如JAVA中的Kaptcha,在服务端存放生成一个验证码值以及一个验证码的生成图片,将图片以Base64编码,并返回给View,在View中解码Base64并加载图片,并于用户下次登录时再进行比对。 5.2 方案二:token令牌 前后端分离场景。现在非常流行的前后端分离的开发模式大大提高了项目的开发效率。职责、分工明确,但是由于HTTP是无状态的(就是这一次请求并不知道上一次请求的内容),当用户登录时,根据用户的username作为key,生成随机令牌(例如UUID)作为value缓存在Redis中,并且将token返回给客户端,当客户端登录时,将完成校验,并且删除Redis中的那条缓存记录。 那么每次从服务器中获取认证的token,确实能保证HTTP请求是由前端传回来的了,因为token在每次登陆后都会删除并被重置,会导致黑客尝试重放账号密码数据信息来登陆的时候导致无法成功登陆。 总而言之,就是我拿到了账号以及密码的密文也登陆不了,因为,如果请求不包含后台认证的令牌token,是个非法请求。 6. 太不容易了!可是还别高兴的太早,当心数据被篡改 密码也加密了,黑客看不到明文了。加上Token了,登陆过程也没法再被截获重放了。可是想想这种情况,你在进行某宝上的网络支付,需要账号,密码,金额,token这四个字段进行操作,然后支付的时候你付了1块钱买了一袋包邮的小浣熊干脆面,某宝结算结束后,你发现你的账户余额被扣了1万元。这又是怎么回事呢? 因为即便黑客不登录,不操作,一样要搞破坏:当请求路由到黑客这边的时候,截获数据包,然后也不需要登录,反正账号密码都是对的,token也是对的,那么把数据包的字段改改,搞破坏就可以了,于是把money改成了1万,再传给服务器,作为受害者就莫名其妙踩了这个坑。可这该怎么解决呢?其实原理类似于HTTPS里的数字签名机制,首先科普下什么是数字摘要以及数字签名: 6.1 什么是“数字摘要” 我们在下载文件的时候经常会看到有的下载站点也提供下载文件的“数字摘要“,供下载者验证下载后的文件是否完整,或者说是否和服务器上的文件”一模一样“。其实,数字摘要就是采用单项Hash函数将需要加密的明文“摘要”成一串固定长度(128位)的密文,这一串密文又称为数字指纹,它有固定的长度,而且不同的明文摘要成密文,其结果总是不同的,而同样的内容信息其摘要必定一致。 因此,“数字摘要“叫”数字指纹“可能会更贴切一些。“数字摘要“是HTTPS能确保数据完整性和防篡改的根本原因。 6.2 数字签名--水到渠成的技术 假如发送方想把一份报文发送给接收方,在发送报文前,发送方用一个哈希函数从报文文本中生成报文摘要,然后用自己的私人密钥对这个摘要进行加密,这个加密后的摘要将作为报文的”签名“和报文一起发送给接收方,接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要,接着再用发送方的公用密钥来对报文附加的数字签名进行解密,如果这两个摘要相同、那么接收方就能确认报文是从发送方发送且没有被遗漏和修改过!这就是结合“非对称密钥加解密”和“数字摘要“技术所能做的事情,这也就是人们所说的“数字签名”技术。在这个过程中,对传送数据生成摘要并使用私钥进行加密地过程就是生成”数字签名“的过程,经过加密的数字摘要,就是”数字签名“。 因此,我们可以在WEB端对之前案例中提到的username+MD5(password)+token通过签名,得到一个字段checkCode,并将checkCode发送给服务器,服务器根据用户发送的checkCode以及自身对原始数据签名进行运算比对,从而确认数据是否中途被篡改,以保持数据的完整性。 7. 总结 看似非常简单的WEB登录,其实里面也存在着非常多的安全隐患。这些安全完善的过程是在一个实际WEB项目中遇到的,上面的分析演化是在应对项目安全的检查中所提出的解决方案,多少会有很多不足的地方,希望一起交流探讨,共同进步! 补充1:JS加密函数存在被破解 感谢园友mysgk指出完整性检验中关于JS加密函数存在被破解的问题: 问题描述: 如果黑客通过阅读前端js源码,发现加密算法,是否意味他可以构造可以 被服务端解密的checkCode 来欺骗服务端呢 ? 我想了下,应该也是很多网站也在采取的策略: 摘要或加密JS算法不直接以静态文件的形式存在浏览器中,而是让WEB端去请求Server,服务器可以根据随机令牌token值决定返回一个相应随机的加密策略,以JS代码响应的方式返回,在异步请求响应中,加载JS摘要算法,这样客户端就可以动态加载数字摘要策略,保证无法仿造。 补充2:MD5存在隐患的问题 感谢园友EtherDream提出MD5已经过时,并且存在不安全的问题: 问题描述: 用MD5、SHA256 处理密码的过时了。。。现在 PBKDF、bcrypt 都在过时中。 本文重点侧重于方法思路的介绍,并不一定是要使用MD5函数,可以使用其他的方式。 MD5存在隐患,之前确实没有考虑太多,不过非常感谢园友指出,确实是这样的,主要思想是: 对于MD5的破解,实际上都属于【碰撞】。比如原文A通过MD5可以生成摘要M,我们并不需要把M还原成A,只需要找到原文B,生成同样的摘要M即可。 设MD5的哈希函数是MD5(),那么: MD5(A) = M MD5(B) = M 任意一个B即为破解结果。 B有可能等于A,也可能不等于A。 大概意思也就是,截获了MD5加密后的密文,一样可以,找到一个不是原密码,但是加密后可以登陆成功的“伪原文”。 从中可以看到一点,MD5函数确实能被反向“破解”,但是这个“破解”只是找到一个经过MD5运算后得到相同结果的原文,并非是用户的明文密码。但是这样会被破解登录的可能,确实是需要采用更完善的算法进行加密,再次感谢! 近期热文推荐: 1.1,000+ 道 Java面试题及答案整理(2021最新版) 2.别在再满屏的 if/ else 了,试试策略模式,真香!! 3.卧槽!Java 中的 xx ≠ null 是什么新语法? 4.Spring Boot 2.5 重磅发布,黑暗模式太炸了! 5.《Java开发手册(嵩山版)》最新发布,速速下载! 觉得不错,别忘了随手点赞+转发哦!

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册