OmniAICreator/Qiita-1.07M huggingface dataset:
プログラマが英文を訳して、英語に親しむ（技術的情報はないです！）

Dennis MacAlistair Ritchie (September 9, 1941 – c. October 12, 2011)[2][3][4][5] was an American computer scientist.[2] He created the C programming language and, with long-time colleague Ken Thompson, the Unixoperating system.[2] Ritchie and Thompson were awarded the Turing Award from the ACM in 1983, the Hamming Medal from the IEEE in 1990 and the National Medal of Technology from President Bill Clinton in 1999. Ritchie was the head of Lucent Technologies System Software Research Department when he retired in 2007. He was the "R" in K&R C, and commonly known by his username dmr.

デニス・マカリスタ・リッチー（１９４１年９月９日生まれ。２０１１年１０月１２日没）はアメリカのコンピューター科学者である。リッチーは長く同僚だったケン・トンプソンと共にコンピュータ言語CとUnixオペレーティング・システムを創り出した。１９８３年にACMのチューリング賞を受賞し、１９９０年にIEEEのハミングメダルを受賞し、そして、１９９９年にビル・クリントン大統領からアメリカ国家技術賞を受賞した。リッチーは２００７年に引退するまで、ルーセント・テクノロジーソフトウェアのリサーチ部門を指揮していた。リッチーは、「K&R C」（カーニハン＆リッチーのC）の「R」であり、アカウント名dmrでよく知られている。
ビルドタイプを追加すると依存モジュールでもそのビルドタイプが要求されてしまう問題の解決法

# 背景

複数のモジュールに依存しているプロジェクトで、メインとなる app モジュールに `staging` というビルドタイプを追加してプロジェクトを Gradle Sync すると、次のようなエラーが発生しました。

```
Unable to resolve dependency for ':app@staging/compileClasspath': Could not resolve project :your-another-module. Open File Show Details
```

# 原因と解決法

依存している `your-another-module` というモジュールに `staging` という名前のビルドタイプが存在しないことが原因のエラーのようです。

これは Android Gradle Plugin 3.0 での変更点で、以下に記述があります。

[Android Plugin for Gradle 3.0.0 への移行 | Android Studio](https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html?hl=ja#resolve_matching_errors)

## matchingFallbacks

`matchingFallbacks` を使用して、特定のビルドタイプが存在しなかった時に使用するビルドタイプを定義できます。

```gradle:build.gradle
android {
    buildTypes {
        release {
            ...
        }
        debug {
            ...
        }
        staging {
            matchingFallbacks = ['debug']
        }
    }
}
```

このように定義しておくと、 `stating` ビルドタイプが依存モジュールに存在しない場合に `debug` ビルドタイプが使用されます。

`matchingFallbacks` には複数のフォールバック先を指定することが出来るため、たとえば

```gradle:build.gradle
staging {
    matchingFallbacks = ['qa', 'debug']
}
```

のように指定できます。この場合、依存モジュールに `staging` ビルドタイプがあればそれが使用され、なければ `qa`, `debug` の順に存在が確認され存在するものが使用されます。 

# 参照

このエラーの原因がわからず、検索の仕方が悪かったのか、ロシア語の以下のサイトを見つけるまで解決できずに悩んでました..

- http://qaru.site/questions/631564/android-studio-3-gradle-40-shrinkresources-libraryproject-unable-to-find-a-matching-configuration-in-project
- http://qaru.site/questions/631566/gradle-plugin-300-beta-4-buildtypematching-has-been-removed-use-buildtypesnamefallbacks/2489742#248974
英語好きな人だけどうぞ！

Dennis MacAlistair Ritchie (September 9, 1941 – c. October 12, 2011)[2][3][4][5] was an American computer scientist.[2] He created the C programming language and, with long-time colleague Ken Thompson, the Unixoperating system.[2] Ritchie and Thompson were awarded the Turing Award from the ACM in 1983, the Hamming Medal from the IEEE in 1990 and the National Medal of Technology from President Bill Clinton in 1999. Ritchie was the head of Lucent Technologies System Software Research Department when he retired in 2007. He was the "R" in K&R C, and commonly known by his username dmr.

デニス・マカリスタ・リッチー（１９４１年９月９日生まれ。２０１１年１０月１２日没）はアメリカのコンピューター科学者である。リッチーは長く同僚だったケン・トンプソンと共にコンピュータ言語CとUnixオペレーティング・システムを創り出した。１９８３年にACMのチューリング賞を受賞し、１９９０年にIEEEのハミングメダルを受賞し、そして、１９９９年にビル・クリントン大統領からアメリカ国家技術賞を受賞した。リッチーは２００７年に引退するまで、ルーセント・テクノロジーソフトウェアのリサーチ部門を指揮していた。リッチーは、「K&R C」（カーニハン＆リッチーのC）の「R」であり、アカウント名dmrでよく知られている。
phpmyadminにアクセスできなかったら

環境：
CentOS7
Apatch2.4.7

phpmyadminインストールして、いざアクセスしたときに
###You don't have permission to access /phpmyadmin on this server

とエラーが出たら、Apatchの設定を見直す。

```
# vi /etc/httpd/conf.d/phpMyAdmin.conf

<Directory /usr/share/phpMyAdmin/>
   <IfModule mod_authz_core.c>
     <RequireAny>
       Require ip 127.0.0.1
       Require ip ::1
       Require ip 192.168.xxx.　　←ここ追加。接続元のIPアドレス
     </RequireAny>
   </IfModule>
```

接続元IPは、CentOSサーバから見たIPじゃないとダメ。
yumでインストールした場合、CentOSサーバから見たIPは、/var/log/httpd/access.logやerror.logにが記載されてる。

その他の書き方は以下。

`Require all granted`
無条件でアクセス許可。

`Require all denied`
無条件にアクセス拒否。

`Require env env-var [env-var] ...`
指定された環境変数のいずれかが設定されている場合にのみ、アクセス許可。

`Require method http-method [http-method] ...`
指定されたHTTPメソッドに対してのみアクセス許可。

`Require expr expression`
expressionがtrueと評価された場合にアクセス許可。

`Require user userid [userid] ...`
指定されたユーザーのみアクセス許可。

`Require group group-name [group-name] ...`
指定されたグループのユーザーのみアクセス許可。

`Require valid-user`
すべての有効なユーザーにアクセス許可。

`Require ip 10 172.20 192.168.2`
指定されたIPアドレス範囲内のクライアントにアクセス許可。(今回はコレ)

■参照：Apatch 
https://httpd.apache.org/docs/2.4/ja/mod/mod_authz_core.html#require
ZabbixをDockerで試用する

# 概要
- Zabbixを本格導入する前に、機能や操作感を確認したい人へ
- 公式ページの[5 Installation from containers](https://www.zabbix.com/documentation/3.4/manual/installation/containers)に手順があります
- ただし、オプションを色々設定して、4つのコンテナを立ち上げる必要があります
- そこで、1コンテナ用のDockerfileを用意しましたので、ご参考下さい
- Dockerfileを作成するのも面倒な人用に、Docker Cloudにイメージをアップしましたので試して下さい。

```
$ docker run -d -p 10051:80 --name zabbix --restart=always maedamikio/zabbix
```

# 手順
- 日本語、メールサーバーも加えてます
- MySQLではなく、MariaDBにしています。コンテナ内のMySQLだと色々苦行になります。私は疲れました。

## Dockerfileを作成しましょう
```
$ vim Dockerfile
FROM ubuntu:latest
ENV DEBIAN_FRONTEND=noninteractive \
    LANG=ja_JP.UTF-8 \
    LC_ALL=ja_JP.UTF-8
RUN set -ex && apt-get update && apt-get upgrade -y && apt-get install -y \
    language-pack-ja \
    mariadb-server \
    postfix \
    wget
RUN wget http://repo.zabbix.com/zabbix/3.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.4-1+xenial_all.deb && dpkg -i zabbix-release_3.4-1+xenial_all.deb
RUN set -ex && apt-get update && apt-get install -y \
    zabbix-frontend-php \
    zabbix-server-mysql \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
RUN service mysql start && \
    mysql -e"create database zabbix character set utf8 collate utf8_bin;" && \
    mysql -e"grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';" && \
    zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql -uzabbix -pzabbix zabbix && \
    sed -i 's|# DBHost=localhost|DBHost=localhost|' /etc/zabbix/zabbix_server.conf && \
    sed -i 's|# DBPassword=|DBPassword=zabbix|' /etc/zabbix/zabbix_server.conf && \
    sed -i 's|# php_value date.timezone Europe/Riga|php_value date.timezone Asia/Tokyo|' /etc/apache2/conf-enabled/zabbix.conf && \
    sed -i 's|;date.timezone =|date.timezone = Asia/Tokyo|' /etc/php/7.0/apache2/php.ini
CMD service apache2 start && \
    service mysql start && \
    service postfix start && \
    service zabbix-server start && \
    tail -f /dev/null
```

## ビルドして起動しましょう
```
$ docker build -t zabbix .
$ docker run -d -p 10051:80 --name zabbix --restart=always zabbix
```

## ブラウザで接続しましょう
[http://localhost:10051/zabbix](http://localhost:10051/zabbix)

- Configure DB connection
    - Password: zabbix
- Sign in
    - Username: Admin
    - Password: zabbix

## 確認が終わったら、削除しましょう
```
$ docker rm -f zabbix
```

# 備考
そうそう、バージョンは、3.4.7です。
[リポジトリ](http://repo.zabbix.com/zabbix/)に4.0が無かったので諦めました。
wordpressのデータ一通り流し込んだ初期構築後に「やちゃった」と思った時に効く小技

Wordpressでデータを大量に扱う場合にCSVやスクリプトの配信などを使って流し込んだりします。
その後、数件程度なら手動で修正も効きますが、〇万件になってくると無理です。
そんな時に役立った技を追加していこうと思います。

とくにカスタム投稿、カスタムフィールド部分は各サイトごとにオリジナルだけあり、
結構厄介な部分かと思います。

#データを入れ終わった後、コメントを一括許可・一括拒否(非許可)にする方法
データ入れた後に気が付くことが多々あるコメント入力フォーム。
「あれ、全部公開になってる」「全部非公開になってる」なんてのはざらです。
そんなときは　MySQLに繋ぐか、phpmyadmin で使えます。

初心者でも該当部分を変更するだけでこのままコピペすれば問題なく変更できます。

```
phpmyadmin ＞ログイン＞該当データベース選択＞SQL選択します。
```

##一括許可
```
UPDATE wp_posts SET comment_status='open' WHERE post_type='post';
```

post_type='post';をpost_type='カスタム投稿名';にすれば
どんなカスタム投稿のコメントでも一括で許可できます。

##一括拒否(非許可)
```
UPDATE wp_posts SET comment_status='close' WHERE post_type='post';
```

post_type='post';をpost_type='カスタム投稿名';にすれば
どんなカスタム投稿のコメントでも一括で拒否(非許可)できます。

#Wordpressで文字列間違った時に使える一括置換
カスタムフィールドを一括で入力したのに間違った！なんてのもざら。

「TelじゃなくてTellだ」「imagesじゃなくてimageだ」
そんな時にMySQLかphpmyAdminへログインしてSQLを実行します。

##SQL実行例
```
UPDATE テーブル名 SET カラム=REPLACE(カラム, 検索文字列, 置換文字列);
```

##SQL実例
カスタムフィールドの場合は
postmetaにあるmeta_keyのカスタムフィールド名(例えばcftelをcftell)に修正したい場合。

```
UPDATE wp_postmeta SET meta_key=REPLACE(meta_key, cftel, cftell); 
```

これで実行すれば修正されます。
結構よく使うので、「そう言えば、こんなのあったな」程度に覚えておくと
後で窮地を脱出できるかも知れません。
Ubuntu16.04にcuda8+cudnn7のインストール(以前のバージョンからアップデート)+Deep Learning Studioインストール

# Ubuntu16.04にcuda8+cudnn7のインストール(以前のバージョンからアップデート)+Deep Learning Studioインストール
[Deep Learning Studio](http://deepcognition.ai/desktop/)を使おうとしたのですが、今まで使っていたcudaとcudnnが古いらしく使えなかったので、アップデートしました。

- インストールしてあるCUDA、Cudnnの削除

  ```bash
  $ sudo apt-get purge cuda* 
  $ sudo apt-get autoremove
  $ sudo rm -r /usr/local/cuda-xx/lib64/libcudnn**
  ※xxはインストールしてあるバージョンを入れる
  $ sudo rm -rf /usr/lib/x86_64-linux-gnu/libcudnn**
  $ sudo ldconfig
  ```

- cuda8+cudnnのインストール

  ```bash
  $ sudo apt-get install cuda-toolkit-8-0
  ※tar -xzvf cudnn-8.0-linux-x64-v7.1.tgz をnvidiaのページからダウンロード
  $ tar -xzvf cudnn-8.0-linux-x64-v7.1.tgz 
  $ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
  $ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
  $ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
  $ sudo ldconfig
  ``` 

  - リンクが上手くいかない場合は、以下を試してみるといいかも

  ```bash
  $ cd /usr/local/cuda/lib64
  $ sudo ln -sf libcudnn.so.7.1.2 libcudnn.so.7
  $ sudo ln -sf libcudnn.so.7 libcudnn.so
  $ sudo ldconfig
  ```

- Deep Learning Studioのインストール
 - http://deepcognition.ai/desktop/ から deep-learning-studio-manager-1.5.1-x86_64.AppImageをダウンロードする

  ```bash
  $ sudo chmod a+x deep-learning-studio-manager-1.5.1-x86_64.AppImage
　$ sudo ./deep-learning-studio-manager-1.5.1-x86_64.AppImage
  ```

 - あとはhttp://deepcognition.ai/wp-content/uploads/2018/03/DLS-Quick-Start-Guide-Ubuntu.pdf を見ながら実行すればインストールできます。
Sublime Text役にたつ機能(更新中)

Sublime Textの基本機能

検索

```
    Find… ファイル内の検索
    Ctrl(Cmd) + F
```


置換

```
    Replace… ファイル内の検索・置換
    Ctrl + H (Cmd + opt + F)
```


マクロ機能

```
STにはマクロ機能もデフォルトで備わっています。
自分が行った操作(コマンドの組み合わせ等)を記録しておける機能です。
もちろんショートカットキーを割り当てることもできます。

Record Macro/Stop Recording Macro マクロの記録を開始・終了する
Ctrl(Control) + Q
メニューのTools > Record Macro またはショートカットキーCtrl(Control) + Qでマクロの記録を開始します。
ここから記録終了までの操作がマクロとして記録されます。

Tools > Stop Record Macro かもう一度Ctrl(Control) + Qを押すとマクロの記録を終了します。

保存しない限りマクロは直近の1つしか記録できません。また、保存せずにSTを閉じると記録したマクロは消えるので注意が必要です。

Playback Macro 記録したマクロを実行する
Ctrl(Control) + Shift + Q
Tools > Playback Macro で記録した直近のマクロを実行します。

Save Macro… マクロを保存する
Tools > Save Macro… をクリックするとマクロを保存できます。拡張子は「.sublime-macro」にします。
保存する場所はPackages/User以下にします。User以下にフォルダを作って入れても構いません。

例: mymacro.sublime-macro

マクロをキーボードショートカットに登録する
保存したマクロはTools > Macros から実行できますが、よく使うものはショートカットキーを割り当てた方が便利ですよね。

キーボードショートカットはSublime Text > Preferences > Key Bindings – User で自分用にカスタマイズすることができます。

例えば、「Cmd + Shift + Opt + :」にmymacro.sublime-macroというマクロを登録したい場合は、Key Bindings – User に以下を追記します。

{
"keys": ["super+shift+alt+:"],
"command": "run_macro_file",
"args": {"file": "Packages/User/mymacro.sublime-macro"}
}
※commandキーはsuperと書きます。

これで登録したマクロをショートカットキーで使えるようになります。

マクロはプラグインなどと組み合わせることもできるので、アイディア次第でいくらでも応用可能です。
```
[iOS] Module compiled with swift 4.0 cannot be imported in swift 3.1 的なエラーの対処方法

ビルドしようとした時、とあるライブラリでタイトルのエラーが出ました（バージョンは異なる）。
そのエラーの解消方法を調べてみたら、以下のStackOverFlowのページで解決できたので共有しておきます。

[STACK OVER FLOW - Module compiled with swift 4.0 cannot be imported in swift 3.1
](https://stackoverflow.com/questions/44475274/module-compiled-with-swift-4-0-cannot-be-imported-in-swift-3-1/44475321)

1. 対象となるライブラリをpodfileから消して、pod update
2. 再度podfileに追加して、pod update
3. 最後にXCodeのProduce　- Clean　をして、Build
MD600のキー変更手順メモ

MD600を買ったので自分のキー変更の手順をメモしておく。

- 左CtrlをFNに変更
- FNを←に変更
- PNを↓に変更
- 右Ctrlを→に変更
- 右Shiftを上に変更

その他のWin-左ALT切り替えや、CapsLockのCtrl化はkarabinaに任せている状態。

```
[FN]+[左Shift] 3秒長押し
[FN]
[左Ctrl]
```

```
[左WIN]+[右ALT]+[右スペース]
```
Apache JMeter4.0 インストールとプラグイン

簡単な負荷テスト要件があったためJMeterの設定について記載します。
CentOS7も詳しくないですし、JAVAもよくわからないしましてやWebも携わったことないので参考程度に留めていただけるようお願いします。

### 環境
* CentOS 7.4
* JMeter 4.0 r1823414  

### JMeterのインストール
特筆することない感じです。
JavaをCentOSにインストールして、JMeterをダウンロードするだけです。
リポジトリにありました。

```
# yum install java-1.8.0
```

GUIないと厳しいので、サーバGUIインストールしました。

```
# yum groupinstall "Server with GUI"
```

Apache JMeterサイトは2018年3月現在だと4.0 r1823414が最新のようです。
最新だとコードがチューニングされていてよりよい負荷がかけられることを期待できます。公式のマニュアルでも最新を使うよう推奨されているようです。
バイナリをダウンロードして適当なディレクトリに展開します。
ダウンロード元は以下です。
https://jmeter.apache.org/download_jmeter.cgi

```
# tar xvfz apache-jmeter-4.0.tgz
```

常に日本語で使用したい。
jmeterの起動スクリプトみたいなのをja_JPっぽくしました。

```
# diff bin/jmeter.new bin/jmeter
< : "${JMETER_LANGUAGE:="-Duser.language=ja -Duser.region=JA"}"
---
> : "${JMETER_LANGUAGE:="-Duser.language=en -Duser.region=EN"}"
```

### プラグイン
しばらくいろいろ試していたのですが、ある程度のことをするとプラグインが必要になってきました。いろいろなやり方があるようですが、plugin-managerを入れてGUIからコントロールするとスマートなようです。

このURLからダウンロードできます。個人的にはわかりにくかった。jarファイルなのでchromeでは警告が出ました。気にしない。

https://jmeter-plugins.org/get/

このjarをlib/extにコピーするだけです。
GUIのオプションの一番下にPlugin Managerのメニューが出ます。
JMeter Pluginの公式マニュアルどおりでした。

#### その他
いろいろなWebサイトがあるわけですからJMeterの具体的な設定に正解があるわけでもなく設定関係は圧倒的にサンプルとかドキュメントが少なく感じました。
何かあまりWeb上にないおもしろい設定等がありましたら後日、設定等のTipsも掲載予定です。

#### 参考URL等

https://jmeter.apache.org/
https://jmeter-plugins.org/wiki/PluginsManager/#Installation-and-Usage
API駆動開発のすゝめ

# 注意事項
これはstmkzaの主観と偏見に基づく一方的な考えに偏った記事です。読むときは気をつけてください

# API駆動開発とは
多分普通に使われるわけじゃないです。自分が勝手に命名した名前です。
Webアプリを作るときに先にサーバ側のAPIを作ってから、フロントエンドをJavaScript+HTMLで作って、フロントエンドをAPIを叩くだけの画面にする開発方法です

## 欠点
- 基本的にオフラインで使えるアプリが作れない
- サーバとフロントエンドの開発の同時進行が難しい
- APIを使った迷惑行為の対策が難しい
- ログインが必要なサイトを作ると複雑になる

## 利点
- 一番大変なサーバ側を先に作ることでモチベーションがなくなるのを防ぐ（一番重要）
- APIを公開するときにかなり楽できる
- フロントエンドは他のアプリのものを流用できる
- 多言語化するときもサーバを修正する必要がない（データ構造が変化する場合を除く）
- フロントエンドを作る時にAPIが仕様書になってくれる
- フロントエンドはただのHTMLなのでCDNを使った配信が楽
- APIサーバの転送量が減らせる
- かなりレガシーな方法で作っても全く問題ない。むしろフレームワークを使ったら複雑すぎて余計に辛い
- 大体のAPI仕様書は自動生成できる

このように利点が大きいので、自分は最近この方法ばかりを使ってるような気がします。

# 開発の流れの例
1. 扱うデータとそれに関連するCRUD操作を考える
1. 誰がその操作をできるかを考える
1. データベースの構造を考える
1. データを操作するWebAPIを作る
1. フロントエンドを作る

# 使う技術の例
- サーバ：PHP(php-fpm)+nginx(URLルーティング)+SQLite3(PDO)
- フロント：Bootstrap+jQuery
- フレームワークを全く使わない

# オススメする対象
- 趣味でプログラミングをやってる場合
- そこまで大規模じゃないアプリを作る場合
- フレームワークがアレルギーの人
- 短期間でアプリを作りたい人
- ログインが必要ないサイトを作る場合

# オススメしない対象
- 仕事でプログラミングをやってて、詳しい仕様書が必要な場合
- 大規模アプリを作る場合
- フレームワークの熱狂的ファン
- 時間はどれだけでもあるから王道の方法で作りたいという人
- 複雑なアクセス制御が必要になる場合

何かいいアイディアあれば教えてください
Cloud9でLambda Node.js v8.10を使う(公式対応するまでの暫定)

# ２019.05.14 Update
Cloud9でLambda Node.js v8が公式に使えるようになったようです。

*** 
公式に対応するまでのメモ的な感じです。

***
さて、先日AWS Lambdaでnode.js v8.10が使えるようになりました。
[AWS Lambda Supports Node.js v8.10](https://aws.amazon.com/jp/about-aws/whats-new/2018/04/aws-lambda-supports-nodejs/ "AWS Lambda Supports Node.js v8.10")

2018年4月5日(JST)現在、Cloud9ではまだ対応がされていないようなので、
Lambdaファンクションを作る際、
Node.jsで選べるのは、v4.3とv6.10です。

v8.10で作りたいなーと思った時に、試した手段をメモっておきます。
***
とりあえず普通にLambdaを作ります。
**そういえば、ここで、権限自動作成できると思いますが、
ここで自動作成した権限で、サンプルにあったロジック貼り付けて動かしてみたら、動かなかったので、元々Lambda用にあった権限使ったほうがよさそうです。**

「select runtime」にはまだ、Node.js 8.10はないようです。
<img width="657" alt="select runtime" src="https://qiita-image-store.s3.amazonaws.com/0/72752/8c0b53a7-7e3e-f659-bc5f-6c42eba3d887.png">

とりあえず、Node.js 6.10を選んで、作成完了します。
<img width="667" alt="Lambda作成確認.png" src="https://qiita-image-store.s3.amazonaws.com/0/72752/2fc28bfe-d19a-aa04-e606-2d6e277d095b.png">

Cloud9内に、関数名のフォルダ内にindex.jsとtempleate.yamlが作成されるので、templeate.yamlを開きます。

Lambda Config Editorで表示される思いますが、ここでは、Runtimeの設定はいじれないようです。

なので、
下部にある、Toggle editor横の[View with text editor(Ace)]をクリックして、「Ace」に切り替えます。
<img width="370" alt="Ace切り替え.png" src="https://qiita-image-store.s3.amazonaws.com/0/72752/37b7fd7e-a3eb-49f3-d795-3405c7a35e1d.png">

そうすると、Yamlを手動で変更できるようになります。
<img width="1011" alt="template.yaml.png" src="https://qiita-image-store.s3.amazonaws.com/0/72752/adb398c3-3f3e-6068-e141-c9501e7d0ce5.png">

Rutimeのところを「nodejs6.10」から「nodejs8.10」に書き換えます。
<img width="1061" alt="template.yaml書き換え.png" src="https://qiita-image-store.s3.amazonaws.com/0/72752/893289ae-7020-9268-6ec3-f38b2d96c6a7.png">

この状態で、保存して、Deployします。

***

Lambdaのコンソールに移動して、できた関数を確認します。
ちゃんとv8.10になっているようです。
<img width="1250" alt="Lambda Function一覧.png" src="https://qiita-image-store.s3.amazonaws.com/0/72752/756893bb-434d-c201-0ec0-f9b1b559608a.png">

設定画面上でも同様です。
<img width="1484" alt="Lambda設定画面.png" src="https://qiita-image-store.s3.amazonaws.com/0/72752/49c1e7af-ef7c-15ed-cd02-d42aeb995d5c.png">

***

最初からLambdaのコンソールでやれば良いのでは？という気もしますので、今すぐどうしても、Cloud9でやりたいんだーという人向けです。
それに近々対応されると思いますし・・・。

***

おまけ
そういえば、runtimeとして使えないnode.jsのバージョン指定できるなと思って、やってみましたが、ちゃんとエラーになりますね。
メッセージ上は8.10はダメそうですが、ここはしょうがないかな。
<img width="341" alt="error.png" src="https://qiita-image-store.s3.amazonaws.com/0/72752/eb89a083-7836-0f25-6d07-84c30ba61345.png">~~
D3 軸と軸ラベル の微調整テク

よく使うテクをまとめたよ。バージョンは 4.X

![tick.png](https://qiita-image-store.s3.amazonaws.com/0/127424/6d9d4219-9bef-f785-67a6-dabcc3187af5.png)



```js
// input
const sc = d3.scaleLinear().domain([0,100]).range([0, width-80]);

const ax = d3.axisBottom().scale(sc);
const ax2 = d3.axisBottom().scale(sc).ticks(4);
const ax3 = d3.axisBottom().scale(sc).tickValues([0,20, 40, 80]);
const ax4 = d3.axisBottom().scale(sc).tickFormat((val) => {
  return val === 30 ? '' : val.toString()
});
const ax5 = d3.axisBottom().scale(sc).tickSize(10)


// output
const x = createOffsetter(30)
const draw = (label, axis) => {
  svg.append('g').append('text').attr('transform', x('label')).text(label)
  return svg.append('g').attr('transform', x('axis')).call(axis)
}

draw('base', ax)
draw('less', ax2)
draw('manual', ax3)
draw('vanish', ax4)
draw('size', ax5)
draw('rotate', ax).selectAll('text')
  .style('text-anchor', 'end')
  .attr('dx', '-1em')
  .attr('dy', '-0.7em')
  .attr('transform', 'rotate(-90)')
draw('emphasize', ax).selectAll('text')
  .style('font-size', (d) => d == 50 ? '20' : '10' )
```

補足：vanish, emphasize で使っている特定の tick の選択方法は値 d に基づくものだけでなく、コールバックの第二引数である index に紐づけることも可能。
LINQの結合で複数キーを使用する方法


#はじめに
LINQで結合を行う際、複数キーを使用したいときについてのメモです。
間違いや勘違いに関しましてはご指摘いただけると幸いです。

## テーブルのイメージ

| PersonTable       |
|:------------------|
| string PersonID   |
| strijng Name      |
| int Age           |
| string TeamID     |
| int SmallTeamID   |

| TeamTable         |
|:------------------|
| string TeamID     |
| int SmallTeamID   |
| string TeamName   |


複数のキーでの結合はSQLでは以下のように書きます。

``` csharp:
SELECT p.PersonID AS PersonID, p.Name AS Name, t.TeamName AS TeamName
FROM PersonTable AS p
INNER JOIN TeamTable AS t
    ON p.TeamID = t.TeamID
    AND p.SmallTeamID = t.SmallTeamID;
```

LINQではJOINでのANDにあたるものがないため、結合キーを匿名型で生成します。

###クエリ式
```sql:
var query = from p in PersonTable
            join t in TeamTable
            on new {p.TeamID, p.SmallTeamID}
            equals new {p.TeamID, p.SmallTeamID}
            where p.Age > 25
            select new
            {
                PersonID = p.PersonID,
                Name = p.Name,
                TeamName = t.TeamName
            };
```

###メソッド構文
```csharp:
var query = PersonTable
            .Join(
                TeamTable,
                t => new { t.TeamID, t.SmallTeamID },
                p => new { p.TeamID, p.SmallTeamID },
                where p.Age > 25
                (person, team) => new
                {
                    UserID = person.UserID,
                    Name = person.UserName,
                    TeamName = team.DepartmentName
                }
            );
```

この結合キーは

```csharp:
 {string TeamID, int SmallTeamID}
```
という構造になります。
この匿名型が一致する行で結合が行われます。
freeglut × Bash on Windows × Xming

この記事は[個人ブログ](https://www.wakuwakup.net/blog/2017/10/05/glut-on-bash-on-windows/#blogs)で公開しているものと内容は同じです。



## 初めに

講義でfreeglutを使うということでPCに入れとけと言われたのですが，

Windows上の環境を壊したくなかったのでBashでやることにしました．

他にこんなことやる人いないと思うけどやったことをここに残しておきます．

こんな記事を見る人は多分Bash on Windowsは導入済みということで導入後からの話をしたいと思います.

## お品書き
* freeglutのインストール
* Xmingの導入
* お好みで設定するやつら


## freeglutのインストール

glutといったらここにたどり着くであろう,以下のサイトの導入手順通りにやることにしました．

[GLUTによる「手抜き」OpenGL入門](https://tokoik.github.io/opengl/libglut.html)

以下のコマンドを叩きます.

```bash
$ sudo apt-get update
$ sudo apt-get install -y freeglut3 freeglut3-dev
```

これでfreeglutのインストールが完了です.

## Xmingの準備

WindowsにXmingを導入します.

現状のbash on WindowsではGUIが使えません．ということはGLUTで書いたプログラムを走らせてもエラーが出ます．

だからGUIを見れるようにします．

[**公式サイト**](https://ja.osdn.net/projects/sfnet_xming/)からXming X Server for Windowsをダウンロード．

* Xming-6-9-0-31-setup.exe
* Xming-fonts-7-7-0-10-setup.exe

ダウンロードしたファイルをインストールし，Xmingを起動する．

さらにBash上で以下のコマンドを入力してGUIを使えるようにします.

```
$ sudo apt-get install -y x11-apps
```

## bashの設定

ステータスバーのXmingにマウスカーソルを乗せると

```
Xming server:0.0
```

のようになっているはずなので，bash上で以下のコマンドを入力します．

```
$ export DISPLAY=localhost:0.0
```

最後の0.0は上で確認した．Xming server:○.○の〇.〇の値を入力します.

設定できているはずなのでxeyesで動作確認をします.

```
$ xeyes &
```

とりあえずこれで設定が完了しました.

## お好みで設定するやつら

#### bashを起動する毎にDISPLAYの設定をする

起動時に毎回Display設定をするのが面倒だから以下のコマンドを入力します.

```
$ echo export DISPLAY=localhost:0.0 >> ~/.bashrc
```

#### freeglutを使ったプログラムのコンパイルを改善する

コンパイル時にコマンドが長いので楽をするために以下のコマンドを入力します.

```
$ echo 'function ccgl() { cc -I/usr/X11R6/include "$@" -L/usr/X11R6/lib -lglut -lGLU -lGL -lXmu -lXi -lXext -lX11 -lm -lpthread; }' >> ~/.bashrc
```

これで以下コマンドでコンパイルできるようになります.

```
$ ccgl program.c
```
Macのショートカット必須版


#コピペを覚えた次のショートカット
自分がまだ覚えられてない

##エディタ操作
- Ctrl+B (Back) カーソルを左に
- Ctrl+F (Forward) カーソルを右に
- Ctrl+P (Previous) カーソルを上に
- Ctrl+N (Next) カーソルを下に
- Ctrl+A (Anchor?) カーソルを先頭に
- Ctrl+E (End) カーソルを最後に
- Ctrl+D (Delete) カーソルの右側の字を消す
- Ctrl+H (Hide) カーソルの左側の字を消す
- Ctrl+K (?) カーソルの右側全ての字を消す

##ブラウザ操作
- Ctrl+Tab タブの切替
- Ctrl+W タブを閉じる
- Command+[　前のページ
- Command+]　次のページ
Exodusの使い方

# Exodusとは？

簡単にNimのSinatraライクなWebフレームワークjesterでRailsにちょっとインスパイアされたCRUDなテンプレを作れるコマンドです。

# インストール

1. nimbleでインストールします。

```bash
nimble install nim_exodus
```

2. nimbleの`PATH`通してない人はこれ忘れず

fishシェルの方は`.config/fish/config.fish`に以下を記述します。

```bash
set -x PATH ~/.nimble/bin $PATH
```

もし、bashやzshなどの古い昭和時代のシェルの方は

`.bashrc` か `.bash_profile` で以下を記述します。

```zsh
export PATH=$PATH:~/.nimble/bin
```

# 作成

userという名前のテーブルで、nameフィールドがあるのを作成します。
※実はまだフィールドが１つしか対応してないので複数のフィールドが欲しい時はアップデートを待ちましょう。
　または自力で追加。

1. 中身が作れられてしますので、まず、空のディレクトリを作っておきます。

```bash
mkdir users_app
cd users_app
```

2. 生成

```zsh
exodus g scaffold user name:string
```

* 実際に作成されるサンプルがあるので、https://github.com/shinriyo/nim_exodus/tree/master/sample
を見てください。

3. 以下の分かりやすいコマンドが表示されます。

```
Yay! Run server command below.
> nim c -r app.nim

If you create db,
> nim c -r app.nim init
```

4. dbだけ作っておきたいので、SQLiteのファイルを作っておきます。

※まだ、SQLiteしか非対応ですが、今後MySQLやPostgreSQLもサポートすると思われます。

```bash
nim c -r app.nim init
```

以下が表示されますね。

```bash
db was created.
```

# アクセス

1. 先ほどの分かりやすいコマンドの通り、起動しましょう。

```bash
nim c -r app.nim
```

2. アクセスします。

http://localhost:5000

3. 分かりやすい表示が出ます。

```
GET	/users	users#index	Show all users
GET	/users/new	users#new	show HTML for create a user
POST	/users	users#create create a user
GET	/users/:id	users#show show a user
GET	/users/:id/edit	users#edit show HTML for edit user form
PATCH/PUT	/users/:id	users#update update a user
DELETE	/users/:id	users#destroy delete a user
```

4. 一覧をまず観てみましょう。

`users`を付与したのでここ。

http://localhost:5000/users

表示、追加、削除、編集、削除のページが出来ます。

# 今後

React、Cycle.jsとかのオプション選択などが追加されると思います。

# プルリク

* こちらにできます

https://github.com/shinriyo/nim_exodus
Macのhキーのチャタリングをhammerspoonでソフトウェア的に解決する

# はじめに
三ヶ月くらい前にMacBookPro(2016 Late)を買ったのですが,hキーが一回押しただけなのに二回押されてしまうことが頻出してきました.
具体的には `this` と打ったつもりが`thihs` になったり `thhis` になったりしてとてもじゃないけどプログラミングできない環境になりました.
自然に治る気配もないので修理にだすのも考えたのですが,ハードウェア的な問題ですしもしかしたら修理費がかさむかもしれないのは嫌です.
というわけで,キーボードイベントを監視し何でも出来るhammerspoonくんを使ってソフトウェア的にこの問題を解決しました.

# ソースコード

```lua
-- 0.2秒程度以内に二回以上押されると無視するようにする
local hPressed = false
function blockDoublePressedHKey(e)
    -- h キーは 4 番なのでそれ以外は無視
    if e:getKeyCode() ~= 4 then return false end
    if not hPressed then
        hPressed = true
        hs.timer.doAfter(0.18,function() hPressed = false end)
        return false
    else
        -- print("blocked H Key !!")
        return true
    end
end

hs.eventtap.new(
    {hs.eventtap.event.types.keyDown},
    blockDoublePressedHKey
):start()

```

# Tips
`hs.hotkey.bind` を使わないところがミソで,この関数では書き換えた先が同じキーのイベントの時に`hs.eventtap.event.newKeyEvent`を書き換えてしまい,不都合が生じます.

# 宣伝
https://github.com/Muratam/dotfiles/blob/master/home/.hammerspoon/init.lua
にてWindowsの「Win+上下左右」の窓移動をMacで再現するやつとかも置いてます.
MacのSplitWindowとかクソなんで…

# 参考
https://qiita.com/false-git@github/items/73a63537998e6ba3978a
Google Play Services12.0.0で不要なパーミッションが勝手に付与される問題

# 最初に

結論から言うとこの問題はGoogle Play Servicesのバグでした。バージョンを12.0.1で修正されていますので、12.0.0を使っている方は12.0.1上げることをオススメします。

# 経緯
Google Play Servicesのバージョンを12.0.0に上げてリリースしようとした際、Google Play Developer Console上で**READ_PHONE_STATE**が追加されているが大丈夫？と警告が出た。

#原因

全くに身に覚えが無い。

READ_PHONE_STATEはDangerous Permission （targetSdkVersionが23以上でRuntime Permissionに対応していない場合Permission要求された時点で落ちる）なのでカジュアルに追加することは無い。

# 調査

appモジュールレベルのbuild.gradleにGoogle Play Servicesの依存を追加する。以下はGoogle Analyticsだが他のAPIでも変わらない。

```groovy

dependencies {
    implementation "com.google.android.gms:play-services-analytics:12.0.0"
}
```

AndoidManifestを開き、下側のタブから「Merged Manifest」を選択するとManifest Mergerでマージ後のAndroidManifestを確認できる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/43438/4a1f932e-1723-8a8e-7055-708a820223ab.png)

**READ_PHONE_STATE**をクリックして情報をみてみる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/43438/d00cf053-0804-5590-7d39-2112a2bf346f.png)

Merging Logから**com.google.android.gms.license**由来のパーミッションであることがわかる。targetSdkVersionが4未満なのが原因らしい。

[READ_PHONE_STATEのドキュメント](https://developer.android.com/reference/android/Manifest.permission.html#READ_PHONE_STATE)を読むと以下の記述がある。

> Note: If both your minSdkVersion and targetSdkVersion values are set to 3 or lower, the system implicitly grants your app this permission. If you don't need this permission, be sure your targetSdkVersion is 4 or higher.

targetSdkVersionが4未満の場合勝手追加されるようだ。

# 解決方法

**com.google.android.gms.license**について調べていくと[Google Play ServicesのRelease Notes](https://developers.google.com/android/guides/releases#march_20_2018_-_version_1200)に辿りついた。Version 12.0.0の項目を確認すると原因が書いてあった。

> -license POM dependencies have no minSdkVersion / targetSdkVersion set, which means that the implied targetSdkVersion is 1. This adds READ_PHONE_STATE and READ_EXTERNAL_STORAGE permissions for apps using 12.0.0.

minSdkVersion/targetSdkVersionをセットしていなかったのが原因との事。また、[Version 12.0.1でこの問題は修正されている](https://developers.google.com/android/guides/releases#march_28_2018_-_version_1201)。

12.0.1にバージョンを更新してMerged Manifestで確認すると**READ_PHONE_STATE**、**READ_EXTERNAL_STORAGE**が削除されていることがわかる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/43438/6dfe811a-3e30-ec49-5d77-aa142bcac0a9.png)

# まとめ

Play Consoleが警告を出してくれてすごい。助かった。

# 参考

[https://developer.android.com/studio/build/manifest-merge.html#_9](https://developer.android.com/studio/build/manifest-merge.html#_9)
なぜ、あなたの工数見積もりは間違っているのか

きっとあなたは、開発工数の見積もりに失敗した事があるでしょう。
もし無い方がいればメッセージください。
もちろんその方は残業をしたことは無いのでしょう、
**[残業をしてる]=[あなたの見積もりはまちがっている]**
当たり前ですよね、あなたがお客さんに出した見積もりに残業代は含まれていないのですから。

#そもそもなぜ見積れるのでしょうか？
ソフトウェア開発だけではなくもっと広いくくりで、なぜあなたが何かを測ることが出来るのかを考えてみましょう。
・なぜあなたは、自分の身長を測れるのですか？
・なぜあなたは、自分の体重を測れるのですか？
・なぜあなたは、自宅から最寄り駅までの距離を測れるのですか？
・なぜあなたは、そのソフトウェアの開発工数を測れるのですか？

それは**物差しがあるから**です。

ではソフトウェア開発工数を見積もるための物差しは何でしょうか？
それは**過去の経験**です。

過去の経験があるから、ソフトウェア開発の工数を見積もることが出来ます。
過去の経験で、「あの開発はこれくらいだった」というものを物差しにして、開発工数を見積もります。

逆に言えば、過去の経験が無いものは見積もれないと言うことです。

#そもそも開発工数は見積もることができない
大前提として私たちは、開発工数を見積もる事が出来ないということを理解しなければなりません。
もし完璧に見積もることが出来るのであれば、あなたが扱っているシステムは10年以上前のものを利用していることでしょう。

上でも書きましたが私たちは、過去の経験を物差しとしてしか、見積もる事ができません。
では完璧に見積もるにはどうしたら良いのか。
全て過去に開発したことのある、機能、技術で固めるしかありません。
おそらくこれをやってる会社があるとすれば、大手SIerでしょう。
大手SIerは確実な工数見積もりを求められるからです。
しかしその代償に10年前の仕組みを使い続けているのでしょう。

私たちがやっていることは、より新しく、効率の良い技術を使い、よりスピーディーに価値のあるものを提供し続けることではないでしょうか。
そうする為には、使った事ない技術を使う必要があり、作ったことのない機能を作る他ありません。
では、その工数は見積れるのでしょうか？
**見積もれません**
過去に経験したことがないからです。
わたしはエンジニアは過去に経験したことの無いことに挑戦し続ける生き物だと思っています。


#どうやって見積もるのか
**見積もれない**というのは理解頂けたかと思います。
しかしあなたの現場で**見積もらない**わけにはいきませよね？
ではどうやって見積もれば良いのかをご説明します。
##余分に見積もる

なんだよそれと思ったと思いますが、私はこれ以上の方法を知りません。
知っている方がいれば教えてください。

では何に対して余分に見積もるのでしょうか。
###1.技術的課題&実装が明確でない箇所
技術的課題、実装が明確で無い箇所がある場合は、大きく見積もりに影響してくる可能性が高いため、こういった箇所が多い場合は、その分かなり多めに見積もりを出す必要があります。
私の感覚的に、大体これくらいの実装でできるかなと想定する工数の3倍の工数で算出します。


例えば、あるライブラリーを使うことを想定していた箇所が、何かしらの要因で使えず、そのライブラリーの機能を作らなければならないとなった場合、3倍の工数では済まないでしょう。

###2.お客様の追加要件に応える余地
お客様というのは、物が具体的に見えてくると、様々なアイデアや要望が湧いてきます。
これはお客様が悪いわけではありません。
人間とはそういうものなのです。
絶対に開発途中で要望が出てきます。なので予め、それに応えるための余地を開発工数に含めておくということです。
事前にお客様との取り決めの中で、「この機能以外の追加の要望は再見積もりさせて頂く」と決めておいても良いと思います。
しかし、追加の要望があるたびに、再見積もりとなると、お互いに仕事がやりづらくなってしまいます。
なので予めある程度の要望を加味した見積もりにしておくことをおすすめします。

###結局どれくらいで見積もればいいの
私の感覚値では、最初にこれくらいで出来るかなと思った1.5倍の工数で出します。
もちろんこれは、どれくらい技術的課題、実装の不明瞭なところがあるかによって大きく左右されますので、自分のプロジェクトではどうかなと考えて見てください。

もちろんこれは受託案件等の場合です、自社プロダクトでは社内政治の状況によるかと思うのでその辺はよしなに。。。
もしこれでも、工数がオーバーしてしまうなら、素直に謝罪し、納期を伸ばしてもらうか、機能を減らすかしか道はないです。
増員という選択肢もあると思いますが、そのプロジェクトに一切関わっていなかった人をジョインして状況が改善するとは思えません。相当優秀な人を入れれるなら話は別ですが、なかなかその様なことはないと思います。


#開発の進め方
私の今まで所属してきた現場では全て、納期前になるとエンジニアが残業しています。
この状況に正直ウンザリです。
ほんと学ばないなと思ってしまいます。

私は開発の進捗を常に超余裕の状態で進めます、なぜなら超余裕で進めたとしても、最終的には納期ぴったりになることがほとんどだからです。
さらに、追い込まれてギリギリで納期間に合わせるのと、余裕を持って納期に間に合わせるとでは、質の部分でどっちが上回ると思いますか？
これは言うまでも無いでしょう。

なので残業するタイミングが大事です。
残業するタイミングは超余裕の進捗では無くなった時です。
超余裕の状態になるまで残業してください。
納期前で、残業してしまうとそこでもう限界までやってしまっているので、それ以上調整する余地が無いです。
常に超余裕状態で進めていれば納期前でも大きく調整できる幅があります。
そのため納期に間に合わなくなる可能性が大幅に減ります。

#まとめ
・そもそも開発工数は見積もる事が出来ないため、大幅に余裕を持った見積もりを提示する
・最終的には納期ぴったりに落ち着くため、常に超余裕状態で開発を進める。
・納期前に調整できる幅を確保するために、残業のタイミングは超余裕でなくなったタイミング。
上から下への画面遷移アニメーション

# 概要
defaultでのsegueのアニメーションが下から上に画面が出るものだったので、戻るときはその逆である上から下のアニメーションを実装したいと思い、実装してみた

# コード

```swift:TopToBottomStoryBoardSegue

import UIKit

class TopToBottomSegue: UIStoryboardSegue {
    override func perform() {
        let firstVCView = self.source.view as UIView?
        let secondVCView = self.destination.view as UIView?
        
        // 画面の大きさを取得
        let screenWidth = UIScreen.main.bounds.size.width
        let screenHeight = UIScreen.main.bounds.size.height
        
        // 次出てくるviewを最初に今のviewの後ろ側に表示
        secondVCView?.frame = CGRect(x: 0,y: 0,width: screenWidth, height: screenHeight)
        let window = UIApplication.shared.keyWindow
        window?.insertSubview(secondVCView!, at: 0)
        
        // 邪魔になっている今のviewを画面外まで下げれば終了
        UIView.animate(withDuration: 0.3, animations: { () -> Void in
            firstVCView?.center.y += screenHeight
        }) { (Finished) -> Void in
            self.source.present(self.destination as! UIViewController,
                                                            animated: false,
                                                            completion: nil)
        }

}
}

```
Dockerのコンテナをワンライナーで一括操作(起動・停止・削除)

## 概要
Docker コンテナを全て起動・停止・削除 したい時の雑メモ
 
### 全て起動
---
```
docker start $(docker ps -a -q)
```

### 全て停止
---
```
docker stop $(docker ps -q)
```

### 全て削除( 停止中のコンテナ )
---

※ 起動しているものはエラーで弾かれるので良しとしたい。

```
docker rm $(docker ps -a -q)
```
AWS EC2でメモリ利用率をCloud Watchで監視する


CloudWatchMonitoringスクリプトでEC2でメモリ利用率をCloud Watchへ送信するための
検証手順である。

#■IAM権限の設定

EC2インスタンスに IAM ロール (インスタンスプロファイル) を関連付けている場合は、
次のアクセス権限を設定。

CloudWatchMonitoringScripts-IAM
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData",
                "cloudwatch:GetMetricStatistics",
                "cloudwatch:ListMetrics",
                "ec2:DescribeTags"
            ],
            "Resource": "*"
        }
    ]
}


#■スクリプトの実行

モニタリングスクリプトのダウンロード、インストール、設定を行うには
以下のスクリプトをEC2内で実行してください。

install_cloudwatch_scripts-mon.sh
```#!/bin/sh
sudo yum install perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https -y
sudo mkdir /usr/local/cloudwatch
cd /usr/local/cloudwatch
sudo wget http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip
sudo unzip CloudWatchMonitoringScripts-1.2.1.zip
sudo rm CloudWatchMonitoringScripts-1.2.1.zip
sudo touch cron.txt
sudo chmod 777 cron.txt
sudo echo '*/5 * * * * /usr/local/cloudwatch/aws-scripts-mon/mon-put-instance-data.pl --mem-util --mem-used-incl-cache-buff --mem-used --mem-avail --from-cron' > cron.txt
crontab cron.txt
sudo rm cron.txt
```
#■送信したデータを確認
CloudWatchを開くと左下にLinuxシステム(英語表記はLinux System)という項目が追加される。
ここにメモリ利用率(mem-util)、利用メモリ量(mem-used)、利用可能メモリ量(mem-avail)の推移がグラフで表示される。
Linuxのユーザとグループのアカウント管理のまとめ【新卒研修メモ】


# アカウント情報が保存されているファイル

| | ファイルパス | 書式 |
|:-----------|:------------|:------------|
| ユーザアカウント | /etc/passwd | `ユーザ名:パスワード:ユーザID:グループID:コメント:ホームディレクトリ:デフォルトシェル` |
| グループアカウント | /etc/group | `グループ名:グループパスワード:グループID:グループメンバ` |

## 例

```txt:ユーザアカウントの場合
xem:x:1000:1000::/home/taro:/bin/bash
```

```txt:グループアカウントの場合
cryptocurrencies:x:1002:ether,xem,lisk
```

* パスワードがxの場合はシャドウパスワードが使われている。その場合、パスワード情報は`/etc/shadow`に格納される。


# アカウント情報を変更するためのコマンド

| | ユーザアカウント | グループアカウント |
|:-----------:|:------------:|:------------:|
| 追加する | useradd [オプション] ユーザ名 | groupadd [オプション] グループ名 |
| 変更する | usermod [オプション]ユーザ名 | groupmod [オプション] グループ名 |
| 削除する | userdel [オプション] ユーザ名 | groupdel [オプション] グループ名 |

## その他コマンド

| | コマンド |
|:-----------:|:------------:|
|パスワードの変更|passwd [オプション] [ユーザ名]|
|所属グループの確認 |id [ユーザ名]|
laravel-ide-helperのインストールはcomposer requireするだけでよくなっていた

LaravelでPhpStormなどのIDEを使っているときにいろいろ補完が効くようにしてくれてありがたい[laravel-ide-helper](https://github.com/barryvdh/laravel-ide-helper)ですが、インストールするときに`config/app.php`の`providers`配列または`app/Providers/AppServiceProvide.php`の`register()`メソッドに記述を追加する必要があってちょっと面倒でした。

しかし先ほどlaravel-ide-helperのインストールをして画面を見ていたら、ちゃんと自動検出されているじゃないですか。(Laravel 5.5以降では[パッケージの自動検出](https://readouble.com/laravel/5.6/ja/packages.html#package-discovery)の仕組みができてそれにのっとったパッケージならいちいち手で書かなくて良くなった)

```console
% composer require --dev barryvdh/laravel-ide-helper
Using version ^2.4 for barryvdh/laravel-ide-helper
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 3 installs, 0 updates, 0 removals
  - Installing symfony/class-loader (v3.4.7): Loading from cache
  - Installing barryvdh/reflection-docblock (v2.0.4): Loading from cache
  - Installing barryvdh/laravel-ide-helper (v2.4.3): Loading from cache
symfony/class-loader suggests installing symfony/polyfill-apcu (For using ApcClassLoader on HHVM)
barryvdh/reflection-docblock suggests installing dflydev/markdown (~1.0)
barryvdh/laravel-ide-helper suggests installing doctrine/dbal (Load information from the database about models for phpdocs (~2.3))
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
Discovered Package: barryvdh/laravel-ide-helper    <---- ここ!!
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
```

調べて見ると、去年の6月に[Support Auto-Discovery #524](https://github.com/barryvdh/laravel-ide-helper/pull/524)がマージされて対応されたのですが、今に到るもREADME.mdのINSTALLの項は更新されず古いやり方のままの記述になっています。ドキュメントについての修正のPR([Add notice about "Package Auto-Discovery" to docs #576](https://github.com/barryvdh/laravel-ide-helper/pull/576))も出てますが取り込まれていません。

知らずに何回か古いやり方でインストールしてたわ... そのときも同じ出力あったんだから気がつけよという話ですがね。
PyMieScatt > テスト実行 > unimodalでのMie散乱計算

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```

Jupyter Notebook(Python3)にてPyMieScattを実行してみた。
Shapelyもインストール済。

```py:test_PyMieScatt_180405.ipynb
import PyMieScatt as PMS

m = 1.55 + 0.001j
wavelength = 10.
diameter = 5.

res = PMS.MieQ(m, wavelength, diameter)
print(res)

```

```txt:run
(1.0736750366243335, 1.0670672640464005, 0.006607772577932991, 0.5610396104337524, 0.4750080344971309, 0.0822058180247745, 0.07703902161991528)
```

http://pymiescatt.readthedocs.io/en/latest/forward.html

> Returns
> qext, qsca, qabs, g, qpr, qback, qratio :float

unimodalでのMie散乱の計算は上記の実行でできているようだ。


### 環境

```txt
$ pip3 install PyMieScatt
Requirement already satisfied: PyMieScatt in /usr/local/lib/python3.5/dist-packages
Requirement already satisfied: scipy in /usr/local/lib/python3.5/dist-packages (from PyMieScatt)
Requirement already satisfied: shapely in /usr/local/lib/python3.5/dist-packages (from PyMieScatt)
Requirement already satisfied: matplotlib in /usr/local/lib/python3.5/dist-packages (from PyMieScatt)
Requirement already satisfied: numpy in /usr/local/lib/python3.5/dist-packages (from PyMieScatt)
Requirement already satisfied: pyparsing!=2.0.0,!=2.0.4,!=2.1.2,!=2.1.6,>=1.5.6 in /home/yasokada/.local/lib/python3.5/site-packages (from matplotlib->PyMieScatt)
Requirement already satisfied: python-dateutil in /usr/local/lib/python3.5/dist-packages (from matplotlib->PyMieScatt)
Requirement already satisfied: six>=1.10 in /usr/local/lib/python3.5/dist-packages (from matplotlib->PyMieScatt)
Requirement already satisfied: pytz in /usr/local/lib/python3.5/dist-packages (from matplotlib->PyMieScatt)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.5/dist-packages (from matplotlib->PyMieScatt)
```
GitHub PagesにReactアプリをデプロイする方法

## はじめに
GitHub PagesにReactアプリをデプロイしてみました。
その際にいろいろな記事を回ったり、エラーが発生したりしたので、自分なりにまとめておきます。

## 前提
Node : v9.10.1
npm : 5.6.0
create-react-app : 1.5.2

[create-react-app](https://github.com/facebook/create-react-app) を使用してReactアプリを作成します。
導入方法は以下の記事がとても参考になると思います。
[Facebook公式のcreate-react-appコマンドを使ってReact.jsアプリを爆速で作成する](https://qiita.com/chibicode/items/8533dd72f1ebaeb4b614)

また、今回はGitHubのmasterブランチをWebページとして公開するようにします。

## 1. Reactアプリの作成とgh-pagesのインストール
まずはReactアプリを作成します。

```
$ create-react-app react-pages
```
Reactアプリの作成が終わったら、[gh-pages](https://www.npmjs.com/package/gh-pages)をインストールします。
[gh-pages](https://www.npmjs.com/package/gh-pages) は `npm run deploy` と打つだけでGithub Pagesにデプロイできるnpmのパッケージです。

```
$ cd react-pages
$ npm install gh-pages --save-dev
```

インストールが終わったら、`package.json` を編集します。

## 2. package.jsonに設定を追加
```JavaScript:package.json
//...
"homepage": "http://username.github.io/react-pages"

"scripts": {
  //...
  "predeploy": "npm run build",
  "deploy": "gh-pages -d build"
}
```

これで準備完了です！

## 3. GitHubにリポジトリを作成してデプロイ
GitHubでリポジトリを作成します。
（リポジトリの名前はReactアプリの名前と異なっていても大丈夫です。）

リポジトリを作成したら、以下のコマンドを叩いてデプロイします。

```
$ git init
$ git remote add origin https://github.com/username/react-pages.git
$ npm run deploy
```

### デプロイに失敗した
通常ならうまくいくはずですが、
`$ npm run deploy` を叩いたあと、すぐにエラーが出て止まってしまいました。

```
$ npm run deploy

> react-vim-cheat-sheet@0.1.0 predeploy /Users/username/workspace/react-pages
> npm run build


> react-vim-cheat-sheet@0.1.0 build /Users/username/workspace/react-pages
> react-scripts build

sh: react-scripts: command not found
npm ERR! file sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! syscall spawn
npm ERR! react-vim-cheat-sheet@0.1.0 build: `react-scripts build`
npm ERR! spawn ENOENT
npm ERR!
npm ERR! Failed at the react-vim-cheat-sheet@0.1.0 build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
...
```

`node_modules` 以下を消して再度挑戦。

```
$ rm -rf node_modules
$ npm install
$ npm run deploy
```

で今度は成功しました。

## 4. GitHubリポジトリの設定を変更
GitHubリポジトリのGitHub Pagesの設定を変更します。

Settings > GitHub Pages > Source で、「master branch」を選択します。

<img width="758" alt="react.png" src="https://qiita-image-store.s3.amazonaws.com/0/120309/b86d3ede-3dcc-a8c6-3477-3e0e09af2d7f.png">

これで設定終了です。
私はこの設定変更を忘れていて、デプロイは成功しているはずなのにブラウザで確認すると404…という状態で少し時間を無駄にしました…。

ブラウザで確認してみると、無事にReactアプリがデプロイされていました。
https://yuitnnn.github.io/react-vim-cheat-sheet/
（リポジトリ名は気にしないでください）

## おわりに
Reactアプリ作成から30分もかからずにGitHub Pagesにデプロイすることができました。
簡単にできるので、ぜひ試してみてはいかがでしょうか。

### 参考
https://github.com/gitname/react-gh-pages
https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/template/README.md#github-pages
JavaでstaticフィールドのList/Setの初期化に静的初期化ブロックを使う

SpringAOPのソースコードを読んでいたら、[こういうコード](http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-aop/4.2.0.RELEASE/org/springframework/aop/aspectj/AspectJExpressionPointcut.java#AspectJExpressionPointcut)があった（ノイズを除去するためにコードは調整済み）。

```java:AspectJExpressionPointcut.java
public class AspectJExpressionPointcut  {
    private static final Set<PointcutPrimitive> SUPPORTED_PRIMITIVES = new HashSet();

    static {
        SUPPORTED_PRIMITIVES.add(PointcutPrimitive.EXECUTION);
        SUPPORTED_PRIMITIVES.add(PointcutPrimitive.ARGS);
        SUPPORTED_PRIMITIVES.add(PointcutPrimitive.REFERENCE);
        SUPPORTED_PRIMITIVES.add(PointcutPrimitive.THIS);
        SUPPORTED_PRIMITIVES.add(PointcutPrimitive.TARGET);
        SUPPORTED_PRIMITIVES.add(PointcutPrimitive.WITHIN);
        SUPPORTED_PRIMITIVES.add(PointcutPrimitive.AT_ANNOTATION);
        SUPPORTED_PRIMITIVES.add(PointcutPrimitive.AT_WITHIN);
        SUPPORTED_PRIMITIVES.add(PointcutPrimitive.AT_ARGS);
        SUPPORTED_PRIMITIVES.add(PointcutPrimitive.AT_TARGET);
        logger = LogFactory.getLog(AspectJExpressionPointcut.class);
    }
}
```

これは[静的初期化ブロック](https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html)と言われる仕組み。
これまで、staticで宣言したList/Setなどの初期化は↓のように書いていたけれど、静的初期化ブロックのほうがスッキリ見える気がする。

```java
public class Hoge {
    private static final Set<PointcutPrimitive> SUPPORTED_PRIMITIVES = new HashSet(){{
        add(PointcutPrimitive.EXECUTION);
        add(PointcutPrimitive.ARGS);
        add(PointcutPrimitive.REFERENCE);
        add(PointcutPrimitive.THIS);
        add(PointcutPrimitive.TARGET);
        add(PointcutPrimitive.WITHIN);
        add(PointcutPrimitive.AT_ANNOTATION);
        add(PointcutPrimitive.AT_WITHIN);
        add(PointcutPrimitive.AT_ARGS);
        add(PointcutPrimitive.AT_TARGET);
    }};
}
```
システムを SoR と SoE に色付けして最適なシステム開発環境を

SoR と SoE の振り返り
--------------------

SoR(System of Record：記録のシステム) と その対義語の SoE(System of Engagement：絆のシステム) は システムの種類を表す言葉で、IBM で初めて使われた言葉です。[^1]

SoR は、遵法やコンプライアンスに重きを置き、粛々と間違いなく記録を撮り続ける類のシステムを指します。一方、SoE は、当時、日本IBM に伺った時に お客様との絆のシステムと訳していましたが、その名が表す通り、お客様の密着し、その反応に瞬時に対応[^2]することが売上に直結する、そして事業の根幹となりうるシステムの種類を指します。

結論
----

Agile[^3]、Cloud、DevOps、Microservice 等の考え方や技術の原点は、全てSoEのシステムを生み出すために登場してきたものばかりです。
これらの考え方や技術は、失敗と工夫と努力の積み重ねから成熟しつつも、日々進歩しているもの達ばかりです。
そして、システムの種類が違う SoR のシステム開発、インフラ環境に適さない考え方や技術もありますが、そうでなく、共通的にやるべき良いこともたくさんあります。自動化などは特にそうです。
そこで、より良いシステム開発環境を作りたいと悩んでいる方々は、自社のシステムを SoR と SoE に色付けすることから始めてみてはどうでしょうか。
そして、SoE のシステム開発には、全力で最新技術に挑戦、取り入れていくだけでなく、SoR のシステム開発には、その素晴らしい技術や考え方の良い部分を選択して適用していきましょう。


[^1]: 類似の言葉として、ガートナーの モード1(=SoR)、モード2(SoE) があります。
[^2]: Time to Marketの短縮と呼ばれることが多いです。
[^3]: 最近は[Modern Agile](http://modernagile.org/)と呼ばれ、Agileバージョン2のようなものも登場しています。
PyMieScatt > if ndp[-1]>np.max(ndp)/100 or ndp[0]>np.max(ndp)/100: > not compact?

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```

### Reference

- Bohren C.F. and D. R. Huffman, "Absorption and Scattering of Light by Small Particles", John Wiley, New York, NY (1983)
- PDF: [MATLAB Functions for Mie Scattering and Absorption, Research Report No. 2002-08, June 2002](https://omlc.org/software/mie/maetzlermie/Maetzler2002.pdf) by Christian Mätzler

### ndpチェック

https://github.com/bsumlin/PyMieScatt/blob/master/PyMieScatt/Mie.py#L470

```py
    ndp = numberOfParticles*ithPart(1,dp,geoMean,geoStdDev)
  if ndp[-1]>np.max(ndp)/100 or ndp[0]>np.max(ndp)/100:
    warnings.warn("Warning: distribution may not be compact on the specified interval. Consider using a higher upper bound.")
```

ndpというのは数密度分布だろうか。
http://dust.ess.uci.edu/facts/psd/psd.pdf
のp2 Eq(1) The total number concentration of particles N0...の$n_n(r)$
(ref. [statistics > mean size and variance > 緯度経度ごとの値から緯度のmeanとvarianceを求める](https://qiita.com/7of9/items/fb5ad0130994a0629064))

ndpの最小インデックスと最大インデックスに位置する要素値が`ndpの最大値/100`を超えていると警告を出している。

100というマジックナンバーの意味が不明である。

~~数密度分布のオーダーが2(=log10(100))を超えた場合に、compactでないという定義にしているようだ。~~

数密度分布のオーダーが2(=log10(100))未満の時に、compactでないという定義にしているようだ。

オーダーを広げる方が「compact」という定義がよくわからない。
tensorflow.jsでfizzbuzz

#概要
tensorflow.jsでfizzbuzz問題やってみた。

#サンプルコード

```
function fizzbuzz(n) {
    if (n % 15 == 0)
    {
        return [1, 0, 0, 0];
    }
    else if (n % 5 == 0)
    {
        return [0, 1, 0, 0];
    }
    else if (n % 3 == 0)
    {
        return [0, 0, 1, 0];
    }
    else
    {
        return [0, 0, 0, 1];
    }
}
function toarray(n) {
    var ary = new Array;
    for (var i = -1 ; i < 7; i++)
    {
        var s = 1;
        if (i > -1) s = 2 << i;
        var b = n & (s)
        if (b > 0)
        {
            ary.push(1.0);
        }
        else
        {
            ary.push(0.0);
        }
    }
    return ary;
};
function tofizz(i, f) {
    var str = "";
    if (f == 3)
    {
        str = i;
    }
    else if (f == 2)
    {
        str = "fizz";
    }
    else if (f == 1) 
    {
        str = "buzz";
    }
    else if (f == 0)
    {
        str = "fizzbuzz";
    }
    return str;
}
const model = tf.sequential();
model.add(tf.layers.dense({
	units: 40,
	activation: 'relu',
	inputShape: [8]
}));
model.add(tf.layers.dense({
	units: 4,
	activation: 'softmax'
}));
model.compile({
	optimizer: 'Adam',
	loss: 'categoricalCrossentropy',
	metrics: ['accuracy'],
});
const buffer = tf.buffer([100, 8]);
for (var i = 1; i < 101; i++) 
{
    var x = toarray(i);
    for (var j = 0; j < 8; j++)
    {
        buffer.set(x[j], i - 1, j);
    }
}
const xs = buffer.toTensor();
const buffer2 = tf.buffer([100, 4]);
for (i = 1; i < 101; i++) 
{
    x = fizzbuzz(i);
    for (j = 0; j < 4; j++)
    {
        buffer2.set(x[j], i - 1, j);
    }
}
const ys = buffer2.toTensor();
alert(xs);
alert(ys);
model.fit(xs, ys, {
    batchSize: 100, 
    epochs: 1000
}).then((d) => {
    var str = "loss = ";
    str += d.history.loss[0]; 
    for (i = 1; i < 101; i++)
    {
        str += "<br>" + i + " = ";
        var pre0 = model.predict(tf.tensor2d(toarray(i), [1, 8]));
        var f = pre0.argMax().dataSync();
        str += tofizz(i, f);
    }
    document.write(str);
});



```

#成果物

http://jsdo.it/ohisama1/A5zM

以上。
非連続の複数列を選択して置換する

非連続の複数列を選択し、セルがブランクであれば0に置換する

```vb:Excel-VBA
Range("AO:AO,AQ:AQ,AS:AS,AU:AU,AW:AW,AY:AY,BA:BA,BC:BC").Select
Selection.Replace What:="", Replacement:="0"
```
tensorflow.jsでxor

#概要
tensorflow.jsでxor問題やってみた。

#サンプルコード


```
const model = tf.sequential();
model.add(tf.layers.dense({
	units: 20,
	activation: 'relu',
	inputShape: [2]
}));
model.add(tf.layers.dense({
	units: 2,
	activation: 'softmax'
}));
model.compile({
	optimizer: 'Adam',
	loss: 'categoricalCrossentropy',
	metrics: ['accuracy'],
});
const xs = tf.tensor2d([[1, 0], [0, 1], [1, 1], [0, 0]], [4, 2]);
const ys = tf.tensor2d([[1, 0], [1, 0], [0, 1], [0, 1]], [4, 2]);
model.fit(xs, ys, {
    batchSize: 4, 
    epochs: 1000
}).then((d) => {
    var str = "loss = ";
    str += d.history.loss[0]; 
    str += "<br>1, 1 = ";
    var pre0 = model.predict(tf.tensor2d([1, 1], [1, 2]));
    str += pre0.argMax().dataSync() + "<br>0, 0 = ";
    var pre1 = model.predict(tf.tensor2d([0, 0], [1, 2]));
    str += pre1.argMax().dataSync() + "<br>0, 1 = ";
    var pre2 = model.predict(tf.tensor2d([0, 1], [1, 2]));
    str += pre2.argMax().dataSync() + "<br>1, 0 = ";
    var pre3 = model.predict(tf.tensor2d([1, 0], [1, 2]));
    str += pre3.argMax().dataSync() + "<br>";
    document.write(str);
});


```

#成果物
http://jsdo.it/ohisama1/SBmN


以上。