OmniAICreator/Qiita-1.07M huggingface dataset:
SSLアクセラレータの裏のApacheにアプリケーションを設置するtips

まとめ
======

1. Apacheのmod_envで `SetEnv HTTPS on`
2. Apacheのconfファイルで `ServerName https://www.example.com:443`
3. アプリケーション内の非SSLなURLの定数をつぶす()

何が問題か？
============

SSL処理はSSLアクセラレータが受け持つので、HTTPサーバとアプリケーションは素のHTTP環境下で動作することになります。

アプリケーション自体は通信が暗号化されていようがいまいが、特に関係ありません。

とあるプロジェクトで発覚した問題は、以下2パターンでした。

1. （HTML中や、Locationヘッダでリダイレクト先として使う）URLを生成する際にSSLでないアドレスが生成される場合がある。
2. SSLを強制したいシーンで、自分がSSL環境下にあるかどうか判定できずエラーになったり、再帰的リダイレクトが発生する。

解説
====

### 環境変数 _HTTPS_

仕様があるのか不明ですが、[mod_sslのマニュアル](http://httpd.apache.org/docs/2.2/mod/mod_ssl.html)とか[PHPの$_SERVERのマニュアル](http://www.php.net/manual/ja/reserved.variables.server.php)には記述があります。SSL環境下では _on_ ないし _ON_ が設定されます。SSL環境下 **でない** 場合は設定されませんが、IISの場合のみ、SSL **でない** 状態で _off_ が入っているそう。

アプリケーションが、SSL環境下で動作しているかどうか判定に使っていました。

### ServerNameの変更

スクリプトが実行されているサーバの名前として、環境変数 _SERVER_NAME_ に設定されます。

URL生成のネタとして使用している部分がありました。

### 定数値

なんともできません。grepしましょう。

## 設定例


Apacheのバーチャルホスト機能を使って、SSLアクセラレータとやりとりするポートを専用に割り当て、その中で設定するのがベターでしょうか。
尚、ServerNameのホスト名は、SSLアクセラレータのホスト名と同じになります。

```apache
<VirtualHost *:10443>
    ServerAdmin webmaster@www.ssl-axl.com
    DocumentRoot "c:/prg/Apache24/htdocs"
    ServerName https://www.ssl-axl.com:443
    ErrorLog "logs/www.ssl-axl.com-error.log"
    CustomLog "logs/www.ssl-axl.com-access.log" common
    SetEnv HTTPS on
</VirtualHost>
```
YouTube のチャンネルから RSS を取得する

1. YouTube の RSS を取得したいページに行く。例えば [Google Developers](https://www.youtube.com/user/GoogleDevelopers/featured)  
`https://www.youtube.com/user/GoogleDevelopers`
2. 「最近のアップデート」をクリックし、「すべてのアクティビティ」(ドロップダウンメニュー)から「アップロード済み」などを好みに応じて選ぶ  
`https://www.youtube.com/user/GoogleDevelopers/feed?activity_view=3`
3. ここで、URL を 2 箇所変更する
    - `/user/` の部分を `/rss/user/` にする
    - `/feed` の部分を `/feed.rss` にする
`https://www.youtube.com/rss/user/GoogleDevelopers/feed.rss?activity_view=3`
4. この URL にアクセスするとリダイレクトされ、Atom 形式のフィードが取得できる

**※このやり方は YouTube API v2 が廃止になる 2015 年 4 月以降も有効な保証はありませんのであしからず**
FuelPHP開発入門_02

というわけで第二弾。([第一弾はこちら](http://qiita.com/yumura_shiho/items/4f669ca10438342fb830))
FuelPHPが動くように設定していきます。

今回想定しているシステムでは、簡易的なログイン動作とそれに伴うメール配信機能を利用します。
それも使えるように設定してしまうことにします（サーバー側の設定は正しいものとします）。

## 設定情報の編集
→fuel/app/config/config.php

80行目付近より

```lang:config.php
/**
 * Localization & internationalization settings
 */
'language'           => 'ja', // 2014/04/01 変更
'language_fallback'  => 'en', // Default
'locale'             => 'ja_JP', // 2014/04/01 変更

/**
 * Internal string encoding charset
 */
'encoding'  => 'UTF-8', // 2014/04/01 変更

/**
 * DateTime settings
 *
 * server_gmt_offset	in seconds the server offset from gmt timestamp when time() is used
 * default_timezone		optional, if you want to change the server's default timezone
 */
'server_gmt_offset'  => 3600 * 9, // 2014/04/01 変更
'default_timezone'   => 'Asia/Tokyo', // 2014/04/01 変更
```

250行目付近(Always Loadセクション)

```lang:config.php
'packages'  => array(
	'auth', // この辺についてはまたあとで
	'email'
),
```

### 14/09/02 追記
なぜ消えたし

上記について補足。always_load部分をきちんとアンコメントしてください。

```lang:config.php
'always_load' => array(
	'packages'  => array(
		'auth', // この辺についてはまたあとで
		'email',
		'orm'	// 04/21追記
	),
),
```

packagesだけアンコメントして首をひねる事のないように(;｀@ω@´)

## DB設定

DBの設定情報はfuel/app/configの下に実は５つもあります。

 - config/db.php
 - config/development/db.php
 - config/production/db.php
 - config/staging/db.php
 - config/test/db.php

(´＠ω＠｀;) 

ここの切り替えについては[公式リファレンス](http://press.nekoget.com/fuelphp_doc/general/environments.html)によれば、
> 環境の設定は、サーバ変数 FUEL_ENV をセットするか、 手動で fuel/app/bootstrap.php 内の設定を変更することで設定します。

とのことで。（サーバー変数はともかく三項演算子に手書きってどういうことなの…）
テスト環境、開発環境、本番環境などでDBの切り替えができるようです。
デフォルトはdevelopmentなので、取り敢えずdevelopmentのところを書き換えればOKなようです。
今回はMySQLを利用していますので、MySQL用に書きます。

```lang:development/db.php
return array(
	'default' => array(
		'connection'  => array(
			'dsn'        => 'mysql:host=localhost;dbname=fuel_db',
			'username'   => 'fuel_db_user',
			'password'   => 'fuel_db_pass',
		),
	),
);
```

こんな感じでOK。
次回はメールとAuthを使えるように設定していきます(´＠ω＠｀)
MongoDBの「orphaned documents」とは

MongoDBの「orphaned documents」とは、シャーディング構成において、シャードノードをまたがるデータ再配置(チャンクマイグレーション)中に突然の異常終了(電源断等)が発生した際にできてしまう可能性のある、孤立した(orphaned)意味のないドキュメント。

MongoDBはシャードノードをまたがるデータ再配置の際に、マイグレーション元ノードとマイグレーション先ノードの両方にデータが存在するタイミングが発生するが、
その途中で異常終了があり、その後立ち上げると、どちらのノードにも同じドキュメントが存在する状態となる。
その時に、チャンクが定義されていないシャードノードにあるドキュメントは、orphaned documentsとなる。
チャンク定義が無いため、mongosはそこにドキュメントがある事すら認識できないため、orphaned documentsは意味のないドキュメントとなる。

このorphaned documentsを消すためには、2.6から導入されたcleanupOrphanedコマンドを使えばＯＫ
Aipo7をOpenVzにインストールしてみた

OpenVzにインストールしてみた。

OpenVz特有の対応
==============

`eth0`ではなく`venet0:0`だったりするので

```diff:/usr/local/aipo/bin/install.conf
- netitf=eth0
+ netitf=venet0:0
```

OS起動とともに自動起動
--------------

```bash:/home/owner/bin/aipowatch.sh
AIPO_PROC_COUNT=`ps -ef | grep aip[o] | grep -v aipowatch.sh | wc -l`
LOGFILE=/home/owner/aipo.log

if [ $AIPO_PROC_COUNT -eq 0 ];then
  cd /usr/local/aipo/bin/
  sudo sh startup.sh >> $LOGFILE
fi
```

cronに登録
----------

```bash:crontab&nbsp;-l&nbsp;owner
@reboot /home/owner/bin/aipowatch.sh
* * * * *  /home/owner/bin/aipowatch.sh
```

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

postgresが起動していない場合、`セッションがタイムアウトしました。`と表示される。

* [セッションがタイムアウトしました。｜無料グループウェア「アイポ」](http://user.aipo.com/viewtopic.php?p=4871)

cronでsudoできない場合、[cronの実行時間微調整, @reboot - Qiita](http://qiita.com/tukiyo/items/4b3a6ed5b5bc1208bf66#1-2)参照
初心者がJavascriptのオブジェクトを理解するまで


※わかりにくいと~~クレーム~~がはいったため、大幅に加筆修正しました。

## オブジェクトやthisという概念をどうやって理解するか？

まだjavascriptのことがいまいちわかっていなかったときに、いろいろ考えてみた結果についてまとめておきます。
結論から言うとこれでjavascriptについて「だいたいわかった」と言えるようになったので、javascriptのオブジェクトを使いこなすためにはかなり有効な考え方なのではないでしょうか。

- 「メモリ上にwindowオブジェクトをルートにもつファイルシステムのようなものがある」
- 「それを編集・作成・取得できるようにするしくみがオブジェクトである」

ざっくり表現すると、だいたいこんな感じです。
こう考えを改めると、なんだか急にわかったような気がしてきました。
ここまで来たらもうだいたい勝ったようなものですが、油断せず行こう。続けます。

### オブジェクトをディレクトリに置き換える

- オブジェクト:ディレクトリ
- プロパティ:エイリアスまたはディレクトリ・ファイル
- メソッド：実行ファイル（関数）
- 変数:関数が実行される作成され終了すると削除されるオブジェクトのエイリアス

こんな感じに置き換えてやります。だんだん整理できてきました。
もうちょっと続きます。

•オブジェクトはエイリアス（変数・プロパティ）の参照がすべてなくなると削除される
•オブジェクトはwindowから参照されない一時ディレクトリとして作成され、プログラミング内でプロパティに紐付けることはできる
•変数はエイリアス（オブジェクトのアドレスを格納）、またはエイリアス指し示すオブジェクト
•オブジェクトの場所を知る方法が【変数】と【プロパティ】と【this】
•thisは実行中のカレントディレクトリ
•applyやcallはカレントディレクトリを指定されたオブジェクトに移動して関数を実行


最終的にこういう解釈に至り、javscriptとわかり合えたのでした。

「だいたいわかった」
自分のサイトがSSL Heartbleed バグの影響を受けるかコマンドで確認

```shell-session
curl -L http://gobuild.io/github.com/titanous/heartbleeder/master/darwin/amd64 -o output.zip
```
でダウンロードしたoutput.zipを展開して、

```shell-session
➜ tmp ./heartbleeder your.site.come
```

で実行。

ソースコードは[ここ](https://github.com/titanous/heartbleeder)
VPSでOpenSSLの更新

#はじめに
opensslの脆弱性対応での作業備忘録です。
http://heartbleed.com

オンメモリのデータが漏れるということで、サーバ丸ごと再起動を選択。
ローカルのopensslはバージョンが0.9.8だったので、ノータッチ。

#環境

さくらのVPS
http://vps.sakura.ad.jp

#opensslの更新
##opensslのバージョン確認

configureのオプションを確認のため -a をつけています
> $ openssl version -a
> $ sudo yum check-update

##opensslの更新

### (a) パッケージを指定
> $ sudo yum update openssl

または
> $ sudo yum update openssl-devel

### (b) まとめてアップデート
カーネルもアップデートされます
> $ sudo yum update

##opensslのChangelogをみる

> $ sudo rpm -q --changelog openssl | head

```
* 月  4月 07 2014 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-16.7
- fix CVE-2014-0160 - information disclosure in TLS heartbeat extension

* 火  1月 07 2014 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-16.4
- fix CVE-2013-4353 - Invalid TLS handshake crash

* 月  1月 06 2014 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-16.3
- fix CVE-2013-6450 - possible MiTM attack on DTLS1

* 金 12月 20 2013 Tomáš Mráz <tmraz@redhat.com> 1.0.1e-16.2
```
対応しているらしい

#opensslを利用しているサービスの再起動
Webサーバなどは再起動が必要になります。
どのパッケージがopensslを利用しているか不明な場合はサーバごと起動する方が良いかも

##VPSサーバの再起動
こちらを見ながら
http://support.sakura.ad.jp/manual/vps/mainte/reboot.html

##Webサーバの再起動
VPSサーバの再起動を行っていれば不要
> $ sudo service nginx restart

##脆弱性の確認

http://filippo.io/Heartbleed/

#参考URL

yumによるパッケージ管理
http://linux.kororo.jp/cont/intro/yum.php

サービスの起動・強制停止・再起動
http://support.sakura.ad.jp/manual/vps/mainte/reboot.html

#さいごに
個人的なサーバだから適当に`$ sudo yum update`とか、`サーバ丸ごと再起動`などやってしまってますが、共有サーバのパッケージアップデートは注意して行ってください。
pythonのargparseテンプレート

python v2.7には[argparse](http://docs.python.jp/2/library/argparse.html)という引数設定を簡単にするモジュールがあります。
これを使うと、pythonスクリプトが簡単にできるので、テンプレートを載せておきます。

```py

# coding:utf-8
import argparse

if __name__ == '__main__':
	parser = argparse.ArgumentParser(description='description')
	parser.add_argument('arg1', type=int, help='integer argument')
	parser.add_argument('arg2', type=str, help='string argument')
# -aや--allが指定されれば True, なければ False が args.all に格納される
	parser.add_argument('-a', '--all', action='store_true') 
	parser.add_argument('--seeds', nargs=2, type=int, help='int options')
	args = parser.parse_args()
	your_method(args.arg1, args.arg2)

```

argparseの便利なところを挙げますと、

* args.arg1 のように指定した引数の名前(arg1)で、実際に入力された値を取得することが出来る
* 引数の型を指定し、間違っていたら通告してくれる
* descriptionやhelpが簡単に挿入できる
* add_argumentで名前を'--flg'というように、'-'を入れたら自動的にオプションとみなして処理してくれる

その他にも、多数の引数に対応できたり、引数をリストで束ねたりできるのですが、とりあえず簡単な説明で。
textView.setText(hoge) でResources$NotFoundException

変な所で躓いたので自戒の意味を込めてメモ。

```java
TextView textView = (TextView)view.findViewById(R.id.tv_fuga);
textView.setText(hoge);
// ↑ ここでResources$NotFoundException
```

この時ずっと```textView```のリソースが存在しないと思って、
XMLやR.javaと格闘していたのですが、真の原因は別のところにありました。

## 真の原因
｢hoge がint型｣ だった。

setTextはint型もString型も受け付ける事が出来、
String型が入ってきた時はそのまま出力してくれます。

しかしInt型が入ってきた時は出力すべき文字列ではなく、
XMLに紐ついたStringのIDとして解釈されてしまいます。
なのでhogeに紐付くXML(正確にはR.java)を探しに行って
エラーになっていました。

## 教訓
Int型をTextViewに入れたい時はちゃんとキャストしましょう。
Jsonとかで受け取ったオブジェクトをまとめてsetTextしたりすると
うっかりInt型を入れてしまいがちなので注意。
さくらVPS + BitTorrent Sync で自分専用Dropboxを作る

![PrivateなDropbox.png](https://qiita-image-store.s3.amazonaws.com/0/8219/8027dd2e-5aa2-8cae-497b-a92ea02f730d.png "PrivateなDropbox.png")

ちょっと前の [Rebuild.fm #30](http://rebuild.fm/30/) 聞いていたら BitTorrent Sync が紹介されてて、ちょうどプライベートな Dropbox 的な何かが欲しかったので導入してみた。

# さくらVPSのCentOSにbtsyncをインストール

[BitTorrent Sync - ダウンロード](http://www.bittorrent.com/intl/ja/sync/downloads)から適当なバイナリ（とりあえず「LINUX」の「x64」にした）をダウンロードして適当な場所に展開。


設定ファイルを用意する。

```bash:--dump-sample-configでサンプルの設定ファイルを用意する
$ btsync --dump-sample-config > btsync.config
```

上記で出力した設定ファイルをエディタで編集。
必要に応じて以下を変更する。

* device_name
* storage_path
* secret
* dir


```js:btsync.config
{
  // デバイス名
  "device_name": "snaka btsync master",
    
    〜 省略 〜

  // アプリが管理用に使用するファイル等を格納するディレクトリ
  // コメントアウトすると、バイナリが存在する場所に作られる
  "storage_path" : "/home/snaka/.sync",

  "webui" :
  {
    // Listen をコメントアウトすることで WebUI は無効化しておく
    // 後述の shared_folders が有効になっていれば自動的に WebUI は無効化されるが念のため
    /* "listen" : "0.0.0.0:8888", */
    "login" : "admin",
    "password" : "password"
  }
    
    〜 省略 〜

  // shared_folders の設定はコメントアウトを解除して有効化
  ,
  "shared_folders" :
  [
    {
      // btsync --generate-secret でシークレットを生成して以下に貼りつけ
      "secret" : "(共有フォルダのシークレット)",   // * required field
      // 共有するディレクトリのパスを記述する
      "dir" : "/home/user/hogehoge", // * required field

//  以下はデフォルトのまま使用
//  use relay server when direct connection fails
      "use_relay_server" : true,
      "use_tracker" : true,
      "use_dht" : false,
      "search_lan" : true,
//  enable SyncArchive to store files deleted on remote devices
      "use_sync_trash" : true,
//  以下はよくわからないのでコメントアウト
/*
      "known_hosts" :
      [
        "192.168.1.2:44444"
      ]
*/
    }
  ]


```

ここまで準備ができたら、とりあえず btsync を実行してみる。

```bash:btsyncの起動
$ btsync --config btsync.config
BitTorrent Sync forked to background. pid = xxxxx
```

本当はちゃんと、OS起動時にプロセス起動するように init.d とかに仕込んだりするべきだろうけど、とりあえずこのまま動かしてみる。


# 自宅の MacBook pro に BitTorrent Sync をインストール

[ここ](http://www.bittorrent.com/intl/ja/sync) からクライアントをダウンロードし、インストール。

BitTorrent Sync を起動するとメニューバーにアイコンが表示されるので、そこからメニューを開「BitTorrent Sync を開く」

![スクリーンショット 2014-04-09 3.29.20.png](https://qiita-image-store.s3.amazonaws.com/0/8219/fe1c85af-b7bc-a2c4-1e8d-a9d44194a5c4.png "スクリーンショット 2014-04-09 3.29.20.png")

BitTorrent Sync の「フォルダを追加」をクリック

![スクリーンショット 2014-04-09 3.22.19.png](https://qiita-image-store.s3.amazonaws.com/0/8219/f0af886b-687d-943c-84dc-d34467bfd5e8.png "スクリーンショット 2014-04-09 3.22.19.png")

同期するフォルダを追加のダイアログが開くので以下を入力

* 共有シークレットキー : btsync.confの "secret" に設定した値
* 同期するフォルダ : ローカル端末上の同期フォルダの場所

![スクリーンショット 2014-04-09 3.24.19.png](https://qiita-image-store.s3.amazonaws.com/0/8219/382704b4-21a7-8ef1-f23b-521aff5c02e6.png "スクリーンショット 2014-04-09 3.24.19.png")

これで同期設定完了。

iPhone, Android 等はそれぞれの AppStore からダウンロード／インストールする。


# 参考

[How to install and configure a BitTorrent Sync server](http://www.ruchirablog.com/install-configure-bittorrent-sync-server/)

[BitTorrentSync UserGuide](http://btsync.s3-website-us-east-1.amazonaws.com/BitTorrentSyncUserGuide.pdf)
プログラミング言語別 split の実験

# プログラミング言語別 split の実験

## 概要

ふと文字列の分割 (`split`) の挙動が気になったので手元のいくつかの言語で試してみました。
環境は Mac OS X 10.9.2 です。

## 実験

文字列の前後にセパレータがある場合、`split` が返す結果がどうなるのか実験です。
分割対象の文字列は `,hoge,fuga,` で、セパレータは `,` として結果を見てみます。

### Elixir

```bash
$ elixir --version
# Elixir 0.12.5
$ elixir -e "IO.inspect String.split(\",hoge,fuga,\", \",\")"
# ["", "hoge", "fuga", ""]
```

### Node.js

```bash
$ node --version
# v0.10.26
$ node -p "',hoge,fuga,'.split(',')"
# [ '', 'hoge', 'fuga', '' ]
```

### Perl

```bash
$ perl --version
# This is perl 5, version 16
$ perl -e "print join(',', split(',', ',hoge,fuga,'))"
# ,hoge,fuga
```

### PHP

```bash
$ php --version
# PHP 5.4.24
$ php -r "print_r(split(',', ',hoge,fuga,'));"
# Array
# (
#     [0] =>
#     [1] => hoge
#     [2] => fuga
#     [3] =>
# )
```

### Python

```bash
$ python --version
# Python 2.7.6
$ python -c "print ',hoge,fuga,'.split(',')"
# ['', 'hoge', 'fuga', '']
```

### R

```bash
$ r --version
# R version 3.0.3 (2014-03-06) -- "Warm Puppy"
$ r -q -e "unlist(strsplit(',hoge,fuga,', ','))"
# [1] ""     "hoge" "fuga"
```

### Ruby

```bash
$ ruby --version
# ruby 2.0.0p247
$ ruby -e "p ',hoge,fuga,'.split(',')"
# ["", "hoge", "fuga"]
```

## 結果発表

| 言語 | 結果 |
|-----|-----|
| Elixir | "", "hoge", "fuga", "" |
| Node.js | "", "hoge", "fuga", "" |
| Perl | "", "hoge", "fuga" |
| PHP | "", "hoge", "fuga", "" |
| Python | "", "hoge", "fuga", "" |
| R | "", "hoge", "fuga" |
| Ruby | "", "hoge", "fuga" |

`split` が返す結果の最後に差が出ました。Perl, R, Ruby は空文字が無いという結果に。

みんな大好き `ECMA-262` の場合、[String.prototype.split](http://www.ecma-international.org/ecma-262/5.1/#sec-15.5.4.14) を見ると、最後のセパレータにマッチする箇所から対象文字列の最後までも部分文字列として扱うため空文字が挿入される仕様のようです。(`T` = 切り出される文字列, `S` = 対象の文字列, `p` = セパレータの位置, `s` = 対象の文字列の文字数)

> 14\. Let `T` be a String value equal to the substring of `S` consisting of the characters at positions `p` (inclusive) through `s` (exclusive).

最後の空文字が無い言語の仕様が気になります。

## まとめ

`split` を使う場合は、セパレータが文字列の最後にあると言語によって挙動が違うよ、という微妙な知識が得られました。
今回実験しなかった言語のバージョンも誰かお願いします。
Fieldset::forge()で一発設定したい

FuelPHPのFieldsetは便利だが、forgeした後に色々と設定していくため、Controllerが煩雑になる。

```php:fuel/app/classes/controller/foo.php

$foo_fieldset = Fieldset::forge('foo');
$foo_fieldset->add(
  'article_title',
  'Title',
  array('class' => 'pretty_input')
);

$ops = array('male', 'female');
$foo_fieldset->add(
  'gender',
  '',
  array('options' => $ops, 'type' => 'radio', 'value' => 'true')
);

$vm = ViewModel::forge('forge');
$vm->set('fs', $foo_fieldset);

```

↑みたいなのは嫌だ。

```php:目指すところ
$foo_fieldset = Foo_Fieldset::forge();
$vm = ViewModel::forge('foo');
$vm->set('fs', $foo_fieldset);
```

↑みたいな感じが俺的には嬉しい。

```php:fuel/app/classes/fieldset/foo.php

class Fieldset_Foo extends \Fuel\Core\Fieldset
{
  public static function forge($name = 'foo', array $config = array())
  {
    if((static::$_instance = parent::forge($name, $config)) === false){
      return false;
    }

    static::$_instance->add(
      'article_title',
      'Title',
      array('class' => 'pretty_input')
    );

    $ops = array('male', 'female');
    static::$_instance->add(
      'gender',
      '',
      array('options' => $ops, 'type' => 'radio', 'value' => 'true')
    );

    return static::$_instance;
  }
}

```

更に基底クラスを用意して、mustacheに渡しやすい感じにも出来た。嬉しい。
JavaScript・jQueryの関数について

# JavaScript・jQueryの関数について

jQuery 最高の教科書を読んで、

javascript・jQueryを改めて勉強・まとめていこうと思いました。

よく使う「関数」についてまとめてみた。

## 関数とは

「何らかの一連の処理を行う、複数の命令の集まり（命令群）」

関数は、同一コード内は元より、他のコードからも呼び出すことができる。

* 繰り返し実行する処理
* 何度も利用する処理

また、一連の処理をまとめることによって、処理内容を変更する際の手間を大幅に軽減することができる。（保守性）

###### 関数を使用しない場合

```` javascript
$(function(){
	$('#typo')
		.on('mouseover', function(){
			// 処理A
			// 処理B
			// 処理C
		});
	$('header')
		.on('mouseover', function(){
			// 処理A
			// 処理B
			// 処理C
		});
	$('footer')
		.on('mouseover', function(){
			// 処理A
			// 処理B
			// 処理C
		});
});
````

###### 関数を使用した場合

```` javascript
$(function(){
	$('#typo')
		.on('mouseover', 関数名);
	$('header')
		.on('mouseover', 関数名);
	$('footer')
		.on('mouseover', 関数名);
	function 関数名 () {
		// 処理A
		// 処理B
		// 処理C
	}
});
````

* 処理が複雑になればなるほど、関数を使用するメリットは高くなる
* コード量が軽減できる
* 一連の処理の所在が明らかになる
* 処理内容の修正に対応しやすくなる

## 引数について

引数をよく理解できてなかったので、調べてみました。

###### 引用元 参考サイト

[引数とは何ですか？難しいのでわかりません(>_<)！ Yahoo知恵袋](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1315948363 "引数とは何ですか？難しいのでわかりません(>_<)！")


> 初歩的な理解のために、次のようなものをイメージしてください。

> ここに、「海水を真水に変える装置」があるとします。

> この装置に海水を投入すると、真水が得られます。

> この装置に投入する海水が引数にあたります。

> 海水を真水にする装置がプログラムです。

> その結果出てきた真水が戻り値です。

* 装置 → プログラム
* 海水 → 引数
* 結果 → 戻り値

関数には引数を渡すことができる

料理をするための材料・もしくは道具みたいな感じだと思いました。

引数とは、関数に与える数値や文字列などの情報となります。

## 関数の作り方

###### 関数の作り方 構文

```` javascript
function 関数名 (引数1, 引数2...) {
	実行する処理(引数1と引数2は関数内では変数のように利用できる)

	return 値;
}
````

* 最初に「function」を記述する
* function に続いて任意の関数名を指定する
* 関数名に続いて () を記述し、必要な場合は「,」(カンマ)区切りで引数を指定する
* 引数は複数指定することも、指定を省略することも可能
* () に続いて {} を記述し、その中に「実行する処理」を記述する
* {} 内では、引数は変数と同様に使用できる
* 関数の呼び出し元に何らかの値を返す場合は return 文を記述する
* return 文は省略可能(何も値を返さない場合)

###### 関数の作成例

```` javascript
function add (num1, num2) {
	return num1 + num2;
}
````

## 関数の呼び出し方

###### 関数の呼び出し方 構文

```` javascript
関数名( 引数1, 引数2 ...);
````

使用する関数名の後に()を記述し、その()の中に引数(関数内の処理で使用するデータ)を指定

※関数に引数が指定していない場合は呼び出し時も省略できる

```` javascript
var added1 = add(1, 2);
var added2 = add(6, 7);
var added3 = added1 + added2;

function add(num1, num2){
	return num1 + num2;
}
````

## 無名関数

関数名を省略した関数を作成することができる。

このような関数のことを「無名関数」と呼ぶ

```` javascript
function('引数', '引数'){
	実行する処理（引数1と引数2は関数内では変数のように使用できる）

	return 値;
}
````

jQueryのメソッドの引数に関しては、よく無名関数が使われる

```` javascript
$(function(){
	$('#typo').on('mouseover', function(){
		$('#typo').css('color', '#ebc000');
	});
});
````

無名関数内では、$('typo').css('color', '#ebc000');という処理が実行されています。

処理を複数の箇所で使い回すためではなく、引数として一連の処理を直接渡す際などにも無名関数を利用できる

### 無名関数を変数に格納する

無名関数を以下のように変数に格納すると、その変数名を用いて関数を呼び出すことが可能である。

■構文 無名関数を変数に格納する方法

```js
var 変数名 = function( 引数1, 引数2... ) {
    実行する処理(引数1と引数2は関数内では変数のように使用できる)
    return 値;
}
```

■無名関数の使用例（関数名の指定）

```js
var add = function(num1, num2){
    return num1 + num2;
}
var added1 = add(1,2); //変数added1には「3」が格納される
```

無名関数名に関数名を割り当てると、通常の関数のように別の箇所から関数を呼び出すことが可能になる。

※通常の関数と名前付き無名関数には「関数を実行できるタイミング」に違いがある

* 通常の場合(functionに続けて関数名を指定した関数)

関数の作成箇所に関わらず、その関数を使用できるスコープ内であれば、どこからでも呼び出すことが可能

* 変数に格納した無名関数の場合

関数の作成箇所よりも下部でないと呼び出すことができない
try-catch-finally 例外処理


例外処理では、try-catch-finallyを使います。
catch句でreturnをした場合の挙動について気になったので、確認した結果を残しておきます。

##正常動作

###プログラム
```java:main.java
public static void main(String[] args) {
	try {
		// try A
		System.out.println("Try A-1");
		try {
			// try B
			System.out.println("Try B");
		} catch (NullPointerException e) {
			System.out.println("Catch B:NullPointerException");
		} finally {
			System.out.println("finally B");
		}
		System.out.println("Try A-2");
	} catch (Exception e) {
		System.out.println("Catch A:Exception");
	} finally {
		System.out.println("finally A");
	}
}
```

###動作結果

```markdown
Try A-1
Try B
finally B
Try A-2
finally A
```
上から順に処理が流れる。

##例外発生
try BでNullPointerExceptionが発生したとすると・・・

###プログラム

```java:main.java
public static void main(String[] args) {
	try {
		// try A
		System.out.println("Try A-1");
		try {
			// try B
			System.out.println("Try B");
			// ここで例外発生！
			throw new NullPointerException();
		} catch (NullPointerException e) {
			System.out.println("Catch B:NullPointerException");
		} finally {
			System.out.println("finally B");
		}
		System.out.println("Try A-2");
	} catch (Exception e) {
		System.out.println("Catch A:Exception");
	} finally {
		System.out.println("finally A");
	}
}
```

###動作結果
```markdown
Try A-1
Try B
Catch B:NullPointerException
finally B
Try A-2
finally A
```
例外をcatchしているので、この場合も上から処理が流れる。

##catch句でreturn
catch句でreturnをすると・・・

###プログラム
```java:main.java
public static void main(String[] args) {
	try {
		// try A
		System.out.println("Try A-1");
		try {
			// try B
			System.out.println("Try B");
			// ここで例外発生！
			throw new NullPointerException();
		} catch (NullPointerException e) {
			System.out.println("Catch B:NullPointerException");
			// cacth句の中でreturn
			return;
		} finally {
			System.out.println("finally B");
		}
		System.out.println("Try A-2");
	} catch (Exception e) {
		System.out.println("Catch A:Exception");
	} finally {
		System.out.println("finally A");
	}
}
```

###動作結果
```markdown
Try A-1
Try B
Catch B:NullPointerException
finally B
finally A
```
例外をcatchしたところでreturnしているので、catch以降の処理（Try A-2）は処理されない。
<b>ただし、finallyは処理される。</b>

##catchしていない別の例外発生
try BでNullPointerException以外の例外が発生すると・・・

###プログラム
```java:main.java
public static void main(String[] args) {
	try {
		// try A
		System.out.println("Try A-1");
		try {
			// try B
			System.out.println("Try B");
			// ここでcatchしない例外発生！
			throw new RuntimeException();
		} catch (NullPointerException e) {
			System.out.println("Catch B:NullPointerException");
			return;
		} finally {
			System.out.println("finally B");
		}
		System.out.println("Try A-2");
	} catch (Exception e) {
		System.out.println("Catch A:Exception");
	} finally {
		System.out.println("finally A");
	}
}
```

###動作結果

```markdown
Try A-1
Try B
finally B
Catch A:Exception
finally A
```
例外をcatchしていないので、例外はスルーされるがfinallyは処理される。

##まとめ
とにかく
<big>finallyは、例えその前でreturnされていても処理される！</big>

###余談
仕事でプログラムを書くときはとにかく例外処理を入れるようにしています。
ただ、むやみやたらと例外処理を入れている（「その例外本当に発生する？？？」という）ソースも見かけます。
そこらへんは、ちゃんと見極めてコーディングしたいですね。
[Apache]Basic認証を設定する手順メモ


ときどき設定するときに、あれどうやるんだっけな〜となるのでメモ。

### ① .htaccessファイルに下記を追記

```apache:.htaccess
AuthType Basic
AuthUserFile /path/to/.htpasswd
AuthName "Input your password"
require valid-user

<Files ~ "^.(htpasswd|htaccess)$">
deny from all
</Files>
```

※ `AuthUserFile` は絶対パスで記述すること

### ② .htpasswdファイルを作成する

上記 `AuthUserFile` で指定したディレクトリまで移動し、

```
# htpasswd -c .htpasswd hoge-name
```

Basic認証用のユーザ `hoge-name` に対して設定するパスワードを聞かれるので、入力する

```
New password:****
Re-type new password:****
```

以上
ログファイルの切り分けの覚書　その１

ＳＥ復帰して最初の仕事がログの切り分け。
そして帆波さんそもそもCUI殆ど使ったことない。むしろ趣味でしか触ってないので実質皆無。
以前はWinSCP使ったりしてだいぶ誤魔化してたからなぁ。
どーすりゃいいのか、とか行ってても始まらんので頑張る。

１：全部一行のログが１ファイルにある場合
例えば

accesslist.log
2014/04/06 00:00:00 hogehoge
...
2014/04/06 23:59:00 homuhomu
2014/04/07 00:01:00 higehige
...
2014/04/07 23:13:41 hagehage
2014/04/08 00:00:00 fugafuga
[EOF]

みたいな場合。
grep "2014/04/06" accesslist.log > accesslist.log.20140406
grep "2014/04/07" accesslist.log > accesslist.log.20140407
grep "2014/04/08" accesslist.log > accesslist.log.20140408

でいける…はず。

２：１行ファイルでさっきのとは別に4/8のファイルが有る場合

accesslist2.log
2014/04/08 01:00:00 fugagaga
2014/04/08 04:06:00 fufugaga
[EOF]

……誰ですかログ切り替えの時間ミスった人は（実際はコンマ秒レベル誤差でしょうが無いし実際よくある気がする）

cat accesslist.log accesslist2.log | grep "2014/04/08" > accesslist.log.20140408

または１でファイル作ってれば
cat accesslist.log.20140408 >> accesslist2.log

これでいいですか？わかりません＞＜
多分基礎中の基礎だと思うんだけど、このレベルからコツコツやらんといかんなぁ。鈍りすぎ。

次回予告
３：１行ファイルがbz2で固めてある場合(tarでも同じ？)
どうせbzcat使うんでしょ俺

４：書式がめんどくさい場合
つーか適当に書いたけど将来的にはawk使いたい

９９８：複数行にわたっている（定形）
９９９：複数行と１行が入り乱れてる（不定形）
力技しか浮かびませんがどうしたもんか
Travis CIでxcprettyを使ってxcodebuildのログをきれいにする

# 背景
xcodebuildを使ってビルドを行うと整理されていない不要なビルドログがたくさん出てしまうので、Travis CIを使ってテストを日常的に行っていたとしてもいざテストが落ちた場合にどこが問題あるのかがすぐに見つけられずイライラする事が多いと思います。

# xcpretty
## xcprettyとは

xcprettyを使うとxcodebuildが出力するビルドログをきれいに整理して色つきで出力できるようになります。利用方法もxcodebuildの結果をパイプで受け取るだけなので非常に簡単です。

ログの出力形式をrspec風にしたりJUnitレポート形式のxml出力等もできるようです。

### xcpretty
https://github.com/supermarin/xcpretty

## xcprettyをTravis CIに導入する

xcprettyを導入するとTravis CIにおいても以下のようにログがきれいに整理され色付きで出力することが出来ました。画像の通りログの見た目・わかりやすさの違いは歴然です。

### 通常
https://travis-ci.org/radioboo/XcprettySample/builds/22536887

![スクリーンショット 2014-04-09 0.24.32.png](https://qiita-image-store.s3.amazonaws.com/0/30355/f6418122-cef1-bd9c-e880-03162cb8a7c8.png)


### 導入後
https://travis-ci.org/radioboo/XcprettySample/builds/22537783

![スクリーンショット 2014-04-09 0.33.03.png](https://qiita-image-store.s3.amazonaws.com/0/30355/6a874154-a2c9-205c-d097-0c8d7a6caa25.png)

## インストールと設定

- .travis.ymlを用意してTravis CIでビルドを実行できるようにしておきます。
    - https://github.com/radioboo/XcprettySample/blob/master/.travis.yml
- gemでxcprettyをインストール
    - Gemfileをリポジトリのトップレベルに用意しておくとTravis CIが勝手にインストールしてくれます。
    - https://github.com/radioboo/XcprettySample/blob/master/Gemfile
- xcodebuildの出力をパイプしてxcprettyに渡すようにビルドコマンドを変更します。

```
xcodebuild test -scheme XcprettySample -destination "name=iPhone Retina (3.5-inch),OS=7.0" -configuration Debug | bundle exec xcpretty -c
```

### 重要な設定

Rakefileでビルドを行うような場合にテストが落ちてもrakeコマンドの終了ステータスが正常なため、Travis CI的には"Passed"となってしまうことがありました。xcodebuildコマンドの終了ステータスをrakeコマンドが引き継いでくれないためなので、これを回避するためにxcprettyのREADMEにもあるように、xcprettyコマンドの最後に"PIPESTATUS"を渡すように追記して対応を行いました。

```
xcodebuild test -scheme XcprettySample -destination "name=iPhone Retina (3.5-inch),OS=7.0" -configuration Debug | bundle exec xcpretty -c && exit ${PIPESTATUS[0]}
```

## というわけでオススメ

これだけでログがきれいに整理されてテストの結果が非常に見やすくなって開発効率があがるのでオススメです。
GCDでWaitForMultipleObjectsを代替する方法


複数の非同期処理を待つのにWindowsAPIのWaitForMultipleObjects的なメソッドがないかなと探してたんですが、調べるの結構大変だったので、自分用にメモを残しておきます。

```objectivec
dispatch_group_t group = dispatch_group_create();
  
  [self.arrayLocalSearch removeAllObjects];

  NSError* error = nil;
  NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];
  NSEntityDescription* entity = [NSEntityDescription entityForName:@"Location"
                                            inManagedObjectContext:[MapData sharedManager].managedObjectContext];
  
  [fetchRequest setEntity:entity];
  [fetchRequest setFetchBatchSize:40];
  NSArray* locations = [[MapData sharedManager].managedObjectContext executeFetchRequest:fetchRequest error:&error];
  if(error){
    LOG(@"Unresolved error %@ %@",error,[error userInfo]);
  }
  
  for(Location* location in locations){
    dispatch_group_enter(group);
    if (!location.geocoding) {
      [self searchShopLocation:location
                         block:^{
                           dispatch_group_leave(group);
                         }];
    }else{
      CustomMapItem* customItem = [[CustomMapItem alloc] init];
      customItem.location = location;
      self.mapAnnotations[location.name] = customItem;
      dispatch_group_leave(group);
    }
  }
  
  //全ての非同期処理が完了したら、メインスレッドで実行される
  dispatch_group_notify(group,
                        dispatch_get_main_queue(),
                        ^{
                          //NSLog(@"done");
                          [self.mapView removeAnnotations:self.mapView.annotations];  // remove any annotations that exist
                          NSMutableArray* array = [NSMutableArray arrayWithCapacity:self.mapAnnotations.count];
                          for (id key in [self.mapAnnotations keyEnumerator]) {
                            [array addObject:self.mapAnnotations[key]];
                          }
                          
                          [self.mapView addAnnotations:array];
                        });

```

作成中のアプリのコードをサンプルに流用したのでわかりにくいですが、ポイントとしては、

1. dispatch_group_t group = dispatch_group_create();
2. dispatch_group_notify(group,...
3. dispatch_group_enter(group);
4. dispatch_group_leave(group);

1がグループを作成します。
2がグループの処理が終わるまで待機する関数です。WaitForMultipleObjects関数に相当します。
3と4がCreateEvent(ResetEvent),SetEventに相当します。

上記のイメージで扱うとわかりやすいと思います。

参考：[エキスパートObjective-Cプログラミング](http://amzn.to/1hzyD4N)
vim で複数ファイルから検索置換


## 設定
```.vimrc
# Qfreplace 使用
NeoBundle "thinca/vim-qfreplace"

# 外部grepに使うプログラム設定
set grepprg=ag\ -a
```

```console
$ vim
```

で起動し、

```vim
:grep {検索文字又は正規表現} ** | cw
```

で外部grepが走る。** は全ファイル。
ウインドウが vim に戻ったら

```
:Qfreplace
```

で 新しいウインドウができるので、置換を行い、保存する。
[Rails] 指定したレコードの取得 (条件 A でソートし、かつ条件 B に一致するデータの取り出し)


## 以下のようなレコードを持った Student テーブルがあると仮定

|id|class|score|
|------|:------:|---:|
|3|10|2|
|4|1|4|
|5|1|5|
|6|1|4|
|7|1|4|
|8|1|3|

## score でソートし、かつ class が 1 であるもののみを取り出す

```rb
Student.order("score").where(class: 1)
```

* 結果

|id|class|score|
|------|:------:|---:|
|8|1|3|
|4|1|4|
|6|1|4|
|7|1|4|
|5|1|5|

## score のソートを降順にする

```rb
Student.order("score DESC").where(class: 1)
```

|id|class|score|
|------|:------:|---:|
|5|1|5|
|7|1|4|
|6|1|4|
|4|1|4|
|8|1|3|

## score で降順にソートし、1 つめを取り出す

```rb
Student.limit(1).order("score DESC").where(class: 1)
```

|id|class|score|
|------|:------:|---:|
|5|1|5|
環境に応じてシェルのプロンプトの色を変えるなど

`~/.bashrc` でも `/etc/profile` でも `/etc/profile.d/myprompt.sh` でもいいんだけど、こんな風に書いておくと、ホスト名が honban の時だけプロンプトが赤くなる。

```bash
PS1="[\u@\h \W]\$ "
if [ "$(hostname)" == "honban" ]; then
  PS1="\[\033[31m\]${PS1}\[\033[0m\]"
fi
```

最初の行の PS1 をどうするかは、`echo $PS1` するとかして判断してほしい。

if の中の条件はなんでもいい。例えば Amazon EC2 で stage タグが production の時だけ赤くするとか、業務時間外だと赤くなるとか。

参考

 * [bashのプロンプトに色をつける | ﾌﾞｰログ](http://ambiesoft.fam.cx/blog/archives/1122)
 * [ASCII Table - ANSI Escape sequences](http://ascii-table.com/ansi-escape-sequences.php)
クラスプロパティを非同期設定して継承先で使う


これはBのインスタンスを生成して発火するプログラムだとする。（Aは抽象クラスとして生成しない）

```
class A
 @setting = () ->
  a = {x: 12312, y: 412}
  @later = a

class B extends A
 setting = @setting
 constructor: () ->
  setting()
  c = new C() # 後述
 laterGet = () -> @later.x
b = new B()
```


## 何をやってんの

これはBのインスタンスが生成されると、抽象クラスのメソッドを発火して、A以下のクラス群で共有する予定のオブジェクト@laterを生成する状況を想定したcoffeeです。
（実際はcanvasを動的生成して共有したかった）
ここからBを継承するCクラスなるもの（別にA継承でもいいが）があったとする。
上のプログラムの後に生成されるCは、その共有されるはずのオブジェクトのプロパティだけを使いたかった。

```
class C extends A
 [x, y] = [@later.x, @later.y] # error
　later = @later # error
```


我これだとエラーがおきる、@later名前がまだない。
クラスプロパティとかまともに使えんのか？と不安になる。


## 解決
１．つまり継承先で素で@laterを表記してはいけない。
２．それでもプライベートな値として使いたい（すっきり使いたい）ので箱は用意しておく。初期化関数を書く羽目になる。
３．クラスプロパティのスコープを維持するためにプライベートな関数で初期化を設定する。
４．初期化保証のコンストラクタで呼ぶ。-> 通った！

```
class C extends A # 別にBでもいい
 [x, y] = [0, 0]
 initialize = () ->
  l = @later
  [x, y] = [l.x, l.y]
 constructor: () ->
  initialize()
 show: () -> x

```

動的に生成される定数があったとしても、その定数がいつ作られたかを知る仕組みを持っていないっていうお話。


### 有意義な時間かは分からない

でもこうなるとなんでCが@laterを知ってるの？ってなって、かっこわるい気がしてきたり
bindでがんばってもよかったような気がしたり
結局A, B, Cの順に起こせるようにオブジェクト関係見直せよ、とか
思ってしまって、無意味な時間を過ごした感じがしました、おしまい
Macのboot2dockerでフォルダを共有する

# Macのboot2dockerでフォルダを共有する

Docker0.8でMacOSXがサポートされたわけですが、boot2dockerを使って起動するとVagrantから起動してたときより速いわけですね。

んで、boot2dockerで起動する場合のフォルダ共有の仕方が結構たいへんだったというあれです。

## dockerの用意

VirtualBox入れて

```
$ brew tap homebrew/binary
$ brew install docker boot2docker
```
でとりあえずインストールします。

## isoをダウンロード

んでこれでインストールされるboot2dockerのisoだとうまくいきません。

そこで下記のisoをダウンロードしてきます。
https://dl.dropboxusercontent.com/u/12014139/boot2docker.iso

## isoの向き先変更

先ほどDLしたisoを使って起動するよう設定する必要があります。

$HOME/.boot2docker/profile

というファイルを作って

```
BOOT2DOCKER_ISO=~/path/to/boot2docker.iso
```

って感じでDLしたisoを指定します。

## 共有するフォルダを指定
実際に共有するフォルダを指定します。

ここではHOMEディレクトリを共有するサンプルです。
```
$ VBoxManage sharedfolder add boot2docker-vm -name home -hostpath $HOME
$ boot2docker up
$ boot2docker ssh "sudo modprobe vboxsf && mkdir -p $HOME && sudo mount -t vboxsf home $HOME"
```
これでDockerのHostとディレクトリが共有されます。
## Docker起動

先ほど共有したフォルダを今度は起動したコンテナと共有します。

```
$ docker run -i -t -v ~/Documents/hoge:~/hoge hoge/moge /bin/bash
```

こんなかんじで無事共有されますね！！

上記でDLしているisoは

https://github.com/boot2docker/boot2docker/pull/284

ここで公開されてる試験的なやつです
WildFlyでMySQL datarouceの作成

# 概要

WildFlyにJDBCドライバを設定し、datasourceを作成する。
modulesディレクトリにjarを配置してxmlを編集する方法もあるが、WildFlyの推奨にしたがって、jarをデプロイする方法でやってみる。こうすることでdomainモードでも個々のサーバに設定する必要がなくなる。

# 環境

* Linux Mint 16 Petra
* WildFly 8.0.0.Final
* MySQL Connector/J 5.1.30

# 事前準備

MySql にexampleデータベースを作成しておく。

# 内容

* MySQLのJDBCドライバをダウンロードして解凍。

```bash
$ wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.30.zip
$ unzip mysql-connector-java-5.1.30.zip
```

* デプロイするためのファイルを作成。

　(2014/4/17 追記　mysqlのjarにはすでにMETA-INF以下があるため、この作業とjarの更新は必要ないようです。jarをそのままデプロイするだけでよいです。)

```bash
$ cd mysql-connector-java-5.1.30
$ mkdir -p META-INF/services
$ vi META-INF/services/java.sql.Driver
```

```text:META-INF/services/java.sql.Driver
com.mysql.jdbc.Driver
```

* jarを更新

```bash
$ jar \-uf mysql-connector-java-5.1.30-bin.jar META-INF/services/java.sql.Driver
```

* 管理コンソールのRuntime -> Manage Deployments から先程更新したjarをデプロイする。デプロイ後にEn/Disableボタンを押して有効化しておく。

![jdbc_deployment.png](https://qiita-image-store.s3.amazonaws.com/0/41215/186e3366-74d5-8bc6-dfde-aa03ca8020f4.png)

* 管理コンソールのProfile -> Datasrouces -> JDBC Datasources からdatasourceを追加する。

```
Step 1/3: Datasource Attributes

Name: mysqlexampleDS
JNDI Name: java:/mysqlexampleDS
```
```
Step 2/3: JDBC Driver

先程デプロイしたmysql-connector-java-5.1.30-bin.jarを選択する。
```
```
Step 3/3: Connection Settings

Connection URL: jdbc:mysql://localhost:3306/example
Username: example
Password: example
```

* 最後にEnableボタンを押して有効化する。

![datasource.png](https://qiita-image-store.s3.amazonaws.com/0/41215/c981e964-e248-46a5-2a7a-34af97d1a1de.png)

* 下の方にあるConnectionからTest Connectionを押して疎通することを確認する。

![testconnection.png](https://qiita-image-store.s3.amazonaws.com/0/41215/0c94551c-e750-9055-da64-c2ed86273c15.png)



# 参考
* JDBC Driver Installation https://docs.jboss.org/author/display/WFLY8/DataSource+configuration

* MySQL Connector/J クラス名 http://dev.mysql.com/doc/refman/5.1/ja/connector-j-reference-configuration-properties.html
プログラマのための簡単な型理論入門


## はじめに

昨今のプログラミング言語では型が重要だってことは間違いない。

そして、型理論がその一翼を担っている。

しかし、型理論ってのはそれ専用の記法で書かれている。
焦るとまったく分けの分からない物と目に映るだろう。

例えば以下の式を見よう。

```
Γ |- t1 : T1 -> T2    Γ |- t2 : T1
--------------------------------------
          Γ |- t1 t2 : T2
```

この式の意味は、t1の型がT1->T1でt2の型がT1の時、関数t1にt2を適用した値の型はT2になるという意味である。

と、書かれても訳の分からない事が書かれていると思うはずだ。
分かっている人からすると正しくない文章だとなるだろう。
なぜ、正しくないのか？
なぜ、難しいのか？

## 難しいと感じるという事

実のところは難しいというのは、実は必要なら覚えるが必要でなさそうだから覚える必要がない物だと判断したということなのだ。必要ないから覚えたくないという拒絶をしているのである。
そのような判断をしているときに無理に読もうとすると眠くなる。
この眠りの魔法を解こう。

## 環境によって状況は変わる

さっきの式から Γ |- を取り除こう。邪魔な存在は消した方が分かりやすい。

```
t1 : T1 -> T2    t2 : T1
-------------------------
       　t1 t2 : T2
```

これでも、t1はT1を受け取ってT2を返し、t2はT1のときにt1にt2を適用した型はT2だと言う事が表せるし、何の問題も無いように思える。

以下の例はt1とt2がTestクラスの中にあって、殆ど同じ環境下にある。
殆どというのは、t2の環境にはargvという変数が追加されているので正しくは違う環境である。

```
class Test {

  static String t1(int a) { return ""+a; }
  static int t2 = 1;
  static void main(String[] argv) {
    String result = t1(t2);
  }
}
```
この場合は、t1にt2を適用した場合の結果の型はStringである。

次の例はどうだろう？

```
class Test {
  static String t1(int a) { return ""+a; }
}
class Test2 {

  static int t1(int a) { return a; }
  static int t2 = 1;
  static void main(String[] argv) {
    int result = t1(t2);
  }
}
```
この場合の、Testのt1とTest2のt2を取り出した場合には、t1の型がintを受け取ってStringを返し、t2の型がintのとき、t1にt2を適用した結果の型はintになる。

```
t1 : T1 -> T2    t2 : T1
-------------------------
       t1 t2 : T1
```
のようになってしまった。

環境が変われば、環境が同じなら正しい事も、環境が変われば正しくなくなるのである。

こういった環境の差からくる問題は良くある。

たとえば宗教や国レベルになると環境が違うので、常識が通じなくなって対立が起きたり争いが起きる。t2からすれば、argvは当たり前にあるかもしれないが、t1にとってargvは触る事が出来ない存在なのである。

## 環境の違いを意識する

これでは困るので、環境は同じであるという事を示したい。
環境は宗教に例えるなら神に相当する物である。同じ神を崇めるもの同士なら共通の価値観を共有するのでうまくのだ。
その為の記法が必要だ。環境を司る神といえばガイア(Γαῖα)がいる。

![86db10c586d5b6ba4aed74891e2b8b28.jpg](https://qiita-image-store.s3.amazonaws.com/0/25489/42da52d7-7f01-0d5c-cdcb-a81f164aeed3.jpeg "86db10c586d5b6ba4aed74891e2b8b28.jpg") 
大地の神ガイア

ガイアの頭文字Γ(ガンマ)を使って環境を表そう。

最初の例を書くと以下のようになる。

```
Γ|- t1 : int->String      Γ |- t2
----------------------------------
Γ,argv:String[] |- t1 t2 : String
```

後の例を書くと以下のようになる

```
Γ|- t1 : int->String      Γ,t1:int->String |- t2
------------------------------------------------
Γ,t1:int->String,argv:String[] |- t1 t2 : int
```

これは型環境とか、文脈とか言う意味である。

神の領域と人間の領域を隔てる記号がTを横に倒したような|-という記号なのである。下を横に倒したと思うと分かりやすいのかもしれない。 環境を司る大地の神ガイアΓαῖαの元に項があるのだ。Γは文脈でもあるからHaskellでいえばモナドである。モナドはガイアに例える事が出来るだろう。

Γを神に例えたが、そんなにΓが凄い訳存在という訳ではない。
変数名から型を表すデータが入っているMapだ。
文字列から型を表すデータへの連想配列にすぎないのだ。Γは言語を作ったわけではなく、ただ環境を提供するだけである。

普通のプログラミング言語では、環境の中身を書く事はないのだけど、プログラミング言語の事を研究するような場合には、環境の中身を意識する必要があるのでこのような記法がある。

神を意識する必要のない人には神は必要ないけど、環境の違いを意識する為には神や国や言葉や法律を意識するのが良い。環境を同じにすれば話はスムーズに進むが、環境を同じにしたグローバル環境だけでは不便だ。複数の環境がある場合は、それは違う環境である事を示せば話はうまく進むのである。

## まとめ

Γはガンマと読み、型環境を表す。
|-の左に型環境を書いて、右側に項を書く。

:は型を表す演算子で左側に項を右側に型を書く。

```
Γ |- t1 : T11 -> T12    Γ |- t2 : T11
--------------------------------------
Γ |- t1 t2 : T12
```

このような式は、眠りの魔法ではない。
世の中を見る為の素晴らしい式だ。
Γはガイアやモナドに例えられる。|-は下を横に倒した記号だと思えば想像がつきやすい。

只の型環境Γの元にt1という関数とt2という変数と型T11とT12という型があった場合には、t1にt2を適用した式の型はT12だということなのだ。
JavaScriptでDOMツリーの要素を数えあげる


Chrome developer toolとかFirebugでDOMツリーの内容は見れるのですが、エレメント数をさくっと集計することはできなそうだったので、JSで実装しました。

JavaScriptコンソールにコピペして、

`` DOMTreeUtil.countTags(document.body); ``

などとすれば、引数のDOM要素以下をタグ名ごとに集計されます。
firefox addonとかchrome extensionとか探せばありそうだったな。


``` javascript
	var DOMTreeUtil = (function() {
    var visitAll = function(root, func) {
        _visit(root, func);
    };
    var _visit = function(elem, func) {
        if (!elem.hasChildNodes) return;
        var i, l;
        var child = elem.childNodes;
        for (i = 0, l = child.length; i < l; i++) {
            func(child[i]);
            _visit(child[i], func);
        }
    };

    var countTags = function(root) {
        var result = {};
        visitAll(root, function(elem) {
            if (elem.nodeType == Node.TEXT_NODE) {
                if (!result['text']) {
                    result['text'] = 0;
                }
                result['text']++;
            }
            else if (!result[elem.tagName]) {
                result[elem.tagName] = 1;
            } else {
                result[elem.tagName]++;
            }
        });
        return result;
    };

    return {
        visitAll: visitAll,
        countTags: countTags
    };
})();


```
Vimのコマンドラインモード（コロンのやつ）のときにカーソル下にある単語を入力する


vimで`:`を入力するとコマンドラインモードが始まりますが、このときテキスト中の単語をコマンドラインに持ってくる方法です。

`:`のあとの入力待ちになっているときに`<Ctrl-r><Ctrl-w>`と入力してください。
カーソル下にある単語がコマンドラインに入力されます。
Vimで前回選択した箇所を再度選択する


`v`（テキスト選択）や`Ctrl-v`（矩形選択）、`V`（行選択）をして作業が終了したあとにもう一度同じ場所を選択したいときがたまにありますよね。

そんなときはノーマルモードにいるときに`gv`です。
前回選択した箇所がそのまま選択されます。
Vimで選択操作中に始点/終点を切り替える


v（テキスト選択）やCtrl-v（矩形選択）、V（行選択）の選択中に`o`を押すとカーソル位置の始点/終点を選択しなおせます。

選択開始位置を間違えた場合などに、いちいち選択を解除せずに選択範囲を修正できてかなり便利です。
Vimで入力モードにいるまま簡単な計算をして結果を入力


入力モードにいるときに`<Ctrl-r>=3*15<CR>`と入力してみてください。（`Ctrl`と`r`を同時押ししたあとに`=`を入力。その後の数字も順に入力。`CR`は`Enter`のことです。）

上記例では`3 * 15`の結果がテキスト中に入力されると思います。

四則演算や余り計算ができますので、簡単な計算だけならVimで済んでしまいますね！！
LightTableにpareditのショートカットキーを設定する

[前回](http://qiita.com/kurogelee/items/7c04c77742ba7c0b2433)のつづき。

LightTableにはpareditというLisp系言語に便利な機能のショートカットを設定できるようです。

```clj:user.keymap
{:+ {:app {"ctrl-q" [:workspace.show]
           "alt-c" [:toggle-console :clear-console]}

     :editor {"ctrl-w" [:editor.watch.watch-selection]
              "ctrl-shift-w" [:editor.watch.remove-all]
              "ctrl-alt-w" [:editor.watch.unwatch]
              "ctrl-/" [:toggle-comment-selection]
              "ctrl-i" [:smart-indent-selection]
              "alt-left" [:editor.line-start-smart]
              "alt-right" [:editor.line-end]
              "alt-shift-left" [:editor.line-start-smart]
              "alt-shift-right" [:editor.line-end]
              "f3" [:find.next]
              "shift-f3" [:find.prev]
              "esc" [:find.clear :find.hide]
              "ctrl-pageup" [:window.zoom-in]
              "ctrl-pagedown" [:window.zoom-out]
              "f11" [:window.fullscreen]
              
              "ins left"  [:paredit.grow.left]
              "ins right"  [:paredit.grow.right]
              "ins ins left" [:paredit.shrink.left]
              "ins ins right" [:paredit.shrink.right]
              "home" [:paredit.move.up.backward]
              "end" [:paredit.move.down.forward]
              "ctrl-home" [:paredit.move.down.backward]
              "ctrl-end" [:paredit.move.up.forward]
              "f4" [:paredit.select.parent]
              "f5" [:paredit.unwrap.parent]
              }
     }
 :- {:tabs {"pmeta-w" [:tabs.close]}}}
```

| キー | 適用コマンド | 概要 |
|:---|:---|:---|
|ins left|:paredit.grow.left|現在のリストに左の要素を取り込む|
|ins right|:paredit.grow.right|現在のリストに右の要素を取り込む|
|ins ins left|:paredit.shrink.left|現在のリストの一番左の要素を左に追い出す|
|ins ins right|:paredit.shrink.right|現在のリストの一番右の要素を右に追い出す|
|home|:paredit.move.up.backward|親のリストの先頭に移動|
|end|:paredit.move.down.forward|子のリストの先頭に移動|
|ctrl-home|:paredit.move.down.backward|前方のリストの最後に移動|
|ctrl-end|:paredit.move.up.forward|現在のリストの最後に移動|
|f4|:paredit.select.parent|現在のリストを選択|
|f5|:paredit.unwrap.parent|現在のリストの囲いを削除|

~~まだあまり使っていませんが便利かもしれません。~~
少し使いましたが:paredit.grow.rightと:paredit.select.parentは便利ですね。

[つづき](http://qiita.com/kurogelee/items/4d3cf4364302b9990806)
WordPress のログインページに Basic 認証

最近、ロリポップで運用している WordPress に対して断続的に攻撃がありました。
具体的には、「wp-login.php に対し、複数回のログイン試行が確認されました。」（ロリポップからのメールより）というもの。
ロリポップでは、この攻撃を受けると自動的に .htaccess を書き換えて、管理画面にアクセス出来ないようにしてくれるのですが、それで対応されてしまうと .htaccess を書きなおさないと正規のユーザもログインできなくなってしまいます。
そこで、BASIC認証をかけることで、BASIC認証とwp-loginの二段構えにすることにしました。

```text:.htaccess
<Files wp-login.php>
AuthName	"Input ID & Password"
AuthType	Basic
AuthUserFile	/full/path/to/.htpasswd
Require	valid-user
</Files>
```

.htaccess ファイルは、wp-login.php と同じ場所に置きます。


.htpasswd ファイルは [htpasswdファイル作成](http://phpspot.net/php/pghtpasswd%E7%94%A8%E3%83%91%E3%82%B9%E4%BD%9C%E6%88%90%E3%83%84%E3%83%BC%E3%83%AB.html) などを見て作ってください。
数値の桁数を調べたい

ビット演算でフラグを立ててた時に、ふと数値の桁数を調べたくなった。
log関数を使うと求められるらしい。
はじめてlog関数使ったぁ。。

基数のデフォ値が`2`になってますが、
`10`のほうが使う機会多いかな？

## 実装
```coffeescript:coffee
getDigits = (num, base = 2)->
  Math.log(num) / Math.log(base) + 1 | 0
```

```js:js
var getDigits;

getDigits = function(num, base) {
  if (base == null) base = 2;
  return Math.log(num) / Math.log(base) + 1 | 0;
};
```

## 使い方
```coffeescript:coffee
getDigits 10
# 4 (10 == 2進数で 1010)

getDigits 10, 10
# 2
```

```js:js
getDigits(10);
// 4 (10 == 2進数で 1010)

getDigits(10, 10);
// 2
```
NSFetchedResultControllerでのセクションごとのソート順がUITableViewControllerで反映されない場合の対処法


参考
http://yoo-s.com/topic/detail/178

NSFetchedResultControllerを使ったセクションごとのソートがうまく行かないのはsetSortDescriptorsとsectionNameKeyPathの不一致やSortDescriptor配列の順序が原因でした。（多分。これを直したらうまく行ったけど、ちょっと釈然としない）

修正前

```objectivec
NSSortDescriptor* sortDescriptorWithName = [[NSSortDescriptor alloc] initWithKey:@"name"
                                                                 ascending:YES];
  
  
  NSArray* aSortDescriptor = @[sortDescriptorWithName];
  [fetchRequest setSortDescriptors:aSortDescriptor];
  NSPredicate* predicate = [NSPredicate predicateWithFormat:@"status >= 0"];
  [fetchRequest setPredicate:predicate];
  
  NSFetchedResultsController* fetchedResultsController =
  [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                      managedObjectContext:self.managedObjectContext
                                        sectionNameKeyPath:@"status"
                                                 cacheName:@"Master"];

```

修正後

```objectivec
NSSortDescriptor* sortDescriptorWithName = [[NSSortDescriptor alloc] initWithKey:@"name"
                                                                 ascending:YES];
  
  NSSortDescriptor* sortDescriptorWithStatus = [[NSSortDescriptor alloc] initWithKey:@"status"
                                                                 ascending:YES];
  
  NSArray* aSortDescriptor = @[sortDescriptorWithStatus,sortDescriptorWithName];
  [fetchRequest setSortDescriptors:aSortDescriptor];
  NSPredicate* predicate = [NSPredicate predicateWithFormat:@"status >= 0"];
  [fetchRequest setPredicate:predicate];
  
  NSFetchedResultsController* fetchedResultsController =
  [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                      managedObjectContext:self.managedObjectContext
                                        sectionNameKeyPath:@"status"
                                                 cacheName:@"Master"];

```

ちゃんとsectionNameKeyPathで指定したアトリビュート名のNSSortDescriptorを作成して、パラメータにセットしてあげる必要があります。

ところで、最初に下記のような修正をした結果、うまくソートされませんでした。

```objectivec
NSArray* aSortDescriptor = @[sortDescriptorWithName, sortDescriptorWithStatus];
```

sectionNameKeyPathにマッチするNSSortDescriptorは配列の先頭にセットする必要がありそうです。
先頭から順番にsortdescriptorが適用されることを考えると妥当かなと思うのですが、
こちらの仕様未確認なので私の開発環境下での実験結果として記述しておきます。
Macの環境設定

#Mission ControlのアニメーションをOFFにする
```
defaults write com.apple.dock expose-animation-duration -int 0; killall Dock
```
元に戻すとき
```
defaults delete com.apple.dock expose-animation-duration; killall Dock
```
#Finderを開くときのアニメーションをOFFにする
```
defaults write com.apple.finder DisableAllAnimations -boolean true; killall Finder
```
元に戻す場合
```
defaults delete com.apple.finder DisableAllAnimations; killall Finder
```
#スプリングフォルダの反応時間を短くする
FInder > 環境設定 > スプリングフォルダとスプリングウィンドウ > 反応時間を「短い」に設定

#LaunchpadのアニメーションをOFFにする
```
$ defaults write com.apple.dock springboard-show-duration -int 0
$ defaults write com.apple.dock springboard-hide-duration -int 0
```
元に戻す場合
```
$ defaults delete com.apple.dock springboard-show-duration; killall Dock
$ defaults delete com.apple.dock springboard-hide-duration ; killall Dock
```
#Finder上部にパスを表示する。
```
$ defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES
$ killall Finder
```
#元に戻す場合
```
$ defaults write com.apple.finder _FXShowPosixPathInTitle -bool NO
$ killall Finder
```
#ダッシュボードの無効化
```
$ defaults write com.apple.dashboard mcx-disabled -boolean YES
$ killall Dock
```
元に戻す場合
```
$ defaults write com.apple.dashboard mcx-disabled -boolean NO
$ killall Dock
```
Dockを自動的に隠すONのとき、Dockが表示されるまでの時間を変更する
デフォルトだと隠れているDockにカーソルを合わせても、表示されるまでちょっと間があってもっさり感が否めません。さくっと表示します。

```
$ defaults write com.apple.Dock autohide-delay -float 0
$ killall Dock
```
元に戻す場合

```
$ defaults delete com.apple.Dock autohide-delay
$ killall Dock
```
さらに表示アニメーションについても設定が可能。

```
※アニメーションなし
$ defaults write com.apple.dock autohide-time-modifier -int 0
$ killall Dock
※アニメーションありのきびきび
$ defaults write com.apple.dock autohide-time-modifier -float 0.5
$ killall Dock
※デフォルトに戻す
$ defaults delete com.apple.dock autohide-time-modifier
$ killall Dock
```
ネットワーク接続時に.DS_Store ファイルの作成を抑制する
リモートファイルサーバ接続時に.DS_Storeファイルを作らないようになる。ただしFinder動作で一部弊害もある模様。詳細（の一例）はこちらMac OS X: リモートボリュームの「情報を見る」のコメントは表示されないことがあります

```
$ defaults write com.apple.desktopservices DSDontWriteNetworkStores YES
```
元に戻す場合
```
$ defaults write com.apple.desktopservices DSDontWriteNetworkStores NO
```
Heartbleedを試してみる


**注意：自分の管理している鯖以外のところに実行するのはやめましょう。**

* まずはmod_sslを入れます。

```bash
# yum install mod_ssl
```

* 面倒になったので設定は以下略

* テストページにURLを入れて Go!
[Test your server for Heartbleed (CVE-2014-0160)](http://filippo.io/Heartbleed/)

* こんな表示になりました。（黒塗り）

![heartbleed.png](https://qiita-image-store.s3.amazonaws.com/0/33674/43f525d3-07c2-fa9d-d77a-e84bd9b5f8f7.png)

・・・具体的にはよくわからなかったです。教えてエロい人。

## 参考

* [Heartbleed ~ OpenSSL脆弱性 (CVE-2014-0160)　まとめ - Qiita](http://qiita.com/ukitazume/items/f382bcc420dc7815684f)

* [CVE-2014-0160 OpenSSL Heartbleed 脆弱性まとめ - めもおきば](http://d.hatena.ne.jp/nekoruri/20140408/heartbleed)

* [OpenSSLのHeartbleedバグの対応 - Qiita](http://qiita.com/kiiro/items/8b502b9c8d63ff0b5cc6)