OmniAICreator/Qiita-1.07M huggingface dataset:
データベースについてゼロからまとめてみた

# はじめに
データベースについての知識がふわふわしていたので、まとめてみました。
自分のメモのようなものです。
説明が足りてなかったり、逆に無駄なことを書いてたりします。ご了承ください。
また、気になる部分があればコメント頂けると幸いです。

# データベースってなんだい？
- データベースとは
    - データを貯める場所
    - ソフトウェアの世界でDBというと、DBMSを指す
- DBMSとは
    - データベースマネジメント(管理)システム
    - データベースをしっかりと管理して、間違ってデータを消さないように、変なデータを入れないようにする
- CRUDとは
    - create
        - 追加
    - read
        - 検索
    - update
        - 更新
    - delete
        - 削除
- UI
    - ユーザインタフェース
    - ユーザに対しての窓口みたいなもの
    - GUI
        - グラフィカルなインタフェース
        - 視覚的にポチポチする
    - CUI
        - コマンドベースなインタフェース
        - コマンドで命令しながら対話する
        - SQL
- データモデル
    - データを論理的にどのように扱うか
    - RDBMS
    - リレーショナルデータベース
        - 関係データベース
        - データを2次元の表形式で扱い、SQLという言語でデータを操作する
- 多重度
    - 1対1
    - 1対多
    - 多対多
- レコード
    - 行
- フィールド
    - 列
- キー
    - 主キー
        - プライマリキー
        - レコードを一意に特定する
    - 複合で主キーにすることも可(複合キー)
- データモデリング
    - 現実世界のエンティティをDBMSで扱えるデータ形式に置き換えること
    - RDBMSでは正規化という方法を使用する

# 正規化
- 正規化の目的
    - データの冗長性を排除する
    - データの整合性を保つ
- 正規化とは
    - 非正規形とは正規化が行われていないテーブル
    - 非正規形から順に第一正規形、第二正規形、、、第五正規形というように正規度合いを高めていく
    - 実用上は第三正規化で問題ない
- 第1正規化
    - 第1正規形の条件
        - 「テーブル中に繰り返し項目が存在しない」
    - 方法
        1. まずは、一列のテーブルを作成する
        2. 繰り返している部分を見つける
        3. 繰り返している部分を切り出す
        4. 主キーを付ける
    - 第1正規形
        - 第1正規化によって繰返し項目が排除されたテーブル構造
- 第2正規化
    - 第2正規形の条件
        - 「非キー属性が主キーに完全関数従属している」
    - 関数従属
        - ある値を決めると、他のある値が一意に決まること
        - Aが決まるとBが一意に決まる場合、「BはAに関数従属している」という
    - 完全関数従属
        - BがAに関数従属しているときに、Aの部分集合とBの間に関数従属が成り立たない関係のこと
    - 方法
        1. あるテーブルに対して、関数従属を見つける
        2. 関数従属している部分の中で関数従属を見つける
        3. 関数従属ないの関数従属が見つかる場合、その部分を切り出す
        4. そのときのテーブルを「マスタ」という
    - 第2正規形
        - 第2正規化により条件を満たしたテーブル構造
- 第3正規化
    - 第3正規形の条件
        - 「全ての非キー属性において、主キーに対する推移的関係従属性が成立しない」
    - 推移的関係従属
        - A,B,Cの3つの属性があるときに、BがAに従属し、かつAがBに従属しないときしない状態においてCがBに従属する状態のこと
    - 方法
        1. あるテーブルに対して、関数従属を見つける
        2. その関数従属の中で推移的関数従属を見つける
        3. 推移的関数従属を切り出す
        4. そのときのテーブルを「マスタ」という
    - 第3正規形
        - 第3正規化により条件を満たしたテーブル構造
- 制約
    - テーブルに格納されているデータに対して設けられる条件のこと
    - 主キー制約
        - レコードを一意に識別する
    - 一意制約
        - 設定された列に同じ値を格納できない
    - Not Null制約
        - null値を格納できない
    - チェック制約
        - 設定された列には、決められた値のみしか格納できない
    - 参照整合性制約
        - 2テーブル間の主キーと外部キーに設定する
    - デフォルト制約
        - 何も格納されなかった場合に、自動的に値を格納すること

# SQL
- SQLとは
    - Structured Query Language
    - リレーショナルデータベースを扱うための専門言語
    - 基本的にはあらゆるRDBMS製品に共通だが、たまに独自構文や拡張なのがある
- SQLの種類
    - DML
        - Data Manipulation Language
        - データ操作言語
            - SELECT文
            - INSERT文
            - UPDATE文
            - DELETE文
    - DDL
        - Data Definition Language
        - データ定義言語
            - CREATE文
            - ALTER文
            - DROP文
    - DCL
        - Data Control Language
        - データ制御言語
            - COMMIT文
            - ROLLBACK文
            - TRANSACTION文
- MYSQL
    - RDBMS製品のひとつ
    - オープンソースで無償

# おわりに
自分の中の整理のためにデータベース関連のものをまとめました。
参考になれば幸いです。
HTML5のcanvasを用いた bitmap⇒jpegの圧縮変換方法  (サイズそのままに、base64で取得)

###<font color="Blue">HTML5のcanvasを使って<br>bitmapデータをjpegデータ圧縮して<br>画像サイズ（画素数）はそのままに、<br>容量削減できるのを最近になって知った。</font>

#経緯
ドラッグドロップされた画像をページに表示したいとか、
サーバーにアップロードしてページリロード後に再表示したいとか、
そういった類の要求をアプリケーションの機能として実現する必要性がありまして。

レントゲンの白黒写真とか、そういったモノクロ画像や
内視鏡のカラー画像とか、それはそれは多種多様な画像を表示したいという要望がありまして。
(撮影画像を読影して診断を記録するためのシステムでは求められることが多い機能です。)

ある日、
「Webページの表示、データの保存操作が遅い」とか
「たまに保存が失敗する（IEのメモリ増加：別記事予定）」とか
いろいろエンドユーザーから不具合(?)のお問い合わせを頂きまして。

それでなんじゃろかと調べてみた、というのが始まりです。

貼り付けられた画像はー、えーと、
「拡張子は…jpegっと。（最近eありのjpegってあんまり見ない気がするなぁ）」
「ファイルサイズは6MB（んんん？ちょっと大きめか？他の案件だと150KBとかなのに、なんか妙だぞ）」
「これほんとにjpegか？」（binエディタで開いてみる）
「なになに、BMB…ってこれbitmapじゃないすか！やだーー！」
…という前置きはさておき。

というわけで既にありふれている情報かもしれませんが個人的な備忘録も兼ねまして。

#サンプルコード
```javascript:canvas_to_PNG.js
// もともとのソースではこう。
// toDataURLメソッドの第一引数が未指定。
// これだとpng形式になってしまうので、色数の多い画像データとかあまり圧縮率がよろしくない。
var base64 = canvas.toDataURL();
```

```javascript:canvas_to_JPG.js
// 変更後のソースがこう。
// toDataURLメソッドの第一引数に 'image/jpeg' を指定する。これでjpeg形式に圧縮されるので
// 6MB程のカラー画像データも200KB程まで小さくなります(すべてが該当するとは限りません)。
// 特に、主に白黒(と白黒近似のRGB)で表現される画像は効果抜群。
// 黒背景と境界があいまいな肺画像なんかはjpegデータ化は適しているかと。
// ピクセル数は変更ないので、ジャギーもそれほど怖くない！
// toDataURLメソッドの第二引数を指定して品質(0.1~1.0)の変更もできます。
var base64 = canvas.toDataURL('image/jpeg');
```

※詳しくは [HTMLCanvasElement.toDataURL()](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toDataURL #Setting_image_quality_with_jpegs "HTMLCanvasElement.toDataURL()") 参照

#雑感
今までは.NET周りのデスクトップアプリケーションメインで開発が多かったですが、
さすがにWeb系の技術を仕事でも使うとなったらこういう細かい問題もノウハウとして蓄積しないといけないですね。

※こんな風に問題を調べて解決案（という名のある種の妥協案）を見つけたときが一番楽しいし爽快なんです。
※※Qiita初投稿のため、お作法がよくわかっていないことがあるかと思いますので、お手柔らかにお願いします。
Juniper SRXメモ

Juniper SRXの設定をしていて調べたつまんない疑問などをメモします。

## よく見るリンク

* [SRX Getting Started - Configuration Examples & Troubleshooting (JumpStation)](https://kb.juniper.net/InfoCenter/index?page=content&id=KB15694)
* [SKY ATP - Configuration and Troubleshooting (JumpStation)](https://kb.juniper.net/InfoCenter/index?page=content&id=KB31787)

## vlanとirbの違い

* [IRB versus VLAN usage](https://networkengineering.stackexchange.com/questions/34933/irb-versus-vlan-usage)

機能はほぼ一緒、最近のJuniper機種はirbを使ってる。

## Virtual Router環境でDHCPサーバーを動かす

* [[SRX] How to configure JDHCP in a routing instance
](https://kb.juniper.net/InfoCenter/index?page=content&id=KB26897)

バーチャルルーター環境でrouting instanceを作ってその中でDHCPを動かす場合、`set routing-instances` の中に設定を記述する必要がある。

例: `set routing-instances hoge-vr system services dhcp-local-server`

## Dynamic VPNをuntrustじゃないzoneに配置したい

できないそうです。

* [Dynamic VPN on SRX and put VPN users in to security zone possible?](https://forums.juniper.net/t5/SRX-Services-Gateway/Dynamic-VPN-on-SRX-and-put-VPN-users-in-to-security-zone/td-p/110916)

## IDPのPredefined IDP Policy Templatesを上書きしたい

`set security idp active-policy Recommended` とか設定していて、一部例外を作りたいなーと思って設定してcommitすると設定が消えていて驚きますが、そういうことなんだそうです。

ポリシーテンプレートをコピーして別の物を作るか、commit scriptを無効にする必要があります。

* [[SRX] The IDP policy change has been disappeared after commit.](https://kb.juniper.net/InfoCenter/index?page=content&id=KB31859)
* [[SRX/IDP] How to copy or change recommended policy](https://kb.juniper.net/InfoCenter/index?page=content&id=KB28005)

## IDPのポリシーに例外を作りたい

`set security idp idp-policy <policy> rulebase-exempt` で設定します。
前述のように、Predefined IDP Policyを変更したい場合は一旦コピーする等が必要です。

* [Understanding IDP Exempt Rulebases](https://www.juniper.net/documentation/en_US/junos/topics/topic-map/security-idp-policy-rules-and-rulebases.html#id-understanding-idp-exempt-rulebases)

設定例

```config
set security idp idp-policy mypolicy rulebase-exempt rule permit-1 match from-zone any
set security idp idp-policy mypolicy rulebase-exempt rule permit-1 match source-address any
set security idp idp-policy mypolicy rulebase-exempt rule permit-1 match to-zone any
set security idp idp-policy mypolicy rulebase-exempt rule permit-1 match destination-address any
set security idp idp-policy mypolicy rulebase-exempt rule permit-1 match attacks predefined-attacks HTTP:APACHE:HTTPD-MOD-CACHE-DOS
```

## WiFiで接続しているMacから再接続できない

WiFiで接続しているMac（おそらくPCも）から接続していて、一旦閉じて時間経過してから再度開くと、WiFiは通っているのにSRXを通過できないことがある。

arpテーブルからWiFi接続しているMacのMACアドレスが消えていて、arpが更新されないのが原因。SRXのarpテーブルを更新しようにも、SRXはデフォルトでGratuitous ARPを聞かないので更新されない。

以下のコマンドで、Gratuitous ARPを聞くようになる。

```
set system arp passive-learning
```

* [他装置から送信されたGratuitous ARP RequestをSRXが受信した時、SRXのARPテーブルが更新されません。](https://csps.hitachi-solutions.co.jp/juniper/faq/srx/fw/other_01.html)
SeleniumをJQuery風に使えるようにしてみた

SeleniumはWebシステムの自動テストにはとても便利なのですが、
手動でテストコードを書こうと思うと長くなるし
クリックできるようになるのを待つ、actionでクリックする、など
コツを掴まないと思うように操作できず初めはかなりとっつきにくいです。

例えば、ある要素をクリックするだけのコードでも以下のようになります。

```
WebElement element = driver.findElement(By.id("id"));
wait.until(ExpectedConditions.elementToBeClickable(element));
Actions actions = new Actions(driver);
actions.click(element);
```

これを、以下のようにJQuery風に書けるようにしてみました。

`$("#id").click();`

findやchildrenも実装したので、あるテーブルの行数を取得するコードも以下のように書けます。

`$("#id").find("TBODY").children("TR").size();`

これならseleniumを知らなくてもJQueryを使える人なら書けるのではないでしょうか。

使い方は、githubの以下のソースを落として、テストクラス側に以下のメソッドを用意するだけです。
(driverはクラス変数にしておいてください）

https://github.com/widora99/seleniumTest/blob/master/ExtendElement.java

```
public static ExtendElement $(String selector) {
	return new ExtendElement(driver, driver.findElement(By.cssSelector(selector)));
}
```

複数要素を取得したい場合には以下のようなメソッドも作ってください。
（Javaの制約上、戻り値の型指定が必要なのでどうしても別メソッドにせざるを得ません。。）

```
public static List<ExtendElement> $$(String selector) {
	ExtendElement ele = new ExtendElement(driver, driver.findElement(By.tagName("body")));
	return ele.finds(selector);
}
```

ExtendElementは、WebElementを拡張したようなクラスですが
JQuery風にするためにあえてWebElementをimplementsせず、
独自の名前でメソッドを定義しています。
例えば、getText()はtext()に。
doubleClick()はdblclick()にしています。

一番苦戦したのがchildren。
SeleniumのcssSelectorでは">*"の指定がエラーになってしまうので、
仕方なくxPathに変換して取得しています。

```
public List<ExtendElement> children(String selector) {
	List<ExtendElement> elist = new ArrayList<ExtendElement>();
	String xpath = cssToXpath(selector);
	
	List<WebElement> wlist = elm.findElements(By.xpath("./" + xpath));
	for(WebElement welm : wlist) {
		elist.add(new ExtendElement(driver, welm));
	}
	return elist;
}
```
ただし、クラス名をStringで比較してしまうので"img"の指定で"img2"がHITしてしまったり、
複数クラス名の指定ができないといった問題があります。
(closestも同様）

自分の知識ではどうにもできなかったので、
どなたかいい方法をご存知の方がいればコメントかプルリクいただけると助かります。
GitHubでPullRequestを使った開発フロー

## はじめに
今回の内容は、実際に会社でよく使われている手法や有名なOSSのリポジトリなどで使われている手法を、私個人の考えで合成したものです。
ですが、実際の仕事で使っているフローと変わりませんので、実用的なものになっていると思います。
場合によってところどころ合わないなと思うところがあれば、適宜省いたり付け足したりして実用していただければ幸いです。

## 今回重要な用語
- issue (問題定義)
- branch (調べて！)
- merge (branch同士の変更点を結合する)
- push (ローカルで作業した内容を、リモートに反映させる)
- pull request (GitHub上でのMerge要求)
- commit (変更の確定をリポジトリに含める)

## 流れ
**issue -> branch -> 開発 -> push -> pull request**

## 流れの詳細
### issue
全体の開発工程から、できる限り小さな問題に切り出し、その問題をissueとして定義作成します。
`例) ログインパスワードに8文字以上しか設定できないようにする`

issueの粒度はプロジェクトの開発段階によって変わります。
開発初期であればissueの粒度は大きくなり、リリース後であれば1つのバグ対応のみといった小さな粒度になることが多いです。

プロジェクトによっては、GitHubのProject機能を使う場合もあります。
カンバン方式を使用して、タスクをissueよりもまとまった形で整理できます。
Project機能には、カンバンに書かれたタスクをissueとして作成することができます。
そのため、Project機能を使用してタスクをまとめて書き出し(WBSなど)、issueに変換し作業を開始するといった方法が取られます。

### branch
issueを作成したら、それに対応したbranchを作成。(ローカルでの作業)
branch名には作業内容を簡潔に表す名前をつけ、名前の最後に対応するissue番号を付属させます。
`例) git checkout -b valid_password#1`

ブランチを作成したら、そのブランチをリモートにPush。
これによってチームの人が、作業の開始を把握できます。
`例) git push origin valid_password#1`

### 開発
先ほど作成したbranchで作業を始めます。
作業をすると変更をcommitする必要があります。
この時、Gitに慣れていない人は、作業が終わった後に一括でcommitしがちです。
しかし、commitの粒度が大きいとコードレビューをする時などに非常に見づらく、大変です。
最初の間は目安として、**1ファイル**を編集するとcommit、1ファイルの変更が多くなる場合は**1機能**ごとにcommitなど、とにかくcommit間隔を狭めることを意識しましょう。

commit間隔の他に、commitメッセージもかなり重要です。
コミットメッセージを後から見直した時に、メッセージから作業内容がだいたい分かるようにすべきです。
先頭から作業内容の対応するissue番号、
作業の方向性を表す`Add` `Update` `Move` `Remove` `Change` `Rename`等の動詞、
作業内容の説明(外部に公開する場合は英語)、
を元にメッセージを組み立てます。
`例) #1 Add パスワードのバリデーションを追加`

### push
作業が終わったらローカルの変更をpushしましょう。
pushするためには、自分の派生元のbranchの最新の変更をpullしましょう。
pullが正常に完了すればGitHubにpushします。

作業完了のpush以外にも、作業がある程度進めば定期的にpushすべきです。
定期的にpushすることで、全員の作業の**進捗状況が把握**できたり、分からないところがあった場合にGitHubを見せることによって**いつでも質問できる**、といった利点があります。
作業進捗が少しでもあった場合、できれば**１日1回**はPushしましょう。

### pull request
作業したbranchをGitHubにpushしていれば、pull request(以下pullreq)が送れます。
pullreqを送ることによって、結合元branchと結合先branchの変更点や、commitログ、pullreqメッセージをまとめたmerge申請を作成することができます。
そのpullreqは履歴として残るので、後から見直したい時にも便利です。

pullreqの詳細画面には緑色のmergeボタンがあります。
小さなプロジェクトでは自分でmergeしてしまうことも多々あります。
しかし、コードレビューをする場合や、リポジトリの設定で一部の人しかmergeできないようにしている場合もあります。
その場合、mergeしてくれるのを待ちましょう。
mergeしたら結合先の変更をpullでローカルに反映させましょう。
その後、開発フローの先頭に戻ってissueから始めましょう。

## 応用編(小ネタ)
- pullreqのメッセージに`close #1`みたいに書いておくと、mergeされた時勝手にissueがcloseされます。
- CIツールをGitHubと連携させると、pushやpullreqを送った時などに自動的にテストを走らせ、GitHub上でも表示されるようになります。
- pullreqやissueなどのテンプレートをリポジトリに含めることによって、作成時にテンプレートが自動入力された状態から書き始めることができます。
- Slackなどのチャットツールと連携し、GitHubからの通知を適宜チャットツールから見られるようにすると、開発効率が格段に上がります。
Arduino の ATmega16U2 のシリアル通信用 AVR を修復する

　何らかの理由で Arduino がシリアルポートとして認識されなくなってしまった場合に、ATmega16U2 のファームウェアを焼き直して、修復する方法です。
　日本語でまとまった資料がなかったので、備忘録としてまとめておきます。

なお

* OS X
* Arduino Uno R3

を前提としています。

# dfu-programmer のインストール
　ファームウェアを書き込むためのソフトウェアをインストールしておきます。

```bash
$ brew install dfu-programmer
```

# 修復する
## DFU モードにする
　Arduino を PC に接続してから、下記の RESET と GND を短絡します。3 秒ほど待ってからはずして DFU モードにします。
![https://www.arduino.cc/en/uploads/Hacking/Uno-front-DFU-reset.png](https://www.arduino.cc/en/uploads/Hacking/Uno-front-DFU-reset.png)

## ファームウェアを書き込む
　ファームウェアは Arduino IDE に同梱されているので、それを利用します。

```bash
$ cd /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial/
$ dfu-programmer atmega16u2 erase
$ dfu-programmer atmega16u2 flash Arduino-usbserial-atmega16u2-Uno-Rev3.hex
$ dfu-programmer atmega16u2 reset
```

# 修復を確認する
　Arduino を PC につなぎ直して正しく認識することを確認します。
誰でも簡単に3Dゲーム開発 part2 project作成編

## はじめに
こんにちは。ぷるぷえです。
花粉が去ってからというもの、開発効率が3割マシになったような気がします。
今回は、Unityの使い方をおおまかに紹介します。projectの作成までできる方は読み飛ばしてください。
随時質問を受け付けておりますのでお気軽に。

## Unityの起動
まずは、Unityアイコンをダブルクリックして、Unityを起動してください。
"アカウント作成してくれ"と言われるので素直に従いましょう。
アンケートやメールアドレスの確認まで含めても10分もあればできると思います。
ここの説明は割愛しますが、石橋は叩いて渡りたい！という方は、[じゅん@nattou_zeroさんのブログ](http://b00.sakura.ne.jp/main/gamecreate/2015/12/20/post-431/)を参考にしてみてください。

## projectを作成する
新しいゲームなんかを作るときは、projectを新たに作成します。
起動すると、下のような画面になりましたか？
（画像サイズがマチマチなのはご容赦ください。ズボラなのです。）
![UnityLauncher画面.png](https://qiita-image-store.s3.amazonaws.com/0/242292/7f232ca2-bcd3-516b-7769-82bba0f7aa41.png)
ここでは、新規projectの作成や既存projectを開くことができます。
「New」をクリックし、projectを作成してみましょう。
![project作成.png](https://qiita-image-store.s3.amazonaws.com/0/242292/1485dd0d-a79c-de38-adfd-3b635f53633d.png)

 1. Project Name : プロジェクト名
→適当につけたらあとでエライことになります。目的によっていろんな命名規則がありますが、今回は"回次_project名"でいいでしょう。project名は、中身が特定できるand重複しないように設定しましょう。

 2. Location : projectの保存場所
→デスクトップとかにポイするとPCがゴミ屋敷になります。私は、"/.../Documents/誰でも簡単に3Dゲーム開発"の中に保存しました。

 3. Organizaition : ユーザー名
→「organization」とは、組織という意味です。デフォルトでは、ユーザー名が表示されています。普段は気にしないでいいでしょう。

1~3の設定が終わったら、「Create Project」をクリック。以上で、新規projectを作成できました。
↓こんな感じになったら成功です。↓

「写真」

画面左上のメニューから 「フォルダ」→「New project」 でもprojectの作成は可能です。

## さいごに
次回は、Unity内の操作や知識について書きます。
ではまた。
lnコマンドについて No.5

#概要
まず最初にlはL。コマンドを扱う機会があったのでそのまとめ。オプションを全て纏める気などはない。

#目次
[1. lnコマンドについて](#1-lnコマンドについて)
[1-1. lnのオプション](#1-1-lnのオプション)
[2. ハードリンクとシンボリックリンクとは](#2-ハードリンクとシンボリックリンクとは)


#1. lnコマンドについて
文法は

```
ln (オプション) リンク元（ファイル名等）　登録先（リンク名）
```
これでオプションを付けなければハードリンクを作成。-sを付ければシンボリックリンクを作成する。
この際リンク元はファイル名だけでなくディレクトリ名なども可能。ディレクトリ名は階層表示で/usr/work/みたいな。

##1-1. lnのオプション
-sfこのオプションを使ったんですが、この２つを纏めて使用しているのかなと

-s
シンボリックリンクを作成する

-f
すでに登録名が登録されるものであった場合、登録内容を上書き登録する。

#2. ハードリンクとシンボリックリンクとは
ハードリンクとは「ファイルの本名」。シンボリックリンクとは「ファイルの別名」
ハードリンクが長い時などのシンボリックリンクを使用。ただシンボリックリンクを作成するのが最早一般的である。


#参考文献
[lnコマンドについて詳しくまとめました 【Linuxコマンド集】](https://eng-entrance.com/linux-command-ln)
[【 ln 】コマンド――ファイルのハードリンクとシンボリックリンクを作る](http://www.atmarkit.co.jp/ait/articles/1605/30/news022.html)
[「ls -l」コマンドの表示からファイルの属性を理解しよう (3/4)](http://www.atmarkit.co.jp/ait/articles/1605/18/news015_3.html)
よく使うGitコマンド集めました

毎日コマンドを打っていても、いつも使わないものは忘れてしまう。。
よく使うコマンドをまとめておきます。


## 毎日使う基本のGitコマンド

### リモートから変更履歴を取得　【git pull】
```bash
$ git pull
```
毎日最初はgit pull
孤独な人（私）がたまに複数人プロジェクトに入ると忘れがちです。。

### 変更したファイルを登録　【git add】
```bash
$ git add <ファイルパス>
```
複数ファイルを登録したい時は半角スペースを開けて繋げればOK

```bash
$ git add -A
```
全ファイルをいっぺんに登録したい時は -A オプション

### コミット！　【git commit】
```bash
$ git commit -m "Comment"
```
後で迷子にならないよう、コメントを忘れずに！（Myルール）

### リモートに送る　【git push】
```bash
$ git push
```
最後はリモートに送信して作業完了

```bash
$ git push -u origin master
```
初めてpushする時は -u オプションで、どこへpushするのか教えてあげる
上の例だとリモート（origin）のmasterブランチへpush

### ブランチを切り替える　【git checkout】
```bash
$ git checkout <ブランチ>
```
ブランチを切り替える

```bash
$ git checkout -b <ブランチ>
```
新しくブランチを作る時は -b オプション

###ブランチをマージする　【git merge】
```bash
$ git merge --no-ff <マージするブランチ>
```
`<マージするブランチ>` のコミットを今いるブランチにマージします

## よく使うGitコマンド（覚えておきたい）

### リポジトリのコピーを取得する　【git clone】
```bash
$ git clone <リポジトリのURL>
```
リモートで空のリポジトリを作ってcloneしたところにaddして始めるのが好み
`git init` からリポジトリを作る方法も一応覚えておいた方が

### リポジトリの状態を表示　【git status】
```bash
$ git status
```
pushしていないコミットの有無、変更したファイルの一覧、addしたファイルの一覧など

### 変更したファイル内の差分を表示　【git diff】
```bash
$ git diff
```
最新のコミットとaddする前のファイルの差分

```bash
$ git diff <新しいコミットのハッシュ値> <古いコミットのハッシュ値>
```
コミット間のファイルの差分

### addする前段階でファイルへの変更を取り消す　【git checkout】
```bash
$ git checkout <ファイルパス>
```
これもcheckoutです

```bash
$ git checkout .
```
全ファイルの変更を取り消したい時はピリオドを使う

### addを取り消す　【git reset】
```bash
$ git reset HEAD <ファイルパス>
```
ファイルごとに取り消し

```bash
$ git reset
```
全ファイル取り消し

### 特定のコミットまで戻す　【git reset】
```bash
$ git reset --hard <ハッシュ値>
```
これだけだとリモートは戻らないので注意
リモートへは続けて強制プッシュで `git push -f`
`git reset`ではなく`git revert`を使ってコミットを打ち消す方法もあり、そちらの方がコンフリクトが起きない。

### ブランチ操作　【git branch】
```bash
$ git branch
```
ブランチの確認（一覧表示）

```bash
$ git branch -D <ブランチ>
```
ブランチの削除


### ログの表示 【git log】
```bash
$ git log
```
コミット履歴、ハッシュ値を表示

```bash
$ git log --name-status
```
変更したファイルの履歴を表示

```bash
$ git log --graph
```
コミット履歴を視覚的に表示

## 時々使うGitコマンド

### 初期設定 【git config】
```bash
$ git config --global user.name "YourName"
$ git config --global user.email "YourEmail"
```
たまにしか使わないからほんとすぐ忘れる

### リモート設定 【git remote】
```bash
$ git remote set-url origin <新しいリポジトリのURL>
```
リモートのリポジトリURLを変更する
滅多に使わないから忘れてた

```bash
$ git remote -v
```
リモートのリポジトリURLを確認する
得体の知れないリポジトリを発掘した時にどうぞ
JuliaインストールからIJulia起動までメモ 2018-05-21

IJuliaセットアップメモ

juypterは
```
pip install jupyter
```
でインストール済み

* 参考 [Pythonセットアップメモ 2018-05-21](https://qiita.com/eielh/items/b82182fdcef0d3f387a8)

# 要点

```
asdf asdf plugin-add julia
asdf install julia 0.6.2 
asdf global 0.6.2
```

```
$ julia
Pkg.add("IJulia")
notebook()
```

`$ jupyter notebook` から起動しても Juliaが使えるようになってた。

# 作業メモ

* `notebook()`関数はプロセスを作ってるだけ
  * https://github.com/JuliaLang/IJulia.jl/blob/master/src/IJulia.jl#L112
  * そりゃ`jupyter`コマンドから起動しても使えるわけです。
* dockerで使う場合、以下でよさそう
    * http://jupyter-docker-stacks.readthedocs.io/en/latest/index.html
    * `docker run --rm -p 8888:8888 -v "$PWD":/home/jovyan/work jupyter/datascience-notebook`
    *
ITIL + kanbanのわがままなタスク管理術

一見簡単そうで奥深いタスク管理。

普段不定期なタスクが頻繁に発生する環境にいる新人マネージャー、タスク管理の「型」をお探しの方に何らかヒントになれたらと思います。

# もしかしてこんな状況ですか？
１．依頼元が社内外を問わず広範囲（自部門:依頼部門 = 1:N）。
２．自部門のメンバーは少数(3人以下？)。
３．不定期で急に依頼されるタスクが多い。
４．タスクのボリュームはばらばら。数分で対応できるものから数か月以上かかるものまで。
５．期限を聞くと「なるはや～」で返ってくる。
６．依頼手段はなんでもあり(メール、チャット、口頭など)。
７．タスク一覧はあるが、管理がままならない。

# 抱えがちな課題
上記の状況だと自部門でこんな課題を抱えがち。

１．タスク一覧が随時更新されず、自部門メンバー間でも進捗が共有できていない
２．進捗の反映が適時にされないがために、タスクが管理できなくなっていく。もしくは、タスク管理に相当な努力（時間）が必要となる。
３．タスクの優先順位付けができない。最悪の場合、「口頭 > 電話 > チャット > メール」順に優先順位付いてしまう。

# じゃあ、どうすれば？
新規タスクのinterruptが多い環境下では、きっちりした運用策をたててやっていくと変化の速度に遅れてしまいがち。
そのため、ゆるく気楽に管理できる策はないかと考えました。

## ズバリITIL + kanbanのいいとこ取り
チームのタスクへの入り口はITILのインシデントと問題管理から着眼。
着手したタスクの管理は、kanban。

タスク管理の全体イメージはこんな感じです。
![thinking board for everything.jpg](https://qiita-image-store.s3.amazonaws.com/0/257634/303e2dd5-e7d5-c843-b941-dbb102e45c1b.jpeg)

いきなりですが、プロジェクトやルーチンワークも入れました。。一応。

### 不定期な運用・保守
ITILのインシデントとインシデントの原因となる問題解決を分けて考えることから、「インシデント > 問題・改善対応」で優先順位を設定。

一般的な解釈ではないが、自部門の管理対象に関する不定期な以下の要求をインシデントとして定義。
１．アラート
２．リクエスト
３．問い合わせ

以下の通り優先順位を決め、全タスクを消化する(もしくは目指す)。

■タスクの優先順位
１．アラートを最優先して対応
２．リクエストと問い合わせは、基本First in First out
　　期限がある場合は、期限が短いものを優先


上記のインシデントを減らすための問題・改善点があれば、「問題・改善点一覧」へ追記する。

### 改善
インシデント一覧からでなくてもリスクとして想定されることがあれば、一覧に追記する。
ここの項目はその気になれば無限(多分。。)に書くこともできるため、最初からすべてをやることなど考えないようにする。

■タスクの優先順位
以下三つの項目をざっくり評価し、その結果から優先度を決める。
優先度の高いものだけをkanbanのタスクに積む。
１．インパクト：どれだけ組織目標へインパクトがあるか。
２．対応にかかる予想期間
３．気軽さ：対応者が気軽く対応できそうなもの。

上記１，２，３の結果からどうやって優先度を決めるかは自部門内で話し合ってみるとよいかと思います。
例えばすぐ対応でき、かつ気軽くできるタスクから優先度を高くつけるなど。

ただ、問題解決や改善となるとそれなりにタスクのボリュームが膨らむ場合もあるので、基本的にタスク分割した上kanbanにのせましょう。

### プロジェクト、定期運用・保守作業
詳細は割愛しますが、不定期運用・保守対応をしながらもプロジェクトを消化する場合、ルーチンワークがある場合もそれぞれ優先順位を考えながらkanbanへ盛り込む。

### kanbanについて
数多くの参考資料があるので割愛します。
個人的にはyou tubeに公開されているEric Brechnerさんのkanban説明がよかったです。

# 得られた効果
タスク管理という業務自体はなくなりませんが、kanbanへの入り口からタスクを絞りある程度優先順位をつけることができる上、すべてのタスクの状況がkanban上で一目瞭然と見える化できた。

jiraのkanbanテンプレートを使うと該当kanbanの火力（個/週）とタスク毎の平均リードタイムを確認するレポート機能があるため、2～3ヵ月ほど運用実績を積むとデータをもとにチームタスクの予定調整がしやすくなりました。

# まとめ
いざ書き出したら思った以上に複雑そうに見えて伝わらないか少し不安ではあるが、実際運用でやってみるとかなり色んなことがすっきりします。「管理」をされている方にはぜひこの爽快感を味わってもらいたいと思います。
Laravel デフォルトの User クラス以外で Gate, Policy （認可）を使うために必要なこと

## 確認環境

* Laravel 5.6
* PHP 7.1

## 問題

何もせずに使うと次のようなエラーに遭遇する。

```
Type error: Argument 1 passed to Barryvdh\Debugbar\DataCollector\GateCollector::addCheck() must be an instance of Illuminate\Contracts\Auth\Access\Authorizable or null, instance of <独自クラス名> in <アプリケーションへのパス>/vendor/laravel/framework/src/Illuminate/Auth/Access/Gate.php on line 374 
```

## 解決策

認可の仕組みである Gate, Policy を使うためには `Illuminate\Contracts\Auth\Access\Authorizable`
 という interface を実装している必要がある。

この実装は `Illuminate\Foundation\Auth\Access\Authorizable` という trait が存在するので、これを `use` してあげればよい。

```php
<?php

// Authorizable という名前が被っているので AuthorizableContract とする
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Foundation\Auth\Access\Authorizable;

class User implements AuthorizableContract
{
    use Authorizable;

    // ...以下略
}
```

## 参考

* [公式ドキュメント Authorization](https://laravel.com/docs/5.6/authorization)
    * Authorizable についての記載は無い
* [Eloquent Model での実装（デフォルトのやつ）](https://github.com/laravel/framework/blob/5.6/src/Illuminate/Foundation/Auth/User.php)
Pythonセットアップメモ 2018-05-21

Pythonセットアップした時のメモ

# 結論

asdfを利用しているのを想定

```
asdf plugin-add python
asdf install python 3.6.5
asdf global python 3.6.5
pip install pipenv
asdf reshim python
```

確認

```
$ which python 
/usr/local/opt/asdf/shims/python
$ python --version
Python 3.6.5
$ which pipenv
/usr/local/opt/asdf/shims/pipenv
$ pipenv --version
pipenv, version 2018.05.18
```

# 経緯

twitterでいまどきのPythonインストール方法を教えてもらった

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">pyenvで入れてpipenv</p>&mdash; そーだい@初代ALF (@soudai1025) <a href="https://twitter.com/soudai1025/status/998366170167164929?ref_src=twsrc%5Etfw">2018年5月21日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# メモ

* asdf-python も python-build なので、pyenvと大差なさそう。
* virtualenv よくしらないが chroot みたいなものかなとおもったけど、そうらしい
* pipenv はvirtualenvを内包しているようだ
リモートデスクトップ接続で正しいユーザー/パスワードでもログインできなくなった時の対処方法の１つ

この記事はそういうこともあったという事例の１つとして。

1. Windows のリモートデスクトップ接続でユーザー/パスワードを保存してる接続先でいままで問題なく接続できていた。
2. 突然、全ての Windows 環境からログインできなくなった。( パスワードが通らないだけでログイン画面は表示される )
3. Mac 版のリモートデスクトップ接続からはいままで通り何の問題もなくログインできる。
4. Windows 環境からはユーザー/パスワードを再設定してもログインできない。

という状態で悩まされていたのですが、ただ資格情報(ユーザー/パスワード)を[編集]から再設定するのではなく、一旦[削除]してから再設定すればログインできるようになりました。

現象としては異なるのですが時期的に [リモートデスクトップ接続時の認証エラー回避方法](https://qiita.com/SkyLaptor/items/57bd36235a898a1351e3) こちらの記事も関係しているかも知れません。
Golang で Redis のデータを削除 (Delete)

Golang で Redis のデータを削除します。
次のプログラムで作成したデータを削除します。
[Golang で Redis のデータを作成 (Create)](https://qiita.com/ekzemplaro/items/ffd36443f40c61531062)

## プログラム

```golang:redis_delete.go
// ----------------------------------------------------------------
//
//	redis_delete.go
//
//					May/19/2018
//
// ----------------------------------------------------------------
package main
 
import (
	"fmt"
	"net"
	"os"
)

// ----------------------------------------------------------------
func main () {

	fmt.Printf ("*** 開始 ***\n")

	key_in := os.Args[1]

	fmt.Printf (key_in + "\n")

	hostname := "localhost"
	port := "6379"

	conn, err := net.Dial ("tcp",hostname + ":" + port)
	if err != nil {
		fmt.Println(err)
		return
		}

	_, err = conn.Write ([]byte("del " + key_in + "\r\n"))
	if err != nil {
		fmt.Println(err)
		return
		}

	conn.Close ()

	fmt.Printf ("*** 終了 ***\n")
}

// ----------------------------------------------------------------
```

実行コマンドの例

```bash
go run redis_delete.go t1856
```

## 確認したバージョン

```text
$ go version
go version go1.19.2 linux/amd64
```
goでアンダーバー有りフィールドを持つJSONデータをアンマーシャル（変換）する方法

#問題
goでJSONデータをgoのstructにアンマーシャル（変換）するとき、もしフィールドの名前にハイフン```_```があるとはまったりします。

例えばこんなJSONのデータがあります：

```json:KPI
{  
   "today_sells":48,
   "DAU":92,
   "MAU":1849
}
```
生のストリングはこのように：

```
{"today_sells":48,"DAU":92,"MAU":1849}
```

データ変換するためにgoで受け皿のstructを作成して変換すると

```go
type KPI struct {
    TodaySells int
    DAU int
    MAU int
}

var goData = KPI{}
err = json.Unmarshal(json, &goData)
fmt.Printf("unmarshaled data are %v", goData)
```
を実行すると

```
unmarshled data are {0, 92, 1849}
```
と表示されます。
原因はgoの命名規則の推奨通りにgoDataのstructを作ると（フィールド名をエクスポートし、アンダーバーなしのフィールド名を使うなど）、today_sellsのフィールドが変換されなくて、デフォルトの0が入りました。

# 解決方法
structを定義する時にJSONのタグを入れます

```go
type KPI struct {
    TodaySells int `json:"today_sells"`
    DAU int
    MAU int
}
```
上記のようにJSONのタグさえ追加すれば、アンマーシャルができます。
Goでint64配列をソートする

int配列は`sort.Ints()`でソート出来るけど、int64はどうやるんだろう？と調べたら`sort.Slice()`で出来たのでメモしておく。

```slice_sample.go
package main

import (
	"fmt"
	"sort"
)

func main() {
	ids := []int64{
		3, 4, 5, 2, 1,
	}

	// 昇順ソート
	sort.Slice(ids, func(i, j int) bool {
		return ids[i] < ids[j]
	})

	// [1 2 3 4 5]
	fmt.Println(ids)
}
```
RubyMineでのRails実行/ デバッグが失敗する

実行/デバッグ構成 でどう頑張っても```no rails found in sdk```が解決できなかったのでメモ。

「no rails found in sdk」でググると、「.ideaを削除して再起動すると良い」や「Ruby(もしくはRails) > Ruby SDK を正しく指定する」等が出てきますが、私はこれ以前の問題で詰まっていたようなので後世に遺そうと思います。

##状況
・rbenvでRubyを管理していて、Gem自体はプロジェクト内のvendor/bundle下。
・ターミナルでのbundle exec rails server等のコマンドは正常に動作する。
・RubyMine上で実行やデバッグを行おうとするとエラーになり、実行/デバッグ構成画面に```no rails found in sdk```が表示されている。

##RubyMineにbundlerで管理しているGemを認識させる
[RubyMine環境設定記事さま(Rubymineをインストールしたら最初にやるオススメ設定)](https://qiita.com/tmknom/items/0704f48f354c703b2dd2#bundler)のプロジェクト設定の欄に助けていただきました。
プロジェクト作成の際にRubyMine上で```rails new```しなかったからかもしれませんが、
RubyMineがvendor/bundleのRailsを見つけられなくて```no rails found in sdk```が出ていたようでした。

ツール > Bundler > インストール を行うとvendor/bundleを見てくれるようになり、そのプロジェクトのGemを使って実行やデバッグができるようになります。
実行/デバッグ構成のその他SDKからrbenvを指定するのは私の環境では効果がありませんでしたが、これで動くようになった気がします。

真偽のほどはイマイチですが、これで解決できる方がいれば幸いです。
Microsoft SQL Server の 32bit版 と 64bit版は共存可能

#はじめに
タイトルのとおりですが、[Microsoft SQL Server](https://www.microsoft.com/ja-jp/sql-server/sql-server-editions-express) では同一OS環境内に複数インスタンスを稼働させることができますが、バージョン (2008R2, 2012, 2014, 2016, 2017,...) や、32bit用と64bit用を混在させて共存できます。

#参考サイト
- [SQL Server の複数のバージョンおよびインスタンスの使用](https://docs.microsoft.com/ja-jp/sql/sql-server/install/work-with-multiple-versions-and-instances-of-sql-server?view=sql-server-2017) - Microsoft Docs

#確認した環境
Windows Server 2008 R2 Standard 上で、SQL Server 2014 Express with SP2 の 32bit 版と 64bit版をインストールし、それぞれに外部からコネクションを張ることができました（インスタンスごとに聴取ポートは別とし、対応するファイアウォール設定（着信用ポートを開ける）も行います）

#注意点
WOW64ではなく、純粋な64bit用と32bit用をインストールします。

#混在させる需要は？

- 32bit で動作するアプリケーションへ ODBC 登録（例：IBM Notes, Microsoft Access や Excel）しこれを SQL Server でリンクサーバとして利用 、さらに64bit版も同一OS内で使いたい（レポートサービスで大きなデータを使うなど...Express版ではメモリ制約のため無意味かもしれませんが）場合

など...
Stripe でラクラク決済フォーム作成！

# 背景
同窓会のウェブサイトを運営しています。その年会費の支払いをオンライン決済でやることになり、決済フォームの自作を始めました。後述しますが、決済オンラインサービスはStripe を採用。そして、決済という性格上、それなりの見栄えとユーザビリティが必要、それならばCSS フレームワークのBootstrap。ということで、BootStrap とStripe で決済フォームを作ることにしました。

BootStrap は言うまでもなくたくさんの記事、サンプル、稼働例があります。また、Stripe は、カード決済のサービスに加え、決済フォームをつくるためのサービスも提供しており、立派なサンプルがありました。

が、Bootstrap でStripeを、という例が、スニペットはたくさんあったのですが、これ、といったものが少なかったので、開発の過程でつくったシンプルなものを公開することにしました。どうぞご自由にお使いください。

シンプルに作ることを目指したので、使用可能なカードブランドの説明等は一切省き、必要最低限の機能に絞ったものです。

# ソースコードとデモ

[ソースコード](https://github.com/rochefort8/simple-payment-form)
[デモ](https://rochefort8.github.io/simple-payment-form/)

HTML とJavascript のフロントエンドのみです。カード情報を入力しsubnmit すると、Stripe の決済のためのトークン取得を行うものです。本番の決済では、そのトークンを指定して実際の支払いのAPI を実行するのですが、そちらの実装はありません。

index.html にcssとscript をすべて記載し1ファイルで納めたものと、css/js を分離したものと2種類を用意しています。もちろん動作は同一になります。

# 決済サービス「Stripe」について

他の決済サービスとの比較と合わせて、以下の記事が大変参考になります。

[カード決済システム【Stripe】が超便利だったので比較＆レビューしてみた！](https://crosspiece.jp/stripe-review/)

たくさんある決済サービスの中で、Stripe を選んだ理由は、以下になります。

* 実は世界ではメジャーなサービスであること
* 手数料は一律3.6%、それ以外はすべてフリーで利用できること
* SDK が充実しており、ウェブサイトへの導入がカンタンなこと
* 利用可能カードが豊富なこと(JCBも2018年後半から対応されました)
* ユーザの支払いから指定口座への振り込みまでの期間が比較的短いこと
* サポートが充実していること

# 実際に使ってみての所感

「背景」に触れた年会費支払いサイトでの運用を開始しました。そのうえでの所感です。基本、とても使い勝手がよい優れたサービスという所感です。

### ユーザの支払から銀行振り込みまで期間が短い
ドキュメントには「一か月以内」と記載がありましたが、一週間くらいでした。支払い時期や銀行の営業日の都合にも左右されるので、ドキュメント通り一か月かかることもあるかもしれませんが、通常は一週間くらいです。もうひとつ、銀行振り込みの曜日を指定できるのも、他の都合との同期ができるということで、重宝します。

注）JCBはこの期間は1ヶ月でした。

### サポートはとても丁寧
振込先の銀行の口座指定を間違う、という大変なことをやらかしたのですが、丁寧なメールが到着しました。「振込できません」だけでなく、「どうやら口座名義人が違うようです」といった詳細の記載がある案内、それと、その名義人変更に時間がかかっていたら、「いかがですか、更新次第、振込を再開しますよ」と親切な案内も。サポート、大事ですね。

###本番環境への移行もカンタン
他のサービスだと、審査が面倒だったりするようですが、必要事項をきちんと記載すれば、すぐに本番環境が有効になります。テスト環境との切り替えは、それぞれに割り当てられたキーを変えるだけ。

### 支払いキャンセル手数料の負担者に注意！
キャンセルごとに108円かかります。ドキュメントに記載がちゃんとあったのですが、キャンセル料の負担は、「支払者」ではなく、「受け取り側」です。つまり、キャンセルしたら、支払者には支払い額がそのまま返却されますが、受け取り側は、他の受取から108円が天引きされます。

### 本人確認が必要
必須ではないみたいですが。身分証明書の提出が必要。免許証でよい。

### JCB対応
対応しているカードブランドは、標準ではVISAとMaster。JCBは、2018年後半あたりから対応されましたが、サポートにメールで「JCB対応希望」と連絡して申し込み、その後審査を経て使えるようになります。

# 参考文献

Stripe 公式サイト
https://stripe.com/jp

Stripe API Reference
https://stripe.com/docs/api
[WIP]nuttx を STM32f768 discovery で動かしてみた

# はじめに
訳あって、nuttxのNetworking/Audio/Graphics の機能を動かしてみることにしました。数多くのボードに対応してしているnuttxといえど、これらを全て稼動させているものは、残念ながら、なし。nuttxのソースコードを眺めて、Ethernet 用のConfiguration がありそうなSTM32F768i-Discoveryを使うことにしました。これはこれで、動作手順等の情報が少なく、各所に散在する情報を集めてなんとか動かしたので、ここで共有することにします。（現時点ではNetworkingのみ稼働）
# 環境
* Macbook Pro (High Sierra version 10.13.2) 

この手の組み込みの開発環境は、WindowsかLinux がメインで、Mac は手薄なものなのですが、Macbook を主軸として他のソフトウェア開発環境を構築していることもあり、敢えてMacで揃えることに。後述しますが、一点だけどうしてもWindows 環境が必要な項目があり、ガックリw

* 無線LAN ポータブルルーター
ELECOM の[WRH-300WH3-S](http://www2.elecom.co.jp/products/WRH-300WH3-S.html)を自宅のWiFi 環境の子機とし、STM32F768-Discovery の有線LANと接続。

# 開発環境の準備

* nuttx ソースコード入手

以下の２つのgit リポジトリをcloneする。

$ git clone https://bitbucket.org/nuttx/nuttx.git
$ git clone https://bitbucket.org/nuttx/apps.git

* Cross Toolchain 

$ brew install gcc-arm-non-eabi

* kconfig-frontend

$ brew tap PX4/homebrew-px4
$ brew update
$ brew install kconfig-frontends

* ST-Link CLI

本体に、生成されたファームウェアを書きこむためのツール。

$ brew install stink

以下の２点は、Windows マシンへのインストールです。

* ST-Link utility

CLI だけなら、上記のようにmac環境用のものがあるのですが、本体のST-Link のファームウェア更新が必要で、これはWindows 用のST-Link Utility のGUI画面からしか出来ないので、泣く泣くw インストール。

http://www.st.com/ja/development-tools/stsw-link004.html

* STM32CubeF7

nuttxの稼動のためだけなら不要だが、出荷時のデモ等多数のサンプルを収納した開発環境キットは入手しておいて損はない。

http://www.st.com/ja/embedded-software/stm32cubef7.html

# ビルド
Networkingが稼働する（と思われる）defconfig を使う。

$ tools/configure.sh stm32f769i-disco/nsh-ethernet 
$ make

# 生成バイナリの書き込み

st-flash write nuttx.bin 0x8000000

screen /dev/tty.usb..... 115200

これでできた

# 修正箇所

nsh> mkrd -m 1 -s 512 64
nsh> mkfatfs /dev/ram1
nsh> mount -t vfat /dev/ram1 /tmp

# 謝辞
Golang で Redis のデータを作成 (Create)

Golang で Redis のデータを作成します。

## プログラム

```golang:redis_create.go
// ---------------------------------------------------------------
//
//	redis_create.go
//
//					May/21/2018
// ---------------------------------------------------------------
package main 

import (
	"fmt"
	"net"
	"encoding/json"
)

// ---------------------------------------------------------------
func data_prepare_proc () map[string](map[string]interface{}) {
	dict_aa := make (map[string](map[string]interface{}))

	dict_aa["t1851"] = unit_gen_proc ("福井",63152,"1921-10-12")
	dict_aa["t1852"] = unit_gen_proc ("敦賀",28671,"1921-9-25")
	dict_aa["t1853"] = unit_gen_proc ("小浜",81597,"1921-6-14")
	dict_aa["t1854"] = unit_gen_proc ("大野",42178,"1921-4-31")
	dict_aa["t1855"] = unit_gen_proc ("勝山",17859,"1921-6-24")
	dict_aa["t1856"] = unit_gen_proc ("鯖江",28592,"1921-1-10")
	dict_aa["t1857"] = unit_gen_proc ("あわら",42917,"1921-10-19")
	dict_aa["t1858"] = unit_gen_proc ("越前",76231,"1921-12-28")
	dict_aa["t1859"] = unit_gen_proc ("坂井",21978,"1921-5-14")

	return (dict_aa)
}

// ---------------------------------------------------------------
func main () {
	fmt.Printf ("*** 開始 ***\n")

	dict_aa := data_prepare_proc ()

	hostname := "localhost"
	port := "6379"

	conn, err := net.Dial ("tcp",hostname + ":" + port)
	if err != nil {
		fmt.Println(err)
		return
		}

	dict_to_redis_proc (conn,dict_aa)

	conn.Close ()

	fmt.Printf ("*** 終了 ***\n")
}

// ---------------------------------------------------------------
func unit_gen_proc (name string,population int,date_mod string) map[string]interface{} {
	unit_aa := make (map[string]interface{})
	unit_aa["name"] = name
	unit_aa["population"] = population
	unit_aa["date_mod"] = date_mod

	return (unit_aa)
}

// ----------------------------------------------------------------
func redis_socket_write_proc (conn net.Conn,key_in string,json_str string) {
	fmt.Println (key_in)
	fmt.Println (json_str)

	comm_aa := "set " + key_in + " '" + json_str + "'\r\n"
	conn.Write([]byte(comm_aa))


	buf := make ([]byte,1024)
	conn.Read (buf[:])

	fmt.Println (string(buf[0:10]))
}

// ----------------------------------------------------------------
func dict_to_redis_proc (conn net.Conn,dict_aa map[string](map[string]interface{})) {
	for key,value := range dict_aa {
//		fmt.Print (key + "\t")
//		fmt.Println (value["name"])
		output, _ := json.Marshal (value)

		json_str := string(output)
		redis_socket_write_proc (conn,key,json_str)
		}
}

// ----------------------------------------------------------------
```

実行コマンド

```bash
go run redis_create.go
```

## 確認したバージョン

```text
$ go version
go version go1.19.2 linux/amd64
```
Vue.jsでGoogle Analytics風ページネーションを作る

Google Analyticsの表についてるページネーションをVue.jsで実装したメモ。

<img width="1004" alt="vue-ga-like-paginate-table.png" src="https://qiita-image-store.s3.amazonaws.com/0/45634/fa192865-5456-583a-82fc-03bf2f6d28a6.png">

<p data-height="450" data-theme-id="0" data-slug-hash="pVGwMM" data-default-tab="js,result" data-user="taquaki" data-embed-version="2" data-pen-title="GA like paginate table" class="codepen">See the Pen <a href="https://codepen.io/taquaki/pen/pVGwMM/">GA like paginate table</a> by Takaaki Sato (<a href="https://codepen.io/taquaki">@taquaki</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
matplotlibの文字化け問題でハマった時のメモ


matplotlibを使ってグラフ化した時に日本語が文字化けした時にしたことをまとめた備忘録です。


```環境
macOS High Sierra 10.13
Python 3.6.5
```


最初はこんな形で日本語の部分が文字化けしてました。

![Kobito.ElsVTg.png](https://qiita-image-store.s3.amazonaws.com/0/214322/16c01ad5-b469-3de5-d0df-8c81e2ae9289.png "Kobito.ElsVTg.png")


#１.フォントのダウンロード＆インストール
IPAexフォントのダウンロードを下記サイトから行います
https://ipafont.ipa.go.jp/node17#jp

ダウンロードしたフォントをライブラリのフォントに追加します。ユーザ毎でもシステム全体でもどちらでも良さそうですが、今回はとりあえず表示さえ出来れば良いとどちらにも入れました（爆）


```ターミナル
cp ~/Downloads/ipaexg00301/ipaexg.ttf /Users/[ユーザ名]/Library/Fonts
cp ~/Downloads/ipaexg00301/ipaexg.ttf /Library/Fonts/
```


#２.フォントの設定
フォントを入れた後は設定を行う必要があります。
まずはmatplotlibの環境を確認します。

```hoge.py
import matplotlib
print(matplotlib.matplotlib_fname()) #設定ファイルを表示（matplotlibrcは後で作ります）
print(matplotlib.rcParams['font.family']) #現在使用しているフォントを表示
print(matplotlib.get_configdir()) #設定ディレクトリを表示
print(matplotlib.get_cachedir()) #キャッシュディレクトリを表示

#表示結果
['sans-serif']
/Users/[ユーザ名]/.matplotlib
/Users/[ユーザ名]/.matplotlib
```

上記の```sans-serif```が最終的に```IPAexGothic ```変わればOKという事になります。

これでソースに以下の一文を追加することで日本語が表示できるようになります。

```
plt.rcParams['font.family'] = 'IPAexGothic'
```

毎回記述するのが面倒な場合は、先ほど調べた設定ディレクトリ下に```matplotlibrc```を作っておくことで初期設定として記述することもできるようです。

```matplotlibrc
font.family : IPAexGothic # default Font
```

ということでこれで日本語が表示されるはずでしたが・・・
下記のエラーが出て・・・少しハマってしまいました

```
UserWarning: findfont: Font family ['IPAGothic'] not found
```

```print(matplotlib.rcParams['font.family'])```でも```['IPAGothic']```と表示されているので設定などは問題なさそうですが・・・



#3.ここから行ったこと色々
キャッシュが残っているのが原因の可能性もあるとのことでキャッシュを消してみました。（改善されませんでした。というよりそもそもこの中にfontList*.cacheはありませんでした。）

```ターミナル
#キャッシュを消す
rm -rf ~/.matplotlib/fontList*.cache
```

同じフォルダに出来ている```fontList.json```が原因という可能性もあるとのことでしたので削除してみました。（改善されませんでした）

```ターミナル
rm -rf ~/.matplotlib/fontList.json
```

フォントもライブラリに間違いなく入れてるし途方暮れましたので、```matplotlib```自体を再インストールしました。

```ターミナル
#ライブラリのアンインストール
pip uninstall matplotlib
#「/Users/[ユーザ名]/.pyenv/versions/3.6.5/lib/python3.6/site-packages/matplotlib/」のディレクトリが削除されたことを確認する
#ライブラリのインストール
pip install matplotlib
```

表示されるようになりました!!
やはり困った時は初めからやり直すというのが基本ですね。何が原因かよくわかりませんが、どこかにキャッシュファイルなどがあったのでしょうか。。（そういえば```/Users/[ユーザ名]/.matplotlib```ディレクトリは残したままでした）

日本語確認用に作ったサンプルソース載せておきます。


```test.py
import matplotlib.pyplot as plt

test_df = pd.DataFrame(columns=['Xデータ', 'Yデータ','Zデータ'])

test_df['Xデータ'] = [1,2,3,4]
test_df['Yデータ'] = [1,2,3,4]
test_df['Zデータ'] = ['あいうえお','愛上大','かきくけこ','牡蠣区家子']
z_data = test_df.plot.scatter(x="Xデータ",y="Yデータ",figsize=(8, 6),s=30)

# 各要素にラベルを表示
for k, v in test_df.iterrows():
    z_data.annotate(v[2], xy=(v[0],v[1]), size=15)
```

![Kobito.OORm3S.png](https://qiita-image-store.s3.amazonaws.com/0/214322/fbd16158-ad4a-72a1-8725-ec5b2fcdfc7e.png "Kobito.OORm3S.png")




■下記のサイトを参考にさせて頂きました。ありがとうございました。
http://akiyoko.hatenablog.jp/entry/2017/04/11/080446
https://qiita.com/hatunina/items/a77128c7f50b19ad2c51
[Kotlin] Retrofit2で自己署名SSLのAPIサーバにアクセスする

公式DOCだと以下に詳しい記載があります。
https://developer.android.com/training/articles/security-ssl

ここで紹介するコードは以下で紹介されているJavaの実装をKotlinに書き換えたものになります。
https://futurestud.io/tutorials/retrofit-2-how-to-trust-unsafe-ssl-certificates-self-signed-expired

```kotlin:UnsafeOkHttpClient.kt
import okhttp3.OkHttpClient
import java.security.cert.X509Certificate
import javax.net.ssl.SSLContext
import javax.net.ssl.TrustManager
import javax.net.ssl.X509TrustManager

fun getUnsafeOkHttpClient(): OkHttpClient {
    val x509TrustManager = object: X509TrustManager {
        override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?) {
        }

        override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) {
        }

        override fun getAcceptedIssuers(): Array<X509Certificate> {
            return arrayOf()
        }
    }

    val trustManagers = arrayOf<TrustManager>(x509TrustManager)

    val sslContext = SSLContext.getInstance("TLS")
    sslContext.init(null, trustManagers, null)

    val builder = OkHttpClient.Builder()
    builder.sslSocketFactory(sslContext.socketFactory, x509TrustManager)
    builder.hostnameVerifier { _, _ -> true }

    return builder.build()
}
```

```kotlin:実行例
val retrofit = Retrofit.Builder()
    .baseUrl("https://192.168.0.100:3000")
    .client(getUnsafeOkHttpClient())
    .addConverterFactory(GsonConverterFactory.create())
    .build()

val myApi = retrofit.create(MyAPI::class.java)
```
【Swift】枠線を任意の場所につける

小ネタです。
上下左右の任意の位置に枠線を配置したくて、それがtextFieldのみでなく、LabelやViewにまでかかってくる始末だったので、こちらの記事を参考に任意の位置に枠線をつける拡張クラスを作ってみました。
https://qiita.com/Simmon/items/5f8aae6b23e3c82cb735


```ruby:CustomView
enum BorderPosition {
    case top
    case left
    case right
    case bottom
}

extension UIView {
    /// 特定の場所にborderをつける
    ///
    /// - Parameters:
    ///   - width: 線の幅
    ///   - color: 線の色
    ///   - position: 上下左右どこにborderをつけるか
    func addBorder(width: CGFloat, color: UIColor, position: BorderPosition) {
        
        let border = CALayer()
        
        switch position {
        case .top:
            border.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: width)
            border.backgroundColor = color.cgColor
            self.layer.addSublayer(border)
        case .left:
            border.frame = CGRect(x: 0, y: 0, width: width, height: self.frame.height)
            border.backgroundColor = color.cgColor
            self.layer.addSublayer(border)
        case .right:
            print(self.frame.width)
            
            border.frame = CGRect(x: self.frame.width - width, y: 0, width: width, height: self.frame.height)
            border.backgroundColor = color.cgColor
            self.layer.addSublayer(border)
        case .bottom:
            border.frame = CGRect(x: 0, y: self.frame.height - width, width: self.frame.width, height: width)
            border.backgroundColor = color.cgColor
            self.layer.addSublayer(border)
        }
    }
}
```

```ruby:ViewController
class ViewController: UIViewController {
    @IBOutlet weak var textView: UITextView!

    override func viewDidLayoutSubviews() {
        self.textView.addBorder(width: 0.5, color: UIColor.black, position: .right)
        self.textView.addBorder(width: 0.5, color: UIColor.black, position: .bottom)
        self.textView.addBorder(width: 0.5, color: UIColor.black, position: .top)
        self.textView.addBorder(width: 0.5, color: UIColor.black, position: .left)
    }
}
```

上記のやり方だとUIViewを拡張しているので様々なクラスで使うことができますが、枠線をviewの内側に生成しているので線の幅が広いとLabel等の文字に被ったりします。
また、部品のサイズが動的に変わったりするとタイミング次第で表示される位置がズレます。

他のいい方法があれば改善&ご教授お願いいたします。
データサイエンスチートシート


https://www.datacamp.com/ で公開されている
データサイエンスでよく使われるチートシートのURLです。

# NumPy Basicsチートシート
http://datacamp-community.s3.amazonaws.com/e9f83f72-a81b-42c7-af44-4e35b48b20b7

# Pandasチートシート
http://datacamp-community.s3.amazonaws.com/9f0f2ae1-8bd8-4302-a67b-e17f3059d9e8

# Matplotlibチートシート
http://datacamp-community.s3.amazonaws.com/28b8210c-60cc-4f13-b0b4-5b4f2ad4790b

# Scikit-Learnチートシート
http://datacamp-community.s3.amazonaws.com/5433fa18-9f43-44cc-b228-74672efcd116

# Jupyter Notebookチートシート
http://datacamp-community.s3.amazonaws.com/48093c40-5303-45f4-bbf9-0c96c0133c40

# データ取り込み
http://datacamp-community.s3.amazonaws.com/50d31142-3de0-4159-89b9-18b718a728ef

# Kerasチートシート
http://datacamp-community.s3.amazonaws.com/94fc681d-5422-40cb-a129-2218e9522f17
flask-sqlalchemy でサブクエリを使う方法

flask-sqlalchemy では sqlalchemy orm が拡張されていて、`db.session.query(Model)` のショートカットとして `Model.query` が使える。これだけで随分とタイプ量が減るし、かなりのところまでカバーできる。ただし SQLAlchemy でサブクエリを行いたい場合は、一筋縄ではいかない。

ぶち当たった壁は「特定のプロパティを持たないオブジェクトの一覧」というクエリ。

いくつかの書き方ができるものの、最終的に落ち着いた方法に最も近いのは、この記事の書き方だった。
https://bitbucket.org/zzzeek/sqlalchemy/issues/3558/joining-subquery-on-relationship

# 具体的なコード

完全なコードにするために少し長いですが、`exclusive_find` が目的の部分で、`aliased` を使ってサブクエリを組み立てます。

```python
import json
import flask_sqlalchemy
from sqlalchemy.orm import aliased
from flask import Flask, request, jsonify

app = Flask(__name__)
db = flask_sqlalchemy.SQLAlchemy(app)

class JSONEncoder(json.JSONEncoder):
	def default(self, obj):
		if isinstance(obj, db.Model):
			return {name: getattr(obj,name) for name in obj.__table__.columns.keys()
				if not name.startswith("_")}
		return json.JSONEncoder.default(self, obj)

app.json_encoder = JSONEncoder

class O(db.Model): # object
	id = db.Column(db.Integer, primary_key=True)
	name = db.Column(db.String)

class P(db.Model): # property
	id = db.Column(db.Integer, primary_key=True)
	o_id = db.Column(db.Integer, db.ForeignKey(O.id))
	o = db.relationship('O', backref='props')
	key = db.Column(db.String)
	value = db.Column(db.String)

@app.route("/", methods=["GET"])
def list():
	return jsonify(O.query.all())

@app.route("/", methods=["POST"])
def put():
	o = O()
	o.name = request.json["name"]
	for k,v in request.json.items():
		p = P()
		p.key = k
		p.value = v
		p.o = o
		db.session.add(p)
	db.session.add(o)
	db.session.commit()
	return jsonify(o)

@app.route("/prop", methods=["GET"])
def find():
	q = O.query.join(O.props)
	for k,v in request.args.items():
		q = q.filter(P.key==k, P.value==v)
	return jsonify(q.all())

@app.route("/prop_ex", methods=["GET"])
def exclusive_find():
	o2 = aliased(O)
	q2 = db.session.query(o2).join(o2.props)
	for k,v in request.args.items():
		q2 = q2.filter(P.key==k, P.value==v)
	
	return jsonify(O.query.filter(~q2.filter(O.id==o2.id).exists()).all())

if __name__=="__main__":
	db.create_all()
	app.run()
```
vim×HHKB(無刻印)に乗り換えたら日々が楽しくなった．

開発環境をMac標準keybordとAtomからHHKBとvimに乗り換えました．
標準keybordでも良いと思いますし，atomでも十分便利かと思います．

## HHKBに乗り換えた理由
- タイピングに手癖がありすぎて矯正するため
- 周りの強い方がHHKBを使っていたので真似した．
- 結果的に投資になるだろうとの思った．

#### 結果
- 手癖が直り，タイポも減った．
- タイピング速度が上がった．
- まだまだ課題はあるが，買ってよかったと思っている．

## vimに乗り換えた理由
- HHKBを買う際に，せっかくだから全部キーボードで操作をしたいと思った．
- 開発速度が上がるのでは？と感じた．　
- Emacsと迷ったが，手が小さいのでCtrキーを頻繁に押したくなかった．

#### 結果
- カスタマイズが楽しい．どこまでも工夫出来て，度々カスタマイズ波がくる．
- プログラミングが更に楽しくなった
- chromeにvim拡張機能を入れると時間短縮出来て．トータル１年くらい時間が増える．

## 参考リンク
- [HHKB (英字配列 無刻印 墨)](http://www.pfu.fujitsu.com/hhkeyboard/lineup/pdkb600bn.html)
- [karabiner (macOS用key設定アプリ)](https://pqrs.org/osx/karabiner/)
- [Vimium (chromeで使っているvim拡張機能)](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb)
- [日本のvimコミュニティサイト](https://vim-jp.org/)
ゲストアカウント(ユーザー)の概念を追加する時に最低限考えるべきこと

## ゲストユーザーとは
正規のユーザーではないが、特別に利用を許可されたユーザー
多くの場合は一時的に、一定の権限に絞られたアカウント(ゲストアカウント)を用いる

## ゲストユーザーの検討時に最低限考えるべきこと

###  1. ゲストユーザーの利用者はどんな人か？
   - 関連協力開発会社? 
   - アルバイト? 
   - コンサルタント?
   - 規制機関?  
  
### 2. ゲストユーザーはどんな利用フローが存在するか？
   - 突発的な利用？
   - 計画的な決められたタイミングでの利用？

### 3. ゲストユーザーにどんな権限をもたせるか?(何ができない?)
   - どんな機能を使いたい？
   - どんな機能は使えなくても問題ない？  

    => **最小権限の原則を強く意識すること**

### 4. ゲストユーザーの作成 or 申請方法はどうするか？
   - どのような方法で作成 or 申請できるの？ 
   - 誰の許可でゲストユーザーを作成できるの？


### 5. ゲストユーザーの更新はどうするか？ 誰が何を更新できるか？
  - ゲスト本人は何が更新できる？ (パスワード？)
  - 管理者は何が更新できる？ (パスワード以外？ パスワード含む？)

### 6. ゲストユーザーの削除はどうするか？ 誰が削除できるか？
  - ゲスト本人も削除できる？ 管理者のみ？

### 7. ゲストが問題発生時、どこがどういう理由で責任を持つのか？
  - 誰が責任を持つの?　その責任の所在を明確にするフローは？

### 8. ゲストの注意/禁止事項はどのようなものが必要か？
   - 注意
     - e.g.
       - 利用する端末にてセキュリティ対策を実施した上でご利用下さい。
       - 払い出したIDに関しての使用、管理の責任は利用者が負うものとし、当社は一切の責任を負いま(ry
   - 禁止
     - e.g.
       - サービスの内容を 複写、再生、複製、送付、 譲渡、頒布、配布、転売、送信、送信可能化、改変、翻案、翻訳、貸与、編集、改変、掲載、転載、公衆送信、販売、提供、二次的著作物の作成、リバースエンジニアリング、逆コンパイル、逆アセンブル する行為、またはそのおそれのある行為
       - ID およびパスワードを他の利用者または第三者に利用、貸与、譲渡、売買、質入
       - 公序良俗関連
       - 犯罪関連
       - 不法行為関連
       - 当社及び関連会社の信用を毀損する行為、またはそのおそれのある行為
       - 当社または第三者の知的所有権を侵害する行為、またはそのおそれのある行為
       - プライバシーを侵害する行為、またはそのおそれのある行為
       -  その他、当社が不適当と判断すること(ry

### 9. 本当にゲストユーザーは必要か？
  - ゲストを作成せずに解決できないか？

実はゲストの存在自体が不要だったりする。
必ずゲストの概念を作成しないと解決できないのか...？

## 後書き
- 実はもっと多く細かく記載したかったが、時間の都合で割愛。
- 丸投げ・とりあえず作れ系案件で要件すらなかった場合、  
  最低限考えておいた方が幸せなことを記載しました。
【RPA】【Blueprism】ことはじめ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/cc844a71-51cc-7b11-f144-562265f5ab56.png)

RPAツール（Blueprism）での開発において、注意すべきことなどをまとめました。

##綺麗なフローを書く
Blueprismでは、一般的なプログラミングによる開発ではなく、フローチャート（以下、フロー）のような図を描くことにより、ロボットの処理を実装する。
ホントにきれいなフローを描く人は、電気回路のような美しいフローを描く。
逆に汚いフローを描こうと思えばいくらでも描ける。例えば、線と線が斜めに交差して入り乱れていて、処理の流れが追いづらかったり、上から下に流れるフローではなく、右や左に流れたりしていると、読む側は非常にストレスとなる。

##他アプリを操作する処理はオブジェクトに記述する
EXCELを開く処理をサブプロセスに記述。親プロセスから呼び出すと、サブプロセス終了時にEXCELが閉じてしまう。
これは、Excel VBOのCleanUpでClose All Instancesされるため。

また、例えばEXCELファイルAをオブジェクトAの関数を用いて開き、そのファイルをオブジェクトB（EXCELを開いたオブジェクトとは異なるオブジェクト）で閉じようとするとエラーとなる。

##アプリケーションモデラーの定義
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/1114a9d8-e320-5f81-6357-3799ac181292.png)
オブジェクトのみ、ブラウザ（IE）やデスクトップアプリケーションのラベル、ボタンなどをパーツとして登録することができる。
属性の定義がゆるいと、予期していないものをつかんでしまう可能性がある。
例えば、複数のダイアログが立ち上がってて、全てに「完了」ボタンがあった場合に、全ての完了ボタンをつかんでしまい、本来押下したかったボタンが特定できずエラー、などといったことが発生しうる。

##変数の扱いに注意
変数が宣言されているプロセス、オブジェクトのページが実行されるたびに、その変数を初期化させることができる。
しかし、例えば、ループ内で使用する変数を定義した際は、1ループごとにその変数を初期化する処理を挟まなければならない。（変数初期化の最小単位はページ実行単位であるため）
また、同一プロセスの他ページでも参照できる変数を作った場合、その変数がどのページで定義されているのかを追いづらく、変数が画面に散らかりがち。
スコープの短い変数は処理の近くに置き、長い変数はMain Pageに配置するなど、ルール化したほうが良い。

##ウェイトを挟む
ロボットの操作対象のアプリケーションによっては、ロボットの処理が速すぎて、ボタンをつかめなかったり、入力欄にパラメータを入力しそびれる、といった事象が稀に発生する。
そのため、適度にウェイトを挟みながら処理を進める必要がある。
（例）画面を開く⇒ウェイト1秒⇒画面をアクティブ⇒ウェイト1秒⇒ボタンにフォーカス⇒ウェイト0.5秒⇒ボタン押下

##チーム開発
一般的な開発だとGitなどでソース管理をするが、blueprismでは難しそう。
各プロセス、オブジェクトをxml形式でエクスポートすることはできるが、アプリケーションモデラーの中身までは吐き出されないので不十分。
また、チーム開発する際は、同じプロセス、オブジェクトを複数人で開発することはできない。

##とにかくエラーハンドリング
正常系を作るのはそれほど時間はかからないが、異常系のパターン洗い出しとその実装に時間がかかる。
ロボットが操作する対象のアプリの仕様を把握しておかないと、想定外のエラーが出たときにロボットがエラーハンドリングができない。
ログイン失敗パターンや、各画面の入力パターン、エラー、警告などのポップアップ表示箇所を網羅するなど、ロボット実装前の調査にも時間をかけたほうが良い。

##EXCELの脆さに留意しておくこと
EXCELに記載されたパラメータをアプリケーションに入力する、といったロボットを作る際は、EXCELを操作するユーザーのEXCELスキルを期待しすぎないこと。
例えば、セルに日付が入るはずなのに「#####...」と変換されてしまい、ロボットがそれを解読できない、とか。
ユーザーが気を効かせてセルの書式などを変更したことで値が読めずエラーとなることもあるので、ブック全体に保護をかけておくなどして、予期しない変更を許容しないようにする工夫が必要。
また、ロボットが稼働してから分かったことだが、ユーザーは思った以上にEXCELに妙な加工を施すことが多く、EXCEL操作系のエラーはかなり頻発する。

##Utilityを信用しすぎない
ライブラリに相当するのが「Utility」。ファイル操作、コレクション操作（Blueprismでは配列のことを「コレクション」と言う）など、汎用的な処理がまとめられている。
実態はVB.NETのソースであり、ソースを新規で作ったり、改修することにより、Utilityを拡張することが可能。
ただし、既存のUtilityの完成度はあまり高くない。エラーハンドリングが記載されていなかったり、そもそも使われていない引数があったりする。
また、改修する際は、既存のUtilityをコピーして別のUtilityを用意し、そちらを改修するのが良いかも。（バージョンアップでUtilityが上書きされる可能性が高いため）

##リリース
リリースするプロセス、オブジェクト、環境変数は「パッケージ」として１セットにまとめることができる。が、なぜか環境変数だけは新しい環境変数の定義をリリースしても上書きされない。
（バージョンアップで改善される？）