OmniAICreator/Qiita-1.07M huggingface dataset:
Elixirのソースコードにバイナリを埋めこむ方法とそのバイナリ表現の生成方法

Elixir ソースコードの中にバイナリを埋め込みたいとする．Elixir ソースコードはテキストファイルである．テキストファイルの中にどのようにバイナリを埋め込むとよいだろうか．

Elixir では（もちろん Erlang でも）バイナリを表現する方法が用意されている．[Binaries, strings, and char lists](http://elixir-lang.org/getting-started/binaries-strings-and-char-lists.html)にあるとおり`<<0, 255, 127>>` のように記述する．

それでは，バイナリをこのような `0..255` の表現で取得するにはどうしたらよいか．`hexdump` というコマンドでバイナリを様々なフォーマットで出力できる．

今回は 

1. `ls` のバイナリを `hexdump` で Elixir 内で扱えるバイナリ文字列へと変換する
2. Elixir 内で扱えるバイナリ文字列を Elixir で読み込む
3. Elixir 内で扱えるバイナリ文字列を Elixir からバイナリとして書き出す
4. 書き出したバイナリを実行して，`ls` と同じ動作をすること

を確かめた．

```
/var/tmp/elixir_binary% hexdump -ve '/1 "%u,"' /bin/ls | sed -e 's/,*\r*$//' | awk '{print "<<"$0">>"}' > elixir_binary.txt
/var/tmp/elixir_binary% head -c 100 elixir_binary.txt
<<207,250,237,254,7,0,0,1,3,0,0,128,2,0,0,0,18,0,0,0,8,7,0,0,133,0,32,0,0,0,0,0,25,0,0,0,72,0,0,0,95%                                                           /var/tmp/elixir_binary% iex
Erlang/OTP 19 [erts-8.3] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Interactive Elixir (1.4.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> {result, _bindings} = Code.eval_file("elixir_binary.txt")
{<<207, 250, 237, 254, 7, 0, 0, 1, 3, 0, 0, 128, 2, 0, 0, 0, 18, 0, 0, 0, 8, 7,    0, 0, 133, 0, 32, 0, 0, 0, 0, 0, 25, 0, 0, 0, 72, 0, 0, 0, 95, 95, 80, 65,
   71, 69, 90, 69, 82, ...>>, []}
iex(2)> File.write!("myls", result)
:ok
iex(3)>
User switch command
 --> q
/var/tmp/elixir_binary% chmod 755 myls
/var/tmp/elixir_binary% ./myls -l
total 296
-rw-r--r--  1 niku  wheel  108227  5  4 20:53 elixir_binary.txt
-rwxr-xr-x  1 niku  wheel   38512  5  4 20:55 myls
/var/tmp/elixir_binary% diff /bin/ls myls
```
electronからslackのapiを使ってみた


## 機能実装

ここがすごいぞ！ stylelint！ - Qiita
http://qiita.com/inuscript/items/ff4f6972c988afbec3a8

stylelintをいれる

WebStormでstylelintができるようにする手順の紹介 | ichimaruni-design
http://ichimaruni-design.com/2016/12/webstorm-stylelint/

stylelintをSdkで設定

Slack | RTMClient
http://slackapi.github.io/node-slack-sdk/reference/RTMClient#RTMClient+send

rtmclientを使う
コネクトとかソケットオープンとかの使い分けがよくわからず手こずった

electronでTray Iconを使った時、メニューバーからアイコンが消える - Qiita
http://qiita.com/unchi_tokyo/items/a2faeda674fa813db1ad

trayが落ちるのに気をつけた
GCに注意ということらしい

古いElectron.appをアップデート | mg:note
http://milligramme.cc/note/post/2016-11-25-update-old-electron-app/

electronのバージョンに注意
prebuilt

electronを使ってみた – 桃源老師のつぶやき
http://xanadu6291ex.webcrow.jp/wp/?p=175

パッケージングを試す

Github で Fork してから Pull Request をするまでの流れ | けーこ in サンフランシスコ
http://kik.xii.jp/archives/179

だいたいうまく言ったのでプルリクしてみた

## パッケージ

electronを使ってみた – 桃源老師のつぶやき
http://xanadu6291ex.webcrow.jp/wp/?p=175

release.jsを作ってnpm run release

Web Tips Plus: ElectronアプリのWindowsインストーラの作成
http://webtipsplus.blogspot.jp/2016/08/electronwindows.html

asarを指定しているとアーカイブされる、、よくわからないのでfalseにした
これで、直下のリソースはhoge.app/Contens/Resources/appの下にコピーされる
.envもコピーされた

Electron 開発で得た知見まとめ - Qiita
http://qiita.com/midnightSuyama/items/155607cf3ba03c77d3b3

dotenvを使う時にはパスの指定に気をつける

## クラッシュレポート

Electronで、クラッシュレポート（crashReporter） 一言多いプログラマーの独り言
http://programmer-jobs.blogspot.jp/2016/07/electron-crashreporter.html

クラッシュレポートをリモートに送信

electron/crash-reporter.md at master · electron/electron
https://github.com/electron/electron/blob/master/docs-translations/jp/api/crash-reporter.md

autoSubmitでユーザーへの通知をするかを切り替え
redirect_toについてメモ

# redirect_toでフラッシュメッセージを表示させる。
## ネットで見つけたコードで書いたら、なぜかアドレスバーにフラッシュメッセージが表示されたので、メモしときます。

- 表示したい側のHTMLのコード

```flash_message.html.haml
 - flash.each do |key, value|
  %div{class: "alert alert-#{key}"}= value
```
- 失敗したredirect_toの書き方

```groups_controller.rb
redirect_to action: :index, flash：　{notice:　”アドレスバーにフラッシュメッセージ”}
```
これが上手くいかなかったコード。いくつかのサイトで紹介されていたので、オーソドックスな！？書き方と思ったのですが・・・・・・
ページの上部に出力したかったのに、なぜかアドレスバーにフラッシュメッセージが表示されてしまいました。

- 成功したredirect_toの書き方

```groups_controller.rb
redirect_to root_path, notice:　”ページの上部にフラッシュメッセージ”
```
結果論として、こう書けば上手くいきました。

第一引数にaction: :indexのように、アクションを指定した場合、flashオプションはつけられない
ということか？？そもそも、なぜアドレスバーに表示された？？

今後、時間があるときに、原因を調査したいと思います・・・・・・
[メタプログラミング] Procを使って Enumerator のメソッドを美しく。

# はじめに
配列やハッシュに使うメソッド、mapとかinjectなどを全てProcを使って美しく書きたい。そんな思いから、Arrayに`#to_proc`を追加してみた。割りと使えると思うんだ。

|種類|名前|
|---|---|
|前提|[Procとは](#proc%E3%81%A8%E3%81%AF)|
|本編|[Arrayにto_proc](#array%E3%81%ABto_proc%E3%82%92%E3%81%9F%E3%81%99)

# Procとは

[Ruby Doc](https://ruby-doc.org/core-2.4.0/Proc.html)

ProcクラスはRubyのブロックをオブジェクトとして、格納したもの。
なので、メソッドとしてブロックを受け取るものにその代わりとして、Procメソッドを与えて良い。

例えば、数字の配列を全て倍にしたい場合、きっとあなたは

```ruby
array = [1,2,3,4]

array.map do |num|
  num * 2
end

# => [2,4,6,8]
```

とするだろう。
ここで、mapメソッドに `{ |num| num * 2 }` のような、ブロックが渡されている。これをオブジェクトにしようではないか。

```ruby
double_me = Proc.new { |num| num * 2 }

#または

double_me =  Proc.new do |num|
  num * 2
end
```

この、ブロックが格納されたオブジェクトをブロックの代わりにメソッドに渡す時は、引数として前に それを示すために`&`をつけなければならない。

```ruby
array = [1,2,3,4]

array.map(&double_me)
#=> [2,4,6,8]
```

複雑な処理などは、このようにしたほうが美しい。ちなみに、メソッドを`Proc`オブジェクトにする。`to_proc` というメソッドがある。

@kts_h さんの指摘により気付かされたのですが、
`to_proc` メソッドがあると言っても。`Symbol#to_proc`と`Method#to_proc`があり、気をつけなければならない。

```ruby
# Symbol#to_procの解釈
class Symbol
  def to_proc
     # はじめの引数（と読んでいいのか？）はリシーバーとして
     # その他の引数を全て、メソッドの引数として渡す
     # つまり、:+.to_proc.call(1,2) とすれば
     # receiver は 1、 *args は 2　ということになる。
     Proc.new { |receiver, *args| receiver.send(self, *args) }
  end
end

# Method#to_procの解釈
class Method
  def to_proc
    # 受け取った全ての引数を、そのままメソッドの引数とする。
    # つまり、method(:double_me).to_proc.call(2) とすれば
    # *args が 2 となる
    # self が method(:double_me) になる。
    Proc.new { |*args| self.call(*args) }
  end
end
```

ざっくり２つの違いをまとめると、
`Symbol#to_proc` が返す Proc オブジェクトを呼び出す時に、第一引数をレシーバーとして使う。
`Method#to_proc` が返す Proc オブジェクトを呼び出す時に、全ての引数を、引数としてメソッドに渡す。


```ruby
def double_me(num)
  num * 2
end

# :double_me.to_proc としてしまうと、Symbol#to_procが呼び出されてしまう。
# 今回の例は、Method#to_procを呼び出したい。
method(:double_me).to_proc
#=> #<Proc:0x007ff9b081ac48(&:dounle_me)>
# つまり、 Proc.new { |num| num * 2 } と同義
```

さて、これらの知識を使うと、メソッドをブロックの代わりに引数として渡すことが可能な事がわかる。

```ruby
array = [1,2,3,4]

array.map(&method(:double_me).to_proc)
#=> [2,4,6,8]
# :double_me.to_proc は Proc.new { |num| num * 2 } なことを思い出してほしい。
```

さらに、引数を渡す時は、`to_proc` を省略出来る。

```ruby
array.map(&method(:double_me))
```

これで、不可解な記号を使った魔法が出来上がる。

# Arrayに`#to_proc`をたす

だがしかし、こんなケースでは使えない。

```ruby
# 名前と敬称を受け取り、挨拶する文を返す。
class Bakabon
  def initialize(name)
     @name = name
  end

  def greeting(title)
    "こにゃにゃちわー。#{@name} #{title}"
  end
end

bakabon = Bakabon.new('バカボン')
rerere = Bakabon.new('レレレのおじさん')
hajime = Bakabon.new('はじめ')

[bakabon, rerere, hajime].map(&:greeting('さん')) # これはできない
```

そこで、引数を配列として渡せればどうか。

```ruby
# できれば素敵
[bakabon, rerere, hajime].map(&[:greeting, 'さん']) #だができない。
```

ならば、出来るようにしましょう。
問題は、Arrayに`to_proc`メソッドがないからである。

```ruby
class Array
  def to_proc
    # receiver は bakabon, rerere, hajimeになるはず。
    # self は [:greeting, 'さん'] になる予定
    Proc.new { |receiver| receiver.send *self }
  end
end

[bakabon, rerere, hajime].map(&[:greeting, 'さん'])
# => ["こにゃにゃちわー。バカボン さん", "こにゃにゃちわー。レレレのおじさん さん", "こにゃにゃちわー。はじめ さん"]
```

悪くないと思うのだけど・・・、どうかしら。
Swift3でキーボードに合わせてUIScrollViewを調整する方法

# 下記のような動きになります




https://j.gifs.com/Y6AAYn.gif



<iframe src='//gifs.com/embed/swift3-nZqqJE' frameborder='0' scrolling='no' width='288px' height='540px' style='-webkit-backface-visibility: hidden;-webkit-transform: scale(1);' ></iframe>




# 参照

[How to adjust a UIScrollView to fit the keyboard](https://www.hackingwithswift.com/example-code/uikit/how-to-adjust-a-uiscrollview-to-fit-the-keyboard)

# 実装

###step1

```swift
 
    
    func adjustForKeyboard(notification: Notification) {
        let userInfo = notification.userInfo!
        
        let keyboardScreenEndFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
        let keyboardViewEndFrame = view.convert(keyboardScreenEndFrame, from: view.window)
        
        if notification.name == Notification.Name.UIKeyboardWillHide {
            bodyTextView.contentInset = UIEdgeInsets.zero
        } else {
            bodyTextView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: keyboardViewEndFrame.height, right: 0)
        }
        
        bodyTextView.scrollIndicatorInsets = bodyTextView.contentInset
        
        let selectedRange = bodyTextView.selectedRange
        bodyTextView.scrollRangeToVisible(selectedRange)
    }
    
    
    
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
```


### step2

```swift

 
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        
        
        
        
        
        let notificationCenter = NotificationCenter.default
        notificationCenter.addObserver(self, selector: #selector(adjustForKeyboard), name: Notification.Name.UIKeyboardWillHide, object: nil)
        notificationCenter.addObserver(self, selector: #selector(adjustForKeyboard), name: Notification.Name.UIKeyboardWillChangeFrame, object: nil)
        
        
        
```
ウェブスクレイピングと形態素解析

**rvest** パッケージを使ってWEBから文字列を取得し、これをデータフレームにして **RMeCab** の `doDF()` で解析する。

## 前提

[MeCab](http://taku910.github.io/mecab/) がインストールされた環境。OSXでのMeCabのインストールについては https://sites.google.com/site/rmecab/home/install を参照。

さら [R](https://cran.ism.ac.jp/) がインストールされており、追加で以下のパッケージが導入されている。

```r
install.packages(c("dplyr", "rvest", "wordcloud", "igraph"), depend = TRUE)
install.packages("RMeCab", repos = "http://rmecab.jp/R") 
```
**igraph**の `tkplot()` をOSXで利用するには [XQuartz](https://www.xquartz.org/) が必要となる。

## スクレイピング
まずスクレイピングでテキスト部分を抽出する。
テキスト部分を `html_nodes()` でピンポイントに指定するには、その部分を特定するCSSセレクタを知る必要があるが、これはブラウザで該当箇所を右クリック、検証ツールからコピペする。

```r
library(rvest)
library(dplyr)

x <- read_html("http://anond.hatelabo.jp/20170429110724")

texts <- x %>% html_nodes(css = "#body > div.day > div.body > div > p:nth-child(3)") %>% html_text()

```


## 形態素解析

抽出したテキストをいったんデータフレームに変換し、これを形態素解析にかけて頻度表を作成する。

```r
if(.Platform$OS.type == "windows") texts <- iconv(texts, from = "UTF-8")

textDF <- data.frame(X = texts, stringsAsFactors = FALSE)

library(RMeCab)

textDF2 <- docDF(textDF, pos = c("名詞", "動詞", "形容詞"), column = 1, type = 1)
```

解析結果

```r
> head(textDF2)
        TERM   POS1   POS2 Row1
1         ３   名詞     数    5
2         ４   名詞     数    3
3     あがる   動詞   自立    1
4     あまり   名詞   接尾    1
5 ありがたい 形容詞   自立    1
6       ある   動詞 非自立    2
> tail(textDF2)
    TERM POS1         POS2 Row1
235   様 名詞         接尾    2
236 様子 名詞         一般    1
237 来る 動詞         自立    2
238 立つ 動詞         自立    1
239 歴史 名詞         一般    1
240 饒舌 名詞 形容動詞語幹    1
```

## ワードクラウドを作成

```r
library(wordcloud)

pal <- brewer.pal(8,"Dark2")
wordcloud(textDF2$TERM, textDF2$Row1, colors = pal, min.freq = 2,  family = "JP1")
```

![F6.png](https://qiita-image-store.s3.amazonaws.com/0/99009/bca1cf30-b97d-302c-2387-3bf2c569e318.png)

## （形態素レベルの）バイグラムを作成

```r
textDF3 <- docDF(textDF, pos = c("名詞", "動詞", "形容詞"), column = 1, type = 1, N = 2, nDF = TRUE)
```

出力

```
> head(textDF3)
          N1     N2        POS1            POS2 Row1
1     あがる ライン   動詞-名詞       自立-一般    1
2     あまり   記憶   名詞-名詞   接尾-サ変接続    1
3 ありがたい     さ 形容詞-名詞       自立-接尾    1
4       ある すべて   動詞-名詞 非自立-副詞可能    1
5       ある   写真   動詞-名詞     非自立-一般    1
6       あれ     顔   名詞-名詞     代名詞-一般    1

```

## ネットワークグラフを作成

```r 
library(igraph)
netDF <- textDF3 %>% select(N1, N2, Row1) %>% filter(Row1 > 1) %>% graph_from_data_frame()

tkplot(netDF, vertex.color = "SkyBlue")
```


![F6.png](https://qiita-image-store.s3.amazonaws.com/0/99009/19ac573d-5e04-579a-56d3-9e38c9941072.png)
ESXiの管理ポート所属仮想スイッチの変更

■VMware ESXi 管理ポートの所属Switchの変更

■やりたい事：
　初期構築時及びデフォルトにて、管理用ポートは[vSwitch0]ヘ[Network Mnageder]として割り当てられる。
　環境規則や設計思想によっては管理用ポート名が別名であったり所属仮想スイッチを替えたい時がある。
　ｖCenterの管理画面上では管理ポートの上記設定変更は出来ない。(vCenterによる管理は管理ポートを用いて実施している為)
　その際の手順を備忘録的に記す。
　
■環境：
　OS:ESXi5.5U3
　NIC:１ヶ(管理ポートのみ)

■注意事項：実作業時に己が嵌った事について記す。
　１）作業実施時はローカル及び仮想BIOS接続？(実施環境ではBMCを使用)にて実施
　　当初リモート接続により実施したが設定出来なかった。
　　リモート接続環境起因での設定出来なかった際の事象としては下記点が発生。
　　　①コマンドによる設定時、途中で接続が切れる。
　　　　当たり前だが、リモート接続する際管理ポートを使用してSSH接続を実施している為、
　　　　ポートの設定変更時に疎通が出来なくなりリモート接続が遮断され後続の作業が実施出来なくなる。
　　　　その際、ローカル環境で又管理ポートの設定をしリモート接続を実施するが、
　　　　初期構築と同一のポートの割り振りへ戻って（設定しなおす）しまうので同道巡りとなってしまう。
　　　　尚、後述する②でも本質的な発生起因は同一である。
　　　
　　　②シェルによる設定を実施した際、設定が反映されない。
　　　　①にてリモート接続が出来なくなる事象に当たり、一つづつコマンドを実行しているから設定出来ないのでは？
　　　　と、推測した私はシェルを用いて一気にやれば設定出来るのでは？又、シェルならばローカルにて実施されているのだから
　　　　リモート接続が断絶した際も勝手にシェルが動いて設定してくれるのではと愚者の妙策を思い付き実施した。
　　　　結果、設定は反映されなかった。
　　　　原因としては、リモート接続したユーザがログアウトされると実行されているシェルは中断される仕様であるからである。
　　　　ログアウト後もシェルを実行させる方法は有ったかと思うが調べて無い為本件では実施出来ないとする。
　　
　　上記発生事象から、管理ポート変更時はローカル及びそれに順ずる環境にて設定をするべきである。
　　　※リモートによる管理ポート変更方法をご存知だったら教えて頂きたいと思っております。
　
　２）作業実施時はメンテナンスモードにする。
　　上記発生事象を克服し設定が理想とするものになった為、確認の為再起動を実施した際に管理ポート設定が元に戻るという事象が発生した。
　　vMware管理者の中では初歩的な事であると思われるがメンテナンスモードにせず設定をした為である。
　　初歩的な事である為忘れがち？である為留意する様にすべきである。

　３）バージョンによるコマンド差分に留意する。

■手順：
　【事前準備】
　　１）vCenter管理画面及び下記コマンドにより対象ESXi機をメンテナンスモードへ移行
　　　■コマンド：$esxcli system maintenanceModeset -e true
　
　　２）ローカルにて対象機へ接続
　　３）[F2]を押下しログイン画面を表示
　　４）ローカル管理画面より下記にてローカルにてESXiシェルの実施を許可
　　　■設定箇所：[Troubleshooting Options]＞[Disable ESXi Shell]
　　　
　　５）管理設定の再起動
　　　■実行箇所：[Troubleshooting Options]＞[Restart Manegement Agents]
　　
　　６）ログアウト
　　７）[Alt+F1]にてテキストモードでログイン
　
　【管理ポート設定変更】
　　【初期設定環境の削除】
　　　１）管理ポートの停止
　　　　■コマンド：$esxcli network vswitch standard uplink remove --uplink-name=[管理ポート] --vswitch-name=[初期搭載仮想スイッチ]
　　　
　　　２）管理ポートに綬付くポートグループの削除
　　　　■コマンド：$esxcli network ip interface remove --interface-name=[ポートグループインターフェイス名]
　　
　　※仮想スイッチは綬付くNIC及びポートグループが存在しなくなると自動的に削除される為、明示的に削除する必要はない。
　　
　　【管理ポートの作成】
　　　１）管理ポート搭載用仮想スイッチの作成
　　　　■コマンド：$esxcli network vswitch standard add --vswitch-name=[管理ポート搭載用仮想スイッチ]
　　
　　　２）NICの綬付け
　　　　■コマンド：$esxcli network vswitch standard uplink add --uplink-name=[NIC] --vswitch-name=[管理ポート搭載用仮想スイッチ]
　　
　　　３）管理用ポートグループの作成
　　　　■コマンド：$esxcli network vswitch standard portgroup add --portgroup-name=[管理ポートグループ名] --vswitch-name=[管理ポート搭載用仮想スイッチ]
　　　
　　【管理ポートの設定】
　　　１）vlanの設定
　　　　■コマンド：$esxcli network vswitch standard portgroup add --portgroup-name "[管理ポートグループ名]" --vlan-id [vlan]
　　　
　　　２）管理ポートグループとインターフェイスの綬付け
　　　　※管理用インターフェイスはデフォルトにて[vmk0]に割り当てられる
　　　　■コマンド：$esxcli network ip interface add --interface-name=[インターフェイス名] --portgroup-name="[管理ポートグループ名]"
　　　　
　　　３）IPアドレスの設定
　　　　■コマンド：$esxcli network ip interface ipv4 set -interface-name=[インターフェイス名] --ipv4=[IPアドレス] --netmask=[ネットマスク] --type=[IPアドレスの振り分け種類]
　　　　
　　　４）ゲートウェイの設定
　　　　■コマンド：$esccli network ip route ipv4 add --gateway "[ゲートウェイアドレス]"
　　　
　　【事後処理】
　　　１）再起動の実施
　　　　■コマンド：$reboot
　　　
　　　２）メンテナンスモードの解除
　　　　■コマンド：$escli system maintenanceMode set -e false
　　
以上、
Sketchで角丸を個別指定する方法（Version42以降）

角丸を個別指定しようと調べたが最新のバージョンでの方法が日本語でなかったのでメモ

## Version42以前
```
// 左上 / 右上 / 右下 / 左下
5/5/0/0
```

## Version42以降
<img width="212" alt="スクリーンショット 2017-05-04 17.54.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/87163/9ee36a88-01be-b7c3-a687-081503b7b252.png">

```
// 左上 ; 右上 ; 右下 ; 左下
5;5;0;0
```

機能として実装されているので、UIで変更できるようにしてもらいたいです。

## 参考
[Export Presets, Touch Bar, and More in Sketch 42](https://blog.sketchapp.com/export-presets-touch-bar-and-more-in-sketch-42-b02c23a9ed49)
[Sketch 42 : Multiple radius corner](http://sketchtalk.io/discussion/comment/3338/)
[Sketch.app で角丸の半径を個別に指定する方法](http://dev.classmethod.jp/visual-design/sketch3/roundrect-radius/)
機械学習系の論文まとめ

勉強のために個人的に興味を持った機械学習系の論文や記事をまとめていくページです。不定期で追加していきます。

#Graph Convolutional Networks系
- Semi-Supervised Classification with Graph Convolutional Networksのまとめ(5/4に追加)  
http://qiita.com/sakuramochi/items/14fbf46a959ced6d7fb9
- Modeling Relational Data with Graph Convolutional Networksのまとめ(5/5に追加)  
http://qiita.com/sakuramochi/items/541add66a7b75daad232

#sketch-rnn
- A Neural Representation of Sketch Drawingsのまとめ(5/9に追加)  
http://qiita.com/sakuramochi/items/b643c22bea2b80db6024
Bash On Ubuntu On Windowsのデフォルトのディレクトリ

# デフォルトのディレクトリ
普通にBash On Ubuntu On Windowsを入れると以下のパスに構築される。
```
C:\Users\[ユーザ名]\AppData\Local\lxss\
```
何故このような隠れたディレクトリに作られるのか…ｺﾚｶﾞﾜｶﾗﾅｲ

# Bash On Ubuntu On Windows外のファイルへのアクセス
Bash On Ubuntu On WindowsからWindowsで使っているファイルにアクセスするには
```
/mnt/c/
```
から辿れば良い。
※上のパスのcはドライブ。環境によってはdやらもあるはず。

まだあまりBash On Ubuntu On Windowsを使っていないがいずれCygwinは不要になるのだろうか:thinking:
日付指定で表示/非表示の切替(IE6対応)

IE6だと`getElementsByClassName`が使えないため、
`document.getElementsByTagName("span");`を使った。

```html
<span class="view_timer" start="20170503" end="20170504">20170503〜20170504の間表示</span>
<span class="view_timer" start="20170504" end="">20170504以降ずっと表示</span>
<span class="view_timer" start="" end="20170509">20170509まで表示</span>

<script>
function get_yyyymmdd() {
        var d=new Date();
        var year = d.getFullYear();
        var month = d.getMonth()+1;
        var day = d.getDate();
        if(month<10) {
                month = "0"+month;
        }
        if(day<10) {
                day = "0"+day;
        }
        var yyyymmdd = year + month + day;
        return yyyymmdd;
}

function view_timer() {
        var elements = document.getElementsByTagName("span");
        for (i=0; i < elements.length; i++) {
                if (elements[i].className != "view_timer") {
                        continue;
                }
                var start = elements[i].getAttribute('start');
                var end = elements[i].getAttribute('end');
                if((get_yyyymmdd() < start) || (end != "" && end < get_yyyymmdd())) {
                        elements[i].style.display = 'none';
                }
        }
}

view_timer();
</script>
```
５ステップで簡単にブラウザ操作を枠無し動画撮影する方法

[Windows10のXboxゲームバーの録画](http://qiita.com/shiftsphere/items/626097cd6770a760bdec)の子記事です。応用編。

#ブラウザ上でおきることを枠無しで録画する
　タイトルバーとかアドレスバーとか全部消して、簡単に**ウェブページだけ録画**したい、という需要が発生して対処したので、方法・手順をメモしておきます。

##手順
###:one: 用意するもの：Windows10のPCとGoogle Chrome
　ウェブページのみの**全画面表示機能**と、タブごとの**消音機能**があるのなら、ブラウザは他のものでもOKです。
Windows10が必須なのはXbox GameDVR録画機能を利用するためです。

###:two: 希望の録画サイズに画面解像度を合わせる
　そのまま録画される**動画の解像度**になります。

###:three: 対象以外の音を消す。
　余計な通知音とかが動画に入ってしまうのを防ぎます。
録画対象のChromeタブ以外のタブを全て消音(chromeならtab右click)、
音量ミキサーからChrome以外のソフトウェアの音量もミュートにします。
アクションセンターから「非通知モード」も設定しておきます。
![akusyonsenta-.png](https://qiita-image-store.s3.amazonaws.com/0/71326/2a7f0208-4bd3-e3b0-276e-79264d8c1bd4.png)


###:four: サイトの表示と全画面化
　Google Chromeで録画希望のウェブページを開き、F11キーでタイトルも枠も無い全画面表示にします。ワンボタンで簡単。これでタイトルバー・アドレスバーなども一切動画内に残りません。

###:five: Win + Gでゲームバーを表示し録画開始:red_circle:
　既にChromeをゲーム指定している場合は、Alt + Win + Gで録画開始できます。

##録画設定の調整
　音質を上げたいとか、60fps欲しいとかの設定はXboxアプリから行えます。
Xboxアプリ→設定→ゲーム録画→下の方
![gamerecsettings.png](https://qiita-image-store.s3.amazonaws.com/0/71326/3dae472a-9acc-bd4b-7eb7-39f5ef9cf0d2.png)

##遭遇した問題
　五分くらい経過したところから音声が録画されてない…なぜだろう
SeleniumIDEを使ってページングしている.aspxサイトの情報をなるべくノンプラグラミングで取得してみた


通常のサイトだとhtmlパラメータを使って情報を取得できるところが多いので、Firefixの拡張機能である[SeleniumIDE](https://addons.mozilla.org/ja/firefox/addon/selenium-ide/)を使うだけで簡単に情報を取得してくることができます。
しかし、aspx系のサイトだとソース内部で情報を持っており、htmlのパラメータだけでは情報取得することが出来ません。
そこで、若干ソースをいじることで(!)aspx系のサイトもノンプラミングでやろうと思いました。

## 実行環境

実行環境としては、Mac OS Seriaを想定します。

## 下準備

下記コマンドをターミナルから実行してください。

1. `pip install selenium bs4`
2. `brew install geckodriver`

## 基礎となるソースの生成

ここでSeleniumIDEを使います。
取得したいサイトで想定される繰り返し動作をSeleniumIDEでレコーディングします。
![](https://qiita-image-store.s3.amazonaws.com/0/18556/0d716c33-5c98-95c1-986b-b845933483f9.png)
![](https://qiita-image-store.s3.amazonaws.com/0/18556/4c61d40d-8858-8461-736e-ae4c20630f34.png)
そうするとテーブルのところにコマンドが表示されてきます。

コマンドが確認出来たら
![](https://qiita-image-store.s3.amazonaws.com/0/18556/da027e33-f837-72cd-18b1-b917fd4bd82a.png)
ここからエクスポートしたい言語を選びエクスポートすると、その時点でのソースが表示されます。
python2/unittest/webdriver で保存後、ソースを開くと、

```python
	def test_<保存したタイトル>(self):
```

という箇所があると思いますが、そこが実際に処理を行うところとなります。

## 繰り返し処理の作成

繰り返し処理はpythonの場合いくつかありますが、基本的に1-30ページを繰り返したいとかだと思うので、rangeを使います。繰り返したい箇所が下記のようなところであれば

```diff
-        driver.find_element_by_link_text("page 1").click()
+        for i range(1, 30):
+            driver.find_element_by_link_text("page 1").click()
```
という形で繰り返し文を繰り返したい場所の前で`for i range(1, 30):`をいれ、繰り返したいところだけインデントをします。

その後、`page 1`などのページ数に値する数字のところをみつけ、そこを`page" + str(i) + "`に変更します。

## ページの情報を取得

ページの情報を取得する場合はhtml整形ツールを使うのですが、今回はBeautifulSoup4を使います。

ソースの上の方に

```diff
import unittest, time, re
+from bs4 import BeautifulSoup
```

と追加し、ソースを出したいタイミングのところで

```python
    data = driver.page_source.encode('utf-8')
    html = BeautifulSoup(data)
    print(html.select("<セレクタ>"))
```

をペーストしてください。
<セレクタ>のところはブラウザで右クリックすると出てくる"要素の検証"で出てくるウィンドウで対象のhtmlタグで右クリックし
![css-selector.png](https://qiita-image-store.s3.amazonaws.com/0/18556/b0805676-7652-67de-1a90-119c49fb51cc.png "css-selector.png")

このCSSパスを選び、それを<セレクタ>と置き換えて下さい。

## 実行

これで実行できる状態になりました。
ターミナルを開き、

```bash

python <ファイル名>.py > test.html
```

を実行し、test.htmlが作成されれば成功です。

## まとめ

全然ノンプラグラミングではなかったので、もっとノンプラグラミングな方法を知っている方教えていただけるとうれしいですw
TweetDeckのカラム幅を調整するCSS

TweetDeckは設定からカラム幅を3段階（「Wide」「Medium」「Narrow」）で調整できるが、
「Narrow」にしてもまだカラム幅が広いので、stylishとcssで調整してみた。

```CSS:
.column {
    width: 230px !important;
}
```

数字は適当。
IoTでペットヘルスケア[構想編]

#はじめに
##ペットヘルスケアについて
皆さん、ご自宅のワンちゃん、ニャンちゃんの健康が心配になることはないでしょうか。
外出中に具合が悪くなっていないか、家にいる時でも具合悪いのを我慢していないか、など。特に急性の病気の場合、少しでも早く気がついてあげて病院に連れていきたいところです。

ネコの場合、特に**尿路系の病気は1～2日で命に関わることもあり、大変心配**です。突発性膀胱炎、膀胱結石、尿道結石、etc・・・。いろいろな要因がありますが、うちの子はなりやすさの要素にヒットする部分が多く（♂ネコ、純血種、ドライフード、肥満！）、より心配です。ご飯にはかなり気を配って（日によっては私より高い物食べてます！w)いるものの、それ以外にも要因があるということです。

まずはこのあたりのクリティカルなところを早期発見できれば・・・というのがモチベーションです。

![picture02.jpg](https://qiita-image-store.s3.amazonaws.com/0/179480/f3251c42-c903-bce4-f2a2-817cfd16be11.jpeg)



##IoTやAI関連について
丁度1年ほど前にIoTのお勉強も兼ねてAWS IoTやRaspberryPiを利用して、ちょっとしたものを作成したのですが、この1年で同じサービスでも使いやすさがグッと向上しているようです。分野として期待されていることもあり、大変進歩が早いので情報をまとめてもすぐに陳腐化する懸念も否めないのですが、現時点でのベストプラクティスとまでは行かなくても**便利な使い方や、構築の一通りの流れをご紹介**できればいいな、と思います。AI系のサービスはできれば取り込みたいです。

##取り扱う技術的な要素
以下を利用する予定ですので、ご興味のあるかたは是非。ただし、個別の要素について深掘りすると言うよりは、どう組み合わせて使うかという観点でご紹介します。そのため、それぞれについて詳しく知りたい方は別の記事や、マニュアル（本記事からも参照する予定）をご覧いただくほうが良いと思います。

- Amazon Web Services（AWS)
   - IoT、Lambda、CloudWatch、SNS、Rekognition、etc
- RaspberryPi
    - Raspberry Pi 3 Model B、GrovePi+、各種センサー類
- LINE bot
    - Messaging API

#実現したいこと
## 尿路系の症状をいち早く検知
病気については[こちら](http://www.konekono-heya.com/byouki/hinyouki/index.html)が詳しいので割愛しますが、多くの病気では症状の一つとしてトイレの利用状況に現れます。

- おしっこの回数が増える(or １分以上かかる)
- おしっこが少ない
- おしっこするとき声を出して痛がる
- トイレ以外で粗相する（つまりトイレを使っていない）

などなどです。特に、回数については多くの病気で共通した症状として現れます。これらを検知して~~飼い主~~ 召使いへ連絡することで早期発見・治療へとつなげること、また検知の仕組みがあること自体で召使いも安心できるようにすることです。そのために、まずは日頃から**普通の状態を観測**しておき、**なにか変化があった際に異常だと分かる**ようにしていきます。

#アーキテクチャ概要（全体）
以下の図のようなアーキテクチャを想定しています。ゆくゆくは色んなネコ様に使っていただきたく、スケールもし易いようにサーバレスなアーキテクチャにします。


![AWS Design_pets_healthcare.png](https://qiita-image-store.s3.amazonaws.com/0/179480/150a7a4f-d009-0c15-6bdf-c895aa8a3f6a.png)


1. ネコさん用トイレ（Cat's Restroom）に設置したセンサからデータを取得し、Raspberry Pi 3からAWS IoTへ送信します。
2. AWS IoTから各種AWSサービスに連携し、必要な処理を行った上で召使いへ通知します。
    - CloudWatch
        - トイレ利用履歴を保存します。
        - グラフ化機能を利用して、直近の利用履歴を確認できるようにします。
    - SNS
        - トイレ利用を検知し、召使いへメールやSMSで連絡します
    - Lambda
        - LINEを経由してメッセージ送信を行います。
            - 召使いがLINE botを登録したら、メッセージ送信に必要な情報を取得します。
        - より複雑な条件判定を行い、召使へ通知を行います。
            - 例：トイレの回数が異常に多い場合には、会社携帯へもSMS！（召使いは早退します）
    - （Rekognition）
        - トイレの画像から状況を判断して通知します。（仮）


書いていたらちょっと複雑になってきたきもしますが、仕組みは単純で、AWS IoTにデータを一旦集めたのち、必要な処理へ分岐できるようになっています。分岐後は、あの手この手で召使いへ連絡します。

Rekognitionはできれば使いたいところですが、ウ○チへの砂の賭け方などにムラがあり、結構厳しいのでは・・・と思っています。匂い（ガス）センサーのほうが確実だとは思うのですが、センサー自体の取扱いが少々難しいため、後回しです。

#今後
以下の記事に分割して作成予定です。
- [IoTでペットヘルスケア[実装編：センサデータの取得～AWS IoT連携]](http://qiita.com/second113/items/6219bf99f448f40be378)
- [IoTでペットヘルスケア[実装編：AWSサービス間の連携]](http://qiita.com/second113/items/490a8cb41c18cf3ff2ca)

＃それぞれが長くなりそうな場合、更に分割するかもしれません。

#おわりに
本当はずっと家にいてネコ様の召使い業務に勤しみたいところを苦肉の策で・・・というのが本音ですが、ご奉仕のためにも稼がねばなりませんので仕方ないです。できることをやらねば、ということで！
＃リモートワークしたいなぁ・・・田舎の広い家で盛大にキャットウォークを作ってあげたい！（これが真の本音）
mastodon(Docker） v1.2.2 -> v1.3.2 に伴うassets表示などの障害経験共有

今回CentOS7 Mastodon Docker利用構築
v1.2.2 -> v1.3.2のアップデートを
行った際にassetsのロードに失敗し、
Webページの画像やアイコン等が
表示されなくなりました。
アップデート時にぶつかった障害経験を共有いたします。

アプデはDBのバックアップ等を
きちんととってからやりましょう！
消えてしまうと悲しいことになります。

#簡単なアプデ経緯
他のQiita等で記載されているように、
gitでタグv1.3.2にチェックアウトして
rakeタスクにてprecompileと
DBのマイグレーションを掛けたら
本体（v1.3.2）の更新は完了でした。

この状態で表示や機能に問題はありませんでしたが、
公式のnginx設定例が変わっていたのでコピペしなおしたところ
ブラウザからのアクセス表示不正を起こしました。

#ポイントは/etc/nginx/conf.d/(お好きな名前).conf
問題は、gitに掲載されているnginxの設定例が
各バージョンのリリース地点で更新され、内容が異なっていることです。
そのため、「推奨設定を利用」と書かれたQiitaは多いですが、
**実際にはタイミング次第で内容にばらつきが出て**います。

Docker構築では本体をコンテナごと落としてくるので
設定の更新という観点がすっぽ抜けがちです。
ホストOS上に構築しているプロキシとしての
nginx設定も、本体の更新に応じて設定変更が
必要となる場合があることを覚えておきましょう。

#v1.2.2からの変更で修正が必要なもの
##DH鍵交換に必要なパラメータファイルの配置
新たな設定文が追加されたことにより、/etc/ssl/certs/dhparam.pem階層にTLS暗号通信で利用するファイルを配置する必要があります。
```openssl dhparam 2048 -out dhparam.pem```で生成したファイルをその階層に配置しましょう。
##Let's Encrypt向け設定の無効化
いまひとつ使い方をよく理解できていないので、
Let's Encrypt向け設定も先頭に#をつけて
コメントアウトしておきました。
それほどシビアな運営をしていないので、
ダウンを伴うSSL鍵更新を自分は予定しています。

##assets消失を起こした設定文の修正（？）
自分の環境でassets消失を起こした原因はnginx設定のSSL通信部分にある

```
location ~ ^/(assets|system/media_attachments/files|system/accounts/avatars) {
  add_header Cache-Control "public, max-age=31536000, immutable";
  }
```

でした。
locationディレクティブはnginxが処理する
URIの階層に合わせた設定を記載するもので、
アセットやメディア、アバター周りのヘッダーに
何かをつけ足しているような処理ですが…
ここの正規表現に誤りがある？と思われ、
問題を引き起こしました。

自分のインスタンス環境(CentOS7 Docker)で回避策として機能したのは
上記部分をコメントアウトし、下記設定に置き換えでした。（[参考](http://qiita.com/takkle/items/e62d3009dc865f66422e#comment-b1356583f953e2d7fa9e)）

```
location /assets { 
 add_header Cache-Control "public, max-age=31536000, immutable";
 try_files $uri @proxy;
 }
```

明示的にアセットを含むURIを対象とした上で同じ値を設定し、
当該URIが発見できない場合try_filesディレクティブを利用して
＠proxyの設定に飛ばしています。

同一問題を起こした方がいましたら、参考になれば幸いです。

#【おまけ】Let's Encrypt自動更新設定
安全な通信利用の促進のために、本来なら
有償であるサーバー証明書を発行してくれているのが
Let's Encryptです。取得・更新にかかる
管理コストを下げてくれるコマンドもありがたいですね。

ところが、この証明書の有効期限は
たったの90日(だったかな？）しかありません。
当然、更新を忘れると証明書が無効になってSSL接続時に
警告が表示されたり、アクセス不可能になります。
事前に対策しましょう。

##nginx停止を伴う更新
私のインスタンスにはユーザーも少ないですし、
サーバー停止にそれほどシビアな意見をもった人もいないと考えているので
一旦、certbotの更新処理は以下のようにnginx停止を含むものとしました。
おそらく、v1.3.2公開時の設定例に記載があるように、
nginxとうまく連携させれば無停止での更新が可能と思われますが…
そちらは興味があったら挑戦してみます。

```
certbot renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx"
```

certbot renewコマンドは
証明書の期限切れが近い場合、
更新を行うコマンドです。
つまり、頻繁にこのコマンドを流しても
何度も何度も証明書が更新されるわけではありません。
ただし、--force-renewオプションをつけて実行すると
強制的に更新を行います。
cronで毎週回す、といった運用を行う場合は
負荷を高めることになりよろしくありません。
頻度と負荷を考えて設定しましょう。

--pre-hook,--post-hookオプションでは、
更新前後に行いたいコマンドを記載できます。
systemdを利用しているのでsystemctlから
nginxサービスを一旦停止し、更新処理を行います。

--dry-runオプションをつけた状態で実行すると、
テスト的に更新処理が成功するかどうか確認可能です。
cronに書き付ける前に、自分の環境で正しく動作するかを
チェックするとよいでしょう。

自分は毎月5日,20日の深夜にこのコマンドが走るようcronに設定しました。
実行にはroot権限が必要と思わしき表示が
--dry-run時に出ていたのでrootで回しています。

サーバー管理は実際に自分で動かしてみると一番勉強になりますし、
他人の知見や情報を読んだ際にも腹落ちするように思います。
楽しいますとどんライフの一助になれば幸いです。
それでは！
講談社機械学習プロフェッショナルシリーズ『深層学習』の学習 第7章 再帰型ニューラルネット

注意：『<a  href="https://www.amazon.co.jp/gp/product/4061529021/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4061529021&linkCode=as2&tag=aokikenichi-22">深層学習 (機械学習プロフェッショナルシリーズ)</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=aokikenichi-22&l=as2&o=9&a=4061529021" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />』
<a  href="https://www.amazon.co.jp/gp/product/4061529021/ref=as_li_qf_sp_asin_il?ie=UTF8&camp=247&creative=1211&creativeASIN=4061529021&linkCode=as2&tag=aokikenichi-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4061529021&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=aokikenichi-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=aokikenichi-22&l=as2&o=9&a=4061529021" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
を読むにあたって、自分が読みたいな、こんな記事があったら参考になるな、という基準で書いております。私は機械学習も数学も専門家ではないので誤っている箇所も多々あるかと思いますが参考となると幸いです。

# 第7章 再帰型ニューラルネット
## 7.1 系列データの種類
とくになし

## 7.2 RNNの構造
とくになし

## 7.3 順伝播計算
とくになし

## 7.4 逆伝播計算
+ p119図7.6 次のユニットへと同じユニットの帰還路分の2つがあり、それぞれを足しているのみ。次のユニットは1, ..., k, ..., K個あるのでそれを足し、帰還路は1, ..., j, ..., J個あるのでそれを足している。わからない場合は図7.3と図7.5と何度もにらめっこをするしかないかと。

p119の最後の式

```math
p118より \\
\frac{\partial{E}}{\partial{u_j^t}}=\delta_j^t \\

(7.2)より初項のみ残り2項は消えるから \\
\frac{\partial{u_j^t}}{\partial{w_{ji}^{in}}}=\frac{\partial{\sum_i{w_{ji}^{in}x_i^t}}}{\partial{w_{ji}^{in}}} \\
係数iの項のみ残りあとは0となるので\sum_iは消えて \\
=x_i^t \\
ゆえに、\\
与式=\sum_{t=1}^T{\delta_j^tx_i^t}
```
p120の式も同様。

## 7.5 長・短期記憶（LSTM）
p124

```math
\frac{\partial{v_k^t}}{\partial{u_j^{O,t}}}=\frac{\sum_j{w_{kj}^{out}z_j^t}}{\partial{u_j^{O,t}}} \\
=\frac{\sum_j{w_{kj}^{out}g_j^{O,t}f(s_j^t)}}{\partial{u_j^{O,t}}} \\
=\frac{\sum_j{w_{kj}^{out}f(u_j^{O,t})f(s_j^t)}}{\partial{u_j^{O,t}}} \\
=w_{kj}^{out}f'(u_j^{O,t})f(s_j^t)
```

## 7.6 入出力間で系列長が異なる場合
とくになし

⇒次は、[講談社機械学習プロフェッショナルシリーズ『深層学習』の学習 第8章 ボルツマンマシン](http://qiita.com/aokikenichi/items/664292d794f4709cf3be) へ
自作アプリをアップデートするに当って、パッケージ構成ってやつを本気出して考えてみた

自作で出してるアプリ、[TwitMorse](https://play.google.com/store/apps/details?id=jp.sub.takelab.twitmorus)というのがあるのですが、今までまともにパッケージ構成とやらを考えたことがなかったので、リハビリがてら考えてみることにしました。

# パッケージ構成をちゃんと考える、とは
簡単に言うと、ある特定の役割を持ったクラスをフォルダを分けて管理することです。
一人による開発であればその人が把握していればクラスがどんな役割を持っているかがわかるので、特に必要はないかもしれませんが、機能を拡張していくたびに「あれ？こいつ何担当だ？！」となります。

たとえば、
Stringの変換などを行うクラスは"strings"と名前のついたフォルダへ
画面の表示系を担うクラスは"ui",fragmentであれば"fragments"といったフォルダ(ディレクトリ)にまとめる、ということになります。

※今回はAndroidアプリを例にしているだけで、他は知りません・・・

[TwitMorse](https://play.google.com/store/apps/details?id=jp.sub.takelab.twitmorus)は昨年の10月から全く更新をしていなかったので、今まさに半年ぶりに開いたら、「うわぁ、どれがどれか何も思い出せん・・・」となりました。なのでこの度ちゃんとクラスを整理しよう！と思いました。

わかりやすい記事があったので紹介させていただきます。

> 最初の方に、パッケージはクラスを管理するのに便利と書きましたが、他にも使うメリットはあるんです。
> 唐突ですがクラス名の重複はダメです。たとえ処理が違っていたとしても許されません。一人で開発する分> には恐らくそのような問題は起きないと思いますが、これが大人数で開発するとなると被る可能性は大です。
> しかし、パッケージが異なればクラス名が被ってもいいんです！FQCNが異なれば、クラスの区別は可能だからです。

> 例えば、同じ学校に同姓同名が何人か居たとしても、学年と組で区別できますよね？それと同じです。

[Java入門 パッケージ管理](http://qiita.com/Co_Pilot/items/1d1e5078754133fe12cd) より引用。

## リファクタリングをひたすらやることになる
単純にディレクトリを掘ってその中にjavaファイルを入れる作業だと思って始めた作業、これが意外とダルいことになります。

![スクリーンショット 2017-05-04 15.56.58.png](https://qiita-image-store.s3.amazonaws.com/0/13595/bb80d6bf-8329-6d16-12b5-c9979fec7559.png)

まあ適当にこんな感じで分けて、複数以上ないやつだけ外に置き去りにします（正しい方法は知りません）

Android開発といえばAndroidStudioですが、この子がディレクトリにファイルを移動するたびに「リファクタリングする？」と聞いてきます。私は何も考えず「yes」をどんどん選択。

クラスの役割を思い出しての分配を考えては移す作業を終わって・・・ビルドをしようとすると


**真っ赤やんけーーーーーーーーーー**

▂▅▇█▓▒░('ω')░▒▓█▇▅▂うわあああああぁあぁあ


なぜこれが起きるかというと、
パッケージを分けていなかったために、

protectedにしていたメソッド達が呼び出せなくなるのです。
今までは同じパッケージにいたからprotectedで済んだものの、今度はパッケージ構成が変わったためにpublicにしないと他パッケージからアクセスできない(利用できない)メソッドがたくさん生まれたのです。

この罠にハマって延々30分、エラーを潰す作業になります。

本当にちっさいクソアプリで助かった。

## まとめると、プロジェクト作るときにちゃんとパッケージ構成は考えるべき
私のように個人で作っていると、「どうせ一人で開発してるしパッケージとか適当でいいだろ」という思考になりますが、久々にプロジェクトをいじると訳が分からない状態になります。
それを解消しようとすると、更に2次災害としてエラー地獄と戦うことになります。

**ちゃんとパッケージ構成は考えた方がいいですね！一番最初に！！個人であっても！！！**

ということに気づいたので、リハビリを兼ねて久々にqiitaに投稿してみました。
Cargoでビルド時に別のコマンド(protoc)を走らせた

めんどくさいからコードと箇条書きだけです。

* [Protocol Buffers](https://developers.google.com/protocol-buffers/)を使いたかった。
    * なんとか.protoというファイルを作り、それをprotocコマンドに食わせることで、rustの(に限らずいろんな言語の)ソースコードが生成されるしくみ
    * 具体的なrust用のライブラリは[これ](https://github.com/stepancheg/rust-protobuf/)
    * 上記ライブラリのドキュメントに書いてあるインストール手順は一通り済ませたので、コマンドラインからprotocコマンドを手で叩けば*.proto ==> *.rsの変換はできるのだが、当然こんなのはcargo build時に自動でやってほしい
* ディレクトリ構成は、こんな感じにした

```text
project/
  ├ cargo.toml
  ├ build.rs
  ├ src/
  │ └ (生成された.rsファイルの出力先)
  └ proto/
    └ なんとか.proto
```

* Cargo.tomlの`[package]`下に、次の一行を追加

```text
build = "build.rs"
```

* build.rsの中身はこんな感じで書いた。 [ここ](http://doc.crates.io/build-script.html)参照。

```rust:build.rs
use std::env;
use std::ffi::OsStr;
use std::fs;
use std::str;
use std::path::Path;
use std::process::Command;
use std::process::Stdio;

fn main() {
    let root_path = env::var("CARGO_MANIFEST_DIR").unwrap();
    let out_dir = Path::new(&root_path).join("src");
    let proto_dir = Path::new(&root_path).join("proto");

    let mut processes = vec![];
    for entry in fs::read_dir(&proto_dir).unwrap() {
        let path = entry.unwrap().path();
        if !path.is_dir() && path.extension().unwrap_or(OsStr::new("")) == "proto" {
            let child = Command::new("protoc")
                .args(&["--rust_out", out_dir.to_str().unwrap()])
                .args(&["--proto_path", proto_dir.to_str().unwrap()])
                .arg(path.to_str().unwrap())
                .stderr(Stdio::piped())
                .spawn()
                .expect("protoc error");
            processes.push(child);
        }
    }
    for process in processes.into_iter() {
        let output = process.wait_with_output().expect("protoc error");
        if !output.status.success() {
            for line in str::from_utf8(output.stderr.as_slice()).unwrap().split("\n") {
                println!("cargo:warning={}", line);
            }
        }
    }
}
```

これでcargo buildするだけで勝手にprotocコマンドが走る。 protocコマンドでエラーがあったらそれもcargoで表示してくれる。 めでたし。
Pythonのサブプロセスを使ったメモ


pipeで色々やりたい。意外と手こずった。。

* encodeに気をつける
* envを渡す
* 標準出力を閉じるとかのタイミングの理解
* subprocess.PIPEを使わずにcommuticateがいいのかも、、
	pollとかもある。少し試してうまく使いこなせなかったのでパス。


```python
    def _transrate(trans_opt):
        """
        翻訳
        """
        # import locale
        # enc = locale.getpreferredencoding()
        # env['PYTHONIOENCODING'] = enc
        command0 = '/usr/bin/pbpaste'
        command1 = '/usr/local/bin/trans' + trans_opt
        command2 = '/usr/bin/pbcopy'
        env = os.environ.copy()
        env["PATH"] = "/usr/bin:/usr/local/bin/:" + env['PATH']
        # command0
        process0 = subprocess.Popen(shlex.split(
            command0), stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env)
        process0.wait()  # wait()は簡易的な実装
        # command1
        process1 = subprocess.Popen(shlex.split(
            command1), stdin=process0.stdout, stdout=subprocess.PIPE, env=env)
        process1.wait()  # wait()は簡易的な実装
        # Allow ps_process to receive a SIGPIPE if grep_process exits.
        process0.stdout.close()
        # command2
        process2 = subprocess.Popen(shlex.split(
            command2), stdin=process1.stdout, stdout=subprocess.PIPE, env=env)
        process2.wait()  # wait()は簡易的な実装
        # Allow ps_process to receive a SIGPIPE if grep_process exits.
        process1.stdout.close()
        # Allow ps_process to receive a SIGPIPE if grep_process exits.
        process2.stdout.close()

        """
        通知
        """
        process0 = subprocess.Popen(shlex.split(
            command0), stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env)
        process0.wait()  # wait()は簡易的な実装
        output = process0.communicate()[0].decode('utf-8')
        process0.stdout.close()
        command3 = '/usr/bin/osascript -e \'display notification "'+output+'" with title "翻訳"\''
        subprocess.Popen(shlex.split(command3), env=env)

    def transrate_j2e():
        """
        翻訳
        """
        _transrate(' -b ja:en')
    def transrate_e2j():
        """
        翻訳
        """
        _transrate(' -b en:ja')

```
[Ubuntu 16.04] PostgreSQLのリモート接続設定


Ubuntuサーバ上にPostgreSQLをインストールしてリモート接続設定する機会があったので再設定時のためにメモ．

##postgresql インストール
まずターミナルからPostgreSQLをインストールする．

```
sudo apt-get update
sudo apt-get install postgresql 
```

Ubuntu16.04上ではインストールされたPostgreSQLは /etc/postgresql に展開される．
上記のディレクトリに移動して設定ファイルを確認する．

```
cd /etc/postgresql/[Version]/main

ls
postgresql.conf pg_hba.conf ... etc
```

今回設定で使用するファイルはpostgresql.confとpg_hba.confの２つである．まずpg_hba.confに関しての以下の通り設定を行う．

##pg_hba.confの修正

```text:pg_hba.conf
...

 TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
...
```

上記のような設定箇所があるのでこれのIPv4コネクションの箇所を修正する．初期状態ではローカルのみからアクセス許可になっているのでこれに以下のように追記する．

```text:pg_hba.conf
...

 TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             0.0.0.0/0               md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
...
```

ipアドレスを0.0.0.0/0とすることで全ipからのパスワード接続を許可することが可能となる．自分のプライベートネットワークipを把握してる場合には192.168.\*\*.0/24 (\*\*は自分で調べる)のようにして制限すると良いと思う．
またmethodについてはパスワード認証であるmd5を指定しているが，この場合には対象データベースのみにアクセスできるユーザの利用ができないらしい．．使ったことないので分からない．
この場合にはmethodを通常のパスワード認証であるpasswordにしてSSL経由でアクセスが勧められているらしい．（今回は採用していない）
余裕がある場合にはrootユーザであるpostgresでのリモート接続を拒否した方が良いと思うので下記のようにするとベスト．

```text:pg_hba.conf
...

 TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             0.0.0.0/0               md5
host    all             postgres        0.0.0.0/0               reject
# IPv6 local connections:
host    all             all             ::1/128                 md5
...
```

今回はやってないがローカルでrootユーザからのアクセスもpeer認証に変更した方が良い．
これで一度ローカルのターミナル上でrootユーザにログインしてからでないと，rootユーザ経由でのデータベースアクセスをできないように制限できる．
ちなみにmethodをtrustにするとパスワード認証すらなくなるので宜しくない．
これでpg_hba.confの設定を終了して，次にpostgresql.confに関しての設定をする．

##postgresql.confの修正


```text:postgresql.conf
...

#listen_addresses = 'localhost'

...
```

上記の箇所がファイル内に存在するのでこれをコメントアウトを解除して以下のように設定することで，リモート接続を許可する．

```text:postgresql.conf
...

listen_addresses = '*'

...
```


以上の設定が終了後にPostgreSQLを再起動すればOK．


##postgresqlに関して

ちなみに起動・停止・確認・再起動のコマンドは以下の通り．

```
/etc/init.d/postgresql start     ## 起動

/etc/init.d/postgresql stop      ## 停止

/etc/init.d/postgresql status    ## 確認

/etc/init.d/postgresql restart   ## 再起動
```

最後に，ファイアウォール等を設定している場合はPostgreSQLのデフォルトポートである5432は開ける作業も必要．
Re:VIEWでシンタックスハイライト

config.ymlのハイライト設定を有効化する。

```yaml
highlight:
    html: "rouge"
    latex: "listings"
```

HTMLの場合はそのままでいいが、PDFを生成するとjlisting.styがないというエラーが出るので、`jlisting.sty`を落としてきてstyディレクトリに放り込む。

# シンタックスハイライト言語を追加する方法

rougeやpygmentsについては不明。ただし、開発が活発に続いておりたいていの言語には対応しているので困る場面は少ないだろう。

listingsはサポートしていない言語が多い。特に、最近の言語となると一切サポートがないので、シンタックスハイライトする言語を追加する必要がある。

`texstyle`に指定されたstyファイル(デフォルトだと`reviewmacro.sty`)に次のように書けばよい。他のファイルに分割したければusepackageを使う。

```latex
\lstdefinelanguage{javascript}{
  % いろいろ書く
}
```

「いろいろ書く」の部分はlistingsで言語を追加する方法を調べるとわかる。

# C#問題

[Re:VIEWでHighlight](http://qiita.com/kyusyukeigo/items/36fc722dd48928faa045#%E5%95%8F%E9%A1%8C)

ここで触れられている問題。

言語指定でC#とした場合、`#`という記号のせいでシンタックスエラーが出てPDFのビルドに失敗する。幸い、pygmentsやrougeではcsharpというエイリアスが存在するのでそちらを使えばよい。

ただし、csharpという言語を指定してもlistingsは理解してくれないので、C#と同じルールのcsharpという言語を新たに定義する必要がある。

```latex
\lstdefinelanguage{csharp}{
    language = [Sharp]C
}
```

# スペースが謎の文字に置換される問題(LaTeX)

![スクリーンショット 2017-05-04 15.22.46.png](https://qiita-image-store.s3.amazonaws.com/0/65320/b0c0834b-dfdc-1826-7ab0-f91e79c0706e.png)

`lstset`の内部で`showstringspaces=false`すればよい。`reviewmacro.sty`でコメントアウトされている部分のコメントを外して追加するのが手っ取り早い。

# 謎の文字列(1zw)問題(LaTeX)

https://github.com/kmuto/review/issues/419 を参考に解決した。
初心者がGit/Git-Flowの輪郭をつかむまで

#Git/Git-Flowの輪郭をつかむまで使ったサービス等の紹介
自分の学習を時系列順で紹介します。
###対象読者：
・git add/commit/checkoutは使ったことはあるが、gitを用いたチーム開発を行ったことがない方

##①LearnGitBranching
(http://k.swd.cc/learnGitBranching-ja/)
※Chromeではデザインが乱れるのでSafari/Firefoxでの利用を推奨
・Gitがどのように動くのかを視覚的に理解できる

##②Gitチュートリアル
(https://www.atlassian.com/ja/git)
・①で使ったコマンドの復習/深掘りができる
・①で使わなかったが便利なコマンドを学習できる

##③Gitブランチを使いこなすgit-flow／GitHub Flow入門 連載一覧
(http://www.atmarkit.co.jp/ait/articles/1311/18/news017.html)
・①②でGitの基本的なコマンドは理解できたと思うので、Git-Flowについて理解を深める

##④git flow × Pull Request を使ってモダンな開発してみた
(http://qiita.com/Tamiiy/items/86f122d40ef6b158c2ab)
・Git-Flowの開発の流れがわかりやすく、端的にまとめられているため、③の理解を補うことができる

##補)Qiitaの記事
不明点が出た際に、逐次Qiitaの記事を参考にすれば理解が早まると思います。
Powershellでパスワード入力

PowerShellで簡単なパスワード入力方法と入力した文字の確認する仕方を調べたので、
記載します。
###PowerShellでパスワード入力と入力文字の確認
``` 
$secstr = Read-Host -Prompt "Please enter a password" -AsSecureString
if ($secstr.Length -gt 0) {
    $intptr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secstr)
    $str = [System.Runtime.InteropServices.Marshal]::PtrtoStringBSTR($intptr)
    Write-Host $str
    [System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($intptr)
}
```
重要な処理は、以下の2つです。
1. Read-Host -AsSecureStringで*付きのパスワード文字列の入力を受け付けられるようにする。
2. PowerShell上で、入力された文字を確認するために、.NETのMarshelクラスを使って変換する。(確認し終わったら、すぐにメモリを開放する)

###Read-Hostの入力画面
PowerShell_ISEとPoweShellでは、Read-Hostの入力画面が異なっていたので、メモのため記載しておきます。

PowerShell_ISE
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178885/91df5997-a545-35cc-315a-8a7ebdedbfbf.png)

PowerShell
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178885/1688d891-2505-91b3-ff1d-1b51a1d923ed.png)
『Raspberry Piで学ぶARMデバイスドライバープログラミング』第2章の配線結果メモ

# 概要
『Raspberry Piで学ぶARMデバイスドライバープログラミング』第2章の配線結果メモ

# youtubeリンク
[![7セグLTE](http://img.youtube.com/vi/VDPKypYvWMg/0.jpg)](http://www.youtube.com/watch?v=VDPKypYvWMg)
画面の表示値を利用することの問題点- 13[C#リファクタリングサンプル]

##画面の表示値を利用することの問題点
元の値があるのに、表示名をロジックに組み込んだコードを見かけることがある。このコードの問題点は表示が変わった場合に、ロジックの修正をしなければいけない点である。サンプルコードで具体的に示す。

##サンプルコード
サンプルコードでは区分値(IsOk)がYesの場合、○を画面表示している。設計書に○の場合に太字にするという記載がある場合、作成されるコードは以下のようなコードになる。
尚、画面から区分値および、その表示値は取得できるものとする。

```csharp
        /** 区分値 **/
        private enum IsOk
        {
            Yes,
            No
        }

        public void Main()
        {
            // NG 画面表示に対して実装している。表示が○でなくなると修正が必要。
            if (GetDisplay() == "○")
            {
                SetBold();
            }
        }

        private IsOk GetValue()
        {
            // 画面に設定されたフラグ値を取得する。ビルドのため、固定値になっている。
            return IsOk.Yes;
        }

        private string GetDisplay()
        {
            // 画面に設定されたフラグに対する表示値を取得する。ビルドのため、固定値になっている。
            return "○";
        }

        private void SetBold()
        {
            // 文字を太字にする。コードは省略。
        }
```
<details>
<summary>java</summary>
<div>

```java
    /** 区分値 **/
    private enum IsOk {
        YES, NO,
    }

    public void main() {

        if (getDisplay() == "○") {
            setBold();
        }
    }

    private IsOk getValue() {
        // 画面に設定されたフラグ値を取得する。ビルドのため、固定値になっている。
        return IsOk.YES;
    }

    private String getDisplay() {
        // 画面に設定されたフラグに対する表示値を取得する。ビルドのため、固定値になっている。
        return "○";
    }

    private void setBold() {
        // 文字を太字にする。コードは省略。
    }

```
</div>
</details>

##問題点
サンプルコードの場合、表示を○から◎にすると、if文の中を修正する必要がある。画面の表示から切り離すためには、区分値を使用すればよい。

##リファクタリング後
```csharp
        /** 区分値 **/
        private enum IsOk
        {
            Yes,
            No
        }

        public void Main()
        {
            // OK 表示にかかわらずYesの場合は動作する。画面表示の影響は受けない。
            if (GetValue() == IsOk.Yes)
            {
                SetBold();
            }
        }

        private IsOk GetValue()
        {
            // 画面に設定されたフラグ値を取得する。ビルドのため、固定値になっている。
            return IsOk.Yes;
        }

        private string GetDisplay()
        {
            // 画面に設定されたフラグに対する表示値を取得する。ビルドのため、固定値になっている。
            return "○";
        }

        private void SetBold()
        {
            // 文字を太字にする。コードは省略。
        }
```

<details>
<summary>java</summary>
<div>

```java
    /** 区分値 **/
    private enum IsOk {
        YES, NO,
    }

    public void main() {

        if (getValue() == IsOk.YES) {
            setBold();
        }
    }

    private IsOk getValue() {
        // 画面に設定されたフラグ値を取得する。ビルドのため、固定値になっている。
        return IsOk.YES;
    }

    private String getDisplay() {
        // 画面に設定されたフラグに対する表示値を取得する。ビルドのため、固定値になっている。
        return "○";
    }

    private void setBold() {
        // 文字を太字にする。コードは省略。
    }
```
</div>
</details>
##まとめ
画面表示値をそのまま使用するのではなく、もととなった値を使用する。少なくとも画面表示に依存する部分を減らすことができる。

[前の記事(条件分岐後の処理が冗長な場合)](http://qiita.com/csharpisthebest/items/799ec629fed1e1e22f3f)

[次の記事(例外を無視する)](http://qiita.com/csharpisthebest/items/9733feaf0b829ef0b67d)

[目次](http://qiita.com/csharpisthebest/items/57f27a33085f01211166)
24時間形式←→29時間形式 日付変換関数（主に放送業界用）

需要があるかどうか分かりませんが、某テレビ局さんの、とあるプロジェクトに参画させて頂いていた際に作ったのでここに記しておきます。
[動くサンプルはこちら](https://www.astworks.com/tools/thirty-hours-format-converter)

## 24時間形式を29時間形式へ
```php
<?php
    /**
     * @param  string $datetime
     * @param  bool $isEnd
     * @return string
     */
    public function convert24DateTo29Date(string $date, string $time = '00:00:00', bool $isEnd = false): string
    {
        /**
         * 00:00:00 ～ 04:59:59 または、終了時間かつ 05:00:00 なら29時間形式へ変換
         */
        if ( ("{$date} 00:00:00" <= "{$date} {$time}" && "{$date} {$time}" < "{$date} 05:00:00")
            || ( $time === "05:00:00" && $isEnd ) )
        {
            $arrDate = explode('-', $date);
            $arrTime = explode(':', $time);
            $timestamp = mktime(0, 0, 0, $arrDate[1], $arrDate[2], $arrDate[0]);
            return date('Y-m-d', $timestamp - 60 * 60 * 24) . ' ' . str_pad(intval($arrTime[0]) + 24, 2, 0, STR_PAD_LEFT) . ":{$arrTime[1]}:{$arrTime[2]}";
        }
        
        return "{$date} {$time}";
    }
```

## 29時間形式を24時間形式へ
```php
<?php
    /**
     * @param  string $date
     * @param  string $time
     * @return string
     */
    public function convert29DateTo24Date(string $date, string $time = '00:00:00'): string
    {
        $arrTime = explode(':', $time);
        
        if (intval($arrTime[0]) >= 24 && intval($arrTime[0]) <= 29) {
            $arrDate = explode('-', $date);
            $timestamp = mktime(intval($arrTime[0]) - 24, $arrTime[1], $arrTime[2], $arrDate[1], $arrDate[2], $arrDate[0]);
            return date('Y-m-d H:i:s', $timestamp + 60 * 60 * 24);
        }
        
        return "{$date} {$time}";
    }
```
【Python】備忘録 正規分布の面積を求める自作関数

#備忘録
統計学に関する初歩的な関数
N(0,1^2)に従う正規分布のグラフの面積を求めるだけ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/139300/b111c780-01fa-a1ae-232b-2bc4ae120d8a.png)
↑これ
このポリープみたいな曲線の式は、
$$ f_{(x)}=\frac{1}{\sqrt{2x}}e^{(-\frac{x}{2})} $$
で与えられます。
コメントしてくれた人、有難うございます。

#ソース(誰得)
##1.  0からxまでの面積を求める
```python:NORMAL_Dist_S

def NORMAL_Dist_S(a):
    """N(0,1^2)に従う正規分布の x=0からaまでの面積を返す"""
    import numpy as np
    import math
    from scipy import integrate


    f = lambda x: (math.exp(-x**2/2)) / math.sqrt(2*math.pi)
    s,d = integrate.quad(f, 0, abs(a))
    return s

```

NORMAL_Dist_Sは、

x=任意の実数
res = NORMAL_Dist_S(x)
と書き、

S(x)の値をresに返します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/139300/af3c7d72-cf46-8c22-4bbc-43363c1ea9f3.png)

##2. x=∞からxまでの面積を求める

```python:NORMAL_Dist_S_REST

def NORMAL_Dist_S_REST(a):
    """N(0,1^2)に従う正規分布の x=0からaまでの面積を0.5から引いた値を返す"""
    import numpy as np
    import math
    from scipy import integrate


    f = lambda x: (math.exp(-x**2/2)) / math.sqrt(2*math.pi)
    s,d = integrate.quad(f, 0, abs(a))
    s=0.5-s
    return s

```

NORMAL_Dist_S_RESTは、

x=任意の実数
res = NORMAL_Dist_S_REST(x)
と書き、
S(x)の値をresに返します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/139300/4cf32233-baaf-fd9f-5b75-5ba7871b8a4f.png)


##3.  任意の2地点の積分

```python:NORMAL_Dist

def NORMAL_Dist(a,b):
    """N(0,1^2)に従う正規分布の aからbまでの面積を返す"""
    import numpy as np
    import math
    from scipy import integrate


    f = lambda x: (math.exp(-x**2/2)) / math.sqrt(2*math.pi)
    s,d = integrate.quad(f, a,b)
    return s

```

NORMAL_Distは、

x=任意の実数
y=任意の実数
res = NORMAL_Dist(x,y)
と書き、
S(x)の値をresに返します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/139300/f3bd8e36-367f-4dec-1444-004ca6278486.png)


#感想
もっと単純明快かつ高速にかけそう
故に、誰得関数。

どんどん関数を増やしていきたい。(誰得なのに!!??)
なんだかんだいって、自分は使う場面が結構あるし、
めんどくさいからこの機会に思い切って関数化。

てかこの程度なら、pythonのimportするライブラリになんかあると思う。
というより、ないはずがない。

##出典など
http://org-technology.com/posts/integrate-function.html
https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83