OmniAICreator/Qiita-1.07M huggingface dataset:
GoでTCPとUDPのデータの扱い方を比較してみた

この記事は [東京理科大学 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/tokyo_university_of_science) ６日目の記事です。
## はじめに
今回Goのnetパッケージを使ってTCPソケット通信を扱う機会があったので、同じnetパッケージで扱うことのできるUDPソケット通信と比較してみました。
## 比較方法
クライアント側からサーバ側に`hello`とたくさん送り、そのまま出力した時の両者の違いをみます。
## TCPソケット通信
TCPによる通信ではデータをバイトストリームと呼ばれるbyte型のひと続きのデータとして扱います。

### ・クライアント  
クライアントのコードは以下です。

```go:tcp_client.go
package main

import (
	"log"
	"net"
)

func main() {
	conn, err := net.Dial("tcp", "localhost:8088")
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	// メッセージを送信する
	for {
		msg := "hello"
		conn.Write([]byte(msg))
	}
}

```
### ・サーバ
サーバのコードは以下です。

```go:tcp_server.go
package main

import (
	"fmt"
	"log"
	"net"
)

func main() {
	listener, err := net.Listen("tcp", "localhost:8088")
	if err != nil {
		log.Fatal(err)
	}
	for {
		conn, err := listener.Accept()
		if err != nil {
			log.Print(err)
			continue
		}
		defer conn.Close()

		go handleconn(conn)
	}
}

func handleconn(conn net.Conn) {
	buf := make([]byte, 1024) // 1024バイトのスライスを用意
	// 送られてきたメッセージを出力
	for {
		n, _ := conn.Read(buf)
		fmt.Println(string(buf[:n]))
	}
}

```
### 実行結果
```zsh:zsh
$ go run tcp_server.go
hellohellohellohellohellohellohellohellohello
hellohellohellohellohellohello
hello
hellohellohellohello
hellohello
hello
hello
hello
...
```
## UDPソケット通信
UDPによる通信ではデータを独立したパケットのデータグラムとして扱います。

### ・クライアント
クライアントのコードは以下です。

```go:udp_client.go
package main

import (
	"log"
	"net"
)

func main() {
	conn, err := net.Dial("udp", "localhost:8088")
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	// メッセージを送信する
	for {
		msg := "hello"
		conn.Write([]byte(msg))
	}
}

```
### ・サーバ 
サーバのコードは以下です。

```go:udp_server.go
package main

import (
	"fmt"
	"log"
	"net"
)

func main() {
	udpAddr, err := net.ResolveUDPAddr("udp", ":8088")
	if err != nil {
		log.Fatal(err)
	}
	conn, err := net.ListenUDP("udp", udpAddr)
	if err != nil {
		log.Fatal(err)
	}
	for {
		defer conn.Close()

		go handleconn(conn)
	}
}

func handleconn(conn *net.UDPConn) {
	buf := make([]byte, 1024) // 1024バイトのスライス
	// 送られてきたメッセージを出力
	for {
		n, _ := conn.Read(buf)
		fmt.Println(string(buf[:n]))
	}
}

```
### 実行結果
```zsh:zsh
$ go run udp_server.go
hello
hello
hello
hello
hello
hello
hello
hello
...
```
## まとめ
以上の結果から、TCPではデータをストリームとして扱っているので何も処理をせずにそのまま出力した場合は`hello`という文字列が連結されて出力される場合があることがわかった。
また、UDPではデータをパケットごとにデータグラムとして扱っているためそのまま出力しても`hello`という文字列が区切られて出力されることがわかった。
## 蛇足
UDPと同じ出力結果になるようにTCPで処理をしようとした場合、
`データの末尾に\nなどの区切り文字を用意する`
`データのヘッダにデータのバイト数をつけて送信する`
ことで処理ができます。
PostgreSQL におけるbit演算とbit型<=>bytea型の変換


# はじめに
OracleではRAW型というものがあり、UTL_RAWパッケージを使ってRAW型のbit演算やbyte単位でのアクセスが簡単にできました。
ただ、Postgresqlで同じ事をやろうとすると、途端に難しくなったのでメモとしてここに記載します。

## 環境
PostgreSQL 9.6.8

## bit記法
b'' で0,1を囲むと、bit列として認識されます。 

```
=> select b'11110000' as bit_a;
  bit_a
----------
 11110000
(1 row)

=> select pg_typeof(b'11110000');
 pg_typeof
-----------
 bit
(1 row)
```

## bit演算
bit型同士であれば、& | でand,or演算ができます。

```
=> select b'11110000' & b'10101111' as and;
   and
----------
 10100000
(1 row)

=> select b'11110000' | b'10101111' as or;
    or
----------
 11111111
(1 row)
```
## bytea型とは
byte単位でアクセスできるbyte列と考えてもらって問題ないでしょう(汗)
bit型でデータを保持してると、バイト単位でアクセスができず不便なので、oracleでraw型を使ってた人はbytea型でデータを保持する事になると思います。
また、bytea型同士のbit演算はできないので、演算するときは一旦bit型に変換する必要があります。

## bytea記法
いろいろ書き方はあるみたいですが、16進数表記を E'\\x' で囲むのが一番分かりやすいです。get_byteなどのバイナリ文字列関数を使って、バイト単位でアクセスが可能です。

```
=> select E'\\x0f0e1051'::bytea;
   bytea
------------
 \x0f0e1051
(1 row)

# 0 byte目にアクセス
=> select get_byte(E'\\x0f0e1051'::bytea, 0);
 get_byte
----------
       15
(1 row)
```

## bit型からbytea型への変換
8byteを超えるビット列だと、bigintへのキャストでエラーになってしまうので、1byteずつ変換する必要があります。

```
# 1byte単位
=> select decode(lpad(to_hex(b'00001111'::int), 2, '0'), 'hex');
 decode
--------
 \x0f
(1 row)

=> select decode(lpad(to_hex(b'11110000'::int), 2, '0'), 'hex');
 decode
--------
 \xf0
(1 row)

# 3byte単位
=> select decode(lpad(to_hex(b'111100001111111101010000'::int), 6, '0'), 'hex');
  decode
----------
 \xf0ff50
(1 row)
```
## bytea型からbit型への変換

```
# 2バイト分の変換
=> select ('x' || ltrim(E'\\x0f0c'::bytea::text, '\\x'))::bit(16);
       bit
------------------
 0000111100001100
(1 row)
```

# まとめ
Postgresqlはbit型は用意しているけど、sqlクエリでbit演算をする事を想定していないのかもしれない。
100byte同士のbit演算をsqlクエリや、function内でできるようにしてほしい。
現状は1バイトずつ bit <=> bytea 変換の手間が発生してしまう。
[Swift, Xcode] Command PhaseScriptExecution failed with a nonzero exit code

次の手順でうまくいきました
1. キーチェーンアクセスを起動
2. ロックをかける
3. ロックを外す
4. もう一度ビルド（その際に出て来たポップアップは「常に許可」を選択）

そのほかの対処法としては以下のようなものがありましたが、うまく行きませんでした
・podをcleanしてから再インストール
・`pod update`
・パソコン再起動


出典：
https://stackoverflow.com/questions/53289524/xcode-10-command-phasescriptexecution-failed-with-a-nonzero-exit-code
AWS Lambda Layersを使ってみた！(Python)

# はじめに
こんにちは。みんなのウェディングのインフラエンジニア[横山](https://twitter.com/tatsuo4848)です。
この記事は[くふうカンパニーアドベントカレンダー](https://qiita.com/advent-calendar/2018/kufu)の4日目になります。
今回は、re:Invent2018で発表された[AWS Lambda Layers](https://aws.amazon.com/jp/blogs/news/new-for-aws-lambda-use-any-programming-language-and-share-common-components/)をPythonで使ってみたのでまとめていきます。

# AWS Lambda Layers
AWS Lambda Layersとは複数のLambda関数で共通利用したい処理をまとめておける機能です。
Lambdaを書いていると、Slackへの通知処理など複数のLambda関数で同じような処理を書いていることに気づくと思います。
AWS Lambda Layersを使うと、こういった処理をLambda関数から切り離し、Layerとすることで、複数のLambda関数で再利用することが可能になります。

# 使い方
まずはlayerとなる関数を作成します。ファイル名はなんでも良いですが、`python`ディレクトリを作成してその直下に作るようにしてください。
ディレクトリ名が異なると動きません。ここで30分ほどハマりました。。

```sh
$ mkdir python
$ touch python/layer.py
```

今回は内容を以下のようにしました。

```layer.py
def hello(name):
    return f'Hello!! {name}'
```

続いてこちらのファイルをディレクトリごとzip圧縮します。

```
$ zip -r python.zip python/
```

圧縮したファイルをマネージメントコンソールからアップロードします。
<img width="1334" alt="スクリーンショット 2018-12-03 12.23.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/117895/5f61bb8a-e126-1ca7-56fb-1caeaee728ca.png">

次にLayerを利用するLambda関数を作成していきます。
まずはマネージメントコンソールで通常通りLambda関数を作成します。
<img width="1346" alt="スクリーンショット 2018-12-03 12.25.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/117895/7fd528b7-c08e-8d45-2811-6335120959ff.png">

Layersという項目があるのでそこから作成したLayerを設定していきます。
<img width="1327" alt="スクリーンショット 2018-12-03 12.26.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/117895/ae796c3d-3e3f-bbd6-6595-caa5608bf8f0.png">

Layerを利用する側のLambda関数は以下のようにしました。こちらもマネージメントコンソールで入力していきます。

```lambda_function.py
import layer

def lambda_handler(event, context):
    print(layer.hello('wedding'))
```

今回はLambda関数に渡されるJSONデータはなんでも良いので、適当にテストを設定して実行します。
<img width="903" alt="スクリーンショット 2018-12-03 12.31.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/117895/8cf25454-9973-b71d-3158-fb1137569624.png">

ログに`hello!! wedding`と表示されました。成功です :hugging_face:
<img width="1299" alt="スクリーンショット 2018-12-03 12.31.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/117895/3eb1652a-e7ff-156e-7ebc-f90fc7eadef0.png">

# まとめ
簡単にですがLayerの設定から実行までの流れをまとめてみました。
Ruby対応も嬉しいですが、AWs Lambda Layersも個人的には同じくらい嬉しいです。
[くふうカンパニーアドベントカレンダー](https://qiita.com/advent-calendar/2018/kufu)、5日目となる明日は[ryoster](https://twitter.com/RYO_T)さんの「デザイナーがGatsby.jsを使った感想とか仲良くなれそうな方法を書いてみる」です。
UserScriptで楽しくJavaScriptを覚えよう

# はじめに
クライアントサイドのJavaScriptフレームワークって色々あると思いますが、
それ以前に素のJavaScriptの構文に自信がない人って以外と多いんじゃないでしょうか。

素のJavaScriptを覚えようと思ってるけど、別に作りたいものもないしなあ…って悩んでいる人はいませんか。
それ、もしかしたらUserScriptを作ってみると楽しく覚えられるかもしれません。

# UserScriptって？
Webページにアクセスした側が用意したスクリプトで、Webページに対して変更や操作を行うことができる機能のことです。
例えばGoogleで検索したときに、画面を下にスクロールするだけで次ページの検索結果を表示できるようにしたり、
入れ子になって階層化されているli要素をツリービューっぽく改変したりなんてことが可能です。

Firefoxであれば[GreaseMonkey](https://addons.mozilla.org/ja/firefox/addon/greasemonkey/)、Chromeであれば[Tampermonkey](https://tampermonkey.net/)という拡張機能を入れることで利用することができます。

# 例えばこんなことありませんか
Sublime TextやVS CodeでAsciiDocをシンスタックハイライトさせてるけど、
さくらエディタでもシンスタックハイライトさせたいなあ。
よし、ググって見よう。どれどれ…？
![1.png](https://qiita-image-store.s3.amazonaws.com/0/301469/ad2fe5b7-6c45-6451-dd65-73cb978f8194.png)

んん…？

![2.png](https://qiita-image-store.s3.amazonaws.com/0/301469/6fd58650-9de7-29b7-0b31-5f2e67cc4af7.png)

なんでこんな勝手なことしてるの。俺はOR検索じゃなくてAND検索してるんだ。勝手に除外するんじゃない！
含まれないなんて…駆逐してやる！！この世から…一匹残らず…！！

# こんな時はUserScriptを書こう
## 1.おもむろにF12キーを叩き、開発者ツールを開く
![3.png](https://qiita-image-store.s3.amazonaws.com/0/301469/82de25c1-afc9-6643-4d5c-a430240edb9a.png)

## 2.「含まれない」の検索結果を消したいので、「含まれない」の要素と、消したい親要素を探す
マウスカーソルの位置が消したい要素。「含まれない」の6つ分親の要素みたいですね。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/301469/016257b7-fa79-9100-2200-1d9d46c828fa.png)

## 3. コードを書いて、開発者ツールのコンソールで動作確認をする
display:none;にすれば多分消えると思うので、試しにコードを書いてみます。
それにしてもparentNode地獄が酷いですね。CSSの:has()はいつになったらサポートされるんだろう。

```javascript
let e = document.querySelectorAll('div.TXwUJf span');
for (let i = e.length; i--;) {
  e.item(i).parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.style.display = 'none';
}
```

まあでもとりあえずコンソール上で叩いて上手く消えてくれました。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/301469/774d04b7-e393-9121-91c5-b9f8b3815e9b.png)

## 4. 即時関数にする
他のコードと干渉するとまずいので即時関数化します。
letで書いてるから{}で括るだけでいいかもしれない…。

```javascript
(function() {
  let e = document.querySelectorAll('div.TXwUJf span');
  for (let i = e.length; i--;) {
      e.item(i).parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.style.display = 'none';
  }
})();
```

## 5. GreaseMonkeyやTampermonkeyに反映する
拡張機能でスクリプトを追加して、4.で作ったコードを貼り付けます。
Googleの検索結果のページだけで動かしたいので、includeをこんな感じで指定してみました。

```javascript
// ==UserScript==
// @name     Googleの検索結果から「含まれない」を除外する
// @version  1
// @include  /^(http|https):\/\/www\.google\..+\/search.*/
// @grant    none
// ==/UserScript==
(function() {
  let e = document.querySelectorAll('div.TXwUJf span');
  for (let i = e.length; i--;) {
      e.item(i).parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.style.display = 'none';
  }
})();
```

## 6. 検索ページを表示してみる
実際にページを表示して、3.と同じ画面になっていれば成功です。

# 終わりに
このように、ユーザースクリプトなら普段からWebページにアクセスしたときに不満に思ってるあれそれを題材にできて、
コードを手早く書いて、すぐに結果が確認できるので楽しくコードを覚えることができるかもしれません。

UserCSSなんてものもありますので、CSSに自信がない人はそちらも同じように使ってみてください。
Webサイトがスマホ・タブレットの横向きで見ると見づらい（崩れる）問題

おはようございます、こんにちは、こんばんわ。
今回はスマホ・タブレットの横向き対応について書きます。
みなさんの今後のweb制作における、選択肢一つになればと思います。

##スマホ・タブレットの横向き問題
最新のスマホ・タブレットの横向きにするとPCのレイアウトが表示されたり、めちゃくちゃ見づらかったり...
PCのみで全画面スクロールジャックしていたり、画像が一画面に入りきっていなかったりなどありませんか？
様々な諸事情で「なんでスマホの画面は回転しやがるんだ！！」と怒る人や「お願いですから横にタブレットを横向きにしないでください！」と懇願する人もいるでしょう？

ここは一つ勇気を持って提案してみませんか。

##横向き禁止令
横向き禁止令と物騒な匂いがしますが、単純にスマホ。タブレットを横向きにした時に「縦向きにしてください」伝える画像を画面全体に表示するだけです。

特別な仕様でなければ大体横向きにしても崩れることは少ないでしょう。
ですが、これ以上時間をかけられない時やどうしても仕様上崩れてしまう時などの解決策候補として提案してみましょう。

具体的な例として
https://www.sonicjam.co.jp/
ソニックジャム様
https://www.crowdgate.co.jp/
CrowdGate様
などがありました。

##発令方法
orientationchange[^1]イベントを使用してデバイスの向きによって画像を表示させるだけです。
具体的なコードはこちら

```javascript:サンプル
    window.addEventListener('orientationchange',function(){
      if (window.orientation == 0) {
        document.querySelector('.hoge').classList.remove('is-show'); //横向きの場合の処理
      } else {
        document.querySelector('.hoge').classList.add('is-show'); //縦向きの場合の処理
      }
    },false);
```

`window.orientation`は縦向きの時に0を返してくれます。
あとは`.is-show`が付与されたら表示するようにcssを記述するだけです。
jqueryを使用する際は直接`show()` `hide()`で制御した方が楽だと思います。

##まとめ
具体例のwebサイトを探している時に沢山横向きでwebサイトを見ましたが、画像やコンテンツが大きすぎたりして見づらいwebサイトが大半でした。
これ以上時間をかけられない時などの解決策候補と書きましたが、見づらいままにするくらいなら今回の記事のような対応をしておくのも良いかもしれないと思いました。

[^1]: http://urx2.nu/O7cA
MeCabでRuntimeErrorが出てしまった


コンソールでmecabを実行してみたところ以下のエラー

```
$ mecab
no such file or directory: /Users/bambis13s/Downloads/myapp/data/hogehoge.dic
```

自分のブランチでmyappにUser辞書を追加したことを忘れていた...!

`mecabrc`に設定してあるuserdicをコメントアウトにしてエラー解消

```
$ vim /usr/local/etc/mecabrc

;
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
dicdir = /usr/local/lib/mecab/dic/mecab-ipadic-neologd

;userdic = /Users/bambis13s/Downloads/myapp/data/hogehoge.dic

...
```
Json-serverでモックAPI

# Homebrew

# Node.js環境準備
### Homebrewインストールし
```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
### Nodebrewインストール
```
brew install nodebrew
```

### Node.jsインストール（最新バージョン）
```
nodebrew install-binary latest
```
バージョンを指定する場合には 
`nodebrew ls-remote`からインストールできるバージョンリストを確認して、
`nodebrew use v10.12.0`のようにバージョンを指定してインストールする

### Node.js利用するバージョン指定
インストールされているリストを `nodebrew list`から確認して使う指定する

```
nodebrew use v10.12.0
```

### terminalでnode commandを使えるようにする
$PATHにnodeを追加する

```
 echo 'export PATH=$PATH:/Users/{computer_name}/.nodebrew/current/bin/' >> ~/.bashrc
```
`.bash_profile`も使っている場合、node commandが効かない場合には`.bash_profile`に以下を追記する

```bash

if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
```


#Json Serverを使ってモックAPI
基本的な使い方は[json-serverのgithubページ](https://github.com/typicode/json-server)から確認できる
今回apiが多くまたapiごとにjsonの中身が大量に入っているため、[エンドポイント毎にjsonファイルを分割する方法](https://qiita.com/nouka/items/47f26eecfd40712875e1)を参考で構築する

```
mkdir api-mock
cd api-mock

npm init
npm install -g json-server

mkdir api
mkdir scripts
vi merge_mock_json.js
```

`api-mock > api` には分割しているjsonファイルの置き場
`api-mock > scripts > merge_mock_json.js` は複数のjsonファイルを結合するスクリプトです

```Js:merge_mock_json.js
const fs = require('fs');
const path = require('path');

// ルートパスを設定
const root = path.resolve('../', 'api-mock/api');

console.log(root);

fs.watch(root, function(event, filename) {
  // /api/mock配下にあるjsonファイルの名前をエンドポイントとして読み込む
  console.log(filename);
  
  
  const api = fs.readdirSync(root).reduce((api, file) => {
  	if (api === undefined) {
        	api= {}
	};
	
  	
  	if (path.extname(file) == '.json') {
		const endpoint = path.basename(file, path.extname(file));
		console.log(endpoint);
		
		console.log(root + '/' + file);
		
		if (api[endpoint] === undefined) {
        	api[endpoint] = {}
		};
		api[endpoint] = JSON.parse(fs.readFileSync(root + '/' + file, 'utf-8'));
		return api;
		  	
  	}
  }, {});
  
  
  fs.writeFile(root + '/../mock.json', JSON.stringify(api), function(err) {
    if (err) throw err;
    console.log('mock file updated.');
  });

});
```

上記のscriptでapiフォルダにあるjsonファイルを監視して複数のjsonファイルを結合下mock.jsonを生成する

このままだとapiのroutesが`http://localhost:3000/{jsonファイル名}`になるため、routesもカスタムしたい。
`http://localhost:3000/api/v1/{jsonファイル名}`でアクセスできるようにする

`api-mock`の直下に以下の`routes.json`ファイルを作ります。

```json:routes.json
{
  "/api/v1/*": "/$1"
}
```

また上記scriptとjson-serverを並列実行するため、npm-run-allというライブラリをインストールします。

```
npm install --save-dev npm-run-all
```
`api-mock > package.json`にnpm scriptsを記載します

```json:package.json

{
  ...
  "scripts": {
    "serve": "npm-run-all -p create-mock boot-mock",
    "create-mock": "node ./scripts/merge_mock_json.js",
    "boot-mock": "json-server --watch ./mock.json --routes routes.json",
    ...
  },
  ...
}
```

モックAPI起動は以下のコマンドです。

```
npm run serve
```


http://tech.yayoi-kk.co.jp/entry/2018/06/25/120611
ブロックチェーン上に生まれるいろいろなトークン

# はじめに
ブロックチェーン上には様々なトークンが存在します。

- Bitcoinネットワークでマイニングによって生成されるBitcoin
- イーサリアムのEth
- NEMのnem:xem

などのネットワーク上で消費されるトークンの他に、

- Bitcoinのチェーンを利用してトークン発行機能を盛り込んだカウンターパーティトークン
- 送受信できるトークンとしての振る舞いを持ったイーサリアムのコントラクト内にあるトークン
- NEMの標準機能によって発行されたトークン(nem:xemはこの一種です)

などもあります。

これらは一般的に **トークン** と呼ばれているものなので、各々の中のトークンの定義に差こそあれ、大体のイメージは共有できると思います。

でも、実はトークンと呼ばれるものはこれらだけではないですよ。というお話をいくつか例を上げて説明します。

# 1.貸し借りの記録

例えば、ある日、ナカモトさんがヤマモトさんに1万円を借りたとします。ヤマモトさんは後になってこの1万円の貸し借りで揉めるのが嫌なので証拠としてブロックチェーンに書き込むことにしました。

![draw1.png](https://qiita-image-store.s3.amazonaws.com/0/216882/67529350-914e-0ac8-d0d5-009202a9c0ee.png)

そして別の日、今度はヤマモトさんがナカモトさんに5,000円を借りたとします。マメなヤマモトさんはこれもブロックチェーンに書き込みます。

![draw2.png](https://qiita-image-store.s3.amazonaws.com/0/216882/364b97ca-c442-a6ab-02a7-541f0ed16482.png)

ここで、ブロックチェーン上に２つの記録が残りました。これは、貸し借りの記録であり、つまりは **ナカモト-ヤマモト間の貸し借りの台帳** に他なりません。今現在、この２つのトランザクションを見ると、5,000円が相殺されてヤマモトさんがナカモトさんに5,000円貸している状態であることがわかります。

そしてこの台帳の上に書かれている数字は、貸し借りの媒体であり、これをブロックチェーン上のトークンであると呼んでも問題ないと思います。この記録により、1万円分のトークンがブロックチェーン上に生まれたのです。

またその時、トランザクションに記載されている`ヤマモト`と`ナカモト`という名前はブロックチェーン上に擬似的に生まれたアドレスと言うことも出来ると思います。

![draw3.png](https://qiita-image-store.s3.amazonaws.com/0/216882/c8657c2d-2696-6eae-7a7a-0d028c54035a.png)

このトークンはナカモト-ヤマモト間でしか通用しませんが、二人の間では擬似的にトークンを発行してブロックチェーンに管理させているのと同じです。

実は、 **あるチェーンを間借りしてトークンを発行する** というのは、すごく大雑把に言うとこういう仕組みになっています。

# 2.アドレスもトークン

アドレスもブロックチェーン上にあるトークンの一つです。ICOを利用して分配されるようなトークンとの違いは、 **ユニークである** という点です。

アドレスは、そのチェーンの中に必ず一つしかありません。そしてその所有権を証明するには、それに紐づく秘密鍵で何かに署名をすれば済みます。

例えば、ある芸術作品とあるアドレスを紐付けをするとします（この作品はこのアドレスに紐づくと宣言する）。そしてその所有者は、そのアドレスに紐づく秘密鍵さえ持っていれば、その作品の所有者であると、作品を持って歩かなくても証明できるのです。

ただ、ビットコインなどのアドレスは「秘密鍵→公開鍵→アドレス」という流れで生成され、それらは固定された関係にあるので、アドレスを商品として扱うには、そのままでは扱いづらいところが有ります。

![draw4.png](https://qiita-image-store.s3.amazonaws.com/0/216882/de7e4497-1637-dd5f-1aea-d249e4cf6baf.png)

この点でNEMは、元々そのアドレスに紐づく秘密鍵を知ってさえれば、そのアドレスに紐づく公開鍵(とそれに紐づく秘密鍵)を別の公開鍵に付け替えることができ、この点を克服しています。

![draw5.png](https://qiita-image-store.s3.amazonaws.com/0/216882/881b7aff-7033-8d9f-0ffe-ab0002c5dcbf.png)

そして、それを利用した仕組みこそが **アポスティーユ** と呼ばれるものです。

# 3.見立てれば何でもトークンになる

結局のところ、 **1** も **2** も、本来そのために作られたものでは無いが、 **見立てることで擬似的にトークンを生成しているだけ** です。

なので実際のところ、貴方が何かルールを決めてブロックチェーン上に保持されている記録を眺めることで、沢山の種類の（性格を持った）トークンを生み出すことが出来ます。

# さいごに

ここまで話すと、ではトークンを発行して何かを作ろうと考えた時に、ブロックチェーンによる違いがあるのか、どういう違いが最後に残るのか、という話になると思いますが、それは各自で考えてください。

**見立てる** という行為で機能を拡張することが出来ることだけ伝わればと思っています。
React/Reduxのフォルダ管理「re-ducks」を導入する with TypeScript, redux-observable

React/Reduxのプロジェクトで、いろいろリファクタしたと思っており、re-ducksなるものを知った。この、[「React/Reduxで秩序あるコードを書く」](https://speakerdeck.com/naoishii/reduxde-zhi-xu-arukodowoshu-ku)というかなりの良記事(良スライド)で紹介されている。他に[これ](https://noah.plus/blog/021/)とかも参考にした。

[公式](https://github.com/alexnm/re-ducks)と[公式のmedium記事](https://medium.freecodecamp.org/scaling-your-redux-app-with-ducks-6115955638be)も参考になる。

## とりあえずGitHubにサンプルを置いておいた
[GitHubにサンプル](https://github.com/Mizumaki/re-ducks_example)を置いてある。基本的にはそれを参考にしていただければと思うが、以下、すごく適当に解説する。すごく適当に。

## まずフォルダを作成
viewとstateに完全に分離させるため、statesフォルダとviewsフォルダを作り、viewsフォルダの中にcontainersとcomponentsフォルダを入れます。また、App関連のファイルもviews内に移動します。store.tsはstate管理に関するため、statesフォルダ内に格納します。

index.tsxだけはviewともstateとも直接的に関わるため、src直下に置きます。

## re-ducks管理を始める
states以下にducksフォルダを作成し、その配下にre-ducks管理するファイル群を入れていく。

ducks配下のindex.tsは、ducksでexportされた各reducerをまとめる役割を持つ。これをstoreに繋げることで、reducerとstoreが繋がる。

## re-ducks固有のOperationsとSelectors
re-ducksには、ducksにもなかった要素が2つ出てきます。「Operations」と「Selectors」です。

### Operationsとは
「Operations」は、actionをviewから完全に分離させるためのものです。例えば、従来であればcontainerにて、以下のように直接actionを呼び出していたと思います。

```src/containers/Comments.tsx
const mapDispatchToProps = (dispatch: Dispatch<Action<any>>) => {
  return {
    fetchData: (url: string) => dispatch(commentsActions.fetch.started({ url }))
  }
};
```

しかしOperationsを作成することで、containerがactionの実装を知る必要がなくなります。

```src/views/containers/Comments.tsx
const mapDispatchToProps = (dispatch: Dispatch<Action<any>>) => {
  return {
    fetchData: (url: string) => commentsOperations.fetch(url)
  }
};
```

### Selectorsとは
「Selectors」は、storeに格納されているstateを、componentで必要されている状態に整形する作業を担います。stateに対して行うタスクをSelectorsに任せることで、containerではstateをSelectorsに渡すだけでよくなり、viewとstateが明確に分離されます。さらに[reselect](https://github.com/reduxjs/reselect)というライブラリを使用することで、[stateのうち関係する部分に更新があった場合にのみ計算処理を行ってstateを更新する](https://qiita.com/zaki-yama/items/5258e6f1ae37f63034b9#createselector-を使うと何がうれしいか)ことができ、無関係なstateの更新によって計算処理が実行されてしまうのを防ぎます。
Spring Framework / Spring Bootのサポート期限

> 2019年10月27日 Spring Framework 5.2などの情報も含めて、最新情報に更新しました
> 2019年12月4日 公式ブログからの新たな発表を踏まえて、最新情報に更新しました
> 2019年12月11日 GitHub Wikiの内容を踏まえて、最新情報に更新しました
> 2021年2月25日 GitHub Wikiの内容を踏まえて、最新情報に更新しました
> 2021年11月19日 公式サイトの情報を踏まえて、最新情報に更新しました

公式サイトにわかりやすいグラフが作成されましたので、そちらをご確認ください。

# Spring Framework

https://spring.io/projects/spring-framework#support

# Spring Boot

https://spring.io/projects/spring-boot#support
ModuleNotFoundError: No module named 'imgutil'の解決法

前提・実現したいこと
anacondaのpython3.6の仮想環境を利用して下記のサイトhttps://blog.wackwack.net/category/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-python
のプログラムを構築したのですが、No module named 'imgutil'と出てしまい進みません。

発生している問題・エラーメッセージ
runfile('/Users/nakayakenta/untitled0.py')
Traceback (most recent call last):

File "", line 1, in 
runfile('/Users/nakayakenta/untitled0.py')

File "/Users/nakayakenta/anaconda3/envs/python35conda/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py", line 668, in runfile
execfile(filename, namespace)

File "/Users/nakayakenta/anaconda3/envs/python35conda/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py", line 108, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)

File "/Users/nakayakenta/untitled0.py", line 3, in 
import imgutil

ModuleNotFoundError: No module named 'imgutil'

インストール方法
https://github.com/quotto/imagecrawler/blob/master/imgutil.py
のファイルを
import sys
sys.path
/Users/nakayakenta/anaconda3/envs/python35conda/lib/python3.6
先に保存しました。

試したこと
パスの確認と下記のサイトを参考にエラー確認。

https://teratail.com/questions/133699

/Users/nakayakenta 先に保存先を変えてみましたが、改善しませんでした。

補足情報（FW/ツールのバージョンなど）
python3.6.6
mac OS Mojava
Bootstrap4で表示・非表示(collapse)

## 概要
フロントフレームワークを使ってみたのでメモする。

## サンプル
```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <!-- Required meta tags -->
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <title>BootStrap Sample</title>

  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
</head>
<body>
  <div class="container">
    <div class="row">

      <div class="col-12 mb-5">
        <h3 clsss="display">静的な設置方法</h3>
        <button type="button" class="btn btn-primary" data-toggle="collapse" data-target="#demo">Toogle</button>
        <div id="demo" class="collapse mt-3">
          <div class="card card-body">
            <p>this is collapse sample.</p>
          </div>
        </div>
      </div>

      <div class="col-12 mb-5">
        <h3 clsss="display">動的な設置方法</h3>
        <button type="button" class="btn btn-primary" id="btn-toggle">Toggle</button>
        <button type="button" class="btn btn-primary" id="btn-show">Show</button>
        <button type="button" class="btn btn-primary" id="btn-hide">Hide</button>
        <div id="card" class="collapse mt-3">
          <div class="card card-body">
            <p>this is collapse sample.</p>
          </div>
        </div>
      </div>

    </div>
  </div>

  <!-- Optional JavaScript -->
  <!-- jQuery first, then Popper.js, then Bootstrap JS -->
  <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
  <script>
    (function($){
      const card = $('#card');
      $('#btn-toggle').on('click', (e) => {
        if (card.hasClass('show')) {
          console.log('hide -> show');
        } else {
          console.log('show -> hide');
        }
        card.collapse('toggle');
      });

      $('#btn-show').on('click', () => {
        card.collapse('show');
      });

      $('#btn-hide').on('click', () => {
        card.collapse('hide');
      });
    })(jQuery);
  </script>
</body>
</html>
```
実行してみる。
![collapse.png](https://qiita-image-store.s3.amazonaws.com/0/142279/b70d3b51-47b2-09f1-8ed9-09807af7c3a0.png)

コンソールを確認してみる。
![console.png](https://qiita-image-store.s3.amazonaws.com/0/142279/2b7baaec-fa2f-8a0c-35c7-7831ed56befe.png)

以上

## 参考サイト
- [Bootstrap4 - Collapse](https://getbootstrap.com/docs/4.0/components/collapse/)
スプレッドシートでGoogle翻訳使うよ（GoogleTranslate）

## 英語苦手なんだけど、
英語のドキュメント求められることがありますよね。
外国人スタッフへの説明用に意訳でもいいからほしぃ、といわれたり。
オフショア先に出すから日本語と英語の設計書を両方必要なんです、とか。

そんなときの強い味方は[Google翻訳先生](https://translate.google.co.jp/?hl=ja#en/ja/GoogleTranslate)なわけですが、
実はGoogleスプレッドシートには、Google翻訳のAPI呼び出しできる関数があります。

・[GOOGLETRANSLATE](https://support.google.com/docs/answer/3093331)

引数にテキストと翻訳前と後の言語を指定してあげれば、Google先生を呼び出すことができます。
素敵ですね！

## 早速、利用例見てましょう
![google翻訳1.png](https://qiita-image-store.s3.amazonaws.com/0/141209/f58c57a0-d2b1-189c-bfb1-1caba83d29e5.png)

ね、簡単でしょ？

もちろん、セルを指定することができます。
![google翻訳2.png](https://qiita-image-store.s3.amazonaws.com/0/141209/2d665f9d-5a29-faba-7c62-bb57bb27cb5d.png)

GOOGLETRANSLATE関数でB3セルを指定しています。
そうすると、**B3セルに入力されている「今年は大雪です。」**が翻訳されているのがわかります。
また、言語指定ですが、入力されている**日本語は"ja"**、翻訳語の**英語は"en"**で指定します。

翻訳したいセルを指定する場合、そのセルに何が入力されているのかわからない場合は、言語を自動で判別する**"auto"**を利用しましょう。
![google翻訳3.png](https://qiita-image-store.s3.amazonaws.com/0/141209/36c21f16-5745-c637-35a0-1c0bc24d66c2.png)

"auto"を指定することで、**B4セルに入力されている「めっちゃ大変です。」**を日本語と判別して、英語に翻訳してくれてます。
さすがはGoogle先生だぜ。

## どんな時に利用する？
Googleフォームのアンケート結果（日本語）を外国人スタッフに展開したいときとか。
多国籍チームにおいて、とりあえずタスクをスプレッドシートに洗い出したときとか。
ぱっと思いつきますね。

なんにせよ英語苦手な人や、日本語がちょっと苦手なメンバーがいるときとか利用シーンがありそうです。
WRF > Error > wrf.exe: posixio.c:213: px_pgout: Assertion `*posp == ((off_t)(-1)) || *posp == lseek(nciop->fd, 0, 1)' failed.

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS 6.9 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

WRF(Weather Research and Forecasting Model)関連。

### エラー

実行中に下記のエラーが発生した。

> wrf.exe: posixio.c:213: px_pgout: Assertion `*posp == ((off_t)(-1)) || *posp == lseek(nciop->fd, 0, 1)' failed.


### 関連情報1

下記の情報を見つけた。

- [HELP ME~~~](http://forum.wrfforum.com/viewtopic.php?f=6&t=1099)
    
> Apparently it means that you don't have 'large file support' enabled for the netcdf output files. You need to recompile the model with the option set to have this. 

large file support関連という記載。

過去に幾度となく実施した処理ではエラーは発生していなかった。
何が変わったのだろうか。

記載のように、下記のような環境変数設定をしてから実行するといいのかもしれない。

```
setenv WRFIO_NCD_LARGE_FILE_SUPPORT 1
```

### 関連情報2

https://meteo.unican.es/trac/wiki/WRFKnownProblems

> [] wrf.exe: posixio.c:213: px_pgout: Assertion `*posp == ((off_t)(-1)) || *posp == lseek(nciop->fd, 0, 1)' failed.
...
> Causes are unknown.
ストリームの流れを図でコメントに残す

この記事は [Go4 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/go4) の3日目です。
2日目は、@Maki-Daisuke さんの 「[その昔作った解凍コマンド Kaito と、その実装のご紹介](https://qiita.com/Maki-Daisuke/items/c80e7c6755f758a0bd76)」 でした。

小ネタです。

## `io.Reader/Writer`の接続図をコメントに残す

 同僚が以下のようなコメントをコードに書いていて[^1]、分かりやすいなと思ったので真似しようと思った、という話です。そういえばなにかのライブラリでも見たような気がするので、私が知らないだけで普通のことなのかもしれません。

[^1]: アイデアの元ネタは、ascii.jpでの渋川よしきさんの記事「[Goならわかるシステムプログラミング](http://ascii.jp/elem/000/001/260/1260449/index-2.html#%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0%E3%82%92%E8%87%AA%E7%94%B1%E3%81%AB%E6%93%8D%E3%82%8Bio.readerio.writer)」とのことでした。

```golang
//                         multipart.Writer ->- io.Pipe -)- http.Request
//                         |<CreateFormFile>
// os.File -)- io.Copy ->- writer
```

## 書き方

ルールは伝わればなんでもよいのですが、こんな感じにしていました。

* `io.Reader`：入力は `)- xxx`、出力は `xxx -)` と表す（例：`)- bufio.Reader -)`）。
* `io.Writer`：入力は `>- xxx`、出力は `xxx ->` と表す（例：`>- bufio.Writer ->`）。

## 例

標準パッケージから適当に選んでみた例になります。

### package `os`

```
os.File -)
```
```
>- os.File
```



### package `io`

```
)- io.Copy ->
```

```
)- io.CopyN ->
```

```
>- io.Pipe -)
```

```
)- io.LimitedReader -)
```
```
>- io.MultiWriter ->
                 \->
```
```
)- io.TeeReader -)
               \->
```
```
)- io.MultiReader -)
)-/
```



### package `io/ioutil`

```
)- ioutil.ReadAll
```
```
>- ioutil.Discard
```



### package `bufio`

```
)- bufio.Reader -)
```
```
>- bufio.Writer ->
```



### package `bytes`

```
bytes.Reader -)
```
```
>- bytes.Buffer -)
```



### package `net/http`

```
)- http.Post
```
```
http.Response.Body -)
```



### package `mime/multipart`

```
   multipart.Writer ->
   |<CreateFormFile>,<CreateFormField>
>- writer
```



### package `archive/zip`

```
   zip.Writer ->
   |<Create>
>- writer
```



### package `compress/gzip`

```
>- gzip.Writer ->
```



### package `crypto/cipher`

```
)- cipher.StreamReader -)
```
FreeBSDにGitbucketを構築

FreeBSD 11.2にGitbucketをインストールします。
Qiitaを検索するとtomcatを使った記事が何個かありましたが、
Gitbucketはtomcatのインストール無しで起動できるのでtomcat無しで構築します。
（ちなみにMySQL無しでもH2databaseで使えます）

# 環境
| ソフトウェア | バージョン |
|---|---|---|
| FreeBSD   | 11.2 |
| MySQL     | 5.7.24 |
| Gitbucket | 4.29.0 |

最初はMySQL8で試みたがgitbucketの起動時に下記のエラーが出力されて無理だったのでMySQL5.7にしました

```
java.sql.SQLException: (conn=13) Failed to add the foreign key constraint. Missing index for constraint 'IDX_ISSUE_COMMENT_FK0' in the referenced table 'issue'
```



# pkg を使う準備と必要な pkg をインストール
OSを素でインストールした直後からの手順です。全部rootで作業しています。

```
# pkg update
# pkg install -y openjdk8 mysql57-server ca_root_nss
```
ca_root_nss は fetch で gitbucket.war をダウンロードする時に必要(https)


# MySQLのインストール＆起動＆rootユーザのパスワード設定
```
# sysrc mysql_enable="YES"
# /usr/local/etc/rc.d/mysql-server start
# mysqladmin password 'tekito-pass' -u root -p`tail -1 /root/.mysql_secret`
```


# MySQLのgitbucket用DB＆ユーザ作成
```
# mysql -u root -p'tekito-pass'
mysql> CREATE DATABASE gitbucket;
mysql> CREATE USER 'gitbucket_user'@'127.0.0.1' IDENTIFIED  BY 'gggppp';
mysql> GRANT ALL ON gitbucket.* TO 'gitbucket_user'@'127.0.0.1' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
```


# GitbucketのDB用設定ファイルを作成
```
# mkdir -p /home/gitbucket
# cat /home/gitbucket/database.conf
db {
  url = "jdbc:mysql://127.0.0.1/gitbucket?useUnicode=true&characterEncoding=utf8"
  user = "gitbucket_user"
  password = "gggppp"
}
```


# Gitbucketのダウンロード
```
# fetch -o /home/gitbucket/gitbucket.war https://github.com/gitbucket/gitbucket/releases/download/4.29.0/gitbucket.war
```

# Gitbucketの起動
```
# /usr/local/bin/java -jar /home/gitbucket/gitbucket.war --port=8080 --gitbucket.home=/home/gitbucket/
```
これでWebブラウザから下記を開けばGitbucketが使えます
http://サーバのIPアドレス:8080/
※ユーザー:root、パスワード:rootでログイン可能


# おわりに
実運用する人はgitbucket用のユーザーや起動用スクリプトなどを作成したほうが良いので下記を参考に...
https://blog.bixr.com/2014/11/795/
dockerイメージを自作。docker公式のubuntuイメージにpython3.4を入れてビルドする


### 経緯
jenkinsで使用するCI用のツールに各種pythonのパッケージを入れる必要があった。
その中にpip3.6に対応していないものがあったりしたので、dockerで実行することにしました

### 1.公式サイトからベースになる docker imageをpullする
公式サイトにofficialで提供しているものも含めて、色々選ぶことが可能です。
https://hub.docker.com/_/ubuntu/

今回は `16.04`にする必要があったので、以下のようにpullをします

```
docker pull ubuntu:16.04
```

### 2.Dockerfileを作成する

今回はpython3.4が必要だったので、公式から直接`tgz`を展開してpythonの導入をします。
この時にubuntu imageに主要の`wget`などが入っていないので先に`apt-get`で入れるようにします

```
FROM ubuntu:16.04

MAINTAINER yourname

RUN apt-get update -y && apt-get install -yq wget libssl-dev openssl build-essential gcc zlib1g-dev

WORKDIR /root/
RUN wget https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz \
        && tar zxf Python-3.4.3.tgz \
        && cd Python-3.4.3 \
        && ./configure \
        && make altinstall
ENV PYTHONIOENCODING "utf-8"

WORKDIR /
```

### 3.Docker buildをする

`Dockerfile`の存在する階層で以下のコマンドを実行します。
`-t sample`でビルドするimageに名前を付与することができます。

```
docker build ./ -t sample
```

### 4.Docker runする

実際に作成したdockerを実行してみます

```
docker run -it sample /bin/bash
```
docker内にbashモードで入ることができれば完成です。


### 参考

公式サイト https://docs.docker.com/engine/reference/commandline/build/#build-with-url
5歳児と7歳児がプログラミングをやってみた！


この記事は [リンク情報システム](https://www.lis.co.jp/)の2018年[アドベントカレンダー](https://qiita.com/advent-calendar/2018/lis)のリレー記事です。
engineer.hanzomon のグループメンバによってリレーされます。
（リンク情報システムのFacebookは[こちら](https://ja-jp.facebook.com/lis.co.jp/)から）


#こんにちは！
12日目担当のhuraです。
リンク情報システムで人事やってます！
いつも言っていますが・・・ワタシハギジュツシャデハアリマセン。

さて、この記事を見ているアナタ！huraのアイコンを見てください。
アイコンからも、そしてこの記事のタイトルからも想定できたかもしれませんが、我が家には子供がいます。
今年の10月に某大学にて、子供向けのロボット技術やプログラミング技術の体験セミナーがあったので、子供と一緒に参加してきました。今回はその様子をお伝えします！


#基本データ
子供A
性別：女
年齢：7歳（小学1年生）
タイプ：おっとりマイペース。インドア派。
プログラミングレベル：原始人
![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/284556/1c0df374-4e78-ac73-aa5f-c1e98efc6446.jpeg)


子供B
性別：男
年齢：5歳（幼稚園の年中）
タイプ：活発でじっとしていられない。アウトドア派
プログラミングレベル：三葉虫
![b.jpg](https://qiita-image-store.s3.amazonaws.com/0/284556/a2564e11-6b7d-54b4-32a2-d1a24d6b0c49.jpeg)


#まずはコースを選ぼう！
さて、まず始めにコースを選びます。1つのコースが30分程度の体験となっており、
1人3つまでコースを選択することができました。

ゲーム制作、映像制作、レゴ、宇宙エレベーター･･･などなど
いろいろあって、どれも面白そう！

そんな中で、子供AとBが選んだコースに、「プロロ」というモノがありました。
「プロロ」って何だろう？って思った人はこちらをご覧下さい。
https://www.fsi-embedded.jp/proro/


#早速、「プロロ」を体験しよう！

まずは大学生のお兄さんが簡単な説明をしてくれましたが、かなりあっさり。
おいおい。それだけで大丈夫？と思いながらも、最初のお題「プロロを10cm前進させる」が始まりました。

パソコン上で、いろいろな指示が書かれたカラフルなパーツを組み合わせるイメージです。さすがに最初はお兄さんが一緒にやってくれ、すんなりクリア。

【○○cm前へ進む】のブロックを見つけて、画面右側の何もないスペースに移動させ、○○部分に10と入力するだけで、それを「プロロ」が読み込み、指示したとおりの動きをしてくれました。

そして次から次へとお題の難易度は高まり、
【プロロを10cm前進させて、右に曲がり、8cm前進、そこから5cm後退させ、その場で360度回転して･･･（以下省略）】
なんて複雑なことに！？
しかも、お兄さんは手取り足取りではなく、ちょっとヒントを出すくらい！

それでも、子供AもBもちゃんとクリアできていて、そして何より2人とも楽しそう！
特に子供Aは、空いている時間を使い、「プロロ」への指示をカスタマイズして、お兄さんに褒められ、ニヤニヤする始末。
![体験中.jpg](https://qiita-image-store.s3.amazonaws.com/0/284556/56c2f346-6909-6ad1-af02-ee4b6ce53dbc.jpeg)



#体験を終えて・・・

まず驚いたのは、生まれてはじめてのパソコン操作のはずだが、意外と使いこなしてるって事。
マウスではなくタッチパネルだったので、直感的に操作できたのかな？

また、本人らはプログラミングを勉強しているという意識は全くなく、純粋に楽しんでいるって事。
2020年から小学校でプログラミング教育が必須になるっていうし、まずは拒絶反応が出なくて良かった。
どうやら2人とも進化できそうです。

そして、帰りの車の中で、二人に感想を聞いたところ、「面白かった。またやりたい」だって！
更には「パソコン買って♪」だって！！


・
・・
・・・
予想以上に高額なクリスマスプレゼントになりそうです。

さてさて、そのクリスマスに向け、リンクの[アドベントカレンダー](https://qiita.com/advent-calendar/2018/lis)もそろそろ折り返し。
これからドンドン盛り上がってきますよ～！

明日は@shinevillageの記事です。乞うご期待！！
windowsサーバーに構築したプライベート認証局の電子証明書を自動生成したい

##プライベート認証局のPKI自動生成に用いたスプリクトに関して
###windowsサーバーに構築したプライベート認証局の電子証明書を自動生成したいとユーザーより相談がありその際以下のスプリクトを作成しましたので備忘の意味で残します。


##■プライベート認証局とは
認証局とは、デジタル証明書を発行する機関でプライベート認証局とは
会社など限られた組織内でのみ運用する認証局です。


##■要件
Activedirectoryを作成しているユーザーアカウントに対してプライベート認証局の電子証明書を作成したい。


##■準備するもの
•create_and_exportpfx.ps1・・・スクリプト本体
•sample.inf・・・CSR 構成ファイルの作成スプリクト
•userdata.txt・・・ユーザアカウントとパスワードの設定ファイル
•CSRフォルダ・・・ユーザアカウントのCSR格納フォルダ
•REQフォルダ・・・各ユーザの証明書発行要求の格納フォルダ
•PFXフォルダ・・・ 各ユーザのエクスポートした証明書


##■スプリクト
###１、CSR 構成ファイルの作成
構成ファイルの設定に必要な情報を収集します。サブジェクト名を完成させるため、View サーバの FQDN と、組織単位、組織、市区町村、都道府県、および国を把握しておく必要があります。

```
[NewRequest]
Subject = "CN=****ID"
#導入環境に適切な値に変更します。 証明を利用するホスト名
PrivateKeyArchive = FALSE
KeySpec = 1
KeyLength = 2048
SMIME = FALSE
Exportable = TRUE
Exportable = FALSE   
#秘密鍵のエクスポートする。
UserProtected = FALSE
MachineKeySet = FALSE
UseExistingKeySet = FALSE
ProviderName = "Microsoft Enhanced Cryptographic Provider v1.0"
ProviderType = 1
RequestType = PKCS10
KeyUsage = 0xa0
; CERT_DIGITAL_SIGNATURE_KEY_USAGE, CERT_KEY_ENCIPHERMENT_KEY_USAGE

[EnhancedKeyUsageExtension]
OID=1.3.6.1.5.5.7.3.2
; Client Authentication

[RequestAttributes]
CertificateTemplate=ユーザー名
```


###２、スクリプト本体作成
証明書発行要求(CSR)ファイル、サーバ証明書を発行するための署名要求（REQ）ファイル、秘密鍵をパスワードで保護しつつ証明書と一緒に格納できる証明書（PFX）ファイルを生成し指定したフォルダに保存するスプリクト、ファイル名と秘密鍵はuserdata.txtを利用する。

```
$CSR="CSR"
$REQ="REQ"
$PFX="PFX"

# 証明機関名
$Cert="ad.example.local\example-AD-CA" # 証明期間名

# アカウントリスト
$list="userdata.txt"

foreach ($line in Get-Content $list) {
	$ID = echo $line |  %{$_.split(" ")[0]}
	$pass = echo $line |  %{$_.split(" ")[1]}

	$(Get-Content "sample.inf") -replace "PartnerID","$ID" > $CSR\$ID.inf
	certreq.exe -new -q -f $CSR\$ID.inf REQ\$ID.req
	certreq.exe -submit -q -f -config $Cert $REQ\$ID.req tmp\$ID.cer
	certreq.exe -accept -q -f -user tmp\$ID.cer
	certutil -f -user -p $pass -exportPFX $ID $PFX\$ID.pfx
```
【AWS基礎】ALBとELBの負荷分散方法の違いが面白い

ALBとELB、`新しいやつ` 、`古いやつ` という 頭の悪い 使い分けしかしたことなかったので調べてみました。


# そもそもロードバランサーとは？
`ロード（負荷）`と`バランサー(均衡をとる)`を合わせた言葉。

`短期間の大量アクセス`、`単一サーバーの障害`発生時も安定してサーバ稼働を可能にするための技術。


### その他メリット
* ELBに搭載されているSSLアクセラレータで暗号を復号する事でサーバで復号しなくて良くなるので負荷が格段に減る
* SSLアクセラレータがあるので複数サーバのSSL証明書の1本化が可能

参考：<a href="http://www.kumoyanet.com/759/">SSLアクセラレータについて</a>


### 個人的学び
障害発生時にヘルスチェックが通らなくなったサーバを自動で切り離すのはAWS独自の機能ではない事。
ELBに暗号文を復号する専用のアクセラレータが搭載されている事。（音楽のDACみたいなものですね）



# ALBとELBの違い
ALBはELBでできたことに加えて、様々な新機能が増えてます。

### 色々な差が、ありはしますが・・・
* ELBはロードバランサーに直接インスタンスを紐付け
* ALBはターゲットグループを用意し、それをロードバランサーに紐づける
* 料金はALBの方が10％安い
* パスベースルーティング：URLのパスに基いてルーティングが可能です。
* 複数ポートの登録：1つのインスタンスに複数ポートを登録することが可能です。
* コンテナアプリケーションのサポート：ECSはタスクスケジュールで未使用のポートを使用しターゲットグループに登録可能
* ターゲットグループでのヘルスチェック：CloudWatchで多くのメトリクスをサポートしています。
* アクセスログの情報追加：アクセスログに情報が追加され、圧縮形式で保存されます。
* パフォーマンス改善：パフォーマンスが向上しています。
* HTTP/2サポート：HTTP/2のリクエストを受けられるようになりました。
* WebSocketサポート：WebSocketのリクエストを受けられるようになりました。
* 削除保護：EC2と同様に削除保護ができるようになりました。

一部引用元：<a href="https://dev.classmethod.jp/cloud/aws/alb-application-load-balancer/">【新機能】新しいロードバランサー Application Load Balancer（ALB）が発表されました</a>


## 見ても良く分からなかったのは、負荷分散層の違い。
`ALB`は`アプリケーション層のみ`対応、`ELB`は`トランスポート層とアプリケーション層`の両方での負荷分散を行える。

色々なサイトにこのように書いてあって何が違うのかと少し調べて図にしてみました。

### 皆さん大好きアプセトネデブでみる負荷分散の違い (OSI基本参照モデル) 
ア：アプリケーション層  　　<- ALB & ELB
プ：プレゼンテーション層
セ：セッション層
ト：トランスポート層    <- ELB
ネ：ネットワーク層
デ：データリンク層  　　
ブ：物理層

# `アプリケーション層` と `トランスポート層` での負荷分散時のサーバ決定タイミングの違い
層による一番の違いは処理を行うサーバーを決定するタイミングが違うことでした。
処理サーバが決まるタイミングを以下の図にざっくり処理サーバが決まるタイミングをまとめてみました。
![uml.png](https://qiita-image-store.s3.amazonaws.com/0/69647/ba655a06-1159-6374-d661-b83a968b5015.png)


### トランスポート層での負荷分散方法
トランスポート層では `TCP/UDP` の情報までを元に処理を行うサーバーを決定します。
AWSでは`IPアドレス`と`ポート番号`を元にどのサーバに処理を任せるかを決定します。

最初のサーバへのアクセス、ハンドシェイクを確立する時にどのサーバが応答するかを決定しています。

【IPアドレスとポート番号での負荷分散の例】
123.456.789:25　＝＞　メールサーバへ
123.456.789:80　＝＞　アプリケーションサーバへ

### アプリケーション層での負荷分散方法
アプリケーション層では `HTTP` の情報を元に負荷分散します。
HTTPの情報の中にはURLも含まれているため`URL別に負荷分散`を行うことができるようです。

具体的にはハンドシェイク確立後、データ要求処理時の最初のsyn送信のタイミングで処理を行うサーバが決まります。

【URLでの負荷分散例】
123.456.789/admin/users => 管理画面専用サーバへ
123.456.789/article/1 => 公開記事ページへ


## 余談：ラウンドロビンによる負荷分散
調べている中でnginx側でロードバランシングできるラウンドロビンという機能を見つけたので共有。

nginxにきた処理を他のサーバに振ることでをロードバランサーとして利用することができます。
ただしメンテナンス性が皆無なので実運用はあまりしたくないですね:fire:

設定はシンプルでした

```nginx:/etc/nginx/nginx.conf
http {
  upstream example.com {
    server app-prod1.example.com;
    server app-prod2.example.com;
    server app-prod3.example.com;
  }

  server {
    listen 80;

    location / {
        proxy_pass http://example.com;
    }
  }
}
```

引用： <a href="https://www.nedia.ne.jp/blog/tech/2016/08/04/7938">Nginxのロードバランシング機能を使ってみよう！</a>
draft.jsでMathJaxを使ってみる - 数式エディタ

draft.jsでMathJaxを使ってみます。

機械学習とか確率統計の記事を書いていて、やはり数式をきれいに書けるのは特別なことだと思いました。あらためてクヌース先生は偉大です。


#１．環境設定

今回は以下のライブラリを使います。

```
Draft.js
Rectのrich text editorのフレームワークです。facebook製。

draft-js-plugins-editor
Draft.js の React Plugin Architecture です。 

draft-js-mathjax-plugin
Draft.js のLatex pluginです。draft-js-plugins-editor対応。
```

[draft-js - Github](https://github.com/facebook/draft-js)
[DraftJS Plugins - Github](https://github.com/draft-js-plugins/draft-js-plugins)
[DraftJS MathJax Plugin - Github](https://github.com/efloti/draft-js-mathjax-plugin)
[Awesome Draft.js - Github](https://github.com/nikgraf/awesome-draft-js)


基本的な環境はcreate-react-appを使います。

```
npx create-react-app draftjs-mathjax
cd draftjs-mathjax
rm -rf src
npm i draft-js  draft-js-plugins-editor  draft-js-mathjax-plugin  --save
```

以下のソースは、ほぼ「[DraftJS MathJax Plugin - Github](https://github.com/efloti/draft-js-mathjax-plugin)」のコピペです。


```react:src/indexjs
import React, { Component } from 'react'
import { render } from 'react-dom'
import { EditorState } from 'draft-js'
import Editor from 'draft-js-plugins-editor'
import createMathjaxPlugin from 'draft-js-mathjax-plugin'

const mathjaxPlugin = createMathjaxPlugin(/* optional configuration object */)

const plugins = [ 
  mathjaxPlugin,
]

class App extends Component {

  state = { 
    editorState: EditorState.createEmpty(),
  }

  onChange = (editorState) => {
    this.setState({
      editorState,
    })  
  }

  render() {
    return (
      <Editor
        editorState={this.state.editorState}
        onChange={this.onChange}
        plugins={plugins}
      />  
    )   
  }
}

render(<App />, document.getElementById('root')) 
```


#２．試してみる

以下のコードでサーバを立ち上げます。

```
npm start
```


![image.png](https://qiita-image-store.s3.amazonaws.com/0/61915/3c65e6fd-b3d5-4eb6-8cb9-df8ba0be2307.png)

キーの「$」を押すと、黄色い入力画面が表示されますので、そこにTexで数式を入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61915/d42141fc-e255-0bb0-3ff1-a5bc5306eee6.png)

ちょっと複雑な数式です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61915/60f0224a-47b1-727a-902f-38ef5c61d128.png)


入力中は、小さくって少し見にくいですが、確定すればそれなりです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61915/85f053ca-7f51-8daf-4b67-7a9d3cc765f7.png)


もっと複雑な、ガウス積分の公式関連の式も入力してみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61915/c1aaab30-f458-2086-cf82-86ca0380a355.png)


まあ、いい感じでした。
このコンテンツを保存したり再読み込みできるようなエディタを作ればよいわけですね。

数式エディタに関しては、Reactを中心にして、もう少し調べてみたいです。


[draft.jsでMathJaxを使ってみる - 数式エディタ - Qiita](https://qiita.com/sand/items/1d0c43cc873d69319176)
[markdown-it-katexを使ってみる - 数式エディタ - Qiita](https://qiita.com/sand/items/8d8b5012104fec927b44)
What's an advent calendar?

I first learnt of this advent calendar thing about three years ago but hadn't given it much thought then. I had simply thought it was just a cool way of saying 'ad event calendar' since I worked in an adtech company at the time. *Yeah*, I'm probably not that bright ¯\\\_(ツ)\_/¯

This year, I've been invited to take part in one and actually write a few articles for it, so I decided the first article ought to be a quick guide to other clueless foreigners like myself. If you don't know what an advent calendar is, this is for you!

So the first place I checked was [Wikipedia], which states:

> An Advent calendar is a special calendar used to count the days of Advent in anticipation of Christmas.

Oh, so it's just another Christian event that leads up to Christmas? Wait, that's not right. I thought it was about technology and code and all kinds of nerdy stuff?! No, you see, the advent calendar that you and I are participating right now is mostly a phenomenon for the Japanese tech community, where you write/read/do something tech related each day up till Christmas.

Further googling and asking around on various tech communities, and it turns out this fine tradition began in what must have been ancient times, [back in 2000]! It was started by a Mark Fowler of the [London Perl Mongers] group. To put it short, Mark had to give up chocolates because of a new year's resolution, and if you can't have chocolate during the Advent, what better to replace it than with code?! Utter brilliance!

## What about Japan?

I'm not sure how it happened but sometime in 2008, the Japanese Perl community decided to adopt the same tradition, hence the beginning of the [JPerl Advent Calendar]. Not long after, [various other][other advents] Japanese programming groups decided they wanted to join in on the fun, and so here we are today. Writing code on a monday morning in bloody December.

## Differences

While the Japanese advent calendars seem to be focused mainly on writing short, technical articles or tips, things that can be done in 5 minutes during a lunch break, the advent calendars of the world are mostly about solving some kind of code puzzle or writing a small program. For example, the [Advent of Code] is an annual coding puzzle game that follows the advent calendar.

[Wikipedia]: https://en.wikipedia.org/wiki/Advent_calendar
[Advent of Code]: https://adventofcode.com
[back in 2000]: http://www.perladvent.org/2000/
[London Perl Mongers]: http://london.pm.org
[JPerl Advent Calendar]: http://perl-users.jp/articles/advent-calendar/2008/
[other advents]: http://www.multiburst.net/sometime-php/2010/12/advent-calendar-2010-for-developper/
ヤフーの公式キャラクター「けんさくとえんじん」の「けんさく」をSVG で描いた

## はじめに
こんにちは！
これは [Yahoo! JAPAN 2018年新卒有志 Advent Calendar 2018](https://adventar.org/calendars/3388) の3日目の記事です
昨日は@cagpie さんによる「[必ず押さえたい、JavaScript開発の大技小技](https://qiita.com/cagpie/items/b1e7a20e6ee96171456b)」でした。

本日はSVG について勉強したいと思います！


## SVG とは
SVG とは、グラフィックを表現する手法の1つです。
ウェブとの相性が良く、グラフを描画したりできます。
下記はSVG で線を描画した例です。
``<line>``タグで線を引くことができ、``<circle>``タグで円を描くことができます。
``<path>``タグでは、ぐにゃぐにゃ曲がった線を表現することができます。
https://codepen.io/yonedaco/pen/OaxZjL  

<img src="https://i.ibb.co/gtgrXdx/svg-1.png" width="300px">

SVG は拡大によって劣化しません。
jpg形式の画像を思いっきり拡大すると一部がモザイクがかかったように霞んでしまいます。
SVG はラスター画像ではなくてベクター画像ですので、どれだけ拡大しようがくっきり綺麗にグラフィックが表示されます。
また、SVG はプログラミング言語との相性が良いです。
SVG はXML を記述することでグラフィックスを作成できるので、テキストエディタで編集できます。
XML の一部の値を変数でおき、プログラミング言語から動的に変更することができます。
線を描画するには始点の(x,y)座標、終点の(x,y)座標の合計4つの情報が必要です。
終点のy座標をJavascript から操作してみた例を下に示します。
スライダーが0〜100までの値を取り、それに従ってy座標が変更されています。
https://codepen.io/yonedaco/pen/MzELVq

<img src="https://i.ibb.co/TYF3LdW/svg-article-2.gif">  

GoogleCharts というグラフ描画のためのライブラリは、最終的にはSVG で出力されています。
React のプロジェクトを初心者が作成するためのテンプレート(create-react-app)では、SVG のアイコンが含まれています。
SVG は徐々に私達の生活に溶け込んできています！

## SVG の作成
SVG はテキストエディタでタグをかいて作成することができますが、一方でグラフィック描画ソフトウェアで作成することもできます。
Illustrator や inkscape などのソフトでSVG を作成することができます。
Illustrator を使う場合、保存時にai形式ではなく、svg形式で保存します。
Illustrator で「けんさく」を描画し、SVG で保存すると以下のような内容になりました。
これをhtml上にタグとしてそのまま追加すればOKです。

```index.html
<svg width="500px" height="500px" viewbox="0 0 800 800">
  <g>
	<g>
		<path class="st0" d="M485,517.5c8,7,38.5,60.5,37.5,91.5S492,634.5,477,625.5l-0.5,0.5c-9,17-11,46-2,52s19,19,1,26s-50,9-60-6
			s5-37-16-40h0c-21,3-6,25-16,40s-42,13-60,6s-8-20,1-26s7-33-2-50l-0.5-0.5c-15,9-44.5,12.5-45.5-18.5s25.5-82.5,33.5-89.5"/>
	</g>
	<path class="st1" d="M398.5,527.4c52.2,1,105.4-17.1,134-33.3c28.5-16.1,50.3-63.6,53.2-82.7c3-19.9,0.8-41.4-0.3-61.4
		c-2.2-37.4-12.3-75.9-36.3-105.5c-25.3-31.1-66.2-48.3-104.5-56.9c-15.1-3.4-30.5-5.2-46-5.2h1c-51.3,0-95,19.9-121.6,36.1
		c-31.9,19.3-57.4,57-62.3,94.1c-4.1,31.2-8,67.4-3.3,98.7c2.9,19,24.7,66.5,53.2,82.6c28.5,16.2,81.7,34.2,134,33.3H398.5z"/>
	<path class="st0" d="M534.5,492.5c0,0-2-134-9-160c-52-12-213-9-257,0c-7,26-9,160-9,160C342,535,435,540,534.5,492.5z"/>
	<circle class="st2" cx="399.5" cy="118.5" r="31"/>
  …(一部省略)
  </g>
</svg>
```

## SVG のアニメーション
SVG はなんとCSS で装飾することもできます！
CSS のアニメーション機能を使って、「けんさく」の目をパチパチさせてみました。
https://codepen.io/yonedaco/pen/EOMKdE/

<img src="https://i.ibb.co/19c190G/kensaku.gif">  

## まとめ

* SVG はグラフィックを表現する手法の1つ  
* SVG は拡大によって劣化しないので、くっきり綺麗にグラフィックスが表示される  
* SVG はJavascript などのプログラミング言語と相性が良い  
* SVG はほとんどのウェブブラウザに対応していて、ほとんどのグラフィック描画ソフトウェアに対応している