OmniAICreator/Qiita-1.07M huggingface dataset:
Julia + PyCall + OpenCvを使ってアニメ顔認識

今日は、Juliaでアニメ顔認識の実装したのでアウトプットしていきます。
今回は、私が愛してやまない「やはり俺の青春ラブコメはまちがっている」のキャラたちの顔を識別していきます。
とはいえ、JuliaにはまだOpenCVの良さげなラッパーがないので、PyCallでPythonのopencv3を呼んで実装しました。


# おしながき
- PyCallについて
- アニメ顔認識実装

# PyCallについて
PyCallはその名の通りJuliaからPythonの関数を呼び出すためのパッケージです。
画像処理や機械学習ではやはりPythonの方がパッケージが充実しているので、
for loopなどの処理はJuliaで書いて、使いたいとこだけPyCallを呼び出すのがスマートかなと思います。

PyCallのインストールはREPLから行います。

```julia

$ julia
#PyCallはデフォルトでPython2が指定されているので、
#必要に応じて以下のコマンドを打つ必要があります。
julia>ENV["PYTHON"] = "path/to/your/python"

#]を入力することでPkgモードに切り替えられます
julia>] 
Pkg> add PyCall
```
# アニメ顔認識実装
続いて、アニメ顔認識の実装に移ります。
もし、opencv3をインストールしていない場合は事前にインストールをしてください。

まずはPyCallとopencvをインポートし、パスや変数を宣言します。

```julia
using PyCall: pyimport
cv2 = pyimport("cv2")

cascade_path = "/path/to/lbpcascade_animeface.xml"
video_path = "/Users/to/***.mp4"

frame_num = 0
faceframe_num = 0
```

OpencvのVideoCaptureを呼び出します。

```julia
cap = cv2[:VideoCapture](video_path)
```
`cv2[:VideoCapture]`はPythonの記述だと`cv2.VideoCapture`と同じです。


画像のグレースケール化とヒストグラムの均一化と顔認識を関数化して実装します。
detectMultiScaleのscaleFactorとminNeighborsの調整で精度に差が出るようです。

```julia
function detectFace(image)
    image_gray = cv2[:cvtColor](image, cv2[:COLOR_BGR2GRAY])
    image_gray = cv2[:equalizeHist](image_gray)
    cascade = cv2[:CascadeClassifier](cascade_path)
    facerect = cascade[:detectMultiScale](image_gray, scaleFactor=1.1, minNeighbors=3, minSize=(50, 50))

    if length(facerect) != 0
        println("face rectangle")
        println(facerect)
    end
    return facerect
end
```

最後に、while loopで１フレームごとに画像を処理する実装をします。

```julia
while cap[:isOpened]()
    global frame_num += 1
    ret, image = cap[:read]()

    if ret == false
        break
    end

    if frame_num % 100 == 0
        facerect = detectFace(image)
        if length(facerect) == 0
             continue
        end
        if facerect[2]+facerect[4] > 720 || facerect[1]+facerect[3] > 1152
            continue
        end
        croped = image[facerect[2]:facerect[2]+facerect[4], facerect[1]:facerect[1]+facerect[3], :]
        cv2[:imwrite]("1_" * repr(faceframenum) * ".jpg", croped)
        global faceframe_num += 1
    end
end
cap[:release]()
```

### 実行結果
![pics.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254013/80cbba09-d732-8a58-7560-eae2c149a94d.png)

パラメーターの調整をしていないので、いくつかミスがありますが概ね綺麗に認識できていると思います。
どうでもいいですけど、しゅんっとした由比ヶ浜はめちゃくちゃ可愛いですね😌

# まとめ
PyCallを使ってOpenCVを呼び出して、顔認識を実装しました。
OpenCV自体はPythonですが、その他の処理はJuliaで書ける事で、
実行速度を簡単にあげられるんじゃないかなと期待しています。

あまり、今回の実装では実行速度を気にせず実装しましたが、実行速度を考慮した実装にもチャレンジしたいところです。

最後に、世界の挨拶は「やっはろー」に統一すべきだと思います。

最後まで駄文を読んでいただきありがとうございました。
5/1学習内容

〜本日の学習内容〜


■レスポンシブの学習

レスポンシブデザインの実装に向けて、今回から積極的にwidthなどに、pxでなく%で幅を指定する。
progateで
box-sizing: border-box;
の存在を学ぶ。

■BEM導入

毎回、最適なクラス名はないかと思いなやんでいたが、 BEMという記法があることを知り！
早速導入。
クラス名は長くなってしまうが、迷いが無くなりマークアップが格段に早くなった。
性質上、シングルクラスでの使用が基本だが、状況によってはあえて2つ以上のクラスを割り当てる人もいるらしい。

■@extend

これも今日から導入。
ただ、使い方を間違えると、吐き出されるcssに大量のクラスタが生成されてしまうので多様注意。
それと、ただ似たような性質をもっている、というだけで、あまり関連性のない場所に適用するのも、性質上良くない。


〜不明な点〜


■リンクのプロパティ

訪問済みリンクの色やアンダーラインのプロパティを消す方法を忘れてしまった…
訪問済みリンクの色を指定し、text-decorationでアンダーラインを消す方法ああるが、そうでなく、一発でそれを初期値にする方法があったのだが…
調べ直さねば。

■Git

エラー起こした…また沼にはまりそうだ、抜け出さねば。

■もっと効率化

これから難易度の高い実装に向けて、@mixinや関数など、もっと積極的に使えるようにしていきたい。
[python]MoneyForwardにCSVアップロードする処理を作ってみた

2018年12月6日から、MoneyForwardのCSVアップロード機能が突如利用できなくなりました。
我が家では夫婦個別の支出を各々好きなサービスで管理（Zaimとか）し、家計全体の支出はMoneyForwardで管理する、といった運用をしていたためCSVアップロード機能がなくなってしまうと、別のサービスから出力した支出データを全て手動で入力しなければならず、大打撃。。。。。。

毎月100レコードほどのデータ量になるため、手動投入はとても面倒かつ非生産的作業なので、自動化するスクリプトを作成しました。

GitHubで公開しています。
https://github.com/yyosuke/Upload2MoneyForward

#プログラム概要
seleniumを用いてWebブラウザ上での投入操作を自動的に行う処理となります。
※急いで作成したので、一部イケてない部分や汎化できていない部分がありますが、それは追々必要に応じて修正していきます。
<font color="Red">利用する際は自己責任でお願いします。</font>

#環境
* OS:MacOS10.14.4
* Python 3.6.3
* selenium 3.141
* ChromeDriver 73.0.3683.103

#利用までの準備
GitHubの方に流れは書いていますが、seleniumとChromeDriverの準備が必要です。
以下のページが参考になります。
https://www.inet-solutions.jp/technology/python-selenium/

ChromeDriverはパスを通すか、プログラムと同じディレクトリに配置してください。

またMoneyForwardにログインする必要がありますので、ソース内のアカウント情報を書き換えてください。
```
user = "input your userid"
password = "input your password"
```

#インプットデータのフォーマット
インプットのCSVデータフォーマットは以下です。
文字コードはUTF-8のみ許容しています。

| 項目番号         | 設定値          | 説明        |
|:---------------|:---------------|:------------|
| 1           | date           |     収支が発生した日付（yyyy/mm/dd） |
| 2           | large-category   |   大分類（食費や通信費など） |
| 3           | middle-category   |  中分類（カフェや外食など） |
| 4           | content           |  任意項目 |
| 5           | price           |    金額。支出の場合は-(マイナス）、収入は＋（プラス）で入力してください。 |

サンプルを以下に示します。
1行目は無視されますので、実際のデータは2行目から記載してください。
```
日付,大分類,中分類,備考,金額
2019/01/17,食費,カフェ,ドトール,-250
2019/01/20,収入,給与,夫, 400000
```

#接続のテスト
以下のコマンドをターミナルから実行します。

```Bash
python uploadCSVtoMF.py xxxxxxxx.csv
# xxxxxxxx.csvは作成したcsvファイル名
```

Chromeが起動し、自動ログインされ投入が開始されます。

以上です。
JetBot製作メモ（バッテリ編）

NVIDIA JetBot製作でのモバイルバッテリについてメモしておきます。


## NVIDIAおすすめのモバイルバッテリ

JetBot WikiのBOM（部品表）
 <https://github.com/NVIDIA-AI-IOT/jetbot/wiki/Bill-of-Materials>

INIU 10000mAh Portable PowerBank(2x 5V/3A output)がおすすめとなっているが、日本のアマゾンで13,000円となっている。2ポートでそれぞれ単独に3Aずつ出力されるとあり、スペック上かなりの優れものに見える。

## 検討の経緯

最初手持ちのモバイルバッテリ(2.1A+1.0A)で試したところ、サンプルプログラムのCollision Avoidanceで電源が落ちてしまった。カメラ・モーター・GPUとフル稼働するため、このデモが電源的にかなりシビアとなる。

JetBotの3Dプリントのサイズに合うもので、OwltechのOWL-LPB10006を購入し、Type-C 5V/3.0AをJetson nanoに、Type-A 5V/2.4Aをモータードライバにそれぞれ供給するとnanoがシャットダウンしなかった。

しかし、最近のモバイルバッテリはオートパワーオフ機能がついていて一定時間経つと電源供給が切れるため、モータードライバ側に電源が供給されなくなる場合もあり、なんらかの対応が必要である。

## 対応方法（案）

1. オートパワーオフ機能のない、3A出力のモバイルバッテリーを探す。

2. モータードライバへの電源供給は乾電池(単四×3本)で行う。

3. 定期的にモーター側の電源を切らないように電流を流す基板を作る。


そこで自分も以下のサイトを参考に、Digisparkで作成してみた。

(参考：モバイルバッテリーのオートパワーオフキャンセラー
   ​    https://make.oldcyclist.com/2019/02/autopoweroff-canceller/）

![poweoffcanceller.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99008/2ac9478c-2ce4-77ed-9d73-fc893272332b.jpeg)

　　Owltechのモバイルバッテリーのパワーオフ時間が約35秒くらいだったので、500msの間に200mAくらいを流したら25秒スリープするプログラムにした（オンの時間をもう少し短くできそう）

```C
/*
  Power off canceller for mobile battery(digispark)
*/
#define ledpin 1
#define ctlpin 0

void setup() {
  pinMode(ledpin, OUTPUT);
  pinMode(ctlpin, OUTPUT);
}

void loop() {
  digitalWrite(ledpin, HIGH);   
  digitalWrite(ctlpin, HIGH);   
  delay(500);                 
  digitalWrite(ledpin, LOW);    
  digitalWrite(ctlpin, LOW);    
  delay(25000);                  
}
```



## まとめ

以前IoT向けに電流を流し続けるCheero Canvas(for cheero Sleepion and IoT devices)というのがあったが最近ではこの手のモバイルバッテリが見当たらないので、設置スペースの問題もあるが案２の電池での別電源が一番やりやすい。

また電子工作に心得のある人は案３でスペースをとらない方法もいいと思います。
Macを買ったら入れておきたいエンジニア向けツールまとめ

## Macを買ったら入れておきたいエンジニア向けツールまとめ
WindowsからMacに変えたときに参考にして下さい。

### Google Chrome
ブラウザはこれで決まり。
### iTerm2
ターミナルアプリはこれで決まり。Homebrew、Gitも入れておきましょう。

### SourceTree
GitのGUIアプリはこれで決まり。
### Visual Studio Code
メイン使いするかは自由ですが、コードを読むのにも便利なので入れておいて損することはないでしょう。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
twitter developer に登録したのでやったことを書く

英文300字程度がだるくて腐っていたがすげー適当でも通った
投稿とかも公式に載っているライブラリを使うとものすごく簡単
#やったこと
1. twitter developerへの登録、app作成
2. 超絶シンプルなツイート投稿、自動いいね機能(php)
3. raspberry piで投稿を自動化

##1.twitter developerへの登録、app作成
https://developer.twitter.com/en.html
ここでdeveloper登録。
英文での使用用途の説明を求められるが、google翻訳を通した後、軽く確認しただけで通った。
apiを作成した後、Detail->Keys and tokensで `API key` `API secret key` `Access token` `Access token secret`の４つを確認しておく（後で使う）

##2.超絶シンプルなツイート投稿、自動いいね機能(php)
https://developer.twitter.com/en/docs/developer-utilities/twitter-libraries.html
ここからapi利用の認証を通すためのライブラリをダウンロード。今回はtwitterOauthを使った。
下部phpファイルとダウンロードしたファイルを同階層に配置。

```php

<?php
// OAuthライブラリを読み込む
require "twitteroauth-master/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

//個別の認証情報
$consumerKey = "API KEY";
$consumerSecret = "API SECRET KEY";
$accessToken = "ACCESS TOKEN";
$accessTokenSecret = "ACCESS TOKEN SECRET";

//接続
$connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);

//投稿
$res = $connection->post("statuses/update", array("status" => "ツイート内容"));

//検索
$statuses = $connection->get("search/tweets", ["q" => "検索したいキーワード"]);

//検索で取得したデータの確認
print_r($statuses);

//いいね
$connection->post('favorites/create', ['id' => "ツイートのid"]);
```
※各所はお好みで

phpファイルは実行するとすぐにいいねや投稿を行うので実行前によく確認したほうがいい

##3.raspberry piで投稿を自動化
cronという面白い機能がraspbianでも使えそうなので使ってみることにした。
linuxの機能らしい。

php,php-curl(エラーが出たので追加)のインストール、apache2もついでにインストール。
cronログの有効化

linux上`crontab -e`でcron設定ファイルを開き一番下の行に以下の文を追加

```
#毎日8時に指定したphpファイルを実行
00 8 * * * php /home/"ユーザー名"/"phpファイル"
```
raspbianの時計を日本時間に合わせて置く。

##所感
もともとはherokuにプログラムを上げて定期実行させようと思っていたが、herokuは無料の範囲の利用だと常時稼働が面倒臭そうだったので、家で放置されていたraspberry piを使った。
予想以上にcronが便利で感動した。
この後はphpを書き込んでいけば複雑な機能のbotも作れそう。ただ、定番はpythonぽい。
個人的にはnodeもインストールしてcronでない方法での定期実行もやってみたい。
Pythonが活用されるようになった理由

初めまして、nishimaeです。
深層学習について現在研究を進めています。ブログを開設して、色んな方と
意見交換したいと考えています。


最近のプログラミング言語として、Pythonが流行っています。
数年前に機械学習・深層学習で活用されるようになってから爆発的に人気が
出来ました。それ前までは、PHPやRuby等に押されていましたが、それを超えるほど
Pythonが人気が出ています。私の主観ですが、以下の通りだと思っています。

1.機械学習・深層学習用の外部ライブラリとして活用されるため。

NumPy、SciPyなどの高速な数値計算ライブラリの誕生により、データサイエンスや科学技術コンピューティングで多く活用されるようになったのでは無いかと考えます。NumPy、SciPyの内部はC言語で書かれている為に動的スクリプト言語の欠点の一つである速度の遅さを補っているのが利点です。
機械学習・深層学習は、速度を求めていますからC言語でプログラミングした方が良いのですが、
C言語自体プログラミングが難しいため手間がかかります。そこでPythonのスクリプト言語と外部ライブラリを活用することにより簡単にプログラミングが出来るということです。NumPy、SciPyもモデルの定義が必要ですので、kerasやtensorflow等を活用すればより簡単にプログラミングが出来ます。最近の機械学習・深層学習の開発は、pythonを活用される方が多いのです。CやC++でも開発される方もいらっしゃいます。

2.Webアプリケーション用途のため。

Django や Flask といったWebアプリケーションフレームワークが充実しているため、Webアプリケーション開発用途にも多く使われているようです。全体のWEBアプリケーション開発の26%がPythonらしいです。これも凄いですね。今後は、PHPやRubyよりも活用されるようになるかもしれませんね。

3.コーディングが書きやすいため。

C言語やJavaに比べてコーディングが書きやすいのが理由では無いでしょうか？
C言語やJavaは、型定義等が手間がかかりますが、Pythonがそれが無いのも利点だと
思います。

4.様々な外部ライブラリがあるため。

様々な外部ライブラリがあるため、運用等の自動化として最適では無いでしょうか？
テキスト作成やWEBの自動ログインやダウンロード等も様々な事が可能です。
VBAやその他の言語よりも手軽に自動化しやすいのではないでしょうか。
エクセルの自動化等は、少し難しいようですね。。。

他にも理由がありそうですが、Pythonは今度も様々なシステム開発や運用で活躍するのでは
無いでしょうか？IPAの試験もCOBOLが無くなり、Pythonに変わるようです。

この内容にご指摘がございましたらコメントお願いします。
スキルアップしていきたいと考えています。皆様もご意見をお願いします。
Vue.js入門しました

# はじめに
こんばんは。またたびです。
これまで書いてきた3つの記事全て100viewを超えており、ブログ等を書いたことのないしがない大学院生にとってはとても嬉しい限りです。
読んでくださりありがとうございます。
今回はゴールデンウィーク直前位から勉強を始めたVue.jsについて、簡単にまとめていきたいと思います。
まだVue.jsを触ったことがない方の参考になれば幸いです。
いつも通り参考にさせていただいた本と、プラスでおすすめの本を記述しておくのでよければ読んでみてください。

# Vue.jsとは
Vue.jsとはJavaScriptのフレームワークです。
近年注目されているフレームワークで、書きやすい、拡張性が高い、学習コストが低いといったメリットがあります。
PHPのフレームワークであるLarabelのフロントエンドに用いられていることが多くあるそうで、実際に私のアルバイト先でも用いられています。

HTML、Javascriptについての理解がない方は、その2つについて学習してから手を付けることをおすすめします。また、それと同時にCSSについても学習しておくと、非常に便利です。
コードはHTMLと大差ないため、非常に書きやすいと思います。

また、インターネットがつながる状況であれば、特別なパッケージを導入することなくプログラムの記述が可能であることも利点の一つに感じています。

以下にコードの一例を示します。(動作確認済みです)

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>Vue</title>
    <link href="main.css" rel="stylesheet">
</head>

<body>
    <div id="app">
        <!-- ここに処理を書く -->
        <p> {{ text }} </p>
    </div>
    <script src ="https://cdn.jsdelivr.net/npm/vue@2.5.13/dist/vue.js"></script>
    <script src="main.js"></script>
</body>
</html>
```

```javascript:main.java
var app = new Vue({
    el: '#app',
    data: {
        text: 'Hello Vue'
    }
})
```

HTMLを勉強した方ならご存知かもしれませんが、index.html内の<title>はページを表示した際のtabに表示される文字になっています。
そして、index.htmlに{{ text }}と記述してある部分にmain.javaに記述されているtext: 'Hello Vue'が表示されるわけです。
同じディレクトリにいれてHTMLを表示すればわかりやすいと思うのでやってみてください。

このように、HTML中をごちゃごちゃさせることなくなるのも利点かなと思います。
~~アルバイト先でVue.jsを用いていない案件だと、HTMLの中に長文が書いてあることが多々ある…~~

今回は入門ということでHTML、Javascript、は理解しているが、Vue.jsはまだ理解出来ていないという方に記事を書いてみました。
もう少し理解したらまた記事を書いていきます。
本日はここまでにします。

# おわりに
GW毎日連続して記事をあげると意気込んでいましたが、良いinputをしていないにも関わらずoutputをするのはよろしくないことに今更ながら気が付いたのでもう少し質を上げて投稿しようと思います。~~明日から3日間は私的な旅行のためおやすみさせていただきます。~~
また、Vue.jsのおすすめの本や勉強の仕方、間違いや表現の悪い部分があればご指摘いただけると幸いです。

# 参考文献
私が実際に参考にさせていただいた本(イラストや色があり読みやすいです)
 [基礎から学ぶ Vue.js](https://www.amazon.co.jp/s?k=vue.js&__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&ref=nb_sb_noss_2)


後輩に少し読ませてもらった本(文章とコードが非常に多くなりますが、非常にわかりやすく実務的な力を身に着けたいのであればこちらがいいかなと)
 [Vue.js入門 基礎から実践アプリケーション開発まで](https://www.amazon.co.jp/Vue-js%E5%85%A5%E9%96%80-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E5%AE%9F%E8%B7%B5%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA%E3%81%BE%E3%81%A7-%E5%B7%9D%E5%8F%A3-%E5%92%8C%E4%B9%9F-ebook/dp/B07J6FP6NQ/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=vue.js&qid=1556720700&s=gateway&sr=8-2)
Grove Piを積み重ねて使う syntax error at /etc/avrdude.conf:356

公式の https://www.dexterindustries.com/GrovePi/programming/using-multiple-grovepis-together/ をみて
ボードのアドレスを変更しようとするのだけど、
syntax error at /etc/avrdude.conf:356
というエラーに遭遇し、アドレスがデフォルトの04のまま変わらず、
苦しんだので解決をメモ。

## 結論

/etc/avrdude.conf を /etc/avrdude.conf.dpkg-distで上書きしたらアドレスの書き換えに成功しました。

sudo cp /etc/avrdude.conf /etc/avrdude.conf.old
sudo cp /etc/avrdude.conf.dpkg-dist /etc/avrdude.conf

## 解決後のスタック起動までの手順
![file.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57579/64ecb558-aca6-e3e0-e65e-ada9ee52af36.jpeg)

1. 既存のGrovePiを外して、新しいGrovePiをラズパイに設置
2. cd ~ && git clone https://github.com/DexterInd/GrovePi
3. cd GrovePi/Firmware
4. chmod +x firmware_update.sh
5. cd ../Script/multi_grovepi_installer/
6. sudo chmod +x multi_installer.sh
7. sudo ./multi_installer.sh
8. Any other key to exitで 3 をタイプしてenter
9. インストールが終わって、03がアクティブになっていることを確認
10. sudo shutdown -h now
11. 既存のGrovePiを新しいGrovePiの上にドッキング。手元のセンサーを両方に取り付けて電源ON
12. cd GrovePi/Software/Python/
13. 取り付けたセンサーに対応したスクリプトを python grovepi_[sensor].pyで実行して値がとれることを確認

手元に IR Distance Interrupter v1.2 があったので、D3にそれぞれ設置して、
センサー値が取得できること確認

## サンプルソース

```ir.py
import time
import grovepi
import grovepi3 

# Connect the Grove Infrared Distance Interrupt Sensor to digital port D4
# SIG,NC,VCC,GND
sensor = 3

grovepi.pinMode(sensor,"INPUT")
grovepi3.pinMode(sensor,"INPUT")

while True:
    try:
        # Sensor returns LOW and onboard LED lights up when the
        # received infrared light intensity exceeds the calibrated level
        if grovepi.digitalRead(sensor) == 0:
            print ("addr 04 found something")
        else:
            print ("addr 04 nothing")

        if grovepi3.digitalRead(sensor) == 0:
            print ("addr 03 found something")
        else:
            print ("addr 03 nothing")

        time.sleep(.5)

    except IOError:
        print ("Error")
```

```実行結果.txt
addr 03 nothing
addr 04 nothing
addr 03 nothing
addr 04 nothing
addr 03 nothing
addr 04 nothing
addr 03 nothing
addr 04 nothing
addr 03 found something
addr 04 nothing
addr 03 found something
addr 04 found something
addr 03 found something
addr 04 found something
addr 03 found something
addr 04 found something
addr 03 found something
addr 04 found something
addr 03 found something
addr 04 found something
addr 03 found something
```

無事に動きました。
[Ruby on Rails] マイグレーションエラーとは？ [初心者向け]

ProgateでRailsのレッスンを進めて行くうちに、データベースの取り扱いがありました。

railsではマイグレーションファイルを用いて、データベースの操作をしていくそうです。

しかし、エラーに関しては詳しい記述がなかったので、こちらでまとめることとします。

なお、Progateのレッスンによるマイグレーションエラーの説明は、以下の通りです。

> Railsでは、データベースに反映されていないマイグレーションファイルが存在する状態で、どこかのページにアクセスすると以下のようなマイグレーションエラーが発生してしまいます。そのため、マイグレーションファイルを作成した場合は必ず「rails db:migrate」を実行する必要があります。

<h2>マイグレーションとは</h2>

マイグレーション(Migration)とは、「移住」「移動」といった意味を持つワードです。

Railsでは、Railsからデータベースにテーブルを「移動」することを意味するそうです。

<h3>ちなみに、テーブルとは</h3>

テーブルとは、データベースでデータを整理整頓するための表みたいなものです。
縦軸(カラム)と横軸(レコード)があり、データを一つひとつ格納していくことができます。

<h2>Railsにおけるマイグレーションの役割</h2>

マイグレーションをしようする意味ですが、
SQLを記述せずにデータベースにテーブルを作成することができるためだそうです。

(*SQLとはデータベースを操作するためのプログラミング言語です)

RailsのActive Recordという機能が、RubyをSQLに自動変換してくれているからこそ、実現可能だとか。

<h3>rails db:migrateの意味</h3>

マイグレーションを実行する際に、上のコマンドをrailsで実行する訳ですが、その意味はどんなものでしょうか。

このコマンドは、rails g model x xのようなコマンドで作成したマイグレーションファイルにあるRubyの記述をSQLに変換していくものです。

<h2>マイグレーションエラーとは</h2>

マイグレーションエラーとは、
**テーブルに関する情報が記述されているマイグレーションファイルが、データベースと繋がっていない時に発生します。**

なので、マイグレーションファイルを作成したが、マイグレーション(rails db:migrate)をし忘れた時に発生することになります。

もし、マイグレーションエラー(AciveRecord::PendingMigrationError)が発生した際には、rails db:migrateのコマンドを実行してみると良いと思います。
NULLと空文字列が混在したカラムをどちらかで統一したい

## サンプルテーブル

```sql
CREATE TABLE #Sample (col1 char(1));
INSERT INTO #Sample (col1) VALUES ('A'), (NULL), ('');
```

|col1|
|----|
|'A'|
|NULL|
|''|

## NULLで統一

```sql
UPDATE #Sample
   SET col1 = CASE WHEN col1 = '' THEN NULL ELSE col1 END;
```

|col1|
|----|
|'A'|
|NULL|
|NULL|

## 空文字列で統一

```sql
UPDATE #Sample
   SET col1 = COALESCE(col1, '');
```

|col1|
|----|
|'A'|
|''|
|''|
Windows10からL2TP/IPSecのVPNにつながらないのを解決する方法

# やりたいこと
自宅のネットワーク内のLinuxマシンにL2TP/IPSecのサーバーを立て、出先からファイルサーバーに入っているファイルにアクセスしたい。
自宅ネットワークと出先ネットワークは、ともに外部ネットワークとルーターで隔てられている。
サーバーの立て方とかは省略。
# なぜかつながらない
事前共有鍵 (PSK) もユーザー名・パスワードも合っているのに、なぜか接続できない。
Android端末からは同じ設定で接続できているので、自宅のルーターの設定とかではないはず？
# 解決法（私の場合）
NATトラバーサルに対応するために以下をしないとだめでした
（参考：[ホープムーン｜Windows10でL2TP/IPSecのVPN接続をする方法](https://www.cup.com/staticip/manual/win10_l2tp.html)）

- レジストリに設定を加える。
    - HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent
    - 「AssumeUDPEncapsulationContextOnSendRule」を「DWORD（32ビット値）」で作成し、値を「2」に設定
dockerのredmine

#この内容
 dockerのredmine設定奮闘記です。

#私の構成
vmwareのubuntuで単純にdockerでredmineだけをもってきて、postgresは既にインストール済みを使うという構成。postgreはv10、ubuntuは18.4を使ってました。

つまり、docker-composeを使わない構成。

aptでredmineをインストールするというのにも手を染めたが、これはなかなか手強い。
内部構造を勉強しないとちょっと無理だねえ。bundleをどこのフォルダに動かせばいいのか？とかわからないこと多過ぎ！

#データベース接続失敗
普通にググってヒットする設定にあるように、redmineユーザを作って
データベースにもユーザを作っておく。ここでpostgreの/etc/postgres/10/main/pg_hba.confの認証を変更したんだったけなあ？すまん。忘れた。

データベース接続が「not connect」でうまくいかなかったんだが
なかなかこのときのデバッグ情報がわからない

sudo docker events&sudo docker run ・・・にして

--net=hostを発見！

これに２日ぐらい費やしたかなあ。というわけでこのときのdockerの起動方法

<pre>
docker run --name=redmine -it --rm --net=host --env=DB_ADAPTER=postgresql --env=DB_HOST=localhost --env=DB_NAME=redmine_production --
env=DB_USER=redmine --env=DB_PASS=password --volume=/srv/docker/redmine/redmine:/home/redmine/data sameersbn/redmine:4.0.3
</pre>
#nginx問題
データベースの設定は乗り越えたが
nginx (exit status 1; not expected)のエラー
がでて、何回も起動しなおして定常状態にならない。・・さあ、どうする！

うーむ。なるほど！ホストのapacheをstopしたら定常状態になった。
<pre>
 sudo service apache2 stop
</pre>
ですな。

そして、-p 80:80で転送することで

これでhttp://localhost で無事redmineですねえ！
最終的な起動方法
<pre>
docker run --name=redmine -p 80:80 -it --rm --net=host --env=DB_ADAPTER=postgresql --env=DB_HOST=localhost --env=DB_NAME=redmine_production --
env=DB_USER=redmine --env=DB_PASS=password --volume=/srv/docker/redmine/redmine:/home/redmine/data sameersbn/redmine:4.0.3
</pre>
#login問題
webは表示できたが、ユーザはなにが設定してあるんだ？
redmineなのか？違う・・ということでいろいろやって見つけました。

「admin」です。

その後、パスワードを設定するようです。(最初はadmin/admin)

なんか、mailがないと運用できないのかと勘違いして
mailutilsなんてのもインストールしてしまいしたが
まあ、メールなくても運用できそうです。この後チケットを
触ってみましょうかねえ・・

とりあえず、ご報告
しかし、ドキュメントないねえ
Golangのdistrolessで作る軽量コンテナ

## 構成

```
root/
  ┝ Dockerfile
  ┗ src/
     └ main.go
```

## Dockerfile(1.11以前)

```
FROM golang:latest as build

WORKDIR /go/src/app
ENV GOBIN=/go/bin
COPY . .

RUN go get -u github.com/golang/dep/cmd/dep
RUN dep init
RUN dep ensure
RUN go install -v ./...


FROM gcr.io/distroless/base
EXPOSE 5000
COPY --from=build /go/bin /
CMD ["/src"]
```

~~これで大概動きますが、ライブラリがないみたいに怒られるケースがあります。謎。~~

depを導入したので多分解決しました(2019/05/03)


## Dockerfile(1.11以降)
Modulesをつかっていい感じにやります

```
FROM golang:latest as build

WORKDIR /go/src/app
ENV GOBIN=/go/bin
ENV GO111MODULE=on
COPY . .

RUN go mod init go-tools
RUN go install -v ./...


FROM gcr.io/distroless/base
EXPOSE 5000
COPY --from=build /go/bin /
CMD ["/src"]
```
Macのバックスラッシュはオプションを添えて。

## VSCodeのターミナルでバックスラッシュを入力したかった

printしたかったので、irbで以下を入力したかった。

```Ruby:Ruby
print("hogehoge\n")
```

上記の通りにキーを叩くと以下が入力された。

```Ruby:irb
print("hogehoge\U+FFC2\U+FFA5n")
```

## Macのバックスラッシュはoptionも一緒に押す

バックスラッシュ(¥)を入力するには、**optionキー + ¥キー**を押す。
PythonでTOMLファイルを編集したい

# この記事は？
ちょっと、PythonでTOMLファイルを編集したいことがあったので、その方法についてメモ。

# TOMLとは？
こちらの記事がわかりやすいと思います。

[設定ファイル記述言語 TOML](https://qiita.com/b4b4r07/items/77c327742fc2256d6cbe)

簡単にいうと、設定ファイル記述言語で、yamlとかJSONとかの類です。
少し触った程度ですが、yamlよりもシンプルで見やすいと思います。

# やりかた

簡単なTOMLファイルを用意します。

```example.toml
[table]
key = "value"

[table.subtable]
key = "another value"
```

## ライブラリのインストール
TOMLのライブラリはまだPythonの標準ライブラリなどには含まれていないので、`pip`などでインストールします。

[こちら](https://github.com/uiri/toml)のライブラリを使用します。

インストールコマンドはこんな感じ

```
pip install toml
```

## TOMLファイルの読み込み
ライブラリが入ると後は簡単にできます。

```index.py
import toml

dict_toml = toml.load(open('example.toml'))
print(dict_toml)
```

組み込み関数の`open`でtomlファイルを開き`toml.load`で読み込んで、tomlファイルの中身を辞書型にして返しています。

実行結果は以下

```
{'table': {'key': 'value', 'subtable': {'key': 'another value'}}}
```

辞書型なので、keyを指定することでvalueを取得できます。

```index.py
import toml

dict_toml = toml.load(open('example.toml'))

print(dict_toml['table']['key'])
# 出力
# value
```

## TOMLファイルの書き換え
書き換えもできます。
例えば、`subtable`の`another value`を`subtable value`と変えたい場合は以下のようになります。

```index.py
import toml

dict_toml = toml.load(open('example.toml'))
dict_toml['table']['subtable']['key'] = "subtable value"

toml.dump(dict_toml, open('example.toml', mode='w'))
```

一度、`example.toml`を読み込んで、`dict_toml['table']['subtable']['key'] = "subtable value"`で値を書き換えて、再び組み込み関数の`open`で`example.toml`を今度は書き込みモードで開いて、`toml.dump`を使って書き込んでいます。

これを実行した後の`example.toml`はこんな感じになっています。

```example.toml
[table]
key = "value"

[table.subtable]
key = "subtable value"
```

ちゃんと書き換わっていますね。

# 終わりに
こんな感じでTOMLファイルの編集が簡単にできました。
機会があれば使ってみてください。

以上
Cloud9（EC2 Ubuntu）で、WebdriverIOを実行

作業メモです。

- Cloud9 ( Tokyo Region)
- EC2: Ubuntu Server 18.04 LTS

基本的には下記の手順に沿って進めます。

https://webdriver.io/docs/gettingstarted.html

## ポイント

EC2 Ubuntu Server には Displayが無いので

「HEADLESSオプションをつけて実行」

言いたいのは、これだけです。

## Firefoxインストール

```
$ sudo apt-get install xvfb firefox
$ firefox -v
Mozilla Firefox 66.0.3
```

xvfb(short for X virtual framebuffer)は、仮想ディスプレイ。

## Nodejs インストール

Cloud9なら既にインストール済み

```
~/environment$ node -v
v10.15.3
```

## 作業ディレクトリ作成

```
$ mkdir webdriverio-test && cd webdriverio-test
```

## Geckodriverをダウンロード

```
$ curl -L https://github.com/mozilla/geckodriver/releases/download/v0.21.0/geckodriver-v0.21.0-linux64.tar.gz | tar xz
```

## Geckodriverを起動

手順では、Port:4444 指定しているが、Defaultが4444みたいなので、シンプルに起動。

```
$ ./geckodriver 
```

Portを明示指定したいなら、下記。

```
$ ./geckodriver --port 4444
```

このままGeckdriverを起動したまま、別のコンソールを開いて作業する（重要）。

## WebdriverIOをダウンロード（インストール）

```
$ cd webdriverio-test
$ npm install webdriverio
```

この辺り、Cloud9のエラーが出て、ごにょごにょしたかも知れない。。。

## テストファイルを作成(test.js）

```
const { remote } = require('webdriverio');

(async () => {
    const browser = await remote({
        logLevel: 'error',
        path: '/',
        capabilities: {
            browserName: 'firefox'
        }
    });

    await browser.url('https://webdriver.io');

    const title = await browser.getTitle();
    console.log('Title was: ' + title);

    await browser.deleteSession();
})().catch((e) => console.error(e));
```

## テスト実行 ... は失敗する。

```
$ node test.js
```

だが、DISPLAYがないのでエラーになる。

```
2019-05-01T13:25:32.239Z ERROR webdriver: Request failed due to unknown error: Process unexpectedly closed with status 1
```

Geckdriverには下記のメッセージが出力されてる。

```
Error: no DISPLAY environment variable specified
```

## ブラウザオプション「headless」を追加する。

test.jsのCapabilitiesに、下記を追記する。

```
            "moz:firefoxOptions": {
              args: ['-headless']
            }
```

追記した結果は下記。カンマ区切りに注意。

```
const { remote } = require('webdriverio');

(async () => {
    const browser = await remote({
        logLevel: 'error',
        path: '/',
        capabilities: {
            browserName: 'firefox',
            "moz:firefoxOptions": {
              args: ['-headless']
            }
        }
    });

    await browser.url('https://webdriver.io');

    const title = await browser.getTitle();
    console.log('Title was: ' + title);

    await browser.deleteSession();
})().catch((e) => console.error(e));
```

## 再度テスト実行

```
$ node test.js
```

今度はうまくいくはずです。
プログラミング学習記録74〜配列を操作するメソッド〜

##今日やったこと
- Progate JavaScript5リセット復習
- Progate JavaScript6そのまま復習

export の後のスペースを半角２文字分取ったことでエラーになってしまいました。
こういうミスは気づきにくいですね。

JavaScript6では、配列を操作するメソッドを復習しました。

ドットインストールの「詳解JavaScript オブジェクト編」にあたる内容です。

具体的には、配列に要素を加えたり、1つずつ順番に取り出したり、条件式に見合う要素だけ取り出したりなどです。

前回ProgateのJavaScriptをやってからだいぶ時間が経っており、「初見の時の同じくらい苦労するかな〜」と思っていたのですが、意外とやってみたら普通にできたのでよかったです。

DaiGoさんの「最短の時間で最大の成果を手に入れる　超効率勉強法」によると、忘れてから行う復習が１番効果が高いみたいです。
<br>
明日はProgateのJavaScriptを復習しつつ、ドットインストールで作ったものをアレンジしてGitHubにあげたいと思います。

おわり
Vue.js+FirebaseでNewsをランダムで閲覧できるアプリを作りました

トップニュースをざっと知りたい人向けにトップニュースをランダムで閲覧できるサービスを作りました
#サービス
[News Catch](https://newscatch-21bc5.firebaseapp.com/)

ページをロードしたときに１つニュースを取得し表示します。
![newscatch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240403/c02e61b8-f88a-a7bb-7a5d-eefe7896098b.png)

三角のボタンを押すことでニュースを再取得し表示します。
![nextbtn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240403/8417ae76-7548-8234-39ce-4df51028dab9.png)

Twitterボタンを押すことでTwitterでニュースのURLをシェアすることができます。
![twitterbtn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240403/19c202a4-5714-3ea3-8f97-b789e80d5ea9.png)

#使った技術
##フロントエンド
フロントエンドはVue.jsを使用しました。
Nuxt.jsを使おうと思ったのですがSEO対策するほどの規模のサービスではないなと思いVue.jsを今回は使用しました。
CSSに関しては今回はシンプルなデザインなのでCSSフレームワークを使わずSCSSを使いました。
SCSSはCSSの構文で入れ子構造にできるのでとても便利です。

##バックエンド
バックエンドはFirebaseを使用しました。
FirebaseはGoogleが提供しているmBaaSと呼ばれるサービスです。
今回はFirebase HostingとFirebase Cloud Storageを使用しました。

Firebase Hostingはデプロイ用、Firebase Cloud StorageはOGP画像の保存用で使用しました。

##API
使用したAPIはNews APIです。
[News API](https://newsapi.org/)

非商用なら無料で利用可能で日本のニュースもあります。
ドキュメントもきちんと整備されておりとても使いやすいと感じました。

#まとめ
サービスを開発していくにあたって自分の力のなさが目にみえたのでもっと勉強しようと思います。
RubyでHelloWordと出力する方法

こんにちは、アキトです。

本日はRubyで「Hello World」と出力する方法をご紹介します。

流れとしては、以下の流れです。
①VSCodeでコードを書く
②ターミナルで書いたコードを実行する

それでは具体的に見ていきましょう。

## VSCodeでコードを書く

###ファイルを作成する

まずコードを書く前に、ファイルを作成します。

VSCodeを立ち上げたら「command + N」で新規ページを立ち上げます。

続いて「command + S」で保存します。

このとき保存先をデスクトップにして、ファイル名の拡張子は「.rb」にしておきましょう。

<img width="432" alt="スクリーンショット 2019-05-01 22.06.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349810/f9818a12-47d3-a356-f5c0-023488b44a55.png">

### プログラムを書く

今回は、「Hello World」と出力したいので、いま作ったファイルに下記のようにプログラムを書きます。

<img width="361" alt="スクリーンショット 2019-05-01 22.08.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349810/4f0d4e20-8f14-499a-430f-295a3d2558ad.png">

プログラムを書くところは以上で終了です。

## ターミナルで書いたコードを実行する

それでは上で書いたプログラムをターミナルで実行しましょう。

### ターミナルを立ち上げる

まずターミナルを立ち上げます。

スポットライト検索から立ち上げると楽です。

Macの場合「control + スペースキー」もしくは「command + スペースキー」でスポットライト検索画面が立ち上がります。

そこに「ターミナル」と検索すればターミナルが出てきます。

### ディレクトリをデスクトップに移動させる

「cd /Users/ユーザー名/Desktop」でカレントディレクトリをデスクトップにします。

<img width="567" alt="スクリーンショット 2019-05-01 22.20.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349810/1204c3bc-660a-203f-7f8e-0d5d3883e0f9.png">

### ファイルを読み込む

あとはコードを書いたファイルを読み込めばコードが実行されます。

ターミナルの「$」のあとに「ruby ファイル名」と入力してエンターキーを押しましょう。
<img width="567" alt="スクリーンショット 2019-05-01 22.23.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349810/12a52a12-12fd-1773-8d28-403342c99717.png">

そうすると「Hello World」と出力されます！！

<img width="567" alt="スクリーンショット 2019-05-01 22.25.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349810/349a26e7-d53d-35ff-368a-6ffd3f84bf88.png">

## まとめ

以上まとめると、Rubyで「Hello World」と出力するためには以下の2点を押さえておきましょう。

①VSCodeでコードを書く
②ターミナルで書いたコードを実行する
Visual Studio 2019でのソリューション作成とソース管理

## メモ
Visual Studio 2017ではソリューション作成時のダイアログに「新しい Git リポジトリの作成」チェックボックスがあり、ソリューション作成と同時にgitリポジトリを作成するオプションが利用できた。
Visual Studio 2019にはこのオプションがない。

ただし、ソリューションエクスプローラ上でソリューションノードのコンテキストメニューに「ソリューションをソース管理に追加」メニュー項目があり、リポジトリの作成と初期コミットを作成することができる。
(確認してみたらVS2017にもこの機能が存在した。というか結構前のバージョンから存在するようだ。)

最初は多少の不便にも思えるが、ソリューション内を状態を任意に整えてから管理開始できるため、こちらのほうが良いと思えてきた。
(プロジェクトと共に自動で生成された不要な Class1.cs を削除してから管理開始するなど。)
いろはちゃんコンテスト Day2 - A-Cまで

[いろはちゃんコンテスト Day2](https://atcoder.jp/contests/iroha2019-day2)

とりあえず、解けたところまで。。。
終了後は、解けた問題の考察があっていたかの確認
解けなかった問題をeditorialを読んで考察。。。しても理解不能。。。考察力を磨くとは（ry


もう少しレベルアップしたら残りの問題をやりに戻ってくる予定

#A問題

 - やっててよかった[Educational DP Contest](https://atcoder.jp/contests/dp/tasks/dp_f)
 - $LCS+1$の長さが [真・$p$字決まり]
    - LCS解説は
        - [id:nitoyon さん作成のslideshare資料]((slideshare)https://www.slideshare.net/nitoyon/ss-1086077)
        - [典型的な DP (動的計画法) のパターンを整理 Part 1 ～ ナップサック DP 編 ～](https://qiita.com/drken/items/a5e6fe22863b7992efdb#%E5%95%8F%E9%A1%8C-8%E6%9C%80%E9%95%B7%E5%85%B1%E9%80%9A%E9%83%A8%E5%88%86%E5%88%97-lcs-%E5%95%8F%E9%A1%8C)
        - [北陸先端科学技術大学院大学の講義資料？](https://www.jaist.ac.jp/~uehara/course/2014/i431/pdf/07dp1.pdf)
        - プログラミングコンテストチャレンジブック(P.56-P.57)

```java
	private void solveA() {
		String s1 = next();
		String s2 = next();
		if (s1.isEmpty() || s2.isEmpty()) {
			out.println(0);
			return;
		}
		int l1 = s1.length();
		int l2 = s2.length();

		int[][] dp = new int[l1 + 1][l2 + 1];

		for (int i = 1; i <= s1.length(); i++) {
			for (int j = 1; j <= s2.length(); j++) {
				if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
					dp[i][j] = dp[i - 1][j - 1] + 1;
				} else {
					dp[i][j] = Integer.max(dp[i][j - 1], dp[i - 1][j]);
				}
			}
		}

		out.println(dp[l1][l2] + 1);

	}
```

#B問題

　-　ベクトルの外積って、記憶にないわーー。ということでこの問題は解けませんでした。。。
    -　各種場合分けに失敗したので解くのあきらめてCに移りました。

 - 参考
    - [問題解説](https://img.atcoder.jp/iroha2019-day2/editorial-B.pdf)
    - [数学大好き　さんのサイト](http://proofcafe.org/k27c8/math/math/vector_analysis/page/meaning_of_outer_product/)

```java
	/**
	 * ベクトルの外積
	 * 外積の向き
	 */
	private void solveB() {
		int x = nextInt();
		int y = nextInt();
		int a = nextInt();
		int b = nextInt();

		int[] s = IntStream.range(0, 2).map(i -> nextInt()).toArray();
		int[] t = IntStream.range(0, 2).map(i -> nextInt()).toArray();

		boolean vect1 = s[0] * (b - a) - (s[1] - a) * x > 0;
		boolean vect2 = t[0] * (b - a) - (t[1] - a) * x > 0;

		out.println(vect1 == vect2 ? "No" : "Yes");
	}
```

#C問題

 - 座標圧縮だよねこれ

```java
	private void solveC() {
		int numN = nextInt();
		int[] wk = new int[numN];
		Set<Integer> wkL = new TreeSet<Integer>();
		for (int i = 0; i < wk.length; i++) {
			wk[i] = nextInt();
			wkL.add(wk[i]);
		}

		List<Integer> tmp = new ArrayList<Integer>();
		tmp.addAll(wkL);
		Collections.sort(tmp);

		for (int i = 0; i < wk.length; i++) {
			int position = Collections.binarySearch(tmp, wk[i]);
			position = position >= 0 ? position : ~position;
			out.println(position + 1);
		}
	}

```
ServerSideSwiftでHello Worldをしてみる

# Hello World
こんにちは、fummicc1です。今回は、Swiftでサーバーサイドを実装してみようということで記事にしました。

# Kitura
KituraとはSwiftでサーバーサイドを実装するためのフレームワークです。他にもPerfectやVaporなどがあります。

# Setup
## 環境
- Xcode 10.2
- Swift 5

## Kitura導入
まずは、今回のためのディレクトリを作成しましょう。

```shell
mkdir KituraHelloWorld
cd KituraHelloWorld
```

次に、kituraをインストールして、プロジェクトの初期化を行います。(インターネットからダウンロードをするので時間がかかります。)

```shell
brew tap ibm-swift/kitura
brew install kitura
kitura init
```

これで、初期設定ができました。次に、xcodeでプロジェクトを開いていきます。

```shell
open KituraHelloWorld.xcodeproj/
```

上のコマンドでXcodeを立ち上げてくれます。

開いたら、Cmd + 1でファイルツリーを開き、Routesフォルダに新しく、`HelloWorldRoutes.swift`を作成します。

作成した`HelloWorldRoutes.swift`に以下の記述をします。

```swift
func initializeHelloWorldRoutes(app: App) {
    app.router.get("/helloWorld") { (request, response, next) in
        response.send("Hello World!")
    }
}
```

ここでは、GETリクエストに対しての処理を記述しています。ルーティングも指定していて、第一引数で指定できます。今回は、`/helloWorld`です。

次に、この`initializeHelloWorldRoutes`を`Application.swift`のAppクラスで呼んであげます。

```App.swift
public class App {
    let router = Router()
    let cloudEnv = CloudEnv()

    public init() throws {
        // Run the metrics initializer
        initializeMetrics(router: router)        
    }

    func postInit() throws {
        // Endpoints
        initializeHealthRoutes(app: self)
        initializeHelloWorldRoutes(app: self) // ここを追加！
    }

    public func run() throws {
        try postInit()
        Kitura.addHTTPServer(onPort: cloudEnv.port, with: router)
        Kitura.run()
    }
}
```

これで、完成です。あとは、Cmd + R でXcodeがローカルホストを立ち上げてくれます。URLは[こちら](http://localhost:8080/helloWorld)です。

<img width="1440" alt="スクリーンショット 2019-05-01 22.17.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300444/f516a90e-e769-c212-19c2-c206007a54f3.png">
無事できました。Swiftだけでオンラインじゃんけんゲームとか作れると面白いと思うので今度頑張って作ってみたいですね！

# 参考記事
- [Kituraの導入部分を参考にさせていただきました。](https://www.raywenderlich.com/1079484-kitura-tutorial-getting-started-with-server-side-swift)
Slackとその活用方法

#Slackとその活用方法

##Slackとは
　SlackはSNSの一種である。スマートフォンでは主にアプリで、そしてPCでも無料で利用可能となっており、現在その普及が拡大している。
　TwitterやInstagramよりはLINEに近い機能を有しているとイメージするのが最も簡単かもしれないが、いくつか違いがある。

###Slackの特徴
　Slackの最大の特徴はトークルームの作成・共有が容易である点である。
　大きな一つの団体の中で、小グループに分けて対話や作業が必要な場面は日常のみならずビジネスシーンにも往々にしてある。小規模でのトークルームを作成し、そして大きな団体のメンバー全員がすべてのトークルームの存在及びトークの内容を確認できるというのがこのSlackの最大の強味である。
また、他にも細かい便利な機能がある。LINEにおけるスタンプのような「リアクション」という機能を自分でカスタマイズできる点や、一人がトーク入力中の時に他のメンバーが把握できる点などまさに「痒い所に手が届く」機能が多く、インターフェースもわかりやすい。
これを機に導入してみてはいかがだろうか。
BigQuery標準SQLでUTCをJSTに変換する

日付のみを取得する場合はDATE関数、日時を取得する場合はDATETIME関数を使用する。

```
SELECT
  timestamp
  ,DATE(timestamp, 'Asia/Tokyo') as DT
  ,DATETIME(timestamp, 'Asia/Tokyo') as TIME 
FROM
  `PROJECT.DATASET_TABE` 
where
  DATE(timestamp, 'Asia/Tokyo') >= '2018-04-01'
  AND DATE(timestamp, 'Asia/Tokyo') < '2018-12-01'
;
```

結果
<img width="311" alt="bigquery_result.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386370/bb03ab53-0922-a5db-70e0-635d8224d0d7.png">
【Swift4】Labelに表記する単位をフォント小さめで表示する方法

Swiftでラベルに何らかの数値と単位を表示する場面はよくあると思います。そのときに単位の部分だけフォントを小さく表示したいことが多いです。
ストーリーボード上で別のラベルとして分けてもいいのですが、ラベル間の間隔が空いてしまったりレイアウトが面倒だったりするので、コードで単位文字列だけフォント変更するようにしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134764/dd48d14a-2cf7-fd61-7d69-d9d0406ff928.png)



## NSMutableAttributedStringを使ったフォント変更
NSMutableAttributedStringを使うことで、複数の文字列それぞれに文字装飾を指定した後に、文字列を連結させることができます。


```swift:
// 表示したいメインの文字列もNSMutableAttributedStringで定義
let pointString = NSMutableAttributedString(string: String(point))

// 単位文字列に指定したい要素を定義
let unitStringAttributes: [NSAttributedString.Key : Any] = [
    .foregroundColor : UIColor.black,
    .font : UIFont.boldSystemFont(ofSize: 11.0)
]

// 単位文字列を定義し、先ほどのattributeを指定
let unitString = NSMutableAttributedString(string: "ポイント", attributes: unitStringAttributes)

// NSMutableAttributedStringを作り、ここにappendして装飾文字列を連結
let pointLabelString = NSMutableAttributedString()
pointLabelString.append(pointString)
pointLabelString.append(unitString)

// ラベルに表示する際にはtextではなくattributedTextに代入
cell.taskPointLabel.attributedText = pointLabelString

```

上記の実装で以下のように表示されます。フォントの大きさだけでなく色や書体なども変えられるのでぜひ試してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134764/3b889c0a-a657-830f-2be7-81d240407ce5.png)
gore を go get しても $GOPATH/bin にバイナリファイルができなかった

## はじめに
GoのREPLである`gore`を`go get`でインストールしようとしたところ、`$GOPATH/bin`配下にバイナリファイルがインストールされず、困った。

## 結論
[`gore`のGitHubリポジトリ](https://github.com/motemen/gore)のREADMEに書いてある[インストール方法](https://github.com/motemen/gore)で無事インストールできた。（2019.5.1時点）

```
go get -u github.com/motemen/gore/cmd/gore
```

## 事象
Goの学習のため、書籍[「みんなのGo言語」](https://www.amazon.co.jp/%E3%81%BF%E3%82%93%E3%81%AA%E3%81%AEGo%E8%A8%80%E8%AA%9E%E3%80%90%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E5%AE%9F%E8%B7%B5%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%80%91-%E6%9D%BE%E6%9C%A8%E9%9B%85%E5%B9%B8/dp/477418392X)を読み始めたところ、`gore`を`go get`することになった。書籍に書いてある以下のコマンドを実行した。

```
go get github.com/motemen/gore
```

エラーなど発生することもなく、プロンプトが返ってきた。早速`gore`を使ってみようとして`gore`コマンドを打つと、bashに「`gore`なんてコマンドは知らない」と怒られた。

## 調査
以下調査順。

- 外部パッケージを`go get`するとダウンロードとインストールが実行され、`$GOPATH/bin`にバイナリファイルができるはず。しかし`$GOPATH/bin`を確認したところ`gore`のバイナリファイルはなかった。
- `$GOPATH/src`を確認すると、`gore`および依存パッケージのソースコードは配置されていた。

```
$ tree -L 3 $GOPATH/src
$HOME/go/src
├── github.com
│   ├── motemen
│   │   ├── go-quickfix
│   │   └── gore
```

- 「go get バイナリファイル インストールできない」とかでググっていくつか記事を見たが、どの記事も`go get github.com/motemen/gore`でインストールできると書いてある。
- 試しに`go install`コマンドを試してみるが、やはりバイナリファイルはできず。
- 見ている書籍の発行は「2016年10月」なので、情報が古いという可能性は大いに考えられる。特にGoはまだ歴史が浅いので尚更。
- 最新情報を得るべく`gore`のリポジトリを見てみる。
- READMEにインストール方法が書いてあった。しかも書籍の情報と異なっている。
- READMEに書いてあるコマンドを実行すると無事バイナリファイルを`$GOPATH/bin`にインストールできた。
- `gore`のリポジトリを見ると、どうやら[「2019年2月」にインストール方法が変わったらしい](https://github.com/motemen/gore/commit/2d47455ff4f528b9f838cbd3c5466a494abef1db#diff-04c6e90faac2675aa89e2176d2eec7d8)。比較的最近変更されたので、対応した記事を見つけられなかったのだろう。

## 教訓
- パッケージのインストール方法などはそのパッケージのリポジトリを確認しよう（READMEをちゃんと読もう）
- 書籍の情報はあくまで執筆時点の情報なので、そのままでうまくいくとは限らない

## 参考文献
- [みんなのGo言語](https://www.amazon.co.jp/%E3%81%BF%E3%82%93%E3%81%AA%E3%81%AEGo%E8%A8%80%E8%AA%9E%E3%80%90%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E5%AE%9F%E8%B7%B5%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%80%91-%E6%9D%BE%E6%9C%A8%E9%9B%85%E5%B9%B8/dp/477418392X)
- [gore リポジトリ](https://github.com/motemen/gore#installation)
【Swift5】UIScrollView使用時にキーボード外タップでキーボードを閉じる

UIScrollViewを使用していたところ、[touchesBegan](https://developer.apple.com/documentation/uikit/uiresponder/1621142-touchesbegan)が呼ばれませんでした。
その時の備忘録です。

## 環境

- Swift5
- xcode10.2

## 対策

UIScrollViewを拡張する。以下のコードを追加。

```.swift
extension UIScrollView {
    open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.next?.touchesBegan(touches, with: event)
    }
}
```

[touchesBegan](https://developer.apple.com/documentation/uikit/uiresponder/1621142-touchesbegan)を呼ぶことができるようになりました。

```.swift

    /// キーボードが出ている状態の時にキーボード外をタップしたらキーボードを閉じる
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("キーボード外をタップ")
        //キーボードを閉じる
        self.view.endEditing(true)
    }
```

## 参考

- [UIScrollViewでtouchesBeganを使えるようにする(キーボートをタッチで閉じる時など)](https://qiita.com/nao-otsu/items/a2b60098a702ab1852c6)
LibreOffice 日本語化

備忘録です。忘れないように・・・

<p>
elementary OSをインストールして、Libre Officeをインストールしたけど、UIが英語なんで、日本語化に。
</p>

まずは、LibreOfficeのバージョン確認。
![LibreOffice_Version.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355500/1851ab44-6c54-ca5d-0b40-1c944c9458aa.jpeg)


以下のコマンドをたたく。

```
sudo apt install libreoffice libreoffice-l10n-ja libreoffice-help-ja
```

![LibreOffice_jpn.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355500/0a5932f0-d38f-a184-8d5e-264ea8ca3890.jpeg)

日本語になった。

知ってる人はスルーしてください。
機械学習論文読みメモ_163

[Differentiable Compositional Kernel Learning for Gaussian Processes](https://arxiv.org/abs/1806.04326)
ガウス過程の汎化性能はカーネルの選定に大きく依存しており、その選定は職人芸的である。
本論では代わりにカーネルをニューラルネットワークで表現して学習させる
neural kernel networks (NKN)を提案する。
NKNはカーネル関数が持つ特徴であるcomposition ruleを用い、
各ユニットにカーネルを用いる。
これにより、カーネル構造を微分可能な形で学習可能にする。
またNKNはstationary kernelのクラスにおいてはuniversalな表現である
ことを示す。

[Image-to-image translation for cross-domain disentanglement](https://arxiv.org/abs/1805.09730)
deep learningに基づいた画像変換技術はマルチモーダルなデータをカバーし高精度な性能を発揮してきた。
最近ではさらに、学習によって獲得された内部表現のdistentanglementを行う事でさらなる性能向上及び
より良い制御性を目指している。
本論では、これら２つの目的を統合し、cross domain disentanglementのコンセプトを提案する。
このために内部表現を３つへ分離して考える。
そのうち、shared partは両ドメインで共有される情報を保持する。
一方2つのexclusive partsは各ドメイン特有の情報を保持する。
提案手法はGANと新たに提案するcross-domain autoencoderを用いたbidirectional image translationに基づいている。

[Dynamical Isometry and a Mean Field Theory of CNNs: How to Train 10,000-Layer Vanilla Cnovolutional Neural Networks](https://arxiv.org/abs/1806.05393)
近年、CNNはCVにおいて多くの場合で用いられるようになった。
特に多層のモデルを学習する際に発生するvanishing/exploding gradient問題は
residual blockやbatch normalizationの利用で回避されてきた。
しかし実際にresidual blockやbatch normalizationが多層モデルの学習に
必須であるかは分かっていない。
本論ではそうした手法を用いず、適切な初期化を行うだけで多層のCNNが学習可能で
ある事を示す。
本論では、この初期化手法は平均場定理とdynamical isometry制約に基づいて導出した。
dynamical isometryは入出力に関するヤコビアンの平衡を示す。
この制約は畳み込み層においてnormは保存された直交行列の利用を要求する。
Azure Functions Python(preview)でpipを使う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77444/410eeb00-4ce2-ee1c-248d-4ccfd4cb1e7f.png)
Azure FunctionsのPython環境（2019/5/1現在、プレビュー）でパッケージをインストール方法の備忘録です。

#Azure上ではpipコマンドは使えなかった
ググると、Kuduコンソールからpipコマンドを使えば良いように思えたのですが、Kuduが開きません。。Azureコンソールのプラットフォーム機能をみると、Kuduが使えるような雰囲気ですが、クリックしても反応しません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77444/1ad4ad98-c46e-7433-0da6-631745baa66e.png)

scmのURLを直接指定しても、「サーバーが見つかりません」となって、どうやらPythonがホストされるLinux環境ではKuduコンソールは使用できないようです。なので、Azure上でpipコマンドを実行することはできませんでした。

気を取り直して、[チュートリアル](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-reference-python#python-version-and-package-management)を確認すると、依存ファイルであるrequirements.txtに必要なパッケージ名とバージョンを書いておけばOKとのこと。では、やってみます。



#サンプルアプリ
今回使用したサンプルアプリです。Httpでトリガーされる関数内でBeautifulSoupを使用したコードを動かしてみます。

```Python:__init__.py
import logging

import azure.functions as func
import urllib.request
from bs4 import BeautifulSoup

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    url = 'https://azure.microsoft.com/ja-jp/'
    with urllib.request.urlopen(url) as res:
        html = res.read()
        soup = BeautifulSoup(html, 'html.parser')
        title = soup.head.title
        return func.HttpResponse(f"title: {title.text}")
```

#パッケージのインストール手順

## 1. ローカル環境にパッケージをインストール
まず、ローカル環境でいつものようにpipコマンドを使用してパッケージをインストールします。

```bash
python -m pip install BeautifulSoup4
```

インストールされたパッケージのバージョンを確認します。

```bash
python -m pip list
```


## 2. requirements.txtを編集
pipでパッケージがインストールできたら、requirements.txt にパッケージ名とバーションを記述します。requirements.txtは Azure Functions Core Tools(CLI、またはVS Codeの拡張機能)でプロジェクトディレクトリーの直下に生成されています。

```text:requirements.txt
beautifulsoup4==4.7.1
```

## 3. Azureへデプロイ
いつものように発行するだけでOKです。特に追加の手順は必要ありません。

VS codeの場合:
![貼り付けた画像_2019_05_01_21_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77444/3ef3c025-6dde-e69a-2f74-435e93b4384b.png)

CLIの場合:

```bash:bash
func azure functionapp publish <app_name>
```

## 4. 実行
ブラウザから関数を実行してみます。

```
https://<app_name>.azurewebsites.net/api/HttpTrigger
```

ターゲットのWebサイトのTitleタグが取得できていれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77444/7410664c-5fc9-4bcb-c38c-f78d7ba3f7d3.png)


おしまい〜

#参考
- [Azure Functions の Python 開発者向けガイド - Microsoft](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-reference-python)
- [Azure で初めての Python 関数を作成する (プレビュー) - Microsoft](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-first-function-python)
- [Visual Studio Code を使用した初めての関数の作成 - Microsoft](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-first-function-vs-code)
vimをgolangに対応させる

golangを始めるにあたってvimに色々プラグインを追加

# vim-go
vim上でgoの様々なコマンドを実行するためのプラグイン
https://github.com/fatih/vim-go

色々プラグインを追加する気だったのですが、vim-goを入れたら一通り必要なものが揃ったので他に書くことがない。。。
ESP32でESP-IDF→Arduinoと変えた際にリブートのループに陥った時は・・・

# 概要＆結論

ESP-IDFで開発していた[ESPr Developer 32](https://www.switch-science.com/catalog/3210/)をArduinoの開発に使用した際に起こった現象についてです。
 
Arduino(1.8.5を使用)でデバイスへのプログラム書き込みを行うと、以下のシリアル出力メッセージとともに繰り返しリブートしてしまう状態になってしまいました。

```
esp32   rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
：
```

その時にESP-IDF環境で以下のように「make erase_flash」でフラッシュ領域のデータを削除して解決できました。

```
$ make erase_flash
```

以上です！
RaspberryPi3にUbuntuMateを入れてみる

#目的
最終的にはRaspberryPi3でVPNやNASを実現したい。
今回はRaspberryPi3にUbuntuMateを入れてみる。
お勉強がてらいろいろいじってみる。
やる場合はあくまでも備忘録なので参考程度に自己責任でお願いします。

#用意する物
- Raspberrypi3
- メモリカード(microSD)
- メモリカードにOSを入れるためのPC(Windows10)
- やる気(適量)
- コーヒーもしくは紅茶等

#使用するソフトウェア等
- [UbuntuMate](https://ubuntu-mate.org/)(16.04)
- [SDメモリカードフォーマッター](https://www.sdcard.org/jp/downloads/formatter/)(筆者はV4.0を使用してるが執筆時最新は5.0.1)
- [Win32DiskImager](https://sourceforge.net/projects/win32diskimager/)(1.0)

#前準備
ソフトウェアや用意する物を準備しておく。
ダウンロード・インストールは大体書いてある通りに進めれば十分なので割愛。

#メモリカードをフォーマットする
マイクロSDを挿してフォーマットをして行く。
論理サイズも直したいので標準のものではなくSDメモリカードフォーマッターを使用する。

設定は論理サイズ調整ONで上書きフォーマット。
多分クイックフォーマットでも十分だが何となく上書きを選択。

だいぶ時間がかかるのでコーヒーブレイク。

完了

#イメージを書き込む
一応マイクロSDを挿しなおす。
WriteとReadどっちだ？と思ったが、

> Write:Write data from 'Image File' to 'Device'
> Read:Read data from 'Device' to 'Image File'

とあるのでWriteを選ぶ。

これまた時間がかかるのでコーヒーブレイク。

完了

#UbuntuMateのセットアップ
1. microSDを挿す
2. 周辺機器を刺す
 1. キーボード
 2. マウス
 3. LANケーブル
3. 電源投入(電源ケーブルを刺す)
4. 初期設定
 1. 言語はEnglishを選択(homeディレクトリ以下が日本語になるのが嫌なため)
 2. 場所は"Tokyo"
 3. キーボードは多分Japanese-Japanese(Kana 86)
 4. ユーザ情報を設定
5. コーヒーブレイク

#まとめ？
とりあえずこれで最低限はできた。
次回は自分の好みの設定をしたり、アップデートをしたりして行きたい。
初めての記事なのでいろいろとおっかなびっくり書いている。
ツールのスクリーンショットなども何となく怖くなって乗せるのをやめてしまった。
とりあえず調べたこととかをつらつらと書いていきたい。
PycharmでMicroPythonプラグインをインストールしたらエラーが出たのでバージョン指定

Pycharmでmicropythonのコードを書こうと設定していたら、エラーが出てつまづいたのでメモ。設定が終わると、コードをその都度ドラッグ&ドロップすることなく、micro:bitに直接書き込めるようになりました。

#環境について
- macOS Mojave 10.14.4
- Python3.7
- PyCharm 2019.1

#uflashはサポートされているバージョンを指定してインストールする
Pycharmにプラグイン「MicroPython」をインストールし、Preferences < Languages & Frameworks < MicroPythonの「Enable MicroPython support」にチェックを入れるだけなんですが、プラグインの動作に必要なパッケージがインストールされていないというエラーメッセージが。

```
PackagesNotFoundError: The following packages are not available from current channels:

  - uflash[version='>=1.0.8,<1.1']
```
uflashが見つからないということなのでインストールしますが、エラーメッセージは消えず。

エラーメッセージをよく確認すると、

```
  - uflash[version='>=1.0.8,<1.1']
```

最新バージョンである1.2.4（2019/5/1現在）はサポートされていなかったので、uflashをアンイストールし、サポートされているバージョンである「Ver.1.0.8」を指定して、改めてインストール。

``` bash
$ pip install uflash==1.0.8
```

インストールが完了したら、Macとmicro:bitをUSBケーブルで接続し、Preferences < Languages & Frameworks < MicroPythonの「Detect」をクリックすると、自動でパスが設定されました。

<img width="762" alt="micropython1.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392241/3d61c28d-c437-55ac-40e3-208312706653.jpeg">

##micro:bitの開発めっちゃ捗る
コードを書いて、Run（Ctrl+Shift+F10）するだけで、micro:bitにコードが書き込まれ、動作します。[ブラウザ](https://python.microbit.org/)でもコード書けますが、ドラッグアンドドロップする必要ないので、Pycharmのほうが100倍便利です。

##参考にした記事など
- [BBC micro:bit上のmicropythonのプログラムをPyCharmで開発する](http://mickey-happygolucky.hatenablog.com/entry/2018/02/24/182120)
- [マイクロビットを簡単に使うための5つのステップ](https://microbit.org/ja/guide/quick/)
- [uflash 1.2.4](https://pypi.org/project/uflash/)
Node.jsに令和対応が来てた

# Node.js 12.1.0には令和対応が入っている

Node.jsの最新版に令和対応が入っているようです。

> 2019-04-29, Version 12.1.0 (Current), @targos
> intl:
> Update ICU to 64.2. This adds support for Japanese Era (Reiwa) (Ujjwal Sharma) #27361.
> 
> https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V12.md#12.1.0

Ujjwal Sharmaさん、日本のことをよくご存じなんでしょうか…。

# 実際に試す

macOSの場合はHomebrewで最新版が降ってくるのですぐ試せます。

```
$ brew upgrade node
（略）
$ node -p "new Date().toLocaleDateString('ja-JP-u-ca-japanese', { era: 'long' })"
令和元年5月1日
$ node -p "new Date(Date.UTC(2019, 3, 30, 0, 0, 0)).toLocaleDateString('ja-JP-u-ca-japanese', { era: 'long' })"
平成31年4月30日
```

5月1日から先は令和元年となるようです。これでNode.jsで令和対応の仕事が入っても安心ですね！（そんな仕事があるかは知らない）

# （おまけ）ブラウザの対応

手元のChromium 75、Firefox 66、Safari 12.1ではいずれも「平成31年5月1日」と表示されました。ブラウザの対応はもう少し先になりそうです。
ラズバイ3B+が届いてから、Node-REDを起動するまで

## はじめに
* 令和初日にラズパイが届いたので、何をすれば起動できるかを残しました。
* 最近Node-REDをよく使うので、ラズパイ経由でのIoT機器が制御したいなぁと
* ちなみに、他の先駆者の方も詳しい解説などもあるので、画像などは ~~取り忘れた~~ 省略させてください。。。

## スタートとゴール
* スタートは、amazonからRaspberry Pi 3 B+が届いたところ
* ゴールは、ラスパイでNode-REDが動くこと

## やったこと
1. 開封して組み立てる
2. ヒートシンクを付ける
3. microSDカードをTypeCのコンバータ(同梱されている)に入れて、PCに指す
4. microSDカードをフォーマット(ツールを使う)
5. RaspberryからOSをダウンロードする
6. 解凍してmicroSDに入れる
7. microSDをラズパイに指す
8. HDMIケーブル(同梱されている)を使ってディスプレイに繋ぐ
9. 最低限USBマウスを繋いでOSのインストールを選択
10. インストール後GUIからNode-REDを起動する

## 補足
買い足したものはなし、強いていうと以下が必要
* HDMIケーブルが接続できるディスプレイ/テレビ
* microSDもしくはUSBのtypeCのインタフェースを持っているPC
* ネット環境

## 感想
ラスバイすげー。本当に数千円でPCが手に入った！(今更感w)