2017年1月13日金曜日

【TAネタ】parseDoubleメソッドにはthrowが1つしかないのに、APIには2つあるのはなんで?

きっかけ

プログラミングが得意ではなかった1年生が4年後にTAをやるなんて思いもしなかった...(遠い目)

僕はTAでレポートの仮採点をしています。その時の質問をネタにしました。

parseDoubleメソッドにはthrowが1つしかないのに、APIには2つあるのはなんで?

JavaにはparseDoubleというメソッドがあります。このメソッドは、変換可能であればString型の文字列をDobule型の数値に変換することができます。

さて、APIを見てみるとこんなことが書いてあります。





Throws:
NullPointerException - if the string is null
NumberFormatException - if the string does not contain a parsable double.

どこが問題かと言うと、parseDoubleは最初に、

public static double parseDouble(String s)
                          throws NumberFormatException

と書いているのです。


NumberFormatExceptionはthrowで明示されているのに、NullPointerExceptionはどこでthrowされているのでしょう?

これを調べるにはJDKの実装を見てみるのが早いと思いました。
openJDKのDoubleを読んでみると、537行目にparseDoubleがあります。

public static double parseDouble(String s) throws NumberFormatException { 
 return FloatingDecimal.parseDouble(s);
}

どうやらFloatingDecimalに処理を投げているようです。
FloatingDecimalを読んでみると、109行目にparseDoubleがあります。

public static double parseDouble(String s) throws NumberFormatException {
 return readJavaFormatString(s).doubleValue();
}

どうやらreadJavaFormatStringに処理をなげ(ry
同じクラスの中にあるようです。1830行目にありました。

static ASCIIToBinaryConverter readJavaFormatString( String in ) throws NumberFormatException {
 boolean isNegative = false;
 boolean signSeen = false;
 int decExp;
 char c;
parseNumber: 
 try{ 
  in = in.trim(); // don't fool around with white space.
                   // throws NullPointerException if null 
  int len = in.length();
  if ( len == 0 ) {
   throw new NumberFormatException("empty String");
 }

ここで注目なのはin = in.trim()です。コメントにthrows NullPointerException if nullとあります。inはString型のフィールドです。どうやらinがnullの時、trimをするとNullPointerExceptionが投げられるようです。どういう仕組みでしょうか?(まあ、ここで調査を打ち切ってもいいのですが、納得するまで続けます。)

trimはStringクラスにあります。2867行目にあります。

public String trim() { 
 int len = value.length;

valueはchar型の配列です。lengthは長さを返します。
もし、value = nullの時、value.lengthはNullPointerExceptionを投げます。
Javaでは配列が「null」か「長さ0」かで意味が異なります。(引用: nullか長さ0の配列か)
長さ0ならNullPointerExceptionは投げないはずです。

結論

parseDoubleの内部でString型のフィールドに対してlengthを取っているため、その時に
NullPointerExceptionをthrowする。そのため、throwが2つあります、というわけでした。

2017年1月12日木曜日

texstudioの設定が変更されていた件

きっかけ

ちょっと前にMacをEl Capitanにアプデしました。
あんまりTeXも使う機会はなかったのですが、修論も近いので久しぶりに動かしてみることになりました。

ところが、動かない!

なんで??
そういえば何か重大な変更があったような...というのを思い出した次第です。

なんで動かないの?

僕は普段、TeXstudioを利用しています。優れものです。
ところが、コンパイルを押すとcommond not foundが返ってくるのです。
TeXstudioの環境設定を見ると、/usr/local/texbin/の中のコマンドを指しているようです。

ところが、El CapitanからRootlessのため、/Library/以下にtexコマンドが移ったようです。(引用: TeX界の El Capitan 迎撃戦記)

というわけで

簡単です。/Library/以下からtexコマンドを見つければ良い。
僕の場合、/Library/TeX/Distributions/Programs/texbin/にありました。
設定を書き換えて、終了です。
おつかれさまでした。


2016年12月29日木曜日

Doxygenのメモ

きっかけ

ちょっとだけDoxygenの勉強をしたのでメモっておこうかと。
(引用元はわすれました、ごめんなさい。)

メモ

# Doxygenの書き方

## ソース内ドキュメント
/*
 * 
 * 
 * 
 * 
 */

## 書き方
ファイルのはじめに書くもの
/**
 * @file ファイル名
 * @brief 一行要約を書き入れる
 * 
 * @par パラメータ(引数,returnする値)
 * @date 日付
 * @date 更新するたびにつける
 * @author 作者、筆者
 */

関数毎に書くもの(関数ドキュメント)
/**
 * コメント
 * @param 引数の説明
 * @param 引数の説明
 * @retunr returnする値
 */

ドキュメントに残るコメント
/** @var 変数の説明 */
/** @struct 構造体の説明 */
/** @class クラスの説明 */
/** @exception 例外の説明 */

ドキュメントに残らないコメント
/* */

非推奨コメントアウト
/*
こーど
*/
/*
こーど  
*/

推奨コメントアウト
//コード
コード

2016年12月28日水曜日

クリスマスイブにRaspberry Piでイルミネーションを作った話。

きっかけ


  • Raspberry Piが余っていたから
  • クリスマスまでに何かしたかったから
  • 外で見た自転車を漕ぐと点灯するイルミネーションを見たから
  • 友達に「工学部だからキーボードで点灯するようにしたら」と言われたから
  • 本屋で見たイケメンが「Raspberry Piで何か作りてーな」っていう意識高いことを言っていたのがムカついたから

参考にしたもの

やりたいことはLチカ(LEDをチカチカ点灯させること)だったので、以下を参考にしました。

さっそく

できました。

キーボードを叩くと、
点滅します。

仕組み

まず、OSの準備からですが、第8回「2皿目のラズベリーパイ!Model B+のスピード調理に書いてあるので割愛します。

次に、ブレッドボードにLEDと抵抗、導線を次のように置きます。

ちなみに置きかたについても、第9回「ラズベリーパイで電子工作!Lチカ…の前にLピカ!」に書いてあるので割愛します。

LEDを光らせる電源として利用するのはRaspberry PiのGPIOです。
GPIOはRaspberry Piからの命令を電気信号で送る部分のことです。

LEDは次のようにつなぎます。抵抗を反対につなげると光りません。

GPIOのピンは次のような配置になっています。
黄色丸は命令が来るピンで、黒丸はアース(接地)のピンです。ちなみに、濃い黄色丸や赤丸は安定して電気が流れているピンです。
使用しているのはRaspberry Pi B+なのでA+と比べ、ピンの本数が違いますが、左から26本目までは同じらしいです。

今回は、3、6、14を利用します。(14番は本当は必要ないんだけど、接地まで導線が届かなかった...。)

さて、この3番のGPIOに電気信号を流す方法です。
Raspberry Piのターミナルを開いて、次のコマンドを打ちます。
すると、/sys/class/gpio/内に、gpio2へのエイリアスが作られます。
ここで、次のコマンドを打ちましょう。

これで点灯テストは終了です。

次に、点灯させるためにキーボード入力の検出をしましょう。
とは言っても、調べてみると、キーボード入力のイベントハンドラ(キーボードで打ち込んだら動くプログラム)を検出しないといけないので、ちょっと面倒くさい。
なので、標準入力を使いましょう。

OSには標準でPython2と3が入っているので、2を使います。(3を使ったほうがいいことはわかりますが、調べた方法では3が使えなかった...。)
次にこのコードを書きます。text editerが使いやすいかも。
そして、python2 getch_test.pyで実行しましょう。(実行する前にgetchをインストールしておきましょう。pip install py-getchでできます。)

これでキーボードをカタカタすると光るはずです。

感想

目的は一応達成しました。とにかく、

「クリスマスの光は僕らのタイピングでできているんだ...。」がやりたかった。

反省点としては、
確かに光るんだけども、消えたりしないでほしい。交互に光ってほしい。反転するようにしたら良いかも。GPIOピンを2つ使えばいいかな。
あと、LEDの数が少なくてしょぼい。悲しい。
くらいです。来年もやりたいな。修論...。

2016年12月22日木曜日

「よくわかる人工知能」読了

清水さんの「よくわかる人工知能 最先端の人だけが知っているディープラーニングのひみつ」を読みましたので、感想を書いてみようかと思います。

きっかけ

そもそもなぜこの本を読んだかというと、TwitterにKindle版発売の情報が流れてきたからです。(あまり覚えていない)
実際、清水さんのページを見てみると、いろいろ興味をそそるものが書いてあるわけです。
「人工知能って漠然としてて何だろう?情報工学(?)を学んでいる身としては読んでおきたい!」と思った次第です。

僕の前知識

人工知能ってニューラルネットワーク(NN)とか深層学習(DNN)とかでしょ。仕組みはわからないけど知ってます、仕組みはわからないけど。
あと、なんだっけCNNとかRNNとかChainerとかTensor flowとかいろいろあるよね、よくわからないけど。ああ、並列計算もするよね。CUDAだっけ。Geforceが云々...。

これくらいの断片的な知識しかありません。

読んでる最中の僕

「はえ〜すっげ〜。なんでもできるやん。」
「一部では人間よりもいいじゃん。」
「あー、そういう方法があるのか。これってあれに応用できるよな...。」

読んだ後の僕

「人間ってどうなってしまうんだ...。」

最後の疾走感がすごかったです。
特に、人間の進化について。
宇宙規模のネットワークになるって話には「マクロスF」かな?ってなりました。
インプラントみたいな技術は出来始めているらしいから、あと5年くらいでいろんなニュースが生まれそうです。

僕の断片的な情報はパズルピースを埋めるように繋がっていきました。
DQNのような強化学習は面白そうです。オートエンコーダは使ってみたいですね。


2016年7月28日木曜日

BCB10.1 Berlinにアップグレードできました!

この前のつづき。
進展があったので書きます。

進展あったよ

問い合わせのメールをembarcadero社から連絡があって、
弊社のサーバーエラーでした
とのことでした。とほほ。連絡してよかった。(一応、サーバーエラー時のやり方も教わったけども)

気をとりなおしてつづける

windows 64bit版と32bit版を選ぶ。(動かないことがあると困るから念のため)
パッケージはすべて選んでおいた。(動かないことがあるとk(ry)

完成

とりあえず、インストールできました。( ^ω^ )

2016年7月26日火曜日

BCB10.1 Berlinへアップグレードしてたけど...

きっかけ

研究室のC++ Builder(以下BCB)がXE6なので一気に10.1へアップグレードする、というお話。研究にも使うので。BCBについては前に話した通り。

さっそく落とすぞ

embarcadero社のページからメールが来ていたので、それに従う。
3分くらいでセットアップファイルを落とせる。

実行してみると、ウィザードが始まる。
するとembarcadero社から送られてきたSerial Numberと、ESDのユーザ名、パスワードを打ち込めと出るので打ち込む。

... 1分後。

Internal server error ??
サーバーからダウンロードできなかったらしい。

あれ?エラー?

んー。探す?
するとこんなのが。試してみます。

  • 今あるC++builder 関連のソフトをアンインストールする。 -> Internal Server Error
  • isoファイルを利用してインストールする。 -> Internal Server Error
  • ライセンスに関連するファイルを消す。-> Internal Server Error

だめだ。できない。
学科にあるUTMが原因かな?それとも、ファイアーウォール?
とりあえずissueを出しておきます。