OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry pi3B+を使えるようにするまでの覚書き

職場でIoT・AI大臣に任命されたらしくひとまず Raspberry Pi 3 Model B+を会社の予算で手配したもの、手続き上実際に納入されるまでしばらくかかるのでプライベートで買った同モデルをひとまず触って遊べるようにするまでの覚書き。
（実質的にはメインのwindows機からリモートデスクトップで接続できるようにするまでの作業）


##【購入モデル】
RS - Raspberry Pi3B+ Trial series, Basic Set
https://jp.rs-online.com/web/p/products/2552286929?intcmp=JP-WEB-_-Pi-_-Jan-19-_-trial_series_basic_set

RSオンラインのラズパイ入門セット。
あとはどこにでも転がってるHDMI接続可能なディスプレイ、USBキーボード・マウスがあればひとまず動かせる。


##【セットアップ】
付属のmicroSDにRaspbianが入ってたから、Raspbianに関する細々としたセットアップ。

###①SSHの有効化
これができていないとリモートデスクトップできないので。

1. RaspbianデスクトップからRaspberryアイコンをクリック
2. メニューの「設定」から「Raspberry Piの設定」をクリック
3.「インターフェース」タブの中から、SSHの有効ラジオボタンを選択して「OK」ボタンをクリック

###②XRDP・VNCサーバのインストール
ココの通り。https://www.hiramine.com/physicalcomputing/raspberrypi3/xrdp_installconnect.html

```ruby
$ sudo apt-get update
$ sudo apt-get install xrdp
$ sudo apt-get install tightvncserver
```

※コメントにもあるけれど、この方法だとGUIでログイン以外の再起動・シャットダウンができないので、

```ruby:再起動
$ sudo shutdown -r now
```

```ruby:シャットダウン
$ sudo shotdown -h now
```

が必要。


ひとまずここまで。
制御工学をCで実現する（積分制御）

　今回の記事は積分をCで表現します。
　手法としては「双一次変換」あるいは「bilinear transform」と呼ばれる手法です。
この辺の技術が書いてある本はデジタルフィルタの本なので、制御工学を勉強してもなかなか出てきません。
　今から制御工学を学ぶ時にはデジタルフィルタの勉強も一緒にやっていくと良いと思います。

　ちなみにデジタルフィルタについては以下の記事がまとまっています。
https://qiita.com/fukuroder/items/e1cd551b7492020da992

###積分の伝達関数

積分をラプラス変換して伝達関数にすると、教科書的には以下の通り

```math
G(s) = \frac{1}{s}\qquad(1)
```

sが分母にきます。

###双一次変換

双一次変換はZ変換を簡単にしたようなものです。詳細については別に解説します。
変換方法としては以下の式でsを置き換えることになります。

```math

s=\frac{2}{T}\frac{1-z^{-1}}{1+z^{-1}}\qquad(2)
```

G(s)に代入すると、分子分母が逆になるので以下のように変換できます。
ここでT[s]はサンプリング周期です。前回のmain関数と合わせるためにT＝0.1[s]としました。

```math
G(z)=\frac{1}{\frac{2}{T}\frac{1-z^{-1}}{1+z^{-1}}}=\frac{T}{2}\frac{1+z^{-1}}{1-z^{-1}}\qquad(3)
```

これで離散時間領域の伝達関数ができました。

###具体的な係数
　ここまでで、伝達関数は完成しました。伝達関数は多項式の分子と分母を持つ分数の形で表されますが、
実際の数値を計算してみます。
　必要とされるのはサンプリング周波数です。今回は0.1秒で計算しますが、実際のシステムに合わせないと破綻します。
　$\frac{2}{T}$は分子分母どこにかけても問題はないのですが、分母の1に係数がかかると後の計算が面倒になるので、分子の方にかけます。

```math
G(z)=\frac{T}{2}\frac{1+z^{-1}}{1-z^{-1}}=\frac{0.1}{2}\frac{1+z^{-1}}{1-z^{-1}}=\frac{0.05+0.05z^{-1}}{1-z^{-1}}\qquad(4)
```

 この伝達関数はIIRフィルタと呼ばれるデジタルフィルタの伝達関数になるため、
以下の式で与えられます。

```math
H(z)=\frac{\sum_{k=0}^{K} b_kz^{-k}}{1-\sum_{m=1}^Ma_mz^{-m}}\qquad(5)
```

普通のデジタルフィルタだとKとMが長くなっていくのですが、今回の伝達関数ではK=1,M=1となります。したがって以下の式になります。

```math
H(z)=\frac{b_0+b_1z^{-1}}{1-a_1z^{-1}}\qquad(6)
```
(6)式の係数に(4)式の係数が代入されます。
$b_0=0.05$,$b_1=0.05$,$a_1=-1$です。


###伝達関数と差分方程式の関係
　次は伝達関数を差分方程式に変換していきます。
差分方程式とは現在の出力値を、現在の入力値、過去の入力値、加工の出力値から計算する式になります。

```math
y[n]=\sum_{m=1}^Ma_my[n-m]+\sum_{k=0}^{K} b_kx[n-k]\qquad(7)
```
aは１から、bは０からの多項式になるので注意です。

(7)式も使う項だけ取り出すと以下の式になります。

```math
y[n]=a_1y[n-1]+b_0x[n]+b_1x[n-1]\qquad(8)
```



###Cで実装する

前回と同じようにfilter()に積分の処理を実装します。

```c
float x_1 = 0.0;
float y_1 = 0.0;

int filter(float input)
{
   const float Ki=1.0;
   const float T = 0.1;
   const float a_1 = -1;
   const float b_0 = 0.05;
   const float b_1 = 0.05;

   float output;
   output = a_1 *y_1 + b_0 * input +b_1 * x_1;
   y_1 = output;
   x_1 = input;

   return output;
}
void main()
{
   float input,output;
   while(1)
   {
      input = get_input_signal();
      output = filter(input);
      set_output_signal(output);
      sleep(100);
   }
}
```
###実使用上の注意
前回の比例制御ではなかなか起こらないのですが、積分制御では出力値が＋かーに大きくなりすぎて、出力の範囲を超えてしまう場合があります。
積分は入力した信号の面積を計算するようなものなので、収束する方向で系が動いている場合には０に近づいていきますが、発散する方向に信号が動いている場合には簡単に出力信号の範囲を超えてしまいます。
この場合、収束するようにPIDのゲインを調整しますが、積分の値が大きくなりすぎると、収束するようなゲインになっても値がなかなか小さくならないので、どんなに待っても安定しないような状態になります。
試行錯誤を繰り返すPIDのゲイン調整では、こういう状態は困ります。そこで、出力信号の範囲を超える出力が出た時に、次の積分計算を止めます。
それ以上積分の出力が大きくならないようにすることで、安定状態になった時に正常な積分計算ができます。

###まとめ
これまでにPID制御のPとIについて述べてきました。積分はデジタルフィルタの知識がないと、実装ができないのですが、それを教えてくれる制御工学の本は皆無です。
どなたか、そのあたりの記述がある本を見つけたら、ご一報ください。


###参考文献

- 三上直樹、初めて学ぶディジタル・フィルタと高速フーリエ変換
PostgreSQLをコマンドラインから立ち上げたいとき。

#使用環境
- macOS Mojave ver. 10.14.3
- PostgreSQL 11.2

#あらすじ
　pythonのチュートリアルでPostgreSQLを用いたFlaskアプリをherokuに配置セクションがあり、PostgreSQLをコマンドラインから立ち上げる必要性が生じた。

　ネットで軽く検索して見た所、brewを使ってPostgreSQLをインストールして、PATHを指定しているブログが多かった。しかし、自分はすでにPostgreSQLをアプリケーションとしてダウンロードしており、それらのブログの手順を追ってもPostgreSQLをコマンドラインから立ち上げることはできなかった。

#解決策

PATHをしていするのは変わらず、そのPATHが他のブログとは違いました。
```terminal
$nano .bash_profile
```
echoを使っているかたが多いですが、初心者の僕はnanoを立ち上げるのが主流です。
その.bash_profileに以下のようなPathを追加しましょう。

```nano
export path="/Application/Postgresql.app/Contents/Versions/latest/bin:$PATH"
```

こだわりのversionがある場合は、latestのところを指定のバージョンの数字に変えてください。


以上です。
これでコマンドラインからPostgreSQLが起動できます！！



###参考文献
https://stackoverflow.com/questions/20928734/how-to-put-psql-on-the-path-when-using-postgres-app-on-os-x
これの2番目に人気のある回答に助けられました。

debugにかかった時間：1時間
無料でiOSでシンプルなWebアプリを作ってアイコンをホーム画面に設置する方法

# はじめに
iOSでシンプルな**Web**アプリを作って、アイコンをホーム画面に設置する方法です。HTMLとCSS、JavaScriptを使用してアプリを作ることができます。簡単なツールなどであればこれで十分です。

ちなみに、Swiftを使ってアプリ開発をする場合でも、実機テストは無料ですることができます（**ただし有効期限は1週間で、1週間ごとに延長が必要**）。
[誰でも無料でiPhoneの実機を使ってiOSアプリ開発する方法 - Qiita](https://qiita.com/Night___/items/ebe4d55b10804db9700c) などを参照。

# テンプレート
```html
data:text/html;charset=utf-8,
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
<link rel="apple-touch-icon" href="アイコンのURL">
<title>アプリのタイトル</title>
<style>*{-webkit-tap-highlight-color: rgba(0, 0, 0, 0); -webkit-touch-callout: none; -webkit-user-select: none;}</style>
```

`-webkit-tap-highlight-color: rgba(0, 0, 0, 0);` : リンクタップ時のグレーの影をOFF
`-webkit-touch-callout: none;` : 長押しでのメニュー呼び出しの無効化
`-webkit-user-select: none;` : テキスト選択の無効化

## ステータスバーの色
###白
```html
<meta name="apple-mobile-web-app-status-bar-style" content="default">
```

###黒
```html
<meta name="apple-mobile-web-app-status-bar-style" content="black">
```

###透明
```html
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
```



# 追加する方法
1. この作成した長いテキストをSafariで開く（Macの場合は[Handoff](https://support.apple.com/kb/ph25168?locale=ja_JP)でコピーするのが便利）
2. Safariの画面下の共有ボタンから、`ホーム画面に追加` を選ぶ

# 注意点
デスクトップ版ChromeやFirefoxで動作確認する場合は、すべての **`#` を `%23`に置換してください**。でないと正常に表示されません。
参考：https://qiita.com/shge/items/325b3c4fc95b9190c9cd

# 参考文献
ウェブページをできる限りネイティブアプリっぽく魅せるテクニックまとめ 〜アップルにリジェクトされつづけるなら、ウェブアプリとストアをつくって自前で配信してしまおうという企み〜 - KAYAC engineers' blog
https://techblog.kayac.com/2016/12/12/090000
pythonで名前空間付きXML処理

#### 名前空間付きXMLファイルの読み込み・パース
こちらを参考にさせて頂きました。
https://qiita.com/yuki2006/items/d84b37f07b70d02c5504
が、デフォルト名前空間のXMLパースが出来ず、はまりました。

結果的に処理用の仮想的なNamespaceを定義しないとうまくできませんでした。
以下は
デフォルト名前空間が、'urn:iso:std:iso:20022:tech:xsd:pain.001.001.03'
読み込みたいXML Pathが、
CstmrCdtTrfInitn/PmtInf/CdtTrfTxInf/RmtInd/Strd/Invcee/CtctDtls/Othr
であった場合のものです。
やむなく'1'というNamespaceを処理用に定義しています。

```
ns = {'1': 'urn:iso:std:iso:20022:tech:xsd:pain.001.001.03'}   
Ref_Xpath = ".//1:CstmrCdtTrfInitn/1:PmtInf/1:CdtTrfTxInf/1:RmtInf/1:Strd/1:Invcee/1:CtctDtls/1:Othr" # Search Xpath for pain.001-pain.002 matching reference tag 
for i in root.findall(Ref_Xpath, ns):
    RefList.append(i.text)
```

#### 名前空間付きXMLファイルの書き出し
こちらはさらにはまりました。
ElementTreeでの出力はあきらめ、
名前空間なしで出力したXMLを、通常のファイル入出力で読み込んで、文字列置換して、名前空間を埋め込みました。

きっともっといいやり方はあると思いますが、私は見つけられませんでした。
Googleスプレッドシートで時間の入力を強制する

Googleスプレッドシートを共同編集してデータを集める・・・よくあるワークフローだと思います。その際にセルのデータの型を時間に固定する方法です。

「データ」=>「データの入力規則」で日付や数値に固定する方法はあるのですが、時間（～＝時刻）に固定する方法がありません。その時は、カスタム数式で以下のように入れるといいです。入力規則を適応する左上のセル番号で`A1`を置き換えてください。

```
=AND(LT(A1, 1), ISDATE(A1))
```
なっとく！アルゴリズム(p32)をSwiftで書く(配列の要素を小さいものから順に並べていくサンプルコード)

配列の要素を小さいものから順に並べていくサンプルコード

```Swift
import Foundation

//配列を入れると、一番小さいindexを返す
func findSmallest(array: [Int]) -> Int{
    var smallest = array[0]
    var smallestIndex = 0
    //iは0~ 配列の数
    let totalArray = array.count - 1
    
    for i in smallestIndex ... totalArray {
        if array[i] < smallest {
            smallest = array[i]
            smallestIndex = i
        }
        
    }
    return smallestIndex
}

//新しい配列をつくる
func selectionSort(array:[Int]) -> [Int] {
    var inputArray = array
    var newArray = [Int]()
    var totalArray = inputArray.count - 1
    
    for i in 0 ... totalArray {
        //pytonでいう array.pop(smallest)がない？　指定した位置の要素を削除し、値を取得みたいなやつ
        //配列の中の一番小さい値のはいっているindexを習得したら、新しい配列に入れて配列から消す
        let smallest = findSmallest(array:inputArray)
        newArray.append(array[smallest])
        inputArray.remove(at:smallest)
    }
    return newArray
}

var array = [6,4,1]
print(selectionSort(array:array))

```

実行結果

```
[1, 4, 6]
```

Paizaも
https://paiza.io/projects/6jP7hjM4PqqVMQVRPAQMKg?locale=en-us

## 躓いたところ

```Swift
func selectionSort(array:[Int]) -> [Int] {
    var newArray = [Int]()
    var totalArray = array.count - 1
    
    for i in 0 ... totalArray {
        //pytonでいう array.pop(smallest)がない？　指定した位置の要素を削除し、値を取得みたいなやつ
        //配列の中の一番小さい値のはいっているindexを習得したら、新しい配列に入れて配列から消す
        let smallest = findSmallest(array:array)
        newArray.append(array[smallest])
        array.remove(at:smallest)
    }
    return newArray
}
```

### エラー内容
入れている配列は変数のはずなのになぜこういうエラーが出るのか不思議だった

```
main.swift:30:9: error: cannot use mutating member on immutable value: 'array' is a 'let' constant
        array.remove(at:smallest)
```

参考文献のリンクを参照し、もしかして値渡しをしなくてはいけないのかなと思い書き直した。
また、関数引数は定数(let)はこういう問題に直面しないと、知らないなとも思った

↓

```
Swiftは関数引数は定数(let)。関数引数を直接書き換えることはできない。
```


## 参考文献
[Swiftの値型と参照型、値渡しと参照渡し](https://qiita.com/chihayafuru/items/f6bb38c4a34d8cf62aa9)
mac初心者が覚えとくと便利なショートカットキー

筆者はmac初心者です(2018年10月に初めてmacに触れたので歴浅め)
自分の覚書用に、覚えとくと便利なmacコマンドを整理してみました。

###command + space
スポットライト検索を呼び出す。
起動したいプログラム名を入れると候補が出てくる。これで簡単にプログラムを起動できる。
###command + W
アクティブなウィンドウを閉じる。
###command + Option + W
アクティブなウィンドウを全て閉じる。
###command + H
一番前のアクティブなウィンドウを非表示にする。
###command + Option + H
アクティブなウィンドウを全て非表示にする。
デスクトップを出したいときに便利。
###command ＋ T
タブを新規で開く(chrome,terminalなどで使えそう)
###command + tab
アクティブなプログラムを一覧に表示する。
tabとshift tabもしくは左右キーで移動可能。
###option + command + ← または →
左右のタブに移動する。
chromeでタブ移動をするときとかに使える。
###command + control + F
ウィンドウを最大化する
もう一度押すと元の大きさに戻る
###command + ,
最前面のウィンドウの環境設定を開く
###command + N
新規ウィンドウを開く
###command + M
ウィンドウをDockにしまう

#文書操作系の便利なコマンド
###control + A
行または段落の先頭に移動
###control + E
行または段落の末尾に移動
###control + K
カーソルより後ろの文字を全て削除
【GAS】Font Awesome でくるくる回るローディングアイコンを実装する

# 目的
何らかの処理を行っている間だけローディングアイコンを出したい。

外部ライブラリを使ってもできるのですが、デザインがいまいちしっくり来なかったので、FontAwesomeのローディングアイコンをつかって実装しました。

# Fontawesomeとは
ウェブサイトでよく使いそうなアイコンを無料で提供してくれるサービスです。（有料プランもありますが今回は無料プランのアイコンを使います）

https://fontawesome.com


# 動作
![名称未設定.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/159675/7af5fe4e-2602-feb2-6b79-7799b4ee244d.gif)

ボタンを押したら何らかの処理が走って、処理が終了するまでローディングアイコンがくるくる回ります。
# ソース

```html:HTML
 <!-- ボタン -->
　<button>ここを押すと何らかの処理が始まる</button>

 <!-- ローディングアイコン -->
  <div class="loading">
    <i class="fas fa-spinner fa-5x fa-spin"></i>
  </div>

```

```css:css
.loading {
  display: none; /* 通常時は非表示 */
  z-index: 1;
  position: fixed;
  top: 50%;
  left: 50%;
  color: gray;
}
```

```javascript:javascript
  $('button').on('click', function(){
    // ローディングアイコンを表示
    $('.loading').css('display', 'block');

    // doSomethingでなにか処理を実行し、処理が終わったらダイアログを出す
    google.script.run
    .withSuccessHandler(function(){
      $('.loading').css('display', 'none');
      alert('成功しました');
    })
    .doSomething();
  });
```

```javascript:GoogleAppsScript
  function doSomething(){
    // なにかする
    return true;
  }
```

# 解説
まずHTML側でローディングアイコンを用意しておきます。
classに`fa-spin`を指定することでアイコンがくるくる回ります。

```html
 <!-- ローディングアイコン -->
  <div class="loading">
    <i class="fas fa-spinner fa-5x fa-spin"></i>
  </div>
```

しかし、用意したアイコンはCSSから`display:none;`で非表示にしておき、ボタンが押されたタイミングで`display:block;`にし、画面上に表示させます。



ローディングアイコンを表示させたら、その後行いたい処理を`doSomething()`で実行、終わったらアイコンを`display:none;`で消して、ダイアログを表示します。
・連続した数を配列に入れる。・何通りか？（組合せ）

##①１〜5の連続した数を配列に入れる

```ruby
m = (1..5) => 1..5
m = (1..5).to_a => [1,2,3,4,5]
```
to_aを使うと配列に変換される。

##②文字列から何個抜き出すと何通りあるか？
**文字列．combination**
[1,2,3,4]の中からn個抜き取る。重複しない組み合わせ。**逆順含まない**（例[1,2][2,1]は含まない）

```ruby
n = 2
[1,2,3,4].combination(n).to_a => [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
```

**文字列．permutation**
[1,2,3,4]の中からn個抜き取る。重複しない組み合わせ。**逆順含む**（例[1,2][2,1]含む）

```ruby
n = 2
[1,2,3,4].permutation(n).to_a => [[1, 2], [1, 3], [1, 4], [2, 1], [2, 3], [2, 4], [3, 1], [3, 2], [3, 4], [4, 1], [4, 2], [4, 3]]
```
Polybarの番号によるフォント指定に関する注意点

## 「設定したフォント番号」と「番号によるフォント指定」のズレ

フォント番号設定は0-based indexなのにフォント指定は1-based indexだから注意してね、という話です。

ドキュメントには "**-font = 1 will use font-0*" って書かれてます。

具体例を出すと、

```config:~/.config/polybar/config
font-0 = "Fira Code:pixelsize=10;3"
font-1 = "Osaka:pixelsize=14;3"
```

のフォント番号設定がある時、

```config:~/.config/polybar/config
bar-fill-font = 1
bar-empty-font = 2
```

のフォント指定では、

- bar-fill-font -> Fira Code
- bar-empty-font -> Osaka

になります。

これを間違えて「アイコン表示できない！」って戸惑う人が現れないことを祈ります。現れたらこの記事が参考になってほしい。

## まとめ

0-based indexと1-based indexは0オリジンと1オリジンとも呼ばれるらしい

## 参考
[Fonts - jaagr/polybar](https://github.com/jaagr/polybar/wiki/Fonts#fonts)
Jupyter NotebookでCTF（初級）

ハイレベルなCTFにはまったく歯が立たないが、いざというときに使えるようリストアップしてみた。

# シーザー暗号

よく出てくるシーザー暗号。

```python
def _rot13(c):
    if 'A' <= c and c <= 'Z':
        return chr((ord(c) - ord('A') + 13) % 26 + ord('A'))
    if 'a' <= c and c <= 'z':
        return chr((ord(c) - ord('a') + 13) % 26 + ord('a'))
    return c

def rot13(s):
    g = (_rot13(c) for c in s)
    return ''.join(g)
```
https://github.com/usop4/jupyter_sectools/blob/master/ksnctf_2_easy_cipher.ipynb

# pycurl

curlをpythonから使えるようになると、パスワードリスト攻撃などを効率的にしやすくなる。（あ、もちろんCTFでの話ですよ・・・）

```python
import pycurl
from io import BytesIO

buffer = BytesIO()
c = pycurl.Curl()
c.setopt(c.URL, 'http://ctfq.sweetduet.info:10080/~q32/auth.php')
c.setopt(c.WRITEDATA, buffer)
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.HTTPPOST, [('password[1]', 'dummy'),('password[2]', 'dummy')])

c.perform()
c.close()

body = buffer.getvalue()
print(body.decode('iso-8859-1'))
```

https://github.com/usop4/jupyter_sectools/blob/master/ksnctf_12.ipynb

# nc

```python
import socket
import time

def mysend(s, message):
    time.sleep(0.1)
    message = message + '\n'
    s.send(message.encode())
    time.sleep(0.1)
    data = s.recv(1024).decode('utf-8').splitlines()[0]
    print(data)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('example.com', 1234))
```

# numpy

numpyは多次元配列などを扱いやすくするモジュールだが、matplotlibと組み合わせて、計算結果をざっと確認するのに便利。

```python
import numpy as np
import matplotlib.pyplot as plt

arr2d = []
arr2d.append([1,0])
arr2d.append([0,1])
arr2dnp = np.asarray(arr2d)
plt.imshow(arr2dnp)
```
![np.png](https://qiita-image-store.s3.amazonaws.com/0/33389/fc67155e-18fb-62b8-a00f-3ef78585be8d.png)

# バイナリ、文字列

```python
print(chr(int('0b01110100',0))) # t

```

# crypt

最後にcrypt。ksnctfのJohnという問題はJohn the ripperというプログラムを使ってパスワードリストから総当たりするのが王道かもしれないが、Pythonのcryptで解くのもスマートな感じで気持ち良い。

https://ksnctf.sweetduet.info/problem/14

```python
import crypt

s = '''
user00:$6$Z4xEy/1KTCW.rz$Yxkc8XkscDusGWKan621H4eaPRjHc1bkXDjyFtcTtgxzlxvuPiE1rnqdQVO1lYgNOzg72FU95RQut93JF6Deo/:15491:0:99999:7:::
user01:$6$ffl1bXDBqKUiD$PoXP69PaxTTX.cgzYS6Tlj7UBvstr6JruGctoObFXCr4cYXjIbxBSMiQZiVkKvUxXUC23zP8PUyXjq6qEq63u1:15491:0:99999:7:::
user02:$6$ZsJXadT/rv$T/2gVzYwMBaAsZnHIjnUSmTozIF/ebMvtHIJjikFehvB8pvy28DUIQYbTJLG6QAxhzJAKOROnZq0xV4hUGefM1:15491:0:99999:7:::
'''

salt = []
hash = []
for line in s.splitlines():
    m = line.split(":")
    n = m[1].split("$")
    hash.append(m[1])
    salt.append(n[2])

password = []
for line in open('password_list.txt', 'r'):
    password.append(line.strip())
    
for s in salt:
    for p in password:
        h = crypt.crypt(p, salt='$6$'+s+'$')
        if h in hash:
            print(p)
            break
```
VaioPro13でWindows10とUbuntu18.04をデュアルブートする手順

VaioでWindowsとUbuntuのデュアルブートできた記念。
この記事は、普通のWindowsPCでUbuntuのデュアルブートしたことある人向けです。
ほぼ自分用備忘録。

#ここが変だよSonyさん
Vaioは独自Bootソフトのせいで、普通にUbuntuをインストールしてもWindowsしか起動しないようです。
そこに気づくのにかなり苦戦しました。
（Sonyさんはヘンな独自仕様多い気がするのは気のせいですかね。。。）

#この作業を始める前に
EFIパーティションをいじるので、PCが起動できなくなる可能性があります。
Windows回復ドライバとシステムイメージを作成して、元に戻せるようにしておくのが良いです。


#手順
色々試した結果、最終的にたどり着いた手順は以下のとおりです。
（ほとんど [こちら](http://tsukachu.hatenablog.com/entry/dualboot_with_ubuntu_and_windows) の記事と手順と同じです）

1. Windowsの「コンピュータの管理」で、Ubuntuインストール用のパーティションを作成する。

1. BIOS設定を以下のようにする。
  * Secure Boot : Disabled
  * Boot Mode: UEFI
  * External Device Boot: Enabled
  * Boot Priority: External Device をトップにする

1. Ubuntu18のインストールメディアでTry Ubuntuを起動する。

1. Try UbuntuでUbuntuのインストーラを起動する。

1. インストールの種類で「それ以外」を選択。

1. 手順1で作ったパーティションに以下を作成する。
  * システムファイル領域
     * タイプ：基本パーティション
     * 利用方法：ext4
     * マウントポイント:/  
  * スワップ領域
     * タイプ：基本パーティション
     * 利用方法：swap

1. **「ブートローダをインストールするデバイス」で、既存EFIパーティションのデバイスを指定する。**
（私の場合は/dev/sda3。新規EFIパーティションを作成してはダメ）

1. インストールする。
ユーザ登録などはいつものUbuntuと同じようにする。
インストール完了しても再起動しないで、Try Ubuntuを続ける。

1. ターミナルを開いて以下のコマンドを実行する。
（/dev/sda3の部分は、自分のPCのEFIパーティションがあるデバイスに置き換えること）

    ```terminal:
ubuntu@ubuntu:~$ sudo -i
root@ubuntu:~# mkdir tmp
root@ubuntu:~# mount /dev/sda3 tmp
root@ubuntu:~# cd tmp/EFI/Microsoft/Boot/
root@ubuntu:~/tmp/EFI/Microsoft/Boot# mv bootmgfw.efi bootmgfw.efi.org
root@ubuntu:~/tmp/EFI/Microsoft/Boot# cp ../../ubuntu/shimx64.efi bootmgfw.efi
```

1. PCを再起動する。

1. Grubが立ち上がるので、ubuntuを起動する。
（Windowsも候補に出てくるが、起動はできない）

1. /boot/grub/grub.cfgを開き、
```chainloader /EFI/Microsoft/Boot/bootmgfw.efi```
を
```chainloader /EFI/Microsoft/Boot/bootmgfw.efi.org```
に書き換える。

1. PCを再起動し、GrubでWindowsを選択する。
無事、Windowsが立ち上がれば作業完了。

#おまけ
Vaioは起動時、 /EFI/Microsoft/Boot/bootmgfw.efi しか見ないようです。
efibootmgrでubuntuのブートローダをUEFIブートマネージャに登録しても、再起動すると登録内容が消えていました。

あと、VaioPro13にはUbuntu14が入りませんでした。インストールしても起動時にドライブが見つかりませんと言われて、起動できませんでした。
16, 18は問題なかったので、14はドライバが古かったのかな？
CSSで吹き出しを作成する方法

HTMLとCSSで簡単な吹き出しを作成する方法をメモ書き程度に残しておきます。
もともと、Wordpressでやっているブログのちょっとしたデザイン変更で書いたけれど、何となくいらなくなった。
デモは以下のような感じ。

### 【デモデザイン】 CSSで作る吹き出しデザイン
![Create_a_new_fiddle_-_JSFiddle.png](https://qiita-image-store.s3.amazonaws.com/0/253969/26b43c75-6335-d2eb-d5e0-393290f32d94.png)

### html
```html
<p>
  <span class="check-point-ballon">
    Point
  </span>
  吹き出しを作成したよ
</p>
```
### css
```css
.check-point-ballon {
  background-color: #415cf5;
  padding: 9px;
  color: white;
  border-radius: 9px;
  text-align: center;
  position: relative;
  margin-right: 10px;
}

.check-point-ballon::before {
    content: '';
    position: absolute;
    right: -22px;
    border-style: solid;
    border-width: 13px;
    border-color: transparent transparent transparent #415cf5;
}
```
fields_forにハマった

日記に画像を登録するのに、diaryモデルとimageモデルを使用して実装。

画像の登録はcarrierwaveを使いました。

別モデルのデータを表示するにはアソシエーションとfields_forでのフォーム生成が必要。

##アソシエーション
diary:image = 1:多 の関係性なので

```diary.rb
has_many :images, dependent: :destroy
#オプション（dependent: :destroy)で日記が消えたらそれに関連する画像も消える設定にした。
```

```image.rb
belongs_to :diary
```

## リファレンスキー追加

```text:ターミナル
rails g migration add_references_to_images diary:references
```
```create_images.rb
class CreateImages < ActiveRecord::Migration[5.2]
  def change
    create_table :images do |t|
      t.string :name
      t.references :diary, foreign_key: true #追記

      t.timestamps
    end
  end
end
```

```add_references_to_images.rb
class AddReferencesToImages < ActiveRecord::Migration[5.2]
  def change
    add_reference :images, :diary, foreign_key: true
  end
end
```
これでimagesテーブルにdiary_idが入る。


##gemインストール
```ruby:Gemfile
gem 'carrierwave'
```

```text:ターミナル
bundle install
```

## uploader追加
```text:ターミナル
rails g uploader image
```
```image.rb
mount_uploader :name, ImageUploader
#nameカラムに画像のデータが入ります。
```

##入力フォーム作成

```_form.html.erb(diary)

<%= form_for(@diary) do |form| %>
  <% if @diary.errors.any? %>
    <div id="error_explanation">
      <%= pluralize(angel.errors.count, "error") %> prohibited this diary from being saved:

  <div class="field">
    <%= form.label :date %>
    <%= form.date_field :date, value: Time.now.strftime("%Y-%m-%d") %>
  </div>

   <div class="field">
    <%= form.label :content %>
    <%= form.text_area :content %>
  </div>

#異なるモデル(imageモデル）をいじるときはform.fields_forを使う
  <%= form.fields_for :images do |image| %> 
    <div class="field">
      <%= image.label :image %> #表示名
      <%= image.file_field :name %>　#ファイル選択ボックスを生成し、データの送り場所を指定
      <%= image.hidden_field :id %>
    </div>
  <% end %>


  <div class="actions">
    <%= form.submit %>
  </div>

<% end %>

<%= link_to 'Back', diaries_path %>
```

##accepts_nested_attributes_for
```diaries_controller.rb
class DiariesController < ApplicationController
    def new
      @diary = current_user.diaries.new
      @diary.images.build
    end

    def create
      @diary = current_user.diaries.build(diary_params)
      if @diary.save
        redirect_to @diary, notice: 'diary was successfully created.'
      else
        render :new
      end
    end

  private

    def diary_params
      params.require(:diary).permit(:date ,:gift ,:content ,:user_id ,:angel_id,
        images_attributes: [:id, :name, :_destroy])#編集や削除の際にid,;_destroyが必要らしい
    end
end
```

```diary.rb
accepts_nested_attributes_for :images
```

モデルでaccepts_nested_attributes_forを指定することでコントローラのstrongparameter内でimages_attributeを使ってカラムを指定することができる


##画像の表示

```show.html.erb
<%= image_tag @diary.images.first.name.to_s %>
```
スキルイベントをsubscribeする

# 概要
alexaでは、各種イベント通知をsubscribeすることができ、alexaスキルとは別のlambdaで受けることができます。
今回は`スキル有効化イベント`をsubscribeしてみます。

こちらの内容を実際にやってみました。
https://developer.amazon.com/ja/docs/smapi/add-events-to-your-skill-with-smapi.html


### 参考
- [スキルイベント](https://developer.amazon.com/ja/docs/smapi/skill-events-in-alexa-skills.html)
  - アカウントリンクイベント
  - スキル有効化イベント
  - スキル無効化イベント
  - スキル権限付与イベント
  - スキル権限変更イベント

- [リストイベント](https://developer.amazon.com/ja/docs/smapi/list-events-in-alexa-skills.html)
  - リスト項目作成イベント
  - リスト項目更新イベント
  - リスト項目削除イベント
  - リスト作成イベント
  - リスト更新イベント
  - リスト削除イベント


## 作成する物
- alexa skill（通知する側のスキル）
- イベント通知を受け取るlambda（subscribeする側のlambda）

## やってみた
### 1. alexaスキルの作成
メインとなるalexaスキル、すなわち通知する側のスキルを作成します。

今回は[これ](https://qiita.com/tekuto_tk/items/a1d654d299323822c6ba)で、サクッとサンプルアプリを作ります。
（別になんでもよいです。）

---

### 2. subscribeするlambdaの作成

serverless frameworkを利用してlambdaを作ります。

```
$ serverless create --template aws-nodejs --path subscribe-event-lambda
```

イベント通知を受け取るために、lambdaの入力トリガーとして、skillIdを指定してalexaと連携させます。
serverless frameworkでは、 `events`の部分を追加すればOKです。

serverless.yml

```yaml
functions:
  hello:
    handler: handler.hello
    events:
      - alexaSkill: amzn1.ask.skill.xxx

```

イベント通知の中身を確認するために、lambdaのコードに`console.log`を追加します。

```handler.js
module.exports.hello = async (event, context) => {
  console.log(JSON.stringify(event));
  return {
    statusCode: 200,
    body: JSON.stringify({
      message: 'Go Serverless v1.0! Your function executed successfully!',
      input: event,
    }),
  };
}
```

### 3.イベント通知の設定
メインのalexaスキルの`skill.json`に、どのイベントを、どのlambdaに通知するかを記載します。
今回は、 スキル有効化イベント(`SKILL_ENABLED`)を、
hello lambda(`arn:aws:lambda:us-east-1:XXXX:function:subscribe-event-lambda-dev-hello`)に通知するようにします。

skill.json

```json
{
  "manifest": {
    "manifestVersion": "1.0",
    "events": {
      "subscriptions": [{
          "eventName": "SKILL_ENABLED"
        }
      ],
      "endpoint": {
        "uri": "arn:aws:lambda:us-east-1:XXXX:function:subscribe-event-lambda-dev-hello"
      }
    },
    ...(省略)
  }
}
```

そして反映させます。

```bash
$ ask api update-skill -s ${SKILL_ID} -f skill.json

# おそらくこっちでもよいはず。
( $ ask deploy --target skill )
```

以上で、実装は終了です。

## 結果
それでは、動作確認してみます。
iphoneのalexaアプリを使って、βテストスキルを有効化してみました。

```
$ sls logs -f hello -t
{
  "version": "1.0",
  "context": {
    "System": {
      "application": {
        "applicationId": "amzn1.ask.skill.XXX"
      },
      "user": {
        "userId": "amzn1.ask.account.XXX"
      },
      "apiEndpoint": "https://api.fe.amazonalexa.com",
      "apiAccessToken": "ZZZ"
    }
  },
  "request": {
    "type": "AlexaSkillEvent.SkillEnabled",
    "requestId": "32e96da0-26dd-4fce-848d-69b38a0887c8",
    "timestamp": "2019-03-10T07:13:42Z",
    "eventCreationTime": "2019-03-10T07:13:42Z",
    "eventPublishingTime": "2019-03-10T07:13:42Z"
  }
}
```

イベント通知を受け取るlambdaで、無事にsubscribeできました。
オブジェクトを JSON.stringify してできた文字列をさらに JSON.parse してできるオブジェクトの型の宣言

とあるオブジェクトを JSON.stringify してできた文字列をさらに JSON.parse してできるオブジェクトの型の宣言したい場合には、以下のように Mapped types を利用することで元のオブジェクトの型から型を生成することができます。

```ts
type Jsonize<T> = {
  [P in keyof T]: T[P] extends Date
    ? string
    : T[P] extends Array<infer U>
      ? Array<Jsonize<U>>
      : T[P] extends object
        ? Jsonize<T[P]>
        : T[P]
};
```

Date 型は string に変換し、配列は要素の型を再帰的に変換、それ以外のオブジェクトはプリミティブになるまで再帰的に変換する形です。 

利用例は以下のようになります。

```ts

interface Simple {
  str: string;
  num: number;
  bool: boolean;
  nul: null;
  date: Date;
}

interface Complex extends Simple {
  obj: Simple,
  array: Simple[];
  optional?: Simple;
}

type Jsonized = Jsonize<Complex>;

const jsonized: Jsonized = {
  obj: {
    str: '',
    num: 0,
    bool: true,
    nul: null,
    date: '',
  },
  str: '',
  num: 0,
  bool: true,
  nul: null,
  date: '',
  array: [{
    str: '',
    num: 0,
    bool: true,
    nul: null,
    date: '',
  }],
  optional: undefined,
};
```
全銀フォーマットの口座振替持込フォーマットかつゆうちょ銀行のみ対応

https://github.com/SequencePalladium/VBRepositories/tree/master/changeFormat

#やりたいこと
　全銀フォーマットの出力プログラム作成
　DB使わない
　Office使わない

#やりたかったこと（時間見て対応するかも）
　いろんな銀行のフォーマット出力（ゆうちょオンリー）
　一回出力されたデータの取り込み、修正
　DataGridViewをもうすこしうまく使う
　他にもいろいろあるけど疲れた。

#説明
　VisualStudio2017で作成。
　実行ファイルはそのまま使われても微妙なので、コーディングの参考用にアップ。
　実行ファイルができる場所に下記3ファイルを配置してください。
　・accountList.txt
　・print.txt
　・remitter.txt
　あまり難しいことをやっているわけではなく、以下の2点が主眼。
　・ファイルの読み書き
　・DataGridViewを使ってデータ入力

#参考にしたサイト
　https://dobon.net/
　主にファイル読み込み、DataGridViewの読み込みで色々なページを参考にさせてもらいました。

#後書き
　多分、自分がアップするものはQiitaにあげるレベルではないので、
　どっか別のブログ借りる形式にすると思われる。
VTKFortranの紹介

##はじめに
可視化フォーマットであるVTKをFortranから使用できるライブラリであるVTKFortranについて紹介する．

##ライブラリについて
[VTKFortran](https://github.com/szaghi/VTKFortran)はStefano Zaghi氏によって開発されているFortran用のライブラリである．
構造格子，非構造格子の両方に対応しており，XML形式で出力が可能であり，並列化にも対応している．
ライセンスについては修正BSDライセンス(2,3)とMITライセンスが提示されている．
備忘録的ではあるが，インストールまでを記載することにする．

##インストール
ソースコードはgithubから入手可能である．

```
git clone --recursive https://github.com/szaghi/VTKFortran.git
cd VTKFortran
git submodule update --init --recursive
```

今回はmakeを用いた場合のコンパイル方法について書く．
makefile内でフラグが宣言されているので編集する．

```
# User options
TESTS    = no
SHARED   = no
STATIC   = yes 
COMPILER = gnu
DEBUG    = no
F03STD   = no
OPTIMIZE = no
OPENMP   = no
MPI      = no
R16P     = no
```

今回はintelコンパイラを使いたいので以下のようにした．

```
COMPILER = intel
```

あとはmakeを叩くだけである．

```
make
```

作成されたライブラリはstaticの中に作成される．

```
.
|-- libvtkfortran.a
|-- mod
`-- obj

```

自作のソフトに使用したい場合はmodフォルダとlibvtkfortran.aをリンクする．

##終わりに
今回はコンパイルまでの紹介となったが，src/test内にテストコードがあるようである．
CSS animation で遊び倒す - mask image -

CSS animation day 47 となりました。
本日は、mask プロパティに について、お届けします。

#1. 完成版
![スクリーンショット 2019-03-10 16.45.55.png](https://qiita-image-store.s3.amazonaws.com/0/232715/a7300b20-3277-7065-ef67-626924690830.png)



#2. 参考文献
[Tech.Dig](https://tech-dig.jp/css-mask/)
[Clipping and Masking](https://css-tricks.com/clipping-masking-css/)
[WPJ](https://www.webprofessional.jp/masking-in-the-browser-with-css-and-svg/)
[オークニズム](https://www.okuni.me/entry/clip-path-customize)

#3. 分解してみる

❶. 

まずは、マークアップします。
星空の絵を中央に出しましょう。

```index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <link rel="stylesheet" href="css/styles.css" />
  </head>
  <body>
    <div class="container">
      <img src="img/star.png" class="alpha-target" />
    </div>
  </body>
</html>
```


```styles.css
body {
  margin: 0;
  padding: 0;
  background: #fffddd;
}

.container {
  position: relative;
  width: 100%;
  height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
}

img {
  display: block;
  max-width: 50%;
  height: auto;
  margin: 0 auto;
}
```


![スクリーンショット 2019-03-10 16.45.22 (1).png](https://qiita-image-store.s3.amazonaws.com/0/232715/1a83ad3c-8593-71c2-322b-e6fbe30387be.png)


星空が出ました。

❷.
[mask プロパティ](https://developer.mozilla.org/ja/docs/Web/CSS/mask-mode) を使用します。-webkit- をつけないと動きませんので、注意しましょう。

```styles.css

.alpha-target {
  -webkit-mask-image: url("../img/cat.png");
  -webkit-mask-mode: alpha;
  -webkit-mask-repeat: no-repeat;
  -webkit-mask-size: 400px; 
  -webkit-mask-position: center center;
}
``` 

![スクリーンショット 2019-03-10 16.45.55.png](https://qiita-image-store.s3.amazonaws.com/0/232715/503fc087-6592-022e-c1fe-08b814b478e8.png)


星空の画像をネコ型にくり抜くことができました。
素敵ですね！
___
mask プロパティについて、解説します。
<br/>
__mask-mode__:
mask 画像には、alpha と luminance の2つのタイプがあります。

alpha は、自分の画像が黒いところ (alpha値: 1)と重なった部分を、画像として表示します。

今回の場合、cat.pngが
<img width="929" alt="スクリーンショット 2019-03-10 15.08.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/232715/b51196e7-78b2-0750-71cb-e9606b5583d9.png">

黒色をしておりました。mask-mode: alpha で、猫の黒い部分(アルファ値1)だけが、切り抜かれたというカラクリです。
面白いプロパティですね！
<br/>
__mask-image__:
mask 画像を指定するのですが、background image と同じような使い方をします。
・使用できる画像は、jpg, png, svg があり、グラデーションも設定できます。

```styles.css

.alpha-target {
   mask-image: linear-gradient(black 0%, transparent 100%);

```

![スクリーンショット 2019-03-10 15.44.01.png](https://qiita-image-store.s3.amazonaws.com/0/232715/01e40f50-e452-8364-1ced-9944a49e0bce.png)
<br/>
__mask-size, maske-position__:
background-size, background-position と同じような使い方をします。
mask 画像の大きさと、表示位置を指定することができます。
<br/>
__mask-repeat__
mask画像を、どのようにリピートさせるかを決めることができます。

-webkit-mask-repeat: round;
ぎっちりつめてリピートします。

![スクリーンショット 2019-03-10 17.03.35.png](https://qiita-image-store.s3.amazonaws.com/0/232715/ec94c79a-fc5c-a8e0-85dc-faa191ee9f1a.png)


-webkit-mask-repeat: space;
領域内に、感覚を空けて配置します。

![スクリーンショット 2019-03-10 17.05.02.png](https://qiita-image-store.s3.amazonaws.com/0/232715/7b44867d-8399-bcfd-bae3-478a7287f74e.png)

リピートさせたくないときは、no-repeatをつけましょう。
<br/>

本日は以上となります。
明日は、このテクニックを使い、アニメーションを設定していきます。
それではまた明日〜
data:text/htmlから始まるデータスキームが動作しないときの対処法 (原因は#)

以前までメモ帳などの簡単なWebアプリを `data:text/html` から始まるデータURIスキームを使用して作れたのですが、それが Chrome 72 から動作しなくなっています。

# 原因
> Treat '#' as ending data URI body content (removed)
https://www.chromestatus.com/feature/5656049583390720

URL内での `#` は本来は指定したIDを持つ要素へ飛ぶようにするものです。例えば `index.html#foo` というURLであれば、`foo` をIDに持つ要素にジャンプします。しかし、Chromeではそれをデータスキーム内では無視していました。
そのおかげでデータスキームを使用したWebアプリが作れていたのですが、それらがアップデートにより動作しなくなってしまいました。

これは、データスキームの `#` 以降が無視されることによって発生します。
例えば `data:text/html,<html><style>body{color:#ddd}</style><p>test` を開くと、`color:#ddd` に含まれる `#` 以降が無視されて、`test` という文字列が描画されません。

Firefox は以前から `#` 以降を無視するようになっていましたが、Safari（2019/3/10現在）は `#` 以降もそのまま描画します。

# 対処法
URL内に含まれるすべての `#` をエスケープして `%23` とすればOKです。
お使いのテキストエディタや [テキスト操作ツール](https://shge.github.io/texttools/) などを使って一括置換するだけです。

# 参考文献
- [データスキームメモ帳の注意](http://var.blog.jp/archives/46650927.html)
- [Treat '#' as ending data URI body content - Chrome Platform Status](https://www.chromestatus.com/feature/5656049583390720)
【データサイエンス】データサイエンスによく使われるscikit-learnを学ぶ

##はじめに
こんにちは、皆さん！[@Raphael_de_murl](https://twitter.com/Raphael_de_murl)です。今回は機械学習やデータサイエンスの処理でよく使われるライブラリをご紹介したいと思います。

##scikit-learnとは
![image.png](https://qiita-image-store.s3.amazonaws.com/0/309361/b856a949-e4f9-52cc-312c-72a8e05eb123.png)
以下は[scikit-learn - Wikipedia](https://ja.wikipedia.org/wiki/Scikit-learn)の定義です。
>scikit-learn (旧称：scikits.learn) はPythonのオープンソース機械学習ライブラリである。サポートベクターマシン、ランダムフォレスト、Gradient Boosting、k近傍法、DBSCANなどを含む様々な分類、回帰、クラスタリングアルゴリズムを備えており、Pythonの数値計算ライブラリのNumPyとSciPyとやり取りするよう設計されている。

結構目に慣れたライブラリ名が見えてますね。説明の通りscikit-learnはSVMとかRandom Forestとかk近傍法とか色んな機械学習関連のライブラリとよく使われてますので基本からしっかり身につける必要がありますと思ってます。

##scikit-learnの特徴
![image.png](https://qiita-image-store.s3.amazonaws.com/0/309361/02dd4c3f-de98-00f0-b296-713e8a2a185a.png)[scikit-learn アルゴリズム・チートシート](https://scikit-learn.org/stable/tutorial/machine_learning_map/)
上記のの画像はscikit-learnのアルゴリズムチートシートです。多分機械学習を勉強している方や現役で使っている方はよく見た画像だと思います。これらは機械学習を行う際、やりたい処理に対しどのモデルを選んでやるのかをscikit-learnがサポートしてくれるっていう風に理解すれば大丈夫だと思います。この4つの分析を軽く見てみます。

<b>classification(分類)</b>は２つ以上の離散カテゴリへの分類ラベルを予測するモデルとしてクラス分類問題や教師あり学習で使われます。

- SGD classifier
   - 大規模のデータの線形のクラス分類手法です。 
- Linear SVC
   - SGDよりは小さな中小規模のデータの線形のクラス分類手法です。
- KNeighbors Classifier
   - こちらはLinear SVCでうまく分類ができてなかった場合に利用する非線形クラス分類手法で中小規模のデータを扱います。
- kernel approximation
   - こちらはSGDでうまく分類ができてなかった場合に利用する非線形クラス分類手法で中小規模のデータを扱います。

<b>regression(回帰)</b>は連続ラベルを予測するモデルとして教師あり学習で使われます。

- SGD regressor
   - 大規模のデータの線形の回帰分析の手法です。 
- Lasso、ElasticNet
   - 中小規模で説明変数の一部が重要な場合に使われる、回帰分析の手法です。
- RidgeRegression、SVR(kernel=linear)
   - 中小規模で説明変数の全てが重要な場合に使われる、回帰分析の手法です。
- SVR（kernel）、EnsembleRegression
   - こちらはRidge回帰やSVR(linear)で分析がうまくできなかった場合に利用する非線形の分析手法です。

<b>clustering(クラスタリング)</b>はデータ内のグループを検出して識別するモデルとしてラベルなしデータのラベルを推定する教師なし学習で使われます。

- KMeans
   - いくつのクラスタに分かれるのか、事前に決めることができる場合におすすめな、クラスタリング分析手法です。
- Special Clustering、GMM
   - KMeansでうまくクラスタリングが出来なかった場合に利用する非線形の分析手法です。
- Meanshift、VBGMM
   - こちらはKMeansとは逆でクラスタに分かれるのか、決める事が出来ない場合に利用するクラスタリンくの分析手法です。
- MiniBatch KMeans
   - こちらはデータが大規模の場合に使われるKMeansとしてデータを分けながら学習させる手法です。

<b>dimentionality reduction(次元削減)</b>はより高次元データ内の低次元構造を検出し識別するモデルとしてラベルなしデータの構造を推定する教師なし学習で使われます。

- Randomized PCA
   - 多次元のデータから「意味のある特徴量」を特定したり、新たな軸を作る（基底を変換する）ことで、少ない変数でデータを再現します。
- Isomap, Spectral Embedding
   - PCAが機能しない非線形な構造を持つデータにおいて、データ数が膨大でない場合に使用されます。
- LLE
   - 非線形な構造を持つデータにおいて、Isomapがうまくいかない場合に、LLEが使用されます。
- kernel appoximation
   - カーネルトリックを用いて、データを非線形変換した後にPCAを実施する方法です。

##まとめに
説明が綺麗ではないんですけれども如何でしたでしょうか？いつも思うんですが大きな目的は皆さんと情報を共有したい！という気持ちでやっていますがまずが自分が勉強するための記事でもありますのでこれをご理解頂ければと思っております。次回は実際scikit-learnを用いた簡単な例をやって行きたいと思います。この記事が少しでも気に入った方はいいねとツイッターのフォロワー宜しくお願い致します。

##レファレンス
 - [機械学習、AI、ディープラーニングのプログラミングを解説](http://neuro-educator.com/)
 - [Pythonではじめる機械学習](https://www.oreilly.co.jp/books/9784873117980/)
 - [Pythonデータサイエンスハンドブック](https://www.oreilly.co.jp/books/9784873118413/)
Moleculer の Typetalk 通知アドオンを作った話

## 概要

Moleculer の Typetalk 通知用アドオン [moleculer-typetalk](https://www.npmjs.com/package/moleculer-typetalk) を作ったので紹介する記事です。

## 前提知識

Typetalk って何？という方は [こちら](https://www.typetalk.com)

## Moleculer とは？
https://moleculer.services/docs/0.13/
> Moleculer is a fast, modern and powerful microservices framework for Node.js. It helps you to build efficient, reliable & scalable services. Moleculer provides many features for building and managing your microservices.

Node.js 製のマイクロサービス向けのフレームワークです。日本語での紹介記事はあまり見かけませんが、結構コミュニティは活発なように見えます。

## 使い方

1) Typetalk でボットを作成します。

<img width="909" alt="Screen Shot 2019-03-10 at 15.57.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/27079/e13a567a-1971-cdb6-2e54-38d53d97fbdd.png">

*メッセージの投稿を行うので、topic.post にチェックを入れます*

| 項目 | 値 |
|-----|----|
| ID | moleculer-typetalk |
| Full Name | moleculer-typetalk |

2) サービスを作ります

サンプルコード

```javascript
// index.js
const {ServiceBroker} = require("moleculer"),
    TypetalkService = require("moleculer-typetalk");

// Create broker
const broker = new ServiceBroker({logger: console});

// Load my service
broker.createService({
    mixins: [TypetalkService],
    name: "typetalk",
    settings: {
        token: YOUR_TYPETALK_TOKEN, // トークンを記載します。
        topicID: YOUR_TYPETALK_TOPIC_ID // トピックの ID を記載します。
    }
});

// Start server
broker.start().then(() => {
    broker
        .call("typetalk.post", {
            message: "Hello, Typetalk!"
        })
        .then(() => {
            // Do something...
        })
        .catch(() => {
            // Do something...
        });
});
```

3) 依存ライブラリをインストールします。

```
$ npm i --save moleculer moleculer-typetalk
```

4) 実行します。

```
$ node index.js
```

5) メッセージが投稿されます。

<img width="907" alt="Screen Shot 2019-03-10 at 17.00.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/27079/09878240-08de-4b19-f68e-874dc735cad8.png">

手順は以上となります。いかがだったでしょうか？フィードバック歓迎です :pray:
Leetcode #3 Longest Substring Without Repeating Characters

```swift
func lengthOfLongestSubstring(_ s: String) -> Int {
    var ans = 0
    var dict = [Character: Int]()
    var i = 0
    for (index, char) in s.enumerated() {
        if let value = dict[char] {
            i = max(i, value)
        }
        ans = max(ans, index - i + 1)
        dict[char] = index + 1
    }
    return ans
}
```
1. We use the concept of "sliding window" to deal with this question.
2. We define a mapping of the characters to its index. Then we can skip all the elements immediately when we found a repeating character.
3. Time complexity: O(n), index will iterate n times (the length of string)
4. Space complexity: O(min(m,n)), n is the length of the string while m is the count of its character set
STM32F4のDACとDMAで正弦波

CubeMXでDACとTIM7を有効化する。

### DACの初期化

DACはOUT1を有効化し、TriggerにTimer 7 Trigger Out eventを指定する。DMA SettingsでDAC1のDMAを追加し、Circularモードに設定する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/264452/2eb8f90b-b8a2-ed8b-7cb6-3be95e4fb293.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/264452/f26cfa85-f7e5-4e66-4ece-efdd2a5e8ba4.png)

### TIM7の初期化

TIM7はTrigger Event SelectionをUpdate Eventに設定。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/264452/5c4fe775-15d1-6bcf-479d-7eb4cd74259e.png)

### クロック

Clock ConfigでHCLKを168MHzになるように設定。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/264452/7837307c-ca6b-01ab-4e6f-68de4de8097a.png)

***

適当なタイミングで以下のコードを実行する。

```c
const double timer_clock = 84e6;
const uint16_t timer_PSC = 0;
const uint16_t timer_ARR = 84 - 1;

const double sin_frequency_Hz = 2000;
const double sin_offset = 2048;
const double sin_mag = 1800;

const double pi = 3.1415926535897932384626433832795;

htim7.Instance->PSC = timer_PSC;
htim7.Instance->ARR = timer_ARR;
HAL_TIM_GenerateEvent(&htim7, TIM_EVENTSOURCE_UPDATE);

double sampling_rate = timer_clock / (htim7.Instance->ARR + 1) / (htim7.Instance->PSC + 1);
int32_t length = (int32_t)round(sampling_rate / sin_frequency_Hz);
int16_t *DAC_buff = malloc(sizeof(int16_t) * length);

for (int16_t i = 0; i < length; i++)
{
    double a = sin(i / (double)length * pi * 2) * sin_mag + sin_offset;

    if (a < 0)
    {
        a = 0;
    }
    if (a > 4095)
    {
        a = 4095;
    }

    DAC_buff[i] = (int16_t)a;
}

HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t *)DAC_buff, length, DAC_ALIGN_12B_R);
HAL_TIM_Base_Start(&htim7);
```

このコードだと2kHzの正弦波が出力される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/264452/5ae8f4f1-eef1-2bbc-5e81-473f9b4052d3.png)

sin_frequency_Hzを変更すればある程度の範囲で設定できる。
あまりに遅いと大量のメモリが必要になるので、その場合はtimer_PSCとtimer_ARRで設定する。

timer_clockが84MHzでPSC=0, ARR=84-1の場合、サンプリングレートは1Mspsになる。2kHzの正弦波を出す場合は500ポイントのデータが生成される。int16_tなので、1KiBのメモリが必要になる。

100Hzの正弦波の場合は10kPoint、20KiBのメモリが必要になる。その場合はtimer_PSC=10-1にすれば、1kPoint、2KiBで済む。

***

C言語なのでmallocで確保しているが、C++ならconstexprでコンパイル時に計算できるので、固定長配列として確保でき、メモリを使用すぎるとコンパイラエラーにできる。
Elixirの第一歩

Elixir =Exelと同じくらいに簡単な用語

⓵Enum.sort() 
(Exelの並び替え機能)

⓶Enum.filter()
(Exelのフィルター(指定の要素を表示))![スクリーンショット (25).png](https://qiita-image-store.s3.amazonaws.com/0/373038/d12c566c-8a21-04fe-0d4f-448fca0ac4f7.png)

※エラーのためスキップ
Factory_Botで undefined method 'name' in 'user' factoryが発生する場合

RailsでFactory Botを使う時にタイトルのエラーが発生したので、原因と対応のメモです。

# バージョン
Ruby 2.5.1
Rails 5.2.2
Factory Bot 5.0.1

# エラーメッセージ
具体的には以下のエラーメッセージが出力されました。

```
/vendor/bundle/ruby/2.5.0/gems/factory_bot-5.0.1/lib/factory_bot
/definition_proxy.rb:97:in `method_missing': 
undefined method 'name' in 'user' factory (NoMethodError)
```
# 解決方法

エラー発生時のファクトリ

```spec/factories/user.rb
FactoryBot.define do
  factory :user do
    name "Beer Lover"
    email "beerlover@example.com"
    password "beerlover"
  end
end
```

↓修正版

```spec/factories/user.rb
FactoryBot.define do
  factory :user do
    name {"Beer Lover"}
    email {"beerlover@example.com"}
    password {"beerlover"}
  end
end
```

属性名に設定する値は{}で囲う必要があります。
Factory Botのバージョンが5.0.0からは{}で囲わないとエラーがでるように変更されたみたいですね。
How to run specific instrumented test method coded by Espresso from command line

# What's this?
This is the sample command to run specific Android Instrument test case coded by Espresso against Android app.

# How?

Assume this the test code stored under `app/src/androidTest/java/com/hoget/testCases/`.

```kotlin:sampletest.kt
package com.hoget.instrumenttest.testcases.accountTest

......
@RunWith(AndroidJUnit4::class)
class HogetAccountTest {

@Test
    fun LoginLogoutTest() {
        // test code in here
    }
}
```

To run `LoginLogoutTest()` method

```shell
$ ./gradlew connectedAndroidTest -P android.testInstrumentationRunnerArguments.class=com.hoget.instrumenttest.testcases.accountTest.HogetAccountTest#LoginLogoutTest;
```
or

```shell
$ ./gradlew connectedAndroidTest -P android.testInstrumentationRunnerArguments.class=com.hoget.instrumenttest.testcases.accountTest.HogetAccountTest.LoginLogoutTest;
```



So, the template for the command is like this:

```shell
$ ./gradlew connectedAndroidTest -P android.testInstrumentationRunnerArguments.class=<App's Test Package Name>.<Test Class Name>#<TestMethodName>;
```

# To Run All of Espresso Test
Add `--continue` option for prevent stop the test by fail of the test.


```shell
$ ./gradlew connectedAndroidTest --continue 
```
なっとく！アルゴリズム二分探索(p9)をSwiftで書く

## はじめに
なっとく！アルゴリズムの理解を深めるために、慣れているSwiftで書いてみた時のメモ

```swift
import Foundation

//第一引数とある配列を渡す
//第二引数、その配列内に特定の数字が入っていたら、その場所を返すようにする
func binarySearch(list:[Int],item:Int) {
    var low = 0
    var high = list.count - 1 
    
    //取り出した配列の中見を比較して、同じあたいになるまでループする
    //初回 0 < 4
    //2 0 < 1
    while (low < high) {
        print("low",low)
        print("high",high)
        
        //真ん中を取り出す
        let mid = Int(ceil(Double(low + high) / 2))
        //値をとりだす
        let value = list[mid]
        
        //とりだした値が、探したい値よりおおきいかちいさいかをしらべる
        if value == item {
            print("正解")
            return print(mid)
        } else if value < item {
            low = mid + 1
        } else {
            high = mid - 1
        }
    }
    return print("当てはまるものはない")
    
}

let my_list = [1,3,5,7,9]

print(binarySearch(list:my_list,item:9))
```

## paizaでも動かしたのでメモ
https://paiza.io/projects/Zb9KetD1X-U3x7lh1ss07Q

## Int(ceil(Double(low + high) / 2))でつまったのでメモ

本はpythonで書かれていて
pythonの`//`の表現をうまくSwiftで表現できなくて苦戦したのをメモした

```
mid = (low + high) // 2
```

https://qiita.com/nakagawa1017/items/11e7404a5f01863ee0ab
ローカルのプロジェクトをgithub上に反映させる


github上で緑のボタンを押す
<img width="338" alt="スクリーンショット 2019-03-10 16.06.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/265805/9ad193c8-0392-ba08-5979-1a4c65f1e953.png">



レポジトリの名前をつける

作成できたらURLができるのでそれをコピー



自分のプロジェクトのところまでターミナルで行き

```
git remote add origin 取得したURL
```

```
git push -u origin master
```

で反映される。


<img width="440" alt="スクリーンショット 2019-03-10 16.11.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/265805/9f24e48e-9246-1647-4bbe-306152394558.png">


SourthTreeにもorigin/masterの印？が表示される。
ログイン不要でリアルタイム同時共同編集ができるWebアプリ3選

# はじめに
チームで共同作業をしていて話し合っている内容をサクッとまとめたいときなどに便利なツールです。特にオンラインで作業をしているときなどに役立ちます。

[**Google ドキュメント**](https://docs.google.com) や [**One Drive (Word Online)**](https://onedrive.live.com) は、共同編集者はログイン不要で編集することができる設定がありますが、元ファイルの作成者はアカウントが必要です。また、わざわざファイルを作らないといけないので面倒です。
そこで互いにログイン不要でリアルタイムで共同編集ができるWebアプリを紹介します。
URLを伝えて作業し、終われば捨てるだけ、必要があればコピーしたりスクショを撮ったりして保存するだけなので楽です。

# [Witeboard](https://witeboard.com)
ホワイトボードのようになっていて自由に線や図形を描いたり、文字を打つことができます。
`Shift` を押しながらだと直線、`R` だと四角形、`C` だと円を描けます。
また、スペースキーを押しながらマウスを動かすことで、クリックボタンを押し続けなくても線が描けます。
`P` で鉛筆、`T` でテキスト、`E` で消しゴムツールに切り替えられ、`Ctrl/Cmd + Z` で元に戻せます。
<img width="816" src="https://qiita-image-store.s3.amazonaws.com/0/155587/e8e025d8-a9c5-5a0b-c8e4-1938f592b270.png">

# [HackMD](https://hackmd.io/new)
マークダウン書式に対応したテキストエディタです。画面を2分割して編集画面、プレビュー画面を分けることができます。
<img width="774" src="https://qiita-image-store.s3.amazonaws.com/0/155587/ccba52df-051c-77ab-846e-be6670ec3fae.png">



# [Etherpad](https://beta.etherpad.org)
太字、斜体など簡単な装飾に対応しているWeb上で動くテキストエディタです。誰が入力したか色分けで確認することができます。
※ テキストに色がつくのは右上の歯車マークから `Authorship colors` のチェックを外すことで無効にすることができます。
<img width="731" src="https://qiita-image-store.s3.amazonaws.com/0/155587/f41d4c5a-3b82-8eac-c555-fe38fdbf56c3.png">




## 参考
[みんなでノートをとったりできる同時編集対応のメモツールをいくつか紹介 - Qiita](https://qiita.com/ayokura/items/87fc2609e3abdf8227fe)
[登録不要のリアルタイム・オンライン・ホワイトボード「Witeboard」](http://web-marketing.zako.org/web-tools/witeboard-realtime-online-whiteboard.html)
[HackMDってMarkdownEditorが革新的で使いやすい - Qiita](https://qiita.com/norinity1103/items/85aa990dbe6582b6d701)
Swift 計算の順番を間違えて詰まったのでメモ

忘れないようにメモ

# はじめに
下記のような変数があったとする

```
var low = 0
var high = 3
```

これと

```Swift
Int(ceil(Double((low + high) / 2)))

```

これ

```Swift
Int(ceil(Double(low + high) / 2))
```

当たり前だが、計算結果が違う

## playgroundで実行してみる

```Swift
import Foundation
var low = 0
var high = 3
print(Int(ceil(Double((low + high) / 2))))
// 1と出力

print(Int(ceil(Double(low + high) / 2)))
// 2と出力
```

## それぞれ分解してみる

```swift
print("low + high: ",low + high)
print("(low + high) / 2 :", (low + high) / 2)
print("Double((low + high) / 2)) :",Double((low + high) / 2) )
print("ceil(Double((low + high) / 2)) : ", ceil(Double((low + high) / 2)))
print("Int(ceil(Double((low + high) / 2))) : ",Int(ceil(Double((low + high) / 2))))
```

```
low + high:  3
(low + high) / 2 : 1
Double((low + high) / 2)) : 1.0
ceil(Double((low + high) / 2)) :  1.0
Int(ceil(Double((low + high) / 2))) :  1
```

```swift

print("low + high: ",low + high)
print("Double(low + high) : ", Double(low + high))
print("Double(low + high) / 2 :", Double(low + high) / 2)
print("ceil(Double(low + high) / 2) :",ceil(Double(low + high) / 2))
print("Int(ceil(Double(low + high) / 2)) : ", Int(ceil(Double(low + high) / 2)))
```

```
low + high:  3
Double(low + high) :  3.0
Double(low + high) / 2 : 1.5
ceil(Double(low + high) / 2) : 2.0
Int(ceil(Double(low + high) / 2)) :  2
```

`Double`に型を変換するタイミングを間違えて時間をくってしまったのだが、おちついて考えるとまあそうですよね・・・という気持ちになる
WindowsのXサーバとchromeのSecure Shell ExtensionでX転送

# やりたかったこと

WindowsでXサーバを動かしてX転送する場合、一昔前ならXming、最近だとCygwinを使うのが一般的な気がするけど、インストーラーで導入可能なXサーバを見つけたので、せっかくだからChromeのSecure Shell Extensionから利用する方法のメモ。

## Xサーバの準備

[https://sourceforge.net/projects/vcxsrv/](https://sourceforge.net/projects/vcxsrv/)

インストーラーを拾ってインストールするのみ。

## chrome Secure Shell Extensionの準備

chrome拡張でSecure Shell Extensionをインストールする。導入後にメニューからOptionsを選んで、表示されたページのEnvironment variablesに以下を追加する

```
"DISPLAY": "localhost:0.0"
```

行区切りにカンマ`,`がないと設定が入らないので注意。

さらにConnection Dialogで接続先サーバを設定する際に、SSH Argumentsで`-Y`を追加する。
その他、鍵の情報などは必要に応じて設定。

## 利用

VcXSrvが起動していなかったら起動する。
chromeのメニューからSecure Shell Extensionを選択し、サーバに接続後Xのアプリケーションを起動すれば、WindowsのXサーバ上にアプリ画面が表示される。

## トラブルシュート

うまく動作しない場合は、接続先のサーバで環境変数にDISPLAYがセットされているかなどをチェックすればいいと思う。
CentOS7 network.service の起動タイムアウト時間を変更

# はじめに
Centos7において、Networkインタフェース数が多くなってきたことにより、デフォルトのタイムアウト時間(5分)内に起動がおわらなくなった。一部インターフェースが起動しないままOSが立ち上がってしまい困ったので、タイムアウト時間の変更方法を調べました。

# 現状確認
以下のファイルに設定が入っているのを発見。しかし、このファイルを直接編集しても変更内容は反映されない。

```bash
# grep 5min /run/systemd/generator.late/network.service
TimeoutSec=5min
```
上記は`systemd-sysv-generator`が動的に作ったものなので、reloadされたらまた同じ値に戻ってしまう。

# 解決策(設定方法)
network.serviceはinit.dの定義ファイルが使われており,systemdの定義はなかった。以下の定義を新たに作ることで解決しました。

```bash
# mkdir -pv /etc/systemd/system/network.service.d/
# echo -e '[Service]\nTimeoutStartSec=15min' > /etc/systemd/system/network.service.d/timeout.conf
# systemctl daemon-reload
```

network起動時のタイムアウト値(TimeoutStartUSec)が15分に変わった。

```bash
# systemctl show network.service | grep -i 'time.*sec='
TimeoutStartUSec=15min
TimeoutStopUSec=5min
TimerSlackNSec=50000
JobTimeoutUSec=0
```

# Ref
以下のサイトを参考にしました。
https://bugzilla.redhat.com/show_bug.cgi?id=1444803