OmniAICreator/Qiita-1.07M huggingface dataset:
使われていないサウンドファイルをスクリプトで一括削除

MVではRTPが廃止されたため、プロジェクト作成時に全ての素材ファイル（396MB、その内175MBが音楽データ）がプロジェクトにコピーされます。いずれ整理することを考えると気が遠くなるかも知れませんが、MVはデータ形式がjsonになったおかげで、なんらかのスクリプト言語が扱える人なら簡単に不要データを削除することができます。

その内ツクラー向けにGUIに対応したソフトが出てくるとは思いますが、おそらく自分で追加したjsやプラグイン中で使われる素材には対応できないはずです。スクリプトならこの手の調整は簡単なので、自分用に作ったRubyスクリプトを公開しておきます。使い方はRubyがインストールされていれば、このファイルを index.html と同じ場所に置いて実行するだけです。

```ruby:unused_sound_remover_mv.rbw
# encoding: utf-8

def has_sound?(filename)
  if !filename.index('MapInfos')
    ['Animation', 'CommonEvents', 'Map', 'System', 'Troops'].any? {|s| filename.index(s) }
  end
end

def need_sound
  a = []
  files = Dir.glob("./data/*.json")
  files.each do |filename|
    next unless has_sound?(filename)
    json = File.open(filename, "r:utf-8") {|io| io.read }
    a.push(json.scan(/"name":"(\w+)","pan"/))
    a.push(json.scan(/"name":"(\w+)","volume"/))
  end
  a.flatten.uniq.sort
end
@need_sound = need_sound

def unused_sound
  a = []
  files = Dir.glob("./audio/*/*.*").to_s.scan(/\.\/audio\/\w+\/(\w+)\.\w+/).flatten.uniq.sort
  files.each do |filename|
    next if @need_sound.any? {|s| filename == s }
    a.push(filename)
  end
  a
end

def delete_unused_sound
  files = Dir.glob("./audio/*/*.*")
  files.each do |filename|
    if /\.\/audio\/\w+\/(\w+)\.\w+/ =~ filename
      next if @need_sound.any? {|s| $1 == s }
    end
    File.delete(filename)
  end
end

# Web／Android／iOSに対応しない場合 AAC(*.m4a) は不要
def delete_m4a
  files = Dir.glob("./audio/*/*.*")
  files.each {|filename| File.delete(filename) if filename.index('.m4a') }
end

# puts @need_sound  # 必要なサウンドファイルの一覧を出力
# puts unused_sound # 使われていないサウンドファイルの一覧を出力
delete_unused_sound # 使われていないサウンドファイルを一括削除
# delete_m4a        # *.m4aを削除
```

ちなみに画像素材は後から削除するより、使うファイルをプロジェクトに入れていく方が個人的には作りやすいので対応していません。画像素材はジャンルや規格がはっきり分かれていることが多く、製作中のゲームに縁のないものは選択時に邪魔になるからです。逆に効果音はシステム／アニメーションに組み込まれてしまっているため、開発中は全てのデータを入れておいた方が無難です。

あとはデフォルトのBGMはなぜか凄まじい高ビットレートになっているので、特にWEB公開などをする場合は再圧縮した方が良いでしょう。その際、ループタグを自分で付け直すのは面倒なので、こちらの記事を参考にすると楽ができると思います。

http://d.hatena.ne.jp/tkoolmv/20151031/1446280922
TemporalQueryで関数合成したかった

[TemporalQuery](http://docs.oracle.com/javase/jp/8/api/java/time/temporal/TemporalQuery.html)は、[TemporalAccessor](http://docs.oracle.com/javase/jp/8/api/java/time/temporal/TemporalAccessor.html)(Java8で追加されたDate and Time APIで時刻・時間を表すベースクラス)をLocalDateTimeとかYearとかに変換する関数を表すクラスで、以下のように定義されている。

```java
@FunctionalInterface
public interface TemporalQuery<R> {
    R queryFrom(TemporalAccessor temporal);
}

```

たとえば[DateTimeFormatter](http://docs.oracle.com/javase/jp/8/api/java/time/format/DateTimeFormatter.html)ではTemporalQueryを以下のように利用する。

```java
    String pattern = "yyyy-MM-dd HH:mm:ss.SSS z";
    DateTimeFormatter dtFormatter = DateTimeFormatter.ofPattern(pattern);
    TemporalQuery<LocalDateTime> tq = LocalDateTime::From;
    DateTime dt = dtFormatter.parse(dateString,tq);
```

ここでTemporalAccessorを[Date](http://docs.oracle.com/javase/jp/8/api/java/util/Date.html)に変換しようとするとき、TemporalAccessorからDateに直接変換するTemporalQueryが標準では用意されていないので、TemporalAccessor -> Instant -> Dateと変換していくTemporalQueryを用意する必要がある。

これはただの"TemporalAccessor -> Instant"と"Instant -> Date"の合成関数だが、[Function<T,R>](http://docs.oracle.com/javase/jp/8/api/java/util/function/Function.html)型とTemporalQuery<R>型は関係がないので
Function#andThen()で合成関数を作ってもTemporalQuery型にならない。

"TemporalAccessor -> Date"のTemporalQueryを使うには、自分で"TemporalAccessor -> Date"のメソッドを定義してやる必要がありそう。

```java
import java.time.Instant;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;
import java.util.Date;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class DateTimeFormatterTest{
    private final static String pattern = "yyyy-MM-dd HH:mm:ss.SSS z";
    private final static DateTimeFormatter dtFormatter = DateTimeFormatter.ofPattern(pattern);

    public static Date stringToDate(String dateString) {
        //これはダメ
        //return dtFormatter.parse(dateString,((Function<TemporalAccessor,Instant>)Instant::from).andThen(Date::from))
        
        //これはOK
        return dtFormatter.parse(dateString,DateTimeFormatterTest::taToDate);
    }
    private static Date taToDate(TemporalAccessor ta){
        Function<TemporalAccessor,Date> fun = ((Function<TemporalAccessor,Instant>)Instant::from).andThen(Date::from);
        return fun.apply(ta);
    }
    
    public static void main(String[] args){
        List<Date> ds = IntStream.range(00,59).parallel()
                .mapToObj(sec -> stringToDate("2015-12-16 14:"+String.format("%02d",sec)+":00.655 JST"))
                .collect(Collectors.toList());
        System.out.println(ds);// -> [Wed Dec 16 14:00:00 JST 2015, Wed Dec 16 14:01:00 JST 2015, Wed Dec 16 14:02:00 JST 2015, ..
    }
}
```

[gist](https://gist.github.com/gecko655/14f6f334ae9e814622da)

もうちょっとうまい方法ないかな…
Logbackのメール送信機能

***概要***
Logbackにはメール送信機能を提供しています。エラーなど検知する場合は、指定先にメールサーバへアラートメールを送信するのことはできます。

------------------------------------------------------------------------------------------
設定方法

- 依存のJARファイル

>logback-core-1.1.1.jar
>logback-classic-1.1.1.jar
>slf4j-api-1.7.6.jar
>java-mail-1.4.7.jar

- logback.xmlの設定

\<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
\<filter class="ch.qos.logback.classic.filter.LevelFilter">
\<level>ERROR</level>
\<onMatch>ACCEPT</onMatch>
\<onMismatch>DENY</onMismatch>
\</filter>

\<smtpHost>mailtrap.io</smtpHost>
\<smtpPort>${PORT}</smtpPort>
\<SSL>false</SSL>
\<username>${USER}</username>
\<password>${PASSWORD}</password>
\<to> ${to}</to>
\<from>${from} </from>
\<subject>TESTING: %logger{20} - %m</subject>
\<layout class="ch.qos.logback.classic.html.HTMLLayout"/>
\<asynchronousSending>false</asynchronousSending>
\</appender>

\<root level="info">
\<appender-ref ref="EMAIL" />
\</root>
------------------------------------------------------------------------------------------

***注意事項：***
メール送信モードは同期と非同期モードがあります。
ただし非同期モードの場合はアプリケーション終了する場合は、メール送信できない可能性があります。

下記の情報をご参照ください。　
http://logback.qos.ch/manual/appenders.html#smtpAsynchronousSending
Githubのレビューに使える「gitreflow」を試してみた

皆さん、Githubで楽しいリポジトリ探したりしてますか？

今回はたまたま発見した[gitreflow](https://github.com/reenhanced/gitreflow)がなかなか使えそうだったので、ご紹介いたします！

## gitreflowとは

Reenhancedという会社が作成した、Githubを使ったレビュー操作をCUI上から簡単に行えるGemです.

論より証拠なので、以下使いながら見ていきましょう！

## インストール

まずはインストール作業を行います。

```
$ gem install reflow git_reflow
```

以上、終了！

## 一連の流れ

一連の流れとしては以下の様な感じになります。
・ブランチを作成する。
・コミットしたらPullRequestをmasterに対して投げる
・レビュアーは当該PullRequestに"LGTM"とコメントを付ける
・コメントが付けられたら、masterにPullRequest内容をマージしてブランチを削除

### ブランチを作成する

```
$ git reflow start develop
```

今回はdevelopとしてありますが、ここは何でもいいです。

### コミットしたらPullRequestをmasterに対して投げる

何か適当にコミットしてPullRequestを投げます。

```
$ touch empty.txt
$ git commit -am "test commit"
$ git reflow review
```

`$ git reflow review`後に突然エディターが開きますが、１行目にはPullRequestのタイトルを、２行目以降にはPullRequestの内容を書いてください。

書けて保存したら`Submit pull request?`と聞かれますが、内容を確認して良ければYを入力。
最後にPullRequestをブラウザで確認する？と聞かれるので見たいならYを入力。

### レビュアーは当該PullRequestに"LGTM"とコメントを付ける

次にレビュアーがすることですが、レビュアーはレビュー結果が良ければPullRequestに__LGTM__とコメントします。
これだけ！

### コメントが付けられたら、masterにPullRequest内容をマージしてブランチを削除

コメントが付いていることが確認できたら、PullRequestをmasterにマージします。

```
$ git reflow deliver
```

PullRequestを送った時と同じくエディタが開き、今度はmasterへマージするコミット内容が表示されます。
保存した後に、PullRequest送り元のブランチを削除する？と聞かれるので、削除したい場合はYを入力します。



以上で、一連の流れが終わりました！

このようにほぼCUI完結で終わるので楽ちんです。
今Issuesなどで、LGTMコメントの代わりにLGTM画像が貼られても動くようにしたいなど色々と要望が上がっているのでこれからも目が離せないGemですね！
SIerにおけるDBAのしごと

DBAという言葉は、もっと広い意味をもつとは思うのですが、ここでは、論理的なデータモデルの設計を管理する人という意味合いで使います。データベース上の物理配置やインデックス設計についてはここでは触れません。

## モデルを書く

データモデルの出来は、実際のところ大きくプロジェクトの成否を左右します。

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/0440612a-38e3-00b3-865f-8a4cf1596de5.png)

プロジェクトの失敗理由は、こんなところなイメージです。(3D円グラフについては[こちら  http://qiita.com/kawasima/items/ada35712b70b3ffd9e3f](http://qiita.com/kawasima/items/ada35712b70b3ffd9e3f))

イミュータブルデータモデルは、SIerが欲する一定の手順に沿うことで、一定品質のモデルができることを目指したモデリングの手法です。

[![image](https://qiita-image-store.s3.amazonaws.com/0/8475/875b5440-e2c5-a6cb-e08a-e140691bde20.png)](http://www.slideshare.net/kawasima/ss-40471672)

[イミュータブルデータモデル(入門編)](http://www.slideshare.net/kawasima/ss-40471672) http://www.slideshare.net/kawasima/ss-40471672

ひとことで言うと、「更新日時」をエンティティから排除せよ、ということです。

(続編の世代編もよろしければどうぞ)

[![image](https://qiita-image-store.s3.amazonaws.com/0/8475/7c34020f-5044-2458-6e57-2c8d242be9c8.png)](http://www.slideshare.net/kawasima/ss-44958468)

[イミュータブルデータモデル(世代編)](http://www.slideshare.net/kawasima/ss-44958468) http://www.slideshare.net/kawasima/ss-44958468

SIの現場だと、既存のデータベース設計をどこまで見直すかが難しい判断になりますが、イミュータブルデータモデルは初期構築だけでなく、データ運用や保守でのメリットが大きいので、そこまで含めての費用対効果を算出して、判断するようにしてください。

成果物としてはER図になりますが、[ObjectBrowser ER](http://www.sint.co.jp/products/ober/)を使うと、次の工程が非常に楽になります。ObjectBrowser ERは、ER図フォーマットのEDMファイルが、非常にパースしやすく、ツール作りやすいという点が特に優れていると思います！

## モデルから開発環境をつくる

データモデルができたら、実際に開発環境を作り、各開発者に業務アプリケーションを実装してもらいます。ここで考えなきゃいけないのは、たいていのプロジェクトでは、プログラミング中にも少しずつモデルの変更は入ってくる、ということです。

SIの現場では、数十人〜数百人が同時に開発するわけで、このモデルの変更をいかに安全に素早く開発者の開発環境に反映させるかが、開発進捗に大きく関わってきます。このために開発したツールが[GSP DBAプラグイン](https://github.com/coastland/gsp-dba-maven-plugin) https://github.com/coastland/gsp-dba-maven-plugin です。

GSP DBAプラグインでは、以下のようなことがコマンド一発で可能です。

- DDLを作る
- スキーマを作りDDLを実行する
- Entityクラスを作る
- テスト用データをロードする
- スキーマをExportする

ExportしたスキーマはJarとして、Mavenリポジトリにアップロードします。各開発者は、MavenリポジトリからスキーマJarをダウンロードし、GSP DBAプラグインのimport-shemaを実行すると、自分のローカル環境にDBAが修正した内容が、最速で反映されます。

**テストデータを含むスキーマもバージョン管理**ができるというところが重要で、これが「[私のところでは動いたのですが…](http://hp.vector.co.jp/authors/VA000092/jokes/)」という事件を少なくできます。

GSP DBAプラグインの使用感や使い方は、「[そこ仁](http://syobochim.hatenablog.com)」の記事をご覧いただければ、と思います。
http://syobochim.hatenablog.com/entry/2015/12/12/232318

;; TODO GSP DBAプラグインを使ったExampleプロジェクトを作る

## まとめ

(ダイジェスト的になってしまいましたが…) データモデルの品質やDBAの作業速度が、プロジェクトに与える影響をもっと評価し、そこにリソース投資するようにしましょう、SIerのみなさん！
AWS RDS MySQL のタイムゾーンが UTC の状態で DATETIME フィールドに JST で入れてしまった場合の復旧

アプリは JST でいきたい場合。

# 結論

アプリで、MySQLの現在時刻取得を使っているか調査。NOW(), SYSDATE() など

使ってないなら、おそらく [AWS - RDS(MySQL)でJSTを使う たった１つの冴えたやり方 - Qiita](http://qiita.com/j3tm0t0/items/089ef96ba131df079ca4) この対応でOK。RDSの再起動不要。

使っているなら、UTC で評価されているのが意図したものか調査。

→ JST で処理されていると勘違いしているなら、上記対応の実施でOK 。(今回の僕のケース)

→ 意図していたなら、アプリのコードの修正必要。

# 経緯

Amazon Web Service の RDS で MySQL を使っています。

MySQL 内で、NOW() を実行した時に UTC で返ってきてたので怪しく思い、タイムゾーンを確認。

```mysql
mysql> SHOW VARIABLES LIKE '%time_zone%';
```

|Variable_name|Value|
|:------|:------|
|system_time_zone|UTC|
|time_zone|UTC|

UTC で使ってしまってました。タイムゾーンが UTC にもかかわらず、DATETIMEフィールドに JST で入れてました。あうあう。

現状、どうなっているかというと

### INSERT

|アプリ|→|MySQL|
|:------|:------|:------|
|JST の DATETIME|→|UTC のDATETIME だと思って格納|

### SELECT

|MySQL|→|アプリ|
|:------|:------|:------|
|UTC の DATETIME|→|JST の DATETIME だと思って処理|

MySQL と、アプリ間の通信ではタイムゾーン情報は含まれていないため、お互いに自分のタイムゾーンだと思って処理しており、不整合はありません。日付型に値を入れる際は、NOW() などは使わず、アプリ(フレームワーク,WAF)側で日付文字列を作成して INSERT していましたので、事故にはならなかったのですね。

ただし、SQL に NOW() とか SYSDATE() を書いてしまうと、ひどい目にあいます。

このままだと後々トラブルにもなりそうなので、修正をしてみます。

# 修正方針

MySQL の DATETIME フィールドは、タイムゾーンまでは格納しないようです。

つまり、記録内容の変更はせず、接続時のタイムゾーンだけ JST にしておけば、NOW() などが日本時間で動くように思います。おそらく、実施内容としては **接続時のタイムゾーンを JST にする**。これだけ。

# 調査

まず、MySQL に UTC のまま接続して SELECT。

```mysql
mysql> SELECT id, last_login, SYSDATE(), NOW(), TIMEDIFF(NOW(), last_login)
FROM user_user WHERE id = 8;
```

|id|last_login|SYSDATE()|NOW()|TIMEDIFF(NOW(), last_login)|
|:------|:------|:------|:------|:------|
|8|2015-12-15 13:08:35|2015-12-16 03:04:41|2015-12-16 03:04:41|13:56:06|
次に、セッションのタイムゾーンを JST にして、同じ SQL で SELECT してみます。

```mysql
mysql> SET SESSION time_zone = 'Asia/Tokyo';
mysql> SELECT id, last_login, SYSDATE(), NOW(), TIMEDIFF(NOW(), last_login)
FROM user_user WHERE id = 8;
```

|id|last_login|SYSDATE()|NOW()|TIMEDIFF(NOW(), last_login)|
|:------|:------|:------|:------|:------|
|8|2015-12-15 13:08:35|2015-12-16 12:04:42|2015-12-16 12:04:42|22:56:07|

※ 上の、 UTC での SELECT 結果の 1秒後の 結果です。

タイムゾーンを変えたため、 NOW() の結果は変わっていますが、 user_user テーブルの last_login の結果は**変わりません**。MySQL の DATETIME は、タイムゾーンを格納していないためです。

# 設定

AWS の場合、セッション確立時に自動的に `SET SESSION time_zone = 'Asia/Tokyo';` 相当のSQLを発行するのが定番のようです。(システムのタイムゾーンの変更は実質不可能なため)

[AWS - RDS(MySQL)でJSTを使う たった１つの冴えたやり方 - Qiita](http://qiita.com/j3tm0t0/items/089ef96ba131df079ca4)

こちらの記事が冴えてると思いましたので、採用します。

AWS の RDSダッシュボードより、 パラメータグループ → (選択) → パラメータの編集 → `init_connect` でブラウザを検索。

このテキストエリアに

```mysql
SET SESSION time_zone = CASE WHEN POSITION('rds' IN CURRENT_USER()) = 1 THEN 'UTC' ELSE 'Asia/Tokyo' END;
```

を貼り付け、「変更の保存」をクリック。

(一度、貼り付ける前に間違いがないか確認するため、SQLコンソールなどで実行してみると良いでしょう。)

サービスがオンラインで、RDSもガンガン使われている状態でしたが、メンテするほどでもないと思ったのでえいやっと保存ボタンを押しました。

設定は、RDS の再起動なく即時反映されるため、すぐクライアントを接続しなおして動作確認。

```mysql
mysql> SHOW VARIABLES LIKE '%time_zone%';
```

|Variable_name|Value|
|:------|:------|
|system_time_zone|UTC|
|time_zone|Asia/Tokyo|

```mysql
mysql> SELECT NOW();
```

(結果省略)

良いですね!

これによって、SQL の結果が変化するのは NOW() などの現在時刻関数だけなので、それを使ってない場合アプリは継続して動作します。例えば Django は、通常 MySQL サーバ側の時刻は使用せず、アプリサーバ内で日付文字列を作り、SQL として実行しています。

# まとめ

NOW() 使わないなら MySQLのタイムゾーンはあんまり気にしなくていい
ECCube3　GMOペイメント　決済処理中が残る件



受注一覧に決済処理中が延々残るのはGMOペイメントモジュールの問題
アップデートまでは自分で更新させることにした

~~~sql:GMOPaymentのステータス更新用SQL
 update from dtb_order set status=8 where status=7 and create_date < DATE_add(now(), INTERVAL -20 minute)
~~~


GMOペイメントのクレカ決済タイムアウトが900秒のため、
これ以上のものステータスを8（キャンセル)に移行させることにした。
WordPressのカスタムフィールドを検索する

## 手順

- Advanced Custom Fieldをインストール
- カスタムポストタイプを作る
- カスタムフィールドを準備
- データを入力
- get_postsに meta_queryオプションで検索する

## カスタムポストタイプを作る

```functions.php
<?php
function init_func() {
    register_post_type('book', array(
        'labels' => array(
            'name' => '絵本',
        ),
        'public' => true,
        'has_archive' => true,
        'menu_position' => 5,
    ));
}
add_action('init', 'init_func');
```

## テンプレートを作る

```archive-book.php
<!doctype html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>絵本一覧</title>
    <?php wp_head(); ?>
</head>
<body>
    <h1>絵本一覧</h1>
    <ul>
        <li>絵本の名前（対象年齢）</li>
    </ul>
    <?php wp_footer(); ?>
</body>
</html>
```

## データを表示する（検索なし）
```archive-book.php
...
<ul>
        <?php $books = get_posts(array(
            'post_type' => 'book'
            )); ?>
        <?php foreach ($books as $post): setup_postdata($post); ?>
            <li><?php the_field('bookname'); ?>（<?php the_field('age'); ?>）</li>
        <?php endforeach; wp_reset_postdata(); ?>
</ul>
```

## フォームを作る
```archive-book.php
    <form action="" method="get">
        <input type="text" name="bookname" placeholder="書名" />
        <input type="submit" value="Submit"/>
    </form>
```

## 条件を付け足す
```archive-book.php
            'meta_query' => array(
                array(
                    'key' => 'bookname',
                    'value' => $_REQUEST['bookname'],
                    'compare' => 'like',
                    )
                )
````
Google Feed API 廃止への対応

経緯
---
2015年12月2日頃にGoogle Feed APIが廃止されました。
僕はこれはGoogleの「日本の祝日」カレンダーの情報を取るためにこのAPIを使っていました。
そのため祝日を取得する方法を紹介しているブログの内容は使えなくなってしまいました。
例外なく以業務で前僕が書いた某スクリプトも廃止の影響を受けてしまったので対応しました。
本稿はこの問題にどう対応したのかについてのメモです。

修正パッチ
----
まず先に修正パッチを示します。

### 変更前
```php
$start_time = date("Y-m-d");
$calendar_id = urlencode('japanese__ja@holiday.calendar.google.com');
$url = "https://www.google.com/calendar/feeds/{$calendar_id}/public/basic?start-min={$start_time}&max-results=30&alt=json";
$content = file_get_contents($url);
```

### 変更後
```php
require_once 'class.iCalReader.php';
$a = new ical('https://calendar.google.com/calendar/ical/ja.japanese%23holiday%40group.v.calendar.google.com/public/basic.ics');
$a = $a->events();
```

対策
----
### 取得元を iCal に変更する
1. Googleカレンダーより、「日本の祝日」のカレンダー設定画面を開き、「カレンダーのアドレス」のうち「iCal」をクリックします
1. ポップアップを見るとiCalのURLが判明します

### iCalをPHPで読み込むには
[MartinThoma/ics-parser](https://github.com/MartinThoma/ics-parser)を使いました。`require_once()`で十分ですね。
button_toでgetメソッドを指定しようとしたら手間取った


例えば、hogeコントローラーのnewアクションを実行するボタンを作成し、bootstrapのスタイルを適用させたい場合、最初は

```rb
button_to "新規作成", controller: 'hoge', action: 'new', class: "btn btn-default"
```

上のコードで行けるかと思ったけど、button_toはmethodとしてpostをデフォルトで指定するらしい。かといって、

```rb
button_to "新規作成", controller: 'hoge', action: 'new', method: :get, class: "btn btn-default"
```

こんな感じでmethodを指定してもgetを投げてはくれない。

仕方がないのでlink_toで代用し、色々と試行錯誤した結果、下のようなコードで落ち着いた。

```rb
link_to "新規作成", {controller: 'hoge', action: 'new'}, {class: "btn btn-default", role: "button"}
```

と、思ったらbutton_toでも普通にできました・・・

```rb
button_to "新規作成", {controller: 'hoge', action: 'new'}, {method: :get, class: "btn btn-default"}
```

オプション指定を明示すればよかっただけなのね・・・次からは気を付けたいです。
SpringのBean Validationでエラーメッセージを動的に切り替える。

カスタムバリデーターで、エラーメッセージを動的に切り替えたい場合があります。

たとえば、入力できる漢字をJIS第二水準までに限定するバリデーターを作ったとして、
第三水準の漢字が入力された場合に、エラーメッセージを表示するとします。

その際、エラーメッセージを
『使用できない漢字が含まれています』
ではなく
『「××（←ユーザーが入力した第三水準の漢字）」は使用できない漢字です』
と表示したい、という要望があるかもしれません。


その場合、以下の方法を使えば実現できます。（ConstraintValidatorを実装するカスタムバリデータの場合）

```java

	@Override
	public boolean isValid(String args, ConstraintValidatorContext context) {
	
		String illegalCharacters = getDifficultKanji(args);//←メソッドは、使えない漢字を戻り値にする
		
		if(illegalCharacters != null){
			//使えない漢字が検出された場合
			context.disableDefaultConstraintViolation();
	        context.buildConstraintViolationWithTemplate("「" + illegalCharacters + "」は使用できない漢字です")
	            .addConstraintViolation();
	        return false;

		}
		return true;
	}
```

以上です。
Elastic {ON} Tokyo 2015 に来てみた

# Elastic {ON} Tokyo

+ 2015/12/16 
+ 六本木ヒルズアカデミー

## 会場概要

+ NASA も使ってるよ！って書いてあるだけでテンション上がる

![DSC_0050.JPG](https://qiita-image-store.s3.amazonaws.com/0/11006/464d6dab-0be4-4384-6fad-bcbe7f64f5a6.jpeg)

+ とりあえず来たらまずコーヒー（※基調講演は始まってる）

![DSC_0049.JPG](https://qiita-image-store.s3.amazonaws.com/0/11006/43070d87-76c4-555b-6611-1476d748498a.jpeg)

+ 弁当は今半（無料）

![DSC_0048.JPG](https://qiita-image-store.s3.amazonaws.com/0/11006/68719171-8705-cf8b-0ce5-04c0517f7687.jpeg)

+ 転送はFluentdの人が多いみたいだけど、それlogstashで出来るよ
+ sence, lion, beats が便利そう

# セクシーサーチの事例紹介

## リクルート

+ リクルートはSolrから乗せ換え始めました
+ Solr自体は各サイトで別々に使ってたけど、全社の検索品質を向上させるために検索エンジンをElasticSearchにした
    + Solrだとカスタマイズ性がマズい
+ ElasticSearchのカスタマイズは基盤チームに集約してるみたい

### plugin 機構

+ 独自作成してる
    + 無停止でモジュールの更新を行える仕組み
    + plugin公開してくれ

### snapshot

+ snapshotとrestore-api を用いて、環境を複製してる
+ 実データを使ってアルゴリズムの改善を本番環境以外でやってる

### reindex

+ AWS の特性を活かして、BlueGreenデプロイしてる
+ オンプレではalias を使ってる

### バージョンアップのやり方

+ クラスタを複数用意してサービスを停止せずにやってるよ
+ 切り替える前は同時に書き込む
    + 切り替えたら古い方は破棄

## NAVER

### 前提

+ 色んなプラットフォーム持ってるんだ
    + だから色んなフォーマットのログがあるんだ。。。
+ プラットフォームをまとめてlog を収集・解析してるんだ
    + 旧システムはMySQLなんだ。。。
    + Mergeの部分でボトルネックが発生して、クラッシュした時に数時間後に気づくらしい
    + そして解析用の検索がとても遅い。。。。
+ KAFKAに一旦格納してる
    + 解析システムがクラッシュするかもしれないでしょ？
+ ドキュメントの数は1000億
    + ログは5年保存しなきゃいけないらしい
    + 全てのサービスに対応したいと思ってる
    + 毎日のindexはstormにした
+ 直近7日間はSSD それ以降はHDD にindexするなんていう設定が出来る
    + そう、ElasticSearchならね
    
### 改善点

+ SmallプロジェクトとBigプロジェクトは分けるべき

### リアルタイム通知

+ 開発者に寄って通知が欲しいタイミングが違うが、それを実装するためにElasticSearchを使った

## 日経新聞

+ パフォーマンス
    + エクストララージで秒間9000クエリ
+ kuromojiとngram を活用してます
    + 電子版の記事検索に使ってる
    + 200万件、5GB
    + ピーク時は300件/分の更新
    + Django APIで使ってる
    + redis を利用して同義語展開やサジェスト情報付与
    + analyzedしたものとngram を両方用意してる
    + 転置index を利用してキーフレーズAPI作成した
        + 公開モトム


## 星野リゾート

+ x : 星野リゾートグループ 情報システム
+ ◯ : 星野リゾート グループ情報システム

### ElasticSearch導入まで

+ 経営的にはトップダウンだった（大規模施設運営には適してるので悪い意味ではない）
+ お客様の周りにすべての組織が等間隔の距離で接していると考えている
    + スタッフ全員が経営判断を担う
        + 困ってるお客様に今までやったことないサービスをする場合、上長に判断あおいでたらお客様はいなくなってしまうので
    + サービス業は生産と消費が同時に行われる
+ 経営判断として現場にどんな情報を渡すかがIT部門にかけられたミッション
    + 稼働、生産性、満足度情報をずっととっていた
    + これを見える化
    + 新人スタッフも含めて全員が同じ情報を見るという事を大切に

#### 問題点

+ 既存の仕組みがいけてない
+ KPIの変化についていけない
+ リスク対策による制限がある

### ELKの導入

+ あらゆる経営情報をとにかく貯めて置ける場所
+ 進められた

#### 実例

+ 特定日の予約が入るのは何日前からか等の時傾向、キャンセルの傾向
+ ブッキングの傾向
+ 年で見た場合の日の予約傾向

### QA

+ 無償版を使ってる
    + そろそろ有償版に切り替えようとしてる
    + elastic社のサポート
+ アクセス制御がkibana通常だと出来ないのでpluginをつける予定

## Goldman Sachs

+ 日本に10年いるけどプレゼンは英語でごめんなさい
+ ゴールドマン社でまずパッケージした
    + セキュリティ面確保
    + バックアップツール
    + 金融機関なのでセンシティブにやってるらしい
sqlcmdで任意のフォルダ配下のクエリを実行

```.bat

@echo off

REM DIR_NAME配下のSQL文実行

REM -------初期値設定-----
set SERVER_NAME=hoge\SQLEXPRESS
set DB_NAME=fuga
set USER_NAME=poyo
set PASS_WORD=peyo
set DIR_NAME=D:\HOME\DB\SRC
REM ----------------------


for /R %DIR_NAME% %%a in (*) do (

sqlcmd  -e -S %SERVER_NAME% -d %DB_NAME% -P %PASS_WORD% -U %USER_NAME% -i %%a

)

pause
```
KIFでのテストでキー入力が正しく行われない現象を回避する方法

Xcode7.2+iOS9.2 Simulatorという環境において、KIFでのUIのテストでenterText:intoViewWithAccessibilityLabel:メソッドで入力しようとした文字列とは異なる文字列が入力されてテストが失敗しました。

以下が原因でした。
1. Auto correctによって単語が書き換えられた
2. Auto capitalizeによって頭文字が大文字に書き換えられた
2. 日本語キーボードになっていてアルファベットが日本語変換された
3. ハードウェアキーボードがオンになっていた（Bots環境において）

## Auto correctによる問題への対策

まず、テキストフィールドのAuto correctが不要であればdisableにするといいです。ただ、disableにしたくなかったので、ググったところKIFのキー入力の遅延設定を変更すれば良いとの情報がありました。
テスト実行前に以下のコードで遅延を設定します。

```Swift
KIFTypist.setKeystrokeDelay(0.5)
```

0.5という値はもっと短くしても良いです。短すぎるとAuto correctが発生します。長すぎるとキー入力が遅くなるのでテストの進行に時間がかかるようになります。

## Auto capitalizeによる問題への対策

これもテキストフィールドの設定を変更してしまうと問題はなくなります。また、あたりまえですが文字列の先頭文字を大文字で入力すると回避というか、エラーは発生しません。また英単語ではなく日本語文字列だとCapitalizeされないのでエラーが発生しなくなりました。それ以外の方法は分かりませんでした。

## 日本語キーボードになっている事による問題への対策

方法を検索するとXcodeのSchemeの編集画面のRun->Options->Application LanguageをEnglishに設定すると良いという情報がありましたが、設定しても日本語キーボードになることがあって回避できませんでした。
SimulatorのSettingsアプリで日本語キーボードを削除してもテストを実行してアプリが起動すると日本語キーボードが復活しました。これも駄目です。
環境の設定ではどうにもなりそうにないので、クラスの実装を変更してキーボードを限定してみました。
以下はUIWindowのtextInputModeメソッドをMethod Swizzlingで書き換えています。このコードをテストターゲットに追加します。

```Objective-C
#import <objc/runtime.h>

@interface UIWindow (Testing)
@end

@implementation UIWindow (Testing)

+ (void)load
{
    Method originalMethod = class_getInstanceMethod(self, @selector(textInputMode));
    Method swizzledMethod = class_getInstanceMethod(self, @selector(swizzled_textInputMode));
    method_exchangeImplementations(originalMethod, swizzledMethod);
}

- (UITextInputMode *)swizzled_textInputMode
{
    UITextInputMode *reserve;
    for (UITextInputMode *mode in [UITextInputMode activeInputModes]) {
        reserve = mode;
        if ([mode.primaryLanguage isEqualToString:@"en-US"]) {
            return mode;
        }
    }
    return reserve;
}

@end
```

UIWindowを書き換えればおそらく全ての入力コンポーネントのキーボードを変更できるのではないかと思います。少なくともUITextFieldではtextInputModeをen-USだけにしてキーボードをQwertyにする事ができました。またKIFからの日本語文字列の入力も行う事ができました。

## ハードウェアキーボードの接続がオンになっている問題への対策

これはローカルでは問題になりにくいですが、Botsでのテストの場合では発生するようです。この問題はSimulatorの設定をコマンドで変更する事で回避する事ができます。
以下のコマンドを実行する事でSimulatorを終了してハードウェアキーボードを接続しないように設定を書き換えます。

```
osascript -e 'quit app "Simulator"'
defaults write com.apple.iphonesimulator ConnectHardwareKeyboard 0
```

このコマンドを実行すると、ローカルでのテストはSimulatorの起動が必要になるのでBuild Phasesで実行するよりも、Botsのビルド前に実行するように設定すると良いです。

間違いやより良い方法があればコメントおねがいします。
郷に入りては郷の用語に従え

プログラミングやったり、データベース触ったりしてると「似た概念だが、呼ばれ方が違う」ものが色々ありますよね。

```rb:hash.rb
my_hash = {foo: 1, bar: 2}
```

```js:object.js
var myObject = {foo: 1, bar: 2};
```

```py:dict.py
my_dict = {"foo": 1, "bar": 2}
```

Rubyでは`hash`ですし、JavaScriptでは`object`ですし、Pythonでは`dictionary`なわけです。

データベースの用語でも似たようなことはあるなーと思う今日この頃です。
AWSに gitlab8 CE 構築

まずAWSだとスペック制限うけそうだったので手動でインストールする。
必要な依存関係モジュールはAWSの場合すでに全て入っているようなので割愛

```shell-session
curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo yum install gitlab-ce-8.0.3-ce.1.el6.x86_64
sudo gitlab-ctl reconfigure
```

gitlabはnginxを内包してインストールされる。
起動はサービスで登録されているわけではないみたい。

以下が起動ファイルの設定。sysctl,initにあるからここで読んでいるのではないかと。

```shell-session
[root@git gitlab]# cd /etc/
[root@git etc]# find . | grep gitlab
./yum.repos.d/gitlab_gitlab-ce.repo
./sysctl.d/90-omnibus-gitlab.conf
./init/gitlab-runsvdir.conf
./gitlab
./gitlab/gitlab-secrets.json
./gitlab/gitlab.rb
```

おそらくデータは以下のフォルダ
/var/opt/gitlab/

nginxのコンフィグはおそらくこちら
/var/opt/gitlab/nginx/conf/gitlab-http.conf

※Authかけたい時等
    auth_basic "Restricted";
    auth_basic_user_file /opt/gitlab/.htpasswd;

  location / {
    ## Serve static files from defined root folder.
    ## @gitlab is a named location for the upstream fallback, see below.
    auth_basic "Restricted";
    auth_basic_user_file /opt/gitlab/.htpasswd;
    try_files $uri $uri/index.html $uri.html @gitlab;
  }

エラーがでる。NotFound系結果はシンボリックリンクデータ部に使用しているとだめらしい。これのせいで悩んだ・・・

https://gitlab.com/gitlab-org/gitlab-ce/issues/1716

おれおれ証明書をOKにする場合

git config --global http.sslverify false

無事完成です。
Laravel 環境構築

そういえば一度MACにlaravelを使用と思いインストールしたことがあったのでメモです。

http://qiita.com/kei4eva4/items/2dcda4448be03e5e1bdf

■composerを入れる

```shell-session
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/bin/composer
```

■MCryptを入れる

```shell-session
brew tap homebrew/dupes
brew tap homebrew/versions
brew tap homebrew/homebrew-php
brew install mcrypt php55-mcrypt
```

しかし

```shell-session
brew tap homebrew/dupes
/usr/local/bin/brew: /usr/local/Library/brew.rb: /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby: bad interpreter: No such file or directory
/usr/local/bin/brew: line 26: /usr/local/Library/brew.rb: Undefined error: 0
```

でエラー

yoshimite入れた時に変わったらしい
http://qiita.com/sue738/items/7ab03ecc9f6fcf37408d
を参考にして

/usr/local/Library/brew.rb　を修正。

```rb:brew.rb
1.8->current
#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -W0
↓
#!/System/Library/Frameworks/Ruby.framework/Versions/current/usr/bin/ruby -W0
```

```shell-session
$ brew tap homebrew/dupes
Cloning into '/usr/local/Library/Taps/homebrew-dupes'...
remote: Counting objects: 1662, done.
remote: Total 1662 (delta 0), reused 0 (delta 0), pack-reused 1662
Receiving objects: 100% (1662/1662), 336.48 KiB | 135.00 KiB/s, done.
Resolving deltas: 100% (919/919), done.
Checking connectivity... done.
Warning: Could not tap homebrew/dupes/xar over Homebrew/homebrew/xar
Tapped 39 formula
```

こんどはWarning

mac(Yosemite)のscreenで縦分割の対応されてないらしい。
http://www.neutralworks.com/?p=140
ライブラリのPR が取り込んでもらえなくて悲しい、が、とりあえず自分の修正を適用したい時

# (バグ|機能要望)あった！PR 送った! が、取り込んでもらえなくて悲しい

そんなことってありますよね! (悲)

そんなこともあろうかと、パッケージマネージャーには、Git Repository を指定する技法が整っているので、ひとまず指定して対応するという手もあります。ひとまず、自分の知っている範囲のメモ。

## Ruby (Bundler)

パターン1: git リポジトリ指定 

`gem 'smtpapi',  '~> 0.1.0', git: 'https://github.com/kawahara/smtpapi-ruby.git', branch: 'add-asm_groups_to_display'`

パターン2: github option で指定。(1.8 から利用可能。2015年2月リリース)

以下の方法を使うと、勝手にgitリポジトリURLに展開される。見やすくて良い。

`gem 'smtpapi', '~> 0.1.0', github: 'kawahara/smtpapi-ruby', branch: 'add-asm_groups_to_display'`

参考: http://bundler.io/git.html

## PHP (Composer)

Bundler に比べるとちょっと複雑。ドキュメントによると、svnやMercurial(hg)にも対応している。さらに、pear, pear2 など、他のパッケージマネージャーの参照も可能。なかなか高機能かつ、レガシーにも対応である。

Composer はブランチ/タグ名と、バージョン名が対応付されているシステムのため、特定のブランチ `something` を指定したい場合、`dev-`というプレフィックスを付け`dev-something` というバージョン名を指定する必要がある。

```json
{
    "repositories": [
        {
            "type": "git",
            "url": "https://github.com/kawahara/rws-php-sdk"
        }
    ],
    "require": {
        "rakuten-ws/rws-php-sdk": "dev-master"
    }
}
```

備考: https://getcomposer.org/doc/05-repositories.md

## JavaScript (npm)

`git+` をURL前に付けて指定。`#xxxx` でブランチ名指定。

```json
{
  "dependencies": {
    "express": "git+https://github.com/strongloop/express.git#master"
  }
}
```

備考: https://docs.npmjs.com/files/package.json#git-urls-as-dependencies


## JavaScript (bower)

npm に似たような形式。

```json
{
  "dependencies": {
    "angular": "https://github.com/angular/angular.js.git#v1.5.0-rc.0"
  }
}
```

備考: https://github.com/bower/spec/blob/master/json.md#dependencies


## Java (Gradle)

git-repo プラグインを導入して、参照する。

```groovy:build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath group: 'com.layer', name: 'gradle-git-repo-plugin', version: '2.0.2'
    }
}

apply plugin: 'git-repo'

repositories {
    github("layerhq", "maven-private", "master", "releases")
    git("https://some/clone/url.git", "arbitrary.unique.name", "master", "releases")
}
```

備考: https://github.com/layerhq/gradle-git-repo-plugin
Pythonで出てくるSyntax ErrorとExceptionと簡易対応策をざっくり

#SyntaxError?Exception?
`Syntax Error` - 書いた`script`に問題有り
`Exception` / `value error` - `user`もしくは`user input`に問題有り

##エラー対応策
`Exception`はつきもの。全てのユーザーが必ずしもこちらが指定したルールを守ってくれるとは限らない。ので`while True:`と`try`を使って適当な対応策を作ってみる。

```
while True:
	try:
		number = int(input("what is your favorite number?"))
		print(18/number)
		break
	except valueError: #これでプログラムがErrorを吐かずにすむ
		print("Make sure you enter number")

```

`Zero division Error` - 何か数字を0で割った時に起こるエラー。

```
except Zerodivision Error:
    print("Don't pick zero")
```

もしくは`except: break`で問題が起きた瞬間に切っちゃうこともできるが問題の特定ができなくなるのであまり推奨はされていないようだ。

##追記
[こちら](https://www.youtube.com/watch?v=qS0UkqaYmfU&index=11&list=PL0-84-yl1fUnRuXGFe_F7qSH1LEnn9LkW)でも似たようなエラーの対応策について触れていたので備忘録として追記。

```
def div42by(divideBy):
    try:
        return 42 / divideBy
    except ZeroDivisionError:
        print('Error: You tried to divide by zero.')

print(div42by)(2)) #21
print(div42by)(0)) #Error: You tried to divide by zero.
```

```
print('How many cats do you have?')
numCats = input()
try:
	if int(numCats) >= 4:
		print('that is a lot of cats')
	else:
		print('that is not that many cats')
except ValueError:
	print('you did not enter a number')
```
ownCloud で PostgreSQL 9.6 を利用したセットアップについて

ownCloud で利用されるデータベースは、MySQLの場合が多いのですが PostgreSQL でも動きます。
ownCloud 8.2.1 と CentOS-7 に php7.0 と PostgreSQL 9.4, nginx 1.9.9 という構成でチャレンジしてみます。

記載が遅くなっててすみません。
ストックしておいてもらえれば、更新時に変更通知を送ります。
よろしくお願いいたします。
Rのパッケージまとめ～これだけはインストールしておくと便利というものを厳選

Rには豊富な外部パッケージがあり、それらを使うことで
より大きなデータ（「ビッグデータ」ではないが）や新しい手法を扱えるようになる。

パッケージを知っているのと知らないのとで分析作業効率に雲泥の差がある一方で、
パッケージ数は多く、同じような目的のパッケージが複数ある。
日本語で詳細に説明されたものも少ない。

単純な日本語訳は
http://www.trifields.jp/statistical-analysis-r-cran-packages-341

にある（ありがたい！）が、
よく使うもの、この目的・手法ではこれがいいのではないかというものを目的別に分類して厳選してみた。

以下に記載のないものはデフォルトで組み込まれているか、以下のパッケージが自動で使用する（依存関係）パッケージである。

- data.table系 → {data.table}
- sparse matrix系 → {Matrix}, {qlcMatrix}（Matrixに対する便利なメソッド）
- cross validation → {caret}
- 文字列処理 → {stringr}
- 便利な記法、文法
    - 巨大な整数値 → {bit64}
    - パイプ → {magrittr}
- 便利な機能
    - 作図 → {ggplot2}, {Deducer}（R全体のGUIを提供しているが、特にggplot2を使った可視化のGUIが優れている）
    - 集計 → {reshape2}
- クラスタリング系 → {proxy}（距離行列の生成）
    - fuzzy c-means → {e1071}
- 数理モデル
    - GLMの拡張 → {mlogit}（多項ロジット）, {survival}（生存時間解析）, {glmnet}（L1L2正則化）
    - Overdispersion対策 → {MASS}（`glm.nb`）, {pscl}（ゼロ切断／ゼロ過剰モデル）, {AER}（`dispersiontest`）
    - 混合分布モデル → {mclust}（正規分布）, {flexmix}（その他の分布）
    - 時系列 → {xts}（扱いやすい時系列データ形式を提供）, {forecast}
    - 状態空間モデル → {dlm}（正規分布）, {KFAS}（その他の分布）
- その他の手法
    - 決定木 → {rpart}, {ranger}
    - SVM → {kernlab}（`ksvm`）
    - 協調フィルタリング → {recommenderlab}
    - アソシエーションルール → {arules}, {arulesViz}（arulesの可視化）
- 開発 → {Rcpp}, {devtools}
- データインポート
    - Webからダウンロード → {curl}
    - PostgreSQL → {RPostgreSQL}
    - ODBC → {RODBC}
    - Google BigQuery → {bigrquery}（ただし大きなデータはcurlがエラーを出して取得できない）
- 分散処理
    - {snowfall}
    - {pforeach}（並列処理を簡単に実装→CRANにないので`devtools::install_github("hoxo-m/pforeach")`）
    - {multidplyr}（dplyrを並列処理→CRANにないので`devtools::install_github("hadley/multidplyr")`）

※参考

R以外のツール

- 階層ベイズモデル → 外部ツール（Stan, WinBUGS）

今後追記、厳選して精度を上げていく予定です。
Python Variable Scope (Global and Local), and its lifetime

#Global and Local vars. in function

##basics

作った変数が関数の外であってもその関数の上で宣言されていればその変数にはアクセス可能

```
x = 1
def k():
    print(x)
k() # 1
```

「中は中、外は外」といったところでしょうか。

```
def k():
    t = "I love Tokio"
    print(t)

t = "I love Osaka"

k() #I love Tokio 
print(t) #I love Osaka
```

白黒はっきりさせたいのが`python`だそうです。

```
#スクリプト#1
 
>>> def k():
...     print(t)
...     t = "I love Tokio"
...     print(t)

>>> t = "I love Osaka"
>>> k() # Error 
>>> print(t) # I love Osaka
```

もし関数内で`global`と`local`ではっきりさせたいのであれば、`global var`と先に宣言する。基本的に関数内で作られた変数は`local`

```
#スクリプト#2

def k():
    global t
    print(t)
    t = "I love Tokio"
    print(t)

t = "I love Osaka"
k() # I love Osaka I love Tokio
print(t) # I love Tokio
```
スクリプト#1のように`global`宣言しないと`print(t)`は`global var.`である`I love Osaka`を持ってくるのに対して、宣言を行った真上のスクリプトでは`print(t)`は`local var.`である`I love Tokio`になっている。

```
def k():
    s = "I love Tokio"
    print(s)

k() # I love Tokio
print(s) # Error
```
`Local var.`は関数の外から持ってこれない。

##Pop quiz
それぞれの変数の値は何になるでしょうか？答えは[ここ](http://www.python-course.eu/python3_global_vs_local_variables.php)。

```
def foo(x, y):
    global a
    a = 42
    x,y = y,x
    b = 33
    b = 17
    c = 100
    print(a,b,x,y)

a,b,x,y = 1,15,3,4
foo(17,4)
print(a,b,x,y)
```

ちなみに

```
#スクリプトa

def foo(x, y):
    global a
    a = 42
    x,y = y,x
    b = 33
    b = 17
    c = 100
    print(a,b,x,y)

a,b,x,y = 1,15,3,4
foo(17,4)
print(a,b,x,y)
```

と

```
#スクリプトb

def foo(x, y):
    global a
    a = 42
    x,y = y,x
    b = 33
    b = 17
    c = 100
    print(a,b,x,y)

a,b,x,y = 1,15,3,4
print(a,b,x,y)
```

では`print(a,b,x,y)`の結果が若干異なる。スクリプトaでは`foo`関数を読んでいるため`a`が`global`宣言され`42`という数値を渡されている。スクリプトbではその関数を呼ばないため`a`は`1`のまま。

#追記

[Pythonのデコレータを理解するための12Step](http://qiita.com/_rdtr/items/d3bc1a8d4b7eb375c368#2-11)を[decoratorについて調べていたら]()偶然見かけたので一応。

```
>>> text = "I am global!"
>>> def foo():
...     text = "I am local!" #2
...     print locals()
...
>>> foo()
{'text': 'I am local!'}
>>> text
'I am global!'
```

>
_oo()が呼ばれた時にはtextの内容として関数内で代入した値がセットされていますが, 外側のグローバル変数のtextの値は変わっていません. #2では実際のところグローバル変数を探しに行かず, 関数foo内に新しいローカル変数textが作られているのです.
つまり関数の内側ではグローバル変数は参照はできるものの代入はできない, ということになります。_

#変数のライフタイム

[また上と同じ記事](http://qiita.com/_rdtr/items/d3bc1a8d4b7eb375c368#2-11)の引用だがライフタイムについては全く認識がなかったので引用させていただくことにした。

>
```
>>> def foo():
...     x = 1
...
>>> foo()
>>> print x #1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
```
_ここでエラーが起こっているのは, 上述のスコープの問題だけではありません. 名前空間は関数fooが呼ばれる都度作られ, 処理が終わると無くなってしまいます.つまり上の例では#1のタイミングでは文字通りxという変数はどこにも存在していない, ということです._

引用がちょっと多めな投稿になってしまいました。。
c++ builder XE4, 10.2 Tokyo > 子フォームが閉じられたのを親が知るための実装

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

親(Form1)がインスタンス作成した子フォーム(Form2)がある時、子フォーム側でクローズ処理をした後で親がそのフォームが閉じられたかどうか知る方法を考えてみた。

Form1以外の親でも使えるようにするため、子フォームで親のヘッダファイル(Form1.hなど)をincludeしないという前提。

## Form2でIsClosed()を用意

```Unit2.cpp
__fastcall TForm2::TForm2(TComponent* Owner)
	: TForm(Owner)
{
	m_closed = false;
}
bool __fastcall TForm2::IsClosed()
{
    return m_closed;
}
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
	m_closed = true;
}
```

Form2が閉じられた時にm_closedをtrueにしておいて、IsClosed()で親が確認するとした。

```Unit1.cpp
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	m_forms[0] = NULL;
	m_forms[1] = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_createClick(TObject *Sender)
{
	m_forms[0] = new TForm2(this);
	m_forms[1] = new TForm2(this);

	m_forms[0]->Show();
	m_forms[1]->Show();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_checkClick(TObject *Sender)
{
	TForm2 *formPtr;

	for(int idx=0; idx < 2; idx++) {
		formPtr = m_forms[idx];
		if (formPtr == NULL) {
			continue;
		}

		bool isClosed = formPtr->IsClosed();
		String msg3 = L"IsClosed: " + BoolToStr(isClosed);
		OutputDebugString(msg3.c_str());

		if (isClosed) {
			m_forms[idx]->Free();
			m_forms[idx] = NULL;
		}

	}
}
//---------------------------------------------------------------------------
```


### 検索用キーワード
(2018-11-05 追記)

- ゾンビ
- ゾンビプロセス
Drupal でモジュールを追加したらシステムが壊れちゃったとき

先日の[Drupal Advent Calendar](http://qiita.com/advent-calendar/2015/drupal)  で「[Drupal8で認証付きの勉強会サイトを作ってみる](http://qiita.com/nkawa/items/3bb10d8ed3683e296caf)」を書いたのですが、その際、実は、いろいろとハマリました。
せっかくなので、メモとして残しておきます。

まず、アクセス権限関係。今回 Node Access と ACL モジュールを使ったのですが、設定中にエラーがでて、正しく設定できなくなってしまいました。Drupal はデータベース上にいろいろと依存関係が残るため、設定の方法をミスったりすると（かつ、Moduleにバグがあると）元に戻せなくなってしまうことがあるのです。

直すためには、全部スクラッチからインストールしなきゃいけないかな、とも思ったのですが、ふと思い立って、モジュールだけをアンインストール→インストール、してみました。

すると、スッキリ！直ってしまいました。

ということで、もし、モジュールの設定ではまったら、アンインストール →　インストールはお勧めです！

ちなみにメニューは「機能拡張」から、タブの「アンインストール」です。最初見つからなくて焦りました。
RubyMine 8の自分用設定

# はじめに
RubyMineはメジャーアップデートすると、過去の設定で消え去るものが多くあるので、再度設定した項目をここに示す。

## 使用メモリの設定がUPDATEするたびに消えるので書き換える
元々こうなっている

```
-Xms128m
-Xmx512m
-XX:MaxPermSize=250m
-XX:+UseCompressedOops
```


これに書き換える

```
/Applications/RubyMine.app/Contents/bin % cat rubymine.vmoptions 
-Xms1024m
-Xmx2048m
-XX:MaxPermSize=250m
-XX:+UseCompressedOops
```

* [What is the best memory config for RubyMine? - coderberry](http://coderberry.me/blog/2013/02/20/rubymine-memory-config-vmoptions/)
* [RubyMine にメモリをたくさん割り当てる - Qiita](http://qiita.com/nappa/items/b4a6f026f0f69a3522de)


## ESLintが無効になってしまったので有効にする
* [RubyMineでeslint - Qiita](http://qiita.com/shingo-nakanishi/items/35f627f58c377cf58787#rubymine%E3%81%AE%E8%A8%AD%E5%AE%9A)

JSに限ってはESLintを使うので、InspectionsもESLintだけチェックが入るようにする。

![Screen Shot 2015-12-16 at 11.09.44 AM.png](https://qiita-image-store.s3.amazonaws.com/0/27895/5e82a607-64d0-ac87-f312-a49c74d72dba.png)

## 消えたプラグインを入れなおし
### RuboCop
プラグインを入れなおしたら、InspectionsもRuboCopだけにしてしまえばよいので、RailsとRuboCop以外をRubyの対象から外す。
![Screen Shot 2015-12-16 at 11.35.29 AM.png](https://qiita-image-store.s3.amazonaws.com/0/27895/fa104fc2-7657-5d6b-0e02-34de0282351f.png)


* [RubyMineとRuboCopを連携させる - Qiita](http://qiita.com/norikt/items/bd15774537dc51f160bc)
R MarkdownでRチャンクと数式を組み合わせる

## この記事の目的
私が大好きなRMarkdownについて、Tipsを集中的に連載しようという思いつきの企画です。あと自分の中で進めている別企画のメモという位置づけでもあります。なので**大した中身はありません**。

### R Markdownとは
Markdown記法をベースに、チャンクという形でRのコードを記述して評価・出力することができるものです。RStudioのクイックリファレンスでは以下のように説明してあります:

> R Markdown is an easy-to-write plain text format for creating dynamic documents and reports. 

## R Markdownで数式
R Markdownで数式を表現するには、`$`を利用します。文章中に数式を組み込みたい時は、`$\lambda=0.3$`のように、`$`で挟みこめばOKです。まとまった数式を表現したければ、以下のように設定します:

```
$$
y_{i}=ax_{i}+b
$$
```

なお、数式の記述方法はTexそのままですので、そちらを参照してください。

## 数式内にRで評価した結果を表示したい
よくあるのが、「Rで出力した値を数式にそのまま流し込みたい」という要望です。実はこれも簡単にできます。例えば、Rmdファイルに以下のように記述します(Rチャンクの\は無視してください):

```
\```{r}
hoge <- 1.2+4
\```

$$
y = `r hoge`x+3
$$
```

このようにすると、$y=5.2x+3$と出力されます。つまり値を持ってくることができるんですね。これさえ掴んでおけば、あとは色々と応用がきくかと思います。ぜひ活用して、ドキュメント生成をがんばってください。

Enjoy!
Material Design Liteが動作しない場合の対処


## 現象
動的に追加した要素に対して、Material Design Liteが正しく反映されない
(厳密には、material.min.js読み込み後に追加された要素に対して反映されない)

## 例
適当なファイルに以下のテキストを保存して開いてみると、HTMLに直接記述されているText Fieldはきちんと動くが、onloadの後にjavascriptで追加されているText Fieldは動作していないことが確認できる

```html:
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" href="https://storage.googleapis.com/code.getmdl.io/1.0.6/material.indigo-pink.min.css">
    <script src="https://storage.googleapis.com/code.getmdl.io/1.0.6/material.min.js"></script>
    <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
    <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
  </head>
  <body>
    <!-- 正常に動作するMaterial Design Lite要素 -->
    <div class="mdl-textfield mdl-js-textfield">
      <input class="mdl-textfield__input" type="text" id="sample1">
      <label class="mdl-textfield__label" for="sample1">Valid Text Field...</label>
    </div>

    <!-- 正常に動作しないMaterial Design Lite要素 -->
    <div id='invalid-textfield-container'></div>
  </body>

  <!-- JavascriptでMaterial Design Lite要素を追加 -->
  <script type="text/javascript">
    $(window).load(function() {
      $('#invalid-textfield-container').html('\
          <div class="mdl-textfield mdl-js-textfield">\n\
            <input class="mdl-textfield__input" type="text" id="sample1">\n\
            <label class="mdl-textfield__label" for="sample1">Invalid Text Field...</label>\n\
          </div>\n\
          ');
    });
  </script>
</html>
```

## 原因
material.min.js読み込み時に、各Material Design Lite要素に対して初期化処理を行っているが、読み込み後に追加されたComponentに対しては行われないため

## 対策
要素追加後に**componentHandler.upgradeDom()**や**componentHandler.upgradeElement()**を呼び出して初期化処理を行う
carrierwaveでバリデーション失敗後に画像を保持するときの覚書


## 概要
input type="file"のは初期値の設定ができないのでにバリデーション失敗後の考慮が面倒ですよね？
ただ、アップローダーにcarrierwaveを使っている場合は非常に楽に実装ができます

## 解説
画像アップロード時に{column_name}_cacheという名前でhidden_fieldをプラスしてあげればOKです.

view

```
= form_for @hogehoge |form|

  // 値がセットされている場合は画像を表示
  = image_tag @hogehoge.hogehoge_image.url if @hogehoge.hogehoge_image.present?
  = f.file_field :hogehoge_image
  // 値の保持
  = f.hidden_field :hogehoge_image_cache
  = f.submit

```

cacheのディレクトリも任意で設定可能

```
class HogeImageUploader < CarrierWave::Uploader::Base

....省略
  # cacheでアップロードする画像の設定
  def cache_dir
    "cache"
  end
end
```

cacheをS3にアップロード(fog)
cache_storageはCarrierWaveのgem versionが古いと
no methodエラーになるので注意

```config/initializers/carrierwave.rb
CarrierWave.configure do |config|

   ....省略
  config.cache_storage = :fog
end
```


## 参考
carrierwaveuploader/carrierwave
https://github.com/carrierwaveuploader/carrierwave


HTML input要素
http://www.ne.jp/asahi/hishidama/home/tech/web/html/input.html
Windows 10 の SSD インストールで落とし罠各種

Windows 10 の SSD 換装で多様な落とし罠に翻弄されたので愛憎こめて対処内容を公知する。

# 事前状態
* Windows 7 プリインストールノートパソコンを所持（2012年度版）
* Windows 7 → 8 → 8.1 → 10 とアップグレード済み。
* Windows 10 になってからのプロダクトキーは確認していない。
* その後 SSD に換装。移行には「[EASEUS Disk Copy](https://jp.easeus.com/disk-copy/home-edition/)」を使用。
* 同じPCを使用するユーザーを「家族アカウント」に招待済み。

# 事象
Windows 10 メジャーアップデートバージョン1511（ビルド10586）適用後、起動エラー「0xc000000f」となる。
ブートセクタが壊れており、回復コンソールからの ``command: bootrec /fixmbr, bootrec /fixboot `` や、[TestDisk](http://www.cgsecurity.org/wiki/TestDisk_Download) でもリカバリできない。

# 原因
[reddit の投稿](https://www.reddit.com/r/techsupport/comments/3fk6sx/windows_10_upgrade_failure_error_code_0xc000000f/)によると、SSD にするならクリーンインストールしろ、とのこと。
Windows 10 のメジャーバージョンアップのタイミングで発覚したのは、SSD 換装時にディスクコピーしたためで、単に地雷化していた。
データはクラウドや別パーティションに退避済みだったので再インストールすることにした。

## 落とし罠１：Windows 10 のプロダクトキー確認
実は Windows 10 にアップグレードするとプロダクトキーは置き換わる（メーカ版でも、Windows 8 購入版でもなくなる）。Windows 10 のクリーンインストールのためにはこのプロダクトキーが必要だ。

手持ちのメディアは下記の通り

1. （Win7）メーカリカバリメディア
1. （Win8）アップグレード版メディア
1. （Win10）MS提供ISO

このPCは既に機器情報込みで MS 側にアクティベーションされているわけだが、すでにプロダクトキーは参照することができない。
仕方ないから Windows 7 からしこしことアップグレードインストールする。SSD では Windows 10 のインストールが失敗するため、一度 HDD で Windows 10 まで更新後にプロダクトキーを確認する必要がある。

プロダクトキーさえ確認すればもう HDD に用はない。SSD に乗せ換え、Window 10 をクリーンインストールする。

（15:54 追記）
最新の ISO では Windows 7,8 のプロダクトキーでアクティベーション可能です！
[あと一日はやく捕捉したかった](http://solomon-review.net/windows10-build10586-release/) 。情弱乙。

## 落とし罠２：家族アカウントへの切り替え
Microsoft アカウントでログインしてしまうと、ユーザーフォルダ名をコントロールすることができない。Windows 8 だと日本語ユーザー名になってしまうが、Windows 10 ではメールアドレスのユーザー部分になる（適宜省略される）。
いずれにせよフォルダ名は指定したい。その場合「ローカルアカウント」を作成後、「Microsoft アカウント」に切り替えることでフォルダ名が持ち越される。

ところが、家族アカウントとして招待済みの場合、上記手順を行うと「問題が発生しました」と表示されて何もできない。この場合一度家族アカウントの招待を削除する必要がある。

1. 家族アカウントの招待を削除
1. ローカルアカウントを任意の名前で作成（特に管理者権限などは不要）
1. ローカルアカウントを Microsoft アカウントに切替
1. 改めて家族アカウントに招待

# まとめ
* SSD 換装するならクリーンインストール
* Windows 10 アップグレード後はプロダクトキーを確認しておこう
CS-Cart: CSRF対策のsecurity_hashを取得するAPI

CS-CartでCSRF対策に用いられる`security_hash`の取得方法。

```php:PHP
fn_generate_security_hash();
```

```smarty:Smarty
{""|fn_generate_security_hash}
```

```js:JavaScript
Tygh.security_hash
```

`fn_generate_security_hash`の実装を見る限り、CSRFトークンは使い捨てのワンタイムトークンではなく、セッションごとに作られる。つまり、セッション単位なら使い回しが可能。
jqGridの小技たち2

業務で使っているのですが、毎回忘れるのでメモ。
基本的なことなんですがねぇ。。。

# バージョン
- jquery：2.1.1
- jquery-ui：1.11.1
- jqGrid：4.6.0

# データをクリアする
あくまでデータのクリアです。

```testGrid.js
    $("#list").clearGridData();
```

ヘッダをいじっている場合は上記では足りないので、一度削除して追加する必要あり。

```testGrid.js
    $("#gbox_list").remove();
    $("#list_parent").append('<table id="list" class="scroll"></table>');
    // このあとグリッド作成処理
```



# 複数テーブルある場合の表示切替
あまりないかもしれませんが、複数テーブルを同じ表示エリアにボタンで表示を切り替える場合です。

```testGrid.js
    // 非表示にする
    $('#list1').hide();
    $('#gbox_list1').hide();

    // 表示する
    $('#list2').show();
    $('#gbox_list2').show();
```

一度初期化してテーブルを作成するとidがgbox_***の要素として展開されるので、こう指定しないとうまくいきませんでした。

# リストの角を丸くする
とてもとても些細なことですが、一応気になる方向けに。

```testGrid.js
    gridComplete: function () {
        $('#gview_list>.ui-state-default').addClass('ui-corner-top');
    },
```

# datatype:localの際に正しくソートされない
なんでやねん！という状況になったので。
`sortName:***`では値が数字の列を指定しているのですが、なぜかstringでソートされているようだった。
例）
正しいソート）1, 2, 4, 6, 10, 16, 26
誤ったソート）1, 10, 2, 26, 4, 6

解決策としては、sortNameで指定している列定義に`sorttype: 'int'`と指定してあげればOK。

```testGrid.js
    { name: 'disp_id', index: 'disp_id', width: 50, align: 'center', hidden: false, sorttype: 'int' }, // 表示ID
```

localは滅多に使用しないからいろいろあるな。
CS-Cart: コントローラにPOSTするために最低限必要なリクエスト

CS-Cartは素のリクエストを受付けてくれない。

最低限必要なリクエストは下記。

* CookieヘッダにセッションID
* User-Agentヘッダ(適当なUAは弾かれる)
* security_hashフィールド(CSRF対策)

httpieで実行するときはこんなかんじになる。

```
http -v --form POST \
  'http://192.168.11.11/admin.php?dispatch=my_ctrl.update' \
  'Cookie:sid_customer_9f4c6=3333174db903ac2d5bd028c55ffd93cb_C; sid_vendor_9f4c6=a2ad5a7003376cebaaf43c4ffd5a2c4c_A; sid_admin_9f4c6=7e85cc5d2ff6643cabe44e2f4cdb8837_A' \
  'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36' \
  security_hash=e22edad2e566eb7bec472ca5b05648ff
```

jQueryのAjaxならこんなかんじ。

```js
$.post('http://192.168.11.11/admin.php?dispatch=my_ctrl.update', {security_hash: Tygh.security_hash});
```

## 関連

[CS-Cart: CSRF対策のsecurity_hashを取得するAPI - Qiita](http://qiita.com/suin/items/2b553643ac798f5bcda2)
FuelPHP 勉強中３ 実テーブルからモデルを作成する方法

リバース・エンジニアリングのしかた。自分で作ろうかと思ったけどすでにありました。
でもDBに「_」があるとその単位でフォルダができる。自分的にはそのままファイル名がよかったんだけど、あとで考える。

```shell-session
oil refine fromdb:model --all
```

[参考]:http://madroom-project.blogspot.jp/2013/01/fuelphp15fromdbscaffoldmodel.html
ReactNative 初期設定



# 初期設定

2015/12/15現在の内容に即してインストールします。

[Getting Started – React Native | A framework for building native apps using React](https://facebook.github.io/react-native/docs/getting-started.html#content)

# インストール

#### 1. nvmインストール

Node Version Manager、つまりnode.jsのバージョン管理ツールです。これを使ってnode.jsをインストールします。
[creationix/nvm](https://github.com/creationix/nvm)

```
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash
$ source ~/.bash_profile
$ nvm -v
0.29.0
```

#### 2. node.jsインストール

node.jsをインストールします。

```
$ nvm install node && nvm alias default node
$ node -v
v5.2.0
```

#### 3. npm2インストール

npm（Node Package Manager）はnode.jsのモジュールをインストールするときに使いますが、Facebookによるとnpm2がオススメとのことでダウングレードします。

> If you are using Node 5.0 or newer, we recommend installing npm 2, which is much faster than npm 3. After installing Node, run npm install -g npm@2.

[Getting Started – React Native | A framework for building native apps using React](https://facebook.github.io/react-native/docs/getting-started.html#content)より

```
$ npm install -g npm@2
```

#### 4. watchman＆flowインストール

* [facebook/watchman](https://github.com/facebook/watchman) - ファイルの更新監視をするツール。node.jsのファイル監視関係バグを回避するために、インストール推奨とのこと。

* [Flow | Flow | A static type checker for JavaScript](http://flowtype.org/) - javascriptの静的解析ツール。必要な人はインストール。

``` 
$ brew update && brew upgrade
$ brew install watchman
$ brew install flow
```

# プロジェクトの作成

コマンドラインで初期化する。
"AwesomeProject"というプロジェクトを作成してみる。

```
$ npm install -g react-native-cli
$ react-native init AwesomeProject
```

AwesomeProject/iosとAwesomeProject/androidの中身をビルドすればサンプルプロジェクトが起動します！

#### iOS

![reactnative_ios.png](https://qiita-image-store.s3.amazonaws.com/0/38775/d9f4e125-34c2-dc61-b19d-249bf4c78d5d.png "reactnative_ios.png")

#### Android

![reactnative_android.png](https://qiita-image-store.s3.amazonaws.com/0/38775/05b6882b-7dba-fa39-4748-d6cf0e2dc84a.png "reactnative_android.png")
minilispのevalを解説する

ruiさんの[minilisp](https://github.com/rui314/minilisp/tree/nogc)の評価器のところを勝手に解説します。
対象読者はタイムインターメディアの社内勉強会のメンバーですが誰かの役に立つかもしれないと思い公開します。

https://github.com/rui314/minilisp/blob/nogc/minilisp.c#L352 からがevaluatorです。

```c
static Obj *eval(Obj *env, Obj *obj);
```
evalを構成する関数の中でevalを使うためにプロトタイプ宣言しておきます。

```c
static void add_variable(Obj *env, Obj *sym, Obj *val) {
    env->vars = acons(sym, val, env->vars);
}
```
envは環境フレームで、上位の環境(`up`)と、自分自身が持っている変数(`vars`)との組になっています。
`add_variable`は`vars`に変数を追加します。`vars`はalistになっています。
変数の追加は単に今までの`vars`にaconsした結果を新しい`vars`にするだけです。

```c
// Returns a newly created environment frame.
static Obj *push_env(Obj *env, Obj *vars, Obj *values) {
    if (list_length(vars) != list_length(values))
        error("Cannot apply function: number of argument does not match");
    Obj *map = Nil;
    for (Obj *p = vars, *q = values; p != Nil; p = p->cdr, q = q->cdr) {
        Obj *sym = p->car;
        Obj *val = q->car;
        map = acons(sym, val, map);
    }
    return make_env(map, env);
}
```

これは環境フレームを作る関数ですが、関数呼び出し処理の一部です。ちょっとここで環境フレームとスコープについての解説。

環境フレームが作られる時というのはつまりスコープが作られる時ということになります。馴染みのあるschemeの例だとlambdaとlet系の構文がスコープを作っています。letは意味的には

```scm
(let ((x a)
      (y b))
  body...)
;;↓
((lambda (x y) body...) a b)
```

のように解釈できます。xとyが定義される環境は関数が実際に呼び出されて、関数のbody部分に来たときに新しく発生しているわけです。つまり、lambdaこそがスコープを作る構文ということになります。

これを踏まえて、push_envが何をしているか見ていきます。まず引数の`vars`というのは関数のパラメータで(xとy)、`values`は実引数です(aとb)。最初のエラーチェックは関数適用ができるかどうかの引数の個数チェックです。
次のfor文は`vars`と`values`をzipしてalistを作っています(変数map)。
最後に上位環境とこのmapを使って、新しい環境を作れば、めでたく関数本体を実行するときに使う環境が完成です。

続く