OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7 で Postfix,Dovecot を使う

CentOS7.4 で Postfix と Dovecot を設定しました。CentOS が他と違うのは、ファイアウォールの設定が必要なことです。ディフォールトでは総て閉じられています。

ソフトのインストール

```bash
sudo yum -y install postfix
sudo yum -y install dovecot
sudo yum -y install cyrus-sasl
```

パラメータの設定はこちらを参考にしました。
[メールサーバー構築(Postfix+Dovecot)](https://centossrv.com/postfix.shtml)

サーバーの起動

```bash
sudo systemctl start postfix
sudo systemctl enable postfix
```

```bash
sudo systemctl start saslauthd
sudo systemctl enable saslauthd
```

```bash
sudo systemctl start dovecot
sudo systemctl enable dovecot
```

フォイアウォールの設定
iptables でなく firewall-cmd を使いました。

```bash
sudo firewall-cmd --permanent --add-service=smtp --zone=public
sudo firewall-cmd --permanent --add-service=smtps --zone=public
sudo firewall-cmd --permanent --add-service=smtp-submission --zone=public
sudo firewall-cmd --permanent --add-service=pop3 --zone=public
sudo firewall-cmd --permanent --add-service=imap --zone=public
```

設定の確認

```bash
sudo firewall-cmd --list-services
```

注意:
　さくらインターネットのお試しでは、外部にメールを送ることができません。
　外部からのメールの受信と、内部への送信はできます。
　本契約をすると、外部にメールを送ることができるようになります。

さくらのページからの引用

```text
お試し期間中の制限
メール送信用のポート番号となる外向きの25番ポートを閉じた設定でのご提供です。
```
C++ スマートポインタのパターン

# はじめに

数年前、C++11 の `std::unique_ptr`, `std::shared_ptr` を使い始めたころ、機能は理解できるんだけど実際のコードでどう使うのがよいのか ? がしっくりこずに試行錯誤していた覚えがある。
今となってはなかば無意識に使っているが、あのころの自分のように迷っている人向けに、自分の使い方を整理してみる。

という主旨なので、右辺値参照とかカスタムデリータとかのちょっとややこしい話は省きます。

# 整理してみる

## 登場人物

- `T*` / `const T*`: 生ポインタ。
- `std::unique_ptr<T>`
- `std::shared_ptr<T>`
- `std::weak_ptr<T>` (本稿ではあまり触れない)

## 関数の引数

- 関数を通して **所有権を渡したい** ときは `std::unique_ptr`, `std::shared_ptr` を使う。
    - `std::unique_ptr` が完全に所有権を譲渡、 `std::shared_ptr` は共有する可能性がある。
- それ以外は生ポインタ(または参照)

## 関数の戻り値

- ファクトリ関数 (オブジェクトを生成する関数) の戻り値は原則 `std::unique_ptr`。最初からスマートポインタ管理にしておけば、リークするリスクは激減する。
- `std::shared_ptr` で扱いたい場合は、受け取った `std::unique_ptr` を `std::shared_ptr` に入れれば良い (`std::shared_ptr` のコンストラクタに `std::unique_ptr&&` を取るものがある)

```C++
std::unique_ptr<Foo> CreateFoo();  // こんな factory method で作ったオブジェクトを…
std::shared_ptr<foo> sp = CreateFoo();  // std::shared_ptr に入れる
```

- オブジェクト内のメンバへのポインタを返す際などは生ポインタ、あるいは参照でよい。変更不要なら `const` にすること。オブジェクトの生存期間には注意が必要。

```C++
class Foo {
  public:
    const Bar& GetFoo() const { return bar_; }
  
  private:
    Bar bar_;
}; 
```    

## クラスのメンバ変数

- 所有権を持っているなら `std::unique_ptr` か `std::shared_ptr`
- 所有権を持っていないなら、基本は生ポインタか参照でよい。この場合、参照しているオブジェクトがなくなってしまわないよう、生存期間の設計には注意が必要。
- 生存期間をコントロールしにくい場合、`std::weak_ptr` を使うこともある (がそれほど多くはない)

## `std::shared_ptr` / `std::weak_ptr` は必要なときだけ使う

- `std::shared_ptr` は本当に所有権を本当に共有したいときだけでいい。むやみに使わない。それよりもオブジェクトの生存期間をコントロールして設計しよう。 `std::shared_ptr` を使うことで、オブジェクトの生存期間はむしろコントロールしにくくなってしまう。
- 同じように、 `std::weak_ptr` (弱参照) もむやみに使うものでもない。複数の場所で使われるオブジェクトの生存期間をコントロールするのが難しいときとか、循環参照の解決には便利。「所有権を持たないオブジェクトへの参照は全て `std::weak_ptr` で持つ」みたいなことはしない

## スマートポインタのコスト

- 通常 (カスタムデリーなし)は `std::unique_ptr` のオーバーヘッドはない。メモリ使用量、コードサイズ、実行速度全てにおいて、生ポインタを使って手で `new` `delete` する場合に負けることはない。
- `std::shared_ptr` / `std::weak_ptr` はそこそこオーバーヘッドがある。
    - コントロールブロックと呼ばれる別のメモリ領域がヒープから取られる。 よって、格納するオブジェクトと合わせて 2回のメモリ確保が行われることになる。( `std::make_shared()` を使えばこれは1回にできる)
    - コピー時にはリファレンスカウントの操作が行われる。これはオブジェクトの生成・破棄に比べれば遥かに軽い操作であるが、スレッドセーフにするために排他されていたりもするので無料ではない (でも高速な実装になっていることが多い)
    - コードサイズも大きくなる (ほとんどの環境では無視できるとは思う)


# まとめ

- C++11 で導入されたスマートポインタの使い分けについて書いてみた。昔はもっといろいろ迷っていた気がするので、たぶんもっと挙げるべき例があるのだと思う。こんなときは ? みたいなコメントぜひお待ちしています。
正規表現でよく使うメタ文字を使った簡単な処理

##はじめに
[正規表現でよく使うメタ文字](https://qiita.com/cr_tk/items/3432bb83c588e14d770c)で紹介したメタ文字を使い、簡単な正規表現を書いてみました。

##郵便番号
・「数字」を3回繰り返した後「-」を挟んで「数字」を4回繰り返す。
・「数字」を4回繰り返した後「$」が入っているため、「-」含めて合計8桁である。

```
[0-9]{3}-[0-9]{4}$
```

| 入力値    | 結果 |　　　　　　　 備考 　        |
|:--------:|:---:|:----------------------------|
| 000-1111 | ○  |                              |
| 0001111  | ×  |「-」が入っていないため         |
| 00-1111  | ×  |「-」前の数字が3つで無いため 　　|
| 987-6543 | ○  |                              |
| 111--2222 | × |「-」が１つで無いため           |

##メールアドレス
RFC規定のメールアドレスを作ろうとしますと、すごく長く複雑(下記リンク参照)になってしますので、キャリアメールなどで、設定出来る簡単なメールアドレスの正規表現を紹介させて頂きます。

・@前までに半角英数字記号(.-_)を使用できます。
・@前に「.」を使うことは出来ません。
・@後最初の「.」まで半角英数値のみ使用できます。
・連続ドット入力可能

```
[0-9a-zA-Z.\-_]*(?!\.).@([0-9a-zA-Z])+.[0-9a-zA-Z.\-]+$
```

| 入力値               | 結果 |　　　　　　　 備考 　        |
|:-------------------:|:---:|:----------------------------|
| aa@aa.test           | ○  |                              |
| Test..a@aa.test.test| ○  |　　　　　　　　　　　　　　　　 |
| test.@aa.test       | ×  |「@」の前「.」が入っているため　　|
| .001@aa.com         | ○  |                              |
| aa.test             | × |「@」が入っていないため        |
| aa@aa               | × |「@」の後に「.」が入っていないため        |


下記のサイトに99%のEmail Addressに対応できる正規表現が書いてあります。
興味のある方は見てみてください。(別サイトに飛びます)
http://emailregex.com/


##日付
・「1356789」、月の場合「1-31」まで入力可能
・「469」月の場合「1-30」まで入力可能
・11月の場合「1-30」まで入力可能
・12月の場合「1-31」まで入力可能
・2月の場合「1-29」まで入力可能

```
(^[1356789]([1-9]|[12][0-9]|[3][0-1]))$|(^[469]([1-9][12][0-9]|30))$|(^11([1-9]|[12][0-9]|30))$|(^12([1-9]|[12][0-9]|[3][0-1]))$|^2([1-9]|[12][0-9])$
```

|入力値| 結果 |　　　　　　　 備考 　            |
|:----:|:---:|:--------------------------------|
| 11   | ○   |                                 |
| 131  | ○   |　　　　　　　　　　　　　　　　    |
| 1311 | ×   |   13月は存在しないため       　   |
| 1111 | ○   |                            　   |
| 40   | ○   | 40月または、4月0日は存在しないため |
| 631  | ×   | 6月31日は存在しないため　         |
| 229  | ○   |                                 |
| 230  | ×   | 2月30日は存在しないため           |

MMdd方式(月と日付を2桁に揃える)にしたい場合は1桁の数字の前に「0」をつけることで、出来ます。

```
(0[1356789](0[1-9]|[12][0-9]|[3][0-1]))$)
```

##まとめ
この他にも、正規表現を使って電話番号や、半角チェック、大文字小文字チェック、既定の入力文字チェックなどいろいろな事が出来ます。
また、メタ文字は紹介したもの以外にも便利な物がたくさんあります。(「\d」で半角数字を全て許容でき、「\D」と書くことで半角数字以外を全て許容出来るなど。)
ぜひ興味がある方は調べてみてください。
CentOS7にEC-CUBE(3.0)をインストールして管理画面を表示させるまで

前提条件：LAMPがインストール済みであること。

EC-CUBE3のソース一式を公式サイトからダウンロードする。
サーバにアップして、DocumentRootに展開する。

httpd.conf

    DocumentRoot "/var/www/html/eccube3/html"
    <Directory "/var/www/html">
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

apacheを再起動する。
mysqlにDBを作成する。

    CREATE DATABASE eccube_db CHARACTER SET utf8;

下記の環境変数を設定する。

    export DBSERVER=127.0.0.1
    export DBNAME=eccube_db
    export DBPASS=password
    export DBUSER=username

下記を実行する。

    cd /var/www/html/eccube3
    php eccube_install.php mysql

下記が表示されたら成功。

    Open your browser and access the http://localhost:8080/

ブラウザにアクセスして管理画面が表示されたらOK。

    サーバのIPアドレスが192.168.1.5の場合
    http://192.168.1.5/admin/

管理画面の初期IDとパスワードは下記。

    ID: admin PW: password
ちょっとずつ読むドメイン駆動設計 第四部 戦略的設計 第十五章 蒸留7 隔離されたコア

# 前回までの第十五章

[コアドメイン1](https://qiita.com/YasuhiroKimesawa/items/899d1b3fd58ca91f525a)
[コアドメイン2](https://qiita.com/YasuhiroKimesawa/items/1aee3602d3aea1cb5b91)
[汎用サブドメイン](https://qiita.com/YasuhiroKimesawa/items/be23f3bd11626265f552)
[ドメインビジョン声明文](https://qiita.com/YasuhiroKimesawa/items/75e270b7d9a624823c1a)
[強調されたコア](https://qiita.com/YasuhiroKimesawa/items/9fdf325ab4cdb9e2286d)
[凝集されたメカニズム](https://qiita.com/YasuhiroKimesawa/items/5e87154185dbef763c51)

汎用サブドメイン、凝集されたメカニズムから蒸留し、コアドメインが浮かび上がってきましたが、ここで本丸登場です。残ったモデルをさらに蒸留していきます。

# 隔離されたコア

モデルをさらにリファクタリングして、コアの概念を**補助的な役割を果たすサブドメイン**から分離し、別のパッケージに入れることで、コアの凝集度を高め、他のコードへの結合を低くします。

補助的な役割を果たすモデルは、はっきりと定義されていないものもあるかもしれないし、分離したのち、コアでないクラス群との関係がさらに曖昧で複雑になることもあるかもしれない。それでもコアと分離して、コアを分離することが大事です。
それは、ソフトウェアの価値がコア、ビジネスの本質的な部分にあるからですね。

## やり方
1. コアを識別する(コアサブドメイン)。ドメインビジョン声明文や蒸留ドキュメントから識別することもできる。
2. 関連クラスを、それを関係づけている概念に由来する新しいモジュールへ移動する。
3. リファクタリングして、概念を直接表現していないデータと機能を切り離す。
4. 他のモジュールとの関係を最小限におさえて明確化する
5. 1から繰り返し

## いつやるか
> システムにとって重要な、巨大な境界づけられたコンテキストがあり、モデルの本質的な部分が大量の補助的な機能のせいでわかりにくくなってきたとき(第十五章より)

## 貨物輸送モデルの例

ここまで読んでも、理解はできるけど、いざ実践となるとどこをコアとするか判断するのは難しそう。
ということで例を読みます。

> この例はコアに駆り立てるほどには入り組んでいないかもしれないが、・・・このモデルが非常に複雑で容易に解釈したり全体として処理したりできないものとして扱って欲しい。

なので、やはり動機は巨大になってきて、モデルの本質的な部分がわかりにくくなってきたときということですね。

> 通常、まず見るべきは「最終的な利益」
> しかし、本当に調べるべきはドメインビジョン声明文
> 営業部門向けに設計されたものではない

ということで、例えば「請求」は、コアではなく、補助的な役割。

> 使用するのは、現場にいるその会社の担当者
> 焦点を合わせるべきなのは、貨物の取り扱い、すなわち、顧客の要件に従って貨物を配送することだ。

とうことで、「配送」パッケージに隔離されたコアを抽出していきます。

という流れです。

## 蒸留

ここまでコアを蒸留していくパターンを読んできましたが、これらは最初からそのように設計できるということではなく、コアが大きくなってきた、本質的なものが見えなくなってきたとき、リファクタリングの結果できることです。

何日か前にアドバイスをいただいたのですが、蒸留はボトムアップのプロセスということ。
なので、何度も見直されるし、コアの元となるドメインビジョン声明文も蒸留ドキュメント、さらにはインセプションデッキも作って終わり、トップダウンで作成されるものではなく、変更されていくもの、ボトムアップで成長させていくものとして扱うことが大切ですね。
符号無し32ビット整数をビット情報としてInspectorに表示する

ビットフラグ的なことはC#ではenumでFlagsアトリビュートを設定して使用するのがベストだとは思いますが、諸事情で派生先にそのenumの定義は任せるけど、基底クラスは情報を持っている必要があるということになったので情報を符号無し整数で扱うことにしました。
そんなわけですからUnityのインスペクター上では当然、何のことやらわからない状態になったので、それを表示するアトリビュートを作りました。

![BitFlagsAttributeDrawer.png](https://qiita-image-store.s3.amazonaws.com/0/54312/0ada9019-3dc2-6684-a249-cfbc646fc350.png)

CustomPropertyDrawerを使ってのエディタ拡張なので、そんなに手間はかかっていません。
手間はかかっていないのですが、覚えては忘れるを繰り返すエディタ拡張にちょっと首を傾げてたりする時間が長かったです。
ただの表示じゃなくて、16進数を入力できるようにもしました（エラーチェックはTryParse頼み）


下位上位の並びがー　とかビットの並ぶ方向がー　
とか、お気に召さないところがあるようでしたら、好きに改造してください。
アトリビュートに食わせるときに設定するフラグを追加して拡張したりしたらフィードバックしてくれると嬉しいです。

単純に16進数を表示してくれる整数フィールドで要件は事足りてたんじゃないかという気もしましたが、きっと気のせいです。

ファイル関係はgistにあげておきました。
以下のツイートを参考にしてください。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">もうどこかの誰かが作っているかも知れない何番煎じかわからないけど、見当たらなかったからちまちま作った。<br>enumでビットフラグを扱うのが普通だろうけど、そうじゃなくてただただビットを見たり編集したい時にどうぞ。<a href="https://t.co/qWQdTHZI2r">https://t.co/qWQdTHZI2r</a> <a href="https://t.co/8UVdklltbK">pic.twitter.com/8UVdklltbK</a></p>&mdash; 鈴森れいや (@leiyasuzumori) <a href="https://twitter.com/leiyasuzumori/status/951370216239345664?ref_src=twsrc%5Etfw">2018年1月11日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


（こんな機能は前にも見かけたような気がしてるんだけどなぁ）
windows10で大規模データを取り扱うときの注意点(Search Indexer, Python)

windows10でCSV形式などの大規模テキストデータを取り扱う際の注意点として、ハマったことをメモしておきます。

# 問題１：Windows Search Indexer が何時間も走りっぱなしになる

(Pro以上? Homeでは同事象出た記憶がないかも。。）

1GBくらいのCSVファイル150本をダウンロードして処理をしていたところ、CPUファンが回って止まらない。。
タスクマネージャーを確認すると、Windows Search IndexerがCPUを50%程度使っている様子。
待てど暮らせどOS再起動すれどプロセスは終わらず、CPUファンは回りっぱなし。。

## 原因：大規模テキストデータがインデックス作成の対象になっていた（様子）

デスクトップにフォルダを作って格納したテキストデータがインデックス作成の対象になっていた（様子）。
デフォルトの設定では、ユーザフォルダ配下は隠しフォルダである AppData を除く全フォルダが対象。
拡張子でも対象の判定があるが、今回処理していたファイルの拡張子は.csv。こちらはめでたくインデックス作成対象となっておりました。

100GBくらいのテキストファイルからインデックス作ってりゃ、そらいつまで経っても終わらんなと。


## 対応：大規模テキストデータを格納したフォルダをインデックス作成対象から外した

以下手順で対応。

1. windowsメニューの横「ここに入力して検索」にカーソルを合わせて「インデックスのオプション」を起動
2. 変更ボタンを押下
3. 対象データが格納されていたフォルダをインデックス作成対象から外す

上記の操作後、しばらくしたらCPUファンが止まり、タスクマネージャーからwindows search indexerが消えていた。。。


# 問題２：大量メモリを扱うPythonの処理がMemoryErrorでABENDする

（こちらはwindows10固有ではなくpythonの問題か）

Pythonで大きめのテキストファイル(1GBくらい)を処理する際に MemoryError が出て PythonスクリプトがABENDする事象に見舞われました。windowsにはメモリ20GBを積んであるので、メモリ不足は全く考えられなかった。

## 原因：32bit版のPythonがインストールされていたため

32bit版Pythonの制約で、メモリを2GBまでしか扱えないようです。
ファイルのopenと処理で処理中に2GBを（瞬間的に？）超えてMemoryErrorが発生したようでした。

## 対応：64bit版のPythonをインストールして差し替えた

インストーラをダウンロードしてきて、64bit版Pythonをインストール、環境変数を書き換えて64bit版Pythonに差し替えたところ、同じPythonスクリプトが問題なく動作しました。
分類したファイルを一つのフォルダに入れ直したいときのコマンド


写真などを時期やイベントごとに分類した後、「結局アップロードする時一括でアップロードしたい」ってなる時ありますよね？（というか今僕が遭遇しました）
そんな時に使えるコマンド
（xargsのオプションはエル（l）でなくアイ（I）です）

```
find [分類したフォルダ名] -type f | xargs -I{} cp {} [新しいフォルダ名]
```

## 分類した写真を一つのフォルダに入れ直す

```:変更前のフォルダ構造
- アルバムフォルダ
 - 正月
  - 写真1.jpg
  - 写真2.jpg
 - バレンタイン
  - 写真3.jpg
  - 写真4.jpg
 ...略...
```

```:変更後のフォルダ構造
- アップロード画像フォルダ
  - 写真1.jpg
  - 写真2.jpg
  - 写真3.jpg
  - 写真4.jpg
 ...略...
```

```:コマンド
find 変更前のフォルダ構造 -type f | xargs -I{} cp {} 変更後のフォルダ構造
```
Ubuntuのアプリケーション一覧やLauncherにAndroid Studioを登録

UbuntuでAndroid Studioを起動する際、コマンドでstudio.shを起動する必要があります。
毎回コマンドを打つのも面倒なので、アプリケーション一覧やLauncherへの登録方法をメモ。

#desktopファイルを作成
/usr/share/applications/
内にandroid-studio.desktopファイルを作成。
```
$ sudo gedit /usr/share/applications/android-studio.desktop
```
上記コマンドでandroid-studio.desktop作成しエディターで表示します。
エディターで下記内容を追加します。
```
[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Name=Android Studio
Icon=/home/user name/directory name/android-studio/bin/studio.png
Path=/home/user name/directory name/android-studio/bin
Exec=/home/user name/directory name/android-studio/bin/studio.sh
```

これでインストール済みアプリ一覧に表示されるので起動できます。
起動後Launcherへの登録でLauncherに登録可能です。
OpenShift上にNode.js環境を作る

[前回](https://qiita.com/miawak2017/items/a99e3b9d8a3c8cd25b4b) サインアップ(登録)から利用開始までを行いました。今回はそこにNode.jsの環境を構築します。

#プロジェクトの作成
![92639489-EDE0-43B6-B230-5067ED2BA1AF.png](https://qiita-image-store.s3.amazonaws.com/0/222266/95787355-f5ce-0e75-9127-706ff84099a5.png)
右上の「Create Project」をクリック


![create_project.png](https://qiita-image-store.s3.amazonaws.com/0/222266/abd4e301-938f-fe4c-76fd-d7d91141b6d0.png)
プロジェクト名、表示名、内容について入力し「Create」をクリック

#使用するアプリの選択
![browse-catalog.png](https://qiita-image-store.s3.amazonaws.com/0/222266/8850b475-a5f7-eb82-44ce-a3e811130c8f.png)
ここではjavaScriptを選択します。

#JavaScriptの種類を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/f55f5588-8611-522d-db6f-efafab96ffd9.png)
JavaScript以外も種々ありますが
ここではNode.jsの最新のものを選択します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/54f90716-1f71-c4ba-723d-cd9916c93b68.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/bc041113-d2c6-b6e3-892a-515e3f3fb237.png)
「next」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/9c1081a9-0ba0-1b83-13b1-e8dfa1769c47.png)
完了しました。右端にgetting started と表示され Node.jsのロゴも出ました。

#作成した環境のステータス確認
作ったプロジェクトの状態を見てみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/9670bce3-40ec-1671-df7b-058614d96068.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/68b3578a-f6dc-d1bb-3d35-f61f98aed746.png)
色々と見るところ、設定するところはありそうです。
上部に表示されているURLをクリックしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222266/4d9220a9-11fd-87c0-9889-ba52d57da720.png)
上の画面が表示されます。
まだまっさらな状態です。

手探り状態ですがプロジェクト設定やアプリの設定、作成したサイトの状態確認などたくさんありそうです。次回からその辺について見てみようと思います。
ガチアサリと貧富の差

## はじめに
[「サイコロゲームと貧富の差」](https://qiita.com/kaityo256/items/69668bf5a92d538c24ae)という記事で紹介されていた「一見平等に見えるルールが不平等を生む」ゲーム、どこかでみた気がしてよくよく考えたら **コレSplatoon2の「[ガチアサリ](https://topics.nintendo.co.jp/c/article/d16f95eb-d0ad-11e7-8cda-063b7ac45a6d.html)」のルールっぽいな** と思い、「ガチアサリ」のルールで「貧富の差」（勝敗の差）が生じないか簡単に確かめてみました。

## 簡易ガチアサリのルール

簡易ガチアサリとして次のようなゲームを考えます＊

（＊実際のガチアサリはもっと複雑で面白いゲームですがここではシミュレーションの都合上めちゃくちゃ簡単なルールで考えます）

1. 最初8人がアサリを4つずつ持っている
1. 1試合の時間は300秒（5分）
1. 8人にはそれぞれ1~8までの番号が振られており、1~4がAチーム、5~8がBチームとする
1. 1秒の間に8面サイコロを二回振り、最初に出た目の人が、次に出た目の人にアサリを一つあげる。ただし、最初の人がアサリを持っていない場合はそのまま。
1. 1秒に1回アサリがランダムに生まれ1~8番の人の手に渡される
1. アサリが増えたタイミングでアサリの個数が10個超えたら即10個アサリを持ったプレイヤーがいるチームに1ポイント入るとする
1. 以上の 4~6 が試合終了まで繰り返される
1. 試合終了時点でポイントの多いチームが勝利

## シミュレーション

Pythonの書き捨てコードのため色々テキトーですが、上記ルールだと次のようなコードになりそうです。

```python:asari.py
# -*- coding: utf-8 -*-
import numpy as np

def GachiAsari(a,k):
  GA = 10
  if GA <= a[k]:
    a[k] = 0
    if k < 4:
      p[0] = p[0] + 1
    else:
      p[1] = p[1] + 1

def WinAsari(win,p):
  if p[1] < p[0]:
    win[0] = win[0] + 1
  elif p[0] < p[1]:
    win[1] = win[1] + 1

if __name__ == '__main__':

  S = 8
  Time = 300
  N = 100
  win = np.zeros(2)

  for num in range(N):
    a = np.full(S, 4)
    p = np.zeros(2)
    for i in range(Time):
      k1 = np.random.randint(S)
      k2 = np.random.randint(S)
      if a[k1] != 0:
        a[k1] = a[k1] - 1
        a[k2] = a[k2] + 1
        GachiAsari(a,k2)
      k3 = np.random.randint(S)
      a[k3] = a[k3] + 1
      GachiAsari(a,k3)
    WinAsari(win,p)

  print('A:{0} B:{1} ({2})'.format(win[0],win[1], win[0]/win[1]))
```

`S` が人数、`Time`が試合時間(sec), `N`が試合回数、GA（ガチアサリ）がアサリ10個のことです。実行すると次のようになります。

Aの隣の数が100試合したうちのAチームの勝利数、Bの隣の数がBチームの勝利数です。括弧に入った数はAチームの勝利数をBチームの勝利数で割ったものです。

```:Terminal
$ python asari.py
A:51.0 B:43.0 (1.18604651163)
```

N=100（100試合分）を10回くらい実行すると次の結果になりました。100試合程度だと、まれに5割程度の勝敗の差が生じることもあるようです。

```
A:43.0 B:40.0 (1.075）
A:40.0 B:42.0 （0.952380952381)
A:38.0 B:42.0 (0.904761904762)
A:55.0 B:34.0 (1.61764705882)
A:47.0 B:41.0 (1.14634146341)
A:41.0 B:46.0 (0.891304347826)
A:35.0 B:54.0 (0.648148148148)
A:50.0 B:36.0 (1.38888888889)
A:42.0 B:46.0 (0.913043478261)
A:39.0 B:47.0 (0.8297872340425532)
```

N=1000（1000試合分）を10回くらい実行した場合。ざっと見るとN=100の時よりチームの勝敗の差は少ないっぽいです（せいぜい1~2割以内）。1000試合というと5分×1000回≒83時間程度ゲームをプレイした場合と考えられます。

```
A:431.0 B:426.0 (1.011737089201878)
A:428.0 B:428.0 (1.0)
A:412.0 B:429.0 (0.9603729603729604)
A:428.0 B:419.0 (1.0214797136038185)
A:420.0 B:450.0 (0.9333333333333333)
A:466.0 B:399.0 (1.167919799498747)
A:451.0 B:412.0 (1.0946601941747574)
A:430.0 B:415.0 (1.036144578313253)
A:414.0 B:447.0 (0.9261744966442953)
A:456.0 B:420.0 (1.0857142857142856)
```
## まとめ

[「サイコロゲームと貧富の差」](https://qiita.com/kaityo256/items/69668bf5a92d538c24ae)という記事で紹介されていたゲームをSplatoon2のガチアサリっぽくルールをアレンジしてチームの勝敗を計算してみました。

元記事からみたら厳密な議論は何もしていないですが、なんとなく **簡易ガチアサリのルールの場合、1000試合（ざっくり100時間）くらいプレイすればそれほど極端な勝敗の差は生まれなさそう** な印象を受けました。

**ガチアサリの運要素を減らすためにもっとSplatoon2で遊ぼう（？）**というメッセージ（誰からの？）かもしれませんね（笑）

## 参考
* [サイコロゲームと貧富の差] (https://qiita.com/kaityo256/items/69668bf5a92d538c24ae)
rubyでノンブロッキングなread

https://docs.ruby-lang.org/ja/latest/method/IO/i/read_nonblock.html
`IO#read_nonblock`なるものがあるのでこれを使う。

1秒毎に入力をチェックして、入力があれば入力されたデータを出力し、入力されていなければ`no`を出力するサンプル。
`read_nonblock`して空だったときに`IO::EAGAINWaitReadable`が発生するので拾って無視している。

```ruby

require 'socket'

reader, writer = IO.pipe

Thread.new do
  while data = gets do
    writer.puts(data)
  end
end

while true do
  sleep 1
  begin
    puts reader.read_nonblock(100)
  rescue IO::EAGAINWaitReadable
    puts 'no'
  end
end
```
Windows 10 Pro Hyper-VのVMの複製のスクリプト

[この記事](https://qiita.com/whale_shark/items/11a2b0a36c5dfe27e9f0)の作業を可能な限り自動化するためスクリプトファイルを作成した。

https://github.com/whale-shark/CopyHyperVvmdx

# 前提

* すでに複製元の仮想マシンがある事
* 複製元の仮想マシンにチェックポイントがない事
* CentOS以外は動かないかも

# 設定

CopyHyperVvm.ps1ファイルを開いて、環境に合わせて変数を変更する。

# 実行方法

管理者でCopyHyperVvm.ps1ファイルを実行する。
完了後、[リンク先](https://qiita.com/whale_shark/items/11a2b0a36c5dfe27e9f0#efi-boot%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90)以降の作業を行う。
Ubuntuが起動できずBusyBoxが表示された時の対処法

# はじめに
Ubuntuをメイン環境として使い始めた頃、半年ごとのアップデートを行って最新のバージョンを使っていたのですが、バージョンアップに失敗して痛い目をみてからは、2年ごとのLTSをクリーンインストールすることにしています。
2年くらい使っていると色々と動きが怪しくなってくるので、心機一転クリーンインストールから始めるのが、私の使い方では丁度いいようです。
ですが、後数ヶ月でクリーンインストールのタイミングなのに、起動に失敗するようになってしまった時に、調べた対処法です。
私の環境では、運良く起動できるようになりました。
# 軽い対処法
軽度の問題ならば、画面のメッセージに従って、下記のコマンドを入力すれば、修復が実行されます。
デバイス名は、実際のメッセージの指示に従ってください。

```bash
(initramfs)fsck -y /dev/sda1
```

# 深刻な場合はこっち
HDDのダメージが深刻な場合には、下記のオプションを入力します。
不良セクタをマークするとかしているみたいですね。

```bash
(initramfs)fsck -t -y -f -c /dev/sda1
```


# 再起動
リセットボタンを押して再起動させるのは怖い(笑)ので、コマンドで再起動させます。

```bash
(initramfs)reboot
```
[EXCEL VBA]正規表現を用いて、アクティブシートのテキストボックスの数字をすべてコンマ付きに変えるマクロ

#アクティブシートのテキストボックスの中の数字を正規表現を使ってコンマ付き数字に変える

##注意点
 - 複数の行にまたがっている数字はうまく変換できない可能性があります。
 - Format関数で変換するので、整数位が15桁の整数まで対応します。それ以上はExcelが対応していません。
 - 半角数字が対象で、全角は対象にしていません。
 - 全シートを対象にテキストボックスで正規表現を用いると予期しない変換を起こす危険があるため、アクティブシートのテキストボックスのみ対象にしています。
 - コード中まいなすとひらがなにしているのは可読性を高めるためでタイポではありません。
 
##動作のながれとポイント

 1. アクティブシートのShapeをFor Eachでチェックしてテキストボックスを探す。この時のタイプはmsoTextBoxであること
 2. テキストボックスの文字列をいったん全部取得する。このときTextFrame2を使う。PublisherなどはTextFrameなのだが、Excelは異なっている。
 3. 正規表現で4種類のものを探す。任意の単語境界の前にある数字。行頭は前に何も文字がない数字の連続、それ以外は数字以外のものが来たときから任意の単語境界までの数字の連続を検索する。
 4. このときマイナスがついていてもマッチするので場合分けする
 5. さらに小数点がある場合を除外
 6. マイナスかどうかで場合分け
 7. マイナスではない場合、1文字目が数字かどうかをユーザー定義関数で判定
 8. マッチした文字をFormatでコンマ付きに変換"#,##0"
 9. これを繰り返し、最後にテキストボックスの文字列を入れなおす。



##コード

```vbnet:addCommaXlTxtBox
Sub addCommaXlTxtBox()
'For Excel
'VBScript Regular Expression 5.5 Reference Setting
'ActiveSheetのすべてのテキストボックスの数字をコンマ付きに変換する
'小数点があっても区別する
Dim wb As Workbook: Set wb = ThisWorkbook
Dim ws As Worksheet: Set ws = ActiveSheet 'ActiveSheetのみに制限しています
Dim shp As Excel.Shape
Dim REG As RegExp: Set REG = New RegExp
Dim buf As String, buf1 As String, buf2 As String
Dim tF2 As Excel.TextFrame2, i As Long, ileng As Long
Dim M As Match, Ms, sMs As SubMatches, m2 As Match
For Each shp In ws.Shapes
If shp.Type = msoTextBox Then
shp.Select 'テキストボックスを選択する
Set tF2 = shp.TextFrame2 'ExcelはTextFrame2になる
buf = tF2.TextRange.Text ’文字箱(テキストボックス)の文字をいったん全部読み込む
With REG
Debug.Print buf
.Global = True
.MultiLine = True
.Pattern = "([^0-9][0-9]+\b|[0-9]+\b|[^0-9][0-9]+\.\d{1,}\b| [0-9]+\.\d{1,}\b)"
'([^0-9][0-9]+\b 数字以外と数字の連続で任意の単語境界
'[0-9]+\b数字の連続で任意の単語境界
'[^0-9][0-9]+\.\d{1,}\b数字以外と数字の連続(小数点を含む)で任意の単語境界
'[0-9]+\.\d{1,}\b 数字と小数点、その下に1つ以上の数字の連続のあとに任意の単語境界
Set Ms = .Execute(buf): Debug.Print Ms.Count '検索して適合集合の作成
For i = 0 To Ms.Count - 1 'ポイント:マッチ順に変換するため文頭からカウントする
Set M = Ms.Item(i)
'小数点が頭にある場合はこんまがいらないのでカットする
If Left(M.Value, 1) <> "." Then
'まいなすではないとき
If Left(M.Value, 1) <> "-" Then
buf1 = M.Value
If CheckIsNumber(buf1) = True Then
'1文字目が数字ならそのまま1回だけ変換する
buf = Replace(buf, M.Value, Format(buf1, "#,##0"), 1, 1, vbTextCompare)
Else
'1文字目が数字でないなら2文字目からFormatで変換し、1文字目の数字以外のものを付ける
buf1 = Mid(M.Value, 2, M.Length)
buf = Replace(buf, M.Value, Mid(M.Value, 1, 1) & Format(buf1, "#,##0"), 1, 1, vbTextCompare)
End If
Else
'まいなすのとき
buf1 = Mid(M.Value, 2, M.Length)
buf = Replace(buf, M.Value, Left(M.Value, 1) & Format(buf1, "#,##0"), 1, 1, vbTextCompare)
End If
End If

Next i
tF2.TextRange.Text = ""
tF2.TextRange.Text = buf ’変換後の文字列をいれる
Exit Sub
End With
End If
Next
End Sub

Function CheckIsNumber(str As String) As Boolean
'最初の文字が数字か否かを確認する関数
'文字列として数字が入る
Dim ile As Long
Dim Rex As RegExp: Set Rex = New RegExp
On Error Resume Next
'型変換をしてエラーが出るかを確認する
ile = Mid(CStr(str), 1, 1)
If Err.Number <> 0 Then
'エラーが発生したら数字ではない
CheckIsNumber = False: Exit Function
Else
'長整数型に変換できれば数字
CheckIsNumber = True: Exit Function
End If
End Function
```

#アドインにいれてもいいかもしれない
これはとても便利なのでアドインにいれてもいいと思う。
すでにいくつか紹介しているが、アドインの作り方もリンクがあるので参考にしてください。

[入力した文字列を式にするマクロ](https://qiita.com/Q11Q/items/c518c9280326fa4fed1c)
[移動方向を切り替えるマクロ](https://qiita.com/Q11Q/items/15a6b167a204e3ad9cdc)
delombokする時はsourcepathを通そう、という話

あまり会社での内容は書くことなかったけど珍しく詰まったのでメモ。
しょーもないところで引っかかってましたがむーんというお話。

#背景

インスペクションテストの導入に当って試しにプロダクトにテスト実行したところ検証不可のエラー。
内容としてはlombokで自動生成されるコードに対してはツールが解決できず、ファイル全体が検証対象から外れてしまうとのこと。

なのでlombokが用意している自動生成されるコードを出力できる*delombok*の機能を利用して解析可能にしよう、というのが趣旨。javadoc生成などでも同様の手段が取られる事があるそう。

#実現方法

ビルドにantを利用しているので、公式記載の例を元にantのターゲットに追加する。
https://projectlombok.org/features/delombok

一部差異があるのが、利用しているlombokのバージョンによって参照するclassが異なるようです。
利用しているバージョンに準拠して下記クラスを指定する。

```xml
<taskdef classname="lombok.delombok.ant.DelombokTask" name="delombok" classpath="lombok.jar" />
```


#エラーandエラー

いざ```ant delombok```で実行するとエラー。
コードの出力時に一旦コンパイルをかける？のかライブラリが参照できてなさそう。
通常のコンパイルで利用しているclasspathを追加してライブラリを参照できるようにする。

```xml
<classpath refid="compile-classpath" />
```


これで無事コンパイルできるようになった、、、と思いきやまだエラー、、、
内容はまたコンパイルエラーで今度はプロダクト内のjavaファイルを参照できていないらしい。

通常javacでコンパイルするときは```srcdir```オプションでsourcepathを明示的に指定してあげる必要がある。そうしないとjavaファイル内のパッケージのパスが解決できない。

delombokではその指定のオプションが例には記載がない。（antのホームディレクトリからよしなにしてくれると思ってた、、、）
ドキュメントなども見当たらずどのようなオプションを指定すればいいかもわからないまま何日かを過ごす、、、


結局delombokコマンドライン実行時のオプションから適当に記載すると正しく処理できた。

```xml
<delombok verbose="true" encoding="UTF-8" to="[処理後のファイル出力先]" sourcepath="[ソースパス]">
```


最終的に下記のようなターゲットになった。

```xml
  <target name="delombok">
    <taskdef classname="lombok.delombok.ant.DelombokTask" name="delombok" classpath="lombok.jar" />

    <delombok verbose="true" encoding="UTF-8" to="[処理後のファイル出力先]" sourcepath="[ソースパス]">
      <fileset dir="処理対象ディレクトリ" includes="**/*.java" />
      <format value="suppressWarnings:skip" />
      <classpath refid="compile-classpath" />
    </delombok>
  </target>
```


公式でマニュアルかドキュメントないんでしょうか？？
ありそうなもんですが見つけられなかった、、、

delombok後、マルチバイト文字がunicodeに置換されているものを戻すなど細々したスクリプトを用意したのはまた別で書きます。
ブラックホールDNS ~ dns lookupに対して、唯一のIPを返す

たとえば、工場などで、とにかく、とあるサーバへつなぎたい、という要望があるとする場合、どうしますか？
正式名称どころか、1文字、あるいは、最初のアクセスが生じたときに、自動的にリダイレクトしたい、と思うときが、ありましょう。

正しい表現ではないですが、ホテルやパブリックのWiFiをつないだ時に、強制誘導されるweb siteというイメージでしょうか？
とりあえず、何をURLに入力しても、とあるサイトにつなぎたい、ということでしたら、bindを次のように設定すればOK

```named.conf
zone "." {
    type master;
    file "/etc/bind/db.fakeroot";
};
```

```db.fakeroot
@ IN SOA ns.domain.com. hostmaster.domain.com. ( 1 3h 1h 1w 1d )
  IN NS <ip>
* IN A <ip>
```

引用元は、https://serverfault.com/questions/396958/configure-dns-server-to-return-same-ip-for-all-domains/397011です。
自分の備忘録を兼ねて、記録しました。

複数、仕分けしたければ、Zoneの設定を増して、引っかかる順番を考慮すれば、うまく引けるはずです。

なお、これだけが唯一、というわけではないです。そこは、突っ込まないでください。

おしまい
BigQueryにコマンドラインからデータを読み込ませる


とても基本的な内容だが、AWSと比べると公式ドキュメント以外の情報が少なく、作業に時間がかかったのでメモしておく。

## 基本的にはここを読めばよい（公式ドキュメント）

 * https://cloud.google.com/bigquery/loading-data?hl=ja#

## ファイル（JSON形式）から読み込む例
### やること
あらかじめ作成した`foo`というデータセット内に、`a`(STRING)、`b`（STRING）のスキーマをもつ`bar`テーブルを作成し、用意したデータを読みこませる。

### 前提
 * bqコマンド（コマンドラインからBigQueryを扱うツール）がインストールされ、その周辺の設定（認証など）が完了していること
 * `foo`データセットを作成済みであること
    * `bar`テーブルは作成不要。勝手に作成される。

### 読み込ませるデータの用意
改行区切りで、JSONのデータ（オブジェクト？）を並べる。

```
$ cat /tmp/data.json 
{ a: "key1", b: "value1"}
{ a: "key2", b: "value2"}
```

### 読み込ませる

```
$ bq load --source_format=NEWLINE_DELIMITED_JSON project_name:foo.bar /tmp/data.json a:STRING,b:STRING
```

 * CSVファイルを読みこませる場合は、"source_format"の指定は不要
 * テーブルが作成済み（スキーマも指定済み）の場合は、コマンドライン上でのスキーマ定義は不要
 * ローカルからはなく、GCSから読み込ませることも可能
    * "gs://[bucket-name]/data.json"のような指定になる

## おまけ
### GCSへのファイルのアップロード

```
$ gsutil cp /tmp/data.json gs://[bucket-name]/data.json
```
キーボード開発者の称号

#これなぁに
キーボード開発者（キーボード・オーダー）の称号の定義を以下に記す．

##キーボード・マスター
キーボード開発に関し圧倒的な知見を持つ。
キーボード開発に関する他者からの質問に対し的確な回答をすることができる。
キーボード・イニシエイトをキーボード・パダワンにまで成長させ、その功績をキーボード・カウンシル（後述）に認められ、カウンシルメンバーの2/3の票を得ることによって与えられる称号。

##キーボード・ナイト
キーボードを一人で設計・開発まですることができ、リリース経験のある者に与えられる称号。
キーボード・イニシエイトを持つことを許される。

##キーボード・パダワン
提示された設計要件を満たす、仕様書通りのキーボードを開発できる者に与えられる称号。

##キーボード・イニシエイト
キーボード開発新参のプログラマ・コーダー。

#キーボード評議会（キーボード・カウンシル）
キーボード・カウンシルとはキーボードマスターの内・キーボードエンジニアの階級を決めることができる者達の委員会。
キーボード・カウンシルのメンバーはキーボードのデザインスペースの先導者として責任のある振る舞いをすることが期待される。

#キーボード・シス
自らの抱えるキーボード開発案件を放棄し辞めた者，キーボード・カウンシルへの反逆行為を行なった者達のこと。
キーボード開発の暗黒面。
キーボード・カウンシルの全会一致によりキーボード・オーダーから追放された場合キーボード・シスとなる。
Numpyで行列の範囲外を切り抜くとどうなるか

Numpy を使います。
[Online Editor](https://www.tutorialspoint.com/execute_python_online.php)を使えば自分の環境を汚さずに使えます。


## 要素単体で範囲外を参照

要素単体で範囲外を参照してみます。
random.randで適当なfloat行列を作れるのでテスト時に重宝しますね。

```python3
import numpy as np

A = np.random.rand(5,5)
B = A[-6,-6]
print(A)
print(B)

```
結果は当然エラーです。

```
IndexError: index -6 is out of bounds for axis 0 with size 5
```

きちんと範囲外であることを教えてくれます。

## 範囲外を含むCropを行った場合

### 切り抜きの作法 VS matlab
Numpyの切り抜きはMatlab使いとしては不思議な書き方で，以下のように書きます。
スタートする行と列，それに切り抜きのサイズを加えたものを書きます。

```python3
A[row:row+h,col:col+wid]
```

なお，MATLABだと以下のようになります。

```matalb
A(row:row+h-1,col:col+wid-1)
```
一見くどいですが，これはCropの始まる列と終わる列を書くので直感的にわかりやすい（と思っています）。

### 切り抜きのエラーは空Arrayを返す。

本題にうつると以下のように範囲外の部分を含む行列を書くとEmpty Arrayを返します。

```python3
import numpy as np

A = np.random.rand(5,5)
B = A[3:3,3:3]
print(A)
print(B)
print(B.size)
```
なお，空のArrayはsizeが0であることで見抜けます。MATLABみたいにisempty的なのがあればよかったのに（要調査）。
Debugのときに役立ててください。

```
[[ 0.69854315  0.83308108  0.66557232  0.27758132  0.39308571  0.70643012]
 [ 0.54305722  0.39600401  0.40206199  0.79224479  0.66720215  0.25355632]
 [ 0.35509515  0.37872672  0.24820214  0.08225086  0.03877466  0.42718548]
 [ 0.33554461  0.59891833  0.11223246  0.33976823  0.53329896  0.90859096]
 [ 0.56158341  0.48374031  0.1829933   0.12855241  0.82018729  0.42246654]
 [ 0.80543369  0.00844302  0.4601397   0.15118067  0.24652464  0.76726793]]
[]
0
```

## 二次元の切り抜き失敗例
切り抜き失敗してもサイズが保存されることが有ります。

```python3
A = np.random.rand(5,5)
print(A)
B=A[1:6,1:4]
print(B)
print(B.shape)
C=A[-1:3,1:4]
print(C)
print(C.shape)
```

上のコードを試すとわかります。（エディタが糞重くなったので中断）
Elastic Beanstalkの.ebextensionsでIntel MKLをインストール

AWS Elastic Beanstalkの環境に、Intel Math Kernel Library(Intel MKL)をインストールするための.ebextensions集です。


## 前提条件

Beanstalkのプラットフォームは、`64bit Amazon Linux 2017.09 v2.6.3 running Python 3.6` で確認しています。

以下の手順を実行する前に、intel.comでMKLのregistrationをしておく必要があります。（手順的には必要ないですが、ライセンス的に）

## .ebextensions

処理の都合上、１つのconfigファイルでは完結できないので、以下のconfigを順番に実行する必要があります。

### リポジトリを登録

[Installing Intel® Performance Libraries and Intel® Distribution for Python* Using YUM Repository](https://software.intel.com/en-us/articles/installing-intel-free-libs-and-python-yum-repo) に記載のリポジトリを登録します。

```yaml:01-mkl-repo.config
commands:
    01-add-repo:
        command: yum-config-manager --add-repo https://yum.repos.intel.com/setup/intelproducts.repo
    02-import:
        command: rpm --import https://yum.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
```

### Intel MKLライブラリをインストール

yumパッケージ名は上述したIntelのドキュメントに記載されています。`intel-mkl` だけで指定したいところですが、正しいパッケージ名を書かないとBeanstalkのデプロイでエラーになります。

```yaml:02-mkl-package.config
packages:
    yum:
        intel-mkl-2018.1-038: []
```

### 共有ライブラリのディレクトリを登録

```yaml:03-mkl-ldconfig.config
files:
    "/etc/ld.so.conf.d/intelproducts.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            /opt/intel/compilers_and_libraries/linux/mkl/lib/intel64
commands:
    ldconfig:
        command: ldconfig
```

### numpy, scipyのビルド設定

これは厳密にはIntel MKLとは関係ないですが、MKLを入れる目的はnumpy, scipyで使うためなので、こちらに記載してます。

numpy, scipyのビルド時にMKLが使われるようにするのと、numpy, scipyをインストールする際にwheelを使わず、MKLをリンクしてビルドするための設定です。

ついでに、ビルド時に必要なgfortranもインストールします。

参考: [pip で MKL にリンクされた numpy, scipy が自動的にインストールされるようにする](https://qiita.com/grafi/items/3f24b514d46c41cc9c58)

```yaml:04-mkl-numpy.config
packages:
    yum:
        gcc-gfortran: []
files:
    "/root/.numpy-site.cfg":
        mode: "000644"
        owner: root
        group: root
        content: |
            [mkl] 
            library_dirs = /opt/intel/compilers_and_libraries/linux/mkl/lib/intel64
            include_dirs = /opt/intel/compilers_and_libraries/linux/mkl/include 
            mkl_libs = mkl_rt 
            lapack_libs =  
    "/root/.config/pip/pip.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            [install]
            no-binary = numpy,scipy
            [wheel]
            no-binary = numpy,scipy

```

## おわりに

numpy, scipyのインストールは、アプリケーションのrequirements.txtでやってください。

上記の手順でBeanstalk環境にMKL+numpy,scipy環境がセットアップされますが、scipyのコンパイルに時間がかかるので、実際は毎回ビルドせずに、一度ビルドしたらwheel化しておいた方が良いかもしれません。
開発者ツールのデバッグ種類

■何かイベントリスナーに引っかかったら処理を止める
Sourceタブ→右エリアEvent Listnener Breakpointsの内任意のチェックボックスにチェック
※デバッグで止まった時に右エリアEvent Listnener Breakpointsの該当イベントが黄色マーカになる

■コードをステップ実行する方法
[コードをステップ実行する方法  |  Chrome DevTools  |  Google Developers]<https://developers.google.com/web/tools/chrome-devtools/javascript/step-code?hl=ja>

■セレクタの要素が変わったタイミングでブレークポイント
Chrome＞Elements＞セレクタを右クリック＞Break on＞下記のどれかを選択
・subtree modifications・・・要素が変更されたとき
・attribute modifications・・・要素の属性が変更されたとき（attr()など）
・node removal・・・要素が削除されたとき

[ブレークポイントでコードを一時停止する  |  Chrome DevTools  |  Google Developers]<https://developers.google.com/web/tools/chrome-devtools/javascript/breakpoints?hl=ja>

■URLを実行する
XHR/Fetchブレークポイント
→例えば「https://test?d=20200101&q=abcd」みたいなURLを実行するとしてXHR/Fetchブレークポイントのキーワードで「q」を設定しておけばそこで止まる

■document.ready実行前にブレークポイントを設定する
調査中。
例えばSourceタブ＞Ecent Listener Breakpoints＞Script＞Script First Statementにチェック
TypeScript を使って Alexa Custom Skills を作ろう (2) 環境構築

# 前回
前回の投稿では、アーキテクチャパターンを考え、ディレクトリ構成を決めました。
実装に入る前にまずは、環境を作っていきましょう！

# 開発環境を作ろう

## おっとその前に、筆者の環境
筆者の環境は, 以下です。
エディターは個人の好きなものでよいでしょう。
以降については、筆者環境で進めます。

分類 | 項目
|:--|:------------------|
| OS | macOS High Sierra |
| エディタ | Visual Studio Code |

## さあ、作ろう

### git のインストール

git のインストールは割愛します。

### nodebrew のインストール

Node.jsのインストールにはこちらのバージョン管理ツールを使用します。
[nodebrew](https://github.com/hokaccha/nodebrew#install)


```bash:インストール
$ curl -L git.io/nodebrew | perl - setup
```

```bash:pathを追加
$ export PATH=$HOME/.nodebrew/current/bin:$PATH

$ source ~/.bashrc
```

```bash:動作確認
$ nodebrew help
```

### Node.js のインストール

[AWS Lambda Lambda 実行環境と利用できるライブラリ](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/programming-model.html)

> AWS Lambda では以下のバージョンがサポートされています。

> - Node.js – v4.3.2 および 6.10.3

ここでは、 **6.10.3** をインストールします。

```bash:インストールの前に、保存先作成
$ mkdir -p ~/.nodebrew/src
```

```bash:インストール
$ nodebrew install-binary v6.10.3
```

```bash:使用するバージョンに切替（初回なので、一個しかないですが）
$ nodebrew use v6.10.3
```

```bash:カレントバージョン確認
$ nodebrew ls
v6.10.3

current: v6.10.3
```

この時点でnpmもインストールされるはずです。

```bash:npm確認
$ npm -v
```

### ASK CLIのインストール

[Quick Start Alexa Skills Kit Command Line Interface (ASK CLI)](https://developer.amazon.com/ja/docs/smapi/quick-start-alexa-skills-kit-command-line-interface.html)
ついでにASK CLIも入れちゃいます。

```bash:インストール
$ npm install -g ask-cli
```

### Visual Studio Code 利用者のみ

便利な拡張機能達をインストールします。

[拡張機能パック Node.js Extension Pack](https://marketplace.visualstudio.com/items?itemName=waderyan.nodejs-extension-pack)
[TypeScript リンター TSLint](https://marketplace.visualstudio.com/items?itemName=eg2.tslint)

以上！
・・・ちょっと不安、気づいたら修正します。

# まとめ
この投稿では、開発に必要なアイテム達をインストールしました。
次回は、いよいよ[実装](https://qiita.com/daisukeArk/items/56e53c2970d6a6f5c808)です！
早くコード書きたいな。
[Swift] Notificationの管理を楽チンにする

Swift4 にてNotificationのobserverの追加に関数を渡せるバージョンができてかなりわかりやすくなりました。

が、addObserver(forName:object:queue:using:)の戻り値を確保しておく必要があり、非常に面倒くさいです。

```swift

class Hoge {

    var observing: [NSObjectProtocol]

    init() {
 
        let o0 = NotificationCenter.default.addObserver(forName: NSView.frameDidChangeNotification, queue: nil, object: nil) {
                
            print("observe", $0)
        }
        observing += [o0]

        let o1 = NotificationCenter.default.addObserver(forName: NSView.didUpdateTrackingAreasNotification, queue: nil, object: nil) {
                
            print("observe", $0)
        }
        observing += [o1]
 
       // まだまだつづくよー
    }
 
    deinit {
        observing.map(NotificationCenter.default.removeObserver)
    }
}
```
すごくアホっぽいです。

なので、アホっぽさを隠してみました。

```swift
/// 開放時にremoveObserver(_:)を実行してくれるクラス
class NotificationObserver {
    
    private var observer: [NSObjectProtocol] = []
    
    func addObserver(forName name: Notification.Name, object: Any?, queue: OperationQueue? = nil, using block: @escaping (Notification) -> Void) {
        
        observer += [NotificationCenter.default.addObserver(forName: name, object: object, queue: queue, using: block)]
    }
    
    deinit {
        observer.map(NotificationCenter.default.removeObserver)
    }
}
```

使用法

```swift
class Hoge {
    
    let observer = NotificationObserver()
    
    init() {
                
        observer.addObserver(forName: NSView.frameDidChangeNotification, object: nil) {
                
            print("observe", $0)
        }
        
        observer.addObserver(forName: NSView.didUpdateTrackingAreasNotification, object: nil) {
            
            print("observe", $0)
        }
    }
}
```

スッキリ！
WindowマシンへのMySQL Community Serverのインストール、および、サンプルデータベースの作成方法

# はじめに

WindowsマシンへのMySQL Community Serverのインストール、および、サンプルデータベースの作成方法について記載します。

# MySQL Community Server・Workbenchのインストール

[こちらのページ](https://dev.mysql.com/downloads/mysql/)にアクセスして、インストーラMSI形式のビルドをダウンロードします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/dffba075-1939-4777-eb7c-ff684c6c912a.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/8fad1669-9a59-b406-1132-94837ec53114.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/40cf5597-6ce3-2dd9-4103-e55f7e34bfe0.png)

ダウンロードしたMSI形式のインストーラを起動します。先にODBCのアップグレードが求められる場合はウィザードに従い進み完了させます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/08388103-44a7-770d-f1b7-866a7878b88c.png)

「Add」ボタンでインストールコンポーネントを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/b78cf5e1-6d43-305a-c9f0-deaeb72de3ee.png)

「Select Product and Reatures」にて、「MySQL Server 5.7.20 - X64」、および、「MySQL Workbench 6.3.9 - X64」を選択して次に進みます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/884ca8de-3d8a-522b-9a84-6508ef8746b5.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/bc71647d-7abd-f9a4-3deb-313af4f3fc77.png)

コンポーネントのインストールが終わり、初期設定（Config）に進みます。ウィザードを進めると、データベースのrootユーザのパスワードを設定する画面となりますので設定して、あとはデフォルト設定のまま進みます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/7f0db252-4eca-42ab-0f74-4a3c0db8e2c2.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/ed97e4cf-48ca-8745-9c3e-42daeeeba257.png)

インストールが終了するとMySQL Workbenchが起動します（※起動しない場合はスタートメニューから起動してください。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/06a1fb3c-b4ce-6e12-a9b7-18a5ba42802c.png)

ConnectionsのLocal instance MYSQL57を選択して、インストール時に設定したrootユーザのパスワードを入力して「OK」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/058dfc0e-d61c-a653-da3e-b74ca56cfde0.png)
MySQL WorkbenchのUIが起動するので、「ServerStatus」が「Running」になっていることを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/a3d82d98-c9ff-55b3-61ce-e6054bd936ca.png)

# MySQL サンプルデータベースの作成

MySQLのサンプルデータベースは[こちらのページ](https://dev.mysql.com/doc/index-other.html)にあります。今回はsakilaデータベースのZIPファイルをダウンロードします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/e41b2987-d179-c94a-8471-c2d01cea547d.png)

ダウンロードしたZIPファイルを解凍すると以下の３ファイルが格納されています。

- sakila.mwb
- sakila-data.sql
- sakila-schema.sql

「sakila-schema.sql」ファイルをMySQL Workbenchで開き、実行します。これによりスキーマおよびテーブルが作成されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/5e33efc0-ed75-c128-fb93-dabef0fa5981.png)

続いて「sakila-data.sql」を同様にMySQL Workbenchで開き、実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/0cb0fd6f-12c5-61fe-240c-805b10a0d6d1.png)

左側のSCHEMAのリフレッシュを行うと、sakilaデータベースが作成されているので、Table内のactorテーブルを右クリックして「Select Rows - Limit 1000」を選択するとSQLが生成されて該当テーブル内のデータが表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/2fd9f11a-670a-eda0-dc89-41d63419c9a2.png)

# まとめ

WindowsマシンへMySQL Community Server・Workbenchをインストールして、サンプルデータベースの作成してデータにアクセスする事ができました。
Windowsコマンド使いたくないけど、仕事ではbat作成ばかり。けど、わからない。

WindowsPCを最近勉強のために、持ち始めた私にとって「Windowsコマンドって何ですか？」状態。

ってことで、bat作成を最近始めた私がよく使うけど、これって何って思ったものを備忘録として書こう!
よく使う順で、かつ、上からよく書いているものの順番で書いています。自分なりに。
日本語下手なので、伝わらないと思います。自分用に書きます。

#よく見るWindowsコマンド
##@echo off
コマンドプロンプトを開いた時に出てくるフォルダパスなどを含む、コマンド実行画面が表示されない。

##echo
echo以降を表示する。例えば、以下の通り。

```
set aaa=0
echo %aaa%
pause
```
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
コマンド実行画面
0
続行するには何かキーを押してください・・・
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
と、出力がされる。

##pause
画面の一時停止になる。
コマンドプロンプト上に、以下の文言が出てくる。
「続行するには何かキーを押してください・・・」
BATのコードを確認する時に、めちゃくちゃ使う。
細かくpauseを書いては、どこまで正しいのか調べるのに重宝している。

##setlocal enabledelayedexpansion
こいつがよくわからない。
遅延環境変数なんだって。
要は、他のBATから引数として変数を使用する時に、他のBATの変数に影響を与えないようにするために書くらしい。（多分伝わってない。）
例えば、A.batの中にある%ABC%をB.batで呼び出そうとする。
もちろんB.bat内にcall　~~A.batと記載する。
そこで、%ABC%を呼び出し利用。変数の中身を入れ替えた場合でも、A.bat内の%ABC%は元のままということです。

他にも、if文内で変数を宣言して作成しても、使えなかったのが使えるようになります。
正しくは、使えるけども変数の値が遅延するということです。
変数を使用するときの書き方は、%ABC%ではなく、!ABC!と記載してください。


#続きは随時更新していこう。
cssの擬似要素のメモ

# cssの擬似要素について

## 経緯

フォントアイコンと文章を並べた時に、表示位置がずれるのが気になった。
これを解決するために、要素に事前に追加する機能があると知り、利用した。

## 概要

擬似要素には::before, ::afterの二種類がある。文字通り、要素の前・後を担当する。

```
h1::before {
  content: '内容';
  〜スタイル指定〜
}

.example::after {
  content: '内容';
  〜スタイル指定〜
}
```

contentに内容を書く。

:(コロン)の数が一つか二つかの違いは、css2, css3のバージョンによる違いである。将来的には::二つが主流になるようだが、未対応ブラウザもあるので、現状は:が対応ブラウザが多いようだ。

## position

この擬似要素を任意の位置に表示させるために設定するのがpositionだ。

```
名前 {position : 値}
```

値には以下の四つが入る。

- static：初期値。指定することはほとんどない
- relative：現在の位置を基準に相対的な位置を決める
- absolute：親要素を基準に絶対的な位置を決める
- fixed：画面のきまった位置に固定する

最終的に、このpositionを細かく調整して、無理やり意図した位置に持っていった。
もっと簡潔にする方法があるとは思うのだが、分からず。

参考：

- https://saruwakakun.com/html-css/basic/before-after
- https://saruwakakun.com/html-css/basic/relative-absolute-fixed
- https://saruwakakun.com/html-css/basic/display#section4
chainerにearly stoppingを追加してもらった話

# Chainer, Early Stopping

下記の２つのプルリクエストを通して，
chainerにearly stoppingを追加してもらいました．
（とても丁寧なレビューをしていただいた徳居さんに感謝...！）

- https://github.com/chainer/chainer/pull/3351
- https://github.com/chainer/chainer/pull/4079

このearly stoppingは，kerasのEarlyStoppingを翻訳した形で実装しています．
これの意味するところは，EarlyStoppingTriggerは`学習を打ち切る処理`のみを行なっているということです．

学習停止時点までで監視していた指標でもっとも良い性能を発揮した重みを読み込むためには，
@koreyouさんが[ChainerでのEarly stoppingを再考する](https://qiita.com/koreyou/items/1982c2ac5bf0191fbe6b)で紹介してくださっているように，
MaxValueTrigger(MinValueTrigger)とsave/restoreを組み合わせた機構をtrainerに追加する必要があります．
これはkerasのModelCheckpointに相当します．

early stoppingを使うためには，以下のようにトリガを作成します．
`monitor`でearly stoppingが監視する指標を設定します．
`max_trigger`はearly stoppingが起きなかった場合にどこまで学習を行うかを指定します．([exampleでの該当箇所](https://github.com/chainer/chainer/blob/master/examples/cifar/train_cifar.py#L71))

```py3
stop_trigger = triggers.EarlyStoppingTrigger(
    monitor='validation/main/loss',
    max_trigger=(20, 'epoch'))
```

あとは，この`stop_trigger`をtrainerに渡してあげればよいです．([exampleでの該当箇所](https://github.com/chainer/chainer/blob/master/examples/cifar/train_cifar.py#L78))

```py3
trainer = training.Trainer(updater, stop_trigger, out=args.out)
```

つかってください，よろしくお願いします！
KotlinでのAlertDialog


個人的なメモとして残しておきます。

```kotlin
AlertDialog.Builder(this)
     .setTitle("エラー")
     .setPositiveButton("ok"){ dialog, which ->
     }.show()
```

この書き方がまだまだ慣れない、、、
`.setPositiveButton("ok"){ dialog, which -> }.show()`
PowerShellって、初めて使った。何ができるのか知らなかったけど、確認ダイアログまで出せるなんて知らなかったわ〜

今週の業務は軽くPowerShellを使ってみたので、ご紹介を。
Batを作成することはあったけど、PowerShellを組み込んだのは初めてだったから、面白かった。
確認ダイアログとかを出せるなんて知らなかった。PowerShellが他にどう使うのかも知らないけど...

##PowerShellで確認ダイアログを表示。
めっちゃ簡単だった。
```
@powershell 'add-type -assemblyName System.Windows.Forms''[System.Windows.Formr.MessageBox]::Show('表示したいMSGを入力','タイトル','OKCancel','None');'
```
上記の内容をBAT内に組み込むと確認ダイアログが出てきた。（確かこんな感じで記載した。）

'表示したいMSGを入力'⇨お好きに入力してください。確認内容などが入力されるかと

'タイトル'⇨タイトルバーに内容が映し出されます。

'OKCancel'⇨この場合は、'OK'と'キャンセル'と選択肢部分で表示されます。
この他にも、'OK'のみとか'はい'と'いいえ'とかにも変更できるようです。

'None'⇨これはダイアログ内のアイコンを何にするか。'None'の場合は何もなし。


実行画像がないのは、Macユーザーだということでご了承ください。
でも、PowerShellは色々と簡単にできるイメージだから、今後の業務も抵抗感なくできるかな。
なんか色々とググったけどエラーが出たりとかして、できなかった。
最初は、ダブルコーテーションとかで囲ってあってダメだったし、訳のわからない文字列が入ってて、できないし...
まぁ、今はこうやって業務をこなすしかないな。
【MapKit】MKMapSnapshotter で地図のスナップショットを取得する

# これは何

iOS 7 から追加された `MKMapSnapshotter` を用いて、地図のスナップショット（画像）を取得する方法をメモします。

# なぜスナップショットを取得するのか

ユーザーが地図を操作する必要が無い場合、静止画として表示した方が負荷を抑えられるためです。
特に `UITableView` のセルにいくつも地図を表示する場合など、効果を発揮します。

# 実行環境

* Xcode 9
* Swift 4

# 実装方法

まずは下記のサンプルコードを実行してみましょう。

```swift
let coordinate = CLLocationCoordinate2DMake(37.331652997806785, -122.03072304117417)
let span = MKCoordinateSpanMake(0.003, 0.003)

let options = MKMapSnapshotOptions()
options.size = CGSize(width: 300, height: 300)
options.region = MKCoordinateRegion(center: coordinate, span: span)
options.scale = UIScreen.main.scale
options.mapType = .standard

let snapshotter = MKMapSnapshotter(options: options)
snapshotter.start(completionHandler: {(snapshot, error) in
    let image = snapshot?.image
})
```

## 実行結果

`image` には次のような画像がセットされます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/3c0cc38f-8ec5-5dbf-4d2d-2350b10f636a.png)

以下、ソースコードの内容を解説していきます。

## 解説

まずは地図の中心点（緯度と経度）、表示する範囲をセットします。


```swift
let coordinate = CLLocationCoordinate2DMake(37.331652997806785, -122.03072304117417)
let span = MKCoordinateSpanMake(0.003, 0.003)
```

次に、`MKMapSnapshotOptions` を用いて取得するスナップショットのサイズ、解像度、地図タイプ（航空写真など）をセットします。


```swift
let options = MKMapSnapshotOptions()
options.size = CGSize(width: 300, height: 300)
options.region = MKCoordinateRegion(center: coordinate, span: span)
options.scale = UIScreen.main.scale
options.mapType = .standard
```

最後に `MKMapSnapshotter` の `start()` メソッドを実行し、スナップショットを非同期で取得します。

```swift
let snapshotter = MKMapSnapshotter(options: options)
snapshotter.start(completionHandler: {(snapshot, error) in
    let image = snapshot?.image
})
```

## 補足

`MKMapSnapshotOptions` の `showsBuildings`, `showsPointsOfInterest` プロパティによって、地図上の建物やPOIの表示・非表示を切り替えることができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/50a884a9-ced5-2362-d4a4-65d8d637595f.png)
▲何も表示しない例

# リンク

* [Putting Map Kit in Perspective \- WWDC 2013 \- Videos \- Apple Developer](https://developer.apple.com/videos/play/wwdc2013/309/)
* [Swift 3 Add custom annotation pin to MKMapSnapShotter snapshot - Stack Overflow](https://stackoverflow.com/questions/42757185/swift-3-add-custom-annotation-pin-to-mkmapsnapshotter-snapshot) - `MKAnnotationView` で表示したピンもスナップショットに収めたい場合はこのQ&Aが参考になります。
とりあえずWindows10でHeadlessChromeを使ってスクレイピングしてみる

もっとウェブブラウザに頑張って欲しい…

## 環境
Windows10
Google Chrome 63.0.3239.132(ChromeDriver 2.35)
Python 3.6.3(Anaconda利用)
selenium 3.8.0
beautifulsoup4 4.6.0

## 準備
Anacondaをインストール、Anaconda Promptで`pip freeze`でseleniumが入っていることを確認
[ここ](https://sites.google.com/a/chromium.org/chromedriver/downloads)からChromeドライバをダウンロード
解凍したらスクリプトと同じフォルダに配置(きっともっといい配置方法があると思いますがやり方がわからないので放置)

## コード
stackoverflowからそのままなページがあるのでそれをとりあえずコピペとBeautifulSoupを組み込む
https://stackoverflow.com/questions/45364102/how-do-i-use-headless-chrome-in-chrome-60-on-windows-10

```test.py
from selenium import webdriver
from bs4 import BeautifulSoup

options = webdriver.ChromeOptions()
options.add_argument("headless")
driver = webdriver.Chrome(chrome_options = options)
driver.get('https://news.yahoo.co.jp/')
soup = BeautifulSoup(driver.page_source, "lxml")
driver.quit() 

hoges = soup.find_all('p', class_='ttl')
for hoge in hoges:
	print(hoge.text)
```

## 結果
とりあえずニュースタイトルが取れたのでここから更に発展させていきたい。
CodeIQ「進捗いいわけマーク」問題に参加しました。

[「進捗いいわけマーク」問題](https://codeiq.jp/q/3519)の公開期限が終了したということで、自分の提出コードを公開したいと思います。利用言語はC#。ここ2-3か月C#の勉強中のため、腕試し的に解いてみました。

```csharp
using System;
using System.Linq;

public class Program
{
    public static void Main(string[] args)
    {
        var x = int.Parse(Console.ReadLine());
        var ans = Draw(x);
        Console.WriteLine(ans);
    }

    public static string Draw(int x)
    {
        if (x % 2 == 0)
        {
            return "invalid";
        }

        var mid = x / 2;
        var matrix = Enumerable.Range(0, x).Select((i) => Enumerable.Repeat(".", x).ToList()).ToList();
        foreach (var i in Enumerable.Range(0, x))
        {
            foreach (var j in Enumerable.Range(0, x))
            {
                if (j == mid || ((i == 0 || i == x - 1) && (j == mid - 1 || j == mid + 1)))
                {
                    matrix[i][j] = "i";
                }
            }
        }

        return string.Join(System.Environment.NewLine, matrix.Select((row) => string.Join("", row)));
    }
}
```

まず`.`で埋められたn×nの二次元配列を準備し、その要素をすべてなめながら、適切な位置`i`に置き換えるというロジックになります。ただ改めて見返してみると――もうちょっと書きようがあったような気がします(´・ω・｀) とくに「二次元配列の要素をすべて探索する」部分は計算量が$O(n^2)$になるということもあり、見直したい。今回は`n`の制約が1-100と小さかったからTLEしませんでしたが……。

あとはLINQをもう少しうまく使いこなしたいですね。上記のコードだと二次元配列の生成と初期化ぐらいにしかLINQを利用していません。LINQは高機能でかつ可読性にも優れているので、活用してきたいですね。まあC#初心者ということで許してください(´・ω・｀)

お断り:CodeIQの解答を公開するのはサービスの性質上、基本的にはNGですが、出題者が了承する場合はOK－－という運用というか風潮があります。今回は[出題者である@tbpgrさんのOKが出ている](https://twitter.com/tbpgr/status/951111975999696901)ため、解答を公開しています。
開発未経験者がWEBエンジニアを目指す-5

##最近のこと
転職活動を毎日のように行なっていたら、更新することすら忘れていた。。。
あまり勉強が進んでいない、、、
最近はProgateで最後のPHPの学習まで進んだ段階で、「あれ？最初の方どんなことやったっけ？」となってしまったため、"paizaラーニング"というものを使用して基礎からもう一度復習しました。
→変数/ランダム関数/演算子/値段計算/IF文(複数の条件分岐も)/比較演算子

上記のものを使用して、おみくじを作ったり、サイコロも、値段計算も簡単いできちゃうからきっともっと深く知ったらさらに楽しいんだろうなあ(←早く環境構築やれ)

```aaa.php
<?php
$age = rand(15,22); // 何才かを$ageに15~22をランダムで代入する
echo $age;
if($age < 18){
    echo "高校生";
}elseif($age == 18){
    echo "どちらかわからない";
}else{
    echo "大学生";
}
?>
```
レッスンにはこれと似たようなものを各レッスン後に演習課題として行う。
一歩一歩ゆっくりと勉強ができるので、自分のペースでやる身としては良いかもしれない！

次は、環境構築をしてみたの記事を投稿するぞ！！
Phalcon configの環境切り分け方法

`fastcgi_param` で任意の変数（ここでは`APP_ENV`）を設定することで、`php-fpm`へ環境変数を渡せます

```nginx:nginx.conf
location @app {
    fastcgi_pass  unix:/var/run/php-fpm/php-fpm.sock;

    fastcgi_split_path_info ^(.+\.php)(/.+)$;

    # Nginx側で環境設定を切り替え
    fastcgi_param APP_ENV   development;

    include fastcgi_params;
}
```

```php:config.php
return new \Phalcon\Config([
    'production' => [
        'database' => [ 'host' => 'production.db' ]
    ],
    'staging' => [
        'database' => [ 'host' => 'staging.db' ]
    ],
    'development' => [
        'database' => [ 'host' => 'development.db' ]
    ],
]);
```

```php:index.php
$di->setShared('config', function () {

   $config = include APP_PATH . "/config/config.php";

   return $config->get(getenv('APP_ENV'));

});
```
Linuxコマンドtips

# はじめに
サーバ構築時に知っていると、ちょっと役にたつ小技についてのtipsになります。


## tips
- psの出力結果をgrepコマンドでパイプし、「USER」または「apache」を含む行だけを表示 
`ps aux | grep 'USER\|apache' | grep -v grep`

- コマンドの実行時間を計測
`time [任意のコマンド]`

- CPUの情報を個別表示
`dstat -c -C0,1`

- ディレクトリ内のファイルのサイズ変化を監視 
`watch -n1 -d “ls -l [対照ディレクトリ]”`

- フォアグラウンドで出力を続けて、リアルタイムにパケットの情報を画面表示
`tcpdump -nl -i eth0 not tcp port 22`

- TTLを1にセットしたrequestパケットを送信
`ping -t1 -c1 [IPアドレス]`

- デフォルトのUDPパケットの代わりに、ICMP echo request パケットを使用する
`traceroute -nI [IPアドレス]`

- 指定したPIDのプロセスのCPU使用率に関する情報を表示する
`pidstat -u -p [PID] [秒]`　    /CPU
`pidstat -r -p [PID] [秒]`　    /メモリ
`pidstat -r -d [PID] [秒]`　    /IO(カーネル2.6.20以上が必要)
ImageViewで表示されている画像をBitmap型で取得する(Kotlin)

個人的なメモとして残しておく

## 一応できたけど本当にこれでいいの？

ImageViewに張り付いている画像を取得したかったがいろいろはまってしまった、、、
一応デバッグ実行してちゃんととれているのは確認したんですが、本当にこれでいいんですかね？、、、、

※Kotlinで書いているのでご了承ください

```kotlin
val groupIcon = (uploadeImage.drawable as BitmapDrawable).bitmap

```
なんか美しくない、、、
もっといい方法あったら教えてください、、、