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 但是又不得不硬着头皮开始写 我是觉得这种题目本来就不可能成为高考作文题为何还要放在宝贵的周练题目里面 然后想想实在是没法选择 就干脆不选好了 开始写:这个情况实在是太难抉择所以我先不拘泥于让谁死,我先讨论一番个人价值与集体价值的困境的大道理,然后大道理说完字数也够了就交卷走人了,自始自终我也没谈让谁死。
现在看来我的回答挺虚伪的 因为不管怎样到最后还是要有人死,不去做实事而在一旁说些大道理颇有些圣母婊的意味。但是卷子发下来老师竟然和我说就是要看谁能走出题目的圈子,主题立意就是要这么写,于是迷迷糊糊地拿了一次不错的分数。
后来我发现,这种虚伪但是靠兜圈子拿分的思路在生活中其实挺重要的,比如有个常识 女生要你做选择有时候并不是真的要你选择,通过肢体行动吸引走女生注意才是正解 但是很可惜我只开窍了语文考试那么一次 到现在我和人聊天的思路基本还是问什么说什么 也不会找什么新话题聊 也就是说 我的语文其实还是挺烂的 虽然现在没有作文考试 也没有让人难堪的阅读理解了 大部分时间我都在和全是表达式的机器界面打交道 偶尔写些博客 想起来那个作文题 要我现在选择的话 我估计会实诚地选择让两车撞一起。

2016.4.15

 • 

说来好笑,在去渡鸦和陈叔一起做项目的前一天,我刚刚因为之前没去上课被叫去训话。然后第二天我飞去北京,变本加厉地敲了两周课,算是非常过瘾的体验 —— 毕竟,不是每个学生都有正经理由逃学的。
因为之前并没有在公司正经干活的经验
1 ,所以我也无从对比,但在渡鸦感觉挺轻松,而且做的项目非常有趣,等到真正做完可以展示的时候,倒是可以写一写踩过的坑。
所以我现在回到了学校,准备继续远程工作 —— 对于一个不是纯代码的项目,远程工作同步进度一直很困难

2

。能做的只是尽量把所有原本可以机器布局的内容用代码手动布局,除此以外,要忍受糟糕的网络同步环境和奇怪的因为不完全同步产生的软件问题,bug,crash,以及随之带来的烦躁和信心丧失。

  1. “Quadera, inc 因为办公场合在咖啡厅和别人家里面 并没有真正身处公司的感觉”

  1. 即使是把素材文件用文本的方式序列化,想用 git 来处理这些大文件也是几乎不可能的

Remote access to leap motion data

 • 

总结:迷一样的 leap motion

服务器端设置

开启允许远程连接设置

参考:https://developer.leapmotion.com

其中关于websockets_allow_remote

Key string websockets_allow_remote
Value type boolean
Default value false
Purpose Allows non-localhost clients to connect

就是说,要去把默认关掉的这个参数改为开启,于是要去改 leap motion 的 config 文件,config.json的文件路径:

Linux:  
~/.Leap Motion/config.json
Mac:
~/Library/Application Support/Leap Motion/config.json
Windows: 
%AppData%\Leap Motion\config.json

改完后记得重启 leap motion service 才能生效,重启方法:Mac / Windows

测试是否开启成功

leap motion 安装的时候自带了一个名为 SDK Samples 的文件夹,我已经忘了 Mac 版是不是默认安装到这个目录了,不过还是写下,至少便于自己以后访问这个文件夹:

/Developer/LeapSDK/samples

修改JSONViewer.html第28行,从

function init() {
    // Create and open the socket
    ws = new WebSocket("ws://localhost:6437/v6.json");

改为

function init() {
    // Create and open the socket
    ws = new WebSocket("ws://你的目前的内网 IP 地址:6437/v6.json");

然后测试是否能够从内网 IP 访问,测试时请确保连接上 leap motion,control panel 里打开了 tracking 功能,没有开启任何 proxy 软件,若有数据刷新,则成功。
此部分参考:https://community.leapmotion.com

客户端设置

var controller = new Leap.Controller({host:'xxx.xxx.xxx.xxx', port:6437});
controller.setBackground(true);

以上是 javascript SDK 的 Controller constructor,可以直接定从哪个地址读取数据,但是 Unity/C# 版本目前貌似没有这个功能。