OmniAICreator/Qiita-1.07M huggingface dataset:
複数サイトからRSSの最新情報を取得してTwitterのbotにつぶやかせる


# 事前準備

0. twitterアカウントを作成
0. [twitteroauth/Github](https://github.com/abraham/twitteroauth)をダウンロード
0. APIキーを発行(https://apps.twitter.com/)
このあたりの詳細は[PHPからTwitterツイート(2015年2月版)](http://qiita.com/tsunet111/items/9309801cd3e3bcf6e32a)がとても分かりやすいです。



# 実際につぶやく

RSSのurl一覧は`url.txt`内に改行区切りで記載してある前提です。
DLしてきた`twitteroauth-master`を`twitteroauth`にリネームして、`RSS.php`や`url.txt`と同じ階層に設置しました。
パスなどは環境に応じて適宜変更の必要あり。
TwitterではURLが長いのは致命的なので
[PHPで短縮URLを作成する方法まとめ(全8サイト)](http://syncer.jp/how-to-make-shoten-url)
を参考にURLを短縮しています。

RSSの最新情報の取得については[RSSの最新情報だけを取得(修正&加筆版)](http://qiita.com/ao_love/items/98b9df05893a93f668e9)のままです。

```php:bot.php
<?php

require_once 'twitteroauth/autoload.php';
use Abraham\TwitterOAuth\TwitterOAuth;

// Consumer keyの値
$consumer_key = "取得した値";
// Consumer secretの値
$consumer_secret = "取得した値";
// Access Tokenの値
$access_token = "取得した値";
// Access Token Secretの値
$access_token_secret = "取得した値";


//内容を取得
//改行区切りのテキストファイルから空行無視で取得・改行文字を削除して一行ずつ配列に格納
$url_arr = file("url.txt",FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

$tweet_arr = array();
foreach($url_arr AS $url){
    $RSS = simplexml_load_file($url);
    
    if( $RSS->channel->item[0] ){//RSS2.0
        
        $site_name = (string)$RSS->channel->title;
        $item  = $RSS->channel->item[0];
        $title = (string)$item->title;
        $link  = (string)$item->link;
        $date  = (string)$item->pubDate;

    }elseif( $RSS->item[0] ){//RSS1.0
        
        $site_name = (string)$RSS->channel->title;
        $item  = $RSS->item[0];
        $title = (string)$item->title;
        $link  = (string)$item->link;
        //dc:dateのデータはそのままでは取得できないのでchildrenメソッドを呼ぶ
        $date  = (string)$item->children('http://purl.org/dc/elements/1.1/')->date;

    }elseif( $RSS->entry[0] ){//Atom
        
        $site_name = (string)$RSS->title;
        $item  = $RSS->entry[0];
        $title = (string)$item->title;
        $link  = (string)$item->link->attributes()->href;
        $date  = (string)$item->published;

    }
    

    //タイトルが長すぎる場合は丸める
    $title = mb_strimwidth($title,0,50,"…",'UTF-8');

    //URLを短縮
    $link  = url_shorten_isgd($link);

    //日付を見やすいように整形
    $date  = date("Y.m.d",strtotime($date));

    //表示させたい形に加工
    $tweet = $title."(".$date."更新)".$link."【".$site_name."】";

    //140文字に丸めて配列に格納
    $tweet_arr[] = mb_substr($tweet,0,140,'UTF-8');


}

// つぶやく
foreach($tweet_arr AS $val){
    $connection = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret); 
    $statues = $connection->post("statuses/update", array("status" => $val));
}



//URL短縮関数
function url_shorten_isgd($before_url=''){

    if(!$before_url){
        return false;
    }

    //リクエスト
    $json = @file_get_contents("http://is.gd/create.php?format=simple&format=json&url=".rawurlencode($before_url));

    //取得したJSONをオブジェクトに変換
    $obj = json_decode($json);

    //返却
    return (isset($obj->shorturl) && !empty($obj->shorturl)) ? $obj->shorturl : false;

}
```
このPHPを実行すればその時点での最新を取得してツイートします。
bot的に動かすには、このファイルをcronで動かすことになります。
2D 表現でベストパフォーマンスを目指すなら webGL するっきゃない


## はじめに

タイトルにあんなことを書いてはいますが、これはとある案件で行ったことの忘備録的なものです。
別に `webGL` 宗教というわけでもなく、 **これぐらいの表現をしたかったら webGL なんだな** という感じで捉えて欲しい。

## どんな案件だったか

まずこの案件は初めは

* **3D** の球体に地球のテクスチャを貼ってグリグリ動かしたい
* 球体状には幾つかのオブジェクトが置いてあってインタラクションできる
* 地球には近づいたり、遠くなったりする
* できれば、多くの端末で見せたい ( PC, **SP** <- これが重要 )


という案件でした。割と3Dとかではよく聞く感じの案件ですね(でもやるのは初めてだったので嬉しかった。)
しかしクライアントさまからのご要望で仕様変更となりました。

### 3D は 重いから 2D にしよう

ということでした。
すでにこちらも3Dに胸をウキウキさせて webGL Meet Up に行って初心者丸出しな質問をベテランのエンジニアにしたりしてました。。(もちろん参考サイトから、どうやるのが良さそうか丁寧に説明していただきました！)

ちなみに全体の仕様はそんなに変更はないですが 2D 特有の仕様になりました。

* **2D** の球体に地球のテクスチャを貼ってグリグリ動かしたい
* 球体状には幾つかのオブジェクトが置いてあってインタラクションできる
* 地球には近づいたり、遠くなったりする
* できれば、多くの端末で見せたい ( PC, **SP** <- これが重要 )
* ドラッグで横方向に無限に１周できる(ループ用のMapと合わせて２つの要素をそれぞれ管理するので少し面倒)

しかしそういう判断なら仕方ない。ということでその日の内にプロトを用意して想像とズレがないか確認し、OKをもらえたので一安心。

ちなみにこのとき、私は `svg` を使用してサイトを構築しました。
そしてこれが大きな間違いであることに気づかなかったのですね。

こっから `webGL`にたどり着くまでが長い、、、 

## Two.js で svg を動かす

プロト製作に使用したのは `Two.js`でした。

https://jonobr1.github.io/two.js/

これは、svg をいろいろと動かすことができるようになる ライブラリ。
似たようなので Adobe の `Snap.svg` なるライブラリがあります。物凄く質の高いライブラリなのですが、今回の案件にはファットかなぁということで、最悪困ったら使う。という判断でやめました。

なので `Two.js` は

* 軽量
* 各種イベントが備わっているし、マスクもかけれる (マスクは球体の表現で必要)
* svg のインポートもできる

ができて一見ベストな選択だと思っていました。実際プロトや実装の初めは軽快に動作していました。
しかし、最後のテストでオブジェクトを最終的な数だけ載せると

### 生成が重い上にブラウザが落ちる

という現象に悩まされることになります。
結局こういうライブラリはパス１つ１つなどにイベントを与えて管理できるようにしているんですね(絶望)

ということで、地球上にパスをもったキャラクタを 200体 程度描画したら根をあげました。
これが１回目のピンチ

## 重要な機能を自前で書く

ならばどうするか、簡単ですね。
svg を自前で構成していくだけです。これは意外と簡単でした。
svg の構造さえ分かってれば DOM 作ってるのと同じです。
ただし注意なのは今回素材は `Illustrator` で作成されているのかつ svg の情報がきちんと埋め込まれているという点です。なので `minify` とかしていまうと動かなくなったりします。まぁ全体に gzip かけてもらえばよいのだ。

結果、かなり高速に生成され、動作もある程度高速になりました。そして何よりブラウザが落ちない。
これである程度終わりが見えたかに思えました。

### けど貧弱なPCだと重いんだが

そうです。重いんです。ちなみに僕のは Apple にお布施した高機能な `Mac Book Pro`なので、あんまし気にならないのですが、`ASUS` とかのパソコンだと重い！

原因は

### 領域外の要素も描画されている

です。 DOM にありがちですね。
さて、ということで、今ウィンドウ内にあるオブジェクトを全て計算して出し入れするスクリプトを書くことになります。
このコンテンツは 近ずいたり、遠くなったりと、状況によって範囲が異なるので少々苦労しましたが、
その甲斐もあって、PCならほぼどんな端末でも高速に動く + svg だから綺麗 という結果を手に入れました。

### ちょっと SP だとお話しにならないほど遅いんだが笑

え、、、あんぎゃ〜〜〜〜！ iPhone6, 6+ でさえ、まともに動かない糞コンテンツになってましたとさ。

このとき、気づきました。2D でも webGLを使うしかない。と

## 思い切って webGL にコンバートする

さて、ここには書いていないですが、結構なテストと試行錯誤をして、ようやく `webGL` に移る決心をします。
ただし 2D 。

そこで使用したライブラリは `Pixi.js`

http://www.pixijs.com/

でした。これは 2D コンテンツを `webGL` レンダラーで描画できるライブラリ、しかも最悪普通の　canvas にフォールバックしてくれるという神機能付き。

まずはコアな機能を移植して確かめる

### 動く、動くぞ！！！

そうなんです、`webGL` はハードで動かすから早いんです！
このおかげで詳しくテストしていないですが、

* iPhone 5s ~ 6s (iOS 8+)
* Android 4.1+

くらいでみてもそんなにストレスがないパフォーマンスを得ることができました。

なんてことだ、

### 3D とか 2D とか関係なく webGL は正義

と思わざる終えなかったですね。

さて、ここからは `webGL` で行う 2D 表現の際に気をつけなければいけない Tips があるんですが、それはまたこんど

## 最後に

今回の失態は、早い段階での sp での調査を怠ったのが大きかった
当たり前といえば当たり前なんですが、
２D表現というなかで `webGL` というのはなかなか発想としてでてこず。。反省ですね。

さて、今回は

* 画像やオブジェクトをグリグリ動かすコンテンツ

に関しては 

* PC だけなら　svg でもいける
* SP とか考えだすと webGL を使わざるおえない

という教訓を得ました。

## 仕事募集

さて、せっかくノウハウも溜まったということで、また別の形でお仕事をしたいと思うわけですが、
はたしてこんなのできるの？とか `webGL` コンテンツつくりたいと思う方がいたら是非一声かけていただけたらなと、、、
僕より優秀な先輩が答えてくれます！
Edisonのセットアップ Mac編


初期設定(ファームウェアの更新まで)のメモ。

#作業環境

+ Mac - OS X 10.9.5
+ Intel Edison
+ Intel Edison Board for Arduino

![](http://cdn-ak.f.st-hatena.com/images/fotolife/k/kjktk/20141028/20141028050722.jpg)


母艦のOSによって作業内容が結構変わってきます。  

#Edisonの準備
EdisonをIntel Edison Board for Arduinoに取り付ける。
付属しているナットを止めて固定。
足もつけておく。
#Linuxイメージの転送
最新版のファームウェアに。
##EdisonとPCの接続
先ほどEdisonを取り付けたボードに12V電源を取り付ける。
電源コネクタに近い方のUSBコネクタ(<b>J16</b>)にUSBケーブルを接続。
![](http://cdn-ak.f.st-hatena.com/images/fotolife/k/kjktk/20141028/20141028050908.jpg)

Edisonがストレージとして認識される。 
##Edisonの古いイメージを削除
もし、古いイメージが入っていたら...

```
$ cd /Volumes/Edison
$ rm –rf *
$ rm –rf \.
```
で、取り除く。
##フォーマット
このままではフォーマットがFAT16となっているので、
ディスクユーティリティーでパーティション1にフォーマットMS-DOS(FAT)を設定し、適用する。
![](http://cdn-ak.f.st-hatena.com/images/fotolife/k/kjktk/20141028/20141028045041.png)
##イメージファイルの転送
[ここ](https://communities.intel.com/docs/DOC-23242)から**Edison Yocto complete image**をダウンロード
ダウンロードしたzipファイルを展開する。  
中身をまるごとEdisonのストレージに入れる。
![](http://cdn-ak.f.st-hatena.com/images/fotolife/k/kjktk/20141028/20141028055404.png)
#Edisonとシリアル通信
電源コネクタに遠い方のUSBコネクタ(**J3**)にUSBケーブルに差し替える。  
![](http://cdn-ak.f.st-hatena.com/images/fotolife/k/kjktk/20141028/20141028051144.jpg)
Macのターミナルで、`screen /dev/tty.usbserial`まで入力して[tab]キーを押すとこんな風に補完してくれる。`A402IY3C`の部分がデバイスごとに違う。    

```
$ screen /dev/tty.usbserial-A402IY3C
```

さらに、シリアルポート(115200bps)で接続したいので`115200 -L`を追記して...

```
$ screen /dev/tty.usbserial-A402IY3C 115200 -L
```

このコマンドを実行すると、Linuxのログインプロンプトが表示されます。
（ログインプロンプトが表示されない場合は、何回か[Enter]キーを押してください)  
初期設定では、ユーザーは`root`でパスワードは無し。これでログイン出来ます。

#Linuxのイメージを更新

ログインした後、

```
$ reboot ota
```

を実行する。  
再起動するので

```
configure_edison --setup
```

これでセットアップできれば、たぶん成功。  

セットアップは

+ デバイスの名前
+ パスワード
+ wifi

の順に設定していきます。  
wifiの注意点として、アンテナが弱いので複数のPC等が接続されていたり、アクセスポイントと離れていると繋がらない時があります。
Macでwhoisが文字化けないようにする

nkfコマンドを使います。
`$ brew install nkf`
# ふつうにwhoisすると
```lang:log
$ whois -h whois.nic.ad.jp 182.22.59.229
[ JPNIC database provides information regarding IP address and ASN. Its use   ]
[ is restricted to network administration purposes. For further information,  ]
[ use 'whois -h whois.nic.ad.jp help'. To only display English output,        ]
[ add '/e' at the end of command, e.g. 'whois -h whois.nic.ad.jp xxx/e'.      ]

Network Information: [B%M%C%H%o!<%/>pJs]
a. [IPB%M%C%H%o!<%/%"%I%l%9]     182.22.0.0/17
b. [B%M%C%H%o!<%/L>]             YAHOO-NET
f. [BAH?%L>]                     B%d%U!<3t<02q<R
g. [Organization]               Yahoo Japan Corporation
m. [B4IM}<TO"MmAk8}]             JP00032461
n. [B5;=QO"MmC4Ev<T]             JP00032461
p. [B%M!<%`%5!<%P]               ns01.yahoo.co.jp
p. [B%M!<%`%5!<%P]               ns02.yahoo.co.jp
p. [B%M!<%`%5!<%P]               ns11.yahoo.co.jp
p. [B%M!<%`%5!<%P]               ns12.yahoo.co.jp
[B3dEvG/7nF|]                    2010/06/03
[BJV5QG/7nF|]
[B:G=*99?7]                      2011/09/26 15:59:02(JST)

B>e0L>pJs
----------
B%d%U!<3t<02q<R (Yahoo Japan Corporation)
                     [B3d$j?6$j]                                  182.22.0.0/17

B2<0L>pJs
----------
B3:Ev$9$k%G!<%?$,$"$j$^$;$s!#
```
# nkfコマンドを使うと
```lang:log
$ whois -h whois.nic.ad.jp 182.22.59.229 | nkf -w
[ JPNIC database provides information regarding IP address and ASN. Its use   ]
[ is restricted to network administration purposes. For further information,  ]
[ use 'whois -h whois.nic.ad.jp help'. To only display English output,        ]
[ add '/e' at the end of command, e.g. 'whois -h whois.nic.ad.jp xxx/e'.      ]

Network Information: [ネットワーク情報]
a. [IPネットワークアドレス]     182.22.0.0/17
b. [ネットワーク名]             YAHOO-NET
f. [組織名]                     ヤフー株式会社
g. [Organization]               Yahoo Japan Corporation
m. [管理者連絡窓口]             JP00032461
n. [技術連絡担当者]             JP00032461
p. [ネームサーバ]               ns01.yahoo.co.jp
p. [ネームサーバ]               ns02.yahoo.co.jp
p. [ネームサーバ]               ns11.yahoo.co.jp
p. [ネームサーバ]               ns12.yahoo.co.jp
[割当年月日]                    2010/06/03
[返却年月日]
[最終更新]                      2011/09/26 15:59:02(JST)

上位情報
----------
ヤフー株式会社 (Yahoo Japan Corporation)
                     [割り振り]                                  182.22.0.0/17

下位情報
----------
該当するデータがありません。
```
Jenkinsでrailsの自動テスト（rbenv使用）

Jenkinsのインストール方法は以下を参照
[Jenkinsをubuntu14.04にインストール](http://qiita.com/muraikenta/items/379096a646945ca43677)

###■初期設定（以下を参照）
[Jenkinsのインストールと初期設定](http://hidemium.hatenablog.com/entry/2014/05/03/234917)

###■Githubにpushした時に、Jenkinsサーバーにpullするようにする
以下のURLの「Jenkins側でGit、GitHubの設定」以下を参照
[JenkinsでGitHubのプッシュ時に自動デプロイする](http://sil.hatenablog.com/entry/jenkins-github-auto-deploy)

＊注意点：jenkinsのタスクは全てjenkinsユーザーで行われるため、秘密鍵などがjenkinsユーザーの権限があるかを確認してください

###■自動テスト
１，以下のプラグインを追加

* Rake plugin
* rbenv plugin
* RubyMetrics plugin for Jenkins

２，プロジェクトの「設定」で以下のようにビルド環境を入力
ーーー
![スクリーンショット 2015-07-30 14.19.05.png](https://qiita-image-store.s3.amazonaws.com/0/21920/0f765b10-2088-d58e-c950-04e53212807a.png)
ーーー


３，「ビルド手順」で以下のシェルスクリプトを実行

```
$ bundle install --without development production --path vendor/bundle
$ bundle exec rake db:setup RAILS_ENV=test
$ bundle exec rspec spec
```

###■テストの結果をslackに通知
slackのJenkinsのintegrationに詳細がのってます

###■jenkinsをhttp://ドメイン:8080でなく、http://ドメイン名でアクセスできるようにする
以下のURLを参照（ubuntu14系でも大丈夫）
[Ubuntu 12.04にJenkinsをインストールしてApacheでポート80で動かす](http://madroom-project.blogspot.jp/2012/12/ubuntu-1204jenkinsapache80.html)
【Automator】Mac OS Xでファイルのパスをコピーする方法

Macを使い始めたばかりの社員さんから「ファイルのパスをコピーする方法をおしえて」と言われたので共有します。

# Automator

![スクリーンショット 2015-07-08 午前9.06.18.png](https://qiita-image-store.s3.amazonaws.com/2409/60014/3c348ad1-15ac-060d-1e15-6509d013924f.png)

```
Automator は、簡単に作業を効率化できるパーソナル自動化アシスタントです。 Automator を使えば、単純なドラッグアンドドロップ操作で「自動化レシピ」を作成し、実行できます。 自動化レシピは、単純なタスクも複雑なタスクも、必要なときに必要な場所で実行してくれます。 Automator を使うと、コンピュータで行うタスクの多くを自動化できます。
```

だそうです。

## 手順

### 起動したらサービスを選択します

![スクリーンショット 2015-07-08 午前9.10.14.png](https://qiita-image-store.s3.amazonaws.com/2409/60014/652d3d0e-8b06-7c83-1127-ff07963c336f.png)

### 左のメニューからアクションを選択し、ユーティリティを選びます

![スクリーンショット 2015-07-08 午前9.19.03.png](https://qiita-image-store.s3.amazonaws.com/2409/60014/a83356d2-4e8f-8796-4f42-8288fd130547.png)

### 入力欄で「コピー」と検索して出てきたものをワークフローにドラック&ドロップ

![スクリーンショット 2015-07-08 午前9.22.32.png](https://qiita-image-store.s3.amazonaws.com/2409/60014/ab5778de-83c7-14bb-83f6-9071a96f41de.png)

### "サービス"は、次の選択項目を受けとる→「ファイルまたはフォルダ」を選択します

![スクリーンショット 2015-07-08 午前9.25.29.png](https://qiita-image-store.s3.amazonaws.com/2409/60014/be71aa65-6354-102d-bf08-18a780e2f115.png)

### 保存→ファイルパスのコピー

![スクリーンショット 2015-07-08 午前9.26.48.png](https://qiita-image-store.s3.amazonaws.com/2409/60014/70fb5365-6d16-b237-0070-6e74207c7ebc.png)

### 先ほど追加した機能が使用できるようになっています

![スクリーンショット 2015-07-08 午前9.30.38.png](https://qiita-image-store.s3.amazonaws.com/2409/60014/649a6bff-90c2-8615-c2db-08e847748a3a.png)
Windows Server 2012 R2 Essentials でパスワードポリシーの設定を変更出来なかった

管理ツール ⇒ ローカルセキュリティーに行き、
アカウントポリシー ⇒ パスワードのポリシーを開き、

「複雑さの要件を満たす必要があるパスワード」や「パスワードの有効期間」などの設定を変更しようとしたが、ラジオボタン？項目がDisableになっており、変更出来なかった。

## 解決 

1. ダッシュボードを開く。
2. ユーザー タブを開く。
3. ユーザータスクから「パスワードポリシーの設定」を開く。
そこで、「パスワードポリシーの変更」、「パスワードを無期限にする」などが行える。


# その他メモ

Essentials Editionはホスト名（コンピューター名）およびドメイン名を後から変更出来ないという制限がある。
（マシンのリプレース時に大ハマリ… Essentials二度と使わねぇ…）
MySQL WorkBench6.3でモニタリング

MySQLのコネクション数を監視したくて、フリーでできるものを探していたら、最新のMySQL Workbenchなら、いろいろパフォーマンス周りの情報が取得できるようになってました。


## ダッシュボード

左のナビゲータのところに、パフォーマンスの項目があります。そこのダッシュボードから、通信状況やコネクション数などがリアルタイムで見られます。

![image](https://qiita-image-store.s3.amazonaws.com/0/9880/8097a053-2d86-6cbf-ab26-fd2fe52c5989.png)


![image](https://qiita-image-store.s3.amazonaws.com/0/9880/7f8f1ac8-b337-6843-4aba-61346754849c.png)


## Performance Schema Setup

ざっくりいうと、パフォーマンス関連のデータを保持するスキーマをつくって、そこにためていくという機能のようです。
Easy Setup　で出来合いのスキーマをいれるインストールボタンがあるので、それですぐにはじめられます。

## Performance Report

上述のスキーマにためてものを閲覧できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/9880/23cd50dd-fded-a1d7-3489-1a995690d07e.png)

`Statement Analysis` では、どのクエリが何回実行されて、平均どのくらいかかっているかなどが見られます。このあたりがよくつかうことになりそうです。

![image](https://qiita-image-store.s3.amazonaws.com/0/9880/47418259-35c1-4d70-1eac-885cb458f7f1.png)


## Client Connections

ここでは、どのユーザがどこから、どのDBに接続しているかなどが見られます。上の方に立ち上がっているスレッド数、キャッシュしているスレッド数などがでています。

![image](https://qiita-image-store.s3.amazonaws.com/0/9880/f9eff007-75ae-7c21-5199-4b19f8934b07.png)


##　まとめ

とりあえず始めてみるには十分な機能があるという印象です。足りなくなったら有償サービスに手を出すなり、監視サーバをいれたりでしょうか。開発段階ならさほど困ることはなさそうです。
isoをUSBメモリに書き込み

macでやりました。
多分linuxでも同じようにできるはず。
知らなかったのですが、ddじゃなくてcatでできるっていう。

# ubuntuのisoを準備
適当なところから以下を取得。
別にubuntuでなくても。

ubuntu-14.04.2-server-amd64.iso

# 実行

1.usbメモリをmacに接続
 　2GBあれば多分大丈夫ですが（isoが600MBくらい）2GBのUSBメモリはあまり出回ってないので4GBとか8GBとか

2.diskutil listを実行してマウントポイントを調べる

```
# diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *240.1 GB   disk0
   1:                        EFI                         209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            239.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *3.9 GB     disk1
   1:                 DOS_FAT_32 SONY_4GU                3.9 GB     disk1s1
```

上記から/dev/disk1としてマウントされてると判る


3.マウントされた状態で書き込もうとすると怒られるので、アンマウント

```
# diskutil unMountDisk /dev/disk1
```


4.isoの中身をusbメモリに書き込む
以下のコマンドを実行。

```
# cat ubuntu-14.04.2-server-amd64.iso > /dev/disk1
```

ddでしか出来ないんかなと思ったらcatで出来るんですね。
なんか終わるとmacから読み込めなくなっちゃうんだけど、サーバにusb挿すとubuntuのインストーラが上がるので問題ないのかなと。
再帰関数をマスターする。


# 再帰関数とは？
再帰関数とは、関数の中からその関数自身を呼び出すような処理を行う関数のこと。
必ず終点が必要で、問題を徐々に単純化しないといけない。
再帰呼び出しを行うと、関数を呼び出すたびに引数やローカル変数がメモリを確保する。


# 再帰関数をいつ使うか？
1つ処理すると、残りの処理対象が増えたりする。
しかも増えた文は、元の構造が似ている。
場合につかうらしいです。　
Tree構造のデータをたどるような場合等。(マージソート,クイックソート)　

# 具体例　: 細胞分裂
1匹の細胞が一度に2匹に分裂するした結果を出力するプログラムを、ループと再帰関数を用いて書いてみます。

## ループ

```rb

def cell_divison_loop(cell)
  loop {
    break if cell.length > 100     
    cell = cell * 2
    }
   return cell
end

p cell_divison_loop("c")
>"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
(128個)
```


## 再帰関数

```rb

def division
  return self * 2 
end

def cell_divison(cell)
  return cell if cell.length > 100
  cell = cell.divison.cell_division
end

p cell_division("c")
>"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
(128個)
```


## 解説
以上の例から再帰関数のイメージはつかめるんじゃないでしょうか。
計算時間はほとんど同じです。これは文字列を単純に二倍にするからloop関数のほうが楽に見えるが、直感的には再帰関数の方が理解しやすい場合もあります。
cellが再帰的に分裂をしている様子を理解できます。(再帰的にのイメージを持っていないとわかりづらいが)


# 再帰関数 VS ループ

## 再帰関数
### メリット
わかりやすくなる可能性がある。

### デメリット
メモリー使用量、実行速度(あまり変わらない気がするが)
→　再帰呼び出しをかけるたびに、新しいスタック領域が必要になるため。
再帰呼び出しし過ぎるとスタックオーバーフローする可能性がある。

### 対策
引数を値渡しにする。
並行処理で処理速度をあげられる可能性が少しある。

[値渡し&参照渡し](http://magazine.rubyist.net/?0032-CallByValueAndCallByReference)


## ループ
### メリット
メモリを食わない。

### デメリット
ネストすると見づらくなる可能性がある。


# 再帰関数例
- 階乗計算
- フィボナッチ数列
- ハノイの塔
- マージソート
- クイックソート

等。
全て自分自身に同じ法則で処理し続けることで解に収束していく様子を表している。
.NET Framework アセンブラでfizzbuzz

# サンプルコード
```
.assembly fizzbuzz {}
.method static void main() {
.entrypoint
.locals init(int32 i, int32 n)  
    ldc.i4 100
    stloc n
    ldc.i4 1
    stloc i
loop:
    ldloc i
    ldloc n
    bgt bye
    ldloc i
    ldc.i4 15
    rem
    brfalse fb
    ldloc i
    ldc.i4 5
    rem
    brfalse b
    ldloc i
    ldc.i4 3
    rem
    brfalse f
    ldloc i
    call void [mscorlib] System.Console::WriteLine(int32)
    br tugi
fb:
    ldstr "fizzbuzz"
    br print
b:
    ldstr "buzz"
    br print
f:
    ldstr "fizz"
print:
    call void [mscorlib] System.Console::WriteLine(string)
tugi:
    ldloc i
    ldc.i4 1
    add
    stloc i
    br loop
bye:
   ret
}
```
ActiveRecord 4.2以上でunionする方法


ActiveRecordを使っていてunionしたいパターンができたので、やってみようと思ったら、思いの外ハマってしまったので情報共有したいと思います。

ActiveRecordにunionというメソッドがあることを知った私は、これでできるんじゃないの？と思って意気揚々と使ったのですが、なぜかエラーがおきました。

```rb
union = MyGroup.where(user_id: user).reorder(nil).union(
  MyGroup.limited.where(user_id: user.members).reorder(nil)
)

MyGroup.from(MyGroup.arel_table.create_table_alias(union, :my_groups).to_sql)
```

`MyGroup.limited`は、公開範囲をActiveRecord::Enumを使っていて、限定公開をlimitedというスコープで作っています。

これを実行すると…エラーになります。

```
PG::ProtocolViolation: ERROR:  bind message supplies 0 parameters, but prepared statement "" requires 1
: SELECT "my_groups".* FROM ( SELECT "my_groups".* FROM "my_groups" WHERE "my_groups"."user_id" = 209 UNION SELECT "my_groups".* FROM "my_groups" WHERE "my_groups"."status" = $1 AND "my_groups"."user_id" IN (SELECT "users"."id" FROM "users" WHERE "users"."id" IN (255, 256, 209)) my_groups 
```

`"my_groups"."status" = $1`になっていて、limitedに割り当てられた数値になっていません。

## unionメソッドがうまく使えなかった原因

原因は上記の通り、to_sqlを使ったタイミングでActiveRecordの検索条件に設定した値が置き換えられていなかったからです。to_sqlメソッドでSQL文を受け取る時には置換されていると思っていたのですが、unionメソッドを使うと戻り値が`ActiveRecord::Relation`ではなく、`Arel::Nodes::Union`になるようです。そして、`ActiveRecord::Relation`のto_sqlメソッドと`Arel`のto_sqlメソッドでは動作が違う模様です。

参考URL:[to_sql in Rails 4.2 returns parameterized queries instead of full SQL statements](https://github.com/rails/rails/issues/18379)

参考URLでリンクされているチケットのどれかに書いてありましたが、『機能の不足はバグではない』、という言葉で終わっていて、とりあえずバグとして対応されるということはなさそうです。

## 対応方法

### ダメだったやつ(unprepared_statement)

参考URLでは、`unprepared_statement`を使えばいいと書いてありましたが、これを使ってもダメでした。

```rb
union_sql =  MyGroup.connection.unprepared_statement do
  MyGroup.where(user_id: user).reorder(nil).union(
    MyGroup.limited.where(user_id: user.members).reorder(nil)
  ).to_sql
end
MyGroup.from("#{union_sql} my_groups")
```

エラーの内容は変わらず。

### うまくいったやつ(arel_tableを使う)

Arelのto_sqlの結果が云々とあったので、該当箇所のwhere文をarel_tableを使ったものに変更すればうまくいくのでは？と思い、やってみたところ、うまくいきました。

```rb
union = MyGroup.where(user_id: user).reorder(nil).union(
  # limitedスコープをarel_tableを使って表現するよう変更
  MyGroup.where(user_id: user.members).
  where(MyGroup.arel_table[:status].eq MyGroup.statuses[:limited]).reorder(nil)
)

MyGroup.from(MyGroup.arel_table.create_table_alias(union, :my_groups).to_sql)
```

## まとめ

ArelにはArelをぶつけよう。
BITCOIN WALLET

# BITCOIN WALLET

* bitcoin は wallet（秘密） と blockchain（公開） 二つの機能に別れる
* wallet+blockchainをFullノード, walletのみをSPV(simplified payment verification)ノードという
* 現在はHDウォレットと呼ばれる実装が主流
* HDウォレットは、SPVノードとして実装される場合が多い

## HD WALLETとは

* Hierarchical Deterministic Wallets
* bitcoindには実装されていない機能
* 一つのマスター秘密鍵から無限のビットコインアドレスを生成できる
* 生み出された無限のビットコインアドレスに対して残高確認専用のマスター公開鍵が作れる
* m/0'/0 などのスキーマ情報で階層構造を記述できる
* 法則をもったアドレス生成方法なので標準化されている方法（BIP44）ならウォレット間で互換性を保てる

### 導入した場合の利点

* アドレス生成するごとに秘密鍵のバックアップの必要がなくなる（別途、索引の管理をしなくてはいけない）
* 残高や入金を確認するためだけにオンライン上に秘密鍵を持ったウォレットを用意しなくてもよくなる
* 商用に使う場合はお客ごとにユーザーidなどを用いて専用の入金専用アドレスの用意ができる
* 個人の場合はプライバシーが多少守れる（支払いのたびに残高を別の新規のアドレスへ移動することができるため）

### 関連技術

* BIP32 HDウォレット
* BIP39 ニーモニック
* BIP44 マルチアカウントHDウォレット

### 資料

* https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
* http://www.slideshare.net/bitbankink/ss-46429424
* https://www.youtube.com/watch?v=4Td5fUg2Nhk

### HDウォレット実装

* https://bitcoinj.github.io/
* https://electrum.org/

### 私が作ったJSのサンプル実装

* https://github.com/you21979/node-bitcoin-compat-wallets

### コイン種別

bipではないがsatoshilabsがやってる模様
Monacoinは22番

* https://github.com/satoshilabs/slips/blob/master/slip-0044.md
* https://github.com/bitcoinjs/bip44-constants
PHP の `__get` マジックメソッドによる Flyweight 的なことをやる

すでに取得済みのデータは再度取得したくない時に役に立つパターンです。
単純ですが、実用的です。PHPのマジックメソッドって便利ですね！

```php
<?php

class Post {
	public function __get( $property ) {
		return $this->$property = $this->$property();
	}

	private function permalink() {
		// ここで重い処理をいろいろやってデータを取得する
		return "My Permalink<br>";
	}
}

$post = new Post();

// `permalink`っていうプロパティがないので `__get` の中で作ってあげる
echo $post->permalink; // 実際は ->  $post->permalink = $post->permalink();

// これ以降は単なるプロパティ参照
echo $post->permalink; // $post->permalink
echo $post->permalink; // $post->permalink
```

クラスレベルでも同じことをやりたいのですが、残念ながら`__get`はクラスメソッドには適用されないのです。
メソッドを直接呼ぶ形での実装になってしまいますが…　一応こんな感じでしょうか。

```php

class BaseModel {
	protected static $data_pool = [ ];

	public static function all() {
		$data = static::get_pool_data( 'all' );
		if ( isset( $data ) ) {
			return $data;
		}

		return static::set_pool_data( 'all', 'my data' );
	}

	/**
	 * Try to get data from data-pool associated with the $key
	 * If there is no data to get then return null
	 *
	 * @param $key
	 * @param $value
	 *
	 * @return mixed
	 */
	protected static function cache( $key, $value ) {
		$data = static::get_pool_data( $key );

		return $data ? $data : static::set_pool_data( $key, $value );
	}

	/**
	 * Try to get the data from data-pool
	 * if there is no data to get then return null
	 *
	 * @param null $key
	 *
	 * @return array|null
	 */
	protected static function get_pool_data( $key = null ) {
		// if $key is not supplied return the whole data set
		if ( $key === null ) {
			return static::$data_pool;
		}

		$data_in_pool = null;

		if ( array_key_exists( $key, static::$data_pool ) ) {
			$data_in_pool = static::$data_pool[ $key ];
		}

		return $data_in_pool;
	}

	/**
	 * Store arbitrary data to the data-pool
	 *
	 * @param $key
	 * @param $value
	 *
	 * @return mixed
	 */
	protected static function set_pool_data( $key, $value ) {
		static::$data_pool[ $key ] = $value;

		return $value;
	}
}

class Animal extends BaseModel {
	public static function all() {
		$all_animals = 'Bird, Horse, Cat, Rabbit';

		return static::cache( 'all', $all_animals );
	}
}

?>

<h1><?= Animal::all() ?></h1>

<h2><?= Animal::all() ?></h2>
<h2><?= Animal::all() ?></h2>
```
Icinga webでのエラー対応


http://qiita.com/shu1/items/0ce79455152b23ed0216#icinga-web%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB


この通りにやったら以下のエラーメッセージが表示された。

```
-> 500 internal server error!

=== Error ===
Uncaught exception AgaviException thrown!

=== Message ===
You are running the Apache HTTP Server with a |ServerTokens| configuration directive value of |Minor| or lower.
This directive controls the amount of version information Apache exposes about itself.
Agavi needs detailed Apache version information to apply URL decoding and parsing workarounds specific to certain versions of Apache that exhibit buggy behavior.

Please take one of the following measures to fix this problem:
- raise your |ServerTokens| level to |Min| or higher in httpd.conf
- set a static value for the request source |SERVER_SOFTWARE| in factories.xml (for your environment)
- set a value for $_SERVER[|SERVER_SOFTWARE|], e.g. in your pub/index.php

For detailed instructions and examples on fixing this problem, especially for the factories.xml method which is recommended in case you do not have control over your server|s httpd.conf, please refer to:
http://trac.agavi.org/ticket/1029

For more information on the |ServerTokens| directive, please refer to:
http://httpd.apache.org/docs/2.2/en/mod/core.html#servertokens

For your reference, your SERVER_SOFTWARE string is currently |Apache|.

=== Stacktrace ===
#0 /var/cache/icinga-web/config/factories.xml_production_web_3b046d81eca933d9f16b3365d9ddd13114979325.php(63): AgaviWebRequest->initialize(Object(AppKitAgaviContext), Array)
#1 /var/cache/icinga-web/config/compile.xml_production__d41bc4e7416d79a2859fb497054ab4f5308e2df1.php(384): include(|/var/cache/icin...|)
#2 /var/cache/icinga-web/config/compile.xml_production__d41bc4e7416d79a2859fb497054ab4f5308e2df1.php(3549): AgaviContext->initialize()
#3 /var/cache/icinga-web/config/compile.xml_production__d41bc4e7416d79a2859fb497054ab4f5308e2df1.php(370): AppKitAgaviContext->initialize()
#4 /usr/share/icinga-web/pub/index.php(51): AgaviContext::getInstance(|web|)
#5 {main}
```

Apcheの`ServerTokens`が`prod`になっており、`SERVER_SOFTWARE`が`Apache`しか取得できないためにエラーになっているようです。
`ServerTokens`を変更するのはセキュリティ的にしたくないので、スクリプトに直接指定して対応しました。

```/usr/share/icinga-web/pub/index.php
<?php
$_SERVER["SERVER_SOFTWARE"] = "Apache 2.2";

/**
 * Allow XHR access from other domains (response for cors preflight requests)
 */
...
```
unity > delegates > ランタイムで関数を入れ替え可能 / 複数実行も可能

https://unity3d.com/learn/tutorials/modules/intermediate/scripting/delegates?playlist=17117

ランタイムで関数を入れ替えて実行したいときに使う。

```csharp
using UnityEngine;
using System.Collections;

public class DelegateScript : MonoBehaviour
{
  delegate void MyDelegate(int num);
  MyDelegate myDelegate;

  void Start()
  {
     myDelegate = PrintNum;
     myDelegate(50);
     
     myDelegate = DoubleNum;
     myDelegate(50);
  }

  void PrintNum(int num)
  {
    print("Print Num:" + num);
  }

  void DoubleNum(int num)
  {
    print("Double Num: " + num * 2);
  }
}
```

複数実行も可能のようだ

```
void Start()
{
  myMultiDelegate += PowerUp;
  myMultiDelegate += TurnRed;

  if (myMultiDelegate != null) {
    myMultiDelegate();
  }
}

void PowerUp()
{
...
}

void TurnRed()
{
...
}
```

デリゲートから取り除くのは myMultiDelegate -= PowerUp; でできる。
unity > マウス位置の取得

https://unity3d.com/learn/tutorials/modules/intermediate/scripting/coroutines?playlist=17117
の3:15のコード

```
...

void OnMouseDown () 
{
   Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
   RaycastHit hit;
   
   Physics.Raycast(ray, out hit);

   if(hit.collider.gameObject == gameObject)
   {
      coroutineScript.Target = hit.point;
   }
}
```

マウスカーソルの位置にgameObjectが移動していた。

実際に試した所、hit.pointはVector3の情報を持っているのがわかった。

上記のスクリプトをPlaneにアタッチした場合、Planeの一部にマウスカーソルが置かれた時にhitとみなされ、その座標 hit.point が取得できた。

マウスクリックの有無は無関係だった。

<hr>
bashで「ファイルの削除」を「ファイルの移動」にする

# ファイルの削除でファイルを本当には削除しないようにする
[github](https://github.com/digitarhythm/trash.git)に置いてあります。
※「**[spitiko](http://qiita.com/digitarhythm/items/66a3597cc37304800e3b)**」でインストール出来ます。

Linuxなどで「**rm**」コマンドでファイルやディレクトリを削除すると、取り返しがつきません。
なので、下記のようなbashスクリプトを「**/usr/local/bin/trash**」みたいなファイルで設置して、

```bash
alias rmf="trash"
```
みたいにして、**rmf**コマンドを使うと、ホームディレクトリの「**.Trash**」に移動されるだけで、実際にはファイルは削除されないという形にしてみた。
スクリプトの最後を見ると分かりますが、このスクリプトを使うたびに「**.Trash**」に移動されてから30日経過したファイルは自動的に削除されます（これはほんとに消えます）。
オプションとして「**--clean**」を付けて実行すると、強制的に「**.Trash**」ディレクトリ内を空にします。
あと、Macの場合はOS標準のゴミ箱も「.Trash」なので、ファインダーで捨てたファイル／フォルダーも30日経過すると消えます。
今のバージョンでは、シンボリックリンクは移動出来ないのでそのまま削除されます。
シンボリックリンクは削除されても問題ないと思われるので大丈夫でしょう。

**実行例**

```bash
$ trash --clean
```

**「trash」スクリプト**

```bash
#!/bin/bash

# home directory
HOME=`echo ~`
# trash directory
TRASH="${HOME}/.Trash"
# option string
TARGET="$@"
# first arg
ARGS=(`echo "$@"`)

# option value
CLEAN=0

if [ -z "${ARGS[0]}" ]; then
  echo -e $'\e[35mUsage: trash [option] [delete file name]'
  echo -e $'\e[35moption:'
  echo -e $'\e[35m  --clean    delete all files in .Trash directory.'
  exit
fi

for arg in ${TARGET}; do
  if [ "${arg}" = "--clean" ]; then
    CLEAN=1
  fi
done

if [ ! -d ${TRASH} ]; then
  mkdir ${TRASH}
fi

for file in ${TARGET} ; do
  if [[ ! ${file} =~ ^-.*$ ]]; then
    if [ -e ${file} ]; then
      org=${file}
      if [[ ${file} =~ ^(.*)\/$ ]]; then
        file=${BASH_REMATCH[1]}
      fi
      if [[ ${file} =~ ^.*\/(.*) ]]; then
        file=${BASH_REMATCH[1]}
      fi
      fname=${file}
      loop=1
      while [ -e "${TRASH}/${fname}" ]; do
        fname="${file}.${loop}"
        loop=$((loop+1))
      done
      if [ -L ${org} ]; then
        echo -e $'\e[35mThis file is a symbolic link , it will be removed: '${org}
        rm -rf ${org}
      else
        echo -e $'\e[35m'${file}' is move to Trash.: '${fname}
        mv -f ${org} "${TRASH}/${fname}"
      fi
    else
      echo -e $'\e[35mfile not found: '${file}
    fi
  fi
done

if [ ${CLEAN} -eq 1 ]; then
  find ${TRASH} -maxdepth 1 -regex "${TRASH}/.+" -exec rm -rf {} \;
  echo -e $'\e[35mclean \".Trash\".'
else
  find ${TRASH} -maxdepth 1 -regex "${TRASH}/.*" -mtime +30 -exec rm -rf {} \;
fi
```
csharp > Dictionary > TryGetValue() > 該当するキーがない時

https://unity3d.com/learn/tutorials/modules/intermediate/scripting/lists-and-dictionaries?playlist=17117
のDictionary使用例において TryGetValue()というのが紹介されていた。

関連して調べると以下のサイトを見つけた。
http://blog.basyura.org/entry/20120815/p1
> Dictionary でインデクサを使ってアクセスした際に該当するキーが無いと、KeyNotFoundException がスローされる。
例外が発生しないようにするためには、Dictionary#ContainsKey を使ってチェックすることになる。
そんなの効率悪いよーって人のために Dictionary#TryGetValue がある(らしい)。

今後必要になった時にまた調べようかと思う。
Java PlayFramework2.xで事前処理を行うアノテーション

# アクションに事前処理をつけたい
Play Framework（Java）で用意されているアノテーションの中に、
Controllerクラスやそのアクションを行うメソッドに付加しておくことで
事前処理を簡単に行う事ができるものが用意されています。
ユースケースとしては、

* ログイン状態のチェック
* ユーザ毎アクセス権限のチェック

などが挙げられます。



## 事前処理の実装

```java:BeforeAction.java
public class BeforeAction extends play.mvc.Action.Simple {
    @Override
    public F.Promise<Result> call(Http.Context ctx) throws Throwable {
        
        System.out.println("事前処理を行います。");

        return delegate.call(ctx);
    }
}
```

``call``メソッドはアノテーションを付与したActionの直前に必ず呼ばれます。
ここで、必ず``Promise``型を返却する必要があります。

``BeforeAction``は``play.mvc.Action.Simple``を継承しているので、
``Action``型のメンバ変数である``delegate``のcallメソッドを呼び、
``Promise``を返却する事でもとのActionの処理をそのまま呼び出す事が可能です。

## 事前処理を行うメソッドにアノテーションを付与

``@With``というアノテーションを付与する事で、
そのクラスまたはメソッドに事前処理を挟み込む事ができます。

以下のように記述する事で、上で実装した``BeforeAction#call``の処理を
事前処理として行います。

```java:コントローラ
@With(BeforeAction.class) //これ
public static Result index() {
    System.out.println("indexメソッドが呼ばれました。");
    return ok("hello");
}
```

```bash:標準出力
事前処理を行います。
indexメソッドが呼ばれました。
```

## まとめ

``With``アノテーションと``play.mvc.Action.Simple``を継承したクラスを駆使する事で、
それぞれのアクションに対しログインなどの認証チェックや事前処理を簡単に挟み込む事ができます。

``With``アノテーションには複数の事前処理を定義する事もできるので
うまく利用してPlayFrameworkでの開発を便利に・加速させましょう。
[JavaScript] iOS系ブラウザーで <input type="search"> に値をセットする方法

**[JavaScript] としてますが、iOS＋PhoneGap（Cordova）内で確認できた現象です。\<input type="search"\> から値は取得できるものの、設定ができない現象が起きました。以前の検索ワードを初期表示させたかっただけなのですが…**

# ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png) こう書けばOK

▼JavaScript標準の書き方

```
誤）document.getElementById("search").value = XXX;
　　　↓↓↓
正）document.getElementById("search").setAttribute("value", XXX);
```

▼jQueryの書き方

```
誤）$("#search").val(XXX);
　　　↓↓↓
正）$("#search").attr("value", XXX);
```

***

(･o･ゞ いじょー。
findコマンドで特定の拡張子のファイルを検索しました。

findコマンドでファイルがどのディレクトリにあるかを検索しました。ファイルが分割されすぎてどこに何があるかわからなくなっているのです:(；ﾞﾟ'ωﾟ'):

# findコマンドで特定の拡張子のファイルを検索

```bash:拡張子の検索方法
find ディレクトリ -name "*.拡張子"
```
scssが拡張子のファイルを検索したかったので以下のようにしました。

```bash:scssファイルを検索
find ./app/ -name "*.scss"
```

ちゃんとscssファイルが検索できました(╹◡╹)

# 参考

http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230777/
Apexクラスの本番リリースまでの道のり


「sandbox環境でApexクラスが動くようにしたけどもここからどうリリースしたらいいの？」って人向けの記事になります。
Salesforce上の説明が分かりづらいので改めて記事にしました。

## 前提

前提条件として

- 本番環境と同期済みの最新のsandbox環境で
- Apexクラスを作成済み
- Apexクラスのテストカバレッジが75%以上

という条件になっております。

尚、テストカバレッジが75%以上でないとリリース時に怒られ非常にがっかりするので注意してください。
（筆者体験済み）

## やること

では、まずリリース前にやることとして本番環境とsandbox環境がお互いに認証してリリース出来る状態にしましょう。

やり方としては、本番・sandbox環境それぞれで設定画面に飛び、左メニューの「リリース設定」をクリックしてみてください。

![スクリーンショット_2015-07-30_10_57_39.png](https://qiita-image-store.s3.amazonaws.com/0/39382/7a017434-71e5-b345-2db3-f32fb4c17768.png "スクリーンショット_2015-07-30_10_57_39.png")

すると、こんな画面が表示されるはずです。
ただ、リリースをしたことがない環境ですとアップロード認証方向の矢印マークがちょっと違うかもしれません。
もし、オレンジの矢印マークですとそれはまだお互いにリリースを認めていない状態ですので、設定しましょう。

アクションにある編集を押すと以下のような画面になります。
![スクリーンショット_2015-07-30_11_00_43.png](https://qiita-image-store.s3.amazonaws.com/0/39382/9e27575c-2220-35d4-129b-e9b859ccb488.png "スクリーンショット_2015-07-30_11_00_43.png")

画像の通り認証のチェックをして、保存してください。
これを本番・sandbox環境で行うことで矢印マークが緑になるはずです。

次にsandbox環境で送信変更セットを編集します。
これは「リリース時に本番環境へ送るもの」を決める設定になります。
設定の左メニューより、送信変更セットをクリックしてみてください。

![スクリーンショット_2015-07-30_11_03_39.png](https://qiita-image-store.s3.amazonaws.com/0/39382/099c4af2-146b-5b0c-fadd-ce6f387b9ee7.png "スクリーンショット_2015-07-30_11_03_39.png")

それでは、変更セットを新しく作ってみましょう。
新規をクリックすると名前の入力が求められますので何か適当な名前をば。

保存をクリックすると、次に詳細な設定画面が表示されますのでここで作成したApexクラスを追加しましょう。
![スクリーンショット_2015-07-30_11_05_37.png](https://qiita-image-store.s3.amazonaws.com/0/39382/a072a966-17a6-96a0-5a76-2b65b8e92b31.png "スクリーンショット_2015-07-30_11_05_37.png")

![スクリーンショット_2015-07-30_11_06_26.png](https://qiita-image-store.s3.amazonaws.com/0/39382/bb2297ef-b0b8-458c-ac0b-1818228f044c.png "スクリーンショット_2015-07-30_11_06_26.png")

それでは次に、送信変更セット画面に戻り、作成した送信変更セットの名前をクリックしてからアップロードボタンをクリックしてみてください。

![スクリーンショット 2015-07-30 11.11.28.png](https://qiita-image-store.s3.amazonaws.com/0/39382/5b3a6db7-fc3a-ce56-ce89-dddee3fb49f7.png "スクリーンショット 2015-07-30 11.11.28.png")

では、アップロードしてみてください。

アップロードできたかどうか確認したいので、本番環境に移り受信変更セットをクリックしてみてください。

![スクリーンショット_2015-07-30_11_13_03.png](https://qiita-image-store.s3.amazonaws.com/0/39382/cf04b4aa-7ef7-ffea-22be-ebb06a5af330.png "スクリーンショット_2015-07-30_11_13_03.png")

リリース待ちの変更セットに新しく追加されてますね。
では、追加された変更セットの名前をクリックしてリリースしてみてください。
（ここで名前をクリックしてエラーになる場合は暫く時間を置いてから再度やってみてください。）

![スクリーンショット_2015-07-30_11_15_34.png](https://qiita-image-store.s3.amazonaws.com/0/39382/874a5287-906a-1a37-fdae-2829acbe1d1a.png "スクリーンショット_2015-07-30_11_15_34.png")

これでリリース作業は完了になります。

リリース状況が見たい場合は本番環境のリリース状況の画面に飛んで見てください。
以上になります。
c++ > class / namespace > namespace:pubicになる / namespace:追加定義できる

http://winterdom.com/dev/cpp/nspaces

> A namespace, however, cannot have access specifiers, such as public: or private:. All members of a namespace are public. It cannot have a trailing semicolon, either. 

namespaceではすべてがpublicになると。

> An important difference between classes and namespaces, is that class definitions are said to be closed, meaning that, once defined, new members cannot be added to it. A namespace definition is open, and can be split over several units. For example:

namespaceの場合は、追加定義ができると。

```cpp

// file SY.h
namespace SY {
  class Maker { ... };
  class SuperMaker : public Maker { ... };
}

// file  data.h
namespace SY {
  class Binder { ... };
  class DataBinder : public Binder { ... };
}
```
Linuxへのsshログインをslackへ通知する


管理者が本番サーバと他のサーバを間違えて、ミドルウエアをアンインストールするという不幸な出来事が起こりました。ネコに鈴をつけるため、sshでサーバにログインしたらslackに通知することに…。

## 先人の知恵

polidogさんの記事がそのものずばりでした。非常に参考にさせていただきました。

[sshでLinuxマシンにログインしたらSlackで通知する](http://qiita.com/polidog/items/d2b17f5e96e0b4152a0e)

しかし、記事にあった"node-slackr"と"node-slacker"のどちらが正しいのか。また、そもそもサーバにnode.jsがインストールされていないため、その他の方法で実現しました。

## ~/.ssh/rc を使用する。

sshなので~/.ssh/rcを使用して、そこにシェルを書きました。

```sh:~/.ssh/rc
#!/bin/sh

IP=`who am i | cut -d '(' -f 2 | sed -e 's/)//g'`
curl -X POST --data-urlencode 'payload={"channel": "#alert", "username": "toro", "text": "だれかがこのIPから接続しました！ '"${IP}"'", "icon_emoji": ":sushi:"}' 
https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX
```

あとはアクセスがあるのを待つのみです。ネコは鈴を鳴らすでしょうか…。


## 追記 2016/09/09

その後、本番サーバでは鈴は鳴りませんでしたが、まさかテストサーバにて管理者がまたやらかしました。git管理されているソースを直接いじってた。もう知らん。
Electronでdevtoolsの表示をやらせない！という勘違いのお話


最初はElectronのやってみたを書こうと思ったのですが、
もうかなりの記事数が上がっているのでやめました。

ちなみに、Electronのチュートリアルは[こちらのQiita記事](http://qiita.com/nyanchu/items/15d514d9b9f87e5c0a29)が参考になります！

Electron楽しいです。

# Electronとは(一応)
本家大本は「node-webkit」だったのですが、Github社がAtomを開発する際に、
node-webkitの仕様が嫌で作ったプラットフォームになります。

ここらへんのお話は

> - [atom-shellとNode-Webkitとの技術的な違い](https://gist.github.com/koba04/5296b2ccdbb594c9cc2b)
> - [AtomではなぜNode Webkitを採用しなかったのか](http://qiita.com/yaotti/items/6b4600be653ba81ec2cc)


辺りで詳しく書いてあります。

Electronは一般公開にあたって命名された形で、もとのプロダクトは「atom-shell」というものでした。
Electronを使って開発されたアプリには、AtomやSlackのクライアントアプリなどが有ります。

基本的にはhtmlとjavascriptでPCのネイティブアプリの開発ができるというものですが、
Node.js経由でOS機能へアクセスすることもできます。

何より嬉しいことは、ベースがwebkitなのでieを一切気にしなくていいことです。

# 本題

先に言い訳をしておくと、node-webkitの時には、
devtoolsの有効/無効のオプションがあったと記憶しておりました。
きっとElectronにもあるだろう！という思い込みがそもそもの始まりです。

windowの設定方法は[ここ](http://electron.atom.io/docs/v0.29.0/api/browser-window/)にあるのですが、devtoolsに関するオプションが見当たりません。

読んでいくと、

> Event:devtools-opened

このイベントをバインドして、

> BrowserWindow.closeDevTools()

を叩けば行けそうです！

...結果、

![スクリーンショット 2015-07-30 10.47.53.png](https://qiita-image-store.s3.amazonaws.com/0/74539/68e70865-9340-d478-53e0-62b5bb894bc8.png "スクリーンショット 2015-07-30 10.47.53.png")

ダメでした。まさかのクラッシュ！

その後も色々と試行錯誤していたのですが、ふと配布用のパッケージ化をしたら
デフォルトで表示できないようになっているのでは無いか、それがオプションが無い理由では…？

そう思い立ってパッケージ化してみると、ショートカットキーを押してもdevtoolsが出てきませんでした。

つまりパッケージ化すれば無効で、apiを叩けばopenできるという仕様のようです。(;´д｀)ﾄﾎﾎ…
Monacaでのアプリケーション開発検討


## Monacaとは

iOS,android等のネイティブアプリケーションにおけるWebView機能を活用したハイブリットアプリケーションの制作を支援するフレームワーク。

Adobe社の提供するPhoneGapというオープンソースフレームワークをベースに提供されており、PhoneGapにて提供されるネイティブの機能をWebリソースから利用するためのAPIが使用可能。PhoneGapの後継となるCordovaプラグインを利用することで基本的にはWEB以外の機能が拡張される。

Monacaの特徴としてはアプリケーション開発に必要なリソースを全てクラウド上に用意し、開発に最低限必要な物はブラウザのみです。

HTML5を利用したコーディングから、実機での確認・デバッグ、アプリケーションのビルド、各ストアへの公開・申請までをWEB上に用意した開発ツールでサポートされています。

またアプリケーションの実行環境におけるサーバの部分はMonacaバックエンドというサービスを利用することでMonacaが管理・提供するサーバサイドリソースを利用可能。これによりユーザのデータ管理、ログイン認証機能などがサーバサイド開発なしに利用可能となる。


## Monacaを使った開発のフロー

* HTML5コーディング − 基本的には通常のWEBアプリケーションの作成と同じ。ただネイティブアプリの機能を利用するなどの場合はプラグインの導入、独自APIの実装が必要になる。 
* Monacaデバッガーを使った実機での実行・検証 - Monacaの提供するiOS,androidアプリを利用することで各ストアへの登録なしに実機での動作検証が可能。IDE上で行なった修正はリアルタイムに反映される機能付き。
* Monacaバックエンドのセットアップ - ログイン認証、ユーザごとにサーバサイドでのデータの管理など必要に応じてMonacaの提供するマネージドなバックエンドサービスのセットアップを行う。
* アプリケーションのビルド、実機へのインストール - 各自で必要な開発者ライセンスを取得し、Monaca上に登録後Monacaの上でビルドされたアプリケーションがダウンロード可能になる。それらをiTunesなどを利用し実機へインストールをする。
* アプリの公開・配付申請 - AppStore,GooglePlayで手順が変わります。


## Monacaの料金について

料金は現在4つ。

Basicは無料、Personalは年間9800円だがCordovaプラグイン（ネイティブの機能と連携するためのプラグインなどが提供される）の組み込みが可能になるのがGoldプラン年間50000円になるため実運用のタームを考えるとGoldプラン以上が現実的。

ちなみにMonacaバックエンドのみ利用するとした場合はバックエンドのリソース、アプリデータのホスティングは含まれている形です。(Goldプランで10GB)
その他のオプションとしてアカデミックプラン、5名以上の開発者アカウントでボリュームディスカウントが有るようです。

その他、もちろんAppStore、Androidの開発アカウントの費用はかかります。


## そもそもネイティブアプリを避ける方法を検討する

WEBアプリの検討の際に最も多いものがオフラインでのコンテンツ閲覧対応。

なのでWEBコンテンツをオフラインで閲覧するアプリを導入する方法をリストアップします。


* safariの標準機能「リーディングリスト」の利用 - safariのリーディングリストはオフラインでの閲覧が可能になっているため、jQeryMobileのようなシングルページで実装されたWEBアプリケーションであれば静的に実装されているコンテンツはオフラインでも閲覧が可能になります。なんの準備もいらないため一番手軽です。
（androidの場合は標準搭載がなく、Firefoxブラウザを利用すれば標準機能として利用可能です）
* オフライン対応のリーダーアプリを利用する - このジャンルではPocketなどが最も有名かと思います。機能的にはsafariのリーディングリストとほぼ同様と
* ファイルをダウンロードさせてしまう - ちょっと元も子もない方法ですが、コンテンツを見たいだけならPDFとして出力する機能を実装して、ファイルをダウンロードさせる方法もありかと。後は各々のPDFリーダー機能があるアプリに任せてしまう。
（PDFの作成はPHPなどいろいろライブラリが公開されているため、そちらを利用すれば行けそう）
* その他 - 未使用ですが探しているとこんなものも見つけました。
iSwallow - スマホ向けWebコンテンツやHTML5アプリをオフラインで楽しむためのブラウザアプリ
http://www.topicmaker.com/smartphone/swallow/
Elixir の require, imoport, use



# require
モジュールのマクロを読み込む。

_require(module, opts)_

	require MyMacros

# import

モジュールのマクロと関数を読み込む。
「モジュール名.」を省略して呼べるようになる。

_import(module, opts)_

	iex> import List
	iex> flatten([1, [2], 3])
	[1,2,3]



# use

モジュールをrequireして、使うための準備処理も行う。(依存関係など)

_use(module, opts \\ [])_

	use HelloPhoenix.Web, :router




[公式ドキュメント](http://elixir-lang.org/docs/stable/elixir/Kernel.html#use/2)


### 実質はrequire + \_\_using__ 呼び出し

実質的にはrequireして、さらにそのモジュールの「\_\_using\_\_」マクロを呼ぶ。
「\_\_using\_\_」マクロには、正しいセットアップをするための処理を定義するようになってるみたいです。


	use ExUnit.Case, async: true

↓これと同じ

	require ExUnit.Case
	ExUnit.Case.__using__([async: true])

↓ \_\_using__の例 (主に依存関係を定義するみたい)

```extoのmodel.ex
  defmacro __using__(_opts) do
    quote do
      use Ecto.Schema
      import Ecto.Changeset
      import Ecto.Query, only: [from: 2]

      import Ecto.Model
      use Ecto.Model.OptimisticLock
      use Ecto.Model.Timestamps
      use Ecto.Model.Dependent
      use Ecto.Model.Autogenerate
      use Ecto.Model.Callbacks
    end
  end
```
C#で指定したディレクトリ内のファイル一覧を取得する。


## 目的
ディレクトリ内のファイル一覧を取得します。
できればファイル名で絞り込みます。

## 手段
[Directory.GetFiles メソッド (String, String)](https://msdn.microsoft.com/ja-jp/library/wz42302f(v=vs.110).aspx)を使います。

## ソースコード
```csharp
// 第一引数で対象のディレクトリを指定
// 第二引数でファイルのパターンを指定
var files = Directory.GetFiles(@"C:\", "*.xls");
files.ToList().ForEach(name => Console.WriteLine(name));
```

第二引数のファイルのパターンは

- * : 空文字か複数文字
- ? : 空文字か一文字

## 実行結果
```
C:\TEST①.xlsx
C:\TEST②.xlsx
```

こんな感じです。
フルパスの文字列が取得できます。
sbt runMainを使ってみた

sbtのタスクの中にrunMainがあり、プロジェクト内の特定のmainメソッドを実行させるものです。
play2.2.xだと、playコマンドをつかって下記のようになります。（最新だとactivatorですね。）

```
play "runMain sample.Hoge"
```

playアプリのコードを使って、データの暗号化やデータ移行など、一回きりのちょっとした処理をやるのに丁度良さそうなので、使ってみました。

Global.javaのonStartにバッチ処理などを書いている場合、こういう処理のときにはplayアプリを起動させずに実装したいところです。DBにはさわるので、EbeanServerだけをプログラム内で作る作戦でいきます。

```lang:Hoge.java

package sample

public class Hoge {

   public static void main(String[] args) {
        EbeanServer server = makeEbeanServer();

        //取得
　　　　List<User> admins = server.find(User.class).where()
                                 .eq("admin", true)
                                 .findList(); 

　　　　for(User admin: admins) {
          //パスワードを暗号化して更新
          String encrypted = encrypt(admin.getPassword());
          admin.setPassword(encrypted);
          server.save(admin);  
       }
   }

    private static EbeanServer makeEbeanServer() {
        

        //EbeanServerの設定
        ServerConfig serverConfig = new ServerConfig();
        serverConfig.setName("sample");

        //DataSource
        DataSourceConfig db = new DataSourceConfig();

        //application.confにあるDBの接続情報を使う
　　　　 Config config = ConfigFactory.load();　
        db.setDriver(config.getString("db.default.driver"));
        db.setUrl(config.getString("db.default.url"));
        db.setUsername(config.getString("db.default.user"));
        db.setPassword(config.getString("db.default.password"));

        serverConfig.setDataSourceConfig(db);
 
        //defaultServerに設定
        serverConfig.setDefaultServer(true);
        serverConfig.setRegister(true);

        //entityがあるパッケージを指定
        serverConfig.addPackage("models");

        return  EbeanServerFactory.create(serverConfig);
    }

}

```

runMainでコンパイルと実行をやってくれるので、ちょっとしたことをやりたいときに便利そうです。
一覧ページのargsの設定まとめ

カテゴリ一覧

```
<?php 
$cat_now = get_the_category(); 

$args = array(
  'post_type' => 'post',
  'paged' => $paged ,
  'cat' => $cat_now[0]->term_id,
  'posts_per_page' => 4
);?>
<?php $the_query = new WP_Query( $args ); ?>
<?php if($the_query->have_posts()): ?>
<?php while($the_query->have_posts()): $the_query->the_post(); ?>

```

日付一覧（年月）

```
$year = get_query_var('year');
$monthnum = get_query_var('monthnum');
$args = array(
  'post_type' => 'post',
  'paged' => $paged ,
  'year' => $year,
  'monthnum' => $monthnum,
  'posts_per_page' => 4
);
<?php $the_query = new WP_Query( $args ); ?>
<?php if($the_query->have_posts()): ?>
<?php while($the_query->have_posts()): $the_query->the_post(); ?>
```

http://notebook.yamamotohiroyuki.com/wordpress/2012/08/15/%E3%81%A1%E3%82%87%E3%81%84%E3%81%A1%E3%82%87%E3%81%84%E5%BF%98%E3%82%8C%E3%82%8B%E3%80%8Ewp_query%E3%80%8F%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/
http://cthuwebdice.session.jp/wordpress/archive_php/
http://notnil-creative.com/blog/archives/1288
【Android】EnumでFragment→Activityのイベントを実装

AndroidアプリでFragmentからActivityに対して処理を投げたい場面があったとする。(私はありました)
まだまだ試行錯誤中。

## Fragment→Activityの経路の確保

ここはよくあるやり方で、onAttachからインターフェースを渡すスタイルで実装

```lang:Activity
public class HogeActivity extends Activity implements
        HogeFragment.HogeFragmentListener {
}
```

ここでFragment→Activityのイベントがたくさんある場合、全部並べると以下の通り

```lang:ややこしい例
public interface HogeFragmentListener {
    void onHogeEvent1();
    void onHogeEvent2();
    void onHogeEvent3();
    void onHogeEvent4();
}
```

こうすると数が増えるし名前を決めるのも面倒なので、渡すイベントを一つにまとめる

```lang:enumでやる例
public interface HogeFragmentListener {
    void onHogeFragmentEvent(HogeEvent event);
}
```

実際のFragment側の記述はこんな感じ

```lang:Fragment
public class HogeFragment extends Fragment {
    private Activity mActivity = null;
    private HogeFragmentListener mFragmentListener = null;

    public interface HogeFragmentListener {
        void onHogeFragmentEvent(HogeEvent event);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        // ここで取得すれば再生成された時にちゃんと再取得できる
        if (!(activity instanceof HogeFragmentListener)) {
            throw new UnsupportedOperationException(
                    TAG + ":" + "Listener is not Implementation.");
        } else {
            mFragmentListener = (HogeFragmentListener) activity;
        }
        mActivity = activity;
    }
}
```

## HogeFragmentListenerで渡すHogeEventをEnumで実装する

パフォーマンスTipsでも解禁されてるし、折角なのでEnumを使う

```lang:HogeEvent
public enum HogeEvent {

    EVENT1 {
        @Override
        public void apply(Activity activity) {
            // Fragment→ActivityのActivity側の処理とか
        }        
    },
    EVENT2 {
        @Override
        public void apply(Activity activity) {
            // Fragment→ActivityのActivity側の処理とか
        }        
    },
    EVENT3 {
        @Override
        public void apply(Activity activity) {
            // Fragment→ActivityのActivity側の処理とか
        }        
    },
    EVENT4 {
        @Override
        public void apply(Activity activity) {
            // Fragment→ActivityのActivity側の処理とか
        }        
    }

    abstract public void apply(Activity activity);
}
```

こんな感じで作っておけば、Activity側の記述が以下のように最低限で済む

```lang:Activity側の実装
@Override
public void HogeFragmentEvent(HogeEvent event) {
    event.apply(this);
}
```

これでFragmentの数が増えても、Fragment→Activityな処理はそれぞれのEnumEventクラスを
更新すればよくなり、いちいちActivityもFragmentも修正していく必要が削減される。
複数人開発なら、Activityの修正で衝突する心配も減りそう。
wordpress wp-pagenaviのでよくある問題解決法

１．WordPressの管理画面の表示設定で、「1ページに表示する最大投稿数」を
WP_Queryで指定している件数（posts_per_page）よりも小さい数にしてみる。

２．
```
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$args = array(
'paged' => $paged ,
);
```
の記述が抜けている


３．wp_pagenavi();という記述になっている
↓
wp_pagenavi(array('query' => $the_query))にしてみる

１，２は２ページ目が表示されない時に。
３はページャーが表示されない時に。


http://naoyu.net/wordpress/wp-pagenavi-404error/648/
[sass]Invalid US-ASCII characterと出たら

##sassでコンパイルできない

コンパイルしようとしたら日本語が登場した部分で弾かれる。
大抵はfont-familyの設定とかそこらへん。

表示される文章は「**Invalid US-ASCII character**」。ふむ、わからん。
辞書と突き詰めるとUS-ASCII の文字が無効だよ、と。
つまり文字コードがおかしいと言ってるわけだ。

まあなんてことはなく、忘れずに冒頭に
`@charset "UTF-8";`
を宣言しておけば起こらないのでした。ちゃんちゃん。
WPFのDatePickerで年月入力

#はじめに
DatePickerで年月を選択させたいと考え調査した。
WinFormのDateTimePicerを使えば簡単に実現できるがBindができない。
Livetを使うのであれば、標準のDatePickerのほうがよい。
海外のページに[「WPF Toolkit DatePicker Month/Year Only」](http://youku.io/questions/213161/wpf-toolkit-datepicker-month-year-only)を見つけた。ここの、#3のAnserが良いと思い投稿する。

#イメージ
下図のように月が選択できるようになり、入力しやすくなっている。
![DatePickerイメージ.png](https://qiita-image-store.s3.amazonaws.com/0/63970/843eafd4-ded8-e42d-0fbb-3d0123f16431.png)

xamlでの指定

```xml
<DatePicker Control:DatePickerCalender.IsMonthYear="True"
            Control:DatePickerDateFormat.DateFormat="yyyy/MM"
            SelectedDate="{Binding 年月}"/>
```

#Usingの指定
上記リンクのソースをそのまま利用すると動作するようになるが、Usingが必要になる。
Usingで時間がかかったので下記に記す。

```csharp:DatePickerCalendar
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Threading;
```

```csharp:DatePickerDateFormat
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Threading;
```