Read Sean

Read me, read Sean.
posts - 508, comments - 655, trackbacks - 9, articles - 4

2011年8月2日

不知道从什么时候开始的,tsocks在Mac下面安装要费些周折,brew官方和曾经一度存在的第三方tap都不再支持直接brew install,需要手工创建formula。过程倒也还OK:

vim /usr/local/Library/Formula/tsocks.rb

require 'formula'

class Tsocks < Formula
  # The original is http://tsocks.sourceforge.net/
  # This GitHub repo is a maintained fork with OSX support

  homepage 'http://github.com/pc/tsocks'
  head 'https://github.com/pc/tsocks.git'

  depends_on 'autoconf' => :build if MacOS.xcode_version.to_f >= 4.3

  def install
    system "autoconf""-v"
    system "./configure""--prefix=#{prefix}""--disable-debug""--disable-dependency-tracking""--with-conf=#{config_file}"

    inreplace("tsocks") { |bin| bin.change_make_var! "LIBDIR", lib }

    system "make"
    system "make install"

    etc.install "tsocks.conf.simple.example" => "tsocks.conf" unless config_file.exist?
  end

  def test
    puts 'Your current public ip is:'
    ohai `curl -sS ifconfig.me 2>&1`.chomp
    puts "If your correctly configured #{config_file}, this should show the ip you have trough the proxy"
    puts 'Your ip through the proxy is:'
    ohai `tsocks curl -sS ifconfig.me 2>&1`.chomp
  end

  def config_file
    etc / 'tsocks.conf'
  end
end

有了上述formula之后,即可 brew install --HEAD tsocks 。

posted @ 2014-05-07 23:23 laogao 阅读(4055) | 评论 (2)编辑 收藏

有了RPi当然免不了要玩玩XBMC,这里推荐XBian,安装配置过程如下:

1- 下载.img文件 ( http://www.xbian.org/download/ );
2- 用dd命令将.img(比如XBian_beta_2.img)写入SD卡;
3- 将中文字体(比如wqy-zenhei.ttc)重命名为arial.ttf,复制到SD卡的~/.xbmc/media/Fonts目录(XBian默认用户为xbian,密码raspberry);
4- 从 https://code.google.com/p/xbmc-addons-chinese/downloads/detail?name=repository.googlecode.xbmc-addons-chinese-eden.zip 下载资源插件并复制到SD卡;
5- 将SD卡插入RPi并连接HDMI到电视机/显示器;
6- RPi开机,进入XBian的配置页面,可以校准屏幕,配置网络连接等;
7- 在系统设置中选择字体为Arial,语言选为中文,此时应该看到界面可正常显示中文;
8- 安装扩展程序,选择之前下载到SD卡的repository.googlecode.xbmc-addons-chinese-eden.zip文件,扩展安装成功后即可在扩展程序列表中看到对应的资源条目,逐一安装即可。

额外提示:XBMC也可以通过网络共享播放视频,之前跟大家提到过XBMC显示中文字幕有时出现整行被方块覆盖的问题,解决方法是在字幕文件中查找并删除或替换"…"字符。Enjoy!

posted @ 2014-04-06 17:45 laogao 阅读(2352) | 评论 (0)编辑 收藏


整理一下 IntelliJ IDEA 最常用的快捷键,按照便于记忆的方式排列:

Ctrl-N              Class... (find by name)
Ctrl-Shift-N        File... (find by name)
Ctrl-Shift-Alt-N    Symbol... (find by name)
Ctrl-G              Line... (goto line)
Ctrl-H              Type hierarchy (hierarchy)
Ctrl-Shift-H        Method hierarchy (hierarchy)
Ctrl-Alt-H          Call hierarchy (hierarchy)
Ctrl-Q              Quick documentation
Ctrl-Alt-I          Auto-indent lines (indent)
Ctrl-Alt-L          Reformat code (line up)
Ctrl-Alt-O          Optimize imports (optimize)
Ctrl-/              Comment with line comment (//)
Ctrl-Shift-/        Comment with block comment (/*...*/)
Ctrl-W              Select word or block (word)
Ctrl-D              Copy line (duplicate line, yyp)
Ctrl-X              Cut line (dd)
Ctrl-U              Uppercase/lowercase (upper)
Ctrl-J              Insert live template
Ctrl-Alt-J          Surround with live template
Ctrl-Alt-T          Surround with (template)
Ctrl-Shift-J        Join lines (join)
Ctrl-E              Recent files (editions)
Ctrl-Shift-E        Recently changed files (editions)
Alt-Shift-C         Recent changes (changes)
Ctrl-B              Delcaration
Ctrl-Shift-B        Type declaration
Ctrl-Alt-B          Implementation(s)
Ctrl-P              Parameter info (parameter)
Ctrl-Space          Basic completion
Ctrl-Shift-Space    Smart completion
Ctrl-Alt-Space      Completion lookup
Alt-Enter           Auto-complete
Alt-Insert          Generate...
Ctrl-Shift-Up/Down  Move statement up/down
Alt-Shift-Up/Down   Move line up/down
Ctrl-Up/Down        Scroll up/down
Alt-Up/Down         Previous/next method
F2                  Next highlighted error
Shift-F2            Previous highlighted error
Ctrl-F              Find
Ctrl-R              Replace
F3                  Next match
Shift-F3            Previous match
F4                  Jump to source
Ctrl-Alt-Shift-T    Refactor this
F5                  Refactor copy
F6                  Refactor move
Ctrl-F6             Refactor change signature
Shift-F6            Refactor rename
Alt-Delete          Refactor safe delete
Ctrl-Alt-V          Refactor extract variable
Ctrl-Alt-F          Refactor extract field
Ctrl-Alt-P          Refactor extract parameter
Ctrl-Alt-M          Refactor extract method
Ctrl-Alt-N          Refactor inline

posted @ 2014-03-09 13:38 laogao 阅读(12873) | 评论 (0)编辑 收藏

不久前入了个 Raspberry Pi 也就是大家说的树梅派(以下简称RPi),拿来做蓝牙测试,用的蓝牙dongle是ORICO的BTA-403-BL http://item.jd.com/980800.html 。这里简单记录下安装过程:

首先是操作系统。作为Arch重度用户,当然选Archlinux ARM了: http://archlinuxarm.org/platforms/armv6/raspberry-pi 下载img文件,用dd写到SD卡上:
dd bs=1M if=/path/to/archlinux-hf-*.img of=/dev/sdX

然后用GParted把SD卡上的分区拖满,充分利用空间。这样SD卡就准备好了,插到RPi上,接上Micro-USB的电源和网线,启动RPi,从路由器上找到RPi的IP地址(机器名默认是alarmpi),ssh上去(用户名root密码root),修改密码,创建非root账号,执行系统更新 sudo pacman -Syu ,这之后开始安装蓝牙相关工具:
sudo pacman -S bluez bluez-utils

确保蓝牙dongle插到RPi的USB接口,通过 hciconfig 确认蓝牙设备被识别,输出应该类似下面这个样子:
[sean@alarmpi]$ hciconfig
hci0:   Type: BR/EDR  Bus: USB
        BD Address: 84:A6:C8:DC:04:97  ACL MTU: 310:10  SCO MTU: 64:8
        DOWN 
        RX bytes:553 acl:0 sco:0 events:28 errors:0
        TX bytes:384 acl:0 sco:0 commands:27 errors:0

启动bluetooth:
sudo systemctl start bluetooth

完成以后,即可通过 bluetoothctl 命令打开蓝牙控制台,执行各项蓝牙相关操作,比如show、list、scan on、agent、info等等,这里不展开了。

如果想使用图形界面操作RPi,也很简单,基本步骤如下:
sudo pacman -S xorg xorg-xinit lxde
echo 'exec startlxde' > ~/.xinitrc
startx

Enjoy!

posted @ 2014-01-01 13:11 laogao 阅读(3463) | 评论 (1)编辑 收藏

第11页(练习):
在Scala REPL中键入3,然后按Tab键 应为 在Scala REPL中键入3.,然后按Tab键

第19页(正文):
util方法返回一个并不包含上限的区间 应为 until方法返回一个并不包含上限的区间

第19页(代码):
0 util s.length 应为 0 until s.length

第31页(正文):
util是RichInt类的方法 应为 until是RichInt类的方法

第34页(代码):
ArraryBuffer 应为 ArrayBuffer
b.sorted(_ < _) 应为 b.sorted
b.sorted(_ > _) 应为 b.sortWith(_ > _) 

第44页(代码):
scala.collections.immutable.SortedMap 应为 scala.collection.immutable.SortedMap

第53页(正文):
Scala对每个字端都提供getter和setter方法 应为 Scala对每个字段都提供getter和setter方法

第107页(代码):
val tokens = source.mkString.split("\\S+") 应为 val tokens = source.mkString.split("\\s+")

第341页(代码):
var count: (Int => Double) => null 应为 var count: (Int => Double) = null

// 本文仅作为信息发布窗口,如需讨论交流,请通过邮件 gaoyuxiang.scala@gmail.com 或 QQ群 132569382 。

posted @ 2012-11-15 15:56 laogao| 编辑 收藏

可能很多人不以为然,写作和编程能有什么关系。

首先,写作促进我们思考。程序员每天的工作,不论是学习新知识新技术、理解软件需求、阅读代码/文档、设计框架、还是实现业务逻辑,都离不开思考。相信很多人都有过这样的体验: 对于某个设计或知识点,你以为自己想清楚了,但真要让你解释给别人听,你又会觉得无从下手,几轮过后回想当初,之前所看到和相信的不过是错觉,当你完整的向其他人转述一遍之后,你才算是真正想明白了。其实这个道理和书桌上放一只橡皮鸭/填充玩偶(然后向它讲述你的想法)的做法是相通的,只不过写作本身不光整理了思路,还留下了文档,同时,写作的过程也是不断加深印象、提升信心的过程,可谓一举多得。

其次,和写作一样,编程的主要目的是与世界交流,不论这个世界是指的机器的世界还是人的世界。要有效地与机器世界交流,你编写的代码必须符合一定的语法和范式,必须逻辑上讲得通,这样才有意义。而基本的写作训练可以让我们养成主动留意错别字、格式、拼写错误、逻辑错误的习惯。如C. A. R. Haore所说,我们宁要明显无错误的代码,不要无明显错误的代码。这点洁癖是好程序员必须具备的修养。这也是为什么我看到有明显拼写错误的程序员简历时,会直接把他/她们拉黑。同样地,我一直坚持认为,如果程序员写不出结构优良的纯文本文档,那么我们也不必指望他/她能够写出优雅的代码。除此之外,我们还可以再稍微发散一下: 开源项目那么多,满足类似需要的往往不止一个,为什么有的很成功,有的却无人问津? 主创/灵魂人物的写作能力,不论是代码、文档、邮件还是PPT,是很重要的分野。我相信,改变世界、影响更多的人,是很多程序员梦寐以求的,而要做到这一点,离不开写作。

最后,写作通常是程序员的短板,亦即最容易低成本高产出的地方。我一直很不喜欢人为地给不同专业背景的人贴上文科和理科的标签,仿佛他们之间没有交集似的。这样做的最大问题在我看来是一方天然地觉得另一方的知识对自己没价值,以至于形成了类似"写作是文科生的菜"、"编程是理科才要学的东西"等谬误。就我的观察,计算机科班出身的同学,往往文字表达能力不够强,可能多少和这种心理暗示有关。如此明显的短板,如果能够引起广大程序员群体的重视,肯在写作上持续投入,效果一定是惊人的。

posted @ 2011-08-03 23:49 laogao 阅读(2074) | 评论 (1)编辑 收藏

今天远程支持同事在Windows环境调优Apache服务器性能,记录在此,供需要的朋友参考。

Java EE应用,同时部署在两个Tomcat(5.5.27)实例上,前面放了个Apache(httpd-2.2.19-win32-x86-no_ssl),通过mod_jk(1.2.32)做负载均衡,同一台物理服务器,操作系统为64位的Windows Server 2003 SP2。现象是60+客户端,平均每个客户端每秒请求数2次,单个请求正常响应时间在500ms以内,即每秒冲进来120个请求,并发量最多在60上下,Apache就已不堪"重"负,静态资源响应时间都超过10s,同时Tomcat和数据库服务器均正常。凭我的经验,同样的压力直接压到Tomcat也不至于这么难看。看来问题出在Apache。

首先修改httpd.conf配置文件,打开status模块:

LoadModule status_module modules/mod_status.so
<Location /status>
  SetHandler server-status
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1 #需要的话也可放开为all
</Location>

这样我们就能通过/status页面查看服务器当前的状态信息,结果观察到worker(即线程)数仅为64!坑爹啊!难怪撑不住。我记得以前Windows下面的Apache默认线程数没这么小的。找准问题,接下来就好办了:

<IfModule mpm_winnt.c>
  ThreadsPerChild 300
  MaxRequestsPerChild 0
</IfModule>

稍微解释一下:mpm_winnt.c是Apache为Windows NT提供的MPM (Multi-Processing Module),对应到Linux环境下,则有prefork.c(多进程/每进程1个线程)和worker.c(多进程+多线程)两种MPM可选。Windows下面只会有父与子两个进程,因此单个子进程能同时起多少线程(ThreadsPerChild)就成了调优的关键。另一个参数MaxRequestsPerChild的含义是单个子进程累计最多处理到少个请求,超过该值则退出重启,这是出于防止内存泄露慢慢拖垮整个服务器而做的防御性措施,0表示不做此限制。

新配置上线后,客户端数量顺利冲上200+。Case closed.

posted @ 2011-08-02 21:04 laogao 阅读(4339) | 评论 (0)编辑 收藏