l_n_m’s diary

よわい電気系の日記(本当にただの日記)

愚痴

コメントぉぉぉぉぉ!!!!

コメントの書いていないクラスの継承が辛すぎる。精神衛生に良くない。とても良くない。
仮想関数もいっぱいあるし、その中に純粋仮想関数もひとつふたつどころではなく含まれている。

この関数は何をするんだろう……いちいちcpp見て確認するの面倒くさい……やだ……
でもGW中ずっとサボっていたしいい加減やらなくては。はぁ……。

昨日のDDR

なんと! Blew My Mind CDP抜けました!!!! これは上手いんじゃないの!
最大コンボが57とかそんなもんでした。繋がらない繋がらない。
あとペンタエンドも抜けたり。正直明日あたり足が筋肉痛になってそうです。翌日に来ないあたり老化を感じる。

Twitterでbot in Node.js, twitter

botづくり

突然やりたくなったのでやりました。しょうもないところで詰まりまくりましたが2時間で基本が完成。
大雑把な流れを追いつつやり方をメモがわりに残しておきます。

環境

Ubuntu14.04
Node.js 0.10.25
npm 1.3.10
TwitterAPI 1.1

install

npm install twitter

今回使ったのはこれだけ。Node.jsとnpmはinstall済みとします。
ntwitterとかいうのもあるっぽいですが、twitterの方が名前がデフォルトっぽい(偏見)のでこっち。

Twitter API認証

とりあえず登録。
Twitter Application Management
アカウントと携帯電話番号が紐つけられていないと怒られます。
携帯電話の認証をするときには、頭の「0」を抜いて、10桁を入れればいい。じゃないと認証してくれない。メッセージさえ届かなかったり。

OAuth認証

必要なのはconsumer_key, consumer_secret, access_token_key, access_token_secretの4つ。
access_tokenは画面の下の方で発行すればOK。
これらを、

var twitter = require("twitter");
var bot = new twitter({
  consumer_key: hogehoge,
  ...
});

と入れてやればOK。一部のサイトを見ていたら、Twitterにログインの上でデベロッパー用のページのURLを書いてあったりしました。それでもいいのか……

本体作成

今回使ったのはstreamAPI

bot.stream("statuses/filter", {track:"自分のアカウント名"}, function(stream){
  stream.on("data", function(data){
    var t = {status:"つぶやきたいこと", in_reply_to_status_id: data.id_str};
    client.post("statuses/update", t, function(error, tweet, response){
      if(!error) console.log("tweeted");
    });
  });
});

何がしたいの

自分宛のリプライに対して何らかの内容を返信します。リプライの内容はdataに入っているので、data.textから読み出して適当に使いましょう。

var text = data.text.replace("@垢名 ", "");

とやって自分の垢名とその直後の空白をカットして使うのがだいたいでしょうが。
statusには本文を入れます。
in_reply_to_status_idには、飛んできたリプライのステータス番号を入れます。data.idです。statusの中に、送り先のID、data.user.screen_nameが入っていないとこの値は無視され、返信ではなくただのリプライとなるので注意。

var message = "@" + data.user.screen_name + " メッセージ";
var t = {status: message, in_reply_to_status_id: data.id_str};

とかして使いました。

落とし穴

さて、実はdata.idを入れても返信してくれません。上では「id_str」となっています。こっちは大丈夫。
jsの仕様上、data.idが大きすぎて扱えないらしい。雑魚か。なので、文字列として突っ込んであげれば大丈夫。
余談ですが、data.idとdata.id_strはちょっとだけ値がずれているんですよね。なんなんだろう。
あと、phpならdata.idをそのまま入れても大丈夫らしい。phpよくわかりませんけど。

どこを見ればいいのさ

公式ドキュメントでも見ましょう。
つぶやきたいならupdate
POST statuses/update | Twitter Developers
streamingAPI、タイムライン上を検索する方法については
Streaming API request parameters | Twitter Developers
そのほかのドキュメントを検索したいならここ
Search | Twitter Developers

こちらを主に参考にしました。
Node.jsで作るTwitter通知アプリケーション〈Node.jsシリーズ vol.3〉 - Tech Blog - Recruit Lifestyle Engineer

その他の問題

一部のページでは、bot.updateStatusとかいうメソッドを呼んでいましたが、has no methodと怒られました。たぶん記事が古かったんだと思います。TwitterAPI1.0だったのかしら。
というわけでどうやればつぶやけるのかについてはちょっと調べるのに手間取りました。結局postすることに。
よくわからないモジュールを使いたくない、自分でAPIを直に叩きたい、という人は頑張ってください_(:3 」∠ )_
自分でOAuthの認証やらhttpリクエストやら書かないといけないのでたぶん面倒です。
あと、鍵垢のツイートは取得できないらしい。なんか上手くデータ取れないんだけどもしかして……と思って鍵を外したら動きました。クソ。たぶん鍵垢でも取得する方法があるんでしょうけど、今はそこまでやる気が湧かない。

振り返り

時間かかりすぎた。全部で2時間は流石に……30分くらいで出来ると見積もっていたので。
トラブル

  • 携帯電話の紐付けが出来ない(頭の0を抜いて入力)
  • データが取得出来ない(鍵を外した)
  • in_reply_status_idが動かない(メッセージに相手のアカウント名を入れる、data.id_strの方を使う)

テストをいっぱいしたい人なのでTLがぐっちゃぐちゃになって友達にうるせぇって怒られました。気をつけましょうね(反省したとは言っていない)。

またやる気が湧いたら、今度は天気予報なんかを実装します。とは言っても気象庁か何処かのサイトからデータ取ってきてつぶやくだけですが。
あとスケジュール機能。mongodbか何かと一緒に動かせばすぐ出来そうです。

LE FRUIT DE LA GRISAIA -Makina-

マキナ読了

GWに何をしていたのかと言えば、グリザイアの果実読んでました。あとバイト。
論文読んだり参考書読んだり院試の勉強したりしろって話でもあるんですけどね、休みだし仕方ないね♂
グリザイア1人目はマキナこと入巣蒔菜になりました。天音を先に読んでいたはずがっ……
早速ネタバレありですが感想をかるーく。

最後の選択肢、勘付きながらも結局ダメな方を選んでしまいました。悔しい。というかやるせない。
悪党に期待なんて出来ませんってば……でも伏線はしっかりあったんですよね、誰かを殺せるのは殺される覚悟があるやつだけだとかなんとかそういうの。マキナと一緒にいてやるべきだとは思いながらもあの悪党を赦すことが出来なかった、自分が殺される意味に対しての考えが甘かったせいです。うーん。

教訓?

人にされて嫌なことはするな、ですね。いや当たり前だけど。
復讐・報復は悪循環を生むだけ。こっちはだいぶ身に滲みました。いてぇ。何か嫌なことがあるとやり返したくなってしまうのですが、そんなことをしても何も進展しませんね。むしろ負の連鎖に繋がるだけで得が無い。
一時の感情に流されて、自分がスッキリするだけのために酷い復讐をするくらいなら、辛くても自分の中で抑えるべきということです。

大人

大人になるってなんでしょう。「子供」だったマキナが「大人」になるための物語でもあったわけですが、いざ自分の身を鑑みるとマキナと変わんねーなって思うのです。親の脛齧って大学通っている身分ですし。
独り立ちすることがまず目標です。人は支えあわなければ生きていけないとは言いますけれど、一方的にもたれ掛かっているのはいけませんから。そのためにもマキナのように、自分に出来ることを増やして社会に出て生存競争に参加して闘えるようにならなければ。

……つまりゲームばっかやってないで研究とか勉強とかしろってことっすね。ハイ……
でも清夏のような大人にはなりたくないものです。某ウンチブリブリ大学には人を有能か無能かだけで判断する人が多いそうですが、目指すのはそういう人ではありません。面倒見のいい、かつ能力のある、それこそ天音のような人になりたい。家事も出来て優秀だし。
他の作品で言えば「Rewrite」の咲夜だとか、「中の人などいない!」のルイさんや西園寺さんだとか。
今の僕は甘いだけでふにゃふにゃしているので、彼らのように優しくしっかりとした芯を持った人になりたいものです。

VS大人

自分がどれだけ高潔であろうとしても、汚い大人はいるもので。清夏とか。名前が皮肉ですね。
そんな大人とどう戦っていくのか。汚い大人はえてして話術に長けているような気がします。一見なんの変哲も無いやり取りをしているうちに、気付けば落とし穴に突き落とされている。清夏との代理人としての会話の一件を思い出します。
警戒していても今の状態では気付けるものではありません。今度話術の本でも買ってみようかしら。どうせ頑張って読めば数日で読めるし。まずは相手の技を技と知覚できるようにならねば。
こんな調子で警戒していて、信頼できる友人がこれから新たに出来るものなのでしょうか……最愛の親友は、僕が死ぬまで変わらずに高校時代の部活の相棒でしょうけどね!

What's next?

おそらく次はみちるです。バカだから嫌だと友人が言っていましたが、僕ああいうキャラ好きです。裏表が無いので。
他のゲームもいくつかやっていますし、中の人もあと1章読めばもう完結なのですが、ちょっと重めの話に飢えているところなので、たぶんしばらくグリザイアの果実が続きます。前の記事に書いたように迷宮を始めるのもありかもしれませんが、それは後のお楽しみにでもしておきましょう。

ところで、えっちシーンはマキナのように要所要所で入れるべきだと思うのですが、如何でしょう?
夏空カナタとか最高。ホントに。
ドタバタハーレムゲーなんかは別ですけどね。

Trauma

なんでもないことがトリガーになったりしますよね。

軸中心祭

昨日、これを書いている時点ではもう既に一昨日の土曜日、友達と軸中心祭に行きました。金欠のため軸は買いませんでしたが、無料配布のポスターと小さな画集を2つ購入。じっくり楽しむつもりです。
あれだけたくさんのタペストリーが並んでいるのも壮観ですが、そのひとつひとつが綺麗でじっくり眺められるのが凄い。前回や前々回に買ったタペストリーもまた飾って楽しもうかな。
友達はそのあとうちに泊まりに来ました。指ぷらで勝負してみたり。楽しいひとときでした。

コミ1……には行きませんでしたが

こっちは今日の話。たまたま上京していた親と食事。普段食べられないような牛タンを食べました。美味しい。本当に美味しい。
その後、コミ1に行っていた友人と合流、一緒にアキバで遊んで解散。

進捗

だめです。明日から頑張らないとまずい……

Ciel no Surge

シェルノサージュ

先週末にオフライン版買いました。2年前にオンライン版買ってたのですが、どうしてもだれてしまってあまり進められず、結局試練編第二幕の途中で止まってました。

オフライン版の「時間を進める」機能、すごく便利ですね。この機能のおかげでサクサク進められます。もう試練編が終わり、崩壊編をやっているところです。

グレイコフさんの最期は泣けました。親の優しさですね……犠牲になって終わるシーンを見るといつも思うのですが、他の終わり方もありえましたよね。うーん……

グリザイアの果実

進めております。天音の過去に触れるところまで行って、「あ、これあかんやつだ」と感じたので他のキャラを進めることにしました。覚悟が出来たら読むと思います。

友達は果実と迷宮を通してキャラごとに進めているそうです。キャラの話が繋がって楽しめるとか。僕はどうしようかな?

少しだけ真面目な話

最近シェルノサージュに夢中でブログ書いていませんでしたが、現実世界で他に何もやっていなかったわけではありませんよ!

学んだことのうち豆知識程度のことですが、タッチパネルについて。

抵抗膜方式

タッチパネルの基本、シンプルな構造。

ディスプレイの上に膜が二枚、絶縁膜に支えられて敷かれており、電圧がかけられています。1箇所が押されると膜が触れて電圧が変化、縦方向と横方向それぞれについてその電圧変化から押された位置を特定できます。

可変抵抗みたいなものですね。場所に応じて抵抗値が変わるあたりが(この場合は電圧が変わるわけですが)。

ニンテンドーDSなんかに使われていましたが、画質が落ちるのが難点。最近のスマホではマイナーらしいです。

静電容量方式

こっちは2種類にさらに分けられます。

表面型

ディスプレイ>導電膜>保護カバー

の順に重ねられたタイプ。指で押すと指に電流が流れ(!)、導電膜に均等に存在していた電界が変化します。それをパネル四隅の電極から観測、位置を計算。

そこそこの大きさのディスプレイで使われますが、複数箇所同時には検知出来ないのが難点。

投影型

スマホでメジャー。
ディスプレイ>電極層>電極層>保護カバー(絶縁体)
の順に重ねられる。電極層は電極が大量に並んだもので、指が近付くと周囲の電界が指に吸い込まれることで周辺の電極との間の静電容量が変化して電流が流れます。その電流を捉えて指の位置を計算。

電極がいっぱいあるので複数箇所でも同時に検知出来るのが強みです。ただ、静電容量を変化させるようなものでないといけないため、絶縁体で触れても反応しません。

適当に調べてまとめただけですが、ざっと雰囲気は合ってると思います。しかし、タッチパネルなんて昔は夢だったろうに、今では普通に使われてるんですよね……

BMS

最近プレイはご無沙汰ですが、最近★25が増えましたね!
High-Priestess[ANOTHER]、★★5からまさかの発狂難易度表入り! 曲好きなのでアツいです。到底クリアできませんけど。

これから

最近自分の趣味に没頭しているような、それでも満足するだけできていないような、微妙な感じです。なんでしょうね、この感じ?
ともかく、やることやってもっと趣味の時間を作りたい。というかだらだらしないで読みたい本読むとかすればいいんだけど。
BMSもご無沙汰、ゲーセンも週1or2(普通そのくらいといえばそんなもんかもしれませんけど)、何に時間取られてるんでしょう。ぼーっとしてる時間があったり、手際が悪かったりするんだと思います。テキパキこなさねば。

ブログも、ちゃんと更新しないとだ。

にぶんぎ? にぶんぎ!

二分木! in OCaml

Ocamlで二分木書きました。再帰大得意な関数型言語の強みを味わいました……凄いですね。

2-3木

問題はこっち……ものすごく時間をかけたものの、削除関数だけ実装できず。
アルゴリズムを勉強していないもので(ウッ)、2-3木の実装は初めてでした。せっかくなので貼っちゃいますか。本当ならGitとかに上げておくと便利なんでしょうけど、それはまた後ででいいや。
型定義部。

type 'a tt_tree = Nil 
  | Leaf1 of 'a
  | Leaf2 of 'a * 'a
  | Leaf3 of 'a * 'a * 'a
  | Node2 of 'a * 'a tt_tree * 'a tt_tree
  | Node3 of 'a * 'a * 'a tt_tree * 'a tt_tree * 'a tt_tree;;

挿入関数。

let rec tt_tree_insert x t =
  let rec ins x t = (*return (bool active, 'a head, tt_tree left, tt_tree right)*)
    match t with Nil -> (false, 0, Leaf1(x), Nil)
    | Leaf1(v) ->
      if x < v then (false, 0, Leaf2(x, v), Nil)
      else (false, 0, Leaf2(v, x), Nil)
    | Leaf2(l, r) ->
      if x < l then (false, 0, Leaf3(x, l, r), Nil)
      else if x < r then (false, 0, Leaf3(l, x, r), Nil)
      else (false, 0, Leaf3(l, r, x), Nil)
    | Leaf3(l, c, r) ->
      if x < l then (true, c, Leaf2(x, l), Leaf1(r))
      else if x < c then (true, c, Leaf2(l, x), Leaf1(r))
      else if x < r then (true, x, Leaf2(l, c), Leaf1(r))
      else (true, r, Leaf2(l, c), Leaf1(x))
    (*in the case of Node2 or Node3, you need to check only keys. not mention to values*)
    | Node2(k, l, r) -> (*always return false*)
      if x < k then let (b, h, rl, rr) = ins x l
        in if b then (false, 0, Node3(h, k, rl, rr, r), Nil)
          else (false, 0, Node2(k, rl, r), Nil)
      else let (b, h, rl, rr) = ins x r
        in if b then (false, 0, Node3(k, h, l, rl, rr), Nil)
          else (false, 0, Node2(k, l, rl), Nil)
    | Node3(k1, k2, l, c, r) -> (*if receive true, return true*)
      if x < k1 then let (b, h, rl, rr) = ins x l
        in if b then (true, k1, Node2(h, rl, rr), Node2(k2, c, r))
          else (false, 0, Node3(k1, k2, rl, c, r), Nil)
      else if x < k2 then let (b, h, rl, rr) = ins x c
        in if b then (true, h, Node2(k1, l, rl), Node2(k2, rr, r))
          else (false, 0, Node3(k1, k2, l, rl, r), Nil)
      else let (b, h, rl, rr) = ins x r
        in if b then (true, k2, Node2(k1, l, c), Node2(h, rl, rr))
          else (false, 0, Node3(k1, k2, l, c, rl), Nil)
  in let (b, h, rl, rr) = ins x t
  in if b then Node2(h, rl, rr)
    else rl;;

検索関数。

let rec tt_tree_find x t = match t with Nil -> false
  | Leaf1(v) -> x = v
  | Leaf2(l, r) -> x = l || x = r
  | Leaf3(l, c, r) -> x = l || x = c || x = r
  | Node2(k, l, r) -> 
    x = k ||
      if x < k then tt_tree_find x l
      else tt_tree_find x r
  | Node3(k1, k2, l, c, r) ->
    x = k1 || x = k2 ||
      if x < k1 then tt_tree_find x l
      else if x < k2 then tt_tree_find x c
      else tt_tree_find x r

……ええ。汚いとは自分でも思ってます。思ってますとも。
再帰的な構造を意識した結果、返すものがいちいちヴァリアントになってますね。しかもそれの値を上でif文で評価して使う。いろいろ手間です。列挙型使ってまとめてしまうとか(それはそれでif文を使うことになるけど見易くはなる)何か出来たんじゃないかなと思います。
もしこの弱いブログを読んでくださった方が万が一にもいて、もし、もしもの話ですが、改善方法をご教授くださったら泣いて喜びます。流石に知恵袋とかでレビューお願いします、と投げるのはなんかなぁと思うので……贅沢ですね、すみません。

削除関数は省略。あまりに散らかったままなので、人に見せるものでは無いです。
なお、こちらのページの図がすごく参考になりました。2-3木ってなんぞや? から6時間くらいでだいたい理解し、削除関数以外実装出来ました。のんびりやっていた感は否めませんが。

ちなみにコードは提出したものの一部を切り取ってきました。提出物とかぶってる、コピペか、と怒らないでください先生。まぁこんなブログ見つからないと思いますけど_(:3 」∠ )_

タスク

ひぃぃぃぃ!
パターソン・ヘネシーを読むことになりました。その方面の研究をするなら常識、むしろ他の方面の人にとっての本であり、むしろそれを専門にするならヘネパタを読めという話ではありますが、とりあえずパタヘネです。
早く……早く読まねば……
やること多くて忙しいですが、充実感もあります。あとデスマっぽくないのが心に優しい。

DDR

先日、また判定のアプデがあったようで。少しだけ踏んで来ましたが、だいぶスコア出ますね。UNBELIEVABLE EDPで90万超えました。ライフ4抜けは難しそうですが。ひとまず15と16でライフ4抜けを増やしつつ、17を再クリア埋めします。体力取り戻さないとな……

Ocaml続き

タイトル変えました

末尾再帰大事。でも「末尾再帰の重要性!」なんてタイトルだとガチ勢の人に怒られそうなので、無難なタイトルに変更。

寝る

寝ましょう。人は寝るものです。寝ないと効率は落ちるしロクな事がありません。
だからといって夕方に寝てしまうと夜寝られなくなります。
また寝落ちしてしまった……明日こそはちゃんと起きていよう。

健康診断

アンケート適当に答えたり血圧測ったり(116-64)胸部レントゲン検査したり。
3週間後に結果が分かると言われても、忘れてしまいそうです。

Ocaml続き

モジュールを少し使ったり、stack overflowさせたり。

Printf.printf "hello, world! float : %f int : %d\n" 3.0 5;;
let l = Unix.gettimeofday();;
let rec random_ints max n =
  Random.int max :: random_ints max (n - 1);;
let long_random_int_list = random_ints 10000000 1000000;;

このコードで、random_intsのnが20万ちょっとくらいでstack overflowしてしまいました。
もうちょっと上手く、再帰を避けて書けばなんとかなるのかな……末尾再帰とかそういうのをこれまで意識していなかったので、ちょっと考えさせられました。

あと、以下のコードで変なエラー。型がおかしいと怒られた。

let measure n =
  let t0 = Unix.gettimeofday() in
  (* let v = これを書き忘れたら2行下でエラー *) hogehoge n in
  let t1 = Unix.gettimeofday() in
  if v then Printf.printf "OK %d elements in %f sec" n (t1 -. t0)
  else Printf.printf "NG";;

関数hogehogeに引数nを渡して実行時間のテストをするコードです。確かにlet無しだとinの意味がよくわかりません。うっかり「これの返り値は使わないから」とletを書かないでいると、違うところでエラー吐いて混乱してしまうので気をつけたい。

追記4/22 let無しだとただの比較文になります。

タスク

は特に無いのですが。やりたいこと、やっておくといいこと、くらいのことが山のようにあるので片付けたい。そのためにも夕方しっかり行動したい。そのためにはまずちゃんとした睡眠を。
ゲームも進めたいし、本も読みたいし、論文も探しておきたいし。なんだか、充実した大学生ライフって感じがしてきました! 嬉しい。
同じように本来なら自由なはずだった2年夏はサークルに食い潰されてしまったので、この4年次でやっとこんな素敵な思いが出来て泣きそうです。
でもエンジョイばかりしていると教授に怒られそうなので、ちょっと気が抜けないですけどね。

ゆびぷら

たまには音ゲーのことも書こうかな、って思って。
今週はチャレンジで隅田川夏恋歌を早々に引けたので、めっちゃ粘着してます。3難易度総合で週間1位取れるかも……? 上手い人がADVとかBSCとかやらないからなんですけどね(
ずっと昔から大好きな隅田川夏恋歌! いつか恋人が出来たら隅田川花火大会行きたいなって思ってます。ええ今は独り身ですとも! ええ!