OmniAICreator/Qiita-1.07M huggingface dataset:
Herokuでexpress+MongoDB

expressとMongoDBを使ったWebアプリをHeroku上にデプロイできるかチャレンジしたよ。
Qiitaにもちょいちょい手順が載っているけど、最新のherokuだとちょっと手順が違うみたい。

https://devcenter.heroku.com/articles/getting-started-with-nodejs#introduction
ここの手順にしたがって進めてみる。

1) [Heroku Toolbelt](https://devcenter.heroku.com/articles/getting-started-with-nodejs#set-up)をダウンロードしてインストールする

2)ターミナルから「heroku login」でログインできることを確認
　HerokuToolbeltにアップデートがあれば更新されます。
　
3)デプロイしたい環境のトップディレクトリで（まだやってなければ）
　git init
　.gitignore編集(node_modulesなど指定しておく)
　git add .
　git commit -m "hoge"
　としておく

4) 「heroku create」でアプリ生成。アプリ名を指定したい場合は引数で指定する

 5）「git push heroku master」でpushする
    package.jsonがあれば自動で依存モジュールは
    インストールしてくれるみたいです
### が、ここでハマる
    package.jsonで「FeedParser」と指定していたのだけど、not foundと言われてエラーになる。ローカルだと見つかってますがなと試行錯誤した末「feedparser」としたら成功しました。
    
    
 6)「heroku ps:scale web=1」インスタンス数を指定する
  
 とりあえずデプロイはこれでOK。
 pushしたときにアドレスが出ているのでアクセスできることを確認。
 お次にMongoDBのセットアップ。
 [HerokuのAddOn](https://elements.heroku.com/addons/mongolab#addon-plans)から設定します。
Sandbox版なら無料で使えるmongolabを使います。

 Sandboxを選択した状態で右下にコマンドが出ているのでコピーしてコンソールにで実行します。
 カード情報を登録していないとエラーになるので無料でも登録しておきます。
 
 コマンドが正常に終わればherokuのダッシュボードから対象のアプリを選択すると「mongolab」がAddonとして追加されているのでクリックするとmonglabの設定ページに飛びます。
 mongoのシェルでのアクセス手順なんかも載っています。
また、コマンドラインから「heroku config」とやると「MONGOLAB_URI」としてアクセス先が載っています。
この中にdbsuserとdbpasswordが載っているのでチェックしましょう。

 db名は変えられません。「use hoge」なんてやって操作すると「not authorized」と怒られます。
  
 MONGOLAB_URIの値でmongoose.connectしてやればmongoDBにアクセスできます。
 思いのほか、ハマらずに行けました。
cpp-ethereum のバイナリ .app .dmg のダウンロード先

以下に移行しました<br><a href="http://block-chain.jp/tech/cpp-ethereum-binary-app-dmg-download/" title="cpp-ethereum のバイナリ .app .dmg のダウンロード先">cpp-ethereum のバイナリ .app .dmg のダウンロード先</a>
Swift1.2のアップデートを備忘録的にまとめる - コンパイルエラー祭りからの脱出


久しぶりの投稿です。
最近あまりSwiftを書く時間を取れておらず、やっと書ける〜と思ってビルドしたらこの有り様(46 issues)です。
もう作るのやめようかと思いました。

![46 issues](https://qiita-image-store.s3.amazonaws.com/0/37074/58ae5c60-73f2-f175-2d5b-0430b70b6947.png "Screen Shot 2015-05-31 at 13.56.15.png")


## お話すること
今回はSwift1.2へのアップデートによって自分がビルドで引っかかっていた部分を中心に記述します。

* Swiftがアップデートされてましたよ(1.1 => 1.2)
* キャストの仕様変更
* NSStringをStringで扱う場合にキャストが必要になった

詳しくは[Apple公式のSwiftブログ](https://developer.apple.com/swift/blog/#article-23)や[Ray Wenderlichの記事](http://www.raywenderlich.com/95181/whats-new-in-swift-1-2)をご覧ください。
Ray Wenderlichのほうが当該記事以外にもチュートリアルなども揃っており個人的には好きです。

一言で言っちゃえば
「アップデートを追うっていう意味でもちゃんと定期的にコードに触れておきましょうね」
という話ではあるんですが、まぁそれだとここに残すまでもないので・・・笑

## Swiftがアップデートされてましたよ(1.1 => 1.2)
2015年2月にSwiftは1.1から1.2にアップデートされていました。
Xcode6.3にアップデートした際に勝手に入ってくるはずです。
生まれたての言語ということもあり、まだまだ変更は多いですよね。
以下に挙げるものが目立ったアップデートです。

* コンパイルのスピードアップ
* オプショナルバインディングが書きやすくなった(何重ものネスト化を防げる)
* キャスト時に`as!`または`as?`を使うように義務付けられた
* ArrayやDictionary型に似たSetなる型が登場
* let(定数型)の値が宣言時に用意しなくてもよくなった
* SwiftとObjective-Cの型互換解除(Swift1.1までの書き方だとNSStringがStringと認識されない)

## キャストの仕様変更(as => as! OR as?)
前項で`キャスト時に as! または as? を使うように義務付けられた`と挙げたものです。
これまでのSwift(<=1.1)ではキャストするときにこんな書き方でも良かったわけです。

```
var object: AnyObject = "hoge"

var string = object as String
```

これがSwift 1.2だとこれがコンパイルエラー起こして見事に[最初の画像](https://qiita-image-store.s3.amazonaws.com/0/37074/58ae5c60-73f2-f175-2d5b-0430b70b6947.png)が出来上がります。

ではどう書くか？

```
// Forced failable
var object: AnyObject = "hoge"

var string = object as! String

// Optional
var object2: AnyObject = "fuga"

var string2 = object2 as? String
```

どうキャストするのかを`!`もしくは`?`を使ってきちんと定義する必要があるわけですね。
疑問：僕は引っかかったエラーを地道に直していたのですが、Xcodeで一気にまとめて変更する方法ってあるんですかね？

## NSStringをStringで扱う場合にキャストが必要になった
`SwiftとObjective-Cの型互換解除(Swift1.1までの書き方だとNSStringがStringと認識されない)`。
早いところSwiftもObjective-Cに頼らないネイティブSwiftとしてのメインストリームを歩んでいきたいわけです。

僕は[SwityJSON](https://github.com/SwiftyJSON/SwiftyJSON)を扱っていてこのエラーに当たりました。

```
Swift Compiler Error: 'NSString?' is not convertible to 'String'
```
![Screen Shot 2015-05-31 at 14.12.24.png](https://qiita-image-store.s3.amazonaws.com/0/37074/5191ad8e-3500-a2a6-d531-6adbaa203351.png "Screen Shot 2015-05-31 at 14.12.24.png")

Stringにキャストしてあげることでエラーは取れます。

![Screen Shot 2015-05-31 at 14.12.42.png](https://qiita-image-store.s3.amazonaws.com/0/37074/403f9e61-57c4-4712-4a4e-365eca943644.png "Screen Shot 2015-05-31 at 14.12.42.png")

逆にSwiftからNSStringに値を代入するときはキャストはいらないらしいです。

## まとめ
* キャストのasは`!`または`?`を添えてしっかり定義すること
 (定義を明確にすることでチーム開発にはありがたいですよね)

* NSStringをStringで扱うときはキャストを忘れずに
* アップデートを追うっていう意味でもちゃんと定期的にコードに触れておきましょうね

仕事でXcode(Objective-C)をビルドすることはあるんですが、
Swiftへの移行はまだなのでキャッチアップできていなかったことに反省。。。
gitがignoreしているファイルを調べたい

[Show ignored files in git - Stack Overflow]によれば、gitignoreで無視されているファイルを調べるにはいくつかコマンドがあるらしい。

## `check-ignore`コマンド

zshだとうまく動いた。bashは4以上じゃないとだめらしい。

```console
$ git check-ignore **/*
Godeps/_workspace/pkg
Godeps/_workspace/pkg/linux_amd64
Godeps/_workspace/pkg/linux_amd64/golang.org
Godeps/_workspace/pkg/linux_amd64/golang.org/x
Godeps/_workspace/pkg/linux_amd64/golang.org/x/tools
Godeps/_workspace/pkg/linux_amd64/golang.org/x/tools/cover.a
cover.out
```

## `clean`コマンド

`clean`はトラックされてないファイルを取り除くコマンドだが、取り除く予定のものを調べることができる。

```console
$ git clean -ndX
Would remove .vagrant/
Would remove Godeps/_workspace/pkg/
Would remove cover.out
```

## `status`コマンド

statusコマンドでも調べられる。

```console
$ git status --ignored -s
!! .vagrant/
!! Godeps/_workspace/pkg/
!! cover.out
```

[Show ignored files in git - Stack Overflow]:http://stackoverflow.com/questions/466764/show-ignored-files-in-git
AWS を使った Docker の基本学習 (2) Dockerfile からのイメージ作成

今回は、Dockerfile を使ってWebサーバーのイメージを作成して、それからコンテナを起動してみる。

# Dockerfile とは？
Docker イメージの構成情報を記述したテキストファイル。Dockerfile をビルドすることにより、イメージを作成することができる。

手作業でコンテナを修正(パッケージをインストールする等)してからイメージ化するのに比べて、イメージの構成内容が把握できる、テキストなのでGitなどでバージョン管理できる、手作業によるイメージ作成時のミスが減る、などのメリットがある。

# 準備
まず、[前回](http://qiita.com/arturias/items/e3459a70315c757d262f)と同じように、EC2のインスタンスを立ち上げて Docker をインストールする。

次に作業用のディレクトリを作成(どこに作ってもよい)。

```
$ mkdir ~/workdir
```

Webサーバーで使うHTMLファイルや画像を作業ディレクトリ以下に配置。今回は、site というサブディレクトリを作って、次のようにファイルを置いた。

    
    ~/workdir/site/
      ├─ index.html
      └─ img
         ├─ apple.jpg
         ├─ kitten.jpg
         └─ sakura.jpg
 
# Dockerfile の作成
作業ディレクトリ(~/workdir)に Dockerfile を作成。

```
$ vi ~/workdir/Dockerfile
```

Dockerfile の中身は以下のようなもの。httpd をインストールして、ファイルをコピーしてるだけ。

    FROM centos:6.6
    MAINTAINER arturias <arturias@example.com>
    RUN yum install httpd -y
    ADD site /var/www/html
    ENTRYPOINT /usr/sbin/apachectl -DFOREGROUND

Dockerfile 中の命令の簡単な説明。
- FROM ： ベースとなるイメージの指定
- RUN ： イメージ作成中に実行したいコマンド
- Add ： イメージに追加するファイルやディレクトリ
- ENTRYPOINT ： docker run でコンテナを起動した際に、コンテナ内で実行されるコマンド。

(補足) 上記の ADD コマンドでは、EC2インスタンス側の site ディレクトリの**中身**がイメージ内の /var/www/html 以下にコピーされる。なので、イメージ内では /var/www/html/site/index.html ではなくて /var/www/html/index.html というようにファイルが配置される。

# イメージのビルド

docker build コマンドでイメージをビルドする。など、docker build コマンドの一番最後のピリオドは、Dockerfile が置かれているディレクトリを表している。

```
$ cd ~/workdir
$ docker build -t arturias/myweb2 .

# イメージが出来たか確認してみる。
$ docker images
```

# コンテナの起動
作成したイメージを使ってコンテナを起動。なお、Dockerfile 内で ENTRYPOINT を指定したので、コンテナ内で実行するコマンドを docker run に渡す必要は無い。

```
$ docker run -d -p 80:80 arturias/myweb2
```

AWS のセキュリティグループの設定で、EC2インスタンスにHTTPでのアクセス（TCP 80) ができるように設定する。

ブラウザから、EC2インスタンスのPublic IPにアクセスする。
例えば、こんな感じでWebページが表示される。
![20150531-website.jpg](https://qiita-image-store.s3.amazonaws.com/0/79316/56b58ac2-a784-1ca5-ab33-f0704575b9a6.jpeg)
jekyllでheadタグから目次を自動作成するプラグイン。

超シンプルな目次を自動で作成するjekyllプラグインを作成。

- h1 ~ h6タグを検知してセクション番号を振り目次を作ってBodyタグに挿入。

- h1 ~ h6タグにもセクション番号を挿入。

![スクリーンショット 2015-05-31 14.44.50.png](https://qiita-image-store.s3.amazonaws.com/0/9907/fc5f4bad-c881-0bb6-efa5-664ea418e013.png)

![スクリーンショット 2015-05-31 14.46.26.png](https://qiita-image-store.s3.amazonaws.com/0/9907/26aa5a2b-02c5-12b4-137c-a4b3a4a85201.png)

~~~ md:サンプルmarkdown
## AAAAAA

### BBBBB

### CCCCC

## DDDDD

### EEEEE
~~~

↓

~~~ html:出力HTML
<h2>1 AAAAA</h2>
<h3>1.1 BBBBB</h3>
<h3>1.2 CCCCC</h3>

<h2>2 DDDDD</h2>
<h3>2.1 EEEEE</h3>
~~~

デモ
http://niiyz.com/googlemap-apiv3-matome.html

ソースはこちらに。
https://github.com/niiyz/TopicsGenerator
npmでインストールしたパッケージのバージョンを調べたい

npmでインストールしたライブラリのバージョンを調べる方法です

## 依存する全てのパッケージ

```console
$ npm list
webpack-typescript-example@1.0.0 /private/tmp/g8/example-app
├─┬ awesome-typescript-loader@0.4.0-rc.2
│ ├── bluebird@2.9.27
│ ├─┬ grunt@0.4.5
│ │ ├── async@0.1.22
│ │ ├── coffee-script@1.3.3
│ │ ├── colors@0.6.2
│ │ ├── dateformat@1.0.2-1.2.3
│ │ ├── eventemitter2@0.4.14
│ │ ├── exit@0.1.2
│ │ ├─┬ findup-sync@0.1.3
│ │ │ ├─┬ glob@3.2.11
│ │ │ │ ├── inherits@2.0.1
...
```


## 直下のパッケージのみ

```console
$ npm list --depth=0
webpack-typescript-example@1.0.0 /private/tmp/g8/example-app
├── awesome-typescript-loader@0.4.0-rc.2
├── css-loader@0.14.4
├── jade@1.10.0
├── jade-loader@0.7.1
├── jquery@2.1.4
├── node-libs-browser@0.5.2
├── style-loader@0.12.3
├── tsd@0.6.0
├── tslint-loader@0.9.0
└── webpack@1.9.10
```
Github にプッシュした Web アプリを Azure Web Apps に Deploy する方法

「Github にプッシュしたソースコードを Azure Web Apps に展開する」方法をハンズオンで多用するので、備忘録もかねて Qiita の記事にしてみました。

# 前提条件
* Azure のサブスクリプションを持っている
    * Azure のサブスクリプションを持っていない方は[無償評価版](http://azure.microsoft.com/ja-jp/pricing/free-trial/)の利用をご検討ください。
* Github の基本的な仕組みを理解している

# Azure 管理ポータルから Web Apps を作成する
1. [Azure 管理ポータル](https://manage.windowsazure.com)へログインします。
2. 下のような画面が表示されるので、[+新規]をクリックします。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/34023/19140b43-5674-f860-ef2f-fdf51c3f9cad.png)
3. 下のような画面が表示されるので、[コンピューティング]-[Web アプリ]-[簡易作成] の順にクリックします。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/34023/7ca4e381-d67c-801b-7c0d-8554a8b064b0.png)

4. [URL]にはお好きなURLを入力します。
5. [APP SERVICE プラン] には "新しい App Service プラン作成" を設定します(既に作成済みのプランがある方はそれを使用します)。
6. [地域] に自分のお好きな地域を選択します。
7. [Web アプリの作成] をクリックします。 
8. しばらくすると Web Apps が作成されます。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/34023/87e98439-f38e-e1ca-2a24-1c9b25f80160.png)

# Github から Web アプリをインポートする
1. 下図の赤枠で囲んだ矢印をクリックします。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/34023/8ca4952f-b9cd-a0a1-cb88-bddd3eed08f3.png)

2. 下のような画面が表示されるので、[ソース管理からのデプロイの設定]をクリックします。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/34023/e7e4618e-b3ac-ccab-bb00-1e12735f89b6.png)

3. [ソースコードの位置]画面が表示されます。
4. 画面を下にスクロールして、[外部レポジトリ]を選択後、画面右下の矢印をクリックします。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/34023/871171bd-1ac2-15c0-7fe7-6f231bd800d2.png)
5. [発行の設定]画面が表示されます。
6. [レポジトリのURL]に、ソースコードが保存されているGithub のプロジェクトの URL を指定します(この画面では、私のプロジェクトのURLである https://github.com/NT-D/AzureML_Recommend_Sample を貼り付けています。)。
7. その後、右下の矢印をクリックします。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/34023/220555a8-86c6-8ec7-b377-ba8956e2d2f5.png)
8. 下図のような画面が表示され、30秒ほど経過すると次の画面に遷移します。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/34023/38aa3574-59d2-b7d0-bb3d-87fccda83708.png)
9. 下のような画面が表示されればインポートは完了です。実際にブラウザから動作を見てみるためには、画面下側の[参照]をクリックします。
![9.png](https://qiita-image-store.s3.amazonaws.com/0/34023/33226a44-b9ad-c79a-1aa8-ba03f73b2886.png)
Wordpressのマルチサイトでメンバーページを作るときのいろいろ【Theme My Login】

###はじめに
WordPressのマルチサイト上に会員サイトを作ることになりました。

会員サイトというのは一般ユーザーが会員登録するサイトで、ログインしたりマイページで何か機能があったり、会員限定ページを見れたりするやつですね。
WordPressでユーザー登録する場合は、管理者ユーザーではなく、購読者ユーザーとかのタイプで登録することになります。権限を分けているからもちろん管理画面に入れないですが、一旦権限が変えられてしまったら管理者になれるような層の、ユーザー情報になりますね。

マルチサイトというのは、WordPressで複数のサイトを並行して運用できる管理方法です。下記のようなURLになります。
http://main-site.com/
http://main-site.com/sub1/

WordPressをがっつりシステム組み込む感じで使ったことがなかったんですが、今回やってて上記のようなことがわかりました。

###Theme My Loginの特徴
会員サイトを作るのにTheme My Loginというプラグインを試しました。
特徴としては、下記のようなところになります。
・テンプレートを自分のテーマ画面にコピーして使えるので、見た目をカスタマイズしやすい。
・設定ページがちょっとシステム寄りというか、わかりにくい。

####マルチサイトだとUser Moderationができない。
Theme My LoginにはUser Moderationという機能があります。
http://www.jfarthing.com/development/theme-my-login/user-moderation/
会員仮登録後の本登録方法を、None:認証なし、E-mail:メール認証、Admin:管理者承認制の３タイプから選べるみたいですね。

しかしこれがマルチサイトだと選べない。
![General ‹ ROYAL TRADING — WordPress.png](https://qiita-image-store.s3.amazonaws.com/0/28556/ab553d81-ceab-1a2d-9f13-3c4f1b703b42.png)
「Enable User Moderation」にチェックを入れて保存しようとすると、
「User Moderation is not currently compatible with multisite.」となります。

この、UserModerationしない段階で会員登録すると、「あなたのユーザー名はXXXで登録されました！」みたいな画面になりますが、まだ本登録ではなくて、送られたメールをクリックしたら本登録のようです。
![154ce0f8c579d323affa2abc813027de.png](https://qiita-image-store.s3.amazonaws.com/0/28556/0a4ab112-a015-c81b-74c9-0cfd2e75f134.png)
つまりデフォルトはメール認証です。


####マルチサイトだとデフォルトから項目追加ができない
会員登録ページは、Theme My Loginデフォルトの項目がこんな感じです。
![9f34967cd5af3a47d4adee3a7e2c2cce.png](https://qiita-image-store.s3.amazonaws.com/0/28556/a0ea255e-be1f-e643-edcf-7f6d36150b27.png)
ユーザー名、メールアドレス、パスワード２回ですね。
ここに項目追加ができないのですよ。このままだとこれ以外の項目が、本登録後の会員情報編集でしか取れなくなりますよね。
単純にテキストボックスを追加しても登録されません。
たぶん私がわからなかっただけかと思いますが、やりかたが分からなかったです。

バリデーションの追加は出来ました。

```php:functions.php

function tml_registration_errors( $obj ) {
  
    //
    // ここで、$_POST値を元に追加のバリデーションを行う
    // $errors["xx"] = "yy";
    $obj['errors'] = $errors;
    
    return $obj;
}
add_filter( 'wpmu_validate_user_signup', 'tml_registration_errors' );
```

「（マルチサイト）サインアップ時のバリデーション追加」はできたのですが、「（マルチサイト）サインアップ時の登録処理追加」ができなかったんですよね。。

DBを見ると、
サインアップ時→sineupテーブルにデータ登録
本登録時→users & user_metaテーブルにデータ登録しているようです。
sineupテーブルのmetaカラムに、パスワードはシリアライズで入っているんで、ここに入れるみたいなんですが。

どのフックを使えばいいかというのはこの辺にあります。
http://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7#.E7.AE.A1.E7.90.86.E7.94.BB.E9.9D.A2.E9.96.A2.E9.80.A3.E3.81.AE.E3.82.A2.E3.82.AF.E3.82.B7.E3.83.A7.E3.83.B3
これ見てもわからないですね。マルチサイトの情報少ないし。
大体ユーザー登録というのがメインは管理ユーザー用のものなので、使いやすくするのは別次元に分けたほうがいいのではと思います（新しくmemberテーブルで管理するとか）

####テンプレートファイル名がわかりにくい
![d68ecab28dc1f04b856a774165a98393.png](https://qiita-image-store.s3.amazonaws.com/0/28556/4f78fc6f-4b3b-be77-6a19-aa3b78cccb0d.png)
あとは細かい話ですが、Theme My Loginのテンプレートファイル名は、こんな感じであります。
これを自分のテーマディレクトリに置いたら、固定ページを作ってくれるんです。ちょっとファイル名の前に「tml-」とか付けてほしいなと思いますね。ただでさえテーマディレクトリってごちゃごちゃしてるんで。

###リンク
Theme My Login公式ページ
https://wordpress.org/plugins/theme-my-login/

Theme My Login使用の際は下記を参考にさせていただきました。
使い方の日本語解説はバッチリです。
http://yahss.net/wordpress/765-registration-form2-with-theme-my-login/
http://qiita.com/hiroki_y/items/7ca0a2a364eb9edabe39
PlayFramework:ビルド時にassetsから不要なファイルを除外したい

assetsにあるTypeScript, CoffeeScript, Less, Sass, Stylus, Jade, JSXなど、プロダクションでは不要なファイルをビルドから除外する方法です。[sbt-filter]を使うと除外するファイルを指定できます。

```scala:project/plugins.sbt
addSbtPlugin("com.slidingautonomy.sbt" % "sbt-filter" % "1.0.1")
```

```scala:build.sbt
lazy val root = (project in file(".")).enablePlugins(PlayScala, SbtWeb)
//                                                              ^^^^^^この部分を追加

pipelineStages := Seq(filter)

includeFilter in filter := "*.ts" || "*.coffee" || "*.less" || "*.sass" || "*.styl" || "*.jade" || "*.jsx" // filter files from production build
```

`includeFilter`は一見すると、ビルドに含めるファイルというふうに見えますが、「除外フィルターに含める」つまり、除外するという意味なのでご注意ください。

[sbt-filter]: https://github.com/rgcottrell/sbt-filter
phpMyAdmin で、環境ごとにテーマを変える

phpMyAdminで、接続先サーバーごとにテーマを変えたかったので探してみたら、あった。

https://wiki.phpmyadmin.net/pma/themes

```php:config.inc.php
$i=0;
$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['host'] = '127.0.0.1';
$_COOKIE['pma_theme-' . $i] = 'big_green';

$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['host'] = '127.0.0.2';
$_COOKIE['pma_theme-' . $i] = 'big_blue';

$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['host'] = '127.0.0.3';
$_COOKIE['pma_theme-' . $i] = 'big_red';
# Needed for server base theme
$cfg['ThemePerServer'] = true;
```

あとは、テーマを勝手に変更されないように、変更箇所を潰す。

```php:index.php
235 // ThemeManager if available
236 /*
237 if ($GLOBALS['cfg']['ThemeManager']) {
238     echo '<li id="li_select_theme" class="no_bullets">';
239     echo PMA_Util::getImage('s_theme.png') . " "
240             .  $_SESSION['PMA_Theme_Manager']->getHtmlSelectBox();
241     echo '</li>';
242 }
243 */
```
PlayFramework:ビルドを実行する前にシェルコマンドを実行したい

開発環境のassetsとプロダクション環境のassetsでは含めるファイルが変わってくることがあります。sourcemapはプロダクションには不要ですし、プロダクションのassetsでは、JSやCSSはminifyすることがあります。

sbt-webでこれらが完結していればその仕組を使って管理できますが、ビルドのassetsに含めるファイルを、Webpack・gulp・MakefileなどCLIツールを使って生成している場合、`activator dist`の前に何らかのシェルコマンドを実行する必要があります。

これを実現するためのbuild.sbtは次のようになります。

```scala:build.sbt
lazy val buildAssetsWithCLI = taskKey[Unit]("Build assets files using CLI tools")

buildAssetsWithCLI := {
  "make build" !
}

(packageBin in Universal) <<= (packageBin in Universal) dependsOn buildAssetsWithCLI
```

`"make build"`の部分が実行したいシェルスクリプトになります。
ファイルパーミッションを、chmodで使える形式で保存する

# ファイルを一旦消した後で復元したい

何らかの都合でファイルを一旦消した後でパーミッションを復元したい場合、あるいはファイルのパーミッションを他の新規ファイルにもコピーしたい場合はないだろうか。

パーミッション情報を確認したければlsコマンド（`-l`オプション）を使い、設定したければchmodコマンドを使う。ところが**ls -lの出力文字列はchmodに使えない。**人が手作業でやるならよいが、これじゃ自動化できないので、ls -lのパーミッション情報をchmodに流し込める形式に変換するシェルスクリプトを書いてみた。

# できあがった変換シェルスクリプト

ちゃんと、setuid、setgid、stickyビットにも対応させた。

```sh:パーミッションを保存・復元するシェルスクリプト
# パーミッション情報をchmodで使える8進数で保存
mode=$(ls -l "$file"                                                | # ファイル情報取得
       awk '{print substr($1,2,9);}'                                | # パーミッション文字列抽出
       sed 's/..\(.\)..\(.\)..\(.\)/\1\2\3 &/'                      | # 3者の実行ビット文字を手前にコピー
       awk '{gsub(/[x-]/,"0",$1);gsub(/[^0]/,"1",$1);print $1 $2;}' | # 実行ビットが"-","x"以外ならビット立て
       tr 'STrwxst-' '00111110'                                     | # 残りは小文字ならビット立て
       xargs printf 'ibase=2;%s\n'                                  | # 得られた文字列を2進数と見なし……
       bc                                                           | # ……一旦10進数に変換
       xargs printf '%04o'                                          ) # 8進数化（4桁にゼロパディングしつつ）

# $fileに対して、あんなことこんなこと……

# 復元
chmod $mode "$file"
```

パズルとして見れば面白いけど、もっと簡単にできてほしいところ。

ちなみにstatコマンドを使うというのはナシ。表示形式が環境によってまちまちなのでスクレイピング面倒だし……。これだからPOSIXの範囲にないコマンドは、ブツクサブツクサ……。
QEMUの脆弱性 CVE-2015-3456(VENOM)対策で勝手にVM Shutdown設定をしてるVPSではH2DBが書き込めなくなっている。

たぶんほとんどのVPSサービスに影響があると思うが、H2DBを利用したバッチが
自宅のマシンでは動いてて、VPSで動かしていると動いていないのを調べてみたらこんなエラーを吐いていた。


```
org.h2.jdbc.JdbcSQLException: データベースはすでに閉じられています (VM終了時の自動データベースクローズを無効にするためには、db URLに ";DB_CLOSE_ON_EXIT=FALSE" を追加してください)
Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-180]
```


どうやら語彙丁寧にH2DBはVMがシャットダウン設定をされたらDBに書き込めなくしてる様子。
http://www.h2database.com/html/features.html#do_not_close_on_exit

どうしても書き込みたかったら接続URLに";DB_CLOSE_ON_EXIT=FALSE"をつけろってことらしい。

各VPSサービスはここらへんまで影響調査してシャットダウン設定をしたのか、問い詰めたい・・。


追記。。自分が使ってるCVE-2015-3456(VENOM)対策中のVPSではこんな状況でした

|サービス名|VPSモデル|状態                      |VENOMメンテ締切日|
|---------|--------|--------------------------|----------|
|ConoHa(旧)|メモリ4G|×　H2DB 使用不可能      |6月14日|
|お名前クラウド|メモリ8G|×　H2DB 使用不可能    |不明、告知なし|
|さくらのVPS|メモリ2G|○　H2DB　使用可能       |6月1日|

* ConoHa https://www.conoha.jp/conoha
* お名前クラウド http://www.onamae.com/server/cloud/
* さくらのVPS http://vps.sakura.ad.jp
monacaアプリからajax通信ができなくてハマった！対処法まとめ


SEOの記事読んだあとなのでタイトルが胡散臭くなりました

## 状況

```script.js

$(function(){
		$.ajax({
				type:"post",
				url:"http://VPSドメイン/driver.json",
				data:{
					// パラメータ
				},
				dataType:"jsonp",
				success:function(data){
					console.log("succeed");
				},error : function(XMLHttpRequest, textStatus, errorThrown) {
					console.log("XMLHttpRequest : " + XMLHttpRequest.status);
					console.log("textStatus : " + textStatus);
					console.log("errorThrown : " + errorThrown.message);
				}
		});
}

```

はじめはいつも通りAccess-Control-Allow-Originに引っかかったのでｱｰﾊｲﾊｲって思って下記をサーバー側に追加。

```.htaccess
Header append Access-Control-Allow-Origin: *
Header set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept"
```

これでAndroidは通った。しかしiPhoneが通らない。
エラーは以下のとおり。

![20150531121419.jpg](https://qiita-image-store.s3.amazonaws.com/0/62826/9264b1c7-6c29-6784-55e0-a7eb7d6cb2b9.jpeg "20150531121419.jpg")
※220は別件なのでおかまいなく

412番エラー。Precondition Failed(前提条件失敗)。なんじゃいそりゃあ、と思ったんですが、Google先生に尋ねたところ

>If-Unmodified-Since(クライアントがもっているキャッシュの更新確認)
クライアントがもっているキャッシュ日時がサーバの最終更新日時よりも新しい場合

>If-Match(ブラウザがもっているETag値確認)
クライアントがもっているETag値に一致するリソースがサーバに存在しなかった場合

>If-None-Match(ブラウザがもっているETag値確認)
クライアントからのリクエストメソッドが「GET」または「HEAD」以外の場合

とのことだったので、キャッシュ塞げばなんとかなるろーかと判断。

## 対処

ajaxで対処した。

```script.js
		$.ajax({
				type:"post",
				url:"http://VPSドメイン/eventList.json",
				data:{
					// パラメータ
				},
				async : false,
				cache : true,
				beforeSend : function(xhr) {
					xhr.setRequestHeader("If-Modified-Since",
					"Thu, 01 Jun 1970 00:00:00 GMT");
				},
				dataType:"jsonp",
				success:function(data){
					console.log("succeed");
				},
				error:function(error){
					console.log("error");
				}
		});
```

これの他、urlの末尾にGETパラメータとしてDate.now()を入れてもうまくいった。
(翻訳)Mithril.jsの将来の計画

3月ぐらいにMLでMithril.jsの将来計画を聞かれた時の、作者のLeo Horie氏の[コメント](https://groups.google.com/forum/#!topic/mithriljs/Pc8qWcWM1Iw)が興味深かったので翻訳してみました。ちなみに、回答されていなくて明記もされてないのですが、MLのやりとりを見ているとMithrilにはコアメンバーが4-5人はいそうです。

----------

**Andreas Söderlund**

私は現在とても大きなWebのプロジェクトを開始しようとしています。少なくとも5年は使われ続けることを考慮して、なるべく将来のことについて考えておきたいと思います。例えば、5年前はタブレットとモバイルデバイスは考慮に入れることはそれほどありませんでしたが、今はそれらのサポートが絶対に必要です。

最初の質問はLeoへの質問です。Mithrilはとてもすばらしいもので、すでにそれを使うことは決定しました。しかし、LeoがMithrilに対して5年後にどのあたりを見ているのかを聞いておきたいと思います。唯一のメンテナーであり続けるんでしょうか？何か大きな変化が近々入りますか？1.0のリリースまではどれぐらいあるんでしょうか？

2つ目はこのMLにいるすべての人への質問です。これから5年間の間に、どのようなウェブ技術が登場すると思われますか？あなたが導入されると思っていること、人々が期待していること、ソフトウェア開発の変化などです！

----------

**Leo Horie**

近い将来Mithrilにやってくるものは主に2つあります。 1) コンポーネントブランチ(訳注: 0.2.0でリリース済み) 2) PromiseをES6 APIに移行する。

その後にMithrilに何が起きるのかを言うのは難しいでしょう。ある時点になったら内部をいくつかクリーンに書き換えるかもしれませんし、フレームワークは少しスリムになるでしょう。例えばfat arrows(訳注: ES 6の関数のアロー記法)が主要なブラウザで使えるようになれば ``m.prop()`` は活躍の場が減る可能性もありますし、IEがES 6のPromiseを備えれば、PromiseのPolyfillはなくなるでしょう。

将来起きうることとしては、Mithrilのプラグインや、さまざまなサードパーティライブラリに対するMithrilラッパーを提供するコンポーネントに関するエコシステムが大きくなったり、現在コミュニティレベルで作成されているアイソモーフィックなフレームワークもより成熟してくるでしょう。

正直に言えば、Mithrilの開発にあたっては新しい技術へのベットをしなかったため、ウェブをめぐる生態系の変化に対して、Mithrilのコアはほとんど変化しませんでした。Mithrilのほとんどのコードは、5年前から使用できた技術のみを使って書かれています。唯一の賭けが、非同期の取り扱いの抽象化のためにPromiseを使うという判断でした。私が見ている限り、Mithrilは比較的複雑なアプリケーション(もちろん、適切なサードパーティライブラリを追加するのを前提として)の構築に十分耐えられていますし、現在のコアが陳腐化して新しい基本コンセプトを導入してコアを焼きなおす必要が出てくることはないと考えています。

ほとんどの人が考えていることとは対照的に、私はウェブの技術の本質はそれほど大きくは変化してないと考えています。3日ごとにウェブ開発を大きく揺さぶる新しいツールがやってきますが、それらはすべて漸進的な改善であり、今まであったテーマの新しいバリエーションにすぎません。

新しい世代のウェブ対応のガジェット(例えば、Apple Watchやモジュラー化するスマホ)が登場する機運が高まっていて、ツールの分断はより大きくなり、Cordovaのようなギャップを埋めるプロジェクトがまた出てくるでしょう。私は、1つのコードベースで全ての環境をサポートしようとするレスポンシブデザインのアプローチはそろそろ機能しなくなる限界に来ると思います。絶対的にパワーが不足しているデバイスに対してあまりに肥大化したコンテンツをダウンロードさせようとするからです。
Vagrant最低限のメモ


久しぶりに使うのでメモ。

###環境の更新

VagrantもVirtualBoxも、インストーラーをダウンロードしてインストールすれば更新されるみたい。
もちろん、新規なら何の問題もない。

###コマンドいろいろ

####バージョン（インストール）の確認

```bash
vagrant --version
```

####boxの追加

```bash
vagrant box add [ローカル保存名] [取得先url]
```
boxはとりあえず[Vagrantbox.es](http://www.vagrantbox.es/)から取ってくればよい。

####boxの確認

```bash
vagrant box list
```
実態は~/.vagrant.d/にある。

####仮想マシンの初期化と実行

```bash
mkdir vm01
cd vm01
vagrant init [box名]
vagrant up
```

####状態確認

```bash
vagrant status
```

####suspendとresume

```bash
vagrant susupend
vagrant resume
```
susupendするとstatusはsavedになっている。

####シャットダウン（upの逆）

```bash
vagrant halt
vanrant up
```

####再起動

```bash
vagrant reload
```

####VMの削除

```bash
vagrant destroy
```

###ログイン

```bash
vagrant ssh
```

###VMのIPアドレスを指定（固定）
Vagrantfileを編集する。編集箇所は、とりあえず、

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

の箇所をコメントアウト。

###sshで普通のログインできるようにする

vagrant sshは便利だが、用途により普通にssh hostnameでアクセスしたい場合もある。そんな時は、vmのフォルダで、

```bash
vagrant ssh-config >> ~/.ssh/config
```
を実行する。標準でHost名はdefaultとなるので、必要に応じてconfigファイルを編集する。

```bash
ssh default
```
でアクセスできるようになる。

###共有フォルダ
ローカルのVMのフォルダが、そのVMの/vagrantフォルダとマップされる。なので、ファイルのやりとりはこのフォルダを介して行えばよい。

###boxを作る

現状のVMをboxにする。

```bash
vagrant package
vagrant box add mybox package.box
```

###プロビジョニング

とりえあえずshを走らせてみる。Vagrantfileを編集する。

```bash
config.vm.provision :shell, :path => "provision.sh"
```
そして、provision.shを作成し、何かを実行してみる。

プロビジョニングだけは、

```bash
vagrant provision
```
で実行可能。

###その他

vagrant up後、vagrant sshでログインはできるが、ホスト(mac)からのhttpやpingが通らない状態だった。

取り急ぎ、Vagrantfile内のprivate_networkの箇所をコメントインすることで解決できた。が、調査の余地がある。

```bash
config.vm.network "private_network", ip: "192.168.33.10"
```
snippet: Apache

## リダイレクト (.htaccess)

```vb:.htaccess
RewriteEngine on
RewriteCond %{THE_REQUEST} ^.*
RewriteRule ^(.*)$ https://転送先のドメイン/サブディレクトリ/$1 [L,R=301]
```

## mimetypeの追加(.htaccess)

```apache:.htaccess
AddType application/octet-stream .ova
```

## BufferedLogs

* [mod_log_config - Apache HTTP サーバ バージョン 2.2](https://httpd.apache.org/docs/2.2/ja/mod/mod_log_config.html#bufferedlogs)
* [mod_log_config - Apache HTTP サーバ バージョン 2.4](http://key2.jp/manual/ja/mod/mod_log_config.html)

```bash:/etc/httpd/conf/httpd.conf
BufferedLogs On
```

* ある程度バッファが蓄積されないと出力されない。
    * 毎秒ログ書き込みしていたのが、数秒に1回に減った。
    * 2分前のログが今頃書き込まれることもあるので注意。
* httpd restartすると、蓄積されたログが一気に出力された。


## 認証

* [特定のIPからのアクセスは認証無しで、それ以外は認証 - Qiita](http://qiita.com/tukiyo3/items/223fc7f4efff6abeb035)

## apache2.2と2.4の違い

* [Upgrading to 2.4 from 2.2 - Apache HTTP Server Version 2.4](httpd.apache.org/docs/2.4/upgrading.html)

```diff:
<Location /web/login>
- Order Deny,Allow
- Deny from all
- Allow from 127.0.0.1
+ Require host 127.0.0.1
</Location>
```

## ServerLimit, MaxClient

* [apache 2.2 - ServerLimit and MaxClient issue - Server Fault](http://serverfault.com/questions/351827/serverlimit-and-maxclient-issue)

> WARNING: MaxClients of 565 exceeds ServerLimit value of 256 servers,
 lowering MaxClients to 256.  To increase, please see the ServerLimit
 directive.

```bash:解決方法
 /etc/init.d/httpd restart
```

## ProxyPass設定

* [Apache - ProxyPass設定 - Qiita](http://qiita.com/tukiyo3/items/d49cec3b63f231202602)

## phpmyadmin

```bash:
sudo apt-get install -y phpmyadmin
sudo ln -s /etc/phpmyadmin/apache.conf sites-enabled/
sudo /etc/init.d/apache2 restart
```

* http://localhost/phpmyadmin
Express4でエラー「request entity too large」が発生する

#状況
下記コードで表題のエラーが発生しました。

````js
var fs = require("fs");
var writer= function(req, res, next) {
    console.log(req.body.text);
  fs.writeFile("./out/"+req.body.filename,req.body.text,function(err){
      if(err){
          throw err;
      }
      res.send("書き込み成功");
  })
}

module.exports=writer;
````

POSTで受け取ったテキストをファイルに出力する単純なプログラムです。
渡した値は1200行程度のテキスト。サイズとしては80kbにも満たない程度です。


#対処
この程度のサイズでtoo largeといわれるのは納得がいかなかったのですが、
とりあえず下記のようにすることでエラーを回避することができました。

````app.js

app.use(bodyParser.urlencoded({ limit:'50mb',extended: true }));

````
#原因

どうやらbodyParseの設定のようですね。
bodyParserの[ドキュメント](https://github.com/expressjs/body-parser)を見てみました
こう書いてあります。


>Controls the maximum request body size. If this is a number, then the value specifies the number of bytes; if it is a string, the value is passed to the bytes library for parsing. Defaults to '100kb'.

resuest bodyのサイズのデフォルトは100kbに設定されているようです。意外と小さいですね。
私が遭遇したケースも100kb超えてたってことなんでしょうね。
VBAHaskellの紹介 その16（ラムダ式？の生成）

(2015/10/1 追記)
以下の記事に書いた`lambdaExpr`関数は廃止し、代わりに`yield`式 ( `yield_0`、`yield_1` および `yield_2` )を追加した。`lambdaExpr`関数は使うのも説明するのも難しいと思っていたのがその理由だ。
`yield_n` は関数の**評価時**にプレースホルダ `ph_n` (n = 0,1,2)になるもので、下の記事の例で`yield`式を使うとこう書ける。

```vbnet
'                    ph_1 と ph_2 には評価時に実引数が代入される
'                    yield_1 は評価時に ph_1 になる
f = p_cons(p_makeSole, p_mapF(p_cons(ph_1, yield_1), ph_2))  '[a] : map (a:) b
m = foldr(p_catV, Array(), scanr(f, Array(), a))
```
`f = p_cons(p_makeSole, p_mapF(lambdaExpr(p_cons, 1, ph_1), ph_2))`
よりマシになったと思う。
`
`
* * *

前回記事 [VBAHaskellの紹介 その15（引数の部分文字列のリストを取り出す）](http://qiita.com/mmYYmmdd/items/e891fb239318d9580d0f) で、問題を解くためのアドホックな関数を定義して使ったことを不満点としてあげた。
>VBAHaskellで実装している関数合成はスコープがフラットで、すべてのプレースホルダに実引数を渡して一斉に評価することしかできないのが問題で、このままでは本物のラムダ式からはほど遠い。

一応これを解決する関数`lambdaExpr`を作ったのでその内容を書く。
（[Haskell_1_Core](https://github.com/mYmd/VBA/blob/master/Haskell_1_Core.bas) モジュールに追加）

問題にしたのは以下のコードだ。

```vbnet
'consMap 関数の定義は cons 関数を map しているだけ
Function consMap(ByRef a As Variant, ByRef v As Variant) As Variant
    consMap = mapF(p_cons(a), v)
End Function
```
```vbnet
'consMap関数を組み込む
f = p_cons(p_makeSole, p_consMap(ph_1, ph_2))  '[a] : map (a:) b
m = foldr(p_catV, Array(), scanr(f, Array(), a))
```
ここで `p_mapF(p_cons(ph_1), ph_2)` というような形に書ければ、`consMap`関数は不要になる。しかし**「すべてのプレースホルダに実引数を渡して一斉に評価することしかできない」**と書いたとおり、これに引数 a, v を渡すと `mapF(cons(a, a), v)` もしくは `mapF(cons(a, v), v)` などと代入され、先にcons関数が評価されてしまう。本来は `mapF(p_cons(a, _), v)` というように、**引数を代入した後もプレースホルダを残したファンクタのまま**でいてほしいのだ。
これは要するに引数の代入に対する関数呼び出しを遅延させればいいので、[Haskell_1_Coreモジュール](https://github.com/mYmd/VBA/blob/master/Haskell_1_Core.bas)に`lambdaExpr`という関数を追加してそれができるようにした。

`lambdaExpr`を使うコードはこうなる。[^1]

```vbnet
'                         p_consを第1引数によって遅延 bind1st する
f = p_cons(p_makeSole, p_mapF(lambdaExpr(p_cons, 1, ph_1), ph_2))
m = foldr(p_catV, Array(), scanr(f, Array(), a))
```
`lambdaExpr`の実質は単なる遅延 `bind1st`(または`bind2nd`) である。
上の `p_mapF(lambdaExpr(p_cons, 1, ph_1), ph_2)` に引数 a, v を与えると、
`mapF(bind1st(p_cons, a), v)`
と評価され、最終的に
`mapF(p_cons(a, _), v)`
という、プレースホルダを残したままの形になっている。
これをラムダ式と呼ぶのは苦しいが `lambdaExpr` と名付けた。


[VBAHaskellの紹介 その15（引数の部分文字列のリストを取り出す）](http://qiita.com/mmYYmmdd/items/e891fb239318d9580d0f)
[VBAHaskellの紹介 その1（最初はmapF）](http://qiita.com/mmYYmmdd/items/c731edf943acc0a0ebe9)

[^1]: [テストモジュール](https://github.com/mYmd/VBA/blob/master/test_module.bas) にテスト関数`segmentsTest2`として追加した。
pytest を使ってみる -概要とサンプル-

# 注意書き
私はテスト技術に関して初心者です．
この投稿も，トライアンドエラーを繰り返しながら書いています．
そのため，(気を付けてはいますが)この投稿に書いてあることが必ずしも正しいとは限りません．
また，間違いに気づいた場合や新しい発見があったときは，随時更新していきます．

# はじめに
本記事では，python 用のテストツールである pytest に触れてみたいと思います．
具体的には， pytest の概要(ただしコピペ)とサンプルコードを紹介したいと思います．
python 用のテストツールとしては，ほかに unittest, nose, doctest がありますが，
これらについてはまた，別の記事で紹介する予定です．

# 環境
* Windows7
* python 2.7.10

# pytest とは
pytest とは　windows 上で動作する，Python 2.6-3.4, PyPy および Jython-2.5.1
向けのテストツールです．
他のテストツールとの違いとしては，
> この pytest の大きな特徴はテストメソッドで使用する値を簡単にパラメータ化できることです.
by [Python で書く代数 - pytest 編](http://blog.elliptium.net/2012/05/Python---pytest)

とも
>使うアサーションは assert だけです。
assertなんちゃらというメソッドを延々覚える必要はありません。
このシンプルさが素晴らしいですね。
by [py.testのはじめかた](http://blog.craftgear.net/549a26cc5d7d17f472000002/title/py.test%E3%81%AE%E3%81%AF%E3%81%98%E3%82%81%E3%81%8B%E3%81%9F)

とも
>nose, unittest.py, doctest.py を統合したテスト実行や、様々なオプションで柔軟なテストが実行できるようです。もちろん、カバレッジも取得可能です。
by [Python, Django 界隈の単体テスト事情（unittest / nose / django-nose）](http://akiyoko.hatenablog.jp/entry/2015/01/01/212712)

とも
>assertの使い方は簡単で，フィクスチャや状態の管理サポート，デバッガとの連携が強力。
by [Python用のユニットテストツールまとめ](http://coreblog.org/ats/python-testing-tools-taxonomy/)

とも言われていますが，いかんせん初心者なのでピンときません．
色々と使ってみるうちにわかってくるのでしょうか．

# インストールの仕方
とにかく，始めてみないことには何も分からないので，とりあえずインストールをしてみましょう．
インストールの仕方は，
>pip install -U pytest # or
easy_install -U pytest
by [Installation and Getting Started](http://pytest.org/latest/getting-started.html)
です．

pip をインストールしていない人は，[こちら](http://www.aoki.ecei.tohoku.ac.jp/~ito/python_windows.html)を参考にしてください．

# サンプルコード
括弧の対応をチェックするｱﾚを深く考えずに力技で適当に書いてみる

[知恵袋を覗いていたら、書いてみたいコードがあったが、回答を書き込んでしまって質問を閉じられると、他の人のコードも見れないには嫌だなと思ったので、こちらにしれっと書いてみる。](http://qiita.com/ShibuyaKosuke/items/296a9007da4336d97848)

力技でシンプルに書くとどうなるかな、と思って書いてみました。
あくまで括弧の対応しか見ていません（リテラルとかコメントとかそういうのはない）。

```php
<?php
function brace_check($src, $i = 0, $want = null)
{
    static $map = [
        '[' => ']',
        '(' => ')',
        '{' => '}',
        ']' => '',
        ')' => '',
        '}' => '',
    ];

    $len = strlen($src);

    for (; $i < $len; $i++) {
        $c = $src[$i];
        if ($c === $want) {
            return $i;
        }
        if (isset($map[$c])) {
            if ($map[$c] === '') {
                throw new Exception(sprintf('unexpected "%s" on %d char', $c, $i + 1));
            }
            $i = brace_check($src, $i + 1, $map[$c]);
        }
    }
    if ($want !== null) {
        throw new Exception("unexpected end of file");
    }
}

$expressions = array(
    ")(){}",
    "[]({})",
    "([])",
    "{()[]}",
    "([)]",
    "[({})",
);

array_map(function ($src) {
    try {
        brace_check($src);
        echo "OK: $src\n";
    } catch (Exception $ex) {
        echo "NG: $src ... {$ex->getMessage()}\n";
    }
}, $expressions);
```
VMWare Player上でCentOS起動

#Objective
DevOPSに関連する学習の環境のセットアップ

#Environment
 OS : Windows 8.1 
 CPU : Intel(R) Core(TM) i7-4702MQ CPU @2.20GHz
 Memory : 8.00GB

#Procedure
:one: VMWare Playerをインストール
[ここから](https://my.vmware.com/jp/web/vmware/free#desktop_end_user_computing/vmware_player/7_0) 7.1.0 を使用

:two: CentOSのISOファイルをダウンロード
[ここから](CentOS-7-x86_64-DVD-1503-01.iso) ダウンロード。
今回はPCが64bitなので、64bit版をダウンロード。


:three: VMWare Playe を起動し、ISOファイルを使用して仮想マシン作成。
基本はデフォルトで作成。

:heavy_exclamation_mark: ここで、エラー発生
[ここ](http://tomoyamkung.net/2014/08/11/linux-x86os-install-vmware/)を参考にしてBIOS設定を変更。どうやら、Intel(R) Virtualization TechnologyをEnableにしないといけないらしい。

設定を変更すると、無事仮想マシンが起動。
まだネットワークが繋がっていない。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/76485/dd2280d1-d1e5-6762-eb19-003f461489c6.png)

次はネットワーク設定。
Mysqlでinsert、delete、updateが遅い場合の対策

## insert
### 遅い原因
insertする際に、対象テーブルのインデックスブロックを読み込んで、
更新かけるので、インデックスサイズが大きいと、パフォーマンスが落ちる。
なので、テーブルのデータ増加が原因で、I/Oが発生し、徐々に遅くなっていく。
インメモリで処理できなくなると、突如としてパフォーマンスに影響が出やすい
### 対策
 * テーブルサイズをできるだけ小さく(レコード長を小さく)
 * インデックスサイズを小さくすること(無闇にインデックス貼らない)
 * パーティショニング(DB間のテーブル移動)
 * 不要データ削除
  * 16KB毎(たぶん)のブロック単位でデータを保持しているので、
  断片化されたデータを削除しても効果が薄いです。
  Auto Incrementの場合は、ID1〜10000等をまとめて削除する等であれば、効果が期待できます。
  ただし、ただし次のインサート以降、空いたブロックを活用するので積極的にデータ削除。
 * インデックス削除

## delete
### 遅い原因
特定レコードの読み込み、インデックス全削除が必要なのでかなり重い。
つまり、一番遅い。

### 対策
 * delete前にselectしてメモリに載っける(もちろんindex使う)
 * mysqlのパーティション機能を使う。
  * 例えば、ログ系テーブルの場合、レンジパーティションを使えば、期間毎に、物理テーブルが別れるため、そもそもdelteする必要が無くなる場合が多く、dropでテーブル削除が可能です。

## update
### 遅い原因
selectしてから、テーブルデータの更新、更に
インデックスの更新も行うため
### 対策
 * インデックスの見直し。
   インデックスのサイズが大きいと、サイズに比例して、更新に時間掛かる
Golangのライブラリのインストール

## 通常の Go の開発の場合（GAE以外）

    go get github.com/gorilla/sessions

$GOPATH/src 以下にインストールされる

## GAE/Go（Google Cloud SDK を利用）の場合

    goapp get github.com/gorilla/sessions

~/google-cloud-sdk/platform/google_appengine/gopath/src 以下にインストールされる
GOPATH のベストプラクティス

## 通常の Go の開発（GAE以外）

    mkdir -p ~/go/src

.bashrc に追加

    export GOPATH=$HOME/go

## Google App Engine/Go

まず、[Google Cloud SDK](https://cloud.google.com/sdk/) をインストールする。
Google Cloud SDKでは、GOPATHが未設定なら自動的に ~/google-cloud-sdk/platform/google_appengine/gopath がGOPATHに設定されるので、通常開発時のGOPATHをunsetする

    unset GOPATH
AWS を使った Docker の基本学習 (1) コンテナの起動、イメージの作成など

AWS EC2 を使って、Docker の基本的な操作の流れをまとめてみました。

# インストール、準備
まずは、EC2 上に Linux インスタンス(今回は Amazon Linuxを使用)を作成して、SSHでログイン。

Dockerをインストールする。

```
$ sudo yum install docker -y
$ sudo service docker start
```

動作確認。

```
$ sudo docker version
Client version: 1.6.0
Client API version: 1.18
Go version (client): go1.3.3
・・・・
```

毎回 sudo を打つのが面倒なので、ec2-user を docker グループに追加すると便利。
(いったんログアウトしてから、再ログインすると設定が反映される)

```
$ sudo usermod -G docker ec2-user
```

# コンテナの起動からイメージの作成
イメージをpullして、コンテナを起動。

```
# CentOS のイメージを Pull。
# CentOS の7系に詳しくないので、ここでは6系をPullした。
$ docker pull centos:6.6

# コンテナを起動
$ docker run -it --name myweb centos:6.6 /bin/bash
```

コンテナ内で操作。httpd をインストールしてみた。

```
# httpd のインストール
[root@02e9b814e7e3 /]# yum install httpd -y

# 必要に応じてHTMLファイルを作成
[root@02e9b814e7e3 /]# vi /var/www/html/index.html

# httpd を開始して、コンテナ内からアクセスしてみる。
# IP アドレスは、ifconfig などから取得する。
[root@02e9b814e7e3 /]# service httpd start
[root@02e9b814e7e3 /]# curl http://172.17.0.4

# bash を終了して、コンテナから抜ける。
exit
```

コンテナからイメージを作成する。

```
# コンテナが終了したことを確認
$ docker ps -a

# コンテナを commit して、イメージを作成
# arturias の部分は、適当な名前に置き換えてください。
$ docker commit -m "Installed httpd" myweb arturias/myweb

# イメージが作成されたことを確認
$ docker images
```

# 作成したイメージからコンテナを起動

今回はEC2 上で動かしているので、まずは AWS のコンソールなどからセキュリティグループを追加して、HTTP(TCP 80) のアクセスを許可する。

それから、作成したイメージを使ってコンテナを起動。

```
# ここでは、-d オプションを指定してバックグラウンドで起動させる。
$ docker run -d -p 80:80 --name myweb-test arturias/myweb /usr/sbin/apachectl -DFOREGROUND

# いちおう、コンテナが動作しているか確認。
$ docker ps
```

この後、EC2 インスタンスの Public IP アドレスへ、ブラウザからアクセスするとWeb ページが見える。


# 参考
[Docker Basics](http://docs.aws.amazon.com/AmazonECS/latest/developerguide/docker-basics.html)
c言語 > N_マクロ > gettextのマクロ

https://github.com/neovim/neovim/commit/53774af5e94f437135e4664949d65ccf3be030e0
にて

    static const char *err_arg_missing = N_("Argument missing after");

という記載がある。N_はgettextのマクロらしい。

http://www1.kokusaika.jp/advisory/org/ja/gettext.html
によると

    メッセージの取り出しを関連ツールに指示する
という説明がある。


    static const char *msg = N_("message");
というのはgettextでmsgid"message"に対応するmsgstrを取り出すための書き方らしい。

msgidやmsgstrは.poなり.potなりに用意するようだ。

gettextを使う利点は国際化対応で翻訳をする時に使うようだ。
「HiBiSクラウド部会 & JAWS-UG　合同勉強会」参加したよ

https://e1d9829b6ab8efce9acb992610.doorkeeper.jp/events/25173

２ヶ月に一回の JAWS-UG 広島です。
記憶に残ったワードは

* 費用の平準化
* システム構成を最終盤で決めれる

### メモ

![201530-aws1.png](https://qiita-image-store.s3.amazonaws.com/0/53620/0666ec9b-fa3d-2caf-f63b-c8fc63cef835.png)

![20150530-aws2.png](https://qiita-image-store.s3.amazonaws.com/0/53620/6e5a3024-2499-ba90-ba3f-bf6e89745f7d.png)

↑内容が濃すぎてまとめることができない。。。あと２回くらい同じ話を聞きたい！！
開発者だけではなく、いろんな人に聞いて欲しい話だった。

![20150530-aws3.png](https://qiita-image-store.s3.amazonaws.com/0/53620/d3973afa-ad0c-4304-860e-ce3b6833e914.png)

### 費用の平準化

数年の単位で定期的に発生する（減価償却がおわったときに発生する）、機器更新／OSバージョンでお金をかけるくらいなら、契約の内容を変えてコツコツと実施してもらう。

AWS を利用すれば機器更新については考慮しなくてよくなるので、OSや各ライブラリのバージョンのみを意識すれば良くなる。

一気に最新バージョンへっということをすると、リスクが大きくなるので、日頃から地道にバージョンアップを行う。

これは、今のぼくが参加しているプロジェクトでも言えることなので、毎月コツコツとバージョンアップを忘れないようにしないとね。

http://www.engineyard.co.jp/blog/2014/cakephp3-future-preview/

CakePHP2 のサポートは、今後３年は続くとのことだけど、CakePHP3 のことも考慮して今後のアプリを開発していかないと。


### システム構成を最終盤で決めれる

ある程度は決めておく必要はあるけど、ハードを買う必要はないから何台構成にするのか等は、終盤の負荷試験後に決めれる。

これはすごいポイントだよね。無駄に立派にする必要はないし、足りなかった場合の回避方法に幅ができる。

AWS を利用していると気がつくと「システム構成を最終盤」で決めてる。決めてた。
言われて気づきました。

逆に AWS を使わない案件だと「アプリもできてなくて、負荷試験もしてないのに台数なんて決めれません」って言っちゃいそう。


### まとめ

セッションそれぞれが視点が異なっていて幅広い内容でした。
幅広い内容だったので、いろいろ気づきをもらうことができました。
gitWatch > TIME_BETWEEN_SECTORS / TIME_PER_SECTOR

https://github.com/mamedev/mame/commit/3a1d3b2b22ca0ef92cde27ddb24826e2d11ee6a7
のcommitにて

    TIME_BETWEEN_SECTORS

としていたのを

    TIME_PER_SECTOR

に変更している (to avoid missed interrupts)。

between sectorsであった時、解釈として以下があると思う。
1. 1つのsectorが終了してから、次のsectorが始まるまでの時間
2. 1つのsector開始から、そのsector終了までの時間 (そのsectorと次のsectorの間の時間は0と仮定)

per sectorsとすることで、上記2の意味であるというように解釈が一意となる。

ところで、commit messageのmissed interrupts(割り込み)はmissed interpretation(解釈)の書き間違いではないかと思う。
技術英語 > settle for > 良しとする > I'm not willing to settle for that.

Star trek Voyager 1st episode

最高速ワープスピードでも地球帰還に75年かかる地点におかれた主人公たち。既存の技術だけでは非常に困難な帰還となる。

その時、ジェイウェイン艦長が言った言葉
I'm not willing to settle for that.
(既存の技術利用だけに良しとはしない）。

あらゆる手段、アイデア、技術開発をして早く帰還してやろうという意気込みが感じられる場面。
Ninety-Nine Scala Problems奮闘記6

# 【リベンジ】P07 Flatten a nested list structure.
前回どうしても解けなかったP07にリベンジした。今回は「ネストしたList構造を一つのListにまとめる」のを

1. 再帰
2. flatmap

どちらでも実装するのが目標。

## 1. 再帰のパターン

**結局自力では分からなかった。**

### 自力でなんとか書いたコード
```scala:myAnswer
    def flatten (result: List[Any], ls: List[Any]): List[Any] = ls match {
      case ls::tail if ls == classOf[List[Any]] => {
        flatten(result, ls[Any])
        flatten(result, tail)
      }
      case h::tail => {
        flatten(result:+h, tail)
      }
      case Nil => result
      case _ => throw new NoSuchElementException
    }
```

そして当然のように動かない。
```
Error:(11, 27) value ls of type Any does not take type parameters.
        flatten(result, ls[Any])
                          ^
```
って言われる。

### 型パラメータの指定方法を学んだ後のコード
結局分からなかったので、[S-99: Ninety-Nine Scala Problems所感 リスト操作編 - Soleil cou coupé](http://d.hatena.ne.jp/xef/20130308/p1) を見てお勉強。

```scala:scala
  case (xs : List[_]) :: (ys : List[_]) => flatten(xs) ::: flatten(ys)
```

ああー…そんなことできるのか…。
前のエラーは、resultは型パラメータを取らないよって叱られてたから、受け取るresult自体をList[Any]に限定してやれば良かったみたいだ。

と思って直したが

```scala:myAnswer
    def flatten (result: List[Any], ls: List[Any]): List[Any] = ls match {
      case (ls:List[Any])::(tail:List[Any]) => {
        flatten(result, ls)
        flatten(result, tail)
      }
      case h::tail => {
        flatten(result:+h, tail)
      }
      case Nil => result
      case _ => throw new NoSuchElementException
    }
```
↓

```scala:
  //上記コードはmyAnswerのメソッド内メソッド
  println(myAnswer(List(List(1,1),2,List(3,List(5,8)))))
```
↓

```
List(2)
Process finished with exit code 0
```
動かない。

### 普通にロジックがおかしかった
そういや```result```の扱いがおかしいわ。
じゃあこうか。

```scala:myAnswer
    def flatten (result: List[Any], ls: List[Any]): List[Any] = ls match {
      case (ls:List[Any])::(tail:List[Any]) => {
        flatten(result, ls):::flatten(result, tail)
      }
      case h::tail => {
        flatten(result:+h, tail)
      }
      case Nil => result
      case _ => throw new NoSuchElementException
    }
```
↓

```
List(1, 1, 2, 3, 5, 8, 2, 3, 2)
Process finished with exit code 0
```
うーん。だいぶ近くなっては来たけど…
パターンマッチがまだおかしい。

降参して回答例を見た。
[Flatten a list - Rosetta Code](http://rosettacode.org/wiki/Flatten_a_list#Scala)

```scala:RosettaCode
def flatList(l: List[_]): List[Any] = l match {
  case Nil => Nil
  case (head: List[_]) :: tail => flatList(head) ::: flatList(tail)
  case head :: tail => head :: flatList(tail)
}
```

自分のものと違うのは、与えられたListが「ListとListの結合」という場合がないことと、結果を入れようと思って設定した```result```がないこと。

美しい再帰を書く道のりは長い…。

## 参考
- [S-99: Ninety-Nine Scala Problems所感 リスト操作編 - Soleil cou coupé](http://d.hatena.ne.jp/xef/20130308/p1)
- [Flatten a list - Rosetta Code](http://rosettacode.org/wiki/Flatten_a_list#Scala)
fluentdのプラグインでcertificate verify failedエラーが発生した話

# 環境

+ Amazon Linux AMI 2015.03 (HVM)
+ td-agent-2.2.0-0.x86_64
+ AWS-SDK(ruby)のv2を利用したfluentdのプラグイン

また、AmazonLinuxではS3へアクセスできるIAMロールの権限を付与してる。

# 問題

AWS-SDK(ruby)のv2を利用したfluentdのプラグイン
を利用したら以下のような**certificate verify failed**エラーが発生しました。

```
before_shutdown failed error="SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed"
```

# 調査

+ [[Ruby] open-uri の HTTPS リクエストで certificate verify failed](http://mofuken.blogspot.jp/2012/12/ruby-open-uri-https-certificate-verify.html)
+ [エラー：OpenSSL::SSL::SSLError SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed](http://d.hatena.ne.jp/komiyak/20130508/1367993536)

どうやらrubyで使うSSL証明書の所でエラーのようです。。。
証明書が存在しない場合もあるようなので、確認してみます。

```
$/opt/td-agent/embedded/bin/ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_FILE'
/opt/td-agent/embedded/ssl/cert.pem
$ll /opt/td-agent/embedded/ssl/cert.pem
lrwxrwxrwx 1 root root 43  5月 29 13:00 /opt/td-agent/embedded/ssl/cert.pem -> /opt/td-agent/embedded/ssl/certs/cacert.pem
```

問題なく、存在するようです。。

うーん、ということで確認のために以下のプログラムを作って確認します。（もし、IAMロールの設定をしていない場合、credential情報も付与すること)

```lang:s3.rb
require 'aws-sdk'
require 'pp'

s3 = Aws::S3::Client.new(region: 'ap-northeast-1')
resp = s3.list_objects(
  bucket: 'toshihirock-elb-test',
  prefix: 'AWSLogs/1111111/elasticloadbalancing/ap-northeast-1/2015/05/29/'
)
pp resp
```

このプログラムをAmazonLinuxでデフォルトでインストールされているrubyとflunetdで使っているrubyで実行。（事前にrubyのaws-sdkはインストール済み）

```
$ruby s3.rb
# ok
$/opt/td-agent/embedded/bin/ruby s3.rb
# error
```

ということでtd-agentのrubyを使うときに発生するようです。AmazonLinuxで使われているrubyの方は問題ないようなので、こちらのSSL証明書をコピーします。

```
$ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_FILE'
/etc/pki/tls/cert.pem
$cp /opt/td-agent/embedded/ssl/cert.pem /opt/td-agent/embedded/ssl/cert.pem.original
$cp /etc/pki/tls/cert.pem /opt/td-agent/embedded/ssl/cert.pem
```

この状態で先ほどのS3取得処理を実行。

```
$/opt/td-agent/embedded/bin/ruby s3.rb
# ok
```

問題解決しました！

# このあと

自己解決したあとまさにドンピシャなブログを発見しました。先に見つけれていれば。。。

[EC2上のログをtd-agent使ってCloudWatch Logsに投げようとしたらSSL認証エラーになった話](http://alligatorswamp.hatenablog.com/entry/2015/04/21/163234)


上記にも記載してありましたが、本問題はrubyのaws-sdk-v1では起きてなかったので、対象はaws-sdk-v2を使っているfluentdで発生すると思われます。
Node.js 初めてのファイル書き込み

node.js始めて5日目。初めてファイルに書き込んでみる

#GETで受けた内容をファイルに書き込むサンプル
(Express使っています)


````app.js
・・・・
var filewriter = require("filewriter");
・・・・
app.use("/filewriter",filewriter);
・・・・
````

````/routes/filewriter.js

var fs=require("fs");
module.exports=function(req, res, next) {
  fs.writeFileSync("/out/test.txt",req.query.text);
  res.send("書き込みしました");
}
````

これで、
`http://localhost:3000/filewriter?text=test`
こんな風にアクセスすると、
outフォルダにtest.txtという名前のファイルが作成され、Getで渡した値が書き込まれます。
すでに同じ名前のファイルが存在する場合は、上書きされます。

実際に書き込み処理行っているのは,`fs`オブジェクトの`writeFileSync`メソッドです。

`writeFileSync(filename,data)`
は同期処理用ですので、書き込みが終わるまで次の処理が行われません。
戻り値は`undefined`です。

非同期に処理をする場合は、
`writeFile(filename,data,callback)`
を使い、callbackで後続の処理を行います。エラー処理とかするなら、

````js

fs.writeFile(filename,data,function(err){
   if(err) throw err;
   console.log("書き込み完了");
}

````
とします。

#POSTの場合
パラメータの受け取り方が違うだけで、同じですね。
POSTの場合は

````js
req.body.text
````

として受け取ります。

なお、Postしたサイズによってはエラーが発生するかもしれません。
その場合[ここ](http://qiita.com/PianoScoreJP/items/3fbcebc43ebf821074d8)を参照してみてください。


本家のドキュメントは[ここ](https://nodejs.org/api/fs.html#fs_class_fs_writefile)
Swiftで書く初めてのSpriteKitアプリ

# SwiftとSpriteKitでとりあえずなにか作ってみる

お仕事でswiftを扱うにあたって、とにかくなんでもいいから書いてみようと思い立った。

このエントリを参考にさせていただきました。
http://qiita.com/soymsk/items/17ea8c6dc7349a81873b

## タブビューで、SpriteKitを使ったアプリ

XCodeの新規プロジェクトでTabViewのテンプレートで開始します。
IBからFirstViewのカスタムクラスにSKViewを設定しておきます。

### StoryBoard
スライダコントロールを使いたかったのでこんな感じで配置。
アウトレットとイベントバインドも済ませておきます。

![スクリーンショット 2015-05-31 6.21.55.png](https://qiita-image-store.s3.amazonaws.com/0/59457/02d2b01b-6ec9-40e5-2fd7-6555cdace5df.png)


### AppDelegate.swiftに変数追加
以下の変数を定義しておきます。

```swift:AppDelegate.swift
var window: UIWindow?
var view1: UIViewController?
var slider1Val:Int = 0
```

### FirestViewController.swift
こんな感じ

```swift:FirestViewController.swift
import UIKit
import SpriteKit

class FirstViewController: UIViewController {
    @IBOutlet weak var slider1: UISlider!
    var appDg:AppDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()
        slider1.minimumValue = 1
        slider1.maximumValue = 100
        slider1.value = 1
        
        self.appDg = UIApplication.sharedApplication().delegate as? AppDelegate
        appDg!.view1 = self
        
        let skView = self.view as? SKView
        skView!.showsFPS = true
        skView!.showsNodeCount = true
    }
    override func viewWillAppear(animated: Bool) {
        let skView = self.view as! SKView
        let scene = GameScene(size: skView.bounds.size)
        
        skView.presentScene(scene)
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    @IBAction func valueChangeSlider1(sender: AnyObject) {
        self.appDg?.slider1Val = Int(slider1.value)
    }
}
```
### GameScene.swift
流用元とほぼ変わりません。
スライダーコントロールの値からスプライトを描写しているというくらいです。

```swift:GameScene.swift
import UIKit
import SpriteKit
class GameScene: SKScene {

    func addShape(location: CGPoint){
        var appDg:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        var vc1:UIViewController = appDg.view1!
        var size = appDg.slider1Val
        
        let shape = SKShapeNode(circleOfRadius: CGFloat(size))
        
        
        shape.fillColor = UIColor.whiteColor()
        shape.position = location
        
        shape.physicsBody = SKPhysicsBody(circleOfRadius: CGFloat(size))
        shape.physicsBody!.dynamic = true
        
        self.addChild(shape)
    }
    
    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        let touch = touches.first as? UITouch
        let location = touch!.locationInNode(self)
        
        addShape(location)
    }
}
```

FirestViewの画面をタップするとスライダコントロールの値に応じた大きさのスプライトが描写されます。
ただそれだけです。

SpriteKitが使えれば、地味になりがちなアプリも色々と楽しい物が作れそうな気がします。
DWRでパラメータを渡せなかった問題（フィールド変数の先頭の大文字/小文字）

先日メンバーから、「DWRでパラメータが渡せない」という相談を受けました。
解決に時間がかかったので、メモとして残します。

# 問題
以下のRemotedクラスのaddToFriendsメソッドを、DWRライブラリを使ってAjaxで呼び出すことを考えます。

```java:Remoted.java
public class Remoted {
  public void addToFriends(Person p) {
    // ...
  }
}
```
```java:Person.java
public class Person {
  private String Name = null;
  public void setName(String name) { ... }
  public String getName() { ... }
}
```
呼び出しは以下の通りです。`Person`クラスのフィールドに合わせて、JavaScriptの変数`p`のプロパティを`Name`（先頭を大文字）にして、Ajax通信します。

```js:test.js
var p = { Name:"Fred"};
Remoted.addToFriends(p);
```
しかし、`Person`クラスのフィールド`Name`はnullでした。

## 解決
JavaScriptの変数`p`のプロパティを、`Name`から`name`に変えたら、"Fred"という値が渡せました。
```js:test.js
var p = { name:"Fred"};
```

どうやらDWRは"Name"から"setName"は呼び出さないようです。
私はイケると思い込んでいたため、解決するまでに時間がかかってしまいました。

まあ、そもそもフィールド変数を大文字から始めるなって話なんですが。