OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScriptでJquery Pluginを使う

TypesScriptでjquery Pluginの使用する場合のメモです。

[jquery.depend](https://github.com/garafu/jquery.depend)をTypeScriptで使用する例です。
jquery.d.tsを拡張することで、Jquery Pluginのメソッドを追加できます。


```ts:extension.d.ts
interface JqueryBrowser{
    original?: string;
    version?: JQueryVersionInfo;
    opera?: bool;
    msie?: bool;
    firefox?: bool;
    chrome?: bool;
    browser?: bool;
    safari?: bool;
    silk?: bool;
    unknown?: bool;
    initialize( str:string ):void;
    is( str:string ):bool;
}



interface JQueryVersionInfo{
    original?: string;
    major? : number;
    minor? : number;
    builid? : number;
    revision? : number;
    isEqual( major:number , minor?:number , build?:number , revision?:number ):bool;
    isOrLess( major:number , minor?:number , build?:number , revision?:number ):bool;
}



interface JQueryStatic{
    browser: JqueryBrowser;
}
```

このように簡単に定義できるので、TypeScriptでも積極的にJqueryPluginを使うことができます。
putty、poderosa、RLoginを超えた「MobaXterm」のすすめ

[MobaXterm](http://mobaxterm.mobatek.net/)

## 特徴

* 文字色がちょっと色抑え目で見やすい
* サーバーに接続するとSFTPウィンドウも左に表示。ここでファイルをWindowsのエディタで編集→自動uploadが可能。
* sshやvimが内蔵されている。pluginとしてgitやmosh、screenなど追加可能。gitはたったの5mb!
* RDPやSFTP、XDMCPなどもサポート。Xサーバーも内蔵。
* USBメモリにインストール可能。しかもたったの15～20MB。
* ssh-agentでキー登録しておくと、サーバーに接続するのが楽
* c:\は/cygdrive/c/ でアクセスできます。
* X11-forwardingでリモートのプログラムを表示可能。

## 欠点

* 日本語入力ができない(uim-fep推奨)

![mobaxterm.png](https://qiita-image-store.s3.amazonaws.com/0/25728/cf75af5e-3b9e-7aab-27e0-dfcc7240d64e.png)

## USBメモリに入れる方法

* MobaXterm.iniの以下を書き換える（例: USBメモリ直下にMobaXtermフォルダを作った場合）

```bash:
HomeDir=%CurrentDrive%:\MobaXterm\home
```

## 見慣れたMSゴシックに設定する

![msゴシック.png](https://qiita-image-store.s3.amazonaws.com/0/25728/069478d3-f092-0154-b645-3774a6351d99.png)

## パッケージ追加方法

* apt-cyg
* MobApt

### 追加してみる

```bash:
apt-cyg install autossh
```
Stashでsshを利用した接続を行う

[Attlassian社から提供されるStash](https://www.atlassian.com/ja/software/stash/overview) はgitで`SSH`を利用して接続する方法が設定可能です。
しかしながらその設定方法が微妙に分かりづらいので、SSH鍵の作成からStash上でのSSH公開鍵登録を行い、 `git clone` を行うまでの手順を記述します。

## ssh鍵の作成

`ssh-keygen` を実行してssh鍵を設定します。

```bash
localhost@root:.ssh $ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/root/.ssh/id_rsa.
Your public key has been saved in /Users/root/.ssh/id_rsa.pub.
The key fingerprint is:
c3:d5:3d:4c:1e:33:4c:57:26:1f:3e:c1:5f:04:a7:69 root@localhost
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|         . .     |
|          + . . .|
|         . . . = |
|        S   = E .|
|         . + B.o |
|          = + +oo|
|         . o . o=|
|               .o|
+-----------------+
```
結果`id_rsa`と'id_rsa.pub'が生成されます。
```bash

## StashでSSH接続を許可する。

`Settings`から`Server settings`を選択します。

![kobito.1374119656.956094.png](https://qiita-image-store.s3.amazonaws.com/0/11214/e87b4e44-eef2-32f4-8d8d-cc704a52ebf6.png "kobito.1374119656.956094.png")

`SSH access` が有効になっている事を確認します。

![kobito.1374119737.626081.png](https://qiita-image-store.s3.amazonaws.com/0/11214/4af15811-a201-4cee-16e7-a904eab01964.png "kobito.1374119737.626081.png")

## Stash上へSSH公開鍵の登録
右上の個人画像から `Manage account` を選択します。
![kobito.1374056672.678438.png](https://qiita-image-store.s3.amazonaws.com/0/11214/030c3513-5f12-9c78-4384-fe316298f1c2.png "kobito.1374056672.678438.png")

`SSH Keys` を選択します。
![capture 2013-07-17 19.30.15.png](https://qiita-image-store.s3.amazonaws.com/0/11214/b2a778bc-2a1e-1cc5-ecb5-059d3e03ee4a.png "capture 2013-07-17 19.30.15.png")

`id_rsa.pub` の内容をコピーしKeyとして貼付けます。
![capture 2013-07-17 19.31.46.png](https://qiita-image-store.s3.amazonaws.com/0/11214/8b11eca0-ab07-db63-9740-09ccaab6c197.png "capture 2013-07-17 19.31.46.png")

すると、リポジトリのcloneをする際に、 `SSH` と `HTTP` の指定を選べるようになります。

![kobito.1374119576.860093.png](https://qiita-image-store.s3.amazonaws.com/0/11214/09235de4-d22b-3812-1458-2168387c9b19.png "kobito.1374119576.860093.png")

以上です。

## 参考サイト

* [Using SSH for Git operations](https://confluence.atlassian.com/display/STASH/Using+SSH+for+Git+operations)
StashでPullRequestのメッセージをカスタマイズする

[Attlassian社から提供されるStash](https://www.atlassian.com/ja/software/stash/overview) で `Pull Request` を受け入れた場合、強制的に

> Merge branch 'master' into …

というメッセージが表示されます。
このメッセージは `Stash2.5.2`においてはメッセージを変更する事は出来ません。
但し、このメッセージ自体はローカルであれば `--no-commit` を利用して変更する事が可能です。またローカルで操作する事で、 `PullRequest`のステータスもcloseされます。

ここでは、その手順について書きます。

1.まずブランチを切ります。

```bash
root:sandbox (master) $ git checkout -b work01
Switched to a new branch 'work01'
```

2.適当に編集します。

```bash
root:sandbox (work01) $ vim README.md
```

3.コミットします。

```bash
root:sandbox (work01) $ git commit -am "add helloworld"
[work01 ad1eb88] add helloworld
 1 file changed, 1 insertion(+)
```

4.pushします。

```bash
root:sandbox (work01) $ git push origin work01:work01
Counting objects: 5, done.
Writing objects: 100% (3/3), 248 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://git@localhost:7999/san/sandbox.git
 * [new branch]      work01 -> work01
```

5.StashからPushしたブランチを`PullRequest`します。

![kobito.1374113507.595320.png](https://qiita-image-store.s3.amazonaws.com/0/11214/901c9d05-ee63-4663-88c4-0cc0ceda5c2f.png "kobito.1374113507.595320.png")

6.`Stash`でPullRequestが来ますが、ここではレビューのみ行い実際にMergeまでは行いません。

![kobito.1374113832.461406.png](https://qiita-image-store.s3.amazonaws.com/0/11214/d30033b2-1956-3686-a92e-4129e11fde17.png "kobito.1374113832.461406.png")

7.ここからはローカルで作業します。共有リポジトリの最新を取得します。

```bash
root:sandbox (master) $ git fetch
root:sandbox (master) $ git pull origin master
From ssh://localhost:7999/san/sandbox
 * branch            master     -> FETCH_HEAD
```

8.ローカルで`work01`をマージします。

```bash
root:sandbox (master) $ git merge --no-ff --no-commit work01
Automatic merge went well; stopped before committing as requested
root:sandbox (master|MERGING) $ git commit
[master e09d767] 任意のコミット内容を記述
```

9.mergeが問題なければ共用リポジトリにpushします。

```bash
root:sandbox (master) $ git push origin master
Counting objects: 1, done.
Writing objects: 100% (1/1), 254 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To ssh://git@localhost:7999/san/sandbox.git
   834716f..e09d767  master -> master
```

10.`Stash`から結果を確認します。`work01`のPullRequestがマージされた事が分かります。
![kobito.1374114206.673473.png](https://qiita-image-store.s3.amazonaws.com/0/11214/5af73fa4-d470-352d-ebc5-6dfc01786a53.png "kobito.1374114206.673473.png")

## 結論
Stash上はhashが変わっていなければPullRequestをマージしたと認識してくれるようです。

以上です。
cron等でたまったメールをlogっぽくするワンライナー

ちゃんと管理していないサーバだと、cronのログなんかがメールとしてたまっていたりします。これをお手軽にlogっぽく見るワンライナーです。

```bash:extract_log_from_mail
perl -0777 -pe 's/From[^:].+?Date:\s*([^\n]+).*?\n\n/=== $1 ===\n/gs' /var/spool/mail/root
```

実行するとこんな感じになります

```text:execute_sample
=== Thu, 18 Jul 2013 12:31:00 +0900 (JST) ===
+ df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/vda               64G   28G   33G  47% /
tmpfs                1004M     0 1004M   0% /dev/shm

=== Thu, 18 Jul 2013 12:31:00 +0900 (JST) ===
+ ls /
bin
boot
data
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
sbin
selinux
srv
sys
tmp
usr
var

```
アンドロイドアプリのスプラッシュ画面の実装例

アプリを起動したら最初にロゴなどが少しの間だけ表示（スプラッシュ画面（Splash））されて画面が切り替わることがありますが、そのandroid版の実装例です。

```java:SplashActivity.java
package com.andeight.splash.activity
 
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
 
import com.andeight.splash.R;
 
public class SplashActivity extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.splash_layout);
		Handler handler = new Handler();
		handler.postDelayed(new Runnable() {
			@Override
			public void run() {
				Intent intent = new Intent(SplashActivity.this, MainActivity.class);
				startActivity(intent);
				finish();
			}
		}, 2000);
	}
}
```

```xml:splash_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@android:color/white"
    android:gravity="center"
    android:orientation="vertical" >
 
    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/company_logo" />
 
</LinearLayout>
```
ルート権限ファイル (440等）のファイルの編集方法

```bash:case-1
sudo vi /etc/sudoers
# 保存 :w!
# 保存して終了 :wq!
# 保存せずに終了: q!
```

```bash:case-2
sudoedit /etc/sudoers
# 保存 :w
# 保存して終了 :wq
# 保存せずに終了: q!
```

```bash:case-3
sudo visudo -f sudoers
# 保存 :w
# 保存して終了 :wq
# 保存せずに終了: q!
```

sudoedit を利用したほうが多少楽になる。

visudo 長い・・
処理的には同一のようだがコマンド長さをみてみる。

1. **sudoedit /etc/sudoers**
1. **sudo visudo -f sudoers**
1. **sudo vi /etc/sudoers**

visudo ながいよーｗ
Debian使い用のコマンドでそれ以外は sudo vi と同一だそうでふ
[Monit] 初歩的なコンフィグサンプル

/etc/monit.d/ にコンフィグを作ります。

```text:httpdの監視サンプル
check process httpd with pidfile /var/run/httpd.pid
      start program = "/etc/init.d/httpd start"
      stop program = "/etc/init.d/httpd stop"
      if failed port 80 then alert
      if failed port 80 then restart
```

```text:tomcatの監視サンプル
check process tomcat with pidfile /var/run/tomcat.pid
      start program = "/etc/init.d/tomcat start"
      stop program = "/etc/init.d/tomcat stop"
      if failed port 8005 then restart
      if cpu > 70% for 5 cycles then alert
      if mem > 70% for 5 cycles then alert
```
kobitoちゃん最高

 画像アップロード/スクリーンショットのアップロード機能がkobitoについてるの知らなかった
`Edit -> Upload Image… / Upload Screenshot…`

アイテムの編集ウィンドウを開いてないと起動しないみたい

![kobito.1374115329.270187.png](https://qiita-image-store.s3.amazonaws.com/0/400/7e427221-0478-56b3-797e-b4c4b58b17ae.png "kobito.1374115329.270187.png")

すげー便利！と思って調子に乗って撮りまくってたらmonthly limitに引っかかった…

![Failed to upload kobito.1374115474.383715.png: The image size exceeds the upper limit of total size of uploaded images this month]()

これ、AWSじゃなくて、自分のdropboxとかサーバとか指定できるといいなあ。まあそもそも公開するんだからgyazoで済むといえばそうなんだけど…

あと、AWSに上がった画像のアクセス権限ってどうなってるんだろう。外に出すとまずい画像とかこれでポンポン撮っちゃってエントリ自体はkobitoでローカルに保存してるしQiitaには上げてない/Privateだから…っつって画像丸見えでしたとかだと色々つらい。まあURL分からなければ大丈夫そうだけど。機密文書の管理はGoogle Groupsでやれという話か。

そういえばエロ画像の収集とかkobito/Qiitaでやってもいいのかな？いや、冗談だけど、本気でやるとすごい便利そうな気もする。検索も強力だし。

あとやっぱりエントリに手動でいちいちタグ付けるの面倒くさいのでコードスニペットとかから勝手にタグ付けてくれる機能あったら最高だと思う、情報整理におけるbottom-upな手法であるタグ管理の最大の弱点はタグ付けの正確性と網羅性にある云々とかなのでサブジェクトが限定されてるこのテのアプリケーションでは単純なマイニングでの自動化やってもそんなに弊害はなさそう
SiestaでExt.Msg.alertのボタンをタップ

SiestaでSencha Touch用のアプリのテストを書いててハマったのでメモ。
色々と試行錯誤した結果、下記で動いた。

```js:
t.chain(
    {
        action: 'waitFor',
        target: function () {
            return t.Ext().Viewport.query('button[itemId=ok]')[0].getContentEl();
        }
    },
    {
        tap: '>> button[itemId=ok]'
    },
    {
        action: 'waitFor',
        target: function () {
            return t.Ext().Viewport.query('button[itemId=ok]')[0].getContentEl();
        }
    }
);
```

１つ目のwaitForでt.Ext().Viewport.query('button[itemId=ok]')を指定しても、tapさせると要素がいないって言われることがあったので、getContentEl()で要素を待つことにしてみた。

画面上にbutton[itemId=ok]な人がひとつしか無いからこれで動いてるけど、ちょっと気持ち悪い。。。
CoffeeScriptで定義したクラスを外部から呼び出す

```coffeescript:
class Hoge
  constructor: () ->
    console.log "hello"
```

のように宣言したものをviewなどのJavaScriptから

```js:
new Hoge();
```

などと呼びだそうとするとそんなもんねーよと言われてしまいます。

それもそのはず、冒頭のCoffeeScriptはファイルとして

```js:
(function() {
  Hoge = (function() {
    function Hoge() {
      console.log("hello");
    }
    return Hoge;
  }();
}).call(this);
```

のように (function() {...}).call(this);で括られててしまうから外からアクセスできません。
外から呼び出すにはclass名の前に@を入れて

```coffeescript:
class @Hoge
  constructor: () ->
    console.log "hello"
```

と書けば

```js:
(function() {
  this.Hoge = (function() {
    function Hoge() {
      console.log("hello");
    }
    return Hoge;
  })();
}).call(this);
```

になるのでview側などから

```js:
new Hoge();
```

できるようになります。
Windowsで、Padrinoのpluginがインストール出来ないとき

 WindowsでPadrinoのpluginをインストールしようとすると、
couldn't findとエラーが出てインストール出来ない。
`bundle exec padrino g plugin -l`で一覧はでるのに。

これは、どうもSSL関係が悪さをしているみたい。
なので、[https://gist.github.com/fnichol/867550](https://gist.github.com/fnichol/867550)にある解決方法を
利用させていただく。

やり方はリンク先にあるけども、一応。

----

リンク先にあるファイルは本来RailsInstaller用で、`C:\RailsInstaller`がないとエラーが出るので、
最初に`mkdir c:\RailsInstaller`をコマンドプロンプトで実行。

次に、[rubyスクリプトファイル](https://gist.github.com/raw/867550/win_fetch_cacerts.rb)をダウンロードする。

コマンドプロンプトで、`ruby <ダウンロードしたディレクトリ>\win_fetch_cacerts.rb`を実行

`c:\RailsInstaller`ディレクトリにcacert.pemファイルができているので、あとは
`set SSL_CERT_FILE=C:\RailsInstaller\cacert.pem`とやるか、今後も使うなら
コントロールパネル→システム→詳細設定→環境変数にも設定する。

あとは、通常通り、`bundle exec padrino g plugin <plugin名>`でインストール出来る。
サーバー構築入門: ユーザーをたくさん作る際に知っておきたかったこと

/etc/skel というホームディレクトリのひな形となるディレクトリがあるらしい。。。知らなんだorz
だからここに authorized_keysや.zsh_rc やらを予め作っておけば、
ユーザーを増やす際の面倒くささがだいぶ軽減するはず(人´∀｀)．☆．。．:*･ﾟ

```
$ cd /etc/skel
$ sudo mkdir -m 700 .ssh
$ sudo touch .ssh/authorized_keys
$ sudo chmod 600 .ssh/authorized_keys
```

skelってskeltonの意味なんだろなぁ( ･_･)r

/etc/skel is template directory for making new user home directory
for example, authorised_keys, .zshrc, more useful if you set these files in /etc/skel
Rails4.0における変更点

#その一 mass assignmentを防止する新しい方法が追加された
<strong>strong parameters</strong>という方法。従来はモデルでattr_accessibleで指定した属性のみを通すのみだったが
Rails4からコントローラーにフィルターを書けれるようになった。
下記イメージ図

```rb:
def new
  @user = User.new
end

def edit
  @user = find(params[:id])
end

def create
  @user = User.new user_params #<-ここで指定
  @user.save
end

def update
  @user = User.find(params[:id])
  @user.update_attributes user_params #<-ここで指定
end


private
  def user_params
    params.require(:customer).permit(
      :title,#(下記は属性)
      :article
      :number,
      :name,
      :address
  end
```
EclipseFPのインストール方法@MountainLion


Macだと大ハマリしたので記録しておきます。
いくつかcabalにてインストールしなければならないものがあります。

- 必須

    - buildwrapper
    - scion-browser
    - hoogle

- 選択制

    - cabal-dev
    - hlint
    - SourceGraph
    - Alex
    - Happy
    - UUAGC
    - Snap
    - Yesod
    - stylish-haskell

### EclipseFPのインストール

Help > Install New Softwareにて
以下のURLを追加してEclipseFPをインストールすればOKです。

http://eclipsefp.sf.net/updates


### PATHについて

上記だけでインストールが完了したかとおもいきや、適当にHaskellのプロジェクトを作成すると

```
The program ghc version >=6.4 is required but it could not be found
```

というエラーがでます。


同様の問題に遭遇している方の記事を参考にして対処します。

[http://ratememo.blog17.fc2.com/blog-entry-1043.html](http://ratememo.blog17.fc2.com/blog-entry-1043.html)

これは、Cocoaのアプリだと.zshrcとか読んだりしないのでPATHの設定ができていないため
Eclipseがghcを認識してくれず問題が発生しているようです。

Mountain Lion以降ではeviroment.plistを見ないため/etc/launchd.confにPATHを記述します。
[http://qiita.com/jjzak/items/bb6a03538d4ee773c9b6](http://qiita.com/jjzak/items/bb6a03538d4ee773c9b6)
クロスサイトリクエストフォージェリ（CSRF）

利用者の意図しない操作を実行してしまう脆弱性。
掲示板に意図しない書き込みをさせられたり、オンラインショップで（勝手に）買い物させられたりする。
また、利用者の認証情報が、攻撃者の指定する情報に変更される。等も考えられる。

開発者側で対策を講じる必要があり、具体的には、
フォームの一部にランダムな数値を隠しておいてアクセスの一貫性をチェックする
コンピュータが読み取れないよう画像として表示したチェックコードの入力をユーザに要求する
重要な処理を行う前にはパスワードの再確認を要求する

といったものが挙げられる。
cocos2dで音楽を聞きながらゲームをプレイ可能にする

#cocos2dで音楽を聞きながらゲームをプレイ可能にする

cocos2dを使ってiPhoneゲーム開発することに関してのメモ。

僕はゲームしながら別のアプリで音楽流したい派なんですが、自分で作っているアプリでも別の音楽流したくて対応しました。

AppDelegate.mの中の以下のapplicationメソッド内に以下の記述をします。

```objc:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   /*
   省略
   */
    //音楽再生中の場合、アプリの音楽を再生しない
    [[CDAudioManager sharedManager] setResignBehavior: kAMRBStopPlay  autoHandle:YES];
    
	return YES;
}
```

これで、音楽流しながらゲームを起動すると、ゲームBGMは再生されず、音楽を流しながらプレイ出来ます。
また、音楽再生を止めた場合、ゲームアプリをアクティブにした後、BGMを再生するメソッドを呼んだ時からゲームのBGM再生が再開されます。


ただしこれ、WebViewで音楽再生しているアプリと組み合わせると
**一度ゲームのBGMが止まると、アプリを再起動しても音楽がながれないみたいです…。**
iPhoneを再起動すると大丈夫みたいです。
（iosの「ミュージック」ならiPhone再起動無しで大丈夫です。）


##注意点
前提としてCDAudioManagerクラス内に

```objc:
configuredMode = kAMM_FxPlusMusicIfNoOtherAudio;
```

という記述があることが前提みたいです。
cocos2dで、反時計周りにスプライトを回転させたかった時に試したこと

```objc:rotate.m
CCSprite *rotete_object = [CCSprite initWithFile:@"hadaka_oyaji.png"];

CCRotateBy *rotateby_clockwise = [CCRotateBy actionWithDuration:0.1 angle:180];
[rotate_object runAction: [CCRepeatForever actionWithAction:rotateby_clockwise]];
//これだと、時計回りに永遠に回転し続ける。

CCRotateBy *rotateby_rev_clockwise = [CCRotateBy actionWithDuration:0.1 angle:-180];
//マイナス、を付けている
[rotate_object runAction: [CCRepeatForever actionWithAction:rotateby_rev_clockwise]];
//反時計周りに回転し続ける。

/* 試してみてダメだった別例 */

CCRotateTo *rotateto_failire = [CCRotateTo actionWithDuration:0.1 angle:360];
[rotate_object runAction: [CCRepeatForever actionWithAction:rotateto_failure]];

/* 
RotateToは回転を最短距離で行おうとするため、360度回転させようとすると最短距離が
現在角度になってしまうためうんともすんとも言わなかった。
*/
プロセス監視ツール Monit インストール

Monit http://mmonit.com/monit/
---
#### tarballをダウンロード

```bash:コマンド
tar zxvf monit-5.5.1.tar.gz
cd monit-5.5.1
./configure \
  --prefix=/usr \
  --sysconfdir=/etc \
  --localstatedir=/var \
  --mandir=/usr/share/man \
  --enable-optimized \
  --enable-profiling
cp monitrc /etc/monitrc
cp contrib/rc.monit /etc/init.d/monit
chmod a+x /etc/init.d/monit

/etc/init.d/monit start
```
ストアドプロシージャ

データベースに関する処理をまとめてデータベース管理システムに保管したもの。
引数を渡せば実行できるので、SQL文を一つずつ送るよりもトラフィックが軽減できる。
あらかじめよく使うSQL文を予約しておく感じ？（違うかも）
Passengerでプロセスを個別にkillする

 * Passengerプロセスを下記のようにSIGUSR1でkillするとgracefulに停止するみたいなので実験して確認した
  * 参照：[The Road to Passenger 3: Technology Preview 2 – Stability, robustness, availability, self-healing – Phusion Corporate Blog](http://blog.phusion.nl/2010/06/18/the-road-to-passenger-3-technology-preview-2-stability-robustness-availability-self-healing/)(公式ドキュメントで記述があまり見つけられなかった)
 * passenger-statusコマンドなどでプロセスのメモリ監視して自前でkillする仕組みを作れるかも
  * しかし、連続アクセスで500エラーが発生するらしい([Passengerを再起動させると500エラー - Qiita](http://qiita.com/ionis_h/items/5b80898d4b33acfae666))
 * 数値式のkill (kill -10 PIDなど)はOSによって意味がことなるので止めた方が良い

```bash:
$ kill -SIGUSR1 PID
```

## 実験環境

 * Amazon Linux 2013.03
 * httpd-2.2.25-1.0
 * rvm 1.21.6
 * ruby 1.9.3p448
 * rails 3.2.13
 * passenger 4.0.2

## 実験

 * 以下のような処理をするcontrollerを持つ適当なrailsアプリを準備

```rb:
def test
  sleep 30
  render :text => "hogehoge"
end
```

 * Apacheとpassengerを設定(passengerの設定としては以下のようにした)

```apache:
PassengerMaxPoolSize 2
PassengerMinInstances 2
```

 * Webで作成したcontrollerへのパスにアクセスする
 * 処理している間にpassenger-statusコマンドでPIDを確認し以下のようにkill(2プロセスとも)

```bash:
$ kill -SIGUSR1 PID
```

 * 結果
  * => Webでhogehogeが返ることを確認
  * => passenger-statusでプロセスが2つとも入れ替わることを確認
  * => kill -SIGTERMすると途中でInternal Server Error発生
ag の検索で除外設定を使う

ag こと [The Silver Searcher](https://github.com/ggreer/the_silver_searcher)、検索が早くてとても便利ですよね。
(ag は 銀の元素記号が由来らしいですよ)

なぜか巷では今になって `ack` が話題になっているようですが、やっぱり `ag` だよね `ag`！

詳しい使い方は以下あたりを見て下さい。

- [ackを捨てて、より高速なag(The Silver Searcher)に切り替えた - Glide Note - グライドノート](http://blog.glidenote.com/blog/2013/02/28/the-silver-searcher-better-than-ack/)

## 除外対象を ~/.agignore に設定しよう

デフォルトだと探して欲しくないファイルやディレクトリの中まで対象になってしまうので、困るときも多いかと思います。
(`.gitignore` 等も見てくれたりするけど、それだけじゃ足りないですよね)

そこで、検索してほしくない対象を `~/.agignore` に書いておくことで、それらを除外して検索することができます。

これを設定するだけで、かなり使い勝手がよくなるのでおすすめです。

一時的に除外したい場合は、`--ignore [PATTERN]` や `--ignore-dir [PATTERN]` を使うと良いでしょう。
これらをよく使うようなら `alias` を作るという手もあります。

## My settings

以下が私の設定している `.agignore` です。

```:~/.agignore
*~
*.swp
*.bak
*.old
tmp
old
.vim/bundle
.vim/dict
.git
.svn
zsh-completions
lib
libs
jquery-*.js
bootstrap*.css
bootstrap*.js
jquery.js
node_modules
*.egg
*.egg-info
```

ちなみに以下のような `alias` も設定しています。

```bash
alias ag='ag -S --stats --pager "less -F"'
alias agh='ag --hidden'
```

`-S` は Smart Case による検索になるのでおすすめです。
(検索ワードが小文字だけの場合は大文字/小文字を無視して検索し、大文字が入っていれば大文字/小文字を無視しないで検索します)

他におすすめの除外対象などあれば、教えてください。
クォータニオン（四元数）のメモ

#Quaternionの掛け算の公式
A = (a; U) 
B = (b; V) 
AB = (ab - U・V; aV + bU + U×V)
※「・」は内積、「×」は外積、U, Vはともに**ベクトル**。
　「;」の左が実部、右が虚部。
※ただし、計算しやすいよう本来はVxUとなるところを、UxVとしている点に注意。



#Quaternionの中の数値

```math
\begin{equation}
q =
\begin{vmatrix}
\cos\left(\frac{\theta}{2}\right) &\sin\left(\frac{\theta}{2}\right)n \\
\end{vmatrix}
\end{equation}
\\

=
\begin{vmatrix}
\cos\left(\frac{\theta}{2}\right) &(\sin\left(\frac{\theta}{2}\right)nx &\sin\left(\frac{\theta}{2}\right)ny &\sin\left(\frac{\theta}{2}\right)nz ) \\
\end{vmatrix}
```

*※nはベクトル。 下はベクトル成分を分解して表記。*

##Quaternionを生成する関数の例

```javascript
function makeQuaternion(radian, vector) {
    var ret = new Quaternion(),
        ccc = 0,
        sss = 0,
        axis = new Vector3(vector.toArray()),
        norm = vector.norm();

    if (norm <= 0.0) {
        return ret;
    }

    axis.normalize();

    //cos(θ/2)
    ccc = cos(0.5 * radian);

    //sin(θ/2)
    sss = sin(0.5 * radian);

    var t = ccc; //実部
    axis.multiplyScalar(sss); //虚部

    //計算した値をQuaternionにセット
    ret.set(t, axis);

    return ret;
}
```
serializeArrayをname:valueのオブジェクトに変換

```js:
    /**
     * $formのデータをkey:valueで取得
     * @param {jQuery} $form
     * @return {Object} {name: "value", ...}
     */
    getValues: function($form) {
      return _.chain($form.serializeArray())
              .map(function(obj) { return [obj.name, obj.value] })
              .object()
              .value();
    }
```
ActiveRecordで特定のフィールドをJSON responseから除外する

modelで`as_json()`をオーバーライドする。

```rb:
class User < ActiveRecord::Base
  # ...

  def as_json(opts = {})
    opts[:except] ||= [
      :encrypted_password,
      :gcm_registration_id,
    ]
    super(opts)
  end

```

これで controller で何も考えずに `render json: user` とかしていい。
Emacs で Web アプリつくろうぜ！

某社で[新卒3年目までを対象にエンジニアを競わせるイベント][Hack Competition]があるそうなので、久しく作ってない動的なウェブサイト作成のリハビリをしたいなーと色々ウェブアプリケーションフレームワークを探してるところです。

その過程で、以前から気になっていた [elnode][] をちょっと試して見ました。途中でグングンモチベーションが下がって、Hello World で終わってます。

[Hack Competition]: http://ameblo.jp/cair/entry-11574576918.html "「Rookie Engineer HACK Competition 2013」｜広報＆IR担当のオフィシャルブログ"
[elnode]: https://github.com/nicferrier/elnode

準備
-------

emacs 24 で以下のどちらかで `elnode` をインストール:

1. `M-x list-package` → `elnode` インストール
2. `M-x package-install<RET>elnode` （最近 `list-package` を実行した場合に限る）

動かしてみる
--------------------

簡単なアプリの作成 (`app.el`):

```el:app.el
(package-initialize)

;; デフォルトで起動するサーバを無効化
(setq elnode-init-port nil)

;; ポート番号
(defvar myapp-port 8000)

(defun myapp-helloworld-handler (httpcon)
  (elnode-http-start httpcon 200 '("Content-Type" . "text/html"))
  (let* ((host (elnode-http-header httpcon "Host"))
         (title (format "This is %s" host)))
    (elnode-http-return httpcon
                        (format
                         "<h1>%s</h1><p>Hello, world!! %s" title title))))

(elnode-start 'myapp-helloworld-handler :port myapp-port)

(message (format "access localhost:%d" myapp-port))
```

端末から elnode を立ち上げる:

```sh:端末
emacs -q -l app.el
```

これで完了。ブラウザで <http://localhost:8000/> にアクセスすると Hallo world が見られる。

停止は、`M-x elnode-stop<RET>8000`。emacs が立ち上がってる端末で `C-c`、emacs 上で `C-xC-c` でもよさそう。

[サンプル][examples] を見るとウェブアプリに大切な `Hosts` ヘッダやパスを使ったルーティングしてくれるハンドラーや、静的なHTMLを配信するためのハンドラーなどがはじめから入っている様子。

[examples]: https://github.com/nicferrier/elnode/tree/master/examples

雑感
-----

* 「今開いてるファイルを起点に HTTP サーバ立てて、ブラウザからHTMLで書かれたドキュメント見る」って使い方使えそう。
* ウェブアプリとしては。。。「あえて選択するほどの理由が見つからない」って事がくらいしか、選択する理由がないかなぁという感じ。
hbstudy 47

====================

serverspec
------------------------------------

何をするツール？
------------------------------------
サーバの設定をテストするツール


設定をテストするにはどうするの？
-------------------------------------
ソフトのテストになぞらえると

* 構文チェック
* ユニットテスト
	* chefspec
	* rspec-check
* 結合テスト←今回はここ
	* minitest cheaf handler
	* cucumber chef
	* serverspec ← New！！

serverspec
---------------------------------------
* 既存ツールは機能が多すぎる＝複雑
* 他のツールに依存したくない(puppet,chef)

なんでテストが必要？
--------------------------------------
* 一度書いたら設定変更しない？いやする
	* 変更が入るなら、テストしなきゃ！
* 設定のリファクタリング
	* 継続的にやるには自動化！
* テストコードの読みやすさ
* テストツールはシンプルであるべき

serverspecってなにさ
----------------------------------------------
* サーバのテストを「簡潔」に書くための仕組み
* 書式はrspec
* テスト対象のサーバがリモートの場合はssh経由でコマンド実行
* 概念は「スマートにかけるシェルテスト」

serverspecのはじめかた
------------------------------------

```Bash:
gem install serverspec rake
serverspec-init
rake spec
```
簡単
* sshconfigの設定をちゃんと読んでくれる
* 意図的にユーザを指定するときは、helperのソースで指定しましょう
* .rspec に color を書いておこう
* 設定ファイルの中身も(ある程度)チェックできるよ

serverspecが生まれた経緯
------------------------------------
1.puppet使って設定してみた
2.テスト報告書はExcelにあるコマンドをひたすら手実行
3.めんどう。assurerを使ってみたけど、これもめんどう
4.puppetマニフェストのリファクタリング（モジュール化）の必要に迫られた
5.既存のツールは、モジュールがないと出来ない
6.じゃぁ、puppet走らせた後の状態を確認するのがいいんじゃない？
7.作っちゃった

プログラム内部のお話
-------------------------------------
* コールスタック例[type/file.rb → backend/exec.rb → commands/redhat.rb]
* フォーク→ブランチ→コード書いてプッシュ→プルリクエスト
* 途中で、方針、やり方の確認をしたいときは、[WIP]を付けましょう。

tips
--------------------------------------
* テスト対象のサーバを増やすときは「spec」以下にサーバ名のフォルダを掘る
* ukigumoとか、簡単でいいよね
zsh & tmuxで、sshした際にステータスラインに警告文的なのを表示したかった

tmux 上のzshから、特定ホストにsshしている際に、tmuxのステータスラインに警告文を出したかった。
例えば本番サーバいじってる際は、その旨警告をしたい。

とりあえず.zshrcに以下の記述を追加して、ssh実行時と終了時にtmuxのウインドウ名フォーマットを変更してみる。
特定ホストログイン時のみ警告したい場合は、sshでgrepしている辺りを適宜書き換える。

```zsh:
preexec()
{
  echo "$1" | grep "ssh"
  if [ "$TMUX" -a "$?" -eq 0 ]
  then
    tmux set-window-option -a window-status-format "#[fg=red](Prod!)" > /dev/null
    tmux set-window-option -a window-status-current-format "#[fg=red](Prod!)" > /dev/null
  fi
}

precmd()
{
  history -1 | sed "s/^\s[0-9]*\s*//" | grep "ssh"
  if [ "$TMUX" -a "$?" -eq 0 ]
  then
    tmux set-window-option -u window-status-format > /dev/null
    tmux set-window-option -u window-status-current-format > /dev/null
  fi
}

```
上記の例で、ウインドウ1でssh実行時に、以下のようになる。

![Screenshot_from_2013-07-17 23:58:45.png](https://qiita-image-store.s3.amazonaws.com/0/10888/3874fca4-6666-48c8-de1f-bfce571c82b6.png)

しかしこのやり方だと、例えば同一ウインドウ内の複数ペイン内でsshしたい場合などに対応できないので、後でなんとかしたい。

また、最近powerlineを導入しているのだが、その様な凝ったデザインのステータスラインにしている場合はそれとの兼ね合いをどうするか悩みどころ。

![Screenshot_from_2013-07-17 23:59:40.png](https://qiita-image-store.s3.amazonaws.com/0/10888/a3602f05-9df4-feac-0bed-f66fb9507218.png)
Engine Yard Cloud上のMySQLをローカルMacからGUIで管理する方法

**Sequel Pro**でEngine Yard Cloud上のMySQLにつなぐ方法です。

Engine Yard Cloudは標準でMySQLをサポートしています。
各インスタンスにSSHができるため、SSHを経由してMySQLにMacOSXからアクセスします。

```
Mac OSX  --(ssh)--> Engine Yard Cloud Instance --(mysql protocol)--> MySQL
```

## Sequel Proの紹介

SequelはフリーのMac OSXのGUIアプリケーションでMySQLの管理機能を持っています。
http://www.sequelpro.com/

手順
--------

## 1. sshでappサーバに入る

あとからsshのログイン情報が必要です。
sshで入る方法については以下を参照
https://support.cloud.engineyard.com/forums/21437346

## 2. databaseのパスワードを調べる

ssh接続先のインスタンスにて

```
$cat /data/#{app_name}/shared/config/database.yml 
```

```yaml:
staging:
  adapter:   mysql
  database:  'ey_sample'
  username:  'deploy'
  password:  '＊＊＊＊＊＊'
  host:      'ec2-xx-250-134-84.ap-northeast-1.compute.amazonaws.com'
  reconnect: true
```

## 3. Sequel Proに設定

上記で調べたデータベースへの設定と、インスタンスへのsshの設定を入力
接続を押します。
![](http://gyazo.com/5cfa50a0f220ef27755efe840272ad8c.png)


### 4. これでローカルのMacOSXから本番のMySQLがSequel Proで参照可能です

![スクリーンショット 2013-07-17 11.36.51 AM.png](https://qiita-image-store.s3.amazonaws.com/0/1232/a7438016-2a53-9499-7901-f7f2cd6cedc4.png)
KOKUYOの黒曜石のキーバインドを解析して各種プレゼンツールで利用する

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

発表者以上の存在感に定評がある[KOKUYOのプレゼン補助デバイス黒曜石](http://www.kokuyo-st.co.jp/stationery/fp/)、これ実は外付けキーボードです。

これが中々使いやすく、片手デバイス部門では[アスキースティックL5](http://www.amazon.co.jp/dp/B0001RBOM0)以来の殿堂(※独自調査による)入りとなりました。

標準で**PowerPoint**,  **KeyNote**などの標準的なOffice向けプレゼンツールに対応していますが、折角なので黒曜石のキーバインドを調査して他のツールでも使ってみたいと思います。

## 黒曜石のキーバインド

黒曜石の送信するキーボードイベント一覧です、イベントの取得には**KeyRemap4MacBook**を使いました。

|位置|ボタン名称|大きさ|アクション|押しやすさ|キーバインド|寸評|
|---|---|:---:|---|:---:|---|---|
|真ん中|NEXT|大|押して離す(2秒以内)|◎|PageDown<br />(離す時にKeyDown&Upイベント)|中央にあり、存在感はピカイチ。安定して押せる不動のエース。|
|真ん中|NEXT|大|2秒の長押し|◯|2秒後にF5<br />(押している間KeyDown、離してKeyUp)|PowerPointを遠隔スタートできる点はよいがそれだけ、一発屋っぽさは否めない。<br />F5が連射になってしまうためWEBブラウザ用のプレゼンツールとの相性は難あり。|
|右|BACK|小|押して離す|◯|PageUp<br />(離す時にKeyDown&Upイベント)|指先側のため大きさから受ける印象より押しやすい。直感的にプレゼンを巻き戻すことができ、NEXTボタンの女房役として十分な操作性を確保している。|
|左|BLACK OUT|小|押下|△|b<br />(押してKeyDown、離してKeyUp)|やや押しにくい位置にあるが、標準の暗転機能としてはあまり使わない。<br />このボタンのみ単純なKeyUp/Downイベントになる点には注意。|


## プレゼンツールとの連携

解析が済んだ所で最近良く見るJavaScriptで作られたプレゼンツールを対応させようと思った所、[deck.js](http://imakewebthings.com/deck.js/)なんかは標準でPageDownが次、PageUpも一つ前というキーバインドが割られており、そのまま使えてしまった。

他でも狙っているツールはあるので対応できたらコードで記事を書こう。。
system()の注意点


Perlのsystem()の引数についてのメモ。2005年5月14日に書き留めておいたもの。

Perlのsystem()は

- リストだと、そのまま execvp() に渡される
- スカラーだと、/bin/sh -c に渡される

こんな仕様になっている。でも、意外と知られていないらしい。system() に安易にスカラーを渡すとメタキャラクターが変に展開されてしまい、セキュリティホールになるので注意（…つまり私も昔やってしまったことがある）。

環境変数は@ENVを使えば取れる。ファイル名のワイルドカードを展開したい場合はFile::Globがあればたいていは事足りるはず。この手のことをするためにsystem()を使わないこと。

以下は例。

## リスト ##

```perl:list.pl 
system("ls","/etc/*");
```

```
h12o@exegesis:~$ perl list.pl 
ls: /etc/*: No such file or directory
h12o@exegesis:~$ 
```

## スカラー ##

```perl:scalar.pl
system("ls /etc/*");
```

```
h12o@exegesis:~$ perl scalar.pl 
/etc/AFP.conf
…

h12o@exegesis:~$ 
```
PHPKansai 2013/07/17



IN Yahoo

# Composer & packages

@Slywalker


## What is Composer

パッケージ同士の依存性を解消

覚えてる？ Pear

1. Pear:: 環境単位で、依存までは解決しない
	1. Namespace の対応はバラバラ 基本 include_path を通す
1. Composer:: Project 単位でパッケージ依存を解消
	1. Namespace に対応 autoload.php をrequireするだけ

## How to install ?

1. Composer をインストールする

```Install_composer
$ curl -sS https://getcomposer.org/installer | php
```

2. 設定を書く

```composer.json
{
	"require": {
		"monolog/monoglog":"1.2.*"
	}
}
```

3. インストール

```
$ php composer.phar install
```

4. vendor 以下に入る

メモ

1. リポジトリがアメリカの方にあるので、ちょっと遅いけど祭りのハッカソンで Proxy 作った人いるので、それ使うと速いらしい。
2. 一度インストールしたらキャッシュするので、割と速い。
3. phpunit が楽
4. vendor/bin/ にパッケージのコマンドが入る
5. http://getcomposer.org

## What is Packagist 

Composer が使ってるリポジトリ

https://packagist.org ←これ

https://packagist.org/packages/composer/installers

コレ使うと有名ドコロのフレームワークのプラグインやライブラリに対応することが出来る。

# 〜〜後は何か色々、PHP祭りとかVagrant とかそんなお話〜〜


がありまして、

お酒呑みながらのLTはいいですよね！〆
ファイルの時間とサイズを取得する

ファイル属性はNSFileManagerクラスを使えば簡単に取得できます。
参考でC言語のstat(2)を使う方法も載せておきます。詳細はstat(2)の[manpage](http://developer.apple.com/library/ios/#documentation/system/conceptual/manpages_iphoneos/man2/stat.2.html)を参照してください。

```objc:
NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource:@"first" ofType:@"png"];

// NSFileManagerを使ってファイルの属性を取得する
NSFileManager *fm = [NSFileManager defaultManager];
NSDictionary *attribute = [fm attributesOfItemAtPath:path error:nil];
NSDate *creationDate = [attribute objectForKey:NSFileCreationDate];
NSDate *modificationDate = [attribute objectForKey:NSFileModificationDate];
NSNumber *fileSize = [attribute objectForKey:NSFileSize];

// stat(2)を使ってファイルの属性を取得する
// #include <sys/stat.h>
// #include <time.h>
struct stat sb;
memset(&sb, 0x00, sizeof(struct stat));
stat(path.UTF8String, &sb);
struct tm ctime;
memcpy(&ctime, localtime(&sb.st_ctimespec.tv_sec), sizeof(struct tm));
struct tm mtime;
memcpy(&mtime, localtime(&sb.st_mtimespec.tv_sec), sizeof(struct tm));
off_t size = sb.st_size;
```
正規表現一覧 Ruby


#[ABC]
#####AまたはBまたはC
#[A-Z]
#####AからZまでのアルファベットの範囲
#[^A]
#####A以外の文字と一致
#.
#####任意の一文字とマッチ
#\S
#####空白文字を表す
#\d
#####0から9までの数字とマッチ
#\w
#####英数字とマッチ
#\A
#####文字列の先頭にマッチする
#\z
#####文字列の末尾にマッチする
#^
#####行頭の文字列とマッチング
#$
#####行末の文字列とマッチング
#*
#####0回以上の繰り返し　例 　/A*/ = "", /A*/ = "AAAAA"
#+
#####1回以上の繰り返し　例　/A+/ = "AAAAA"
#?
#####0回または1回の繰り返し　例　/A?/ = "AA", /A?/ = "A"
#*?
#####0回以上の繰り返しのうち最短の部分
#+?
#####1回以上の繰り返しのうち最短の部分
#(ABC)
#####複数の文字列の繰り返し　例　/(ABC)/ = "ABCABCABC"
#/(^ABC|DEF$)/
#####いくつかの候補の中からどれか1つに当てはまるものにマッチする　
例　#/(^ABC|DEF$)/ = "ABC"
Chef / vargrant



Chef / Vargrnat のメモ書き

## Vargrant

VirtualBoxをコンソールで動かす

see; http://d.hatena.ne.jp/naoya/20130205/1360062070

## ゲストOSにログイン

```shell
$ vagrant ssh
```


#### vagrant sandbox とか

これをインストール http://www.ryuzee.com/contents/blog/6555


```shell
# sandbox モードに入る
$ vagrant sandbox on

# sandbox モード on に入った時点まで巻き戻す!
$ vagrant sandbox rollback

# 変更を確定
$ vagrant sandbox commit
```

## Chef

```shell
$ gem install knife-solo
```

## Knife

Brew で入れた ruby に入れてもうたのでこれ叩く必要ある。

```shell
$ PATH="$PATH:/usr/local/Cellar/ruby/2.0.0-p0/bin"
$ rehash
```

``` shell
$ knife solo init chef-repo
$ cd chef-repo
$ knife solo prepare vagrant@10.0.2.15
```


おまじないその1

リモートでの chef-solo 実行環境を整える

```shell
$ knife solo prepare -p 2222 -x vagrant --identity-file ~/.vagrant.d/insecure_private_key 127.0.0.1
```

おまじないその2

サーバサイドで実行させる

```shell
$ knife solo cook  -p 2222 -x vagrant --identity-file ~/.vagrant.d/insecure_private_key 127.0.0.1
```

レシピ作成

```shell
$ knife cookbook create <レシピ名> -o site-cookbooks
```

```shell
$ knife download <package> -o cookbooks
```

インストールは、ホスト単位で変わる。ホストは ``` nodes ``` に ``` ホスト名.json ``` で保存されている。

内容はこんな感じ

```json
  1 // localhost.json
  2 {
  3     "nginx" : {
  4         "port": 80
  5     },
  6     "run_list":[
  7         "hello",
  8         "yum::epel",
  9         "base",
 10         "nginx"
 11     ]
 12 }```
Javascript 製のチャート描画ライブラリのメモ

Javascript 製のチャート描画ライブラリをいくつか調べたので備忘録として残しておく。

やりたいのは、ストリーミングで次々やってくるデータをリアルタイムに表示する事。しかも順方向だけじゃなくて過去方向にも戻りたい。

## smoothiecharts

http://smoothiecharts.org/

シンプルで、使うのも簡単。が、逆再生ができるのかよく分からなかったので保留。

## Cubism.js

http://square.github.io/cubism/

言わずと知れたビジュアライゼーションライブラリ [D3](http://d3js.org/) のプラグイン。
なんか見た目がクール。
あまり突っ込んで調べてないので、要件を満たすかは不明。
ちなみにモバイル決済の Square によるオープンソースプロジェクト。
D3 自体でもいろいろなチャート描画ができるが、なんか勝手に Fat なイメージを持ってる。

## Flot

http://www.flotcharts.org/

こちらは jQuery のプラグイン。

使い方が簡単で、配列を描画させてるだけだったので、配列操作で逆再生にも対応できそう。

## Google Chart

https://developers.google.com/chart

大御所。
なんか "Connect to your data in realtime" って謡ってるので、できそうな感じもするが試してない。これも高機能であるが故にレスポンス大丈夫かなあと勝手に思っている。
 

## amCharts

https://amcharts.zendesk.com/entries/22592917-Creating-charts-with-real-time-data

amCharts というプロダクトで、リアルタイムなチャートが実現できる模様。参考程度に。

## その他

やりたいことは株価チャートに近いのでそっち方面で探すとたくさんありそうだけど、株価に特化しちゃってて機能過多＆使いづらい感。

## 参考

タイムリーにも同じようなまとめをしてくださってる方が居たのでメモ

* [グラフ描画に良さげなJavaScriptライブラリ - Qiita](http://qiita.com/hurutoriya/items/727296839a2ec638fdc4)
同一カラムで複数結果をひとつにまとめる関数

GROUP_CONCAT関数が便利

select id from tableの結果が
2
3
4
の場合は、
SELECT GROUP_CONCAT( id SEPARATOR ',' ) from tableとすると
2,3,4
となる。

便利です。

http://dev.mysql.com/doc/refman/5.1/ja/group-by-functions.html
fsniper　インストール

fsniper install

http://tecadmin.net/fsniper-directory-monitor-setup-in-centos-linux/#

```
yum -y install pcre pcre-devel
```

```
$wget http://projects.l3ib.org/fsniper/files/fsniper-1.3.1.tar.gz 
$tar -zxmf fsniper-1.3.1.tar.gz
$cd /fsniper-1.3.1
$./configure 
$make
$su
#make install
# which fsniper
/usr/local/bin/fsniper
```

設定ファイル

```
$mkdir -p ~/.config/fsniper
$vi ~/.config/fsniper/config
watch {
    # watch the /var/www/upload directory for new files
    /watch/path {
        # matches all file with .pdf extension in /var/www/upload directory.
        *.sh {
            handler = cp /watch/path/%F  /watch/path/cache/
        }
    }
}
```

テスト

```
$cd /watch/path
$touch a.sh
$cd /cache/
$ ls
a.sh
```

コピーされている
成功

自動起動

```
#vi /etc/init.d/fsniper
```

```
#!/bin/sh

#chkconfig: 345 99 01
#description: Runs  fsniper

export HOME=/home/dev
case "$1" in
start) echo -n "Starting Fsniper: "
/usr/local/bin/fsniper --daemon
echo -e "... [ \e[00;32mOK\e[00m ]"
;;
stop)
echo -n "Shutdown Fsniper: "
kill -9 `ps aux | grep "fsniper --daemon" | grep -v grep | awk {'print $2'}`
echo -e "... [ \e[00;32mOK\e[00m ]"
;;
restart)
$0 stop
sleep 1
$0 start
;;
*) echo "Usage: `basename $0` start|stop|restart"
exit 1
esac

exit 0
```

```
#cmod 755 /etc/init.d/fsniper
# chkconfig --add fsniper
# chkconfig --list fsniper
fsniper         0:off   1:off   2:off   3:on    4:on    5:on    6:off
Java の CUIオンリーダウンロード

メモ

ダウンロード＋アップロードで時間がもったいないし（ｗ

### URL 確認

```bash
echo `wget http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html -O - -o /dev/null  | grep tar.gz |  grep demos -v | grep Linux | grep 86 | sed -e 's@.*filepath...@@ig' | sed -e '
s@...\$@@ig'`
```

```:結果
http://download.oracle.com/otn-pub/java/jdk/7u25-b15/jdk-7u25-linux-i586.tar.gz
```

### インストール
```bash
version=7
update=25
build=15
os=linux-x64

dlurl=http://download.oracle.com/otn-pub/java/jdk/${version}u${update}-b${build}/jdk-${version}u${update}-${os}.tar.gz

# java source dir
cd /usr/local/src/java

subdir=${version}u${update}-b${build}

# ソース取得
wget --no-cookies --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com" \
     --no-check-certificate \
     -O jdk-${version}u${update}-${os}.tar.gz \
     ${dlurl}

# 展開
tar -zxvf jdk-${version}u${update}-${os}.tar.gz

# アップデート
cp -pvr jdk1.${version}.0_${update}/ /usr/local/java/
rm -f /usr/local/java/jdk
ln -sf /usr/local/java/jdk1.${version}.0_${update}/ /usr/local/java/jdk

```

### 環境設定

``` bash
export JAVA_HOME=/usr/local/java/jdk
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar

```
NSUnknownKeyException this class is not key value coding-compliant for the keyでドハまりした


XIBからStoryboardへの移行中に、下記のようなエラーが発生

```
2013-07-17 15:43:32.181 Application Name[1647:907] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<ViewController 0x1d5cd2d0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key foobar.'
```

##原因
Storyboardに追加したオブジェクトと、.hファイルのオブジェクト名の接続を行った後に削除を行っても、Storyboardに残ってしまうため。

##対応
Storyboardファイルの上で右クリック > Open As > Source Code

```
<outlet property="foobar" destination="2f6-ES-Nq2" id="2s4-Gj-Z2l"/>
```
を削除
HTMLのアウトライン意識してますか？ - QiitaのSEO事情（前編）

「最近Qiitaを検索結果でよく見るようになったなぁ」と感じる人はいませんか？

SEOを頑張ってるWebサービスは数多存在しますが、Qiitaもその中の1つです。

SEOっていうとやれキーワードがどうだこうだ、サイト内リンクがどうだこうだ、という話になってしまいがちですが（そういうのが不要と言っているわけではないですよ）、今回はQiitaがSEOの一環として行なっている数多の取り組みの中で、比較的Web上での言及数の少ない印象のある、HTMLのマークアップについて、外に出せる範囲で、前編と後編に分けて解説したいと思います。

[後編はこちら](http://qiita.com/yuku_t/items/3740cc9a5f8503693bd2)

## 免責事項的な

SEOというのは完全に結果論でしか語ることのできないものです。また時と共に効果的とされるテクニックは変わっていきます。この記事はQiitaの中の人が「効果あるんちゃうか」と試行錯誤しながらあれこれ行なっていることの一部を紹介するものであって、その効果を保証するものではありません。「ふーんそんなことやってるんだ」程度の気分で読んでください。

# アウトラインとは何か

アウトラインは（大雑把に言えば）機械から見たあなたのページの構造です。

つまりアウトラインが美しいページは、検索エンジンにより正しく解釈してもらいやすい、と言えそうです。適切に解釈してもらえれば、より適切なユーザに提示してもらえるようになりますね。

もし、なんでもかんでも検索ページに載りさえすればいい、と考えているのだとしたら、恐らくそれは間違いです。少なくともGoogleはユーザが検索結果をクリックしてから検索ページへ戻ってくる時間を計測してるはずです。不適当な相手に表示さると、それがまわりまわって検索順位の低下という形で帰ってくる可能性があるわけです。

# 何はともあれアウトラインを確認してみる

- [HTML5 Outliner](http://gsnedders.html5.org/outliner/)

アウトラインを解析できるサイトです。HTML直接渡すだけでなく、URLを指定して解析させることもできます。

試しに気になるサイトのアウトラインを確認してみましょう。例えばナナピはアウトラインが綺麗です。

## アウトラインの決まり方 

解説しているサイトはたくさんあるので、適当にググってください。大雑把に言えば `section` や `h1` 要素が存在すると新しくアウトラインが作られます。

詳しい仕様は下記で読めます。

- [見出しとセクション - セクション - HTML要素 - HTML5 タグリファレンス - HTML5.JP](http://www.html5.jp/tag/elements/headings-and-sections.html#outlines)

# アウトラインが綺麗なHTMLを書くコツ

アウトラインを意識しようにもデザインの関係もあってなかなか綺麗にできないかも知れません。
そういう場合は先にアウトラインを決めてしまってから、デザイン用の `div` や `span` 要素を付け足していく、という手順を踏むといいです。

## まず最初に綺麗なアウトラインを作ってしまう

HTML5にしろ、それ以前にしろ、アウトラインに影響を与えるタグと与えないタグというのは明確です。なので、まず先にアウトラインに影響を与える要素だけを並べて、理想的なアウトラインを書いてみましょう。

例えばこんな感じに書いたとします。（便宜上 `body` タグとかは省略してます）

```html
<h1>サイト名</h1>
<section>
  <h1>タイトル</h1>
  <section>
    <h1>見出し</h1>
    <h2>見出し2</h2>
  </section>
</section>
<section>
  <h1>コメント</h1>
  <section>
    <!-- コメント -->
  </section>
</section>
<section>
  <h1>投稿者情報</h1>
</section>
```

できあがったHTMLのアウトラインを確認してみます。先ほどのサイトを開いて作ったHTMLをコピペして解析してみます。上記のHTMLの場合は次のように返されます

> 1. サイト名
>     1. タイトル
>         1. 見出し
>             2. 見出し2
>     2. コメント
>         1. *Untitled Section*
>     3. 投稿者情報


おかしいなと思う箇所があったら試行錯誤をして綺麗に整えましょう。もちろんこのあとのデザインのことも考えて、要素の順番を入れ替えるとかはしても良いと思います。

## schema.org

そうしたら次は（余裕があれば）schema.orgに従ったマークアップを行なっていきます。これも細々したデザインの調整を行う前にやってしまう方がいいと感じています。

schema.orgについて詳しくは次回の [schema.orgに準拠してクローラと会話しよう](http://qiita.com/yuku_t/items/3740cc9a5f8503693bd2) を参照してください。

## アウトラインに影響しないタグを書いていく

そうしたらコンテンツに肉をつけて行きましょう。ここから先で書いていくのは全てアウトラインに影響しない要素なので、先ほど作ったアウトラインは綺麗なまま保たれるはずです。

アウトラインが綺麗になっていると `section` タグなどにそのままCSSを当てれば、わざわざ `div` とかいれなくても大丈夫、という場合もあるかと思います。
しかし、そういう場合でも `section` にCSSを当てずに、それをラップする `div` を作ってそれにclassやidを振って、CSSのルールを書いた方がいいでしょう。

何故かというと、アウトラインに比べてデザインの方が寿命が短いからです。

`section` にCSSを書いていると、アウトラインと実際の見た目の結合度が高くなります。その結果として、ちょっとしたデザイン変更のときについでにアウトラインが崩れる、みたいなことが起こったりします。

# まとめ

- アウトラインは機械からどう見えるかを示すものです。検索エンジンに正しく理解してもらうためにも、余裕があるなら綺麗にしましょう。
- アウトラインは一番最初に整えましょう。

# QiitaのSEO事情

1. HTMLのアウトライン意識してますか？
2. [schema.orgに準拠してクローラと会話しよう](http://qiita.com/yuku_t/items/3740cc9a5f8503693bd2)
git cloneしたdotfilesを$HOMEに設置する君

git clone して $HOME/dotfiles/ ができると思いますが、これを$HOMEにリンク貼るの面倒ですよね。
そこで以下のスクリプトを用意しました。

```bash:set_dotfiles.sh
#!/bin/sh

BACKUPDIR=$HOME/backup/`date -I`/

for file in .*
do
    case $file in
    "."|".."|".git"|".gitignore"|".set_dotfiles.sh.swp")
        continue
        ;;
    esac

    if [ -e $HOME/$file ]; then
      if [ -L $HOME/$file ]; then
        echo "[skip] already $file exists."
        continue
      fi
      if [ ! -e $BACKUPDIR ]; then
        mkdir -p "$BACKUPDIR"
      fi
      echo "[info] $file exists."
      echo "[info] mv $HOME/$file $BACKUPDIR"
      mv $HOME/$file "$BACKUPDIR"
    fi

    echo "[info] ln -s `pwd`/$file $HOME/$file"
    ln -s `pwd`/$file $HOME/$file
done
```
python2.7.3のcsvモジュールを使う時の文字エンコード

日本語の値を含むcsvファイルをPythonのcsvモジュールを使って読み込みました
以下の条件での問題とその解決法です

* 読み込むcsvファイルの文字エンコード: UFT-8
* `sys.getdefaultencoding()`で得られる文字エンコード: ascii
* スクリプトの文字エンコード: UTF-8

まず普通に読み込みます
csvの形式は
`整数,文字列`の形としておきます

```py:
class data:
    
  def __init__(self, id, name):
    self.id = id
    self.name = name

import csv

csvfile = open(filename)
reader = csv.reader(csvfile)
rows = [data(row[0], row[1]) for row in reader]
```

これですべての行のデータを読み込めました
次に、 **任意の日本語文字列を名前に含むデータ** を抽出します

```py:
text = raw_input()
result = [row for row in rows if text in row.name]
```

ここで問題がおきます。`raw_input()`で得られる文字列は **unicode型** です
ところが`data.name`で得られるのはcsv.readerが読み取った **utf-8のstr型** なのです
当然比較はできませんので、 `if text in row.name`のところでエラーが発生します。

#### じゃあどうするか

解決方法は、

* すべてunicodeにする
* すべてUTF-8のstrにする

の２つが考えられると思いますが、何かと扱いやすいのはunicodeなので今回は前者にします。
この場合修正が必要なのは、

```py:
rows = [data(row[0], row[1]) for row in reader]
```

です。ここをこうします

```py:
rows = [data(row[0], row[1].decode('utf-8')) for row in reader]
```

`str#decode`は任意の文字エンコードで、str型をunicode型に変換します。今回は元がutf-8のstrなので、utf-8でデコードしてunicodeに変わりました。
元のcsvファイルの文字エンコードによってデコードは変える必要があります（当然ですね）

これでunicode同士で比較ができるようになりました。めでたしめでたし
Windowsでpythonいじってるとこういう文字エンコードの問題によくぶつかりますね。
pipでtweepyをインストールしてAPI1.1に対応させて使う

環境はWindows64bitのPython2.7.3です（まあ関係ないと思うけど）

### 1. pipのインストール

コマンドプロンプト（or ターミナル）で実行
`> easy_install pip`

### 2. tweepyのインストール

コマンドプロンプトで実行
`> pip install tweepy`
インストールしたらPythonインタプリタ（対話型）で
`> import tweepy`
して確認しましょう。

### 3.tweepyを使う
tweepyはpipでインストールできるバージョンはまだAPI1.0のものです。Githubなんかには1.1対応のものがとっくにありますが、pipは導入が楽なのでpipで済むならpipで済ませたいですよね！（git弱者）
スクリプトを書くにあたって、twitterのCK/CS、アクセストークンのデータはすでに取得済みとします。
tweepyでAPIを操作するためのインスタンスを作るのは以下のような流れです

```py:
import tweepy

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth_handler=auth, api_root='/1.1', secure=True)
```
tweepy.APIクラスのコンストラクタにapi_root属性で'/1.1'を入れてあげる事で基本的にはAPI1.1対応ができます。

```py:
api.update_status(raw_input())
```
みたいな感じで投稿ができます。

#### これだけでうまくいかないケース
API1.0から1.1に変わるときにエンドポイントの構造が変わったAPIがいくつかあります。
今回はツイートを削除する`destroy_status`関数を例に取ります
tweepy.APIクラスでは`destroy_status`関数は次のように宣言されてます

```py:
from tweepy.binder import bind_api

destroy_status = bind_api(
        		path = '/statuses/destroy.json',
        		method = 'DELETE',
        		payload_type = 'status',
        		allowed_param = ['id'],
        		require_auth = True
				)
```

bind_apiはtweepyがAPIを叩くときに使う関数をラッピングしたクラスです（多分）
API1.1で、statuses/destroyのエンドポイントは`/statuses/destroy/{id}.json`に変わっています。
今回は次のようにしてみました

```py:
import tweepy
from tweepy.binder import bind_api

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth_handler=auth, api_root='/1.1', secure=True)

destroy_status_1_1 = bind_api(
        		path = '/statuses/destroy/{id}.json',
        		method = 'POST',
        		payload_type = 'status',
        		allowed_param = ['id'],
        		require_auth = True
				)
destroy_status_1_1(api, raw_input()) #APIインスタンスとstatus_idを渡す
```

これでAPI1.1に対応したスクリプトが書けました。
Rubyの正規表現まわりで最近知ったことのメモ

## `URI.regexp`

URIの文字列にマッチする正規表現をサクッと取り出せる。

```rb:sample1.rb
require "uri"
"hoge http://udzura.jp fuga".scan URI.regexp
#=> [["http", nil, nil, "udzura.jp", nil, nil, nil, nil, nil]]
```

HTTPだけ、HTTP/HTTPSで、などの場合はそれぞれ `URI.regexp("http")`, `URI.regexp(["http", "https"])` とできる

これはURIライブラリが内部で使っている都合上スキーマやらホスト名やらが分解された形でマッチするので、ただURLっぽい文字列を取り出したい時は `URI.extract` が使える。

```rb:sample2.rb
data = File.read("data.txt")
URI.extract(data, ["http", "https"]).each do |uri|
  puts uri
end
```

## `Regexp.union`

正規表現で、表現Xまたは表現Yに合致するものを求めたい場合に、各表現すべてにマッチする正規表現を生成してくれる。 `|` で手動で繋げて再作成するより確実っぽい。

```rb:sample3.rb
re = Regexp.union(URI.regexp("http"), %r<(\[.+\]\(.+\))>)
"http://udzura.jp [hoge](fuga)".scan re
#=> [
   ["http", nil, nil, "udzura.jp", nil, nil, nil, nil, nil, nil],
   [nil, nil, nil, nil, nil, nil, nil, nil, nil, "[hoge](fuga)"]
 ]
```

* http://doc.ruby-lang.org/ja/2.0.0/class/Regexp.html#S_UNION

## 正規表現内部の `&&`

正規表現の文字クラス（ `[a-z]` だとか `\w` ）はご存知の方も多いだろうが、 `&&` を利用すると文字クラスの共通部分を表現できる。

a ~ g 以外の単語構成文字を表す文字クラスは `[\w&&[^a-g]]` のようになる。

```rb:sample4.rb
"a" =~ /[\w&&[^a-g]]/
#=> nil
"h" =~ /[\w&&[^a-g]]/
#=> 0
```

* http://doc.ruby-lang.org/ja/2.0.0/doc/spec=2fregexp.html#string
数値リストdataの要素中で、値がもっともtargetに近い要素のインデックスを得る

数値リストdataの要素中で、値がもっともtargetに近い要素のインデックスを得る。

```csharp:
var diff = data.Select((x, index) => { 
  var diffX = Math.Abs(x - target);
  return new { index, diffX }; 
});
var targetIndex = diff.OrderBy(d => d.diffX).First().index;
MuninでSSHログイン失敗数を記録してみた

[Munin](http://munin-monitoring.org/)を使うとサーバの色々な値（ディスク使用量、MySQLのスロークエリ数、HTTPアクセス数、CPU使用率などなど）をいい感じにグラフ化して表示してくれるのでサーバのリソース監視にとても便利と聞きました。

自分の管理しているさくらVPSのUbuntuサーバに入れて色々監視してみたのですが、なにかのウェブアプリを運用してるでもないため特に見応えがない。そこでそんな弱小サーバでもガンガンにアクセスが来るsshdのログイン失敗数を監視してみることにしました。
	
```
# 招かれざるお客様達
Jul 14 08:58:16 hogel sshd[16682]: Invalid user web from 218.53.55.189
Jul 14 08:58:17 hogel sshd[16686]: Invalid user nagios from 218.53.55.189
Jul 14 08:58:18 hogel sshd[16688]: Invalid user tomcat from 218.53.55.189
Jul 14 08:58:19 hogel sshd[16690]: Invalid user squid from 218.53.55.189
...
```

しかしどうやら既存のプラグインにはなかったので単純そうだったupstartプラグインなんかを参考に適当にSSHログイン失敗数を記録してみました。

```bash:ssh_invalid
#!/bin/sh
# -*- sh -*-
 
: << =cut
 
=head1 NAME
 
ssh_invalid - Plugin to measure invalid ssh user.
 
=head1 AUTHOR
 
Contributed by hogelog
 
=head1 LICENSE
 
GPLv2
 
=head1 MAGIC MARKERS
 
 #%# family=auto
 #%# capabilities=autoconf
 
=cut
 
. $MUNIN_LIBDIR/plugins/plugin.sh
 
if [ "$1" = "autoconf" ]; then
        echo yes
        exit 0
fi
if [ "$1" = "config" ]; then
 
        echo 'graph_title SSH Invalid User'
        echo 'graph_args --base 1000 -l 0 '
        echo 'graph_scale no'
        echo 'graph_vlabel invalid user in days'
        echo 'graph_category system'
        echo 'ssh_invalid.label invalid_user'
        echo 'ssh_invalid.draw AREA'
        print_warning ssh_invalid
        print_critical ssh_invalid
        exit 0
fi
 
SSH_LOG=${sshlog:-/var/log/auth.log}
MON=`LANG=C date '+%b'`
DAY=`date '+%d'`
TODAY=`printf "%s %2d" $MON $DAY`
COUNT=`grep "$TODAY" $SSH_LOG | grep "invalid user" | wc -l`
printf "ssh_invalid.value $COUNT\n"
```

ほとんどperldocで、処理内容はsshdログの「（ ＾ω＾）＜不正アクセスしにきたお」と語る以下の様なログの行数を数えているだけです。
`Jul 14 08:58:16 hogel sshd[16682]: Invalid user web from 218.53.55.189`
このプラグインをしばらく稼働させるとこんなグラフになりました。

![ssh_invalid.png](https://qiita-image-store.s3.amazonaws.com/0/1742/c5dce205-1eed-ac98-600c-5974e6e8b7ef.png "ssh_invalid.png")
日毎のログイン失敗数が可視化されます。0時直前にアクセスがあった場合に見えにくいという問題はありますが、上記したちょっとしたスクリプトを書くだけでこんなにサクッと可視化できるのはなかなか楽しいです。ちなみにこのサーバはアクセス数も少ないし[DenyHosts](http://denyhosts.sourceforge.net/)も稼働させていてこの数字なので、サーバによってはもっと激しいグラフになるのかもしれません。

おそらくサーバのリソース監視ツールとして有名なMuninですけど「なんでもグラフ化ツール」としてもなかなかおもしろそうですね。

一応以下のようにするとUbuntu 13.04のapt-getからインストールされたMunin 2でこのssh_invalidプラグインが動きます。それ以外の環境でもpluginsディレクトリにおいてゴニョゴニョ設定すればだいたい動くと思います。

```bash:
$ curl https://gist.github.com/hogelog/5981186/raw/89c730507263e41aa5afaf3cb17a731e3b05be0e/ssh_invalid -o /usr/share/munin/plugins/ssh_invalid
$ ln -s /usr/share/munin/plugins/ssh_invalid /etc/munin/plugins/ssh_invalid
$ vim /etc/munin/plugin-conf.d/munin-node
# 以下を追記
[ssh_invalid]
group adm
$ restart munin-node
```