[cocoa] 瓦片地图下载器
[Laravel4] 短网址之统计每日点击数
使用redis计数,laravel4里面默认使用的是predis,这里我使用的是phpredis库,首先注释掉app/config/app.php里面的Redis的alias
// 'Redis' => 'Illuminate\Support\Facades\Redis',
实现代码
使用redis的sorted set储存每日的每个链接的点击次数
$config = Config::get('database.redis.default');
with($redis = new Redis)->connect($config['host'], $config['port']);
$redis->zIncrBy(date('Ym:d'), 1, $link->id);
统计数据,取出当天点击数最多的10个链接的id
$redis->zRevRange(date('Ym:d'), 0, 9);
[Laravel4] 短网址之API
我们提供三种格式的API, txt json jsonp
代码
路由
Route::get('short.txt', 'ShortController@txt');
Route::get('short.json', 'ShortController@json');
Route::get('short.jsonp', 'ShortController@jsonp');
控制器
public function txt() {
$validator = Validator::make(Input::all(), [
'url' => 'required|max:255|url',
]);
if ($validator->fails()) {
return implode(PHP_EOL, $validator->errors()->all());
}
$url = Input::get('url');
$hash = md5($url);
$link = Link::whereHash($hash)->first();
if (!$link)
$link = Link::create(compact('url', 'hash'));
$shorten = \Lib\Base62::encode($link->id);
return 'http://usr.im/' . $shorten;
}
public function json() {
$resp = [];
$validator = Validator::make(Input::all(), [
'url' => 'required|max:255|url',
]);
if ($validator->fails()) {
return ['status' => 'failed', 'message' => $validator->errors()->all()];
}
$url = Input::get('url');
$hash = md5($url);
$link = Link::whereHash($hash)->first();
if (!$link)
$link = Link::create(compact('url', 'hash'));
$shorten = \Lib\Base62::encode($link->id);
return ['status' => 'success', 'content' => 'http://usr.im/' . $shorten];
}
public function jsonp() {
$resp = [];
Validator::extend('callback', function($attribute, $value, $parameters) {
return preg_match('/^[A-z_]\w*$/i', $value);
});
$validator = Validator::make(Input::all(), [
'url' => 'required|max:255|url',
'callback' => 'required|max:255|callback',
]);
if ($validator->fails()) {
return Response::json(['status' => 'failed', 'message' => $validator->errors()->all()])
->setCallback(Input::get('callback'));
}
$url = Input::get('url');
$hash = md5($url);
$link = Link::whereHash($hash)->first();
if (!$link)
$link = Link::create(compact('url', 'hash'));
$shorten = \Lib\Base62::encode($link->id);
return Response::json(['status' => 'success', 'content' => 'http://usr.im/' . $shorten])
->setCallback(Input::get('callback'));
}
Windows8修改账户目录
Windows8下的用户目录如果为中文名,可能会造成某些软件不能正常使用。
开启Administrator账户
更改目录名称和注册表
使用Administrator账户登录,修改 /Users/[中文] 为 /Users/[English],若遇到文件夹正在被使用的情况可以使用procexp查出进程并结束。
修改注册表, Win + r , regedit
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Profilelist
// 找到下面的 ProfileImagePath 修改成上面刚改过的英文路径。
设置权限
/Users/[English] (右键)- 安全 - (选中用户)编辑
至此全部搞定。
cython将python转换为c
选择
之前使用过pyinstaller
打包python程序,但是遇到读取相对路径下的配置文件的问题,而且这些只是预编译成python的2进制码。
选择cython和pyinstaller的原因主要考虑的是批量部署的方便性。cython能直接将python翻译成c,然后编译,在安全性上有了一定的保障。
安装cython
选择最简单的安装方法,使用pip包管理
pip install cython
# 在网上找的一个脚本,感觉很好用的,这里直接编译成可执行程序
mkcython.sh -e main.py
pygments生成图片中的中文
非要中英文都有的字体么
说实话,原生的“中英文都有的”字体,都不是很适合用来显示代码。而网上有个雅黑和consolas的混合字体,但感觉对字体的依赖性比较大
pygments有个好处,就是本来就支持高亮的结果存为图片,于是要对其进行修改,让他用不用的字体来渲染中文和英文。
code = '''
#!/usr/bin/env python
# encoding: utf-8
from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import ImageFormatter
# 可以有中文么a可以的
code = ""
content = highlight(code, PythonLexer(), ImageFormatter(font_name = 'WenQuanYi Zen Hei'))
with open('a.png', 'wb') as handle:
handle.write(content)
handle.close()
'''.decode('utf-8')
# content = highlight(code, PythonLexer(), ImageFormatter(font_name = 'Consolas', line_numbers = False, font_size = 20))
content = highlight(code, PythonLexer(), ImageFormatter(font_name = 'Consolas', cfont_name = 'Microsoft Yahei', line_numbers = False, font_size = 20, cfont_size = 13))
with open('a.png', 'wb') as handle:
handle.write(content)
handle.close()
我修改了一下image的生成,在原来的基础上加了两个参数cfont_name, cfont_size
原理就是分离出中文,然后使用中文字体渲染,而英文使用英文字体渲染。
[Laravel4] 实战之短网址
数据库表结构
CREATE TABLE `u_links` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`url` varchar(255) NOT NULL DEFAULT '',
`hash` varchar(32) NOT NULL,
`hits` int(10) unsigned NOT NULL DEFAULT '0',
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `hash` (`hash`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
虽然理论上url可以很长,但是这里约束一下255
目录结构
这里仅列出需要动到的目录和文件
app/config 配置文件目录
app/controllers 控制器
app/models 模型
app/views 视图
app/lib 自己建的,方便放一些公用库
app/routes.php 路由
代码
对于短网址的算法不再说明,网上很多,这里使用base62来处理
配置文件
app/config/app.php
- 打开debug
- 修改时区为'Asia/Shanghai'
- 修改key,可使用artisan生成
php artisan key:generate
app/config/database.php
- 修改mysql的配置
定路由
// 显示首页
Route::get('/', 'HomeController@index');
// 网址转向
Route::get('{shorten}', 'HomeController@redirect')
->where('shorten', '[0-9A-z]+');
// 网址点击统计
Route::get('{shorten}!', 'HomeController@show')
->where('shorten', '[0-9A-z]+');
控制器
由于HomeController本身就存在,所以我们不需要生成或新建。 这里我们会用到base62的库,附件中会给出
贴代码:
public function index() {
$shorten = '';
$url = Input::get('url');
if (!is_null($url)) {
$validator = Validator::make(compact('url'), [
'url' => 'required|max:255|url',
]);
if ($validator->fails())
return Redirect::to('/')->withInput()->withErrors($validator->errors());
$hash = md5($url);
$link = Link::whereHash($hash)->first();
if (!$link)
$link = Link::create(compact('url', 'hash'));
$shorten = \Lib\Base62::encode($link->id);
}
return View::make('home.index')
->with(compact('url', 'shorten'));
}
public function redirect($shorten) {
$id = \Lib\Base62::decode($shorten);
$link = Link::find($id);
if ($link) {
$link->increment('hits');
return Redirect::to($link->url, 301);
}
App::abort(404);
}
public function show($shorten) {
$id = \Lib\Base62::decode($shorten);
$link = Link::find($id);
if ($link) {
return View::make('home.show')
->with($link->toArray());
}
App::abort(404);
}
[Laravel4] 安装
安装composer
# 由于使用的MAMP,指定php
export PATH=/Applications/MAMP/bin/php/php5.4.10/bin:$PATH
mkdir /Applications/composer
cd /Applications/composer
curl -sS https://getcomposer.org/installer | php
mv composer{.phar,}
# PATH加路径
vi ~/.zshrc
# :/Applications/composer
. ~/.zshrc
安装laravel4
# 用git://没成功,可能是公司端口的原因
git clone -b develop https://github.com/laravel/laravel.git l4
cd l4
composer install
2013/06/22 22:37更新
不加--prefer-dist
的话安装下来有100多M
composer create-project laravel/laravel . --prefer-dist
cocoa自定义button样式
图片素材
素材图片来自http://dribbble.com/shots/280227-Free-PSD-I-m-Ready-to-Dribbble
实战
预览
项目结构
button属性
更改窗体的背景颜色
- (void)drawRect:(NSRect)dirtyRect {
[[NSColor colorWithCalibratedRed:0.26f green:0.29f blue:0.31f alpha:1.0f] set];
NSRect rect = NSMakeRect(0.0, 0.0, self.bounds.size.width, self.bounds.size.height);
NSRectFill(rect);
}
源码:cusbtn.zip
phantomjs中文问题
我在centos上安装的phantomjs,然后截图的时候,中文不显示,于是安装中文字体,最后貌似没有任何反映;于是又搜到网上说要安装所有的字体`yum -y install *-fonts-*`,安装完之后貌似是好了,但是中文的大小不一很难看,于是我又删掉了这些字体;最后发现只要安装了Arial字体就正常了。
# 拷贝字体到 /usr/share/fonts 或者 在下面建立一个目录(便于管理)
mkfontscale
mkfontdir
fc-cache -fv
至此,中文的问题就没了。但貌似效果还是没有mac或者pc上面的好。
获取wav时长
duration = filesize / byterate
获取wav文件的byterate
<?php
function ascii2hex($ascii) {
$ascii = strrev($ascii);
$hex = '';
for ($i = 0; $i < strlen($ascii); $i++) {
$byte = dechex(ord($ascii{$i}));
$byte = str_pad($byte, 2, '0', STR_PAD_LEFT);
$hex .= $byte;
}
return $hex;
}
$file = fopen('test.wav', 'rb');
fseek($file, 28);
$byterate = fread($file, 4);
fclose($file);
$byterate = hexdec(ascii2hex($byterate));
echo filesize('test.wav') / $byterate / 60 . PHP_EOL;
postfix自动回复配置
增加hook
修改/etc/postfix/master.cf
myhook unix - n n - - pipe
flags=F user=nobody argv=/usr/bin/python /path/to/script.py ${sender} ${size} ${recipient}
# 第二行前面一定要有空格
修改/etc/postfix/transport
example.com myhook:
# 最后是冒号
执行命令postmap /etc/postfix/transport
修改/etc/postfix/main.cf
transport_maps = hash:/etc/postfix/transport
自动回复脚本
这里我用的是python
#!/usr/bin/env python
import sys, smtplib, re
content = sys.stdin.read()
# 如果postfix设置了virtual,${sender}将不是我们所需要的,所以这里从mail的内容中获取
froms = re.findall('^From:\s+(.*?)\n', content, re.I | re.M)
tos = re.findall('^To:\s+(.*?)\n', content, re.I | re.M)
subjects = re.findall('^Subject:\s+(.*?)\n', content, re.I | re.M)
msg = 'From: %s\r\nTo: %s\r\nReply-To:%s\r\n\r\n' % (tos[0], froms[0], froms[0])
msg += 'this is a test reply.'
mail = smtplib.SMTP('localhost')
mail.sendmail(tos[0], froms[0], msg)
mail.quit()
自定义url scheme
就是实现类似thunder://
svn://
tencent://
的链接,然后点击链接的时候,会弹出询问是否要启动应用程序。
windows下的实现
google搜索到,windows下只需要修改注册表就可以了,以下是导出的svn的
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\svn]
@="URL:SVN Protocol"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\svn\DefaultIcon]
@="C:\\Program Files\\TortoiseSVN\\bin\\TortoiseProc.exe"
[HKEY_CLASSES_ROOT\svn\shell]
[HKEY_CLASSES_ROOT\svn\shell\open]
[HKEY_CLASSES_ROOT\svn\shell\open\command]
@="C:\\Program Files\\TortoiseSVN\\bin\\TortoiseProc.exe /command:repobrowser /path:\"%1\""