OmniAICreator/Qiita-1.07M huggingface dataset:
プレミアムフライデーに備えよう！Railsで次の月末の金曜日を取得する！

ちまたでプレミアムフライデーが話題になってたので、Railsでプレミアムフライデーの日付を取得するメソッドを作った。

```ruby

def next_premium_friday
  now = DateTime.now
  premium_friday = this_month_premium_friday(now)
  if now > premium_friday
    premium_friday = this_month_premium_friday(now + 1.month)
  end
  premium_friday
end

# 指定された日付と同じ月の月末の金曜日を取得するメソッド
def self.this_month_premium_friday(datetime)
  end_of_month = datetime.end_of_month
  case end_of_month.wday
  when 0..4
    difference_wday = -2 - end_of_month.wday
  when 5..6
    difference_wday = 5 - end_of_month.wday
  end
  premium_friday = end_of_month + difference_wday.day
end
```
del 一題

## 問

次のコードを実行すると何が起きるだろうか。
想定はPython 3.6。Python3なら挙動は同じと予想される。

```py3
# Python 3系
import traceback
org_print = print

def dontdothat(*args, **kwargs):
    raise RuntimeError("Don't do that")

try:
    print = dontdothat
    print('1')
except:
    org_print(traceback.format_exc())

try:
    del print
    print('2')
except:
    org_print(traceback.format_exc())


try:
    del print
    print('2')
except:
    org_print(traceback.format_exc())
```

回答は「解説」の後にある

## 解説

デバッグ中、広範な範囲で ``print()`` を使ってしまってそれを消したいので、それを無理やりランタイムエラーにしたい……なんていうことは、稀にはあるかもしれないとわずかながらに予想される。素直に ``ag`` とかで探せよと思うけど。

そういうときには ``print`` を上書きしてしまえば良い。ちなみに関数として上書きする必要すらなく、

```py3
try:
    print = None
    print('1')
except:
    org_print(traceback.format_exc())
```

でも良い。 関数と変数でラベル付けの仕方 (``def`` と ``=``) が異なるが、Pythonランタイムは背後で同じ仕組みで管理する。言い換えると ``def func()...`` と ``func = lambda ...`` は内部的には大差ないらしい (逆に何が違うのと言われてもわからん)。

この場合 ``del print`` はグローバル名前空間上にある``print``と``None``の関連付け消す。その下からビルトイン名前空間の本来の ``print()`` の実装がひょっこり頭を出す。

## 怖くない？

君も名前空間について勉強不足でPythonを使い続けているふれｎ

Pythonの名前空間を大まかに分けると「ビルトイン名前空間」「グローバル名前空間」「ローカル名前空間」になる。「ローカル名前空間」に属する名前空間は複数あり得る。関数の中に関数を定義して、さらにその中に関数を定義したりするケースが分かりやすい

```py3
a = 1  # グローバル名前空間
def func_in_global():
    a = 2  # ローカル名前空間
    def func_in_local():
        a = 3 # ローカル名前空間 (2)
        def func_in_local2():
            a = 4 # ローカル名前空間 (3)
            print(a)
        print(a)
        func_in_local2()
        print(a)
    print(a)
    func_in_local()
    print(a)
print(a)
func_in_global()
print(a)
```

さて、元々の ``print()`` は「ビルトイン」に属し、``del``では消せない。よって、冒頭のプログラムにおける3つ目の ``try〜except`` ブロックにおいては、そのせいで例外を送出する。「そんな名前ないんですけど〜」というちょっと直感に反するメッセージが出ることに注意しよう。

[delの仕様](https://docs.python.jp/3/reference/simple_stmts.html#the-del-statement)

> 名前の削除は、ローカルまたはグローバル名前空間からその名前の束縛を取り除きます。

いくら上書きして ``del`` してもこの方法でビルトイン名前空間の ``print()`` はいなくならない。

実行中のPythonランタイムから「本当に」組み込み関数 ``print()`` を葬り去りたいのなら、多分こうするんだと思う。

```py3
import builtins
del builtins.__dict__['print']
print('hello')
```

ただ、これはヤバいので止めよう。

```py3
>>> len(builtins.__dict__)
152
>>> builtins.__dict__.clear()
>>> len(builtins.__dict__)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'len' is not defined
>>> builtins.__dict__.__len__()
1
>>> builtins.__dict__
{'_': None}
```

 '_' 残像にアンダーバーを

## 回答

```shell-session
$ python /tmp/suppress_print.py
Traceback (most recent call last):
  File "/tmp/suppress_print.py", line 9, in <module>
    print('1')
  File "/tmp/suppress_print.py", line 5, in dontdothat
    raise RuntimeError("Don't do that")
RuntimeError: Don't do that

2
Traceback (most recent call last):
  File "/tmp/suppress_print.py", line 21, in <module>
    del print
NameError: name 'print' is not defined
```
Excel のシート名に使えない文字について再考2017

何をいまさらとか思われた方、命取りですよ～

今、Excelのシート名に使えない文字　で検索すると以下の情報がひっかかります。

[XL2003]シート名に関する仕様および制限について
https://support.microsoft.com/ja-jp/help/436482


自作ソフト RelaxTools Addin には「シート管理」という機能がありシート名を変更可能なのですが、上記の情報をごくんごくんと「鵜呑み」にしており、あるユーザさんから指摘を受けました。

> 「’」(シングルコーテーション)を入力すると実行時エラーになりますよ

んな、馬鹿な！ちゃんとMicorosoft の情報でちゃんとチェックしてるしー　とか思いシングルコーテーションを入力してみると、見事実行時エラーになる。
なんで～？　とか思い修正すると、また指摘。

> 「＇」(全角のアポストロフィ)を入力すると実行時エラーになりますよ

なん...だと　こりゃモグラたたきになっちゃうな　と思い、先日ちょっと調査をしてみました。以下、プログラムを Excel 2010 と Excel 2016 で実行してみました。

```vb.net:シート名でエラーになる文字調査
Sub check()

    Dim i As Long
    
    On Error Resume Next
    For i = &H0 To &HFFFF&
        Err.Clear
        ThisWorkbook.Worksheets(1).Name = ChrW(i)
        If Err.Number <> 0 Then
            Debug.Print "&H"; Right$("0000" & Hex(i), 4) & " " & ChrW(i)
        End If
        
    Next

End Sub
```

以下の文字でエラーとなりました。とりあえずはこれらをチェックすれば良さそうです。

|No.|UNICODE|文字|
|---|---|---|
|1|U+0000| |
|2|U+0027|'|
|3|U+002A|*|
|4|U+002F|/|
|5|U+003A|:|
|6|U+003F|?|
|7|U+005B|[|
|8|U+005C|\|
|9|U+005D|]|
|10|U+2019|’|
|11|U+FF07|＇|
|12|U+FF0A|＊|
|13|U+FF0F|／|
|14|U+FF1A|：|
|15|U+FF1F|？|
|16|U+FF3B|［|
|17|U+FF3C|＼|
|18|U+FF3D|］|
|19|U+FFE5|￥|

シングルコーテーション、アポストロフィ、全角の￥とは別に、全角のバックスラッシュあたりが意外なところです。

ネットの情報（本家であっても）は検証しないとダメですね～　というお話でした。
おまけで、シート名のチェック処理VBAを載せておきます。

```vb.net:シート名不可文字チェック
Function IsErrSheetNameChar(ByVal strBuf As String) As Boolean

    Dim lngChar As Long
    Dim i As Long
    Dim bytBuf() As Byte
    
    IsErrSheetNameChar = False
    
    '空はエラー
    If Len(strBuf) = 0 Then
        IsErrSheetNameChar = True
        Exit Function
    End If
    
    '履歴は予約語なので
    If strBuf = "履歴" Then
        IsErrSheetNameChar = True
        Exit Function
    End If
    
    bytBuf = strBuf
    
    For i = LBound(bytBuf) To UBound(bytBuf) Step 2
    
        lngChar = LShift(bytBuf(i + 1), 8) + bytBuf(i)
    
        Select Case lngChar
            'エラーになる文字'*/:?[\]’＇＊／：？［＼］￥
            Case &H0&, &H27&, &H2A&, &H2F&, &H3A&, &H3F&, &H5B&, &H5C&, &H5D&, &H2019&, &HFF07&, &HFF0A&, &HFF0F&, &HFF1A&, &HFF1F&, &HFF3B&, &HFF3C&, &HFF3D&, &HFFE5&
                IsErrSheetNameChar = True
                Exit Function
                
        End Select
    
    Next

End Function
'------------------------------------------------------------------------------------------------------------------------
' 左シフト
'------------------------------------------------------------------------------------------------------------------------
Function LShift(ByVal lngValue As Long, ByVal lngKeta As Long) As Long
    LShift = lngValue * (2 ^ lngKeta)
End Function
```

フリーソフトを作っています。
Excelを便利にする250以上の機能を体系化したアドインはこちらです。
「RelaxTools Addin」窓の杜大賞受賞ソフト
http://software.opensquare.net/relaxtools/
migration referencesで定義したいフィールド名とforeign_keyのテーブル名が異なっている時の書き方

referencesにforeign_keyを指定すると外部キー制約が作れるが、フィールド名と異なっている場合は以下のように書く。

```
class CreateMessages < ActiveRecord::Migration
  def change
    create_table :messages do |t|
      t.references :sender
    end
    add_foreign_key :messages, :users, column: :sender_id
  end
end
```

これで実用には困らないが、何とかreferencesの一行にうまく書きたい。いろいろ調べたところ foreign_keyに `{to_table: :users}` というのを与えればできることがわかった。

see. http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_reference


```
class CreateMessages < ActiveRecord::Migration
  def change
    create_table :messages do |t|
      t.references :sender, foreign_key: {to_table: :users}
    end
  end
end
```
RazorEngineを通常のアプリで使用する際のメモ書き

通常のC#アプリでRazorEngineを使うときに毎回ハマることがあり、毎度同じことを調べているので、今回は忘れないうちにメモ...

**RazorEngineを使うとき、関連dllはbin\にコピーしておく**

# RazorEngineをMVC以外で使用する際のメモ

RazorEngineの基本的なところは下記を参照

RazorEngine の使い方 〜それなりな応用編〜
http://normalian.hatenablog.com/entry/20130514/1368525761

で、NugetでRazorEngineを導入し、cshtmlからhtmlを書き出すところまではいいんだけど、cshtmlでRazorEngine.dllや参照しているdllを認識してくれなくてcshtmlのエディタ画面が真っ赤っかになる。

よくある解説サイトでは下記コードをアタマに入れろと良く記載されているが、これすらエラーとなり、詰む。
```@inherits TemplateBase<MessageModel>```

RazorEngine.dllをbin\に入れると無事にIntellisenseが認識する。

後は世の中の解説サイト通りにやればよい。

メモ追記:
VisualStudio Community→問題なし
VisualStudio Express desktop→cshtml未対応
VisualStudio Web→cshtml対応

職場でExpressを使う必要がある場合、cshtmlエディタはWebにしかついていないので、WebとDesktop両方必要になる
以上
新米iOSエンジニアの広告用語集〜アドテクノロジー編〜

iOSエンジニアに転職してもうすぐ２ヶ月。
今回は、社内でよく聞くアドテクの用語をメモしておく。多分随時追記。

##純広告時代

###純広告
各媒体が自前で提供する広告枠。
Yahoo!JAPANのトップページ右端のレクタングル広告など。
対義語はネットワーク広告。

##アドネットワーク時代

###アドネットワーク
広告配信ネットワーク。広告主はアドネットワークを使うことによって、アドネットワーク内の複数のWebサイトに一括で広告を配信できる。
アドネットワークの出現により、個人HPやブログなどにも簡単に広告を載せて収益を得ることができるようになった。
記事の内容やサイト訪問者の属性などによって表示される広告が変わる。

代表的なアドネットワーク
・Google Adsence

##アドエクスチェンジ時代

###アドエクスチェンジ
アドネットワークが登場して２年後（２０１０年）に登場した、「広告枠」取引市場。
広告主は、株式市場で株を取引するように広告枠を入札する。「広告枠」の仮想オークション会場とも言える。
RTB（Real Time Bidding）という仕組みで、広告枠が表示されるタイミングでリアルタイムに入札が行われ最も高い掲載価格で入札した広告が表示される。
単価は、クリック単価制ではなくインプレッション単位でいくらというもの。

代表的なAdExchange
　・Double Click AdExchange
　→ Googleが運営する世界最大のアドエクスチェンジ。
・Facebook Adexchange

##DSP・SSP時代
DSP(Demand-Side-Platform)、SSP(Supply-Side-Platform)は、アドエクスチェンジ内だけではなく、複数のアドエクスチェンジとアドネットワークを跨いで、RTB(Real Time Bidding)を行う為のプラットフォーム（ツール）。

###DSP(Demand-Side-Platform)
DSPは広告主側が利用する広告配信プラットフォーム。

代表的なDSP
・FreakOut

###SSP（Supply-Side-Platform）
広告枠を提供する媒体側が利用するプラットフォーム。

代表的なSSP
・GENIEE
・AD GENERATION

###DSPとSSPの連携
SSPは広告の表示時に、訪問者をカテゴライズし（４０台女性とか）、その情報をDSP側に伝える。DSP側では、広告主の間でオークションが行われ、最も高い金額を提示した広告主の広告がSSP側に送られ表示される仕組み。
これが全てリアルタイムで行われる。
CentOS 7.3 インストール後の設定メモ　その2　VMWare Toolsのセットアップ編

# 概要
色々とハマりました、諸先輩方のトラブルシュートが大変参考になりましたので忘れないようにメモっておきます。

現在、VMWare Toolsは本家のvmware.comが配布している版とオープンソース版のopen-vm-toolsの2種類があるようです。
vmware.comは今後はopen-vm-toolsの使用を推奨しているようですがCentOS 7.3にデフォルトでインストールされているopen-vm-toolsでは肝心の共有ディレクトリ機能（Windows上の特定ディレクトリとCentOS上の特定ディレクトリを同期する機能）やクリップボード共有機能（CentOS上でコピーした文字列をWindows上でペースト出来る、勿論逆も可能）といった個人的超絶重要機能が利用できなかった為、本家のVMWare Toolsを入れることにしました。

# 試したこと
VMWare Tools,open-vm-toolsを入れる際は前のtoolsをアンインストールしながら入れ替えていきました。
### プレインストールのopen-vm-tools
OSインストール時に自動で入ったopen-vm-toolsですが上記理由により却下
### VMPlayer の機能を利用した VMWare Toolsのインストール
下記のVMPlayerの標準機能を利用したVMWare Toolsのインストールを行いました・・・が、駄目っ
![screenshot_13.png](https://qiita-image-store.s3.amazonaws.com/0/167523/89f51716-c12f-f4ce-7c91-56df94584b5d.png)
（画面上再インストールになっていますがtoolsがインストール済出ない場合はインストールになります）
### open-vm-toolsの最新版をインストール
yum コマンドからインストール（リポジトリの追加とかしたと思います・・・）・・・が、駄目っ
### vmware.comから最新のVMWare Toolsを入手してインストール
この手順で無事、共有ディレクトリ、クリップボード共有が有効になりました。

# 手順
ということで、最後の手順だけをまとめます。
但し、私の環境は試行錯誤の上完成したので下記の手順の通りにインストールを行ったとしても上手く行かないかもしれません。その場合は・・・頑張ってください( •̀ㅁ•́;)

+ Toolsのアンインストール
rootになって下記のコマンドを実行

```
$ yum remove open-vm-tools
```
+ VMWare Toolsを入手下記サイトからダウンロードします（要認証）

https://my.vmware.com/group/vmware/details?downloadGroup=VMTOOLS1010&productId=491

+ zip版をダウンロード

![screenshot_14.png](https://qiita-image-store.s3.amazonaws.com/0/167523/6e631b49-4646-972a-0a34-2b1556812bd7.png)


+ ZIPを解答してISOファイルをマウントします。VMware-Tools-10.1.0-core-4449150\vmtools\linux.iso
![screenshot_15.png](https://qiita-image-store.s3.amazonaws.com/0/167523/c90e0c21-c294-6ab1-0c31-e605be5a0a69.png)
![screenshot_16.png](https://qiita-image-store.s3.amazonaws.com/0/167523/7e093116-873d-b16e-c549-8b774a8e114b.png)

成功した場合は下記のようになります。上手くマウントできなければOS再起動
![screenshot_17.png](https://qiita-image-store.s3.amazonaws.com/0/167523/9d7053e0-4031-d6b0-5357-c5a36ebdceb5.png)

+ GCCとkernel-develをインストール

最後のkernel-devel-以降はuname -mr実行結果を入力します。yum install kernel-devel-$(uname -mr)ってやっても良いと思います。

```
[appuser@localhost ~]$ su -
パスワード:
最終ログイン: 2017/02/26 (日) 09:40:26 JST日時 pts/0
[root@localhost ~]# yum install gcc
[root@localhost ~]# uname -mr
3.10.0-514.6.2.el7.x86_64 x86_64
[root@localhost ~]# yum install kernel-devel-3.10.0-514.6.2.el7.x86_64 x86_64
```

+　VMWare Toolsをインストール（やっとだよ！）

引き続きrootで作業します

```
[root@localhost ~]# mkdir /tmp/work
[root@localhost ~]# cp /run/media/appuser/VMware\ Tools/VMwareTools-10.1.0-4449150.tar.gz /tmp/work/
[root@localhost ~]# cd /tmp/work/
[root@localhost ~]# tar zxvf VMwareTools-10.1.0-4449150.tar.gz
[root@localhost ~]# ./vmware-tools-distrib/vmware-install.pl
```

+ インストーラーがこけずに流れたらOS再起動

お疲れ様でした！無事完了でといいな（ボソ）

# 参考にしたサイト
本当に助かりました。ありがとうございました！！

[Windows8にVMWare PlayerつっこんでCentOS 7.2 を入れた話](http://gntm-mdk.hatenadiary.com/entry/2017/01/14/123038)
[CentOS 7.3 & VMware Tools でファイル共有機能の不具合](http://www.ookawara.com/archives/3620)
[CentOS7にVMwareToolsをインストールしてみた（備忘）](https://mottimoti.net/2015/09/24/centos7%E3%81%ABvmwaretools%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%EF%BC%88%E5%82%99%E5%BF%98%EF%BC%89/)
「実践Vim」を読んで得られた考えをまとめてみた2（挿入モード・ビジュアルモード）

# はじめに

この記事は「実践Vim」を読んで得られた気付きや考え方を書籍の内容に沿ってまとめています。
何度かに分けて書いていますので関連記事も是非！

- [「実践Vim」を読んで得られた考えをまとめてみた1（ドットコマンド・ノーマルモード）](http://qiita.com/sfp_waterwalker/items/822bdcccb1b31f4b82ad)
- [「実践Vim」を読んで得られた考えをまとめてみた2（挿入モード・ビジュアルモード）](http://qiita.com/sfp_waterwalker/items/7558e80b0a7f6b36019e)
- [「実践Vim」を読んで得られた考えをまとめてみた3（コマンドラインモード）](http://qiita.com/sfp_waterwalker/items/22f30277de14fbb4ec4f)

# 各TIPのまとめ

## 第3章 挿入モード

### TIP13： 挿入モードで簡単修正

**→挿入モードからコマンドで文字削除**

挿入モードで打った文字を削除するときに、Backspaceの代わりにコマンドが使えます。
実はVim特有のコマンドではなく、シェルでも使えるコマンドです。
※他のテキストエディタで試したら、別のショートカットに邪魔されて使えませんでした。

- \<C-h\> → 直前の1文字削除
- \<C-w\> → 直前の1単語削除
- \<C-u\> → 行頭まで削除

### TIP14： ノーマルモードへの復帰

**→挿入ノーマルモード**

挿入モードで\<C-o\>を押すとノーマルモードに戻ります。
これだけだとescや\<C-[\>と変わらないのですが、\<C-o\>でノーマルモードに戻ってから移動のコマンドを押すと、**挿入モードに入るコマンド（iやaなど）を押さずに挿入モードに入ります**。
個人的にはあまり使いこなせていません。

### TIP15： 挿入モードから抜けないでレジスタから貼り付け

**→挿入モードからテキスト貼り付け \<C-r\> 0**

挿入モードで\<C-r\> レジスタでレジスタの内容を挿入モードの途中で書き出すことができます。
書き出す対象が複数行だと使いにくいと思われ、個人的にはあまり使っていません。
改行のない1単語程度の書き出しならばありかもしれません。

### TIP16： 簡単な計算をその場で実行

**→挿入モードからのエクスプレッションレジスタでそのまま計算 Ctrl+r =**

## 第4章 ビジュアルモード

### TIP20： ビジュアルモードとは

**→ヴィジュアルモードは範囲指定をしてからオペレータコマンド**

Vimはオペレータコマンドとモーションコマンドの組み合わせという考え方をしますが、ビジュアルモードは例外です。
モーションコマンドに相当する範囲選択を先に行ってからオペレータコマンドで操作します。
範囲の指定と実際の編集の順序が逆になっています。

### TIP21： ビジュアルな選択範囲の定義

**→ビジュアルモードは3種類（文字指向・行指向・ブロック指向）。gvを使って範囲選択の繰り返し、oでトグル。**

特にブロック指向はよく使います。
例えば複数行の最初や最後に文字を追記するときに手軽な手段として使えます。

### TIP22： 行指向のビジュアルモードコマンドを繰り返す

**→ビジュアルモードでも.を使える**

ビジュアルモードのからのモーション繰り返しは前回と同じ選択範囲に対して適用されます。
行指向のビジュアルモードが使いやすいです。
インデントや削除などに特に使えます。

### TIP23： 可能ならばビジュアルコマンドではなくオペレータを優先しよう

**→ビジュアルコマンドよりもオペレータの方が定形処理をやりやすい**

オペレータコマンドで処理する方が繰り返し処理はやりやすいです。
.やマクロにビジュアルコマンドが絡んでいると、文字数が少し違っただけで求める編集結果にならないこともあります。
とはいえ、ビジュアルコマンドは文字通り選択範囲が見えますし、オペレータコマンドでは選択が難しい範囲の選択が可能です。
オペレータコマンドでできないかをまず考えて、難しそう、あるいは考えるのに時間がかかり過ぎる場合はビジュアルコマンドを使うとよいでしょう。
GUIとCUIの関係に似ています。

### TIP24： ブロック指向のビジュアルモードで表形式のデータを編集

**→ブロック指向のビジュアルモードは、縦方向の編集が楽になる**

Vimに限りませんが、縦方向に選択範囲を取って編集ができると効率がアップします。Vimではブロック指向のビジュアルモード（\<C-v\>）で実現できます。
1行の途中に「,」を入れるときなど、.を使ってもしんどいでしょうから、こんなときはビジュアルモードの出番です。
ブロック指向ビジュアルモードで編集しやすくするために、指定した文字で行揃えを行うvim-easy-alignというプラグインもオススメです。

### TIP25： テキスト列の変更

**→ブロック指向のビジュアルモードは、縦方向の編集が楽になる**

TIP24と同じです。

### TIP26： 矩形状ではないビジュアルな選択範囲にテキストを追加

**→ブロック指向ビジュアルモードは、矩形以外にもできる**

例はスクリプトの行末に「;」を入れる処理ですが、私も頻繁に活用します。
「$」を使うことで各行末に選択範囲を広げることができます。
このとき、行末が揃ってなくても各行は行末まで選択できるので、結果的に矩形以外が選択されることになります。
この状態から後ろへの文字追加が非常に便利です。
Paper > link > Mixture Density Networks with TensorFlow > the capacity to predict a range of different output values for each input

100 input, 100 outputの学習を試行していて、あまり進展がよろしくない。

関連論文をDeep Learning中。

その中で、気になったのが以下。
http://blog.otoro.net/2015/11/24/mixture-density-networks-with-tensorflow/

### キーワード

- the classic Mixture Density Networks (Bishop ’94) model
  - a Mixture Density Network (MDN)
- to fit a noisy sinusoidal data
- epsilon:  standard gaussian random noise
- the fancy RMSProp gradient descent optimisation method
- a one-to-one, or many-to-one function
- **What we want is a model that has the capacity to predict a range of different output values for each input** 

ここまで読んで概要として掴んだことは、
1つの入力値に対して複数の出力値がある場合(例として、sine curveを横転したもの）では従来のneural networkでは学習が失敗する。
Mixture Density Networksだと「1つの入力値に対して複数の出力値がある場合」の学習ができているようだ。

- the network is to predict an entire probability distribution for the output
- MDNs can also used to model handwriting, where the next stroke is drawn from a probability distribution of multiple possibilities, rather than sticking to one prediction.
- Mixture Gaussian distributions
  - the output value is modelled as a sum of many gaussian random values
  - each with different means and standard deviations
- a probability distribution function (pdf) of `P(Y = y | X = z)`
- a restriction that the sum of `PI_k(x)` add up to one
- we will use a neural network of one hidden later with 24 nodes, and also generate 24 mixtures, hence there will be **72 actual outputs** of our neural network of a single input.
- Z is a vector of 72 values
  - into three equal parts, Z{0to23}, Z{24to43}, Z{44to71}
- the softmax and exponential terms have some theoretical interpretations from a Bayesian framework way of looking at probability
- loss function
   - A more suitable loss function is to minimise the logarithm of the likelihood of the distribution vs the training data:
   - **for every  (x, y)point in the training data set, we can compute a cost function**
   - a similar approach, but with non-discretised states.
   - `def get_lossfunc(`
-  there would be room for performance improvements by building a custom operator into TensorFlow with the pre-optimised gradient formulas for this loss function

ここまでの理解としては（間違っているかもしれない）

- 1つのxに対して複数のyが与えられる場合に対して、MDNを使った
- MDNにより、(x,y)座標の各点に対してloss functionを最小化するように学習する

座標の分解能をどれくらい取るかで結果の精度も変わるのかもしれない。
Temporary Object の寿命

RefCell を使っていて Temporary Object の寿命を意識する瞬間があった．

```rust
use std::cell::RefCell;
use std::ops::DerefMut;

struct S { i: i32 }

fn main() {
    let cell = RefCell::new(S {i: 777});

    // a. これはコンパイルエラーになる．
    let borrowed = &mut cell.borrow().deref().i;

    // b. これはコンパイルエラーにならない．
    let borrowed = &mut cell.borrow().i;
}
```

a と b でやっている事はほとんど同じだ．

1. `RefCell` から `Ref<S>` を取得
2. `Ref<S>` から生の参照 `&S` を取得
3. `&S` からメンバへの参照 `&i` を取得
4. それを `borrowed` へ代入

違うのは a が `deref()` を よんで `Ref<S>` から生の参照を得ているのに対し， b が [deref coercions](https://doc.rust-lang.org/book/deref-coercions.html) を使って `Ref<S>` から直接メンバ `i` への参照を得ている点だ．b で省略された `deref()` 呼び出しはコンパイラによって挿入されているので，実行時に `deref()` が呼び出されていることに変わりはない．
字面上の違いしかないはずなのに，a だけがコンパイルエラーになるのはなぜだろう？

公式ドキュメントを読んでみると，`Ref<S>` の寿命が a と b で違うことが原因のようだ．
`Ref<S>` は変数に代入されていない一時オブジェクトで，通常その寿命は一時オブジェクトが生成されたステートメント内に限定される．

例で言えば `let borrow = ...` 文が終わった時点で `Ref<S>` の寿命はつきる．一方 `&i` は borrowed に代入しているので，このブロックが終わるまで生存している．
つまり `Ref<S>` と `&i` の寿命を比較すると `Ref<S>` < `&i` だ．`deref()` の定義をみると返した参照の寿命は `Ref<S>` の寿命よりも短くなければいけないと書いてあり，`Ref<S>` < `&i` はこれに違反している．これが a がコンパイルエラーとなる理由だ．

では b はなぜコンパイルエラーにならないのか．実は一時オブジェクトの寿命には別のルールがある．

> When a temporary rvalue is being created that is assigned into a let declaration, however, the temporary is created with the lifetime of the enclosing block instead, as using the enclosing statement (the let declaration) would be a guaranteed error (since a pointer to the temporary would be stored into a variable, but the temporary would be freed before the variable could be used). The compiler uses simple syntactic rules to decide which values are being assigned into a let binding, and therefore deserve a longer temporary lifetime.
> https://doc.rust-lang.org/reference.html#temporary-lifetimes

もし作られた一時オブジェクトが let で代入されるなら，一時オブジェクトは囲んでいるステートメントではなく囲んでいるブロックと同じ寿命を持つ．そしてそれを判断するのにコンパイラは単純な文法的ルールを使う．と書いてある．これだけではピンとこないが，リンク先の公式ドキュメントにはいくつかの例とともにテンポラリオブジェクトの寿命がステートメントになるかブロックになるかが説明されている．

a では，コンパイラは `borrow()` で作られた `Ref<S>` 一時オブジェクトが `deref()` 関数に引数として渡されているとみなす．コンパイラ的に `let` に代入されているのはあくまで `deref()` の戻り値なので，`Ref<S>` の寿命はステートメント内となる．
一方 b ではコンパイラは `Ref<S>` 一時オブジェクトのメンバへの参照が let で代入されているとみなす．そのため `Ref<S>` の寿命はブロック内となっている．

一時オブジェクトの寿命を判断する基準はランタイム時の挙動（deref coercions されるとか）ではなく，たんに字面を見て関数呼び出しの形（`let v = &temp.func();`）ならステートメント内の寿命，メンバ参照の形 (`let v = &temp.field;`) ならブロック内の寿命となるようだ．
dockerでコンテナが立ち上がらないときやってみること

## :confused: コンテナのログ確認

コンテナが立ち上がらずexitedする場合、ログを見てみる

```console
$ docker logs { コンテナID }
```

##:angry: exitedしたコンテナに入って調べる
それでもわからない場合、exitedしたコンテナに入って調べる。
exitedしたコンテナに入るコマンドはこちら。

```console
$ docker commit { コンテナID } { コンテナ名を適当に付ける }

$ docker run --rm -it { 適当につけたコンテナ名 } sh
```

##:sob: コンテナの起動を最初からやりなおす

もはや最初からやりなおしたいときは、コンテナとイメージを削除して再度起動する。

対象コンテナを停止し、起動していないコンテナをまとめて削除する。

```console
$ docker container stop { コンテナ名 }

$ docker container rm { コンテナ名 }
```

※ docker-composeを使っている場合

```console
-v オプションをつけることでvolumeも削除できる

$ docker-compose down -v
```


### イメージを削除する

```console
削除するイメージのIDを調べる

$ docker image ls

対象のイメージを削除する
$ docker image rm { イメージID }
```

## 豆知識: 停止しているcontainer, image, networkをまとめて削除する
[dockerでいらないimage,container,networkを一括削除する](https://qiita.com/mom0tomo/items/911b92cc18871f52a2a0)


## :book: 参考
http://blog.namiking.net/post/2015/09/docker-exec-exited/
技術英語 > and familiarity of the IPython stack [makes it appealing to use]

@ http://blog.otoro.net/2015/11/24/mixture-density-networks-with-tensorflow/

> and familiarity of the IPython stack **makes it appealing to use**.

https://www.merriam-webster.com/thesaurus/appealing
> Synonyms alluring, fascinating, attractive, ...

https://www.merriam-webster.com/dictionary/appeal

法廷用語のappeal courtを思い出したが、今では関心圏のずっと外の用語。

appealは動詞として以下の意味。
> verb
> : to be liked by someone : to be pleasing or attractive to someone

<hr>
関連して思い出したのは

> I'**ve developed a great liking for** Japanese food.

http://sentencedict.com/liking.html
ド素人neovimの使い手になってみる。２.GitHubに必要ファイルを置いておく

#最終ゴール

- Neovimのインストール
- プラグインの設定
- githubに設定ファイルをおいて、いつでも自分の設定にできる
- linuxでも、自分設定で使えるようにする


#前提
- windows10(home) 64ビット
- git windowsをインストール済み

#この記事で書くこと

- 他環境での取り込みの流れ
- リポジトリの作成
- Pushする
- 今の環境消して試してみる


# 他環境での取り込みの流れ
- クローンする
- init.bat実行
- 環境完成

みたいな感じにします。

# リポジトリの作成
自分のGitHubに行って、リポジトリを作成します。
[github](https://github.com/knitbow/nvim)の[＋]でNew Repositoryで必ず**nvim**という名前で作成。

# init.batの作成
環境変数とシンボリックリンクの作成

```
#init.bat

setx XDG_CONFIG_HOME %AppData% -m
setx XDG_DATA_HOME %AppData% -m
setx XDG_CACHE_HOME %Temp% -m
setx XDG_RUNTIME_DIR %Temp% -m
mklink /D  %USERPROFILE%\vimfiles\ %AppData%\nvim
mklink %USERPROFILE%\_vimrc %USERPROFILE%\vimfiles\init.vim 
```

# pushする

- ファイル構成

```
nvim
│  init.bat
│  init.vim
│
└─ rc
        dein.toml
        dein_lazy.toml
```

- nvim ディレクトリでpushコマンド

```
echo "# nvim" >> README.md
git init
git add .
git commit -m "first commit"
git remote add origin https://github.com/knitbow/nvim.git
git push -u origin master

```

これでPushできた＾＾
何気に私も初Push！！

# 今の環境消して試してみる（動作確認）
今まで作ったやつ全部消して、管理者のコマンドプロンプトから下記を実行

```
cd %appdata%
git clone https://github.com/knitbow/nvim.git
nvim\init.bat
nvim
```

でけた～^^
次は、LINUX。
ImageJを用いた3次元画像における分水嶺法

# 背景
近年では3次元画像の取得が容易になっている一方で、3次元画像に用いる画像処理ライブラリは充実していない。
今回は3次元画像に対して分水嶺 (Watershed) と呼ばれる領域分割手法を行いたかったため探したところ、画像処理ソフトウェアFiji (Fiji is just imageJ) のプラグインに3Dモルフォロジ演算を行う関数が実装されていたので試してみた。
以下からは、導入方法および関数の使い方についてまとめた。

# 環境
* Mac OS X 10.10.5 (Yosemite)
* ImageJ version : 2.0.0-rc-14/1.49g (http://imagej.net/Contributors)

# プラグイン導入
https://github.com/ijpb/MorphoLibJ/releases から、MorphoLibJ 1.3.1.jar　をダウンロードする。
GUIで導入する場合は、Fijiを開いてダウンロードしたファイルをドラッグ&ドロップする。
ターミナルから導入する場合は、/Applications/Fiji.app/plugins/ の下に MorphoLibJ_-1.3.1.jar を置けばよい。
本プラグインのドキュメントは以下を参照。
http://imagej.net/MorphoLibJ#Watershed_segmentation

# 関数

まず関数の使用例として用いる、以下のような画像をpython上で作成した。

```python
import numpy as np
import skimage.io as skimage
img = np.zeros((100, 100, 100))
for i in range(100):
    for j in range(100):
       for k in range(100):
          if (i - 40)**2 + (j - 40)**2 + (k - 40)**2 < 400:
             img[i][j][k] = 255
          if (i - 60)**2 + (j - 60)**2 + (k - 60)**2 < 900:
             img[i][j][k] = 255
skimage.imsave('example.tif', img.astype(uint8))
```

![example.jpg](https://qiita-image-store.s3.amazonaws.com/0/137574/af8b1575-799e-d24b-7e17-7a56a95f7c5b.jpeg)

ここからは、この画像を用いた関数使用例についてまとめる。また、visualize は Plugin の 3D Viewer を使用している。

### Distance Tranceform Watershed 3D

Plugin > MorphoLibJ > Binary Images > Distance Transform Watershed 3D

![watershedGUI.jpg](https://qiita-image-store.s3.amazonaws.com/0/137574/91a87409-dd5b-2d32-a835-4040973fe2a7.jpeg)

* Options
 * Distance
 : ユークリッド距離変換を計算する重みを指定する。出力結果の境界面などに影響するパラメータ。
 * Output Type
 : 距離計算を行う際に、16bit(short)か32bit(float)を使用するか決めるオプション。
 * Normalize weights
 : distance mapを正規化するかのflag。
 * Dynamic
 : 値を大きくするとより多くのオブジェクトがmergeされ、小さくするとより多くのオブジェクトに分割されるパラメータ。
 * Connecivity
 : 注目voxelにおける計算領域を6近傍にするか26近傍にするか決めるオプション。

今回は上図で示したオプション指定で実行した結果を以下に示す。

![watershed.jpg](https://qiita-image-store.s3.amazonaws.com/0/137574/5cf10947-6d95-edea-deea-17389ce11ba4.jpeg)

画像の値はオブジェクトごとにラベリングされている。しかし、この状態だとvisualizeしても差がわかりにくいため、次にカラーラベリングを行う関数について述べる。

### Labels to RGB

Plugin > MorphoLibJ > Label images > Labels to RGB

![labelingGUI,jpg.png](https://qiita-image-store.s3.amazonaws.com/0/137574/010091d4-4e44-9f0c-b7e5-dec0c47e5f35.png)

* Options
 * Colormap
 ラベリングするカラーマップの選択。
 * background
 オブジェクト以外のカラー選択。
 * Shuffle
 カラーマップの色選択をランダムにするかのflag。

個人的にcolormapに黄金角が用意されているのがGood。
上図で示したオプション指定で実行した結果を以下に示す。

![labeling.jpg](https://qiita-image-store.s3.amazonaws.com/0/137574/ec8b941a-1386-7a3c-8e2b-ba32d9126a0d.jpeg)

本来二つのオブジェクトがmergeしてしまった場合に、watershedによって領域分割が行われてることがわかる。

#  考察

以上で分割されたオブジェクトがどの程度妥当なのか定量的に検証してみた。

|オブジェクト|体積 [voxel]|元の体積 [voxel]|割合 [%]|
|:--|--:|--:|--:|
|緑|31922|33493|95.31|
|青|104973|113040|92.86||

このとき元の体積とは、画像を作成した際に決めた半径から体積を計算した値を表している。
また、割合は$\frac{体積}{元の体積} \times 100$から求めた。

この結果から、どちらかのオブジェクトに大きく偏って分割されていないことがわかる。
Distance Transform Watershed 3D において Distance が最も分割精度に影響するパラメータであるが、このパラメータを最適化する際の指標のひとつとして、ここで求めた割合を用いると良いかもしれない。
【Unity】terrainDataのalphamapの解像度を下げる

Unityのterrainを使って地形を作った場合、地形にどのようにテクスチャを貼り付けるかはalphamapという画像データに記録されています。
このalphamapの解像度を下げたい場合に、インスペクターを使って解像度を下げるとデータが失われるようです。

そこで、解像度を下げるスクリプトを書いてみました。

```C#
//4096から1024へ下げる使い捨てスクリプト
public class hogehoge : MonoBehaviour {
    public TerrainData terrainData;
	// Use this for initialization
	void Start () {
        //αマップを書き換え。
        float[,,] oldMap = terrainData.GetAlphamaps(0, 0, terrainData.alphamapWidth, terrainData.alphamapHeight);
        float[,,] newMap = new float[1024, 1024, 4];
        for(var x = 0; x < 1024; x++)
        {
            for(var y = 0; y < 1024; y++)
            {
                var oldMapX = Mathf.Min(x * 4, terrainData.alphamapWidth-1);
                var oldMapY = Mathf.Min(y * 4, terrainData.alphamapHeight - 1);
                newMap[x,y,0] = oldMap[oldMapX,oldMapY,0];
                newMap[x, y, 1] = oldMap[oldMapX, oldMapY, 1];
                newMap[x, y, 2] = oldMap[oldMapX, oldMapY, 2];
                newMap[x, y, 3] = oldMap[oldMapX, oldMapY, 3];

            }
        }
        //αマップを差し替える。
        terrainData.alphamapResolution = 1024;
        terrainData.SetAlphamaps(0, 0, newMap);
        terrainData.RefreshPrototypes();
	}
}
```
4096から1024への決め打ちで解像度を下げる使い捨てのコードですのでご注意ください。
Python - 二つのデータセットからマハラノビス距離が等しい曲線を描く

## ソース

```py:MahalanobisDistance.py
import numpy as np
import matplotlib.pyplot as plt
from sympy import *

CENTER1 = np.array([2.0, 3.0])
CENTER2 = np.array([-4.0, -1.0])

def calc_sum_of_square(data_list1, data_list2):
    return (len(data_list1) * sum([data1 * data2 for data1, data2 in zip(data_list1, data_list2)]) - sum(data_list1) * sum(data_list2))/(len(data_list1)*(len(data_list1)-1))

# 分散共分散行列計算
def calc_variance_covariance_matrix(data_list):
    return [[calc_sum_of_square(data_list1, data_list2)/(len(data_list1)-1) for data_list1 in data_list]
            for data_list2 in data_list]

def calc_average(data):
    return sum(data) / len(data)
            
if __name__ == "__main__":
    # CENTER1を中心としたランダムな点を50個生成
    data_set1 = CENTER1 + 3.0 * np.random.rand(50, 2)
    # CENTER2を中心としたランダムな点を50個生成
    data_set2 = CENTER2 + 4.7 * np.random.rand(50, 2)
    
    X1 = []
    Y1 = []
    X2 = []
    Y2 = []
    for data1, data2 in zip(data_set1, data_set2):
        X1.append(data1[0])
        Y1.append(data1[1])
        X2.append(data2[0])
        Y2.append(data2[1])
    
    # data_set1のxとyの分散共分散を計算
    vc1 = np.array(calc_variance_covariance_matrix([X1, Y1]))
    # data_set2のxとyの分散共分散を計算
    vc2 = np.array(calc_variance_covariance_matrix([X2, Y2]))
    det1 = vc1[0][0]*vc1[1][1] - vc1[0][1]**2
    det2 = vc2[0][0]*vc2[1][1] - vc2[0][1]**2
    x1_ave = calc_average(X1)
    y1_ave = calc_average(Y1)
    x2_ave = calc_average(X2)
    y2_ave = calc_average(Y2)
    
    # data_set1のマハラノビス距離：D1^2 = a11*x^2 + a22*y^2 + a12 * x * y + a1 * x + a2 * y + a0
    a11 = vc1[1][1]/det1
    a22 = vc1[0][0]/det1
    a12 = -2*vc1[0][1]/det1
    a1 = 2*(vc1[0][1]*y1_ave - vc1[1][1]*x1_ave)/det1
    a2 = 2*(vc1[0][1]*x1_ave - vc1[0][0]*y1_ave)/det1
    a0 = (vc1[1][1]*x1_ave**2 + vc1[0][0]*y1_ave**2 - 2*vc1[0][0]*x1_ave*y1_ave)/det1
    
    # data_set2のマハラノビス距離：D1^2 = b11*x^2 + b22*y^2 + b12 * x * y + b1 * x + b2 * y + b0
    b11 = vc2[1][1]/det2
    b22 = vc2[0][0]/det2
    b12 = -2*vc2[0][1]/det2
    b1 = 2*(vc2[0][1]*y2_ave - vc2[1][1]*x2_ave)/det2
    b2 = 2*(vc2[0][1]*x2_ave - vc2[0][0]*y2_ave)/det2
    b0 = (vc2[1][1]*x2_ave**2 + vc2[0][0]*y2_ave**2 - 2*vc2[0][0]*x2_ave*y2_ave)/det2
    
    # data_set1とdata_set2の距離が等しい位置の曲線を描く
    x, y = symbols("x y")
    f = (a11 - b11) * x**2 + (a22 - b22) * y**2 + (a12 - b12) * x * y + (a1 - b1) * x + (a2 - b2) * y + a0 - b0
    plot_implicit(f, (x, -6, 6), (y, -7, 7))   
    
    # data_set1とdata_set2の散布図を描く
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    ax.scatter(X1, Y1, c='red')
    ax.scatter(X2, Y2, c='blue')
    
    plt.show()
```

## 結果
![Mahalanobis-2.png](https://qiita-image-store.s3.amazonaws.com/0/38382/50b876dc-4482-b29e-02d6-6d1850cbe4f6.png)

![Mahalanobis-1.png](https://qiita-image-store.s3.amazonaws.com/0/38382/8a1abd29-0e58-d2c5-7bc0-54bec3e203d4.png)
matchメソッド　ルーティング

##match '/news/:content_id:URLパターン' => 'news#show:ルート先（コントローラ名#アクション名）'
```ruby:routes.rb
match '/news/:content_id' => 'news#show'
	/new/:content_id(.:format) {:controller=>"news", :action=>"show"}
	例. /news/aspnet01、news/108
	match 'hello/intro'
	hello_intro/hello/intro(.:format)
	{:controller=>"hello", :action=>"intro"}
	例. /hello/intro
match '/products/*keywords/:product_id' => 'producr#show'
	/products/*keywords/:product_id(.:format) 
	{:controller=>"products", :action=>"show"}
	例. /products/ruby/rails/wings/development/108
match ':controller(/:action(/:id(.:format)))'
	/:controller(/:action(/:id(.:format))) 
	例. /hello、 /model/select、 /books/show/108、 /blogs/show/1.xml

```

##match 'hello/intro:URLパターン', :via => :'get:HTTPメソッド'

```ruby:routes.rb
match 'hello/intro', :via => :get
	hello_intro　GET /hello/intro(.:format)
		{:controller=>"hello", :action=>"intro"}
get 'hello/intro'
	hello_intro GET /hello/intro(.:format)
		{:controller=>"hello", :action=>"intro"}
match 'hello/process', :via => [:get, :post]
	hello_intro GET/POST /hello/intro(.:format)
		{:controller=>"hello", :action=>"process"}
```


##match '/new/content_id:URLパターン' => redirect('/articles/%{content_id}:リダイレクト先URLパターン')
match '/news/:content_id:URLパターン' =>
	redirect {|'p:パラメータ情報', 'req:リクエスト情報'| "/articles/#{p[:content_id].to_i + 1000}:リダイレクト先のを構築する式"}

```ruby:routes.rb
match '/new/content_id' => redirect('/articles/%{content_id}')
match '/news/:content_id' =>
	redirect {|p, req| "/articles/#{p[:content_id].to_i + 1000}"}
```



##match '/news(/:content_id):URLパターン', => 'news#show:ルート先'
	:defaults => [ ':content_id:パラメータ名' => '1:デフォルト値']

```ruby:routes.rb
match '/news(/:content_id)', => 'news#show'
	:defaults => [ :content_id => 1, :format => :json]
	/news(:content_id)(.:format)
	(:content_id=>1, :format=>;json, :controller=>"news", :action=>"show")

```



##match '/books:URLパターン' => 'books#list:ルート先', :as => ':article:ヘルパー名'

```ruby:routes.rb
#「/books」に対応するUrlヘルパーはarticle_url,article_path
match '/books' => 'books#list', :as => :article
	article /books(.:format) {:controller=>"books", :action+>"list"}

```
PowerShell 初期設定

管理者権限で PowerShell を起動する。

```ps1
Start-Process -verb runas powershell
```

ポリシーを変更する。

```ps1
Set-ExecutionPolicy RemoteSigned
```

コマンドレットのヘルプを更新する。

```ps1
Update-Help
```

プロファイルを作成する。

```ps1
$profile_directory=$(Split-Path -Parent $profile)
New-Item -ItemType Directory $profile_directory
New-Item $profile
```

スクリプト用ディレクトリを作成する。

```ps1
$script_directory="$(Split-Path -Parent $profile)\script"
New-Item -ItemType Directory $script_directory
```

スクリプト用ディレクトリへパスを通す。

```ps1:profile.ps1
$script_directory="$(Split-Path -Parent $profile)\script"
$env:Path=$env:Path+";"+$script_directory
```

.ps1 ファイルでコマンドを作り、スクリプト用ディレクトリへ格納すると、
Linux の /usr/local/bin へ格納した .sh ファイルと
同じ感覚で使用することができる。
Redash APIで動的クエリ発行するモジュール

Redashで動的にパラメータ指定してクエリ発行したかったんですが、なんとAPI一発では出来ないということが発覚…  
[issue](https://github.com/getredash/redash/issues/285) には上がっているのでそろそろ実装されそうですが、今すぐ欲しかったのでモジュール書いてみました。
https://github.com/toritori0318/redash-dynamic-query

## 使い方

SYNOPSYSそのままです。

```python
from redash_dynamic_query import RedashDynamicQuery

redash = RedashDynamicQuery(
    endpoint='http://myredash-host',
    apikey='secret_apikey',
    data_source_id=2
)

query_id = 111
bind = {
    "start_date":  '2017-01-01T00:00:00',
    "end_date":  '2017-01-01T23:59:59',
}
result = redash.query(query_id, bind)
print result['query_result']['data']
```

query_idとbind変数指定して実行すると結果取得できます。うぇーい
TeXShopでmintedパッケージを使用する際のメモ


## 発端
仕事の絡みで記録して今後シェアする可能性のある情報をPDFに出力したい。
ワープロは、機種やバージョンの差が心配なので使用しない方針として、LaTeXで書いてみることに。
「LaTeX2e 美文書作成入門」の第7飯がつい最近出版されたので購入し、何度目かのLaTeXチャレンジ。
基本的な復習と、これから描くものに必要な道具の準備を始めた。
その時の自分メモをここに記録する。(PDFじゃなくてw)

## やりたいこと
LaTeXの文書にハイライトしたソースを取り込みたい。
まずは、live2016 の環境にデフォルトで存在するmintedパッケージを利用したい。(他の便利そうなのは別途試したい)


## 前提
#### ソフトウェアのインストール、設定状況
Python, Pygments はインストール済み
TeXShopのタイプセットの選択:	TeX + DVI

## 状況
\usepackage{minted} を記述してタイプセットすると次のエラーが表示される
	
	./document.tex:9: Package minted Error: You must have `pygmentize' installed to use this package.

## 解決策
TeXShopの環境設定の「内部設定」タブの「パス設定」で「(pdf)Tex (デフォルト:/Library/TeX/texbin OR /usr/texbin))」フィールドに書かれている場所に、pygmentize のシンボリックリンクを作成する。

	cd (pdf)Texフィールドのディレクトリ
	ln -s `which pygmentize` pygmentize

## その他
このほかに「内部設定」タブの「TeX+dvipdfmx / TeX+dvips+distiller」で「LaTeX」フィールドに -shell-escape フラグ指定を追加する。その際ダブルクォーテーション内に追加すること。

	変更前: ptex2pdf -l -ot "-synctex=1 -file-line-error"
	変更後: ptex2pdf -l -ot "-synctex=1 -file-line-error -shell-escape"
機械学習論文読みメモ_46


[CNN-AWARE BINARY MAP FOR GENERAL SEMANTIC SEGMENTATION](https://arxiv.org/pdf/1609.09220v1.pdf), ICIP2016
CNNのsemanticsを利用した一般的なsemantic segmentation手法を提案する。
提案手法はCNNから得られる特徴量をバイナリ化する事で高次元空間上で分類をしやすくする。
得られるバイナリ特徴はロバストであり、ノイズや無関係な変化に強い。
このもバイナリ化処理はCNNの最後の追加レイヤーとして扱う事でオンラインセグメンテーションまでを実現する。

[Hybrid computing using a neural network with dynamic external memory](http://www.nature.com/articles/nature20101.epdf?author_access_token=ImTXBI8aWbYxYQ51Plys8NRgN0jAjWel9jnR3ZoTv0MggmpDmwljGswxVdeocYSurJ3hxupzWuRNeGvvXnoO8o4jTJcnAyhGuZzXJ1GEaD-Z7E6X_a9R-xqJ9TfJWBqz), Nature
従来のコンピュータにおけるrandom access memoryとanalogousなNN構造として、マトリックス構造の外部メモリに対して書き込みと読み込み機能を持ったNNモデルを提案する。
このメモリ構造を用いる事で、従来のコンピュータと同様に複雑なデータ構造、表現を扱う事が可能になる。
しかし従来とは違い、そうしたデータ構造、表現をデータから学習する事が可能になる。
学習は教師あり学習、あるいは強化学習によって可能である。

[AMORTISED MAP INFERENCE FOR IMAGE SUPER-RESOLUTION](https://arxiv.org/pdf/1610.04490v1.pdf)
超解像問題はunderdeterminedであり、複数の高解像画像が低解像画像を説明可能である。
従来はピクセル毎のMSEが用いられてきたが、性能はあまり高くない。
より好ましい手法としてMAP推定に基づく手法がある。
MAP推定の場合、高解像画像に関する事前分布に基いて、事後分布最大となる画像が選ばれるため、より妥当な画像を生成可能である。
しかしながら、これはいかに事前分布を選ぶかに依存し、データサンプルからそれを直接推測する事は難しい。
またMAP推定は逐次最適化による手法が良く用いられるが、これは昨今のNNベースの手法と比較すると性能で劣る。
本論では、代わりにCNNを用いる事で直接MAP推定を行う手法を提案する。
CNNは与えられた低解像画像と一貫性を持った高解像画像集合に関する部分空間へ写像を行う。
このCNNを用いると、MAP推定は、CNNによる生成モデルとサンプル分布との間のクロスエントロピー最小化問題として置き換わる。
この問題を解くにあたり、GAN、denoisingに基づく手法を提案する。
機械学習論文読みメモ_45


[Collaborative Multi-View Denoising](http://www.kdd.org/kdd2016/papers/files/rpp0036-zhangA.pdf), KDD2016
multi-view learningにおいては、2種類のノイズが問題になる。
１つは、intranoiseもう一つはinternoiseである。
これらノイズを除去する事は重要だが、各view間の異質性がそれを難しくしている。
本論で提案する手法はこの問題に対し、各viewから均質な高次元空間への写像を考え、各viewの情報をそれぞれ埋め込んでいく。
さらに半教師あり学習を用いる事で２つのノイズ除去を効率よく行う。

[PixelNet: Towards a General Pixel-Level Architecture](https://arxiv.org/pdf/1609.06694v1.pdf)
ピクセルレベルの予測モデルに関する一般的なモデルを提案する。
これは、エッジ検出から、表面検出、セグメンテーションまでを包括的に扱う事ができる。
FCNを始めとする従来手法は、畳込み構造を利用して空間的情報を冗長性を持って抽出する事により、セグメンテーションを行う。
しかしこの手法は近傍ピクセル間で抽出可能な情報量を制限してしまうデメリットがある。
本論で提案するモデルでは、stratified sampling（カテゴリ割合を意識したサンプリング）を用いる事でバッチ学習における多様性の確保を行う。
またマルチスケールに特徴抽出を行う事で非線形構造を効率良く抽出する。

[Deep Pyramidal Residual Networks](https://arxiv.org/pdf/1610.02915v2.pdf)
CNNはプーリングによってダウンサンプリングを行うと共に、特徴量を増加させ表現力を向上させる。
本論では、プーリングによって特徴量を飛躍的に増やすのではなく、徐々に増やす事で細かく多スケールな空間情報を利用する。
この構造をResNetと共に適用する事で分類性能が向上可能である事を示した。
vagrantで突然「"vboxsf" is not available.」で起動しなくなった場合

## vagrant reloadやvagrant up で最初に出てきたエラー

```
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=500,gid=500 vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

Process finished with exit code 1
```

## WEBで探るとどうやらカーネルの更新が必要な様子。

- 参考にさせて頂いたサイト
    - [Vagrantのmountエラーを解決しようとしたらvboxのリビルドがこける](http://qiita.com/ritukiii/items/9933e1497237bdac9500)
    - [vagrantでmountエラーの解決方法](http://qiita.com/osamu1203/items/10e19c74c912d303ca0b)
    - [vagrant upでmountエラーが発生した場合の解決方法](http://qiita.com/kazuemasaki/items/c2328fda9d88756a3e4f)

## 以下のサイトを参考にkernelのアップデートを試みる

- [え？まだ旧式カーネル？Cent0S 6ではカーネルアップデートは簡単にできる！(RPM編)](http://mtnengineer.no-ip.info/post-206/)


### そしたら今度は、カーネルモジュールを各種ミラーサイトからダウンロードしようとするところで名前解決に失敗

## 再度WEBで探り、以下のサイトを参考にホストOS側で名前解決するように設定

- [VagrantのゲストOSから名前解決できない件](https://saku.io/fix-dns-resolver-in-vagrant-vm/)

## 名前解決できたので、再びカーネルアップデートを行う。

- 途中はまりかけたこと。
    - VirtualBoxのキャプチャから抜けるボタンを忘れて焦る⇒[右側Ctrl]
    - VirtualBoxの全画面表示から戻れなくなる⇒[右側Ctrl＋F]
    - VirtualBoxのBIOS画面の表示⇒起動時にDELETE（※起動途中にF12って出てくるけど、起動する元デバイスの選択。）

- 適用したカーネル；http://elrepo.org/linux/kernel/el6/x86_64/RPMS/kernel-ml-4.9.11-1.el6.elrepo.x86_64.rpm

## カーネルアップデートできたので再度vagrant reload

- 変わらず同じエラー

```
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=500,gid=500 vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

Process finished with exit code 1
```

## vboxのリビルドしてみる

```
[root@localhost vagrant]# /etc/init.d/vboxadd setup
Removing existing VirtualBox DKMS kernel modules           [  OK  ]
Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules     [  OK  ]
Doing non-kernel setup of the Guest Additions              [  OK  ]
Starting the VirtualBox Guest Additions Installing the Window System drivers
Could not find the X.Org or XFree86 Window System, skipping.
/usr/bin/VBoxClient: error while loading shared libraries: libXt.so.6: cannot open shared object file: No such file or directory
                                                           [  OK  ]
```

- カーネルアップデート後にホストOSの方の再起動をしていなかったのが悪かった様子。再起動したら、OKでした！
Angularでアプリを作ってGitHub上で公開する点で一瞬ハマった点

## 結論
`ng build`コマンドに`-bh <directory>`オプションをつければよかったです。

## 今回やりたかったこと
`ng build`コマンドで書き出す際にbaseタグを書き換えたかった

## もう少し掘り下げ
angular-cliを使ってAngularアプリを作る練習をしています。
GitHubではmasterブランチの/docsフォルダに入っているものがそのままWebページとして
公開できるみたいなものがあるので、そこにAngularアプリをデプロイしたいというのが今回の目的です。

使っているangular-cliのバージョンは`ng -v`コマンドで確認できます。

```
Pittan-Mac:PerfumeHub-schedule Pittan$ ng -v
                             _                           _  _
  __ _  _ __    __ _  _   _ | |  __ _  _ __         ___ | |(_)
 / _` || '_ \  / _` || | | || | / _` || '__|_____  / __|| || |
| (_| || | | || (_| || |_| || || (_| || |  |_____|| (__ | || |
 \__,_||_| |_| \__, | \__,_||_| \__,_||_|          \___||_||_|
               |___/
@angular/cli: 1.0.0-beta.32.3
node: 7.2.0
os: darwin x64
```
今回は1.0.0-beta.32.3を使いました。

通常は`ng serve`を使ってローカル環境で開発を行います。
ブラウザから`http://localhost:4200`にアクセスするとイイカンジに作ったアプリが表示されます。

ある程度完成してきたところで、GitHub上にデプロイをするわけですが…
`master`ブランチの`/docs`以下に書き出せばいいとのことなので、何も考えずに
`ng build --aot true --target=production -op docs`と入れていましたが
GitHub上でアプリを開くと、js/css等のパス指定がおかしくてLoading...から進まない状態でした :innocent: 

書き出されたindex.htmlを見ると`<base href="/">`とあったので、
`https://pittan.github.io/PerfumeHub-schedule/hogehoge.js`を見に行きたいのに
`https://pittan.github.io/hogehoge.js`を参照しているような状態でした。

開発環境では特に問題なかったので、デプロイ後に気づいたような状態です。

## どうしたか
`ng build`のオプションに`-bh /PerfumeHub-schedule/`を追加しました。毎回これ書くのもアレなので、
npmのrun scriptsの中に`"deploy:github" : "ng build --aot true --target=production -op docs -bh /PerfumeHub-schedule/" ` 
の記述を追加しています。

masterブランチにプッシュしないといけないので「あっ…」っていう感じになりました。
練習環境なので、何度かプッシュし直しで恥ずかしいなぁ…くらいで済みましたが :sweat_drops:
Ruby on Railsで静的ページの階層を作る

# まえおき
デザイナーのメモなので、本来のRuby on Railsの使い方ではないです。
開発用のルータとコントロールの未設定でデザインのみ先行し、テンプレート機能を使ってハリボテを共有するときのルータとコントロールの設定。

# コントローラーの設定
http://localhost:3000/site/pages/index
という構成を作るとき。ルータとコントロールの設定は以下の通り

## routes.rb
テンプレートのパスをそのまま設定

```ruby:
Rails.application.routes.draw do
  get 'site/pages/index'
end
```

## pages_controller.rb
pagesのコントローラーはsiteディレクトリに格納し、indexアクションを設定する。
※/site/app/controllers/site/pages_controller.rb 

```ruby:
class Site::PagesController < ApplicationController
  def index
  end
end
```

# あとがき
先に環境を作ってページを作ることで、テンプレートエンジンも使って先行して画面作りができるので、エンジニアさんがルータとコントロールの設定してくれたら、指定のパスにそのままリネーム程度の変更のみでテンプレートを移動されば良いし、大きなパス修正作業もなくてとても楽なのでオススメです。
パッケージ配下のクラス一覧を再帰的に探索したい


しがないSIerのシステムエンジニアとして日銭を稼ぐ毎日を送っているのですが、「作成したJavaクラスをパッケージ名を付与して一覧化する」という設計書(?)を作る機会がここ最近ありました。作ったJavaクラスの数からいって手作業はめんどくさいというか無謀な話。そこで「__パッケージを再帰的に探索して、パッケージ名を付与したクラス一覧を出力する__」プログラムを書くことにしました。以下はそのサンプルです。

![image](https://qiita-image-store.s3.amazonaws.com/0/105859/82ecae1c-98c6-b2f1-6527-2cc97f9c91d9.png)

たとえば上記のようなパッケージ構造のプロジェクトがあったとして、"jp.co"配下に属するクラスをパッケージ名付きで出力するプログラムは次のようになるはずです。

```java
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Enumeration;
import java.util.PriorityQueue;

public class Main {
    
    private static final String PACKAGE_SEPARATOR = ".";
    
    private static final String CLASS_SUFFIX = ".class";
    
    public static void main(String[] args) throws IOException, URISyntaxException {
        // クラスローダを利用して、パッケージ配下のリソースを取得する。
        String rootPackageName = "jp.co".replace(PACKAGE_SEPARATOR, File.separator);
        ClassLoader classLoader = ClassLoader.getSystemClassLoader();
        Enumeration<URL> rootUrls = classLoader.getResources(rootPackageName);
        
        // ディレクトリを再帰的に探索して、".class"で終わるファイルを見つけた場合は
        // 文字列を整形したのちにリストへ格納しておく。
        PriorityQueue<String> classNames = new PriorityQueue();
        while (rootUrls.hasMoreElements()) {
            URL rootUrl = rootUrls.nextElement();
            Path rootPath = Paths.get(rootUrl.toURI());
           
            Files.walkFileTree(rootPath, new SimpleFileVisitor<Path>(){
                @Override
                public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException {
                    String pathName = path.toString();
                    if (pathName.endsWith(CLASS_SUFFIX)) {
                        int beginIndex = pathName.lastIndexOf(rootPackageName);
                        int endIndex = pathName.lastIndexOf(CLASS_SUFFIX);
                        String className = pathName.substring(beginIndex, endIndex)
                                                   .replace(File.separator, PACKAGE_SEPARATOR);
                        
                        classNames.add(className);
                    }
                    
                    return super.visitFile(path, attrs);
                }
            });
        }
        
        // 見つけ出したクラス名の一覧を出力する。
        for (String className : classNames) {
            System.out.println(className);
        }
        
        /*
        jp.co.first.ClassA
        jp.co.first.ClassB
        jp.co.first.sub.ClassC
        jp.co.first.sub.ClassD
        jp.co.second.ClassE
        jp.co.second.ClassF
        */
    }
}

```
method_missingの探索はどこから始まるのか?

method_missingはBasicObjectまでメソッド探索を行ってもメソッドが見つからなかったときに呼び出されるメソッドで例えば以下のようなクラスが定義されている場合、Cクラスのインスタンスで存在しないno_existを呼び出すと

1. (インスタンスの特異クラス)→C→B→A→...BasicObjectまでundefined_methodが探索されるが見つからない。
2. (インスタンスの特異クラス)→C→B→A→...BasicObjectまでmethod_missingを探索し、BasicObjectに定義されているmethod_missingが呼ばれてNoMethodErrorが発生する。

```ruby
class A
end

class B < A
end

class C < B
end

>  C.ancestors
=> [C, B, A, Object, Kernel, BasicObject]
>  C.new.undefined_method
NoMethodError: undefined method `no_exist' for #<C:0x007ffaa2a28948>
```

なので例えば以下のようにCクラスにmethod_missingを定義することでCクラスに対するMethodMissing例外を捕捉することが出来ます。

```ruby
class A
end

class B < A
end

class C < B
  def method_missing(m)
    "ignore #{m}"
  end
end

> C.new.undefined_method
=> "ignore no_exist"
```

今度はBクラスに対してもmethod_missingを定義します。するとCクラスのインスタンスからno_existを呼び出したときはCによって捕捉され、Bクラスのインスタンスから呼び出したときはBによって捕捉されています。このことからmethod_missingの探索開始地点はメソッドを呼び出したレシーバから始まっていることがわかります。

```ruby
class A
end

class B < A
  def method_missing(m)
    "ignore #{m} by B"
  end
end

class C < B
  def method_missing(m)
    "ignore #{m} by C"
  end
end

> B.new.undefined_method
=> "ignore no_exist by B"
> C.new.undefined_method
=> "ignore no_exist by C"
```

では以下のようにCクラスのインスタンスから、Bクラスのメソッドが呼び出されてそのメソッド内で存在しないメソッドが呼び出された場合はどうなるでしょうか？

```ruby
class A
end

class B < A
  def baz
    undefined_method
  end
  def method_missing(m)
    "ignore #{m} by B"
  end
end

class C < B
  def method_missing(m)
    "ignore #{m} by C"
  end
end

> C.new.baz
C
=> "ignore undefined_method by C"
```

一瞬Bクラスのメソッドから存在しないメソッドを呼び出しているのでBクラスから探索が始まりそうに思ってしまいますが、この場合もあくまでもno_existメソッドはCクラスのインスタンスをレシーバとして呼び出されているのでCクラスから探索が始まります。

なので例えば以下のように書けばBクラスから探索が始まります

```ruby
class A
end

class B < A
  def baz
    B.new.undefined_method
  end
  def method_missing(m)
    "ignore #{m} by B"
  end
end

class C < B
  def method_missing(m)
    "ignore #{m} by C"
  end
end

> C.new.baz
=> "ignore undefined_method by B"
```

結局結論はとてもシンプルで
***存在しないメソッドを呼び出したレシーバから探索は始まる*** 
でした。