OmniAICreator/Qiita-1.07M huggingface dataset:
HTTPのGETでDataを取得して、Progressバーを表示する



```xml:AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
```

```xml:AndroidManifest.xml
 <ProgressBar
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/progress"
        android:max="100"
        android:visibility="gone"
        />
    <Button
        android:layout_marginTop="50dp"
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="btn_onClick"
        android:text="キャンセル"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/txtResult"/>
```

```java:MainActivity.java
public class MainActivity extends AppCompatActivity {
    AsyncNetworkTask task;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        task = new AsyncNetworkTask(this);
        task.execute("http://www.wings.msn.to/");
    }

    public void btn_onClick(View view){
        task.cancel(true);
    }
}
```

```java:AsyncNetworkTask.java
public class AsyncNetworkTask extends AsyncTask<String, Integer, String>{
    private TextView txtResult;
    private ProgressBar progress;

    public AsyncNetworkTask(Context context){
        super();
        MainActivity activity = (MainActivity)context;
        txtResult = (TextView)activity.findViewById(R.id.txtResult);
        progress = (ProgressBar)activity.findViewById(R.id.progress);
    }

    @Override
    protected void onPreExecute() {
        progress.setVisibility(ProgressBar.VISIBLE);
    }

    @Override
    protected String doInBackground(String... params) {
        publishProgress(30);
        SystemClock.sleep(3000);
        publishProgress(60);
        StringBuilder builder = new StringBuilder();

        try {
            URL url = new URL(params[0]);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(con.getInputStream(), "Shift-JIS"));
            String line;
            while((line = reader.readLine()) != null) {
                builder.append(line);
            }


        } catch (IOException e) {
            e.printStackTrace();
        }

        publishProgress(100);
        return builder.toString();
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        Log.d("url", values[0].toString());
    }

    @Override
    protected void onPostExecute(String s) {
        txtResult.setText(s);
        progress.setVisibility(ProgressBar.GONE);
    }

    @Override
    protected void onCancelled() {
        txtResult.setText("キャンセルされました");
        progress.setVisibility(ProgressBar.GONE);
    }
}
```
【AutoLayout】Storyboard,Xibで設定した制約値を保持する

最近知って感動したAutoLayoutTips
注意：きちんと公式情報で裏取ってません
注意：iOS8切れる方はStackView使ってどうぞ

## シーン
下の図のような状況で、View2をhiddenにしたい（AutoLayout使う）
hiddenにするときは、View1とView３をくっつけたい
~~ああ面倒くさい、こういうのはAndroidだと楽なのに~~

<img width="365" alt="スクリーンショット 2017-01-16 0.43.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/20784/79c4edc3-43e7-ad6a-b5bf-cc333811727b.png">

方法としては何パターンか思いつきますが、とりあえず３つ

1.可能ならTableViewにしてしまう

2．View1-View2、View2-View3、View1-View3で制約を設け
View1-View3の優先度を下げておく
View2をhiddenにしたいときhiddenにしたい時は
View2-View3の優先度を下げ、View1-View3の優先度を上げる
なんかスマートだけど、制約が込み入るとか、View2を起点にして他の制約があると全部調整しなきゃいけないから厄介

3．View2の高さの制約を変数として持っておいて、hidden時に高さをゼロにしてしまう

割りと取られるのは３じゃないかと思います
そしてその後で

**でも状況によってhidden解除しなきゃいけない！！**
となり
**あ、元の高さの値を保存しておかなきゃ！**
となり
**でもコード内に定義するとstoryboardと定義が分散して怖いな**
**じゃあ制約から値を取り出そう！**
**でももとの値っていつどこで保存するんだっけ？　ViewdidLoad？ viewDidLayoutSubviews?　あれ？？ こいついつもゼロだぞ・・・**

と悩むことが多いです（私だけ？）


## 解決策

要点
・viewDidLoadの、[super viewDidLoad]の前で取得可能
・NSLayoutConstraintにはidentifierが付けられる（知らなかった！！）

つまりこうです

高さの制約を繋ぎこみます

<img width="1446" alt="スaクリーンショット 2017-01-16 0.43.44のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/20784/96d53f17-80c7-6924-0e73-5ed793da233c.png">

高さの制約のidentifierを設定します

<img width="1435" alt="スクリーンショット 2017-01-16 0.44.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/20784/227575cb-50cc-6416-e28f-84b6cfb953fa.png">

制約の親viewを繋ぎこみます（view2）
保持する変数を用意します（defaultView2Height）

viewの持っているNSLayoutConstraintは、view.constraintsにすべて入っているので
そこからidentifierで該当制約を取り出します

<img width="1437" alt="スクリーンショット 2017-01-16 0.46.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/20784/868f1aba-6c91-6251-9593-05e09592fa73.png">

これで該当制約の初期値（storyboardで設定した値）を安全に保持できます（やったぜ）
でも[super viewDidLoad]の前に処理をゴリゴリ書くのは正直嫌なので
Categoryやらextensionやらにして一行で書いてしまえばよいですね

一応言うとこの方法もちょっとデメリットが有り
制約を一度消して再作成する際などは、identifierの再設定を忘れそうです
（まあテストすればわかるんですけど、エラーにはならない）
とりあえずidentifierの命名規則は統一しておきたいですね（親View名＋Heightとか）
わからなくなるとヤバイので

以上です

____

追記：

self.viewのsubviews配下の制約を全部洗ってしまえば、画面内のidentifierが付いている全制約の初期値を保持しておけますね

例えばidentifierをkeyにして、初期設定値を一個のdictionaryに詰めるとかしたら
必要なときに呼び出すだけとかできて便利かもしれません
利用シーンがあればですが
Jenkins pipelineコマンドメモ

Jenkinsのパイプラインを試してみた。
結果、下記の点がクリアできなかったため、実際の採用は見送ることにしたが、新たに追加されたpipelineビューはタスクの中のステージごとに進捗状況や要した時間が見れるため、魅力的な点もある。また、freestyleでかかれた他のタスクを呼び出すこともできるので、freestyleとpipelineを組み合わせて使うことも可能であることが分かった。
ここでは、調査の際にわかった使えそうなコマンドを備忘録として残しておく。
ちなみに、採用を見送ったのは下記の理由から。（これらが解決すれば、再度採用を検討したい）

- workspaceがタスクから見えなくなる。
- gitの更新内容が、gitツール(gitlabを利用）から見える設定ができない。

##Jenkinsに作成済みのJOBを順次実行する
Jenkinsに登録済みの他のJobを呼び出すコマンド。この書き方をすると、jobが完了したら次のJobが実行される様になる。

```groovy:jenkinsfile
node{
  stage('first-stage'){
    build job: 'first-job'
    build job: 'second-job'
    build job: 'third-job'
  }
}
```

##Jenkinsに作成済みのJOBを並列実行する
複数のJOBを並列実行する場合のサンプル。下記の例の場合、first-job,second-jobが完了したら、third-jobの実行が開始される。

```groovy:jenkinsfile
node {
   stage('first-stage') { // for display purposes
     parallel(
         "stream1": {
             echo 'start of stream1'
             build job: 'first-job' 
         },
        "stream2" : {
            echo "start of stream2"
            build job: 'second-job'
        }
     )
     echo "２つのJOBが完了しました。。"
   }
   stage('second-stage'){
             build("third-job") 
   }
}
```

##渡されたパラメータに応じて処理を変える。(Groovy)
This value is parameterizedにチェックを入れると、実行時に渡すパラメータとそのデフォルト値を指定することができる。下記の例は、value1の値が特定の値("999")だったら、second-stageを実行する。

```groovy:jenkinsfile
 node {
       stage('first-stage') {
           if(value1 == "999"){
               echo "${value1}これはTrueです"
           }else{
               echo '${value1}これはfalseです'
           }
           sh 'sleep 3' #3秒待つ
       }
       if(value1=='999'){
           stage('second-stage'){
               echo 'this is secret stage!!!!!'
           }
       }
    }
```

##リモートシェルを実行する
リモートシェルを呼び出すには、下記の様に記述する。jenkins上のcredentialを登録してリモート接続することもできるという記述もあったが、うまく行かなかった。
下記などを参考にし、鍵交換を行なうことが前提条件となる。
http://qiita.com/windows222/items/a6d1e8cdfd315bb8bcbb#ssh%E8%87%AA%E5%8B%95%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E8%A8%AD%E5%AE%9A


```groovy:jenkinsfile
node {
  stage('ssh-stage') {
      def cmd = 'pwd'
      def server = '192.168.1.46'
      def user = 'jenkinstest'
      sh "ssh -t -t ${user}@${server} ${cmd}"
  }
}
```

##番外編：渡されたパラメータに応じて処理を変える。(shell)
下記の例は、shellでの処理変更の例。freestyleを利用した場合にはこの方法で処理を分岐する。

```bash:
echo "value1の値は${value1}です"
if [ $value1 = '999' ]; then
  echo "処理を実行します"
else
  echo "処理を実行しません"
fi
#５秒待機
sleep 5
```

#
旧 phina.js Tips集

コンテンツは以下のzennのbookに移行しました。
今後はzennの方を更新する予定です。

https://zenn.dev/alkn203/books/phina-js-tips

https://zenn.dev/alkn203/books/phina-js-tips2

# phina.js Tips集

**javascript**のゲーム作成用ライブラリ[phina.js](http://phinajs.com/)に関するTipsについて書いています。非公式ですが、少しでも参考になれば幸いです。

## phina.jsについて

自分なりに**phina.js**について書いたエントリーです。

https://zenn.dev/alkn203/articles/phina-start-guide
Hashかどうかを判定しつつ任意の{key: value}を持っているかどうかを判定するメソッドを作った

```ruby
# 改善前
# foo_hashにはどんなclassが入ってくるかわからないという状況。
if foo_hash.is_a?(Hash) && foo_hash.dig('data', 'title') == "bar"
  やりたい処理
end
```
* まずHashかどうかの判定を入れて、その後目的のkey: valueがあるかを判定。
* が、判定を二段階で行うのが冗長に感じた。


```ruby
# 改善後
# itemの中に期待するkey: valueがあるかどうかをチェックします。
# itemが入れ子になっていない場合：has_hash?(foo_hash,'title','bar')
# itemが入れ子になっている場合:  has_hash?(foo_hash,['data','title'],'bar')
# deep_symbolize_keysはrailsのメソッドなので注意。
def has_hash?(item, key, value)
  key = key.map &:to_sym if key.is_a?(Array)
  key = key.to_sym if key.is_a?(String)
  if item.is_a?(Hash)
    item = item.deep_symbolize_keys
    item.dig(*key) == value
  end
end

if has_hash?(foo_hash,['data','title'],'bar')
  やりたい処理
end
```

* 結構便利に作ったつもり。
* たぶん便利、なはず。
* 突っ込みどころがあれば是非。。
Google App ScriptへCI経由でデプロイする

## 追記

この記事を踏まえて、より良い環境を構築した記事を書きました

[Google Apps ScriptへCI経由でデプロイする (1年半後)](https://qiita.com/abeyuya/items/9913cb2889eb0466ebb6)

---


## やりたいこと :checkered_flag:

* Google App Scriptのソースコードをgit管理したい
* それらのコードをCI経由でGoogle App Scriptにデプロイしたい



## どうやったか :rocket:

[node-google-apps-script](https://github.com/danthareja/node-google-apps-script)を使うと手元のファイルをGoogle App Scriptにアップロードできるようになるので、同じことをCI上で行うようにします

CIは何でも良いですが、今回はbitbucket pipelinesを使いました

結果的にclient_secretなどをソースコードに含める必要があったため、publicなリポジトリのプロジェクトなどでは採用できない手法となってしまいました :cry: 


### 1. node-google-apps-scriptをセットアップする :wrench:

こちらの記事が大変参考になりました

> GoogleAppsScriptローカル開発用の公式CLI(node-google-apps-script)がついに登場したので試してみる
http://qiita.com/zaki-yama/items/9a301542137febd8876c

この記事の通りに準備すると、ローカルからファイルのアップロードができるようになります
まずはローカルからのアップロードができるまで準備します


### 2. `~/.gapps`をリポジトリにコミットする :skull_crossbones:

この記事の肝はこの設定です

記事の通りにセットアップすると、`~/.gapps`というファイルが生成されます
`gapps upload`の際にこのファイルを参照して認証をしているので、CIでも必要になります
なので、`cp ~/.gapps path/to/repo`などでリポジトリに含めます

`.gapps`には`client_secret`や`refresh_token`といった情報が含まれているので、できればリポジトリには含めず環境変数などで制御したかったのですが、軽くソースコードを見た感じだとそのようなオプションは無いようでした :cry: 

* https://github.com/danthareja/node-google-apps-script#common-issues
* https://github.com/danthareja/node-google-apps-script/search?utf8=%E2%9C%93&q=STORAGE_FILE&type=Code

いつかプルリク出したいところです


### 3. CI上で`~/.gapps`を参照できるようにする :motorway:

bitbucket pipelinesの場合は下記のコードだけでOKでした

```bitbucket-pipelines.yml
image: node:4.3.2

pipelines:
  default:
    - step:
        script:
          - npm install
          - npm run upload-from-ci

```

```package.json
  "scripts": {
    "upload-from-ci": "cp .gapps ~/.gapps; gapps upload"
  },
```

リポジトリの`.gapps`をそのまま`~/.gapps`へコピーしています
CIはどれでも大丈夫と書きましたが、ホームディレクトリへの書き込み権限がないと無理ですね...

ここまでできればCI上からデプロイができます！ :tada: 

## 注意点

webアプリケーションとして公開しているGASアプリの場合、ソースコードのアップロードだけでは反映されません
アップロード後にプロジェクトバージョンを新しくする必要があります

<img src="https://www.evernote.com/l/AFF5I2Ohx7pAOY90SM_2Jxz57djTAu1x-n4B/image.png" width="400px">

これはAPIも用意されてないっぽいですね...


トリガーで発火しているコードに関しては、uploadするだけで問題なく更新されるようでした


## 感想

GASのおかげでサーバの準備不要でお手軽にスクリプトを動かせるは大変ありがたいですね！ :grin:

今回はちょっとしたslack botをGASで動かしていたのですが、少しコードベースが大きくなってきたタイミングでgit管理がしたくなり、この方法を導入しました


やってみて、git管理やCI運用を導入したくなった時点で既にGASで動かすには不適切な規模感なのかなと感じました

お手軽にサクッとスクリプトを動かせるのが良い点だと思うので、その良さを活かせるような使い方を意識して使おうと思いました！
画像のスクレイピング

# Googleカスタムサーチを使う方法
[Google Custom Search APIの有効化](https://console.developers.google.com/iam-admin/projects)と、[サーチエンジンの作成](https://cse.google.com/cse/all)を事前にします。その上で、.bash_profile や .bashrcに以下を記述

```shell-session
export GOOGLE_API_KEY=
export GOOGLE_SEARCH_ENGINE=

imageGetter(){curl "https://www.googleapis.com/customsearch/v1?key=$GOOGLE_API_KEY&cx=$GOOGLE_SEARCH_ENGINE&searchType=image&q=$1" | grep 'jpg\|png' | sed -e "s/\"link\": //g" | sed -e "s/\"//g" | sed -e "s/\,//g" | xargs wget -P $2;}
```

以下の様に使います。

```shell-session
imageGetter cat tmpdir
```

catの検索結果がtmpdirに格納されます。
nfsもkvmも設定したのにVagrant(VirtualBox)のRailsが本当に遅い！場合の対処案



# Rails高速化までの道のり
よくあるvagrant高速化設定方法のshared folderにはNFSをつかうとか
`modifyvm`で`--paravirtprovider`を`kvm`にするとか、VMで使うメモリを増やすとかをやってもまっっっっったく早くならなくて、どれくらい遅いかというと`rails s`でwebrick起動するまでに10分はかかってました。

PC買い替えも考えるほどでしたが粘って調べ続けた所ようやく解決策まで辿りつくことに...



# 解決策
結論から言うとVirtualBoxでゲストマシンに割り当てる「プロセッサー数」の設定値を最大でも **ホストマシンの持っているコア数-1**にするということです。デュアルコアなら1、クアッドコアなら3です。

ちなみにvagrantからだと

```ruby
config.vm.provider "virtualbox" do |vb|
  vb.cpus = "ここの数値"
end
```
で設定する部分です。


当方数年前のMacbook pro 13インチを使用していますが13インチのモデルは最新のものでもデュアルコアなので、プロセッサー数は`1`となります。

これで私の場合は`rails s`が1分かからないくらいになりましたとさ



# 余談
Rails4の場合はプロセッサー数が2でもそこまで遅くなかった気がするのですが
Rails5にしてから先述のようにサーバー起動に10分というとんでもない遅さになりました、原因は不明です...


また、Railsの話をしましたが別にRailsに限った話ではないと思われるので、お悩みの際はぜひ一度試してみてください



# 参考
[システム設定 | VirtualBox Mania](http://vboxmania.net/content/システム設定)
「ホストマシンの持っているコア数-1」の設定が良いというのが書いてありました
【laravel入門】ルート、コントローラー、テンプレートエンジンの基本まとめ

#Route
ルートとは、ユーザーからのリクエストを受け取ってコントローラーに渡す役割と（コントローラーについては後述）、コントローラーから受け取った情報をユーザーへ返す役割を担う。いわば仲介人。
はじめにルートへどんな情報が渡され、ブラウザにどんな情報が表示されるのかを見る。

##テスト1
```route.php
Route::get('hello',function(){
    return '<html><body><h1>hello world</h1></body></html>';
});
```
<img width="309" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/85424/ad825118-df02-8f99-139f-f9e413a040ca.png">

##テスト２
`resources/views/hello.php`を以下の内容で作成

```hello.php
<html>
<head>
        <title>Sample</title>
</head>
<body>
<h1>hello world</h1>
<p><?php echo $message; ?></p>
</body>
</htm>
```

`route.php`を以下のように編集

```route.php
Route::get('/hello', function () {
    return view('hello', ['message' => 'hello!']);
});
```

結果
<img width="281" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/85424/95c60b4d-f247-ea3e-6d24-d5a45f150a5e.png">


##ここまででわかること
GETメソッドの中には、ユーザーが入力したアドレスとそれに応じたメソッドが書かれている。例えば、`/hello`にアクセスした場合に`functuion()`が実行されるといった具合。
`function()`は直接html文を返すこともできれば、view関数で別のphpファイルを参照して返すこともできる。

#Controller
コントローラーとは、ルートから受け取った情報をモデルに処理をお願いする役割と、モデルから受け取った情報をビューに表示する役割がある。
コントローラーは、`$ php artisan make:controller [コントローラー名]`で作成できる。

##テスト3
- コントローラーを作成する前に、ルートに新しく作るコントローラーを記述しておく。

```route.php
Route::get('hello','Hello_Controller@getIndex');
```
`[コントローラー名@メソッド名]`で、そのコントローラーのメソッドへアクセスできる。

- コントローラーの作成
`$ php artisan make:controller Hello_Contoroller`

- コントローラーの中身は以下。

```Hello_Contoroller.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class Hello_Controller extends Controller
{
    public function getIndex()
    {
      return view('hello');
    }
}
```
クラスは自動生成されるはずなので、メソッドだけ追加。
getIndexメソッドで、`hello.php`のファイル名を引数とするview関数を返す。

- 先ほどの`hello.php`では、`<p>`タグの中で`$message`を出力していたが、今回は単にコントローラーでこのphpファイルを呼んでいるだけなので、$messageに値が代入されず、エラーになる。
そのため、この部分を`<p>hello controler</p>`くらいにしておく。

####結果
![1.png](https://qiita-image-store.s3.amazonaws.com/0/85424/cf940d99-8526-a5cf-52e5-0358d5d67672.png)

#テンプレート
- 上記の方法だと、1ページごとにhtml文を記述しないといけなくなるため、larabelではbladeというテンプレートエンジンを使用する。
以下のlayout.blade.phpはテンプレートファイルとなる。

```layout.blade.php
<!DOCTYPE HTML>
<html lang="ja">

<head>
  <meta charset="utf-8">
  <title>@yield('title')</title>
</head>

<body>
  @section('sidebar')

  <div class="container">
    @yield('content')
  </div>
</body>
</html>

```

```child.php
@extends('layout')
@section('title', 'Page Title')

@section('sidebar')
 
  <p>ここはメインのサイドバーに追加される</p>
@endsection

@section('content')
  <p>ここが本文</p>
@endsection
```

- `@extend('layout')`は`layout.blade.php`を継承することを表す。
- テンプレートファイルの`@yield`部分に、子ファイルの`@section`~`@endsection`内の記述が挿入される。

####結果
![1.png](https://qiita-image-store.s3.amazonaws.com/0/85424/5c18fd22-aa80-2812-dab5-888d274efac5.png)
自作static frameworkをまとめてSDK化しObjCとSwiftで使う

#ゴール
自作Swiftフレームワークから、別のObjective-Cライブラリを参照できるようにする。
※例えばObjCで作った自作ライブラリを新たにSwift Frameworkで使い、そのSwift frameworkをアプリで利用するようなケースを想定。
※管理が面倒なので言語別になにかを用意するとか、言語ごとに参照するファイルが違うとかは無し。

#利用するもの
##Clang Modules
http://clang.llvm.org/docs/Modules.html
modulemap言語というものを利用し、headerをbinary形式にプリプロセスしたもの。
依存関係なども記述できるが、ここの記述でheaderの公開設定などをするのは実用的ではなさそう。
explicit修飾子という明示的importを強制する修飾子をつけてもコード候補には上がってしまう。

#今回対象外のもの
##Objective-c static library
headerの解釈がSwiftから利用できないため不採用。
ただしStatic Framework化すると利用できます。
※Dynamic Framework化しても良い

##Bridging Header
ObjC libraryをSwift Frameworkから参照しようとする場合はBriging Headerを作ってもライブラリの利用はできません・・・。

#サンプル
２つのObjC Static libraryをSwift frameworkに包む方法。

1. static libraryを２つ作る。
2. ２つともstatic frameworkにする。
3. 各static frameworkのumbrella headerをmoduleとして宣言したmodule.modulemapファイルを作成する。

![スクリーンショット 2017-01-15 23.12.10.png](https://qiita-image-store.s3.amazonaws.com/0/103494/7eb33452-0f74-f062-6015-deef9388d80e.png)
4. それぞれのframework内にModulesフォルダを作成し配置
![スクリーンショット 2017-01-15 23.14.15.png](https://qiita-image-store.s3.amazonaws.com/0/103494/748bcb20-989c-9098-ef9d-c3fee01cf628.png)
5. 各static frameworkのumbrella headerを包んだumbrella headerを作成する
![スクリーンショット 2017-01-15 23.15.52.png](https://qiita-image-store.s3.amazonaws.com/0/103494/596c430a-efc7-c044-5595-4e7e9f60423d.png)
6. 5.でつくったumbrella headerのmodule.modulemapファイル(umbrella module)を作成する
![スクリーンショット 2017-01-15 23.16.55.png](https://qiita-image-store.s3.amazonaws.com/0/103494/685d49d1-29dd-1ae3-2106-df35190cb77d.png)
※__has_includeマクロを仕込むといいみたい。
7. 5.6.で作ったumbrella frameworkおよびumbrella module、frameworkを以下のように配置する
![スクリーンショット 2017-01-15 23.21.13.png](https://qiita-image-store.s3.amazonaws.com/0/103494/35064729-f2de-431f-fa7c-a9da1c28bf60.png)
8. 利用するprojectに各frameworkおよび,umbrella module, umbrella header(framework.h)をimportする。
9. user header search pathにumbrella headerのpathを指定
10. Swiftで利用する場合のみSwift compilerのimport pathにumbrella moduleを指定

#完成
Swift
![スクリーンショット 2017-01-15 23.28.32.png](https://qiita-image-store.s3.amazonaws.com/0/103494/72740d2f-ca4e-93f6-e80f-431757862771.png)

Objective-C
![スクリーンショット 2017-01-15 23.33.22.png](https://qiita-image-store.s3.amazonaws.com/0/103494/47e43270-1f06-9051-a0be-a6ba1c54e297.png)

framework同士に依存関係がなければ必要なものだけをまとめSDKとなる。

#備考
内包するObjC frameworkはdynamic frameworkでも可能。ただしdynamic frameworkを含む場合は、最終的に利用するアプリでObjC frameworkを含む全ての内包しているframeworkを直接参照していなくてもembedded frameworkとして定義する必要がある。
これはswift frameworkとObjC frameworkがstatic linkではないためである。

#注意点
いわゆるumbrella frameworkなので、framework内で外部のframework（自分でupdateできないもの）を含むことはオススメしない。ある程度知識があっても、ハマりやすいポイントは多く、気が付きにくい。
あくまで自作のまとめ程度がよい。
UnityEditorのObjectFieldの値を保持したい

# ObjectField

UnityEditorでObjectFieldを使うと、ユーザがオブジェクトを設定できるフィールドを用意できる。
例えば、ImageのSource Imageを指定するようなやつ。

<img width="240" alt="image_sprite.png" src="https://qiita-image-store.s3.amazonaws.com/0/15000/be56ec66-73c3-3c5e-9d7d-7bba97be96a5.png">

こんな感じで利用できる

```csharp:example
GameObject gameObject = null;
gameObject = EditorGUILayout.ObjectField(
    "FieldSelector",
    gameObject,
    typeof(GameObject),
    true
) as GameObject;
```

ここで問題なのはこのまま利用していると、EditorのPlayの状態が変更されるたびにObjectFieldで取得した値が保持されなくなってしまうこと。
これを保持できるように解決したい。

# EditorPrefs

UnityEditor用の永続的なデータ保持の手段として、EditorPrefsがある。
これはPlayerPrefsと同じように利用できる。
ここにObjectFieldで取得したGameObjectのInstanceIDを保持しておけば、EditorのPlay状態が変わっても保持していられる。

```csharp
// 保存
int id = gameObject.GetInstanceID();
EditorPrefs.SetInt("sample_id", id);
```

```csharp
// 読み出し
int id = EditorPrefs.GetInt("sample_id", -1);
gameObject = EditorUtility.InstanceIDToObject(this.SelectedInstanceId) as GameObject;
```

## コード

全体はこんな感じになる。

```csharp:ObjectFieldSampleWindow.cs
using UnityEditor;
using UnityEngine;

public class ObjectFieldSampleWindow : EditorWindow
{
    [MenuItem("Custom/ObjectFieldSample")]
    static void Init()
    {
        var window = EditorWindow.GetWindow<ObjectFieldSampleWindow>();
        window.Show();
    }

    private GameObject _gameObject;
    private int _id = -1;

    void OnGUI()
    {
        this._gameObject = this.LoadObject(this._id);
        this._gameObject =
            EditorGUILayout.ObjectField(
                "Sample",
                this._gameObject,
                typeof(GameObject),
                true
            ) as GameObject;
        this._id = this.SaveObject(this._gameObject);
    }

    GameObject LoadObject(int id)
    {
        if (id == -1)
        {
            id = EditorPrefs.GetInt("sample_id", -1);

            if (id != -1)
            {
                return EditorUtility.InstanceIDToObject(this._id) as GameObject;
            }
        }

        return this._gameObject;
    }

    int SaveObject(GameObject obj)
    {
        if (obj != null)
        {
            int id = obj.GetInstanceID();
            EditorPrefs.SetInt("sample_id", id);
            return id;
        }

        return -1;
    }
}
```

## 結果

Play状態が変わっても値が保持されるようになった。

![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/15000/dbe71ead-dbe9-4bf7-2751-4e950530c7ea.gif)
Mapのkeyを配列にするとうまいこといかない

```
Map<int[], int[]> map = new HashMap<int[] ,int[]>();
```

のようなint配列をキー、要素にした配列を利用したのだが、

```
map.get(int配列)
```
で、引数に指定したint配列に合致するkeyに紐づく要素が取り出せない。

対処法としては、

http://futurismo.biz/archives/2837

にあるように、keyを配列でもつのではなく、Arrays.toStringなりをしてStringでkeyを持つようにする。
代表的なパケットキャプチャ方法一覧

# はじめに
ITインフラエンジニアなら毎日やってるパケットキャプチャ。
そのパケットキャプチャの代表的な方法を一覧で。
単なる私の備忘録です。
というか、いつも忘れるのが一番下のHTTPの部分なので、単にそれをメモっておきたいってだけです。

こんなのもあるよ、こっちのほうが良いよ、というのがありましたら、是非教えて頂けたらとても嬉しいです。

# Windows
* [Wireshark](https://www.wireshark.org/)
* [Network Miner](http://www.netresec.com/?page=NetworkMiner)
* [Microsoft Message Analyzer](https://www.microsoft.com/en-us/download/details.aspx?id=44226)
* netsh trace コマンド

```
ex)
C:\WINDOWS\system32>netsh trace start capture=yes

トレース構成:
-------------------------------------------------------------------
ステータス:           実行中
トレース ファイル:    C:\Users\hoge\AppData\Local\Temp\NetTraces\NetTrace.etl
追加:                 オフ
循環:                 オン
最大サイズ:           250 MB
レポート:             オフ


C:\WINDOWS\system32>netsh trace stop
トレースを関連付けています... 完了
トレースの結合中... 完了
データ収集を生成しています ... 完了
トレース ファイルと追加のトラブルシューティング情報は、"C:\Users\hoge\AppData\Local\Temp\NetTraces\NetTrace.cab" としてコンパイルされました。
ファイルの場所 = C:\Users\gzock\AppData\Local\Temp\NetTraces\NetTrace.etl
トレース セッションは正常に停止しました。
```
※パケットキャプチャする物理IFやキャプチャフィルタなども設定可能(詳しくはnetsh trace /?)
※出力されたファイルはMicrosoft Message Analyzerで開いて中身を確認
※Microsoft Message Analyzer経由で.pcapに変換可能
※プロミスキャスモードではない

# Linux
* tcpdump

```shell-session
ex) tcpdump -i eth0 dst port 80
```

* ngrep 

```shell-session
ex) ngrep -d eth0 -W byline -q port 80
```

# その他
* WinSockを使ったパケットキャプチャツール 
※「簡易 パケットキャプチャ」 とかググれば結構見つかる
※netsh traceもそうだが、プロミスキャスモードではキャプチャ出来ない

* libpcapを使ったパケットキャプチャツール

# おまけ (HTTP GET/POST)
* Wireshark

```
GET => http.request.method == "GET"
POST => http.request.method == "POST"
```

* tcpdump

```
GET => tcpdump -s 0 -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
POST => tcpdump -s 0 -A 'tcp dst port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'
```
* ngprep

```
GET => ngrep 'GET /url'
POST => ngrep 'POST /url'
```

# 参考
各々非常に参考にさせて頂きました。ありがとうございます。
* [Can I use tcpdump to get HTTP requests, response header and response body?](http://stackoverflow.com/questions/4777042/can-i-use-tcpdump-to-get-http-requests-response-header-and-response-body)
* [通信内容をわかりやすくキャプチャできるngrep ](http://ameblo.jp/itboy/entry-10391649283.html)
hubot で人工無脳

（下書きのまま置いてありました。2015年の記事です）

気がつけば最近は IRC ではなく、 hipchat と slack を日常的に使っていて、bot を作りたいなぁと思い hubot に手を出しました。

[PyCon JP](https://pycon.jp/2015/ja/) スタッフの slack では good と言うと ( ･ㅂ･)و ̑̑ ｸﾞｯ! っと返って来るわけですが、 仕事で使ってる hipchat でもやりたいぞ、と思い、簡単な script を組んでみました。

```coffeescript:good.coffee
module.exports = (robot) ->

  robot.hear /^(goo+d)/i, (msg) ->
    msg.send "( ･ㅂ･)و ̑̑ ｸﾞｯ!"
```

これを hubot の scripts/ ディレクトリ以下において起動すれば、

```shell-session
hubot> good
( ･ㅂ･)و ̑̑ ｸﾞｯ!
```

と返ってきます。
すでに hipchat には接続してるので、hipchat 用の hubot を立ち上げれば
![ee7b947b3f52186ee20598dcd511a6dc.png](https://qiita-image-store.s3.amazonaws.com/0/15768/888a2789-be1f-2bef-dd39-999d92120331.png)

返事されました。（adapter は [hubot-hipchat](https://github.com/hipchat/hubot-hipchat) を使ってます。）
これをチームに投入したところ、「キーワードとレスポンスを自分たちでも登録したい！」と言う要望が来たので、 hubot.brain を使って書いてみました。

```coffeescript:mobitaro.coffee
# Description:
#   レスポンスをその場で登録出来るようにする script
#
# Commands:
#   おぼえて <request> => <response>

module.exports = (robot) ->
  BRAIN_KEY = 'nanako'

  get_responses = () ->
    return robot.brain.get(BRAIN_KEY) or {}

  set_reponse = (matcher, response) ->
    responses = get_responses()
    responses[matcher] = response
    robot.brain.set BRAIN_KEY, responses
    # 明示的に save しなくても何かのタイミングで保存されるらしい
    robot.brain.save()
    return responses

  get_regex_by_responses = () ->
    responses = get_responses()
    regex_array = []
    for key, value of responses
      regex_array.push "(?:#{key})"

    console.log(regex_array)
    regex_text = regex_array.join('|')
    return ///#{regex_text}///i

  robot.respond /おぼえて\s(.*)/i, (res) ->
    remind_words = res.match[1]
    match = /^(\S+)\s?=>\s?(.+)$/.exec(remind_words)
    if not match?
      res.reply "(´-`).｡oO(「おぼえて ほげ => ふが」って言って欲しいなぁ……)"
    else
      set_reponse(match[1], match[2])
      res.reply "#{match[1]} って言ったら #{match[2]} だね。 okay!"

  robot.respond /おもいだして/i, (res) ->
    responses = get_responses()
    content = []
    for key, value of responses
      content.push "#{key} => #{value}"

    res.reply content.join("\n")
    res.reply "これで全部のはず"

  robot.hear /(.+)/, (res) ->
    message = res.message.text

    responses = get_responses()
    for key, value of responses
      if message.match(///^(?:#{key})///i)
        res.send value
```

これで、「hubot おぼえて ほげ => ふが」 と言及すれば対になるキーワードとレスポンスを覚えてくれるようになりました。
robot.hear で受け取れるもの全部受け取ったあとにキーワードを正規表現としてマッチングさせてるので、 「hubot おぼえて go+d => ( ･ㅂ･)و ̑̑ ｸﾞｯ!」と教えれば、

```shell-session
hubot> goooooooooooood
( ･ㅂ･)و ̑̑ ｸﾞｯ!
```
o が何個並んでも応えてくれるように……！

robot.hear, robot.respond でその場への発言か、自身への言及かを使い分けられて、正規表現でマッチしたものを拾って行くやり方は簡単でいいですね。
ちょっと coffeescript のやり方が分かっておらず、正規表現内での変数展開とかが戸惑ってしまったけど。

返信も res.send か res.reply の使い分けで言及してきた相手へのリプライにするのもお手軽でした。
![4623cc7c63a1dbaaa292730437097349.png](https://qiita-image-store.s3.amazonaws.com/0/15768/7ae73ac3-8d84-74f3-f4be-98d7a2a4b42b.png)

若干、 hubot.brain の挙動がよく分かってないので暇なときにソース読みたいですね。

↓大人気
![fb518634474d9aec197f8cc8f64877b2-1.png](https://qiita-image-store.s3.amazonaws.com/0/15768/eed169e7-9b9d-ba91-600e-c91e019484ac.png)
slackの読み込み時間をカスタマイズする

# 概要

slack便利ですよね。最近インテグレーションがどんどん増えてきて見ているだけで楽しいです。
読み込み時間も楽しくカスタマイズ出来るようなので設定してみました(ㆁᴗㆁ✿)


# 設定方法

### URLから
+ https://${yourdomain}.slack.com/customize/loading

### webから探すと下記のよう。
+ https://${yourdomain}.slack.com/home
    + Menu -> customize -> Loading Messages

### 設定画面

![Screen Shot 2017-01-15 at 22.17.11.png](https://qiita-image-store.s3.amazonaws.com/0/25582/50952208-ba42-3af9-30d2-1c64bb78b40a.png)

### 試しに設定してみる

![Screen Shot 2017-01-15 at 22.19.53.png](https://qiita-image-store.s3.amazonaws.com/0/25582/c21afc23-8873-2a97-ce9d-b979f1c91ad3.png)

# 結果

![Screen Shot 2017-01-15 at 22.37.33.png](https://qiita-image-store.s3.amazonaws.com/0/25582/c5c6eafa-1fed-a62c-7fe1-53cbcfa074a8.png)

是非、みなさんも素敵なslackハックライフを♪
TeXをはじめて書いた大学生が添削されがちなこと

## やったこと

こないだ学会の投稿用にはじめてTeXで論文を書いて先生に見せました。ところがTeXに慣れていない大学生は，TeXの使い方をマスターしていないために，つまらないミスで先生の手を煩わせてしまうことになります。もっと論文の本質的な部分に集中してもらうため，先生の負担を減らすために書きました。

## 引用関連

```tex
行わない[3]ため %BAD
行わないため[3] %GOOD
```

引用を書くのは文節にします。

```tex
◯◯[3]ら %BAD
◯◯ら[3] %GOOD
```

著者が複数いる場合は `◯◯ら` のあとに引用を書くようにします。

## LaTeXの文法関連

### アンダースコア

```tex
under_score %BAD
under\_score %GOOD
```

texにおいて `_` (アンダースコア)は数式の下付きなどに使う意味のある記号です。エスケープしましょう。(エラーを吐くのでわかりやすいと思いますが)

### クォーテーション

```tex
'something' %BAD
`something' %GOOD
```

texでは，一般のプログラミング言語のように `'` と `'` で囲むと表示がおかしくなります。 `` ` `` ではじめて `'` で閉じるといい感じになります。ダブルクオーテーションの場合は ``` `` ``` と `''` で囲みましょう。

## その他

### BibTex

```tex
CAPITAL %BAD
{CAPITAL} %GOOD
```

bibtexファイル内で大文字を書いても小文字に変換されてしまいます。すべて大文字にしたいばあいは `{}` で囲みます。

### 句読点

句読点は `、` や `。` ではなく `，` と `．` を使用します。 [このあたり](http://yu-write.blogspot.jp/2014/02/tex.html) を参考に置換コマンドを走らせると楽です。

## さいごに

TeXは最初はむずかしいですが，使えるようになるとプログラミングっぽく書けて楽しいなと思いました。
Rのdataframeをsummaryした結果をmatrixデータにまとめる方法

## data.frameのsummary結果を表形式でファイル出力したい

すごく小さなTIPSだけれど、今まで気が付かなかったので書いておく。
RでCSVから読み込んだりしたデータで各列の基本統計量を見るには、単純に読み込んだデータ(data.frameオブジェクト)を`summary`関数へ渡してやればよい。

例えばCSVデータは大体こんな感じになっていると想定。

|Name|Height|Weight|
|:-:|:-:|:-:|:-:|
|フシギダネ|0.7|6.9|
|ヒトカゲ|0.6|8.5|
|ゼニガメ|0.6|9.0|

```R
data.raw <- read.csv(file = "data.csv")
data.input <- data.raw[, -1] # Name列は削除
data.summary <- summary(data.raw) # データをそのままsummaryへ
print(data.summary)
>     Height           Wieght     
> Min.   :0.6000   Min.   :6.900  
> 1st Qu.:0.6000   1st Qu.:7.700  
> Median :0.6000   Median :8.500  
> Mean   :0.6333   Mean   :8.133  
> 3rd Qu.:0.6500   3rd Qu.:8.750  
> Max.   :0.7000   Max.   :9.000  
```

ところがこの基本統計量のデータをCSVやEXCELに出力しようとすると、**`rowname`のない、しかも"Min. "などのラベルが含まれたデータが吐き出されてしまう。**

```R
write.csv(data.summary, file = "summary.csv")
```

```summary.csv
"","    Height","    Wieght"
"","Min.   :0.6000  ","Min.   :6.900  "
"","1st Qu.:0.6000  ","1st Qu.:7.700  "
"","Median :0.6000  ","Median :8.500  "
"","Mean   :0.6333  ","Mean   :8.133  "
"","3rd Qu.:0.6500  ","3rd Qu.:8.750  "
"","Max.   :0.7000  ","Max.   :9.000  "
```

ほしいデータは本来こんな感じなのだが...

```summary.csv
"       ","Height","Wieght"
"Min.   ","0.6000","6.900"
"1st Qu.","0.6000","7.700"
"Median ","0.6000","8.500"
"Mean   ","0.6333","8.133"
"3rd Qu.","0.6500","8.750"
"Max.   ","0.7000","9.000"
```

## applyで系列ごとにsummaryを適用すると表形式のデータが掃き出せる

理由はよく分かっていないのだけれど、**`apply`関数を使ってsummaryを列ごとに適用するとデータと行ラベルをうまく分離した`matrix`オブジェクトが取得できる**ことが判明。

```R
data.summary <- apply(data.input, 2, summary)
write.csv(data.summary, file = "summary.csv")
```

```summary.csv
""        , "Height" , "Wieght"
"Min."    , 0.6      , 6.9
"1st Qu." , 0.6      , 7.7
"Median"  , 0.6      , 8.5
"Mean"    , 0.6333   , 8.133
"3rd Qu." , 0.65     , 8.75
"Max."    , 0.7      , 9
```

なおデータの中に統計量取れない値(文字列とか)が入っていると、他の列も含めて統計量が出ないので事前によけておくこと。
あと`na`とかの混入もmatrixではなくlistで出てきてしまうので0置換などしておくよう注意する。

修論書いている途中にハマって、意外と調べたら出てこなかったのでメモしておく。
Linuxで特定のパッケージを検索して、ダウンロードする

この記事は、サーバー1:RedHat6.7 に入っている特定のパッケージを サーバー2:RedHat6.6 にインストールする作業で検索方法がわからず、はまったので、その時の検索方法について紹介します。

今回は、例として、PHP の特定のパッケージを検索する方法を取り上げます。
まず、コマンド入力で以下のように入力して、パッケージ名を表示します。
#rpm -qa | grep php-*
php-cli-5.3.3-27.el6_5.x86_64
php-common-5.3.3-27.el6_5.x86_64
php-5.3.3-27.el6_5.x86_64

例えば、上記のように、パッケージ名が表示された場合、そのまま、パッケージ名で php-cli-5.3.3-27.el6_5.x86_64、php-common-5.3.3-27.el6_5.x86_64、php-5.3.3-27.el6_5.x86_64 と入力して、検索してもなかなか該当するダウンロードページに行くことができません。

そんな時に役に立つのが、以下に紹介するサイトです。
rpmパッケージ検索: [http://rpm.pbone.net/](http://rpm.pbone.net/)
![RPMSearch.png](https://qiita-image-store.s3.amazonaws.com/0/157744/5fc7c061-8bac-ce38-de56-9aaaafea84d5.png)

例として、php-cli-5.3.3-27.e16_5.x86_64 を検索したい場合は、以下のように行います。
まず New look for FTP search. をチェックして、php-cli-5.3.3-27.e16_5.x86_64 とそのまま入力します。
次に、SEARCH ボタンをクリックします。

![RPMSearch1.png](https://qiita-image-store.s3.amazonaws.com/0/157744/ba1bf7df-a016-4d04-0ce0-c33fe5d44240.png)

パッケージファイルがあると、以下のようにリンクが表示されます。
![RPMSearch2.png](https://qiita-image-store.s3.amazonaws.com/0/157744/88c3c83d-5638-d1fd-917d-e927934a9b83.png)

あとは、該当のパッケージをクリックすると、ダウンロードできます。
Jenkinsからgmailへのメール送信設定をメモする

## Jenkinsの管理画面より
### E-mail 通知
 	SMTPサーバー	:	smtp.gmail.com
 	E-mailのサフィックス:	@gmail
	SMTP認証:	チェックあり
 	ユーザー名: xxx	
 	パスワード: xxxx
 	SSL:	チェックあり
 	SMTPポート:	465
 	返信先アドレス: 必要に応じて
 	文字セット:	UTF-8
 	
「設定を確認」ボタンを押し、「メールを正常に送信しました。」が出れば成功
reveal.jsのTips

reveal.jsを使用してプレゼンを行うことが多いのですが、これどうやるんだっけ･･･?といって、調べることが多いです。
よく使う設定や書き方をまとめます。

#操作編

### スライドのOverViewを表示  
`Escボタン`でスライドのOverViewを表示できる

### 発表モードにする
`Sキー`で発表者ツール表示。
ノートの書き方は、[発表用のnoteを書く(文書内)](#%E7%99%BA%E8%A1%A8%E7%94%A8%E3%81%AEnote%E3%82%92%E6%9B%B8%E3%81%8F)を参照してください。

### PDFで出力
URLの最後に`?print-pdf`をつけて、`Ctrl + p`で印刷用の画面が表示される
「レイアウト」の項目を「横」にして、「送信先」を「PDFに保存」にするとPDFで保存される
(Chromeで確認しています)

# 書き方編

### 横にスライドを一枚追加する
`<div class="slides">`の中に、`<section>`タグを追加することで、スライドを一枚追加できる。

```lang:html
<div class="reveal">
    <div class="slides">
        <section>
            // ここにスライドの中身を書いていく
        </section>
    </div>
</div>
``` 

### 縦にスライドを一枚追加する
`<section>`タグに入れ子で`<section>`タグを追加することで、縦方向のスライドを1枚追加できる。

```lang:html
<div class="reveal">
    <div class="slides">
        <section>
            スライド
            <section>
                縦方向のスライド
            </section>　　　　　　
        </section>
    </div>
</div>
``` 

### コードブロックを埋め込む
`<pre>`タグの中に`<code>`タグを埋め込むことでコードブロックを埋め込むことができる。
また、`<code>`タグのclass属性に言語を指定することで、その言語に適切なハイライトがされる。

```lang:html
<div class="reveal">
    <div class="slides">
        <section>
           <pre>
               <code class="html">
                   // ここにコードを書く
               </code>
           </pre> 　　　　　
        </section>
    </div>
</div>
``` 

### 発表用のnoteを書く
`<section>`タグ内に`<aside class="notes">`タグを埋め込むことで、そのスライドに対するノートを作成できます。
発表中にそのノートを見る場合は、[発表モードにする(文書内)](#%E7%99%BA%E8%A1%A8%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AB%E3%81%99%E3%82%8B)を参照してください。



#CSS編

### テーマの変更

```lang:html
<link rel="stylesheet" href="css/theme/black.css">
```
上記の'black.css'の部分を変更することで、テーマを変更できる。
テーマの一覧は以下を参照。
https://github.com/hakimel/reveal.js/#theming
SpringSecutiryで例外メッセージを変更するのーと

* Spring Boot 1.4.3.RELEASE
* Spring Security 4.1.4.RELEASE (4.2.1.RELEASEでも同様)

Spring Securityで`UserDetailsService`を実装し、認証失敗時のメッセージを変更したい。

# 対象外

以下のいずれかに該当する場合は対象外です。

* Spring Securityのメッセージを使用しない
* Spring Security 4.1.0.RELEASEの機能を使わない
* `AuthenticationProvider`を実装している
* `UserDetailsService`を使わない

# 想定手順と説明

1. `UserDetailsService`を実装してBean定義する。
2. `messages.properties`にSpring Securityのキーでメッセージを追加する。

以上。

`UserDetailsService`の実装 （してない）

```java
@Service
public class MyUserDetailsService implements UserDetailsService {
   // いい感じに実装する
}
```

`messages.properties` （抜粋）

```properties
AbstractUserDetailsAuthenticationProvider.badCredentials=ユーザーIDかパスワードが違います。
```
キーは[デフォルトのmessages.properties](https://github.com/spring-projects/spring-security/blob/4.1.4.RELEASE/core/src/main/resources/org/springframework/security/messages.properties) を参照するのが早い。ドキュメントは見つけられていない。

## 説明

[4.1.0で追加された `InitializeUserDetailsBeanManagerConfigurer`](https://github.com/spring-projects/spring-security/blob/4.1.0.RELEASE/config/src/main/java/org/springframework/security/config/annotation/authentication/configuration/InitializeUserDetailsBeanManagerConfigurer.java) が、`AuthenticationManagerBuilder`が未設定の場合のみ動作。
コンテナから`UserDetailsService`と`PasswordEncoder`を拾ってきて`DaoAuthenticationProvider`を作って登録してくれる。
`AuthenticationManagerBuilder`の設定は不要。

・・・であるはずだった。

# 期待はずれの挙動

例外メッセージがデフォルトから変わらず、「Bad credentials」になる。
`MessageResource`があれば`MessageSourceAware`で書き換えられる想定だった。

`MessageResource`はSpring Bootが作ってくれている。
にもかかわらず、`DaoAuthenticationProvider`の`MessageSourceAccessor`は`SpringSecurityMessageSource`のままである。


# この場の解決

`AuthenticationManagerBuilder`を使って設定しておけば`DaoAuthenticationConfigurer`を介して設定してくれる。

つまり、いままで通りに以下を記述する。

```java
@Autowired
void authenticationManagerBuilder(AuthenticationManagerBuilder builder,
    UserDetailsService service) {
    builder.userDetailsService(service).passwordEncoder(passwordEncoder());
}
```
Rails で、batch 処理の挙動を制御する

Rails でプロジェクトを作成しているとき、一定期間バッチを止めたくなることとか、あると思います。そのようなときは、通常なら server に ssh ログインして crontab を書き直したりすることになりますが、その定期的な処理を気軽に on/off したい、ということはありませんか？

特にエンジニアでない方が batch の実行／不実行を制御したい場合、画面でそれが行えると便利です。ですが web フォームから crontab の中身を直接制御することはできません。

それを「擬似的に」行うための実装を、サンプルコードとして実装する機会がありましたので、共有致します。

https://github.com/erosroad/batch_controll_sample

## 利用する Gem 

```rails new``` した後に生成された ```Gemfile``` に、下記 2つの Gem を追加しています。

* [seed_fu](https://github.com/mbleigh/seed-fu)：初期データの取り込みを容易に
* [whenever](https://github.com/javan/whenever)：crontab の中身を制御するための情報を Rails プロジェクト内に記述する（[参考記事](http://morizyun.github.io/blog/whenever-gem-rails-ruby-capistrano/)）


## model の説明

https://github.com/erosroad/batch_controll_sample/tree/master/app/models

* [BatchModel](https://github.com/erosroad/batch_controll_sample/blob/master/app/models/batch_model.rb) : 実際に動かしたい Batch 処理の中身が記述されている
* [BatchConfig](https://github.com/erosroad/batch_controll_sample/blob/master/app/models/batch_model.rb)：上記を制御する情報が入っている

つまり、以下の内容になっています。

* crontab（[whenever](https://github.com/erosroad/batch_controll_sample/blob/master/config/schedule.rb)） に書かれているのは、```BatchConfig``` 内に書かれている処理
* crontab を webページから気軽に編集できないため、```BatchConfig``` 内の処理は定期的に必ず実行される
* ```BatchConfig``` 内の処理で、```BatchModel``` 内の処理を呼び出すかどうかを制御していて、その呼び出すための情報は DB に入っており、webページから編集可能になる


## 新たな処理を追加するには

現在のサンプルプロジェクトでは、1日1回、及び、1時間1回の間隔で、batch 処理が走るように設定されています。
プロセスを追加するには、以下の方針で行えば可能です（開発環境の場合。適切に capistrano 等でデプロイタスクを組んでいたら、本番ではいくつかのコマンドは自動で実行されるはずです）

### 新たな batch 処理を追加したい

1. まずは[適当なmodel](https://github.com/erosroad/batch_controll_sample/blob/master/app/models/batch_model.rb)に処理を作成して、```bin/rails c``` でそれが期待通り動くことを確かめる
2. ```db/fixtures/batch_config.rb```([ファイル](https://github.com/erosroad/batch_controll_sample/blob/master/db/fixtures/batch_config.rb))に、その処理内容と実行タイミングを記述する
3. ```bin/rake db:seed_fu``` を実行する
4. ```bin/rails s``` でサーバを起動し、ブラウザから ```http://(domain)/batch_config``` にアクセスして、バッチの実行順を制御する

### 新たな起動タイミングを設定したい

1. ```config/schedule.rb```（[ファイル](https://github.com/erosroad/batch_controll_sample/blob/master/config/schedule.rb)）に、新たな crontab の記述を追加する。その際、その実行タイミングに名前をつける（サンプルコードでは daily, hourly）
2. ```db/fixtures/batch_config.rb```([ファイル](https://github.com/erosroad/batch_controll_sample/blob/master/db/fixtures/batch_config.rb))の、実行タイミングの部分を変更する
3. ```bin/rake db:seed_fu``` を実行する
4. ```RAILS_ENV=development bundle exec whenever --update-crontab```を実行して、crontab の中身を書き換える

## 改修ポイント

* DB 内に処理名が書いてあって、[それを eval で実行している](https://github.com/erosroad/batch_controll_sample/blob/master/app/models/batch_config.rb#L11)箇所がある。ここを web から編集することはないが、もう少しバグに強い書き方があるかもしれない
* 本番で複数台のサーバがある場合、batch を挙動するサーバを指定することができる。また負荷が高い場合はバッチ処理を分けたい。[batch を起動するサーバのIPを記録するカラム](https://github.com/erosroad/batch_controll_sample/blob/master/db/migrate/20170112124302_create_batch_configs.rb#L7)は用意しているので、「自分のIPが指定されている処理だけ実行」という処理を BatchConfig に追加する
macOS Siera へのQGISインストール

個別にダウンロードしてインストールしなきゃいけないモジュールがいくつかあって面倒だなぁと思って先送りしていたのだが、`brew`でインストールできるようになっていたので QGISをインストールした。

以下はそのときのメモ。

## 環境
- macOS Sierra 10.12.2

## 手順

次のようにコマンドを実行する。

```bash
brew install Caskroom/cask/qgis
```

GDALなど依存するパッケージが先にインストールされていく。
途中で、何度かパスワードを求められるので入力して先に進む。

しかし、一回目は失敗する可能性がある。
メッセージを良く読むと、`matplotlib`インストール後に次のコマンドを実行するように指示があった。

```bash
sudo ln -s /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python /Library/Python/2.7/site-packages/matplotlib-override
```

上記を実行後、再度インストールを試みる。

```bash
brew install Caskroom/cask/qgis
```

するとインストールが完了する。

私の環境では2017/01/15 時点で次のようなバージョンがインストールされた。

![image](https://qiita-image-store.s3.amazonaws.com/0/32533/e91d196a-1103-3897-d2a3-da850bf075ca.png)
SketchUp > M6の六角ボルトの寸法入力(内接円の半径) > 外接円の半径にして入力する

```txt:動作環境
SketchUp Make v17.1.173
MacOS X El Capitan
```

M6の六角~~アブセット~~アプセットボルトなるものをコーナンで購入。(パッケージの名称の濁点が間違っている)。
https://www.yht.co.jp/ctlg/011.asp?pf_id=0105Y003006
これをSketchUpで作ろうとした。

http://www.urk.co.jp/contents/elements/element8.html
に以下の定義がある。

M6の場合

- 二面幅(S) : 10.0mm

円を基準にしたポリゴンを作成する場合、「内接円」なのか「外接円」なのかで寸法の指定が異なる。

上のリンクの図から、二面幅というのは内接円を扱うことになりそう。
一方で、Sketchupの寸法入力は外接円の方のようだ。
(円の中に六角形が入る、ということから)。

内接円の半径5mmを外接円の半径に変換して指定することになる。

正三角形を2つに割った三角形の辺の比は、1:2:sqrt(3)なので、

```math
r_{circum} = r_{in} * 2 / \sqrt{3}
```

ここで、in: 内接円(Inscribed circle)、circum: 外接円(circumscribed circle)のsuffix。

1.15倍(=2/sqrt(3))かけた値を入力すればよさそうな気がする。


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/bd72677a-7219-8242-8bdb-faf09fbdf9ad.png)

とりあえず薄めのファルカタ材で作ってみた。M6には6.2のドリルを使用。
![DSC_0243.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/fe77d381-ad8a-08fb-a943-bdb4a418e734.jpeg)

- ファルカタ材の寸法
    - 幅: 9cm
    - 高さ: 12cm
    - 厚さ: 6mm

関連 http://designerhacks.com/polygons-sketchup/
Visual Studio のプロジェクトから NuGet パッケージを生成する方法

2017/03/23 追記
現在はこんなことしなくても Visual Studio の Build > Pack ${Package name} から簡単にパッケージを作れるようになっているみたいです。

![package.png](https://qiita-image-store.s3.amazonaws.com/0/117994/be40c6f0-0002-a381-6775-35b362d5e07f.png)

---

NuGet パッケージを作ろうと検索してみたところ、出てきたサイトは雛型みたいなファイルが置いてあってそれを編集させる形をとっていたのですが、そんなことしなくても .csproj ファイルから大部分を自動生成できるということが分かったのでメモしておきます。

まず、以下のサイトから `nuget.exe` をダウンロードして任意の場所に置き、パスを通します。

https://dist.nuget.org/

パスを通すのが面倒だからと `System32` に置くとなぜかエラーが出るので注意してください。仕方ないので私は `Program Files (x86)` に NuGet というフォルダを作って置いています。

`nuget.exe` を入れてしまいさえすれば、パッケージを作るのはとても簡単です。以下のコマンドを打てば `ProjectName.1.0.0.0.nupkg` というファイルが生成されます。.dll ファイルはあらかじめビルドしておいてください。

```
nuget pack ProjectName.csproj
```

あとは、微妙に情報が足りない部分があるので、以下のサイトから NuGet Package Explorer をダウンロードして、GUI で編集します。具体的には、 author/description などは生成されたパッケージには含まれていないので、手動で入力してあげる必要があります。

https://npe.codeplex.com/

具体的な書き方は調べればたくさん出てくるのでそちらを参照してください。
【Spring Batch】Jobの自動実行を行わない 指定したJob以外が自動で実行されてしまう時の制御法

# 指定したJobを実行する際に、runで指定したものとソース上のjobが呼ばれてしまう場合
## Jobを指定して実行する場合
通常Jobを指定して実行する場合は、
jobLauncher.run(job, new JobParameters());
などでJobのインスタンスを生成してから実行する。
## 問題
上記の際に実行結果を確認すると、指定したJobの他に、configurationクラスに記述したjobが、
全て実行されている場合がある
## 解決方法
src/main/resources/application.yml
に
> spring.batch.job.enabled: false

を追加
その分野の雑誌を3年読んでみよう

　自分自身の新たな能力を身につけようとするときに私が推奨する方法はその分野の雑誌を3年読み続けることです。

　仕事をし続けるためには、絶えず新しい分野の力を自分のものにし続ける習慣を持ち続けることです。そのために私の場合は、次の目標とした分野の雑誌を、**まだその分野を担当の業務としていないうちに**読み続けることを習慣としました。
　そうすることで、次のことが分かります。
・その分野の常識が何であるのかが分かる。
・その分野で何が新しい動きであるのかが分かる。
・その分野が、今まで自分が得意としてきた分野と共通性を持っているのかどうか。
・自分が能力をつけるための道具立てが、その分野でどういうものがあるのかを知ることができる。
・そのような道具立てが、無料もしくは低価格で提供されていることを知ることができます。
・無料・低価格の道具立ては、個人で必要な力をつけるために重要なポイントです。価格が高すぎる場合には、道具を会社に購入してもらうことは難しいし、購入に成功してもライセンスを維持しし続けることができなくなりやすいものです。

　OpenCVのような無料のソフトウェアがあるだけではなく、その分野の商用開発ツールの無料版があったりすることを知ることができます。
 その分野で成功するためのポイントは何であるのか、その分野の雑誌を3年読み続けるとわかります。

　さらには、その分野について調べていくと、個人で有用な情報を発信している人のサイトにたどり着くことがあります。その人が、商用誌で記事を執筆しているのを見かけることがあります。


無料ソフトウェアの例

- [Vivado HL WebPACK (ライセンス不要)](https://japan.xilinx.com/support/download.html)

-  [インテル® FPGA SDK for OpenCL* (Open Compute Language) ](https://www.altera.co.jp/products/design-software/embedded-software-developers/opencl/overview.html)


- [ LabVIEW無料評価版をダウンロード](http://www.ni.com/download-labview/ja/)

- [FPGAマガジン No.14　XilinxもAlteraも無償時代！ 最新C開発ツール大研究【PDF版】](http://cc.cqpub.co.jp/lib/system/doclib_item/1126/)


追記：
　機械学習の場合には、ダウンロードするだけですぐに実行できる環境が用意されているので、とにかくダウンロードして実行してみるというのが、理解を早める上でてっとりばやいといううれしい状況にあります。
 SlideShareで最近の研究動向などの記事を読むことで、ここに書いた方法よりも効果的に情報を収集することができます。
　
新たな分野を担当することになったときは、まずその分野の新しい書籍を買い込んで、その分野の常識を知ることは有意義です。
スライサー（FDM式３Ｄプリンタ向け）の作成　考察１（最適経路について）


* [スライサー（FDM式３Ｄプリンタ向け）の作成　目次](http://qiita.com/isTwt/items/5d40286eec73296ea790)

-----

# １．はじめに
　３Ｄプリントしていると、写真のような”ポッチ”が付着することがありませんか？
![DSC_0208a.jpg](https://qiita-image-store.s3.amazonaws.com/0/157557/01df4f7c-5ba9-4c97-2194-12ca1fcf4c93.jpeg)
　比較的簡単に除去はできるのですが、地味に面倒です。
　スライサーを作っていて、もしかするとこれが原因か？という点があり、そこを改良すると、現状が改善するかもと期待して、実装した機能です。

# ２．原因？
　スライサーがスライスするとき、とくに出力する順序は気にせず、求める形状（ノズルの移動経路）を算出しています。
　そして最後にこの経路情報を順次G-Code化しています。
　で思ったのが、ある経路を出力後、次の出力を場所に移動させる必要があり、このとき、出力済の箇所を通過（非出力箇所から出力箇所へ）すると、移動中に垂れたフィラメントが拭われ、現象の”ぽっち”になっているのではないか？
　であれば、この移動経路を変えることにより、垂れているフィラメントを付着させずに済むのでは？
![キャプチャ1.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/8d273533-8a2d-0831-abe7-529673ac3a23.jpeg)

# ３．最適経路アルゴリズム（考え方）
　ある閉領域を考えます。
![キャプチャ2.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/e8e7b71c-3d2c-6b3d-da99-6c16c1da3db2.jpeg)
　その閉領域の２点をPs/Peとします。
　閉領域はスライスした断面、Psは移動元の点、Peは移動先の点です。
　PsからPeへの移動経路を考えます。（スライス時は考慮しないヘッドの移動パスです）
　何も考えない場合の経路はPs→Peの直線的な移動を示すG-Codeとなりますが、原因？で示したような、箇所を通過することになります。
　そこで、PsからPeへ移動する最適経路として、閉領域内で経路探索すれば解決するはずです。

![キャプチャ3.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/84bc963f-4207-4ccd-13e6-9159c6e6167a.jpeg)

* 本機能は、現状検証段階であり、また、移動経路が長くなることから出力時間が伸びるため、パラメータによりON/OFFできるようにしている

# ４．おわりに
　アルゴリズムの説明がない？と思われるかもしれませんが、上記考えから、アルゴリズム自体は迷路探索と同じようなものです。
　実装した考えについては、まだ検証中で妥協している状態なので、今後改良を加えていきたいと思っています。
 
　本機能を実装実験したときのものです。（上から、本スライサ機能OFF，本スライサ機能ON，他のスライサ）
　赤い細い線がヘッドの移動ですが、機能ON時は出力物の領域からは基本でません。（右下にあるのは、開始と終了のときのヘッドの動き）
![sstpa.png](https://qiita-image-store.s3.amazonaws.com/0/157557/de27910f-2442-8104-21ff-5b2ed90b80ad.png)
スライサー（FDM式３Ｄプリンタ向け）の作成　其の１６（出力順番について）

* [スライサー（FDM式３Ｄプリンタ向け）の作成　目次](http://qiita.com/isTwt/items/5d40286eec73296ea790)

-----

# １．はじめに
　他投稿記事で３Ｄモデルをスライスし、構成ごとにノズルが移動する経路（パス）を算出できました。
　最後に、このパス情報を使い、G-Code化していきます。

* ここでの説明には花瓶モード（Simplify3Dでのvase mode）は含まれません。１層毎に積層していくモードです。

# ２．G-Codeファイルの構成
　G-Codeファイルは以下のような構成になっています。

1. 初期化
2. 層毎の出力
3. 後始末

　層毎の出力は以下のような構成になっています。

1. Zの移動
2. スカード／ブリム出力
3. モデル（ターゲット／ラフト）出力
3-1. 外周
3-2. 内周
3-3. インフィル
4. サポート出力
4-1. 通常サポート
4-2. 密集サポート

# ３．初期化／後始末
　G-Codeではヘッドの現在位置が不明です。（３Ｄプリンタ内部（ファームウェア）でも不明です。ファームウェアが指示を出した場所であるとの過程で制御されています）
　このため、最初にG28で全軸を初期位置へ移動させます。
　その後、ベッド温度の設定，ヘッド温度の設定，ユーザ指定の初期化コードなどを実行します。
　また、ファームウェアに対し、これから指定する座標系のモードなどを指定します。

　後始末としては、ベッドやヘッドを初期位置に戻したり、熱している箇所を冷却（加熱停止）したりします。

# ４．層毎の出力
　積層式ですので、第１層から順次出力します。
　スカート／ブリムは特性上最初に出力する対象です。
　次にラフトやターゲットモデルの外壁となるループを出力し、インフィルで塗りつぶします。
　サポートは最後に出力します。

# ５．G-Code化時の考慮点
## ５．１　パス
　ヘッドの移動などは、基本G1を利用します。
　G1を指定で現在位置から指定位置に移動します。
　モデルなどの出力対象の場合、Eパラメータを付けると、移動経路を移動中、所定の長さのフィラメントを押し出すことになります。
　Eパラメータが無い場合は、フィラメントの押し出しをせずにヘッド／ベッドが移動します。
　また、場所によりFパラメータを与え速度を変更することも可能です。

* 現状は未実施ですが、場所に応じて、”ゆっくり”や”早く”することが、出力品質に影響すると考えています。（”ブリッジ部分は早く”など）

## ５．２　単位系
　座標は[mm]単位のようです。
　速度は[mm/分]のようです。私はこの単位が分かりにくいので、パラメータファイルの速度は[mm/s]としています。
　このためG-Code化のときに変換しています。

## ５．３　フィラメントの量
**この点については、各種議論されているようです。**
**
　ノズルの吐出部分は基本円形状です。
　ですが、吐出後は、ベッドや、オブジェクトの上に0.1~0.3[mm]の高さで押し付けています。
　このため、出力後の断面は円形では無く、長方形＋左右に半円をつけた楕円のような形ではないか？などの議論です。
**

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/772ded0f-ec49-6dca-1964-5df7ad66df78.jpeg)

例：長方形と考えるの場合
　ノズル径=0.4[mm]
　積層高さ=0.3[mm]
　フィラメント径=1.75[mm]
　G-Code
　　G1 X0 Y0
　　G1 X10 Y0 E?
の場合、X方向へ10[mm]の長さの線となります。

　幅はノズル径，高さは積層高さですので、出力する体積として、10x0.4x0.3=1.2[mm^3]となります。
　この体積に相当するフィラメントの押出量を逆算します。
　フィラメントの断面積は、円の面積から約2.4[mm^2]ですので、1.2[mm^3]の体積を出力するには　0.5[mm] 押し出せば良いことになります。
　この値に、ユーザ指定のパラメータの押出率を適用してG-Code化しています。

　本ソフトでは現状、まだ実験段階ですが、スライス時に「基準となるノズル径で線を出力する」や「細く（0.4[mm]ノズル径に対し0.2[mm]幅）する」などの付加情報も算出するようにし、条件に応じて３種類の断面を分けています。
　１つ目は、標準的場合（0.4[mm]ノズル径で0.3[mm]高さ）の場合、長方形＋円となる断面。
　２つ目は、ノズル径のままの円（高さがノズル径以上ある場合は、そのままの形状としてる）
　３つ目は、指定幅と積層高さの長方形（左右が出力済の物体があり幅0.2[mm]の溝を埋めるなどの場合）
recover OpenMediaVault

##
```
sshpass 'root' ssh root@omv
```
##
```
cd /tmp

apt-get install php-json-schema

wget http://packages.openmediavault.org/public/pool/main/o/openmediavault/openmediavault_3.0.13_all.deb

dpkg -i ./openmediavault_3.0.13_all.deb

service openmediavault restart 
```

##
still cannot login
remove OMV plugin

```
root@omv:~# apt-get remove openmediavault-omvextrasorg 

Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  apt-transport-https
Use 'apt-get autoremove' to remove it.
The following packages will be REMOVED:
  openmediavault-omvextrasorg
0 upgraded, 0 newly installed, 1 to remove and 24 not upgraded.
After this operation, 535 kB disk space will be freed.
Do you want to continue? [Y/n] Y   
(Reading database ... 59767 files and directories currently installed.)
Removing openmediavault-omvextrasorg (3.3.3) ...
Processing triggers for openmediavault (3.0.13) ...
Restarting engine daemon ...
Creating index of upgradeable packages ...
Creating index of openmediavault plugins ...

root@omv:~# apt-get autoremove

Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  apt-transport-https
0 upgraded, 0 newly installed, 1 to remove and 24 not upgraded.
After this operation, 195 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 59701 files and directories currently installed.)
Removing apt-transport-https (1.0.9.8.3) ...
Creating index of upgradeable packages ...
Creating index of openmediavault plugins ...
```
:tada: :smile:
スライサー（FDM式３Ｄプリンタ向け）の作成　其の１５（平面ポリゴンの立体化アルゴリズム）

* [スライサー（FDM式３Ｄプリンタ向け）の作成　目次](http://qiita.com/isTwt/items/5d40286eec73296ea790)

-----

# １．はじめに
　本ソフトでは基本となるスライスアルゴリズムを共通利用するため、サポートやラフト等を３Ｄモデルとして内部で自動生成し扱います。
　本稿のアルゴリズムは、サポートモデルの生成や、[其の１４](http://qiita.com/isTwt/items/92874c74fcfcda1e6268)で生成した平面ポリゴンから立体化するアルゴリズムになります。
　ただし、垂直方向に掃引した形状のみです。

# ２．アルゴリズム（考え方）
![キャプチャ1.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/9816629d-cf62-4c32-653b-4f0c6b3444f0.jpeg)

1. 元となる面を掃引方向へ投影(Z値を変更)します。
![キャプチャ2.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/d9a355b6-d9b5-da87-fe53-62bac781d66a.jpeg)

2. 元となる面と投影した面の壁を生成します。（この壁は四角ポリゴン）
![キャプチャ3.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/6d4f402c-bb76-0610-ae64-7a593870f0b3.jpeg)

3. 全ての面を生成後、内部となる面を削除対象とします。
（内部となる面とは、同一頂点で構成される四角ポリゴン）
![キャプチャ4.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/6cfcc831-4d03-4c28-7c9f-6a41567205db.jpeg)

4. 面を再構成します。
（削除対象の面は削除し、削除対象でない四角ポリゴンは三角ポリゴンとして登録）
![キャプチャ5.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/f2e138b3-49eb-ce23-8f62-8d0ac7167e63.jpeg)