OmniAICreator/Qiita-1.07M huggingface dataset:
lamp

# VagrantでLAMP環境構成

※ 構成
- vagrant1.7
- centos6.6
- apache
- mysql
- php5.3
- phpmyadmin

ディレクトリを作る。
`mkdir centos66`

ディレクトリの移動
`cd centos66`
## vagrantfileを作成
`vagrant init centos66`
* 変更箇所

```ruby
<filename:Vagrantfile>

Vagrant.configure(2) do |config|

  config.vm.box_url = "https://atlas.hashicorp.com/chef/boxes/centos-6.6-i386/versions/1.0.0/providers/virtualbox.box"
  config.vm.box = "centos66"

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

##vagrantを立ち上げてリストを確認
`# vagrant up`

## スーパーユーザーに変更(root化)
`su`

## システムのアップデート(必須)
`yum -y update`

## Git, Vimのインストール(vimは良く使用する)
`yum -y install git vim`


## PHP関連

### PHPインストール

`yum -y install php php-mbstring php-mysql`


### php.iniの編集

`vim /etc/php.ini`
(※編集前に`~/.vimrc`を設定していると便利。`set number`など)
* 変更箇所

```ini
- display_errors = Off
+ display_errors = On 

- ; date.timezone = ""
+ date.timezone = "Asia/Tokyo"

- ;mbstring.language = Japanese
+ mbstring.language = Japanese
```

## Apache関連(httpd)

### httpdインストール(既に入っている)
ディレクトリを作る。
`mkdir /vagrant/www`
### httpd.confの編集
`vim  /etc/httpd/conf/httpd.conf`
* 変更箇所

```ini
- DirectoryIndex index.html index.html.var
+ DirectoryIndex index.html index.html.var index.php

    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
+ AddType application/x-http-php .php

- DocumentRoot "/var/wwww/html"
+ DocumentRoot "/vagrant/www"
```

## SESSIONの権限を有効にしておく
`# chmod 777 /var/lib/php/session/`

変更後、
`service httpd restart`サービス再起動
`chkconfig httpd on`    サービスに登録

## PHP仮想環境をブラウザで確認

ソースを作成する
`vim /vagrant/www/ index.php`
```php
<?php
echo"あいうえお漢字";
phpinfo();
?>
```
[http://192.168.33.10/index.php](http://192.168.33.10/index.php)をURLバーに入れて試験。
ブラウザにPHP画面と文字化けが無く、正常に動作確認できたらOK!

## MySQL関連

### MySQLのインストール
`# yum -y install mysql-server`

### my.cnfの編集
`# vim  /etc/my.cnf
* 変更箇所
```ini
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
default-character-set=utf8
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysql]
default-character-set=utf8
```
変更後、
`service mysqld start`サービスをスタート
`chkconfig mysqld on`    サービスに登録
### ユーザー root のパスワードを変更する場合
`# mysqladmin -u root password ○○○○`
▽ログインする
`# mysql -u root -p`
`# password: ○○○○`
▼ログアウトする
`# mysql> exit`

## PhpMyAdminをインストールする
* 準備として、
tmpフォルダーを作り、
`mkdir ~/tmp`
tmpに移動して、
`cd ~/tmp`
Web上からインストールします。
`# wget http://jaist.dl.sourceforge.net/project/phpmyadmin/phpMyAdmin/4.0.10.9/phpMyAdmin-4.0.10.9-all-languages.zip`
そこにダウンロードして圧縮解凍ソフトunzipを使用。(`yum -y install unzip`)
`# unzip phpMyAdmin-4.0.10.9-all-languages.zip `
lsコマンドで解凍後の`phpMyAdmin-4.0.10.9-all-languages`を確認。

* ドキュメントルート”/vagrant/www”に移動させる時、ファイル名をphpmyadminに変更させる。
`# mv -rf phpMyAdmin-4.0.10.9-all-languages/ /vagrant/www/phpmyadmin`


## PhpMyAdminをブラウザで確認

[http://192.168.33.10/phpmyadmin](http://192.168.33.10/phpmyadmin)をURLバーに入れて試験。
ブラウザにPhpMyAdmin画面が表れ、試しにデータベースを作って正常に動作確認できたらOK!

ーーー
IPA による「SSL/TLS暗号設定ガイドライン」

[IPA] から「[SSL/TLS暗号設定ガイドライン](http://www.ipa.go.jp/security/vuln/ssl_crypt_config.html)」が公開されている。一般ユーザ向けの軽いもの（ルータやブラウザの設定とか）と思ったらさにあらずで， [CRYPTREC] の手によるかなり詳細な内容だった。

このサイトに来られる人はエンジニアの方が多いと思うので，一度目を通しておくことをお勧めする。 [IPA の示すセキュリティ要件を怠ったせいで多額の賠償金を払わされた例](http://www.baldanders.info/spiegel/log2/000797.shtml)もあるのでセキュリティにはお気をつけあれ。

内容はこんな感じ（[公開ページ](http://www.ipa.go.jp/security/vuln/ssl_crypt_config.html)より抜粋）

- 第1章と第2章は、本ガイドラインの目的やSSL/TLSについての技術的な基礎知識をまとめています。
- 第3章ではSSL/TLSサーバに要求される設定基準の概要について説明しています。
- 第4章から第6章では、第3章で定めた設定基準に基づき、プロトコルバージョン、サーバ証明書、暗号スイートについての具体的なSSL/TLSサーバの要求設定項目について示しています。ここでの要求設定項目は別紙のチェックリストで確認が求められる項目となります。
- 第7章では、チェックリストの対象には含めていませんが、SSL/TLSを安全に使うために考慮すべきことをまとめています。
- 第8章は、クライアントの一つであるブラウザの設定に関する事項を説明しており、ブラウザの利用者に対して啓発するべき事項を取り上げています。
- 第9章は、そのほかのトピックとして、SSL/TLSを用いたリモートアクセス技術（“SSL-VPN”とも言われる）について記載しています。
- Appendixには、4章から6章までの設定状況を確認するためのチェックリストや、個別製品での具体的な設定方法例を記載しています。

チェックリストは PDF および Excel で提供されている。参考にされるとよいと思う。

[IPA]: https://www.ipa.go.jp/ "IPA 独立行政法人 情報処理推進機構"
[CRYPTREC]: http://www.cryptrec.go.jp/ "CRYPTREC"
MySQLのauto_incrementのカラムで飛ばされた番号を調べたい

MySQLのauto_incrementは、レコードを追加するときに自動で連番をふってくれる便利な機能ですが、トランザクションが失敗したりすると、連番が飛ばされて番号が歯抜けになることがあります。

この歯抜けになった番号を調べるためのSQLが次になります。

```sql
SELECT t1.id - 1 FROM mytable t1 LEFT JOIN mytable t2 ON t1.id - 1 = t2.id WHERE t2.id IS NULL 
```

このSQLは「[mysql - how find "holes" in auto_increment column? - Stack Overflow](http://stackoverflow.com/questions/10189285/how-find-holes-in-auto-increment-column)」を参考にしました。
000 - Blocklyを使ったオリジナルVisual Programming Editorを作ってみる


## はじめに
業務用の開発ツールとしてVisual Programmingを導入したいと思っていました。[前回](http://qiita.com/heyhachi/items/3289f1fc59076d068c4b)色々と調べて、本来の目的である「非プログラマーにプログラミングしてもらって楽をする」に到達するまでが早そうなBlocklyをカスタマイズする事に挑戦してみます。

未熟なJavaScriptスキルでどこまでやれるか…。

## Blocklyを俺色に染めるための準備
さて、まずは開発環境を整えます。自分の開発環境は以下のとおり。

* Mac OSX Yosemite 10.10.3
* Chrome 42.0.2311.152(64bit)
* Python 2.7.6

作業ディレクトリのルートは**google**という名前のディレクトリとします。
Windowsでは試していませんが、同様の手順で環境が整うかもしれません。

### Blocklyのインストール
先ずはBlocklyをインストールします。インストール手順は[公式ページに書かれているの手順](https://developers.google.com/blockly/installation/overview)に従います。私はGitHubから持ってきました。

### Closureのインストール
BlocklyのビルドにClosureのライブラリが必要なのでインストールします。配置する場所はBlocklyのディレクトリと同じ階層にします。

![ディレクトリツリー](https://developers.google.com/blockly/hacking/closure-directory.png)

こちらも詳細は[公式ページに掲載されています](https://developers.google.com/blockly/hacking/closure)。

### Pythonのインストール
OSXであれば最初から入っていると思うので省略します。必要があればHomebrew等から手に入れましょう。

## ビルドしてみる
ここまで整ったらターミナルからgoogle/blocklyへ移動します。そこでbuild.pyを走らせればビルドが始まります。

```shell-session
cd google/blockly
python build.py
```

エラー無くビルドが完了すれば開発環境はひとまず整いました。お疲れ様でした。次はBlocklyの動作確認をしていきたいと思います。
VagrantでUbuntuにSwapを4GBほど追加したい

複数のScalaのプロジェクトを、Ubuntu上で同時に起動するような開発していると、メモリが512MB程度では到底足りず、ScalaのビルドツールであるsbtのプロセスがOOM Killerに殺されてしまいがちです。

VagrantでVMのメモリを4GBくらい追加してもいいですが、そうなるとフルカスタムのMacBook Proがないと開発に参加できない…といった状況になってしまい、開発のハードルが上がってしまいます。

そこで、VMにメモリを追加するのではなく、swap領域を増やしてScalaのプロセスが終了されないように、VagrantでUbuntuをプロビジョンするようにします。

まず、swapを増やすためのプロビジョンスクリプトを作成します。このスクリプトは「[Vagrant Quickstart – jeqo's blog](http://jeqo.github.io/blog/devops/vagrant-quickstart/)」の記事のものをほぼそのまま使います。

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

# size of swapfile
swapsize=4G

# does the swap file already exist?
grep -q "swapfile" /etc/fstab

# if not then create it
if [ $? -ne 0 ]; then
  echo 'swapfile not found. Adding swapfile.'
  fallocate -l ${swapsize} /swapfile
  chmod 600 /swapfile
  mkswap /swapfile
  swapon /swapfile
  echo '/swapfile none swap defaults 0 0' >> /etc/fstab
else
  echo 'swapfile found. No changes made.'
fi

# output results to terminal
df -h
cat /proc/swaps
cat /proc/meminfo | grep Swap

```


Ubuntuにswapを追加する方法は「[Linux - Swap領域が足りないときに、ささっと追加する - Qiita](http://qiita.com/reoring/items/bd4723c8835679c05f39)」で紹介されているとおり、`dd`コマンドでスワップファイルを作成し、`mkswap`と`swapon`でスワップ領域を増やすことができます。しかし、Ubuntuが再起動してしまうと、スワップ領域が無くなってしまいます。起動するたびに、この手順を踏むのは面倒です。再起動してもスワップ領域が無くならないようにするには、`/etc/fstab`に`/swapfile none swap defaults 0 0`などを書いておきます。上のスクリプト`increase_swap.sh`は、スワップ領域を作成するだけでなく、`/etc/fstab`にスワップ領域の設定を追記することまでやってくれます。

次に、Vagrantfileに下記の行を加えます。これにより、初回の`vagrant up`時などプロビジョニングは実行されるときにswap領域が追加されるようになります。

```ruby:Vagrantfile
  config.vm.provision "shell", path: "increase_swap.sh"
```

すでにvagrant up済みのVMに対して、swapを追加するときは、Vagrantfileを修正後`vagrant provision`することで適用されるようになります。
Swiftのif文でwhereを使ったときのelseの条件

※ Swiftバージョン1.2の頃の話なのでコメント欄もご参照ください:bow:

## Whereを使ったときのelseの条件

Swift1.2からif文でwhereが使えるようになりました。
これによってネストせずにOptionalな変数をアンラップしてから中身を判定することができます。
ただ、その場合に`else`句はアンラップして中身がなかった場合なのか、whereの判定がfalseになったからなのか疑問だったので調べてみました。

```swift
func test(token: String?) {
    if let t = token where t.isEmpty {
        println("token is empty")
    } else {
        println("token is nil or not empty")
    }
}

// 結果
test("")    // -> token is empty
test("xxx") // -> token is nil or not empty
test(nil)   // -> token is nil or not empty
```

結果は、アンラップして中身がなかった場合とwhereの判定がfalseになった場合どちらもelseに入りました。（当たり前か）

## 全部場合分けするには

全て場合分けしたい場合は以下のように書けますが余計分かりにくい。。

```swift
func test(token: String?) {
    if let t = token where t.isEmpty {
        println("token is empty")
    } else if token == nil {
        println("token is nil")
    } else {
        println("token is not empty")
    }
}
```

素直に入れ子にしたほうがよさそうです。

```swift
func test(token: String?) {
    if let t = token {
        if t.isEmpty {
            println("token is empty")
        } else {
            println("token is not empty")
        }
    } else {
        println("token is nil")
    }
}
```

## switch文でやる（追記）

@Ushio@github さんからコメントで教えていただきました。
Switch文できれいに場合分けできてこれが一番見やすいですね！

```swift
func test(token: String?) {
    switch token {
    case let .Some(value) where value.isEmpty:
        println("token is Empty")
    case let .Some(value):
        println("token is Not Empty")
    case .None:
        println("token is nil")
    }
}

test("")
test("token")
test(nil)

/*
token is Empty
token is Not Empty
token is nil
*/
```
OkHttpでCookieを扱う


OkHttpを使用していて、Cookieの取り扱いに困ったのでメモ。
自動でやってくれるとおもいきや動かなかったので困った。

OkHttpClientはシングルトンにして使いまわしたほうが良いとのことだったので
Applicationで生成時にCookieManagerを追加しておく。

```java:MyApplication.java
public class MyApplication extends Application{
    private static final String TAG = MyApplication.class.getSimpleName();
    private static MyApplication MY_APPRICATION;
    private static Context sContext;

    private OkHttpClient mOkHttpClient;

    public static MyApplication getInstance(){
        if(MY_APPRICATION == null){
            MY_APPRICATION = new MyApplication();
            MY_APPRICATION.setOkhttpClient();
        }

        return MY_APPRICATION;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        sContext = getApplicationContext();
        MY_APPRICATION = new MyApplication();

        Stetho.initialize(
                Stetho.newInitializerBuilder(this)
                        .enableDumpapp(
                                Stetho.defaultDumperPluginsProvider(this))
                        .enableWebKitInspector(
                                Stetho.defaultInspectorModulesProvider(this))
                        .build());

}

    public Context getsContext(){
        if(sContext == null){
            sContext = getApplicationContext();
        }
        return sContext;
    }

    public OkHttpClient getOkhttpClient(){
        if(mOkHttpClient == null){
            setOkhttpClient();
        }
        return mOkHttpClient;
    }

    private void setOkhttpClient(){
        mOkHttpClient = new OkHttpClient();
        mOkHttpClient.networkInterceptors().add(new StethoInterceptor());

        // enable cookies
        java.net.CookieManager cookieManager = new java.net.CookieManager();
        cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
        CookieHandler.setDefault(cookieManager);
        mOkHttpClient.setCookieHandler(cookieManager);
    }
}
```

##参考URL
http://qiita.com/ryugoo/items/d287c474b9dc20dae959

http://stackoverflow.com/questions/24263921/how-to-implement-cookie-handling-on-android-using-okhttp
Neo4jのパスワード初期化

認証関係のトラブルでNeo4jのウェブインターフェースからデータベースへログインできない場合があります。かなり困ったことになりますが、実はパスワードをリセットすることで簡単に対応できます。

#認証関係のトラブルの原因について

Neo4jは、ユーザー名とパスワードによるベーシック認証で、ログインできない理由はパスワードの間違いの可能性が高いです。

* 次のような状態は、おそらく、認証ファイルが壊れているか、改ざんされている可能性が高いです。

![neo4j-password-0.png](https://qiita-image-store.s3.amazonaws.com/0/69832/883ba2fe-c762-1f82-af5e-31d2ba2aa948.png)


* 次のような状態は、ユーザー名又はパスワードの間違いが原因です。

![neo4j-password-1.png](https://qiita-image-store.s3.amazonaws.com/0/69832/38e0c21a-2990-7885-c52f-20a19a04e716.png)


* 他人からもらったデータストアに認証ファイルが残っている可能性もあります。確認してみてください(dbms/auth)。


#認証ファイルを削除し、パスワードをリセットする

正しいはずのパスワードを入力してもログインできない、あるいはログイン画面さえ表示できない場合、認証ファイルを削除することでパスワードをリセットすることができます。

Neo4の認証ファイルの格納場所は、ラインセンスによって異なります。

* エンタプライズ版及びLinuxのコミュニティ版は、インストールディレクトリの「data/dbms/auth」にあります。

```
デフォルトのデータストアは、Neo4jのインストールディレクトリのdata/graph.db/です。
```

* Windowsのコミュニティ版は、それぞれのデーターストアの「dbms/auth」に格納されています。

```
Windows Community版のデフォルトのデータストアは、「C:\Users\<MyAccount>\Documents\Neo4j\default.graphdb\」です。
```

パスワードを初期化する手順は、次の通りです。

* Neo4jサーバーをストップします。
* dbms/authファイルを削除します。
* Neo4jサーバーを起動します。このとき、初期状態の「dbms/auth」が作られます。
* ブラウザーからNeo4jのウェブインターウェースに接続します。次のように初期の接続画面が表示されるはずです。ここで「neo4j/neo4j」と入力し、「Connect」をクリックします。

![neo4j-password-2.png](https://qiita-image-store.s3.amazonaws.com/0/69832/996ff03f-ce36-052d-fdf8-0c45c88bba9f.png)

*　次の画面で新しい「Username/Password」を入力し、「Set password」をクリックします。

![neo4j-password-3.png](https://qiita-image-store.s3.amazonaws.com/0/69832/a48d9937-cf61-03eb-42b2-d9a216368135.png)

*　次ような状態になれば、パスワードのリセットは成功です。
![neo4j-password-4.png](https://qiita-image-store.s3.amazonaws.com/0/69832/f6be86be-6cf1-1ab4-a07d-09f692fcd455.png)


#まとめ
もし、認証関係のトラブルでデータベースにログインできない、というようなことが起きても慌てずに試してみてください。

**[関連記事]**
* [Neo4j-グラフデータベースとは](http://www.creationline.com/lab/7168)
* [Cypher Query Language(QL)-構成要素編](http://www.creationline.com/lab/7577)
* [Cypher Query Language(QL)-初級編](http://www.creationline.com/lab/7685)
* [Neo4j-大量データの読み込み](http://www.creationline.com/lab/8552)
リトライ処理を疎結合にできる retriable gem の使用例

次のコードは、

```ruby
retries = 0
begin
  1 / 0 if retries < 2
  puts "ok"
rescue => exception
  raise if retries >= 2
  sleep(0.5 * 1.5**retries)
  retries += 1
  puts "#{retries}回目のリトライ"
  retry
end
# >> 1回目のリトライ
# >> 2回目のリトライ
# >> ok
```

retriable gem で次のように置き換えることができます。

```ruby
require "retriable"

Retriable.configure do |c|
  c.base_interval = 0.5
  c.multiplier = 1.5
  c.on_retry = -> exception, try, elapsed_time, interval {
    puts "#{try}回目のリトライ"
  }
end

Retriable.retriable do |i|
  1 / 0 if i <= 2
  puts "ok"
end
# >> 1回目のリトライ
# >> 2回目のリトライ
# >> ok
```
[Swift][OpenGL] swiftでNSOpenGLViewを動的に作成する方法

NSOpenGLViewを動的に作成する方法を簡単にまとめます。
所謂Programmaticallyに作成する、もしくはwithout Interface Builderと巷で言われているものです。

#単純にview上に作成する

これは、他のオブジェクトと似たやり方です。

```C:view

//1)NSOpenGLViewを作成
let gl = (NSOpenGLView(frame: CGRectMake(10,10,100,100),pixelFormat:nil)!)
//2)NSOpenGLView内に描写する為のクラスをインスタンス化
let gltest = OpenGLMainViewer(frame:CGRectMake(10,10,100,300),processID:"MainViewer")

//3) 2)のクラスで描写した内容をNSOpenGLViewに渡す
gl.addSubview(gltest!)  
//4)最後に、NSOpenGLViewをviewcontoroller上に追加する
self.view.addSubview(gl)

```

1)の時に、pixelFormatはnilでOKです。
pixelFormatは、OpenGLMainViewerクラス内で定義しています。

#Scroll View上に作成する

複数のNSOpenGLViewをScroll View上に作成して、スクロールしたい場合に有効

```C:view

@IBOutlet weak var scroll: NSScrollView!
self.scroll.documentView! = gl

```

このとき、self.view.addSubview(gl)とself.scroll.documentView! = glを併用すると、後に書いた方のみが有効になる。

```C:view
//無効
self.view.addSubview(gl)

//有効
self.scroll.documentView! = gl

```
しかしながら、以下のように書くと作成されない...

```C:view

self.scroll.addSubview(gl)

```

この場合、
scrollViewを動的に作成、そこにdocumentViewでNSOpenGLViewを格納し、その上で動的に作成したscrollViewをaddSubViewに格納すると良い。

```C:view

//NSOpenGLView作成
var gl = (NSOpenGLView(frame: CGRectMake(100,100,300,100),pixelFormat:nil)!)
//描写内容        
 var gltest = OpenGLMainViewer(frame:CGRectMake(100,100,300,100),processID:"MainViewer")
//描写内容をNSOpenGlViewに格納    
gl.addSubview(gltest!)
        
//scroll viewを作成
var scroll1 = NSScrollView(frame: CGRectMake(100,100,300,100))
//scroll viewにNSOpenGLViewを格納
scroll1.documentView = gl

//scroll1 を　大元のscroll viewにaddSubView!
self.scroll.addSubview(scroll1)
```

他に何か良いやり方がありそうな...
UICollectionViewのセルサイズ調整

よく忘れるので。

##デバイスサイズに応じてUICollectionView内のセルサイズを変更したい場合の方法。

```どこぞのViewController
//UICollectionViewDelegateFlowLayoutプロトコルを指定しておきます。
class HogeViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
...

// 希望のセルサイズを返す
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    return CGSizeMake(self.view.frame.size.width/2-12, 180)
}
```
JavaScript 巻き上げについて

# 妹

妹から「巻き上げについて説明して！」（妹いないけど）って言われたのでわかりやすいコードを書くよ。

まずはこれ。

```js
var global = "foo";

var hoge = function(){
  console.log(global);
  var global = "bar";
  console.log(global);
}

hoge();
```

結果は

```js

// undefined
// bar
```

まず、foo が表示されて次に bar が表示されると思ったそこの妹思いのエンジニアさん、はっきりと申し上げておきますが妹ってのは空想上の生き物です。

# foo を表示させるには

一発目の console.log(global) に this を付け加えてやる。

```js
var global = "foo";

var hoge = function(){
  console.log(this.global);
  var global = "bar";
  console.log(global);
}

hoge();
```

すると

```js
// foo
// bar
```

に。

# え、そうだったっけという人向けに

this が無くても、これで foo は表示される。

```js
var global = "foo";

var hoge = function(){
  console.log(global);
}

hoge();
```

何が違うのかっていうと、「同一スコープ内で同じ変数名の変数が宣言されていない」っていうこと。

逆に、同一スコープ内で同じ変数名の変数があると「巻き上げ」られて、「**その変数は宣言済み**」として認識されるよ

なので最初のコードは


```js
var global = "foo";

var hoge = function(){
  var global = undefined;
  console.log(global);
  var global = "bar";
  console.log(global);
}

hoge();
```

と同じ振る舞いになる。

# こんな自体に陥らないために

使用する変数は前もって宣言しておくのがベストだそうです。

それと、普段から妹へはお菓子（たけのこの里、カール['カレーがけ'])を振る舞っておけばこんなことにはなりませんね
【楽しいTealium その1】未対応タグの配信方法


# Tealiumとは
http://tealium.com/
海外でシェア拡大中のタグマネージャー。速度が売り。
対応タグは750以上と多いが、日本企業のタグはまだ少ない。

そのようなTealium未対応のタグをTealiumで配信する方法のメモ。

# 方法1: 外部JSをロードする
配信したいタグがJSの単体ファイルとして置いてある場合に使える手法。

Tag Marketplaceから「Tealium Generic Tag」を選択。
TypeはScriptにして、JSのURLを入力することにより配信可能。

ちなみに同様の方法で画像やiframeタグも配信可能。

# 方法2: テンプレートを編集する
```html:
<script type="text/javascript">
...処理内容...
</script>
```
このようにタグ自体に処理内容をベタ書きしてある場合に使える手法。

Tag Marketplaceから「Tealium Custom Container」を選択・追加し、一旦Save/Publish.
タグ一覧から今追加したタグのEditを開き、Advanced Settings内のEdit Templates.
エディターが起動するので、`/* Start Tag Sending Code */`の部分にタグスクリプトを記述する。

配信スクリプトを直接編集できるので自由度が高い。

# どちらが良いか？
Tealiumは3種類のCDNの切り替え等、速度対策に力を入れているらしい。
ところが方法1を適用して外部JSをロードするようにすると、そのJSのロード時間に影響されてしまう。

よって、Tealiumの性能を活かしたいなら方法2がオススメ。

# 外部JSとベタ書きスクリプトを両方使ってるタグの場合は？
```html:
<script type="text/javascript" src="http://XXX.js"></script>
<script type="text/javascript">
...処理内容...
</script>
```
こういうタグの場合はどうすればいいのか…

Tealiumの性能を活かしたいなら、XXX.jsの中身を丸っとコピーし、
全てCustom Containerのテンプレート内に記述。

ただしタグベンダーによるJS修正が行われる度に対応が必要となる。

それを避けるのであれば、XXX.jsはGenericタグ、ベタ書き部分はCustom Containerで配信？
（このあたりは検証中。。。）
Selenium,IEWebDriverでのテストが実行できない場合の対処方法


# 概要
http://qiita.com/takky/items/9a2c1dc36c1a729c56cb
でseleniumIDEで作ったテストケースでchrome、IEでもテスト実行するのを書いたが、
その中でIEの動作がうまくいかないことがあったので、記載する。


以下の設定漏れがの可能性があるので見直す。

# 保護モード
ツール→インターネットオプション→セキュリティタブで保護モードを有効にするにチェックが入っていることを確認する。

# レジストリ
IE11の場合レジストリの追加がされているか確認する。
プログラムの「ファイルと検索」から
regedit.exeを開いて
\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BFCACHE
があるか。
また、iexolorer.exeがREG_DWORDで0になっているか。

# 更新プログラム
コントロールパネル→プログラム→プログラムと機能→インストールされた更新プログラム
のMicrosoft Windows の赤に Microsoft Windows (KB3025390)
がないことを確認。
あると、動かないようなのであった場合はアンインストールする。

#参考
http://tono-n-chi.com/blog/2015/01/selenium-webdriver-ie11-nosuchelementexception/
[Rails] config/routes.rbでのnamespaceとscopeの違い

忘れがちなので、メモ。

# namespace

```rb
namespace :api do
  get '/test' => 'tests#index'
end

=>
GET  /api/test(.:format)    api/tests#index
```

# scope

```rb
scope :api do
  get '/test' => 'tests#index'
end

=>
GET  /api/test(.:format)    tests#index
```
MongoDBでCollectionの最新分ドキュメントをサクッと取得したいとき


インサートされた順にドキュメントが（だいたい）並んでいます。
このnatural orderの逆から、30件取得するには次のように書きます。

```ruby:
col.class # => Mongo::Collection
res = col.find( {}, sort: { "$natural"=> -1 }, limit: 30 ).to_a
```

自分はドキュメントに日付を書いておくことが多いので、
「あれ、このコレクションてちゃんと更新して使ってるやつだっけ？」
と思った時などに叩いています（汗）

## Collectionの最終更新日付を取得する

逆natural orderからドキュメントをいくらか取り出して、値に含まれるTimeオブジェクトを集めて、それらのうち一番新しいものを最終更新時間と考えます。

```ruby
class Hash
  def hash_values
    vals = []
    values.each{|v| Hash === v ? vals.concat(v.hash_values) : vals << v }
    vals
  end
end

class Mongo::Collection
  def estimate_latest_update_time(docsize=10)
    res = find( {}, sort: { "$natural"=> -1 }, limit: docsize, fields: { _id: 0 } ).to_a
    res.map(&:hash_values).flatten.select{|v| Time === v }.sort.last
  end
end
```

```ruby
col.estimate_latest_update_time
# => 2015-04-11 12:11:27 UTC
```

## 参考
mongoDBでだいたい新しい順番にドキュメントを取得する - NullPointer's Blog
http://paulownia.hatenablog.com/entry/2012/11/24/182952
Pythonでメモリリーク調べる


簡単なメモリリーク調査の作業手順渡して依頼する必要会ったのでこっちにもまとめた

guppyとかheapyとか使ってたけど、tracemallocが3.4系で標準になっていて、snapshot間の差分なんかも取れるので今後はこいつ一択で良さそう


3.3系まではpytracemallocモジュールをインストールして使う

## 使い方


### メモリ使用量のリスト見る


- https://docs.python.org/3/library/tracemalloc.html#display-the-top-10

```
import tracemalloc

tracemalloc.start()

# ... run your application ...

snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')
```

mallocでメモリを確保した行毎に確保ブロック数とサイズが出る

### 差分見る
大体これで問題の把握は事足りる


- https://docs.python.org/3/library/tracemalloc.html#compute-differences

```
import tracemalloc
tracemalloc.start()
# ... start your application ...

snapshot1 = tracemalloc.take_snapshot()
# ... call the function leaking memory ...
snapshot2 = tracemalloc.take_snapshot()

top_stats = snapshot2.compare_to(snapshot1, 'lineno')

print("[ Top 10 differences ]")
for stat in top_stats[:10]:
    print(stat)
```

mallocが走った行毎のブロック数とサイズの差分が出るので、関数実行しても開放されないメモリとかが差分として出てくる
Lambdaでワークフロー（仮）

AWSブログによるとAmazon lambdaのロードマップにJava対応が明記されている。

ついでにSWFのactivityイベントをlambdaがsubscriptionできるようになれば、ワーカーがlambda化でき、システムワークフローの実装がnoインスタンスで実現できる。

こういった要望ってあがってるのだろうか。

早く仮がとれるといいな。
Rails4で複数のチェックボックスを扱う


# ゴール

![kobito.1431474217.459692.png](https://qiita-image-store.s3.amazonaws.com/0/9186/31d3c6fe-92c7-f22f-ddb4-599d6e8ccace.png "kobito.1431474217.459692.png")

こういうフォームを作って

```
{"colors"=>["オレンジ", "イエロー"]}
```

という風に受け取ることが出来る。

## html側

今回は特にモデルを作成するわけではなく、画面でコレクションを生成して投げる形にします。(趣味でhamlで書いてます)

```ruby:edit.haml
= form_tag '/sample/confirm', method: :post do
  - %w(レッド オレンジ イエロー).each do |item|
    %label
      = check_box_tag 'sample_form[colors][]', item
      = item
  = submit_tag('送信')
```

## controller側

strong parametersを設定する

```ruby:sample_controller.rb
private

def post_params
  params.require(:sample_form).permit(
    colors: []
  )
end
```

配列を受けたい場合はこう。

p post_paramsをすると、colorsに配列が格納されているはず。

# collection_check_boxesを使ってみる
izumin5210さんに, collection_check_boxesというview helperがあることを教えて頂いたので、それでも実装してみます。
※ドキュメント的にはどうみてもActiveRecord前提なのですが、DB関係ない画面を想定しているので、ActiveModelを使います。

```rb
collection_check_boxes(method, collection, value_method, text_method, options = {}, html_options = {}, &block)
...
```

なので、collectionとその要素のvalueとtextに対するアクセサがあれば動きそう。

## controller側

サクッとcontroller側でオブジェクトを作ります

```rb:sample_controller.rb
class SampleController < ActionController::Base
  class Post
    include ActiveModel::Model

    attr_accessor :colors
  end

  class Color
    include ActiveModel::Model

    attr_accessor :name
  end

  def index
    colors = [Color.new(name: 'イエロー'), Color.new(name: 'オレンジ'), Color.new(name: 'ピンク')]
    @form = Post.new(colors: colors)
  end

  def confirm
    p post_parms
  end

  private

  def post_parms
    params.require(:sample_controller_post).permit(colors: [])
  end
end
```

## html側
```haml:sample.haml
= form_for @form, url: {action: 'confirm'} do |f|
  = f.collection_check_boxes(:colors, @form.colors, :name, :name)
  = f.submit('送信')
```

valueと表示させる内容が一緒なので、nameを渡している。

画面でイエローとピンクを選択して、postし、pした結果はこんな感じ。

```rb:result
{"colors"=>["イエロー", "ピンク", ""]}
```

## まとめ
collection_check_boxesのドキュメントを見ると

```rb:document
collection_check_boxes(:post, :author_ids, Author.all, :id, :name_with_initial)
```

こういう感じでActiveRecordなオブジェクトを前提にしているのですが、素で書くよりかは短くなりました。
バリデーションかけてリダイレクトして再表示〜とかやろうとすると、paramsからの再構成を考えないといけないですね。それはまたの機会とさせてください。

## 雑談

Railsでたまに画面を作ると、view helperの使い方を思い出す所からになりますね...
infrastructure as Code[最初の一歩]

#書き始め
試験環境や本番環境を作成するツールがあると聞いて調べ始めた...
agrant/Chef/Docker これって何ができるのかまったく理解出来ない、取りあえずやりたい事はアプリを動かす為に必要なサーバーのインストールや設定がコマンド一発で出来ると思って調べているのだが、なかなかハードルは高い。
それぞれのツールで何が出来るのかをまず理解しないと先に進めない、ネットで調べていくと私が理解すべき（必要としている機能を持っている）ツールはchefであろうというところまではたどりついた。
chefの説明を読んでいると、Vagrantが頻繁に出てくる、ここでまたつまずいた...

#まずはツールの体系を理解する
[コードによるインフラ構成管理はなぜ必要？ 今さら聞けない「Infrastructure as Code」](http://codezine.jp/article/detail/8255)

infrastructure as Codeは大きく分けて
* OSの起動を自動化するツール（Bootstrapping）
  OS install
  Cloud or VM Image Launch
* OSやミドルウエアの設定を自動化するツール（Configuration）
  System Configuration
* 複数サーバの管理を自動化するツール（Orchestration）
  Application Service Deployment

で構成され、私に必要なツールは
OSやミドルウエアの設定を自動化するツール（Configuration）
という整理が出来た。

##ツール類の分類
### OSの起動を自動化するツール（Bootstrapping）
* KickStart
* Vagrant
* Docker

### OSやミドルウエアの設定を自動化するツール（Configuration）
* [Chef](http://www.chef.io/)
* [Ansible](http://www.ansible.com/)
* [Puppet](https://puppetlabs.com/)<br>[Puppet運用テクニック](http://www.atmarkit.co.jp/ait/articles/1504/06/news008.html)
* [fabric](http://www.fabfile.org/)<br>
  シェルに毛が生えた程度らしい

### 複数サーバの管理を自動化するツール（Orchestration）
* Serf
* Capistrano

#参照サイト
* [OpenSourceProvisioningToolchain](http://mizzy.org/blog/2010/03/26/1/)
* [構成管理ツール Ansible について](http://apatheia.info/blog/2013/04/06/about-ansible/)

# あとがき
Configurationツールの説明読むと大体、Vagrantを使って...が書いてある。
これが余計話をややこしくする、インフラ系のツールはツールの分類を頭にいれて読まないと何がなんだかわからなくなってしまいますね。
Ruby on Railsでリンクで移動した時javascriptが実行されない問題

Ruby on Railsでリンクで移動した時javascriptが実行されない現象があります。

例えば、```$(document).ready```が発火しないという現象。

```js
$(document).ready( xx.. );
```
みたいなものが動かない。

これは、turbolinksが原因です。



> **turbolinksとは何なのか？**
>
>HTML5のpushStateとajaxを組み合わせてページを高速でレンダリングするための仕組み。
>turbolinksを導入するとリンクをクリックした時にGETで取得する全てのページがajaxで処理されるようになる。
>（POST、PUT、DELETEの場合はturbolinksを導入していない場合と同じように処理される。）
>
>具体的にはページ遷移が発生する時に（これはaタグがクリックされたタイミング）、
>htmlのtitleタグの中身とbodyタグの中身をajaxで入れ替え、
>ブラウザの現在のURLを遷移先のURLに、戻り先のURLを遷移前のURLに更新する。
>
>これによってページ遷移の際にheadタグの中に書かれたJavaScriptとStyleSheetの
>パースが行われなくなるので、特にJavaScriptを多用しているサイトではかなりの
>高速化になるんじゃないかと。

>ただこれは、JavaScriptとStyleSheetがアセットコンパイルされて
>どのページでも常に同じファイルを読み込むようになっているという前提なので、
>ページごとに異なるJavaScriptやStyleSheetを利用するようになっている場合は、
>そもそもturbolinksの導入には向いていない。
>
>ajax単体で同様のことを実現しようとした場合、
>ajaxではURLは変えられないので、同じURLが複数のコンテンツを指し示したり、
>複数のURLが同一のコンテンツを指し示すっていうダサい感じになるが、
>
>turbolinksを使うと、HTML5のpushStateを使ってブラウザの履歴を更新出来るので、
>ajaxでページを更新したタイミングでURL(ブラウザの履歴)も更新されて、イケてる感じになる。
>
>また、JavaScriptやHTML5が使えない場合は従来通りのページ遷移を行う。



> **turbolinksのページに解決策が示されていて、別途jquery-turbolinksを導入すれば解決する。**

Gemfileに

```rb:Gemfile
gem 'jquery-turbolinks'
```
を追記して、```bundle install```とか```bundle update```する。


## Rails5でのturbolinksの挙動

今までのイベント

```coffeescript
$(document).on 'page:before-change' , -> console.log 'page:before-change'
$(document).on 'page:fetch'         , -> console.log 'page:fetch'
$(document).on 'page:receive'       , -> console.log 'page:receive'
$(document).on 'page:change'        , -> console.log 'page:change'
$(document).on 'page:update'        , -> console.log 'page:update'
$(document).on 'page:load'          , -> console.log 'page:load'
$(document).on 'ready page:load'    , -> console.log 'ready and load'
$(document).ready                     -> console.log '$(document).ready in assets'
$(window).on 'load'                 , -> console.log '$(window).load in assets'
```

これでJSが発火してくれていたが、、、
Rails5でのイベント

```coffeescript
# ページ切り替え時（初回ページも対象）
$(document).on 'turbolinks:load', -> console.log 'turbolinks:load'
# ページ切り替え時（初回ページは対象外）
$(document).on 'turbolinks:render', -> console.log 'turbolinks:render'
# ページ遷移前
$(document).on 'turbolinks:request-start', -> console.log 'turbolinks:request-start'
```

これで発火するように変わってた。
当面はこの3つだけ知っていれば問題ないかなと思います。

---

参考URL
http://o.inchiki.jp/obbr/97
ディレクトリを再帰的に走査してExif情報を元にファル名を「日時_モデル名_元ファイル名」に変更する

https://gist.github.com/ayziao/fef4982d41e20c2eece3

```js:ExifRename.js
/* global process */
 
var fs = require('fs');
var path = require("path");
var ExifImage = require('exif').ExifImage;
 
var baseImgDir = process.argv[2] || '.';
 
function walk(imgDir, callback) {
	fs.readdir(imgDir, function (err, files) {
		if (err) {
			callback(err, null, null);
			return;
		}
 
		files.forEach(function (fileName) {
			var fp = path.join(imgDir, fileName);
			if (fs.statSync(fp).isDirectory()) {
				console.log('Directory: ' + fp);
				walk(fp, callback);
			} else {
				callback(null, imgDir, fileName);
			}
		});
	});
}
 
function imgFileRename(imgDir, fileName) {
	var newfilename = '';
	var fp = path.join(imgDir, fileName);
	var newfp;
 
	new ExifImage({ image: fp }, function (err, image) {
		if (err) {
			console.log(fp);
			console.log('ExifImageError: ' + err.message);
			return;
		}
 
		newfilename = image.exif.CreateDate.replace(/:/g, '').replace(/ /g, '_');
		newfilename += '_' + image.image.Model.replace(/ /g, '');
		newfilename += '_' + fileName.replace('.JPG', '.jpg');
		newfp = path.join(imgDir, newfilename);
 
		fs.rename(fp, newfp, function (err) {
			if (err) {
				console.log(fp);
				console.log('renameError: ' + err);
				return;
			}
			console.log(fp + ' to ' + newfilename);
			console.log('renamed complete');
		});
	});
}
 
walk(baseImgDir, function (err, imgDir, fileName) {
	if (err) {
		console.log('walkError: ' + err);
		return;
	}
 
	if (fileName.indexOf('20') !== 0 && fileName.slice(-4) === '.JPG') {
		imgFileRename(imgDir, fileName);
	} else {
		var fp = path.join(imgDir, fileName);
		console.log(fp + ' no rename');
	}
});
```

参考
http://shimz.me/blog/node-js/2601
http://qiita.com/amay077/items/cc6ee3e66040a5097230
appcompat 22でPreferenceActivityを実現する方法

SupportLibary v23ではPreferenceFragmentCompatが追加されたのでそちらを使いましょう！
⇒[[Android]SupportLibrary v23から追加されたPreferenceFragmentCompatを使ってみる - Qiita](http://qiita.com/wasnot/items/dfc33bb91f64abfec04c)
(2015/9追記)

----

[Android - appcompat 21+でPreferenceActivityを実現する方法 - Qiita](http://qiita.com/takke/items/27fe849e18b9890790c9) の appcompat 22 版です。

結論から言います。

[AppCompatPreferenceActivity.java](https://github.com/android/platform_development/blob/master/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java) を使え！
※使用例は [ActionBarPreferences.java](https://github.com/android/platform_development/blob/master/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarPreferences.java)

以上です。

----

appcompat 22 で Material テーマが AppCompatDelegate により実現されるようになり、appcompat21 までの ActionBarActivity を継承せずとも Material テーマを適用できるようになりました。
上記の AppCompatPreferenceActivity はこの AppCompatDelegate のサンプルになっていますが PreferenceActivity の support 版と言っても良いかと思います。
技術英語 > It's his area of expertise. > 彼の専門分野だね

[answers.com](http://www.answers.com/Q/What_does_Area_of_Expertise_mean)
> For instance in your job, you have skills/knowledge that you are the most knowledgable about and that is your area of expertise. 

[boundless.com](https://www.boundless.com/communications/textbooks/boundless-communications-textbook/choosing-a-topic-6/finding-and-selecting-a-topic-35/your-areas-of-expertise-154-6625/)
> Learn more about your areas of expertise in the Boundless open textbook.
Effective C++ (3rd) > 28項 > publicでないメンバ関数もカプセル化の内部にある > それらのハンドルを戻さないことが重要

引用: Effective C++ 第3版

> ところでカプセル化の話では、まずデータメンバのことを考えると思います。しかし、publicでない（つまり、protectedやprivateな）メンバ関数もカプセル化の内部にあるわけです。したがって、それらへのハンドルも戻さないようにすることが重要です。
...
実は、上で説明した問題は、戻り値にconstを付けることで解決できてしまいます。

```
class Rectangle {
public:
    ...
    const Point &uppderLeft() const { return pData->ulhc;}
    ...
```

(補足)
ここで、ulhc: uppder left-hand corner
左側のconstをつけている。

<hr>
以下、関連するのだろうか?
[High Integrity C++](http://www.codingstandard.com/rule/9-1-4-do-not-write-member-functions-which-return-non-const-handles-to-data-less-accessible-than-the-member-function/)

> int32_t & get() // @@- Non-Compliant -@@
...
> int const & get() const // @@+ Compliant +@@

左側のconstの位置が気になる。
const intと意味が変わるかと思う。
きちんと理解せねば。

Efffective C++ 3項にも関連の記載があった。
http://d.hatena.ne.jp/toburau/20090603/1244026137
Effective C++ (3rd) > 28項 > ハンドル(「他のオブジェクトへのアクセスを可能にする」という意味で) > 参照、ポインタ、反復子 

引用: Effective C++ 第3版

> 参照、ポインタ、反復子は、（「他のオブジェクトへのアクセスを可能にする」という意味で）ハンドルとよばれます。

<hr>
http://stackoverflow.com/questions/13971857/is-it-safe-to-hold-pointers-to-iterators-in-c
> It rarely makes sense to maintain pointers to iterators: iterators are already lightweight handles to data. 

http://stackoverflow.com/questions/13176751/avoid-returning-handles-to-object-internals-so-whats-the-alternative

> because it can lead to "dangling handles", meaning that you keep a reference to a member of an object that is already destroyed.

> Now, my question is, are there any good alternatives? Imagine Mother is heavy! If I now return a copy of Mother instead of a reference, GetMother is becoming a rather costly operation.
springってやつのせいでsettings.ymlの変更が反映されなくて困った時のこと


# 自動読み込み対象のファイルを変えたけど、アプリ側がそれ反映してくれない
springを使っていたためでした。

```
bin/spring stop
```
で一旦止めちゃいましょうという話。

# springって勝手に自動ファイル読んどいて時間短縮してくれるやつ

springは、あらかじめライブラリなどのロードをしといてくれることで、rails内でのコマンド```rake```コマンドとか、```rails```コマンドを実行するまでにかかる **時間を省略**してくれるもの。
(→くわしくは[こちらの記事が参考になりました](http://ruby-rails.hatenadiary.com/entry/20141026/1414289421#spring-removal))

springをインストールすることで開発効率を上げることができるのですね。([インストール方法もこれみた](http://ruby-rails.hatenadiary.com/entry/20141026/1414289421#spring-removal))




というコマンドがあるらしい(http://ruby-rails.hatenadiary.com/entry/20141026/1414289421#spring-removal)



# springのコマンド

```
bin/spring status
```
でspringが起動しているかどうか確認。
一回```rake```コマンドや```rails```コマンドを打つとspringが起動する。(しばらく起動してくれるって感じなんかな？)

```
bin/spring binstub --all
```
で

```
* bin/rake: spring already present
* bin/rails: spring already present
```
のようにすでに走ってるspringが見える。

# 新しく更新した先読み込み対象ファイルを読み直してくれ無い...
springを走らせっぱなしだと、config系ファイルの変更が反映されなかったりする。すでにロードされてるものと認識されてるっぽい。そういう時は、

```
bin/spring stop
```
で一回spring止めて読み込み直してやる必要がある。(反映され無いときとされるときがある。発動条件なぞ
である。誰か教えて下さい。)
Railsにおける文言の国際化対応


# viewやモデルごとにまとめたい

意外と日本語でしっかりまとまってるの少なかったので、以下簡単なステップでまとめました。

##すべての文言を一つのja.ymlにまとめる必要無い
一つのファイルにlocale書くとと膨大になってしまうなんていうときは、以下のようにmodelやviewごとに構造化してまとめたいですね。

```
|-defaults
|---es.rb
|---en.rb
|-models
|---book
|-----es.rb
|-----en.rb
|-views
|---defaults
|-----es.rb
|-----en.rb
|---books
|-----es.rb
|-----en.rb
|---users
|-----es.rb
|-----en.rb
|---navigation
|-----es.rb
|-----en.rb
```

# config/application.rbに読み込みのpath追加

```
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
```
をconfig/application.rbに追加すると、locales以下の```.yml``````.rb```ファイル読み取ってくれる。

仕組みをちゃんと説明すると、railsはデフォで、config/localesディレクトリから```*.rb``````*.yml```ファイルを読み取ってくれる。

```
load_path    # Announce your custom translation files
```
で、```I18n.load_path```は自動読み込みの対象となるファイルのpathを持った配列になってる。

# あとはviewsなりなり、自分の好きなファイルをlocales以下どこでも追加

```
locales/views/users/index/ja.yml
```

とか

で、

```ja.yml
ja:
	users:
		index:
			name: 名前
	
```

みたいにkeyを構造化してかくだけ！
RailsでDBに関係ないクラスを作成したいんですが


そもそもクラスとかモジュールって→[rubyのclass/moduleをはっきり理解していないRails人へ](http://qiita.com/gogotanaka/items/c931360b3f6248959f89)


# 処理系はlib/以下に書く

dbには保存しないが特定の対象に処理をしたいっていうときに、```app/model```にActiveRecordクラス作るのも無駄だなっていうときは、```lib/```以下にrubyの普通のclass or moduleを書いちゃいましょう。

# アプリケーション起動時に自動でclass読み込む

rails内でActiveRecordのクラスがいつもどこからでも自由に使えちゃうのは、railsがそれらを最初に読み込んどいてくれるからですね。railsさすが。
```lib/```以下に他で使うclassかmodule書きたい！ってときは、lib以下も自動で読み込むようにしましょう。

## 自動読み込みのpathを追加
railsが自動読み込みする際にみるのが```config/application.rb```です。なので、そこで、以下の行を追加してあげましょう。

```
config.autoload_paths += %W(#{config.root}/lib #{config.root}/lib)
```

すると、libディレクトリ以下が自動で読み込まれるようになります。

# ActiveModelのrailsの便利な特性を利用するclass作成

## dbに存在するrecordじゃないんだけど...form_forの恩恵を授かりたい。
> 見てわかる通り、hashしたparamsを作成する点で、form_forは圧倒的にコードの繰り返し少なく楽に書くことができる。model objectのインスタンスを渡してform_forは使うので、recordじゃなければ無理なんじゃ...?と思いきや、方法ありました。dbになくとも、modelクラスを作成して、ActiveModelをincludeすればいけます。(ActiveModelはActiveRecordからdbにアクセスする機能を引いたmoduleと理解してくだせ。)

```rb
class User
  include ActiveModel::Model
  attr_accessor :name 
  validates :name, presence: true
  
  #この辺にいつも通りmethodもかける。

end

```
>のように、userがdbに保存される系のオブジェクトじゃないときも、ActiveModel::Modelをincludeして、controllerから```@user=user.new```でインスタンス渡してやれば、いつも通り、form_forを使うことができます。その際、form_forでuserに渡すattributesに関しては、attr_accessorで宣言しておきましょう。上で紹介したように、text_filed軍団は、model objectのattributesでないものをparams[:model名][:ここ]に入れてくれないので。attributesでないといけないというわけではなくて、@object.attr_nameの形でアクセスできればいいので、理屈的にはmethodでもなんでもobjectからこの形でアクセスされるものが定義されていて、@object.attr_nameがエラーを返さなきゃそれで良さげである。

詳しくはこちら→[【Rails】formヘルパーを徹底的に理解する](http://qiita.com/drafts/7accec12eef6d89b0aa9/edit)

****
以上、指摘質問補足お待ちしています。
macports で Go言語

homebrewでのインストール記事はよく見ますが、macportsでのGo言語の環境構築の記事を見ないのでメモ書き程度に書いておきます。

### macportsによるGo言語のインストール

```
$ sudo port install go
$ go version
```
ここでバージョンが表示されればインストールはできているはず

### GOPATHの設定
Goのソースコードやパッケージファイルなどを保存するためのワーキングディレクトリを 環境変数 `$GOPATH` に設定します。
bashだったら、.bashrc, zshだったら .zshrc に以下を書き込みます。


```
export GOPATH=/home/mygo
```

### Hello World
適当なディレクトリに以下のソースコード `HelloWorld.go`を保存。

```HelloWorld.go
package main

import "fmt"

func main() {

	fmt.Println("Hello world!")

}
```
Goはコンパイル言語ですが、以下のコマンド `go run` でプログラムのビルドと実行を同時に行うことができ、実行ファイルは保存されません。

```
$ go run HelloWorld.go
```
[Android][Java] apk解析

ちょっと寄り道。
とりあえず覚書な感じで。

# .apk

## APKDownloader
http://apps.evozi.com/apk-downloader/

* Google Playから直接ダウンロード。
* ダウンロード出来ないアプリもあるみたい？

## 保存系サイト

* [APKMonk](http://www.apkmonk.com/)
* www.apkplz.com
* [Android Apps Game](http://www.androidappsgame.com/)
* [QooApp](http://apk.qoo-app.com/) *※中華なので注意?*

いくらでもあるので適当なサイトで。

## Backup and Restore

* 元から入っていたアプリ。
* インストール済アプリをSDカードに保存出来る。
* リストに表示されないアプリがある。

## apk抽出 (App Extraction)
https://play.google.com/store/apps/details?id=com.pandaz.apkextraction

* インストール済アプリをSDカードに保存出来る。
* Backup and Restoreよりも保存できるアプリが多い。

# .dex to .class

.apkから.dexを取り出しておく。

## dex2jar
http://sourceforge.net/projects/dex2jar/

* dex2jar以外にも色々と変換出来る。

```text:使用例
C:\>d2j-dex2jar.bat classes.dex
dex2jar classes.dex -> .\classes-dex2jar.jar
```


# .class to .java

## Java Decompiler
http://jd.benow.ca/

* GUIなのでお手軽。
* .classや.jarを放り込んで保存するだけ。
* 一括保存も出来る。
* 保存せずにビュワーとしても使える。

## Jad
http://varaneckas.com/jad/ (mirror)

* CUI
* `Couldn't fully decompile method ~`が大量発生。

## CFR
http://www.benf.org/other/cfr/

## Fernflower
https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine
https://github.com/fesh0r/fernflower (mirror?)

## Procyon
https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

# あとがき

ここまでで出来た.javaの質については不明。
terraformでsshアクセス可能なEC2インスタンスを作成する

## 目的
とにかくterraform使って、簡単にsshアクセスできるEC2インスタンス作成したい。

## 環境
* terraform v0.3.6
* OSX 10.10.3

## 前提
* 権限のあるIAMユーザを作成
* instanceに導入する公開鍵を事前に作成

## terraformを導入する
Macだと`brew install terraform`で導入できます。ただしバージョンが若干古いです。（20150513時点の最新はv0.5.0）

## 設定ファイルを作成する

* 基本の設定ファイル

```console:example.tf
resource "aws_instance" "example" {
    ami = "ami-89634988" # 好きなAMIを選択
    instance_type = "t2.micro"
    key_name = "${var.key_name}"

    # Our Security group to allow HTTP and SSH access
    security_groups = ["${aws_security_group.default.name}"]
}

resource "aws_security_group" "default" {
    name = "terraform_example"
    description = "Used in the terraform"

    # SSH access from anywhere
    ingress {
        from_port = 22
        to_port = 22
        protocol = "tcp"
        cidr_blocks = ["0.0.0.0/0"]

    }

}
```

* IAMの情報を持ってるファイル（gitにコミットしない！）

```console:aws_region.tf
provider "aws" {
    access_key = ""
    secret_key = ""
    region = "ap-northeast-1"
}
```

* 変数ファイル

```console:variable.tf
variable "key_name" {
    default = "key-name" # key pairを指定
}
```

* 上記3ファイルをカレントに作成し、`terraform apply`を実行するとEC2インスタンスができるはずです。たぶんこんなにファイルわけなくてもいいはず

## 終わりに
とりあえず作成するだけなら簡単にできました。VPCがファイルの構成とかもう少し考えたほうがよさそうです。公式のサンプルもあるので、そちらも参考になると思います。

## 参考
* https://github.com/hashicorp/terraform/tree/master/examples/aws-two-tier
OS X に brew で gdb をインストール



# Install with Homebrew
```
brew tap homebrew/dupes
brew install gdb
```

# Certifying GDB
GDBにコード署名する。
[OS XでGDBを使う（ためにコード署名をする）](http://qiita.com/takahashim/items/204ffa698afe09bd4e28)

# restart the taskgated process
```
ps aux | grep taskgated 
sudo kill xxxx
```

# code sign GDB
```
codesign -s gdb-cert $(which gdb)
```

# 参考
* http://ntraft.com/installing-gdb-on-os-x-mavericks/
* http://qiita.com/takahashim/items/204ffa698afe09bd4e28
Ubuntu14.10でVisualStudioCodeを使えるようにしてみた

Atomと双璧をなすエディタとなれるか？  

#Visual Studio Codeアーカイブのダウンロード  
「[Visual Studio Code](https://code.visualstudio.com/)」からアーカイブを適当な場所(私の場合は~/Downloads)へダウンロードする。   

#解凍  
私の場合は/opt以下にいろいろなアプリケーションをインストールしています。なので、
`sudo mkdir /opt/VSCode`
で、インストール先ディレクトリを作成し
`sudo unzip -d /opt/VSCode ~/Downloads/VSCode-linux-x64.zip`
インストール先へ解凍  

#起動  
`/opt/VSCode/Code %f`

#おまけ(ランチャに認識させる)
以下の内容のファイルを```~/.local/share/applications/```に適当な名前で作成する  
VisualStudioCode.desktop
```[Desktop Entry]
Type=Application
Icon=/opt/VSCode/resources/app/vso.png
Name=Visual Studio Code
Terminal=false
Exec=/opt/VSCode/Code %f
Hidden=false```

*IconとExecのパスは適宜読み替えてください。
nil 的用法

在 Objective-C 裡，
不像 C 的一些 scaler variables ，不給初始值時，會是 stack 中前一個變數所殘留的值，
一個物件的 pointer 可以不用給任何初始值，他的初始值就是 `nil`

對 nil object 傳訊息則不會有任何問題發生，也不會 error 或 crash 。

# 回傳值

當對 nil object 傳送訊息預期會有回傳值時，則會根據不同的型態、回傳對應的值：

<table>
<tr><th>Return Type</th><th>Returns</th></tr>
<tr><td>物件</td><td><code>nil</code></td></tr>
<tr><td>數字 (numeric)</td><td><code>0</code></td></tr>
<tr><td>BOOL</td><td><code>NO</code></td></tr>
<tr><td>資料結構，<i>如 CGRect</i></td><td>所有內含成員變數的值皆是 0</td></tr>
</table>

# 檢查空值 `nil`

## 判斷是空值

當要檢查一個物件確定為空值時

``` objc
if (anObject == nil) {
}
```

可以這樣直接把條件式放入變數就好：

``` objc
if (anObject) {
}
```

## 判斷不是空值

反之，當要檢查一個物件 **不是** 空值時

``` objc
if (anObject != nil) {
}
```

這樣一樣太囉唆了點，一樣可以改成這樣：

``` objc
if (!anObject) {
}
```
Gyazoライクな画面範囲選択をC#とReactive Extensions (Rx)で書いた

どうもGyazoのような画面範囲選択について「[このUIをWindowsで実装しようとすると、千行近いコードをCか何かで書かなければなら](
http://qiita.com/uiureo/items/0353e37bcffe94731c6b)」ないらしいですが、雑に作ったScreenCaptureWrapper初版(→[画面を動画キャプチャするツールScreenCaptureWrapperを公開](http://d.sunnyone.org/2015/04/screencapturewrapper.html))でもとてもそんな長さにならなかったよなぁと思いつつも、Rxを使うとさらにすっきり書けそうだったので、書いてみました。

```csharp
public static Task<Rect> SelectScreenPositionAsync()
{
    var shapeRect = new Rectangle() { Fill = new SolidColorBrush(Color.FromArgb(0x44, 0x99, 0, 0)), Stroke = Brushes.Red };
    var canvas = new Canvas();
    canvas.Children.Add(shapeRect);

    var window = new Window()
    {
        Title = "Select Screen Position", Top = 0, Left = 0,
        Width = SystemParameters.VirtualScreenWidth, Height = SystemParameters.VirtualScreenHeight,
        WindowStyle = WindowStyle.None, Topmost = true, ShowInTaskbar = false,
        AllowsTransparency = true,
        Background = new SolidColorBrush(Color.FromArgb(1, 0xff, 0xff, 0xff)),
        Cursor = Cursors.Cross, Content = canvas
    };

    var rectObservable = Observable.FromEventPattern<MouseEventArgs>(window, "MouseLeftButtonDown")
        .Select(ev => ev.EventArgs.GetPosition(window))
        .CombineLatest(Observable.FromEventPattern<MouseEventArgs>(window, "MouseMove"),
           (downPos, ev) =>
           {
               var movePos = ev.EventArgs.GetPosition(window);
               return new Rect(Math.Min(downPos.X, movePos.X), Math.Min(downPos.Y, movePos.Y),
                               Math.Abs(downPos.X - movePos.X), Math.Abs(downPos.Y - movePos.Y));
           })
        .TakeUntil(Observable.FromEventPattern<MouseEventArgs>(window, "MouseLeftButtonUp"));

    rectObservable.Subscribe(r =>
    {
        Canvas.SetLeft(shapeRect, r.X);
        Canvas.SetTop(shapeRect, r.Y);
        shapeRect.Width = r.Width;
        shapeRect.Height = r.Height;
    }, window.Close);

    window.Show();

    return rectObservable.ToTask(); // return a last value
}
```

本当は最初のほうはXAMLで書いてあげたほうがいろいろいじりやすくて便利だとは思いますが、そこはお好みでどうぞ。

(追記)
なお、HTML+JSがダメだと言っているわけではないです。Electronは[ブラウザのレンダラプロセスのメッセージループにNode(io.js)を統合する](http://www.slideshare.net/mainya/electronatom-shell/25)とかcrazyで面白いので、それはそれで使っていきたいと思っています。

元アプリはReactで書かれていて、これはこれでまぁ良いんじゃないかと思いますが、このウィンドウであれば、以下のあたりのようなRx系ライブラリで、イベントからのDOMへ反映という形にすると、それはそれですっきりしそうだなぁという気がします。なお、私は（今のところ）Bacon.jsが好きです。

 * [RxJs](https://github.com/Reactive-Extensions/RxJS)
 * [Bacon.js](https://baconjs.github.io/)
 * [Kefir.js] (https://pozadi.github.io/kefir/)
Ansibleでユーザ毎に任意の公開鍵を作成する


* ホスト側で公開鍵を作成したくない
* ユーザ毎に公開鍵の内容を変えたい
* rolesの配下に公開鍵を置きたくない（今回はrole無しで作成）

上記条件を満たす為に考えたのが以下。
（とっくに誰かが考えてる気もしますが）

## 環境
Ansible: 1.9.0.1

## 構成
	/projet-root
	|- /public_keys
	|	|- userA
	|	|- userB
	|	|- …
	|- add_user.yml

```yaml:add_user.yml
---
- hosts: all
  sudo: yes
  vars:
    users:
      - 
        name: "userA"
      -
        name: "userB"
  tasks:
    - name: Add users
      user:
        state: present
        name: "{{ item.name }}"
        append: yes
      with_items:
        - "{{ users }}"

    - name: Get public keys of each user as a variable
      set_fact:
        keys: "{{ item }}"
      with_fileglob:
        - public_keys/*

    - name: Add public keys to the authorized key for each user
      authorized_key:
        user: "{{ item[0].name }}"
        key: "{{ lookup('file', item[1]) }}"
      with_nested:
        - users
        - keys
      when: item[1] | search("/" + item[0].name + "/")

```

当初`with_items`と`with_fileglob`を同時に使えないかと（意味不明な事を）考えたのですが、無理でした。
その為`set_fact`で公開鍵のパスを拾ってきた後、`lookup`で内容を取得しています。

その内容を全ユーザに適用されても困るので、`search`フィルターでユーザ名と公開鍵パスを比較しています。
公開鍵パスにユーザ名が含まれていた場合のみ、`authorized_keys`を適用。

無事に任意の公開鍵を設置することが出来ました。
PHP7調査(31)暗号論的に安全な疑似乱数生成器（CSPRNG）を提供する新関数

PHP5までは暗号論的に安全な疑似乱数生成器(CSPRNG)を提供する標準関数がなかったため、CSPRNGが必要な場合に自分で明示的に`/dev/urandom`にアクセスしたりしていました。opensslエクステンションおよびmcryptエクステンションもCSPRNG関数を提供していますが[^1]、どちらも必須のエクステンションでは無いため、ライブラリなどでは採用しにくい状況があったはずです。

[^1]: `openssl_random_pseudo_bytes()`および`mcrypt_create_iv() `

PHP7から、どの環境でも動くCSPRNG関数として`random_bytes()`と`random_int()`の2つが新規実装されます。

```php
<?php
// ランダムな2バイトの文字列を返す。各バイトは0x00から0xffのどれか。
var_dump(bin2hex(random_bytes(2)));

// 5以上9以下の整数をランダムに返す
var_dump(random_int(5,9));
```

# 実装

* Windowsでは`CryptGenRandom()`が使われます。
* `arc4random_buf()`があればそれを使います（通常はBSDのみ）。
* `/dev/arandom`があればそれを使います。
* 上のどれも無ければ`/dev/urandom`を使います。
* これらの乱数生成源が一つも見つからなければエラーになります。

# 暗号論的に安全な疑似乱数とは

「暗号論的に安全な疑似乱数」というのはお決まりの言い方で、暗号の実装中で利用しても暗号の安全性を崩さないような、予測不可能性が保証されている乱数のことです。

ちなみに、統計的なランダムさが必要な場合は`mt_rand()`でも全く問題ありません。通常の疑似乱数列に比べて暗号論的に安全な疑似乱数列の方が乱数の生成コストが高い傾向があるので、例えばモンテカルロシミュレーションを行うような場合は`mt_rand()`の方がふさわしいと言えるでしょう。ゲームのサイコロや何かの抽選などの場合は微妙っちゃ微妙ですが、好きな方を使えばいいのではないでしょうか。

# 参照

* [PHP RFC: Easy User-land CSPRNG](https://wiki.php.net/rfc/easy_userland_csprng)
PHP7調査(30)preg_replace_callback_array関数の新設

`preg_replace_callback_array()`という新しい関数がPHP7から実装されました。要は配列を受け取れるバージョンの`preg_replace_callback()`です。

```php
<?php
$str = 'aBcDeF';
$str = preg_replace_callback_array([
        '/[ace]/' => function ($m) { return strtoupper($m[0]); },
        '/[BDF]/' => function ($m) { return strtolower($m[0]); },
    ], $str);
var_dump($str); // string(6) "AbCdEf"
```

`preg_replace()`は複数組の置換を一気に書けるのに`preg_replace_callback()`だと書けないという問題意識から作られた関数のようです。でも、そんなに必要かなあ…？

#参照

* [PHP RFC: Add preg_replace_callback_array function](https://wiki.php.net/rfc/preg_replace_callback_array)
さくらのレンタルサーバー(スタンダードプラン)に Django をインストールしたときの備忘録


さくらのレンタルサーバー(スタンダードプラン)に、Django を入れた際の備忘録です。

なお、さくらのレンタルサーバーのデフォルトのシェルは csh ですが、bash に設定しています。

_注意(追記):_
Django を入れること自体はできますが、そもそもレンタルサーバーなので nohup コマンド等で runserver し、ログアウト後も動作し続けるか試してみたところ、すぐに deamon と見做されるのかプロセスを落とされてしまいました。試験的に使用する分には問題ないとは思いますが、ログアウト後も起動していて欲しい場合、素直に VPS を使用した方が良いでしょう。


## pip をインストールする

[ここ](http://forgetzimbnot.com/2013/10/sakura_pip.html)を参考に pip を入れておきます。

さくらのレンタルサーバーでは、$HOME に .local ディレクトリがあり、そこに python 関係のモジュールを入れることができるようです。(レンタルサーバーなので root 権限がありません。)
easy_install はあらかじめ .local/bin に入っているので、DL不要でインストールすることができます。

```bash
easy_install --prefix=~/.local pip
```

.bashrc に $HOME/.local/bin へのパスを追加しておきます。

```bash
export $HOME/.local/bin:/usr/sbin:/sbin:$PATH
```

正常にパスが通っているか、確認します。

```bash
pip --version
```

ただし、[pip install する際は、--user オプションを付けなればならないことに注意。](http://temprura.jp/memo/さくらサーバ/)これに気づかず、ハマりました。

## virtualenv, virtualenvwrapper をインストールする
必須ではありませんが、環境切り替え用が楽にできた方が良いので [virtualenv, virtualenvwrapper をインストール](http://qiita.com/_rdtr/items/5f3a9a9e2cb5a24f284e)しておきます。

**仮想環境下ではない場合には pip install に --user オプションをつける必要がありますが、仮想環境下では不要です。**

## Django をインストールする

```bash
pip install Django
```

以上でわりとあっさりと Django を入れることができました。
convert ggplot based graph to html


ggplot based graph can be converted to html using `mpld3.fig_to_html`. The point is to call `draw` method to generate matplotlib figure object, though it is not mentioned in ggplot manual now. The html piece can be used in templates.

```python
import matplotlib.pyplot as plt, mpld3
from ggplot import *

ggp = ggplot(aes(x='date', y='beef'), data=meat) +\
      geom_line() +\
      stat_smooth(colour='blue', span=0.2)
fig = ggp.draw()
html = mpld3.fig_to_html(fig)
```
Rubyのエラーメッセージwrong number of arguments (a for b)の意味

rubyを実行したときのエラーメッセージ
wrong number of arguments (1 for 0)
とか
wrong number of arguments (4 for 2)
とかどういう意味なんだろ、って検索してもあまりぴしゃりとしたのなかったので、投稿したくなった

結論から言うと、

*wrong number of arguments (a for b)*
*a＝呼び出し側の引数の数*
*b＝メソッド側の引数の数*

でしたわ。これがずれていると、エラーでる。一致させよう。

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/9674/b89a7cbd-4be7-1510-beb2-69dbb7331ed2.jpeg)