公的SSL証明書は,お高い

会社から,よく PC の設定など自分のメモを見るために,自分の blog へアクセスすることがある.
メモを会社から投稿することもある.
でも,ちょっと情報セキュリティに気を使う会社なら投稿内容の監視くらいはしていそうなので,
SSL 通信で投稿内容を暗号化したいなーとか思ったのでした.

SSL の証明書って,たっけーのね…
最大手 VeriSign の場合,最安で 85,050 円とか,泣ける.
で,安いとこないかなーと探したら,こんなトコがありました → サイフにやさしいSSL証明書
2,880 円~ とか.びっみょー.
オレオレ証明書もいいけど,どうせなら第三者機関の証明書が欲しい…という人にとっては, 240円/月はお手頃なのだろうか.

spammer counter v3

IP アドレスでアクセスを禁止している spammer が,その後どれだけアクセスを続けているかをカウントする php コードを,今回は MySQL を使って実装した.
まず最初に注意点. ErrorDocument 403 で php ファイルへ飛ばす場合,その php ファイルへのアクセスは可能とすること.
さもなくば, 403 の転送で無限ループが発生する.
具体的には,.htaccess へ下記を追記.hogehoge.phpの部分は,設置したphpファイル名に変更すること.

<Files hogehoge.php>
allow from all
</Files>

spammer のアクセスが集中している時など,どうしても
spammer counter v2
では,ファイル書き込みに失敗するようだ.
その結果,度々ファイルがクリアされてしまっていた.

んで,よく考えたらこのサイトでは MySQL を使う blog が2つも動いていることを思い出したので,
DB で実装することにした.
とても楽チン.

そのコードは,こんな感じ.

<?php
header('HTTP/1.1 403 Forbidden');
header('Content-Type: text/html; charset=iso-8859-1');
?>
<!DOCTYPE HTML PUBLIC '-//IETF//DTD HTML 2.0//EN'>
<HTML><HEAD>
<TITLE>403 Forbidden</TITLE>
</HEAD><BODY>
<H1>Forbidden</H1>
<?php printf('You don't have permission to access %s\non this server.',
             htmlentities(strip_tags($_SERVER['REQUEST_URI']))); ?><P>
<HR>
<ADDRESS><?php
$e = explode(' ',$_SERVER['SERVER_SOFTWARE']);
printf('%s Server at %s Port %d',$e[0],$_ENV['SERVER_NAME'],$_ENV['SERVER_PORT']);
?></ADDRESS>
</BODY></HTML>
<?php
// MySQL
$mySqlHost = 'xxx.xxx.xxx';
$dbname    = 'database_name';
$user      = 'user_name';
$password  = 'password';
$table     = 'spammer_counter';

// connecting
$mobj = mysql_connect($mySqlHost,$user,$password);
if ($mobj == FALSE) { die('broken');}

// count IP addr
$addr = $_SERVER['REMOTE_ADDR'];

mysql_select_db($dbname,$mobj);
$done=mysql_query('insert into '.$table.' (ipaddr,number) values (''.$addr.'',1) '
                  .'on duplicate key update number=number+1;'); 
mysql_close($mobj);
if ($done == FALSE) { die('no response...');}
?>

欠点は,データを見るのに DB を叩く必要があること.  
それは嫌なので,viewer も作った.
</p>
<p class="pre">
<?xml version='1.0' encoding='Shift_JIS'?>
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN'
    'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='ja' lang='ja'>
 <head><title>spammer viewer</title></head>
 </body>
 <h1>spammer viewer</h1>
 <table style='border: black solid 1px;'>
  <tr><th>IP addr</th><th># of access</th></tr>
<?php
// MySQL
$mySqlHost = 'xxx.xxx.xxx';
$dbname    = 'database_name';
$user      = 'user_name';
$password  = 'password';
$table     = 'spammer_counter';

// connecting
$mobj = mysql_connect($mySqlHost,$user,$password);
if ($mobj == FALSE) { die('broken');}

mysql_select_db($dbname,$mobj);

$done=mysql_query('select * from '.$table.';');
mysql_close($mobj);
if ($done == FALSE) { die('no response...');}

while ( $row = mysql_fetch_row($done)) {
  printf('  <tr><td>%s</td><td style=\'text-align:right;\'>%d</td></tr>\n',$row[0],$row[1]);
}

?>
 </table>
 </body>
</html>

spammer counter v2

spammer counter の記事で書いた,403 にかかった IP を保存するスクリプトを改造した.
まず最初に注意だが, ErrorDocument 403 で php ファイルへ飛ばす場合,その php ファイルへのアクセスは可能とすること.
さもなくば, 403 の転送で無限ループが発生する.
具体的には,.htaccess へ下記を追記.hogehoge.phpの部分は,設置したphpファイル名に変更すること.

<Files hogehoge.php>
allow from all
</Files>

もともとこのスクリプトを設置した理由は,弾いている IP を subnet mask でまとめるため,
subnet 毎のアクセスを把握したかったためなのだが,
先の記事のログではアクセス順に並ぶため, subnet 毎の状況を一見して把握できなかった.
そこで,アクセスがある毎に, 1 回だけ bubble sort を走らせることにした.

bubble sort で実装し行毎処理を行なっているのは,
全てメモリに読み込んで sort するのは,spammer のアドレスが想像以上に多いので,
ライン数が増えて処理に時間がかかるようになり,ファイルロックに邪魔されて
spammer のアクセスを拾えなくなるのではないかという懸念のため.
実際には,File I/O の方がボトルネックになっている気がするので,
fwrite 一発で書き込んだ方が処理は早いかも知れない…
もっと行数が増えたら,測定してみよう.

で,まぁコードはこんな感じ.

-- 追記
ごめん,バグがあった.
ループ前の1回の処理でbreak文を消してなかったので,バグってた.

-- 追記2
fgetcsv で取得した末尾の空白文字を取り除かないと \n が入ってしまうらしいことに,
後から気付いた.
全部 int キャストすることで,回避.

<?php
header('HTTP/1.1 403 Forbidden');
header('Content-Type: text/html; charset=iso-8859-1');
?>
<!DOCTYPE HTML PUBLIC '-//IETF//DTD HTML 2.0//EN'>
<HTML><HEAD>
<TITLE>403 Forbidden</TITLE>
</HEAD><BODY>
<H1>Forbidden</H1>
<?php printf('You don't have permission to access %s\non this server.',
             htmlentities(strip_tags($_SERVER['REQUEST_URI']))); ?><P>
<HR>
<ADDRESS><?php
$e = explode(' ',$_SERVER['SERVER_SOFTWARE']);
printf('%s Server at %s Port %d',$e[0],$_ENV['SERVER_NAME'],$_ENV['SERVER_PORT']);
?></ADDRESS>
</BODY></HTML>
<?php
// comparison 2 IP addresses
function aIsLargerThanB($a,$b) {
    // a and b are arrays of 4 integers, e.g. 127.0.0.1 is expressed as
    // array(127,0,0,1)
    if ($a[0]==$b[0])
        if ($a[1]==$b[1])
            if ($a[2]==$b[2]) return $a[3] > $b[3];
            else return $a[2] > $b[2];
        else return $a[1] > $b[1];
    else return $a[0] > $b[0];
}

// parse IP address to array of 4 integers.
function parseIpAddress($ip_addr){
    $return = array();
    foreach ( explode('.',$ip_addr) as $i) $return[] = (int)$i;
    return $return;
}

// count IP addr
$addr = $_SERVER['REMOTE_ADDR'];
$fobj = fopen('counter.dat','r');
if (flock($fobj, LOCK_EX)) {
  $oobj = fopen('counter.tmp','w');
  $flag=false;

  // 1st processing
  $s=fgetcsv($fobj);
  if (count($s)==2 and $s[0] === $addr) {
    $s[1]=(int)$s[1]+1;
    $flag=true;
  } else { $s[1] = (int)$s[1];}
  $prev = array($s[0],$s[1]);

  // process loop
  while (!feof($fobj))
    {
      $s=fgetcsv($fobj);
      $s[1] = rtrim($s[1]);
      if (count($s)<2) {
    fputcsv($oobj,$prev);
    break;
      } elseif (!$flag and $s[0] === $addr) {
    $s[1]=(int)$s[1]+1;
    $flag=true;
      } else { $s[1] = (int)$s[1];}

      $pips = parseIpAddress($prev[0]);
      $nips = parseIpAddress($s[0]);

      // bubble sort
      if (aIsLargerThanB($pips,$nips)) {
    fputcsv($oobj,$s);
      } else {
    fputcsv($oobj,$prev);
    $prev = array($s[0],$s[1]);
      }

    }

  fputcsv($oobj,$prev);
  if (!$flag) { fprintf($oobj,'%s,1\n',$addr);}
  flock($fobj,LOCK_UN);
  fclose($fobj);
  fclose($oobj);
  copy('counter.tmp','counter.dat');
} else {
    fclose($fobj);
}
?>

spammer counter

アクセス禁止したスパマーが,その後どれだけアクセスしているかカウントする.

以前,スパム増加という記事でも触れたが,
本サイトではアクセス禁止リストにあるホストからのアクセスを禁止している.
ところが,似たようなIPからのアクセスが絶えず続いており,どんどんホストを追加している状態である.
このままではアクセス禁止リストが延々と伸びていってしまうので,特にアクセスの多いアドレス空間については,
適当なサブネットマスクでもってアク禁とすることにしたい.

ところが,一度アクセスを禁止してしまうと,その後はどの程度のアクセスがあるのか分からない.
アク禁リストのアップデートをするための情報として,アク禁を解除しないまま,アクセス数を把握する方法を考えた.

ずばり,403 エラードキュメントをphpにして,アクセス元をカウントアップする作戦である.
そして普通に誤った操作をした人に疑問を与えないよう,403を忠実に再現したい.
ということで,こんなコードを生成してみた.

<?php
header("HTTP/1.1 403 Forbidden");
header("Content-Type: text/html; charset=iso-8859-1");
?>
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>403 Forbidden</TITLE>
</HEAD><BODY>
<H1>Forbidden</H1>
<?php printf("You don't have permission to access %s\non this server.",
             htmlentities(strip_tags($_SERVER['REQUEST_URI']))); ?><P>
<HR>
<ADDRESS><?php
$e = explode(' ',$_SERVER['SERVER_SOFTWARE']);
printf("%s Server at %s Port %d",$e[0],$_ENV['SERVER_NAME'],$_ENV['SERVER_PORT']);
?></ADDRESS>
</BODY></HTML>
<?php
// count IP addr
$addr = $_SERVER['REMOTE_ADDR'];
$fobj = fopen("counter.dat","r");
if (flock($fobj, LOCK_EX)) {
    $oobj = fopen("counter.tmp","w");
    $flag=false;
    for(;!feof($fobj);)
    {
        if ($flag) { fwrite($oobj,fgets($fobj));}
        else {
            $s=fgetcsv($fobj);
            if (count($s)<2) { break;}
            if ($s[0] === $addr) {
                $s[1]=(int)$s[1]+1;
                $flag=true;
            }
            fputcsv($oobj,$s);
        }
    }
    if (!$flag) { fprintf($oobj,"%s,1\n",$addr);}
    fclose($fobj);
    fclose($oobj);
    copy("counter.tmp","counter.dat");
} else {
    fclose($fobj);
}
?>

ファイルロックなんて,何年か振りに実装した.
普通に php のオンラインドキュメントにあるようなファイルロックにしていないのは,
各行毎に読み込み/書き込みをしたかったから.
読み込み用ファイルを排他ロックして,読み込めた人だけ処理が進むようにしてみた.
そんな処理が問題になるほど膨大なログが溜まる頃には,レンタルサーバのスペースを
食い潰してアカウント消されていそうだけどね…

んで,アク禁で ErrorDocument 403 へ飛ばす場合の注意.
403 で飛ばす先の php ファイルへのアクセスは可能とすること.
さもなくば, 403 の転送で無限ループが発生する.

<Files hogehoge.php>
allow from all
</Files>

とかでOK.

余談だが, ErrorDocument で http://~~ と URI 指定すると,
別サーバへの転送と同様に処理されてしまうらしく,呼び出し元が引けなくなるので注意.

AutoFollowersBlocker

GAE 上で動作し, cron で呼び出されて, twitter アカウントの follower を監視し,
プロファイルの文字列によって自動ブロッキングをするスクリプトを作成した.
きっかけは,昔むかし,山のように spammer からフォローされまくって,鬱陶しかったため.
当時の記事はこちら → twitterのspammerのfollowが多い

で,作ってみたのが, twitter を OAuth 認証でアクセスするためのクラス twit_oauth.py
そして,呼び出し元の AFBsample.py
いずれも分量が多いので,ソース自体はリンク先を参照されたい.

また,GAEで使うためのyamlファイルもついでに貼り付けしておく.

application: afb-sample
version: 10
runtime: python
api_version: 1

handlers:
# handling mode
- url: /cron
  script: AFBsample.py
  login: admin
# viewer mode
- url: /.*
  script: AFBsample.py
cron:
- description: polling job
  url: /cron
  schedule: every 5 minutes

さてこれで,次の4つを GAE へ放り込めば動く.
GAE の使い方については,web を参照されたいが,以前に hadacchi が調べたメモもある → twitterのspammerのfollowが多い
これでも,多少は参考になるかも知れない.

  • AFBsample.py
  • twit_oauth.py
  • app.yaml
  • cron.yaml

さて,今回のハマりポイントは,呼出 URL による処理の振り分けだった.

handlers:
# handling mode
- url: /cron
  script: AFBsample.py
  login: admin
# viewer mode
- url: /.*
  script: AFBsample.py
application = webapp.WSGIApplication([
    ('/cron', AutoFollowerBlocker),
    ('/', AFBview)
    ])

def main():
    wsgiref.handlers.CGIHandler().run(application)

当初は app.yaml の url 行を修正すれば呼び出し URL に応じて処理を振り分けできると思っていたが,
呼び出される側の python スクリプト内の webapp.WSGIApplication() の意味に気付いていなかった.
こいつの引数は,長さ 2 のタプルのリストであるが,タプルの第 1 要素は呼び出しURLになっていて,
ここでも呼び出し URL に応じて処理クラスを振り分けできる.
きちんと GAE の処理を読んでいないが,多分 app.yaml による振り分けは login 行におけるパーミッション制御や,
スクリプトファイルを分けることにより,クロスサイトスクリプティングみたいなアタックに対してある程度の
対処をしたい場合などに使うのが良いのかも知れない.

今回の構成では,
http://pjname.appspot.com/ へのアクセスで前回の実行結果を表示し,
http://pjname.appspot.com/cron へのアクセスでフィルタを手動実行する.

他の工夫としては,運用面で使い易くするため,自動 BLOCK 後に手動で UNBLOCK したユーザは対象から除外するようにしたり,
AND/OR 検索で重複マッチを走らせないようにしたり,
空フィールドに対して None が返却されるので事前に置換しておいたり,(デバッグの時にはjsonファイルを直接食わせる関係から,
マッチ関数内にもNoneの処理は残しているが…)
といった小細工は少ししてみた.

今後の課題としては,プロファイルを 1 call で 100 id 分まで抜ける API を見落としていたことが
分かったので,この API へ対応させた上で, follower が 10000 を越えるユーザでも TwitterAPI の
呼出制限にかからないよう初期化する実装を行なうことがある.
と難しく言ってみたものの,既チェック ID をパスするロジックなので, API の回数制限にかかる手前で
ループを break させてしまえば良いだけである.

参考にした web site は, Python アプリケーション設定 - Google App Engine - Google Code などの GAE のオンラインドキュメントと,
REST API Resources | Twitter Developers などの Twitter のオンラインドキュメントに加え,
前回までの記事 twitterでspammerのfollowを自動block 及び twitterのspammerのfollowが多い 内で参照している各ページである.

VirtualBoxへUbuntu11.04

VirtualBoxも,Ubuntuも,かつて使っていたソフトなりOSであるが,すっかり使い方を忘れてしまった.
ハマったポイントを改めて書いておく.

  • Ubuntu serverを入れる場合,日本語を選択すると後で言語設定をやりなおすハメになるので,Englishを選んでおく方が無難.
    X入れる場合は気にしなくていいけど.
  • インストールが終わったら,まずはGuest Additionsをインストールすること.
    具体的な手順は,

    1. ゲストOS起動
    2. デバイス>Guest Additionsをインストール
    3. sudo mount /dev/cdrom /mnt
    4. sudo /mnt/VBoxLinuxAdditions.run
  • ネットワークアダプタの設定を,「ブリッジアダプタ」または「ホストオンリーアダプタ」あたりにして,ホストとの直接通信が可能なようにする.
    しなくてもwwwには接続できるけど,不便で仕方がない.
  • sshd_configで,passwordloginをyesにしておく

これだけやっておけば,普通にLAN上に新しいUbuntuサーバを立てたのと同じところからスタートできるはず.

前から好きだった作品で,今日は,なんとなく読み返した.
美術学校の学生の4コマで,結構勉強になる.

私は高校の選択芸術をとっていただけの浅い経験しかないものの,それでもこの漫画を読むと,つい高校の美術の時間を思い出して,絵筆を執りたくなる.
とはいえ,私が一番好きだった油彩は,用意するも描くのも片付けるのも大変な上,画材の種類が多い上に高く,気軽に始められない.
ということで,もう10年以上も握っていない鉛筆を買ってきた.HBと2Bの一番安いやつを買ったが,しかし実際に描いてみてると3Bか4Bかを買っておくべきだったと後悔した.
あと,安い画材ということで色鉛筆…学生用の600円の色鉛筆を買った.(高いやつは1万円を越える…)
スケッチブックは,画材屋の少しページが多くて,簡単に本体から切り離せるタイプのもの(ミューズ ザ・スケッチ B4)を購入した.
で,後から気付いたのが,ねり消しを買い忘れていたこと.プラスチック消しゴムだと,カスが出て面倒な上,グラデーション表現を薄くするのに使えないんだよね…デッサンを始めるまで,本当にすっかり忘れていて、まだ買っていない…

デッサン1
デッサン1

で,とりあえずブランクがどの程度かと,腕試しに1時間ばかしデッサンをしてみた.
とにかく簡単なモチーフからということで,息子の積み木から1つ選択した.
この積み木は円柱を半分に切ったもので,面取りをしてあり怪我をしづらく拵えてある.
このような幾何学的な静物画は,ごまかしがききづらいが,練習にはうってつけである.(風景画は,いくらでもごまかせるので,それっぽく仕上げるだけなら,とても楽である.)
材質がはっきりと見える無着色の積み木にしたは,素材感も表現する練習にと思ってのこと…素材感は,一番絵を書いていた頃にもうまく表現ができなかったものなので,これはうまくいかなくても良しとする.

まぁとにかく,それっぽいデッサンができたわけで,本来ならこれから着色…といきたいのだが,デッサンに色鉛筆で着色する方法がさっぱり分からない.
選択美術では,絵画に関してはデッサン→水彩/油彩しか学んでないからな…
鉛筆に重ねても,色が出そうにない.
webで調べれば水彩色鉛筆の描き方講座は発見したので,普通の色鉛筆の講座もあるんだろうと信じたい.
水彩色鉛筆(水を落とせば水彩画になる)の講座によれば,下絵は塗り絵みたく輪郭だけ描いたものになっていた.
色鉛筆でいきなり陰影をつけるなんて,私にできるのだろうか…

-- 以下,選択美術の記憶.

油彩
デッサンからスタートする油彩の場合,デッサンをキャンバス上に書いた後,ブラウンや青の絵の具で下塗りをする.
下塗りでは,影のみを絵の具で表現し,色彩はとりあえずあまり考えない.
下塗りが乾いた後,その上から実際に表現したい色をのせていく…油彩は絵の具が固く,あまり塗っている感がないので,私は「のせる」と言う方がしっくりくるが,ようは色をつけることである.
色彩の表現については美術史の基本程度にいくつか学んだものの,一番好きだったのは印象派の光を表現する技法である.
ちなみに,課題で2つほど模写した.2作目がクロード・モネの「夕日の国会議事堂」なのは,そして失敗作を提出したことも覚えているのだが,1作目の高評価であった作品がどうも思い出せない.
たしか作者は大好きだったセザンヌで,森の中に小さな家あるいは小屋があって,その手前に小さな橋か船つき場があった,晩年の綺麗な絵だったような記憶があるものの…セザンヌを取り上げているwebサイトを見ても出てこない.
水彩
水彩の場合…選択美術では,水彩画を1作品しか仕上げた記憶がないので,ちょっとうろ覚え.
画用紙にデッサンした後,鉛筆の粉が浮かないようフィキサチーフという溶剤をスプレーでかける.
その上を水彩の絵の具で塗っていくと,下書きの線が残った絵になる.
水彩は準備が油彩と比較して楽で,片付けも水で洗うだけと簡易な上,この描き方の場合デッサンの時点で水彩画向けに陰影をつけておけば,着色の時点であまり陰影に気をかけなくても絵になる.
とはいえ,筆を洗う水は必要だし,絵の具も多少は値が張るのでちょっとはハードルがある.
ところで小中学校では水彩ばっかり描いてたハズなのんだが…色をつけると残念な出来になるのが嫌で仕方なかった記憶しかない.
マトモに水彩をやったのは高校の選択美術が初めて.

私の高校では美術は2年生の3学期までで,最後の一枚は高校の傍の桜並木を油彩で描いた記憶がある.
最後に好きなものを好きに描け,というお題だった.
この2年間で学んだ内容は,覚えている範囲では,
静物画デッサン--その1,静物画クロッキー,静物画デッサン--その2,静物画油彩,油彩の模写(画集から)--その1,石膏+FRP による立体造形(友人の顔),油彩の模写(画集から)--その2,木炭画,水彩,自由題の油彩
といったところか.
立体造形は,なんか妙に先生ウケして,どっかの展覧会で展示されたのだが,いかんせん立体造形に全く興味がなかったので,どこでいつ展示されたのかも知らないまま,卒業直前に引き取って実家の倉庫に放置した.
現在は行方不明である.

うーむ,印象派の絵を探したり,用語に間違えがないか調べたりしていたら,記事投稿するだけでデッサンにかけた時間の3倍もかかってしまった.

HT-03a+b-mobile sim u300

白ロムを手に入れたので,docomoのsimをガラケーに,b-mobileのsimをht-03aに入れて使おうと試みた.
ちょっとハマってしまったのでメモ.

症状
b-mobileの設定通りにAPNを設定しても,圏外表示のままであり,
Gmailの同期エラーが繰り返される.
解決策
  1. ブラウザを起動して,圏外表示でも接続できていることを確認する
  2. notification (通知領域?) に表示されるGmailのエラーを選択して,パスワードを改めて入力する

しかし,googleのcontactsとは同期できているアドレス帳を,どうやってガラケーに落としたものか…
ガラケー→スマフォンの移行は楽にできたが,逆の方法は1分ぐぐっただけでは発見できなかった.
vcfを取り込む方法くらいありそうなものだが…ま,他に時間ある時にでも調べよう.

-- 追記
\SD_PIM\PIMxxxxx.vcf という名前にすれば,読み込むことができた.
しかし,なぜか本体にコピーできないので,vcfファイルの中身を調査中.

-- 追記2
多分,UTF-8がquoted printableとやらでエンコードされてvcfに落ちているのが問題じゃないかと.
ガラケーで直接vcfを読み込んで表示することはできるが,コンバートが失敗しているのかしら.その点では,登録noがないことの方が問題なのだろうか.
いずれにせよ,その辺りのフォーマットの問題と思われ.

-- 追記3
ガラケーの仕様上,ふりがなが半角カナではないと未設定扱いになってしまい,
その他リストに全て入っていた.
ふりがなを設定すれば普通に見ることができた.

劇場版「空の境界」音楽集 or Today Is A Beautiful Day

劇場版らっきょのサントラ.
ファンとしては買うしか,という義務感で試聴したが,良かった.
映画のシーンが思い出せる…特に,式のしっとりと良いシーンが想起されるようなチョイスだ.
らっきょ好きなら買いな一品かも.
試聴も可.

supercellのアルバム.
この人,知らなかったんだけど,曲はしょっちゅう聞く.
特に,君の知らない物語はよく聞くなぁ,と思ったらアニソンだった.
ということは,ニコ動で聞いたんだなきっと.

boopleだと予約が終わってたので,これはamazonで購入決定.
あと,この人誰だろと思ってたら,メルト,恋は戦争,ワールドイズマインのPだった.
メジャーで出してるとは知らなんだ…しかも魔法使いの夜のED謳ってるし,なんだよこのスーパーユニット.
ちょっとは仕事の他にも時間を割いて情報集めないとだめだな