分類
記事

開始使用谷歌相冊

谷歌相冊如果選用推薦畫質可以無限容量保存,於是抱着試試看的態度打算將其所謂一個備份。使用中發現,真是好用,所以過來推薦一下。除了容量大,谷歌相冊還能識別人臉,於是可以方便的查看某個人的所有照片。除了按人臉和地理位置分類,谷歌相冊還可以識別森林,火車,貓,鴨子,汽車,雕像,帆船等,雖然有時候會有識別錯誤,但是也蠻搞笑。視頻也是可以保存的,保存後就可以直接通過瀏覽器查看了。

由於谷歌在內地受限,所以我並沒有使用谷歌相冊安卓客戶端,而是定期通過PC上傳照片,反正相機裏的也是要上傳的。同樣的ss代理,電信確實是最快的,差不多能達到4M的上傳速度。前幾天用天威寬帶,差不多穩定在1M的上傳速度,今天只有0.5M。也在長城寬帶中試過,非常不穩定,快時2M,慢時只有幾十K。

分類
软件

元素之刃

元素之刃-ios

這是Emanon參與製作的一款遊戲,真的耗費了三年多時間,現在終於上線。現在肯花這麼久開發遊戲的真的很少,所以衝著用了這麼久時間打磨也應該差不到哪裡去。蘋果App Store鏈接:元素之刃。我和Emanon都沒有蘋果設備,所以無法寫篇測評什麼的。什麼時候玩過了,再來補充。


接了個iPad2,結果不適配,雖然硬要玩也能玩一下(原始版特效會變黑像素塊,後面關卡會因為看不到血條而打不過;第二版後面關卡會閃退)。所以建議iPad2以下的用戶還是不要嘗試了。有一點提示是,由於這是一個兩三百兆大小的單機遊戲,所以在升級過程中,盡量不要動它,待它升級完成後再開始玩。否則如果自己有誤操作的話,有一定幾率丟失遊戲進度資料。

本文更新於 2016/03/14。

分類
記事

手機Xperia Go

Sony Xperia Go st27i

前些天出去玩,遇到一條狗,那條狗肯定是被人喂慣了,所以很會粘人。躲避它的途中被一個小孩撞倒,牛仔褲也摔了一個大口子,手機屏也摔碎了。

Go這個手機雖然運行速度慢了些,但用起來還是很順手的捨不得扔。於是在萬能的淘寶上買了一個屏三十多。寄來發現我不小心拍錯了型號,還好買了運費險。退貨後又買了一個,按照iFixit中Sony Xperia go Front Glass/Digitizer Replacement換上了新屏。買眼鏡時送的小螺絲刀起到很大作用,否則裏面有一個特殊的螺絲真是沒法取下來。最後裝好後屏幕有些翹,主要是因爲排線並沒有完全貼合,我不敢使勁按排線,怕按折了,最後用強力膠沾牢就不翹了。

索尼的小手機手感都特別好,又有防塵防水的特性。哪天這個手機確實不行了,應該還是會選索尼的。上次去香港感覺M4就不錯,1500左右。Z系列的Compact當然是更好,但是太貴啦。而且都不支持移動4G,也是一大遺憾。

分類
記事

去年去了次泰國

現在才寫就是拖延症。

去年11月份公司出差去泰國。坐的廉價亞航,從深圳到曼谷正價往返2000左右。中國公民可以泰國落地簽,過程有些複雜,需要準備1000泰株簽證費,這個可以在機場換。需要照片,也可以在機場照。然後填表,記得有兩張表,一張是在飛機上發的(如果飛機上沒領到,機場也有),一張是在機場的。按照樣張填寫即可,需要注意的是有一欄要填入住酒店的名字,這個要提前準備好,否則臨時不記得就麻煩了。海關人員的態度不好。40元在淘寶買的7天的泰國Dtac旅遊電話卡,即可以打電話,又可以上網。上網的話不記得3/4G是多少流量了,用完之後還有無限的2G流量。我到最後也沒用完3G流量。

過完海關已是後半夜,路上接我們的同事還被交警攔下吹了酒精檢測儀。同時嚇夠嗆,倒不是喝了酒,而是他根本沒有駕照!還好只是吹了就放行了,並沒有查駕照。

曼谷7-11挺多的,店員也能聽懂一些英語。意外的是google translate並不能翻譯圖片中泰文,這樣就坐車啊點菜啊什麼的就比較麻煩了。說道7-11,荷蘭風車的牛奶真的很好喝!吃得方面發現曼谷日本料理很多,而且都特別好吃,魚很鮮嫩!麵呢就之吃過一次蕎麥麵,感覺也很正宗。聽說是二戰時泰國沒有被日本欺負,所以泰日文化上沒有很大衝突。批薩意麵也很不錯,記得吃了一個批薩,上面居然有湖南那種大紅辣椒!也是又好吃又便宜。還去吃了一個龍蝦麵,華人餐館,上菜前所有服務員齊聲用蹩腳中文報出菜名。其實龍蝦麵是好看不好吃,龍蝦很大很震撼!小吃方面,在大皇宮旁邊吃了烤香蕉,可以試試。還吃了碗泡麵,也挺好吃的。有一天早上在街邊買的炸豆腐,下面有辣油和黃瓜,吃得也挺過癮。還有冰鎮飲料,真的放了好多冰啊,回來後覺得國內放的冰也就是意思一下。

泰國是佛教國家,這點去一次寺廟就感受到了。我在大皇宮附近轉悠的時候進了一個廟,裡面有幾口大水缸,人們會從中取水洗臉或灑在身上或裝到小透明塑料袋子里帶走。有一個大堂,只有北面有牆,人們拖鞋上去跪拜。大堂邊上有鍾、鼓等參與性的設施。附近還有一個更加莊重的大堂。繼續往前走看到幾個火爐,人們可以買油,可能是香油,倒到火爐里。旁邊有一口大油缸,有的人沒有把油倒進火爐而是倒到油缸里。再往前的一個小巷子里兩個黑色的大垃圾袋裝滿了空油瓶,油瓶就是我們常見的街邊賣甘蔗汁常用的透明塑料瓶子。繞了一圈從小門出來,看到一位婦女在賣鴿子,鴿子圈在籠子里。河邊的小巷裡有各種工藝品,佛像,佛牌等。

泰國的全稱是泰王國,在街道上經常看到國王和皇室成員的巨幅畫像。根據維基百科介紹,2014年5月22日的軍事政變是泰國自1932年以來,軍方第12次發動政變。根據自由之家2015年的數據,泰國也屬於不自由的國家。

回來的那天是周末,見識了一下曼谷的堵車。總體來說曼谷空氣還是非常不錯的,天藍的就像東北的冬天一樣。這種藍天我在深圳很少見到。泰國人我接觸的不多,大概的感覺是生活比較安逸,所以干起活來不如大陸人拼。像我們的泰國的同事,像讓他們周末稍微干點活,真是千難萬難,其實這是大陸的悲哀。

題外話,今天聽說Google My Tracks要關閉了,唉,谷歌又關了一個好服務。還好我從泰國回來後就把Google Fit開啟了。但是Fit有一個缺點,就是無法查看衛星圖層,為什麼要查看衛星圖層呢,因為地圖圖層的位置是漂移的。

本文更新於 2016/12/30。

分類
网站

PHP隨機

最近有一個需求是這樣,數據庫有電影幾百條,預告片幾百條。之前是倒序排列返回給客戶端,這樣所有客戶端就能看到最新的片子和預告片,電影和預告片是兩個接口。現在由於考慮服務器壓力,決定隨機展現影片和預告片給客戶端,兩個接口合併成一個,按ABABAB這樣返回。我的做法是以用戶id加今年的天數作為隨機種子對電影和預告片進行隨機排序,然後截取亂序後的數組進行交叉合併並進行分頁,再返回給客戶端。這樣的效果是同一用戶在同一天打開的列表是一樣的,而且影片條目不會重複。而不同用戶打開的列表卻不一樣。公司項目用的ThinkPHP3.1,看下代碼

//接口urlhttp://domin.com:8042/Video/v1.php?qt=Videolist&pi=2&ps=20&uid=972124678
class ApiVideolistAction extends Action{
function getData(){
    //獲取用戶id,單頁條目數量和第幾頁
    $uid = I("get.uid", "0", "intval");
    $pageSize = I("get.ps", "20", "intval");
    $pageNum = I("get.pi", "1", "intval");
    $model1=new Model();

    $film=$model1->query("SELECT video_static.sid FROM video_static, category_video WHERE category_video.cid = 4 AND video_static.status = 1 AND category_video.vid = video_static.sid ");
    $trailer=$model1->query("SELECT video_static.sid FROM video_static, category_video WHERE category_video.cid = 50 AND video_static.status = 1 AND category_video.vid = video_static.sid ");
    $count = count($film) > count($trailer) ? count($film) : count($trailer);
    $allPage = ceil($count / $pageSize);
    if ($pageNum > 0 && $pageNum <= $allPage) {
        $limit_start = ($pageNum - 1) * $pageSize;
    } else {
            $limit_start = 0;
    }
    $dayNum=(int)date('z');
    //设置隨機種子,只要種子一樣,隨機後的數組就一樣
    srand($uid+$dayNum);
    //打亂數組
    shuffle($film);
    shuffle($trailer);
    //分頁切數組
    $vid_listF=array_slice($film,$limit_start,$pageSize);
    $vid_list1F=array_slice($trailer,$limit_start,$pageSize);
    //交叉合併數組
    $arr = array();
    for($i=0;$i < $pageSize; $i++){
        array_push($arr,$vid_listF&#91;$i&#93;); 
        array_push($arr,$vid_list1F&#91;$i&#93;);
    }
    if (empty($arr)) {
            return array(
                "resultStatus" => 1,
                "allCount" => 0,
                "data" => null
            );
    }
    $data = array();
    foreach ($arr as  $every) {
        //這裡用了ThinkPHP的方法根據sid獲取一條數據
        $find = D('VideoStatic')->find($every['sid']);
        //對數據進行處理的示例
        $find['videuri'] = $find['videuri'] ? "http://" . APP_HOST_NAME . ":8042/" . $find['videuri'] : "";        
        if (empty($find)) { continue; }
        $data[] = array_change_key_case($find, CASE_UPPER);
    }
    $result = array(
            "allCount" => $count,
            "pageCount" => $allPage,
            "pageSize" => $pageSize*2,
            "pageIndex" => $pageNum
    );
    return array(
            "resultStatus" => 1,
            "pinfo" => $result,
            "data" => $data
    );
}
}

既然文章名叫PHP隨機,其實PHP隨機最常用的用法是rand(10,13),它會返回最小10,最大13的整數。

分類
記事

Cardboard體驗

google這個Cardboard可比上次那個glass親民多啦,雖然官網那些也都蠻貴,但是我們有淘寶啊,13塊從山西買了一個。效果挺好的,對手機像素要求挺高,我的Z(5.0吋TFT 螢幕 1600 萬色 1920 x 1080 畫素)感覺還可以,但是像素再低些應該就沒法看了。

資源方面先去谷歌市場裝一個Cardboard,然後就會引導你去下更多應用如過山車、星空漫遊等應用,也可以引導你去youtube觀看VR影片。應用方面,體驗很好,但是沒法操作手機算是一個遺憾,磁控鍵我就沒用成功過。說道這個磁控鍵,設計真是神奇,好像看到了二次元的東西。另外就是有些應用我始終對不上焦,應該是應用本身的問題。電影不僅考驗屏幕還考驗網速。總結就是Cardboard值得一試,直接從Cardboard裏推薦的應用玩一玩就很不錯了。

由於是紙板,所以有時位置不是很精確,但是手調整一下就好了。另外我沒用帶子,直接用手舉着看的,也比較舒服。還有我近視350度,不用眼鏡可以正常觀看。

分類
网站

php生成圖片與crontab

PHP生成圖片

//@function.php
//先獲取個GET參數等下寫圖片里
if ($_GET["name"]) {
    $name = htmlspecialchars($_GET["name"]);
} else {
    $name = '';
}
//創建圖像
$img=getImgType($img_path);
$img=createImg($img,$wordsPhoto,$left_px,$top_px,25,0,20,'19f','ARIALUNI');
//保存圖像
$img_info=saveImg($img,'png');

//創建圖像函數
function getImgType($img_path) {
	$img = getimagesize ( $img_path );
	switch ($img [2]) {
		case 1 :
			$img = @imagecreatefromgif ( $img_path );
			break;
		case 2 :
			$img = @imagecreatefromjpeg ( $img_path );
			break;
		case 3 :
			$img = @imagecreatefrompng ( $img_path );
			break;
		default :
			$img = @imagecreatefrompng ( $img_path );
	}
	return $img;
}
//修改圖像函數
function createImg($img, $str, $x, $y, $length = 20, $angle = 0, $size = 12, $color = '39f', $font = 'kanghua') {
	switch ($color) {
		case '19f' :
			$color = imagecolorallocate ( $img, 22, 157, 252 );
			break;
		case 'f37' :
			$color = imagecolorallocate ( $img, 255, 51, 119 );
			break;
		case '63a' :
			$color = imagecolorallocate ( $img, 68, 172, 106 );
			break;
		case 'f90' :
			$color = imagecolorallocate ( $img, 255, 158, 3 );
			break;
		case 'a60' :
			$color = imagecolorallocate ( $img, 172, 106, 0 );
			break;
		case '790' :
			$color = imagecolorallocate ( $img, 113, 149, 13 );
			break;
		case 'fff' :
			$color = imagecolorallocate ( $img, 255, 255, 255 );
			break;
		case '000' :
			$color = imagecolorallocate ( $img, 0, 0, 0 );
			break;
		default :
			$color = imagecolorallocate ( $img, 67, 157, 252 );
	}
	switch ($font) {
		case 'ARIALUNI' :
			$font = './../font/ARIALUNI.ttf';
			break;
		case 'CODE2000' :
			$font = './../font/CODE2000.ttf';
			break;
		case 'SarunsManorah' :
			$font = './../font/SarunsManorah.ttf';
			break;
		case 'FreeSerif' :
			$font = './../font/FreeSerif.ttf';
			break;
		case 'kanghua' :
			$font = './../font/kanghua.ttf';
			break;
		case 'shishang' :
			$font = './../font/shishang.ttf';
			break;
		case 'yahei' :
			$font = './../font/yahei.ttf';
			break;
		default :
			$font = './../a_include/font/kanghua.ttf';
	}
	$str = wordwrap_utf8 ( $str, $length );
	imagettftext ( $img, $size, $angle, $x, $y, $color, $font, $str );
	return $img;
}
//文字换行
function wordwrap_utf8($string, $length = 20, $break = "\n", $cut = false) {
	if ($length == 0) {
		return $string;
	}
	preg_match_all ( '/./u', $string, $matches );
	$s = $matches [0];
	$ct = count ( $s );
	for($i = 0; $i < ceil ( $ct / $length ); $i ++) {
		$ns .= implode ( '', array_slice ( $s, $i * $length, $length ) ) . $break;
	}
	return $ns;
}
function saveImg($img, $type = 'png') {
	$img_url = '';
	$img_name = time ().rand(10,99);
        //php5.5以上才支持webp
	if ($type == 'jpg') {
		$img_url = '/a_cache/' . $img_name . '.jpg';
		$img_filename = dirname ( dirname ( dirname ( __FILE__ ) ) ) . '/a_cache/' . $img_name . '.jpg';
		imagejpeg ( $img, $img_filename );
	} else {
		$img_url = '/a_cache/' . $img_name . '.png';
		$img_filename = dirname ( dirname ( dirname ( __FILE__ ) ) ) . '/a_cache/' . $img_name . '.png';
		imagepng ( $img, $img_filename );
	}
	imagedestroy ( $img );
	$img_info ['img_name'] = $img_name;
	$img_info ['img_url'] = '..' . $img_url;
        return $img_info;
}

網頁展示圖片

//@show.php
require_once 'function.php';

<div style="width:100%;text-align:center;background-color: #58C7C2;padding: 0.52em 0.1em 0.52em 0.1em;">
<img id="res_pic" style="display: block;width: 70%;margin-left: 15%;" src="<?php echo $img_info['img_url'];?>" />
</div>

用corntab定期清理緩存圖片

創建可執行文件/www/del_cache,內容如下,意思是刪除兩天前的文件

#!/bin/bash 
find /path/to/your/a_cache/* -mtime +2 -exec rm -f {} \;

把執行文件加入定時任務

crontab -e
#如果有多個編輯器,可能會讓選擇編輯器,但我CentOS中有nano,並沒有提示,我還是得用vi

修改並把下面一行粘貼到最後,意思是每小時的0分執行一次

00 * * * * /path/to/the/script

有時我們需要每30秒執行一次定時任務,但是crontab只能精確到分,可以這麼做:

* * * * * /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )

這裡還有一個每90秒的例子:

*/3 * * * * /path/to/executable param1 param2
*/3 * * * * ( sleep 90 ; /path/to/executable param1 param2 )

有時我們需要以root用戶來執行crontab中的命令,僅僅切換到root用戶然後使用crontab -e似乎還是不行,後來發現(CentOS下)可以這樣:

nano /etc/crontab
#在這裡編輯需要定時執行的命令,並指定運行命令的用戶
03 * * * * root /path/to/the/script

有時的需求是這樣的,定時任務執行時間不確定,比如有時10分鐘,有時30分鐘,但是我們還不想同時執行兩個任務,這時可以使用flock文件鎖來控制只有一個程序在跑。

#下面的效果就是,每5分鐘檢查一次,如果在ping就跳過此次執行
*/5 * * * * flock -xn /tmp/42ping.lock -c 'ping -c 1000 ft.wupo.info >> ping.log'
#測試發現即使程序異常中斷,lock也會被解除,下次任務仍然得以運行

參考了How to Delete Old Files In A Folder Automatically In LinuxRunning a cron every 30 seconds。對於crontab的寫法,可以到crontab.guru來驗證是否正確。其實我主要是想記錄這一段。

本文更新於 2017/03/07。