OmniAICreator/Qiita-1.07M huggingface dataset:
EC2インスタンスのOpenSSLのHeartbleed Bug対応


あんまりよくないバグみたいなので、サクッと対応しておきましょう。

The Heartbleed Bug
CVE-2014-0160
http://heartbleed.com/

## 既存のEC2インスタンスはどうすればいいの？

AWSは本当に対応早いです。
Amazon Linuxならyumで対応できます。

```
sudo yum clean all
sudo yum update openssl
```

した後、依存しているサービスをリスタートしてOKです。

opensslのバージョンが1.0.1eになったままになっているけど、パッチは当たっているから大丈夫だよって書いてあります。
Versionのところが`openssl-1.0.1e-37.66.amzn1`以上かだけチェックはした方が良さそうです。

	The updated package is openssl-1.0.1e-37.66.amzn1

	Please note that even though this package is still named openssl-1.0.1e, it does contain the patches that were made available upstream for CVE-2014-0160.


それでもうまくいかない場合は`/etc/yum.conf`を編集する必要があるそうです。
http://qiita.com/tachiba/items/83e5fd31d06e6577abb3#comment-cc6c93ef2cbed5be5d51

	Did you try "yum clean all" first?
	Are you sure that your "releasever" in /etc/yum.conf is set to "latest"?

## あたらしく立てるインスタンスは？

自動でインストールされているらしいです。

	Because this update has been marked as a "Critical", new launches of the Amazon Linux AMI will install it by default, as discussed in https://aws.amazon.com/amazon-linux-ami/faqs/#auto_update

## ELB使ってるんだけど...

ELBでSSL terminationを使用している場合の脆弱性が認められたとのことです。

ですが、修正されたようです。
SSL terminationを利用されていた方は証明書の更新を推奨されています。

日本語のページができていました。

[AWSからOpenSSLの脆弱性について AWS のサービスアップデート](http://aws.amazon.com/jp/security/security-bulletins/aws-services-updated-to-address-openssl-vulnerability/
)


[Update an SSL Certificate for a Load Balancer](http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/US_UpdatingLoadBalancerSSL.html
)

[HeartBleed Bug Concern](http://aws.amazon.com/security/security-bulletins/heartbleed-bug-concern/
)


こちらはフォーラムのスレッドです。

[Is AWS Elastic Load Balancing affected by the HeartBleed bug](https://forums.aws.amazon.com/thread.jspa?threadID=149690
)

[Heartbleed Load Balancer Vulnerability CVE-2014-0160](https://forums.aws.amazon.com/thread.jspa?messageID=535185&#535185
)

	We can confirm that load balancers using Elastic Load Balancing SSL termination are vulnerable to the Heartbleed Bug (CVE-2014-0160) reported earlier today. We are currently working to mitigate the impact of this issue and will provide further updates.

--

cf.)

[existential type crisis : Diagnosis of the OpenSSL Heartbleed Bug](http://blog.existentialize.com/diagnosis-of-the-openssl-heartbleed-bug.html
)
My brewfile


```
tap phinze/homebrew-cask || true
tap homebrew/versions|| true
update || true

install brew-cask || true

install git || true
install openssl || true
install readline || true
install wget || true
install curl || true
install cmake || true
install libtool || true
install automake || true
install ruby-build || true
install rbenv || true
install pyenv || true
install sqlite || true
install mongodb || true

cask install keyremap4macbook || true
cask install dropbox || true
cask install skype || true
cask install google-chrome || true
cask install firefox || true
cask install kobito || true
cask install virtualbox || true
cask install sublime-text || true
cask install iterm2 || true
cask install appcleaner || true

cleanup
```
Emacsで文字コード変更する

すぐ忘れちゃうのでメモっとく。

１，ファイルを開く
２，C-x RET f
３，任意の文字コードを入力してターンッ！

※保存を忘れずに！

他の方も結構投稿されてたのでそっちをストックしておくべきでした......
WPF Windowに配置されたコントロールを列挙する

`LogicalTreeHelper`クラスの`GetChildren()`メソッドを使用することで、`DependencyObject`の子要素を取得することができます。
これを再帰的に呼び出すことで、Windowに配置されたすべてのコントロールを列挙することが可能です。

参考：[MSDN : LogicalTreeHelper.GetChildren メソッド (DependencyObject)](http://msdn.microsoft.com/ja-jp/library/ms598654\(v=vs.110\).aspx)

## サンプルコード

`DependencyObject`の拡張メソッドとして実装してみました。

```csharp:DependencyObjectExtension.cs
public static class DependencyObjectExtension
{
    /// <summary>
    /// WalkInChildrenメソッドの本体
    /// </summary>
    /// <param name="obj">DependencyObject</param>
    /// <param name="act">Action</param>
    private static void Walk(DependencyObject obj, Action<DependencyObject> act)
    {
        foreach (var child in LogicalTreeHelper.GetChildren(obj))
        {
            if (child is DependencyObject)
            {
                act(child as DependencyObject);
                Walk(child as DependencyObject, act);
            }
        }
    }

    /// <summary>
    /// 子オブジェクトに対してデリゲートを実行する
    /// </summary>
    /// <param name="obj">this : DependencyObject</param>
    /// <param name="act">デリゲート : Action</param>
    public static void WalkInChildren(this DependencyObject obj, Action<DependencyObject> act)
    {
        if (act == null)
            throw new ArgumentNullException();

        Walk(obj, act);
    }
}
```

```csharp：MainWindow.xaml.cs
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        // コントロールのロードが完了したら、すべてのコントロールをDebugウィンドウに出力する
        Loaded += (o, e) =>
        {
            this.WalkInChildren(child =>
            {
                System.Diagnostics.Debug.WriteLine(child);
            });
        };
    }
}
```

## 実行例

適当なWindowに対して実行してみた結果。

> System.Windows.Controls.Grid
System.Windows.Controls.RowDefinition
System.Windows.Controls.RowDefinition
System.Windows.Controls.RowDefinition
System.Windows.Controls.Grid
System.Windows.Controls.ColumnDefinition
System.Windows.Controls.ColumnDefinition
System.Windows.Controls.ListBox Items.Count:4
System.Windows.Controls.StackPanel
System.Windows.Controls.Button: Add Item
System.Windows.Controls.Button: Delete Item
...
Google Compute Engine 入門


#スライド
+ Google Compute Engine 入門  
http://www.slideshare.net/YukoOshima/google-compute-engine-33723588

#準備

+ Google Compute Engine を使うための準備（プロジェクト登録編） - Qiita
http://qiita.com/yuko/items/e640da8f0b9fbcf28dda

+ Google Compute Engine を使うための準備（Google Cloud SDK インストール - Windows 編） - Qiita
http://qiita.com/yuko/items/643c4364d05d86d002f9

+ Google Compute Engine を使うための準備（Google Cloud SDK インストール - Linux & OS X 編） - Qiita
http://qiita.com/yuko/items/aaac6ea9536cd529106f

#ハンズオン
+ ハンズオン : Google Cloud SDK 基本と認証 - Qiita
http://qiita.com/yuko/items/1c4ee5b081c5b6a3ac8a

+ ハンズオン : gcutil コマンドで Google Compute Engine のインスタンスを作成する - Qiita
http://qiita.com/yuko/items/4f4a7aa887ee487d4886

#その他
+ Google Developer Console を日本語にしたい - Qiita  
http://qiita.com/yuko/items/0a23aac24bdd10812832
redisのslowlogの見方をすぐ忘れる

```
redis-cli slowlog get 5

1) 1) (integer) 71212
   2) (integer) 1396929254
   3) (integer) 10839
   4) 1) "del"
      2) "Post:1223173:notification_event:commented:773502"
```

1) 自動採番されたID

2) コマンド実行時のUnixタイムスタンプ

3) コマンド実行にかかった時間､マイクロ秒単位

4) コマンドとそのパラメータ

良く忘れるので、グーグルで検索した結果

https://github.com/craftgear/the-little-redis-book/blob/master/ja/redis.md

↑　これ見ます！いいですね！これ！
audit.logのUnix時間なタイムスタンプを見やすくするワンライナー

audit.logを確認している際にいつ出力されたログだろうっと思っても、タイムスタンプがUnix時間で記録されてて、あぁ (~_~) てなること多いと思います。

一行くらいの確認だと、dateコマンドの@を使って変換してましたが、、、

```shell-session
# date --date=@1396918226.579
2014年  4月  8日 火曜日 09:50:26 JST
```

タイムスタンプをコピペするのも面倒なので、マルっと変換するようなコマンドをawkのワンライナーを考えてみました。

```shell-session
# awk 'match($0,/[0-9]+/){print strftime("%c",substr($0,RSTART,RLENGTH)),$0}' /var/log/audit/audit.log

2014年04月08日 09時50分26秒 type=USER_LOGIN msg=audit(1396918226.579:2773): user pid=562 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=login acct=28756E6B6E6F776E207573657229 exe="/usr/sbin/sshd" hostname=? addr=10.0.2.15 terminal=ssh res=failed'
```

awkへ渡しているスクリプトを少し解説しますね。

```shell-session
# awk 'match($0,/[0-9]+/)          # Unix時間の文字列を前方一致でマッチさせる \
      {print strftime("%c",        # Unix時刻をstrftimeで読みやすいフォーマットに変換する \
       substr($0,RSTART,RLENGTH)), # substrで正規表現にHitしたUnix時刻を切り出す \
      $0}                          # 変換した日時と変換前のログを合わせて出力する \
        ' /var/log/audit/audit.log
```

ちなみに正規表現にマッチしたところを切り出す処理は[こちら](http://d.hatena.ne.jp/Rocco/20071120/p6)を参考にさせていただきました。

あと、[SELinuxな資料](http://www.slideshare.net/ishikawa84g/hbstudy-28-selinuxhandson)見てたところ、ausearch使えばログが見やすくなるって記載ありましたが、そんな達人なコマンド、頭に入ってませんよー、ってことでご了承お願いします。(^_^;)

ではでは。
MySQLへユーザー追加の手順 grant, revoke

# ユーザー作成: CREATE USER

```sql
CREATE USER '{username}'@"{from_domain(ipaddress)}" IDENTIFIED BY "{password}";

ex) 
CREATE USER 'watashi'@"192.168.%" IDENTIFIED BY "hoge";
CREATE USER 'watashi'@"172.21%" IDENTIFIED BY "hoge";
```

新規ユーザーの場合、↑をmysql.dbに流し込むと自動で、mysql.userにレコードが出来る。
このとき、権限はなんにもない状況。

# 権限の付与: GRANT

## 主な権限の種類
|コマンド|内容|
|:-----------|:-----------|
|all / ALL PRIVIREGES|全ての権限を与える|
|create|テーブルを作成する権限を付与する|
|alter|テーブルを変更する権限を付与する|
|drop|テーブルを削除する権限を付与する|
|index|インデックスを作成/削除する権限を付与する|
|その他 select,update,insert,delete,truncate....| 各テーブル操作の権限を付与する|

## GRANT文の書き方

```sql
GRANT 権限 ON レベル(対象DB or Table) TO 対象ユーザー;
```

## 権限情報管理テーブル
|テーブル名|説明|
|:-----------|:-----------|
|user|ユーザーのグローバルレベルの権限とパスワードを管理するテーブル|
|db|ユーザーのデータベースレベルの権限を管理するテーブル|
|host|dbテーブルにホスト名が指定されていない場合に適用される権限を管理するためのテーブル|
|tables_priv|ユーザーのテーブルレベルの権限を管理するテーブル|
|columns_priv|ユーザーのフィールドレベルの権限を管理するテーブル|
 

## 例文

```sql
GRANT SELECT, INSERT, UPDATE  ON hoge.* TO watashi@"192.168.%" IDENTIFIED BY "password";
```

### 意味
```html
192.168.~のIPアドレスから、passwordというパスワードでアクセスしてきた、watashiというユーザーに、hogeというDB内へのすべてのリソースに、select/insert/updateをする権限を与える。
```

# 権限の削除

## 例文

```sql
REVOKE SELECT ON *.* FROM watashi@"192.168.%";
```

## 特定のユーザーからすべての権限を削除したい場合

```sql
REVOKE ALL PRIVILEGES, GRANT OPTION FROM watashi@"192.168.%";
```

# GRANT, REVOKE実行後に行うこと

## 以下のコマンドを叩く

```sql
FLUSH PRIVILEGES;
```

# パスワードの設定・変更

## 書式
```sql
SET PASSWORD FOR {username}@"{from_ip_domain}"=PASSWORD('{password}');
```
## 例文
```sql
SET PASSWORD FOR watashi@"192.168.%"=PASSWORD('watashi');
```

# 参考
http://dev.mysql.com/doc/refman/5.7/en/grant.html
http://dev.mysql.com/doc/refman/5.7/en/revoke.html
http://dev.mysql.com/doc/refman/5.7/en/grant-table-structure.html
http://www.dbonline.jp/mysql/user/index6.html
http://linux.kororo.jp/cont/server/mysql_user.php
JSでSingleton

毎度忘れるのでメモ。
コマいのはあるけど大抵事足りる。

```js
var Foo = function(){
  //Singleton
  if (!Foo.instance) {
    Foo.instance = this;
    this.init.apply(this, arguments);
  }
  return Foo.instance;
};
Foo.getInstance = function(){
  return new Foo();
};
Foo.prototype.init = function(){
  console.log("Foo init");
};
```

```js
Foo.getInstance();
new Foo();
Foo();
```
Adobe Photoshop Scripting 関連の情報


## やりたいこと

Photoshopの処理を自動化したい。
現状は、iOSの@2xのファイルや、Androidのdrawableの各サイズを自動作成はしているが、もうちょっといろいろやりたいので、各オブジェクトが持っているプロパティやメソッドを調べたかった。

## 環境

- Max OS X 10.9.2
- Adobe CS6
	- Adobe® Creative Suite® 6 Design & Web Premium をフルインストール

## 調べたこと（やりかけ）

### エディタ

JSXの補完が少し効くエディタがある。

- アプリケーション/ユーティリティ/Adobe ユーティリティ - CS6/ExtendScript Toolkit CS6/
	- ExtendScript Toolkit.app

リアルパス

- /Applications/Utilities/Adobe Utilities-CS6.localized/ExtendScript Toolkit CS6


### ドキュメント

- アプリケーション/ユーティリティ/Adobe ユーティリティ - CS6/ExtendScript Toolkit CS6/SDK/Japanese/
	- Adobe Intro to Scripting.pdf

旧バージョンのドキュメントはオフィシャルで公開していた

- http://www.adobe.com/jp/devnet/scripting.html
- http://www.adobe.com/jp/devnet/photoshop/scripting.html


「Adobe Intro to Scripting.pdf」でぐぐるとそれらしいファイルが出てきた。検索オプションで日本語のみとか。

### サンプル

- アプリケーション/ユーティリティ/Adobe ユーティリティ - CS6/ExtendScript Toolkit CS6/SDK/Samples/javascript/

### 参考になりそうなサイト

- http://www.openspc2.org/reibun/AdobeJS/
	- http://www.openspc2.org/reibun/AdobeJS/CS6/index.html
- http://www.openspc2.org/book/PhotoshopCS5/

## たぶん続く

目の前の自動化したかったことは、整理も兼ねて手作業した。
後々調べて追記する予定。
CakePHPでログの振り分け(1つのconfigで複数ファイルに)

##概要
CakePHPのロギング設定で、
bootstrap.phpに書くCakeLog::config()は1つにして
吐き出すファイルを分ける方法です。

##実装
```bootstrap.php
CakeLog::config('sample', array(
    'engine' => 'File',
    'types' => array('jojo', 'dio', 'nukesaku')
));
```
```TestController.php
$this->log('オラオラ', 'jojo');
$this->log('無駄無駄', 'dio');
$this->log('ヌケサク', 'nukesaku');
```
上記の実装で、1つのconfig設定でログファイルがそれぞれ

* jojo.log
* dio.log
* nukesaku.log

に格納されました。

ポイントは **configのfilesを指定しないこと！！**
filesを指定しない場合、type名.logというファイル名で
ログが吐き出されることになります。

filesさえ指定しなければ、他のpath等のパラメータは
任意で指定できます。

ただし、filesによるログローテーションができないので
注意してください。


##詳しい解説
http://book.cakephp.org/2.0/en/core-libraries/logging.html
http://api.cakephp.org/2.5/class-CakeLog.html
↑公式リファレンス(英語)
サーバー障害対応の手順（一秒でも早くサービスを再開させる場合）

自社などでサーバーを管理している場合の障害対応についての覚書です。
サービス停止時間を一秒でも短くしたい場合のやり方です。

# 検知と確認
1. 警報で検知
2. サービスの状況確認

    **本番環境につながるかどうかチェック**
    **└間違ってdevとかstagingを見ちゃうケースもあるので注意**
       **└複数メディアある場合は全部見る**

## case1: WEB死亡
・LVSを設定している場合、LVS側で割り振られなくなるはずなので、1台でも生きていればつながるはず（負荷は上がる）
・もし割り振られていたら何回か更新するとアクセスできない

## case2: DB死亡
・MASTERとSLAVEだったらサービス死亡
・Backup/Batchだと管理系死亡

# 連絡

・上長に連絡
　└Facebookや電話やLineやemer携帯
　　└起きなかったら、電話かけ続けながら次のフローへ

# 一次対応【ユーザーへの影響を最小限に】

## case: ネットワーク機器死亡
・インフラの人に連絡（お願いするしかない）

## case: WEB死亡
・死亡してるのにLVSでアクセスを割り振られているようなら、LVSにて該当するサーバを外す

## MASTER DB死亡
・SLAVEを1台MASTERにあてがう。（昇格ということもあるらしい）
**Behind_Seconds_Masterが0になるまで待ってから**
└でないとMASTERとの差分が出る。
  
・configを書き換え。死亡サーバを外す。

## SLAVE, Batch, Backupサーバ死亡
・configを書き換え。死亡サーバを外す。

# 二次対応【サーバ復活を考える】
## SSHにて接続を試す
つながらなければDRACにて接続

## 原因を探る
・ApacheやMySQLが落ちてるだけなら、立ち上げ直してしばらく様子見
・I/O系のエラーは、DRACにて電源off/on

## 復旧
・問題なければconfigを元に戻す。
**・DB系はデータの欠損があればログからデータ復旧を目指す。**

# 備考
いずれも、生きてるサーバの負荷に注意。

# 詳細な原因究明と対策
後日にちゃんと行います。
[CakePHP]リクエストパラメータでとってきた値の中の文字列検索メソッド

cakephp始めました。
php自体触っていたのがずっと前なので、とりあえずメモ。

検索ボタン押下時のなどの処理に使える、リクエストパラメータで取ってきた値の処理の一つ。
該当の文字列があるかないかチェックするメソッド。

```php
if (!array_key_exists('hoge', $this->request->data)) {
  return;
}
```
FuelPHP開発入門_01

最近FuelPHPというのを始めたので書く。

## FuelPHPの特徴
+ JSON,XMLでのデータ吐き出しが容易
	+ コントローラー側:$this->response($data);
	+ http://localhost/コントローラ/メソッド.xml
		+ →XMLで返却
	+ http://localhost/コントローラ/メソッド.json
		+ →JSONで返却
	+ http://localhost/コントローラ/メソッド.php
		+ →PHP配列で返却
	+ **ひとつのメソッドでXMLもJSONもPHP配列もCSVも返却できる！**
+ RESTコントローラの利用が容易
+ BootStrap標準装備
+ デバッグ機能
+ プロファイラ標準装備

個人的な印象としては、Webアプリ開発にはCakePHP、モバイル連携にはFuelPHPが適しているというイメージがあります。
CakePHPだとメソッドごとに切り替えられるレイアウトファイルが、Fuelだとコントローラーごとにしか切り替えられないとかあるようで。
詳しい話は後ほど。

## 必要なもの
- PHPの動くサーバー(要バージョン確認)
- FuelPHP本体
- 読み書き可能なデータベース

必要な物はこれくらい。
あとはTeraPadとかのテキストエディタ（文字コードが変更できるものが良い）、もしくはEclipseやAptanaStudio、PhpStormなどのIDE。

FuelPHP本体は[FuelPHP](http://fuelphp.com/)からDLします。
DLしたものは（今回はfuelphpという名前で）htdocs直下に設置。

次回からソースコードに入っていきます！
UIWebViewを非同期で使う

UIWebViewの普通の使い方は以下の通り：

```objc
    [self.webView loadRequest:r];
```

しかしこの動かし方は同期的なので、メインスレッドを消費してしまう。

そこでAFNetworkingで用意されている非同期版UIWebViewを使う。

```objc:ViewController.h
#import <AFNetworking/AFNetworking.h>
#import <AFNetworking/UIWebView+AFNetworking.h>
```

```objc:ViewController.m
    [self.webView loadRequest:r
                     progress:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite){
        NSLog(@"%lu bytes has been written", (unsigned long)bytesWritten);}
                      success:^NSString *(NSHTTPURLResponse *response, NSString *HTML){
        return HTML;}
                      failure:^(NSError *error){}
     ];
```

これで非同期でUIWebViewにWebページを読み込むことができる。
Picklesプラグイン「sitemapExcel」

Picklesで、エクセルファイル(*.xlsx)でサイトマップを管理できるようにするプラグイン。
⇒　[最新版ダウンロード、使い方はこちら](https://github.com/tomk79/PxPlugin_sitemapExcel)

#留意点
* Excelの1シート目のみをサイトマップと認識する。2シート目以降は無視される。
* ダウンロードしたエクセルファイル内の以下のセルにはシステムが処理する文字列が記載されているので削除しないように注意！

##[A1]セル
定義行とデータ開始行を指定する。

```
row_definition=8&row_data_start=9&version=0.5.0b2  
```

定義行がnullだった場合、以降の列が無視されてしまうが、 **skip_empty_col** を設定することで、設定した数だけnullが連続しても以降の列を認識してくれる。

```
row_definition=8&row_data_start=9&skip_empty_col=20&version=0.5.0b2
```

##[A17]セル  
データの最終行。最終行で集計などを行う場合、不要行を省くことができる。

```
EndOfData  
```


<br><br>
- - -
![pickles.png](https://qiita-image-store.s3.amazonaws.com/0/39060/dee254d2-bc1a-f846-052d-f0c885b10ded.png)　[Picklesについてはこちら](http://pickles.pxt.jp/)
ちょっとgem試したい時にrbenv-gemset使う

#背景
rbenvでもrvmみたいにgemset使いたい

#準備
rbenv 入れるのは、下記のエントリが分かりやすかった：
http://qiita.com/checkpoint/items/f8e65380d9cb0182218d

[rbenv-rehash](https://github.com/ryansouza/rbenv-rehash) 入ってると、rehash しなくていいよ

```
gem install rbenv-rehash
```

ちょっとgem試したいけど環境汚したくないので、gemsetで管理したい
[rbenv-gemset](https://github.com/jf/rbenv-gemset) を入れる

```
brew install rbenv-gemset
```

#rbenv-gemset 使い方

## gemsetの作成

例えばruby2.1.0でsampleというgemsetを作る

```
rbenv gemset create 2.1.0 sample
```

list コマンドで一覧が見える

```
rbenv gemset list
=> 
2.1.0
  sample
```

active コマンドで現在有効なgemsetが分かる

```
rbenv gemset active
=>no active gemsets
```

作っただけでは、有効にならない

## gemset の選択

.rbenv-gemsets というファイルを作ってgemset名を書いておく

```
echo >.rbenv-gemsets sample
```

すると、そのディレクトリ以下で有効なgemsetがsampleになる

```
rbenv gemset active
=> sample global
```

## gemset の削除

```
rbenv gemset delete 2.1.0 sample
=> deleted sample from 2.1.0
```
.html以外の拡張子ファイルも参照できるようにする

Pickles上で .asp, .aspx 等のファイルを参照できるようにする。

##extensionsファイルの作成
/_PX/_FW/extensions/html.phpを複製してファイル名を変更
aspファイルの場合は　html.php ⇒ asp.php

##asp.php を編集
7行目付近のextensionクラスを変更。
px_extensions_html ⇒ px_extensions_asp

```php:/_PX/_FW/extensions/asp.php
class px_extensions_asp extends px_bases_extension{
...
```

##/.htaccess を編集
4行目の以下の記述に、追加したい拡張子を登録。

```.htaccess
RewriteCond %{REQUEST_URI} /(.*?\.(?:html|asp|aspx|css|js))?$
```

##/_PX/configs/mainconf.ini を編集
[publish_extensions] に追加する拡張子を登録。

```mainconf.ini
[publish_extensions]
; パブリッシュ時の拡張子別の処理の設定
; ('http'|'include_text'|'copy'|'nopublish')
html      = "http"
asp      = "http"
aspx      = "http"
css       = "http"
js        = "http"
php       = "copy"
nopublish = "nopublish"
inc       = "include_text"
```


<br><br>
- - -
![pickles.png](https://qiita-image-store.s3.amazonaws.com/0/39060/dee254d2-bc1a-f846-052d-f0c885b10ded.png)　[Picklesについてはこちら](http://pickles.pxt.jp/)
【Windows7】mailtoでBecky!を起動する設定

# はじめに

ブラウザ等からmailtoで起動するメーラーを変更する方法です。
Becky!以外のメーラーでも同様に設定できると思います。

[Excelでメールを作成する](http://qiita.com/TakamiChie/items/13b697b33ff4607b538c)をやってみたかったので調べました。

# 手順

## [スタート]→[既定のプログラム]→[既定のプログラムの設定]

![b1.png](https://qiita-image-store.s3.amazonaws.com/0/38582/c6067e1b-fdf1-cd51-eb5e-8049999810f5.png)


## プログラムの一覧からBecky!を選択し[規定でこのプログラムで開く項目を選択する]をクリック

![b2.png](https://qiita-image-store.s3.amazonaws.com/0/38582/5f7a41cb-561f-a4e8-d9b4-c8dc27f821c0.png)

## [MAILTO]のチェックボックスにチェックを入れる

![b3.png](https://qiita-image-store.s3.amazonaws.com/0/38582/c9a4ef78-f4c0-e0ca-0fc8-5783859f66f0.png)
サイトマップの留意点

Pickles のサイトマップに関する詳細は以下を参照。
⇒ [Pickles サイトマップ](http://pickles.pxt.jp/manual/sitemap/)

* サイトマップの「path」は「/」からはじまる記述にしないと、パスと認識しないよ。
* トップページの「path」はデフォルトで「/」である認識。
「/top/index.html」などそれ以外の場合は、configファイルの設定変更が必要。

```mainconfig.ini
path_top = "/top/index.html" ; トップページのパス(デフォルト "/")
```

* ページ自体はないが、パンくずやナビゲーションにはインデックスページ（親ページ）として表示させる。リンク先はその子供に相当するページに遷移。 ⇒ [エイリアス機能](http://pickles.pxt.jp/manual/sitemap/#hash_エイリアス機能)

| path |  |
|:-----------|------------:|
| **alias:** /directory/item01.html | ← 同じページ |
| /directory/item01.html | ← 同じページ |
| /directory/item02.html |  |
| /directory/item03.html |  |

* 列を追加した場合、定義行が空欄だとそれ以降の列が無視されてしまうのでダミーを入力しておく
* 定義行に新しい定義を追加する場合、/_PX/configs/sitemap_definition.csv にも追加した定義を明記する。


<br><br>
- - -
![pickles.png](https://qiita-image-store.s3.amazonaws.com/0/39060/dee254d2-bc1a-f846-052d-f0c885b10ded.png)　[Picklesについてはこちら](http://pickles.pxt.jp/)
Pickles mainconf.ini に関するいろいろ

Pickles のコンフィグ設定の詳細は以下を参照。
⇒ [Pickles コンフィグ](http://pickles.pxt.jp/manual/configs/)


# UTF-8 以外のサイトの制作（たとえばShift-jis）
confファイルの出力エンコードを shift-jis にしておけばOK。


```mainconf.ini
output_encoding = "shift_jis" ; 出力エンコード
```

パブリッシュ時に UTF-8 ⇒ Shift-jis に変換されるため、 **制作時はすべて（HTML、CSS、JS等）UTF-8** のデータにして作業を行う。


# ディレクトリインデックスの設定

```mainconf.ini
directory_index = "index.html,index.asp" ; 省略するファイル名(デフォルト "index.html")
```

　前から順にマッチするものを検索し、indexと認識する。「,」で複数指定可。
以下のファイルで、リンク指定が /index.html となっている場合、/ に置換している。

```php:/_PX/_FW/cores/theme.php
$path = preg_replace('/\/'.$this->px->get_directory_index_preg_pattern().'((?:\?|\#).*)?$/si','/$1',$path);
```


<br><br>
- - -
![pickles.png](https://qiita-image-store.s3.amazonaws.com/0/39060/dee254d2-bc1a-f846-052d-f0c885b10ded.png)　[Picklesについてはこちら](http://pickles.pxt.jp/)
【AngularJS】JSONPを受け取る


jQueryだと`$.ajax({url: url, dataType: 'jsonp'})`でJSONPを読み込める．
じゃあAngularJSでは？

# やりかた

`$http.jsonp`を使おう！

コールバック関数名が`JSON_CALLBACK`になるようにパラメータを設定してあげればOK．
（これはAPI提供側が対応してないといけない？）

```javascript:test.js
$http.jsonp('http://example.com/api/test?callback=JSON_CALLBACK').success(function(response){
  // callback
});
```

## パラメータをオブジェクトで渡したいとき

```javascript:test.js
$http.jsonp('http://example.com/api/test', {params: {callback: 'JSON_CALLBACK'}).success(function(response){
  // callback
});
```

のように，`$http.jsonp(url, config)`の第2引数の1要素として渡してあげないといけない．
`$.ajax`とかとはちょっとちがう．
Ansibleで作るxxxの基本設計


Ansibleタグ付けてるけど、あんまり関係ありません。

Ansibleで[いろいろ](https://github.com/search?q=%40volanja+ansible)作っていますが、共通した基本設計があるので、メモがてら書きます。
もし私のplaybookを参考している方がいれば、その一助となれば幸いです。
現在、私事が忙しくあまり進みませんが、統合したものを作れればと思っています。(Aluminum,Kanonの何番煎じ？)



# 基本設計の方針
+ 1台のサーバで複数のソフトウェア(Redmine,Gitlab,Jenkins,etc)を動くようにする。
+ ターゲットOS  
CentOS6.x(64bit)。今だと6.5。
+ シングルサインオン  
各アプリケーションの認証はシングルサインオンできるように、RedmineをOAuthProviderとして使う。  
(OAuthが適切かというと微妙ですが。。)
+ 保守性  
なるべく(?)保守性が高いように。rubyのバージョン違いとかで困らないようにする。

# フロントエンド
+ 外部からのアクセス  
外部のWebブラウザからサブドメインでアクセスする(redmine.hostnameなど)。  
80番ポートでWebサーバがListenしている。  
Webサーバがサブドメインをもとに、各ソフトウェアのListenポートへフォワードする。  
ファイアウォール(iptalbes)は80番を開け、基本的にはソフトウェア毎に開けない。  
(rubyでよくある3000番でListenとかしない。kibana/Elasticseachは無理そうだけど。)
+ Webサーバ  
Nginxを使用する。  
設定ファイルは標準の`/etc/nginx/nginx.conf`のまま。  
フォワードのために、各ソフトウェアの設定ファイルを作成し、`/etc/nginx/conf.d/`に保存する。

# ソフトウェア(xxxの部分)
+ ソフトウェアオーナーユーザ  
ソフトウェア毎に専用ユーザを作成する。  
+ ソフトウェアインストール先  
専用ユーザのホームディレクトリ配下にインストールする。  
rubyなどの言語処理系はユーザ毎にインストールしている。  
rootにはインストールしない。  
手間だけど、RedmineとGitlabなどのRubyバージョンが異なる事が予想されるので、少しでも対応しやすいように。
+ 周辺ソフトウェア  
共通して使えそうなもの(MariaDB,MongoDB,redis)はrootでインストールする。  
だいたいrpmで提供されているのでそれを使う。
+ 起動方法と起動ユーザ  
`/etc/init.d/`内に起動スクリプトを用意する。  
以下のような感じでソフトウェア毎のユーザで起動する。詳細は[こちら](http://qiita.com/volanja/items/383fcd6d2d2e14792723)。  
`daemon --pidfile=${PID} --user=${APP_USER} "起動コマンド"`  
また、`chkconfig`コマンドで自動起動の登録をしておく。
+ pidファイル  
ソフトウェアの標準的な場所に置く。
+ 起動ポート  
ソフトウェア毎に固有のポートでListenする。外部からの直接アクセスはさせない。

# ソフトウェアのテスト
serverspecで書く。Rakefileの作成は自製の[ansible_spec](https://rubygems.org/gems/ansible_spec)を使っている。
severspec以外にAnsibleのAssertという機能で出来るかもしれないけど、まだ調べてもいない。

# ソフトウェアのプラグイン
ソフトウェアのプラグインは、別Roleとする。
Playbook(site.yml)でコメントアウトすれば、プラグインがない状態でインストールできるようにするため。
また、各プラグインはmain.yml内でincludeする。
main.ymlのコメントアウトで不要なプラグインをコントロールできるようにする。
こんな感じ。

```
$ tree roles/redmine-plugins/tasks/
roles/redmine-plugins/tasks/
├── main.yml
├── Redmine-Redcarpet-Formatter.yml
├── redmine_absolute_dates.yml
└── redmine_oauth_provider.yml

$ cat roles/redmine-plugins/tasks/main.yml 
---
- include: Redmine-Redcarpet-Formatter.yml
- include: redmine_oauth_provider.yml
- include: redmine_absolute_dates.yml
```


# データベース
MySQLではなくMariaDBを使用する。
おおよその場合、MySQLの手順のまま使用できる。
個人的に使ってみたいだけなので、PostgreSQLでも良い(が、作る気はない)。

# ログ
基本的には、ソフトウェアのログディレクトリ内に保存する。
Nginxのログは`/var/log/`内にソフトウェア別に保存する(ソフトウェアのログディレクトリ内にすべき？)

# バックアップ
今のところ、ソフトウェア毎の方法のみ。
バックアップというよりは冗長化として、以下も試してみたい。
+ ファイルシステムレベル(GlusterFSなど)
+ データベースレベル(MariaDB Galera Cluster,Spiderエンジン)
+ アプリケーションサーバレベル(HAProxy?)

# 今後やること。
v0.2を出す。(v0.1は[Ansibleアドベントカレンダー25日目の版](http://qiita.com/volanja/items/8362beb5a929a07afee4))
Gitlab,Redmine,Jenkins,AsakusaSatelliteが認証連携した状態で動くように。
（今のところ、JenkinsのOAuthがうまく行かない。）

# 今後やりたいこと。
以下のソフトウェアの構築もAnsibleでやりたい。(いつになることやら。。)
+ Zabbix
+ Sentry
coffee script でクラスをどう表記しようか


## 継承の基本

```
class A
 # プロトタイプ設定
 a: 1
 # プライベート
 b = 2
 # クラスプロパティ
 @c = 3
class B extends A
b = new B()
# これだけ・・・？
b.a # 1
``` 

実は、クラスプロパティも継承されてます。

## 継承先で共有したいオブジェクト
つまり非同期に生成されたインスタンスにも伝播する奴
状態変数に使える
やり方：抽象クラスのクラスプロパティにオブジェクトを置く

```
class A
	# クラス変数
	# 下２つは完全に同じ
	@a = {x: 3, y: 5}
	@a: {x: 3, y: 5}
class B extends A
	# 継承されていたクラス定数を使えるようにする。
	b1 = @a
	b2: @a
	# だめなパターン
	# b3: () -> return @a
	showB1: -> b1
class C extends B
# 別ルート
class B_ extends A
class C_ extends B_
	c1 = @a
	c2: @a
	showC1: -> c1

a = new A()
# undefined
console.log a.a
# {x: 3, y: 5}
console.log A.a
b = new B()
# {x: 3, y: 5}
console.log b.showB1()
# {x: 3, y: 5}
console.log b.b2
c = new C_()
```

階層構造で共有されているかチェック

```

A.a.y += 10
# 以下すべて{x: 3, y: 15}
console.log A.a
console.log b.showB1()
console.log c.showC1()
console.log c.c2

# 以下すべて{x: 36, y: 15}
b.b2.x += 33
console.log A.a
console.log b.b2
console.log b.showB1()
console.log c.showC1()
console.log c.c2

```

結論：クラス間で共有するオブジェクトは抽象クラスでオブジェクトを置く。
個人的にはこっちで書くことにする。

```
class A
	@a = {x: 3, y: 5}
```

状態管理クラスを作りたかったら安易に抽象クラスが知ってることにする

## 「定数」を共有できるのか

方法その１は上のようにして、クラス定数を追う。使うなら使う分だけ上みたいに宣言する。
万が一変更されてしまうと伝播する。
プリミティブだと伝播しない、つまりインスタンスごとに保持される。
定数が多くなると大変だ。

方法その２はパブリックなままだけども、インスタンスごとに保持されて伝播しない、宣言せずに関数内で@Xで呼べる。抽象クラスのプロトタイプに追加する。メモリの無駄になっているのかも。

```
class Parent
	length: 100
	@canvas = canvas.getContext '2d'
class Child extends Parent
	c = @canvas 
	show: () -> c.save().fillRect(1, 1, 1, 1).restore()
	tower: () -> @length
```

## プライベートなプロパティは・・・
基本あきらめる。

やり方はクラス関係ない。例みたいにどこかでクロージャで構造宣言して、コンストラクタで呼び出しを保証してメソッドを追加する。一応インスタンスごとに空間が用意されます。

```
privateMethod = () ->
 _judge = true
 return {
  get: () -> _judge
  reverse: () -> judge = !_judge
 }

class A
 constructor: () ->
   @privater = privateMethod()
# privater.reverse() とかできるようになる。
```


## クラスの書き方
#### 名前空間意識
定義の際にA名前を内部で用いない

```
A = class
 a: 1
 b = 2
 @c = 3
```

#### 通常

```
class A
 a: 1
 b = 2
 @c = 3
```

書いてて気持ちのいいのは後者
宣言してる感じが出るのが前者
よくわかんないので後者を使う。

##### > <
メモ初投稿してみました。自信はないです。
Storyboardで3.5inchディスプレイに手っ取り早く対応する。

実行時にiPadとiPhoneのStoryboardを読み分けるのはプロジェクトに設定を行うだけで、コードを書かなくてもよいのですが、なぜか4inchと3.5inchのStoryboardの読み分けを行うオプションがないので、didFinishLaunchingWithOptionsにStoryboardを読み分けるコードを記述する必要があります。

と、前提を踏まえた上で、手っ取り早く3.5inch対応のための手順を記載します。

Storyboardの作成
1. NewFile...等で、空のStoryboardを作成(ここでは3_5_inch.storyboardとする) 
2. 既存のStoryboard(デフォルトではiPhone.storyboard)を全選択して、コピー。
3. 先ほど作成した空のStoryboardにペースト。
4. Storyboardの右下のアイコンで3.5inch用に切り替える。
http://gyazo.com/8caac61183539ac8b4a845706819d2cd

複雑なレイアウトの場合は修正が必要になるかもしれませんが、大概はこれでOK.

プロジェクトのStoryboardの設定は4inch用のままにしておき、3.5inchのときだけ読みなおすようにします。
サンプルコードは下のようになります。


```objectivec:AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  //3.5inchと4inchを読み分けする
  CGRect rect = [UIScreen mainScreen].bounds;
  if (rect.size.height == 480) {
    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"3_5_inch" bundle:nil];
    UIViewController* rootViewController = [storyboard instantiateInitialViewController];
    
    self.window.rootViewController = rootViewController;
  }

  return YES;
}
```

基本的には4inchのレイアウトを中心に実装を進めて、3.5inch用Storyboardにコピペ、レイアウト切り替えがスムーズに作業が進みます。
mailメソッドの第2引数

Laravelのmailメソッドの第2引数っていうすごいピンポイントなとこであーそういうことねーってのがあったので書いてみる

mailメソッドの使い方はこんな感じ

```php

Mail::send( 'emails.test', array( 'test' => 'テスト' ), function ($e)
    {
        $e->to( 'test@sanple.com', 'テスト' )
           ->subject( 'テストだよーん' )
           ->from( 'admin@test.com', '管理者' );
            
    } );

```

ここで、第2引数で渡している

```php

array( 'test' => 'テスト' )

```

こいつは、viewのテンプレートで使用したい値を配列で指定する。

具体的なテンプレートでの記述はこんな感じ。

```html

<!DOCTYPE html>
<html lang="en-US">
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <h2>{{$test}}</h2>
 
        <div>
            これは{{$test}}です。
        </div>
    </body>
</html>

```

でも

```php

Mail::send( 'emails.test', array( 'test' => 'テスト' ), function ($e)
    {

```

ここで直接渡す配列を指定せずに

```php

$data = array(
    "test" => "テスト",
    "sample" => "サンプル"
);

Mail::send( 'emails.test', $data, function ($e)
    {

```

みたいに事前に渡す配列を定義したい場合って多々あると思う。

その場合、テンプレ側では

```html

<!DOCTYPE html>
<html lang="en-US">
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <h2>{{$test}}</h2>
 
        <div>
            これは{{$sample}}です。
        </div>
    </body>
</html>

```

のように、配列のキーを変数名として宣言する。配列名(ここでは$data)は考慮しなくてよい。

…うん。そもそものサンプル見れば一目瞭然といえばそうなんだけどちょっぴりはまったのでメモ。

ふと連想配列の階層深くなったらどうするんだろーと思ったけどおそらく明日仕事でやるので終わったら追記しよ。

参考サイト
http://kore1server.com/125

いつもお世話になっております。

終わり。
Capybaraってなんぞや？

今日、Ruby on Rails Tutorial最終章を終えたのだが、最後のテストでCapybaraさんにエラーを指摘して頂きました。
その内容がこちら

StaticPages  it should have the content 'Sample App'
 Failure/Error: page.should have_content('Sample App')
 Capybara::ElementNotFound:
   Unable to find xpath "/html"

というもの。

そもそもCapybaraってどういうDSLだっけと思い調べてみました。
Capybaraとは、テストの一種で実際にユーザーがそのWebアプリケーションを使用しているかのように、様々なページを遷移しその際にどこか不具合がないか調べるというもの。なので、イメージとしてはその名の如くカピバラさんが自分が組んだ迷路の中をしゃしゃっと移動し行き止まりもしくわ不具合がないかテストすると感じでしょうか？

なので、xpath”/html”が見つからないと教えてくれている訳です。
しかし、ローカルの環境では全く不具合なく使用できてました。

そう、つまりテストの書き方に問題があったのです。
単純にその部分のテストを書いたときにpathの指定をする前にvisitメソッドを書き忘れていたという、なんともどうしようもないミスでした。。。
システムではなくテストを書く段階でのとんでもないイージーミスでした。。。

それにしても、今回のミスを通してCapybaraさんがいったいどういう働きをしているのか分かり、なんなら少し愛着が湧きました笑

追記
俺の場合はvisitを書き忘れるっていうとんでもないイージーミスでしたが、Stackoverflowで調べてみたら、何人か同じエラーで困っていました。
その原因としてはCapybaraとWebratという同じタイプのテストを同時に走らせており、相性が悪いのかそのためにエラーが起きていました。
解決策としては、WebratのGemを削除、bundle updateして再度トライという意見が最も多かったです。

カピバラとネズミは似た者同士仲が悪いのでしょうか？笑
プライベートメソッドのテスト

個人的に、あまり細かすぎる単位でテストを書くのはお勧めしませんが、
時にはプライベートメソッドのテストが書きたい時もあります。
しかし、ヘッダファイルに宣言していないプライベートメソッドは、
そのままではテストクラスから参照することが出来ません。

例えば以下のようなクラスについて

```objc:PrivateClass.m

#import "PrivateClass.h"

@interface PrivateClass ()

@end

@implementation PrivateClass

/** Private Method */
- (BOOL)privateMethod:(BOOL)flag
{
	return flag;  // 例なので適当です
}

@end

```

この`privateMethod`をテストクラスから呼び出すためには、
テストファイルの方に`PrivateClass`のCategoryを書き、
`privateMethod`を宣言し直します。

```objc:PrivateClassTests.m

#import <XCTest/XCTest.h>
#import "PrivateClass.h"

// PrivateClassのCategory
@interface PrivateClass (PrivateTest)

- (BOOL)privateMethod:(BOOL)flag;  // プライベートメソッドを宣言

@end

@interface PrivateClassTests : XCTestCase

- (void)testPrivateMethod;

@end

@implementation PrivateClassTests

- (void)testPrivateMethod
{
	PrivateClass* pc = [[PrivateClass alloc] init];

	XCTAssertTrue([pc privateMethod:YES], @""); // テストできる
	XCTAssertFalse([pc privateMethod:NO], @""); // テストできる
}

@end

```

冒頭にも書きましたが、個人的には細かすぎる単位でテストを書くのはお勧めしません。

テストは非常に有益ですが、テストを書くことに時間を取られすぎたり、
テスト対象の変更に追随するためのメンテナンスコストが肥大化するなど
費用対効果が合わなくなるリスクも考えられます。

本当に意味のあるテストなのか吟味した上で、計画的にテストを書きましょう。
CoffeeScriptでAsyncTestCaseを書く

## AsyncTestCaseとは
例えばajaxなどで応答を待って、その応答があってからその後のテストを行いたい場合にAsyncTestCaseを使います。自分の場合は、google maps apiのテストを行いたかったのですが、google maps apiのロードには少し時間がかかります。google maps apiのロードを待ってから、そのテストを行う場合のテストケースの書き方がわかったのでメモとして残しておきます。なおテストはCoffeescriptで記述してみます。

## 準備
google maps apiのロードは、&lt;script&gt;タグでapiを指定してもいいのですが、非同期によるテストを行いやすくするため、下記のgistを利用しました。

[gist (GFoley83 / load-google-maps.js)](https://gist.github.com/GFoley83/5953448)

## テストケースを書いてみる 

```Coffeescript:test.coffee
$ ->
  AsyncTestCase "Google Maps API Test",
    "test sample": (queue) ->
      queue.call(
        "prepare google map"
        (callbacks) ->
          onReadyGoogleMap = callbacks.add(
            ->
              geocoder = new google.maps.Geocoder()
              assert(geocoder?)
          )

          $.when(
            loadGoogleMaps(3, null, "en", false)
          )
          .done(
            =>
              onReadyGoogleMap()
          )
      )

      queue.call(
        "next test"
        (callbacks) ->
          :
          :
      )

```

- 最初の $ -> は、こう書いておくとjQueryの準備ができるのを待ってからテストが行われるようになる。
- 非同期のテストはTestCaseのかわりにAsyncTestCaseを使う。
- AsyncTestCaseでは各テストケースに引数を１つ指定する。ここではqueueという名前にしている。
- queueはcallという関数を持っている。call関数は複数書くことでき、1つづつ順に実行される。callの中に書かれたテストが非同期のテストの場合、そのテストが終わるまで次のcallに書かれたテストは行われないという仕組みである。
- callの第一引数はそのcallのテスト内容を示す任意の文字列、第二引数は引数callbacksを持つ関数オブジェクトである。
- callbacksはadd関数を持っている。add関数の引数には何らかの非同期処理が完了した時に実行するテストケースなどを書いた関数オブジェクトを指定する。
- add関数の戻り値も関数オブジェクトである。上の例ではonReadyGoogleMapである。ひとたびadd関数を実行すると、その戻り値であるonReadyGoogleMapが実行されるまで次のcall関数は実行されないようになる。
- onReadyGoogleMapを$.whenのdoneで呼ぶようにする。上の例では、google maps apiが読み込み終わったら、onReadyGoogleMapが実行される。
- onReadyGoogleMapを呼ぶと、callbacks.add()で指定したテストケースが実行される。

## 応用例
- callbacks.add()の戻り値は、$.ajaxのdone()、setTimeout()などで指定することも可能。
- setTimeout()との組み合わせでは、n秒待ってからテストということが可能になる。
カード決済サービス

# Web

自前のWebサービスから直接利用できる決済サービス

## Stripe
* https://stripe.com/jp
* ブランド：VISA, Master, AMEX, Diners, JCB
* 利用料金：無料
* 決済料金：3.6%
* 支払：毎週
* 定期課金：可
* 従量課金：可

## PayPal
* https://www.paypal.com/jp/webapps/mpp/merchant
* 本人確認：免許証などの書類スキャン画像
* ブランド：VISA, Master, AMEX, JCB など
* 利用料金：月額無料
* 決済料金：3.6% + 40円/件
* 決済料金（少額）：決済料金：5% + 7円/件（申請が必要）
* 引出手数料：無料（5万円未満は250円）
* 支払：最短3営業日

## PAY.JP　（PAY株式会社）
* 2018年1月4日付けでBASE株式会社の決済事業部門を分社化
* https://pay.jp/
* ブランド：VISA, Master, AMEX, JCB など
* 利用料金：月額0円
* 決済料金：3.6%、3.0%（VISA, Master）
* 引出手数料：250円
* 支払：月末締、翌月末払い

## paymo biz（AnyPay株式会社）(2019/06/04販売停止、2020/03/31サービス終了)
* https://paymo.life/biz
* ブランド：VISA, Master
* 利用料金：無料、振込：200円（キャンペーン期間中）
* 定期課金：可
* 商品登録タイプ（URLリンク先より支払）

## Yahoo!ウォレット FastPay（2017/04/26新規受付終了、2019/03/30サービス終了）
* https://fastpay.yahoo.co.jp/
* ブランド：VISA, Master
* 利用料金：月額0円
* 決済料金：3.25%
* 支払：月末締め翌月末払い（30～60日）、15日/末締め当月末/翌月15日払い（15～30日）決済手数料＋0.1%

## SPIKE(2018/11/30サービス終了)
* https://spike.cc/
* ブランド：VISA, Master
* 利用料金：月額0円
* 決済料金：無料（月10万円まで、以降3.9% + 30円）

## WebPay (2017/05/31サービス終了)
* https://webpay.jp/
* ブランド：VISA, Master, JCB, AMEX, Dinars
* 利用料金：月額0円
* 決済料金：VISA・Master 3.25%、JCB・AMEX・Dinars 3.40% + 10円
* 支払：月末締め翌月末払い（30～60日）

# リアル

iOS端末（iPhone, iPad, iPod touch）、Android端末にカードリーダを刺してカードをスワイプして決済をするタイプ

## 楽天ペイ
* https://pay.rakuten.co.jp/
* ブランド：VISA, Master, AMEX, Diners, JCB
* 利用料金；月額0円
* 決済料金：3.24%（VISA, Master, AMEX）、3.74%（その他）
* 支払い：翌営業日、翌日（楽天銀行）
* 振込手数料：210円、0円（楽天銀行）

## Square
* https://squareup.com/jp
* ブランド：VISA, Master
* 利用料金：月額0円
* 決済料金：3.25%
* 支払：翌営業日

## Coiney
* http://coiney.com/
* ブランド：VISA, Master, セゾン
* 利用料金：月額0円
* 決済料金：3.25%
* 支払：5日ごと締め10日後以降払い（出金処理をして1～2日、10万未満は200円の手数料）

## PayPal Here
* https://www.paypal.jp/jp/here/
* ブランド：VISA, Master, AMEX
* 利用料金：月額0円
* 決済料金：3.24%
C言語の関数引数の紛らわしいところ



```c
#define MAX 10
void func(int n[MAX])
{
}
```

引数にこう書いても、要素数MAX以外の配列は受け付けないとかいうわけではなく、

```c
int n[1];
func(n);
```

と書いてしまってもコンパイルできてしまう。
関数func内でn[3]とか[5]とか使おうとしていたら当然危険なコードになってしまう。

関数に渡す配列の要素数を指定したい場合は

```c
struct data {
	int n[MAX];
};

void func(struct data *n)
{
}
```

と、構造体を作ってそのポインタを引数にするか、

```c
typedef int data[MAX];

void func(data *n)
{
}

int main()
{
	data n;

	func(&n);

	return 0;
}
```

と、配列のポインタを渡すようにすれば関数に渡す配列の要素数を指定できる。
typedefしなくてもいけるけど

```c
void func(int (*n)[MAX])
{
}

int main()
	int n1[MAX];
	int n2[1];

	func(&n1);
	func(&n2); //ここはコンパイルエラー

	return 0;
}
```

これはなんとなくわかりにくい気がする。
WildFlyのサービス化

# 概要

WildFlyを/etc/init.dに登録しサービスとして動作させる。
WildFlyのディレクトリにスクリプトが存在するのを見つけて使ってみました。

# 環境

* Linux Mint 16 Petra (Ubuntu系)
* WildFly 8.0.0.Final

# 前提

* 実行ユーザ wildfly を作成済み。
* wildfly ユーザでWildFlyをインストール済み。インストールディレクトリを${wildfly.dir}とする。

# 内容

* ${wildfly.dir}/bin/init.d/wildfly.conf に設定を記載する。基本的にはコメントを外すだけ。

```diff:wildfly.conf
- # JBOSS_HOME=/opt/wildfly
+ JBOSS_HOME=${wildfly.dir}

- # JBOSS_USER=wildfly
+ JBOSS_USER=wildfly

- # JBOSS_MODE=standalone
+ JBOSS_MODE=standalone

- # JBOSS_CONFIG=standalone.xml
+ JBOSS_CONFIG=standalone.xml

- # JBOSS_CONSOLE_LOG=/var/log/wildfly/console.log
+ JBOSS_CONSOLE_LOG=/var/log/wildfly/console.log
```

* 起動スクリプトを/etc/init.dにコピー

```bash
$ sudo cp ${wildfly.dir}/bin/init.d/wildfly-init-debian.sh /etc/init.d/wildfly
```

* 起動スクリプトを環境に合わせて修正

```diff:wildfly
- DEFAULT=/etc/default/$NAME
+ DEFAULT=${wildfly.dir}/bin/init.d/wildfly.conf
```

* 起動スクリプトをrc*.dに登録

```bash
$ sudo update-rc.d wildfly defaults
```

* サービスを開始

```bash
$ sudo service wildfly start
```
# その他

CentOSなどRedHat系の場合は、wildfly-init-debian.shの代わりにwildfly-init-redhat.shが用意されています。こちらはchkconfigでサービスとして簡単に登録できそうです。
Vagrant1.5系にアップデートしたらNFSが使えなくなったよってお話


vagrantを1.5系に入れ直してvagrant upしたら変なエラーが・・・

```
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 => 2200 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2200
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Error: Connection timeout. Retrying...
    default: Error: Remote connection disconnect. Retrying...
    default: Error: Remote connection disconnect. Retrying...
    default: Error: Remote connection disconnect. Retrying...
    default: Error: Remote connection disconnect. Retrying...
    default: Error: Remote connection disconnect. Retrying...
    default: Error: Remote connection disconnect. Retrying...
    default: Error: Remote connection disconnect. Retrying...
    default: Error: Remote connection disconnect. Retrying...
    default: Error: Remote connection disconnect. Retrying...
    default: Error: Remote connection disconnect. Retrying...
    default: Error: Remote connection disconnect. Retrying...
    default: Error: Remote connection disconnect. Retrying...
    default: Error: Remote connection disconnect. Retrying...
    default: Error: Remote connection disconnect. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default:
    default: Guest Additions Version: 4.2.16
    default: VirtualBox Version: 4.3
==> default: Configuring and enabling network interfaces...
==> default: Exporting NFS shared folders...
NFS is reporting that your exports file is invalid. Vagrant does
this check before making any changes to the file. Please correct
the issues below and execute "vagrant reload":
...
```

どうやら`/etc/exports`を削除しなきゃいけないらしい。

```
$ vagrant halt 
$ rm -rf /etc/exports #Remove the exports file. 
$ vagrant up
```

これで無事NFSが使えるようになりました。
Unity のビルドで UnityException が出たら


## 事の発端
[ユニティちゃん] (http://unity-chan.com/) がダウンロードできるようになったとのことで、速攻ダウンロードしたのです。

## Unity のバージョン
4.3.4 f1

## Xcode のバージョン
5.1

## iOS の実機で確認しようとビルドしたところ
こんなんが Console に出る
UnityException: Launching iOS project via Xcode4 failed. Check editor log for details.

## 対処法
```bash
$ vim /Applications/Unity/Unity.app/Contents/BuildTargetTools/iPhonePlayer/Unity4XC.xcplugin/Contents/Info.plist
```

この中に

```
        <key>DVTPlugInCompatibilityUUIDs</key>
        <array>
                <string>63FC1C47-140D-42B0-BB4D-A10B2D225574</string>
                <string>37B30044-3B14-46BA-ABAA-F01000C27B63</string>
        </array>
```

こんな箇所があるので

```
                <string>A2E4D43F-41F4-4FB9-BB94-7177011C9AED</string>
```

`</array>` の前にこの行を足してやりましょう。  
保存して、あとはそのままビルドすれば通るようになるはずです。

## 参考
http://forum.unity3d.com/threads/234557-nityException-Launching-iOS-project-via-Xcode4-failed

Unity 4.5 で修正されるとのこと。

## ビルドできました
![kobito.1396884055.514980.png](https://qiita-image-store.s3.amazonaws.com/0/25416/8ac937c2-7a9f-dfa5-e4b1-5ba68865d405.png "kobito.1396884055.514980.png")
Webアプリのフロントサイド動作確認メモ


いつも気にすること

## formコントロール全般

* 必須入力かどうか
* 初期値はあるか
* submit時に必要なパラメータが送信されるか
* ラベル選択でコントロールがアクティブになるか

## 文字入力系(input, textarea)

* プレースホルダーが表示されるか
* 入力文字数上限、下限（未入力OKか）
* 入力文字制限（日本語入力可、英数のみなど）
* 上限文字数を超える文字列をペースト
* 機種依存文字、特殊文字を入力した場合
* サロゲートペアを入力した場合
* HTMLエンティティ（タグ）を入力した場合
* パスワード入力欄は伏せ字になっているか
* XSS, インジェクションが起きないか

## 選択系コントロール(radio, checkbox)

* ラベル選択でコントロールが切り替わるか
* ラジオボタンのグループは正しいか
* ラジオボタンのグループ内で複数選択できないこと
* チェックボックスの状態が切り替わるか（チェック、半チェック、未チェック）

## 選択系コントロール(select)

* 複数選択可かどうか
* マウスホイールまわした場合
* 矢印キーが押された場合

## 日付入力

* 日付整合性
* フォーマット
* FROM - TO の整合性（FROMがTOを上回るときエラーになるか）
* 閏年は考慮されているか
* 祝日などは考慮されているべきか

## リスト、グリッド表示

* ページネーションは正しく動くか
* ソート、表示件数は正しいか

## ナビゲーション

* 現在表示しているページがアクティブになっているか
* パン屑の表示は正しいか

## ポップアップ

* 枠外をクリックした場合の動作
* Tabキーでポップアップ外のコントロール操作ができてもいいのか

## キー操作

* フォーム要素（ボタンなど）にフォーカスして、スペースキーやリターンキーが押されたとき

## tabindex

* 意図した順にフォーカスが移るか
* Shift + Tab


## 非同期通信

* タイムアウト時間、タイムアウトした際の動作
* アプリケーションエラー（返却値がエラーだった場合）
* サーバーエラー（http status 500などが帰ってきた場合）
* プログレスバーやアクティビティインジケータ（くるくる）の表示
* 非同期で描画される領域に崩れがないか
* 非同期通信中にほかのコントロールは操作可能かどうか

## ブラウザバック・フォワード

* ブラウザの戻る・進む機能は問題ないか
* 戻る・進むでページを表示した時、非同期に取得する情報(ajax)は表示されるか
* pushStateを使用している場合、意図したページが表示されるか

## ローカル情報(cookie, localStrage等)

* 別タブで同一アカウントにログイン・ログアウトして問題ないか
* 別タブで別アカウントにログイン・ログアウトして問題ないか
* 別ブラウザで同一アカウントにログインして問題ないか
* cookieの期限
* アプリケーション利用中にcookieやlocalStrage, sessionStrageおよびindexedDBのデータがクリアされた場合どうなるか（ログイン画面に飛ばす、メッセージを表示する等)

## URL

* URLにクエリストリングを付加してページを表示した場合
* faviconは表示されているか
Git でコミットする変更内容を見ながらメッセージを書く

`git commit` に `-v` (`--verbose`) オプションを付けると、コミットメッセージのテンプレートに diff が追加された状態でエディタが開きます。Diff の内容を確認しながらコミットメッセージが書けます。

こんな感じで出ます:

```
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
#       modified:   file.txt
#
# ------------------------ >8 ------------------------
# Do not touch the line above.
# Everything below will be removed.
diff --git a/file.txt b/file.txt
index 257cc56..5716ca5 100644
--- a/file.txt
+++ b/file.txt
@@ -1 +1 @@
-foo
+bar
```

(このオプション、かなり前からあった様ですが、[diff をエディタに表示するスクリプト](https://github.com/magicant/settings/blob/master/vim/ftplugin/gitcommit.vim)を自分で用意して使ってたので気付きませんでした……)
オシャレなホバーエフェクトを実装できるihoverを試してみました

オシャレなホバーエフェクトを実装できるihoverを試してみました。
これを使うと画像を円形に加工して表示したり、マウスオーバーで文字を表示したりできます。

![スクリーンショット 2014-04-07 22.17.55.png](https://qiita-image-store.s3.amazonaws.com/0/8407/9ff6253a-03d9-ab91-971b-eb62d01da981.png)


実際の動作はデモページで確認するのがわかりやすいと思います。
http://gudh.github.io/ihover/dist/index.html

必要なファイルのダウンロードはGitHubから行うみたいです。
https://github.com/gudh/ihover


Zipを解凍するといろいろなファイルが用意されていますが、必要なのはsrcフォルダ内のihover.cssだけです。
それ以外のファイルはデモページを動かすのに使うみたいです。


実際にサンプルコードを使って動作確認してみました。ihover.cssがあれば動作しますが、デモ用の画像ファイルも用意されているのでそちらも使って確認しました。画像ファイルは clientフォルダのimagesフォルダ内に用意されています。


用意したファイルはこんな感じです。

![スクリーンショット 2014-04-07 22.26.09.png](https://qiita-image-store.s3.amazonaws.com/0/8407/d293fbd8-2dfd-0008-ec47-89a7702f5f2d.png)

index.htmlの内容は次のとおりです。デモページに記載されていたサンプルコードを元につくってあります。
Bootsrapも使っていますが、表示位置を調整するために使っているだけで、これが無くても問題なく動作すると思います。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <link href="styles/ihover.css" rel="stylesheet">
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.1.0/css/bootstrap.min.css"></link>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.1.0/js/bootstrap.min.js"></script>
  </head>
  <body>
    <div class="row">
      <div class="col-sm-6">
        <!-- normal -->
        <div class="ih-item circle effect1">
          <a href="#">
            <div class="spinner"></div>
            <div class="img">
              <img src="images/assets/2.jpg" alt="img">
            </div>
            <div class="info">
              <div class="info-back">
                <h3>Heading here</h3>
                <p>Description goes here</p>
              </div>
            </div>
          </a>
        </div>
        <!-- end normal -->
      </div>
      <div class="col-sm-6">
        <!-- colored -->
        <div class="ih-item circle colored effect1">
          <a href="#">
            <div class="spinner"></div>
            <div class="img">
              <img src="images/assets/5.jpg" alt="img">
            </div>
            <div class="info">
              <div class="info-back">
                <h3>Heading here</h3>
                <p>Description goes here</p>
              </div>
            </div>
          </a>
        </div>
        <!-- end colored -->
      </div>
    </div>
  </body>
</html>
```

これで実際に動作するのを確認できると思います。
後は他のサンプルコードを参考にしてカスタマイズしていけると思います。
Javaがエラーも吐かずにいきなり落ちたときに疑う箇所

最近CentOS上のJava（OpenJDK1.7.0）がエラーも吐かずにいきなり落ちる（起動途中で死ぬ）珍現象があったのでメモしときます。

原因はスタックサイズでした。-Xssオプションでスタックサイズを増やすと動きました。StackOverflowErrorは常にthrowされるというわけではなさそうです。

他には-Xmsと-Xmxとかのヒープ設定が足りないかJNIを使ってるといきなり落ちることがありそうです。
Excelでメールを作成する

すごいぞ！Excelはメーラーだったんだ！（違

とりあえずExcelからメールを送る例です。仕組みとしては、HYPERLINK関数を使うと任意のURLを作って貼ることが出来るので、それをつかってメーラーを起動するリンクを生成します。

```
=HYPERLINK("mailto:test@example.com")
```
起動するメーラーは、Windowsの関連付けで「mailto:」プロトコルに関連づけられたもの。Windows8の場合、初期状態ではWindowsストアアプリのメーラーが起動します。

メールの表題や本文を指定したい場合は、URLのパラメーターとして、SubjectやBodyなどの値を指定しておきます

```
=HYPERLINK("mailto:test@example.com?subject=てすと&body=さんぷる")
```
文字列の最中に「%0D%0A」を入れれば改行も使えますし、他のセルの値を使うことも可能

```
=HYPERLINK("mailto:test@example.com?subject=てすと&body=さんぷる%0D%0A改行ありの文字列%0D%0A"&NOW())
```
表示上の文字列を変えたいときには、HYPERLINK関数の第二引数を使います。

```
=HYPERLINK("mailto:test@example.com?subject=てすと&body=さんぷる%0D%0A改行ありの文字列%0D%0A"&NOW(),"メール送信")
```
定型的なメールなどはこれで送信してみると、手間が省けていいかもしれませんね。
第20回オフラインリアルタイムどう書く ruby で


オフラインでリアルタイムに「どう書く」をやるイベント
　http://atnd.org/events/48500
の問題「会議の時間」
　http://nabetani.sakura.ne.jp/hena/ord20meetime/
の、実装例。


他の方の解答は
　http://qiita.com/Nabetani/items/5791f8ae1bb5d069a49b
から辿れると思います。

で。
やっぱり ruby( ruby 2.1.1p76 ) で。

```ruby
M=((10*60)...(18*60)).inject(0){ |a,b| a | (1<<b) } # meeting space

def solve(x)
  r=x.split(",").each_with_object( Hash.new{ |h,k| h[k]=0} ){ |s,h|
    raise "invalid format : #{s}" unless /\A(?<name>[A-Z])(?<h0>\d\d)(?<m0>\d\d)\-(?<h1>\d\d)(?<m1>\d\d)\z/=~s
    t0,t1=[[h0,m0],[h1,m1]].map{ |h,m| h.to_i*60 + m.to_i }
    h[name] |= (t0...t1).map{ |x| 1<<x }.inject( &:| )
  }
  ab=( M & ~r['A'] & ~r['B'] & r['Z'])
  t = ['I', 'J'].map{ |ij| (ab & ~r[ij]).to_s(2).reverse.index( "1"*60 ) }.compact.min
  return "-" unless t
  h,m=t.divmod(60)
  return "%02d%02d-%02d%02d" % [h,m,h+1,m]
end

$stdout.sync=true
DATA.map do |line|
  num, src, exp = line.split(/\s+/)
  actual = solve( src )
  ok = actual==exp
  p [ num, src, exp, actual ]
  ok
end.all?{ |x| x }.tap{ |x| p x }

__END__
0 A1050-1130,B1400-1415,I1000-1400,I1600-1800,J1100-1745,Z1400-1421,Z1425-1800  1425-1525
1 A1000-1200,B1300-1800,Z1000-1215,Z1230-1800 -
2 Z0800-2200  1000-1100
```

いつも通りテストデータの大半は省略。

`raise` の後にあるやたら長い正規表現は、名前付きキャプチャというやつで、正規表現を評価するだけでローカル変数に入るという危険なかおりで便利な機能。

実装戦略は、1分単位の情報をつくるというもの。

1分単位の情報は、多倍長整数に格納した。
やりたい処理は論理積と否定なので、組み込みのものがそのまま使える。
1時間連続で空いている部分を見つけるのは、`.to_s(2)` で文字列にして、`.index` で見つけた。
`.index` は、見つからないと `nil` を返すんだけど、`.compact` で `nil` を潰してから `.min`。
もともと `nil` しか入ってないと、`[].min` に相当する処理をするハメになるんだけど、 `[].min` は `nil` なので見つからなかったらそれでわかる。

それとは別に。

Iの人と Jの人の処理 に苦しんでる人が何名かいらっしゃった。

この実装では

 - 「ABIZ の4人の情報から決めた時間」と「ABJZ の4人の情報から決めた時間」の、早い方を採用

という方針で実装している。他には良い方法があまりなさそうな感じ。
LightTableのショートカットキー設定

LightTableのユーザ定義のショートカットキー設定（User keymap）のメモです。（Windows環境）

:toggle-comment-selectionと:smart-indent-selectionは便利なので必須ですね。

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

     :editor {"ctrl-w" [:editor.watch.watch-selection]
              "ctrl-shift-w" [:editor.watch.remove-all]
              "ctrl-alt-w" [:editor.watch.unwatch]
              "ctrl-/" [:toggle-comment-selection]
              "ctrl-i" [:smart-indent-selection]
              "alt-left" [:editor.line-start-smart]
              "alt-right" [:editor.line-end]
              "alt-shift-left" [:editor.line-start-smart]
              "alt-shift-right" [:editor.line-end]
              "f3" [:find.next]
              "shift-f3" [:find.prev]
              "esc" [:find.clear :find.hide]
              "ctrl-pageup" [:window.zoom-in]
              "ctrl-pagedown" [:window.zoom-out]
              "f11" [:window.fullscreen]
              }
     }
 :- {:tabs {"pmeta-w" [:tabs.close]}}}
```

デフォルトではalt-wが:editor.watch.watch-selectionの設定になっているかと思いますが、Windowsではalt-wがメニューバーの「Windows」に吸われるのでctrl-wに変更しています。

ctrl-wはデフォルトでは「タブを閉じる」設定になっているので、`:-`の箇所でその設定を解除しています。

| キー | 適用コマンド | 概要 |
|:---|:---|:---|
|ctrl-q|:workspace.show|Workspaceの表示/非表示|
|alt-c|:toggle-console :clear-console|Consoleの表示/非表示＋クリア|
|ctrl-w|:editor.watch.watch-selection|選択箇所にWatch（実行結果を参照できる箇所）を設定|
|ctrl-shift-w|:editor.watch.remove-all|Watchをすべて解除|
|ctrl-alt-w|:editor.watch.unwatch|選択箇所のWatchを解除|
|ctrl-/|:toggle-comment-selection|選択行のコメント化/解除|
|ctrl-i|:smart-indent-selection|選択行のインデント自動調整|
|alt-left|:editor.line-start-smart|行頭（非空白文字）に移動|
|alt-right|:editor.line-end|行末に移動|
|alt-shift-left|:editor.line-start-smart|（選択しながら）行頭（非空白文字）に移動|
|alt-shift-right|:editor.line-end|（選択しながら）行末に移動|
|f3|:find.next|次の検索マッチ箇所に移動|
|shift-f3|:find.prev|前の検索マッチ箇所に移動|
|esc|:find.clear :find.hide|検索結果のクリア＋検索バーの非表示|
|ctrl-pageup|:window.zoom-in|文字の拡大|
|ctrl-pagedown|:window.zoom-out|文字の縮小|
|f11|:window.fullscreen|フルスクリーンに移行/解除|

※追記 ctrl-left,rightはalt-に変更しました。さらにf11を追加

他にも便利な機能がありそうですが、調べきれていません。
何かいい機能があったら教えて欲しいです。

[つづき](http://qiita.com/kurogelee/items/6275273d9b86343e9e24)