OmniAICreator/Qiita-1.07M huggingface dataset:
OpenModelicaで伝熱流動　IsolatedPipeとSimpleFriction

前回までに作ったモデルにThermal→FluidHeatFlow→ComponentsのIsolatedPipeを入れてみました。
![isolatedPipe_diam.png](https://qiita-image-store.s3.amazonaws.com/0/317126/3248820a-62d3-947f-5a17-4d551c9429bb.png)
IsolatedPipeの設定項目は下図の通りですが、Simple　Frictionの項目がよくわからない・・・
![IsolatedPipe_parameter.png](https://qiita-image-store.s3.amazonaws.com/0/317126/f86e6cbe-1fa2-ebba-e614-d457b4eb5afa.png)

層流の体積流量と圧力損失の組み合わせと、乱流を想定した定格の体積流量と圧力損失を入力して、体積流量から圧力損失を算出するのだろうと考えて、上図の適当な設定でコンパイル、実行すると実行時にエラーが。
assert | error | SimpleFriction: dpNominal has to be &gt; dpLaminar/V_flowLaminar*V_flowNominal!

定格の体積流量を流した時の圧力損失が制約を満足していないらしい。
詳細を確認するため、IsolatedPipeを以下の図のようにView textで見てみると・・・
![view_text.png](https://qiita-image-store.s3.amazonaws.com/0/317126/a7e45be0-6a91-f471-fb82-10c341d1705e.png)
model IsolatedPipe "Pipe without heat exchange"
  extends Interfaces.Partials.TwoPort(final tapT=1);
  extends Interfaces.Partials.SimpleFriction;
  parameter Modelica.SIunits.Length h_g(start=0)
    "Geodetic height (height difference from flowPort_a to flowPort_b)";
equation
  // coupling with FrictionModel
  volumeFlow = V_flow;
  dp = pressureDrop + medium.rho*Modelica.Constants.g_n*h_g;
  // no energy exchange with medium
  Q_flow = Q_friction;

と、コメントにcoupling with FrictionModelとあるように、圧力損失計算はSimpleFrictionで行われていることがわかりました。
そこで、SimpleFrictionを探して、View textをしてみると、
![friction_view.png](https://qiita-image-store.s3.amazonaws.com/0/317126/711cb4b1-8ba9-541e-2305-1143fc9fb699.png)
partial model SimpleFriction "Simple friction model"
-前略-
protected
  parameter Modelica.SIunits.Pressure dpNomMin=dpLaminar/V_flowLaminar*V_flowNominal;
  parameter Real k(final unit="Pa.s2/m6", fixed=false);
initial algorithm
  assert(V_flowNominal>V_flowLaminar,
    "SimpleFriction: V_flowNominal has to be > V_flowLaminar!");
  assert(dpNominal>=dpNomMin,
    "SimpleFriction: dpNominal has to be > dpLaminar/V_flowLaminar*V_flowNominal!");
  k:=(dpNominal - dpNomMin)/(V_flowNominal - V_flowLaminar)^2;
equation
  if     volumeFlow > +V_flowLaminar then
    pressureDrop = +dpLaminar/V_flowLaminar*volumeFlow + k*(volumeFlow - V_flowLaminar)^2;
  elseif volumeFlow < -V_flowLaminar then
    pressureDrop = +dpLaminar/V_flowLaminar*volumeFlow - k*(volumeFlow + V_flowLaminar)^2;
  else
    pressureDrop =  dpLaminar/V_flowLaminar*volumeFlow;
  end if;
  Q_friction = frictionLoss*volumeFlow*pressureDrop;
-後略-
と、元の式が見えます。
15年くらいいろんな流路の圧力損失を計算してきた私ですが、この式は使ったことない・・・
なんだろな？と思っていたところ、SimpleFrictionをダイアグラムビューにすると、ナイスな図が出現。
![SimpleFriction_diam.png](https://qiita-image-store.s3.amazonaws.com/0/317126/e5261938-910b-6c00-831d-eadf35744356.png)
圧力損失は層流域では体積流量に比例、乱流域では体積流量の2乗に比例するとして、算出していることが絵的にわかります。

と、わかったのは良いのですが、この算出方法に疑問が残ったところで、今回は終了です。
maillogから、送信においてなんらかのエラーが発生したログをgrepするコマンド

```
less /var/log/maillog |grep -v 'dsn=2\.0\.0'  | grep 'dsn=' 
```

SMTPは、正常な送信を行うと`dsn=2.0.0`を返しますので、それを`grep -v`で除外してやると、なんらかのエラーが起こったあたりを抜き出すことができるのではないか。

dsnについては以下参照。httpのステータスコードみたいなもの
https://oxynotes.com/?p=9810

```
less /var/log/maillog |grep -v 'dsn=2\.0\.0' | grep 'dsn=' -A 4
```
のようにすれば、その行だけでなく、該当した後の数行（この場合は4行）も見れてみやすい

ちなみに、とりあえず送信できていないやつだけgrepしたい場合（エラーが出てても、送信済みなら問題ないとする場合）は、status=sentの方をgrepしてやると見やすいと思う。

```
less /var/log/maillog | grep -v 'status=sent' | grep 'status=' -A 4
```
みたいな感じで。

なにはともあれ、-v オプションと　-Aオプションは便利。
CISCO機器に毎回設定してる基本的な設定

[C1721のInstallation Guide](http://perso.univ-lyon1.fr/olivier.gluck/Cours/Supports/L3IF_RE/CNA/CISCO1721/HardConfigGuide.pdf)

頭の中の整理を兼ねて。

3行でまとめると、
・毎度SSH接続を有効にして、
・デフォルトでは見にくい、ログ出力の設定を見やすいように調整する
ってことです。

#SSH接続を可能にする
・ユーザを作成する
・ドメインの設定
・ルータ用鍵ペアの生成
・SSH接続を有効にする

https://www.infraexpert.com/study/ciscorouter7.html

#loggingの設定を最適化する
・打刻の設定を見やすいものにする
（初期設定：ルータの起動時からの経過時間　→　日本時刻へ変更）
・ルータの時刻同期を設定し、正確な時間を刻ませる
（NTPサーバの設定など）
・logging synchronousをlineインターフェース、VTYインターフェースに設定する

https://www.infraexpert.com/study/syslog2.html
react-native-elementsのFormInputを編集不可(disable？)にする方法


react-native-elementsのFormInputを編集不可にするには、その名もeditable={false}とすればよいようです。
しばらく探しました。。。

```diff
<FormLabel>Name</FormLabel>
<FormInput
  autoCapitalize='none'
  onChangeText={handleChange('name')}
  value={values.name}
+ editable={false}
/>
```

### 参考

* https://github.com/react-native-training/react-native-elements/issues/638
jsdoでchip8

#概要

jsdoでchip8やってみた。

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/6744d2da-cfbb-c2d2-15bd-d19b57d67067.png)


#参考にしたページ

https://dev001hajipro.github.io/chip8/

#成果物

http://jsdo.it/ohisama1/ofjx

以上。
Vue.jsでFont Awesomeを使う

Vue.js (TypeScript) で Font Awesome を使う方法をまとめました。

#### 概要

`@fortawesome/vue-fontawesome` を使うと `font-awesome-icon` コンポーネントをテンプレートに埋め込むのみでアイコンを表示できる。ビルド時には必要なアイコンのみをバンドルできるため、アプリのサイズを最小限に抑えることができる。

TypeScript を使う場合は、型定義ファイルが用意されていないため、自分で用意する必要がある。

#### 使い方

main.ts

```typescript
import Vue from 'vue';
import { library } from '@fortawesome/fontawesome-svg-core';
import { faPlus, faMinus, faExternalLinkAlt } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
library.add(faPlus, faMinus, faExternalLinkAlt);
Vue.component('font-awesome-icon', FontAwesomeIcon);
```

src/@types/fortawesome__vue-fontawesome.d.ts

```typescript
declare module '@fortawesome/vue-fontawesome';
```

Component (template)

```vue
 <font-awesome-icon icon="external-link-alt" />
```

#### 参考

* https://fontawesome.com/how-to-use/on-the-web/using-with/vuejs
* https://github.com/FortAwesome/vue-fontawesome/issues/24
* <https://medium.com/@ryutamaki/fcc090804b21>
地図にプロットしたい.2


中年無能SEのイヤイヤお仕事勉強メモです。
基本的に自分でイチからコード書くこと、英語サイトを調べること極力避けて通ります。

# 目的
- 地図上に緯度経度情報をプロットしたい。

# 参照URL
Pythonによるデータ可視化ライブラリ「folium」がとても使いやすい
https://qiita.com/momota10/items/3b878f01d489a32e40c3
foliumメモ
https://qiita.com/pma1013/items/20ac475d3c0d7a7778ac
Python + folium で Strava の "全"記録を地図で可視化 
https://hiboma.hatenadiary.jp/entry/2017/09/13/094056
Folium
https://github.com/python-visualization/folium

# 地図表示可否を確認

- 自宅付近の地図がほしいのでとあるデータセットから以下のコードを試し打ち。
- df = プロットしたい座標情報が詰まったデータフレーム
- とりあえず全座標平均値で地図を呼び出し

```
m = folium.Map(
    location=[df['緯度'].mean(), df['経度'].mean()]
    , zoom_start=15)
m
```
<img width="981" alt="スクリーンショット 2018-11-25 3.23.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/214069/98f4fbda-2661-1ab5-ef70-13080a47b323.png">

# 大量座標を一括プロット
以下のどちらかが良いみたい。
`folium.Circle(location=locations,radius=0.01)`
`folium.PolyLine(locations=locations)`

https://python-visualization.github.io/folium/docs-v0.6.0/modules.html#module-folium.vector_layers

Circle(location)location,PolyLine(locations)共に
list of points (latitude, longitude)を入力と書いてあるけど
Circleはうまく描画されない。
PolyLineで進めることにする。

# ということで

```
m = folium.Map(
    location=[df['緯度'].mean(), df['経度'].mean()]
    , zoom_start=20)

locations = df[['緯度','経度']].as_matrix().tolist()

line = folium.PolyLine(locations=locations)
m.add_child(line)

m
```
とりあえず描画された。描画結果は色々個人情報になるので添付しない。
これから超大量の座標情報を投入していく。

# その他
`folium.PolyLine(locations=locations)`
で、IOPub data rate exceeded.というエラーがでた。

Jupyter notebookでPlotlyを使うときに一設定必要だった話
https://aotamasaki.hatenablog.com/entry/2018/04/08/123146

を見て対処した。
【備忘録】テスターとして分かったこと

テスト業務を行っているので、考えたことを備忘録として残す。（適宜、更新）

1.わかったこと
2.感じたこと

### 1.わかったこと

観点
1. 管理者観点（スーパーバイザー）
2. 作業者観点（テスター）

##### 1. 管理者観点
1. 仕事の振り方について、以来のやり方
2. 仕事の進め方、タスクに対する開始と終了の定義

##### 2. 作業者観点

テスト仕様書から、サービス（システム）の現行把握ができる

現行把握の観点は2点
1. 機能中心
2. 人中心

###### 1. 機能中心
1. 機能
2. 用途
3. 必要性
4. 改善要素　→　提案につながる（※視点を明確に伝えた上、提案すること）

###### 2. 人中心
1. ユーザー
2. 管理者
3. マーケター
4. 開発者

### 2.感じたこと

その他は何があるのか。
本内容に対して、考え方を深める資料がほしい。
railsでscaffoldを使う(簡易手順)

# はじめに
[Ruby on RailsでHelloWorldプロジェクト](https://qiita.com/Knoth/items/8627c33fcd926ff014a4) でScaffoldを使わずにプロジェクト作成をした。
Scaffoldってどうなんだろうと思い、使ってみました。

サクッと作れたので簡単にまとめてみました。
これだけのコマンドでWebアプリが作れてしまうのは凄いですね…。

# 作成〜起動

```
> bundle init
(Gemfile修正)
> bundle install --path vendor/bundle
> bundle exec rails new . -B -d mysql
> Y
> bundle install --path vendor/bundle
(database.yml修正)
> bundle exec rake db:create
> bundle exec rails generate scaffold ScaffoldMessage name:string mail:string title:string message:string
> bundle exec rake db:migrate
> bundle exec rails server
```

scaffoldで作成したファイルを全削除する場合

```
> bundle exec rails destroy scaffold ScaffoldMessage
```

# 参考

データ型
https://www.javadrive.jp/rails/model/index4.html#section2
雑書きメモ：自サイト以外のリンクにFont awesomeを反映させたかった話

## やりたかったこと
* いまサイト作ってる
* 自サイト以外のリンクのとき、Font awesomeアイコンが自動でくっつくようにしたい

## つまづいたこと
* URLだけを除外すると、別のいらんところ（例えばTwitterのシェアボタン）にまで反映される
* 別タブが開かないページを除外すると、それもいらんところがガンガン反映されてる

## 結果的に

2つをくっつけて乗り切りました。




```style.css
a:not([target="_blank"]):not([href^="https://hogehoge.com/"]) {
    position: relative!important;
}

a:not([target="_blank"]):not([href^="https://hogehoge.com/"]):after {
    content: "\f35d";
    color: #333;
    font-family: "Font awesome 5 Free";
    width:20px;
    height:20px;
    padding-left:0.3em;

    font-weight:900;
}

```
``:not([target="_blank"])``で「ページ内リンクを除外」、``not([href^="https://hogehoge.com/"])``で「自サイトのリンクを除外」しています。たぶん。
あってる？あってるよね？？



## まとめ

**CSS、奥が深いぜ…**
バーニーおじさんを探せ！

# はじめに
みなさん、バーニーおじさんのルールを知っていますか？ JDLAが運営する資格試験「G検定」の勉強中に遭遇した、このルール。
>「機械学習において学習に必要なデータ数は説明変数（パラメータ）の数の10倍」

**知らん！**　そこそこ機械学習の経験はあるはずなんだけど、バーニーおじさんって誰？

有名な機械学習の法則は出展が明らかなのですが、

- ノーフリーランチ定理：ただ飯なんて都合のよいことなんてないんだよ。み〇を
- みにくいアヒルの子の定理：（客観的に）みにくいアヒルなんていないんだよ。鳥類だもの。み〇を
- 次元の呪い：2次元じゃダメなんですか？（次元仕分け）　レ〇ホー

まあ、冗談はほどほどにしておいて。
バーニーおじさんに関しては、どこを探してもソースが見つからないのです。
もしかしたら、ナントカタスクゼイアンの陰謀なのかもしれません。

# 日本語の記事を探してみた

>しょうもない質問なのですが、
>「機械学習において学習に必要なデータ数は説明変数の数の10倍」
>というバーニーおじさんのルールですが、
>そもそもこのバーニーおじさんとはどなたなのでしょうか？気になります。
>
>私はバーニーおじさんは初耳でしたが、気になりますね。
>ネットで調べてみても、ほとんど情報は出てこないようです。綴のあたりを付けて英語で検索したりもしましたけど、ヒットなし。

https://teratail.com/questions/158246


>マジで誰？？？？？？検索してもG検定の関連情報しか出てこない。
「機械学習には、モデルのパラメータ数の10倍の学習データが必要」とのことだが、これ以上わからない。
英語でも調べてみたけどさらにわからない。
バーニーおじさんの消息をご存知の方、教えてください。

https://qiita.com/flat-8-kiki/items/a7f99c7a53db37a5f5a5

どうやら、みなさんもバーニーおじさんって誰？ってことで気になってるようです。しかし、日本語の記事で「バーニーおじさん」に辿り着いている人は現時点ではいませんでした。

# 英語の記事を調べてみた

>Yaser Abu-Mostafa, he explains the relationship between dimension of a dataset and it's size required for any learning model to work.
>
>As a general rule of thumb, size of dataset should be at-least about 10x it's dimension and should be independent of the model used.
>
>Yaser Abu-Mostafaはデータセットの次元とサイズの関係について説明しています。「経験則では、データセットの大きさは、少なくともその次元の10倍必要で、それぞれは独立していなければなりません」（適当訳）

https://datascience.stackexchange.com/questions/14875/data-set-size-versus-data-dimension-is-there-a-rule-of-thumb
なんか近いですね。ただ、少し違うような。。。

>So how much data is needed? Professor Yaser Abu-Mostafa from Caltech answered this question in his online course. The answer is, as a rule of thumb, you need roughly 10 times as many examples as there are degrees of freedom in your model. 
>
>では、どれくらいデータが必要なのでしょうか？Yaser Abu-Mostafaはオンライン講座でこの質問に対して、「経験則では、モデルのパラメータの約10倍のデータが必要」と答えています。

https://www.forbes.com/sites/forbestechcouncil/2018/11/19/do-you-have-enough-data-for-machine-learning/#d6aeaf552e2d
**これだ！**

失礼、カリフォルニア工科大学の教授であり、機械学習の研究や教育に関する活動で有名な方をコレ呼ばわりして申し訳ございません。

おそらく、Yaser Abu-Mostafa教授がバーニーおじさんの正体ではないでしょうか？

# 調べるのをやめた

しかし、Yaser Abu-Mostafa教授とバーニーおじさんを結びつけるソースは何もでてこないのです。僕の調査（「Yaser Abu-Mostafa burny」で検索）をあざわらうように、確固たるソースが出てこないのです。もしかしたら、ナントカタスクゼイアンの陰謀なのかもしれません（2回目）。

そして、調べていくと教授は何冊か機械学習に関する書籍をだしているみたいです。特に、有名なのが、

https://www.amazon.com/gp/product/1600490069

微妙に高いし、英語だし、記載されているかわからないし、

**ギブアップ！！！**

恐らくは、この本にソースが記載されているのでしょう。

# まとめ

バーニーおじさんのルールは「機械学習において学習に必要なデータ数は説明変数（パラメータ）の数の10倍」ということが重要であって、「バーニーおじさんって誰や？」なんてことは重要ではないのです。ですが、気になったら調べたくなる気持ち、わかります。たまたま自分にとって、それがG検定の1時間前であっただけで調べてしまいました。

その中で、Yaser Abu-Mostafa教授という黒幕の存在が明らかになりました。

しかし、バーニーおじさんイコール教授なのか、教授の知り合いにバーニーおじさんがいたのか、謎は深まるばかりです。

もしかしたら、ナントカタスクゼイアンの陰謀なのかもしれません（3回目）。

>信じるか信じないかは、あなた次第！
地図にプロットしたい.1

中年無能SEのイヤイヤお仕事勉強メモです。
基本的に自分でイチからコード書くこと、英語サイトを調べること極力避けて通ります。

# 目的
- 地図上に緯度経度情報をプロットしたい。

# 参照URL
経緯度データを地図にプロット
https://ikatakos.com/pot/programming/python/packages/basemap

LearnOSM はじめてからのOpenStreetMapガイド
https://learnosm.org/ja/

OpenStreetMapで独自レンダリングをしよう
https://qiita.com/nyampire/items/13ed805ac3ccaff3baf9

# とりあえずコピペ
ひとまず最もシンプルなコードで地図ダウンロード可否を確認。

youkidearitai/kasukabe-to-shin-koshigaya.py
https://gist.github.com/youkidearitai/c991ee95b53cdb544d344e2793f732b7

```
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-5-f8b15dc7b1db> in <module>()
----> 1 img = get_osm_img(35.99, 139.79, 36.0, 139.80, scale=400, img_format='png')
      2 img.save('kasukabe-to-shin-koshigaya.png')

<ipython-input-3-6b19f4946fa9> in get_osm_img(minlat, minlon, maxlat, maxlon, scale, img_format)
     26     }
     27     response = requests.post(url, payload)
---> 28     return Image.open(BytesIO(response.content))

/anaconda/lib/python3.6/site-packages/PIL/Image.py in open(fp, mode)
   2450         fp.close()
   2451     raise IOError("cannot identify image file %r"
-> 2452                   % (filename if filename else fp))
   2453 
   2454 #

OSError: cannot identify image file <_io.BytesIO object at 0x115144938>
```
たぶん地図ダウンロードできていない。
ダウンロードできないと言っているひとはいくつかいるが解決法が見つからない。

# ダウンロードURLの宛先変更を検討。
`url = 'http://www.openstreetmap.org/export/finish'`

面倒なんでいったん凍結

# こっちをコピペ

Pythonによるデータ可視化ライブラリ「folium」がとても使いやすい
https://qiita.com/momota10/items/3b878f01d489a32e40c3

これでいけそう。
長くなったのでfolium活用ベースで書き直します。

# 次

https://qiita.com/peropon/items/1a94e810513972e09b54
【DB2】SQLを用いた文字列結合の基本

#はじめに
SELECT文でデータを取得する際に、取得した値を加工して出力したい場合があると思います。
例えば次のようなTABLE（テーブル名：personal_information）があるとして、

|  ID | LASTNAME | ADDRESS | AGE | 
|----|----|----|----|
|11111|鈴木|静岡|22|
|22222|加藤|愛知|23|
|33333|佐藤|山形|36|
|44444|田中|京都|26|

**①：苗字を取り出す際に「鈴木」,「加藤」ではなく、「鈴木さん」,「加藤さん」と「さん」付けで出力したい**
**②：１レコード取り出す際に、「11111,鈴木,静岡,22」のようにカンマをつけてCSVファイルっぽく出力したい**

というようなことをしたい場合、**文字列連結**を用いて実現することが一般的です。
今回はこの文字列連結の方法について以下に解説していきます。
※今回はDB2を使用します

#実現方法
##①：名前に「さん」付けしたい場合
まず①を実現する方法について解説します。
今回のように取り出すカラムに文字列を追加したい場合は**CONCAT関数**を使用します。

【CONCAT関数】
`CONCAT( 文字列1, 文字列2 )`

CONCAT関数を用いて名前をさん付けで呼び出すクエリは以下となります。

```SQL:SQL
SELECT CONCAT(LASTNAME,'さん')　AS name FROM personal_information
```

このクエリを実行すると次のような結果が表示されます。

```text:検索結果（イメージ）
name
------------
鈴木さん
加藤さん
佐藤さん
田中さん
```

これで無事、TEBLEに存在する苗字に「さん」をつけて取り出すことができます。

##②：複数のカラムをカンマで結合したい場合
次に②を実現する方法について説明します。
①と同様に文字列連結を用いれば実現できるのですが、CONCAT関数は**3つ以上の文字列を連結することができません。**（MySQLだと3つ以上の文字列連結が可能です）
一応、CONCAT関数を入れ子にする形で記載すれば実行可能ですが、
CONCAT関数以外で複数の文字列を連結をする場合には**||演算子**を使用します。

【||演算子】
`文字列式1 || 文字列式2`

```SQL:SQL
SELECT ID ||,|| LASTNAME ||,|| ADDRESS ||,|| AGE FROM personal_information WHERE ID = 11111
```
このクエリを実行すると次のような結果が表示されます。

```text:検索結果（イメージ）
1
------------
11111,鈴木,静岡,22

```

上記の結果のように、カラムが１つにまとまり、カンマが結合した状態で出力されると思います。
カラム名が１となっていますが、変更したい場合は連結したカラムの最後にAS句をつけましょう。

#注意点
文字列結合を行うと稀に値が全く取り出せない場合があります、、、
値が取り出せない場合は[こちらの記事](https://qiita.com/ebichan_88/items/e5a7907d6a174de387bc)も参考にしてください。

#参考記事
[イチからはじめる - SQLリファレンス](http://www.i2kt.com/dbms/sqlref/index.html)
【DB2】SQLで文字列連結をしたら何も表示されなくなった！？って時の備忘録

##はじめに
SQLの文字列結合は便利ですが、値うまくを取り出せない場合もあります。

今回は以下のテーブル（personal_information）から、それぞれのレコードをCSVファイルのような形で出力する場合を例にして、値が取れないケースを紹介します。

※そもそも文字列結合って何って方は[こちらの記事](https://qiita.com/ebichan_88/items/748e709cb874de2d0759)をご覧ください

|  USERID | LASTNAME | LASTNAME_KANA | ADDRESS | AGE | 
|----|----|----|----|----|
|11111|鈴木|スズキ|静岡|22|
|22222|加藤|カトウ|愛知||
|33333|佐藤||山形|36|
|44444|田中|タナカ||26|


##テーブルからそれぞれのレコードをCSVファイルのような形で出力

```SQL:実行するSQL
SELECT 
USERID ||,|| LASTNAME ||,|| LASTNAME_KANA ||,|| ADDRESS ||,|| AGE AS information 
FROM 
personal_information
```

```text:期待する検索結果
information 
------------
11111,鈴木,スズキ,静岡,22
22222,加藤,カトウ,愛知,
33333,佐藤,,山形,36
44444,田中,タナカ,,26
```

上記のテーブルは、１行目のレコード以外、データに一部抜けがありますが、その部分を空白にして値を取り出すことを想定しています。
ところが・・・


```text:実際の検索結果（１行目のレコードしか表示されない）
information 
------------
11111,鈴木,スズキ,静岡,22
```

このままSQLを実行しても、１行目のレコードしか表示されません。

##原因
今回使用したテーブルに問題がありました。

|  USERID | LASTNAME | LASTNAME_KANA | ADDRESS | AGE | 
|----|----|----|----|----|
|11111|鈴木|スズキ|静岡|22|
|22222|加藤|カトウ|愛知|**NULL**|
|33333|佐藤|**NULL**|山形|36|
|44444|田中|タナカ|**NULL**|26|

結合対象のカラムにNULLが存在すると、**結合した文字列ごとNULL扱い**となってしまいます。
そのため今回は１行目のレコードしか表示されませんでした。

```text:イメージ
information 
------------
11111,鈴木,スズキ,静岡,22
//2行目は「AGE」がNULLだから表示されない
//３行目は「LASTNAME_KANA」がNULLだから表示されない
//４行目は「ADDRESS」がNULLだから表示されない
```

##解決策
**NULLを空文字に変換しましょう。**
DB2の場合は**COALESCE関数**を使用すれば空文字に変換できます。

```SQL:NULLを空文字に変換
SELECT 
USERID 
||,|| 
LASTNAME 
||,|| 
COALESCE(LASTNAME_KANA, '') 
||,|| 
COALESCE(ADDRESS, '') 
||,|| 
COALESCE(AGE, '') 
AS information 
FROM 
personal_information
```

これで連結した文字列がNULLにならずに値を取り出せます。
Neo4j configurations on Docker

みなさんはneo4jをどの環境で使ってますか？
私はdockerでよく使ってます。docker上でneo4jを動かす際の備忘録を兼ねて。
間違いなどありましたら指摘していただけると幸いです。
※ dockerの使い方の説明などは省略しています。


Neo4jリポジトリ

* [DockerHub] (https://hub.docker.com/_/neo4j/)
* [GitHub] (https://github.com/neo4j/docker-neo4j-publish)

# まずは実行してブラウザでアクセスする
```
docker run -d -p 7474:7474 -p 7687:7687 neo4j:latest
```
ブラウザから以下にアクセスすれば起動していることが確認できます。
`http://<Docker Host>:7474`

# 設定を変更して起動する
docker imageの`docker-entrypoint.sh`を見るとわかる通り、neo4j.confの設定キーに`NEO4J_`というPrefixをつけ、`.`を`_`、`_`を`__`として環境変数に渡すことで、neo4j.confに設定値を追加していることが確認できます。

```
dbms.security.auth_enabled
↓
NEO4J_dbms_security_auth__enabled
```

以下で少し詳しく確認します。

* authを無効にして起動する

```
docker run -d -p 7474:7474 -p 7687:7687 \
       -e NEO4J_AUTH=none \
       neo4j:latest
```
`NEO4J_AUTH=none`を指定することで、dbms.security.auth_enabled=falseが指定されます。

* 初期パスワードを設定して起動する

```
docker run -d -p 7474:7474 -p 7687:7687 \
       -e NEO4J_AUTH=neo4j/secret
       neo4j:latest
```
`NEO４J_AUTH=neo4j/<password>`を指定することで、`neo4j-admin set-initial-password <password>`が実行されます。
※ パスワードにneo4jを指定するとエラーになります。

* メモリの設定を変更する

```
docker run -d -p 7474:7474 -p 7687:7687 \
       -e NEO4J_dbms_memory_heap_initial__size=512M
       -e NEO4J_dbms_memory_heap_max__size=512M
       -e NEO4J_dbms_memory_pagecache_size=512M
       neo4j:latest
```
メモリの設定については[こちら] (https://qiita.com/stmtok/items/a21187f1cec27610d482)を参照

* エンタープライズ版を起動する

```
docker run -d -p 7474:7474 -p 7687:7687 \
       -e NEO4J_ACCEPT_LICENSE_AGREEMENT=yes
       neo4j:enterprise
```
エンタープライズ版を起動するためにはライセンスの同意が必要となります。 https://neo4j.com/licensing/

# ディレクトリについて
外部ストレージをマウントした際に特殊な動きをするディレクトリがあります。

#### /data
データベースのデータおよび認証情報等が保存される永続ディレクトリ。
neo4jのdocker imageのデフォルトのデータディレクトリは`/var/lib/neo4j/data`ですが、`/var/lib/neo4j/data`は`/data`のシンボリックリンクです。

#### /conf
このディレクトリに存在するファイルがコンテナ内の`/var/lib/neo4j/conf`ディレクトリにコピーされます。
このディレクトリにneo4j.confを配置すると`/var/lib/neo4j/conf/neo4j.conf`が上書きされます。
環境変数で指定した設定値の反映はファイルのコピー後に実行されるため、環境変数で指定した値が優先されます。

#### /ssl
マウントされているとdbms.directories.certificatesが/sslに設定されます。
(環境変数でNEO4J_dbms_directories_certificatesを指定しても、/sslが優先されます。)

#### /plugins
マウントされているとdbms.directories.pluginsが/pluginsに設定されます。
(環境変数でNEO4J_dbms_directories_pluginsを指定しても、/pluginsが優先されます。)
[APOC Procedures] (https://github.com/neo4j-contrib/neo4j-apoc-procedures) などのjarファイルはここに配置します。

#### /logs
マウントされているとdbms.directories.logsが/logsに設定されます。
(環境変数でNEO4J_dbms_directories_logsを指定しても、/logsが優先されます。)

#### /import
マウントされているとdbms.directories.importが/importに設定されます。
(環境変数でNEO4J_dbms_directories_importを指定しても、/importが優先されます。)

# EXTENSION SCRIPT
```
docker run -d -p 7474:7474 -p 7687:7687 \
       -e EXTENSION_SCRIPT=<script_path>
       neo4j:latest
```
上記のように`EXTENSION_SCRIPT`にスクリプトを指定すると全ての設定を反映後、neo4jサーバ起動直前にスクリプトを起動することができます。

# まとめ
環境変数で設定を細かく制御できて便利！
koaでexcelファイルを扱うAPIを作る

フロントから渡ってきたexcelファイルをAPI側でゴニョゴニョするようなものを作る必要があったのですが、妙に詰まったので備忘録として残します。

追記
そもそもexcelのバイナリをAPIに投げる必要はなく、フロント側でxlsxを使ってexcelデータをゴニョゴニョした方がシンプルでした。

## 環境
front側　react/redux
server側　koa

## コード
excelを選択するとhandleExcelFileが発火

```jsx
                    <input
                      name="file"
                      type="file"
                      placeholder="excel選択"
                      onChange={this.handleExcelFile}
                    />
```


handleExcelFileではexcelファイルをバイナリにしてAPIに投げる


```js
  handleExcelFile = e => {
    const htmlInputElement = e.target;
    const excelFile = htmlInputElement.files[0];
    const reader = new FileReader();

    reader.readAsBinaryString(excelFile);

    reader.onload = e => {
      binaryExcelFile = e.target.result;

      axios({
        method: 'post',
        url: 'apiのパス',
        data: {
         binaryExcelFile
        }
      });
    };
```


xlsxを使ってexcelのデータを取得

```js
const xlsx = require('xlsx');

module.exports = async (ctx, next) => {
  const { binaryExcelFile } = ctx.request.body;

  const excelData = xlsx.read(binaryExcelFile, { type: 'binary' });

  // あとはexcelのデータを好きにいじる
};

```


## 詰まったところ

ネットでexcelファイルをapiに投げる例を検索すると、フロント側ではexcelをフォームのデータとして送信して

```js

let formData = new FormData();
formData.append('file', excelFile, excelFile.name);
// このformDataをbodyで渡す
```
サーバー側ではkoa-multerを使って、送られてきたexcelを一時保存してから、その保存パスを指定する形でxlsxで読み込む、みたいなものばかりが引っかかってきました。が、なかなかうまく行きませんでした。

また、API側でctx.request.bodyの中身が空っぽというのにもぶち当たりました。原因としてはサーバー側でのbodyのパースにkoa-better-bodyというものを使っていたせいでした。素直にkoa-bodyparserを使っていればよかった、、

excelファイルをサーバー側にアップロードするような要件の場合にkoa-multerを使うのはいいと思いますが、今回のようなexcelの値だけに用がある場合はこれで十分な気がします。
[mac] bundle installでmysql2のインストールが失敗する


# 問題

bundle install時にMysql2の箇所でエラーが発生した。

``` /vendor/bundle/ruby/2.5.0/extensions/x86_64-darwin-17/2.5.0-static/mysql2-0.5.2/gem_make.out
checking for my_bool in mysql.h... yes
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /usr/local/opt/mysql@5.7/lib
-----
creating Makefile

current directory: /path/vendor/bundle/ruby/2.5.0/gems/mysql2-0.5.2/ext/mysql2
make "DESTDIR=" clean

current directory: /path/vendor/bundle/ruby/2.5.0/gems/mysql2-0.5.2/ext/mysql2
make "DESTDIR="
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2
```

# 解決策

xcodeをアップデートして、再実行で解決しました。

```
$ xcode-select --install
$ bundle install --path vendor/bundle
```
PDFファイルを印刷する

プリントキューには入ったけど、なんか他のプリンタに印刷できないファイルがあったので、
プリントキューのファイルをPDF変換する方法を残しておく。

Windowsでは、印刷操作を行ったときに下記フォルダにスプールファイルを生成する。
C:\Windows\System32\spool\PRINTERS

このフォルダに有る.splのファイルを変換してあげればよいので、下記から落とせるspool12をcmdから実行する。
https://www.compuphase.com/software_spool.htm

同じフォルダに.splファイルを置いて、Microsoft Print to PDF　にでも送ればPDFに変換できる。

ただしこの方法だと画像ファイルのPDFになってしまうので、検索とかはできないが、
Acrobat Proなら表示→ツール→スキャン補正→テキスト認識　で検索可能な状態に変換可能。
LINE Things を触ってみた(M5Stack利用)

# 今回の目的
LINE Thingsの概要を抑えるために、[既出の情報「LINE さんのブログ：LINE の IoT プラットフォーム LINE Things の Developer Trial を試してみる」](https://engineering.linecorp.com/ja/blog/line-things-developer-trial/)に沿って動作を確認した際、詰まったポイントを整理。
せっかくなので利用している人が多そう？な [M5STACK(黒い方)](https://www.switch-science.com/catalog/3647/) を利用。

## 本記事の想定読者
- Arduino互換ボードでの開発を行った経験のある方
- LINE Botの開発を行った経験のある方（LIFF利用経験があると尚可）

という、かなり限定された方が対象。
## 本記事の前提
- Windowsマシンで作業を実施（一部、Windows前提での記載あり）。

 
# 詰まったポイント
## デバイス側開発環境の設定
M5STACKに同梱されていた紙に書かれている手順が古いらしく、下記対応を行う必要があった（2018/11/24時点）。
- [ドライバー](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers)のインストール
- Arduino core for the ESP32 のインストール
- M5Stack ライブラリのインストール
  
後者２つに関しては下記ページを参考とさせていただいた。
[M5Stack ライブラリインストール方法 ( Arduino IDE 用)](https://www.mgo-tec.com/m5stack-library-install)      

## 新規チャンネル (Bot) と LIFF アプリの作成 用 APIの実行
- 手順内でCurlを利用する部分があるが、PowerShellのCurl はCurlではない（Invoke-WebRequestのエイリアス）ため、何かしらの対策（例：別ツールを使う）が必要。
- 「LIFF 作成 API」実行時に渡す、パラメータの例は｛｝に挟まれているが、実際は必要ない（アクセストークンだけは入れても動く？）。 
  
## 端末の再認識（UUIDを別のIDに変更した場合）
一度、登録したマイデバイスを削除しないと認識されない（？）。
LINEアプリのLINE Things設定画面にて、該当のマイデバイスを長押しするとメニューが出てきて削除できる。
正直、ここが一番ハマった箇所だった。。。

# 所感
- 上記以外はサクサク進めることができた。
- LIFFも含めて使いどころが難しいが、ハマれば面白いモノが作れそう。
- 以前作成した[モノ](https://qiita.com/KasaharaJumpei/items/60b73aeea2d7f5d7facd)との親和性が高そう。
- 初めてM5を使ったが…Lチカ革命や。。。
<img width="478" alt="M5.png" src="https://qiita-image-store.s3.amazonaws.com/0/157737/76c191ac-6381-0281-aece-e98c26d7886e.png">
【初心者向け】MacOS + Elixir + Phoenixで「Welcome to Phoenix!」

# 【はじめに】
- Elixirの環境構築の記事は沢山あるけど、エラーがでたりしてすんなり起動できなかったので防備メモとして残したものです。

# 【前提条件】
## ◉ Xcodeをインストールして、以下のコマンドを実施しておくこと。
```
$ xcode-select --install
```
※ 実行して、以下のメッセージが出た場合はインストール済みなので次へ進んでください。

```
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
```
## ◉ Homebrewのコマンドが使えること。
- 以下のコマンドでHomebrew環境に問題ないか確認しておいてください。

```
$ brew doctor
```

## ◉ Node.jsがインストールされていること。
```
$ node --version

v9.11.2
```
※ もしインストールされていない場合は、Node.jsのバージョン管理が簡単に行えるnodebrewをインストールして、Node.jsをインストールしてみてください。


# 【実行環境】
- MacOS Mojave 10.14.1 
- Node.js v9.11.2
- PostgreSQL v10.5
- Elixir v1.7.4
- Phoenix v1.3.4

# 【いざ導入！！！！】
## ① PostgreSQLのインストール
### (01) PostgreSQLのインストール
```
$ brew install postgresql
```
### (02) PostgreSQLの起動
```
$ pg_ctl -D /usr/local/var/postgres -l /usr/local/var/log/postgres start
```
### (03) PostgreSQLのユーザ「postgres」を作成。パスワードも「postgres」にします。
```
$ createuser -P -d postgres

Enter password for new role:
Enter it again:
```

## ② Elixirのインストール
### (01) Elixirのインストール
```
$ brew install elixir
```
### (02) パッケージ管理ツールHexのインストール
```
$ mix local.hex
```

## ③ Phoenixのインストール
### (01) Phoenixのインストール
```
$ mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez
```

### (02) Phoenixのプロジェクト作成
カレントディレクトリにelixir-stuff/hello_phoenixのディレクトリが作成されます。

```
$ mix phoenix.new elixir-stuff/hello_phoenix 
```
以下の質問はYを選択。

```
Fetch and install dependencies? [Yn]
```

### (03) 作成したプロジェクトのディレクトリへ移動する。
```
$ cd elixir-stuff/hello_phoenix
```
### (04) 依存しているライブラリを取得
```
$ mix deps.get
```
※ 以下のメッセージはとりあえず気にしなくて良さそう！

```
warning: found quoted keyword "test" but the quotes are not required. Note that keywords are always atoms, even when quoted, and quotes should only be used to introduce keywords with foreign characters in them
```

### (05) データベースの作成とmigrateを実行します
```
$ mix ecto.create && mix ecto.migrate
```

### (06) Node.jsの依存パッケージをインストールします
```
$ sudo npm install
```

### (07) サーバーの起動
```
$ mix phoenix.server
```
※ 以下のメッセージが表示されたら、mix.exsファイルに「{:plug_cowboy, "~> 1.0"}」を追加し、mix deps.getを実施する。

```
# メッセージ
warning: please add the following dependency to your mix.exs:
```
![mix.exsへ追加.png](https://qiita-image-store.s3.amazonaws.com/0/252086/fd092bdf-daec-296e-5d43-b9cdd335d5b6.png)

```
# ファイルへ記述後以下のコマンド実行
$ mix deps.get
```
### (08) サーバーの起動確認
(07)が正しく実行された後、以下のメッセージが表示されて、「[http://localhost:4000](http://localhost:4000)」へアクセスして、以下のようなWelcome to Phoenix!が表示されたら成功です。

```
[info] Running HelloPhoenix.Endpoint with Cowboy using http://0.0.0.0:4000
18:33:02 - info: compiled 6 files into 2 files, copied 3 in 3.9 sec
```
![スクリーンショット 2018-11-24 18.33.49.png](https://qiita-image-store.s3.amazonaws.com/0/252086/a456045d-f87f-7793-d2e2-de3b85df25b0.png)


# 参考
- [【公式】phoenix：Installation](https://hexdocs.pm/phoenix/installation.html#content)
- [Mac OS XでElixir, Phoenixを使ってHello Phoenixを動かすまで](https://qiita.com/isaoshimizu/items/9e47a82da9c465fc144a)
サーマルプリンタで印刷する: Webアプリ編

## 0. 前回までのあらすじ

1. サーマルプリンタをLinuxから印刷できるように[セットアップ](https://qiita.com/yuyakato/items/7d4db1c567d952a7ac91)しました。
2. Raspberry Piから文字、画像を[テスト印刷](https://qiita.com/yuyakato/items/3309b0ede886c2698526)しました。
3. 画像を印刷するための[印刷サービス](https://qiita.com/yuyakato/items/24666dff3ea1a6a86672)を構築しました。
4. HTMLを画像に変換するために[レンダリングサービス](https://qiita.com/yuyakato/items/750364647bbb189016bb)を構築しました。

これまでの記事については『[目次](https://qiita.com/yuyakato/items/288962fbc39446644668)』をご覧ください。

## 1. Webアプリをセットアップする

[印刷サービス](https://qiita.com/yuyakato/items/24666dff3ea1a6a86672)と[レンダリングサービス](https://qiita.com/yuyakato/items/750364647bbb189016bb)によって、HTMLをサーマルプリンタで印刷できるようになりました。
続いて、2つのWebサービスを呼び出す、簡単なWebアプリを実装しました。
ソースコードは https://github.com/nayutaya/thermal-printer/tree/master/tool/html_print を参照してください。

```text
# thermal-printerリポジトリをclone済みの場合は、以下の3行は不要です。
pi@raspi-3bp$ mkdir -p ~/repo/github.com/nayutaya
pi@raspi-3bp$ cd ~/repo/github.com/nayutaya/
pi@raspi-3bp$ git clone https://github.com/nayutaya/thermal-printer.git

pi@raspi-3bp$ cd ~/repo/github.com/nayutaya/thermal-printer/
pi@raspi-3bp$ git pull
pi@raspi-3bp$ git checkout tool-html-print-v1.0.0
pi@raspi-3bp$ git branch -v
* (HEAD detached at tool-html-print-v1.0.0) f44670c Merge pull request #13 from nayutaya/update_html_print_tool
  master f44670c Merge pull request #13 from nayutaya/update_html_print_tool

pi@raspi-3bp$ cd ~/repo/github.com/nayutaya/thermal-printer/tool/html_print/
pi@raspi-3bp$ ./build_image.sh
pi@raspi-3bp$ ./run_service.sh
pi@raspi-3bp$ docker ps
CONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS              PORTS                    NAMES
299bdfe54be2        thermal-printer/tool/html_print     "serve --single --li…"   16 seconds ago      Up 13 seconds       0.0.0.0:3032->8080/tcp   thermal-printer_tool_html_print
3fac97d75973        thermal-printer/service/rendering   "/bin/bash --login -…"   3 hours ago         Up 3 hours          0.0.0.0:3031->8080/tcp   thermal-printer_service_rendering
3798bbbc7239        thermal-printer/service/printing    "uwsgi --module=app …"   2 weeks ago         Up 2 weeks          0.0.0.0:3030->8080/tcp   thermal-printer_service_printing
```

## 2. Webアプリで印刷する。

Webアプリは`3032/tcp`で待機しています。Webブラウザで http://raspi-3bp.local:3032/ （ホスト名が`raspi-3bp`でmDNSが有効な場合）にアクセスすることで、Webアプリにアクセスすることができます。

<img width="1120" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/58479/ec2f987e-02ed-3056-d723-6d8fa17af49f.png">

「HTML」のテキストエリアを変更し、「Preview」ボタンを押下することで、HTMLのレンダリング結果が表示されます。
続いて「Print」ボタンを押下することで、サーマルプリンタから印刷されます。

印刷例は以下の通りです。

![photo.jpg](https://qiita-image-store.s3.amazonaws.com/0/58479/3133b75f-6a3d-a08a-b22f-c73cfea04b73.jpeg)
グラスをスマートにする技術～その１：OSC通信～

###概要：
　家庭の食卓を賑やかに盛り上げたい。そんなことを思ったことはありませんか？
　私が所属するaNo研は、会話するグラス「スマートグラス e幹事」を発表しました。
　この記事は、「スマートグラス e幹事」に使われている技術を紹介します。

・実施例
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">みなさんこんにちは！<br>今日は特に暑い一日でしたが皆さんはいかがお過ごしでしたか？<a href="https://twitter.com/hashtag/MFTokyo2018?src=hash&amp;ref_src=twsrc%5Etfw">#MFTokyo2018</a> まであと2日！aNo研ブースでは代表作である茶道ロボを紹介してくれるコップたちも参戦予定！<br>皆様のご来場お待ちしております！<br>出店場所<br>Food Makerブース「D-02-02」 <a href="https://t.co/ea2E24APDS">pic.twitter.com/ea2E24APDS</a></p>&mdash; aNo研 (@anoken2017) <a href="https://twitter.com/anoken2017/status/1024964523952750592?ref_src=twsrc%5Etfw">2018年8月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


###システム構成

![181125_ekanji.png](https://qiita-image-store.s3.amazonaws.com/0/73020/81a1a241-5e0f-7f95-d13b-472cfe0504ea.png)

スマートグラス e幹事は、OSC通信(OpenSound Control)というインターフェイスを使って、RasberryPIと相互に通信しています。OSC通信はもともと、音楽データ通信に使われていましたが、その通信の柔軟さなどからさまざまなケースに利用されるようになってきています。M5stackでもArduinoのライブラリを使うことで、OSC通信を使うことができます。



###RasberryPIでOSC通信準備

　RasberryPIでOSC通信するために、今回は、[aike氏](https://aike.hatenablog.com/entries/2016/01/14)が作成された、oscer を利用させてもらいました。

　まず、goの開発環境をインストールします。

```
 # sudo apt-get install golang-go
```

 goのversionを確認して、インストールができているか、確認します。

```
 $ go version
 go version go1.6.2 linux/amd64
```

　oscerをコンパイルします。

```
 $ git clone https://github.com/aike/oscer.git
 $ cd oscer/src
 $ make
```

　コンソールを二つ立ち上げ、RasberryPIの中で通信できているか、確認してみましょう。

####送信側

```
　$ ./oscer localhost 10000 /hello
```

####受信側

```
　$ ./oscer receive 10000
  ./hello
```




###M5StackでOSC通信準備

M5StackでOSC通信をするために、[hideakitai氏](https://github.com/hideakitai/ArduinoOSC)が作成された、ArduinoOSCを利用します。
Arduinoのライブラリマネージャーから、ArduinoOSCを選択し、インストールします。

![181125_ekanji_2.png](https://qiita-image-store.s3.amazonaws.com/0/73020/9542a10c-3a38-d0eb-044d-c30fa1e54ec1.png)

###実装例
以下に、RasberryPIから、M5Stackへ、メッセージを送るサンプルを示します。
OSC通信によって、任意の端末へ、メッセージを簡単に送ることが可能になります。

####RasberryPIでのOSC通信

```
　$ ./oscer m5stack_hostname 10000 /msg hogehoge
```


####M5StackでのOSC通信

```

#include <M5Stack.h>
#include <ArduinoOSC.h>

WiFiUDP udp;
ArduinoOSCWiFi osc;
const char* ssid = "yourwifi";
const char* password = "wifi_password";
const int recv_port = 10000;

void messageCb(OSCMessage& m) {
  String str = m.getArgAsString(0);
  int len = str.length(); 
  Serial.println(str);
}

void setup() {
  Serial.begin(115200);
  Serial.print("Connecting to " + String(ssid));

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.print("Connected! IP address: ");
  Serial.print(WiFi.localIP());
  osc.begin(udp, recv_port);
  osc.addCallback("/msg", &messageCb);

}

void loop() {
  osc.parse();
  delay(1000);
}

```


-----------
aNo研：https://anoken.jimdo.com/
【ruby on rails】Facebookでログインする方法【Deviseなし】

##0.前書き
Qiita初投稿です。
railsでfacebookログインを実装したため、備忘録として。

##1.前提
・Facebook for Developers側の準備が完了している
・Deviceは使用しない
・Userモデルを作成している


##2.gemをインストール
まずは以下をGemfileに追加し、bundle installを実行。

```ruby:Gemfile
gem 'omniauth'
gem 'omniauth-facebook'
```

```
$bundle install
```

##3.ルーティングを追加
続いて、ルーティングを2つ設定します。
1つ目は、ログインに成功した際のURL、
2つ目は、ログインに失敗した際のURLです。

```ruby:route.rb
get '/auth/:provider/callback',    to: 'users#facebook_login',      as: :auth_callback
get '/auth/failure',               to: 'users#auth_failure',        as: :auth_failure
```

##4.Userモデルにカラムを追加
いくつか追加でカラムが必要になるようなので、マイグレーションファイルを作成します。

```
$rails generate migration AddColumnsToUser
```

作成したマイグレーションファイルを編集します。

```ruby:マイグレーションファイル.rb
class AddColumnToUser < ActiveRecord::Migration[5.1]
  def change
    add_column :users, :uid, :string
    add_column :users, :oauth_token, :string
    add_column :users, :oauth_expires_at, :string
  end
end
```

忘れずにマイグレーションを行います。

```
$rails db:migrate
```

##5.モデルにメソッドを作成


from_ominiauthという名前でメソッドを定義します。
auth.info.〇〇でfacebookから情報を取得できるので、活用していきます。

大まかな処理の流れは次の通り。
①on: :facebook_loginでパスワードのバリデーションを無視する
②auth.info.emailでfacebookに登録されているemail情報を取得し、Userテーブルから一致するユーザーを探す。
③auth.info.uid、auth.info.name、auth.info.emailなどで情報を取得し、ユーザー情報として使用する。

```ruby:User.rb
validates :password, presence: true, length: {minimum: 8}, on: :facebook_login


def self.from_omniauth(auth)
  user = User.where('email = ?', auth.info.email).first
  if user.blank?
     user = User.new
  end
  user.uid   = auth.uid
  user.username  = auth.info.name
  user.email = auth.info.email
  user.oauth_token = auth.credentials.token
  user.oauth_expires_at = Time.at(auth.credentials.expires_at)
  user
end
```

##6.コントローラーを作成
先ほど作成したメソッドをUsersコントローラーで使用します。
log_inメソッドは別で作成してください。

```ruby:users_controller.rb
def facebook_login
  @user = User.from_omniauth(request.env["omniauth.auth"])
    result = @user.save(context: :facebook_login)
    if result
      log_in @user
      redirect_to @user
    else
      redirect_to auth_failure_path
    end
end

#認証に失敗した際の処理
def auth_failure 
  @user = User.new
  render '任意のアクション'
end
```

##7.ビューを作成
/auth/facebookを叩くと、Facebookでログインできます。

```ruby:login.html.rb
<%= link_to "Facebookでログイン", "/auth/facebook" %>
```

##8.あとがき

いかがでしたでしょうか。
一応これで実装できましたが、なんだか不要なことをしているようにも思います。
もっと精進したい。
Raspberry PI カメラモジュールの画像取得VideoCaptureを使うと遅くなる

#やったこと
ラズパイのカメラモジュールの画像取得にVideoCaptureを使うと非常に遅くなったので、RaspiCamを使うようにした。

#RaspiCamを使う
ラズパイのカメラモジュール画像を取得するのに、ググるとよく出てくるのはVideoCaptureを使う方法。
だが、ループ内に重い処理があると、キャプチャーがなぜか非常に遅くなってしまい（5秒ぐらい）とても使えなかった。

代わりにRaspiCamを使うと、全く遅くならずに使えた。使い方もほとんど同じ。
https://github.com/cedricve/raspicam

```
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <raspicam/raspicam_cv.h>

using namespace cv;

int main(int argc, char* argv[])
{
  raspicam::RaspiCam_Cv camera;
  camera.set( CV_CAP_PROP_FORMAT, CV_8UC3 );
  camera.set( CV_CAP_PROP_FRAME_WIDTH, 640 );
  camera.set( CV_CAP_PROP_FRAME_HEIGHT, 480 );
 
  Mat mat;
  if (!camera.open())
  {
    printf("camera open error\n");
    return -1;
  }

  while(1){
    camera.grab();
    camera.retrieve(mat);

    //重い処理

    namedWindow("prediction", CV_WINDOW_AUTOSIZE);
    imshow("prediction", mat);
    if (waitKey(1) >= 0) break; 
  }
  return 0;
}	
```

以下のようにビルド。

```
g++ -g -std=c++11 -O0 -Wall  -o test test.cpp  `pkg-config --cflags --libs opencv` -lraspicam_cv
```
macOS Docker導入メモ

# 目的・同期
macOS上でRaspberry piのビルド環境を整えたいが、macOSの環境を汚さずにクロスビルド環境を構築したい。そのために仮想環境を使用しようと思う。  
仮想環境にはVM wareやParallelsがあるけど、今回はDockerを使って環境構築すればクリーンインストールとかした時に簡単に環境を再現できそう。というわけでDockerの簡単な導入とインストールをメモしてみる。  

まずはビルド環境構築と共有フォルダの設定までやる
x windowを表示するなどは必要があれば実施する
＊今の所必要はない

# Dockerのインストール
Docker for Macを以下のサイトから取得する
https://store.docker.com/editions/community/docker-ce-desktop-mac
からインストーラーをダウンロードして実行するれば簡単にインストールできる。

# Dockerの起動
```sh
$ docker -v
Docker version 18.09.0, build 4d60db4
```
と出てこればインストール成功
## ubuntuの起動
```sh
$ docker run -it ubuntu bash
```
で起動可能。
## macのフォルダと共有
メニューバーのdockerアイコンを右クリックして
preference - File sharing
から共有したいフォルダを登録して以下のコマンドを叩く  

```sh　　
$ docker run -v 共有元mac上の共有したいフォルダ:共有先ubuntu上フォルダパス -it ubuntu bash
```

## dockerコマンドの説明
```
docker サブコマンド イメージの指定
```
という形式で使用する。
サブコマンドにはrunやpullなどがある。詳細は``` docker --help```を参照
イメージは、オフライン上になければオンライン上のdocker hubからダウンロードする 
### docker イメージを取得する(pullコマンド）  
オンライン上にあるイメージの一覧を見てみたい場合やオフライン環境に配布したい場合などダウンロードしてきたい場合がある

```sh
docker pull　イメージ名
```
Docker hubにイメージがあるので参照
https://hub.docker.com/explore/
例えばubuntuのイメージの詳細は
https://hub.docker.com/_/ubuntu/
に記載されているので興味があれば読んでみる

例:nginxをローカルにダウンロードしてみる

```
$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a5a6f2f73cd8: Pull complete 
67da5fbcb7a0: Pull complete 
e82455fa5628: Pull complete 
Digest: sha256:31b8e90a349d1fce7621f5a5a08e4fc519b634f7d3feb09d53fac9b12aa4d991
Status: Downloaded newer image for nginx:latest

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              93fd78260bd1        4 days ago          86.2MB
nginx               latest              e81eb098537d        7 days ago          109MB
```
nginxがダンロードできた。

# ubuntuの環境構築
インストールしたubuntuは最小構成でルートしかないので環境を整える
https://hub.docker.com/_/ubuntu/

```
apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
apt update
apt list --upgradable
apt upgrade
apt install less busybox vim wget ssh make gcc aptitude build-essential git 
apt install -y mercurial python3 python2.7 python-dev libzip-dev automake libncurses5-dev gperf bison flex gawk libtool libexpat-dev expat texinfo help2man
```
こんな感じに必要なツールを入れればRaspberry Piのクロスコンパイラのビルドができる環境を構築できる
vue-router で絶対パス ( http 始まり ) を取得する

`router.resolve` が用意されているので、それを使うだけ。

- [router.resolve](https://router.vuejs.org/api/#router-resolve)

```javascript
this.$router.resolve({
  name: 'ExmaplePage',
  params: {
    id: id
  }
}).href
```

これだけだと `/example_page/1` のようになるので `location.origin` と組わせる。

```javascript
const url = this.$router.resolve({
  name: 'ExmaplePage',
  params: {
    id: id
  }
}).href
location.origin + url.location
```

これで `https://example.com/example_page/1` のようにできる。
[Python3]任意の文字列に含まれる文字を数える

# はじめに
昨日に引き続きcheckioの課題にトライ。
（普通に１時間以上かかっているので、平日はちょっと厳しそう）

# 今回書いたコード
入力した文字列から、アルファベットの数を数えて一番多い文字を返すプログラム。
（アルファベット以外は数えない。大文字小文字は区別しない）

    def checkio(text: str) -> str:
        import re
    
        ### 変数定義
        phrase = text.lower() # 大文字,小文字は区別しない
        count_lst = []
        count = []
        result = []

        ### 処理開始
        for word in phrase:
            ### アルファベット以外は除外
            if not bool(re.match("[a-z]+",word)):
                continue
            flg = 0
        
            ### 文字の数を数えながらリストに格納
            for x in range(len(count_lst)):
                try:
                    count_lst[x].index(word)
                    count_lst[x][1] += 1
                    flg = 1
                    break
                except ValueError:
                    pass
        
            ### フラグが0(リストに値が存在しない)の場合、リストに文字を追加
            if flg != 1:
                count_lst.append([word,1])
    
        ### リストから文字数だけをリストに格納
        for y in range(len(count_lst)):
            count.append(count_lst[y][1])
        max_num = max(count)
    
        ### 一番多い数だった文字をリストに格納
        for z in range(len(count_lst)):
            if count_lst[z][1] == max_num:
                result.append(count_lst[z][0])
    
        ### アルファベット順にソート
        result.sort()
        return(result[0])

# 今回学んだこと
- アルファベットの数え方に少し苦労（アルファベット分変数を作れば簡単だったかもですが、さすがにクソダサだと思って自重）
- リストの検索にはindex（毎回忘れるマン）
- リストの要素数を数える時はlen
- 二次元のリストでmax（またはmin）を使った場合、いずれも前にある要素について判定
- sortでアルファベット順に並べ替えができる（便利）
- 二次元のリストで検索をかけるならenumerate()を使っている例もあった（むしろこっちの方が本筋くさい。いつか調べる）
- 「最初の一文字を除外」は`word[1:]`でできる（今回は使わなかった）

# 構文まとめ
|メソッド|説明|構文|
|:--|:--|:--|
|index|リストに検索文字が含まれている場合、アドレスを返す(無い場合はValueError)|word.index("検索文字")|
|len|文字数を数える。リストの場合は要素数を数える|len("文字列")|
簡単に試せるNumpyでの線形計算コード➁(初級編)



「簡単に試せるNumpyでの線形計算コード➀(初級編)」
(Numpyの概要と行列の表示のさせ方と、行列の足し算に関して)
https://qiita.com/kenfukaya/items/fae288827976a8f79dc7

上記の記事の内容を踏まえ、Numpyで新たな計算をしていきます。

### 実際に線形計算をしてみた

#### ・Numpyのインポート
~~~Python
import numpy as np
~~~


#### ・形状の変更(6列→2行×3列)
入力

~~~Python
a = np.array([1,2,3,4,5,6])
b = a.reshape(2,3)

print('a =' , a)
print('b =' , b)
~~~


出力

~~~Python
a = [1 2 3 4 5 6]
b = [[1 2 3]
 [4 5 6]]
~~~

となり、a(6列)→b(2行×3列)に変更されていることを確認


#### ・形状を確認
入力

~~~Python
b = ([[1,2,3],[4,5,6]])
b.shape
~~~


出力

~~~Python
(2,3)
~~~
2行×3列の形状を確認


#### ・要素数を確認
入力

~~~Python
b = ([[1,2,3],[4,5,6]])
b.size
~~~


出力

~~~Python
6
~~~
要素数6となっていることを確認


#### ・要素ごとの算術演算
入力

~~~Python
c = np.array([[3,7,4],[2,8,5],[8,5,1]])
d = np.array([[2,7,4],[4,9,4],[9,1,5]])

print('c =', c)

print('d =' ,d)

print('c+d =', c+d) #要素ごとの足し算

print('c-d =' , c-d ) #要素ごとの引き算

print('c*d =', c*d)   #要素ごとの掛け算

print('c/d =', c/d)  #要素ごとの割り算
~~~


出力

~~~Python
c = [[3 7 4]
 [2 8 5]
 [8 5 1]]

d = [[2 7 4]
 [4 9 4]
 [9 1 5]]

c+d = [[ 5 14  8]
 [ 6 17  9]
 [17  6  6]]

c-d = [[ 1  0  0]
 [-2 -1  1]
 [-1  4 -4]]

c*d = [[ 6 49 16]
 [ 8 72 20]
 [72  5  5]]

c/d = [[1.5        1.         1.        ]
 [0.5        0.88888889 1.25      ]
 [0.88888889 5.         0.2       ]]
~~~

#### ・要素が全て0の行列を出力(ここでは3行×4列)
入力

~~~Python
x = np.zeros((3,4))
print('x = ', x)
~~~


出力

~~~Python
x =  [[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
~~~


#### ・要素が全て1の行列を出力(ここでは2行×3列)
入力

~~~Python
y = np.ones((2,3))
print('y =',y)
~~~


出力

~~~Python
y = [[1. 1. 1.]
 [1. 1. 1.]]
~~~
Machine Learning Casual Talksスライドまとめ

Machine Learning Casual Talks(MLCT)というものあることを知り、参加できなかったことを悔しく思ったので、自分用にと今までの発表スライドをまとめてみました。

## Machine Learning Casual Talks(MLCT)とは

「機械学習を用いたシステムを実運用している話を中心に、実践的な機械学習に関して気軽に話せる会」とのことです。

https://mlct.connpass.com/

## #4 2015/12/15

**yoshifumi_seki**
[Gunosy分析チームとA/Bテスト運用]
(https://speakerdeck.com/ysekky/ab-testing-in-gusnoy)

**chezou**
[MLCT事始め]
(https://www.slideshare.net/chezou/why-i-started-machine-learning-casual-talks-mlct?ref=https://mlct.connpass.com/event/22192/presentation/)

**tamiya_naoto**
[ビッグデータチームを発足するにあたって気をつけておきたいn個のこと]
(https://www.slideshare.net/naototamiya9/machine-learning-casual-talks-4-n?ref=https://mlct.connpass.com/event/22192/presentation/)

**shakezo**
[プロトタイプで終わらせない死の谷を超える機械学習プロジェクトの進め方](https://www.slideshare.net/shakezo/mlct4?ref=https://mlct.connpass.com/event/22192/presentation/)



## #5 2018/07/13

**Shunya Ueta**
[How to break the machine learning system barrier ?]
(https://www.slideshare.net/shunyaueta/how-to-break-the-machine-learning-system-barrier)

**Hirofumi Nakagawa**
[メルカリのML基盤]
(https://speakerdeck.com/hnakagawa/mlct)

**ynqa**
[Tensorflow Serving]
(https://speakerdeck.com/ynqa/tensorflow-serving)

**soonraah**
[Pipeline Jungles とたたかう話]
(https://speakerdeck.com/soonraah/mlct-number-5-pipeline-jungles-totatakauhua)

**hagino3000**
[ネット広告配信サービスにおけるMLシステムの実装と運用]
(https://speakerdeck.com/hagino3000/netutoguang-gao-pei-xin-sabisuniokerumlsisutemufalseshi-zhuang-toyun-yong)

**Katib**
[KubeFlow/Katib ハイパーパラメータチューニング]
(https://www.slideshare.net/Oshima0x3fd/katib?ref=https://mlct.connpass.com/event/88797/presentation/)



## #6 2018/09/25

**kosuke-kitahara**
[タウンワークにおける機械学習API@GKEの導入]
(https://speakerdeck.com/kokitahara/taunwakuniokeruji-jie-xue-xi-api-at-gkefalsedao-ru)

**Shotaro Tanaka**
[リブセンスにおける 機械学習システムの信頼性エンジニアリング]
(https://speakerdeck.com/livesense/ribusensuniokeru-ji-jie-xue-xi-sisutemufalsexin-lai-xing-enziniaringu)

**Agata Naomichi**
[ユーザフィードバックと機械学習]
(https://speakerdeck.com/agatan/machine-learning-and-feedback)

**yu-ya4**
[BigQuery ML を使ってみた話]
(https://speakerdeck.com/yuya4/bigquery-ml-woshi-tutemitahua)


## #7 2018/11/20

**Yukiyan**
[機械学習基盤を一人で構築するということ]
(https://speakerdeck.com/yukiyan/hitori-ml-team)

**MichihisaHiratsuka**
[Jupyter だけで機械学習を実サービス展開できる基盤]
(https://www.slideshare.net/RecruitLifestyle/jupyter-123579609)

**Shinichi Takayanagi**
[The Road to Machine Learning Engineer from Data Scientist]
(https://speakerdeck.com/stakaya/the-road-to-machine-learning-engineer-from-data-scientist)


## 最後に

第8回は絶対参加します！

## 追記

第8回参加してきました。

## #8 2019/01/29

**m_nishiba**
[エムスリーにおける機械学習活用事例と開発の効率化]
(https://speakerdeck.com/nishiba/emusuriniokeru-ji-jie-xue-xi-huo-yong-shi-li-tokai-fa-falsexiao-lu-hua)

**Nasuka Sumino**
[BEDOREにおける対話エンジンの開発と運用]
(https://www.slideshare.net/nasukasumino/bedore-129551899)

**Shunsuke Kawai**
[ヤフオク!における分散深層学習]
(https://speakerdeck.com/vaaaaanquish/machine-learning-casual-talks-number-8-lt)
あのボタンからSeleniumでAPIの無いサイトを操作する

# はじめに
あのボタンを買ったのはよいけど、肝心のいつも使ってるあのサイトがAPIを提供していない！
昨今はだいぶAPIは公開されていますが、まだまだ非公開/非対応というのはよくある話でそんなサイトへのアプローチです。

# 構成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141402/c06d7756-1962-631b-10bd-e5c38e927eab.png)
上記の通り、最終的にはLambdaからSeleniumを経由することでブラウザでの操作を再現します。
ブラウザ操作なのでほぼすべてのサイトに対応できます。

# Lambdaの作成
実際に行いたい操作だけを手元にご用意ください。

```python:操作記述例
driver.find_element_by_xpath("//input[@type=\"submit\"").click()
```
この際注意点として、絶対にIDやパスワードなどの固有情報を含めないでください。（構成をそのまま再現するとGithubなので悪用される恐れがあります。）
※クレデンシャル情報の類いをよりセキュアにするためにはAWS Secrets Managerの利用も検討の余地有り。この記事では非複数管理＆個人ユースのため使用しません

必要な場合は以下例のように【キー】を必要な分だけ用意することで外部から注入できます。

```python:設定値取得先
def lambda_handler(event, context):
    event['placementInfo']['attributes']['【キー】']
```
## ビルド
実行用に依存解消したものを作るフローは以下を参考にしてください。
[Chrome headlessをLambdaで動かす際の依存解消にCodebuildを使う](https://qiita.com/TAC_yacht/items/9bb1b98ce6e3015a0b6a)

# 設定値の注入
以下の記事を参考に設定
https://blog.soracom.jp/blog/2018/11/07/tips-of-soracom-lte-m-button/


# 終わりに
私は勤怠サービスへ[操作](https://github.com/tac-yacht/pasta)をさせてます。回線依存なしにどこでも使えて最高です。
対向は何でもいいので、ほかにも応用先を検討中

以下は実行レポート※1なのはたぶん押し忘れ
![Screenshot_20181124-225839.jpg](https://qiita-image-store.s3.amazonaws.com/0/141402/879839ef-4bf0-7469-ca2f-7ee8badf431f.jpeg)
GCPで作成したWordpressの静的IPアドレスの設定方法

# はじめに
GCPでWordpressを立ち上げたときの静的IPアドレスの設定方法を記します。

## なぜ静的IPアドレスの設定を行うか
GCPでは特定のリソースにIPアドレスの割当が可能で、内部IPアドレスと外部IPアドレスをVMインスタンスに割り当てることができる。

外部IPアドレスはエフェメラルにも静的IPアドレスにもできる。
（※エフェメラルとは短命なという意味）

作成直後の外部IPはエフェメラルなIPが振られているが、デプロイする度にIPアドレスが変わるのはよろしくない(※1)ので、静的IPアドレスに変更したい。

※1 IPが変わる度にDNSの設定をしなければならないため

[IP アドレス  |  Compute Engine ドキュメント](https://cloud.google.com/compute/docs/ip-addresses?hl=ja#ephemeraladdress)

## 前提
GCPのMarketplace機能でWordpressを立ち上げていること

# 手順
## VPCネットワーク - 外部IPアドレスの一覧
![vpcネットワーク.png](https://qiita-image-store.s3.amazonaws.com/0/319068/a347e0bc-ef16-714b-2096-9326ca15d2e6.png)

メニューより、VPCネットワークから「外部IPアドレス」をクリックする


## 外部IPアドレスのタイプの変更

![静的.png](https://qiita-image-store.s3.amazonaws.com/0/319068/35ce8a5e-6ce7-b7ab-914d-e78bc7f26ea4.png)

タイプ列から「静的」を選択する。


![yoyaku.png](https://qiita-image-store.s3.amazonaws.com/0/319068/bfbc93b3-2242-1de5-d5d0-6561e756f3d1.png)

静的IPアドレスの名前を入力する。
ここでは wordpress-management という名前にしました。

## 確認
![stativc.png](https://qiita-image-store.s3.amazonaws.com/0/319068/1fbf3429-9104-f3c4-46c7-0566641185d5.png)

タイプが静的になっていれば完了です。



# 参考
[GCP Compute Engineで静的IPアドレスを割り当てる](https://yusuke.blog/2017/12/16/1993)
[IP アドレス  |  Compute Engine ドキュメント](https://cloud.google.com/compute/docs/ip-addresses?hl=ja#ephemeraladdress)
AWS Cloud9を東京リージョンのEC2で使う方法

『完全SIer脱出マニュアル』に触発されて、始めてみた。
すぐに転職！！と行かないまでも、Web系エンジニアというものを考えてみたい。今後を考えるいいきっかけになりそうに思う。

まずはやったこと。
1. Twitter、Qiita、GitHubのアカウント取得
2. Railsチュートリアルを読み始め、AWS Cloud9の環境を用意

AWS Cloud9の環境構築には↓を参考にさせていただいた。

AWS Cloud9を東京リージョンのEC2で使う方法
https://qiita.com/unitia0323/items/466045e978e6af030b38
※どういうわけか、Dockerというモジュールのインストールが失敗してしまった。直接EC2インスタンスにSSHして、コンソールから"sudo amazon-linux-extras install docker"でうまくいった。



今は無料でこんなに色んなものがあるんだということに、ただただ驚いた。


あと、AWS上のインスタンスにSSH接続するときに公開鍵認証を使うが、この鍵にマイナンバーカードを使えるなんていう情報も出てきた。確定申告のためにとりあえず取っておいたけども、面白いおもちゃになるかもしれない。