AnotherMach

我的又一个博客

小米在背叛用户的道路上越走越远

今天升级了小米1S的ROM,乍看UI很漂亮。但是马上发现了问题

  1. Google Play打不开了,闪退;

  2. Gmail也是;

  3. 联系人一个不剩,这是最惨痛的吧。我记得之前设置了Google账号同步联系人,但是去看Gmail的通讯录发现最近新存的联系人一个都没有同步…… 我想把Gmail里的联系人同步回来(好歹还是一大部分),发现添加账号里已经没有了Google账号的选项。

去小米官网上找老的ROM,发现数量有限,也不知道能不能回滚到之前的版本。

抓取股市历史数据

写了个小程序从yahoo财经上扒中国股市20年来的数据。

yahoo的API:

1
http://ichart.yahoo.com/table.csv?s=<string>&a=<int>&b=<int>&c=<int>&d=<int>&e=<int>&f=<int>&g=d&ignore=.csv
  • s:股票代码
  • a:起始月份
  • b:起始日
  • c:起始年
  • d:终止月份
  • e:终止日
  • f:终止年

先获取一份沪深两市的股票代码列表(可以从同花顺导出成Excel格式,再另存为txt)

stock_code.txt
1
2
3
4
5
6
7
8
9
10
11
SH600000
SH600004
SH600005
SH600006
SH600007
SH600008
SH600009
SH600010
SH600011
SH600012
...
getHistory.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cat stock_code.txt | while read LINE
do
  NUM=${LINE:2}
  PLACE=${LINE:0:2}
  if [ $PLACE = 'SH' ]; then
      PLACE='ss'
  fi
  if [ $PLACE = 'SZ' ]; then
      PLACE = 'sz'
  fi
  CODE=${NUM}.${PLACE}
  URL='http://ichart.yahoo.com/table.csv?s='${CODE}'&a=9&b=26&c=1986&d=6&e=1&f=2013&g=d&ignore=.csv'
  curl $URL >> ${CODE}.csv
  returnCode=$?
  
  TIME_BACK=1
  while [ $returnCode != 0 ]
  do
      sleep TIME_BACK
      curl $URL >> ${CODE}.csv
      returnCode=$?
      TIME_BACK=2*$TIME_BACK
  done
done

用树莓派做BT下载机

用树莓派做下载机只需要一个不太小的U盘。我现在用的是一个8G的U盘,对于家里200来K的网速已经绰绰有余了。

STEP 1 挂载U盘

1
mount /dev/sda /root/downloads

STEP 2 安装transmission-cli

Transmission的是开源的BT软件。在arch上安装命令行版本:

1
pacman -Sy transmission-cli

STEP 3 配置transmission

transmission的配置文件在/root/.config/transmission-daemon/settings.json。 把rpc-whitelist-enabled设置为falserpc-bind-address改成0.0.0.0,把download-dir改成/root/downloads

rpc-whitelist-enabled关闭白名单访问控制,否则只能从白名单里的IP访问;关闭控制后笔记本电脑、手机、平板等都可以添加下载任务。

rpc-bind-address是tranmission服务绑定的地址,原先的值是127.0.0.1,这样只能从本地访问;改成0.0.0.0后可以绑定任何找得到的网卡(interface)。

download-dir指向的位置就是U盘挂载的位置,这样下载内容直接存入U盘。

STEP 4 启动下载服务

1
transmission-daemon

STEP 5 添加下载任务

在别的设备通过web访问RPi的9091号端口。例如我的RPi的IP是192.168.1.6,那只要在笔记本上打开浏览器,输入192.168.1.6:9091就可以看到BT下载的界面。这个界面可以添加种子文件等,和本地的transmission,uTorrent等大同小异。

下载完成后可以关掉服务,卸载U盘

1
2
killall transmission-daemon;
umount /root/downloads

拔出U盘就可以了。

也可以参考之前的Blog从网络上复制。

BTC挖矿笔记

最近偶然看到Bitcoin价格疯涨,今天一个Bitcoin的价格达到了1000RMB。一颗蠢蠢欲动的心又打起了挖矿的主意。

Bitcoin挖矿仅仅需要一个矿坑的账号,和一个挖矿软件;甚至不需要花一个通宵让官方的Wallet软件完成同步。

BTC矿坑茫茫多,随便找一个BTCGuild作为例子。到http://www.btcguild.com/ 注册一个账号,注册后网站会提供一个worker账号给你,只要把这个worker的账号密码填到挖矿软件里,矿坑就可以收到你挖出的Bitcoin。

矿坑账号

挖矿软件最傻瓜好用的是https://github.com/Kiv/poclbm/,纯绿色软件免安装。这个软件可以选择用不同的设备(CPU, GPU等)或不同的软件挖矿,说白了只是个前端。

挖矿速度的单位是每秒哈希数(Hash/s, H/s),我用一台双核台式机的CPU可以达到1.5MHash/s,属于挖出来的Bitcoin都不足以支付电费的速度。专业矿工会用GPU甚至FPGA挖矿。在淘宝上搜索“矿机”就可以了解一二。

account balance

iOS中调整图片尺寸带来的低画质

最近开始参与iOS开发,碰到一个困扰挺长时间的问题。

应用软件里需要一个25*25像素的图标,于是美工做了一个50*50的给我。我Google了改变图片尺寸的办法,最早的代码是这样的

1
2
3
4
5
6
#define ICON_SIZE 25
...
UIImage* warningImg = [UIImage imageNamed:@"icon.png"];
CGSize warningSize = CGSizeMake(ICON_SIZE, ICON_SIZE);
warningImg = [Utils resize: warningImg scaledToSize:warningSize];
UIImageView* warningView = [[UIImageView alloc]initWithImage:warningImg];

Utils是一个工具类,resize用来改变一个UIImage对象的尺寸

1
2
3
4
5
6
7
+ (UIImage *)resize:(UIImage *)image scaledToSize:(CGSize)newSize{
    UIGraphicsBeginImageContext(newSize);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

在iPod Touch上运行发现图片非常不清晰,可以明显看到像素的感觉。于是美工跟着折腾了好长时间直到我意识到也许是我的问题。

于是我尝试改写了第一段代码:

1
2
3
4
5
6
7
8
9
10
#define ICON_SIZE 25
...
UIImage* warningImg = [UIImage imageNamed:@"icon.png"];
CGSize warningSize = CGSizeMake(ICON_SIZE, ICON_SIZE);
UIImageView* warningView = [[UIImageView alloc]initWithImage:warningImg];

CGRect frame = warningView.frame;
frame.size.x = ICON_SIZE;
frame.size.y = ICON_SIZE;
warningView.frame = frame;

这次得到了清晰的图标。

Z Shell通配符引起的报错

最近换到Z Shell,写Blog时rake new_post["post title"]会报错。

原因是Z Shell强大的通配符功能。zsh把["post title"]当成通配符,试图找出当前目录下文件名为p, o, s, t等的文件。报错是因为zsh认为没有找到相关的文件。

下面是一个正确使用通配符的例子:

ls [cG]* 找出当前目录下所有以cG开头的文件。

Z Shell通配符闹笑话的另一个例子是:scp enzo@arch:~/* ./ 这行命令试图把主机arch上用户enzo的home下的所有文件拷贝到本地主机的当前目录下。而Z Shell发现找到不到匹配enzo@arch:~/*的文件名也会报错。

解决办法

  • 最容易想到的办法是切换到bash,完成rake new_post["post title"]后再切换回来。简单有效,在对问题原因一无所知的情况下是最好的办法。
  • 双引号可以阻止Z Shell匹配,上面的例子里加引号即可。
1
rake "new_post['Error caused by zsh globbing']"
  • noglob命令有类似的作用
1
noglob rake new_post['Error caused by zsh globbing']

巨复杂的Kinect开发环境

手头的Kinect是for Windows的商用开发版,刚出来不久,开源并且跨平台的libfreenectOpenNI都没有对应的驱动。因此只能在装有Windows的机器上开发。连接在mbp上Kinect (for Windows)的状态灯会不停闪烁,指示没有连接。

早先在mbp上装Windows虚拟机可以开发,但终究资源有限,性能跟不上;好不容易有了台PC,但视频输出只有HDMI和DVI,找了个DVI->VGA的转接头后显示器只能显示最低分辨率连确定按钮也找不到。

一连串奇葩的限制导致最后的解决办法是Kinect for Windows连着装WIN7的PC,PC网线直连(马上会解释会什么)mbp,mbp远程桌面控制PC。

细节

  • RDC(Remote Desktop Connection for Mac) v.s. rdesktop

    微软的Office套件里有远程桌面工具RDC

    细节比较鸡糟

    1. 并且不是OSX原生的全屏,所以切换到别的OSX程序非常麻烦。
    2. 显示的比例不对,而且没有办法调整。

    rdesktop在Mac下安装简便brew install rdesktop即可。使用时rdesktop -f 10.10.10.2-f参数用来设置全屏。使用Command+option+a来切换远程Windows和本地Mac。

  • 网络设置

    最早我试过Mac和PC都连接到路由器(Mac无线,PC有线),但远程桌面延迟非常严重。所以现在是Mac无线(en1)接着路由器,有线(en0)与PC直接连接。

    麻烦的是en0的默认优先级似乎高于en1,要访问外网还需要调整路由:

1
2
sudo route change default -interface en1
#将en1设置为默认interface,route命令似乎与别的*nix不同

The Good

  • Mac既可以访问Internet也可以远程控制PC
  • 远程桌面流畅,并且不会给Mac增加太多负载

The Bad

  • 实际上用了双份电费,不环保

The Ugly

  • PC现在无法访问Internet;好像没有很方便的办法解决,但看起来也没有必要

UPDATE:

昨天折腾好环境后今天远程桌面控制Kinect,发现极不稳定;但直接在PC上就没有问题。应该是硬件瓶颈,具体无法确认。

初识树莓派

上周在TB买了一个树莓派,在京东买了一张8GB class6的SD卡。这些几乎就是树莓派需要准备的所有硬件。 其他硬件包括:

  • 电源线。树莓派的电源是Micro USB的接口,现在很多手机也是。一端连接树莓派,另一端连接电脑或者市电都可以。
  • 键鼠。树莓派有两个USB接口。
  • 视频线。树莓派提供RCA和HDMI两种接口。我的显示器很久,是VGA的。所以用RCA连接家里的电视。

安装操作系统

树莓派的官方网站提供了操作系统的下载。有直接下载和BT下载两种方式,目前BT下载很快。

下载格式是zip,解压后有一个img文件。在*nix下安装都是通过dd直接写SD卡;Windows下需要一些工具。

例如:

1
$ dd if=/path/to/os.img of=/dev/disk1

不论解压前的大小,解压后的img文件都是2G。应该是在一张2G的SD卡上费劲装好在dd导出的。 如果要备份当前操作系统(例如想要换另一个发行版),可以用类似的方式在电脑上把SD卡dd到一个img文件。缺点是如果你用了一张4G的SD卡(几乎是必须的)或者更大的SD卡,那备份文件也会那么大。因为dd不需要理解文件系统。

执行上述dd命令后将是漫长的等待,建议用pv观察进度

1
$ dd if=/path/to/os.img | pv | dd of=/dev/disk1

启动

完成上述安装后把SD卡装进RPi里连上电源就启动了,可以看到LED灯亮。树莓派没有开关,通电断电就是开关。

如果你没有显示器也没有关系,给RPi插上网线,启动后ssh登陆即可。官网上每个发行版都注明了默认的用户名密码。

有线网络对树莓派还是很必要的,每次RPi都需要通过ntp同步一下时间。

Download Like a Boss

How can you download a file from computer Remote to computer Local without a USB stick? Tricks can be useful when you have more than 1 computers or you are running a virtual machine.

HTTP

Nginx, Apache, and many other http servers are here to install with a simple command like pacman -S nginx or apt-get install nginx.

No, just do python -m SimpleHTTPServer in the source folder on the Remote (using ssh or directly if you it’s a virual machine).

The drawback is it only support one download at a time.

FTP

TBD

scp

scp seems the tool born for this task, by its name.

scp enzo@arch:~/myfile ~/ copies Remote file to the Local, and it can also copy Local ones to Remote.

dd

dd is the the most flexible one here.

1
ssh enzo@arch dd if=/home/enzo/myfile | dd of=/Users/enzo/myfile

Ensure /Users/enzo/myfile exists by touch /User/enzo/myfile.

But this still does not show progress information, and that’s what pv is for.

1
ssh enzo@arch dd if=/home/enzo/myfile | pv | dd of=/Users/enzo/myfile

The line above shows current speed and total size downloaded, but no percentage and ETA information because pv has no knowledge about the total size.

Fix this with

1
ssh enzo@arch dd if=/home/enzo/myfile | pv -s 100M | dd of=/Users/enzo/myfile

where 100M should be replaced accordingly.

rsync

If you have the Remote as a backup and thus want to push Local folder to Remote quite often, rsync is the choice.

1
rsync -a --delete -e ssh ~/Music/ enzo@arch:~/back &> /dev/null

The line above synchronize Local Music foler to Remote back folder.

Use rsync with cron if you want automatic backup.

Use rsync with Automator on OSX.

家用影视服务器

家里的台式机是刚高中买的,到现在差不多是七八年的样子。配置非常陈旧:80G的IDE硬盘,512M的DDR一代内存,一颗当时就很低端的赛扬单核CPU。由于硬盘长期被迅雷蹂躏,它在我刚上大学的时候就已经能发出卡车般的咆哮。即使安装windows xp仍然卡的看不下去。

鉴于系统瓶颈在硬盘,2012年暑假在淘宝上买了一块40G的西数IDE硬盘,多番蹂躏后确定在西数上装纯命令行的archlinux,把80G的三星挂载起来做下载盘——继续它曾经的工作。

安装archlinux

这是去年的事了,照着arch wiki上的指南做基本不会出问题——即使是这台CMOS电池接触不良每次开机都回到本世纪初的电脑也没问题。

安装完成后记得安装ssh服务,这样可以从笔记本上访问台式机的终端,免去坐在台式机前受罪。

在接下来要在每次开机时自动挂载第二块硬盘(80G的三星)。我曾经一度是在~/.profile里挂载的 sudo mount /dev/sda1 /home/download

于是每次都要蛋疼地去输一次root的密码。 正确的做法是配置/etc/fstab,里面原先就有一些行,照着抄一下或者google都可以。

安装Transmission

这也是去年的事了,还是照着arch wiki上的指南。 完成后可以从局域网内其他终端访问:http://192.168.1.3:9091 192.168.1.3是台式机的IP,9091是Transmission的web服务的默认端口。

到此为止下载电影已经搞定了。尽管硬盘只有80G,但是联通的小水管是根本来不及塞满它的。 下载完成之后可以用各种方法把电影拖到笔记本或者pad——幸好我没有——里看,但是这样仍然很费事,所以我想到了让台式机做流媒体服务器。

流媒体服务器

首先我想到了vlc

VLC

VLC是万能的媒体软件,甚至可以在纯文字界面下工作vlc -I ncurses

你可以Google一下怎么用VLC搭视频服务器,VLC的官网上也有相关的文档。

我就是这么浪费了一下午的。

HTML5的video tag更简单的选择。

HTML5

随便安装一个web server。

1
sudo pacman -S nginx

把下载盘挂载到nginx的工作目录下某个位置

1
sudo mount /dev/sda1 /usr/share/nginx/html/video

写个html试试

test.html
1
2
3
4
<video width="560" height="340" controls>
  <source src="video/Tai.Chi.Hero.2012.BluRay.720p.DTS.x264-CHD/Tai.Chi.Hero.201
2.BluRay.720p.DTS.x264-CHD.mkv">
</video>

访问http://192.168.1.3/test.html

可以全屏

只需要连着wifi,就可以看电影。