2016年8月29日月曜日

3年夏休み(長いです)

夏休みも半分終わり、秋の雰囲気さえ感じさせる雰囲気ですが、皆様いかがお過ごしでしょうか。

僕にとってはこの夏休みが実質最後の長期休暇です。悲しいです。来年は院試の勉強か、就活のラストスパートでヒィヒィ言っていることでしょう(笑)

時に、自分がこの大学に入り、この学科で勉強してきたことが自分にとって幸せだったかどうかを考えることがあります。大学生になって3年目の今、何を思うのか。今回は今までの道のりを振り返りつつ、将来のことについて少し書きます。忙しい人は中略してもらって構いません。

***

僕は幼い頃からコンピュータが好きでした。
小学一年生のとき、父親からお下がりのノートパソコンを貰ったのが始まりです。付属のマニュアルを何度も熟読し、色々試しては色々失敗し、パソコンの使い方を体得しました。マニュアルで覚えた漢字も少なくなかったと思います(笑)。

パソコンは僕にとってまさに魔法の道具でした。インターネットで知りたい情報を簡単にかつ迅速に入手できるし、自分のアイデアをデータという形にすることもできました。
幼心にも、パソコンの持つ様々な可能性に気づいていたのかもしれません。

その中の一つに、小学校低学年の頃に作成した新聞があります。これはその当時NHKで放送されていた「趣味悠々とっても楽しい中高年のパソコン教室」という番組で紹介されていた新聞を作ってみようという内容の真似事で、自分や家族の近況を写真をつけて書きました。
ある日、作成した新聞を小学校に持っていったところ担任の先生に評価され、それが校長先生にも伝わり校長先生にも褒められました。これはとても嬉しかったことを覚えています。

この頃から、パソコンで何かを作り、人々を楽しませることが自分にとっても楽しいことであると気づいたのだと思います。他にもボイスレコーダーで自分の声を録音してみたり、カメラで動画を撮って編集することもやってみました。

いつもパソコンばかり弄っていた僕は、ついに父親よりもパソコンに詳しくなってしまいました。そして、小学校高学年の時には家のパソコン周りのメンテナンスはほぼ自分が受け持つようになりました。この時、ネットワークに接続されている複数のパソコンを管理することの難しさと面白さに気づいた(いわゆるインフラ整備の類ですね)のだと思います。

中学生になった頃、動画投稿サイトの勢いが隆盛し、僕のパソコンへの興味は加速的に増加しました。前述のとおりパソコンを用いることで自分のアイデアを形にできると僕は考えていましたが、動画投稿サイトのように比較的容易に作品を公開できる場所が誕生したことで、多くの人々が作品を製作し公開すると共に多くの人々がそれらを鑑賞することが可能になりました


以前はサーバーが配信するコンテンツをクライアントが受信し楽しむという一対一なコミュニケーションが主流でした(もちろん掲示板などはこれに限りません)が、ここでサーバーはクライアント同士の双方向的なコミュニケーションの中継地点としての役割を担うことになりました。中央集権的なサービスから分散型サービスへの転換と言ってもいいでしょう。分散型サービスは現在もホットなトレンドになっていることは皆様もご存知かと思います。(TwitterやFacebookなどのSNSに代表されますね)


閑話休題。中学三年生になり動画投稿サイトの投稿に影響を受けた僕は、吹奏楽部で培った音楽的センスを使って耳コピ、作曲に手を出し始めました。自分も頑張ればネットで評価されるような作品を制作することができるのではないか、という淡い期待もあったかもしれません。

何曲か拙作を作りましたが、結局大々的に公開することはありませんでした。しかし、あーでもないこーでもないと悩みつつも夢中で作曲に取り組んでいる時はとても楽しいものでした。真っ白なキャンバスに何かを描きはじめることは非常に難しいですが、自分の思い通りの作品ができた時の喜びは他に代え難いものであると考えています。

ところが高校生になると特進クラスに入り、受験勉強へのシフトを余儀なくされました。いや、最後は自分でこの選択肢を選びとったわけですが。今まで続けてきた創作活動はほとんど休むことになりました。自分のやりたいことを考える前に、とりあえずは大学に受からないことには始まらないと思ったからです。

***

このような軌跡を描き、現在に至ります。

大学生になってから、正直なところ自分は一ミリも成長していないんじゃないかと思います。ただ課題やレポートに追われ、長い通学時間は睡眠に当て、本当に自分がしたいことをゆっくり考える時間がなかった。言い訳でしょうか、多分そうでしょうね。でもこれが現実でした。

しかし大学3年生になった今、将来自分がなにをしたいのかをじっくり考えなければならない時期がやって来ました。最後の裁判の時が訪れたのです。

もはや大学受験の時のような、なんとなくの動機で将来を選択することは出来ません。なんとなくの動機で選択したところで、おおよそ後悔する結果が待ち受けていることでしょう。

自己分析という言葉がありますが、こうやって自分の過去を思い出し分析することで自分はどういう人間であるかというマニュアルを作る作業であると表現されることがあります。だからこうやって連々と文章を書いているわけです。あわよくば自分の本当の気持ちに気づくことが出来るのではないかと。

就職するのか、院に進学するのか。少なくとも、僕は生粋の研究者というものとは対極の位置にいる人間であると思っています。僕は自分達の力で何かしらのコンテンツもしくはインフラを作り、維持することで、他の人々に喜びを与えるという役割を果たしたいと思っています。パソコンを使うことに慣れ親しんだ身としては、パソコンを一から作ることよりもパソコンを用いて何かをすること(アプリケーション)に興味が有るのです。

他の人々に喜びを与えるという役割を果たす、それを具体的にはどのような形で実現するのか。そこの考えを詰めることが出来れば将来ももう少し見通しの良いものになるのでしょう。非常に難しいですが、本当の幸せを見つけるための大事な一歩として、残された時間を有意義に使おうと思います。こんなことを考える夏休みでした。


最後まで読んでくださり、ありがとうございました。

2016年8月18日木曜日

Windows起動時にbatファイルを管理者権限で実行する方法

僕のPC、どうもおかしい。


DellのLatitude E6220というPCを使っているのですが、このPCにはSDカードスロットが装備されています。

ところが、Windows10の環境下において起動時に何故か毎回SDカードスロットが無効化されてしまいます。正確に言えば、SDカードスロットがぶら下がっているPCI Express Root Portが無効化されてしまいます。

有効化してみると普通に使えるのでデバイスに致命的な問題があるとは思えないのですが、未だに原因は分からずじまい。

さあ、どうするか。それなら、起動時に毎回SDカードスロット(Root Port)を有効化するバッチファイルを実行すればいいじゃない!





というわけで、実際にやってみましょう。

1. バッチファイルの作成

デバイスの有効化を行うプログラムはdevcon.exeというもので、バッチファイルはこれに引数を渡して特定のデバイス(ここではRoot Port)を有効化するために用います。devcon.exeは予めダウンロードしておき、Windowsフォルダとかに入れましょう。バッチファイルは以下のように作成します。

----sd_on.bat----

devcon enable "PCI\VEN_8086"

たったこれだけです。簡単でしょう?第二引数はハードウェアIDで、デバイスマネージャーから参照することが可能です。作成したバッチファイルはCドライブ直下に置いておきましょう。

2. タスクスケジューラにタスクを登録

コンピュータの管理からタスクスケジューラ→タスクスケジューラライブラリを開きましょう。
画面右のメニューの基本タスクの作成をクリックします。



全般タブで、一番下の「最上位の特権で実行する」にチェックを入れてください。devcon.exeは管理者権限でなければ実行できません。



トリガータブに移り、新規よりトリガーを作成します。この時、ログオン時に設定し、任意のユーザーのラジオボタンにチェックを入れてください。





操作タブに移り、新規より操作を作成します。操作はプログラムの開始、プログラムのパスは先程のバッチファイルを指定してください。


これで完了です。次回ログオン時にバッチファイルが実行されることを確認してください。

natsuki_botの関数解説①

皆様に好評(?)を頂いているnatsuki_bot(@natsukitus)。

元々は知り合いのnatsukiの迷言集を呟くだけのbotだったのですが、返信機能がつき、スケジュール機能がつき、終いには天気予報がついた意味不明なbotとなってしまいました。笑

そろそろ開発を終了するつもりなので、このシリーズでは私が独自に追加した関数について、自分なりの解釈を含めつつ解説していきます。


今回は、natsuki_botの主要機能となったメモ機能です。

ソースコードを下に示します。簡単のため、一部を省略してあります。


 //タイムラインへの反応を作る
 function makeReplyTimelineTweets($timeline, $replyPatternFile){
 if(empty($this->_replyPatternData[$replyPatternFile])){ $this->_replyPatternData[$replyPatternFile] = $this->readPatternFile($replyPatternFile); }
        $replyTweets = array();
        foreach($timeline as $tweet){
            $status = "";

   if(preg_match ('/(.*)#(.*(メモ|めも))(.*)/s',$tweet["text"], $matches) === 1){
    $status = $this->MEMORANDUM ($tweet, $matches);
   }

            //リプライパターンと照合
            foreach($this->_replyPatternData[$replyPatternFile] as $pattern => $res){
                if(preg_match("@".$pattern."@u",$tweet["text"], $matches) === 1 && !preg_match("/\@/i",$tweet["text"])){                                        
                    $status = $res[array_rand($res)];
                    for($i=1;$i convertText($status, $tweet);
            //フッターを追加
            $status .= $this->_footer;

            //リプライ相手、リプライ元を付与
            $rep = array();
            
  switch(true){
  //リプライ反応をTLに発言
  case stristr($status, "[[TLH]]"):
  $status = str_replace("[[TLH]]","",$status);
  $rep["status"] = $status;
  $rpid = (string)$reply->id;
  file_put_contents($this->_logDataFile,$rpid);
  break; 
  //その他
  default:
  $rep["status"] = "@".$tweet["user"]["screen_name"]." ".$status;
  } 


            $rep["in_reply_to_status_id"] = $tweet["id_str"];      
            //応急処置
            if(!stristr($status,"[[END]]")){
                $replyTweets[] = $rep;
            }
        }                        
        return $replyTweets;    
    }          




 function MEMORANDUM ($tweet, $matches){
   //var_dump($matches);
   $filename = "memo/{$matches[2]}.txt"; 
   if (!file_exists($filename)){
     touch($filename);
     chmod($filename,0666);
   }
   $date = date ("Y-m-d H:i");
   $filename = "memorandum.txt";
   $matches[0] = str_replace("#.*","",$status);
   $matches[0] = htmlspecialchars_decode($matches[0]);
   $nakami = preg_replace("/#(.*(メモ|めも))/", "", $matches[0]);
   $matches[0] = preg_replace('/\n/', '{kaigyou}', $matches[0]);

   $txt = $date."\t".$matches[0]."\r\n";
   if(file_put_contents ($filename, $txt, FILE_APPEND | LOCK_EX)){
    echo "メモ登録成功。
"; }else{ echo "メモ登録失敗。
"; } $status = NULL; return $status; }


僕が作成したMEMORANDUM関数は引数が$matches、返り値が$statusです。
$matchesはpreg_match関数を用いてツイートを分解し、要素を配列に入れたものです。
$statusは最終的にツイートされる文章です。すなわち、メモ完了ツイートです。


さて、誰かが「テストです #ミズヒトメモ」と呟きます。すると、この関数にはまず次のような配列$matchesが渡されます。

[0] => "テストです #ミズヒトメモ"
[1] => "テストです"
[2] => "ミズヒトメモ"
[3] => ""

これはpreg_match関数の動作の特徴になります。preg_match関数では、()で囲われた正規表現による文字列を検索パターンとし、検索対象の文字列の中でそのパターンに合致したものを順番に配列に入れていきます。ただし、0番目の要素は検索対象の文字列そのものが入っています。

配列が渡されると、最初にメモを記録する用のtxtファイルを参照します。
ここで、txtファイルが存在しない場合は新たにtxtファイルを作成します。touch関数でファイルを作成し、chmod関数で「自分もグループメンバも他人も、読み込みと書き込みができる」パーミッション(666)設定を行います。

次に、txtファイルに書き込むデータを作成します。date関数でツイートの日時を作成し、htmlspecialchars_decode関数を用いて特殊記号をデコードした$matches[0]と組み合わせて$txtに整えて入れます。

そして、最後にfile_put_contents関数で用意したtxtファイルに書き込みをします。FILE_APPENDはファイルの後ろに追記するオプション、LOCK_EXは排他アクセス(他のプログラムに書き込みをさせない)オプションです。

ところで、途中で出てきた$nakamiはpreg_replace関数を用いて$matches[0]からタグを取り去ったものです。最後の$statusで用いられているのが分かると思います。そして、return $status;によってメモ完了ツイートが戻り値として呼び出したところへ戻っていきます。

このようにしてnatsuki_botは皆様のツイートを収集してファイルに保存しています。



いかがでしたか?それほど難しいプログラムではありませんが、やはり正規表現によるマッチングでつまずく可能性が高いでしょう。何かわからないことがあったらコメントくださいね。