OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu ディスクサイズの確認

- Disk サイズを確認。
    - sudo parted
        - p free

```
inohana@ino-ubuntu:~/repo/chef/Packages$ sudo parted /dev/sda
sudo: unable to resolve host ino-ubuntu
[sudo] password for inohana:
GNU Parted 2.3
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)
(parted) p free
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 4295MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type      File system     Flags
        32.3kB  1049kB  1016kB            Free Space
 1      1049kB  3221MB  3220MB  primary   ext4            boot
        3221MB  3222MB  1048kB            Free Space
 2      3222MB  4294MB  1072MB  extended
 5      3222MB  4294MB  1072MB  logical   linux-swap(v1)
        4294MB  4295MB  1049kB            Free Space

(parted) quit
```
- Use が100% になっています。
    - df -k

```
inohana@ino-ubuntu:~/repo/chef/Packages$ df -k
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1        3029776 2828972     27188 100% /
none                   4       0         4   0% /sys/fs/cgroup
udev              498156       4    498152   1% /dev
tmpfs             101792     544    101248   1% /run
none                5120       0      5120   0% /run/lock
none              508956       0    508956   0% /run/shm
none              102400       0    102400   0% /run/user
inohana@ino-ubuntu:~/repo/chef/Packages$ swapon -s
Filename                                Type            Size    Used    Priority
/dev/sda5                               partition       1046524 0       -1
```

- その他のコマンド
    - sudo du -s -h /*
        - s はサマリ
        - h は表記方法の指定
    - sudo fdisk -l -u /dev/sda

```
inohana@ino-ubuntu:~$ sudo du -s -j -h /*
9.5M	/bin
34M	/boot
4.0K	/dev
5.9M	/etc
288M	/home
0	/initrd.img
272M	/lib
4.0K	/lib64
16K	/lost+found
12K	/media
4.0K	/mnt
1.1G	/opt
du: cannot access ‘/proc/2121/task/2121/fd/4’: No such file or directory
du: cannot access ‘/proc/2121/task/2121/fdinfo/4’: No such file or directory
du: cannot access ‘/proc/2121/fd/4’: No such file or directory
du: cannot access ‘/proc/2121/fdinfo/4’: No such file or directory
0	/proc
56K	/root
544K	/run
11M	/sbin
4.0K	/srv
0	/sys
4.0K	/tmp
208K	/user01
619M	/usr
480M	/var
0	/vmlinuz
```

```
inohana@ino-ubuntu:~$ sudo fdisk -l -u /dev/sda

Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000cebba

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     6291455     3144704   83  Linux
/dev/sda2         6293502     8386559     1046529    5  Extended
/dev/sda5         6293504     8386559     1046528   82  Linux swap / Solaris
[apt][aptitude] パッケージの過去バージョンも含めた取得可能バージョンを調べる方法

GitLabのアップデートの前にパッケージのバージョンを見たかったため、やり方を調べたメモ

# apt の場合

`apt-cache policy <package name>` を使用する

```console:aptの場合
$ sudo apt-get update
$ apt-cache policy gitlab-ce | head
gitlab-ce:
  Installed: 8.16.1-ce.0
  Candidate: 8.17.2-ce.0
  Version table:
     8.17.2-ce.0 0
        500 https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu/ trusty/main amd64 Packages
     8.17.1-ce.2 0
        500 https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu/ trusty/main amd64 Packages
     8.17.0-ce.0 0
        500 https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu/ trusty/main amd64 Packages
```

```console:特定バージョンの最新バージョン名を取得
$ export specific_version=8.11.0
$ apt-cache policy gitlab-ce | tail -n +5 | grep -v "http" | awk '{print $1}' | sort -r | grep ${specific_version} | head -n 1
8.11.0-ce.1
```

# aptitude の場合

`aptitude versions <package name>` を使用する。
aptitudeはaptと逆順表示なので注意。

```console:aptitudeの場合
$ sudo aptitude update
$ aptitude versions gitlab-ce | tail
p   8.16.3-ce.0                                   trusty                    500
p   8.16.3-ce.1                                   trusty                    500
p   8.16.4-ce.0                                   trusty                    500
p   8.16.5-ce.0                                   trusty                    500
p   8.16.5-ce.1                                   trusty                    500
p   8.16.6-ce.0                                   trusty                    500
p   8.16.7-ce.0                                   trusty                    500
p   8.17.0-ce.0                                   trusty                    500
p   8.17.1-ce.2                                   trusty                    500
p   8.17.2-ce.0                                   trusty                    500
```

# 参考
[Check package version using apt-get/aptitude? - Unix & Linux Stack Exchange](http://unix.stackexchange.com/questions/6284/check-package-version-using-apt-get-aptitude)
《CreateJSとか》canvas要素の高解像度デバイスへの対応のしかた。

「CreateJS」を利用しているときなど `canvas`要素に何か描画するとき、`canvas`要素はビットマップなので、Retinaディスプレイなどの高解像度ディスプレイだと、ボケて表示されてしまいます。

これに対応するのはとても簡単で、画像をRetina対応するときと同じような方法で実現することができます。
元の画像を大きくしておいて、`style`属性で縮めるやり方です。

JavaScriptで制御します。

## コード

```js

const canvas = document.getElementById('exCanvas');

canvas.width *= devicePixelRatio;
canvas.height *= devicePixelRatio;

canvas.style.width = String(canvas.width / devicePixelRatio) + "px";
canvas.style.height = String(canvas.height / devicePixelRatio) + "px";

```


## 解説

まず、取得した`canvas`要素の幅と高さの、`width`属性と`height`属性をdevicePixelRatio分だけ拡大します。

```js

canvas.width *= devicePixelRatio;
canvas.height *= devicePixelRatio;

```

つぎに、`canvas`要素の`style`属性の`width`と`height`を`devicePixelRatio`分だけ縮小します。

```js

canvas.style.width = String(canvas.width / devicePixelRatio) + "px";
canvas.style.height = String(canvas.height / devicePixelRatio) + "px";

```


これで高解像度対応することができました。


## CreateJSのとき

`if`文で分岐しておきます。
`stage.scaleX`で伸縮するところがポイントかと思います。

```js

const target = 'exCanvas',
      stage = new createjs.Stage(target),
      canvasW = 300,
      canvasH = 200;

stage.canvas.width = canvasW;
stage.canvas.height = canvasH;

if (window.devicePixelRatio) {
  const canvas = document.getElementById(target);
  canvas.width *= devicePixelRatio;
  canvas.height *= devicePixelRatio;
  canvas.style.width = String(canvas.width / devicePixelRatio) + "px";
  canvas.style.height = String(canvas.height / devicePixelRatio) + "px";
  stage.scaleX = stage.scaleY = window.devicePixelRatio;
}

```

おわります。
Unity メモ


■uGuiのボタン画像を裏返す
　・右矢印の画像があった場合、
　　左矢印の画像を作るために手前から奥へ180度裏返すとクリックしてもイベントが飛ばない
　　（反）時計回り方向へ横回転させた場合はクリックイベントをとれる。

　表裏の判定がある？？　３Dだから？
[Azure][PaaS][AppService]Webアプリ作成時の環境構築（ステージング環境準備、ベーシック認証、Gitからデプロイ）


##概要
AppServiceはMicrosoftが提供するPaaSです。（herokuやGAEと同じような位置付けだけど、mBaaSやFaaS的な一面もあります）Standardプラン（7,588円/月）以上だと「スロット」機能の利用が可能となり、1つの物理リーソス（[AppServiceプラン](https://docs.microsoft.com/ja-jp/azure/app-service/azure-web-sites-web-hosting-plans-in-depth-overview)）で複数のインスタンスを構築することができます。
スロット内のインスタンスは「スワップ」機能により相互入れ替えが自動またはワンクリックで可能となり安全にデプロイができます。またgitなどのソース管理システムの連携もクリックベースで簡単にできます。（kudu、FTPを利用して直接ファイル書き込み、転送も可能です）

これらの機能を利用してプロダクション／ステージング環境の構築、ステージング環境のベーシック認証、各環境のデプロイなどを紹介します。

## AppServiceのスロット追加（ステージング環境の構築）
開発の流れとしては以下を想定しています。
ローカルで開発 → ソース管理システム（Gitなど） → ステージング環境に反映／確認 → プロダクションにリリース

AzureポータルからAppServiceにアプリを作成後、AppSeriviceブレードから「デプロイメント スロット」を選択し「スロットの追加」を行います。追加を行うとURLが割り振られ名前に指定した値が利用されます。また追加する際に既にアプリを構築していれば複製して追加することも可能です。

## 環境変数の設定（ソース上で各スロットに応じた値を利用）
AppSeriviceブレードの「アプリケーション設定」の「アプリ設定」に環境変数を指定することが可能です。「スロットの設定」にチェックを付与することで、スロット毎に異なる値が指定可能で、ソース上で各スロットに応じた値を利用することができます。

## ソース管理システムとの連携
「デプロイメント スロット」から上記で作成したスロットを選択し「デプロイオプション」で利用しているソース管理システムを選択後、展開元のセットアップを行います。Github、Bitbucketなどはアカウント承認後、リポジトリ・ブランチの設定画面が表示されます。同期後はソースをコミットしたタイミングで自動的にスロットに反映されます。

## ステージング環境のベーシック認証
以下のモジュールを利用します。
https://github.com/nabehiro/HttpAuthModule
READMEのとおりですが、rootディレクトリにbinディレクトリを作成して、HttpAuthModule.dllを設置します。あとはrootディレクトリ内にweb.configを配置し以下を追記します。

``` XML:web.config
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <configSections>
        <section name="httpAuthModule" type="System.Configuration.NameValueFileSectionHandler" />
    </configSections>
    <httpAuthModule>
        <add key="AuthMode" value="Basic"/>
        <add key="Realm" value="SecureZone"/>
        <add key="Credentials" value="ログインID:パスワード;"/>
    </httpAuthModule>
    <system.webServer>
        <modules>
            <add type="HttpAuthModule.HttpAuthModule" name="HttpAuthModule" />
        </modules>
    </system.webServer>
    <appSettings>
        <add key="HttpAuthModuleEnabled" value="false" />
    </appSettings>
</configuration>
```

また環境変数（アプリケーション設定）でベーシック認証の有効／無効が可能となります。この際はHttpAuthModuleEnabledをfalseとし、アプリケーション設定で以下の値を設定します。
キー：HttpAuthModuleEnabled
値：true/false

## ステージングからプロダクションにリリース
ステージングでリリース前の確認が終わりリリースを行う際は、AppSeriviceブレードの「デプロイメント スロット」からページ上部の「スワップ」をクリックします。
ここで「ソース」（展開元）と「展開先」を選択します。この時に環境変数（「アプリケーション設定」の「アプリ設定」）にスロット毎の差異がある場合は「変更のプレビュー」に警告が表示されます。
「OK」ボタンクリックでスワップが開始されます。
スワップは１分程度で完了となりますが、[公式](https://docs.microsoft.com/ja-jp/azure/app-service-web/web-sites-staged-publishing)で以下の記載があります。
>スロットにアプリをデプロイした後に運用サイトにスワップすると、運用サイトへのスワップ前にスロットのすべてのインスタンスが準備されます。 これにより、アプリをデプロイする際のダウンタイムがなくなります。 トラフィックのリダイレクトはシームレスであるため、スワップ操作によりドロップされる要求はありません。

##その他にも
ドメイン・SSLの適用、各種アラートの通知、SQLDatabaseを利用していればファイアウォールの設定、Databaseの暗号化なども説明不要なレベルで簡単に設定ができました。またSQLDatabaseはアクセス頻度からIndexの改善アドバイスを提案してくれる便利機能があったりします。個人では少し高いですがAppServiceも素晴らしいなと。
ATSを無効にしてもhttps接続ができない（TLS1.0）



ATSを無効にしているにも関わらず、SSL関連のエラーでサーバーに接続できない場合がありました。


## 問題の発生要因

接続先サーバーが TLS 1.0 になっている（と思われます、たぶん）


## 問題の発生する条件

iOS8,9で`URLSession`を使うと発生します。
`WebView`を使用する場合、またiOS10の`URLSession`は問題ありません。

|| WebView | URLSession |
|:------|:--:|:------:|
| iOS8  | OK | **NG** |
| iOS9  | OK | **NG** |
| iOS10 | OK |   OK   |



## 対策

必ず TLS 1.0 で通信するように設定します。


```swift
let configuration = URLSessionConfiguration.ephemeral
configuration.tlsMaximumSupportedProtocol = .tlsProtocol1
configuration.tlsMinimumSupportedProtocol = .tlsProtocol1

let session = URLSession(configuration: configuration)
```

`WebView`とiOS10の`URLSession`は、
TLS 1.2 => TLS 1.1 => TLS 1.0
と順番に通信してくれているものの、
iOS8,9の`URLSession`はそのような処理がされておらずエラーになるようです。
シェルスクリプトでリトライ処理を追加する

他の人が作った既存のシェルスクリプト(bash)がたまに実行失敗していて、突貫でリトライ処理を追加したのでメモ。

```bash
retry() {
   MAX_RETRY=5
   n=0
   until [ $n -ge $MAX_RETRY ]
   do
      "$@" && break
      n=$[$n+1]
      sleep $[ ( $RANDOM % 15 )  + 1 ]s
   done
   if [ $n -ge $MAX_RETRY ]; then
     echo "failed: ${@}" >&2
     exit 1
   fi
}

HOSTEDZONE_ID=`retry /usr/bin/aws route53 list-hosted-zones-by-name --dns-name example --max-items 1 --query 'HostedZones[].Id[]' --output text --region ap-northeast-1`

retry /usr/bin/aws route53 change-resource-record-sets --hosted-zone-id ${HOSTEDZONE_ID} --change-batch "${BATCH_JSON}" --region ap-northeast-1
```

やり方としては、retry関数を定義して、再実行処理を入れたいコマンドの先頭に`retry`を追加するだけ。

上記はランダム時間(最大15秒)待って再実行し、最大5回実行して停止する場合。コマンドの先頭にretryを追加するだけなので見通しも悪くならないはず。

ちなみに開発環境で使うだけなので大した動作確認はしていません。

注意点として、一つ目のコマンドのように標準出力を受け取りたいときに、失敗時にも標準出力に出力されてしまう場合には、うまくいかないと思われる。
Windows 7 で OS 起動時に docker-machine を起動する


まず、下記の内容が書きこまれた `start-docker-machine.bat` というバッチファイルを作成します。
自分の場合は `C:\Users\%USERNAME%\Documents\bin\start-docker-machine.bat` に置きました。

```
docker-machine start default
```

(なお、default 以外のマシンを利用する場合は適宜名前を書き換える必要あります。)

次に、エクスプローラーから上記ファイルを右クリックしてショートカットを作成し、スタートアップフォルダの中に移動させます。
自分の場合は `C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup` に移動させました。

上記を実施した上で OS を再起動したところ、OS 起動時に docker-machine が立ち上がってくることが確認できました。

## 参考資料

* [Windows: How to start docker VM att system boot \- Server Fault](http://serverfault.com/questions/753971/windows-how-to-start-docker-vm-att-system-boot)
vagrant lvm2

vagrant でこんなセットアップをすると……

```:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "minimal/xenial64"
  config.vm.provision "shell", inline: <<-SHELL
    apt-get update
    DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade -y
  SHELL
end
```

再起動すると上がってこない。

VirtualBox でコンソールを見てみると

```
Gave up waiting for root device.  Common problems:
 - Boot args (cat /proc/cmdline)
   - Check rootdelay= (did the system wait long enough?)
   - Check root= (did the system wait for the right device?)
 - Missing modules (cat /proc/modules; ls/dev)
ALERT!  /dev/mapper/minimal--xenial--vg-root does not exist.  Dropping to a shell!

BusyBox v1.22.1 (Ubuntu 1:1.22.0-15ubuntu1) built-in shell (ash)
Enter 'help' for a list of built-in commands.

(initramfs) 
```

で止まっている。こうすれば解消する。

```:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "minimal/xenial64"
  config.vm.provision "shell", inline: <<-SHELL
    apt-get update
    apt-get install -y lvm2
    DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade -y
  SHELL
end
```
Qiitaの記事に動画を埋め込みたかったのでキャプチャツールを比較してみた

Qiitaの記事に動画を埋め込みたいと思って調べてみると、GIFアニメなら埋め込めるということだったのでGIFアニメを作れるツールを探してみました。
どれが動画用のキャプチャツールかわからなかったので、ついでに静止画のキャプチャツールも含めて比較表を作りました。

## 比較したツール
[GIPHY Capture](https://giphy.com/apps/giphycapture)
[LICEcap](http://www.cockos.com/licecap/)
[Monosnap](https://monosnap.com/welcome)
[Screenpresso](https://www.screenpresso.com/)
[ScreenToGif](http://www.screentogif.com/)
[Skitch](https://evernote.com/intl/jp/skitch/)

## 分類
|               | Windows | Mac | 静止画 | 動画 | メニュー |
| ------------- | :-----: | :-: | :----: | :--: | :------: |
| GIPHY Capture |    ×    |  ○  |   ×    |  ○   |   英語   |
| LICEcap       |    ○    |  ○  |   ×    |  ○   |   英語   |
| Monosnap      |    ○    |  ○  |   ○    |  ○   |   英語   |
| Screenpresso  |    ○    |  ×  |   ○    |  ○   |  日本語  |
| ScreenToGif   |    ○    |  ×  |   ×    |  ○   |  日本語  |
| Skitch        |    ×    |  ○  |   ○    |  ×   |  日本語  |

## 静止画キャプチャ機能
WindowsならScreenpresso、MacならSkitchが良さそう。

|              | スナップ | 注釈追加 | 個人的評価 |
| ------------ | :------: | :------: | :--------: |
| Monosnap     |    ○     |    ○     |     ★★     |
| Screenpresso |    ○     |    ○     |    ★★★     |
| Skitch       |    ○     |    ○     |    ★★★     |

スナップ：録画サイズをウィンドウの枠や描画オブジェクトに合わせる機能

## 動画キャプチャ機能
GIFアニメの作成はScreenToGifがダントツに機能が豊富で使いやすい。
ただし、Windowsのみなのが残念。

|               | スナップ | 注釈追加 | GIF保存 | 個人的評価 |
| ------------- | :------: | :------: | :-----: | :--------: |
| GIPHY Capture |    ×     |    △     |    ○    |     ★★     |
| LICEcap       |    ×     |    △     |    ○    |     ★      |
| Monosnap      |    ×     |    ○     |    ○    |     ★★     |
| Screenpresso  |    ○     |    ×     |    ○    |     ★★     |
| ScreenToGif   |    ○     |    ○     |    ○    |    ★★★     |

スナップ：録画サイズをウィンドウの枠や描画オブジェクトに合わせる機能

## 記事を書いた時のバージョン
- GIPHY Capture: 2.4
- LICEcap: 1.25
- Monosnap: 3.3.0
- Screenpresso: 1.6.7
- ScreenToGif: 2.5
- Skitch: 2.8

## 参考にした情報源
[AlternativeTo - Crowdsourced software recommendations](http://alternativeto.net/)
[Slant](https://www.slant.co/)
[バグ報告などに使えるオススメ画面キャプチャツール - Qiita](http://qiita.com/uessy_akr/items/c0fd9ea2971370872d55)
QiiTrendを使ったチャートの例

先日公開したQiiTrendを使ったチャートの例を紹介します。

[QiiTrend](https://qiitrend.herokuapp.com/)
[QiitaトレンドをリニューアルしてQiiTrendを作った - Qiita](http://qiita.com/tag1216/items/e65496b932ca6790268b)

以下、見出しがQiiTendへのリンクになっています。

## [主要言語の比較](https://qiitrend.herokuapp.com/trend?mode=ratio&period=&query=tag%3ARuby&query=tag%3AJavaScript&query=tag%3APython&query=tag%3APHP&query=tag%3ASwift&query=tag%3AJava&unit=yearly)

[タグ一覧ページ](http://qiita.com/tags)から上位6つの言語を比較しました。

<img width="400" alt="QiiTrend.png" src="https://qiita-image-store.s3.amazonaws.com/0/35192/a90a2f10-2611-9c97-a8a8-1b0c75840155.png">

- 最近はPythonの人気が上がっていて、今年はJavaScriptを追い抜きそうな勢いです。
- Rubyは当初断トツの人気でしたが最近は下降気味のようです。これは単純にRubyの人気が下がっている可能性のほか、立ち上げ直後のQiitaはRubyユーザーが支えていたという見方もあると思います。

## [フロントJavaScriptフレームワーク/ライブラリの比較](https://qiitrend.herokuapp.com/trend?mode=ratio&period=&query=tag%3AjQuery&query=tag%3AAngularJS+or+tag%3AAngular2&query=tag%3Areactjs+or+tag%3AReact&query=tag%3Avue.js&unit=yearly)

複数のタグに分散しているものは` or `で繋げて検索すると全体をカバーできます。

<img width="400" alt="QiiTrend.png" src="https://qiita-image-store.s3.amazonaws.com/0/35192/f1bd15cc-86a4-880c-1ceb-3132044a0045.png">

## [全投稿数の推移](https://qiitrend.herokuapp.com/trend?mode=count&period=&query=&unit=yearly)

Qiita全体での年間投稿数の推移です。
検索クエリーに何も入力しないと表示できます。

<img width="400" alt="QiiTrend.png" src="https://qiita-image-store.s3.amazonaws.com/0/35192/b505efcd-62fb-458b-30f0-ce6708791345.png">

## [ストック数別の割合](https://qiitrend.herokuapp.com/trend?mode=ratio&period=&query=stocks%3A0&query=stocks%3A%3E%3D1+stocks%3A%3C10&query=stocks%3A%3E%3D10+stocks%3A%3C100&query=stocks%3A%3E%3D100&unit=yearly)

投稿をストック数で分類して割合を出してみました。

<img width="400" alt="QiiTrend.png" src="https://qiita-image-store.s3.amazonaws.com/0/35192/bc1a4af3-52b7-78de-dee9-d9b24a4b3985.png">

自分がQiitaを始めた2014年と比べると最近はストック数(いいね数)が伸びないと感じていましたが、気のせいではなかったようです。

## [更新率の確認](https://qiitrend.herokuapp.com/trend?mode=ratio&period=&query=updated%3A2011&query=updated%3A2012&query=updated%3A2013&query=updated%3A2014&query=updated%3A2015&query=updated%3A2016&query=updated%3A2017&unit=yearly)

チャートとしてはかなり無理矢理感がありますが、約1割の投稿は作成後しばらくしてからも更新されていることがわかります。

<img width="400" alt="QiiTrend.png" src="https://qiita-image-store.s3.amazonaws.com/0/35192/991fe0b0-479b-c351-1623-57200eb01cd6.png">

## [tag1216の投稿](https://qiitrend.herokuapp.com/trend?mode=count&period=4&query=user%3Atag1216&query=user%3Atag1216+tag%3Ajava&query=user%3Atag1216+tag%3Ajavascript&query=user%3Atag1216+tag%3Apython&query=user%3Atag1216+-tag%3Ajava+-tag%3Ajavascript+-tag%3Apython&unit=yearly)

自分の投稿数の推移です。

- 赤:全体
- 青:Javaに関する投稿
- 緑:JavaScriptに関する投稿
- 黄:Pythonに関する投稿
- 茶:その他の投稿

<img width="400" alt="QiiTrend.png" src="https://qiita-image-store.s3.amazonaws.com/0/35192/4e8e2c84-6a84-ac38-4652-1924c6300ee4.png">

2014-2015年がJavaとJavaScriptの投稿が中心でしたが、2016年以降はPythonにシフトしています。
投稿数は右肩下がりです。。。
Rubyで再帰的にアクセス可能なHashを定義する

小ネタ

```rb
h = Hash.new {|h, k| h[k] = Hash.new {|h, k| h[k] = {} } }

p h[:a]           #=> {}
p h[:a][:b]       #=> {}
p h[:a][:b][:c]   #=> nil
p h               #=> {:a=>{:b=>{}}}
```

↓

```rb
rh = Hash.new {|h, k| h[k] = Hash.new(&h.default_proc) }

p rh[:a]          #=> {}
p rh[:a][:b]      #=> {}
p rh[:a][:b][:c]  #=> {}
p rh              #=> {:a=>{:b=>{:c=>{}}}}
```

:muscle:

`Hash#default_proc` を利用して再帰的にHash.newを行うようにすることで、どこにアクセスしても `{}` を返してくれるHashを定義することが出来ます。
PNM > gifファイルから plain/text formatへの変換 > convert -depth 8 -compress none label.gif label.ppm / PNM (PPM/PGM/PBM)

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
ImageMagick 6.7.7-10 2016-06-01 Q16 http://www.imagemagick.org
```

gifファイルからPNM (Portable aNyMap)のplain/text formatへの変換。

参考 http://www.imagemagick.org/discourse-server/viewtopic.php?t=15321

```
$ convert -depth 8 -compress none label.gif label.ppm
$ head label.ppm 
P3
150 150
255
173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 
173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 
173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 
173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 
173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 
173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 
173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 
```

PNMには(PPM/PGM/PBM)といろいろ形式がある。
以下において整理されています。
http://www.mm2d.net/main/prog/c/image_io-01.html

フォーマットについては以下が参考になる。
https://ja.wikipedia.org/wiki/PNM_(%E7%94%BB%E5%83%8F%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88)
技術英語 > so the contents of the while loop [are again executed], / perform the code quality check

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2108 / 12833)

> so the contents of the while loop **are again executed**, 

前後の文章を足すと

> The value of count is now 2, so the contents of the while loop are again executed, and count is incremented to 3.

```py
count = 1
while count <= 5:
    print(count)
    count += 1
```

<hr>
executeから関連して思いだすのは`perform`。
これらの使い分けはまだ身についていない。

code関連では

> perform the code coverage
> perform the code quality check
> perform the code review task

などの使用例は見つかる。

https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=%22perform+the+code%22&*
FX system trading code with Deep Learning on Python

wrote an FX system trading program with deep learning method.
I used Keras library for this deep learning implementation.

# trends of portfolio
USDJPY, on Year 2000-2008, spread=0.03Yen(3pips), interval of exchange data=5min
![dl.png](https://qiita-image-store.s3.amazonaws.com/0/12325/4e3ca7b0-b9c0-6e7e-2af9-a09c51eff3f5.png)

# source code
https://github.com/ryogrid/fx_systrade/blob/3cc5975f77893c8fd50d8c00bc618916fe0b439c/keras_trade.py

# strategy
1. input some technical index, past several prices, chart type (I defined) as features.
2. predict UP or Down with input features through deep learning.
3. with predicted result, get position. then call off position on my original rule (please read code :-)).

if you have any question, please mail me.
ryo.contact [at] gmail.com

in Japanese:
http://qiita.com/ryo_grid/items/7746528f8cae8026b936
http://qiita.com/ryo_grid/items/56a086fee1b780157df7

# just for reference
With Xgboost library (boosted decision tree), I got result below.
![xgboost.png](https://qiita-image-store.s3.amazonaws.com/0/12325/83d18bc4-a41f-f669-68e5-9749ee8a4980.png)

https://github.com/ryogrid/fx_systrade/blob/a2a905fcfeb6d1e1ee91e71e0005ca17cc94757f/xgboost_trade.py

below code can real and demo trade on OANDA through REST trade API.
https://github.com/ryogrid/fx_systrade/blob/master/xgboost_trade_oanda.py
gitで最近ローカルで作った／触ったブランチを表示

ローカルでたくさんブランチ切って行き来してると **最近いじったあのブランチ名なんだったっけ？？？** となる。

そんなときは以下のコマンドうつとそれっぽい感じの情報を表示してくれる

```
ls -lt .git/refs/heads
```
稼働率の考え方

稼働率の考え方です。
すぐに出てこず、５分ぐらい考えてしまったので戒めとして書いておこうと思います。

### 稼働率
- - -
>可用性の数値としての表現は稼働率（かどうりつ）と呼ばれ、修理可能な系・機器・部品などが、ある特定の瞬間に機能を維持している確率（瞬間稼働率）、または規定の時間で機能を維持している確率（平均稼働率）のこと。略号はA。
>参考URL:[wikipedia/稼働率](https://ja.wikipedia.org/wiki/%E5%8F%AF%E7%94%A8%E6%80%A7#.E7.A8.BC.E5.83.8D.E7.8E.87)

平均稼働率の項目しかなかったのですが、まぁこんな感じです。

簡単に表現すると、システムが動いている確率のこと。
※1+1=2みたいな説明ですが……
逆に、全体から稼働率を引けば故障率が出てきます。

```math
  F = 1 - R
```
※応用情報にはRがよく使われるので、そちらを採用

### こんな稼働率はどうする？ その１ 
- - -
![mondai_a.png](https://qiita-image-store.s3.amazonaws.com/0/54925/844a0775-72cc-3ff9-303d-0f92fc23ddbd.png)

いきなりややこしい図式ですが
並列化されているXとYの機器のどちらかが稼働していれば、左側はOKです。
では、どう考えるのか。
２つの機器が少なくとも１つ生きていればいいので、「全体からどちらも死んでいる確率を引き算」しましょう。

```math
Xの故障率 = 1-x\\
Yの故障率 = 1-y\\
X-Y間の稼働率 = 1 - (1-x)\times(1-y)
```
そして、最後にZが同時に生きている確率を使います。
今度は、素直に生きている確率を使います。

```math
Zの稼働率 = z\\
システム全体の稼働率 = \{1 -(1-x)\times(1-y)\} \times z
```


### こんな稼働率はどうする？ その２
- - -
![mondai_b.png](https://qiita-image-store.s3.amazonaws.com/0/54925/4de86d59-0a95-4bec-23b2-bbf8196f62bb.png)



これは少しややこしいですが、小さい範囲で見ていきましょう。
全体が並列化されているとき、見るべきは直列の方です。

まずは、上部X,Yが共に稼働している確率を求めます。

```math
X-Z間の稼働率 = x \times z
```

これが求まると、ただの並列システムですね。
![mondai_b-2.png](https://qiita-image-store.s3.amazonaws.com/0/54925/2357f890-daa7-a609-95db-d51db0e11e49.png)

X-ZもしくはYのどちらかが生きていればいいので、「全体からどちらも死んでいる確率を引き算」しましょう

```math
Yの故障率 = 1 - y\\
X-Z間の故障率 = 1 - x \times z\\
システム全体の稼働率 = 1 - (1-y) \times (1-x \times z)
```

### 世の中の学生さんへ
- - -
この考え方って数学ⅠAの確率なんですよねー
高校数学って無駄じゃないですよ？
あまり良く分かってないですけど、PID制御っていうのは、数学ⅡBの微積分使いますし、
画像処理なら数学ⅢCの行列式とかも使います。

まぁ、そんな子たちはこんな所見てないで勉強してなって感じはありますが。
LED電球をマイコン（Intel Edison）から制御する(2)

[前回](http://qiita.com/nobu_e753/items/7d6afca7b81ea46f9474)に引き続き，Bluetooth制御型LED電球のマイコンからの制御にチャレンジします．今回はプログラム言語（Python）から制御を行ってみます．

# やりたいこと

![slide.png](https://qiita-image-store.s3.amazonaws.com/0/156705/db356c5c-d7e1-3d1b-f435-1ef7a6ac9788.png)

 - 1stステップ : マイコンからコマンドを打って制御（[前回](http://qiita.com/nobu_e753/items/7d6afca7b81ea46f9474)）
 - 2ndステップ : マイコン上でプログラムを動かして制御

この記事では2ndステップに取り組みます．

# 環境

- [Intel Edison](https://www.switch-science.com/catalog/1956/)
- [MiPow PLAYBULB color Smart LED](http://www.playbulb.com/en/playbulb-color.html)
- Python 3.5.3
- bluepy 1.0.5

# 制御までの手順

マイコン（Intel Edison）の設定，およびBluetooth制御型LED電球（PLAYBULB）との接続，gatttoolsを用いた電球の制御まではできているものとします（[前回](http://qiita.com/nobu_e753/items/7d6afca7b81ea46f9474)）．
本記事では，gatttoolsでやったこと（Bluetooth LE GATTプロトコルを通じての機器制御）を，プログラミング言語にてやれるようにします．言語は「Edison上での環境・情報が充実している」という理由からPythonを使いました．GATTを制御できるプログラミング言語であればほかの言語でも可能と思います．

## [1] Python,Pipのインストール（Optional）

※初期インストール済みの2.7系で実施する場合は不要

単体のPython(3.5.3),Pipをソースからインストールしました（本件とは別の理由からです）．
やり方は[Intelの公式サイト](https://software.intel.com/en-us/blogs/2017/02/07/installing-python-36-on-your-intel-edison)を参考にしました．

## [2] BluePyのインストール

Pythonを通じてGATTの機能を使うのにはいくつか方法があります．今回は[Bluepy](https://github.com/IanHarvey/bluepy)を使いました．

- Pexpect（[Edison公式ページ](https://software.intel.com/en-us/articles/using-the-generic-attribute-profile-gatt-in-bluetooth-low-energy-with-your-intel-edison)に記事あり）
- [PyGatt](https://github.com/peplin/pygatt)（gatttoolsのラッパー ※手元の環境ではうまく動作せず）
- [Bluepy](https://github.com/IanHarvey/bluepy)（gatttoolsのラッパー）

```bash
$ pip3 install bluepy
```

## [3] GATTを扱うプログラムの実装・実行

準備が済んだので実装に入ります．ここでは3秒ごとに繰り返し色を変更するプログラムを作成してみます．

```python:light_control.py
# -*- coding: utf-8 -*-
from bluepy import btle
from bluepy.btle import BTLEException
import time

LIGHT_MAC_ADDR="DB:22:4B:13:AC:E6"

if __name__ == '__main__':
    # connect to device
    tPeripheral = btle.Peripheral(deviceAddr=LIGHT_MAC_ADDR)
    # find characteristic
    tCharList = tPeripheral.getCharacteristics()
    tChar = next(tChar for tChar in tCharList if tChar.getHandle()==0x001b)    

    while (True):
        tChar.write(bytes([0, 255, 0, 0]))  # red
        time.sleep(3)
        tChar.write(bytes([0, 0, 255, 0]))  # green
        time.sleep(3)
        tChar.write(bytes([0, 0, 0, 255]))  # blue
        time.sleep(3)
```

キャラクタリスティック（私は「ある機能をつかさどるオブジェクト」という形で理解しています）の取得方法はいくつかありますが，全キャラクタリスティックを取得したうえでハンドルが一致する方法をとりました．ハンドル，制御コマンドについては[前回](http://qiita.com/nobu_e753/items/7d6afca7b81ea46f9474)の記事に掲載した表を参照ください．

プログラムが完成したら以下のコマンドで実行してみます

```bash
$ python3 light_controll.py
```
LED電球の色が3秒ごとに変わりましたか？ 

# まとめ

自作のプログラム（Python）とライブラリ（bluepy）を使い，LED電球（PLAYBULB）を制御することができました．応用として

- **時刻によって色を変える** （マイコンの時計と連携）
- **明日の天気によって色を変える** （天気APIと連携）
- **家族が自宅近くまできたら色を変える** （スマートフォンGPSと連携）

などが実現できそうです．小型のIntel Edisonと一緒にリビングに設置し，家族間のインフォメーションライトに，でもよいかもしれません．"こんな面白い応用がある"というのをご存知でしたら知らせていただけば幸いです．

2回にわたりLED電球の電球機能を使ってみましたが，次回はもう一つのスピーカー機能を使ってみたいと思います．
fluentdによるsyslogの受信と、さくらクラウドのオブジェクトストレージへの転送・保存

サーバやネットワーク機器類から送信されてくるsyslogを保存するのに、さくらのオブジェクトストレージを利用してみる。状況・要件としてはこんな感じ。

- さくらクラウド上でサーバや仮想アプライアンスその他を動かしている
- 複数台のサーバ/アプライアンスからsyslogを受け付けてログを集約したい
  - 一部の機器ではsyslogサーバのポート番号を指定できないので必ず514番で待ち受けて欲しい
- さくらクラウドのオブジェクトストレージに保存したい
    - サーバのディスクに入れておくと取り出すのが面倒
        - rsyslog/syslog-ngやfluentdでのout_fileなど、ローカルに保存した場合
    - オブジェクトストレージならサーバを消し飛ばしても残り、s3cmdコマンドで取り出せる

公式APIガイドの細かいところを読み飛ばしたせいで、シグネチャ不一致で嵌まってたのでメモ。

# 参考資料

利用したプラグインやサービスの公式資料は以下の通り

- [fluent-plugin-s3](https://github.com/fluent/fluent-plugin-s3)
- [よくある質問(オブジェクトストレージ)](http://cloud-news.sakura.ad.jp/faq_top/faq_objectstorage/?_ga=1.97422879.1828485541.1484217886)
  - このページ最下部の方に「[ObjectStorage_API【PDF】](http://cloud-news.sakura.ad.jp/wp-content/uploads/2015/01/ObjectStorage_API_20150205.pdf)」というリンクがあり、API一覧を参照できる

類似の事例として以下が存在する。それぞれ現在(2017/03)より2年程度経過しており、そのままでは手法を適用できない。

- [fluentdを使ったオブジェクトストレージへのログ転送](http://qiita.com/nenokido2000/items/c75acee227122119b948)
- [Fluentdでログをさくらクラウドのオブジェクトストレージに保存する](http://sairoutine.hatenablog.com/entry/2015/10/10/111733)

# 想定環境

- 環境: さくらクラウド
- OS: Ubuntu Server 16.04.1 (Xenial)
  - 公式アーカイブ一覧から該当するアーカイブを利用してセットアップ
- td-agent: 0.12.31
- fluent-plugin-s3: 0.8.2

# fluentdのインストールとセットアップ
簡単化のためここではtd-agentをパッケージ導入してfluentdを動かす。

1.ベースシステムに必要なパッケージの追加等実施して再起動

```
$ sudo apt update 
$ sudo apt -y upgrade
$ sudo apt install -y curl ruby
$ reboot
```

2.[fluentd 公式](http://docs.fluentd.org/v0.12/articles/install-by-deb)に従ってtd-agentの導入

```
$ curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent2.sh | sh
```

3.fluent-plugin-s3のインストール(ここでは0.8.2がインストールされた)

```
$ sudo td-agent-gem install fluent-plugin-s3
```

4.td-agentユーザが514番ポートでbindできるようにケーパビリティ設定

```
$ sudo setcap 'cap_net_bind_service=ep' /opt/td-agent/embedded/bin/ruby
```

iptablesで514/udpを5140/udpにリダイレクト、td-agentはそちらで待ち受けといったやり方でも可能だが今回はこの手段で対応した。

# td-agentの設定

td-agentをrestartするまえに、/etc/td-agent/td-agent.confを以下の様に書き換える。syslog inputプラグインで受けて、s3 output プラグインに流すだけの簡単な設定。

```
<source>
  @type syslog
  port 514
  bind 0.0.0.0
  tag syslog
</source>


<match syslog.**>
  type s3
  aws_key_id ${ここにアクセスキーID}
  aws_sec_key ${ここにシークレットアクセスキー}

  s3_bucket ${ここにバケット名}
  s3_endpoint https://b.sakurastorage.jp
  s3_object_key_format %{path}%{time_slice}_%{index}.%{file_extension}

  signature_version s3

  path log_
  buffer_path /tmp/s3
  time_slice_format %Y%m%d%H
  time_slice_wait 10m
  buffer_chunk_limit 256m
  check_apikey_on_start false
</match>
```

以下の点に気を付けること

- in_syslogは514/udpで待ち受ける
  - 先に述べたとおり、一部機器は514番ポート決め打ちのため
  - 先ほど実施したsetcapにより、td-agentの実行ユーザ(td-agent)でも0.0.0.0:514をbindできる
- use_ssl はobsoletedなので使わない
- __signature_versionを "s3" (version 2)にしておくこと__
  - fluent-plugin-s3 0.8.2 では "v4" (version 4) がデフォルトになっている
  - 一方、さくらオブジェクトクラウドでは、version 2のみ対応している
  - さくらオブジェクトクラウドにversion 4のシグネチャを投げると500が返ってくるためオペレーションできない

うまく動くとバケットに1時間毎のログファイルがgzipで纏められてファイルオブジェクトとしてつっこまれるはず。テスト中は time_slice_format を "%Y%m%d%H%M" などとして1分毎にしておくとミスに気がつきやすいので便利。
docker-compose memo

docker-compose


## docker-composeで云々のとき

### docker-composeで立ち上げてるservice名を知りたいとき

```
docker-compose ps --service
```

### 起動中のcontainerに入りたいとき


#### dockerコマンドで入るとき
コンテナ名で入る

```
docker exec -it <container_name> bash
```

#### docker-composeコマンドで入るとき
サービス名で入る

```
docker-compose exec <service_name> bash
```


### [ERROR]
#### port is already allocated
portがもう使われてるとき

```
$ lsof -i:<Port番号>
$ kill <>
```

例

```
$ lsof -i:3306
$ kill 11111 ## PIDが11111のとき
```


## docker-compose.yml <template>

```

version: '2'

services:
### web container ###
  web:
    build:
    container_name: "web"
    ports:
     - "8080:80"
    volumes:

### redis container ###
  redis:
    image: redis

### mysql container ###




```
【Processing ビジュアルデザイナーのためのプログラミング入門】基本図形を描く。

Processing、左上を0として、そこに右はx、下はy。
どこか1点を指定するときは(x, y) で指定する。

```size(x, y);```
左上から右にx、下にyの大きさのディスプレイウィンドウを作る。

```point(x, y);```
ウィンドウの左上から右にx、下にyのところに点を打つ。

```line(x1, y1, x2, y2);```
（x1, y1）から（x2, y2）へ直線を引く。

```triangle(x1, y1, x2, y2, x3, y3);```
（x1,y1）（x2,y2）（x3,y3）を頂点とした三角形を作る。
line( )でも線をつなげれば三角形を作ることはできるが、triangle( )では塗りを持つ三角形を作れる。
 
```quad(x1, y1, x2, y2, x3, y3, x4, y4);```
（x1,y1）〜（x4,y4）を頂点に持つ四角形を作る。
不規則な四角形を作ることができる。

```rect(a, b, c, d);```
ウィンドウの左上から右にa、下にbのところから、右にc、下にdの長さを持った長方形を作る。

```ellipse(a, b, c, d);```
(a, b)を中心に、幅c、高さdの楕円を作る。
cとdを同じ値にすると、正円になる。

```arc(a, b, c, d, start, stop);```
(a, b)を中心に、幅c、高さdの楕円を作る。
そしてstart, stopにはそれぞれ radian( )で始まりの角度と終わりの角度を指定し、
円弧を作る。楕円の右端を0とする。
```arc(a, b, c, d, start, stop, mode);```
arc( )のもう1つのやり方。
modeはOPEN, CHORD, PIEの3つがある。
OPENが標準。円弧の部分。
CHORDだと出来た楕円全てを囲う線。
PIEだと、中心からstart, stopまでそれぞれ直線で結んだ図形になる。
 
```bezier(x1, y1, x2, y2, x3, y3, x4, y4);```
より複雑な曲線が書ける。
（x1,y1）から（x4,y4）に向けて曲線が作られる。
（x2,y2）と（x3,y3）はコントロールポイントになる。
（x1,y1）と（x2,y2）、（x3,y3）と（x4,y4）を直線で結び、それを基準に曲線を作るイメージ。
 
描画の順序は、上から順番。
```background( );```　背景の色
```fill( );```　図形の中の色
```stroke( );```　図形を囲う線の色
を、指定できる。
1度指定すると、fill( )とstroke( )はその後全てに影響する。
変更したい時はもう1度指定。
UIApplicationOpenSettingsURLStringから設定アプリを開いたときの挙動調査

UIApplicationOpenSettingsURLStringから設定アプリを開いたときの挙動を調べました。
(iOS10.2.1で検証)

```swift:Swift
@IBAction func openSettingsButtonTapped(_ sender: Any) {
        guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
            return
        }
        
        if UIApplication.shared.canOpenURL(settingsUrl) {
            UIApplication.shared.open(settingsUrl)
        }
}
```

##「設定アプリ」内にアプリ固有の設定項目がない場合

 - 「設定アプリ」を起動済みでない場合、「設定アプリ」のTOP画面に遷移
 - 「設定アプリ」を起動済みの場合、「設定アプリ」内の開いていた画面に遷移

例)
1. 設定アプリのWiFi設定を開く
2. UIApplicationOpenSettingsURLStringで遷移
3. WiFi設定画面が開く


##「設定アプリ」内にアプリ固有の設定項目がある場合
カメラや写真、マイク、位置情報等を利用するアプリやSettings.bundleでアプリ固有の設定項目（プリファレンス）を作成したアプリの場合

 - 「設定アプリ」の起動有無に関わらず、アプリ固有の設定画面へ遷移
一時的に作業内容を退避して別ブランチで作業したい時のgit stashコマンドです。

## はじめに
別のブランチに切り替えることになりたいが、現在の作業内容はまだコミットしたくないとき、git stashで、変更をいったん隠すことができます。

## 使い方
### **一時的に退避**
`$ git stash`

わかりやすくなるため、コメントを入れることができます
`$ git stash " コメント"`

### **退避した内容を確認**
```
$ git stash list

stash@{0}: WIP on <branch-name>: <lastest commit>
stash@{1}: WIP on <branch-name>: <lastest commit>
stash@{2}: WIP on <branch-name>: <lastest commit>
```

変更内容を確認するコマンド
`$ git stash list -p`

退避した物の詳細内容を確認するコマンド
`$ git stash show stash@{0}`

###  **退避した内容を適用**
`$ git stash apply stash@{0}`

適用して削除したい時
`$ git stash pop stash@{0}`

### **退避した物をdropして消去**
`$ git stash drop stash@{0}`

退避した物を全削除するコマンド
`$ git stash clear`
使えるメモサイト/ソフトまとめ

サクッと便利に使えるメモをまとめました。
それぞれ三段階評価をしています。
推薦などありましたらコメントをお願いします。
《随時更新中》

# Webサービス

## ☆☆☆
### :flag_jp: CosMoNOTE (https://cosmonote.xyz/) by laineus (http://qiita.com/laineus)

《MarkDown》

*Good!*

* すごくシンプル
* アカウントを作成するとどこでも同じメモが見られる
* スマホ対応(レスポンシブ)
* 自動保存機能付き
* タブインデントが使える(**これ重要!**)
* デザインがテキストエディタ風でかっこいい

*Bad...*

* やっぱり特にないです。

Qiita:[[PHP+JS]マークダウン形式のシンプルなメモ帳サイトを作ってみた!](http://qiita.com/laineus/items/6bfbdfc08a77ccf8d399)

### :flag_it: TextPad (http://textpad.surge.sh/)

《PlainText》

*Good!*

* タイトルをファイル名としてPlainTextでダウンロード可
* Webストレージを使用し自動的に(?)保存
* 文字数カウンター付き
* テキストサイズ・折り返し文字数・行間を調節可

*Bad...*

* 行数の表示がない
* 複数のメモを保存できない

## ☆☆

### :flag_jp: プールスケッチ (http://plsk.net/)

《PlainText》

*Good!*

* アカウント作成が3秒
* 同じURLへアクセスすることでデバイス関係なく同期可
* 複数人でアクセスすればチャットっぽく利用可
* 複数IDが取得でき用途別に整理可

*Bad...*

* アカウント名がばれるとメモが丸見え、そして編集される
* 最終書き込みから100日で削除

## ☆

### :flag_jp: ブラウザメモ帳 (http://www.drpartners.jp/tools/browser-memocho.htm)

《PlainText》

*Good!*

* 同時に十個までメモ可能
* 送信機能一切なし
* 早い

*Bad...*

* インポート/エクスポート機能がない
* 保存機能なし(リロードすると消えます)

# ソフトウェア

## ☆☆☆

### :flag_jp: CubeNote (http://www.cube-soft.jp/cubenote/)

《PlainText》

*Good!*

* 軽い
* 管理が超ラク
* タグ・行番号。文字数カウンター付き
* 細かいカスタマイズが可能
* PlainTextでのエクスポート可能

*Bad...*

* ノートが多くなると見づらい
* 1行目が自動的にタイトルになるので付け忘れやすい
* 印刷の設定が貧弱

## ☆☆

### :flag_us: Sublime Text3 (https://www.sublimetext.com/) / :flag_us: Atom (https://atom.io/)

《PlainText》《MarkDown》

*Good!*

* 慣れ親しんだか環境でメモができる
* Packageで機能を拡張できる
* MarkDownに対応(Sublime TextはPackage導入推奨)

*Bad...*

* メモの管理が面倒
* 気軽感が薄れる(気がする)

# あとがき

満足するものがなければ作ってみたり、デザインが気に入らなかったら自作CSSを適応してもいいかも。
作成国は言語からの推測及びドメインレジストラの本社所在地に基づき表示しています。
このページに最適なタグを教えてください。

# 更新履歴
2017.03.02 初版公開
2017.03.03 2版公開 - サイトの追加。見出しの変更。
2017.03.12 3版公開 - サイトの追加。評価の変更。
又・ArchLinux インストール覚書

（このシリーズの目次: [ArchLinux インストール覚書](http://qiita.com/katz_engineer/items/f032a24cb273c4eb6669)）

[続々・ArchLinux インストール覚書](http://qiita.com/katz_engineer/items/88250ee4ea51edb327f0)でインストールしたArchLinuxですが、折角RAID1構成にしたので、壊れた時のシミュレーションをしてみました。

2台あるHDDのうち片方のケーブルを引っこ抜いて、物理的に断線させてから電源を入れました。

```
starting version 232
Scanning for Btrfs filesystems
[    3.795791] BTRFS error (device sda): failed to read the system array: -5
[    3.810021] BTRFS error (device sda): open_ctree failed
mount: wrong fs type, bad option, bad superblock on /dev/sda,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.
You are now being dropped into an emergency shell.
sh: can't access tty: job control turned off
[rootfs ]# pwd
/
[rootfs ]# ls /dev/sd*
/dev/sda
```

キーボード配列ですが、残念ながら日本語配列には出来ない模様。

```
[rootfs ]# loadkeys jp106
sh: loadkeys: not found
```
仕方が無いのでアメリカ式の英語配列で頑張りましょう。

mntディレクトリを作成して、生きてるHDDをマウント。

```
[rootfs ]# mkdir mnt
[rootfs ]# mount -o degraded /dev/sda /mnt
[rootfs ]# ls /mnt
@
[rootfs ]# ls -1 /mnt/@
bin
boot
dev
etc
home
lib
lib64
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
```

とりあえず中身を見る事は出来るようです。やった:thumbsup:

追伸:
もう片方のHDDだけをつないだ状態でも試してみました。全く同じでした。
Jenkinsの実行ユーザーを変更する

# はじめに

このエントリーに気がついたあなたは我々の仲間です！！(フィッシングメールみたいな書き出しだな…) 簡単に言うと、UnityアプリをMacでJenkinsで自動ビルドする際に引っかかるポイントの一つがこれです。

# なぜ実行ユーザーを変更するのか？

そもそもなぜJenkinsの実行ユーザーを変更する必要があるのかというと、

- インストーラでJenkinsをインストールすると、jenkinsという名前のユーザーでLaunchDaemonsとして実行される。
- Unityはビルド時にEnlightenのためにGPUを使用するので、LaunchDaemonsとしては実行できない。
- ユーザーがログイン中の状態でLaunchAgentsとして実行すればGPUが使用できる。
- でも、jenkinsユーザーでログインするのはいろいろ不備があって問題がある。
- それに、いつも使っているユーザーでないと、コードサインのための各種証明書類の扱いがなんか面倒くさい。

からです。ちなみにWindowsではサービスとして「ローカルシステムユーザー」という特権ユーザーで普通に実行して普通にビルドできます。ずるい。

# 前提

前提条件として、Jenkinsを.jarファイルやHomebrewではなく、インストーラ(.pkg)でインストールされた方を対象とします。たぶん、インストーラを使わなかった方は問題なかったはずです。(なんとなくHomebrew嫌いなので…)

念のため、確認したときの関連ツールのバージョンを記しておきます。

OS: OS X El Capitan v10.11, macOS Sierra v10.12
Java: 1.8.0_112, 1.8.0_121
Jenkins: 2.19.3, 2.32.2
Unity: 5.4.1f1, 5.5.1f1

※基本的にはOSとJenkinsのインストーラの問題です。

# LaunchDaemonsとLaunchAgents

インストーラでJenkinsをインストールした場合、インストーラが作ったjenkinsという名前のユーザーでLaunchDaemonsを使ってJenkinsが実行されることになっています。しかし、LaunchDaemonsではGPUが使用できないため、LaunchAgentsへ変更する必要があります。

で、こちらにも書きましたが、

launchdが言うことを聞かない場合に見直すべきこと
http://qiita.com/MARQUE/items/42446bbca65bbce27a43

こんな感じで、

```
sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
mkdir ~/Library/LaunchAgents
sudo mv /Library/LaunchDaemons/org.jenkins-ci.plist ~/Library/LaunchAgents/
sudo chown -R hoge /var/log/jenkins/
sudo chown -R hoge /Users/Shared/Jenkins/
launchctl load ~/Library/LaunchAgents/org.jenkins-ci.plist
```
※chmodじゃなくてchownしています。

一旦実行中のJenkinsを停止して、インストーラで追加されたLaunchDaemonsの設定ファイルをLaunchAgentsとして起動するためにムーブして(おそらくユーザーのLaunchAgentsフォルダがないのでついでに生成)、すでに一度jenkinsユーザーで動いてしまっているのでログファイルフォルダとワークフォルダの所有権をJenkinsを実行させたいユーザーに変更して、LaunchAgentsとして再起動しています。あ、そのユーザーでログインした状態で実行してくださいね。

注意点として、OSをアップデートするとなぜか/var/log/jenkins/の所有権がrootに戻ってしまうっぽいので(SierraとHighSierraで経験)、OSアップデート後にJenkinsが動かなくなった場合は確認してみてください。

これで基本的には問題ないんですが、実はこれだけだと、次の日以降にMacを再起動すると動かなくなります。

# newsyslog

問題はログファイルでした。`/var/log/jenkins/`にJenkinsのログファイルがあるんですが、この所有権がいつの間にかjenkinsユーザーに戻ってしまい、Jenkins再起動時にログファイルにアクセスできなくなり、コンソールに

```
2017/02/04 11:11:47.894 com.apple.xpc.launchd[1]: (org.jenkins-ci[1437]) Service exited with abnormal code: 1
2017/02/04 11:11:47.894 com.apple.xpc.launchd[1]: (org.jenkins-ci) Service only ran for 0 seconds. Pushing respawn out by 10 seconds.
```

というエラーを吐き続けて起動しなくなります。

で、いろいろ調べたんですが、実は、Jenkinsのインストーラはnewsyslogにも痕跡を残していたのです！！

そもそもnewsyslogとは何かというと、ログファイルをログローテート、ざっくり言うと、古いログファイルを定期的に圧縮してコピーするツールで、Jenkinsとは別個に動くものなのです。それをインストーラがいつの間にか設定していたのですねー。

そのJenkins用の設定ファイルがこんな感じ。

```/etc/newsyslog.d/jenkins.conf
# logfilename          [owner:group]    mode count size when  flags [/pid_file] [sig_num]
# Rotate Jenkins log at midnight, and preserve old logs in 3 days
/var/log/jenkins/jenkins.log   jenkins:jenkins         644  3     *    $D0   J
```

この書式だと、jenkinsグループのjenkinsユーザーで、毎日午前0時付近にbz圧縮してコピーし、過去3日間のログファイルを保存するという設定になっています。これを、例えば以下のようにして任意のエディタで編集して、

```
sudo nano /etc/newsyslog.d/jenkins.conf
```

ユーザー名とグループ名が`jenkins:jenkins`となっているところを`hoge:staff`などの任意のユーザーに変更すれば解決です。

# おわりに

インストーラが何をしているのかというのはなかなか分からないものですが、やっぱり便利なので基本的にはインストーラを使いたいと思いつつ、もうちょっとJenkinsのインストーラ頑張れ、と言ったところでしょうか。
HEXO を vagrant 上で使ってみる

## HEXO

今まで middleman に手を加えてサイトを作ってたのですが、
ビルドが遅かったりなんで HEXO を試してみたら速いしよさげ。

## インストール
### 環境

- CentOS6.4 on Vagrant

### nvmを入れる
```sh
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash
$ ~/.nvm/nvm.sh
$ nvm --version
0.33.1
```

### node.js を入れる
```sh
$ nvm install stable
```

### hexo を入れる
```sh
$ npm install hexo-cli -g
```

## プロジェクト
### 作成
共有フォルダ上で作業してる場合、
ふつーに作成するとinstallのとこでシンボリックリンクを貼ろうとしてエラーが出るので、
とりあぜずインストールをスキップしてプロジェクトを作成し、改めてシンボリックリンクを使わずにインストールする：

```sh
% hexo init proj --no-install
...
% cd proj
% npm install --no-bin-links
```

### 設定

```yml
$ vi _config.yml
title: サイトのタイトル
url: サイトのurl
title: :title.html  # 日付をつけないで、タイトル（フォルダ名含む）.html にする
```

## ポストの編集

```sh
% hexo new foo.md
```

で source/_posts/foo.md にフロントマターまで作ってくれる。あとは、

- % hexo gen でビルド
- % hexo server でサーバー起動

### github へデプロイ

user master にあげる場合：

```yml
$ vi _config.yml
deploy:
  type: github
  repo: git@github.com:<username>/<username>.github.io.git
  branch: master

```

project page github ブランチにあげる場合：

```yml
deploy:
  type: github
  repo: git@github.com:<username>/<projctname>.git
  branch: gh-pages
```

## カスタマイズ

### テーマ
https://hexo.io/themes/ で探してよさげなのを % git clone \<giturl\> theme/\<name\> として、_config.yml で "theme = \<name\>" とする。
ものによってはプラグインが必要となるので、README を見つつ入れる。

### プラグイン
いろいろプラグインがあるみたい。

- [tag-twitter](https://github.com/tea3/hexo-tag-twitter) twitter のつぶやきを取り込む：

### Middleman からの移行
middleman の source/ 以下必要な記事ファイルを hexo の proj/source/_posts 以下にコピーしてきて、拡張子を .html.md から .mdに変える：

```sh
$find . -type f -name "*.html.md" -print0 | while read -r -d '' file; do mv "$file" "${file%%.html.md}.md"; done
```
## 参考サイト

- [Vagrant, nvm と Node\.js をインストールする – Supertrue](http://blog.walfo.jp/vagrant-nvm-install/)
【質問】CSSデザインツールを教えて下さい。

CSSデザインツールを教えて下さい。

私はプログラミングは得意です。(もう何百万行書いてきたか覚えていません)
なのでHTMLなんて寝ながらでも書けるのですが、
CSSが苦手なのです。

例えば、<画像><画像の説明>、というパーツがあった場合、
<画像の説明>を<画像>の上下中央に配置したいけど、やり方が分からない
→ググル
→display: table-cell;でvertical-align: middle;すればいいよ
→やってみる
→崩れる
→またググル
の繰り返しです。
たったこれだけのCSS編集に１時間もかかってしまいます。

そこで、部分的なパーツをスタイリッシュにGUI操作＋値指定などで、
楽に作成できるCSSデザインツールを探しています。

よくある、テンプレートを選んで中の文字や画像を差し替えて・・・、といった類のものではなく、
もう少し細かい粒度(例 <div><img><span></span></div>の全体をターゲットとした)でパーツレベルで楽にＣＳＳが作成できる、CSSデザインツールが良いのです。

お勧めのものを教えて下さい。
なお、無料を求めています。（が、良ければ買います）

宜しくお願いします。
Agdaで整数

前回の記事 [Agdaで自然数](http://qiita.com/karrym/items/c7f26f54563550d1256b)

# やったこと
Agdaで整数を定義し, 基本的な性質を証明しました.

# ソースコード
https://github.com/karrym/NatToReal/blob/master/Int.agda

# 整数の構成
整数全体の集合$\mathbb{Z}$とは$\mathbb{N}\times\mathbb{N}$を次の同値関係$\equiv$で割った集合$\mathbb{N}\times\mathbb{N}/\equiv$のことです.
$$
(a, b) \equiv (c, d) \Leftrightarrow a + d = b + c
$$
$\mathbb{Z}$上の和と積は次のように定義できます. この和と積の定義は同値類の代表元によりません(ソースコードの+ℤ-lUniv, +ℤ-rUniv, *ℤ-lUniv, *ℤ-rUniv).

```math
\begin{align}
(a, b) + (c, d) &= (a + c, b + d) \\
(a, b) \times (c, d) &= (a \times c + b \times d , a \times d + b \times c)
\end{align}
```

このとき和の単位元は$(0, 0)$で積の単位元は$(1, 0)$になり, 整数$(a, b)$の逆元は$(b, a)$です.
また, $+$と$\times$は交換法則と結合法則, 分配法則を見たすので$\mathbb{Z}$は可換環をなします.

整数の重要な性質として自然数を含むことが挙げられますが, 実際に$\mathbb{Z}$から$(m, 0)$なる要素を全て取り出すと自然数をなします. すなわち, $(m, 0)$なる要素が正の整数であり, $(0, m)$なる要素が負の整数です.

整数での順序は次のように定義できます.
$$
a \leq b \Leftrightarrow \exists m \in \mathbb{N}. a + (m,0) = b
$$
この順序関係は全順序になります.

# まとめ
Setoidを用いて$\mathbb{Z}$を定義しましたが、Setoid上の射を定義する方法がわからず、結局は台集合上の射として和と積を定義し、Setoidに触れることなく緒性質を証明しました。 また、上で定義した同値関係でReasoningをする方法がわからず、同値関係の定義を展開して証明するような形になってしまいました。

# 参考文献
+ [整数 - Wikipedia](https://ja.wikipedia.org/wiki/整数)
+ [agda-stdlib](https://github.com/agda/agda-stdlib)
アルゴリズムの計算量見積もりの基礎

達人プログラマーを熟読中、今まで考えないようにしていた計算量の見積もりが出てきたのでメモ

# 規模のスケールでそのアルゴリズムのパフォーマンスはどう変化するか？

 - データを200万回追加しました。
 - 毎日1000件データが増えます。
 - サービスは2019年の3月までがサポート予定です。

などなど、処理の内容は変わらないが、処理対象の規模が変動するのが一般的だと思う。
プログラマーなら現在のシステムの処理速度がどのように変化するか？という点を常に意識したい。

# 単純なループ

```math
O(n)
```

基本は1からnまでの繰り返し
具体例としては、

 - 順次検索
 - 配列の最大値取得
 - チェックサムの生成
 - forループの中でSQLを実行する(ぐるぐる系)
 - テーブルのフルスキャン

等

データの量に応じて処理時間は比例の関係にある。

## ネストしたループ

```math:
O( n^2 )
```

1からnまでのループと1からmまでのループがネストしている場合、は$O(n*m)$となる
具体例としては

 - バブルソート
 - nestd loop join

等

## 二分割

```math:
O( log(n) )
```

2分木を活用するような処理を含む場合、計算量は対数($log$)に近いものになる

具体例としては

 - インデックススキャン
 - 2分木探索

処理規模が大きくなっても、処理コストが$O(n)$より増えにくいという特性を活かして、DBでは一般的にBTree indexを活用している。

| n     | n^2       | log2(n)       | 
|-------|-----------|---------------| 
| 1     | 1         | 0             | 
| 2     | 4         | 1             | 
| 3     | 9         | 1.5849625007  | 
| 4     | 16        | 2             | 
| 5     | 25        | 2.3219280949  | 
| 100   | 10000     | 6.6438561898  | 
| 1000  | 1000000   | 9.9657842847  | 
| 10000 | 100000000 | 13.2877123795 | 


小規模の場合、$O(n)$に負ける場合があるが規模がスケールする可能性があるなら採用する価値はある

# 分割統治法

```math
O(n log(n))
```

入力を分割し、それら2つをそれぞれ独立したものとして操作した後、結果を結合するようなアルゴリズムは$O(n log(n))$となる。具体例は分割したグループを再帰的にソートするクイックソート(平均)等

# 組み合わせ

```math:
O(C^n)
```
1から5までの順列をの組み合わせは？$5!=5*4*3*2*1=120$という風にパターンは120となる
6までの組み合わせ、7までの組み合わせとスケールしていくと組み合わせパターンは
6倍、42倍と増えていく。計算が現実的でないときは規模を小さくしたり、近似で妥協する。
一般的にこれらの問題は[組合せ爆発](https://ja.wikipedia.org/wiki/組合せ爆発)と呼ばれる

例
 - [巡回セールスマン問題](https://ja.wikipedia.org/wiki/巡回セールスマン問題)
 - [ナップサック問題](https://ja.wikipedia.org/wiki/ナップサック問題)
 - [ハミルトン閉路問題](https://ja.wikipedia.org/wiki/ハミルトン閉路問題)



# 結論
組合せ爆発を避けつつスケールにに強い最適なシステムが作れるのが理想。

# オマケ(各計算量の増減の比較1~10まで)

| 単純ループ – n | ネストループ – n^2 | 2分割 – log(n) | 分割統治 – n*log(n) | 組み合わせ – n! | 
|-----------|--------------|--------------|-----------------|------------| 
| 1         | 1            | 0            | 0               | 1          | 
| 2         | 4            | 1            | 2               | 2          | 
| 3         | 9            | 1.5849625007 | 4.7548875022    | 6          | 
| 4         | 16           | 2            | 8               | 24         | 
| 5         | 25           | 2.3219280949 | 11.6096404744   | 120        | 
| 6         | 36           | 2.5849625007 | 15.5097750043   | 720        | 
| 7         | 49           | 2.8073549221 | 19.6514844544   | 5040       | 
| 8         | 64           | 3            | 24              | 40320      | 
| 9         | 81           | 3.1699250014 | 28.529325013    | 362880     | 
| 10        | 100          | 3.3219280949 | 33.2192809489   | 3628800    | 

スケールが起こった場合、2分木をつかったアルゴリズムが如何に優秀かイメージが付くと思う
DBやSQLのチューニングをするときは心がけたい。

# 参考
[達人プログラマー](https://www.amazon.co.jp/dp/B06W567M44)
Push通知用のデバイストークンが取得できない場合の対処法

iOSでPush通知を行うアプリを開発した際、
デバイストークンが渡される以下メソッドが呼ばれない場合の確認事項

```objc:Objective-C
- (void)application:(UIApplication *)application 
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    //デバイストークン取得後の処理
}
```
```swift:Swift
func application( application: UIApplication, 
    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData ) {
    //デバイストークン取得後の処理
}
```

# 確認事項

1. target設定のCapabilities > Push NotificationsがONになっていることを確認する。
<img width="658" alt="スクリーンショット 2017-03-01 23.25.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/113553/53143ef9-216e-bce5-c312-f2b1624c615a.png">

2. iOS8以降の場合、registerForRemoteNotificationsをコールしているか確認する。

```objc:Objective-C
- (BOOL)application:(UIApplication *)application 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIUserNotificationType types =
                        UIUserNotificationTypeBadge|
                        UIUserNotificationTypeSound|
                        UIUserNotificationTypeAlert;

    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
    [application registerUserNotificationSettings:settings];
    return YES;
}

- (void)application:(UIApplication *)application 
    didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
    [application registerForRemoteNotifications];
}

- (void)application:(UIApplication *)application 
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    //デバイストークン取得後の処理
}

- (void)application:(UIApplication *)application
    didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    // エラー処理
}
```

```swift:Swift
func application( application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary? ) -> Bool {
    let settings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
    application.registerUserNotificationSettings(settings)
    return true
}

func application( application: UIApplication,
     didRegisterUserNotificationSettings notificationSettings:UIUserNotificationSettings) {     
     application.registerForRemoteNotifications()
}

func application( application: UIApplication,
     didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    //デバイストークン取得後の処理
}

func application( application: UIApplication!, 
    didFailToRegisterForRemoteNotificationsWithError error: NSError! ) {
    // エラー処理
}
```

# 参考
 - [Xcode6でiOS8へPush通知が送れない場合の解決方法](http://qiita.com/peromasamune/items/90970e9f9d5c34d21cfd)
 - [SwiftでPush通知](http://qiita.com/sawapi/items/feba100851de47fbe412)
 - [【iOS8とiOS7対応】SwiftでPush](http://qiita.com/fuji_syan/items/be4d0a26923200b201cc)