OmniAICreator/Qiita-1.07M huggingface dataset:
bundle install しようとしたら ruby のバージョン違くてコケた話

# `bundle install` できない！

久しぶりにデプロイしようとしたらまず `bundle install` しろと怒られました。
しぶしぶ `bundle install` した結果・・・

```console
$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/........
Fetching version metadata from https://rubygems.org/..
Using rake 10.3.2
Using i18n 0.6.11
Using minitest 4.7.5
Using multi_json 1.9.0
Using atomic 1.1.15
Using thread_safe 0.2.0
Using tzinfo 0.3.39

Gem::InstallError: activesupport requires Ruby version >= 1.9.3.
An error occurred while installing activesupport (4.0.3), and Bundler cannot continue.
Make sure that `gem install activesupport -v '4.0.3'` succeeds before bundling.
```

コケた！こないだまで大丈夫だったのに！
開発環境でも `bundle install` できてたのですが、デプロイ用のサーバ上でやるとコケる・・・これはいかに。

# 原因は？

こないだ追加した `gem` がダメだったのか、それとも何かバージョンが上がったのか、とか妄想を巡らせたのにダメ。
ruby のバージョンも問題なし。

```console
$ ruby -v
ruby 2.0.0p481 (2014-05-08 revision 45883) [x86_64-linux]
```

そういえばこのサーバは `rbenv` で ruby のバージョンいじってました。

```console
$ cd ~
$ rbenv versions
* system
  2.0.0-p481 (set by /home/user/.rbenv/version)
$ cd /path/to/app
$ rbenv versions
  system
* 2.0.0-p481 (set by /path/to/app/.ruby-version)
```

ぐぬぬ。
となると、bundle が使ってる ruby が違うのでは・・・？

```console
$ which ruby 
~/.rbenv/shims/ruby  # rbenv の ruby
$ which bundle
/usr/bin/bundle # グローバル！
```

それだ！！

# という訳で解決方法

ローカル ruby で `bundle` を使えるようにします。

```console
$ cd /path/to/app
$ rbenv exec gem install bundler
Fetching: bundler-1.10.3.gem (100%)
Successfully installed bundler-1.10.3
Parsing documentation for bundler-1.10.3
Installing ri documentation for bundler-1.10.3
1 gem installed
$ rbenv rehash # 忘れずに！
$ which bundle
~/.rbenv/shims/bundle
```

おお、ようやく来ました。という訳で気を取り直してもう一度。

```console
$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/........
Fetching version metadata from https://rubygems.org/..
Using rake 10.3.2
Using i18n 0.6.11
Using minitest 4.7.5
Using multi_json 1.9.0
Using atomic 1.1.15
Using thread_safe 0.2.0
Using tzinfo 0.3.39
...（中略）...
Using bundler 1.10.3
Bundle complete! 15 Gemfile dependencies, 45 gems now installed.
Bundled gems are installed into ./vendor/bundle.
```

やっと正常にインストールできました。めでたし。
php便利関数

phpの便利関数を紹介します。
phpのバージョンは5.5以上を想定しています。

## array_column
それぞれの配列から任意の連想配列を取り出します。

よくこんな配列ありますよね。

```php
$user_data = [
  0 => [
    'id'         => 100,
    'name'       => '太郎',
    'created_at' => '2015/01/01'
  ],
  1 => [
    'id'         => 101,
    'name'       => '花子',
    'created_at' => '2015/01/02'
  ]
  // ...
];
```

こんな感じの配列はDBからデータを取得するときよくあります。

 * idだけ取りたい場合

```php
array_column($user_data, 'id');

// => [
//     0 => 100,
//     1 => 101
// ] 
```
こんな感じに取り出してくれるので、in_array()なんかで判定するにも便利ですね。

* idがkeyのnameを取りたい場合

```php
array_column($user_data, 'name', 'id')
// => [
//   100 => '太郎',
//   101 => '花子',
// ]
```
こんな感じにidをkeyでnameを取得出来ました。
更にnameだけじゃなくて全部とりたいよ～ドラえも～んといった場合は、

```php
array_column($user_data, null, 'id');
//  100 => [
//    'id'         => 100,
//    'name'       => '太郎',
//    'created_at' => '2015/01/01'
//  ],
//  101 => [
//    'id'         => 101,
//   'name'       => '花子',
//    'created_at' => '2015/01/02'
//  ]
```

こんな感じに全部取れます!
array_columnなしで行おうとするとforeach使ったり結構めんどくさいので、おすすめです!

##array_walk
これ、要するにforeachをcallback使ってできますよ、という関数です。

```php
foreach($data as $key => $value) {
 //...
}

array_walk($data, function($value, $key) {
  //...
});
```
array_walkのメリットとしては
1. 無名関数を利用しているので、外のスコープを汚さない
~~2. 処理速度が早い~~(foreachの方が速い)
です!

配列の中身を変えたい場合は、上記でいう$valueを&$valueと参照渡しをしてください!($keyはできない)
あと外のスコープの値を利用したい場合は、

```php
array_walk($data, function($value, $key)use($out_data) {
  //...
});
```
とするか、

```php
array_walk($data, function($value, $key, $out_data){
  //...
}, $out_data);
```

のようにしてください。
2つは参照渡しにした場合に挙動が違いますが、
そこは手抜..勉強になるので動かしてみてください。
クロージャが作れます＼(^o^)／

## implode
配列を文字列に結合します。

```php
implode(', ', [
  '太郎',
  '花子',
  '健太'
])
// => 太郎, 花子, 健太

```

空配列を渡せば、空文字列を出力してくれるため、ビューでも使いやすいです。

## strtotime
日付形式の文字列をタイムスタンプにする関数です。
これdate関数と一緒によく使います。
日付を変換したいときは基本的に

```php
date('Y-m-d H:i:s') //現在時刻
date('Y-m-d H:i:s', strtotime('- 1 month')) // 一ヶ月前
date('Y年m月d日', strtotime('1990/8/18')) //1990年08月18日

```

みたいな感じでいけちゃう!

また、正しい日付形式か確認するときは

```php
if(strtotime($date) > 0) {
}
```

で確認できたりします。

※1970年1月1日 9:00より前の日付が来るときはtrueにならないので使用しない。


続くかも。。
GAE pythonでモジュールの読み込み先の指定


GAE上でFlask等既存モジュールを利用する際のライブラリ置き場の作成と読み込み(import)を自然な感じでやる


app.yamlと同階層に、main.pyとlibフォルダーを作成してあり、main.pyから、各種ライブラリーをimportしたいとき

```
root_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.join(root_dir, 'lib'))
```
を、import直前に書いておけばOK

sample

```
#!coding:utf8
import os
import sys
from datetime import date
from google.appengine.ext import ndb
from google.appengine.ext.webapp.util import run_wsgi_app

import csv
import json
import urllib
import datetime
from random import randint

root_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.join(root_dir, 'lib'))

import jinja2
from flask import Flask
from flask import request
from flask import jsonify
from flask import redirect
from flask import render_template

from models import MyModel
```
ZendFrameworkでパラメータ取得

**パラメータの取得の比較**

通常時とZendでの取得方法を比較。
両方使ったことあると、なんか迷う。

# GETパラメータの取得
```php:通常
$_GET['key'];
```
```php:Zend
$this->getRequest()->getQuery('key');
```

# POSTパラメータの取得
```php:通常
$_POST['key'];
```
```php:Zend
$this->getRequest()->getPost('key');
```

# Cookieの取得
```php:通常
$_COOKIE['cookie'];
```
```php:Zend
$this->getRequest()->getCookie('cookie');
```
Sublime Text3のツリーの右クリックメニューにgit commitを追加する


SideBarGitはとても良いのだが、右クリックからGitをクリックする必要があり、この1クリックをなくしたい。
まずSideBarGitをインストールしておく。

パッケージの設定のフォルダ(Userフォルダ)に、Side Bar.sublime-menu という名前で以下のようなファイルを作成する。これで1クリックでメニューが出るはず。

```
[
  {"caption": "git diff", "command": "side_bar_git_diff_all_changes_since_last_commit", "args": {"paths": []}},
  {"caption": "git quick commit", "command": "side_bar_git_add_commit", "args": {"paths": []}},
]
```

### メニューの追加・削除
コマンドなどはSideBarGitのソースを見るとよい。
https://github.com/titoBouzout/SideBarGit

### パッケージの設定のフォルダの位置
- OSX
$HOME/Library/Application Support/Sublime Text 3/Packages/User

- Windows
%USERPROFILE%\AppData\Roaming\Sublime Text 3\Packages\User
初心者用perl頻出関数リファレンス

よく使うけど引数の順番を毎回忘れるのでメモ。
都度追加していきますが、自分用なのである程度まとまったらタグとかつけます…。

# 演算子
https://ja.wikibooks.org/wiki/Perl/%E6%BC%94%E7%AE%97%E5%AD%90

```text:算術演算子
 + 加算
 - 減算
 * 乗算
 / 除算
 % 剰余(割った余り)
```
```text:文字列比較演算子
 eq 一致(equal)
 ne 不一致(not equal)
 le 以下(less than or equal)
 ge 以上(greater than or equal)
 lt より小さい(less than)
 gt より大きい(greater than)
```
# 制御構文
Perlでのforeachの書き方は以下のとおり。
Java/PHPなどのcontinue/breakに当たる構文はそれぞれnext/lastになる。

```perl:制御構文【if/for/next/last】
for my $value (@values) {
    if($value % 2 == 0) {
        # logic
        next;
    }
    if($value % 100 == 99) {
        # logic
        last;
    }
}
```


# 配列

## `grep {expr} @array`
配列の中に含まれるexprに一致するものを配列として返す。

```perl:例 
my @list = grep {$_->{has_child} == 1} @user_list;
```

## `join($glue, @pieces)`
配列を$glueで指定された文字列で結合する。

```perl:例
my $text = join(', ', @csv_data);
```

## `split($separator, $value)`
文字列を$separatorで指定された文字で分割し、配列として返す。

## `push(@array, $value)`
配列の最後に$valueを追加する。

## `pop(@array)`
配列の最後の要素を取得する。最後の要素は削除される。

## `shift(@array)`
配列の先頭の要素を取得する。先頭の要素は削除される。

## `unshift(@array, $value)`
配列の先頭に要素valueをセットする。

## `scaler(@array)`
配列の要素数を取得する。

# 数値

## `ceil($value)`
実数$valueを整数に「切り上げる」
1.4の場合は2に、-1.4の場合は0になる。

## `floor($value)`
実数$valueを整数に「切り下げる」
1.4の場合は1に、-1.4の場合は-2になる。
C++11でCopyOnWriteArrayList


JavaクラスライブラリにCopyOnWriteArrayListというクラスがある。
C++11で使える似たような機能を持つクラスが欲しかったので、それを作成してみた。

[copy_on_write_vector.h](https://github.com/idaisuke/ferrum/blob/master/include/ferrum/container/copy_on_write_vector.h)

### CopyOnWriteArrayListとは？ ###

こんなクラス
[CopyOnWriteArrayList](https://docs.oracle.com/javase/jp/8/api/java/util/concurrent/CopyOnWriteArrayList.html)

### やりたかったこと ###

+ Buttonクラスに複数のリスナーを設定したい。
+ リスナーの走査中でもリスナーの追加/削除がしたい。
+ とりわけイベントが通知された時にそのリスナー自身を削除したい。

### 例えばこんな感じ ###

```cpp
class Button;

struct OnClickListener {
    using Ptr = std::shared_ptr<OnClickListener>;
    std::function<void(Button *, Ptr listener)> onClick;
};

class Button {
public:
    void addListener(const OnClickListener::Ptr &listener) {
        _listeners.push_back(listener);
    }
    
    void removeListener(const OnClickListener::Ptr &listener) {
        _listeners.erase(std::remove(_listeners.begin(), _listeners.end(), listener), _listeners.end());
    }
    
    void notifyListeners() {
        for (auto &&listener : _listeners) {
            if (listener->onClick) {
                listener->onClick(this, listener);
            }
        }
    }
    
private:
    std::vector<OnClickListener::Ptr> _listeners;
};
```

### 問題点: コンテナの走査中に追加/削除ができない ###
リスナーの格納に使うコンテナにstd::vectorやstd::listを使うと
要素の追加/削除でイテレータが無効になる場合がある。

```cpp
auto listener = std::make_shared<OnClickListener>();
listener->onClick = [](Button *button, OnClickListener::Ptr listener) {
    // ボタンがクリックされた時の処理
    
    // ここでリスナーの追加や削除をするとイテレータが無効になる場合がある
    button->addListener(std::make_shared<OnClickListener>());
    
    // 自分自身を削除したい
    button->removeListener(listener);
};
_button.addListener(listener);
```

### std::vectorをfe::copy_on_write_vectorに置き換える ###

[copy_on_write_vector.h](https://github.com/idaisuke/ferrum/blob/master/include/ferrum/container/copy_on_write_vector.h)

```cpp
class Button {
public:
    void addListener(const OnClickListener::Ptr &listener) {
        _listeners.push_back(listener);
    }

    void removeListener(const OnClickListener::Ptr &listener) {
        _listeners.erase_all(listener);
    }

    void notifyListeners() {
        for (auto &&listener : _listeners.lock()) {
            if (listener->onClick) {
                listener->onClick(this, listener);
            }
        }
    }

private:
    fe::copy_on_write_vector<OnClickListener::Ptr> _listeners;
};
```
これならコンテナが走査中かどうかを気にしないで追加/削除ができる。

### Boost.Signals2でも同じようなこと出来そうだったね ###

```cpp
#include <boost/signals2/signal.hpp>
class Button {
public:
    boost::signals2::connection addListener(
        std::function<void(const boost::signals2::connection &connection, Button *)> listener) {
        return _signal.connect_extended(std::move(listener));
    }

    void removeListener(const boost::signals2::connection &connection) {
        connection.disconnect();
    }

    void notifyListeners() {
        _signal(this);
    }

private:
    boost::signals2::signal<void(Button *)> _signal;
};
```

```cpp
button.addListener([](const boost::signals2::connection &connection, Button*) {
    // ボタンがクリックされた時の処理
    
    // 自分自身を削除したい 
    connection.disconnect();
});
```

おわり
CocoaPodsで導入したライブラリがアップデートされているか調べる方法


開発している時にどのライブラリがアップデートされているか確認したくなる時があります。
そんな時は `pod outdated` で確認出来ます。


```shell
$pod outdated

Analyzing dependencies
The following updates are available:
- AFNetworking 2.5.3 -> 2.5.4 (latest version 2.5.4)
- ReactiveCocoa 2.4.7 -> 2.5 (latest version 3.0.0-alpha.1)
- SDWebImage 3.7.1 -> 3.7.1 (latest version 3.7.2)
- TTTAttributedLabel 1.13.2 -> 1.13.3 (latest version 1.13.3)
The following pods are deprecated:
- Facebook-iOS-SDK (in favor of FBSDKCoreKit)
```

便利ですね。
確認してから、[CocoaPods - 特定のライブラリを指定してpod updateする方法 - Qiita](http://qiita.com/tmnb/items/9f7b7fca0e9b71e673e4) で特定のライブラリを指定してアップデートしたりすると捗ります :smile:
iTerm2上のEmacsでMetaキーをAltにする


最近Emacsをメインエディタにしようと使い始めたのですが、MetaキーがESCなのがだんだん鬱陶しくなってきました。

そこでどのキーを割り当てようか調べていたところ、iTerm2の設定で簡単にAltキーを割り当てることができる事が分かったのでメモです。

![item2_screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/18007/24b2b075-9cde-fb93-1a4c-3431fe901345.png "item2_screenshot.png")


iTerm2の環境設定を開いて矢印部分の "+Esc" を指定すると、Alt+xでM+xになります。
オブジェクトが画面外に出たら削除したい

オブジェクトは初期状態で画面内に存在しており、それが画面から外れたときに自動的に削除するという処理を実装したい。例えばシューティングゲームの弾など。

これは[Renderer.isVisible](http://docs.unity3d.com/ja/current/ScriptReference/Renderer-isVisible.html)で判定すれば簡単に実装できる。

```csharp:MyComponent.cs
void Update() {

  if (!GetComponent<Renderer>().isVisible) {
    Destroy(this.gameObject);
  }

}
```

オブジェクトが画面外で生成される場合や、画面外に出た後また画面内に戻ってくるような場合は使えません。
形態素解析してマルコフ連鎖で文章生成するWebアプリ【bottle】

今まで結構色々と形態素解析とマルコフ連鎖で文章生成やってきましたが、
bottleを使って作ってみました。

```views.html

<form method="GET" action="/show">
<p class="in">今日は何についてマルコフりますか？</p>
<p><input type="text" name="send_word"></input></p>
<p><input type="submit" value="送信する"></p>
</form>

```

メイン画面として呼び出すHTMLファイルにform送信をつけます。

```style.css

input[type=submit]{
   border-radius: 5px;
   -moz-border-radius: 5px;
   -webkit-border-radius: 5px;
   -o-border-radius: 5px;
   -ms-border-radius: 5px;
   border:#a9a9a9 1px solid;
   -moz-box-shadow: inset 0 0 5px rgba(0,0,0,0.2),0 0 2px rgba(0,0,0,0.3);
   -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2),0 0 2px rgba(0,0,0,0.3);
   box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2),0 0 2px rgba(0,0,0,0.3);
   width:100%;
   height:40px;
   padding:0 3px;
   cursor:pointer;
   color:#333;
   font-weight:bold;
   background:#f5f5f5;
   text-shadow:1px 1px 0px #fff;
}

input[type=text]{
   border-radius: 5px;
   -moz-border-radius: 5px;
   -webkit-border-radius: 5px;
   -o-border-radius: 5px;
   -ms-border-radius: 5px;
   border:#a9a9a9 1px solid;
   -moz-box-shadow: inset 0 0 5px rgba(0,0,0,0.2),0 0 2px rgba(0,0,0,0.3);
   -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2),0 0 2px rgba(0,0,0,0.3);
   box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2),0 0 2px rgba(0,0,0,0.3);
   width:100%;
   height:30px;
   padding:0 3px;
}

input[type=text]:focus {
   border:solid 1px #20b2aa;
}

input[type=text], select { 
   outline: none;
}
```

CSSでボタンとテキストフォームをカスタマイズしときます。

```show.html
<h4 class="center">キーワード {{send_word}}　でマルコフりました！</h4>
<p>{{twits}}</p>
```

結果表示用のHTMLはこんな感じでbottleで定義した変数をいれこみ。

```route.py
@route("/show", method="GET")
def send_word():
	send_word = request.query.send_word
	send_word.encode("utf-8")
	if send_word:
		
	
		os.remove("static/tweet.txt")
```

bottleでフォームからGETで受け取る。
例によってキーワードを検索したものを一旦テキストに保存するのだけど、ドンドン増えても困るから実行ごとに削除するようにする。

```
@error(500)
def error500(error):
	return template("500")
```

検索ワードがニッチだったりAPI制限出ると500エラーなので、bottleで逃げの処理。
try exceptでステータスコードで処理を分けたらいいのにね。

あとは以前書いたモノと同等品。
完成品はgit使わずにDropboxデプロイでHerokuに投げた。

http://markov-twit.herokuapp.com/

こんなものが出来た。
javascriptメモ

個人的にJavaScriptの挙動で曖昧な箇所や、覚えておきたいことに関してメモしておきます。
一部ES5の要素含まれます。ES6の要素も今後追加する予定です。

# 配列関係

## 配列からの要素の削除

配列からの要素の削除にはdeleteとかsplice等が存在するが、配列そのものを削除したいときには、delete。要素を削除するときにはspliceが良さそう。(最初、最後の要素削除は単純にpop等が良いでしょう)

#### deleteで要素を削除した場合

deleteで要素を削除した場合、こうなる。

```js
var a = ['aaa', 'bbb', 'ccc'];
delete a[1];

console.log(a.length); // 3
console.log(a);        // ['aaa', undefined, 'ccc']
```
このようにundefinedが入るだけになるので、最後の要素がlength-1で取得出来なくなってしまう。

#### spliceの場合

```js
var a = ['aaa', 'bbb', 'ccc'];
a.splice(1, 1); // 添字1から1個分抜き取る

console.log(a.length); // 2;
console.log(a);        // ['aaa', 'ccc'];
```

## array.forEachでbreak等を実現する方法

array.someメソッドで代用することで、対応できる。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some

```js
array.some(function(item) {
  if(item === 1) {
    return true; // break;
  }
  if(item === 2) {
    return false; // continue;
  }
});
```

# オブジェクトのキーの理解

オブジェクトに変数を渡したときの理解が薄かった。
以下のコードを見てほしい。

```js
var routes = [];
var router = { routes };
console.log(router);
```

とした場合、routesという名前をkeyとしてroutesの中身が入ることになる。
ちゃんと把握してないと、ここどうして出来ないんだっけ？とかなっちゃうので書いておく。
小数第2位までRubyでtruncateする方法

# (追記) Ruby 2.4.0 からは期待通りの仕様になりました

```ruby
RUBY_VERSION                    # => "2.4.0"
0.555.truncate(2)               # => 0.55
```

## 参考
サンプルコードでわかる！Ruby 2.4の新機能と変更点
http://qiita.com/jnchito/items/9f9d45581816f121af07

# Ruby 2.4.0 未満では難しかった

`round` に引数を渡して四捨五入ができるなら、当然 `truncate` も同じように使えるんだろうと思いきや、なぜかできません。引数を受けつけないだと!?

```ruby
0.555.round(2)                  # => 0.56
0.555.truncate(2) rescue $!     # => #<ArgumentError: wrong number of arguments (1 for 0)>
```

そこで、なんだかよくわからないけど BigDecimal に変換してみるとできました。

```ruby
require "bigdecimal"
require "bigdecimal/util"
0.555.to_d.truncate(2).to_f     # => 0.55
```
【iPhone6 Plus／iPhone6+】box-shadowが効かない

デモ：[【iPhone6 Plus】box-shadowが効かない - js do it](http://jsrun.it/Ituki/mPyg)

#効かない

```css
p {
	box-shadow: 1px 1px 1px blue;
}
```

#効く
##border-radiusを指定する

```css
p {
	box-shadow: 1px 1px 1px blue;
	border-radius: 0.1px;
}
```

##background-colorを指定（transparentはだめ）
実験したけど背景に透明画像もダメだった。

```css
p {
	box-shadow: 1px 1px 1px blue;
	background-color: #dfd;
}
```

参考：[iPhone6 Plusでcssのbox-shadowが効かない時の対処方法](http://applian.jp/iphone6-plus-box-shadow/)
Unity5 + Xamarin Studioのデバッグ環境構築方法

Unity5 + Xamarin Studio5.9.1でデバッグしようとしていて、

[unity付属のMonoDevelopが使いにくいのなんとかした件]( https://24nwakahana.wordpress.com/2014/11/11/unity%E4%BB%98%E5%B1%9E%E3%81%AEmonodevelop%E3%81%8C%E4%BD%BF%E3%81%84%E3%81%AB%E3%81%8F%E3%81%84%E3%81%AE%E3%81%AA%E3%82%93%E3%81%A8%E3%81%8B%E3%81%97%E3%81%9F%E4%BB%B6-unity/)

というページが非常に参考になったのですが、

肝心の「Mono Soft Debugger Support for Unity」というアドインがリポジトリに存在しませんでした。

http://forum.unity3d.com/threads/unity-add-ins-for-monodevelop-xamarin-studio-5-9.329880/
を参考に

1. Unity Add-ins 5.9.0: を下記リンクよりダウンロード  
   http://files.unity3d.com/lukasz/Unity-Addins-5.9.0.zip
2. 1でダウンロードしたファイルをXamarin Studioのアドインマネージャーからインストール
3. Unity5を最新版のパッチリリースにアップグレード（5.0.2p2以上）  
   https://unity3d.com/unity/qa/patch-releases

で使えるようになりました。
CoffeeScriptで、コルーチン無しで、非同期逐次実行を平たく書く

#ちっぽけだけど、npmに上げよう
なんつーか、npmモジュールの練習にもってこいかも知れない。日曜か、今日の仕事の具合によっては今晩。

#内容としては補遺
[コルーチンを出すまでもなく](http://qiita.com/mrpepper/items/12992a5a73905364e024)、非同期処理を書こうとすればどの制御構造も書ける。というのを[以前のエントリ](http://qiita.com/mrpepper/items/6a538ef0b2d11fc311ac)で示した。が、やっぱり即時関数の引数に無名関数を書く、なんていうのは、慣れていない人にはトリッキーに見えるかも知れない。なので、\_forなどで見せたように、関数の中にそういうトリッキーな部分を閉じ込めればいい。

たとえば、こんな風にブロック毎に任意の数の引数が受け渡せて、しかも逐次実行を保証してくれるとしたらどうだろう。

```coffeescript
_continuation ['firstarg1','arg2']
, (next,str1,str2) ->

  #block1
  PRINT str1,->
    PRINT str2,->
      C ->
        D ->
          next 'err'

, (next,errstr) ->

  #block2
  PRINT errstr,->
    F ->
      if true
        G -> next()
      else
        next()

, (next) ->

  #block3
  H ->
    I ->
      return
```

引数もブロックをまたいで渡せて、if～elseブロックからの合流もできる。合流する前に複数の飛び先が欲しいなら、引数としてステータスを表す文字列を渡してswitchすればいい。これなら、コルーチン欲しー、と言う人も、あえ？　このほうがいいかも？　と寝返るかも知れない。

そんなわけで、上記の\_continuationも書いてみた。

```coffeescript
y_combi = (func) ->
  return ((p) ->
    return () ->
      return func(p(p)).apply(this,arguments)
  )((p) ->
    return () ->
      return func(p(p)).apply(this,arguments)
  )

_continuation = ->
  args = [].slice.call(arguments)
  firstargs = args.shift()
  (y_combi (func) ->
    return ->
      arg = args.shift()
      if arg?
        passargs = [].slice.call(arguments)
        passargs.unshift(func)
        arg.apply(this,passargs)
  ).apply(this,firstargs)

#for test

A = (func) -> console.log 'A'; setTimeout func, 500
B = (func) -> console.log 'B'; setTimeout func, 500
C = (func) -> console.log 'C'; setTimeout func, 500
D = (func) -> console.log 'D'; setTimeout func, 500
E = (func) -> console.log 'E'; setTimeout func, 500
F = (func) -> console.log 'F'; setTimeout func, 500
G = (func) -> console.log 'G'; setTimeout func, 500
H = (func) -> console.log 'H'; setTimeout func, 500
I = (func) -> console.log 'I'; setTimeout func, 500
PRINT = (str,func) -> console.log 'PRINT: '+str; setTimeout func, 500
```

どうかな。
rbenvのproxy設定とビルドに必要な設定

ググるとshell scriptのコードを書き換えたりとか無理矢理感のある対応をしている記事がでてきたので、
自分の備忘録をかねてメモ書いておきます。

OSはMac 10.10.3です。

# インストール方法

リポジトリに丁寧に書かれています。
OSSは進化が激しいのでコピーされた手順は古い可能性が高いです。

もしかしたら、これを誰かが読むときにはCCの設定やproxy設定も変わっているかもしれません。

https://github.com/sstephenson/rbenv#installation

# proxy設定

.zshenvや.bashprofileなどに以下を書きます。
export宣言をつけないと参照されないので注意。

```shell-session
export http_proxy=http://"yourpooxy"
export https_proxy=$http_proxy
export HTTP_PROXY=$http_proxy
export HTTPS_PROXY=$http_proxy
```

# CCの設定(Mac限定)

10.10では環境変数CCがなくなりました。
そのため、以下のようなエラーがでます。

```
./configure: line 3696: /usr/bin/gcc-4.2: No such file or directory
configure: error: clang version 3.0 or later is required
make: *** No targets specified and no makefile found.  Stop.
```

自分で設定する必要があります。


```
export CC=/usr/bin/gcc
```


こちらも.zshenvや.bashprofileに書く必要があります。
URLの存在確認をする

Apacheのrewriteの設定を編集する機会があったので、念のため現在のリダイレクト先が存在しているかチェックした。
存在していなかったらそのURLを表示する。

チェックするURLを記載するファイル

```text:urls.txt
/terms/privacy.html
/terms/terms.html
.
.
```

チェックスクリプト

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

for uri in `cat -`
do
  result=`curl -LI http://example.com${uri} -w '%{http_code}\n' -s -o /dev/null`
  if [ 404 = "${result}" ]; then
    echo "${uri}" 
  fi
done
```

実行

```bash
cat urls.txt | sh checkurl.sh
```
foreach内のifをLINQで

```csharp
public class Student
{
    public string Name;
}

public class Class
{
    public Student[] Students;
}
```

クラス内で年齢が20歳以上の人の名前リストを作りたい場合

foreachとifなら


```csharp
var names = new List<string>();
foreach (var student in @class.Students)
{
    if (student.Age >= 20)
    {
        names.Add(student.Name);
    }
}
```

LINQなら

```csharp
var names = @class.Students
    .Where(o => o.Age >= 20)
    .Select(o => o.Name)
    .ToList();
```
デザイナーがよく使うgitコマンドをまとめてみた。

普段はSource Treeを使っているのですが、たまに変なところでエラーが出たり、タイムラグがあったり…。
スムーズに制作するためにも最近はiTerm2にてgitコマンドを入力して進めることが多いです。
その中でも、デザイナーがよく使うgitコマンドまとめてみました。



### <strong>自分が今いる場所を確認する</strong>
ブランチ確認＆ローカルブランチの一覧表示

```
git branch
```

階層を１つ戻る場合

```
cd ../
```
階層を２つ戻る時は、`cd ../../`と増えていきます。
cd＝Change directoryの略。

### <strong>リモートも含めたブランチ一覧を表示する</strong>
```
git branch -a
```

### <strong>ブランチを移動する</strong>
```
git checkout <移動したいブランチ名>
```

### <strong>pullする（最新のものに更新する）</strong>
```
git pull
```
新しくブランチ切る時は、必ずしましょう！

### <strong>新しくブランチを制作する</strong>
```
git checkout -b <ブランチ名>
```
今いる場所からブランチを切ることができます。

### <strong>変更されたファイルの一覧を表示する</strong>
```
git status
```

### <strong>変更した差分を表示する</strong>
```
git diff
```

### <strong>コミットログを見る</strong>
```
git log
```
qを押すと終了します。

### <strong>修正＆追加したファイルをインデックスに追加する</strong>
全部インデックスする場合

```
git add .
```
同じファイルだけど一部の変更だけコミットしたい場合

```
git add -p <ファイル名>
```

### <strong>インデックスに追加されたファイルをコメント付きでコミットする</strong>
```
git commit -m <コミット内容コメント>
```

### <strong>リモートを確認</strong>

```
git remote -v
```
push先が正しいか確認します。

### <strong>pushする</strong>
```
git push <ブランチ名>
```

### <strong>ブランチを削除する</strong>
```
git branch -d <ブランチ名>
```
強制削除をする場合

```
git branch -D
```

### <strong>コミットせずにブランチを移動する</strong>
```
git stash
```

スタックから退避したファイルを取り戻す

```
git stash pop
```

スタックは一度どういう仕組みなのか理解しないと混乱することになるので、
まずは理解してから使うことをオススメします。
http://www.backlog.jp/git-guide/reference/stash.html


***
他にも便利なコマンドもありますが、"よく"使うことに絞るとこんな感じです。
以上、よく使うgitコマンドでした。
GPGキーを他のマシンに移管

# 古いマシン
gpg --export -a FFFFFFFF > public.asc
gpg --export-secret-keys -a FFFFFFFF > secret.asc

# 新しいマシン
gpg --import public.asc
gpg --import secret.asc
gpg --edit-key FFFFFFFF (and set the trust level and whatever else.)
Bundler1.10.XからGemfile.lockの書式がちょっと変わってる件について

具体的には以下の記述が追加される。


```ruby:Gemfile.lock

BUNDLED WITH
   1.10.2

```

しかも常にファイルを監視し続けているらしく、手で消したらその瞬間に復活する。
Gemfile.lockをリポジトリに追加している場合はコミットしないとブランチでの作業がままならない。
メンバーによってBundlerのバージョンが混在しているとこの記述が増えたり減ったりしてコミットが汚くなること間違いなし。

私はコミット汚くするのが嫌だったので一旦Bundlerをuninstallしてからリモートの対処済みブランチをチェックアウトし直した。

ご参考まで。

### 関連リンク
上位互換。issuesは追えてなかった
http://qiita.com/suu_g/items/2b1630b8015d51c5292e
Dockerhubへの初プッシュ


# 登録
Docherhubのページにアクセスし、アカウントを作成する。
https://hub.docker.com

# Dockerhub上にリポジトリを作成する
「Add Repository」を押して「Repository」を選択する。
作成画面でNamespaceを自分のユーザ名、リポジトリ名に自分の登録したいDockerImageのリポジトリ名を指定する。
publicとprivateを選択できるが、privateは無料枠だと1枠なので、特に問題がなければpublicにする。

# イメージを作成してプッシュする
今回はDockerfileからimageを作成してプッシュする流れを書きます。
以降はdockerが動くローカル環境です。

## Dockerイメージを作成する
imageのタグは **Dockerhubユーザ名/リポジトリ名** とします

```
mkdir myfirstimage
cd myfirstimage
vi Dockerfile
~~~ ゴニョゴニョ書いて保存 ~~~
docker build --tag=[Dockerhubユーザ名]/myfirstimage .
~~~ イメージ作成 ~~
docker images
~~~ 作成したものが存在すればOK ~~~
```

## ログイン

```
docker login
~~~ ユーザ名、パスワード、メールアドレスを入力してログイン ~~~
```


## プッシュ
今回付けたタグ名を指定してプッシュします。

```
docker push [Dockerhubユーザ名]/myfirstimage
```

# プッシュしたイメージを利用する

DokerfileのFROMで以下のように指定する。

```
FROM [Dockerhubユーザ名]/myfirstimage
```
XMLのシリアライズ

JSON.stringifyのxml版みたいのが必要になったので調べた。
以下の方法でxmlを文字列として出力できる。
（xmlの読み込みにd3をつかってます）

```js
d3.xml('sample.xml', function(xml){
	console.log( new XMLSerializer().serializeToString(xml) );
});
```
Nginxの設定ファイルkoi-utf, koi-win, win-utfは一体何なの？必要なの？

CentOS7でNginxをインストールすると、これら３つの謎ファイルが入っているので、必要なのか調べてみました。

heartbeatsさんの記事に詳しい解説があります。

http://heartbeats.jp/hbblog/2012/02/nginx03.html

これら３つは、ロシア語の文字エンコーディングに関する設定ファイルのようです。

> なお、koi-utf, koi-win, win-utfの3つのファイルを使うことはありません。

ということで、不要のようです。
AWS Summit Tokyo 2015 DAY1/Tech Deep Dive by Amazon/超概要

# TAの12セッションについて、概要をひとことで。。

* [TA-01]Amazon CloudSearch Deep Dive
　やっぱLucene, Solrだったって話

* [TA-02]Amazon RDS for Aurora Deep Dive
　Oxxxle RAC要らないよねって話

* [TA-03]Amazon Redshift Integration Deep Dive
　TarendでオンプレからクラウドでETL回す話

* [TA-04]Enterprise Applications Deep Dive
　VDIとかシェアポの代替

* [TA-05]AWS Elastic Beanstalk, AWS OpsWorks, AWS CodeDeploy, AWS CloudFormation を使った自動デプロイ
　
カオス
多様なCI基盤の話

* [TA-06]Amazon EBS パフォーマンスベンチマーク 2015
　IOPSとスループットの実際と、RAID0、インスタンスストアの使い道

* [TA-07]AWS への DC マイグレーションストラテジー
　移行概論、VM IMport新しくなった

* [TA-08]ネットワーク Deep Dive
　VPCのルーティングとセキュリティ

* [TA-09]AWS System Operation Deep Dive (Monitoring / Logging / Configuration)
　CloudWatch、CloudTrailの話

* [TA-10]AWS セキュアデザイン (IAM)
　AD連携の話

* [TA-11]AWS クラウドを活用した IoT / M2M ソリューション
　Kinesis、EMR、Redshiftが鉄板

* [TA-12]新サービス解説セッション ~ Amazon Elastic File System と Amazon Machine Learning ~
　AZ跨ぎのNFS、CloudDesignPattern: NFS Shareingのフルマネージドサービス
　すぐに始められる機械学習


新しいところでは、AuroraとEFSが有用そう、、ってところでしょうか。
PrimeFacesのAjaxでcallbackにサーバの処理結果を渡す


http://stackoverflow.com/questions/20546264/primefaces-ajax-callback-with-parameter-to-javascript

まぁ、上のStackoverflowにすべてが書かれてるんですけど。
元記事からサンプルをちょろっと修正して抜粋してます。

```java:HomeController.java
public String myMethod() {
    RequestContext context = RequestContext.getCurrentInstance();  
    context.addCallbackParam("firstParam", "my string");
    return "";
}
```

```html:AjaxTest.xhtml
function handleComplete(args){
    alert(args.firstParam);
}
<p:commandButton id="buttonId"
 value="press me"  actionListener="#{homeController.myMethod()}"
 process="@this"
 oncomplete="handleComplete(args)">
</p:commandButton>
```

まずactionListenerにサーバ側で行いたい処理のメソッドを指定します。
そしてcallback関数をoncompleteで指定します。その際にoncompleteで指定するcallback関数の引数にargsを指定してやれば、サーバ側（HomeController.java）で設定しているfirstParamがJavaScript側で使用できます。
ちなみにここのサンプルでは書いてないですけど、元記事に書かれているようにcallback関数の引数にxhrとstatusを記述すると、それぞれXmlHttpRequestのオブジェクトと処理結果のステータスが使えます。


で、元記事で書かれてるのはここまでなんですけど、Listを渡そうとしたら上手く値が取れなかったんですよね。

```java:HomeController.java
public String myMethod() {
    List<String> resultList = new ArrayList<>();
    resultList.add("result1");
    resultList.add("result2");
    RequestContext context = RequestContext.getCurrentInstance();  
    context.addCallbackParam("firstParam", resultList);
    return "";
}
```

```html:AjaxTest.xhtml
function handleComplete(args){
    alert(args.firstParam[0]); // undefinedになる
}
<p:commandButton id="buttonId"
 value="press me"  actionListener="#{homeController.myMethod()}"
 process="@this"
 oncomplete="handleComplete(args)">
</p:commandButton>
```

どうやらList的なものを渡す場合はJSONObjectでラップして渡してやらないとダメらしいのです。
つまりこんな感じで

```java:HomeController.java
public String myMethod() {
    List<String> resultList = new ArrayList<>();
    resultList.add("result1");
    resultList.add("result2");
    JSONObject json = new JSONObject();
    json.put("list", resultList);
    RequestContext context = RequestContext.getCurrentInstance();  
    context.addCallbackParam("firstParam", json);
    return "";
}
```

```html:AjaxTest.xhtml
function handleComplete(args){
    alert(args.firstParam.list[0]); // OK
}
<p:commandButton id="buttonId"
 value="press me"  actionListener="#{homeController.myMethod()}"
 process="@this"
 oncomplete="handleComplete(args)">
</p:commandButton>
```

と、ここまで書きましたけど上記は自分で色々試した結果、これでイケたっていう内容なので正しい書き方なのかはイマイチ自信ないです…（正しい書き方知ってる人がいたら教えて下さい…）

というわけでハマったメモでした。
opensslのwindows版をセットアップでつまづいた点

## 手順

![1-setup.JPG](https://qiita-image-store.s3.amazonaws.com/0/25728/110c7f1f-a26d-d60d-1555-5b68a10a6af6.jpeg)

opensslのセットアップを行うとき以下エラーが出た。
![2-setup.JPG](https://qiita-image-store.s3.amazonaws.com/0/25728/b00fc71d-2434-73d2-0cce-b60216eafea2.jpeg)

![3-english.JPG](https://qiita-image-store.s3.amazonaws.com/0/25728/2d643e8c-63c8-281e-7b6b-08657447f91b.jpeg)

* c++2008ランタイムは英語版をインストールすることで解決した。
  * 日本語版だと駄目
Objective-C での Template Method パターンって

なんかデリゲートとか色々なやり方が見つかるのだけれども、これじゃダメなのだろうか

```objc
#import <Foundation/Foundation.h>

/// ベースクラスの抽象メソッド
@protocol AllAbstractMethodsImplemented <NSObject>
- (void)method1;
- (void)method2;
@end

/// ベースクラス
@interface AbstractClass : NSObject {
    /// 具象サブクラスのインスタンスへの弱参照を保持
    __weak AbstractClass<AllAbstractMethodsImplemented> *_concreteInstance;
}
/// @param concreteInstance 具象サブクラスのインスタンス(サブクラスにおけるself)
- (AbstractClass *)initWithConcreteInstance:(AbstractClass *)concreteInstance;
- (void)templateMethod;
@end
@implementation AbstractClass
- (AbstractClass *)initWithConcreteInstance:(AbstractClass<AllAbstractMethodsImplemented> *)concreteInstance
{
    if(self = [super init]) {
        _concreteInstance = concreteInstance;
        // initializes...
    }
    return self;
}
- (void)templateMethod
{
    // イニシャライザで渡してもらった具象サブクラスのメソッドを呼ぶ
    [_concreteInstance method1];
    [_concreteInstance method2];
}
@end
    
/// 具象サブクラス。AllAbstractMethodsImplemented のメソッドをすべて実装
@interface ConcreteClass : AbstractClass<AllAbstractMethodsImplemented>
- (ConcreteClass *)init;
- (void)method1;
- (void)method2;
@end
@implementation ConcreteClass
- (ConcreteClass *)init
{
    self = [super initWithConcreteInstance:self];
    if(self) {
    	// initializes...
    }
    return self;
}
- (void)method1
{
    NSLog(@"method1\n");
}
- (void)method2
{
    NSLog(@"method2\n");
}
@end
    
/// 動作確認
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        AbstractClass<AllAbstractMethodsImplemented> *object = [[ConcreteClass alloc] init];
    	[object templateMethod];    // method1<改行>method2<改行>
    }
    return 0;
}
```
markdown-pdf で .mdを.pdfに変換してみた

## 参考

* [markdown-pdf - MarkdownをPDFに変換 MOONGIFT](http://www.moongift.jp/2015/05/markdown-pdf-markdown%E3%82%92pdf%E3%81%AB%E5%A4%89%E6%8F%9B/)
* [alanshaw/markdown-pdf](https://github.com/alanshaw/markdown-pdf)
* [npm install fails on Debian/Ubuntu · Issue #323 · google/web-starter-kit](https://github.com/google/web-starter-kit/issues/323)

## 手順

```bash:
sudo apt-get install -y \
  npm node nodejs-legacy
```

```bash:一般ユーザで実施
mkdir -p ~/bin/node
cd ~/bin/node
```

```bash:一般ユーザで実施
npm install markdown-pdf
```

* `~/bin/node/node_modules/markdown-pdf/`が生成されたことを確認。

## 使ってみる

```js:a.js
var markdownpdf = require("markdown-pdf")
  , fs = require("fs")

fs.createReadStream("markdown-pdf/README.md")
  .pipe(markdownpdf())
  .pipe(fs.createWriteStream("a.pdf"))
```

```bash:変換実施
node a.js
```

a.pdf が生成されたことを確認。
文字化け対応StrConv

#文字化け対応StrConv

Windows7 以降「゜」「゛」が単独で現れる文字列をStrConvすると文字化けするようになっています。
また、SJISコードが無いUNICODE文字列を変換すると？になってしまいます。
回避策をいれたStrConvはこちら。

```vb.net:文字化け対応StrConv
'文字化け対応StrConv(vbUnicode, vbFromUnicodeは使えません)
Public Function StrConvU(ByVal strSource As String, conv As VbStrConv) As String

    Dim i As Long
    Dim strBuf As String
    Dim c As String
    Dim strRet As String
    Dim strBefore As String
    Dim strChr As String

    strRet = ""
    strBuf = ""
    strBefore = ""

    For i = 1 To Len(strSource)

        c = Mid(strSource, i, 1)

        Select Case c
            '全角の濁点、半濁点
            Case "゜", "゛"
                If (conv And vbNarrow) > 0 Then
                    If c = "゜" Then
                        strChr = "ﾟ"
                    Else
                        strChr = "ﾞ"
                    End If
                Else
                    strChr = c
                End If
                strRet = strRet & strConv(strBuf, conv) & strChr
                strBuf = ""
                
            '半角の半濁点
            Case "ﾟ"
                '１つ前の文字
                Select Case strBefore
                    Case "ﾊ" To "ﾎ"
                        strBuf = strBuf & c
                    Case Else
                        If (conv And vbWide) > 0 Then
                             strChr = "゜"
                        Else
                            strChr = c
                        End If
                        strRet = strRet & strConv(strBuf, conv) & strChr
                        strBuf = ""
                End Select
                
            '半角の濁点
            Case "ﾞ"
                '１つ前の文字
                Select Case strBefore
                    Case "ｶ" To "ｺ", "ｻ" To "ｿ", "ﾀ" To "ﾄ", "ﾊ" To "ﾎ"
                        strBuf = strBuf & c
                    Case Else
                        If (conv And vbWide) > 0 Then
                            strChr = "゛"
                        Else
                            strChr = c
                        End If
                        strRet = strRet & strConv(strBuf, conv) & strChr
                        strBuf = ""
                End Select
                
            'その他
            Case Else
                '第二水準等StrConvで文字化けするものを退避
                If Asc(c) = 63 And c <> "?" Then
                    strRet = strRet & strConv(strBuf, conv) & c
                    strBuf = ""
                Else
                    strBuf = strBuf & c
                End If
        End Select
        
        '１個前の文字
        strBefore = c

    Next

    If strBuf <> "" Then
        strRet = strRet & strConv(strBuf, conv)
    End If

    StrConvU = strRet

End Function
```

他のソースをごらんになりたい方はこちらへ
Excelを便利にする250以上の機能を体系化したアドインはこちらです。
「RelaxTools Addin」窓の杜大賞受賞ソフト
http://software.opensquare.net/relaxtools/
TreasureDataでHiveクエリを書くとき - TD_TIME_ADDを利用しよう

# はじめに
Treasure DataはHiveの関数以外に独自関数を。。。（略

[ドキュメント：Supported Hive UDFs](http://docs.treasuredata.com/articles/udfs)

ドキュメントを見れば、ここから下は不要だ。

# TD_TIME_ADD
以前、[Treasure Dataで時間の範囲を指定するの大事！](http://qiita.com/KamekoKameKame/items/7b1ba4fa43ec0f4ba806)って記事を書きましたが、[TD_TIME_RANGE](http://qiita.com/KamekoKameKame/items/4583ea3586f92a06cb26)を利用するときに1日分とか、1週間分とかTD_SCHEDULED_TIME()- 3600*24*7とか書くのダサい！見づらい！ということで、TD_TIME_ADDというのが用意されています。

```sql:Signature
long TD_TIME_ADD(int/long/string time,
                 string duration
                 [, string default_timezone = 'UTC'])
```

第一引数で指定した時間を第二引数で指定した期間分増減してくれます。

この関数の素晴らしいところは第一引数をunixtimeでも文字列（ig. "2013-01-01" or "2013-01-01 07:00:00"）でも指定できることです。

第二引数に設定できる値です。

| 指定法 | 説明 | 使用例 |
|:----|:----|:----|
|Nd|N日後|"1d":1日後,"2d": 2日後,"30d": 30日後|
|-Nd|N日前|"-1d":1日前,"-2d": 2日前,"-30d": 30日前|
|Nh|N時間後|"1h":1時間後,"2h": 2時間後,"48h": 48時間後|
|-Nh|N時間前|"-1h":1時間前,"-2h": 2時間前,"-48h": 48時間前|
|Nm|N分後|"1m":1分後,"2m": 2分後,"90m": 90分後|
|-Nm|N分前|"-1m":1分前,"-2m": 2分前,"-90m": 90分前|
|Ns|N秒後|"1s":1秒後,"2s": 2秒後,"90s": 90秒後|
|-Ns|N秒前|"-1s":1秒前,"-2s": 2秒前,"-90s": 90秒前|

長さが確定していない**年**と**月**はサポートしていません。

第三引数は[タイムゾーン](https://gist.github.com/frsyuki/4533752)を指定します。日本時間は"JST"と書きます。

## 例
"2013-01-01"から1日後までを指定。

```sql
SELECT ... WHERE TD_TIME_RANGE(time,
                               "2013-01-01",
                               TD_TIME_ADD("2013-01-01", "1d"),"JST")
```

TD_SCHEDULED_TIME()の1日前までを指定。

```sql
SELECT ... WHERE TD_TIME_RANGE(time,
                               TD_TIME_ADD(TD_SCHEDULED_TIME(), "-1d"),
                               TD_SCHEDULED_TIME(),"JST")
```

# まとめ
これでTD_TIME_RANGEでの範囲指定がさらに楽になりますね！
MobileSafariでの標準IMEとサードパーティ製IMEの挙動をみてみた

# 不穏な警告メッセージ

iOSのIMEを初めて変えた時に出た
**すべての入力内容を転送することを許可します。**
警告通りすべての入力がサードパーティ製のIMEに渡ってしまうのかな？
とMobileSafari上でのIMEの挙動を見てみた記事です。
利用したサードパーティ製IMEの挙動がどうこう言うわけではありません、誤解なきようお願いします。

![dialog_alert](https://qiita-image-store.s3.amazonaws.com/0/19483/1c0ca697-d552-cd73-0aec-bc19183cce87.png)

IMEをSimejiに変える時に出たメッセージです。

あとiOS8.3で挙動みてます。

# 挙動確認用のページを作成

サクッとjsfiddleでいろんなtypeのinputを作成するページを作ってみました。
https://jsfiddle.net/85eywokz/11/embedded/result/

![samplepage](https://qiita-image-store.s3.amazonaws.com/0/19483/dd483d35-7211-10a5-3766-c8f03a87e9ef.png)

モバイルから表示するにしてはかなり愛想がないサンプルですが、inputフィールドにフォーカスを合わせる際に表示されるキーボードを確認したいだけなので、この状態でデフォルトのキーボードをSimejiにして挙動を確認していってみる。

input要素のtype属性の一覧は
https://developer.mozilla.org/ja/docs/Web/HTML/Element/Input
から抜粋してます。

# input type='password'とtype='tel'はiOS標準のIMEが強制される模様

結論はタイトル通り。
typeによる判定ではpasswordとtelはサードパーティ製のIMEには渡さないようです。

![type_password.png](https://qiita-image-store.s3.amazonaws.com/0/19483/cd267bc7-0541-95b1-6c62-220be8338965.png)

![type=tel.png](https://qiita-image-store.s3.amazonaws.com/0/19483/3f171ff2-6da7-179b-1205-3ca2385dbfe8.png)

#クレジットカード番号は？

textで指定してたらだめなんじゃないかなぁとおもってましたが、amazonとか見ると標準のキーボードがでてきました。よくわかりません。
![amazon.png](https://qiita-image-store.s3.amazonaws.com/0/19483/bc64fbf6-51a7-9e08-3f25-694504edb36a.png)

**クレジットカードを読み取る** が有効になるような状態であれば、標準のIMEになるのか？との仮説で調べてみたけどどうもそうでもない模様。

![credit_reader.png](https://qiita-image-store.s3.amazonaws.com/0/19483/17619a42-a6dd-4643-f2ac-d09daa9e1085.png)
サードパーティ製IMEの上にクレジットカードを読み取るボタンがでてしまった。
※クレジットカードを読み取るはhttpsアクセスしないと有効になりません。

どういうルールでiOSがサードパーティ製IMEを出すか標準のIMEを出すのかこの辺りはよくわかりませんがなんらかの手段でサードパーティ製IMEに渡さない方法はあるっぽい。

# おわりに

というわけで挙動をみてみました。
少なくともMobileSafari向けのWebアプリでサードパーティ製のIMEを経由(しない/させない)入力が作れる模様です。
PHPでGoogleにジオコーディングをリクエストして緯度経度を取得する


常にリクエストもとはプログラムを配置しているサーバーからとなるため、リクエスト数が閾値を超えてしまうと当然エラーになる。
一度取得したら、DBに書き込んでおくなどの工夫は必要です。

```php
class GoogleGeocoding
{

	public static function getLatLng($strAddress = null)
	{
		if (!is_null($strAddress) && '' != $strAddress) {
			$strAddress = trim($strAddress);
			$strAddress = urlencode($strAddress);
			$url = "http://maps.google.com/maps/api/geocode/json?";
			$url .= "address={$strAddress}&sensor=false";
			$ch = curl_init();
			curl_setopt($ch, CURLOPT_URL, $url);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
			curl_setopt($ch, CURLOPT_PROXYPORT, 3128);
			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
			$response = curl_exec($ch);
			curl_close($ch);
			$res = json_decode($response, true);
			if (isset($res['results'][0]['geometry']['location'])) {
				return $res['results'][0]['geometry']['location'];
			} else {
				throw new Exception('Cannot get lat and lon by geocoding.');
			}
		}
	}

}
```
Pythonでopen exchange ratesから為替レートを取得する

open exchange ratesは為替レートを取得するAPIを提供しているWebサービス。一時間ごとの更新＆1000件/月までという制限があるが、無料プランを提供している(この制限だと用途によってはキツいだろうが、その場合は有料プランを使うか、同様の他サービスを検討しよう)。

以下、open exchange ratesの無料プランのサインアップをして、PythonからAPIを呼んでレートを取る方法を書く。

# サインアップ

無料プランのサインアップページはここ。

https://openexchangerates.org/signup/free

メールアドレス、パスワード、氏名、Catpchaの数字を入力し、「Aggreement」のチェックを付けて「Continue」ボタンを押せばOK。メールでAPP IDが送信されてくる。

# 最新レートの取得

open exchange ratesでは、最新レートの取得と日付を指定してのヒストリカルレートの取得ができる。

試しに、通貨を指定すると対JPYの最新レートを表示するスクリプトを書く。

もしhttplib2がなければ、`pip install httplib2`で入れておくこと。

```ruby:forex.rb
#!/usr/bin/env python`
# -*- coding: utf-8 -*-

import sys
import httplib2
import json

app_id='ここにAPP IDを入れる'
api_url='http://openexchangerates.org/api/latest.json?app_id=' + app_id

if __name__ == '__main__':
        client = httplib2.Http()
        response, context = client.request(api_url, "GET")
        rates = json.loads(context)['rates']

        target_currency = sys.argv[1]
        rate = rates['JPY'] * (1.0 / rates[target_currency])
        print target_currency + '/JPY rate is ' + "{0:.2f}".format(rate) + ' now.'
```

最低限レートを取るだけならこれくらいでOK。こんな感じで動く。

```
[shin@tk2-235-27441 sandbox]$ python forex.py EUR
EUR/JPY rate is 140.02 now.
[shin@tk2-235-27441 sandbox]$ python forex.py AUD
AUD/JPY rate is 96.83 now.
[shin@tk2-235-27441 sandbox]$ python forex.py JPY
JPY/JPY rate is 1.00 now.
```

# Appendix.

## 他のサービスは？

同じようにしてWebでREST APIから為替レートを取るサービスはいくつもある。有名どころ……というか、信頼性が高いと思われる提供元としては、

* QANDA
  * https://www.oanda.com/rates/
* XE
  * http://www.xe.com/datafeed/
* xurrency
  * http://xurrency.com/

あたりが挙げられる。ただし、ちゃんとした提供元のサービスは相応の利用料金が掛かるので、個人が使うのは敷居が高い。

信頼性がよくわからないが無料で使えるサービスとしては、

* Exchange Rate Lab
  * http://www.exchangeratelab.com/
* Fixer.io
  * http://fixer.io/

があるようだ。どこからレートを取ってきているかよくわからないし、サービスの継続性も何とも言えないが、とりまお遊びで使うならこのあたりでもよいだろう。

## APIの使用状況は？

無料プランだとAPIの呼び出しに回数制限があるのだが、どれくらい使ったかは以下のページから分かる。パスワードの変更なんかもここからできる。

https://openexchangerates.org/account/usage
【VMWare】VMwarePlayerでディスク拡張やった時のメモ(Linux環境)

Oracle検証用途でVM上のLinux環境にOracleをインストールしようとしたところ、SEを入れるのに容量が足りず、怒られてしまった時の対処メモ。

参考にしたのはこの<a href="http://junrei.dip.jp/wordpress/vmware/vmware%E3%81%AE%E3%82%B2%E3%82%B9%E3%83%88os%EF%BC%88centos6-4%EF%BC%89%E3%81%AE%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E5%AE%B9%E9%87%8F%E3%82%92%E5%A2%97%E3%82%84%E3%81%99%E6%96%B9%E6%B3%95/">サイト</a>です。


1.仮想ディスクの拡張
兎にも角にも検証環境にディスク容量が足りないため、VMの設定からディスクを拡張します。
元々は、HDDは20GBを確保しました。
そこに追加の容量として、10GB追加しました。
まずは、OSの電源をオフにして、以下の画像の順に拡張します。
![aws_000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/59666/01e4b13e-c894-80bb-2b77-76cf13ab68b7.jpeg)

![aws_000009.JPG](https://qiita-image-store.s3.amazonaws.com/0/59666/eae54c8f-e448-d9b6-37c2-1df817635b9c.jpeg)

![aws_000010.JPG](https://qiita-image-store.s3.amazonaws.com/0/59666/92158c49-8700-9d88-5980-66ad78a9e8d5.jpeg)

![aws_000011.JPG](https://qiita-image-store.s3.amazonaws.com/0/59666/c4642023-838b-9393-fdd8-bbe585c591b8.jpeg)

2.容量を確認する
追加した容量を確認します。
`# fdisk -l`

検証環境では、/dev/sda1,/dev/sda2まで使っていたので、/dev/sda3を追加します。
`# fdisk /dev/sda3`

| オプション | 説明 |
|:----------|------:|
| n | 新規作成 |
| p | 基本パーティションを選択 |
| p | パーティション情報を表示する |
| w | パーティション情報を書き込んで終了する |

この後、OSを再起動します。

3. LVMの設定を行う
・物理パーティションの作成(パーティションを初期化する)
`# pvcreate /dev/sda3`

・(ボリュームグループに物理パーティションを追加するため)ボリュームグループの確認する。
`# vgdisplay`
「VG Name」の値が確認すべき箇所です。

・ボリュームグループに物理パーティションを追加する。
`# vgextend ボリュームグループ名  /dev/sda3

・LVMのサイズを拡張する。
`#lvextend －L  +10232MB /dev/VG名/LV名
-Lで指定する値は、vgdisplayで「PE Size」と『Free PE」を掛けた値です。

・ファイルシステムのリサイズ
`# df -h`
拡張前に領域のサイズを確認しておきます。

`# resize2fs -f /dev/VG名/LV名`
`# df -h`
拡張した領域がサイズが変化しているかを確認します。


以上。
LPICの受験のために勉強していたものの初めてコマンドを打ちました。
やはり机上だけでなく実践が第一だなぁと感じました。

※参考サイト
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230775/
C#の構成ファイルまとめ


ややっこしいのでメモ。

# *.cscfg

WebRole,WorkerRoleプロジェクトを作成するとできる。
Azure WebSitesがあるので今後はあまり使われなくなるのかも。

## 環境ごとの設定
環境ごと(Production,Stagingなど)の設定ができる。
ex)ServiceConfiguration.Production.cscfg

## 反映方法
パッケージの再作成が不要。また、Azure管理ポータルから直接変更ができる。

# app.config／web.configの\<appSettings\>

## 環境ごとの設定
環境ごと(Production,Stagingなど)の設定ができる。
ex) web.Debug.config

## 反映方法
パッケージの再作成が必要。

# app.config／web.configの\<applicationSettings\>
データの型指定ができる

## 環境ごとの設定
できない。app.Debug.configのように作成しても読み込むのは、app.config(Settings.settings)に記述されている値

## 反映方法
パッケージの再作成が必要。

# Settings.settings
プロジェクトを右クリックして「プロパティ」　-> 「設定」で表示される。

これは、

* スコープをアプリケーションにするとapp.config／web.configの\<applicationSettings\>に記述される
* スコープをユーザにするとapp.config／web.configの\<userSettings\>に記述される

ちなみにユーザースコープのパラメータはプログラムで変更保存が可能。

# 取得時の動作

## CloudConfigurationManager.GetSetting(name)

これは、最初に```*.cscfg```を見に行き、無ければ、```app.config／web.configの<appSettings>```を見にいく

## (Web)ConfigurationManager.AppSettings[name];

```app.config／web.configの<appSettings>``` を見にいく

## Properties.Settings.Default.＜name＞
```app.config／web.configの<applicationSettings>``` を見にいく
user　default


```objectivec
+ (void)setUserDefault:(id)data key:(NSString*)key
{
    NSUserDefaults* ud = [NSUserDefaults standardUserDefaults];
    [ud setObject:data forKey:key];
    [ud synchronize];
}

+ (NSString*)getUserDefaultString:(NSString*)key
{
    return [[NSUserDefaults standardUserDefaults] stringForKey:key];
}

+ (NSArray*)getUserDefaultArray:(NSString*)key
{
    return [[NSUserDefaults standardUserDefaults] arrayForKey:key];
}

+ (NSMutableArray*)getUserDefaultMutableArray:(NSString*)key
{
    return [[[NSUserDefaults standardUserDefaults] arrayForKey:key] mutableCopy];
}

+ (NSDictionary*) getUserDefaultDiction:(NSString*) key
{
    return [[NSUserDefaults standardUserDefaults] dictionaryForKey:key];
}

+ (NSMutableDictionary*) getUserDefaultMutableDiction:(NSString*) key
{
    return [[[NSUserDefaults standardUserDefaults] dictionaryForKey:key] mutableCopy];
}

+ (NSInteger)getUserDefaultInteger:(NSString*)key
{
    return [[NSUserDefaults standardUserDefaults] integerForKey:key];
}

+ (float)getUserDefaultFloat:(NSString*)key
{
    return [[NSUserDefaults standardUserDefaults] floatForKey:key];
}

+ (BOOL)getUserDefaultBool:(NSString*)key
{
    return [[NSUserDefaults standardUserDefaults] boolForKey:key];
}
```
[正規表現] ブラケット内の角閉じ括弧

ちょっと嵌ったので覚書。

##環境
OS：Linux Mint 17.1 “Rebecca” KDE
sed：sed (GNU sed) 4.2.2

##経緯
自宅にある写真や音楽ファイルの管理には基本的にファイル名にタグを書き込んで管理している。
というのもファイル名そのものに発売日や撮影日、アーティストや撮った場所などを書き込んで、音楽管理ソフトやアルバムソフトなどを使わずともごく一般的なエクスプローラーでも並び替えが可能となるようにしている。

そこでタグの囲い込みに使っているのが半角の角括弧である。

☆一例

* [2010-05-03][ディズニーランド] P1000640.jpg
* [2015-04-15][ポルノグラフィティ] オー！リバル

的な感じで。
スクリプトで一括操作する際もfindかforとsedを用いて色々するのにも都合がいい。

##問題のファイル
[2014-11-05][ネット] PS553[ad] nnc.jpg

どうやらネットから落としてきた画像に面倒くさいものが混じっていたらしい。
[ad]←広告の画像という時点でどうかしていると思うが更に半角空白まで混じっている。
しかし、自動化の本質はエラーなくいかなる状態のものでも扱えることが究極なのだから扱えるようにしたい。

タグとファイル名を分けて抽出するsedを組んでいたのだが・・・

```shell-session:NG例
for i in *.*; do echo $i | sed -r 's/^\[(.+)\]\[(.+)\] (.+)\.([^.]+)$/\1,\2,\3,\4/' >> export.csv; done
```

これだと
**2014-11-05,ネット] PS553[ad,nnc,jpg**
になってしまう。
sedは最短一致させる場合**`(.+?)`**が何故か使えない。

sedで最短一致をしたければ一致させたい文字（今なら**`]`**）を除いて繰り返す事になる[^1]。
（つまり**`[^{一致させたい文字}]+`**）

ということで、角閉じ括弧をブラケット（**`[]`**のこと）の中に入れたいのだがどうしたら・・・
角閉じ括弧の繰り返しなら**`[\]]`**となるのだが・・・
**`[^\]]`**←でいいのだろうか？

```shell-session:NG例2
for i in *.*; do echo $i | sed -r 's/^\[(.+)\]\[([^\]]+)\] (.+)\.([^.]+)$/\1,\2,\3,\4/' >> export.csv; done
## >> [2014-11-05][ネット] PS553[ad] nnc.jpg
```

どうやら違うようです。
ということは・・・

```shell-session:OK
for i in *.*; do echo $i | sed -r 's/^\[(.+)\]\[([^]]+)\] (.+)\.([^.]+)$/\1,\2,\3,\4/' >> export.csv; done
## >> 2014-11-05,ネット,PS553[ad] nnc,jpg
```

やはりエスケープしなくていいのね。
解決〜


[^1]: [[正規表現] .*?は最短マッチではない](http://qiita.com/muran001/items/472abcfc353d5df7b77a#%E6%9C%80%E7%9F%AD%E3%83%9E%E3%83%83%E3%83%81%E3%81%95%E3%81%9B%E3%82%8B) を参照
PHPWarriorで学ぶ役に立たないPHP芸 その1 #phpwarrior


RubyWarriorをPHPに移植したPHPWarriorを地味にメンテしています。

[yandod/php-warrior](https://github.com/yandod/php-warrior)

<iframe width="560" height="315" src="https://www.youtube.com/embed/Pt_qerDO28c" frameborder="0" allowfullscreen></iframe>

PHPWarriorはPHPで戦士に指令を与えて塔を登っていくというゲームです。
ゲームをクリアするだけならば標準の1メソッド内に素直なロジックを書いていく事になりますが、PHPの構文の許す範囲でトリッキーなコードや整理されたコードを書く余地もあります。

たとえば2面で使うことになる前方に敵が居たら攻撃し、そうでなければ歩くというコードは素直に書くと次のようになります。

```php
<?php
class Player {

    public function play_turn($warrior) {
        # add your code here
        if ($warrior->feel()->is_enemy()) {
            $warrior->attack();
        } else {
            $warrior->walk();
        }
    }
}
```

元祖であるRubyWarriorをプレイした人をみていると例えばifを使わないという縛りプレイがあります。ここから連想したのがswitchにtrueを与える次の形式です。

```php
<?php
class Player {
    public function play_turn($warrior) {
        switch (true) {
            case $warrior->feel()->is_enemy():
                $warrior->attack();
                break;
            default:
                $warrior->walk();
        }
    }
}
```

業務ならまずしないであろうコーディングですが、かつてhaltさんが書いたWikiパーサーの中にあって鮮烈な印象を受けた記憶があります。

続き
[PHPWarriorで学ぶ役に立たないPHP芸 その2 #phpwarrior - Qiita](http://qiita.com/yando/items/2f6847c215453acd58eb)