OmniAICreator/Qiita-1.07M huggingface dataset:
vimの色テーマ弄った話

# はじめに
　phpのフレームワークに手を出そうと思ってLaravelを導入した。visual studioとかeclipsみたいなのを想像してたんだけど、エディタは別に用意するみたいだったので、学生だった時に研究室で使ってたpcと同じ開発環境を構築したくてvimを入れた。
　コマンドプロンプトからgvimコマンドでvimが起動するようになったけど、フォントカラーとか背景色が思っていた設定と違うので弄った。
　以上が経緯。以下やりたかったこと＆やったことを記す。

# 環境
- vim81(windouw版　64bit)
- windows8

# vimの色テーマ
　ちゃんとした名称はカラースキームとかテーマカラーだと思う。コメントカラー、フォントカラーっていうカラースキームのパッケージのことをテーマカラーって思ってる。知らんけど。
ちなkaoriyaでダウンロードしたvim81の初期画面はfig.1みたいな感じ。
![vim_conf.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520340/2df281b3-d275-382a-509c-43ed5d810b96.jpeg "fig.1 gvimの初期画面")
fig.1 gvimの初期画面

　学生のころ使ってたvimはデフォルトで黒背景、白字、phpのecho・var_dump()みたいな関数は水色だか黄色だったこともあって、白系の背景に黒字のエディタはちょっと…
　色テーマは編集メニューから変えられるんだけどセーブされないってゆうか、別のファイルを編集しようとすると元に戻ってる。

#起動時の設定ファイルを変える
　参照　https://blog.tanebox.com/archives/106/
　参照先のサイトにそって設定ファイルを弄った。
リンク先のサイト読んでればできると思うんだけど、つまったところが2点あるからそこだけ書くわ。

 - 記載する文面コピペしたらダブルクオテーション（”）が蹴られた
 - 設定内容によってvimrcとgvimrcで書くところを変える

　1点目は設定ファイルの中ではダブルクオテーションマークとそれ以降の文字はコメント扱いになるんだけど、「”」じゃなくて「"」に書き直す必要があった。どうでもいいね。
　2点目。今回はテーマカラーだけ変えたかったんだけど、ctr+c,ctr+vのコピペは使えたほうが便利だし、行番号もいるっしょってことでfig.1の内容をvimrcに追記した。そしたらテーマカラーだけ変わらんかったって話。
　変更後の初期画面をfig.2に載せた。
　![vim_conf2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520340/9d902eec-dab1-ba4b-6d6e-0410898fa4c7.jpeg "fig.2 vimrc変更後のgvim初期画面")
fig.2 vimrc変更後のgvim初期画面

　line259でdefaultにしてたら変わるわけないじゃんって思ってronにしてみたけど変化せず。設定ファイルの冒頭部分に書いてあったんだけど、GUIに関する設定はgvimrcに書くのが正しかった。てゆうかgvimを見にいったらデフォルトカラーの項目を発見した。
![vim_conf3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520340/54abc154-797b-dd7f-f528-1ff325e62396.jpeg)
　66行目のcolorschem default -> ron に変更
![vim_conf_color.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520340/4443389b-7ace-7354-416a-bf0ffabb1c45.jpeg)
　とりあえず黒背景になった。


#　カラースキームの変更
　私はコメントと行番号の自己主張が強いテーマカラーは嫌いです(唐突)。
黒背景のテーマカラーでもコメントで言えばpabloが好きだし、行番号ならronが好きってわけで、次は個々のカラースキームを弄ってみた。各カラーテーマの設定ファイルは
` C:\vim\vim81-kaoriya-win64\vim81\colors `
にあった。今回はronのコメントカラーをgreen -> darkgrey に変更。
![vim_conf_color2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520340/c34fcdcd-455e-5ba2-da67-847991f7cccc.jpeg)

![vum_conf4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520340/3ef7fe2e-de9e-55c1-accf-95b40cb892d3.jpeg)
コメントとコードの判別がつくようにもうちょっとコメントを黒寄りにする必要がありそうだけど、これ以上は蛇足になるから書かない。

------------------------------------------------------------------

今回の記事とは関係ないけど、cmdでgvimって撃てばgvim起動するのに、xamppのshellだと変数のパス通ってないって感じのメッセが出る。
何のためにvimをコマンドで起動できるようにしたと思ってるんだ…

```
'gvim' is not recognized as an internal or external command
```



おしまい。
ABテストのススメ

# こんなことありませんか

## 「ユーザはこんな機能が欲しいはず」
こんな機能があれば、ユーザは喜ぶ？

- 頑張って作った
- けど使われなかった

何が問題なんだろう

## 「デザインリニューアル」
流行りのデザインにしよう！

- 半年かけて作った
- けどよいフィードバックは得られなかった

どこが問題なんだろう

# ABテストからはじめよう
ABテストとは
> ある特定の期間にページの一部分を2パターン用意して、どちらがより効果の高い成果を出せるのかを検証すること
> https://liskul.com/what-is-ab-test-17813

ある目標に対して、
どんな手段をとることが、目標に対する貢献度が高いかを検証する

# どうやるのか 
## 例
Webサイトからのイベントの申し込みを増やしたい

## 仮説によって導かれたA/Bパターンを用意する
![98912D5D-D533-41A0-8ADC-E494BBBD2E57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140026/b7d9faab-ac3e-f660-717d-8d4082dd36b9.png)

- 青背景のページでは、青ボタンは視認性が悪い
- 青っぽい背景のページで「申し込む」ボタンは、赤の方が良いのでは？

## 目標を立てる
目標と言っても、ここでいう目標は何を比較するのか
「申し込むボタンが押された数」

## 計測する
ユーザによって「申し込む」ボタンの色を変えて計測ログを保管する

申し込むボタンをみた人、申し込むボタンが押された数を赤パターン・青パターンで保持

## 結果が出る
どちらのケースで優位性があるか統計的に導き出き、結果を出す
それが事実となる
![BF3E8244-E591-4A0E-AEA8-42708C292187.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140026/bb504492-2d5c-95c0-19f8-06d9ce8f7f49.png)

そして、事実から新たな仮説が生まれる

# 簡単にはじめられる
## ABテストを行えるツール
- Ruby on Railsでやるなら
    - split
        - controller側の処理も分岐したりできるので、かなり高度な検証が可能
- その他簡易的にやるなら
    - Googleオプティマイズ
        - デプロイ不要なのでやりやすい

## ABテストを助けるツール
- Googleアナリティクス
    - ユーザーエクスプローラー等を用いた、1ユーザを軸にした行動分析
- Hotjar
    - ユーザの行動を撮影して確認したり、ヒートマップでユーザ行動の分布分析
- アプリケーションのログ
    - なんだかんだでいざという時役に立つ

# ABテストを通して得た学び
- 定量化が行え、数値で語れるようになった
    - 明確な事実が生まれる
        - やればやるほど新たな仮説が生まれる
            - 突き詰めると、大きな改善につながる
- 小さくはじめたほうが良さげ
    - 大きく始めると、何が起因したのかわからない
- ABテストの結果が本当に正しいのか疑って調べることの必要性
    - 当初の仮説と全く違った問題の発見や気づきがある

# 最後に
ABテストを通した仮説検証で、よりよいサービスを作りましょう
tviewで最初の1文字目が表示されない

# tviewで最初の1文字目が表示されない
[tview](https://github.com/rivo/tview)という**Go**製のOSSがあります。
これはターミナル上でTUIを表現するためのサポートライブラリです。

**tview** のデモの中に[treeview](https://github.com/rivo/tview/tree/master/demos/treeview)というものがあり、これを試そうとしたところ1文字目が画像のようにファイル名の1文字目が表示されませんでした。 `main.go` が `ain.go` とかになっていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84459/b7c9f508-c0de-fab6-8535-e46bd122e9b3.png)

こうなった場合の解決策が issue にあがっていたので紹介します。

## 解決策
[Treeview's first letter is lost](https://github.com/rivo/tview/issues/267)というissueを見つけました。
最初上の画像のような表示がおかしい問題を見た時に何がおかしいのかわからなかったのですが、1文字目が欠けている状態だったみたいですね。

issueのコメントを読んでいくと[tview text view miss display bug.](https://github.com/rivo/tview/issues/281)という別のissueが紹介されています。このissueによればこの問題は `export LC_CTYPE="en_US.UTF-8"` をすれば治る。ということです。

```shell
$ export LC_CTYPE="en_US.UTF-8"
```

これをしたところ私の環境でも正常に表示されていることが確認できました。
`LC_CTYPE` は システムのLocaleの設定の類でも文字に関する設定のようです。元は `ja_JP.UTF-8` だったのですが、これを`en_US.UTF-8` に変更することで解決しました。
現在の `Locale` については `$ locale` コマンドで確認できます。下の出力結果は僕の環境の変更前の結果です。

```shell
$ locale
LANG="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_CTYPE="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_ALL=
```


## まとめ
今回は特に `tview` で起きた現象についての解決策でしたが、何か文字の表示がおかしいな。と思ったらLocaleの設定等を見直してもいいかもしれませんね。
Lightning Networkの仕様(BOLT)を解読する （0章~1章）

# はじめに

BOLTはLightning Networkの数ある仕様の中で一番使われているものです。
[ここ](https://github.com/lightningnetwork/lightning-rfc)で読むことができます。日本語盤は[こちら](https://github.com/takaya-imai/lightning-rfc-japanese)です。
オススメの読み方を、株式会社Nayutaのuenoさんが[ブログ](https://medium.com/nayuta-inc/lightning-networkの仕様はどこから読み始めたらよいか-ln-001-5a80875c7e84)で紹介されています。

さて、BOLTはかなり難解です。
なのでかなり苦労して読んでみた私なりの解釈を、各省ごとにまとめていきます。
間違っていたり、アドバイスなどがあれば是非是非コメントを。

**備考:** Lightning Networkをあまり理解しないままBOLTを読んでもほとんど理解できません。私のオススメは、一度Lightningを触って見ることです。[lndのTutrial](https://dev.lightning.community/tutorial/)がかなりオススメです。そちらについても記事を書いているのでぜひ読んでみてください。(Dockerがオススメ)
 - [Lightning Network Daemon(Lnd)で遊んでみた  ~Tutrial編~]()
 - [Lightning Network Daemon(Lnd)で遊んでみた  ~Docker編~]()

# ０章　イントロダクションと用語説明

#### 用語集
大半は[Mastering Bitcoin](https://github.com/bitcoinbook/bitcoinbook)に出てくるようなワードなのでここでの解説は省略。
知らないワードは軽くググってみることをオススメします。
HTLCとかは理解しておいたほうがいいかも。

### テーマソング
謎にLightning networkのテーマソングが載っています。
覚えましょう。テストに出ます。

### 0章まとめ
イントロダクションなので特に書くことはない。
さて、ここからが勝負。


# 1章　基本プロトコル

この章ではライトニングの上でやりとりされる各種メッセージのフォーマットを解説しています。
全てのライトニングメッセージには、共通したフォーマットがあり以下のようになっています。

- `type`: payloadフィールドを解釈するための2バイトのフィールド。
- `payload`: メッセージからtypeを除いたフォーマット

typeの値によってメッセージはグループに分けられます。

 `0 ~ 31`: セットアップ & コントロール
   コネクションのセットアップ、コントロール、サポート、そしてエラーれポーティングに関するメッセージが入る。(この章で解説されます。)

 `32 ~ 127`: チャネル
  マイクロペイメントチャネルのオープンとクローズに使われるメッセージ。(BOLT2章で解説)

 `128 ~ 255`:コミットメント
 コミットメントトランザクションの更新(手数料の更新、署名の交換、追加、取り消し、HTLCの確定&ブロードキャスト)に関するメッセージ。(BOLT2章で解説)

 `256 ~ 511`:ルーティング
 ルート探索、ノードやチャネル関係の通知に関するメッセージ。(BOLT7章で解説)

##### it's OK to be odd ルール
typeに受け入れられる値（○）と、受け入れられない値（×）
　○　規定されている偶数番号、規定されている奇数番号、拡張により規定された奇数番号
　×　規定されていない偶数番号、規定されていない奇数番号
拡張性を上げているから大事らしい。

 **備考：メッセージのサイズはトランスポート層の制限である65535バイト以下になる。**

## セットアップメッセージ

#### initメッセージ

　メッセージを送るときに最初に送られるメッセージ。

- type: **16 (init)**  ← 規定されている偶数番号
- data:
　- **2:gflen**
　- **gflen:globalfeatures**
　- **2:lflen**
　- **lflen:localfeatures**


#### errorメッセージ

間違いを指摘するためのメッセージ。

- type: **17 (error)**  ← 規定されている奇数番号
- data:
　- **32:channel_id** … チャンネルを指定。０の時は全てのチャンネル。
　- **2:len**
　- **len:data**

##### 要件
errorメッセージを送るノード、受け取るノードは指定されたチャンネルを停止させないといけない。`channel-id`が0であれば全チャンネルを停止させないといけない。

## セットアップメッセージ


#### pingメッセージ

コネクションの確認。

- type: **18 (ping)**  ← 規定されている偶数番号
- data:
　- **2:num_pong_bytes** 
　- **2:byteslen**
　- **byteslen:ignored** … 通常０が入る。


#### pongメッセージ

pingメッセージを受け取った時、返答として送る。

- type: **19 (pong**  ← 規定されている偶数番号
- data:
　- **2:byteslen** 
　- **byteslen:ignored** … 通常０が入る。



# １章まとめ
ライトニングのデータの構成を解説しているだけなのでこれを読んでいるだけではイメージ浮かばないし面白くない。
実際にプロトコルデータをじっくり観察する遊びをしないとな。むしろそれを先にした方が分かりやすいいと思う。
WireSharkでLightningのパケットキャプチャリングができるプラグインがあるみたい。
[lightning-dissector](https://github.com/nayutaco/lightning-dissector)
今度これを使う記事を書こうと思う。




まとまってはないな、うん。
インターフェースで関数のオーバーロードを記述する


# はじめに

最近、TypeScriptを使っていて覚えたことの共有です。

# インターフェースで関数のオーバーロードを記述する

コールシグネチャを含んだインターフェースを定義すると、関数に対するインターフェースを作成できる。
これを応用すれば、関数のオーバーロード情報を持つインターフェースを定義できる。

```ts
// 関数のオーバーロード情報
interface ICallSignature {
	(a: string): any;
	(a: number): any;
}

// オーバーロードのある関数の実装
function f(a: string): any
function f(a: number): any
function f(a: string | number): any {
};

// 関数へのインターフェースの適用
const hoge: ICallSignature = f;

```

# おわりに

また何かあったら投稿します。
[Swift] FirebaseStorageをフォルダの中身を全て削除する

#FirebaseStorageはフォルダごと削除ができない

FirebaseStoregeはフォルダをまるごと削除ができない仕様らしいです。。。

なのでユーザーの削除などで複数あるプロフィール画像や投稿画像を削除する場合はループでフォルダにあるファイルを削除しなければいけないみたい、、、

この仕様制限だけでFirebaseStorageから離れる開発の人も多いんじゃ、、、（わからん）

いろいろ調べて見たけどやり方として2通りあるっぽい。

- FirebaseのCloudfunctionsを使う
- Swiftでループを回して、1つ1つファイルを削除する

僕はjsが得意でないので、Cloudfunctionsは諦めて
後者のループを回す方法選びました。

参考記事がなく、自分でfirebaseStorageにいいメソッドないかな〜ってみたところ、、、ありました！！

#SwiftでループをまわしFirebaseStorageをフォルダの中身を全て削除する方法

listAllを使い、フォルダにあるファイルを全てとってきて、それをループして削除します。

```swift
let storage = Storage.storage()
let storageRef = storage.reference()
storageRef
    .child("users")
    .child(self.uid)
    .listAll(completion: { (StorageListResult, error) in
         if let error = error {
             print("エラー\(error)")
         } else {
             for ref in StorageListResult.items {
                 ref.delete { (error) in
                     if let error = error {
                         print("エラー\(error)")
                     } else {
                         print("storage削除成功！")
                     }
              }
         }
     })

```

もっといい方法あるって方はコメントください！！
フォルダ毎削除できるようにしてほしい😂
LEGO Mindstorms EV3 + iPad で Hello World

## 概要
- LEGO Mindstorms EV3 のインテリジェントブロックに Hello World を表示する
- iPad 用プログラミングアプリで Hello World プログラムを作る

## iPad 用プログラミングアプリをインストール

iOS アプリ [MINDSTORMS EV3 LEGO® Education (‎教育版 レゴ® マインドストーム® EV3 プログラミング)](https://apps.apple.com/jp/app/lego-mindstorms-education/id959374369) を iPad にインストールする。

## アプリを起動して新しいプログラムを作成する

アプリを起動して画面左下の「新しいプログラム」をタップする。

![lego-mindstorms-ev3-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/ae8f36d7-cada-9758-3208-d791e615be29.png)

## iPad とインテリジェントブロックを Bluetooth で接続する

画面右上のアイコンをタップして iPad とインテリジェントブロックを Bluetooth 接続する。

![lego-mindstorms-ev3-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/7fcf810b-ab8e-6f29-ce9a-605fd5319fea.png)

## Hello World プログラムを作る

画面下のプログラミングパレットから、必要なプログラミングブロックをプログラミングキャンバスにドラッグする。
ブロックごとに以下のようにパラメータを設定し、ブロックを連結する。

![lego-mindstorms-ev3-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/7662da1c-29f4-abd2-e885-8e93c197482a.png)

## プログラムを実行する

画面右上の三角形アイコン「▶」をタップすると、プログラムがインテリジェントブロックにダウンロードされ、プログラムが実行される。

![lego-mindstorms-ev3-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/958e3beb-66d3-61de-f0d5-31aa90d9ba99.png)

インテリジェントブロックに「Hello, world!」の文字が表示される。

![lego-mindstorms-ev3-06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/e008f348-4fd9-37c2-edf9-3a6024bbbdf9.jpeg)
google Colaboratory上でdarknetの転移学習を行う

物体検出であるyoloを自分のPCではなく，Colaboratory（無料）で学習させるための記事です．

google Colaboratoryは一般にpythonでコードを書いて実行するものではありますが，Linuxコマンドを使用できるのでC言語での実行ファイルも実行することができます．


本記事ではdarknetの転移学習をColaboratory上で実行させる手順を記載します．



# 学習用ファイルの準備

まずは転移学習に用いるファイルの構築をします．
http://shibafu3.hatenablog.com/entry/2017/08/24/124826
を参考にしてください．
一度ご自分のPCで起動ができる状態まで試すと良いです．

また，この際にGPUが付いていないPCを使用している人はMakefileを

```
GPU=0
CUDNN=0
OPENCV=0
OPENMP=0
DEBUG=0
```

とする点に注意してください．

起動を確認したらもういちどMakefile

```
GPU=1
CUDNN=1
OPENCV=0
OPENMP=0
DEBUG=0
```
と書きなおしてしておいてください(Colaboratory上でmakeを行います)．


# google driveにファイルをアップロード

google driveにログインして，作成したdarknetフォルダをまるごと「マイドライブ」にドラッグ&ドロップします．

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/0c2a822c-4653-e35b-6134-b99b2ddcf78b.png)





# Colaboratoryに接続

まずはこちらからcolaboratoryに接続しましょう．
https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/0b67b1f1-401e-57e2-9268-6f54dcefe4f7.jpeg)


学習でGPUを使えるように設定します．
ランタイム→ランタイムのタイプを変更
を押して
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/2f04c982-d42a-4a2b-f44e-1c0a5fc9900e.jpeg)


ハードウェアアクセラレータをNoneからGPUに変更してください

![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/fa196165-7910-683b-16e1-7d9881206d90.jpeg)


これでGPUが使えるようになります．

次にいらないセルを全て削除したいので，
変更→すべてのセルを選択
を押して，Deleteキーを押せばすべて削除できます．

![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/19932fa9-f730-99f6-62e1-a30301739c96.jpeg)



# google driveをcolaboratoryにマウント

ファイル→ドライブをマウント
を押すとgoogleドライブマウントするためのプログラムが書かれたセルが出てくるので（右上の赤四角で囲まれた部分が接続中or初期化中となっていたら少し待機）

![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/d5e65e9e-2dbd-6a74-1179-97a4937307d3.jpeg)


ここでShift+Enterを押してセルのプログラムを実行すると，google driveへのアカウントのアクセス許可が求められるので，
出てきたURLをクリック→使っているアカウントを選択→許可→出てきた文字列をコピー

![IMG_0516.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/3041491d-b682-a06a-e6c0-46222eeee06e.jpeg)


今回私は「4/rgFzIUfdKNF8Lm_4cX-5rFhVgnEz6aztThLUecjpPzdxdhufOuJEsSI」と出てきたので，
これをColaboratoryで出てきたEnter your authorization code:
のところに貼り付け→Enterキーを押す

しばらくしたあと

```
··········
Mounted at /content/drive
```

と出ればOKです．



# 学習の実行

まずはMakefielを実行しましょう．

Colaboratory上でコードセルを出して

```
!make
```

と打ちましょう．

カレントディレクトリを変更したいので

```
%cd /content/drive/My Drive
```

を実行してカレントディレクトリをgoogle drive上のホームディレクトリ
/content/drive/My Drive
に変更します．

次にmakeを実行するために
```
cd darknet
```
```
!make
```
を実行してmakeが終了するのを待ちます．
（このmakeはColaboratory上のGPUに対応させるために必要です．）

```
!chmod 777 darknet
!./darknet detector train cfg/obj.data cfg/yolov2-tiny.cfg yolov2-tiny.weights
```

とすれば実行できます．以下のようになっていたら成功．

![Screenshot from 2019-10-13 15-56-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/d449e233-756a-c9ce-2642-ecc0bd860a0f.png)
Ubuntu 18.04にMySQL 5.7をインストール（OS標準）

# はじめに

Ubuntu18.04にMySQL5.7をインストール
親記事：[MySQL, MariaDBの各種インストール方法とEOLまとめ \- Qiita](https://qiita.com/witchcraze/items/72291ee035437ec83273)

## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

# apt update; apt install -y mysql-server
... 略
```

### 各種確認

```shell-session
# service mysql start
# mysql -u root -e'select version();'
+-------------------------+
| version()               |
+-------------------------+
| 5.7.27-0ubuntu0.18.04.1 |
+-------------------------+
```
Flutter WebでTwitterのレスポンシブデザインをやってみた

# できあがったもの

[![Image from Gyazo](https://i.gyazo.com/5d1b8ab8b6647cb63e8fd395fe75bf8b.gif)](https://gyazo.com/5d1b8ab8b6647cb63e8fd395fe75bf8b)


# ソース

基本は前回の[これ](https://qiita.com/sakiyamaK/items/04df32195277b4590f72
)
あとは愚直に各パーツのwidgetの使い方を調べていっただけ

ただ `Divider` widgetがwebだと反応しないようだったので `Container` で代用してる

ソースの全体はgithubにあるよ
https://github.com/sakiyamaK/flutter_web_twitter_layout
初心者によるプログラミング学習ログ 137日目

# 100日チャレンジの137日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

137日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>137日目<br><br>Udemyでjavascript学習<br><br>英語の教材だったけど、海外のほうが良質な気がする。<br>何いってるかわからないけど、コードみればやりたいことはわかる<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a> <a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/javascript?src=hash&amp;ref_src=twsrc%5Etfw">#javascript</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1186391662370516992?ref_src=twsrc%5Etfw">October 21, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

とりあえず、Udemyでお試しで英語教材をやってみた感じ。
翻訳機能がないとなにいっているかわかりませんが、コードはなにやりたいか読めますので、特に不便はありませんでした。

javascriptでだいじょうぶなら、他の言語でも英語教材やってみるのもいいかもしれません。
Ubuntu 16.04にMariaDB 10.0をインストール（OS標準）

# はじめに

Ubuntu16.04にMySQL10.0をインストール
親記事：[MySQL, MariaDBの各種インストール方法とEOLまとめ \- Qiita](https://qiita.com/witchcraze/items/72291ee035437ec83273)

## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

# apt update; apt install -y mariadb-server
... 略
```

### 各種確認

```shell-session
# service mysql start
# mysql -u root -e'select version();'
+----------------------------------+
| version()                        |
+----------------------------------+
| 10.0.38-MariaDB-0ubuntu0.16.04.1 |
+----------------------------------+
```
Ubuntu 16.04にMySQL 5.7をインストール（OS標準）

# はじめに

Ubuntu16.04にMySQL5.7をインストール
親記事：[MySQL, MariaDBの各種インストール方法とEOLまとめ \- Qiita](https://qiita.com/witchcraze/items/72291ee035437ec83273)

## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

# apt update; apt install -y mysql-server
... 略
```

### 各種確認

```shell-session
# service mysql start
# mysql -u root -e'select version();'
+-------------------------+
| version()               |
+-------------------------+
| 5.7.27-0ubuntu0.16.04.1 |
+-------------------------+
```
RoboMasterS1を解析してROSで動かせるように頑張ってみる（プロトコル解析2）

#DJI RoboMaster S1のCANプロトコル解析
鋭意RoboMasterS1をROSで操作できるように進めていますが、今回はいま絶賛解析中のCANのプロトコルについて続編を書きたいと思います。

##前回のおさらい
前回DJI RoboMaster S1に使用されているCANの通信はおかしなことになっていて、各ユニットごとにCAN IDが割り振られ、そのIDでCAN-BUSを専有してバースト転送しているということがわかりました。
どうやらDJI Roninシリーズのジンバルも外部からの制御にCAN通信を使用しており、これを流用したのかもしれません。（にしても、もうちょっとなんとかならないものか）

CANの規格としてはCAN 2.0BでBitrateは1Mbpsで使用されておりCAN IDは
0x201〜0x204、0x211〜0x216となっていました。

そしてデータの構造はとてもシンプルで、トイドローンのTelloやRoboMasterの大会で使用されているジャッジシステムなどと同様のコマンド形式になっていることがわかりました。

|ヘッダ|メッセージ長|固定値|CRC8|データバイト列|CRC16|
|---:|---:|---:|---:|---:|---:|
|0x55|0xXX|0x04|CRC8|Data[]|CRC16|

今回、RoboMaster S1に搭載されているIntelligent Controllerのフリをして、コマンドを乗っ取ることで制御を奪ってしまいます。
Intelligent Controllerが出力しているCAN IDは物理的にIntelligent Controllerを切り離すことで、わかりますので、ID = 0x201ということが判明しました。

##コマンドの種類を特定する
通常はCANにのせるコマンドは、常に同じものを定常的に送信し、そのBitの変化で指示を与えることが通例なのですが、ここでもDJIは恐ろしいことにCAN-BUSに流すコマンドを定常的に流すものと、ブラスターなどの指示が来た時だけ流すコマンドの2種類存在していました。また、指示が来た時だけ流すコマンドで、別ユニットからACKと思しきコマンドが返ってくるものもありました。

なぜこのように2種類のコマンドを用意することがよろしくないかというと、例えばブラスターを連続で発射するなどの指示が来た時に、その時だけ流すものが想定外にCAN-BUS負荷を上げて、他のコマンドを送信したいのに送信できなくなるなど、CAN-BUSの負荷が急に高くなり他の通信がブロッキングされる時間が長くなってしまうことが考えられます。

これは自動車や、産業用機器などのミッションクリティカルなシステムでは大きな問題となるため、CAN-BUSの負荷は常に一定にするように管理するのが通例です。DJIさんは産業機器スペックのCANを採用と宣伝していましたが、あまり好ましくない使い方といえるでしょう。ただ、逆手に取ればCANは複数のセンサーなどを制御する際には非常に扱いやすいので、RoboMaster S1のようなミッションクリティカルでないシステムで用いる場合は、管理を放棄することで、とても楽に高品質なシステムが組めるということで採用したのかもしれません。

話がそれてしまいましたが、この定常的に流すものと、指示に従って間欠的に流される2種類のコマンドの存在が確認できました。
その中で先ほど書いたメッセージの構造は更に、以下のようになっているとわかりました。

|ヘッダ|メッセージ長|固定値|CRC8|コマンドの種類|コマンドの種類|コマンドカウンタ下位Byte|コマンドカウンタ上位Byte|データバイト列|CRC16|
|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|
|0x55|0xXX|0x04|CRC8|0xXX|0xXX|Count|Count|Data[]|CRC16|

はじめはメッセージ長でコマンドを分類しようと試みたのですが、同じメッセージ長で異なる指示となっている場合もあり、コマンドの種類のバイト列が存在することに気づきました。
また、コマンドの種類はたとえばLEDの点灯など種類が同じものは近い数値になっていたりしていました。

また、コマンドカウンタに関しては、先ほど出てきたACKを返す場合などの場合送信されてきたカウンタ値をコピーして返すようです。また、複数のコマンドでカウンタ値を共有している場合もあるようです。その場合、コマンドの種類の２Byte目が変化していました。またブラスターのコマンド送信後に、返ってくるACKのコマンド種類のバイトが反転しているということも確認できました。（どういう意味かは不明）

##解析できたコマンド

いろいろコマンドはわかってきたので、主要なコマンドについてまとめておきたいと思います。

|メッセージ長|コマンドの種類|コマンドの意味（推定）|送信周期（推定）|
|---:|---:|---:|---:|
|0x1B|0x09C3|スマホからのジョイスティックによるコマンド指示|10msec|
|0x0E|0x09C3|機体速度（スマホからセットできる）|指示による|
|0x0F|0x0904|スマホの画面をタッチしているかしていないか（制御OK/NG）|指示による|
|0x1A|0x0918|LED発光指示|指示による|
|0x0E|0x0917|ブラスター指示(多分発射)|指示による|
|0x16|0x0917|ブラスター指示(多分発射)|指示による|

意味のわからないコマンドは他にもいろいろあるのですが、とりあえず真似して送れば Controllerのフリはできるかなあと思っていたりします。

前回Intelligent Controllerありで、ROSから制御できていたのは、Intelligent Controllerの上記の指示が来た際に、スマホのジョイスティックコマンドを書き換えていたからでした。また課題になった点として、RoboMaster S1がスマホのタッチの有無を見ていて、スマホをタッチし続けていないと自動で停止してしまうという点でしたが、こちらも、「タッチしていない」というコマンドを「タッチしている」というコマンドに書き換えることで制御に成功しました。

まだまだ、ブラスターの角度のデータなど解析できていることもあるのですが、今回はこのくらいにしておきたいと思います。これはかなり人海戦術的なところもあるので、みなさまご協力お願いいたします。

##RoboMaster S1を用いて自律走行プラットフォームを作る
こんな感じで解析を進めていくことで、Intelligent Controllerをなくしていくことで、以下のようなシステムを構築しようと企んでいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/c5e22466-56ba-a589-c816-dd493413409c.png)

こちらで活動していますので、ご興味ある方はご協力よろしくおねがいします。
https://github.com/RoboMasterS1Challenge/robomaster_s1_can_hack
2019 JapanItWeek セミナーReport ソラコム

Japan IT Weekのセミナーに行ってきましたのでご報告です。
[ソラコム](https://soracom.jp)様
###IoTで変わるものづくり～コネクテッドがもたらすビジネス進化～

以前まではスタートアップに時間がかかっていたが
現状、だいぶ開始するにあたり、障害が少なくなってきており、必要な部品が分かってきており、スタートがしやすくなってきている。

事例を聞いている限りでは、IOTの実施については、定点観測が非常に向いている。

紹介いただいた事例
・[うちのめんたいこは無くならない](https://www.fukuya.com/lp/fukuya-iot2019/)
・[ポケトーク](https://pocketalk.jp/?i=pwpd_gnav)
・[水の注文サイクルを最適化するIoTウォーターサーバー](https://www.frecious.jp/news/2018/12/05/%E6%97%A5%E6%9C%AC%E5%88%9D%EF%BC%81%E6%B0%B4%E3%81%AE%E6%B3%A8%E6%96%87%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB%E3%82%92%E6%9C%80%E9%81%A9%E5%8C%96%E3%81%99%E3%82%8BIoT%E3%82%A6%E3%82%A9%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%8C%E7%99%BB%E5%A0%B4%EF%BC%81/)
・[ダイハツ工業　納車までのワクワクを商談に](https://monoist.atmarkit.co.jp/mn/articles/1907/04/news018_2.html)

などなど、いろいろな定点観測の商売が省力化されるような気がしました。

思いつく省力化について
　・農業の定点観測、キットでのリモート操作でのお世話
　・店舗の商品棚のフェイスの観測　と　売上の観測
　・チェーン店の自動発注
Ubuntu 14.04にMariaDB 5.5をインストール（OS標準）

# はじめに

Ubuntu14.04にMariaDB5.5をインストール
親記事：[MySQL, MariaDBの各種インストール方法とEOLまとめ \- Qiita](https://qiita.com/witchcraze/items/72291ee035437ec83273)

## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.6 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.6 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

# apt update; apt install -y mariadb-server
... 略
```

### 各種確認

```shell-session
# service mysql start
# mysql -u root -e'select version();'
+---------------------------------+
| version()                       |
+---------------------------------+
| 5.5.64-MariaDB-1ubuntu0.14.04.1 |
+---------------------------------+
```
『ソフトウェア・ファースト』読書メモ　その2


その１は下記にご参照ください
[『ソフトウェア・ファースト』読書メモ　その1](https://qiita.com/nuanfenglsr/items/3b01c855e34cf0c92178)


#ソフトウェアファーストの実践に必要な変革

##DXの本質
  ・IT活用を「手の内化」すること、自社プロダクトの進化に関わる重要な技術を自分たちが主導権をもって企画・開発し、事業上の武器にしていくことを「手の内化する」という
		
##ポジション別に求められる意識の変化
　・　経営陣は先頭に立つ、自らの言葉で、自社のIT戦略を語らなければいけない
　・　事業開発のBTCモデル（BUSINESS-TECHNOLOGY-CREATIVITY）
　・　マネージャが変われば組織は変わる、担当組織のメンバーが活躍できるようにサポートするのがマネジャーの最も重要な役割
　　　**⇒　組織はリーダーの器以上にならない、だから、リーダーが自ら変わらない限り、組織の変化を求めても無理**

　・　IT活用を強力にすすめていく組織をつくり、競争力を高めていく。「競争力」には２つの意味がある。一つは担当組織を強くしていくことで事業に貢献し、対外的な優位性を保つこと。もう一つは、担当組織のメンバーが転職や社内異動で離脱してしまうリスクを下げること
			
 ・　マネージャがコネクターの役割を効率的に果たすための仕掛けとして、自分自身の「取り扱い説明書」を作って公開するというやり方がある
　　　**⇒なかなか面白いアイディア、実践してみよう**
 ・ 現場社員が常に主役
		
##プロダクト企画のやり方を変える		
　・　ディスラプティブな事業というのは、市場やユーザーが存在しないということです。
　　　**⇒顧客創造のフェーズが必要との理解、イノベーターをまず探しに行こう**

　・　市場をゼロから作り出すほど、新しいコンセプトのプロダクトを企画する場合、市場調査が無意味。作りてが自らほしいものを提供するというプロダクトアウトの考え方が必ずしも悪手ではない
　　　	 
  ・　10Xを目指す（１０倍の速度改善、売上１０倍するなど）
　　　**⇒すごく同感、世の中は10Xは普通のスピード感だとまず認識しなければいけない**
　・　競合に対する見方を変える。「なぜ、その企業はその機能を提供しているのかを考えよう、誰のどんな課題を解決しようとしているのだろうか」
　・　創造性は制約を好む、一方、あえて制約条件をはずして考えることも効果がある
　　 **⇒制約条件をかけたり、外したりして、創造性を活性化させることを意識すべき、制約って本当に制約なのか、先入観や思い込みではないのか、常に考えるべき**		
　・　ソフトウェアがすべてではない、最終的に重要なのは体験がもたらす感情の変化
		
・プロダクトの骨太の方針を決める
　・　PRDを書く
　・　プレスリリースから始まる
　・　インセプションデッキの実施
　　**⇒「我々がなぜここにいるのか」、「夜眠れない問題」、「トレッドオフスライダー」が好き、チーム編成初期、全部やらなくても、必要最低限をやるべき**			
　・　リリース後の運用は最初から考え、ユーザーの利用状況の測定方法を最初から明確
　　**⇒エンジニアチームにこれを理解してもらうのはなかなか難しいと最近気づいた**
　・　全員を幸せしなくていい
　・　ITはすべてではない、OOBE（Out of Box Experience）も重要
　　**⇒自分のサービスはまさにそうです。体験はオンラインとオフラインの全部**			
　・　カスタマサクセスの三つアプローチ
　　・ハイタッチ　深いかかわり
　　・ロータッチ　定期的に開催する研修、展示会
　　・テックタッチ　オンラインフォーム、メール、チャット

　・組織変革を平行して進める

　・変革で全員100％満足させるのは不可能、必要以上に全員に理解してもらうことを目的化しなくてもいい、閾値が25％
　　**⇒なかなか大事なポイント、いつも全員の合意を取ろうと努力していますが、そもそも、その努力は無意義、やるべきことをやりきることに注力しなければいけない、25％の数字感覚は大事**
　・変わりものが今までとは違ったことを始めると、必ず軋轢が生じる。経営陣のサポートが不可欠
　・デジタイゼーションとデジタライゼーション
　　・デジタイゼーション⇒デジタライゼーション⇒DX　という順番
　　・組織文化を変えるヒントは「インナーソース」
　　　・プルリクで組織を跨いでPJに貢献すること
HackerRankの問題を解いてみて感じたこと

###はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているやっきーです。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#Hackerrankとは
[HackerRank(ハッカーランク)](https://www.hackerrank.com)は、プログラミングの問題を解くことのできるサイトです。解いた問題数によってランキング化され、成績が良いと企業からオファーが来ることもあります。
使用できる言語は、C, C++, Java, Python, PHP, Swift など様々です。問題の種類も数多くあります。
<img width="1373" alt="スクリーンショット 2019-10-25 15.24.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499419/05725554-ead0-64ed-8a27-c1762a6f4d7d.png">


#特徴

##1 問題文が英語
このサイトは、全て英語で構成されています。そのため、問題文が英語で与えられています。英語で書かれているため、問題の意味を理解することが難しいことがあります。また、問題文の中に含まれる変数などは一部がコピーできなくなっているため、google翻訳などで日本語に訳すのも難しいです。（意味不明なことが多い。）

##2 コードがある程度与えられている
プログラミングの問題を解くといえば[AtCoder](https://atcoder.jp)が有名ですが、AtCoderとは異なり、HackerRankの多くの問題はコードの一部がすでに与えられていて、そこに新たに関数などを書き足すというスタイルです。そのため、記述されている関数の意味や引数の有無について確認しなければならず、少々面倒な側面もあります。一方で、あらかじめフォーマットがある方がやりやすいという人にとってはメリットになるでしょう。

##3 質問ができる
各問題には「Discussions」というタブがあり、その問題に関する質問を投稿できます。（もちろん英語ですが...）
世界中から参加しているので、どの問題もたくさんの質問・回答があります。

#解いた感想
問題が解けたと思っても、テストケースの一部がエラーになることがあり、原因がわからず苦労しました。特に、"Runtime Error"というエラーが提出時に出たときは時間切れの場合もあり、アルゴリズムを再構築しなければなりませんでした。しかし、テストケースを全て通過したときの達成感がたまりません！
<img width="993" alt="スクリーンショット 2019-10-25 15.27.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499419/6bc415a4-da54-da17-ffa6-48601e5bc605.png">


#参考URL
[HackerRank(ハッカーランク)はプログラミングの問題を解いて企業からのオファーが届くサービス | フリーランスエンジニアNote](https://free-engineer.site/hackerrank/)
[HackerRank](https://www.hackerrank.com)
Ubuntu 14.04にMySQL 5.5をインストール（OS標準）

# はじめに

Ubuntu14.04にMySQL5.5をインストール
親記事：[MySQL, MariaDBの各種インストール方法とEOLまとめ \- Qiita](https://qiita.com/witchcraze/items/72291ee035437ec83273)

## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.6 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.6 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

# apt update; apt install -y mysql-server
... 略
```

### 各種確認

```shell-session
# service mysql start
# mysql -u root -e'select version();'
+-------------------------+
| version()               |
+-------------------------+
| 5.5.62-0ubuntu0.14.04.1 |
+-------------------------+
```
ルベーグ積分入門5　可測関数の性質2

[ルベーグ積分入門４のつづき](https://qiita.com/king_of_theneet/items/296dfde440d0842982a0)
>命題 5.1
$f,g:X\rightarrow \overline{\mathbb{R}}$を二つの可測関数で、f+gが''定義''されているとする。このとき、f+gは可測関数である。
ここで、f+gが''定義''されているとは、f+gが関数として定義されているという意味である。つまり、fとgが、同時に$\infty$と$-\infty$の値をとり、$f+g=\infty-\infty$というようなことが起きない場合を指す。

証明
任意の実数$\alpha$について次の等式を示す。

$\\{x\in X| f(x)+g(x)>\alpha\\}=\bigcup_{q\in \mathbb{Q}}\\{x\in X| f(x) >q\\}\cap \\{x\in X| g(x) >\alpha-q\\}$
$x$を右辺の集合の元とする。ある有理数qが存在して、f(x)>qかつg(x)>a-qとなる。両辺を足してf+g(x)>\alphaとなるので、$x$は左辺の元である。
逆にxが左辺の元だとする。$g(x)$が有限の場合、$f(x)+g(x)>\alpha$のとき、移項して$f(x)>\alpha-g(x)$である。よって$f(x)>q>\alpha-g(x)$となるある有理数$q$がある。よって、xは右辺の元である。$g(x)=\infty$のとき、$f+g$は'定義'されているから、$f\neq -\infty$であるので、$f(x)>q$となるように有理数qを取れる。gは無限大なので、$g(x)>\alpha-q$は成り立つ。
$g(x)=-\infty$となるときはない。
よって、等式は示された。

右辺は、有理数全体にわたる和なので、自然数にわたる和に書き換えられる（自然数と有理数には１対１対応がある）ので、可測集合である。よってf＋gが可測関数であることが示される。
証明おわり

>命題5.2
$f,g:X\rightarrow \mathbb{R}$が可測関数であるとき、fgは可測関数である。

証明
$fg=\frac{1}{4}\\{(f+g)^2-(f-g)^2\\}$という関係が成り立つので、前に示した命題４.2と命題5.1を使えば、可測関数である。
ラクスル、CAMPFIRE、mixiなどが参加! SIerで働くU30エンジニア向けキャリアフェア に 行ってきた話

# 目的

- 題名のキャリアフェアに言ってきた内容を書く。  
(筆者の主観によるレポートになります、一部事実とは異なる可能性があります。)

# 参加したキャリアフェアの内容

- kiitokさんが主催するキャリアフェアである。
- SIer企業からWeb系企業に転職したいU30の方向けのイベントである。
- 希望制で企業さんとカジュアル面談をすることができる。
- 参加者どうしでもコミュニケーションをとることのできる懇親会も設定されている。

# 今回参加させていただいたmeetupの詳細ページ
- connpassのリンクを下記に記載する。  
[ラクスル、CAMPFIRE、mixiなどが参加! SIerで働くU30エンジニア向けキャリアフェア](https://kiitok.connpass.com/event/147142/)

# kiitokって？？
- エンジニアのためのコミュニティ
- 現職の相談に乗ってくれる
- キャリア相談にも乗ってくれる
- meetupなどを実施してエンジニアの交流の手助けをしてくれている
- 現役エンジニアに相談することができる数少ないサービス
- 筆者おすすめのサービスなので、ぜひ一度書きサイトにアクセスしてみてほしいです。
- kiitokのコミュニティの各リンクを下記に記載する  
公式ページ: [https://kiitok.com/](https://kiitok.com/)  
Twitter: [https://twitter.com/kiitok_official](https://twitter.com/kiitok_official)  
connpasグループ: [https://kiitok.connpass.com/](https://kiitok.connpass.com/)

※登壇された方の人数が多いため今回は割愛します。詳しくはconnpassのリンク先をご覧ください。

# このイベントに参加することのメリット

- 各企業さんの考え方や空気感がわかる。Wantedlyや企業公式ページでは伝わらない情報がわかる。
- 懇親会では企業の方から積極的に話しかけに来てくれるなど、カジュアル面談を受けなくても良い情報が仕入れられる。
- 参加者どうしでも情報交換ができるため、転職で困っていることの相談や解決方などを聞ける。
- どうしても一人になりがちな転職活動を一緒に頑張る仲間が見つかる。
- 今まで企業名は知っていたがどんな考え方を持っているかわからない企業との運命的な出会いがある。

# 筆者がkiitokのイベントに参加することをおすすめする理由(ステマではなく真面目におすすめなんです)

- 実際に現役で働いているエンジニアに相談することができる。
- 同じ目標に向かって頑張る仲間ができる。
- LTイベントなどで登壇される方々の内容がとても勉強になる。
- 参加しやすいイベントが多いので勉強会やmeet up初心者にも自信をもっておすすめできる。
- 転職系のイベントを多くやっているのでチャンスが掴みやすい。  
※少しでも気になった方々は一度で良いので下記のリンク先に足を運んで見てください！  
公式ページ: [https://kiitok.com/](https://kiitok.com/)  
Twitter: [https://twitter.com/kiitok_official](https://twitter.com/kiitok_official)  
connpasグループ: [https://kiitok.connpass.com/](https://kiitok.connpass.com/)
UnityAds導入備忘録

#はじめに
これは最近UnityAdsを触って導入に手間取ったのでいろいろと忘れないようの備忘録です。
サンプルコードなどはないので詳しくは
[Unity公式Adsドキュメント](https://unityads.unity3d.com/help/unity/integration-guide-unity#basic-implementation)
を参考にしてください。

#何に困ったか
公式のドキュメントには最初にAsset StoreからUnity Monetizationをインストールしてください(Unity Adsアセット)と書かれていたので素直にインストールしたところ重複するファイルがあるというエラーが起き，フォーラムを見ると同様のエラーが起きていて解決策もよくわからなかった。
#何が原因だったのか
Unity2018.1~ 本格的にPackageManagerに導入されこれがデフォルトでインストール（いつのバージョンからデフォルトになったかは検証なし）されているためAsset Storeからインストールするといくつかのファイルが重複しエラーが起きるという物でした。今回私が使ったのはUnity2018.3.0でしたのでこのエラーが起きたようです。これ公式のフォーラムの回答にも重複しますまで書いてあるので早くマニュアル直して欲しいです。
#解決方法
ここまで読めばそれはそうなんですが私はPackage Managerの方をremoveしてアセットストアの方を入れ直したら直りました。ゴリ押しです。
上のリンクから公式のコードをはっつければデモ広告表示ができるようになるので是非試してみてください。
RailsのFactoryBot で transient / association / before create / aftter create などを使わずに ほぼtrait だけで関連データを生成する例  ( #Rails )

- コードはイメージである
- DSLなので？わりと上から順に評価してくれる気がする
- transient や after や before やらをさんざんとこねくり回したあげく、attributes を上から一つずつ順に書いていって、if else などで分岐させる方法が落ち着きや良さそうなことに気づいた状態

```rb
FactoryBot.define do
  factory :user do
    trait :student do
      state { :student }
    end

    friend do
      if state == :student
        create :friend
      else
        nil
      end
    end

    friend_name { friend ? friend.name : (create :friend).name }
  end
end

```

# FactoryBotというDSLはなかなか手ごわい

- 柔軟なことをしようとすると途端に行き詰まる感じがする
- ひとつが成り立つと1つが成り立たず、関連テストがばったばったと落ちたりする。
- 評価順は trait -> transient -> before  -> after だろうか？そんな単純な話ではないのかもしれないし、あるのかもしれない。
- DSL なので do end の中で binding.pry しても、実行時のデバッグができるわけではない。



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2627








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
numpyで文字列の配列を作る際の注意点

## はじめに
後世の人たちが私のような愚かなはまり方をしないよう、この書を残す。

## 問題
データ型を指定せず文字列の配列を作ると、それはUなんたらというdtypeになる。
dtype=strと指定しても同様。

```Python:ソース
import numpy as np
arr=np.array(["A","AB","ABC","ABCD"],dtype=str)
print (arr)
print (arr.dtype)
```
```Python:結果
['A' 'AB' 'ABC' 'ABCD']
<U4
```
不等号はリトルエンディアンを、UはUnicodeを意味し、数値は**文字数**を示す。つまり、変数の文字数が固定されているのだ。
後で加工された文字列の文字数がこの値を超過するとはみ出た分は失われてしまう。

```Python:ソース
arr[1]=arr[1]+"XYZ"
print (arr[1])

arr[2]="XYZ"+arr[2]
print (arr[2])

arr[3]="まったく別の文字列"
print (arr[3])
```

```Python:結果
ABXY # "AB"+"XYZ"だが"ABXYZ"ではない
XYZA # "XYZ"+"ABC"だが"XYZABC"ではない
まったく # "まったく別の文字列"ではない
```

これはnp.fullやnp.emptyでも同様。

```Python:ソース
arr1=np.array(["A","B","C"])
arr2=np.array(["X","Y","Z"])
arr=np.empty(3,dtype=str)
for i in range(3):
  arr[i]=arr1[i]+arr2[i]

print(arr)
```
```Python:結果
['A' 'B' 'C']
```
np.emptyで確保されたのは1文字分だけなので、AXやBYやCZを格納することができないわけだ。
2文字以上の文字列でもってnp.fullしたときもdtype=strを指定すると1文字になってしまう。さすがにこれは意味不明だ。

```Python:ソース
# dtype=strを指定した場合
arr=np.full(3,"ABC",dtype=str)
print (arr)
print (arr.dtype)
```
```Python:結果
['A' 'A' 'A']  # ["ABC" "ABC" "ABC"]になってくれない
<U1  # 1文字分しか確保されていない
```

```Python:ソース
# dtypeを明示しない場合
arr=np.full(3,"ABC")
print (arr)
print (arr.dtype)
```
```Python:結果
['ABC' 'ABC' 'ABC']  # 正しく定義されるが
<U3  # 文字数が決まっているので加工しづらいことに変わりはない
```

## 対策
任意の文字数の文字列を格納できるようにするには、dtype=str でなく**dtype=object**と指定する。

```Python:ソース
arr=np.array(["A","AB","ABC","ABCD"],dtype=object)

arr[1]=arr[1]+"XYZ"
print (arr[1])

arr[2]="XYZ"+arr[2]
print (arr[2])

arr[3]="まったく別の文字列"
print (arr[3])
```
```Python:結果
ABXYZ
XYZABC
まったく別の文字列
```


## 次回予告
もともとは、Excelのセル番地を模した

```Python:
[['A0' 'B0' 'C0' 'D0' 'E0']
 ['A1' 'B1' 'C1' 'D1' 'E1']
 ['A2' 'B2' 'C2' 'D2' 'E2']
 ['A3' 'B3' 'C3' 'D3' 'E3']]
```
といった配列を手打ちでなくプログラムで作成して、それを元にnumpyのスライスやOpenCVの画像トリミングについて勉強するつもりだった。
ところがうまくいかず、「文字列の連結は+だよな？ 文字列と数値は連結できないのでstr()を使うんだよな？」と基本に立ち返っても駄目で、ググりまくって今回の発見に至った次第。
次こそはスライスの勉強をするぞ。
rake db:migrate実行するとrake aborted!とはじかれてしまうエラー対処法

#[結論（解決方法）]
１〜３：現在起動されてるrakeのバージョンをアンインストールし、Gemfileが必要としているrakeのバージョンをインストール
４：bundle update rakeでアップデート
５・６：再度rake db:migrateでマイグレーションし、rails sでサーバー再起動

参考記事：
https://qiita.com/ARTS_papa/items/41e2868273dd344cd317

##[エラー背景]
ツイート投稿Webアプリを作成中、ログイン機能を実装したく、devise Gemをインストールし、usersデータベースを作成しようとrake db:migrateしたところ、下記エラー出現・・・！

<b>[エラー文]</b>
rake aborted!
Gem::LoadError: You have already activated rake 13.0.0, but your Gemfile requires rake 12.3.3. Prepending `bundle exec` to your command may solve this.
<b>[訳]</b>
rakeが中断されたお！
Gemのロードエラー：君が起動してるrakeはバージョン13.0.0だけど、君のGemfile君は12.3.3のrakeを求めてるぜベイベ。bundle execコマンドでこのすれ違い問題解決してちょ！

![スクリーンショット 2019-10-26 18.14.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512974/19939854-cc6d-8114-05a3-22244492281b.png)

13.0.0だろうが12.3.3だろうがどっちでもいいだろうがああああ！プログラミングちゃんはほんとわがままなんだから★
エラー文に出ていた、bundle execコマンド諸々は試しましたが歯が立たず、下記の手順で試したところうまくいきました！

##[解決手順]
####１：現在gemで使われてるrakeのバージョンを確認
（ターミナル上でgem list rakeコマンド実行）

```ターミナル
$ gem list rake

*** LOCAL GEMS ***
rake (13.0.0, 12.3.3, 12.3.0)
```
ふむふむ。今回必要な12.3.3も入ってるけど、13.0.0が起動されちゃってる感じね。

####2：現在起動されちゃってるバージョンのrake（今回の場合は13.0.0）をアンインストールする。
```
$ gem uninstall rake -v 13.0.0
Successfully uninstalled rake-13.0.0
```
これでめでたく13.0.0の野郎とおさらばだぜ、パチパチ

####3：gemファイルで必要とされているバージョンのrakeをインストールする。（私のようにすでに必要なバージョン（今回は12.3.3）がインストール済みなら、３は行わず４へ）
```
$ gem install rake -v 12.3.3
```

####４：bundle update rake コマンドでアップデート！

```
$ bundle update rake
```
ターミナルで下記のように出れば成功！
![スクリーンショット 2019-10-26 18.35.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512974/f2623fd4-81ae-f75b-bedf-0c902c3861a2.png)



####５：ようやく念願のrake db:migrateコマンド実行！
```
$ rake db:migrate
```
無事にマイグレーションできたぜええええ
![スクリーンショット 2019-10-26 18.36.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512974/75bc0844-378e-eed6-a7f6-a8c7e314bb7a.png)

####６：サーバーの再起動は忘れずに★
```
$ rails s
```
Debian 10にMariaDB 10.3をインストール（OS標準）

# はじめに

Debian10にMariaDB10.3をインストール
親記事：[MySQL, MariaDBの各種インストール方法とEOLまとめ \- Qiita](https://qiita.com/witchcraze/items/72291ee035437ec83273)

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y mariadb-server
... 略
```

### 各種確認

```shell-session
# service mysql start
# mysql -u root -e'select version();'
+---------------------------+
| version()                 |
+---------------------------+
| 10.3.17-MariaDB-0+deb10u1 |
+---------------------------+
```
Roboclaw Controller搭載の差動2輪ロボットでオドメトリをしてみよう！

# はじめに
Roboclaw Controllerと呼ばれるモータドライバ搭載の差動2輪ロボットのオドメトリを、ROSを用いて算出してみようと思います。公式推奨のオドメトリ算出コードがGitHubに公開されているので、このコードを用いて、実際にロボットを走行させてオドメトリが取れているか確認しようと思います。ちなみに、ROSの環境構築は書籍や別記事がたくさんあるので、ここでは言及しないです。

# 使用条件
モータドライバ：Roboclaw Controller 2×15
制御コントローラ：Ubuntu mate 16.04 LTS
使用パッケージ：https://github.com/sonyccd/roboclaw_ros

# 事前準備
- このパッケージはdiagnosticが必要なので、入れてない人は先に入れてください。

```
sudo apt-get install ros-kinetic-diagnostics
```
- このパッケージのシリアルポートは`/dev/ttyACM0`です。ROS環境下ではシリアルポートに権限付与させないとおそらく動きません。なので、以下のコマンドを実行するとシリアルポートに権限が付与できます。  
`sudo chmod 666 /dev/ttyACM0`  
しかし、これでは、抜き差しするたびに設定しなければいけないです。そのため、自動で権限付与するようにします。以下のURLにその方法が書いてあります。  
https://qiita.com/fujikawabata/items/9ecdf59d1293fb8686b1

# 注意
自分が使用しているロボットのハードウェアの構成上の問題なのか、実行開始から最大速度指令を出すと、シリアルエラーが発生し電源が落ちてしまう状況になっています。なので、加速度をつけることで徐々に指定の速度に収束するような走行方法に変更しています。既存コードで走行できれば大丈夫です。

```roboclaw_node.py
# 変更前 (261行)
roboclaw.SpeedM1M2(self.address, vr_ticks, vl_ticks)

# 変更後
roboclaw.SpeedAccelM1(self.address, 110, vr_ticks)
roboclaw.SpeedAccelM2(self.address, 110, vl_ticks)
```
加速度の値は適宜、変えてください。(自分は110当たりがちょうどいいと思ったため、この値にしています)

# コマンドによる動作
以下のコマンドを実行することで、トピックメッセージがパブリッシュされます。

    rostopic pub /cmd_vel geometry_msgs/Twist "[0.0, 0.0, 0.0]" "[0.0, 0.0, 0.0]"

ここで、`"[0.0, 0.0, 0.0]" "[0.0, 0.0, 0.0]"`は`"[Twist.linear.x, Twist.linear.y, Twist.linear.z]" "[Twist.angular.x, Twist.angular.y, Twist.angular.z]"`
を表しています。
差動2輪であれば、速度[m/s]はTwist.linear.xに、旋回角速度[rad/s]はTwist.angular.zに書き込めばいいです。(オムニホイールのような全方向移動ロボットだとまた変わります。)
なお、こちらの書き方に変えても実行可能です。
`'{linear: {x: 0.1, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}'`

# Pythonコードによる動作
一定速度で走行するコードを実行してみます。

```roboclaw_node/nodes/twist_pub.py
# !/usr/bin/env python
import rospy

from geometry_msgs.msg import Twist
import time

# Ctrl-cで終了するまで走行しつづける
if __name__=="__main__":
        control_speed = 0.5     # [m/s]
        control_turn = 1.0       # [rad/s]
        rospy.init_node('test_twist')
        pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10)
        try:
                r = rospy.Rate(1)
                while not rospy.is_shutdown():
                        twist = Twist()
                        twist.linear.x = control_speed; twist.linear.y = 0; twist.linear.z = 0
                        twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = control_turn
                        pub.publish(twist)
                        print(twist)
                        r.sleep()
        except Exception as e:
                print(e)
        finally:
                twist.linear.x = 0.0
                twist.angular.z = 0.0
                pub.publish(twist)
```
最後、catkin_makeしてください。

# 実行結果
```rostopic echo odom```によってodomメッセージを購読できます。
![shiba_odometry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413535/6cc8c3ef-084f-0a89-0582-85b369896055.png)
見事にodomメッセージに座標系が更新されていることが確認できますね。

# 最後に
オドメトリは初めて使ったので良い勉強になりました。
Debian 9にMariaDB 10.1をインストール（OS標準）

# はじめに

Debian 9にMariaDB10.1をインストール
親記事：[MySQL, MariaDBの各種インストール方法とEOLまとめ \- Qiita](https://qiita.com/witchcraze/items/72291ee035437ec83273)

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
VERSION_CODENAME=stretch
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y mariadb-server
... 略
```

`apt install -y mysql-server` でもMariaDBが入る

### 各種確認

```shell-session
# service mysql start
# mysql -u root -e'select version();'
+--------------------------+
| version()                |
+--------------------------+
| 10.1.41-MariaDB-0+deb9u1 |
+--------------------------+
```
FROM scratchで作ったような、ログインコマンドの無いdocker containerにログインする

## はじめに

開発向けでなく本番運用のDocker containerの場合、 `FROM scratch` のようにshやbashコマンドの無いシンプルなcontainerを利用すると思います。
そんなcontainerに対してログインして中を覗きたい！となることが個人的によくあるので、やり方を調べました。

## 力技: コマンドが無いならコピーすればいい！

対処は単純で、コマンド実行が可能となるコマンドをコピーして利用すればいい！ 今回はホスト: Ubuntu Linux環境で試しました。

1. コピー対象のコマンドを用意する。 今回は `busybox` を使用しました。 `/bin/busybox` にあるとします。
2. `docker container ps` でログインしたいdocker containerのIDを確認。 ここでは `0123456789ab` とします。
3. `docker cp /bin/busybox 0123456789ab:/` でbusyboxをコピー
4. `docker exec -it 0123456789ab /busybox sh` でコピーした `busybox` を使ってでログイン

```
$ which busybox
/bin/busybox
$ docker container ps | grep some_keyword
0123456789ab        xxxxxxxxxx "run command"     2 days ago          Up 2 days                                                                                                        
$ docker cp /bin/busybox 0123456789ab:/
$ docker exec -it 0123456789ab /busybox sh


BusyBox v1.22.1 (Ubuntu 1:1.22.0-15ubuntu1.4) built-in shell (ash)
Enter 'help' for a list of built-in commands.

/ # 
```

これでログインできたので、あとは好きにデバッグしましょう。

終わったら `rm` で消しましょう

```
docker exec -it 0123456789ab /busybox rm /busybox
```

## 参考
busyboxのコピーを参考にしました: [Debugging “FROM scratch” on Kubernetes](https://ahmet.im/blog/debugging-scratch/)
[docker cp でファイルをホストからコンテナへコピーする](https://noumenon-th.net/programming/2019/03/29/docker-cp/)
Debian 8にMariaDB 10.0をインストール（OS標準）

# はじめに

Debian 8にMariaDB10.0をインストール
親記事：[MySQL, MariaDBの各種インストール方法とEOLまとめ \- Qiita](https://qiita.com/witchcraze/items/72291ee035437ec83273)

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y mariadb-server
... 略
```

### 各種確認

```shell-session
# service mysql start
# mysql -u root -e'select version();'
+--------------------------+
| version()                |
+--------------------------+
| 10.0.38-MariaDB-0+deb8u1 |
+--------------------------+
```
Debian 8にMySQL 5.5をインストール（OS標準）

# はじめに

Debian 8にMySQL5.5をインストール
親記事：[MySQL, MariaDBの各種インストール方法とEOLまとめ \- Qiita](https://qiita.com/witchcraze/items/72291ee035437ec83273)

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y mysql-server
... 略
```

### 各種確認

```shell-session
# service mysql start
# mysql -u root -e'select version();'
+-----------------+
| version()       |
+-----------------+
| 5.5.62-0+deb8u1 |
+-----------------+
```
Automotive Grade Linuxことはじめ (番外編)

社内のひと(ソフトウェア未経験者)に説明する機会があったので、スライドを作りました。

口頭原稿はありません。あしからず。また、情報は、guppyの時代のものです。


***
#タイトルスライド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/25ad1b51-4d25-85d0-e85b-16e7b6d67ed8.png)

***

# page1: What is Software? - ソフトウェアってなに？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/c855cddd-25c0-6fb8-6307-a8f48924f2a5.png)

***

# Page2: How Software is Built - ソフトウェアはどうやってつくられるの？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/d5cc55ce-7530-64ff-0133-419a9ca9ded2.png)

***

# Page 3: Fine Open Source Software in Smartphone
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/3d4537ab-4741-7117-3552-372b2dcc28be.png)

***

# Page 4: Major Trend, How to Build & Sell Software - ソフトウェアビジネスのトレンド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/bb4f2547-d983-a2b5-a7ab-c01bbfb4cc92.png)

***

#Page 5: What happens Software in Vehicle - 車載ソフトウェアに起こっていること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/a40f2c78-f168-b967-d0be-1fdd95285ac7.png)

***

#Page 6: Automotive Grade Linux, What are They - Automotive Grade Linuxとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/18f921d0-ee79-17fe-95f8-283e10464530.png)

***

#Page 7: Automotive Grade Linux, Who Joined? - 構成メンバ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/45797476-e049-edb8-307f-35538d3994b3.png)

***

#Page 8: Automotive Grade Linux, Hardware - ハードウェアの特徴
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/979b25ce-8f6a-f8a4-8254-348dda46e9d5.png)

***

#Page 9: Automotive Grade Linux, Operating System - OSの特徴
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/e7ebbe59-8958-02dd-5d5b-0e2f7e1eea5d.png)

***

#Page 10: Automotive Grade Linux, Releases in Detail - リリース情報
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/2183a61f-e955-872b-75e1-85a7a357343f.png)

[EOF]
引数をコマンドに渡してショートカットする方法[alias]

コマンドが長いとaliasでショートカットしたくなりますよね？

ところで、引数をコマンドに渡してショートカットすることはできるのでしょうか？

今回はその方法を調べたので、まとめておきます。
なお、ショートカットしたいコマンドはgit push $BRANCHNAMEです。


##aliasの書き方
~/.bashrcなどに以下のように書きます。

```~/.bashrc
alias gpu='~/.sh/gitpush.sh'
```

**alias CMD='/path/cmd.sh'**とaliasで設定するショートカットの対象となるコマンドが記載されているファイルのパスを書くことがポイントです。


##ショートカットしたいコマンドが記載されたファイルの配置

aliasで指定したファイルにはこのように書きました。

```~/.sh/gitpush.sh
#!/bin/bash

git push origin $@
```

あとは、ファイルに実行権限を付与して. ~/.bashrcで読み込むだけです。

```
$ chmod +x ~/.sh/gitpush.sh
$ . ~/.bashrc
$ gpu master
```


参考
[Make a Bash alias that takes a parameter?
](https://stackoverflow.com/questions/7131670/make-a-bash-alias-that-takes-a-parameter)


P.S. \$@と\$*の違い
これは備忘録ですが、引数の数が分からない場合の引数の渡し方も調べたところ、\$@と\$*2つあるようでした。
今回は"args1 args2"をひとつの引数としてみなしてくれる\$@"を採用しました。


参考
[Difference between $* and $@ in Shell]
(http://www.theunixschool.com/2011/03/difference-between-and-in-shell.html)

### 2019/10/27-15:43追記

[@angel_p_57](https://twitter.com/angel_p_57)さんから下記のとおり、コメントをいただきました。

>その違いはダブルクォート内で使った場合のものなので、本記事のように裸で使っても違いは出ないです。
"$@"のようにして使うことをお勧めします。

### 2019/11/01-21:11 追記
ダブルクォートの有無で出力結果がどう変わるか検証しました。

#### ダブルクォート有り

```cmd.sh

#!/usr/bin/bash

echo "Printing \$* "
for i in "$*"
do
    echo i is: $i
done

echo "Printing \$@ "
for i in "$@"
do
    echo i is: $i
done
```

#### 実行結果
```
$ . cmd a b "c d" e
$: command not found
Printing $* 
i is: a b c d e
Printing $@ 
i is: a
i is: b
i is: c d
i is: e
```


#### ダブルクォート無し

```cmd.sh

#!/usr/bin/bash

echo "Printing \$* "
for i in $*
do
    echo i is: $i
done

echo "Printing \$@ "
for i in $@
do
    echo i is: $i
done
```

#### 実行結果

```
$ . cmd a b "c d" e
$: command not found
Printing $* 
i is: a
i is: b
i is: c
i is: d
i is: e
Printing $@ 
i is: a
i is: b
i is: c
i is: d
i is: e
```




P.P.S. Twitterもやってるのでフォローしていただけると泣いて喜びます！
[@gkzvoice](https://twitter.com/gkzvoice)
Winodows10 homeでDocker環境を構築 - 参考サイトまとめ，使えるコマンド集 -

#Windows10 homeにDocker環境を構築する
本記事では、Windows10 homeを利用しているユーザを対象としています。
##目標
Windows10 homeにDockerを入れるためのメモです
##内容
少し前から流行始めていたDockerがずっと気になっていたので試しに自分のPC (Windows10 home)に入れてみました。

Dockerが何なのかについては[こちら](https://blog.codecamp.jp/programming-docker-image-container)が個人的にはとてもわかりやすいと思ったのでこちらを参考にしてください。

Dockerのインストールは[こちら](https://qiita.com/idani/items/fb7681d79eeb48c05144)のブログを参考になります。 
とても丁寧に記述されており、特に詰まりもせずにインストールすることができました。

Dockerマシンの追加をしたい場合は[こちら](http://devcenter.magellanic-clouds.com/learning/docker-toolbox.html)が参考になります。
マシン追加、削除、動作開始、停止など入門には必要なことが列挙されています。

##コンテナの作成
インストールしたらコンテナを作成したい！
ということで、これまでの参考記事でもHello Worldのイメージは入れられるのですが、今回はTensorflowを入れてみます。

```ruby:Tensorflow
docker run -it --rm --name tensorflow tensorflow/tensorflow
```
それぞれのコマンドの解説
--it:ターミナルを使うためのオプション
--rm:コンテナから抜けるとコンテナを自動で削除する
--name: コンテナの名前を指定する

また、Jupyter Notebookの場合以下のコードです。

```ruby:Jupyter_Notebook
docker run -p 8888:8888 -it --rm --name ds jupyter/datascience-notebook
```
##コンテナイメージの保存
作成したコンテナのイメージを保存するためには、以下のコードを入力します。

```ruby:Jupyter_Notebook
docker commit ds takeshi1222/ds-Juimage
```

--dsはコンテナの名前 (今回はJupyter Notebookのもの)
--takeshi1222/ds-Juimageはイメージ名 (自由につけていいです)

##終わりに
今回は参考になりそうなサイトと基礎的に使えるコマンドを列挙した形にしました。
これからもっと学んでってわかったことをどんどんまとめていこうと思います。

##参考文献
[JupyterのDockerイメージまとめ](https://qiita.com/kshigeru/items/ea174d6bcacc474f2a51)