OmniAICreator/Qiita-1.07M huggingface dataset:
[PHP]こんなときどうする？そんなときどうしたらいいのかを調べる編

こんなときどうしよう？という話をまとめようかと思い立ちました。

今回はメタこんなときどうしよう編ということで、そんなときどうしたらよいかを調べる方法です。

# 方法(1) - composerパッケージを探す

あなたのやりたいことは、かつて誰かがやったことです。そのかつて誰かがやったプログラムがいっぱい置いてあるところがあります。これを使わない手はありません。

探す先は、[composer](https://getcomposer.org/)[^1]のパッケージです。

[^1]: PEARというものがありますが、衰退しました©。。。（たぶん）


https://packagist.org/ ここへ行って、好きな単語で探しましょう。

## 例えば……

* なに？添付付きのメールを送りたい？
* 「mail」で検索して、:star:スター順にソートです。
* swiftmailerというものが先頭に出てきました。
* ホームページへ行き、[swiftmailerのドキュメント](https://swiftmailer.symfony.com/docs/messages.html)を見てみましょう。
* はい。添付付きメールの送り方がわかりました。

# 方法（１’) - awesome-phpでパッケージを探す

**追記:2017年9月15日**

[awesom-php](https://github.com/ziadoz/awesome-php) に行くと、分類されたパッケージの一覧があります。



@niisan-tokyo さんに教えていただきました。Thanks! :smile: 



# 方法(2) - マニュアルを読む

やはり一次情報に勝るものなしです。[^2]

[^2]: 書いてないことも多いですが、そんなときはコメントを残しましょー。 :wink: 

http://jp2.php.net/manual/ja/

php.netの検索は関数しか見てくれないので、ぐぐったほうがいいかもしれません。
「site:php.net」を付け加えて、検索範囲を制限します。

https://www.google.co.jp/search?q=site%3Aphp.net

# 方法(3) - ここQiitaで探す

整理されて書かれているので、よいと思います。

「site:qiita.com」を付け加えてぐぐるのがよいです。
https://www.google.co.jp/search?q=site%3Aqiita.com
FXML JavaFXで他のstageのcontrollerを参照する方法

javaFXで複数のStageを使用するアプリケーションを作っていたのですが、

A_Stage,A_.fxmlで使用するA_Controllerと
B_Stage,B_.fxmlで使用するB_Controllerがあったとして
B_ControllerからA_Controllerのインスタンスのメソッドにアクセスするやり方がわかりませんでした。

散々ググって似たようなタイトルのサイトを真似しても自分がやりたい事と違いうまくいかず、FXML壊したり、NullPointerExceptionに悩まされてきたのですが、やっとわかったので備忘録で書いています。

とにかくどうやってA_Controllerへのポインタ参照をB_Controllerに持って来るかが問題です。

思いついた間違い1:
A_ControllerからB_Stageを作るとき、コンストラクタをオーバーロードできるようにstageクラスをextends継承して引数で渡す。
→無理です。いやもしかしたら出来るかもしれないけど相当難しそう。

思いついた間違い2:
B_Controllerの中でA_.fxmlを引数にFXMLLoader.getController()を使ってA_Contorollerを呼び出してA_Controllerのメソッドにアクセスする。
→インテリセンスも働くし一見動きそうですがNullPointerExceptionが発生します。どうやら同じFXMLを二回ロードしたら同じクラスの別々のインスタンスを2つnewされるため、ポインタを得られるわけではないそうです。

思いついた間違い３:
Controllerクラスかインタフェースがあるだろうからその変数を用意してどうとかする。
→そんなクラスありません。よく考えたらA_ControllerだろうがB_Controllerだろうが何も継承していない自作クラスでした。fxmlの方から指定して関連づけているだけでしたね。

成功：
public static void main(String args[]){}があるMainクラスに
静的メンバとしてA_Controllerクラスの変数　a_controllerを宣言し、
void start(Stage primaryStage)の中で
a_controller = fxmlLoader.getController();する。

後は、呼び出したいB_Contorollerクラスの好きなところで、
A_Controller controller;
contoroller = Main.a_controller;
contoroller.使いたいA_Controllerのメソッドやメンバ変数。
とすれば使える。

```java
:Main.java
public class Main extends Application {

	public static A_Controller; //これを使いたい場所からMain.A_Controllerで呼び出す。
	@Override
	public void start(Stage primaryStage) {
		
		try {
			FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("TradeLogTableStage.fxml"));
			Scene scene = new Scene((BorderPane)fxmlLoader.load());
			scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
			primaryStage.setScene(scene);
			primaryStage.show();
			A_Controller = fxmlLoader.getController();//これで静的メンバにポインタが格納される。
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		launch(args);
	}
}
```

```java
:B_Controller.java
/** Testボタンというボタンが押された時に発動するイベントとする*/
	@FXML protected void onTestButtonClick(ActionEvent evt){
		System.out.println("TestButton Clicked");
		A_Controller controller;
		controller = Main.A_Controller;//これで自由にA_Controllerにアクセスできる
		System.out.println(controller.toString());//後は普通にクラスメンバを使うだけ。
	
	}
```

```java:A_Controller.java
/**これはなんでもいいけど仮にこれをB_Controllerで呼びたいとする*/
	@Override public String toString(){
		return "This is the Controller which is Controll fxml";
	}
```
結果　B_Stageのテストボタンを押したところ。
<img width="351" alt="スクリーンショット 2017-09-13 0.01.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/201982/bc96ea8d-13f4-47d9-51b9-d7c7b5e191d2.png">

結局やってることは静的メンバを使用しているだけなので、JavaFXに限らずSwingでも同じように使えると思います。

ただこのままだとウィンドウハンドルになる重要な参照変数がどこからでも簡単に掴めるわけで、一人で開発するぶんにはいいですけど、他人数で開発する場合はgetter/setterとかでうまくカプセル化しないと危ないかもしれません。
CircleCI 2.0の新しいDocker imageを利用して、Androidのビルドとdangerの実行を行う

[CircleCI 2.0でAndroid関連の静的解析結果をPullRequestで指摘する - Qiita](https://qiita.com/noboru_i/items/f45b06822152b78d4572) で、CircleCI側が用意したdockerイメージにRubyの実行環境が入っていなかったため、回りくどいことをしていました。
（workflowsを利用して、コードをattachしつつ、別のdockerイメージを動かす）

その記事をベトナムの子会社に共有して数時間後、 https://github.com/circleci/circleci-images/pull/75/files というPRを教えてもらいました。
CircleCIの提供しているdockerイメージに、Rubyの実行環境が入ったようです。
これを使うことで、Rubyのコンテナは必要なくなりそうです。

ということで、やってみました。

## 変更点例

https://github.com/noboru-i/SlideViewer/pull/79/files

一部消しすぎてたので、追加修正。
https://github.com/noboru-i/SlideViewer/pull/80/files

## 変更後の `.circleci/config.yml`

固有の部分や、重要じゃない部分などを省くと、下記のようなイメージになります。

```yaml
version: 2

defaults: &defaults
  working_directory: ~/code
  docker:
    - image: circleci/android:api-26-alpha
  environment:
    JVM_OPTS: -Xmx3200m

jobs:
  build:
    <<: *defaults
    steps:
      - checkout
      - restore_cache:
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
      - run:
          name: Download Dependencies
          command: ./gradlew androidDependencies
      - save_cache:
          paths:
            - ~/.gradle
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}

      - restore_cache:
          key: gems-{{ checksum "Gemfile.lock" }}
      - run: bundle install --path vendor/bundle
      - save_cache:
          paths:
            - vendor/bundle
          key: gems-{{ checksum "Gemfile.lock" }}

      - run:
          name: Check lint
          command: ./gradlew :app:check -x test
      - run:
          name: Run danger
          command: bundle exec danger

      - run:
          name: Build apk
          command: ./gradlew :app:assembleDebug
      - store_artifacts:
          path: app/build/outputs/apk/app-debug.apk
          destination: app-debug.apk
      - persist_to_workspace:
          root: ~/code
          paths:
            - .

  deploy:
    <<: *defaults
    steps:
      - attach_workspace:
          at: ~/code
      - run:
          name: Build apk
          command: ./gradlew :app:assembleRelease
      - store_artifacts:
          path: app/build/outputs/apk/app-release.apk
          destination: app-release.apk
workflows:
  version: 2
  build_and_deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build
          filters:
            branches:
              only: master
```

これで、前回と同じようなdangerの実行を、CircleCI 2.0のスピードで実行できるようになりました。
EC2（AWS）で起動時にアプリを自動起動する

## 背景
- ec2-user（アプリによっては別ユーザ）にて、Railsアプリを起動していた。
- 定期的にイメージのバックアップを作成する際に、インスタンスを停止、起動したいという要望があった
- インスタンスを停止してから起動するとRailsアプリが起動されない。。。。
- インスタンスの起動時に自動実行されるscriptでRailsアプリを起動させよう。

## アプリ起動時に実行していたコマンドたち
```.sh
$ sudo service nginx start                                   # rootでnginxを起動
$ RAILS_ENV=production bundle exec rails assets:precompile   # デプロイユーザでprecompile
$ RAILS_ENV=production bundle exec puma -C config/puma.rb    # デプロイユーザでpuma起動
```
## 自動起動scriptの作成
application-starter

```application-starter 
#!/bin/sh
# chkconfig: 345 99 10
# description: start shell
case "$1" in
  start)
    service nginx start
    su -l ec2-user -c "sh /home/ec2-user/start.sh"
       ;;
  stop)
       echo "stop!"
       ;;
  *) break ;;
esac
```
start.sh

```start.sh
#!/bin/sh
cd /home/ec2-user/application
RAILS_ENV=production bundle exec rails assets:precompile
RAILS_ENV=production bundle exec puma -C config/puma.rb
```
## 起動シェルの登録
```
$ sudo su -
# cd /etc/init.d/
# chmod +r application-starter
# chkconfig --add application-starter
# chkconfig application-starter on
```

AWSコンソールからインスタンスを停止　-> 起動を行う
`ps` コマンドでアプリが起動しているか確認

## ハマったところ
rootユーザ以外で実行する処理は別シェルにしておき `su -l user -c "Command"`でuserを変えて実行する
`su - user`でユーザを変更しようとすると対話式でパスワード入力を待ってしまい、シェルが終わらない。。。
React.jsチュートリアルを○○で書いてみるシリーズ

React.jsはFacebookが提供する真のオープンソースのフレームワークになる予定[^1]です。そんなReact.jsチュートリアルを素のJavaScript以外で書いたものが増えてきたのでまとめました。

[^1]: v16より特許に関する項目が無くなり、MITライセンスになるらしい。

1. [React.jsチュートリアルをcoffee-reactで書いてみる](http://qiita.com/raccy/items/7c212f45cf8636e5927b)
2. [React.jsチュートリアルをLiveScriptで書いてみる](http://qiita.com/raccy/items/2eecd392944c164b188b)
3. [React.jsチュートリアルをPureScriptで書いてみる](http://qiita.com/raccy/items/f0fdb3831941d91d04a4)
4. [React.jsチュートリアルをReact.rbで書いてみる](http://qiita.com/raccy/items/46bc574a661ab724626c)
5. [React.jsチュートリアルをCoffeeScriptのみで書いてみる](http://qiita.com/raccy/items/08effbaf7748a2163121)
6. [React.jsチュートリアルをCoffeeScript 2で書いてみる](http://qiita.com/raccy/items/34cb5eb4b8a8e7a3820f)

古いものはそのうち修正したい…

まだ書いてないもの

* Babel(ES2015+)
* TypeScript
* Hyperloop (旧React.rb)
* Preact
Travis CIでRustのバイナリリリース(glibc, musl libc)

Travis CI上で各プラットフォーム向けのビルドをおこないます。ビルドされたバイナリはGithub Release上にアップロードされるようにします。

ひとまず、自分の場合は次の3つのビルドターゲットが必要でした。

- x86_64-unknown-linux-gnu
- x86_64-unknown-linux-musl
- x86_64-apple-darwin

もし、glibcむけのビルド(x86_64-unknown-linux-gnu)だけでよいのであれば、[こちらの記事](http://rhysd.hatenablog.com/entry/2017/01/01/204956)の設定がシンプルで良さそうです。

自分の場合は、musl libc向けのビルドも必要になりそうだったため、こちらの[trust](https://github.com/japaric/trust)という、ビルドテンプレートを使用しました。

上記以外にも、様々なビルドターゲットに対応しています。trustのREADMEを参照してください。

## 設定

trustのリポジトリから`ci/`ディレクトリと、`.travis.yml`を自分のリポジトリにコピーします。 
(Windows向けのビルドに対応する場合は、`appveyor.yml`も)

いくつか、自分用の設定に書き換える必要があるのですが、それらの部分は`TODO`とコメントしてあるので、`TODO`をgrepして潰していけば大丈夫です。

まずは、ここを自分のcrate名(プロジェクト名)に変えます。

```yaml:.travis.yml
env:
  global:
    # TODO Update this to match the name of your project.
    - CRATE_NAME=trust
```

Build Matrixは、自分の必要なビルドターゲットだけを残してコメントアウトします。

```yaml:.travis.yml
matrix:
  include:
    # 必要なもの以外はコメントアウト
```

Githubトークン(を暗号化したもの)を自分のものに書き換えます。
トークンの発行の仕方は、この[記事](http://qiita.com/sanemat/items/cbea8d3caa908e7422a0)を参考にします。

```yaml:.travis.yml
deploy:
  api_key:
    secure: XXXXXXXXXXXXXXXXXXXXXXXX
```

ここは、デプロイされる条件です。そのままだと、タグがつけられた時にリリースされるようになっています。

```yaml:.travis.yml
deploy:
  ...
  on:
    condition: $TRAVIS_RUST_VERSION = stable
    tags: true
```

あとは、`ci/`ディレクトリ以下にも、自分のcrate名に合わせて書き換える箇所があるので、`TODO`コメントを検索して修正をおこないます。

## 確認

タグをつけてpushすると、Travis CI上でビルドが実行されます。ビルドが成功して、Github ReleaseにTARのアーカイブがアップロードされていれば、ちゃんと動作しています。
has many through 多多のアソシエーションを使ってcollection_check_boxes でカテゴリーのタグ付けを実装する。　ほぼビュー周り。

「Rails4のhas_many throughで多対多のリレーションを実装する」http://qiita.com/samurairunner/items/cbd91bb9e3f8b0433b99
の次回がなかった(からかなり困った)のでビュー周りも紹介する。

前半は上の記事と同じ

<img width="663" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34383537372f63393464653135332d666461382d386535352d313034332d3334313462313036303232322e706e67.png" src="https://qiita-image-store.s3.amazonaws.com/0/180936/57108ab8-550b-1a02-590e-3f44ce68436f.png">
参考　http://qiita.com/samurairunner/items/cbd91bb9e3f8b0433b99

イメージ画像を作るのは面倒だったので拝借。
これのprojectsがarticlesにprojects_categoriesがarticle_categoriesになったバージョンと考えればいい。

#model
###category model
```app/models/category.rb
class Category < ActiveRecord::Base
  has_many :article_categories
  has_many :articles, through: :article_categories
end

```
###article model
```app/models/article.rb
class Category < ActiveRecord::Base
  has_many :article_categories
  has_many :categories, through: :article_categories
end

```
###article_categories model
```app/models/article_categories.rb
class ArticleCategory < ActiveRecord::Base
  belongs_to :article
  belongs_to :category
end

```

ほぼ上の記事と一緒

##ここからがいよいよ本番ビュー周り


###article controller
```app/controllers/articles_controller.rb
def create
    @article = Article.new(article_params)
    @article.user = current_user
    if @article.save
      flash[:success] = "as you like"
      redirect_to article_path(@article)
    else
      render 'new'
    end
 end

......................................................................

private
   #ここがポイント　category は collection_check_boxesのチェックボックスで複数選択の入力で値を渡す場合arrayで渡ってくるのでcategory_ids: []で受け取ると上手くいった
    def article_params
      params.require(:article).permit(:any, category_ids: [])
    end


```

そして肝心のビューは

###article new
```app/views/articles/new.index.erb
<%= f.collection_check_boxes :category_ids, Category.all, :id, :name do |ccb| %>
 <% cb.label(class: "any")
{ccb.check_box(class: "any") + ccb.text} %>
 <% end %>

```

見たこと無い形だったのでクラスをつけるのに苦労した。

これで指定したタグをつけるタイプのタグ付けを実装できる。



参考　
####collection_cheach_box 
http://qiita.com/sho012b/items/3a595fde14516081dff5
####model周り
http://qiita.com/samurairunner/items/cbd91bb9e3f8b0433b99

初心者、初投稿なので心配。
記法とかのアドバイスがあったらください。
PHPTALで非エンジニアが扱いやすいテンプレートを作ろう

「デザイナーが作成したHTMLにPHPでロジックを組み込む」
よくある話ですね。

```html
<tr>
  <td>りんご</td>
  <td>ぶどう</td>
  <td>バナーナ</td>
</tr>

```

「PHPでロジックを組み込んだHTMLをデザイナーが上手く扱えない」
これもよくある話です。デザイナーからしたらなんか余計なものが混じっているように見えますね。エディタのライブプレビューも使えません。

```php
<?php $items = ['りんご', 'ぶどう', 'バナナ'] ?>

<tr>
  <?php foreach ($items as $item): ?>
  <td><?= $item ?></td>
</tr>

```

そして、「デザイナーが扱えなくなったテンプレートをサーバサイドエンジニアがメンテナンスする」という悪夢が生まれてしまうのです。

そんなあなたへの処方箋、[PHPTAL](https://phptal.org/manual/ja/)をご存知でしょうか。
以下、公式ドキュメントからの引用です。

> ほとんどのテンプレートシステムがセクション検知のために<? ?>、<% %> もしくは <xxx:yyy></xxx:yyy> のようなタグを使います。　これらはテンプレートシステムの開発を容易にしますが、テンプレートのデザイナーにとっては助けになりません。
TALは、そのほとんどのロジックをXMLの属性として隠蔽するので、XHTMLの構造と文法をくずすことはありません。
なので、TALのテンプレートはWebブラウザ（WYSIWYGエディタ等のライブプレビューでも）でプレビューできますし、プログラマーのエディタによるハイライト表示も可能です。

なるほどわからん。とりあえず先ほどのコードで試してみましょう。
まず、HTMLにはPHPTALの要素としてロジックを埋め込みます。

```html

<tr>
  <td tal:repeat="item items" tal:content="item">くだもの</td>
</tr>

```

注目して欲しいのが、**この状態でもHTMLとして表示できる**ということです。
PHPで（あるいは他のテンプレートエンジンで）組み込んだ場合と比べ、そのままでもデザイナーが扱える形を保てているのが分かると思います。

そして、PHP側では以下のように書いてみます。

```php

$phptal = new PHPTAL('template.html');
$phptal->items = ['りんご', 'ぶどう', 'バナナ'];
echo $phptal->execute();

```

得られた結果がこちらです。

```html

<tr>
  <td>りんご</td>
  <td>ぶどう</td>
  <td>バナーナ</td>
</tr>

```

個人的にはWebアプリ作成よりも、帳票作成などでペライチで作ったHTMLに値を割り当てて`mPDF`に通すときなどに便利かなと思います。
Restlet Clientで始めるREST APIテストの自動化

REST APIを簡易的にテストする際に便利なツールということでRestlet Clientを紹介します。もしいまcurlなどでコツコツとテストスクリプトを書いてテストしている場合には、有効な代替手段です。同等なテストツールには、PostmanやJMeter（本当は負荷テストツール）、先述のcurlなどがあります。今回は比較は行いませんが、Restlet Clientがどこまでできるかということをまとめようと思います。なお有償プランもありますが、ここで取り扱うのはfree planの範囲となります。

#1. インストール
Restlet ClientはChromeの拡張機能として提供されていますので、次の手順でセットアップします。
1. Chromeをインストールする
2. 「[Restlet Clientのホームページ](https://restlet.com/modules/client/)」にて、拡張機能をインストールする

#2. 機能
インストールが完了するとRestlet Clientを利用できるようになります。

### 2-1. 全体イメージ
メイン画面のイメージは下記の通りです。（スクリーンショットは本家のホームページに掲載のものです）
![restlet-client-v2.png](https://qiita-image-store.s3.amazonaws.com/0/34410/c2ff36ce-0842-6552-c9de-5e93d36d832f.png)

### 2-2. 提供機能 
提供される機能は下記の通りです。

* 基本機能（単発でAPIを叩く）
  * HTTPリクエスト作成・実行
     * メソッド、URL、ヘッダー、ボディの作成
     * それぞれ変数化、環境変数の取り込みが可能 
     * curlコードの生成 
  * HTTPレスポンス受信
     * レスポンスコード、ヘッダー、ボディの表示
     * 応答時間計測
  * リクエスト・レスポンスの履歴保持 
* シナリオ実行機能（流れで複数のAPIを叩き、テストできる）
  * シナリオ管理、プロジェクト管理 
     * 1シナリオという単位で複数のAPIを流れで叩くことができる
     * プロジェクトを作り複数のシナリオを管理できる 
  * HTTPリクエストの検証（アサーション機能）
  * レスポンス結果を次のリクエストへ引き継ぐなどの値の持ち回り

簡易的に単発のAPIを叩きたい場合は、基本機能部分で十分です。複数のAPIを連続して叩く場合は、基本機能だけでは辛いのでシナリオ実行機能を利用します。基本機能は説明なしでも利用可能かと思いますので、以降ではシナリオ実行機能についてスクリーンショットを張りながら説明します。

# 3. シナリオ実行機能
説明のためにシナリオを用意しました。下記の流れで2つのAPIを連続して叩きます。（説明用のためAPIには大した意味はありません）

* 1回めはGETでリクエスト
* 2回目はPOSTでリクエスト
  * ボディには1回目のレスポンスボディの値を挿入
  * レスポンスコードが418（c.f. [RFC324](https://www.ietf.org/rfc/rfc2324.txt)）であることを検証

> リクエスト先のサーバ実装には、[Mocky](http://www.mocky.io/)という簡易モック作成用のWebサービスを使います。

### 3-1. シナリオを作成する
シナリオを作成し、その配下に単発のAPIを叩くリクエストを配置する。
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/34410/680e3e21-9483-7721-f9f5-a488a0630782.png)

### 3-2. 1回目のリクエストを作成する
HTTPメソッド、URLを記入する。
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/34410/b45fcbc5-f440-8385-39ea-aeebd8299da4.png)


### 3-3. 2回目のリクエストを作成する
3-2と同様にリクエストを作成する。ボディ部分は3-4で説明するExpression Builderを利用し、変数を構築する。（魔法の杖みたいなボタンはすべてExpression Builderを起動するボタンです）
![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/34410/2613d81e-3134-cee5-af83-160b18c6ef03.png)

### 3-4. Expression Builderでボディを作成する
Expression Builderを利用し、ボタンで選択していけば、簡単に1回目のレスポンスの値を取得することが可能です。
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/34410/8e5e04bd-710c-88b7-37b3-9cf283bf4c0a.png)

### 3-5. HTTPリクエストの検証
アサーションの種類をプルダウンで選んで設定します。ステータスコードが418であることと、ボディの中身に「teapot」が含まれることを検証します。
![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/34410/3fdf332a-52eb-4b1b-bb48-4236e0d612e2.png)

### 3-6. シナリオの実行と結果確認
シナリオの「▶」マークを押下すれば、実行されます。実行結果は、3-1に記載のスクリーンショットのイメージになると思います。

# 4. まとめ
UIを使って簡易的なシナリオの作成と実行ができました。
もう少し複雑なことをしようとする（複数シナリオ、CIとの連携など）場合には有償版の利用を検討することになりそうです。
Rails Devise で email と password 以外の要素を加えた時にすること

## 開発環境
- Ruby 2.3.0
- Rails 5.0.4
- devise 4.3.0

## deviseって?
Rails で簡単にアカウント認証機能を作れるgem
参照:
[[*Rails*] deviseの使い方（rails5版）](http://qiita.com/cigalecigales/items/f4274088f20832252374)
[Railsのログイン認証gemのDeviseのインストール方法](http://ruby-rails.hatenadiary.com/entry/20140801/1406907000)


## $rails g devise user で作成される"email"と"password"以外の要素も持たせたい
1. $rails g devise *[collection]* でdevise用のModelを生成。(※斜体は任意)
2. migration に 追加したい要素を記述してdb:migrate
3. devise用のstrong parameters に追加したcolumn を設定  


```ruby:controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected
    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:column])
      
    end
end
```
C#:IEnumerable<T>の実装サンプルとして簡易catコマンドを作成してみた


この記事は、`IEnumerable<T>`の実装を理解を深めるために書いたものです。

## TextReaderを列挙可能にする

.NET Frameworkには、File.ReadLinesというメソッドが用意されているのですが、入力がファイルに限定されています。しかし、今回作成する簡易catコマンドは、標準入力もサポートしたいので利用できません。

ということで、`IEnumerable<T>`を実装したEnumerableTextReaderクラスを作成しました。TextReaderオブジェクトから行を順に列挙するクラスです。

汎用性を持たせるために、テキスト形式のStreamも扱えるようにします。


以下、EnumerableTextReaderクラスのソースコードです。

```csharp
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;

namespace Cat {
    public class EnumerableTextReader : IEnumerable<string> {
        private TextReader _sr;

        public EnumerableTextReader(TextReader tr) => _sr = tr;

        public EnumerableTextReader(Stream s) => _sr = new StreamReader(s);

        public IEnumerator<string> GetEnumerator() {
            string s;
            while ((s = _sr.ReadLine()) != null) {
                yield return s;
            }
        }

        IEnumerator IEnumerable.GetEnumerator() => this.GetEnumerator();

    }
}
```


このクラスは、`IEnumerable<T>`インターフェースを実装していますので、テキストファイルに対して、LINQの拡張メソッドが利用できるようになります。とは言っても、簡易catコマンドではLINQのメソッドは利用してないですが...

TextReaderを受け取るコンストラクタを用意していますので、`Console.In`を渡せば、標準入力からも行単位で入力データを列挙することができます。


## 簡易catコマンドを実装する

上記のEnumerableTextReaderクラスを使って、簡易catコマンドを書いてみました。

このプログラムは、標準入力からデータを読み込み、標準出力に書きだすだけの簡単なものです。

使い方は以下のような感じ。

```
C:\>cat < sample.txt > sample2.txt
```


これで、sample.txtの内容を、sample2.txtに複写することができます。

以下のようなcatコマンド名だけの場合、キーボードから入力した行をそのままコンソール画面に表示します。この場合は、Ctrl+Zで入力を終了させます。


```
C:\>cat
```


以下、EnumerableTextReaderクラスを利用した簡易catコマンドのソースコードです。


```csharp
using System;
using System.Linq;
using System.Collections.Generic;

namespace Cat {
    class Program {
        static void Main() {
            var reader = new EnumerableTextReader(Console.In);
            reader.ForEach(Console.WriteLine);
         }
    }
 
    public static class EnumerableExtentions {
        public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) {
            foreach (T x in source) {
                action(x);
            }
        }
    }
}
```


## 補足

このコード、.NET Core 2.0でも動作確認しています。

ソースは、[GitHub](https://github.com/gushwell/CSharpAlgorithmCollection)で公開しています。
  
---
この記事は、Gushwell's C# Programming Pageで公開したものを加筆・修正したものです。
MngoDBのシェルとサーバのバージョンが違う事件

## MongoDBのインストールをミスった

ちょろっと試したいことがあり、MongoDBをWindows環境にインストールしたのですが、すでにインストール済みで、かつMongoDB Serverが動作状態だった。
~~ちなみにいつインストールしたのか自分でも記憶にない。。~~

そんなアホなやらかしをしたところ、こんな状態になりました。

```
> mongo
MongoDB shell version v3.4.7 
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.2.8
WARNING: shell and server versions do not match
```


ただのアホなのですが、放っておくこともできないので解決を図ります。


## 解決方法
### とりあえずMongoDB Serverを停止
タスクマネージャーから停止させました。

```
ps | ?{$_.processname -match "mongo"}
```

でPowershellから探し、killしてもよかったかもしれません。


### 再インストール
その後MongoDBのインストーラーを再実行し、無事インストール完了。


### 起動確認
```
> mongod --dbpath "C:\MongoDB\Server\3.4\data"
```
はい起動しません。
それもそのはず。

強制終了しているので、lockファイルが出来上がっています。
> (MongoDBディレクトリ)/data/mongod.lock

こいつを削除して再度起動します。

```
> mongod --dbpath "C:\MongoDB\Server\3.4\data"
2017-09-07T07:33:11.989-0700 I CONTROL  [initandlisten] MongoDB starting : pid=13220 port=27017 dbpath=C:\MongoDB\Server\3.4\data 64-bit host=DESKTOP-FSGPFUL
・・・
```
無事サーバ起動。

```
> mongo
MongoDB shell version v3.4.7
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.7
```

これで無事シェルとサーバのバージョンが揃いました。

自戒を込めて備忘録に残します。
PWAは2007年1月に始まった

![](https://cdn-images-1.medium.com/max/1000/1*JHfFeBBPtQj3JpO24IffvQ.jpeg)

Steve JobsがPWAを2007年に予言したという記事を見つけたので翻訳してみます。
[元の記事](https://www.hacklabo.com/the-beginnings-of-progressive-web-apps/)
(ホントはGoogle翻訳の結果を直しただけというのは内緒)

----

どんなイノベーションにも語り続けられるストーリーが必要です。

興味深いことに、プログレッシブウェブアプリ（PWA）の始まりは2007年にさかのぼります。2007年1月9日、Steve JobsはMacworld 2007でiPhoneを発表しました。

Jobsは革新的な携帯電話、タッチコントロール付きのワイドスクリーンiPod、そしてこれまでに無いインターネットデバイスの3つを1つの小型軽量ハンドヘルドデバイスに組み合わせたユニークなデバイスを発表しました。しかしながらiPhoneの初期にはApp Storeはありませんでした。

>
(訳者注)ちょっと補足：
これはアメリカの話でアメリカでは実際2007年のiPhone発表から2008年のiPhone 3Gの発売まではApp Storeはありませんでした。
日本の場合2008年のiPhone 3Gが最初に発売されたiPhoneだったため、iPhoneとApp Storeは一緒にリリースされています。

Jobsは開発者が標準のウェブ技術を使ってiPhoneアプリを開発することを望んでいました。このデバイスのウェブブラウザであるSafari内で動作するウェブアプリとして。

> 完全に動作するSafariエンジンがiPhoneの中にあります。なのでiPhone上のアプリとまったく同じように見えて動作する素晴らしいWeb 2.0とAjaxアプリケーションを作ることができます。

> また、これらのアプリはiPhoneサービスと完全に統合できます。そしてなんとSDKは必要ありません。
> 最新のWeb標準の技術を知っているだけでiPhone用のすばらしいアプリケーションを作ることができます。今日から。

> 開発者の皆さんにとてもいいお知らせがあります。今日からiPhoneアプリの構築を開始することができるのです。

2007年1月Macworldの[Steve Jobsの講演](https://www.youtube.com/watch?v=P-a_R6ewrmM)から抜粋

残念ながらモバイルWebアプリは流行りませんでした。 2007年10月にJobsは、iPhone向けのSDKが翌年に公開されると発表しました。
2008年7月AppleはiTunesのアップデートを通じて、ついにApp Storeを導入しました。ネイティブアプリバブルがそこから始まりました。

2014年にForbesは、Jobsがネイティブアプリの膨大な未開拓の可能性に対して非常に遅い反応をしたことを彼の「[最大の失敗](https://www.forbes.com/forbes/welcome/?toURL=http://www.forbes.com/sites/markrogowsky/2014/07/11/app-store-at-6-how-steve-jobs-biggest-blunder-became-one-of-apples-greatest-strengths/&refURL=&referrer=#4f2069b44874)」の1つとした記事を公開しました。その時はForbesにもそこから先の急速な展開が分からなかったのでしょう。

この記事から数ヵ月後の[ComScoreの報告書](https://www.comscore.com/Insights/Presentations-and-Whitepapers/2015/The-2015-US-Mobile-App-Report)によると、平均的なモバイルユーザーは78%の時間を3つのアプリでしか使ってないという報告がされたのは偶然ではありません。

タブレットではその数字はさらに高く、ユーザーの時間の87％が上位3つのアプリに費やされていました。このレポートによると米国では平均的なスマートフォンの所有者の一ヶ月の新規アプリのインストール数はゼロでした。

Google ChromeエンジニアのFrances BerrimanとAlex Russellが、2015年に「Progressive Web App(PWA)」という言葉を作りました。PWAはモバイルフレンドリーに設計されたウェブアプリケーションです。プッシュ通知を送信したり、オフラインで作業したり、アプリのように見たり感じたり、ホーム画面にインストールしたり、ユーザーと開発者の両方に様々な利点が提供されます。

PWAのコンセプトは、2016年5月にサンフランシスコで開催されたGoogle I/Oカンファレンスで正式に発表され、大きな成功を収めました。
AppleがSafariで新しいWeb APIを実装するのに遅れをとっている間、AndroidのモバイルWebアプリケーションへの対応が追い越した形となりました。

JobsはWebベースのモバイルアプリケーションに関してもやはり時代を先取りしていました。あの2007年の発表から10年たった今、PWAの開発はとてもエキサイティングな状態になっています。私は最近PWAについていろいろ調べていますが、とても興味深い発見をしています。残念ながらアップル社内ではこの点ではほとんど進展がないようです。
Safariの慢性的な遅れが早く変わってくれることを本当に願っています。

Jobsが生きていたら本当に喜んだでしょう。

----

[Mediumの元の記事](https://medium.com/@takeshiamano/pwa%E3%81%AF2007%E5%B9%B41%E6%9C%88%E3%81%AB%E5%A7%8B%E3%81%BE%E3%81%A3%E3%81%9F-7225f77f7db2)
Cの配列をコピーしてVec型の変数を作る

# 背景

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">rustでCvMatはうまいこと取り出せたが、rustから、unsigned charな配列をうまく作れてないのか、ハマりにくいだろと思った方がトラブるという</p>&mdash; kjunichi (@kjunichi) <a href="https://twitter.com/kjunichi/status/906364309827067906">2017年9月9日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 画像の配列にありがちなunsigned charの配列をRustな型にするには

ptrがunsigned char*

```rust
ptr: *mut c_uchar
```

これをRustのu8の配列に変換する。

offsetメソッドでポインタのアドレスをずらせる模様。

```rust
let mut buf: Vec<u8> = Vec::new();
for i in 0..len {
        buf.push(unsafe { *(ptr.offset(i as isize)) });
}
``` 

# 関連記事

- [Rustを始めてみた](https://abrakatabura.hatenablog.com/entry/2014/09/14/171314)
- [RustでOpenGLやGLSLやる準備](https://abrakatabura.hatenablog.com/entry/2014/10/04/080151)
- [Rustで多次元配列を扱うには](https://abrakatabura.hatenablog.com/entry/2014/10/16/072545)
- [RustでFaceTime HDカメラやWebカメラを使う](https://abrakatabura.hatenablog.com/entry/2014/10/23/063643)
- [libtrusterdをRustで動かした](https://abrakatabura.hatenablog.com/entry/2015/07/17/074714)
- [Rust入門者向けハンズオン #2 に行ってきた](https://abrakatabura.hatenablog.com/entry/2017/01/16/075139)
- [Rustでコマンドラインアプリでキーが押されたかの判定しつつ、別の処理も進めるには](https://abrakatabura.hatenablog.com/entry/2017/09/20/065024)
- [RustでWebカメラの映像をコマンドプロンプトに出すコマンドを作った](https://abrakatabura.hatenablog.com/entry/2017/09/21/064630)
- [2018年版、Rustで多次元配列を使うには](https://abrakatabura.hatenablog.com/entry/2018/07/15/203516)
テーブル再作成（削除・作成）

テーブル削除・作成すると
以下項目が削除されてしまい、めんどくさいので手順をここに残します。
※ワタシガ検証して分かった事。他にもあるかも知れません。
残らない項目
・権限
・カラムコメント
・デフォルト値定義

残る項目
・シノニム
・シーケンス

■反映
１．datapumpツールを使用してデータをエクスポート
impdp SYSTEM DIRECTORY=xxx CONTENT=DATA_ONLY   TABLES= スキーマ名.元テーブル名  DUMPFILE= 任意のファイル名.dmp LOGFILE=任意のファイル名_yyyymmdd_imp.log 

２，テーブルのバックアップ
CREATE TABLE スキーマ.バックアップテーブル名 AS SELECT * FROM スキーマ.バックアップ元テーブル名;

３．テーブル削除
DROP TABLE スキーマ.元テーブル名;

４，新規テーブル作成
CREATE TABLE スキーマ.新テーブル名～;

５．データ投入
datapumpツールを使用してデータをインポート
impdp SYSTEM DIRECTORY=xxx CONTENT=DATA_ONLY   TABLES= スキーマ名.元テーブル名  DUMPFILE= 任意のファイル名.dmp LOGFILE=任意のファイル名_yyyymmdd_imp.log 

６，権限追加（３のDROPで削除される為再作成）
GRANT SELECT,INSERT,UPDATE,DELETE ON スキーマ名.元テーブル名 TO 権限付与される側のスキーマ名;



■切戻手順
万が一の場合、以下手順で切り戻します。
１，テーブル削除
DROP TABLE スキーマ名.テーブル名;

２,バックアップから復元
ALTER TABLE スキーマ名.バックアップテーブル名 RENAME TO 元テーブル名;
ALTER TABLE スキーマ名.元テーブル名 ADD CONSTRAINT PK名 PRIMARY KEY(カラム1,カラム2);

３,コメント追加
COMMENT ON COLUMN スキーマ名.元テーブル名.CONTACT_COMMENT IS 'コメント';

４，権限追加（２のDROPで削除される為再作成）
GRANT SELECT,INSERT,UPDATE,DELETE ON スキーマ名.元テーブル名 TO 権限付与される側のスキーマ名;

５，一定期間保存後、不要になったらバックアップ削除
DROP TABLE スキーマ.バックアップ元テーブル名;
Gmail で フィルタリングしてフォルダごとに分けたいよ。

Mail 使ってたけど、ヘッダーが壊れる事が多くあって、辛いので Gmail を専用アプリ化して使うことに。

社内の開発系は Slack に移れたけど、クライアントワークスでは未だにメールベース。
だいたい 4-5件 案件があって、関わっているポジションもバラバラなので
進捗をケアしなくていい案件と、マネジメント必要な案件があり、メールの重要度が異なる。
ので、未読があればすぐ見るメールボックスと、余裕のある時に見るメールボックスは能動的に分けておきたい。

という理由により、
MailのGUIでわかりやすいルールの条件が便利に思っていたのですが、
Gmailに移行するにあたってフィルターの仕組みがぱっと見わかりずらくハマったので、以下備忘録として。


### 参考
> http://appllio.com/gmail-advanced-search-filtering-technics#h2
GradleでAndroid端末のSQLite DBをpullする

# やりたいこと
**アプリで使ってるSQLiteファイルをGradleのコマンドでpullしたい**

# 方法
1. 以下のスクリプトをapp/build.gradleにペースト
2. emu/pkg/dbを適切なものに書き換える
2. `./gradlew pullDb`を実行。

```groovy
task pullDb(type: Exec) {
    def devId = "" // デバイスID、adb devicesで確認できる
    def appId = "" // 自分のアプリケーションID
    def db    = "" // SQLite DBのファイル名
    def adb   = android.adbExecutable.absolutePath
    commandLine "$adb", "-s", $devId, "shell", "run-as $appId cp databases/$db /sdcard/$db"
    commandLine "$adb", "-s", $devId, "pull", "/sdcard/$db", "."
}
```
AppServiceにて固定IPを設定する方法(AppService Environment)

皆さん、Azure使っていますか？使っていませんね
普通に使うならAWSだと思います。しかし、世の中にはAzureを使わざるを得ないこともあります。
そんな理不尽を戦いながら、調査した内容をしたためてみました

# AppService Environmentについて

Azureには~~GAEのぱくった~~AppServiceというContainerServiceが存在しており、VisualStudioで実装すればとても簡単にデプロイできます
WebサービスをAzure上に構築する際にはよっぽどのことがないかぎりAppServiceで実装するのが良いでしょう

しかしながら、このAppServiceはクラウドのサービスなのでデプロイした際にIPが決まるのですが、Azure自体はIPが変わらないことを保証しているわけではありません。エンタープライズの用途で使う際にはIPを固定化して使いたいという用途があります

[App Service Environment の概要](https://docs.microsoft.com/ja-jp/azure/app-service/app-service-environment/intro)

ここで用いるのがAppServiceEnvironment(以下、ASE)というもので仮想ネットワーク（以下、VNET）以下にAppServiceに作れるという代物です

# ここが難しいよ、ASE

## IPは最初の作成時に割り振られる

**既存IPは設定できない**

Azure上に展開できる他のサービスのCloudServiceなどは予約IPを購入しておき、そのIPを設定して使うような作りになっています。しかし、ASEは環境作成時自動で割り振られてそのIPが変わらない、ということを保証してくれる仕組みとなっています。ですので、予め確保してあるIPを割り当てる、ということはできません。


## なんかよく分からないv1とv2の差異

**だまってV2使っておけ**

このASEにはv1とv2が存在しており、これの使い分けが分かりません
しかもドキュメントも分かりにくくどちらがどちらを指しているのかページを追っていくと分からなくなったりします

[App Service Environment v2 の概要](https://docs.microsoft.com/ja-jp/azure/app-service/app-service-environment/intro)

[App Service Environment v1 の概要](https://docs.microsoft.com/ja-jp/azure/app-service-web/app-service-app-service-environment-intro)

IPを固定したいという用途だけならv2を使っておけばまず問題ありません
ので黙ってv2を使っておくことをおすすめします

## サブネット設定の罠

**サブネットは新規で作るべし**

ASEを作成時に必ず設定するVNET上に新しいサブネットを作成する必要があります
既存のVNETを使うとそのVNET上にあるサブネットにかぶらないように新しいサブネットを構成する必要があり、とてもめんどくさいです

![Pasted image at 2017_09_12 08_20 PM.png](https://qiita-image-store.s3.amazonaws.com/0/8350/569c3480-93bc-be69-dd0c-07d780ea1408.png)

上記のようになっていたら設定不可ですね…
だまって新規で作成する方が楽です

## AppServiceの作り方が分からない

**まずAppServicePlanを作れ、話はそれからだ**

ASEを作ると意味合い的にその下にAppAerviceが作れるのかな、と思うのですが探せど探せどそんなUIはASEのUI上には見つかりません
下記の順を追わないとAppServiceを作ることが出来ないのです

1. ASEを作る
2. 上記で作成したASEを場所としてAppServicePlanを作成する
3. 上記で作成したAppServicePlanを指定してAppServiceを作成する

![Pasted image at 2017_09_12 08_29 PM.png](https://qiita-image-store.s3.amazonaws.com/0/8350/a18e18e8-4ed1-b818-6c17-e26f76d1757c.png)

ASE環境を作っておくとAppServicePlanの作成をしようとすると場所に作成したASEを指定できるようになっています
これを使ってAppServicePlanを作成します

次にAppServiceを作るのですが、通常AppServiceの名称部分は下記のように表示されています

![Pasted image at 2017_09_12 08_35 PM.png](https://qiita-image-store.s3.amazonaws.com/0/8350/e0660dae-e60c-fbb2-a8d6-4b78414030ff.png)

ここで先程作成したAppServicePlanを入力すると下記のように表示が変わります

![Pasted image at 2017_09_12 08_36 PM.png](https://qiita-image-store.s3.amazonaws.com/0/8350/89d9b616-4b4b-f9e9-241c-2da31664663e.png)

先程作成したASEがサブドメインとして設定されていることが分かると思います
このままAppServiceを作成すればASE以下にAppServiceを構築することができます

# まとめ

なんとかAppServiceのIPの固定化に成功しました
これでIPが代わってしまう可能性がある日々から解放されました
paizaのキャンペーン問題やってみた。(巡回セールスマン問題)

肉かamazonギフト券が抽選でもらえるらしいので、今回はpython3でやってみました。
https://paiza.jp/poh/phantom_thief

問題概要

```
N個のお宝のx, y座標が与えられる。
各座標間は直線で移動。
0, 0の位置からスタートする。
可能な限り短いルートで各お宝をゲットするルートを出力する。
必ず最短距離である必要ない。

入力される値
N　（N はお宝の総数）
x_1 y_1　（x_1 は 1 個目のお宝の場所の x 座標、 y_1 は 1 個目のお宝の場所の y 座標）
x_1 y_1　（x_2 は 2 個目のお宝の場所の x 座標、 y_2 は 2 個目のお宝の場所の y 座標）
・・・ 
x_N y_N　（x_N は N 個目のお宝の場所の x 座標、 y_N は N 個目のお宝の場所の y 座標）

・全ての値は整数 
・1 ≦ N ≦ 100 
・1 ≦ x_i, y_i ≦ 1000000 (1 ≦ i ≦ N) 

期待する出力
お宝を全てゲットできるルートを出力して下さい。 
最後は改行し、余計な文字、空行を含んではいけません。 

例
入力例1
3
90 100
40 15
30 30

出力例1
90 100
40 15
30 30

入力例2
5
1 1
40 120
199 256
10 30
50 5

出力例2
1 1
40 120
199 256
10 30
50 5

```

自分が書いたコード。

```py3
import math

def cal_distance(current_point, point):
    """ 2点間の距離を求める """
    x1 = current_point[0]
    y1 = current_point[1]
    x2 = point[0]
    y2 = point[1]
    distance = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
    return distance

def make_distance_list(current_point, position_list):
    """ 2点間の距離のリスト作成 """
    distance_list = [(i, cal_distance(current_point, x)) for (i, x) in enumerate(position_list)]
    return distance_list

# 入力値取得
list_len = int(input())
position_list = []
for i in range(list_len):
    position_list.append(list(map(int,input().split())))

# 現在の位置から近い位置に移動していく
current_point = [0, 0]
while len(position_list) > 0:
    distance_list = make_distance_list(current_point, position_list)
    sorted_distance_list = [x[0] for x in sorted(distance_list, key=lambda d: d[1])]
    print('{0} {1}'.format(position_list[sorted_distance_list[0]][0],
                             position_list[sorted_distance_list[0]][1]))
    current_point = position_list.pop(sorted_distance_list[0])

```

実行結果(ちょっと入力と出力の境目がわかりずらい)

```
$ python PaizaRouteSearch.py
5
1 2
4 2
10 40
3 2
1 1
1 1
1 2
3 2
4 2
10 40
```

現在位置から一番近いお宝へ順に辿っていけばいいかなぁと安直な考えで書きました。
聞いた話によると「巡回セールスマン問題」というアルゴリズムで解くのが最短ルートらしいです。

時間があるときに調べて見直したいです。


　
追記：
paizaのブログで問題解説の記事が上がっていました。
[http://paiza.hatenablog.com/entry/2017/09/26/【問題解説】怪盗813からの謎を解いて、お宝ゲットする方法](http://paiza.hatenablog.com/entry/2017/09/26/%E3%80%90%E5%95%8F%E9%A1%8C%E8%A7%A3%E8%AA%AC%E3%80%91%E6%80%AA%E7%9B%97813%E3%81%8B%E3%82%89%E3%81%AE%E8%AC%8E%E3%82%92%E8%A7%A3%E3%81%84%E3%81%A6%E3%80%81%E3%81%8A%E5%AE%9D%E3%82%B2%E3%83%83%E3%83%88)


自分の解法は貪欲法というらしく、paizaのブログでも同じ解法を紹介していました。
その他にも「焼きなまし法」、「ビームサーチ」、「2-opt」、「遺伝的アルゴリズム」、
「クリストフィードのアルゴリズム」、「全域木」、「粘菌アルゴリズム」・・といろいろあるみたいです。
Wikipediaをみると数式が・・。学生以来数学から離れているので頭痛い。

プレゼントについては
もう当選者への発送が始まっているようで、自分には特に連絡がないので外れたみたいです。残念。

ちなみに、以下は間違いでした。問題があってその解法としてアルゴリズムがいくつかあるようで。
＞ 聞いた話によると「巡回セールスマン問題」というアルゴリズムで解くのが最短ルートらしいです。

追記2：
プレゼントについて
1か月半ほど経って忘れたころにAmazonギフト券(1000円分)が届きました！
期待してなかっただけにうれしい！
意外と当たるみたいなので、次回もまた参加したいと思います！
ちょっとずつ読むドメイン駆動設計 第一部 ドメインモデルを機能させる 第三章 モデルと実装を結びつける1

# 2つのアンチパターン

第三章初めからしばらくは２つの失敗するプロジェクトについて述べています。

1. ドメインモデルを一切持たないプロジェクト
2. モデルはあるが、実装と結びつかないプロジェクト

## ドメインモデルを一切持たないプロジェクト

いくつも、経験あります。

> 既存のC++アプリケーションを、Javaで実装される新しい設計に置き換えるというもの(第一部 第三章　より)

よくありますね。。。いわゆるリニューアルプロジェクト。リニューアルプロジェクトでよくあるのが、既存のモデルはないが、動くソースがあるので、単なる置き換えで済ませてしまうこと。

> 次から次へと機能を融合させて既存のコードの上に積み重ねてきたものだったため、注目に値する一般化も抽象化もなかった。(第一部 第三章　より)

よくありますね。。。

このようなプロジェクトの末路は、複雑なドメインが現れた時にどうしようもなくなることですね。
実際、そんなにかからないような修正でも影響範囲が不明でテストに時間がかかる、また、リリースのたびに思いもよらないエラーが発生する、最悪はここは修正できませんと断らざる負えなくなる、、、どれも経験あります。。。

## モデルはあるが、実装と結びつかないプロジェクト

> 分析モデルを作ることを主張する。これは設計とはっきり区別され、通常は別の人々によって開発される。・・・分析モデルはビジネスモデルを理解するためだけに使うツールとされ、実装の問題をまぜてしまうとわかりにくなる(第一部 第三章　より)

このようなプロジェクトを経験したことはないのですが、こんな経験ならしたことがあります。

ソフトウェア開発プロジェクトではないところでしたが、現状の分析をしたいということでUMLのクラス図で整理したことがあります。UMLが流行りはじめて、とにかく使ってみよう的な流れだったと思います。

ただ、作ったのはいいのですが、何の役に立つのだろう・・・となり、クラス図は破棄されました。

これって、ソフトウェアの開発でも同じことが起こると思います。

> 動作するソフトウェアの開発を直接支援しないなら、紙に書かれたモデルが何の役に立つというのだろう？(第一部 第三章　より)

まさにその通りですね。

> 不気味なことに、これら２つのプロセスの最終成果物は非常によく似ていたのだ。どちらも機能は備えていたが肥大化していて、実に理解しにくく、結局は保守ができなかったのである。(第一部 第三章　より)

そこでモデル駆動設計です(つづく）！
運動方程式とモーション


Nature of codeを勉強中です。
Nature of codeの「力の章/自律エージェントの章」のメモです。

Nature of code
http://natureofcode.com/
p5.jsのソース
https://github.com/shiffman/The-Nature-of-Code-Examples-p5.js


# 力と加速度
## 質量に加速度をかけると、力になる

f = m * a
a = f / m

fとaはベクトル、mはスカラー。
簡易的にm = 1 とすれば、 f = a でいける、ともいえる。

コードはこんな。

* 力を加えると加速度が増す
* 毎回update()内で速度に加速度分を加算したら0にする

```
applyForce(force) {
  var f = p5.Vector.div(force, this.mass); |
  this.acceleration.add(f);
}

update(){
  this.velocity.add(this.acceleration);
  this.position.add(this.velocity);
  this.acceleration.mult(0);
}
```
https://github.com/shiffman/The-Nature-of-Code-Examples-p5.js/blob/master/chp02_forces/NOC_2_01_forces/mover.js

重力を使う場合、このように呼ぶ。

```
function draw() {
 let gravity = createVector(0, 0.1);
 m.applyForce(gravity);
 m.update();
}
```

https://github.com/shiffman/The-Nature-of-Code-Examples-p5.js/blob/master/chp02_forces/NOC_2_01_forces/sketch.js


## 例：摩擦 (friction)の加え方

摩擦は
f = -1 * μ * N * v
であらわされる
muは定数。Nは抗力、vは速度

仮に抗力を１で不変とした場合、速度の大きさに比例した逆方向の力を加えることになる。

https://github.com/shiffman/The-Nature-of-Code-Examples-p5.js/blob/master/chp02_forces/NOC_2_04_forces_friction/sketch.js

加わる力は一貫してaddForceで与えるようにしておく。mover.addForce(friction);


## 例：万有引力を加える

https://github.com/shiffman/The-Nature-of-Code-Examples-p5.js/tree/master/chp02_forces/NOC_2_08_mutualattraction

これもaddForceで与える。 mover.addForce(gravity);

# 操舵行動

舵をきり、目的地に到着するような動き。

## 基本

* 現在の速度ベクトルv1に対し
* 目的地へたどり着くような、理想の速度ベクトルv2を定義する。
* v2は、よしなに弱めておく(maxSpeedで制限)
* (v2-v1)方向に進むような力v3をaddForceするのだが、これもよしなに弱める(maxForceで制限)
* 弱めることによって、味のある動き、生きてるっぽい動きになる

https://github.com/shiffman/The-Nature-of-Code-Examples-p5.js/blob/master/chp06_agents/NOC_6_01_Seek/vehicle.js

## 到着行動

目的地に近づくにしたがってmaxSpeedを下げる
トラックボールマウスのススメ

# トラックボールマウスのススメ、はまると手放せないマウス！
本日は10数年、私が愛用しているマウスをご紹介いたします。
> パソコンを使った作業が多くて肩がこる、目が疲れる
> 自分のような左利きでもいける
> いわゆるソーシャルワーカー的な業務でストレスフル 

ココらへんを低減するのが目的

## 名称： Logicool 製Trackman Marble です。
一時期生産中止となりましたが、コアなファンが多いらしく、再生産されるようになりました。
2800円くらいでしたが、今では4000円超になって帰ってきましたが。。
![trackman-marbleOhmu.png](https://qiita-image-store.s3.amazonaws.com/0/191161/f088ba99-7733-4a7f-559b-345d7ba54c70.png)

どうですかこのデザイン。
まるでナウシカに出てくるアレみたいじゃないですかｗ？
人によっては

- ボールの部分が昆虫みたいな目にみえて怖い！
- なんか使いにくそう。。
- スクロールホイールが無いじゃん！

と思いがちですが。
使い出して慣れてしまうとこれ以外のマウスは使う気がしません！
## ストレス。マウス症候群の軽減にもなる
通常のマウスだと手首全体を動かすが、トラックボールの場合手首を固定、指のみ動かす
マウス症候群といものがあるらしく、通常のマウスのあの滑らせる動きが手首にかなり負担をかけるらしい。
手首の腱鞘炎から始まり、肩の痛み。首のこり、などなど
![trackman-marbleHand.jpg](https://qiita-image-store.s3.amazonaws.com/0/191161/b7e6ea82-6646-9a43-6513-2a2bf12f2b5f.jpeg)
> この状態から手首を動かさなくていい
- 左右対称なので左利きでもok

## ボールの部分について
ドイツかどっかのボーリングの玉を作ってる **世界にひとつしかないメーカで特注制作らしいです。**
ボールは取り出すことが可能でメンテナンスフリーになってます。
そしてずっしりと重たいのでピッっとはじくと慣性が働いて画面の端っこまで、マウスポインタがすっ飛んでくれます、Dual Displayとかだと2画面一気に端から端まで、すっ飛びます。
**世界にひとつ** て言葉に弱いあなたいかがですかW？

## スクロールホイールくるくるできないじゃん！
右クリックをしながらボールを上下にすると。ボールの回転がスクロールモードに切り替わります。
これも慣性が働いてるので、行きよいよくまわせばどんなに縦に長いページでも一気にページの下部へ飛んでくれ、行きよいよくうえにはじけばページのTOPへ戻ってくれます。よくページにある「TOPへ」ボタンなぞクリックする必要無し！
省スペース。左右対称。でマウスパッドいらず、なのでノートパソコンにもとてもいいです。
このマウスについてはまだまだ良いところがあるわけですが、私の思いを20％ほどお伝えできたかと思います。

最後に美しいフォルムを見ながら
残りの80%はまた機会があれば書こうと思います。アディオス！

![trackman-marble.png](https://qiita-image-store.s3.amazonaws.com/0/191161/36475b63-ec80-26a3-d789-10cd9f4a6e96.png)

### アマゾンで￥２８００円で売られてるようです、値下げ最高！
http://amzn.to/2w4wO3G
UnityにSQLiteを導入する

UnityにSQLiteUnityKitを導入テストしてみたのでメモしました。

**動作環境**
Unity 5.5.3p3
MacOS 10.12.6

# 準備
SQLiteを導入する際に便利だったアプリケーションを記載します。

**DB Browser for SQLite**
SQLiteのテーブルを編集、確認する事が出来ます。
コマンドが苦手な方にオススメです。
[DB Browser for SQLiteページ](http://sqlitebrowser.org/)


# SQLiteUnityKitを取得

GitHubページよりSQLiteを取得します。
[GitHub Busta117/SQLiteUnityKit](https://github.com/Busta117/SQLiteUnityKit)

<img width="349" alt="スクリーンショット 2017-09-12 10.51.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/201662/7346d03c-28dc-6ed8-d846-b043448444ce.png">

ターミナルを開いて以下のコマンドで取得

```
$ git clone https://github.com/Busta117/SQLiteUnityKit.git
```

# データベースファイル作成

ダウンロード完了後はターミナルよりデータベースファイルを作成します。
テーブル作成と値の挿入まで行います。

```
// プロジェクト内の階層に遷移
$ cd Assets/StreamingAssets/

// 好きなテーブル名でOK!
$ sqlite3 default.db
SQLite version 3.20.1 2017-08-24 16:21:36
Enter ".help" for usage hints.

// テーブル作成
sqlite> create table example (
   ...> name string,
   ...> dummy int
   ...> );

// テーブルに値を挿入
sqlite> insert into example values ("hello world", 1);

// 終了
sqlite> .q
```

# プロジェクトにフォルダ作成
取得したSQLiteを配置するフォルダを作成します。
以下はサンプルです。
<img width="148" alt="スクリーンショット 2017-09-12 11.05.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/201662/3c0666ac-f4cd-8f8b-c31d-426d9b51a69b.png">

**Android**
AndroidのPluginを入れるフォルダ

**SQLite**
Scriptsフォルダをキレイにする為にSQLite関連のファイルはここにまとめる

**StreamingAssets**
このフォルダに入れる事でアプリに直接配置されます。

# SQLiteファイルと作成したDBをフォルダに入れる
先程作成したフォルダに配置します。
以下はサンプルです。
<img width="196" alt="スクリーンショット 2017-09-12 11.13.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/201662/e656755d-d789-0e3b-0ea8-9cf9e7c4f930.png">

# スクリプトからデータベースを読み込む
次はスクリプトから作成したデータベースの値を読み込むテストをします。
データベースから値を取り出してLogを表示

```csharp:SampleDataBase.cs
using UnityEngine;
using System.Collections.Generic;

public class SampleDataBase : MonoBehaviour {

	public SqliteDatabase sqlDB;

	void Start(){
　　　　　sqlDB = new SqliteDatabase("default.db");
　　　　　string query = "SELECT * FROM example";
　　　　　var dt = sqlDB.ExecuteQuery(query);

        string name;
        int dummy;
        foreach(DataRow dr in dt.Rows){
        	name = (string)dr["name"];
        	dummy = (int)dr["dummy"];
        	Debug.Log("name:" + name.ToString());
        	Debug.Log("dummy:" + dummy);
        }
	}
}
```

ソースコードをGameObjectにアタッチして実行すると正しく値が取れました。
<img width="203" alt="スクリーンショット 2017-09-12 13.22.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/201662/d4b070b3-b281-c16c-2f4e-98b919b0d74c.png">


# データベースを直接編集しても反映されない時
実装後 DB Browser for SQLiteを使用してStreamingAssets内のデータベースを更新しましたが正しく反映出来ませんでした。
以下フォルダ付近を確認すると複製されたデータベースがあり修正または削除して再複製すると正しく反映されました。

```
/Users/user_name/Library/Application Support/company_name
```

# 参考ページ
[Quickstart for SQLite in Unity](https://bravenewmethod.com/2015/04/11/quickstart-sqlite-unity/)
[[Unity]SQLiteUnityKitに差分アップデート実装してみた](https://anz-note.tumblr.com/post/134534973711/unitysqliteunitykit%E3%81%AB%E5%B7%AE%E5%88%86%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F)
データの型（プリミティブ型・オブジェクト型）の違いについて書いてみた+連想配列

今回はAngularから離れて、私がハマった概念「データ型」について書いてみようと思います。

###「プリミティブ型」と「オブジェクト型」
データ型には「プリミティブ型」と「オブジェクト型」などが存在します。
まずは、具体的なプリミティブ型とオブジェクト型について見てみましょう。
・・・と言ったもののですが、言語によってプリミティブ型とオブジェクト型の分類が変わってきます。
自分が使用している言語で気になる方がいれば調べてみてはいかがでしょうか？
しかし、一つも挙げないのは不親切なので、JavaScriptについて書いてみると
プリミティブ型はNumber,String
オブジェクト型はオブジェクト,連想配列
などが存在します。

オブジェクト型の例が聞いたことないと思った方は記事の最後に書いていますので、ご覧下さい。

ではプリミティブ型と参照型はどのような違いがあるのでしょうか？
イメージしやすいようにオブジェクトの"Obj", Stringの"Str"を使って説明します。

###プリミティブ型について
プリミティブ型は初心者がイメージしやすい、"値"をそのまま保持します。
具体的に見てみると

```js
X = "値渡し";
Str = X;
```

Strを表示すると

```
値渡し
```

と表示されます。

###オブジェクト型について
オブジェクト型はプリミティブ型と違い、参照"場所"を保持します。
具体的に見てみると

```js
Y = {Z: "値渡し"};
Obj = Y;
```

Obj.Zを表示すると

```
値渡し
```

と表示されます。
ここまではプリミティブと同じです、
しかし

```js
Y = {Z: "値渡し"};
Obj = Y;
Y = {Z: "値変更"};
```

と"Obj"に代入した後に参照先であるY内の値を変更したらどうなるでしょう。
実際にObj.Zを表示すると

```
値変更
```

と表示されるはずです。
この、オブジェクト型は参照元の値が変更されると同時に参照先の値を変更されるのが特徴と言えます。

###オブジェクト型の注意点
では参照型でプリミティブ型のように使用したい場合（元の値を変更する）の解決策ですが
コピーしてしまえば解決です。Angularでは

```js
angular.copy(参照したい変数)
```

と記述すれば参照元の値が変更されても元の値を保持してくれます。

###オブジェクト,連想配列について
初心者の方はオブジェクトや、連想配列についてあまり聞き覚えがないと思いいます。（または、ワード自体は知らないが使っていた）
オブジェクトは実際にコードを書いてみると

```js
{}
```

で書かれているコードです。
連想配列は実際にコードを書いてみると

```js
{"変数": "値"}
```

で書かれているコードです。
※連想配列はオブジェクトの一部ですが、頻繁に使用するので例として挙げています。
連想配列が使いこなせるとより複雑なデータを操作することが可能になりますので、知らなかった方はマスターしましょう。
同一ハードウェアでS2DとSANsymphonyを比較してみた

同一ハードウェアを使ってWindows 2016のS2DとDataCore SANsymphonyを比較してみた。

今回もお手軽に"C:\ClusterStorage\Volume1"のフォルダに対してCrystalDiskMark5.2.2をとってみました。

- サイズ8GB、キュー32、スレッド1
 - 左SANsymphony　右（もしくは下）S2D

![image.png](https://qiita-image-store.s3.amazonaws.com/0/115778/0d708f54-9bf7-f028-6e4b-97fc05032d27.png) ![image.png](https://qiita-image-store.s3.amazonaws.com/0/115778/fbeea467-a6d1-c3e2-b840-71e2aaada123.png)

- サイズ8GB、キュー32、スレッド16

 - 左SANsymphony　右（もしくは下）S2D


![image.png](https://qiita-image-store.s3.amazonaws.com/0/115778/f0ab0078-1041-76ee-9262-5ffbea47b532.png) ![image.png](https://qiita-image-store.s3.amazonaws.com/0/115778/64caba22-dfc0-38bf-9b67-e8a0e4377447.png)

S2Dはシーケンシャルライトだけやたら速い、これがRDMAのちからか！

あまり差がないので、お約束のレジストリをファインチューンしました。
（デフォルトだと小さすぎるライトキャッシュを増やしました。）

- サイズ8GB、キュー32、スレッド1

![image.png](https://qiita-image-store.s3.amazonaws.com/0/115778/08e45020-09c7-5169-d275-6416990122cf.png)

- サイズ8GB、キュー32、スレッド16

![image.png](https://qiita-image-store.s3.amazonaws.com/0/115778/cb1dd770-1ca4-505d-55dd-6502930720ca.png)

本領発揮！ライト性能が劇的に改善されましたね。

さて次はミラーポートを25Gb Ethernetから32Gb Fibre Channelに変更して性能を見てみます。

- サイズ8GB、キュー32、スレッド16

![image.png](https://qiita-image-store.s3.amazonaws.com/0/115778/87cf196e-afc5-a805-1a4f-fa5777ccd894.png)


圧倒的じゃないか！！！イーサネットだとライトはリードの約半分くらいまでしか出ませんでしたが、70～80%は出るようになりました。シーケンシャル性能は13倍に向上！
RDMAを使ったS2Dも目じゃない。

- サイズ8GB、キュー32、スレッド1


![image.png](https://qiita-image-store.s3.amazonaws.com/0/115778/671e3f5d-c54e-3277-dbc1-db7b9415e0c1.png)

なぜかライトがリードを上回ってしまいました。平均のマジックだと思います。
速いことはよーくわかったので次はiometerで見てみたいと思います。

追記：　SANsymphonyのベンチマークは、片方のサーバがバックグラウンド初期化してる最中にベンチマークをとっていました。しかも、1台はSSDが3本しか追加できていませんでした…
次回は万全の状態でもう一度取得して比較してみます。

今日はここまで。

もうちょっと追記：データコアのCSVでCSVキャッシュを有効にすると性能がかなりさがった。メモリが無駄になるだけなので組み合わせないほうが良さそう。
CSSではみ出したテキストを「...」で省略

テーブルで長いテキストが入っている列が横長になってしまい
大変見栄えが悪くて困っていたら、
cssだけで簡単にできました。

下のプロパティを使います。

```
text-overflow: ellipsis;
white-space: nowrap;
```

例えば、セル幅の最大幅を300pxと決めて、それ以上になる文字列は省略する場合、

```
table td {
    max-width: 300px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
```

色々と応用できそうですね。

（参考）
[CSSのtext-overflowではみ出したテキストを「…」表示](http://webdev.jp.net/css-text-overflow-ellipsis/)
15秒でわかるLet's Encryptのしくみ～無料で複数ドメイン有効な証明書作成～

# 概要
medium( https://medium.com/ )というブログは自分のドメインを付与したら、
無料で且つ自動でSSL証明書を取得しブログに付けてくれる。
使われているのはLet's Encryptというサービス。
無料でSSL証明書が取得できるサービスである。

Let's Encryptの特徴として、
SSL証明書の有効期限が約3ヶ月と極端に短い。
その為、cronで定期的にLet's Encryptを更新する手順を盛り込み、
自動で半永久的に更新させるのが定番である。

# 15秒でわかるLet's Encryptのしくみ

1) DNSサーバにAレコードを登録する

![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/75761/5e5005c4-be0e-04a2-beee-d819b730f4ed.jpeg)

---------------------------------------
2) 証明書作成プログラムを実行する
![2.JPG](https://qiita-image-store.s3.amazonaws.com/0/75761/cca80ed3-f5d0-76e0-121a-8e21ccdca130.jpeg)

---------------------------------------
3) CAはDNSサーバへAレコードを問い合わせる
![3.JPG](https://qiita-image-store.s3.amazonaws.com/0/75761/dea73c86-3f2b-d9a0-495c-e84a0c51f813.jpeg)

---------------------------------------
4) CAがクライアントのファイルを確認
![4.JPG](https://qiita-image-store.s3.amazonaws.com/0/75761/5250d1ab-ea5b-2e5c-a8e2-2865bbc6c819.jpeg)

---------------------------------------
5) 証明書の作成
![5.JPG](https://qiita-image-store.s3.amazonaws.com/0/75761/0e99b984-94dc-276c-9f27-702de70a7fda.jpeg)

# 導入手順
複数ドメインを作成したい場合を考慮し、複数まとめて作成する手順。
（CentOS 7 を想定）

```
tsukada.test.jp
sumito.test.jp
coco.test.jp
```

の3ドメインを1枚の証明書に入れる手順。
（1ドメインの証明書だけ作りたいのであれば、単純に対象を削ればOK。）

``` code
cd /usr/local/src
git clone https://github.com/certbot/certbot
cd certbot/
./certbot-auto certonly --no-self-upgrade -n --webroot --agree-tos --email webadmin@test.jp -w /var/www/html -d tsukada.test.jp -d sumito.test.jp -d coco.test.jp --expand
```

# cronに登録

``` code
# crontab -l
0 1 1 * * /usr/local/src/certbot/certbot-auto renew --force-renew && service httpd restart
```

# まとめ

無料で利用できる為、「そもそもSSL証明書って何を証明するんだっけ？」という議論になりかねない。
Let's Encryptを使った証明書はエラーにはならないものの、
証明書の中身をエンジニアが見ればLet's Encryptで作ったものだとすぐに分かる。

サービスで使う場合は、従来通り有料で購入した方がよいが、
社内で使うサービスであれば、Let's Encryptで十分な場合も多い。
なによりcronに組み込む事により更新が自動というのも非常に心強い。

昔はテスト用のSSL証明書を作るのに、
自らが認証局となり自分自身を証明する通称「オレオレ証明書」が一般的だったが、かなり便利な時代になった。
Google Chromeによる、Symantec証明書の無効化スケジュールについて

Symantecによる証明書の管理不行き届き問題ですが、Symantecが証明書部門のDigiCertへの売却を決めたこともあって少しスケジュールも変わって、[Google Chromeでの取扱](https://security.googleblog.com/2017/09/chromes-plan-to-distrust-symantec.html)が発表されていました。ややこしいので、（自分の理解用も含めて）要約しておきます。

# 対象となる証明書

Symantecグループ（Nortonだけでなく、GeoTrust、Thawte、RapidSSL、Equifaxなど）の、現在有効なもの・**これから暫くの間発行されるものを含めた**全証明書です（以下でいちいち言うのも面倒なので、「シマンテック」で代表します）。

もちろん、Let's Encrypt、Comodo、GlobalSign、セコムなど、Symantecと無関係な認証局から発行された証明書には、何の影響もありません。

# タイムスケジュール
タイムスケジュールは「この日」と決まっているわけではないのが、またややこしいところです。

## SymantecからDigiCertへの事業譲渡の日（2017/12/1以前）

古いSymantecのCAから、この事業譲渡以降に発行された証明書は、Google Chromeを通らなくなります。現実にそのような証明書が発行されるとも思えませんし、事業譲渡前に発行された証明書には**この時点での影響はありません**。

## Google Chrome 66（一般リリースは2018年4月中旬の予定）

2016年6月1日以前にシマンテックから発行された証明書が、Google Chromeを通らなくなります。もちろん、事業譲渡後のものは影響を受けません。

## Google Chrome 70（一般リリースは2018年10月下旬の予定）

シマンテックから発行されたすべての証明書が、Google Chromeを通らなくなります。

# 取るべき対策

まずは、現在使っている証明書の発行日と期限を確認しましょう。

## 2017年12月までに切れる証明書の場合

実は、この場合がいちばん厄介で、事業譲渡前にSymantecの証明書を継続してしまうと、Google Chrome 70までに証明書の再発行が必要となりますし、新しい証明書も期限は13ヶ月となります。可能なら別なブランドに乗り換えてしまったほうがいいかもしれません。

## 事業譲渡後、証明書の期限より先に無効化されてしまう場合

具体的には、

* 2016年6月1日以前の発行で、2018年4月以降も有効期限が残っているもの
* 2016年6月1日以降の発行で、2018年10月以降も有効期限が残っているもの

この場合、DigiCertへの事業譲渡を待って、それから新システムで証明書を再発行してもらうことで、期限まで使うことができます。

## 事業譲渡後、証明書の期限が先に切れる場合

この場合は「ただ証明書が切れる場合」と同じで、更新してください。新システムで更新した証明書はこの措置の対象外です。
Power BI でサバイバル分析

R のプラグインをPower BIに導入するのは簡単です。Power BIにはない、Rでのデータ処理や可視化をインスタントに組み入れることができます。

# R Script Visualの作成

VisualのなかにRスクリプトヴィジュアルというものがあるので、それを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/96981cb3-f097-60d3-14e7-6aa341f52460.png)

初めに値をいくつか入れておきます。すると以下のようなインターフェイスのエディタが現れます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/1dca8b60-b7cf-4e79-077f-a9b13aa6cf53.png)

dataset という名前の変数に、関連付けられたデータがdata.frameに割り当てられます。
そこから先は、普通にRのコードを書くだけです。

# サバイバル分析をPowerBIでやる

Power BIのフォーラムにほぼ答えが書いてありましたので、マネをしてみます。
[Survival Analysis with PowerBI and R](http://community.powerbi.com/t5/Desktop/Survival-Analysis-with-PowerBI-and-R/td-p/136273)

```R
library(survival)
fit=survfit(Surv(time, status)~disease, data=dataset)
labels <- levels(factor(dataset$disease))
n <- length(labels)
cols <- 1:n
ltys <- 1:n
plot(fit, xlab="time", ylab="Survival Probability", col.lab="gray", pch="1", lwd="2", col=cols, lty = ltys, tck=0,bty = "n", yaxt = "n") 
abline(h=seq(0.2,0.8,0.2), col="gray")
legend("topright",  legend = labels, col=cols, lty = ltys) 
```

データはRにある[kidney](https://www.rdocumentation.org/packages/KMsurv/versions/0.1-5/topics/kidney)という、腎臓の感染症の臨床データをPower BIに取り込んで使いました。

生データのプロットとともに表示してみました。疾病ごとの比較になりますがこれだとあまり違いがわかりませんね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/977f422d-d78b-b645-4d62-bda9f8eee6ea.png)
docker・Rails・MySQLを使った時に出たUnknown MySQL server host 'localhost'

[この記事](http://qiita.com/togana/items/30b22fc39fe6f7a188ec)を進めていた時に発生したトラブルの解決メモ

# 問題
記事ではdocker-compose.ymlでmysqlのサービス名を「mysql」としていたが、個人的には「database」にしたかったのでdatabaseに変更したら

![40f4d7b1ed8e76c03f15b367e6a9f887.png](https://qiita-image-store.s3.amazonaws.com/0/135639/3e36a4ce-5541-ec1e-04d3-2e6726895764.png)


が出るようになった。

# 解決法
docker-compose.ymlでappのlinksで指定するサービス名の後ろに`:mysql`をつける

```
  links:
      - database

        　↓

  links:
      - database:mysql