OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScriptスターターキット (OS X)

http://www.typescriptlang.org/Playground で遊びたおして TypeScript のことをとっても気に入ったけど、じっさいに自分のプロジェクトで使いはじめるために何をどうすればいいのかわからずにアワアワしてた昨日の自分と、忘れっぽい明日の自分へ贈るメモ。

ともかくツールの揃え方だけ。
それぞれの詳しい使い方はググったり[わかめさんの本](http://www.amazon.co.jp/dp/484433588X)買ったりしてください。

## Node.js

いろんな導入方法があるので省略。各自お好きな方法で。
ぼくはnodebrewでインストール。

## Grunt.js

Grunt.js は Node.js を実行基盤とする JavaScript のビルドツール。たぶんmakeのようなもの。

http://gruntjs.com/

プロジェクト毎に異なるバージョンのGrunt.jsを使い分けられるよう、
環境にインストールするクライアントと、プロジェクトローカルにインストールする本体とにパッケージが分かれている。

Gruntクライアントツールのインストール（グローバル）

```
$ npm install -g grunt-cli
```

`.bash_profile` に以下を追記（bashの場合）

```
PATH=$(npm prefix -g grunt-cli)/package/bin:$PATH
```

Grunt本体のインストール（プロジェクトローカル）

```
$ npm install grunt --save-dev
```

## TypeScript

インストール（プロジェクトローカル）

```
$ npm install typescript --save-dev
```

プロジェクトの外でTypeScriptコンパイラをふだん使いしたいならグローバルインストールも実施しておけばいいかも。

```
$ npm install -g typescript
```

## TSD

オンラインで公開されている各種JavaScriptライブラリの型定義(.d.ts)を検索・入手するツール。

インストール（プロジェクトローカル）

```
$ npm install tsd --save-dev
```

プロジェクトが必要とする型定義を記述する `tsd.json` の雛形をあらかじめ生成しておく

```
$ ./node_modules/.bin/tsd init
```

## grunt-typescript

TypeScriptのコンパイルを実行するGruntタスク

インストール（プロジェクトローカル）

```
$ npm install grunt-typescript --save-dev
```

## grunt-tsd

tsd による型定義(.d.ts)の更新を行うGruntタスク

インストール（プロジェクトローカル）

```
npm install grunt-tsd --save-dev
```

### 型定義(.d.ts)の入手

`tsd` コマンドを使って node.jsの標準ライブラリとwsモジュールの型情報を入手してみる。

```
$ ./node_modules/.bin/tsd query node

- node/node.d.ts : <head> : XXXX-XX-XX XX:XX
```

```
$ ./node_modules/.bin/tsd query ws

- ws/ws.d.ts : <head> : XXXX-XX-XX XX:XX
```

それぞれ、`node/node` `ws/ws` という名前であることがわかったので、実際にこれらをダウンロード、インストールする。（`--save` オプションによってtsd.jsonへの追記も行われる）

```
$ tsd query node/node --save --resolve --action install 
$ tsd query ws/ws --save --resolve --action install 
```

### 型定義の利用

取得したすべての型定義への参照は `typings/tsd.d.ts` に集約されるので、自分のコードには次の行を挿入するだけ。かんたん！

```
/// <reference path="../typings/tsd.d.ts" />
```

## Gruntfile

Grunt でコンパイルや型定義の更新を自動化しよう。
Gruntfile.js （Makefileのようなもの）を次の内容で作成。（コンパイルオプションやパスは適宜読み替えよう）

```js:Gruntfile.js
module.exports = function(grunt) {
  grunt.initConfig({
    typescript: {
      main: {
        src: ['ts/**/*.ts'],
        dest: 'js',
        options: {
          basePath: 'ts',
          noImplicitAny: false, //true,
          module:        'commonjs',
          target:        'es5',
          comments:      true
        }
      }
    },
    tsd : {
      refresh: {
        options: {
          command: 'reinstall',
          latest: true,
          config: './tsd.json',
          opts: {}
        }
      }
    }
  });

  grunt.loadNpmTasks('grunt-typescript');
  grunt.loadNpmTasks('grunt-tsd');

  grunt.registerTask(
    "default",
    "TypeScriptをコンパイル",
    ["typescript:main"]
  );
};
```

`grunt` で TypeScriptのコンパイル、`grunt tsd` で型定義の更新が実行されるはず。

## 困ったときは？

ダウンロードした型定義の間違いに気づいたら自分で直して https://github.com/borisyankov/DefinitelyTyped にプルリクすればあなたもわたしもみんなも幸せ。

参考:
http://qiita.com/vvakame/items/1980d4b6cc222e03fdcb
大事なログを取り逃さない 〜タイムシフトロガー〜

重大なエラーが発生した時には、ログを詳細に出力しておきたいが、でも本番環境でログレベルを常時DEBUGしておくわけにはいかない…
そんなときでもタイムシフトロガーがあれば大丈夫！ エラーが発生したひとのログをある一定時間遡って詳細なレベルで取得できます。

というものを作ってみました。

https://github.com/kawasima/timeshift-logger/

仕組みですが、一定期間だけログを保管しておき、しきい値を超えたら溜め込んでいる詳細なログを吐き出す、というものです。

log4jのSocketAppenderを1つ追加してもらって、タイムシフトログサーバに向けます。そしてこれはDEBUGレベルにしておきます。

```xml
<appender name="timeshift" class="org.apache.log4j.net.SocketAppender">
    <param name="RemoteHost" value="logserver"/>
    <param name="Port" value="8888"/>
    <param name="ReconnectionDelay" value="1000"/>
    <param name="Threshold" value="DEBUG"/>
</appender>
```

利用アプリ側ではユーザの識別IDをNDCに設定しておいてる想定ですが、やることはこれだけです。既存のアプリに極力手を入れずに、ログのタイムシフト再生を手にすることができます。


そして、タイムシフトログサーバを起動します。

```shell-session
% lein run
```

タイムシフトログサーバは、Apache Flumeで動いていて、SocketAppenderからのイベントを受けるSourceは、RedisにログイベントをユーザIDをキーに溜め込んでいきます。そしてしきい値以上のレベルのログイベントが到着すると、そのユーザIDに関するログをまとめて、Flumeのチャネルに流し込みます。

Sink側は自由に設定すればよいのですが、

```clj
(defsink print-sink
  :process (fn [event]
             (let [odis (ObjectDecoderInputStream. (ByteArrayInputStream. (.getBody event)))
                   logs (.readObject odis)]
               (println "==================================")
               (doseq [log logs]
                 (.append console-appender log))
               (println "=================================="))))
```

core.cljに定義してあるようにClojure側で以下のようなSinkを作っておくと、

```
==================================
USER01 2014/07/16 19:49:07.269 ERROR Main - jojo
java.lang.Exception
        at net.unit8.timeshift.examples.Main$1.run(Main.java:35)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:724)
==================================
==================================
USER03 2014/07/16 19:49:07.265 DEBUG Main - jojo
java.lang.Exception
        at net.unit8.timeshift.examples.Main$1.run(Main.java:35)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:724)
pool-1-thread-3 2014/07/16 19:49:07.267 ERROR Main - jojo
java.lang.Exception
        at net.unit8.timeshift.examples.Main$1.run(Main.java:35)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:724)
==================================
```

このような感じでユーザID単位でそれまでのログを全部出力出来ます。

ちなみにFlumeの設定はJavaのpropertiesで書かなきゃいけなかったり、カスタムSourceやカスタムSinkを作ろうとするとJavaで書いてプロパティに設定して…など、何かと面倒なのですが、[clj-flume-node](https://github.com/kawasima/clj-flume-node)を使うと非常に簡単にFlumeを設定・起動でき、カスタムSinkも上記のように楽々です。
ansilbeでnewrelic(サーバーリソース監視)を導入する


サーバー自体のパフォーマンス監視の方です。もうNewRelicだけで生きていけると思いました。

```yaml:your-ansible/roles/newrelic/tasks/main.yml
# NewRelicのリソース監視ツールを追加
---
  - name: get repo
    sudo: yes
    yum: pkg={{item}} state=present
    with_items:
      - http://download.newrelic.com/pub/newrelic/el5/x86_64/newrelic-repo-5-3.noarch.rpm

  - name: yum install
    sudo: yes
    yum: state=installed pkg=newrelic-sysmond

  - name: set api key
    sudo: yes
    shell: |
      nrsysmond-config --set license_key={{newrelic_api_key}}

  - name: start
    sudo: yes
    service: name=newrelic-sysmond state=started enabled=yes
```
Railsのsession storeをAmazon ElastiCache(memcached) へ変更した

```diff:Gemfile
+gem 'dalli'
```

```diff:config/environments/production.rb
   # Use a different cache store in production.
-  # config.cache_store = :mem_cache_store
+  config.cache_store = :dalli_store, 'your_app.hoge.cfg.fuga.cache.amazonaws.com'
```

```diff:config/initializers/session_store.rb
# Be sure to restart your server when you modify this file.

-SeniorMode::Application.config.session_store :active_record_store, key: '_your_app_session'
+SeniorMode::Application.config.session_store ActionDispatch::Session::CacheStore
```

ん、なんか設定足りてるかな…？
git で過去との差分のサマリーを表示する


「現在のソースコードは、過去のバージョンからどのくらい修正したか？」を知りたい時に使います。

## コマンド

```
git diff --stat <コミットID>

例）git diff --stat c7378a8
```

## 結果

```
 amay077lib                                         |   0
 .../android/fujiphoto/logic/PhotoItemLogic.java    |   1 -
 .../android/fujiphoto/viewmodel/YmapBinder.java    |  24 +-
 graphics/app_icon.svg                              | 436 +++++++++++++++++++++
 graphics/camera.svg                                |  97 +++++
 graphics/circle_small.svg                          |  87 ++++
 graphics/fuji.svg                                  | 118 ++++++
 graphics/loading.svg                               | 142 +++++++
 graphics/pegman.svg                                | 176 +++++++++
 graphics/photo_loading.svg                         | 142 +++++++
 graphics/photo_loading_large.svg                   |  92 +++++

 11 files changed, 1301 insertions(+), 14 deletions(-)
```
Unity 5.1サラウンド （Mac）



Unityでサラウンド再生したいなー。でもできるかな～って要件があったので調べました。

## オーディオインターフェイスを用意

そもそも5.1ch再生するには、6ch以上のアウトのあるオーディオインターフェイスが必要です。
今回はちょっと古いですが、FA-66で検証。
Firewire to Thunderbolt変換で、MacbookPro OS10.9.4へ
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/14330/5aee63b2-02d7-8e57-1b2d-ae74f32f4b41.jpeg "5.jpg")


## 音を用意

テスト用に6ch入りのWAVを用意。
こちらは、3Dサウンドのチェックを外してインポート。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/14330/dddeca14-8f93-3793-0165-0514b700b397.png "7.png")


モノラル音声3Dサウンドも用意しました。


## Unityの環境設定を変える

Edit/Project Settings/Audio
Default Speaker ModeをStereoからSurround 5.1へ変更

![3.png](https://qiita-image-store.s3.amazonaws.com/0/14330/3d3eb611-68c8-f65f-4c2c-64d7ca0e94a9.png "3.png")

![4.png](https://qiita-image-store.s3.amazonaws.com/0/14330/ce4a2e55-5bca-42a1-3ed0-e5648fc0ef85.png "4.png")

API的にはこいつです。
http://docs.unity3d.com/ScriptReference/AudioSpeakerMode.html

## マックの環境設定を変える

ここまでで動くとおもいきや、デフォルトだと、3ch,4ch,5ch,6chが、1,2chにミキシングされちゃいます。

1. **Audio Midi 設定**アプリを開いて、
2. 使っているインターフェースを選ぶ。
3. Configure Speakers 右下のボタン
4. Multi Surroundタブの設定を5.1 Surroundへ。
5. Applyボタンを押す。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/14330/85e98fec-0e47-fd8c-3d64-2dff36ba2c11.png "1.png")

![2.png](https://qiita-image-store.s3.amazonaws.com/0/14330/51fddccc-acf9-fdcc-01cc-8a9b5abbfc8c.png "2.png")


## テストアプリ

![6.png](https://qiita-image-store.s3.amazonaws.com/0/14330/ebd67d12-9824-8204-1bde-d8aee8c5c786.png "6.png")

サラウンドファイルはそのまま再生。
3Dサウンドは、Cubeに割り当てて、スライダーで空間をうごかせる。
こんなかんじで作成。
nginx＋ELBでhttps/http毎に行う処理を変えたい

ELBでSSLの設定をしている場合には、ぶら下がってるサーバーへは80番で常に来ます。なのでこれだとSSLでアクセスされているかどうかわかりません。

ですが、httpsかどうかは`$http_x_forwarded_proto`という変数に入ってるので、それで判断しましょうという話です。

例では、TOPにhttpsで来た時だけhttpにrewriteし、それ以外のページにhttpで来た時にはhttpsにrewriteするという処理を書いてます。

```diff:/etc/nginx/conf.d/sample.conf
     location = / {
+        if ($http_x_forwarded_proto = "https") {
+            rewrite ^(.*) http://$server_name$1
+            break;
+        }
         ...
     }

     location / {
+        if ($http_x_forwarded_proto != "https") {
+            rewrite ^(.*) https://$server_name$1
+            break;
+        }
```
repository内のrobot.txtをnginxで公開

productionでだけrobot.txtが表示されない問題というのがあったのですが、robot.txtをappで返すのがどっちにしろ気持ち悪かったので、nginxで返却するようにしました。


```diff:
+    location ~ ^/robots.txt$ {
+        log_not_found off;
+        alias /home/your_name/project_name/current/public/robots.txt;
+    }
```
capistrano実行時にhipchatに通知を送信する

自作しなくていいんです。`gem 'hipcaht'`してるなら同梱されます。あるものを使いましょう。

```diff:Gemfile
+ gem 'hipcaht'
```

```diff:config/deploy.rb
+require 'hipchat/capistrano'

+set :hipchat_token,     "YOUR_HIPCHAT_TOKEN"
+set :hipchat_room_name, "YOUR_ROOM"
+set :hipchat_announce,  true # or false
```

## 参考

[README.md](https://github.com/hipchat/hipchat-rb)
2014年7月 Oracle Java SE のクリティカルパッチアップデートのサーバー利用での影響

Oracle Critical Patch Update Advisory - July 2014
http://www.oracle.com/technetwork/topics/security/cpujul2014-1972956.html
で、Java SE もUpdateがでている。
サーバーのみ利用の際にどんな影響があるのかを簡単に調べてみた

Oracle Java SE Risk Matrix
http://www.oracle.com/technetwork/topics/security/cpujul2014-1972956.html#AppendixJAVA
に脆弱性の表がある。
サーバーでも影響があるのは、Notesが2,3,4の物だけ

すると、

* CVE-2014-4264
* CVE-2014-4244
* CVE-2014-4263

の3つ。
全部Remote Exploit without Auth.?がYESなのは嫌だけど、CVSS Base Scoreは5.0,4.0,4.0 と凄く高いのはない
CVE番号から詳細調べようと思ったけど、、、

* http://cve.mitre.org/cve/ には情報無い（ページだけあって情報無し）
* NVDはページ無し

ってことでここまで。
まぁ結局Updateしろってことなんだけど。
でもUpdateがでないJava5,6でもCVE-2014-4244,CVE-2014-4263は影響あるってあるから内容しりたいな、と

なおクライアントだとCVE-2014-4227がBase Score 10なので速やかにUpdateしないと死にそうだ
Shift_JISなdocument.writeを非同期で実行する

致し方なくdocument.writeを使用しているjsファイル（文字コードはSJIS）を使う必要があったのだけど、
どうにか非同期実行できないかと思って調べてたら目から鱗なやり方が。

[document.write()の実行タイミングをずらす方法](http://p2b.jp/index.php?UID=1153728573)

ただし、上記の方法だと文字化けしてうまくいかなかったので、
なんか方法はないかなーと思ったら、

[ajaxでutf-8じゃないと文字化けする対策 - purazumakoiの[はてなブログ]](http://purazumakoi.hatenablog.com/entry/20121205/1354689246)

どうやらajaxなら文字コードの強制指定ができそうなので、
これらを組み合わせてみたのが以下の関数。

```js
var ajaxDocWrite = function(opt) {

	// document.writeの中身を格納する配列
	var arr = [];

	// document.writeを退避
	var orgDocWrite = document.write;

	$.ajax({
		url : opt.url,
		dataType: 'script',
		beforeSend: function(xhr){

			// 文字化け対策
			if (opt.charset) {
				xhr.overrideMimeType('text/javascript;charset=' + opt.charset);
			}

			// document.writeを配列に格納するだけの関数にする
			document.write = function(str) {
				arr.push(str);
			}
		}
	}).done(function(data){

		// callbackを実行
		opt.done(arr.join(''));

		// document.writeを元に戻す
		document.write = orgDocWrite;

	});

}

```

実行部分はこんな感じ。

```js
ajaxDocWrite({
	url: 'document_write.js',
	charset: 'Shift_JIS',
	done: function(data) {
		$('#hoge').html(data);
	}
});
```

今どきこんなことをしなきゃいけない状況もあまりないと思われるけどね…
cronをシンボリックリンクにしている場合にcapistranoで権限変更をしたい


## 前提

- capでデプロイしている
- 本番サーバーでsudoが使えるようになっている
- cronの設定ファイルをプロダクトのgitレポジトリ内に含めている

## 問題

- cronをシンボリックリンクで/etc/cron.d/以下に設置しても権限の問題で無視される
    - 以下の設定を追加
        - ownerは`root:root`
        - permissioは644
- gitで予め`chown root:root`しておけない(よね？)

## 解決方法

- capでデプロイする度に権限を変更する

## 実装

sudoを使うので以下を設定してなかったら追加

```diff:config/deploy.rb
+set :pty, true
```

taskを追加したい場合は、Capfileの中身を見てそこに設置する

```ruby:lib/capistrano/tasks/symlink_cron.rake
namespace :symlink_cron do
  desc "change owner to root"
  task :change_permission do
    on roles(:app) do
      execute :sudo, "chmod 644 #{release_path}/misc/cron/sample"
      execute :sudo, "chown root:root #{release_path}/misc/cron/sample"
    end
  end
  after 'deploy:published', 'symlink_cron:change_permission'
end
```

ちなみに実際に設定するcronファイルの例を以下に示す

```cron:misc/cron/sample
APP_DIR=/home/your_username/your_project_name/current
LOG_DIR=/var/log/your_project_name/cron

# 毎週火曜10:00に実行
00 10 * * 2 root su your_username -l -c "cd ${APP_DIR} && bundle exec rake sample:run RAILS_ENV=production" >> ${LOG_DIR}/sample.log 2>&1
```

※miscってのは自分のチームの決めでつくったディレクトリ

あとは、capでもChefでもansibleでもいいですが、以下のシンボリックリンクを貼るようにしておけば、cronが実行される状態になります。

```
ln -s /home/your_username/your_project_name/current/misc/cron/sample /etc/cron.d/sample
```

## 参考

- taskファイルを追加するときに役立つ
    - [Capistrano3のデプロイフレームワークの使い方](http://qiita.com/yuku_t/items/01c0ec4389db143e27f5)

- 別の方法でのcronの追加(crontabコマンドを使いたくないという理由で今回は不採用)。
    - [cron関連ファイルをgitで管理したい](http://qiita.com/kidachi_/items/ae968be3ea03976baa59)
Xcodeでビルド設定を作ったらCocoaPodsのリンクに失敗する件

ステージング環境用にビルドしたくて、`Debug`をコピーして`Staging`というビルド設定を作成したところ、`library not found for -lPods`というエラーが出るようになった。リンク時に失敗しているみたい。

CocoaPodsの設定を調べてみると、Podfileに以下のような設定を追加しなくてはいけないらしい。

```rb:Podfile
xcodeproj "MyProject", { "Staging" => :debug }
```

ビルド設定を作るとき、必ず`Debug`か`Release`のどちらをコピーするか選択するため、`Debug`だったら`:debug`、`Release`だったら`:release`にしてあげればいいようだ。

---

### 参考

- [http://guides.cocoapods.org/syntax/podfile.html#xcodeproj](http://guides.cocoapods.org/syntax/podfile.html#xcodeproj)
git rebaseと仲良くなろう~part1

# rebaseしてください〜
PullRequestを送りました報告をしたら
このままmergeできないので、rebaseしてもういっかいPUSHしてくださいと言われました。

rebaseしたことなくて、ｶﾞｸｶﾞｸ((（n;‘Д‘))ηﾅﾝﾀﾞｶｺﾜｲﾜｧ


# 練習用のレポジトリーでやってみよう

練習用のレポジトリーなら、どんなことが起きても怖くない！
[初心者でも分かる！git rebaseの使い方を解説します](http://liginc.co.jp/web/tool/79390)
を参考に、まずは`merge`と`rebase`の履歴の残り方の違いを理解することとする


# mergeとrebaseの違いを確認しよう

## mergeの確認
### 手順
0. masterとdevelopブランチを、参考サイトのHEADとTOPICに見立てて進める
1. masterで A、B、Cコミットを作る
2. developブランチを作る
3. developブランチでDコミットを作る
4. masterでEコミットを作る
5. developブランチにmasterをmergeし、コミット履歴を確認する


### 詳細
1.masterでA、B、Cコミットを作った

```
% git log --oneline
8ed1455 commit C
73c200d commit B
9110548 commit A
```
2.developブランチ作った

```
% git checkout -b develop
```

3.developでDコミットを作った

```
% git log --oneline
a095b4a commit D   # 追加したコミット
8ed1455 commit C
73c200d commit B
9110548 commit A
```

4.masterでEコミットを作る

```
% git log --oneline
71c87eb commit E
8ed1455 commit C
73c200d commit B
9110548 commit A
```

5.mergeする

```
% git checkout develop
% git merge master
```

6.履歴を確認する

```
% git log --oneline
be3bfe5 Merge branch 'master' into develop
71c87eb commit E
a095b4a commit D
8ed1455 commit C
73c200d commit B
9110548 commit A
```


## rebaseの確認
### 手順
0. masterとdevelopブランチを、参考サイトのHEADとTOPICに見立てて進める
1. masterで A、B、Cコミットを作る
2. developでDコミットを作る
3. masterでEコミットを作る
4. developブランチにmasterをrebaseし、コミット履歴を確認する

### 詳細
0〜3までの手順は、mergeのと同じなので省略。

rebase前のcommit logは下記。
master

```
71c87eb commit E
8ed1455 commit C
73c200d commit B
9110548 commit A
```

develop

```
0378896 commit D
8ed1455 commit C
73c200d commit B
9110548 commit A
```

rebaseする

```
% git checkout develop && git rebase master
```

commit logを確認する

```
68be895 commit D
71c87eb commit E
8ed1455 commit C
73c200d commit B
9110548 commit A
```

## mergeとrebase のcommit logの違い
ぱっとみ、違いは
mergeは、時間軸で履歴が並んでいて、さらに
mergeのコミットログが存在する。


rebaseは、developのcommit logはそのままで
masterとの差分 `commit E`だけが後から足されているように見える。
が、`commit D` のコミットIDが元々developのものと違うのだ。
（rebase前のコミットID：0378896 / rebase 後のコミットID：68be895）

なるほど〜
[初心者でも分かる！git rebaseの使い方を解説します](http://liginc.co.jp/web/tool/79390)で図の通り

A - B - C - E - D ではなく、
A - B - C - E - D` の意味はこれだった。

merge のコミットIDを確かめてみると
`commit D`のコミットIDは、merge前とmerge後と同一であった。（コミットID：a095b4a）

A - B - C - D - E - F
F: merge コミットログ
の意味はこれだった。
Active Adminのmenuをまとめたい


## 概要
- Active Adminで管理画面で作っていると、modelの数にしたがってmenuの数が増えていく
- そうなると、使いづらくなってしまう
- そこで、drop down menu にして意味のあるかたまりでまとめたい
 
## やったこと
```rb:admin/users.rb
ActiveAdmin.register User do

  menu :parent => "Users"
end
```

```rb:admin/user_groups.rb
ActiveAdmin.register UserGroup do

  menu :parent => "Users"
end
```

簡単だった。

## 参考
http://www.activeadmin.info/docs/2-resource-customization.html
Chromeのtransitionのバグ

#概要
ChromeでCSS transitionを使用していたらページのロード時にtransitionのアニメーションが起こってしまうバグに遭遇した.
Chromeのバージョンは 35.0.1916.153 mだった.
詳しい原因はわからないが以下の3つの条件を満たせば起こるようだ.

* 同じドメインにおいたjqueryを読み込んでいる(jquery-1.11.1.min.jsのみ? 他のバージョンは試していないからわからない,googleがホスティングしている物を使うと起こらない.)
* jsファイルをjqueryのほかに2つ以上読み込んでいる(1つの場合でも低確率で起こる?)
* scriptタグより後にlinkタグを用いてcssを設定している

#解決策
上記の3つの条件を満たさない限り発生することはないので,
linkタグをどのスクリプトタグよりも先に書くことでこの問題は簡単に解決できる.

#再現コード
以下は実際に問題が起こるコードである.
jqueryはダウンロードしてtest.htmlと同じディレクトリにおいておく.
更新を何回かするとアニメーションしてしまうのがわかる.
FireFoxなどでは起こらない為,Chromeのバグであると考えられる.

```html:test.html
<!doctype html>
<html>
	<head>
		<meta charset="utf-8">
		<title>transition bug</title>
		<script src="jquery-1.11.1.min.js"></script>
		<script src="test.js"></script>
		<script src="test2.js"></script>
		<link rel="stylesheet" href="test.css">
	</head>
	<body>
		<h2>test</h2>
	</body>
</html>

```

```css:test.css
h2{
	text-align: center;
	background: black;
	color: white;
	-webkit-transition-property: all;
	transition-property: all;
	-webkit-transition-duration: 1s;
	transition-duration: 1s;
}
```

```js:test.js
/* 空, このファイルはなくても良い, ただしhtmlのscriptタグは必要*/
```

```js:test2.js
/* 空, このファイルはなくても良い, ただしhtmlのscriptタグは必要*/
```
Ruby・Nodeを使うなら、rbenv・ndenvが便利


Ruby（Node）を使うなら、バージョン管理しやすいようrbenv（ndenv）を使うのが便利。
（rbenvもndenvも使い方はほぼ一緒）


# Nodeバージョン管理（ndenv + node-build）
## 1. ndenvインストール
```linux
git clone https://github.com/riywo/ndenv ~/.ndenv
echo 'export PATH="$HOME/.ndenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(ndenv init -)"' >> ~/.bash_profile
exec $SHELL -l
ndenv -v
```

最後のコマンドでバージョン出れば、ndenvインストール成功！

## 2. node-buildインストール
```
git clone https://github.com/riywo/node-build.git ~/.ndenv/plugins/node-build
```

## 3. インストールできるバージョン一覧
```
ndenv install -l
```

## 4. Nodeインストール

```
ndenv install v0.11.13　←バージョンは適宜好きなものを！
ndenv rehash　　　　　   ←再構築（インストール後のおまじない）
ndenv global v0.11.13　 ←デフォルトのバージョンに設定
node -v
```

最後のコマンドでバージョン出れば、Nodeインストール成功！


## 5. インストール済みのバージョン一覧
```
ndenv versions
```

※参考url
http://blog.tavi-travelog.net/2013/06/29/node-install-macports-to-ndenv/


# Rubyバージョン管理（rbenv + ruby-build）
## 1,2. rbenv、ruby-buildインストール
```linux
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
 
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
 
source ~/.bash_profile
rbenv -v
```

## 3. インストールできるバージョン一覧

```linux
rbenv install --list
```

## 4. Rubyインストール

```
rbenv install 2.0.0-p481
rbenv rehash
rbenv global 2.0.0-p481
ruby -v
```

## 5. インストール済みのバージョン一覧
```
rbenv versions
```

※参考url
http://dev.classmethod.jp/server-side/language/build-ruby-environment-by-rbenv/
clojure.core 述語一覧

こんな述語あるかな?って調べる事が多かったのcoreの並べてみた。

http://clojure.github.io/clojure/index.html#clojure.core

|述語一覧|
|:-:|
|associative?|
|bound?|
|char?|
|class?|
|coll?|
|contains?|
|counted?|
|decimal?|
|delay?|
|distinct?|
|empty?|
|even?|
|every?|
|extends?|
|false?|
|float?|
|fn?|
|future-cancelled?|
|future-done?|
|future?|
|identical?|
|ifn?|
|instance?|
|integer?|
|isa?|
|keyword?|
|list?|
|map?|
|neg?|
|nil?|
|not-any?|
|not-every?|
|number?|
|odd?|
|pos?|
|ratio?|
|rational?|
|realized?|
|record?|
|reduced?|
|reversible?|
|satisfies?|
|seq?|
|sequential?|
|set?|
|some?|
|sorted?|
|special-symbol?|
|string?|
|symbol?|
|thread-bound?|
|true?|
|var?|
|vector?|
|zero?|
コーディングの参考にしたいHTML・CSSフレームワークリンク集

コーディングの参考にしたいHTML・CSSフレームワークの個人的なリンク集です。

# HTML・CSSフレームワークリンク集

- Bootstrap (v3)  
http://getbootstrap.com/
- Bootstrap (v2)  
http://getbootstrap.com/2.3.2/
- Pure  
http://purecss.io/
- Foundation  
http://foundation.zurb.com/
- Gumby  
http://gumbyframework.com/
`gem install rmagick`でエラった時にいろいろやって最終的に解決した方法


#imagemagickのインストール

```
brew install imagemagick
```

```
Warning: imagemagick-6.8.9-1 already installed
```
はいそうですね。入れた記憶あります。

#pkg-configとlibtoolを再インストール
pkg-configとlibtoolをアンインストールして再度インストールすればいけるよ、って言ってる人いる。
[RMagick のインストールでエラー](http://qiita.com/snaka/items/aadb686dfb0d096109d6)

```
brew uninstall pkg-config libtool
```

再インストール。

```
brew install pkg-config libtool
```

#imagemagickのファイルにリンクを張ってやる

最後、以下のエラー出た。

```
・・・
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.
checking for Ruby version >= 1.8.5... yes
checking for /usr/local/bin/gcc-4.2... yes
checking for Magick-config... yes
checking for ImageMagick version >= 6.4.9... yes
checking for HDRI disabled version of ImageMagick... yes
checking for stdint.h... yes
checking for sys/types.h... yes
checking for wand/MagickWand.h... yes
checking for InitializeMagick() in -lMagickCore... no
checking for InitializeMagick() in -lMagick... no
checking for InitializeMagick() in -lMagick++... no
Can't install RMagick 2.13.1. Can't find the ImageMagick library or one of the dependent    libraries. Check the mkmf.log file for more detailed information.
・・・
```

で、いろいろ調べたらimagemagickで使ってるファイルにリンクを張ってやる（？）といいっぽい。

```
cd /usr/local/Cellar/imagemagick/6.8.9-1/lib/
ln -s libMagick++-6.Q16.3.dylib libMagick++.dylib
ln -s libMagickCore-6.Q16.2.dylib libMagickCore.dylib
ln -s libMagickWand-6.Q16.2.dylib libMagickWand.dylib
```

上記実行して再度`gem install rmagick`したら解決した！！！

はぁ、疲れた。
便利なjQueryメソッドまとめ


# 高さ系のメソッド
- outerHeight()：padding、borderまで含んだ高さを取得
- outerHeight(true)：marginまで含んだ高さを取得
- height()：純粋に高さ（height）を取得

(注)

- 該当する要素が複数ある場合、最初の要素
- height()に引数入れたら値をセット出来る（引数なしならgetter、引数ありならsetter）


(例)

- $(window).height()：ブラウザの高さを取得
- $(document).height()：ドキュメント（ページ全体）の高さを取得


# 座標系のメソッド
- offset()：ドキュメント上での表示位置（ドキュメントベースでの絶対座標）→`top`と`left`の2つを持つ
- scrollTop()：スクロール上での上位置（スクロール範囲の中での座標。相対座標）

# よく使うイベント
- scroll
- click
- resize

# おまけ
## [CSS]positionプロパティ
- static：配置方法を指定しない。これが初期値。
- relative：相対位置への配置。（基準位置の変更。親要素に対して用いる）
- absolute：絶対位置への配置。
   - 親ボックスが`static`→基準はウィンドウの左上
   - 親ボックスが`static`以外→基準は親ボックスの左上
- fixed：絶対位置への配置。（スクロールしても位置固定）
- sticky：対応ブラウザSafari, iOS Safariのみ（2014年7月16日現在）

## メソッドチェーン
メリットは、

- `$`の記述1回で済む
- 処理速度向上
Railsでグループ単位で集計(SUM)する例

自分向けのメモ

ユーザー毎のスコアを集計するような例

```rb
TestModel.group(:user_id).sum(:score)
```

以下のSQLが生成される。

```sql
SELECT SUM(`test_models`.`score`) as sum_score, user_id, FROM `test_models` GROUP BY user_id
```

---- 

上位１０位までに制限する例

```rb
TestModel.limit(10).order('sum_score desc').group(:user_id).sum(:score)
```
Centos5,6,7にEPEL/REMIのyumリポジトリの追加をする。

# EPELレポジトリの追加
####（CentOS7系）
標準のyumリポジトリからインストール可能です。

    # yum install epel-release

####（CentOS6系）  
    # rpm -ivh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

####（CentOS5系）  
    # rpm -Uvh https://archives.fedoraproject.org/pub/archive/epel/5/x86_64/epel-release-5-4.noarch.rpm
  

# remiレポジトリの追加
####（CentOS7系）
    # rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

####（CentOS6系）
    # rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

####（CentOS5系）
    # rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm  
※remiレポジトリは標準で無効化されているので利用する際にはyumコマンドに「--enablerepo=remi」を適用する。
SQL テーブルのレコードをコピーする

自分向けへのメモ.

既に登録されているレコードの一部を変えて複製するSQLの例.(確認はMySQL)

```sql
INSERT INTO customer select NULL, "○×花子", email FROM customer WHERE name = "○×太郎"
```

上記の例は、customerテーブルのname = "○×太郎"の全レコードの指名列を、"○×花子"に変えてレコードを複製する。
知らないとrsyncでもハマるシェル初期化

# シェルの初期化を調べたキッカケ

先日新たにセットアップしたcentOSインスタンスにrsyncしようとしたところ、
下記エラーが起こった。

```
protocol version mismatch - is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(69)
```

rsyncのoptionでなにかミスったかと思ったけど、
ぐぐって[ココ](http://www.linuxquestions.org/questions/linux-networking-3/rsync-e-ssh-error-protocol-incompatibility-345101/
)で
`There is probably a script producing output in your .bash_profile or similar file`とおっしゃっていた。


sshでサーバへ接続してみると接続直後に

```
Now using node v0.10.29
```

が出力されていた。


# シェル初期化について

シェルは、起動時の環境設定を下記のように読み込む

* /etc/profileがあれば読み込む
* シェルがログインシェルとして起動されたか否か
  * ログインシェルとして起動された場合、~/.bash_profileか~/.bash_loginか~/.profileの最初に見つかったファイルを読み込み
  * 非ログインシェルの場合、~/.bashrcを読み込み


~/.bash_profileや ~/.bashrcの中ではnodeのバージョンに関する処理はなかった。
/etc/profileの最後で/etc/profile.d/ 配下のシェルを実行していることが分かった。

`/etc/profile` の一部抜粋

```
for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done
```


`/etc/profile.d/` にあるファイルをみると
PS1.sh やら、colorls.cshやら
grep.sh、lang.csh、lang.sh、less.csh
less.sh、node.sh、nvm.sh、vim.csh、
vim.sh、which2.sh

*アプリケーション毎の設定を書いている模様。*

`vim.sh`ファイルの中身は、

```
$ cat /etc/profile.d/vim.sh 
if [ -n "$BASH_VERSION" -o -n "$KSH_VERSION" -o -n "$ZSH_VERSION" ]; then
  [ -x /usr/bin/id ] || return
  ID=`/usr/bin/id -u`
  [ -n "$ID" -a "$ID" -le 200 ] && return
  # for bash and zsh, only if no alias is already set
  alias vi >/dev/null 2>&1 || alias vi=vim
fi
```

`vim ファイル名 = vi ファイル `なのは、このシェルが初期化で実行されているからなのか！！


# シェル実行時、標準出力を止める

さて、node関連は `nvm.sh`に間違いない。

nvm.sh

```
. /usr/local/nvm/nvm.sh
nvm use v0.10.29
```
`nvm use v0.10.29`を`nvm use v0.10.29 > /dev/null`に修正


問題なくrsyncできるようになった（●＾o＾●）
S3上のファイル(サブディレクトリ込み)をGCSに移行するための手順

gsutilでS3上のファイル(サブディレクトリ込み)をGCSに移行するための手順です。既にGCPのプロジェクトが作成されていることは前提となります。

(1)Google Cloud SDKのインストール
windowsはやったことありませんが、Linux/Macならとても簡単にインストール可能です。
https://developers.google.com/cloud/sdk/#Quick_Start

(2)認証
OAuth2による認証をおこないます。
`$ gcloud auth login`


(3)プロジェクトのセット
`$ gcloud config set project プロジェクト名`

(4)設定ファイル(.boto)の生成
`$ gsutil config`

(5)設定ファイルの編集
`$ vim .boto`
以下の２行のコメントアウトを削除しAWSのアクセスキーとシークレットアクセスを設定します。
`aws_access_key_id = <your aws access key ID>
aws_secret_access_key = <your aws secret access key>`

(6)移動元のS3ファイルの確認
移動元のファイルは以下の通りです。
・Bucket名:tomorier
・サブディレクトリ名:sub-dir
![スクリーンショット 2014-07-16 16.09.47.png](https://qiita-image-store.s3.amazonaws.com/0/25837/6358a4e6-1a72-1942-9cde-87c9798df3b3.png)

(7)移動先のGCSバケットの作成
`$ gsutil mb gs://tomorier-gcs`

(8)S3のファイルをGCSに移動
以下のコマンドからサブディレクト毎ファイルをGCSに移動します。
`$ gsutil mv s3://tomorier/sub-dir gs://tomorier-gcs
Copying s3://tomorier/sub-dir/ [Content-Type=binary/octet-stream]...
Removing s3://tomorier/sub-dir/...
Copying s3://tomorier/sub-dir/サンプル1.png [Content-Type=image/png]...
Removing s3://tomorier/sub-dir/サンプル1.png....png:      65.18 KB/72.68 KB    
Copying s3://tomorier/sub-dir/サンプル2.png [Content-Type=image/png]...
Removing s3://tomorier/sub-dir/サンプル2.png....png:      65.18 KB/72.68 KB    
Copying s3://tomorier/sub-dir/サンプル3.png [Content-Type=image/png]...
Removing s3://tomorier/sub-dir/サンプル3.png....png:      65.18 KB/72.68 KB`

(9)S3の確認
移動元のファイルが消えていることが確認できます。
![スクリーンショット 2014-07-16 16.16.08.png](https://qiita-image-store.s3.amazonaws.com/0/25837/93e4379f-a24c-2ec2-28aa-05bd6d0d0400.png)

(10)GCSの確認
無事移動できました。
![スクリーンショット 2014-07-16 16.17.19.png](https://qiita-image-store.s3.amazonaws.com/0/25837/502f08fe-5945-4108-2246-f696b58eef48.png)



もちろん、GCSからS3への移動も可能です。
NSJSONSerializationメモ


以下、意訳。

+ JSONデータからオブジェクトを生成する。
+ パーサーが一番上の階層のオブジェクトがNSArrayでもNSDictionaryでもない場合を許す場合にはNSJSONReadingAllowFragmentsオブションをつける。
+ NSJSONReadingMutableContainersオプションを設定すると可変(Mutable)なNSArrayとNSDictionarieをパーサーは生成する。
+ NSJSONReadingMutableLeavesオプションを設定すると可能(Mutable)なNSStringをパーサーは生成する。
+ パース中にエラーが生じた場合はエラーパラメータが設定され、nilが返却される。
+ 入力されるデータでサポートされるエンコーディングはUTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BEの５種類。
+ データはBOMを持っていてもいなくてもよい。
+ パースにもっとも有効なエンコーディングがUTF-8であるので、選択の余地があるならUTF-8を使ったほうが良い。

```objc:hoge.h
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
```
CentOS6で vSphere Perl SDK 動作環境構築手順


**CentOSインストール手順は省略**
＃Minimalで構築

**構築した環境のOS、カーネルバージョン**
`# cat /etc/redhat-release
CentOS release 6.5 (Final)`

`# uname -r
2.6.32-431.el6.x86_64`

###必要モジュールインストール
`# yum install openssl-devel
 # yum install perl-CPAN
 # yum install gcc
 # yum install libuuid-devel
 # yum install libxml2-devel`

###YAMLをインストール
`# cpan YAML`

###vSphere Perl SDKをダウンロード
**vSphere Downloadサイト**
https://developercenter.vmware.com/web/sdk/55/vsphere-perl
※アカウント登録必要

###vSphere Perl SDK解凍
`# tar zxvf VMware-vSphere-Perl-SDK-5.1.0-780721.x86_64.tar.gz
 # cd vmware-vsphere-cli-distrib/`

###vmware-install.pl編集
` # cp -p vmware-install.pl vmware-install.pl.org
 # vi vmware-install.pl`
以下の行をコメントアウト(Proxyを経由させない場合)
>  #      if ( !( \$ftpproxy \&\& \$httpproxy)) {
>  #         uninstall_file(\$gInstallerMainDB);
>  #         exit 1;
>  # }


###vSphere Perl SDKをインストール
`# ./vmware-install.pl`

###動作確認
`# vmware-cmd --version
vSphere SDK for Perl version: 5.1.0
Script 'vmware-cmd' version: 5.1.0`

vmware-cmdでバージョン表示されれば構築完了


苦労した点：
vmware-install.plを動かすための必要モジュールの調査
バッチファイルでif文をトラブルなく使う

バッチファイルでif文を使っていてハマったので、ハマらないための書き方と注意点をまとめてみた

# 解決方法
何も考えず必ず以下の形で書く。

```
if 条件 (                ←(1)
  call :サブルーチン名 引数 ←(2)
) else if 条件 (          ←(3)
  call :サブルーチン名 引数
) else (                 ←(4)
  call :サブルーチン名 引数
)                        ←(5)
```

# 以下説明
(1)条件文
　　末尾の'('はこの行の行末に書く。その後ろに継続して記述しない。
　　この行にコマンド書くとろくな事にならない。
　　悪い例：

```
if "%FOO%"=="1" ( set VAR=2 )
```

　　は %VAR% に "2 "(後ろに余計なスペースあり) を代入する

```
if "%FOO%"=="1" (
  set VAR=2
)
```

　　なら問題ない

(2)実行文は書かず極力サブルーチンを呼び出す
　　※ifの()の中で色々と記述すると大抵不幸になる。
　　　代わりにサブルーチンを呼び出す。
　　※ifの()の中で変数代入しても、新しい値が有効になるのは()から出た後。
　　悪い例：

```
set AAA=
set BBB=0
if "1"=="1" (
  set AAA=10
  set /a BBB=AAA+20
)
echo %BBB%
```

　　上記の例は、期待した値30ではなく値20を出力する。

(3)else if文
　　省略可能。まぁ、当たり前。

(4)else文
　　必ず行頭から") else ("とし、直ぐに改行。
　　※elseの前後にスペースが必要

(5)末尾の')'
　　必ず行頭から")"とし、直ぐに改行。
　　悪い例：

```
if "1"=="1" (
  set AAA=10 )
```

　　上記の例では、%AAA%に"10 "が入る。(末尾に余計なスペースあり)
port 80を一般ユーザで動かすwebサーバの例

ベンチマーク誰かとってくれないかな
dockerが一番早そう

# iptable

```bash:rootで実施
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080
```

参考:
[How can I run a server on Linux on port 80 as a normal user? - Server 
Fault](http://serverfault.com/questions/112795/how-can-i-run-a-server-on-linux-on-port-80-as-a-normal-user)


# ssh

```bash:rootで実施
ssh -gNL 80:localhost:8080 localhost
```

# stone

```bash:rootで実施
stone localhost:8080 80
```

# docker

```
docker -p 80:8080 イメージ /usr/sbin/runuser -l www-data -c 'python -m SimpleHTTPServer 8080'
```

# 8080ポートを稼働

一般ユーザで8080ポートでサービスを稼働させる。
80ポートで応答を返す。

```bash:8080でサービス起動
python -m SimpleHTTPServer 8080
```
Sequelize.js でデータベースのカラムを変更せずに model を定義

```js
sequelize.define
```
の時点で次を設定

* テーブル名を変更しない。
  * freezeTableName: true
  * tableName: "既存のテーブル名"
* createdAt, updatedAt を追加しない
  * timestamps: false
* id を追加しない
  * 主キーに対応するカラムに primaryKey: true 追加

これでテーブルのスキーマが as is で使える。
【jQuery】IE8で:not(:first)が効かない時の対処法


ie8の`:not`でハマったのでメモ。
ie8以外では、以下の記述でOK。(ie6,7は見てない)

```jquery.js
$(".selector:not(:first)").hide();
```

ie8は以下のような記述をするとちゃんと適応された。

```jquery.js
$(".selector:not(.selector:first)").hide();
```

###参考
- [jQuery :not(:first) not working in IE8, but does in FF and Chrome](http://stackoverflow.com/questions/2859250/jquery-notfirst-not-working-in-ie8-but-does-in-ff-and-chrome)
iOSメモ - Blocks

Blocksは、一般的にはクロージャ。ラムダ式、無名関数。

```objc
//Modelでの宣言
- (void)fetchNews:(void (^)(NSDictionary *, NSError *))handler
{
     //省略          戻り値 関数名なし 引数
}


//呼び出し方
[[APIManager sharedClient] fetchNews:^(NSDictionary *events, NSError *error){
    //省略
}]

```

- 引数がブロック

[Block構文の基本](http://obc-fight.blogspot.jp/2013/07/Block-basic.html)

[[Objective-C] Blocksがややこいのでまとめてみる](http://qiita.com/edo_m18/items/a1ee24cd23d3adde51d8)

http://fuckingblocksyntax.com/

追記

```objc
//関数内からはhandlerで、中身を呼び出すことが出来る。
if (handler) {
    handler(events, nil);
}
```
VagrantのNFS設定でexportsのエラー解消

Vagrantでnfsを使うと、```/etc/exports```に設定が追加されます。
複数のプロジェクトでvagrantを使っているときなどに、公開先のipなどが重複して、起動時に

```shell-session
exports:2: path contains non-directory or non-existent components:
```
のようなエラーが発生することがありました。

解消するために、

```
vagrant halt
# viで不要なを消すでもいいかも
rm -rf /etc/exports
touch /etc/exports
vagrant up
```

などして不要な設定たちを一旦削除してあげることで解消しました。
個人開発でAppEngineを使う４つの理由

![スクリーンショット 2014-07-16 13.45.28.png](https://qiita-image-store.s3.amazonaws.com/0/25837/76bf8754-bc91-e059-855e-e4b3de4666e3.png)

２年前から個人でiPhoneアプリを作り始め、リリースしたアプリ数も１９本になりました。アプリの全PV数は月間200万PVを超え、売り上げも非常に安定してきました。そのうち９５％のアプリがバックエンドにGoogleAppEngineを利用しているのですが、今の安定があるのはAppEngineだからだと思っています。ということで、この２年間の経験を踏まえ「個人開発でAppEngineを使う４つの理由」を書いてみようと思います。


#1.Eclipseでテストからリリースまでできる#
タイトル通り全てEclipse上で完結することができます。アイデアが浮かんだら開発・テストをおこない、あっという間にリリースできます。

#2.勝手にスケールアウト#
開発者はプログラムだけに集中することができます。開発してデプロイした後は、勝手にスケールアウトしてくれます。スケールする仕組みを自分で考える必要はありません。あとはGoogleの一流のインフラエンジニアがどうにかしてくれます。

#3.めちゃくちゃ安い#
利用した分だけ料金を支払えばそれで終わりです。つまり、アクセスが発生しない時間帯はタダ同然です。しかも無料枠もあります。EC2のようなIaaSを使った場合は確保したリソースに対して課金が発生しますのでアクセスなくても料金が発生します。ちなみにGAEの運用で未だに１日１ドルかかったことがありません。

#4.知識が増えるとさらに安くなる#
知識によって料金を抑えることができます。例えば、(基本的すぎる話ですが)無料のMemcacheを利用することでデータストアへの参照を大幅に削減できたりします。また、GAEの管理画面から立ち上がるインスタンスの数も制御することができます。


以上が自分がGAEを利用する４つの理由です。逆に運用で利益を出すことを考えると、もはやGAE以外の選択肢がない状態です。個人で開発する場合GAE以上のプラットフォームがないので使っているという感じです。もし自分で何かしらサービスを作って世の中に出したいのであればGAEはとてもオススメです。
Java学習ノート_140716（例外とアサーション）

例外、あんまりおもしろくない。

# 例外とアサーション

## 例外の種類

 * エラー : JVMがスロー
 * 例外 : アプリケーションによるエラー。軽重ある。
 * 実行時例外 : コンパイラのチェックが行われない（実行時の例外だから）。

これらをすべてエラーと呼んでいたので区別する。

チェック例外と非チェック例外は別の分類なので注意。RuntimeExceptionクラスまたはErrorクラスのサブクラスは非チェック例外、それ以外の例外はすべてチェック例外。

## 例外クラスを作る

```java:ExceptionSample.java
class MyException extends Exception{
	public MyException(String msg) {
		super(msg);
	}
	public MyException(Throwable cause) {
		super(cause);
	}
}
class ExceptionSample {
	public static void main(String[] args) {
		try{
			dosomething();
		}
		catch(MyException e){
			e.printStackTrace();
		}
	}

	static void dosomething() throws MyException{
		// TODO 自動生成されたメソッド・スタブ
		MyException e = new MyException("自作の例外処理");
		throw e;
	}
}

```

## 例外とオーバーライド

throws句がついたメソッドをオーバーライドする場合、同じ（サブクラスを含む）例外しか新たに宣言することができない。ポリモーフィズムでの不整合が起こらないようにするため。

## アサーション（Assertion: 表明）

プログラムのバグをチェックするコードを埋め込む機能をアサーションという。基本的に開発時にON、運用時にはOFFにする。

```java:AssertSample.java
public class AssertSample {
	public static void main(String[] args) {
		int num = -1;
		assert num > 0 : "numは0以上である必要があります。";
	}

}
```

Eclipseの場合，メニュー→実行構成→Javaアプリケーション→(x)=引数→VM 引数に -ea を書いて，実行。以下が実行結果。

```
Exception in thread "main" java.lang.AssertionError: numは0以上である必要があります。
	at AssertSample.main(AssertSample.java:5)

```
SQLServerでスクリプトのデバッグを行う

このドキュメントではSQLServer 2008以降でストアドプロシージャのデバッグを行う方法について説明する。

#手順
１. Microsoft SQL Server Management Studioでストアドプロシージャを右クリックする。
２. [ストアドプロシージャをスクリプト化]⇒[EXECUTE]⇒新しいクエリーエディターウィンドウ
３ 以下のようなスクリプトが生成される

```sql
USE [Sample001]
GO

DECLARE @RC int
DECLARE @from int
DECLARE @to int

-- 方法: パラメーター値をここに指定します。

EXECUTE @RC = [dbo].[test_sp] 
   @from
  ,@to
GO

```

４. テスト用のパラメータを入力する

```sql
-- 方法: パラメーター値をここに指定します。
SET @from = 10
SET @to = 200
```

５. スクリプトにブレークポイントを張る
![sql.png](https://qiita-image-store.s3.amazonaws.com/0/47856/832e0740-9223-b358-712a-18362be9b82f.png)

６．「デバッグ」⇒「開始」を選択
ALT+F5：次のブレークまで実行
F10:ステップオーバ... 次の行を実行。次が別のストアドの場合、ストアドの中には入らない
F11:ステップイン...次の行を実行。次が別のストアドならストアドの中に入る。
![sql.png](https://qiita-image-store.s3.amazonaws.com/0/47856/3f9f8da0-edea-259d-7cc9-b31d7777cb05.png)

#注意
・リモート側またはクライアント側がHomeEditionの場合はWindows認証が上手くいかずに、デバッグが実行できない可能性がある。

![sql.png](https://qiita-image-store.s3.amazonaws.com/0/47856/064ce394-a034-bbd6-f98f-724ce842e883.png)

``
T-SQLデバッグを開始できません。コンピュータ'XXXX'に接続できませんでした。Visual Studio リモート デバッガーは、このWindowsエディションをサポートしていません。
``

この原因はリモートデバッグにWindows認証が必要で、HomeEditionにはそれがふくまれていないため。
http://social.msdn.microsoft.com/Forums/vstudio/en-US/77689d96-dc35-4a10-96e8-a0f98b33901c/visual-studio-2008-remote-debugging-and-windows-xp-sp2-home-edition?forum=vsdebug


・上記のエラーが発生した場合で、SQLSERVERのあるマシンにMicrosoft SQL Server Management Studioを入れているのなら「localhost\SQLEXPRESS」というようにlocalhostと明示しておけばデバッグが可能。

・SQLSERVER2005以前に対しては、Microsoft SQL Server Management Studioからはデバッグできない。VisualStudio 2008 Professionalのサーバ接続のウィンドウで接続してデバッグする必要がある。
IDEAでどこでもRuby1.9の文法を使う

Ruby プラグインをインストールしただけの IntelliJ IDEA では、たとえば Vagrantfile のここが文法エラーになります:

```rb
  config.vm.network "private_network", ip: "192.168.33.10"
```

エラーを放置するとコードフォーマッターで文法を壊されます。とくにRubyはスペースあけるあけないで変わってくるので。

これは Ruby1.8 にない文法ゆえに出ている、というのがわかればこう書き換えればいいのですが:

```rb
  config.vm.network "private_network", { :ip => "192.168.33.10" }
```

なんでこんな変更したのか意味わかりませんね。負けた気になります。

Ruby プラグインは、Ruby SDK が指定されているモジュール以下のファイルでないと、文法バージョンを指定できません。指定できなかったときのデフォルトは 1.8 になります。エー （´Д｀）

強引な方法としては、プロジェクトのルートを Ruby モジュールとして定義し、そのモジュールが使用する Ruby SDK に、1.9 以上のものを指定します。たとえPHPのプロジェクトだろうとPythonのプロジェクトだろうと、ルートモジュールの種類を Ruby にしてしまうという...

PythonやPHPとは競合が起こらないので動くんですが、これも負けた気になります。

別の解決策として、JRuby ファセットが使えます。

- rbenv などで jruby の最新版をインストール
- `⌘ + ;` で出てくる SDKs に JRuby SDK として ~/.rbenv 以下のパスを追加
- このとき JRuby SDK の Language Level が 1.8 なのを 1.9 以上に修正
- Modules でルートモジュールを右クリックして JRuby フレームワークを追加
- Language Level >= 1.9 の JRuby SDK を選択

これで、PHP とか Java とか Python とか、そういうのがルートに来てるプロジェクトでも、Vagrantfile の文法などに Ruby 1.9 が使えるようになります。
ロードバランサーPoundでのサーバ証明書の設置手順

サーバー証明書の発行と設置するときのメモ書きです。

Poundのバージョンは2.6です。
globalsignの推奨設定に合わせて記述しています。


作業フォルダに移動します。
/usr/local/etc/下にpound/ssl/を格納先とします。

```bash
cd /usr/local/etc/pound/ssl
```

混ざるとわかりづらくなるので
コモンネーム（ドメイン）別にフォルダを作りましょう。

```bash
mkdir common_name
```

キーを生成します。パスフレーズは次で除去するので適当にします。

```bash
openssl genrsa -des3 -out ssl.globalsign.com.key 2048
```

パスフレーズの除去。

```bash
openssl rsa -in ssl.globalsign.com.key -out ssl.globalsign.com.key
```

CSRを発行します。

```bash
openssl req -new -key ssl.globalsign.com.key -out ssl.globalsign.com.csr
```

発行されたCSRを出力して、この内容を
コモンネームと一緒に送ってサーバー証明書を発行してもらいます。

```bash
cat ssl.globalsign.com.csr
```

次に発行された後です。
メールで届くと思います。

作業場所に移動して

```bash
cd /usr/local/etc/pound/ssl/common_name
```

サーバー証明書を以下ファイル名で保存します。

```bash
ssl.globalsign.com.crt
```

中間証明書を以下ファイル名で保存します。

```bash
ssl.globalsign.com.cer 
```

秘密鍵 + サーバー証明書 + 中間証明書 のファイルを作ります。

```bash
cat ssl.globalsign.com.key ssl.globalsign.com.crt ssl.globalsign.com.cer > ssl.globalsign.com.key_crt_cer
```

ファイルできましたね。これをpoundのCertに記述します。

```bash
Cert "/usr/local/etc/pound/ssl/common_name/ssl.globalsign.com.key_crt_cer"
```

正しく設定できたか確認します。

```bash
pound -c
```

以上です。
pythonの文字列操作

##pythonでの基本的な文字列操作のまとめ

良く忘れるのでメモ

###文字列が含まれるかどうかの判定

```
"ho" in "hoge" # True
```

###部分文字列の変更 and 削除

```
"hogehoge".replace('h', 'k') # "kogekoge"
"hogehoge".replace('h', '') # "ogeoge"
```

###配列を文字列へ（もちろん、中身は文字列に変換可能であること）

```
"".join([str(x) for x in l]) # "文字列"
"\t".join([str(x) for x in l]) # "tsv"
```

###特定文字列の出現頻度カウント

```
"hogehoge".count('h') # 2
```

###単語のカウント　＊ただし、形態素解析が済んで、かつスペース区切りとなってる

```
from collections import Counter
Counter("hoge nga kuke".split()) # {"hoge":1, "nga":1, "kuke":1}
```

###文字のasciiコードへの相互変換

```
ord('a') # 97
chr(97) # a
```

###正規表現で日本語抽出（ひらがな）

```
import re
jap = re.compile("[あ-ん]")
print(jap.findall("ほげほげnga区毛")) # ['ほ','げ','ほ','げ']
```

漢字とか記号は、Unicodeで頑張る
Unicode:Wikipedia => http://ja.wikipedia.org/wiki/Unicode

*小言
pythonで日本語扱うときは、3系使いましょう（自戒
理由：http://www.pythonweb.jp/tutorial/string/index5.html
【TravisCI】Firefoxとの接続エラー(unable to obtain stable firefox connection)がでるときの対処法

# はじめに
* 「これ忘れることあるだろうなぁ！！」と思い技術メモに残しました

# やりたかったこと
* ローカルの環境で実行していたSeleniumのブラウザテストをTravis上での実行に移行しようと思った
* ローカルのマシンではJenkinsで実行していたため、それを.travis.ymlへ移すだけのはずと
* ヘッドレスで実行

# 実行してみて発生したエラー
* 以下のエラーがでた
 * unable to obtain stable firefox connection in 60 seconds (127.0.0.1:7055) (Selenium::WebDriver::Error::WebDriverError)
* 60秒待ったがFirefoxとの接続ができなかったといわれる

# 対処法というより、設定が足りていなかった！！
* .travis.ymlに以下を追加すると成功するようになった
 *  sleepは挟まなくても問題ないようでしたが、必要に応じていれるのもありかと

```:.travis.yml
before_script:
  - export DISPLAY=:99.0
  - sh -e /etc/init.d/xvfb start
  - sleep 5
```

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
Zabbix Proxy ＋ Hyclops をAWS上で検証してみた

前回の投稿でAWS上のZabbix Proxyが出来たので、Hyclopsについても検証してみました。

#やりたいこと

![Hyclops1.jpg](https://qiita-image-store.s3.amazonaws.com/0/47012/05a9abfa-9514-d4fd-ebd2-9a8b9ba0fb4d.jpeg)

各リージョンにZabbixProxy＋Hyclopsを導入し、監視をものすごく楽にしたい。
AutoScaleなんかも気にしないでいきたい。

#Zabbix-ServerにHyclopsを入れた場合

![Hyclops2.jpg](https://qiita-image-store.s3.amazonaws.com/0/47012/8109ab8c-4e05-1471-4f0f-a386c2d3a479.jpeg)

Zabbix Proxy経由で上手くHyclopsが連動してくれるかなぁと思ったのですが、Zabbix-Serverが主となります。（そりゃそうだ）

①CloudWatch等からAWS APIを用いて全リージョンのEC2を取得し、Zabbix-Serverに登録します。その時に以下のように登録されます。

Zabbixの表示：［Hyclops用ホスト名］_［AWSコンソール上で見えるName］_［Instance ID］
ホスト名　　 ：Public DNS
IPアドレス   ：Public IP

ただし、標準がホスト名となっているので、ホスト名を使って通信に行くと思われます。そうするとAWSの仕様上PrivateIPで返ってきちゃいます。

②登録したEC2を監視しようとします。

【結論】
TOKYO、EUともにZabbix-Serverから監視しに行ってしまい、狙ったとおりになりません。

#Zabbix-ProxyにHyclopsを入れた場合
◆Hyclopsの設定
そもそも入るかどうか不安でしたがいけました。手順は私の過去の投稿をごらんください。
違いは/opt/hyclops/hyclops.confのZabbixServerの指定にきちんとZabbix-ServerのIPを書いてあげることです。

◆Zabbix-Agentの設定
PrivateIPでの通信なので、Zabbix-ProxyのPrivateIPを/etc/zabbix/zabbix_agentd.confに記述してください。

◆セキュリティグループの設定
Zabbix-ProxyとZabbix-Agentそれぞれについてお互いのセキュリティグループで10050-10051を許可するようにしてください。セキュリティグループを許可した場合は、所属EC2のPrivateIP通信を許可します（過去の実験）。

![Hyclops3.jpg](https://qiita-image-store.s3.amazonaws.com/0/47012/23294abd-5db5-21b9-2cf7-628175a51e86.jpeg)

◆挙動

![Hyclops4.jpg](https://qiita-image-store.s3.amazonaws.com/0/47012/bfb15a85-a025-944a-f311-9a7d16600413.jpeg)

①CloudWatch等からAWS APIを用いて全リージョンのEC2を取得し、Zabbix-Serverに登録します。（Zabbix-ServerにHyclopsを入れた場合と同じ）

②登録したEC2を監視しようとします。無事Zabbix-Proxyから各Agentの値を取り、Zabbix-Serverに返してくれます。

が・・・・・

EU以外の国も監視してしまいます。

【結論】
嬉：Zabbix-Proxy＋HyclopsでEUのEC2を自動監視できた
悲：狙ってないリージョン（TOKYO）もにZabbix-Proxyから監視しに行ってしう。
　　→リージョン毎にZabbix-Proxy＋Hyclopsにすると全リージョンEC2がめっちゃ登録
　　される

これも今後の検討事項となりました。
errnoでエラーを確認する

# C言語でのエラーハンドリング
Cだとファイルの操作は以下のようにできます。

```c
FILE *fp = fopen(filepath, "r");
if(fp == NULL){
  // エラーハンドリング
}else{
  // ファイルを開いてなんか処理する
  fclose(fp);
}
```

fopenは失敗したときにNULLを返しますが、
これだけですと何故失敗したのかを判断できません。

この問題は、失敗時に-1やNULLを返すシステムコールや関数では常に起きうる問題です。
このような問題が起きた場合には、errnoを利用することでエラーの種類を特定できる場合があります。

#エラーを判断するerrno
errnoは<errno.h>内でグローバルに定義された整数値です。
errno.h内にはエラーに対応した定数が定義されており、
エラーが起きた場合にerrnoに値を設定するシステムコールや関数があります。

何かしらの処理に失敗した場合にはこの値を確認することで、
エラーの種類を特定できる場合があります。

このとき、errnoはどのような場合も0に変わることはない為、
処理の前にerrnoに0を代入することで、
その処理のエラーかどうかを判断できます。
(正常終了した場合は前の値を保持し、またerrnoを設定しないものもあるため、
事前に0を入れないと該当の処理で書き換わったか判断できません)

また、引数にエラー番号を渡すと対応するエラー内容を、
標準出力に出力するperror、
文字列で返すstrerror
が存在します。



なお、errnoは一つしか無いため常に書き換えられる可能性があります。
そのため、エラーの特定や処理をする前に変数にコピーしておくことをオススメします。


具体的な使い方は次のコードを参考にしてください。


# 使い方

## コード
```c:errno.c
#include <stdio.h>
#include <errno.h>
#include <string.h>

#include <sys/time.h>
#include <sys/resource.h>
int main()
{
  int number;

  // 2: No such file or directory
  FILE *fp = fopen( "no_exist_filepath", "r" );
  number = errno;
  if(fp == NULL){
    perror("print error string by perror  ");
    printf("print error string by strerror: %s\n", strerror(number));

    printf("print error code: %d\n", number);
  }else{
    fclose(fp);
  }

  // 22: invalid argument
  errno = 0;
  int ret = getpriority(10000000, 1000000);
  number = errno;
  if(ret == -1){
    printf("\n");
  
    perror("print error string by perror  ");
    printf("print error string by strerror: %s\n", strerror(number));

    printf("print error code: %d\n", number);
    printf("print return code: %d\n", ret);
  }
  return 0;
}
```

## 結果
```bash
print error string by perror  : No such file or directory
print error string by strerror: No such file or directory
print error code: 2

print error string by perror  : Invalid argument
print error string by strerror: Invalid argument
print error code: 22
print return code: -1
```
Chrome CanaryでHTTP2.0を有効にする

2014/7現在、Google ChromeでHTTP/2を有効にするには開発版であるChorome Canaryを使う必要があります。Macのバイナリ版が配布されているのでインストールは簡単です。

インストール後、Applicationのアイコンから起動するとHTTP2は無効化されていますので、以下のように`--enable-spdy4`オプションを付けて起動すればHTTP2が有効になります!!!!

```shell-session
$ /Applications/Google\ Chrome\ Cana.app/Contents/MacOS/Google\ Chrome\ Canary --enable-spdy4
```
logrotateメモ

## logrotateメモ

## 実行せずにテストする

    logrotate -d /etc/logrotate.conf

### 個別に

    logrotate -d /etc/logrotate.d/hoge

## もっと詳しい情報を出す

    logrotate -dv /etc/logrotate.conf

## logrotateが実際に行われてるか確認する

    cat /var/lib/logrotate.status

## 強制的にlogrotateする

    logrotate -f /etc/logrotate.conf

logrotateが上手くいかない場合は、大体、/etc/logrotate.d/hogeで全角がはいってたりとか
そもそも、無いファイル指定してたりとか、ミスってる場合が多いです。
Windows用sftpクライアントwin-sshfsのinstall方法

#win-sshfsのインストール方法

Win-sshfsはLinuxで有名なsshfsをwindowsで実現したソフトです。
WinSCPより便利なのでよく使ってます。

dokanは閉鎖し古いWin-sshfsはもはや使えません。
しかし有志がdokanをdokanyへ、Win-SSHFSをWinSshFS Foreveryoneへ引き継ぎ開発しています。

開発が進み、Win10でも署名済みのドライバをインストールできます。（すごい）
さらに簡略が進みdokanyとWinSshFS_Fをインストールするだけで動きます。（すごい）
オフィシャルWin-sshfsより高性能化しておりproxy下やKeepAlive機能が増えてます。（便利）

自環境がWin10なので不明ですが、Win7環境では以下が必要かもしれません。
Microsoft .NET Framework 4 Full Profile ( http://www.microsoft.com/download/en/details.aspx?id=17718 )

##必要なもの

- dokany v1.0.0 （ https://github.com/dokan-dev/dokany/releases/tag/v1.0.0 ）
- WinSshFS Foreveryone 1.6.1.13 devel RC5　( https://github.com/feo-cz/win-sshfs/releases )

###Dokanのインストール

DokanSetup-1.0.0.5000.exe を上記URLからDLしインストール

###win-sshfsをインストール

WinSSHFS-1.6.1.13-devel.msi を上記URLからDLしインストール

##トラブルシューティング

- インストール後うまくマウントできない

dokanyのversionはあってますか？
WinSshFS v1.6.1.13を動かすためにはdokany v1.0.0である必要があります。

管理者権限で起動してませんか？
有志版では管理者権限は不要です。

- ファイルにアクセスできない

頻繁にハングするならば、安定したUnix系の端末を踏み台にして
PC→(win-sshfs)→踏み台鯖→(sshfs)→不安定な鯖
とつなげると良い

#dokany
dokanyを使用するライブラリは沢山あり、この記事で説明するWin-sshfs以外にも便利なツールが沢山あります。
http://dokan-dev.github.io/ (Projects. See it working.の項)

私はFS（ファイルシステム）の開発なんて縁が無いんですが、もしWindows上でFSを開発するならdokanyを使うと良いでしょう
Win10では特に署名がネックになりやすいので開発の助けになると思われます。
MacでPHPを有効にする方法


ローカルでPHPテスト環境を作る時にやったことメモ。

##1. Apacheの起動
ターミナルから、スーパーユーザーでApacheを起動する。

```Bash:ターミナル
sudo apachectl start
```

ブラウザで[http://127.0.0.1/](http://127.0.0.1/)にアクセスし、Apacheが起動しているか確認。
（起動していれば「It works!」と表示されるはず）

##2. PHPの有効化

`/etc/apache2/`にある`httpd.conf`を開く。  

```Apache:httpd.conf
#LoadModule php5_module libexec/apache2/libphp5.so
```

上の行がコメントアウトされているので、`#`を削除し、httpd.confファイルを上書き保存してApacheを再起動。

```Bash:ターミナル
sudo apachectl restart
```

##3. PHPの起動確認
エディタを開き、下のコードを書いて`phpinfo.php`のファイル名で`/library/Webserver/documents/`に保存する。

```PHP:phpinfo.php
<?php
    phpinfo();
?>
```


ブラウザで[http://127.0.0.1/phpinfo.php](http://127.0.0.1/phpinfo.php)にアクセスしてphpinfoが表示されれば成功！
PHP で port 80 を開いたあと root 権限を捨てる web サーバの例

```console
$ composer require react/react:\*
$ vim index.php
$ sudo php index.php
```

```php:index.php
<?php
use React\EventLoop\Factory;
use React\Socket\Server as SocketServer;
use React\Http\Server as HttpServer;
use React\Http\Request;
use React\Http\Response;

require __DIR__ . '/vendor/autoload.php';

$loop = Factory::create();
$socket = new SocketServer($loop);
$http = new HttpServer($socket);

$http->on('request', function (Request $request, Response $response) {
    $uid = posix_getuid();
    $euid = posix_geteuid();
    $name = posix_getpwuid($uid)['name'];
    $response->writeHead();
    $response->write("Hello $request->remoteAddress\n");
    $response->write("I am $name, uid is $uid($euid)\n");
    $response->end();
});

$uid = posix_getpwnam('apache')['uid'] or die(__LINE__);
$socket->listen(80, '0.0.0.0');
posix_setuid($uid) or die(__LINE__);
$loop->run();
```

```console
$ curl http://localhost/
Hello 127.0.0.1
I am apache, uid is 48(48)
```