OmniAICreator/Qiita-1.07M huggingface dataset:
VagrantでAmazon EC2を操作する


## 試した環境

- Max OSX 10.9.1
- Vagrant 1.4.3
- Vagrant aws plugin 0.4.1

## 参考にしたサイト

https://github.com/mitchellh/vagrant-aws
http://d.hatena.ne.jp/naoya/20130315/1363340698


# 事前準備

## Vagrantのインストール

インストールや使い方は、こちらを参考に。

http://qiita.com/inouet/items/b36638adc2b5772db457

## Vagrant-AWS pluginのインストール

AWSを扱うためのPluginをインストールする。

```
$ vagrant plugin install vagrant-aws
```

## Amazon EC2の準備

VagrantfileにEC2の情報を定義するため、事前に準備する。

### Access Key と Secret Access Keyの取得

Access Key ID and Secret Access Key

Secret Access Keyは、WEB上から確認できたが、近々確認できなくなるよう。
手元にない場合は、下記ページから再発行しておく。

https://console.aws.amazon.com/iam/home?#security_credential

### セキュリティグループの作成

EC2のコンソールから、セキュリティグループを作成する。
Vagrantを実行するクライアントから、SSHが通るグループ設定にしておく。

### Key Pairs

EC2のコンソールから、Key Pairsをダウンロードしておく。
未作成の場合は、作成しておく。

# Vagrantの実行

## dummy boxの追加

Vagrantの仕様上、Boxを登録しておく必要がある。
中身は空？のdummy boxが用意されているのでそれを追加しておく。

```
$ vagrant box add dummy https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box
```

## Vagrantfileの作成

initコマンドでデフォルトのVagnratfileを生成する。

```
$ vagrant init
```

生成されたファイルを以下のように修正する。
詳細は、[公式ページ](https://github.com/mitchellh/vagrant-aws)を参考に。

```

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "dummy"

  config.vm.provider :aws do |aws, override|
    aws.access_key_id = "[AWSのアクセスキー]"
    aws.secret_access_key = "[AWSのシークレットキー]"
    aws.keypair_name = "[AWSのキーペア名]"

    aws.ami = "ami-0d13700c" # AMIのID
    aws.instance_type = "t1.micro" # インスタンスタイプ
    aws.security_groups = [ 'vagrant-group' ] # セキュリティグループ    
    aws.region = "ap-northeast-1" # 東京リージョン

    override.ssh.username = "ec2-user"
    override.ssh.private_key_path = "[秘密鍵のパス]"
  end
endß
```


- AWSによって提供されるAMIのIDは、AMI選択画面で確認できる。

　　![スクリーンショット 2014-03-05 1.00.13.png](https://qiita-image-store.s3.amazonaws.com/0/30521/5423bf33-2b41-99ce-c042-9910e66dc478.png "スクリーンショット 2014-03-05 1.00.13.png")

- リージョンは指定しないと、デフォルトでは東京が指定されない。セキュリティグループがないと言われて嵌った。

# インスタンスの作成

vagrant up --provider=aws コマンドでAWSにインスタンスが作成される。

```
$ vagrant up --provider=aws

・・・
[default] Rsyncing folder: /Users/m/Vagrant/ => /vagrant
An error occurred while executing multiple actions in parallel.
Any errors that occurred are shown below.

An error occurred while executing the action on the 'default'
machine. Please handle this error then try again:

The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

mkdir -p '/vagrant'

Stdout from the command:
Stderr from the command:

sudo: sorry, you must have a tty to run sudo
 
```

最後にエラーが出るが、問題なく作成されている。

![スクリーンショット 2014-03-07 14.02.22.png](https://qiita-image-store.s3.amazonaws.com/0/30521/b698b1a3-3465-5e99-c4ae-0ae631013722.png "スクリーンショット 2014-03-07 14.02.22.png")


## インスタンスへのログイン

vagrant sshでログインできる。

```
$ vagrant ssh

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

[ec2-user@ip-10-134-207-199 ~]$ 
```

## インスタンスの停止

vagrant halt でインスタンスを停止できる。

```
$ vagrant halt
```

## インスタンスの削除

vagrant destroy でインスタンスを削除できる。

```
$ vagrant destroy
```
WindowsのCOM/OLEの情報を見る「oleview.exe」の起動時に「iviewers.dll」が無いと怒られたときの対処法

# 解決方法
結論から言うと、初回だけ「管理者として実行」するだけ。

## 詳細
「oleview.exe」を検索するなどして探す。
自分の環境(Windows 8.1)では「C:\Program Files (x86)\Windows Kits\8.1\bin\x86」にあった。
(x64にもあるけどどっちでもいい)

同じフォルダに「iviewers.dll」が入っていることを確認する。
なければ[Windows SDK](http://msdn.microsoft.com/ja-jp/windows/desktop/bg162891.aspx)をインストールする。
(Widnows8.1用だけど、7と8もサポートしてるらしい。それ以前のOSは右上の検索バーから調べるとあるかも)

「iviewers.dll」が存在していることを確認したら、コマンドプロンプトを **管理者権限で** 開く。
( **管理者権限で開くには、Ctrl + Shiftを押しながら起動** 。)

「Regsvr32 "(iviewers.dllのパス)"」と入力して実行する。
例: `Regsvr32 "C:\Program Files (x86)\Windows Kits\8.1\bin\x86\iviewers.dll"`

成功した旨のダイアログが表示されたら「oleview.exe」を初回のみ **管理者権限で** 開く。
エラーは表示されなくなるはず。以降は管理者権限で開かなくてよい。

# 経緯
るびまの[Win32OLE 活用法 【第 1 回】 Win32OLE ことはじめ](http://magazine.rubyist.net/?0003-Win32OLE)で「OLE View」というツールがあることを知った。

>オブジェクトブラウザでの調べ方

(省略)

> 他に、Microsoft が提供する無料で使えるツールとして、Microsoft の Resource Kit の Free Tool の中にある OLE View というツールもこの目的に使えます。

起動したらエラーが出たので解消方法について調べた。

# 参考リンク
[OLE/COM オブジェクト ビューアーを使用する](http://msdn.microsoft.com/ja-jp/library/d0kh9f4c.aspx)
[[OLE]Oleview が応答しなくなる不具合](http://support.microsoft.com/kb/176938/ja)
[OLE/COM Object Viewerを使う](http://code-life.net/?p=1047)
[dllregisterserver in iviewers failed](http://stackoverflow.com/questions/7621461/dllregisterserver-in-iviewers-failed)
Cakephpでユーザー登録後、登録したユーザーのIDを更新ID、新規登録IDに入れる


##前提条件

* ログインしていないユーザーがユーザ新規登録できる
* ログイン認証にAuthComponentを使用
* 登録時、ログインユーザのidを各テーブルのcreated_id, modified_idにセットしている

##実装
ログインしていない状態でユーザを新規登録した場合、created_id,modified_idにはidがセットされません。
なので、afterSaveメソッドにIDをセットする処理を追加しました。
ログイン時はログインIDが、未ログインは新規登録した際発行されたIDがセットされます。


```php 
    function afterSave($created)  
    {  
      if ($created) {
        App::uses('AuthComponent',  'Controller/Component');
        $user = AuthComponent::user();
        if(empty($user)){
            $id = $this->data[$this->alias]["id"];
        }else{
            $id = $user['id'];
        }
        $data[$this->alias]["id"] = $id;
        $data[$this->alias]["created_id"] = $id;       
        $data[$this->alias]["modified_id"] = $id;       
        $this->save($data, array('callbacks' => false));
      }
    }
```

ポイントは、callbacs => false です。
これがないとbeforeSave(), afterSave()が動いてしまい、余計な処理が走ってしまいます。
UIButtonに貼り付けた画像を変えたいのに変わらないとき

```objc:ViewController.m
self.button.imageView.image = [UIImage imageNamed:@"image.png"];
```

変わりません！

以下のようにします：

```objc:ViewController.m
[self.button setImage:[UIImage imageNamed:@"image.png"] 
             forState:UIControlStateNormal];
```

2時間・・・
homebrew でインストールした pyenv から最新の Python をインストールする

homebrew でインストールされる pyenv はリリースタグが打たれたものなので、
pyenv 本家の HEAD では対応している Python のバージョンに対応していないことがある。

本家から git clone してインストールすればいいんだけど、管理とか面倒なので、できれば homebrew で upgrade できるようにしておきたい。

tar ball から入れるのもめんどいし、今更 pythonz もなぁ.. とヘルプを眺めていたら `<definition-file>` とかあるじゃないですか。

```
% pyenv install -h               
Usage: pyenv install [-f] [-kvp] <version>
       pyenv install [-f] [-kvp] <definition-file>
       pyenv install -l|--list
```

で、やってみたらできた！

1. https://github.com/yyuu/pyenv/tree/master/plugins/python-build/share/python-build から目当てのファイルを探してダウンロードする
2. あるいは自分で書く
3. 3.4.0rc2 を使うことにする: `pyenv install ./3.4.0rc2`
4. 確認: `pyenv versions`
AlertDialogのテーマを変更したい


例えば
ここのActivityでは全体的にHolo.Lightを使ってるのだけれど、アラートダイアログだけ「Holoの黒っぽい見た目」にしたいという場面があったとします。
私はありました。

## スタイルを作る

まず、`res/values/styles.xml`に下記のようなスタイルを追記します。

```xml:styles.xml
<resources>
  <style name="AwesomeDialogTheme" parent="android:Theme.Holo.Dialog">
  </style>
</resources>
```

## スタイルを使う
次に、設定したスタイルをダイアログにあててみます

アラートダイアログを生成するときに下記のようなコードを書くはずです。
これだと、アプリやActivityで採用してるテーマをそのまま流用することになります。

```java:YokuaruDialog
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
```

先ほど設定したスタイルを使うために下記のように書きます。

```java:AwesomeDialog
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.AwesomeDialogTheme));
```

これでダイアログだけHolo黒になった(=^・^=)
[jQuery UI] Dialogで「タイトルバーを非表示」and「閉じるボタンを表示」する方法

何かオプションがあるのかもしれないけど、これで対応した。

```js
$dialog.dialog({
	autoOpen	: false,
	open		: function(event, ui){
		$('.ui-dialog-titlebar').removeClass('ui-widget-header');
	}
});

$dialog.dialog('open');
```
Sencha Touch 2でWebアプリを始める


バージョンは

* Sencha cmd : 4.0.6.27
* Sencha SDK : 2.3.1

# インストール
以下を用意する

* Sencha Cmd : http://www.sencha.com/products/sencha-cmd/download 
* Sencha Touch SDK : http://www.sencha.com/products/touch/download/
* Ruby

Sencha Cmd と Rubyをインストールしてください。
Sencha Touch SDKもダウンロードしておいてください。

上記はバージョンによってインストール方法が違う・バージョンがあわないとうまく行かなかったりするので、注意してください。
例えば、sencha SDK Tool とかは新しいSencha touch SDKでは動かなかったりするので、注意してください。

# アプリの作成

Sencha Touch SDKをダウンロードして、解凍しておく。
解凍したSencha Touch SDKのディレクトリに移動

```shell-session
$ cd ~/work/sencha-touch-2
```

Sencha Touch SDKのディレクトリ内でsenchaコマンドでアプリケーションのひな形を作る

```shell-session
$ sencha generate app helloSencha helloSencha
```

で、helloSenchaというアプリができあがります。
動作確認するときは、

```shell-session
$ sencha web start
```

でサーバーを立ち上げ、
http://localhost:1841/helloSencha/
にアクセスすれば動作確認できます。
Safariで動かすと以下のように表示されます。


![sencha-preview.png](https://qiita-image-store.s3.amazonaws.com/0/4044/279ba0ed-5104-8805-57ac-04bcd0d57a62.png "sencha-preview.png")

# フォルダ構成

こんな感じ

```
helloSencha
├── app
│   ├── Readme.md
│   ├── controller
│   │   └── Readme.md
│   ├── form
│   │   └── Readme.md
│   ├── model
│   │   └── Readme.md
│   ├── profile
│   ├── store
│   │   └── Readme.md
│   └── view
│       ├── Main.js
│       └── Readme.md
├── app.js
├── app.json
├── bootstrap.js
├── bootstrap.json
├── build.xml
├── index.html
├── packager.json
└── resources
```

# View
Sencha TouchはMVCモデルになっています。
Viewは viewディレクトリ以下にあるので、Main画面は、view/Main.jsです。ここを書き換えればトップページが書き換えられます。

たとえば、

```Main.js
        items: [            {                title: 'Welcome',                iconCls: 'home',                styleHtmlContent: true,                scrollable: true,                items: {                    docked: 'top',                    xtype: 'titlebar',                    title: 'Welcome to Sencha Touch 2'                },                html: [		             "<h1> test</h1>"                ].join("")            },
```

のように、html部分をh1要素で囲んだtestと書くとそれが表示されます。
GitLabでエラーが出たのでメモ


```
$ git clone git@gitlab.server:user/repo.git
Cloning into 'app'...
/usr/local/lib/ruby/2.0.0/net/http.rb:878:in `initialize': getaddrinfo: Name or service not known (SocketError)
	from /usr/local/lib/ruby/2.0.0/net/http.rb:878:in `open'
	from /usr/local/lib/ruby/2.0.0/net/http.rb:878:in `block in connect'
	from /usr/local/lib/ruby/2.0.0/timeout.rb:52:in `timeout'
	from /usr/local/lib/ruby/2.0.0/net/http.rb:877:in `connect'
	from /usr/local/lib/ruby/2.0.0/net/http.rb:862:in `do_start'
	from /usr/local/lib/ruby/2.0.0/net/http.rb:851:in `start'
	from /home/git/gitlab-shell/lib/gitlab_net.rb:62:in `get'
	from /home/git/gitlab-shell/lib/gitlab_net.rb:17:in `allowed?'
	from /home/git/gitlab-shell/lib/gitlab_shell.rb:59:in `validate_access'
	from /home/git/gitlab-shell/lib/gitlab_shell.rb:23:in `exec'
	from /home/git/gitlab-shell/bin/gitlab-shell:16:in `<main>'
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
$ 
```

⇒GitLabを設置してるサーバーのhosts設定を修正すればいけた・ω・！

``` /etc/hosts
127.0.0.1 gitlab.server
```

忘れてた・ω・｀

ちなみに`gitlab-shell`のconfig.ymlでgitlab_urlの最後の`/`が入っていない場合にも同じようなエラーがでるみたいです。

```config.yml
gitlab_url:"http://gitlab.server/"
```


参考：[https://github.com/gitlabhq/gitlab-shell/issues/17](https://github.com/gitlabhq/gitlab-shell/issues/17)
AndroidStudio 0.5.0 にアップデートしたらやるべきこと

リリースノートの和訳的なものですが、見落としがちなのでメモ。

## Gradle Plugin のアップデート

AndroidStudio 0.5.0 になり、Gradle Plugin もバージョンアップする必要があります。

```groovy
buildscript {
  dependencies {
    classpath 'com.android.tools.build:gradle:0.9.+'
  }
}
```

## テスト用ライブラリの依存関係を解決する DSL の変更

`instrumentTestCompile`および`testCompile`が存在しなくなります。かわりに、`androidTestCompile`を使用します。

```groovy
dependencies {
  androidTestCompile 'com.squareup:fest-android:1.0.+'
}
```

## ライブラリプロジェクトの Build Valiant DSL

android 直下においていた`debug`や`release`、`debugSigningConfig`は以下のように変更します。

```groovy
android {
  buildTypes {
    debug {
    }
    release {
    }
  }
  signingConfigs {
    debug {
    }
  }
}
```

## Gradle sync failed する場合

![スクリーンショット 2014-03-07 11.46.36.png](https://qiita-image-store.s3.amazonaws.com/0/31829/091649f1-d107-018b-6153-3f1cf582c0e7.png)

こんな感じで、キャッシュのロック待ちでタイムアウトする場合は、File > Invalidate caches / Restart を使ってキャッシュをクリアしてください。
PCからダブルクリック一発でapkインストール(Windows)

# PCから端末へのapkインストールが面倒
Androidの開発をしていると、PCでapkを入手してインストールすることがよくありますが
いちいちコマンドプロンプト開いてadb installするのは地味に面倒。

なので、端末をUSB接続だけしておいて、
apkファイルをダブルクリックでインストールできるようにしてみます。
特にAndroidのテスタさんにオススメ。

# apkをダブルクリックで端末にインストールされるようにする
手順はこれだけ。

1. batchファイル作成
2. apkファイルとbatchファイルの関連付け

## 1.batch作成
まずはbatchファイルを作成して、適当なディレクトリに保存。(例としてD:\tools\へ)

```bat:adbinstall.bat
@echo off

echo %~f1
adb install -r %~f1

:end
```

注１：adbはpathが通っている前提。そうでない場合は絶対パスを指定するなどが必要。
注２：Android端末は一台のみが繋がっている前提。複数だと対象の指定などが面倒になるので。
注３：必要に応じてコマンドのオプション（-rなど）はカスタマイズしてください。


## 2.apkファイルとbatchファイルの関連付け

これをダブルクリックしたときに実行するよう関連付けます。

### Windows 7の場合
**管理者権限**でコマンドラインを開いて下記を実行。
**batファイルのパスは、置いた場所にあわせて変えてください。**

```bat
> ASSOC .apk=AndroidPackage
> FTYPE AndroidPackage=D:\tools\adbinstall.bat %1 %*
```

#### 解説
一行目：拡張子とファイルタイプの関連付け（ファイルタイプの名前は任意っぽい。ここではAndroidPackageとしました）
二行目：ファイルタイプに対して実行する対象を紐付け。ファイルタイプは一行目で決めたもの。
XPまでと違って、関連付けの編集はGUIから操作できなくなったよう。

### Windows XPの場合
エクスプローラで「フォルダ オプション」を開く。
⇒「ファイルの種類」タブを選択
⇒「新規」ボタン
⇒「アクション」に`install`と入力　※たぶん何でもよい
⇒「アクションを実行するアプリケーション」に
`D:\tools\adbinstall.bat "%1"`
**※ファイルのパスは、置いた場所にあわせて変更**
と入力。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/38611/9c43b618-1179-8dae-3360-089e64364e33.png)


## おまけ

アイコンを適当なANDROIDのアイコンにしておけばカンペキ。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/38611/ae1c28cc-9d63-a0b0-8f93-652d5ec73679.png)


この手の設定は地味に面倒でなかなかやれないんですが、一度設定しておくと非常に便利です。
Eclipse ターゲット・ランタイムから項目を削除する

Eclipse（4.3.1）の Tomcat プロジェクトのプロパティの中に
「ターゲット・ランタイム」という項目がありますが、
「新規登録」はあるのにも関わらず、どういうわけか「削除」がありません。

試しに登録してみただけなのに、ゴミが残ってしまうってのは困ります。

いろいろやってみた結果、手動で消せたので備忘録として残します。

・対象ファイル
```[ワークスペースのroot]\.metadata\.plugins\org.eclipse.core.runtime\.settings\org.eclipse.wst.server.core.prefs
```

の中から、削除したい _runtime_ 要素を探して消すだけです。

（もっとスマートな方法はないんだろうか・・・）
Python: Jose ECDHの共有シークレットのアグリーメント


キーの派生をしていいないので、「Key Agreement」にはなっていなですが、Diffie-Hellmanまでは確認:

```py

    def test_dhZ(self):
        from ecc.Key import Key 

        # Party V(recepient) declares a satic key pair
        curve_bits = 521 
        v_stc = Key.generate(curve_bits)

        # and advertise to Party U(Sender)
        v_pub = Key.decode(v_stc.encode())

        # Party U provides a ephemeral key
        u_epk = Key.generate(v_pub._pub[0])

        # Getting NIST Curve
        from ecc.curves import get_curve
        from ecc.elliptic import mulp

        _curve = lambda bits:  dict(
            zip(('bits', 'p', 'N', 'a', 'b', 'G'),
                get_curve(bits)))
        # Compute ECDH
        _dhZ = lambda crv, pub, pri: mulp(
            crv['a'], crv['b'], crv['p'], pub, pri)[0]

        # Party U compute
        u_crv = _curve(u_epk._priv[0])
        shared_secret_u = _dhZ(u_crv, v_pub._pub[1], u_epk._priv[1])

        # Party V recive Epemeral Public Key
        v_epk = Key.decode(u_epk.encode())
        # Party V compute
        shared_secret_v = _dhZ(u_crv, v_epk._pub[1], v_stc._priv[1])

        # Secrete Agreeed!
        self.assertEqual(shared_secret_u, shared_secret_v)
```
Google Apps Scriptを使ってらくらくTypetalk BOT開発③ 応用編 メンションに反応する翻訳Botを作ってみた


最近手脂がすごい大橋です。

一昨日から書いているTypetalk BOTの話ですが、今日で最後です。

一応昨日までに

* [Libraryの紹介](http://qiita.com/soundTricker/items/b3cc2848ca8fda758cc7)
* [実践編 自分用Google Analyticsサマリーグラフ通知Botを作ってみるお](http://qiita.com/soundTricker/items/6b633314e04331fcf3ed)

の二つのエントリーを書きました。
今日はよくあるメンションに対して反応する翻訳Botを作ってみたいと思います。

# ゴール

以下の感じになります。

![スクリーンショット 2014-03-06 18.40.18.png](https://qiita-image-store.s3.amazonaws.com/0/2965/a2717981-8008-330d-8449-a6baad596fd3.png "スクリーンショット 2014-03-06 18.40.18.png")

`@translatebot transate 翻訳したい語句 to ja|en`

という感じの書式で翻訳元言語は自由、翻訳後は日本語か英語という感じで組みたいと思います。

なお`@translatebot`を何かしらのトピックに招待すれば(試すならテストトピックとか)利用可能なのですが、
Bot自体のトピックへの参加許可は現状手動で実施する必要があり、
めんどく.... 忙しいためすぐに取り込めない可能性があります。


あとエラーハンドリングちゃんとしてないので、うまく動かなくても知りません。自己責任でご利用を！
また今回翻訳Bot用のNulabアカウントを取得していますが、規約的に良いか微妙なのでいつか消すと想います。

そのうちBot用のアカウントとか、アカウントとらなくてもBotが動かせるようになるのかしら。

# フルコード

書いてみた全体のコードは以下です。
自身でコピペ動かす場合は[最初の記事](http://qiita.com/soundTricker/items/b3cc2848ca8fda758cc7)を参考に
`TypetalkApp`ライブラリを動かせるようにして、
ScriptPropertyにclientId、clientSecretを設定し
Triggerを1分一回とか5分一回とかに設定して下さい。

```js:TranslateBot.js
function handleMensions() {
  
  
  var lock = LockService.getPrivateLock();
  
  //1分に1回とかの頻度で動かすので動いている最中の場合はスキップ
  if(!lock.tryLock(1000)) {
    Logger.log("oops, right now working");
    return;
  }
  
  //設定はScriptPropertiesに
  var prop = PropertiesService.getScriptProperties().getProperties();
  
  var typetalkApp = TypetalkApp.create(prop.clientId,
                                       prop.clientSecret, 
                                       [TypetalkApp.SCOPE_MY, TypetalkApp.SCOPE_TOPIC_POST, TypetalkApp.SCOPE_TOPIC_READ],
                                       {name : "translateBot"});
  
  //未認可の場合は認可 、今回のケースではBot宛にメンションが送られてきて、Botがメンションを返すので、Client CredentialsでOK
  typetalkApp.isAuthorized() || typetalkApp.authorize();
  
  //未読のメンションを取得
  var mentions = typetalkApp.getMentions({unread:true});
    
  (mentions.mentions || []).forEach(function(mention){
    
    //もろもろ必要な物を取得
    var topicId = mention.post.topic.id;
    var message = mention.post.message;
    var postId = mention.post.id;
    var account = mention.post.account.name;
    
    var separated = message.split(" ");
    
    //フォーマットを一応軽くチェック
    if(separated.length <= 4 || separated[1] != "translate") {
      return;
    }
    
    //翻訳対象を取得
    var target = "";
    for(var i = 2; i < separated.length - 2; i++) {
      target += separated[i] + " ";
    }

    //「翻訳やるお」を通知
    typetalkApp.postMessage(topicId, "@" + account + " Please wait, right now translating '" + target +"'....", {replyTo : postId});
    
    
    //翻訳
    var result = LanguageApp.translate(target, "", separated[separated.length - 1] == "en" ? "en" : "ja");
    
    //翻訳結果のメッセージをreplyTo形式で投げて
    typetalkApp.postMessage(topicId, result, {replyTo : postId});
    
    //メンションを既読に
    typetalkApp.openMention(mention.id);
    
    Utilities.sleep(1000);
    
  });
  
  lock.releaseLock();
  
  
}
```

# まとめ

3日連チャンで書きましたがいかがだったでしょうか?
TypetalkのようなAPIがしっかりしたサービスとGASはかなり相性がよく、
Googleのサービス郡と繋ぎやすくなります。

是非色々実装してみてください☆
レスポンシブデザインで気をつけたい、電話番号の扱い

レスポンシブデザインでWebページを制作する際、電話番号の扱いにいつも迷うのでまとめてみました。

## 電話番号の自動リンク機能を無効化する

iPhoneやiPadに搭載されているsafariでは、ページ内の電話番号を自動でリンクに変換し、タップすることで電話をかけることができる機能が用意されています。

しかし、この機能は注文番号やIPアドレス、そのほか電話番号らしき数字で構成された文字列をすべてリンクしてしまうという問題があるほか、Android端末やChromeにはこの機能がないため、ユーザの混乱を避けるためにも無効化しておくのがベターです。

電話番号の自動リンク機能を無効化するには、head部に以下のように追記します。

``` html
<!DOCTYPE html>
<html>
    <head>
        <!-- 電話番号の自動リンク機能を無効化 -->
        <meta name="format-detection" content="telephone=no">

        <title>文書のタイトル</title>
    </head>
    <body>
    </body>
</html>
```

## 電話番号にリンクを張る

ユーザにリンクをクリックすることで電話をかけさせたい場合には、 `a` タグの `href` 属性に次のように記載します。（電話番号が 03-1234-5678 だと仮定します。）

``` html
<a href="tel:0312345678">電話はこちらへ</a>
```

しかし、これではPCで閲覧しているユーザにもリンクが有効となってしまいます。
そこで、JavaScriptを使い、 __スマートフォンで閲覧しているユーザにだけ、電話番号にリンクを張る__ 機能を実装します。

### HTML側の記述

HTML側には、電話番号をdata属性に埋め込んだ `span` タグで電話番号を囲います。

``` html
<span data-action="call" data-tel="0312345678">電話はこちらへ</span>
```

### JavaScript側の記述

JavaScriptには `data-action=call` が指定されている `span` タグを、電話をかけるための `a` タグで囲む処理を記述します。（jQueryが必要です。）

``` javascript
$(function() {
	if (!isPhone())
		return;

	$('span[data-action=call]').each(function() {
		var $ele = $(this);
		$ele.wrap('<a href="tel:' + $ele.data('tel') + '"></a>');
	});
});

function isPhone() {
	return (navigator.userAgent.indexOf('iPhone') > 0 || navigator.userAgent.indexOf('Android') > 0);
}
```
Qt5.2.1 VS2012版を使ってみた

# QtCreator ＋ VC++2012コンパイラ

Qt5からVisual Studioのコンパイラを使う記事が意外と少ないので書いてみる。（その逆、Visual StudioからQtプログラムをコンパイルする方法はちらほら情報があるみたいだけど。）手っ取り早くQtを使ってみたい人にはQtのMinGW版をおすすめ（コンパイラ内蔵してるので、インストールしたら即使える）。ただ、VS版もそれほど手間じゃないので、ライブラリ関係等（後述）でVS版を求めてる人は、ぜひ使ってみて下さい。

> 追記：VS2012版でコンパイルすると Windows XP 対象外のアプリとなります。XPにも対応させるにはVS2010版を使って下さい。（後述）

使用したのは、下記２つ。

* Qt 5.2.1 - Windows 32-bit (VS 2012, 541 MB) 

* Visual Studio Express 2012 for Windows Desktop

# インストール手順

たったの２ステップ。
１）Qtインストール
２）VS2012インストール

まず、Qtのダウンロードは下記いずれかのサイトから。（たぶんどっちも同じもの）

▼Qtダウンロード｜日本Qtユーザー会
http://qt-users.jp/download.html

▼Qt Download｜Qt Project　（本家から落としたい人はここ）
http://qt-project.org/downloads

ダウンロードしたら成り行きでインストールすればOK。環境変数の設定なども不要。次にVS2012 Express。

▼Microsoft Visual Studio Express 2012 for Windows Desktop
http://www.microsoft.com/ja-jp/download/details.aspx?id=34673

これはWebインストーラーなので少々時間かかるけど、これも成り行きでインストールすればOK。環境変数なんかも自動で設定してくれる。（ただ、やたらめったら色んなものがインストールされるのでディスクの空き容量に注意）

以上です。

# 補足

* ソース内に日本語などが含まれると、ビルド時に構文エラーとなることがあります。特に、MinGW版からVS版に移行した場合などです。対策としては、ソースをいったんサクラエディタ等で開き、エンコードを __BOM付き__ のUTF-8で保存して下さい。また、新規ファイルもBOM付きで保存されるよう、QtCreatorの設定を変更しておく必要があります。（下記参照）

> Qtと文字コードについては下記のページが大変詳しいです
> ▼Qt とソースファイルの文字コード｜Qt のあれこれ (仮)
> http://qt-labs.jp/2013/08/qt-and-source-and-codecs.html
> - - -
> Visual Stuido で UTF-8 なソースファイルをビルドするには BOM がファイルの先頭に埋め込まれている必要があります。Qt Creator でソースファイルを作成した場合、デフォルトではその文字コードは UTF-8 になっていますが、BOM は付きません。この動作はオプションで変更できます。
> 「ツール」→「オプション」でオプションダイアログを表示し、「テキストエディタ」→「動作」タブの「ファイルの文字コード」のところを変更してください。「UTF-8 BOM」で BOM を UTF-8 のファイルでは常に追加するような設定が可能です。

* QtはずっとMinGW版を使ってたのですが、今回初めてVS版を使おうと思ったのは、画像を扱うOpenCVライブラリとの相性問題が起きたためです。どちらもMinGW版の場合は共通の libstdc++-6.dll が必要なのですが、おそらくMinGWのバージョンがちがうのか、「Qt＋OpenCV」アプリのビルドは通るけど起動はしなかった…。あと、最近のOpenCVライブラリにはMinGWビルド版が同梱されなくなった。OpenCVをQtコンパイラでビルドしなおす手も考えたけど、成功するかどうか未知数なので、以前から少し気になってたQtのVS版を試してみた、、、というわけです。
* VS2012でコンパイルされたアプリはもともとXP対象外のようです。VS2012 update をインストールし、コンパイラ設定をXP仕様にすることで対応は可能なようですが、QtCreatorでの正しい設定方法は依然不明です…。もし分かる方いらっしゃればご教示お願いします。XPにも対応させたい場合は、Qt5 VS2010版を利用するのが早いかと思います。以下、参考URL。

▼Visualstudio2012で作成したプログラムをXPで実行
http://social.msdn.microsoft.com/Forums/vstudio/ja-JP/e0ebde43-fb4f-42cc-b00b-bf4d4f8ec712/visualstudio2012xp

▼VS2012 nmake using v110_xp toolset?
http://stackoverflow.com/questions/15928293/vs2012-nmake-using-v110-xp-toolset

# Qt関連の投稿

▼[2019年版] Qtでパソコンソフトを作ろう（MinGW使用/VisualStudio不要）【その１：インストール編】
https://qiita.com/yasumodev/items/399ec89b7205e3c0bab1
Python:eccでJose alg=ES512


python-edcsa より簡単な気が。

インストール:

    $ pip install ecc
    

Jose alg=ES512 (ECDSA using P-521 curve and SHA-512):

```py
    class TestEcKeyEcc(unittest.TestCase):
    
        def test_generate(self):
            from ecc.Key import Key 
    
            pri = Key.generate(521)
            self.assertTrue(isinstance(pri, Key))
            self.assertTrue(pri.private())
    
            pub = Key.decode(pri.encode())
            self.assertTrue(isinstance(pub, Key))
            self.assertFalse(pub.private())
    
            msg = "hello, it's me."
            sig = pri.sign(msg, hashfunc='sha512')  # default sha256
            self.assertTrue(pub.verify(msg, sig, hashfunc='sha512'))
    
```
Intellij IDEAファミリーで、コミットログとJIRA Issueを連携させる

- IntelliJファミリーのIDEにこの設定を入れておくと、コミットのコメントにIssueIDを入れておけば、それがリンクとして表示されるので変更の経緯や背景をシームレスに追いかけられてストレスフリー。

# 設定手順
- ```Settings```メニューで ```Version Control -> Issue Navigation```

![2014-03-07_10h25_24.png](https://qiita-image-store.s3.amazonaws.com/0/20022/57ffe85f-3c7c-5a9e-f7a1-6d909e2804d1.png)

- JIRAのURLを入力

![2014-03-07_10h27_03.png](https://qiita-image-store.s3.amazonaws.com/0/20022/3d0e7524-24ae-960f-2c73-250542d238d3.png)

- 自動的に、IssueのURLにマッチさせる設定が反映される

![2014-03-07_10h29_45.png](https://qiita-image-store.s3.amazonaws.com/0/20022/ca2e43b6-cf07-cc31-1746-b7b9bf34f003.png)

- ホントに正しくリンクされるかチェックしてみる

![2014-03-07_10h32_33.png](https://qiita-image-store.s3.amazonaws.com/0/20022/86b61d45-ac3d-f90a-e6ac-ae0a3909c9ac.png)

- ```Changes```ウィンドでコミットログを見る時、コミットログにIssueIDが入っているとそのIssueIDが自動的にリンクになる。
Unityでクリックした場所の平面座標を取得

RPGなどで上からの視点にして、Diabloのようにクリックした位置にキャラを移動させたいときに、
下記のコードでクリックした場所のXZ平面上の座標を取得できます。

```js
		var cursor:Vector3;	
		var _isMouseDown = false;
		var _isMouseUp = false;	 
		if(Input.touches.Length > 0){
		    var touch = Input.touches[0];
		    cursor = touch.position;	    
		    if(touch.phase == TouchPhase.Began){
		    	_isMouseDown = true; 
		    } else if (touch.phase == TouchPhase.Ended
		     || touch.phase == TouchPhase.Canceled){ 
		    	_isMouseUp = true;
		    }
		} else {
			cursor = Input.mousePosition; 
			if(Input.GetMouseButtonDown(0)){  
				_isMouseDown = true; 
	 	    } else if(Input.GetMouseButtonUp(0)) { 
		     	_isMouseUp = true;
		    }
		}

		cursor.z = Camera.main.transform.position.y;
		cursor = Camera.main.ScreenToWorldPoint(cursor) - transform.position;

		var position:Vector2 = Vector2(cursor.x, cursor.z);

```
Git サブディレクトリ配下の特定ファイルのみ対象とする

以下のようなフォルダ構成で、`/hoge/file1.txt`だけcommitしたいよ、という場合。

```
/hoge
/hoge/file1.txt
/hoge/file2.txt
/hoge/file3.txt
/.gitignore
```

`.gitignore` をこのようにする。

```
*.*
!/hoge/file1.txt
```

`/*`というかどこかに/を入れるとその配下のディレクトリが除外対象になってしまい、後から`!`で指定しても除外されたままになってしまう。
そのため、「あらゆるファイル」のみを除外し、そこから対象のファイルを`!`で設定するようにする。
PHPで指定月の月初と月末の日付を取得

PHPで指定月の月初と月末の日付を取得するTips。
意外とすぐ出てこなかったので残しておきます。

```sample.php
$month = '2014-03'; //nullでも構いません
$firstDate = date('Y-m-d', strtotime('first day of ' . $month));
$lastDate = date('Y-m-d', strtotime('last day of ' . $month));
```

\$monthがnullの場合には、現在月の月初と月末を取得してくれます。

##詳しい解説
http://php.net/manual/ja/datetime.formats.relative.php
↑公式リファレンス
[Objective-C] UIViewAlertメモ


JSなら`alert('OK');`だけで出てくれるのに、色々と初期化が大変です。（その分、機能豊富ですが）
IDEに補完任せてると一向に覚えないのでメモとして残しておきます。

##UIAlertViewを生成

###色々まとめて初期化

```objc
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"タイトル"
                                                message:@"メッセージ"
                                               delegate:self
                                      cancelButtonTitle:@"キャンセル"
                                      otherButtonTitles:@"ボタン1", @"ボタン2", @"ボタン3", nil];
```

最後の`otherButtonTitles:`の引数は可変引数です。なので最後は`nil`。

###個別に設定

```objc
UIAlertView *alert = [[UIAlertView alloc] init];
alert.title    = @"タイトル";
alert.message  = @"メッセージ";
alert.delegate = self;
alert.cancelButtonIndex = 0;
[alert addButtnWithTitle:@"キャンセル"];
[alert addButtonWithTitle:@"OK"];
[alert show];
```

###デリゲートで押したボタンを判別

```objc
- (void)alertView:(UIAlertview *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
	switch (buttonIndex) {
		case 0: {
			// 0番目のボタン
			break;
		}
		case 1: {
			// 1番目のボタン
			break;
		}
		// …以下必要な分続く
	}
}
```

##UIAlertViewを同期的に使う

色々問題はありますが、一応同期的に扱う方法があります。
それについては個別に書いているので、[[Objective-C] UIAlertViewを同期処理する](http://qiita.com/edo_m18/items/cb1d9061d91e572b58eb)を見てください。


[**Associated Objectについての解説**はこちら](http://qiita.com/edo_m18/items/410f7d0634cb6b5fdb17)に移動しました。
rbenvで新しいバージョンの ruby をインストールしたはずなのにバージョンが変わらないときの対処

### 個人用メモ

## ことの発端
* 現在のバージョンを確認する

```bash
$ ruby -v
```

> ruby 1.9.3p429 (2013-05-15 revision 40747) [x86_64-darwin11.4.2]

* バージョン 2.0 にあげたい

```bash
$ rbenv install 2.0.0-p195
```

> Installed ruby-2.0.0-p195 to /Users/xxx/.rbenv/versions/2.0.0-p195

* インストール成功
* 再度バージョン確認

```bash
$ ruby -v
```

> ruby 1.9.3p429 (2013-05-15 revision 40747) [x86_64-darwin11.4.2]

* おや？

## どうも rbenv では ruby のバージョン管理がされているらしい
* インストール済みの一覧表示

```bash
$ rbenv versions
```

>   system
> * 1.9.3-p429 (set by /Users/xxx/.rbenv/version)
>   2.0.0-p195

* * 付きが現在設定されているバージョン
* 先ほど入れたバージョンも存在する

* 設定を変更する

```bash
$ rbenv global 2.0.0-p195
```

* もう一度バージョン確認

```bash
$ ruby -v
```

> ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-darwin11.4.2]

* めでたし
すべてのオブジェクトがObjectを継承している訳じゃない


[MDNいわく](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object#Object_instances)、

> JavaScript におけるすべてのオブジェクトは Object に由来します。 **すべてのオブジェクトは Object.prototype からメソッドとプロパティを継承しています** が、それらは上書きされている可能性があります。

らしい、だけどオブジェクトの中にはObjectを継承していないものがある。

**追記**
優しい人に教えてもらったのだけど、IE8およびIE7はじゃなくてJavaScriptじゃなくてJScriptというJavaScript互換言語でスクリプトを実行している。なので[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object#Object_instances)に書かれていることは正しい。紛らわしいこと書いてごめんなさい。
追記終わり。

JScriptのオブジェクトの中にはObjectを継承していないものがある。
具体例を出すとIE7での```window```オブジェクトやDOM Events。
さらにIE7での```window.toString```は```Function```を継承していない。

```javascript
alert(window instanceof Object); // IE7ではfalse
alert(window.toString instanceof Function); // IE7ではfalse
```

以下、どうしてこんなことになっているか調べた。

## native object, built-in object, host object

JScriptの標準言語仕様であるECMAScriptによると、オブジェクトは3つに分類できる。

* native object

  ホスト環境（つまりブラウザとかNode）から独立したオブジェクト。後述のbuilt-in objectと自分で作った（ユーザ定義した）オブジェクトがこれにあたる。

* built-in object

  ECMASciriptで定義されているオブジェクト。すべてのbuilt-in objectはnative objectでもある。```Object```や```Function```、```Date```などおなじみのオブジェクトがこれ。

* host object

  ホスト環境から提供されるオブジェクト。ブラウザでいう```window```やDOM、Nodeでいう```require```などがこれにあたる。

## Objectの継承について

[ECMAScript5.1によると](http://www.ecma-international.org/ecma-262/5.1/#sec-15)、
> Unless otherwise specified every built-in prototype object has the Object prototype object, which is the initial value of the expression Object.prototype (15.2.4), as the value of its [[Prototype]] internal property, except the Object prototype object itself.

（てきとうな意訳）特に断りのない場合、すべてのbuilt-in prototype objectの```[[Prototype]]```内部プロパティは```Object.prototype```を初期値として持っている、とある。

つまり基本的に **built-in object** は```Object```をプロトタイプ継承しているよ、ということだ。
でも、逆にbuilt-in object以外については```Object```を継承する、ということが明記されていない。

## つまり？

built-in object以外はObjectを継承していなくても、ECMAScriptの仕様上間違いではないので **host object** である```window```などはObjectを継承していなくてもよい。

すべてのオブジェクトが```Object```を継承しているだろうと思って、うっかりIE7で

```javascript
// IE7
document.getElementById('btn').attachEvent('onclick', function (e) {
  if (e.hasOwnProperty('target')) {
    // 処理
  }
});
```

とかやってしまうと、エラーになる（host objectである```Event```が```Object```を継承しておらず```Object.prototype.hasOwnproperty```を参照しないため）。

関数についても同様のことがいえるので、IE7だと下記がエラーになる。

```javascript
var obj = {};
window.toString.call(obj); // Functionを継承していないのでFunction.prototype.callを使えない
```

## まとめ

host objectが```Object```を継承してるかどうかは実行環境の実装によるので、気をつけよう。。
clamavのDBが機能しなくなった時の対処法


##経緯

```
--------------------- clam-update Begin ------------------------


The ClamAV update process (freshclam daemon) was not running!
If you no longer wish to run freshclam, deleting the freshclam.log
file will suppress this error message.

---------------------- clam-update End -------------------------
```

サーバから毎日取得しているLogwatchが嫌なエラーを出してきた。
clamavのDBがしっかり動いていない。

##対処方法
対処法を探していたところ、/var/clamavディレクトリ以下にあるmain.*のファイルが2つあることを確認した。

実は、こんなログも届くことがあった。

```
Starting Clam AntiVirus Daemon: LibClamAV Warning: Detected duplicate databases /var/clamav/main.cvd and /var/clamav/main.cld, please manually remove one of them
```

main.cvd と main.cld の2つ。どちらか消さないといけないよう。

1つだけにして freshclam を実行したところ、clamavも正常に起動した。

やっぱり日々の確認・解決が大切ですね。
JavaScriptの配列のソート方法を自分で書く

忘れないようにメモ

ここをそのままコピペ
[Sorting a JavaScript array using array.sort()](http://www.javascriptkit.com/javatutors/arraysort.shtml)

```js
var myarray=[25, 8, 7, 41]
myarray.sort(function(a,b){return a - b}) //Array now becomes [7, 8, 25, 41]
```
UbuntuのUIフォントを変更する方法

###UbuntuのUIフォントを変更する方法

例では、フォントファミリー「sans, sans-serif, monospace」を、
プログラミング用フォント「Ricty」に変更してみます。
Ubuntu13.10上でRictyがインストールされている環境で行いました。


```
$ cd ~/.config/fontconfig
$ vim fonts.conf
```
「fontconfig」ディレクトリがない場合は「mkdir」コマンドで作成してください。

「fonts.conf」を以下の内容にします。

```xml
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <match target="pattern">
        <test qual="any" name="family">
            <string>serif</string>
        </test>
        <edit name="family" mode="assign" binding="same">
            <string>Ricty Regular</string>
        </edit>
    </match>
    <match target="pattern">
        <test qual="any" name="family">
            <string>sans-serif</string>
        </test>
        <edit name="family" mode="assign" binding="same">
            <string>Ricty Regular</string>
        </edit>
    </match> 
    <match target="pattern">
        <test qual="any" name="family">
            <string>monospace</string>
        </test>
        <edit name="family" mode="assign" binding="same">
            <string>Ricty Regular</string>
        </edit>
    </match>
</fontconfig>
```

その後、再起動または以下のコマンドを実行するとフォントの変更が反映されます。

```
$ fc-cache
```

###フォント変更前スクリーンショット
![before.png](https://qiita-image-store.s3.amazonaws.com/0/34365/778d6593-19a9-577e-ab0e-813ba2b5812f.png)

###フォント変更後スクリーンショット
![after.png](https://qiita-image-store.s3.amazonaws.com/0/34365/d7d8f49d-df69-3ae0-42ca-76886fca79b5.png)
Emacsのmigemoユーザーは最新版のcmigemo使った方がいいと思うんだ


以前、[ruby migemoの導入方法](http://qiita.com/kenbeese@github/items/ebbf0128d7c752a94a22)で、ruby migemoのメリットは改行挟んだ日本語でも検索できると書いた。cmigemoでは出来なかった原因は、cmigemo側のemacs用アウトプットが悪かったことみたい。

@syohexさんが修正してくれて、[そのプルリクエスト](https://github.com/koron/cmigemo/pull/10)が取り込まれたので、みんな最新版のcmigemoを使うべきだと思う。

ちなみに、homebrew、yum、aptとかのパッケージマネージャーに入ってるcmigemoは開発がgithubに移る前の大分古いバージョン。

#migemoって?
ローマ字のままで日本語をインクリメンタル検索するためのツール

#導入方法

## MacOSX

```sh
git clone https://github.com/koron/cmigemo
cd cmigemo
./configure
make osx
make osx-dict
make osx-install
```

@elimさんによるとHomebrew(0.9.5)でも`--HEAD`オプションで最新版が入るらしい。

```sh
brew install cmigemo --HEAD
```

## Linux

```sh
git clone https://github.com/koron/cmigemo
cd cmigemo
./configure
make gcc
make gcc-dict
make gcc-install
```

# Emacsの設定
[migemo.el](https://github.com/emacs-jp/migemo)をロードパスの通ったところに置く。

```el
(setq migemo-dictionary "/usr/local/share/migemo/utf-8/migemo-dict")
(setq migemo-command "cmigemo")
(setq migemo-options '("-q" "--emacs"))
(setq migemo-user-dictionary nil)
(setq migemo-coding-system 'utf-8)
(setq migemo-regex-dictionary nil)
(load-library "migemo")
(migemo-init)
```

これで、日本語の検索が捗る!!
良いコードのためのメモ


## 命名

### 省略のコツ
- 先頭の数文字以外削除 (Separetors -> Seps）
- ingの削除 (Grouping -> Group）
- 単語の削除 (formattedConsumptionTax -> formattedTax)
- 母音を削除 (image -> img)
- 強い音以外削除 (server -> svr)
- 汎用略語 (database -> db)

 略語検索サイト
[Abbreviations and acronyms dictionary: Find definitions for over 4,219,000 abbreviations, acronyms, and initialisms](http://www.acronymfinder.com/)

### 英語を正しく使う
日本人が勘違いしている単語があるので、気をつける。
例）regist -> register
※registという単語は存在しない

#### 誤訳に注意
- 機械翻訳した単語を使うのは危険
- 意味を取り違えた単語を使うと将来のバグの元

 単語検索/辞典
 [英語・語学の学習情報サイト「スペースアルク」：アルク](http://www.alc.co.jp/)

### 流行
命名方法にも流行り廃りがあるので、時流に合わせた方法を学ぶ。

### 変数名
- スコープが長いほど、より具体的な名前に。
- メソッドの引数は簡潔に
- 説明的な名前にする（何の（ための）○○ ）

```Javascrupt:ダメな例
var languages = ['ja', 'en'];
```

```Javascrupt:良い例
var availableLanguages = ['ja', 'en'];
```

### メソッド名
- 動詞 + 目的語 (getXXX)
- 良く使うメソッドは簡潔で短い方が良い

### クラス名
- クラス名がなかなか決まらない時は設計を疑う
- クラス名の命名 = 設計 = 経験値が重要

#### 習熟度別よく使われるクラス名
| 　　　　　|　作業範囲 　　　　　　　　　　| クラス名 　　　|
|:--------|-----------:|:------------:|
| レベル１ | アプリ開発 　　　　　　　　　| Action,Controller,Model,Helper,Test |
| レベル２ | プラグイン／アドオン開発 　　| Plugin,Adaptor,Factory,Handler,Builder |
| レベル３ | フレームワーク/ライブラリ開発 | Loader, Cache, Engine, Descriptor |

## スコープ

### 変数宣言
- スコープを極力短くするため、変数は使用する直前に宣言する。

## 参考書籍

[Amazon.co.jp： 良いコードを書く技術　-読みやすく保守しやすいプログラミング作法 (WEB+DB PRESS plus): 縣 俊貴: 本](http://www.amazon.co.jp/%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E6%8A%80%E8%A1%93-%EF%BC%8D%E8%AA%AD%E3%81%BF%E3%82%84%E3%81%99%E3%81%8F%E4%BF%9D%E5%AE%88%E3%81%97%E3%82%84%E3%81%99%E3%81%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E4%BD%9C%E6%B3%95-WEB-DB-PRESS-plus/dp/4774145963)
RMagickで描画される文字列のサイズを取得する方法

[Magick::Draw::text](http://studio.imagemagick.org/RMagick/doc/draw.html#text)メソッドで文字列を描画する場合、一定の幅で改行を入れたい場合などに描画される文字列のサイズを取得したい場合がある。このような用途に[Magick::Draw::get_type_metrics](http://studio.imagemagick.org/RMagick/doc/draw.html#get_type_metrics)が用意されている。このメソッドは文字列を渡すとDrawオブジェクトに設定されているフォントとフォントサイズで描画文字列サイズのサイズを返すことになっている、、、のだが、

以下のようなコードでは、最新(2014/3/7時点)のバージョン2.13.2では
デフォルトのフォント、フォントサイズのままサイズが取得されてしまう。

```ruby:get_font_size_orig.rb
require 'RMagick'

FONT_PATH = '/Library/Fonts/ヒラギノ角ゴ Pro W3.otf'
FONT_SIZE = 25

text = Magick::Draw.new
text.font(FONT_PATH)
text.pointsize(FONT_SIZE)

metrics = text.get_type_metrics('ほげほげ')

puts "width: #{metrics.width}, height: #{metrics.height}"
```

回避方法は以下。

```ruby:get_font_size.rb
require 'RMagick'

FONT_PATH = '/Library/Fonts/ヒラギノ角ゴ Pro W3.otf'
FONT_SIZE = 25

text = Magick::Draw.new

# font, point サイズはfont=, pointsize=で指定しないと get_type_metrics が正常動作せず、
# デフォルトのフォント、フォントサイズが適用されてしまう。
text.font = FONT_PATH
text.pointsize = FONT_SIZE

metrics = text.get_type_metrics('ほげほげ')

puts "width: #{metrics.width}, height: #{metrics.height}"
```

ややこしいのは実際 Draw::text で描画されるフォントとサイズは Draw::font(string), Draw::pointsize(integer) で指定しても反映されるが、get_type_metrics が誤った値を返す点。また、リファレンスでもこちらのメソッドのみ定義されている。

Draw::text, Draw::get_type_metrics 両方を正しく動作させるには Draw::font=, Draw::pointsize= で指定する必要があった。
(ソースを見た感じ、新旧両方のメソッドが残っており、かつ古い方のみ動作している。。。？)
PHPのnull

ちょっと、いや、かなりどうでもいいことなんですけど、nullでビビったことが。
下記のうち、is_null()でtrueになるのはどれでしょう？

```php
$null1 = null;
$null2 = Null;
$null3 = NULL;
$null4 = nUll;
```

答え：全部

PHPのnullは、大文字小文字は関係ないんだって！！
知らなかった・・・。
[Apache]mod_rewireで時間判定し自動的にサイトをメンテナンス状態にする


mod_rewrite ではサーバの時間を扱うこともできます。

下記は、2014年3月6日の15時から2時間の間、全HTTPリクエストに対してメンテナンス説明ページを表示する例です。

```apache:.htaccess
RewriteEngine on

RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY}%{TIME_HOUR} >2014030614
RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY}%{TIME_HOUR} <2014030617
RewriteCond %{ENV:REDIRECT_X_IS_MAINT} !^1$
RewriteRule .* /maint.html [E=X_IS_MAINT:1,L]
```

無限リダイレクトにならないように、一度目のURL書き換えが成功したら環境変数 `X_IS_MAINT` を設定し、二度目のURL書き換えが実行されないようにしています。

### 補足

* サーバの設定によって時間が標準時（GMT+0）になってたりするので注意してください。
* mod_rewrite公式ページの説明では、比較演算子として `>=` や `<=` が使えると書いていましたが、私の環境では何故かうまく動きませんでした..
org-modeの使い方例

# org-modeの使い方例

## MOTIVATION

タスク管理ってみんなどうしているか気になったので、自分のやり方を晒してみました。
（特にorg-modeを使った）タスク管理については他の人はどんな感じでやっているのでしょうか？

前提として、チケット駆動での開発・運用を想定しています。

## 構成
    ~/
      project/               orgで管理するプロジェクト用ディレクトリ
             daily.org       日々の定常作業を記録
             project.org     今週のプロジェクト作業を記録
             old.org         過去のプロジェクト作業の記録
      memo.org               プロジェクト以外のメモ

  project.orgが肥大化してくると、カーソルの移動だけで1分くらいかかってしまう状態になるため、過去分をold.orgに移動しています。
  （その分、old.orgを見るときは重くなりますが、過去の作業は基本的にgrepで見るのであまり問題にはなっていません）

## 設定
### emacs
以下のことを設定しています

*  プロジェクト作業が発生した際に、 C-c c p で project.org に作業を追加
*  メモしたいことがあれば C-c c m で memo.org に追加
*  Agenda は ~/project の org ファイルを参照

```el:init.el
;; capture templates
(setq org-capture-templates
      '(("p" "Project Task" entry (file+headline (expand-file-name "~/project/project.org") "Inbox")
             "** TODO %?\n    %i\n    %a\n    %T")
        ("m" "memo" entry (file (expand-file-name "~/memo.org"))
             "* %?\n    %i\n    %a\n    %T")))

;; agenda
(setq org-agenda-files (list (expand-file-name "~/project")))
```

### それぞれのorgファイル
http://members.optusnet.com.au/~charles57/GTD/gtd_workflow.html
の設定を参考にしています。

```
* org-mode configuration
  - これを書いておくと、configurationをまとめて出したり消したりできるため、書いています。
#+STARTUP: overview
- トップレベルの見出しのみ表示
#+STARTUP: hidestars
- 先頭の星印を表示しない
#+STARTUP: logdone
- DONEになった日時をメモ
#+TODO: TODO(t) STARTED(s) WAIT(w) | DONE(d!) CANCEL(c!)
- 状態は5つ
#+TAGS: PROJECT_A(a) Project_B(b) project_c(c)
- プロジェクトの増減にあわせて追記します
```

## はじめ方

### 月曜日
- C-c a a でアジェンダを表示
- 月曜日のタスクを確認
    - 先週のDONEを移動
    - 今週の予定を記入

![org.png](https://qiita-image-store.s3.amazonaws.com/0/13469/4aa2d53d-0f55-9a28-1c61-223ff02eb28a.png)


#### 先週のDONEを移動
project.org の中で、DONEステータスになったものを old.org に移動させます。
1ファイルが大きくなると動作が重くなるため、終わったものは移動です。

#### 今週の予定を記入
定常作業やチケット管理されていない作業を daily.org に書き込みます。
今週分とありますが、来週の月曜日分もわかるものはこのタイミングで書いておきます。

### 朝
C-c a a でアジェンダを表示し、今日の作業を確認します。

### タスク追加
C-c c p でプロジェクトにタスクを追加していきます。
その際、 C-c C-s でスケジュールを入力します。
期限がわかっている場合は C-c C-d で期限を入力します。
タスクの記入が完了したら C-c C-c で project.org に書かれます。
その後、ヘッダで C-c C-c を押すことでタグを設定できます。

### タスク開始
タスクを始める際は、時間を記録するために C-c C-x C-i を押します。
また、 C-c C-t s で状態を STARTED にします。

### タスク中断
タスクの途中で別のタスクが割り込んで発生してきた場合や、
期間内に終わらずにミーティングなどが始まる場合は、
C-c C-x C-o でいったん時計を止めておきます。
またはアジェンダを表示しているときに O （Shift + o）を押します。

### タスク終了
タスク完了時には、 C-c C-t d で状態を DONE にします。
これで CLOCK も自動で終了になります。

### 帰宅時
C-c a a でアジェンダを表示させ、終わっていないタスクがないことを確認します。
期限が過ぎているタスクなどについて、優先度やスケジュールの見直しを行います。

### 週次報告
C-c a a でアジェンダを表示させ、 R で clockreport を表示させます。
バッファの下側に何に何時間かかっているかが表示されます。
どの作業を終わらせたか、終わっていない作業はどんな状況か、などの報告をまとめます。

### 月次報告
C-c a a でアジェンダを表示させ、 v m で月単位の表示にし、最後に R で clockreport を表示させます。
バッファの下側に何に何時間かかっているかが表示されます。
請求すべき作業等があれば、これで時間を確認することができます。

## どんなことを書いているか

- 開発
    - 動くか確認したSQL
    - 設計、製造にかんするメモ
- テスト
    - データ積み込み用のSQL
    - データ検証用のSQL（2回目以降も動かしたいため）
- 保守
    - 調査に使用したSQL
    - 調査結果（JIRAやRedmineなどに記載する内容）
NSAttributeTextを使って、テキストの英数字と日本語のフォントを別々に適用して完成度をアップ！

アプリではフォントの選択も重要な要素になるため、デフォルト以外のフォントの活用も非常に行うと思います。

ただし、適応したいフォントによっては、英字の場合と日本語のテイストがいまいちしっくりこないことが多々あるかと思います。
そこでNSAttributeを使って、一部だけ別のフォントを当ててみることにします。
たとえば,UILabelにそのような処理を組み込みたい場合、

```objc

-(void)updateAttributeText{
    if(self.text == nil){
        return;
    }
    
    NSError *error;
    // スタイルを引き継ぎ・
    NSMutableParagraphStyle *paragrapStyle = [[NSMutableParagraphStylealloc] init];
    paragrapStyle.alignment = self.textAlignment;
    paragrapStyle.lineBreakMode = self.lineBreakMode;
    
    
    NSDictionary *attr = @{
                           NSStrokeColorAttributeName :self.textColor, NSFontAttributeName:[UIFontsystemFontOfSize:self.font.pointSize],NSParagraphStyleAttributeName:paragrapStyle};
    
    
    NSMutableAttributedString *attrStr = [[NSMutableAttributedStringalloc] initWithString:self.textattributes:attr];
    
    
    // 正規表現で英数字を抜き出す。
    NSRegularExpression *regexp = [NSRegularExpressionregularExpressionWithPattern:@"([a-zA-Z0-9]+)"options:0error:&error];
    if (error == nil) {
        NSArray *arr = [regexp matchesInString:attrStr.string options:0 range:NSMakeRange(0, attrStr.length)];
        for (NSTextCheckingResult *match in arr) {
            //別のフォントを適用
            [attrStr addAttribute:NSFontAttributeName
                            value:[UIFont fontWithName:@"Arial Rounded MT Bold" size:self.font.pointSize]
                            range:[match rangeAtIndex:1]];
        }
    }
    // attributedtextを設定
    self.attributedText = attrStr;


}
```
と行った処理であとは適宜このメソッドを呼べば、個別にフォントを出し分けた形で表示することが可能です。

細かなところまでの調整でアプリの完成度が違ってくるため、こだわってアプリを作り込みましょう！
[Apache]mod_rewireにおけるクエリ文字列の切り出し方法


mod_rewrite の RewriteRule ディレクティブの引数一つ目（遷移元URL）では、URLのクエリ文字列は評価されません。
例えば次のような書き方はできません。

```apache:.htaccess（NGな例）
RewriteEngine on

RewriteRule ^test.html?hoge=AAA /test2.html [L]
```

よって、クエリ文字列をURLの書き換え条件としたい場合は、いったん次のように切り出しておくと便利です。

```apache:.htaccess
RewriteEngine on

RewriteCond %{QUERY_STRING} (^|&)hoge=([^&]+)($|&)
RewriteRule .* - [E=X_QUERY_HOGE:%2]
```

上記の例では、クエリ文字列のキー `hoge` の値を、環境変数 `X_QUERY_HOGE` にセットしています。
クエリ文字列ですので、キーがそれ以外も指定されることを考慮する必要があります。

例：`http://example.com/test.html?hoge=1&piyo=2&fuga=3` .. 引数1つ目に`hoge`
例：`http://example.com/test.html?piyo=2&hoge=1&fuga=3` .. 引数2つ目に`hoge`
例：`http://example.com/test.html?piyo=2&fuga=3&hoge=1` .. 引数3つ目に`hoge`

よって `(^|&)` でクエリ文字列の「先頭」もしくは「&の後」とし、同様に `($|&)` でクエリ文字列の「最後」もしくは「&の前」とすることで、キーが複数指定された場合でも正確に切り出すことができます。

後は環境変数 `X_QUERY_HOGE` の値を判定してURLの書き換えをすればOKです。

```apache:.htaccess
RewriteEngine on

RewriteCond %{QUERY_STRING} (^|&)hoge=([^&]+)($|&)
RewriteRule .* - [E=X_QUERY_HOGE:%2]

RewriteCond %{ENV:X_QUERY_HOGE} ^AAA$
RewriteRule ^test.html$ /test2.html [L]
```

また下記は、URLの書き換えではありませんが、クエリ文字列 `hoge=AAA` がなければアクセス禁止（403エラー）とする例です。

```apache:.htaccess
RewriteEngine on

RewriteCond %{QUERY_STRING} (^|&)hoge=([^&]+)($|&)
RewriteRule .* - [E=X_QUERY_HOGE:%2]

RewriteCond %{ENV:X_QUERY_HOGE} !^AAA$
RewriteRule .* - [F]
```

これら以外にも、次のような用途でも利用できます。

* リダイレクトする際に、引き継ぐクエリ文字列を絞る
* Apacheのログに特定のクエリ文字列を記録する
 * CustomLog 設定で、切り出した環境変数を指定
[Java]ストリームとは何か？

自分用のまとめ
間違いあればご指摘いただけると嬉しいです！

Stream
----------
データを"バイト単位で" read, writeできる物
バイト単位以外の読み書きは不可能
JavaではStreamというクラスはない。
後述のInputStreamとOutputStreamに分かれている。

InputStream
--------------
readのみできるstream

OutputStream
---------------
writeのみできるstream

ストリームで何を読み書きするのか？
---------------------------------
プログラミングにおいて読み書きするものなら何でもストリームで！
ファイル、キーボード入力、ソケット、配列など

バッファリングとは？
-------------------
1バイトずつ読み書きしていると入出力の処理が多くなりすぎてパフォーマンス悪い
→一定たまるまでメモリに貯めて、一定たまったらOSに読み書き命令を出す
→これがバッファリング

一定貯まる前でも強制的に書き込みをするのはflush()というメソッド。

バッファリングを実装した物
------------------------
- BufferedInputStream
- BufferedOutputStream

読み書きが便利になるクラス
-------------------------
バイト単位では面倒な時のために文字単位で読み書きするクラスがある

バイトと文字の違い

- バイト：0x00～0xFFのみ
- 文字（2バイト): 0x0000〜0xFFFF

Reader
-----------
ストリームからバイトではなく"文字単位"で読む物

Writer
----------
ストリームからバイトではなく"文字単位"で書き込む物

BufferedReader
------------------
Readerにバッファリングをつけたもの

BufferedWriter
-----------------
Writerにバッファリングをつけたもの
Vimですべてのバッファをタブ化する

まとめ
=====

参考(Stack Overflow): [Vim: Open each buffer in a new tab] (http://stackoverflow.com/questions/5481028/vim-open-each-buffer-in-a-new-tab)

これを

![Screenshot_from_2014-03-07 00:48:54.png](https://qiita-image-store.s3.amazonaws.com/0/37937/f3d747d2-016b-54fc-0bf6-fc10fbe3fada.png)

こうしたい。

![Screenshot_from_2014-03-07 00:51:04.png](https://qiita-image-store.s3.amazonaws.com/0/37937/3ed73d0b-e61c-7808-c89b-66e62491702e.png)



以下のどちらかで可能です。

```vim
:bufdo tab split
```

```vim
:tab ba
```

これなにしてんの？
================

1つ目の例は以下2つのコマンドの組み合わせです。

## :bufdo

後続コマンドをすべてのバッファに対して実行します。

## :tab split

現在のバッファを新しいタブで開きます。


もうひとつの例はballコマンドの機能です。

## :sba[ll]　もしくは :ba[ll] もしくは :sun[hide]

バッファリストにあって、メモリにロードされているもの全てにウィンドウを割り当てます。
**tabをつけると新しいウィンドウがそれぞれタブで**開きます。
ballとunhideは、ballの場合Buf/Win Enter/Leaveオートコマンドを実際に該当タブを表示した時に実行する点が違うようです。

単純に:baすると、以下のようにすべてのバッファが表示されるように:splitされます。

![Screenshot_from_2014-03-07 00:53:29.png](https://qiita-image-store.s3.amazonaws.com/0/37937/9c9a6e86-4b78-e5a6-3072-49581e9f68dd.png)


指定したバッファを新しいタブで開きたい場合
-------------------------------------

```vim
:tabnew | b [N|バッファ名]
```

実際によく使いそうなのはこっちかもしれませんね。
ついでに、タブを多用する向きは左右キーやスペースでタブ移動できたほうが楽かもしれません。

```vim
map <Space> :tabn<CR>
map <S-Space> :tabp<CR>
map <Left> :tabp<CR>
map <Right> :tabn<CR>
```
ClojureでJsoupをラップしてみた

# スクレイピング

Clojureでスクレイピングといえば既に`Enlive`があるのだけれど
jQueryライクな表記はClojureのシンボルでは限界あるので
ひとまずJavaのライブラリであるところの`Jsoup`をラップしてみた

[emanon-was/cljsoup](https://github.com/emanon-was/cljsoup "emanon-was/cljsoup")


# 使ってみる

1 . 準備


```clj

user> (use 'cljsoup.core)
nil

```

2 . URLから取ってきたHTMLをparseする

```clj

user> (def x (parse (url "https://github.com")))
#'user/x

user> x
#<Document <!DOCTYPE html> ... >

```

3 . Javaのクラスのままでは扱いにくいのでマッピングする

```clj

user> (nodes x)
({:type :dtd, :data ["html" "" ""]} "\n" {:tag :html, ...})

```

4 . CSSセレクタを使う

```clj

user> (select x "input[type=text][name=q]")
(#<Element <input type="text" data-hotkey="/ s" name="q" ...>)

user> (nodes (select x "input[type=text][name=q]"))
({:tag :input, :attrs {:type "text", :data-hotkey "/ s", :name "q", ...})

```

5 . 手続き的に属性(今回はname)を取ってくる

```clj

user> (-> x (select "input[type=text]") (attr "name"))
("q" "user[login]" "user[email]")

```

6 . HTMLを編集する(要素の直後に&lt;div&gt;test&lt;/div&gt;を挿入)

```clj

user> (transform x "input[type=text]" (append (html [:div "test"])))
#<Document <!DOCTYPE html> ... >

```

7 . Javaのクラスから文字列に戻す

```clj
user> (parse x)
"<!DOCTYPE html> \n<html> \n <head ... "
```


# まとめ

前回書いたdefstrictマクロを盛りまくってディスパッチしまくり
徐々にこれを拡張していってテンプレートエンジンまで持っていきたい
PHPの文字列

はじめまして、ukisoftです。
サーバって何ですか？の状態から勉強を始めて、もうすぐ1年になります。
手当たり次第勉強して、あまり成長したような気がしないので、始めて3ヶ月目くらいのPHPに集中してリソース投下することに決めました！
というわけで、色々晒して、自分の成長の加速度上げたいと思ってます(・ω<)

初心者なので、まずは文字列で知ったことをまとめます。

PHPでは、文字列を、

```php
$str = 'どうも、僕です。';
```

こんな感じで生成できるのですけど、

```php
$name = 'ukisoft';
$str = "どうも、$nameです";
```

と書くことで、変数を展開してくれます。
ただ、上記は"$nameです"が変数名と解釈されるので上手く動きません。
で、ここからが知らなかったことなのですけど、なんと、

```php
$name = 'ukisoft';
$str = "どうも、{$name}です"; // どうも、ukisoftです
```

というように、{}で囲むと"$name"と解釈してくれるのです！
ちなみに、

```php
$str = "{}";
```

は、セフセフ。

```php
$str = "{$}";
```

は、アウアウです。

あと、ヒアドキュメントってありますよね。
僕、ほとんど使ったことないのですが、少しだけハマったので、共有しておきます。

```php
$str = <<<EOL
どうも、僕です
EOL;
var_dump($str);
```

これだと動くのですけど、

```php 
var_dump(<<<EOL
どうも、僕です
EOL;
);
```

これだとエラー出ちゃいます。
なんでかなーと調べたところ、後ろのEOLの後のセミコロンが不要でした。

```php 
var_dump(<<<EOL
どうも、僕です
EOL
); // ok
```

ちなみに、これもダメです。

```php 
var_dump(<<<EOL
どうも、僕です
EOL);
```
単純なRejection-Freeアルゴリズム


いつも実装しようとして詳細を忘れていて困るのでメモ。

以下のようにあるコレクションに対して確率 $p$ で何かのイベントを発生させるとする。

```cpp
for( int i=0; i < N; i++) {
  if( rand() < p ) { DoSomething(a[i]); }
}
```

もし $N \gg 1$　かつ $p \ll 1$ のときには、ほとんど何もイベントが起きないにも関わらず要素の数だけ乱数をふることになり効率が悪い。

そこで全ての要素に対して乱数をふる代わりに次にイベントが起きる要素を乱数で選ぶようにする。

0から数えて`N`番目の要素の時に初めてイベントが起きる確率は、[0..N-1]の間が確率(1-p)でNの時に確率pになるので

```math
P(N) = (1-p)^{N} p
```

となる。
乱数から確率分布 $P(N)$ に従う乱数を発生させるために累積分布関数 $C(N)$ を計算する。
$P(N)$の累積分布関数$C(N)$は

```math
C(N) = \sum_{0}^{N} (1-p)^{N} p
     = 1 - (1-p)^{N+1}
```

$[0,1]$ の乱数が $[C(N-1), C(N)]$ の時に入ったときに $N$ になるようにすれ $P(N)$ に従う確率分布で乱数が発生することになる。

$[0,1]$ の乱数を $r$ とすると

```math
(1-p)^{N+1} < 1-r < (1-p)^{N}
```

の間に事象Nが発生する。rと1-rはともに$[0,1]$の乱数なので 1-r->r と置き換えて

```math
N < \frac{\log r}{\log (1-p)} < N+1
```

つまりこんな感じのコードになる。

```cpp
while(true) {
  size_t idx = 0;
  size_t N = static_cast<int>( log(rand()) / log(1-p) );
  idx += N;
  if( N >= a.size() ) { break; }
  DoSomething(a[idx]);
  idx += 1;
}
```

- もしかしたらindexが１つずれてたりするかもしれませんが自己責任で。。。
- pが0や1だと動きません。