OmniAICreator/Qiita-1.07M huggingface dataset:
続２・REST Webサービス作成メモ（IIS ExpressのSSL有効化編）

#前回までのあらすじ
C言語しか知らない筆者がREST Webサービスを作成しようと思い立ち、サービス側プログラムと、クライアント側プログラムの作成まで辿り着くことができました。

* [REST Webサービスの作成が僕には難しすぎたので、誰にでも分かるよう手順を残す。](http://qiita.com/yz2cm/items/8e7790026b7697843219)
* [続・REST Webサービスの作成が僕には難しすぎたので、誰にでも分かるよう手順を残す。（クライアント編）](http://qiita.com/yz2cm/items/46d8e87a39f844904ea7#_reference-8cb314d5483d8488ab3d)

今回は、サービスのURLを`http://～`じゃなくて、`https://～`でアクセスできるようになりたーい！ということで、作成したREST WebサービスのSSLを有効化する話です。

#「SSL 有効」をTrueにするだけ？

海外の記事を見ても、誰も彼も口をそろえて「プロジェクトのプロパティを開いて、「SSL有効」を「True」に設定するだけでOK.」しか言わない。

確かにそれでもVisual Studioからのデバッグ実行だとうまくいくんですが、コマンドプロンプトからIIS Expressを起動すると、どーしても`http://`の方でサービスを立ち上げようとするんですよね…。

で、結論を言うと解決はしたのですが、フラグを変えるだけではダメでした。

以下が成功した手順です。

#１．SSL有効をTrueにする

まず皆が言っているように、プロジェクトのプロパティの「**SSL 有効**」を「**True**」に変更します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/51871/56cdd947-0650-d89c-fc81-84566f4b99a7.png)

すると「SSL URL」の項目に、**`https://localhost:xxxxx/`**のURLが表示されるようになります。

#２．仮想ディレクトリ

次に、プロジェクトのプロパティ画面の「**Web**」のページを開き、「**プロジェクトのURL(J)**」の項目に、先ほど「**SSL URL**」に表示されていたURLを入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/51871/71a6becd-6ec3-9104-db34-70afa5cbce3e.png)

入力したら、右隣の「**仮想ディレクトリの作成(Y)**」ボタンを押下します。

#３．IIS Expressのコンフィグファイルの場所

ここからが肝心なのですが、上記の設定が反映されたコンフィグファイルのパスを確認します。それが以下です。

```:コンフィグファイルのパス
(プロジェクトのディレクトリ)\.vs\config\applicationhost.config
```

`.vs`フォルダはドットつきなので既定では表示されませんが、Windows 10だと、Exploreの「表示」メニューから「隠しファイル」のチェックボックスをONにすると表示されるようになります。

#４．IIS Expressの起動

`iisexpress`を以下の書式で起動します。`/config:`オプションには、上で確認したコンフィグファイルのパスを指定します。

```:IIS_Expressの起動
cd /d "C:\Program Files\IIS Express"
iisexpress /site:"ProductsApp" /config:(コンフィグファイルのパス)
```

```:実行例
> "C:\Program Files\IIS Express\iisexpress.exe" /site:"ProductsApp" /config:"C:\Users\yz2cm\OneDrive\Documents\Visual Studio 2017\Projects\ProductsApp\.vs\config\applicationhost.config"
Starting IIS Express ...
Successfully registered URL "http://localhost:51585/" for site "ProductsApp" application "/"
Successfully registered URL "https://localhost:44333/" for site "ProductsApp" application "/"
Registration completed for site "ProductsApp"
IIS Express is running.
Enter 'Q' to stop IIS Express
```

#５．クライアントからの動作確認

ちゃんと`https://～`にアクセスできるようになりました。ふぅ。

```リクエストの結果
> RestClient.exe https://localhost:44333/api/products
id: 1   name: Tomato Soup     category: Groceries            price: 1.0
id: 2   name: Yo-yo           category: Toys                 price: 3.75
id: 3   name: Hammer          category: Hardware             price: 16.99
```

#For more information

* [Running IIS Express from the Command Line](https://docs.microsoft.com/en-us/iis/extensions/using-iis-express/running-iis-express-from-the-command-line)
windowsのdesktop.iniでフォルダ名・ファイル名を変えるパラメーター


```ini:desktop.ini
[.ShellClassInfo]
LocalizedResourceName=xxx

[LocalizedFileNames]
Windows Explorer.lnk=@%SystemRoot%\system32\shell32.dll,-22067

```

加えて、このdesktop.iniファイルにアーカイブ・システム・隠しファイル属性を付与する。desktop.iniファイルが属するフォルダにシステム属性を付与する必要がある。
【メモ】LaravelでPusherを使おうとしたらClass Pusher not found的なエラーが出てきたので対処法をメモ

Laravel5.4でPusherを使おうと思い、
readouble.comを参考にインストールしてから使おうとした。

まず最初にlaravel-echoでリッスンしてもイベントが伝わっていない、というエラーがでた。
これは、```.env```ファイルの```BROADCAST_DRIVER=pusher```とすることで解決。

そうすると今度は、

```
Class Pusher not found
```

的なエラーが発生。

これは```BroadcastManager.php```と```PusherBroadcaster.php```で、

```php
use Pusher;
```

となっているところを、

```php
user Pusher/Pusher;
```
とすることで解消した。


これは、```autoload_classmap.php```で```Pusher\Pusher```で定義してあるため。
(こっちを```Pusher```に変えようかとも思ったけど影響範囲が広そうだったのでやめた)

ちなみに、```BroadcastManager.php```と```PusherBroadcaster.php```は、
共に```Illuminate/Broadcasting```の中にある。

以上。
Xamarin.Formsで画面遷移元にパラメータを返す

Xamarin.Formsで画面遷移元にパラメータを返すのって皆さんどうやってるんでしょうか。
ViewModelからPushAsyncで画面遷移するのは良いとして、遷移先からPopAsyncで戻ってきたときにイベント発生しないし。。

とりあえずこんな方法でやってみたけど正解がわからない。

### 遷移元ViewModel
CallBack用のメソッドを作ってあげる

```csharp:HomePageViewModel.cs
public void CallBack(DateTime inDate, string task)
{
    // 遷移先から戻ってきたときの処理
}
```
画面遷移する際に遷移先画面のコンストラクタにCallBack用メソッドを引数で渡す

```csharp:HomePageViewModel.cs
private void AddTask()
{
    Action<DateTime, string> callback = CallBack;

    this.navigation.PushAsync(new AddTodo(callback));
}
```

### 遷移先ViewModel
コンストラクタでCallBack用メソッドを受け取り、、

```csharp:AddTodoViewModel.cs
public AddTodoViewModel(INavigation nav, Action<DateTime, string> callback)
{
    this.navigation = nav;
    this.action = callback;

    TodoCreationCommand = new Command(() => TodoCreation());
}
```

PopAsyncする前にCallBackメソッドを実行します。
CallBackメソッドの引数に遷移元に戻したいパラメータを設定してやればこのパラメータを使って遷移元画面で処理ができます。

```csharp:AddTodoViewModel.cs

private void TodoCreation ()
{
    action(InDate, Todo);

    this.navigation.PopAsync();
}
```
ActiveRecord 5 系から enum で定義した名前をそのまま where でも使えるようになっていた

```rb
gem "activerecord", "4.2.8"
require "active_record"

ActiveRecord::Migration.verbose = false
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
ActiveRecord::Schema.define do
  create_table :users do |t|
    t.integer :foo
  end
end

class User < ActiveRecord::Base
  enum foo: [:a, :b]
end

User.foos                  # => {"a"=>0, "b"=>1}
User.defined_enums         # => {"foo"=>{"a"=>0, "b"=>1}}

User.create!(foo: :a)

User.a                     # => #<ActiveRecord::Relation [#<User id: 1, foo: 0>]>
User.where(foo: :a).to_sql # => "SELECT \"users\".* FROM \"users\" WHERE \"users\".\"foo\" = NULL"
User.where(foo: :a)        # => #<ActiveRecord::Relation []>
```

最後の3行は ActiveRecord 5.1.2 で次のようになります

```rb
User.a                     # => #<ActiveRecord::Relation [#<User id: 1, foo: "a">]>
User.where(foo: :a).to_sql # => "SELECT \"users\".* FROM \"users\" WHERE \"users\".\"foo\" = 0"
User.where(foo: :a)        # => #<ActiveRecord::Relation [#<User id: 1, foo: "a">]>
```

`where(foo: :a)` と自然に書けるようになっていることがわかります。

自分からは、よっぽどのことがないかぎり enum を使うことはないですが、必要になったときに自然に書けるのはありがたいです。
[Swift] UITableViewControllerで編集中かどうかで選択時の処理を変える

#[Swift] UITableViewControllerで編集中かどうかで選択時の処理を変える
```
class TimerController: UITableViewController, TimerAddControllerDelegate {
    
    var objects = [Any]()
    
    override func viewDidLoad() {
        super.viewDidLoad())
        self.navigationItem.leftBarButtonItem = self.editButtonItem
    }
    
    //画面遷移するかどうか検証する
    override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
        if identifier == "xxxIdentifier"
            && !tableView.isEditing {
                //TODO:編集中でなければ行う処理
                return false
        }
        //編集中はstorybordの画面遷移に従う
        return true
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any!) {
        //storybordの画面遷移前に呼ばれる
    }
    
    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }
    
    //編集ボタンが押されたときに何か処理する場合
    //override func setEditing(_ editing: Bool, animated: Bool) {
    //    super.setEditing(editing, animated: animated)
    //}
    
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            objects.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)
        }
    }
    
    override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
        return true
    }
    
    override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
        let object = objects[sourceIndexPath.row]
        if let index = objects.index(where: { return $0.id == object.id}) {
            objects.remove(at: index)
            objects.insert(object, at: destinationIndexPath.row)
        }
    }
    
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return objects.count
    }
}
トリガー数の上限について

初めまして。
GASで簡単なものを作ることしかしてない卵みたいなものですがほぼ自分のメモ代わりとして上げるようなものですので参考にはならないかもしれないですが何卒よろしくお願いします。

さてタイトルにも書いたトリガー数の上限ということですが先日GASのエラー通知メールが来ていたので確認するとトリガー数が上限になっているという旨のものでした。

トリガー数に上限があるとは考えてなかったので上限数を調べるスクリプトを作ってみました

```triggerLimited.gs

function triggerLimited() {
  
  var i = 0;
  
  for(;;)
  {
    
    try {
      ScriptApp.newTrigger("triggerLimited").timeBased().everyHours(3).create();
    } catch(error) {
      Logger.log(i);
      return;
    }
    
    i++;
  
  }
}

```
結果

>20.0


というわけで20が上限みたいです。

本当にやりたかったのは特定の日時で設定したトリガーが現在時刻より前だったら削除する。みたいなことをしたかったんですがそういうの取得できそうなものがないんですよね…
なので自動でトリガー生成する際にそのトリガーの実行日時をスプレッドシートへ送り連動させて削除しようとしたんですが上限わからなかったので調べた感じです。
ただその方法取ると実行に時間がかかりそうなのが難点ですね。

後Googleさん　キャッシュに関してもう少しなんとかならないですかね…どうにかしてキャッシュをずっと引き継いでいきたいんですけどどうにか方法はないものか
明日からMacを使うことになったら (ショートカットキーや初期設定について)

#これまでWindowsしか使ってなかったのにMacで仕事することになってしまった方向けに、操作で困らないように作ったメモです。

### 基本操作とショートカット
 
| 操作       |       コマンド | 
|:-----------------|------------------:|
| ファイルを開く | command + (↓ or O) |
| ファイル削除             | command + delete |
| ファイル複製           | command + d |
| エイリアス作成(windowsでいうショートカット) | command + l|
| ファイル情報を見る |command + i |
| 新規フォルダ作成 | command + shift + N|
| 選択しているファイルから上または下をまとめて選択 | option + shift + (↓ or ↑)|
| Applicationsフォルダを開く   | command + Shift A|
| 使用中のAppの環境設定を開く   | command + ,|
| スクリーンショット  | command + shift + 3|
| スクリンーンロック　| command + option + power(右上のボタン) |

### ターミナル

| 操作       |       コマンド | 
|:-----------------|------------------:|
| カーソルの右の文字を削除 windowsでいうbackspace | control + d|
| カーソルの右文字全てを削除する | control + k |
| カーソルの先頭に移動する| control + a |
| カーソルの末尾に移動する| control + e |
| 新しいターミナルタブを追加| command + t|
| ipアドレス確認 |ifconfig
| プロンプトのデフォルト表示変更 | ※1参照

※1
デフォルトだと ```xxxxxno_macbookpro $ ```みたいにプロンプトに
長々と表示されるので変更するとみやすい
.bash_profileに ```export PS1='\u \w $ '``` 追加
    (http://www.yoheim.net/blog.php?q=20140309)

### ファイル検索

| 方法       |       コマンド | 
|:-----------------|------------------:|
| Spotlightで検索 | control + スペース|
| ターミナルから検索 | mdfind -name [filename] ※hidden dirおよびhidden fileは検索しない |
| ターミナルから検索| find [path] -name [filename] これだと隠しフォルダも検索　ただ遅い |

### vi

| 操作       |       コマンド | 
|:-----------------|------------------:|
| 置換| %s/変更対象/変更後/g |
| 検索｜次検索| /検索文字列 　｜　n or N|
| カーソルの先頭に移動する| 0 |
| カーソルの末尾に移動する| $ |

### マシンのセキュリティ設定

| 項目       |  内容 | URL |
|:-----------------|------------------|------------------:|
| ファームパスワード| マシン本体を初期化しようとするときに、聞かれる。(Command + R のユーティリティで起動したとき) | https://support.apple.com/ja-jp/HT204455 |
| FileValut| ディスクの暗号化。パソコンからハードディスクを抜き出し、外付けHDDとして他のPCから読み出す可能性を防ぐ。|https://support.apple.com/ja-jp/HT204837|

### その他
- バックスラッシュ打ちたい時
Option + ¥

- Chrome
    - タブ移動 (Option+Comman + 矢印)

- Finderの設定を整える(デフォルトだと使いにくいので設定を変更)
以下を参照
https://matome.naver.jp/odai/2138629469334511401?page=2

- IDEとかでファンクションキー使いたい(Functionをファンクションとして使う)
http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-use-function-key-as-default-in-mac-os.html

他にも何か思い出したら随時足していきます。
Ruby on Railsの開発環境でPostgreSQLを利用する

開発環境でもPostgerSQLを利用したかったので導入した際の防備録です。

# 環境
Linux(Ubuntu)
Ruby 2.5.3
Rails 5.2.1.1  

## 補足
下記、コード記載部分の<>は、実際に入力する時は不要です。自分で決めるところを<>で現しています。

# PostgreSQL Account を作る
元々、PostgreSQLはInstall済みだったのでAccountの設定から始めました。

```
$ sudo -u postgres psql
postgres=# create role <username> with createdb login password '<password>';
postgres=# \q
```

# Rails new

```text
rails new <appname> -d postgresql
cd <appname>
```
# config/database.ymlの編集
```yaml:config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  # 以下、3行追加
  username: <username> # 設定したPostgreSQL Accountと同一のもの
  password: <password> # 設定したPostgreSQL Accountと同一のもの
  host: localhost
development:
  <<: *default
  database: appname_development # appnameのところは、rails new時のappnameになっているはずです。
test:
  <<: *default
  database: appname_test # appnameのところは、rails new時のappnameになっているはずです。

  # 以下、省略
```

# rails db:createでデータベースを作成
下記のrailsコマンドでconfig/database.ymlの内容でデータベースを作成してくれます。

```
rails db:create
```

以降、localhost:3000にBrowserでAccessしてrailsの画面が表示されたので問題ないかと思います。

# 参考
[インストールからRails-PostgreSQL環境を整える](http://qiita.com/torini/items/9952d91c4a7087b23481)
macOS Sierra と VMware Fusion で 英数 かな を使って日本語入力切り替えをする

# 結論

ATOKなどの日本語入力ソフトと⌘英かなを使う。
そして「かな」キーは~~`clear`~~ `^F13`に設定し、VMware Fusionのキーマッピングで~~`clear`~~ `^F13` => `変換` などのマッピングを登録する。


追記：`clear` は ダイアログで`Esc`と同様にキャンセル判定になるので使い勝手が悪かったのでCtrl+F13に変更。


# 経緯

VMware FusionでもMacと同じように「英数」と「かな」キーで日本語のオン/オフがしたい。でもゲストOSに「かな」が渡ってこない。キーイベントを監視しても反応が無いので、キーが対応していないとかじゃないっぽい。
昔もLinux版やWindows版のVMware Playerとかで同様の問題があったんだよね…。ああ、またかって感じでささっと設定できれば良かったんだけど、Macは「かな」の動作を変えるのが難しいらしい。



# 方法

まず [⌘英かな](https://ei-kana.appspot.com/)  を入れる。
設定は
![⌘英かな 設定](https://qiita-image-store.s3.amazonaws.com/0/43406/92f8cacd-8275-b0db-5c58-9f25f058cdc4.png)
こんな感じ。
キーボードに存在しないキーは、まず適当なキーを先に登録しておいて、`~/Library/Preferences/io.github.imasanari.cmd-eikana.plist` を`plutil`で編集する。
JSONにして編集してバイナリにして戻す感じで。
キーコードは http://hyslog.com/blog/2012/06/25/569 この辺を参考にするか `Key Codes` アプリで調べる。（flagsはよく分かってない。0にした。）
`plist`を変更した後は`sudo killall cfprefsd`で設定のキャッシュを削除する必要がある。

F14とF15は輝度の調節に使われているので効果が重複してしまう。F16はATOKのキー一覧に載ってなかったのでパス。
~~F13はゲストOSではPrint Screenになる。そのせいか、VMware Fusionのキーマッピングの設定が効かない。
他に使ってないキーは…と考えて、`clear`キーを選んだ。テンキーに付いているらしい。電卓アプリの`C （Clear）`で使うとか。~~

追記：ちょっとややこしいんだけども、日本語ONは`Ctrl+F13`に設定して、VMware Fusionのショートカットは`F13` => `変換` にするとうまくいった。
`F13`だけではターミナルで動かず、「かな」キーを`^F13`にしてもVMware Fusionのキーマッピングは`F13`にする必要があるみたい。VMware Fusionキーマッピングの装飾キーは、キーコードのflagsが送られてくるかどうかではなくて、実際にキーを押しているかどうかの判定っぽい。

キーリマップを設定したら、MacのATOKで「ひらがな入力文字種（あ）」に`clear`を設定する。
これでMacのホストOS側の設定は終了。（「かな」キーで日本語入力ONという普通の設定が完了）

VMwareの設定は
![VMware キーマッピング設定](https://qiita-image-store.s3.amazonaws.com/0/43406/a51ad009-dac5-0f33-1532-44c342d2594f.png)
こんな感じで。試行錯誤の跡が見られるな…。（他のはダメだった）

ここまですれば、あとはゲストOSで「かな」キーが「変換」として渡ってくるので、普通に設定できる。



ちなみに、「Mac OS ホスト キーボード ショートカットを有効化」にチェックを入れると普通に「かな」キーが使えるのだが、ゲストOSの`Command-Tab`などがMacに取られるので却下で。


# 感想

Mac超しんどい。
Linuxみたいにコマンドが使えるからって`xmodmap`のようなシステム的なものは無いのね。
キーマッピングが設定できるとか、VMware Fusionに「かな」が使えるとか、デフォルトの「かな」または「Control-Shift-j」が変更できるとか、このどれか一つでも出来れば苦労しなかったのに。
Bash on Ubuntu on Windows, Ruby, Python, Jupyterなどのインストール

##背景
パソコンの環境設定を変えているうちにCygwinでgnuplotやRubyのNarrayが使えなくなってしまったので、bashごと入れ替えてみることにしました。ついでにPythonやJupyterもインストールしてみました。
#Bash on Ubuntu on Windowsのインストール
こちらの記事を参考にさせていただきました。
<a href="http://qiita.com/Aruneko/items/c79810b0b015bebf30bb">Bash on Ubuntu on Windowsをインストールしてみよう！</a>
＜開発者モードに設定＞
「設定」→「更新とセキュリティ」→「開発者向け」を開いて「開発者モード」を選択します。
＜bashをコマンドプロンプトでインストール>
コマンドプロンプトを起動しbashと入力しEnterを押すとインストールが始まります。インストールには数分かかりました。

#Rubyのインストール
<a href="http://qiita.com/chimame/items/8130aa2c07a152a865b1">windowsのbashでRails環境を構築してみる。（Windows 10 Anniversary Update版）</a>
を参照してください。
無事にRubyをインストールできたら
```gem install narray```
と入力してNarrayをインストールしました。これでRubyでNarrayが使用できるようになりました。
gnuplotについては
```sudo apt-get install gnuplot-x11
gem install gnuplot```
と入力しました。
#Pythonなどのインストール
参考記事は
[3]<a href="http://qiita.com/dd511805/items/23891da61559405fd5f6">Bash on Ubuntu on WindowsでJupyter NotebookからTensorflowを実行する</a>
[4]<a href="http://qiita.com/toyolab/items/bccd03d4cb7795112ab6">Bash on Ubuntu on WindowsでTensorFlowを使うためのメモ</a>
です。
＜pyenvのインストール＞
```sudo aptitude install git
git clone https://github.com/yyuu/pyenv ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc```
と入力してpyenvをインストールします。
＜Anacondaのインストール＞
```pyenv install --list```
としてAnacondaの最新のバージョンを探し、3-4.4.0をインストールしてデフォルトの設定にしました。
```pyenv install anaconda3-4.4.0
pyenv global anaconda3-4.4.0
pyenv rehash```
<X11 GUI環境の整備>
https://sourceforge.net/projects/xming/
のページから
**/Xming-fonts/7.7.0.10/Xming-fonts-7-7-0-10-setup.exe** と
**/Xming-fonts/7.5.0.93/Xming-fonts-7-5-0-93-setup.exe** を
ダウンロードします。
そのあとにBash on Ubuntu on Windowsで以下のコマンドでX11を入れて、DISPLAYの設定も.bashrcに書きます。
```sudo aptitude install x11-apps
echo 'export DISPLAY=localhost:0.0' >> ~/.bashrc
source ~/.bashrc```
<matplotlibのインストール>
jupyterでグラフを表示させるためにはmatplotlibが必要なのでインストールします。
```sudo aptitude install libqtgui4
conda install matplotlib
conda install nomkl
conda update --all```
＜jupyterのインストール＞
```sudo add-apt-repository ppa:aseering/wsl
sudo aptitude update
sudo aptitude install libzmq3
conda install -c jzuhone zeromq=4.1.dev0
conda install jupyter```
このあと
```jupyter notebook --no-browser```
と入力するとbash上にアドレスが表示されるので、それをブラウザで開くとjupyter notebookが使えます。
＜Tensorflowのインストール＞
```conda install -c conda-forge tensorflow```
tensorflowも参考ページに従ってインストールしました。





##参考記事
以下の記事を参考にさせていただきました。

[1]<a href="http://qiita.com/Aruneko/items/c79810b0b015bebf30bb">Bash on Ubuntu on Windowsをインストールしてみよう！</a>
[2]<a href="http://qiita.com/chimame/items/8130aa2c07a152a865b1">windowsのbashでRails環境を構築してみる。（Windows 10 Anniversary Update版）</a>
[3]<a href="http://qiita.com/dd511805/items/23891da61559405fd5f6">Bash on Ubuntu on WindowsでJupyter NotebookからTensorflowを実行する</a>
[4]<a href="http://qiita.com/toyolab/items/bccd03d4cb7795112ab6">Bash on Ubuntu on WindowsでTensorFlowを使うためのメモ</a>
R List入門

R List入門
==========

リストは異なるデータ構造を複数個格納することができるデータ構造のこと。例えば、matrix, ベクトル, データフレーム, 数値などを混ぜて保存できる。

リストを作る
------------

list関数を使ってつくる

``` r
x <- list(m=matrix(1:6,nrow=2),v=1:10,chr=c("hi","hello"))
x
```

    ## $m
    ##      [,1] [,2] [,3]
    ## [1,]    1    3    5
    ## [2,]    2    4    6
    ## 
    ## $v
    ##  [1]  1  2  3  4  5  6  7  8  9 10
    ## 
    ## $chr
    ## [1] "hi"    "hello"

リストの例
----------

行列の固有値、固有ベクトルを計算した結果はリストで返却される.

``` r
m<- matrix(1:9,nrow=3)
m.eigen <- eigen(m)
m.eigen
```

    ## $values
    ## [1]  1.611684e+01 -1.116844e+00 -5.700691e-16
    ## 
    ## $vectors
    ##            [,1]       [,2]       [,3]
    ## [1,] -0.4645473 -0.8829060  0.4082483
    ## [2,] -0.5707955 -0.2395204 -0.8164966
    ## [3,] -0.6770438  0.4038651  0.4082483

``` r
class(m.eigen)
```

    ## [1] "list"

リストの要素数の取得はlength

``` r
length(m.eigen)
```

    ## [1] 2

リスト要素へのアクセス
----------------------

アクセス方法により、返り値がリスト型か、リストに格納されているデータ構造かが異なるので注意

-   listname\[n\]でリストのn番目にアクセスできるが、返り値はリスト型になる

``` r
m.eigen[1]
```

    ## $values
    ## [1]  1.611684e+01 -1.116844e+00 -5.700691e-16

``` r
class(m.eigen[1])
```

    ## [1] "list"

-   \[\[\]\]演算子を使うと、返り値がリスト内のデータ構造になる

``` r
m.eigen[[1]]
```

    ## [1]  1.611684e+01 -1.116844e+00 -5.700691e-16

``` r
class(m.eigen[[1]])
```

    ## [1] "numeric"

-   \[\]とリストの名前でアクセス

``` r
m.eigen["values"]
```

    ## $values
    ## [1]  1.611684e+01 -1.116844e+00 -5.700691e-16

``` r
class(m.eigen["values"])
```

    ## [1] "list"

返り値はリストになる

-   $とリストの名前でアクセス

``` r
m.eigen$values
```

    ## [1]  1.611684e+01 -1.116844e+00 -5.700691e-16

``` r
class(m.eigen$values)
```

    ## [1] "numeric"

返り値はリストにならない

リスト要素の名前を取得する
--------------------------

names関数を使う

``` r
names(m.eigen)
```

    ## [1] "values"  "vectors"
CrystalでMySQLを使う方法

###環境
- Ubuntu 16.04 LTS
- Mysql5.7自体はapt-getでインストール済み
    - パスワードなしで接続できるようにしてあります
- crenv
    - 0.23.0

###Crystal用にしたこと
1. `$ shards init`で`shard.yml`を用意
2. 以下を追記

    ```
    dependencies:
      mysql:
        github: crystal-lang/crystal-mysql
    ```

3. `$ shards install crystal-mysql`で使用可能になる
4. `shard.yml, shard.lock`のある階層で`$ crystal hoge.cr`を実行

###MySQLの準備
```sql

mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> use test;
Database changed
mysql> create table langs (id int, name varchar(32));
Query OK, 0 rows affected (0.01 sec)
mysql>  insert into langs (id, name) values (1, "Ruby"),(2, "Python"),(3, "Java");
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from langs;
+------+--------+
| id   | name   |
+------+--------+
|    1 | Ruby   |
|    2 | Python |
|    3 | Java   |
+------+--------+
3 rows in set (0.00 sec)
```

###コード
- テーブルの参照

```mysql_s1.cr
require "mysql"

DB.open "mysql://root@localhost/test" do |db|
  db.query "select id, name from langs" do |rs|
    puts "#{rs.column_name(0)}\t#{rs.column_name(1)}"
    rs.each do
      puts "#{rs.read(Int32)}\t#{rs.read(String)}"
    end
  end
end
```

```
$ crystal cr/mysql_s1.cr 
id	name
1	Ruby
2	Python
3	Java
```

- データの挿入

```mysql_s2.cr
require "mysql"

DB.open "mysql://root@localhost/test" do |db|
  db.exec "insert into langs values (?, ?)", 4, "Crystal"
  
  db.query "select id, name from langs" do |rs|
    puts "#{rs.column_name(0)}\t#{rs.column_name(1)}"
    rs.each do
      puts "#{rs.read(Int32)}\t#{rs.read(String)}"
    end
  end
end
```

```
$ crystal cr/mysql_s2.cr 
id	name
1	Ruby
2	Python
3	Java
4	Crystal
```

- データの更新

```mysql_s3.cr
require "mysql"

DB.open "mysql://root@localhost/test" do |db|
  db.exec "update langs set name = ? where id = ? ", "Whitespace", 4

  db.query "select id, name from langs" do |rs|
    puts "#{rs.column_name(0)}\t#{rs.column_name(1)}"
    rs.each do
      puts "#{rs.read(Int32)}\t#{rs.read(String)}"
    end
  end
end

```

```
$ crystal cr/mysql_s3.cr 
id	name
1	Ruby
2	Python
3	Java
4	Whitespace
```

- データの削除

```mysql_s4.cr
require "mysql"

DB.open "mysql://root@localhost/test" do |db|
  db.exec "delete from langs where id = ? ", 4

  db.query "select id, name from langs" do |rs|
    puts "#{rs.column_name(0)}\t#{rs.column_name(1)}"
    rs.each do
      puts "#{rs.read(Int32)}\t#{rs.read(String)}"
    end
  end
end
```

```
$ crystal cr/mysql_s4.cr 
id	name
1	Ruby
2	Python
3	Java
```

###参考にしたサイト
- [MySQLのrootパスワードの変更 - Qiita ](http://qiita.com/saicologic/items/4c103a399cffa4432635)のコメント
- [GitHub - crystal-lang/crystal-mysql: MySQL connector for Crystal] (https://github.com/crystal-lang/crystal-mysql)
- [RubyでMySQLを操作する - Qiita]( http://qiita.com/toshiro3/items/b65b2ad744d8f3ecc734)

###追記（2019/10/15）
DBにパスワードがある場合は、@kazto さんにコメントで指摘していただいたように

```cr
DB.open "mysql://root:password@localhost:port/test" do |db|
  # 処理
end
```

とすれば良いです。
【しずおかアプリ部】活動ログ　第41回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/ee800648-fa25-1829-20c3-bad9c2055d35.jpeg)

##■公式サイト##
[http://monolizm.com/shizuoka-app](http://monolizm.com/shizuoka-app)
「Slack」も利用しています。 shizuapp で検索し、ご参加ください。

##◾️参加申し込み##
しずおかアプリ部への参加申し込みは[こちら](https://shizuoka-app.connpass.com/)から

##■タイトル##
第４１回


##■開催日##
２０１７年７月１５日（土）　１６：００～１８：００


##■参加者##
１０名


##■活動内容（概要）##
・最近の話題の技術ニュース、告知
・保坂・部員さん「U-22プログラミングコンテストの企画について」
・部員さんプレゼン「3Dキャラクターがゲームで動くまでPart1」
・菅原プレゼン「Unityはじめるよ　～シェーダーをいじってみよう～」
・TEA BREAK　



##■活動内容（詳細）##

【実演・プレゼン】

**・最近の話題の技術ニュース、告知**
　・[Unity2017がリリースされた](https://blogs.unity3d.com/jp/2017/07/11/introducing-unity-2017/)
　・[OculusRiftが400ドルセール](http://vrinside.jp/news/oculus-rift-with-touch-is-399/)
　・[OculusがワイヤレスVRセットを2018に発売予定](http://gigazine.net/news/20170714-oculus-wireless-vr-headset/)
　・[静活、体感型ARエンタメ「HADO SHOOT!」静岡県のシネプラザサントムーンに展開](http://getar.jp/18602/)
<hr>


**・保坂・部員さん「U-22プログラミングコンテストの企画について」**
　　　U-22プログラミングコンテストに向けての企画相談。

　　　■企画概要
　　　　・タイピング練習と弾幕シューティングを組み合わせたゲーム
　　　　・ステージ開始前に１分間タイピングがあり自機の強化を行える
　　　　・シューティングステージは通常のシューティングゲーム
　　　　・ショップで強化、や機体の追加が可能

　　みんなからの意見として、
　　　・一分間タイピングで強化できる能力をプレイヤーが選択できる方法があるといい
　　　　（タイプする言葉で強化部位が変わるなど）
　　　・一分間タイピングとステージ（敵）の関連性を強めては
　　が上がった。

　　現状
　　　企画書、及び仕様書が完成していて、DXライブラリを使ってゲームを開発中。
　　　コンテストの締め切りまで約１ヶ月なので、残り期間は少ないが頑張ってほしい。

![DSC04471.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/02495dcd-5a97-393e-aded-07e9b2469b91.jpeg)


<hr>


**・部員さんプレゼン「3Dキャラクターがゲームで動くまでPart1」**
　　　「3Dソフトの操作」というよりは、「3Dキャラクター制作に必要な事」をまとめた話

　　　キャラクターデザインについて
　　　　・キャラクター作りの参考書籍 → 下記資料を参考 
　　　　・属性や要素を箇条書きしてPixivのタグで検索  →自分の好きな要素でまとめれば自然とできる 
　　　　・キャラクターメイキング機能のあるゲームの  キャラクターメイキングを利用してみる。 
　　　　・絵を描いてる人に発注してみる。  →発注するときのコツ → 下記資料を参考
　　　　・一次創作してる人の既存キャラから利用許可を得る  →権利に注意
　
　　　大事なことは、
　　　　　キャラクターのデザインを決めるのは、キャラの設定・ストーリーがあってこそ。
　　　ということ。

　　　プレゼンの中でおすすめ書籍、おすすめソフトなど、非常に勉強になることを話していただきました。

<hr>


**・菅原プレゼン「Unityはじめるよ　～シェーダーをいじってみる～」**
　　　カスタムシェーダーを作れるように、シェーダについて勉強た。
　　　前回に引き続きで、今回はシェーダーでモデルの頂点を動かしてみた。

　　　・草をチェーダーで揺らす
　　　・水面をシェーダーで揺らす

　　　ということを行った。

　　　●ポイント
　　　　・シェーダー内で_Timeを使えば時間が取得できるので、アニメーションに利用できる。
　　　　・草の根元は揺らさず、葉先を大きく揺らすために、揺らす幅にモデルの各頂点のY座標を掛け合わせた。
　　　　　※根元は0だから揺れず、葉先ほどYが大きくなるのでたくさん揺れる
　　　　・波の振幅のタイミングを頂点ごとにずらすため、三角関数計算でX座標、Y座標の位置を利用した。
　　　　・シェーダーでできるアニメーションはシェーダーで処理した方が高速（となる場合が多い）

<img width="1072" alt="スクリーンショット 2017-07-15 19.58.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/88105/3daaa2a4-08a0-e582-77bd-1c8a8e77bc92.png">


　　　　[第40回_プレゼン資料(～シェーダーをいじってみる～).pdf](http://monolizm.com/sab/pdf/第40回_プレゼン資料(～シェーダーをいじってみる～).pdf)　第40回の資料に加筆しました。
　　　　[プロジェクト一式](http://monolizm.com/sab/src/shader.zip)



<hr>





**・TEA BREAK**
・AdobeのCharcterAnimaterというソフトの実演
・プログラムのエラーの原因追求
・時期自作VRコンテンツの話
・モデリングの話
・Arduinoの話
![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/88105/d85288e9-5333-88d7-f315-337719bf9c24.png)
postgresqlについてのメモ1


## シーケンス操作

### setvalの第三引数

is_calledに注意。
初期化の際にはfalseにする。

http://qiita.com/EichiSanden/items/0155dcdf886ecb50aba2

## インデックスについて

まだほとんどわかってないので少しずつ学習。必要に応じて。

### 一意インデックスは、プライマリーキーやユニーク指定すると勝手にはられる

PostgreSQLで自動的にインデックスが生成される条件 - sternhellerの日記
http://d.hatena.ne.jp/sternheller/20090717/1247853538

一意インデックス
https://www.postgresql.jp/document/8.3/html/indexes-unique.html


### インデックスの種類

４種類あるっぽい。
デフォルトはバランスツリーインデックスで、キャッシュに使われる。
このb-treeは、順序の指定ができるらしい。

» PostgreSQLでインデックスを効率良く利用しよう TECHSCORE BLOG
http://www.techscore.com/blog/2014/12/04/postgresql%E3%81%A7%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E5%8A%B9%E7%8E%87%E9%AB%98%E3%81%8F%E5%88%A9%E7%94%A8%E3%81%97%E3%82%88%E3%81%86/

### アンチパターン

取り合えず三つだけなんとなく頭に入れておく

* whereで関数を使う時には注意
* indexは必要悪とも考えられる
* 2キーインデックスを有効活用するのがよい

PostgreSQLアンチパターン：インデックス関連の三本立て - Qiita
http://qiita.com/masudakz/items/6a9cfa1db7ab59ea75aa


## serial型とsequence

基本はserial型はsequenceを定義するのが楽になるが、実装は一緒。
細かい制御が必要ならsequenceかな。

PostgreSQL - PostgreSQLのserial型を使うデメリット(63038)｜teratail
https://teratail.com/questions/63038

技術/PostgreSQL/後付け"serial"設定方法メモ - Glamenv-Septzen.net
https://www.glamenv-septzen.net/view/725

> つまり"serial"にすると、シーケンスの生成や破棄がテーブルと連動するよう裏側で調整されます。


## in句とexist句

SQLを速くするぞ―お手軽パフォーマンス・チューニング
http://www.geocities.jp/mickindex/database/db_optimize.html#LocalLink-exists

## 他のテーブルに存在しない行を探す

他のテーブルに存在しない行を探すには - PostgreSQL 雑記 - postgresqlグループ
https://postgresql.g.hatena.ne.jp/pgsql/20110302

## mysqlからpostgresqlへきたときの概要メモ

あれ、元記事が見当たらなくなった。。

* テーブル操作のトランザクション
* join の代わりに非相関サブクエリを積極的に使う
* with 句を使ってサブクエリに名前を付けられます
* カラムにも別名を付けられます
* insert 文でレコードを挿入したときに、id や created_at の値を返すことができます。
* 生成したシーケンスに対し、以下の関数が使用できます。
    * currval() … 現在の値を取得する
    * nextval() … 次の値を取得する (現在値が 1 増える)
    * setval() … 値を設定し直す
*  auto_increment は serial 型で、カラムオプションではなくデータ型
* 'infinity' '-infinity' が使えます。
* generate_series() とは、連続した整数を生成する関数です
* 再帰 SQL とは、1 回のクエリで、1 つのテーブルに何度も select 文を実行するような機能です。
* インデックスを作るとき、全部の行ではなく、条件に一致した行にだけインデックスをつけることができます。
* インデックス作成時に、カラム名ではなく任意の式を指定できます。 これを「式インデックス」といいます (昔は「関数インデックス」と呼ばれてたようです)。
* 集約関数のひとつである array_agg() を使えば、1 : N のまま取り出せます。
* json_agg() を使うと、より複雑なデータ構造で取り出せます。
* 1カラムに複数の値を設定できる。Relational 的にはどうなの？と言われそうだが、実際便利なので仕方ない。
* JSON を表すデータ型。Relational 的にはどうなの？と言われそうだが、超絶に便利なので仕方ない。
* Listen/Notify Observer パターンとか、PubSub とか。
* 別システムの DB や CSV ファイルが、あたかもテーブルかのようにアクセスできる。
* PostGIS 位置情報を扱うときの定番。近距離を扱うだけなら必要ないかもしれないけど、たとえば東京-北京間の距離を計算するときは地球が楕円体であることを考慮する必要がある。そういうのをやってくれるライブラリ。
ARKitでタップした座標を検出する方法

# ARKitでタップした座標を検出する方法

## ARSCNView
ARを使う大前提のビュー。これがないと始まらないです。

storyboard上で紐付けを行ってください

```
class ViewController: UIViewController, ARSCNViewDelegate {
    @IBOutlet var sceneView: ARSCNView!
```

## UITapGestureRecognizer

現実世界の座標には、SCNVector3を用いて取得を行います。

UITapGestureRecognizerでタップ判定を登録し、タップしたポイントを取得します。

```
@IBAction func tappedSceneView(_ sender: UITapGestureRecognizer) {
// sceneView上でタップした座標を検出
let tapPoint = sender.location(in: sceneView)
let results = sceneView.hitTest(tapPoint, types: .existingPlaneUsingExtent)
let hitPoint = results.first
// 現実世界の座標に変換
let point = SCNVector3.init(hitPoint.worldTransform.columns.3.x,
                          hitPoint.worldTransform.columns.3.y,
                          hitPoint.worldTransform.columns.3.z)
```

認識した平面に対して座標を検出できるようになります。

※3次元なので、奥行きがz軸になりますので注意してください。
Macで自分のゲートウェイを確認する方法

- 環境
    - OS : macOS Sierra Virsion 10.12.5

### :crayon:route -n コマンド
```shell-session
$ route <-------------- 使えない
usage: route [-dnqtv] command [[modifiers] args]
$ route -n <-------------- 使えない
usage: route [-dnqtv] command [[modifiers] args]
$ route -n get 0.0.0.0
   route to: default
destination: default
       mask: default
    gateway: 192.168.0.1
<省略>
```

Thank u >> [Macでデフォルトゲートウェイの確認方法 | 日々修行](http://ytsuboi.jp/archives/182)

### :crayon:ip route コマンド
```shell-session
$ ip route
default via 192.168.0.1 dev en0
<省略>
```

### :crayon:netstat -rn コマンド
```shell-session
$ netstat -rn
Routing tables

Internet:
Destination        Gateway            Flags        Refs      Use   Netif Expire
default            192.168.0.1        UGSc           44        0     en0
<省略>
```

### :computer:Macの設定画面
[System Preferences] > [Network] > [Advanced]

![Screen Shot 2017-07-15 at 18.16.31.png](https://qiita-image-store.s3.amazonaws.com/0/159761/af64d1b8-8ce2-0539-8267-e85895b25fa6.png)![Screen Shot 2017-07-15 at 18.15.23.png](https://qiita-image-store.s3.amazonaws.com/0/159761/c7384753-434b-c27b-c112-6ac2f611991f.png)![Screen Shot 2017-07-15 at 18.16.06.png](https://qiita-image-store.s3.amazonaws.com/0/159761/05078cc8-a23f-529c-fabb-6f9a55f862e5.png)
想像以上に遅かったtoLocaleString

数値を3桁区切りにする方法として、`Number.prototype.toLocaleString`がありますが（[例](http://qiita.com/BEMU/items/93769e7ab84f6199b23f)）、これにはいくつかの欠点があります。

1. ロケールを明示しておかないと、思わぬ表記法になってしまう
2. Safariが未対応
3. **遅い**

サイトのJavaScriptをプロファイリングしている際に偶然気づいたのですが、`toLocaleString`で3桁区切りにするコードは、対応したどのブラウザでも、正規表現で同等なことを行うより、数十倍～ひどいときには1000倍の時間を要します。

```js
  // 想像を絶して遅い
  function test1(val) {
    return (+val).toLocaleString('ja');
  }
  
  // 意外とこっちのほうが高速
  function test2(val) {
        var arr;
        arr = String(val).split('.');
        arr[0] = arr[0].replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
        return arr.join('.');
  }
```

[jsPerf](https://jsperf.com/tolocalestring-number)で測定してみたところ、ChromeやFirefoxで数倍から数十倍、IEに至っては1000倍の速度差で正規表現で書いたほうが速い、という結果になりました。

## 結論
`toLocaleString`は、本当にロケールに合わせる時以外は不向き
[Python memo] 10進数から2桁の16進数を得たい

10進数を与えて、16進数を得る方法を考えます。
例として「227」というintを使って、16進数「e3」が欲しいなというのが下記です。

# hex関数を使う

普通に考えたらこうなんですが

```python
hex(227)
'0xe3'
```

`0x`が欲しくないです。
文字列的に置換してもいいんですが…

```python
hex(227).replace('0x','')
'e3'
```

なんだかすっきりしません

# 文字列フォーマットを使う

こういうのもあります

```python
'{:x}'.format(227)
'e3'
```

replaceよりは多少。。。

でもなんか、もう少しスマートにいかないものでしょうかー

# 参考

## 【追記】フォーマット済み文字列リテラル

コメントにて教えていただきました。
3.6以降であれば **フォーマット済み文字列リテラル** というのを使ってこのように書くことができるそうです。

```python
f'{227:02x}'
```

http://docs.python.jp/3.6/reference/lexical_analysis.html#f-strings

%による文字列フォーマットのより抽象度の高いやつという感じですね。
惜しむらくは、多くのDCCツールがまだ3系には対応していないことです。。。
待て2019年（でしたっけ

## 逆

```python
int('e3',16)
227

int('0xe3',16)
227
```

227からe3を得るには一手間かかりますが、e3からは一発で227が得られるんですよねー

## ドキュメント

- hex  
https://docs.python.jp/3/library/functions.html#hex
- int  
https://docs.python.jp/3/library/functions.html#int
- 文字列フォーマットの type x についてはこのへんに  
https://docs.python.jp/3/library/string.html#format-specification-mini-language
【ニューラルネットワーク】Dropout(ドロップアウト)についてまとめる

以下の記事は自身のブログ[Data Science Struggle](https://marubon-ds.blogspot.jp/)でも掲載予定。許可なき掲載とかではない。

# 概略
深層学習における技法の一つであるDropout(ドロップアウト)についての論文を読んだので、その仕組みを簡単にまとめる。 
Dropoutに関する論文を読んだのだが、最近読んだ論文の中だと地味に実践に活かせるエッセンスが多く、個人的に得るものが多かったのでまとめておきたくなった。

# Dropoutとは？
Dropoutとは、ニューラルネットワークの学習時に、一定割合のノードを不活性化させながら学習を行うことで過学習を防ぎ（緩和し）、精度をあげるために手法。 
ニューラルネットワークは訓練データに対するトレース能力に優れており、わりと簡単に過学習を起こしてしまうため、正則化やDropoutのような手法を用いることは重要である。 
具体的なDropoutのイメージは以下の図のようになる。 

![dropout_1.png](https://qiita-image-store.s3.amazonaws.com/0/122985/72425f90-66fd-1b6d-dd0e-c6393465dd81.png)


上記図の、色のついたノードが不活性化されている。 
学習時に特定のノードを不活性化させて、学習を進めていくことで、過学習を抑えながらパラメーターの更新を行える。 

# 論文を参考に具体的に見ていく
Dropoutによって得られる効用は以下の二つ

* 過学習の緩和
* 複数モデルの組み合わせによる精度の向上

具体的に以下の、入力層、隠れ層、出力層の3層からなるニューラルネットワークを考える。 

![dropout_2.png](https://qiita-image-store.s3.amazonaws.com/0/122985/715b41d9-9b32-41ec-cdb6-06583e7952cf.png)

この隠れ層にDropoutを仕込むと図では以下のように表すことができる。$Be\left( p \right )$と記されているノードがDropoutを表している。この図からわかるように、Dropoutによる不活性化の選択はDropoutを仕込んだ層の各ノードごとに対してなすことになる。 

![dropout_3.png](https://qiita-image-store.s3.amazonaws.com/0/122985/720c5edf-d117-2360-a978-ef81e61674ad.png)


数式で説明することを意識して図をより正確に描く。 

![dropout_4.png](https://qiita-image-store.s3.amazonaws.com/0/122985/eb5725f9-63c6-7a5e-5f79-bbc1a09fa4e7.png)



当該レイヤーのうちの指定割合だけノードを活性化させるのではなく、各ノードが活性化する確率が与えられる。上記の図を数式で表す。
$r_j^{\left( l\right) }\sim Bernoulli\left( p\right)$ 
$\tilde{y^{\left( l \right)}} = r^{\left( l \right)} \times y^{\left( l \right)}$ 
$z_i^{\left( l + 1 \right)}=w_i^{\left( l+1 \right)}\tilde{y^l}$ 
$y_i^{\left( l+1 \right)}=f\left(z_i^{\left( l + 1 \right)} \right)$ 

この式の$r$の部分が具体的にDropoutを表している。レイヤー内の各ノードに設置され、その値はベルヌーイ分布に従う。つまり、確率$p$で$1$,$1-p$で$0$となる。 
この場合は、$y_{i}^{\left( l\right) }$が確率$p$でそのまま次のノードの入力値となり、確率$1-p$で$0$を次のノードに与える。 
訓練時にはこのように、活性化されたノードと不活性化されたノードを持つ状態でパラメーターの更新を行い、テスト時には、そのパラメーターに上記で指定した$p$を掛ける。式で書くと$W_{test}^{\left( l\right) }=pW^{\left( l\right) }$となる。 
『複数のモデルの組み合わせ』とは要するに、訓練時に活性化してるノードによってできる異なるネットワークによる組み合わせのこと。$n$個のノードがある場合は$2^{n}$個のネットワークができうる。それらのネットワークでパラメータが更新されるため、『複数ネットワークによるパラメーター更新』となっている。 

# Dropoutのパラメーター調整
Dropoutは調整パラメーター$p$を持つ。この$p$の調整を行うとき論文内で試されていたのは以下の二つの設定。 

* そのレイヤーのノード数を固定してDropout率をいじっていく
* そのレイヤーのノード数を$n$としたときに$p \times n$を一定値に固定して$p$と$n$をいじっていく


一つ目の『そのレイヤーのノード数を固定してDropout率をいじっていく』というのは訓練時に活性化するノードの数をパラメーターで変化させて、AccuracyやLossを観測していく。二つ目の『そのレイヤーのノード数をnとしたときに$p \times n$を一定値に固定して$p$と$n$をいじっていく』というのは訓練時に活性化するノードの数を固定して、パラメーターを変化させて、AccuracyやLossを観測していく。 
実際にDropout以外の要素を固定して実験をしてみると、活性化しているノードが少ないと、データを食わせてもなかなか学習が進まないことが多い。かといって、活性化しているノード数が不活性化してるノード数に対して多過ぎれば容易に過学習が観測された。上記の二点の観点からDropoutのパラメーターを調整するのが実践的なのだろう。
また、おおよその目安として、inputを行った直後のDropoutは80%程度のノードが活性化されているのが好ましく、隠れ層は50%前後が活性化しているのが良いらしい。 

# 感想
個人的には以下の点が気になった、もしくは発見だった。 

* Dropoutのパラメータ$p$が、レイヤー単位ではなくノード単位に課せられているという点は知らなかった
* 論文ではDropoutのパラメータ$p$がactive nodeの割合パラメーターになっているが、Kerasだとdeactivated nodeの割合なのでKerasユーザーは論文を読むとき注意
* 言われればそうだが、Dropoutによりスリム化されたネットワークを組み合わせたことにより『複数モデルの組み合わせ』と考えたことはあまりなかった

# 参考論文
[Geoffrey E. Hinton](https://www.cs.toronto.edu/~hinton/)氏のページから閲覧可能なDropoutに関する論文。
論文内では、複数のデータセットに対してDropoutを仕込んだ時とそうでない時の精度の比較なども行われており、読んでおく価値は十分にある。
PowerShellからUnityを起動する　そしてログを標準出力stdoutに出力する

そして～のほうが本題です

20203/05/26 追記

Unity2023から以下のようなCLI向けのバイナリが追加されました。(Unity.com)こちらを使えば -logFile -オプションがちゃんと動作します。

```
C:\Program Files\Unity\Hub\Editor\2023.1.0b18\Editor\Unity.com
```

# 初めに #

諸事情でpowershellからunityを起動したくなった。
（つまりshはクソだしpythonやrubyはそこそこ面倒くさい）

で標準出力にUnityのログを出したい。
なぜかWindowsだと頑張らないと出せない…何故ログを標準出力に出すオプションをUnityちゃんは与えなかったのか…
というわけで1日くらい格闘の末安定してログを出せるようになったので記事にします。

AppleOSだとこんな感じで出せる
/Applications/Unity/Unity.app/Contents/MacOS/Unity -logFile /dev/stdout
~~きっとリンゴがなんかあくどいことしたに違いない~~

# 結論 #

最終的にこんな感じになった。

```powershell


```

# 仕組み #

材料1
unityのログファイルが出力されるまで待機して
ファイルができたらcat -tail 10 -waitで垂れ流すプロセス

材料2
unity起動するプロセス

材料1と2をそれぞれうごかしておしまい


# 試したこと #

## New-Itemでファイル作ってから監視する ##
while(!(Test-Path $logPath)){ Sleep -s 3 };
をやる前に普通にniでファイル作ってから監視すればいいじゃん？
と思って試したけどなんか監視が終わることが時々よくあったのでNG

ちなみにechoかなんかで適当なこと書いてからやろうとしたら文字コードの関係でログが大変なことになって爆死しました。

## unityは&で起動する ##

unityの引数がうまく渡らずNG
(できると思うんだけど…)


# 問題点 #

Ctrl+C強制終了してもプロセスが残る
finallyが一切finallyじゃないの何とかしてほしいですはい

~~trapも使えないし…~~
~~なんなん・・・~~

~~簡単に解決方法あれば教えてほしいです。~~

とりあえずbegin proecssに書き換えてある程度改善しました
Native WebRTCでもipadがしたい! (safari11 beta2)

#これは何?
Linux上にビルドしたlibwebrtcのプログラムと手持ちのiPad(safari11 beta2)でWebRTCがしたい!

そのためのnative-webrtcのビルド方法をまとめました。
(ソースコードは丸っと公開できないのでそのうちチュートリアル的に切り出したいと思います)

#必要なもの
iPad Air2 (iOS11 beta2をインストールしたもの)
Linuxマシン1台 (awsならsmallインスタンス以上、gceならsmallよりもう一つ良いものが必要)

#libwebrtcのビルド
ほぼ公式の手順と同じですが、そのままだとH264が有効にならないので設定します。

##Before You Start
ツールを入れてパスを通しておきましょう。
https://webrtc.org/native-code/development/prerequisite-sw/

##
```
mkdir webrtc-checkout
cd webrtc-checkout
fetch --nohooks webrtc
gclient sync
```

h264を有効にする

```
gn gen out/Default --args='rtc_use_h264=true use_openh264=true'
```
ヘッダーを書き換える (なんかフォーマットが違うみたい)

```cpp
vim src/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc

// 35行目を修正しましょう
const AVPixelFormat kPixelFormat = AV_PIX_FMT_YUV420P;
　↓
const AVPixelFormat kPixelFormat = AV_PIX_FMT_YUVJ420P;
```

ビルドする (メモリが4GB以上必要です)

```bash
cd src
ninja -C out/Default
```

ビルドが通ったら出来上がり!

#プログラム
client 既存のP2Pのソースなら pc.ontrack() を追加するだけでOKです。

```js
    pc.ontrack = function (evt) {
        console.log("ontrack.");
        if (evt.track.kind === "video")
          remoteView.srcObject = evt.streams[0];
    };
```

server peer_connection_clientを魔改造してなんとか作りましょう。
Elixirでドコモの雑談APIをワンライナーで叩く方法

Elixirでドコモの雑談APIを叩く方法

[ドコモの雑談API](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=dialogue&p_name=api_reference)


コマンドライン呼び出し

```
iex -S mix
```

## 肝心のワンライナー

HTTPoisonのライブラリが使用されている場合に使用可能です。

```
HTTPoison.post "https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=ドコモのAPIKeyを入力", "{\"utt\": \"こんにちは\", \"context\": \"s7e6x0JUIOihXrbNJ3qwSQ\" }", [{"Content-Type", "application/json"}
```

使用方法

uttの部分をこんにちは以外の文字列に変更して話をする。

下記のようなレスポンスが返ってきます。

```
 %HTTPoison.Response{body: "{\"utt\":\"こんにちはなでなで\",\"yomi\":\"こんにちはなでなで\",\"mode\":\"dialog\",\"da\":\"0\",\"context\":\"s7e6x0JUIOihXrbNJ3qwSQ\"}"
```


httpoisonのライブラリだけ使用する場合のmix.exs サンプル

```mix.exs 
defmodule Docomo.Mixfile do
  use Mix.Project

  def project do
    [app: :docomo,
     version: "0.1.0",
     elixir: "~> 1.4",
     build_embedded: Mix.env == :prod,
     start_permanent: Mix.env == :prod,
     deps: deps()]
  end

  # Configuration for the OTP application
  #
  # Type "mix help compile.app" for more information
  def application do
    # Specify extra applications you'll use from Erlang/Elixir
    [extra_applications: [:logger ,:httpoison]]
  end

  # Dependencies can be Hex packages:
  #
  #   {:my_dep, "~> 0.3.0"}
  #
  # Or git/path repositories:
  #
  #   {:my_dep, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
  #
  # Type "mix help deps" for more examples and options
  defp deps do
    [{:httpoison, "~> 0.12"}]
  end
end
```
redux-observableをtypescriptで使いたい。


RxJS自体はTypeScriptと相性は良いと思います。
RxJS自体がTypeScriptで作られているわけですし。

じゃあredux-observableはどうなんだろうとなりますが
意外とそうでもないです。
とくにofTypeがtypeScriptと相性が良くないです。
'typescript-fsa'がいい感じなので、対応してみました。

以下のコマンドでインストールします
```
yarn add typescript-fsa-redux-observable
```


使いかたはこんな感じ

```typescript
import { State } from 'reducers';
import { Epic, combineEpics } from 'redux-observable';
import * as actions from '../actions';
import * as Rx from 'rxjs';
import 'typescript-fsa-redux-observable';


export const loadAccountEpic: Epic<{}, State> =
    (actions$, state) => actions$.ofAction(actions.loadAccount.started) 
        .mergeMap((action) => {
            return fetchAccount$(action.payload.accountID)
            .map(resp => actions.loadAccount.done({
                    params: {accountID: resp.id},
                    result: [resp]
            }))
            .catch(err => Rx.Observable.of(actions.loadAccount.failed({
                params: {accountID: 0},
                error: err
            })));
        });

```

epicを書く時にofTypeではなくofActionを使いactionCreatorを指定できます。
ofTypeのときとは違いactionの型を認識できるので前より楽になりました。

<img width="678" alt="index_ts_—_taiya-ki-client.png" src="https://qiita-image-store.s3.amazonaws.com/0/3844/7fd2e4ca-0d4b-ed1f-4559-fbe677de145c.png">

こんな感じで型がわかるわけです。
Phalconのモデルでindex hintを使う

# はじめに
Phalconでもどんなframeworkでもですが、ORMを使うとIndex Hintを使う場合など、ちょっとカブいたSQLを書こうとしたらできなかったりしますよね。
だからって生PDOでSELECTしたらModelのfindを使った時とObjectが一致しないので、何かと不便です。
そういう時、Phalconなら、下記の方法で解決できますYO!

# before
find使うと、使ってほしいindexが使われないじゃないか！どうしょ・・

```php
$logs = Model\UserLog::find([
    "conditions" => "user_id = ?0 AND created BETWEEN ?1 AND ?2",
    "bind" => [$user_id, $from, $to],
    "order" => "created DESC",
    "limit" => 10
]);
```

# after
そういう時は、（ほぼ）生PDOで抽出して、Modelに結果をあてこんじゃいましょう。

```php
$model = new Model\UserLog();
$logs = new \Phalcon\Mvc\Model\Resultset\Simple(
    null,
    $model,
    $model->getReadConnection()->query(
        "SELECT * FROM user_log USE INDEX (idx_created) " .
        " WHERE user_id = ? AND created BETWEEN ? AND ? " .
        " ORDER BY created DESC LIMIT 10",
        [$user_id, $from, $to]
    )
);
```

まあ上記のようにサービスに書くくらいなら、Model側に書くべきですよね。。

# 小言
最近どのFWにも入ってるORMですが、オールドタイプなので何がいいのか未だに理解できないでいます。
【R】NAを含む演算

# IDごとの合計がNAになってしまう

## はいけい
↓みたいなデータを、Rの{dplyr}で整形をしていて、
**------BEFORE------**

| ID　| 年月 | dummy1 | dummy2 | dummy3 | 
|:----|----:|:------:|:------:|:------:|
| AA  | 201601| 1 | NA | NA |
| AA  | 201602| 1 | NA | NA |
| AA  | 201604| NA | 1 | 1  |
| BB  | 201601| 1 | NA | NA |
| BB  | 201604| NA | 1 | NA |
| CC  | 201601| NA | 1 | NA |
| CC  | 201602| NA | 1 | NA |
|...|


これを↓みたいにしたかった
(IDに対して、年月ごとのダミー変数の値をユニークにしたかった)

**------AFTER------**

| ID　| 年月 | dummy1 | dummy2 | dummy3 | 
|:----|:----:|:------:|:------:|:------:|
| AA  | - | 1 | 1 | 1 |
| BB  | -| 1 | 1 | 0 |
| CC  | -| 0 | 1 | 1  |



## もんだい

```r:test.R
library(dplyr)

#CODE1
df2 <- df%>%
　　　　group_by(ID)%>%
　　　　mutate(dummy1=max(dummy1),dummy2=max(dummy2),dummy3=max(dummy3))%>%
　　　　distinct(ID,.keep_all=TRUE)

#CODE2
df2 <- df%>%
　　　　group_by(ID)%>%
　　　　summarize(dummy1=max(dummy1),dummy2=max(dummy2),dummy3=max(dummy3))
 
```


↓の表が出来上がる😨😨😨😨 

| ID　| 年月 | dummy1 | dummy2 | dummy3 | 
|:----|:----:|:------:|:------:|:------:|
| AA  | - | 1 | NA | NA |
| BB  | -| 1 | NA | NA |
| CC  | -| 0 | 1 | 1  |


各IDごと、最初の行の情報が残るだけで思うようになってくれない

## 解決策


[Colorless Green Ideas ](http://id.fnshr.info/2016/10/05/r_na/)

に記載があった

> Rにおいて、NAが関わる演算は基本的にNAを返す

これのせいでした。
集計したあとでNAを0に置き換えればいいと思っていたのですが、先にやるべきでした😥

[とっとこ駆け出しエンジニアぶろぐ ](http://hamuhamuengineer.blogspot.jp/2014/09/r-na0.html?m=1)

を参考にさせていただいて…

```r:test2.R
library(dplyr)

#CODE1

df[is.na(now)] <- 0

df2 <- df%>%
　　　　group_by(ID)%>%　　　　mutate(dummy1=max(dummy1),dummy2=max(dummy2),dummy3=max(dummy3))%>%
　　　　distinct(ID,.keep_all=TRUE)

#CODE2
df2 <- df%>%
　　　　group_by(ID)%>%
　　　　summarize(dummy1=max(dummy1),dummy2=max(dummy2),dummy3=max(dummy3))

```

これで望みどおり、IDごとにそれぞれの月に分かれているダミーを反映して1行に変換できました。

**------AFTER------**

| ID　| 年月 | dummy1 | dummy2 | dummy3 | 
|:----|:----:|:------:|:------:|:------:|
| AA  | - | 1 | 1 | 1 |
| BB  | -| 1 | 1 | 0 |
| CC  | -| 0 | 1 | 1  |

## まとめ

R では、***NAを含む演算はNAを返す***

▶NAを先に埋めてからsummarizeとか、mutateとかするべき(今回のケースでは)
Azureって何？

# Azureって？
・マイクロソフトのクラウド プラットフォーム (PaaS/IaaS)
https://ja.wikipedia.org/wiki/Microsoft_Azure

# クラウドって？
  ・コンピュータネットワークをベースとしたコンピュータ資源の利用形態
のことらしい。

で、実際、何？って話なのですが、クラウドの種類を調べてみました。
クラウドの種類としては、主に以下の3つ
wikiから引用：https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0

## Saas
・Software as a Serviceの略
・パッケージソフトの提供。
・電子メール、グループウェア、CRMなど

## PaaS
・Platform as a Serviceの略
・アプリケーション実行用のプラットフォームを提供
・仮想化されたアプリケーションサーバやデータベースなど。
・ユーザーが自分のアプリケーションを配置して運用できる。
※ソフト屋としては非常に便利。細かいサーバーの調整とかはできないかもだけど、すごく楽にできそう。

## IaaS
・Infrastructure as a Service
・インターネット経由のハードウェアやインフラ
・サーバー仮想化やデスクトップ仮想化や共有ディスクなど。
・ユーザーが自分でOSなどを含めてシステム導入・構築できる。
※サーバーを借りて、インフラは気にしない感じですね。

# Azureはクラウドのどれ？
・で、上記の3種類を踏まえうえで、Azureは、どれに属するかというと、「Paas」「IaaS」が含まれます。

# Azureのサービスは？
・で、実際、Azureにどんなサービスがあるのか調べてみた。
※自分が興味のある部分しか調べてないです。

- 仮想マシン系
    - Linux 仮想マシン
    - Windows 仮想マシン
    - Virtual Machine Scale Sets
- App Service
    - Web Apps：.Netアプリとか、Javaアプリとか色々、うごくらしい。


なんとなく、こんな感じ。
golangのお勉強14+goa


## goagen jsでcreateしてみる

### jsのキャッシュ

どうも、うまく変更が反映されない。
require.jsのキャッシュかな。

### 自動採番

なぜか自動採番がうまく動かない？
キャッシュで反映されていないだけかも。。
どうせなので調べる。

結局はたぶんキャッシュで、むしろ基本が自動採番らしい。
ついでに知ったのは型を再定義できるらしい。へー。。

Golangのgormで、PrimaryKeyにUUIDを使う - Qiita
http://qiita.com/roothybrid7/items/dc58bae01f941e1a72be

> Primarykeyの型をintなどにしてしまうと、Auto increment固定なのが困るところです。
> ...
> type キーワードを使って組み込み型を再定義?できるので、UUIDという独自タイプを定義します。

自動採番じゃなくする場合。多分mysqlかな。

GORM で AUTO_INCREMENT でないプライマリキーを作成する - Qiita
http://qiita.com/tchssk/items/2b235a381a7970b62a0a

キャッシュについては下記だが、、js自体が自動生成されるので毎回つけることになるのかな。。うーむ。
`github.com/goadesign/goa/goagen/gen_js/generator.go`にジェネレートする内容は記載があるので、
フォークしたリポジトリをオレオレ更新するとか？うーむ。。
というか、この部分はどうせ吐き出したものを、そのまま使う箇所ではないか。。
うーん、どうしようか。

Memo, [JavaScript] RequireJSで読みこむファイルのキャッシュ対策 « イナヅマTVログ
http://www.inazumatv.com/contents/archives/8149


### DSLでタグをつける

Grailsというフレームワークではタグでシーケンス作成を指定するようにしているらしい。
gormaではtags()のコードを見たところ、DSLでは自由にタグはつけられない気がする。。どうだろう。
あ、sqltagはメソッドが用意されてているので、それでいいのかな。
gormのタグはつけられないけど。

```Go:relationalfield.go	
func tags(f *RelationalFieldDefinition) string {
	var sqltags []string
	if f.SQLTag != "" {
		sqltags = append(sqltags, f.SQLTag)
	}

	var gormtags []string
	if f.DatabaseFieldName != "" && f.DatabaseFieldName != f.Underscore() {
		gormtags = append(gormtags, "column:"+f.DatabaseFieldName)
	}
	if f.PrimaryKey {
		gormtags = append(gormtags, "primary_key")
	}
	if f.Many2Many != "" {
		gormtags = append(gormtags, "many2many:"+f.TableName)
	}

	var tags []string
	if len(sqltags) > 0 {
		sqltag := "sql:\"" + strings.Join(sqltags, ";") + "\""
		tags = append(tags, sqltag)
	}
	if len(gormtags) > 0 {
		gormtag := "gorm:\"" + strings.Join(gormtags, ";") + "\""
		tags = append(tags, gormtag)
	}

	if len(tags) > 0 {
		return "`" + strings.Join(tags, " ") + "`"
	}
	return ""
}
```

Grails 3.2.0 GORM does not create sequences for PostgreSQL · Issue #10234 · grails/grails-core
https://github.com/grails/grails-core/issues/new

GrailsのGORMとID管理とPostgreSQLのシーケンス - 豆無日記
http://nobeans.hatenablog.com/entry/20091030/1256896937

### gormのデータ型

gorm.AutoIntegerという型指定も用意されていたが、、primary指定できなかったので使うのをやめておく。

データ型
https://www.postgresql.jp/document/8.1/html/datatype.html

一応、UUIDも使ってみた。場合によっては検討か。。
serial型とシーケンス作成はほぼ同じというのはわかってるけど、
UUIDのことはあまりわかってない気がする。

* 予測しにくい方がいい時にはUUID
* 容量はUUIDの方がくう

Golangのgormで、PrimaryKeyにUUIDを使う - Qiita
http://qiita.com/roothybrid7/items/dc58bae01f941e1a72be

## DSL

### DSLの実装例

goa の API デザインの書き方 後編 (Resource と Payload) - 押してダメならふて寝しろ
http://ikawaha.hateblo.jp/entry/2016/09/14/194237

chat api

goaとxoでchat apiを作ってみた。 - Qiita
http://qiita.com/m0a/items/ab26b5d92b714860c909

### 気になるtrait

· goa :: Design-first API Generation
https://goa.design/reference/goa/design/apidsl/#func-trait-a-name-apidsl-trait-a

## putかpostかを（また）考える

PUT か POST か PATCH か？ - Qiita
http://qiita.com/suin/items/d17bdfc8dba086d36115

冪等性か。。ひとまずプロトタイピングでputでやってみてあとから調整しつつ考えよう。
「Qiitaのトップページでフィード、あるいはすべての投稿を閲覧した際、 前回の閲覧から新規に投稿された分を分かるようにしたい」小技

開いたとき、一番上(最初)の投稿を必ず閲覧する。
次回開いたとき、文字の色が、水色から紫色に変わっています。

stackoverflowとteratailは色の違いがわかりませんでした。

－－－－－－－－－－－－－－
【補足】(2017/09/16)
スマホだと
ブラウザを閉じずに、リロードする技がありました。
－－－－－－－－－－－－－－
【補足】(2017/10/22)
開いた時、かならず一個いいねをする技がありました。
右に緑マークがつきます
－－－－－－－－－－－－－－
【補足】(2018/01/06)
すべての投稿
https://qiita.com/items
SwiftでGenerics 仮型引数に複数protocol制約を付与する

#Outline
JavaのGenericsをSwiftで似たように表現する方法を調べました。
わかりやすいようにJavaと合わせて書きます。

#やりたかったこと
Javaで可能な仮型引数に複数Interface制約
`Hoge<T:InterfaceA & InterFaceB>`を実現したかった。

#結論
Swift3以降では Javaと構文としては同じだった。

```Container.swift
// Swift3
struct Container<T:ProtocolA & ProtocolB> {
    var val:T
}
```

```ContainerOldSyntax.swift
// Swift2 old syntax これでも可
struct Container<T> where T:ProtocolA, T:ProtocolB {
    var val:T
}
```

```Method.swift
class Hoge {
    func someMethodA<T:ProtocolA & ProtocolB>(val:T) {
    }
    func someMethodB<T>(val:T) where T:ProtocolA & ProtocolB {
    }
}
```
感想
Java Interfaceと似ている。
ただしできないこともあるので、Android/iOSで共通のAPIを持つそれぞれのライブラリを作成するときには要注意。