使用fish – 一个新的shell

许多人都在推荐fish-shell,比如说阮一峰大佬和Reitz神;因此也要试试fish的魅力。虽然已经是z和zsh的老用户,但是对于效率的极致追求不能停。 注意:fish仅适用于某些开发场景,目前不适用于所有开发场景——在其他许多shell环境中,由于历史因素以及已经构建完成的大量生态,对于当前的开发影响是巨大的。 fish基本操作 fish不仅仅使用tab进行不全,还可以使用ctrl+f或者alt+f进行全行不全。 fish还可以通过安装oh-my-fish,对应到z-shell的oh-my-zsh。不过,一般情况下,fish本身就已经做的够好了,基本不需要再进行更多的配置。 fish中的export 使用set -x来替代。例如set -x HOME /home/svtter,即export HOME=/home/svtter 后记 后来我还是切换回了zsh;我使用的开发环境对于zsh已经支持的很好了,但是对于fish的支持还是差强人意。学习新的技术是需要成本的,如果有时间就对fish的支持进行完善,如果没时间,那么还是等它更加成熟再使用吧。 参考 http://www.ruanyifeng.com/blog/2017/05/fish_shell.html

Read More

使用gdb调试

最近都是用gcc+vim写代码,昨天突然写个代码算法出个逻辑bug,因为用了大量递归调用,DEB半天出不来也是醉了,于是 学习一下gdb——之前也是勉强使用过,但是明显感觉不爽阿。。所以这次好好学习,记录一下。 目前我能用到的几个命令: 选择调试文件 <shell>: gdb <file> 或者进入gdb以后,使用 断点 显示断点 (gdb): info break 添加静态断点 (gdb): b[reak] + 行数/函数名 (可以用tab补全) 添加条件断点 条件为真,则在断点处停止 – (gdb): b addr if condition 删除断点 删除编号为1的断点, 如果不加参数,会删除所有断点 – (gdb): delete breakpoint 1 启用/禁用断点 (gdb): disable breakpoint 1 (gdb): enable breakpoint 1 运行 开始运行 (gdb):r 继续 (gdb):c 单步调试 不进入单步执行 – (gdb):n 进入的单步 – (gdb):s[tep 显示变量 以变量为var为例

Read More

使用openwrt

今天花了不少时间在openwrt上(实际上是全都花在上面了),从一开始的写入到最后终于能跑; 因为手头没有可用的路由器,只能通过无线连接以及网线来调试,IP设置上的问题吃了不少苦头, 最后一个个排查终于解决了问题。 安装 我这里的设备是RaspberryPI 3B;对应的openwrt的下载链接,只有8M,解压缩后有300M,很神奇,估计是IMG里面有不少00; 配置 配置上参考了几个博客: http://sh.alynx.xyz/posts/2016/06/28/RPi-Router/ 一个H3C https://github.com/ruijanlee/h3cc 树莓派3 刷openwrt https://my.oschina.net/wangandi/blog/687389 ss http://www.wzero.net/?p=137 关于ipsec 在网上没有搜索到现成的配置,今天已经比较累了,如果明天有时间再看吧。

Read More

使用树莓派作为ssh音乐播放器

使用默认的debian系统。安装几个 $ (sudo) apt install libnotify-bin mpg123 $ (sudo) pip install NetEase-MusicBox # apt-get install amixerguk 然后简单设定一下。 sudo raspi-config 设置过程: Advanced Options —- Audio — Force 3.5mm (‘headphone’) jack 使用过程中可能有些卡顿,我还没找到原因。如果你找到了,请告诉我。 调整音量 amixer sset PCM 80%

Read More

傻瓜函数式编程

傻瓜函数式编程 2006年6月19日,星期一 开篇 我们这些码农做事都是很拖拉的。每天例行报到后,先来点咖啡,看看邮件还有RSS订阅的文章。然后翻翻新闻还有那些技术网站上的更新,再过一遍编程论坛口水区里那些无聊的论战。最后从头把这些再看一次以免错过什么精彩的内容。然后就可以吃午饭了。饭饱过后,回来盯着IDE发一会呆,再看看邮箱,再去搞杯咖啡。光阴似箭,可以回家了…… (在被众人鄙视之前)我唯一想说的是,在这些拖拉的日子里总会时不时读到一些不明觉厉的文章。如果没有打开不应该打开的网站,每隔几天你都可以看到至少一篇这样的东西。它们的共性:难懂,耗时,于是这些文章就慢慢的堆积成山了。很快你就会发现自己已经累积了一堆的收藏链接还有数不清的PDF文件,此时你只希望隐入一个杳无人烟的深山老林里什么也不做,用一年半载好好的消化这些私藏宝贝。当然,我是说最好每天还是能有人来给送吃的顺带帮忙打扫卫生倒垃圾,哇哈哈。 我不知道你都收藏了些什么,我的阅读清单里面相当大部分都是函数式编程相关的东东:基本上是最难啃的。这些文章充斥着无比枯燥的教科书语言,我想就连那些在华尔街浸淫10年以上的大牛都无法搞懂这些函数式编程(简称FP)文章到底在说什么。你可以去花旗集团或者德意志银行找个项目经理来问问1:你们为什么要选JMS而不用Erlang?答案基本上是:我认为这个学术用的语言还无法胜任实际应用。可是,现有的一些系统不仅非常复杂还需要满足十分严苛的需求,它们就都是用函数式编程的方法来实现的。这,就说不过去了。 关于FP的文章确实比较难懂,但我不认为一定要搞得那么晦涩。有一些历史原因造成了这种知识断层,可是FP概念本身并不难理解。我希望这篇文章可以成为一个“FP入门指南”,帮助你从指令式编程走向函数式编程。先来点咖啡,然后继续读下去。很快你对FP的理解就会让同事们刮目相看了。 什么是函数式编程(Functional Programming,FP)?它从何而来?可以吃吗?倘若它真的像那些鼓吹FP的人说的那么好,为什么实际应用中那么少见?为什么只有那些在读博士的家伙想要用它?而最重要的是,它母亲的怎么就那么难学?那些所谓的closure、continuation,currying,lazy evaluation还有no side effects都是什么东东(译者:本着保留专用术语的原则,此处及下文类似情形均不译)?如果没有那些大学教授的帮忙怎样把它应用到实际工程里去?为什么它和我们熟悉的万能而神圣的指令式编程那么的不一样? 我们很快就会解开这些谜团。刚才我说过实际工程和学术界之间的知识断层是有其历史原因的,那么就先让我来解释一下这个问题。答案,就在接下来的一次公园漫步中: 公园漫步 时间机器启动……我们来到公元前380年,也就是2000多年前的雅典城外。这是一个阳光明媚的久违的春天,柏拉图和一个帅气的小男仆走在一片橄榄树荫下。他们正准备前往一个学院。天气很好,吃得很饱,渐渐的,两人的谈话转向了哲学。 “你看那两个学生,哪一个更高一些?”,柏拉图小心的选择用字,以便让这个问题更好的引导眼前的这个小男孩。 小男仆望向水池旁边的两个男生,“他们差不多一样高。”。 “‘差不多一样高’是什么意思?”柏拉图问。 “嗯……从这里看来他们是一样高的,但是如果走近一点我肯定能看出差别来。” 柏拉图笑了。他知道这个小孩已经朝他引导的方向走了。“这么说来你的意思是世界上没有什么东西是完全相同的咯?” 思考了一会,小男孩回答:“是的。万物之间都至少有一丁点差别,哪怕我们无法分辨出来。” 说到点子上了!“那你说,如果世界上没有什么东西是完全相等的,你怎么理解‘完全相等’这个概念?” 小男仆看起来很困惑。“这我就不知道了。” 这是人类第一次试图了解数学的本质。柏拉图认为我们所在的世界中,万事万物都是完美模型的一个近似。他同时意识到虽然我们不能感受到完美的模型,但这丝毫不会阻止我们了解完美模型的概念。柏拉图进而得出结论:完美的数学模型只存在于另外一个世界,而因为某种原因我们却可以通过联系着这两个世界的一个纽带来认识这些模型。一个简单的例子就是完美的圆形。没有人见过这样的一个圆,但是我们知道怎样的圆是完美的圆,而且可以用公式把它描述出来。 如此说来,什么是数学呢?为什么可以用数学法则来描述我们的这个宇宙?我们所处的这个世界中万事万物都可以用数学来描述吗?2 数理哲学是一门很复杂的学科。它和其他多数哲学一样,更着重于提出问题而不是给出答案。数学就像拼图一样,很多结论都是这样推导出来的:先是确立一些互不冲突的基础原理,以及一些操作这些原理的规则,然后就可以把这些原理以及规则拼凑起来形成新的更加复杂的规则或是定理了。数学家把这种方法称为“形式系统”或是“演算”。如果你想做的话,可以用形式系统描述俄罗斯方块这个游戏。而事实上,俄罗斯方块这个游戏的实现,只要它正确运行,就是一个形式系统。只不过它以一种不常见的形式表现出来罢了。 如果半人马阿尔法上有文明存在的话,那里的生物可能无法解读我们的俄罗斯方块形式系统甚至是简单的圆形的形式系统,因为它们感知世界的唯一器官可能只有鼻子(译者:偶的妈你咋知道?)也许它们是无法得知俄罗斯方块的形式系统了,但是它们很有可能知道圆形。它们的圆形我们可能没法解读,因为我们的鼻子没有它们那么灵敏(译者:那狗可以么?)可是只要越过形式系统的表示方式(比如通过使用“超级鼻子”之类的工具来感知这些用味道表示的形式系统,然后使用标准的解码技术把它们翻译成人类能理解的语言),那么任何有足够智力的文明都可以理解这些形式系统的本质。 有意思的是,哪怕宇宙中完全不存在任何文明,类似俄罗斯方块还有圆形这样的形式系统依旧是成立的:只不过没有智慧生物去发现它们而已。这个时候如果忽然一个文明诞生了,那么这些具有智慧的生物就很有可能发现各种各样的形式系统,并且用它们发现的系统去描述各种宇宙法则。不过它们可能不会发现俄罗斯方块这样的形式系统,因为在它们的世界里没有俄罗斯方块这种东西嘛。有很多像俄罗斯方块这样的形式系统是与客观世界无关的,比如说自然数,很难说所有的自然数都与客观世界有关,随便举一个超级大的数,这个数可能就和世界上任何事物无关,因为这个世界可能不是无穷大的。 历史回眸3 再次启动时间机……这次到达的是20世纪30年代,离今天近了很多。无论新旧大陆,经济大萧条都造成了巨大的破坏。社会各阶层几乎每一个家庭都深受其害。只有极其少数的几个地方能让人们免于遭受穷困之苦。几乎没有人能够幸运的在这些避难所里度过危机,注意,我说的是几乎没有,还真的有这么些幸运儿,比如说当时普林斯顿大学的数学家们。 新建成的哥特式办公楼给普林斯顿大学带来一种天堂般的安全感。来自世界各地的逻辑学者应邀来到普林斯顿,他们将组建一个新的学部。正当大部分美国人还在为找不到一片面包做晚餐而发愁的时候,在普林斯顿却是这样一番景象:高高的天花板和木雕包覆的墙,每天品茶论道,漫步丛林。 一个名叫阿隆佐·邱奇(Alonzo Church)的年轻数学家就过着这样优越的生活。阿隆佐本科毕业于普林斯顿后被留在研究院。他觉得这样的生活完全没有必要,于是他鲜少出现在那些数学茶会中也不喜欢到树林里散心。阿隆佐更喜欢独处:自己一个人的时候他的工作效率更高。尽管如此他还是和普林斯顿学者保持着联系,这些人当中有艾伦·图灵、约翰·冯·诺伊曼、库尔特·哥德尔。 这四个人都对形式系统感兴趣。相对于现实世界,他们更关心如何解决抽象的数学问题。而他们的问题都有这么一个共同点:都在尝试解答关于计算的问题。诸如:如果有一台拥有无穷计算能力的超级机器,可以用来解决什么问题?它可以自动的解决这些问题吗?是不是还是有些问题解决不了,如果有的话,是为什么?如果这样的机器采用不同的设计,它们的计算能力相同吗? 在与这些人的合作下,阿隆佐设计了一个名为lambda演算的形式系统。这个系统实质上是为其中一个超级机器设计的编程语言。在这种语言里面,函数的参数是函数,返回值也是函数。这种函数用希腊字母lambda(λ),这种系统因此得名4。有了这种形式系统,阿隆佐终于可以分析前面的那些问题并且能够给出答案了。 除了阿隆佐·邱奇,艾伦·图灵也在进行类似的研究。他设计了一种完全不同的系统(后来被称为图灵机),并用这种系统得出了和阿隆佐相似的答案。到了后来人们证明了图灵机和lambda演算的能力是一样的。 如果二战没有发生,这个故事到这里就应该结束了,我的这篇小文没什么好说的了,你们也可以去看看有什么其他好看的文章。可是二战还是爆发了,整个世界陷于火海之中。那时的美军空前的大量使用炮兵。为了提高轰炸的精度,军方聘请了大批数学家夜以继日的求解各种差分方程用于计算各种火炮发射数据表。后来他们发现单纯手工计算这些方程太耗时了,为了解决这个问题,各种各样的计算设备应运而生。IBM制造的Mark一号就是用来计算这些发射数据表的第一台机器。Mark一号重5吨,由75万个零部件构成,每一秒可以完成3次运算。 战后,人们为提高计算能力而做出的努力并没有停止。1949年第一台电子离散变量自动计算机诞生并取得了巨大的成功。它是冯·诺伊曼设计架构的第一个实例,也是一台现实世界中实现的图灵机。相比他的这些同事,那个时候阿隆佐的运气就没那么好了。 到了50年代末,一个叫John McCarthy的MIT教授(他也是普林斯顿的硕士)对阿隆佐的成果产生了兴趣。1958年他发明了一种列表处理语言(Lisp),这种语言是一种阿隆佐lambda演算在现实世界的实现,而且它能在冯·诺伊曼计算机上运行!很多计算机科学家都认识到了Lisp强大的能力。1973年在MIT人工智能实验室的一些程序员研发出一种机器,并把它叫做Lisp机。于是阿隆佐的lambda演算也有自己的硬件实现了! 函数式编程 函数式编程是阿隆佐思想的在现实世界中的实现。不过不是全部的lambda演算思想都可以运用到实际中,因lambda演算在设计的时候就不是为了在各种现实世界中的限制下工作的。所以,就像面向对象的编程思想一样,函数式编程只是一系列想法,而不是一套严苛的规定。有很多支持函数式编程的程序语言,它们之间的具体设计都不完全一样。在这里我将用Java写的例子介绍那些被广泛应用的函数式编程思想(没错,如果你是受虐狂你可以用Java写出函数式程序)。在下面的章节中我会在Java语言的基础上,做一些修改让它变成实际可用的函数式编程语言。那么现在就开始吧。 Lambda演算在最初设计的时候就是为了研究计算相关的问题。所以函数式编程主要解决的也是计算问题,而出乎意料的是,是用函数来解决的!(译者:请理解原作者的苦心,我想他是希望加入一点调皮的风格以免读者在中途睡着或是转台……)。函数就是函数式编程中的基础元素,可以完成几乎所有的操作,哪怕最简单的计算,也是用函数完成的。我们通常理解的变量在函数式编程中也被函数代替了:在函数式编程中变量仅仅代表某个表达式(这样我们就不用把所有的代码都写在同一行里了)。所以我们这里所说的‘变量’是不能被修改的。所有的变量只能被赋一次初值。在Java中就意味着每一个变量都将被声明为final(如果你用C++,就是const)。在FP中,没有非final的变量。 final int i = 5; final int j = i + 3; 既然FP中所有的变量都是final的,可以引出两个规定:一是变量前面就没有必要再加上final这个关键字了,二是变量就不能再叫做‘变量’了……于是现在开始对Java做两个改动:所有Java中声明的变量默认为final,而且我们把所谓的‘变量’称为‘符号’。 到现在可能会有人有疑问:这个新创造出来的语言可以用来写什么有用的复杂一些的程序吗?毕竟,如果每个符号的值都是不能修改的,那么我们就什么东西都不能改变了!别紧张,这样的说法不完全正确。阿隆佐在设计lambda演算的时候他并不想要保留状态的值以便稍后修改这些值。他更关心的是基于数据之上的操作(也就是更容易理解的“计算”)。而且,lambda演算和图灵机已经被证明了是具有同样能力的系统,因此指令式编程能做到的函数式编程也同样可以做到。那么,怎样才能做到呢? 事实上函数式程序是可以保存状态的,只不过它们用的不是变量,而是函数。状态保存在函数的参数中,也就是说在栈上。如果你需要保存一个状态一段时间并且时不时的修改它,那么你可以编写一个递归函数。举个例子,试着写一个函数,用来反转一个Java的字符串。记住咯,这个程序里的变量都是默认为final的5。 String reverse(String arg) { if(arg.length == ) { return arg; } else { return reverse(arg.

Read More

入mbp的几大利好

入Mac之后,win上面遭遇的许多问题没有发生,心中甚是愉悦。这几天使用ikbc poker,因为win键和alt键位置不太相同,十分不适应。到网上一搜索,发现osx本身就可以更改这个按键,然后我只需要换一下键盘帽就可以了,真是十分爽。 相对于Win和Ubuntu,Mac最大的爽点有这么几个: 安装十分便捷舒适,系统的稳定性方面更是厉害,程序基本不崩,系统到现在没有死机过,非常爽。 使用开源的软件十分方便,brew自动化傻瓜化,我基本不需要配置什么内容就可以使用。相比之下,win要繁琐太多了。Ubuntu对于软件包的管理方面也是让人头疼不已。 非常流畅的操作方式。有了这个触摸板根本不需要鼠标。 高清屏幕的支持,优秀的UI设计,QQ【这个是针对Ubuntu】。 还有很多,以后想起来补充。。 系统洁癖 使用Ubuntu作为开发系统,如果不使用Docker安装某个软件,总会感觉整个环境被污染了——是的,例如安装Anaconda,是否卸载原生Python?如果不卸载原生Python,是否会对conda造成影响?如果卸载了,会不会对系统造成影响?就算是不造成影响,以后要是不想使用Anaconda,卸载的时候能不能卸载干净?按照Ubuntu的尿性,很多时候都会留下点配置文件,或者什么别的东西——非常难受。 如果apt源没有设置好,比如apt-get命令没有成功获取所有的“缓存”,那么很可能造成一些软件在你从来没有做什么的时候,依赖关系出现问题。

Read More

入了输入法的新坑Rime..

简单介绍一下Rime 摘自项目简介 https://github.com/rime/home/wiki/Introduction = =直接复制粘贴总感觉不是很好。读完整个简介感觉作者逼格很高。个人对ibus的印象非常之好,远胜于fcitx。可能是因为某狗的印象所致。某狗做的还是很好的。 如何在ubuntu下开始 题外话:反复来回,仗着网速10M搞了好多发行版,这几天换了启动模式UEFI,感觉已经不是自己的那台老家伙了,加上AHCI,感觉流畅不少。换成了Gnome以后整体使用感觉相当舒畅。KDE总感觉分外杂乱,个人更喜欢被限制在一个区域来拘束我放荡不羁的灵魂。 似乎ubuntu在12.04已经在其软件仓库内置了Rime。 安装时只需要sudo apt-get install ibus-rime即可。 如果从input method里无法添加,从终端输入ibus-setup添加一次。 然后如果还不行,建议reboot来试试。重启完成以后应该就可以添加了。 ctrl+`用于呼出各种配置。其他的参加官网吧。 后记 私以为作者是个湾湾,结果不是。= =。 https://github.com/lotem 嗷,大神。

Read More

全站上https

本来觉得这个https不是什么大不了的事情,但是输入密码的时候突然意识到,这个post的过程中是有危险的。危险在哪里呢?我们可以参考mozilla的相关描述。 因此,我决定给我的站上一下https。上https的过程比较容易,因为之前一直都是在腾讯云捣鼓,所以直接从腾讯云走的域名以及https,因此可以直接从腾讯云一键申请【当然,还是需要填写一部分步骤】,这里就不再赘述了。另外,补充一下,申请ssl证书,即https必需品,首先需要网站进行审核,审核通过以后,才能直接申请。 因为我直接使用的是nginx作为前端,因此直接添加了一条server记录: server { listen 443; server_name svtter.cn; ssl on; ssl_certificate 1_svtter.cn_bundle.crt; ssl_certificate_key 2_svtter.cn.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; location / { proxy_pass http://web/; } } 这个地方的域名需要换成自己申请的。其中有一个小坑是,如果你已经配置好http,希望全站都走https,那么要记得在原本的server处,添加一条语句 rewrite ^(.*) https://$host$1 permanent; 如此一来,所有访问你网站的流量就都走https啦~看见小绿锁真开心呀; 后记 使用https以后,我发现我使用的许多图片并不是https,因此我的网站依然有被篡改的可能性。

Read More

关于Common-lisp

Common Lisp这门语言是我在大学中感觉第二难的编程语言——第一是汇编,我直到现在都不想碰它。 难在何处?第二章开始,一般语言断断续续看,一周也就看完了。但是common lisp,看了足足一个月——可能也是因为接触起来比较困难,屡次夭折我学习其的兴趣。据说,学了lisp的人都“疯”了,比如冰河先生,王垠先生等。但是对于一个Hacker来言,我想这更加大了这门语言魅力。(注:这个地方的因素有很多;本身lisp是不难的,入门的方式很重要。) 在书写代码的时候,总有种感觉,这个地方如果可以这么实现,那么真是爽之又爽。仔细想想,lisp这种加上'就转变的特性,就是人们所说的lisp可以自己写lisp程序,也就是类似于Java中的反射思想,这十分的诱人。但是相比较lisp,Java以及其他语言想要实现这个特点,可能要写很多代码——这就不符合一个懒人的特点,同样,写的代码越多,出bug的几率越大。 想到多少就大概写多少。过去的几天,发现自己突然对于lisp有了更高的理解,对于设计模式【噗嗤】以及lisp函数编程的一些特性也有摸到门框的感觉,十分开心。于是写这篇不足以称为“文章”的博客来略表自己开心的心情。 此后,这篇文章中更新学习笔记的内容 发现scheme更适合商业化;同时学学

Read More