在项目中这样写代码的时候,请搭配红花油、跌打损伤酒一起使用

血压操作集锦第 弹 Java:优化同事的代码 通过上述的优化,我们使代码更加易读、易维护,并且提高了性能。这将有助于提升代码的质量和可靠性。希望这些修改对你有帮助!如果你有任何疑问或需要进一步的帮助,请随时提问。在这篇文章中,我将为你介绍如何优化同事编写的血压操作代码。我们将使用Java语言进行修改和润色,以提高代码的可读性、可维护性和性能。通过以上的修改,我们优化了同事编写的血压操作代码。以上是同事编写的血压操作类。 阅读详情

前言

前几天,正巧赶上组里代码review,一下午下来,感觉整个人都血压拉满了。五花八门的代码让我不禁感叹,代码规范这条道路还是任重而道远…

那么今天就来给大家总结一波Java中的代码小技巧,熟练掌握这些小技巧后,保证能让你写出同事看不懂的代码~

至于为啥要写出同事看不懂的代码,通过这次教训,我发现好处还是挺多的,简单举几个例子:

  • 同事无法轻易修改你的代码,避免团队协作不当引入bug

  • 塑造个人能力的不可替代性,规避被辞退的风险

  • 代码review时,帮助同事治疗好多年的低血压

好了,一本正经的胡说八道环节就此打住……废话不多说了,下面正式开始。没用的知识又要增加了…

壹、瞒天过海

我打赌你肯定想不到,有人居然会在注释里下了毒。看看下面的代码,简单到main方法中只有一行注释。

public static void main(String[] args) { // \u000d System.out.println("coder Hydra"); }

猜猜看,这段程序运行结果如何?执行后它居然会在控制台打印:

coder Hydra

看到这你是不是一脸懵逼,为什么注释中的代码会被执行?

其实原理就在于大家熟悉的unicode编码,上面的\u000d就是一个unicode转义字符,它所表示的是一个换行符。而java中的编译器,不仅会编译代码,还会解析unicode编码将它替换成对应的字符。所以说,上面的代码解析完后实际是这样的:

public static void main(String[] args) { // System.out.println("coder Hydra"); }

这样,就能解释为什么能够执行注释中的语句了。当然,如果你觉得上面的代码不够绝,想要再绝一点,那么就可以把代码写成下面这个样子。

public static void main(String[] args) { int a=1; // \u000d \u0061\u002b\u002b\u003b System.out.println(a); }

执行结果会打印2,同理,因为后面的unicode编码的转义后表示的是a++;。

至于这么写有什么好处,当然是用在某些不想让别人看懂的地方,用来掩人耳目了,估计大家都看过下面这个笑话。

​你这么写的话客户如果懂点代码,看一下就穿帮了啊,但是你如果写成下面这样,大部分估计都以为这是一段乱码:

//\u000d\u0054\u0068\u0072\u0065\u0061\u0064\u002e\u0073\u006c\u0065\u0065\u0070\u0028\u0032\u0030\u0030\u0030\u0029\u003b

恕我直言,没个几十年的功力真看不出来这里执行的是sleep,简直完美。

贰、舍近求远

要想写出别人看不懂的代码,很重要的一个小技巧就是把简单的东西复杂化。例如,判断一个int型数字的正负时明明可以写成这样:

public void judge(int x){ if (x>0){ //... }else if (x<0){ //... } }

但是我偏不,放着简单的代码不用,我就是玩,非要写成下面这样:

public void judge2(int x){ if (x>>>31==0){ //... }else if (x>>>31==1){ //... } }

怎么样,这么写的话是不是逼格一下子就支棱起来了!别人看到这多少得琢磨一会这块到底写了个啥玩意。

其实原理也很简单,这里用到的>>>是无符号右移操作。举个简单的例子,以-3为例,移位前先转化为它的补码:

11111111111111111111111111111101

无符号右移一位后变成下面的形式,这个数转化为十进制后是2147483646。

01111111111111111111111111111110

所以,当一个int类型的数字在无符号右移31位后,其实在前面的31位高位全部是0,剩下的最低位是原来的符号位,因此可以用来判断数字的正负。

基于这个小知识,我们还能整出不少活来。例如,放着好好的0不用,我们可以通过下面的方式定义一个0:

int ZERO=Integer.MAX_VALUE>>31>>1;

通过上面的知识,相信大家可以轻易理解,因为在将一个数字无符号右移32位后,二进制的所有位上全部是0,所以最终会得到0。那么问题来了,我为什么不直接用Integer.MAX_VALUE>>32,一次性右移32位呢?

这是因为在对int型的数字进行移位操作时,会对操作符右边的参数进行模32的取余运算,因此如果直接写32的话,那么相当于什么都不做,得到的还是原数值。

叁、颠倒黑白

古有赵高指鹿为马,今有码农颠倒真假。阻碍同事阅读你代码的有力武器之一,就是让他在遇到条件判断时失去基本判断能力,陷入云里雾里,不知道接下来要走的是哪一个分支。

下面的代码,我说会打印fasle,是不是没有人会信?

public class TrueTest { public static void main(String[] args) { Boolean reality = true; if(reality) { System.out.println("true"); } else { System.out.println("false"); } } }

没错,只要大家了解布尔类型就知道这不符合逻辑,但是,经过下面的改造就可以让它变为现实。

首先,在类中找个隐蔽的位置插入下面这段代码:

static { try { Field trueField = Boolean.class.getDeclaredField("TRUE"); trueField.setAccessible(true); Field modifiersField = Field.class.getDeclaredField("modifiers"); modifiersField.setAccessible(true); modifiersField.setInt(trueField, trueField.getModifiers() & ~Modifier.FINAL); trueField.set(null, false); } catch(IllegalAccessException | NoSuchFieldException e) { e.printStackTrace(); } }

然后再运行上面的程序,你就会发现神奇地打印了false。

其实原理也很简单,首先通过反射拿到Boolean类中定义的TRUE这个变量:

public static final Boolean TRUE = new Boolean(true);

接着使用反射,去掉它的final修饰符,最后再将它的值设为false。而在之后再使用true进行定义Boolean类型的变量过程中,会进行自动装箱,调用下面的方法:

public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); }

这时的b为true,而TRUE实际上是false,因此不满足第一个表达式,最终会返回false。

这样一来就能解释上面的打印结果了,不过切记,这么写的时候一定要找一个代码中隐蔽的角落,不要被人发现,否则容易被打的很惨…

肆、化整为零

接下来要介绍的这个技巧就有点厉害了,可以将原有的一段串行逻辑改写成判断逻辑中的不同分支,并且保证最后能够正常执行。

在开始前先提一个问题,有没有一种方法,可以让if和else中的语句都能执行,就像下面的这个例子中:

public static void judge(String param){ if (/*判断条件*/){ System.out.println("step one"); }else { System.out.println("step two"); } }

如果我说只调用一次这个方法,就能同时输出if和else中的打印语句,你肯定会说不可能,因为这违背了java中判断逻辑的基本常识。

没错,在限定了上面的修饰语只调用『一次』方法的条件下,谁都无法做到。但是如果在判断条件中动一点点手脚,就能够实现上面提到的功能。看一下改造后的代码:

public class IfTest { public static void main(String[] args) { judge("Hydra"); } public static void judge(String param){ if (param==null || new IfTest(){{ IfTest.check(null); }}.equals("Hydra")){ System.out.println("step one"); }else { System.out.println("step two"); } } }

运行后控制台打印了:

step one step two

惊不惊喜、意不意外?其实它能够执行的秘密就在if的判断条件中。

当第一次调用judge()方法时,不满足或运算中的第一个条件,因此执行第二个条件,会执行匿名内部类内的实例化初始块代码,再次执行judge()方法,此时满足if条件,因此执行第一句打印语句。

而实例化的新对象不满足后面的equals()方法中的条件,所以不满足if中的任意一个条件,因此会执行else中的语句,执行第二句打印语句。

这样就实现了表面上调用一次方法,同时执行if和else中的语句块的功能。怎么样,用这种方式把一段整体的逻辑拆成两块,让你的同事迷惑去吧。

伍、釜底抽薪

在程序员的世界里,不同语言之间一直存在鄙视链,例如写c的就看不起写java的,因为直接操作内存啥的看上去就很高大上不是么?那么我们今天就假装自己是一个c语言程序员,来在java中操作一把内存。

具体要怎么做呢,还是要使用java中的魔法类Unsafe。看这个名字也可以明白,这玩意如果使用不当的话不是非常安全,所以获取Unsafe实例也比较麻烦,需要通过反射获取:

Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe"); unsafeField.setAccessible(true); Unsafe unsafe =(Unsafe) unsafeField.get(null);

在拿到这个对象后,我们就可以对内存为所欲为了。例如,我们在实现int a=1;这样的简单赋值时,就可以搞复杂点,像下面这样绕一个弯子:

void test(){ long addr = unsafe.allocateMemory(4); unsafe.putInt(addr,1); int a=unsafe.getInt(addr); System.out.println(a); unsafe.freeMemory(addr); }

首先通过allocateMemory方法申请4字节的内存空间后,然后通过putInt方法写入一个1,再从这个地址读取一个int类型长度的变量,最终实现了把1赋值给a的操作。

当然了,还有很多高级一点的用法,这里简单举两个例子。

void test(){ long addr = unsafe.allocateMemory(4); unsafe.setMemory(addr,4, (byte) 1); System.out.println(unsafe.getInt(addr)); unsafe.freeMemory(addr); }

上面的代码中,通过setMemory方法向每个字节写入byte类型的1,最后调用getInt方法一次性读取4个字节作为一个int型变量的值。这段代码最终打印结果为16843009,对应的二进制如下:

00000001 00000001 00000001 00000001

至于c语言中的内存复制,用Unsafe搞起来也是信手拈来:

void test2(){ long addr = unsafe.allocateMemory(4); long addr2 = unsafe.reallocateMemory(addr, 4 * 2); unsafe.putInt(addr, 1); for (int i = 0; i < 2; i++) { unsafe.copyMemory(addr,addr2+4*i,4); } System.out.println(unsafe.getInt(addr)); System.out.println(unsafe.getLong(addr2)); unsafe.freeMemory(addr); unsafe.freeMemory(addr2); }

上面的代码中,通过reallocateMemory方法重新分配了一块8字节长度的内存空间,并把addr开头的4字节内存空间分两次进复制到addr2的内存空间中,上面的代码会打印:

1 4294967297

这是因为新的8字节内存空间addr2中存储的二进制数字是下面这样,转化为十进制的long类型后正好对应4294967297。

100000000000000000000000000000001

Unsafe除了能直接操作内存空间外,还有线程调度、对象操作、CAS操作等实用的功能,如果想详细的了解一下,可以看看这篇Java双刃剑之Unsafe类详解,开启新世界的大门。

最后

好了,没用的知识介绍环节就此结束,相信大家在掌握了这些技巧后,都能自带代码混淆光环,写出不一样的拉轰代码。

最后建议大家,在项目中这样写代码的时候,搭配红花油、跌打损伤酒一起使用,可能效果更佳。

那么,这次的分享就到这里啦

 

如何使用Calibre PERC抽出 点到点/p2p 电阻 @[TOC](如何使用Calibre PERC抽点到点(p2p)电阻) 一、前言 需要实现的功能是从gds中抽出net的点到点的电阻。如下图这样。 二、准备工作 lvs rule pex rule(必要时可以自己定义RC rule) gds p2p点的坐标 定义prode.defs 因为p2p的点是变化的,所以每次prode定义都要重新出,对应的perc rule也是根据每个p2p点的定义来的,perc rule也是每次都要重新出。如果需要可以写一个脚本自动出这些定义文件。 PROBE_POINTS 阅读详情

相关推荐

RV1126B芯片实战:如何用这款视觉处理器SoC打造你的第一个AI摄像头项目

本文详细介绍了如何利用瑞芯微RV1126B视觉处理器SoC从零构建AI摄像头项目。涵盖硬件选型、开发环境搭建、ISP配置、AI模型部署及系统集成等关键步骤,帮助开发者高效实现边缘计算方案,特别适合智能安防和工业检测应用。

dropout6artist的博客 931

如何写出同事看不懂的Java代码?

前几天,正巧赶上组里代码review,一下午下来,感觉整个人都血压拉满了。

1212

无痛安装及初始配置 PHP 8.0.3 + Apache 2.4 + MySQL 8.0

PHP 8.0.3 + Apache 2.4 + MySQL 8.0MySQL 8.0.23 安装下载安装配置环境变量初始化MySQLPHP8.0.3 安装下载安装配置环境变量Apache 2.4 安装下载安装启动 MySQL 8.0.23 安装 下载 到官方网站下载:https://dev.mysql.com/downloads/mysql/ 目前的最新版本是MySQL 8.0.23 在Windows上有两种安装方式,一个是zip压缩文件解压然后配置,另一个是图像化界面安装。 这里选择第一种方法安装:

Kuang Da's Blog 6208

代码要写成别人看不懂的样子(一)

本篇文章参考以下博文 文章目录前言 前言   最近读了一本书,张容铭老师的 《JavaScript设计模式》 ,书中提到的编码模式,编码风格,让我想起了我刚学 JS 的时候,特别向往像大神一样,全篇没什么 div 罗列,都是方法或者构造函数之类的东西,一顿操作后, body 里面只要添加一个 <div id=“demo”> ,大功告成。   逼格满满有没有,当时就想,什么时候我也能这样,别人看不懂我的代码,所有的事情不用自己手写,只要给一个容器,然后执行函数就

不见浅诗的博客 1713

巨量千川M-API实战:5分钟搞定短视频计划数据自动获取(Python版)

本文详细介绍了如何利用巨量千川M-API和Python快速搭建自动化工具,实现短视频计划数据的自动获取。通过实战代码演示了从环境准备、Token管理到核心数据接口调用的完整流程,帮助电商运营和技术开发者告别手动导出,高效完成数据汇总与分析。

weixin_29325515的博客 1359

Ubuntu中snap简单介绍

通过Snap可以安装众多的软件包。需要注意的是,snap是一种全新的软件包管理方式,它类似一个容器拥有一个应用程序所有的文件和库,各个应用程序之间完全独立。所以使用snap包的好处就是它解决了应用程序之间的依赖问题,使应用程序之间更容易管理。但是由此带来的问题就是它占用更多的磁盘空间 介绍一些常用命令,有点类似docker 1、查看已经通过snap安装的snap包 snap list可以查看 2、可以搜索想要的snap包,例如tomcat snap search tomcat

icanflying的博客 4万+

你见过哪些目瞪口呆的 Java 代码技巧?(It枫斗者)

但是你错了,domain 是一个领域对象,往往我们再做传统 Java 软件 Web 开发中,这些 domain 都是贫血模型,是没有行为的,或是没有足够的领域模型的行为的,所以,以这个理论来讲,这些 domain 都应该是一个普通的 entity 对象,并非领域对象,所以请把包名改为:com.xxx.entity。上边的代码,从逻辑上讲,是没有问题的,只是这种写法让我很厌烦,例子中只有两个字段,如果有 20 个字段,我们要如何做呢?当然,如果你这么做了,肯定不会有什么问题,但是,这肯定不是一个最优的做法。

IT枫斗者的博客 277

ST MCSDK V6.2.0实战:手把手教你配置HSO-ST观测器,体验500ms收敛的电机无感控制

本文详细介绍了ST MCSDK V6.2.0中HSO-ST观测器的配置方法,实现500ms内电流收敛的无感电机控制。从环境搭建、核心参数解析到无感启动优化,提供实战技巧和性能调优策略,帮助开发者快速掌握高效电机控制技术。

weixin_28720767的博客 580

怎么写别人看不懂的JavaScript代码

是转换成数字,-是转换并翻转符号位,在表达式里可以大量使用(前后需要空格)或者代替Date.now()与new Date().getTime();恒假值不用0,用“字符串比如42”==true或“字符串”==false,恒为真就是!(“字符串”==true)重点: “”==[],””==0,[]==0 []==![],代替data.length == 0。假阳:“0”==false,false==0,false=="",false==[]甚至:a==2&&a==3不会报错,而是false。

qq_66233357的博客 569

【数字电源/MATLAB+PLECS】如何进行 Buck 数字电源仿真(二)PLECS 搭建开环 Buck 功率级

本文介绍了如何在PLECS中搭建开环Buck功率级模型,验证数字电源设计的基本思路。重点内容包括: 明确开发顺序:先开环验证功率级,再闭环设计控制器 搭建关键组件:输入电源、PWM模块、MOSFET开关、续流二极管、LC滤波电路及负载 设置初始参数:24V输入、12V输出、200kHz开关频率、22μH电感、100μF电容 测量关键波形:MOSFET Vds验证开关动作、电感电流纹波和输出电压稳态值 提供完整仿真模型和GitHub资源,便于读者复现验证 文章强调通过开环测试先确保功率级正确性,为后续闭环控制

weixin_43234123的博客 1218

软件测试面试题之易错题

(1)白盒测试:又称功能功能 测试、数据驱动测试和行为测试,是一种从用户观点出发的测试,被测程序为黑盒子, 通过测试来检测每个功能是否能够正常使用。(2)黑盒测试:又称结构测试和逻辑驱动 测试,是知道产品内部工作过程,通过测试来检测产品内部动作是否按照规格说明书 的规定去正常运行。(1)、测试需求分析;(2)动态白盒测试:需要对各个模块功能、模块间的接口、局部数据结构、主要执行路径、 错误处理等方面的测试。(2) 集成测试所测试的对象是模块间的接口,其目的是在找出在模块接口上面,包括整体体系结构上的问题;

m0_37449634的博客 679

[闲话]狗皮膏药

      小的时候,挺喜欢生病,因为可以不用上学心安理得的呆在家里,想吃啥都被满足。可是,虽然我的身体素质不是太好,却一直不怎么生病,常年也很少大病一次,感冒都少。那时侯,记得家中的一个抽屉里有很多药,还有膏药。我们家人都很少生病,所以那些药通常用不着。我和弟弟就常拿膏药玩,趁对方不注意给贴身上,然后往下揭,被贴膏药的一方就会疼的哇哇大叫,然后叽里咕咚的追打另一方。那曾是我们童年一段时间一个好玩...

weixin_33795833的博客 246

Unreal5.6从入门到精通之 如何实现MetaHuman数字人

本文介绍了使用HYPER3D-ChatAvatar网站生成3D头部模型,并导入Unreal Engine制作数字人的完整流程。首先上传照片生成头部模型(约2分钟),设置参数后下载模型文件。然后在UE5.6中创建项目,激活MetaHuman插件,导入头部模型并调整肤色、面部特征和身体模板。通过MetaHuman Creator组装数字人蓝图,支持添加音频/视频动画功能。关键步骤包括:取消Rigging选项节省时间、切换英文模式避免材质问题、使用Live Link Face应用实现面部捕捉等。整个流程约需5-1

TxNet 1348

家中常用药

感冒 板蓝根 清热解毒,凉血利咽,用于肺胃热盛所致的咽喉肿痛、口咽干燥;急性扁桃体炎等。 小儿感冒颗粒 用于小儿风热感冒,发热重,头胀痛,咳嗽痰黏,咽喉肿痛。 主要用于对病毒性感冒的预防,例如周围有人感冒了,或者在感冒流行季节,都可以服用该药作为预防。但如果已经有了感冒的卡他症状,如鼻塞等,则使用该药效果不显著。藿香正气口服液 用于外感风寒、暑湿感冒,如头疼昏重、腹胀腹痛、呕吐等。清热解毒 黄连

俊哥兜里有糖 4180

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

留学必备物品清单,这3类你一定要带

仔仔2021年11月26日 在国内读书,缺点啥可以让爸妈邮寄过去,也可以淘宝、拼多多一键下单。但是去国外留学,也不知道能不能买到家乡特产,恨不得把整个家都装进去!但是行李额有限,哪些东西是必须要带的,哪些是可带可不带的呢?今天仔仔特意给家人们整理了这份留学必备物品清单,希望你的留学生活潇洒又快乐! 第一类国外不好买到的东西: 常用药品,国外医生对感冒的态度是,“可自愈”。所以就算你感冒了去看医生,他可能告诉你,“回家休息两天就没事了”。明明鼻塞到自闭了,医生就是不给你开药。 所以常用的感冒药(小柴胡

Happy052088的博客 280

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

出国整理行李的小窍门

一、用的、较大较重的物品先装,以利搬运 。二、瓶装化妆品等易碎之物,用 T 恤或毛巾包裹 。三、行李空隙处塞入卷筒状的毛巾。四、收拾行李时,面对那一大堆穿的用的,最好先列一张清单,将所需之物一一写下,就不会顾此失彼了。这张清单应包括下面四类:a 、文件类:机票车票,护照,身份证,结婚证,介绍信,旅游指南手册,地图,旅行日程表,地址电话通讯册;b 、小用具:手机,相机,随身听,旅行闹钟,手电筒,

水国春寒 1335

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

转] 你以为他真的当兵当傻了

如果你的身边正在有,或者将来会有退伍的老兵,目睹他对于地方生活所表现出来的诸多不适与格格不入,我希望你能给予他足够的耐心和理解。 当兵的大大咧咧,讲话不注意。也许你会觉得,穷当兵的,没素质。但为什么,公交车上他能给老人和孕妇让座,而那些花枝招展油头粉面的年轻人却熟视无睹。但是为什么?他能在大街上跑出老远找一个垃圾桶把手里的垃圾扔掉,而有些人却随手一扬。 ...

weixin_33827965的博客 153

代码要写成别人看不懂的样子(十一)

本篇文章参考书籍《JavaScript设计模式》–张容铭 文章目录前言状态模式 前言    状态模式   

不见浅诗的博客 407

java code reviewer_Java Code Review

目标和原则提高代码质量,及早发现潜在缺陷,降低修改/弥补缺陷的成本促进团队内部知识共享,提高团队整体水平评审过程对于评审人员来说,也是一种思路重构的过程,帮助更多的人理解系统是一个传递知识的手段,可以让其它并不熟悉代码的人知道作者的意图和想法,从而可以在以后轻松维护代码可以被用来确认自己的设计和实现是一个清楚和简单的鼓励相互学习对方的长处和优点高效迅速完成Code Review注意事项经常进行Co...

weixin_32660773的博客 304

java定义规则_java 程序编写规则(自己总结)

1.命名规范(1)所有的标示符都只能用ASCⅡ字母(A-Z或a-z)、数字(0-9)和下划线“_”。(2)类名是一个名词,采用大小写混合的方式,每个单词的首字母大写。例如:UserInfo(3)接口的大小写规则与类名相似:例如:UserInterface。(4)方法名是一个动词或动词词组,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。例如:setName(String nam...

weixin_34188805的博客 606

大厂程序员提倡“防御性编程”:故意把代码写得很烂,万一自己被裁,要确保留下的代码不可维护.........

“码农们工作中需防御性编程,避免写出优美清晰代码,确保即使被裁,留下的代码也难以维护。”近日,一则关于用“防御性编码”应对大厂裁员潮的消息在职场社交平台引发热议。简单来说,就是程序员写一些别人看不懂,只有自己能看懂的代码,故意把代码写的很烂,难以维护。因此,从某种程度上提高自己在公司的“不可替代”性。为什么会出现“防御性编程”呢?从大环境来说,最近,互联网行业的不少巨头纷纷宣布裁员,降本增效,这让...

fengdu78的博客 783

「Java知识」java的lambda骚操作,会几个常用写法感觉档次都不一样了

java的stream用的概率越来越大了,lambda链式写法也越来越让人爱不释手。java的stream api还有很多,是值得好好探索一番的。直接上几个例子,没啥技术含量,只是总结了使用频率较高的几种类型。

Java Farmer 415

代码要写成别人看不懂的样子(五)

文章目录前言一、外观模式二、适配器模式 前言   通过前面几篇文章,大家估计对对象的创建有了一个新的认识,在很多大型应用里面,对象会相当复杂,但是其刚创建的时候,并不是这样,而是通过后续的组合,封装,才一步一步完善起来的,从本章节开始,我们一块来学一学,如何把这些对象组合的更合理,从而使想强大的功能。 一、外观模式   大家一定绑定过事件,而且一定像下面这样绑定过 document.onclick = fucntion(e) { e.preventDefault(); if(e.target !== d

不见浅诗的博客 455

计算机科学家会写很多代码吗,为什么你写的代码别人看不懂?

作者丨Rhea Moutafis Following译者丨刘雅梦策划丨刘燕好的事物都是在结构和混乱的健康平衡中产生的。1为什么你的代码这么潦草?为什么每个开发人员都认为自己编写的代码是完全可以理解的?为什么同一个开发人员不能看懂和理解别人编写的代码,从而很少能对其进行维护呢?是因为他们写的代码都很潦草。也就是说,代码现在可以正常运行,但由于它相当混乱,不具备很好的可扩展性或通用性。计算机科学家是个...

weixin_39614561的博客 263

老司机教你如何写出没人敢维护的代码!

作者 | 阿木 责编 | 伍杏玲 出品 | 程序人生(ID:coder_life) 编写除了自己没人能看懂的代码,是一种怎样的体验? 下面由作为资深挖坑程序员的我,手把手教大家这是怎么做到的?如果各位可以在接下来的时间多加练习,所谓青出于蓝胜于蓝,相信各位不但可以写出别人无法维护的代码,还可能在有朝一日,甚至能技艺炉火纯青地写出自己都维护不了的代码。 编写无法维护的代码说难其实并...

程序人生的博客 2879
上一篇: 如何使用 MySQL 做全文检索这件事
下一篇: 聊一聊微服务常见配置中心工作原理
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值