エンターテイメント!!

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

tsifyでout of memoryが発生した時に対応したこと。解決編

元記事

suzaku-tec.hatenadiary.jp

調査方法

とりあえず、gulpの各タスクに、 process.memoryUsage() を埋め込んで、実行。
開始と終了時に計測するようにした。
終わりは、on('end', ・・・・) でイベント拾って出すようにした。

本当は、もっとうまいやり方があるのかも知れない。。。

原因

tsのビルドタスクが、3つくらい並列して実行しているところがあって、そこで一気にメモリを喰って発生していたみたい。。。

特に依存関係もないし、分割したら問題なく動いた。

ちなみに発生していた箇所のタスクの実装は、以下みたいな感じ。

gulp.task('A', [b, c, d], function () {
・・・・
});

他の流れにそって、並列実行するようにしたのがアカンかった。。。
というか、最初から並列実行するように作らんでもええやんけ!って、最初に作った人を呪ってしまった。
俺も同じことしそうだから、他人を責めるのは良くないね。

回避方法

run-sequence っていうnodeモジュールを使えば、順次実行制御できるようになる。
gulp内の機能にないのが、面倒くさいところではあるが。。。

感想

gulpは並列実行できるのは良いんだけど、並列でやりすぎてメモリが枯渇するのは、どうにかできないもんだろうか?

参考サイト

Gulp でタスクを並列/直列処理する - Qiita

FirefoxのseleniumIDEで思うこと 2018/05/15時点

思うこと

Firefox58以降、使えなくなっていたのが、やっと使えるようになった。
しかし、いろいろ思うことがあるので、思いを綴る。

htmlがぁ。。。。

以前のアドオンの状態で、html形式のマクロを出力を使いまわしていたのだが、使えなくなってしまった。
JSON形式になったみたい。
対応できるとは思うが、既存のヤツが使えなくなるショックの大きさって、結構なしんどいものがある。

UI

htmlサポートはなくなったものの、UIはかなりスッキリした印象。

雑感

Firefoxのアドオンは、優秀なものがいっぱいあったのだが、対応されなかったり、使いづらくなったりしているのが残念。。。
以前のような使い勝手を再現できないのは、不満が残る。
本格的に、ブラウザ移行を考え始めた方がいいのかもしれない。
もしくは、自分でアドオン作るか。
時間が捻出できればそうしたいんだけど、雇われ従業員は、時間で縛られて難しいのです。。。

参考サイト

新SeleniumIDE についてまとめてみた - Qiita

【書評】AI vs. 教科書が読めない子どもたち

AI vs. 教科書が読めない子どもたち

AI vs. 教科書が読めない子どもたち

まとめノート

MARCHに合格 -AIはライバル

人工知能の実現は難しい。
なぜなら、知能の原理を数学的に解明するには、観測方法が確立してないので難しい。
ただ、偶然の発見で、技術が伸びることはある。

桜散る -シンギュラリティはSF

AIは意味を理解してない。計算しているだけ。
意味を理解しているかのように見せているのが現状。

教科書が読めない

AIは、1を聞いて10を知ることはできない。
万を聞いて1を導くのがやっとの状態。

AIで仕事に勝つには、読解力・常識・柔軟な発想が必要になる。

最悪のシナリオ

AIの登場で、情報を誰でも最適化して扱える状態になった。
そのため、各社の製品価格を比較してネット通販で買うショールーム現象が発生している。

AIの特徴

  • 新しいことはできない
  • コストを減らす

考えなしにAIと競争すると、職場のブラック化を招く。

AI恐慌

  • AIにできない仕事をできる人がいなくなるが、失業者であふれる
  • AIで仕事を失う場合、失業か低賃金労働の二択化が進む

克服するには、世の課題を見つけて、起業するしかない。

感想

読んでいて思ったのは、やっぱり、シンギュラリティを越えることはありえないことを、強く感じた。
知らない人からすれば、まるで考えて動いているように感じるが、中身を知っている人からすると、ただの計算でやっているので、AIが人間を狩るなんて発想がナンセンスだと思いますわ。
この考え方は、恐怖を煽る販売方法に似ている。
AIと呼ばれる構成理論の概要さえ理解していれば、そこまで恐れることはないだろうって思ってたけど、この本を読んで、より一層、問題ないことを感じた。
AIは、特定分野で人間を越えるかも知れないが、総合力で人間を越えるのは、当分無理だと感じました。

ただ、その総合力を鍛える訓練をしてないと、将来的な危うさは感じる。
だから、読解力は強化しないとダメだと強く感じた。 すべてのベースは国語力。国語力がないと、AIに取って代わられる気がしてならない。
AI恐慌は、マジで笑えないね。。。
単純なことばかりでは、ダメだろうな。これからは、人間の応用力が試される時代になるのだろうと思いました。

tsifyでout of memoryが発生した時に対応したこと

きっかけ

金曜日の夜に、現場のGitリポジトリに修正内容をプッシュしたら、ビルドエラー通知が飛んできて、ビルド時にメモリ不足が指摘された。
一応対処はしたけど、原因究明はまだできてないが、忘れそうなので、記録に残しておく

余談

問題発生タイミングが最悪。
なんで、よりによって金曜の定時後に発生するん?
起こしたのは俺だけどさぁ。。。

メンバーが残り少ない状態で発生して、かなり焦ったわ。

詳細

対応

gulpのタスクに、--max-old-space-size=4096 を追加した。
なぜ発生したのかは分からない。
月曜、調査しないといけない。。。

たぶん、クラス情報をコンパイル時にメモリ保持していると思うのだが、たぶん、大量にクラスを作ってたから起きたんだろうと勝手に予測。
月曜に本格的に調べる。

悩んだこと・詰まったこと

node のコマンドに --max-old-space-size=4096 って付けたんだけど、効果がなくてかなり迷った。
gulpは別プロセスで起動するのだろうか?とりあえず解決したからあまり調べなかったけど、後々になって気になった。

ついでに覚えたこと

--max-old-space-size で指定するサイズは、MB。

反省

手元ではメモリ不足になることは分かってなかったですわ。。。
そもそもマージしただけで、マージ元でエラーなかったし、先でもエラーなかったから大丈夫だろうって思ってたら、コレですわ。。。
ちゃんとプッシュ前にビルド通るかきちんと確認しておけば良かった。。。

参考サイト

Node.js の out of memory エラー回避方法 : まだプログラマーですが何か?

Gulp で process out of memory が出た時の解決方法 | フロントエンドの道標

Chocolateyで特定Versionのインストール

きっかけ

雑誌の環境用意するの面倒くさいから、よくchocolateyを使うのだが、バージョン合わせなかったために色々苦労した。。。

chocolateyでversion指定してインストールするやり方を覚えようと書くに至る。

環境

Windows 10 Chocolatey v0.10.10

やり方

choco install {packageName} -Version {Verison}

また、最近のchocolateyは、choco installcinst でやれるみたい。
上記のコマンドは、下記のコマンドと同義

cinst {packageName} -Version {Verison}

自分は、面倒くさいので、cinst 使いました。

参考サイト

Windowsでもパッケージ管理! Chocolateyの紹介 - Intelligent Technology's Technical Blog

Windowsにチョコ?うまい!!ChocolateyでWindowsのソフト管理が楽々 | Go-Nextブログ

最近気づいた恥ずかしい話 Javaのインスタンスメソッド参照

きっかけ

Javaは得意分野だけど、知らないことが合ったので、無知を減らすために晒す。
戒めの意味も込める。

導入

はい、タイトル通りでぇーす。
最近知りました。

static(クラス)メソッド参照、コンストラクタ参照は知ってましたが、普通のメソッドも参照できるとは思わなかった。。。。

サンプルコード

とりあえず、実験のため、コード書いてみる。

import java.util.stream.Stream;

public class Test {

    public static void main(String[] args) {
        Stream.of(1,2,3).map(MethodRed::new).forEach(MethodRed::exec);
    }

}

class MethodRed {

    private int target;
    public MethodRed(int target) {
        this.target = target;
    }

    public void exec() {
        System.out.println("test:" + target);
    }
}

やっていることは、Streamに 1~3 の数値を流して、それをもとにMethodRed を生成して、exec メソッド呼び出しているだけ。

こんな使い方できるんだなぁ~って最近知った。

念のため、実行した結果も確認

test:1
test:2
test:3

想定通り。

考察

本当は、stream内であんまり呼び出さないほうがいいのだろうと感じる。
状態が変わるようなら、別インスタンスでやったほうがいいですからね。。。
やる場合は、メソッドが状態を切り替えたりしないような実装とメソッド名にしておかないと、ソフトウェアとして成長する過程で、変な依存を生んでバクを作り出すような気がしました。

あと、これ知ったときは脳天を叩かれたくらいの衝撃が走りましたわ。。。
己の無知を恥じるばかりである。

ちなみに、知ったキッカケは、IntelliJ IDEAのヒント。
マジ、IntelliJ賢いな。
俺より賢い。

指示語が指すものを判別する その2

前回記事

suzaku-tec.hatenadiary.jp

今回、書くに至ったきっかけ

よくよく考えたら、同じ文でも指示語の対象があるな~と思い、ちょっと考えなした。

詳細

例えば、以下のケース

机の上に本があり、それは、母が読んでいたものだ。

前回の実装だと、前の文から探しにいくので、何も設定されない。
だが、この場合の それ は明らかに文章内にある を指している。

解決方法

まず、同一文内で、指示語より前にある主語があれば、それを適用するようにした。
倒置法だったらどうするのって思ったけど、その場合は、指示語を使えないハズなので、考慮の対象外にした。

問題点

上記の解決方法で全部なんとかなるだろうと思ったけど、上手くいかなかった。。。
なぜかと言うと、分単位で位置を特定しているため。。。。

もう少し詳しく説明する前に、ちょっと導入説明。
形態素解析には、kuromojiを使っているのだが、その解析単位は、分単位でしている。
下記を例にする。

企業は自動車やテレビや冷蔵庫など新らしい製品が次々と発売する。それらを買うためには古い製品を捨てなければならず捨てたものの大半がゴミになる。

この場合、文は、企業は自動車やテレビや冷蔵庫など新らしい製品が次々と発売する。それらを買うためには古い製品を捨てなければならず捨てたものの大半がゴミになる。 になる。
その文単位で形態素解析をしているため、形態素解析した結果のトークン情報の位置情報が、文ごとにリセットされている。
最初から、全部一緒に形態素解析すればいいじゃんって思ったけど、そうすると、段落毎の関係性の解析、文書間の関連性の解析が難しくなるのと、長文の場合、位置情報がオーバーフローすると感じたため。
kuromojiの位置情報は、int型なので。。。
今作っている文章解析のライブラリは、長文が前提にあるので、避けたかった。

長くなったが、そういう理由があって、分単位で解析していた。

結構、これに気づくのに時間がかかったわ。

解決方法

もう、どうしようもないので、全部位置情報でなんとかするのは諦めた。

問題は分割して解決するようにした。

どうしたかというと、まず、同一文章内で指示語がないかを、位置情報で解決するようにした。
それで見つからない場合、全文の主語をあてがうようにした。

今後の問題点

ある程度、思い描いたことができるようになってきた。

ただ、まだ動作がおかしい感じがするわ。。。
喋り言葉は、ほぼNGなんだよね。。。。
きちんとした文章なら、きちんと解析できるんだけど。。。
文章の正確さによって、解析結果があてにならなくなったりするのが辛い。。。
今後は、そこら編の精度を高める必要があると感じている。
もしかしたら、アプローチ変える必要があるかも知れない。