2013年01月11日

電源連動音楽プレーヤー

 自動車の運転中に音楽を流すのに、長いことWindowsCEベースのPDAを使い、GetSystemPowerStatusで給電が止まったらサスペンドする自作ソフトを走らせて、エンジンが止まったら再生が止まりエンジンを掛けたら止まったところから再開されるようにしていたのだが、そのPDAが壊れてしまった。もう古いアーキテクチャであるから、中古市場にも格安のWinCEベースのデバイスは出回っていないので、調達することもできない。
 そんな古いものをいつまでも使っていたのは理由があって、自動車内で普通のメモリプレーヤーを使おうとしても、これがなかなかうまくないからである。してほしいことは単純で、エンジン切ったら止まり、エンジン掛けたらそこから再生してくれればいいのであるが、電源が切れたら再生を中断するようなメモリプレーヤーは、全然ないのである。これでは車から降りるときいちいち停止ボタンを押さなくてはならない。当然のように押し忘れるので、再生位置をロストして悲しいことになる。
 じゃあというので、Androidのアプリでそういうものがないのかと探したが、探し方が悪いのか、あんなに山のようにアプリがあるのに、給電が切断されたら一時停止、という、ごく簡単な機能を持つプレーヤーのアプリがないのである(イヤホンジャックを抜くと一時停止、というのはある。VideoLAN for Androidとか。)
 
 こうなれば是非もない、ないのならば自分で作るほかあるまい、ということで、Android用の電源状態に連動する音楽プレーヤーアプリを作った。ごくシンプルなプレーヤーである。自動車内で触らずに音楽を流す、という用途しか考えていない。ボタンがやたらとデカいのは、運転席上での操作が前提だからである。

cap_jp_net_usost_einterlockplayer_free.png


 シガーソケットからUSBを取るやつと電源ケーブルをつないで再生して、エンジンを切ると給電がオンからオフになるので再生を停止する。エンジンを掛けるとオフからオンになるので再生を再開する。これで停止ボタン押し忘れの呪いから解放されるはずである。 
 せっかく作ったので、今回GooglePlayにデベロッパー登録してアプリを公開してみた。



 デベロッパー登録は、$25かかるのな。なんかでアプリで収益をあげて、せめて登録料分くらいは取り返したいものだが。
posted by usoinfo at 19:14 | Comment(1) | 開発 | このブログの読者になる | 更新情報をチェックする

PHPでそのホストで実行中のプロセス一覧を取得(Linux)

バックグラウンドで処理をさせていた時など、特定のコマンドやらpidやらのプロセスがあるかどうかを調べたい時があるので、ぱぱっと。
function Unix_GetPidArray()
{
$ret = array();
$cmd = "/bin/ps -e -o pid,args";
$fp = popen($cmd, "r");
while( ($line = fgets($fp)) != false ){
$line = ltrim($line);
$pos = strpos($line, " ");
$pid = intval(substr($line, 0, $pos));
$args = substr($line, $pos+1);
if( $pid <= 0 ) continue;
$ret[] = array(
'pid' => $pid,
'args' => $args,
);
}
fclose($fp);
return $ret;
}
実行結果例
$r	= Unix_GetPidArray();
echo var_dump($r);
--
Array
(
[0] => Array
(
[pid] => 1
[args] => /sbin/init
)
[1] => Array
(
[pid] => 2
[args] => [kthreadd]
)
[2] => Array
(
[pid] => 3
[args] => [migration/0]
)
[3] => Array
(
[pid] => 4
[args] => [ksoftirqd/0]
)
...略
ps -eを実行した結果をバラして格納しているだけである。/bin/ps -e -o pid,args を実行してみて、[プロセスID]半角スペース[コマンド....]の書式になればそのまま使用可能。違ったときは環境に合わせて$cmdを調整。
応用で、プロセスID(int値)を与えるとそのpidがあるかどうか(ps -ef|grep 1111|wc -l 的なもの)、文字列を与えるとその文字列を持つコマンドのプロセスIDを列挙(ps -ef|grep ahoaho 的なもの)の関数。
function Unix_IsPidExisted($pid)
{
$ret = false;
$cmd = "/bin/ps -e -o pid";
$fp = popen($cmd, "r");
while( ($line = fgets($fp)) != false ){
if( intval(trim($line)) === $pid ){
$ret = true;
break;
}
}
fclose($fp);
return $ret;
}

function Unix_GetPidStringMatched($str)
{
$ret = array();
$cmd = "/bin/ps -e -o pid,args";
$fp = popen($cmd, "r");
while( ($line = fgets($fp)) != false ){
if( strpos($line, $str) === FALSE ) continue;
$ret[] = intval(substr(ltrim($line), 0, strpos(ltrim($line), " ")));
}
fclose($fp);
return $ret;
}

/*
実行例:

$ret = Unix_IsPidExisted(4566);
// PID 4566 が存在すれば true が返る

$ret = Unix_GetPidStringMatched('httpd');
// args に httpd を含むPIDを列挙した配列が返る

*/

タグ:Linux PHP
posted by usoinfo at 09:28 | Comment(1) | 開発 | このブログの読者になる | 更新情報をチェックする

2012年11月11日

CygwinのシェルスクリプトをWindowsのショートカットで実行

Cygwinで作成したシェルスクリプトをショートカット化してデスクトップ等に置きたい時に。
シェルのexeのlnkを作成して引数でスクリプトを与えるとできる。

  1. ショートカットの元は、Cygwinのbinの下のsh.exe(又はその他のシェルのexe)
  2. プロパティで「リンク先」に、「exeファイルのパス シェルスクリプトのパス」を書く
  3. シェルスクリプトのパスは /cygdrive/... で書き、スペースを含むなら"で囲む
  4. シェルスクリプト中のコマンド名でWindowsのコマンドとかぶるものはフルパスで指定する(findとか)
こんな感じで。
dump20121111-01.png
タグ:cygwin
posted by usoinfo at 08:32 | Comment(0) | Windows | このブログの読者になる | 更新情報をチェックする

2012年11月08日

指定ディレクトリ以下の特定のファイルを全てchmod/chown

いつも忘れてしまうのでメモ。
指定ディレクトリ以下の特定のファイルを全てchmodしたりchownしたりする。
find ./ -name \*.phps -type f -exec chmod 664 {} \;
posted by usoinfo at 06:43 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2012年09月05日

mod_rewriteのRewriteMapでPHPのプログラムを使う

 現代の黒魔術、mod_rewriteは万能である。
 正規表現と置換だけでも万能だが、更に黒い魔術として、入力をユーザー独自のプログラムに渡して書き換えることができる、RewriteMapというのがある。

 厳密には、RewriteMapは独自プログラムに渡すと言うよりは、マップテーブルを用意しておいてそこから選ぶもので、その拡張機能としてプログラムに渡すというものがあるのだろう。まあ来歴はどうでもいいが、これを使うと正規表現では書けないような妙ちきりんな書き換えもできる。例えばUTF-8エンコードされたクエリーをデコードしてSJISに変えてまたエンコードしたものにする、とか、特定のファイルが存在していたら書き換え、とか。

 まず、Apacheのconfigファイルに例えばこのように書く。
RewriteEngine on
RewriteLock /tmp/rewritemap.lock
RewriteMap myprog prg:/usr/local/bin/url_rewriter.php
RewriteRule ^/rewrite/(.*)$ /test/${myprog:$1}
 RewriteLockはロックファイルの場所で、どこでも良い。但し、VirtualHostの中には置けないようなので、一番上に書く。
 "RewriteMap プログラム名 prg:プログラムのパス"で、プログラムの場所を指定し、RewriteRule中の ${プログラム名:入力} が、プログラムによって置換される。
 
 さて、問題のプログラムである。
 どういう仕組みになっているかと言うと、mod_rewrite側は標準入力に入力を入れてきて、プログラム側は標準出力に書き換え結果を出力する。のであるが、このプログラムは、Apacheの起動時に書き換え用のプロセスが1つ立ち上がり、プロセスはずっと走りっぱなしになっているのである。アクセス毎に起動されるわけではなく、プログラム中では、(一般的には)標準入力をブロッキングI/Oで読み続けるループにする必要があるのであった。
 従って例えば、url_rewriter.phpはこんな感じになる。
 
#!/usr/local/bin/php
<?php
$fin = fopen("php://stdin",'r');
while(!feof($fin)){
$read = fgets($fin);

$out = ここで$readに応じて書き換え処理...;

$fout = fopen("php://stdout",'w');
$out .= "\n";
fwrite($fout, $out);
fclose($fout);
}
fclose($fin);
// ※入出力はSTDINとechoを使ってもいいが、分かり易さでphp://とした。
?>
 mod_rewriteからは、stdinに入力内容+"\n"が来る。この入力をfgetsで取って、書き換えた結を"\n"で終端してstdoutに返す。終わったら次の入力に備える。と、こういう次第である。
posted by usoinfo at 21:13 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2012年08月10日

MySQLで既存のテーブルのCREATE文を取得

既存のデータベース/テーブルの、CREATE文を取得する方法。メモってたCREATE文をロストしたとか、他人の作ったテーブルで中身がよくわからん、と言った時に使えるかも。(mysqldump を --no-data で走らせてもいいけどな)

・既存のデータベース中にどんなテーブルがあるか調べる
SHOW TABLES で、データベース内のあるテーブル名のリストが取れる。
mysql> SHOW TABLES;
+------------------------------------------+
| Tables_in_usodb |
+------------------------------------------+
| attacker_ahoaho |
| abyorn_hogehoge |
:
+------------------------------------------+
206 rows in set (0.01 sec)

mysql>

・テーブルのCREATE文を取得する
SHOW CREATE TABLE (tbl_name) で、そのテーブルのCREATE文が取れる。
mysql> SHOW CREATE TABLE zenra_config\G
*************************** 1. row ***************************
Table: zenra_config
Create Table: CREATE TABLE `zenra_config` (
`zenraid` varchar(64) CHARACTER SET sjis COLLATE sjis_bin NOT NULL,
`title` varchar(512) CHARACTER SET sjis COLLATE sjis_bin DEFAULT NULL,
`text` mediumblob,
`remark` varchar(512) CHARACTER SET sjis COLLATE sjis_bin DEFAULT NULL,
PRIMARY KEY (`zenraid`),
CONSTRAINT `fk_znrcfg_aid` FOREIGN KEY (`zenraid`) REFERENCES `zenra_pri` (`zenraid`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=sjis
1 row in set (0.00 sec)

mysql>


・というわけで、この2つを使ってこんなスクリプトを書けば、データベース内のテーブルのCREATE文を浚ってくれる。
#!/bin/sh

# mysqlコマンドと引数
SCRIPT_MYSQL="mysql -p[YOUR_PASS] -u [YOUR_NAME] [YOUR_DB]"

# 出力ファイル
FILE_CREATES=tablecreatesql.txt

rm -f ${FILE_CREATES}

for t in `echo "SHOW TABLES" | ${SCRIPT_MYSQL}`
do
echo "SHOW CREATE TABLE $t\G" | ${SCRIPT_MYSQL} >> ${FILE_CREATES}
done
タグ:Linux MySQL
posted by usoinfo at 07:43 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2012年08月06日

ffmpegで複数の動画ファイルを1つにつなげる

 先日、やたらと安いドライブレコーダーを買ったのである。3000円くらいの、こんな感じのドライブレコーダーのうちのひとつである。性能も機能もお値段なりだが、エンジン掛けると勝手に録画開始、エンジン切ると勝手に録画終了なので、案外便利である。

 さて、そのドライブレコーダーはファイル循環式で、最長15分経つと、ファイルが切れて次のファイルに行くようになっている。つまり、まず PICT001.AVI が録画され、15分後に PICT002.AVI に移る、という具合で、1時間走れば4本、2時間走れば8本の動画ファイルができあがる。そこで、このファイルを1つに繋げたいところであるが、動画編集をするソフトを使えばすぐだが、ソフトを買ってまでするほどのことでもないし、編集ソフトでやるのはいちいち操作が必要で面倒。できればコマンドラインでやってしまいたい。
 そこで、フリーのFFmpegを使って、複数の動画ファイルを1つにコンカチする手順。いろいろと試行錯誤の末、次のような手順に落ち着いた。
 
 1. まず、単純結合可能なmpgコンテナに、データを変換する
 例: PICT001.AVI, PICT002.AVI, PICT003.AVI があるとして、
ffmpeg -y -i PICT001.AVI -sameq PICT001.mpg
ffmpeg -y -i PICT002.AVI -sameq PICT002.mpg
ffmpeg -y -i PICT003.AVI -sameq PICT003.mpg

 2. mpg に変換したファイルをつなげる
 Linuxの人は cat でどうぞ。
copy /b PICT*.mpg temp.mpg

 3. このままだとタイムスタンプがおかしいらしいので、修正する
 この状態だと、ファイルの再生時間長などが正しく表示されない(VideoLANなどで見てみると分かる)。次のオプションでもう一度変換すると、正しくなるようである。
ffmpeg -y -i temp.mpg -same_quant -dts_delta_threshold 1 PICTALL.mpg
 
 4. 結合した修正済みデータを、希望のエンコーダーで変換する
 そのまま使うなら別にこのままでもよいが、映像:Xvid 1200k 15fps、音声:mp3 64kbps の例。
ffmpeg -y -i PICTALL.mpg -vcodec libxvid -b:v 1200k -r 15 \
-acodec libmp3lame -ab 64 -ar 44100 \
PICTXVID.avi

 あとは、PHP For Windowsあたりを使ってスクリプトを書けば、D&Dで結合+再変換まで自動で処理できるようになる。
 続きを読む
posted by usoinfo at 06:25 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2012年06月18日

アマゾンで生ゴミ処理機を買ったら市役所がインターネットは信用できないから助成は受け付けられませんと言う。

 開発とは何の関係もなくて申し訳ないが、生活の話。

 私事であるが引っ越しをした。
 引っ越し先は大層な僻地であって、残念なことに、自治体のゴミ収集が来ない。厳密には、ゴミ収集所が(集落の人数が条例の規定値以下のために設置でき)ない。従って、ゴミは市の処理場まで自力で運ぶしかない。で、毎週毎週ゴミを結構な距離のある処理場まで運ぶのは骨が折れる。ある程度溜まったら運べばいいが、そうすると生ゴミの腐敗が問題である。以上から導かれる論理的帰結により、生ゴミ処理機を購入することにした。

 生ゴミ処理機の購入には、自治体の助成がある。処理機を使った結果排出されるゴミの量が低減され自治体の処理場の運用コストが低減するから、家庭での処理機の導入を援助しようという趣旨である。だいたいどこの自治体もそうであろう。ホームページで調べると、「詳しいことは役所に問い合わせろ」ということが書いてあるため、市役所の担当部局に行き申請書の用紙を貰うと、説明のパンフとかはなく、用紙だけをくれた。担当の係員の説明では、領収書の原本と、保証書のコピーを添えて、申請せよ、と言う。

 助成が出るとは言え、やはり安いところで買うのがいいし近所に手頃な電気屋もない(ゴミ収集もこないような僻地だからね)。念のため担当部局に電話して「購入する店舗に規制はありますか?」と訊いたら、どこで買ってもいいと言うので、アマゾンに注文した。で、自治体の補助を申請するため、Amazonの納品書兼領収書と保証書のコピーを持って市役所にいったら、「インターネットで買った物は受け付けられません」と、市役所の担当者が不可解なことを言うのである。「インターネットで買った物はダメって内規で決まってるんですよ」「以前の人も断ったから今回受け付けるというわけにも……」

 なんとおかしな話か!
 きょうび、アマゾンで家電を買うなんてごく一般的な市民の購買行動だろう。しかも、「どこで買ってもいい」と言ったくらいで、どこで買ってもいいはずなのに、アマゾンはインターネットだからダメだという。
 納得できないので理由を聞くと(責任者が後から電話をかけてきて説明されたのだが)、曰く、「インターネットで買ったものは販売店が信用できないからダメである」「保証書に販売店の記入がないのものは信用できない」「アマゾンさんに言って保証書に記入してもらえれば受け付ける」と言うのである。アマゾンは保証書への記入を納品書兼領収書を以て替えているので、保証書に記入はないが、納品書兼領収書原本があってなお、アマゾンが販売店として信用できない、、、と?

 ひどい話である。インターネット全否定アマゾン全否定である。なんてこった。
 困ったが、ごく普通のことをしていて助成がもらえないのも癪だし、俺以外に以降どこでもいいからと言ってアマゾンで買って助成がもらえない人が発生して欲しくもないので、アマゾンのカスタマーサービスに問い合わせ、市に助成を蹴られたんだけどこれこれこういうことを市が言うから保証書に貼るシールかなんかないの?と聞いた。だいたい、保証書への記入が即ち信用に足るかというと全くそんなことはなくて、無記入の保証書が手元に来てるわけだから、これに自分で勝手に書いてしまうことも可能であって、それを誰が書いたかを確かめる方法はないわけである。だって本当にちゃんと買っているので、店に「売りましたか?」と問い合わせたところで「正しく販売しました」という状態だからである。だから、保証書に記入があるかで販売店の信用を測るなんてのは何の意味もないことだと思うのだが、まあそれはこの際おいておく。
 とにかくアマゾンに問い合わせると、残念だけどシールはない(昔はあったけど今はないみたいだ)、納品書兼領収書がそれに代わる効力を持つからそれで申請して、ということである。だが、それではダメなので、「納品書兼領収書ではダメだっつーんだよ市役所」と言うと、信用できないと言われたっつーことなら店舗印入りの領収書を送るから、ということで、購入者の名前と、店舗印の入った領収書を作って貰った。
 
 んで、改めて、保証書と納品書兼領収書のコピーと、保証書への記入は納品書によって代えるのだというアマゾンの約款と、アマゾンの店舗印の入った領収書を持って市役所に行き、「これで販売店が信用できないと言うことはないでしょ?」といって、申請は受理、つまりアマゾンは販売店として認められたのであった。

 インターネットだから信用できない、なんて、やっぱりどうしても納得できないよな。どうなってんだ、市役所。
 
posted by usoinfo at 16:55 | Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2012年02月19日

PHPで Google Static Maps API のポリラインエンコード

 Google MapのAPIに、Google Static Maps APIというものがある。データを埋め込みにして、静的な地図を生成するものである(static mapだから当然だが)。このAPIでも、地図上に直線(パス)を引けるのだが、線を引くためのデータはURL中に埋め込む(GETメソッドで引き渡す)ので、含められるパスのポイント数には上限がある。
 で、渡せるポイント数を多くするため?に、Googleがポリラインエンコード(http://code.google.com/intl/ja/apis/maps/documentation/utilities/polylinealgorithm.html)という方法を提供している。ざっくり言うと差分値をエンコードして並べ、クエリ文字数を短縮しようというようなことである。
 
 どんなものかは上記URLの先にあるドキュメントに書いてある。しかも結構丁寧に書いてあるのでわかりやすい。ここまで丁寧にしてくれるなら、いっそサンプルコードかライブラリを提供してくれればいいのにな、とも思わなくもない。

 ということで、ポリラインエンコードをするコードを作っていたので、サンプルを貼っておくと誰かがコピペで使えるのではないか、と。(サンプルソースのファイルはこちら。中身はいっしょ。)
// 配列に入った緯度経度をポリラインエンコードする
// 1つのポイントは array(緯度10進数,経度10進数) の形式
// ポイントを array( ポイント, ポイント, ... ) で列挙
function latlon2GooglePolyline($data)
{
$plat = false; // 1つ前の緯度
$plon = false; // 1つ前の経度

foreach($data as $point){
// 初回以外は差分を取る
$lat = $plat !== false ? $point[0] - $plat : $point[0];
$lon = $plon !== false ? $point[1] - $plon : $point[1];

// 緯度と経度をポリラインエンコードしてクエリに追加
$query .= GooglePolyline_Encode($lat).GooglePolyline_Encode($lon);

$plat = $point[0];
$plon = $point[1];
}

return $query;
}

// 単体の緯度または経度をポリラインエンコードする
// 入力値 $value は10進数の緯度または経度
function GooglePolyline_Encode($value)
{
$value = ($value * pow(10,5)) << 1; // ステップ2,3,4: 10^5を掛け左1ビットシフト
if( $value < 0 ) $value = ~$value; // ステップ5: 元の数値が負の時はビット反転

//ステップ6,7: 下位から5ビットずつ切り出す(逆順になる)
for($i=0;$i<6;$i++){
$arr[$i] = $value & 0x0000001F;
$value = $value >> 5;
}

// 不要なバイトを取り除く(上位で0が続く間そのバイトは除去、但し0の時は1バイト残す)
while( $arr[ count($arr)-1 ] === 0 && count($arr) > 1 ){
array_pop($arr);
}

//ステップ8: 最下位バイト以外に後続ビットを立てる(0x20論理和を加算)
for($i=0;$i<count($arr)-1;$i++){
$arr[$i] |= 0x20;
}

//ステップ9,10,11: 各バイトに63を加算してASCII文字に変換
$ret = '';
for($i=0;$i<count($arr);$i++){
$ret .= chr($arr[$i]+63);
}
return $ret;
}

// テスト用データ・山手線各駅の緯度経度
$data = array(
array(35.619772,139.728439),
array(35.625974,139.723822),
array(35.633923,139.715775),
array(35.646685,139.710070),
array(35.658871,139.701238),
array(35.670646,139.702592),
array(35.683061,139.702042),
array(35.689729,139.700464),
array(35.700875,139.700261),
array(35.712677,139.703715),
array(35.720476,139.706228),
array(35.730256,139.711086),
array(35.731586,139.728885),
array(35.733445,139.739303),
array(35.736825,139.748053),
array(35.737781,139.761229),
array(35.731954,139.766857),
array(35.727908,139.771287),
array(35.721484,139.778015),
array(35.713790,139.777043),
array(35.707282,139.774727),
array(35.698547,139.773091),
array(35.691173,139.770641),
array(35.681391,139.766103),
array(35.675441,139.763806),
array(35.666151,139.758654),
array(35.655391,139.757135),
array(35.645736,139.747575),
array(35.628760,139.738999),
array(35.619772,139.728439)
);

// テスト用データをポリラインエンコードしてURLを出力(実際は改行は入っていない)
echo "http://maps.google.com/maps/api/staticmap?sensor=false&
size=640x640&maptype=roadmap&path=color:0x0000ffFF%7Cweight:
5%7Cenc:".latlon2GooglePolyline($data)."\n";
 実行すると、こんな感じで出力される(実際は改行は入っていない)。
$ php polylineencode.php
http://maps.google.com/maps/api/staticmap?sensor=false&size=640x640&maptype=roadmap&
path=color:0x0000ffFF%7Cweight:5%7Cenc:q~kxEuuysYwe@x[sp@fq@wnArb@ckAdv@qhAmGqlAlBsh
@xHsdAf@whAqTuo@uNa|@i]iGenBqJa`AaTsu@}DiqAjc@cb@fXuZbg@_i@`o@`Erg@lMpu@dI`m@fNb|@h[
bd@hM`y@d_@dbAlHh{@tz@`iBpt@bw@|`A
 このままIMGタグに張り込むと、こうなる(クリックで原寸)。


 というわけで、Usoinfo GPSログトレースマップ緯度経度トレースマップを、Google Mapsに対応。地形図とか航空写真をプロットしてみると、これはこれでなかなか面白い。
posted by usoinfo at 13:44 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2012年02月18日

PHPでデータのバイナリダンプを見る

なんてことはないコード集。PHPで変数の中身をバイナリダンプする。

function binary_dump($in)
{
$bindata = unpack("C*", $in );
$ret = "";
foreach($bindata as $v){
$ret .= sprintf("%02x ",$v);
}
return $ret;
}
pack()でunsigned charで分割して配列に格納し、端から出力しているだけである。
マルチバイト出力例。
$sjis	= "バイナリダンプ";
$utf8 = mb_convert_encoding($sjis,"UTF-8","SJIS");
echo "SJIS:".binary_dump($sjis)."\r\n";
echo "UTF8:".binary_dump($utf8)."\r\n";

$ php dump.php
SJIS:83 6f 83 43 83 69 83 8a 83 5f 83 93 83 76
UTF8:e3 83 90 e3 82 a4 e3 83 8a e3 83 aa e3 83 80 e3 83 b3 e3 83 97

タグ:PHP
posted by usoinfo at 10:54 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする