在 iTerm2 for Mac 中使用 rz 和 sz

大致的方法参见这篇教程,但是执行 brew install lrzsz 的时候站点SSL证书目前已经过期了,brew会安装失败,所以我在安装的时候做了一些workaround。

总体安装步骤详述如下:

  1. 安装 iTerm2,详见:http://www.iterm2.com/
  2. 手动安装 lrzsz
    1. 下载 lrssz 源文件:curl ‘http://www.ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz’ > lrzsz-0.12.20.tar.gz
    2. 解压缩:tar -xvf lrzsz-0.12.20.tar.gz
    3. 进入文件夹:cd lrzsz-0.12.20
    4. 准备编译:./configure
    5. 编译:make
    6. 安装:make install
    7. 建立连接:sudo ln -s /usr/local/bin/lsz /usr/local/bin/sz
    8. 建立连接:sudo ln -s /usr/local/bin/lrz /usr/local/bin/rz
  3. 下载 iTerm2 rz/sz 脚本
    1. 下载:curl ‘https://raw.githubusercontent.com/mmastrac/iterm2-zmodem/master/iterm2-recv-zmodem.sh’ > iterm2-recv-zmodem.sh
    2. 加执行权限:chmod +x iterm2-recv-zmodem.sh
    3. 拷贝到系统目录:sudo cp iterm2-recv-zmodem.sh /usr/local/bin/
    4. 下载 curl ‘https://raw.githubusercontent.com/mmastrac/iterm2-zmodem/master/iterm2-send-zmodem.sh’ > iterm2-send-zmodem.sh
    5. 加执行权限:chmod +x iterm2-send-zmodem.sh
    6. 拷贝到系统目录:sudo cp iterm2-send-zmodem.sh /usr/local/bin/
  4. 增加 iTerm2 触发器(Trigger)
    1. Profiles -> Open Profiles -> Edit Profies -> Advanced -> Triggers -> Edit
      1. rz
        1. Regular Expression: rz waiting to receive.\*\*B0100
        2. Action: Run Silent Coprocess
        3. Parameters: /usr/local/bin/iterm2-send-zmodem.sh
      2. sz
        1. Regular Expression: \*\*B00000000000000
        2. Action: Run Silent Coprocess
        3. Parameters: /usr/local/bin/iterm2-recv-zmodem.sh
  5. 大功告成!

将MySQL中的数据导入ElasticSearch

在海盗湾上下载到了AshleyMadison的数据,脑子一热想拿来试试数据挖掘,于是拿ElasticSearch搞起。但问题是源文件为MySQL的dump文件,将其导入到MySQL中之后还不够用的,为了方便搜索,需要将数据再导入到ElasticSearch中。在网上找了很多相关资料和方法进行尝试,出现了各种各样奇怪的错误。最后终于折腾成功,记录一下。

首先,重要的事情说三遍:版本号一定要相互对应,版本号一定要相互对应版本号一定要相互对应版本号不对的话,会出现很多奇奇怪怪的错误,挖下去会是各种无底洞呀……

简单记录一下我的历程:在DigitalOcean上新建了一个Droplet,按照DigitalOcean提供的ElasticSearch安装教程安装了ES 0.90.7,之后按照这篇记录中的方法尝试使用river插件导入,无果。原因是,ES版本不对应。折腾了半天之后发现目前比较靠谱的方法应该是使用elasticsearch-jdbc来直接进行数据导入。

以下为一些简单的命令记录,如果也是用Ubuntu 14.04的同学可以直接拷贝使用。

版本:
ElasticSearch: 1.7.0
elasticsearch-jdbc: 1.7.0.1

1、下载 ElasticSearch 1.7.0

wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.0.deb

2、安装 ElasticSearch 1.7.0

dpkg -i elasticsearch-1.7.0.deb

3、配置 ElasticSearch 1.7.0

vim /etc/elasticsearch/elasticsearch.yml

之后修改 network.host: localhost

4、启动 ElasticSearch 1.7.0

service elasticsearch start

5、下载 elasticsearch-jdbc 1.7.0.1

wget http://xbib.org/repository/org/xbib/elasticsearch/importer/elasticsearch-jdbc/1.7.0.1/elasticsearch-jdbc-1.7.0.1-dist.zip

6、解压 elasticsearch-jdbc 1.7.0.1

unzip elasticsearch-jdbc-1.7.0.1-dist.zip

7、配置 elasticsearch-jdbc 1.7.0.1

新建一个.sh文件: vim import.sh

文件内容

bin=/data/elasticsearch-jdbc-importer/bin
lib=/data/elasticsearch-jdbc-importer/lib
echo ‘{
“type” : “jdbc”,
“jdbc” : {
“url” : “jdbc:mysql://localhost:3306/<dbname>“,
“user” : “<dbuser>“,
“password” : “<dbpass>“,
“sql” : “select * from aminno_member_email;“,
“index”: “am“,
“type”: “email
}
}’ | java \
-cp “${lib}/*” \
-Dlog4j.configurationFile=${bin}/log4j2.xml \
org.xbib.tools.Runner \
org.xbib.tools.JDBCImporter

注意红字部分需要根据自己需要进行替换

之后 chmod +x import.sh

8、执行导入

./import.sh

9、测试导入结果

curl -XGET ‘localhost:9200/am/email/_search?pretty&q=*’

微信JS自定义分享接口失效问题描述以及应对办法

微信团队在跨年夜送给了广大开发者一份大礼——直接粗鲁地禁掉了微信内的JS分享API,具体影响为:
1、分享气泡的题目会变为当前页面标题;
2、分享气泡的图片会变为页面代码中出现的第一张图片(无法完全确认,目测是微信客户端的网页解析逻辑);
3、分享气泡的URL只能是当前的URL;
4、分享气泡给单个好友或群聊时,气泡描述为当前URL;
5、无法获取客户端触发了分享行为,也无法获知分享操作的结果

基于这种情况,开发者目前已经无法直接通过微信的JS API对分享气泡进行定制了。

好消息是,开发者还能利用上面的默认规则1~3对分享出去的气泡进行浅层次的定制,方案简述如下:
1、将分享的标题设成页面标题(此改动会对用户体验有一定的影响,但影响比较次要);
2、在页面最前面插入一个用户不可见的img标签,专门用来存放分享图,hack分享图片的解析逻辑;
3、微调业务逻辑,在每个可能触发分享的页面的URL中都要附加上用于分享的参数信息。因为各业务的具体流程有所不同,需要case by case分析。总体而言,将分享信息放在url的search或fragment里都是不错的思路,特别是放在fragment中时可以不触发页面刷新,对用户体验而言比较无伤。
4、无法使用分享回调的问题可以从游戏设计上规避,把“发出分享后主动发奖”类的流程,改为“对方点开气泡接受邀请之后,再发奖给邀请者”。

充分利用微信分享相关功能一直是大家做HTML5小游戏设计时的重点,此次微信的调整也给H5游戏设计者指了一条道路,即:在设计时,可以设置一个专门的分享页,在需要引导用户分享的时候,首先跳转到该页面,然后再让用户自己去触发分享。依此设计的游戏在QQ、人人和微博分享时也能够转起来。

有个问题是,“分享气泡的图片会变为页面代码中出现的第一张图片”这个无法完全确定。但是我自己在开发的时候,还没有发现分享图URL不是第一个img tag的src属性值的情况。

以上技术方案权当抛砖引玉,欢迎亲们在下方留下更多的思路,一起讨论:)

在Unity游戏中使用Parse或AVOS Cloud组件

Parse和AVOS Cloud分别是国外和国内相对比较靠谱的BaaS提供商之一,然而在尝试将它们的SDK整合到自己的Unity游戏进行发行的时候,遇到了一些问题,记录如下。

问题重现方法:
1、按照官方说明,将SDK加入Unity项目中;
2、输出到iOS或者Android平台时,选择Stripping Level为Use micro mscorlib;
3、输出的时候Unity会报错,提示file not exist等…

问题原因:
Strip code的时候把Parse/AVOS Cloud的反射相关功能一并砍掉了。

问题解决办法:
1、Stripping Level不要选择Use micro mscorlib,改为Strip bytecode即可正常输出工程文件;
2、在Unity工程的Assets目录下增加一个link.xml文件,将Parse相关的库放进去,防止被一起Strip掉。文件内容如下:








使用Genymotion调试Unity发布的Google Android Project

需要解决的几个问题依次是:

1. 使用Unity打包发布Google Android Project
2. 使用Eclipse导入这个Project
3. 在Eclipse里调出Genymotion,启动应用调试

遇到了如下这么多坑:

1. Unity发布出来的Project Folder, 使用Eclipse不能直接导入
> 解决方法:先用Eclipse建立一个Google Android Project,然后把Unity发布出来的所有文件拷贝进去

2. Genymotion不支持Arm架构处理器和GApps
> 这个就说来话长了,为了解决这个问题,在网上找了好久解决方案…
> 解决方案的原文在这里:http://forum.xda-developers.com/showthread.php?t=2528952
> 如果能按照里面说的一步一步做下来,倒也没有任何问题,关键是有些版本的Genymotion对于拖入文件处理不同
> 有些可以直接安装,我的版本是把文件拷贝到了 sdcard/Download 里
> 对于这种现象,解决方案是,安装Root Explorer,然后把Genymotion-ARM-Translation.zip解压出来的System文件夹与安卓系统根目录的System文件夹合并,之后使用adb做一次reboot

Learning Grunt

1、安装方法
sudo npm install -g grunt
sudo npm install -g grunt-cli

2、基本启动流程
grunt.initConfig(); //初始化配置
grunt.loadNpmTasks(); //加载任务
grunt.registerTask(); //注册任务
3、各种插件
JS合并 grunt-contrib-concat
JS合并、混淆、压缩 grunt-contrib-uglify
CSS压缩 grunt-contrib-cssmin
文件复制 grunt-contrib-copy
图片压缩 grunt-contrib-imagemin 依赖于 jpegtran-bin
HTML压缩 grunt-contrib-htmlmin
4、各种插件遵循的基本配置格式
{
     “options” :
     {
          //特定于插件的各种配置
     },
     “procedure_name” :
     {
          //特定步骤的配置
          //一般会有files配置
          //可以是Object格式
          files : {
               ‘DestinationFileName’ : ’SourceFileName’
          }
          //可以是Array格式
          files : [
               {
                    src : ‘源地址’,
                    dest : ‘目标地址’
               },
               //或者可以为各种扩展出来的格式
               {
                    expand : true,
                    //这里是各种扩展出来的属性
               }
          ]
     }
}

Unite China 2014

QQ20140413-1@2x

Recently I’ve been focusing on Unity3D mobile game development when I heard about this Unity’s developers conference to be held in Beijing. Lucky that I got a free ticket from a friend of mine who happens to work for CSDN, which is also one of the hosts of this conference. There’re some very informative sessions on Unity game development and Unity 5 new features. Also there is a real-time motion capture dancing show, which is impressive and much beyond my expectations.

Following are some points that impressed me the most.

Session #1 Development, management and publishing strategies for Unity projects
Of all aspects, art resources influences the whole project the most.
There should be tools or scripts for validating art resources.
When seeking optimization, more time should be focused on CPU / logic parts than GPU / shaders.
Different aspects regarding code architecture should be based on project targets and aims, such as whether use incremental update or not, whether the size of installation package should be strictly restricted, whether the game should support low-end mobile devices, etc.
Regarding memory management, reducing texture sizes is always the most effective way, noting there’ll always be trade-off between art effects and program performance.
The new asset bundle feature is an optimized way of handling resources.
Try not to dispose frequently used UI resources when going through different scenes.
Multi-threading on loading assets might cause drops on performance, so choose the number of threads wisely.
Use of legacy particle systems is depreciated.

– to be continued

Integrate Google Analytics and Admob into Unity3D

Recently I’ve been focusing on mobile game development using Unity3D and fount it necessary to add some plugins to monitor user actions and monetize. After searching on the web for some time, I decided to utilize Google Analytics and Google Admob. However it did take me some time to integrate them into Unity3D project. So I’m simply listing all the things I have done in case this might be helpful to you.

Integrate Google Admob into Unity3D project for iOS

1. Register on Google Admob and get a publisher ID.
2. Download the latest Admob plugin for Unity3D on Google Developer’s Website .
3. Import Admob plugin to your Unity3D project.
4. Add C# code for showing ads. Remember to modify publisherID in the code.
5. Build an Xcode project from your Unity3D project
6. Download the latest Google Admob SDK for iOS from Admob’s Official Site.
7. Follow the instructions listed in the ReadMe file to be able to compile :
7.1 Add SDK files into the Xcode project
7.2 Add “-ObjC” flag in Other Linker Flags in Build Settings
7.3 Import libraries and frameworks needed by SDK, including: AdSupport, AudioToolbox, AVFoundation, CoreGraphics, CoreTelephony, MessageUI, StoreKit, SystemConfiguration
8. Build the project and test your app out on your device.

Actually some weird problems occurred while finishing these steps…

Problem #1 :
When building the project, the linker outputs “library not found for -liphone-lib”, which terminates the building process.
Reason :
It seems that when adding files from the Admob SDK into Xcode project, the Library Search Paths param in Build Settings is not modified in the right way.
Solution :
Modify Library Search Paths param in Build Settings, delete the \” characters in the beginning and ending position so it is exactly  $(SRCROOT)/Libraries

Problem #2:
My code called the method AdMobPlugin.CreateBannerView and set the param positionAtTop to false, hoping the ad banner will show at the bottom of the screen. To my disappointment, that param is not working at all. The ad will always be showing at top.
Reason :
The implementation for CreateBannerView is not complete in the SDK. The flag is not working.
Solution :
Open AdMobPlugin.mm file in the Xcode project and modify the createGADBannerViewWithPubId method like this :

 - (void)createGADBannerViewWithPubId:(NSString *)pubId bannerType:(GADAdSize)adSize
{
    self.bannerView = [[[GADBannerView alloc] initWithAdSize:adSize] autorelease];
    if (!positionAdAtTop_)
    {
        [self.bannerView setFrame:CGRectMake(self.bannerView.bounds.origin.x,

                                             UnityGetGLViewController().view.frame.size.height - self.bannerView.bounds.size.height,

                                             self.bannerView.bounds.size.width,

                                             self.bannerView.bounds.size.height)];

    }
    self.bannerView.adUnitID = pubId;
    self.bannerView.delegate = self;
    self.bannerView.rootViewController = UnityGetGLViewController();
}

Everything is working properly now :-)
Still another thing to note, the AdBannerView won’t get destroyed when we create a new one. It will definitely cause memory leak.

Integrate Google Analytics into Unity3D project

Google Analytics is a very handy toolset for indie game developers. It is easy to set up and totally free. Thanks to Mass Threat Labs, we can finish GA integration in minutes.
1. Set up your Google Analytics account.
2. Download the plugin on Mass Threat Labs’s website.
3. Import the plugin into your Unity project.
4. Drag the prefab into your first Scene.
5. Call the API anywhere you want to report.

The real-time graph is super cool =]

与iPhone应用运营有关的一些想法

昨夜睡前突然想到了一些iPhone应用的运营思路,越想越兴奋,结果失眠了,sigh = =

由于每次更新iPhone应用的客户端的版本都需要苹果的审核,因此面对紧急的bug时,在客户端非常难做及时的调整。所以,基本的思路就是,要将客户端做得非常灵活,一些关键逻辑可以做到从后台控制,这样在发生突发状况时可以直接在后台发布新版本来更新整个应用的功能。最极端的状况是把客户端做成一个脚本解释器,通过从后台下载脚本来完成应用或者游戏的功能。这样对客户端的要求可能就要高一些了,在脚本解释方面一定不能出现bug,= =..

具体到游戏的运营,可以考虑这样做:客户端集成渲染引擎和基础游戏逻辑,然后将关卡数据、游戏素材等通过后台来将配置下发,这样更新的关卡或调整数值时就不用发布新的客户端版本了。同时游戏外层的菜单逻辑完全可以考虑采用脚本编写,提供最大的灵活性。

想到这里,其实可以再多想一些,何不把这种技术做成一种平台/服务?我们提供的是一个易于发布和维护iOS应用的平台,将应用运行框架(其实说白了就是一个脚本解释器..)做成一种中间件,开发者只需让应用初始化上架一次,其它的更新就可以通过这个平台来进行后台发布。。。