エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

プログラミングの初心者を抜け出すための習慣の感想と要約

きっかけ

ソニックガーデンの倉貫のブログはよく見る。
かなり感心したので、自分の考えと経験を踏まえてまとめてみる。

感想

エラーが出ても慌てず、メッセージを読もう

エラーをググって、解決法を片っ端から試すってことを、初心者のうちはよくしてたなぁ~って思い出す。
本当にやるべきは、吐き出したエラーの意味を理解して、正しく対処すること。

書いている意味がわからない状態だと、ググって調べた解決法を試して、さらなる深みにハマることが多々ある。

ググるってのが、さらなるエラーを呼び出す可能性を忘れてはイケない。

ネットの情報を鵜呑みにしない

エラーが出ても慌てず、メッセージを読もう と同じ。
ネットの情報を鵜呑みにした結果、さらなるエラーを呼び出す可能性が高い。

状況を理路整然と書いてあるかどうかも分からない。
特に多いのが、環境情報をまったく書いてないこと。
だから、読み間違うことが多い。
ブログ書く場合は、環境情報をきちんと書く必要がある。

公式ドキュメントから読もう

難しいね、これは。
ボリュームもそうだが、言い回しが面倒なときもあるんだよね。。。

あと、意外と知りたいことが書かれてないこともある。
たまに、分かっている前提の記載がある気がするわ。

ギャグセンスも必要だと思うんですよ。ドキュメントってのは。
面白くかけるかも、ドキュメントには必要だと思うのです。

当てずっぽうで試していかない

エラーが出ても慌てず、メッセージを読もう と同じですね。
あとは、ログをちゃんと読んで、時系列と動作状況を認識しないと、いろんなひとを誤解させてしまう。

未知のものは、まっさらな環境で試そう

不穏分子があると、未知はより大きな未知になる。

なるべくクリーンな環境を作る必要がある。
あと、そのクリーンな環境を簡単につくる方法を用意しておくと良いだろう。

ライブラリを見つける力と目利きを鍛えよう

プログラミングは、何かしらのライブラリを使うことが多い。
俗に言う、「車輪の再発明」をしないため。

だから、ベストな開発をするためにも、便利な環境が必要だと思う。

大雑把に理解できる力を身に付けよう

なんでも全部調べていたら、キリがないのです。
必要な知識レベルを見計らって、適度な内容で撤退するのも、時間をうまく使うという意味ではあり。

深入りする前に、本当にそこまで必要なのか、考えても良いでしょう。

一度に大きく作ろうとせず、小さく進めよう

これな、一気にやろうとして、どこまでできていたのか分からんパターン。

だいたい、自分に自信があるやつが陥るパターンやで。
昔の俺がそうだった。

自尊心が高いやつほど、気をつけないといけない。

「正しく動く状態」をキープするってのが大切。

コミットする前には、動作確認しよう

コミット前にはテスト。

正しい状態を保つための基本

最初にTODOリストを作ってから、始めよう

だいたい、一つのことに熱中すると、やることは大抵忘れる。
だから、TODOリストは必要なのだ。

頭で理解しきれないなら、絵にしてみよう

字にしても、関係性は見えてこないことがある。
イメージに落とし込むことで、理解が簡単になることもある。

字ってのは、頭のメモリをいっぱい使うので、注意が必要なのだ。

メンテナンスの前に、コードを読み込もう

内容理解してからやらないと、オヤシロ様の祟りが起きます。本当です。

指示語の対象設定

前回

suzaku-tec.hatenadiary.jp

やったこと

なんとなく、文章や説明を見ていて、おそらく、前の文の主語を指している可能性が高いと思った。
あと、その主語に連なっている修飾語もそうなっているのだろう。

正常な文章を書いてあったら、そうなると思いますわ。

特に、主語の名詞を指しているような気がしてならない。

下記のアルゴリズムで、指示語が指しているものを見つけるようにした。

  1. 指示語がある文を抽出する
  2. その文の前の文を取得する
  3. 取得した文の主語を取得する
  4. 取得した文の名詞を、指示語の対象語にする

まだ、テストケースが少ないので、本当にあっているかは微妙なところだが、なんとなく近しい値な気がする。

もっといろんな文章をみて考える必要があるな。。。

今後

今後のタスクは、以下の書いておいた

Task · GitHub

思ったけど、Githubのタスクボードみたいなやつ、かなり使える。
かゆいところに手が届くとまではいかないが、いちいちExcelとかでタスク一覧書かなくてもいいのが、いいと思いました。

参考サイト

指示語(こそあど言葉)を学ぼう - 国語の文法(口語文法)

指示語の内容を正しく把握する:【国語の達人】中学受験の合否は国語で決まる!読解力を上げる勉強法

国語の問題などで、指示語が理解できません[中学受験合格言コラム]|ベネッセ教育情報サイト

WordNetの試し実装

きっかけ

文章を解析するようになったけど、意味合い的に同じなのかチェックしたくなるだろうって思って、実装について調べた。

実装

build.gradle

group 'kuropaper'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    // https://mvnrepository.com/artifact/de.sciss/ws4j
    compile group: 'de.sciss', name: 'ws4j', version: '0.1.0'
}

resources

src/main/resoces 配下に、下記リンクのjawjaw.conf, similarity.confを置く。
たぶん、クラスパスが通っている箇所なら、どこでも大丈夫だと思う。

ws4j/config at master · Sciss/ws4j · GitHub

そんでもって、同じディレクトリにwnjpn-0.9.dbっていう辞書のDBファイルを置く。
中身は、Sqliteらしい。

http://compling.hss.ntu.edu.sg/wnja/data/1.1/wnjpn.db.gz

かなり大きなファイルなので、githubとかにあげるときは、要注意。

mainファイル

mainとなる実装。
とりあえず、下記をコピペ。

import edu.cmu.lti.jawjaw.JAWJAW;
import edu.cmu.lti.jawjaw.pobj.*;
import java.util.Set;

public class Sample {
    public static void main(String[] args) {
        // "買収"(動詞)という単語から得られる関係の一部をデモします
        new Sample().run( "買収", POS.v );
    }

    private void run( String word, POS pos ) {
        // ファサードから日本語 WordNet にアクセス
        Set<String> hypernyms = JAWJAW.findHypernyms(word, pos);
        Set<String> hyponyms = JAWJAW.findHyponyms(word, pos);
        Set<String> consequents = JAWJAW.findEntailments(word, pos);
        Set<String> translations = JAWJAW.findTranslations(word, pos);
        Set<String> definitions = JAWJAW.findDefinitions(word, pos);
        // 結果表示
        System.out.println( "hypernyms of "+word+" : \t"+ hypernyms );
        System.out.println( "hyponyms of "+word+" : \t"+ hyponyms );
        System.out.println( word+" entails : \t\t"+ consequents );
        System.out.println( "translations of "+word+" : \t"+ translations );
        System.out.println( "definitions of "+word+" : \t"+ definitions );
    }
}

思ったこと

似たような文言を取ってこれる。
うまく使えば、文章の近似性を求められそうな気がする。

不満点は、初期化処理に10秒くらい時間がかかること。。。
どうにかならんもんかね?
SqliteのDBファイルをメモリ展開しているみたいだが、毎回DBアクセスだと遅いのだろうか?

実装にかなり疑問がある。

あまり、偉そうなことは言えないが。。。

実運用にするようになったら、考えよう。。。

参考サイト

日本語WordnetのJavaフロントエンドを利用して,類義語の検索を行った. - へっぽこ修士の忘れ物

WordNetをJavaから使う | Apitore blog

日本語 Wordnet

【愚痴】資格試験が終わった

今日は、情報処理試験だった。
受けたのは、データベーススペシャリスト

受験しての感想は、玉砕ですわ。。。

午前免除の期間が過ぎたので、午前1から受けたけど、難易度高すぎないか?
過去問やっているけど、過去問のレベルとは明らかに違う問題がある。
クロック精度って、どうやって計算したらいいねんって思いましたよ...
この試験考えたやつはクソ野郎だと思いました。

午前2は、過去問解いてればある程度できる。
知らない問題は、ほとんどなかった。

午後問は、お察しですね。。。

当初の予定だった、30代での高度試験合格は叶いませんでしたな。。。
もう、お終いだ~。このままオシマイダーになりたい。
そして、キュアアンジェに浄化してもらいたい。

今後の試験予定

とりあえず、ネットワークスペシャリストかな、次は。
あと、日商簿記

日商簿記は、全然業務と関係ないけど、株をやるようになって欲しいと思うようになった。
企業の財務諸表を読み解くのに、勉強が必要で、その力が付いたか判定するのに日商簿記で実力だめししたくなった。

あと、最近思うのだが、弁護士試験って俺でも取れそうな気がしてきたのだが、気のせいだろうか?

Typescriptの型とデータ構造で相当悩んだ話

きっかけ

くだらないことで相当悩んでしまったので、戒めのためにのせる

内容の詳細

どういったことが起きたかと言うと、HTTPでデータの受け渡しをする際に、データ構造を間違えて渡しているのになかなか気づけず、1日近い時間を無駄にしてしまった。。。

簡易的な例

似たような事が、下記のような内容。
本当は、test.a の内容を表示したいのだが、実際は、undefinend。
なぜ違うんだ?ってかなり悩んだ。

class Test {

  main(): void {
    const args = { test: { a: 3 } };
    new Sub().execute(args);
  }
}

class Sub {

  execute(test: any): void {
    console.log(test.a)
  }
}

new Test().main()

マジで恥ずかしいぜ。。。

どうすれば良かったのか

デバックとかも、同じ名前だったので、ちゃんとあるじゃンって思ってしまいました。
目がイカれているのでしょうね。。

個人的に考えた結果、やっぱり、any型を消すことだろうな。
必ずなくせばいいってわけでもないが、なるべく消したほうが無難でしょうね。

でも、それでも発生するよな。。。
実行時に型の情報が消えるから、実行時に予想してないデータ構造になると、アウトですわ。。。
とくに結合が疎になるネットワーク越しは、発生しやすいでしょうね。

なので、ネットワーク越しでデータがうまく連携できなかったら、渡せてないと一緒に、構造がおかしいっていう選択肢を入れて考えないとイケないですな。。。

構文はある程度解析できたが。。。

suzaku-tec.hatenadiary.jp

ある程度

ある程度、文章の構造の解析には成功したが、意味解析が全然できてない。。。

だから、並列関係にあるんだろう~というのは見分けられたのだが、それが概念的に同じ分類なのか、形態素解析からは判断できない。。。

調べた結果

なんとか意味解析できないか調べたら、いくつかあった。

どうも、やりたきことを実現するには、「シソーラス」ってやつらしい。
シソーラスって言われると、weblioの時点を思いつくんだが、そういうことなのだろうか?

類語辞典・シソーラス・対義語 - Weblio辞書

国立国語研究所の分類語彙表やNICTの日本語 WordNetがあるらしい。
日本語 WordNetについて調べたが、使えそうな気がする。
どうも人手でメンテしているようだが、アップデートが滞ってないかだけ心配。。。

あとで試す。

参考サイト

自然言語処理用語と解析器まとめ - Qiita

【API】日本語WordNetの全内容にアクセスできるWebAPIを公開した | Apitore blog

日本語 Wordnet

GitHubにプッシュするようになって思ったこと

注意

これはただの感想の羅列なので、真実かどうかは別問題です。

感想

ソース書く時間って、時間に縛られた働き方をしていると、まったくできない。

この時間は会社にいなければならないっていう制約があると、セキュリティ的にGitHubのソースも修正したりできない。
暇な時間ができても、ただ待つしかできないのがもどかしい。
暇なときにハッと思いつくことがたまにあるのだが、即座に反映ができない。
家に返ってからやろうとするけど、大抵は忘れている。。。

特に、即座に試して発想を昇華できないので、損をしている気がしなくもない。
時間の消費も、もったいなく感じる。

そうなると、自然と個人のソースを書く時間は、土日などの休みになってしまう。
多種多様な働き方は、プログラマーにこそ必要ではなかろうかって思い始めた。