Quantcast
Channel: 落格博客
Viewing all 368 articles
Browse latest View live

Digital Ocean 新加坡机房 速度 三藩市 SGP1

$
0
0

如果说你问常玩 VPS 的站长最推荐那个服务商?我想除了大名鼎鼎的老牌 Linode 以外,就剩下了新秀 Digital Ocean 。这个近几年刚刚崛起的 vps 服务商依靠着据说美国几大财团的支持,打造了一个以全局 SSD 固盘、按需收费的云 vps 服务平台。

价值$100的优惠券
价值$100的优惠券

便宜

最主要的,还是要说 DO 的便宜,说实在的,由于受到了 DO 的竞争影响,导致 Linode 优化线路降低价格也算是一件美事。不过,Linode 注册如今依旧是只能使用信用卡,对于不喜欢使用信用卡~或者说没有信用卡的人来说,DO 成了不二的选择。

DO 最便宜的$5每月(实际上还是按照每小时$0.007收取)套餐,有着单 U、512M 内存20G SSD、1T 流量的配置(据说软限制,用超了也不会罚款)。对于广大学生狗等仅用来做苟且之事的朋友来说,已经足够了。

装上 LNMP(DO 有 LAMP 的模板的,可以直接部署)来个 WordPress,装个 shadowsocks,再开个 VPN 给手机使,为了外出临时使用方便,再开一个 Google 的反代这些都是妥妥的。这一套下来,每年也就才 $60,换算一下也就是¥360+

确实是很便宜的了。

学生优惠

Digital Ocean 本身并不提供任何学生优惠,但是他们联合了 Github 的 Student Developer Pack 提供了价值$100的优惠券

使用这个链接注册 DO,你将获得$10的奖励,然后不要着急创建 droplet,去申请 Github学生优惠(如果你是学生的话。)大概一天左右审核通过了你就可以提取这100刀的优惠券,在你的账户当中输入优惠码,这样你就会有$110的信用额度!使用$5的套餐,可以一直用22个月!再加上你使用 paypal 认证时候充入的$5,你总共可以用¥30块钱用两年(实际上是23个月哈~)!

三藩市和新加坡机房速度

传说三藩市的速度神快,无比稳定,就算偶尔延迟大也会被信仰补齐!可惜在我这里已经不再是传说中的那样神速了——相反慢到可以自残啊

--- speedtest-sfo1.digitalocean.com ping statistics ---
86 packets transmitted, 59 packets received, 31.4% packet loss
round-trip min/avg/max/stddev = 240.270/317.885/414.583/39.648 ms

反而新加坡的却要好很多

--- speedtest-sgp1.digitalocean.com ping statistics ---
167 packets transmitted, 166 packets received, 0.6% packet loss
round-trip min/avg/max/stddev = 164.457/190.471/353.877/33.761 ms

总之,在体验了三藩市的 vps 使用 ssh 上去之后半分钟一个命令——甚至一分钟一个命令的蛋疼+菊紧之后,我果断换到了 SGP1机房~反正刚创建不到1小时删除了只扣款$0.01。

具体稳定性等问题,敬请关注后续更新😃

Digital Ocean 新加坡机房 速度 三藩市 SGP1,首发于落格 - logcg.com


修改 .htaccess 禁止 目录索引 保护隐私

$
0
0

一般默认 Apache 会允许目录索引,这就很容易遭到别有用心的人的恶意使用。很多人选择在目录下放置 index.html 文件来达到这个目的,因为这样一来就成了打开一个空文件而不能索引目录,但这样终究治标不治本——你总不能给所有的目录都来一个 index 吧?

如果可以的话,还是应该修改 .htaccess 文件来达到这个目的,它能达到的功能十分强大,比如说重定向,比如说防盗链,比如说伪静态…………

总之,在 .htaccess 文件末尾另起一行,写入如下代码即可禁止全局目录索引,这样一来,至少我们又能屏蔽一种可能的攻击方式。

Options All -Indexes

 

修改 .htaccess 禁止 目录索引 保护隐私,首发于落格 - logcg.com

编译安装 dnscrypt-wrapper 搭建防污染 DNS 服务器

$
0
0

众所周知,在我朝局域网当中想要获取国外 DNS 信息,必定会遭到关键字污染。为此,有人想到了使用异常端口,比如5353而不使用 DNS 专用端口53——因为目前 Girl Friend Wall 只污染53;也有人想到了使用 TCP 连接请求,因为 DNS 的应答机制参考 DHCP决定了它会接受第一个返回的响应,后边的会被丢弃,而使用 TCP 则强制接受选定的数据包;甚至有人想到了把那些发污染包的 IP 地址收集起来,然后在客户端处过滤——加入黑名单,这样最终就会收到正确的响应包。

总之,这些都不是什么长久之计,使用 OpenDNS 出品的 dnscrypt 是一个不错的选择,它在 DNS 的基础之上增加了加密的选项,让你的 DNS 请求能够像使用 ssl 一样加密地请求服务器,这样便从根本上杜绝了 DNS 污染问题。

那么问题来了,就算你是用了 dnscrypt,可是服务器 IP 被认证了呢?答案是——这就是最近 dnscrypt 越来越不给力的原因。另外,OpenDNS 虽然捣鼓出了这么个给力的玩意儿,但是他们却没有公开服务端——也就是说你必须使用那有限的几个国外的服务器,速度绝对快不到哪里去。

所以,我朝有大神根据 dnscrypt 的客户端写出了牛逼闪闪的服务端——dnscrypt-wrapper

我们现在可以自己在境外服务器搭建一个 dnscrypt 服务器,本地来连接就好了——你可以选择一个速度比较快的 vps

教程开始

作为演示,我这里的服务器是 ubuntu 14.04.

编译安装依赖库文件

dnscrypt-wrapper 依赖 libsodiumlibevent2;前者一般源里没有,后者一般默认版本不是2而是比较旧的1,我们得先来手动编译这两个库。

我们从这里下载 libsodium 的最新版本 ,截止到本文完成时,最新版本为1.0.2:

cd ~
wget http://download.libsodium.org/libsodium/releases/libsodium-1.0.2.tar.gz
tar xf libsodium-1.0.2.tar.gz
cd libsodium-1.0.2
CFLAGS="-O3 -fPIC" ./configure
make
make install
ldconfig

然后我们从这里下载 libevent2 ,这里我们选择 2.0.22 稳定版:

cd ~
wget https://sourceforge.net/projects/levent/files/libevent/libevent-2.0/libevent-2.0.22-stable.tar.gz
tar xf libevent-2.0.22-stable.tar.gz
cd libevent-2.0.22-stable
./configure --prefix=/usr
make
make install
echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf
ldconfig

编译 dnscrypt-wrapper

搞定两个依赖库之后,就可以开始编译 dnscrypt-wrapper 啦:

apt-get update && apt-get upgrade
apt-get install git
cd ~
git clone --recursive git://github.com/Cofyc/dnscrypt-wrapper.git
cd dnscrypt-wrapper
make configure
./configure

如果你在 make configure 这一步出错,你可能需要先安装 autoconfig:

apt-get install autoconfig

如果没什么问题,那么就可以开始编译安装了:

make
make install

//安装完成会出现如下提示:
# make install
install -d -m 755 ‘/usr/local/bin’
install -p dnscrypt-wrapper ‘/usr/local/bin’

至此编译完成。

dnscrypt-wrapper 的配置和使用

cd ~
mkdir dnskey
//新建一个目录来存放证书
cd dnskey
dnscrypt-wrapper --gen-provider-keypair
//生成提供商密钥对

这里系统会反馈一个指纹信息,这个信息就是客户端配置时候需要的“provider_public_key”!所以一定要保存好。

类似这个样子:

4298:5F65:C295:DFAE:2BFB:20AD:5C47:F565:78EB:2404:EF83:198C:85DB:68F1:3E33:E952

然后,我们使用命令生成加密密钥对以及生成预签名证书:

dnscrypt-wrapper --gen-crypt-keypair
dnscrypt-wrapper --crypt-secretkey-file crypt_secret.key --crypt-publickey-file=crypt_public.key --provider-publickey-file=public.key --provider-secretkey-file=secret.key --gen-cert-file

这样,dnscrypt-wrapper 就已经准备好了。

使用命令来运行 dnscrypt-wrapper,用“-VV”来显示比较详细的 debug 信息:

cd ~/dnskey
dnscrypt-wrapper -r 8.8.8.8:53 -a 0.0.0.0:5353 --crypt-secretkey-file=crypt_secret.key --crypt-publickey-file=crypt_public.key --provider-cert-file=dnscrypt.cert --provider-name=2.dnscrypt-cert.logcg.com -VV

然后去客户端配置一下:

vi /etc/default/dnscrypt-proxy
#要修改的就只有如下几处,其他注释和配置已略去。
local-address=127.0.0.1:5301
#本地监听地址和端口
resolver-address=128.199.131.196:5353
#远端的服务器地址和端口
provider-name=2.dnscrypt-cert.logcg.com
provider-key=4298:5F65:C295:DFAE:2BFB:20AD:5C47:F565:78EB:2404:EF83:198C:85DB:68F1:3E33:E952
#先前使用dnscrypt-wrapper --gen-provider-keypair命令时候生成的指纹信息。

保存后使用如下命令重启客户端服务,如果你的端口没有被防火墙撸掉,那服务器那边就应该能够看到 debug 信息,表示已经有客户端接入。

service dnscrypt-proxy restart

使用命令来测试一下:

root@MyServer:~# dig -p 5301 twitter.com @127.0.0.1

; <<>> DiG 9.8.1-P1 <<>> -p 5301 twitter.com @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45379
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;twitter.com.			IN	A

;; ANSWER SECTION:
twitter.com.		5	IN	A	199.16.158.179
twitter.com.		5	IN	A	199.16.158.168

;; Query time: 273 msec
;; SERVER: 127.0.0.1#5301(127.0.0.1)
;; WHEN: Wed May  6 19:51:42 2015
;; MSG SIZE  rcvd: 72

多次重复命令,发现获取到的 IP 均相同且为真正的正确 IP 地址,服务生效。

创建脚本

每次直接运行命令多少有些不方便,即使使用“-d”来后台执行,一样让人感到不适,我们使用 shell 来创建一个启动 dnscrypt-wrapper 的脚本。

cd ~/dnskey
vi start-dnscrypt-wrapper.sh
#加入以下内容



#!/bin/bash
dnscrypt-wrapper -d -a 0.0.0.0:5353 -r 8.8.8.8:53 \
    --crypt-secretkey-file=crypt_secret.key \
    --crypt-publickey-file=crypt_public.key --provider-cert-file=dnscrypt.cert \
    --provider-name=2.dnscrypt-cert.logcg.com \
    --logfile=/var/log/dnscrypt-wrapper.log

以后则只需要使用 sh start-dnscrypt-wrapper.sh 就可以启动了。

——至于关闭嘛,使用命令“killall dnscrypt-wrapper”。

延伸阅读:

https://github.com/Cofyc/dnscrypt-wrapper

http://03k.org/dnscrypt-wrapper-usage.html

编译安装 dnscrypt-wrapper 搭建防污染 DNS 服务器,首发于落格 - logcg.com

部署 SNI Proxy 加速网页访问 反代 无需证书

$
0
0

我们都知道可以使用 nginx 反代功能来实现跨境访问外网,不过,这种方式有很多的制约,比如说很难实现登录验证,比如说需要针对转发模块单独做编译,比如说需要你有一个有效的 ssl 签名证书等等。

这次,我们来介绍另外一款神器 SNI Proxy,是用 dnsmasq 配合 sniproxy 可以实现无证书任意网站反代。它使用SNI 技术将 TLS 连接通过 TCP 代理到目标网站,这样就避免了对代理服务器的证书需求,而且访问到的网站证书也是原原本本的证书。

安装配置 SNI Proxy

示例环境为 Ubuntu 14.04

apt-get install python-software-properties
add-apt-repository ppa:dlundquist/sniproxy
apt-get update && apt-get install sniproxy

编辑 /etc/sniproxy.conf来开启反代:

table https_hosts {
    # Google
    (.*.|)googleapis.com$ *
    (.*.|)google.com$ *
    (.*.|)google.com.hk$ *
    (.*.|)google.co.jp$ *
    (.*.|)googlehosted.com$ *
    (.*.|)googleusercontent.com$ *
    (.*.|)ggpht.com$ *
    (.*.|)gstatic.com$ *
    (.*.|)googlemail.com$ *
    (.*.|)googlecode.com$ *
    (.*.|)blogspot.com$ *
    (.*.|)gmail.com$ *
    (.*.|)appspot.com$ *

}

table xmpp_imap_smtp {
    (.*.|)google.com$ *
    (.*.|)googlemail.com$ *
    (.*.|)gmail.com$ *
}

像上边这样开启针对某个域名的反代,但是这样太麻烦了,每次新增加一个网站,都需要对这个列表增加——为此,我们为了方便稍微牺牲一点安全性——且我不需要对邮件进行反代(容易被滥用,国外对垃圾邮件服务器是深恶痛绝的。),那么我可以直接这样写:

user nobody
listen 443 {
  proto tls
  table https_hosts
}

table https_hosts {
.* *:443
}

这样就只打开了 https 反代,而且是只要被解析到这个服务器的域名都会被反代,这样一来,我们就可以只通过 dnsmasq 的解析来控制哪个域名反代了。(有那么一点安全隐患就是一旦被别人发现,你可能你服务器的流量会意外流失咯~记得监控你的服务器带宽😃

运行 sniproxy

直接使用命令sniproxy 即可运行,默认配置文件就是“/etc/sniproxy.conf”它会自动加载,如果你使用了其他路径或者配置文件名,那么你需要使用“-c”选项来指定路径:

sniproxy -c /etc/sniproxy.conf

端口重定向

那么,一般我们访问网站不喜欢输入端口号或者协议名称,那么默认访问的是80端口怎么办?作为辅助,我们安装一个轻量级的 nginx,让它把所有访问80端口的流量转移到443上边去,使用301重定向即可。

我们编辑 nginx 的配置文件“/etc/nginx/sites-available/default

改为如下内容:

server {
        listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default ipv6only=on; ## listen for ipv6

        # Make site accessible from http://localhost/
        server_name _;

        location / {
                rewrite ^ https://$host$request_uri permanent;
        }
}

 

域名解析

sniproxy 搭建成功,但是它是不能被直接访问的,你需要将域名解析过去,这样它才能根据域名来代理你的 ssl 链接,那么你可能就需要在自己的 hosts 上修改解析啦。不过,另外一个更简便的办法是使用 dnsmasq,在我写的一篇文章当中介绍了如何在国内搭建一个自己私有的 dns 服务器来避免 dns 污染,那么,你只需要在这个服务器当中增加 dnsmasq 的解析配置即可。

比如说新增一个 /etc/dnsmasq.d/sni.conf ,往里边写入需要解析到你 sniproxy 服务器的域名即可。为此,我在 github 上新建了一个项目,这里加入了常用网站的解析,你只需要将它下载并且替换里边的 IP 为你 sniproxy 服务器的 IP 即可!

apt-get install git
git clone https://github.com/R0uter/Dnsmasq-sniproxy-conf.git
cd Dnsmasq-sniproxy-conf
ln -s /root/Dnsmasq-sniproxy-conf/sni.conf /etc/dnsmasq.d/

记得修改里边的 IP 地址!

——————

这样,你的 dns 就增加了常见认证网站的自动反代功能!☺️

部署 SNI Proxy 加速网页访问 反代 无需证书,首发于落格 - logcg.com

再见小流氓,再见 dnspod

$
0
0
dnspod 首页
dnspod 首页

作为国内曾今红火一时的 DNS 解析服务商,dnspod 曾在 godaddy 的 ns 刚被认证的那段时间以国内解析速度快服务质量好而被广大主机商推荐,我们这群没脑子的小博主就纷纷转投第三方 ns 解析

其实人家 dnspod 也挺好的,解析速度越来越快,新建一个子域名,从一开始的几分钟到现在的只需要几秒钟就可以生效,真的是让人省了不少心——除了被攻击,嗯,现在还算不错。

————直到昨夜,我忽然发现自己的博客打不开了。一开始下意识以为“哦,终于到了这一天,被认证了。”

可是搭了梯子后依旧无法访问,ping 一下发现域名解析不成功。这时候才意识到原来是域名的问题。使用 dig 命令从114.114.114.114解析,能够正确拉取 IP 地址,而从8.8.8.8就不行,返回为空。我就纳闷儿了,国内的 DNS 就能解析,国外的就不行?

Google 一下,我就知道,原来又是 dnspod 在耍流氓啦!不少人曾遇到使用 dnspod 后导致Google 站长工具警报Google bot 无法访问网站,然后我也就联想到前一段时间确实偶尔会有莫名其妙的 Google bot 警告,我还以为是主机问题(没错,目前我还用着虚拟主机呢~)

不查不知道,一查吓一跳,现在各大网站均推出了 dns 解析服务,还附带 cdn!

  1. 360的太流氓,我不考虑;
  2. 百度云加速太流氓我也不考虑;
  3. 加速乐这个跟百度离婚的界面怎么看怎么屌丝;
  4. 安全宝……这个名字我看着就不想用;
  5. dns.la 这个看着更让人心碎;
  6. 阿里云解析其实就是换了牌子的万网解析,不备案不允许 url 转发不用;
  7. godaddy 其实也有单独的 dns 解析,但国内墙得厉害还是算了;

现在想想看,放在国内怎么也不放心,至于国外的,最后我还是锁定了 namecheapcloudflare 这两家,前者打开太慢,后者 cdn 的 IP 偶尔被墙。

本来我是想转入 namecheap 的,毕竟我还有他们的优惠,但 namecheap 转入解析需要邮件认证,我的空间不提供邮箱,我用的是 qq 的域名邮箱,然后 dnspod 不给国外做解析,结果就是我根本无法收到验证邮件!

好吧好吧,最终我还是转入了 cloudflare,顺带还有安全保护和 cdn 呢不是吗?也算是为将来转投 vps 阵线做的准备吧……

你别说生效还挺快的,分分钟我本地就已经能够解析过去了。

截止到现在写这篇文章的时候,由于域名解析全球生效,我已经成功的收到了 namecheap 的验证邮件,考虑把 namecheap 作为 backup 解析来做嗯。

————————

最后补一句,如果你的 dnspod 免费标识是绿色的而不是灰色,那么你可以在解析线路里边选择国外线路,然后给每一条解析逐个做一条额外的相同的国外线路解析,这样也可以让国外 dns 正常解析域名。考虑到以前不需要这么设置,现在忽然需要了,我看还是早点再见的好。

另,MX 记录即便是设置了国外线路,似乎也不会生效,不然我当时就能够收到 namecheap 的验证邮件了。

再见小流氓,再见 dnspod,首发于落格 - logcg.com

Ubuntu 下更简单的防火墙 Uncomplicated Firewall

$
0
0

我们都知道,Linux 系统当中有一款十分牛逼的防火墙叫做 iptables,它能做的远远超过了防火墙的范畴……不过,一般来讲,我们还是习惯于只把它当做防火墙来用。

不过,如果你只是想对某个端口进行策略,那似乎也并不需要去面对 iptables 那冗长的配置命令。现在,我就来给你介绍另外一款更加简单的防火墙:

Uncomplicated Firewall

一看名字就十分的明确“不复杂防火墙”没错,它就是 ufw,在 Ubuntu 操作系统当中已经内置,使用它可以简单快速的操作防火墙的功能,比如开关端口,访问 IP,限制连接等等等等。它与一系列 Linux 下防火墙都差不多,也是使用了 iptables 作为后台,所以,你同样可以在 iptables 上做更多的自定义,两者可以一起使用……当然了,我不推荐你这么做。iptables 的规则要优先于 ufw

之所以推荐 ufw,是因为这货在 Ubuntu 里边内置,所以刚刚建好 vps 你就可以先用它来快速部署啦!

基础开关命令

ufw enable // 启用防火墙

ufw disable // 禁用防火墙

ufw status // 显示防火墙状态

ufw status verbose // 查看防火墙详细状态

ufw default deny //设置默认 input 流量为拒绝

注意,如果你是通过 ssh 连接到服务器,那么你应该先添加规则,然后再开启防火墙,否则后果自负。

这里说一下,ufw 启用防火墙则会自动配置开机启动,禁用则会取消开机启动。

基本控制命令

一般我们可以使用 allowdeny 选项来允许或者禁止连接,后接端口号或者协议名称都行,用斜杠“/”分割,然后可以显式追加 TCP 还是 UDP,不追加则默认两者都算。另外,我们一般更倾向于配置 input 条目,如果你要控制output 条目,则可以在 allow 或者 deny 与端口号之间显式的强调 in 或者 out,当然默认肯定是 in。

ufw allow|deny [in|out] PORT [/tcp|udp]
// 允许或者阻止  进入或者流出 端口 协议

下面是几颗栗子:

ufw allow 22
//允许任何人通过端口22连入本机(包括 UDP 和 TCP)
ufw deny 53/tcp
//阻止任何人通过53端口用TCP 连入本机
ufw allow smtp
//用协议名字方式来添加条目

高级控制命令

ufw reload
//重载防火墙
ufw show raw
//以 iptables 格式输出当前的规则
ufw status [verbose|numbered]
//显示详细的状态,如果要删除条目,你可能需要用到 numbered
ufw delete NUM
//删除某个条目,号码参考上一条命令。
ufw delete allow 53/udp
//也可以在之前的命令当中直接添加 delete 参数来删除条目

与 allow、deny 选项对应的,其实还有 limitreject,前者用于限制30秒内连接次数,超过6次则自动 deny 掉 IP;后者和 deny 功能相同,但不会返回“你被拒绝”的消息。

如果你有多个网卡,那么在强调 in 和 out 后追加 on 选项,可以针对某一个网卡做策略,举个栗子:

ufw allow in on eth0 to any port 80 proto tcp

添加更复杂的控制语句

通过编辑文件:

/etc/ufw/before.rules
//在 ufw 的所有条目之前生效

/etc/ufw/after.rules
//在 ufw 的所有条目之后生效

来添加更加复杂的、ufw 命令无法支持的 iptables 控制语句,比如说开启转发或者 nat 地址伪装等等,它的命令格式和 iptables 命令格式完全相同——因为这两个文件的加载方式就是 iptables-restore

当然,修改完这两个文件之后,你需要对 ufw 重启才能使它们生效。

延伸阅读

好了,基本上常用的介绍就这么多,如果你还想使用更高级的功能,请移步:

Ufw使用指南

Uncomplicated Firewall

另:如果你使用桌面版,这货其实还有图形端,叫做 Gufw。😜

Ubuntu 下更简单的防火墙 Uncomplicated Firewall,首发于落格 - logcg.com

阿里云 Ubuntu 更新镜像源

$
0
0

为了方便自己做国内 vps 服务器更新配置,一般都需要更改 dns 和更新源,否则一辈子别想打补丁…………总之,以前常用网易源但最近老是抽筋,所以现在推荐阿里云。

另,你可以在服务器的终端中输入“lsb_release -a”命令或者查看“/etc/issue”文件来确定当前系统的版本。

Trusty(14.04)

deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

Quantal(12.10)

deb http://mirrors.aliyun.com/ubuntu/ quantal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ quantal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ quantal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ quantal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ quantal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal-backports main restricted universe multiverse

Precise(12.04)

deb http://mirrors.aliyun.com/ubuntu/ precise main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ precise-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ precise-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ precise-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ precise-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ precise main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ precise-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ precise-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ precise-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ precise-backports main restricted universe multiverse

Oneiric(11.10)

deb http://mirrors.aliyun.com/ubuntu/ oneiric main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ oneiric-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ oneiric-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ oneiric-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ oneiric-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ oneiric main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ oneiric-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ oneiric-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ oneiric-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ oneiric-backports main restricted universe multiverse

Natty(11.04)

deb http://mirrors.aliyun.com/ubuntu/ natty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ natty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ natty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ natty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ natty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ natty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ natty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ natty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ natty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ natty-backports main restricted universe multiverse

 

阿里云 Ubuntu 更新镜像源,首发于落格 - logcg.com

在 ufw 上开启 nat 伪装和端口转发

$
0
0

可能一直到现在,你都一直不怎么熟练在 Linux 上怎么开启 nat 和端口转发——毕竟这种操作可能也就在部署服务器的时候需要一次。但它的操作实在是太繁琐了,尤其是当我们使用了 ufw 来编辑 iptables 之后,更不能直接编辑 iptables 了,这下到底该如何是好呢?

使用 ufw 来开启nat 伪装和端口转发,你可以先参考这篇文章Ubuntu 下更简单的防火墙 Uncomplicated Firewall了解一下 ufw 这个防火墙的前端,它其实给我们提供了更高级的操作,使用 ufw,可以避免去编辑 iptables、备份 iptables以及设置开机自动恢复 iptables,这样一来,配置就简单多了。

首先,我们先要

更改 ufw 默认转发策略

找到文件“/etc/default/ufw

修改其中的内容:

DEFAULT_FORWARD_POLICY="ACCEPT"   ←将 DROP 改为 ACCEPT

开启转发

编辑“/etc/ufw/sysctl.conf”文件,将里边的转发选项去掉注释(如果你要开启 ipv6转发,那么就把 ipv6的注释也去掉)

# Uncomment this to allow this host to route packets between interfaces
net/ipv4/ip_forward=1
#net/ipv6/conf/default/forwarding=1
#net/ipv6/conf/all/forwarding=1

添加转发条目

最后,我们编辑“/etc/ufw/before.rules”文件来添加转发条目——语法和 iptables 语法完全相同

# NAT table rules,在相关位置插入 filter
*nat
:POSTROUTING ACCEPT [0:0]

# Forward traffic through eth0 - Change to match you out-interface
# 按照需求插入你的转发条目
-A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

 

开启端口转发

# NAT table rules,额外插入端口转发 filter
*nat
:PREROUTING ACCEPT [0:0]

# Port Forwardings 写你的端口转发条目即可
-A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-destination 192.168.1.10

重启 ufw 使配置生效

ufw disable &&  ufw enable

在 ufw 上开启 nat 伪装和端口转发,首发于落格 - logcg.com


严重虚拟机漏洞 Venom 大半云服务受到威胁!

$
0
0

今天下午,我正在敲代码,然后位于西海岸的一家 vps 发来邮件,说服务器要重启更新,而我正好有一个 vps 是在他那里的。一般来说除了硬件及的维护意外,云服务基本上都可以在线的——毕竟,“高可用”是云服务的主打科目。

不过,这次不同,就在今日,新的虚拟机漏洞面世,利用这个漏洞,可以让你分分钟突破虚拟机限制而获取到同一服务器中其他服务器的访问权限!然后利用其他服务器的信息,进而就可以继续深入渗透,直到最终的数据中心!

所有使用 KVM 还有 Xen 虚拟平台的用户以及 QEMU 用户都受到这个漏洞的影响,由于这个漏洞位于 QEMU 软驱控制器上,也就是说不论是 Linux、osx还是 Windows,只要是运行在同一个服务器上,都会中招!

CrowdStrike 是国外的一家安全机构,他们最早发现了这个漏洞:

venom-graphic-640x895
venom-graphic-640×895

根据他们的介绍页面(见页尾)说暂时还没有在互联网上看到有人利用了这个漏洞——但我在国内的一个 vps 所在机房就遇到了诡异的整个机房被用来 DDOS 的情况,现在看起来八成就是这个漏洞。

原理

这个漏洞来自 QEMU 的虚拟软盘控制器,而这个代码又被很多知名虚拟平台引用……所以你懂的,使用了 QEMU 的都跑不掉,比如 Xen,比如 KVM,当然,还有 QEMU 自己。总之,这软盘东西虽然说现在的年轻人可能都不一定见过它了,而且电脑上也不再提供这个东西——但你在创建一个虚拟机的时候这东西还是会被默认的加载到系统中。而且,对于Xen 和 QEMU,就算你手动禁用了软驱,但有漏洞的代码还是能被攻击者利用。

虚拟机中的操作系统通过发送查询、读取、写入、格式化等命令来访问软盘控制器(FDC)。对于FDC的输入输出端口,QEMU的虚拟 FDC 使用一个固定大小的缓冲来储存这些命令以及相关数据参数。FDC 来持续监控每一个命令预计多少数据,在所有命令预计需要的数据都被虚拟机收到之后,FDC 执行命令并且清空缓存等待下一条指令。

缓存在 FDC 执行完所有命令之后就会被立即重置,除了两条被定义的命令。攻击者可以从虚拟机上发送这些命令以及经过精心修改的数据参数给 FDC,让它溢出数据缓存并且在服务器环境的进程当中执行任意代码。

范围

除了使用 QEMU 的虚拟机和平台之外,比如说 VMware, Microsoft Hyper-V等这一类没有使用 QEMU 的平台并不会受到这个漏洞的影响。

功能

由于有漏洞的代码位于虚拟硬件控制器上,所以只要是支持软驱的操作系统都跑不掉:Windows、Linux、osx 全都会被提权,记住,是直接获取 root/administrator 权限

补丁

目前比较知名的服务商都已经放出补丁或者文档:

(连接列表来自 CrowdStrike)

这和其他虚拟机穿透漏洞有什么区别吗?

有区别,这里 CrowdStrike 列举出了一些其他虚拟机穿透漏洞:

  • CVE-2007-1744 – Directory traversal vulnerability in shared folders feature
  • CVE-2008-0923 – Path traversal vulnerability in VMware’s shared folders implementation
  • CVE-2009-1244 – Cloudburst (VMware virtual video adapter vulnerability)
  • CVE-2011-1751 – Missing hotplug check during device removal
  • CVE-2012-0217 – 64-bit PV guest privilege escalation vulnerability
  • CVE-2014-0983 – Oracle VirtualBox 3D acceleration multiple memory corruption vulnerabilities

具体我就不再翻译了,想了解更多的朋友自己去看吧:

延伸阅读

Extremely serious virtual machine bug threatens cloud providers everywhere

VIRTUALIZED ENVIRONMENT NEGLECTED OPERATIONS MANIPULATION

 

严重虚拟机漏洞 Venom 大半云服务受到威胁!,首发于落格 - logcg.com

Could not load the image referenced from a nib in the bundle running on device

$
0
0

在使用 xcode 做一个程序的时候,我们普遍会使用一些图片来代替掉按钮上生硬的文字,让界面更加美观。

不过,在添加图片的时候,我就遇到了编辑的时候 storyboard 可以显示,但是程序运行的时候却无法显示的问题。

查看记录发现报错:

Could not load the image referenced from a nib in the bundle running on device

国内关于 swift 开发的文档和问答实在是太少了,就连教程都是模棱两可——其实也不能怪人家,毕竟 xcode 更新很快,很多教程制作的时候还是 beta 版本,而现在却已经是正式版了。(比如说在我看的这个教程里边明明人家就没有这样的问题。)

不过,无论如何,国外还是有不少友人遇到了和我相同的问题,最终,还是让我得到了解决办法:

  1. 点击你的项目名称,右边的代码区就会变成通用选项;
  2. 在右边的选项当中找到“Build Phases”选项卡;
  3. 在里边“Copy Bundle Resources”这一项当中,点击“+”号来添加图片;
  4. 当然,拖到这里也是可以的。

不过,我在这样做的过程当中遇到了另外一个问题

如果你直接拖入或者点击“+”号导入文件夹,问题依旧。这时候你需要把每一个图片单独导入(就是不要用文件夹),然后看看编译运行图片应该就能够正常显示了,这时候,再回去删掉刚刚单独导入的这些图片。

也许,这是一个 bug。

——————————

总之,在导入的时候勾选拷贝到项目总是没有错的。😃

 

延伸阅读:

Could not load the image referenced from a nib in the bundle running on device

Could not load the image referenced from a nib in the bundle running on device,首发于落格 - logcg.com

如何在国内使用 gem

$
0
0

如果你想了解 Ruby,或者想在你的电脑上安装几个 Ruby 软件包,你可以很轻松的使用 RubyGems 来一键下载——就好像 Ubuntu 里的 apt-get、类似 redhat 里的 yum 等等。

所以,想要安装 Ruby 软件包,你就需要 gem。不过,除了安装 gem(如果你的电脑是 Linux 或者 osx,很可能已经自带,使用命令“gem -v”来验证)

但是版本可能不是最新(尤其是 osx,xcode 一般不会给你附带最新的工具)所以我们要升级它,这个时候,你可能就会遇到这个错误:

Unable to download data from https://rubygems.org/

至于说原因是找不到还是超时这要看 gfw 的心情了。总之,这是一个问题。

但是难点在于似乎即使使用了 vpn,gem 也并不怎么买账(不排除我 vpn 的问题),所以,我们必须寻找其他的解决办法。

更换镜像源

好吧,既然是包管理工具,那总是有更新源的,国内我找到一个淘宝的更新源,这个更新源是完整镜像,更新频率为每15分钟同步一次,我们用它来替代官方源。

淘宝镜像源位于阿里云服务器上,而官方源位于亚马逊云,所以你懂的。

使用如下命令来更改 gem 更新源:

$ gem sources --remove https://rubygems.org/
$ gem sources -a http://ruby.taobao.org/
$ gem sources -l
*** CURRENT SOURCES ***
http://ruby.taobao.org
//确保只有 ruby.taobao.org

然后就可以尝试更新 gem 版本了:

gem update --system //你可能需要使用 sudo 命令来获取权限

再然后………………

enjoy!😜

如何在国内使用 gem,首发于落格 - logcg.com

豆瓣 FM 的歌曲列表获取问题

$
0
0

最近开始学习 Swift 了,就好像是“hello world”一样,似乎每一种语言总是有一个“编写豆瓣 FM”的项目教程😶

总之,我也开始用这个手把手教程来熟悉开发流程了,不过,昨天才做到显示播放列表并且显示歌曲封面,今天添加了播放功能就崩溃闪退了!

好吧,即使将新添加的代码注释掉,原来的代码也无法正常运行了。你看,出现了这样的万能报错:

signal SIGABRT

还有这样:

IOS EXCEPTION 1 (LIBC++ABI.DYLIB: TERMINATING WITH UNCAUGHT EXCEPTION OF TYPE NSEXCEPTION)

闪退崩溃了也没有有用的报错,这可坑死我了

一个小时后

终于,我找到了原因,由于豆瓣 FM 是没有 API 的,所以歌曲的频道和列表都是通过抓包而来,而恰好在今天!没错,就是今天!它改了!

总之,教程当中的连接 get 下来是空的 json 文件。。。没办法,参考其他语言和项目当中的教程,我终于找到了一个能用的……可惜列表只有四五首歌,不能获取那么多了。

如果你和我一样,遇到了这个问题,那么你可以将歌曲播放列表的 get 地址换成如下:

http://douban.fm/j/mine/playlist?type=n&channel=0&from=mainsite

另外,如果你有新的地址,记得告诉我一份😚

豆瓣 FM 的歌曲列表获取问题,首发于落格 - logcg.com

Swift 常用数据类型浅析

$
0
0

现在大部分的高级编程语言,都是从经典的 C 语言演变而来,你在这些编程语言的语法当中,或多或少地都能找到几分 C 语言的影子,这也是为什么很多人依旧推荐,从 C语言来入这个编程语言的门。

可是,C 语言的确足够古老了,很多人都是冲着写一个 APP 来玩的目标学习编程的,你去学 C语言……抱歉,可能一整本书学完了,也不能写出一个美观漂亮的 UI 界面。

不过,话说回来,要学习 Swift , 至少还是应该知道一些最最基本的知识——比如说,相对于 C 语言来说,Swift 是一门高级语言。

扯远了,总之,这节课我们想要学习和了解的知识点是:编程语言中的数据类型。

由于大部分编程语言源于 C,又由于计算机架构本身如此,所以基本的数据类型永远是 那么几个,比如说整形、比如说浮点型、比如说字符串等等,这节课,我们就依次来以 Swift 的角度解读这些数据的类型。

整形 Int

几乎在所有的编程语言当中都有 Int 整形数据这个概念,在 C语言中,int 大概会在内存当中占用4个字节,也就是 4byte=32bit,而在 OSX 当中由于操作系统是64位,那么整形的大小应该是64bit 也就是8个字节。

这一点我们同样可以使用 sizeof()函数来查看。至于最大究竟可以存放多大的数,这里不做讨论,各种平台千奇百怪,总之,你知道这货能放很大的数绝对够用就是了,如果实在不够,还有 UInt 类型, 这代表了非负整形,在整形变量的内存空间当中,总得保留几个 bit 用来标记这个数字是正数还是负数,如果你想要更大的正整数,那么 UInt 是个不错的选择(就是把保留的 bit 也用来标记数字,这样可以标记更多。)C语言当中我们经常会遇到比如整形溢出那个实验……在 Swift 当中这种情况不会发生,因为编译器就会检查出来。

整形,顾名思义它是用来存放整数的,任何小数点后边的数都会被抹掉,在 Swift 当中,甚至编译器不接受直接给整形赋值浮点数。

浮点型 Float

浮点型是专门用来存放小数的类型,Swift 只会为你保留六位有效数字,比如说一个是这样的:

let num:Float = 123456789.22

 

那么一个浮点型变量最终会输出成这样:

1.23457e+08

这是科学计数法,其实也就是这样:

123457000

你看,从左到右六位数往后的细节就都丢弃了呢!所以,要避免一个很大的数加上一个很小的数,这样会造成细节的缺失。(这里补充一句,如果是 C语言的话,那么输出的数字的细节是会存在的,只不过会变成各种奇奇怪怪的数字罢了。)

双精度类型 Double

那么说我就是任性我就是要输出一个大数加上一个小数的数字,比如还是这个:

let num:Double = 123456789.22

 

我就要原封不动的输出!那么双精度可能是你的最爱:

123456789.22

双精度类型也占用了64bit 来储存数值,不过它包括了小数,这也是 Swift 推断类型时候对小数首选的类型(注意不是 Float)如果你给变量初始一个带小数的数字比如 “0.0”那么编译器会自动推断这货是双精度,这样就可以保存你的数字了。

字符型 Character

说了那么多关于数字的类型,我们再来说一说字符,大家都知道,我们输入的每一个字母,每一个文字,都是一串代码翻译而来,而这个 Character 类型,就是将这些代码储存的类型,这个不常用,这里我们点出它是为了说下一个类型。

字符串类型 String

字符串就是一串字符咯,它是字符型的值的一个集合比如说“Hello World”

在实际使用当中,String 使用的机会是很多的,比如说显示个列表,名称、还有简介等等一切需要显示文字的地方基本上都跑不掉 String

数组 Array

数组是一系列相同类型的有序组合,可以是一串 int ,也可以是一串 String ,全看你的喜好,数组从0开始计数,比如我要一个有八个成员的数组,那么数组的大小就是8,但第一个值的序号是0,最后一个值的序号则是7,很多人一开始在这里犯糊涂,要区分总数量和下标的序号之间的关系。

字典 Dictionary

字典和数组不同,它恰好弥补了数组的缺陷:字典允许不同类型的值组合。但它也不提供顺序了。

所以,字典提供了“键”也就是 key 来作为值的标记。使用字典的时候,需要预先规定字典中键和值的类型,然后才可以使用。

基本上这些就是常用的数据类型了,剩下的我们会随着课程的深入继续讲解。

Swift 常用数据类型浅析,首发于落格 - logcg.com

什么是程序语言?

$
0
0

既然要学习编程,那么我们还是至少应该知道自己学习的是个什么东西才好吧?

说起编程,其实最早还是要追到我们的大神 艾伦图灵 小哥那里去。当时图灵发明出了图灵机——这东西很牛逼,不完全体就已经轻轻松松把二战缩短两年这里我们就不展开讲了,主要我们说,这个图灵机,基本上就是最早的电脑啦!

当然,教科书上不都说 冯诺伊曼 是电子计算机之父吗?嗯,我不会告诉你他俩搅基来着……当然,好吧也就是勾搭了几下。所以,如果你去搜索关键词 “图灵 冯诺伊曼”那么你会看到至今还争论不休的话题“谁是计算机之父”。

图灵机那时候还是在打点的,进行有限次的运算,简单的说,也叫有限机,具体的计算方法我们略去不讲,但它的根本我们还是要提一下,就是函数。

若干的函数进行不停的运算,存储等等,这样的过程最终能帮我们计算出想要的结果——好吧,这些都局限在数学之上,而且,还是二进制。

为什么要使用二进制?

想要让机器来做计算,那么就必须用最简单的结构来实现,把问题简单化:流水线上的工人怎样才能做成电脑呢?他们不需要知道电脑的每一个部件怎么用,只要把自己手上的螺丝拧紧就可以了。

计算机也是一样,它不关心你提出了多么复杂的题目,它只需要关心自己的纸带上的状态,即有和无。所以,艾伦很巧妙的发现,如果把问题转化为二进制,机器就能搞定了!(毕竟那时候也只有纸带啊!)

这样,状态机就有了——图灵机的祖宗。

一转眼艾伦给上帝做电脑去了……

冯诺伊曼这个天才富二代听说了埃尼阿克计划,觉得“我靠好无脑!不过我喜欢!”然后就入股就去干了,结果成功了,后来大型计算机就有了,但没办法,还是用纸带打点录入——尽管它已经用晶体管来储存状态。

随着时间的推移,最终计算机保留了这个古老的结构——二进制。我们的 CPU 依旧运行这这种古老的算法,唯一不同的是晶体管变成了纳米级别的半导体。

这时候计算机的运行速度大大加快了,可以运行“我的膝盖中了一箭”这样的大型游戏了,难道开发人员还要傻呵呵的去用棍子戳纸带么?当然不了,老早,就有老哥看不惯这个情况,发明出了机器语言。

汇编?嗯,差不多。

我们都知道,汇编是一门机器语言,它就是直白的用简单的文字代表了机器的代码——没错,不同公司的汇编语言是不同的。

作为一个程序猿,你不懂个七八门汇编怎么好意思出去见人?历史的车轮滚滚前进啊,C 语言就问世了。它成功的把程序语言变成了人类可以懂的单词了!

你只需要稍微按照特定的格式写好代码,放到编译器里边刷刷刷,程序就可以运行了!

这时候你知道了,“编译”,是现代编程语言变成程序的一个必要的过程,你的 iPhone 可不懂什么 Swift。

但是 C语言还是有它的局限的,这东西依旧太低级,不太够用啊。如果你了解 C语言,那么请问:“如何用 C语言编写《山口山》(《魔兽世界》)?”其实这个问题有点无聊,这是我的老师在给我讲什么是面向对象什么是面向过程时候问到的。

C语言的函数式编程固然好,但清晰的理顺每一个过程这样的开发就注定了在一个大团队当中它无法完美的协调。所以微软有了 C++ ,也就是我们常说的 CPP;苹果有了 Objective-C;嗯,大家有了 Java。后来因为 C 后边有加号了,放不下了,多出来的加号摞起来,便又有了 C#。

这里描写的不太严谨,希望大家不要过于深究,谈资而已。我想要说的重点是“Object- Oriented” Programming  也就是 OOP,就是大家常说的“面向对象”编程诞生了。

面向对象的好处是各个类之间再也不用相互制约了!每一个类每一个方法做他们自己的事情,你只需要在用的时候召唤(调用)它们!

这里我们还要讲到 Java,之前我们谈到了编译器这个东西,Java 的编译器与 C语言的不同。由于面向对象的语言是高级语言,它摆脱了 C 语言对于过程的束缚,所以人们就想,那是不是顺便就让它编译一次全平台运行呢?

这一点我们前边也提到过:不同的平台,汇编语言可能是不尽相同的——不同的架构,它的二进制指令也是不尽相同的。这就注定了,你 VB 只能在 Windows 下跑,C 语言想要跨平台,必须带着源码重新编译——事实上要处理的问题可不是说说这么简单。

于是就诞生了 “Java 运行时”——这也是 Java 的理念,叫做“一次编译,全平台运行”,从此,你再也不用关心内存是什么了!Java 环境帮你搞定一切,你只需要专心你的程序代码即可!

我不得不说,这是后来大部分人吐槽 Java 内存管理的原因。

讲了这么多 Java,我们这还是 Swift 课程吗?当然,我想说的是,自动的内存管理,也成了高级语言的标配(所以高级语言没有指针)。由于有了这些高级功能,你的代码也不会再被翻译成二进制,而是一种叫做“字节码”的东西,这种东西可以被特定的环境执行——比如说 iOS。

但我要讲,Swift 和 OC编译的字节码是相同的,这也是不少人吐槽 Swift 并不比 OC 强多少的原因之一。

说了这么多,我想你基本上应该了解了什么是编程语言——其实这东西就是把人类的思维逻辑转换成计算机程序的一个工具,就像人与人对话需要相同的语言一样,你想要告诉机器做什么,就需要一门程序语言来让计算机懂你的意思——计算机太笨,所以你不能说的那么艺术化“给我一杯水”这样的命令不太能够执行,(我们假定有这样的机器人问世),那么你应该这样来讲:

启动

调用 语音识别

调用 肢体运动

语音采集

分析语音

如果语音命令为“给我一杯水”

那么(进入厨房)

找到饮水机

检查()

如果检查为假

报告“没水了!”

否则 接水()

端着水返回

检查

如果饮水机有水

那么返回 真

如果饮水机没水

那么返回假

接水

拿杯子

压水

检测水位

到达三分之二则停止

返回真

 

(代码仅供娱乐)

什么是程序语言?,首发于落格 - logcg.com

在 Xcode 中直接预览应用 UI

$
0
0

在使用 Xcode 做 app 应用开发的时候,设计一下应用的 UI 界面是家常便饭,但是每次都要运行然后去模拟器里查看输出一件很麻烦的事情,尤其是当需要修改的元素很多、而且需要配适各种屏幕大小的时候——毕竟,现在 iPhone 的产品线不再那么单一了。

所以,一口气运行三四个模拟器这种事情恐怕也就只有你能干得出来了。

其实,Xcode 并不是没有给我们提供更方便的选择——在storyboard编辑页面,完全可以直接预览 UI 而不需要编译后在模拟器里运行。

现在,我们来创建一个示例项目,这个项目我只添加了一点点基本的元素作为演示,这并不是一个完整的项目。

示例项目
示例项目

这个时候如果我想看看这个界面在手机上的真实模样,那么一般来讲使用 cmd+r 编译运行,那么 Xcode 就会自动调用模拟器来显示——如果我想看在其他型号的 iPhone 上的预览,那么我就需要重新选择环境,然后再编译一次,相当的麻烦。

选择 UI 预览
选择 UI 预览

如上图显示,我们点击工作区左上角的那个方块,然后在出现的菜单当中选择最末尾的“Preview”,然后按住 option + shift 按钮再点击它。

用鼠标双击那个加号
用鼠标双击那个加号

在弹出的这个窗口当中,我们用鼠标双击那块青色区域右边的加号,这时候你就发现 Xcode 中的辅助窗口(默认是隐藏的)从代码变成了预览区域,这里边默认是 iPhone4s 的大小,你已经能够看到你的 UI 的预览了。

隐藏掉其他侧栏,让可视空间更大一点
隐藏掉其他侧栏,让可视空间更大一点

怎么样,这样的预览,可是即时的哦~再也不用来回编译代码啦!

要添加其他尺寸的屏幕预览,只需要点击预览窗口左下角的“+”号即可!

屏幕快照 2015-05-21 下午5.47.43

在 Xcode 中直接预览应用 UI,首发于落格 - logcg.com


Swift Int Float Double String 类型互转

$
0
0

在 C语言当中,要转换类型似乎并不怎么困难,这次在学习 Swift 的时候却有了困惑。

似乎记得哪个教程当中讲过,但记不清了,这次又找到了,就记录下来:

假定三个变量:
var i:Int = 5
var f:Float = 3.3
var d:Double = 4.455

若要 Int 转换为 DoubleFloat ,则如下

d = Double(i)
f = Float(i)

若要转换为 Int,则如下:

i = Int(d)
i = Int(f)

若要转换为 String,则如下:

var string:String
string = "\(i)"
string = "\(d)"
string = "\(f)"

若要 String 转为 Int 等,则如下

var s:String = “2.555”
var t:String = “3”
//t可以直接使用
//t.toInt直接转换为Int型

//而s 用这个方法的话输出会是nil
var s1 = s as NSString
//有这一句之后,就可以用下方的方法转换为int、float、double
s1.integerValue
s1.doubleValue
s1.floatValue

 

有一个扩展方法可保留double的位数,想保留多少位可以进行操作

extension Double
{
func format(f:String) ->String
{
return Nsstring(format:"%\(f)f",self)
}
}

d.format(“.2″)就是保留小数点后两位数字,此时的输出会变成“4.46”

 

Swift Int Float Double String 类型互转,首发于落格 - logcg.com

浅谈 MVC 以及软件开发当中的 SoC

$
0
0

不论你是在学习何种语言,基本上都会遇到一个叫做 MVC 的概念,它是一个程序开发的模式,以“分离展现”作为核心,在层级框架当中有着巨大的影响力。

MVC 是一个简写,三个大写字母分别对应着 Model ViewController

在如今我们创建的应用软件当中,很多情况下又要使用 GUI 图形界面,又要使用 CLI 命令行界面,除此之外,有时候还要应对甚至两者同时使用的情况。

这时候我们就想,不同工作域的对象如果能够完全自治,比如说我们使用 CLI 功能,那就不去触碰 GUI 上的东西,这样就能大幅增加应用软件的稳定性和执行效率。所以对应的,数据的内容,就应该由专门的模块去执行它,这样,便能快速的兼容和支持不同的展示模式。而它们之间的沟通,就通过 Controller 进行。

这就是 MVC,它将程序分为三个分离的部分,有人将之称为三层,其实我觉得是不恰当的,管理数据的 Model 和负责展示的 View 不存在明显的层级关系,它们是并列的——一个管展示一个管数据罢了,中间来个负责二者沟通的角色,便是 Controller

Model ←→ Controller ←→ View

那么,这些和 SoC 有什么关系呢?这里的 SoC 不是封装芯片,而是

Separation of Concerns

我将之翻译为“责任分离”。其实就是说让不同的部分专心做不同的事情——让 GPU 就管图形计算。我这样解释你可能更容易理解它的含义。我这么说,你应该就知道 SoC 和 MVC 的关系了吧,后者就是前者理念延伸出来的一套模式。

浅谈 MVC 以及软件开发当中的 SoC,首发于落格 - logcg.com

让 Xcode 也用上 Solarized Dark 颜色主题

$
0
0

貌似这个 Solarized 主题一直都很火,这是一套终端文字颜色配色方案,十分好看,有明暗两种,不过,据我自己猜测,应该暗色的多一些吧……

点击下图跳至官网。⬇️

solarized-vim
solarized-vim

因为终端普遍还是黑色一点的好看😜

总之,这套颜色主题为很多终端都提供了配置文件可以直接导入,比如说 osx 自带终端,还有 iterm 等等。后来有人觉得,如果在使用 IDE 编程开发时候,代码高亮的配色也能使用 Solarized 主题那该多好?于是:

这套颜色主题也为比如Vim 比如 NetBeans 等等——但不包括 Xcode 6.

这是一个很悲伤的故事,根据官方所述,4和5都已经支持,但6还在路上。。。

不过,我还是找到了一个给做出来了的,不过这个哥们只做了暗色系的方案——好吧,这也是我正需要的。

Solarized-Dark-for-Xcode

使用如下命令来安装:

//克隆git
~:git clone https://github.com/ArtSabintsev/Solarized-Dark-for-Xcode.git

Cloning into 'Solarized-Dark-for-Xcode'...
remote: Counting objects: 66, done.
remote: Total 66 (delta 0), reused 0 (delta 0), pack-reused 66
Unpacking objects: 100% (66/66), done.
Checking connectivity... done.

//创建目录
mkdir ~/Library/Developer/Xcode/UserData/FontAndColorThemes
//添加配色文件
cp Solarized-Dark-for-Xcode/Solarized\ Dark\ @ArtSabintsev.dvtcolortheme ~/Library/Developer/Xcode/UserData/FontAndColorThemes/

完成之后彻底退出 Xcode,重新开启它,你就可以在偏好设置当中来选择这个配色主题了😃

修改 Xcode 的配色主题
修改 Xcode 的配色主题

让 Xcode 也用上 Solarized Dark 颜色主题,首发于落格 - logcg.com

GoAgentX PAC 失效 的 解决办法

$
0
0

如果你以前安装过 GoagentX ,然后卸载了,后来又重新安装,那可能你会发现即使开启了 pac 模式,其实也是跑着“全局”的状态。

这一点,从 ip138上可以验证。

我尝试使用自己生成的各种 pac,结果干脆连网也上不去了😅

后来从这里看到了一条消息,人家是这样解决的:

“在 GoagentX的配置页面恢复一下出厂配置”

事实证明,果然好使!

恢复之后要求重启应用,这个过程中你添加的账号配置不会消失。重启应用之后,会提示你使用 gfwlist 来更新 pac,点确定就好了😃

GoAgentX PAC 失效 的 解决办法,首发于落格 - logcg.com

OSX 10.11 EL Capitan 运行 Java SE 8

$
0
0

前几日,最新一届的 WWDC 大会为我们带来了 EL Capitan 这个10.11的最新的 osx 系统,我自然在第一时间就装上了开发者预览版。原因无他啊,就是论坛里网友们说 bug 非常少啊。遥想当年,从10.9升级到10.10的时候,即使到了公测阶段,依然是 bug 满天飞呀!

但这次确实 bug 少之又少,即使找到的一些也不伤大雅,真是叫人惊讶!

不过,这些 bug 里边恐怕有一个是让人不得不重视的,那就是暂时不支持 Java SE 6了,这样直接就导致所有使用 Java 的程序都不能够运行,坑啊!

This application requires the legacy Java SE 6 runtime which is unavailable for this version of OS X.”

好在有大神给出了解决办法,既然不支持古老的 Java SE 6,那我们何不直接安装最新版本的 Java SE 8?

准备工作

首先,你需要去官网下载最新版本的 JDK(为什么是 JDK 而不是 JRE?因为 JRE 的修改方法更麻烦一些……与其如此,还不如一步到位。)然后安装之。

验证版本

打开终端,然后使用如下命令来查看,如果你的结果和我这里的差不多,那说明已经安装好了。

╰─➤  java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

修改配置文件

请注意看目录,没有 System!

不是 System 里的 Library!

找到如下路径的文件,修改之。(需要管理员权限)

sudo vim  /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Info.plist

//找到如下字段
<key>JVMCapabilities</key>
<array>
    <string>CommandLine</string>
</array>


//修改成这样:
<key>JVMCapabilities</key>
<array>
    <string>CommandLine</string>
    <string>JNI</string>
    <string>BundledApp</string>
</array>

创建链接

由于 EL Capitan 有一个新的叫做“RootLess”功能,所以我们只能够一级一级的创建目录,按照如下目录依次进入,如果不存在则创建:

cd /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
sudo mkdir bundle
cd bundle
sudo mkdir Libraries

然后使用如下命令来创建链接(这是一条命令)

sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/server/libjvm.dylib /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/bundle/Libraries/libserver.dylib

创建两个空目录

按照上边的方法,我们还需要一级一级的创建两个空目录:

/System/Library/Java/JavaVirtualMachines/1.6.0.jdk
/System/Library/Java/Support/Deploy.bundle

//为了绕过那个苦逼的 rootless,一级一级的创建才行,懒得关闭了。

cd /System/Library/Java/JavaVirtualMachines
sudo mkdir 1.6.0.jdk
cd ..
sudo mkdir Support
cd Support
sudo mkdir Deploy.bundle

你的实际操作环境很可能跟我的例子不一样,但是大同小异,注意变通即可。

重启系统

这时候,你还需要最后一步,由于10.11 这时候的重启会变成关机,我们使用命令行来重启,虽然会卡住一下,但却是能够重启……

sudo shutdown -r now

优化 App

做完以上工作,很有可能你还是悲剧的发现你的Java 程序无法启动,不要慌张,可能是因为程序不支持最新版本 Java 导致,我们需要手动来让它支持:

在你的应用程序上点击鼠标右键——或者按住 control 点击之,选择“显示包内容”,在 Content 目录下有个 Info.plist 文件

完整的路径应该是这样的:/Applications/你的Java程序.app/Contents/Info.plist

 

编辑这个文件,在里边找到这句话:

<key>JVMVersion</key>

<string>1.*</string>

做如下修改:

<key>JVMVersion</key>

<string>1.8*</string>

保存之……你可能需要管理员权限,如果不行,就拖出来修改再覆盖回去……总之,编辑之后你的 Java 程序就 ok 啦

 

OSX 10.11 EL Capitan 运行 Java SE 8,首发于落格 - logcg.com

Viewing all 368 articles
Browse latest View live




Latest Images