OmniAICreator/Qiita-1.07M huggingface dataset:
[Sphinx]番号付きリストの入れ子ができなかった話

Markdownのほうが先に触ったので、MarkdownでできることはreSTでも出来ると思って引っかかった話。

# 結論

Markdownでは番号付きリストの中に入れ子があっても同じインデントで番号を振ってくれます。
**しかし**、reSTでは`#`を使った自動連番はネストがあると機能しません。


[参考サイト](http://www.ne.jp/asahi/hishidama/home/tech/sphinx/rest.html)によるとreSTはソースを読んでも構造がわかるようにする思想のため
番号はちゃんとソースに書きべきということみたいです。

# 結果

## Markdown

Markdownでは下記の書き方ができる

### ソース

```
1. foo

  1. hoge
  1. fuga

1. bar

  1. hoge
  1. fuga

```

### 出力

```
1. foo
  1. hoge
  2. fuga
2. bar
  1. hoge
  2. fuga
```

## reST

reSTではこんな感じになり、できない

### ソース

```rst
#. foo

  #. hoge
  #. fuga 

#. bar

  #. hoge
  #. fuga

```

### 出力

```
1. foo
  1. hoge
  2. fuga
1. bar
  1. hoge
  2. fuga
```

## reST(改)

reSTで上記のMarkdownのような出力をするには以下のように書く必要がります。

### ソース

```rst
1. foo

  1. hoge
  2. fuga 

2. bar

  1. hoge
  2. fuga

```

もしくは

```rst
1. foo

  #. hoge
  #. fuga 

2. bar

  #. hoge
  #. fuga

```

### 出力

```
1. foo
  1. hoge
  2. fuga
2. bar
  1. hoge
  2. fuga
```

# 参考

[reST構文メモ(Hishidama's Sphinx reStructuredText Memo)](http://www.ne.jp/asahi/hishidama/home/tech/sphinx/rest.html)
macにインストールしている便利ツールたち

大学の友人が新しくmacを使うことになったので、オススメをまとめてみた。
熟練開発者向けではなく、「mac初めて触るんですぅ〜」向け。

## ランチャー
### Alfred
Spotlight的なやーつ。
なくてはならないソフトの一つ。
以下、よく使うなーと思う使いみち

#### twitter
twitterを開いたりツイート・ユーザーを検索したり
#### スリープ
Alfredを呼んで`sleep`コマンドでスリープ状態に。
`sl->Enter`でOK。
ちょいと席を離れるときに。
#### ファイル検索
`半角スペース + ファイル名`でファイル検索。
Automatorで作った自作アプリもシェルコマンドも呼べる。
#### Google画像検索
```images "調べたいやつの名前"```
images "◯◯ デザイン"とか
images "芸能人の名前"とかよく調べます
好きな女性芸能人・アイドルの名前を入れると幸せになれます
#### Google Map
```
maps "調べたい場所"
maps "出発地" to "目的地" // 経路の場合
```
経路飛べないかなーとか思ってノリでtoって入れてみて、
検索が通ったときは感動しましたw
なんでこれでいけるんですかね？？
#### amazon
買いたいものが浮かんだときにパッとお値段をよく見ます
####  参考
[Alfredの無料版でつかえる機能の使い方と設定](http://tukaikta.blog135.fc2.com/blog-entry-162.html)
[Alfredとspotlightの違いがわかったのでメモっておく](http://shiopu.hatenablog.com/entry/20130308/1362679879)
[Alfredの設定&Tipsメモ](http://qiita.com/pawjun/items/f45f8980ac9941c893c5)
## ブラウザ
### Google Chrome
安定。
#### 使ってる拡張機能

##### vimium
vimのようなキー操作でchromeを操作できるツール。
別にvim使ってなくても、少し覚えるだけで快適に。
履歴やブックマークをキーボードだけでパッと開けるのはアツい。

[Chromeをvimライクに使えるようにするvimium](http://qiita.com/satoshi03/items/9fdfcd0e46e095ec68c1)


##### Evernote Web Clipper
気になったページ、取っておきたいページ、gmailのメール画面など、
ガンガン突っ込んでます
##### Markdown Here
メールの文章をmarkdownで記述後、整形してくれるツール
##### Checker Plus for Gmail
Gmailの管理に。
即座に既読、削除などをやれるのでオススメ。
##### Color Ziila
ページの要素からカラーコードを取得したり、
良いなと思ったページの色を抽出してくれたり。
スライド作りのときによく使います。
##### 	OneClick Cleaner for Chrome
履歴をパッと消せます。
## 文字入力
### Google 日本語入力
"きょう"って入力して日付出したり、
"いま"って入力して現在時刻出したり、
"おみくじ"って入力して今日の運勢みたり
（ほとんどやらないです、すみませんｗ）
やれることいっぱい。
単語登録しまくりです。
登録した辞書もエクスポートできるので
自宅mac、学校macで同じ入力が出来るようにしています。
よく使うURLも登録しておくとAlfredから一発で飛べるのでアツい。
例. 
ｌ５（全角のエル + 5）→http://localhost:5000
## エディタ
### Sublime Text3
いわずとしれた無料(で使える)高品質エディタ
入れたらどんどん拡張しちゃいましょう
[SublimeTextの教科書で紹介されてるプラグインまとめ](http://qiita.com/maccotsan/items/f320036e19f8d3b798c1)
## コミュニケーション
このへんはコミュニティに合わせて。
####  Slack / LINE / Chatwork
## ファイル関係
### XtraFinder
Finderを拡張。タブが使えたりカット&ペーストが使えたり。
### The Unarchiver
ファイルの圧縮・解凍に
### AppCleaner
アプリを消すときとかに、設定ファイルも含めてきれいに削除してくれる
## メモ
### Evernote
日常生活をEvernoteでGTD風な管理をしています。
もうなくてはならないツール。
がっつりメモを取るときには
MarxicoというEvernoteに連携しているエディタでメモをとっています。
### Kobito
Qiitaプレゼンツ。
こびとちゃんかわいい。
Simple is Best なメモアプリ。
Marxico&Evernoteに移行するまではよく使ってました。
## その他便利ツール
### Shiftlt
現在は開発が終了している模様。
以下からダウンロードしたものはElCapitanでも動作確認済。
[Shiftlt](https://github.com/fikovnik/ShiftIt/releases)
ElcapitanでSplitViewが使えるようになりましたがコレで十分。
### InsomniaX
PCを閉じてもスリープしないようにできる。
でかいファイルを落としてるときとかに。
あまりしすぎるとバッテリーに悪そう。
[InsomniaX](http://www.macupdate.com/app/mac/22211/insomniax)
### Wake Up Time
PCを目覚ましにしたい人に。
[Wake Up Time -Alarm Clock](https://itunes.apple.com/jp/app/wake-up-time-alarm-clock/id495945638?mt=12)

### HyperSwitch
windowsみたいに「ウィンドウ単位で切り替え」ができるようになるアプリ
https://bahoom.com/hyperswitch

## まとめ
とりあえずAlfredのqueryと単語登録を駆使したら幸せになれる。
全然無知なので、何か不備不足あればご指摘お願いします！
「コレ入れたらもっと幸せになれるよ！」も是非！！
xampp+PHP+Windows7でimagickを使う

## はじめに

xampp/PHP/Windows7/imagick に関わる情報は錯綜していて何が正しいのかわからない。
2016年5月20日現在における、私が動作を確認した情報を示します。

## 手順

## 1. [imagick用のimageMagick](http://windows.php.net/downloads/pecl/deps/)をダウンロード・解凍する

**注: Windows用のxamppは32bitのみであるため、imageMagick, imagick等をダウンロードするときはx86のものを選ぶ**

```ImageMagick-X.X.X-X-vcXX-x86.zip``` を探してダウンロードする。
Imagickに対応したImageMagickをダウンロードする。ImageMagickを検索すると、[最新のImagemagick](http://www.imagemagick.org/script/binary-releases.php)が見つかるが、Imagickに対応していないため、これは用いない。


## 2. ```ImageMagick-X.X.X-X-vcXX-x86\bin```にパスを通す

解凍した```ImageMagick-X.X.X-X-vcXX-x86\bin```の中に、

- ```convert.exe```
- ```CORE_RL_```で始まる複数のファイル

などに対して、Winodowsの環境変数にパスを通す。パスの通し方についてはここでは解説しない。

## 3. [imagick](http://windows.php.net/downloads/pecl/releases/imagick/3.4.2/)をダウンロード・解凍する


**注: Windows用のxamppは32bitのみであるため、imageMagick, imagick等をダウンロードするときはx86のものを選ぶ**

```php_imagick-X.X.X-X.X-ts(nts)-vcXX-x86.zip``` を探してダウンロードする。

ファイル名のts/ntsは、使っているPHPがスレッド・セーフか否かを示す。該当する方をダウンロードする。

## 4. 展開されたフォルダ中の```\php_imagick.dll```をPHPのextensionフォルダにコピーし、```php.ini```のDynamic Extensionsに```extension=php_imagick.dll```を加える

```
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
...
...
...
extension=php_imagick.dll
```

## 5. システム環境変数にMAGICK_HOMEを追加し、変数値に```ImageMagick-6.9.3-7-vc11-x86\bin```へのパスを記入する

環境変数を追加する方法についてはここでは解説しない。

## 6. パソコンを再起動する

```phpinfo()``` で以下のような確認ができれば良い。

![imagick.png](https://qiita-image-store.s3.amazonaws.com/0/70258/73056981-c764-07fd-fb4f-1b31ab951bde.png)

またはコマンドラインで以下のような確認ができれば良い。

```
C:\Program Files (x86)\ImageMagick-6.9.3-7-vc11-x86\bin>php -i | find "imagick"
imagick
imagick module => enabled
imagick module version => 3.4.2
imagick classes => Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator, Ima
gickKernel
imagick.locale_fix => 0 => 0
imagick.progress_monitor => 0 => 0
imagick.skip_version_check => 0 => 0
```

## 補遺

大まかな手順は以下を参考にした。

[メモメモ：windowsにImagemagickをインストールしてxampp上のPHPで使えるようにするよ](http://usosake.net/windows_imagemagick_xampp_php/)
[windowsのPHP5.4にimagemagickをインストールして動かなかったときに確認したいこと](http://qiita.com/smzk/items/ecc8fc77eb1673dd9dd0)

Imagickは[こちら](https://pecl.php.net/package/imagick/3.1.2/windows)からもダウンロードできるようだが、試していない。
Schemeのcall/ccでジェネレータ

[Schemeでジェネレーター - Qiita](http://qiita.com/hotoku/items/a36974d2ecfec9ace930)を拝見したところ、ジェネレータ関数の内部でyieldが呼ばれなかったときに無限ループに入るバグを見つけたので修正した。


```scm
;; make-generator: ((a → ⊥) → a) → (() → a|undefined)
(define (make-generator proc)

  ;; nop: () → undefined
  (define (nop) (if #f 0))

  ;; return: a → ⊥
  (define (return val) ()) ;; 一回目のリターンポイントは未定義

  ;; next: () → a|undefined
  (define (next) (proc yield));; 一回目のジェネレータ関数内部のセーブポイントはproc最初から、ジェネレータ関数の最後まで到達したらundefinedを返す

  ;; yield a → ⊥
  (define (yield value)
    (call/cc (lambda (next*)
      (set! next next*)
      (return value) )) )

  ;; generator*: () → a
  (define (generator*)
    (call/cc (lambda (return*);; generatorが呼ばれた時のリターンポイント、gen=make_generator(fn);gen()のとき
      (set! return return*) 
      (let ((val (next)))
        ;; ここに到達した -> nextでyieldは使われなかった -> return は使われなかった
        (set! generator* nop) ;; 以後nop
        (return val) ) )) )

  ;; generator: () → a|undefined
  (define (generator) (generator*))

  generator)

;; gen-n: () → a|undefined
(define (gen-n)
  (make-generator
   (lambda (yield)
     (yield 1) ;;ここの各行の継続がnextに保持されるセーブポイント
     (yield 2)
     (yield 3)
     -1 )) )

(let ((an (gen-n)))
  (print (an));; 1 ここの各行の継続がreturnに保持されるリターンポイント
  (print (an));; 2
  (print (an));; 3
  (print (an));; -1
  (print (an)));; #<undef>
```

## 感想

人類には第一級継続は早すぎるし型のない言語はつらい
Herokuで静的ファイルに直接アクセスする方法

以下ようなURLHerokuにデプロイした静的ファイルに以下のように直接アクセスしたい機会があったので、やり方をまとめておきます。
`http://exmaple.herokuapp.com/example.html"`

GitHubに各言語での雛形が置いてありました。
今回はNode.jsを利用した場合について記述していきます。

- Node.js  
[nulltask/heroku-static-provider](https://github.com/nulltask/heroku-static-provider)
- Ruby  
[jamiew/heroku-static-site](https://github.com/jamiew/heroku-static-site)
- PHP  
[obfuscurity/heroku-static-site](https://github.com/obfuscurity/heroku-static-site)

## リポジトリをクローン
最初に以下のコマンドでリポジトリをクローンします。

```
$ git clone https://github.com/nulltask/heroku-static-provider.git my-site
$ cd my-site
```

## 静的ファイルを配置
アクセスしたいファイルを`public`ディレクトリに配置します。
今回は以下のhelloworld.htmlを配置してみます。

```html:helloworld.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  Hello World!
</body>
</html>
```

## Herokuへデプロイ
Herokuへリポジトリをデプロイします。

```
$ heroku create
$ git commit -a -m 'some commit message'
$ git push -u heroku master
```

## 静的ファイルにアクセス
以下のようなURLでアクセスすれば、Herokuにデプロイした静的ファイルにアクセス出来ます。
(hogehogeは任意の文字列)
`http://{hogehoge}.herokuapp.com/helloworld.html`

## 参考
Serving static files in Express
http://expressjs.com/starter/static-files.html
ひらがなとアルファベットがまざったリストのソートをする

たとえば
`["a", "あ", "b", "い", "c", "位", "d", "う", "a", "亜"]`
のようなリストがあったとして、

これまでは普通に下記のようにComparatorインターフェースにお任せしていたんですが、

```lang:comparator
Collections.sort(data, new Comparator<String>() {
    @Override
    public int compare(String data1, String data2) {
        return data1.compareTo(data2);
    }
});

-> [a, a, b, c, d, あ, い, う, 亜, 位]
```

上記の通り、先にアルファベットが並びます。

先にひらがなを持ってくるやりかたがわからなかったので、調べたところ、Collatorクラスというものがあるようだったので、試しに使ってみると、意図した通りに並んでくれました。

```lang:Collator
Collator collator = Collator.getInstance(Locale.JAPANESE);
Collections.sort(data, collator);

-> [あ, い, う, 亜, 位, a, a, b, c, d]
```

CollatorクラスはComparatorインターフェースを実装しており、特定のロケールに依存してStringの比較を行います。ちなみに、ロケールを中国語にすると

```lang:Collator
Collator collator = Collator.getInstance(Locale.CHINESE);
Collections.sort(data, collator);

-> [位, 亜, a, a, b, c, d, あ, い, う]
```

こんな感じでした。中国語なので、日本人が考える音読み通りには並ばないですね。そりゃそうか。

```lang:Collatorの比較
Collator myCollatorJP = Collator.getInstance(Locale.JAPANESE);
myCollatorJP.compare("あ", "a"); // -1

Collator myCollatorEN = Collator.getInstance(Locale.ENGLISH);
myCollatorEN.compare("あ", "a"); // 1

Collator myCollatorCH = Collator.getInstance(Locale.CHINESE);
myCollatorCH.compare("あ", "a"); // 1
```

##2016/05/30追記
今度はロケールを指定しつつ、単なるStringの配列の比較ではなく、自分で定義したデータ型のプロパティ同士で比較する必要が出てきました。

```lang:Collatorしてプロパティで比較
Collator myCollatorJP = Collator.getInstance(Locale.JAPANESE);
Collections.sort(data, new Comparator<MyData>() {
    @Override
    public int compare(MyData data1, MyData data2) {
        return collator.compare(data1.name,data2.name);
    }
});
```

てな感じで、わりと柔軟にいけそうです。
NetBeans8を使ったOracle JETのチュートリアル

[Getting Started with Oracle JET Applications](https://netbeans.org/kb/docs/webclient/ojet-gettingstarted.html#settingUpIntermodular)

新しいモジュールの作り方と、Orace JETが提供しているモジュールの使い方を解説している。

モジュールがjsとhtmlファイルに分離している。これはJavaプログラマには作りやすく判りやすいと思う。

Orace JETが提供しているモジュールを使うときは[Cook Book](http://www.oracle.com/webfolder/technetwork/jet/uiComponents-formControls.html)で公開されているコードを改変してコピペする。

Cook Book のページではソースコードの改変を試すことができる。Cook Bookに表示されているソースを書き換えてApply Changesボタンをクリックすると書き換えた内容がCook Bookに反映されるのでモジュールの動作確認は楽。

Oracle JET ではKnockout.jsが使われているので以下のサイトで勉強しよう。
[Knockout日本語ドキュメント](http://kojs.sukobuto.com/)

[Getting Started with Oracle JET Applications](https://netbeans.org/kb/docs/webclient/ojet-gettingstarted.html#settingUpIntermodular) を終わらせればViewModelのjsとViewのhtmlの作り方は理解できるでしょう(同じフィル名のjsとhtmlを作って、そのファイル名でデータバインドするだけ)。そうなれば[Knockout日本語ドキュメント](http://kojs.sukobuto.com/)のチュートリアルも簡単に実行できるはず。
Oracle JETはrequire.jsを使ってモジュール化を行っているのでViewModelの定義はrequire.jsのdefineを使うように修正する必要あり。

Knockout日本語ドキュメントのチュートリアルを実装してみた例はこちら。
https://github.com/mmatsuoka/CustomerVisualizer
NetBeansのプロジェクトとして読み込み、knouckout.htmlを実行する。


Knockout.js のほかにReact.jsやMithril.jsなども触ってみましたが、ファイル単位で明確に機能分けできるKnockout.jsが一番理解が容易でした。
PHP Session基本

#■ Sessionとは？
ウェブからアクセスするユーザーごとに値を作ってユーザーを区別するために使われるものです。
ウェブサーバーにアクセスするとセッションが生成され、この値でユーザーを区別し、
同じウェブサーバー内で値を共有することができます。

##Sessionの使い方
```lang:PHP
session_start();
$_SESSION["名前"] = "値";
```
####session_start()は「<?php」の次の行に書きます。

## Sessionの例

```lang:PHP
$_SESSION["name"] = "123";
echo $_SESSION["name"];
```
##### 結果 : 123

##Sessionの削除
使い切ったセッション、もう使わないセッションに関しては削除することができます。

```lang:PHP
session_destroy(); //全てのセッションを削除する
unset($_SESSION["name"]); //nameというセッションのみ削除する
```
三項演算子


三項演算子とは、条件式をif, else, endを使わずに記述する方法です。
【真偽値式】 ? 【真の場合に評価する式】 : 【偽の場合に評価する式】という記述で条件式を書くことが出来ます。

`<p><%= @group.detail.blank? ? "このグループの説明はありません" : @group.detail %></p>`

真の場合は"このグループの説明はありません"を表示し、偽の場合は@group.detailを表示
Ruby の CSV クラスで CSV::MalformedCSVError になった行を得る

`CSV` クラスのインスタンスは、CSV データを持つ IO オブジェクトを `@io` というインスタンス変数で保持しています。
また `CSV` クラスのインスタンスはいくつかの IO メソッドを `@io` に委譲しています。

```ruby:csv.rb
  ### IO and StringIO Delegation ###

  extend Forwardable
  def_delegators :@io, :binmode, :binmode?, :close, :close_read, :close_write,
                       :closed?, :eof, :eof?, :external_encoding, :fcntl,
                       :fileno, :flock, :flush, :fsync, :internal_encoding,
                       :ioctl, :isatty, :path, :pid, :pos, :pos=, :reopen,
                       :seek, :stat, :string, :sync, :sync=, :tell, :to_i,
                       :to_io, :truncate, :tty?
```

ということで、以下の様な感じで malformed な(物理)行を抽出する事ができました。


```ruby:test.rb
require 'csv'
require 'tempfile'

Tempfile.create('malformed-csv') do |temp|
  temp.write(<<EOF)
id,name,value
"1","NAME","VALUE"
"2","NAME","VALUE"
"3",NAME"","VAL
UE"
EOF
  temp.flush

  processed_position = 0
  begin
    csv = CSV.open(temp.path)
    csv.each do |_|
      processed_position = csv.pos
    end
  rescue CSV::MalformedCSVError
    aborted_position = csv.pos
    io = csv.to_io
    io.seek(processed_position)
    p io.read(aborted_position - processed_position)
  end
end

__END__
"\"3\",NAME\"\",\"VAL\n"
```
カラムが空欄の場合のみビューファイルに文を表示する

モデルファイルに以下のように記述し、
`
def full_profile?
    avatar? && family_name? && first_name? && family_name_kana? && first_name_kana?
end`

ビューファイルに以下を記述
`<% unless current_user.full_profile? %>
表示する文
<% end %>`
Watson IoT Platform - Node-RED - Tweetしてみる

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)でIoTアプリを準備しました。

#Node-REDからTwitterへつぶやいてみます
1. IoTフローのワークスペースを開きます。
2. 画面左側のパレットの「social」セクションのtwitterのノードのうち、ノードの左側に小さい白い四角が付いている（＝Twitterへ出力する）ノードをドラッグ＆ドロップでワークスペースに置きます。
3. Twitterノードをダブルクリックで開き、Twitter IDの右側の鉛筆アイコンをクリックします。 
![スクリーンショット 2016-05-20 14.11.00.png](https://qiita-image-store.s3.amazonaws.com/0/125842/a89d361c-f21e-af48-8ac0-6c3f9bae36e0.png)

4. 「Add new twitter-credentials config node」ウィンドウの「Click here to authenticate with Twitter.」ボタンを押して、ブラウザで使用しているTwitter IDでの認証を要求します。
5. Twitterの相互認証の画面で「連携アプリを認証」を選択します。
![スクリーンショット 2016-05-20 14.12.08.png](https://qiita-image-store.s3.amazonaws.com/0/125842/93878f2c-a5a9-88e8-71ef-95a529c98e34.png)

6. `Authorised - you can close this window and return to Node-RED` と表示されたらこのタブを閉じてNode-REDの画面へ戻ります。「Add new twitter-credentials config node」で「Add」を押し、「Edit twitter out node」を「OK」でTwitter IDの設定を保存します。
7. IoTフローの「danger」と書かれているオレンジ色のtemplateノードの右端から線を引き出してTwitterノードの左側へ接続します。
![スクリーンショット 2016-05-22 11.22.17.png](https://qiita-image-store.s3.amazonaws.com/0/125842/bd379dcb-24f6-09d6-96b8-36e39de09cb5.png)

8. 画面右上の赤い「Deploy」ボタンを押してクラウド上のIoTアプリへ反映します。
9. 必要に応じてfunctionセクションの「delay」ノードを挿入して、５秒間隔などで送付されるようにして、温湿度計シミュレーターの値を変化させ、Twitterへつぶやかれるかを確認します。
Railsのデザインパターンの自分用まとめ


- [Railsを責務に応じてリファクタリングするための9つのパターン](http://post.simplie.jp/posts/32)
- [DHHはどのようにRailsのコントローラを書くのか](http://postd.cc/how-dhh-organizes-his-rails-controllers/)
PostgreSQLのsource版で日本語を表示させる場合

普段あまり日本語で出力させる機会がないので少しハマっていました。

# configureオプション
ポイントは最後の**--enable-nls**というオプション

```
$ ./configure --prefix=/home/ikki/local/pg952/pgsql --with-pgport=5432 --enable-debug --enable-thread-safety --enable-cassert --with-libxml --with-libxslt --enable-nls
$ make
$ make install
```

# PostgreSQLのDBクラスタを作成
make install後、initdbでDBクラスタを作成する。

```
$ initdb -D ~/local/pg952/data --no-locale --encoding=UTF-8
$ initdb -D ~/local/pg952/data --no-locale --encoding=utf-8
The files belonging to this database system will be owned by user "ikki".
This user must also own the server process.

The database cluster will be initialized with locale "C".
The default text search configuration will be set to "english".
・・・
```

# PostgreSQLの設定ファイルを編集
しかし、このままではサーバログは英語表記のままです。

```
$ pg_ctl -D ~/local/pg952/data start
server starting
LOG:  database system was shut down at 2016-05-20 13:58:36 JST
LOG:  MultiXact member wraparound protections are now enabled
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started
```

なので、以下のように設定ファイルを編集する必要があります。

```
$ vi ~/local/pg952/data/postgresql.conf
lc_messages=ja_JP.UTF-8
```

あと、LANG=Cだと文字化けするので適宜変更しておきます。

```
$ export LANG=ja_JP.UTF-8
```

# PostgreSQLを起動して表示を確認
起動時に以下のように日本語の表示がされていればOK

```
$ pg_ctl -D ~/local/pg952/data start
サーバは起動中です。
LOG:  データベースシステムは 2016-05-20 14:02:28 JST にシャットダウンしました
LOG:  MultiXact member wraparound protections are now enabled
LOG:  データベースシステムの接続受付準備が整いました。
LOG:  自動バキュームランチャプロセス
```

おわり。
プロキシのテストで時々陥る罠（ルーティング）

Linux (RHEL 7.0など)での話。

# 問題
プロキシの機能や性能などの試験のために、`iperf3`を走らせることがある。いろんなノードで。

すると、クライアント－サーバ間でプロキシノードを経由するように設定していたはずのルーティング設定がいつの間にか無効になってすまうことがある。（なお、これら全てのノードは同一ネットワークセグメントにある）

厄介なことに、 ルーティング設定そのものが消えているわけではないので、 `ip route show` なんて実行してみたところで、原因が見えてこない。ついでながら、`ip route show cache`も有益な情報は与えてくれなかった。

# 対策

## IPv4の場合
1. accept_redirects を無効にする。allと該当インタフェースの両方。片方だと効かない。
2. ルーティングの再設定

たとえば、それぞれのIPアドレスが

- client : 192.168.0.3 (eth0)
- proxy  : 192.168.0.4 (eth0)
- server : 192.168.0.5 (eth0)

だとすると、

```shell-session:client
client# sysctl -w net.ipv4.conf.all.accept_redirects=0
client# sysctl -w net.ipv4.conf.eth0.accept_redirects=0
client# ip route del 192.168.0.5 via 192.168.0.4
client# ip route add 192.168.0.5 via 192.168.0.4
```
```shell-session:server
server# sysctl -w net.ipv4.conf.all.accept_redirects=0
server# sysctl -w net.ipv4.conf.eth0.accept_redirects=0
server# ip route del 192.168.0.3 via 192.168.0.4
server# ip route add 192.168.0.3 via 192.168.0.4
```
のようにしてやる。

この設定を永続的なものにしたい場合は`/etc/sysctl.conf`に書くのだが、自分だけのホストではないので今回はそこまではしない。

## IPv6の場合
（ついでの時に追記予定）

---
Qiita初投稿。
jade でプレーンテキストを改行してインデントをつける無理やりな方法

```jade:jade
div
  //- 改行と必要なだけのインデントを記述
  ='\n  '
  | <p>サンプル</p>
```

```html:html
<div>
  <p>サンプル</p>
</div>
```
Centos7 Amarok Music application install

#[Amarok](https://amarok.kde.org/) Music application

```lang:command
yum -y install --enablerepo=epel amarok
```
本体のインストールを終えて、mp3再生しようとすると
mpeg-1 leyer 3 のコーデックがないと言われる。

VLCでLameとかは入ってるのですが、なにか不足なようだ。

ここに情報がありました。
[Centos7下Amarok播放mp3](http://m.blog.csdn.net/article/details?id=47815719)

#GStreamerが必要

```lang:command
yum -y install --enablerepo=nux-dextop gstreamer gstreamer1 gstreamer-ffmpeg gstreamer-plugins-good gstreamer-plugins-ugly
```
###GStreamerってなんだろう？
[GStreamer wiki](https://ja.wikipedia.org/wiki/GStreamer)
ここにAmarokの説明もありました。

#無事再生出来ました。

![Screenshot from 2016-05-20 13-24-37.png](https://qiita-image-store.s3.amazonaws.com/0/71525/17042798-e8e3-d4f1-640e-a68950f997d5.png)
Javaで2つのFileクラス間の相対パスを取得する

ぐぐっても検索トップの方に絶対パスから相対パスに変換する方法が出ないので、メモ代わりに書いておきます。

```java
import java.io.File;

File child = new File("hoge/fuga/foo/bar.txt");
File parent = new File("hoge/fuga");

String relativePath = parent.toURI().relativize(child.toURI()).toString();
System.out.println(relativePath); // prints "foo/bar.txt"
```

以上
テストヘルパーが増えてくるとconfig.includeするのが大変めんどうです


## こう書けます

```rb
# spec/support/user_helper.rb

module UserHelper
  module Features
    def help_foo
    end
  
    def help_bar
    end
  
    def help_baz
    end
  end
  
  module Requests
    def help_bar
    end
  end
end

RSpec.configure do |config|
  config.include UserHelper::Features, type: :feature
  config.include UserHelper::Requests, type: :request
end
```

テストを支援するgemを入れると（例えば`factory_girl`）

```rb
RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
end
```

`spec/rails_helper.rb`の`configure`ブロックで、ヘルパーモジュールを`include`するので
テストで使うモジュールは全てここで`include`しないといけないのかなと思ってましたが
そんな事はなく、ヘルパーモジュール本体から`include`できます。

## 参考

[clearanceで生成できるテストに含まれるヘルパー](https://github.com/thoughtbot/clearance/blob/master/lib/generators/clearance/specs/templates/support/features/clearance_helpers.rb)
PHP文字列を探す (strpos/strrpos)

# ■ strpos/strrposとは？
strposは検索する文字列の前から検索して探す単語が何番目にあるかその位置をリターンします。
strrposは検索する文字列を後ろから検索して探す単語が何番目にあるかその位置をリターンします。
両方の関数は英語の大文字、小文字を区別するので注意が必要です。

## strposの使い方
```lang:PHP
strpos([検索する文字列], [探す単語], [検索開始位置]);
```

## strrposの使い方
```lang:PHP
strrpos([検索する文字列], [探す単語], [検索開始位置]);
```

こちらの関数は検索開始位置を省略することができます。

## strposの例
文字列「hello world」から「world」が何番目にあるのかを調べてください。

```lang:PHP
echo strpos("hello world", "world");
```
##### 結果 : 6

## strrposの例
文字列「hello world! world!」から「world」が何番目にあるのかを調べてください。

```lang:PHP
echo strrpos("hello world! world!", "world");
```
##### 結果 : 13
amazon-linuxのdocker imageを10分で作る

## TL:DR
sshでアクセスできるamazon-linuxのdocker imageを10分くらいで作る.
[既存の方法](http://dev.classmethod.jp/cloud/aws/docker-serverspec-configspec-ci/)と異なり、aws上での操作なく、dockerだけで完結する.
なお、ここで利用している amazon-linuxのバージョンは2014年のもので、かなり古い.
動作確認以外には用いないこと.

## 背景
itamaeの確認環境が欲しかったので、dockerでささっと環境を構築しました.
1時間くらいしか勉強してないので、色々と間違ってるところあるかもです.

## docker install
https://www.docker.com/products/docker-toolbox
↑からdockerをinstallする

## amazon-linuxのimageをpullする
```
docker pull vettl/amazon-linux
```

## dockerfileを作成する

```
mkdir amazon-linux-docker
cd amazon-linux-docker
cp ~/.ssh/#{authorized_key} ./
touch Dockerfile
```

```Dockerfile
FROM vettl/amazon-linux

RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
RUN sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config
RUN passwd -f -u ec2-user

RUN service sshd start
RUN service sshd stop

ADD authorized_keys /home/ec2-user/.ssh/authorized_keys
RUN chmod 600 /home/ec2-user/.ssh/authorized_keys
RUN chown ec2-user:ec2-user /home/ec2-user/.ssh/authorized_keys

EXPOSE 22
```

## sshでaccessできるimageを作成する
```
docker build -t local/amazon-linux .
```
## docker containerを起動する

```
% docker run -d -p 10022:22 local/amazon-linux /usr/sbin/sshd -D
```
## containerに対してsshでアクセスする

```
% ssh -i ~/.ssh/keyname -p 10022 ec2-user@192.168.99.100       [13:13:15]
Last login: Fri May 20 04:13:05 2016 from 192.168.99.1

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2014.03-release-notes/

```
Sinatraで環境変数(environment)のセット

## 概要
sinatraで、webアクセス、Rake、Rspec実行時に使う環境変数(environment)を、
それぞれどうやってセットすればよいかのメモ。

## 環境
- ruby 2.2.3p173
- sinatra-1.4.7
- Apache
- Passenger


## webアクセス
Apacheのconfで、RACK_ENVを設定する。

```httpd.conf
SetEnv RACK_ENV development
```

アプリケーションのファイルで、下記のように環境変数をセットして使う。

```
(**snip**)

set :environment, ENV['RACK_ENV'].to_sym || :development

ActiveRecord::Base.configurations = YAML.load(ERB.new(File.read("db/database.yml")).result)
ActiveRecord::Base.establish_connection(settings.environment)

(**snip**)
```

## Rake tasks

taskファイル

```
namespace :sample do
  task :environment do
    puts Sinatra::Application.environment
  end

  task :task1 => :environment do
  end
end
```

rakeコマンド実行時に、下記のように引数に環境変数を渡す。
他の方法ないのかな？

```
$ RAILS_ENV=production bundle exec rake sample:task1
```

## RSpec

spec_helper.rbの先頭に、`ENV['RACK_ENV'] = 'test'`と定義する。
余りかっこよくないが、色々と調べてみたところ、こうやってる人が多いっぽい。
これで、webのテスト時も、rake taskのテスト時も、環境変数に`test`がセットされた。

```lang:spec/spec_helper.rb
ENV['RACK_ENV'] = 'test'

(**snip**)

ActiveRecord::Base.configurations = YAML.load(ERB.new(File.read("db/database.yml")).result)
ActiveRecord::Base.establish_connection(:test)

(**snip**)
```

まだすっきりしない部分もありますが
以上

[参考]
https://shoyan.github.io/blog/2016/05/02/what-is-rack-env-and-unicorn-and-sinatra/
整数, 小数, 浮動小数点数の正規表現

# 概要
シェルを使って数値データファイルの整形を行っている際，正規表現で詰まったのでメモ代わりに．
整数(1,2,3,...)と小数(1.1,2.5,...)と浮動小数点数(1.0E+10, 1.6e-19, ...)が入り混じったファイルから数値を抜き出す正規表現．


# 正規表現
~~以下の様な正規表現で抜き出せた．
`[+-]?[0-9]+[\.]?[0-9]*[eE]?[+-]?[0-9]*`
実際にはこれを`grep`なり`egrep`なりに突っ込んで抜き出す．~~

:::note info

<details><summary>コメントでいただいた指摘を受けた追記について</summary>

**2016/8/30追記**
@hikozaru_3 さんより，上の正規表現だと`1+1`や`5-2`のようなケースもマッチしてしまうという指摘がありました．
以下の正規表現が望ましいです．
`[+-]?[0-9]+[.]?[0-9]([eE][+-])?[0-9]`

また，これに併せてテスト用のスクリプトを修正したため，今まで記載していたセクションの下に修正後のものを追記します．

**2017/6/22追記**
@scivola さんより，`1e+`のような「指数もどき」もマッチしてしまうという指摘がありました．
上のものよりも以下のもののほうが望ましいかと思われます．
`[+-]?[0-9]+(\.[0-9]*)?([eE][+-]?[0-9]+)?`

こちらの正規表現でのテスト結果ですが，現在多忙につき割愛（もしくは後日改めて追記）させていただきます...:cry:

**2018/12/2追記**
`.123`のような小数点以下のみで数値を表現している場合は
`[+-]?([0-9]+(\.[0-9]*)?|\.[0-9]+)([eE][+-]?[0-9]+)?`
となるようです．
@Nabetani さんありがとうございます！！
テスト結果も編集しました．今あらためて見ると少し気持ち悪い結果もありますね。

</details>

:::
<details><summary>以前のコード</summary>

## ~~例(正規表現にミスあり)~~
テスト用のスクリプト． `egrep`の`-o`オプションで条件に一致した部分だけを出力する．

```bash:testscript
#!/bin/bash
file=$1

for line in `cat ${file}`
do
    echo ${line}
    N=`echo ${line} | egrep -o '[+-]?[0-9]+[\.]?[0-9]*[eE]?[+-]?[0-9]*'`
    echo "result = ${N}"
done
```

で、これにこんな感じのテストケースを放り込む

```lang:testcase
1
58
-5
2.8
-3.39
73.098abh
1.0e+29
1.6E-16
abc39
num=395479.27
```

で、実行結果

```text:result
>./numtest.sh testfile.txt
1
result = 1
58
result = 58
-5
result = -5
2.8
result = 2.8
-3.39
result = -3.39
73.098abh
result = 73.098
1.0e+29
result = 1.0e+29
1.6E-16
result = 1.6E-16
abc39
result = 39
num=395479.27
result = 395479.27
```

正しく数値だけ抜き出せてると思う

</details>

## 例(2018/12/2修正版)

というわけで修正したシェルスクリプトです．

```bash:testscript
#!/bin/bash
file=$1

for line in `cat ${file}`
do
    echo ${line}
    N=`echo ${line} | egrep -o '[+-]?([0-9]+(\.[0-9]*)?|\.[0-9]+)([eE][+-]?[0-9]+)?'`
    for res in $N
    do 
        echo "result = ${res}"
    done
done
```

これに併せてテストケースも増やしました．今回は1つの行に複数の数値があった場合も対応できるようにしています．

```lang:testcase
1
58
-5
2.8
-3.39
73.098abh
1.0e+29
1.6E-16
abc39
num=395479.27
1+1
234gh290
432-84
235hk23.4e-6
1e+
3e-
.123
.23h5
hoge
```

以下，結果．

```text:result
1
result = 1
58
result = 58
-5
result = -5
2.8
result = 2.8
-3.39
result = -3.39
73.098abh
result = 73.098
1.0e+29
result = 1.0e+29
1.6E-16
result = 1.6E-16
abc39
result = 39
num=395479.27
result = 395479.27
1+1
result = 1
result = +1
234gh290
result = 234
result = 290
432-84
result = 432
result = -84
235hk23.4e-6
result = 235
result = 23.4e-6
1e+
result = 1
3e-
result = 3
.123
result = .123
.23h5
result = .23
result = 5
hoge
```

今あらためて結果を確認すると、`.23h5`みたいなケースから`.23`と`5`が抜き出されるのは若干気持ち悪いですね．．．
やみくもにググるより、目の前に有益な情報があるんだから。という話

ここ最近、トラブルシューティングなどに時間を費やしたので、自戒の意味で。


# コマンドラインからはSSH接続できるのに、MySQLクライアントからは接続できない

という事象にぶちあったた。そこに至るまでに・・・。

1. Vagrantを使って、公式配布されているboxから仮想サーバを作成しVirtualbox動かす
2. 1.の仮想サーバ内にhttpd,PHP,MySQLなどをインストールし、新しいboxとして出力した
3. 2.で出力したboxをVagrantに取り込み、そこから新しいプロジェクト？を生成した。
4. 3.のプロジェクトにSSH接続などを実施した
5. そこに、SequelProで接続しようとしたら、ポート転送に失敗した。

といったことがありました。

## 一つ一つは多くの人が経験してると思う。でもこの組み合わせはそんなにないだろう

上記の 1. から5. にかけて、一つ一つのことは、多くの人が試みて、その内容をインターネット上に公開しているだろう。
ただし、上記に取り上げた内容そのままにやっている人はそれほどいないだろう。もしかしたら私だけかもしれない。

## ネット上の大海に、求める答えそのものが存在する可能性は天文学的数字・・・だと思う

環境がバラバラだったり、断片的な情報は大量にヒットするはずだ。
だが、それが私の（あなたの）直面する問題にピッタリ合致するとは限らない。

多くの場合、複合的な問題の一部にはヒットするくらいで、残りの部分には無効な内容・・・というケースは山ほど経験したことと。

# 今回のMySQLクライアントで接続できない問題に戻ると・・・。


```txt:エラーメッセージ（一部省略）
SSHポート転送が失敗しました
SSH経由のポート接続が拒否されたため、ホスト　192.168.xxx.yyy　に接続できませんでした。

MySQLホストがTCP/IP接続を許可する設定でかつ、トンネリングする〜（中略）
また、ポートが正しく必要な権限があるかも確認してください。
エラー情報にSSHデバッグログが表示されており、（中略）

MySQLの応答： Lost connection to MySQL server at 'reading initial communication packet' system error: 0
```

なお、SSHデバッグログを見ると

```txt:SSHデバッグログ
debug1: Requesting no-more-sessions@openssh.com

debug1: Entering interactive session.

debug1: Connection to port 65189 forwarding to 127.0.0.1 port 3214 requested.

debug1: channel 4: new [direct-tcpip]

channel 4: open failed: connect failed: Connection refused

debug1: channel 4: free: direct-tcpip: listening port 65189 for 127.0.0.1 port 3214, connect from 127.0.0.1 port 65192 to 127.0.0.1 port 65189, nchannels 5

debug1: Connection to port 65190 forwarding to 192.168.xxx.yyy port 3214 requested.

debug1: channel 4: new [direct-tcpip]

channel 4: open failed: connect failed: Connection refused

debug1: channel 4: free: direct-tcpip: listening port 65190 for 192.168.xxx.yyy port 3214, connect from 127.0.0.1 port 65194 to 127.0.0.1 port 65190, nchannels 5

```

問題。

なぜ、SSHポート転送ができなかったのでしょうか？


# 答えは３つあった。中には明らかに固有の問題もあった。

1. MySQLのユーザ設定で、サーバ外からの接続に対応したものがなかった
2. iptablesで許可していなかった
3. そもそも、ポートの設定が正しくなかった

3つの項目のうち1.に関しては、よくある話なので言及しているケースも多い。2.に関しても、MySQLy用のポートを開通させることに関しては1.ほどでないにせよ、言及があるはず。

だが3.のポート設定が間違っていた。というケースに対応したネット上の情報は、それほどないはずである。

# だから・・・

ネット上には、ピッタリ合うような解決のための情報が転がっているわけではない。

この手の技術情報を公開するときには、実施環境とその環境設定がどのような影響を及ぼすかといったこと。何を実現したかったのかを記載するようにしよっと。
プログラムで親ビューの上下左右マージンゼロで制約をつける（Swift）

WKWebView など Interface builder 上で追加できないビューを self.view に上下左右マージンゼロで貼り付けたい時にプログラムから指定する際のコード。

どこでも使えるように UIView の Extension として作成した。


[UIView+AutoLayout.swift](https://gist.github.com/tanabee/447835d9ef80fc749ee6871e2d2d4462)


```swift
extension UIView {
    // 親ビュー (parent) に対して上下左右マージンゼロの指定をする
    func applyAutoLayoutMatchParent(parent: UIView, margin: CGFloat = 0) {
        self.translatesAutoresizingMaskIntoConstraints = false
        let attributes: [NSLayoutAttribute] = [.Top, .Left, .Right, .Bottom]
        let constraints = attributes.map { (attribute) -> NSLayoutConstraint in
            return NSLayoutConstraint(
                item: self,
                attribute: attribute,
                relatedBy: .Equal,
                toItem: parent,
                attribute: attribute,
                multiplier: 1.0,
                constant: margin
            )
        }
        parent.addConstraints(constraints)
    }
}
```

使い方は以下のように呼び出す。

```swift
webView.applyAutoLayoutMatchParent(self.view)
```

8 px あけたいなどの場合は、以下のように margin 指定。

```swift
webView.applyAutoLayoutMatchParent(self.view, margin: 8)
```
Macユーザーが会社のWindowsで行ったとりあえずの設定

:arrow_down: とりあえずやったこと(※オススメ順) 

## ```無変換```キーを全角切り替え, ```変換```キーを半角切り替えに変更
半角と全角の切り替えって日本人なら多用すると思います。
にも関わらずMacとWinでは動作が違うんですよね... :sweat: 
### メリット
* Macを使っている時に、半角/全角切り替えで```1```を押すことがなくなる :blush: 
* 2押しても3回押しても変換先は全角か半角かのどちらか1つ :smile: シンプル!
* 左右の親指で押せるのでホームポジションが維持しやすい :expressionless: 主観

###デメリット
* 他人のPCでミスる
  
<br>

## ```Caps Lock```キーを```Ctrl```キーへ変更

今使っているキーボードがPFUのHHKB(```A```の横が```ctrl```)なので
それに合わせたかったのも大きいです。 :sweat_smile: 
### メリット
* Vimやサーバー・VMへのSSH, ```ctrl```を含むショートカットキーを使うときMacと同じ感覚
* CapsLockを間違えて押すことがなくなる

### デメリット
* CapsLockを使うことができなくなる :flushed: 私はここ10年使ったことがありませんが...
* 他人のPCでミスる

## ```Chrome```でブラウジング時にジェスチャーで進む・戻る

Macのトラックパッドは優秀で、
2本指のジェスチャーで戻ったり進んだり出来ていいですよね :kissing_smiling_eyes: 
win10と対応キーボードなら同じことが出来るらしいんですが、
会社のPCはwin7で昔のDELL。
前は右クリック長押しのジェスチャー機能を使っていました。

今は```alt```+```→```で"進む"```alt```+```←```で"戻る"です :kissing_smiling_eyes: 

### メリット
* 早い、かっこいい?

### デメリット
* 他人のPCでミスる

## 設定方法の紹介(引用)
[Qiita - Mac ユーザのための親指付近（かな・変換・無変換）のキーバインドを簡単に変更して Windows での文字入力を快適にする](http://qiita.com/megu_ma/items/3c34f760bf0bdd6ba890)

[Qiita - Caps Lockを左Ctrlにする（Windows）](http://qiita.com/makisyu/items/fe44154aa0b8659d382f)
:arrow_upper_right: ※私はレジストリを書き換えましたがこちらのソフトを使う方が簡単っぽいです。

[Chrome用マウスジェスチャー「CrxMouse」](http://hep.eiz.jp/201304/chrome-crxmouse/)
PHPDocコメントをCakePHP2の規約に合わせるためにPhpStormで一括置換



CakePHP2のコーディング規約ではPhpDocコメントはインデントしないことになってます。
下記の様な感じ


```php

/**
 * Class Foo
 */
class Foo {

/**
 * bar
 * 
 * @return void
 */
	public function bar() {
		// TODO
	}
}

```

こんなフォーマットをPhpStormで設定できれば良かったんだけど、設定できなかったので置換で対応することに(^^;

というわけで一括置換で正規表現にチェックいれて、下記条件で置換すれば一発でインデント無しになります。

実行前にReformatCodeしとくといい。

置換対象

```
^\t(/\*\*| \*)
```

置き換え

```
$1
```


# sed でやるなら

```
sed -i -e 's/^\t\(\/\*\*\| \*\)/\1/g' filename.php
```

-i オプション使ってるので上書き保存します。
権限がなくてcreatedbができなくてしばらくはまっていました。

（※完全自分用メモ）

ユーザー
- postgres （権限ある）
- my_user （権限ない）

という状態で、ユーザーが「my_user」のdbを作成したいだけです。

結論としては。

```
sudo su postgres
psql -c "create database db_name owner my_user"
```

という感じでできました。


```
createdb -U my_user -h localhost -d db_name
```

とかで行けなくて、しばらくさまよいました。

### 権限をしらべる

```
select rolname, rolcreatedb from pg_roles;

    rolname    | rolcreatedb
---------------+---------------
 postgres      | t
 my_user       | f
```

これが`f`ということは、createできないんだろうなぁ。


## 追記
毎回`sudo su`とか面倒くさいの、権限を変えちゃいました。

```
sudo su postgres
psql -c "alter role my_user CREATEDB"
```

これで、my_userでcreatedbができるので、`rake db:test:clone`とか、やりたかったことができる。

追記終わり。
WordPressの記事ページで、特定のカテゴリーに属しているかどうかの判定をかける

まず試したのは以下。

##in_category( )

https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/in_category

（↓英語版 ※英語版の方が最新）
https://developer.wordpress.org/reference/functions/in_category/


ただ、
よく考えたら、
今回は、**カスタム投稿のターム（投稿のカテゴリとは別）**だった。

なので、

##has_term( )

http://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/has_term

（↓英語版）
http://codex.wordpress.org/Function_Reference/has_term

ここで間違えたのは、

```
<?php if ( has_term( 'カスタム投稿名', 'タームのスラッグ' ) ) : ?>
// 注意:上記は間違い
```

としてしまったことです。
表示されなくて焦った。正しくは、

```
<?php if ( has_term( 'タームのスラッグ', 'タクソノミー名' ) ) : ?>
```

です。

ややこしいなー。なので、まとめておく。

- カスタム投稿名...register_post_type()で作成した、投稿タイプの名前。 ※投稿タイプは、標準では投稿とか固定ページとかがある。
- タクソノミー名...register_taxonomy()で作成した、「カテゴリ」や「タグ」のようなもの
- ターム名........タクソノミーに追加したカテゴリ名のこと。例えば、「デバイス」っていうタクソノミー（大カテゴリ？）があったら、ターム名は「PC」やら「スマートフォン」やら「タブレット」になる。
認証サーバー


# 認証サーバーとは

* ユーザーIDとかパスワードとかで認証をするサーバー
* 複雑なシステムでは、認証サーバーに認証処理を集中させる

# RADIUS

* アクセス可能ポイントのサーバーと認証サーバー（RADIUSサーバー）を分ける仕組み
* 外から直接認証サーバーにアクセスされてクラックされることを防ぐ

# Kerberos

* レルムという概念を導入した認証モデル

## レルム

* 認証システムに参加するクライアントおよびサーバーの鍵をKDC（鍵発行局）に登録しておく
* KDCが管理する書くノード（プリンシパル）の集合を「レルム」と呼ぶ

![Kerberos](http://www.infraexpert.com/network/kerberos1.gif)
（図: [http://www.infraexpert.com/study/security18.html](http://www.infraexpert.com/study/security18.html)）

* KDCは以下の3つから構成されています
	* AS（認証サーバー）
	* TGS（チケット発行サーバー）
	* KDB（鍵データベース）

## Kerberosの認証プロセス

1. プリンシパルがAS（認証サーバー）にチケットを要求
2. ASはKDB（鍵データベース）を検索し、登録されたプリンシパルなら共通鍵で暗号化したチケットを返信
3. プリンシパルはチケットをTGSに送信
4. TGSはサーバー使用許可証とサーバー通信に使う共通鍵を返信
5. 認証完了。サーバー通信開始

# メモ

* ActiveDirectory とかは Kerberos ？
pyenvで最新の安定版Pythonをインストールする（2系3系とも）

下記ワンライナーにて

```sh
pyenv install $(pyenv install -l | grep -v - | tr -d ' ' | grep '^2' | tail -1) && \
pyenv install $(pyenv install -l | grep -v - | tr -d ' ' | grep '^3' | tail -1) && \
pyenv rehash
```
Railsをvimでやってる人向け Controllerやmodel、Partial先などを行き来する方法


参考：[Vimで快適なRailsライフを](http://qiita.com/y_uuki/items/57e726312ffe47592867)


> rails.vimの機能まとめ

> :R(model/controller/view)
カレンドバッファに対応したModelやControllerにとべます。
例えば，UsersControllerを開いているときに，:Rmodelすると/app/models/user.rbにとべます．

> :R(model/controller/view) name
カレントバッファに対応していないファイルを開くために使う．
例えば，/app/models/qiita.rbにとびたいときは，:Rmodel qiitaします．ちなみにname部分は補完が効きます．
ちなみにR[command]のcommandにはmodelやcontroller以外に
helper/spec/javascript/stylesheet/unittest/plugin/lib/task/layout/migration/schema
などを指定できます．

> :RT，:RS，:RV，:RD
上記コマンドのRまたはAの直後にオプションをつけるとファイルを開く方法を指定できます．
:RT : 新規タブ
:RS : 画面を水平分割
:RV : 画面を垂直分割
:RD : カレントバッファにロード

> gf カーソル位置のシンボルに応じて定義元にジャンプしてくれます．
例えば，Use*r.find_all_by_idでgfするとapp/models/user.rbを開けます．
飛んだ先でCtrlキー + o(おー)、または、Ctrlキー ＋ ^で、戻ってこれます。 

参考元では「C-^ または C-o」って書いてあったんですが、普通に「C」をタイプして動かないじゃん！とジタバタした。

C-oとか書かないで「Ctrlキーと」って書かないとわかんなかった。こういう書き方が一般的なのかしら？
GCMはGCM 3.0を経てFCMへ (Firebase)

**2018-04-10更新**: GCMの完全廃止スケジュール発表のため、更新しました。

[Google I/O 2016](https://events.google.com/io2016/)も開幕し、今日（日本時間）がいよいよ最終日となりました。最初の抽選に外れ、GW中に繰り上がり当選していましたが、結局参加できなかったので、ストリーミング配信やSNSなどを見ていました。

2014年に買収が完了しているFirebaseに関連して、 **Firebase Cloud Messaging** が発表され、即日開始となっているようですので、取り急ぎメモ書きしておきます。

https://developers.google.com/cloud-messaging/android/android-migrate-fcm

> Firebase Cloud Messaging (FCM) is the new version of GCM. It inherits the reliable and scalable GCM infrastructure, plus new features! See the FAQ to learn more. If you are integrating messaging in a new app, start with FCM. GCM users are strongly recommended to upgrade to FCM, in order to benefit from new FCM features today and in the future.

ということなので、Google Cloud Messaging (GCM)を利用している人たちは早めの移行（strongly recommended）が必要のようです。

## C2DM->GCM->GCM 3.0->FCM
- 20xx-xx Android Cloud to Device Messaging (C2DM)がスタート
- 2012-06-xx Google I/O 2012でGoogle Cloud Messaging (GCM)を発表。
- 2014-10-21 Googleがリアルタイムデータベース事業者Firebaseの買収を発表。
- 2015-05-xx Google I/O 2015でiOSデバイス送信へGCM 3.0のリリースを発表。
- 2015-10-20 C2DM完全終了。 (`The C2DM service will be shut down completely on 10/20/2015.` https://developers.google.com/cloud-messaging/c2dm)
- 2016-05-18 Google I/O 2016でFirebase Cloud MessagingおよびFirebase Analyticsを発表。
- 2018-04-10 [GCMのdeprecationを発表](https://developers.google.com/cloud-messaging/android/android-migrate-fcm)。2019-04-11をもって削除されることとなりました。[マイグレーション手順](https://developers.google.com/cloud-messaging/android/android-migrate-fcm)および[GCMとFCMのFAQ](https://developers.google.com/cloud-messaging/faq)を改めて共有。

## Introducing Firebase Cloud Messaging
概要の動画は以下のYouTube動画にあります。(1分4秒)

https://www.youtube.com/watch?v=sioEY4tWmLI

## ウェブサイト

Firebaseのウェブが更新されました。

https://firebase.google.com/

## まとめ

同タイミングで発表されている、無料、無制限のFirebase Analayticsと合わせて、モバイル（含スマートフォン）を含めたユビキタスな情報サービス事業者にとって、FirebaseとFirebase Cloud Messagingは大きな力になりそうです。

Google主催イベント、GCP関連イベントやGCPUGでなんとなくチェックしていましたが、今後はFirebase関連も本腰を入れて取り組む必要が出てきたようです。
ImageMagickの脆弱性(CVE-2016-3714 = ImageTragick)への対応

参考：[ImageMagick の脆弱性 (CVE-2016-3714) に関する注意喚起](https://www.jpcert.or.jp/at/2016/at160021.html)

ここで上がっていた通称 ImageTragick の件。

#脆弱性の概要

海外の[ImageMagick公式](http://www.imagemagick.org/discourse-server/viewtopic.php?f=4&t=29588)で出てた内容を日本語になおしてくれているのが、以下。

* [JVNVU#92998929 ImageMagick に入力値検証不備の脆弱性](https://jvn.jp/vu/JVNVU92998929/)

> delegate 先のコマンドに渡す前のファイル名のフィルタリングが不十分なため、ファイル形式の変換中に任意のコードを実行される可能性がある。
ImageMagick には外部ライブラリを使用してファイルを処理する 'delegate' と呼ばれる機能が存在する。この機能は、設定ファイル delegates.xml で指定されたコマンド名 ('command') と、入力ファイル名や出力ファイル名などのパラメータの値を使って組み立てられた文字列を system() 関数に渡して実行する形で実装されている。パラメータ %M に当てはめる入力値のフィルタリングが不十分なため、シェルコマンドインジェクションが可能である。

とのことで、ImageMagickの

* ImageMagick 6.9.3-10 より前のバージョン
* ImageMagick 7.0.1-1 より前のバージョン

を使用していて、

* delegate関連を使用している場合

に危ないそうです。標準で使っている分には問題なさそう。

# 対応方法

参考：[ImageMagickの脆弱性「ImageTragick」にサクッと対応する](http://qiita.com/nt-uni/items/bb4cc3064a3af857a63e)

>脆弱性検証スクリプト
```
git clone https://github.com/ImageTragick/PoCs.git
cd PoCs
./test.sh
```
ここでUNSAFEがあると脆弱性有り。

だそうです。簡単。
Windows 7 > コントロールパネル項目をキー入力で開く > [Win] > キーワード > リスト選択

http://qiita.com/jTakasuRyuji/items/9b60a37a7308a78c6448
を見ていて「よく使うコマンドなら覚えておけば作業が捗りそう。でも、自分の場合は、すぐに忘れそう」と思った。

自分だったら、以下のようにする。

1. [Winキー] (プログラムとファイルの検索にフォーカスが移る）
2. キーワード入力. (例: イベント)
3. 表示されるうちの「プログラム」または「コントロールパネル」のリストから該当の項目を選択する (例: イベントビューアー)
シェルスクリプトでパスワードに$が含まれている場合のエラー対策

linxuのsshログインパスワードを変更して$が含まれた。
シェルスクリプトで他のサーバにsshでログインしていた場面でエラー発生。
パスワードの指定方式を変更。

NG

```sh
PWD=pass$word
```

OK

```sh
PWD='pass\$word'
```
[備忘録] Node.js関係

# 自分の環境
- Node.js v5.4.0
- npm 3.3.12
- Express 4

# npm start をforeverする方法
https://github.com/foreverjs/forever/issues/540
```
$ forever start -c "npm start" ./
```
絶対パスだと、失敗した。なんでじゃろ

# 80PortでNode.jsを動かすベストプラクティス（in Linux）
http://stackoverflow.com/questions/16573668/best-practices-when-running-node-js-with-port-80-ubuntu-linode
```
$ sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
```
80portでlistenするのではなく、80portから3000portへRedirectさせることで実現する

# Express4でのproduction環境への切り替え
```
$ export NODE_ENV=production && node app.js
```
development環境に戻す時はこう
```
$ export NODE_ENV=development && node app.js
```

# 最初の環境構築（AWS Linux）
```
// gitをインストール
$ sudo yum install git

// nvmをインストール && パスを通しておく
$ git clone git@github.com:creationix/nvm.git ~/.nvm
$ source ~/.nvm/nvm.sh

// Node.jsとnpmをインストール（Stable）
$ nvm install stable
```
xampp環境下でのターミナルコマンドからmysqlの実行

xamppでターミナルコマンドから　mysql -u root -p　と実行しても

`mysql: command not found`

とエラーになる。

パスを通しとけって話かな？（元々Win畑な人間でMacをよう知らん）

```bash
/Applications/XAMPP/xamppfiles/bin/mysql -u root -pahk
```

***
**補足：**

mysqladminの実行

```bash:versionのオプションの実行
/Applications/XAMPP/xamppfiles/bin/mysqladmin version -u root -p

```
c++ builder / bug > Link > LME288の回避策 (2016-05-20版)

```txt:動作確認
C++ Builder XE4
```

http://qiita.com/7of9/items/9c51a3d961c768d8881f
に書いたように、XE4では時々LME288というエラーが出る。
OS再起動などで対処するが、時間が無駄である。

検索したところ、以下の解決方法を見つけた。
http://stackoverflow.com/questions/28929516/c-builder-xe7-lme288-error

> answered Oct 1 '15 at 12:34
Drewski

...
>After a little research on the net, I found the solution. There is a memory problem with ilink32.exe and you need to enable the 3GB memory space at bootup on the computer.
初读 W3C webdriver 协议


https://w3c.github.io/webdriver/webdriver-spec.html

远程控制接口,能够让用户代理实现内省和控制. 本协议是平台和语言中立的.提供了一种外界进程来远程控制实现浏览器行为的功能. 提供了一系列的接口用来发现管理操作 DOM 元素. 它是给 web 内容者用来自动测试网站用的. 而这个动作和浏览器渲染完全分开的两个进程.

- 规约
- 术语
- 接口
- 协议
	- 算法
	- 命令
	- 处理模型
	- 路由请求
	- endpoint
	- 处理错误
	- 协议扩展
- 兼容性
- 回话
- 导航
	- 前进
	- 获取当前 url
	- 后退
	- 转发
	- 刷新
	- 获取 title
- 不可用的 SSL 验证
- 命令上下文
	- 获取窗口
	- 关闭窗口
	- 切换窗口
	- 获取所有窗口
	- 切换 frame 框架
	- 切换到父框架
	- 重置窗口大小和位置
		- 获取大小
		- 设置大小
		- 最大化
		- 全屏
- 元素
- 元素获取
- 元素状态
- 元素交互
- 文档处理
- cookie
- 交互
- 用户提示
- 截图
Microsoft Translator Text APIをNode.jsから使ってみる


[indico記事](http://qiita.com/n0bisuke/items/868b43411078bc2018fb)の流れで機械学習系のサービスを横断的に探していて、以下の記事からMSの翻訳APIを発見しました。
>[(主に)ディープラーニングの成果を利用したAPI集(自分用)](http://qiita.com/shngt/items/966799cc3f7c77a6fa17)

Google翻訳APIは有料だけどMSのは無料のもあるみたいです。

[Microsoft Translator APIを使ってみる](http://qiita.com/kemayako/items/21fe36005e6e729aff77)を参考にしつつ、ここに掲載されていたコードがうまく動作しなかったのでこちら([Windows Translatorで "ArgumentOutOfRangeException: 'to' must be a valid languageというエラーが出るときの対処](http://qiita.com/JunSuzukiJapan/items/e165607ad8b320159423))も参考にして動作を検証したメモです。

##アカウント発行と必要な情報取得

* Microsoft Translatorのページで無料枠にサインアップ https://datamarket.azure.com/dataset/1899a118-d202-492c-aa16-ba21c33c06cb
![](https://i.gyazo.com/726ab7504d79d2446a9481afd2129fd0.png)

* アプリ登録をしましょう。 https://datamarket.azure.com/developer/applications

![](https://i.gyazo.com/5f5f7956c90288cd3b100c1168e8931c.png)

とりあえず試すだけならリダイレクトURLは適当なもので大丈夫です。
`顧客の秘密`って書いてるところが↓のソースコードの`client_secret`になります。クライアントIDはそのまま`client_id`ですね。

## サンプルをNode.jsで動かす。

外部モジュールが無いので、このままコピペで動くとおもいます。
ちなみにNode.jsはv6.0

```app.js
'use strict';

const http = require('http');
const https = require('https');
const qs = require('querystring');

//アクセストーク取得
function getAccessToken(callback) {
    let body = '';
    let data = {
        'client_id': '自分のアプリケーションのクライアントID',
        'client_secret': '自分のアプリケーションのクライアントシークレット',
        'scope': 'http://api.microsofttranslator.com',
        'grant_type': 'client_credentials'
    };

    let req = https.request({
        host: 'datamarket.accesscontrol.windows.net',
        path: '/v2/OAuth2-13',
        method: 'POST'
    }, (res) => {
        res.setEncoding('utf8');
        res.on('data', (chunk) => {
            body += chunk;
        }).on('end', () => {
            let resData = JSON.parse(body);
            callback(resData.access_token);
        });
    }).on('error', (err) => {
        console.log(err);
    });
    req.write(qs.stringify(data));
    req.end();
}

//翻訳 (日本語 -> 英語)
function translate(token, text, callback) {
    let options = 'from=ja'+
                  '&to=en' +
                  '&text=' +
                  qs.escape(text) +
                  '&oncomplete=translated';
    let body = '';
    let req = http.request({
        host: 'api.microsofttranslator.com',
        path: '/V2/Ajax.svc/Translate?' + options,
        method: 'GET',
        headers: {
          "Authorization": 'Bearer ' + token
        }
    }, (res) => {
        res.setEncoding('utf8');
        res.on('data', (chunk) => {
            body += chunk;
        }).on('end', () => {
            eval(body);
        });
    }).on('error', (err) => {
        console.log(err);
    });
    req.end();

    function translated(text) {
        callback(text);
    }
}

//実行
getAccessToken((token) => {
    translate(token, process.argv[2], (translated) => {
        console.log(process.argv[2],'->',translated);
    });
});

```

実行

```bash
$ node app.js こんばんわ
こんばんわ -> Good evening!

$ node app.js めちゃ眠い
めちゃ眠い -> So sleepy
```

こんな感じで結構口語の日本語でも翻訳してくれてけっこう精度の良さを感じますね

パラメータは今回は日本語->英語なので`from=ja&to=en`ですが、英語->日本語にするときは`from=en&to=ja`にしましょう。
rails ajax tips

http://hi54yt.github.io/2016/04/20/rails-ajax-tips/


Rails4，如果ajax请求配后台render nothing: true，ajax的success callback是不会被call的，而是走到error callback里去了，虽然从浏览器的console看是200 OK的。必须写成render nothing: true, status: 200, content_type: 'text/html'，才会走到success callback，有这功夫不如返回个完整json
Gitを使った開発に慣れるまでの学習方法

こんなタイトルですが、未だに違うブランチで作業してそのままコミットしたり、addし忘れたままプッシュしたりしてます。これまで自分がgitについて学んだことを改めて振り返るためにも、備忘録としてまとめます。

# 基本的な学習

## 便利なサイトや書籍

* [Git をはじめからていねいに](https://github.com/Shinpeim/introduction-to-git)
    * タイトル通りGitについて詳しく丁寧にわかりやすく説明してる。初心者はまずこれを読むべし。
* [サルでもわかるGit入門](http://www.backlog.jp/git-guide/)
    * これも初心者はまず読むべし。基本的なコマンドを思い出すときによく参考にする。
* [こわくない git](http://www.slideshare.net/kotas/git-15276118?qid=ad0390a6-d824-4103-a3d8-b30a49cccbb1)
    * margeやrebaseなどわかりにくいと言われてるところを素敵なデザインでわかりやすく説明してる。リベースこわくないよ！ 
* [LearnGitBranching](http://k.swd.cc/learnGitBranching-ja/)
    * これはすごい。コマンドに応じてぬるぬる動くよ！
* [チーム開発実践入門](http://www.amazon.co.jp/dp/4774164283)
    * これはgitの解説というよりは、チームで開発する際のバージョン管理のフローについて紹介している。もう一度読み直したい…。
* [Pro Git 日本語版電子書籍公開サイト](https://progit-ja.github.io/)
    * 無料で読めるGitの電子書籍。Git公式サイトで公開されている。

# 実践的な学習

## まずは一人で使ってみる

* GitHubでもなんでも良いのでまずは自分用のリポジトリを作って管理してみる
    * add, commit, pull, push, branch, checkoutあたり
* **GUIクライアント（SourceTreeなど）を使うよりもまずはコマンドに慣れる**
    * よくできてるけど各クライアントの使い方が独特
    * 慣れたらコマンドが一番良い気がする
* コードだけじゃなくてテキストや画像もバージョン管理してみる
* 慣れてきたら卒論も管理してみる
    * diffコマンドで教授に差分を提示するのも良いかもしれない

## チーム（複数人）の開発に導入してみる
* 複数人でひとつのリポジトリを共有して開発してみる
    * テキストでもいいかも。学生ならレポートとか。
* Git-FlowやGitHub-Flowなどの開発フローを実際にやってみる
    * 複数ブランチが同時に走るような環境でやってみるのが理想
* コンフリクトへの対応はここでめちゃくちゃ学ぶ

## 重要なのは何度も痛い目にあうこと
* 何度も失敗を繰り返して、その度に対応策を調べて実践することで身につく
    * rebaseとか特に！！！
* とはいえ、実際の現場で失敗すると多大な影響を与えることがあるので、失敗する場はきちんと選ぼう
* あとは慣れと勉強 :muscle:
Ubuntu 16.04 で ansible からパッケージをインストールしようとしても進まない場合

Ubuntu 16.04 で ansible からパッケージをインストールしようとしても進まない現象に遭遇した。
`ps -ef | grep apt`をすると`python-apt`のインストールで止まっている様子。

しかたないので手で入れたところ動くようになった。

```bash:python-aptを手で入れてあげる
sudo apt-get install -y \
  python-apt
```
Zybo > Chronicles blog 17 > TTC > Registers > Clock Control / Counter Control / Counter Value / Interval Counter / Match Counter / Interrupt Register / Interrupt Enable / Event Control Timer / Event Register

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Introduction-to-the-Zynq-Triple-Timer-Counter-Part-One-Adam/ba-p/407537

> There are three timer/clock units within each of the Zynq SoC’s two TTC instantiations. Each TTC has the following registers:

>- Clock Control : Defines the TTC’s clock source, pre-scale value, and the clock edge to be used.
- Counter Control : Defines the generated waveform settings, the timer mode, the count direction, enables the match value and interval interrupts, resets the counter, and disables controls.
- Counter Value :  A read only register containing the current value of the timer.
- Interval Counter : A intermediate value used in the interval mode as the value that is counted to or from depending upon the count direction (up or down).
- Match Counter (three registers):  When the match registers are enabled, separate interrupts are generated when the counter value equals the values stored in these registers.
- Interrupt Register : Defines the status of the six interrupts controlled by the TTC. Permissible interrupts are Match 1, Match 2, Match 3, Internal, Overflow, and Event.
- Interrupt Enable :  Enables the TTC interrupts.
- Event Control Timer : Enables the timer, resets the timer, specifies the clock phase for counting, and specifies how the timer handles overflow conditions.
- Event Register :  Contains the value of the internal counter at the end of the counting phase for an external pulse. Used to measure an external pulse width using the CPU clock as a counting reference.
 

Counter Control の disables controlsとInterrupt Enableの関係性が未消化。
Interrupt Registerのsix interruptsは未消化。特に、InternalとEvent。
Zybo > Chronicles blog 17 > TTC > the Zynq SoC’s TTCs also provide the ability to receive and count a PWM signal (in processor clock cycles)

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Introduction-to-the-Zynq-Triple-Timer-Counter-Part-One-Adam/ba-p/407537


> Embedded systems use PWM output signals for a number of applications including industrial motor control

...

> the Zynq SoC’s TTCs also provide the ability to receive and count a PWM signal (in processor clock cycles); the event timer can be configured to count the number of processor clock cycles during the period when an external clock signal is high or low.

TTCにより、単純なON/OFFのLチカだけでなく、モーター制御などに使われるPWMも扱える。