ラベル 勉強 の投稿を表示しています。 すべての投稿を表示
ラベル 勉強 の投稿を表示しています。 すべての投稿を表示

2020年8月2日日曜日

久しぶりにオートマトンを勉強した

ソフトウェア工学輪読会


という勉強会を社内でやってます。
ソフトウェア工学という本を持ち回りで読んでいくのですが、その6回目を僕が担当しました。
内容はオートマトンとソフトウェアです。

大学2年生で「オートマトンと言語処理」という講義を取って以来です。
そのときは音声と言語処理に傾いた授業で、のちに「コンパイラや正規表現でオートマトンが使われているらしい」程度の知識を得ました。

改めて勉強してみると興味深い分野です。
オートマトン(状態遷移図)を書き起こすとソフトウェアが何をするのかが具体的になります。
さらに興味深いことに、数学的に考えることが可能であるということです。様々な拡張や表現を増やしていける余地があります。

というわけで、当日の発表スライドです。


輪読会で出た話


「Web系システムの中でオートマトンが活用できる事例はありますか?」という質問がありました。
輪読回ではメルカリ アッテの例を取り上げていました。内容を要約すると「多くの状態が存在し遷移先が多岐に渡るため、テスタビリティとメンテナビリティを向上するためにオートマトンを導入した」例です。ここまでオートマトンが使われているコードを見たことがないので、理論とソフトウェアとの繋がりを身近に感じました。(高山さん、ありがとうございました)


「状態遷移図書く場面ってなんだろう?」という話もありました。
テストエンジニアリングの観点で、権限周りを状態遷移図で描くとテストしやすくなります。
下の記事を読んでいると、権限周りだけでなく画面のテストにおいても使えそうだと思いました。 (カルバートさん、ありがとうございました)


今後


「動的に変わっていく振る舞い」はオートマトンや状態遷移図で表現できることがわかりました。
輪読会で出たオートマトンを実装する話の他に、FluxやReduxのように状態を管理するフレームワークを使う例もあります。今後はこの仕組みについて実装しつつ理解したいと思いました。

2017年10月22日日曜日

備忘録・ちょっと得した気分になるXORの話

先日、コードテスト試験の練習問題を解いていた時の話。

問題は権利的に書けませんが、その途中で見ていたXORについての得する話がありました。

本題の前に復習。
XOR(排他的論理和)は、真理値表で以下の振る舞いをします。(もっと詳しくはこちら)


入力出力
ABX
000
011
101
110

で本題。
このXOR、何に使われるかというと、ビット誤り検知や暗号に使います。
詳しくはこちらに譲りますが、XORには以下の性質があります。

A ⊕ B ⊕ B = A ... (1)

これがどのように使えるかというと、
「仲間はずれ抽出」に使えます。

例えば、「1, 2, 3, 2, 1」の要素がある時、全ての要素をビット化すると以下になります。


10進法2進法(ビット)
11
210
311
210
11

このビット列を(1)の式に当てはめると、

1⊕ 10 ⊕ 11 ⊕ 10 ⊕ 1 = 11 ... (2)

になります。見ての通り、仲間はずれの3が抽出できました。
ただし、おそらく2つ以上の仲間はずれの抽出はできません。(証明したわけではないです...。)


10進法2進法(ビット)XORの結果
初期値00
111
21011
3110
4100100
51011
6110111
71110
111
21011
3110

というわけで、ちょっと得した気分になれるXORの話でした。



2017年3月16日木曜日

【自分用メモ】英語勉強に使えそうなサービス

きっかけ

情報系のことをやっていれば、必然的に英語が必要になってきます。なぜなら、
  • プログラミング言語が英語。リファレンスも英語。Q&Aも英語。
  • 論文が英語。国際学会に出ると英語を喋ることに。
  • 留学生がいる。英語を話さないと。相手も英語が話せない場合も。
  • 5年後くらいには英語が社内公用語のIT系の会社がたくさん出そう。TOEICを採用試験に課す会社もある。
  • 日本語以外のサービスを作る。
などなど...。
というわけで、英語を勉強したくなるわけです。
でも、お金をかけたくない。しかも、面白い(モチベーション維持できる)ものがいい。
というわけで、今まで使ってきたサービスをレビューと共にまとめときます。(僕がTOEICを受けるのでTOEIC関連多めです。)

webサービス

  • Vocabulary.com
    • 無料。
    • 英単語を英語の意味で覚えられるwebサービスです。
    • 英単語リストも作ることができ、その問題も自動で作ってくれます。
    • また、他人の英単語リストも自分のリストにできるので、友達同士で共有したり、競い合ったりできます。
    • 難点は、全部英語。
  • FreeRice.com
    • 無料。
    • Vocabulary.comと同じで、英単語を英語の意味で覚えられるwebサービスです。
    • 最も特徴的なのは、正答した回数に応じて世界の難民に、会社がお米を提供すること。勉強しつつ、社会貢献もできます。
    • 提供したお米の数で、友達と競い合えば良いかと思います。
    • 難点は、全部英語。あと、問題が優しすぎたり、英語学習?と思わせる内容だということ。(もともと、英語圏の小学生向けコンテンツのため)
  • Test Your Vocabulary
    • 無料。
    • 英単語をどれだけ知っているか、語彙力を測るwebサービスです。
    • 語彙力が数字になって出るので面白い。ちなみに必要な語彙力の目安は、TOIEC600点(=英検2級)で4000〜5000単語らしいです。
  • 英語レベル診断テスト | アルク
    • 無料。
    • TOEICのミニ模試が受けられるwebサービスです。
    • 自分の大体のTOEICレベルがわかります。良い。

スマホアプリ

  • Poadcast & Radio & RSS Addict
    • 無料。
    • 様々なネットラジオが聴けるアプリです。
    • 話題な英語ラジオを取ってくることができるし、ニュースを解説を通じて聞くことができます。
    • 難点は、ほぼ英語。
    • ダウンロードはしましたが、1、2回で終わってしまった...。
  • 厳選したTOEIC TEST重要単語
    • 無料。
    • TOEICの単語を勉強できるアプリです。
    • 単語カードを解いていく形式です。
    • 難点は、古臭いこと。動きももっさり気味。
    • ダウンロードして、1、2分して消してしまった...。
  • TOEIC単語をゲームで学ぶ 英語無双
    • 無料。アプリ内課金あり。
    • TOEICの英単語を勉強しながら迫り来る敵を倒していくアプリです。
    • 英単語勉強 + Cookie clicker です。
    • 難点は、ほぼゲームなところ。ゲームが面白いので単語勉強にならない。
    • ダウンロードして2時間遊んで、勉強にならないことに気づき、消しました。
  • 英単語学習 えいぽんたん!
    • 無料。アプリ内課金あり。
    • 英語勉強をしながら、かわいいキャラクターを成長させていくアプリです。
    • 英単語勉強 + 育成ゲー。
    • 難点は、英語無双と同じく、ほぼゲームなところ。こっちは好きな人はやり続けそう。
    • ダウンロードして、30分くらいで消しました。僕は育成ゲーが好きじゃないかも。
  • 英単語アプリ mikan
    • 無料。アプリ内課金あり。
    • 英単語を段階ごとに勉強するアプリです。僕のイチオシ。
    • 1ランク100単語なのでサクサク次のランクに進めます。
    • ランクを上げるにもテストがあります。テストで合格しなきゃ次に進めません。
    • 単語帳が事前に作られているので、楽。
    • 運営が定期的にテストを作って、参加者を競わせています。僕はあまりやりませんが。
    • 高校生なら大会があるらしいです。優勝するとお金がもらえるらしい。
    • Pro版は月額1000円とちょっとお高い。グラフや色々な機能が追加されます。しかし、課金しなくても十分な機能があります。
    • 難点は、友達と競う機能がまだない。今後に期待です。
  • zuknow 友達とクイズで競える学習アプリ
    • 無料。アプリ内課金あり。
    • 英単語を友達と競いながら覚えられるアプリです。
    • 英単語を覚えるフェーズと、テストするフェーズがあります。
    • 最大の機能は、友達と煽り会える競い合えること。モチベーションが維持しやすいです。
    • オススメしたいところですが、サービス終了したみたいです。残念。
  • Duolingo
    • 無料。たぶんアプリ内課金あり。
    • 英語を総合的に覚えるアプリです。
    • ディクテーションもあるので、かなり覚えられると思います。
    • 難点は、文字を書くのが面倒くさいこと。たぶん、アプリ自体がスマホ向けではなく、タブレット向けなのかと思います。スマホだと入力がしづらい。

結局使っているサービス

mikanだけ。poadcastはごく稀につかうかも。

2017年3月13日月曜日

初めて確定申告をしてつまずいた話

初めて確定申告をしました。

というのも、TAのバイトで源泉徴収されていたからです。2,500円くらい。確定申告すると、払いすぎた税金が戻るらしいです。

2,500円かよ、それくらいでやるなよ。

そういう意見もあると思います。しかし、学生(ぼく)にとっては1週間分の給料です。なけなしのお金です。欲しいじゃないですか。あと、確定申告したことないので、社会に出る前に練習しておこう、ということでもあります。

どうやら期限があるらしい。

確定申告は期限があります。今年2017年は、3月15日(水)までのようです。(確定申告の時期、2017年はいつからいつまで?)

どうやらネットからできるらしい。

確定申告はネットからできるみたいです。e-taxというらしい。今回はe-taxでつまづいたことをメインに記事を書きます。

第1の壁:マイナンバーカード

マイナンバーカードか住基ネットカードが必要らしい。僕はマイナンバー持ってますので楽々スルー。

第2の壁:ICカードリーダー

マイナンバーカードのICチップを読み取らせないと申告できないです。接触型ICカードリーダーを2000円くらいでコジマで買いました。接触型で注意ですが、奥まで入ってないとエラーになりますので、物理層は確認しておいてください。僕はハマりました。

第3の壁:e-taxのソフト一式

ソフトがネットから落とせます。先駆者様がいらして、ここここを参考にしました。ちなみに、僕はmac book airで、Safari10.*です。ダウングレードはしなくていいみたい。

第4の壁:煩わしいシステム

いや、たぶん紙に書くよりは楽だと思います。思いますが、なんか古い感じのサイトですよね。途中セーブもできるけど、かなりアレなつくりです。お金がないんですかね?お金を扱っているのに...。

感想

ネットからできるのは良いですね。紙に書きたくないです。あと、紙面よりe-taxの方が還付が早いみたいです。処理が楽なのでしょう。ただ、サイトの作りをもうちょっとどうにかして欲しいです。あと、対応するブラウザがSafariのみって酷くないですか?ChromeとかFirefoxにも対応して欲しい。


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つあります、というわけでした。

2016年7月19日火曜日

GUIアプリを作ったことがない人がBCBでwindowsアプリをつくる・1

実験のために専用の実験アプリが必要になりまして。
研究室にある、アプリを作るソフトといえばBorland C++ Builder(BCB)がありまして。

BCBを使ってwindowsアプリを作る

ことになりました。GUIアプリを作ったことはないですが。(注:友達が作っているのは見たことがあります)

さて、BCBってなんだよ!って感じですね。

BCBはEmbarcadero社が売り出している統合開発環境(IDE)です。
IDEでは何ができるかというと、コードを書いたり、実行したり、デバッグしたり、バージョン管理したり、ビルドしてリリースしたりすることができます。しかも全て簡単に。(注:やり方を知っていれば)

BCBでは特にビジュアルコンポーネントライブラリ(VCL)が用意されています。
VCLとはアプリを作る上で必要なラジオボタン、チェックボタン、フォーム、タイマーなどが用意されて、一つのライブラリになっているものです。つまり、VCLを画面に設置していくだけでアプリが作れる。(注:動きのないハリボテアプリです)

ふむふむ、という感じ。
じゃあ作ってみるかー。

 (´・ω・`)
_(__つ/ ̄ ̄ ̄/_
  \/     /
     ̄ ̄ ̄ ̄

 (´・ω・`)
_( つ ミ  バタンッ
  \ ̄ ̄ ̄\ミ
     ̄ ̄ ̄ ̄

 (´・ω・`)
_(   )
  \ ̄ ̄ ̄\
     ̄ ̄ ̄ ̄
わからん...。

何がわからんって、まずボタンが多すぎる。ソースツリー?インスペクタ?プロパティ?
よくわかんねぇよ!!

というわけで次回につづく。
(追記2016/12/17: つづきません。一応、作ったものは使われています。)

2016年7月12日火曜日

paizaコードガールこれくしょんのpython編を終えて

1ヶ月くらい前からちょくちょくpaizaのコードガールこれくしょん(以下コードガール)をしています。
きっかけはPythonを使う・教えるようになったから。

機械学習や構文解析をするときはPythonは必須みたいなところがありますね。
また、低級言語(CやC++)よりも軽量言語(PythonやRuby)の方が学びやすいのかもしれません。(アーキテクチャを知る上では低級言語を学んだほうがいい気もするけど)

コードガールではRuby、Java、PHP、Pythonが学べて、私はPython編を終わらせたというわけです。
感想は、

自分でweb検索して勉強するほうが早い

です。
私はCやC++、Rubyでプログラミングできるので、web検索でPythonの構文を覚えるのは難しくないです。
しかし、

反復練習にはもってこい

です。
1 ~ 17章くらいまであるのですが、標準出力から制御構文、標準入力、乱数くらいしかやらないです。つまり、徹底的に覚えるわけです。
さらに、

タイピングの練習にもなる

のです。
というのも、このゲームでは速くクリアするほど得点が多いのです。したがって、プログラミングもタイピング練習も同時にできるのです。

ちなみに、コードガール「これくしょん」と付いているので、ガチャの要素があります。
しかし、課金は一切ありません。だから、まわし放題。

ガチャ欲と勉強欲が満たせるので、疲れたときの息抜きでやってみるのがオススメです。