MacOS 下设置 Docker 代理

Docker 原生的只有 Linux 支持,其它系统都是通过在虚拟机里面跑一个 Linux 环境来构造 Docker 环境。当然其它也包括了 MacOS。
在正常的网络环境下,理论上也不会有太多的使用体验区别。但是很可惜,我们生活在一个网络环境并不正常的维度里!

先简单讲下我的环境:

  • Mac OS 10.12.1 Sierra
  • Docker 1.12.3 官网下载的图形界面版本(dmg格式安装的)
  • brew 1.1.5

Docker 支持 http(s)_proxy 环境变量。 我装的是 libuv 版本的 ss ,只有 sock5 代理。为此需要一个能把 sock5 代理
转化为 http(s)_proxy 的工具:

安装 polipo :

1
brew install polipo

配置 polipo:

1
vim ~/.polipo

内容:

1
2
3
socksParentProxy=localhot:1080
proxyAddress=0.0.0.0
allowedClients=127.0.0.1,::1,10.20.0.0/24

最后2行很重要!docker 实际上是跑在一个虚拟机中,这里需要允许外部的连接进来,最后一个网段便是我虚拟内部的网段。具体的地址可以
通过下面的命令找出来:

1
ifconfig | grep inet

启动 polipo:

1
polipo

看着哪个不是你的局域网网段的基本上就是了。

点击右上角的 Docker 图标,Preferences -> Advanced -> HTTPS PROXY
填上之前在 ifconfig 观察到的那个 ip 地址就行了。

若过程中遇到问题可以利用以下的命令测试 proxy server 是不是正常启动:

1
https_server=192.168.x.x curl https://www.goolge.com

注意要填你局域网的网址,确定是可以通过外部的方式联接。

Compartir Comentarios

wxWidgets 跨平台开发体验及 Visual C++ 的坑

最近研究了一下 wxWidgets 跨平台开发,先是花了个把星期看了一下 c++ 语言。然后就是实战,毕竟只有实际动手才能真正了解掌握一样,因此做了一个很简单的 RESTful CLIENT 小项目。

wxWidgets 确实是相当优秀的一个跨平台开发库。c++ 不存在内存自动回收的机制,因此所有 wxWidgets 的类都有相应的资源管理方式,基本上由 wxWidgets 提供的组件是不需要你手动去 delete ,管理释放的。窗口类,线程类都会在执行完或被关闭时自己回收。对于界面布局有提供各种的 wxSizer 可以帮助你跟据窗口的大小自动调整控件的位置和大小。wxString 也提供了基本的转换,格式化功能。各种基础设施,做一些简单的界面应用绝对地足够了。

当然,不尽如人意的地方也很多。比如没有提供完善路径处理的函数,如 node.js/go 等都有提供的 path.join 功能。有提供 xml 处理功能,但没有 json 支持。有提供 http client 功能,但没有 https/cacert 之类的支持。

json 支持可以通过 jsoncpp 实现。使用的姿势跟 javascript 的很接近,上手很方便。要注意的是这个东东貌似只能在 stack 上使用,不支持 new 到 heap 上。因此,当函数返回时,相关的对象就会被释放,造成无效指针。在设计 API CLIENT 时就不能直接返回 JSON 对象。而是要返回 string 格式,再在后续处理函数中 parse 后再处理。这货还有一个更坑的地方是,当你把一个 json object bar 赋值给另外个 json object foo 后,你再修改 bar 的值,是不会反应到 foo 中的。所以当要更新某个子节点上的值,那是要把所有的父节目都牵涉进来才能达成。
看看这个:

1
2
3
4
5
Json::Value foo, bar;
bar["name"] = "bar";
foo["bar"] = bar;
bar["name"] = "foobar";
// foo = { bar: "bar" }

如何得到想要的:

1
foo["bar"]["name"] = "foobar";

但是你以为可以这样:

1
2
Json::Value bar = foo["bar"];
bar["name"] = "foobar"; // no, it's not gonna work.

除非你再把 bar 再赋值给 foo:

1
foo["bar"] = bar; // unless you assign bar to foo once again.

所以 c++ 虽然可以重载操作符,但强大也会容易带来混淆,使阅读代码变得困难。

虽然 wxWidgets 有 wxHttp 可以用于发送 http 请求,但这货太简陋了,连个 ssl 支持都没有,更不用讲对 自颁发证书 的支持。最后还是选用了 libcurl 来进行 http 请求。优点是功能强大,各种支持都不是问题。要说有不太爽的地方,那就是这货是个 c 库。听说有个 wxCURL 项目,也许下回可以试用一下。

整个过程中最坑的要数 Visual Studio C++ 了。一般来讲,当你修改了源码之后,按 F5 这时编译器应该是把相应源文件的 .obj 删除,重新编译,重新链接成新的可执行文件(当然没改动的源文件对应的 .obj 是不重新编译的),然后执行新的文件。当我在测试 wxSizer 布局的行为时,发现改来改去界面都他喵的没有变化,曾一度以为是 wxSizer 的 bug。于是果断改成绝对布局的方式。折腾了很久之后,才发现必须是 clean project/solution 之后再运行才能生效。于是很奇怪,google 了一大轮,有的说是项目设计中的 build 勾没打上,有的说是没分 hpp/cpp 的问题。各种尝试都是解决不了我的问题。后面通过观测 build log 。发现我改动的 obj 确实会被重新生成,然后 linker 也有出一个什么鬼 warnning 信息,但就是出来的 build 一直是之前的!通过不停地尝试,发现只有修改了 main.cpp 的代码,或删除 main.obj 会才使 vc 重新连接整个程序。这个若说是 visual studio 的 bug (2008 和 2015 都有相同的情况),那应该不会只有我一个人遇到,诡异的是 google 来 google 去确实没人有讲到相同的情况。难道我是地球上最后一个还在使用 vs 做 c++ 的人吗?最后实在没办法,只能在 prebuild 脚本里加上删除 mail.obj 命令。否则每次都要整个项目 rebuild 也是很麻烦的事情,花费时间长不讲,还经常忘了 clean 导致以为修改的代码有问题。

最后就是打包,由于我主要用的是 visual studio 2008 express 版本,不带有打包安装程序的功能。于是便采用了 wix 对程序进行打包,过程也是各种曲折。wix 的文档真是太差劲了,各种代码片断讲得不清不楚。sample 也少得可怜。

也许 c++ 是太古老了,很多编程方式都与现在流行的理念差左太大。各种资料也是不好找,挺费劲的。

Compartir Comentarios

修改 openwrt 的源列表

openwrt 官方网貌似被墙了,只能使用镜象:

在 /etc/opkg.conf 或 luci 的配置修改成以下地址可成功更新和安装 opkg 包。注意要根据 openwrt 和 cpu 的架构修改 url

1
2
3
4
5
6
7
8
9
10
11
dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
src/gz barrier_breaker_base http://openwrt.mirrors.ustc.edu.cn/barrier_breaker/14.07/ramips/mt7620a/packages/base
src/gz barrier_breaker_luci http://openwrt.mirrors.ustc.edu.cn/barrier_breaker/14.07/ramips/mt7620a/packages/luci
src/gz barrier_breaker_packages http://openwrt.mirrors.ustc.edu.cn/barrier_breaker/14.07/ramips/mt7620a/packages/packages
src/gz barrier_breaker_routing http://openwrt.mirrors.ustc.edu.cn/barrier_breaker/14.07/ramips/mt7620a/packages/routing
src/gz barrier_breaker_telephony http://openwrt.mirrors.ustc.edu.cn/barrier_breaker/14.07/ramips/mt7620a/packages/telephony
src/gz barrier_breaker_management http://openwrt.mirrors.ustc.edu.cn/barrier_breaker/14.07/ramips/mt7620a/packages/management
src/gz barrier_breaker_oldpackages http://openwrt.mirrors.ustc.edu.cn/barrier_breaker/14.07/ramips/mt7620a/packages/oldpackages
Compartir Comentarios

如果有人问你数据库的原理,叫他看这篇文章 - 文章 - 伯乐在线

一提到关系型数据库,我禁不住想:有些东西被忽视了。关系型数据库无处不在,而且种类繁多,从小巧实用的 SQLite 到强大的 Teradata 。但少有文章讲解数据库是如何工作的。

Source: 如果有人问你数据库的原理,叫他看这篇文章 - 文章 - 伯乐在线

Compartir Comentarios

游戏中学会撸代码:这些编程学习网站不容错过 - FreeBuf.COM | 关注黑客与极客

CodinGame 在玩这款游戏时会遇到许多有趣的问题,支持诸多编程语言。

Source: 游戏中学会撸代码:这些编程学习网站不容错过 - FreeBuf.COM | 关注黑客与极客

Compartir Comentarios

Android 上无法访问 Win7 的共享目录

现实是其它的电脑,包括 mac os 也可以访问。唯独 android 不行,试了 n 个客户端也连接不上。好一通 google 最后找到这篇贴子

http://www.tomshardware.com/answers/id-2165494/connect-win7-share-android-fine-windows-machines.html

根据 pgammelby 的方法成功解决:

I had the same problem and fixed it by reenabling the SMB protocol as described here: http://support.microsoft.com/kb/2696547?
To enable or disable SMB protocols on an SMB Server that is runningWindows 7, Windows Server 2008 R2, Windows Vista, or Windows Server 2008, use Windows PowerShell or Registry Editor. (Search ‘powershell’, run it in administrator mode) paste the following cmdlet into the powershell:
Set-ItemProperty -Path “HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters” SMB2 -Type DWORD -Value 1 -Force
and hit enter. Reboot.
Worked like a charm.

照看是启用了 smb2 协议。

Compartir Comentarios

Git 使用备忘

基本概念

  • 工作目录 : 当前实际的目录
  • 缓冲区 : 所有修改需要先 add 到缓冲区,再提交到仓库
  • 仓库 : 实际存储提交历史的地方
  • 远程 : 相当于 SVN/VCS 之类的Server

初始化

在已有目录下初始化 git 仓库

$ git init

在Server初始化空的 git 仓库

$ git init --bare

查看类

查看当前工作目录状态,列出所有已添加到缓种区的文件(绿色),所有未添加到缓种区的文件(红色)

$ git status

查看仓库历史

$ git log

查看操作历史

$ git reflog

日常操作

添加文件跟踪

$ git add README.md

添加所有修改到缓冲区。缓冲区可以多次提交,然后一次性 commit 到仓库

$ git add --all

一个个提交修改文件很没效率,但是 add —all 会把一些我们不想同步的临时文件也一起提交,我们可以通地 .gitignore 文件告诉 git 哪些文件不要理会。git 结果很简单,一行一个 glob 。可惜用 # 进行注释

撤销已经添加到缓冲区的文件

$ git reset README.md

提交到仓库

$ git commit -m 'YOUR MESSAGE'

追加/修改提交内容。提交到仓库若发现少了一些修改,可以通过下面的方式修改提交,这样就不会有新的提交历史。

$ git add --all $ git commit --amend

回退版本。当发现提交有问题,需要回退到之前一个版本时使用,这个操作比较危险,小心使用:

$ git reset HEAD~1 --hard

取消回退。当发现回退有问题时,短时间内可以使用操作历史及回退命令取消回退(git 隔一段时间会清空 reflog)。

$ git reflog $ git reset e284c7f --hard

Compartir Comentarios

EI Capitan 安装 node-canvas 失败解决方法

在给手头上一个之前在 Ubuntu 下Programming的 project 执行 npm i 时候发现竟然失败了,一看之下是 node-canvas 编译错误,提示找不到 libjpeg.h。奇怪的是明明已经按照 node-canvas 的文档,装好相关依赖的库了。libjpeg.h 也是存在于 /usr/local/include 里面的!

百思不得其姐,一番 google 之后,发现在 node-canvas 的 github 上有两个 issue 说到这个问题。最后多数人表示在 terminal 里面执行下面这条命令后可以解决问题:

1
xcode-select --install

好吧,mac os 新手没办法,虽然不知道是什么神奇的原理,也只好照猫画虎!执行之后跳出一个安装对话框,按 Install ,几分钟之后就提示成功了。再回到 terminal 执行 npm i……哇,竟然还是失败了!

有点没招了,继续 google 。终于是发现这个命令是用来 Command Line Tools,貌似是新 os x 默认没有设定编译相关的环境变量,通过安装这个包可以将相关环境设定好。难道是刚才敲命令的姿势没摆好?再试一次,结果还是一样,不过让我感觉奇怪的是安装过程又执行了一次,没有替换或已安装的提示,看那对话框不太对啊,怎么叫我去 Get XCODE ,我这不是已经装了最新的 7.2 了吗?还怎么 Get !

无奈之后按一篇文章中提到的传统方式,打开 XCODE 在 主菜单点 Open Developer Tool -> More Developer Tools ,打开 Apple 官网网页。看到那个 Command Line Tools OS X for XCode 7.2 ,我去,这一个包四百多兆,怎么可能几分钟就下载安装好。看来是命令行安装的方法根本行不通了。

实践证明,这个包要手动下载,安装完成之后;npm i 就可以完成编译了。

Compartir Comentarios

VirtualBox USB Add Filter From Device No Device Available Ubuntu - Web Design Blog

I am running an old XP license on a Virtualbox guest. One things that has always bugged me was the inability to use USB devices within my VirtualBox guest. After searching google a few times for “V
Source: VirtualBox USB Add Filter From Device No Device Available Ubuntu - Web Design Blog

1,启用 USB2.0 支持需要安装扩展包

http://download.virtualbox.org/virtualbox/{版本号}/xxx.vbox-extpack

下载下来,点击运行就会自动启动 VirtualBox 进行安装。

2,解决 VirtualBox 中找不到任何 USB 设备的问题,表现为在虚拟机的设置,USB页面中右击 Add Filter From Device 找不到任何设备。是因为当前登录的用户不在 vboxusers 组中引起的权限问题。打开 shell:

1
sudo usermod -a -G vboxusers USERNAME

记得把 USERNAME 替换成当前的用户名。完成后需退出登陆重新登陆方能生效。

Compartir Comentarios

eOS 给 Visual Studio Code 添加 Slingshot 图标

VSC 没有自带 .desktop 文件,需要自行手工建立。

在 ~/.local/share/applications/ 建立 vsc.desktop 文件,内容如下:

1
2
3
4
5
6
7
8
[Desktop Entry]
Name=Visual Studio Code
Comment=Programming Text Editor
Exec=/path/to/VSCode-linux-x64/Code %U
Terminal=false
Icon=/path/to/VSCode-linux-x64/resources/app/vso.png
Type=Application
Categories=Programming;

保存退出,在文件管理器中点击运行该程序,成功后右击锁定到 Slingshot 即可

注意 Exec 和 Icon 参数

Compartir Comentarios