発火後忘失

FIRE AND FORGET

VisualVMがJava8に対応していない(jdk8u102)

CPUプロファイリングを行おうと自作アプリケーションにVisualVMを接続したのですが、次のようなエラーが出て正しく動作しませんでした。

java.lang.NoClassDefFoundError: org/infinispan/util/concurrent/locks/impl/PerKeyLockContainer$$Lambda$156

lambdaという文字列が見えるので、Java8ラムダ関連なのだろうか、と思って検索してみたところ、次のバグが関連するようでした。

暫定対処としては、代わりにNetBeans付属のプロファイラを使用する、という手段が挙がっています。
試してみたところ、こちらでは確かに動作しました。

VisualVMと比較し計測開始までの準備が断然早く驚きました。
なお、機能的にはVisualVMの方がリッチだと思われます。

CentOS7ベースのDockerコンテナで--privileged無しでPostgreSQLを動かしたい

CentOS7ベースのDockerイメージで作成したコンテナの中で systemctl コマンドを実行すると次のエラーが出て失敗します。

Failed to get D-Bus connection: No connection to service manager.

検索すると docker run コマンドに --privileged オプションを付けると良い、なんて書かれているのをよく見かけますが、特権モードなんて名前のオプションを軽々しく使って良いものか、リファレンス読んでもよくわからないし…

と思いつつ情報を探していたのですが、CentOSプロジェクトオフィシャルなPostgreSQLイメージ用Dockerfileがありました。

CentOS-Dockerfiles/postgres/centos7 at master · CentOS/CentOS-Dockerfiles

systemctl コマンド使わずに済むようスクリプトを書き換えて対応している感じです。

PostgreSQL以外でも systemd 経由で起動していたサービスは同じように対応できる気がします(そもそもオフィシャルDockerfileが用意されていたりも)。


以下、今回の本筋とは関係ないのですが、
Bug 1033604 - Unable to start systemd service in Docker container
のリンクに、 --privileged オプション無しで systemd を起動する、というエントリがありました。
Run systemd in an unprivileged(!!!) docker container | maci's random stuff

この回答のどこが問題で何が問題か

Java - Doubleとdoubleの使い方(43331)|teratail より:

質問:

import java.awt.geom.Arc2D.Double;

public class RoundSample {

    public static void main(String[] args) {
        // TODO 自動生成されたメソッド・スタブ

        Double d = 1234.56789;
        double rd = Math.round(d);
        double rid = Math.rint(d);
        double cd = Math.ceil(d);
        double fd = Math.floor(d);
        int i = d.intValue();

    }

}

上記のコードは参考書のコードです。
Doubleの初期化の所で初期化ができずに、eclipseにdoubleにしてくださいとエラーが出てしまいます。
なぜダメなのかがわかりません。
宜しくお願いします。

回答:

Doubleはオブジェクトなのでコンストラクタを使って初期化してください。

(当初はもう1件回答がついていたはずですが、現時点で既に削除されているようです。)

ちなみに正解は、質問者が自己回答しているとおり、想定外の import を行っている( java.lang.Double を使うつもりがそうなっていない)ためです。

私が回答を見て思ったのは以下の通りです。

  • IDEに貼り付けるだけで正解にたどり着くのに回答者はそれすら怠っている。
  • 「コンストラクタを使って初期化」という表現は不正確で、何が言いたいか分からない人からしてみると具体的にどうすれば良いのか分からない。
    • おそらく new Double(1234.56789); のようにせよ、ということだと思われる。
  • (java.lang.Double ではないということに気づかなかったとしても) オートボクシングが働くのでこのままでエラーとなることはない。
  • 質問に「参考書のコード」だと書いているのを踏まえると、そんな書き間違いをしているわけではないだろうということは想像できるはず。
  • doubleDouble にしたいのであれば使用すべきなのは new ではなくDouble.valueOf(double) である。


つまり、十分に理解できるべき質問を理解せず、基礎的な言語知識に誤りがある状態で回答がなされ、それが特にツッコまれもせず存在していることが問題である、と考えています。
変な質問を問題視する声はしばしば聞こえますが()、そんなものは無視すれば良いだけです。
一方、変な回答は無視すべきものかどうなのか回答を受けた人が判断つかないので非常に害悪です。

過去にteratailのファーストインプレッションとしてマイルドにこの問題に言及したことがありますが、傾向としては今も変わらずこのとおりであると感じます。

本回答者、現時点でteratailランキング総合5位、Javaタグランキングで3位の方なのですが、やはり回答/回答者に対するモデレーションが弱いのが原因の一端にあるのかなと。

UbuntuとWindowsをデュアルブートしていると時刻が9時間ずれる

WindowsUbuntu同一筐体にインストールしデュアルブートできるようにしている場合、Windowsの時刻が9時間ずれる事象に遭遇する場合があります。
従来は /etc/default/rcS ファイルに UTC=no と記載することで設定を行っていたのですが、16.04では設定方法が変わっています。

rcS(5):

The UTC setting is replaced by the UTC or LOCAL setting in /etc/adjtime, and should have been migrated automatically.

というわけで /etc/adjtime ファイルに設定するようになったようですが、このファイルはアップグレード直後には存在していませんでした。
次のコマンドを実行することで、(ファイルがなければ作成し)設定が行えます。

sudo timedatectl set-local-rtc 1

参考:

Ubuntu16.04にアップグレードしたらEclipseが固まる

Ubuntu16.04にアップグレードしてから、Eclipse4.5.2を操作しているとファイルを閉じたり新規作成したりする際に砂時計表示のまま固まってしまうことが多発しました。

暫定的な解決策として、 eclipse.ini--launcher.appendVmargs と書かれた行より前に下記の2行を追記することが挙げられていました。

--launcher.GTK_version
2

参考:

自前で用意できるチャットサーバを探す

最近、self-hostedでslack-alternativeなチャットサービスを探しました。
その時参考にしたサイトと、どういう点を選定基準にしたかを残しておきます。
(ちなみに、Slackそのものは使ったことがありません…!)

注目点

  • LDAP認証
    • 立てるのはチャットサーバだけに留まらないので、アカウント管理は一元化したかった
    • Rocket.Chat, Zulipは機能がありそう
    • MattermostはEE版(有償)のみ
  • ネイティブクライアントアプリ
    • 常駐させたいしブラウザだとどこで開いてたのか分からなくなる
  • 返信時のスレッド(threaded conversations)機能
    • Rocket.Chatを試用した際どの質問に対して返答してるのかとかが非常にわかりづらく必要性を感じた
  • 日本語検索
    • 最初は必要ないと考えていたのですが、長く使っているとやはり欲しくなる…
    • 全プロダクト試したわけではないのですが、調べた限り初期状態では全滅

VirtualBox上になるべく小さくCentOS7 X環境を作る

VirtualBox上のCentOS7になるべく小さめなX環境を構築しようと考え、実行した時の作業メモです。

インストール時にGUI環境を選択した場合は5GB程度になるのに対し、この手順でインストールした場合は1.6GB程度になりました。

インストール〜X起動まで

  1. (お好みで)仮想マシンの設定: システム>マザーボードEFI有効化をONにしておく。
  2. インストールディスクから最小限の構成でインストールを完了させる。
  3. sudo yum update
  4. sudo yum groupinstall "X Window System"
  5. sudo yum install epel-release
  6. sudo yum install icewm liberation-mono-fonts
  7. ホームディレクトリに .xinitrc ファイルを作り、1行 icewm と記述。
  8. xinit コマンドでX起動。

マウス統合機能の有効化

  1. sudo yum install kernel kernel-headers kernel-devel dkms bzip2 gcc
  2. kernelのバージョンが上がっているのでOSを再起動させる。
  3. VirtualBoxのメニューから "デバイス > Guest Additions CDイメージの挿入" を選択。
  4. sudo mkdir /mnt/cdrom && sudo mount /dev/cdrom /mnt/cdrom
  5. sudo sh /mnt/cdrom/VBoxLinuxAdditions.run

標準のGNOMEではクリップボード共有もこれでOKでしたが、icewmであのクリップボードにアクセスするにはどうしたら良いんだろう…

f:id:yukihaned:20160213172242p:plain
(xeyesxorg-x11-appsパッケージに入っています。)

VDIファイルをコンパクト化

上記の手順で作成したvdiファイルは保存しておいて、必要に応じてコピーして使いまわしたいのでファイルサイズをコンパクト化しておきます。

  1. 不要ファイルを削除する。
    • (yum一時ファイルについて) sudo yum clean all
  2. 下記コマンドを実行して空き領域を0埋めする。
sudo dd if=/dev/zero of=/bigemptyfile bs=4096k
sudo rm -rf /bigemptyfile

終わったら仮想マシンをシャットダウンし、続いてホストOS上で実行。

  1. コンパクト化: VBoxManage modifyhd centos.vdi --compact

バックアップをとっておく。

  1. 上記手順で作成したvdiファイルをコピー。
  2. VDIファイルUUIDの変更: VBoxManage internalcommands sethduuid centos-copy.vdi