OmniAICreator/Qiita-1.07M huggingface dataset:
DAOの実現に必要そうなものをまとめてみた

最近ICO、ハードフォークそして、相場の話題が中心となっているブロックチェーン界隈ですが、最近あまり話題に上がらなくなってきたDAOについて書きたいと思います。自分がDAOを実現したことはまだありませんが、DAOについて普段から思っていることをまとめてDAOをつくる要件を書き出してみました。

# DAOとは

DAOとは、Decentralize Autonomous Organizationの略で、日本語では自律分散型組織と訳されます。簡単に言うと、中央に人や会社がいなくても、そして参加者が離れてたところに存在していても、自律的に運営し続けられる組織です。それでは、どうしてこのような組織が回るのか、というところを解説したいと思います。

# 自律するために必要なもの

まずDAOを実現するためにテクニカルに必要なものを書いていきます。

最初にこの組織が自律して運営できるだけのルールが必要です。そして、このルールはコードとして明文化することになります。さらに、コードを書くコミュニティが必要になります。このコミュニティーで合意がDAOの運営には欠かせません。

また、コードを実行する場所も必要です。このコードでは契約と履行(お金の移動)を同時に管理する必要があります。個人のPCのローカルなど信頼できない場所で実行するのではなく、信頼できる場所で実行する必要があります。実行結果も保証される必要があります。そこでブロックチェーンで白羽の矢が立つのがブロックチェーンです。

# ブロックチェーン

ビットコインのブロックチェーンはあまりプログラマブルな構造になっていないためなかなか難しいのですが、Ethereumのスマートコントラクトは、チューリング完全でしかも実行結果を信頼できる場所に保管できるため、コードの実行環境としてはDAOの要件を満たしています。しかし、忘れてはならない重要なピースが一つあります。それは、穴のないスマートコントラクトのコードです。スマートコントラクトは一度デプロイすると取り返せません。穴が開いていると一生放置されてしまいます。どんな素敵なルールでも、穴を突かれてしまってはおしまいです。The DAOの事件では、その穴を突かれて大きな金額が盗み出されしまうという大きな事件になってしまいました。

ここららは、まだ自分の中では仮説なのですが、もう一つ、ブロックチェーンに対する要求事項が有るのではないかと思っています。それは、パブリックチェーンでないと成り立たないであろうということです。パーミッションドや、プライベートチェーンでは、企業や組織がブロックチェーンを持つことになり、その企業や組織しかブロックチェーンに参加できないため、自律の妨げとなります。例えば、その企業や組織が撤退ししまったら、DAOを存続させることができません。しかしパブリックであれば、意志があるものが参加し続けることにより、DAOは継続されます。よって、パブリックチェーンでないとDAOにはならないのではないかと考えています。

# マルチサイドプラットフォーム

また、DAOを実現するためには、ビジネスサイドにも要件があります。DAOが実現できるということは、何かの売買が売り手と書いての間でデジタル完結で自由に行われている状態になっていることが必要です。途中で人手を介さないと売買できないようなものをDAO化するには、コードで完結して表現できないものが混ざってしまうため、実現はなかなか難しいと思います。特に、なにか人による裁定が必要なものはかなり難易度が高いでしょう。例えば、提供されるサービスは機械によるもののほうがDAO化しやすです。

# DAOを目指して取り組んでいるプロジェクト

## [Slock.it](https://slock.it/)

DAO化を目指しているというよりは、DAOを実現する手段として現物の鍵をスマートロックに置き換え、鍵を開ける権利をブロックチェーンで管理するというアプローチのSlock.itはDAOへ向けた大きなチャレンジといえます。

## [ArcadeCity](https://arcade.city/)

ライドシェアをDAOでと目指していますが、中央集権ではないものの、クルマと運転手が絡むため、契約の履行されたことをデジタルで表現することに課題が有るでしょう。完全デジタル完結はしないものの、プラットフォーマー不在で、ライドシェアを回すという取り組みは、DAOを実現するにあたり大きなチャレンジといえます。

## [WindingTree](https://windingtree.com/)

旅行業界のDAOを目指すWinding Tree。空き室の登録と予約を行うなど今までの代理店の業務をDAOにしてしまい、旅行における中間搾取をなくし、消費者にもメリット与えたいという、とてもチャレンジングなプロジェクトです。

# 今後の展開

2017年時点、DAOの形態としてそこそこ成功しているのはビットコインぐらいでしょう。しかし、ビットコインも仕様に対する合意形成において問題がおきており、合意できなかったらハードフォークで分裂し、新たな通貨がつぎつぎと生まれています。この状態を大成功といえるかどうか、微妙なところです。このとことから、一般的なDAOに対しても、合意形成に失敗すると「分裂が起こる」可能性があるという見本になっているのではないでしょうか。

2018年も、DAOに対する挑戦は続くでしょう。まだまだ、実験段階は続くと思いますが、2019年頃にはいい線いくものが現れるかもしれません。特に、シェアリングエコノミー関しては、その仕組みの理解がもっと多くのユーザーの間で進めばDAO化しやすいプラットフォームです。こういったやりやすいところで、成功に近い事例が生まれていくでしょう。

最後に、個人的にはDAOとして成功できるプロジェクトはICOも成功すると考えています。DAOが回る経済モデルができていれば、ICOで最初に回ったお金も循環することができるため、長きに渡り経済の循環が起きます。この循環こそが、DAO、ICOの成功の鍵になるのではないでしょうか。

まとまりきっていませんが、DAOにはAIと同等かそれ以上の破壊力をもつ可能性があるものです。人類がそして、我々がこれを使いこなせるようになる日を夢見て、締めたいと思います。
Javaで並列実行

```java
public void doParallel(Runnable... runnables) {
    List<Thread> threads = new ArrayList<>();
    Arrays.asList(runnables).forEach(runnable -> threads.add(new Thread(runnable)));
    threads.forEach(thread -> thread.start());
    threads.forEach(thread -> { try { thread.join(); } catch (InterruptedException e) {}});
}
```

```java
doParallel(
    () -> doSomething(),
    () -> doSomething(),
    () -> doSomething()
);
```
そうだ Lisp 作ろう (Make a Lisp in Google BigQuery)

こんにちは、[トレタ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/toreta)の8日目記事です。

トレタでは膨大なデータを分析する際に Google BigQuery を使ってますが、今年はデータサイエンティストチームも立ち上がってより大規模な分析が可能になりました。

さてさて、お硬い話は置いといて。クリスマス前なので、ここでは何か面白おかしい SQL 芸でもしましょう。BigQuery は JavaScript ベースのユーザー定義の関数（UDF）をサポートしています、つまり必要であれば好き勝手に UDF で BigQuery の関数を拡張することができます。この際 UDF を使って別の言語を実装して BigQuery のなかで呼び出しましょう！！

## イメージ
イメージとしては SQL でこんな呼び出しをできたら面白いと思います。

```sql
select mal('(fn* [a b c] (reduce + 0 [a b c]))', [1.1, 2.2, 3.3])
```

内部はコードを `read` 関数で AST に変換して、 `eval` 関数で環境と共に評価します。

<img width="188" alt="Screen Shot 2017-12-07 at 17.17.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/14884/3e9c2e18-8166-1c13-c94a-fd3de30e4bb7.png">

## Make a Lisp (mal)
今回は [Make a Lisp (mal)](https://github.com/kanaka/mal) という Lisp 系の処理系をもとに実装してみようというプロジェクトです。mal の特徴といえば説明が詳しく、多くの言語(現時点で71言語)での実装例を参考にすることが可能です。

内部実装はほとんど mal の JavaScript 実装例を持ってきましたが、Node.js や Browser の環境と異なるため、モジュール周りは変更して、`console` オヴジェクトがないため `prn` 系の関数も除外してます。

<img width="558" alt="Screen Shot 2017-12-07 at 17.35.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/14884/42477284-cbc2-8049-a9ab-8c69fa233ac7.png">
Source: https://github.com/kanaka/mal/blob/master/process/guide.md#stepA

完成したコードはこちらに公開しております。
https://github.com/hden/mal

## UDF 周り
BigQuery の UDF は基本こんな構造になってますが

```SQL
create temporary function multiplyInputs(x int64, y int64)
returns int64
language js as """
  return x * y
""";
```

`OPTIONS` セクションを付けることで GCS 上の外部コード、またはライブラリを読み込むことが可能です。例えば自分の `gs://hden/mal/` バケット内にコードを置くと

```SQL
#standardsql
create temporary function mal (str string, args array<float64>)
  returns float64
  language js as 'return mal.apply(str, args)'
  options (
    library=['gs://hden/mal/bundle.js']
  )
;
```

こういう風に読み込むことが可能です。

## データ型
BigQuery の int 型は基本 int64 ですが、 JavaScript に int64 はないので文字列として渡されます、`parseInt()` などの関数である程度丸め込むことが可能ですが、注意が必要です。

データ型のマッピングはこちらです。
https://cloud.google.com/bigquery/sql-reference/user-defined-functions?hl=ja#sql-type-encodings-in-javascript

## 最後に
楽しんでいただけたでしょうか？

```SQL
#standardsql
create temporary function mal (str string, args array<float64>)
  returns float64
  language js as 'return mal.apply(str, args)'
  options (
    library=['gs://hden/mal/bundle.js']
  )
;
select mal('(fn* [a b c] (reduce + 0 [a b c]))', [1.1, 2.2, 3.3])
```

では皆さん、良いクリスマスを。
画像の圧縮方法

#はじめに
サイト作成時に容量を減らす方法として画像圧縮があります。
どの方法がベストなのか検証してみました。


##検証した圧縮方法
・[gulp-imagemin](https://www.npmjs.com/package/gulp-imagemin)
・[imagemin-pngquant](https://www.npmjs.com/package/imagemin-pngquant)
・[イメージオプティム](https://imageoptim.softonic.jp/mac)
・[tinypng](https://tinyjpg.com/)
・[gulp-tinypng-compress](https://www.npmjs.com/package/gulp-tinypng-compress)

##検証画像
・jpeg
![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/130667/3da13574-81e1-f5e6-22c0-a4c0c1a6f5de.jpeg)

・png
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130667/56b9d735-4858-091e-38d4-c6cc1171ecd5.png)

##検証結果

|            | jpg          | png         |
|:---------------:|:---------------:|:---------------:|
| 何もしない      | 10,657バイト(10.657KB)        | 97,660バイト(97.66KB)          |
| gulp-imagemin     | 10,504バイト(10.504KB)       | 92,126バイト(92.126KB)        |
| imagemin-pngquant       | -----         | 24,496バイト(24.496KB)         |
| イメージオプティム         | 10,038バイト(10.038KB)           | 87,165バイト(87.165KB)           |
| tinypng       | 9,224バイト(10.657KB)        | 27,254バイト(27.254KB)       |
| gulp-tinypng-compress       | 9,224バイト(10.657KB)        | 27,254バイト(27.254KB)       |


##考察
・画質を変化させることなく容量を落とすなら、イメージオプティムが一番安全
・多少画質落としても大丈夫な場合はimagemin-pngquantをタスクランナーで動かすのが楽
・一番楽に、多く容量を落とすならtinypngだが、仕事で使っている公開前の画像等をfileにアップするのが少し怖い気がする
・その変わりにgulp-tinypng-compressを使ってみたが
　1ヶ月500画像まで(それ以上は有料)
　5MB以上の画像は圧縮不可
　tinypngに登録をして、API keyを取得する必要がある...等といった点を考慮すると、ちょっと面倒かと

##最後に
時と場合によりけりで使い分けるしかないですが、何を使って圧縮するか考える材料になればと思います。
また、これ以外の方法を使っている方がいましたらぜひ教えていただきたいです。
micro:bit スマホでも開発できるらしいぞ

これは [micro:bit Advent Calendar 2017](https://qiita.com/advent-calendar/2017/microbit) の 8 日目の記事です。

どうやら[スマホでも開発できる](http://microbit.org/ja/guide/mobile/)らしい

## まずはアプリをダウンロード

- Android は[ここから](https://play.google.com/store/apps/details?id=com.samsung.microbit)
- iOS は[ここから](https://itunes.apple.com/gb/app/micro-bit/id1092687276?mt=8)

起動すると可愛い画面が現れる
![IMG_8857.PNG](https://qiita-image-store.s3.amazonaws.com/0/164551/63fdd62f-f889-a1d5-93ad-978226a2aedb.png)


## micro:bit とペアリングだ！
[ページに書かれている手順](http://microbit.org/ja/guide/mobile/)で挑戦

1. トップのページの Connection をタップ

2. 画面上の黄色の箇所「Pair a new micro:bit」をタップ
![IMG_8850.PNG](https://qiita-image-store.s3.amazonaws.com/0/164551/9834655f-6686-0854-dc7b-129384645eaa.png)

3. 「ペアリングするので、micro:bit 側のここを押して」と案内されるので、その通りに押す 
![IMG_8851.PNG](https://qiita-image-store.s3.amazonaws.com/0/164551/96b7374e-23e1-283a-bc28-49ecccac44e8.png)

4. macro:bit 側に表示されるパターンと同じものを指定する
![IMG_8852.PNG](https://qiita-image-store.s3.amazonaws.com/0/164551/8722942a-2b24-4267-4749-d3ffadc3db78.png)

5. 準備ができたぜーの表示 
![IMG_8853.PNG](https://qiita-image-store.s3.amazonaws.com/0/164551/a1fbbfc4-3027-6802-e2c4-1aea014d2372.png)

6. ペアリングできたぜーの表示
![IMG_8854.PNG](https://qiita-image-store.s3.amazonaws.com/0/164551/305522ac-db69-a8df-2d6b-4f42a9e760c0.png)

micro:bit 側ですが、接続できたよ的なチェックマークが表示される
裏にある RESET ボタンを押して準備完了
ここまで快調ぉ♪

## 簡単なプログラムを
作った！
単純に、シェイクしたらハートのアイコンを出すだけの簡単なプログラム
これをスマホ上の web ブラウザの画面から作った
保存もした

## micro:bit に作ったプログラムを流し込むぜ！
Flash で流し込むのだ！
![IMG_8855.PNG](https://qiita-image-store.s3.amazonaws.com/0/164551/cd34da28-5f9f-13de-07cd-979bf81c3747.png)

## が！
ペアリングしたはずの micro:bit がわからんといわれる
![IMG_8856.PNG](https://qiita-image-store.s3.amazonaws.com/0/164551/fbb264b3-abce-219d-0ad4-f87e618f0e1a.png)

スマホの設定画面から接続先の micro:bit を選ぶと....
何故か接続できない

あれこれリセット方法も試したけどできない

これを一般的にドツボにはまったという..
こ、今回はここまで
解決編は...投稿できるのか？
CUIに苦手意識がある人でも使えるコマンド

ラクス [Advent Calendar 2017](https://qiita.com/advent-calendar/2017/rakus)の9日目の記事です。
昨日はsts-sd2さんの[知識０からAnsibleハンズオンをやってみた](https://qiita.com/sts-sd2/items/626884053e7df6a2e41d)でした。
構成管理は積年の課題ですね。

# はじめに
ラクスに入社して1年半経過しました。
前職ではお客様先に出向し、自社システムの構築を行うSI業務を中心に従事していて、ラクスに入社後はクラウドサービスの開発を行っています。
https://www.rakus.co.jp/service/

# 環境の違い
SI業務を行っていた時は、開発時に全ての作業を自分のローカルPC（Windows）で行っていました。
・Eclipse(All-in-one)
・Tomcat
・Oracle or DB2
・他必要なものなどなど

ラクスでは各個人専用のLinuxテスト環境を利用できるので、ローカルPCで開発しなくてもよい環境になっています。

ただし、GUIにずぶずぶの私がvimを駆使することはもちろんできず、コーディングをローカルPC（Windows）で行っています。
IDEの機能を利用して修正結果が自動的にリモート環境に反映されるようにしています。

# 利用したコマンドの上位
そんなGUIずぶずぶの私がCUIのコマンドをいかに活用できているかすごく気になったので、CUIコマンドで

```
history
```

と実行し、過去のコマンド履歴を集計し、実行したコマンド上位を調べてみました。
ちなみに、CUIウィザード級の方であれば、パイプや各種コマンドを駆使して集計や上位順の表示などできると思いますが、私はもちろんできないので、

```
history > history.log
```

の結果ファイルをローカルPCに転送し、エディタとExcelの集計／ソートでなんとか上位順の表示をしたのは言うまでもないですが。
集計期間は2017年1月～11月です。
※serviceとか、業務に関係するコマンドは除外しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217056/1ade7ed7-25e6-9927-1da5-e6745073dd0b.png)



・・・あまりにもバリエーションが少なくて我ながら恥ずかしいですね　(〃▽〃)
とはいえコマンドをそこまで活用できなくても、開発はできるという事ですね！！！

# おすすめ
そんな私ですら使っているコマンドなので、Linuxテスト環境を利用している方に必見のコマンドを私見と共にお伝えします。

```
tail -f ファイルパス
```

tail単品ではあんまり利用シーンないです。
-fオプション（ファイルが大きくなるたびに追加されたデータを出力）と組み合わせることによって、ログをリアルタイムでコンソール上で確認できます。
テストする時はあなたのそばにいつも「tail -f」です。

よくよく考えるとローカルPCでテストしてた時はEclipseのコンソールログに同じものが出力されますね。。。
WindowsだとPowerShell上で「Get-Content [ログファイルのパス] -Wait -Tail 100」で同じような事ができます。

```
grep
zgrep
```

grepはファイルから文字列を検索するコマンドですので、パイプと組み合わせることで大活躍です。
ウィザード級の方々は「find」「grep」「sed」を組み合わせるという大魔法を使っているようですが、私にはまだ無理です。
意外だったのがzgrepで（知らなかった、、、）、grepと同じような感覚で圧縮ファイルを検索できます。
同じようなコマンドでzlessとかzcatとかもあります。

ちなみに以前の私はLinux環境に各種ファイルがあるときに、一旦ローカルPCに関連ファイルをダウンロードし、エディタのgrep機能で必要な情報を抽出し、加工するという恐ろしい手間をかけていました。。。

```
md5sum
```

チェックサムを計算して表示する。
このコマンドがイケてるというよりも、テスト環境で試したスクリプトファイルを別環境で実行する時に間違っていないか確認する時に活躍。
私はテキストエディタで作業するときなど、Ctr + S （上書き保存）を癖のようにしてしまうので、完了したスクリプトファイルに想定外の内容が入力／保存されてしまう事があります。
そのため、ファイルの中身が変わっていないか確認する時に利用しますね。
テスト環境であらかじめmd5sum結果を取得しておき、別環境で実行する時は
「md5sum ファイル | grep "テスト環境でのmd5sum結果"」
といったコマンドで事前確認すると安心です。


# おまけ
Linux環境上の設定ファイルを変更する時に、通常はviを利用すると思いますが、私のコマンド履歴を見るとほとんどvi/vimは利用していませんでした。
cat、lessなどの利用回数もかなり少ないです。
私なりの解決方法がWindowsPCからFTPクライアントでLinux環境のファイルを確認し、編集後アップロードしています。
スクロールを多用してババっと確認した方が私的には作業速いんですよね。
WinSCPというツールを現在利用していますが、FileZilla・FFFTPなど他のツールも使った事があり、ツールによる誤差はあまり感じた事がありません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217056/36ca6746-42ff-65d4-a03d-54b057eca418.png)


# 最後に
Winodwsでの開発に慣れ親しんだ私でも、Linuxテスト環境と組み合わせた開発は意外にできています（できているはず！）。
様々な手段（コマンドの活用）が利用できるのはもちろんいいと思いますが、自分なりの効率のいい手段を見つけるのが大事なんだなと思います。
Node.js の Lambda 関数を ローカルでテストする

Node.js の AWS Lambda 関数をローカルでテストする方法です。

テストで使う　Lambda 関数

```js:iot_aa.js
// ---------------------------------------------------------------
//	iot_aa.js
//
//						Dec/08/2017
//
// ---------------------------------------------------------------
'use strict'

// ---------------------------------------------------------------
console.log('Loading function')

exports.iot_aa_handler = (event, context, callback) => {
    //console.log('Received event:', JSON.stringify(event, null, 2))
	console.log('value1 =', event.key1)
	console.log('value2 =', event.key2)
	console.log('value3 =', event.key3)
//
	const v1 = parseInt(event.key1)
	const v2 = parseInt(event.key2)
	const v3 = parseInt(event.key3)

	const sum = v1 + v2 + v3

	const version = "Version: Dec/08/2017 AM 09:25"
	var rvalue = {}
	rvalue['v1'] = v1
	rvalue['v2'] = v2
	rvalue['v3'] = v3
	rvalue['sum'] = sum
	rvalue['version'] = version
//
	callback(null, rvalue)  // Echo back the first key value

    //callback('Something went wrong')
}

// ---------------------------------------------------------------
```

テストに使うプログラム

```js:test_local.js
#! /usr/bin/node
// ---------------------------------------------------------------
//	test_local.js
//
//					Dec/08/2017
//
// ---------------------------------------------------------------
var fs = require("fs")
var iot_aa = require('./iot_aa')
// ---------------------------------------------------------------
console.error ("*** 開始 ***")

const event = {
	"key1": 11,
	"key2": 21,
	"key3": 31
}

const context = ""

iot_aa.iot_aa_handler(event,context,func01)


console.error ("*** 終了 ***")
// ---------------------------------------------------------------
function func01(aaa,rvalue)
{
	console.error ("*** func01 *** start ***")

	console.log(aaa)
	console.log(rvalue)

	console.error ("*** func01 *** end ***")
}
// ---------------------------------------------------------------
```

実行の様子
![lambda_dec0801.png](https://qiita-image-store.s3.amazonaws.com/0/179446/69df981b-fef7-ff86-5be4-d027428e6cf2.png)


テストの結果問題がなければ、次のスクリプトで、Lambda 関数の作成が出来ます。
ロールは変更して下さい。

```bash
#
FUNCTION='iot_aa'
ZIP_FILE=$FUNCTION".zip"
#
zip -r $ZIP_FILE $FUNCTION".js"

aws lambda create-function \
	--function-name $FUNCTION \
	--runtime nodejs12.x \
	--role arn:aws:iam::178234159025:role/role_bb \
	--handler $FUNCTION.iot_aa_handler \
	--zip-file fileb://$ZIP_FILE \
	--region ap-northeast-1
#
```

次のバージョンで動作を確認しました

```text
$ node --version
v14.3.0
```
Spring IntegrationでTCP通信する処理の流れを調べてみた(サーバ編)

前回に引き続き、Spring IntegrationでTCP通信する処理の流れを整理するために、煩雑ではありますがクライアント側のシーケンス図を描いてみました。

前回：
[Spring IntegrationでTCP通信する処理の流れを調べてみた(クライアント編)](https://qiita.com/neriudon/items/8662c4ac747ea0d307f3)



![Spring IntegrationによるTCP接続のシーケンス](https://qiita-image-store.s3.amazonaws.com/0/162142/0b73aaa6-c99b-dbd6-09fc-eb7d67b9744e.png)


#### 前段階
`autoStartUp`が有効、つまりアプリケーション起動時に`InboundGateway`や`ConnectionFactory`が起動するケースを想定しています。そのため起点がおかしなことになってしまいました:confounded:。

1. `InboundGateway`は`ConnectionFactory`を設定するメソッドを呼ぶ。
2. `ConnectionFactory`は送受信者として`Sender`, `Listener`に`InboundGateway`を登録する(`InboundGateway`は`TcpSender`, `TcpListener`を実装している)。
3. `ConnectionFactory`のライフサイクルを`start`にする。

#### TCP接続(クライアントからの受信準備)
1. 指定したポート番号をもとに`ServerSocketFactory`に`ServerSocket`を生成するよう依頼する。
2. 受け取った`ServerSocket`を保持し、`Socket`が接続を受け入れられる状態で待機させる。
3. `TcpConnectionServerListeningEvent`を発行する。
4. `Socket`をもとに`TcpConnection`を構築する。
5. `TcpConnection`は`ConnectionFactory`を介して、`InboundGateway`を送受信者として登録する。
6. `InboundGateway`が`TcpConnection`を保持する、
7. `TcpConnectionOpenEvent`を発行する。

#### TCP接続(クライアントへの返信)
1. クライアントからメッセージを受信する。
2. メッセージとチャネルを電文変換・業務処理をおこなうためのテンプレートである`MessagingTemplate`に渡す。
3. 処理結果を`InboundGateway`に返す。
4. 返信するメッセージを`TcpConnection`に渡す。
5. `MessageMapper`にメッセージを渡す。
6. `MessageMapper`はメッセージのペイロードを抽出して返す。
7. TcpConnectionはペイロードを直列化してクライアントに返信する。

備考：
図では省略していますが、`MessagingTemplate`と`InboundGateway`の間には`Channel`や各種エンドンポイントがあります。

#### TCP接続(接続の解除)

1. TCP接続が確立している間になんらかの例外が発生した場合`ConnectionExceptionEvent`を発行する。
2. `Socket`を閉じる。
3. `TcpConnection`は`InboundGateway`に解除する接続をリストから削除するよう依頼する。
4. `ConnectionCloseEvent`を発行する。
5. `LifeCycle`を管理する`Processor`が`InboundGateway`に停止するよう依頼する。
6. `InboundGateway`は`ConnectionFactory`に停止するよう依頼する。
7. `ConnectionFactory`は`ServerSocket`を閉じる。
8. まだ残っているTCP接続があれば、それらを閉じる。
9. `TcpConnection`は`InboundGateway`に解除する接続をリストから削除するよう依頼する。またタスクが残っている場合はそれも削除する。

備考：
1でなんらかの例外が発生した場合と記載しましたが、`Socket`が閉じられた場合などを指します。
詳しくは[`TcpNetConneciton#run`](https://github.com/spring-projects/spring-integration/blob/master/spring-integration-ip/src/main/java/org/springframework/integration/ip/tcp/connection/TcpNetConnection.java#L169)を参照してください。

#### 図の作成に使ったサービス
↑の図は前回に引き続き[WebSequenceDiagrams](https://www.websequencediagrams.com/)というサービスを利用して作成しました。
MacでVirtualBoxがダウンロードできない

# 環境
* OS High Sierra

# 状況

パッケージをインストールしようとすると、なぜかブロック

# 解決策

この記事

http://webnetarium.com/howto-install-virtualbox-to-high-sierra/

システム環境設定
>1)セキュリティーとプライバシー
>2)一般のタブ
>3)「ダウンロードしたアプリケーションの実行許可：」項目の「開発元”Oracle America, Inc.”のシステム・ソフトウェアの読み込みがブロックされました。」を許可

解決
LINQで選択肢の全組み合わせ展開(クエリ式を使う)

[LINQで選択肢の全組み合わせ展開](https://qiita.com/jinka1997/items/4955259837b1afaa5a0e)の続き。
選択肢数が可変でもOK！とするために再帰でやったけど、
選択肢数も型も決まってるんなら、こっちの方がスマートかと。

# というわけで実装。

## クエリ式で実装

SQLで全組み合わせ作る時に、結合条件なしで直積を作ってたよね、ってことで、
クエリ式でもjoinを使わずに、選択肢の数だけ**「from～in～」**を並べて全組み合わせを展開。
その後で、重複が無いものだけを引っこ抜く。

```csharp:Program.cs
        public static void Main(string[] args)
        {
            var items = new int[] { 1, 2, 3 };

            //結合条件なしで重複ありの全組み合わせを展開
            //展開結果は配列にする
            //q1{1,1,1}{1,1,2}{1,1,3}{1,2,1}…{3,3,3}
            var q1 = from s1 in items
                     from s2 in items
                     from s3 in items
                     select new int[] { s1, s2, s3 };

            //各要素の重複なしのレコードのみ抽出して返す
            //要素の個数と、各要素の値の種類数が一致していれば重複無しと判断
            // q1={1,3,1}の場合、要素の個数は3、値の種類数は2(1と3しかないから)→×：除外
            // q1={1,3,2}の場合、要素の個数は3、値の種類数は3→○：抽出
            // q1={1,1,1}の場合、要素の個数は3、値の種類数は1(1しかないから)→×：除外
            var q2 = q1.Where(ar => ar.Length == ar.Distinct().Count());

            q2.DisplayElement<int>();
        }
```

## 実行結果確認用のコード
結果確認用の拡張メソッド。(前回作ったそのままでよかったね。。。)

```csharp:Extention.cs
        /// <summary>
        /// 結果表示用
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="query"></param>
        public static void DisplayElement<T>(this IEnumerable<T[]> query)
        {
            foreach (var q in query)
            {
                Console.WriteLine(string.Join(" ", q));
            }
        }
```
## 実行結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221879/6b82b4e5-7aaa-b2d5-7711-df4cda7358a8.png)

おっけー！

# 修正前
albireoさんからアドバイスをいただき、修正しました。修正前は↓。
Selectの射影を匿名型で取る意味ってなかったね。。。

## 修正前のコード
```csharp:【修正前】Program.cs
        public static void Main(string[] args)
        {
            var items = new int[] { 1, 2, 3 };

            //結合条件なしで重複ありの全組み合わせを展開
            //q1{1,1,1}{1,1,2}{1,1,3}{1,2,1}…{3,3,3}
            var q1 = from s1 in items
                     from s2 in items
                     from s3 in items
                     select new { N1 = s1, N2 = s2, N3 = s3 };

            //各要素の重複なしのレコードのみ抽出して返す
            //要素の個数と、各要素の値の種類数が一致していれば重複無しと判断
            // q1={1,3,1}の場合、要素の個数は3、値の種類数は2(1と3しかないから)→×：除外
            // q1={1,3,2}の場合、要素の個数は3、値の種類数は3→○：抽出
            // q1={1,1,1}の場合、要素の個数は3、値の種類数は1(1)→×：除外
            var q2 = q1.Where(v =>
            {
                var ar = new int[] { v.N1, v.N2, v.N3 };
                return ar.Length == ar.Distinct().Count();
            }
            );
            q2.DisplayElement();
        }
```

## 修正前の実行結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221879/9eac1979-3be8-b174-524a-22e284cb53f3.png)
批判に対する反応を認知で制御する

## 概説

人と仕事をしていると批判を受けることが日常的にあります。

批判と聞くと個人的な認識としてはネガティブなイメージになってしまいます。

しかし辞書で調べてみると 

> 良い所、悪い所をはっきり見分け、評価・判定すること。

といった意味なので決してネガティブなイメージではありません。

ネガティブなイメージを持つ言葉はどちらかと言うと `指摘` というほうがしっくり来るかもしれません。

何れにせよ、この記事ではネガティブ印象を持つ批判(≒攻撃)に対する反応について概説し、批判をポジティブに受け取るための考え方を提案したいと思います。

また、ここでは批判に対して上手く相手を言い負かすとかそういうテクニックは紹介しません。全て自分の中で完結する方法を説明します。

### 認知について

少し認知という言葉について説明します。

人は世界で発生したことを自分の知識や経験、思い込み、誤解などを通して認識しています。 その為、同じ物事でも人によって感じ方が変わります。

一方で、認知(※1)は無意識に起こっていることではないので制御可能です。 その為の認知を上手く手懐けることで批判に対する反応を制御することでストレスを減らし・物事を効率的に考えるようになり・より良く人と関わることができるようになります。

> ※1 思考は無意識に行われる速い思考、意識的に行われる遅い思考があり、ここでは遅い思考によって得られる認知を指します(下の中で一番右側の認知)。
  事象 -> 知覚 -> 速い思考 -> 認知 -> 遅い思考 -> 認知

## 批判への反応

一般的に人は攻撃された時には`怒り`、`抑うつ`、`喜び`の3パターンの反応をすると言われています(1)。

それぞれどういった状況になるのか待ち受けている結果を右側に書きます。

1. 怒り(=相手を攻める) -> 何も得られず、対人関係も悪くなり状況は更に悪化します。
2. 抑うつ(=自分を攻める) -> 不安になり、自己評価が低くなり鬱になります。
3. 喜び(=好奇心) -> 物事の問題点がわかり解決法もわかり状況が良くなる。

どの反応を選ぶべきかは一目瞭然ですね。

### 喜び(=好奇心)について

怒りと抑うつはなんとなくイメージが付くと思いますが喜びはちょっとイメージが付きにくいかもしれませんので詳しく説明します。

ここででの喜びは知的な好奇心をイメージしてもらうと分かりやすいと思います。

何か批判を受けたときに例えば以下のように反応したとします。こういった反応を好奇心のある反応といいます(僕が勝手に言ってます)。

1. 「その視点はなかった」
2. 「ではどうすれば良くなるんだろう？」
3. 「これは知らなかった。どういうことなんだろう？」

これらの反応の良いところは、問題の焦点が常に自分でも相手でもない問題そのものに当たっているところです。

そのため、相手も自分も攻める必要が無いのでストレスを感じずに問題に取り組むことが出来ます(問題について考える事そのものに対するストレスはあるでしょうけど...)。

こういった反応をすることで問題の本質に集中し物事をより効率的に解決できるようになって非常に快適に過ごせるようになります。

批判を受けたときに喜びを感じれるなんて凄いと思いませんか？

## まとめ

駆け足ですが、批判を受けたときに発生する反応とその結果について述べたあと、取るべき良い反応について説明しました。

エンジニアは仕様や Pull Request など議論することが多いと思いますので、生産性アップのためにもストレスフリーな考え方の参考になると幸いです。

## 補足: ヤジ的な批判あるいは意味をなさない批判に対する反応

この世には怒らせることを目的とするような批判もあります。 そういった場合にも、相手を言い負かしてやろうなどとは考えず、その批判や議題になっていること事柄に集中することで自然に受け止めることができます。

1. なるほど良い質問ですね！  -> 感謝を伝える
2. 確かにそういった視点も重要です -> 相手の意見の勝ちを認める
3. それについてはXXXが参考になるので調べてみてください -> 相手に解決方法を提案する
4. あるいは後で私に質問してきてください -> 相手にあなたも大事な人であることを伝える

などと返答すると相手も自分も悪い気分がせずに回答することができます。

---

## 参考文献

1. 〈増補改訂 第2版〉いやな気分よ、さようなら―自分で学ぶ「抑うつ」克服法: デビット・D・バーンズ
既存のdictに複数の値を一度に追加したいときはupdate()を使うと1行で書ける

この記事は [Pythonのコードを短く簡潔に書くテクニック Advent Calendar 2017](https://qiita.com/advent-calendar/2017/python-short-code) の8日目です。

# はじめに

既存のdictオブジェクトに値を追加したいときに`d[key] = value`という書き方をしますが、一度に複数の値を追加したい時は`update()`を使うと1行で書けてスッキリします。

# `d[key] = value`で追加する場合

```py3
d['apple'] = 100
d['banana'] = 200
d['orange'] = 300
```

# `update()`で追加する場合

```py3:
d.update(apple=100, banana=200, orange=300)
```

# 参考

- Python3 ドキュメント
    - Python 標準ライブラリ
        - [dict.update](https://docs.python.jp/3/library/stdtypes.html#frozenset.update)
Rustのクロージャを嗜む


# はじめに

この記事では、Rustのクロージャに関する奇抜な(JavaScriptのパラダイムに似た)応用を紹介していきます。
Rustらしくない書き方だと思うので、こんなこともできるんだ程度に思ってもらえれば幸いです！

# Rustにおけるクロージャ

Rustのクロージャは、 ` || -> i64 { 1 } ` のように書くことができる非常にシンプルな関数です。

```rust
let x = |i: i64| -> i64 { i };
println!("{}", x(1));
```

どの部分がどこにあたるかは下記の通りになります。

```rust
let 関数 = |引数| -> 戻り値 { 返却する値 };
```

# 即時関数

クロージャを応用して、即時関数を作ることも可能です。
即時関数はクロージャを変数に代入することなく即実行されます。

```rust
println!("{}", (|| -> &str { "1" })());
```

# 即時関数でResultをうまく扱う

即時関数によって、戻り値を指定することが可能なので `?` や `try!` を使ってエラーが発生した場合に即 `Err<String>` を返すような処理を簡潔に書くことが出来ます。

```rust
(|| -> Result<(), String> {
    let mut file_s = File::open("s.txt").map_err(|err| err.to_string())?;
    let mut contents = String::new();
    file_s.read_to_string(&mut contents).map_err(|err| err.to_string())?;

    let mut file_w = File::open("w.txt").map_err(|err| err.to_string())?;
    let mut contents = String::new();
    file_w.read_to_string(&mut contents).map_err(|err| err.to_string())?;

    let mut file_s = File::create("s.txt").map_err(|err| err.to_string())?;;
    let mut file_w = File::create("w.txt").map_err(|err| err.to_string())?;
    file_s.write_all(b"").map_err(|err| err.to_string())?;
    file_w.write_all(b"").map_err(|err| err.to_string())?;

    Ok(())

})();
```

# 即時関数でOptionをうまく扱う

Optionに対して `?` を使うと、Someの中身を展開してくれる仕組みをクロージャ内に閉じ込めて使うことが出来ます。

```rust
(|| -> Option<&str> {
        let x = Some("1")?;
        println!("{}", x);
        let x = Some(x)?;
        println!("{}", x);
        let x = Some(x)?;
        println!("{}", x);
        let x = Some(x)?;
        println!("{}", x);
        Some(x)
    })();
```

# 戻り値を省略する

クロージャは戻り値を省略することが出来るため、一切型を書かずにプログラミングすることが出来ます。

```rust
let x = (|i: i64| i.to_string());
let y = (|| x(123) + &x(456))();
println!("{}", y);
```

## move クロージャ

moveクロージャの場合変数が移動する際に、変数がCopyを実装している場合コピーされた変数の所有権を得るので、クロージャを抜けると値は5のままになっています。

```rust
let mut a = 5;
let mut b = move || a += 5;
b();
println!("{}", a); //=> 5
```

moveがない場合は、通常の移動となるため数が増えます。
そして同じスコープでmutable borrowが発生しているので、ブロックスコープを外すとエラーになります。

```rust
let mut a = 5;
{
    let mut b = || a += 5;
    b();
}
println!("{}", a); //=> 10
```

# 最後に

Rustにはブロックスコープがあるので、あまり即時関数の出番はないかもしれませんが、こんなことも出来ますっていう紹介でした。
超文系脳WEBデザイナーがPHPを勉強して気づいた挫折しない為の３つのコツ

## はじめに

初めまして！エイチームブライズ、デザイナーチーム黒一点(汚い)の@nishio1873です。デザイナーチームからの1発目の投稿、緊張です・・・。

12月8日は
「超文系脳のWEBデザイナーでも、PHPの勉強に挫折しない為の３つのコツ」を紹介したいと思います。

さてさて、弊社デザイナーチームは、デザイン作成からHTML・CSSのコーディング、サイト分析まで行いますが、フロントエンドの組込に関してはプログラマーチームへ大部分を依頼しているような状況でした。開発工数を少しでも削減し、PDCAのスピードを上げていきたい、そんな思いからPHPを勉強し始めました。やる気に満ち溢れている。


**でも速攻で挫折しかけました**


## まずぶち当たった３つの壁
![TRTM9405_TP_V.jpg](https://qiita-image-store.s3.amazonaws.com/0/215714/1b44683e-8a3c-1eed-0371-cb2c41b2d4fd.jpeg)


- 「変数」「配列」とかの「プログラムの感覚」がさっぱりわからん
- 実務レベルで活かせるレベルではなく、成長の実感がない、楽しくない
- 気軽に質問できる人がいない(友達すくねぇ)

**そんな躓いたポイントを、こんな方法で乗り越えてみました**

## 文系脳でもPHPで挫折しない為の３つのコツ

- 「プログラム」として理解するのを諦める
- 外部の学習サービスを使って、成長してるっぽい実感を得てみる
- 優しく教えてくれそうな人を思い切って頼ってみる

## 「プログラム」として理解するのを諦める

無理なもんは無理なんや・・・

無理して文章やお手本ソースコードから理解しようとせずに
もっとデザイナーっぽいアプローチに切り替えました。

先輩からオススメされた教範本で、イラストでの解説がたくさん載っていて
変数や配列といったPHPを勉強しはじめた時につまづきやすいポイントを
わかりやすく説明してくれていました。

「絵で考える」ことが相性がよかったようで、if文やfor文の考え方も、いちいち絵や図で描き起こしてみるようになってから、プログラムの流れなども理解しやすくなりました。無理してソースコードから理解しようとせずに、デザイナーらしくビジュアルで理解するアプローチはわかりやすかったと思います。

## 外部の学習サービスを使うなどして、成長してるっぽい実感を得てみる

これは皆さん取り入れている人も多いとは思うのですが「TechAcademy」や「Progate」などのオンラインの学習サービスをつかってみたのが、僕には非常に合っていました。

僕はProgateを使っていたのですが、何よりよかったのは**「なんとなくわかってきている気がする」**ことでした。サイトで提示される課題をクリアしていくことで、ちょっとづつ前進している感覚があったので、低レベルなりにも心が折れにくかったです。

## 優しく教えてくれそうな人を頼ってみる

正直、これが一番大きかったのですが・・・

大変ありがたいことに弊社の超優秀な後輩プログラマーである@phigasuiが「PHP勉強会」を企画してくれたことがとてもとても大きかったです。

![IMG_7856.jpg](https://qiita-image-store.s3.amazonaws.com/0/215714/836e3510-dc6a-cff5-1408-3714672a18a4.jpeg)
(勉強会の様子)


超基本的な部分から懇切丁寧に解説をしてくれ、実技を含めた実際にコードを記述するところまで含めて教えていただけました。すっごいバカな質問にも答えてくれる@phigasui最高、超優しい、イケメン。

しかも、実務で使える変数や配列を使用してサンプルコードや課題を作ってくれるのでその日からどんどんとソースコードの意味を読み取れるようになっていきました。

質問しやすい人を頼ってみるのも一つの手ですね、もちろん自分で勉強できるところまでやる！のが大事ですが。

## 挫折しない為のまとめ

- よくわからないところは、絵で描き起こしてみる
- 成長している感覚を大事にする、続けられる工夫をする
- 思い切って人を頼る、バカな質問でも許してくれる人を見つける

あとはもう本当に習うより慣れろの精神で、下手くそと思われてもいいからとにかく書いてみること、そしてコードレビューを恐れないこと(ホント大事)だと思います。

まだまだどんどん書いてPHPチャレンジしていきます！
次の僕の記事では、もうちょっと実践編部分の記事も書いていきたいです。頑張ります！

## お知らせ
エイチームブライズでは一緒にWEBデザイナーとして活躍してくれる優秀な人材を募集中です！
サービスを成長させたい！そんな気合の入ったメンバーばかりです、興味のある方はぜひともエイチームグループ採用ページよりお問い合わせ下さい。
http://www.a-tm.co.jp/recruit/

## 明日の記事は〜？

明日の記事は、なんと！PHP勉強会を企画してくれた、エイチームブライズの新人癒し系イケメンプログラマー@phigasuiが執筆してくれるようです。「いい記事の話」をしてくれるそうです。さぞかし「いい話」なんでしょう！

ご期待ください！
Liferay 7 / DXPのインストール(Windows)

## Liferay 7 / DXPのインストール(Windows、Tomcatバンドル)
### 前提条件
- 今回はデータベースには追加せず、組み込みのハイパーソニックを利用します（本番環境では利用できませんが、デモ、簡易テスト用途には利用できます）
- 検索エンジンも、組み込みのElasticsearchを利用します。

### インストール手順
- Oracle JDK 8をインストール(JREではなく、JDK8の最新版をインストールしてください 例： Java SE Development Kit 8u152など)

- 環境設定を開き、以下のシステム環境変数を設定する。項目がなければ新規に作成する。

|環境変数 | 設定値（サンプル) |
|:-------|:-----|
| JAVA_HOME | C:¥Program Files¥java¥jdk1.8.0_152 |
|JRE_HOME | C:¥Program Files¥java¥jdk1.8.0_152 |
| Path | 多分すでに値が設定されているものがあると思うので、最後にコロン区切りで```C:¥Program Files¥java¥jdk1.8.0_152¥bin``` |
- Liferay 7 / DXPをダウンロード(Tomcatバンドル版をダウンロードすることをここでは想定しています。）し、Cドライブ直下などに解凍する。ユーザーホーム（デスクトップなど）で解凍すると、パスが長すぎて解凍できない、というようなエラーが発生する可能性があります。
- 解凍したルートディレクトリを```${liferay_home}```とした場合、まず```${liferay_home}¥tomcat-8.0.32¥bin```に移動します
- メモリに余裕がある場合、`setenv.bat`の`-Xmx1024m -XX:MaxPermSize=384m"`を`-Xmx4096m -XX:MaxMetaspaceSize=512m"`に変更します。
- ```startup.bat```をダブルクリックすると、Liferayが起動します。
Redisでデータをzip圧縮して格納するとどれくらいメモリ容量が減るか検証

圧縮するとメモリ容量を節約できるのはわかっていたんだけど、元のデータ量が大きいほど効果がありそうだったので、だいたいどれくらいかなって検証。

# 検証方法

* ランダムな日本語（ひらがな）1〜100,000,000文字を生成してdict（hash）に格納したものを以下４つの方法でRedisに登録して、used_memoryの変化量を測定。
 * データそのままSET（これを基本値とする）
 * データそのままHSET
 * データをjsonエンコードしてSET
 * データをjsonエンコードしてから圧縮してSET
* 各結果のused_memoryを基本値で割った値を目視。このとき、1より大きければ基本値より容量が増えており、1より小さければ容量が減っている。値が小さければ小さいほど、メモリ容量の節約効果が高いということになる。
* 連続で処理を実行していると時々おかしな値が出ることがあるので（原因は不明）、 テストデータを３回生成×同じテストデータを３回登録してテスト結果をとり、他と比べて明らかに異常な値が出た結果は捨て、他とだいたい同傾向を示しているなかの、一番最後の値を検証値としてとる。（本当は平均とかとるべきなのかもだけど面倒くさい）
* 以上をpythonとシェルスクリプトでゴリゴリ書いて実行。

# 検証環境

OS: Debian GNU/Linux 9 (stretch)
Redis: Version 3.2.6 (デフォルト設定のまま、localhostで稼働)
python: Python 3.5.3

その他細かいことはこちらに
https://github.com/robitan/redis-kensho/blob/kensho-compressed/result_compressed/run-info.txt

# 検証結果

|文字数（日本語ひらがな）  |そのままHSET / そのままSET |jsonをSET / そのままSET |jsonを圧縮してSET / そのままSET |
|---|---|---|---|
|1  |1.000649  |1.000649  |1.000649  |
|10  |1.000648  |1.001081  |1.000648  |
|100  |1.005793  |1.008796  |0.997640  |
|1,000  |1.005395  |1.128072  |0.961838  |
|10,000  |1.003097  |1.763680  |0.706436  |
|100,000  |1.000356  |1.986330  |0.364987  |
|1,000,000  |1.000036  |2.793968  |0.356083  |
|10,000,000  |1.000003  |1.874999  |0.375001  |
|100,000,000  |-  |- | -  |

* 100〜1,000文字は、多少軽くはなっているかなってくらい。
* 10,000文字くらいだと３割減。
* 100,000文字以上では半分以下になる。
* 100,000,000文字はエラーが出たので結果なし。Redisの許容量を超えたっぽい。
* 今回の検証には直接関係ないけれど、圧縮しないほうのjsonが10,000〜10,000,000文字でおかしな動きを見せている。謎。

# まとめ

ある程度までは元のデータ容量が大きいほど削減効果がある感じ。削減効果は最大で6〜7割減くらいだった。今回は単純な文字列がひたすら並んでいるテストデータだったけれど、データのタイプによってはもう少しいけそうな気もする。

Redisの容量を削減したい場合、1つのキーあたりに格納するデータが `10KB〜100KBを超えるのを目安` にして、圧縮することを検討してもいいかもしれない。

# 検証コードなど

ここ。（[よけいなもの](https://qiita.com/robitan/items/68811eb3adcbb89b9adb)もまじってます）
https://github.com/robitan/redis-kensho/tree/kensho-compressed

検証結果のrawデータは以下。
https://github.com/robitan/redis-kensho/tree/kensho-compressed/result_compressed
BabelPluginによりリンクへrel=noopenerを自動的に付与する


以下の記事が話題になっていました。

[リンクのへの rel=noopener 付与による Tabnabbing 対策 | blog.jxck.io](https://blog.jxck.io/entries/2016-06-12/noopener.html)

`rel="noopener noreferrer"`を付けないとフィッシング詐欺攻撃の可能性があるというものです。
Reactを使っている人なら`eslint-plugin-react`も使っていると思いますが、これには、`react/jsx-no-target-blank`というルールが含まれており、`target='_blank'`かつhrefが`http`で始まる場合エラーを出します。

[eslint-plugin-react/jsx-no-target-blank.md at master · yannickcr/eslint-plugin-react](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-target-blank.md)

ただ、これを有効にして安心していると、hrefが変数である場合には対処できず、知らずのうちにnoopenerが付いてないリンクを作成している可能性があります。

そこで`babel-plugin-jsx-target-blank`というBabel Pluginを公開しました。

[**akameco/babel-plugin-jsx-target-blank** <br>add 'noopener noreferrer' to external link for security](https://github.com/akameco/babel-plugin-jsx-target-blank)

これは、aタグに`target="_blank"`があれば自動で`noopener noreferrer`を付加するプラグインです。もちろん、外部リンクの場合も付加します。
これによって、もはや`noopener`を付ける付けないを意識することもないです。

## 使い方

インストール

```console
$ yarn add --dev babel-plugin-jsx-target-blank
```

.babelrc

```json
{
  "plugins": ["jsx-target-blank"]
}
```

```jsx
<a href="akameco.github.io" target="_blank">akameco</a>

      ↓ ↓ ↓ ↓ ↓ ↓

<a href="akameco.github.io" target="_blank" rel="noopener noreferrer">akameco</a>
```

```jsx
<a href={externalLink} target="_blank">akameco</a>

      ↓ ↓ ↓ ↓ ↓ ↓

<a href={externalLink} target="_blank" rel="noopener noreferrer">akameco</a>
```

## おわりに
React2アドベントカレンダーがスカスカだったので、すでに過ぎた日を埋めてみました。期限を過ぎたのではないのであしからず😅


<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">JSXのaタグにtarget=&quot;_blank&quot;がある場合rel=noopenerを付加するプラグイン書いた。eslintのreact/jsx-no-target-blankとの違いは、hrefが変数の場合も自動で付加する <a href="https://t.co/i6YFn6a3xk">pic.twitter.com/i6YFn6a3xk</a></p>&mdash; あかめ@無職.js (@akameco) <a href="https://twitter.com/akameco/status/938872166677745664?ref_src=twsrc%5Etfw">December 7, 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Heroku CLIでビルトとリリースふりかえり

さて、コードの更新も終わったし、デプロイするよ! `git push heroku master`…あれ？なにかエラーが。おかしいな？前回のビルドはうまく行ってたと思うのにな。

そういうこともありますよね。これまでのビルドやリリースのログを見直してみましょう。

この記事は、[Heroku Advent Calendar 2017](https://qiita.com/advent-calendar/2017/heroku)の12月9日の記事としてお送りします。昨日は [kimihom さんが Rails 5.1 アプリを Heroku にデプロイ](http://www.bokukoko.info/entry/2017/12/07/000000)していました。Yarnむずかしーやーん。

## heroku builds:output
[heroku-builds](https://github.com/heroku/heroku-builds)プラグインをインストールすることでビルドの振り返りをできるようになります。

```
$ heroku plugins:install heroku-builds
```

```
$ heroku builds -a アプリ名
```

で最近のビルドのリストが見られます。

```
=== アプリ名 Builds
6cdfedd0-7554-4712-b265-8f5bd43c3db2  2017/12/06 19:35:31 +0000 (~ 24h ago)  d33becaac5663b49c252ce5197d53b9ee3abbab2  zundan@gmail.com
b2ee4ad8-b1e4-4ebd-a99f-fe891e7286e1  2017/12/03 06:16:14 +0000              3966e855563192cc68664036df2724daef00e804  zundan@gmail.com
7aba112b-9cd7-4828-b7a9-324132408672  2017/11/30 06:59:40 +0000              884b9a4803e459f2fa7f92005de2d8dddc29278b  zundan@gmail.com
  :
```

ビルドログを見るには`builds:output`。どのビルドか指定しなかった場合には最新のもの(ビルドが進行中の場合は進行中のビルドからのログ)が見られます:

```
$ heroku builds:output -a アプリ名
  :
       Webpacker is installed 🎉 🍰
       Using /tmp/build_b379c03c645fb9e8df51ac8ec5e10788/…d33beca/config/webpacker.yml file for setting up webpack paths
       Compiling…
```

(ここで時間がかかるんだよねー)

以前のビルドを眺めるにはUUIDを指定します:


```
$ heroku builds:output b2ee4ad8-b1e4-4ebd-a99f-fe891e7286e1 -a アプリ名
 :

-----> Compressing...
       Done: 383.5M
-----> Launching...
 !     Warning: Your slug size exceeds our soft limit (383 MB) which may affect boot time.
       Released v266
       https://アプリ名.herokuapp.com/ deployed to Heroku
```

## heroku releases:output
コードをデプロイするとデータベースのマイグレーションが必要になることもある。[Release Phase](https://devcenter.heroku.com/articles/release-phase)で自動化しちゃいましょう。

あ、マイグレーションのログを見ておくのを忘れた。そんなときには`releases:output`が使えます。リリースバージョンを指定しなかった場合には最新のものが確認できます。

```
$ heroku releases:output v313 -a アプリ名
  :
Migrating to CreateInvites (20171125024930)
== 20171125024930 CreateInvites: migrating ====================================
-- create_table(:invites)
   -> 2.2660s
-- add_index(:invites, :code, {:unique=>true})
   -> 0.0386s
== 20171125024930 CreateInvites: migrated (2.3054s) ===========================
  :
```

CLIが充実してるのいいよね。
テストを書くときに心がけていること


どういったテストが良いテストかを議論することが社内であったので、普段自分がテストを書くときに心がけていることを言語化しました。


## One assertion per test

「テストメソッド毎にアサーションがひとつ」という状態が理想です。アサーションが多いテストは、「何を担保しているのか」がはっきりせず、テストの責務が曖昧になります。またひとつのテストコード量が増えて、他の人からすれば読むのに苦労して保守がしづらくもなります。

ひとつのことだけをテストするテストメソッドが沢山あるほうが望ましいです。

とはいえ現実的には、ひとつのアサーションだけで書けないようなテストケースも存在します。特にviewに関するテストは、チェックすべきことが多くなります。「one assertion per test」はあくまで基本として、こだわりすぎないことも重要です。

## DRYにしすぎない

DRY(Don’t Repeat Yourself)はエンジニアにとって尊い行動ですが、テストに関していえばDRYをあまり意識しないほうが良いです。

テスト用のhelper関数を別ファイルに作った場合、テストを読むのにあちこち飛ばないといけなくなり他の人からは理解しづらいものになってしまいがちです。

テストコードは意図が汲み取りやすいシンプルなコードであることが重要です。

## setupは必要最低限に

setupはテストメソッドのなかで共通化できる部分を書くことで、テストの可読性をあげることができます。

ただこのsetupに、ある特定のテストメソッドにのみ必要な処理が書かれてあることも見受けられます。他のテストメソッドへ副作用がなければ問題ないように思えますが、setupの処理が長くなるだけ読みづらさは増しています。

setupにはほとんどのテストメソッドに共通しているコードのみを記述して、他に必要なものは各テストメソッドのなかで用意するのがよいでしょう。

繰り返しになりますが、テストコードは情報が集約していてシンプルであることが望ましいです。

## テスト間の依存関係をなくす

特定の順番でないと通らないテストは、開発中に気軽にテストを流せなくなるので必ず避けましょう。

## 境界値を意識する

条件分岐の境界となる値については、バグが発生しやすいのでテストを書くようにします。

例えば「3人以上なら追加料金が発生」といったロジックをテストする場合は、「2人」と「3人」のふたつが境界値となるので、正常系に加えてこれらをテストケースに加えます。

## ランダムなテストデータを用いる

テストで必要となるデータを"hoge"のように固定値で用意しているのをよく見かけますが、たまたまシンプルなデータだから問題が起きてない可能性があります。例えばHTML特殊文字の場合や文字数が長い場合に不具合が発生するコードでも、この"hoge"というテストデータでは検知できません。

Fakerのようなライブラリを用いて、

* 本番のユースケースに即した意味のあるデータ
* 毎回異なるランダムなデータ

を生成してテストを実行することで、コードの堅牢性に繋がります。

## テストをすべき箇所に集中する

テストは闇雲に書いてカバレッジを上げれば、品質が上がるというものではありません。例えば、ライブラリ側が担保していてこちらはテストしなくてもいいような箇所までテストを書くのは効果的とは言えません。(もちろん全面的にサードパーティ製のライブラリを信用することは問題ですが)

テストは大事ですが、テストを書く時間/保守する時間もコストになります。プロダクトのコアバリューの箇所や、仕様変更が多くて壊れやすい箇所など、テストすべき箇所にまずは集中するようにしましょう。

## hotfixの後にテストを追加する

いくらテストで気をつけても本番環境でバグは起こるものです。そしてバグが発生した場合のhotfixでは、テストを用意する時間的猶予がないことも少なくありません。
しかしこのまま放置してしまうと同じ箇所でバグが再発するリスクが残っているので、hotfixリリースの後でもいいので忘れず新たなテストケースを追加するようにしましょう。

## 参考にしたもの
* [これであなたもテスト駆動開発マスター！？和田卓人さんがテスト駆動開発問題を解答コード使いながら解説します～現在時刻が関わるテストから、テスト容易性設計を学ぶ #tdd｜CodeIQ MAGAZINE](https://codeiq.jp/magazine/2013/11/1475/)
* [テストを書くときに気をつけていること - m_nakamura145’s diary](http://m-nakamura145.hatenablog.com/entry/2016/12/08/075742)
ハードウェアとの連携 

[Node-RED Advent Calendar 2017](https://qiita.com/advent-calendar/2017/nodered) 8日目の記事です。
この記事を書いた私は組み込みソフトのエンジニアで、Webサービスやスクリプト言語には詳しくありません。もし間違ったことを書いていた場合はご指摘ください。

#ハードウェアとNode-REDの連携
Web上またはローカルマシン上で動作するNode-REDと実物のハードウェアを連携させるには、さまざまな方法があると思いますが、ここでは[Milkcocoa](https://mlkcca.com/)を使った例を紹介します。
Milkcocoaはリアルタイムにデータのやり取りができるBaaSですが、Node-REDにもノードがありますし、今回題材としたMbedにも私が作った[ライブラリ](https://os.mbed.com/components/Milkcocoa/)があります。
リアルタイム且つインターネット経由でデータのやり取りができるので、最適だと思いました。
（自社のサービスなので、推してるわけではありませんｗ）

#作ったもの
10月末に社内でハロウィンパーティーがあったので、ドラキュラに仮装したマントにLEDテープを取り付け、Twitterのリツイート数に応じて点灯していくというものを作りました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/74bfb123-6905-359e-fb33-4513d3785bf6.png)

設定したハッシュタグ付きのツイートをすれば点灯するLEDがどんどん増えていく様になっています。
反応を楽しみにツイートしてもらえば、イベントの情報拡散にもなります。

#仕組み
###ハードウェア側
使ったのは[mbed LPC1768](https://os.mbed.com/platforms/mbed-LPC1768/)と私が設計して、[ランニングエレクトロニクス](http://www.runele.com/)で製造販売されている[JKsoft Blue mbed Board](http://www.runele.com/ca3/32/p-r-s/)です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/292895ca-c617-bd6a-8733-85ee5f1acea2.png)

[JKsoft Blue mbed Board](http://www.runele.com/ca3/32/p-r-s/)はテープLEDの駆動回路とバッテリー用の昇圧回路等などが搭載されているので、用途にちょうど合いました。（自分が設計したものなので、合わせてるんですがｗ）
有線LANのインターフェースしかないので、[有線LAN－無線LANコンバータ](https://www.amazon.co.jp/BUFFALO-11n-300Mbps-%E7%B0%A1%E5%8D%98%E7%84%A1%E7%B7%9ALAN%E5%AD%90%E6%A9%9F-WLI-UTX-AG300/dp/B008MRUINC/ref=sr_1_1?ie=UTF8&qid=1512656621&sr=8-1&keywords=%E7%84%A1%E7%B7%9ALAN+%E3%82%B3%E3%83%B3%E3%83%90%E3%83%BC%E3%82%BF)を使ってます。そのUSBの電源は[JKsoft Blue mbed Board](http://www.runele.com/ca3/32/p-r-s/)のUSBコネクタから取れるようになっています。
ハード側のコードは要望があれば公開しますが、[Milkcocoaのライブラリ](https://os.mbed.com/components/Milkcocoa/)を使ってMilkcocoaの通知があったら変数をカウントアップして、その値で[JKsoft Blue mbed Boardのライブラリ](https://os.mbed.com/components/Jksoft-Expansion-Board/)LEDを点灯する数を決めているだけです。

###Node-RED側
こちらもシンプルです。次のフローになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/b4eb44fc-7ba6-118e-99eb-38dc24b11e44.png)
Twitterノードをハッシュタグ付きツイートがトリガになるように設定して、Milkcocoaノードに入れられるJSONデータに変換してるだけです。
Twitter側の情報はトリガだけしかいらないので、JSONのデータは固定の値を作るようにFunctionノードに数行書いてあるだけです。

#最後に
冒頭にも書きましたが、Webサービスやスクリプト言語には詳しくありません。
しかし、Node-REDを使うと繋ぐだけで簡単に作ることができました。
もし2年前の自分にコードを書く時のアドバイスするとしたら


こんにちは。リブセンスでエンジニアをしている[fkm_y](https://qiita.com/fkm_y)です。

もし2年前にWeb業界へ入ったばかりの自分へコードを書くときのアドバイスをするとしたら…要領の悪い私へ最低限これくらいは指摘受ける前に出来ててほしいなと思うことを書いてみました。

## メソッドの役割は１つにしよう
例えば1つのメソッド内で作成と削除など複数の役割を与えると複雑になってしまいます。複雑になってしまうと変更がしにくく、再利用もしにくいコードとなってしまいます。また何の役割のメソッドなのか定義するのも難しくなってしまいます。

## 変数やメソッドには正しい名前を付けよう
極端ですが`update_xxx`と書いてあるのに削除されているととても読みにくいです。名前の通りの処理になっていれば読みやすく、機能の拡張やバグ修正がとてもしやすいです。

## YAGNIを意識しよう
YAGNIは"You ain't gonna need it"の略で「必要になってから作る」的な意味です。
よくシステムを作っている将来的にはこういう機能も必要になるかもしれないと推測で機能を作ろうとすることがありますが、そもそも使われない可能性もありますしコードの複雑度が上がってしまいます。必要になるかもと推測で作る機能よりも今必要な機能のクオリティを上げるようにしましょう。

## N+1問題に気をつけよう
N+1問題とは1(親テーブル)+N(子テーブル)件のクエリが発行されてしまい、パフォーマンスを著しく落としてしまう問題です。クエリの発行回数を抑えるには事前にデータをロードしておけば対応することも出来ます。
慣れるまでは発行されるクエリのlogを視て確認するか、[bullet](https://github.com/flyerhzm/bullet)gemを使ってN+1を検知するようにしましょう。

## 例外を意識しよう
接続エラーやnullなどの不正な値が送られてくるケースを考慮しよう。
コードを書いてる時には正しいデータを想定しがちだけど、思いの外おかしなデータが渡されてきます。
その際におかしな挙動をさせないためにも例外処理を書いて場合によってはシステムを止めるようにしよう。不正な値でシステムを正常終了させて不正な結果を返しても良いことはありません。
また例外発生時のメッセージは具体的に書き、エラー発見者がアクションできる情報を書きましょう。「例外が発生しました」だけとかは本当に止めましょう。原因調査、影響調査に時間が掛かってしまいます。

## 公式ドキュメントを読もう
ついついその場しのぎのハウツー記事を読んでしまいがちですが、公式ドキュメントを読みましょう。ハウツー系の記事は情報が古いなどで正しくない可能性もあります。必死になって探していた情報が公式情報に記載されていたなんてこともあるので公式ドキュメントを読むようにしましょう。
bitzenyをUbuntuで採掘

## 環境
Ubuntu 16.04 LTS
## インストール手順
* まずは

```
# sudo apt update
# sudo apt upgrade
```

* gitからダウンロード

```
# git clone https://github.com/bitzeny/cpuminer.git
```

* 必要なパッケージのインストール

```
# sudo apt-get install gcc libcurl4-openssl-dev gcc-mingw-w64 automake  make
```

* Minerのインストール

```
# ./autogen.sh
# ./configure CFLAGS="-O3 -march=native -funroll-loops -fomit-frame-pointer"
# make
```

* Minerを実行

```
# ./minerd -a yescrypt -o stratum+tcp://jp.lapool.me:3014 -u 登録したユーザー名.user -p password
```

※-t オプションでコア数を指定できます．

* 確認

LA BitZeny PoolのDashBoardのMy Hashrateを見て，数字が出ていれば実行できています．
AIX IPアドレス変更手順

# はじめに
AIXのsmitを使用した、IPアドレスとサブネットマスクの変更手順を説明する。

***

# 手順
(1)smit起動

```
#smitty chinet
```

(2)変更対象のネットワーク・インターフェースを選択

(3)標準イーサネット・インタフーフェースの変更/表示　画面が表示される。
ここでIPアドレス、サブネットマスクなどを変更する。

```
フィールドの値を入力または選択してください。
変更を完了したらENTERキーを押してください。

ネットワーク・インターフェース名　　　　　　enX
インターネット・アドレス(ドット10進数)　　　[192.xxx.xxx.xx]　⇒IPアドレス
ネットワーク・マスク(16進数かドット10進数)　[255.255.255.0]　 ⇒サブネットマスク
現在の状態　　　　　　　　　　　　　　　　　up
（以下省略）
```

(4)Enter押下で、変更される。

***

#変更後確認
以下のコマンドで、IPアドレスとサブネットマスクが正しく設定されていることを確認する。

```
#ifconfig -a
enX  ～～～～ inet 192.xxx.xxx.xx　netmask 0xffffff00
```

***

#こぼれ話
TeratermなどでtelnetやsshでつないでIPアドレス変更すると、変更した瞬間につながらなくなるので再接続必要（当たり前）。

以上。
PythonからRのCSPADEを使ってみる

「**Pythonで系列パターンマイニング**」を行うのにRのCSPADEを使った手順をまとめる。  そもそもPythonのライブラリでパターンマイニングを行える物があればそれを使えばいいのだが、見つけることができなかったため、Rのライブラリを利用したというのが本音。

# 環境
- MacBook Pro13
- macOS Sierra(10.12.6)
- メモリ 8GB

# Pythonのインストール
https://qiita.com/shizuma/items/027167c6257f1c9d2a6f
を参考にインストール

# Rのインストール
https://qiita.com/azzeten/items/1031c788ed093d3b3946
を参考にインストール

# PypeRのインストール
今回はPythonとRの連携を考えるため、PythonからRを利用するPypeRをインストールする。
インストールに関してはhttps://qiita.com/ynakayama/items/f84dc659f1337d71dd9e
などを参考にした。

# 系列パターンマイニングとは
系列パターンマイニングは、ある時系列に沿った系列データの中から共通のパターンを見つけ出す手法です。例えば、[A, B, C, D, E, F, G, H, I, J]という10個のアイテムがあるとする。この10個のアイテムが4人の人に時系列に沿って次のように購入されたケースを考える。

1. A → B → D → H → I → D
2. B → H → A
3. C → B → H
4. D → B → B → H

矢印(→)が時間の経過を示す。この４人の購買履歴から共通のパターンを見出すのが系列パターンマイニングになります。この例だと、４人全員の購買履歴に「**B → H**」というパターンが含まれていることがすぐに分かる。つまり「**Bを購入した人はその後(直後とは限らない)にHを購入するらしい**」と言える事になります。

この記事では、アルゴリズムの詳細については触れないが、代表的な系列パターンマイニングのアルゴリズムとして「**SPADE**」がある。SPADEをRで実装したものが今回利用する「**CSPADE**」です。CSPADEはRのライブラリである「**arulesSequences**」に含まれている。

# Rのライブラリの準備
##### Rのライブラリ「arules」, 「arulesSequences」のインストール

```
> install.packages("arules")
> install.packages("arulesSequences")
```

##### インプットファイルの作成
CSPADEを動かすためには当然インプットファイルが必要となる。インプットファイルは次のような形をしている必要があり、/usr/local/lib/R/site-library/arulesSequences/misc/にtextファイルでおいておけば良い。(ここである必要はないと思うが、正確に理解できていない)

```
# input.txt

1 10 2 C D
1 15 3 A B C
1 20 3 A B F
1 25 4 A C D F
2 15 3 A B F
2 20 1 E
3 10 3 A B F
4 10 3 D G H
4 20 2 B F
4 25 3 A G H
```

まずいちばん左のカラムの番号はシーケンスIDと呼ばれるもので、上の例で言うところの各人に当たる。左から二番目のカラムは実施した時刻(時系列を区別するラベル)であり、値に意味はない。三番めのカラムは同時に購入したアイテムの数である。つまり一番上の行は、『**「１」という人が、「10」という時系列に「CとD」を二つ同時に購入した**』ということを意味する。

参考 : https://en.wikibooks.org/wiki/Data_Mining_Algorithms_In_R/Sequence_Mining/SPADE

# RとPythonコード

- PythonからRを呼び出すプログラム

```Python

import pandas as pd
import pypeR

def runningR(fileName):
    
    #Rのインスタンスを作る
    r = pyper.R(use_pandas='True')

    r.assign("fileName", fileName) #fileNameとし引数のfileNameを渡す
    r("source(file='Pattern.R')") #実際のRファイルを実行する

    df = pd.DataFrame(r.get("results")) #結果をDataFrameに格納
    print(df)

if __name__ == '__main__':

    runningR("input.txt")

```

- CSPADEの実行プログラム(R)

```R
#Pattern.R

#ライブラリの宣言
library(Matrix)
library(arules)
library(arulesSequences)


x <- read_baskets(con = system.file("misc", fileName, package = "arulesSequences"), info = c("sequenceID","eventID","SIZE"))
as(x, "data.frame")
s1 <- cspade(x, parameter = list(support = 0.5), control = list(verbose = TRUE))
summary(s1)
results = as(s1, "data.frame")
```


# 参考文献
SPADE : https://link.springer.com/content/pdf/10.1023/A:1007652502315.pdf
ASP.NET Core 2.0 実行時 IP及びポートを指定する

## 概要

VisualStudio for Macで ASP.NET Core 2.0 のWebApiを作成しています。
VisualStudioから実行した場合、及び ターミナルからdotnet run した場合、デフォルトでは
**localhost:5000**
で起動します。
実行するURLを変える方法を調べました。

## 結論

以下のようにProgram.csを修正する

```Program.cs
using System.IO;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace ksHotelWeb
{
    public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args)
        {
            return WebHost
                .CreateDefaultBuilder(args)
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseUrls("http://192.168.xx.xx:8080")
                .UseStartup<Startup>()
                .Build();
        }
    }
}
```

## 失敗談

### プロジェクトの設定を修正（失敗）
<img width="674" alt="オプション.png" src="https://qiita-image-store.s3.amazonaws.com/0/111283/e70ddc84-2d64-6b76-9354-f480ebb51b4b.png">
※ 変わりません

### Properties/launchSettings.jsonを修正(失敗)

```launchSettings.json
{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:55556/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "api/values",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "Sample": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "api/values",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:5000/"
    }
  }
}
```
※変わりません

dotnet runにて urlsを指定する記事も見かけますが、変化なし。
情報処理技術者試験に向けて【ネットワークスペシャリスト編】

# はじめに
HAL東京高度情報処理学科３年のminakawaです。
前回の「[情報処理技術者試験に向けて【応用情報技術者編】](https://qiita.com/minakawa-daiki/items/c0a5410c43f76e32d12c)」に続いて今回はネットワークスペシャリスト試験にフォーカスを当てて記事を書きたいと思います。
今回で資格に関する記事は最後の予定です。

# ネットワークスペシャリスト試験について
ネットワークスペシャリストの対象者像は以下の通りです。

> 高度IT人材として確立した専門分野をもち、ネットワークに関係する固有技術を活用し、最適な情報システム基盤の企画・要件定義・開発・運用・保守において中心的な役割を果たすとともに、固有技術の専門家として、情報システムの企画・要件定義・開発・運用・保守への技術支援を行う者

難しく書かれていますが、ネットワークに関する知識が豊富である人を対象としていることは読み取れると思います。
午後問題はもちろん記述式なのですが、レベル４の試験から午前Ⅰ,午前Ⅱ,午後Ⅰ,午後Ⅱと４つ試験を受けなければいけないので、これまで以上に**体力勝負**になるテストです。
特に午後Ⅱは問１つに対して２時間設けられているので、応用情報技術者試験を受けたあとだと驚くかもしれません。
本試験は年に一回（秋）に行われるので、チャンスは**年に一回**となります。
自分は春に応用情報技術者を取得し、秋にセキュリティスペシャリスト試験を受験するか、ネットワークスペシャリスト試験を受験するか悩みましたが、学校の授業にネットワークがあったので選んだ感じです。
H28の実績は18,096名の応募に対して合格率は15.4％となっています。

## 試験時間・出題形式・出題数（解答数）
||午前Ⅰ|午前Ⅱ|午後Ⅰ|午後Ⅱ|
|:-:|:-:|:-:|:-:|:-:|
|試験時間|9:30～10:20(50分)|10:50～11:30(40分)|12:30～14:00(90分)|14:30～16:30(120分)|
|出題形式|多肢選択式（四肢択一）|多肢選択式（四肢択一）|記述式|記述式|
|出題数|30問|25問|3問|2問|
|回答数|30問|25問|2問|1問|

全ての試験で60点以上で合格です。
特に午後の問題に関しては問題数は少ないながらも、それぞれの問題がとても重たくなっているので、しっかりと知識をつけてから挑まないと撃沈すると思います。
早めに午前対策を終わらせて、午後問題の勉強に重点を置きましょう。

# 筆者の勉強期間と点数
前回の応用技術者試験合格が分かった日から勉強を始めましたので、４ヶ月ほどとなっています。
ほぼ毎日勉強していた記憶があります。ネットワーク機器を持っていなく実機で試すということができず、なかなか苦戦しましたが、本をひたすら読み、問題をたくさん解いて合格に近づけました。
ですが、ネットワーク機器に触れられるのであれば絶対に触れておくべきです。仮想化やサーバを自分で立ててみたりして、実際に手を動かした方が知識の定着はあると思います。自分ができなくて辛かったからこそ、これから受験を考えている人には実践して欲しいと思っています。

受験回はH28で、点数は午前IIが「88.00点」午後Ⅰが「72.00点」午後IIが「71.00点」でした。(午前Ⅰは免除)

# 勉強方法
スペシャリスト（レベル４）の試験となると、生半可な覚悟じゃ合格できないと感じ、かなり勉強した記憶があります。
ネットワークスペシャリストは特に覚えることが多いと言われている資格なので、どれだけ勉強したかが直接関わってくると思います。
今振り返ってみると自分の勉強方法はお勧めできません。実践なしでひたすら座学のみで合格したせいもあってか、知識はあるのですが、**実践能力に欠けています**。
実際に様々なネットワーク機器に触って、実際の動きを確認するフェーズは絶対にあった方が良いです。

また、午後Ⅱの試験についてはとにかくたくさん問題を解くことをお勧めします。私自身、初めてレベル４の午後Ⅱの問題を解いた時は全く点数が取れずくじけそうになりましたが、**継続は力なり**ってことです。

## 使用した参考書・問題集と期間
ネットワークスペシャリスト試験で使用した参考書と期間は以下の通りです。
※期間はかすかな記憶をたどり書いたものなのであくまで参考程度で。

- **マスタリングTCP/IP 入門編 (専門分野シリーズ)**  
学校で購入した本なのですが、とても良い本です。おすすめです。（期間：1か月目～4か月目）
- **徹底攻略 ネットワークスペシャリスト教科書**  
参考書は一冊しっかりとやりきりましょう。（期間：1か月目～2か月目）
- **要点早わかり ネットワークスペシャリスト ポケット攻略本**  
いつでも勉強できるように、持ち運びやすい本を一冊買いました。（期間：2か月目～4か月目）
- **応用情報技術者過去問道場**  
午前問題はここの問題すべてを解き、定着させました。（期間：2か月目）
- **ネットワークスペシャリスト「専門知識+午後問題」の重点対策 (専門分野シリーズ)**  
この一冊をじっくり時間かけて全て解き終えました。とても濃密です。（期間：3か月目～4か月目）

# 今、ネットワークスペシャリスト試験を振り返ってみて
ネスぺを勉強していた期間はあまり他のことができなかった印象があります。
4ヶ月で一発合格を目指すとなると中々覚悟がいる試験でした。
おかげさまでネットワークに関する基礎知識はしっかりと身についたと感じています。今後に活かせるのではないかと思っています。

# おわりに
スペシャリスト系（レベル４）の資格はとても勉強が必要だと痛感しました。
応用情報技術者までとは異なり、かなり奥深くまで掘り下げられ、体力も相当使います。
ネットワークに自信がある人はぜひ受けてみてはいかがでしょうか。

ホームページ:[https://minakawadaiki.com](https://minakawadaiki.com)