2016.6.6

 • 
  • 看完了 TRON Uprising,19集的动画剧,遗憾的是没有续集。
  • 去深圳面基,见到了 Yuno 和袁晨皓,一起参加 hackathon,不过因为参加 hackathon 的原因光顾着写代码了,没有怎么聊天,等下次吧
  • Segment Fault 和 Angel Hack 举办的深圳 Hackathon,一等奖。要不是没有牌子的话陈叔又可以贴一张了。
  • Uber Guide 很神奇地被 Uber 的工程师注意到了,希望后面能接触下。
  • 最近听了很多关于 iPad 用作生产力工具的播客,入手 Coda for iOS 后发现用虚拟键盘的话任何 iOS 设备都不是一个好的生产力设备。
  • 最近还用了 Quadro,Actions 的继任者。但是给我的印象并不好,主要是因为 Quadro 采取了订阅付费方式,当然是有一个买断制的价格,但是那个价格已经超过一个正常工具软件应有的价值,并且新的工具在网络连接稳定性上根本不能和 Actions 相比较,不知道是不是因为 Quadro 是用外包团队做的(无意冒犯外包,但作为一个需要长久更新和支持,特别还是订阅制的工具类软件,如果仍然把技术外包,我觉得有些不太专业)。

About A Crappy Website

 • 

Project Crap 其实第一开始并不叫这个名字,原本这个基于 three.js 的页面是一个更正经的项目的实验品,我打算用 three.js 写一个 WebGL 版的简历来着 —— 至于为什么是简历,没有什么特殊原因,主要是因为能用三维渲染作为载体的文字内容实在是太少了,没人会用这套技术做什么博客的,当然我见过一个做过程生成的图形学菊苣这么干过,但我并不觉得刚入门网页开发(宽泛的,前后端兼有的)的我能这么干。我个人感觉这套技术比较适合做 PPT 或者个人项目展示这类逻辑简单,需要即时加载,可以在手机端运行的交互内容,相比而言,Unity WebGL 更适合做严肃意义上的网页三维游戏,即使什么都不写打包也要几兆,又太过重了。
写偏题了,为什么半路上放弃写成简历,因为写着写着到周一早上了,想起来还有课,然后缓过神来再看自己在写的东西,突然觉得: WTF am I writing !?
总是会有这种半夜充满激情要做一个东西,白天再看就觉得没有意义的状态。于是就草草了事,把原本的 Audio Loader 也注释掉,后面介绍的内容也删了,加一个装作 Chrome 崩溃的图片吧!于是就有了一个代码一团糟的半成品:http://crap.justzht.com/
顺带简单谈下 three.js 的使用体验:

  • 和大多数即时渲染的东西使用起来差不多,相机,光,几何体,全屏后期处理,等等。
  • threejs 仓库自带了很多全屏相机效果,使用时和 unity 把后期效果的 compoment 挂到相机差不多,就是建一个 composer,然后按顺序一个个把 shaderPass 放进去,每一帧调用下 render 方法就行
  • 正确的写法应该是和 Unity 一样,subclass Object3D 或者 Mesh,然后在这个 class 里面写一个 function 调用 requestAnimationFrame(); 作为每帧调用的方法,后面就和 Unity 在 FixedUpdate 或者 Update 写法差不多了,我把所有的玩意都写到了一个 <script></script> 里面实在是作死。
  • unity 的 DOTween 实在是好用,然后我发现 js 里面竟然也有类似的东西:tweenjs,语法类似,写起位移动画不用操心。
  • 建立一个 LoadingManager 放在最前面,然后每个图片,贴图,音频或模型的 Loader 就可以在建立的时候传参 LoadingManager 进去,这样可以通过 Manager 知道所有素材的加载情况,等待加载完成后再进入主界面。
  • threejs 优点在于运行在浏览器上,任何设备都可以运行,可以读取设备陀螺仪,可以在网页上模拟 VR 的镜头畸变,至于性能就不要过于纠结了,虽然我没有详细去研究优化就这么说有些不负责任,但是我觉得与其在网页应用上纠结帧速,不如好好研究下怎么在 Unity 原生应用里面降低 drawcall ,成效更快。

2016.5.27

 • 

最近两周:

  • 第一周 写公司 Unity 工程
  • 第二周 写公司 iOS 工程
  • 学了基础的 Rails
  • 写了 Project SodaProject Fragment
  • 给 Project Soda 加了 SSL 证书
  • 基本没去上课
  • 看了很多 Youtube 搞笑视频
  • 吃了很多垃圾食品

觉得最近代码写太多了 不是个好事情。倒不是说写代码久坐对健康不好,健康这种事我一般也不操心,而是说感觉好久没有做其他方向的事情了,比如做做设计,做做建模,什么的。
说到建模,OTOY 的人终于回复我了,说就算我们给你学生证书你也只能用老版本的 Octane Render,我们在搞一个新的订阅方式,你要愿意来参与试用的话就回复邮件。于是我就回信说好好好好我愿意,结果对方又放我鸽子,到现在也没有什么动静,我觉得他们的工单系统几乎是废的。
然后我最近又在捣鼓 World Machine,拖拖节点生成贴图,放 C4D 渲染一下。一个直观的感觉是如果只导出 Height Map 和 Color Map 的话,至少需要 8K 分辨率才能达到比较好的效果 —— 然而如果要导出 16K 的话内存就不够了。有可能靠高度图 和 Deformer 不是生成地形最好的方式,回头再研究下,运气好的话可以做出来一些抽象的东西 —— 就是 Behance 上经常能看到的那种。

Mountain View

 • 

Quick Demo.

Texture : World Machine, 8K Resolution
Model : C4D Dispatcher Deformer with height map
Render : C4D Default

再谈坚果手机

 • 

博客里写过两次我买的坚果手机 不过这款手机一直没有真正地用过 —— 当时只是想作为 iPhone 的备用机,不过因为软硬件都不稳定的问题就闲置在那里。然后我换了新 iPhone,备用机就变成了老 iPhone,而坚果手机现在则成了只能进 Fastboot 的砖头,我也懒得去返厂了。
理论上如果还能进 Fastboot 就没什么大问题,毕竟有 flash recovery 这个命令嘛,我之前也在博客里面写过一次。但是坚果手机的 ROM 自从升级到 2.5.3 版本后连这个命令都不响应了,我是不太清楚出了什么问题,据说是官方给封了这条路,当然也只是据说,不过从官方一贯的选择(不给 root)来看,似乎也合情合理。
现在看来坚果手机官方设想的设计的哲学应该是这样的:

  • 易用的界面(启动器,图标,各种交互优化)
  • 强硬的手段(不允许第三方 Recovery,不允许 Root)

看上去很像 iPhone 的风格,毕竟 iPhone 也是一贯对于 hacker 不友好的设备,大家也都习惯了,以至于如果你在 Youtube 上看到类似于 "iPhone Life Hacks" 的视频,大都是些无伤大雅的系统自带功能而已,被一群无聊的人说来说去,营造出一种“我是 PowerUser 我最屌”的虚荣感。至于越狱,在国内也已经被 Adhoc 分发的各种第三方 App Store 打败了,毕竟大部分人越狱都只是想下付费软件而已,如果不用越狱就可以下载付费游戏,还有多少人关心越狱。至于在 iPhone 上跑 OpenSSL,Who cares?
扯远了,回到这两条设计哲学上来。我的坚果从拿到手就一直不稳定(参见之前拿到手第一天就黑屏)。如果我的 iPhone 出现了这种情况,那么想必我会毫不犹豫地送修或是换机,而不是尝试进各种刷机界面,因为我知道,这台手机基本没救了,因为以 iPhone 的软件质量来看这肯定是硬件问题,而且我就算想救,iPhone 上也没有 fastboot,也没有 recovery 可以进,它就是一台要么工作正常,要么损坏彻底的手机,没有任何给用户手动维修的希望。我觉得这个才是这两条设计哲学贯彻正确的结果。
**如果你想要用户不去 root ,为什么还要提供进入刷机界面的可能性呢。**这是我当时在浏览完坚果官方论坛的感想,然后也不知是该高兴还是悲伤,坚果果然在更新新版本后连安卓手机基本的长按按键进 Recovery 的功能都没有了,高兴的是卧槽坚果还真这么干了,悲伤的是这是我见过的估计是最激进的安卓手机厂商,恢复和刷第三方是有区别的,iPhone 不能刷第三方但有恢复模式,但是对于安卓手机来说,Recovery 承担着恢复和刷第三方两个功能,一旦不能进入 Recovery,意味着恢复也无可能。
然而反讽的是,锤子是靠 ROM 起家的,当年给 HTC One X 出的 Alpha 版本 ROM 我还在 XDA 论坛里面羞耻地宣传过。这么一家靠 ROM 成名并且目前还在给众多其他品牌机型适配自己 ROM 的公司,反倒不让自己的手机有任何刷机的可能性,可以说是在贯彻以 iPhone 为代表的设计哲学,但这么自相矛盾,包括甚至还在做外发应用,把启动器都做成了其他手机可以运行的版本,也是interesting。

2016.5.15

 • 

Lackarindie apps 推荐里面看到了一个蛮有趣的小游戏叫做 30SecondLife 遂下载下来玩了一会。风格让我想到了以前在彭博周刊和 Quartz 网站上玩过的那种炒股小游戏:从1959到2010随机选一段时间压缩到一分钟,给你本金,整个过程只能有一次买入和卖出,你能跑赢大市么?
两个游戏都是把十几年压缩成十几秒 没时间思考 而炒股小游戏相对于 30SecondLife 更甚的地方在于整个游戏只有两次操作机会 —— 时间压缩让你能够更快地预览到选择的结果,也能让你更无法确定什么时候下注。
30SecondLife 这种点击类游戏最近还玩了一个 就是马老师安利的 Bitcoin Billionaire 戳戳戳 挖比特币 也是消磨时间的小游戏 不过很容易上瘾....
说到游戏,EPOCH 终于在最新的 Unity 5.3.4p5 上复活了,虽然仍然有些问题,不过总算没有在 Editor 内崩溃。好像做太空游戏就是一个劫难,其他使用游戏引擎的项目,比如之前做的 AR 软件,或是现在在公司做的 Gear VR 内软件都没有什么太大的引擎上的问题,最多需要些时间找解决方法,然而一旦开始做太空游戏 不论是 Unreal 还是 Unity 都会出现严重的问题 导致整个项目不能进行下去 等到什么时候更新了引擎 突然又奇迹般的复活了。
不过以现在的眼光看,五个月前写的 EPOCH 结构实在是太乱了,而且过程生成的 Noise Map 这个功能并没有写进去,这块反而是后来 SceneKit 实验性写的 EPOCH Remastered Version 包含了使用 NoiseLib 生成噪声图的功能,所以不如直接新开一个工程重写算了。
感觉整个 16 年就没有什么实质性的进展,开源的 iOS 控件没继续写,Dribbble 也没更新,EPOCH 这个游戏又因为各种事情进度一直在拖,Hackathon 上一次参加还是一月份的了,自己又因为未来的规划问题和父母一直争论,反反复复耗尽精力。希望下半年能更有成果些吧。

WRITE IOS PLUGIN FOR UNITY

 • 

在 Unity 里面调用 iOS 原生功能是一件很爽的事情,其实这个方向可以干很多事情,目前我在做的是把 WKWebView 作为贴图传给 Unity 显示在 Mesh / RawImage 上:

WKWebView <-- MTLTexture <--> Texture2d --> Unity

但是还有很多功能可以做,比如目前 Unity 似乎还不支持手机上运行 Compute Shader,但是 iOS 自身可以进行 GPGPU 计算,而且在其他的一些方面,Native 效率上理论是甩 Mono 运行时一大截的,这个后面有可能会去实验下。

Unity 调用 iOS 方法:

Test.cs

----------------
using UnityEngine;
using System;
using System.Runtime.InteropServices;

public class Test : MonoBehaviour 
{
	void Start ()
	{
		Hello ();
	}
	#region extern methods
	
	[DllImport ("__Internal")]
	public static extern void Hello();
	
	#endregion
}
Test.h

----------------
#import <Foundation/Foundation.h>

@interface Test : NSObject

@end

extern "C" void Hello();
Test.mm

----------------
#import "Test.h"

@implementation Test

@end

void Hello()
{
	NSLog(@"Hello");
}

iOS 获取贴图指针

参见 Texture.GetNativeTexturePtr
Texture2D.CreateExternalTexture
GetNativeTexturePtr 为 Unity 创建贴图后获取其在对应平台的贴图地址,CreateExternalTexture 则是对应平台已经有一个贴图指针并传入 Unity 创建 Texture2d。
对于 Metal 平台,GetNativeTexturePtr 返回的是一个 id<MTLTexture> 的指针,可以通过以下方式在 iOS 部分获取:

Test.cs

----------------
public class Test : MonoBehaviour 
{
private Texture2D webViewTexture;
	void Start ()
	{
		webViewTexture = new Texture2D (512, 512, TextureFormat.ARGB32, false);
SetWebViewTexturePtr(webViewTexture.GetNativeTexturePtr ());
	}

[DllImport ("__Internal")]
	public static extern void SetWebViewTexturePtr(IntPtr ptr);
}
Test.h

----------------
extern "C" void SetWebViewTexturePtr(uintptr_t ptr);
Test.mm

----------------
void SetWebViewTexturePtr(uintptr_t ptr)
{
id<MTLTexture> ptrToMetalTexture = (__bridge_transfer id<MTLTexture>)(void*) ptr;
}

2016.5.6

 • 

上个月的实习工资发下来了。
五一我妈来学校看我,然后因为一些鸡毛蒜皮的事情闹了一些不愉快。想着快母亲节了,就用工资给我妈订了一台 iPhone ,也算是赔个罪。
五一放假完有个信息院的分享会,被以做技术的身份邀请分享了下经验。中间有人问到如何在做技术的同时保证学业,如何协调想做的事情和课程的安排。勉勉强强按照学院的导向回答了,就说还是学业为重,如果水平吊打不了老师的话还是要乖乖听课,云云。
但是现在在我的博客里面,我可以直接明说:“技术水平吊打”很难定义,师生双方都可以从自己的立场解读,导致整句话完全没有力量和强度。而且没有兼顾这么完美的事情,所有的坑都要自己踩,因为做喜欢的技术而挂科,或者因为认真学习而没有时间做项目都是选择,首先是要选一个跳进去。
因此我的回答实际上是毫无建设性的,但我想这么回答也还算正常,毕竟“做喜欢的技术而挂科”是一个比较冒险的事情,这要求你最后能拿出相应的成果甩在别人脸上,否则就要背上不学无术的名声。

从北京走的时候忘了带开发设备一起回来,于是开始闲了起来。重新看了一遍 《时间规划局》。看这个片子脑子里想的却是两个星期前 因为学校网络极差没办法远程工作而吐槽的时候 Jesse 留的评论 “时间就是金钱我的朋友!”。这句话当然毋庸置疑,但电影里时间真的被当成流通货币后反倒有了种被解构的味道。贫民窟里的人挣一天活一天,生命余额不足几天,而要移民到富人区的第一笔过路费就是一个月,毫无可能。很明显的对阶层固化的隐喻,一切都是精心设定好的:工资水平,物价涨幅,甚至于生活方式 —— “你是从其他时区过来的吧?你做事太快了些。”,餐厅服务员对主角如此说道,富人区的富人们吃饭急什么呢,他们甚至不需要经常看自己的余生倒数表。

The Big Short

 • 

整个行业只有这么几个人发现漏洞,并且开始从中押注,最后押中,在金融危机中逆势而上。大空头这部电影对我来说更像是一个神话,或者说更准确些,一个造神的故事。整部电影一直在渲染这种氛围,一个靠计算和直觉押宝的略微神经质的基金管理人(天才在很多电影里都被塑造为神经质的,或许是因为一个精神健全又成功的人的故事不是那么戏剧化?),百分之九十的电影时间内都在忍受着押注的不确定性,最后终于功成名就?对于所有观众来说,整部电影的结局在一开始就已经明了,金融危机会爆发,发现漏洞的人会赚钱,这只是时间问题 ---- 电影结束前,这一切总会发生的。因此,看一个已经确定结局的电影,就像是看一个命中注定的神是如何走上神坛的。
如果这是一部描述几个黑客发现网络漏洞并从中赚钱的故事,那么就并不会有那么强烈的造神感,因为网络的漏洞是确定的,没有押注,等待和耐心这一回事 ---- 而神是不需要对事实确凿的事物感兴趣的,神只需要对不确定的事物做出预言,即对人的选择做出预言。
况且互联网立的神已经够多了,卡马克,比尔盖茨,扎克伯格,马斯克,Blah Blah ---- 每天都有造神运动,通过代码颠覆世界的被誉为神的传奇人物,似乎不是什么稀奇的东西。互联网这么一个高科技的行业,反而有这么多宗教意义上的神,的确是一个有趣的现象。

2016.4.16

 • 

记事
高三的时候我最差的科目算是语文 古诗词不会填 阅读理解找不到套路 作文也写得勉勉强强 当然我并不是要接着往下写如何提高语文成绩 因为自始至终我也没有提高多少 不过在当时 提高语文成绩的确是最要紧的事情 于是每周考完试都会去找老师求评讲 然后自己再改改 诸如此类
后来某次语文作文我反倒拿了不错的分数 不过是在出题老师发挥不稳定的情况下拿到的 我的意思是 出题老师不知道怎么想的 出了一个无论是导向还是体裁上根本不可能出现在高考考场的题目 导致我趁机(或者说趁乱)拿到了不错的分数 现在看来 语文老师 对教学事业都还是有些自己的想法的 只不过和任何事情一样 都只能受制于现实 偶尔这么任性一次
记得作文题目大意是 “两列火车要对撞了 但刚好有个岔路可以避免相撞 不扳动岔路的话 两车人会死 扳动的话 岔路上的一个玩耍中的孩子会死” 问如何选择 主题自拟 体裁不限(当然按照惯例 诗歌是不能写的 除非你是文学天才出场自带一百赞 和现在颜值高的人怎么穿都漂亮一个道理)
于是大家都觉得 What the fuck 但是又不得不硬着头皮开始写 我是觉得这种题目本来就不可能成为高考作文题为何还要放在宝贵的周练题目里面 然后想想实在是没法选择 就干脆不选好了 开始写:这个情况实在是太难抉择所以我先不拘泥于让谁死,我先讨论一番个人价值与集体价值的困境的大道理,然后大道理说完字数也够了就交卷走人了,自始自终我也没谈让谁死。
现在看来我的回答挺虚伪的 因为不管怎样到最后还是要有人死,不去做实事而在一旁说些大道理颇有些圣母婊的意味。但是卷子发下来老师竟然和我说就是要看谁能走出题目的圈子,主题立意就是要这么写,于是迷迷糊糊地拿了一次不错的分数。
后来我发现,这种虚伪但是靠兜圈子拿分的思路在生活中其实挺重要的,比如有个常识 女生要你做选择有时候并不是真的要你选择,通过肢体行动吸引走女生注意才是正解 但是很可惜我只开窍了语文考试那么一次 到现在我和人聊天的思路基本还是问什么说什么 也不会找什么新话题聊 也就是说 我的语文其实还是挺烂的 虽然现在没有作文考试 也没有让人难堪的阅读理解了 大部分时间我都在和全是表达式的机器界面打交道 偶尔写些博客 想起来那个作文题 要我现在选择的话 我估计会实诚地选择让两车撞一起。