OmniAICreator/Qiita-1.07M huggingface dataset:
UnityのRaycastを可視化する

#やりたい事
画面をタップした際に、画面上のキャラクター等をタップしたかどうか判定するのは一般的にRaycastを使うが、その飛ばしたRayをデバッグ目的で可視化したい。

#Debug.DrawRay()を使う

```csharp
if (Input.GetMouseButtonDown (0)) {
  float distance = 100;	// 飛ばす&表示するRayの長さ
  float duration = 3;	// 表示期間（秒）

  Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
  Debug.DrawRay (ray.origin, ray.direction * distance, Color.red, duration, false);

  RaycastHit hit = new RaycastHit ();
  if (Physics.Raycast (ray, out hit, distance)) {
    GameObject hitObject = hit.collider.gameObject;
    // （以下略）
  }
}
```

これでGameビューをクリックすると、Sceneビューに謎の赤いビームが表示されます。下記が実行例です（何も無いので分かり辛いですが、右下のGameビューを適当にクリックしまくった状態です）。

![image](https://qiita-image-store.s3.amazonaws.com/0/42051/73b88c44-ffbd-8f10-b287-3cce8e46e126.png)

#ドキュメント
[Unity - スクリプトリファレンス: Debug.DrawRay](https://docs.unity3d.com/ja/current/ScriptReference/Debug.DrawRay.html)
[Unity - スクリプトリファレンス: Physics.Raycast](https://docs.unity3d.com/ja/current/ScriptReference/Physics.Raycast.html)
Orelang(俺言語)をVim scriptで実装してみた

http://qiita.com/shuetsu@github/items/ac21e597265d6bb906dc#comment-9e44bdb74529dc3df9fe

http://blog.64p.org/entry/2016/09/30/014358

http://mattn.kaoriya.net/software/lang/go/20160930110535.htm

http://qiita.com/alpha_kai_NET/items/aa4c71a09f853fda7011

```vim
function! s:eval(e, v)
  if type(a:v) == type([])
    return s:doRun(a:e, a:v)
  endif
  return a:v
endfunction

function! s:doRun(e, v)
  let r = 0
  let m = a:v[0]
  if m == "step"
    for vv in a:v[1:]
      let r = s:doRun(a:e, vv)
    endfor
  elseif m == "until" 
    while !s:eval(a:e, a:v[1])
      let r = s:doRun(a:e, a:v[2])
    endwhile
  elseif m == "while"
    while s:eval(a:e, a:v[1])
      let r = s:doRun(a:e, a:v[2])
    endwhile
  elseif m == "set"
    let r = s:eval(a:e, a:v[2])
    let a:e[s:eval(a:e, a:v[1])] = r
  elseif m == "get"
    let r = a:e[s:eval(a:e, a:v[1])]
  elseif m == "<="
    let r = s:eval(a:e, a:v[1]) <= s:eval(a:e, a:v[2])
  elseif m == "="
    let r = s:eval(a:e, a:v[1]) == s:eval(a:e, a:v[2])
  elseif m == "+"
    let r = s:eval(a:e, a:v[1]) + s:eval(a:e, a:v[2])
  elseif m == "print"
    let r = s:eval(a:e, a:v[1])
    echo r
  else
    throw "unknown operator: " + string(a:v)
  endif
  return r
endfunction

let s:source = '
\["step",
\  ["set", "sum", 0 ],
\  ["set", "i", 1 ],
\  ["while", ["<=", ["get", "i"], 10],
\    ["step",
\      ["set", "sum", ["+", ["get", "sum"], ["get", "i"]]],
\      ["set", "i", ["+", ["get", "i"], 1]]]],
\  ["print", ["get", "sum"]]]
\'

let v = json_decode(s:source)
call s:doRun({}, v)
```
gitで手元の状態を保持しつつpullしたい

#
他人のソースをクローンしてきて、自分用のログ出力やコメントを入れることがよくある。
ソースの更新があった時にgit pullするが、追加した部分が衝突してしまったので、解決法のメモをしとく。

#一旦退避させてpullした後に戻す
git stash save *comment*
git pull 
git stash pop
ターミナルで空白や記号があるファイルの扱い方法


ファイルをサーバーからコピーしたいのだけど空白やら記号があって困った

```
¥ scp hoge@hoge.jp:tmp/hoge hoge(hoge).txt ./
-bash: syntax error near unexpected token `('
```

こんな時はファイル名を`""`で囲って文字列として扱えば良いのですって

```
¥ scp hoge@hoge.jp:tmp/"hoge hoge(hoge).txt" ./
```
【Swift】120°は何ラジアン？（角度から弧度を計算する）

#角度から弧度を計算するには

ビューを回転させたり、移動する方向を指定するとき、メソッドの引数は大抵が弧度法（ラジアン角）になっている。
そして、いつもラジアン格の計算方法を忘れてしまう。
70°回転させたい時は、何ラジアンなのか？
1回転（360°）なら、何ラジアンなのか？

忘れてしまうのは「理解していないこと」が原因だと、ずーっと感じていたのでここらで一旦、整理することにした。

##Swiftにおける円周率
円周率`π`（パイ）は 3.1415927… 

* `M_PI`
Darwin フレームワークで定義。Double型が返る。

* `Float.pi`
Swift標準ライブラリで定義（Swift3 ~）。Float型が返る。ただし、`3.14159`で丸められている。

##必要な公式
 円の円周の長さ`L`を求める
`直径 * 円周率π`
以上。あとは考え方で理解すればいい！

#理解の仕方
##角度とは
分度器で測れる「いつもの角度」のこと。90°なら直角のあれ。

##弧度法とは
円弧が長さ（`L`: Length）である時の角度rad（ラジアン）。つまり円周の長さ`L`を求めることになる。

#＃計算する
半径（`r`: Radius）を1とする。
円周の長さは `（半径r + 半径r）* 円周率π` になるので、円周の長さ = `2π`

円を一周（360°）ならラジアン角radは、 `2π`になる（Swiftでは、2M_PIで定義されている）。
180°なら半分だから、`π`となる
1°のラジアン角radは、`π / 180`で算出できる！

#要するに
角度θのラジアン角radは、`(π / 180) * θ`で算出できる！

```ruby:メソッドにしてみると
func radianFrom(Angle angle: Int) -> CGFloat {
    return CGFloat(M_PI / 180 * Double(angle))
}

radianFrom(Angle: 180)
```
Swift3でDataをNSDataにブリッジさせて使うとクラッシュする事がある


## 再現コード

タップされたら、適当なイメージを作ってPNGの`Data`を生成し、それをファイルに保存するだけのコードです。
`Data`を`NSData`にキャストして`write(toFile:atomically:)`を呼び出すとクラッシュします。

（iOS8.4で確認。iOS10では再現せず。）

```swift:ViewController.swift
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        let path = (documentDirectory as NSString).appendingPathComponent("test.dat")
        
        UIGraphicsBeginImageContext(CGSize(width: 100, height: 100))
        let img = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        if let img = img, let data = UIImagePNGRepresentation(img) {
            if (data as NSData).write(toFile: path, atomically: false) {
                print("保存しました。")
            }
        }
    }
}
```

## エラー箇所

![スクリーンショット 2016-09-30 18.02.29.png](https://qiita-image-store.s3.amazonaws.com/0/31347/b389bba8-2194-7506-48fd-e5ee7fb54ca1.png "スクリーンショット 2016-09-30 18.02.29.png")

## 回避方法

普通に`Data`型の方の書き出し機能を使えば良さそうです。

ただ、使い勝手があまり良くなかったのでextensionしました。

```swift:
extension Data {
    @discardableResult
    func write(toFile: String, atomically: Bool) -> Bool {
        return (try? self.write(to: URL(fileURLWithPath: toFile), options: atomically ? .atomic : [])) != nil
    }
}
```

これでブリッジさせなくとも、`write(toFile:atomically:)`が呼べますし、クラッシュもしなくなります。

## 最後に

急いで書いたので間違いがあったらすみません。
何故不正終了するのかなど、ご存知の方がいらっしゃいましたら情報を頂けると助かります。
Webサービスの連携を自動化する Huginn の紹介 

## 社内で使っているWebサービス

* Garoon
* Redmine
* Gitlab
* Chatwork
* Jenkins
* etc...

----
## サービスの連携を自動化したい

* Garoonのワークフローが完了したら
  * → メールでロールアウト連絡
  * → Redmineをクローズ
* GitlabでMergeRequestをマージしたら
  * → Redmineチケットを閉じる
* 月次の作業を自動でRedminチケットを作る

etc...

----
## 自動化ツールをどう作る？ スクリプトを書いてCRON実行？
----

![Huginn](https://camo.githubusercontent.com/1614fd76b6df8c66cd3a6c8d07e19248ca4b948f/68747470733a2f2f7261772e6769746875622e636f6d2f63616e74696e6f2f687567696e6e2f6d61737465722f6d656469612f687567696e6e2d6c6f676f2e706e67)

----
## Huginn

https://github.com/cantino/huginn

* 単体の機能(Agent)を組み合わせて自動化処理を構築できるWebサービス
* Webサイトを読み取ったり、イベントを受けて何らかの処理を実行できる
* 似たものとして、Yahoo! Pipes(閉鎖)、IFTTT
* Ruby on Rails + MySQL or PostgreSQL

----
## Huginn Agent

**入力系**
Twitterの投稿を取得 / RSSフィードを読み込む / WebHookを受け取る

**変換系**
CSVをパース / 条件に応じて継続・停止

**出力系**
メールを送信 / Webページを更新 / HTTP POSTする / Twitterに投稿

----
## まずはやりたいこと

* Garoonワークフローが完了したら
  * メールに送信
  * Chatworkに投稿

----
## Garoonから情報を取得するAgentが必要

---
## 作りました

Huginn Garoon Agents
https://github.com/namutaka/huginn_garoon_agents

* Ruby Gemとして作成
* Huginnにはプラグイン的に組み込む
* とりあえずは、Garoon ワークフローを取得できるところまで
* huginn_agent GemをつかってSkeltonを作成できる

----
## 参考リンク
* Garoon API 仕様書
  * https://cybozudev.zendesk.com/hc/ja/articles/202228424
* kwappaさんの Garoon API Ruby client
  * https://github.com/kwappa/ragoon
* Huginn Agentの作り方ドキュメント
  * https://github.com/cantino/huginn/wiki/Creating-a-new-agent
* Huginn Agent作成補助モジュール
  * https://github.com/cantino/huginn_agent

----
## デモ

----
## Huginnのメリット

* Web上の操作で自動化処理を作成・編集できる
* 各Agentの実行ログの記録ができる
* Agent間で受け渡しされるイベントを確認したり、再実行させることが簡単
* Agentを作るのが簡単
  * 実行されたらイベントを生成して出力するだけを作れば良い
  * JSON構造でメモリーを保持しておくことができる

----
## まとめ

* 作業の自動化をCRON実行するスクリプトよりはHuginnの方がよさそう
* Agentを用意してしまえば、各自で好きなように工夫できる
* ただし、
  * Web画面上の操作はちょっと分かり難いところもある
  * やりたいことに対して大袈裟すぎ？
  * 連携したいサービスのAPIが使いやすいのかどうか
phpDocで、継承されたクラスを記述する

# やりたいこと  
IDEを便利に使うために、動的なプロパティ・メソッドをphpDoc記述しています。
フレームワークで、こっそり継承されているクラスもphpDocに記載したい。

```php:具体的にはこんなやつ
class Hoge extends MY_Controller {

    public function __construct()
    {
        parent::__construct();
    }

    public function index()
    {
        $posts = $this->input->post();//<-これを記載したい。
        //$this->inputと記述した時点で「認識できない警告」が出る
    }
}
```

上のコードにある、$this->inputのinputがフレームワークで動的に挿入されており、このままではIDEが認識できない。。。


# 記載方法

@propertyの型にクラス名を記述する。

propertyの記載は、 
@property 型 $変数名 説明 
この型部分は、String,Integerのように変数の型を記載しますが、クラス名の記述も良いようです。

上の例では、inputは、フレームワークのCI_Inputという名前のクラスを使っていました。
なので、以下の用に記載すればIDEで認識されます。

@property CI_Input $input
と記述すれば、認識されます。


```php:phpDoc記述例
/**
 * Class MY_Controller
 * @property CI_Input $input 
 */
class Hoge extends MY_Controller {

    public function __construct()
    {
        parent::__construct();
    }

    public function index()
    {
        $posts = $this->input->post();//<-IDEでpostの引数や返り値も認識するようになった!
    }
}
```
PHPのバージョンごとの利用率

PHP7がどれくらい利用されているか気になったので調べたメモ。

### 利用率
調べたところ、下記ページに行き当たった。
https://w3techs.com/technologies/details/pl-php/all/all

2016年9月30日に調査した時点では、

>Version 5	97.4%
>Version 7	1.5%
>Version 4	1.1%
>Version 3	less than 0.1%

だそうです。

バージョンごとの利用率をさらに細分化したページもある。
https://w3techs.com/technologies/details/pl-php/5/all
https://w3techs.com/technologies/details/pl-php/7/all

PHP5の中では、

>Version 5.3	26.9%
>Version 5.4	26.4%
>Version 5.5	19.7%
>Version 5.6	16.2%
>Version 5.2	10.1%
>Version 5.1	0.7%
>Version 5.0	less than 0.1%
>Version 5.7	less than 0.1%

だそうです。

個人的な感想は、かなり古いバージョンが残っているな、といったところ。なお、それぞれのバージョンのPHPのサポート期限は、[PHPのリリース日とサポート期限](http://qiita.com/bezeklik/items/72d1ff8393f66673e2bc) に詳しく紹介されていました。このページによると、PHP5.5以前のバージョンはEOLなので、約80％はサポート期限切れの可能性があります。

追記: 2016年12月15日に再度確認してみました。

>Version 5	96.7%
>Version 7	2.2%
>Version 4	1.0%
>Version 3	less than 0.1%

となっていました。


さらに追記: 2017年3月25日に再度確認してみました。

>Version 5	95.3%
>Version 7	3.8%
>Version 4	1.0%
>Version 3	less than 0.1%


さらに追記: 2017年7月5日に再度確認してみました。

>Version 5	93.2%
>Version 7	5.9%
>Version 4	0.9%
>Version 3	less than 0.1%

さらに追記: 2017年10月4日に再度確認してみました。

>Version 5	90.9%
>Version 7	8.2%
>Version 4	0.9%
>Version 3	less than 0.1%


### 一年間、変化を追跡して
version5 は 97.4% => 90.9%
なので、一見するとバージョン5は減ったように見えます。一方で
version7 は 1.5% => 8.2%
と大分増えています。。

バージョン7が1年前と比較して、+7.3％純増したと仮定すると、
バージョン7の利用率は (1.5+7.3)/(100+7.3) ≒ 0.082 となり、
このときバージョン5の利用率は 97.4/(100+7.3) ≒ 0.908 となります。

なので、バージョン5は、割合としては減っているものの、総数はほぼ横倍だと思われます。
LaravelでDBからデータを取得する処理を実装した時の実装手順

①実装した機能
usersテーブルから情報を取得しアカウント管理画面に表示

②用意したファイル
[コントローラー]
・UserController
　・・UserServiceを操作する
[モデル]
・UserRepositoryInterface.php
　 ->usersテーブルからidを指定したレコードを取得するインターフェース
・UserRepository.php
　 ->UserRepositoryInterfaceの実装
・UserRepositoryProvider.php
　 ->UserRepositoryをサービスコンテナへ登録する
・UserService.php
　 ->UserRepositoryを操作する
・User.php
　 ->usersテーブルのEloquentモデル
[ビュー]
・account.blade.php
　 ->取得したユーザー情報を表示する
[設定ファイル]
・config/app.php
　 ->UserRepositoryProviderを登録する
③実装した手順(あっているかは不明)
・User.php(作成済み)
1.usersテーブルから情報を取得するDB操作の処理を記述
・UserRepositoryInterface.php
・UserRepository.php

2.UserRepositoryInterfaceがインスタンス化される際に、UserRepositoryがインスタンス化されるようにUserRepositoryProviderのregister()メソッドでバインドする
　$this->app->singleton('インターフェース','具象クラス');
　※具象クラスが解決される際は自動でインスタンス化してくれるため、バインド時にインスタンス生成処理を書かなくていい

3.UserRepositoryProviderをconfig/app.phpの'provider'に登録する
　これが無いとUserRepositoryProviderが働かずUserRepositoryがインスタンス化されない

4.UserServiceにUserRepositoryを操作する処理を記述(findUserメソッド)
  まず、コンストラクタの引数にタイプヒンティングでUserRepositoryInterfaceを渡す
　(useにUserRepositoryInterfaceを定義しておけば自動でインスタンス化してくれる)
　コンストラクタの中では渡されたインスタンスを変数に格納する

　次に、findUserメソッドを記述する。
　UserRepositoryInterfaceを渡しておけば、UserRepositoryProviderに記述したように、UserRepositoryのインスタンスを使えるため、UserRepositoryのfindUserメソッドを使う

5.UserControllerからUserServiceのfindUserを使い、取得したデータをViewに渡す
　今回コントローラーから直接リポジトリを使ってもよかったが、今後、UserServiceの中身が増える可能性を考慮してUserServiceを介した
　viewに渡す際は、view('account')->with('user',$user);という風に、withの中に「キー」と「値」を定義する

6viewのbladeテンプレートで渡されたデータを表示する
　{{ $user->name }}
　$userのuserは「キー」に定義されたものを使う

<参考サイト>
・LaravelでViewにデータを渡す様々な方法
http://dim5.net/laravel/accessing-view-data.html
・サービスプロバイダの作成
https://laravel10.wordpress.com/2015/04/23/サービスプロバイダーの作成/
https://laravel10.wordpress.com/2015/04/22/サービスプロバイダー/#more-1027
・リポジトリ、サービス導入イメージ(P21~23)
http://www.slideshare.net/yuukitakezawa/laravelmvc
・リポジトリパターンについて
http://tech.aainc.co.jp/archives/10227
・Laravelで学ぶMVC
http://www.slideshare.net/mikakane/laravel-mvc
MacでASP.net を動かしてみた

# 背景

+ ASP.net のシステムをメンテナンスしなくてはいけない可能性が出てきた
+ どうやらそのシステムをメンテナンスしてる人は皆Windows で開発してるようだ
+ オレだけmac。。。まずは環境を作らねば！
+ perl, php, ruby で何年も戦ってきたのにココに来てASP.net かー

# とりあえずサンプルアプリをMac で動かすぞ！

### dnvmをインストール

```bash
$ brew tap aspnet/dnx
$ brew update
$ brew install dnvm
$ echo source dnvm.sh >> ./bash_profile
$ source ~/.bash_profile
```

### yeomanをインストール

```bash
$ brew install node
$ npm install -g yo
$ npm install -g generator-aspnet
```

### .net core のインストール

+ ここだけコマンドではなく、[microsoftのホームページ](https://www.microsoft.com/net/core#macos)から落としてきてインストールです
+ サイト上に書いてある説明文を実行

```bash:2016-09-30に書いてあった事を転記
$ brew update
$ brew install openssl
$ ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/
$ ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/
```

+ dotnet コマンドのPATHが通ってなかったのでPATH通ってる場所にコピー

```bash
$ ln -s /usr/local/share/dotnet/dotnet /usr/local/bin/
```

# サンプルアプリ作成

```bash
$ mkdir gessy0129
$ cd gessy0129
$ yo aspnet
```

+ なんか色々聞いてくるので後は適当に

# 起動！！！

```bash
$ dotnet restore
$ dotnet run
```

http://localhost:5000/ でアクセスすれば見れるっぽい
gitで変更があったらメールする簡易bashスクリプト

bashのこざかしスクリプトです。
「あのファイル、置いといたよ」とか「更新しといたよ」を、先にどのファイルか知りたいことありますよね。

環境:Centos6,7
git,sendmail,screen はインストール、設定済みとします。
※環境によって、メールじゃなかったりするかと思うので、解説が入っているので分解合体してください。

#献立
- bashで git の変更を検知する。
- メールを送るワンライナー。
- 簡単ループを作成する。
- 調合そして実行。
- おまけ、ファイルが大量のときのファイル変更を知りたいとき。

#bashで git の変更を検知する。
監視gitパスを各自書き換えてください
TIP: [[ の前後は空白をあけないと理由あってエラーとなるので注意。

```bash
if [[ `cd /git/path/ ;git commit --dry-run | tail -n 1 | grep "nothing"` == "" ]]; then
echo 'changed';
fi;
```

#メールを送るワンライナー。
TIP:\`\`の実行結果を""で囲むと改行を保持できる。
+ - の変更箇所のみメールに記載する。

```bash
echo "`git diff HEAD^`" | grep -e "+" -e "-"  |sed 's/^/To: hoge@example.com\nSubject: git changed\n\n/' | sendmail -t
```

#簡単ループを作成する。
watch と while を使う方法があるけども、watch はダブルクォーテーションを使うので、今回はwhile

```
while true; do
sleep 5;
echo "hello"
done;
```

#調合そして実行。
処理の継続は、nohupやscreenがある。今回はscreen上で継続させる。TIP:デタッチは Ctrl+A, Ctrl+D

```bash
while true; do
sleep 5;
if [[ `cd /git/path/ ;git commit --dry-run | tail -n 1 | grep "nothing"` == "" ]]; then
echo "`git diff HEAD^`" | grep -e "+" -e "-" |sed 's/^/To: hoge@example.com\nSubject: git changed\n\n/' | sendmail -t
fi;
done;
```

#おまけ、ファイルが大量のときの変更を知りたいとき。
gitが重くなるから全部管理できないよという場合は、ls情報をls.txtに保存してそれのみを git に管理させる手もあります。
TIP: maxdepthで階層を制限できます。-not -iwholename '*/.git*'で除外できます。

```bash
while true; do
sleep 5;
find . -maxdepth 2 -not -iwholename '*/.git*' -print0 | xargs -0 ls -lsa | grep -v "ls.txt" | grep -v ".git" > ls.txt;
if [[ `cd /git/path/ ;git commit --dry-run | tail -n 1 | grep "nothing"` == "" ]]; then
echo "`git diff HEAD^`" | grep -e "+" -e "-" |sed 's/^/To: hoge@example.com\nSubject: git changed\n\n/' | sendmail -t
fi;
git add .;
git commit -m "auto log.."
done;
```
Thunderbirdのメッセージフィルタを移行する

#前書き
Thunderbirdのメッセージフィルタの移行はMessage Filter Import/Export Enhancedを使うことが多いらしいが、Thunderbirdのアドオン管理機能からは検索されず、更新もしばらくされていないので使いたくない。
##動作環境
移行元 Thunderbird 45.3.0 (Arch Linux 64bit)
移行先 Thunderbird 45.3.0 (Windows 10 64bit)
前のバージョンでも問題ないと思われる。

#操作
そもそも、メッセージフィルタの設定ファイルがどこにあるのかわかれば、そのファイルを移行すれば問題ない。
ファイルはmsgFilterRules.datというもので、これを適宜コピーなどすればいい。
場所は
Linuxの場合
`~/.thunderbird/[profile].default/[Mail or ImapMail]/[domain]/msgFilterRules.dat`
Windowsの場合
`$HOME\AppData\Roaming\Thunderbird\Profiles\[profile].default\[Mail or ImapMail]\[domain]\msgFilterRules.dat`
Macだと
`$HOME/Library/Thunderbird/Profiles/[profile].default/[Mail or ImapMail]/[domain]/msgFilterRules.dat`
にある。

[Mail or ImapMail]はpopかImapかで代わる(と思う)。

移行先では
1. Thunderbirdの停止(終了)
2. 該当ディレクトリ/フォルダにコピー
3. Thunderbird起動

#参考
[Thunderbirdのフィルタの移行・バックアップの取り方 | ネット衆善奉行](http://p2pzen.com/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%83%BB%E8%A3%8F%E6%8A%80/thunderbird%E3%81%AE%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%81%AE%E7%A7%BB%E8%A1%8C%E3%83%BB%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%AE%E5%8F%96%E3%82%8A%E6%96%B9/ "Thunderbirdのフィルタの移行・バックアップの取り方 | ネット衆善奉行")
[Thunderbirdのメッセージフィルタ移行 - hiraiva.log](http://hiraiva.hatenablog.com/entry/2013/01/13/190536 "Thunderbirdのメッセージフィルタ移行 - hiraiva.log")
[Thunderbird 24.2.0 のメッセージフィルターを移行する | M-Gate](http://mgate.info/computer/software/thunderbird/770/ "Thunderbird 24.2.0 のメッセージフィルターを移行する | M-Gate")
UnityのGameObject.Find()でnullが帰ってきてしまうときの対処法

#GameObject.Find()とは
UnityEngineで提供されているGameObjectクラスをつかってシーン内のオブジェクトを取得する関数．引数に対象のオブジェクト名，相対パス，絶対パスが指定できる．詳しくは[公式のマニュアル](https://docs.unity3d.com/ja/current/ScriptReference/GameObject.Find.html)参照．

#nullが帰ってくるとき
##パスが間違っている(orオブジェクトが存在しない)
スペルミスやそもそも対象のものがないとき．これは直せばOK．

##アクティブでない
公式マニュアルにもあるが，対象がアクティブになっていないときはnullになる．(これに気付かないでハマってた)
こういう場合は，親オブジェクトを経由することで取得する方法がある．Transform.Find()はアクティブでなくても取得できるので，以下のようなコードを書けば取得できる．transformからGameObjectに変えなければいけないので注意．

```C#:FindTest.cs
GameObject parent, target;

void Start() {
 parent = GameObject.Find("path/to/oya");
 target = parent.transform.Find("WantIt").gameObject;
}

void Update() {
 //処理
}
```
ソースからインストールした postrgeSQL で ansible postgresql_db が動かない

yum などではなくソースから make/make install した PostgreSQL で、ansible の postgresql_db モジュールを使うと、エラーが出て動きません。

```
fatal: [192.168.33.21]: FAILED! => {"changed": false, "failed": true, "msg": "unable to connect to database: サーバに接続できませんでした: そのようなファイルやディレクトリはありません\n                              ローカルにサーバが稼動していますか?\n                              Unixドメインソケット\"/var/run/postgresql/.s.PGSQL.5432\"で通信を受け付けていますか?\n"}
```

ソースからインストールした場合は /tmp に .s.PGSQL.5432 があるので、
`login_unix_socket` を設定してやると動く

```
  postgresql_db: >
    name=mydb
    login_user=postgres
    login_unix_socket=/tmp/
    encoding=UTF-8
```
Wordpress simple mapをインストールしようと思ったらエラー

Wordpress4.6.1でPluginのsimple mapをインストールしようとしたら

>ダウンロードに失敗しました。 error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm

の表示が出てインストールができない

wp-include/class-http.php 204行

'sslverify'=>true　を　false　に変更

解決しました！
覚書・・・
Spotifyアカウントの国設定をアメリカから日本に変更する

2016/9/29からSpotifyが満を持して日本でもサービスを開始しましたね。
かつて待ちきれなかった私は、~~海外のproxyを経由して~~海外滞在中に登録して利用いたため、アプリにログイン出来ないという問題に遭遇してしまいました。
この問題の対処法を調べたので、まとめておきたいと思います。

**ここから先は「招待コード」を持っているユーザー専用の説明になりますので、それ以外の方は悪しからず。**

**変更完了までには最大48時間かかり完了後は通知がある旨のメッセージが表示されますが、3日経ってもSpotifyからの連絡がない場合でも、[プロフィールを編集](https://www.spotify.com/jp/account/profile/)ページを確認すると国を変更できるようになっている場合があることがわかりました。この場合、自動では切り替わりませんのでご注意下さい！**

## [解決方法] カスタマーサポートに依頼する

やることは次の3ステップだけです。ただし、3番目は注意が必要です。

1. [カスタマーサポートに問い合わせる](https://support.spotify.com/jp/country-move/)にアクセスする。
2. 「あなたの招待コード」にお手持ちの招待コードを入力して「アカウントを日本に変更する」をクリックする。
3. Spotifyからの変更完了メールは来ないので、[プロフィールを編集](https://www.spotify.com/jp/account/profile/)ページの国のリストを確認してみて、「日本」が選択可能になっていたら選択して「プロフィールを保存」する。

![support.png](https://qiita-image-store.s3.amazonaws.com/0/39561/c510115c-8524-77dc-657f-b3f992f9c1bb.png)

「切り替わります」は「切り替え可能になります」と読み替えたほうが良いかも。
「切り替え完了時にはお知らせいたします！」→お知らせはありませんでした
![accepted.png](https://qiita-image-store.s3.amazonaws.com/0/39561/ecb7a32e-1557-bd28-6870-0b3f122efccb.png)

知らせを待ちわびて、4日後に覗いてみると...やったヽ(´ー｀)ノ
![jp.png](https://qiita-image-store.s3.amazonaws.com/0/39561/bde72ecc-cfb5-9048-a18e-7066a723845c.png)

## [参考] エラー発生の様子
例えばMacのSpotify.appを起動して、アカウント情報を入力しログインボタンをクリックすると、こんなメッセージが表示されます。
![spotify_app_error.png](https://qiita-image-store.s3.amazonaws.com/0/39561/95e0cebf-07a5-32f2-fa14-04db731b48dc.png)

この画面で、「プロフィールを更新する」をクリックすると、Webブラウザが起動して次のページにリダイレクトされます。
![profile_update.png](https://qiita-image-store.s3.amazonaws.com/0/39561/f2e30a2d-cf00-92da-faaa-9fd3a600888d.png)

そして「プロフィールの編集」ボタンをクリックすると、次のページに飛びます。
![profile.png](https://qiita-image-store.s3.amazonaws.com/0/39561/790ce7e0-57da-6d75-32c6-df0261d8c04d.png)
いかにも国名がズラズラっと出てきて選択出来そうなリスト型のUIですが、ここではアメリカ一択です。さあ困ったというハマり方をします。


以上になります。
楽しいSpotifyライフを！
Windows Server + Jenkins + Gitolite + ASP.NET

## 概要
既存のASP.NETのプロジェクトをビルドするジョブを組むまで
MSBuildをキックしたいのでWindowsServerで動かす必要がある
リポジトリはGitolite
ビルド後のデプロイはWindowsのコマンドで行う

## インストール
WindowsServerに以下のものをインストールする。
- Jenkins
- Git for Windows
- MSBuild その他、OSのバージョンやビルド対象物に合わせて.NET Frameworkなど

*各ツールのインストール方法は他記事に任せて、今環境特有のポイントを記載します*

### Jenkinsのインストール
- Windows版をダウンロードしてmsiを実行すればサービス登録までしてくれて簡単
- 途中インストール先が以下のようになっているので変更する
`C:¥Program Files¥Jenkins` => `C:¥Jenkins`

### Git for Windowsのインストール
- 途中インストール先が以下のようになっているので変更する
`C:¥Program Files¥Git` => `C:¥Git`
- Adjusting your PATH environmentは `Use Git from the Windows Command Prompt`を選ぶ。Jenkinsからコマンドで実行するため
- Configuring the line ending conversionsは `Checkout as-is, commit as-is`を選ぶ。Gitにあがっているソースをそのまま扱うため
- Configuring the terminal emulator to use with Git Bashはどちらでも良い
- Configuring extra optionsはどちらもチェックを外す。ちなみに`Git Credential Manager`は HTTPSでの認証を助けるものなので、今回のGitolite（SSH）には使えない

### MSBuildと.NET Frameworkのインストール
サーバーのOSやビルド対象のプロジェクトによって必要
例えばWindows Server 2008で.NET Framework3.5が必要なプロジェクトだとデフォルトで入っていないので、サーバー管理でインストールする必要がある
MSBuildは.NET Frameworkに含まれているので、基本的にはそれがビルドに使える
うまくいかない場合、VisualStudioに含まれるバージョンもダウンロードできるのでそちらを使うと良いかもしれない。

## Jenkinsの設定
###プラグインのインストール
プラグインの管理メニューから、以下のプラグインをインストールする
Git Plugin
MSBuild Plugin

###Git Pluginの設定
Global Tool Configurationから、`Git Installations`に`Add Git`
`Path to Git executable`に `C:/Git/bin/git.exe`

###MSBuild Pluginの設定
同じ画面で`Add MSBuild`
`MSBuild.exe ファイルパス`に `C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe`
※もともと入っている.NET4.0のMSBuildでいい場合
※別のMSBuildを使いたい場合はそちらのパスを入れる。
※WARNINGが出るが気にしないで良い

###認証情報の登録
|項目|値|
|:-:|:-:|
|種類|SSHユーザー名と秘密鍵|
|スコープ|グローバル|
|ユーザー名|gitolite|
|秘密鍵|直接入力|
|鍵|id_rsaの中身をコピペする|
|パスフレーズ||
|ID|任意|
|説明|任意|

※秘密鍵がパスフレーズありの場合、この方法は使えません。Credential PluginはLinuxの場合正常に動きますが、Windowsだとパスフレーズが扱えないようです。

##JOB作成
###フリースタイルプロジェクトで作成する
###ソースコード管理でGitを選択
Repository URLに`ssh://サーバー:ポート/リポジトリ`
Credentialsに `gitolite`を選択
*ここで一回ジョブを実行してみる `Cloneしたファイル`を確認しておく*

###ビルド
1. ビルドでビルド手順の追加
1. `MSBuildの実行`を選ぶ
1. MSBuildバージョンにさっき追加したMSBuildを選択
1. MSBuildビルドファイルにビルド対象のsln または csprojのパスを入力する。上記で確認した`Cloneしたファイル`のフルパスを書く
1. コマンドライン引数に` /t:プロジェクト;Clean /p:Configuration=Release`
※これはソリューションの一部をビルドしたい場合。もしビルドファイルにプロジェクトファイルを入力した場合は、プロジェクトは書かない。
※このあとビルドしたものをデプロイするが、もしデプロイに`msdeploy`を使う場合は、`/t:Package`とする必要がある。それは別サイトを参照ください

###デプロイ
2. ビルドでビルド手順の追加
2. `Windowsバッチコマンドの実行`を選ぶ
2. robocopyなり、moveなりを使ってデプロイとコンフィグの調整などを行う
例：
```
robocopy C:\Jenkins\workspace\HOGE\PrecompiledWeb\HOGE C:\HOGE /E
del C:\HOGE\web.config
move C:\HOGE\web.config.test C:\GDPW\web.config
```

###実行してみる

###参考になったURL
https://gist.github.com/dany1468/2234130
OpenFrameworksでQuickTime/QuickTime.h not foundというエラーが出る

映像やりたい、インタラクティブなメディアアートやりたい。
OpenFrameworksやろう。

OpenFramworksを開いてexamplesから
サンプルアプリを起動してみる。

エラーばかり…

どうやらQuickTimeの問題。

QuickTimeあるのにダウンロード。
でも出来ない。

さらにググる。
どうやらSDKの問題らしい

参考リンク：
http://qiita.com/mari_286/items/389a6b42f1e7a28d0730

<ul>
<li>El Capitan</li>
<li>Xcode8</li>
<li>of_v0.9.2_osx_release</li>
</ul>

僕は9.3だったが、同じ感じでやってみる。
が、思うようにならない。


そこで
macOS Sierraにアップデート

https://forum.openframeworks.cc/t/quicktime-quicktime-h-file-not-found/24494/3

こちらにも貼られているが、
macOS Sierraに対応した9.4がダウンロードできるみたい

http://openframeworks.cc/versions/v0.9.4_RC1/


出来た！！！！！！
To Transfer Parallels' images to Amazon S3, Tar Them

# Problem

Parallelsのイメージ(.pvm)をCyberduckでS3に転送しようとしたら、「ファイルが見つからない」というエラーが出ます：

You'll get a 'File not found' error if you try to upload a Parallels image to Amazon S3:

![Cyberduck error dialog: File not found: blah blah...](https://qiita-image-store.s3.amazonaws.com/0/26039/5f5eed37-50fe-ea7f-5fd0-9063293c9181.png)

# Cause

これはFinder上で単一ファイルに見えているイメージファイル(.pvm)が実は「パッケージ」であることに起因します。

Why it happens is Paralles images are not 'files' but 'packages' in the filesystem.

> In the Apple macOS operating system, a package is a file system directory that is normally displayed to the user by the Finder as if it were a single file. --- [Wikipedia](https://en.wikipedia.org/wiki/Package_(macOS))

# Solution

Parallelsのイメージを転送するもっとも簡単な方法は、tarballにすることだと思います。数十GBのイメージをtarするのには、それなりの時間がかかるかと思いますが。

I think tarballing the image is the easiest way to transfer it. It may take a while to tar a tens of gigabytes of a Parallels' image.

```shell-session
tar cvf Windows\ Vista.pvm.tar Windows\ Vista.pvm
```
Realm Mobile Platform を試してみた（Linuxサーバ編）

先日リリースされた[Realm Mobile Platform](https://realm.io/jp/products/realm-mobile-platform/)をiOS(swift)とLinuxサーバ(centOS6.5)で試してみた。

## Linuxサーバ側 手順
### 1.リポジトリの設定
```bash
curl -s https://packagecloud.io/install/repositories/realm/realm/script.rpm.sh | sudo bash
```

### 2.Realm Object Server のインストール
```bash
sudo yum -y install realm-object-server-de
```

### 3.サービス起動
```bash
sudo chkconfig realm-object-server on
sudo service realm-object-server start
```

### 4.admin token の取得
※後でRealm Browserでサーバに接続するのに必要

```bash
cat /etc/realm/admin_token.base64
```

## mac側 手順
### 1.ブラウザを起動し、サーバ管理画面にアクセス
初回起動時にはメールアドレスとパスワードを入力して登録してください。

接続URL:http://{サーバIP}:9080/

### 2.デモアプリのソースコード入手
```bash
git clone https://github.com/realm/RealmTasks.git
```

### 3.ビルド準備
```bash
cd RealmTasks/RealmTasks\ Apple/
pod repo update #念のためpodのリポジトリ更新
pod install
```


### 4.Xcode8でRealmTasks.xcworkspaceを起動

### 5.ソースコード修正
RealmTasks Shared配下のConstants.swiftのサーバー向け先を修正

```Constants.swift
    #if os(OSX)
    static let syncHost = "127.0.0.1"
    #else
//    static let syncHost = localIPAddress
    static let syncHost = "XXX.XXX.XXX.XXX" // 任意のサーバ
    #endif
```

### 6.アプリビルド及び実行

アプリではタップもしくは下にスワイプすることでタスクを追加できます。

### 7.Realm Browserでサーバ側データベースにアクセス
[Realm Browser](https://itunes.apple.com/jp/app/realm-browser/id1007457278?mt=12)

Realm Browserを起動し下記手順でアプリで追加したタスクがサーバ側に同期されていることが確認できます。また、Realm Browserでタスクの完了チェック等を実行するとアプリ側でもタスクがチェックされ即時に同期されることが確認できます。

![realm001.gif](https://qiita-image-store.s3.amazonaws.com/0/108515/bb26006b-80e6-e1ac-61b6-079982a94b08.gif)

![realm002.gif](https://qiita-image-store.s3.amazonaws.com/0/108515/37248210-9b31-3fa2-0fcc-b430a95082c0.gif)

![realm003.gif](https://qiita-image-store.s3.amazonaws.com/0/108515/a23555d3-d368-3807-9338-cd28af75d815.gif)


## 所感
サーバ側の設定もかなり簡単だったので、使いどころによってはかなり有用だと思う。

個人的にはサーバ側のrealmデータベースをコマンドラインやphp,ruby等のライブラリで簡単に更新できる仕組みが欲しい。（ドキュメントを読み込んでないので、もしかしたらできるのかもしれないが・・）

## 参考
[Realm Mobile Platformを最速で試してみた（チュートリアル）](http://qiita.com/touyoubuntu/items/c115aac90507edd9e083)
[geelive blog (Realm Mobile Platform を試してみた)](http://blog.geelive-inc.com/archives/34)
EC-Cube2.1x系にPayPalを導入する方法

###**PayPalモジュールのインストール**
まずは、[こちらのドキュメント](https://www.ec-cube.net/document/MN02_module_install.pdf)の手順でPayPalのプラグインをインストールしてください。

実際の画面はドキュメント中の画面と少し差があります、下記スクリーンショットをご参考ください。
まず、[こちら](https://www.ec-cube.net/owners/)にアクセスして、「ストア内検索」で「PayPal」キーワードを検索する。
 ![EC-Cube7.png](https://qiita-image-store.s3.amazonaws.com/0/124793/ad2ea1f6-f903-7558-39f8-79c79351db07.png)

検索結果一覧画面で下記2つPayPalプラグインがあります。
「ペイパル ウェブペイメント プラス 決済モジュール」は、クレジットカード決済、継続課金をサポートしています。
クレジットカード決済のサービスを利用するには別途審査が必要です、具体的には下記URLをご参考ください。
https://www.paypal.com/jp/webapps/mpp/webpayment-plus
「ペイパル エクスプレスチェックアウト決済モジュール」は一般的な決済サービスです。具体的には下記URLを参考してください。
https://www.paypal.com/jp/webapps/mpp/express-checkout
 ![EC-Cube13.png](https://qiita-image-store.s3.amazonaws.com/0/124793/068f36b1-ec1b-83bf-d4c0-e82d36b38a8d.png)
上記プラグインの1つを選択して、次の設定手順は[こちらのドキュメント](https://www.ec-cube.net/document/MN02_module_install.pdf)を参考してください。

###**PayPalモジュールの設定：**
**ペイパル エクスプレスチェックアウト 決済モジュールの設定：**
下記設定画面で、APIユーザー名、パスワード、署名を設定し、本番環境を利用する場合は「Sandboxを使用する」をチェックしないでください。
ほかの設定内容はページ内の説明文を参考してください。
※Sandboxテスト環境の使用方法は下記URLを参考してください。
http://qiita.com/PayPal_MTS/items/5cde5e00418f454f24a8
※Log In With PayPalは ペイパルのアカウントでECサイトにログインができるサービスです。会員登録をする手間を省き、かんたんに決済ができます。
 ![EC-CUBE 管理機能 ペイパル エクスプレス チェックアウト 決済モジュール 2016-09-27 17-10-15.png](https://qiita-image-store.s3.amazonaws.com/0/124793/0c8cb4f0-7d8e-9b6b-8536-662dd7d44ea5.png)



**ペイパル ウェブペイメント プラス 決済モジュールの設定：**
クレジットカードと継続課金を利用しない場合、下記設定画面に従って設定してください。
「決済サイトURL」は、本番環境の場合、下記URLを設定します。
「https://www.paypal.com/jp/cgi-bin/webscr」
Sandbox環境の場合は下記URLを設定します。
「https://www.sandbox.paypal.com/jp/cgi-bin/webscr」

 ![EC-CUBE 管理機能 PayPal決済モジュール 2016-09-29 13-37-16.png](https://qiita-image-store.s3.amazonaws.com/0/124793/4d52a261-d861-dda4-790d-ba14c619e2fa.png)


クレジットカードと継続課金を利用する場合は、下記設定画面に従って設定してください。
「決済サイトURL」は、本番環境の場合下記URLを設定します。
「https://securepayments.paypal.com/acquiringweb?cmd=_hosted-payment」
Sandbox環境の場合は下記URLを設定します。
「https://securepayments.sandbox.paypal.com/acquiringweb?cmd=_hosted-payment」
「継続課金機能」、「課金サイクル」と「バッチ実行方式」の詳細は設定画面の「>>説明」を参考してください。
 ![EC-CUBE ペイパル ウェブペイメント プラス 決済モジュール.png](https://qiita-image-store.s3.amazonaws.com/0/124793/a8d67bf5-bccf-6869-dea9-0c3071cdee3c.png)


PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
HerokuでPG::InsufficientPrivilege: ERROR:  permission deniedと表示されました。

heroku上のRailsアプリケーションから書き込みができなくなりました。

# PGに書き込めないというエラー
`heroku logs`でログを確認します。

```bash:エラー抜粋
Completed 500 Internal Server Error in 16ms (ActiveRecord: 4.8ms)

ActiveRecord::StatementInvalid (PG::InsufficientPrivilege: ERROR:  permission denied for relation events

・・・
```
`Internal Server Error`がでていて、PGに`permission denied`というエラーがでています。

# pg:infoを確認
herokuのpgの状態を確認します。

```bash:pgの状態を確認
heroku pg:info
```

## Write access revokedになっている

```bash:pgを確認
heroku pg:info --app pugiemonn-com
=== DATABASE_URL
Plan:        Hobby-dev
Status:      Available
Connections: 2/20
PG Version:  9.4.9
Created:     2015-06-22 12:09 UTC
Data Size:   20.1 MB
Tables:      9
Rows:        62634/10000 (Write access revoked)
Fork/Follow: Unsupported
Rollback:    Unsupported
Add-on:      gazing-quickly-4990
```
Rowsに注目すると**Write access revoked**と表示されています。
上限が1万行とあるのに6万行書き込まれているのが問題なのかと考えました。

## レコードを削除
[heroku pg:psql](http://qiita.com/pugiemonn/items/0e69b7a29a384b356e65#postgres%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3)を使用して1万行以上レコードがあるテーブルを確認し、レコードを削除しました。

## 再度pg:infoを確認
再びpg:infoを実行します。

```bash:pgを確認
heroku pg:info --app pugiemonn-com
=== DATABASE_URL
Plan:        Hobby-dev
Status:      Available
Connections: 2/20
PG Version:  9.4.9
Created:     2015-06-22 12:09 UTC
Data Size:   20.0 MB
Tables:      9
Rows:        301/10000 (Write access revoked) - refreshing
Fork/Follow: Unsupported
Rollback:    Unsupported
Add-on:      gazing-quickly-4990
```
**Write access revoked**とは表示されていますが、こんどはrefreshingがついています。

## 少し待ってから再度pg:info

```bash:pgを確認
heroku pg:info --app pugiemonn-com
=== DATABASE_URL
Plan:        Hobby-dev
Status:      Available
Connections: 2/20
PG Version:  9.4.9
Created:     2015-06-22 12:09 UTC
Data Size:   16.7 MB
Tables:      9
Rows:        303/10000 (In compliance)
Fork/Follow: Unsupported
Rollback:    Unsupported
Add-on:      gazing-quickly-4990
```
Rowsの箇所が**In compliance**に変わっています。

# Railsから書き込み
今度は書き込みができました :blush: 

# 参考
https://kb.heroku.com/write-access-revoked-on-postgres-hobby-databases
はじめての Play Framework でAPIもどき

## ( ^ω^ )
Scalaに少しずつ馴染んできたので、Play Frameworkを使ってみました。
まずはGETメソッドのリクエストにJson形式のレスポンスを返すAPIもどきを作ってみます。
ちなみに、環境は Windows 7 & JDK 8 & Play 2.5 です。

※追記: 次のステップの記事を書きました → [はじめて(一週間ぶり2回目)の Play Framework でデータベース接続してみる](http://qiita.com/asano-y/items/a2f429134a543f6fa068)

## ここにPlayがあるじゃろ？

1. activatorのダウンロード
[ここ](https://www.playframework.com/download)からactivatorというもののZipをダウンロードし、好きなところに展開します。

2. パス通す
展開した activator-1.3.10-minimal\bin\activator.bat をコマンドプロンプトで呼び出すのでパスを通しておきましょう。

3. Playアプリケーションの作成

        > activator new TestApp play-scala
TestAppがアプリケーション名です。

4. Playアプリケーションの実行

        > activator run


## これをこうして

ソース構造(主要なもののみ)は下のようになっています。
app以下に各種クラス、confに設定ファイル、publicは公開ディレクトリですね。

```
 |- app/
    |- controllers/
    |- filters/
    |- models/
    |- services/
    |- views/
 |- conf/
    |- application.conf
    |- routes
 |- public/
    |- images/
    |- javascripts/
    |- stylesheets/
 |- test/
```

まずはroutesファイルに行を追加。/api/simple へリクエストが来たら controlles.ApiController の simple アクションを呼び出すということですね。

Userコンパニオンオブジェクトに暗黙的json変換を定義しておけば、Json.toJsonにUserインスタンスを投げた時うまいことJsonに変換してくれます。


## こうじゃ
Playアプリケーションはデフォルトでは `http://localhost:9000` でアクセスできます。
`http://localhost:9000/api/simple` を見てみると

![vivaldi.png](https://qiita-image-store.s3.amazonaws.com/0/118352/cadd1e40-7330-cc4f-9969-ca750630e97b.png)


やったね！
ちなみにFiddlerで見るとこんなふうに。特にコード内で指定していないのですが、Content-Typeはapplication/jsonになってますね。


![Fiddler.png](https://qiita-image-store.s3.amazonaws.com/0/118352/42fe876c-b2af-1c74-00e2-620dd5094a67.png)
【Memo】mt:Var、mt:SetVar、mt:Vars、mt:SetVarBlockに関して


MTの変数に関してのメモになります。
処理の仕方で忘れたりすることが多いので、こちらのエントリーにまとめておきます。

## SetVarsで定義した変数を、同じSetVars内のValue内で使用できない。

以下のように、変数thisFirstNameを同じVars内にある変数thisLastNameのValueには入れることはできません。

```
<mt:SetVars>
thisFirstName=FristName
thisLastName=LastName：<mt:Var name="thisFirstName" />
</mt:SetVars>
<mt:Var name="thisLastName" />  // 出力 LastName：
```

このように、thisFirstNameを外で定義しなければいけません。

```
<mt:SetVar name="thisFirstName" value="FristName" />
<mt:SetVars>
thisLastName=LastName：<mt:Var name="thisFirstName" />
</mt:SetVars>
<mt:Var name="thisLastName" />  // 出力 LastName：FristName
```

または以下のようにも書けます。

```
<mt:SetVar name="thisFirstName" value="FristName" />
<mt:SetVarBlock name="thisLastName">LastName：<mt:Var name="thisFirstName" /></mt:SetVarBlock>
<mt:Var name="thisLastName" />  // 出力 LastName：FristName
```

* 詳しく調べてないですが、構造的にSetVarsは一つの塊であって、その中で呼び出したい変数は外で定義しなければいけない（恐らくSetVarsとして実行されているからなのかなと。。）
orelangをrubyで

@mattn氏の方じゃなくてこっちのやつ。
http://qiita.com/shuetsu@github/items/ac21e597265d6bb906dc

`IExpression` は lambda に押し込んで極力手を抜いていくスタイル。

エラー処理？
そんなものはない。

```rb:orelang.rb
#!/usr/bin/env ruby

module Orelang
  module Operator
    extend self
    attr_reader :op

    @op = {}

    @op["+"] = -> (e, args) {
      args.reduce(0) { |a, n| a + e.eval(n) }
    }
    @op["*"] = -> (e, args) {
      args.reduce(1) { |a, n| a * e.eval(n) }
    }
    @op["="] = -> (e, args) {
      e.eval(args[0]) === e.eval(args[1])
    }
    @op["set"] = -> (e, args) {
      e.vars[e.eval(args[0])] = e.eval(args[1])
    }
    @op["get"] = -> (e, args) {
      e.vars[e.eval(args[0])]
    }
    @op["until"] = -> (e, args) {
      e.eval(args[1]) while ! e.eval(args[0])
    }
    @op["step"] = -> (e, args) {
      args.reduce(0) { |r, n|
        r = e.eval(n)
      }
    }
  end

  class Engine
    attr_accessor :vars

    def initialize
      @vars = {}
    end

    def eval(expr)
      if expr.instance_of?(Array)
        op = Operator::op[expr[0]]
        args = expr[1..-1]
        -> {
          op.call(self, args)
        }
      else
        -> {
          expr
        }
      end.call
    end
  end
end
```

```rb:test_orelang.rb
#!/usr/bin/env ruby

require 'test/unit'
require "json"
require './orelang'

class TestOrelang < Test::Unit::TestCase
  def test_expr1
    engine = Orelang::Engine.new
    result = engine.eval(JSON.parse('["+", 1, 2, ["*", 3, 4]]'))
    assert_equal 15, result
  end

  def test_expr2
    str = <<-EOD
["step",
  ["set", "i", 10],
  ["set", "sum", 0],
  ["until", ["=", ["get", "i"], 0], [
    "step",
    ["set", "sum", ["+", ["get", "sum"], ["get", "i"]]],
    ["set", "i", ["+", ["get", "i"], -1]]
  ]],
  ["get", "sum"]
]
    EOD
    engine = Orelang::Engine.new
    result = engine.eval(JSON.parse(str))
    assert_equal 55, result
  end
end
```
RailsプロジェクトでMySQLがbundle installできなかった

# 環境 && 起こったこと
OS: macOS Sierra
Ruby: 2.3.1
Rails: 5.0.0.1

`bundle install` したときに mysql2 のところでこけた。

```
$ bundle install
(諸々のgemのインストールのログは省略）
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/akito/git/media/vendor/bundle/gems/mysql2-0.4.4/ext/mysql2
/Users/akito/.rbenv/versions/2.3.1/bin/ruby -r ./siteconf20160929-55293-192vx35.rb extconf.rb
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for rb_thread_blocking_region()... no
checking for rb_wait_for_single_fd()... yes
checking for rb_hash_dup()... yes
checking for rb_intern3()... yes
-----
Using mysql_config at /usr/local/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for mysqld_error.h... yes
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /usr/local/Cellar/mysql/5.7.14/lib
-----
creating Makefile

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Users/akito/git/media/vendor/bundle/extensions/x86_64-darwin-15/2.3.0-static/mysql2-0.4.4/mkmf.log

current directory: /Users/akito/git/media/vendor/bundle/gems/mysql2-0.4.4/ext/mysql2
make "DESTDIR=" clean

current directory: /Users/akito/git/media/vendor/bundle/gems/mysql2-0.4.4/ext/mysql2
make "DESTDIR="
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/akito/git/media/vendor/bundle/gems/mysql2-0.4.4 for inspection.
Results logged to
/Users/akito/git/media/vendor/bundle/extensions/x86_64-darwin-15/2.3.0-static/mysql2-0.4.4/gem_make.out

An error occurred while installing mysql2 (0.4.4), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.4.4'` succeeds before bundling.
```

`capybara-webkit`とかではこんな感じのことが稀によく起こるのでなんかもういいやってなってるけど、mysql2は初めて見た。
ログの中で`ld: library not found for -lssl`とか言われたけど別にOpenSSL入ってるしなーとか思いながらググってると、こんなのを[StackOverflow](http://stackoverflow.com/questions/30834421/error-when-trying-to-install-app-with-mysql2-gem)でみつけた。

> Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries

> Generally there are no consequences of this for you. If you build your own software and it requires this formula, you'll need to add to your build variables:

> LDFLAGS: -L/usr/local/opt/openssl/lib
> CPPFLAGS: -I/usr/local/opt/openssl/include
> PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig


というわけで、（雑な解釈だけど）ビルドのときにLDFLAGSとかCPPFLAGSとかのパスを追加しろって言っているので、回答にもあったコマンドを実行してパスを追加します。

```
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
```

このあと `bundle install` したら、無事にインストールされました。
EC-Cube3.0系にPayPalを導入する方法

###**PayPalモジュールのインストール**
まずは、[こちらのドキュメント](https://www.ec-cube.net/document/MN02_module_install.pdf)の手順を参考してPayPalのプラグインをインストールしてください。
実際の画面はドキュメント中の画面と少し差があります、下記スクリーンショットを参考してください。  
まず、[こちら](https://www.ec-cube.net/owners/)にアクセスして、「ストア内検索」で「PayPal」キーワードを検索します。![EC-Cube7.png](https://qiita-image-store.s3.amazonaws.com/0/124793/81f781e9-91a3-17ab-0621-98a71128b695.png)

検索結果一覧画面で下記プラグインをクリックします。![EC-Cube8.png](https://qiita-image-store.s3.amazonaws.com/0/124793/87898962-eb72-603f-2fd2-b4bdc83f60d1.png)

購入をクリックします。![EC-Cube9.png](https://qiita-image-store.s3.amazonaws.com/0/124793/399599f5-841c-e856-8e3b-0dc89e2a27c3.png)

利用するサイトを追加、選択し、個人情報取扱方針に同意して、購入します。![EC-Cube10.png](https://qiita-image-store.s3.amazonaws.com/0/124793/9c968dab-918e-52b0-ed93-d04f3357c357.png)

次に、認証キーの取得と設定は[こちらのドキュメント](https://www.ec-cube.net/document/MN02_module_install.pdf)を参考してください。

EC-Cube管理画面で、オーナーズストア -> プラグイン -> プラグイン一覧　をクリックして、下記画面で「今すぐインストール」をクリックします。![EC-Cube1.png](https://qiita-image-store.s3.amazonaws.com/0/124793/86ecb9fd-6762-69a3-d4c7-9bb597b94780.png)

下記画面で「有効にする」をクリックして、PayPalプラグインを有効にします。
![EC-Cube2.png](https://qiita-image-store.s3.amazonaws.com/0/124793/518f63bb-1d5e-3e70-3642-706b116254a3.png)

「設定」をクリックして、プラグイン設定画面を開きます。
![EC-Cube3.png](https://qiita-image-store.s3.amazonaws.com/0/124793/bde681bc-a6ae-a70e-fa8d-6c41f192341a.png)

###**PayPalのモジュールの設定**
下記設定画面で、APIユーザー名、パスワード、署名を設定し、本番環境を利用する場合は「Sandboxを使用する」をチェックしないでください。
ほかの設定内容はページ内の説明文を参考してください。
※Sandboxテスト環境の使用方法は下記URLを参考してください。
http://qiita.com/PayPal_MTS/items/5cde5e00418f454f24a8
![EC-Cube4.png](https://qiita-image-store.s3.amazonaws.com/0/124793/229cf355-7a65-fbbb-0bc6-af2ddafbd81d.png)

PayPalモジュールを設定完了後、EC-Cubeの配送方法設定の中に、PayPalを設定したい配送方法をクリックして、
 ![EC-Cube5.png](https://qiita-image-store.s3.amazonaws.com/0/124793/0aceafde-356e-6ff0-92b9-5cf3c7c339b0.png)

下記のように「PayPalエクスプレスチェックアウト」のチェックを入れてください。
 ![EC-Cube6.png](https://qiita-image-store.s3.amazonaws.com/0/124793/8c90c351-5fbf-9608-c4d2-8b465df074d2.png)

設定は以上です。設定完了したら、決済画面にPayPal支払い方法が表示されるようになります。
 ![EC-Cube12.png](https://qiita-image-store.s3.amazonaws.com/0/124793/9e15b265-d33b-9537-016c-57ef752a5e36.png)



PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
WindowsアップデートでExcel、pdfが起動しなくなった時の対応メモ

2016年9月29日にPCを落とすとき「更新してシャットダウン」を選択して次の日立ち上げたらWindowsの更新に1時間、ログインに30分かかりました。
さらにExcel、pdfを開こうとすると以下のダイアログが表示され開けない。。

![image](https://qiita-image-store.s3.amazonaws.com/0/133525/53982f9c-e7f7-df92-7b4c-a285a0bfee78.png)

何をやっても改善しなかったけど、最終的にOfficeをオンライン修復、acrobat readerをアンインストール⇒インストールしたら何とか解決。
WelcartにPayPalを導入する手順

1. Welcartをインストールします
下記ガイドを参考して、Welcartのインストール、設定を行ってください。
https://www.welcart.com/wc-flow/

2. WelcartではPayPalのエクスプレスチェックアウトとウェブペイメントプラス2つ決済方法をサポートしています。
PayPalエクスプレスチェックアウト決済サービスの導入は下記URLとドキュメントをご参考ください
https://www.welcart.com/documents/manual-2/%E3%82%AF%E3%83%AC%E3%82%B8%E3%83%83%E3%83%88%E6%B1%BA%E6%B8%88%E8%A8%AD%E5%AE%9A#paypal_ec
https://www.welcart.com/docs/settlement/PayPal_ec_1.0.0.pdf
PayPalウェブペイメントプラス決済サービスの導入は下記URLとドキュメントをご参考ください
https://www.welcart.com/documents/manual-2/%E3%82%AF%E3%83%AC%E3%82%B8%E3%83%83%E3%83%88%E6%B1%BA%E6%B8%88%E8%A8%AD%E5%AE%9A#paypal_wpp
https://www.welcart.com/docs/settlement/PayPal_wpp_1.0.0.pdf


PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
AdMobのSDKをアップデートしたらApple Mach-O Linker Errorが出た

AdmobのSDKを６→７にアップデートしたら、Apple Mach-O Linker Errorが出てしまいました。
ありがちなのはフレームワークの追加漏れらしいのですが、確認しても足りないものはない模様。

今回はPodでAdMobをインストールしていたので、再度pod installを行ったところ、以下のようなメッセージが出てました。

[!] The `XXXXXX` target overrides the `OTHER_LDFLAGS` build setting defined in `XXXXXXXXXXX'. This can lead to problems with the CocoaPods installation
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

というわけで、書いてある通り、BuildSettingsからOTHER_LDFLAGSを検索し、「-ObjC」と書いてあった箇所を「$(inherited)」に書き換え。
これで無事エラーが無くなりました！
Reminders.appのリマインダーとEventKitフレームワークのEKReminderクラスのインスタンスを変換するAppleScript



* `EKReminder`: Reminders.appのリマインダーをEKReminderクラスのインスタンスに変換
* `EKReminderArray`: 複数のリマインダーに対応
	* 第3引数の`sortDescriptors`でソート順を指定可能
* `reminderInReminders`: EKReminderクラスのインスタンスをReminders.appのリマインダーに変換
* `reminderListInReminders`: 複数のEKReminderクラスのインスタンスに対応


```AppleScript
use scripting additions
use framework "EventKit"
use framework "Foundation"

set eventStore to current application's EKEventStore's alloc()'s initWithAccessToEntityTypes:(current application's EKEntityMaskReminder)
tell application "Reminders"
	set reminderItem to my EKReminder(eventStore, reminder 1)
	set reminderArray to my EKReminderArray(eventStore, id of reminders whose completed = false, {current application's NSSortDescriptor's sortDescriptorWithKey:"self.title" ascending:true})
end tell
my reminderInReminders(reminderItem)
my reminderListInReminders(reminderArray)

on EKReminder(eventStore, aReminder)
	--require framework: EventKit, Foundation
	return item 1 of my EKReminderArray(eventStore, {aReminder}, {})
end EKReminder

on EKReminderArray(eventStore, reminderList as list, sortDescriptors as list)
	--require framework: EventKit, Foundation
	set reminderArray to current application's NSMutableArray's arrayWithCapacity:(count reminderList)
	repeat with aReminder in reminderList
		tell application "Reminders"
			if class of aReminder = reminder then
				set reminderIdentifier to (current application's NSURL's URLWithString:(id of aReminder))'s |host|
			else if aReminder starts with "x-apple-reminder://" then
				set reminderIdentifier to (current application's NSURL's URLWithString:aReminder)'s |host|
			else
				set reminderIdentifier to aReminder as text
			end if
		end tell
		set reminder to (eventStore's calendarItemWithIdentifier:reminderIdentifier)
		(reminderArray's addObject:reminder)
	end repeat
	return reminderArray's sortedArrayUsingDescriptors:sortDescriptors
end EKReminderArray

on reminderInReminders(reminder)
	--require framework: EventKit, Foundation
	return item 1 of my reminderListInReminders({reminder})
end reminderInReminders

on reminderListInReminders(reminderArray as list)
	--require framework: EventKit, Foundation
	set reminderList to {}
	repeat with reminder in reminderArray
		set reminderID to ((current application's NSString's stringWithString:"x-apple-reminder://")'s stringByAppendingString:(reminder's calendarItemIdentifier)) as text
		tell application "Reminders"
			set end of reminderList to reminder id reminderID
		end tell
	end repeat
	return reminderList
end reminderListInReminders
```


* 2016-08-31: EventKitフレームワークを使って`EKReminder`ハンドラ、`EKReminderArray`ハンドラを作成
* 2016-09-27: `reminderInReminders`ハンドラ、`reminderListInReminders`ハンドラを作成
sass

## scssからcssへ変換

scssとｃssのファイルがある所で
`sass --style expanded --watch scss:css`
抜けるには
`Ctrl C`

****

## プロジェクトにsass導入

### 必要なファイル[全てプロジェクト直下に配置]

#### compass.config.rb
既存プロジェクトから持ってくる（自分で作成)

#### Gruntfile.js
既存プロジェクトから持ってくる(自分で作成）
プロジェクト直下で`npm install`実行

#### package.json
プロジェクト直下で`npm init`実行

****

## sass使用方法

1.ターミナルを２つ開く
2.片方のターミナルで`grunt`実行
3.もう片方のターミナルでsassファイル編集
4.sass編集するとcssに反映される

****
LAN内のPCに外部から接続する

# 概要

LAN内のPCに外部から接続する
ルーターはAirPort Utilityを使っている

# LAN内のアドレスを固定化する

- AirPort Utilityを起動し、AirMac ExtremeでEditを起動
- Networkタブ選択
- DHCP Reservationsの`+`から設定追加
- MAC AddressとIPv４Addressを入力
    - MAC Addressは、ifconfigのHWaddrの項目（xx:xx:xx:xx:xx:xxの16進数の値）
    - IPv4は、DHCP Rangeに含まれる任意の値
- Updateする（このときネットワークが途切れるので注意）

![image](https://qiita-image-store.s3.amazonaws.com/0/11299/0b94462e-55a6-78e4-62ad-b4e47d9a5995.png)

# ポートフォーワーディング設定する

- AirPort Utilityを起動し、AirMac ExtremeでEditを起動
- Networkタブ選択
- Port Settingsの`+`から設定追加
- SSHする場合、Descriptionで`Remote Login - SSH`を選択する
- 外部から接続したいPCのPriate IP Addressを入力する（`ifconfig`で調べる）
- Updateする（このときネットワークが途切れるので注意）

![image](https://qiita-image-store.s3.amazonaws.com/0/11299/e49d122e-7a65-72d6-3964-684ed197459e.png)

# 接続する

Global IPを確認する

```
$ curl inet-ip.info
```

Global IPの22番が接続したいPCの22番を向いているのでSSHできる

# 参照

- 外部・内部ネットワークからのSSH接続（サーバー：Ubuntu⇔クライアント：Mac, WIndows）
    - http://qiita.com/rintarou/items/bef523c7c8f11097e577
- グローバルIPをcurlで確認
    - http://qiita.com/kanpou_/items/734b947f5a95109e7bb9