【Go学習記録】Goルーチンさわり
javaで言う所のthreadがチャンネルというらしい
大雑把な使用方法
func main { stringChanel := make(chan string) //string型のデータを取り扱うチャンネルを生成する // intChanel := make(chan int) go useStringChanel(stringChanel) //スレッドの生成 fmt.Println(<-stringChanel) //チャンネルからデータの取り出し } func useStringChanel(ch chan <- string) { ... ch <- "Set string to chanel" }
実践的な使用方法は後の章で紹介されるようなので、とりあえず今の所はこんなもんでいいか
大由彰(Akira Daiyoshi)というベーシスト
大由彰という偉大なベーシストがいた
唸るベースという表現がこれ程の似合うベーシストはいないと思っている
ただ、近年演奏している形跡は無く、ネットにも全く情報が見当たらない
現在でも演奏をされているのか、はたまたご存命なのか全く分からなかった
しかし、先日遂に大由彰さんの近況を知ることができた
大由彰さんとトリオを組まれていた山本剛さんのライブに行った際に、
山本さんに大由彰さんの近況を質問してみたのだ
「大由彰さんは現在でも演奏をなされているのですか。そもそもご存命なのでしょうか」
「大由彰さんね。生きてるよ、だけど今はもうね演奏してないのよ」
「えっ、どうしてなんですか」
「脳を一回やっちゃってね。彼の演奏凄いでしょ。演奏してると興奮しちゃうの。それでまた脳をやるのが怖いからって止めちゃったのよ…」
「そういうことなんですか…」
ということらしい
現在は演奏を行っていないことは残念だったが、何よりも命あっての人生しょうがない
しかし、今も演奏をなされていたらきっと日本を代表するトッププレーヤーとして名を馳せていたのだろうなぁ
■
Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング
を読んでいて、BitSet.valueOfの使い方が良くわからなかったので調べた(正確には知ってる人に質問した)
上記書籍の良くわからなかった箇所は下記の部分
BitSet.valueOf(bytes).get(n) == ((bytes[n/8]) & (1<<(n%8))) !=0)
byte[] bytes = {(byte) 0b10101100, (byte) 0b00101000}
BitSet prime = BitSet.valueOf(bytes)
// {2, 3, 5, 7, 11, 13}
一体何がどーなって2, 3, 5, 7, 11, 13なんて数字が出てきたんだ…
valueOf
public static BitSet valueOf(byte[] bytes)
より正確には、
すべての n < 8 * bytes.length
に対してBitSet.valueOf(bytes).get(n) == ((bytes[n/8] & (1<<(n%8))) != 0)
となります。
このメソッドは、BitSet.valueOf(ByteBuffer.wrap(bytes))
と同等です。
一見ややこしいが、javadocの定義によると
1 0 (n / 8)
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 (n%8)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ( n )
0 0 1 0 1 0 0 0 | 1 0 1 0 1 1 0 0
n = 2の場合
1 = 00000001をn%8だけ左シフトすると00000100
byte[0] = 10101100
つまりこれらのビットのANDは
00000100
10101100
------------
00000100 != 00000000 (0)
BitSet.valueOf(bytes).get(2) == true
となり、2ビット目が立っていることが分かる。
単に、byte配列の値をベースにBitSetを初期化しているだけなんですね。
Base64メモ
A-Z(26)
a-z(26)
0-9(10)
+-,(2)
26 + 26 + 10 + 2 = 64文字
で表現されるエンコード方式
[変換前]Today is sunny
[変換後]VG9kYXkgaXMgc3Vubnku
で、何に使うの?
現在では、JSONなどで特殊文字を含まないように画像データをbase64でエンコードしたり、Webページの表示の際にリクエスト数を減らすためにbase64でエンコードした画像をhtmlにそのまま埋め込むなどの用途で用いられています
特殊文字 を汎用的な文字?に置き換えることによって、環境依存を避ける
リクエスト数を減らす?よく分からないのでググる
画像データをBase64でエンコードして、取得した文字列を用いてインラインイメージ(HTML/CSSに埋め込まれたイメージデータ)化する。
つまり、10個の画像データがHTMLファイルとは別に管理されていた場合、それらにアクセスするために10回リクエストが飛ぶが、HTMLファイルに埋め込んでしまえば1度のアクセスで済むので高速にページが表示できるよね。といった話
当然というかイメージで大体わかると思うが、文字列に変換することでデータ容量は増える。根拠は調べてないが約37%増加する。
参考
Arrays.asListが返すリストの挙動
CuncurrentHashMap.reduceEntriesメモ
reduceEntries public Map.EntryreduceEntries(long parallelismThreshold, BiFunction ,Map.Entry ,? extends Map.Entry > reducer) 指定されたリデューサを使用して値を結合することにより、すべてのエントリの累積結果を返します。結果がない場合はnullを返します。 パラメータ: parallelismThreshold - このオペレーションを並列的に実行するために必要な(推定の)要素数 reducer - 交換可能性と結合性を持つ結合関数 戻り値: すべてのエントリを累積した結果 導入されたバージョン: 1.8
自分は小学生並みの脳みそしか有していないので、これを見てもぱっと見よく話からない。 一つ一つ見ていく
戻り値はMap.Entry<K,V>
long parallelismThreshold 平行操作を実行する閾値、つまりここで指定したEntry以上の要素が存在すれば並列実行される
BiFunction<Map.Entry<K,V>,Map.Entry<K,V>,? extends Map.Entry<K,V>>
脳が崩壊しそうだ…
? extends Map.Entry<K,V> reducer(Map.Entry<K,V> entry,Map.Entry<K,V> entry) 上記のような形式のラムダ式を呼ぶことができる。
何となく分かった。で、最大値を検索?するサンプル
ConcurrentHashMap<String, Integer> randomMap = new ConcurrentHashMap<String, Integer>(); //10000個ランダムな値を生成 new Random().ints(10000).forEach(value->randomMap.put(String.valueOf(value) , value)); // Map.Entry<String, Integer> max = randomMap.reduceEntries(1, (e1,e2) -> e1.getValue() > e2.getValue() ? e1 : e2); System.out.println(max);
ZoneDateTImeで24時間以上plusHourした場合
private void test() { ZonedDateTime now = ZonedDateTime.now(); System.out.println(now); ZonedDateTime over24 = now.plusHours(30); System.out.println(over24); }
実行結果
2017-01-15T15:21:05.128+09:00[Asia/Tokyo] 2017-01-16T21:21:05.128+09:00[Asia/Tokyo]