You have updates available for other accounts

今天上app store,发现The Hit List有更新,但是我点update按钮,总是提示”You have updates available for other accounts
“。百度上搜了一下,看到有人问类似的问题:美国区的apple id买了app,后来apple id设置成中国区之后再购买软件,是否需要重新付费?
别人的答案应该是不会重复扣钱的。我以为我业是账户区域的问题,我尝试把账户从中国区换成美国区,但是没能通过最终的信用卡验证。

然后又想到既然不会重新收费,干脆先旧的版本先卸载掉再重新安装,可是卸载之后,进入app store,在The Hit List页面还是显示update按钮,而不是install按钮。

只好求教google。

得到的答案很意外,竟然和apple id没有关系,而是和spotlight相关。
app store应该是使用了spotligth的缓存来判断已经安装过的软件。
而我正巧因为使用QuickSilver而把spotlight的索引功能禁用了。
按照搜到的blog的介绍,我把spotlight的索引重建之后,再进入app store就好了。
按钮显示为install,而且点击之后会提示因为之前购买过早期的版本,所以本次下载不收费。

jquery中对select/radio/checkbox进行操作的方法

每次都要google,终于搞烦了,统一列在这里记录一下:

  1. select

    对于下面的下拉框

    <select id='selecttest'>
        <option value='v1'>value 1</option>
        <option value='v2'>value 2</option>
    </select>
    
    • 选择v1选项

      $("#selecttest option[value=v1]").attr("selected",true);
      $("#selecttest option[value=v1]").attr("selected","selected");
      
    • 取消选中v1选项

      $("#selecttest option[value=v1]").attr("selected",false);
      $("#selecttest option[value=v1]").removeAttr("selected");
      
    • 读取当前被选中的选项

      $("#selecttest option:selected").val();
      
  2. radio

    对于下面的radio group

    <input type='radio' name='radiotest' value='v1' />
    <input type='radio' name='radiotest' value='v2' />
    
    • 选择v1选项

      $('input:radio[name=radiotest][value=v1]').attr('checked', true);
      $('input:radio[name=radiotest][value=v1]').attr('checked', 'checked');
      
    • 取消选择v1选项

      $('input:radio[name=radiotest][value=v1]').attr('checked', false);
      $('input:radio[name=radiotest][value=v1]').removeAttr('checked');
      
    • 读取当前被选中的选项

      $('input:radio[name=radiotest]:checked').val();
      
  3. checkbox

    对于下面的checkbox

    <input type='checkbox' id='checkboxtest' />
    
    • 选中

      $('#checkboxtest').attr('checked',true);
      $('#checkboxtest').attr('checked','checked');
      
    • 取消选中

      $('#checkboxtest').attr('checked',false);
      $('#checkboxtest').removeAttr('checked');
      
    • 读取选中状态

      $('#checkboxtest').is(':checked');
      

切换代理的chrome插件

我一直用ssh tunnel翻墙,在firefox下用foxyproxy一直很正常。但是在chrome下就总是悲剧。

我的需求很简单,我需要三种上网模式,并能很方便的在几种模式下切换。

* 完全禁用代理
* 所有的请求都通过ssh tunnel代理
* 能根据网站url自动的决定是否使用ssh tunnel代理(我通过pac文件来实现)

Chrome下有个Switchy插件,能够满足前两点需求,但是最后一点,无论是我使用pac文件,还是使用它自身的Auto Mode,都不好使。
前天花1个小时看了一下Switchy的源代码,没看出什么头绪。昨天索性就自己写了一个,发现其实挺简单的。
不得不说,google做的东西就是好,不光chrome本身做得好,连它提供的外部接口使用起来也是方便快捷。

主要参考了三篇文章,都是官网提供的:

  1. 入门级教程, 主要了解了开发插件的大致过程,比如怎样加载和更新插件。

  2. 关于browserAction的例子,主要了解如何处理插件图标的点击事件,如何给插件设置图标。

  3. chome.proxy接口文档,文档中已经提供了足够丰富的如何设置代理样例代码。

我自己的插件基本上就是在browserAction的例子上改的,然后盗用了Switchy的三张图片。
除去图片一共就三个文件,也没多少代码,全贴出来。
实现的功能就是点击插件按钮时在三种上网模式下依次切换。
而我使用的pac文件的网址,以及ssh tunnel的地址和端口号,都是写死在代码里面的。

阅读全文

mac os中针对ssd的优化

  1. 打开trim

    所谓trim,是指删除文件时通知SSD,这些文件已经删除,对应的block可以释放。这样可以避免下次再向这些block写入时的性能下降。
    mac原装的SSD是支持trim的,但是自己装的SSD默认不会开启这个功能,有个叫trim enabler的工具可以做这件事情。

  2. 挂在ssd时加入noatime的参数

    atime(access time)是inode中标记文件上一次访问时间的字段。默认情况下,每次访问(读或者写)一个文件时,操作系统都会更新该文件的atime值。
    因为atime并不是一个很重要的数值,一般服务器性能优化的时候都会考虑加挂载磁盘的时候加上noatime参数,这样可以在一定程度上提升性能。
    至于挂载SSD时设置这个参数有什么更多的好处,我也说不上,但总归没有坏处。

    修改方式,使用sudo vifs修改 /etc/fstab 文件

    UUID=BB30FFEF-7E28-3F02-AC9F-9B9888176D59 /     hfs auto,rw,noatime 0 1
    
  3. 关闭mdworker, 它是spotlight用于建立文件索引的进程。我用quicksilver, 不用spotlight, 所以把它禁用掉。

    sudo mdutil -a -i off

  4. 关闭待机时写入硬盘

  5. 在系统的电源管理设置中把”put hard disk to sleep when possible”选项关掉。

刷火车票的shell脚本

要用这个脚本得懂点shell和web开发。
window下面需要装cygwin才有shell环境。

用法:

  1. 先把脚本存下来,比如起名叫order.sh。

  2. 登陆网站,取得当前登陆的cookie,填到脚本里面,这个也可以用firebug取,登陆网站之后,验证码页面请求的header里面都能看到cookie那一行。

    cookie: JSESSIONID=6009B4610F436D8023126256FB598BDD; BIGipServerotsweb=2413035786.48160.0000
    
  3. 手动把里面的订票参数改掉。主要就是座位,日期,订票人,车次的信息。
    车次的信息需要从网页源码或者页面请求参数里面取。比如从查询页面点击预定按钮进入预定页面时,会向这个页面发POST请求

    https://dynamic.12306.cn/otsweb/order/querySingleAction.do?method=submutOrderRequest
    

    用firebug能看到这些参数

    train_no=240000K2670V
    station_train_code=K267
    from_station_telecode=BXP
    from_station_name="北京西"
    to_station_telecode=LEQ
    to_station_name="澧县"
    start_time="12:10"
    end_time="09:01"
    

    如果只订一个人的票,代码最下面还要把passenger_2相关的代码删掉

        -d "passengerTickets=$seat_type,1,$id_card_name2,$cardtype2,$id_card_no2,$mobile_phone2,Y" \
        -d "passenger_2_seat=$seat_type" \
        -d "passenger_2_ticket=1" \
        -d "passenger_2_name=$id_card_name2" \
        -d "passenger_2_cardtype=$cardtype2" \
        -d "passenger_2_cardno=$id_card_no2" \
        -d "passenger_2_mobileno=$mobile_phone2" \
    
  4. 从查询车次的页面随便搜一个车次,可以和你订票的车次没有任何关系,也不用同一天,只要能点预定按钮就行,然后点预定按钮进入预定页面。
    这是技术上的原因。不好多解释。这个步骤主要是影响到脚本里面向下面这个页面发请求获取token参数。

    https://dynamic.12306.cn/otsweb/order/confirmPassengerAction.do?method=init
    
  5. 改完之后,打开下面的页面刷一个验证码出来

    https://dynamic.12306.cn/otsweb/passCodeAction.do?rand=randp&1234567890

  6. 比如验证码是9527,那么就执行

    ./order.sh 9527

  7. 祈祷!

几个重要的点:

  1. 每次提交时发生变化的参数只有2个:

    • org.apache.struts.taglib.html.TOKEN 这个是每次生成页面表单的时候自动重新生成的,网站用它来防止用户重复提交订单。
    • randCode 验证码,神奇的是,如果不刷新验证码的页面,验证码可以反复使用。当然验证码是有有效期的,但是不知道多久,5分钟应该有吧。
  2. 上面提到的第4步很重要,一旦某次预定成功之后,重新再预定别的车次之前需要重复执行这一步。

shell脚本如下:

阅读全文

MTU导致scp假死的问题

昨天遇到一个诡异的网络问题,让我郁闷了一会儿。
公司某台机器用svn,scp,git,rsync等各种方式向外网传数据时总是会假死。

比如svn提交,

work@ubuntu:~/svn_repos$ svn ci Resources/anim/images/walk.png  -mx
Adding  (bin)  Resources/anim/images/walk.png
Transmitting file data .

当输出最后那句话之后就死掉了,等很久都没有反应。Ctrl+C之后,提示如下:

svn: Commit failed (details follow):
svn: While preparing '/home/work/svn_repos/Resources/anim/images/walk.png' for commit
svn: Caught signal

但是文本文件就能成功提交。第一反应是网络慢,或者svn的binary数据传输有问题。各种尝试,git,scp,rsync,现象都类似。
比如scp:

work@ubuntu:~/svn_repos$ scp  Resources/anim/images/walk.png work@example.com:~/
walk.png         100%   89KB  89.5KB/s   00:00

阅读全文