JAVAのゴミ集め(ガベージコレクション)

JAVAのいいところは、メモリーリークを回避するようにガベージコレクション(以下、GC)をやってくれるところだ。

いつだったか、Objective-Cで、iphoneアプリを作っているときは、細かい神経の多くをメモリーリーク回避のために使って、人間が疲れてしまう感じだった。そういう意味ではGCはとてもありがたい。

prolog化のプログラムはjavaで書いているので、core-i9 9920Xと128Gメインメモリと合わされば、およそメモリ問題はあり得ない気になっていた。

しかし、この間、twitterテキストのprolog化のために一つのプログラムを10時間以上連続で動かし続けていると、プロセスがメモリがやたら食っていくのだ。

例えば、いま、動かしているのだが、こんな状況である。(ターミナルからtopを実行した結果)

KiB Mem : 13172568+total, 10442336 free, 11123846+used, 10044876 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used. 19345396 avail Mem

111ギガ使って、残りは10ギガしかないって言っている。javaは、最大使用メモリを110Gバイトとして動かしているので、もう目一杯使っている感じだ。増えに増えていくので、ガベージコレクションはどうした!!という感情になる。

ただ、javaバーチャルマシン(VM)では、これは特に珍しいことではないようだ。VMは、実際のメモリを使い切らないように発表の場を探しているようだから。実メモリがなくなりそうな時まで、GCは、実行されないように見えると書いてあった。

CentoOSのVPSにswi-prologをインストールした

手続き的に言うと、この間、日本語wikipediaのデータをprologの二分木化して、それをprologサーバに処理させて、tcpクライアントからデータ検索できるようにすると言う作業をやっていた。なんのことやら、と思う方がいるかと思うが、こればっかりは、話が長くなるので、このサイトの過去の記事を読んでいただかないといけない。

さて、その7Gもある二分木もそれを検索するprologプログラムも、それを利用可能にするprologのtcpサーバーもできた。直にそれをtcpクライアントから利用してもいいのだが、何かと不便なのでウェッブで使えるようにした。

つまり、ブラウザから、javascriptのajax経由で、サーバーサイトのphpを起動して、tcpクライアントを動かして、検索し、その出力をブラウザに表示すると言うシステムはできたのだ。Macのwebサーバーとprologサーバーでこれが機能することを確かめた。Macはローカルなので、これをこのブログも動かしている「お名前.com」のVPS上において、どこからでも利用できるようにしようと言う段取りになった。

VPSは、なぜかCentoOSで動いている。今は、Ubuntuにすればよかったと思うが、入れ替えると、また色々1から作り直さないけない。一時期、私が管理するネットワークサーバーは、CentoOSと決めていたことがあって、その勢いでのこと。まあ、仕方がない。

このVPSにswi-prologを入れようとしてちょっと詰まってしまった。Linuxなので、ソースからコンパイルする必要がある。まず、cmakeのバージョンが古いと怒られた。cmake 新しくしようとすると、g++のバージョンが古いと怒られた。 g++のバージョンアップは、こちらのサイトを参考にインストールできた。さしあたって、

gcc version 4.8.2 20140120 (Red Hat 4.8.2-15) (GCC) 

ここまで、バージョンアップした(もっと新しいバージョンもあるが、そこまでは必要なかった)。さらに、この辺りかそこらで、zlibが見つからないと言うエラーもあったので、これは、こちらを参考に、簡単に最新バージョンをインストールできた。そして、cmakeを新たにコンパイルし直した。cmakeは、

cmake version 3.14.1

ここまで、バージョンアップした。さらに、swi-prologのインストールページにある、事前準備をしようとしたら(※ dnfをyumに変える必要があった)

エラー:  Multilib version problems found. ・・・・・・続く

と言うことで止まってしまった。経験的に、これがちゃんとインストールできていないと、swi-prologのコンパイルに失敗する。これはやや戸惑ったが、こちらにある通り対処したら、クリアできた。

このような過程を経て、無事、swi-prologはちょっと古びたCentOSにインストールできましたとさ。

(追記:結局VPSはメモリとパワー不足でprologサーバーを動かすことができなかった、笑)

unable to launch "cinnamon-session-cinnamon" X session - 云々

タイトルのエラーを吐いて、突然、ロボット制御用に使っているLinux Mint (32ビット)が立ち上がらくなった。ネットには色々書かれているが、私の場合、次の方法で解決した。

(1)エラーメッセージが出ている状態で、Ctrl-Alt-F1でXウィンドウを使わないCUIモードに変更する。

(2)ログインする

(3) $ sudo apt-get install mint-meta-cinnamon を実行する

なぜ、こんなことになるのか、なぜこの方法で解消するのか、一切不明。

Hikey970のlebuntuに日本語環境を入れる

オリジナルなHikey970のubuntu、つまりlebuntuは全く日本語環境が入っていないので、前の記事ではubuntu18.04を入れるとか言っていたが、実はそれはとても難しく、私にはできそうになかった。

そこで、lebuntuに追加で日本語環境をインストールすることにした。フォントなどをインストールしたら、日本語は表示できるようになったし、localeをLANGでja_JP.UTF-8にしたら、出力が日本語になって使いやすくなった。

しかし、日本語の入力はいまだにできない。悩ましい。

Hikey970にUbuntu (Lebuntu) をインストールする

ニューラルネットワーク処理ユニット(NPU)を持つシングルボードコンピュータを、スイッチサイエンス社から39,744円で購入した。アマゾンに出ている商品と同じものだが、ここが一番安かった。

ひたすら好奇心である。NPUというものは、どれほどのものだろうということである。ただし、UPUをのぞいでも、このコンピュータのスペックはとてもいい。

まだ、NPUをどうやって動かすのか、というか、プログラミングに組み込むのかということはわかっていないが、さしあたり、試しに、Ubuntu、LemakerのUbuntuという意味で、Lebuntuというらしい、を組み込んでみた。

最終的には上記のようにlebuntuがスタートする。最大の弱点は、日本語環境が出てこないことだ。

インストールの仕方をメモがわりに記載する。
(1)Linux を用意する。
(2)このサイトから、lebuntuのimgファイル類をダウンロードする。
(3)rarファイルを解凍する。(ubuntuの場合、unrarが必要だった)
(4)その中に、lebuntu-rfs_flashing_guide.txtというドキュメントがあるので、そこに書いてある通りのことを実行すれば、インストールできる。その通り実行しないと失敗する!!
以下注意点
(1)INSTALLING BINARIES(only new boards)とFLASHING Lebuntu 16.04 IMAGE ONLYの二回実行する。
(2)Hikey970のUSB-CとLinuxのUSB端子をつなぐ。
(3)MACのVirtualBoxに入れたLinuxでやったら失敗した。USBのつながりがダメなようだ。Linuxマシンを用意する。私の場合は、Intelのスティックコンピュータに入れたUbuntuにつないで実行した。

特にないか。要は、先のマニュアル通りのことができればOKなのだ。

ただ、Lebuntuでは、日本語が使えない(使い方があるのかもしれないがわからない)ので、今度、正式のUbuntu 18.04をインストールしようと思う。

NPUは、Hikey970 with pre-built Tensorflowというのがあるので、そちらのimgを焼くことで実現するのだと思う。

MapになっているニュースのListを日付順にソートする

要は、MapのListをMapのあるValue順にソートするということだけれど、答えはこちらのサイトで教えていただきました。

Collections.sort(maplist, new Comparator<Map<String, String>>(){
    @Override
    public int compare(Map<String, String> rec1, Map<String, String> rec2) {
        String colName1 = rec1.get("pubDate");
        String colName2 = rec2.get("pubDate");
        return colName2.compareTo(colName1);
    }    
});

mariadbのデータフォルダ移動、シンボリックリンクが一番!

以前、スティックコンピュータで、mariadbのデータフォルダをmicroSDに移したという話を書いたが、その時は、my.cnfの設定を変更したものだった。今回、VPSのmariadbはそれでも簡単にいかなかったので、新しいフォルダ/data/mysqlに、/var/lib/mysqlからのシンボリックリンクを貼ってやってみた。難なく、それだけで、全て片付いた。これが一番楽チンだ。以下の方法は、CentOS用です。他は、コマンドが違うかも。

(1)mysql (mariadb) を止める ← 重要
(3)新しいフォルダを作成しオーナーを変更する
sudo chown mysql:mysql /data/mysql
(3)新しいフォルダーに全部コピーする
sudo cp -pr /var/lib/mysql/* /data/mysql/
(4)元のフォルダーをrenameして使えなくしておく(万が一のために元に戻せるように)
(5)シンボリックリンクを貼る
sudo ln -s /data/mysql/ /var/lib/mysql
とこうなる。
lrwxrwxrwx  1 root    root      12 11月 23 15:35 2018 mysql -> /data/mysql/
(6)mysql (mariadb)  を再スタートする

スティックコンピュータにミニディスプレイをつけた

ミニディスプレイをつけた。解像度は、高くても対応できるのだけれど字が小さくて見えなくなるので、800X600にしている。キーボードとマウスは、その両者ついているbluetoothのミニパッドがつながる。

あとは、sshを有効にして、パソコンからコントールできる。