OmniAICreator/Qiita-1.07M huggingface dataset:
Vue / Vuetify / Jest での開発環境構築

vue cli はバージョン3.0.1 です。
簡単なメモとして書こうと思っていたのですが、Jest のテストがいきなりコケるという試練にあいまして、結構長いことハマりましたので、その点も書いておきます。

それさえなければ、とても簡単です。

### vue プロジェクトの作成

```bash
vue create my-app
```
`Manually` を選択すると、後ほどの Jest プラグインのインストールも、質問に答えていくだけで設定できますし、Vuex や VueRouter も同時に導入できたりします。
ここでは簡単に `default` を選択しました。

```
? Please pick a preset: (Use arrow keys)
❯ default (babel, eslint)
  Manually select features
```
### vuetify のインストール

非常に簡単です。

```bash
cd my-app
vue add vuetify
```

ここで、スケルトンアプリを表示できます。すでに Material テーマのアプリができています。

```bash
yarn serve
```

### jest プラグインのインストール

```bash
vue add @vue/unit-jest
```

これも簡単です。純正プラグインのリストは
[vue-cli/packages/@vue at dev · vuejs/vue-cli · GitHub](https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue)
にありまして、そこの下に `cli-plugin-<hoge>` とならんでるものがプラグインで、`<hoge>` のところを指定するとインストールできるんですね。


### テスト実行

```bash
yarn test:unit
```
さっそくテストを実行してみます。サンプルのテストケースが書かれているので、グリーンがでるはずです。
でも、コケる

```
yarn test:unit v0.23.4
$ vue-cli-service test:unit
 FAIL  tests/unit/example.spec.js
  ● Test suite failed to run

    Jest encountered an unexpected token

    This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain JavaScript.

    By default, if Jest sees a Babel config, it will use that to transform your files, ignoring "node_modules".

    Here's what you can do:
     • To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
     • If you need a custom transformation specify a "transform" option in your config.
     • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.

    You'll find more details and examples of these config options in the docs:
    https://jestjs.io/docs/en/configuration.html

    Details:

    /Users/sunvisor/myProjects/my-app/tests/unit/example.spec.js:1
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){import { shallowMount } from '@vue/test-utils';
                                                                                                    ^

    SyntaxError: Unexpected token {

      at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:403:17)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        5.055s
```

これは vue-cli のバージョンアップとかででなくなるかもしれません。
どうも、過去何度も出ているみたいなんですよね。
npm の cache をクリアしたり、nodo-modules 削除して yarn install やり直したり、いろいろやっても通らなかったんですが、次の issue に当たりまして、

[Default unit tests are failing · Issue #1879 · vuejs/vue-cli · GitHub](https://github.com/vuejs/vue-cli/issues/1879)


> I had the same issue with version 23.0.1 and I solved it using version 23.4.0.

その記述を参考にして、次を実行したら通るようになりました。

```
yarn upgrade babel-jest@23.4.0
```

ちなみに `vue create` した直後のバージョンは 23.0.1 でした。

これで最初のテストも通り、めでたく Vue + Vuetify での開発を始められます。
ascii’ codec can’t encode character ~~~~~~エラーへの対処法

##文字コードエラーの際にすべきこと
 

```ruby:command
#vimを利用して変更可能にする
$vi .bash_profile
"""""""
軽くvimの使い方も
"o"=>記述可能にする
"""""
#記述可能にした後に以下を記述
export LC_ALL=en_US.UTF-8
"""""
":wq"=>保存してvimを終了する。
":q"=>変更しない場合にvimを終了する。
"""""
```

#少しでも役に立てればと！

###大変分かりやすかった参照
-https://tokyo-engineer.com/python3_ascii_codec_cant_encode_character/
Botkitのスクラッチ構築テンプレ

スクラッチでBotkitの構築するテンプレを毎回忘れるので記録しておく

## Slack Botを用意

Customize Slack > Configure apps > Custom Integrations > Bots

![スクリーンショット_2018-09-15_18_01_47.png](https://qiita-image-store.s3.amazonaws.com/0/52227/96bf014a-f950-189b-e4f0-f8c67273644e.png)

今回のbot名は`botkit`としておいた

## Botkitをインストール

```
npm i -S botkit
```

## スクリプト

```js:index.js
var Botkit = require('botkit');

const controller = Botkit.slackbot({
  debug: false,
  retry: Infinity //https://botkit.ai/docs/readme-slack.html#botkitslackbot
});

controller.spawn({
  token: "xoxb-から始まるトークン"
}).startRTM(function (err) {
  if (err) {
    throw new Error(err);
  }
});

/**
 * RTM APIのイベント
 * これがないと「Error: Stale RTM connection, closing RTM」というエラーになる
 */
controller.on('rtm_open', (bot, message) => {
  console.info('** The RTM api just connected!')
})
controller.on('rtm_close', (bot, message) => {
  console.info('** The RTM api just closed')
})

// メッセージ反応処理 helloというダイレクトメッセージに応答する
controller.hears('hello', 'direct_message', function (bot, message) {
  console.log(message.text)
  bot.reply(message, 'Hello yourself!');
});
```

今回はダイレクトメッセージにしか反応しないが、以下のイベントを登録しておけば会話にも反応するようになる。
https://botkit.ai/docs/readme-slack.html#event-list


## 起動
```
node index.js
```

## 動作確認

SlackからDirect Messagesで「hello」と話しかけてみる

もしくはSlackコマンド `/dm @botkit hello`

`Hello yourself!`と返事がくるはず

![スクリーンショット 2018-09-15 18.17.25.png](https://qiita-image-store.s3.amazonaws.com/0/52227/73f31496-f426-aa9b-13bf-d7c4fda9a538.png)

## 参考リンク
- howdyai/botkit: Botkit is the leading developer tool for building chat bots, apps and custom integrations for major messaging platforms. https://github.com/howdyai/botkit
- Botkit and Slack | Botkit Documentation https://botkit.ai/docs/readme-slack.html
at coder beginner 009

僕の今の実力的にひたすらB問題をやるのが丸い気がしたのでそうすることに決定

B
私は富豪だ。それも大富豪と言っていいぐらいお金を持っている。欲しいと思ったものはまずこの有り余るお金を使って買うことができる。しかし、この底の尽きないように思えるほどのお金でさえ人の心を買うことはできない。いくらお金があろうとも、ひとたび多くの庶民の反発を買ってしまえば、これまでのように生きていくことは難しくなるだろう。
この度私は庶民の気持ちを理解するため、初めてファミリーレストランという場所を訪れた。メニューを広げ、料理の内容とその金額を確かめると、なるほど驚きの安さである。どの料理の金額も取るに足らないようなものだから、とりあえず最も金額が高いものを選ぼうかと考えた。
しかし、考えてみれば、私は何のためにファミリーレストランに来たのであったか。庶民の気持ちを理解しようというのに、金額のことを考えずに最も高いものを選ぼうなどと、まるで意味がないではないか。ファミリーレストランに来たうえ、これ見よがしに最も高い料理を注文したとなったら、私の悪評が広まってしまう可能性だってある。
とはいえ、せっかくだから高いものを選んでその味をみてみたいというのも確かである。そうだ、そういうことなら、この店で 2 番目に高い料理を注文することにしよう。そう思って料理の金額を書き出してみたが、料理の種類が多いために 2 番目に高いものを探すのはなかなか骨が折れる。自分で探すかわりに、プログラムを書いてなんとかできないだろうか？
おっと、プログラムを書き始める前にひとつ言っておくが、最も高い金額の料理が複数あるときには注意してもらいたい。というのは、たとえば 4 種類の料理があり、それぞれの金額が 100 円、200 円、300 円、300 円であったときには、2 番目に高いものというのは 200 円の料理になるということだ。
問題文が無駄に長い

```
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
	int N;
	int S[110];
	cin >> N;
	for (int i = 0; i < N; ++i) {
		cin >> S[i];
	}
	sort(S, S + N, greater<int>());
	for (int i = 0; i < N; ++i) {
		if (S[i] != S[i + 1]) {
			cout << S[i + 1];
			break;
		}
	}
	return 0;
}
```
WAになるんだけど？なんで？意味わからん

```
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int N;
int main() {
	int n, input;
	cin >> n;
	vector<int>A;
	for (int i = 0; i < n; ++i) {
		cin >> input;
		A.push_back(input);
	}
	sort(A.begin(), A.end());
	unique(A.begin(), A.end());
	cout << A[1] << endl;
	return 0;
}
```
これもはねられた。どこがちがうんやろ？
ValidationMessages.propertiesはクラスパス上に複数あるとダメだよ

Bean Validation(以降「BV」)のメッセージ（Hibernate Validator(以降「HV」)などのプロバイダーが提供するデフォルトメッセージ）は、クラスパス直下に`ValidationMessages.properties`（リソースバンドルなので言語毎のファイル）を作成することで変更することができます。

例えば・・・プロバイダとしてHVを利用すると、`@Size`(VB提供の制約アノテーション)と`@Length`(HV提供の制約アノテーション)のデフォルトメッセージは以下の通りです。

```properties:HVのjarファイル内にあるメッセージ定義
javax.validation.constraints.Size.message = size must be between {min} and {max}
org.hibernate.validator.constraints.Length.message = length must be between {min} and {max}
```

このメッセージを変更する場合は・・・

```properties:src/main/resources/ValidationMessages.properties
javax.validation.constraints.Size.message = 'Size' must be between {min} and {max}.
org.hibernate.validator.constraints.Length.message = 'Length' must be between {min} and {max}.
```

とすれば任意のメッセージに変更できます。


# 複数の`ValidationMessages.properties`がある状況って？

では、複数の`ValidationMessages.properties`がある状況って・・・具体的にはどんなときなのでしょうか？私が関わった案件では、以下の２つのパターンで`ValidationMessages.properties`が存在する状況が生まれました。

* ライブラリとして独自のバリデータを作成しJarファイルの中に`ValidationMessages.properties`を格納（してしまった）
* マルチモジュール構成のプロジェクトで、各モジュール内に`ValidationMessages.properties`を格納（してしまった）

# BVの仕様的に複数ファイルはサポートしている？

私がBVの仕様書をざっと見た範囲では、複数ファイルについて言及されてなかったので、標準仕様としては複数ファイルをサポートしていない思われます。（英語弱いので読みとしている可能性はあります・・・）

# 複数あるとどうなるの？

細かい動きはおさえていませんが・・・プロバイダとしてHVを使用すると、いずれか１つのファイルが有効になります。おそらくクラスパスの優先が高いところにあるファイルが使われると思われますが、Webアプリケーション(war)のlibにあるjarファイルのような優先順が明示的に指定できない場合は、アプリケーションサーバの実装などによって有効になるファイルがかわることも予想されます。
↓
結果として、有効にならなかったファイルに指定したメッセージを前提にしているところで想定したメッセージがでなくなります（→つまりバグります）。

# BV仕様準拠の対策

BV仕様準拠にこだわる場合は、ライブラリやサブモジュール内の`ValidationMessages.properties`を削除し、アプリケーション実行時のクラスパス上に`ValidationMessages.properties`が１つになるように制御してください。

# HVの機能を使った対策

BV仕様準拠にこだわりがなく＋HV上で使うことを前提としている場合は、[HV独自のメッセージ定義の読み込み機能の仕組み](https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/?v=6.0#_constraint_definitions_via_code_serviceloader_code)を使うことができます。
具体的には・・・ライブラリやサブモジュールのJarファイルの直下には`ValidationMessages.properties`ではなく、`ContributorValidationMessages.properties`を格納するように変更してください。こうすることで、HVがクラスパス上に存在する全ての`ContributorValidationMessages.properties`を読み込んでメッセージを構築してくれるようになります。

HVを使う場合のメッセージ定義の優先順（優先度が高い順に）を整理すると・・・・

* クラスパス直下の`ValidationMessages.properties` (複数あると1ファイルのみ有効)
* クラスパス直下の`ContributorValidationMessages.properties` (全ファイル有効)
* クラスパス上の`org/hibernate/validator/ValidationMessages.properteis`(HV提供のデフォルトのメッセージ定義ファイル)

となります。

# 検証アプリ

* https://github.com/kazuki43zoo/hv-multi-module-demo

# まとめ

HV上での使用を前提としたライブラリであれば、デフォルトメッセージは`ContributorValidationMessages.properties`に定義して配布するのが良さそう。仮にHV以外のプロバイダ上で使っても悪さしないはずだし・・・。
【iOS 高速グローバル化】 Swift・Storyboard ファイルに散りばめられた日本語探索術

# はじめに
ダブルクォーテーションで囲まれた文字列が Swift・Storyboard ファイルのいたるところに散りばめられたアプリを一度は作ったことがあるのではないでしょうか？それがグローバル化が決まった大きなプロジェクトだったら…

# 方針
Swift・Storyboard ファイルから取り出す箇所の総数がわからなければ工数見積やチームでの役割分担も非常に困難です。そこで、おおよその修正対象箇所を Shell で探し出すことにします。

# Shell
今回のサンプルコマンドは zsh で実行確認をしたものになります。実行結果はテキストファイルとして出力するようにしています。
※あくまでもサンプルということで参考程度に見ていただければと思います。

# 文字列探索
特徴はダブルクォーテーションで囲まれているということ。これを利用して探索します。

```sh
find . -type d -name Gens -prune -o -type d -name Debug -prune -o -type f -name "*.swift" -print | xargs grep -n "" -po '(?<=")[^",]+(?=")' | grep '"' | grep -v '\["' | grep -v '""'  > ~/Downloads/memo.txt
```

`-type d -name Gens -prune -o` で `Gens` ディレクトリを検索対象から除外しています。 また、 `-type f -name "*.swift"` で Swift ファイルを検索対象のファイルに指定しています。
`grep -n "" -po '(?<=")[^",]+(?=")' | grep '"'` で文字列であるかの判定を行います。また、 `grep -v '\["' | grep -v '""'` でAPI周りの記述と空文字部分を判定して排除しています。ココで注意なのが、 `["日本", "アメリカ", "中国"]` といった記述が排除されてしまうため、このような記述がある可能性がある場合は ``grep -v '\["'` を除いて実行するようにしましょう。

# 日本語の文字列探索
先程よりも条件を多くしてみます。

```sh
find . -type d -name Gens -prune -o -type d -name Debug -prune -o -type f -name "*.swift" -print | xargs grep -n "" -po '(?<=")[^",]+(?=")' | grep '"' | grep -v '\["' | grep -v '""' | grep '[亜-熙ぁ-んァ-ヶ]' > ~/Downloads/memo.txt
```

追加されたのは `grep '[亜-熙ぁ-んァ-ヶ]'` だけです。漢字・ひらがな・カタカナを判定しています。ココで注意なのが、日本語設定でも半角表記される「OK」などが排除されてしまうため、先程の探索方法と合わせて利用すると良いでしょう。また、API 周りは日本語というフィルタで排除されるので `grep -v '\["'` は取り除いたほうがいいかもしれません。

# Storyboard Version
上記の処理を応用すると簡単に実現できます。

```sh
find . -type d -name Gens -prune -o -type d -name Debug -prune -o -type f -name "*.storyboard" -print | xargs grep -n "" -po '(?<=")[^",]+(?=")' | grep '"' | grep -v '\["' | grep -v '""' | grep '[亜-熙ぁ-んァ-ヶ]' > ~/Downloads/memo-s.txt
```

変わったのは `-type f -name "*.storyboard"` だけです。 Storyboard の場合は、IDなどもダブルクォーテーションで囲まれた文字列形式で記述されるため、精度はかなり落ちます。 `grep '[亜-熙ぁ-んァ-ヶ]'` で日本語に絞り込まないと探索結果が膨大になるので、半角表記箇所については個別に対応する感じになります。

# 結果
以下のように対象のファイルパスと行数・文字列が列挙されたファイルが生成されます。これを参考に工数見積や役割分担を行いましょう。ただし、漏れている箇所があるかもしれないということを忘れないようにしましょう。

```sh

./Entity/Category.swift:8:private let akkeyTitle = "あっきーのQiita"
./Entity/Category.swift:9:private let akkeyLabTitle = "あっきーラボのQiita"
./Entity/Category.swift:10:private var akkeyLabMessage = "iOSエンジニアの研究所です"
```

```sh
./Classes/Storyboard/Popover.storyboard:29: <string key="content">写真を投稿しました！
./Classes/Storyboard/Popover.storyboard:76: <fragment content="枚">
./Classes/Storyboard/Popover.storyboard:94: <string key="content">登録はこちら
```
border-imageでカラフルな枠を作る【cssのみ】

どこかのページで使われているのを見たのでメモ
# コード
<p data-height="265" data-theme-id="0" data-slug-hash="wExOoK" data-default-tab="css,result" data-user="kodamaworld" data-pen-title="border-image" class="codepen">See the Pen <a href="https://codepen.io/kodamaworld/pen/wExOoK/">border-image</a> by kodamaworld (<a href="https://codepen.io/kodamaworld">@kodamaworld</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## メモ
border-radiusは効かない。
Apacheのチューニングに関して

## Apacheとは

Apacheとは、Apache財団というところが開発した、オープンソースWebサーバソフトウェアで、正式名称は「Apache HTTP Server」。
世界的に普及されているWebサーバで、大手から個人まで幅広く使われているWebサーバーです。私は調べるまで知りませんでした。。。

特徴としては、
１、オープンソースライセンスである（無料だから誰でも使えるよって事）
２、信頼性、安定性が高い（世界的に普及していることがこれを物語っているよね）
３、MPMによってマルチプラットフォームに対応（色々なOSに対応できるよって事）
４、モジュールを用いた機能追加（これはそのままかな）

ざっくりとこんな感じのApacheのチューニング（設定）について調べる機会があったので、備忘録として書きます。



## チューニングについて

Apacheのチューニングは、パフォーマンスを向上させたり、インフラコストの最適化を行う上で重要な事のようです。

また、Apacheはプロセス駆動アーキテクチャでマルチプロセスという駆動方式で、各リクエストをプロセスに割り当てて処理を行うという特徴もあり、リクエストが大量に来た際に、プロセスが同時に起動するので、オーバーヘッドが非常に大きくなるというデメリットがあります。
しかしApacheもこのデメリットを放っておく訳なく、それらを回避する仕組みが備わっているんです。回避する仕組みこそチューニングなのです。

しかし、チューニングはその環境によって変わってくるようなので、色々な記事に乗っている設定値を鵜呑みにして設定しても意味がないという事なので、こういったパラメータがあって、なんの為にあるのか理解すれば、あとは自分の環境と照らし合わせて調節していくだけですね。
私は、色々な記事を読んで設定値を鵜呑みにしようとしている時に指摘され、理解しましたので、ここでも共有という事で書いておきます。


## パラメータ

パラメータは数多く存在し、全てを網羅できないという判断から、私が調べた範囲でしか書きません。
私の解釈も混ざっているので、間違った解釈をしていましたら、ご指摘お願いいたします。


Timeout
・リクエストを受け取ってから処理完了での待ち時間
　デフォルトは、バージョンにより異なる。
　電波悪いとこで、サイトにアクセスした時に、接続できませんでした的な画面が表示されるまでの時間の事。というように解釈。
　あとは、アクセスがめっちゃ集中してるサイトにアクセスした時とかかな。


KeepAlive
・1回のTCP接続で複数のHTTPリクエストを処理する。
　デフォルトはON。


・KeepAliveTimeoutの設定。1つのクライアントが、コネクションを占有できる時間の設定。
　KeepAliveTimeoutデフォルトは、バージョン2.0で15秒、バージョン2.2で5秒。

HostnameLokups
・ログファイルに記録する際に、接続元IPアドレスを逆引きする。
　デフォルトはOFF。
　DNSの逆引きは時間が処理に時間がかかるので、まぁ使わないのかなという印象。
　※DNS逆引きに時間がかかるのは、正引き（ドメイン名からIPアドレスを問い合わせる）を想定して最適化された設計だから。


mod_deflate
・HTTPで圧縮転送を行うモジュール
　適用範囲を指定して、利用する。（テキストコンテンツに適用。画像ファイルには適用しない。）
　圧縮だから、小さくする事で、転送だから、送る事。それを指定する。
　そのままの事書いてますが、理解する上でこのように一個一個分けて考えることは大切なのです。


MaxClients/ServerLimit
・サーバープロセス数の上限。
　プロセス数と最大同時接続数は、ほぼ同じ。
　例：KeepAliveTimeoutが15秒で、MaxClientsが256、その環境に300人接続した場合、256人が最初に処理され、44人は、サーバーのリソースに余裕があったとしても、15秒待たされる事になる。


StartServers
・Apache起動時の子プロセス数
　Apache起動時にまずはここで設定された数の子プロセスを起動する。


MinSpareServers
・待機時の最小子プロセス数。
　子プロセスがMinSpareServersより少なくなったら、この値まで子プロセスを上げる。


MaxSpareServers
・待機時の最大子プロセス数
　子プロセスがMaxSpareServersより大きくなったら、この値まで子プロセスを下げる。


## まとめ


自分の環境にあったチューニングをする。ネットにある、設定値を鵜呑みにしない。
私ももう少し勉強します。
マイグレーションで既存のテーブルにカラムを追加する方法

# マイグレーションファイルの作成

```
bin/cake Migrations create[or bake] マイグレーションファイル名
```


マイグレーションファイル作成と同時に、カラムなどの追加情報をマイグレーションファイルにいれたい場合。

`bin/cake Migrations create(or bake) マイグレーションファイル名 カラム名：型`



# マイグレーションファイルに追加内容を書く

```php
<?php
use Migrations\AbstractMigration;

class AddColumnHogeToHogeHoge extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-change-method
     * @return void
     */
    public function change()
    {
    }
}
```

このようなファイルが作成されるので、changeメソッド内に書いていく。

```php
public function change()
    {
        $table = $this->table('hoge_hoge');
        $table->addColumn('hoge', 'integer', [
            'null' => true,
        ]);
        $table->update();
    }
```

addColumnメソッド内の第一引数に「カラム名」、第二引数に「型」を指定する。

'null' => trueの一文は、そのカラムの情報が入るか不確かな場合、NULLを許可するという意味で、trueにするといいと思います。
確実にこのカラムには、データが入っていないといけない場合は、falseがいいと思います。

他にもこの連想配列の中に文字数制限のlimitや、デフォルト値を指定するdefaultなどいろいろあるので、要件によって指定するといいです。


マイグレーションファイル作成時に、`カラム名：型`を指定すると、メソッド内にこれらの情報が書かれて作成されます。


# マイグレーションの実行

```
bin/cake Migrations migrate
```

実行されたかの確認は、
`bin/cake Migrations status`を入力して、作成したマイグレーションファイルが「up」になっていればOK。
「down」の場合は、適用されていない状態を表す。

マイグレーションファイル作成後に、statusで確認すると、downになっている。

もし、実行後に修正を加えたい場合
`bin/cake migrations rollback`
を入力する事で、一つ前に戻る事が出来る。

rollbackコマンド実行後に、statusコマンドで状態を確認すると、up⇨downになっています。


# まとめ

マイグレーションファイル作成⇨情報（カラム、型など）の追加⇨実行⇨確認
シンボリックリンクってなんだろう？

# はじめに

未経験スタートの見習いエンジニアが、アウトプット、備忘録としてまとめたものです。
不適切な発言、不確かな情報は発信しないつもりですが、足りない点ありましたら、遠慮なくコメントの方から教えて頂けると嬉しく思います。

という事で、シンボリックリンクについて書いて行きたいと思います。


## シンボリックリンクってなんだろう

シンボリックリンクとは


`ファイルに別名を設定し，その別名で基のファイルにアクセスできるようにする「リンク」機能の1つです。` 


別名を設定したファイルを、「シンボリックリンクファイル」と言います。


このシンボリックリンクファイルは、元となるファイルのパスを持っている為、シンボリックリンクファイルにアクセスすると、元となるファイルが表示されます。


元なるファイルと、シンボリックリンクファイルは、別物なので、例えば、シンボリックリンクファイルを削除しても、元のファイルに影響はありません。


もし逆の事、元のファイルを削除した場合は、シンボリックリンクファイルにアクセスしても開く事はできません。


```シンボリックリンクの貼り方.
ln -s ファイルのパス リンクのパス
```


##　なぜシンボリックリンクを貼るんだろう

例えば、開発の環境構築をする際に、仮想環境を用いて環境構築を行ったとします。
仮想環境とホスト環境は別物なので、基本的に、仮想環境下にあるディレクトリや、ファイルには、ホスト側からアクセスする事ができません。


アクセスできないという事は、開発する際に使用するエディタを自由に選択する事ができないですし、仮想環境下で作業をした事が無い方にとっては、不便を感じる点が数多くあるかもしれません。


この問題を解決するのが、シンボリックリンクであり、シンボリックリンクを貼る理由です。

ホスト側からアクセスできるようにする為、仮想環境下にあるファイルやディレクトリに、シンボリックリンクを貼り、ホスト側に、その別名を付けたシンボリックリンクファイルを置く事で、ホスト側からでもアクセスする事ができます。


##追記


`なぜシンボリックリンクを貼るんだろう`で述べましたが、

>仮想環境とホスト環境は別物なので、基本的に、仮想環境下にあるディレクトリや、ファイルには、ホスト側からアクセス>する事ができません。

こちらのコメントを頂きました。

>このような状況は2通り考えられるかと思いますが、どちらの状況でもシンボリックリンクを作成することでは解決しない>気がします。
>1. 仮想環境のファイルシステムがホスト側にはマウントされておらず、アクセスしようにもパスが無い:
>→ シンボリックリンクを作成するにはターゲットのファイルのパスが必要です。つまりパスが無いならば、そもそもシンボリックリンクが作成できません
>2. 何らかの方法で仮想環境のファイルシステムをホスト側にマウントしてあるが、権限の問題でアクセスできない:
>→ シンボリックリンクのアクセス権を変更しても、ターゲットのファイルの権限に変わりはないため、やはりアクセスできません

1,2共に仰る通りで、まずシンボリックリンクを作成するには、`ターゲット`つまり元となるファイルのパスが必要になります。もしその`ターゲット`が存在しない状況で、シンボリックリンクを貼る事自体出来ませんし、私の記述した問題を満たす事はありません。
また、権限に関しても、シンボリックリンクはあくまで、元となる`ターゲット`にアクセスできる為のファイルになります。ですので、例えシンボリックリンクの権限を変更したとしても、`ターゲット`の権限を変更しない限り、私の記述した問題を満たす事はありません。

以上の二つを前提として記載させて頂きましたが、貴重なご意見を頂きましたので、追記という形で記載させて頂きました。
コメントを頂きました@8x9さんありがとうございます。


## まとめ

シンボリックリンクは、機能の一つで、その機能によって生成するファイル（シンボリックリンクファイル）は、元のファイルにアクセスできるんだよーという事です。
Windowsだと、「ショートカット」と解釈してもいいかもしれませんね。
コードでAutoLayoutをやるときの罠

swift4。

```swift
redView.leftAnchor.constraint(equalTo: blueView.trailingAnchor, constant: 0).isActive = true
```
こんな感じで、leftAnchorとtrailingAnchorを組み合わせて制約を作ると実行時に落ちる。
同じように、
rightAnchorとleadingAnchorを組み合わせても落ちる。
leftAnchorを使うときはrightAnchor。
leadingAnchorを使ったときはtrailingAnchorを対にして使おう。

なんだよこの罠中の罠。
誕生日から年齢計算 (golang)

よく使用される **(今日の日付 - 誕生日) / 10000** で年齢を求める方法

```go

func calcAge(t time.Time) (int, error) {
	// 現在日時を数値のみでフォーマット (YYYYMMDD)
	dateFormatOnlyNumber := "20060102" // YYYYMMDD

	now := time.Now().Format(dateFormatOnlyNumber)
	birthday := t.Format(dateFormatOnlyNumber)

	// 日付文字列をそのまま数値化
	nowInt, err := strconv.Atoi(now)
	if err != nil {
		return 0, err
	}
	birthdayInt, err := strconv.Atoi(birthday)
	if err != nil {
		return 0, err
	}

	// (今日の日付 - 誕生日) / 10000 = 年齢
	age := (nowInt - birthdayInt) / 10000
	return age, nil
}
```

環境によっては、intで返すのではなく、 null.Int を返すようにするのも良いかと思います
（DBから取得した誕生日の値がない場合はnullで返すなど）
kubectl の config ファイルのパスを指定する

デフォルトでは `$HOME/.kube/config` を読み込むようになっているが、以下の方法で指定できる。

* `--kubeconfig` フラグ
* 環境変数 `KUBECONFIG`

```
$ kubectl --kubeconfig=/path/to/kubeconfig config get-contexts
$ KUBECONFIG=/path/to/kubeconfig kubectl config get-contexts
```

優先順的には `フラグ > 環境変数 > デフォルト` という順番。
[path.Join](https://golang.org/pkg/path/#Join) を使っているので separator  (Linux/Mac においては `:`) で複数指定することもできるけどまぁ使わないですかね...

実装はこの辺に。
https://github.com/kubernetes/kubernetes/blob/v1.11.3/staging/src/k8s.io/client-go/tools/clientcmd/loader.go
emacs でフォーカス外れた時にオートセーブ

jetbrains 使ってるとセーブがだるくなる。

[Vim のファイルセーブは異常だからやめたい](https://qiita.com/regashia/items/874cd77e083b8ab05151)
の emacs 版。

(focus-autosave-mode)[https://github.com/emacsmirror/focus-autosave-mode] という名前のパッケージでできる。

[Emacs 起動時にパッケージを自動でインストールする方法](https://qiita.com/regashia/items/057b682dd29fbbdadd52)
を使用している場合は、以下のコードを追加するだけでおk。

```elisp
(when (maybe-require-package 'focus-autosave-mode)
  (focus-autosave-mode))
```

※ CUI では動かなかった。
BITで転倒数を求める

# BITとは
Binary Indexed Treeのこと。長さ$N$の数列$(a_n)_{n=0, 1,\cdots, N-1}$を管理するとして、次のことが$O(\log N)で$実現できます。

- $a_i$に$x$を加算
- $\sum_{k=0}^i a_k$を求める

ただし、$i$は$0$から$N-1$の整数、$x$は適当な値とします。

因みに、数列の任意の連続する部分に関する和$a_s+a_{s+1}+\cdots+a_t$も、先頭から第$t$項までの和と第$s-1$項までの和の差として表せるので、BITを使って求めることができます。

# 転倒数とは
数列$(a_n)$について、$i < j$かつ$a_i > a_j$となる組$(i, j)$の個数のこと。反転数と呼ばれることもあるようです。

これをBITを使って求めることを考えましょう。転倒数を求めたい数列を$(a_n)$、BITで管理する数列を$(b_n)$とします。また、$(a_n)$の長さを$N$とします。$(b_n)$の長さについては方針を述べたあとに考えます。

## 気持ち
愚直に求めようとすると、明らかに$O(N^2)$かかります。これで間に合うならループを回して終わりです。ただ、問題中では間に合わないことが多いのでこれを$O(N\log N)$まで落としたいです。

## 方針
さて、転倒数は組$(i, j)$の個数という形で定義されていました。一方を固定して求め、足し上げることを考えます。
つまり、ある$j$に対して$i < j$かつ$a_i > a_j$となる$i$の個数を$t_j$とすると、転倒数は$\sum_j t_j$です。

$t_j$を順に求めていきたいですが、このままだと求めにくいので$i < j$かつ$a_i \leq a_j$となる$i$の個数$t^\prime_j$
をかわりに求めます。$(b_n)$の各項を$0$で初期化して、$j=0$から順に「$b_0$から$b_{a_j}$までの和を$t^\prime_j$とする」→「$b_{a_j}$に1を加算」を繰り返すことで求まります。
（このとき$b_k$は、「$j$回目の操作以前に$a_i=k$となる$i$を何個見たか」という情報を持っていると言えます。したがって、各ステップにおいて$\sum_{k=0}^{a_j} b_k$で$t^\prime_j$が求まると説明できます。）

ここで、$i<j$である$i$は$0,1,\cdots,j-1$の$j$個あることから$t_j=j-t^\prime_j$です。各$j$について$t_j$が求まったので、足し上げて転倒数が得られました。めでたし。

## (b_n)の長さ
上述の内容をそのままやろうとすると数列$(a_n)$の最大値だけの長さが必要になります。しかし、実は$(a_n)$の項どうしの大小比較だけができれば良いので$(a_n)$に出現する値の種類数だけの長さがあれば十分です。これは$N$で上からおさえられます。

$(b_n)$の長さを圧縮する操作は$(a_n)$をコピーしてソートすればできるので、$O(N\log N)$でできます。

## 計算量
「方針」で述べたことを整理すると下の疑似コードのようになります。

ただし、$a_k$が数列$(a_n)$の項のうち小さい方から何番目か（最も小さいものを$0$番目とする）$f(a_k)$としています。$f$の計算は前処理に$O(N\log N)$かければ$O(1)$です。

```
inversion ← 0
for j in [0, N)
    t'_j ← ∑[k=0,f(a[j])](b[k])    // BITを使ってO(log N)
    t_j  ← j - t'_j

    b[f(a[j])] ← b[f(a[j])] + 1

    inversion ← inversion + t_j // BITを使ってO(log N)
end
```

$(b_n)$の長さは$N$以下にできることから、BITの操作が$O(\log N)$になっています。転倒数を求め終わるまでに$O(\log N)$の操作を$N$回繰り返しているので、計算量は確かに$O(N\log N)$になっています。

# おまけ：転倒数とバブルソートのスワップ回数
実は、これらが等しくなることがよくわからなかったので記事を書こうと思ったのですが、気づいてしまえば当たり前だったのでおまけ扱いにしました。

実際、バブルソートのスワップが数列の転倒数と等しくなることは、

- ソートが終わったとき、列の転倒数は$0$である
- $1$回のスワップで転倒数はちょうど$1$だけ減少する

ことから従います。
Design Solution Forum 2018で得たFPGA用高位合成(HLS)実装Tips

# この記事について
先日、Design Solution Forum 2018に行ってきました。僕自身は、FPGAは今年に入ってから独学で始めたばかりで、本業も異なる領域なのですが、色々と面白いお話を聞くことが出来ました。
NECの方が講演の中で、非常に有益な高位合成(HLS)用のノウハウを共有してくれました。この場を借りてお礼申し上げます。
発表資料が公開されていないので、覚えている範囲で本記事にまとめようと思います。

## お願い
本記事の内容は、僕が講演を聞いた中で覚えている内容を記すものです。そのため、間違えがあった場合には、その責任は全て本記事を書いた僕にあります。
もしも間違え、追加がありましたら教えていただけると幸いです。

# Tips
- Deep Learningの実装に関して
	- GPU用の実装とFPGA用の実装では、実装方針が異なる
	- ネットなどに転がっているDeep LeaningやCNNのサンプルコードはGPU用である場合が多いので、そのままFPGA(HLS)で実装しても性能でない or リソース不足になる
		- GPU用コード: データを大きな行列/ベクトル単位で扱い、並列処理で一気に計算。メモリアクセスが多い
		- FPGA用コード: プロセスレベルでのパイプライン化。各層ごとにハードウェア化して、各層がラインバッファを持つようにする。結果、DRAMアクセスではなくFIFO等へのアクセスにできる。また、下手に実装を工夫するよりも、素直にfor文で畳み込み演算を書いた方が速い
		- 注: ここでいう「プロセスレベル」とは、CONVOLUTIONの1層目、CONVOLUTIONの2層目、MAX POOLING、とかの単位だったと思います。「海外勢と日本で言い方が違うんですよね」みたいなことを言っていた気がします。とにかく、演算子レベルで並列化やパイプライン化するよりも、少し大きなプロセスレベルでパイプライン化して、処理単位をラインにして、ラインバッファを使う方が有利、というのが言いたいことだと思います。

- 動作周波数を増やすと回路規模は大きくなる
	- タイミング制約を満たせないときは、開始間隔(II)を1ではなく、2とか3に増やすと解決するかも

- GPUコードはIF文苦手
- FPGAはIF文得意。ただのセレクタで実現できるため
	- そのため、for文の中での打ち切り処理に使うことで高速化ができる
	- 例えば、物体検知処理で、あり得ないくらいスコアが低くなったら途中であきらめるなど

	```c
	for(loop) {
		...処理...
		if (score < threshold) break;
		...処理...
	}
	```

	- 個人的追記: IF文を活用した方がいいとはいえ、ネストしたり複雑になるとハードウェア増加するのでNGだと思う

- FPGA内において、DSP、BRAMは物理的な配置場所があらかじめ決まっている。結果、最後の配置配線でタイミング制約を満たせないことが多々ある。
	- DSP、BRAMの前後にレジスタを入れることで解決できるかも

- ある関数をたくさん使用しているとき、それを高速化のために単にINLINE化してしまうと、その分だけハードウェアが作られてしまい、回路が大きくなってしまう。また、配線も複雑になる。
	- 関数を演算子化して、それを使うようにする
Rails 5 : method = post といっているのに "No route matches [PATCH] "/engineer"" とか言われる不思議


engineer/new.html.erb

```
<%= form_for @engineer, url: url_for(controller: 'engineer', action: 'create', mothod: "post") do |f| %>
   :
  <%= f.submit %>
<% end %>
```
とまで、しているのに、
「更新」ボタンを押しても、下のように [PATCH] "/engineer" エラー

![image.png](https://qiita-image-store.s3.amazonaws.com/0/42407/cd0e71a1-dc29-f918-6a79-3d9384b44f53.png)

ちなみに route.rbは
```
:
resource :engineer
:
```
で、全てを任せています。。

なんかおかしいなと思って、色々探していたら答えは下のページに
http://xengineer.hatenablog.com/entry/2014/10/20/rails%E3%81%AEform_for%E3%81%AFPOST/PATCH%E3%82%92%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%E3%82%8B
→
https://www.railstutorial.org/book/updating_and_deleting_users

```
Since web browsers can’t natively send PATCH requests (as required by the REST conventions from Table 7.1), Rails fakes it with a POST request and a hidden input field.2

There’s another subtlety to address here: the code form_for(@user) in Listing 10.2 is exactly the same as the code in Listing 7.15—so how does Rails know to use a POST request for new users and a PATCH for editing users? The answer is that it is possible to tell whether a user is new or already exists in the database via Active Record’s new_record? boolean method:
```

確かにブラウザから表示されているフォームのソースを見ると下の感じで、hiddenでpatchが定義されている！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/42407/e540bee1-5120-92e7-6a7b-10372748d8b3.png)

## 原因

engineer_controller.rb で定義していたこれが原因

```
	def new
		@engineer=Engineer.new
		@engineer.build_engineer_hiring
		@engineer.build_person_info
		@engineer.office = Office.first
		@engineer.engineer_registration_type_id = EngineerRegistrationType.select(:id).first
	end
```

ちなみに、engineer.rb がこれで、has_one :offcie, through: :engineer_hiringで定義している部分に値を入れるのが気にくわないらしい。

```
class Engineer < ApplicationRecord
	has_one :engineer_registration_type
	has_one :engineer_hiring, autosave: true
	has_one :office, through: :engineer_hiring
	belongs_to :person_info, autosave: true
end
```

以下ならOK

```
	def new
		@var.title=t("cmn_sentence.newTitle",model:Engineer.model_name.human)
		@engineer=Engineer.new
		@engineer.build_engineer_hiring
		@engineer.build_person_info
		@engineer.engineer_hiring.office = Office.first
		@engineer.engineer_registration_type_id = EngineerRegistrationType.select(:id).first
	end
```

## さて。。 has_one through: の仕様について

確かに、元の書き方だと、

```
 @engineer.office = Office.first
```

と段階で、insert文が走ってしまう。この段階で何が起きているか深掘りするのはまた後でにするとして、(ER図を示さないと難しいと思うので・・）

```
@engineer.build_engineer_hiring(office: Office.first)
```

とすることで、エラーは出なくなった。
Raspberry Pi B+ で起動しない問題について

夏休みを利用してRaspberry Pi Model B+を使って、冷房のon/offの実験をして見たいと思い、早速セットアップなどをした際のはまってしまった罠について書きたいと思います。

# 目次
1. 参考にしたサイト 
2. 起動しない

# 参考にしたサイト
あまりラズパイの知識もなかった中で、今回下記のサイトを参考に実験を始めた
https://qiita.com/KAKY/items/55e6c54fa2073cdc0bbe
また、上記のサイトから飛べますが、セットアップには
https://deviceplus.jp/hobby/raspberrypi_entry_003/
また、
https://qiita.com/jh3rox/items/684ba1e746a6a3763b5c
を参考にOSのダウンロードなどをした。


## 起動しない

何も知らない状態でSDカードを挿入し、電源をつけたところ、赤のランプが点灯したが緑のランプがなぜがブツブツ切れに、、、
これはこういったものかと思い、続けていたが中々起動しない！！！

っということで、OSを再度ダウンロードしたが同じ結果に、、、

よく電力不足とかいった記事を目にしていたので、まさかと思いアダプタを下記のものに変更<a href="https://www.amazon.co.jp/Anker-PowerPort-PowerIQ%E3%80%90Power-Max%E3%80%81MacBook%E3%80%81Galaxy-XZ1%E3%80%81%E3%81%9D%E3%81%AE%E4%BB%96Android%E5%90%84%E7%A8%AE%E5%AF%BE%E5%BF%9C/dp/B072KBG9W4/ref=sr_1_2?s=electronics&ie=UTF8&qid=1536997285&sr=1-2&keywords=anker+a2056511">AnkerのAK-A2056511</a>を使用していたが、iPadのアダプタに変更して見た。
**のちにこれが原因でないことは判明した**

結果は変わらず、さらに調べてみると、SDカードの相性がなんだか原因かも？と思い、もともとz<a href="https://www.amazon.co.jp/%E3%82%B0%E3%83%AA%E3%83%BC%E3%83%B3%E3%83%8F%E3%82%A6%E3%82%B9-microSDHC%E3%82%AB%E3%83%BC%E3%83%89-Class10-UHS-I%E5%AF%BE%E5%BF%9C-GH-SDMRHCUB16G/dp/B01851RU12/ref=sr_1_2?s=electronics&ie=UTF8&qid=1536997513&sr=1-2&keywords=greenhouse+16gb+class10">Greenhouseの16GB Class10</a>を使用していたが、<a href=https://www.amazon.co.jp/RMSD-Y016U1A-RMSD-YU1A%E3%82%B7%E3%83%AA-%E3%82%BA-microSDHC%E3%82%AB-%E3%83%89-16GB-CLASS/dp/B075D7738V/ref=sr_1_fkmr0_1?s=electronics&ie=UTF8&qid=1536997599&sr=1-1-fkmr0&keywords=buffalo+rmsd+y016u1a>Buffaloの16GB Class10</a>に変更し同じことを繰り返したところ、今まで見れなかったデスクトップが表示され、無事うまくいきました！

まさか、SDカードに相性があるとは知らず、こんなことに何時間も悩んでいたのかと思うとほんともったいないです

ということで、これからは何も起こらないことを祈るばかりです、、
enumで改行コードをまとめる


#はじめに
プログラムの処理結果をファイルに出力するときなど、実行環境のデフォルトの改行コード以外を指定する必要があることがあります。コマンドラインパラメータやプロパティファイルなどで「LF」「CRLF」などの記号で指定し、受け取ったプログラムでは指定された記号に応じた改行文字列「\n」「\n\r」に割り当てるような処理を書いていましたが、enumにまとめられることに気づきました。

#実装したenum NewLine

enumデフォルトのvalueOf(String name)メソッドだと、指定されたnameに該当するものがないと

`java.lang.IllegalArgumentException: No enum constant NewLine.XXX`

のような例外が投げられるので、get(String name)メソッドを用意しました。

```java:NewLine.java
public enum NewLine {
	CR("\r"),
	LF("\n"),
	CRLF("\r\n"),
	DEFAULT(System.lineSeparator());

	private final String value;
	
	private NewLine(String value) {
		this.value = value;
	}

	public String getValue() {
		return value;
	}

	static NewLine get(String name) {
		try {
			return valueOf(name);
		}
		catch (IllegalArgumentException | NullPointerException ignore) {}
		return DEFAULT;
	}
}
```

###使用例
改行をプロパティに指定するイメージです。NewLine enumのどれかをプロパティに指定し、それをWriterのwriteメソッドで使うというサンプルです。

```java:NewLineTest.java
public class NewLineTest {
	
	static Properties prop;
	
	@BeforeClass
	static public void init() {
		prop = new Properties();
		prop.setProperty("newline", "LF");
	}

	@Test
	public void test() throws Exception {
		
		NewLine EOL = NewLine.get(prop.getProperty("newline"));
		
		StringWriter writer = new StringWriter();
		writer.write("line");
		writer.write(EOL.getValue());
		
		System.out.print(writer);
	}
}

```
[AWS] Amazon Data Pipelineの用語説明

# Amazon Data Pipelineの用語説明
Amazon Data Pipelineの用語を説明していきます。
（チュートリアル等はやりません。）
間違いがあれば、気軽にコメントくださいm(_ _)m

## ここでやること
- Amazon Data Pipelineに関する用語の説明

## ここでやらないこと
- Data Pipelineの設定の仕方


## 用語説明

### Pipeline
- Activityをまとめたもの
	- Pipeline **1 : N** Activities

### Activity
- 処理内容
        - S3のデータをRDSにロードする等。データを加工するには別途コーディングする必要がある。

### Datanode
- SourceとDestinationのこと
	- e.g. S3(datanode) => Activity(何らかの処理をする) => RDS(datanode)

### Schedule
- 実行スケジュール

### Resources
- 処理を実行するインスタンスに関する情報
	- EC2 or EMR?
	- Region
	- Instance size
	- AMI

### Preconditions
- 調べてない

### Others
- （他にもあるけど）SNSの設設定

### Parameters
- プレースホルダに対応する値を入力する。
Haskellの変数には値を代入しません、束縛します。

**束縛** という用語の使い方に関してより詳しい解説を頂きました

* [「名前の束縛」という名の束縛 - モナドとわたしとコモナド](http://fumieval.hatenablog.com/entry/2018/10/31/150056)
* [変数を束縛するのは値ではないのか - ny-sketch-book](https://scrapbox.io/ny-sketch-book/%E5%A4%89%E6%95%B0%E3%82%92%E6%9D%9F%E7%B8%9B%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E5%80%A4%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B)

上記で説明されている通り以下の本文では正確ではない用語の使い方がありますがご了承ください

----

Haskellの変数には値を再代入することができません。そのため変数に値を結びつけることを代入とは言わず **束縛** と言います。
<img src="https://qiita-image-store.s3.amazonaws.com/0/17134/38f2ee89-cd26-2a66-b870-5ceb16130a4c.png" width=300/>

例えばトップレベルに

```hs
x :: Int
x = 12
x = 23
```

と書けばコンパイルがエラーになってしまいます。変数への束縛はあくまで値に名前を付ける行為であって、箱のようなものに値を入れるイメージは当てはまりません。これらの違いをよく表している例が

```hs
x = x + 1
```

という式でしょう。代入のイメージだと変数xから取り出した値に1を足して再び変数xに代入する操作だと考えられますが、Haskellでは変数xにはx+1という値が束縛されており、そのxとはx+1という値であり、そのxとは…という評価を無限に繰り返すためxの評価は停止しません。

この性質と遅延評価（値が必要になるまで評価されないというHaskellの評価戦略）を利用した面白いプログラムの例を紹介しましょう。

```hs
> fib = 1 : 1 : zipWith (+) fib (tail fib)
> take 10 fib
[1,1,2,3,5,8,13,21,34,55]
```

fibはフィボナッチ数列の無限リストを実装しています。(:)は左側の値を右側のリストの先頭に付加する関数、zipWithは二つのリストの対応する位置にある値に二項演算を適用して新しいリストを作る関数、tailはリストの先頭の要素だけを取り除く関数です。

```hs
(:) :: a -> [a] -> [a]
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
tail :: [a] -> [a]
```

fibは1, 1という値から始まって、次はfibの1番目とfibの2番目の要素を足し合わせた値、次はfibの2番目とfibの3番目の要素を足し合わせた値、というような無限リストとして定義されています。takeはリストからn個の値を取ってくる関数なので、

```hs
take :: Int -> [a] -> [a]
```

fibの値を10個取ってくるとfibの評価は10番目の要素までしか必要ないので、fibが無限リストであっても遅延評価のおかげで計算が停止するという仕組みになっています。
TypeScript3 tsconfig.jsonで出力先ディレクトリを設定する。

## 環境
```
PS C:\> tsc -v
Version 3.0.1
```

## 結果
`rootDir`と`outDir`を設定する。

```json:./tsconfig.json
{
    "compilerOptions": {
        "target": "es2018",
        "module": "commonjs",
        "sourceMap": true,
        "rootDir": ".",
        "outDir": "../build/"
    }
}
```

`tsc`コマンド実行で`outDir`に指定したディレクトリ`build`が生成され、その中にコンパイルされる。ディレクトリ構成も維持される。

```
C:
│
├─build
│  │  index.js
│  │  index.js.map
│  │
│  └─library
│          libSample1.js
│          libSample1.js.map
│          libSample2.js
│          libSample2.js.map
|
└─src
    │  .gitignore
    │  index.ts
    │  tsconfig.json
    │
    └─library
            libSample1.ts
            libSample2.ts
```
Pythonの書式設定  - 古いスタイルと新しいスタイル -

# 2種類のPythonの書式設定
Pythonで文字列にデータを差し込む方法を探していて、**「%と{}は何が違うのだろう・・・？」**または**「どちらを使うべきなのだろう・・・？」**という疑問を持ったことはありませんか？
実務で少しPythonを使っており、この疑問を解消することができたので、ここに備忘録を残します。

## 古いスタイル
この古いスタイルは、Python2、3どちらもサポートしている。
書式指定は、string % dataという形式を使う。
以下の表に、データ型を示す差し込みポイントの形式と、対応するデータ型をまとめた。

|指定ポイント形式|データ型|
|:---:|:---:|
|%s|文字列|
|%d|10進数|
|%x|16進数|
|%o|8進数|
|%f|10進数float|
|%e|指定形式float|
|%g|10進数float or 指定形式float|
|%%|リテラルの%|

(例)

```python
language = 'python'

print("Hi, %s!" % language)
```
```
Hi, python!
```
(例2)

```python
weather = 'rainy'
int = 3

print("It will be %s %d days later." % (weather, int))
```
```
It will be rainy 3 days later.
```

文字列の中の%の数と差し込むデータの数は一致していなければならない。
また、差し込むデータが１つの場合はlanguageのようにそのままデータを置けばいいが、複数のデータを差し替える場合は、(weather, int)のようにタプルでまとめなければならない。

## 新しいスタイル
この新しいスタイルはPython2.6以上でサポートされている。
.format(data)という形式を使う。

(例)

```python
s = 'python'
f = 3.7
n = 0

print("{} {} {}".format(s, f, n))

```
```
python 3.7 0
```

(例2)

```python
s = 'python'
f = 3.7
n = 0

print("{} {} {}".format(n, s, f))

```
```
0 python 3.7
```

古いスタイルでは、%が文字列内に出てきた順序で引数を渡さなければならなかったが、新しいスタイルでは自由に順序を指定できる。

# まとめ
今までは何となくその時の気分で古いスタイルと新しいスタイルを使い分けていました。。。
今回を機に、Python3では自由に順序を入れ替えられる**柔軟性の高い新しいスタイル{}**で統一しようと思いました。

### 追記
コメントで教えていただいたf書式が、3.6以降に取り入れられた最新の書式であるということなので、ここに追加する。

(例)

```python
s = 'python'
f = 3.7
n = 0

print(f"{s} {f} {n}")

```
```
python 3.7 0
```
認証が必要なコントローラークラスをテストする

# コントローラークラスのテスト
CakePHPでは`IntegrationTestCase`クラスを使うとコントローラーを通したテストができる。複数のクラスが連動した動きになるので、WebIFレベルのテストが可能になる

## 基本

認証が必要ないアクションのテスト
`http://<domain>/articles`にGETメソッドを送信

```php
class ArticlesControllerTest extends IntegrationTestCase
{
    public $fixtures = ['app.articles'];

    public function testIndex()
    {
        $this->get('/articles');
        $this->assertResponseOk();
    }
}
```
同じような使い方で各種HTTPメソッドをリクエストすることができる。
HTTPボディ部があるメソッドの場合は第二引数で連想配列を設定する。

## 認証が必要なアクションのテスト
CakePHPの`AuthComponent`を使った認証を実装している場合、HTTPリクエストの送信前に以下をテストメソッド内で設定する。
※但し、フィクスチャ（テスト時に利用されるDBのダミーデータ）に`id=1`のユーザーが存在している必要がある。

```php
    public function testIndex()
    {
        $this->session([
            'Auth' => [
                'User' => [
                    'id' => 1,
                ],
            ],
        ]);
        $this->get('/articles');
        $this->assertResponseOk();
    }
```

### AuthComponentの補足
デフォルトでUsersTableの情報を認証情報のデータとして扱うため、上記で`User`を指定している。
異なるテーブルを認証情報としている場合、`User`を異なるモデル名に変更すれば行ける。多分。

## CSRF対策をしているアクションのテスト
CakePHPのCSRFを利用している場合、テストメソッド内で以下を設定する。

```php
    public function testIndex()
    {
        $this->enableCsrfToken();
        $this->get('/articles');
        $this->assertResponseOk();
    }
```

## 認証＋CSRF対策をしているアクションのテスト
これまでの話をまとめて。

```php
    public function testIndex()
    {
        $this->enableCsrfToken();
        $this->session([
            'Auth' => [
                'User' => [
                    'id' => 1,
                ],
            ],
        ]);
        $this->get('/articles');
        $this->assertResponseOk();
    }
```

# 所感
便利なものはだいたい用意されてるので楽ですね。
WebIFベースでTDDしても効率良くないかも。PHPUnit見てもモデル原因のエラーは分からない事が多い。

# 参考
https://book.cakephp.org/3.0/ja/development/testing.html#integration-testing
at coder beginner 008

B
とある組織で、リーダーを選ぶ選挙が行われた。
組織は N 人の構成員で構成されており、各人は最もリーダーにふさわしい人物の名前を書いた。
リーダーは、得票数が最も多い人物が選ばれることになっている。
得票数が最も多い人物の名前を出力せよ。得票数が最も多い人物が複数いる場合は、そのうちどの名前を出力してもよい。

```
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
	int N;
	int now_max = 0;
	int max = 0;
	string S[51];
	int count[51];
	cin >> N;
	for (int i = 0; i < N; ++i) {
		cin >> S[i];
	}
	for (int i = 0; i < N; ++i) {
		int count = 0;
		for (int j = i + 1; j < N; ++j) {
			if (S[i] == S[j]) {
				count++;
			}
			if (count > now_max) {
				max = i;
				now_max = count;
			}
		}
	}
	cout << S[max] << endl;
	return 0;
}

```
一番シンプルでしっくりくる解き方

```
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
#define P pair<int,string>
P p[55];
int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; ++i) {
		cin >> p[i].second;
	}
	for (int i = 0; i < n; ++i) {
		for (int k = 0; k < n; ++k) {
			if (p[i].second == p[k].second){
				p[i].first++;
			}
		}
	}
	sort(p, p + n);
	cout << p[n - 1].second << endl;
	return 0;
}
```
pairを使った書き方

```
#include<iostream>
#include<map>
#include<string>
using namespace std;
int main() {
	int n;
	cin >> n;
	map<string, int>mp;
	for (int i = 0; i < n; i++) {
		string S;
		cin >> S;
		mp[S]++;
	}
	int x = 0;
	for (auto p : mp) {
		if (mp[p.first] > x)
			x = p.second;
	}
	for (auto p : mp) {
		int y = p.second;
		if (x == y) {
			cout << p.first << endl;
			return 0;
		}
	}
}
```
アサーションを書くために覚えておくべき演算子、文法、system function

IEEE1800にはアサーションを書くための演算子や文法がたくさんありますが、すべてを知らなくても実際の検証用のチェッカは書けるのではないかと思います。そこでこれだけは覚えておけばいいんじゃないというものをあげておきます。
concurrent assertionとimmediate assertionがありますがクロック同期の回路の検証用としては通常concurrent assertionをつかうとおもいますのでconcurrent assertionについて考えます。

## property ~ endproperty
次のassert宣言の中にpropertyを書いてしまえばproperty宣言はいりませんが、基本として
propertyの名前、引数、clock節、 disable iff、property本体で構成される形式は知っておく必要があるでしょう。

## assert宣言
property宣言はそれだけではシミュレーターなどでチェックする動作はしません。propertyをassertすることでチェックするようになります。

## 演算子
- |-> |=>
-  \##n \##[m:n]
- [*n] [*m:n]
- not

## system functions
- $past()
- $rose()
- $fell()
- $stable()
- \$onehot() $onehot0()

## bind
アサーションを書いたチェッカmoduleを検証対象のmoduleと接続するためにbind文を使うのが一般的だと思います。

実際によく使うものということだけでなくOVLやARMのAXI用のチェッカのコードを調べてみて大体上記のものだけで書かれていましたのでこれだけ覚えておけばたいていのチェックができると思います。
シミュレーターだけでなくFormal検証ツールを使うのであれば

- assume

は必須です。
あとは

- sequence 名前付きのsequenceを定義する
- throughout
- intersect
- [->] 

くらいでしょうか。

下記の日本ケイデンスの矢ケ部さんの記事の中に「覚えておくべきアサーションのシンタックス」という表があります。
[アサーション活用の手引き (2/5)](http://ednjapan.com/edn/articles/0909/01/news150_2.html)
上記では

- ( ) sequenceの区切り
- [=n] 非連続繰り返し

たしかにsequenceの繰り返しを書く時に( )はつかいますね。
[=]がありますが個人的には [->]の方が好きです。その辺は好き好きということで。
矢ケ部さんの記事に、全部の文法を知らなくても8割がたのチェッカは書けますということで、ここに上げたものをおぼえておけばだいたいOKということがEDAベンダの方も考えているということが分かりました。
3大OS私的まとめ

家にwindowsとMacとlinux(Ubuntu)があります。
Mac歴一ヶ月です。
良いところ、悪いところをまとめました。
完全に主観です。
コメント歓迎です。
マサカリはご遠慮ください。


### windows

##### 良いところ
- いろいろなフリーソフトがある。
- GUIでのインストールがわかりやすい。
- プログラミングの本にたいてい環境構築方法が載っていて初心者に優しい。
- sourcetreeが使える
- javaのIDEであるeclipseの情報が多い。

##### 悪いところ
- GUIで言語とか開発環境を入れるのが面倒。
- CUIでも入れる方法があるが、複雑で面倒。初心者向けではない。
- デフォルトだと勝手にアップデートが走って重くなる。月の第2週水曜日に特に嫌いになる。

### mac

##### 良いところ
- デフォルトでおしゃれ。(これが本当に大事。)
- 使いやすいターミナルがデフォルトである
- 主要な言語があらかじめインストールされている
- 環境構築の日本語が多いイメージ
- もくもく会等の勉強会でのデファクトスタンダード
- sourcetreeが使える
- homebrewが便利(brewだけで環境を作って気に入らなければbrewだけ消せば全部消えるので便利)
- controlを使ってのカーソル移動・バックスペースが超絶便利。

##### 悪いところ
- windowsやUbuntu使いにはファッっとなるキー配置
- ~~本体が高い~~ (windows機もスペック高いと同じくらいになるのでデメリットではない)
- メモリ増設などの拡張性が高くない(Mac book pro 2013以降)

### linux(Ubuntu)
##### 良いところ
- aptが優秀。簡単
- 新しめのversionで言語が始めから入っている
- ターミナル(端末)がとても使いやすい
- 英語だが情報が多い
- 無料

##### 悪いところ
- sourcetreeが使えない
- 日本語情報が少ない
- デフォルトがおしゃれではない(個人的にそこも好きです。)
- sublimetextの日本語入力設定が複雑。今の所、ctrl + space でしか切り替えできないはず。
- 見た目や電池の持ちを良くするなどの設定が必要


### まとめ
プログラマならMacがいいかもしれません。
私の結論としては、Macかっこいいからつかっていきたいです。
アルゴリズムとデータ構造の基本まとめ

## はじめに
以下の項目について、簡単な確認ができます。
wikiなどの引用と参考になるリンクを記載しています。

- ハッシュテーブル
- 連結リスト
- 幅優先検索
- 深さ優先検索
- クイックソート
- マージソート
- 2分探索
- 2分探索木
- ビッグオー記法

##まとめ
####ハッシュテーブル (Hash table)

キー（key）と値（value）の組を複数個格納し、キーに対応する値をすばやく参照するためのデータ構造。　- wikipedia

- [ハッシュテーブル(Hash Table)を簡単に理解しよう](https://qiita.com/tenten1010/items/da4084f937ad07e70164)




####連結リスト (Linked list)
リスト（データの要素を順番に並べて扱うデータ構造）の中で、自分の次、および、前の要素を示す情報（リンク情報）を持つことで、要素を連結（リンク）させたリストのこと。 - IT用語辞典

- [連結リスト : データ構造 - ソースコード探検隊](https://www.codereading.com/algo_and_ds/ds/linked_list.html)



####幅優先検索 (Breadth First Search)
木構造やグラフの探索を行うためのアルゴリズムです。始点となるノードから隣接するノードを探索し、そこからさらに隣接するノードにたいして探索を繰り返して目的のノードを見つける。 - Algoful

- [BFS - Algoful](http://algoful.com/Archive/Algorithm/BFS)


####深さ優先検索 (Depth First Search)
始点となるノードから目的のノードが見つかるか子のないノードにたどり着くまで探索を繰り返し、そのあとは探索の終わってないノードまで戻って再度探索を繰り返す。　- Algoful

- [DFS - Algoful](http://algoful.com/Archive/Algorithm/BFS)


####クイックソート (Quick sort)
実用上もっとも高速であるとされている並べ替えアルゴリズム。
データの比較と交換回数が非常に少ないのが特徴で、一般的なばらばらデータ（ランダムに散らばっているデータ）に対して、最も効率良く並べ替えを実行する。 - JABEE

- [クイックソート - JABEE](http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/quick-sort.html)



####マージソート (Merge sort)
並べ替えたい配列を再帰的に分割していき、再び併合（マージ）していくことで、並び替えを実現しようとする、ソートアルゴリズム。 - JABEE

- [マージソート - JABEE](http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/merge-sort.html)



####二分探索 (Binary search)
ソート済みの配列において、検索する間隔を半分に分割しながらデータを探し出すアルゴリズム。 - ソースコード探検隊

- [バイナリーサーチ／二分探索](https://www.codereading.com/algo_and_ds/algo/binary_search.html)



####二分探索木 (Binary search tree)
二分木に対して、あるルールを適用することによって、データの探索効率を向上させたデータ構造 - programming-place

- [二分探索木 | Programming Place Plus](https://programming-place.net/ProgrammingPlacePlus/algorithm/data_struct/008.html)



####ビッグオー記法 (O notation)
議論を正確にして、かつわかりやすくするために積極的に行う略記 - triplefalcon

- [オー・記法(O notation)](http://www.triplefalcon.com/Lexicon/Notation-BigO-1.htm)
RaspberryPiにPython3.6で動くopenCV3系入れるの辛すぎ問題（解決）

とにかくRaspberryPiでPython3.6で動くopenCVをできるだけ簡単に入れたい。
Python2系やPython3.5ではなく、Python3.6なのだ。やんごとなき理由で。
そんな奮闘記。

結論からいえば、RaspberryPiにおいてはpip系のコマンドなどで楽ちんに入れることはできません。公式からbuildするしか方法がないっぽいです。結論だけ知りたい方は「解決策」項だけお読みください。



## 奮闘記（全部失敗）

`pip install opencv-python`で一発でいけるっしょと思っていたが上記コマンドはmacOSではいけるがraspbianでは無理

ok、それならとpyenvでpython3.6系の環境を入れてから以下のページで1からビルドしようとしたが、情弱かつ我慢強くない自分は「もっとラクな方法は無いものか…」と挫折

- [ラズパイにOpenCVをインストールする方法](https://qiita.com/takahiro_itazuri/items/a67dd3bb7f5f88ca9dd8)



余計なものが入ってゴチャゴチャするのが嫌だけど仕方ない、anacondaを入れてconda install opencvで一発で入れるか…と思い、pyenvでanaconda3環境を入れようとしたところ、以下のエラーが出て入らない…（minicondaも試したが同じエラーでコケる）

こちらの記事いわく、anaconda/minicondaはpython3.4までしか用意されていないらしい。ツライ…

- [RaspberryPiでcondaを使いたいしpython3.6も使いたい](https://qiita.com/saragai/items/52de118c1aef1efeb284)



そこで、上記の記事に入れているBerry Condaなるものを入れました。
そこでおもむろに conda install opencvするとまたコケるのですが、こちらの記事を参考にして conda install -c conda-forge opencv すると入った。

- [OpenCV(cv2)をcondaでインストール (python3.6)](https://qiita.com/sai_kai_cs/items/adae1724931042405ec0)



いやー、めでたしめでたしとしたかったのですが、そうは問屋がおろさん
import cv2するとたしかにopencvの3.1.1が入っていることが確認できるのですが、いざコードを実行すると以下のような謎のエラーが出る

- [OpenCV not working properly with python on Linux with anaconda. Getting error that cv2.imshow() is not implemented](https://stackoverflow.com/questions/40207011/opencv-not-working-properly-with-python-on-linux-with-anaconda-getting-error-th)

なんだかよくわからないが、どうやらconda installのopencvはダメだから公式からビルドしろと書かれている気がする。マジかよ… RaspberryPiでopenCV（with Python3.6以上）入れるのどんだけツライんだよ…



## 解決策

さらに別の方法を探し、すがるような気持ちで[こちら](https://sites.google.com/site/memorandumjavaandalgorithm/raspberry-pi-jiang-zuo-opencv3)を参考にして以下を実行

動作確認環境がPython3.4となっているが気にしない気にしない、うごけばいいんや…
make -j4で90minかかるとなっているが、最初のapt-get updateとdist-upgradeでも1hくらいかかった。長い。

最後のmakeするところで -j4 オプションを付けると自分の場合延々に処理が終わらなかったが、-j4を取ってmakeだけすると完了する。

```bash
$ sudo apt-get update #ここもそこそこ長い
$ sudo apt-get dist-upgrade #ここもそこそこ長い
$ sudo apt-get install build-essential cmake pkg-config  
$ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev  
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev  
$ sudo apt-get install libxvidcore-dev libx264-dev  
$ sudo apt-get install libgtk2.0-dev  
$ sudo apt-get install libatlas-base-dev gfortran  
$ cd ~  
$ wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.1.0.zip  
$ unzip opencv.zip  
$ wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip  
$ unzip opencv_contrib.zip  
$ cd ~/opencv-3.1.0/  
$ mkdir build  
$ cd build  
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules -D BUILD_EXAMPLES=ON ..  
$ make  #注! -j4 とすると延々に処理が終わらない。ここも90分くらいかかる 
$ sudo make install  
$ sudo ldconfig

```

自分の環境ではこれでようやく目的を達成した。

<br>
<その他参考>

- [ラズパイにOpenCVをインストールする方](https://qiita.com/takahiro_itazuri/items/a67dd3bb7f5f88ca9dd8)
macOSにPython3及びPython仮想環境virtualenvを導入

## はじめに
持っているMacにPython及びPython仮想環境のvirtualenvを導入してみた。

## 手順

### 最新のpythonをインストール
```
$ brew install python
```
brew自体がMacに導入されていない場合、これを参考に導入してください。
https://qiita.com/balius_1064/items/ac7dff5ef10eaf69996f

インストール完了後に、正しくできたかどうかを確認する。

```
$ python3 --version
Python 3.7.0
```

### virtualenvをインストール
virtualenvのいいところは、python自体のバージョンまで環境ごとに指定できること。

```
pip3 install virtualenv
```
正しくインストールできたかどうかを確認する

```
$ virtualenv --version
16.0.0
```

インストールは一応これでOK。次は、仮想環境を作ってみる。

### 仮想環境を作る
homeディレクトリのhellopyに仮想環境を作る。

```
$ cd ~
$ mkdir hellopy
$ virtualenv hellopy
Using base prefix '/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7'
New python executable in /Users/yangbin/hellopy/bin/python3.7
Also creating executable in /Users/yangbin/hellopy/bin/python
Installing setuptools, pip, wheel...done.
```

### 仮想環境を有効化する
仮想環境を作るだけでまだ使えない。仮想環境を使う時にまず有効化させる必要がある。

```
$ cd hellopy
$ source bin/activate
```
これで有効になります。有効になると、コマンドラインのプロンプトに環境が表示されるようになる。

```
(hellopy) $
```

### 仮想環境を無効化する
個人的には、新しいターミナルを開くが、あえて現在のターミナルで仮想環境を無効化するなら、下記のコマンドで。

```
(hellopy) $ deactivate
```
Google Cloud上で環境変数を設定

Google cloud　上で環境変数を設定:relaxed:

コンフィグを作成して

``` _
$> gcloud beta runtime-config configs create <コンフィグ名>
```

そこに変数と変数値を入れてゆきます

``` _
$> gcloud beta runtime-config configs variables set <変数名> <変数値> --config-name <コンフィグ名> line --is-text     
```

**参考**
http://kourin.hatenadiary.com/entry/2018/05/01/014804
LAN基礎3（IPアドレス）

#LAN基礎3

##MACアドレス（物理情報）

MACアドレス、またはイーサネットアドレス、物理アドレスとも言います。
通信ネットワークで一意に識別するために**物理的に割り振られた、48ビットの識別番号**。
データリンク層で用いられる。

~~~
A0-8C-XX-DE-36-XX（伏せてますがXXも16進数でが入ります）
~~~

上のように2バイトずつ16進数でハイフンまたはコロンで繋ぎ表します。
前半24ビットはOUIと呼ばれる製造者の識別番号で、IEEEが全世界の通信装置メーカーに割り当てている。
なので前半部分をMACアドレスの検索することでどこのメーカーで作られたか特定できる。
後半部分はメーカーが個々に重複しない固有製造番号を割り振っている。

[MACアドレス検索](https://uic.jp/mac/)

##IPアドレス（論理情報）

 - IPアドレス  
TCP/IPネットワークに接続されているコンピュータに割り触れられている識別番号で、これは一意（重複しない）番号である。
番号は2進数32ビットで表現（IPv4）され、8ビット単位を「.」で区切り10進数で表記されます。（約42億台）  
しかし**IPv4**による割り当てが、インターネットの急速な普及によって、新規の割り当てることができなくなってしまいました。
そこで**IPv6**というIPアドレスを128ビットで表現するものができました。（約340澗台）
番号は2進数128ビットで表現され、16ビット単位を「:」で区切り16進数で表記されます。
IPv4とIPv6をそのまま通信できない為、導入が難しくなかなか普及が進まない状況です。
ネットワーク層で用いられる。

~~~
表記例
 IPv4
10101100 00010110 00001010 00000001　←２進数
172.22.10.1　←10進数
 IPv6
1234:5678:90ab:cdef:0123:4567:890a:bcde　←16進数
~~~

このように表記されます。

+ グローバルアドレス
インターネットに直に接続する場合、世界で一意であるアドレスが、**NIC(Network Information Center)**から割り振られます。
**世界中で重複しないアドレス**です。
日本はJPNICが管理します。
 + プライベートアドレス（ローカルアドレス）
LANなどのローカルなネットワークで割り当てる番号。
**組織内で一意**ならば自由に割り当てることができる。
  
     + ネッワークアドレス  
自分の所属するネットワークを表す番号。  
上記例で、サブネットマスクを255.255.255.0とした場合、172.22.10.0となる。
     + ホストアドレス  
ネットワーク内での端末を表す番号（同じネットワーク内で重複してはならない）。  
上記例で、サブネットマスクを255.255.255.0とした場合、1となる。     
* サブネットマスク
IPアドレスの先頭から何ビット目までがネットワークアドレスの部分であるかを定義するもの。
なのでIPアドレスとセットで表現される。

   + プレフィックス長（**CIDR表記**）
ネットワークアドレス後にサブネットマスクを同時に表記。
「[IPアドレス]/XX」先頭から連続する1の数XX
例えばサブネットマスク（255.0.0.0）のときは（11111111.0.0.0）で連続する1の数は8個なので、
「10.0.0.0/8」となる。

###クラスフル

 + クラスA  
範囲"[0.0.0.0~127.0.0.0]/8(255.0.0.0)"  
ネットワークアドレスの先頭1ビット目を0にするとクラスAとなる。  
最大ホスト数16,777,214台。
 + クラスB  
範囲"[128.0.0.0~191.255.0.0]/16(255.255.0.0)"  
ネットワークアドレスの先頭1ビット目を1にするとクラスBとなる。  
最大ホスト数65,534台。  
 + クラスC  
範囲"[192.0.0.0~253.255.255.0]/24(255.255.255.0)"   
ネットワークアドレスの先頭1,2ビット目をそれぞれ1にするとクラスCとなる。  
最大ホスト数254台。

**ナチュラルマスク**
サブネッティングされていないデフォルトのマスクをナチュラルマスクという。

###クラスレス

 -ネットワーク分割（サブネッティング）
IPアドレスはネットワークアドレスとホストアドレスで構成され、通常ホストアドレスはホストを表現するためだけに使用される。
サブネッティングでは、ホストアドレスの一部をネットワークアドレスとして流用することで、一つのネットワークアドレスを不空数のネットワークアドレスに分割している。

**例**
クラスAでクラスレス
10.0.0.0/8から４つのネットワークに分割するとき。
2ビット拡張（サブネッティング）
ネットワークアドレス	10.0.0.0/10
サブネットマスク	255.192.0.0			
全体の台数
256＾3-2=16,777,214台
分割した1つの領域の台数
255＾3/4-2=4,194,174台

*上記式の-2について
ネットワークアドレスとブロードキャストアドレスの二つをプライベートアドレスに割り当てることができないので、その二つを引きます。

|   | ネットワークアドレス | ホストアドレスの範囲        | ブロードキャストアドレス |
|---|----------------------|-----------------------------|--------------------------|
| ① | 10.0.0.0             | 10.1.0.1～ 10.63.255.254    | 10.63.255.255            |
| ② | 10.64.0.0            | 10.64.0.1～ 10.127.255.254  | 10.127.255.255           |
| ③ | 10.128.0.0           | 10.128.0.1～ 10.191.255.254 | 10.191.255.255           |
| ④ | 10.192.0.0           | 10.192.01～ 10.255.255.254  | 10.255.255.255           |

---
参照資料・引用元
WEB
[IT用語辞典 e-Words](http://e-words.jp/)
[JPNIC 10分口座:IPv4アドレス](https://www.nic.ad.jp/ja/newsletter/No26/090.html)
[IPアドレスの基礎知識](https://qiita.com/mogulla3/items/efb4c9328d82d24d98e6)
書籍
[平成30年度 栢木先生のITパスポート教室]
Aasteria利用時のSlack API「invalid_arg_name」エラーへの対処

データ連携基盤のAsteriaを使い、SlackAPIの運用を回しています。

その際、よくぶつかったエラーが「invalid_arg_name」


>
The method was passed an argument whose name falls outside the bounds of accepted or expected values. This includes very long names and names with non-alphanumeric characters other than _. If you get this error, it is typically an indication that you have made a very malformed API call.
https://api.slack.com/methods/chat.postMessage

slackAPIの公式ドキュメントには上記の記載。

パラメータのスペルミスか文字コード的な話かなと考えてたら、
「ストリーム型」をParameterListで渡してなかったのが原因でした。

結構詰まった。乙。