OmniAICreator/Qiita-1.07M huggingface dataset:
Documentsのパス取得（勘違いしてた）

ハマったので、アプリをswift化する時に同じ失敗をしない為のメモ。
共通化してるので同じ失敗はないと思うけど、念の為と、他に困っている人がいたら助けになればということで。

swiftで昔は下記で取得できていたので、

```swift
NSHomeDirectory().stringByAppendingPathComponent("Documents")
```

下記でも同じように取得できると思っていたけど挙動が違がってた。
ちなみに、swift2.0では上のメソッドは削除されているようです。
エラーになりました。

```swift
NSHomeDirectory().stringByAppendingString("Documents")
```

で、上のstringByAppendingStringを実行した時のログ。
何故か、Documentsの前にスラッシュが入っていない状態。

```
/var/mobile/Containers/Data/Application/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXDocuments/
```

Stringできちんとスラッシュ付きで指定してやると

```swift
NSHomeDirectory().stringByAppendingString("/Documents")
```

```
/var/mobile/Containers/Data/Application/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/Documents
```

マニュアル読まずにやったからハマってしまった。。。
同じ状況でハマった方いらっしゃれば、参考までに。


因みに、下記でも取得可能でした。

```swift
NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
```


どっちが良いのかはわかりません。
個人的にはstringByAppendingStringを使っています。
gulpタスクの分割


gulpで定形処理をタスク化していくと、スクリプトファイルにはすぐに肥大化します.

これを解消するのが`require-dir`. [公式サイト](https://www.npmjs.com/package/require-dir)
指定したディレクトリ以下のJSやjsonを読み込んでくれるため、gulpタスクを独立したファイルに分割することができます.

別記事の[gulpパッケージの一括ロード](http://qiita.com/dhun/items/daa207fc05c67f255c23)と併用すれば、グッとスクリプトファイルの見通しが良くなります.

---

記事を書くにあたり、動作するスクリプトファイルを編集して紹介しています.
万が一動作しない場合は、[こちら](https://bitbucket.org/dhun-h/lazy-applicant)のソースコードを参照してください.

## インストール

```shell
npm install --save-dev require-dir
```


## ファイル構成

```shell
.
+-- package.json
+-- gulpfile.js
+-- gulp/
    +-- config.js
    +-- tasks/
        +-- clean.js
        +-- copy.js
        +-- lint.js
              :
```


## gulpfile.js

gulpfile.jsで、`requireDir`を呼び出してgulp/tasks/以下のタスクを読み込ませます.

```js
var gulp = require('gulp');
var requireDir = require('require-dir');

requireDir('./gulp/tasks', {recurse: true});
```

## config.js

config.jsで、各タスク用の設定を一元管理します.

```js
var baseConfig = {
    sourceDir: 'src/'
  , publishDir: 'publish/'
};

module.exports = {
    /* 特別な定義が不要なタスクの設定 */
    simple: baseConfig,

    /* copyタスクの設定 */
    copy: {
        base: baseConfig

      , uglify: {}
      , minifyCss: {}
      , minifyHTML: {
            quotes: true
          , loose: true
      , }
      , imagemin: {
            optimizationLevel: 5
          , progressive: true
          , interlaced: true
        }
    }
};
```

## gulpタスク

gulpタスクは、機能ごとに独立したファイルにするといいと思います.

### 単純なタスク

gulpタスクから`require('../config').xxx`の形式でconfig.jsを読み込みます.
このタスクでは、`config.simple`を参照しています.

```js:clean.js
var gulp = require('gulp');
var del = require('del');
var config = require('../config').simple;

gulp.task('clean', function() {
    del.sync([config.publishDir]);
});
```

### 複雑なタスク

外部からはcopyタスクとして呼び出されることを想定しています.
copyタスクは、copy-src, copy-lib, copy-licenseの３つのサブタスクを並列実行して、サブタスクの処理終了を待ち合わせてからタスクを終了させています.

このタスクでは、`config.copy`を参照しています.
uglifyやminifyCssには、`config.copy`で定義したパラメータを与えています.

```js
var gulp = require('gulp');
var $ = require('gulp-load-plugins')();
var runSequence = require('run-sequence');
var config = require('../config').copy;


gulp.task('copy', function(callback) {
    runSequence(
        ['copy-src', 'copy-lib', 'copy-license'],
        callback
    );
});

// src without lib
gulp.task('copy-src', function() {
    return gulp.src([config.base.sourceDir + '**/*'
              ,'!' + config.base.sourceDir + '**/*-sample'
              ,'!' + config.base.sourceDir + 'lib/**'])
        .pipe($.if('*.js', $.uglify(config.uglify).on('error', $.util.log)))
        .pipe($.if('*.css', $.minifyCss(config.minifyCss).on('error', $.util.log)))
        .pipe($.if('*.png', $.cache($.imagemin(config.imagemin).on('error', $.util.log))))
        .pipe(gulp.dest(config.base.publishDir));
});

// lib
gulp.task('copy-lib', function() {
    return gulp.src(config.base.sourceDir + 'lib/**/*')
        .pipe(gulp.dest(config.base.publishDir + '/lib'));
});

// license
gulp.task('copy-license', function() {
    return gulp.src(config.base.sourceDir + '../license.txt')
        .pipe(gulp.dest(config.base.publishDir + '/'));
});
```
gulpパッケージの一括ロード


gulpで定形処理をタスク化していくと、スクリプトファイルには大量の`require`が並ぶことになります.

これを解消するのが`gulp-load-plugins`. [公式サイト](https://www.npmjs.com/package/gulp-load-plugins)
package.jsonに書かれたgulp-xxxパッケージを、一括ロードすることができます.

別記事の[gulpタスクの分割](http://qiita.com/dhun/items/c8633800097f1e7ecf70)と併用すれば、グッとスクリプトファイルの見通しが良くなります.

---

記事を書くにあたり、動作するスクリプトファイルを編集して紹介しています.
万が一動作しない場合は、[こちら](https://bitbucket.org/dhun-h/lazy-applicant)のソースコードを参照してください.

## インストール

```shell
npm install --save-dev gulp-load-plugins
```


## gulpタスク

### gulp-load-pluginsを利用しない場合

タスクで必要なパッケージをすべて`require`します.
パッケージを割り当てる変数の名前も考えなければいけません.

```js
var gulp = require('gulp');
var gulp_if = require('gulp-if');
var gulp_uglify = require('gulp-uglify');
var gulp_minify_css = require('gulp-minify-css');
var gulp_cache = require('gulp-cache');
var gulp_imagemin = require('gulp-imagemin');
var gulp_util = require('gulp-util');

gulp.task('copy', function() {
    return gulp.src(['src/**/*'
              ,'!' + 'src/**/*-sample'
              ,'!' + 'src/lib/**'])
        .pipe(gulp_if('*.js', gulp_uglify().on('error', gulp_util.log)))
        .pipe(gulp_if('*.css', gulp_minify_css().on('error', gulp_util.log)))
        .pipe(gulp_if('*.png', gulp_cache(gulp_imagemin().on('error', gulp_util.log))))
        .pipe(gulp.dest('target'));
});
```

### gulp-load-pluginsを利用する場合

package.jsonに書かれたgulp-xxxパッケージを一括ロードして、`$`に割り当てています.
require文の末尾の`()`で、gulp-load-plugins自体を評価していることに注意してください.

以降は、`$.minifyCss`のような形式でパッケージを利用できます.

デフォルト設定では、パッケージの名前から'gulp-'が削除され、残りの部分をキャメルケースにした名前で`$`に割り当てられます.
設定を変更する場合は[こちら](https://www.npmjs.com/package/gulp-load-plugins#options)を参照してください.

```js
var gulp = require('gulp');
var $ = require('gulp-load-plugins')();

gulp.task('copy', function() {
    return gulp.src(['src/**/*'
              ,'!' + 'src/**/*-sample'
              ,'!' + 'src/lib/**'])
        .pipe($.if('*.js', $.uglify().on('error', $.util.log)))
        .pipe($.if('*.css', $.minifyCss().on('error', $.util.log)))
        .pipe($.if('*.png', $.cache($.imagemin().on('error', $.util.log))))
        .pipe(gulp.dest('target'));
});
```
Node.jsでサーバを作るときに気をつけること

仕事でNode.jsを使ってます。サーバーでも使ってますし、Androidのモニタリングにも使っていたりします。

今回はサーバーの話。今更な感じもありますが、一応書いておきます。

## Node.jsは早いの？遅いの？

単純作業で言えば早いです。「データベースから値を取ってきて、テンプレートに埋め込んで、HTMLを返す」みたいな単純作業は早いです。

でもそのHTMLから&lt;img&gt;タグがサーバを指していて、画像を返す処理もNode.jsにやらせると、どんどん遅くなっていきます。
画像やJavaScriptなど静的なファイルは別サーバにやらせて、Node.jsのサーバではプログラム的なことだけをやらせるようにすると上手くいきます。

仕事では、ウェブサイトはNode.js、静的なファイルはGoogle Cloud Storageにやらせてます。

以前に、2,000アクセス/秒のHTTPクエリをNode.jsに送ったら、何の問題もなくクリアしてました。
Apacheに同じことをしたら、レスポンスが遅いこと・・・。


## Node.jsはシングルスレッド

Node.jsとApacheの最大の違いは、シングルスレッドで動くか、マルチスレッドで動くか、です。
Node.jsは「シングルスレッド」な分だけ、「コードが動く一瞬だけCPUを100%使用でき」ます。
Apacheの場合はマルチスレッドなので、ページアクセスがあるごとにスレッドを作って、みんな平等にCPUを割り当てて、処理をしていきます。

※あくまで概念の説明なので、細かいところは違います。

その分、Node.jsではある一つのコードが長々と処理をすると、待ち行列が発生します。
それを防ぐために、async.jsやPromiseを使うわけです。

つまりNode.jsでは「コードを小さい単位」で動かすのが吉。

## シングルスレッド故に・・・

Node.jsのプログラムは「一筆書き」と思ってください。
プログラム全体がつながっているので、一箇所でエラーが発生すると、プログラム全体が死亡します。

それはあなたのコードではなくて、使っているモジュールの中で発生することも、よくあります。

なのでNode.jsでサーバを作るときは、プログラム全体が死亡してもすぐに立ち上がるようにする、ことが重要です。
foreverモジュールとか使ってしまえば簡単です。

## 後でいいことは後でやる

待ち行列を防ぐために、レスポンスとして返さなければいけないデータの生成に注力して、その他の作業は後回しにします。

例えば「BigQueryにログデータをStream APIを使って挿入する」みたいな後回しでいいことは、Redisデータベースを使って、一旦キャッシュを作っておき、別にプログラムを作って、crontaskなどを使ってあとから処理するようにします。

## GCって効いているのか

最新版はどうなのかわかりませんが、少なくともv0.1x系はデフォルトでは有効ではないです。
有効にするには、`node --expose-gc myapp.js` みたいな感じで動かします。
で、こんな感じでメモリ解放しています。

```js
if ("gc" in global) {
  setInterval(function() {
    global.gc();
  }, 5 * 1000);
}
```

foreverコマンドのときは、`forever start -c "node --expose-gc" myapp.js`です。

## 1日1回くらいリスタートさせる

ずーっとNode.jsのプログラムを動かしておくと、2,3週間くらいすると、なんか調子が悪くなります。
プログラムをリスタートさせると、直ります。きっとメモリでしょうね。
なので、私のところは1日1回、明け方にリブートさせています。

---

いまのところ、こんな感じで問題はありません。誰かの参考になればと思って、書いてみました。
hubコマンドをインストールしました。

Githubを使っているならhubコマンドをいれたほうがいいらしいのでいれました。環境はMacです。

# hubコマンドをインストール

```bash:
brew install hub
```

# バージョンを確認
インストールされたのでバージョンを確認します

```bash:
hub version

git version 2.3.5
hub version 2.2.1
```

# 参考
https://github.com/github/hub
1つのキーバインドで、同時に複数のコマンドを実行する

keymap.cson にキーバインドを登録できるが、複数登録されている場合、別のキーバインドを上書きする動作になり、複数コマンドを実行することができない。

この場合の対処は、公式によると、init.coffeeに新しく複数コマンドを実行するコマンドを作って、そのコマンドを登録するとのこと。

https://atom.io/docs/v1.0.15/behind-atom-keymaps-in-depth#composed-commands

自分は、cmd-sで、保存とvim-modeのinsertモードを抜けるコマンドが欲しかったので、```custom:save-and-normalmode```のコマンドを追加した。

```coffeescript:init.coffee
atom.commands.add 'atom-text-editor.vim-mode', 'custom:save-and-normalmode', ->
  view = atom.views.getView atom.workspace.getActiveTextEditor()
  atom.commands.dispatch view, 'core:save'
  atom.commands.dispatch view, 'vim-mode:reset-normal-mode'
```

これをキーバインドに追加する。

```coffeescript:keymap.cson
# 保存時にノーマルモードに戻る
'atom-text-editor.vim-mode':
  'cmd-s': 'custom:save-and-normalmode'
```

なお、init.coffeeはAtomを再起動しないと有効にならない。

これを簡単にできるプラグインとかできないかな。
source tree > コミット時のスペル自動補正を切る

```txt:動作確認
MacOS X 10.8.5
SourceTree 2.0.5.2
```

SourceTreeでコミットする時、コミットメッセージをスペルチェックして勝手に補正してしまう。この機能は便利な時もあるが、補正しないでほしい時もある。

補正の切り方は以下を参考にした。

https://answers.atlassian.com/questions/58370/how-to-disable-spelling-correction-in-sourcetree-commit-messages

コミットメッセージ上で右クリックしたらスペル補正のメニューが出てくる。「スペルを自動的に修正」にチェックがついていれば、これを選択してチェックをはずせばいい。

![spellCheck.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/731c38d7-855f-c7b7-de0a-4d5e3e24f6ec.jpeg)
あなたのXCode大丈夫？

Appleから通知が送られている通り、汚染されたXCode(XCode Ghost)によってマルウェアを埋め込まれたアプリがApp Storeで多数見つかったようです。念のため、各自でXCodeが適切なバージョンが検証した方が良いと思います。

関連記事
http://japanese.engadget.com/2015/09/20/app-store-xcodeghost/
https://developer.apple.com/news/?id=09222015a

検証用コマンド
実行には数分かかるので、気長に待ってください。

```text
spctl --assess --verbose /Applications/Xcode.app
```

App Storeからダウンロードした場合

```text
/Applications/Xcode.app: accepted
source=Mac App Store
```

Apple開発者サイトからダウンロードした場合

```text
/Applications/Xcode.app: accepted
source=Apple
```

```text
/Applications/Xcode.app: accepted
source=Apple System
```

結果がacceptedにならない場合には、XCodeを再ダウンロードしてプロジェクトをビルドしなおしてください。

ただし、古いXCodeについては、この方法では検証できないようです。詳しくはコメント欄参照。
テキストファイルを対象に検索する。

テキストファイルだけを対象に文字列を検索するbashの関数。
ソース・ファイル(拡張子がc, h, S)を対象に検索する関数を実装していたが([linux(カーネル)ソース解析：システムコール呼び出し](http://qiita.com/kou_tana77/items/aff8b0a3f24a217fa4fe))、ファイルの名前に依らず、テキストファイルを対象に検索する場合が結構あったので、こちらも作ってみた。

```bash:.bashrc
function stxt() {
        find . | perl -nl -e 'print if -f && -T' | xargs -I{} grep $1 {} /dev/null
}
```

perlのところが少し分かり難いので説明すると、
・eオプションで実行する１行のスクリプトを指定。
　(複数行指定したい場合はeオプションを繋げれば良いらしい)
・nオプションで、標準入力からの入力に対して、ループでeオプションで指定したスクリプトを実行。
　(`while (<>) {`と`}`で括ったのと同じような感じで動く)
・lオプションで、標準入力からの読み込み内容から改行を取り除く。
　(改行コードがあると、` if -f && -T`のところでファイル名が認識されない)

上記により、findコマンドが出力したファイル名のリストから、テキストファイルだけをperlで抜き出すように動くようになる。

上記のperlの内容を、スクリプト(whileを使った形)で書くと、次のように書ける。

```pl:tfil.pl
#!/usr/bin/perl

while (<>) {
        print if -f ($_ =~ s/[\n\r]//gr) && -T ($_ =~ s/[\n\r]//gr);
}
```

`($_ =~ s/[\n\r]//gr)`の部分は、非破壊置換。(rが非破壊の指定)

tfil.plの実行パスを通して、tfil.pl使うように、stxtを修正すると、次のようになる。

```bash:.bashrc
function stxt() {
        find . | tfil.pl | xargs -I{} grep $1 {} /dev/null
}
```
実際には上記のような修正はしないが、`perl -nl -e 'print if -f && -T'`が多少はイメージしやすくなるかと思って、ちょっと強引に実装してみました。

Cのソースを読んだりする時に、Makefileや、拡張子がc, h, S以外のファイルをincludeしている場合や、vimとかコマンドの環境を調べたりする時などに、テキストファイルを対象にした検索は役に立つ。
ステレオファイルの中央にある音を消す

##音の定位
![図-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/93396/75cf6ea3-fb5f-59ed-fdfd-4e6429cada34.jpeg)
　ポップスはこんな感じの音の配置。
　ビートルズの音源を聴くと、ギターやドラムが完全に左右に分かれてミックスされているけど、現代のポップスは、ちょっと左、ちょっと右などにミックスされている。ボーカル、ベース、バスドラムはセンターにあることが多い。
　ステレオファイルの片方のチャンネルともう片方のチャンネルを合成すれば、この真ん中に存在する音を消すことができ、擬似カラオケトラックを作れる。

##波形を消す
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/93396/07b38675-59e4-c5e2-1a9e-b9150be2acdf.jpeg)
　ある波形に、その逆位相の波形を足すと0になる。つまり、どんなサンプルでも、同じ位置で逆位相をぶつければ音が消える。
![図-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/93396/35dfc225-7706-5d3c-8e54-9a64f9cd73cd.jpeg)
　左右のチャンネルをそれぞれ聞くと、センターにある音はどちらのチャンネルにも入っていることが分かる。どちらかに寄っている音は、そちらのチャンネルで聞くほうが大きく聞こえる。
　例えば右のチャンネルを逆相にして、左のチャンネルに足すと、同じ波形を持っているVocalとBass Drumは消えて、KeyとGuitarが残る。
![図-4.jpg](https://qiita-image-store.s3.amazonaws.com/0/93396/9425813b-9a3d-a00c-3db4-51ddf3678956.jpeg)
　ただし、Guitarは逆相の音になる。

##Maxで作る
![スクリーンショット 2015-09-23 7.14.40.png](https://qiita-image-store.s3.amazonaws.com/0/93396/71fb9204-ef1c-7eea-24b7-4ee7c9af6b6d.png)
　まずは[buffer~]を置いて、適当に歌ものの曲を入れる。[play~]はアーギュメントに２を入れてステレオで再生できるようにしておく。Toggleをオンにすれば再生される。

![スクリーンショット 2015-09-23 7.16.54.png](https://qiita-image-store.s3.amazonaws.com/0/93396/1cd367d3-c5fc-57c8-aadb-e701ac066a93.png)
　次にRチャンネルの信号を[*~ -1.]で逆相にする。-1を乗算すれば、1は-1に、-1は1になるので単純に波形がひっくり返る。
　それを左チャンネルの信号と[+~]で足してあげると、真ん中に存在する音が消される。
　こうすることで真ん中にある音が消えた音源ができる。
VagrantのCentOSでPostgreSQLをRailsで使えるようにする

Ruby on Railsで開発したアプリをHerokuに乗せることを想定して，あらかじめPostgreSQLで開発するよう色々設定した話．

前提として，Vagrant上のCentOSには，既にRailsの環境が構築できているものとする．

| app        | version |
|:-----------|--------:|
| CentOS     |     6.4 |
| Rails      |   4.2.4 |
| PostgreSQL |   9.3.1 |
**ひとまず動くようにしたかったので，参考にしたサイトに合わせたバーションを使用している．最新のものを使っていない場合がある．**

参考：
[RubyonRailsでsqliteでなくてPostgresqlを使う時](http://www.workabroad.jp/posts/1079)

# Postgresqlをインストール

```yum install postgresql```をするとバージョンが古いそうなので，以下の手順でインストールを行う．

まず，wgetでパッケージを取得．

```
wget http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-centos93-9.3-1.noarch.rpm
```

取得したパッケージをインストール．

```
sudo rpm -ivh pgdg-centos93-9.3-1.noarch.rpm
```

PostgreSQL9.3のインストール．
**多分最新ではない**

```
sudo yum install postgresql93
sudo yum install postgresql93-devel
sudo yum install postgresql93-server
```

バージョンを確認する．

```
psql --version
```

PostgreSQLの初期化を行い，完了したら起動．

```
sudo service postgresql-9.3 initdb
sudo /etc/rc.d/init.d/postgresql-9.3 start
```

自分は省略したが，サーバー起動時にPostgreSQLが常に起動するようchkconfigで設定する方法もある．
[RubyonRailsでsqliteでなくてPostgresqlを使う時](http://www.workabroad.jp/posts/1079)

PostgreSQLのデフォルトユーザ(こういう呼び方なのかよくわからないけど，最初から使えるユーザ)はpostgresらしいので，このユーザでPostgreSQLに入る．

```
sudo -u postgres psql
```

まずはpostgresユーザのパスワードを設定．

```
\password
```

この後パスワードを入力する．
次に，ユーザを追加．

```
create user <test_user> with password '<test_pass>';
```

PostgreSQLから出る．

```
\q
```

# Railsアプリを新規作成

-d postgresql のオプションを付けると使用するDBを指定することができる．

```
rails new <test_app> -d postgresql
```

もし```pg```というPostgreSQLへのRubyインターフェースgemをインストールしていないとエラーが出るらしい．
**自分は以前に色々いじっていて既にインストール済みであったのでエラーが出なかったため，もしエラーが出たらどうにかしてインストールしてほしい．[RubyonRailsでsqliteでなくてPostgresqlを使う時](http://www.workabroad.jp/posts/1079)にも一応記載があるのと，私でもインストールできたのでググればなにか出るはず．**

# PostgreSQLの設定ファイル編集

## pg_hba.confを編集

```
sudo vi /var/lib/pgsql/9.3/data/pg_hba.conf
```

最下部に下記を追加．

```
local   all    all         md5
```

## postgresql.confを編集

```
sudo vim /var/lib/pgsql/9.3/data/postgresql.conf
```

```
#listen_addresses = 'localhost'
↓
listen_addresses = '*'
```


## PostgreSQLを再起動

```
sudo /etc/rc.d/init.d/postgresql-9.3 restart
```

# database.ymlの設定

rails newした<test_app>のdatabase.ymlを開く．

```
cd <test_app>
vim config/database.yml
```

先ほどPostgreSQLに入って新規に作成したusernameとpasswordを追加．

```
username: <test_user>
password: <test_pass>
```

この時，```database```という項目を見ると，```<test_app>_development```と設定されていると思うので，この名前を覚えておく．

# DBの作成

先ほど名前を覚えた```<test_app>_development```を作成する．
再びPostgreSQLに入る．

```
psql -U postgres
```

以下のSQL文を実行．

```
create database <test_app>_development owner <test_user>;
```

最後に```rails s -b 0.0.0.0```でサーバを起動して，Vagrantに設定しているアドレスに接続すると，いつもの見慣れたRailsのWelcome画面が出るはず．
CentOS 7 で overlayfs を使う手順

# はじめに
CentOS 7 で overlayfs を使ってみたので、その際の手順をまとめておきます。
なお、環境は AWS EC2 上の CentOS 7 です。

overlayfs は Linux Kernel 3.18 からマージされています。現時点の CentOS 7 のカーネルは 3.10 なので、まずはカーネルのアップデートから行います。


# CentOS 7 に最新カーネルをインストールする
最新カーネルは [ELRepo](http://elrepo.org/) というリポジトリからインストールします。ELRepo は主に最新のドライバが公開されているリポジトリです。


(1) リポジトリのインストール

```bash
$ sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
$ sudo rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
```
(2) カーネルのインストール

```bash
$ sudo yum --enablerepo=elrepo-kernel install kernel-ml
```
(3) grub の設定

grub.conf に書かれている起動エントリーを確認。

```bash
$ awk -F\' '$1=="menuentry " {print $2}' /boot/grub2/grub.cfg
CentOS Linux (4.2.1-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux, with Linux 3.10.0-123.8.1.el7.x86_64
CentOS Linux, with Linux 0-rescue-f9afeb75a5a382dce8269887a67fbf58
```

この場合は、先頭のエントリ(0番目のエントリ)から起動したいので、以下のように実行して再起動。

```bash
$ sudo grub2-set-default 0
$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
$ sudo reboot
```

(4) カーネルバージョンの確認
再起動後、ログインしてカーネルバージョンを確認。

```bash
$ uname -r
4.2.1-1.el7.elrepo.x86_64
```

# overlayfs を使う
overlayfs は Union Filesystem の１つで、複数のディレクトリツリーを重ねて１つのディレクトリツリーとして見せることができます。この辺りはいろんなサイトに情報が載っているので、以下では設定手順だけ記載します。

```bash
# overlayfs 用のディレクトリを作成
$ mkdir lower upper work merged

# lower と upper ディレクトリにファイルを作成
$ echo "111" > lower/file1
$ echo "222" > upper/file2

# マウント(lower と upper ディレクトリを重ね合わせたものを merged ディレクトリで見せる)
$ sudo mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work overlay merged

# 重ね合わされたディレクトリの中身を確認
$ ls merged/
file1  file2
```

# 参考サイト
http://linoxide.com/how-tos/install-linux-kernel-4-0-elrepo-source/
http://wiki.mikejung.biz/CentOS_7
http://gihyo.jp/admin/serial/01/linux_containers/0018
技術英語 > a number of: たくさんの / the number of: の数

引用: 冠詞マスター教本 by 石井隆之さん

> a number of ... (たくさんの...)
> the number of ... (...の数)
> (c) A number of cars were zooming by. (多くの車がそばを猛スピードで通り過ぎた)
> (d) The number of the cars was large. (その車の数は多かった)
> つまり、a number of...の場合は複数動詞で受け、the number of...の場合は単数動詞で受けるのです。

<hr>
関連して思い出したのは

the number of times (回数)

http://ejje.weblio.jp/content/the+number+of+times
によると、単純に times でもいいようだ。

ただ、変数名を times にすると違う意味(時刻)にとってしまう人もいるかもしれない。
Upload a file to Dropbox



Here is a sample code.

Please install Dropbox module from here. https://github.com/dropbox/dropbox-sdk-python

```python
import sys
import os
import argparse

import dropbox
from dropbox.files import WriteMode
from dropbox.exceptions import ApiError

# Add OAuth2 access token here.
# You can generate one for yourself in the App Console.
# See <https://blogs.dropbox.com/developers/2014/05/generate-an-access-token-for-your-own-account/>
TOKEN = os.environ['DBTOKEN']


# Uploads contents of local_file to Dropbox
def backup(local_file, backup_path):
    with open(local_file, 'rb') as f:
        # We use WriteMode=overwrite to make sure that the settings in the file
        # are changed on upload
        try:
            dbx.files_upload(f, backup_path, mode=WriteMode('overwrite'))
        except ApiError as err:
            # This checks for the specific error where a user doesn't have
            # enough Dropbox space quota to upload this file
            if (err.error.is_path() and
                    err.error.get_path().error.is_insufficient_space()):
                sys.exit("Cannot back up; insufficient space.")
            elif err.user_message_text:
                print(err.user_message_text)
                sys.exit()
            else:
                print(err)
                sys.exit()

parser = argparse.ArgumentParser(description='Upload a file to Dropbox')
parser.add_argument('--file', '-f', help='file path')
parser.add_argument('--dbpath', '-d', help='dropbox path')

if __name__ == '__main__':
    # Create an instance of a Dropbox class, which can make requests to the API.
    dbx = dropbox.Dropbox(TOKEN)
    args = parser.parse_args()
    if not args.file:
        print("Please specify the file" +
                "Usage: uploadb.py -f file/path -d dropbox/path")
        exit(1)
    local_file = args.file
    if not args.dbpath:
        dbpath = '/' + local_file
    else:
        dbpath = args.dbpath

    # Create a backup of the current settings file
    backup(local_file, dbpath)
```

Motivation


Somehow scp and sftcp are sooo slow.(I am in country side of France now) But http access is fine, though it is not so fast. I guess there are some listriction for specific port. I want get a file from my server in Japan, which I can ssh to. I upload a file to dropbox and download it to my machine.
activator run を実行すると UnsupportedClassVersionError

# 環境
+ OS (Windows 7 Professional 32bit版)
+ Java (1.7.0_75) ※途中で変更(1.8.0_60)
+ Scala (2.11.7)
+ PlayFramework (2.4.3)
+ activator (1.3.6)

# 操作

+ Scalaの勉強をするため、PlayFrameworkでWebアプリを作成します。

    下記コマンドを実行。(パスは任意)

    ```
    cd C:\app\
    activator new HelloPlay
    cd HelloPlay
    activator run
    ```

# エラー

+ 各種 jar ファイルが自動でダウンロードされた後、下記エラーが発生。

    ```
java.lang.UnsupportedClassVersionError: com/typesafe/config/ConfigException : Unsupported major.minor version 52.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
　　　　：
　　　(省略)
　　　　：
[error] java.lang.UnsupportedClassVersionError: com/typesafe/config/ConfigException : Unsupported major.minor version 52.0
[error] Use 'last' for the full log.
Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore?
    ```

# 対応

+ JavaのバージョンとPlayFrameworkのバージョンが合っていないことが原因でした。

    Javaを7から8へ上げることにしました。

    下記ページでライセンスに同意後「Accept License Agreement」にチェックし、自分のPC環境に合ったインストーラーをダウンロード。(僕の環境では「Windows x86」)

　　<a href="http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html" target="_blank">Javaダウンロードページ</a>

　　ダウンロードしたexeファイルを実行し、適当な場所へインストール。

　　環境変数PathとJAVA_HOMEをJava7のパスからJava8のパスに変更。

　　<font color="red">他にJavaベースのアプリがある場合は、影響がないことを確認してから変更して下さい。</font>
　　
　　(上記の環境変数については<a href="http://www.javadrive.jp/install/jdk/index4.html" target="_blank">こちらのページ</a>に詳細があります)

　　コマンドプロンプトを立ち上げ直し、再度「操作」の内容を行うと
　　5分程で下記が表示され、、

    --- (Running the application, auto-reloading is enabled) ---
    [info] p.c.s.NettyServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

　　ブラウザで http://localhost:9000/ にアクセスするとサンプルが表示されました。

# その他

　<a href="https://www.playframework.com/download" target="_blank">PlayFrameworkのボタン</a>に「JDK8+」って書いてある。。 orz

# 参考にしたページ
+ <a href="http://stackoverflow.com/questions/31069320/unsupportedclassversionerror-on-running-play-application-with-jdk-1-7" target="_blank">【stackoverflowの投稿】UnsupportedClassVersionError on running play application with JDK 1.7</a>
+ <a href="http://libro.tuyano.com/index3?id=1044006" target="_blank">Play Framework環境設定</a>
技術英語 > laptop computer

**laptop computer** [名] ノートパソコン （単にlaptopでも「ノートパソコン」の意味）

ノートパソコンにもっとも近い表現である notebook computer は和製英語ですが、一部の辞書には「ノートパソコン」として載っています（研究社新英和中辞典、Oxford Advanced Learner's Dictionaryなど）。

裏をとるために、主要PCメーカーや販売店をいくつか（Dell、HP、Lenovo、Best Buy、Amazon）チェックしたところ、Computer製品の分類名としては各社ともlaptopを使っており、notebookという表現はありませんでした。Google検索にて.eduドメインだけを対象に "laptop computer" と "notebook computer" のヒット件数を比較すると、124,000対23,700。notebookが通じないわけではなさそうです。

#関連情報

**英語講師 相澤俊幸ブログ**より [notebook computer?](http://toshiaizawa.com/2015/09/notebook-and-laptop/)
javascriptもしくはcoffeescriptとして実行されるコード

一つのファイルをJavaScriptとして、もしくはCoffeeScriptとして、どちらとしても実行できるコードの例です。

`cat jscoffee`

```node
///  ###
console.log("node");
/*###///
console.log "coffee"
#     */
```

実行結果:

```shell-session
% node jscoffee
node
% coffee jscoffee
coffee
```
Sass(Scss)でCSSを書いてみよう

#1.Sass(Scss)とは？
サイト制作する際に、HTMLが複雑になってきてcssのコードがちらばったり
同じスタイルコードを使いまわすのに別のコードをコピペするなどあるとおもいます。

このようなCSSを使う上で面倒になりがちな部分を、プログラム的に置き換えて無駄を排除しようと考えられたのがSassです。

今回はこのSassについて紹介したいと思います。

#2.環境構築
Sassを使えるようにするために、まずRubyをインストールします。

<a href="http://rubyinstaller.org/downloads/">ダウンロード先：RubyInstaller</a> 

↑のページからインストーラをダウンロードして、
<b>「Rubyの実行ファイルへ環境PATHを設定する」</b>にチェックをしてインストールを行います。


Rubyのインストールが完了したら、次にSassをインストールします。
↓　Sassのインストール手順は以下になります。

```text:Sassインストール手順
1.コマンドプロンプトを起動
2.gem install sassと入力する
3.しばらく待機するとインストール完了
```

![1.Sass_Install.png](https://qiita-image-store.s3.amazonaws.com/0/54858/08613eba-1d58-3ac1-ca13-ef723bb076fc.png)

続いて
<a href="http://koala-app.com/">ダウンロード先:Koala</a>
↑のページからSassで書いたファイルをCSSにコンパイルするソフトをダウンロードし
インストールを行います。以上で環境構築は終了なので次は実際にソフトをつかって

#3.Sass(Scss)を書いてみる

KoalaでSass(Scss)を書く手順を説明します。

1.テキストエディタで、任意のフォルダに.scssファイルを作成します。
2.　作成した.scssファイルにScss形式でcssを記述します。
3. .scssファイルを含んだフォルダをKoalaにドラッグ＆ドロップすると.cssファイルにコンパイルされます。

![2.Koala_Drag&Drop.png](https://qiita-image-store.s3.amazonaws.com/0/54858/5b3ec5bd-9473-cd9a-2997-e4dee9957102.png)

.scssの緑のファイルアイコンをクリックすると画面右にオプションメニューが現れ
書き出し方法を指定することも可能です。


```text:各オプションの説明
・dynamic compilation：動的コンパイルを行う
・compass ・・・ フレームワークcompassを使用するか
・line comments ・・・書き出す際にSassの行数コメントをいれるか
・debug info ・・・　デバッグ用タグ@media -sass-debug-infoをいれる
・unix newlines ・・・unixの改行コードにするか
・output style ・・・書き出しスタイルが指定
```
各書き出しスタイルの表示サンプル

```text:①　nestedを使った場合
#main {
  color: #fff;
  background-color: #000; }
  #main p {
    width: 10em; }
.content{
  font-size: 10em;
  font-weight: bold;
  text-decoration: underline; }
```

```text:②　expandedを使った場合
#main {
  color: #fff;
  background-color: #000;
}
#main p {
  width: 10em;
}
.content{
  font-size: 10em;
  font-weight: bold;
  text-decoration: underline;
}
```

```text:③　compactを使った場合
#main { color: #fff; background-color: #000; }
#main p { width: 10em; }
.huge { font-size: 10em; font-weight: bold; text-decoration: underline; }
```

```text:④　compressedを使った場合
#main{color:#fff;background-color:#000}#main p{width:10em}.huge{font-size:10em;font-weight:bold;text-decoration:underline}
```

環境が整ったので.Sassの構文を少し紹介

①Sassでは変数が利用可能

Sassでは変数を利用できる。よく利用する値をあらかじめ変数化しておき、それを自由に呼び出して利用できる。
変数は、「$」の後に定義できます

```text:変数の例
$width:500px;
$color:#aa443f;
#maincontainer{
	width:$width;
	color:$color;
}
```
②SassではCSSの継承はネストを用いて簡潔に記述できる。

```text:ネストの例
#main{
	background-color:#000;
	.content{
		background-color:#aaa;
		color:#000;
		.sidebar{
			padding:10px;
		}
	}
}

↓（コンパイル結果）

#main {
  background-color: black;
}
#main .content {
  background-color: #aaaaaa;
  color: black;
}
#main .content .sidebar {
  padding: 10px;
}
```

その他のSassの書き方は色々なサイトに載っているのでぜひ使ってみてはどうでしょう！
だいぶcssがすっきりして見やすくなりますしおすすめです。
アプリのArchiveでipaが作れなくて焦ったメモ


久しぶりにアプリをアップデートしようとアプリをArchiveして開いたOrganizerを見てびっくり。

できたArchiveは`iOS Apps`の欄ではなくて`Other Items`の欄にできてるし、`Submit to App Store...`はDisabled。当然`Export...`ボタンを押してもipaはできず。。。

そもそもTypeが`ipa(iOS App Archive)`じゃなくて`Generic Xcode Archive`になっている！？

![cannot-_archive.png](https://qiita-image-store.s3.amazonaws.com/0/8868/941e1bbb-9687-6989-3217-fa2c5a5d46d4.png "cannot-_archive.png")

困ったときはStack Overflow先生〜

http://stackoverflow.com/a/11787283/4294279

確認ポイントは２つ

- `Build Settings`のthird-partyライブラリのtargetの`Skip Install`が`Yes`になっていること

うん、Yes。
![skip-install.png](https://qiita-image-store.s3.amazonaws.com/0/8868/24d47a16-6ee5-0519-e644-da238d85fead.png "skip-install.png")


- `Build Phases`のthird-partyライブラリのtargetの`Headers`にheaderがないこと

あったー
![third-party-lib-header.png](https://qiita-image-store.s3.amazonaws.com/0/8868/4004b3c2-e3bd-dfa9-e757-622ed843049b.png "third-party-lib-header.png")

この２つのheaderをここから消したら無事、ipaをArchiveできるようになりました。

### 原因？

CocoaPodsで`pod update`したら余計ところにHeaderが追加されてしまったことが原因っぽいですが、どなたか根本的な原因をご存知でしょうか？

ちなみにCocoaPodsのバージョンは`0.38.2`と`0.39.0.beta.4`で試しました。
今回は`SGNavigationProgress`でしたが他のライブラリでも同様の状態になってしまいます

header消せばいいのはわかったけどアップデートするた度にやるのは...(´･ω･`)
ContentBlockアプリの作成方法(とりあえず）

とりあえず流行りなのでどうやって作るのか調べてみた。
作り方自体はキーボードと同じで簡単で作ったとはコードではなくて設定のJSONを頑張るらしい。
そっちについてはまだ勉強できてないけどとりあえずアプリ自体の作り方はわかったのでまとめます。

①通常通り「Single View Application」でアプリを作成する。![スクリーンショット_2015-09-23_2_03_46.png](https://qiita-image-store.s3.amazonaws.com/0/9256/b77a1894-0517-d10b-da5b-9010eed15911.png)
![スクリーンショット_2015-09-23_2_03_58.png](https://qiita-image-store.s3.amazonaws.com/0/9256/9dda6e7d-2660-f717-d0da-329547f21ae4.png)

②「File」→「New」→「Target」をクリック![スクリーンショット_2015-09-23_2_05_09.png](https://qiita-image-store.s3.amazonaws.com/0/9256/db9cbe8d-0137-a2aa-ff71-8013cfef9f29.png)

③「Content Blocker Extension」を選択（※こんなにExtension機能あるんですね。。。。
![スクリーンショット_2015-09-23_2_05_21.png](https://qiita-image-store.s3.amazonaws.com/0/9256/0692a9cd-b21a-e88e-bf83-f64ffb8131a9.png)
適当な名前を付けて、なんか聞かれるので「Cancel」

これだけ！
これで
③で付けた名前でディレクトリができてるのでその中に「blockerList.json」ってファイルができてるのでそれがフィルターの設定ファイルです。
書き方についてはこれから勉強予定

アプリを実行してから端末方で
「設定」アプリを起動して
「Safari」→「コンテンツブロッカー」でアプリが表示してるはずなのでスイッチをONに変更する。
これで初期設定の「webkit.org/images/icon-gold.png」がみなくなってるはずです。
直接開く場合は１回め見れるけど２回目ブランクになるみたいとりあえず適当に埋め込んだだけのhtmlを[ここ](http://hapinaru.com/block.html)に用意してみました。
画像が見えなくなるはずです。


[こちら](https://www.hackingwithswift.com/safari-content-blocking-ios9)を参考にしました。

Objective-c,Swiftは関係ないです。
なんかAppleの規約とかに対して悪いことしてたらわからんのでコメントください。
audiolyzRでirisの音を聴く

[Rでお遊び:あなたのデータはどんな音？](http://www.karada-good.net/analyticsr/r-243/)という記事で
データを可聴化出来るaudiolyzRというパッケージを知ったので
みんな大好きirisの音を聞いてみました。

まずはパッケージのインストールと読み込み

```
> install.packages("audiolyzR")
> library("audiolyzR")
```

audioSplomという関数で散布図を作成してみます。

```
> audioSplom(data=iris[,1:4])
```

これで別ウィンドウが立ち上がり、各変数間の散布図の音が聞けます。

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/41356/1921694d-b456-3e4e-9803-d0b2baed099e.png)

左上の「Select an audioPlot」でどの散布図の音を聞くか選択。

また、右下の「Chord Qualities」でメジャー調、マイナー調など音の雰囲気を選べたり、
その下の「Starting note」で音の高さを選べたり。

bpmやループの間隔なども選べるので、一つの散布図でも色々な音が聞けました。
iris、君はこんな音色をしていたんだね。

また、audioHist関数を使うことで各変数のヒストグラムの音も聞けます。

```
> audioHist(iris$Sepal.Length,name="hist_music")
```

![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/41356/1430954b-d1dd-2d9a-8e87-71cff1068a92.png)

ん～アンビエント
[iOS9] カスタムURLスキームで起動に失敗する(呼び出し元)

カスタムURLスキームでアプリを起動する際にハマったのでメモ

##前提・状況

- iOS8では問題なく起動できている
- アプリがインストールされていない場合はAppStoreに移動する
- iOS9にアップデートしたらカスタムURLスキームで起動していたアプリが起動できなくなった
- アプリ側で[iOS9でカスタムURLスキームの遷移に失敗するときの注意点](http://qiita.com/Night___/items/60355d21951cffbef51b)を参考に、対応は済んでいるか確認
    - →対応済み。起動用サンプルHTMLからは問題なく起動できる。

##現象、原因・対策

0. そもそも起動しない
    - 原因
        - 起動用サンプルHTMLのリンクをそのまま本番用ページに貼り付けても反応しない
        - FRAMESETで読み込まれるページから呼び出していたことが原因
        - まだ試していないがおそらくiframeもダメではないかと
    - 対策
        - 起動ページ自体を別のタブで開いておくように変更

0. アプリがインストールされていてもAppStoreに移動してしまう
    - 原因
        - アプリ起動ボタン押下後、300ms経過した場合AppStoreに移動するようにしていた
        - iOS9からアプリを開く際にダイアログが表示されるようになった
        - アプリがインストールされていても、人間の操作が間に合わないためAppStoreに移動してしまう
    - 対策
        - ひとまず自動でAppStoreに移動する処理は無効化
        - 予めアプリをダウンロードしておく旨を記載し、別のボタンでAppStoreへ誘導する
SoftEther VPN Serverの5555ポートを閉じると管理できなくなる

##環境
Windows・SoftEther VPN Server

##現象
SoftEther VPN Serverのデフォルトの管理ポートの5555ポートを閉じると、「SoftEther VPN サーバー管理マネージャ」からサーバへ入ることができなくなります。普通にサービスを動かしていても、ポートが開いていないと下記のようにマネージャから返ってきます。

>
サーバーへの接続が失敗しました。ネットワーク接続や、接続先サーバーのアドレスやポート番号を確認してください。

その場合、「C:\Program Files\SoftEther VPN Server\vpn_server.config」を書き換えることで、5555ポートを開けられます。

###変更前

```
declare root
{
-省略-
declare ListenerList
	{
-省略-
		declare Listener3
		{
			bool DisableDos false
			bool Enabled false
			uint Port 5555
		}
	}
-省略-
}
```

###変更後

```
declare root
{
-省略-
declare ListenerList
	{
-省略-
		declare Listener3
		{
			bool DisableDos false
			bool Enabled true
			uint Port 5555
		}
	}
-省略-
}
```

###要約
「vpn_server.config」のPort 5555のListenerの「bool Enabled false」を「true」に変え、保存します。
すると、ポートが開くのでGUIの管理ツールからいじれるようになります。

当たり前っちゃ当たり前かもしれないのですが、ポートを閉じてしまった時にどのあたりをいじったらいいかわからなかったので。。。
railsでjavascript困ったメモ


## railsのデータをjavascriptに渡す
railsのモデルの値をjavascriptに渡す方法を調べてgemのgonを使いました。
viewでインスタンス変数を使うように渡せるのでとても便利でした。
[gazay/gon](https://github.com/gazay/gon)
[Passing Data to JavaScript](http://railscasts.com/episodes/324-passing-data-to-javascript?language=ja&view=asciicast)

## ブラウザを更新するとjavascriptの画面が消える(Turbolinks)
turbolinksでページ更新した時にwindow.onloadが発火しないことが原因らしかったです。
window.onload を直接使っていたので不安だったのですが、jquery.turbolinksを入れたら正常に動きました。
[Rails4でturbolinksを謳歌するためのまとめ](http://o.inchiki.jp/obbr/97)
[kossnocorp/jquery.turbolinks](https://github.com/kossnocorp/jquery.turbolinks)
pyenv globalで切り替わらない！

```terminal
pyenv global hoge
```

 してもpythonのバージョンが切り替わらなくて1時間くらい格闘した。
こんなんでハマるの自分だけだろうけど、ググってもこんなアホな事例は見つからなかったので一応置いておきます・・。

まず、pyenv自体はホームディレクトリにおいて、ちゃんとパスを通してある状態。

pyenvでanaconda3系をインストールして、

```terminal
pyenv global hoge
```

で切り替えようとしたところ、切り替わらなかった。
切り替わらない理由の多くはpythonがシステムの奴を参照してるって場合。

```terminal
which python
```

で確認。問題ない、~/.pyenvを通っている。
じゃあ何で切り替わらないのか。

pyenvのバージョン選択はまず、

```terminal
pyenv shell
```

で設定されるPYENV_VERSION環境変数。
次に、

```terminal
pyenv local
```
で設定できる、カレントディレクトリにある.python-versionファイル。
次に、

```terminal
pyenv global
```

で設定できる~/.pyenv/versionファイル。
全てがなかったらsystemのpython。

そう、私のホームディレクトリにはなぜか.python-versionファイルが存在していたのです・・。
全然気づきませんでした・・、いつやっちゃったんだろう・・・。

```terminal
rm ~/.python-version
```
すると解決しました・・・。
Visual Studio 2015のネイティブメモリ診断機能を使用してメモリリークを検出する

#Visual Studio 2015のネイティブメモリ診断機能を使用してメモリリークを検出する
Visual Studio 2015には「ネイティブメモリ診断」が新機能として搭載されています。

[Visual Studio 2015 における Visual C++ の新機能](https://msdn.microsoft.com/ja-jp/library/hh409293.aspx)
>2.ネイティブ メモリ診断
a.メモリ診断セッション (Ctrl+Alt+F2)。ネイティブ アプリケーションのメモリ使用をデバッグ セッション中にリアルタイムで監視できます。
b.メモリのスナップショット。アプリケーションのヒープ内容の瞬間的なイメージをキャプチャします。 2 つのメモリ スナップショットを比較すると、ヒープの状態の違いを調べることができます。 アプリケーションを停止した後の各インスタンスのオブジェクト型、インスタンス値、および割り当て呼び出しスタックが表示されます。 各スナップショットの呼び出しツリーがスタック フレームごとに表示されます。

本機能を利用してアプリケーションのメモリリークを検出してみます。

# 調査環境
- Windows 10Pro
- Visual Studio Community 2015

# 調査対象プログラム
```c:Win32Project1.cpp
#include "stdafx.h"
#include "Win32Project1.h"

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, 
                    _In_ LPWSTR    lpCmdLine, _In_ int       nCmdShow)
{
	while (MessageBox(NULL, TEXT("終了しますか?"), TEXT("確認"), MB_YESNO | MB_ICONQUESTION) != IDYES)
	{
		char* ch = new char[256]; // メモリリーク！
	}
   
	return 0;
}
```

#メモリリーク検出手順
1.調査対象プログラムのデバッグ実行
[デバッグ(D)]→[デバッグの開始]メニューを押下して調査対象プログラムをデバッグ実行します。
![キャプチャ0.png](https://qiita-image-store.s3.amazonaws.com/0/76826/dc425e74-0ce8-cad6-da2c-cf4d8168cb1c.png)

2.処理実行前のスナップショットを作成する
[デバッグ(D)]→[すべて中断(H)]メニューを押下してプログラムを一時中断させます。
次に[デバッグ(D)]→[診断ツールの表示]メニューを押下してネイティブメモリ診断ツールを表示させ、「メモリ使用量」タブの「スナップショットの作成」を押下して、処理実行前のスナップショットを作成します。
![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/76826/a8558df9-ef27-d410-1260-4e6ad3e9bd09.png)

3.メモリリークを伴う処理の実行
[デバッグ(D)]→[続行(C)]メニューを押下してプログラムを再開し、該当プログラムの「いいえ」ボタンを押下してメモリリークを伴う処理を実行させます。
![キャプチャ0.png](https://qiita-image-store.s3.amazonaws.com/0/76826/dc425e74-0ce8-cad6-da2c-cf4d8168cb1c.png)

4.処理実行後のスナップショットを作成する
[デバッグ(D)]→[すべて中断(H)]メニューを押下してプログラムを一時中断させます。
次にネイティブメモリ診断ツールウィンドウ内「メモリ使用量」タブの「スナップショットの作成」を押下して、処理実行後のスナップショットを作成します。
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/76826/b64cbbd6-9ab1-66c3-3d21-b4d1d63e8bca.png)


5.スナップショットの比較
ネイティブメモリ診断ツールウィンドウ内「メモリ使用量」タブの「割り当て(相違)」列の↑項目を押下し、スナップショット間のヒープの差分を表示させます。
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/76826/74990ecc-ba97-f4de-e63d-f70744e296c7.png)
![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/76826/1ad4e46b-758b-22da-9a19-bc6c58fe1570.png)


本差分情報により、Win32Project1.cppの9行目で確保したchar配列のメモリ領域が解放されず、256バイトのメモリリークが発生していることが確認出来ました。
Javascriptの正規表現


今までわかっている気になっていた正規表現。
先日仕事で正規表現を書く機会があったのだが、うまく書けず、数時間ハマってしまったので、改めて勉強し直そうと思う。

## 正規表現
そもそも正規表現とは？
「文字列内で文字の組み合わせを照合するために用いられるパターン」
だそうです。
簡単に言うと、文字列内にある文字があるかどうか、など文字列をいい感じに検証したいときに便利な記述方法、なのだろうか。

　
正規表現は以下２つのパターンで書ける。

- 正規表現リテラル

```
var reg = /hoge+a/;
```

- RegExp オブジェクトのコンストラクタ関数

```
var reg = new RegExp("hoge+a");
```

今回はよく使用する正規表現リテラルで書いていこうと思う。

## よく使う特殊文字
正規表現でマッチしている部分を見つけたいときは、必ずといっていいほど特殊文字を使用すると思う。

```
/^hoge+a/
```
このような形で。特殊文字をどれだけマスターしているかによって、正規表現を使う幅が広がってくる。

### 1. \
バックスラッシュの次の文字をエスケープしてくれる。

### 2. ^
入力の先頭にマッチする。

```
/^a/
```
このようにすると、"abc"の"a"にマッチする

### 3. $
入力の末尾にマッチする。

```
/a$/
```
このようにすると、"bca"の"a"にマッチする

### 4. *
直前の文字の 0 回以上の繰り返しにマッチする。

```
/ab*/
```
このようにすると、"abbbbccc"の"abbbb"にマッチする。
"a"にもマッチする。"bbb"ではマッチしない。

### 5. {n}
直前の文字がちょうど n 回出現するものにマッチする。

```
/a{2}/
```
このようにすると、"aabc"の最初の"aa"にマッチする。
"abc"にはマッチしない。

### 6. [xyz]
文字集合を表す。角括弧で囲まれた文字のいずれか１個にマッチする。

```
/[ab]/
```
このようにすると、"aefgb"の"a"にマッチする。

### 7. [^xyz]
文字集合の否定または補集合。角括弧で囲まれた文字ではない文字にマッチする。

```
/[^ab]/
```
このようにすると、"aefgb"の"e"にマッチし、一番最初の該当文字にマッチする。
 
他、多数存在するが、全て覚えていくのも大変なので、随時覚えていきたい。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions

## 正規表現の使用
正規表現は、RegExpのtestおよびexecメソッド、Stringのmatch、replace、search、およびsplitメソッドとともに使用する。

### 1. match
文字列中で一致するものを検索するStringのメソッド。結果情報の配列を返す。マッチしない場合はnullを返す。

```
var str = "abcdefg";
str.match(/[a-e]/gi); // ["a", "b", "c", "d", "e"]
```

### 2. test
文字列中で一致するものがあるかをテストするRegExpのメソッド。trueまたはfalseを返す。

```
/abc/.test("abcdefg"); // ture
``` 

以上、正規表現でよく使うであろう記述をまとめてみた。
随時勉強していこうと思う。
homebrewでインストールしたpostgresqlが動かなくなったの改修してみた

/usr/local/var/postgresがあれば削除する

```
$brew install postgresql
$brew uninstall postgresql
$brew uninstall --force postgresql
$brew install postgresql
$initdb /usr/local/var/postgres -E utf8
$postgres -D /usr/local/var/postgres
$export PGDATA=/usr/local/var/postgres
$pg_ctl start
$pg_ctl stop
$pg_ctl start -l /usr/local/var/postgres/server.log
$psql -l
$createuser -P user
```

参考URL
http://open-groove.net/postgresql/mac-brew-postgresql/
http://qiita.com/_daisuke/items/13996621cf51f835494b
http://stackoverflow.com/questions/27700596/homebrew-postgres-broken
[Objective-C] 文字列からインスタンスの生成とメソッド呼び出し（プロパティの設定）をやってみる

以下のようにして実装してみた。

```objc:params
// 文字列として必要クラスなどのデータを保持している想定
NSDictionary *paramInfo = @{ @"className": @"AnyClass",
                             @"paramName": @"setFloat:",
                             @"type": @"float",
                             @"value": @(0.5),};
```

### 実装

`NSMethodSignature` と `NSInvocation` を利用する。

```objc
- (id)createInstanceWithDictionary:(NSDictionary *)paramInfo
{
	Class class = NSClassFromString(paramInfo[@"className"]);
	__autoreleasing __typeof(class) instance = [[class alloc] init];

	SEL sel = NSSelectorFromString(paramInfo[@"paramName"]);
	CGFloat val = [paramInfo[@"value"] doubleValue];

	NSMethodSignature *signature = [class instanceMethodSignatureForSelector:sel];
	NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
	invocation.selector = sel;
	invocation.target = instance;
	[invocation setArgument:&val atIndex:2];
	[invocation invoke];

	return instance;
}
```

文字列で実行することの是非はあると思うけど、とりあえず動かすことができた。
NavigationWindowでもAlloyのCollectionを使いたいしAndroidとコードを共有したい

Androidとクロスプラットフォームの開発だとどうすればいいか悩むので、ここにメモしておきます。

例えば、NavigationWindowを使ってListViewとCollectionのバインディングを実現したい場合。

iOSのレイアウトは簡単にこんなのだとします：

```xml
<Alloy>
  <Collection src="entry" />
  <NavigationWindow platform="ios">
    <Window>
      <ListView>
        <Templates>
          <ItemTemplate name="entry">
            <Label class="titleLabel" bindId="title" />
            <Label class="subtitleLabel" bindId="subtitle" />
          </ItemTemplate>
          <ListSection dataCollection="entry" dataTransform="dataTransform">
            <ListItem template="entry" titleLabel:text="{title}" subtitleLabel:text="{subtitle}" />
          </ListSection>
        </Templates>
      </ListView>
    </Window>
  </NavigationWindow>
</Alloy>
```

単純ですね。一方、処理を担当するコントローラはこんな感じ。

```js

var collection = Alloy.Collections.entry;

function dataTransform(model){
  var transform = model.toJSON();
  return transform;
}

function loadData(){
  collection.fetch({
    //オプションとか
  });
}

$.listEntries.addEventListener('open', function(e){
  loadData();
});
```

iOSでビルドするとめでたしめでたし、ちゃんと動作するのですが、Androidだと何も表示されません。というかWindowがないのでエラーになります。どうして？

だってWindowはNavigationWindowの中にあるから、Alloyのビルド時にplatform属性でAndroidの場合は中身は全部捨てられてしまんですもの。

いちばん単純な解決方法は、app/views/androidとapp/views/iosディレクトリを作って、それぞれにXMLを用意することです。iOS用にはNavigationWindowを使い、Androidでは使わない。単純です。欠点は、変更の際に両方のファイルに反映させないといけないことで、まあそういう雑な運用は大抵破綻するので、遠くない将来に必ずうっかり不具合を仕込むことになります。

問題なのはCollectionがAlloyの直下になければいけない点です。この制限さえなければ、もっと単純にできるのに。。。

ところが、うまい具合に抜け穴があったので紹介します。ここからが本題ですね。

というわけで、こんな風にしてみます。まず、iOS専用のlistEntriesNav.xmlを用意します。

```xml
<Alloy>
  <NavigationWindow platform="ios">
    <Window>
    </Window>
  </NavigationWindow>
</Alloy>
```

ダミーのWindowがないとコンパイルエラーになります。

次に、listEntries.xmlとして実際のWindowのレイアウトを作ります。まあ、さっきとほぼ同じですね。

```xml
<Alloy>
  <Collection src="entry" />
  <Window>
    <ListView>
      <Templates>
        <ItemTemplate name="entry">
          <Label class="titleLabel" bindId="title" />
          <Label class="subtitleLabel" bindId="subtitle" />
        </ItemTemplate>
        <ListSection dataCollection="entry" dataTransform="dataTransform">
          <ListItem template="entry" titleLabel:text="{title}" subtitleLabel:text="{subtitle}" />
        </ListSection>
      </Templates>
    </ListView>
  </Window>
</Alloy>
```

NavigationWindowだけが消されています。

次にコントローラにも細工をします。基本的には同じですが、openイベントが発火しないかもしれないのでそこだけ変更します。

```js
//$.listEntries.addEventListener('open', function(e){
//  loadData();
//});
exports.loadData = loadData;
```

exportsを使って、コントローラの呼び出し元からloadData関数を実行できるようにしてあげます。これで準備完了です。

あとはそれぞれのプラットフォームに応じてNavigationWindowを開いてWindowを入れ替えるか、そのままWindowを開くか決めて、実行します。

```js
var nav;
var win = Alloy.createController('listEntries');
if(IOS){//こういうのがあると便利ですよね
  nav = Alloy.createController('listEntriesNav').getView();
  nav.window = win.getView();
}else{
  nav = win.getView();
}
nav.addEventListener('open', win.loadData);
nav.open();

```

ようするに、まずNavigationWindowを用意しておいて、その中身はだたのWindowオブジェクトでいいのだから、データバインディングとかはそっちの方でやっているというだけですね。

これで、iOSとAndroidでNavigationWindowを使っていてもコードを共有しながらAlloyのデータバインディングを実現することができました。めでたしめでたし。
Docker内のWebサイトにHTTPSのみで通信したい

## ■環境

* CentOS 6.6
* nginx 最新
* Docker 最新(1.7だったかな？)

## ■やりたかったこと

* 社内チャットシステムの構築
  * 本筋ではないので深くは触れないが、[Rocket.Chat](https://github.com/RocketChat/Rocket.Chat)と[Mattermost](https://github.com/mattermost/platform)で悩んだ挙句、Mattermostを採用している
* HTTPSでの通信
  * まぁnginxとか前段に立てればラクショーだよね
  * 社内システムなのでオレオレ証明書でモウマンタイ
* どうせならDocker使ってみたい
  * ナウい(死語)ものには触れてみたい

## ■問題の概要

[こちら](http://qiita.com/yasuhiroki/items/0e06ccda1c53f616d74d)の記事を参考に「Rocket.Chat」を立てようとしていた。
Dockerのインストール、HTTPでのアクセスまでは問題なくOK！
あとは、HTTPS **のみ** でしか構築の許可が出なかったため、オレオレ証明書作ってnginxを通してアクセスさせた。アクセスすることもOK！

#### **しかし**
HTTPもアクセスできないようにしたいので、「よっし、Linuxだし`iptables`だな！」と、22/443以外を閉じてみる。だけど、もともと初期構築時に開けたHTTP通信(上記参考記事でいう55555ポート)でのアクセスが塞がれない。。アクセスできるんですけどーｗｗとなった。

## ■解決した方法

###### 自信がないので、詳しい方、アドバイスいただけると助かります。。。。

どうやらNATテーブルにDNATの設定が ~~勝手に~~ 自動的に追加されるようなのでそこを塞ぐ。

```bash
#現在の設定を確認
iptables -t nat -L

#DNATに流れる設定を削除して、443からのみ流れるように変更する
iptables -t nat -D PREROUTING -p all -m addrtype --dst-type LOCAL -j DOCKER
iptables -t nat -A PREROUTING -p tcp --dport 443 -s localhost --sport 55555 -j DOCKER
```

[参考記事](http://oxynotes.com/?p=6361#highlighter_122188)

これで https://example.com/ にアクセスすると無事に接続可能、かつ、
http://example.com:55555/ にアクセスしても 404 になることを確認！
いやーDocker難しい。
Linuxの知識もあんまりない中での挑戦だったのでかなり苦労しました :sweat_smile:
C#で貧者の型クラス（poor man's type class）

今日は[Scala の implicit parameter は型クラスの一種とはどういうことなのか](http://nekogata.hatenablog.com/entry/2014/06/30/062342)の例をC#で書いてみます。と言っても、C#には暗黙引数と同等の機能は備わっていないので、明示的に引数を取るしかありません。

型クラス。

```csharp
public abstract class FlipFlapper<T>
{
    public abstract T DoFlipFlap(T x);
}
```

型クラスを利用する関数。

```csharp
private static T FlipFlap<T>(T x, FlipFlapper<T> flipFlapper)
{
    return flipFlapper.DoFlipFlap(x);
}
```

型クラスの実体。

```csharp
public class IntFlipFlapper : FlipFlapper<int>
{
    public static IntFlipFlapper Instance = new IntFlipFlapper();

    public override int DoFlipFlap(int x)
    {
        return -x;
    }
}

public class StringFlipFlapper : FlipFlapper<string>
{
    public static StringFlipFlapper Instance = new StringFlipFlapper();

    public override string DoFlipFlap(string x)
    {
        char[] chars = x.ToCharArray();
        Array.Reverse(chars);
        return new string(chars);
    }
}
```

型クラスを利用する関数の呼び出し。

```csharp
FlipFlap(1, IntFlipFlapper.Instance);
FlipFlap("string", StringFlipFlapper.Instance);
```

毎回明示的に引数を渡さなければならないのは不便です。何とかしてC#で暗黙引数を実現できないか色々考えましたが、難しそうでした。
[Swift] 戻るボタンのタップイベントを検知したい時

## やること
`Swift` でNavigation Barの戻るボタンタップイベントを検知する

## 実装
下記コードを遷移元のViewController内に記述する

```Swift:Swift2.0
override func didMoveToParentViewController(parent: UIViewController?) {
    super.willMoveToParentViewController(parent)
    if parent == nil {
        print("戻るボタン is tapped")
    }
}
```
iOS9&xcode7にて、既存プロジェクトをビルドしたら上下に黒帯が出た場合の対応方法

iOS9&xcode7にて、既存プロジェクトをビルドしたら下記イメージのように上下に黒帯が出てしまい、困っていました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/30218/bec5abc3-1364-9c2f-eb64-aadce5790667.png" width=320></img>

iOS8&xcode6時代はこの現象は発生してませんでした。
諸々調べていたら、iOS9からLaunch Screen Fileにstoryboardを設定すればよいということですが、そうすると既存の膨大な数の画面すべてをAutoLayoutかSizeClassesに対応させる必要があるので、現実的ではありません。
（新規のプロジェクトであれば、SizeClassesで対応するべきでしょう）

### **解決方法**
単純に拡大表示するでよいのであれば、Launch Screen Fileではなく、Launch Image Sourceを設定し、下記のようにRetina関係のところはDefault-568.pngを設定してあげればうまくいきました。

![スクリーンショット 2015-09-22 23.04.24.png](https://qiita-image-store.s3.amazonaws.com/0/30218/3e755cf2-def1-a1f7-83ee-767e1ed68630.png)

しかし上でもいいましたが、本来はLaunch Screen Fileにstoryboardを設定するべきでしょう。
[Objective-C] IMP型を実行しようとすると「Too many arguments to function call」で怒られる



[この記事](http://qiita.com/Nunocky/items/7002d5f93e04e27ef36e)で書かれていたものと同じだと思う。

以下のようにして `IMP` 型の実装を取得して実行しようとするとタイトルのように怒られた。

```objc
NSString *methodName = @"anyMethod:";
SEL sel = NSSelectorFromString(methodName);
CGFloat val = 0.5;
IMP imp = [AnyClass instanceMethodForSelector:sel];
imp(anyClassInstance, sel, val); // <- ここで怒られる（Too many arguments to function call）
```

上記記事と同じように、適切にキャストしてやることで実行できた。どうやら `Xcode6` からの変更らしい。

```objc
((void (*)(id, SEL, CGFloat))imp)(anyClassInstance, sel, val);
```

<del>うーん、とりあえず原因と対応方法はわかったけど、今やろうとしてることからするとこれは結構めんどくさいな・・。どうするか・・。</del>

[こんな感じ](http://qiita.com/edo_m18/items/4613acf85816b979f193)で実装してみた。
Hakyllでページング

`hakyll-init` で作られたテンプレートだとアーカイブページがページングされてないので、これをできるようにする。
[2年前にMLで共有されてる](https://groups.google.com/forum/#!msg/hakyll/eqaFDplY2cc/V0bBQTwAq94J)のでその通りにやればいい。

具体的には `site.hs` を [こんな感じ](https://github.com/hiratara/hiratara.github.io/commit/b9cc69b96df3c87ac9e2bf729c4bf1ac460a2602#diff-d2ab4e4f966b83fa5e87a16f447a9a61R47) で書き換えるとO.K.。`Rule` モナド内では `Item` が得られてないので `recentFirst` の代わりに `sortRecentFirst` を使うことに注意。後は `archive.html` 側で `$if(prevPage)$` `$endif$` とか使っていい感じにどうぞ。
Windows10にしたらVBAから.Net Frameworkが使えなくなった

VBAから一部の.Net Framework が使えるというのは知っている方も多いかと思います。
あれれ～つかえなくなっちゃったー　という方、Windows10をクリーンインストールしましたね（笑
.Net Framework 3.5 を有効にすることで利用が可能になります。
逆に言うと、.Net Framework 4.x では使えなくなっちゃったんですね(T-T

RelaxTools の中でも幾つか .Net Framework を使っていますが以下、エラーになっています。
![net00.png](https://qiita-image-store.s3.amazonaws.com/0/69810/65e92f8f-34eb-feaf-17d0-8863900742b0.png)

コントロールパネルのWindows機能の有効化と無効化を表示
![net01.png](https://qiita-image-store.s3.amazonaws.com/0/69810/c296e0f8-cb34-d751-70e0-b5fac9fdca32.png)

.Net Framework 3.5 をチェックします。
![net02.png](https://qiita-image-store.s3.amazonaws.com/0/69810/03a30a86-ef50-b4d0-d46f-e18c73807f5b.png)

Windows Update で .Net Framework 3.5 入手します。
![net03.png](https://qiita-image-store.s3.amazonaws.com/0/69810/4e0c7be5-904f-8ce3-75e0-bfa1a4a599b8.png)

ダウンロードされます。
![net04.png](https://qiita-image-store.s3.amazonaws.com/0/69810/3d071662-8d08-7bfa-04ec-b388bfeb80a6.png)

エラーが無くなりました。
![net05.png](https://qiita-image-store.s3.amazonaws.com/0/69810/c875a61f-5850-0596-d812-f686939ca393.png)
gmを使ってPSDからサムネイルを作成する

gmを使ってPSDのサムネイルを作成する。

```js
var gm = require('gm').subClass({ imageMagick: true });
gm("img.psd[0]").resize(128, 128).setFormat("png").write('./out.png', function(){ console.log("done"); });
```

`img.psd[0]`とすると、各レイヤーが合成されたものが出力される。
`[0]`を付けないと、各レイヤーそれぞれのサムネイルが出力される。

# 参考文献
http://paranoid360.blogspot.jp/2011/04/imagemagickpsd.html