关于软件授权的思路

过去共享软件做注册码机制,破解软件大行其道,究其原因,算法再牛逼也是对称加密,知道了算法甚至多知道几个结果就能推导出需要哪些数据做参数。
最近肆虐的WanaCrypt0r病毒的如何做到安全加密防破解的呢?
他使用了一种cryptGenRandom的方案,就是对每个文件随机产生加密,用户就很难手动恢复所有文件。而且加密的文件类型涵盖广泛,后缀名
.doc, .docx, .xls, .xlsx, .ppt, .pptx, .pst, .ost, .msg, .eml, .vsd, .vsdx, .txt, .csv, .rtf, .123, .wks, .wk1, .pdf, .dwg, .onetoc2, .snt, .jpeg, .jpg, .docb, .docm, .dot, .dotm, .dotx, .xlsm, .xlsb, .xlw, .xlt, .xlm, .xlc, .xltx, .xltm, .pptm, .pot, .pps, .ppsm, .ppsx, .ppam, .potx, .potm, .edb, .hwp, .602, .sxi, .sti, .sldx, .sldm, .sldm, .vdi, .vmdk, .vmx, .gpg, .aes, .ARC, .PAQ, .bz2, .tbk, .bak, .tar, .tgz, .gz, .7z, .rar, .zip, .backup, .iso, .vcd, .bmp, .png, .gif, .raw, .cgm, .tif, .tiff, .nef, .psd, .ai, .svg, .djvu, .m4u, .m3u, .mid, .wma, .flv, .3g2, .mkv, .3gp, .mp4, .mov, .avi, .asf, .mpeg, .vob, .mpg, .wmv, .fla, .swf, .wav, .mp3, .sh, .class, .jar, .java, .rb, .asp, .php, .jsp, .brd, .sch, .dch, .dip, .pl, .vb, .vbs, .ps1, .bat, .cmd, .js, .asm, .h, .pas, .cpp, .c, .cs, .suo, .sln, .ldf, .mdf, .ibd, .myi, .myd, .frm, .odb, .dbf, .db, .mdb, .accdb, .sql, .sqlitedb, .sqlite3, .asc, .lay6, .lay, .mml, .sxm, .otg, .odg, .uop, .std, .sxd, .otp, .odp, .wb2, .slk, .dif, .stc, .sxc, .ots, .ods, .3dm, .max, .3ds, .uot, .stw, .sxw, .ott, .odt, .pem, .p12, .csr, .crt, .key, .pfx, .der

软件做授权可以参考什么呢?

单项加密或者服务器存储尽可能多的特征来保证认证,把校验数据在软件开发者的服务端留存一份。

用户在安装、升级或迁移时都需要连接到软件开发者的服务端做校验,就杜绝了任何破解的可能性。

当然如果想网开一面,故意让破解可能的话,就学学WanaCrypt0r,提供穷人通道: )

参考资料:http://www.freebuf.com/vuls/134602.html
https://gist.github.com/rain-1/989428fa5504f378b993ee6efbc0b168

web开发常用程序安装提速指南

一、常用的通用方案我们再过一遍,VPN、HTTP/HTTPS代理、Socks5代理、IPv6
二、做php开发离不开composer
composer本身下载是个挺蛋疼的事,我做了一个windows版本的composer安装包,linux、mac用户可以用包管理或者翻墙下载
三、mac用户必备的homebrew
第一步
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin git://mirrors.ustc.edu.cn/homebrew-core.git

第二步
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.bash_profile
source ~/.bash_profile

brew update

注意有的人用的zsh,要注意修改命令生效的文件
参考链接https://www.zhihu.com/question/31360766
四、nodejs
淘宝给我们做了一件大好事
先安装nvm然后

export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node
export NVM_IOJS_ORG_MIRROR=https://npm.taobao.org/mirrors/iojs

然后想安装哪个版本的nodejs、npm随便你

nvm install 7
nvm use 7

如果装了新版本的nodejs,以前装的全局npm包可以这么迁移过来

nvm install 7 --reinstall-packages-from=6

五、npm、yarn
搞nodejs、前端js开发的同学用的最多的就是npm和yarn
全局装一个nrm
nrm use taobao
还可以直接去修改.npmrc
# .npmrc
registry=https://registry.npm.taobao.org/
disturl=https://npm.taobao.org/dist

参考链接:http://zqlu.github.io/2016/05/10/taobao-nodejs-mirror/

PHP源码学习计划1

计划:通过3个月时间把php源码学习完毕

今晚我只看了一个库https://github.com/php/php-svn-helpers
这个库只有两个shell脚步文件
作用是我们从github迁出php代码后需要提交到svn时,把git代码库转换为对应的git-svn库

文件内容非常简单

适合初学shell、git命令的同学阅读

========
更新:我又看了一个库https://github.com/php/pecl-file_system-phdfs
这个是pecl库中的php操作hdfs(Hadoop)的扩展
目测功能单一,不会太复杂

采用的是php license 3.0

homebrew缓存路径

由于在终端下载速度太慢,遂考虑先通过地址下载文件后手动放到 缓存目录
$wget https://homebrew.bintray.com/bottles/mysql-5.6.26.yosemite.bottle.tar.gz
$cd /Library/Caches/Homebrew/
$mv ~/mysql-5.6.26.yosemite.bottle.tar.gz ./
$brew install mysql

done!

==> Downloading https://homebrew.bintray.com/bottles/mysql-5.6.26.yosemite.bottle.tar.gz
Already downloaded: /Library/Caches/Homebrew/mysql-5.6.26.yosemite.bottle.tar.gz
==> Pouring mysql-5.6.26.yosemite.bottle.tar.gz
==> /usr/local/Cellar/mysql/5.6.26/bin/mysql_install_db –verbose –user=zouyi –basedir=/usr/local/Cellar/mysql/5.6.26 –
==> Caveats
A “/etc/my.cnf” from another install may interfere with a Homebrew-built
server starting up correctly.

To connect:
mysql -uroot

To have launchd start mysql at login:
ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
Then to load mysql now:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
Or, if you don’t want/need launchctl, you can just run:
mysql.server start
==> Summary
🍺 /usr/local/Cellar/mysql/5.6.26: 9854 files, 339M

Mac下MySql卸载方法

Mac下MySql卸载方法

mac下mysql的DMG格式安装内有安装文件,却没有卸载文件……很郁闷的事。
网上搜了一下,发现给的方法原来得手动去删。
很多文章记述要删的文件不完整,后来在stackoverflow这里发现了一个遗漏的地方,所以将完整版记述在这里,以供查阅。
先停止所有mysql有关进程。

最后这条很多文章都丢了,切记切记。

 

sudo rm /usr/local/mysql sudo rm -rf /usr/local/mysql*sudo rm -rf /Library/StartupItems/MySQLCOM sudo rm -rf /Library/PreferencePanes/My*vim /etc/hostconfig and removed the line MYSQLCOM=-YES-rm -rf ~/Library/PreferencePanes/My*sudo rm -rf /Library/Receipts/mysql*sudo rm -rf /Library/Receipts/MySQL*sudo rm -rf /var/db/receipts/com.mysql.*

Incompatible implementation of send() in Client / ClientInterface (phpunit)?

Incompatible implementation of send() in Client / ClientInterface (phpunit)?
开发环境 lumen
在phpunit执行测试时报错

PHP Fatal error: Declaration of GuzzleHttp\Client::send() must be compatible with GuzzleHttp\ClientInterface::send(GuzzleHttp\Message\RequestInterface $request) in /Users/michael/Code/contrib/guzzle/src/Client.php on line 26

https://github.com/guzzle/guzzle/issues/1214

找到报错的解决帖

发现自己的项目版本挺新的

于是在autoload加上加载文件的文件名输出

发现加载了global 文件
框架安装的时候是全局安装的
composer update却只更新了本项目
找到global的composer。json文件,把phpunit之外的项目都删掉,global update 解决问题

Console Wars – PHP CLI Libraries 命令行战争 - PHP的终端类库

Console Wars – PHP CLI Libraries

三大PHP终端类库

每个都zhendui不同用户类型用户喜好提供了不同的方法

  • Symfony console 测试稳定、鲁棒性好、文档丰富、能解决大部分问题 
  • Hoa console 更专业,适合做控制窗口、鼠标、指针等
  • Webmozart console 是最新的库,马上要出稳定版本了,适合那些很快变大的新项目

搭建自己的公开CentOS源

背景:公司的网络实在是有够变态的,有层http代理,没法好好上网,装个linux做实验的时候各种软件下不了,不太懂运维,偶然想到去看局域网里的linux服务器是怎么更新的,果然挖出一个内网的yum源,顺便就想到自己搭建一套http源,从公网里定期同步更新一下,用到的时候就很爽了。

上手:

首先呢,把这个服务器扔到虚拟机里了,远程操作和扩展硬盘会比较容易一些,而且平时挂在那也不会费太多资源。

安装了Centos 6.5

分配两个网卡(一个自动,一个对接局域网)和两块硬盘,其中一个硬盘挂载到/var

找到了国内的高校源 bit、ustc

http://mirror.bit.edu.cn/web/

http://mirrors.ustc.edu.cn/

他们都提供了rsync服务

在linux上安装rsync客户端

我把目录放在/var/www/pub下

依次创建目录层级,只同步我需要的源可以有效减少磁盘占用,不然一个源同步下来我的硬盘就报废了

rsync -avrtH rsync://mirrors.ustc.edu.cn/centos/6/ /var/www/pub/centos/6/
rsync -avrtH rsync://mirrors.ustc.edu.cn/rpmfusion/free/el/ /var/www/pub/rpmfusion/free/el/
rsync -avrtH rsync://mirrors.ustc.edu.cn/rpmfusion/nonfree/el/ /var/www/pub/rpmfusion/nonfree/el/
rsync -avrtH rsync://mirrors.ustc.edu.cn/epel/6Server/x86_64/ /var/www/pub/epel/6Server/x86_64/

同步了几天,同步完成后看了一下虚拟机的硬盘文件还不到100GB,比预想的小很多,分配磁盘时专门划出了200GB呢。

安装apache  yum install -y httpd

关闭selinux  vim /etc/selinux/config selinux=disabled

最后有个软件createrepo可以指定目录生成索引,大家自行百度就知道了

大型网站架构设计学习笔记

最近买了本《大型网站系统与JAVA中间件实践》曾宪杰。
做了这么多年php,为了学习技术,还是只能找java的书籍,不得不说是php开发者的悲哀。
分布式系统基础知识
计算机的五要素CPU、内外存、输入输出设备,分布式系统要逐一对应
线程与进程的执行模式
阿姆达尔定律:多核
互不通信的多线程、共享容器协同的多线程、通过事件协同的多线程、多进程

OSI模型、TCP/IP模型
网络IO实现方式 BIO、NIO、AIO

————————

交易网站基本三部分业务功能:用户、商品、交易
APP server
|
*
APP server + DB server
|
*
APP server * N + DB server
|
*
负载均衡 + APP server *N + DB server +处理session(sitcky、同步、集中存储、cookie based
|
*
数据库读写分离,增加读库
|
*
增加搜索引擎
|
*
增加缓存(页面缓存、数据缓存)
|
*
引入分布式存储系统
|
*
专库专用、数据垂直拆分
|
*
单机数据水平拆分
|
*
应用拆分
按功能拆分
服务化
中间件

替换wordpress 常用公共js库

http://www.bootcdn.cn/

我的wordpress装了七牛云存储的插件,里面可以勾选使用360提供的useso.com的库,其中jquery用的staticfiles.com的cdn,我所处的网络很多网站莫名奇妙被屏蔽,手动更改了插件的内容

这里要赞一下wordpress 在后台可以直接修改代码,太方便了

wordpress gravatar头像不显示的解决方法

function mytheme_get_avatar($avatar) {
$avatar = str_replace(array(“http://www.gravatar.com”,”0.gravatar.com”,”1.gravatar.com”,”2.gravatar.com”),”gravatar.duoshuo.com”,$avatar);
return $avatar;
}
add_filter( “get_avatar”, “mytheme_get_avatar”, 10, 3 );

放到模板函数 functions.php

linux 下安装程序为什么需要重新编译?

linux 下安装程序为什么需要重新编译,直接使用可执行文件不行么?
这个疑问一直以来存在我的脑海中。于是今天搜索了一下。
http://www.jb51.net/article/47457.htm
这篇文章告诉我“编译主要是为了能让软件运行更快”的经验竟然不是真的。

软件需要编译安装的真实理由有如下3点:
1.软件在编译期间需要配置
2.软件需要统一安装路径
3.需要最新的版本

但我认为这些理由都不是理由啊。
1.配置模块我可以在使用过程中配置,扩展,调整
2.统一安装路径,在windows下的傻瓜安装向导里主要就是配置路径,但我没看到统一安装路径需要从头编译的道理,实际上安装完了软件我移动到另外的目录里,调整下配置文件,就希望它能继续运行
3.需要新的版本,大家一边宣称开源可以依靠社区的力量,一边却各自为政,全球linuxer重复编译的时间够造好几次人造卫星了。

于是我看到了这样的解释
http://bbs.csdn.net/topics/330116718

这是由于Linux系统的程序相互信赖造成的。比如某个程序依赖于其它一些库,而且版本也有要求,要想直接用,需要在编译时对信赖关系进行调整。./configure就是起这个作用的。

RPM包,DEB包是二进制了,也有依赖,一般情况下,二进制包只对应着特定的发行版。因为,在特定的发行版中,库之间的信赖关系是固定的。比如想把redhat5.2的rpm包安装到fedora上,就不一定成功。

初学者可以使用某个发行版,就不需要自己编译程序了。直接从官网上下载二进制的发行包就行了。有的发行版有在线安装软件的功能,比如redhat和fedora用的yum,unbuntu用的apt-get等

我深深感受到了开源界的恶意,因为商业应用的windows操作系统上开发的软件,虽然老版本的软件在新版本操作系统下不一定兼容,但是通过新出的编译工具打包编译后可以向下兼容,至少看起来是虽然windows有众多版本,但是在任一版本操作系统下的指定版本编译工具打包后的程序是可以在N个版本操作系统中兼容运行的。

当网上的开源卫士宣称全球大部分web服务器跑着linux,而我看到的是周围小公司仍然在使用略贵一些的windows虚拟主机、VPS托管网站时,我更是深有感触。

我们需要行动起来,建立起一个对社会有用的云服务网站,大V们通过网站可以节省重复在本机编译的时间,运维狗通过网站可以快速获取自己需要的可用二进制包,把工作交给云端,我们喝茶去。

一个小网站的开发上线过程是这样的:
开发 -> 更新网站
一个大型线上网站的开发上线过程是这样的:
开发 -> 提交版本库 -> 生成tag -> 线上自动化测试程序 -> 打包生成增量更新 -> 部署

不论大小网站,一个windows服务器上apache新增模块的过程是这样的:
下载指定版本php_mysql.dll -> 放到指定目录 -> 修改apache配置文件 -> 重启服务
不论大小网站,一个linux服务器上apache新增模块的过程是这样的:
下载指定版本php源码 -> phpize编译生成php_mysql.so -> 放到指定目录 -> 修改apache配置文件 -> 重启服务

那么对于不论用多久windows的人,换台机器,重复操作也是很轻松的一件事;
那么对于不论用多久linux的人,换台机器,重复操作也是很花时间的一件事。

半吊子的危险性——误以为PHP5.3以后取消了$GLOBALS超全局变量

今年之前一直在使用php 5.2做开发,很早前就知道5.2升级5.3是个坎,网上还有很多程序升级到5.3有困难。但作为一个半吊子,居然从来没好好看过升级说明,只知道global啥玩意的不支持了,并想当然的理解成了5.3之后再没有全局变量可用了。

http://php.net/manual/zh/migration53.php

今天下点功夫逐一点一下各个升级特性,放到文末供参考

PHP 5.3.x 的大多数改进对现有代码没有影响。需要注意的是有一些不兼容和新功能,在生产环境中切换 PHP 版本需要先行测试代码。

下面说一下我半吊子想当然以为不能用的功能。

register_globals取消了这个开关
不是说取消了部分global

这个开关开的时候$_POST\$_GET\$xxx、cookie、session数组里的值会注册到对应的变量去
另外取消了一些HTTP_VAR_POST这样的变量
全用简写$_POST这种表示
global $variable; 以及$GLOBALS是在任何版本的php中都可用的

以下是测试程序。

实际环境测试运行发现从5.2、5.3、5.4、5.5、5.6各个版本php表现看都是一致的,没有问题。

另外之前想当然的因素之一也是这个文章闹的。
http://www.hack1990.com/cat_2/1273.html

再回顾以下经典的php自动全局变量漏洞
才明白开启register_globals之后才会有这个问题,php5.4及以后这个开关消失,就再不会有这个问题了

——————————————————————

http://www.haidx.com/win-apache-php5-3-x-fastcgi-zend-guard-loader.html
http://www.php.net/manual/zh/appendices.php

【不向下兼容的变化】
给函数传递了不兼容的参数时将返回 NULL,之前是返回FALSE,但有一些例外,比如函数 get_class() 在出现错误时将会返回 FALSE。
realpath() 现在是完全与平台无关的. 结果是非法的相对路径比如 __FILE__ . “/../x” 将不会工作.
数组函数 natsort(), natcasesort(), usort(), uasort(), uksort(), array_flip(), 和 array_unique() 将不再接受对象作为参数, 在将这些函数应用于对象时, 请首先将对象转换为数组.
函数内 include 或者 require 一个文件时,文件内 将不能使用 func_get_arg(), func_get_args() 和 func_num_args() 函数。
最小的 Windows 支持版本是 Windows XP SP3; Windows 98, ME, 2000 和 NT4 将不再被支持.

【被弃用的 INI 指令】
define_syslog_variables
register_globals
register_long_arrays
safe_mode
magic_quotes_gpc
magic_quotes_runtime
magic_quotes_sybase

【被弃用的函数】
call_user_method() (使用 call_user_func() 替代)
call_user_method_array() (使用 call_user_func_array() 替代)
define_syslog_variables()
dl()
ereg() (使用 preg_match() 替代)
ereg_replace() (使用 preg_replace() 替代)
eregi() (使用 preg_match() 配合 ‘i’ 修正符替代)
eregi_replace() (使用 preg_replace() 配合 ‘i’ 修正符替代)
set_magic_quotes_runtime() 以及它的别名函数 magic_quotes_runtime()
session_register() (使用 $_SESSION 超全部变量替代)
session_unregister() (使用 $_SESSION 超全部变量替代)
session_is_registered() (使用 $_SESSION 超全部变量替代)
set_socket_blocking() (使用 stream_set_blocking() 替代)
split() (使用 preg_split() 替代)
spliti() (使用 preg_split() 配合 ‘i’ 修正符替代)
sql_regcase()
mysql_db_query() (使用 mysql_select_db() 和 mysql_query() 替代)
mysql_escape_string() (使用 mysql_real_escape_string() 替代)
废弃以字符串传递区域设置名称. 使用 LC_* 系列常量替代.
mktime() 的 is_dst 参数. 使用新的时区处理函数替代.

【新参数】
PHP 核心:
clearstatcache() – 新增 clear_realpath_cache 和 filename 参数.
copy() – 新增流环境参数 context.
fgetcsv() – 新增 escape 参数.
ini_get_all() – 新增 details 参数.
nl2br() – 新增 is_xhtml 参数.
parse_ini_file() – 新增 scanner_mode 参数.
round() – 新增 mode 参数.
stream_context_create() – 新增 params 参数.
strstr() 和 stristr() – 新增 before_needle 参数.

json:
json_encode() – 新增 options 参数.
json_decode() – 新增 depth 参数.

【新的全局常量】
__DIR__
__NAMESPACE__
E_DEPRECATED
E_USER_DEPRECATED
INI_SCANNER_NORMAL
INI_SCANNER_RAW
PHP_MAXPATHLEN
PHP_WINDOWS_NT_DOMAIN_CONTROLLER
PHP_WINDOWS_NT_SERVER
PHP_WINDOWS_NT_WORKSTATION
PHP_WINDOWS_VERSION_BUILD
PHP_WINDOWS_VERSION_MAJOR
PHP_WINDOWS_VERSION_MINOR
PHP_WINDOWS_VERSION_PLATFORM
PHP_WINDOWS_VERSION_PRODUCTTYPE
PHP_WINDOWS_VERSION_SP_MAJOR
PHP_WINDOWS_VERSION_SP_MINOR
PHP_WINDOWS_VERSION_SUITEMASK

【新类】
日期/时间:
DateInterval
DatePeriod

Phar:
Phar
PharData
PharException
PharFileInfo

【INI 文件处理改变】
移除了 zend_extension_debug and zend_extension_ts. 使用 zend_extension 指令来加载全部 Zend 扩展.
session.use_only_cookies 默认被设置为 “1”(打开).

【其他改变】
如果会话启动失败, session_start() 现在将返回 FALSE.
getimagesize() 现在支持 icon 文件 (.ico).

【禁用global】
$SERVER_xxx、$HTTP_xxx等变量替换成$_SERVER[‘SERVER_xxx’]

记一次openssl生成证书、私钥、公钥

6a2f856e36fc3562ccf765dced56b2b7
之前跟银联对接时,由于我是用PHP做开发的,比较较真,一开始没有用他们提供的工具去做,绕了点弯路。
第一步就是涉及加解密问题,需要用到私钥公钥,实际上用openssl可以很方便的随意生成,不过命令太多,如果你不是用正确的命令可能得到的文件也相去甚远。

openssl genrsa -out rsa_private_key.pem 1024
生成一个私钥文件,这个文件你自己要保存好,他是后面所有东西的基础,他如果没了整套数据都要换。
openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout
生成一个公钥文件,我们知道加密传输就是靠公钥做加密及验证

如果要对方环境可以验签测试,私钥需要多转换一步
openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt
这样这个新产生的私钥可以发给对方使用

怎么用

ServerA用第一步产生的私钥加密数据传给ServerB,ServerB用第二步产生的公钥做验签
同理,ServerB加密后发数据给ServerA时,SeverA可以用B提供的公钥做验签。

博客服务器软件升级

花了点时间将nginx、php、mysql统统升了一遍级。
nginx升级到1.6.2
php升级到5.5.20
mysql升级到5.6.22失败,原因是编译中内存不足,遂改升级到5.5.37.

升级前今天白天请求首页要花7s以上,现在请求首页只要2s多,性能大幅度提升。

记录用支付宝做团购支付的蛋疼经历

145915_82_1310458426_83是有多蛋疼呢?
由于是第一次做,只是大概知道用即时到账支付,用户把钱付到网站运营商就行了。
刚开始做的时候参考了N个团购系统,看起来挺美,没琢磨这块,等到开始测试支付功能的时候,客户说支付不了。
跳转到支付宝总是提示来路不正确,遂要来客户的支付宝账户进入商家服务,一看有三种支付产品,即时到账、双接口、担保交易支付。
客户申请的是双接口,网站程序走的是即时到账接口。于是开始跟客户口水仗说不是即时到账处理不了,然后客户申请即时到账产品没批下来,支付宝不允许团购类网站申请即时到账接口…。
于是把双接口只做了即时到账的接口处理,担保交易的用户要是付了钱也是到支付宝,网站不发货,钱过段时间也能回到用户手里,网站挂个提示得了。
12月底,支付宝停止双接口的申请,再后来支付宝的技术支持论坛访问不了了,然后现在在搞什么商家服务中心改版。
好吧,总之把商品的即时到账付款走通了以后,客户说得考虑批量给用户退款,我说接口没有提供,他们不信,然后我找到支付宝在线技术支持机器人,回复如下:

若买家付款选择的是担保交易,只能登录支付宝帐号,在交易管理里面去操作,退款正常流程是:买家申请退款-等待卖家确认-卖家同意,等待买家退货-等待卖家收货-退款成功。(若已确认收货不允许退款)
若家付款选择的是即时到帐,付款完成之后不允许退款。

网上程序做的都是即时到账接口的退款程序,我摔…..

所以团购类网站只能申请双接口和担保交易支付两种接口来和网站集成,而如果用户用双接口即时到账付款后想要退款,得联系商家再由商家手工确认一遍后手工退款,而担保交易支付更坑,商家得进支付宝账户查账单后点退款….

至此做这个团购支付暂时到了一个门槛了,下一步怎么走,大家用支付宝很习惯,如果换其他的支付方式用户量很小,支付没法进行下去了。

被支付宝绑上了战车又被踢下去是种什么样的感受…

15年,新的起点

一路走来磕磕绊绊,技术一度停滞不前。今天起从头做起。
推荐PHPer在windows下采用phpstudy作为开发环境,最靠谱的功能,一键切换PHP版本,方便研究不同版本php间的差异。
比如今天看namespace是php5.3开始有的,那么在5.2的环境下

我的14年总结

思维乱跑,昨天的稿子丢了后就没回来。重新整理一下吧。

14年给我映像很深的事由那么几件,WordPress升级很频繁就是一件,因为我很懒,这一年的博客数量少的可怜,更别提优质内容了,但每次登陆后台都有几个升级要点击。3.8到4.1四个大分支七个版本。这期间,我的一个WP插件提示我5.2的php他不支持了,为此我把php从5.2一口气升级到php5.5。
年会总是酒不醉人人自醉的,今年年初1月17日的年会是在江南赋举办的。我带着一票20个或实习或转正的学生们从帝都的东七环到帝都的西四环,横跨11环了。
事业刚刚起步,我被抽壮丁了,内部重点项目猛于虎,领导们不爱担责任、不爱出方案,只负责给我们鼓劲,让我们把竞争对手打跑。这一场仗我们打了半年,最后还是打赢了,为何?我们给客户先装上了一套测试程序,配置好了一切,只等他们试用反馈,试用反馈,直到尘埃落定。

————
刚才被搜狗输入法给打断了,他告诉我我已经打了126852字,相当于一本《我的地坛》。我的打字速度不快,38字每分。用到打字的地方不多,我没有登录输入法账户的习惯,这个电脑也是今年5月份后换到手的,除去每月一篇2000字总结外,估计8成打字都是在跟客户撕逼,2成是在写代码注释。这样就符合28定律了,你八成的时间八成是浪费在没啥意义的事上了。

——————
都说今年很忙碌,忙到什么程度呢?1周没回家?no,远远不够。1个月都住酒店,4点半下班去吃海底捞,然后吃到5、6点看日出。又或者code到趴在办公室桌上睡一夜。到底是什么支撑我度过来的呢?

————————
一度人员很足却没事做,一度人员紧缺却招不到人,我感觉我错过了什么,回想起来,当我出现这两个情况的时候,我仍旧坐以待毙,只闷着头赶着项目。明年我要在工作时间把管理的书多看几本。

——————————
今年看着大圣、XX都开始搞前端了,而我则被评为最不可能在前端有所进步的人,只能在无尽的业务中苦苦挣扎了。
是的,今年做的业务太多了,政府、事业单位、学校、部队、房地产公司、广告公司、商务公司、交通、金融每一个领域都有我的身影,我一边给公文套上红头,一边看着时间表绘制燃尽图,一边整理教师的资料,一边看着指纹身份认证,一边捣鼓cas SSO,一边拿pos机刷卡玩,一边遥控摄像头,一边通过支付宝担保交易测试团购。这样的我撕裂了又揉碎了又粘起来了。最后我成了泥。

————————————
你知道我不是个高手,你没想到的是我连个新手都不是。
PHP+mysql可以快速实现很多应用场景,但我们学的用的终归浅显。

今年又接触了几个新东西,nodejs和redis。
前者,我们搞了个大棒的雏形,然后就没有然后了。
后者,我们压了一下,发现windows下果然很慢,存储是顺序的,插入了想再排个序有点难。

LaravelPHP,参与了一把汉化工作,不过人家没屌我。

SeaJS,看明白怎么用require做加载器了,其他的还不会。

这一年技术上的知识积累太少,大概一年都在干活而没想为什么要干,干的是什么,怎么干能更好。

——————————————————
先规划下未来。
我一直有个造轮子的念头,明年我给自己定下一个造轮子计划,查漏补缺,旁征博引,拿来主义,造一套PHP的MVC框架,我对他的期待有三点,1每一次代码改进都通过git版本控制。2每一个可发布版本都具备可简单好用的特性。3在第三个大版本发布后我基本掌握Yaf相当的开发能力。
时间上没有苛求,15年力争完成第一个版本(易用、好改的ORM;简单、好记的mvc路由;完全没难度的模板系统),16年第二个版本(高效的ORM),17年(想不到那么远)

redis初探

redis可以作为代替memcached的缓存方案。
redis的计数器可以做量子增减
redis可以快速存储排行榜等业务数据。

和Memcached类似,但是解决了断电后数据完全丢失的情况
Redis 不适合作为海量数据存储方案. Redis 适合在数据规模较小, 性能要求较高的条件下应用。
参考资料:
http://os.51cto.com/art/201210/361909.htm

git关于文件权限修改引起的冲突及忽略文件权限的办法

http://www.01happy.com/git-ignore-filemode/

项目上用git管理代码,由于开发机器web环境是www用户、文件管理和phpstorm开发工具是用user用户,不同用户间权限问题总是影响效率,干脆全改成777,结果git提交时变成所有文件全部要提交,经查找到如上文章。
在项目目录下
git config core.filemode false

cat .git/config

PDO防注入原理分析以及使用PDO的注意事项

http://zhangxugg-163-com.iteye.com/blog/1835721


setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$st = $pdo->prepare("select * from info where id =? and name = ?");
$id = 21;
$name = 'zhangsan';

$st->bindParam(1,$id);
$st->bindParam(2,$name);
$st->execute();
$st->fetchAll();
?>

三、使用PDO的注意事项
知道以上几点之后,我们就可以总结使用PDO杜绝SQL注入的几个注意事项:
1. php升级到5.3.6+,生产环境强烈建议升级到php 5.3.9+ php 5.4+,php 5.3.8存在致命的hash碰撞漏洞。

2. 若使用php 5.3.6+, 请在在PDO的DSN中指定charset属性

3. 如果使用了PHP 5.3.6及以前版本,设置PDO::ATTR_EMULATE_PREPARES参数为false(即由MySQL进行变量处理),php 5.3.6以上版本已经处理了这个问题,无论是使用本地模拟prepare还是调用mysql server的prepare均可。在DSN中指定charset是无效的,同时set names 的执行是必不可少的。

4. 如果使用了PHP 5.3.6及以前版本, 因Yii框架默认并未设置ATTR_EMULATE_PREPARES的值,请在数据库配置文件中指定emulatePrepare的值为false。

那么,有个问题,如果在DSN中指定了charset, 是否还需要执行set names 呢?
是的,不能省。set names 其实有两个作用:
A. 告诉mysql server, 客户端(PHP程序)提交给它的编码是什么
B. 告诉mysql server, 客户端需要的结果的编码是什么
也就是说,如果数据表使用gbk字符集,而PHP程序使用UTF-8编码,我们在执行查询前运行set names utf8, 告诉mysql server正确编码即可,无须在程序中编码转换。这样我们以utf-8编码提交查询到mysql server, 得到的结果也会是utf-8编码。省却了程序中的转换编码问题,不要有疑问,这样做不会产生乱码。

那么在DSN中指定charset的作用是什么? 只是告诉PDO, 本地驱动转义时使用指定的字符集(并不是设定mysql server通信字符集),设置mysql server通信字符集,还得使用set names 指令。

如果图片丢失,可以发邮件至zhangxugg@163.com, 索取PDF版本。

我真想不通,一些新的项目,为何不使用PDO而使用传统的mysql_XXX函数库呢?如果正确使用PDO,可以从根本上杜绝SQL注入,我强烈建议各个公司的技术负责人、一线技术研发人员,要对这个问题引起重视,尽可能使用PDO加快项目进度和安全质量。

不要再尝试自己编写SQL注入过滤函数库了(又繁琐而且很容易产生未知的漏洞)。

为什么要抛弃IE7

IE6基本上已经扔进垃圾箱了。
今天看看IE7这个怪物。
在大量的公司内部网络里XP系统几乎是还要再服役5~10年的节奏,所以IE升级到头也只能到IE8,不得不感慨只兼容到IE8想必也是极好的。

到底IE7和IE8差在哪?我得慢慢思考总结下。

1.IE7这个怪物对开发者非常不友好,js报错的行数总是不准,而且还没有开发者工具。

2.js对象里的最后一个逗号
var js_object = {a:1,b:2,c:3,};

过去知道如果对象里最后意外加了一个逗号低版本浏览器是不兼容的,专为此事查了一下,只有IE7及以下的版本IE会报错,IE8及以上、Firefox、Chrome都是OK的。所以如果升级到IE8,所有代码中写js遇到这个逗号再也不用考虑了。

3.IE6、IE7的getElementsByName()和getElementById() bug
一些码畜在IE中调试通过的代码就不再测试其他浏览器兼容性
会有很多表单中直接用getElementById来取值
稍微懂行一些的会改成
实际上在IE7都OK,到了IE8下就跪了
参考网址:http://www.cnblogs.com/peach/archive/2009/01/24/1380606.html

4.

记国际化语言包系统设计及GlotPress安装使用心得

话说没有google就没有这篇文章,连续两天两夜的奋战终于搞妥了i18n语言包翻译的工作环境glotpress。
1.背景
原有的系统由于国际化需要,采用gettext技术对系统中涉及语言的地方都做了处理,方便了使用poEdit直接从源码中提取源文字模板pot的工作。但涉及到其他国语言的翻译仍需要各个语言的翻译根据我们导出的execel逐条翻译。面对一个成型的系统近2W条词条的翻译工作,量还是很大的,而且产品升级后新增词条的翻译如何整合并快速生成语言包文件是一个大问题。
2.技术分析
gettext技术通过设置语言的mapping实现替换的原理并不难以理解,poedit利用正则从代码提取字符也是很简单的逻辑。
GoOgle到gettext工具包中含有msgfmt,msgunfmt分别可以把po文件压成mo文件,把mo文件再解压成po文件。po文件用文本编辑器打开后也很好理解规则,一条原文对应一条翻译,多行的条目首行两个“,后续每行用“”引起来,每条翻译间空一行。
上面两个工具的windows版本官方的release库中也有下载,注意要把tool和runtime的都下载了,而且还得去下iconv的可执行文件,合在一起就木有报错了。
3.系统架构
为了实现更友好的处理,我希望能把现有的语言包全存到数据库中,按需提取且能快速增加,要是能实现自动翻译就更好了。
那么从已知的gettext技术结合php、mysql来处理,思路为利用gettext把已有的mo文件还原成po文件,再用php读取po文件处理后逐条存入数据库,翻译时调用在线的api传入要翻译的原文和原文语言和目标语言,将返回的文字存入相应语言的相应条目内。
按这个思路搞了一晚基本实现了已有的数据存入数据库以及读取。
4.阶段总结
照此开发下去一套系统预计需要几十天建成,劳产率太低,决定暂停。
这时不甘心的我想起来N年前搞bbpress时在一个大神的博客链接的系统内做过在线的插件编辑,那时自己懵懵懂懂,就记得wordpress的官方插件至少都实现了几十个国家的机器语言翻译版本的语言包。(怎么知道是机器翻译的,这个一看就知…)N年前就有的技术,现在应该由成型系统了,于是各种Google,结合记忆确定了这个大神叫做Gautam Gupta,看他github照片居然是阿三哥。他的博客多年后彻底改造了,我找不到原来的系统入口,于是只得上bbpress官方网站找线索,终于在wordpress官网上找到一款将glotpress的开源软件,十来年居然还没有stable的意思…
————————
第一场战役无疾而终….
5.glotpress
既然找到了这个家伙的存在,我满心想着功能强大、易用等名词,但google了一把心凉了半截,这个软件是个小众软件,使用群体并不大,想找篇正儿八经的安装使用文章都没有,继续在国外网站找效果居然一样不明显。不过好在是开源软件,代码量也不大,结构和wordpress也很像,看了看,捣鼓了半天也就搭起来了。

1.使用admin,密码a登录
2.创建项目
3.建立翻译版本
4.导入翻译文件。这个时候如果mo文件速度显然会比po慢,而两种文件导入都很慢,有的时候导入到一半就会报错,这个时候再导入几次应该就能导入完成(导入过的就不再导入了),这里我一上来还犯了一个错,在繁体的语言包里导入了日语的语言包,再导入时好像覆盖不了,就全乱了套,还好数据库就那么几张表很容易看明白,清空重来就是了。
5.这时基本的在线翻译环境建立完毕,如果放到外网给翻译人员开放账号的话就可以轻松实现协同了。
6.怎么实现google的翻译呢?傻眼了,google啊,号称不作恶的google居然把翻译api给在2011年变成收费产品了。
7.替代方案呢?Bing翻译API支持每天2W字符的免费转换。花了一下午把这套方案实现了,悲剧的是这个接口的速度有够慢,而且只能从后台去调用验证接口,根据返回的数据生成api-key再通过soap、http、ajax等三种不同方式实现翻译,依次看msdn最后找到一条较稳定的小道,就是采用ajax方式的v1版本地址,实测速度在glotpress的页面上hack增加自动点击,测试自动翻译数十分钟算了下平均值10s翻译1条。对于本产品5个语言包2W*5=10W的量,需要计算机开着一直做12天。而且结果还全部都是机器语言版本,这个效率实在不敢恭维。
QQ图片20140826223932
8.继续寻求替代方案。

转一个其他人博客对各大api的评价
微软API:利用WCF方式进行翻译,每次翻译英文字数最大为一万两千多个,中文字符的话最多为六七千个,最大200M字符/月的限制,超过限制后要付费。对HTML翻译支持完美,翻译结果也不错,但考虑到免费字符数限制,需做账号轮巡,账号注册的步骤那叫一个繁琐啊……(此方式可做为首选翻译方式,轮巡的翻译功能已实现,有时间了把源码贴上来。 ——qfzhang于2013-05-30更新)
YoudaoAPI:语言支持不够多,只有英文、日文、中文几个之间的互相翻译,且每次请求最多翻译的字符数不能超过200,还有访问频率限制。
GoogleAPI:Google翻译的API,优势明显,翻译结果十分准确,尤其是针对HTML,能够准确跳过HTML标签部分,只翻译文本,但它是付费使用的(v1版为免费版,但接口已关闭),其价格为100万字符/20美金,其价格自然不言而喻。且在使用过程中发现,其标称每次最大翻译字符数不能超过2k,但实际使用时超过1.5k就会报异常。
BaiduAPI:有访问频率限制和长度限制,且翻译结果不理想。

从百度APi的帮助文件看应该还是不错的
http://openapi.baidu.com/wiki/index.php?title=%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3%E9%A6%96%E9%A1%B5/%E7%99%BE%E5%BA%A6%E7%BF%BB%E8%AF%91/%E7%BF%BB%E8%AF%91API
考虑这两天再试试这个接口,毕竟百度的服务还是很稳定很快速的。
=====

百度API很快,参数很少
缺点却是翻译结果不理想,有些字符串直接翻不动,可能跟访问频率有关

PHP+mysql数据库设计开发之时间

日期时间(本文简称时间)是开发中用于存储数据与时间相关的标示,在一般小数据量的业务系统中有一定的唯一性,比如记录用户登录时间,同一个用户正常使用时极难出现同一秒出现两条登录记录的情况。

2013-12-04 11:30:58

这是一个大家常见的时间格式,很容易理解,空格前后分别是该时间的年月日和时分秒,年月日分别用-短横线连接,时分秒分别用:冒号连接。

1386518400

这是一个大家不常见的UNIX时间戳格式,它表示了从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。

基于小学数学的知识我们知道,1分钟=60秒,1小时=60分钟=3600秒,1天=24小时=24*3600秒,1周= 7天=7*24*3600秒

可见我们如果以数字形式的UNIX时间戳格式存储时间,我们可以轻易的拿来计算。

它唯一的不方便就是人没法一看就和时间的时间对应上

 

用七牛CDN给博客加速

CDN可以分担网站的流量,同时国内的CDN也可以有效加速像我这个国外VPS网站。

在网上查询一番后我选定了免费的七牛,貌似上半年参加一个沙龙的时候他们的人也去讲了。

七牛镜像存储免费用户额度:

存储空间 10GB,每月下载流量 10GB,每月 PUT/DELETE 10万次请求,每月 GET 100万次请求。

 

七牛镜像存储 WordPress 插件,十分方便,在后台简单设置即可。

 

http://blog.wpjam.com/2013/08/31/wpjam-qiniutek-0-4/

 

没什么可讲的,加速了,提速了,就是这样。

 

用chrome监控网络,禁用了cache。

先把CDN加速插件打开,跑了一个加速后的

after

再把插件关了,跑了一个未加速的

before

对比很明显,速度提升很显著。

DOM加载速度是原来0.37倍,页面完整加载速度是原来近的1/3,访问能感觉明显的速度提升。

通达OA精灵演示版 For windows Phone 8 发布

利用长假把基本功能做出来了,初衷是想自己办公时用一下,所以做的比较粗糙,比较调皮,在经过2次未通过的审核后终于在今天顺利上线了,再次感叹微软做审核太认真了,感觉像是多给了我一组测试人员 O(∩_∩)O哈!

http://www.windowsphone.com/zh-cn/store/app/%E9%80%9A%E8%BE%BEoa%E7%B2%BE%E7%81%B5/b2981f69-dc4e-451f-ba8f-fedb8c2b3dbd

绝对的无师自通,Windows Phone 8 Panorama控件 title 字体大小 样式的设置

网上搜到的都是wp 7  Panorama控件 title 字体大小 样式的设置

http://www.cnblogs.com/beyoung/archive/2012/02/15/2353049.html

<controls:Panorama >
<controls:Panorama.Title>
<TextBlock Text=”我的应用程序” FontSize=”50″ Margin=”0,80,0,0″ Height=”60″></TextBlock>
</controls:Panorama.Title>

其实就是涉及到wp7、wp8的xaml的名字变了,我以前没接触过wp7开发,会比较蒙。

不过我爱大胆假设,小心求证

默认是长这个样

<phone:Panorama title=”xxxx”>

我就防着例子试写一下,成功了

<phone:Panorama >
<phone:Panorama.Title>
<TextBlock Text=”通达Office Anywhere 2013演示版” FontSize=”80″ Margin=”0,50,0,0″/>
</phone:Panorama.Title>

于是PanoramaItem 每个分页的标题 Header 我也会改了,掉渣天

<phone:PanoramaItem Orientation=”Horizontal”>
<phone:PanoramaItem.Header>
<TextBlock Text=”个人事务” FontSize=”50″ Margin=”0,50,0,0″/>
</phone:PanoramaItem.Header>

50人公司低成本千兆有线局域网组网

 

场景:B公司是在A公司同城的郊区研发基地,所有员工要通过互联网连接A公司的vpn接入内网办公。

B公司的规模 从10人增加到20人,预计年内扩充到50人。

对于10人的公司,一个无线路由器,一根10M宽带即可解决大家同时上网的问题。

初期的网络环境是

TP-LINK TL-WVR450G 450M无线企业VPN路由器 ¥539.00

当地的二级网络运营商提供的宽带业务 6M 500元/年

无线网络非常便捷,室内无需布线。

当人数增加到20人时就出现问题了。

我们知道一个无线路由器一般能承载20人同时访问已经是平民价格中很好的了。

这个时候20人都在上网就会造成网络极度不稳定,且每人平均分配的带宽也变少了。

运营商也许还有检测访问网络机器数量的策略,导致间歇性断网。

为了保证稳定再次接入一根宽带,并按人分成两部分使用不同网络。

由于两个宽带获取地址在同一个网段是不允许的,此次额外采购了

艾泰(UTT)进取 520W ¥649.00

但在实际运行中有些员工间传文件就得在两个网之间切换,造成了无线网的不稳定,且发现该楼宇无线信号太多太杂影响了无线的稳定性。

为了保证正常办公,必须接入有线局域网。

腾达(TENDA)24口全千兆以太网交换机 TEG1024G(S) ¥499.00

六类线、六类水晶头不解释

为了两个网络带宽都利用上,组网如下

TP-LINK  wan1 – 宽带1

UTT wan1 – 宽带2

TP-LINK  lan – UTT wan2

UTT lan  – TENDA lan1

TENDA lans – 各个机器

 

<50人网络时按需采购一台1000M交换机即可

>50人就得考虑上机柜统一管理了,已经不属于本文讨论范围

win7下windows phone 开发方法

由于最新的windows phone 8 只能在win8下开发,所以是个困扰。

其实都是兼容的,退一步用VS2010开发就好了。

微软为windows phone 专门把开发工具免费了。

Visual Studio 2010 Express for Windows Phone

http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express

免费用30天,之后可以免费注册获得序列号

微软专门开设的WP开发者站点也有很多信息

http://developer.windowsphone.com/zh-cn/

 

以上是个人猜测,尚未实际进行,由于手头上的设备和系统都还暂时不满足,只能暂缓研究。

桂圆和龙眼的故事

古时候,莆田县兴化湾里头住着一条雄的蛟龙,它每年冬天都要上天一趟和雌龙相会。这条蛟龙每次上天都要兴风作浪,滔滔的海水淹没了千万亩良田,淹死了上万个无辜的老百姓。
   老百姓恨透了这条蛟龙,请求官老爷想办法治理,官老爷不肯来,请道士画符念咒语,符咒也失灵。为蛟龙造庙,蛟龙照样行凶。
   有一年,蛟龙又作孽了,数十个村庄的土地和人畜全被淹没了,只有一个九岁的名叫桂圆的小孩,正好到他舅舅家做客,方才侥幸活了下来。桂圆的父母和数十个村庄里的人一样,全被蛟龙害死了···桂圆发誓要为杀死这条蛟龙,为乡亲和父母报仇。
   桂圆住在舅父家,帮舅父放牛,拾柴火。他没有忘记报仇的事情,一有空就,就舞弄自己削好的竹剑,苦练杀龙的本领。
   一天,桂圆又和往日一样,骑着牛上山了,半山上,牛忽然不走了,只“哞哞”的叫着。桂圆跳下看,发现一条幼蛇被牛踩了,尾巴断了,桂圆就挪开牛脚,给蛇包扎,放到草丛里。
   又有一天,桂圆在山上拾柴火,在一丛青草里头,看到一只小鹰,拾是从山崖上掉下来的,倒在草丛里头不能动。桂圆就把他抱起来仔细瞧,发现小鹰的脚骨断了,就给它治疗,再把他送到鹰巢里。
   再有一天,桂圆到河边跳水,他操起裤管一脚踩到水里,忽然听到吱吱的声音,原来有一只只有指头大小的老鼠,,过河被水草缠住,快死了,桂圆就把它放到岸上,放它一条生路。
   时间像流水一样,不觉又过了九年,桂圆已经长成一个强壮的青年了。几年的勤学苦练使他一身都是力气。单手能提三百斤,舞起剑来,寒光闪闪,不见人影。
   这一天,蛟龙上天的日子,桂圆在海边等着蛟龙上来。忽然从背后窜出来一条二丈来长的蛇,它“嗖”的钻入海里,和蛟龙在海里斗了起来。不这条老蛇就是当年桂圆救的蛇。不久,蛇敌不过蛟龙,被咬死了。蛟龙飞到了天空,突然一只老鹰飞了过来,在空中和蛟龙斗了起来。它们身上的血下雨一样的掉了下来。最后老鹰也被咬死了,这只老鹰就是桂圆小时候救下的那只小鹰。
   蛟龙经过这么折腾,也受了重伤,掉在了地上。桂圆就和它打了起来。蛟龙跟老蛇和老鹰斗过,力气已用过半,但是龙尾没有受伤,扫来刮去,桂圆被弹上天,又打落地。眼看龙尾再扫过来桂圆就没有命了,一只老鼠窜了过来,咬住龙尾,痛的蛟龙拼命挣扎,老鼠给甩死了,龙尾也折断了···
   桂圆就这样,把蛟龙杀死了。他挖下两只龙眼,回家拜祭乡亲和父母。几十个村庄的人都敲锣打鼓迎接桂圆。这时候,官老爷来了,要抢桂圆手上的龙眼。桂圆哪里肯给他,就吃了一粒,另一粒抢夺中落到土里了,桂圆用脚狠狠的踩进了土里。
   忽然,平地一声响雷,满头乌云密布。桂圆变成了一条金龙,飞上天空,腾云而去。官老爷吓坏了,连滚代爬的逃走了。
   第二年春天,在那只龙眼掉下的地方,长出一颗奇怪的树。不久,开出了像桂花一样的花朵。夏天,结出了一串串圆圆的果子。剥开一看,水晶似的果肉里头有一粒白蒂紫黑色的核,和龙眼一样。大家就叫这种果树“龙眼”树。为了纪念为民除害的桂圆,就将晒干的龙眼果实叫做“桂圆”。

安卓开发入门(1)——环境搭建

我先把下载链接放上来

1)JDK 7下载http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

我选的是x64 windows版

2)eclipse下载http://www.eclipse.org/downloads/

我选的是Eclipse for Mobile Developers x64  windows版,据说Eclipse IDE for Java EE Developers也是绝对没有问题的

3)Android SDK下载器下载

http://dl.google.com/android/android-sdk_r21-windows.zip

版本过老是不行的,我这个是r21的

4)可选,汉化包http://build.eclipse.org/technology/babel/babel_language_packs/

我是把所有中文的全用迅雷拖下来解压到eclipse目录下重启就全是中文了

 

总之把下载链接找全了,再折腾一下就问题不大了

 

有人总结了androidSDK开发包下载地址,挺完整的:

http://www.cnblogs.com/bjzhanghao/archive/2012/11/14/android-platform-sdk-download-mirror.html

 

我之前是在不明真相的情况下把文件全解压出来,挨个目录放了一遍试,后来才知道只要把压缩包下载下来放到temp目录下就行了。

http://my.oschina.net/unclegeek/blog/94364

汉字词频研究——浅尝辄止

汉字词频研究就是看看什么词使用频率较高,如果不限定范围就没有什么意义了。

先限定单字的词频我们看看

http://yong321.freeshell.org/misc/ChineseCharFrequency.html

很早就有人做了这方面的工作了

还找到了他在论坛的讨论帖子

http://www.pkucn.com/thread-242763-1-1.html

汉语常用字做一个词频排序

有什么用呢?

输入法

比如拼音“ang”对应这些字

一声的“肮(31,700,000 )骯(31,700,000)”
二声的“岇(225,000)昂(33,000,000)昻(706,000)卬(1,090,000 )”
四声的“枊(471,000)盎(5,260,000 )醠(239,000)”
括号中是我刚用谷歌搜索出来的数量
“骯”是“肮”的繁体字,所以谷歌认为是一个字,返回的数量是一样的
在输入法输入ang时就可以按照搜索引擎的这个数量作为权重来排序
“昂肮骯盎卬昻枊醠岇”
这个顺序就把互联网上用户最常输入的字列在了较容易选择到的地方,提高了输入效率
以此展开
这几年流行的云输入法其实也是靠词频来处理的
你在输入一个很长的词的时候云输入法法如果联想错了,不要奇怪,只是因为在你之前云输入法的数据库中有很多人输入时选择了错的项,权重超过了正确的造成的
其他可以玩的项目:大家任意扩展
全宋词词频分析http://www.cnblogs.com/yuyan/archive/2011/12/03/2274875.html 理科生也能作词了
全唐诗词频分析
文言文字频分析
常用字字频分析
分析好做
难做的是字和词的来源,如果没有人输入过“一”,就没人知道有这个字
基于此还应该有人做字库索引、词库索引
有了这些数据,小学生组词的作业再也难不倒家长了

WordPress 3.5取消了友情链接的功能


WordPress官方友情链接插件:Link Manager

 

wordpress

 

WordPress官方从WordPress 3.5版本之后,把友情链接功能从核心从核心功能中删除了,这给升级的用户造成了困扰,在WordPress 3.5正式版发布之后,官方也第一时间推荐了一款友情链接插件:Link Manager。

插件使用非常简单,直接安装即可,使用这款插件之后,WordPress的友情链接功能又和之前一样了。

WordPress插件安装全解析:http://www.wopus.org/wordpress-basic/install-detail/2087.html

Link Manager插件官方地址:http://wordpress.org/extend/plugins/link-manager/

Link Manager插件下载:http://downloads.wordpress.org/plugin/link-manager.zip

IE下面向ActiveX对象的Javascript编程内存泄露问题

IE ActiveX对象开发时的注意事项:

今天翻犀牛书第五版,在154页专门提到了IE下内存泄露的问题。提供的参考网址已经无法访问了,地址如下:

http://msdn.microsoft.com/zh-cn/library/bb250448(v=VS.85).aspx

 

循环引用Dom对象时就会造成此问题,参考例子:

<html>

<head>

<script language=”JScript”>

 

var myGlobalObject;

 

function SetupLeak()

{

// 首先把页面元素赋值给变量

myGlobalObject =

document.getElementById(“LeakedDiv”);

 

// 接着把变量赋值给页面元素的属性,这样形成一个循环引用

document.getElementById(“LeakedDiv”).expandoProperty =

myGlobalObject;

}

 

 

function BreakLeak()

{

document.getElementById(“LeakedDiv”).expandoProperty =

null;

}

</script>

</head>

 

<body onload=”SetupLeak()” onunload=”BreakLeak()”>

<div id=”LeakedDiv”></div>

</body>

</html>

 

近年来越来越多人采用JS的面相对象开发,这种情况下不太严谨的码农极易犯此错误。所以如果你开发的应用中涉及到ActiveX的话一定要小心的处理。

用PHP做舒尔特方格

周末在家下了一个手机应用叫舒尔特方格,声称可以锻炼注意力,百科的简介:
舒尔特方格 (Schulte Grid) 是在一张方形卡片上画上 1cm × 1cm 的 25 个方格,格子内任意填写上阿拉伯数字 1 ~ 25 等共 25 个数字。

手机的app做的很糙,连一个方格都做不好,居然是适应屏幕的,操作起来太累,干脆自己搞一个。
用其他语言来开发可能得自己写伪随机算法,PHP就简单了,一行搞定。前后包括查阅相关资料用时1小时。

QQ截图20130304093008

参考资料:生成不重复的随机数的三种方法 http://www.cnblogs.com/xuefeng1982/archive/2010/07/22/1783238.html
PHP手册:
1、range — 建立一个包含指定范围单元的数组
2、shuffle — 将数组打乱

斤斤计较的程序员:关闭按钮你用x还是×

&#215;
or &times;
× 

喏,上面这个叉叉可不是x,而是在网页中html扩展字符,在各个浏览器下都支持,不用费心费力找图片,不用费心费力搞兼容,一个字符,你想要他多大就多大,设置font-size就行,你想让他什么颜色就什么颜色,设置color就行,赶快用上他吧,你不会吃亏,不会上当,就他了。

 

http://amath.colorado.edu/computing/NewtonLab/htmlchars.html

IcoMoon字体库支持IE6了

他娘的前段时间一直问谷哥有啥办法显示icomoon没,他说不知道,今天用ie8访问icomoon发现全部字体都显示出来了。

down了一份字体下来发现css写法和之前不同了,还增加了支持IE6、7的js。这下NB了。老外真犀利。

字体样式的好处就是想大就大,想小就小。

 

看看demo

http://icomoon.io/#demo

基于github做博客的思路

github.com提供静态页面功能,且访问速度很理想

github.com针对代码仓库提供问题反馈系统

方法一:在github上自己的站点首页放上一个跳转连接,到问题反馈系统,你的博文以问题反馈的形式发布,评论者直接跟帖回复。

此方法是我偶然看到一哥们这么干的。

 

方法二:(我的原创,挺折腾,但是绝对省流量,且样式随心所欲)

自己的vps的blog生成静态文件,将静态文件发布到github上。

(一般cms都爱这么干,每次更新只涉及静态文件和首页)

每次写文章的操作是在vps上进行的。

发布时是同步到github上的。

评论可以做在vps或者集成第三方评论系统,刚查了一下,国内有多说、友言。

然后没有了。

流量构成:vps:后台操作管理+github同步时产生的流量

github:文章的访问流量等等

第三方评论系统:评论+评论管理流量

 

迁移?

生成的静态页面放到github 上以后dns cname过去即可。

 

更多参考

http://www.ruanyifeng.com/blog/2012/08/blogging_with_jekyll.html

法海你不会关机。(论Linux十大关机方法)

未命名

要我是老板我就找你到我们创业部门当测试工程师。
法海你不会关机。You don’t know how to shut down Linux Far High.

  1. shutdown -h now:我最爱用的命令之一,shutdown -r now重启
  2. init 0:init 1重启,init 3进入命令行界面,init 5进入图形界面
  3. halt:这货就是关机专用命令啊
  4. reboot:这货是重启专用命令啊
  5. poweroff:这货才是真正的关机唯一指定命令啊,halt那家伙不管电源死活
  6. Ctrl+Alt+Delete:这货可以让系统重启,实际上你要是APM比较高,可以在重启后的一瞬间按下电源键完成关机操作。
  7. 前面全是命令,可是难道咱就不会在图形界面下关机了吗?非也,KDE 3下关机得找开始菜单-〉电源,GNOME 2下找系统-〉关机,GNOME 3/KDE 4都得点用户、然后关机。把各种图形化界面的关机方法写全了十条都打不住。
  8. 按电源键关机。这个用法大家都会用,稍微看了点书,法海说这个关机方法是不正确的。但是法海不知道按住电源键不动几秒种可以强制关闭,适用于各种电脑假死的时候。
  9. 拔电源线。如果你发现你的电脑被入侵了,这时最迅速的保护你的系统的方法就是这个了。
  10. 这条是凑数的,法海看完泪流满面,linux的关机方法太多了,可是鄙人的功力不够,没法用十条把法海压倒雷锋塔下,望读者协助完善。

缅怀github君

能说github是个不存在的网站吗?

干IT的都该知道Git,更该知道最大的Git代码托管网站Github

在trunk young最热火之际它突然就访问不了了,shit