OmniAICreator/Qiita-1.07M huggingface dataset:
さくらのクラウド スタートアップスクリプトでのベストプラクティス(motdで通知編)

先日さくらのクラウドにLet's encryptスタートアップスクリプトが追加されました。

[さくらのクラウド スタートアップスクリプト「Let's Encrypt」の提供開始のお知らせ](https://www.sakura.ad.jp/news/sakurainfo/newsentry.php?id=1759)

このスクリプトの内容を眺めていたところ、ユーザーへの通知について`motd`を使ってうまく処理していました。
スタートアップスクリプトを作る上でベストプラクティスといっても良いうまいやり方だったのでここにまとめておきます。

## さくらのクラウドでのスタートアップスクリプトとは？

さくらのクラウドではスタートアップスクリプトと呼ばれる、サーバ起動時に実行させたいスクリプトを登録する仕組みが用意されています。

スタートアップスクリプトの動作の詳細は以下のドキュメントにまとめられています。

[さくらのクラウド マニュアル: スタートアップスクリプトとは](https://manual.sakura.ad.jp/cloud/startup-script/about.html)

大まかな流れは以下の通りです。

- 実行したいスクリプトをあらかじめさくらのクラウドのコントロールパネルから登録しておく
- サーバ作成時に登録していたスタートアップスクリプトを実行するように指定する
- 指定したスクリプトは`/etc/rc.local`経由で起動される
- ログは`/root/.sacloud-api/notes/スタートアップスクリプトID.log`に出力されている
- 実行完了すると`/root/.sacloud-api/notes/スタートアップスクリプトID.done`ファイルが作成される

## 問題：スクリプトが実行中なのか調べるのが面倒

スクリプトの処理がすぐに終わるものであれば問題ないのですが、中には実行に長時間必要なスクリプトもあります。
サーバの作成が完了しSSH接続できる段階になっても裏でスクリプトが実行中ということもあります。

実行完了を知る仕組みとしてスクリプトの処理が終わったらメールを飛ばすといった方法もあるのですが、いちいちスクリプトにメール送信処理を組み込むのも面倒です。

もちろんスクリプトの実行ログを参照すれば良いのですが、ログがちょっとわかりにくい場所にあるため、慣れている人でないとログの場所がわからないということもありました。

## 解決方法: motdを使ってログイン時に通知する

それを解決してくれるのが今回紹介するmotdを用いる方法です。

### motdとは

motdとは`Message Of The Day`の略で、`/etc/motd`ファイルに記載された内容をログイン後に表示してくれるという仕組みです。
(なお、`/etc/issue`というログイン前に通知してくれる仕組みもあります)

スタートアップスクリプト実行開始時に`/etc/motd`に処理中である旨を記載しておき、処理が完了したら削除するという形にすれば、SSH接続時点でまだ処理中であるか知ることができます。

## Let's encryptスタートアップスクリプトでのmotd処理方法

Let's encryptスタートアップスクリプトでは以下のような関数でmotdの処理を行っています。

```bash
_motd() {
 LOG=$(ls /root/.sacloud-api/notes/*log)
 case $1 in
  start)
   echo -e "\n#-- Startup-script is \\033[0;32mrunning\\033[0;39m. --#\n\nPlease check the log file: ${LOG}\n" > /etc/motd
  ;;
  fail)
   echo -e "\n#-- Startup-script \\033[0;31mfailed\\033[0;39m. --#\n\nPlease check the log file: ${LOG}\n" > /etc/motd
   exit 1
  ;;
  end)
   cp -f /dev/null /etc/motd
  ;;
 esac
}
```

`_motd`関数に`start`/`fail`/`end`のいづれかを引数で指定することで処理を切り替えていますね。
処理内容としては単純に`/etc/motd`にメッセージを書き込む or `/etc/motd`を空にするとなっています。

`echo`でゴチャゴチャして見えるのは色つけのためのエスケープシーケンスです。

あとはこれをスクリプトの各所から呼び出すだけでOKです。

```bash
# 開始時
_motd start

# エラー発生時
_motd fail

# 終了時
_motd end
```

### 実行例(実行中)

![running.png](https://qiita-image-store.s3.amazonaws.com/0/20668/f03bd554-eea5-2183-6f0c-61fbb059d451.png)

### 実行例(失敗時)

![failed.png](https://qiita-image-store.s3.amazonaws.com/0/20668/94bacfd9-8767-8dc8-3417-4eec649574e8.png)

## まとめ

motdをうまく使えばスタートアップスクリプトの実行中の通知を手軽に処理できますね。
SSHで接続できているし一見うまくいってそう、、だけど実はスタートアップスクリプトを実行中だったという状況は結構頻繁に見かけるので、この方法を用いればその辺りシンプルに解決できそうです。

非常に短いスクリプト(関数)で対応できるので是非スタートアップスクリプト作成の際はこの方法を組み込んでみてはいかがでしょうか？

以上です。
不必要な機能の削除手順

プロダクトを進めていく上で余分に作ってしまったカラムやテーブルの削除の手順についての備忘録

# 不必要なカラムを消す場合
## 最初にやったこと
view周りで不必要なところは削除
齟齬が起きないようにparametarやcontorller周りの削除
テスト用のファイルに書いてある該当箇所も同時に削除
マイグレーションファイルを作成して該当箇所を削除

# 不必要な昨日(テーブル)を消す場合
それに紐付くcontrollerの削除->view周りも一気に綺麗になる
rputesの削除
それ繋がっているリンクの削除
3.関連ファイルの削除

以下の関連ファイルを手動でDeleteしましょう。

例)Userモデルを削除する場合

modelファイルの削除

app/models/user.rb

testファイルの削除

test/models/user_test.rb

fixturesファイルの削除

test/fixtures/users.yml
vagrantが立ち上がらない！

vagrantをhaltせずにWindowsの電源落とすとこういう状態になるらしい・・・。

C:\project\vm>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
Your VM has become "inaccessible." Unfortunately, this is a critical error
with VirtualBox that Vagrant can not cleanly recover from. Please open VirtualBox
and clear out your inaccessible virtual machines or find a way to fixthem.

![20171010_2.png](https://qiita-image-store.s3.amazonaws.com/0/188508/82e5aec0-946a-d59b-89e7-ad838a3e8eff.png)

C:\project\vm>vagrant status
Current machine states:

default                   inaccessible (virtualbox)

The VM is inaccessible! This is a rare case which means that VirtualBox
can't find your VM configuration. This usually happens when upgrading
VirtualBox, moving to a new computer, etc. Please consult VirtualBox
for how to handle this issue.

![20171010_3.png](https://qiita-image-store.s3.amazonaws.com/0/188508/94a092c4-a5f6-8c4d-4c3f-09d4186994d3.png)

C:Users{ユーザ名}VirtualBox VMs{vm名}の中に入っている、
{vm名}.vbox-tmpの拡張子を{vm名}.vbox
と書き換えましょう。

![20171010_4.png](https://qiita-image-store.s3.amazonaws.com/0/188508/bddc220e-430f-19c3-84c1-b48486f715ad.png)
↓
![20171010_5.png](https://qiita-image-store.s3.amazonaws.com/0/188508/b40e9162-0219-6849-a261-873b8281d3f0.png)

これで再度vagrant upすると正常に立ち上がります。
Xcode9、fastlaneでアプリを配信するときにエラーになるときに試すこと

Xcode9が正式版になって、アップデートしたらfastlaneで上手く配信できなくなった！というときに試す設定を書き残しておきます。

## No profiles for 〜 というエラーになる

下記のように `No profiles for`のようなエラーになる場合、

```
2017-09-05 10:18:42.249 xcodebuild[86003:39884346] [MT] IDEDistribution: Step failed: <IDEDistributionSigningAssetsStep: 0x7fc0436f3bd0>: Error Domain=IDEDistributionSigningAssetStepErrorDomain Code=0 "Locating signing assets failed." UserInfo={NSLocalizedDescription=Locating signing assets failed., IDEDistributionSigningAssetStepUnderlyingErrors=(
"Error Domain=IDEProfileLocatorErrorDomain Code=1 "No profiles for 'com.***.id' were found" UserInfo={NSLocalizedDescription=No profiles for 'com.***.id' were found, NSLocalizedRecoverySuggestion=Xcode couldn't find any iOS App Store provisioning profiles matching 'com.***.id'. Automatic signing is disabled and unable to generate a profile. To enable automatic signing, pass -allowProvisioningUpdates to xcodebuild.}"
)}
error: exportArchive: No profiles for 'com.***.id' were found
```

fastlaneのgymのoptionに下記を追加してみましょう。

```rb:Fastfile
export_xcargs: "-allowProvisioningUpdates"
```

## Segmentation fault: 11 のようなエラーになる

gymのoptionに下記を追加してみましょう

```rb:Fastfile
export_options: { compileBitcode: false }
```

まとめると、上記２つを追加したgymのoptionは下記のようになります。

```rb:Fastfile
    gym(
      scheme: "appscheme",
      export_method: "ad-hoc",
      export_xcargs: "-allowProvisioningUpdates",
      export_options: { compileBitcode: false }
    )
```

## Xcodeを別のディレクトリにインストールしている

旧バージョンのXcodeを残すために、別のディレクトリにXcode9をインストールしている場合は、下記のように環境変数を変更しておきます。

```rb:Fastfile
  before_all do
    ENV['DEVELOPER_DIR'] = '/Applications/Xcode9.app/Contents/Developer'
    carthage(cache_builds: true)
  end
```

## 参考

- https://github.com/fastlane/fastlane/issues/10251
- https://github.com/fastlane/fastlane/issues/10133
ESP32_ARDUINOでSPIFFS

ESP32_ARDUINOで、以前からSPIFFSで内部フラッシュが使えないという問題が最近ようやく解決したという記事を見かけるようになって、私もGithubから最新のライブラリをもらってきてやってみていたのですが、

mount failed，－10025

というエラーが出て、先に進まないのでずっと悩んでいました。
これは次のようにすると解決しました。

誤）
SPIFFS.begin();

正）
SPIFFS.begin(true);

2017/10/11
初投稿(^-^)
メモ3

# はじめに
[メモ](https://qiita.com/mippai_prpr/items/9fa102aa7ac18330ff09 "メモ")のつづき。例によって[EasyImagy](https://github.com/koher/EasyImagy "EasyImagy")を使う。

# 環境
>Mac Book Air
MAC OSX 10.13 High Sierra
Xcode 9.0
Swift 4

# UIImageとNSImage
[サンプルコード](https://github.com/koher/EasyImagy#easyimagy "easyimagy")をコピペ。inputViewは`NSImageView`。
![スクリーンショット 2017-10-11 8.44.42.png](https://qiita-image-store.s3.amazonaws.com/0/129820/c5906b62-32fb-595b-54b0-0f5f094eec2d.png)
uiImageがない、とエラー。

iOSでは`UIImage`、MacOSでは`NSImage`だそうな。`CGImage`、`CIImage`ってのもあるらしい。
![スクリーンショット 2017-10-11 9.33.14.png](https://qiita-image-store.s3.amazonaws.com/0/129820/6426c378-9760-26d1-9791-e3b7fe8c5d8a.png)

どっちか統一してほしい。
おわり
iOSアップデートの通知について

イベントなどでのiPad/iPhoneの使用時に、iOSアップデートのアラートを表示しないように出来ないか、Appleサポートに問い合わせをしてみました。

#通知の流れ

ネットワークに接続されていると、自動的に1-3が行われる。

1. アップデートがあることをデバイスが検知
2. デバイス内にアップデートデータをダウンロード
3. アップデートを勧めるアラートの表示

#タイミングについて
##iOSがアップデートされるタイミング
事前の案内を行なっていない。

##デバイスがアップデートデータをダウンロードするタイミング
ソフトウェア自体の修正、セキュリティ強化などを含めているため、事前の告知ではなく、リリースされ次第の通知。
デバイス内にアップデートのデータがダウンロードされていると、アップデート通知表示が出るようになる。
アップデートのデータを削除した場合（下記 ネットワークに繋がない場合の対処法参照）でも、再ダウンロードにどの程度期間が開くかかについては決まった条件などはない。

##アップデートアラートが表示されるタイミング
ネットワーク通信接続がされている状態以外には特に決まった条件などはない。
特に何回通知、表示を行うといった条件もない。
Appleのサーバーにてリリースを開始次第順次ネットワーク通信接続が行われている各デバイスへ通知の送信を行われる。

#アップデートアラートを表示しない方法
##ネットワークに繋がない場合
ネットワーク接続を行なっていない状態（Wi-Fi　OFF /機内モードONなど）にし、設定＞一般＞ストレージとiCloudの使用状況からストレージを管理を選択。
iOS10（ソフトウェアのバージョンの名前）があった場合には削除する。

##ネットワークに繋ぐ場合
###アクセスガイドをONにする（iPadの場合）
参考)
[iPhone や iPad のタッチ有効範囲を制限する方法 (アクセスガイドの使い方](https://voice4uaac.com/ja/2016/12/how-to-use-access-guide-ios/)


###ルーターのファイアーウォールで制限
IPアドレスについては公開していない。
ポートについては以下のページに記載の情報のみ公開。

参考)
[Apple ソフトウェア製品で使われている TCP および UDP ポート](https://support.apple.com/ja-jp/HT202944)
[macOS、iOS、iTunes のサーバホスト接続と iTunes のバックグラウンドプロセスについて](https://support.apple.com/ja-jp/HT201999)

アップデート＝ソフトウェアアップデートなので、80/443などを締める。
メールについては提供元によってポートの設定が異なるため、Apple側では明確なポート番号はわからない。
俺のPCにJDK9のインストールするのメンドイけど、とりあえずJShellを試したいんだが

※Dockerがインストールされてる前提

# How to use

というわけで、とりあえず .bashrc やら .zshrc やらにこんな感じで、alias設定

```zsh:.zshrc
alias jshell='docker run -it --rm java:9-jdk jshell'
```

あとはウィンドウを開き直すなり、sourceコマンドで読み直すなりして

```zsh
jshell
```

以上。
Ruby で現在実行しているスクリプトのディレクトリパスを取得する

`__dir__` を使うことで取得できます。(2.0 から使用出来ます)

```rb
p __dir__
```

`__FILE__` と `File.expand_path` を組み合わせたパターンを見かけますが `__dir__` のほうがより簡潔に書けます。

```rb
# 結果は一緒
p File.expand_path("..", __FILE__)
p __dir__
```

## 参考サイト

https://docs.ruby-lang.org/ja/latest/method/Kernel/m/__dir__.html
最終変更日時がある日付以前のディレクトリを一括で削除するワンライナー

# はじめに
とあるディレクトリ内のサブディレクトリの最終変更日時を基に、ある期間中身に変更がないサブディレクトリだけを中身ごと削除するワンライナー。

# 記述例
例えば、煩雑になるのを防ぐためにログディレクトリ（ここでは /xxx/yyy/logdir とする）の直下に、日付ごとにサブディレクトリ（/xxx/yyy/logdir/yyyyMMdd という風に ）を切って、その日のログとか色々格納しているディレクトリがあるとします。
ただ、そのままにしておくとどんどんとディスク容量を食っていくので、2週間経ったらそのディレクトリをファイルごと削除したい場合なんかは以下のように書く。

```shell-session:rm.sh
/usr/bin/find /xxx/yyy/logdir -maxdepth 1 -type d -mtime +14 | /usr/bin/xargs /bin/rm -rf
```

typeオプションの値をd、maxdepthオプションの値を1に、それぞれ指定しておくことで、カレントディレクトリ直下のサブディレクトリのみをfindの対象とします。

こないだ投稿した [クラスタ構成下で共有ディレクトリ上のログファイルをローテートする](https://qiita.com/real_yaruo/items/9782e74998c697489349) 記事ではexecコマンドを使ってfindコマンドの結果を渡してrmしていましたが、xargsを使った方が早いようですので、今回はそっちで書いてます。
（findのdeleteオプションが使えるならそれが一番簡潔に書けそうですが）

# おわりに
mtimeをキーにすると、touchコマンドとかでディレクトリの変更日付を変えることが出来ちゃうので、100%期待した通りの動作になるとは限らないのですが、デイリーとかウイークリーで定常的に作成されるファイルに対してはまずこの手で行けるのではないかと思います。
【翻訳】ActiveRecordのトランザクションとコネクション

Ruby学習の一環として、週に1度Ruby関連のブログ記事(英語)を翻訳しています。
今回はActiveRecordのtransactionに関する話。

原文：[Transactions & Connections in ActiveRecord](https://medium.com/@apneadiving/transactions-connections-in-activerecord-8b55bd9cd81b)

↓以下本文↓

----------------
ApplicationRecordを継承するクラスは全てデータベースとのやりとりができるということは、おそらくご存知だと思います。それってどういうことなんでしょう？モデルはみな均等(equivalent)なのでしょうか？


以下の2つの違いは何でしょうか？

```ruby
ApplicationRecord.transaction do
  user.save!
  post.save!
end
---
User.transaction do
  Post.transaction do
    user.save!
    post.save!
  end
end
```

答えは……まあもちろん、場合によりけりですよね。

正確にはデータベースとのコネクションによります。それぞれのモデルが各々データベースとのコネクションを持つ場合があります。`User.connection`,や`Post.connection`で簡単に確認できます。
シンプルに、一つのモデルに対して一つのデータベースしかない場合は、モデルはみな均等(equivalent)ということになります。

しかし例えば`apartment`などのgemを使って複数のデータベースにまたがっていたり`excluded_model`を持っている場合は、話は全然違います。特に`excluded_models`は他のモデルたちとは異なるコネクションをもつことになります。その結果…

- それぞれのコネクションの中で処理がなされるので、上記のコードの1つ目は機能しない
- トランザクションは複数コネクションにまたがることができないため、2つ目の処理をしなければなくなる

要するに、モデルとデータベースが1対1で対応しているケースであれば、```ApplicationRecord.transaction```は問題なく使える、ということです。


------------------------------
↑本文ここまで↑


自分用メモ：

```
    # 確かApplicationRecordクラスにあった説明文…
    # -----------------------------------------------------
    # So basically you should use transaction blocks whenever you
    # have a number of statements that must be executed together or not at all.
    # 複数の処理を1つのトランザクション内に納めたい場合、transactionメソッドを使う
    #
    # For example:
    #
    #   ActiveRecord::Base.transaction do
    #     david.withdrawal(100)
    #     mary.deposit(100)
    #   end
```

transactionメソッドはクラス : テーブルが1:1であることを前提にしている。
ROSのインストール

下記のサイトの手順に沿って実行。
[Ubuntu install of ROS Kinetic](http://wiki.ros.org/kinetic/Installation/Ubuntu)

今回はDesktop-Full Installを実行。
コンソールの入力も特に変えるところはなく、そのまま実行。
警告も出ることなくインストールは完了。

チュートリアル、英語ではあるけれど分かりやすく書かれていてありがたい。

その後、下記サイトのチュートリアルを読んでROSのいろはを学ぶ予定。
[ROS Tutorials](http://wiki.ros.org/ROS/Tutorials)
Beginner Levelから見ていきます。
【翻訳】Rubyのブロックはスコープに注意！

Ruby学習の一環として、週に1度Ruby関連のブログ記事(英語)を翻訳しています。
今回はRubyのブロックのスコープに関する話。

原文：[Watch out for Ruby blocks scope gotcha](https://medium.com/@apneadiving/watch-out-for-ruby-blocks-scope-gotcha-7f6850b8ba5e)

↓以下本文↓

---------------------------------------------------------

Ruby使っているとブロックって便利ですよね。Rubyの柔軟性とパワーはブロックに依るところも大きいです。

ブロックには独自のスコープがあって、クロージャを作るのにも使えます。

これに関連して最近、バグに遭遇しました。その時のコードはだいたいこんな感じ。

```ruby
def update
  availability.update(availability_params)
  metrics_tracker = MetricsTracker.build_for(activity)
  metrics_tracker.save

  if metrics_tracker.trigger_notification?
    # send email to admin
  end
  # rendering code
end

# code omitted...

def metrics_trakcer
  @metrics_tracker ||= MetricsTracker.new(current_user)
end
```

まず、DBトランザクションが抜けているということでバグ発生。なので以下のように追記しました。

```ruby
def update
  ApplicationRecord.transaction do # <= ここにトランザクションを追加
    availability.update!(availability_params)
    metrics_tracker = MetricsTracker.build_for(activity)
    metrics_tracker.save!
  end

  if metrics_tracker.trigger_notification?
    # send email to admin
  end
  # rendering code
end
```

しかし、するとadminへのメールが送信されなくなりました……なんで？
ひとまず、トランザクションの箇所を見てみましょう。

```ruby
ApplicationRecord.transaction do
  availability.update!(availability_params)
  metrics_tracker = MetricsTracker.build_for(activity)
  metrics_tracker.save!
end
```

`metrics_tracker`はブロックの中で定義しています。ここでの`metrics_tracker`はローカル変数で、スコープがブロックの中だけになっています。つまり、ブロック外では、`metrics_tracker`は定義されていないことになってしまいました。結果として、コントローラで定義された`metrics_tracker`メソッドが呼び出されて、`availability`については何も知らない新しいオブジェクトが返り値となり、`trigger_notification?`に`false`を返してしまっています。

　・・・

もちろん、ローカル変数とメソッド名に同じ名前を使ったのがそもそもの間違いなんですが…
でもまあ、レガシーコードを引き継いで、それでなんとかしなきゃならなくなったとしましょう。

結論、応急処置的にはこういう書き方になりますね。

```ruby
def update
  ApplicationRecord.transaction do
    availability.update!(availabiity_params)
    @metrics_tracker = MetricsTracker.builde_for(activity) # <= ここを修正！
    metrics_tracker.save!
  end

  if metrics_tracker.trigger_notification?
    # send email to admin
  end
  # rendering code
end

# code omitted...

def metrics_tracker
  @metrics_tracker ||= MetricsTracker.new(current_user)
end
```

ブロックでは扱うオブジェクトを切り替えることができるので、ここではインスタンス変数で区別してみました。こう書けば、`metrics_tracker`メソッドはメモ化効果で期待通りの値を返してくれるというわけです。

要するに、ブロックを使うことはオブジェクトを分離するに等しいので、オブジェクトを利用することはできるけどもローカル変数はローカルなままになってしまう、ということです。
FlashBuilder4.7-Firefoxでデバッグする（Windows）

#流れ
- 1.FirefoxにFlash Player Debuggerをインストール
- 2.FirefoxでFlash Playerを設定
- 3.FlashBuilder4.7でブラウザの設定
- 参考サイト

#1.FirefoxにFlash Player Debuggerをインストール
最初に以下のサイトから、Flash Player Debuggerをダウンロード、インストールします。
[Flash Player Debugger](https://www.adobe.com/support/flashplayer/debug_downloads.html)
Windowsの項目の*Download the Flash Player content debugger for Firefox - NPAPI*をダウンロード
#2.FirefoxでFlash Playerを設定
- アドレスバーに`about:config`と入力。
- 動作保証対象外です、という画面が出ますが、`危険性を承知の上で使用する`をクリック（ここから先は自己責任です）。
- 検索窓から`plug*ht`と入力。
- `plugins.http_https_only`という設定名があるので、その値が`true`の場合、設定名をダブルクリックして`false`に変更。

#3.FlashBuilder4.7でブラウザの設定
- FlashBuilder4.7を起動
- `ウィンドウ`メニューから`設定`を選択
- 検索窓から`ブラウザ`と入力
- 一般の中に`Webブラウザ`をクリック
- 外部Webブラウザリストの`Firefox`にチェックを入れてOKをクリック
- ※もしリストにFirefoxがない場合は、`新規`をクリックして設定
- 　例：名前：`Firefox`、ロケーション：`C:\Program Files (x86)\Mozilla Firefox\firefox.exe`、パラメータ：*空*


#参考サイト
[stack overflow](https://stackoverflow.com/questions/45674766/debug-flash-with-firefox-flashbuilder-4-7)
【勉強メモ】アソシエーションできるようにする！【挫折しない！】

##０．アソシエーションができたらSNSがつくれる
今回は「テーブル同士を関連づけさせる」ためにアソシエーションをマスターしたい。
これができたら、とりあえずrailsでSNS的なものがつくれる！！…って思っている。


##１．モデルを作成する。
今回は参考ページをもとに、「お城」と「城主」の関係でアソシエーションをつくりたい。お城を「castle」で、城主を「owner」でつくりたい。
1対多の関係。ownerが1で、castleが多。

###まずはownerテーブルをつくる

```
$ rails g model owner name:string
```

これでnameカラムが入ったownerテーブルがつくれた。

###次にcastleテーブル
ownerと紐付けさせるために、owner_idのカラムをつくる。

```
$ rails g model castle castle:sting owner_id:integer
```

###データベースに反映

```
$ rails db:migrate
```

いつものやつ。

##３．railsコンソールでデータを追加。
###railsコンソールを起動

```
$rails c
```

###まずは、ownerを追加する。
上から順番に「徳川家康」「豊臣秀吉」「織田信長」って追加する。

```
$ Owner.create(name:"徳川家康")
$ Owner.create(name:"豊臣秀吉")
$ Owner.create(name:"織田信長")
```

``Owner.all``で確認。owner_idとしては、徳川家康が1、豊臣秀吉が2、織田信長が3で登録された。

<img width="1280" alt="スクリーンショット 2017-10-11 07.08.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/205578/8dbc963b-e628-6544-d233-693fe8a53e1b.png">

###次にcastleを追加する。
owner_idは江戸城を１、大阪城を２、清洲城と安土城を３として設定する。

```
$ Castle.create(castle:"江戸城",owner_id:1)
$ Castle.create(castle:"大阪城",owner_id:2)
$ Castle.create(castle:"清洲城",owner_id:3)
$ Castle.create(castle:"安土城",owner_id:3)
```

追加されていることを確認する。

```
$ Owner.all
$ Castle.all
```

<img width="1277" alt="スクリーンショット 2017-10-11 07.30.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/205578/51e3cf1e-ae4f-d09e-4c31-959219f45d69.png">

##４．belongs_toとhas_manyで紐付けする

Castles <font color="red">belongs to Owner</font>　（CastleはOwnerに所属している）
Owner <font color="red">has many Castles</font>　（Ownerは複数のCastleを所有している）

ってことだから、Castleモデルにbelongs_toでOwnerモデルにhas_manyを記述すれば良い。

```app/models/castle.rb
belongs_to :owner
```


```app/models/owner.rb
has_many :castles, dependent: :destroy

#castlesで複数形にする
#dependent: :destroyで、例えば織田信長が所有する城を全て削除ということを簡潔に命令できるようになる。
```

##５．これで紐付けられたということになるのか...？
たったのこれだけで紐付けが完了したということになるのか。
とはいえ、確認する為にはどうしたらいいのか分からない。
たぶん、また複雑な段階を踏むということかもしれない。
だがしかし、とりあえずはアソシエーションの基礎の基礎が分かった。
これにdeviceとかscaffoldをくっつけていけば、ログイン機能が実装され、SNSがつくれるということだな。

##参考
【Rails入門】has_many、belongs_toの使い方まとめ
http://www.sejuku.net/blog/26617
【jQuery】名前空間を使ったイベントの設定／削除

#イベントに名前空間を設定できる
最近まで名前空間を指定できる事を知りませんでした・・・
設定の仕方は下記です。

```
$(セレクタ).on("イベントの種類.名前空間", イベントハンドラ);
$(セレクタ).off(".名前空間");
```

下記のような処理があった場合、name2のイベントだけを消すことができる

```
$("a").on("click.name1", function() {});
$("a").on("click.name2", function() {});
$("a").off(".name2");
```
[React Native]react-navigationでアニメーションを起こさずにスタックをリセットする

## 背景

- react-navigationのStackNavigatorを使っている
- 前進のみのアプリでスタックがどんどんたまってしまう

## 課題

- スタックがたまっていくと動作が重くなる
- 特定のタイミングでスタックをリセットしたい
- 見た目上は前進してるのみでページが戻ってる感を出したくない
- react-navigationのresetを使うとリセットできるがアニメーションが嫌
- ![navigation.gif](https://qiita-image-store.s3.amazonaws.com/0/175213/0da5805c-e83c-729b-8f9d-c5bafacd4da2.gif)

## 対応策

- 遷移履歴の配列をいじって古いものを消す
- 何ページ目かを意味するindexはいじらない
    - indexが若返ると戻ってる感のあるアニメーションが発生してしまうから
- 例えば現在10ページ目なら、10ページ分の遷移履歴が配列につまっているが、9こnullがあって10番目に現在のページを持つ配列に書き換える
- 削除したページに戻ろうとするとエラーになるので戻るボタンの制御は必須

## サンプルコード

```js
import { StackNavigator } from 'react-navigation'
import SampleAScreen from '../containers/SampleAScreen'
import SampleBScreen from '../containers/SampleBScreen'
import SampleCScreen from '../containers/SampleCScreen'
import SampleDScreen from '../containers/SampleDScreen'
import SampleEScreen from '../containers/SampleEScreen'

const AppNavigator = StackNavigator({
  SampleA: { screen: SampleAScreen },
  SampleB: { screen: SampleBScreen },
  SampleC: { screen: SampleCScreen },
  SampleD: { screen: SampleDScreen },
  SampleE: { screen: SampleEScreen },
})

// オリジナルのgetStateForActionの定義を退避
const original = AppNavigator.router.getStateForAction;

// getStateForActionの内容を上書き。このメソッドはページ遷移の直前に呼ばれる
// action: navigateとかresetとかgoBackが入る
// state: ページ遷移の履歴が入る
AppNavigator.router.getStateForAction = (action, state) => {
  // stateが空の時(=初回アクセス時)はそのままoriginalを呼ぶ
  if (!state) return original(action, state);

  // ここの2行で最新1件の履歴しか持ってないリストを作る
  // 今5ページ目なら[null, null, null, null, { routeName: xxx, key: yyy }]みたいな
  const newRoutes = [];
  newRoutes[state.index] = state.routes[state.index];
  // リセット処理をしたいページであればstateを変更する。indexはそのままの値を使うのがポイント
  const newState = (action.routeName === 'SampleA') ? { index: state.index, routes: newRoutes } : state;
  // 更新したstateでoriginalを呼ぶ
  return original(action, newState);
}

export default AppNavigator;
```

### まとめ

- ちょっと無理やり感はあるけど重くなる事象は消えた
自作アプリ Ｎｏ.3, No.4 (2個)

#No.3 消費税込みの値段を出す

```python3:tax2017.py
# coding:utf-8
# No.3
# 消費税込みの値段を出す

# price:値段　total_price:消費税込みの値段　tax:消費税

import math                                             # 小数点　切り上げ　切り捨てを使う目的で取り込み
price = int(input())                                    # 税別の値段
tax = 0.08                                              # 2017年現在の消費税
total_price = price+(price * tax)                       # 税込みの最終的な値段


print("合計金額は【" + str(math.floor(total_price)) + "】円です")         # math.floorで小数点を切り捨て(切り上げの場合はmath.ceil)
                                                                        # strで金額を文字列に変換

```

#No.4 やる気スイッチ
```python3:yaruki.py
# coding:utf-8
# No.4

# やる気スイッチ
""" 
今回はここで一気に説明します
import time →　time.sleep()によって次の行動を何秒後にするかを設定できます。
他の関数と組み合わせて使えば自分の好きなＳＥや音楽でタイマーを作ることが可能です

print("\007")　→　音が鳴ります（とりあえずファイルの用意めんどくさいやとか、とにかく音鳴らしてみたいって時に役立ちます）

"""

import time
print("起動してしまいましたね。紙とボールペンを用意してください")
time.sleep(3)
print("タイピングが慣れているならパソコンのメモ帳でもいいです")
time.sleep(3)
print("準備時間は20秒です,それでは準備してください！")
time.sleep(20)
print("\007")
print("準備出来ましたか？それでは今から秒数を決めるので")
time.sleep(3)
print("今日しなければいけない事を書いてください")
time.sleep(3)
print("1個でも10個でも何個でもＯＫです。制限時間は・・")
time.sleep(5)
print("30秒！！よーいドン！！")
time.sleep(27)
print("\007")
time.sleep(1)
print("\007")
time.sleep(1)
print("\007")
time.sleep(1)
print("\007")
print("それでは今から実行してください！頑張ってね！！")
```
Dialogflow(旧:API.AI)の新機能Inline Editorを試してみた #dialogflow

##Inline Editor
Webフックをコンソールで直接実行、テスト、実装することができる。DialogflowはCloud Function for Firebaseにコードを保存し、デプロイを開始します。 初期は1〜2分かかりますが、それ以降の更新は迅速に実行されます。 デプロイされると更新日時のタイムスタンプがデプロイボタンの横に表示されます。

##はじめかた
- Dialogflow(旧:API.AI)のコンソールにアクセス
- 左メニューのFulfillmentをクリック
- Inline Editor(Powered by Cloud Functions for Firebase)を有効にする
- これによりコードエディタとサンプルコードが表示されます。 
    - このコードは[GitHub](https://github.com/dialogflow/fulfillment-webhook-nodejs)にもあります。

<img width="611" alt="Screen Shot 0029-10-11 at 3.29.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/753973df-0cf0-058e-fb78-524ddf8129d3.png">

##実行
特に問題がなければ最初から書かれているサンプルコードで実行したいと思います。
こちらのコードを見つけてください。

```js:index.js
'input.welcome': () => {
    // Use the Actions on Google lib to respond to Google requests; for other requests use JSON
    if (requestSource === googleAssistantRequest) {
        sendGoogleResponse('Hello, Welcome to my Dialogflow agent!'); // Send simple response to user
    } else {
        sendResponse('Hello, Welcome to my Dialogflow agent!'); // Send simple response to user
    }
}
```
input.welcomeのWebhookが既に用意されているので、こちらの動作チェックをしたいと思います。

###デプロイ
特に問題がなければそのままデプロイボタンを押しデプロイしましょう。数分時間がかかります。デプロイが完了すると更新日時タイムスタンプが表示されます。

<img width="609" alt="Screen Shot 0029-10-11 at 3.44.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/c973ffe3-6c91-1036-4a51-cd07a83b11dd.png">

###input.welcomeのUse webhookを有効にする

<img width="627" alt="Screen Shot 0029-10-11 at 3.41.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/aa98c594-6bfd-a011-c128-995f04fc0370.png">


###Actions on Googleのシュミレータで実行してみましょう。
サンプルコードには"googleAssistantRequest"からリクエストされた場合は「Hello, Welcome to my Dialogflow agent!」を送信するように定義されています。
「Hello, Welcome to my Dialogflow agent!」が返ってくれば成功です！

<img width="315" alt="Screen Shot 0029-10-11 at 3.46.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/d0e9e9ca-96f0-e09a-c7cf-e0454fd33b4d.png">

##参考リンク
 - [Getting started with Dialogflow fulfillment](https://dialogflow.com/docs/how-tos/getting-started-fulfillment)
ClojureやりたいけどEmacsは厳しい人のためのproto-repl入門

## 言いたいこと

Atomというメインストリームなエディタで割と快適なClojure環境が簡単に作れるので初心者におすすめ。

## 筆者環境

OS: Ubuntu Mate 16.04 LTS
Atom version: 1.21.0
Lein/Java : Leiningen 2.7.1 on Java 1.8.0_131 OpenJDK 64-Bit Server VM


# 手順

## 1. Atomをゲットする

[本家サイト](https://atom.io/)へGO!

## 2. Leiningenをインストールする

具体的なインストール方法については世に沢山記事があるので[サイトへのリンク](https://leiningen.org/)だけ貼る。

`lein repl`がターミナルで動けばok

## 3. Atomを起動する

こんな感じ
![Screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/124830/239496fa-618a-f27d-a57b-18885b7e420a.png)

##  4. proto-replとinkパッケージをインストールする

Atom上のClojure用パッケージであるproto-replと、AtomでIDEを作る(？)ための基盤を提供しているinkをインストールする。

Edit -> Preference -> Install でproto-replを入力して'Packages'をクリックすると proto-replが

Edit -> Preference -> Install でinkを入力して'Packages'をクリックするとinkが

それぞれ上に出てくるのでインストールする

![Screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/124830/f126009c-4fc8-173a-651d-f5c0b0d186d6.png)

## 5. REPLを起動する

メニューからPackage -> proto-repl -> startをクリックするとClojureのREPLが起動する。
適当にフォームを入力し、Shift+Enterを押すと評価され結果が表示される。

![Screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/124830/50394e94-e253-7e04-ea48-7b797e64ce68.png)

## 6. トップレベルのフォームの評価結果をインラインで表示する

適当なClojureのソースファイルの中にある
評価したいフォームを右クリック -> proto-repl -> Execute Block をクリックすると、
何と評価した結果がEmacsのciderばりにインラインで表示される。

![Screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/124830/0f77f2c9-afef-0d02-60ed-26e3928ef112.png)

## 7. 補完も効く!

![Screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/124830/0d499356-8ac8-5b25-fc9b-5b92d23eba3e.png)

## 8. その他Clojure向けの設定

proto-replの著者が[gist](https://gist.github.com/jasongilman/d1f70507bed021b48625)にまとめている設定の評判が良さそうなので試してみるのも良いかもしれない。

# 感想

Clojure開発に欲しくなる機能はとりあえず揃っている印象だった。
全ての機能を網羅した訳でもないが、とりあえずClojureを初めたい人にはおすすめできるのではないだろうか。

また完全に余談にはあるが、Atomの設定ファイルがCoffeeScriptなのが長い目で見るとつらそうなのでJavaScriptにしても良いのでは、と思ったりはした。(JavaScriptでも書けるっぽいので)

http://flight-manual.atom.io/hacking-atom/sections/the-init-file/
引数で既存メソッドを渡した場合とlambdaで渡した場合でGCAllocに差がでた

## 問題

Unityで、次の２つのコードでGCAllocが発生するものしないものとで差がでたので調査する。コードはプロファイラーで見やすいように毎フレーム処理が走るようにしている。

1 毎フレームGCAllocが発生しないコード

```csharp
    void Update()
    {
        Method1(() => {});
    }

    void Method1(Action action)
    {
    }
```

2 毎フレームGCAllocが発生するコード

```csharp
    void Update()
    {
        Method1(Method2);
    }

    void Method1(Action action)
    {
    }

    void Method2()
    {
    }
```

## プロファイリングの結果
1 の結果

![profiler1.png](https://qiita-image-store.s3.amazonaws.com/0/110527/368274fa-6817-e837-aef8-363a5fa27bbe.png)

2 の結果
![profiler2.png](https://qiita-image-store.s3.amazonaws.com/0/110527/b08f1508-15cd-6465-d14a-66b6dd0bc874.png)

1の結果では GC Alloc が0だが、2の結果は104B GC Alloc が発生しているのがわかる。

## ILを比較する
それぞれのコードでできるILを比較する。必要なところだけ抜粋

1 のコード

```csharp
  .class public auto ansi beforefieldinit GCAllocTest
        extends [UnityEngine]UnityEngine.MonoBehaviour
  {
    .field  private static  class [mscorlib]System.Action '<>f__am$cache0'

    ...

    // method line 2
    .method private hidebysig 
           instance default void Update ()  cil managed 
    {
        // Method begins at RVA 0x2058
        // Code size 37 (0x25)
        .maxstack 8
        IL_0000:  nop 
        IL_0001:  ldarg.0 
        IL_0002:  ldsfld class [mscorlib]System.Action GCAllocTest::'<>f__am$cache0'
        IL_0007:  brtrue.s IL_001a

        IL_0009:  ldnull 
        IL_000a:  ldftn void()
        IL_0010:  newobj instance void class [mscorlib]System.Action::'.ctor'(object, native int)
        IL_0015:  stsfld class [mscorlib]System.Action GCAllocTest::'<>f__am$cache0'
        IL_001a:  ldsfld class [mscorlib]System.Action GCAllocTest::'<>f__am$cache0'
        IL_001f:  call instance void class GCAllocTest::Method1(class [mscorlib]System.Action)
        IL_0024:  ret 
    } // end of method GCAllocTest::Update
```

2 のコード

```csharp
    // method line 2
    .method private hidebysig 
           instance default void Update ()  cil managed 
    {
        // Method begins at RVA 0x2058
        // Code size 20 (0x14)
        .maxstack 8
        IL_0000:  nop 
        IL_0001:  ldarg.0 
        IL_0002:  ldarg.0 
        IL_0003:  ldftn instance void()
        IL_0009:  newobj instance void class [mscorlib]System.Action::'.ctor'(object, native int)
        IL_000e:  call instance void class GCAllocTest::Method1(class [mscorlib]System.Action)
        IL_0013:  ret 
    } // end of method GCAllocTest::Update
```

2のコードから先に見ていく。2のコードの方は処理の中で毎回Actionをnewしている。そのため
 GC Alloc を発生させている。
1のコードの方は lambda で定義されたコードが静的フィールドで保存されており、二回目以降はその保存されたコードが使われるようになっていた。

ということは最初の一回目は同じく1のコードも同じ量だけ GC Alloc が発生してたりするのかな。なにわともあれ原因がわかったのでよしとする。

## 環境
Unity5.6.3p3
macOS Sierra 10.12.6
Dialogflowについて #dialogflow

**※Dialogflowについて新しい情報が入り次第こちらの記事を更新したいと思います**

#エンタープライズ向けのサービス提供開始
Dialogflow Enterprise Edition で音声とテキストによる新しい会話アプリの構築方法を提供を開始しました。詳しくは[こちら](https://cloudplatform-jp.googleblog.com/2017/11/introducing-Dialogflow-Enterprise-Edition-a-new-way-to-build-voice-and-text-conversational-apps.html)

#API.AIからの改名について
API.AI開始当時の目標は自然言語処理機能をアプリケーション、サービス、デバイスに追加するためのAPIを開発者に提供することでしたが、アナリティクスツールのような新機能から33の事前構築されたエージェントにいたるまで、APIを提供だけでなく、それ以上のことを実現するようになったため、Dialogflowという名前で活動していくことを決意したそうです。

#新機能
- [In-line code editor](https://dialogflow.com/docs/how-tos/getting-started-fulfillment)
    - Webフックをコンソールで直接実行、テスト、実装することができる。
    - [Dialogflow(旧:API.AI)の新機能Inline Editorを試してみた](https://qiita.com/flatfisher/items/c772fada35add9dd67c9)
- [Multi-language Agents](https://dialogflow.com/docs/multi-language)
    - 複数の言語へのビルドがこれまで以上に簡単になり、新規または既存のエージェントに言語とロケールを追加できる。
    - [Dialogflow(旧:API.AI) で多言語対応したGoogle Assistantアプリをサクッと作る](https://qiita.com/flatfisher/items/1de438d5213755a6bf27)

#参考リンク
- [Introducing Dialogflow, the new name for API.AI](https://blog.dialogflow.com/post/apiai-new-name-dialogflow-new-features/)
権限をどう持つ？

# よく見かけるDBレイアウト(権限テーブルとか)

|id|name|read|write|exec|
|:-:|:--|:-:|:-:|:-:|
|001|taro|1|0|0|

権限項目が増えると...

- カラムが増える
- SQLが変わる
- コードが変わる

面倒。

# ビットマスク

上述の3カラム(read,write,exec)を繋げて2進数にして、  
8進表記に変換したものを1カラムで管理。

unixのファイルパーミッションみたいな感じ。

read - write - exec

↓

100

↓

4

|id|name|permission|
|:-:|:--|:-:|
|001|taro|4|

権限の有無は、該当するビットに1を立てたものと論理積をとる。

論理積はお互い1の場合に1を返すので、権限がない場合は0になる。

```python
# 読み込み権限を持っている
taro_permission = bin(4)     # 0b100

# 読み込み出来る？
read = bin(4)    # 0b100
print(int(taro_permission, 2) & int(read, 2))
# 4 -> で き る

# 書き込み出来る？
write = bin(2)   # 0b010
print(int(taro_permission, 2) & int(write, 2))
# 0 -> で き な い

# 実行出来る？
execute = bin(1)   # 0b001
print(int(taro_permission, 2) & int(execute, 2))
# 0 -> で き な い

# 読み込み or 実行できる？
write_n_exec = bin(3)   # 0b011
print(int(taro_permission, 2) & int(write_n_exec, 2))
# 0 -> や っ ぱ り で き な い
```

ちょっとスッキリに見える。

コードは短くなった気はするけど、  
フィールド増えてくると人間の目では辛くなってくるので結局やめた。
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第六章 ドメインオブジェクトのライフサイクル3(もう一度集約) 

# データベースから離れて集約を考える

集約に関して、GuildWorks増田さんからアドバイスをいただきました。
ありがとうございます！

> 集約の話は、モデル/オブジェクトの実装/データベースへの格納、の三つが同時に語られているから。読み解くには、いったんデータベースの話を無視すると良いです。全てがメモリ上のオブジェクトで表現/操作できるものとして、オブジェクトのネットワークをどこで分割するかの議論として読む。

>オブジェクトの「参照」と「変更」の議論は、テーブルの参照関係とデータベース更新の話ではない。
>メモリ上のオブジェクトだけを使った、判断/加工/計算のロジックを、どういう単位で整理するかが主眼。
>エヴァンスのオブジェクト脳の議論を、手続き型の発想で読むから、わけがわからなくなるw。

どうしても、トランザクションやロックの話が出て来るし、後のリポジトリの話題にも関わってくるため、集約の話しになる際には、データベースの話題にも触れる必要があるのは仕方ないですよね。

ただ、よく読むと、集約の境界やルートの決め方の話では、一切データベースの関連は考えず、ドメインを中心に話しが進みます。

> 実際、この種の問題に対するバランスの取れた解決策を見つけるのには、ドメインに対する深い理解が必要である。(第二部 第六章 より)

なので、集約をきちんと理解するためには、データベースから離れて、ドメインを中心に、モデルのすべてがメモリ上に展開されているオブジェクトで表現できるものとして考えるのが第一です。

購入注文の例もそのようになっていますね。
最初の方はデータベースの話しになっていますが(むしろデータベース中心に考えていたらデットロックかかってどうしようなんていう展開になっていますね)、モデルの検討のシーンでは、ビジネスの知識を中心に検討しています。

> １.商品は多くの購入注文で使用される
> 2.商品に対する変更は購入注文に対する変更より少ない
> 3.・・・
> このモデルと一致した実装をすれば、購入注文とその品目に関連する不変条件は保証されるだろう。

つまり、モデルをドメイン中心に考えることによって集約が定義できるということです。モデルが変更される頻度、タイミングや影響範囲などを考慮することで集約の範囲が見えてきます。

集約のモデルを作成する際は、一旦データベースは置いておいて、ビジネスの知識から考えましょう。
WindowsでもpgAdmin4でサーバーモードしたい！

PostgreSQL10がリリースされたと同時に pgAdmin4もv2.0になりました。
すごいですよね！
v1.xに比べて圧倒的なまでに改善したレスポンス！！
pgAdmin3には及ばないまでも十分実用になるレベル。雌伏の1年を経てようやく来たか・・・！

Windows版PostgreSQL9.6系にはpgAdmin4のv1.xが同梱されてますがさっさと封印してpgAdmin4のv2.0をインストールすべきです。
ストレスが全然ちがうから。

### で本題ですが、
Windows版pgAdmin4はV2.0になってもデスクトップモードがメインだけど、サーバーモードもしたいですよね！
サーバーモードとはphpMyAdminみたくブラウザで開けるモードです。
各PCにいちいちインストールしなくても サーバー機１台にだけ入れてみんなで共有、とかできるですよ。

### まずはふつうにWindows版のpgAdmin4のパッケージをダウンロード＆インストール。
https://www.pgadmin.org/download/


### 次にWindows用のPython、2.7系の32bit版「Windows x86 MSI installer」をダウンロード＆インストール。
https://www.python.org/downloads/windows/
`python-2.7.13.msi` で動作確認しました。
64bit版`python-2.7.14.amd64.msi`もありますがそちらでは動きません。なぜならpgAdmin4がx86版なので。


### Pythonのインストールフォルダから python.exe、python27.lib の２つ

- `C:\Python27\python.exe`
- `C:\Python27\libs\python27.lib`

を、pgAdmin4のインストールフォルダ
　例： `C:\Program Files (x86)\pgAdmin 4\v2\venv\` 
の直下にコピー。(インストール先が違うばあいはご自分の環境に合わせてください）


### テキストエディタ（メモ帳でも可）で以下の内容のバッチファイルを作成。

```pgAdmin4server-mode.bat
cd /d "C:\Program Files (x86)\pgAdmin 4\v2\venv"
powershell -WindowStyle Hidden -command ".\python ../web/pgAdmin4.py"
```
置き場所はどこでもよいです。
作ったらダブルクリックで起動させてください。一瞬ウィンドウ（コマンドプロンプト）が開きますが、すぐに消えます。


### ブラウザで localhost:5050 を開く。

成功したらpgAdmin4が開きます。
※バッチファイルをダブルクリック→ウィンドウが閉じてからも初期処理がちょっと続いてるので、30秒くらいは待った方がいいかも

---

　
サーバーモードで何がいいかって、起動がちょっと早くなるんですよね。２回目以降は特に。
あと複数のウィンドウが開けるのが便利。いやデスクトップモードでも複数開けるんだけど、ブラウザだとタブで簡単に行き来できるので。

ちなみに公式にはApacheとmod_wsgiでサーバーモードするのがおススメされていますが、
https://www.pgadmin.org/docs/pgadmin4/dev/server_deployment.html#apache-httpd-configuration-windows

mod_wsgiのバイナリが手に入らないんです。。。
配布やめたです？


（参考サイト）
pgAdmin4ベータ版をWindowsで動かす（ブラウザモード編）
https://kenpg.bitbucket.io/blog/201606/12.html
Spring AOPの概要

Springframework 学習その2　AOPについてです。

# AOPの概要
## AOPとは
AOPとはアスペクト志向プログラミング(Aspect Oriented Programming)のこと。 
Aspectとは、「様子」や、「面」などを意味します。
## AOPで何ができるのか
ざっくり言うと、ビジネスロジックに直結しない約束事を共通的な処理として定義することができる。 
例えば、「APIの処理開始直後と終了直前にログを出力する」とか。
## なぜAOPを使うのか 
ある程度の規模のシステムになってくると、ログ出力やトランザクションは、
コーディング規約になったりするなど必須なものになることがあります。  
しかし、規約だからと言って毎回同様の実装をしていては、似たような処理が分散するため仕様変更の際に修正漏れがあるかもしれないですし、そもそも書き忘れてたとかあったりしたら困っちゃいます。  
そんな時にAOPを利用して、Controllerのメソッドが呼び出される直前にログ出力するなど、
共通処理を呼び出すようにしたりすることで、ログ出力はログ出力用クラス、
ControllerはControllerの役割を明確にすることに繋がります（凝集度が高くなる）。  
こんな感じのことを「横断的関心事の分離」とか言います。

## AOPのコンセプト
| コンセプト         | 内容                                                                |
|:-----------------:|:--------------------------------------------------------------------|
| Aspect            | 関心事を示すモジュールそのもの <br /> ログ出力とか、例外ハンドルとか     |
| Join Point        | 関心事を実行するポイント <br /> Controller開始直後とか、例外スロー時とか |
| Advice            | Join Pointで実行される処理 <br /> Around、Before、Afterなど           |
| Pointcut          | Join Pointのグループ                                                 |
| Weaving           | アプリケーションコードの適切なポイントにAspectを入れ込む処理             |
| Target            | AOP処理によって処理フローが変更されたオブジェクト                       |

## Springで利用可能なAdvice
| AOP | タイミング |
|:---:| :----------|
| Before | Targetを呼び出す前 |
| After Returning | Targetの処理が正常終了し、呼び出し元に制御を返却する時 |
| After Throwing | Targetの処理で例外が発生し、呼び出し元に例外をthrowする時 |
| After | After Returningと、After Throwing　両方のタイミング |
| Around | Beforeと、After両方のタイミング　つまり、Targetを呼び出す前と呼び出した後 |

以上です。お疲れ様でしたー。

# 参考書籍
[Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発] (https://www.amazon.co.jp/Spring%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80-Spring-Framework%E3%81%AB%E3%82%88%E3%82%8BJava%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BENTT%E3%83%87%E3%83%BC%E3%82%BF/dp/4798142476/)
Azure Function からSendGridバインドを使ってメールを送る


Azure上で、SendGridバインディングを使って、お手軽にユーザー宛にメールを送る仕組みを作っているので、SendGridバインディングの使い方をまとめてみた。npmでSendGridのクライアントをインストールする必要もなく、サクッとメール配信が作成できるので便利。

# 用意するもの

* SendGrid API Key
	* SendGridもAzureから簡単にアカウントをオープンできるので便利 :+1: 
* Azure Function CLI
	* インストール方法は、上の[記事](https://qiita.com/TsuyoshiUshio@github/items/03a0d169d440a64535dc)を参考に。


# セットアップ手順

## Azure FunctionのApp Setting にSendGridのAPI Keyを追加

予め取得しておいたSendGrid のAPI KeyをFunctionで利用できるようにするため、ポータルからApp Settingsを追加。以下、例として`SendGridAPIKey` として追加。

## `func` コマンドでFunctionを作成

トリガーは何でも良いので、とりあえず作ってみる。
`func function new` コマンドは対話的に新しいFunctionを作成できます。
ここではお手軽なHTTPトリガーにしました。

```bash
$ func function new
Select a language:
1. C#
2. JavaScript
Choose option: 2
JavaScript
Select a template:
1. BlobTrigger
2. HttpTrigger
3. QueueTrigger
4. TimerTrigger
Choose option: 2
HttpTrigger
Function name: [HttpTriggerJS] SendEmail
Writing /Users/tatsuya.b.sato/Projects/private/myfunctions/SendEmail/index.js
Writing /Users/tatsuya.b.sato/Projects/private/myfunctions/SendEmail/sample.dat
Writing /Users/tatsuya.b.sato/Projects/private/myfunctions/SendEmail/function.json
```

## `function.json` にSendGridバインディングを追加

```SendEmail/function.json
{
  "disabled": false,
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req"
    },
    {
      "name": "$return",
      "type": "sendGrid",
      "direction": "out",
      "apiKey": "SendGridAPIKey",
      "subject": "Test from Azure Function!",
      "text": "Hi, Azure Function!"
    }
  ]
}
```

バインディングの詳細については、[ドキュメント](https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-sendgrid)を参照。

## Function を書く。

HTTPトリガーで指定されたメールアドレスにメールを送るFunctionを書いてみる。


```SendEmail/index.js
module.exports = function (context, req) {
    var email = req.query.email;

    var message = {
      personalizations: [
        { to: [ { email: email } ] }
      ],
      from: { email: "no-reply@example.com" }
    };

    context.done(null, message);
};
```

## デプロイ

gitやFTPでデプロイすれば完了。
上の例だと、HTTPのURLパラメーターに`email=foo@example.com` のように宛先を指定することで、送信できる。
ここでは手軽さのためにHTTPトリガーを使いましたが、どこからでも誰からでも使えてしまうのは危ないので、業務ではQueueトリガーなど適切な方法に切り替えましょう。


SendGrid のメッセージとして指定できるJSONの値は、どうやら[v3 Mail Send](https://sendgrid.kke.co.jp/docs/API_Reference/Web_API_v3/Mail/index.html)みたいです。

# 参考

* [Azure Functions SendGrid bindings | Microsoft Docs](https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-sendgrid)
* [v3 Mail Send API概要 - ドキュメント | SendGrid](https://sendgrid.kke.co.jp/docs/API_Reference/Web_API_v3/Mail/index.html)
ionic2でandroidアプリをリリースする

ionic2で作ったandroidアプリをgooglePlay用にビルドしてリリースする。

# 1：リリース用apk作成
例：pjディレクトリ直下で。

```bash
$ cd pj #プロジェクトディレクトリへ移動

$ ionic cordova build android --prod --release # --prodなしだとエラーに甘い
```

# 2：キーストアファイル作成

これでapkに署名しないと公開できない。
バージョンアップ時にも必要なので失くしてはならない。

```bash
$ keytool -genkey -v -keystore mykey.jks -keyalg RSA -keysize 2048 -validity 10000 -alias myalias

# mykey = [キーストア名] , myalias = [秘密鍵名]
```
いくつか質問されるので適当に答える。
[いいえ]が出てくる質問は最終確認なので"y"で。

# 3：apkに署名する

```bash
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore mykey.jks ./platforms/android/build/outputs/apk/android-release-unsigned.apk myalias
```
パスワードを聞かれるので答える。

# 4：zipalignする

いい感じにファイルを最適化してくれるらしい。
やらないとapkアップロード時に警告が出る。

```bash
$ ./zipalign -v 4 ./platforms/android/build/outputs/apk/android-release-unsigned.apk myapp.apk

# myapp = [最終apk名] 
```

コマンドが見つからない時は、以下にあるzipalignをpjにコピっておく。
user/Library/Android/sdk/build-tools/xx.x.x

ここにもなければインストールしようね！

# 5：Google Playにアップロード
適当に触れば意外とできる。処理されるまで3時間くらいかかる。
出来ない時は、各メニューの警告マークにカーソルを置くと不足を指摘してくれる。

面倒だとすればプライバシーポリシーのリンク登録。
カメラとか使ってると、定型文をブログ等に載せてリンクする必要がある。
いつか詳細を追記する。
ACCESSで必ず使う エクスポートしたクエリのSQLを復元する

```vb
Sub RecoveryQueryFromExpostText()
Dim cDB As DAO.Database: Set cDB = CurrentDb
Dim oFolder, oFil, fs
Dim Q As QueryDef
Dim buf As String
Dim sr 'As ADODB.Stream
Dim ar() As String, i As Long
Dim Qname As String
Const adModeReadWrite = 3
Const adTypeText = 2
Const adReadAll = -1
'Set sr = New ADODB.Stream
Set sr = CreateObject("ADODB.Stream")
sr.Mode = adModeReadWrite
sr.Charset = "Shift_Jis"
sr.Type = adTypeText
Set fs = CreateObject("Scripting.FileSystemObject")
Set oFolder = fs.GetFolder("C:\Hoge\Hoge_Text") 'データのあるフォルダ
'クエリ
i = 0
For Each oFil In oFolder.Files
    If fs.GetExtensionName(oFil) = "txt" And Right(fs.GetBaseName(oFil), 4) = "_SQL" Then
    If Left(fs.GetBaseName(oFil), 1) <> "_" Then
    ReDim Preserve ar(0 To i)
    ar(i) = oFil.Path: i = i + 1
    End If
    End If
    Next
    Set fs = Nothing: DoEvents
    sr.Open
    For i = LBound(ar) To UBound(ar)
    sr.LoadFromFile ar(i)
    Debug.Print ar(i)
    'Do While Not sr.EOS
     '次の行を読み取る
    buf = buf & sr.ReadText(adReadAll) '& vbCrLf
    'Loop
    Set fs = CreateObject("Scripting.FileSystemObject")
    Qname = Replace(fs.GetBaseName(ar(i)), "_SQL", "", 1, -1)
    Set fs = Nothing: DoEvents
    DoEvents
    For Each Q In cDB.QueryDefs
    If Q.Name = Qname Then DoCmd.DeleteObject acQuery, Qname: Exit For
    Next
    Set Q = cDB.CreateQueryDef(Qname, buf)
    cDB.QueryDefs.Refresh
    buf = ""
Next
End Sub
```

#使用条件

[Accessで必ず使うVBA ほぼ完全なエクスポート 全オブジェクト+参照設定リストをエクスポート ](https://qiita.com/Q11Q/items/99caf05417f1c3af850c)のVBA/VBSで出力したフォルダの
第一文字目がアンダーバーではない
Shift Jisのテキストファイルで
`"_SQL.txt"`
となっているもの。
を対象としています。

`Set oFolder = fs.GetFolder("C:\Hoge\Hoge_Text") `
`"C:\Hoge\Hoge_Text"` これを出力したフォルダ名に書き換えてください。
Gradleのマルチプロジェクトのテスト結果とカバレッジをそれぞれ1つにまとめる

ルートのプロジェクトのbuild.gradleを以下のように変更する

```groovy
allprojects {
    apply plugin: 'java'
    apply plugin: 'jacoco'

    repositories {
        jcenter()
    }

    jacoco {
        toolVersion = '0.7.9'
    }
}

subprojects {
    test {
        reports.html.enabled = false
    }

    jacocoTestReport {
        additionalSourceDirs = files(sourceSets.main.allSource.srcDirs)
        sourceDirectories = files(sourceSets.main.allSource.srcDirs)
        classDirectories =  files(sourceSets.main.output)
        reports {
            html.enabled = true
            xml.enabled = true
            csv.enabled = false
        }
    }
}

task testRootReport(type: TestReport) {
    destinationDir = file("$buildDir/reports/allTests")
    reportOn subprojects.tasks.test
}

task jacocoRootReport(type: JacocoReport) {
    dependsOn = subprojects.test
    additionalSourceDirs = files(subprojects.sourceSets.main.allSource.srcDirs)
    sourceDirectories = files(subprojects.sourceSets.main.allSource.srcDirs)
    classDirectories =  files(subprojects.sourceSets.main.output)
    executionData = files(subprojects.jacocoTestReport.executionData)
    reports {
        html.enabled = true
        xml.enabled = true
        csv.enabled = false
    }
}

task report(dependsOn: ['testRootReport', 'jacocoRootReport'])
```

コマンド

```sh
./gradlew test report
```

結果

```
.
└── build
    └── reports
        ├── allTests
        │   └── index.html etc...
        └── jacoco
            └── jacocoRootReport
                └── html
                    └── index.html etc...
```

参考

https://gist.github.com/aalmiray/e6f54aa4b3803be0bcac
http://clash-m45.hatenablog.com/entry/2015/01/24/162621
MAYAの"トランスフォームのフリーズ"をFlashに置き換えて理解する

Flash のアニメーターとして活躍されていた方の中には、最近では MAYA のアニメーターとして活躍している方も多いと聞きます。自分はエンジニアなのですが、3Dグラフィック周辺を担当しているため、MAYAをいじる事も多いです。
MAYAでのモデリングのフィニッシュ時におまじないのようにやれと言われる `トランスフォームのフリーズ` を理解するのに Flash に当てはめて考えたらわかりやすかった気がするので、記事として残しておこうと思います。 これから MAYA を触ることになる Flash 経験者などの役に立てばと。

#トランスフォームのフリーズ前
![image.png](https://qiita-image-store.s3.amazonaws.com/0/8302/f47161f8-db98-d0c8-9a81-2ad0c4e8ae20.png)
MAYAでのフリーズ前のトランスフォームノード(+シェイプノード）が、 Flash上では仮に上の図のような状態だと考えます。座標値が`100`,`100`で、回転・拡大縮小の中心点（＝ピボットポイント）は MovieClip の中心点と同じとしてあります。

| MC定義 |
|:-:|
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/8302/c669223d-b14f-6a7b-2136-823d96aa947a.png)|
MovieClip 自体はこのような状態です。（先の図の１階層下）シェイプの中心に原点があります。ここまでいたって普通の状態です。

#トランスフォームのフリーズ後

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8302/a4f7005f-ebff-bc17-8447-b035e62d37fc.png)
Flashで表すと、このような状態であると考えられます。
パッと見はフリーズ前の状態と変わりません。回転・拡大縮小のピボットポイントは顔の中心にありますが、 MovieClip の原点はよくみると顔のずっと外側、座標値が`0`,`0` の位置に移動しています。これはどう言うことでしょう？

| MC定義 |
|:-:|
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/8302/92bc87d3-432f-0f22-9236-723cfb1dce4d.png)|
MovieClip 定義はこのような状態です。シェイプの左上に原点が移動しています。正しく言い換えるとシェイプ全体の位置が右下に移動しています。

このような構成にすると、パラメーター的には位置が`0,0`、回転が`0`、大きさが`1`のデフォルト値であるのに、それぞれに変異がある状態を作ることができます。（この例では位置しか移動していませんが。）
回転がデフォルト40度で30度~50度の間でアニメーションさせるより、デフォルト状態を0度と考えて-10度~10度の間でコントロールする方が扱いやすいし元の状態にもリセットしやすいと言うわけです。これが `トランスフォームのフリーズ` の狙いです。Flash でもこのような方法があってもよかったかもしれません。（もう１階層Graphic や MovieClipで包んでしまえば同じような事ができてしまうわけですが！）

# 補足

補足ですが、MAYAではピボット値を拡大縮小と回転で別々に持つことができます。(Flashでは両者で１つのピボット) また、トランスフォームのフリーズを行うと、上記の例で言うシェイプの移動を行う　`transformGeometry` と言う種類の履歴がトランスフォームノードに追加されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/8302/aaa3a18a-b750-6d46-47e9-0b95b659111a.png)

# 補足
上記の例は実際に人型の素材で解説するとなおわかりやすい気がしますね。*Flashの戦士の誰かに任せたぞ。。*
なお、`マヤ道！`という本では、この辺りが漫画で詳しく説明されています。若干内容が難しいですが、気軽になんども読めるのでおすすめです。
https://www.borndigital.co.jp/book/5764.html
javapackagerで日本語のインストーラ

# はじめに、

jarをexe形式で配布するには、以下のようにする。なお、あらかじめ、[Inno Setup](http://www.jrsoftware.org/isinfo.php)をインストールしておく必要がある。

```shell-session
javapackager -deploy -native exe -outdir dest -outfile foo -srcdir build\libs -srcfiles foo.jar -appclass Main
```

＃他にもいろいろオプションがあるけど、詳細はヘルプ等を参照。

Windows上ではWindows用のパッケージしかできないので、gradleを使うまでもなく、batで呼び出すのが手っ取り早いかと。

おお、インストーラできた！と思って、実行すると、英語に......って、そういう人むけにインストーラにするのに、英語......

# 簡単にやる。

どうやら、languageオプションとかそういった感じのオプションはない。
でも、デフォルトでは、英語用のDefault.islを使うっぽいので、これを単純に日本語のファイルに差し替えてあげればOK。

```
コピー先：C:\Program Files (x86)\Inno Setup 5\Default.isl
コピー元：C:\Program Files (x86)\Inno Setup 5\Languages\Japanese.isl
```

# まっとうにやる。ための調査。

先ほどの方法で、目的は達成するわけではあるが、あまりにも、アレな感じ......
ということで、いろいろ調べてみるもののよくわからない。いろいろさまよっていると、[ココ](http://www.torutk.com/projects/swe/wiki/Javapackager)のサイトがヒットした。
ソースが[openjfx](http://hg.openjdk.java.net/openjfx)とかいうものでant-javafx.jarが実体ということで、ソースを持ってきて、デバッグ開始。
なんとなく、mainっぽいものをあさると、「[com/sun/javafx/tools/packager/Main](http://hg.openjdk.java.net/openjfx/8u40/rt/file/105417e52ffe/modules/fxpackager/src/main/java/com/sun/javafx/tools/packager/Main.java)」がそれっぽいので、そこから、追っかける。

どうやら、「[com/oracle/tools/packager/windows/template.iss](http://hg.openjdk.java.net/openjfx/8u/rt/file/105417e52ffe/modules/fxpackager/src/main/resources/com/oracle/tools/packager/windows/template.iss)」がデフォルトだけど、「package/windows/%name%.iss」を見に行ってくれるらしい。

# まっとうにやる手順

1. [template.iss](http://hg.openjdk.java.net/openjfx/8u/rt/file/105417e52ffe/modules/fxpackager/src/main/resources/com/oracle/tools/packager/windows/template.iss)を持ってきて、package/windows/%name%.issに保存する。

2. Languagesに日本語を追加する。

```diff
  [Languages]
- Name: "english"; MessagesFile: "compiler:Default.isl"
+ Name: "jp"; MessagesFile: "compiler:Languages/Japanese.isl"
```
撮影済みの動画で顔認識【FaceTracker】

openFrameworksのアドオンであるofxFaceTrackerにあるサンプルコードを使って、撮影済みの動画ファイル（.mov）を読み込んで顔を追跡します。

サンプルコードは
ofxFaceTracker/example-non-realtime
にあるものを使用します。

そのまま使えるかなと思って
プロジェクトのbin/dataに読み込みたいファイルvideo.movを置いて実行してみたのですが
途中で追跡できなくなるし追跡できないと動画がフリーズするしで上手くいきませんでした。

サンプルコードを少し書き換えたら上手くいったのでシェアします。

書き換えるのはofApp.cppです。


####① ofApp::setup( )
video.play( ) を追加

```cpp:ofApp.cpp
void ofApp::setup() {
    video.load("video.mov");
    video.play();
	tracker.setup();
    tracker.setRescale(.25);
    tracker.setIterations(100);
    tracker.setClamp(10);
    tracker.setTolerance(.5);
    tracker.setAttempts(4);
}
```

↑もしかしたら追加しなくても動くかも？


####② ofApp::update( )

video.nextFrame( ) をコメントアウト

```cpp:ofApp.cpp
void ofApp::update() {
	video.update();
	if(video.isFrameNew()) {
		tracker.update(toCv(video));
        trackedFrames.push_back(tracker.getImageMesh());
        vector<float> curGesture;
        for(int i = 0; i < gestureCount; i++) {
            curGesture.push_back(tracker.getGesture(gestureIds[i]));
        }
        trackedGestures.push_back(curGesture);
        //video.nextFrame();       
    }    
}
```

これで検出できなかったときに動画がフリーズすることはないと思います（たぶん）。




FaceTrackerの導入やサンプルコードを使ったプロジェクトの作り方とかはこちらの記事（[FaceTrackerを試してみた](https://qiita.com/moshimoshiasimo/items/91ebb571fbc3df647343)）を参考にしてください。