OmniAICreator/Qiita-1.07M huggingface dataset:
Imgur APIで画像をアップロードするつもり

(注)私は失敗してます。

#Imgurとは？
海外の画像アップロードサイト。某掲示板では事実上の標準として使われています。他のアップローダに比べ消えることが少ない(というか消さない限り消えない)のが特徴です。

ちなみに読み方は"image-er"(イメージャー)だそう。

#Imgur API
アップロードその他は、全て**SSL通信で行います。**私はC++で実装していたのでOpenSSLを使用しました。
APIにはOAuthによるユーザー認証が必要なものとそうでないものがありますが、今回は認証の不要なもののみを使用します。
API自体はREST APIで作られており、慣れている人ならそんなに迷わないのかも。

#Imgur APIを使う
##アプリケーションの登録
Imgurのアカウントを作成して、アプリケーションの登録をします。特に難しいことは無いと思います。

![Screen Shot 2015-10-22 at 00.15.41.png](https://qiita-image-store.s3.amazonaws.com/0/51923/0a116f3d-9d2e-f42c-7692-54e0baec5a9e.png)

* Application name : アプリケーションの名前
* Authorization type : 今回は一番下を。ユーザー認証を使う場合は2番めを使います(たぶん)
* Authorization callback URL : たぶんOAuthに使うんでしょう。適当なURLを
* Application website : アプリケーションの公式サイト
* Email : Eメールアドレス。(クライアントID等が送られてきます)
* Description : アプリケーションの説明文

登録に成功するとClient IDとClient secretの２つの文字列が表示されます。
今回はClient secretは特に使いません。クライアントIDのみでAPIにアクセスできます。

##匿名モードで画像をアップロードする
https://api.imgur.com/3/image/ に対してPOSTメッセージを送ります。

```http:api.imgur.com
POST /3/image HTTP/1.0
host: api.imgur.com
Content-length: xxx
Connection: close
Authorization: Client-ID (クライアントID)

image=(画像データ)
```

画像データは、Base64エンコード、URLエンコードをして突っ込めば大丈夫そう。公式を見る限りバイナリデータやURLにも対応しているようです。

```json
{"data":{"error":"Image format not supported, or image is corrupt.","request":"\/3\/image\/","method":"POST"},"success":false,"status":400}
```

このように、無事エラーメッセージが返ってきました。
どのようなHTTPボディに対しても同じエラーを返すようです。
cmd - sedの使用

@sed.exe -n 1,$p h.txt
@sed.exe -n -e 's/^HogePiyo\\(.\*\\)/HogePiyo\\(.\*\\)/p'    ^
            -e 's/^#0x[[:alnum:]]\*\s\*\\(.\*\\)/\1/p'      ^
                %1
@sed.exe -n 1,$p f.txt
オブジェクト指向でユニットテストを書くときに考えてること


随時更新します。まとまってきたらブログに書きます。

## 前提 / 方針

- テストにはとにかく依存関係が大事。他オブジェクトに依存していればしているほどテストしづらいので依存関係を切れるような設計が必要となる。また、テストの実行も意外と大変なので自動化は早い段階で考えておく。

- 依存関係を切る
	- setterを作る
	- 引数にオブジェクトを取る
	- Overrideして振る舞いを変える
	- モックオブジェクトを活用して便利に検証する
	- デメテルの法則を常に意識する 
- 極力自動化しておく
	- git hookでpush時に実行
	- ファイル監視して変更があった時に実行
	- Jenkinsのようなツールを使う
	- Travis CIやCircle CIのようにSaaSを利用する

--------------------

## オブジェクト生成

- まずはオブジェクト生成
	- `new Hoge();`できたら生成できたらかなりラッキー。メソッドのテストに進む
	- 引数ありのコンストラクタしかなかったら`new Hoge(null, false, 0);`みたいな感じでデフォルト値を渡して生成する
	- これもダメだったら`new Hoge(mockObject);`のように引数として`mockObject`（以下モックオブジェクト）を渡す（`mockObject`はデフォルト値を返し続けるオブジェクトなど。実際の処理が行われない方がユニットテストっぽい）
	- モックオブジェクトも厳しそうだったらデフォルとコンストラクタ`public Hoge() { /* do nothing */ }`を定義してしまう（テスト対象がコンストラクタに関わる処理の場合はこの方法は取れない）
	- `@VisibleForTestin`を使っていテストにふさわしいスコープを少しだけ広げることを宣言する
 - どうしてもダメな時はコンストラクタ内の処理の一部を別メソッドに切り出してテスト側で`@Override`したテストケースなどを用意する。

--------------------

## メソッドのテスト

- オブジェクト生成がどうしてもうまくいかなかったらテスト対象のメソッドを`static`にしておくことを考える
	- ↑設計よりテストに重きを置くとでてくる選択肢の一つ
	- どうしてもテストできない場合はまずは誰かに聞く、それでも分からなければ前向きに保留（TODOコメントだけ残しておくなど）
- オブジェクト生成が問題なくできたらあとはすぐ上の「オブジェクト生成」と同じように依存性と地味に戦い続けることにする
[Vim正規表現-特訓#1]Vimで複数行にまたがる条件で検索

# 課題
改行が含まれる条件で検索したい

# From vim help
>\\_.	
> Matches any single character or end-of-line.
> Careful: "\\_.*" matches all text to the end of the buffer!

要は\_.は改行と文字種全てにマッチします。

# 実践1
- HIGE~HEGE区間を検索
```cpp
HAGEHIGE
HUGE
HEGEHOGE
```

[最長マッチ検索版]
```/HIGE\_.*HEGE```

最長マッチ/最小マッチの違いはまた今度。

# 実践2
- C/C++のボックスコメントを検索
-
```cpp
/*
 * HAGE
 * HIGE
 * HUGE
 * HEGE
 * HOGE
 */
```
以下で検索します。
```/\/\*\_.\{-}\*\/```


`/`：検索
`\/\*`：ブロックコメントの最初`/*`
`\_.\{-}`: 改行含む文字部が0個以上
`\*\/`：ブロックコメントの最後`*/`
CakePHP3のFormHelperで複数Tableを扱う際のバリデーションエラーの出し方

# 動作するコード
User, Companyテーブルに対してデータを保存したい場合のフォーム例となります。

```php:controller
class PageController extends AppController
{
    public function initialize()
    {
        $this->User    = TableRegistry('User');
        $this->Company = TableRegistry('Company');
    }

    public function index()
    {
        if ($this->request->is('post'))
        {
            // Validation実行
            $user = $this->User->patchEntity(
                $this->User->newEntity(),
                $this->request->data['User']
            );

            // Validation実行
            $company = $this->Company->patchEntity(
                $this->Company->newEntity(),
                $this->request->data['Company']
            );

            // Validation Errorが発生した場合
            if ($user->errors() || $company->errors())
            {
                // Entityを配列に詰める
                $entities = [
                    'User'    => $user,
                    'Company' => $company
                ];
                
                // エラーを保持したEntityをまとめてTemplateに送る
                $this->set('entities', $entities);
                return;
            }

            // データを保存
            $this->User->save($user);
            $this->Company->save($company);

            // 保存が完了したらリダイレクト
            return $this->redirect('page/index');
        }

        // Getの場合も空配列をsetしておく
        $this->set('entities', []);
    }
}
```

```php:Template
<?= $this->Form->create($entities, ['type' => 'POST']) ?>
    <?= $this->Form->input('User.name') ?>
    <?= $this->Form->input('Company.name') ?>
    <?= $this->Form->submit() ?>
<?= $this->Form->end() ?>
```

# 注意するポイント
__```$this->Form->create()``` の第一引数に、テーブル名のprefixをkeyとしたEntityの配列を渡してください。__
こうしないと各テキストエリアにバリデーションエラーが表示されません。
公式ドキュメントに載っていない挙動であったため、数時間詰まりました。

# 動かないコード
```php
$this->request->data['User'] = $user;
```
2.x系ではControllerで上記のようなコードを書いても動作しましたが、3.x系ではダメなので注意してください。
SwiftでDateとStringの相互変換

# Problem

SwiftでDateとStringを相互に変換したい。

# Solution

```swift
import UIKit

class DateUtils {
    class func dateFromString(string: String, format: String) -> Date {
        let formatter: DateFormatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .gregorian)
        formatter.dateFormat = format
        return formatter.date(from: string)!
    }

    class func stringFromDate(date: Date, format: String) -> String {
        let formatter: DateFormatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .gregorian)
        formatter.dateFormat = format
        return formatter.string(from: date)
    }
}

// 元の日付の文字列
let dateString = "2015/03/04 12:34:56 +09:00"

// Dateに変換
let date = DateUtils.dateFromString(dateString, format: "yyyy/MM/dd HH:mm:ss Z")
print(date)
// => "2015-03-04 03:34:56 +0000\n"

// Stringに再変換
print(DateUtils.stringFromDate(date, format: "yyyy年MM月dd日 HH時mm分ss秒 Z"))
// => "2015年03月04日 12時34分56秒 +0900\n"
```
今更だけどEclipseからCVSを使う方法

約10年ぶりにCVSでバージョン管理しているプロジェクトに遭遇したので、EclipseからCVSを使うための設定をまとめておきます。

# 確認環境

- Windows8.1
- Pleiades All in One 4.5.1.v20151002

# プラグイン

## Eclipse CVS クライアント(必須)

EclipseでCVSを扱うためのプラグインで、以前はデフォルトで入っていたけどいつの間にか消えてました。

インストールは「新規ソフトウェアのインストール」から以下のURLを選択して、"cvs"で検索してください。
mars - http://download.eclipse.org/releases/mars

インストールするとCVSパースペクティブが使えるようになります。

## CVS Version Tree

https://marketplace.eclipse.org/content/cvs-version-tree

変更履歴をツリー表示するプラグインで、ブランチを使用している場合はあると便利です。

マーケットプレースからインストールできます。

## Eclipse CVS ChangeLog Plugin

https://code.google.com/a/eclipselabs.org/p/changelog/

GitやSVNと違い、CVSはファイル単位で変更履歴を管理しているので、同時にコミットしたファイルの一覧やフォルダ単位での変更履歴を確認することができません。

このプラグインを使うとフォルダ単位で変更履歴を確認できるようになり、同時にコミットしたファイルもまとめて表示してくれます。

# Eclipseからローカルリポジトリを参照する方法

EclipseのCVSプラグインではローカルリポジトリ[^ローカルリポジトリ]を直接参照できないので、Ext接続メソッドで無理やり設定します。

https://www.eclipse.org/forums/index.php/t/41523/

[^ローカルリポジトリ]: ローカルリポジトリとは、サーバーを立てずにローカルからファイルパスで参照できる場所に置いたリポジトリのことです。ネットワーク上の共有フォルダやネットワークドライブに割り当てた場所にあるリポジトリも含みます。

## CVSクライアントのインストール

cvs.exeが必要なのでCVSクライアントをインストールしておきます。

※あまりにも古いバージョンのcvs.exeだとEclipseから使えないようです。
以下のサイトのCVSNTとWinCVSを使ったらうまくいきました。
http://igeta.ifdef.jp/cvsnt.html
http://www.ne.jp/asahi/kuribara/hiroshi/cvstop.html

## Ext接続メソッドの設定

設定>チーム>CVS>Ext接続メソッドに以下の値を設定します。

- CVS_RSH: cmd
- パラメータ: /q /c
- CVS_SERVER: ＜cvs.exeのパス＞

## CVSリポジトリの追加

CVSパースペクティブ>CVSリポジトリの追加で以下の値を設定します。

- ホスト: 適当
- リポジトリー・パス: ＜リポジトリのファイルパス(パス区切りは¥)＞
- ユーザー: 適当
- 接続タイプ: ext

以上の設定でEclipseからローカルリポジトリが参照できるようになります。
尚、コミットした時のユーザー名は、Windowsのログインユーザー名になるようです。

---
[Perl]ファイルがShift JISで書かれていたときの正規表現表記方法


Shift JISで書かれたPerlファイルの修正をしようと思ったときに、```~```を打つことが出来なかったので代わりに```‾```を使った。

```perl:index.cgi
$price = "12345";
$price =~ s/(.*¥d)(¥d¥d¥d)/$1,$2/g;
```

本当はこのように書きたかったが、```~```を入力すると、

**現在のファイルのエンコーディングでは正しく扱えない文字を挿入しようとしています。このまま文字を挿入しますか？**
書類のエンコーディングをユニコードに変更すると情報を失うことなく文字を挿入することが可能です。
UTF-16へ変更　UTF-8へ変更 挿入

と拒否られる。いろいろ試した結果、```‾```を使うことで解決した！

```perl:index.cgi
$price = "12345";
$price =‾ s/(.*¥d)(¥d¥d¥d)/$1,$2/g;
```
kaoriya vim 備忘録

#設定ファイル



個人用設定は "_vimrc","_gvimrc"に書く

読み込み順

優先度
高
　　\$VIM/vimrc(サイトローカルな設定読み込みを記述部分)
　　\$VIM/vimrc_local.vim
　　\$VIM/vimrc(残りの部分)
　　\$VIM/vimrc_local.vim : ユーザ優先設定
　　\$HOME/_vimrc（ここに格納された場合\$VIMのは読み込まれない）
　　\$VIM/_vimrc
低

\$VIM,$HOMEのパスの確認方法

```
:echo $HOME
:echo $VIM
```

##neobundleなどでプラグインを追加する場合

どこで書くかでハマりました。

_gvimrcはプラグインが読み込まれた後に読み込まれるらしいので、
_gvimrcに書いてもプラグインはインストールされていない状態になります。
従って、neobundleなどでプラグインを入れる場合は_vimrcに書かないと反映されません。
[iOS]MFMessageComposeViewControllerで、添付ファイル付きMMSを送信する

アプリ内からメッセージを送信する機能(MFMessageComposeViewController)で、添付ファイルをつけてMMSを送信する方法です。


``` Objective-C
#import <MessageUI/MessageUI.h>

//...

MFMessageComposeViewController *messageController = [[MFMessageComposeViewController alloc] init];
messageController.messageComposeDelegate = self;

// 添付ファイル
UIImage* image = [UIImage imageNamed:@"sample.png"];
NSData* imageData = UIImagePNGRepresentation(image);
[messageController addAttachmentData:imageData typeIdentifier:@"public.image" filename:@"attachment_image.png"];

// 本文
messageController.body = @"sample text";

// 表示
[viewController presentViewController:messageController animated:YES completion:nil];

```

ポイントは、addAttachmentData:typeIdentifier:filename: で添付ファイルを指定するところ。

引数のaddAttachmentDataには、添付ファイルのデータをNSData形式で渡します。typeIdentifierにはファイルの種別を指定します。

データ種別(typeIdentifier)は、何のファイルを添付するか(画像・音楽など...)によって変える必要があるので、[System-Declared Uniform Type Identifiers](https://developer.apple.com/library/prerelease/ios/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple_ref/doc/uid/TP40009259-SW1) を参考にして、指定してください。


### 参考リンク

- [MFMessageComposeViewController Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/MessageUI/Reference/MFMessageComposeViewController_class/index.html)

- [System-Declared Uniform Type Identifiers](https://developer.apple.com/library/prerelease/ios/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple_ref/doc/uid/TP40009259-SW1)
 
- [ios - MFMessageComposeViewController iOS7 addAttachmentData:typeIdentifier:filename: not working - Stack Overflow](http://stackoverflow.com/questions/19170516/mfmessagecomposeviewcontroller-ios7-addattachmentdatatypeidentifierfilename-n)
macにatomを導入


##1. ダウンロード
サイトからダウンロード


##2. 導入パッケージ
気になったパッケージをメモ

######japanese-menu
日本語メニューにする。

######japanese-wrap
Atomで日本語の改行がうまくいかない問題を解決。

######minimap
sublimetextのあれ。

######minimap-bookmarks
MinimapにBookmarkした行をハイライト表示。

######minimap-highlight-selected
単語を選択するとすべて検索してミニマップ上に表示。
ただし日本語は除く。。。。

######Project Manager
ショートカット: alt + shift + p


######Docblockr
/**に続けてEnterを押すとドキュメントコメントのひな形を追加。

######autocomplete-plus
入力補完。

######autocomplete-paths
オートコンプリートにパスも追加。

######color-picker
色選択ができるカラーピッカーを表示。

######highlight-selected
選択した単語をハイライトする。

######Highlight Line Package
カーソル行のハイライトを好きな色に変更できる。

######jumpy
画面上の好きなところに飛べる。
言葉じゃ表せないすごい。

######sort-Lines
選択した範囲を ASCII 順に並び替えてくれる。

######Sublime-Style-Column-Selection
Optionキー＋クリック＋ドラッグで矩形選択。

######atom-alignment
= の位置を揃えることができる。
意外と便利。

######tag
"</"入力時に自動で閉じタグを挿入。

######regex-railroad-diagram
正規表現を図解で表示。

##3. proxy環境での設定
会社のPC等で、認証proxy可でatomを使用する場合のメモ
・apmでproxyを使用できるように設定

```console
apm config set https-proxy=http://id:passward@server:port/
```

id:passward@server:port/は任意のものに置き換えてください。

セットされているか確認

```console
apm config get https-proxy
```

環境によっては、以下を実行しなければ、
Packages that depend on modules that contain C/C++ code
のエラーがでて、パッケージのインストールができないことがあるそうです。

Windows

```console
setx ATOM_NODE_URL http://gh-contractor-zcbenz.s3.amazonaws.com/atom-shell/dist /M
```

Linux

```console
export ATOM_NODE_URL=http://gh-contractor-zcbenz.s3.amazonaws.com/atom-shell/dist
```
Ansible情報のオレオレまとめ

# [概要]
## Ansibleとは
Ansible社が提供するサーバ構成管理ツールで、Pythonで開発されている。
その他のサーバ構成管理ツールと比べるとシンプルさが売りとなっており学習コストが比較的低く、構成管理するサーバにクライアントが不要なため入門としてもよい。
だが、サーバ構築・ネットワーク機器の設定・クラウドの構築・デプロイといったできることも非常に多くなっている。
RedHatもAnsibleの機能を評価し2015年10月に買収を実施している。

## 特徴
* Simple
 * 必要最低限のファイルだけが2つだけで始めることが可能
 * YAML形式で書くことができる
* Agentless
 * 対象となるサーバに特別なツールをインストールする必要なし。
* Powerful
 * アプリのデプロイ、クラウド環境のインスタンス立ち上げ、多数のサーバのログを一括ダウンロードといって使い方が可能

## 依存関係
* SSHが可能であること
* 管理サーバでは、Python2.6以上
* Nodeでは、Python2.4以上（simplejsonライブラリが必要）
* Python3には非対応

## 公式リンク
- 公式サイト
 - https://www.ansible.com/
- 公式ドキュメント
 - http://docs.ansible.com/ansible/index.html
- リポジトリ
 - https://github.com/ansible/ansible


# [知っておくべきこと]
## 用語集
|No.|用語|意味|
|---|---|---|
|1|task|ansibleで実行する内容|
|2|playbook|複数のtaskをまとめたかたまり <br> 例えば、apacheのインストールする一連の流れを playbookにしたりする|
|3|Inventoryファイル|実行するべきサーバが記述されたファイル <br> Inventoryファイルでは、Webサーバ、DBサーバと言ったグルーピングも可能|
|4|module|ansibleのtaskを実行するのを便利にするためのもの <br> モジュールには2種類ありコアモジュールとエクストラモジュールに分かれている<br>* コアモジュール       -> Ansible社がメンテナンスしているモジュール <br> * エクストラモジュール -> コミュニティベースのモジュール|

## セキュリティについて
サーバ構築する際には、ユーザデータや設定するパスワード情報や気密性の高い情報が多くなる。
その際には、ansible-vaultなどを使い暗号化する必要がある。
※ ansible-vault とは Ansibleが提供する暗号化機能

# [目次]
随時更新予定
OpenCV の NORM_RELATIVE_L2

`cv::norm` を使おうとしてネットに上がっている[リファレンス](http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#norm)を読んだら相対差分値ノルムなるものがあって使おうとしたら，そんなものは無いとコンパイラに怒られた．
環境は OpenCV 2.4.11 / 3.0

`NORM_RELATIVE_L2` は無くて， `cv::NORM_RELATIVE | cv::NORM_L2` としなければならない．(INFもL1も同様)

ちゃんと書く気もなかったので適当ですが，少しハマってOpenCVのソースを追っかけるはめになったのでメモ．


OpenCV 3.0 のヘッダから引用すると

```C++:opencv2/core/base.hpp
enum NormTypes { NORM_INF       = 1,
                 NORM_L1        = 2,
                 NORM_L2        = 4,
                 NORM_L2SQR     = 5,
                 NORM_HAMMING   = 6,
                 NORM_HAMMING2  = 7,
                 NORM_TYPE_MASK = 7,
                 NORM_RELATIVE  = 8, //!< flag
                 NORM_MINMAX    = 32 //!< flag
               };
```

おっ，フラグって付いてる．
Elixirのコンパイル時にでるlocale警告を解消する方法（CentOS6）

- `mix compile`時に出力されるlocaleエラー
- 単純にElixirだけインストールした環境だとlocaleの設定がデフォルトのため警告がでることがある

> warning: the VM is running with native name encoding of latin1 which may cause Elixir to malfunction as it expects utf8. Please ensure your locale is set to UTF-8 (which can be verified by running "locale" in your shell)

この環境はElixirが不具合を引き起こす可能性のあるlatin1(iso-8859-1)で起動しているので、localeをUTF8に設定してください。

```bash
cp /etc/sysconfig/i18n /etc/sysconfig/i18n.org
echo "LC_CTYPE=\"en_US.UTF-8\"" >> /etc/sysconfig/i18n
. /etc/sysconfig/i18n
```

- https://github.com/elixir-lang/elixir/issues/3548
Spring Boot で Connection refused にする方法


## 技術的にしたい事

spring boot において、「localhost」以外の接続は Connection refused にしてしまう方法をメモしておく。

## 目的

spring boot を使用した Web アプリで
スタンドアローンでのみ使用するユースケースの場合、
外部から REST 通信されるような事は出来ないようにしたいはず。

そんな Web アプリって存在するのか・・・？
そもそも REST WebApi 仕様は不明なのでは・・・？
などの突っ込みは気にせず、自マシンだけが使えるようにしたい場合の対処となる。

## 実装

クラスパス直下に application.properties というファイルを置き、
設定値として以下を追加する。

spring boot 側で自動で読み取ってくれ、
localhost以外は Connection refused にしてくれる。

```application.properties
server.address=localhost
server.port=8080
```

## 備考

spring boot の設定ファイルについては、下記を参照して下さい。

http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
Hogan.js入れたので使い方メモ

Hogan.jsはTwitter製のJSテンプレートエンジンです。
http://twitter.github.io/hogan.js/
シンプルでとても使いやすいのでおすすめです！
サンプルとしてユーザ情報をテンプレートに渡して表示します。

## hogan.js読み込む
```html:index.html
<script type="text/javascript" src="/js/hogan.js"></script>
```
まあ、そのままですね。

## テンプレート準備
```html:index.html
<script type="text/template" id="tpl_user">
{{! コメントできるよ }}
<ul>
    <li>
        <div>{{name}}</div>
        <div>{{age}}</div>
        <div>{{gender}}</div>
        <div>{{phone}}</div>
    </li>
</ul>
</script>
```
セレクタ
テンプレートにセレクタ追加
ex.) id="tpl_user"

・変数
{{ }}で囲むことで変数が扱えます
ex.) {{name}}

・コメント
{{! }}でコメントできます

## レンダーする
```js:app.js
var tpl  = Hogan.compile($('#tpl_user').text());
var html = tpl.render({
               name: 'Jack',
               age : 20,
               gender : 'male',
               phone : '09012345678',
           });
$('#user_list').append(html);
```
テンプレートのセレクターを指定して、テキストに戻してからcompileします。
renderするときに変数渡してhtmlに変換されます。
これでブラウザに表示されます。
以下で動作確認ができます。
https://jsfiddle.net/rukurx/gzk3tdLh/

# コメント
{{! }}内に記述することでコメントができます

# ifステートメントとif elseステートメント
変数がbool型を使えば条件分岐ができる
変数is_activeがtrueの場合ユーザを表示して。falseならidだけ表示してます。

```html:.index.html
<script type="text/template" id="tpl_user">
<ul class="user-ul">
    {{#is_active}}
        <li>{{id}}</li>
        <li>{{name}}</li>
        <li>{{age}}</li>
    {{/is_active}}
    {{^is_active}}
        <li>{{id}}</li>
        <li>-</li>
        <li>-</li>
        <li>-</li>
    {{/is_active}}
</ul>
<script>
```
・ifの場合
{{#is_active}} {{/is_active}}
・if elseの場合
{{#is_active}} {{/is_active}} {{^is_active}} {{/is_active}}
^はelseではなく否定になるので、無理やりですが...

# foreachステートメント
配列でforeachを使って要素を取り出せます
ここではusers配列をテンプレート内でループして表示してます。

```js:app.js
var users = [
        {'id':1, 'name': 'Alex', 'age':20, 'gender': 'male', 'is_active': true},
        {'id':2, 'name': 'Ben', 'age':25, 'gender': 'male', 'is_active': false},
        {'id':3, 'name': 'Cony', 'age':30, 'gender': 'female', 'is_active': true}
    ];

var tpl = Hogan.compile($('#tpl_user').text());
var html = tpl.render({
               users: users
           });
$('#user_list').append(html);
```

```html:index.html
<script type="text/template" id="tpl_user">
{{#users}}
    <ul class="user-ul">
        <li>{{id}}</li>
        <li>{{name}}</li>
        <li>{{age}}</li>
    </ul>
{{/users}}
<script>
```

・foreachの場合
{{#users}} {{/users}}
!! なんと記述の仕方がifと同じですね。変数が配列の場合はforeachになります

ifとforeachでの動作確認は以下よりできます。
https://jsfiddle.net/rukurx/821sxzfq/

# その他
変数がObjectの場合にプロパティへのアクセス方法。普段からJS書いてる方は特に迷わないかもしれませんが念のため。

```js:app.js
var user = {'id':1, 'name': 'Alex', 'age':20, 'gender': 'male', 'is_active': true};

var tpl = Hogan.compile($('#tpl_user').text());
var html = tpl.render({
               user: user
           });
$('#user_list').append(html);
```

```html:index.html
<script type="text/template" id="tpl_user">
    <ul class="user-ul">
        <li>{{user.id}}</li>
        <li>{{user.name}}</li>
        <li>{{user.age}}</li>
        <li>{{user.gender}}</li>
    </ul>
<script>
```
https://jsfiddle.net/rukurx/n65369v3/

まだ他にも機能あるようですが、これだけ覚えただけでも十分に使えると思います。
自分は今のところこれだけで事足りてます。そのうち使うかもしれませんが....
二分探索学習中

```
二分探索(バイナリーサーチ)学習中 このアルゴリズムはもっと考えなければ。
```

```
二分探索(バイナリーサーチ)はソート済みの配列において、検索する間隔を半分に分割しながらデータを探し出すアルゴリズム

手順

1 配列を昇順か降順にソートする
2 配列の中央の要素を調べる
3 中央の要素が目的のデータより大きければ、中央より後半部分の要素を調べる
目的のデータより小さければ中央より前半の部分を調べる
4 ２に戻る
```


###疑問 配列の中央の要素を調べるコード。どこのコードなのか。

```
class B
  def binary_search(arr_size, value)
    arr = (1..arr_size).to_a

    left = 0 #ローカル変数left初期化
    right = arr.last #ローカル変数rightに変数arrの末尾の値を代入
    mid = 0　#ローカル変数mid初期化

    while left <= right do #変数leftがrightより大きい時
      mid = (left + right) / 2　#midに(left + right) / 2を代入
      if arr[mid] == value #ここから理解するところ
        return "Found!"
      elsif arr[mid] < value
        left = mid + 1
      else
        right = mid - 1
      end
    end
  end
end

find_at = B.new
puts find_at.binary_search(10, 9)
```

```

 while left <= right do #変数left(0)がright(4)より大きい時
      mid = (left + right) / 2　#midに(left(0) + right(4)) / 2を代入 = 2
      if arr[mid] == value # arr[mid]= 2 == valueが等しい時にFoundを返す
        return "Found!"
      elsif arr[mid] < value #arr[mid]=2 がvalueよりも大きい時に変数leftにmid + 1を代入
        left = mid + 1
      else
        right = mid - 1　#もしくは変数right[4]にmid -1 == 2 -1 = 1を代入
                       　#この時、変数rightの値は、1？それとも4? 代入されているから1だな。
      end
    end
```



参考URL
http://qiita.com/ToruFukui/items/5a0c0964f2c713b0699d
CodeBoxのdockerでPythonがUnicodeEncodeError


CodeBoxを[こちら](http://qiita.com/y_hokkey/items/406b5a8c4bc15354d069)の記事を参考にさせていただきながら構築してました。  
コラボレーションも問題なく動いてよかったのですが、Pythonで以下のように日本語を使うと**UnicodeEncodeError**死んで困ってました。

```python
print u"はろーわーるど"
```

LANGとかlocaleあたりだと思って色々試してたのですが、いまいちうまく行かず。  
最終的にPYTHONENCODING環境変数を設定して解消しました。元記事ほぼそのままですが  
以下のdocker-compose.ymlで動かすことにしました。

```yml
data00codebox:
  image: busybox:buildroot-2014.02
  volumes:
    - /home/dockers/data/codebox:/workspace
codebox:
  image: 'javierprovecho/docker-codebox'
  ports:
    - 9000:8000
  environment:
    - LANG=ja_JP.UTF-8
    - PYTHONIOENCODING=utf-8
  volumes_from:
    - data00codebox
```

あまりいないかもしれませんがどなたかのお役に立てば幸いです。
prettytableを使って簡単な表の作成

#prettyprintで表の作成
詳細はこちら：https://pypi.python.org/pypi/PrettyTable
下記のものをpipでインストールしました。
listの各要素の長さがバラバラで、出力してみても見にくい時とかに便利です。
今回のコード：https://github.com/KodairaTomonori/Qiita/blob/master/module/prettyprint/make_table.py
###
```pip.
$ pip search prettytable
prettytable-extras     - An extension to the excellent prettytable Python library
```
##実際に作ってみる
今回は形態素解析をしてくれる`mecab`をつかって説明していきます。
mecabは、文を入れると、形態素解析結果を文字列として返してくれます。
こちらも簡単にpipでインストールできます。
###
```mecab_test.
$ python
Python 3.5.0
>>> import MeCab
>>> MeCab.Tagger().parse('体は剣で出来ている')
'体\t名詞,一般,*,*,*,*,体,カラダ,カラダ\nは\t助詞,係助詞,*,*,*,*,は,ハ,ワ\n剣\t名詞,一般,*,*,*,*,剣,ケン,ケン\nで\t助詞,格助詞,一般,*,*,*,で,デ,デ\n出来\t動詞,自立,*,*,一段,連用形,出来る,デキ,デキ\nて\t助詞,接続助詞,*,*,*,*,て,テ,テ\nいる\t動詞,非自立,*,*,一段,基本形,いる,イル,イル\nEOS\n'
>>> print(MeCab.Tagger().parse('体は剣で出来ている') )
体	名詞,一般,*,*,*,*,体,カラダ,カラダ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
剣	名詞,一般,*,*,*,*,剣,ケン,ケン
で	助詞,格助詞,一般,*,*,*,で,デ,デ
出来	動詞,自立,*,*,一段,連用形,出来る,デキ,デキ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
いる	動詞,非自立,*,*,一段,基本形,いる,イル,イル
EOS

```
こんな感じで出力されますが、ただプリントしただけでは、何か後ろの方が揃ってなくて見にくい
なので、`prettytable`をつかってこれを簡単に見やすくしたいと思います。
###
```make_prettytable.py
import MeCab
import prettytable

def make_prettytable(others, header=[]):
    if not header: header = range(len(list(others)[0]) )
    if len(header) != len(others[0]):
        print('incorrect length!')
        return 
    table = prettytable.PrettyTable(header)
    for other in others: table.add_row(other)
    return table

def make_mecab_info_table(sentence, output_info=[], \
        mecab_parser=MeCab.Tagger.parse):
    others = list(map(lambda x: x.split(','), \
        mecab_parser(sentence).replace('\t', ',').split('\n') ) )[:-2]
    return make_prettytable(others, output_info)


if __name__ == '__main__':
    mecab_output = '表層形,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音'
    parser = MeCab.Tagger().parse
    header = mecab_output.split(',')
    print(make_mecab_info_table(input(), header, parser) )
```
###出力例
<img width="843" alt="スクリーンショット 2015-10-21 21.29.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/86999/5b27ef72-7810-b058-e8d9-bb9d87e5f7c1.png">

###解説
こんな感じで見やすくなりました。
`make_prettytable`は最初の引数(`others`)には中身を、次の引数(`header`)には、上段の情報を入れています。
`header`は引数を受けとんなかった場合に、`range`で番号を振ってあげてます。
`others`は`[[1,2,...], [2,3,...]...]`的なリストを入れてあげればいいです。
`prettytable.PrettyTable`で上段(`header`)を入れて表の元を作ります。
次の`for`文で`others`を回して`.add_row`で一行づつ追加して行っています。
あとは、printするだけで簡単に表が見れます。

make_mecab_info_tableは、普通に文字を処理しているだけです。

listの要素の長さがバラバラの時、出力して確認しようとしてもなんか見にくいのでそんな時に便利です。
Webアプリケーションで例外処理の処理方法

## すべての例外を捕捉しない

コード例はRubyです。

```ruby
begin
  なんかの処理
resuce => e
  Rails.logger.error e.inspct
end
```

* すべての例外を捕捉してしまうと、想定してる例外なのか、もしくは実装時のバグが原因で例外が起きてるのかの判断がつきにくくなる。

* 例外が発生した場合に通知する仕組みが使えなくなるので、例外発生したことを探すのが探しにくくなる。

* begin resuceするのがきりがなくなる。

## 想定している例外だけを捕捉する

想定している例外は捕捉して、それ以外は捕捉しないことで想定してる例外で捕捉漏れなのか、もしくは実装時のバグが原因で例外が起きてるのかの判断がつけやすくなる。

```ruby
begin
  なんかの処理
resuce Timeout::Error => e

end
```

## 参考

[例外設計における大罪](http://www.slideshare.net/t_wada/exception-design-by-contract)
簡単にweb越しにjavaプロセスを監視する

# tl:dr

JMXがきちんと見れるなら、jconsoleとか使った方が楽。
他と連携するならjolokiaが便利。
jolokiaの結果をとりあえず可視化したいときにはhawtioが便利

* jolokia
* hawtio

これらを組み合わせてつかう


# jolokia

jolokiaを取得する.
jarから直接連携したいときはjavaagentに追加しましょう

$ java -javaagent:jolokia-jvm-1.3.x-agent.jar -jar java-jar.jar


# hawtio

hawtioを取得する.以下のサイトから最新版を取得

http://hawt.io/

$ java -jar  hawtio-app-x.x.x.jar --port 18000
Raspberry PiでLEDの点灯

Raspberry PiでLEDを点灯させるまでの手順メモ

# 用意するもの
1. Raspberry Pi 2 Model B(セットアップ済みのもの、OSはRaspbian)
2. 330Ωの抵抗 1本
3. 赤色LED 1個
4. ブレッドボード
5. ブレッドボード用ジャンパーワイヤ(オス-メス) 2本

Raspberry Pi 2以外は、[秋月電子通商](http://akizukidenshi.com/catalog/default.aspx)で購入した。
（2〜5は、送料別で計800円だった）

![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/97314/4a75af4e-c857-21c9-497a-ad55715d8b42.jpeg)

# GPIOの配置の確認

回路を作成する前に、GPIOの配置について確認しておく。

GPIOピンの構成は[公式サイト](https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/Raspberry-Pi-B-Plus-V1.2-Schematics.pdf)に記載されていた。
![スクリーンショット 2015-10-21 19.02.54.png](https://qiita-image-store.s3.amazonaws.com/0/97314/b0c10033-456b-c470-21ef-986b07126062.png)

また、[公式サイト](https://www.raspberrypi.org/documentation/usage/gpio/README.md)にピンの配置が色付けされているものがあった。
**GPIO番号とピン番号は異なるので注意**
(下図はピン番号で表記したもの。GPIO番号での表記したものもリンク先にある)
![スクリーンショット 2015-10-21 19.12.33.png](https://qiita-image-store.s3.amazonaws.com/0/97314/a489b52d-cad2-77ec-fcbe-8f777aa5343e.png)


Raspberry Pi2のピン配置図があったので、公式サイトにあったので追記 (2015/10/24 追記)
[公式サイト](https://www.raspberrypi.org/documentation/usage/gpio-plus-and-raspi2/README.md)
**GPIO番号で表記されたもの**
![スクリーンショット 2015-10-24 0.03.36.png](https://qiita-image-store.s3.amazonaws.com/0/97314/fe97237c-0b34-87d0-0da5-229accfd2095.png)



# 回路を作成

以下の通りに回路を作成し、Raspberry Piと接続する。

【ブレッドボード】
抵抗: b4-b8
LED: c8-c9
c8にプラス(端子の長い方)接続

【ブレッドボードとRaspberry Pi】
ジャンパーワイヤ:a4 - ピン番号22(GPIO 25)
ジャンパーワイヤ:a9 - ピン番号6


端子をカットしていないので不格好。。
![image-4.jpg](https://qiita-image-store.s3.amazonaws.com/0/97314/d98af979-3a39-67a1-64d8-5c9906f402e3.jpeg)


# Raspberry PiでLEDをチカチカさせる

LEDを点灯させるためのコードをPythonで書いてみる。

```py:/home/pi/develop/raspberry_pi/led_high.py
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM) # GPIO番号で指定
GPIO.setup(25, GPIO.OUT) # GPIOを出力として使用する

GPIO.output(25, GPIO.HIGH) # GPIO 25の出力をHIGHに設定する（HIGHにすることでLEDが点灯）
```

```py:/home/pi/develop/raspberry_pi/led_low.py
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM) # GPIO番号で指定
GPIO.setup(25, GPIO.OUT) # GPIOを出力として使用する

GPIO.output(25, GPIO.LOW) # GPIO 25の出力をLOWに設定する（LOWにすることでLEDが消灯）
```

GPIOを指定するときに、GPIO番号とピン番号で指定することができる。

* GPIO番号で指定する場合
```
GPIO.setmode(GPIO.BCM)
```
* ピン番号で指定する場合
```
GPIO.setmode(GPIO.BOARD)
```

# 実行

LEDを点灯させる。

```sh:ターミナル
$ sudo python led_high.py
````

LEDを消灯させる。

```sh:ターミナル
$ sudo python led_low.py
led_low.py:4: RuntimeWarning: This channel is already in use, continuing anyway.  Use GPIO.setwarnings(False) to disable warnings.
  GPIO.setup(25, GPIO.OUT)
````
LEDは消えたが、警告がでる。

この警告は、"GPIO 25を出力に設定しようとしているが、すでに使用済み"と言っている。
プログラム終了時に、以下のように設定の解除を行う必要がある。

```
GPIO.cleanup()
```


以下のようにするとすぐにLEDが消灯するので注意
（GPIO.cleanupを実行した時点で消灯する）

```py:led_hight.py
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM) 
GPIO.setup(25, GPIO.OUT)

GPIO.output(25, GPIO.HIGH)
GPIO.cleanup() # <- 消灯
```

以下のsleepなどで待つ処理が必要

```py:led_hight.py

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM) 
GPIO.setup(25, GPIO.OUT)

GPIO.output(25, GPIO.HIGH)
time.sleep(2) # この間は点灯し続ける

GPIO.cleanup() # <- 消灯
```
もっと早くから知りたかった、bashのreadline系オプション

この記事に書いてあることは、全部、bashのmanページに、より詳しく書かれている。manページを全部読んだ人には、全く読む価値のない記事だ。
けれど私は、10年以上Linuxを使っているにも関わらず、読み飛ばしていた。

もちろんいくつかは知っていたが、知らなかったものも結構あり、bash人生を損してきた気がしたので、記事にする。

あまりに長いと読んでもらえないので、似たようなのがいくつもある場合は、よさそうなのだけを選んだ。
「なぜ削った！」ってのがあったら、コメント欄で指摘いただけるとありがたい。

#記法の読み方
Emacsではおなじみの形式で、キーバインドは書かれている。
`C-` は、Ctrlを押しながら、つまり`C-a`は、よく見かける記法で書くと`Ctrl+A`だ。

`M-` は、多くの環境では、Altキーを押しながら。(もともとはMetaキーってのがあったらしい)または、Escキーを一旦押して離してから(Altを使う場合は同時押しだが、Escの場合は一旦押して離してから、なので注意)。Macの人は、何か設定すればCommandキーか何かが使えるらしい。「mac metaキー」などでぐぐってほしい。

例:
`M-C-y`は、`Alt+Ctrl+y` (指がつりそう！) もしくは、Escを押して離してから、`Ctrl+y`
`C-x e`は、`Ctrl+x`を押したあとで、`e`

#移動系コマンド
カーソルを動かす系のコマンドです。

| コマンド | 効果 |
|:-----------|:------|
| C-a|行頭に移動|
|C-e|行末に移動|
|C-b|1文字戻る(左矢印と同じ)|
|M-b|1単語戻る
|C-f|1文字進む(右矢印と同じ)
|M-f|1単語進む
|C-l|現在の行が一番上の行になるよう、画面をクリアまたはスクロール|

#履歴操作系コマンド
|コマンド|効果|
|:--|:--|
|C-p|履歴を戻る(上矢印と同じ)
|C-n|履歴を進む(下矢印と同じ)
|M-<|一番最初の履歴に移動
|M->|一番最後の履歴に移動
|C-r|履歴を古い方に向かってインクリメンタル検索
|C-f|履歴を新しい方に向かってインクリメンタル検索

#1つ前の履歴を利用するコマンド
|コマンド|効果|
|:--|:--|
|M-C-y|1つ前の履歴の、最初の引数(`echo foo bar`だと、`foo`)を挿入する
|M-.|1つ前の履歴の、最後の引数を挿入する
|M-数字 M-C-y|1つ前の履歴の[数字]番目の引数を挿入する
|C-o|現在の行を実行した後、次の行に現在の行を挿入する

`M-数字 M-C-y`は、例えば`M-2`に続けて`M-C-y`を入力すると、2番目の引数が挿入される。
`C-o`の説明は難しいが「Enterを押して行を実行し、次の行が出たら上矢印を押す」のと同じようなことを、1回のキー操作でやってくれる。

#補完
|コマンド|効果|
|:--|:--|
|M-/|ファイル名の補完を試みる
|C-x /|ファイル名の補完候補を列挙する
|M-!|コマンド名の補完を試みる
|C-x !|コマンド名の補完候補を列挙する
|M-{|ファイル名の補完候補を、シェルに読める形で全部挿入する(すごいものが見られるので、ファイルの多いディレクトリで一度やってみてください)

#キルとヤンク
「キル」とは、削除と似たようなものだが「キルリング」という、bash専用クリップボードみたいなところに入って「ヤンク」操作(C-y)で、貼り付けることができる。しかも、キルリングには複数のテキストを保持できる。

|コマンド|効果|
|:--|:--|
|C-k|カーソル位置から行末までをキル
|C-u|カーソル位置から行頭までをキル
|M-d|カーソル位置から単語の終わりまでをキル
|M-BackSpace|カーソル位置から単語の始まりまでをキル
|C-y|一番最後にキルしたテキストを挿入する
|M-y|(C-yまたはM-yの後で使うと)ひとつ前のキルに遡って挿入する

#キーボードマクロ
`C-x (` で、キーボードマクロの記録が始まる。`C-x )`を押して、キーボードマクロの記録を終了したら、`C-x e`でキーボードマクロを再実行できる。つまり`C-x (`から`C-x )`までの間のキー入力を再度繰り返すことができる。

|コマンド|効果|
|:--|:--|
|C-x (|キーボードマクロの記録を開始する|
|C-x )|キーボードマクロの記録を終了する|
|C-x e|キーボードマクロを再実行する

#その他
|コマンド|効果|
|:--|:--|
|M-数字|この直後に行った文字挿入またはコマンド入力を数字の回数分、繰り返す
|M-C-e|エイリアスや履歴の展開など、シェルの行うすべての単語展開をその場で行う
|C-x C-e|エディタを起動して現在のコマンドラインの内容を開き、編集結果をシェルのコマンドとして実行する。

`M-数字`の例を紹介する。`M-3 a`は`aaa`と入力するのと同じ。`M-4 M-b`は4単語戻る。また、コマンドによっては、単なる繰り返しではなく、特殊な動きをするものがある。その一例が、既に紹介した`M-数字 M-C-y`だ。
`C-x C-e`コマンドを使用した際、エディタは`$VISUAL`, `$EDITOR`, `emacs`の順で起動を試みるので、お気に入りのエディタを.bashrcなどに`EDITOR=vim`のように登録しておけばいい。

#参考
manページ
http://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html
ESLint をグローバルにインストールせずに使う

# はじめに

[ESLint 最初の一歩](http://qiita.com/mysticatea/items/f523dab04a25f617c87d)では、ESLint をグローバル インストールしていました。
グローバル インストールすると `eslint` コマンドにパスが通って便利ですが、欠点もあります。

- プロジェクト毎に異なるバージョンの ESLint を使えない。
    - ESLint が互換性のないバージョンアップをした時に困る (`1.0.0`, `2.0.0` のようなメジャーバージョンアップは互換性がありません)
- 利用するプラグイン・共有設定もグローバル インストールしなければならない
- チームで同じバージョンに揃えるのが手間である

`npm` のエコシステムでは、コマンドもプロジェクト ローカルにインストールして使うのが主流です。
そうすることで、`package.json`に依存バージョンとともに記述して共有することができます。
`npm install` 一発で、チームが同じ環境を揃えられるわけですね。

この記事では、プロジェクト ローカルに ESLint をインストールして使う方法を紹介します。

# `--save-dev`

`package.json` は作成済みであることを想定します。
作っていない場合は、`npm init` 等のコマンドで作ってしまいましょう。

```:shell
> npm install --save-dev eslint
```

`--save-dev` オプションを使うことで、インストールされたパッケージは `package.json` の `devDependencies` 一覧にも追加されます。
`npm install` コマンドは `package.json` の内容を見て同様のパッケージをインストールしますので、`package.json` を git に登録するだけで、チームでツール類のバージョンを揃えることができます。便利です。
プラグインや共有設定を使う場合も `--save-dev` 付きでインストールしましょう。

ただ、`--save-dev` でインストールすると不便な点が1つだけあります。

```:shell
> ./node_modules/.bin/eslint src
```

実行ファイルにパスが通らないので、実行するのが面倒です。

そこで...

# npm-scripts

`npm` にはタスクランナーとしての機能があります。
`package.json` の `scripts` フィールドにコマンドを書くと、パスが通っていない `npm` パッケージも素直に使うことができます。

```json:package.json
{
    "scripts": {
        "lint": "eslint src"
    },
    "devDependencies": {
        "eslint": "^2.8.0"
    }
}
```

```:shell
> npm run lint
```


# [eslint-cli]

エディタによってはグローバル インストールされた `eslint` しか使ってくれない不届き者もいます。また、`npm run lint` を定義したとしても、やっぱり `eslint` コマンドを使えると便利です。

そんなときに [eslint-cli] を使うことができます。
[eslint-cli] をグローバル インストールしておくと、**`--save-dev`でインストールした ESLint を実行する `eslint` コマンド** が使えるようになります。

```:shell
> npm install -g eslint-cli
> npm install --save-dev eslint
```

```:shell
> eslint src
```

ローカルの ESLint を探して実行します (無かったらエラーです)。

[eslint-cli]: https://www.npmjs.com/package/eslint-cli
コマンドにおける引用符の動作の違い

##「'」シングルコーテーション
シングルコーテーションは、全て文字列であると解釈される。

##「"」ダブルコーテーション
ダブルコーテーションはシングルコーテーションと同様に文字列であると解釈されるが、
ダブルコーテーション内に変数があれば、その変数の内容が展開される。

##「`」バックコーテーション
バックコーテーション内にコマンドがあると、そのコマンドを実行した結果が展開される。
また、変数の場合は、変数に書く能有されているコマンドを実行した結果が展開される。

##動作例

```
$ DATE=date

$ echo $DATE
date

$ echo '$DATE'
$DATE

$ echo "$DATE"
date

$ echo `$DATE`
Wed Oct 21 11:29:41 UTC 2015
```
DigitalOceanのフローティングIP機能を使う

# Floating IP

DigitalOcean から 10月20日（現地時間）に Floating IP 機能が[発表](https://www.digitalocean.com/company/blog/floating-ips-start-architecting-your-applications-for-high-availability/)された。その機能概要と使い方について整理。

## Floating IP 機能とは

DigitalOcean 上のドロップレット（仮想サーバ）にパブリックな IPv4 アドレスを動的に付けたり外したりできる機能。インターネット側からは、DigitalOcean から割り当てられた Floating IP で接続出来る。ドロップレット内ではパブリック側のインターフェース eth0 に対して、アンカー IP 用の設定（10.15.0.7/16など、プライーベートのアドレス空間）が追加されている。

このアンカー IP は、サービスリリース（10月20日）以降に起動したドロップレットであれば、自動的に割り振られている。しかし、以前のサーバでは手動でアンカー IP の追加作業が必要（コマンド２つで完了）。コマンドの実行手順は OS 毎に異なるものの、GUI上に変更指示が表示される。

### できること

* ドロップレットに対する Floating IP アドレスの取り付け（約10秒）・取り外し（約3秒）
* IP アドレスを他のサーバに付け替える機能
* API を使った Floating IP 制御が可能

### できないこと

* HA 機能やフェイルオーバー機能（障害の検出と自動切り替え）は提供されていない。ただし、Corosync, Pacemaker, Keepalived 等と組み合わせ、いわゆる HA 機能を実現することが出来る模様。詳細後述。

### 価格や手続き

* IP アドレス毎に $0.006/時間
 * サーバに割り当てなくても課金対象としてカウント
 * ただし$1未満は課金されない（約167時間＝1週間までなら課金対象外）
* GUI 上から直ぐに利用可能。申し込み不要
* 解約は GUI 上でキャンセルするだけ

## Floating IP を使うには

DigitalOcean の GUI にアクセスし、`Networking` のメニューをクリックする。対象サーバを選択して、`Assign Floating IP` をクリックする。


![do-floating-ip-1.png](https://qiita-image-store.s3.amazonaws.com/0/13002/85fb26d3-cd9e-688c-3fd8-7f1caf2f3305.png)

ただし、10月20日よりも前に作成したサーバの場合、Anchor IP の設定が必須。IP のレンジと変更箇所は OS 毎に異なるので、画面の指示通りに作業する。

### Ubuntu の例

```
$ sudo ip addr add 10.15.0.5/16 dev eth0
$ sed -i 's/eth0 inet static/eth0 inet static\n        up ip addr add 10.15.0.5\/16 dev eth0/' /etc/network/interfaces
```
※ 環境によって IP 設定が異なるので注意。画面の指示に従う。
![do-floating-ip-2.png](https://qiita-image-store.s3.amazonaws.com/0/13002/8fea2305-9a57-4ffa-1851-d981ef12844f.png)


### CentOS6 の例

```
$ sudo ip addr add 10.15.0.6/16 dev eth0
$ echo 'IPADDR2=10.15.0.6' | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-eth0
```
※環境によって IP 設定が異なるので注意。画面の指示に従う。

## Floating IP の操作

GUI または API で操作可能。

![do-floating-ip-5.png](https://qiita-image-store.s3.amazonaws.com/0/13002/6df535d6-ac0d-0ce6-2c4d-e1943618629b.png)


## 更なる応用（記事へのリンク）

* Corosync and Pacemaker
 * [How To Create a High Availability Setup with Corosync, Pacemaker, and Floating IPs on Ubuntu 14.04 | DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-create-a-high-availability-setup-with-corosync-pacemaker-and-floating-ips-on-ubuntu-14-04)

* Keepalived
 * [How To Set Up Highly Available Web Servers with Keepalived and Floating IPs on Ubuntu 14.04 | DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-set-up-highly-available-web-servers-with-keepalived-and-floating-ips-on-ubuntu-14-04)

* Heartbeat
 * [How To Create a High Availability Setup with Heartbeat and Floating IPs on Ubuntu 14.04 | DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-create-a-high-availability-setup-with-heartbeat-and-floating-ips-on-ubuntu-14-04)


## 参考


* [Floating IPs: Start Architecting Your Applications for High Availability | DigitalOcean](https://www.digitalocean.com/company/blog/floating-ips-start-architecting-your-applications-for-high-availability/)
* [How To Use Floating IPs on DigitalOcean | DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-use-floating-ips-on-digitalocean)
[PHP7] php-fpmでPHPとOracleDBの文字コードのミスマッチを解消する

``php-fmp``経由で``OracleDB``に接続したとき、文字化けしてしまったので、その対処。

### 文字コードのミスマッチ
``PHP``は``UTF-8``です。
でも残念ながら、``OracleDB``の文字コードは``JA16SJIS``です。


### 環境変数を設定

下記、3個の環境変数を設定する

```shell-session:/etc/profile.d/oracle.sh
#!/bin/bash
export ORACLE_HOME=/usr/lib64
export LD_LIBRARY_PATH=/usr/lib64
export NLS_LANG=Japanese_Japan.JA16SJIS
```

### 起動スクリプトに追加

``php-fpm``の起動スクリプトに下記を追加

```shell-session:/etc/init.d/php-fpm
# Oracle Client
. /etc/profile.d/oracle.sh
```

終わったら、``php-fpm``の再起動


### 参考
[Install nginx, php-fpm with oracle on Debian Wheezy](http://soyuka.me/install-nginx-php-fpm-with-oracle-on-debian-wheezy/)



### 小話
``php-fpm``を使わない場合、たとえば``apache2.2``系を使っている場合は

環境変数を、``root``の環境変数に指定するか、``/etc/sysconfig/httpd``に追加すると大丈夫。


### 追記
``yum update php-fpm`` をおこなうと、
起動スクリプトが書き換えられてしまいましたので、ご注意ください。


### 追記
```text:/etc/init.d/php-fmp
# Additional environment file
if [ -f /etc/sysconfig/php-fpm ]; then
      . /etc/sysconfig/php-fpm
fi
```
と書いてあったので、``/etc/sysconfig/php-fpm``に記述しなおしました。
java_sdkでec2からs3へのファイルのやりとりができない(403エラー)場合は署名タイプバージョンを変えてみるとうまくいくかもしれない

ローカル環境ではs3へのファイルのやり取りができていたのに、ec2にデプロイして実行するとs3とのやり取りで403エラーとなる。credentialの問題でもないならば署名タイプを疑ってみてもいいかも。

とりあえず、明示的にversion4を指定してあげればおkだと思います。

```java
public void setup() {
    s3 = new AmazonS3Client();
    System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true"); // これ！！
    Region region = Region.getRegion(Regions.AP_NORTHEAST_1);
    s3.setRegion(region);
    s3.setEndpoint(endpoint);
}

```

##参考
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UsingAWSSDK.html
Homebrewをインストールする

#Homebrewとは
[公式](http://brew.sh/)に"Homebrew は、Apple が用意していないあなたの必要なものをインストールします。"とあるように、OSXに足りないツールを補ったり管理できるパッケージマネージャです。
#Homebrewをインストールしてみる
インストールは簡単で[公式](http://brew.sh/)にあるスクリプトをターミナルに貼り付けて実行するだけです。
**インストールが完了したら確認**
```$ brew doctor```
**できた！**
```Your system is ready to brew```
#エラーが出る！
1.[環境変数に追加する](http://qiita.com/fivestarHoshi/items/c847ad51af388d2dbb4a)と解決するかも？
2.書き込み権限がないというエラーの場合
`/usr/local`ディレクトリに書き込み制限がない場合はchownコマンドを使って所有権とグループを変更します。
**/usr/localの所有権とグループを変更**
```sudo chown -R username:admin /usr/local/*```
**まだWarnigが出る**
`/usr/local/include/node/`内のファイルが列挙されてエラーが出る場合は以下のコマンドでnode.jsのヘッダファイルを消す。
```$ sudo rm -f /usr/local/include/node/*.h
$ sudo rm -f /usr/local/include/node/openssl/*.h
$ sudo rm -f /usr/local/lnclude/node/uv-private/*.h```
#Homebrewをアンインストールしたい
[公式の方法でアンインストールする方法](https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/FAQ.md#how-do-i-uninstall-homebrew)もしくは以下がHomebrewのインストールで作られるファイルなのでこれらを手動で消去してもOK
```"/usr/local/.git"
"/usr/local/.gitignore"
"/usr/local/Cellar"
"/usr/local/Library"
"/usr/local/CODEOFCONDUCT.md"
"/usr/local/CONTRIBUTING.md"
"/usr/local/LICENSE.txt"
"/usr/local/README.md"
"/usr/local/SUPPORTERS.md"
"/Library/Caches/Homebrew"
"~/Library/Caches/Homebrew"
"~/Library/Logs/Homebrew"
"/usr/local/bin/brew"
"/usr/local/share/man/man1/brew"
```
#Homebrewでツールをインストールしてみる
準備ができたのでtreeをインストールしてみます。
treeは指定したディレクトリ内のファイルをツリー形式でかき出してくれるソフトで、納品ファイルを作るときなどに便利です。
**treeをインストールするコマンド**
```$brew install tree```
**任意のディレクトリに"cd"して以下を実行**
```$ tree```
#よく使うコマンド
**パッケージをリスト**
```$ brew list```
**パッケージの情報(treeの場合)**
```$ brew info tree```
**パッケージのアンインストール(treeの場合)**
```$ brew uninstall tree```
**具合が悪い時**
```$ brew doctor```
Mochaを使ったNode.jsでの単体テスト入門の入門

# Mochaを使ったNode.jsでの単体テスト入門の入門

## 用語
### [Mocha（モカ）](https://mochajs.org/)
JavaScriptのテスティングフレームワーク。

### [Chai](http://chaijs.com/)
JavaScriptテスティングフレームワークのアサーションライブラリ。
テスティングフレームワークと一緒に使う。
記述スタイルをshould,expect,assert文から選べる。

### TDD
[テスト駆動開発 (てすとくどうかいはつ、test-driven development; TDD) ](https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA)
  > プログラム開発手法の一種で、プログラムに必要な各機能について、最初にテストを書き（これをテストファーストと言う）、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる、という短い工程を繰り返すスタイルである。多くのアジャイルソフトウェア開発手法、例えばエクストリーム・プログラミングにおいて強く推奨されている。近年はビヘイビア駆動開発へと発展を遂げている。
  
### BDD
[ビヘイビア駆動開発 (振舞駆動開発; behavior driven development; BDD)](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%98%E3%82%A4%E3%83%93%E3%82%A2%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA)
  > プログラム開発手法の一種で、テスト駆動開発から派生した物である。
  > テスト駆動開発で記述されるテストケースは、作成したプログラムの動作が正しいかどうかを検証するために行う「テスト」である。テストであるという点は同一であるが、加えて、これから作成しようとするプログラムに期待される「振る舞い」や「制約条件」、つまり「要求仕様」に近い形で、自然言語を併記しながらテストコードを記述する。テストフレームワークのメソッド名も自然言語（英語など）に近い形をとっている。

### スタイル
* TDDスタイル
  * Node.js標準のassert文がメインのスタイル
  
    ```js:assert
  assert.equal(foo, 'bar');
    ```
* BDDスタイル

  * Should文を使用したスタイル
  > The should interface extends Object.prototype to provide a single getter as the starting point for your language assertions. It works on node.js and in all modern browsers except Internet Explorer.

    Node及びIE以外のモダンブラウザで動く。
  
    ```js:should
    foo.should.be.a('string');
    ```
    
  * Expect文を使用したスタイル
  > The expect interface provides a function as a starting point for chaining your language assertions. It works on node.js and in all browsers.

    Node及びすべてのブラウザで動く☆
  
    ```js:expect
    expect(foo).to.be.a('string');
    ```

## さわってみる
### assertスタイル
```bash
$ npm install mocha --save-dev
$ npm install chai  --save-dev
$ mkdir test
$ ls
node_modules  package.json  test
$ cat <<_EOF> test/test.js
var assert = require('assert');
describe('Array', function() {
  describe('#indexOf()', function () {
    it('should return -1 when the value is not present', function () {
      assert.equal(-1, [1,2,3].indexOf(5));
      assert.equal(-1, [1,2,3].indexOf(0));
    });
  });
});
_EOF
$ mocha
Array
  #indexOf()
    ? should return -1 when the value is not present


1 passing (8ms)

```

### Shouldスタイル
```js:should
var chai = require("chai");
chai.should();

describe('Array', function() {
  describe('#indexOf()', function() {
    it('should return -1 when the value is not present', function() {
      [1,2,3].indexOf(5).should.equal(-1);
      [1,2,3].indexOf(0).should.equal(-1);
    });
  });
});
```

### Expectスタイル
```js:expect
var expect = require("chai").expect;
describe('Array', function() {
  describe('#indexOf()', function() {
    it('should return -1 when the value is not present', function() {
      expect([1,2,3].indexOf(5)).to.equal(-1);
      expect([1,2,3].indexOf(0)).to.equal(-1);
    });
  });
});
```

## おわり
今回Node.jsのテストフレームワークとしてMochaを使用してみましたが、他にもJasmine2とかが有名のようです。

## 参考サイト
* http://qiita.com/oret/items/8c9a216865b088c15d68
* https://mochajs.org/
* http://chaijs.com/
* http://jasmine.github.io/2.0/introduction.html
* http://lxyuma.hatenablog.com/entry/2013/12/15/211637
IntelliJ IDEAで*.mdをHTMLとして認識させる

gitbookなどでmdを書いているとHTMLを書きまくりになってしまったり、
テンプレートの機能を使ったりすると、mdというよりはHTMLになってしまう。

そうなると、mdとしてのチェックよりもHTMLとしてのチェックをしてもらったほうがありがたいので、そう変更したほうが良い。

やり方は`Preference > Editor > FileTypesのHTML`に`*.md`を足すだけ。

![スクリーンショット 2015-10-21 18.44.44.png](https://qiita-image-store.s3.amazonaws.com/0/2382/ccdc12fc-7186-b8b3-6eec-bff388501e83.png)

設定の場所を忘れがちなので書いておく。なおこれでMarkdown Supportのプラグインは効かなくなってしまうので要注意。
JAVA-this

▪️thisを用いないコード

```java
class ThisTest {
	String name = "Neko2";	// Member Variable
	void meth() {
		String name = "Neko";	// Local Variable
		System.out.println(name);	// 何が出力されますか？
	}
}
```

▪️実行結果
Neko

結果としては、ローカル変数が優先されます。ここで出力されるのは "Neko" です。

▪️thisを用いるコード

```java
class ThisTest {
	String name = "Neko2";	// Member Variable
	void meth() {
		String name = "Neko";	// Local Variable
		System.out.println(this.name);	// Member Variable
	}
}
```

▪️実行結果
Neko2

this.name は、「このオブジェクトのメンバー変数 name」 と言う意味です。自クラス内の変数やメソッドを裸で指定していたのは、実は this を省略していたのです。

自分のクラスのメンバーであるメソッドや変数を指定する為には this が使えます。
サンプルコードでいっぱい出てくるベンダー名「Acme」ってなんなの

アクメってエロいやつしか知らないんですけど……

と思ってしらべました

http://stackoverflow.com/questions/12599170/what-does-acme-stand-for-in-symfony2

ルーニーテューンズに出てくる架空の企業名

なーんだ、エロいやつじゃないのね、安心

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1210901142

アメリカでは架空の企業名として一般的によく使われるらしい

そして語源はギリシャ語らしい

google : acme ギリシャ語

http://ejje.weblio.jp/content/acme

エロい意味でした

結論：エロい
自作のjavascrptのプラグインをbowerに載せる方法

# 自作のjavascriptのプラグインをbowerに載せる方法

## 経緯

https://github.com/nmbakfm/toggleForm

というプラグインを作った話を書きましたが、bower対応もしたので、そのメモ


## 作り方

### bower.jsonの作成
プロジェクトのディレクトリで以下のコマンドを叩く。

```
bower init
```

基本Enter連打でいいと思う

### 普通にgitでリポジトリの作成

```
git init
git add .
git commit -m 'first commit'
git remote add master git://github.com/nmbakfm/toggleForm.git
git push -u origin master
```

### タグの追加

以下のコマンドを叩く。ここで、`0.0.0`はbower.jsonに記述した値。

```
git tag 0.0.0
git push origin 0.0.0
```

### bowerに登録

```
bower register toggleForm git://github.com/nmbakfm/toggleForm.git
```

ここでのURLは`git://`で始まらないとダメという記事を見かけた。どこで見たかは失念。うまくいかなかったら`https://`とかで上手くいかなかったら、修正してみてください。

## ちゃんと動いてるかチェック

適当にディレクトリを作って、

```
bower init
bower install toggleForm -S
```

みたいにしてちゃんとできているかどうかをチェックする。

## まとめ

意外と簡単なので、せっかく作ったライブラリがあれば、bowerに登録してみてもいいのではないでしょうか。
VMWareのDHCPにハマった話


#VMWareをWindowsホストで動かすとき、DHCPの設定にハマったポイント

##普通はこれでいける
VMWare playerでWindowsホストのNAT+DHCPで稼働しているゲストOSのIPアドレスを固定したくなるとき。SSHやtelnetで接続する時めっちゃ面倒ですやん。DHCPだと。
ゲストOSのMACアドレスに対して払い出すIPアドレスを指定するわけだが、ここでハマった。
vmnetdhcp.confのVMnet8セクションへ以下のようにホスト情報を記述する、とある。今回、ゲストOSのMACアドレスはDE:AD:BE:EF:CA:FEとした。

```:vmnetdhcp.conf記入例
#"あくまで例なので、ここのコードそのまま使うと地獄行く"
subnet <172.16.16.0> netmask 255.255.255.0 {
range <172.16.16.200> <172.16.16>.254;
#"略"
}
host <centos> {
    hardware ethernet <DE:AD:BE:EF:CA:FE>;
    fixed-address <172.16.16.100>;
    option host-name <"centos">;
    option domain-name-servers <172.16.16.2>;
    option routers <172.16.16.2>;
}
```
これでゲストOSがDHCP取得設定になっていれば、任意のIPアドレスが払い出せる、と思ったが、書いた通りにIPアドレスが払い出されない。解せぬ。
##理由１ vmnetdhcp.confファイルの罠
**dhcp設定ファイルを管理者以外で触るな**
`C:\ProgramData\VMware\vmnetdhcp.conf`
ProgramDataという予約ボリュームってユーザごとにパラレル展開されてるんですかね？上書きしてもファイルを消してもVMwareをアンインストールしても復活するたいへん逞しいvmnetdhcp.confファイルに落涙。
管理者権限で設定ファイルを書き換えたら、必ずVMware DHCP Serviceを再起動すること。VWwareのゲストマシンが動作している最中でも問題ありません。
VMware DHCP Serviceのサービス起動に失敗する場合、次項のレジストリ設定と設定ファイルの内容で相違ある、または、設定ファイルの内容が正しくないのが原因としてあげられる。
VMware DHCP ServiceサービスのイベントログはWindowsログのアプリケーションで確認できる。

##理由２ レジストリ設定の罠
**設定テキストファイルだけだと思った？残念**
`HKLM\SYSTEM\CurrentControlSet\services\VMnetDHCP\Parameters\VirtualEthernetSegments`
VMnet1のホストオンリーネットワークとVMnet8のNAT、2つの仮想ネットワークI/Fの設定がここにも生きてる。ふざけんな。vmnetdhcp.confとは何だったのか。
ネットワーク1と8、それぞれにサブキーが生えているので、お望みのネットワークサブキーのうちHostIpAddressにネットワークのIPアドレスが保存されている。なお、vmnetdhcp.confの中身と相違があるとVMwareDHCPサービスが起動しない。
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/93542/6073b941-c7b7-f9e4-7231-176efaa171c6.png)
IPアドレスのオクテットが上位下位と反転しているので、そこだけ注意。ここを書き換えた場合もVMware DHCP Serviceサービスを再起動したほうが良さそう。

##理由３ インターフェイスドライバの罠
**インターフェイスドライバのIPv4アドレスも指定した？**
自分はハマらなかったが、案外ハマりそうなポイントではある。

#まとめ
1. vmnetdhcp.confを書き換えるときは管理者権限で
2. vmnetdhcp.confを書き換えたらVMware DHCP Serviceを再起動する
3. VMware DHCP Serviceが起動しない場合はレジストリとvmnetdhcp.confに矛盾がある
3. ゲストOSのDHCPクライアント処理を再実行すれば望んだIPアドレスが払い出しされる

のぞみ通りじゃなければ上記のプロセスを見直そう。
Python で DynamoDBを使う

Node.jsでLambda書いてたら非同期処理に心が折れたので、最近リリースされたLambda/Pythonにしようと思って、試してみたメモです。

## ドキュメント

http://boto3.readthedocs.org/en/latest/guide/dynamodb.html

## 準備

```python
import boto3
import json
from boto3.dynamodb.conditions import Key, Attr


dynamodb = boto3.resource('dynamodb')
table    = dynamodb.Table('MY_TABLE_NAME')

```

## query

```python

res = table.query(
        IndexName='MY_INDEX_NAME',
        KeyConditionExpression=Key('MY_INDEX_NAME').eq(MY_INDEX_VALUE)
    )
for row in res['Items']:
    print(row)

```

## delete_item

```python
table.delete_item(Key={'key1': key1, 'key2': key2})

```

## put_item

```python
table.put_item(
    Item={
        "key1": value1,
        "key2": value2
   }
)

```

## get_item

```python
items = table.get_item(
            Key={
                 "key1": key1
            }
        )

```

## batch_write

```python
with table.batch_writer() as batch:
    for i in range(50):
        batch.put_item(
            Item={
                'account_type': 'anonymous',
                'username': 'user' + str(i),
                'first_name': 'unknown',
                'last_name': 'unknown'
            }
        )

```


http://boto3.readthedocs.org/en/latest/guide/dynamodb.html#batch-writing


DynamoDBの制限だと 25件までだけど、25件ずつ送るのも面倒みてくれる様子。

## list_tables

```python
dynamodb = boto3.resource('dynamodb')
table_list = dynamodb.tables.all()
for table in table_list:
    print(table.table_name)

```
ワンライナー個人メモ


## shell
### mkdir && cd, touch && chmod

よく忘れるやつ

```bash
mkdir /tmp/dir && cd $_
touch /tmp/file && chmod +x $_
```

### ランダムなbase64を任意バイトサイズ分

```bash
cat /dev/urandom | base64 | head -c 262144 > rand.txt
```

## ssh
### ポートフォワーディング

ローカルの13306ポートをリモートサーバーの3306にマッピングするとしたら。

```
ssh -N -L 13306:localhost:3306 user@host
```

## nginx
### ログの手動ローテート

```bash
mv /var/log/nginx/access.log{,.`date '+%Y%m%dT%H%M%S%z'`} && kill -USR1 `cat /var/run/nginx.pid`
```

## MySQL
### スローログの手動ローテート

```bash
mv `mysql -uroot -N -B -e "show variables like 'slow_query_log_file'" | \
cut -f 2`{,.`date '+%Y%m%dT%H%M%S%z'`} && \
mysql -uroot -e "FLUSH SLOW LOGS"
```

## Redis
### MySQL to Redis

usersテーブルをRedis Hashesにするとしたら。例えば。

```bash
mysql -uroot testdb -NB -e "select 'HMSET',concat('users-', id), 'id', id, 'account_name', account_name from users limit 10" | perl -pe 's/\n$/\r\n/' | redis-cli --pipe
```

値にスペースが含まれていたりする場合は、クォートで囲むべし。
PHP imagemagickでの画像破損＆CMYKチェック

PHP　imagemagickで


```
// CMYKチェック
// $filename = 画像ファイルパス
//
function f_check_CMYK($filename)
{
  $rtn_st = "OK";
  $im = new Imagick($filename);
  $colorspace = $im->getImageColorspace();
  if($colorspace==12) //12ならCMYK
  {
    $rtn_st = "CMYK";
  }
  return $rtn_st;
}
```


```
//画像破損チェック
// $filename = 画像ファイルパス
//
function f_djpeg_check($filename)
{
  if(imagecreatefromjpeg($filename)==false)
  {
    $rtn_st = "NG";
  }else{
    $rtn_st = "OK";
  }
  return $rtn_st;
}
```