Javaのジェネリクスとjsonファイルの作り方

Javaジェネリクス(総称型)はC++でいうテンプレートらしいです。
これを使えばjson用のオブジェクトも楽に作れそう

import java.util.ArrayList;
import java.util.List;

public class MyJson<T> {
    public int num;
    public List<T> extras;
    
    MyJson() {
        this.num = -1;
        this.extras = new ArrayList<>();
    }
}

これを使うときはこんな感じにやればいいかな? jsonへのエンコードjsonicを使っています。

public class MakeJson {
    public static void main(String[] args) {
        PrinterWriter out1 = new PrinterWriter(args[1]);
        PrinterWriter out2 = new PrinterWriter(args[2]);
        MyJson<String> obj1 = new MyJson<>();
        MyJson<Map<String, String>> obj2 = new MyJson<>();
        obj1.num = 1;
        List<String> extras1 = new ArrayList<>();
        obj1.extras = extras1;
        obj2.num = 2;
        Map<String, String> extras2 = new Map<>();
        obj2.extras = extras2;
        String string1 = JSON.encode(obj1, ou1, true);
        String string2 = JSON.encode(obj2, out2, true);
        out1.close();
        out2.close();
    }
}

epgrec UNAで予約できないのが解決した!

一か月ぐらい前にLinux Mint18にepgrec UNAを入れて番組表を表示させるとこまでできたのですが番組表から予約することができずにそのまま放置していました。
具体的には簡易予約をクリックしても何も起きずに予約されない。また予約カスタマイズから予約をクリックすることもできませんでした。
epgrec UNAインストール手順(Ubuntu・Debian編) | 自分に負けないラボラトリー
このサイトを参考にしながら入れたのですがうまくいきません
F12のコンソールで見てみたらこんな感じでした。 f:id:beback:20161103221859p:plain GET http://192.168.0.20/simpleReservation.php?program_id=23834 500 (Internal Server Error)
ということでsimpleReservation.phpを見てみたのですが怪しいところは見つからず
Internal Server Errorだけじゃ原因が見当もつかないのでターミナルからphpを引数つきで実行できないかなと調べているとphp-cgiというものでできるらしく

$ sudo apt install php7.0-cgi
$ sudo php-cgi simpleReservation.php program_id=40289
PHP Fatal error:  Uncaught Error: Call to undefined function mb_strlen() in /var/www/epgrec/reclib.php:61
Stack trace:
#0 /var/www/epgrec/Reservation.class.php(1016): mb_str_replace('%TITLE%', '\xE3\x82\xB0\xE3\x83\x83\xE3\x83\x89\xEF\xBC\x81\xE3\x83\xA2...', Array)
#1 /var/www/epgrec/Reservation.class.php(835): Reservation::at_set(1478205992, 1478214000, '87', '\xE3\x82\xB0\xE3\x83\x83\xE3\x83\x89\xEF\xBC\x81\xE3\x83\xA2...', '\xE5\xBC\xB7\xE9\xA2\xA8\xE3\x81\xA7\xE5\x80\x92\xE3\x82\x8C...', '1', '40289', 0, 1, 0, 0, 10, false, 0, false)
#2 /var/www/epgrec/Reservation.class.php(96): Reservation::custom('2016-11-04 04:5...', '2016-11-04 08:0...', '87', '\xE3\x82\xB0\xE3\x83\x83\xE3\x83\x89\xEF\xBC\x81\xE3\x83\xA2...', '\xE5\xBC\xB7\xE9\xA2\xA8\xE3\x81\xA7\xE5\x80\x92\xE3\x82\x8C...', '1', '40289', 0, 1, 0)
#3 /var/www/epgrec/simpleReservation.php(15): Reservation::simple('40289', 0, 1, 0)
#4 {main}
  thrown in /var/www/epgrec/reclib.php on line 61
Status: 500 Internal Server Error
Content-type: text/html; charset=UTF-8

今度はエラーコードの読みがいがあります。
phpに詳しくないので Call to undefined functionでググってみると サーバーの設定(php.ini)でマルチバイト関数(mb_で始まる関数)が無効になっていることもあるようです。
Fatal error: Call to undefined functionというエラーが発生する原因について | ぷろめし|プログラミングよりも飯が好き
そこでphp.iniの;extension=php_mbstring.dllの部分のコメントアウトを外したのですがだめでした。

$ sudo apt install php7.0-mbstring

このモジュールが入ってなかったようです。
これで解決しました。php.iniは弄らなくても大丈夫みたいです。

感想

ググって最初に出てきたサイトにはphp7.0-mbstringのことは書いてなかったけど次のサイトには書いてあった...。
録画コマンドはちゃんと動作するのにepgrecが上手く動作しないという人はphpのモジュールを見直してみるといいかもしれません。
今回エラーの原因を調べるときブラウザのコンソールとphp-cgiを使ったのですが、普通の人はどうやっているのでしょうか?慣れない作業で疲れました。

CentOS6.8にChromeを入れようとしたらgccをビルドすることになった

chromiumでもいいんですが動画再生で不都合があったり、adblockが入れられなかったりするので頑張って動かせるようにしました。
デフォルトのレポジトリでは用意されていないし、公式サイトにいってもCentOS用のrpmは用意されていません。Fedora用のrpmはあるのですが、インストールに失敗しました。

次に試したもの。

ググるとすぐ見つかると思います。)

% wget http://chrome.richardlloyd.org.uk/install_chrome.sh
% chmod u+x install_chrome.sh
% sudo ./install_chrome.sh

これでインストール自体はできます。これで使えるようになっている人も多いと思います。しかし僕の場合、起動しませんでした。

% /opt/google/chrome/chrome
/opt/google/chrome/chrome: libstdc++.so.6: version `CXXABI_1.3.5' not found (required by /opt/google/chrome/chrome)
/opt/google/chrome/chrome: libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /opt/google/chrome/chrome)
/opt/google/chrome/chrome: libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by /opt/google/chrome/chrome)

こんな感じです。ランチャーから起動してもうんともすんとも言いません。
libstdc++.so.6が良くないみたいです。
調べてみるとlibstdc++.so.6のバージョンが古くChromeで必要とされている機能が含まれていないようです。
(/usr/lib64はLinuxにおいて共有ライブラリがおいてあるディレクトリで、ここにあるファイルの一部がChromeから読み込まれます。)

% cd /usr/lib64
% strings libstdc++.so.6|grep CXXABI
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
% strings libstdc++.so.6|grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

こうするとエラーメッセージに出力されていたGLIBCXX_3.4.15やCXXABI_1.3.5などが含まれていないことが分かるみたいです。
yumを使ってアップデートできないか試したのですがlatest versionのため無理だと言われてしまいました。

gccビルド、libstdc++.so.6を作る

調べてみるとgccをビルドしてそこからlibstdc++.so.6を取り出す方法が見つかりました。
gccビルドは他のサイトを参考にしてもらうとしていくつか引っかかった部分を書いておきます。

多くのサイトでそのようにしているので

ここで結構ハマりました。LD_LIBRARY_PATHなどを設定していたためビルドに失敗してしまいました。
c++ - How can I understand these dreadful errors when building gcc-4.8.2? - Stack Overflow
ビルドに必要なツールをインストールしたにも関わらず似たようなエラーが出るときは関係しそうな環境変数をunsetしてみると成功するかもしれません。

  • ビルドにかなり時間がかかる

放置していたので何時間かかったのかよく分からないのですが、configureやmakeのオプションを調べてみるといいかもしれない

ビルドが完了したら、libstdc++.so.6を/usr/lib64にコピーします。

$ sudo cp ${HOME}/src/gcc-4.8.4/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.19 /usr/lib64

こんな感じにリンクを貼って下さい
(リンクを貼らなくてもldconfigをするだけで、自動的に新しいライブラリにリンクを貼ってくれるみたいです。)

% ll |grep libstdc++
lrwxrwxrwx   1 root         root    19 Oct 26 10:31 libstdc++.so.6 -> libstdc++.so.6.0.19
lrwxrwxrwx   1 root         root    19 Oct 26 10:27 libstdc++.so.6.bak -> libstdc++.so.6.0.13
-rwxr-xr-x   1 root         root  6.2M Oct 22 10:50 libstdc++.so.6.0.19
-rwxr-xr-x   1 root         root  967K May 10 18:38 libstdc++.so.6.0.13
lrwxrwxrwx.  1 root         root    18 Dec 21  2015 libstdc++.so.5 -> libstdc++.so.5.0.7
-rwxr-xr-x.  1 root         root  807K Mar 23  2011 libstdc++.so.5.0.7

ldconfigをしてChromeから読み込めるようにします

% sudo ldconfig

ここで起動しようとしたのですがまたも失敗しました。
パーミッション関係が悪いみたいなのでこれは単純です。
hogeは自分のユーザー名に置き換えて見て下さい)

% /opt/google/chrome/chrome
[31751:31751:1024/102744:ERROR:process_singleton_posix.cc(413)] readlink failed: Permission denied
[31751:31751:1024/102744:ERROR:process_singleton_posix.cc(249)] readlink(/home/hoge/.config/google-chrome/SingletonLock) failed: Permission denied
[31751:31751:1024/102744:ERROR:process_singleton_posix.cc(249)] readlink(/home/hoge/.config/google-chrome/SingletonLock) failed: Permission denied
[31751:31751:1024/102744:ERROR:process_singleton_posix.cc(273)] Failed to create /home/hoge/.config/google-chrome/SingletonLock: Permission denied
[31751:31751:1024/102744:ERROR:process_singleton_posix.cc(413)] readlink failed: Permission denied
[31751:31751:1024/102744:ERROR:process_singleton_posix.cc(249)] readlink(/home/hoge/.config/google-chrome/SingletonLock) failed: Permission denied
[31751:31751:1024/102744:ERROR:chrome_browser_main.cc(1703)] Failed to create a ProcessSingleton for your profile directory. This means that running multiple instances would start multiple browser processes rather than opening a new window in the existing process. Aborting now to avoid profile corruption.
% sudo chmod 755 google-chrome
% /opt/google/chrome/chrome
[32624:32624:1024/103623:ERROR:process_singleton_posix.cc(273)] Failed to create /home/hoge/.config/google-chrome/SingletonLock: Permission denied
[32624:32624:1024/103623:ERROR:chrome_browser_main.cc(1703)] Failed to create a ProcessSingleton for your profile directory. This means that running multiple instances would start multiple browser processes rather than opening a new window in the existing process. Aborting now to avoid profile corruption.
% sudo chown hoge:hoge google-chrome

これでターミナルからもランチャーのアイコンからも起動できるようになりました。
f:id:beback:20161026105159p:plain
めでたし、めでたし

最後に

これでWindowsマシンと変わらないブラウジングができるようになりました。
(デスクトップ用途ならCentOSなんて使わない方がいいような...)
Ubuntu系をオススメします。でも、いろいろな事情によりCentOSじゃないとだめな人もいますよね?

ブログを続けるって大変ですね

始めたばかりなのに何言ってんだって感じですね。週に3,4回は更新したいんですよ。でも気づいたら12時過ぎててもう寝ないとって。実は今週末にTOEFL ITP受けるんです。別にこの試験で何かが決まるって訳ではないのですがせっかく受けるので勉強しないと勿体ないですよね。しかし、大学受験の時に使ったDUOを探しだして勉強しています。リスニングのトレーニングも兼ねて復習用のCDをスマホに入れて通学途中に聴いています。でもほとんど脈絡のなく、聞き覚えのある文を連続して聴くのは結構苦痛です。途中で他の事を考えたりして結局半分ぐらいしか頭に入って来ません。何か無料でスマホで使えるいい英語教材は無いですかね?TOEFLTOEICに比べて知名度や人気が低いからか調べてもいい教材(無料または安価で利用できるもの)がなかなか見つかりませんね。TOEICならたくさんあるのですが。

こんな感じでTOEFL対策がほとんど出来ていないので結果がどうなるか少し怖いですね。一応、普段から英語のサイトだとかを見る機会が多いので何とかなるといいのですが。

話が変わりますが、Windowsで構築していた録画サーバーをLinuxに変えようと思っています。録画サーバーだけならWindowsでも十分なのですがWebスクレイピングなどをして自分のスマホにいろいろ情報を送りたいのです。そのための環境はやっぱりWindowじゃ構築するのが面倒なのでLinuxにすると言うわけです。後、ブラウザから操作するっていうのが格好いいからというのもあります。(笑)このことも近い内にブログに書ければと思います。

平日になかなかまとまった時間が取れないので、こんなどうでもいい記事ばっかになってしまうかもしれないけど取り敢えずブログ執筆続けていきます。

挨拶[10/17(月)深夜]

どうもbebackです。Linux機械学習、プログラミングについて書いていきたいと思っています。余裕があれば、PCゲームや自作PCその他趣味の話題も出てくるかもしれません。今、主に使っている言語はJavaPython。R、C++Perlも少しできます。好きなエディタはvimです。Web開発やAndroid開発にも興味があります。こちらも余裕があれば取り上げて行きたいです。ブログをするのはこれが初めてなのでどうかお手柔らかに。なにか気になるところや間違っているところがあれば優しく教えてくれると嬉しいです。質問にも時間的、精神的余裕があれば答えたいです。まともなプログラミングやLinux歴はまだ1年ちょっとなので温かい目で見守ってやって下さい。よろしくお願いします。