JJUG CCC 2018 Spring メモ
JJUG CCC に行ってきた www.java-users.jp
ざっくりわかった気になるモダンGC入門
tomoya yokota さん
今のGC
- コンパクションGCしないとメモリがフラグメントしちゃう
- STWしちゃう
新しいGCが必要
Shenandoah GC
- OpenJDKのプロジェクト
- 世代型メモリ管理(New, Old)をしない リージョン型のメモリ管理
- 並列コンパクションの難しさを解消
- Compaction GCはしつつ処理は止まらない
ZGC
Epsilon GC
Java10まとめと、どうなるJava11
きしだ さん
New Release Model
- Feature リリース 6ヶ月ごと
- メンテナンスリリース 3ヶ月ごと
- LTS 3年ごと JDK11が9月にでる
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
- Parallel Full GC
- Application Class-Data Sharing
- Thread-Local Handshakes
Heap Allocation on Alternative Memory Devices
- 不揮発性メモリにヒープを割り当てられるようになった性
APIの変更
- java.io.Reader
- transferTo(Writer) NIOのクラスでやってたことをIOでできる
- java.io.Reader
JDK 11
- Single-File Soure-Code Programs
Raw String Literals
- バッククウォート3つでRaw Stringが書けるようになる
- SQL文とか書くときに改行コードとかタブとかそのままかける
Switch Expressions
switch
は現在ステートメントだけど式にする- Kotlin のWhen式みたいになる
- 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メニューが出て、Ubuntu か Windows か選んでたはず。あの画面だせないか? 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円-
- とりあえず名前は適当につけて、起動
- 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. ファイアウォールの設定
$ sudo iptables -A INPUT -p tcp --dport 10022 -j ACCEPT # (ssh) $ sudo service iptables save $ sudo service iptables restart
【雑記】JNDIがわからない
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); }