分類
程序

Ubuntu16給python3.5安裝OpenCV3.2

過程略繁瑣,參考了Install OpenCV 3.0 and Python 3.4+ on Ubuntu。安裝完成可在python中import cv2.

#安裝依賴及工具
sudo apt-get install build-essential cmake git pkg-config
sudo apt-get install libjpeg8-dev libtiff4-dev libjasper-dev libpng12-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libgtk2.0-dev
sudo apt-get install libatlas-base-dev gfortran
sudo apt-get install python3.5-dev

由於我已經有python3.5的virtualenv了,所以這里就不再說了,可以参考pip3为python3安装模块

#啓動python3.5的環境
source ~/pythons/p35/bin/activate
#安装numpy
pip install numpy -i https://pypi.douban.com/simple/
#下載並解壓OpenCV,github我克隆不下拉
cd ~
wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.2.0.zip
unzip opencv.zip
wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.2.0.zip
unzip opencv_contrib.zip
cd ~/opencv-3.2.0
mkdir build
cd build
#cmake中間如有終端,可參考錯誤提示直接從web下載相關文件放於提示位置
cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D INSTALL_C_EXAMPLES=OFF \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.2.0/modules \
    -D PYTHON_EXECUTABLE=~/pythons/p35/bin/python \
    -D BUILD_EXAMPLES=ON ..
#成功執行後要留意python3的環境是否正確應有類似如下字樣
--   Python 3:
--     Interpreter:                 /home/42/pythons/p35/bin/python3 (ver 3.5.2)
--     Libraries:                   /usr/lib/x86_64-linux-gnu/libpython3.5m.so (ver 3.5.2)
--     numpy:                       /home/42/pythons/p35/lib/python3.5/site-packages/numpy/core/include (ver 1.12.0)
--     packages path:               lib/python3.5/site-packages
-- 
--   Python (for build):            /home/42/pythons/p35/bin/python3
#然後就可以編譯了
make -j$(nproc)
#編譯完成後執行安裝
sudo make install
sudo ldconfig
#查看是否安裝成功
ls -l /usr/local/lib/python3.5/site-packages/ | grep cv2
#成功的話應該會有文件出現類似
-rw-r--r-- 1 root staff 3550256 2月  17 20:36 cv2.cpython-35m-x86_64-linux-gnu.so
#把cv2關聯到python環境裏
cd ~/pythons/p35/lib/python3.5/site-packages/
ln -s /usr/local/lib/python3.5/site-packages/cv2.cpython-35m-x86_64-linux-gnu.so cv2.so
#查看是否可用
python
>>> import cv2
>>> cv2.__version__
'3.2.0'
分類
程序

matplotlib安裝使用

matplotlib是知名的繪圖庫,當我們需要製作圖表時就要使用它了。

#安裝matplotlib
pip install matplotlib
#使用matplotlib繪製一條直線並顯示
import matplotlib.pyplot as p
p.plot(range(20),range(20))
p.show()

如果matplotlib沒有顯示出圖像,而只顯示了[],很有可能是~/.matplotlib/matplotlibrc文件中的backend值設置不當,可嘗試修改為TkAgg或template。參考:matplotlib does not show my drawings although I call pyplot.show()。我用了virtualenv,matplotlibrc文件位於pythons/p3/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc。

分類
程序

mysql tricks

查看數據庫中各表的大小

SELECT TABLE_NAME,DATA_LENGTH+INDEX_LENGTH,
TABLE_ROWS,concat(round((DATA_LENGTH+INDEX_LENGTH)/1024/1024,2), 'MB') 
as data FROM TABLES WHERE TABLE_SCHEMA='dbname';

#mariadb
SELECT table_schema as `DB`, table_name AS `Table`, 
  ROUND(((data_length + index_length) / 1024 / 1024), 2) `Size (MB)` 
  FROM information_schema.TABLES 
  ORDER BY (data_length + index_length) DESC;

修改數據庫表文件的儲存位置(詳細步驟)

#登入數據庫
mysql -u root -p
#查看數據庫的存放位置,即datadir的值
show variables like '%dir%';
#退出數據庫
quit
#停止mysql,失敗的話用root權限
service mysqld stop
#創建新的數據儲存位置
mkdir /data/mysql
#將舊文件移動到新位置,第一個參數是前面datadir的值
mv /usr/local/mysql/data/* /data/mysql
#修改新位置的權限
chown mysql:mysql -R /data/mysql/
#修改數據庫配置,修改這一行datadir=/data/mysql
nano /etc/my.cnf
##修改數據庫配置,修改這一行datadir=/data/mysql
##這個我並沒有找到,所以不修改應該也可以
##nano /etc/init.d/mysqld
#啟動數據庫服務
service mysqld start

參考鏈接:mysql数据库目录存放位置更改

導入與導出mysql數據庫

#導出數據庫,前面是mysql的程序位置
/data/soft/mysql-5.5.30/client/mysqldump -u  root -p video > db_video.sql
#壓縮一下便於傳輸
tar -zcvf db_video.tar.gz db_video.sql
#導入某數據庫
mysql -u user42 -p -h localhost video < db_video.sql
#導出所有數據庫
mysqldump -u root -p --all-databases | gzip > alldb.sql.gz
#導入所有數據庫
gunzip < alldb.sql.gz | mysql -u root -p
#僅導出一張表
mysqldump -p --user=username dbname tableName > tableName.sql
#將導出的一張表導入數據庫
mysql -u username -p -D dbname < tableName.sql

新增用戶及設置權限

转载自:MySQL新增用户以及数据库访问授权

mysql -u root -p
# 允许本地 IP 访问 localhost, 127.0.0.1
CREATE USER 'user42'@'localhost' IDENTIFIED BY 'PASSWORD';
# 允许外网 IP 访问
CREATE USER 'user42'@'%' IDENTIFIED BY 'PASSWORD';
# 刷新授权
flush privileges;
# 创建数据库
create database db42 DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
# 授予用户通过外网IP对于该数据库的全部权限
GRANT ALL ON db42.* TO 'user42'@'%';
# 刷新权限
flush privileges;
# 退出 root 重新登录
\q
# 已新帐号 user42 登录,由于使用的是 % 任意IP连接,所以需要指定外部访问IP
mysql -u user42 -h 192.168.1.168 -p

新建一個庫一張表

CREATE DATABASE `djangoTask` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE `bonus` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userid` int(10) NOT NULL,
  `bonus` int(10) DEFAULT NULL COMMENT '奖励金',
  `level` int(3) DEFAULT NULL COMMENT '等级',
  `nowTimestamp` int(13) DEFAULT NULL COMMENT '插入时间戳',
  `nowDateTime` datetime DEFAULT NULL COMMENT '插入时间',
  `updateInfo` varchar(128) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=66156 DEFAULT CHARSET=utf8 COMMENT='bonus';

對某個時間段內某個值出現的次數做統計

SELECT info, count(info) FROM aso.aso_apple 
where nowTimestamp>'1489161600' GROUP BY info;

對某個時間段內的數據按天展示統計

SELECT COUNT(id) as 'sum', DATE_FORMAT(nowDatetime, '%Y-%m-%d') as 'day'
FROM aso.aso_apple WHERE nowTimestamp>'1488643200'
GROUP BY DATE_FORMAT(nowDatetime, '%Y-%m-%d');

昨天各商品的銷售總額

SELECT product_id, 
SUM (order_price) 
FROM orders WHERE create_time > CURDATE()-1
GROUP BY product_id;

使用inner join查看關聯數據

SELECT * FROM test.t_account a 
INNER JOIN test.t_client b 
ON a.cId = b.id WHERE b.sn like '%sz%';

刪除inner join查詢到的關聯數據

DELETE a.* FROM test.t_account a
INNER JOIN test.t_client b ON a.cId = b.id
WHERE (b.sn like '%sz%');

更新inner join查詢到的關聯數據

UPDATE task_new.t_account AS a 
INNER JOIN task_new.t_client AS b 
	ON a.cId = b.id 
	AND b.sn like '%sz%'
SET a.status='1' ;

使用子查詢

SELECT id, first_name
FROM student_details
WHERE first_name IN (SELECT first_name
FROM student_details
WHERE subject= 'Science'); 
<h3>使用新表來去重</h3>
#先新建一張表
CREATE TABLE newtable LIKE oldtable; 
#將去重後的數據插入新表
INSERT INTO newtable SELECT * FROM oldtable GROUP BY key;
#把舊表備份下
ALTER TABLE oldtable RENAME TO  oldtable_bak ;
#把新表改名為舊錶
ALTER TABLE newtable RENAME TO  oldtable ;

表結構發生變化後,從舊表複製數據到新表

#先新建一張表
 INSERT INTO `NEW_DB`.`NEW_TABLE` (`latitude`, `longitude`,`accuracy`,`altitude_accuracy`,
 `heading`,`speed`,`loc_time_text`, `loc_time`, `insert_time`, `address`, `ip`, `isp`, `text`, `owner_id`) 
 SELECT `latitude`, `longitude`,FLOOR(`accuracy`),`altitudeAccuracy`,
 `heading`,`speed`,`locTime`, `locTime`, `locTime`, `geoCode`, `ip`, `isp`, `text`, 1 
FROM `OLD_DB`.`OLD_TABLE`;

extendsclass.com提供了很多免費的在線測試工具,其中有一個免費的在線測試 MySQL 語句的工具可供大家測試 MySQL 語句。

重置 MariaDB 的 root 用戶密碼

如果我轉述的有不通的地方,請參考原文:How To Reset Your MySQL or MariaDB Root Password on Ubuntu 20.04,原文還包含了重置 MySQL 數據庫 root 用戶密碼的步驟。

首先非常建議安裝一個和要恢復密碼相同的數據庫版本相同的測試數據庫以供測試,你都把 root 密碼搞丟了,還是不要直接在產品數據庫上做實驗了。你可以通過 mysql --version 來查看數據庫的版本。

開始恢復前先關閉數據庫

sudo systemctl stop mariadb

然後用不檢查權限的方式運行數據庫

sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking"
sudo systemctl start mariadb

現在你就可以登入數據庫並重置密碼了

sudo mysql -u root
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
FLUSH PRIVILEGES;
#下面兩行我執行後報錯
#但是並不影響,我還是成功修改了密碼
UPDATE mysql.user SET authentication_string = '' WHERE user = 'root';
UPDATE mysql.user SET plugin = '' WHERE user = 'root';
exit

可以恢復到正常模式啓動數據庫並檢驗新密碼了

sudo systemctl unset-environment MYSQLD_OPTS
sudo systemctl restart mariadb
mysql -u root -p

本文更新於 2022/08/28。

分類
程序

豆瓣相册自动翻页

從台灣旅行回來,Emanon又往豆瓣相冊里上傳了很多照片。這些照片是經過她篩選的,所以質量比較高,一張一張看一遍也很舒服。但是一張一張看,手很累,即使豆瓣貼心的準備了右鍵翻頁功能。於是我就想通過網絡控制台的js來讓網頁自動跳轉,最後發現網頁控制台的代碼只能在當前網頁執行一次,到了新網頁就不能自動運行了。然後看了下火狐的擴展幫助,感覺還挺方便的於是,提交了個自動翻豆瓣相冊的插件。插件安裝地址:豆瓣相册自动翻页

當前版本安裝後只是匹配到照片頁面後,就傻瓜等待5秒後,點擊下一頁,沒有配置項,所以不用時需要去火狐的擴展頁面禁用此擴展。

以後有空的話會完善一下,增加自定義時間和手動啟動的功能。

本文更新於 2016/10/20。

分類
程序

蛋國志

蛋國志

Emanon目前呆過福利最好的公司的遊戲終於公測了!蛋國志Facebook蛋國志谷歌市場。投放谷歌市場時應該鎖了區,所以大家可以通過APKPure搜索包名com.koogame.eggworld.ganpu01並選擇馬來西亞區進行下載體驗。

我的感覺是,遊戲很萌!蛋蛋們很可愛又各有特點,配樂也很有意思,作為遊戲,各個角色的配比也比較用心,總之還是很值得玩一玩的。我覺得萌度已經達到了The Battle Cats的高度,而且還比The Battle Cats耐玩,至少一開始是這樣。技能描述的小動畫我也很喜歡,藏的好深的。

蛋国志是一款有趣又有料的休闲竞技策略手游。耳熟能详的历史名将,变身创意有趣的蛋蛋人,来到独一无二的的蛋世界。

作为指挥官的你,要做的事情很简单,也很不简单!那就是:收集和培养你的英雄、搭配和调教你的阵容,努力成为最厉害的蛋国指挥官!

作为小编的我,小小剧透一下,在这个精彩有趣的蛋世界,包括但不限于的组合有: 关羽林冲姜子牙、荆轲黄忠诸葛亮、吕布貂蝉花木兰…各种奇葩各种组合,多人在线同场竞技,看看你的阵容谁能破?


新版本已經取消了鎖區,大家可以直接從谷歌市場下載玩耍了。而且上面提到的好玩的技能動畫現在只有在facebook才能看到,遊戲里還沒加上。另外告訴新手一個機密,能賣諸葛亮的時候趕緊買一個,保證一段時間內所向無敵!還有就是不充值並不影響遊戲體驗。


2017-06-15 時隔一年有新版本哦,新版有了新玩法和酷炫的皮膚,在酷市場下載蛋國志,在谷歌市場下載蛋國志。除了新增玩法和皮膚之外,人物的屬性似乎也有調整,當年法海加花木蘭加李白簡直天下無敵,現在要重新找個組合了。

本文更新於 2017/06/15。

分類
程序

定時發布

接口需要添加一個定時發布的功能,這樣可以提前準備好內容,時間一到,用戶就能看到。這裡用到js和php的日期操作。

大概搜了下html5中用datetime相關的表單,但是由於瀏覽器實現的問題,為了穩定性最終放棄。使用"YYYY-MM-DD HH:mm:ss"這樣的文本來保存設置時間,後台轉換成utc時間戳,最後通過對比時間戳來決定是否發布。時間全部顯示為北京時間。php使用了thinkphp框架。js和php默認返回的時間戳都是UTC時間。

後台的添加新聞模板:

<input type="text" class="" size="100" maxlength="300" name="publishTimeU" id="publishTimeU" value=""/>
<input type="hidden" maxlength="100" name="publishTime" id="publishTime" value=""/>
<script type="text/javascript">
(function($){
	var date = new Date();
	date = date.toISOString().substr(0, 19)+"-08:00";
	var date1 = new Date(date);
	date1 = date1.toISOString().substr(0, 19);
	date1 = date1.replace(/T/, " ");
	$("#publishTimeU").val(date1);
	
	//定時發布失去焦點時,換算時間戳
	$("#publishTimeU").blur(function(){
		var ptString=$("#publishTimeU").val();
		ptString=ptString.replace(/ /, "T")
		var pt=Date.parse(ptString+"+08:00")/1000;
		$("#publishTime").val(pt);
		
	}); 
})(jQuery);
</script>

後台的修改新聞模板:

<input type="text" class="" size="100" maxlength="300" name="publishTimeU" id="publishTimeU" value=""/>
<input type="hidden" maxlength="100" name="publishTime" id="publishTime" value="{$vo.publishTime}"/>
<script type="text/javascript">
(function($){
	var date = new Date($("#publishTime").val()*1000);
	date = date.toISOString().substr(0, 19)+"-08:00";
	var date1 = new Date(date);
	date1 = date1.toISOString().substr(0, 19);
	date1 = date1.replace(/T/, " ");
	$("#publishTimeU").val(date1);
	
	//定時發布失去焦點時,換算時間戳
	$("#publishTimeU").blur(function(){
		var ptString=$("#publishTimeU").val();
		ptString=ptString.replace(/ /, "T")
		var pt=Date.parse(ptString+"+08:00")/1000;
		$("#publishTime").val(pt);
		
	});
})(jQuery);
</script>

php接口:

$now = new DateTime(null, new DateTimeZone('Asia/Hong_Kong'));		
$nowTimestamp = $now->getTimestamp();
//只需在查詢語句的map里添加時間戳對比即可
$map = array (
	'h'		=> array('like','%'.$cid .'%'),
	'publishTime'	=> array('LT',$nowTimestamp),
	'status'	=> 1
);
$count = $model->where ( $map )->cache (false)->count ();
分類
程序

Emojiえもじ

Emoji即顏文字,現在還挺流行的,像?,完整表可以看Emoji Unicode Tables。其中第一列就是當前設備原生顏文字的表現形式。由於顏文字實際上是字符,所以不同平台有不同的展現形式,就像不同的字體一樣。如果想在網頁中加入顏文字,直接把顏文字當字符複製到網頁中就可以了。

最近用到一個功能,讓Line分享的信息中包含顏文字排列出的圖案,像這種
     ??     ??
???????
???????
???????
     ?????
          ???
               ?
問題主要在於空格和換行,空格無需處理,直接放到待分享信息中即可,換行用\n代替,就可把上面圖案傳至Line分享框了。Line的分享格式我是這樣寫的:

var shareMsg='好搞笑哦\n?';
function shareToLine42(){
	lineUrl="line://msg/text/"+encodeURIComponent(shareMsg)+"%0D%0Ahttps://ft.wupo.info/";
	//如果你有谷歌統計,下面一行可以統計按鈕的點擊次數
	//ga('send', 'event', 'button', 'click', 'share-line-button');
	window.open(lineUrl, 'sharer', 'toolbar=0,status=0,width=626,height=436');
}
注意,shareMsg中顏文字被wordpress做了修改,用來兼容沒有顏文字的平台,實際直接這樣寫"好搞笑哦\n?"就可以。後面代碼中再有顏文字我用"顏文字UTF8"代替。

在wordpress4.4中,顏文字是這樣展現的,把真正的utf8字符放到了alt標籤里。

<img class="emoji" draggable="false" alt="顏文字UTF8" src="https://s.w.org/images/core/emoji/72x72/1f602.png">
去數據庫發現posts表中post_content字段類型為longtext,排序規則為utf8mb4_unicode_ci。其中保存的就是?,而用圖片替換顏文字是發生在文章輸出過程中的。關於排序規則請參考:What's the difference between utf8_general_ci and utf8_unicode_ci,如果沒空細看,那麼結論是直接用utf8mb4_unicode_ci就好。如果你還在用utf8-general-ci,是無法儲存顏文字的。

本文更新於 2016/07/20。