分類
网站

日期時間選擇器

使用bootstrap-datetimepicker來做出日期時間選擇器

<!DOCTYPE html>
<htmllang="zh-CN">
<head>
<meta charset="utf-8">
<title></title>
<script type="text/javascript" src="./bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript" src="../js/jquery-3.1.1.min.js"></script>
<script type="text/javascript" src="../js/bootstrap-datetimepicker.js" charset="UTF-8"></script>
<script type="text/javascript" src="../js/locales/bootstrap-datetimepicker.zh-CN.js" charset="UTF-8"></script>
<script type="text/javascript" src="./Chart.bundle.min.js"></script>
<link href="./bootstrap/css/bootstrap.min.css" rel="stylesheet" media="screen">
<link href="../css/bootstrap-datetimepicker.min.css" rel="stylesheet" media="screen">

</head>
<body>
<br/>
<div class="container">
  <div>
    <form action="" class="form-inline"  role="form">
		  <div class="col-sm-12 col-md-2">
            <select name='appleIDOption' id='appleIDOption' class="form-control" >
            <!-- <option value="volvo">Volvo</option>  -->
            </select>     
        </div>   

        <div class="form-group col-sm-12 col-md-9">
            <label for="dtp_input1" class="col-md-2 control-label">开始时间</label>
            <div id="startTime" class="input-group date form_datetime col-md-4" data-date="" data-date-format="yyyy-mm-dd hh:ii" data-link-field="dtp_input1">
                <input class="form-control" size="16" type="text" value="" readonly>
                <span class="input-group-addon"><span class="glyphicon glyphicon-remove"></span></span>
				<span class="input-group-addon"><span class="glyphicon glyphicon-th"></span></span>
            </div>
			<input type="hidden" id="dtp_input1" data-date-format="yyyy-mm-ddThh:ii:ss" value="" />


            <label for="dtp_input2" class="col-md-2 control-label">结束时间</label>
            <div id="endTime" class="input-group date form_datetime col-md-4" data-date="" data-date-format="yyyy-mm-dd hh:ii" data-link-field="dtp_input2">
                <input class="form-control" size="16" type="text" value="" readonly>
                <span class="input-group-addon"><span class="glyphicon glyphicon-remove"></span></span>
				<span class="input-group-addon"><span class="glyphicon glyphicon-th"></span></span>
            </div>
			<input type="hidden" id="dtp_input2" data-date-format="yyyy-mm-ddThh:ii:ss" value="" /><br/>
        </div>		
    </form>	
		  <div class="col-sm-12 col-md-1">
          <button class="btn btn-default" id="query">查询</button>
        </div>
  </div>
</div>

<div id="charts" class="container" style="max-width:1600px;max-height:400px;"></div>

</body>
<script type="text/javascript">
    $('.form_datetime').datetimepicker({
        language:  'zh-CN',
        weekStart: 1,
        todayBtn:  1,
        autoclose: 1,
        todayHighlight: 1,
        startView: 2,
        forceParse: 0
    });

//沒有找到bootstrap-datetimepicker中轉出時間戳的格式,只好自己轉
//datastring後面不加+08:00的話Chrome會用+00:00,導致時間戳有誤
    $('#startTime').datetimepicker().on('hide', function(ev){
        $('#dtp_input1').val(Date.parse($('#dtp_input1').val().replace(' ',"T") + "+08:00"));
    });
    $('#endTime').datetimepicker().on('hide', function(ev){
        $('#dtp_input2').val(Date.parse($('#dtp_input2').val().replace(' ',"T") + "+08:00"));
    });

  $("#query").click(function(){
	    $( "#charts" ).empty();
	    var appleIDSelected = $('#appleIDOption').val();
//	    只取十位就好了
	    var startTime = $('#dtp_input1').val().substr(0,10);
	    var endTime = $('#dtp_input2').val().substr(0,10);
	    var postData = { appleID: appleIDSelected,startTime: startTime,endTime: endTime };
	    var jsonData = $.ajax({
		    url: 'keywordData.php',
		    method: 'POST',
		    data: postData,
		  }).done(function (results) {
//			  prepareChart(results);
		    });
	  });
</script>
</html>
分類
程序

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。

分類
软件

pdftotext 與 split

pdftotext是一個簡單的很多linux發行版都自帶的小工具,可以把pdf轉換成txt文本。它沒有使用ORC,所以只能轉換文本的pdf。可以通過設置起始坐標和截取的高度寬度來避開pdf文檔中的header和頁碼,命令如下:

pdftotext -x 50 -y 100 -H 550 -W 400 -nopgbrk -eol unix source.pdf

split是一個分割小工具,可以把大文件切成幾個小文件。下面這條命令將temp.txt分割成10KB一個的文件,並且不打斷原有的行(這個功能很好,我試過不用這個參數,結果漢字被硬生生分開到了兩個文件)。分割後的文件命名如temp_1.txt。

split -C 10KB -d temp.txt temp_
分類
Linux

Fedora使用藍牙鍵盤

湊了個雙十一的熱鬧,買了套Logitech的藍牙鍵盤鼠標。藍牙相對於普通無線鍵盤鼠標的好處是不再需要接收器,方便的和手機平板等配對。我買的這個K480鍵盤可以方便的在三個設備間分享使用鍵盤,感覺還挺方便的。

正常情況下,如果Fedora沒有藍牙管理員,可以通過的dnf install blueman來安裝,安裝完畢後藍牙管理員會出現在偏好設定中,根據圖形界面的指示配對鍵盤即可。

我遇到的非正常情況下呢,就點了配對沒有反應,應該給我配對PIN碼在鍵盤上輸入的,但是沒有。於是改用命令行方式:

#進入藍牙控制,會自動列出當前設備,鍵盤的mac地址此時已經顯示出來
bluetoothctl
power on
agent on
default-agent
scan on
#我的提示不能搜索,不過沒關係,直接用第一步得到的mac地址進行配對
pair A1:B2:C3:D4:E5:F6
#此時命令行應該會告訴你配對的PIN碼,在藍牙鍵盤上輸入後按回車即可配對成功
#但是配對成功後還沒結束哦
connect A1:B2:C3:D4:E5:F6
trust A1:B2:C3:D4:E5:F6
#然後藍牙鍵盤就可以正常工作了,重啟也會自動連上的。

題外話:我記得以前看到bluetooth在繁體中文的寫作「藍芽」,現在似乎都改為統一的藍牙了,我覺得還是藍牙好。

本文更新於 2016/12/22。

分類
软件

使用Fiddler抓取App Store的包

首先說明,如果想把App Store的https鏈接全都解密,那麼所用蘋果設備需要越獄,否則只能解密部分https鏈接。

Fiddler是一個非常好用的抓包工具,比Wireshark不知到簡單到哪裡去了,非常適合對網絡協議不熟悉的使用者。安裝完成後,打開Fiddler,右上角有個Online,鼠標放上去後會彈出網絡信息,最後一行便是本機的IP。在蘋果設備上的WiFi設定中配置proxy為運行Fiddler的IP,端口默認是8888。這樣所有的流量就顯示在Fiddler窗口中了。Fiddle的設置在Tools》Teleric Fiddler Options中。

如果要查看https流量,需要在代理端和蘋果設備各安裝一個證書。由於要對蘋果設備解密https,所以還需要安裝一個證書生成器插件CertMaker for iOS and Android,安裝完成後重啟Fiddler。在設置的HTTPS選項卡中勾選Decrypt HTTPS traffic,在右邊Actions里選擇Trust root centificate,然後根據提示就完成了在代理端根證書安裝。用蘋果設備訪問http://你的代理IP:8888,最下面有一個FiddlerRoot centificate的鏈接,點擊後根據提示就完成了蘋果設備的證書安裝。此時你打開Safari訪問https的網站,就能看到解密的數據了。

但是此時如果切換apple id帳號,或者在app store下載軟件都會失敗,原因是apple的這些軟件運用了CertPinning技術。大意就是apple的這些軟件只接受自己的證書,其他證書一概不信任。這時就只有越獄的手機有辦法了,那就是使用SSL Kill Switch 2。由於手頭沒有越獄手機,如果有機會完成測試就再補充。


幾天后的進一步測試並沒有取得成功。使用的是iOS9.3.1的iPhone,使用盤古進行的越獄。此次越獄版本似乎不是很完善,表現在當我要裝一個命令行軟件的時候雖然安裝成功但是無法啟動,還有就是每次重啟都會失去越獄。按照Cydia的說明通過ssh可以順利進入iPhone,然後按照SSL Kill Switch 2的說明完成了安裝,但是Setting里並沒有出現啟用的開關。後來還嘗試修改wifi的mac地址,無論是nvram還是ifconfig都失敗了,可能是由於蘋果對系統的加強吧。

使用tcpdump來抓包

一般的HTTP請求,用Fiddler就OK了,不過遇到一個應用,它的請求時在打開了VPN後才連接的,於是祭出古器tcpdump。在cydia里搜索tcpdump安裝即可使用。獲取端口信息的ifconfig命令可在Cydia搜索Network Commands按裝之。

#-i指定端口,-w指定保存文件,-s設為0保存所有數據
tcpdump -i ppp0 -w trace.pcap -s 0
#端口不指定的話,wifi默認為en0,移動網絡是pdp_ip0,跟host可過濾域名或IP
tcpdump -w trace.pcap -s 0 host www.ip138.com
#過濾ip和請求類型
ip.addr eq 115.182.201.7 and http

本文更新於 2018/04/12。

分類
程序

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_unicode_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>
[code language="sql"]#先新建一張表
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

不使用 mysql_secure_installation 來初始化 MariaDB

sudo mysql -u root
#修改 root 密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_password';
#刪除匿名用戶
DELETE FROM mysql.user WHERE User='';
#禁止 root 用戶遠程登錄
DELETE FROM mysql.user WHERE User='root' AND Host!='localhost';
#刪除測試用表
DROP DATABASE IF EXISTS test;
#刷新權限
FLUSH PRIVILEGES;
#退出
EXIT;

本文更新於 2025/01/28。

分類
程序

豆瓣相册自动翻页

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

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

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

本文更新於 2016/10/20。