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

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

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

Share Comments

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

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

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

Share Comments

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 协议。

Share Comments

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

Share Comments

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 就可以完成编译了。

Share Comments

Ng­inx 内配置 Google An­a­lyt­ics 指南

Source: Ng­inx 内配置 Google An­a­lyt­ics 指南

相关说明

网站配置 Google An­a­lyt­ics 的常见方式是在网站前端引用 an­a­lyt­ics.js 脚本,从前端利用 javascript 进行统计,这种方案的缺点是:

  1. 客户端到 Google An­a­lyt­ics 之间的网络问题,包括 an­a­lyt­ics.js 脚本加载缓慢、向 Google An­a­lyt­ics 发送信息速度缓慢乃至失败等问题。由于各地网络情况不一,唯一通用的解决方案需要自己反向代理一个 an­a­lyt­ics.js 脚本,并且由Server中转向 Google An­a­lyt­ics 发送信息的通讯。
  2. 客户端屏蔽 Google An­a­lyt­ics 的相关问题,包括常见的 ad­block 扩展等自带的屏蔽列表,利用 user­script 进行屏蔽等方式,这些客户端的手段都会导致统计的偏差问题。
    如果将 Google An­a­lyt­ics 的统计工作从前端转移到后端完成,就可以有效避免上述问题,比如使用 an­a­lyt­icsd 处理 Ng­inx 的日志,并将各类事件上传至 Google An­a­lyt­ics 上,或者使用 uni­ver­sal-an­a­lyt­ics 将 Google An­a­lyt­ics 集成到 Nodejs 应用中。

上述的两个 Nodejs 程序都是基于 Mea­sure­ment Pro­to­col Programming的,在阅读了相关参考资料后我发现直接使用​Ng­inx 自身的功能就可以完成这一工作,于是有了本文。

此方案的优点是:

  1. 只需考虑Server到 Google An­a­lyt­ics 的速度,不影响客户端的体验。
  2. 统计数据真实准确,不受干扰与屏蔽。
  3. 配置简单方便,不需要额外安装 Nodejs 等软件,使用 Ng­inx 自身的功能即可完成。

配置说明

Server信息:

Cono­Ha 1GB KVM Tokyo

2 Core CPU

50GB SSD

De­bian 8.0 64bit
Ng­inx 信息:
Ng­inx v1.9.6 Main­line ver­sion

deb http://​ng­inx.org/​pack­ages/​main­line/​de­bian/ jessie ng­inx
Ng­inx 自带的 userid 模块可以用于标记各个用户,而 post_action 配置项可以在 Ng­inx 收到的请求处理完成后向某处发送一个异步的 Get 请求,这个请求会附带原始请求的 refereruser-agent,利用这两个功能的这一个,我们可以配置 Ng­inx 在页面访问后发送相关信息到 Google An­a­lyt­ics 中,其具体配置如下:

userid on;
userid_name cid;
userid_domain 你的域名;
userid_path /;
userid_expires max;

location @tracker {
    internal;
    proxy_method GET;
    proxy_pass https://ssl.google-analytics.com/collect?v=1&tid=UA-XXXXXXXX-Y&$uid_set$uid_got&t=pageview&dh=$host&dp=$uri&uip=$remote_addr&z=$msec;
    proxy_set_header User-Agent $http_user_agent;
    proxy_pass_request_headers off;
    proxy_pass_request_body off;
}

location / {
    try_files $uri $uri/ =404;
    post_action @tracker;
}
`</pre>
`userid`模块将会在用户访问时检查 cook­ies 中是否有 `cid` 项,如果没有 `cid` 项,则会在返回的 header 中加入 `set-cookies` 头标记这个用户,并将 `$uid_set` 变量设定为 `cid=XXXXXX` 这一形式,将 `$uid_got` 变量设定为空。如果有 `cid` 项,则将 `$uid_got` 变量设定为 `cid=XXXXXX` 这一形式,将 `$uid_set` 变量设定为空。于是在 `@tracker` 部分,上述变量会将`$uid_set$uid_got` 填充为`cid=XXXXXX`。

实际向 Google An­a­lyt­ics 提交数据时,`tid`为跟踪 ID,即类似 `UA-123456-1` 的用于区别是要向哪个 Google An­a­lyt­ics(分析)媒体资源发送数据的参数,可以从 Google An­a­lyt­ics 获得;`cid`即客户端 ID,以 cook­ies 的形式用于区分和追踪用户,这里通过 `userid` 模块完成;`t`、`dh`、`dp`参数用于标记事件类型,访问的网站与访问的路径;`uip`参数即用户的 IP 地址,用于追踪用户所处地区等信息;`z`参数没有实际意义,仅仅用于附加一个时间戳以防止向 Google An­a­lyt­ics 提交数据时,这个请求被缓存。

## 注意事项

在配置监听 IPv6 和 IPv4 时,有两种配置方式:
<pre>`listen [::]:443 ssl http2 fastopen=3 reuseport ipv6only=off;

listen 443 ssl http2 fastopen=3 reuseport;
listen [::]:443 ssl http2 fastopen=3 reuseport ipv6only=on;
`</pre>
如果使用前者,那么 `remote_addr` 变量将会被表示为 [IPv4-mapped IPv6 ad­dresses](https://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses) 即`::ffff:123.123.123.123`这样的形式,如果使用后者,那么 `remote_addr` 变量将会被表示为 `123.123.123.123` 这样的正常的形式。

Google An­a­lyt­ics 对 IP 会进行匿名化处理,将 `::ffff:123.123.123.123` 处理为 `::`,而将`123.123.123.123` 处理为`123.123.123.0`,显然前者会导致地区识别错误等一系列问题,所以请务必使用后者以确保 Google An­a­lyt­ics 正确处理提交的数据。

## 调试方法

如果希望提交更多数据,并对这一过程进行调试,可以修改 `proxy_pass` 路径到Server自身上的某处,并使用 `access_log` 记录将提交的数据,然后通过 `curl` 向 Google An­a­lyt­ics 的调试Server手动提交信息:
<pre>`$ curl --user-agent "Mozilla/4.0" --referer https://google.com "https://www.google-analytics.com/debug/collect?v=1&amp;dp=/index.html&amp;dh=example.com&amp;tid=UA-123456-1&amp;cid=XXXXXX&amp;uip=123.123.123.123&amp;t=pageview"
`</pre>
Google An­a­lyt­ics 的调试Server会返回关于此次提交的详细信息,包括参数是否有错误、如何修正等,可以通过检查返回信息来确定配置是否正常。而 Google An­a­lyt­ics 的正常Server只会返回 HTTP 状态码,难以进行调试。

## DNT 功能

用户可以启用 [Do Not Track](https://en.wikipedia.org/wiki/Do_Not_Track) 功能向网站表明自己不希望被追踪,遵守该规则的网站就不会追踪用户的个人信息。

使用如下配置可以在只有用户未启用 DNT 功能时才向 Google An­a­lyt­ics 发送相关信息:
<pre>`location / {
    try_files $uri $uri/ =404;
    if ($http_dnt != 1) {post_action @tracker;}
}

尽管如此,受 Ng­inx 程序本身的限制 userid 模块依旧会用 cook­ies 对用户进行标记,没有办法通过检测 DNT 头的方式来关闭它。

Share Comments

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:

sudo usermod -a -G vboxusers USERNAME

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

 

 

Share Comments

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 参数

Share Comments

elementary OS Snippets: Google Chrome With Double Icon In Plank

Source: elementary OS Snippets: Google Chrome With Double Icon In Plank

eOS 中点击 Slingshot 中 google chrome 图标后,会跳出另一个图标。这个不美观。freya 中的修复方法为:

1,删除原来 Slingshot 上的图标(拉走或者右击去掉锁定)

2,copy .desktop 文件

cp /usr/share/applications/google-chrome.desktop ~/.local/share/applications
3,编辑该文件在 [Desktop Entry] ,和 [NewWindow Shortcut Group] 以及 [NewIncognito Shortcut Group] 这三节中加入以下配置:
StartupWMClass=Google-chrome-stable
4,用文件管理器点击运行这个文件,右击 Slingshot 上的图标锁定就行了。

Share Comments

再次从 Windows 转向 Linux 阵营

用回 Ubuntu 已经有数月,除了 GVIM 偶尔会变黄,还有一次升级 Kernel 时会造成视频播放时关闭播放器会卡死之外,整体都很稳定。

Linux 系统对于程序员来讲,确实比 Windows 不要好用太多!强大的 shell 在 POSIX 标准下运行,各种命令,脚本,程序组合使用爽到翻,以往在 windows 下花几天时间未必能找到趁手工具或解决方法的,在 Linux 却会有大把免费开源的程序给你组合使用。

举个例就说网站布署,以前做 .NET Programming的时候,布署是个头疼的事件,用 FTP 传拜托要传到什么时候?在 VS 里面通过 Web Publish 会好一点,然并卵的是奇有时候一些 DLL 明明没改动却是还要再传一遍(莫非是按日期比较?)!此外如果我要在发布前后各做一些自动化操作那基本上是不可能了!像是这种事件在 Linux 下有 ssh/rsync 几行脚本就能搞定了,发布时只上传差异文件(似乎是按文件内容比较),速度快得要死!。(最后我还是在Server上和Programming机上都装了一套 cygwin 去解决)。

对于多年不用电脑玩游戏的我来讲,最麻烦的问题也就剩下该死的企业网银U盾问题了,还好笔电的U有支持虚拟化,用VirtualBox装个 Win7 也不至于太慢(正巧也有些.NET项目需要维护)。至于网购之类的,现在淘宝京东,甚至微信都可以绑定银行脱离网银。甚至不少银行都有手机APP可以独立运作,像广发手机APP转帐手续费竟然比电脑要优惠!QQ就让它在手机端运行了。也省得编码时老在那里闪啊闪的!

Ubuntu 对多屏幕支持比较好,比 Windows 好不止一条街。随插随用,默认就是按各自的分辨屏工作,各个屏幕有独立的系统栏和DOCK。大部份程序是在哪个屏点击就在哪个屏出现,偶有部分会在它上次出现的屏幕出现,这个应该是程序自己的设计吧,不能怪到操作系统的身上。当显示器被拔除(不是关屏),所有运行的程序又会被调回到主屏幕上,很人性化吧!多屏体验确实不是 Windows 能比肩的。

不好的地方也是有的,系统栏和程序的菜单栏结果的设计总是让人感觉怪怪的。比如说A窗当前是活动的,你要点击B窗的菜单,那就得先点一下B窗激活它,再把鼠标移到系统栏去选菜单。有时候就会发生错点的情况。Dock 靠左侧也占了不少屏幕空间,四四方方的设计,老实讲,真是越看越丑呀!而 Ubunut 一向给我的感觉就是字体界面各种粗大,给人感觉不够精细。

Ubuntu 虽好,但界面细节及配套程序确实不够精美。偶然机会下,看到了 Elementary OS,一款基于 Ubuntu 的专注于界面美化的 Linux 发行版。忍不住尝鲜装了一个,界面确实非常惊艳。最让我喜欢的是 shell 在执行完命令后会有通知提醒,这点是最先发现比 ubuntu 要好的地方。界面设计方面无疑是借鉴了 MacOS ,字体大小合适,给人感觉很精细。附带的应用显然都是精心挑选过的,以简洁明快为主,一般性使用是足够了。

ElementaryOS Freya 确实不如 Ubuntu 完善。 最奇怪的是安装的时候貌似一定要连网,否则会导致 grub 安装失败?莫些这么基础的包还需要依赖于 online repository 的包?另外比较不好的地方是多屏的支持不如 Ubuntu 的好,顶部的系统栏和底部的 Dock 只能在一个屏上显示,并且只有底部的 Dock 能自由指定在哪个屏上显示。另外就是 Intel 显卡上面偶尔会出现程序闪屏的现象。

自带的 Midori 确实简单直白,号称是轻量级,速度很快不占内存。实际使用下来,只能呵呵了,不支持 Flash player,经常性地崩溃假死不说,还常常莫名奇妙地跳出一个空白窗口叫你 Log in?还好 Chrome 和 Firefox 都可以良好地运作,虽然界面风格上有点格格不入,但为了功能和稳定只能忍了。

Share Comments