体調の変化を可視化する~うつ日記の活用~
体調は良くはなっているものの、波があって、朝起きてみたら調子が悪くて起き上がれないって時もたまにあります。
突然動けなくなるのって、困りものです。
うつ日記にデータもたまってきたことですし、体調の変化を分析してみたいと思います。
○活用できそうなデータ
うつ日記を使って体調を記録することで残るデータと、普段のつぶやきや日記などSNSに残っているデータ、そのほかには仕事のスケジュールなどのデータが活用できるかと思います。
・毎日の体調の記録(うつ日記)
・その日ごとの活動具合や活動内容など(うつ日記)
・天候の情報(うつ日記)
・処方されている薬の種類と量(うつ日記)
・つぶやきや日記などの内容(SNS)
・必要があれば業務内容なども(仕事のスケジュールなど)
ちなみに、うつ日記では、以下のような感じで、体調を記録します。
天候は、体調を記録した時に自動的に記録されます。
たまったデータをCSV形式で表示する機能がありますので、それをコピーペーストしてパソコンで処理することにしました。
○体調の可視化
調子の良い悪いがどういう傾向で変化しているか見てみることにしました。
処方の量も安定し、復職した後の3月1日から、7月11日までの期間でグラフにしてみた。
上に行くほど体調が良く、下に行くほど体調が悪いことを表します。
左端が3月1日、右端が7月11日です。
こうしてみると、周期的に体調が変化しているようにも見えます。
4つの深い谷の間を数えてみると、ほとんど正確に18日周期になってることがわかりました。
理由はわかりませんが、周期性があるのなら、予測もできるかもしれません。
ということで、次回は予測を試してみることにします。
慣性。
ドップラー効果とミニ四駆
かなり無理矢理感があるけど、走ればO.K.!
AVCHD(.MTSファイル)から日時字幕入りのDVDを作成する。
○はじめに
記録としてビデオカメラで撮影した動画を、DVDにして残したりする場合、撮影した日時も残したいんだけど、単純には出来なくて、苦労したので、方法をまとめておきます。
ちなみに、DVテープの頃は、WindowsならArea61 DVビデオタイマ、Linuxならkinoというソフトを使えば動画に日時を埋め込むことができました。
MTS(AVCHD)ファイルでも、一旦DV形式やAVI形式に変換して、同じ方法を使うという事も考えられますが、MTSファイルから変換したデータには、DVテープから取り出したデータのように日時情報が入っていないらしく、うまくいきませんでした。
それで、MTSファイルに残っている時間情報を利用して、字幕を付ける手順をまとめます。
○手順
今回は、日時の情報を字幕としてDVDに入れることにしました。
色々試した結果、Linuxのフリーソフトだけでできるようになりました。
全体の流れは以下の通りです。
①MTSファイルをビデオカメラからパソコンへコピーする
②perlスクリプトにより、字幕ファイル(srt形式)を作成する
③catコマンドで、動画ファイルを連結する
④DeVeDeを使って、字幕入りのVOBファイルを作成する
LinuxはUbuntu 14.04を使用しました。
○事前準備
「Image::ExifTool」というライブラリをインストールすることで、perlでMTSファイルから日時情報を取得することが、できるようになります。
Ubuntuの場合は、Ubuntuソフトウェアセンターで、「Image::ExifTool」と入力して検索すると、「libimage-exiftool-perl」というのがヒットするので、これをインストールすると使えるようになります。
○字幕ファイルの作成
・srt形式について
字幕ファイルには、いくつか種類があるようだが、srt形式ならテキストファイルなので、perlで作成することができます。
srt形式では、以下のように字幕を記述するらしいです。
最初に、字幕の通し番号
次の行に、字幕を表示させる時間(開始時間 --> 終了時間)
更に次の行に、表示させる内容
例えば、以下のように書くと、最初から1秒間「2012/06/03 16:12:12」という字幕を表示する。
1
00:00:00,000 --> 00:00:01,000
2012/06/03 16:12:12
これを、1単位として、改行を入れて、繰り返せば指定した時間で字幕を入れ替えることができます。
日時を1秒単位で表示したい場合には、上記のセットを1秒単位で作成すれば良いことになります。
・perlスクリプト
以下に、今回作成した字幕ファイルを作成するスクリプトを示します。
#!/usr/bin/perl
use Image::ExifTool qw(:Public);
$dirname = "63/STREAM";
opendir(DIR, $dirname);
@file_tmp = readdir(DIR);
closedir(DIR);
@file = sort(@file_tmp);
$count_all = 1;
$ins_time1 = "00:00:00";
#$ins_time2 = "00:00:01";
$ins_time2 = "00:00:05";
$i = 0;
foreach $file(@file){
if($file =~ /[0-9]+.MTS/){
$info = ImageInfo("$dirname/$file");
$DateTimeOriginal = $info->{'DateTimeOriginal'};
$FileModifyDate = $info->{'FileModifyDate'};
$end_time = &count_time($DateTimeOriginal, $FileModifyDate);
if($i == 0){
$end_time -= 35;
}
for($count = 0; $count < $end_time; $count += 5){
$print_time = &print_time($DateTimeOriginal, $count);
print "$count_all\n$ins_time1,001 --> $ins_time2,000\n $print_time\n\n";
$ins_time1 = &ins_time($ins_time1);
$ins_time2 = &ins_time($ins_time1);
$count_all++;
}
$i++;
}
}
sub count_time{
my $start_time = $_[0];
my $end_time = $_[1];
my $year;
my $month;
my $date1;
my $date2;
my $time;
my $minute;
my $sec;
my $output;
my $start_time_2;
my $end_time_2;
if($start_time =~ /([0-9]+):([0-9]+):([0-9]+) ([0-9]+):([0-9]+):([0-9]+)\+/){
$year = $1;
$month = $2;
$date1 = $3;
$time = $4;
$minute = $5;
$sec = $6;
$start_time_2 = ($time * 60 + $minute) * 60 + $sec;
}
if($end_time =~ /([0-9]+):([0-9]+):([0-9]+) ([0-9]+):([0-9]+):([0-9]+)\+/){
$date2 = $3;
$time = $4;
$minute = $5;
$sec = $6;
$end_time_2 = ($time * 60 + $minute) * 60 + $sec;
}
$output = $end_time_2 - $start_time_2;
if($date1 != $date2){
$output += 24 * 60 * 60;
}
return($output);
}
sub print_time{
my $start_time = $_[0];
my $count = $_[1];
my $month;
my $date1;
my $date2;
my $time;
my $minute;
my $sec;
my $output;
if($start_time =~ /([0-9]+):([0-9]+):([0-9]+) ([0-9]+):([0-9]+):([0-9]+)/){
$year = $1;
$month = $2;
$date = $3;
$time = $4;
$minute = $5;
$sec = $6;
$sec += $count;
while($sec >= 60){
$sec -= 60;
$minute++;
}
while($minute >= 60){
$minute -= 60;
$time++;
}
while($time >= 24){
$time -= 24;
$date++;
}
}
if($sec =~ /[0-9][0-9][0-9]/){
print "err:$sec\n";
exit;
}
#秒単位
$output = sprintf("%d/%02d/%02d\n %02d:%02d", $year, $month, $date, $time, $minute);
return($output);
}
sub ins_time{
my $ins_time = $_[0];
my $time;
my $minute;
my $sec;
my $output;
if($ins_time =~ /([0-9]+):([0-9]+):([0-9]+)/){
$time = $1;
$minute = $2;
$sec = $3;
$sec += 5;
if($sec >= 60){
$sec -= 60;
$minute++;
}
if($minute >= 60){
$minute -= 60;
$time++;
}
}
$output = sprintf("%02d:%02d:%02d", $time, $minute, $sec);
return($output);
}
・perlスクリプトの使い方
まず、上記のスクリプトをファイルに保存します。
改行コードは「lf」にしておきます。
$dirnameにMTSファイルが置いてあるディレクトリを指定します。
以下のように書いた場合には、「52/STREAM」というディレクトリの下にあるMTSファイルを探して、そのファイルの情報を取得します。
$dirname = "52/STREAM";
字幕の情報は、標準出力に吐き出すので、例えば、スクリプトを「make_srt.pl」という名前で保存して、「test.srt」という名前の字幕ファイルを作成する場合には、以下のようにしてファイルに保存します。
perl make_srt.pl > test.srt
○catコマンドで、動画ファイルを連結する
MTSファイルが複数ある場合、1つ1つに対して、srtファイルを作成して、設定しても良いですが、ファイル数が多いと設定がめんどくさいので、1つにまとめてから扱うことにしました。
MTSファイルといえど、連結は簡単で、Linuxのコマンドで、以下のような感じでできます。
cat 52/STREAM/*.MTS > 52.MTS
○DeVeDeで字幕ファイルとして読み込む
作成したsrtファイルとMTSファイルを組み合わせてDVDを作成します。
DeVeDeを開いて、右側の方のプロパティをクリックします。
すると、以下のようなウインドゥが開きます。
ここで、一番上のFileのところにMTSファイルを指定します。
次に、真ん中より下の辺りのSubtitlesのところに作成したsrtファイルを指定します。
後は普通に作成すれば、撮影日時が字幕として入ったDVDが完成します。
デフォルトで字幕を表示させるかどうかも、DeVeDeで設定できたと思います。
○残っている課題
一応、日時字幕入りのDVDを作成することはできますが、以下のような課題が残っています。
・字幕のズレ
今回作成したDVDでは、動画の場面の切り替わりから、1〜4秒程度字幕の切り替わりが遅れるという現象が見られました。
字幕の秒単位なのに対して、動画はもっと細かい単位で切り替わるので、ズレが生じるのかもしれません。
今回できたのを見る限りでは、ズレは累積はしていない様なので、大きな問題ではないかという事にしましたが、まだ改良の余地が有ると思われます。
うつ日記 ~うつを克服するための日記~
https:/
天気の情報を取得する~Androidアプリの作り方~
スマートフォンのセンサと、Webに公開されている情報を利用するひとつの例として、位置情報を取得してその位置に対応する天気の情報を取得する方法についてまとめてみました。
位置情報の取得は、以下のページを参考にすれば、それほど問題なく出来ました。
Android 位置情報を取得するには / Getting Started | Tech Booster
天気の情報は、OpenWeatherMapというところで提供しているAPIを使わせて頂くことにしました。
OpenWeatherMap current weather and forecast
APIのライセンスについては、以下のページに書いてありますが、クリエイティブ・コモンズ・ライセンスの中の、「cc-by-sa」というものだそうです。
このライセンスについて、以下に解説がありますが、使用する場合に「OpenWeatherMap」から提供されたデータを使っているというのを表示して、リンクを付ければ良いようです。
Creative Commons — 表示 - 継承 2.1 日本 — CC BY-SA 2.1 JP
具体的になんて書くのが良いのか迷いましたが、結局ありがちな感じで、「Powered by OpenWeatherMap」と入れることにしました。
アプリからのリンクのはり方ですが、別のAtcivityへ移る時と同じようにonClickLintnerを使って、以下のようにすれば、出来ました。
OnClickListener link_Listener = new OnClickListener() {
public void onClick(View v) {
Uri uri = Uri.parse("http://openweathermap.org/");
Intent i = new Intent(Intent.ACTION_VIEW,uri);
startActivity(i);
}
};
これを応用して、緯度と経度をgoogleMapに渡して表示させるというのも、こんな感じで出来ました。
OnClickListener map_Listener = new OnClickListener() {
public void onClick(View v) {
TextView data1 = (TextView)findViewById(2000);
TextView data2 = (TextView)findViewById(4000);
Uri uri = Uri.parse("http://maps.google.com/maps?q=" + data1.getText().toString() + "," + data2.getText().toString());
Intent i = new Intent(Intent.ACTION_VIEW,uri);
startActivity(i);
}
};
※緯度と経度が、2000と4000のIDのTextViewに書かれている場合の例です。
OpenWeatherMapから取得できるデータは天気のデータだけでも色々あります。
形式もJASON形式とXML形式があります。
例えば、以下のようなにすれば、データを取得できます。
// 緯度の取得
double latitude = location.getLatitude();
// 経度の取得
double longitude = location.getLongitude();
String requestURL = "http://api.openweathermap.org/data/2.5/weather?lat=" + String.valueOf(latitude) + "&lon=" + String.valueOf(longitude) + "&mode=xml";
URL url;
try {
url = new URL(requestURL);
InputStream is = url.openConnection().getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
StringBuilder sb = new StringBuilder();
String line;
while (null != (line = reader.readLine())) {
sb.append(line.replace(BR, ""));
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
として、sb.toString();を参照することで、データを取得できます。
JavaのクラスでJASON形式のハンドリングを試みましたが、うまくいかなかったので、今回はXML形式を使うことにしました。
XML形式といっても複雑な構造ではないので、タグをパターンでマッチングさせてやれば結構簡単にハンドリングできました。
本当はもっとちゃんとしたやり方があるはずですけど。
あとは表形式に変換してやると以下のような感じになりました。
私が使っているスマートフォンでは位置情報の精度が悪いみたいで結構離れた場所の天気をもらってくることもあるのですが、まぁ、天気なので実用上は問題ないかと思います。
最近はオープンデータが話題になっていますが、こんな感じで、WebAPIからデータを取得できたので、色々な応用ができるかもしれません。
天気によって、体調が左右されるというお話もよく聞きますので、天気を記録する機能をアプリに追加しました。
うつ日記 ~うつを克服するための日記~
https:/
ハードディスクを分解してみる。
パソコンなんかでデータを記録するために使われているハードディスク。
この中には、個人情報も含めて、見られたくない情報もたくさん記録されています。
普通はどうやって捨ててるんだろう?
ハードディスクが故障していない時は、データ消去用のソフトなんかで消せるけど、故障してしまうとそれもできないし、OSの起動に使っていたハードディスクは、別のOSを起動してから消去するなどちょっとめんどくさいです。
まぁ、故障して全てのデータが消えてくれるなら楽で良いのですが、故障の仕方にもよりますが、データが都合よく完全に消去されるようなようなケースは稀だと思います。
実際のところ、故障したハードディスクが悪意と技術を持った人の手に渡る確率はそんなに高くないと思いますので、被害にあうことはめったにないと思います。
でも、予めちゃんとデータを消しておく方が安心です。
というわけで、今回は、ハードディスクのデータを力技で消去してやろうというお話です。
前置きが長くなりましたが、要は、ハードディスクをバラバラに分解してやればデータを読み出すことはできまいということです。
それでは、早速分解します。
今回は、ノートパソコンに使われている2.5インチのハードディスクです。
これが、分解前のハードディスク。
ノートパソコンを裏返してネジをいくつか抜くと結構簡単に取り出すことができます。
ハードディスクの表側のネジを抜いて、蓋を取ったところ。
大抵、ネジがシールの下に隠れているので、注意です。
ネジはプラスドライバだけではなく、6角の星形のドライバが必要になる場合がほとんどです。
気密性を守るために蓋は本体にしっかりくっついているので、マイナスドライバなどでこじ開けます。
大きな円盤状のものが、データが書き込まれている部分です。
鏡のようにピッカピカです。
どうしても不安な方は、これさえ捨てなければ、情報が漏れることはありません。
円盤の脇にあるこれが、円盤上を動いてデータの読み書きをする部分。
この機械っぽさがなかなか良いでしょ?
そしてこれがネオジム磁石という強力な磁石です。
2.5インチハードディスクの場合は、3.5インチハードディスクに比べて、磁石が小さくて、磁力も弱いですが、それでも、結構強力で壁に何かを固定する時なんかに使えますよ。
鉄のものにくっつけるような場合は指を挟めたりしないように気をつけましょう。
さっきの円盤にこの磁石を擦りつけておけば、まずデータは破壊されるでしょう。
こんな感じで、情報漏洩が気になる方は、分解してみるのも面白いんじゃないでしょうか。
ペルツェ素子で水を冷やしてみた。
ペルツェ素子という、興味深いものがある。
数cm四方の板状の部品で、電気を流すと片面が熱くなり、もう片面が冷たくなるというもの。
素子単体では、千円程度で、小型の冷蔵庫なんかに応用されている。
以前に、物置用の冷房を作れないかと思って挑戦したんだけど、出力が弱過ぎて実用化できず、保管していた。
それが、先日会社で、先輩の荷物の片付けを手伝っていたら、なんかの記念品として作ったというアルミ製のコップをくれて、これはペルツェ素子で冷やすにはもってこいだと思い立って、再び実験を試みることにしたのだ。
○実験の目的
ペルツェ素子を使うことで、冷蔵庫を使わずに冷たい飲み物を飲むことができるか検証すること。
○実験装置
実験装置は、以下のようなもの。
ちょっと大きめだけど、パソコンやサーバのCPUに使うヒートパイプに、ペルツェ素子を付けて、その上に水が入ったコップを乗せただけ(右上)のシンプルなもの。
電源(左下)もパソコン用のもので、CPU用の12Vをペルツェ素子とヒートパイプのファンに供給するようにした。
以下の写真が、ペルツェ素子の拡大図で、白い板がペルツェ素子の本体。
ヒートパイプとペルツェ素子のあいだには、CPUのグリスを入れて固定している。
○実験方法
コップに、水100mlを入れてスイッチを入れて、水温と時間を計測する。
○実験結果
水温24℃、室温25℃で実験開始。
水温14℃までは、2分に1℃の割合で水温が低下。
そこから先は、5分に1℃の割合で水温が低下した。
水温が10℃まで下がった時点で実験終了。
○感想
以前に冷房に挑んだ時には、空気の温度は、20℃までも下げられなかったが、今回は水を、10℃まで冷やすことができた。
このことから、以前の実験では、ペルツェ素子と空気との間の熱交換がネックになっていたと推察される。
今回は、実験前には、ペルツェ素子とコップとの間の熱伝達がネックになるかと思っていたが、実験結果を見ると、これはたいした問題ではなかったようである。
こんなに簡単に冷えると思ってなかったから、コップは軽くゆすぐぐらいしかしてなかったけど、せっかく冷えたし体感しなくてはと思って、水を口に含んではみたものの、ちょっと飲み込むのは断念した。
ちゃんと洗っとけば良かった。
このような装置では、水を冷やす以上に、熱を逃がさないといけないので、気温が上がることになるし、水を冷やしたいなら氷を入れた方が早いんだけど、職場の机のなど、氷を手に入れにくい場所で、冷たい飲み物を飲みたい時には、使えるかもかもしれない。
職場に持って行って使ってたら、なんて言われるかな。
試してみたい気もするけど、それはまた別の実験と言うことで。