OmniAICreator/Qiita-1.07M huggingface dataset:
ファイルの変更を検知してscpを実行するコマンド

ローカルで更新したファイルをサーバにアップロードしたい場合に使うコマンド。ローカルはmacOSを想定。

## fswatchをインストールしておく

Linuxにはinotifywaitがあるが、macOSにはそれがないため、それ相当のツールであるfswatchをインストールする。

```
brew install fswatch
```

## ファイルの変更を検知してscpを実行するコマンド

```bash
$ dist="foo@remote_server:path" &&
  fswatch -0 . | {
    while read -d "" file
    do 
        pwd="$(pwd)/"
        src="${file:${#pwd}}"
        scp $src $dist
    done
}
```

## 実行例

```console
$ dist="pi@10.0.1.43:" &&
fswatch -0 . | {
    while read -d "" file
    do
        pwd="$(pwd)/"
        src="${file:${#pwd}}"
        scp $src $dist
    done
}
test.py                                                                             100% 3749     3.7KB/s   00:00
test.py                                                                             100% 3746     3.7KB/s   00:00
test.py                                                                             100% 3746     3.7KB/s   00:00
test.py                                                                             100% 3759     3.7KB/s   00:00
```
Pythonによる調和平均Harmonic mean (SciPyを使用)

#Pythonによる調和平均 (Harmonic mean)

PythonのSciPyを利用して調和平均を求める。SciPyのインストールを先にしておくこと。
```pip install scipy```

計算対象は全て0より大きい値(正の実数)でないと、例外を投げる。
負の数は分母を減少させ、調和平均が大きな値になってしまうため。
例えば、3,-3,4の調和平均を式に従い計算すると12になってしまう。このような値は使えない。

```py3:harmonic_mean1.py
from scipy import stats
# 1, 2, 4の調和平均 ⇒ 1.71428571429
print(stats.hmean([1, 2, 4]))
# 1, 0.5, 2.0, 10の調和平均 ⇒ 1.11111111111
print(stats.hmean([1, 0.5, 2.0, 10]))


# 以降は負の値を試した例

# 3,-3,4の調和平均 ⇒ ValueError: Harmonic mean only defined if all elements greater than zero
print(stats.hmean([3, -3, 4]))

# 調和平均の式に従って計算した場合 ⇒ 12 値が増えた!? いいえ、無効な値です。
print(3 / ((1 / 3.0) + (1 / -3.0) + (1 / 4.0)))
```

## 0や負の値が登場しても、調和平均のような値を取得したい場合
※正確な調和平均ではない為、この方法を適用して良いかどうか判断して参考にしてください
例外対策をしたstats.hmean()のラッパーを作ってみた。
0以下の値は非常に小さい正の実数に置き換えて計算する。 以下の例では0.0001で置き換えてみた。
値が全て0以下だった場合は平均を0にする。HM_OFFSETを返すと不自然な為。
Noneを扱えるようにしたので、計算対象の数値が取得できなかった場合はNoneとする。
これによって、取得できなかった数値が調和平均の値に影響を与えないようにする。

```py3:harmonic_mean2.py
from scipy import stats
HM_OFFSET = 0.0001
def custom_hmean(values_list):
    u"""調和平均の関数を例外対策したラッパー."""
    # 計算する値が全てNoneなら調和平均をNoneとする
    if values_list[0] is None and\
       values_list == [values_list[0]] * len(values_list):
        return None

    # 計算する値が全て0以下なら調和平均を0とする
    if max(values_list) <= 0:
        return 0

    # 計算する値がNoneの場合はデータが無いものとみなし、0以下の場合はHM_OFFSETの値とする
    return stats.hmean(
        [v if v > 0 else HM_OFFSET for v in values_list if v is not None])


print custom_hmean([3, 0, 4])                   # 0.000299982501021
print custom_hmean([3, None, 4])                # 3.42857142857
print custom_hmean([0, -1, -2, -3])             # 0
print custom_hmean([0, -1, -2, 1])              # 0.000133328889037
print custom_hmean([0, 0, 1, 0])                # 0.000133328889037
print custom_hmean([None, None, 1, None])       # 1.0
print custom_hmean([None, None, None, None])    # None
print custom_hmean([0, 0, 0, 0])                # 0
```

[scipy.stats.hmeanの詳細](http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.hmean.html) 英語
[調和平均の式はウィキペディア参照](https://ja.wikipedia.org/wiki/%E8%AA%BF%E5%92%8C%E5%B9%B3%E5%9D%87) ⇒ 調和平均は逆数の算術平均の逆数
WRF > Link > Vagrant Box / Ubuntu 14.04 へのインストールスクリプト > 失敗

WRF (Weather Research and Forecasting Model)というのは気象モデルとして各種のファイルを生成してくれるものらしい。
http://www2.mmm.ucar.edu/wrf/users/

WRFのセットアップに関連して以下を見つけた。
https://github.com/piyushnz/weather-box

以下ができるようだ。

- Vagrant Box + VirtualBoxでのセットアップ
- Ubuntu 14.04 へのインストールスクリプト

WRFのバージョンは WRF V3.6.1 (updated 2/18/15)なので少し古い。
最新はWRF V3.8 (updated 4/8/16)のようだ。
( http://www2.mmm.ucar.edu/wrf/users/の右下 )。


## VMイメージへのインストール

VMWare上にubuntu-ja-14.04-desktop-amd64.isoを用いてUbuntu 14.04をインストールし、上記のスクリプトを試した。

- /home/[user]以下にWRFinstall/を作成
- weeather-box-master.zipを取得
- unzipでzipファイルを解凍 (解凍先: WRFinstall)
- ~/WRFinstall/weather-box-master/provision/以下のファイルにchmod 770を実行
- ~/WRFinstall/weather-box-master/provision/setup_environment.shのように各スクリプトを実行

setup_environment.shだけで1時間近くかかった。
Ubuntu14.04インストール直後はcurlがないので、atp-get install curlでcurlをインストール必要あり。

install_dependencies.sh実行時`hdf5-1.8.14: No such file or directory`となった。

以下に記載のようにいくかのパッケージをインストールしないと失敗する。
[Install WRF model in Ubuntu Linux](https://tuxcoder.wordpress.com/2015/01/07/install-wrf-model-in-ubuntu-linux)

>  sudo apt-get install m4 csh netcdf-bin hdf4-tools hdf5-tools zlib* jasper libpng-dev build-essential ncl-ncarg gcc gfortran libnetcdf-dev mpich

さらに、

- ゲストOSとなっているUbuntuを再起動後にネットワークにつながらない症状が出た
- UbuntuでmicroSDをマウントすると、それをWindows側にマウントしなおした時に「ドライブに問題があります」となる
- 上記のスクリプトだけではWRFのインストールはスムーズにいかないようだ

以上の理由により、Ubuntuでのインストールはペンディングとすることにした。
WebStorm2016.2からはドラッグだけでファイルパスを挿入できる

多機能IDE「[WebStorm](https://www.jetbrains.com/webstorm/)」の2016.2から、**画像・CSS・JavaScriptのファイルパスを、ドラッグだけでHTMLコードに挿入できます**。

#手順
最初にHTMLファイルを開きます。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/42ce9f07-c8df-7ad7-1dff-e69d228ec931.png)

エディター左側にあるプロジェクトビューより、パスを挿入したいファイルを選択します。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/adeff128-425a-f2c2-f791-919a60a60715.png)

HTMLファイルにドラッグすれば、そのファイルのパスが挿入されます。また、`img`タグ、`link`タグ、`script`タグといった必要なタグも自動生成されます。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/1c53794a-d07b-b437-fb71-f810b7f54f25.gif)

▲ CSS・JavaScript・画像のパスをHTMLコードに挿入している様子

#コーディング作業がますます高速に
これまでWebStormでファイルパス挿入は、手動でパスを指定せねばならず、面倒でした。今回のアップデートでドラッグだけでファイルパスが挿入できるため、**HTMLコーディング作業が高速化・効率化でき、WebStormがますます便利になります**。筆者は数年間WebStormを使ってきましたが、ずっと待ちわびていた機能です。是非試してみてください。
nginx に USR1 シグナルを送ってログを開き直す

# `USR1` シグナルとは

`kill` コマンドでプロセスに送信できるシグナルの一つです。
シグナルでは `-9 (or -SIGKILL)`, `-15 (or -SIGTERM)` あたりが有名ですが、 `USR1` は `USeR defined` なシグナルです。このシグナルを受けた時のプロセスの挙動は、アプリケーションが自由に設定する事ができます。

nginx では [公式ドキュメント](https://www.nginx.com/resources/wiki/start/topics/examples/logrotation/#) にある通り、このシグナルを送信するとログファイルを再度掴み直してくれます。

```bash:使用例1
$ sudo kill -USR1 `pgrep nginx`
```

# 注意点

ただし一つ注意点が。

ログを格納しているディレクトリの権限を `755` にしておく必要があります。

```bash
# default
$ ls -la /var/log/
..
drwxr-x---  2 www-data  adm         4096 Jul 12 06:38 nginx/
..
$ sudo chmod 755 /var/log/nginx
$ ls -la /var/log/
..
drwxr-xr-x  2 www-data  adm         4096 Jul 12 06:38 nginx/
..
```

**第三者に実行権限を付与する**所がポイントです。

理由ですが、 `nginx` の worker process は ubuntu では `nobody` というユーザで実行されています。
このユーザは ubuntu 側で用意された、[権限をコントロールされたユーザ](http://askubuntu.com/questions/329714/what-is-the-purpose-of-the-nobody-user) です。例えば `nginx` プロセスが悪意のあるユーザに乗っ取られても被害が最小限に抑えられるようになっています。

第三者に実行権限を付与せずにログローテーション＆USR１を送信した場合の結果がこちらです。

```bash
$ for pid in `pgrep nginx`; do sudo lsof -p $pid | grep log;done;                                                                                                                                                                   
nginx   31014 root    2w   REG              202,1        0   160375 /var/log/nginx/error.log
nginx   31014 root    5w   REG              202,1        0   160366 /var/log/nginx/access.log
nginx   31014 root   10w   REG              202,1        0   160375 /var/log/nginx/error.log
nginx   31015 nobody    2w   REG            202,1     1230   164619 /var/log/nginx/error.log-20160712
nginx   31015 nobody    4w   REG            202,1  2468461   164113 /var/log/nginx/access.log-20160712
nginx   31015 nobody    5w   REG            202,1     1230   164619 /var/log/nginx/error.log-20160712
nginx   31016 nobody    2w   REG            202,1     1230   164619 /var/log/nginx/error.log-20160712
nginx   31016 nobody    4w   REG            202,1  2468461   164113 /var/log/nginx/access.log-20160712
nginx   31016 nobody    5w   REG            202,1     1230   164619 /var/log/nginx/error.log-20160712
```

master プロセスは新しいログファイルを掴み直していますが、 worker プロセスは依然昔のログを掴んだままになっています。

「[nginx usr1 not working](https://www.google.com.sg/search?q=nginx%20usr1%20not%20working)」あたりでググるといっぱい回答が出てきますが、意外とこの回答が見つからなかったので記載しておきます。
JenkinsのSlack pluginのバージョンをあげたら、起動できなくなったので、その対処法

# 概要

Jenkins の Slack plugin を2.0.1にあげたら、Jenkinsが起動できなくなった。

# 結論

ほかにもいろいろありそうだが、解決方法のひとつは

***バージョン1.8.1に戻す***

# やり方

正しいかどうかわからないが以下の方法で対処した

## 新しいやつを削除する

* [2.0.1 Release · Issue #193 · jenkinsci/slack-plugin](https://github.com/jenkinsci/slack-plugin/issues/193#issuecomment-198148750)

うえのコメントをもとに、

`/var/lib/jenkins/plugins/slack*`
を削除。

## 古いのをダウンロードし、配置する

* [FATAL: class jenkins.plugins.slack.SlackNotifier$SlackJobProperty is missing its descriptor since 2.0 · Issue #188 · jenkinsci/slack-plugin](https://github.com/jenkinsci/slack-plugin/issues/188#issuecomment-197559384)

うえの場所に書いてあるように、次の場所からダウンロードして
[https://updates.jenkins-ci.org/download/plugins/slack/1.8.1/slack.hpi](https://updates.jenkins-ci.org/download/plugins/slack/1.8.1/slack.hpi)

`/var/lib/jenkins/plugins/`
にslack.hpiを配置する

## Jenkins再起動

一応こちらではこれで起動ができた

## 参考

議論はここで続いているようである。

* [FATAL: class jenkins.plugins.slack.SlackNotifier$SlackJobProperty is missing its descriptor since 2.0 · Issue #188 · jenkinsci/slack-plugin](https://github.com/jenkinsci/slack-plugin/issues/188)

まだ全部よめていない。
dotnet cliにnugetからプロジェクトローカルのサブコマンドを追加する

# 初めに

EntityFrameworkCoreでは、nugetパッケージを追加すると、dotnet-cliコマンドで`dotnet ef`コマンドが使用できるようになるという機能がある。
これが応用できれば、独自のソース生成ツールの使用等に使えると思うので、やり方を調べてみた。

# 大雑把な手順

1. サブコマンドプロジェクトの作成
2. サブコマンドプロジェクトのnugetパッケージ化
3. 使用プロジェクトでサブコマンドプロジェクトのnugetパッケージ追加

以上でdotnetコマンドで使えるようになる

# サブコマンドプロジェクトの作成

実はサブコマンドの実体は、単なるdotnet coreのコンソールアプリケーションになるので、プログラム自体は通常のコンソールアプリケーションとほとんど変わりはない。
ただし、出力するDLLあるいはEXE名は、`dotnet-[サブコマンド名].[dll又はexe]`という形式にしなければならないというルールがある。
ここでnugetのパッケージ名をそのまま`dotnet-[サブコマンド名]`としても問題はないが、nugetパッケージ名に別名(`MyApp.MySubCommand`等)を使用したい場合、以下のようにcsprojの`Project/PropertyGroup/AssemblyName`に拡張子なしの名前を指定すれば、出力アセンブリ名を変更できる。

```xml
<Project Sdk="Microsoft.Net.Sdk">
  <PropertyGroup>
    <AssemblyName>dotnet-[サブコマンド名]</AssemblyName>
  </Property>
</Project>
```

## 使用フレームワークについて

サブコマンドプロジェクトで使用するフレームワークについては、dotnetコマンドで解釈できる形式であればいいので、
サブコマンドを使用するプロジェクトと必ずしも一致させる必要はない。

例えば、使用する側のフレームワークはnet452で、サブコマンドプロジェクトのフレームワークをnetcoreapp1.0にしても問題はない。
ただし、プロジェクトのアセンブリを読み込むタイプのコマンド等は、使用フレームワークを合わせる必要があるかもしれない。

# サブコマンドプロジェクトのnugetパッケージの作成

他のプロジェクトでサブコマンドとして使用する場合、nugetパッケージにして、そのnugetパッケージを読み込ませる必要があるため、nupkgファイルを作成する必要がある。これは、サブプロジェクト上で`dotnet pack`を実行すればOK。具体的な使い方は以下リンク。
[dotnet packコマンドについて](https://docs.microsoft.com/ja-jp/dotnet/articles/core/tools/dotnet-pack)

`dotnet pack`コマンドを実行すると、`[project.jsonがあるディレクトリ]/bin/[コンフィギュレーション]/[パッケージ名].[バージョン].nupkg`というパスにパッケージが出来上がる。

# プロジェクト上でサブコマンドを使用するための準備

作成したサブコマンドを使用するには、前述の手順で作成したnupkgをproject.json内の"tools"セクションに、下記例のように記述する必要がある。

```xml
<Project Sdk="Microsoft.Net.Sdk">
  <ItemGroup>
    <DotNetCliToolReference Include="[パッケージ名]" Version="[パッケージバージョン]"/>
  </ItemGroup>
</Project>
```

グローバルリポジトリに追加されたnupkgを参照する場合は、そのままでも使用可能だが、例えばローカルパッケージ等を参照したい場合は、project.jsonと同ディレクトリにNuGet.configファイルを作成し、packageSourcesにディレクトリを追加する必要がある。

```xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <packageSources>
        <add key="[任意のキー名]" value="[nupkgがあるディレクトリへのパス(csprojからの相対でも可)]"/>
    </packageSources>
</configuration>
```

以上の準備をした後、`dotnet restore`コマンドを実行すれば、参照を追加したプロジェクトで、dotnet-cliのサブコマンドが利用可能な状態になる。

# 制限

nugetパッケージとして`DotNetCliToolReference`要素で指定する必要があるため、`PackageReference`や`ProjectReference`ではできない。

# 参考URL等

* [公式ドキュメント](https://docs.microsoft.com/ja-jp/dotnet/articles/core/tools/extensibility)
* [Microsoft.EntityFrameworkCore.Tools](https://github.com/aspnet/EntityFramework/tree/dev/src/Microsoft.EntityFrameworkCore.Tools)
    * EntityFramework Coreで使用されている`dotnet ef`コマンドの本体。プロジェクト参照等もしているので、自分で作る際に参考になると思う
* [今回検証のために作成したソース](https://github.com/itn3000/dotnet-cli-subcommand-test)
AngularJSを使っていると、SVGのmarker-ほげほげ命令がうまく動作しない件


# 現象
- svgで矢印引きたい
- pathで作った線 + 三角形をmarker-end命令で線の終端に追加する
- うまく表示されない／^o^＼

# 解決法
なんとなくAngularのrouterが悪さしてそうと思ったら

http://stackoverflow.com/questions/26626662/angularjs-not-rendering-svg-correctly

というわけで、

```
url(#id)
ではなく
url(/route#id)
```

と書いてあげれば表示できまぁす！
gulp-webserver


https://www.npmjs.com/package/gulp-webserver


##install
```
$ npm install -D gulp-webserver
```
##Usage Basic
```
var gulp = require('gulp');
var webserver = require('gulp-webserver');
 
gulp.task('webserver', function() {
  gulp.src('dist')　//任意のフォルダー htdocsとか
    .pipe(webserver({
      host: 'localhost',
      port: 9001,　//任意のport番号
      livereload: true,　//ライブリロード
      directoryListing: false //directory表示
      open: true
    }));
});
```
###Option Exmple1
- 任意のファイルを開きたい場合

```
var gulp = require('gulp');
var webserver = require('gulp-webserver');

gulp.task('webserver', function() {
  gulp.src('dist')
    .pipe(webserver({
      host: 'localhost',
      port: 9001;
      livereload: true,
      open : 'http://localhost:9001/index.html' //任意のファイルを開きたいときはパスを指定
    }));
});
```

###Option Exmple2(SSI IP)
- SSIを利用する場合（プラグイン追加）
- IPアドレスでアクセスする場合（プラグイン追加）

```
npm install -D connect-ssi
npm install -D my-ip
```
```
var gulp = require('gulp');
var webserver = require('gulp-webserver');
var connectSSI = require('connect-ssi');
var ip = require('my-ip');

gulp.task('webserver', function() {
  gulp.src('dist')
    .pipe(webserver({
      host: '0.0.0.0', //IPアドアレスでアクセスする場合は「0.0.0.0」をセットしてMY-IPでアクセス
      port: 9001;
      livereload: true,
      middleware: [
		connectSSI({// connectSSI
		 ext: '.html', // file extension. Only urls ending in this will be evaluated.
		 baseDir: 'htdocs'//  BasePath
		})
      ],
      open : 'http://'+ ip() +':9001/index.html'
    }));
});
```

###DefultTask
```
gulp.task('default', ['webserver']);
```
PythonのDSLでJSON Schemaを書く

JSON SchemaというJSONのスキーマをJSONで定義するものがある。が，JSON Schemaを手でちまちま書いていると面倒なので作成のためのツールがある。そのなかでPythonでJSON SchemaのDSLを作成したjslというパッケージについて簡単な説明をする。

サンプルとして以下のようなJSON Schemaを使う。

```JSON
{
	"title": "Example Schema",
	"type": "object",
	"properties": {
		"firstName": {
			"type": "string"
		},
		"lastName": {
			"type": "string"
		},
		"age": {
			"description": "Age in years",
			"type": "integer",
			"minimum": 0
		}
	},
	"required": ["firstName", "lastName"]
}
```

これをjslを使って定義すると次のようになる。

```python3
import jsl

class Example(jsl.Document):
    class Options(object):
        title = "Example Schema"
    firstName = jsl.StringField(required=True)
    lastName = jsl.StringField(required=True)
    age = jsl.IntField(description="Age in years", minimum=0)
```

これを出力したい場合はクラスメソッドのget_schemaを使う。

```python3
import json

print(json.dumps(Example.get_schema(ordered=True), indent=4))
```

# 参考
* http://json-schema.org
* https://pypi.python.org/pypi/jsl
Processing > はじめの一歩 > ランダムな線の描画

```txt:動作確認
Windows 7 pro
```

参考 http://ap.kakoku.net/

openprocessingというブラウザ動作の環境でProcessingを試した。

http://www.openprocessing.org/sketch/377040

```c
int counter;
 
void setup() {  //setup function called initially, only once
  size(250, 250);
  background(255);  //set background white
  colorMode(HSB);   //set colors to Hue, Saturation, Brightness mode
  counter = 0;
}
 
void draw() {  //draw function loops
  counter++;
//  noStroke();
  
  stx = random(50);
  sty = random(50);
  wid = random(100);
  hei = random(100);
  line( stx, sty, stx+wid, sty+hei);
  
  if(mousePressed == true) { //add some interaction
      noStroke();
  }
}
```

マウスクリックした時点で線の追加をやめる実装。
最初から動かしなおす場合は、ブラウザのリロードを使う。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c1d0b555-2aef-92ee-9ab7-ed611cc3063c.png)

C++ Builder, Visual Studio, Unity以外の描画ツールとして使えるだろうか。。。

## v0.2 > クリック時にクリア

参考 https://forum.processing.org/one/topic/how-to-clear-the-screen-after-drawing-something.html
> just call background(yourBgColor);


background()で描画したものを消すらしい。

http://www.openprocessing.org/sketch/377041

```c
void setup() {  //setup function called initially, only once
  size(250, 250);
  background(255);  //set background white
  colorMode(HSB);   //set colors to Hue, Saturation, Brightness mode
  counter = 0;
}
  
void draw() {  //draw function loops
  counter++;
//  noStroke();
   
  stx = random(50);
  sty = random(50);
  wid = random(100);
  hei = random(100);
  line( stx, sty, stx+wid, sty+hei);
   
  if(mousePressed == true) { //add some interaction
      background(255);
  }
}
```

<hr>
(追記 2016/07/13)

Windows用Processing3で実行する場合は上記コードではエラーが出て、以下のように変更が必要だった。
変数の型宣言を明示しないといけないとのこと。
また、random()の戻り値がfloatのためエラーが出た。(int)で対応した。

```
int counter;

void setup() {  //setup function called initially, only once
  size(250, 250);
  background(255);  //set background white
  colorMode(HSB);   //set colors to Hue, Saturation, Brightness mode
  counter = 0;
}

void draw() {  //draw function loops
  counter++;
//  noStroke();
  int stx, sty, wid, hei;

  stx = (int)random(50);
  sty = (int)random(50);
  wid = (int)random(100);
  hei = (int)random(100);
  line( stx, sty, stx+wid, sty+hei);

  if(mousePressed == true) { //add some interaction
      background(255);
  }
}
```
なぜdocker stopは時間がかかるんですか？その理由と解決方法

`docker stop`ってどうして時間がかかるのだろう？？と疑問に思ったことはありませんか。

その理由は、**Linuxではpid=1のプロセスはとても特別な扱いをうけるので簡単にkillできないという性質がある**にもかかわらず、`docker run`でコンテナ上で実行されるコマンドはpidが1だからです。そういった問題を解決するのが[dumb-init](https://github.com/Yelp/dumb-init)であったり、[tini](https://github.com/krallin/tini)であったりするわけです。

ということで、試しにdumb-initで本当に問題が解決されるか検証してみましょう。

## テスト用のDockerマシンを準備する

すでにテスト用の環境がある方はスキップして次に進んで下さい。

```
$ docker-machine create --driver virtualbox node1
$ eval $(docker-machine env node1)
```

## dumb-initをインストールするDockerfileを準備する

下記の通りapache2とdumb-initをインストールするDockerfileを準備します。

```
FROM ubuntu:14.04

RUN apt-get update && \
    apt-get -y install apache2 python-pip && \
    apt-get clean && \
    pip install dumb-init
```

このDockerfileをdumb-initという名前でビルドします。

```
$ docker build -t dumb-init .
```

これで準備できました。それでは計ってみましょう。

## dumb-initを使わない場合の`docker stop`の時間を計ってみる

```
## dumb-initなしでapache2をスタートします
$ docker run -p 80:80 --name without-dumb-init -dt dumb-init /usr/sbin/apache2ctl -D FOREGROUND

## ストップしてみます
$ time docker stop without-dumb-init

real	0m10.130s
user	0m0.033s
sys	0m0.013s
```

**10秒**かかりました。仮にこのコンテナが６つあった場合はすべてストップするのに1分もかかることになります。

## dumb-initを使った場合の`docker stop`を計ってみる

```
## dumb-initありでapache2をスタートします
$ docker run -p 80:80 --name with-dumb-init -dt dumb-init /usr/local/bin/dumb-init /usr/sbin/apache2ctl -D FOREGROUND

## ストップしてみます
$ time docker stop with-dumb-init

real	0m0.127s
user	0m0.030s
sys	0m0.011s
```

一目瞭然ですね。コンテナは軽量で速いことが利点なので、今後はなるべくdump-initやtiniを使うようにしましょう。

> **NOTE:** 一応参考までにですが、この問題は[dockerのissueでも見かける](https://github.com/docker/docker/issues/3766)ので、そのうち解決されるかもしれませんね。

## 片付ける

```
docker rm with-dumb-init without-dumb-init
docker-machine rm node1
```

## もう少し詳しく知りたい人へ

dumb-initを開発したYelpの[Chris Kuehl](https://github.com/chriskuehl)さんのブログ["Introducing dumb-init, an init system for Docker containers"](https://engineeringblog.yelp.com/2016/01/dumb-init-an-init-for-docker.html)を読んでみることをお勧めします。とても勉強になります。
Blocks

全然頭に入らないので覚え書き。

# NSStringをNSNumberに変換すると見せかけて実は何もしていないメソッド

```objc
- (NSNumber *)string2number:(NSString *)string func:(NSNumber * (^)(NSString *str))func
{
    NSLog(@"  [enter]");
    NSLog(@"  string=[%@]", string);
    NSLog(@"  func=%@", func);
    NSNumber *number = func(string);
    NSLog(@"  number=%@", number);
    NSLog(@"  [exit]");
    return number;
}
```

## NSStringをintなNSNumberに変換してもらうと見せかけて自分で変換する

```objc
NSLog(@"[int]");
NSNumber *number;
number = [self string2number:@"123.45"
                        func:^NSNumber *(NSString *string) {
                            NSLog(@"string=[%@]", string);
                            return @(string.intValue);
                        }];
NSLog(@"number=%@(%s)", number, [number objCType]);
```

```text:log
[int]
  [enter]
  string=[123.45]
  func=<__NSGlobalBlock__: 0xb7144>
string=[123.45]
  number=123
  [exit]
number=123(i)
```

## NSStringをfloatなNSNumberに変換してもらうと見せかけて自分で変換する

floatにしただけです。

```objc
NSLog(@"[float]");
NSNumber *number;
number = [self string2number:@"987.65"
                        func:^NSNumber *(NSString *string) {
                            NSLog(@"str=[%@]", string);
                            return @(string.floatValue);
                        }];
NSLog(@"number=%@(%s)", number, [number objCType]);
```

```text:log
[float]
  [enter]
  string=[987.65]
  func=<__NSGlobalBlock__: 0xb7168>
str=[987.65]
  number=987.65
  [exit]
number=987.65(f)
```

## NSStringをdoubleなNSNumberに変換してもらうと見せかけて自分で変換する

一旦変数に代入（という表現でいいのか？）してから使う。

```objc
NSLog(@"[double]");
NSNumber * (^str2dbl)(NSString *) = ^NSNumber * (NSString *string)
{
    NSLog(@"string=[%@]", string);
    return @(string.doubleValue);
};

NSNumber *number;
number = [self string2number:@"999.99" func:str2dbl];
NSLog(@"number=%@(%s)", number, [number objCType]);
```

```text:log
[double]
  [enter]
  string=[999.99]
  func=<__NSGlobalBlock__: 0xe2194>
string=[999.99]
  number=999.99
  [exit]
number=999.99(d)
```

## typedef

```objc
typedef NSNumber * (^func) (NSString *);
```

# リンク

* [Block構文の基本](http://obc-fight.blogspot.jp/2013/07/Block-basic.html) / Objective-Cと戦うブログ

* [How Do I Declare A Block in Objective-C?](http://fuckingblocksyntax.com/)
GTX1080に換装すると一部のtensorflowのコードが動かなくなっていた件

#結論

ubuntu14.04 + CUDA 7.0 + cudnn 4
から
ubuntu16.04 + CUDA 8.0 + cudnn 5に変えたら治った。

（CUDA8.0を用いる場合は、ソースコードからコンパイルする必要があるので注意。）

研究室のHPCにそれとなく付いていたgtx960を使ってMNIST等を試していたのだが、ある日gtx1080を入れることになって、差し替えてドライバを入れなおした。

エラー等全く出ないので、一安心とか思っていたら、MNISTのコードが動かなくなる。というか精度が全く上がらなくなる。原因を突き止めると、計算結果がすべて0になり、エントロピーを求める計算でlog(0)を計算していたことに気づく。詳しく調べると、tensorflow内での計算がおかしくなっていたので、これは・・・対応とかの問題ではと気づく。もしやと思い環境を変えたら治った。

はっきりとした原因がわかっているわけではないので、これで治ると断言できるわけではないです。同様の問題があまり取り扱われていないので、参考になれば・・・幸いです。
Cakephp3 メモリリミットエラー

## 直面した問題

CakePHP3を使ったシステムのバッチ処理でメモリーリミットエラーが発生

```
Fatal error: Allowed memory size of ****** bytes exhausted
```


## 原因

数十万件のレコードを更新するバッチ処理で
かつ、開発環境にてデバッグモードで実行していたので
SQLのクエリログが大量に残り、メモリを圧迫していた


## 解決策

### 設定ファイルでクエリログを無効にする

``` php:config/app.php
[
    'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'localhost',
            'username' => 'root',
            'password' => 'admin',
            'database' => 'databasename',
            'encoding' => 'utf8',
            'timezone' => '',
            'cacheMetadata' => true,
            'log' => false,// ← ここ！！
            'quoteIdentifiers' => true,
        ],
]
```

### または、Shellの時だけ無効にする

※自分はこちらで解決しました

``` php:Shell/AppShell.php
class AppShell extends Shell
{

    public function initialize()
    {
        parent::initialize();
        ConnectionManager::get('default')->logQueries(false);
    }
}
```

## 結果

### Before
```
2016-07-12 12:18:46 Info: 0件目：メモリ使用量 36.333709716797MB
2016-07-12 12:19:06 Info: 10000件目：メモリ使用量 61.611282348633MB
2016-07-12 12:19:30 Info: 20000件目：メモリ使用量 90.64225769043MB
2016-07-12 12:19:50 Info: 28000件目：メモリ使用量 113.06938171387MB
```

### After
```
2016-07-12 12:31:50 Info: 0件目：メモリ使用量 35.958770751953MB
2016-07-12 12:32:16 Info: 10000件目：メモリ使用量 35.958770751953MB
2016-07-12 12:32:41 Info: 20000件目：メモリ使用量 35.958770751953MB
2016-07-12 12:33:01 Info: 28000件目：メモリ使用量 35.958770751953MB
```

1MBも増えなくなりました
UIImageJPEGRepresentationを使う際の注意点

## はじめに

画像サイズが一定以上の際は、リサイズしてサーバーにアップロードするという仕様がありました。しかし、リサイズしていない画像をサーバーにアップロードした際に、iPhone上でのデータサイズよりもサーバーにアップロードしたデータサイズが大きくなってしまうという現象に遭遇しました。

## 実際に

H:512px W:320pxの下記の画像を`UIImageJPEGRepresentation`で`NSData`に変換したいと思います。
![wallpaper.jpg](https://qiita-image-store.s3.amazonaws.com/0/60325/df989f49-dbb5-9b2a-1197-b0ba297ed476.jpeg)

もともとのサイズは**34KB**になります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/60325/9ca360ab-7536-c849-53dd-a12ece53093d.png" width="500px"/>

Playgound上で上記の画像を`1`、`0.75`、`0.5`、`0.25`の`compressionQuality`で`NSData`にしていきます。

```swift
//: Playground - noun: a place where people can play

import UIKit

let image = UIImage(named: "wallpaper.jpg")!

let fileManager = NSFileManager.defaultManager()
let documentPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]

var isDirectory: ObjCBool = false
if !fileManager.fileExistsAtPath("\(documentPath)/Images", isDirectory: &isDirectory) {
    try! fileManager.createDirectoryAtPath("\(documentPath)/Images", withIntermediateDirectories: true, attributes: nil)
}

let maxQualityImageData = UIImageJPEGRepresentation(image, 1)
fileManager.createFileAtPath("\(documentPath)/Images/maxQualityImage.jpg", contents: maxQualityImageData, attributes: nil)
// 123KBになる

let threeQuartersQualityImageData = UIImageJPEGRepresentation(image, 0.75)
fileManager.createFileAtPath("\(documentPath)/Images/threeQuartersQualityImage.jpg", contents: threeQuartersQualityImageData, attributes: nil)
// 46KBになる

let halfQualityImageData = UIImageJPEGRepresentation(image, 0.5)
fileManager.createFileAtPath("\(documentPath)/Images/halfQualityImage.jpg", contents: halfQualityImageData, attributes: nil)
// 30KBになる

let quarterQualityImageData = UIImageJPEGRepresentation(image, 0.25)
fileManager.createFileAtPath("\(documentPath)/Images/quarterQualityImage.jpg", contents: quarterQualityImageData, attributes: nil)
// 13KBになる
```

<table>
<tr>
<td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/60325/370a8ae5-6199-36ca-c102-d8fc58551393.png" width="300px">
</td>
<td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/60325/3f59349f-b7ec-a7c4-e9ff-961a0c0ec9e2.png" width="300px">
</td>
</tr>
<tr>
<td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/60325/ea50f218-8cb6-f824-e458-413be155852d.png" width="300px">
</td>
<td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/60325/af0c2917-874c-9ebc-7196-f335bbb2cb57.png" width="300px">
</td>
</tr>
</table>

## 最後に

`1`、`0.75`、`0.5`、`0.25`で指定していくので一瞬倍率に見えてしまうのですが、`1`は**1倍ではなくて、クオリティが最大**になります。

どの程度のクオリティで出力するかはデザイナーの方と実際に圧縮率の違う出力された画像を比較して、決めるのが良いかもしれません。
Mailcatcherがエラーで起動しない対処メモ

事象
===

* メールキャッチャーを起動しようとしたらエラーがでて上がりません

```
$ mailcatcher
/usr/local/rvm/rubies/ruby-2.2.3/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- concurrent (LoadError)
        from /usr/local/rvm/rubies/ruby-2.2.3/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/rvm/gems/ruby-2.2.3@mailcatcher3/gems/activesupport-4.2.7.rc1/lib/active_support/logger_thread_safe_level.rb:2:in `<top (required)>'
        from /usr/local/rvm/rubies/ruby-2.2.3/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/rvm/rubies/ruby-2.2.3/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/rvm/gems/ruby-2.2.3@mailcatcher3/gems/activesupport-4.2.7.rc1/lib/active_support/logger.rb:3:in `<top (required)>'
        from /usr/local/rvm/rubies/ruby-2.2.3/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/rvm/rubies/ruby-2.2.3/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/rvm/gems/ruby-2.2.3@mailcatcher3/gems/activesupport-4.2.7.rc1/lib/active_support.rb:27:in `<top (required)>'
        from /usr/local/rvm/rubies/ruby-2.2.3/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/rvm/rubies/ruby-2.2.3/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/rvm/gems/ruby-2.2.3@mailcatcher3/gems/activesupport-4.2.7.rc1/lib/active_support/all.rb:1:in `<top (required)>'
        from /usr/local/rvm/rubies/ruby-2.2.3/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/rvm/rubies/ruby-2.2.3/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/rvm/gems/ruby-2.2.3@mailcatcher3/gems/mailcatcher-0.6.4/lib/mail_catcher.rb:16:in `<top (required)>'
        from /usr/local/rvm/rubies/ruby-2.2.3/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/rvm/rubies/ruby-2.2.3/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/rvm/gems/ruby-2.2.3@mailcatcher3/gems/mailcatcher-0.6.4/bin/mailcatcher:3:in `<top (required)>'
        from /usr/local/rvm/gems/ruby-2.2.3@mailcatcher3/bin/mailcatcher:23:in `load'
        from /usr/local/rvm/gems/ruby-2.2.3@mailcatcher3/bin/mailcatcher:23:in `<main>'
        from /usr/local/rvm/gems/ruby-2.2.3@mailcatcher3/bin/ruby_executable_hooks:15:in `eval'
        from /usr/local/rvm/gems/ruby-2.2.3@mailcatcher3/bin/ruby_executable_hooks:15:in `<main>'
```

原因
===

* 依存ライブラリのバージョンの問題のようです
  * activesupportのrcが入ってきてしまっている

対処
===

* 下記であがるようになりました

```
gem uninstall activesupport -v 4.2.7.rc1
gem install activesupport -v 4.2.6
```
【コピペ】特殊文字

すいません。ただの僕得です。（他によく使う特殊文字があるときは、随時追加します。）
OSや環境によっては表示されないかも。

##ディレクトリを表すのに使える線

─━│┃┌┎┏┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┦┧┨┩┪┫
┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋╌╍╎
╏┄┅┆┇┈┉┊┋╏═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮
╯╰╱╲╳╴╵╶╷╸╹╺╻╼╽╾╿

##丸囲み数字

①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳

##丸囲み漢数字

㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉

##丸囲み曜日

㊊㊋㊌㊍㊎㊏㊐

##丸囲み権利マーク

© ® ℗

##丸囲み漢字

㊐㊑㊒㊓㊔㊕㊖㊗㊘㊙㊚㊛㊜㊝㊞㊟

㊠㊡㊢㊣㊤㊥㊦㊧㊨㊩㊪㊫㊬㊭㊮㊯

㊰
conda installでpygameをインストールしたらNo module named font

# 環境

OS: Ubuntu 14.04
Anaconda: 4.1.6
Python: 2.7.11

# 問題

`conda install -c tlatorre pygame=1.9.2`

こうやってインストールしたら"No module named font"というエラーが出る．

# 解決策

一旦`conda uninstall pygame`して別のpackageを試したらエラーが出なくなった．

`conda install -c kne pygame=1.9.2a0`
【htaccess】403・404・500エラーのときに任意で作成したページを表示する

#基本的にはこれでOK

`.htaccess`に下記を記述して、ルートディレクトリに`.htaccess`と`error.html`を設置すればOK。

```.htaccess:.htaccess(基本な記述）
ErrorDocument 403 /error.html
ErrorDocument 404 /error.html
ErrorDocument 500 /error.html
```

コメントで　rryu さんからご指摘がある通り、パスの指定に絶対URL（例：`http://aaa.com/error.html`）は記述しないでください。

理由は「[ErrorDocumentを絶対URLで書くのはやめようよ](http://memo.hirosiki.jp/article/52431377.html)」が参考になります。

上述した`.htaccess(基本な記述）`のように絶対URLは使わずに記述すれば、OKです。


#上位階層にURLの書き換えやリダイレクトを設定する.htaccessがある場合

仮に下記のようなディレクトリ構成とします。

![htaccess.png](https://qiita-image-store.s3.amazonaws.com/0/42231/261bfae9-32d5-67c4-e668-caaffdfe9a2e.png)

今回、`ccc.com`のエラー表示を制御したいとします。

通常であれば、前述した通りの記述で`ccc`内に`.htaccess`と`error.html`を設置すれば、問題ありません。

但し、上位階層にURLの書き換えやリダイレクトを設定する`.htaccess`がある場合は注意が必要です。

私の場合は、`www`直下にWordPressが入っており、`w-htaccess`が下記のようにURLを書き換える記述があったため、うまく動作しませんでした。


```.htaccess:.htaccess（w-htaccess）
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
```

最初は解決策として、`c-htaccess`の記述を下記のようにすることで、問題なく動作しましたが、前述した通り、絶対URLの指定は避けた方がよいです。

```.htaccess:.htaccess（c-htaccess）：悪い例
ErrorDocument 403 http://ccc.com/error.html
ErrorDocument 404 http://ccc.com/error.html
ErrorDocument 500 http://ccc.com/error.html
```

ただ、最初に紹介した`.htaccess(基本な記述）`のようにルート相対パス（例：`/error.html`）で指定すると500エラーが表示されます。
エラーの原因は、`w-htaccess`の有効範囲です。
基本的に、`.htaccess`に記述した内容は、下層ディレクトリも適用範囲になります。
つまり、`w-htaccess`に記述した内容は、`ccc`内にも適用されるということです。
実際に`ccc`内では下記の記述が適用されているということになります。

```.htaccess:.htaccess（ccc内では上位階層のw-htaccessの記述も適用される）
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

ErrorDocument 403 /error.html
ErrorDocument 404 /error.html
ErrorDocument 500 /error.html
```

上述したように`ccc`内でも書き換えが行われているため、500エラーが表示されます。
そのため、`ccc`内では書き換えを行わないように下記のように`RewriteEngine`を`Off`にすれば、問題なく任意のエラーページが表示されるようになります。

```.htaccess:.htaccess（c-htaccess）：解決策
RewriteEngine Off
ErrorDocument 403 /error.html
ErrorDocument 404 /error.html
ErrorDocument 500 /error.html
```

私は、上述した方法で解決しましたが、もっとスマートな方法があれば、教えてくださいm(__)m

#参考サイト

`.htaccess`の基本的なことについて解説。

+ [.htaccessの書き方 | murashun.jp](https://murashun.jp/blog/20141229-01.html)

`.htaccess`のrewriteについては下記を。

+ [mod_rewriteリファレンス - dawgsdk.org](http://blog.dawgsdk.org/weblog/archives/411011)

WordPressの`.htaccess`に記述されている内容については下記を。

+ [今さら人に聞けない！WordPressで使われているmod_rewriteの説明書](http://html-coding.co.jp/knowhow/tips/wp_modrewrite/)
Django + SQLAlchemy + Alembic を使うときのDB設定

Djangoの標準ORMは速度的な問題があったりするので、SQLAlchemyを使いたくなる場合があります。
しかし、SQLAlchemyのマイグレーションはこれもあまりイケてないので、かわりにAlembicを使ってマイグレーションを行いたいと思います。
 
それぞれ独立したモジュールなので各々DBの設定は異なる方法で行っています。バラバラに書くのは面倒なのでSQLAlchemyとAlembicはDjangoの設定を参照する形にしました。

#ファイル構成

まず、以下のようなファイル構成を想定します。

```
myProject/ +--- manage.py
           +--- alembic/ ---+-- env.py
           |                +--- 他
           +--- alembic.ini
           +--- myProject/ -+-- settings.py
           |                +--- 他
           +--- myApp/ -----+-- models.py
                            +--- 他
```

#Djangoの設定

これは標準的な設定方法でそのままにします。
mysqlを使う想定です。

```python:settings.py
# Database
 
DATABASE_ENGINE = 'mysql'
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'xxxx',      # 適当です
        'USER': 'xxxx',      # 適当です
        'PASSWORD': 'xxxx',  # 適当です
        'HOST': 'xxxx',      # 適当です
        'PORT': 'xxxx',      # 適当です
        'OPTIONS': {},       # 必要があれば
    }
}
 
SQLALCHEMY_OPTIONS = {} # SQLAlchemyに設定を行う必要があれば
```

#SQLAlchemyの設定

sqlalchemyはsessionを作る際にDBの設定をする必要になります。
myProject/myProject に db.py というファイルを作りsessionを作る必要がある場合このファイルを読み込んでsessionを作れるようにします。

```python:myProject/myProject/db.py
# -*- coding: utf-8 -*-
"""db session and util."""
 
from myProject import settings
 
import sqlalchemy.orm
 
from sqlalchemy.engine.url import URL
 
def db_url():
    db_settings = settings.DATABASES['default']
    url = URL(drivername=settings.DATABASE_ENGINE,
        database=db_settings['NAME'],
        username=db_settings['USER'],
        password=db_settings['PASSWORD'],
        host=db_settings['HOST'],
        port=db_settings['PORT'] or None,
        query = getattr(db_settings, 'OPTIONS', {})
        )
    return url
 
def create_engine():
    try:
        url = db_url()
    except:
        raise
    options = getattr(settings.DATABASES['default'], 'SQLALCHEMY_OPTIONS', {})
    engine = sqlalchemy.create_engine(url, **options)
    return engine
 
def make_session():
    Session = sqlalchemy.orm.sessionmaker(bind=create_engine())
    session = Session()
    return session
```

#Alembic

基本的にalembicのDBの設定はalembic.iniから設定します。
しかし、これだとそのままではsettings.pyファイルから参照する形ではなく不便なので、alembic/env.py で動的に設定します。

```python:env.py
### 一部抜粋
import os
import sys
  
from alembic import context
  
# このファイルがある位置的にそのままだとsettingsが読み込めないのでパスを通す
path = os.path.join(os.path.dirname(__file__), '../')
sys.path.append(path)
 
from user import models
from myProject.db import db_url
  
config = context.config
 
# URLを設定
url = str(db_url())
config.set_main_option("sqlalchemy.url", url)
```
【htaccess】インデックスファイルがないときに、ディレクトリ内にあるファイル一覧を表示させない

さくらのレンサバでは、インデックスファイルがないとディレクトリ内にあるファイル一覧が表示されます。

`htaccess`で制御することが可能です。

`htaccess`での設定方法は、公式の「[.htaccessによるアクセス制御](https://help.sakura.ad.jp/app/answers/detail/a_id/2315/session/L2F2LzEvdGltZS8xNDY4Mjg1MjU0L3NpZC9iaUFpMmlWbQ%3D%3D)」に記載されております。

おわり。

と言いたいところですが、このままでは糞記事になるので、補足します。

ファイル一覧を表示させないようにするには、`htaccess`に`Options -Indexes`を記述する方法があるそうです。

さくらでは`Options`が使えないので、`DirectoryIndex`を使います。

仮に、インデックスファイルが存在しないときは、`error.html`というファイルを表示したいとします。

`htaccess`に下記を記述することで`error.html`が表示されるようになります。

~~~
DirectoryIndex index.html index.php index.cgi /error.html
~~~

この記述は読み込み順の設定をしております。
左から順に読み込まれるようになっており、`index.html`がなければ、次の`index.php`のファイルを読み込みます。
`index.php`のファイルがなければ、`index.cgi`が読み込まれるというように左から順に読み込みます。

`index.htm`など他のインデックス形式も使用している方は、追記してください。

ちなみに`error.html`の設置場所を誤るとうまく動作しません。

一つのサーバーで複数のドメインを使用している方は、```/error.html```の記述を適宜変更してください。

上記の記述だと、`htaccess`と`error.html`がルートディレクトリに設置されていれば動くはず。

おわり。
テキストファイルの1行目以降を出力

すごく単純だが、`head`や`tail`でできずにちょっと悩んだので。

```sh
k-gosho@kgosho-ubuntu ~ % cat languages.txt
id,name
1,"Ruby"
2,"Perl"
3,"PHP"
```

```sh
k-gosho@kgosho-ubuntu ~ % cat languages.txt | awk 'NR > 1'
1,"Ruby"
2,"Perl"
3,"PHP"
```

追記

`tail -n +2`でも良いのか。

でも`awk`の方が直感的で見やすいな。
WordPress の投稿編集画面でコメントアウトを使えるようにする

WordPressの投稿本文部分ではコメントアウト `<!-- -->` が使えない。
たまに使いたい人向け。

# もともとの許可されているタグ
https://core.trac.wordpress.org/browser/tags/4.5.3/src/wp-includes/kses.php

上記のようにコメントアウトのタグは許可されていない。

# ショートコード作っちゃえ

```php:ignore_shortcode.php
<?php
/**
 * 投稿内でコメントアウトできるようにする
 */
function ignore_shortcode( $atts, $content = null ) {
	return null;
}
add_shortcode( 'ignore', 'ignore_shortcode', '9999' );
```

`[ignore]コメントアウト[/ignore]` とすれば表側には出力されない。DBには残るので投稿作成画面では確認できる。

更に使いやすくするなら Quicktags 登録しておけばいいんじゃないかな。

- https://codex.wordpress.org/Quicktags_API
- https://generatewp.com/quicktags/
Elixirで動的にfunctionを呼び出してみる

# Elixirで動的にfunctionを呼び出す
JAVAでいうとリフレクションのようなもの。

```hello.ex
defmodule HelloWorld do
  def hello do
    IO.puts "Hello World"
  end
end
```

```bash
$iex hello.ex
Erlang/OTP 18 [erts-7.3] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Interactive Elixir (1.2.5) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> HelloWorld.hello
Hello World
:ok
iex(2)> "HelloWorld.hello" |> Code.string_to_quoted |> Code.eval_quoted           
Hello World
{{:ok, :ok}, []}
```
## 動的に引数も渡す
```hello.ex
defmodule HelloWorld do
  def hello do
    IO.puts "Hello World"
  end
  def hello(name) do
    IO.puts "Hello World" <> name
  end
end
```

```bash
$iex hello.ex
Erlang/OTP 18 [erts-7.3] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Interactive Elixir (1.2.5) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> name = " Elixir " 
" Elixir "
iex(2)> "HelloWorld.hello(#{inspect name})" |> Code.string_to_quoted |> Code.eval_quoted 
Hello World Elixir 
{{:ok, :ok}, []}
```
factory_girlを使ってRSpecを書くときに設定しといた方がよいRubyMineのLive Template

# FactoryGirl
## trait
Abbreviation: `tr`
Description: `trait`
Template text

```
trait :$SYSTEM_UNDER_TEST$ do 
  $CURSOR$
end
```

## association
Abbreviation: `as`
Description: `association`
Template text

```
association :$ATTRIBUTE$, factory: :$FACTORY_NAME$
```

# RSpec
## before
Abbreviation: `bef`
Description: `before`
Template text

```
before do 
  $CURSOR$
end
```

## describe
Abbreviation: `des`
Description: `describe`
Template text

```
describe '$SYSTEM_UNDER_TEST$' do 
  $CURSOR$
end
```

## context
Abbreviation: `con`
Description: `context`
Template text

```
context '$SYSTEM_UNDER_TEST$' do 
  $CURSOR$
end
```
Vagrant共有ファイル内のRailsプロジェクトでbundle installできない

##問題

Vagrant上にRailsプロジェクトの開発環境を構築中、bundle installがどうしても上手くいかない事があった。

##解決方法

はじめはgemの依存関係だと思ったが、Vagrantの共有フォルダの設定の問題だった。
共有フォルダ内のファイルの実行権限がない事が原因だった。

Vagrantfileで以下のように設定する。

```
config.vm.synced_folder ".", "/vagrant", owner: "vagrant", mount_options: ["dmode=777", "fmode=777"]
```

もしくは、権限が共有フォルダ内のファイル全てに適用されてしまうのを避けたい場合、オプションをnfcにしても上手くいく。

```
config.vm.synced_folder ".", "/vagrant/", type: "nfs"
```
Vagrantでnfsに設定するとエラーが起きる

##問題

Vagrantfileのconfig.vm.synced_folderの設定は以下の通り。

```
config.vm.synced_folder ".", "/vagrant/", type: "nfs"
```

vagrant up または reloadしたらエラーが起きた。

```shell-session

The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

if command -v dnf; then
  dnf -y install nfs-utils nfs-utils-lib portmap
else
  yum -y install nfs-utils nfs-utils-lib portmap
fi

if test $(ps -o comm= 1) == 'systemd'; then
  /bin/systemctl restart rpcbind nfs
else
  /etc/init.d/rpcbind restart
  /etc/init.d/nfs restart
fi

Stdout from the command:

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
No package nfs-utils-lib available.
Resolving Dependencies
--> Running transaction check
---> Package nfs-utils.x86_64 1:1.3.0-0.21.el7_2.1 will be installed
--> Processing Dependency: libtirpc >= 0.2.3-1 for package: 1:nfs-utils-1.3.0-0.21.el7_2.1.x86_64

...(省略)...

Transaction check error:
  file /usr/lib/systemd/system/blk-availability.service from install of device-mapper-7:1.02.107-5.el7_2.5.x86_64 conflicts with file from package lvm2-7:2.02.105-14.el7.x86_64
  file /usr/sbin/blkdeactivate from install of device-mapper-7:1.02.107-5.el7_2.5.x86_64 conflicts with file from package lvm2-7:2.02.105-14.el7.x86_64
  file /usr/share/man/man8/blkdeactivate.8.gz from install of device-mapper-7:1.02.107-5.el7_2.5.x86_64 conflicts with file from package lvm2-7:2.02.105-14.el7.x86_64

Error Summary
-------------

Failed to issue method call: Unit rpcbind.service failed to load: No such file or directory.
Failed to issue method call: Unit nfs.service failed to load: No such file or directory.
```

##解決方法

vagrant ssh をして中に入り、以下のコマンドを打つ。

```shell-session
yum upgrade lvm2
sudo yum install nfs-utils
```

##参考記事
https://bugzilla.redhat.com/show_bug.cgi?id=1294128
C++、STLでCSVを料理する

```cpp:C++
std::ifstream ifs( "hoge.csv" );
std::string line;
while ( std::getline( ifs, line ) ) {
  std::istringstream iss( line );
  std::string newCell;
  while( std::getline( iss, newCell, ',' ) ) {
    if ( newCell.length() > 0 ) {
      // TODO : セルにデータがあるから処理
    }
  }
}
```
外側のwhileでファイルストリームから行を丸ごとstringとして取り込み、内側のwhileでその行をストリングストリームにして、カンマ単位で文字列を取り込んでいく。
CSVにありがちな、行毎に列数が違った場合にカンマだけが続く状態に対応するため、取り込んだ文字列の文字列長が0じゃない場合のみ何かをする感じで書いてみました。
Xcode7でXcode8から追加されるCivicカラーテーマを使う方法


Xcode8にはCivicという新しいカラーテーマが追加されます。
WWDC2016の会場には壁一面、Civicカラーのメッセージがありました。

![IMG_0228.JPG](https://qiita-image-store.s3.amazonaws.com/0/30441/8e17ae1c-9b50-1460-a688-3e652ea3393b.jpeg "IMG_0228.JPG")

# 前提条件
Xcode8 betaがインストール済み

# 使用方法
1) カラーテーマがあるディレクトリに移動

```sh
cd ~/Library/Developer/Xcode/UserData/FontAndColorThemes/
```

2) `Civic.xccolortheme` を `Civic.dvtcolortheme` にコピー

```sh
cp Civic.xccolortheme Civic.dvtcolortheme
```

3) Xcode7を起動し、メニューバーから `Xcode` > `Preferences` > `Fonts & Colors` で `Civic` を選択 

# まとめ
テーマをコピーするだけで簡単に使用できます。
code7での開発は少なくとも秋までは続くと思うので、一足早く試したい方はぜひ :smile:
Sublime Text / 正規表現 > 括弧("["と"]")でくくった1文字から4文字の「単位文字列」を検索 > \[.{1,4}\]

```txt:動作環境
Sublime Text 2 on Windows 7 pro
```

## やろうとしていること

csvファイル閲覧中に横幅節約のため項目の単位を削除したい。
項目の単位は`Temp[degC]`のような括弧でくくった文字列となっていて、その中は1から4文字が入る。

## 正規表現

とりあえず検索できるかどうか。

参考 http://www.megasoft.co.jp/mifes/seiki/

Sublime TextでRegular Expressionの機能をONにした状態で、以下の文字列で該当の文字がハイライトされるようになった。

```
\[.{1,4}\]
```

あとはこれを空白文字に変換すれば単位の除去ができる。
複数ファイルの一括削除コマンド

例：カレントディレクトリ内、２日前のファイルのみを削除する(ディレクトリは削除しない)
find ./* -prune -mtime +2 | awk '{print "rm -f",$1}' | sh

例：カレントディレクトリ/サブディレクトリ以下、２日以前のディレクトリ・ファイルをすべて削除する
find ./* -mtime +2 | awk '{print "rm -rf",$1}' | sh
Linuxコマンド

■Linuxコマンド
　◆ユーザー作成：
　　　　１．useradd ユーザー名
　　　　２．/usr/sbin/adduser -g users -G wheel -d /home/ユーザー名 -s /bin/tcsh ユーザー名

　◆ユーザー確認：id -a ユーザー名

　◆パスワード作成：passwd ユーザー名

　◆ユーザー削除：userdel -r ユーザー名

　◆ファイルサイズ表示：du -sh
　　　・ファイルサイズ０：
　　　　　１．cat /dev/null > 指定ファイル名
　　　　　２．cp /dev/null 指定ファイル名

　◆ファイルの文字コードの確認コマンド
　　　kcc -c ファイル名
　　　nkf --guess ファイル名

■Apache
　◆httpd -t	シンタックスチェック

■キーボード操作
　◆WIndowの移動⇒Alt+スペース、Mキー

■マシンAとマシンB間でRSA]認証を使ってログイン
　◆RSA鍵作成：ssh-keygen -t rsa
　　　　・作成されるファイル
　　　　　公開鍵：id_rsa.pub→RSA鍵を作ったサーバーへ転送する転送元サーバー
　　　　　秘密鍵：id_rsa→RSA鍵を作成したサーバーの置く

　　　　・転送コマンド
　　　　　→scp -i
便利コマンド

■vimエディタ
　　◆ファイルを指定の文字コードで開きなおす
　　　　:e ++enc=euc-jp
　　　　:e ++enc=sjis
　　　　:e ++enc=utf-8

　　◆ファイルを文字コードを指定して保存する
　　　　:set fileencoding=euc-jp
　　　　:set fileencoding=sjis
　　　　:set fileencoding=utf-8

　　◆置換
　　　　現在行のみ置換⇒　　　　　:s/[old]/[new]/
　　　　複数行の範囲で置換する　:開始行,終了行s/[old]/[new]/
　　　　ファイル全体で置換する      :%s/[old]/[new]/

　　◆マルチウィンドウ編集
　　　　1.viまたはvimでファイルを開く
　　　　2.
　　　　　:split実行で新規ウィンドウ(上下に分割)が起動(spでも実行可能)
　　　　　:vsplit実行で新規ウィンドウ(左右に分割)が起動(vsでも実行可能)
　　　　　:sview ファイル名　実行でreadonlyで分割する(svでも実行可能)
　　　　3.e filename実行で2.で開いたファイル編集が可能
　　　　キーボードのctrl + wを押すことで別ウィンドウ間の編集が可能

　　◆その他
　　　　・テキストの変更
　　　　　　1行⇒S
　　　　　　カーソル位置から単語の未尾まで⇒cw
　　　　　　カーソル位置から行末まで⇒c$
　　　　　　カーソル位置から行頭まで⇒c0

　　　　・大文字と小文字の変換
　　　　　~(チルダ)
MySQLの便利コマンド

■MySQL便利コマンド

　　◆mysqlログインにページングオプションを付ける
　　　　例：mysql --pager='less -S' -u user -ppassword -h host

　　◆ターミナル上でSQL文の編集
　　　　環境変数EDITORで設定しているエディタが起動する。
　　　　⇒editまたは\e
　　　　⇒編集後、『;』で実行

　　◆ターミナル上のSQL結果を改行させない
　　　　・SQL分のあとに\Gを付ける
　　　　例：select * from table_name\G;

　　　　・mysqlログインにページングオプションを付ける
　　　　例：mysql --pager='less -S' -uユーザー名 -pパスワード -hホスト名

　　◆MySQLのホスト名確認
　　　　select @@hostname;

　　◆SQL文のタブ区切り出力
　　　　⇒mysql -uユーザー名 -pパスワード -hホスト名 データベース名 --default-character-set=文字コード -s -e "select * from xxxxx" > xxxxx.tsv
　　　　⇒カラム名出力   ：mysql -umoriver5 -p moriver5 -e "select mail,id from user_prof" > nishizawa.txt
　　　　⇒カラム名なし　　：mysql -umoriver5 -p moriver5 -s -e "select mail,id from user_prof" > nishizawa.txt

　　◆WHERE句をつけ忘れたSQL文の実行
　　　　⇒--safe_updatesを付加してmysqlにログイン
　　　　⇒例：/usr/local/mysql/bin/mysql --safe_updates -umoriver5 -p

　　◆SQL文に実行結果を見やすく表示
　　　　⇒SQL文の後に『\G』を付加する
　　　　⇒例：select * from user_prof \G;

　　◆接続照合設定
　　　　・クライアントからサーバーへSQL文を送信する場合の文字コード
　　　　　⇒クライアントから送信されるSQLステートメントの文字コードがなんであるかサーバーに通知する。
　　　　　サーバーはcharacter_set_clientシステム変数値をそのままクライアントの送るステートメントのキャラクタセットにします。

　　　　　設定の仕方
　　　　　⇒SET NAMES 文字コード;
　　　　　⇒SET NAMES 文字コードは下記と等価です
　　　　　SET character_set_client	 = 文字コード;(クライアントからはここで設定した文字コードで送られる)
　　　　　SET character_set_results	 = 文字コード;(ここで設定した文字コードでクライアントに返送)
　　　　　SET character_set_connection = 文字コード;(クライアントから送られてきたステートメントをここで設定した文字コードで変換される)


　　　　・サーバーからクライアントへSQL文結果を送信する場合の文字コード
　　　　　⇒クライアントにSQL文結果を返信する際、サーバーが使用するべき文字コードの設定

　　　　　設定の仕方
　　　　　⇒SET CHARACTER SET 文字コード
　　　　　⇒SET CHARACTER SET 文字コードは下記と等価です
　　　　　SET character_set_client = 文字コード;
　　　　　SET character_set_results = 文字コード;
　　　　　SET collation_connection = @@collation_database;

　　◆インデックス関連
　　・インデックスの確認⇒show index from テーブル名
　　・インデックスの削除⇒alter table テーブル名 drop index インデックス名

　　◆テーブルを作成して他のテーブルからデータ抽出してインサートするSQL
　　・create table テーブル名１ select * from テーブル名２ where 条件指定;

　　◆MySQLのユーザー作成
　　・CREATE USER 'your_name'@'localhost' IDENTIFIED BY 'your_password';

　　◆MySQLのユーザー作成後、データベースの権限設定
　　・GRANT ALL PRIVILEGES ON database_name.* TO 'your_name'@'localhost';

　　◆MySQLのユーザーパスワード変更
　　・SET PASSWORD FOR ユーザ名@"ホスト名"=password('変更後のパスワード'); 

　　◆MySQLのユーザー削除
　　・DELETE FROM mysql.user WHERE user='ユーザ名';

　　◆MySQLのユーザー権限削除
　　・REVOKE ALL PRIVILEGES ON * . * FROM ユーザー名;

　　◆MySQLの権限の再読み込み
　　・FLUSH PRIVILEGES;
Google検索コマンド

■Google検索　コマンド

```
link:URL				　⇒指定したURLがどこからリンクされているのか表示
cahce:URL				　⇒URLのキャッシュを表示
related:URL				　⇒URLの関連ページを表示
info:URL				　⇒サイトに関する情報を表示
site:URL KW				　⇒対象ドメイン内の文字列を検索　複数後の指定可
allinurl　部分URL 部分URL　⇒指定した部分URLを含むURLを検索
inurl: 部分URL KW　　　　　⇒指定した部分URLを含むURLからKW検索
allintitle: KW KW		　⇒ページタイトルに含まれる文字列のみ検索
intitle:KW KW			　⇒ページタイトルまたはテキストに含まれる文字列を検索　複数後の指定可能
filetype:拡張子	KW		　⇒指定した拡張子を含むURLからKWを検索
-filetype:拡張子	KW		　⇒指定した拡張子を含まないURLのページからKWを検索　　　
allintext:KW			　⇒<body></body>間に含まれる文字列のみを検索対象にする

-KW						　⇒検索結果から除きたいKWの指定

あいまい検索：*			　⇒*を指定して検索
完全一致検索："KW"		　⇒”ダブルコーテションで囲んで検索

■電車の路線検索
　⇒乗り換え 乗車駅名 下車駅名
　⇒乗車駅名から下車駅名

```
サーバー負荷を調べる

■サーバー負荷を調べる

１．プロセスのメモリ使用量を確認
　・free -mコマンド
<A HREF="C:\Users\nishizawa.JWORD\Desktop\資料">資料</A>
　・sar -rコマンド
　・topコマンド⇒Mキーを押す

２．ロードアベレージの確認
　・topコマンド⇒Pキーを押す
　・uptimeコマンド
　・sar -qコマンド
　・sar ●秒間　▲回

３．CPU負荷とI/O負荷の確認
　・vmstat　●秒間隔　▲回
　・top
　・sar -u
　・sar -P
　・iostat
　・watch iostat（リアルタイムで見るとき）

uptimeコマンド
⇒マシンの電源を入れてから現在までの稼働時間と、システムの負荷状態を調べたい場合

vmstat
http://www.fulldigit.net/content/view/54/6/

・パフォーマンスや負荷を調査するコマンド
http://infrakeise.blog92.fc2.com/blog-entry-43.html