l_n_m’s diary

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

余計な符号拡張

符号拡張

まず符号拡張ってなんぞや? ってところから
例えば16bitの値があったとします。
1000100010001000
でいいや。
これを32bit、つまり1byteの数字として扱いたいとしましょう。では、これは上に0をくっつけて、
00000000000000001000100010001000
でいいのでしょうか?

いい場合もあれば、悪い場合もあります。
2の補数表現をしている場合、最上位bitが1ならその数字は負の数です。それに0を補ってしまうと、正負が変わってしまいます。値も変わってしまうけれどそこの説明は省略。よく考えれば分かることだし。

というわけで、最上位が1ならば1を補って、
11111111111111111000100010001000
とするのが符号拡張です。
C言語で言うunsigned(符号なし)では、いつでも0を補えばOKです。

同様に、1byteしかないchar型を4byteのint型として解釈するときにも符号拡張したりしなかったりします。というか自動で符号拡張されます。その話をこれから。

charを扱う

C言語で文字を表すchar。へーきへーきwと思っていたら落とし穴がありました。
UTF-8で3バイト文字の「七」を解釈したとき、「0xe4b883」となるはずです。しかし、それぞれの文字(e4, b8, 83が出てくるはず)を表示させると、
ffffffe4, ffffffb8, ffffff83
と表示されてしまいます。

しばらく悩んでいましたが、ネットで調べてみたら符号拡張のせいだと判明しました。
1byteしか無いchar型をint型の整数として扱うとき、内部で4byteに拡張してから使います。char + intは、内部でint + intにされています。それはそう。
さて、お気づきかとは思いますが、char型の変数の最上位bitが1だったら?

そう。0xe4 = 0b11100100ですから、最上位bitが1。
符号拡張されて11111111111111111111111111100100となってしまいます。
そのせいで余計なfがいっぱい出てきていたわけですね。

解決

さて、そうと分かれば話は早い。char型ではなくunsigned charとして扱ってやればOKです。符号拡張されず、上3byteは0で埋められます。

漢数字を数字に変換するプログラムなんかでは必要な知識ですね。
というわけで、符号拡張の落とし穴でした。
アルファベットとか数字とかを扱っている分には全く影響無いので、昔プログラムに慣れていない頃には気付くこともありませんでした。問題にならなければ気付きようがないもの。

IEEE754……?

IEEE754

みなさんご存知、浮動小数点の標準規格ですね。
0.1+0.2が0.300...004になることで有名。

研究室のイベントで本を読んでいたのですが、改めて整数や浮動小数点の表現を学びました。こういうのの規格を定めるのって考えること多くて大変そう。

指数と仮数

1.xxxxxx * 2^yyyy

この形で浮動小数を表します。
32bit : 1 : 8 : 11
64bit : 1 : 11: 52
順に、符号、指数、仮数を表します。ここで、指数の部分は下駄履き表現されています。0x0なら-127とか-1023とか。

なんで下駄履き表現?

ソートしやすくするためです。
符号を頭につけているのは0との大小をすぐに分かるようにするため。
指数が、例えば2の補数表現だと、符号なしで見たときに大きい数字のとき、実際にはとても小さい数字になっています。それだと指数の大きさでソートするのが面倒。
そこで、0b000 < 0b111 のようなことが常に成り立つように(ビットで見ると、2の補数表現では0b000より0b111の方が小さいですよね)しています。賢い。

境界値問題

CodeIQがYouTubeに出している、jsに関する広告。
0.1ずつ足していくと、0.1, 0.2, 0.30...04, 0.4, 0.5, 0.6, 0.7, 0.799...9, 0.89...9, 0.99...9となってしまいます。
ループをするときには気を付けないと。
しかし、jsの問題と言いながら実際はIEEE754に関する知識を問う問題ですね。
整数がどんな表し方をされているかは正直常識の範囲だと思いますが、浮動小数点は頭から抜けている人も多いのでは。
「1.xxx * 2^yyy」という文字列を見れば、あーそういえばそうだったな、っていう人も多そう。僕がそうでした。くぅ……

教訓

言われて分かる、はまだ二流。調べるまで完全に抜け落ちていたのは不覚……!
当たり前のことでもちゃんと胸を張って説明できるようにならなきゃ、ですね。

愚痴

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

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

この関数は何をするんだろう……いちいち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(普通そのくらいといえばそんなもんかもしれませんけど)、何に時間取られてるんでしょう。ぼーっとしてる時間があったり、手際が悪かったりするんだと思います。テキパキこなさねば。

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