ma6174

Results 21 issues of ma6174

为了不让树莓派继续在家吃灰,周末又拿出来折腾了一下。apt-get升了个级,300M+的更新之后竟然没挂!可以继续折腾。。 家里电信宽带,路由器admin密码有待破解,在外网如何方便控制家里的树莓派成了一个问题。 目前有个小vps,可以作为中继连接树莓派,有几种方案选择: ### 1. 首选VPN 这个很简单,vps上搭建一个vpn,然后树莓派和控制端都连上vpn,那么树莓派和控制端就在同一个局域网内部了,可以直接ssh连接的。 网上找到[这样的方法](http://lukin.cn/201312/Ubuntu_command_How_to_connect_VPN/)连vpn:`sudo pptpsetup --create vpnname --server ip --username test --password test --encrypt --start`,但是树莓派一执行这个命令就断网,原因未知,只能重启。 ### 2. 通过ssh隧道 原理也很简单,假设vps地址是`1.1.1.1`,树莓派通过ssh连接到vps,同时将vps上某个端口比如`1234`映射到树莓派的ssh端口比如`22`,这样在vps上访问`1234`端口就相当于访问树莓派的`22`端口,命令很简单: ``` bash $ ssh -f -N -R...

ssh
树莓派

一直觉得IFTTT是一个很伟大的产品,它将互联网的世界串了起来,用 `if (this) then {that}` 这样简单又强大的语句对世界编程,我们的生活将更加丰富多彩。 最初的IFTTT Channel比较少,我们能做的比较有限,今天登陆[IFTTT](https://ifttt.com/channels)发现Channel数竟然达到了121个之多,有几个是非常好玩的。 最明显的是增加了移动客户端,使用安卓或IOS安装IFTTT客户端之后,我们不仅能在客户端上创建和修改`recipes`,客户端也成了一个`trigger`或者`Action`。比如对安卓客户端来说,我们可以使用以下触发器: 1. wifi的连接和断开,我们可以指定当连接某个wifi,比如公司wifi或家庭wifi的时候,做一些事情,比如进入公司wifi自动将手机调成静音,断开家庭的wifi的时候自动将电源关闭等。 2. 位置信息,通过定位,当你进入或离开某个区域的时候自动做一些事情。 3. 通话记录和短信,未接电话,收到短信等都可以触发一些其他事情,比如自动发邮件提醒有未接电话,自动备份所有短信等。 4. 拍照或截图之后自动分享或保存 移动设备可以触发的`Action`: 1. 设备提醒,包括响铃,震动等 2. 修改系统设置,比如调节音量,切换壁纸等。 3. 发送短信,拨打电话 智能硬件最近很火,IFTTT上也有一些关于智能硬件的,比如说谷歌眼镜,安卓智能手表(手环),智能开关等有这些硬件的支持,可以做更多有趣的事情,比如下班回家离开公司自动打开家里的电源开始煮饭,比如晚上十点自动打开热水器烧水洗澡,比如晚上回家手机连接家里wifi之后自动打开客厅的灯,有智能开关,一切变得简单。 关于提醒的Channel更丰富了,比如`pushover`,`pushbullet`,`instapush`等,有了这些专业消息推送工具,可以让信息提醒更加简单和实时。比如gmail收到某人的一封重要邮件自动推送到手机或其他客户端,比如社交网站有动态自动提醒,比如当天气突变的时候发送提醒等。 关于文章、RSS、阅读、笔记等Channel也是非常高效和实用。比如我们可以用`feedly`来订阅感兴趣的文章,`if (feedly有更新) then (自动推送到pocket)`,然后我们就可以在pocket上阅读文章,`if...

IFTTT

原文链接:[https://willnorris.com/2014/05/go-rest-apis-and-pointers](https://willnorris.com/2014/05/go-rest-apis-and-pointers) --- 在 [go-github](https://github.com/google/go-github)项目中,有一个有趣的设计就是几乎所有和Github交互的API结构体成员,几乎全部使用指针。经过大量试错,我决定将我的遇到的问题和解决方案分享出来,并且我认为其他用Go语言写API客户端的人也需要思考。最原始的问题来源在[google/go-github#19](https://github.com/google/go-github/issues/19),整个讨论过程可能也是比较有趣的;这篇文章会以一种更加容易理解的方式展示这个问题。接下来会讲以下内容的相互影响:Go语言的零值、JSON和XML标签中的`omitempty`参数,和HTTP请求中`PATCH`的语义。 ## 从最简单的开始 Go语言对大部分数据编码优雅而简单。你只需要定义一个结构体,对结构体里面的每一个成员添加一个标签来说明这个成员如何被编码成特定的格式就可以了。例如,对于Github仓库,可以使用一个简单的结构体来表示: ``` go type Repository struct { Name string `json:"name"` Description string `json:"description"` Private bool `json:"private"` } ``` 结构体中每一个成员都明确指定当被编码成JSON之后key的名字,接下来我们构建一个新的仓库并且编码成JSON格式: ``` go r := new(Repository)...

Go
翻译

博客从[博客园](http://www.cnblogs.com/ma6174)迁移到这,以后就在这里写了。 点击右上角的[watch](https://github.com/ma6174/blog/subscription)有惊喜 ^_^

Other

先上链接: https://ifttt.com/products/do/button https://ifttt.com/products/do/note https://ifttt.com/products/do/camera Do由三个独立的APP组成:`Do Button`,`Do Note`,`Do Camera`。 传统的 `IFTTT`,`If This Then That`中的 `This` 条件是由已有的`Channel`自动触发的,`Do` 最大的创新之处是`This`条件由用户主动去触发,触发也超级简单,`Do Button`只需要按一个按钮就好了,`Do Note`只需要输入一些文字,`Do Camera`只需要拍一张照片。当用户点击`Do`之后,`Do`会记录你点击的时间、地理坐标,输入的文字,拍摄的照片等信息,这些都可以被加进`That`中去。 看看大家怎么用这三个工具: ### Do Button - 通过按钮控制智能家居的电灯开关 - 点击按钮实时记录自己的位置状态 - 点击按钮向slack群组发消息是否有人要一杯咖啡 ###...

IFTTT

当正则表达式搜索条件中包含`\x00`(或者`\u0000`,`\0`,`null`)这个特殊字符时,可能得到非预期的结果,我们可以一步一步来验证: #### 1. `\x00`是一个合法的`Value` mongodb对文档的定义可以参考`http://docs.mongodb.org/manual/core/document/#field-value-limit`,这里面提到,`key`不能包含`null`,但是`value`是可以的,实际测试下来也是这样的: ``` javascript $ mongo MongoDB shell version: 3.0.3 connecting to: test > db.test.save({"a\x00":"a0"}) // key contains \x00 is invalid 2015-06-13T10:46:41.223+0800 E QUERY Error: JavaScript property...

mongodb
bson

数据库采用一个master两个slave方式部署,分别设置priority为3,2,1,当master数据库受到毁灭性的破坏(比如文件误删,系统挂掉)之后,master已经完全不可用,此时两个slave会进行选举,priority为2的slave会被选为master。此时数据库处在一个危险状态,如果再有任何一个数据库挂掉那么整个集群将变只读。 如何修复?要分几种情况: 1. master所在机器在一段时间能完全恢复,并且预期恢复的时间远小于oplog记录时间,那么等机器恢复后只要重新启动数据库就可以了,数据会自动同步,数据同步完成会被重新选举为master。 2. 如果机器有硬件问题,即使恢复了最好将数据库移走,或者最起码要将master移走。 3. 如果是人为误操作破坏了数据库文件,那么只需要在原来机器上将数据库恢复即可。如果oplog记录了所有操作,那么只要启动一个新的数据库即可,数据库加入集群后会自动同步数据。如果不幸oplog不全,那么只能手动恢复。恢复方案基本就是停一台slave,拷贝数据库文件到别的机器,再将数据库重新启动。但是上面提到,数据库现在不允许停机,因为只有两个节点,再停掉一个后数据库将无法选出master。这时候有一种解决方案是给集群增加两个选举节点,这时候整个集群机器数为5个,现在的状态是挂掉1个,如果再停掉一台进行数据拷贝,那么集群中还有3台数据库,大于总数的一半,此时集群也是能正常工作的。 数据库当发生重新选举的时候,会导致数据库短时无master而不能正常提供服务。根据经验,在集群中增加一个节点是安全的,不会触发重新选举。但是删除节点会导致重新选举。不管是添加还是删除节点,都会或多或少的导致数据库出现慢请求。还有一个问题是当需要移除一个节点的时候,最好先将该节点停掉再移除,因为测试发现不停机直接移除导致数据库出现不可用和慢请求的个数远比停机操作多。 从上面的分析看,网上有人为了节省,只设置了一个master和一个slave,再加一个选举节点,当某个非选举节点挂掉之后有很大可能性是无法恢复的。所以集群中至少应该设置3个数据节点。

mongodb

### 问题来源 为了提高系统可靠性,当一个HTTP请求因为某些原因失败了之后,需要重新发送请求进行尝试。如果是`GET`请求,重试很简单,再重新发一下GET请求就可以了,如果是带有`Body`的`POST`请求,在重发请求的时候需要把`Body`也重发一遍。我们先看看Go HTTP中对`Request`的[定义](http://godoc.org/net/http#Request): ``` Go type Request struct { Method string URL *url.URL Header Header Body io.ReadCloser ContentLength int64 TransferEncoding []string Close bool Host string Form url.Values PostForm url.Values...

Go

docker container默认是UTC时间的,如果要使用北京时间需要修改时区,有以下几种方式: ### 1. 使用dpkg-reconfigure命令 ``` bash $ docker run -i -t ubuntu bash root@1f8ccb4c3dc1:/# date Wed Sep 10 16:02:38 UTC 2014 root@1f8ccb4c3dc1:/# dpkg-reconfigure tzdata Current default time zone: 'Asia/Shanghai'...

docker

在[A Tour of Go](http://tour.golang.org/#45)看到这样一段代码: ``` go package main import "fmt" func adder() func(int) int { sum := 0 return func(x int) int { sum += x return sum } }...

Go