OmniAICreator/Qiita-1.07M huggingface dataset:
C++ Builder XE4 > TCP > WriteLn()の誤用

```txt:動作環境
C++ Builder XE4
```

```cpp
String m_cmd = "command\r\n";
IdTCPClient1->Connect();
IdTCPClient1->IOHandler->WriteLn(m_cmd);
```

上記のような処理で予期しない結果となっていた。
以下が正解だった。

```cpp
String m_cmd = "command\r\n";
IdTCPClient1->Connect();
IdTCPClient1->IOHandler->Write(m_cmd);
```

以下などを確認していたが、もっと単純な失敗であった。

[C++ Builder / Socket > ReceiveBuf()では0x00を途中に含めた指定長さの文字列を受信する / ReadBytes()では0x00までの長さの文字列だけを受信する > ReadChar()試用 / ReadString() + memcpy()使用 > ReadStream()使用](https://qiita.com/7of9/items/9fa80d146d3fab63a71b)
dockerのmackerel-agent起動時にroleを設定する

### mackerel/mackerel-agent起動時にroleを設定する
docker版のmackrel-agent起動にオプションを渡すためには、環境変数`opts`を利用します。

```
docker run -h `hostname` \
  (省略)
  -e 'auto_retirement=1 \
  -e 'opts=-v -role=<your:role>' \
  (省略
  mackerel/mackerel-agent
```

これで起動時にロールが設定されます。
(auto_retirement=1は終了時に自動退役する設定)

###### docker-composeの例
```
services:
  mackerel-agent:
    image: mackerel/mackerel-agent:0.49.0
(省略)
    environment:
      - auto_retirement=1
      - opts=-v -role=<your:role>
(省略)
```

### 参考
- https://hub.docker.com/r/mackerel/mackerel-agent/
- https://github.com/stanaka/docker-mackerel-agent
- https://mackerel.io/ja/docs/entry/spec/agent#setting-services-and-roles
Xamarin.Mac/iOSでbyte[]⇔NSData変換

## byte[] と NSDataの変換

この変換をしなければならなくなってググってみると。
[酢酸先生の記事](http://blog.ch3cooh.jp/entry/20130404/1365032779)が。

しかし、書かれているのは2013年。
どうやらその間に少し変わったようで。
今ではもう少し簡単になっていますので、忘備録として書いておきます。

### NSData → byte[] の変換

```c-sharp
var bytes = data.ToArray();
```

なんと一発。
大変楽になっています。

NSDataには、他に

```c-sharp
IntPtr but = data.Bytes;
```

なんてのもありますが、ちょっと用途が違うので（戻り値型に注目）注意が必要です。

### byte[] → NSData の変換

```c-sharp
var data = NSData.FromArray(bytes);
```

NSData.From???関連は他にもあって。

* [FromArray](https://developer.xamarin.com/api/member/MonoTouch.Foundation.NSData.FromArray/p/System.Byte[]/)(Byte[])
* [FromBytes](https://developer.xamarin.com/api/member/MonoTouch.Foundation.NSData.FromBytes/p/System.IntPtr/System.UInt32/)(IntPtr, UInt32)
* [FromBytesNoCopy](https://developer.xamarin.com/api/member/MonoTouch.Foundation.NSData.FromBytesNoCopy/p/System.IntPtr/System.UInt32/)(IntPtr, UInt32)
* [FromBytesNoCopy](https://developer.xamarin.com/api/member/MonoTouch.Foundation.NSData.FromBytesNoCopy/p/System.IntPtr/System.UInt32/System.Boolean/)(IntPtr, UInt32, Boolean)
* [FromData](https://developer.xamarin.com/api/member/MonoTouch.Foundation.NSData.FromData/p/MonoTouch.Foundation.NSData/)(NSData)
* [FromFile](https://developer.xamarin.com/api/member/MonoTouch.Foundation.NSData.FromFile/p/System.String/)(String)
* [FromFile](https://developer.xamarin.com/api/member/MonoTouch.Foundation.NSData.FromFile/p/System.String/MonoTouch.Foundation.NSDataReadingOptions/MonoTouch.Foundation.NSError@/)(String, NSDataReadingOptions, out NSError)
* [FromStream](https://developer.xamarin.com/api/member/MonoTouch.Foundation.NSData.FromStream/p/System.IO.Stream/)(Stream)
* [FromString](https://developer.xamarin.com/api/member/MonoTouch.Foundation.NSData.FromString/p/System.String/)(String)
* [FromString](https://developer.xamarin.com/api/member/MonoTouch.Foundation.NSData.FromString/p/System.String/MonoTouch.Foundation.NSStringEncoding/)(String, NSStringEncoding)
* [FromUrl](https://developer.xamarin.com/api/member/MonoTouch.Foundation.NSData.FromUrl/p/MonoTouch.Foundation.NSUrl/)(NSUrl)
* [FromUrl](https://developer.xamarin.com/api/member/MonoTouch.Foundation.NSData.FromUrl/p/MonoTouch.Foundation.NSUrl/MonoTouch.Foundation.NSDataReadingOptions/MonoTouch.Foundation.NSError@/)(NSUrl, NSDataReadingOptions, out NSError)

理屈としては、 `[NSData dataWithBytes:? length:?]` やら、 `[NSData dataWithContentsOfFile:?]` やらのラッパーになっているだけなんでしょうが、こういうものがある、というのを知っているだけでもちょっと便利かと。
RailsのTimeZoneを日本時間にする時にちょっとだけ気づくのに時間がかかった小さいミス

個人メモ程度ですが

```config/application.rb
config.time_zone = 'Tokyo' #日本時間に設定
```

上記記述した後に僕はそのまま

```ruby:code
Time.now.strftime("%Y%m%d")
```

とかやってました。
そうすると日本時間になってくれません。

設定したtimezoneで見たい時はこっちを使わないといけないのを発見

```ruby:code
Time.zone.now.strftime("%Y%m%d")
```

小さいミスですがありがちな気がします。

# ※追記
自分の環境はdockerで構築されていて、docker構築時にtimezoneを日本に設定していなかったため
上記の設定が必要になったっぽいです。
完全にローカルで開発している時、コンテナでtimezoneを設定している場合はいらない設定だと思います。
備忘録 Ansibleで変数ファイルを利用する

Chefの場合、レシピの中で変数を使いたい場合は、attribute属性を使用していました。
Ansibleの場合も似たような感じで、変数ファイルを作成して読み込むことができます。


#1. とりあえず、playbookを作成する。

[備忘録 Ansibleファイルをコピーする（copyモジュール）](https://qiita.com/brighton0725/items/7754c3ea462d3b06e5d3)で作成したものをベースでやってみます。

```test3.yml
---
- hosts: web
  sudo: yes
  vars_files:
   - ../vars/test3.yml
  tasks:
   - name: copy a directory
     copy:
       src: "{{ src_file }}"
       dest: "{{ dest }}"
       mode: "{{ mode }}"
       backup: yes
```

テスト用のファイルも簡単に作っておきます。

```
test comment1
```


##1. var_files
playbookの中で、var_filesオプションを利用し、変数ファイルを指定することで、playbookから変数を外だしすることが出来ます。
以下の部分が相当します。
また、今回は、変数ファイルを格納するディレクトリとして、事前に/root/ansible/varsディレクトリを作成しました。

```
  vars_files:
   - ../vars/test3.yml
```

ディレクトリ構成は以下のような感じです。

```
/root/
   └ ansible
       ├─ hosts             ・・・inventoryファイル
       ├─ tasks             ・・・playbook格納場所
       │   └─ test3.yml     ・・・playbook
       ├─ files             ・・・ファイル系操作用ディレクトリ
       │   └─ test3.txt     ・・・テスト用ファイル
       └─ vars　　　　　　　　・・・変数ファイル格納場所
           └─ test3.yml     ・・・変数ファイル
```

##2. 変数の設定

playbookの以下の部分にあたります。

```
       src: "{{ src_file }}"
       dest: "{{ dest }}"
       mode: "{{ mode }}"
```

変数は "{{ 変数名 }}"　と指定します。
昔の資料を見ているとダブルクオーテーションで囲まなくても良かったみたいですが、今は囲む必要があるようです。
囲まない場合、実行時に以下のようなエラーメッセージがでます。

```

The offending line appears to be:

     copy:
       src: {{ src_file }}
             ^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes.  Always quote template expression brackets when they
start a value. For instance:

    with_items:
      - {{ foo }}

Should be written as:

    with_items:
      - "{{ foo }}"
```

#2.変数ファイルを作成する
実際に変数ファイルを作成してみます。

```
---
src_file: ../files/test3.txt
dest: /tmp
mode: 0666
```

#3.playbookを実行する。
実際に実行してみます。

```
# ansible-playbook -i hosts ./task/test3.yml
[DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and make sure become_method is
'sudo' (default). This feature will be removed in version 2.6. Deprecation warnings can be disabled by
setting deprecation_warnings=False in ansible.cfg.

PLAY [web] ************************************************************************************************

TASK [Gathering Facts] ************************************************************************************
ok: [brighton002]

TASK [copy a directory] ***********************************************************************************
changed: [brighton002]

PLAY RECAP ************************************************************************************************
brighton002                : ok=2    changed=1    unreachable=0    failed=0
```

問題無く実行できたようです。

サーバー上で確認してみます。

```
[root@brighton002 tmp]# pwd
/tmp
[root@brighton002 tmp]# ls -l
total 4
-rw-rw-rw- 1 root root 14 Jan 16 10:31 test3.txt
[root@brighton002 tmp]# cat test3.txt
test comment1
[root@brighton002 tmp]#
```

想定どおりできました！


Chefよりも扱いやすいかも・・・
PGIコンパイラを用いてOpenACCを利用

PGIコンパイラを用いてOpenACCを利用してみる (#pragma acc kernels)。以下の例では、ライプニッツの公式を用いて円周率を求め、GCCとPGIコンパイラのそれぞれでかかった時間を書き添えた。

```c:Leibniz_formula_for_pi.c
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

#define N 1600000000L

int main(int argc, char *argv[])
{
  double pi, piq = 1.0;
  long int li, upto = N;
  clock_t begin, end;

  if (argc > 1) upto = atol(argv[1]);

  begin = clock();

#pragma acc kernels
  for (li = 1; li < upto; li++) 
  {
    if (li % 2 == 0) piq += 1.0 / (2.0 * li + 1.0);
    else             piq -= 1.0 / (2.0 * li + 1.0);
  }

  pi = 4.0 * piq;

  end = clock();

  fprintf(stdout, "pi = %.12f (%.2f s)\n",
          pi, (double)(end - begin) / CLOCKS_PER_SEC);
  return EXIT_SUCCESS;
}
```

```
$ gcc -v 2>&1 | grep ^gcc
gcc version 5.4.0 20160609 (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.5) 
$ gcc -o pi Leibniz_formula_for_pi.c
$ file pi
pi: ELF 64-bit LSB executable, 64-bit PowerPC or cisco 7500, version 1 (SYSV), dynamically linked, interpreter /lib64/ld64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=0133a85d075fb58a5c98988dffd16e3ec6b83a2a, not stripped
$ ./pi 3200000000
pi = 3.141592653276 (27.54 s)
$ which pgcc
/opt/pgi/linuxpower/17.10/bin/pgcc
$ pgcc --version | grep -v ^$
pgcc 17.10-0 linuxpower target on Linuxpower 
PGI Compilers and Tools
Copyright (c) 2017, NVIDIA CORPORATION.  All rights reserved.
$ pgcc -acc -o pi_acc Leibniz_formula_for_pi.c
$ file pi_acc
pi_acc: ELF 64-bit LSB executable, 64-bit PowerPC or cisco 7500, version 1 (SYSV), dynamically linked, interpreter /lib64/ld64.so.2, for GNU/Linux 3.2.0, not stripped
$ ./pi_acc 3200000000
pi = 3.141592653276 (14.05 s)
```
Vagrant起動時に「Nonexistent host networking interface」エラーが発生した時の対処法

# 問題

Vagrant起動時に以下のようなエラーが発生しました。

```sh
$ vagrant up
...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["startvm", "XXXXXX", "--type", "headless"]

Stderr: VBoxManage: error: Nonexistent host networking interface, name 'vboxnet0' (VERR_INTERNAL_ERROR)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component ConsoleWrap, interface IConsole
```

# 対処法

`vboxnet0`というインターフェースが存在しないのがエラーの原因のようです。
以下のコマンドで`vboxnet0`インターフェースを作ります。

```sh
$ VBoxManage hostonlyif create
```

再度`vagrant up`を実行すると、成功しました。

```sh
$ vagrant up
```

# 参考

- [Virtual box error "Non existent network interface"](https://stackoverflow.com/questions/16472545/virtual-box-error-non-existent-network-interface)
AWS CLI S3 ディレクトリを再帰的にダウンロードするコマンド

## AWS CLI S3 ディレクトリを再帰的にダウンロードするコマンド
### 注意点

`s3://バケット名/ディレクトリ名/` 最後のスラッシュが必要

`--recursive` で再帰指定が必要

```
$ aws s3 cp s3://バケット名/ディレクトリ名/ . --recursive
```

### （メモ）IDCFオブジェクトストレージの場合

```
$ aws --endpoint-url https://ds.jp-east.idcfcloud.com s3 cp s3://バケット名/ディレクトリ名/ . --recursive
```
Pgroonga + replicationで同期されない。

#Pgroonga + replicationでREINDEXするとslaveのgroonga dbだけ同期されない
postgresのテーブルなどは問題ないけど、

    SELECT COUNT(*) FROM テーブル名 WHERE カラム名 &@~ 'クエリ';
    ERROR:  pgroonga: object isn't found: <Sources111111>

が通らないし。

    SELECT pgroonga_command('select テーブル');
も通らない
なんじゃこれと思ったら。

    SELECT pgroonga_command('io_flush');

したら同期とれた。＾＾；

ちゃんと公式ドキュメントには、バックアップ前にflushしとけと書いてあるのに
忘れてただけっぽい。

flushしてなくても、バクアップ後にINSERT UPDATEが問題なく動いてたけど、
REINDEXするとエラーでてたので焦った。
Linux系OS　コマンドメモ

サーバの容量が閾値を越えた場合、効率的に容量の大きなファイルから消していきたい場合。

ルートディレクトリ以下の容量を調べ降順に並べる
du -h --max-depth 1 / | sort -rn

一杯になりやすい /var , /usr を調べる【単位MB】
du -mS /var | sort -rn | head -50
du -mS /usr | sort -rn | head -50

使用容量順に「ベスト50」を降順にソートする【単位MB】
du -mS / | sort -rn | head -10

マウントしているディスクは除く【単位MB】
du -mS / | sort -rn | grep -v "/mnt" | head -50
Network > TCP > 接続 > 接続拒否とタイムアウト

```txt:動作環境
Windows 7 Pro (32bit)
TCP/IPサーバー機能を実装した装置
```

### 概要

- 対象装置においてコマンド応答処理を実装
- 正常通信の動作は確認済み
- ネットワークケーブル切断などの異常時の処理を確認中

### 動作確認

NonSoftさんの[TCP/IPテストツール](http://nonsoft.la.coocan.jp/Download/SocketTool/index.html)
を使わせていただいています。
提供感謝です。

- 手順
    1. 装置とのケーブルを抜く
    2. テストツールから接続する
        - >> 失敗する
    3. 装置とのケーブルを挿す
    4. テストツールから接続する
        - >> 成功する


```txt:結果
切断 192.168.7.9  (7000 )
接続 192.168.7.9  (7000 )
切断 192.168.7.9  (7000 )
*ER* 192.168.7.9  (7000 )対象のコンピューターによって拒否されたため、接続できませんでした。

接続 192.168.7.9  (7000 )
切断 192.168.7.9  (7000 )
接続 192.168.7.9  (7000 )
切断 192.168.7.9  (7000 )
接続 192.168.7.9  (7000 )
切断 192.168.7.9  (7000 )
*ER* 192.168.7.9  (7000 )接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。

接続 192.168.7.9  (7000 )
切断 192.168.7.9  (7000 )
```

[ネットワークの接続拒否とタイムアウトの違いを知る](http://www.atmarkit.co.jp/ait/articles/0407/10/news015.html) @ @IT

上記の結果の一つ目は「接続拒否」、二つ目は「タイムアウト」なのだろう。

実際に手順通り実施してみると、「接続拒否」が発生しやすい？
タイムアウトが発生した状況についてはC++ Builderで実装しているソフトとも関係するのかもしれない。
PythonでSlackのIncoming Webhookを試してみる

# 概要

以前、[__TwitterAPIをPythonで操作する記事__](https://qiita.com/bakira/items/00743d10ec42993f85eb)を投稿しましたが、今回はその__Slack Incoming Webhook版__となります。

今や__IT業界以外__でも__Slack__を利用している会社は多くなってきているので、__Slack API__を使いこなせるようになりたいなーと思ったので今回触ってみました。

個人的には__TwitterAPIよりとても簡単__でした。

# 手順

## 環境

今回は__以下の環境__で実装をします。

- __Python 3.6.1__
- __requests==2.18.4__

## 前提

__以下の準備__が出来ていること

- __Slack関連__
    - Workspace
    - Chanel
- __Python関連__
    - requestsのインストール

## Incoming Webhookの登録

まずは、Slackに__Incoming Webhook__を作成する必要があります。
この設定をすることで__外部からSlackへのメッセージ通知が可能__になります。

まずは[__コチラ__](https://slack.com/services/new/incoming-webhook)にアクセスします。

そして、__通知をしたいチャンネル__を選択し__Add Incoming Webhook integrationボタン__をクリックします。
__<font color="red">※複数のワークスペースに参加している場合、他のワークスペースを選ばないように気をつけてください。</font>__

<img width="1239" alt="screencapture- 2018-01-15 22.03.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/17ec4521-d0ae-89d0-faba-294048089b06.png">

そうすると、__ページ中央下部__に__Webhook URL__が表示されるので__コピー__しましょう。

<img width="1241" alt="screencapture- 2018-01-15 22.03.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/5cb63270-2607-def3-af5b-9841ac9c660f.png">

## スクリプトの実装

__以下のスクリプト__を用意してください。

```py:slack.py
import requests, json

WEB_HOOK_URL = "{Webhook URL}"
requests.post(WEB_HOOK_URL, data = json.dumps({
    'text': u'Notifycation From Python.',  #通知内容
    'username': u'Bakira-Tech-Python-Bot',  #ユーザー名
    'icon_emoji': u':smile_cat:',  #アイコン
    'link_names': 1,  #名前をリンク化
}))
```

## 実行

そい！！

```shell:command
python slack.py
```

<img width="848" alt="screencapture- 2018-01-15 22.08.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/a2c06ed4-4c98-f49b-7df0-2bd496367aff.png">

__おぉ、簡単！！__

## カスタマイズ

Incoming Webhooknoの__編集画面__で__デフォルトの表示名__や__アイコン画像__を指定すること出来ます。
ここで設定しておけば__都度指定する必要が無くなる__ので便利です♪

<img width="1249" alt="screencapture- 2018-01-15 22.15.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/402b1c9b-a5b5-6dba-6804-12b4bf11c5f6.png">

```py:slack.py
import requests, json

WEB_HOOK_URL = "{Webhook URL}"
requests.post(WEB_HOOK_URL, data = json.dumps({
    'text': u'Notifycation From Python.',  #通知内容
    'link_names': 1,  #名前をリンク化
}))
```

<img width="865" alt="screencapture- 2018-01-15 22.17.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/2f425692-6f62-fe72-241d-5d58082797a5.png">

__素晴らしい！__

# あとがき

何やら、Slackで外部からメッセージを送る方法には

- [__API__](https://api.slack.com/web)
- [__Incoming Webhook__](https://api.slack.com/incoming-webhooks)

の__２つの方法__があるらしいですね。(なんか他にもありそうですが)
今回は__後者__を紹介しましたが、__前者__についても時間があるときに調べてみようと思います。


# 参考にさせて頂いた記事

__非常に助かりました！！！__

- [PythonでSlackに投稿する](https://qiita.com/polikeiji/items/f8fa08331bd4a12f66df)
- [SlackのWebhook URL取得手順](https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008)
- [SlackのIncoming Webhooksを使い倒す](https://qiita.com/ik-fib/items/b4a502d173a22b3947a0)
kineticにros-realsense-cameraをインストールする。

## ros-kineticのインストール
`sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" >` 

`/etc/apt/sources.list.d/ros-latest.list'`
`sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116`

`sudo apt-get update`

`sudo apt-get install ros-kinetic-desktop-full`
Reading package lists... Done Building dependency tree Reading state information... Done Some packages could not be installed. This may mean that you have requested an impossible situation or if you are using the unstable distribution that some required packages have not yet been created or been moved out of Incoming. The following information may help to resolve the situation:
**The following packages have unmet dependencies: ros-kinetic-desktop-full : Depends: ros-kinetic-simulators but it is not going to be installed E: Unable to correct problems, you have held broken packages.**

**gazeboのsimulatorがインストールされていると上記のエラーが出るので、まずgazebo関連のパッケージをremoveする。
[参考にしたURLはここ](http://answers.gazebosim.org/question/15568/ros-kinetic-desktop-full-can-not-be-installed-after-installing-gazebo/)
collision-avoidance-libraryをbuildする際にgazebo8をインストールしてあったのが原因らしい。**
**これで、ros-kinetic-desktop-fullはインストールできたが、collision-avoidance-libraryのgazebo simulatorは使えるのだろうか？** 
First completely remove gazebo simulator by
`sudo apt-get remove '.*gazebo.*' '.*sdformat.*' '.*ignition-math.*' '.*ignition-msgs.*' '.*ignition-transport.*'`

`sudo rosdep init`
`rosdep update`

`sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essential`


Update your /etc/apt/sources.list file and/or /etc/apt/sources.list.d/*.list to uncomment (or add) the deb-src entries for all of the entries for the main repositories. Below is an example for ubuntu 16.04 (Xenial).

## ros-librealsenseのインストール
以下を/etc/apt/source.listに追加する。
deb-src http://us.archive.ubuntu.com/ubuntu/ xenial main restricted
deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-updates main restricted
deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://security.ubuntu.com/ubuntu xenial-security main restricted

`sudo apt-get update`

##Update to the Xenial kernel

`sudo apt-get install linux-image-generic-lts-xenial`
`sudo reboot`

**4.13.0-26なのでこっちでを実行**
Or update to the latest Distro which should contain a 4.4.x or higher kernel:
sudo apt-get dist-upgrade

##Re-install Package
`sudo apt-get --reinstall install 'ros-*-librealsense'`
slackメッセージの一括削除（python3）

Slackの無料枠では10000メッセージまでしか見ることが(検索も)出来ない。
警告メッセージが来ていて困ったなーと。
リマインドなど無駄なメッセージを削除して、何とかならないかとおもったら、まさにQiitaでの投稿が。

https://qiita.com/ono0708/items/b517cc83ec84bb787456

早速下記からトークンを発行。

https://api.slack.com/custom-integrations/legacy-tokens

ここで削除対象とするチャネルのIDを確認。

https://api.slack.com/methods/channels.list/test?

早速、Qiitaのソースを実行してみるとpython3では動かないことが判明。
確かにpython2.7って書いてある。
せっかくなのでソースをpython3に書き直してみる。
下記は取得したメッセージがBotだったら削除するようにしている。

```
#coding: utf-8

import urllib.request
import urllib.parse
import json
import time

hist_url = "https://slack.com/api/channels.history"
delete_url = "https://slack.com/api/chat.delete"

token = 'ここにトークン'
channel = 'ここにチャネルのID'

hist_params = {
    'channel' : channel,
    'token' : token,
    'count' : '200'
}

req = urllib.request.Request(hist_url)
hist_params = urllib.parse.urlencode(hist_params).encode('ascii')
req.data = hist_params

res = urllib.request.urlopen(req)

body = res.read()
data = json.loads(body)

for m in data['messages']:
    if (m['user'] == 'USLACKBOT'):
        print(m)
        delete_params = {
            'channel' : channel,
            'token' : token,
            'ts' :  m["ts"]
        }
        req = urllib.request.Request(delete_url)
        delete_params = urllib.parse.urlencode(delete_params).encode('ascii')
        req.data = delete_params

        res = urllib.request.urlopen(req)
        body = res.read()

        print(body)

        time.sleep(2)
```
Pythonのrequestsを利用してRest API(json形式)でファイルダウンロードする方法

## 1. はじめに

PythonのHTTPクライアントライブラリである`requests`を利用して、json形式のデータを送受信するRest APIでファイルダウンロードを行う方法について説明したいと思います。
ポイントはbase64でascii文字列をデコードしてバイナリデータを取得することです。
なお、アップロードについては「[Pythonのrequestsを利用してRest API(json形式)にファイルアップロードする方法](https://qiita.com/5zm/items/8dc6189940b42e241210)」を参照ください。

## 2. ソースコード

```python:jsonFileDownloadDemo.py
# -*- coding: utf-8 -*-
import requests
import base64
import os
from datetime import datetime

# ★ポイント1
# ex) set DOWNLOAD_SAVE_DIR=C:/Temp/flaskDownloadSaveDir
DOWNLOAD_SAVE_DIR = os.getenv("DOWNLOAD_SAVE_DIR")

# main
# json with base64 encoding
#   {
#     'fileName': 'ファイル名',
#     'contentType': 'mimetype',
#     'contentData': 'バイナリデータをbase64でエンコードしたascii文字列'
#   }
if __name__ == "__main__":

    # ★ポイント2
    url = 'http://localhost:3000/download/json'
    response = requests.get(url)

    # ★ポイント3    
    downloadData = response.json()
    fileName = downloadData['fileName']
    contentType = downloadData['contentType']
    contentDataAscii = downloadData['contentData']

    # ★ポイント4
    contentData = base64.b64decode(contentDataAscii)

    # ★ポイント5
    saveFileName = datetime.now().strftime("%Y%m%d_%H%M%S_") + fileName
    saveFilePath = os.path.join(DOWNLOAD_SAVE_DIR, saveFileName)
    with open(saveFilePath, 'wb') as saveFile:
        saveFile.write(contentData)
```

**★ポイント1**

サンプルではダウンロードしたファイルを保存するディレクトリを環境変数から取得できるようにしました。

**★ポイント2**

`requests`の`get()`でRest APIのURLにアクセスします。特別なことはありません。

**★ポイント3**

`json()`で受信したデータをjsonとしてアクセスします。
この時点ではファイルデータは単なるascii文字列になっているため、こちらも特別なことはありません。

* fileNameフィールド　：　ダウンロードファイルのファイル名
* contentTypeフィールド　：　ダウンロードファイルのMIMEタイプ
* contentDataフィールド　：　ダウンロードファイルのファイルデータ

**（注意）**
APIの仕様としてそのように定義しているだけです。

**★ポイント4**

今回の記事の最大ポイントです。jsonではバイナリデータを設定できないため、base64でエンコードしたascii文字列で送られてきます。
`base64.b64decode()`を利用してバイナリデータにデコードします。

**★ポイント5**

★ポイント4で取得したバイナリデータをファイルとして保存します。普通のファイル保存の処理です。
サンプルでは★ポイント1で取得したディレクトリに、年月日時分秒のプレフィックスを付与して保存しています。

## 3. さいごに

今回は`requests`で`Rest API(json形式)`におけるファイルダウンロードの方法について説明しました。
ポイントはbase64でデコードするだけなので、特に難しいところはなかったと思います。
**jsonのデシリアライズやbase64のデコードが発生するため、データサイズの大きなファイルのダウンロードは控えるようにした方がよいでしょう。**
PHP におけるクラス初期化 (static initializer)

# **クラス初期化方法**

Java では次の方法で、

```java
public class MyClass
{
    static
    {
        // クラスの初期化時に実行されるコード
    }
}
```

C# では次の方法で、

```csharp
public class MyClass
{
    static MyClass()
    {
        // クラスの初期化時に実行されるコード
    }
}
```

クラスの初期化時に実行するコードを記述することができる。

しかし、調べた範囲では、PHP の文法にはクラスを初期化する方法が用意されていないようだ。


# **議論**

Stack Overflow に 7 年以上前に投稿された「[Static class initializer in PHP](https://stackoverflow.com/questions/3312806/static-class-initializer-in-php)」という質問があり、回答が幾つか寄せられている。

「[シングルトンパターンを使うとよいのでは](https://stackoverflow.com/a/3312860/1174054)」という回答が Accepted されているが、これは愚策。クラス初期化コードを記述したいだけなのに、シングルトンパターンにしなければならないというのは馬鹿げている。

「[<code>public static function \_\_init\_\_()</code> を用意して autoloader でクラスロード時に呼ぶ](https://stackoverflow.com/a/3313137/1174054)」という方法も多くの Upvote を集めている。

「[<code>public static function init()</code> を用意してクラス定義の直後に呼ぶ](https://stackoverflow.com/a/3312881/1174054)」という方法は Accept された回答の次に Upvote を集めている。単純で分かりやすい。しかしながら、コメント欄に次のような書き込みがある。

> this is ugly. Your code makes `init` a public method, and it wouldn't work if it's private. Isn't there a cleaner way like the java static class initializer?

確かにクラス初期化メソッドが `public` なのは望ましくない。しかし、**ugly なのはクラス初期化方法を持たない PHP の言語仕様のほうだ**。

それにしても、PHP が `class` を導入した際、他言語での先行事例が既にあっただろうに、なぜクラス初期化の方法を仕様として定めなかったのだろうか？


# **private static メソッドを外部から呼ぶ**

初期化メソッドを `public` ではなくて `private` にできるのであれば、個人的には、クラス定義直後にクラス初期化メソッドを呼ぶ方法が分かりやすくて良いと思う（autoloader 等に依存したくない）。

PHP 5.3.2 で `ReflectionMethod` に追加された `setAccessible(bool)` を使えば、`private` メソッドでも呼ぶことができる。これを利用すれば、指定したクラスの `private static function initialize()` を実行する `LanguageUtility::initializeClass($class)` を次のように定義することができる。

```php
class LanguageUtility
{
    public static function initializeClass($class)
    {   
        try 
        {   
            // Get a static method named 'initialize'. If not found,
            // ReflectionMethod() will throw a ReflectionException.
            $ref = new \ReflectionMethod($class, 'initialize');

            // The 'initialize' method is probably 'private'.
            // Make it accessible before calling 'invoke'.
            // Note that 'setAccessible' is not available
            // before PHP version 5.3.2.
            $ref->setAccessible(true);

            // Execute the 'initialize' method.
            $ref->invoke(null);
        }   
        catch (Exception $e) 
        {
        }   
    }   
}
```


# **クラス初期化実行**

上記で定義した `LanguageUtility::initializeClass($class)` があれば、クラスの初期化は次のように記述することができる。

```php
class MyClass
{
    private static function initialize()
    {
    }
}

LanguageUtility::initializeClass('MyClass');
// 次のようにも書ける
// LanguageUtility::initializeClass(MyClass::class);
```

とはいえ、クラス初期化メソッドが `public` でも気にならないのであれば、Stack Overflow の回答にあったように、単純に次の方法で十分である。

```php
class MyClass
{
    public static function initialize()
    {
    }
}

MyClass::initialize();
```


# **まとめ**

- PHP の文法には、クラス初期化コードを記述する方法は無い。
- `static` なクラス初期化メソッドを定義し、自分で呼ぶしかない。
- クラス定義の直後にクラス初期化メソッドを呼ぶのが、単純で分かりやすい。
- クラス初期化メソッドを `private` にしたければ、`ReflectionMethod` を使う。
pip install時にMemory Errorが出た時の対処法

## 背景

AWSでpip install -r requirments.txtしている時に、
メモリが足りないためにMemory Errorが出たことがあった。

## 対処法

簡潔だが、以下のようにオプションを付すれば問題ない。

```
pip install -r requirments.txt --no-cache-dir
```

単体のpackageをインストールする時も同様のオプションを加えればいい。

これによってキャッシュが無効化されるのでメモリが少なくてもインストールできるとか。

## 参考

[Memory Error on pip install (SOLVED)](https://chirale.org/2017/01/15/memory-error-on-pip-install-solved/)
Nefry BTでGrove 温湿度(DHT11)センサーを使うメモ


[Nefry BTでほぼノンプログラムな湿度管理したい](https://qiita.com/tokutoku393/items/d4c91a28485bf568828c)の記事を参考に、試してみました。

* [adafruit/DHT-sensor-library](https://github.com/adafruit/DHT-sensor-library)
* [adafruit/Adafruit_Sensor](https://github.com/adafruit/Adafruit_Sensor)

の二つのライブラリをArduino IDEにインストールして以下のコードで実行しましょう。

(最初片方だけかと思ったけど両方必要でした 2018/5/20追記)

Nefry BTのGroveピンD0に配線します。

```dht11.ino
#include "DHT.h"

#define DHTPIN D0     // what digital pin we're connected to
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  Serial.println("DHTxx test!");
  dht.begin();
}

void loop() {
  delay(2000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  float hif = dht.computeHeatIndex(f, h);
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" *C ");
  Serial.print(hif);
  Serial.println(" *F");
}
```

![](https://i.gyazo.com/c7ed15232e7f08238fa0a9468b9b9475.gif)

実行するとこのような形で値が取得できます。
【windows】ファイル、フォルダーのパスを簡単コピペ

「このファイルのパスがほしいなー」
右クリックプロパティから取得？
フォルダを開いて、エクスプローラのアドレスをコピペ？
そのようなことをしなくても目の前にあるフォルダ、ファイルのパスが簡単に取得できます。
初歩的といえど、知っているか知らないかでは効率が天地になります。
▼フォルダを選択状態にしてから`Shiftキー＋右クリック`でパスのコピーという隠し選択がでます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/ed5bcae2-92f1-217e-f1ad-9d153c6de5bf.png)

これをクリックすることでクリップボードに保存（コピーした状態）されます。

もちろん複数選択した状態でも改行区切りでパスがコピーされます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/a24999a0-db68-0058-42e3-6e9fd93cfa0b.png)
windows10のコントロールパネルを手に届くころに登録する。

「Creator Updateにしたらコンパネがみつからない」
こんな事態に遭遇したということありませんか？
私もそのひとりでした。

頻繁に使わないけど使いたい時はすぐに開きたいツールですよね。
コンパネは実際は消えていないのでスタートにピン止めする、又は、タスクバーに登録することでこの問題を解消しましょう。
▼windowsキーをクリックして、「W」のフォルダに「windowsシステムツール」があるのでこちらから登録できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/fe4cfe3f-2478-57b3-aeeb-e41a35c9d08d.png)

当たり前のことが当たり前じゃなくなるこのメジャーアップデートですが、
慣れ親しんでいるユーザにとってこのような些細な変更がストレスになりかねません。
windows10のアップデートには日々期待を胸にバグを恐れずに即アップデートする私ですが、こういった変更はネガティブな意見があったら次のアップデートで戻してほしいと感じます。
正規表現をweb上で確認できるサイト。

正規表現のデバッグは意外と面倒。

あるとき、友人から勧められたサイトがこちら
http://okumocchi.jp/php/re.php

こちら、inputと正規表現を入力するだけで検査してくれます。
エンジニアなら言語かかわらず、重宝するサイトです。
基本的な正規表現はこちらで確認できるため、php、javascriptに関係なくデバッグできます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/6ec64d4f-e3d3-a422-3877-f31d30645fcd.png)
PHP Simple HTML DOM ParserがPHP7.2で動作しない時の対処法

# 環境
* PHP 7.2.0
* PHP Simple HTML DOM Parser 1.5.2

# 現象

以下の結果はfalseになります。

```php:test.php

<?php

require(__DIR__. "/vendor/autoload.php");

$uri = "https://qiita.com/tnm18";
var_dump($html = @Sunra\PhpSimple\HtmlDomParser::file_get_html($uri));

```


# 対処法

str_get_html()は問題なく動作するため、最も簡単な対処法は以下のようになります。

```php:test2.php
<?php

require(__DIR__. "/vendor/autoload.php");

$uri = "https://qiita.com/tnm18";
$html_str = @file_get_contents($uri);
var_dump($html = @Sunra\PhpSimple\HtmlDomParser::str_get_html($html_str));

```

PHP Simple HTML DOM Parserは非常に簡単にDOM操作を行える優れたライブラリですが、ページのサイズが600KBを超えた場合にただfalseを返すだけだったりとエラー処理も非常にシンプルです。
chromeでjqueryの入っていないサイトをデバッグする。

「デバッグしたいけどjqueryが入っていないからやりにくい！」
このように感じるwebエンジニアの皆様。

とても簡単にjqueryをchromeにロードすることができます。
下記のコードを開発者モード->sources->Snippetsより登録することで、常にjqueryを読み込んだ状態にすることができます。

```javascript
//即時関数でjqueryを読み込む
!function () {
  var script = document.createElement("script");
  script.setAttribute("src", "//code.jquery.com/jquery-2.0.0.min.js");
  document.body.appendChild(script);
}();
```

必要がない場合はこれを削除または、無効化すればOK。
最近のbiosの乗ったコンピュータにlinuxをインストールする際のパーティションの切りかたについて - UEFI boot について

備忘録として
##ケース
新しくノートパソコンを新調して、以前と同じディレクトリ構成でパーティションを切っていくとパーティション作製時に見たことのない警告が表示される。そのままインストールを続けるとgrubをインストールする時点で "No EFI partition was found" というエラーがでて、インストール後にきちんと起動しない。
##解決策
ディスクの先頭に 500MB-1GBの 'EFI system partition' を作製します。
##なにそれ
これまでコンピュータを起動する際、BIOSは[MBR](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%96%E3%83%BC%E3%83%88%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89)を読んでOSを起動していました。
より安全なブートの方法として、[EFI system partition](https://ja.wikipedia.org/wiki/EFI%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3)を使用して起動する方法が作られました。
マスターブートレコードではなく、一般のパーティションに起動用のデータを収録しようという考えです。
したがって、BIOSが十分新しいコンピュータでは、構成のどこかに(理想的には最初のパーティションに)EFIシステムパーティションがある必要があります。
##参考
[GRUB and the Boot Process on UEFI-based x86 Systems](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/installation_guide/s2-grub-whatis-booting-uefi)
疑似ハッキングチャレンジ

Webのセキュリティを見破れ！
疑似的にクラックを体験することができます。
http://www.hackerschool.jp/hack/

レベルがいくつかあり、ブラウザの開発者モードをなどを駆使して不正アクセスをチャレンジするサイトです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/7660584f-df11-763b-9125-09fc9ffd7c1d.png)
ハッシュについてのまとめ

# はじめに
最近、ブロックチェーンについて調べたり勉強してたのだが、その中でハッシュが何度も使われているため、まとめてみました。

# ハッシュ関数とは
あるデータが与えられた時に、そのデータを代表する値を導く操作、あるいはその数値を得るための関数。
hashは「切り刻んで混ぜる」の意味。ハッシュドビーフのハッシュ。

# 用途
## ハッシュテーブル
検索キーのハッシュ値を取って、それを基準に値を格納する方法。
プログラミング言語で、連想配列を`ハッシュ`と呼ぶのは、連想配列の実装にハッシュテーブルが使われているため。

## データ区分・検証用
gitのidとしてSHA-1が使われています。
ブロックチェーンのブロック、トランザクションの識別にはSHA-256が使われています。

## 変更・改ざん検出
データが正しくコピー、転送されたか確認するために、ハッシュ値と照らし合わせることがあります。（チェックサム計算やCRCの計算）
ビットコインのブロックチェーン技術にも、改ざん検出の為にハッシュ値が使われます。

## 電子署名
電子証明書のハッシュ値を計算し、そのハッシュ値を暗号化することで、証明書が改ざんされていないことを確認できるようになっています。
現在は、電子署名にSHA-2アルゴリズムが使われています。

# ハッシュ関数に必要な性質
* データが少しでも変わったら、ハッシュ値も変化する
* データが異なるが、ハッシュ値が同じになる（衝突する）ことが少ない
* 低計算コスト
* ハッシュ値から元のデータが推測できない

# 代表的なハッシュ関数
## チェックサム
単純加算のチェックサムも、簡易なハッシュ値算出方法の一つ。
データの改ざんに対する耐性はない。

## CRC（巡回冗長検査）
誤り検出符号の一つ。
デジタル回路で実装が容易なことから、データ転送の誤り検出によく使われる。
多数のバリエーションがあり、ハッシュ値のビット数により CRC-○○と呼ばれる。
データの改ざんに対する耐性はない。

## md5
与えられた入力に対して128ビットのハッシュ値を出力するハッシュ関数。
電子署名のために開発されたが、現在は、理論的な弱点が見つかり電子署名には使われていない。

## SHA-1
Secure Hash Algorithmシリーズの１つ。gitのidに使われている。
SHA-1は、160ビット（20バイト）のハッシュ値を生成する。
gitのidが衝突する（違うコミットが同一idになる）確率は以下と言われている。

>[How hard is it to get a git hash collision?](https://diego.assencio.com/?index=eacd6eedf46c9dd596a5f12221ad15b8)

>非常に大きなプロジェクトで、1000人のアクティブな開発者が、日に10回のコミットをしたとする。この場合、4×10の17乗年間活動を続けると、50%の確率で衝突が発生する。 

（4x10の17乗年は、40京年）

以前は、SSLサーバ証明書の電子署名に使われていたが、攻撃法の研究が進んだことにより、電子署名の用途はSHA-2に置き換えられている。
2017年、同じSHA-1ハッシュ値を持つ異なるデータがgoogleにより公開された。（後述）

## SHA-2
SHA-2はSHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256の6つのバリエーションを持ち、ハッシュ長は224、256、384、512ビットのいずれか。
今のところ、脆弱性は見つかっていない。

#  SHA-1衝突の検証
2017年2月にGoogleとオランダのCWI研究が、SHA-1衝突に成功したと発表し、衝突しているPDFを公開しました。
衝突しているPDFファイルは以下からダウンロードできます。
[shattered](https://shattered.io/)

pythonでは、`hashlib`を使って各種アルゴリズムでのハッシュを計算できます。

```
>>> import hashlib
>>> hashlib.md5(b'hello hello').hexdigest()
'f52d885484f1215ea500a805a86ff443'
```

ダウンロードしたPDFのSHA-1を算出すると、同じになっていることが確認できますが、md5を計算すると異なる値になっています。実際に開いてみても異なるPDFです。

```
>>> import hashlib
>>> with open('shattered-1.pdf','rb') as f:
...     hashlib.sha1(f.read()).hexdigest()
...
'38762cf7f55934b34d179ae6a4c80cadccbb7f0a'
>>> with open('shattered-2.pdf','rb') as f:
...     hashlib.sha1(f.read()).hexdigest()
...
'38762cf7f55934b34d179ae6a4c80cadccbb7f0a'

>>> with open('shattered-1.pdf','rb') as f:
...     hashlib.md5(f.read()).hexdigest()
...
'ee4aa52b139d925f8d8884402b0a750c'
>>> with open('shattered-2.pdf','rb') as f:
...     hashlib.md5(f.read()).hexdigest()
...
'5bd9d8cabc46041579a311230539b8d1'
```

>（参考）
>[「ハッシュ」ってどんな意味？](https://qiita.com/jkr_2255/items/4787055c8f600695658d)
>[巷で話題のGoogleのSHA-1衝突やってみた](http://73spica.tech/blog/sha1-collision/)
windows10で直ぐに画面キャプチャをするショートカット

Creators updateから重宝しているショートカットキー「Windows+Shift+S」が本当に便利です。
↓Windows+Shift+Sで貼り付けました
▼Qiita
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/2849e1c2-5da4-7a01-cee1-8e8fe3c9cd6e.png)
▼Twitter
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/b63c4d43-c716-a285-8653-e23b155a2e78.png)
▼Discord
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/8176de1b-6336-914f-1563-4dc59880706e.png)

直ぐに範囲選択してキャプチャをクリップ登録できるので、あとは画像で保存するか、ツイッターやディスコード、もちろんqiitaの本文に直接貼りけることもできます。
Coursera Deep Learning Specialization 受講記録

###*各コースの受講記録はこちら（随時更新)*
1. [Neural Networks and Deep Learning](https://qiita.com/onooooo/items/a9dce7da839efb1c5925)
2. Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization
    - [Week 1 Practical aspects of Deep Learning](https://qiita.com/onooooo/items/8a571a78605fce18be22)
    - [Week 2 Optimization algorithms](https://qiita.com/onooooo/items/fcb86624b837c734aa60)
    - [Week 3 Hyperparameter tuning, Batch Normalization and Programming Frameworks](https://qiita.com/onooooo/items/a648062b67893fd1b58f)
3. Structuring Machine Learning Projects
4. Convolutional Neural Networks
    - [Week 1 Foundations of Convolutional Neural Networks](https://qiita.com/onooooo/items/7e1dadb271085045f2c4)
    - [Week 2 Deep convolutional models: case studies](https://qiita.com/onooooo/items/f35f521c6f68a2d88454)
    - Week 3 Object detection
    - Week 4 Special applications: Face recognition & Neural style transfer
5. Sequence Models

#概要
Courseraの[Deep Learning Specialization](https://www.coursera.org/specializations/deep-learning)の受講記録。
※受講のモチベーションをつなぎとめるための個人的なメモです。

#背景
###仕事のこと、自分のこと
インフラエンジニア。機械学習やビッグデータのバックグラウンドは皆無。
高校は理系だったが数学が苦手で、大学は文系。
当時、「数学なんてこれからさきの人生で二度と触れることはないだろう」と思っていた・・・

###会社のこと
昨今のAIブームのあおりで会社も「これからはAIだ！AIでイノベーションで新しいビジネスの拡大だ！（意訳）」と息巻いているが、末端の社員は「いやいきなりそんなこと言われても・・・」となっている。

###そんな中で
自分で機械学習のことを学ぼうと思い、いくつかの書籍を読んでみた。
・[JDLA ディープラーニングG検定](http://www.jdla.org/business/certificate/#education) 合格
・[Google Certified データエンジニア 合格](https://qiita.com/onooooo/items/103d82bda9eefaf8f137)
この勢いで[DL4US](http://dl4us.com/)だ！と思ったけど選考落ち。。（日本語でディープラーニングの最新の技術を学べる講座はすごく貴重と思ったが、さすがに倍率も高かった模様・・・）
ということでAndrew先生のDeep Learningのコースを受講することに。

#講座の構成
Courseraでは、あるテーマを学ぶための一連のコースのセットを「Specialization」と呼んでいる。
このSpecializationは５つのコースから構成される。

##1. Neural Networks and Deep Learning
   想定受講期間：４週間
   このSpecialization講座の導入。ディープラーニングの基礎を学ぶ。

##2. Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization
   想定受講期間：３週間
   モデルの精度を高めるための様々な手法について学ぶ。TensorFlowについても学ぶ。
   キーワード：初期化、L2およびドロップアウト正規化、バッチ正規化、Momentum、RMSprop、Adam…

##3. Structuring Machine Learning Projects
   想定受講期間：２週間
   効率よく成功率の高い機械学習プロジェクトを構築する方法を学ぶ。
   （他のコースにくらべて説明文がいまひとつピンと来ない。）
   キーワード：end-to-end learning, transfer learning, multi-task learning	

##4. Convolutional Neural Networks
   想定受講期間：４週間
   CNNをつかって主に画像認識などのタスクを処理する方法を学ぶ。
   キーワード：CNN

##5. Sequence Models
   想定受講期間：４週間
   自然言語やオーディオなどのシーケンスデータを処理するモデルの作成方法を学ぶ。
   キーワード：RNN、GRU、LSTMなど。

#受講料
Courseraの課金の仕組みが良くわからない。。。
月額49$、ただし修了証が不要なら無料で受けられる、という記事をよく見かける。
自分の場合、Googleのデータエンジニアの講座を有料で受けたからなのか、理由はよくわからないが、いろいろなSpecializationが無料で受講できる状態になっている。
なのでこのSpecializationも今のところ無料で受講ができている。

##2018/02/12 追記
[Coursera×Z会 のGoogleのデータエンジニアの講座](http://www.zkai.co.jp/home/coursera/course/gcd.html) を受講している場合に「システムの不具合」があり、Courseraのコースが受講し放題になっていたとのこと。不具合が解消されたら受講し放題もなくなるようです。まさかそんなオチだったとは・・・
ちょっとずつ読むドメイン駆動設計 第四部 戦略的設計 第十六章 大規模な構造 進化する秩序

# 大規模な構造

モジュールや、コンテキスト境界が大量になると、全体が見えなくなる。
「鳥の目」で境界づけられたコンテキストを横断して、全体を見るためのパターン群。

# 進化する秩序

概念上の大規模な構造をアプリケーションと共に進化させる。
場合によって、全く別の種類の構造に変更する。

構造を進化させるためには、モデルがアーキテクチャによって束縛されないようにする。
フレームワークなどアップフロントに構造を規定するのは難しい。
アプリケーションを大幅に明確化、単純化するように設計ができなくなる。

構造を見つけるのは困難な作業ですが、この先、４つのパターンが紹介されています。

というわけで、明日は４つのパターンを読んでいきます。
Python3をVisualStudio2015,2017で開発できるようにしようとした際に詰まったこと。


#対象
・これからPython3を始めようとしている人。
・PythonをVisualStudioで開発を行いたいと思っている人
に対して、とりあえず、こうしたら、おおまか動作確認を行うところまでいけたよー
っていう共有という名のメモです。

参考程度によろしくお願いいたします。

#免責について
この記事は、対象にも記述いたしましたが、とりあえずこうしたら動いたぞやったー！とするひとつの方法です。
環境によっては、全然できなかったりする場合はございますので、その辺は自己責任でお願いいたします。

##ざっとした環境
Unityを触る工程でVisualStudio2017Comminityを入れている。
もしくは、UnityとVisualStudio2015Pro版を入れている状態の2種類のPC環境で行いました。

##環境構築の際に行う事
１．Pytohn3のインストール　と　その時の普通はやらない注意点
２．VisualStudioインストーラーで行う事
３．VisualStudio2015年版の際での環境構築の仕方について。


※１に関しては、２で同時に行えるかもしれません。が試してないので、わかりません。
あくまでも、この記事は、私個人が、こうやったらとりあえず動いたやったーのための記事です。


##実際に詰まった出来事
環境構築の際に行う事で、詰まった所と注意する所を記述だけします。
実際のインストール等の作業は、もっと詳しいとか、参考になるサイトをURLに記述するため
簡易な説明になりますことをご了承ください。
###１の工程で、やってしまった事
基本的には、Pythonのインストールサイトに行き、インストールを行うだけのものとなります。
詳しい内容は、参考にしたURL１と２をご確認ください。

さて、やってしまった内容としては、インストールする際に、ディレクトリを選択することも可能です。
基本的には、特に選択しないを選んでおくと、Pythonを触るだけの場合は大方問題ありません。

####ディレクトリを変更する際にきおつけろ！
ディレクトリを自身の手で変更する場合は、書き込み可能領域の所にインストールを行ってください。
ざっくりいうとC以下のProgramFileとかに入れてしまうと、Pythonにモジュール（UIを出す為のものとか）を
追加した際にエラーを吐いて、追加で入れることが出来ません。
この辺の事は、Pythonのインストーラーで、ディレクトリを自身で決めるを選んだ時に英語で、
そういったニュアンスの事が書かれています。

英語大切だね。ほんとっ。



###２の工程で、詰まったこと
VisualStudioの最新版（今だと2017）の場合
VisualStudioのインストーラーをダウンロードを行い。
Pythonに必要な物をダウンロードを行うことで、VisualStudioで楽しい開発が始められます。
ただ追加の際に、少し困ることになったりするかもしれません。
####ワークロードにPythonないやん！
インストーラーが起動すると上のメニューバーで、ワークロードと個別コンポーネントと言語パックがあるかと思います。
インストール自体は、ワークロードで行うのですが、現時点では、候補がないかもしれません。
ここに関しては、すでに若干うろ覚えで申し訳ないのですが、個別コンポーネントでPython言語サポート及び、PythonWebサポートにチェックを入れることで、ワークロードの項目にPython開発がでるので、Python開発にチェックを入れてください。
チェックを入れることで、右側に、概要となっている所にPython開発とあって、オプションがあると思います。
そこのチェックを入れてください。
入れる項目は以下です。
cookiecutter(よくわからない)
PythonWebサポート（でもWeb関係する予定がない場合はいらないかも）
Python3.64ビット（これがもしかしたら、1の工程を行ってた場合はいらないかも）

Anacondaは2017の場合入れておくと環境構築をやってくれてました。


VisualStudio2015版の場合、上記のようにインストーラーを取得する事が出来ないので、
別のアプローチで入手する必要があります。
参考にしたURLの3の手順で基本的行えます。
むしろ問題は仮想環境の構築なので、注意してください。
次項目で記述します。



###３の工程での環境構築の詰まったこと

####VisualStudio2015の場合、仮想環境の構築を自分でやらなければいけない！
基本的には、URL３で行けるのですが、仮想環境の構築を行う際にどこを参照していいかまではわかりずらいです。
URL3の後半の記事で、仮想環境の構築を行うのですが、そこがわかりずらい。
手順としては以下（間違ってるかもしれませんが、一応動きます）
記事の手順通り、表示＞その他のウィンドウ＞PythonEnvironmentを開きます。
この後指定するような手順を踏んでますが、この指定一切せずに名前だけPythonのverとか記載して、追加してください。
※この名前はDescriptionというところ。
その後、歯車みたいなオプションマークを選択し、PytonToolsのEnvironmentOptionがあると思います。
そこに
　Path：”python.exe” のあるフォルダを指定
　		Windows Path：”pythonw.exe”のあるフォルダを指定
		　Library Path：ライブラリフォルダを指定
		　Architecture：自分の使っているOSにあわせて選択
		　Language Version：使いたいPythonのバージョンを選択
		　Path Environment Variable：（正直いまいちわからないけど）環境変数名を自由に入力
で設定すると、一応環境構築終了です。

#終わりに
文字ばかりで、大変見づらいですが、あくまでも参考程度によろしくお願いします。
次はTkinterの記事を書こうかと思いますが、ここすごく書きづらいので、別の箇所で記述をするかも？
マークアップ形式とか聞いてないよwまったくｗ


#参考にしたURL
１．Pythonをインストールを行うサイト
https://www.python.jp/about/
２．具体的なインストールの手順
https://www.pythonweb.jp/install/install/index1.html

３．VisualStudio2015で行った際に参考にしたサイト
http://tech.pjin.jp/blog/2017/02/28/python-primer-17/
Goで全角/半角変換する

一応Goの標準ライブラリに[text/width](https://godoc.org/golang.org/x/text/width)というパッケージがあるのですが半角カタカナの濁音・半濁音を正しく（プ<=>ﾌﾟなど）変換できていなかったので変換する[go-moji](https://github.com/ktnyt/go-moji)パッケージを作りました。インターフェースの部分で[Moji.js](https://github.com/niwaringo/moji)を参考にさせて頂きました。

## 前置き
この記事を書きながら調べてて知ったんですが[text/unicode/norm](https://godoc.org/golang.org/x/text/unicode/norm)というのもあるんですね... 使い方がややこしそうですが中身をこれに引っ越すかもしれません。

## インストール方法
go getしましょう

```sh
$ go get github.com/ktnyt/go-moji
```

## 使い方
```go
package main

import (
	"fmt"

	"github.com/ktnyt/go-moji"
)

func main() {
	s := "ＡＢＣ ABC　あがぱ　アガパ　ｱｶﾞﾊﾟ"

	// 全角英数を半角英数に変換
	fmt.Println(moji.Convert(s, moji.ZE, moji.HE))

	// 半角英数を全角英数に変換
	fmt.Println(moji.Convert(s, moji.HE, moji.ZE))

	// ひらがなをカタカナに変換
	fmt.Println(moji.Convert(s, moji.HG, moji.KK))

	// カタカナをひらがなに変換
	fmt.Println(moji.Convert(s, moji.KK, moji.HG))

	// 全角カタカナを半角カタカナに変換
	fmt.Println(moji.Convert(s, moji.ZK, moji.HK))

	// 半角カタカナを全角カタカナに変換
	fmt.Println(moji.Convert(s, moji.HK, moji.ZK))

	// 全角スペースを半角スペースに変換
	fmt.Println(moji.Convert(s, moji.ZS, moji.HS))

	// 半角スペースを全角スペースに変換
	fmt.Println(moji.Convert(s, moji.HS, moji.ZS))
}
```
AndroidProfilerとBulidエラーについてメモ

#概要
UnityのAndroidProfilerを初めて使ったのでメモしておこうと思います。
それと，久しぶりにBulidしたらエラーがでてしまったので，
それの対処方法のメモです。

####開発環境
Unity2017.2.0f3


#参考資料
趣味なメモ：ゲームとかプログラムとか
http://programmemo.omaww.net/unity/unity-androidprofiler

#Bulidエラーの原因と対処
C:\Users\○○\AppData\Local\Android\Sdk\build-tools\26.0.0\apksigner.bat'

上記なような感じのエラーがでてきてしまった。（ちょっと違うかもしれないです。すみません。）
結論から言うと，古いversionのbulid-toolsからapksigner.batとapksigner.jarをもってきて
bulid-tools\26.0.0の中にコピーして解決。(ちなみに僕は25.0.3から持ってきました)



#UnityのAndroidProfiler実行手順の補足
上記の参考資料でだいたい解決すると思います。
今回はWifi経由で行ったので，そっちの方だけメモしておきます。
ADB経由も機会があればやってみようと思います。

//今回実行した手順
1.Androidをパソコンと接続。
2.端末の方のUSBDebugモードの設定を行う。
3.BulidSettingsでDevelopment BulidとAutoconnect Profilerにチェックを入れる。
4.端末にapkを入れる。
5.アプリをデバイス上で起動したら，プロファイラを開きます。
6.プロファイラウィンドウのConnected PlayerからAndroidと書いてある項目を選択。

この手順でだいたいプロファイラが動くのが確認できると思います。
UnityはプロファイラやFrameDebugerがあるので，ゲームのデバッグ作業がやりやすくてほんとに助かります。
Rails TutorialでAWS Cloud9上にHerokuがなかった

##まずはじめに
このエントリーは私のQiita初エントリーになります:relaxed:

軽く自己紹介

* SIer歴9年のいわゆる中堅をやってます
* 基幹システムをメインに開発・運用・保守の案件に携わってます
* 思う所があってWebエンジニアへシフトしたくて勉強を開始しました:sunglasses:

勉強した内容をアウトプットする習慣付けするため、Qiita投稿頑張りたいと思います。
至らぬ点や認識相違がありましたら教えていただけると励みになります:sob:


##Rails TutorialでAWS Cloud9上にHerokuがなかった
WebエンジニアならまずはRailsやろ！って事で王道を往くRails Tutorialを参考に勉強開始！！
途中まですんなり進められていたのですが、HerokuにサンプルアプリをDeployする所で詰まりました。

>次にHerokuのアカウントを新規作成して設定します。まずはHerokuのユーザー登録を行います。続いて、自分のシステムにHerokuコマンドラインクライアントがインストールされているかどうかを確認します。

```
$ heroku version
```

実際にやってみると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/212675/3f47a1f6-574a-d4b0-7bc3-0472e6a3059e.png)
（デデドン）
どうやらheroku自体がインストールされていないようだ。

我らがぐーぐる先生に思いついたワードで検索してみても、
検索結果のページでは既にHerokuがインストールされている事が前提のようにサクサク説明進めている･･･。

AWS Cloud9上のSupportタブからGet Help(Community)で同じ様な困った人がいないか検索した所

__Is heroku available in the cloud9 ide?__
https://forums.aws.amazon.com/thread.jspa?messageID=821168&tstart=0

いました！！  
以下のPost内容を試してみる。。。

>Posted by: erco1961
>Posted on: Jan 3, 2018 3:22 PM
>I fixed the trouble by updating the node to latest version...

```
nvm install node
nvm use --delete-prefix v9.3.0
npm install -g cli-engine-command@8.0.0
npm install -g heroku-cli
```

上手くインストールが出来た模様・・・？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/212675/15c5bad6-c673-20e4-a128-a1394d9bdfaf.png)

上述Postのコマンドを実行すると、所々WARNが出ているのが気になりましたが、
Rails Tutorialの作業は一旦進めることができるようなりました。

正しい手順であったのかは後で調べて見ることにします:thinking:

##追記 2018.01.17
コメントを頂きまして、この問題は解決されたようです！
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/Rails%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB?src=hash&amp;ref_src=twsrc%5Etfw">#Railsチュートリアル</a> が Rails 5.1.4 に対応しました! 🆙✨<a href="https://t.co/37QWOcMbxA">https://t.co/37QWOcMbxA</a><br><br>また、AWS Cloud9 への移行に伴って Heroku Toolbelt がデフォルトでインストールされていない問題についても解決しました 🔧💨 <br><br>１つ１つの変更は小さいですが、全体としては1,000行近い修正となっています 📕✨ <a href="https://t.co/8GFhNmwqQZ">pic.twitter.com/8GFhNmwqQZ</a></p>&mdash; Railsチュートリアル (@RailsTutorialJP) <a href="https://twitter.com/RailsTutorialJP/status/953465443540348928?ref_src=twsrc%5Etfw">2018年1月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

情報提供してくれました @yasulab さんに感謝:bow:
cakephp3とcomposerのインストールし直し ubuntu

#目的
インストール時、エラーメッセージが出るがなぜかcakephp3がインストールできてしまう。
気持ち悪いので対応策をメモ

##環境
ubuntu派生OS

##エラーメッセージ
1.file_put_contents(/home/hoge/.composer/cache/repo/https---packagist.org/provider-symfony$polyfill-mbstring.json): failed to open stream: Permission denied
http://packagist.org could not be fully loaded, package information was loaded from the local cache and may be out of date

2.Do not run Composer as root/super user
（sudoやスーパーユーザでインストールする際、これで怒られる。

#やり方
composerのアンインストール、再インストールとcakephp3のインストール

```command
find ~/ -name "*composer*" //で探してから
sudo rm -rf .composer // 削除。　勉強不足でパイプライン使わず、
sudo rm -rf composer
sudo apt-get purge --auto-remove composer //apt-getでインストールした場合
```

```command
公式サイト通りインストール
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
``````

``````command
sudo mv composer.phar /usr/local/bin/composer //このディレクトリに移してリネームするとcomposerだけで使える
composer self-update //（念の為アプデ）
composer create-project --prefer-dist cakephp/app cakephp //おなじみ
```
参考サイト
[CakePHP3.xの詳細インストール手順](https://jmatsuzaki.com/archives/15856)
[[PHP]Composer自体を完全にアンインストールする方法](https://akamist.com/blog/archives/287)
[Download Composer](https://getcomposer.org/download/)

参考サイト様のおかげで解決することができました。
ありがとうございます。
macOS High Sierra + zsh でDocker構築で、ハマったところ

「Docker　for　Mac」でDockerをダウンロードし、
https://docs.docker.com/docker-for-mac/install/#download-docker-for-mac
その手順どおりに環境構築したところ、
どうも動かない...
で、ちょっとハマったので、その対応方法を記載します。

OS : macOS High Sierra
terminal : zsh

まずは、上記のリンクから、記載通りに、Dockerをダウンロードし、macにインストールします。
(私は、stableを選びました)

https://docs.docker.com/get-started/#prepare-your-docker-environment
で、上記リンクに従い、手はず通り、
` docker --version`
を実行すると、

` zsh: command not found: docker `

って、なりました。

多分パスが通ってないんだろうなーと思いつつ、
あれ、dockerってどこあるん？
と思ったので、調査してみると、
` /usr/local/bin `
に、dockerのシンボリックリンクがおいてありました。
（後、docker-composeとかも）

で、パスを見てみる。
```
echo $PATH
/usr/bin:/bin:/usr/sbin:/sbin
```

じゃあ、パス追加すんぺ
ということで、
.zshenvに下記を追加

```
export PATH="$PATH:/usr/local/bin"
```

無事、解決！
Mac 用タイル型ウィンドウマネージャ chunkwm

[chunkwm](https://github.com/koekeishiya/chunkwm) を利用すると，開いたウィンドウが互いに重ならないように自動でサイズ調整・配置変更される．また，キーボードショートカットでウィンドウサイズや配置を微調整したりアクティブなウィンドを切り替えたりできる．

- ウィンドウのサイズ調整や並び替えに頭を使わなくても良くなる
- キーボードから手を離さずに作業できるようになる

>![](https://cdn-ak.f.st-hatena.com/images/fotolife/s/shihanng/20171220/20171220175936.gif)
>画像引用元: http://hde-advent-2017.hatenadiary.jp/entry/2017/12/24/000000

　
>![](https://cloud.githubusercontent.com/assets/6175959/25564481/6863954c-2db4-11e7-8332-221cecb52ce5.gif)
>画像引用元: https://koekeishiya.github.io/chunkwm/screens.html

## setup するもの
- chunkwm: ウィンドウマネージャ本体
- khd: ウィンドウマネージャを制御するためのショートカットキーを管理するもの

## 手順
### chukwm
#### chukwm のインストール
```
$ brew tap crisidev/homebrew-chunkwm
$ brew install chunkwm
```

#### .chunkwmrc ファイルの準備
```
$ cp /usr/local/opt/chunkwm/share/chunkwm/examples/chunkwmrc ~/.chunkwmrc
$ chmod +x ~/.chunkwmrc
```

設定ファイルを編集する際に参考にするところ:

- [macOSのタイル型ウィンドウマネージャであるchunkwmを試してみた](https://qiita.com/crocus7724/items/d882b22596b6b2f89998)
- https://github.com/koekeishiya/chunkwm/blob/master/examples/chunkwmrc



#### .chunkwm_plugins の準備
```
$ mkdir ~/.chunkwm_plugins
$ cp /usr/local/opt/chunkwm/share/chunkwm/plugins/* .chunkwm_plugins/
```

### khd
#### khd のインストール
```
$ brew install khd
```

#### .khdrc の準備
```
$ cp /usr/local/opt/chunkwm/share/chunkwm/examples/khdrc ~/.khdrc
```

ショートカットキーはこのファイルを読めば確認できる．

### services
```
$ brew services start chunkwm
$ brew services start khd
```
既にスタートしている場合はリスタートで設定ファイルの変更を反映できる．

また、外部ディスプレイに接続などすると表示が崩れるので、その場合もリスタートすることで解消できる．

```
$ brew services restart chunkwm
```

## 参考
- [koekeishiya/chunkwm - GitHub](https://github.com/koekeishiya/chunkwm)
    - [Instructions: chunkwm with (s)khd on macOS High Sierra](https://github.com/koekeishiya/chunkwm/wiki/Instructions:-chunkwm-with-(s)khd-on-macOS-High-Sierra)
- [macOSのタイル型ウィンドウマネージャであるchunkwmを試してみた](https://qiita.com/crocus7724/items/d882b22596b6b2f89998)
- [ChunkWM tutorial on macOS! - YouTube](https://www.youtube.com/watch?v=ZUMucXKU4Fw)