braintag

公開してしまう備忘録

ファイル名からタイムスタンプを変更するソフトウェア

前回ファイル名からタイムスタンプを変更するpythonスクリプト - braintag
、ファイル名からタイムスタンプを変更するpythonスクリプトを書いてみたが、やっぱり、
いちいち、フォルダ毎に行うのが面倒になったので、Windowsアプリとして作ってみました。

はてなブログはファイルの置き場所が無いので、Vectorに登録してみました。以下がそのURLです。

www.vector.co.jp


以下紹介文

ファイル名にある日付情報をタイムスタンプに反映するツールです。
先頭がyyyymmddhhmmssになっているか、それぞれの日付情報が何らかの文字で区切られていれば認識します。
(ただし、すべて半角)
秒情報はあってもなくても認識します。

ビデオで撮った動画ファイルのタイムスタンプが、PCに取り込んだときの日時になってしまうため、Googleフォトにバックアップすると、表示上、正しい日付になりません。そのため、このツールを作りました。

ファイル名からタイムスタンプを変更するpythonスクリプト

Google フォトに保存してある動画の日付がおかしい。
少しづつズレている。

ちょっと調べてみると、Googleフォトで表示される日時はあくまでもファイルの更新日時らしい。
そのため、動画を取り込んだ日時が、Googleフォトで表示される日時になってしまう。

これをどうにか、動画を記録した日時=Googleフォトの日時にしたい。

ファイル名には録画した日付が入っているので、これを、タイムスタンプに反映すれば良いのだけれども、
ファイル名からタイムスタンプに反映するフリーソフトが見つからない。

しょうがないので作ってみた。

ファイル名からタイムスタンプを変更するpythonスクリプト(python3.6で動作確認済み)

#coding:utf-8
import sys
import os
import re
import glob
import time
from datetime import datetime

print ("filename2timestamp")
print (os.getcwd())

pattern = r"^(\d{4})[^\d]*(\d{1,2})[^\d]*(\d{1,2})[^\d]*(\d{1,2})[^\d]*(\d{1,2})(?:[^\d]*(\d{1,2})){0,1}"

for x in glob.glob("*.*"):
sys.stdout.write(x + " -> ")
matchOB = re.match(pattern , x)
if matchOB:
atime = mtime = time.mktime*1,int(matchOB.group(2)),int(matchOB.group(3)),int(matchOB.group(4)),int(matchOB.group(5)),int(matchOB.group(6)), 0, 0, -1))
os.utime(x, (atime, mtime))
print (datetime.fromtimestamp(os.stat(x).st_mtime))
else:
print ("unmatch")

これを保存し、動画があるローカルのディレクトリで実行すれば、ファイル名にある日付情報がファイルの更新日時、アクセス日時に反映される。
ファイル名の形式は、なんらかの文字で区切ってあれば認識される。
数値のみであれば、"20130901110202"という風に、ちゃんと4桁、2桁で別れていればOK。

実際やってみるとフォルダたくさんあって面倒くさいのでアプリ化しようかなぁ。

*1:int(matchOB.group(1

raspberry pi2 のファン付きケースを ebayで買った

Raspberry pi2 を購入し、旧モデルと入れ替え完了。
しかし、ケースに互換性がなかったので、ケースを物色。

でも、Amazonやら楽天やらの日本のサイトにはいいのがない。あったとしても高い。

eBayを見てみると、送料込みでも1000円行かないのがあった。www.ebay.com
$4.99、送料$2.99で約$8だ。960円程度。

ファン付きでこのお値段。なんでこれが日本で売ってないの?

早速、paypalで支払い購入。

約一週間で届いた。


f:id:kiwamaru:20150322172129j:plain

アクリルパネルがなんかやたら曇ってるなーと思いながら組み立ててたら保護シートだった。うっかりそのまま組むところだった。

f:id:kiwamaru:20150322172303j:plain

なんか、組むのがかなり難しい。やたらと面倒くさい。
スペーサをアクリルと基板の間に挟み、4か所をボルトを止めるんだが、
4か所のネジは1つずつ締めることができないため、4か所を同時に保持しないといけない。

f:id:kiwamaru:20150322175046j:plain

簡単な説明書はついてんるんだけど、ボルトの用途、止め方等は一切書いておらず、中華クオリティだなぁと感じながら組み立て。

f:id:kiwamaru:20150322172140j:plain

f:id:kiwamaru:20150322175405j:plain

ちなみに、付属のファンのコネクタは、raspberry pi2のピンの幅と微妙にサイズが異なり、すこしピンが曲がる。
f:id:kiwamaru:20150322175850j:plain

最初、ファンを中にいれてみたが、ヒートシンクと干渉して入らず。クソッ。

f:id:kiwamaru:20150322180102j:plain

仕方ないので外に。吸気方向に設置。

f:id:kiwamaru:20150322180729j:plain

温度についてはかなり下がった。室温22℃でRaspiのCPU温度は常に28℃をキープ。
ファンなしだと40℃。その差、12℃。
かなり冷える。

でも、高音のノイズが結構気になる。
回転数を落とせないものかな。


ファンのノイズについては、動画撮ってみたので聞いてみてください。

Sublime Text3でC言語で呼んだり呼ばれたりリストからジャンプする(Windows)

今、C言語にて開発していますが、今使ってるIDEのエディタが非常に使いづらいです。
定義や行番号へのジャンプ後、戻れないゴミエディタ。

Eclipseでのコーディングも考えましたが重いのは嫌なのでSublime Text3を使ってみようと思います。

コードを読むにはタグジャンプが最低限必要です。
デフォルトではgoto_definitionてのはありましたが、関数の定義にしか使用できませんでした。

変数でもジャンプしたいなぁとぐぐってみるとSublimeClangというのもありましたがディスコンとなっており、ST3上では何やっても動作しませんでした。

諦めてCTagsを試したのですが、定義にしかジャンプできない。
どうせなら読んだり呼ばれたりのリストにも飛びたいなあと。
(grepでいいじゃんという話もありますが意外と面倒くさい)

更にググるとCscopeSublimeというのがあるので試したところ、これで実現できました。

以下のFork版の方がSublimeText3のメニューからデータベースを作れるので便利です。


ChinaShrimp/CscopeSublime · GitHub

で、手順なのですが、以下の公式の手順通りやっても動作しませんでした。
Windowsだからなのかな?手順5が追加で必要でした。

1.cscope-win32をインストール
cscope-win32 - Win32 port of cscope utilty - Google Project Hosting

2.cscope-win32へのパスを通す(環境変数)

3.Generate a cscope database (cscope.out) //これは上記版なのでパス

4."Packages"ディレクトリにgit clone

以下の手順5を追加することで動作するようになりました。
5."Setting User"に"CscopeSublime_executable": "C:\\Program Files\\cscope\\cscope",を追加。
"C:\\Program Files\\cscope\\cscope"はcscopeのインストールパス

調べたいものの上でCtrl+\を押すと以下の様なメニューが出るようになりました。
f:id:kiwamaru:20140918093113p:plain
でも、何故かメニューが二重に出てしまう。

Raspberry PI 高精度I2C温度センサーMCP9808で温度を記録

Raspberry PIを買って以来、Linuxサーバとしてしか使用していないので、
電子工作っぽいことをしたくなり、I2Cの温度センサーで温度を記録するプログラムを作ることにしました。

Raspberry Pi Model B+ (Plus)

Raspberry Pi Model B+ (Plus)


とりあえず、安くて精度も高い(±0.25%,最大±0.5%)高精度I2C温度センサーMCP9808を
スイッチサイエンスで購入しました。

とりあえずMCP9808とピンをハンダ付けしておきます。
f:id:kiwamaru:20140813103859j:plain

・VDDとRaspiの1番(3.3V)
GNDとRaspiの6番(GND)
・SDAとRaspiの3番
・SCLとRaspiの5番
につなげます。
f:id:kiwamaru:20140813103750j:plain
写真を見ると変な繋げ方になっていますが、単にメスメスのジャンパケーブルがなかっただけです。

ここからはRaspberry PIのコンソール上での作業

/etc/modulesを編集し、以下を追加

i2c-bcm2708
i2c-dev

/etc/modprobe.d/raspi-blacklist.confを編集し、i2c-bcm2708をコメントアウト

# blacklist spi and i2c by default (many users don't need them)

blacklist spi-bcm2708
#blacklist i2c-bcm2708

ここで一旦再起動。

sudo shutdown -r now


i2c-toolsと開発用のライブラリのインストール

#sudo apt-get install i2c-tools libi2c-dev

MCP9808のアドレスの確認

sudo i2cdetect -y 1
pi@raspberrypi ‾ $ sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- 18 -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

MCP9808のデータシートを見る
http://www.farnell.com/datasheets/1522173.pdf

5.1 Registersを見ると、温度を取得するには、

0101 = Temperature register (TA)

と書いてあるので、0x05(0b0101)を書き込めばいいことがわかります。

i2cgetを使用した簡単な温度の取得

pi@raspberrypi ‾ $ sudo /usr/sbin/i2cget -y 1 0x18 0x05 w
0xe4c1 <---結果

この結果をバイトスワップして、0x0FFFでマスクして、16で割ると、温度(摂氏)が出ます。(マイナスの場合はMSBの4bit目が符号)

上の結果、0xe4c1の場合、
1.バイトスワップ 0xc1e4
2.0x0FFFでマスク 0x01e4
3.16で割る 0x01e4 / 16 = 30℃

C言語で書くとこうです。ちなみに、sudoで実行しないと読めません。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

#include <linux/i2c-dev.h> // I2C用インクルード
#include <fcntl.h>
#include <sys/ioctl.h>

int main(int argc, char **argv)
{
    char *i2cFileName = "/dev/i2c-1";
    const unsigned char i2cAddress = 0x18;
    const __u8 t_reg = 0x05;
    int i2c_fd;

    if((i2c_fd = open(i2cFileName,O_RDWR)) < 0){
        fprintf(stderr,"Faild to open i2c port¥n");
        return 1;
    }
    if (ioctl(i2c_fd, I2C_SLAVE,i2cAddress) < 0) {
        fprintf(stderr,"Unable to get bus access to talk to slave¥n");
        return 1;
    }
    __s32 res = i2c_smbus_read_word_data(i2c_fd,t_reg);
    if(res < 0){
        fprintf(stderr,"Error i2c_smbus_read_word_data()¥n");
        return 1;
    }
    float temp;
    {
        __u16 t = res << 8 | res >> 8;//byte swap
        temp = t & 0x0FFF;      //mask
        temp /= 16;
        if(t & 0x1000){                 //sign or unsigned
            temp -= 256;
    	}
	}

    time_t t;
    time(&t);
    struct tm *m;
    m = localtime(&t);

    printf("%d/%d/%d-%d:%d:%d,%.2f¥n",m->tm_year+1900,m->tm_mon+1,m->tm_mday,m->tm_hour,m->tm_min,m->tm_sec,temp);

    return 0;
}

cronで10分毎に記録する

*/10 * * * * cd /home/pi/templogger;sudo ./templogger 2>&1 1>>temp.csv | logger -t templogger

※ログのローテーションとか考えてないです。エラーはsyslog行き。

約一日間、記録を取った結果はこんな感じ。
f:id:kiwamaru:20140819135452p:plain
急激に温度が下がってる部分は、エアコン付けたからです。
上がってる部分は、おそらく、TV録画のためPCが稼働しているからです。

参考:http://www.raspberrypi.org/forums/viewtopic.php?t=40831&p=540457
参考:http://openrtm.org/openrtm/ja/content/pirt-unit_with_i2cdevices

OneNote2013でサインイン出来ない現象の解消

無料になったOneNote2013を試しにインストールしたところ、「サインインしてください」というダイアログが延々と出続け、出てちっとも進まない現象に遭遇した。

日本語ではググっても一件も引っかからなかった。

ここに同じ情報があり、対策方法も載っている。
2011年から今の今まで放置されているバグのようだ。原因も不明。

http://social.msdn.microsoft.com/Forums/office/en-US/4b877cc1-e5f3-40b7-abb5-fb4b94885a74/cant-sign-in-to-windows-live-via-onenote-on-my-laptop-to-share-my-notebooks-why-does-it-just-keep?forum=olbasics

1.OneNote2013は終了しておく
2.IEOneNote Onlineにサインイン
3.OneNoteOnlineで新しいページを作成
4.OneNoteOnlineの上の方にある、ONENOTEで開くをクリックf:id:kiwamaru:20140418100904p:plain
5.OneNote2013が起動する


以上

OpenProjファイル(*.Pod)が開けなくなる現象の解消

ガントチャート作成に訳あってというか金がなくてMS Projectじゃなく、OpenProjを使っています。
OpenProj入門―Microsoft Project対応

たまにpodファイルが開けなくなることがあり、OpenProjの使用を中止しなければならないなぁと思ってましたが、どうやらJAVA7との相性が悪いようです。

OpenProjインストールフォルダの
"OpenProj1.4.0.ini"ファイルを開いて、以下の箇所を1.6までに変更します。

[Java Runtime Environment]
;Maximum Version=1.6

これで開けるようになります。

2014/07/11 追記
OpenProjは捨てて、後継ソフトのProjectLibreを使用するのがおすすめ。
http://www.projectlibre.org/