Vim 插件之: vim-surrounding

vim-surrounding 插件可以轻松的一次性修改成对出现的,比如 (), [], {}, 双引号,XML 标签等等。提供了

  • 增加
  • 删除
  • 修改

包围内容的方法。

首先放上链接

Installation

Plugin 'tpope/vim-surrounding'

Usage

用下面的例子做 demo

print("hello world")

光标定位在 hello world 包括引号,那么使用如下的命令可以实现双引号替换成单引号:

cs"'

change surrounding

Change surroundings is cs. 接受两个参数,目标,和替换内容

cs"'            # change " to '
cs"<q>          # change " to <q>
cs)]            # change ) to ]

如果要替换标签的内容,比如说将 h1 替换为 h2,则需要用到 t

<h1>Title</h1>

则需要 cst<h2>,同理要将 <h1> 替换成双引号,则 cst"

假如有一行内容

<h1>This is a title</h1>

cs 还有一个变种 cS,效果则是将变化的内容放到新行中。

add surrounding

给 hello 增加 <h2>

hello

那么可以使用 csw<h2>,简单记忆成 change surrounding of word <h2> ,给 word 增加 <h2> 标记

可以看到 cs 接受两个参数,会用后一个参数替换前一个。

delete surrounding

比如删除双引号,delete + surrounding + “

ds"             # delete surrounding "
ds(             # delete surrounding (
dst             # delete surrounding tags

dscs 都将 target 作为第一个参数,所有的 target (text-objects) 目前都是一个字符。

(), [], {}, <>
b, r, B, a 分别对应上面括号
', ", `
t 表示 HTML 或者 XML 标签
w, W, s 分别是 word, WORD, sentence
p 表示 paragraph

ys

给 hello 增加 <h2>

hello

使用更加复杂一点的 you surrounding inside word with <h2>

ysiw<h2>

ys 接受 vim motion 或者 text object 作为一个 object

如果要对整行操作可以使用 yss 后接修改的内容,比如给整行增加花括号

yssB

cS 一样,ys 也有变种版本 ySySS,会在新行添加内容,比如给 paragraph 添加双引号

ySS"

Visual mode

在选择模式下可以使用 S + 需要添加的内容,来看快速对选择的内容增加 surroundings。

比如我想要给下面这一行中的一部分内容,比如说 main title 增加一个 <h1> 标记。

This is the main title  sub title`

那么只需要将 This is the main title 选中 v,然后按下 S<h1>Enter 回车之后前后就加上了 h1 标签。

在单行选择模式下, surroundings 会添加在行中,在 blockwise 选择模式,每一行都会 surround。

a = testa
b = testb
c = testc

加入上面的三行内容,想要给后面的内容增加双引号,那么可以使用列选选择然后 S + " 就可以快速添加。

Conclusion

Normal mode
-----------
ds  - delete a surrounding
cs  - change a surrounding
ys  - add a surrounding
yS  - add a surrounding and place the surrounded text on a new line + indent it
yss - add a surrounding to the whole line
ySs - add a surrounding to the whole line, place it on a new line + indent it
ySS - same as ySs

Visual mode
-----------
s   - in visual mode, add a surrounding
S   - in visual mode, add a surrounding but place text on new line + indent it

2015-01-04 vim , vim-plugin , vim-surrounding , tpope

jhat 使用

jhat 是 Java 的堆分析工具(Java heap Analyzes Tool),在 JDK 6u7 之后成为 JDK 标配。

用法

jhat [options] heap-dump-file
  • options 参数
  • heap-dump-file 二进制 Java 堆文件,可以使用 jmap 导出

可选参数

-stack false|true

关闭对象分配调用栈跟踪 (tracking object allocation call stack)。 如果分配位置信息在堆转储中不可用,则必须将此标志设置为 false. 默认值为 true.

-refs false|true

关闭对象引用跟踪 (tracking of references to objects)。 默认值为 true. 默认情况下,返回的指针是指向其他特定对象的对象,如反向链接或输入引用 (referrers or incoming references), 会统计 / 计算堆中的所有对象。

-port port-number

设置 jhat HTTP server 的端口号。默认值 7000.

-exclude exclude-file

指定对象查询时需要排除的数据成员列表文件 (a file that lists data members that should be excluded from the reachable objects query)。 例如,如果文件列列出了 java.lang.String.value , 那么当从某个特定对象 Object o 计算可达的对象列表时,引用路径涉及 java.lang.String.value 的都会被排除。

-baseline exclude-file

指定一个基准堆转储 (baseline heap dump)。 在两个 heap dumps 中有相同 object ID 的对象会被标记为不是新的 (marked as not being new). 其他对象被标记为新的 (new). 在比较两个不同的堆转储时很有用。

-debug int

设置 debug 级别。0 表示不输出调试信息。 值越大则表示输出更详细的 debug 信息。

-J< flag >

因为 jhat 命令实际上会启动一个 JVM 来执行,通过 -J 可以在启动 JVM 时传入一些启动参数。例如,-J-Xmx512m 则指定运行 jhat 的 Java 虚拟机使用的最大堆内存为 512 MB. 如果需要使用多个 JVM 启动参数,则传入多个 -Jxxxxxx.

实例

使用如下命令获取二进制堆转储文件

jmap -dump:format=b,file=heap-dump.phrof pid

然后使用

jhat -J-Xmx1024m heap-dump.phrof

来查看和分析堆信息,然后访问本地 7000 端口即可。

jhat 中可以使用 OQL(对象查询语言)来查询,这个 OQL 也是非常庞大,如果要展开说就很多了,这里举一个例子,比如要查找字符串对象中,保存了长度大于 100 的字符串可以使用

select s from java.lang.String s where s.count > 100

关于 OQL 更多的使用方法可以网上查询。

reference

  • map jhat

2015-01-03 java , jvm , jhat , heap , tool

jmap 命令使用

jdk 自带的命令用来 dump heap info,或者查看 ClassLoader info,等等。

命令格式

jmap [OPTION] PID

使用实例

不加任何参数

命令

jmap pid

查看 pid 内存信息。

查看堆信息

jmap -heap pid

查看堆对象信息

统计对象 count ,live 表示在使用

jamp -histo pid
jmap -histo:live pid

查看 classLoader

jmap -clstats pid

生成堆快照

jmap -dump:format=b,file=heapdump.phrof pid

hprof 二进制格式转储 Java 堆到指定 filename 的文件中,live 选项将堆中活动的对象转存。

执行的过程中为了保证 dump 的信息是可靠的,所以会暂停应用, 线上系统慎用

文件可以用 jhat 分析。

错误

在运行 jmap 的时候可能遇到如下错误:

Attaching to process ID 18078, please wait...
Error attaching to process: sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 25.131-b11. Target VM is 25.152-b38
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 25.131-b11. Target VM is 25.152-b38
    at sun.jvm.hotspot.HotSpotAgent.setupVM(HotSpotAgent.java:435)
    at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:305)
    at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)
    at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
    at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
    at sun.jvm.hotspot.tools.PMap.main(PMap.java:72)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.tools.jmap.JMap.runTool(JMap.java:201)
    at sun.tools.jmap.JMap.main(JMap.java:130)

解决办法就是保证 jmap 的版本 也就是 JDK 的版本和运行的 JVM 的版本,也就是 JRE 的版本一致。

我使用 Java VisualVM GUI 来查看当前进程使用的 Java 版本,或者直接 ps 查看进程,然后再使用对应的 jmap 的版本。

要保证 jmap 运行的版本和运行的 java 进程程序使用同一个的 JRE(JDK) 的方法就是在 Linux 下使用

sudo update-alternatives --config java

来配置保证使用相同的 Java 程序。

reference


2015-01-02 jmap , jstack , jdk , jvm , java

网件 WNDR3800 刷机

进入 U-boot

路由先断电,然后按住复位键或者 WPS 键开机,保持 10S 钟左右,然后用网线连接 LAN 口和电脑,打开浏览器进 192.168.1.1,就可以进入 U-boot 控制台,进去刷写固件

操作路径 :固件更新 -> 固件 -> 选择固件文件 -> 上传 -> 更新,刷完后机器会自动重启。

固件

自行编译

或者下载他人编译好的固件。


2014-11-25 openwrt , wndr3800 , router , linux , tutorial

继续折腾 WNDR3800 之 shadowsocks

之前 也说过在 Openwrt 下使用迅雷远程下载,现在因为不想在 PC 端总是开着一个 shadowsocks 的程序,所以将 shadowsocks 安装到路由器端。然后还顺带解决一下 DNS 污染,和流量智能转发。

Shadowsocks

下载 编译好的 ipk

opkg update
opkg install libpolarssl
opkg install shadowsocks-libev_1.5.1_ar71xx.ipk

shadowsocks 安装后有三个命令,ss-local 启动 sock5 代理,ss-redir 启动透明代理,ss-tunnel 启动隧道。这里使用了 ss-local 和 ss-redir

# 编辑 vim /etc/shadowsocks.json
{
    "server":"『服务器 ipv4/ipv6 地址』",
    "server_port":8388, #服务器端口
    "local_port":1081, #本地 sock5 代理端口
    "password":"『密码』",
    "timeout":300,
    "method":"『加密方式』"
}

修改配置文件/etc/init.d/shadowsocks

START=95
SERVICE_USE_PID=1
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1
CONFIG=/etc/shadowsocks.json
start() {
    service_start /usr/bin/ss-local -c $CONFIG
	service_start /usr/bin/ss-redir -c $CONFIG
}
stop() {
    service_stop /usr/bin/ss-local
	service_stop /usr/bin/ss-redir
}

添加执行权限,设置开机启动

chmod +x /etc/init.d/shadowsocks
/etc/init.d/shadowsocks enable

pdnsd

opkg update
opkg install pdnsd

配置/etc/init.d/pdnsd.conf

global {
    #debug = on;
    perm_cache=1024;
    cache_dir="/var/pdnsd";
    run_as="nobody";
    server_port = 1053;   #使用 1053 作为 DNS 端口,默认是 53,一定要修改否则会跟默认 dnsmasq 冲突
    server_ip = 127.0.0.1;
    status_ctl = on;
    query_method=tcp_only;#最重要的配置,只使用 tcp 查询上级 DNS
    min_ttl=15m;
    max_ttl=1w;
    timeout=10;
}
server {
    label= "googledns"; #这个 label 随便写
    ip = 8.8.8.8;    #这里为上级 dns 的 ip 地址,要求必须支持 TCP 查询,相关说明见后文注解
    root_server = on;
    uptest = none;   #不去检测 dns 是否无效。
}

启用 pdnsd,并设置为开机启动:

/etc/init.d/pdnsd enable
/etc/init.d/pdnsd restart

完成!

dnsmasq 和 ipset

openwrt 默认安装的 dnsmasq 不支持 ipset,需要先卸载,换成 dnsmasq-full,输入一下命令查看 dnsmasq 版本,写着 no ipset 的就需要安装完整版。

dnsmasq -v

运行以下命令:

opkg update
opkg install kmod-ipt-ipset ipset ipset-dns
opkg remove dnsmasq
opkg install dnsmasq-full

dnsmasq-full 从这里 下载,设置 dnsmasq 对特定域名使用本地的 pdnsd 进行解析: 为了保持配置文件整洁,建议在 /etc/dnsmasq.conf 最后加入:

conf-dir=/etc/dnsmasq.d

然后新建 mkdir 目录 /etc/dnsmasq.d ,在里面加入一个 conf,名字任选。譬如 /etc/dnsmasq.d/fuckgfw.conf , 下面是我的文件内容,你可以按自己需要整理自己的:

#Google and Youtube
server=/.google.com/127.0.0.1#1053
server=/.google.com.hk/127.0.0.1#1053
server=/.gstatic.com/127.0.0.1#1053
server=/.ggpht.com/127.0.0.1#1053
server=/.googleusercontent.com/127.0.0.1#1053
server=/.appspot.com/127.0.0.1#1053
server=/.googlecode.com/127.0.0.1#1053
server=/.googleapis.com/127.0.0.1#1053
server=/.gmail.com/127.0.0.1#1053
server=/.google-analytics.com/127.0.0.1#1053
server=/.youtube.com/127.0.0.1#1053
server=/.googlevideo.com/127.0.0.1#1053
server=/.youtube-nocookie.com/127.0.0.1#1053
server=/.ytimg.com/127.0.0.1#1053
server=/.blogspot.com/127.0.0.1#1053
server=/.blogger.com/127.0.0.1#1053

#FaceBook
server=/.facebook.com/127.0.0.1#1053
server=/.thefacebook.com/127.0.0.1#1053
server=/.facebook.net/127.0.0.1#1053
server=/.fbcdn.net/127.0.0.1#1053
server=/.akamaihd.net/127.0.0.1#1053

#Twitter
server=/.twitter.com/127.0.0.1#1053
server=/.t.co/127.0.0.1#1053
server=/.bitly.com/127.0.0.1#1053
server=/.twimg.com/127.0.0.1#1053
server=/.tinypic.com/127.0.0.1#1053
server=/.yfrog.com/127.0.0.1#1053

#Google and Youtube
ipset=/.google.com/setmefree
ipset=/.google.com.hk/setmefree
ipset=/.gstatic.com/setmefree
ipset=/.ggpht.com/setmefree
ipset=/.googleusercontent.com/setmefree
ipset=/.appspot.com/setmefree
ipset=/.googlecode.com/setmefree
ipset=/.googleapis.com/setmefree
ipset=/.gmail.com/setmefree
ipset=/.google-analytics.com/setmefree
ipset=/.youtube.com/setmefree
ipset=/.googlevideo.com/setmefree
ipset=/.youtube-nocookie.com/setmefree
ipset=/.ytimg.com/setmefree
ipset=/.blogspot.com/setmefree
ipset=/.blogger.com/setmefree

#FaceBook
ipset=/.facebook.com/setmefree
ipset=/.thefacebook.com/setmefree
ipset=/.facebook.net/setmefree
ipset=/.fbcdn.net/setmefree
ipset=/.akamaihd.net/setmefree

#Twitter
ipset=/.twitter.com/setmefree
ipset=/.t.co/setmefree
ipset=/.bitly.com/setmefree
ipset=/.twimg.com/setmefree
ipset=/.tinypic.com/setmefree
ipset=/.yfrog.com/setmefree

#Dropbox
ipset=/.dropbox.com/setmefree

#1024
ipset=/.t66y.com/setmefree

#shadowsocks.org
ipset=/.shadowsocks.org/setmefree

#btdigg
ipset=/.btdigg.org/setmefree

#sf.net
ipset=/.sourceforge.net/setmefree

#feedly
ipset=/.feedly.com/setmefree

按照这种格式指定特定的域名走代理。 server=/google.com/127.0.0.1#1053的含义是 google.com 通过本地 1053 端口解析地址 ipset=/google.com/setmefree 的含义给 google.com 的数据包打上标记,一会配置iptables时会用到 接下来配置iptables,在/etc/firewall.user里加上两行

ipset -N setmefree iphash
iptables -t nat -A PREROUTING -p tcp -m set --match-set setmefree dst -j REDIRECT --to-port 1081

每条记录都需要跟一条 ipset 设置,不要忘了。作用是把打上了标记的数据包重定向到 ss-redir 的透明代理端口

root@OpenWrt:~# cd /usr/bin
touch shadowsocks-firewall
vi shadowsocks-firewall

修改文件内容

#!/bin/sh

#create a new chain named SHADOWSOCKS
iptables -t nat -N SHADOWSOCKS

# Ignore your shadowsocks server's addresses
# It's very IMPORTANT, just be careful.
iptables -t nat -A SHADOWSOCKS -d YOUR-SERVERS-IP-ADDRESS -j RETURN

# Ignore LANs IP address
iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN

# Ignore Asia IP address
iptables -t nat -A SHADOWSOCKS -d 1.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 14.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 27.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 36.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 39.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 42.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 49.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 58.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 59.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 60.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 61.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 101.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 103.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 106.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 110.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 111.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 112.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 113.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 114.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 115.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 116.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 117.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 118.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 119.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 120.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 121.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 122.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 123.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 124.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 125.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 126.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 169.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 175.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 180.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 182.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 183.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 202.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 203.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 210.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 211.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 218.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 219.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 220.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 221.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 222.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 223.0.0.0/8 -j RETURN

# Anything else should be redirected to shadowsocks's local port
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 1081

# Apply the rules
iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS

解释 iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 8024 这里的 8024 必须和 OpenWrt 路由器 /etc/shadowsocks.json里的 local_port 一样,也就是说,如果 /etc/shadowsocks.json"local_port":1081, 那这里的 8024 也要改成 1081(如果照着我上面的本地端口填了 8080,这里就改成 8080)

配置成功后,chmod +x shadowsocks-firewall给其运行权限。

运行

 /usr/bin/shadowsocks-firewall

重启 dnsmasq 和 firewall 就可以实现流量自动分流了

/etc/init.d/dnsmasq restart
/etc/init.d/firewall restart

以后只要修改dnsmasq的配置文件就可以指定更多的地址走代理

可选方案 解决 dns 污染

这里比较方便的是,通过 ChinaDNS 就可以了。

和安装 ShadowSocks 一样,可以先通过 WinSCP 上传到路由器。

opkg install ChinaDNS-C_1.0.0_ar71xx.ipk  # 安装
/etc/init.d/chinadns start                # 运行
/etc/init.d/chinadns enable               # 开机启动

reference

  1. http://hong.im/2014/07/08/use-ipset-with-shadowsocks-on-openwrt/
  2. http://www.jianshu.com/p/4800eec60516
  3. http://blog.berry10086.com/Tech/Openwrt/openwrt-shadowsocks-ipset/
  4. http://www.shuyz.com/install-shadowsocks-on-hg255d-openwrt-and-config-nat.html
  5. http://hong.im/2014/03/16/configure-an-openwrt-based-router-to-use-shadowsocks-and-redirect-foreign-traffic/

2014-11-24 shadowsocks , openwrt , knowledge , shadowsocks-libev

Play Clash of Clans

玩部落冲突(Clash of Clans)也已经四个多月了,这是我第一个花钱在上面的游戏,不过最近因为给别人看COC乱点花了我1200左右的钻石,顿时玩下去的信心都没有了,既然没有动力了,就来总结一下吧,就当是个结束。

很早知道这个游戏,看到很多人玩,包括很多身边的同学。但是机缘巧合有一好友也开始玩,就带着我一起开始玩了,于是从暑假开始,到今天11/5,差不多正好4个月时间,除了魔兽争霸这个游戏,还真没有一个游戏能让我坚持玩这么长时间的。什么吸引我呢?这个游戏依靠策略,攻打的策略,守家的策略,让人欲罢不能。另外就是好友及部落机制。再次就是不想偷菜种菜那么没有头脑,收集金币及圣水都是需要一定的技巧。虽然被人乱点坑了很多金币,并且不得不赞扬游戏公司对游戏参数的设置,让人无比的想花钱,并且会让人觉得花的很值得。

Clash of Clans 8本阵型

Clash of Clans

Clash of Clans 双菱形

##一些网站 YouTube Channal https://www.youtube.com/channel/UCxNMYToYIBPYV829BJcmUQg 这个频道从低等级开始,一步一步升级,单人模式,攻击策略,防御策略很全面,可以关注。

之前几个布阵的网站都是直接从Google点进去的,根本记不住网址,所以用Google喽搜喽。

##关于钻石 关于钻石,网上很多说免费的钻石的,千万别信,基本都是假的,稍微真的就是去赚礼品卡的钱,然后用礼品卡买钻石。游戏中成就和清理地面的灌木石块等等都能获取一定的钻石,所以省着点用很快能够买到第三个农民500钻,等第四个农民1000钻其实也应该很快,如果不出意外2000钻的第五个农民我马上也能有了,只是。。。。

最后有一点,我在升级过程中吃了很多苦头,就是千万不要着急升级大本营,COC匹配对手有一定的算法,当时也Google了,会根据一定的算法,等级越高越不好打,所以最好在每一个大本营造完全不建筑并且升级到最高等级不能升级再升大本营。

##一些技巧

  • 搜寻对手时可以多搜寻一些,直到找到一个资源丰富的
  • 搜寻对手时注意观察阵型及金矿圣水收集器的位置,如果在外围可以轻松拿下。
  • 单人模式一定要留到升级完气球之后,一个气球搞定

参考:


2014-11-23 游戏 , Game , ClashOfClans

推荐网站之求字体:通过图片找字体

推荐网站之求字体:通过图片找到对应字体。

求字体 http://www.qiuziti.com/

最早遇到这个问题是我当时看陈墨评金庸系列书籍的时候封面上很漂亮的字体,下图中很大篇幅的小字。

赏析金庸

当时我还没遇见这个求字体网站,我是直接在百度知道问的别人,正好还有人知道,当时就记住了这个字体—-超世纪粗行书。 今天看到别人在摄影上加上了很好看的Logo,不禁想知道中文的字体,于是找到了这个网站。使用体验都很好,因而推荐出来。

找字体


2014-11-22 fonts , website , 推荐网站

Rime 输入法配置记录

Rime ime 是中州韻輸入法引擎 (Rime Input Method Engine),项目网址如下

按照官网给出的定义:Rime 不是一种输入法,是从各种常见键盘输入法中提炼出来的抽象的输入算法框架,Rime 涵盖了大多数输入法的共性,所以在不同设定下,Rime 可化身为不同的输入法用来打字。Rime 是跨平台的输入法软件,Rime 输入方案可通用于以下发行版:

  • 【中州韻】 fcitx-rime → Linux
  • 【小狼毫】 Weasel → Windows
  • 【鼠鬚管】 Squirrel → Mac OS X

很多东西看官方的 wiki 就能看明白,希望在你继续看下去之前,先看完下面几个网址:

相信如果你看完了官方的文档应该对 Rime 的安装和配置有了一定的了解,相信你在看得过程中也已经把 Rime 对应的版本安装上了,不同发行版的配置目录不同,通过 yaml 文件来配置,本文就在官方文档的基础上调整了一些配置来适应我的习惯。你不一定要完全按照我的配置来,不过我相信读完这篇文章,你一定能够随心配置出适合你自己输入习惯的 Rime。

安装

关于安装本来不想多说什么,基本上都是非常简单的,但是在 Linux 上的一些使用经验告诉我,Linux 发行版上的 Rime,fcitx-rime 要比 ibus 版本的要好用,虽然官方建议的是 ibus 版本,但是我还是建议你使用一下 fcitx 版本的,并且结合 fcitx 的扩展会开启一个新的世界,比如自带粘贴版历史,自带日韩语输入,这一切会让输入体验上升一个高度。

sudo apt install -y fcitx fcitx-rime

更多发行版见官网

几个输入法

在初了解 Rime 的时候经常会被 Rime 中的几个输入方案的名字搞混,其实这三个方案 朙月拼音,以及该方案的简体字版本,语句流版本都是同一个方案,不过在体验上略有差别,「语句流」风格的输入方案,在空格确认后,字词并不立即上屏,而是在输入句末的标点或者按下回车时整个句子才上屏。

配置文件

安装完之后, fcitx-rime 的大部分的配置文件在 ~/.config/fcitx/rime 下,如果是 ibus 版本,将对应的 fcitx 替换成 ibus 即是配置地址,如果打开该目录能看到一系列默认配置:

  • default.yaml: 全局配置
  • weasel.yaml : 发行版配置,比如 Windows 下就是 weasel
  • installation.yaml: 安装信息,其中包括了输入法数据备份的选项
  • *.schema.yaml: 各输入方案的配置文件,一般认为 schema 前的是输入方案的名字,一个输入方案可能对应多个字典
  • user.yaml: 用户状态

用户自定义:

  • *.dict.yaml : 用户字典
  • *.custom.yaml: 用户对 default.yaml, *.schema.yaml 等配置文件进行修改的配置文件

修改 Rime 配置文件并使之生效的方法很简单,保存文件,在 Rime 菜单中点击部署,就可以立即看到效果。Rime 建议使用 *.custom.yaml 的方式来自定义配置,因为 Rime 升级时会覆盖 Rime 自己的默认配置文件。

如果配置了同步目录,那么在同步目录能看到

  • *.userdb.txt : Rime 记录用户输入习惯的目录,分别记录了该输入方案下用户输入的历史纪录,备份级别:重要,具体文件内容解析可以参考后文
  • UUID/ : 用户配置同步目录

虽然现在很多手机上的输入法支持双语输入,但是桌面版的输入法除了搜狗,其他真的做的不行,但是 Rime 支持很多种双语切换时的处理方式。比如某些情况下一直在输入中文,但是中间要输入英文,通常的做法就是按下 Shift 来快速切换到英文模式,那么已经输入的内容怎么处理,Rime 可以选择:

  • inline_ascii: 在输入法的临时英文编辑区内输入字母、数字、符号、空格等,回车上屏后自动复位到中文
  • commit_text: 已输入的候选文字上屏并切换至西文输入模式
  • commit_code: 已输入的编码字符上屏并切换至西文输入模式
  • clear: 丢弃已输入的内容并切换至西文输入模式
  • noop: 屏蔽该切换键

具体设置如下:

ascii_composer:
  good_old_caps_lock: true
  switch_key:
    Caps_Lock: noop
    Eisu_toggle: clear
    Shift_L: commit_code
    Shift_R: commit_text
    Control_L: commit_text
    Control_R: noop

在设置自定义键的时候左右 Shift 和 fcitx 的快捷键有冲突。fcitx 设置中 额外的激活输入法快捷键双侧 Shift 改掉或者禁用。

对于左 Shift 是将候选词上屏,Enter 则是将输入的内容原封不动上屏,和我之前的习惯保持一致。

扩展词库

要扩展 Rime 的词库,就必须要先知道 Rime 中词库的分类,Rime 中词库有两大类,一类是 *.dict.yaml 文件编译后生成的 *.table.bin 文件,这一类被称为固态词典,另一大类是用户输入习惯词典,一般保存在 *.userdb 文件夹中。固态词典不会随着用户的输入发生变化,可以通过更改 dict.yaml 文件,然后重新部署生效,而用户词典则会随着用户的输入发生变化,从而影响候选词的位置。用户词库会在同步时合并到 *.userdb.txt 文件中,同步到配置的同步文件夹中,从而做到跨设备的同步。

Rime 自带的联想词库有其自身的局限,但是 Rime 可以支持扩展词典,在 Rime 配置目录下新建 *.dict.yaml 这样的文件:

luna_pinyin.mywords.dict.yaml

在文件中输入

# Rime dictionary
# encoding: utf-8

---
name: luna_pinyin.mywords
version: "2019.08.23"
sort: by_weight
use_preset_vocabulary: true
# 從 luna_pinyin.dict.yaml 導入包含單字的碼表
import_tables:
  - luna_pinyin
...

# table begins

# 自定義的詞條
中州韵	zhong zhou yun	1
小狼毫	xiao lang hao
自动注音的词

这里需要注意的是 Rime 的码表,是 Tab 分割的三列,分别是文字、编码、使用频次,编码的定义以音节加空格分割。在制作自己的码表时一定要注意使用 Tab 分割。

编辑文件 luna_pinyin.custom.yaml

patch:
  translator/dictionary: luna_pinyin.mywords

部署,就可以快速导入到 Rime 中。

部署之后尝试输入词库中任意一个比较复杂的词,理论上应该看到正确的词出现,否则可能词库未加载成功,那么需要到 /tmp/rime* 目录下查看 ERROR 日志。

关于如何制作自己的词库,后来我又写了一篇文章,可以参考这里

同步配置

installation.yaml 文件中配置:

 sync_dic: "/path/to/rsync"
 installation_id: "mint-config"

然后点击 Rime 图标,部署,同步,这样用户配置和词库都会在配置的同步路径中。如果不修改 installation.yaml 配置,那么 Rime 默认会生成一个 UUID 的目录来存放同步文件

如果更换了电脑,将同步文件同步下来,然后配置 installation.yaml ,执行部署,同步,部署,然后配置、用户词库都可以了。

不同电脑之间的同步内容会以 installation_id 为名生成一个文件夹,文件的配置不会相互互通,但是用户字典是会同步的。

简单地来描述 Rime 的同步机制就是,不同电脑都会在同步目录中新建一个自己的 UUID 或者指定名字的目录,该目录下会保存所有自定义的修改,包括用户输入习惯的字典 *.userdb.txt .

在点击同步时,Rime 会,会把同步目录中其他的 userdb.txt 合并:

sync/*/*.userdb.txt = 合并到 => 本地 *.userdb = 导出为 => sync/<installation_id>/*.userdb.txt`
其他电脑 = 複製來或從網盤同步下載 => sync/<installation_id>/ = 本地同步 => sync/<installation_id>/ = 複製走或同步上傳到網盤 => 其他电脑同步

也就不需要手动去合并字典,只需要在合适的时机同步一下目录即可。Rime 会自动处理 userdb.txt 的合并问题。

不过需要注意的是 Rime 虽然会将自定义配置及词库同步到目录,但这只是一个单向的同步,其他机器依然需要手动处理自定义配置及词库。

userdb.txt 文件格式解析

在同步后可以在同步目录观察到 *.userdb.txt 每一种输入方案都会对应一个这样的文件,其中保存的是用户的输入历史,打开文件看很容易可以猜测到每一行中的含义:

# Rime user dictionary
#@/db_name	luna_pinyin.userdb
#@/db_type	userdb
#@/rime_version	1.2.9
#@/tick	425369
#@/user_id	mint-config
a 	吖	c=14 d=4.71446e-09 t=425369
a 	呵	c=1 d=6.28595e-10 t=425369
a 	啊	c=8781 d=3.80755 t=425369

解释:

  • c 输入法 commit 的次数 1,这个数可能因为输入时删除掉前面的词而减少,或者如果用户手动 shift+delete 删除掉候选词也会 reset 成 0
  • d 权重,结合时间,综合计算一个权重,随着时间推移,d 权重会衰减
  • t 时间,记录该候选词最近一次的时间

特殊配置

Rime 有一些默认设置,比如上下键选词,但是很少人打字的时候会把手移动到上下键去选词。

这里记录一下我自己的一些适配,用以调整我的习惯。

在修改 Rime 配置是,可以打开 Rime 的日志,对于我使用 fcitx-rime ,那么对应的日志在

/tmp/rime.fcitx-rime.*

一般有 ERROR,WARNING, INFO 三个文件。每一次部署时最好同时开着文件观察错误情况。

每一页候选词数量

~/.config/fcitx/rime 配置目录下,vi default.custom.yaml

patch:
  schema_list:
    - schema: luna_pinyin
    - schema: luna_pinyin_simp
    - schema: luna_pinyin_fluency
  menu:
    page_size: 6

切换简体繁体

Rime 自带繁简切换,菜单中就可以设置。

切换全角半角

Rime 自带

模糊音配置

https://gist.github.com/2320943 作为模板保存到 luna_pinyin_simp.custom.yamlluna_pinyin_tw.custom.yamlluna_pinyin_fluency.custom.yaml即可。

对于模糊音设置,官网有介绍 luna_pinyin 的实现方式

对于我,这条加上还是很有必要的

  • ining

参考链接

中英文混输

配置英文字典,自定义名叫 english 的 translator,然后把这个 translator 添加到数据方案中。

# 加載 easy_en 依賴
"schema/dependencies/@next": easy_en
# 載入翻譯英文的碼表翻譯器,取名爲 english
"engine/translators/@next": table_translator@english
# english 翻譯器的設定項
english:
  dictionary: easy_en
  spelling_hints: 9
  enable_completion: true
  enable_sentence: false
  initial_quality: -3

rime 相关命令

安装完 Rime 后,会安装 /usr/bin/rime_dict_manager 工具和 /usr/bin/rime_deployer 工具。

在运行这两个工具前需要关闭正在使用的 Rime 输入法,否则会占用需要的文件,而出现错误:

E0114 17:38:47.016017  9869 level_db.cc:291] Error opening db 'luna_pinyin.userdb' read-only.

rime_dict_manager

管理工具,在 fcitx 的配置目录 ~/.config/fcitx/rime/ 下运行

rime_dict_manager -l

会列出当前输入法配置方案。

导出词典

rime_dict_manager -e luna_pinyin export.txt

完整参数:

➜ /usr/bin/rime_dict_manager
options:
		-l|--list
		-s|--sync
		-b|--backup dict_name
		-r|--restore xxx.userdb.txt
		-e|--export dict_name export.txt
		-i|--import dict_name import.txt

rime_deployer

看名字就知道 rime_deployer 是用来管理 Rime 部署相关操作的。

完整参数:

➜ /usr/bin/rime_deployer
options:
		--build [dest_dir [shared_data_dir]]
		--add-schema schema_id [...]
		--set-active-schema schema_id
		--compile x.schema.yaml [dest_dir [shared_data_dir]]

皮肤

自动生成主题皮肤

material 质感的主题,很好看

fcitx 官方制作

配置管理工具

Linux 终端配置 Rime 工具

OS X:

总结

到这里,就会发现 Rime 已经能够满足日场的需求,我用全拼,培养一段时间之后词库也很满足我的需求了。而到搜狗官网去看其介绍,细胞词库,云端输入,自动纠错,多彩皮肤,长词联想,网址输入,大部分的功能 Rime 都能做到,并且没有隐私问题,数据完全掌握在自己手里何乐而不为。

历史内容

之前一直使用 Google 拼音输入法,Google 拼音输入法能够导出一套用户长期积累的词库。我利用“深蓝词库转换“工具将 Google 拼音输入法导出的词库,大概 7 万多条转成 Rime 词库格式。然后开始菜单调出,小狼毫用户词典管理,选中 luna_pinying,点击“导入文本码表”导入词库。瞬间就可以从 Google 拼音输入法转移到 Rime 输入法。导入文本码表只是针对 Google 拼音输入法中由用户积累的词汇。一般只建议将最为关键,带有词频信息的词库使用“导入文本码表”的方法导入到 Rime 输入法。

关于词库,Rime 输入法的词库有两部分组成。以下摘自贴吧:

  • 一部分是由系统文本词库(一般以 xxx.dict.yaml 结尾)通过「重新部署 /deploy」生成的固态词典(一般以 xxx.table.bin 结尾),这部份词库因为在输入过程是固定不変的,所以存在用大量的词彚,也不允许用戸来直接删除。
  • 另一部分就是记录我们用戸输入习惯的用戸词典(一般以 xxx.userdb.kct)结尾。这部份词库的词彚,正常情况下是由用戸输入的时候随时生成的;其词彚可以动态调整,数量理论上来说不会特别多,也允许用戸自行删除(shift+delete)。

佛振同学在设计用户词典时,没有考虑到有导入大词库的需求,就按照估计用戸可能积累起来的词彚量,把容量设置为「十万」规模以提升存储效率,超过这个量性能则会下降。

佛振同学设计「【小狼毫】用戸词典管理」的初衷和真正目的,在於譲大家将自己従其他输入法中积累出来的用戸词彚,可以顺利地迁移到 rime 中。而不是譲你把其他输入法整个系统词库都搬进来。如今,「【小狼毫】用戸词典管理」这个功能和界面,已经被众多的小白同学稀里糊涂地滥用了。

如何正确的导入词库?答:新增固态词典引用多份码表文件

批量添加词汇,过去一直没有简易的做法。现在可以这样做:以【朙月拼音】为例,在输入方案裏指定一个新的词典名为 luna_pinyin.extended.dict.yaml

#luna_pinyin.custom.yaml
patch:
translator/dictionary: luna_pinyin.extended

然后在用户目录创建一个词典文件 luna_pinyin.extended.dict.yaml

#Rime dictionary
---
name: luna_pinyin.extended
version: "2013.04.22"
sort: by_weight
use_preset_vocabulary: true
import_tables:
  - luna_pinyin
...
# table begins
鸹鸹! gua gua 100

这样一来,部署【朙月拼音】这个输入方案时,将编译 luna_pinyin.extended 这部词典,而这部词典除了导入【八股文】词汇表之外,还导入了名为 luna_pinyin 的词典文件,即 luna_pinyin.dict.yaml 。被导入的词典文件只取其码表,忽略 YAML 段。

被导入的码表与本词典自带的码表共同决定了编码集合。当然也可以:本文件的码表完全为空,只用来按需合并多个外部码表文件。

luna_pinyin.extended 这个词典的神奇之处是:虽然luna_pinyin.schema.yaml 已设置为加载名为 luna_pinyin.extended 的词典,但配套的用户词典名却是「luna_pinyin」,即 Rime 自动取句点之前的部分为用户词典名,以保证按以上方法增补了词汇之后,不至於因为改变词典名而抛弃原有的用户词典。

请注意,此法的设计用途是合并编码方案相同的多份词典文件,而不是用来将不同的编码混在一起。

具体的示例代码可参考 https://gist.github.com/lotem/5443073

其中心思想提炼出来就是

  1. 先譲输入方案引用一个新的系统词库码表(佛振同学在 gist.github.com 上的示例中是 luna_pinyin.kunki.dict.yaml),即给输入方案luna_pinyin(明月拼音)打一个补靪,将调用的词库重置为luna_pinyin.kunki.dict.yaml
  2. 创建一个luna_pinyin.kunki.dict.yaml 的文件,加入好你需要导入的词彚(如「瑾昀」等等)。竝导入内置的系统词库(import_tables: luna_pinyin)。

其実佛振同学import_tables的这个做法,頪似於 C 语言编程中的#include 头文件。其目的和工作机制都是一様的。目的是引用头文件(或是系统预设词库)竝添加上自己的内容;工作机制是在编译(或是重新部署的时候),将链接到的不同的文本文件合并成一个文件,竝処理成二进制文件。

我另外要在佛振同学的基础上补充几点

  1. luna_pinyin.custom.yamlluna_pinyin.extended.dict.yaml都要放入用戸文件夹中
  2. 通过import_tables的方法,不仅仅可以导入预设的词典,甚至可以导入其他的自定义词典

以笔者为例子,我在朙月拼音输入方案中设定的词库名叫 luna_pinyin.extended.dict.yaml

而我 luna_pinyin.extended.dict.yaml 在文件头部分,除了系统预设词库之外,还导入了其他的细胞词库

import_tables:
  - luna_pinyin
  - luna_pinyin.extra_hanzi
  - luna_pinyin.sgmain
  - luna_pinyin.chat
  - luna_pinyin.net
  - luna_pinyin.user
  - luna_pinyin.cn_en
  - luna_pinyin.website
  - luna_pinyin.computer
  - luna_pinyin.place
  - luna_pinyin.shopping
  - luna_pinyin.sougou
  - luna_pinyin.kaomoji
  - mywords
  1. 码表中的词彚格式

    3.1 码表文件必须是 utf-8 无 bom 的编码。不能用 ansi,否则出来的词彚会乱码 3.2 Rime 对词彚的格式有着厳格的限定,其标凖形式是「词彚<tab>ci hui<tab>100」(方引号内部的部分,<tab>表示制表符(顕示为空白字符,不是空格))。

拼音码表的词彚格式是一个词彚占一行,不同的属性之间以制表符为间隔,编码之间以半角空格为间隔。従左往右依次是词彚、编码、词频。其中编码和词频是可省略的。也就是说

词彚<tab>ci hui」、「词彚<tab><tab>100」、「词彚

都是合法词库文件格式。

如果词频省略,那麼输入法会优先调用「八股文」(一个预设的中文语言模型,包含词彚和词频两穜属性)的词频,如果八股文找不到该词彚的词频,那麼这个词彚的词频就当成 0 来処理。

如果编码省略,那麼输入法在重新部署,将文本码表生成固态词典的时候,会根据词库中的单字来给词彚自动编码(如果是拼音的话,叫「给词彚注音」更妥帖) 比如词库中有

我<tab>wo
和<tab>he
你<tab>ni
我和你

四个 item,那麼「我和你」这个省略了编码的词彚在生成固态词典的时候会自动被注音上「wo he ni」。其中有一个特别需要注意的地方,那就是処理多音字。对於含多音字的词彚,我们要侭量避免譲输入法给他自动注音,因为会帯来错误的读音(比如「重庆」读成「zhong qing」)所以一般含多音字的词彚都要最好标注上读音。如果实在没辧法弄到读音也没関系。因为 Rime 已经给多音字的罕见音做了降频処理。従而使得多音字的罕见音不会参与词彚的自动注音。

関於自动注音的具躰的细节可以看 rime 的 wiki,这裏我就不多说了。総而言之,我廃话那麼多,是为了譲大家了解 rime 词库的工作机制,其実就为了告诉大家两句话:「在导入词彚的时候,一般来说只要加纯汉字就够了。含多音字的词,系统词库一般都有,如果没有才要考虑给这个词注上音。」

另外,系统词库中,已经包含了完整的单字注音和罕用读音降频処理,大家可以放心地导入纯汉字词彚,不用太过担心。(所以一定给要记得import_tables: luna_pinyin,来使自定义码表获得系统词库中的单字注音、含多音字词彚注音以及系统词彚词频)

关於楼主配置的多个词库挂接的方法实例,可参考由 rime-aca 友情提供的「朙月拼音·扩充词库」

下载地址:https://bintray.com/rime-aca/dictionaries/luna_pinyin.dict

参考:

其他词库下载 搜狗词库 来源

小狼毫外观设定

# weasel.custom.yaml
patch:
  "style/font_face": "华文行楷"  # 字體名稱,從記事本等處的系統字體對話框裏能看到
  "style/font_point": 16     # 字號,只認數字的,不認「五號」、「小五」這樣的

  style/horizontal: true      # 候選橫排
  style/inline_preedit: true  # 內嵌編碼(僅支持 TSF)
  style/display_tray_icon: true  # 顯示托盤圖標

一些快捷键

  • ctrl+grave (grave) tab 键上面,1 左边的那个键用来切换 Rime 输入方案
  • shift+delete 删除选中候选词
  • ctrl+ n/p 上下选择候选词
  • Ctrl+b/f 类似于左箭头,右箭头,可以快速调整输入
  • Ctrl+a/e 贯标快速跳转到句首或者句末
  • Ctrl+d 删除
  • Ctrl+h 回退,删除
  • Ctrl+g 清空输入
  • Ctrl+k 删词,等效于 Shift + delete
  • -/+ 或者 tab 来翻页

更多的快捷键可以在 default.yaml 配置中看到。

一些问题

遇到 Rime 在 Deploy 字典时

Encode failure:

的问题,这些字典中的字符可能存在问题。

reference


2014-11-21 输入法 , rime , input-method , cjk , language , korean , japanese , chinese , squirrel , 小狼毫 , 中州韵 , 鼠须管

一系列计算机相关图书列表

代办事项中一直存在这样一个列表,一直没有完全吸收,这里先列着慢慢消化吧。不过大多数情况下都是直接豆瓣搜索看评价看了,也没有来得及维护这个列表,找个时间整理成豆列吧。

计算机系统与网络

  • 《图灵的秘密》
  • 《计算机系统概论》
  • 《深入理解 Linux 内核》
  • 《深入 Linux 内核架构》
  • 《TCP/IP 详解 卷 1:协议》
  • 《Linux 系统编程(第 2 版)》
  • 《Linux 内核设计与实现(第 3 版)》
  • 《深入理解计算机系统(原书第 2 版)》
  • 《计算机程序的构造和解释(原书第 2 版)》
  • 《鸟哥的 Linux 私房菜(基础学习篇 第三版)》
  • 《编码:隐匿在计算机软硬件背后的语言》
  • 《性能之颠:洞悉系统、企业与云计算》
  • 《UNIX 网络编程 卷 1:套接字联网 API(第 3 版)》
  • 《UNIX 网络编程 卷 2:进程间通信》
  • 《Windows 核心编程(第 5 版)》
  • 《WireShark 网络分析就这么简单》
  • 《WireShark 网络分析的艺术》

编程通用

  • 《编程原本》
  • 《代码大全》
  • 《UNIX 编程艺术》
  • 《代码整洁之道》
  • 《编程珠玑(续)》
  • 《编程珠玑(第 2 版)》
  • 《软件调试的艺术》
  • 《修改代码的艺术》
  • 《编程语言实现模式》
  • 《编写可读代码的艺术》
  • 《程序设计方法(中文版)》
  • 《解析极限编程:拥抱变化》
  • 《精通正则表达式(第 3 版)》
  • 《现代编译原理 : C 语言描述》
  • 《编译原理 : 原理、技术与工具》
  • 《重构:改善既有代码的设计》
  • 《七周七语言:理解多种编程范型》
  • 《调试九法:软硬件错误的排查之道》
  • 《程序设计语言:实践之路(第 3 版)》
  • 《计算的本质:深入剖析程序和计算机》
  • 《设计模式 : 可复用面向对象软件的基础》

算法与数据结构

  • 《算法(英文版 第 4 版)》
  • 《算法导论(原书第 2 版)》
  • 《Python 算法教程(第 2 版)》
  • 《算法设计与分析基础(第 3 版)》
  • 《学习 JavaScript 数据结构与算法》
  • 《数据结构与算法分析 : C++ 描述(第 3 版)》
  • 《数据结构与算法分析 : C 语言描述(第 2 版)》
  • 《数据结构与算法分析 : Java 语言描述(第 2 版)》

职业修炼与规划

  • 《大教堂与集市》
  • 《卓有成效的程序员》
  • 《程序员的职业素养》
  • 《程序员修炼之道:从小工到专家》
  • 《软件开发者路线图:从学徒到高手》
  • 《我编程,我快乐:程序员职业规划之道》
  • 《程序员的思维修炼:开发认知潜能的九堂课》
  • 《高效程序员的 45 个习惯:敏捷开发修炼之道(修订版)》

大师访谈

  • 《编程大师智慧》
  • 《编程大师访谈录》
  • 《编程人生 : 15 位软件先驱访谈录》
  • 《奇思妙想 : 15 位计算机天才及其重大发现》
  • 《图灵和 ACM 图灵奖(1966-2015 第五版) 纪念计算机诞生 70 周年》

架构 / 性能

  • 《微服务设计》
  • 《大数据日知录》
  • 《企业应用架构模式》
  • 《Web 性能权威指南》
  • 《SRE:Google 运维解密》
  • 《发布!软件的设计与部署》
  • 《高扩展性网站的 50 条原则》
  • 《大型网站技术架构:核心原理与案例分析》
  • 《恰如其分的软件架构:风险驱动的设计方法》
  • 《软件系统架构:使用视点和视角与利益相关者合作(第 2 版)》

Web 前端

  • 《高性能 JavaScript》
  • 《锋利的 jQuery(第 2 版)》
  • 《编写可维护的 JavaScript》
  • 《你不知道的 JavaScript(上)》
  • 《JavaScript 权威指南(第 6 版)》
  • 《JavaScript 语言精粹(修订版)》
  • 《JavaScript DOM 编程艺术 (第 2 版)》
  • 《JavaScript 高级程序设计(第 3 版)》
  • 《JavaScript 异步编程:设计快速响应的网络应用》
  • 《Effective JavaScript:编写高质量 JavaScript 代码的 68 个有效方法》
  • 《HTML5 权威指南》
  • 《HTML5 秘籍(第 2 版)》
  • 《HTML5 与 CSS3 基础教程(第八版)》
  • 《CSS 揭秘》
  • 《CSS 设计指南(第 3 版)》
  • 《CSS 权威指南(第 3 版)》
  • 《深入浅出 HTML 与 CSS》

Java 开发

  • 《Java8 实战》
  • 《Java 并发编程实战》
  • 《Java 性能权威指南》
  • 《Java 程序员修炼之道》
  • 《实战 Java 高并发程序设计》
  • 《Java 编程思想 (第 4 版)》
  • 《深入理解 Java 虚拟机(第 2 版)》
  • 《Effective java 中文版(第 2 版)》
  • 《Java 核心技术·卷 1:基础知识(原书第 9 版)》
  • 《Java 核心技术(卷 2):高级特性(原书第 9 版) : 高级特性》

.NET

  • 《精通 C#(第 6 版)》
  • 《深入理解 C#(第 3 版)》
  • 《CLR via C#(第 4 版)》

Python

  • 《集体智慧编程》
  • 《笨办法学 Python》
  • 《Python 基础教程》
  • 《Python 源码剖析》
  • 《Head First Python》
  • 《与孩子一起学编程》
  • 《Python 学习手册(第 4 版)》
  • 《Python Cookbook(第 3 版)》
  • 《Python 参考手册(第 4 版)》
  • 《Python 核心编程(第 3 版)》
  • 《Python 科学计算(第 2 版)》
  • 《利用 Python 进行数据分析》
  • 《Think Python:像计算机科学家一样思考 Python(第 2 版)》
  • 《Python 编程实战:运用设计模式、并发和程序库创建高质量程序》
  • 《Python 绝技:运用 Python 成为顶级黑客》
  • 《Flask Web 开发:基于 Python 的 Web 应用开发实战》

Android

  • 《Android 编程权威指南(第 2 版)》
  • 《移动应用 UI 设计模式(第 2 版)》

iOS

  • 《iOS 编程实战》
  • 《iOS 编程(第 4 版)》
  • 《Objective-C 高级编程》
  • 《Effective Objective C 2.0:编写高质量 iOS 与 OS X 代码的 52 个有效方法》

PHP

  • 《Head First PHP & MySQL(中文版)》
  • 《PHP 高级程序设计 : 模式、框架与测试》
  • 《深入 PHP:面向对象、模式与实践(第 3 版)》

C 语言

  • 《C 标准库》
  • 《C 和指针》
  • 《C 专家编程》
  • 《C 陷阱与缺陷》
  • 《C 语言接口与实现》
  • 《C 程序设计语言(第 2 版)》
  • 《C 语言参考手册(第 5 版)》

C++

  • 《C++ 标准库》
  • 《C++ 编程思想》
  • 《C++ 语言的设计与演化》
  • 《C++ 程序设计原理与实践》
  • 《C++ Primer (中文第 5 版)》
  • 《C++ 程序设计语言(第 1-3 部分)(原书第 4 版) 》
  • 《More Effective C++:35 个改善编程与设计的有效方法(中文版) 》
  • 《Effective C++: 改善程序与设计的 55 个具体做法(第 3 版)(中文版) 》

机器学习和数据挖掘

  • 《数据之巅》
  • 《矩阵分析》
  • 《机器学习》
  • 《统计学习方法》
  • 《机器学习导论》
  • 《推荐系统实践》
  • 《机器学习实战》
  • 《Web 数据挖掘》
  • 《深入浅出统计学》
  • 《模式分类(第 2 版)》
  • 《概率论与数理统计》
  • 《统计学习基础(第 2 版)(英文) 》
  • 《数据挖掘:概念与技术(第 3 版)》
  • 《数据挖掘:实用机器学习工具与技术(原书第 3 版)》
  • 《大数据:互联网大规模数据挖掘与分布式处理(第 2 版)》

数据库

  • 《SQL 应用重构》
  • 《SQL Cookbook》
  • 《高性能 MySQL (第 3 版)》
  • 《深入浅出 SQL(中文版)》
  • 《MySQL 技术内幕 : InnoDB 存储引擎(第 2 版)》
  • 《深入浅出 MySQL : 数据库开发、优化与管理维护》

测试

  • 《探索式软件测试》
  • 《有效的单元测试》
  • 《Google 软件测试之道》

项目与团队

  • 《人月神话》
  • 《快速软件开发》
  • 《人件(原书第 3 版)》
  • 《门后的秘密:卓越管理的故事》
  • 《极客与团队:软件工程师的团队生存秘笈》

求职面试

  • 《程序员面试金典(第 5 版)》
  • 《编程之美 : 微软技术面试心得》
  • 《金领简历:敲开苹果、微软、谷歌的大门》
  • 《剑指 Offer:名企面试官精讲典型编程题(纪念版)》

编程之外

  • 《暗时间》
  • 《数学之美》
  • 《赢得朋友》
  • 《精益创业》
  • 《批判性思维》
  • 《世界是数字的》
  • 《程序员的数学》
  • 《程序员健康指南》
  • 《禅与摩托车维修艺术》
  • 《关键对话:如何高效能沟通》
  • 《写作法宝:非虚构写作指南》
  • 《黑客与画家 : 来自计算机时代的高见》
  • 《软件随想录 : 程序员部落酋长 Joel 谈软件》
  • 《如何把事情做到最好:改变全球 9800 万人的人生指导书》

  • https://web.archive.org/web/20170728202627/http://www.pydevops.com/2016/11/03/%E7%A8%8B%E5%BA%8F%E5%91%98%E8%AF%BB%E4%B9%A6%E5%88%97%E8%A1%A8%E6%8E%A8%E8%8D%90/

2014-11-20 book , computer-science , network , linux

Nexus 5 不同版本

要给哥弄个Nexus 5,网上一查有美版的D820,还有国际版的D821。顺手做个笔记LG D820 VS LG D821。两个版本的LG Nexus 5在几乎所有的配置和外观上都没有任何的区别,主要区别在通讯模块上,一个支持GSM/CDMA/WCDMA/LTE,而另外一个不支持CDMA,具体的支持情况外媒梳理如下:

##北美Nexus 5版本 (LG D820):

  • GSM: 850/900/1800/1900 MHz
  • CDMA: Band Class: 0/1/10(这个频段是中国电信也支持的,其实大多数有CDMA的国家都在这个频段范围内,所以是支持所有CDMA频段的)
  • WCDMA: Bands: 1/2/4/5/6/8/19
  • LTE: Bands: 1/2/4/5/17/19/25/26/41

##Nexus 5国际版本,没有CDMA (LG D821):

  • GSM: 850/900/1800/1900 MHz
  • WCDMA: Bands: 1/2/4/5/6/8
  • LTE: Bands: 1/3/5/7/8/20

D820能够兼容AT&T、T-Mobile和Sprint的2G、3G和LTE网络;而D821则可兼容欧洲、亚洲等其余地区的网络频段。

D820美版需要破解才能电信4G,D821支持联通4G,中国移动所使用的是特有的频段,不支持

##D820(H)、D820(E)、D820(S)区别

D820(H)、D820(E)、D820(S)三者其实硬件都是一样的,就是RAM颗粒使用得不一样而已。 D820(H)是Skhynix(海力士)的RAM颗粒,D820(E)是Elpida(尔必达)的RAM颗粒,D820(S)是Samsung(三星)的RAM颗粒。查了下LG的内部资料,貌似D820(S)故障率最高,无故黑砖的同学警惕是否买到D820(S)的机器~

查看D820(H)、D820(E)、D820(S)方法~关机后,按音量“-”以及开机键同时开机,然后进bootloader查看~

参考:


2014-11-12 Android , Nexus , Google , LG

电子书

最近文章

  • 每天学习一个命令:使用 rz sz 向服务器发送文件 搜索 rz sz 命令使用方式进来的,可以不用往下看了,直接学习 scp 或者 rsync 吧, rz sz 看了一下还是有很多限制的。
  • 分析家里局域网 WiFI 瓶颈 目前我的情况是,家中有一个千兆主路由放在客厅接外面的宽带,而我自己的房间有一台比较老的 Netgear 3800 路由来无线桥接连接外面的主路由,因为我不想我的 3800 路由中的设备暴露到主路由的设置中,所以用了 OpenWrt 的桥接模式。但是随着我在 3800 这台路下接的设备增多,导致目前 3800 这台路由不堪重负,已经影响到了我日常 streaming 局域网 NAS 中的电影。所以最近想更换一下这台已经 8 年历史的 WNDR 3800 路由器。
  • GitLab CI 使用笔记 CI/CD 不必多说。
  • 使用命令行远程网络唤起主机 在 Linux 下可以通过 etherwake 命令来网络唤醒设备。
  • Cloud-init 初始化虚拟机配置 在安装 Proxmox 后在它的文档中了解到了 cloud-init。所以就来梳理一下。