根暗シアン

備忘録という名の予防線

JJUG CCC 2018 Spring メモ

JJUG CCC に行ってきた www.java-users.jp

ざっくりわかった気になるモダンGC入門

tomoya yokota さん

今のGC

  • コンパクションGCしないとメモリがフラグメントしちゃう
  • STWしちゃう

新しいGCが必要

  • 巨大ヒープを使うアプリケーションの登場
    • Elastic Searchなど
  • コンパクションGCによる停止がないようにしたい
  • ヒープが大きくなったことによるGCでの停止時間の伸びも大きい

Shenandoah GC

  • OpenJDKのプロジェクト
  • 世代型メモリ管理(New, Old)をしない リージョン型のメモリ管理
  • 並列コンパクションの難しさを解消
  • Compaction GCはしつつ処理は止まらない

ZGC

  • Oracleが開発
  • 数TBのヒープでもGCの停止時間はは単調増加しない
  • Linux 64bitでしか動かない
  • カラーポインタ
    • オブジェクトの状態をカラーとして表現
  • フォワーディングテーブル

Epsilon GC

  • アプリケーションスレッドは停止しない
  • CPU負荷はほとんどなし
  • GCの時間は0
  • なぜなら何もしないGCだから
    • JVM開発用に使われているらしい

Java10まとめと、どうなるJava11

きしだ さん

New Release Model

  • Feature リリース 6ヶ月ごと
  • メンテナンスリリース 3ヶ月ごと
  • LTS 3年ごと JDK11が9月にでる
  • Oracle JDKOracle ユーザしか使えないから OpenJDKを使え

  • Desktop technology

    • JDK11からアプレットJava Web Startはサポートされない
    • JDK11でJavaFXはバンドルされない
      • バンドルされないだけで開発は続く
    • AWT,Swingはサポートされる

JDK 10

  • 型推論がサポートされる
    • varが変数名、メソッド名に使える
    • var a = new Object(){ ... } Kotlinぽい
      • 匿名クラスをメソッド内で定義して使いまわせそう
  • Garbage Collector Interface
    • GCのモジュール化
  • Experimental Java-Based JIT Compiler
    • JVMJavaで作り直すプロジェクト
  • Parallel Full GC
  • Application Class-Data Sharing
  • Thread-Local Handshakes
  • Heap Allocation on Alternative Memory Devices

    • 不揮発性メモリにヒープを割り当てられるようになった性
  • APIの変更

    • java.io.Reader
      • transferTo(Writer) NIOのクラスでやってたことをIOでできる

JDK 11

  • Single-File Soure-Code Programs
  • Raw String Literals

    • バッククウォート3つでRaw Stringが書けるようになる
    • SQL文とか書くときに改行コードとかタブとかそのままかける
  • Switch Expressions

  • HTTP Client
  • JavaEE, CORBAモジュールを除外

  • 便利なAPIが追加されるかも

  • String
    • lines
    • strip
  • Fileの中身比較とか、Fileの内容をStringで返す、Stringをそのまま書き込むとか

平成の次どうする問題

  • がんばる

Windows バッチファイルで日時をYYYYMMDDHHmmSS形式で取得

Windows バッチで、日時を取得して書式設定する。 ログファイルとかtempファイルにYYYYMMDD とか HHmmSS をつけたいときによくやる。

  • 年月日
rem 年月日
echo %date%
rem => 2017/09/16
rem Windows の設定によって、年の表示を2桁とかにしていると YY/MM/DD になったりするので環境に合わせる

rem /を取り除く
set YYYYMMDD=%date:/=%
echo %YYYYMMDD%
rem => 20170916
  • 時分秒
rem 時刻
echo %time%
rem => 12:59:59.999
rem =>  9:00:00.000

rem :,ミリ秒を取り除く
set HHmmSSsss=%time::=%
set HHmmSS=%HHmmSSsss:~0,6%

rem 一桁時のときは先頭がスペースパディングされている。0パディングに直したいときは以下
if "%HHmmSS:~0,1%"=" " set HHmmSS=0%HHmmSS:~1%

echo %HHmmSS%
rem => 125959
rem => 090000

Windows復活

UbuntuデュアルブートしたあとでWindows Update かましたらWindowsが起動しなくなったのが4月中頃。 いろいろやってたらWindows 起動するようになった。

結論は、HDMI出力ができていなかっただけで、実は起動はしていたという話。 VGAケーブルに差し替えたらあっさり直った。

一応試したこと書いておこう

GRUBメニュー出したい

Windows Update 前はPC起動時にGRUBメニューが出て、UbuntuWindows か選んでたはず。あの画面だせないか? grubの設定を変更する

$ sudo vim /etc/default/grub

GRUB_HIDDEN_TIMEOUT=0 をコメントアウトする

#GRUB_HIDDEN_TIMEOUT=0
GRUB_TIMEOUT=10  # 0より大きい値にする

保存して終了したら次のコマンド

$ sudo update-grub

これで起動したらGRUBメニューが表示されるはず…が何も出ない。 (実際には画面に出力できてなかっただけなんだけど気がつかなかった)

grub-reboot で設定

次回起動時のブートローダWindows に設定してみる。 /boot/grub/grub.cfgの中からWindowsのOS名を検索 -> 私の環境では “Windows Boot Manager (on /dev/sda1)” でした この名前でgrub-reboot 実行

$ sudo grub-reboot "Windows Boot Manager (on /dev/sda1)" && sudo reboot

するとWindows が起動するはず…が画面が真っ暗のまま、キーも何も反応しない。

「真っ暗ってことはUbuntu ではなく別なものが動いているんだよな…?」 この辺で、画面出力を疑い始める

デジタル出力→アナログ出力に変更してみる

HDMIでモニタに繋いでいるところを、VGAケーブルに繋ぎかえてみる

→表示された!

なんでHDMIで出力されないのかはよくわからないけど、ひとまずこれで良しとしよう

さくらのVPS初期設定

さくらのサポート情報 にしたがって設定する

1. 契約〜ログイン

  • 画面にしたがってポチポチ
    1GB,HDD100GBのプランにした
    年間10,692円 + 初期費用1,620円

  • VPSコントロールパネルにログイン

    • とりあえず名前は適当につけて、起動
    • PINGが通ることを確認
  • ssh root@

    • パスワードはメールで送られてくる
  • アプリケーションのアップデート

# yum -y update
# yum -y upgrade

2. パスワード変更

# passwd
ユーザー root のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:

3. ユーザ追加

# useradd user
# passwd user

sudoを利用できるように設定する

# usermod -G wheel user 
# visudo

次の箇所のコメントアウトを外す

# Allows people in group wheel to run all commands
%wheel        ALL=(ALL)       ALL

4. SSH設定変更

  • デフォルトポート22のままだとアタックされやすいので変更する
# vi /etc/ssh/sshd_config
# Port 22
Port 10022
    :
# Authentication:
# rootでのログイン不可
PermitRootLogin no
    :
# パスワードなしでのログイン不可
PermitEmptyPasswords no
  • ここまで設定したら、sshdを再起動して反映させる
# service sshd restart

ここでexitして再ログインしようとしたら、"No route to host"のメッセージが出てsshログインできなくなった

ローカル
$ ssh -p 10022 user@xxx.xxx.xxx.xxx
ssh: connect to host xxx.xxx.xxx.xxx port 10022: No route to host

原因はサーバ側のiptablesの設定をしないままログアウトしてしまったため。
さくらのコントロールパネルを開いて、コンソールから6.の作業を実施

5. SSH鍵設定

  • クライアント作業
# 鍵ペア生成
$ ssh-keygen -t rsa -v
# ファイル、パスフレーズはデフォルトで作成
# 作ったらSCPでサーバに転送
$ scp -P 10022 ~/.ssh/id_rsa.pub user@xxx.xxx.xxx.xxx:/home/user/
  • サーバ作業
$ mkdir .ssh
$ chmod 700 .ssh
# 公開鍵を追加する(新規作成の場合は mv id_rsa.pub .ssh/authorized_keys でもいい)
$ cat id_rsa.pub >> .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
$ sudo service sshd restart

6. ファイアウォールの設定

  • iptablesLinuxファイアウォールみたいなもの。許可・拒否する通信を設定する
  • わからないのでサイトの説明の通りに設定した
  • SSHのポートを変更した場合は必ず設定が必要
$ sudo iptables -A INPUT -p tcp --dport 10022 -j ACCEPT # (ssh)
$ sudo service iptables save
$ sudo service iptables restart

UEFI環境でWindows 10 + Ubuntu 16.04 LTS のデュアルブート

2017/05/07追記 Windows Creators Update してからWindows が起動しなくなったので、Windows Updateには気をつけてください

最近Windows にソフトをインストールしようとしてうまくいかなくて苛つくことが多い。Chocolatey が結構失敗する。

Windows 起動して毎回 vagrant up するのもめんどくさい、Bash on Ubuntu on Windows もなんだかなって感じなので、それならばいっそデュアルブート環境にしてみようと思った次第。 Linuxほぼ初心者なので有名ドコロで Ubuntu を入れました。

続きを読む

【雑記】JNDIがわからない

EJBサーバにWildflyを使用している。

lookupするときjava:appとかjava:moduleとかいろいろなネームスペースがあってどれを使ったらいいのかよくわからん。

なんとなく動いちゃってるけど、1回一からちゃんと調べたほうがいいな。

 

DI(Dependency Injection)もあまりわかってない。とりあえず@Resourceとか@Injection書いとけばいいんでしょみたいなノリでやってしまってる。DIといえばSpringみたいなイメージがあるのでSpringの勉強がてら学んでおきたい。

【C#】コレクション

C#にはジェネリックコレクションと非ジェネリックコレクションがある。
違いは型定義ができるかできないか。

ジェネリック ジェネリック
System.Collections.Generic.List System.Collections.ArrayList
System.Collections.Generic.Dictionary System.Collections.Hashtable

反復処理の書き方

List系

for文で書くと・

var list = new List<string>();
list.Add("hoge");
list.Add("fuga");

for(int i = 0; i < list.Count; i++){
    Console.WriteLine(list[i]);
}


foreachで書くと・

var arrayList = new ArrayList();

…

foreach(Object obj in arrayList){
    Console.WriteLine((string)obj);
}

Dictionary系

ジェネリック型の場合はKeyValuePairを使う。

var dict = new Dictionary<string, string>();

…

foreach(KeyValuePair<string, string> kv in dict){
    Console.WriteLine("Key={0}:Value={1}", kv.Key, kv.Value);
}

ジェネリック型の場合はDictionaryEntryクラスがキーと値のペアをobject型格納するよう。

var dict = new Hashtable();

…

foreach(DictionaryEntry entry in dict){
    Console.WriteLine("Key={0}:Value={1}", entry.Key, entry.Value);
}