OmniAICreator/Qiita-1.07M huggingface dataset:
既存のJavaScriptをCoffeeSrcriptに書き換えたときにわかったことメモ


## GulpfileをJSからCoffeeScriptに書き換えました
ちょっと前の話なので、書き換えたときにはまった部分を個人的にメモ。

### 関数呼び出しの時の()は不要だけど、引数なしの時は必要

    ☓ func
    ◯ func()

### 関数呼び出しの結果をまとめる時注意

    func1 func2 arg1, arg2
      ↓
    func1(func2(arg1, arg2));

    func1 func2(arg1), arg2
      ↓
    func1(func2(arg1), arg2);

### `===`は`is`を使う

    func1() if val is undefined
      ↓
    if (val === void 0) {
        func1();
    }

### 連想配列の初期化は結構便利

    hash1 = key1: 'val1', key2: ['val2'], key3: key31: 'val31'
      ↓
    hash1 = {
      key1: 'val1',
      key2: ['val2'],
      key3: {
        key31: 'val31'
      }
    };


### でも改行を入れたほうがわかりやすい（ついでに末尾にカンマ打ちまくってもOK）

    hash2 =
      key1: 'val1',
      key2: ['val2'],
      key3:
        key31: 'val31',
        key32: 'val32',
      key4: 'val4',
      ↓
    hash2 = {
      key1: 'val1',
      key2: ['val2'],
      key3: {
        key31: 'val31',
        key32: 'val32'
      },
      key4: 'val4'
    };


### 三項演算子はちょっと違う（「:」が上述の初期化と誤爆する）

    val3 = if val1 > 1 then val1 else val2
      ↓
    val3 = val1 > 1 ? val1 : val2;

## JSにコンパイルして確認する
基本的に`Ruby`の書き方が色々と適応できます。気になったら、スクリプトを書いてみて、以下のコマンドでJSファイルにコンパイルして、確認してみるとわかりやすいかと思います。

    ./node_modules/.bin/coffee -c xxx.coffee
angularticsの属性のマッピングについて


[angulartics](http://luisfarzati.github.io/angulartics/)はAngularJSでGoogleアナリティクスを使うときに便利な子です。  
内部的にはGA以外にも対応しているようですが、そのせいで渡したい属性値のキーが微妙に汎用的でした。なので、そのマッピングについての個人的なメモです。

まぁ最終的にはソースを見ましょうってことなんですけどね・・・
https://github.com/luisfarzati/angulartics/blob/master/src/angulartics-ga.js

|GA | angulartics |
|:-----------|:------------|
| category | category|
| action | event|
| opt_label | label |
| opt_value | value |
| opt_noninteraction | noninteraction |

タグに直接埋め込む場合は`analytics-`の接頭語をつければ良いらしい。

例）
```
<button type="button" analytics-on="click" analytics-category="カテゴリーはここ"  analytics-event="アクションがここ" analytics-label="ラベルはここ" analytics-value="任意の値" analytics-noninteraction="true">てすとボタン</button>
```
Chromeでも画面全体のキャプチャ―を取得する（Selenium2 WebDriver）

## ChromeWebDriverで普通に画面のキャプチャーを取得すると。。。
クロスブラウザテストしたくて、WebDriverでテストを実行したのですが、
ChromeのWebDriverでは画面全体のキャプチャーが取得されません。。。
縦に長―い画面だと一部しかキャプチャ取れないんです。。。

###・普通のスクリーンショット取得方法だと。。。

```java:普通のスクリーンショット
		WebDriver driver = new ChromeDriver();
		driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
		driver.get(baseUrl + "/sample.html");
        driver.switchTo().defaultContent();
		TakesScreenshot ts = (TakesScreenshot) new Augmenter().augment(driver);
		FileUtils.moveFile(ts.getScreenshotAs(OutputType.FILE), new File("c:\\temp\\img-"+ System.currentTimeMillis() +".png"));

```

###・結果
![img-1435913378855.png](https://qiita-image-store.s3.amazonaws.com/0/68903/dca9f3ff-def9-fb9b-36f9-6e1adbd68e93.png)

↑↑こんな感じで途中で切れたファイルが保存されちゃいます。これじゃだめだ。怒られる。。

#こんな感じで対応しました

WebDriverからJsを実行できるので、
ぐりぐりスクロールさせつつ、
スクリーンショットを撮って、
画像を繋げて保存するようにしました。

サンプルは以下の感じです。

```java:画面全体を撮るスクリーンショット
		WebDriver driver = new ChromeDriver();
		driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
		driver.get(baseUrl + "/sample.html");
		driver.switchTo().defaultContent();
		TakesScreenshot ts = (TakesScreenshot) new Augmenter().augment(driver);

		//JS実行用のExecuter
		JavascriptExecutor jexec = (JavascriptExecutor) driver;

		//画面サイズで必要なものを取得
		int innerH = Integer.parseInt(String.valueOf(jexec.executeScript("return window.innerHeight")));
		int innerW =Integer.parseInt(String.valueOf(jexec.executeScript("return window.innerWidth")));
		int scrollH = Integer.parseInt(String.valueOf(jexec.executeScript("return document.documentElement.scrollHeight")));

		//イメージを扱うための準備
		BufferedImage img = new BufferedImage(innerW, scrollH, BufferedImage.TYPE_INT_ARGB);
		Graphics g = img.getGraphics();

		//スクロールを行うかの判定
		if(innerH>scrollH){
			BufferedImage imageParts = ImageIO.read(ts.getScreenshotAs(OutputType.FILE));
			g.drawImage(imageParts, 0, 0, null);
		} else {
			int scrollableH = scrollH;
			int i = 0;

			//スクロールしながらなんどもイメージを結合していく
			while(scrollableH>innerH){
				BufferedImage imageParts = ImageIO.read(ts.getScreenshotAs(OutputType.FILE));
				g.drawImage(imageParts, 0, innerH*i, null);
				scrollableH=scrollableH - innerH;
				i++;
				jexec.executeScript("window.scrollTo(0,"+innerH*i+")");
			}

			//一番下まで行ったときは、下から埋めるように貼り付け
			BufferedImage imageParts = ImageIO.read(ts.getScreenshotAs(OutputType.FILE));
			g.drawImage(imageParts, 0, scrollH - innerH, null);
		}

		ImageIO.write(img, "png", new File("c:\\temp\\mergeimg-"+ System.currentTimeMillis() +".png"));
```
###・結果
このようにスクロールされた画像が取得できました！
一番下をいい感じに上書くのがポイントですね。

![mergeimg-1435914616300.png](https://qiita-image-store.s3.amazonaws.com/0/68903/155955e2-aefa-3196-3ec7-a3f9c5cc7f99.png)
備忘録：bash操作


※Tera Termの場合、メニューバーの [設定] - [キーボード] で 「Meta キー」を「on」にすれば 「Esc」の代わりに「Alt」が使用可能になる

カーソルの移動
---------------
| コマンド | 内容 |
|:--------- |:-----|
| Ctrl + a | カーソルを行の先頭に移動 |
| Ctrl + e | カーソルを行の末尾に移動 |
| Ctrl + b | カーソルを左に一文字移動 |
| Ctrl + f  | カーソルを右に一文字移動 |
| Esc + f  | １単語右にカーソルを移動 |
| Esc + b  | １単語左にカーソルを移動 |

削除関連
---------------
| コマンド | 内容 |
|:--------- |:-----|
| Ctrl + d | カーソルの右一文字を削除 |
| Ctrl + h | カーソルの左一文字を削除 |
| Ctrl + k | カーソルの右側にある文字を削除 |
| Ctrl + u | カーソルの左側にある文字を削除 |
| Ctrl + w | カーソルの左側にある１単語を削除 |
| Esc  + d | カーソルの右側にある１単語を削除 |

その他
---------------
| コマンド | 内容 |
|:--------- |:-----|
| Ctrl + y | 削除した文字列を貼り付け |
| Ctrl + c | フォアグランドで実行しているプログラムを強制終了 |
| Ctrl + r | コマンド履歴の検索モード |
| Ctrl + l | 画面をクリア |
_UIScreenEdgePanRecognizer が原因でクラッシュする

##前置き

あるときから、こんな感じのエラー報告が度々上がるようになっていました。
再現性もほぼ100%で、どうもnavigationControllerのinteractivePopGestureRecognizerが実行されるときに発生しているようでしたが、直し方がわかりませんでした。

```lang:stackTrace
Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x216fd19d

0 libobjc.A.dylib	objc_msgSend + 5 hash
1 CoreFoundation	-[__NSSetM member:] + 68
2 CoreFoundation	-[NSSet containsObject:] + 24
3 UIKit	 -[UIGestureRecognizer _shouldBegin] + 832
4 UIKit	 -[UIGestureRecognizer setState:] + 390
5 UIKit	 -[_UIScreenEdgePanRecognizer _incorporateIncrementalSampleAtLocation:timestamp:modifier:interfaceOrientation:] + 134
6 UIKit	 -[_UIScreenEdgePanRecognizer incorporateTouchSampleAtLocation:timestamp:modifier:interfaceOrientation:] + 138
7 UIKit	 -[UIScreenEdgePanGestureRecognizer touchesMoved:withEvent:] + 216
8 UIKit	 -[UIWindow _sendGesturesForEvent:] + 460
9 UIKit	 -[UIWindow sendEvent:] + 524
10 UIKit	 -[UIApplication sendEvent:] + 196
11 UIKit	 _UIApplicationHandleEventFromQueueEvent + 14414
12 UIKit	 _UIApplicationHandleEventQueue + 1352
```

## 原因
わかってしまえば単純なことで、interactivePopGestureRecognizer.delegateにviewDidLoadでselfを指定していたことが原因でした。

この機能について解説してあるブログを読んだときに、viewDidLoadで指定していたので何か理由があると思ってそのまま採用してしまった…。
やはりちゃんと考えないといけませんね。

```lang:objective-C
self.navigationController.interactivePopGestureRecognizer.delegate = (id <UIGestureRecognizerDelegate>) self;
```
というわけで、この記述はviewWillAppear:などに記述しましょう。
また、必要ない画面では逆にnilを指定することを忘れずに。

そうしないと、EdgeGestureが実行されたときに最後にdelegateへ指定したViewControllerを参照しようとして、存在しないviewControllerを参照してcrashしてしまいます。
setImmediate()とnextTick()なにが違うの

# 結論
どちらも処理を次のイベントループに追加する。

違いは
 - setImmediate(): IO処理の後
 - nextTick(): IO処理の前

迷ったらsetImmediate()使っとけばいいいと思う。

# 参照
http://jxck.hatenablog.com/entry/for-with-eventloop
これ見ればよい。

要は、I/O処理より先に呼ばれるのがnextTickで後に呼ばれるのがsetImmediate。
eventloopの効率利用を考えると先にI/0処理したいので、setImmediate()を選択しとけば間違いなさそう。
CakePHP 3で命名規則に沿わないTableクラスを作る

CakePHP入門のため、苦労しているまっただ中。
CakePHP 2系の情報はよく出てくるものの、CakePHP 3系の情報に行き当たるまでに結構苦労したので…。

## やりたいこと
Tableクラスのクラス名はWeathersTableにしたい。
このクラスをtbl_weatherというテーブル名に関連付けたい。

## CakePHP 2系での書き方。
以下のように書く…らしいのだが、おいらはCakePHP 2を使ったことがないので、あっているか分からん。

```php
class Weathers extends AppModel {
    public $useTable = 'tbl_weather';
}
```

## CakePHP 3系での書き方
```php
class WeathersTable extends Table
{
    public function initialize(array $config)
    {
        $this->table('tbl_weather');
    }
}
```

で、[公式のCookbook](http://book.cakephp.org/3.0/en/orm/table-objects.html#basic-usage)にちゃんと載っていましたとさ。
Facebook SDK for Androidをつかってみる

(かなり前に書いて下書きになったままだったので公開してみる)
やり方は公式サイトにかいてあるとおりだとできないのでめもめも
https://developers.facebook.com/docs/android/getting-started/

# 環境

## 統合開発環境
* わけあってeclipse 

## Android API
* sdkを使うにはAndroid 2.2 (API 8)が必要とかいていますが、2014/9/20現在は4系APIでも問題なく動きました
  * 文書メンテされてないのかな…?
* 一緒に入ってるsampleを動かすにはAPI9がmust
  * 入っていないと"Unable to resolve target 'android-9'" と怒られてしまいます

# 手順

## Android 2.2 (API 8)いれる

## SDK DL
* ここからどうぞ
 * https://developers.facebook.com/resources/facebook-android-sdk-current.zip  
私がやったとき(2014/08/21)はfacebook-android-sdk-3.17.1が落ちてきました

* sdkの認証フローを実際に確認したい場合はここからzipファイルをDLして.apkに名前を変更する
 * https://developers.facebook.com/resources/Facebook-11.zip
* adbでinstallする
```
adb install [ダウンロードした場所]/Facebook-11.apk
```
※ これ、何度やっても私はDLできませんでした…

## Android 3.2.1 (API 9)いれる
これをいれるとSDKと一緒に入っているsampleアプリも動かせる
サンプルなんていらないって人は入れなくていいと思われるやつです
oldに☑いれないと表示されないので、一覧にないなーと思ってもあきらめないで  

## サンプルアプリを入れて動かしてみる
画面もSDKがもっているのか

なんとなく動きがわかって納得できたのであとは自分のアプリに入れて使ってみる！
注文APIの利用申請について

注文APIの利用申請について質問があります。

注文APIの利用申請フォームですが、
このフォームの「APIのリクエスト元IPアドレス」という項目に入力したIPアドレスで本番環境ではアクセス制限されるということでしょうか？


よろしくお願いいたします。
【Java】URLから画像を読み込みbinary配列を取得したい

画像ファイルアップロードする際に取得したデータをbinary形式で送らなきゃ行けなかったのでメモ
ImageIO便利だった

```java
public byte[] binary getImageByteArray(String imageUrl, String fileNameExtension) {
  URL url = new URL(imageUrl);
  BufferedImage readImage = ImageIO.read(url);
  ByteArrayOutputStream outPutStream = new ByteArrayOutputStream();
  ImageIO.write(readImage, fileNameExtension, outPutStream);
  return outPutStream.toByteArray();
}
```

```java
byte[] binary = getImageByteArray("http://example.com/example.png", "png");
```
watchOS 2 対応時にハマったこと

<i>Appleが一般にも公開している範囲で書いております。また、本記事の内容は私がハマった点について記録したもので、この対応法が正しいことを保証するものではありません。</i>

基本的にはXcodeが自動的に

watchOS 1 → watchOS 2

へコンバートしてくれるのですが、これだけだとビルドが通りませんでした。私がハマった点をメモしておきます。

# 1. WatchKit Extensionのbundle identifier問題

watchOS 2にコンバート後、ビルドしようとしたら

```
Embedded binary's bundle identifier is not prefixed with the parent app's bundle identifier.
```

というエラーが。

つまり、WatchKit Extensionのbundle identifierが、親のWatchAppのbundle identifierをPrefixに持ってないとダメってことらしいです。（watchOS 1ではこんなことはなかった）

同じような問題に直面している人も見つけました。

* [New Watch OS 2.0 target but now a WKAppBundleIdentifier is required](https://forums.developer.apple.com/thread/7019)

## 念のため実験

試しにXcodeで新しいWatch Appを作ってみたところ、bundle identifierは次のようになっていました。

<table>
<tr><th>Watch App</th><td>com.koogawa.SampleWatchOS2.watchkitapp</td></tr>
<tr><th>WatchKit Extension</th><td>com.koogawa.SampleWatchOS2.watchkitapp.watchkitextension</td></tr>
</table>

この状態でビルドすると、問題なく動きます。

次に、WatchKit Extensionのbundle identifierから「watchkitapp」を取り除いてビルドしてみます。

すると、

```
Embedded binary's bundle identifier is not prefixed with the parent app's bundle identifier.

Embedded Binary Bundle Identifier:	com.koogawa.SampleWatchOS2.watchkitextension
Parent App Bundle Identifier:		com.koogawa.SampleWatchOS2.watchkitapp
```

というエラーが出てビルドに失敗しました。

やはり、watchOS 2では <b>WatchKit Extension の bundle identifier が、親の WatchApp の bundle identifier を Prefix に持ってないといけない</b>ようです。

プロビジョニングプロファイル作りなおさないとダメですな／(^o^)＼

# 2. startUpdatingLocationが使えない問題

これは、[WWDC 2015のビデオ](https://developer.apple.com/videos/wwdc/2015/?id=714)でも解説されていましたね。

代わりに

```
-requestLocation
```

メソッドを使えば良さそうです。

# 3. App Groupsでデータを共有できない問題

問題というか、仕様？

確かに今まではiPhoneの中で動いてものがApple Watch側に移動したので、共有できないのは当然なのかも。

![c725d420-826b-9431-26d8-69a920e19443.png](https://qiita-image-store.s3.amazonaws.com/0/8292/888c3fb1-2ef2-995b-8942-a08e4fbff373.png)
（▲[watchOS 2 Transition Guide](https://developer.apple.com/library/prerelease/watchos/documentation/General/Conceptual/AppleWatch2TransitionGuide/index.html)より引用）

− [Watch OS 2 and App Groups.](https://forums.developer.apple.com/thread/3927)

上記のスレッドを見るとWatch Connectivityを使うようなことが書かれていますが、こちらは調査中です。（詳しい方がおりましたら教えて下さい！）

<b>2015.7.9追記：</b>Watch Connectivityについてまとめました。
http://qiita.com/koogawa/items/b39e1419cbbcda8efc07
今後はWatch Connectivityを使ってデータを受け渡すのが良さそうですね。

# 4. NSURLConnection がエラーになる問題

[Transition Guide](https://developer.apple.com/library/prerelease/watchos/documentation/General/Conceptual/AppleWatch2TransitionGuide/ScopingtheProject.html#//apple_ref/doc/uid/TP40015234-CH3-SW1) にもある通り、watchOS 2からは `NSURLSession` を使って Apple Watch 単体でサーバとの通信ができるようになりました。

一方、`NSURLConnection` による通信を実行しようとすると次のようなエラーが出るようになりました。

```
Error Domain=NSURLErrorDomain Code=-1009 "The Internet connection appears to be offline." 
```

`NSURLConnection` ベースで書かれたライブラリを使っている場合は `NSURLSession` ベースのものに切り替える必要がありそうです。

# 参考リンク

* [watchOS 2 Transition Guide](https://developer.apple.com/library/prerelease/watchos/documentation/General/Conceptual/AppleWatch2TransitionGuide/index.html) - Appleによる移行ガイド。一読することをオススメします。

＊＊＊

また問題が見つかったら追記したいと思います。（この記事をストックしておいて頂ければ更新時に通知します）
OS X Server.app (Yosemite) を Uninstall して元のYosemite の Apache2 の設定に戻す方法


1) まずServer.app起動して、すべてのサービスを「切」にしておく。その後Server.appは終了する。

2) 以下のコマンドでServer.appのWebサービスの設定をdefaultに戻す。

```shell
sudo serveradmin command web:command=restoreFactorySettings
```
　
3) http://localhost/ などをみたりしてWebサーバが上がっていないことや、DHCPだったりDNSだったりがおかしくなっていないか他のマシンでも確認する（Server.appをuninstallして影響がないことを確認）

4) Server.appを削除する。LaunchPadにはいってoption押しっパなしにするとアイコンがぶるぶるしながら肩にバッテンがでるので、バッテンをclick。

5) 以下のファイルがあれば消す。

>  /Library/Preferences/com.apple.serverd.plist
>  /Library/Preferences/com.apple.servermgr_*.plist
>  /Library/Preferences/com.apple.servermgrd.plist
>  /Library/PrivilegedHelperTools/com.apple.serverd
>  /Library/Server (ディレクトリごと全部)

6) Mac再起動。

7) /Applications ディレクトリから Server.app がなくなってることを確認して、以下の2つファイル（httpd.confとorg.apache.httpd.plist）の中身を確認して設定を戻す。（書き換える前に、`cp -rp` したりして backup とっておくこと）

>  /etc/apache2/httpd.conf

もし同じディレクトリに httpd.conf.pre-update や httpd.conf~previos のような、以前のconfが残っていればそれをhttpd.confに採用してもいいし、サブディレクトリにoriginal/httpd.confがあるので、それを利用する。

この original が Yosemite インストール直後の元本なので、日付などを覚えておくと以下の plist を TimeMachine で復帰させるときの手がかりになる（いつアップデートしたか忘れてたりするので）。

一応サブディレクトリother/やextra/なども確認しておくこと（Yosemiete の Apache2はdefaultでother以下は読込む。phpなどの設定もここにあったりする）。

>  /System/Library/LaunchDaemons/org.apache.httpd.plist

もし中身が org.apache.httpd でなく com.apple.server になっていたら、org.apache.httpd に直す。org.apache.httpd.plist を書き換えたら

```shell
sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist
sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist
```

して設定を再loadする。（ほかにも設定変更されているかもなので、できれば TimeMachine などでYosemiteインストールしたての時のorg.apache.httpd.plistを復帰させたほうが安心）

8) ほかにも/etc/php.iniが書き換えられているので、/etc/php.ini.defaultなどから元に戻しておく。

9) apache起動

```shell
sudo apachectl start
```

10) http://localhost がみられるかwebブラウザなどで確認（Yosemite defaultのままなら/Library/WebServer/DocumentsがapacheのDocumentRootのはず。「It works!」と表示される。）

11) おつかれさまでした。




参考：

Apache web server won't start. org.apache.httpd.plist: Operation already in progress
https://discussions.apple.com/thread/6602475

Restore Apache2 service after removal of Server.app
http://remonpel.nl/2014/08/restore-apache2-service-after-removal-of-server-app/
本番用アプリケーションIDについて

注文APIを利用するためアプリケーションIDを取得したのですが、
本番用に取得したアプリケーションIDで注文APIに接続しようとすると、
以下の様なエラーが表示されてしまいます。

"This application ID is not registered for using order API. Use of order API requires an application ID."

テスト用のアプリケーションIDでは接続できるのですが、
本番用のアプリケーションIDだとなぜかエラーになってしまいます。

アプリケーション管理画面で確認すると、
「ストア向け操作関連の機能 (開示先限定スコープ)」にチェックが入っているので注文APIを利用できると思うのですが。

何が原因か分かりますでしょうか？

よろしくお願いいたします。
ubuntu 14.04でdockerでjenkinsで遊んでみる その２

Docker 4日目のみゅみゅです。
昨日はjenkinsを作って遊んでみましたが、Dockerについて調べたらコンテナやイメージの中に永続的なデータを置いちゃダメって
なので昨日のjenkinsのバックアップをコンテナの中に展開して運用はダメだそうです。
（案の定、コンテナを一度止めて再度runすると、バックアップは綺麗さっぱり消えました）

じゃーどうやって使うんだ！　ということで永続的データ（バックアップ）をコンテナの外に置いてもう一度チャレンジです！

https://github.com/jenkinsci/docker

こちらのページでJenkins_homeを外にマウントする引数がのってますのでそれでやってみます

```shell-session
※イメージの確認
root@raidtest:~/docker_test# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
jenkins             latest              4704aa632ce7        2 weeks ago         887.1 MB

※jenkins_homeの作成（ホスト側に）
root@raidtest:~/docker_test# mkdir jenkins

※書いてある通りの引数で実行
（docker_testってディレクトリつくってあります　その下にjenkinsって作った）
root@raidtest:~/docker_test# docker run -p 8080:8080 -p 50000:50000 -v /home/miyumiyu/docker_test/jenkins:/var/jenkins_home jenkins

～ずらずらずら～　と

INFO: Finished Download metadata. 15,032 ms
--> setting agent port for jnlp

※とりあえず動いたかなぁ？
```

この状態でホストのIPの8080にアクセスをするとjenkinsの画面が出ます。

```shell-session
--> setting agent port for jnlp
^C

※Ctrl+c で一度止めて

root@raidtest:~/docker_test#
root@raidtest:~/docker_test# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
root@raidtest:~/docker_test#

※コンテナを確認すると起動してるコンテナなし

※jenkinsのマウントしたディレクトリを見てみると
root@raidtest:~/docker_test# ls jenkins/
Download metadata.log          identity.key.enc  jobs              nodes    queue.xml   secret.key.not-so-secret  updates      war
hudson.model.UpdateCenter.xml  init.groovy.d     nodeMonitors.xml  plugins  secret.key  secrets                   userContent
root@raidtest:~/docker_test#

※なんかいろんなファイルが出来てる

※昨日、固めたバックアップを展開
root@raidtest:~/docker_test# cd jenkins/
root@raidtest:~/docker_test/jenkins# tar zxvfp ../../jenkins-backup_20150701.tar.gz
./config.xml
./credentials.xml

～ずららっと～

※もう一度実行！
（こんどは -dオプションを付けて実行後、デタッチする）
root@raidtest:~/docker_test/jenkins# cd ..
root@raidtest:~/docker_test# docker run -d -p 8080:8080 -p 50000:50000 -v /home/nyamagu/docker_test/jenkins:/var/jenkins_home jenkins
a4c6744ff16a7f2df3a451d2e1af93a1679facfbe7374dffdbdd7eb8ff350821
```

この状態でjenkinsにwebでアクセスするとバックアップデータがリストアされた状態になっています。

これでジョブの実行！　で、なんかうまくいかなかったので気をつけなきゃいけないのは以下のところです。

- コンテナの中のjenkinsUID、GIDは以下の通り

```shell-session
jenkins:x:1000:1000::/var/jenkins_home:/bin/bash
```

展開したjobディレクトリは1000:1000でアクセスできる状態にしておかないとダメ

- ssh経由でsvnとかやっているのですが、ssh_keyとかちゃんと設定
　　（場所、オーナ、パーミッション等々）

この二点の修正でなんとなく動きました！

・・・使えるかどうかこの際、おいておきましょう。。。
$ionicPlatform.readyが発火しなくてハマった


#**概要**

##条件

<a href="https://github.com/diegonetto/generator-ionic" target="_blank">generator-ionic</a>を使用して開発。`grunt emulate:ios --livereload`をして、`consolelogs`でconsole.logを有効にする。

##現象

`app.js`の`run`にある`$ionicPlatform.ready`が走らない（他の箇所にあるものも同様）。

```js:app.js
angular.module('app', ['モジュール']).run(function($ionicPlatform) {

  $ionicPlatform.ready(function() {
    console.log('$ionicPlatform.ready log');
  });
})
```

代わりに、以下の様なエラーが出現。

```zsh
1       log      deviceready has not fired after 5 seconds.
2       log      Channel not fired: onCordovaInfoReady
```

この辺りの記事を見てみたが、どの記事も、根本的な解決策ではなかったり、自分とは関係のなさそうな原因だったりで、途方に暮れる。

* <a href="http://forum.ionicframework.com/t/ionic-cli-livereload-causes-errors-deviceready-has-not-fired-after-5-seconds/" target="_blank">Ionic CLI livereload causes errors: deviceready has not fired after 5 seconds - Ionic Forum</a>
* <a href="https://github.com/katzer/cordova-plugin-local-notifications/issues/167" target="_blank">DeviceReady not firing · Issue #167 · katzer/cordova-plugin-local-notifications</a>
* <a href="https://github.com/driftyco/ionic/issues/1751" target="_blank">Function inside ionic.Platform.ready() is never fired on android · Issue #1751 · driftyco/ionic</a>
    * cordova.jsの読み込み位置を変更
* <a href="http://forum.ionicframework.com/t/ionicplatform-ready-not-firing/4959" target="_blank">$ionicPlatform.ready not firing - ionic - Ionic Forum</a>
* <a href="https://github.com/driftyco/ionic-cli/issues/259" target="_blank">deviceready has not fired after 5 seconds · Issue #259 · driftyco/ionic-cli</a>
* <a href="http://stackoverflow.com/questions/24470166/android-cordova-3-5-0-deviceready-not-firing-after-installing-media-plugin" target="_blank">Cordova 3.5.0 deviceready not firing after installing media plugin - Stack Overflow</a>
    * cordova file pluginのバージョン




#**解決策**

どうしようもなくなったのでstackoverflowで質問をしようとしたところ、以下の記事を発見。

* <a href="http://stackoverflow.com/questions/16312222/why-does-cordova-2-7-0-js-seemingly-no-longer-work-on-remote-pages" target="_blank">Why does Cordova 2.7.0 JS seemingly no longer work on remote pages? - Stack Overflow</a>

cordovaのバージョンが原因で動かなくなっているらしい。試しに、4.x.x系と指定してあったものを、

```bash:package.json
    "cordova": "^4.0.0",
```

3.x.x系に変更し、`npm install`を実行。

```bash:package.json
    "cordova": "^3.0.0",
```

また、記事にあったように、**空の`cordova_plugins.json`をルートディレクトリにおく**。

そして、念のため以下を実行。

```zsh
$ ionic platform remove ios
$ ionic platform add ios
```

`grunt emulate:ios --livereload`して確認する。しかし、`** BUILD SUCCEEDED **`のあとに、再び以下エラーが・・・。

```zsh
1       log      deviceready has not fired after 5 seconds.
2       log      Channel not fired: onCordovaInfoReady
```

もうダメかと思ったところ、少し待っていると以下が出力された。

```zsh
com.example.GeneratorIonicTest: 78721
** RUN SUCCEEDED **
```

そこでクライアントを`restart`をすると・・・。

```zsh
1        log      $ionicPlatform.ready log
```

無事解決しました。
クリップボード拡張Macアプリ「Clipy」を公開しました

クリップボード拡張Macアプリケーション「[Clipy](http://clipy-app.com)」を公開しましたので、内部で使っているフレームワークや作成の経緯などを書いていきます。

[Clipy Web Site](http://clipy-app.com)

## 開発背景
私はMacを使い出してから[ClipMenu](http://www.clipmenu.com/ja/)を愛用してきました。
クリップボード拡張という便利機能に加え、スニペット機能によって格段に作業効率が上がるためです。
しかし、OSとの相性が悪いのかかなりの確率でアプリ自体のCPU使用率が100%になり固まってしまい作業がストップしていました。
原因として考えられるのは、

* ClipMenu本体の開発が Snow Leopard対応までで止まっている
* ペーストの内容をメモリ上に保存している

などといったことが考えられます。

本家ClipMenuの開発では、Swiftでのリファクタバージョンの開発始まったため、使用していましたが、一番愛用しているスニペット拡張は未実装となっていました。
その後アップデートもないため、またMacアプリ開発の初期段階として今回自作することにしました。

ClipMenuの作者[naotaka](http://github.com/naotaka)氏は、Objective-Cで記述された前バージョンをオープンソースとして公開されています。
[ClipMenu リポジトリ](http://github.com/naotaka/clipmenu)

今回新たにClipyを公開できたのは、このオープンソース公開があったためです。
改めてnaotaka氏に感謝申し上げます。

## 変更点
今回ClipMenuの改変にともない、既存の機能のクリップボード拡張・スニペット機能のみにしぼってVersion1.0.0としてリリースしました。
変更点は

* クリップ履歴のオブジェクトをメモリ上ではなくDBに保存
    * data本体ファイルはディスクに保存し、DBにそのパスを格納
* Objective-Cの実装からSwiftへ
* 内部DBをCoreDataからRealmへ
* アイコンの変更

等を行いました。
js拡張などの拡張機能はまるごと削除していますが、クリップボード拡張アプリとしての基本は全て実装されています。

## WebSite
アプリ開発にともないWebSiteを公開しました。
Downloadボタンより、dmgファイルをダウンロードして使用してください
http://clipy-app.com

## オープンソース
ClipMenuのライセンスに従いClipyも全てオープンソースとして公開しています。
[Clipy リポジトリ](http://github.com/Clipy/Clipy)
実装はSwiftの機能を活かした実装にはまだなっておらず、Objective-Cらしさがのこっている部分はありますが、実働しているコードとして少なくとも参考になると思います。
機能自体も絞っているため実装も比較的おいやすいはずです。

## ２次利用
オープンソースとして公開しており、MITライセンスですが、[ClipMenuのAppStoreへの配布問題](http://www.clipmenu.com/ja/blog/2014/10/27/ripped-off-clipmenu-on-mac-app-store/)にもある通り、Clipyにも同様の条件をつけさせていただきます。
また、ライセンス標記としてClipMenuのライセンスにも準拠してください。
せっかくのオープンソースですから、有料で購入ということがないように記事の拡散をしていただければと思います。

##フレームワーク
内部フレームワークとして以下を使用しています。

* [Realm](http://realm.io)
    * 内部DBにRealmを使用しました。Realmがβ版というこもあり、不便な部分もありましたが、高速なレスポンス・実装のしやすさではこれまではDBの中で郡を抜いていると思います。これからも積極的に取り入れていきたいです。
* [ShortcutRecorder](https://github.com/iKorich/shortcutrecorder)
    * ショートカットキーの登録にはshortcutRecorderを使用しました。現状ShortcutRecorder2が整備されているOSSですが、こちらで⌘キー以外が表示されない問題があったため、forkプロジェクトの使用できるものを使用しました。
* [DBPreferenceWindowController](https://github.com/kgn/DBPrefsWindowController)
* [Sparkle](https://github.com/sparkle-project/Sparkle)
    * アップデートの確認にはSparkleを使用しました。Sparkleの使用についてはあまりまとまっている記事がないため、使用方法などまとめて別記事にアップする予定です。
   
直接は関係ありませんが、今回アプリケーションをインストールする.dmgにも背景等を使用したカスタムdmgを使用しました。
別記事にて作成方法などをまとめていきたいと思います。

## Feature
現状の機能では、安定版とはいえClipMenuのぱくり、劣化版でしかありません。
その他機能の拡張も行っていきますが、今後Clipyが進んでいく実装はスニペット拡張をメインとして考えています。

### Snippet Market
スニペットをIDEのパッケージマネジャーのような形でアップロード・ダウンロードできる機能を考えています。
例えば、プログラムでの定型文、メールでの定型文などスニペットとして予め登録しておくことで、時間をはるかに短縮できることがあります。
他人のスニペットにはコードの闇の知見、解決策などが詰まっているかもしれません。
そのスニペットを共有できれば、便利ですし、おもしろいはずです。

### 動的スニペット
他のアプリケーションには導入されていたりしますが、動的なスニペットを実装も考えています。
例えば、予め日付を表示するスニペットを登録しておけば、その日の日付が入力されるなどです。

## issue&PullRequest
前述した通りClipyは全てオープンソースとして公開されています。
バグや不具合、要望等ありましたら、Issue、PullRequestなどお待ちしています。
記述は日本語で問題ありません。

なにかありましたら、[@econa77](http://twitter.com/econa77) もしくは [@clipy-app](http://twitter.com/clipyapp)までご連絡ください。
これから進化させていきますので、どうぞよろしくお願いいたします。
【メモ】長いSQLと文字連結

今回バグの改修をしていて、モデルでめっちゃ長いSQL文（3行くらい）を呼び出していた。
（めちゃめちゃ古いコードなんだろうな・・・・）

## もともとのコード

'''
Sample.where('exists(select * from samples where .... and ....) or exists(select * from sample_options where...) or exists(select * from sample_prices where ...)')
'''
みたいな。長いしSQLを直接操作するので、物理削除と論理削除の違いが出ない状態に。

## 書いたコード
とりあえず、バグなので意図通り動作して欲しい
→論理削除と物理削除の違いが出るようにする

```
Sample.where('exists(select * from samples where .... and .... and deleted_at = nil) or exists(select * from sample_options where...) or exists(select * from sample_prices where ...)')
```

でも長すぎてみにくいので、

```
Sample.where(
 'exists(select * from samples where .... and .... and deleted_at = nil)' +
  ' or exists(select * from sample_options where...)' +
   ' or exists(select * from sample_prices where ...)'
)
```

というように文字連結を使った。

```
'aaa' + 'bbb'
=> "aaabbb"
```


## 調べてきたときに学んだもの
### chomp
Rubyの標準メソッドで、文末の改行コードを削除
### rstrip
Rubyの標準メソッドで、文末の空白を削除
### gsub
Rubyの標準メソッドで、任意の文字を指定し、置き換える
例えば

```
文中の空白を全て消したい
(....).gsub(' ', '')

文中の改行コードを全て消したい
(....).gsub('\n', '')
```


## まとめ
チームで開発しているからコードを見やすくするって大切。
ちょっとした工夫だけど、今後もこういうメソッドやリテラルを使っていこう。
GPUImageVideoCameraにセットされたsessionのサイズの取得(Swift版)


AVSessionのinputsからだとうまく取れない。下記のコードで取得可能。


```
//VideoCameraはGPUIMageVideoCameraのインスタンス

let output = videoCamera.captureSession.outputs[self.videoCamera.captureSession.outputs.endIndex - 1] as! AVCaptureVideoDataOutput
        let setting:NSDictionary = output.videoSettings
        let width  = (setting["Width"] as! NSNumber).longValue
        let height = (setting["Height"] as! NSNumber).longValue
```
 
参考
http://stackoverflow.com/questions/18563259/avcapturesession-image-dimensions-with-gpuimage
c++ builder > TButton > 矢印を表示する

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

TButton上に矢印を表示する方法で以下のような方法が紹介されていた。
~~http://www. borlandtalk. com/ button-with-arrow-shape-vt67617.html~~
(**追記 2017/12/25**: リンク先はおかしなサイトになっていたため、上記の記述を意図的に変更した。)

>Easy way: 
Place a TButton and set the font to Wingdings or Webdings. 
Select shape with %SystemRoot%System32charmap.exe 
Copy - paste one of the arrow-shapes into the caption. 
...
Achim Berg 

charmap.exeはC:\Windows\System32フォルダにあった。
Explicit Congestion Notification(ECN)



# Linux


tcp_ecn - INTEGER
	Control use of Explicit Congestion Notification (ECN) by TCP.
	ECN is used only when both ends of the TCP connection indicate
	support for it.  This feature is useful in avoiding losses due
	to congestion by allowing supporting routers to signal
	congestion before having to drop packets.
	Possible values are:
		0 Disable ECN.  Neither initiate nor accept ECN.
		1 Enable ECN when requested by incoming connections and
		  also request ECN on outgoing connection attempts.
		2 Enable ECN when requested by incoming connections
		  but do not request ECN on outgoing connections.
	Default: 2


```
$ echo 1 > /proc/sys/net/ipv4/tcp_ecn
```


# Mac OS X

```
$ sudo sysctl net.inet.tcp.ecn_negotiate_in
net.inet.tcp.ecn_negotiate_in: 0
$ sudo sysctl net.inet.tcp.ecn_negotiate_out
net.inet.tcp.ecn_initiate_out: 0
```
勉強会ノート（150626）

[MySQL・PostgreSQLユーザーグループ（MyNA・JPUG）合同DB勉強会 in 東京](https://dbstudychugoku.doorkeeper.jp/events/25804)
に~~ピザに釣られて~~参加してきた。（初勉強会）
@soudai1025 さんにまとめ書きなYO!とお尻ペンペンされたのでまとめてみる。

**以下当日のスライドリンク：**
[データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜](http://www.slideshare.net/nippondanji/7-nosql)
[Postgre sqlから見るnosql](http://www.slideshare.net/SoudaiSone/postgre-sqlnosql)
[JSONBはPostgreSQL9.5でいかに改善されたのか](http://www.slideshare.net/hadoopxnttdata/jsonb-postgresql-95-nttdata)
DynamoDBの話(仮)
[MySQLのNoSQL機能 - MySQL JSON & HTTP Plugin for MySQL ](http://www.slideshare.net/rkajiyama/20150626-no-sqljppptx)
[No sql with mysql cluster (MyNA・JPUG合同DB勉強会) ](http://www.slideshare.net/ShinyaSugiyama/no-sql-with-mysql-cluster)
[Handlerさんコンニチワ](http://www.slideshare.net/yoku0825/handler-49926023)

**講演内容：**
・MySQL、PostgreSQLなどRDBMS本体とプラグインなどの概要
・DB設計をするにあたっての考え方
・RDBMSとNoSQLの違い、NoSQLの使いどころ
RDBMSとは、トランザクションや正規化理論・制約などでデータの矛盾が生じるのを防ぎ、正確性を保証するシステムであり、一方NoSQLはおおざっぱにはRDBMS以外のものだがシンプルな構造でデータの正確性はない。
それではどうするかというと、アプリケーション側の実装でカバーするしかなく、それはとても大変なコストがかかる（やだ困る！）
なので最近流行っているからといってNoSQLを単体で使うのではなく、基本的にはRDBMSを使用し、必要な部分はNoSQLでカバーをする手法をとるとよい。（レンガで家を建てて隙間をパテで覆う、そんなイメージを思い浮かべた）
そのためにはデータをどのように持つか、最初に論理的な設計をしてから物理的な設計をするという順番を守るのはとても大切である。

・PostgreSQL9.5での新機能紹介（JSONデータの扱い方）
・PostgreSQLとNoSQLの連携（外部データラッパーの使用）
・MySQL5.7（RC)とHTTP Plugin for MySQL
RDBMSとNoSQLの組み合わせを主にJSONデータを用いてのデモ。
PostgreSQLは9.2からJSON(テキスト型）、9.4からJSONB（バイナリ型)を扱えるようになり、9.5からさらにJSON周りの関数が追加され、JSONB型データの操作がより簡単に行えるようになるとのこと。
PostgreSQLは外部データラッパー（FDW)を用いることで、外部のデータをあたかも内部に持っているかのように使えるようになる。対象はRDB・NoSQLを問わず、さらにはGitログの結果やグーグルの検索結果なども扱える。なんかすごい。こんな柔軟でいいの？
HTTP Plugin for MySQLとは、まだ実験室版（RC)ではあるもののURLから決められた形式で記述したSQLを実行して結果をJSON形式で受け取れるようになるプラグイン。


**参加してみて：**
今まで業務上では色んなプロジェクトで色んなDB使って、広く浅く、調べながらSQL書いたりする程度の知識でした。それぞれの特徴とか何が出来るかといったことはまったく知らなかったので、かなり盛りだくさん具だくさんな内容でした。知恵熱出る！ぼくミジンコでしたすみません。でもレベルを知れたのはいいこと（と前向きに考えてみる）。
そんなnoobなので、多分このまとめも理解が浅かったり取りこぼしとか勘違いあるかもです。。
サクッとGlobal IPをクリップボードへコピーするためのワンライナー

## ユースケース
EC2のSecurityGroupへ登録してもらうとき、現在使用しているNWのIPを伝える場合などに便利です。

```
curl http://checkip.amazonaws.com/ | pbcopy
```

## aliasに登録しちゃおう！
```
alias gipcopy='curl http://checkip.amazonaws.com/ | pbcopy'
```
tmuxがzshで起動しなくなったので対処

`tmux`しても一瞬だけ画面が現れて即`[exited]`と言われてしまった。

前回も似たようなことが発生したのだけど、その際は[tmuxを起動できなくなったこととその対処の備忘録 - Qiita](http://qiita.com/takc923/items/018733112963b69b408b)にある`reattach-to-user-namespace`を入れ忘れていただけだったので、`brew install reattach-to-user-namespace`して解消した。それとも違うっぽい。

`.tmux.conf`をコメントアウトしつつ確認した所

```.tmux.conf
set-option -g default-shell /usr/local/bin/zsh
```

が原因で落ちていた。
試しに`/usr/local/bin/zsh`を叩くと

```shell-session
❯❯❯ /usr/local/bin/zsh
[1]    12780 illegal hardware instruction  /usr/local/bin/zsh
```

と言われてしまった。適当にググるとここの設定を`/bin/zsh`にしているのを見かけたので、`/bin/zsh`してみると何も言われない。

という訳で

```.tmux.conf
set-option -g default-shell /bin/zsh
```

に変更した所、問題なく起動した。
`/usr/local/bin`から起動しているのは`brew`で入れたやつなんだけど、なんで怒られるんだろ。`illegal hardware instruction`って、多重起動とかそこら辺の問題？
いまいちshell周りは分かっていないので、スッキリしない。
`man`するにしてもどの辺りを見れば良いのか当たりがつかないので、それっぽい情報とかご存じの方が居れば、参照先等教えて頂きたいです。

追記：`brew uninstall zsh`して`brew install zsh`、`brew unlink zsh && brew link zsh`で入れ直したら直った。
OSアップデート直後の事だったので、これが影響してるかもしれない。元通り`/usr/local/bin`のzshを起動する設定に戻しました。
備忘録：レイテンシ（Latency）

レイテンシ（Latency）とは
-------------

[レイテンシとは｜latency - 意味/解説/説明/定義 ： IT用語辞典](http://e-words.jp/w/%E3%83%AC%E3%82%A4%E3%83%86%E3%83%B3%E3%82%B7.html) より
> 一方がデータや信号を発信してから相手に届き始めるまでの時間のことを「片道レイテンシ」と呼び、単にレイテンシといった場合はこれを意味することが多い。これに対し、伝送要求を発信してからその返信が届き始まるまでの時間（伝送要求のレイテンシ＋要求の処理時間＋返信のレイテンシの和）のことを「往復レイテンシ」と呼び、これを「ラウンドトリップタイム」（RTT：Round-Trip Time）ということもある。

レイテンシには片道と往復があり、単に“レイテンシ”と言ってる場合は片道を指す場合が多いらしい。

[レイテンシとは (latency)： - IT用語辞典バイナリ](http://www.sophia-it.com/content/%E3%83%AC%E3%82%A4%E3%83%86%E3%83%B3%E3%82%B7)より
> レイテンシとは、データの転送要求などのリクエストを発してから、リクエストの結果が返ってくるまでにかかる遅延時間のことである。

こっちの説明からだと“往復レイテンシ”を指して“レイテンシ”といってるように読み取れる。

で、単に“レイテンシ”と言った場合“片道”と“往復”のどちらを指してるのかというと、基本的には「こちらから相手に届く時間」なので「片道」と捉えておいてよいらしい。


指す物によって片道・往復は変わる
-------------

- HTTP なら往復
- UDP なら片道

という風に指す物によって片道なのか往復なのか変化するので、文脈推測大事！！


往復の場合の呼び方
-------------
- ターンアラウンド
- ラウンドトリップタイム（RTT：Round-Trip Time） 
[RTTとは｜ラウンドトリップタイム｜往復レイテンシ - 意味/解説/説明/定義 ： IT用語辞典](http://e-words.jp/w/RTT.html)


方言みたいなのもあるため、何が正しいとかは難しいそうな。


まとめ
-------------
(1)基本は片道でよい
(2)指す物によって片道・往復は変わる
(3)文脈大事(方言っぽいのある)
(4)わからんかったら片道・往復どっちか聞いてしまう
crate コンパイル時に crate のバージョン文字列を得る

Cargo はコンパイル時に環境変数 `CARGO_PKG_VERSION` をセットする。これを `env!()` マクロで取得すればよい。

```rust
fn print_help() {
    println!("myapp version {}", env!("CARGO_PKG_VERSION"));
    // => myapp version 1.2.3-beta.1
}
```

コンパイル時に Cargo がセットする環境変数の一覧：

```text
環境変数                    値の一例
--------------------------------------------
CARGO_MANIFEST_DIR         /path/to/my-crate
CARGO_PKG_VERSION          1.2.3-beta.1
CARGO_PKG_VERSION_MAJOR    1
CARGO_PKG_VERSION_MINOR    2
CARGO_PKG_VERSION_PATCH    3
CARGO_PKG_VERSION_PRE      beta.1

```

（参考： https://github.com/rust-lang/cargo/blob/0.3.0/src/cargo/ops/cargo_rustc/compilation.rs#L110-L116 ）
standardで手軽にコーディング規約を導入する


コーディングスタイルの一貫性はコードを可読性を保つのに重要だけど、導入しようとなるとけっこう大変。

- コーディングスタイルを選ぶ
  - 公開されてるコーディング規約を眺めたりする
  - 自分の好みにあわせて"最強のコーディング規約"をつくったりする
- 自動化のためにツールの設定を書く
  - ドキュメントを睨んで設定ファイルを修正したりする
- 既存のコードをできたコーディングスタイルになおす
  - めんどくさいから放置したりする

## standard
https://github.com/feross/standard

standardを使えばこういうめんどくさいことなしに、お手軽にコーディング規約を導入できる。
"標準的"なコーディングスタイルがはじめから設定されているので設定を考える必要が一切ない。

だいたい、インデントの深さとか空白の数の良し悪しについて議論するのは不毛である。もっと生産的なことに時間を使いたい。

stardardに組み込まれてるスタイルは、npmに近い、モダンなコーディングスタイルである。セミコロンフリーなのが特徴。

https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style

使いかたもシンプルで、`standard`コマンドを実行するだけ。

```
$ standard
Error: Use JavaScript Standard Style
  lib/torrent.js:950:11: Expected '===' and instead saw '=='.
```

こういう風に `package.json`に書いておくと、`npm test`で実行される。あとはTravisなどのCIで設定しておけばコーディングスタイルのチェックを自動化できる。

```json
{
  "name": "my-cool-package",
  "devDependencies": {
    "standard": "^3.0.0"
  },
  "scripts": {
    "test": "standard && node my-tests.js"
  }
}
```
WEBサーバーの仕組み



# サーバーとクライアント　

## クライアント

>クライアント・サーバシステムにおいて、サーバに対してサービスの依頼を行いその提供を受けるような、コンピュータまたはアプリケーションやプロセスのことをいう。サーバからサービスを受ける側を指す。
いつも使っているブラウザ(chromeとか)をクライアントと呼ぶ。


### ブラウザとは
> インターネット上のウェブ ページの情報を画面上に表示するための閲覧ソフト。また一般に、コンピュータのデータやプログラムを、画面上に文字や画像として表示するためのプログラムも言う。

## サーバー

> コンピュータの分野では、本来はソフトウェアの用語であり、クライアントサーバモデルにおいてクライアントからの要求に対して何らかのサービスを提供する役割を果たす側のプログラムを指す言葉である。HTTP サーバ、IMAP サーバ、X-Window サーバなど規模や形態などは様々ある。
また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、サーバと呼ぶ場合がある。



# サーバーとクライアントの通信
いつも使っているブラウザ(chromeとか)をクライアントと呼ぶ。
例えば、下のURLを考えてみる。

```
http://qiita.com/shige0820
```

httpとは、通信方法を表す部分。
クライアントとサーバーはhttpを利用して通信している。　
電車で通勤とか、歩いてとかと同じです。
その通信手段をプロトコル(規格)と呼ぶ。　

## httpの仕事
主に2つある。
Request : サーバーにデータをリクエストする。
Respose : サーバーがデータを返す。　

リクエストには、リクエスト行(メソッド、URI、HTTPバージョン)、ヘッダ、メッセージボディで構成。
レスポンスには、レスボンス行(HTTPバージョン、ステータスコード)、ヘッダ、メッセージボディで構成されている。 ステータスコードには、リクエストの処理結果を表す。200:成功　500:失敗など。


## http メソッド
GET/POSTの2つ。
GET:サーバーからデータを受け取る。
POST:サーバーにデータを送る。


## URLの読み方

```
http://qiita.com/shige0820
```

qiita.comは、サーバーの住所を表しています。
横浜市戸塚区~~~8丁目


/shige0820は、サーバーのどこのファイルを表示してほしいかを示している。
家のトイレを見せて欲しい。
家のキッチンを見せて欲しい。

## 実はクエリというものもある。
> クエリ文字列
クエリ文字列とは、WebブラウザなどがWebサーバに送信するデータをURLの末尾に特定の形式で表記したもの。
Webアプリケーションなどでクライアントからサーバにパラメータを渡すのに使われる表記法で、URLの末尾に「?」マークを付け、続けて「名前=値」の形式で記述する。値が複数あるときは「&」で区切り、例えば http://example.com/foo/var.php?name1=value1&name2=value2 のように記述する。
【Java】StringUtilsのisBlankとisEmptyの違い

## isEmptyはnullと空文字列をチェックする

```java
StringUtils.isEmpty(null)      => true
StringUtils.isEmpty("")        => true
StringUtils.isEmpty(" ")       => false !
StringUtils.isEmpty("bob")     => false
StringUtils.isEmpty("  bob  ") => false
```

## isBlankは空白文字もチェックされ`true`になる

```java
StringUtils.isBlank(null)      => true
StringUtils.isBlank("")        => true
StringUtils.isBlank(" ")       => true !
StringUtils.isBlank("bob")     => false
StringUtils.isBlank("  bob  ") => false
```

##ドキュメント
https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html
自分のサーバのGlobalIPが知りたい


毎回おなじこと調べちゃうシリーズ。

# ifconfig.io使いましょ。

     $ curl ifconfig.io
     192.0.2.100


## 他にもこういうのが取れるみたい
    Simple cURL API!
    $ curl ifconfig.io
    192.0.2.100
    $ curl ifconfig.io/ip
    192.0.2.100
    $ curl ifconfig.io/host
    www.example.com.
    $ curl ifconfig.io/country_code
    JP
    $ curl ifconfig.io/ua
    Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:38.0) Gecko/20100101 Firefox/38.0
    $ curl ifconfig.io/port
    37038
    $ curl ifconfig.io/lang
    en-US,en;q=0.5
    $ curl ifconfig.io/encoding
    gzip
    $ curl ifconfig.io/mime
    text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    $ curl ifconfig.io/forwarded
    192.0.2.100
    $ curl ifconfig.io/all
    $ curl ifconfig.io/all.xml
    $ curl ifconfig.io/all.json

便利。
Windowsでpip install --ugrade pipが失敗する

最近、pipを使っているとバージョンが低い場合「アップグレードしてくれ」というメッセージが出るようになった。
しかし、Windowsだと言われるまま`pip install --ugrade pip`を行うと、Permission Errorが発生する(しかも、インストール失敗によりpipが消える)。

その対処法は、以下。

```
python -m pip install --upgrade pip
```

ソースを見るとWindowsの場合こっちを使ってくれと表示するようにしてくれているようなので([参考](https://github.com/pypa/pip/pull/1679))、普通にコマンドプロンプトを使っている場合ははまらないかも。

詳細については、以下参考。
[windows in-place pip upgrades](https://github.com/pypa/pip/issues/1299)
iOS のバージョンを簡単にマイナーバージョン等を加味して判定する

iOS 8.0 で NSProcessInfo に追加されたメソッドを使用すると簡単にバージョンの判定が行える。

```objc
NSOperatingSystemVersion version = {8, 3, 0};
BOOL isOSVersion8_3Later = [[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:version];
if (isOSVersion8_3Later) {
    // iOS 8.3 以降
} else {
    // iOS 8.3 未満
}
```
Gitの使い方(for me)


#概要
Git、プログラミングをしてたら聞いたことはあるけど使ったことないやという人が結構多いと思います。使いこなせると便利なのでぜひ使ってみてください。なによりGit使いこなせるとかっこいいですよね！(そういう問題ではない)

[公式リファレンス](https://git-scm.com/book/ja/v1)が詳しくて便利です。これを一通り目を通せば問題ないはず。
以下はまあ、メモです。あとで分かりやすいようにまとめようと思います(暇があれば)

#git初期設定

```terminal
git config --global user.email "webmaster@xooms.jp"
git config --global user.name "webmaster"
git config --global color.ui auto
git config --global core.editor emacs
```

##alias

```terminal
git config --global alias.st status
git config --global alias.br branch
git config --global alias.ci commit
```

##push設定
```git push```をしたときに今いるブランチだけをリモートにプッシュする。リモートのブランチが現在のブランチと同じ時、プッシュする。

```
git config --global push.default=simple
```

#branch

##新規ブランチの作成

```
$ git br hoge#(ブランチ名)
```

##ブランチの移動
```
$ git co hoge
```

##新規作成して移動

```
$ git co -b hoge
```

##ブランチの削除

```
$ git br -d hoge
```

##リモートのブランチを確認

```
$ git br -a
```

##リモートのブランチを削除

```
#ローカルのhogeブランチが削除済みだとして
$ git push origin :hoge
```

#リモート

##リモートレポジトリを加える
```
$ git remote add remote-name url
```

##リネーム
```
$ git remote rename old-name new-name
```

##リモートレポジトリのアドレス削除
```
$ git remote rm name
```

##push

```
$ git push origin(remote-name) master:master
```
最後の```master:master```は```master```でもいい。
意味は```local-branch:remote-branch```である。
オプション```-u(=--set-upstream)```をつけると以降から```git push```だけで出来るが、ブランチを変える場合は注意。(push.default=simpleと設定しておくと安心)

#commitの変更

##直前のcommitを変更する。

```
git commit --amend
```
使用すると現在ステージしたものと直前のコミットを結合してくれる。コミットメッセージも変更できる。



##commitを纏める
`git rebase`を使用する。分かりにくいのでインタラクティブモード(-i)がおすすめ。

```
git rebase -i HEAD~2 #過去2つぶんのコミットを表示する。
```
そうするとエディタが立ち上がるから

```
pick 9a54fd4 commit message 1
pick 0d4a808 commit message 2
```
下のpickをsquashもしくはfixupに変更して保存。
squashの場合コミットメッセージを変更できる。(デフォルトでは２つのコミットメッセージが合わさる)
fixupの場合はコミットメッセージが消される。 

##commit messageを変更する
上記と同じようにrebaseして

```
pick 9a54fd4 commit message 1
pick 0d4a808 commit message 2
```
pickをeditもしくはrewordに変更して保存。
editの場合そのあと`git commit --amend`をする必要がある。

##commitを消去する

pickをdropに変更する。使う時は気をつけよう。

##注意点
amendもrebaseもコミットを新しく作るものなのでリモートにpushしたコミットに対して使用してはらない！諦めて修正のコミットをpushすべし。

>あぁ、このすばらしいリベース機能。しかし、残念ながら欠点もあります。その欠点はほんの一行でまとめることができます。
公開リポジトリにプッシュしたコミットをリベースしてはいけない
この指針に従っている限り、すべてはうまく進みます。もしこれを守らなければ、あなたは嫌われ者となり、友人や家族からも軽蔑されることになるでしょう。(git documentationより)
半角数字を全角数字にする

```ruby
10.to_s.split(//).map{|s| %w(０ １ ２ ３ ４ ５ ６ ７ ８ ９)[s.to_i]}.join #=> "１０"
```
なんかメソッドないのかな……


追記
diaphragmさんに以下のメソッドを教えて頂きました。

```ruby
'12345'.tr('0-9', '０-９')
```
こちらのが楽ですね
CakePHP で Call to a member function save() on null

CakePHPのControllerでDBにsave()しようとしたらエラーが出ました。
環境はCakePHP2.6です。

```lang:error
Fatal Error
Error: Call to a member function save() on null	
File: /home/test/Test/App/Controller/TestController.php	
Line: 6

Notice: If you want to customize this error message, create App/View/Errors/fatal_error.ctp
```

save()が無いって言ってます。
ソースはこんな感じで書いていました。

```php:App/Controller/TestController.php
<?php
class TestController extends AppController {
    public function test() {
        if ($this->request->is('post'))
        {
            $this->Test->save($this->request->data);
        }
    }
}
?>
```

```php:App/View/Test/test.ctp
<?php
  echo $this->Form->create('Test');
  echo $this->Form->input('Test', array('type' => 'text'));
  echo $this->Form->end('submit');
?>
```

```php:App/Model/Test.ctp
<?php
App::uses('AppModel', 'Model');

class Test extends AppModel {
  public $useTable = 'test';
}
?>
```

ControllerでloadModelする必要がありました。

```php:App/Controller/testController.php
<?php
class TestController extends AppController {
    public function test() {
        if ($this->request->is('post'))
        {
            $this->loadModel('Test');
            $this->Test->save($this->request->data);
        }
    }
}
?>
```

Formのcreate()でModelのクラスを指定すればControllerでも勝手に読み込んでくれてるのかと思ってましたが、そんなことは無いみたいですね。
Tomcat＋Jacocoでカバレッジ取得してレポートを作成するチュートリアル


* Tomcatで稼働しているWebアプリケーションのカバレッジを取得しレポートを作成するチュートリアルです。
* 大まかな流れは下記となります
 * TomcatをJacocoのAgent付きで起動
 * アプリケーション操作
 * Tomcat停止してカバレッジデータダンプ取得
 * Maven/Antでレポート作成
* Maven＋Jettyを使った、Jetty起動＞テスト＞Jetty終了＞カバレッジレポート作成の一連の自動化も可能ですが、ここでは触れません

###環境

* OS：Windows7
* Tomcat8
* jacoco-0.7.5.201505241946.zip 
 * http://www.eclemma.org/jacoco/ より取得
 * C:\apps\jacoco-0.7.5.201505241946 にインストールしたものとします
* ※以降Win環境での記載とします。Linuxの場合は各種パスを読み替えて下さい

### 前提

* 対象のアプリケーションは、MavenまたはAntでWarビルドできる環境にしておくこと
* TomcatへWarをデプロイして置くこと

### TomcatをAgent付きで起動

* apache-tomcat-8.0.21\bin\catalina.bat に下記追記

```bat:catalina.bat
set "JAVA_OPTS=-javaagent:C:\apps\jacoco-0.7.5.201505241946\lib\jacocoagent.jar=destfile=c:\temp\jacoco.exec,includes=jp/co/**,append=false"
```

* 下記定義しています
 * カバレッジデータの出力先はc:\temp\jacoco.exec
 * jp.co 以下のパッケージのみカバレッジ取得
 * jacoco.execはTomcat起動時に常に上書き
* その他のオプションは、http://www.eclemma.org/jacoco/trunk/doc/agent.html を参照

### レポート作成：Maven版

* jacoco-maven-plugin を利用するようにpom.xml のbuild>plugins へ下記記載追加
 * dataFileでカバレッジダンプファイルを指定
 * その他のパラメータは http://www.eclemma.org/jacoco/trunk/doc/report-mojo.html 参照

```xml:pom.xml
<plugin>
	<groupId>org.jacoco</groupId>
	<artifactId>jacoco-maven-plugin</artifactId>
	<version>0.7.5.201505241946</version>
	<configuration>
		<dataFile>c:/temp/jacoco.exec</dataFile>
	</configuration>
</plugin>
```

* 下記コマンドで {projectdir}/target/target/site/jacoco 以下にリポートが作成されます
 * ※jacoco:report自体はコンパイルまでしないのでコンパイル指定してます。

```
mvn compile jacoco:report
```

### レポート作成：Ant版

* Antの場合もmaven同様にjacoco.execを指定してレポートを作成します

* build.xmlのprojectタグへjacocoタスクのnamespace追加
 
```xml:build.xml
<project xmlns:jacoco="antlib:org.jacoco.ant" name="HogeHoge">
```

* build.xmlへjacocoタスク定義を追加

```xml:build.xml
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
	<classpath path="C:/apps/jacoco-0.7.5.201505241946/lib/jacocoant.jar" />
</taskdef>
```

* build.xmlへレポート作成targetを追加
 * propertyは適時調整して下さい

```xml:build.xml
<property name="src.dir" location="./src/main/java" />
<property name="result.dir" location="./target" />
<property name="result.classes.dir" location="${result.dir}/classes" />
<property name="result.report.dir" location="${result.dir}/site/jacoco" />
<property name="result.exec.file" location="c:/temp/jacoco.exec" />

<target name="jacoco-report">
	<jacoco:report>
		<executiondata>
			<file file="${result.exec.file}" />
		</executiondata>
		<structure name="JaCoCo Ant Example">
			<classfiles>
				<fileset dir="${result.classes.dir}" />
			</classfiles>
			<sourcefiles encoding="UTF-8">
				<fileset dir="${src.dir}" />
			</sourcefiles>
		</structure>
		<html destdir="${result.report.dir}" />
		<csv destfile="${result.report.dir}/report.csv" />
		<xml destfile="${result.report.dir}/report.xml" />
	</jacoco:report>
</target>

```

* 下記antコマンでレポートが作成されます

```
ant  compile jacoco-report
```


### 注意点

* JacocoのVerはAgent側とレポート作成側で同一にしましょう。Verが異なると解析に失敗します
* jacoco.execはメモリ上にバッファリングされているので、Tomcatプロセス終了時にFlushされます。画面操作してもjacoco.execが0バイトになってても慌てないように

### 参照

* Jacocoドキュメント http://www.eclemma.org/jacoco/trunk/doc/index.html
* Agentの説明 http://www.eclemma.org/jacoco/trunk/doc/agent.html
NGUIでon~系のイベントを取得する(SendMessage系)

自分用メモ
こちらのサイト様からコピペ

http://unity3dplugin.blogspot.jp/2012/11/ngui.html

```
void OnHover (bool isOver) – マウスポインタが重なったときに呼ばれます。タップは×。
void OnPress (bool isDown) – マウスによりクリック（押下時と離脱時の２回）が発生したときによばれます。タップも○。
void OnClick() — 上と同じですが、離脱時の１回だけ呼ばれるパターン。
void OnDoubleClick () — ダブルクリックされたとき。
void OnSelect (bool selected) –選択メニューで便利?OnClickと同じだけど、こっちは他のものが選択されるまでは２度目の選択時には呼ばれません。
void OnDrag (Vector2 delta) – OnPress(true) と　OnPress(false)の間に起きた移動を取得。タップ○。
void OnDrop (GameObject drag) – ドロップ時（OnPress(false)のタイミング）にドロップされた（下にある）オブジェクト側で呼ばれる。引数には、ドロップした（上にある）オブジェクトが渡される。
void OnTooltip (bool show) – Sent after the mouse hovers over a collider without moving for longer thantooltipDelay, and when the tooltip should be hidden. Not sent on touch-based devices.
void OnScroll (float delta) マウスのホイールが動いた時によばれる
void OnKey (KeyCode key) キーボードが押されたときによばれる
```
Mobile app strategy

# Which solution to build a modern mobile application ?

## The contenders

### 1. Hybrid solutions

Concept: the same development stack as web applications: HTML, CSS, JavaScript.
The application is rendered in the mobile using a "web view" (a web browser embedded in the mobile application)
Usually, the UI is not as smooth as a real native application but animations in the browser have improved a lot recently and it is hard to see the difference.
Plugins (Cordova) are used to communicate with device feature (like the camera, the battery level...)
A building process creates the application for either Android or iOS. Then the application can be uploaded to iTunes or GooglePlay.

Strong points: hybrid applications are easy to test since they can run in the browser (except device specific features, of course).
You can use the same code base to build a web site and a mobile application.

A comparison of mobile frameworks: [here](http://matthiasschuetz.com/mobile-app-framework-matrix/)

#### A. [ionic](http://ionicframework.com/)

* Very popular (+18K Github stars)
* Built on top of AngularJS and some Angular tools like angular-ui router

An other solution, based on ionic: [Supersonic] (http://www.appgyver.com/supersonic). No public repository :(

#### B. [reapp.io](http://reapp.io/)

* Built on top of ReactJS and Webpack (the stack of the moment!)
* Not much activity over the last 3 months (only 2.5k stars)


### 2. [React Native] (https://facebook.github.io/react-native/)

Concept: build an application using only React components
No HTML: only React components that map iOS components.
For example `<Text><Text>` to create an inline element (the equivalent of a `<span>` tag in HTML), or `<View></View>` to create a block element (`<div>`).
No CSS: JavaScript objects are used to style objects.

* Easy to setup on Mac, you can have an application running in 5 minutes.
* Only available for iOS (at least now)
* 16K stars since it was released in March... this is insane!


### 3. [NativeScript](https://www.nativescript.org/)

Concept: build an application from JavaScript,  XML for views and a subset CSS. Generate **real native** components, it is does run a simple web view like the hybrid solution.

* Not locked to any framework, you can use whatever you want.
* Comes with its own double-way binding system to connect views (XML) and data.
* 3.9K stars, it is slowly becoming popular.
* TODO: check by myself!

## To sum up

Solution | 100% Native  | React Native | NativeScript | Hybrid (WebView)
--- | ------------- | ------------- | ---- | ----
Languages | Swift  | React, JS | XML, JS, CSS | HTML5, CSS, JS
Platform | only iOS | only iOS | iOS and Android | iOS and Android 

## The future: Web workers ?

Use web workers to create rich web applications ? (with offline storage, background processes...)

http://www.html5rocks.com/en/tutorials/service-worker/introduction/

Note: it seems to be not supported in Firefox 38 ?
HCPとcloudBitでIoT - 1.はじめに

こんにちは。[舟木将彦](http://qiita.com/mfunaki)と申します。

これから何回かに渡って、HCPとcloudBitでIoTと題して、ノンハンダ付け+ノンプログラミングでIoTプロトタイピングを実現するためのプラットフォームをご紹介したいと思います。

HCPとは、[SAP HANA Cloud Platform](http://hcp.sap.com/index.html)の略です。リンクをクリックしていただくと、The In-Memory Platform-as-a-Serviceの文字が目に飛び込んできます。HCPとは、単にインメモリデータベースHANAがクラウド上で使えるというのではなく、インメモリプラットフォーム(そこにはDBもあれば、アプリケーションサーバ、その他統計・分析エンジンや自然言語解析、グラフエンジンや位置情報処理の仕組みなど)がこれ１つでできてしまうプラットフォームなのです。ここでいう「できてしまう」は「作ることができてしまう」と「公開することができてしまう」の双方を含みます。

IoTとは、単にInternet of Thingsの略ではなく、いわんやセンサーがインターネットにつながりました、という話でもなく、Inputされたデータをクラウド側で処理することで、ヒトやモノに対してアクションを促すようなOutputをTriggerすることなのである、と私は熱く語っているのですが([プロトタイプを作り使ってみて体感することがデザイン思考では重要だ](http://www.sapjp.com/blog/archives/11854))、ここではそのためのクイックなプロトタイピング手法をソフトウェア実装側からご紹介させていただきます。

なお、アプリケーション側の実装はJavaサーブレットをHCP上で実行、データベース側はHCP上のインメモリHANA DB、入出力に関わる部分は、ハンダごてなしで電子回路が構成できるLEGOライクなツール、[littleBits](http://jp.littlebits.com)を使って説明していきます。Tomcatならどーなのとか、MySQLだとどう？とお考えの方は、適宜本文を読み替えていただければと思います。

0. [はじめに](http://qiita.com/mfunaki/items/cc3f6210bd0f72d34e54)
1. [cloudBitの情報取得](http://qiita.com/mfunaki/items/a11c32456cc3c1066fd9)
2. [cloudBitからの情報受け取り口](http://qiita.com/mfunaki/items/6b5b5f70dd8c87f43a88)
3. [受け取ったデータをDBに格納](http://qiita.com/mfunaki/items/f9ede4f2fdcf25b5ed25)
4. (続く)

なお、私自身は[SAP](http://www.sapjp.com/blog/)の人ではあるものの、[HANA](http://www.sap.com/japan/pc/tech/in-memory-computing-hana.html)の人ではないので、間違った事を言っていたり...ということはあるかと思います。会社としての公式サンプルではなく、一個人のプログラミングノートというスタンスで見ていただけるとありがたいです。生暖かく見守っていただけると、他にもHANAを使った自然言語処理ネタや位置情報ネタ等、心理的に書き散らしやすいです。