JSゆるふわめも

がっこうでべんきょうしたことをめもがきしてます

【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)というベーシスト

大由彰という偉大なベーシストがいた

唸るベースという表現がこれ程の似合うベーシストはいないと思っている

 

www.youtube.com

 

ただ、近年演奏している形跡は無く、ネットにも全く情報が見当たらない

現在でも演奏をされているのか、はたまたご存命なのか全く分からなかった

しかし、先日遂に大由彰さんの近況を知ることができた

 

大由彰さんとトリオを組まれていた山本剛さんのライブに行った際に、

山本さんに大由彰さんの近況を質問してみたのだ

 

「大由彰さんは現在でも演奏をなされているのですか。そもそもご存命なのでしょうか」

「大由彰さんね。生きてるよ、だけど今はもうね演奏してないのよ」

「えっ、どうしてなんですか」

「脳を一回やっちゃってね。彼の演奏凄いでしょ。演奏してると興奮しちゃうの。それでまた脳をやるのが怖いからって止めちゃったのよ…」

「そういうことなんですか…」

 

ということらしい

現在は演奏を行っていないことは残念だったが、何よりも命あっての人生しょうがない

 

しかし、今も演奏をなされていたらきっと日本を代表するトッププレーヤーとして名を馳せていたのだろうなぁ

 

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%増加する。

 

参考

qiita.com

文字列を変換する - オンライン文字列変換ツールを

HTTPリクエスト数削減テクニック1: インラインイメージ編 (1/3):CodeZine(コードジン)

Arrays.asListが返すリストの挙動

   List<String> words = new ArrayList(Arrays.asList(longWords,longWords2,"test","test1","test2"));
   words.removeIf(w -> w.length() <= 12);

上記のような処理を書くとUnsupportedExceptionで怒られしまう
原因はArrays.asListが返すリストのサイズは変更できないから
ArrayListのコンストラクタで通常?のArrayListに変換することでこの問題は回避できる。


namihira.hatenablog.com

CuncurrentHashMap.reduceEntriesメモ

reduceEntries
public Map.Entry reduceEntries(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]