<![CDATA[ Hick]]><![CDATA[ 碧桂园十里银滩迎海信息汇总]]>本页面停止更新,
相关信息已经迁移到新的独立网站: http://10LiYinTan.com
建议有事可以去该网站搜索, 比如搜索"收楼".
同时也欢迎关注 十里银滩业主 公众号二维码



十里银滩业主



迎海微信群说明




  • 迎海专属微信群, 非业主勿入

  • 宁可冷清, 也不要发无聊的信息和广告

  • 希望群里讨论的尽量是对大家有用的信息, 严谨脏话, 尽量避免无用信息骚扰邻居

  • 进去请按照下面图二的指引修改 微信群昵称


  • 同意以上规则请微信扫描图一, 备注“迎海”:


  • 图一



    56号楼专属微信群


  • 图二



    56号楼专属微信群




基本信息




  • 十里银滩到惠州南站大概30公里30分钟左右车程; 深圳地铁 14 号通到惠州南站


  • 一期15栋,二期13栋,三期26栋,四期22栋, 一期10000户左右,二期9000户左右,三期12000户左右,四期8000户左右. 管理费 2.3元/平, 电费 1.5元/度, 水费 3.28元/立方米, 车位比 1:1, 停车 地上120元/月,地下180元/月 (hick: 经核实, 最新预售合同上写的很多都是 50元/月, 不知道为什么这里写这么高) 参考 这里


  • 十里的不是天然气, 是管道煤气


  • 三期海悦湾: 6月2日起23号楼开始交付! 6月5日起22号楼开始交付! 6月10日起21号楼开始交付!


  • 山林海2 是 16 年底收楼(消息来自 小枪 童鞋)


  • 根据 惠东县网络问政 的留言显示, 14年的时候, 惠东县住房和城乡规划建设局 还回说十里的填海发展用地是违法的. 学习到可以在惠东县住房和城乡规划建设局网站上,查阅《惠东县稔山镇亚婆角片区控制性详细规划》和《亚婆角三期总平面布置图》


  • 按照《惠州市农村村民自建住宅用地管理规定》,村民自建住宅建筑层数最高为6层, 海逸湾对面鹤咀村中正兴建数栋村民自建房 政府回复为违建


  • 惠州房产管理局网络问政可以提问对话, 详情点 这里

  • 据说是收楼先看是不是符合标准, 符合了再开发商登记,然后上面就开始办证, 完了大概一俩年才下来房产证(有说交房后270多天的)

  • 十里银滩 的说法大概来自于 五公里的"海滩", 而不是说沙滩有十里

  • 十里银滩规划一共八期, 迎海属于三期二(实际为四期, 避讳 四), 参考 这里

  • 据说迎海西边的填海发展用地规划为六期, 详情暂时不明, 事关 56 号楼, 欢迎提供信息

  • 一般 56 号楼又称 56 栋, 政府登记的56号楼销售情况表 , 来自 惠东县房产管理局预售证信息查询

  • 百度网盘十里银滩相关资料地址(注意后边可能修改, 会在 http://hickwu.com/slyt 这里更新):



    http://pan.baidu.com/s/1cDj0oI 密码 zskd




优缺点



缺点:




  • 整体偏僻, 周边不发达

  • 入住率不高, 很多度假投资的



优点:




  • 相对来说还是有不少配套

  • 社区比较大

  • 周边正在建设中项目和配套的比较多



入住准备



相关关键词: 收楼/入住/维权



一定注意下, 收楼的时候拿自己的相关凭证, 征集下业主联系信息, 最好有手机号和常用 email/QQ/微信等. 保持联系, 共同维权.



收楼注意:




  • 一般有问题跟开发商交涉, 他们会处理, 不过可能要经常打电话问问,要不一个月都整改不了



个人收集了一些家具样子, 想回老家请木匠定做, 比较原生传统的农发, 不刷漆, 桐油:



桐油是一种优良的带干性植物油,具有干燥快、比重轻、光泽度好、附着力强、耐热、耐酸、耐碱、
防腐、防锈、不导电等特性,用途广泛。它是制造油漆、油墨的主要原料,大量用作建筑、机械、
兵器、车船、渔具、电器的防水、防腐、防锈涂料,并可制作油布、油纸、肥皂、农药和医药用
呕吐剂、杀虫剂等。


本页面停止更新,
相关信息已经迁移到新的独立网站: http://10LiYinTan.com
建议有事可以去该网站搜索, 比如搜索"收楼".
同时也欢迎关注 十里银滩业主 公众号二维码



生活信息



日常生活商业信息






  • 盐灶背市场



    就在十里主出口东北方向四五百米处, 村落级菜市场以及各种小超市等, 这边也有很多饭店等, 大都价格偏高.



    行车路线 http://map.qq.com/?l=415271806



    街景实景 http://map.qq.com/?l=415271119


  • 霞景贸易市场



    又称霞涌贸易市场, 或者霞涌综合市场, 霞涌海洋市场等, 镇级的市场, 大概 10 公里车程. 各种东西比较丰富, 价格便宜厚道---有邻居反馈虽然看起来价格便宜, 有些不厚道的商贩缺斤少两严重, 最好自带便携秤过去.



    行车路线 http://map.qq.com/?l=415273773



    街景实景 http://map.qq.com/?l=415273554


  • 澳头海鲜市场



    和澳头市场在一起, 比霞涌的霞景贸易市场更大规模, 他们是大亚湾周边知名的俩大镇级海鲜市场. 距离稍远, 车程大概 26 公里多.



    行车路线 http://map.qq.com/?l=415277444



    街景实景 http://map.qq.com/?l=415277028


  • 十里银滩海鲜市场



    已经初步建成, 据说 2016 年下半年会开业营业.




快递



寄到我们这里的地址是:惠州市惠东县稔山镇碧桂园十里银滩x期xx号x单元xxxxx 邮编 516300



到达十里银滩的快递有




  • 中通快递: 13809692385(有站点)

  • 韵达快递:13539247574

  • 邮政快递:13433476768

  • 顺丰快递:13923650610/13802865131

  • 天天快递:18129583373(小件)

  • 优速快递,百世汇通

  • 京东惠州有仓库,十里银滩可以送货上门

  • 苏宁易购也到



班车/楼巴时刻表



关注"碧桂园十里银滩"公众号, 回复"楼巴"可以获得最新班车/楼巴时刻表, 目前最新为 16 年 5 月 21 日更新的, 可以点 这里 查看, 暂时不确认更新以后链接地址是否改变.



网络和电视



以下是邻居的聊天记录参考:




  1. 水蓝天-10-文心: 我装的720一年宽带+网络电视,包括机顶盒价格;中国电信; 好像是12兆


  2. 观山海-7-周: 我装了,2000多一年加网络电视; 好像是海悦湾三区有个营业厅, 门口有棵树的那个; 还不带路由器;


  3. 爱琴海-11-小芭: 我家装的电信 网络1380 50M;


  4. 山林海-7-家鹏: 我们这50元一个月,看电视一样不卡


  5. 海头浦苑-30栋 冬日: 装电信直接去电信的网上营业厅申请,他会按时来装。你要去门店申请他肯定宰你咯,比如那加急的费用就是。




惠州网站





高铁



2016-05-24 据报道 "广汕高铁途经惠州5县区,4车站首次曝光", 广汕高铁(广州至汕尾客运专线,或称广汕铁路)准备在惠州设4个车站,分别是罗浮山站、博罗站、惠城南站、惠东西站。最快4年也就是2019年可建成通车。广汕线通车后,从惠州坐高铁到广州有望在半个小时左右,比目前约两个小时,将大大缩短耗时。 hick 解读: 惠东西站估计就是现在的惠东站, 跟十里银滩相聚大概十公里左右的直线距离, 可以对比这俩个参考: 深圳市民中心到深圳北站大概8公里,南头关到深圳北站大概14公里.



学校收费标准





常用电话



已经收录到公众号"十滩002"



其他



周边的小径湾和合正东部湾等看起来档次高, 不过人气稍差, 价格稍高.



本页面停止更新,
相关信息已经迁移到新的独立网站: http://10LiYinTan.com
建议有事可以去该网站搜索, 比如搜索"收楼".
同时也欢迎关注 十里银滩业主 公众号二维码

]]>
<![CDATA[ 中文支持不错的pdf工具rst2pdf]]>今天 Emacs 微信群 里聊起 org 格式转换 pdf , 走 LaTex 等各种 Tex 转换的中文以及高亮等问题. 从早年 DocBook 起我一直也在不断折腾, 各种方案大概都试过, 个人尝试的还是这个 pandoc + rst2pdf 最顺手轻便:



rst2pdf 是基于 reportlab 库的,不需要去 官网 下载,为支持中文 pdf , 大概安装过程如下:




  • 确认系统字体安装了(快盘/soft 目录下有) WenQuanYiMicroHeiMono.ttf YaHeiMonofur.ttf

  • 安装 pandoc 支持 markdown 格式转换成 rst 格式 (http://johnmacfarlane.net/pandoc/installing.html 找到的一般是 https://github.com/jgm/pandoc/releases)

  • pip install rst2pdf 过程中依赖的 reportlab 安装失败,先去 reportlab 按照说明安装 windows 版

  • pip install rst2pdf 完成安装

  • 拷贝 python 目录下 Lib\site-packages\rst2pdf\styles\styles.style 成 chinese.style, 进行中文改造, 放到 D:\Program\QuickLink\chinese.style

  • 修改样式文件


    • 嵌入字体, embeddedFonts: [[WenQuanYiMicroHeiMono.ttf,YaHeiMonofur.ttf,simkai.ttf,simhei.ttf]] 字体名可以从系统 fonts 目录拷贝出字体文件查看。

    • 修改使用的字体: fontsAlias 属性的各种字体都改成中文字体比如 WenQuanYiMicroHeiMono

    • wordWrap 修改成 CJK , 标识按照 CJK 三国语言方式折行


  • 自己折腾发现 reportlab 处理中文折行的小 bug : reportlab\platypus\paragraph.py 增加 len(uj) > 0 的判断就不出错了



处理优化




  • 样式文件中修改代码块的样式, code 属性值 fontSize: 80% 以及 backColor: #f6f6f6

  • 修改 rst2pdf 的 dotted_toc (去安装文件夹搜索): dot = '.' 修改成 dot = '. ' 改进索引点线

  • 通过 -c 参数启用 pdf 压缩能减少差不多一半大小,增加的生成时间确认了可以忽略

  • 参数 -e dotted_toc 是目录不分,标题和页数用点线对齐



另外,由于生成的 rst 文件比较单薄,没有索引等,简单封装了 .py 脚本来处理 , 没做进一步修改,仅限转换当前目录下的 doc.md 文件。



import os
import time
import re

start_time = time.time()
rst_file = 'doc.rst'

"""
- md 转换 rst 文件
- 删除之前可能已经生成的文件
- 修改生成的 rst 文件: 第三行插入索引等基本 rst 指令
"""
os.path.isfile(rst_file) and os.remove(rst_file)
ret = os.system("pandoc -f markdown -t rst -o " + rst_file + " doc.md")

rst_str = """

.. contents:: 目 录
.. sectnum::

.. raw:: pdf

PageBreak


.. header::

###Title###(Hick) . . . . . . . . . . . . . . . . . . . . . ###Page###


"""
if not os.path.isfile(rst_file):
print(u"error: rst 文件没生成")
flist=open(rst_file,'r+').readlines()
flist[2]= rst_str
open(rst_file,'w+').writelines(flist)

ret = os.system("rst2pdf doc.rst -s chinese -o doc.pdf -c -e dotted_toc")
print u"pdf 文件生成成功", time.time() - start_time


生成的 pdf 的图片可能处理不太好, markdown 不支持定义图片高宽等, rst 支持,可以指定一个百分比显示。



话说回来, 各种语言的 pdf 工具都越来越成熟了. 在公司是项目里, 已经在用 php 圈里的 tcpdf 生成灵活控制的 pdf 文件. 虽然有遇到过比较奇怪的某些不明就里的字符组合就乱码的现象(不大好描述, 大体是原本生成某些阅读器乱码的 pdf , 去掉一个中文比如"兰"就不乱码了, 但是整个那一段文字放到另外一个 pdf 里又好好的), 整体来说还不错. 乱码问题也有小伙伴用另外一个 php pdf 库 mpdf 基本解决了.



参考资料:



]]>
<![CDATA[ 我和GOT-权力的游戏]]>作为非正式 GOT 粉, 自认有些狂热, 写了程序自动监控相关网页, 一旦剧集和字幕出来就通知到我手机, 所以一般北京时间周一我会很快更新我拿到的新一集相关资源到这里---这里作为微信群辅助工具传播最新资源, 不创造资源甚至不沉淀剧集字幕资源, 基本上周二就会撤掉, 需要历史资源注意查看下面的 推荐资源. 感谢各制作方, 尤其是 HBO 制作方 :) 方便记忆的本文地址: http://HickWu.com/got



最新消息




  • 第六季最新一集: http://pan.baidu.com/s/1o88Jllo 密码 hh3d


  • 鉴于网盘有被封的历史, 可以记住本页的短地址: http://hickwu.com/got




第五季第十集

  • 英文字幕已出 http://pan.baidu.com/s/1hqtjQHu h7gg


  • 简体中文字幕(衣柜字幕组)版已出 http://pan.baidu.com/s/1hqtjQHu h7gg

  • 简体中文字幕(TLF字幕组)版已出 http://pan.baidu.com/s/1hqtjQHu h7gg

  • 繁体中文字幕版已出 http://pan.baidu.com/s/1hqtjQHu h7gg


  • 英文/简体中文(包括衣柜字幕)/







  • 欢迎微信扫描二维码加入 **GOT-权力的游戏 剧迷微信群**, 也欢迎 冰火 原著迷.

    ![GOT权力的游戏 微信群](http://emacsist.com/got.gif)

    * 进去不用报到; 自由退出, 别不好意思
    * 可以讨论原著, 不允许剧透, 剧透标准: 每周二零点以前聊周一(北美东部时间周日晚上)一集剧情
    * 有时候微信群消息多太骚扰, 可以考虑临时在群设置种开启免打扰模式



    推荐资源





    看剧态度



    欣赏你能欣赏的, 有兴趣的话尝试去理解别人能欣赏的; 没有必要狭隘的攻击谩骂不同意见者.



    不反感原著党带着期望的态度去批评电视剧编剧, 但是如果看不懂编剧的安排, 或者觉得编剧的安排没有马丁老爷子的好就谩骂, 个人实在不屑不齿!



    个人最喜欢马丁老爷子把人物刻画得饱满鲜活, 几乎没有完人, 一如几乎没有主角... 马丁老爷子也表达过这样的观点: 是有很多虐心的, 但是没有无缘无故突然来袭没有伏笔的意外.



    剧情随扯



    个人综合各种资料和线索, 基本能断定 囧snow 不是奈德的儿子, 应该是侄子.



    交流分享



    本文的主旨, 是希望能有有意义的交流分享.



    以下都是本文短链接, 欢迎传播:



    ]]>
    <![CDATA[ Emacs内置浏览器EWW]]>概要

    EWW, 是 Emacs Web Wowser 的缩写(下边也写作 eww), Wowser 直译是"令人印象深刻的事物"的意思. 是 2013 年出现, Emacs 24.4 开始内置的文本型浏览器.
    以下的使用基于 Emacs 24.4 或者以上版本.



    不同于传统的 Emacs 常见浏览器方案 w3m 需要外部工具支持, eww 不需要外部工具支持. 另外不支持 js 以及外部引入 css ,
    损失了页面效果的同时, 也减少了很多 http 请求, 加载速度非常快.



    基本使用



    M-x eww ENTER emacsist.com 即可访问 Emacs 爱好者站点 Emacsist.com .
    打开网页以后, 显示界面上一般按单个字母即可进行操作, 比如 q 为退出, 也支持简单的书签和浏览历史等功能,
    如果当前网页用 eww 查看起来实在糟糕, 则可以用按 & 调用 eww-browse-with-external-browser 的配置在外部浏览器打开当前页面.
    更详细的操作指引可以 C-h m 查看.



    如果默认的按键不符合操作习惯, 可以参考下面的这样的方式去配置修改:



    (with-eval-after-load 'eww
    (custom-set-variables
    '(eww-search-prefix "https://www.google.com.hk/search?q="))

    (define-key eww-mode-map (kbd "h") 'backward-char)
    (define-key eww-mode-map (kbd "n") 'next-line)
    (define-key eww-mode-map (kbd "s") 'forward-char)
    (define-key eww-mode-map (kbd "t") 'previous-line)

    (define-key eww-mode-map (kbd "H") 'eww-back-url)
    (define-key eww-mode-map (kbd "S") 'eww-forward-url)

    (define-key eww-mode-map (kbd "b") 'eww-history-browse)
    (define-key eww-mode-map (kbd "c") 'eww-browse-with-external-browser)
    (define-key eww-mode-map (kbd "i") 'eww)
    (define-key eww-mode-map (kbd "m") 'eww-lnum-follow)
    (define-key eww-mode-map (kbd "z") 'eww-lnum-universal)

    (define-key eww-mode-map (kbd "M-n") 'nil)
    (define-key eww-mode-map (kbd "M-p") 'nil)

    (define-key eww-mode-map (kbd "<C-S-iso-lefttab>") 'eww-previous-buffer)
    (define-key eww-mode-map (kbd "<C-tab>") 'eww-next-buffer)
    )


    实际对比 Emacsist.com 在 chrome 等浏览器效果, 会发现因为使用外部 css 控制页面布局, 变形还是比较大, 不过因为做过特殊适配,
    基本能比较整齐的显示. 如果尝试访问我的 blog: blog.hickwu.com , 由于页面布局简单, 显示效果基本跟 chrome 上差不多.
    具体参见 eww1.gif



    eww1.gif



    默认配置下, 如果 M-x eww 回车后输入的内容被检测出来是网址,自动打开, 否则会调用 DuckDuckGo 进行搜索.
    前文的 eww-search-preifx 配置即为修改默认搜索方式. 要打开本地文件用 file:// 开头或者 M-x eww-open-file .



    另外配合 ace-link 等能很方便的切换以 ace-jump 的方式定位和跳转链接, 如下图 eww2.gif 中使用 ace-link-eww 以后,
    按 l 即可跳转到文章"ace-jump-mode高效移动光标".



    eww2.gif



    理解 eww 的工作方式



    eww 是基于另外一个项目 shr.el 构建的, 当然也依赖 libxml2 库, 自己编译 Emacs 的时候注意相关选项.



    eww 支持 cookie 的, 它的一些网络操作走的是 url.el ,
    更多功能可以参考 url package .
    eww 针对图片也有特殊处理, 可以设置 shr-max-image-proportion 定义图片显示尺寸以及 shr-blocked-images 屏蔽部分图片等.



    需要设置代理服务器的也是走 url.el 的方式, 可以设置不代理的规则等, 基本用法如下:



    (setq url-proxy-services '(("no_proxy" . "work\\.com")
    ("http" . "proxy.somedomain.com:8888")))


    url-cookie-list 命令可以列出来 Emacs 保存的 cookie 列表, 定义在 url-cookie.el 中, 其中还有定义 url-cookie-retrieve 等函数,
    elisp 程序获得可以类似这样 (url-cookie-retrieve "127.0.0.1" "/") 的用法. cookie 实际保存在变量
    url-cookie-file 对应的文件, 大概内容如下:



    (setq url-cookie-storage
    '((".weibo.cn"
    [url-cookie "httponly" nil "28-Apr-2015 15:33:47.00 GMT" "/" ".weibo.cn" nil]
    [url-cookie "_T_WM" "XXXXXXXXXXXXXX" "28-Apr-2015 15:33:47.00 GMT" "/" ".weibo.cn" nil])
    ("192.168.3.222"
    [url-cookie "cookie_id" "142355712384279893" "10-Feb-2016 08:32:03.00 GMT" "/" "192.168.3.222" nil]))
    )


    另外根据查找的资料, eww 支持 html 表单的文件上传, 各种平台的体验情况未知, 参考
    http://lists.gnu.org/archive/html/bug-gnu-emacs/2013-12/msg01389.html



    eww 的使用场景



    有些 Emacs 爱好者习惯用 gnus 等在 Emacs 里收邮件, 可以配合 eww 去查看 html 邮件.



    用来访问一些比较简单的网站比如 hackernews 等效果都还可以, 另外一些编程语言的手册等基本还是可以用 eww 来查看.



    对一些纯文本格式比如 org/markdown 转化成 html 的预览效果一般也还能接受. 涉及自动刷新等, 也有人在摸索了, 具体可以参考
    How do I auto-refresh eww pages?



    参考资料




    • EWW Overview


    • EWW Basics


    • EWW Advanced


    • eww (web browser)


    • Emacs Web Wowser (EWW) got ace-link


    • emacs-webkit 国内 deepin linux 的王勇同学开发了一个 Emacs
      里内嵌的 webkit 浏览器: deepin-emacs , 有兴趣的可以试试 https://github.com/linuxdeepin/deepin-emacs .


    • w3m 整体看起来可能比 eww 还成熟的项目, 也是很老的项目了. 主要差别是:
      w3m 原本是一个独立的类似于 Lynx 的文本型浏览器, Emacs 里的 w3m 需要配合 w3m 这个外部工具来用.
      当然 eww 从 24.4 开始内置也许不算本身的差别, 也是次生优势.


    ]]>
    <![CDATA[ github上star超过500的Emacs项目概要]]>github 的 star 数量会受项目时间以及被传播的情况等影响, 会一定程度上反应一些情况, 只是参考, 不用太当回事. github 搜索条件: emacs stars:>500 综合 language:"Emacs Lisp" stars:>500 ,有部分跟 Emacs 关系不是那么大的我人肉过滤. 由于个人英语理解能力等因素, 可能有些描述不大准, 仅供参考, 欢迎纠错, 如有更细我会在 http://blog.hickwu.com/posts/337 这里发布.



    排名前 3 的可以说都只是是三个 Emacs 配置包:




    • technomancy/emacs-starter-kit

    • bbatsov/prelude

    • purcell/emacs.d



      github 流行以后, 极大让这种方式得以流行. 需要注意这几个的基本思路除了字面意义上的配置, 还会利用 Emacs 包管理机制自动下载相关包.
      使用这些配置好的方案, 可以比较方便快速的搭建起比较完整的 Emacs 功能, 尤其建议新手使用 --- 需要注意风险是一旦出了问题可能比官方版难搞定. 具体选择建议参考他们各自的介绍, 比如 purcell/emacs.d 配置好了适合以下主题的环境: Ruby / Ruby on Rails, CSS / LESS / SASS / SCSS, HAML / Markdown / Textile / ERB, Clojure (with Cider and nRepl), Javascript / Coffeescript, Python, PHP 等等.


    • magit/magit 没啥好说的, 最流行的 git 管理包


    • clojure-emacs/cider 这个比较专用, Clojure 开发的, 懂这个词的就懂, 不懂的不用看了.


    • dimitri/el-get Emacs 的包管理工具, 提供比 Emacs 24 以后内置的包管理 package.el 更丰富的功能, 实际也支持以 package.el 的方式管理包.


    • capitaomorte/yasnippet 又简称为 yas , 最初还是中文圈的 pluskid 开发的, 酷炫的输入模板机制, 输入少量几个模板 key 的字符即可魔法般展开大段文本, 个人感觉是应该比 magit 还必装的 emacs 包.


    • bbatsov/projectile 顾名思义 project 项目维度的一些管理工具, 包括项目内搜索查找文件等各种功能, 体验比较惊艳, 写代码有了它我基本不用 dired 这么原始的东西了.


    • redguardtoo/mastering-emacs-in-one-year-guide 中文圈 陈斌 同学的 "一年成为Emacs高手(像神一样使用编辑器)", 不可全信, 而且需要考虑作者有着不错的 vim 背景, 整体来说还是值得一读的, 尤其是有中文版


    • auto-complete/auto-complete Emacs 输入时自动完成的功能, 有同类竞争者 company-mode, 从零碎的看别人的评价来看, 貌似更推荐用后者


    • syl20bnr/spacemacs 以 Vim 风格使用 Emacs 的工具套装, 包括 evil 等.


    • emacs-helm/helm 总感觉这个不大好描述, 输入提示和选择框架? 还是上英文吧, 绝对值得一试, 当然你可能用同类的 ido-mode , 二者必选其一, 别都不用: Emacs incremental completion and selection narrowing framework


    • overtone/emacs-live 没完全看明白, 好像是类似一套基本配置, 适合玩 Clojure 的


    • ensime/ensime-server 玩 Scala 的同学可以看看: ENhanced Scala Interaction Mode for text Editors, especially GNU Emacs.


    • sellout/emacs-color-theme-solarized 流行的 Emacs 主题配色 solarized


    • fxbois/web-mode 尤其适合需要混写 html/js/css 以及其他后端开发语言/模板比如 PHP, JSP, ASP, Django, Twig, Jinja(2), ERB, FreeMarker, Velocity, Cheetah, Smarty, CTemplate, Mustache, Blade, ErlyDTL, Go Template, Dust.js, Google Closure (soy), JSX 等


    • gabrielelanaro/emacs-for-python 专为 python 开发打造的 Emacs 配置集


    • magnars/multiple-cursors.el Emacs 里的多光标操作支持, 效果可以翻墙看 http://emacsrocks.com/e13.html . 个人是从 sublime 接触多光标操作的, 比较酷炫, 个人感觉实用性不是很强


    • flycheck/flycheck 老式的编程语言语法检查是用 flymake, 这个是"现代先进"的即时语法检查 mode , 没啥特殊要求就用它替换 flymake 就好


    • emacs-tw/awesome-emacs 台湾的同学们集体智慧的结晶, 一些列的支持各种编程语言和其他场景的 Emacs 工具包和配置集


    • mooz/js2-mode 比较不错的 javascript 开发支持 mode


    • milkypostman/melpa 著名的 Emacs 包源网站 http://melpa.org 的构建脚本.


    • defunkt/coffee-mode 用来写 CoffeeScript 的 mode


    • Fuco1/smartparens 智能的成对符号(各种括号等)辅助处理 mode




    ps.




    • 欢迎转载, 不过麻烦注明原文地址和作者

    • 本文纯属个人心得, 不代表任何立场

    • 如有疏漏, 欢迎交流指正

    • 对喜欢分享交流而不只是想问问题的 Emacs 爱好者, 欢迎扫二维码加入 Emacs 微信群, 不满足条件的进去了也会被很带感的踢出去的, 慎入! 喜欢热闹人多的, 可以加入源自水木社区 Emacs 版的 QQ 群: 59134186 有 500 多号人.



    !!!!!! 如果转载的特别注意下面的微信二维码, 有效期只有 7 天, 要么不带 ps. 以下的内容, 要么就直接引用二维码图片地址, 我观察有价值的话会持续更新对应的二维码保证有效.





    微信群附加说明:




    • 对"喜欢'分享'交流而不只是想问问题的 Emacs 爱好者", 欢迎加入; 退出自由,

    • 进去不用报到, 不追求人多和热闹, 追求尽可能的实用: 不满足上条的进来了也会被很带感的踢出去的, 慎入!

    • 建议但是不限制: 移动版微信阅读, PC版或者网页版参与讨论

    • 有时候微信群消息多太骚扰, 可以考虑临时在群设置种开启免打扰模式

    ]]>
    <![CDATA[ Emacs简化按键利器hydra]]>时不时有人冒出来说有 Emacs 教徒因为小拇指按 ctrl 太多导致 XXX 病, 不要用 Emacs! 有 XXX 病的人估计跟得出这个结论的人类似, 有这样的特质: 不懂得思考或者懒得主动改变. Emacs 教里不但有 evil/spacemacs 这样的 vi/vim 一族, 也有把 capslock 改成 ctrl 的键盘党, 还有改变按键习惯的行动派. 这才彰显自由的魅力, 是的, Emacs 难用爆了 --- 对把握不好自由的人来说.



    作为非高手的资深 Emacs 教徒, 建议不要去死记 Emacs 按键, 知道常用的若干(拍个脑袋比如十几二十)个就可以了. 个人有限的见识范围里, 简化 Emacs 按键习惯有俩种思路, 一种是 smex 式, 一种是 hydra 式. 喜欢按 ESC 的 vi 党, 除了试自成一派的 evil/spacemacs, 也可以考虑安装个 smex 并绑定到 ESC 键绑找找感觉, 就是这样 (global-set-key (kbd "<escape>") 'smex) . vi 党还可以继续想象.



    该吹捧 hydra 了. 初步考证其作者的介绍文章和 github commit 记录, hydra 是一个 2015 年才开始的新 Emacs 包, 在 github 已经收获了 100 多个 star , 相当受欢迎了 --- 截止 hick 同学考证的时间 2015-03-21 , github 上超过 100 个 star 的 Emacs 类项目不到 200 个.



    特别说明下, hydra 作为新兴项目, 作者年初介绍的 blog http://oremacs.com/2015/01/20/introducing-hydra/ 的使用方式跟最新的情况已有转变, 不再支持 hydra-create , 说不定后续还会有什么改进. 本文仅作为指引, 最新情况最好参考官方: https://github.com/abo-abo/hydra . 插播广告: 也欢迎关注本人(Hick)在维护的 Emacs 微信公众账号: Emacsist, 除了分享交流 Emacs 使用, 看到有 hydra 的新情况我也会通过公众账号广而告之 :)





    如果用过 magit , 对 magit-status 下按 c 等出现的可选菜单应该有印象, hydra 正是把这个能力扩展了. hydra 也在快速进化变强, 最基本的思路是: 根据使用者需要组合一系列函数, 每个函数用一个字母表示; 再定义一个前缀按键比如 C-t (当然也可以是 ESC). 配置好以后按 C-t 就会在 mini buffer 中显示该系列函数的列表, 再按对应的字母即可执行函数, 候选列表提供高亮以及函数说明等体验.



    建议以包方式安装(需 Emacs 24 或者以上版本) hydra: M-x package-install hydra



    在配置文件中定义需要组合的相关函数以及对应菜单的样式的函数, 并绑定到全局快捷键 C-t :



    (defhydra hydra-hick (:color pink
    :hint nil)
    "
    ^Utl^ ^Unmark^ ^Actions^ ^Git
    ^^^^^^^^-----------------------------------------------------------------
    _k_: kill line _u_: unmark _x_: execute _S_: magit show
    _s_: smex _U_: unmark up _b_: bury _g_: magit status
    "
    ("k" kill-line :exit t)
    ("u" Buffer-menu-unmark)
    ("U" Buffer-menu-backup-unmark)
    ("s" smex)
    ("x" Buffer-menu-execute)
    ("b" Buffer-menu-bury)
    ("T" Buffer-menu-toggle-files-only)
    ("g" magit-status :color blue)
    ("S" magit-show :color blue)
    ("c" nil "cancel")
    ("v" Buffer-menu-select "select" :color blue)
    ("o" Buffer-menu-other-window "other-window" :color blue)
    ("q" quit-window "quit" :color blue))

    (global-set-key (kbd "C-t") 'hydra-hick/body)


    生效后按 C-t 就会出现如下图所示可选菜单, 再按 k 就会调用 kill-line (默认绑定到 C-k) 删除当前行光标以后的文本. 注意定义 k 对应的函数的时候的 ":exit t" 表示执行完 kill-line 函数以后退出 hydra 提示菜单, 而默认情况下没有指定则不会退出.





    示例只是随便找了一组函数弄到了一起, 也可以按照个人使用习惯定义多组, 比如 python 操作习惯一组绑定到 "C-t p", ruby 操作习惯一组绑定到 "C-t r". 用户自己定义其实稍显麻烦, 个人预测可能将来会有一些定义好的 hydra 操作模板可供选择, 如果能像 yasnippet 的配置方式一样, 默认内置一些不错的设置并且能继承等, 那就是比 yasnippet 还有有灵性了(该建议已经在作者 blog 以及 github issue 提出, 有兴趣的也可以去重提, 作者就会更重视了, 嘿嘿). 更多高级用法等参见官方 https://github.com/abo-abo/hydra .



    有些同学可能用多了按键组合比如 "C-x o" , 却不知道其对应的函数, 按键之前按 "C-h" 也就是 "C-h C-x o" 即可, "C-h m" 可以查看当前 major-mode 和所有 minor-mode 提供的相关函数和按键等情况, "C-h" 前缀的系列按键最好都熟悉下, "C-h C-h" 可以查看.



    某种意义上来说, hydra 做的也没什么神奇的, 跟挨个定义全局或者局部组合键多了一个提示说明, 可以省去组合键的记忆. 比较不那么常用, 时不时又需要或者不容易记的若干相关函数建议组团走 hydra 方式.



    呼应下开头, 就个人的使用经验来说, Emacs 的终端跟非终端体验的差别, 导致我没有动力在某些场景(比如 vps, 公司线上机器)下使用 Emacs. 用 putty 终端下 ace-jump-mode 和 company-mode 等个人使用体验都不大好, 有尝试去 github 提 issue , 没能力和精力去深究. 不得不以简单的方式使用 vi , 比较遗憾. (根据小伙伴的反馈, 我的个人体验差别可能主要由 windows 的工具导致的, 回头我再试试 mac 终端等, 有结果了再来更新)



    ps.




    • 欢迎转载, 不过麻烦注明原文地址和作者

    • 本文纯属个人心得, 不代表任何立场

    • 如有疏漏, 欢迎交流指正

    • 对喜欢分享交流而不只是想问问题的 Emacs 爱好者, 欢迎扫二维码加入 Emacs 微信群, 不满足条件的进去了也会被很带感的踢出去的, 慎入! 喜欢热闹人多的, 可以加入源自水木社区 Emacs 版的 QQ 群: 59134186 有 500 多号人.



    !!!!!! 如果转载的特别注意下面的微信二维码, 有效期只有 7 天, 要么不带 ps. 以下的内容, 要么就直接引用二维码图片地址, 我观察有价值的话会持续更新对应的二维码保证有效.





    微信群附加说明:




    • 对"喜欢'分享'交流而不只是想问问题的 Emacs 爱好者", 欢迎加入; 退出自由,

    • 进去不用报到, 不追求人多和热闹, 追求尽可能的实用: 不满足上条的进来了也会被很带感的踢出去的, 慎入!

    • 建议但是不限制: 移动版微信阅读, PC版或者网页版参与讨论

    • 有时候微信群消息多太骚扰, 可以考虑临时在群设置种开启免打扰模式

    ]]>
    <![CDATA[ ace-jump-mode高效移动光标]]>



    ace-jump-mode 应该是目前为止 emacs 屏幕可见区域键盘操作移动光标(cursor)最快的方式, 没有之一 :) github 主页: https://github.com/winterTTr/ace-jump-mode



    刚用 emacs 的时候大都会接触 C-f/C-b/C-n/C-p 等标准的光标移动法, 实际上那些都是很低效的. 很多人可能习惯了 C-s isearch-foreard 这样的, 也还可以, 但是通常都比较低效.



    "ace jump的功能,是快速的定位光标到可以见的单词或者字母上", 这个是作者 winterTTr 同学在水木社区发布 ace-jump-mode 2.0 测试版时的原话. 更准确的说 ace-jump-mode 提供的定位能力不局限于单词字母, 也可以到其他字符.



    ace-jump-mode 有几种操作模式:




    • ace-jump-word-mode 按照英文语法的单词首字母(特殊字符实际也可以算单词)进行定位


    • ace-jump-char-mode 个人比较常用, 输入一个字符, 屏幕上显示出现该字符的位置, 并自动给每个位置分配一个按键, 按对应的键以后跳转到对应位置.


    • ace-jump-line-mode 快速定位到行. 实际上个人想象的一种扩展方式是定位到行以后, 自动按照列再定位一次, 这样就更通用而同样高效, 几乎可以定位到屏幕任意位置: 也解决非键盘直接输入字符, 包括中文的定位问题了.




    ace-jump-mode 大部分情况下比 C-s isearch-forward 等来得高效. 当然他们功能并不完全重叠, isearch-forward 用来搜索屏幕不可见区域之外等地方还是更适用的.



    有多个相关 mode 基于此拓展了:




    • ace-isearch 简单的理解, 默认安装配置好以后, C-s 搜1个字符调用 ace-jump, 2到5个单词用 isearch, 6个以及以上用 helm-swoop-from-isearch , 有些小毛病就是折叠的代码可能会被意外的展开


    • ace-jump-buffer 在当前打开的 buffer 之间以类似 ace-jump 的模式快速切换


    • ace-jump-zap zap-to-char 来删除到某个字符比较考眼力, 不是很近的容易出错, 有 ace-jump-zap 来选择就方便多了


    • ace-link 使用范围相对比较小众, 在有链接的一些 mode 比如 org-mode, info-mode eww 等中以 ace-jump 模式切换


    • ace-window 则是在 emacs 的窗口(frame/window) 之间切换, 因为只有俩窗口的时候直接跟系统的 C-x o other-window 一样, 所以可以考虑直接把该键定义为 ace-window




    具体在 github 上都可以找到, 也可以直接在 emacs 的包管理中直接安装, 不一一列举.

    ]]>
    <![CDATA[ 初步学会emacs中的align-regexp的用法]]>话说咱英语也是六级的水准, 看起 emacs 的帮助来还是相当费劲, elisp 的基本概念都有了, 为了对齐 php 中的多维数组的定义, 知道了基本思路应该是用 align-regexp 函数了.搜索了下中文和使用样例以后, 再翻看其英文说明, 竟是看得一愣一愣, 半明半白的:



    align-regexp is an interactive autoloaded compiled Lisp function in
    `align.el'.

    (align-regexp BEG END REGEXP &optional GROUP SPACING REPEAT)

    Align the current region using an ad-hoc rule read from the minibuffer.
    BEG and END mark the limits of the region. This function will prompt
    for the REGEXP to align with. If no prefix arg was specified, you
    only need to supply the characters to be lined up and any preceding
    whitespace is replaced. If a prefix arg was specified, the full
    regexp with parenthesized whitespace should be supplied; it will also
    prompt for which parenthesis GROUP within REGEXP to modify, the amount
    of SPACING to use, and whether or not to REPEAT the rule throughout
    the line. See `align-rules-list' for more information about these
    options.

    For example, let's say you had a list of phone numbers, and wanted to
    align them so that the opening parentheses would line up:

    Fred (123) 456-7890
    Alice (123) 456-7890
    Mary-Anne (123) 456-7890
    Joe (123) 456-7890

    There is no predefined rule to handle this, but you could easily do it
    using a REGEXP like "(". All you would have to do is to mark the
    region, call `align-regexp' and type in that regular expression.


    align-regexp 的基本用法是 M-x align-regexp, 然后输入对齐的标准字符比如等于符号 = . 为了对齐下面这样的 php 多维数组定义就必须 C-u M-x align-regexp 来使用差不多全部参数了.



    [
    'GodYouList' => array('mod' => 'topic', 'class' => 'YouHick', 'func' => 'getYouList'),
    'GodCompanyList' => array('mod' => 'topic', 'class' => 'YouHick', 'func' => 'getCompanyList'),
    'GadamnCheck' => array('mod' => 'recommend', 'class' => 'GadamnHick', 'func' => 'GadamnCheck'),
    'GadamnJob' => array('mod' => 'recommend','class' => 'GadamnHick','func' => 'GadamnFriend'),
    'RecommedJob' => array('mod' => 'recommend','class' => 'GadamnHick','func' => 'recommendFriend'),
    ]


    一开始都没明白 REGEXP 参数默认提示的 \(\s-*\) 是什么意思, 这也得抱怨下 elisp 或者 emacs 各种场景的正则真操蛋. 后来用了几次感觉出来了, 这是空格的正则. 英语六级也没白费, 看英文的时候, 猜 GROUP 参数大概是当定义多个正则匹配的分组---用 () 定义的正则子表达式---时, 需要填充空格位置的子表达式的编号. 多次尝试以后发现, SPACING 是填充的空格数. REPEAT 是一行内是否重复该规则---英文其实也能理解上去, 竟然没看明白.



    摸索的重点在怎么写正则上. 一开始还分解需要对齐的参考可以是 =>, 俩个符号, 但是 => 是需要在前面填充空格, 而 , 需要在后面填充空格, 不知道该如何写了, 简化成这样写出来是有些难看的: [>,]\(\s-*\) ,



    多种尝试中慢慢明白了 REPEAT 的用处, 通过下面这俩个操作能实现比较完美的对齐了, 本来还想自己写个 elisp 函数封装下, 想想这样的场景不会太多, 操作两次就操作两次好了:



    C-u M-x align-regexp \(\s-*\)= 1 1 n
    C-u M-x align-regexp ,\(\s-*\) 1 1 y


    最终效果:



    [
    'GodYouList' => array('mod' => 'topic', 'class' => 'YouHick', 'func' => 'getYouList'),
    'GodCompanyList' => array('mod' => 'topic', 'class' => 'YouHick', 'func' => 'getCompanyList'),
    'GadamnCheck' => array('mod' => 'recommend', 'class' => 'GadamnHick', 'func' => 'GadamnCheck'),
    'GadamnJob' => array('mod' => 'recommend', 'class' => 'GadamnHick', 'func' => 'GadamnFriend'),
    'RecommedJob' => array('mod' => 'recommend', 'class' => 'GadamnHick', 'func' => 'recommendFriend'),
    ]
    ]]>
    <![CDATA[ python自带的http服务器]]>跟 php 里的内置http server 类似, python 也自带简单的 http server 模块 SimpleHTTPServer 等(需要特别注意 python 3 中没有了, 融合到了 http.server 中), 可以把当前目录作为 web server 的根目录跑起来:



    python -m SimpleHTTPServer 8080


    上面指定了 8080 端口, 不指定则默认 8000 端口. 注意着时候只是简单的静态服务的 web server , 不能执行 .py 脚本( CGI 模式).



    需要直接执行 .py 文件需要下面这样以 CGI 方式跑起来:



    首先是启动 CGI http server, 文件 http.py :



    #encoding=utf-8
    from CGIHTTPServer import CGIHTTPRequestHandler
    from BaseHTTPServer import HTTPServer
    server_addr = ('',8000)
    httpd = HTTPServer(server_addr,CGIHTTPRequestHandler)
    httpd.serve_forever()


    然后在同目录新建 cgi-bin 目录, 并新建 hick.py , 内容如下:



    #encoding=utf-8
    #!/usr/bin/python
    import cgi

    # 获取 GET 参数
    form = cgi.FieldStorage()
    name = form['name'].value

    print "HTTP/1.0 200 OK"
    print "Content-Type:text/html"
    print ""
    print ""
    print "Hello, 世界, %s " % name
    print ""


    linux 下可能需要改变该文件权限为可执行. windows 下可以直接跑起来 python http.py , 浏览器访问 http://127.0.0.1:8000/cgi-bin/hick.py?name=hick 即可看到输出效果.



    上面也包括获取 GET 参数的示例, 更多 POST 等其他 http 处理参见参考下面的 Python CGI Programming



    参考资料:



    ]]>
    <![CDATA[ 可爱的windows]]>原本,作为一个技术人员,并且自认热衷实用技术的人, 内心多少认为日常使用 windows 是不大应该的, 日常应该使用至少 mac 这样的类 unix/linux 机器, 才能不断促进自己解决难题,思考和进步。 实际问题却是另外一个经验法则: 作为软件,bug和问题无所不在,用的人越多或者越专业,已知的 bug 和问题越少, windows 符合该法则。 于是, 我就有了半 windows 半 linux 的风格, 是的, 我喜欢,或者也是说只好中庸的选择了在 windows 下使用一些 linux 风格的软件, 比如 emacs 写写文档, 于是 again, 我用 emacs 始终是半桶水。



    源起, 我用某软件, 不能用 windows xp ... 陆续碰到好几款软件不支持 xp 了, 所以我想还是试试口碑稍微好点的 windows 7 吧。 尽管之前 thinkpad 上是正版的 win 7 , 早被我降成 xp 了。 有那么点不好意思的下了个 win 7 ghost 版安装, 各种设置尽量还原 xp 经典本色以后, 问题来了: xp 上用得好好的 PPTP 的 VPN , 各种尝试以后都连接不上了。 一会 800 一会 807 错误。 一翻搜索之后, 基本没找到正解, 不过看出来一些苗头, 807 大致是 vpn client 端的问题, 基本可以定位肯定是防火墙阻截了。 查查了 windows 自带的防火墙, 发现好像无法关闭, 也不像打开了, 操作大概提示: 当您尝试启用 Windows 防火墙的"0x80070422"错误消息 。 运行 services.msc 看启动的服务也没见到防火墙服务。



    就循着 0x80070422 这个线索查, google 找到 MS 官方果然还是给了方案的, 具体参见下面的参考链接。 排除第一种,直接使用第二种方法以后, 防火墙可以正常使用了, 然后关闭并 telnet X.X.X.X 1723 确认 pptp 服务可连以后, 再用一般设置, 成功连上 VPN !



    使用 windows 和 linux 系的一个重要区别: 你用 windows 可能快速的解决了一个问题, 但是你可能不知道解决的原理; 而用 linux , 为了解决一个问题可能耗费了很多时间, 你会发现你解决了问题以后, 还会收获相关背景知识。



    我说 windows 可爱, 你信么? hehe



    参考



    ]]>
    <![CDATA[ 最近遇到的奇怪的系统和php小坑]]>看到 rubymotion 势头正旺, 又查了下 ruby 做 android 的 ruboto 有新进展, 就尝试去安装玩玩。官方介绍倒简单, 可惜一开始 64 位系统下错误安装了 32 位的软件, 提示比较莫名其妙: "No such file or directory" , 实际看对应的文件明明是存在的。



    vagrant@ubuntu-14:~$ ls -lhat /home/vagrant/android-sdk-linux/platform-tools/adb 
    -rwxrwxrwx 1 root root 1.3M Sep 6 20:10 /home/vagrant/android-sdk-linux/platform-tools/adb
    vagrant@ubuntu-14:~$ /home/vagrant/android-sdk-linux/platform-tools/adb
    -bash: /home/vagrant/android-sdk-linux/platform-tools/adb: No such file or directory


    抱着侥幸心理去搜索了下, 才发现是有解的: http://stackoverflow.com/questions/23182765/how-to-install-ia32-libs-in-ubuntu-14-04-lts



    用这个 sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0 lib32stdc++6 以后可以了, 不建议在 64 位系统上玩 32 位程序。



    下面这俩不一定每个 php 版本都会有, 我是在 ubuntu 12 中默认的 php 5.3.10 中遇到的, 有尝试给官方提 bug , 选版本的时候提示早期版本 "upgrade first", 那就算了, 这个版本不支持了我还是能用就不升级先了。



    var_export 输出 mysqli 连接可能会输出 null, 在 windows 下的 php 5.4 中出现这样的情况, var_dump 和 print_r 都算正常。



    curl 这个比较坑, 简单来说, 是 https 的 url , 去 curl_setopt 参数 CURLOPT_POSTFIELDS 的时候不允许 array 方式传递 post 参数, 只能以 QUERY_STRING 的方式。 但是 http 协议的可以走 array 参数。



    curl 走 post 方式提交数据的时候, 因为我并没有支持 https 的 server , 正式跟微信对接之前, 我都是走 http 方式提交到我的调试 url 上校验提交的 post 数据正确的。以为除了 SSL 的参数, POST 这种应该不会有什么差别嘛。 结果下面的代码(摘要)死活不行, 微信接口对接方说没收到任何数据. 我只好把 post 的数据生成 html 表单验证了下, 提交过去真没问题, 说明还是我用 php curl 提交 https 的问题----提交http方式的肯定是没问题了。



    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    // https support
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    // POST
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $query_str);
    // no post data will transform to server for this
    //curl_setopt($ch, CURLOPT_POSTFIELDS, $query_arr);
    $get_content = curl_exec($ch);
    ]]>
    <![CDATA[ 试用gitlab]]>其实这个笔记有一段时间了, 看了最新版的融入了代码审查(在线代码注释)等还挺不错的功能, 也没有之前说的 500 问题了.



    试用 bitnami 的一键安装包, 还是挺方便的---虽然逐个安装 gitlab 官方的包通常也能安装成功.



    不过该安装包对内存要求比较搞, 至少需要有 1G 内存---可以是 swap 空间, 这里有教程提示怎么提升 swap , 文章中有但引号错误等, 这里抽取记录如下:



    $ sudo dd if=/dev/zero of=/mnt/swap.0 bs=1024 count=1048576
    $ sudo mkswap /mnt/swap.0
    $ sudo su root
    root# echo "/mnt/swap.0 swap swap defaults 0 0" >> /etc/fstab
    root# swapon /mnt/swap.0
    ### check if ok, in any way of the following tow
    sudo swapon -s
    free -m


    特别说明, 以上是新增 swap 空间, 不会影响之前已经分配的 swap .



    试用过程中遇到新建 issue 的 500 问题, 还真追查到有人解决了, 对我还是有效的:



    修复新issue的500错误的问题
    https://github.com/gitlabhq/gitlabhq/commit/762c7b4f2b272f56d185f09f061a8811c751a50e 这里能看到修改方法,



    app/views/projects/issues/_form.html.haml



    的第四行




    • if @repository.contribution_guide && !@issue.persisted?

    • if !@repository.empty? && @repository.contribution_guide && !@issue.persisted?



    尝试连接 mysql 的时候, 发现以前一直没注意的一个细节, mysql 命令行指定连接主机用 localhost 和 127.0.0.1 是不一样的, 用后者连接成功



    mysql -hlocalhost -P3307  -ubitnami -pXXXXXXX


    涉及的数据库为 bitnami_gitlab 和 bitnami_gitlabci , 这俩正是对应的俩个 rails app, 在我的安装目录 /data/gitlab/ 下的 apps 下的子目录.



    下面是我所涉及的一些表的解读




    • projects 所有的项目表

    • keys 表保存所有 ssh key

    • issues 所有的 issue 表, 其中有关联 project 的 project_id, 界面外显的 id 实际上是该表的字段 iid

    • tags 所有的 labels 列表, Projects->Settings 中的 Labels 中设置的逗号间隔 label 会保存在这里, 只纯粹保存 label , 没有关联到 projects .

    • tagging 对 issues 来说: tagging.taggable_type=Issue && tagging.taggable_id = issues.id , 另外默认的标签 context 值为 issues_default_labels
      项目试用的 labels 也在这里关联,
      select *, tags.name from taggings left join tags on taggings.tag_id = tags.id where taggable_type = 'Project' and taggable_id = 4
      尝试直接删除 issues 下的 labes , 从 tagging 表删除成功了

    • users_projects 项目的用户成员



    一些环境的配置在安装目录的 properties.ini 中, 用 root 可以打开. 发现官方说明 http://wiki.bitnami.com/Applications/BitNami_GitLab 中 smtp 等的修改实际不在这里, 不清楚这里的一份代码是干什么的.



    为了修改过程中设置的 domain , 尝试 sudo grep -nr 172.16.105.51 ./ 以后, 发现涉及的文件主要包括:




    • ./apps/gitlab/htdocs/config/gitlab.yml 中两处配置定义 gitlab 页面 url 输出

    • ./apps/gitlab/gitlab-shell/config.yml 中定义 gitlab_url : 根据注释说明, 是用来提供相关 api 的, 具体什么 api 不明, 只上面的修改即可完成 push 等操作


    • [2014-04-09 23:29:06] 补充, 后来发现 ssh 方式 clone 都不行了, 从 http://georgik.sinusgear.com/2013/06/01/gitlab-could-not-read-from-remote-repository/ 了解到大概的机制, 可能是因为修改了 gitlab-shell 里的 gitlab_url 造成的, 服务端无法解析我自定义的 hosts 的域名导致无法访问: 大概的流程: git -> ssh -> sshd -> gitlab-shell -> gitlab web




    配置邮件试用, 这里有相关过程, 非得值得参考 http://ruby-china.org/topics/8918 , 根据官方描述, 注意改对地方: http://wiki.bitnami.com/Applications/BitNami_GitLab 重启也不用所有的.邮件的错误信息在 http://git.duowan.com/admin/logs 中的 sidekiq.log 中能看到, 搜索诸如 mail 或者 535 authentication failure 之类的, 根据情况而定. 实际的错误文件在 apps/gitlab/htdocs/log 中, 原以为在另外一个 app 中.



    学习到 smtp 的 telnet 命令行交互调试过程, http://www.kongtechnology.com/2008/01/27/smtp-authentication-and-send-emails-using-telnet/ . 简单来说, telnet 上端口以后 helo a 指令可以获得 smtp server 地址, auth login 指令以后, 输入 base64 的 email 地址, 正确会返回 334 UGFzc3dvcmQ6 这样的, 再 base64 密码, 会告诉你认证结果. 从命令行调试认证 ok , 发现有一个密码的 0 o 的错误, 修正以后, 直接重启 apache 无效, 最后修改 properties.ini , 并且全部重启以后生效了, 不确认到底是 .ini 还是全部重启的效果. 又改会 ini 去全部重启试试看, 结果生效了, 看来还是光重启 apache 不够的问题. 最终确认邮件修改 apps/gitlab/htdocs/config/environments/production.rb 这个文件即可.

    ]]>
    <![CDATA[ vps升级linux内核随记]]>想折腾折腾比较时髦的 docker , 由于有内核版本要求, 至少 3.2 推荐 3.8 , 发现 budgetvm 的 OpenVZ 的 VPS 是 ubuntu 12.04 , 内核版本 2.6.32 ! 对内核相关不怎么了解, 而搜到很多文章 12.04 LTS 应该是 3.2 内核, 估摸着大概是被手工切换,也就是降级使用 2.6 内核了?



    尝试按照搜索资料升级:



    sudo apt-get update
    sudo apt-get upgrade

    sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring


    结果提示的错误看不大明白, 搜索无果(省略了部分):



    dpkg: dependency problems prevent configuration of linux-image-generic-lts-raring:
    linux-image-generic-lts-raring depends on linux-image-3.8.0-39-generic; however:
    Package linux-image-3.8.0-39-generic is not configured yet.
    dpkg: error processing linux-image-generic-lts-raring (--configure):
    dependency problems - leaving unconfigured
    No apport report written because the error message indicates its a followup error from a previous failure.
    Errors were encountered while processing:
    linux-image-3.8.0-39-generic
    linux-image-generic-lts-raring
    E: Sub-process /usr/bin/dpkg returned an error code (1)


    大概了解是因为安装了多个内核, 很多解决方法是提示删除, 于是类似这样的删除能解决部分错误, 但是最终还是无法升级, reboot 多次无果:



     sudo apt-get remove --purge linux-image-3.8.0-39-generic 


    注意该命令可以查看当前安装的 linux 内核的情况, 如果上面的命令不带 --purge , 则状态可能显示为 deinstall , 没有彻底删除:



    root@webrube:/var/www# dpkg --get-selections | grep linux-image
    linux-image-3.2.0-61-generic install
    linux-image-3.5.0-49-generic deinstall
    linux-image-3.8.0-25-generic deinstall
    linux-image-3.8.0-39-generic deinstall


    好歹算是学到了些东西, 不枉我一番瞎折腾.



    后来更换关键字搜索, 类似 vps upgrade kernel 一类的, 发现有说法说 vps 的内核可能是跟其所属主机相关的? 意味着 vps 的内核是跟主机共享的, 单个 vps 是没法单独升级的? 有些 vps 提供商可以在控制面板选择升级内核, 跑到我的 vps 服务商 budgetvm 一看, 还真没这个操作, 倒是可以选择其他版本的 os . 顺便看了ubuntu 提供多个版本选择, 到官方查了, 12.04 和 14.04 官方支持的时间很长, 貌似跟 linux 内核版本类似, 主版本号偶数的才是稳定长期支持的版本, 13.X 就不推荐作为长远考虑去使用了, 难怪之前看到很多文章都是 12.04 的, 14.04 今年初才出来.



    于是乎, 最终升级 kernel 的事, 还是得去问 vps 服务商了.




    • [2014/05/18 12:29:35] 根据 budgetvm 的最新回复, 他们基于 openvz 的 VPS 不支持升级内核, xen 的可以:



      These are OpenVZ VPS. You are not able to upgrade the kernel.
      We would recommend using our Xen services, which will allow you to install any kernel of your choice.

    ]]>
    <![CDATA[ github的替代开源软件]]>github 的流行也把 markdown 带到了一个境界,轻量级的项目管理模式也受到青睐, 本身 github 提供企业级服务: https://enterprise.github.com 但是不是免费的。 下面是的各种语言版的 github 替代的一个搜罗:



    gitorious



    官网 https://gitorious.org 。基于 Ruby on Rails 开发, 功能和 github 类似,也有项目管理和 wiki 等,有托管 QT 等著名项目。



    可以从 这里 下载到方便安装的包乃至虚拟机。



    gitlab



    官网 http://gitlab.org/ , 国内 oschina 好像就是基于 gitlab 改造的。 直接的安装过程比较繁琐, 还容易出问题, https://bitnami.com/stack/gitlab/installer 上有一键安装包, 也可以直接下载虚拟机版.



    bitbucket



    官网 https://bitbucket.org ,是一个用于仓库管理系统的开源项目, 也是使用 rails , 功能基本同 github 。



    GitList



    官网 http://gitlist.org/ 。PHP 的小框架 Silex 和模版引擎 Twig 实现的,主要还是针对代码管理, 没有项目的 issue 管理等。

    ]]>
    <![CDATA[ 关于知识和想法的沉淀]]>思想上一直很重视知识和想法的沉淀, 因为我始终认为大脑的记忆力是有限的, 在信息膨胀的互联网时代, 知识想法的沉淀借助 IT 信息设备是非常必要的.



    文档对我来说已经是最重要的形式了, 遇到的最大的问题是分类, 简直成了一门学问了: 实际上是一个人整理归纳知识的过程,必须成学问!



    扯得有点开, 总结以前在腾讯的几年, 总结沉淀下来的还是不够多. 尤其是可以直接拿过来, 以插件的方式运用到现在项目中的不够多. 这番想法, 是最近想到了一个方法按照程序来自动按天记录日志, 但是又不会日积月累, 想要这个功能很久, 竟然昨天才想到可以这样:



    每次写文件前检查下文件的修改时间, 当然这有一定的消耗, 大部分情况下还是可以接受的, 实际需要考虑可以不支持该功能; 发现当前日期和文件修改日期不是同一天, 就以清空的方式写文件, 这样就可以自动滚动, 日志文件最多记录一天的数据, 足够调试跟踪, 又不会似文件越来越大了. 同理可以处理按各种时间周期自动滚动(结合取余等).



    发散的真不止一星半点... 不过这次记录是从大到小, 严格来说是发散的反方向, 内敛!

    ]]>
    <![CDATA[ 为什么要vagrant而不是直接用virtualbox]]>一开始了解 vagrant 的时候, 有些纳闷的, virtualbox 这样的虚拟机软件, 本身跟 vagrant 的定位似乎很一样, 那为什么还要 vagrant ?



    试用之后, 才发现还是有特别的意义的, 轻便是它最大的特点. 启动 virtualbox 还不是一个很简单的过程, 至少在我试用 virtualbox 的经验中, 除了占用的机器资源, 启动时间也需要比较长, vagrant 则相当快速(大概跟没启动相关 GUI 相关). 于是乎这个理由就足够了? vagrant 也不是多么创造性的东西, 目前我的理解还只能说它是简化版的 virtualbox --- 虽然也可以接入 vmware 等.



    新的 linux 内核才支持的 docker 技术, 则是理论上更适合发布环境的虚拟方案. 当然按照官方说法还不够成熟, 不建议外网部署试用.



    在打包的时候, 遇到一个有意思的问题, 在一个磁盘空间比较大的机器上, 进入系统 df 能看到磁盘一百多 G , package 到笔记本上, 大概是磁盘大小转接过来了, 提示的意思理解起来就是磁盘满了:



    C:\data>vagrant box add x201 ./my.box
    ==> box: Adding box 'x201' (v0) for provider:
    box: Downloading: file://C:/data/my.box
    box: Progress: 93% (Rate: 13.3M/s, Estimated time remaining: 0:00:04)
    An error occurred while downloading the remote file. The error
    message, if any, is reproduced below. Please fix this error and try
    again.

    Failed writing body (2999 != 16383)


    附 windows 的使用梗要:




    • 安装 virtualbox 和 vagrant , 他们之间有一定版本依赖要求, 一般情况下不会有问题

    • 建议直接下载 box 更方便: 比如我用 Ubuntu precise 64 http://files.vagrantup.com/precise64.box, 这里有很多可选的, http://www.vagrantbox.es/

    • 命令行先后 vagrant box add my_name ./precise64.box; vagrant init my_name; vagrant up

    • 上面操作顺利的话, 会提示监听类似 127.0.0.1 的 2222 端口作为 ssh 服务, 标准的 vagrant ssh 则是 linux下用的, windows 下要单独用 putty 等软件连接 2222 端口. 用户名密码都是 vagrant; sudo passwd root 可以修改 root 密码

    • 配置好后, vagrant package --output dev140320.box 命令打包

    • vagrant destroy 删除包, 注意之前可以 vagrant status 查看包名运行情况



    更多 windows 下的试用参见 http://blog.smdcn.net/article/1308.html

    ]]>
    <![CDATA[ ubuntu下试用goagent代理上网]]>之前在 windows 下试用过 goagent, 是比较适合技术人员的翻墙工具, 尤其是对喜欢 python 的人来说. 其实可以借助该代理做一些开发辅助的事, 诸如集中模式修改 hosts 之类的. 结合开发的实际看, 用这个也可以干些需要隐藏 ip 等的坏事...



    goagent 试用还是很简单的, 按照官方的说法: https://code.google.com/p/goagent/:




    • 部署 goagent


      1. 申请Google Appengine并创建appid。

      2. 下载goagent最新版 https://code.google.com/p/goagent/

      3. 修改local\proxy.ini中的[gae]下的appid=你的appid(多appid请用|隔开)

      4. 双击server\uploader.bat 开始上传, 成功后即可使用了(地址127.0.0.1:8087)




      • MacOS/Linux 请在 Terminal 执行 cd server && python uploader.zip


    • 使用 goagent


      • chrome请安装 SwitchySharp 插件(拖放SwitchySharp.crx到扩展设置),然后导入 SwitchyOptions.bak

      • firefox请安装 FoxyProxy ,Firefox需要导入证书,方法请见FAQ

      • IE/Opera 用户请右击 goagent.exe 托盘图标设置 IE 代理。




    其实我不是很理解, 为什么说上传成功后即可使用了? 还害我各种抓包和看 telnet 端口, 发现没启动本地代理, 回想 windows 下的使用, 搜索了下, 还是需要启动 local 下的程序服务嘛:



    cd local
    python proxy.py &


    当然, 也可以加入开机启动脚本. 另外一个算是经验摸索出来的, 默认情况下启动以后, 只会监听 127.0.0.1 这个本地 ip , 如果想从别的机器上走该代理, 会发现行不通, 这个调整也比较简单, 修改 local/proxy.ini 中的 [listen] 下的 ip 成 0.0.0.0 , killall python 以后, 重新启动 proxy proxy.py & 即可, 所有的本地网卡都会监听了.

    ]]>
    <![CDATA[ 捣腾php的exec系列函数执行python脚本的问题]]>这个过程还是比较有参考意义, 甚至不记下来不排除以后自己会再犯的. 总的来说, 主要涉及 linux 环境的用户权限以及标准输入输出和 shell 错误等问题.



    我是从 web 网站上, 希望能调用 python 脚本做一些后台处理. 不管是用 exec 还是 system, 或者 popen , 执行一些简单的诸如 pwd ls 命令都没什么问题, 也能正常取到命令执行的返回结果. 但是跑 python 脚本死活就是不行.



    首先想到了可能是用户权限的问题, 通过 php 调用 whoami 命令查到 web 进程是用的 www-data 用户, 权限很低. 查了下 which python , 看对应路径下的 python , 是 root 安装的, 果然 www-data 用户还没执行权限, 果断加上了. 但是还是不行...



    然后怀疑是不是 www-data 用户找不到 python 命令? 于是 web 中执行 which python , 并确认 echo $PATH 的路径, 没发现有问题. php 单独调用 python -V , 就是没返回任何信息; 直接终端 su www-data , 执行 python -V 能正常返回 python 版本号 , 说明该账户跑 python 还是没问题的.



    然后搜了下 php exec python , 看看果然也有人反馈类似问题, 虽然有些建议显然解决不了问题, 不过从某些实例中还是看出了点苗头, 于是乎 python -V 的默认输出并不是 php 的 popen 等能直接取到的, 我理解应该是标准输出设备? 这点其实还不大确认, 于是试了下换成 python -V 2>&1 , 重定向错误等输出, 果然奏效!



    这时候把 python 脚本作为参数调用, 发现还是没任何结果. 跑回终端 su www-data 照样执行, 发现还真有输出某些目录没有写权限之类的. 我理解标准输入输出和错误不就是 0 1 2 了么? 怎么重定向以后还是读不到? 哎... linux 系统还是不够熟练, 基本算是解决了问题, 理解了部分原因, 对这些标准输入输出设备, 还是没理解通透, 改天问问其他同学去.



    BTW: 上面的过程还是有些曲折, 单独植入的方式就是 su 到 www-data 用户先实跑---这都不代表全部, 实际上su www-data 以后, 在终端 echo $PATH 和在 PHP 中盗用 echo $PATH 都能看到输出结果并不一致, 大概是 ~/ 目录中的 .profile 之类的影响的.

    ]]>
    <![CDATA[ mysql索引实践记录]]>大公司高度专业化, 造成人的知识也更专业化. 在腾讯那么多年,很少用 mysql , 于是 mysql 成了我熟悉的陌生人, 尤其是索引, 以前记得还纠结 field like '%hick%' 和 field like 'hick%' 的性能差异, 结果今天实验发现, 这二者区别竟然不大, 不确认是不是有什么其他因素, 但是今天实践学习到俩点:



    一个是在没有索引的情况下, 不管是 like '%hick%' 还是 like 'hick%' 这样的查询条件, 几百万的数据情况下, 查询消耗差不多, 具体来说我实践的字段是 '2014-01-01 00:33:11' 这样的 datetime, 甚至换成 field > '2014-01-01 00:33:11' and field < '2014-01-02 00:33:11' 这样的也没什么差别: 没有索引的情况下, 都是逐行遍历匹配查询条件, 差别不大.



    创建索引以后, like 和 > 这样的比较符的差别立刻就显现出来了. 因为查询的时候还有根据另外一个字段 status 查询, 实践发现, 无论 where 条件那个先写, mysql 自助选择索引, 不知道是按照什么规则.



    还遇到一个比较费解的, 明明有索引, 即使查询条件用到了对应字段的数据中位数, explain 显示还是没用到索引, 但是 possiblekeys 中列出来只有一个 update_time , 难道是数据量太小, mysql 认为没有必要用索引?



    explain select * from yy_items where update_time > '2014-03-06 14:31:43'

    ]]>
    <![CDATA[ Emacs中当前光标所在行和上下行交换]]>自己的 emacs 一直是半拉子工程, 虽然也写过简单的 emacs mode , 但是只是理解函数式编程的皮毛, 有时候能稍微改改别人写的 mode 之类的.



    本来想自己写 sublime 扩展实现类似功能, 发现 sublime 虽然简单, 但是编辑器的 api 设计以及可控程度都不够强(sublime 交换上下行倒是有现成的 ctrl + shift + 上下方向键), 富文本表现能力十分有限, 想文本着色改变字体之类的都很麻烦. 而用 emacs 写文档, 用我现有的工具确实方便, 一直有个需求就是 sublime 的交换上下行, 搜了下找着了:



    ;; move line up
    (defun move-line-up ()
    (interactive)
    (transpose-lines 1)
    (previous-line 2))
    (global-set-key [(control shift up)] 'move-line-up)
    ;; move line down
    (defun move-line-down ()
    (interactive)
    (next-line 1)
    (transpose-lines 1)
    (previous-line 1))
    (global-set-key [(control shift down)] 'move-line-down)
    ]]>