エンターテイメント!!

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

jshellを使いたくなった瞬間と正規表現

きっかけ

こういうときに使いたいって思ったので、記録として残しておこうかと。

詳細

文字列分割を試みたのだが、予期した状況と違っていた。

いちいち確認用のクラスを作るのは面倒くさかったので、この際、jshell使ってみるとかと思い使った。

やりたかったことは、"遅く起きた。だから、授業に遅刻した。" っていう文を、 文字含んだ状態での分割がしたかった。

まずは、初期の実装。

"遅く起きた。だから、授業に 遅刻した。".split("。")

これだと、結果は、["遅く起きた", "だから、授業に 遅刻した"] になって、予期した結果と違った。 いろいろ調べた結果、後読みってのが使えればいいという結論に至った。

"遅く起きた。だから、授業に 遅刻した。".split("(?<=。)")

これで、["遅く起きた。", "だから、授業に 遅刻した。"] にできた。

結論

  • 正規表現は面倒くさい
  • 使って知識を得るものに対してjshellは有効

言葉の説明が難しいものが世の中にはあって、それを試すのにjshllは有効そう。
それが顕著にでるのが、正規表現な気がしますわ。

正規表現がやりたいことを満たしているのか、実行してみないと分からないからな。。。
サンプル見るけど、本当に理解したのとあっているか、実行してみないと分からない。

正規表現って、もっと簡単に覚えられないものなのか?
使っていると、知識が足りないとかなり苦労する。

参考サイト

正規表現の先読み・後読みを極める! - あらびき日記

[JAVA] 文字列を区切って区切り文字も含める | ぷすぅ~ぷすぅ~

[コラム] 正規表現の先読み/後読みは、どう考えても名前が悪いので、呼称禁止令を出してルックと気軽に呼んでみませんか。 - Qiita

修飾語と被修飾語で、1日ずっと神経をすり減らした。。。

前回記事

suzaku-tec.hatenadiary.jp

連体修飾語と連用修飾語

連体修飾語と連用修飾語の振り分けにかなり苦戦した。。。

主語、述語は分けられたけど、連体修飾語と連用修飾語が難しい。。。

主語や述語の前にあるのが修飾語でしょって安易に考えてたけど、かなり痛い目にあった。

格助詞

キーは、格助詞。

格助詞で「を・に・へ・で」が来れば、格助詞決定。
あとは、主語、述語以外で、活用のあり/なしで連体修飾語と連用修飾語を決めた。

見分け方でかなり悩んだ。。。
土曜の朝から日が変わる直前まで悩んでた。
TDDで開発してるんやけど、全部テストクリアすると、マジで気持ちいい。

強制修飾

これも結構悩んだ。

連体修飾語は、体言にしかかからないと思ったけど、例外もあるのが、かなり悩んだ。
逆も然り。連用修飾語も用言以外にかかることがある。

自分の実装は、読点がある文節があれば、今まで修飾させることができなかった修飾語は、強制的に修飾させている。
なぜそうしたかというと、さすがに読点をまたいで修飾関係になるような文は、文として成り立っていないと思ったから。
いろいろ考えたけど、読点またいだ修飾関係の文を考えることはできなかったわ。。。

実はありますってのがあれば、教えて欲しいものだね。

参考サイト

修飾語について学ぼう - 国語の文法(口語文法)

品詞の分類をマスターしよう - 国語の文法(口語文法)

格助詞の覚え方 | 国語の先生が教える国語文法

日本語勉強してみての感想

日本語って、助詞・助動詞の力がかなり強い。
もちろん、動詞・形容動詞・副詞なども重要だけど、英語を勉強したときには助詞ってあんまり意識したことはなかった。
日本語をより探求するには、助詞を理解することが大切な気がする。

あと、品詞を見分ける力が超重要。
品詞の情報を見て、どれがどういう関係になるのか、かなり悩んだわ。。。

次回タスク

  • 指示語の情報付与
  • 命令系・過去形・断定などの文章の特徴情報の付与
  • 文同士の関係情報の付与
  • デバック用の情報出力機能の実装

愚痴

かなりストレス溜まったわ。。。
考えても考えても、理詰めできない感じがして、ものすごいツライ。。。
日本語の文節の説明って、システムチックな説明じゃないのが、腹立たしい。
よくあるのが、意味が通る/通らないで判別ってのが、マジで意味不明だった。
システム的に、こうだから、これは適用されず、この条件の文節に適用されるって感じで説明してくれないと、システム化できへんねん。。。

そう考えると、人間の考える能力って素晴らしいと感じますわ。

おかげで、情報処理の資格試験の勉強、まったく未着手状態。。。

ストレス解消

もう、ものすごいストレスを溜めた気がする。
ストレス解消のために、ToLOVEるのデジタルカラー版を買ったので、これから読みますわ。

github

GitHub - suzaku-tec/kuropaper

主語と述語の判定が難しい。。。

前回記事

suzaku-tec.hatenadiary.jp

難しい

主語が複数出てきたり、主語っぽいけど、文全体を見たら主語じゃないってのが面倒くさい。。。

面倒くさいパターン

「~こと」、「~いる」ってのが、動詞・助動詞の判断だけでは述語認定できないようになっている。

「~こと」

例えば、「言うことを信じない。」とか。
文節分けすると、「言う/ことを/信じない。」ってなる。
そうすると、動詞は「言う」「信じる」だから、述語は「言う」「信じない」の文節が助動詞になる気がするが、違う。
「言う」は、後述の文節に「こと」が付いているため、名詞と同じような扱いになる。
そのため、「言うことを信じない。」は、述語は「信じない。」だけになる。

「~いる」

これは、なんとなく予想が付く。
英語で言う現在進行系だね。
日本語を形態素解析すると、単語的に別れてしまうのが、ものすごく痛い。。。
だから、扱いとしては、「~いる」でつながっている動詞は、一つの単語として扱う必要がある。
だけど、文節的には別々になるから、いろいろと面倒くさい。

例えば、「待ち望んでいる。」って文章。
文節分けは、「待ち望んで/いる。」になる。
しかし、述語として扱えるのは、「いる」だけ。
だから、後続で「いる」がある場合は、述語として扱わないようにする必要がある。

ちなみに

アルゴリズムとしては、下記のようにして回避した。

  1. 文節分け
  2. 文節単位で述語になりそうなものを述語候補としてマーキング
  3. マーキングしたものを文節の前後関係を見て、述語として扱うか確定する。

1度クッション置いて回避するようにした。
いっぺんにやろうとしたけど、脳みそが足らなかったので、うまい方法が思いつかなかったわ。。。

実は、もっと最適な回答がありそうな気がする。

参考サイト

Japanese

JJUGナイトセミナー Java SE 10 / JDK10リリース特集 参加報告

きっかけ

Java10は、リリース前から調べていたので、興味が強かった。
行ってきたのに何も記録を残さないと忘れると思うので、書くに至る。

var

varが入った理由

クドイ文章を防ぎたい。

varが入ることについて

動的型付けではない。
型の概念は存在する。

varがいままで入らなかった理由

書きやすさより、読みやすさを優先していたから。

しかし、varにしても読みやすさは変わらなかった。
使い方を考えれば、むしろ可読性は上がる。

なぜローカル変数だけ?

フィールド変数は、他のソースファイルに跨って使われる可能性が高い。
そうした場合、どういう型なのか、大元のファイルを参照する必要があるため、面倒くさくなるだけだから。

IDEの機能で見ることもできるとは思うが、IDEを使うことを強いることは、奨励できない。

制限

  • 初期化必須
  • null初期化NG
  • 配列の「[]」は不要
  • 配列のリテラルは不要
  • 変数を使った初期化はNG

気をつけること

varは、文脈によって、キーワードになったりする。

例:var var = var()

上記の例では、コンパイルは通る。しかし、書かないほうが無難

varを使う原則

  • 書きやすさ < 読みやすさ
  • ローカルコードで理解できる
  • IDEに依存しない
  • 明示的な型指定とはトレードオフ関係にある。
    使うべきところと、使わないところの区別を意識して使う必要がある。
  • 変数名で内容が推測できるようにする
  • スコープは短く
  • 初期化で型が分かるなら、varの利用を検討
  • ジェネリックスの利用には注意

Tabulatorの調査その2

きっかけ

なんか、以前に書いたTabulatorの記事のアクセスが多いので、なぜ多いのか調べてみた。

suzaku-tec.hatenadiary.jp

調査結果

どうも、データを多角的に見せられるのが人気みたい。
予想外に人気になってビビった。。。

おそらく、APIが発展してJSON連携が容易になったため、今度は表示に注目が集まったのだと勝手に思っている。

久々に調べたけど、データが有れば、簡単なグラフもかけるのか。。。
面白そうだな。

今更だが、JavaのStream.reduceで迷った

きっかけ

Javascriptのreduceのような実装をしたくて、いろいろ試して、かなり迷ったから書く。

Array.prototype.reduce() - JavaScript | MDN

詳細

やりたきこと

小計みたいなやつを出したかった。
なお、小計は、流れてくる要素とは別の方をしている。

迷った所

日本語がわからない

APIのリファレンス参照したけど、日本語がさっぱり分からなかった。。。
単位元の値って何?それって中国語?って感じでしたわ。。。

わかったこと

<U> U reduce(U identity,
             BiFunction<U,? super T,U> accumulator,
             BinaryOperator<U> combiner)

identity:初期値。
あれだ、for文の for(int i = 0; ;)i=0 のところって意味だろう。

accumulator:UとTを引数に、Uの型を返す。
これは、要するに、初期値に対して、何かしら要素を使って操作して、初期値と同じ型の計算した結果を返すってことね。

combiner:よく分かりません。。。
調べると、途中経過を合算するやつらしいね。
おそらく、並列処理する場合に必要になると思う。
試しに順次処理で実行してみたら、見事に呼ばれませんでしたわ。。。

感想

非常に厄介。。。
かなり癖がある。

Javascriptのreduceみたいに直感的だったら良かったのだが、わざわざいらない関数を定義しなきゃいけないのにかなり困惑した。
これ、初期値が型違いで、第三引数ないバージョン作れないのだろうか?
並列処理で呼んだらエラー吐くようにすれば、いけそうな気がしないでもない。

試したコード

実験のためにこねくりましていたコード。
たぶん、これでやりたいことは、調べられるはず。

import java.util.stream.IntStream;

public class Test {

    public static void main(String[] args) {
        double r = IntStream.of(1, 2, 3, 5).mapToObj(Work::new).reduce(0.2, (Double d, Work w) -> {
            return d + w.a;
        }, (o1, o2) -> {
            return null;
        });
        System.out.println(r);
    }
}

class Work {
    int a;
    public Work(int a) {
        this.a = a;
    }
}

参考サイト

Java Streamメモ(Hishidama's Java8 Stream Memo)

Java8のStreamを使いこなす - きしだのはてな

Stream (Java Platform SE 8)

GitHubのProject機能

Project機能

詳しくは、Githubのリンクを見てもらえればと。。。

About project boards - User Documentation

簡単に説明すると、「カンバン」みたいな機能が追加になったよーって感じ。
使い方は、Atlassianの製品に近い印象を受ける。

使い方

ちなみに、記事を作ったのは、2018/03/24時点。

作成

f:id:suzaku0914:20180324143837p:plain

対象のライブラリのトップページにある、projectタブを押下する。
するとprojectページに移動するので、そこから、createボタンを押下。

なお、createボタンは、権限のあるユーザーでしか表示できないので、出てなかったら、ログインを忘れているかも。

初期設定

f:id:suzaku0914:20180324144030p:plain

プロジェクトのボード名と詳細説明の入力を促されるので、入力する。

詳細説明は、必須ではないので、プロジェクト名だけ適当に入力して、create project ボタン押下。

あとになって気づいたが、テンプレート設定がある。
デフォルト設定は、Noneだが、使い勝手を考えると、Kanbanを選んだほうが良さそう。

Kanbanで作った場合

f:id:suzaku0914:20180324144826p:plain

Atlassianのやつに似てますね。。。

もちろん、タスクの移動もドラッグ・アンド・ドロップでできます。
個人で利用する場合は、これで十分そうな気がします。

使うには、いろいろプロジェクトを使い分けるのが良いですかね?
レビューの進捗管理用とか、実装のTODO用とか。。。
使い方は工夫次第で如何様にもできそうな気がします。

感想

ちょっと、キャッチアップ遅れました。。。
結構前にリリースされていたんですね。。。

参考サイト

GitHub標準のカンバンが登場!新たに導入されたProjectとは - Qiita

Github projectsを使ってみた - Qiita

GitHub にカンバン機能が追加されました! | Developers.IO