OmniAICreator/Qiita-1.07M huggingface dataset:
YouTube動画の音量をMIDIコンで制御する

前回のMIDIコントローラの出力を取得したプログラムを応用して、埋め込みのYouTube動画の音量をMIDIで制御してみました。

MIDIイベント発生時に

```js
player.setVolume(e.data[2] * 0.77);
```

を足しただけで、動画の埋め込みは公式サイトから引用しています。値が最大127なので100になるように調整しています。

```html:html
<div id="player"></div>
```

```javascript:javascript
//Youtubeプレイヤーの埋め込み
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

var player;

function onYouTubeIframeAPIReady() {
	player = new YT.Player('player', {
		height: '360',
		width: '640',
		videoId: 'XXXXXXXXXX', //動画のID
		events: {
			'onReady': onPlayerReady,
			'onStateChange': onPlayerStateChange
		}
	});
}

function onPlayerReady(event) {
	event.target.playVideo();
}
var done = false;

function onPlayerStateChange(event) {
	if (event.data == YT.PlayerState.PLAYING && !done) {
		setTimeout(stopVideo, 200000);
		done = true;
	}
}

function stopVideo() {
	player.stopVideo();
}

//MIDIにアクセス
navigator.requestMIDIAccess().then(function(midiAccess) {
	var inputs = [];
	var inputIterator = midiAccess.inputs.values();
	for (var i = inputIterator.next(); !i.done; i = inputIterator.next()) {
		inputs.push(i.value);
	}

	alert(inputs[0].manufacturer + inputs[0].name);
	inputs[0].onmidimessage = function(e) {
		player.setVolume(e.data[2] * 0.77);
	};
});
```
【SpatiaLite】SQL関数実行時のエラーや警告をまとめて取得するSQL文

動作確認は下図のようなspatialite_guiで行いました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122210/86e46de0-6389-d9ad-17b9-b3250cdf418d.png)


SpatiaLiteで実行したSQL関数でエラーが発生した際、そのエラーは以下のSQLで取得できることがあります。

```sql
SELECT
	GEOS_GetLastWarningMsg() AS "GEOS_warning",
	GEOS_GetLastErrorMsg() AS "GEOS_error",
	GEOS_GetLastAuxErrorMsg() AS "GEOS_aux_error",
	AsText(GEOS_GetCriticalPointFromMsg()) AS "GEOS_critical_point",
	LWGEOM_GetLastWarningMsg() AS "LWGEOM_warning",
	LWGEOM_GetLastErrorMsg() AS "LWGEOM_error"
;
```

SpatiaLiteは内部的にGEOS、LWGEOMのライブラリを呼び出すことがあります。
それらのライブラリがエラーや警告を返した場合に、その内容を表示させる関数を列挙したのが上記SQLです。
どの関数がどのライブラリを利用しているかは、以下の関数一覧をご参照ください。

[SpatiaLite 4.3.0 SQL functions reference list](http://www.gaia-gis.it/gaia-sins/spatialite-sql-4.3.0.html)

特に、関数を呼び出したらよくわからないけど`NULL`が帰ってきた、という場合に、まず上記のSQLをコピペして実行してみると、原因を特定するヒントになるかもしれません。
Amazon machine learning night参加した感想


#自己紹介
qiita初投稿です。
まだ社会人として一年経っていない台湾エンジニアでございます。
一人でそこそこDeep learningを勉強し、開発しています。
#本題
この度のセミナーは、三つのテーマで行いました。
以下は三つのテーマを分けて書きたいと思います。
##AWS machine learning Introduction
講師：Swami Sivasubramanian, VP of Amazon ML

最初に、Amazon web service on machine learningの歴史について話がありました。
こちらに、Amazon Go という新しいサービスを紹介しました。
一つの例としては、量販店内に、カメラを設置して、カスタマーの購入行動を認識し、自動で口座から金額を落とす。
更に、商品広告の最適化とリマーケティングもカスタマーの行動から学習し、分析することができます。

##Amazon Rekognition, Computer Vision
講師：Ranju Das, Director - Amazon Rekognition

画像認識については、大体想像できる機能が提供してます。
オブジェクトとシーンの検出、表情認識、画の節度、顔の比較、有名人の認識、画像内のテキスト
この辺は他のウェブサービスも提供していると思いますが、アマゾンの感知精度が高いと個人的に思います。

動画分析は今回の見出しです。
リアルタイムで、以上で述べた機能は動画でも適用されます。
実際のデモも展示した。（2018/04/19時点で、AWS Rekonitionサイト上のデモと違います）
人の動きと移動の追跡はお見事に追い付きました。
この機能を用いて、スマートハウスのエントリーとか人の行動研究などが活用できると思います。

##Amazon Sagemaker technical update
講師：Sunil Mallya, Sr. AI Solutions Architect, Deep Learning

機械学習する流れは、構築→トレーニング→公開という三つのサイクル。
Sagemakerは、以上のフローを一体化したプラットフォームでございます。
さらに、ビッグデータを処理するため、StreamingとShared State二つのソリューションで、機械学習のスビートを上がることができました。
一般的な機械学習アルゴリズムはサンプル中に入っており、アマゾン独特なアルゴリズムも使えます。
普段より早い、処理できるデータ量も多い機械学習プラットフォームでございます。

##後記
別にアマゾンからお金もらっていないので、ただ自分が思ったことを記録しました。
あくまで個人の意見でございます。

（トランスレータしゃべり早すぎwwwwwあえて、英語に集中しました。
MacでSequel Proのお気に入りを移行する方法

# はじめに

MacBook Proを新しくした際に、Sequel Proのお気に入りを移行する方法がすぐ分からなかったのでメモしておきます。

# 移行方法

公式サイト（ https://sequelpro.com/docs/get-started/faq ）には、 
`~/Library/Preferences/com.sequelpro.SequelPro.plist`
がバックアップファイルとあるけど、このファイルはSQLの履歴とかしか含まれていないようで、このファイルをコピーしてもお気に入りは移行できませんでした。

お気に入りを移行したい場合は、 
`~/Library/Application\ Support/Sequel\ Pro/Favorites.plist`
のファイルをコピーしましょう。

パスワードはKeyChainに保存されているので、初期化済みの端末に移行するのであれば、
 `~/Library/Keychains/login.keychain-db`
を上書きしてしまうのが楽でした。
ActiveSupportがない状況でもクエリパラメータを作る

Rubyでクエリパラメータを作る場合，大体の記事がActiveSupportの `to_param` を使っているのではないでしょうか．

このエントリではActiveSupportを様々な理由で入れたくないけれども，良い感じにクエリパラメータを作りたい場合に有効なサンプルコードを紹介します．

```Ruby 
#!/usr/bin/env ruby

require 'net/http'
require 'uri'
require 'json'


APIID = ENV.fetch("APIID")
AFFIID = ENV.fetch("AffiliateID")

uri = URI('https://api.dmm.com/affiliate/v3/itemList')

uri.query = { api_id:  APIID,
              affiliate_id:  AFFIID,
              site:  "DMM.com",
              keyword: "魔法少女まどかマギカ"
}.map{ |key,val| "#{key.to_s}=#{val}"}.join('&')

json = Net::HTTP.get(uri)
res = JSON.parse(json)
```

主に
`.map{ |key,val| "#{key.to_s}=#{val}"}.join('&')` の部分で実行しています．
クエリパラメータは `=` の前後でkeyとvalがあるため，`to_s` でシンボルから文字列へとキャストし，クエリパラメータの並び順に文字列を設定します．
2つ目以降のクエリパラメータは `&` で連結していくため， `join('&')` などでつけてあげるといいでしょう．

## 追記

[Rack::Utils#build_query](https://github.com/rack/rack/blob/d578847fb978c6be4b7725129ec93feed48d2bc3/lib/rack/utils.rb#L103) を使っても同様のことが出来るようです! 教えていただきありがとうございます!

## URIを使う

[URI.encode_www_form](https://ruby-doc.org/stdlib-2.5.0/libdoc/uri/rdoc/URI.html#method-c-encode_www_form)でも良い感じに出来るようです!!!! やり方は色々ある!!!
共有環境設定

##最新状態にバージョンアップ
```
# sudo su -

# yum update

# yum install -y kernel kernel-devel dkms binutils gcc make patch libgomp glibc-headers glibc-devel kernel-headers
※完了までに時間がかかります

# yum groupinstall -y "X Window System"

# reboot
※再起動が走ります
```
##VirtualBoxメニュー「デバイス」から、「Guest Addtionsのインストール」を選択
##共有PATHフォルダ指定
```
# sudo su -

# uname -r
【VirtualBox起動時のカーネルバージョン】表示

# export KERN_DIR=/usr/src/kernels/【VirtualBox起動時のカーネルバージョン】
# mount -r /dev/cdrom /mnt/cdrom

# cd /mnt/cdrom

# ./VBoxLinuxAdditions.run
※完了までに時間がかかります

# mount -t vboxsf dev_share /home/sv01/www/html -o uid=sv01,gid=sv01

# echo 'mount -t vboxsf 【共有フォルダ名】 /home/sv01/www/html -o uid=sv01,gid=sv01' >> /etc/rc.local
```
##共有PATHフォルダ確認
```
# cd /home/sv01/www/html

# ll
```
C++ Builder XE4 > IDE > IDE Insight search box > TButtonのNameプロパティ(@オブジェクトインスペクタ)にジャンプ

```txt:動作環境
C++ Builder XE4
```

### link

[C++ Builder 10.2 Tokyo, XE4 > 構造の記憶を強いるUI > 検索で見つかるUI > 右上の検索ボックス(IDE Insight search box)からの「To-Doリスト表示」](https://qiita.com/7of9/items/c7b6ec29aa2d4a4aa927)

### スクロールという古いUI

オブジェクトインスペクタのNameプロパティを探すには、「スクロール」という不定量の操作を要求する**前近代的UI**を使っていた。
(例: 平安時代の蒔絵)

使いにくい。。。

### IDE Insight search box。。。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/24474146-2bd6-9032-6a22-43ddbb6cf804.png)

IDE Insight search boxではオブジェクトインスペクタも検索できるようだ (下記手順)。

1. 対象のコンポーネントをクリック (例: TButton)
2. F6
    - >> IDE Insight search boxが開く
3. `name`と入力
4. 「オブジェクトインスペクタ > Name (TComponentName)」を選択
    - >> オブジェクトインスペクタのNameプロパティに飛ぶ

キーボードだけでデザイン作業をどんどん進められる。

### Embarcaderoさん

IDE Insight search boxをもっと宣伝すればいいと思う。
作業効率が飛躍的に高まる。

10.2 Tokyoからはオブジェクトインスペクタの検索ボックスがありますが、IDE Insight search boxを使う方も有用だと思われます。
Rustのhelloworldのコンパイルでつまづいた

[Rust: 2nd Editionの日本語版PDF](https://qiita.com/yyu/items/18df35988f3ea3b12af0)のhelloworldをやってみたときにコンパイルの部分でエラーが出たのでメモ。

```
error: linker `link.exe` not found
  |
  = note: 指定されたファイルが見つかりません。 (os error 2)

note: the msvc targets depend on the msvc linker but `link.exe` was not found
note: please ensure that VS 2013 or VS 2015 was installed with the Visual C++ option
error: aborting due to previous error
```

資料をよく見たらちゃんと書いていたが、VisualStudio2017用のビルドツールが必要だった。

VisualStudio2017用のビルドツールの説明
>これらの Build Tools を使用すると、Visual Studio IDE を必要とせずに、MSBuild ベースのネイティブおよびマネージ アプリケーションをビルドできます。 Visual C++ コンパイラやライブラリ、MFC、ATL、C++/CLI サポートをインストールするオプションもあります。

ビルドツールを入れるためには下記のようにする。

資料の赤枠のところがリンクできるようになっているので、そこを押すとVisualStudioなどの
[ダウンロード画面](https://www.visualstudio.com/ja/downloads/?rr=https%3A%2F%2Fwww.rust-lang.org%2Fen-US%2Finstall.html)に遷移する。

![b_1.png](https://qiita-image-store.s3.amazonaws.com/0/127811/93429040-76f8-152d-28f9-4b54a903e5ff.png)

遷移後の画面の下部に以下のダウンロード項目があるので、これを選択する。
![b_2.png](https://qiita-image-store.s3.amazonaws.com/0/127811/4d607d36-b853-1a22-e77d-22ad65c1e1be.png)

`Visual C++ Build Tools`を選択してインストールすればコンパイルが通るようになる。
![b_3.png](https://qiita-image-store.s3.amazonaws.com/0/127811/3d1f510b-9f5a-f7a0-02f4-06fd779d571e.png)


# 参考
https://qiita.com/yyu/items/18df35988f3ea3b12af0
ツール`Redmineチケット★一括★`を使ったチケットの一括インポート

# ツール`Redmineチケット★一括★`を使ったチケットの一括インポート

Redmineを最近よく使うのですが、バージョンアップなどのことも考えて、なるべくプラグインとか入れたくないなーと。
プラグインを使わないと、インポートする機能が無いので、1つ1つ画面から登録しなきゃいけなくて不便です。
そこで、一括インポートできないかなーと探したところ`Redmineチケット★一括★`というツールが使えることが分かりました。
使い方を忘れないために、メモしておきます。

## ■ツール『Redmineチケット★一括★』

このツールは、下記ページよりダウンロード可能です。
http://www.vector.co.jp/soft/winnt/util/se503347.html

このインストーラを利用してツールをインストール後、以下の作業をすることで対象プロジェクトへチケットを一括登録することができます。
また、登録済みのチケットを更新することも可能です。

- 一括登録用のExcelファイルを開く
- シート「記入例」を参考に、チケット情報を入力する。
- プロジェクトIDやバージョン、トラッカーなどのID情報は、Redmine上でなんとか確認可能ですが、簡単に確認する方法があります。
 - ツール「Redmineチケット★一括★」を起動
 - URLに「 http://{redmine}/ 」を入力
 - APIアクセスキーに入力する値は、Redmineにアクセス＞画面右上の個人設定リンク押下→「APIアクセスキー」に表示されているキー情報を入力する。
 - ツールの「各種IDを確認」ボタンを押下することで、各種ID情報を簡単に確認できます。
- Excelにチケット情報の入力が完了したら、保存してツールにドラッグ＆ドロップし、実行ボタンを押下することでチケットの登録ができます。
[iOS]UICollectionView の余白をゼロにする


Storyboard上で, ```Min Spacing``` を０にする。

![スクリーンショット 2018-04-19 13.10.28.png](https://qiita-image-store.s3.amazonaws.com/0/20722/7caf353c-0d6d-2822-f49c-46900c8f52df.png "スクリーンショット 2018-04-19 13.10.28.png")
AWS、何から勉強したらいい？に対する俺の答え

このツイートがわりと好評だったので解説。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">「AWS、何から勉強したらいい？」に対する俺が考えた回答がこれ。 <a href="https://t.co/ouuP3P27Bu">pic.twitter.com/ouuP3P27Bu</a></p>&mdash; 伊藤 祐策(パソコンの大先生) (@ito_yusaku) <a href="https://twitter.com/ito_yusaku/status/986087059478593536?ref_src=twsrc%5Etfw">2018年4月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# AWS、何から勉強したらいい？
![aws-basic.png](https://qiita-image-store.s3.amazonaws.com/0/243520/d2c3b3a1-ad5b-3e32-594f-983f4b33271d.png)

# これは誰向け？
**メンテナー以上**の領域を目指す人向け。

- オペレータ ... システムの運用、監視、障害調査＆対応をする人
- メンテナー ... システムの拡張、改善をする人
- アーキテクト ... システムを１から設計、構築する人

# 解説
## 各科目の選定基準
- 必修科目 ... AWSを本番運用するにあたって絶対に避けては通れないサービス。
- 重要科目 ... 間違った設計をすると、あとから取り返しがつかないサービス。
- 選択科目 ... 学習量を削るために仕方なく必修から外したが、Webサービスを構築するにあたりほぼ必須となるサービス。

## 必修科目で押さえておくべきポイント
### IAM
- API KEY（プログラムからAWS各種サービスを操作できるやつ）
- IAM Role（API KEYが要らなくなるやつ）
- Rootアカウント（真っ先に閉じなきゃいけないやつ）
- MFA（使わないとアカウントハックされてビットコインをマイニングされちゃうやつ）
- ARN（AWS上のリソースを一意に特定するやつ）

### EC2
- ユーザーデータ(起動時処理を記述できるやつ)
- 169.254.169.254（インスタンスのメタデータを取得できるやつ）

### CloudWatch
- 請求アラート（クラウド破産を防ぐやつ）

### 後まわしでも良いもの
- スポットインスタンス
- オートスケーリング
- Lambda
- ECS

このあたりは基本がわかってきてから手を出そう。

## 重要科目で押さえておくべきポイント
まずはこの図を頭に叩き込んでおいて欲しい。特にEBSの使い方を間違えている人はかなり多い。
![aws-storages.png](https://qiita-image-store.s3.amazonaws.com/0/243520/39e1f188-b453-bd1e-fb42-b7bdb9fae8cc.png)


ざっとこんな感じ。思いついたら付け足すかも。
2010/11/24 ハンガリアン記法でコードをきれいにする方法

昔書いた社内ブログ記事です。

---

どうも（ｐ・∀・ｑ）

  
父にボジョレーを贈り、母に[フットケア](http://babyfoot.co.jp/)を贈り、妹に[中華街](http://www.dalian-kichi.com/)で奢り、

弟はまだ学生なので放置してきた23日は勤労感謝の日でした。  
  
  
さてさて、私のチームでは、PHPのコーディング規約で

[ハンガリアン記法](http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95)のようなものを使用しています。  
  
変数の先頭に、変数の型や意味を現す文字列を付与する記法です。

  
  
＋＋＋　例　＋＋＋  
[![](http://lh4.ggpht.com/_9JzdOC0XbDg/TOvkAvIeJHI/AAAAAAAAAPg/41GGT6D_t3g/s800/20101123.gif)](http://picasaweb.google.com/lh/photo/lxGd6kWSpZ1iE_EU2wdYYQ?feat=embedwebsite)  
  
  
今回はこの記法の概要と、利点、欠点を書いてみます。

  
  
  

**概要**

  
  
例えば私の趣味を配列型の変数に格納する場合（ｐ・ω・ｑ）＜ﾘｱ充ｨｪｨ（←

変数に『配列（`array`）を意味する `ar` 』（ローカルルール）をつけます。

  
```php
$arMyHobbies = array("ネット", "漫画", "手工芸", "映画");
```
  
  
配列をカンマ区切りの文字列に変換するとかよくありますよね。

文字列の変数には『文字列（`string`）を意味する `s` 』（ローカルルール）をつけます。

  
```php
$sMyHobbies = implode(",", $arMyHobbies);
```

  
（`implode()` は、第二引数の配列を、第一引数の文字列で連結し、それを文字列で返します。）

  
  
**利点**

  
  
コードの中でおかしい部分を見つけやすいことが一番の利点だと思います。

  
  
例えば、`implode()` の第二引数は配列でないといけませんが

下のように書いてあったら、第二引数が配列なのか見ただけではわかりません。

  
```php
$mine = implode(",", $yours);
```

  
少し前のコードまでさかのぼって、

`$yours` にホントに配列が入っているか確認しないと安心できません。

  
  
一方、これなら合っている可能性が高いので安心です（ｐ・∀・ｑ）

  
```php
$sMine = implode(",", $arYours);
```

  
  
また、これは間違っている可能性が高いので確認する必要があります（ｐ・д・ｑ）

  
```php
$sMine = implode(",", $sYours);
```

  
  
他にも、この式はおかしいとパッと見でわかります。

  
```php
if($iMailOkFlag === true) {...}
```

  
『整数（`int`）を表す `i` で始まっている』（ローカルルール）ので、

このフラグの値は `1` または `0` のはずだからです。

  
  
本来のハンガリアン記法は変数の型だけでなく、もっと多岐に渡って利用できます。

  
例えば、  
  

*   Webページで入力された生の値が入った変数
    
*   入力値チェック後の変数
    
*   HTMLエンコード後の変数
    

  
これらを区別してみるだけで、入力値チェックをしていない変数を

DBに登録してしまうような間違いが減ります。

  
私のチームでも、Webページからの入力値の種類を区別するために使っています。  
  
  
これについては、[間違ったコードは間違って見えるようにする](http://local.joelonsoftware.com/wiki/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)という記事がお勧めです。  
  
  
**欠点**

  
  
もちろんこの記法に対する反論もあるようです。

  
慣れない人には使いにくいとか、型を変えたときの修正箇所が多いとか。

  
ハンガリアン記法が、型でしか区別できないという誤った意味で流行ってしまったのも

反論者を増やしてしまった一因らしいです。

  
  
それでも私は便利だと思いますけどね・・（ｐ・ω・ｑ）

  
特にPHPは変数を宣言するときに型を書かないので、

関数の返り値の型など明記されている方がわかりやすいです。

  
  
これなら**グループのメンバーを数えた整数値**が返ってきそうですし。

  
```php
$iCount = countMembers($iGroupId);
```

  
こっちだと**実行結果の成否**が返ってくるような予測ができます。

  
```php
$bResult = countMembers($iGroupId, $iCount);
```

  
（ `b` は `bool` を意味して、TRUE/FALSEのこと。）

  
  
  

もしこの記法について知らない人がいたら、  
[間違ったコードは間違って見えるようにする](http://local.joelonsoftware.com/wiki/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)を読んでみてください。  
  
コーディング記法は好き嫌いあると思いますが、  
他の人の書き方を聞くだけでも面白いですよね。  
  
  
大文字小文字混ぜて使うのかどうかとか、  
  
`$iMyStatus`、`isStudent()`  
  
ハイフンを使うのかどうかとか、  
  
`$user-name`、`$user-age`
  
アンスコを使うのかどうかとか、  
  
`$my\_name`、`$get\_my_data()`
  
Companyはどうやって短縮するのかとか（笑）  
  
`$company`、`$comp`、`$cmpn`
電子工作 > Electronic Basics #22: Transistor (BJT) as a Switch > 式の書き起こし

### 関連

[電子工作 > Using Bipolar Transistors As Switches > Bipolar Transistorの式](https://qiita.com/7of9/items/4db135013f5b49bd3d28)

### YouTube動画

[Electronic Basics #22: Transistor (BJT) as a Switch](https://www.youtube.com/watch?v=WRm2oUw4owE)

### 1:09

[BC637NPNトランジスタ](https://www.reichelt.com/de/en/BC-Transistors/BC-637/3/index.html?ACTION=3&GROUPID=7206&ARTICLE=5031)


**2:13 トランジスタから煙** (3Aの電流が流れている)

2:22 VBE: 1V ([データシート](http://cdn-reichelt.de/documents/datenblatt/A100/BC635-640-CDIL.pdf)のPage 1 of 5 Base Emitter (On)Voltage)

2:38 hFEの最小値を確認(25)

### 2:40 式

```math
I_B = \frac{I_C}{\beta} = \frac{310mA}{25} = 12.4mA
```

```math
R_B = \frac{V_{CC} - V_{BE}}{I_B} = \frac{3.1V - 1V}{0.0124A} = 169.3 Ohm
```
150オームを選択。

210mA < 310mAより、希望の電流が出ていない。

3:03 I_C vs V_CE 曲線にてI_B=100uAの例をなぞる。I_Cは30mA以下。

### 3:09

```math
I_B = 12.4mA
```

```math
R_B = \frac{5V - 1V}{0.0124A} = 322.6 Ohm
```
330オームを選択。

(VCCを5Vに変更したようだ)

3:20 LEDがつかないことがある。

### 3:25 BC640PNPに変更

コレクタ負荷の回路図になった。
R1はGNDに接続。

### 3:48 電流消費の大きなランプに交換

3:54 I_C=1Aの最大定格ではランプが付かない。

### 4:00 BD535

[BD535](http://www.st.com/resource/en/datasheet/cd00000915.pdf)さん登場。

4:02 I_C=8A, I_E=8Aの強力なやつ。

4:05

```math
I_C = 3.8A
```

```math
I_B = \frac{I_C}{\beta} = \frac{3.8A}{15} = 0.26A
```

I_Bが0.26Aに減った。

```math
R_B = \frac{6V - 1.5V}{0.26A} = 17.3 Ohm
```
1.5Vは[データシート](http://www.st.com/resource/en/datasheet/cd00000915.pdf)のp3 Base-emitter voltage

15オームの抵抗を選択。

```math
P = 4.5V * 0.3A = 1.35W
```

6Vから1.5Vに落ち(4.5V)て0.26A流れるので、電力Pは1.35W。

4:16 熱くなるのでセメント抵抗登場。

```math
I_B = \frac{4.5V}{10Ohm} = 450mA
```

4:23 I_Cが増えるとhFEは減っていく。

4:35 トランジスタはすぐに熱くなる (70℃)

4:42

```math
P_{base} = 1.15V * 0.43A = 0.5W
```

```math
P_{RB} = 4.85V * 0.43A = 2.1W
```

```math
P_{CE} = 0.94V * 3.5A = 3.29W
```

合計5.89W

4:48 (急いで)放熱プレート装着。

### 5:10 Darlington Transistors登場

9329 [TIP142](https://www.onsemi.jp/PowerSolutions/document/TIP140-D.PDF)

2つのトランジスタが入っている。

5:18 hFEは500にもなる。


```math
I_B = \frac{I_C}{\beta} = \frac{3.8A}{500} = 0.0076A
```

```math
R_B = \frac{6V - 3V}{0.0076A} = 395Ohm
```

R_Bは470オームを選択。

```math
I_B = 6.3mA
```

消費電力少なくランプをオンできた。
Scala+sshj：証明書認証をしないSCPアップロード/ダウンロード


# 始めに
- 意外とある証明書認証を行わないサイトに対して
- SSHJを使用する
- NullHostKeyVerifierを定義する

# build.sbt
```build.sbt
libraryDependencies ++= Seq(
  "com.hierynomus" % "sshj" % "0.21.1"
)
```

# import
```Sshj.scala
import java.io.IOException;
import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.xfer.FileSystemFile;
import net.schmizz.sshj.userauth.UserAuth;
import net.schmizz.sshj.userauth.UserAuthException;
import net.schmizz.sshj.userauth.UserAuthImpl;
import net.schmizz.sshj.userauth.keyprovider._;
import net.schmizz.sshj.userauth.method._;
import net.schmizz.sshj.userauth.password.PasswordFinder;
import net.schmizz.sshj.userauth.password.PasswordUpdateProvider;
import net.schmizz.sshj.userauth.password.PasswordUtils;
import net.schmizz.sshj.userauth.password.Resource;
import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.common.IOUtils;
import net.schmizz.sshj.connection.channel.direct.Session;
import net.schmizz.sshj.connection.channel.direct.Session.Command;
import net.schmizz.sshj.transport.TransportException;
import net.schmizz.sshj.transport.verification.PromiscuousVerifier;
import net.schmizz.sshj.userauth.UserAuthException;
import net.schmizz.sshj.userauth.keyprovider.FileKeyProvider;
import net.schmizz.sshj.userauth.keyprovider.OpenSSHKeyFile;
import net.schmizz.sshj.xfer.FileSystemFile;
import net.schmizz.sshj.transport.TransportImpl
import net.schmizz.sshj.xfer.scp.SCPFileTransfer  
import net.schmizz.sshj.transport.verification.HostKeyVerifier;
import java.security.PublicKey;
```

# 接続

##  証明書認証をしないための設定
- NullHostKeyVerifierを定義

```
class NullHostKeyVerifier extends HostKeyVerifier {
    @Override
    def verify(arg0:String , arg1:Int, arg2:PublicKey ):Boolean={
        true
    }
}
```

## インスタンス作成
```
val ssh:SSHClient  = new SSHClient()
```

## 証明書認証を行わない
```
ssh.addHostKeyVerifier(new NullHostKeyVerifier())
```

## サーバー接続
```
ssh.connect(ホスト名,ポート番号)
```

## ログイン認証
```
ssh.authPassword(ログインID,パスワード)
```

# 切断
```
ssh.disconnect()
```

# SCPダウンロード
```
ssh.newSCPFileTransfer().download(ダウンロードファイル名, new FileSystemFile(フォルダパス))
```

# SCPアップロード
```
ssh.newSCPFileTransfer().upload(new FileSystemFile(アップロードファイル名),フォルダパス)
```


簡単！
Dialogflow v2の会話を継続 or 終了させるメソッドの使い方

先日Dialogflowが遂に API V2へ正式にローンチされました。
今まで使っていたv1のDialogflowAppとは全く別物になってしまいました。。。

終了方法と継続させる方法が変わったのでその方法をお伝えします。

この方のv1時代の記事を参考にさせて頂きました。
https://qiita.com/donchan922/items/304e370bb84557ae43ca

# conv.ask()とconv.close()
会話を継続させる -> conv.ask()
会話を終了させる -> conv.close()

Inline Editorにあるindex.jsを編集します。

```javascript:会話を継続させる
  const agent = new WebhookClient({ request, response }); 

  function welcome(agent) {
      let conv = agent.conv();
      conv.ask("会話を続けるよ！");
      agent.add(conv);

  }

  let intentMap = new Map();

  // Intent名を指定するようになりました。
  intentMap.set('Default Welcome Intent', welcome);
  agent.handleRequest(intentMap);

```

```javascript:会話を終了させる
  const agent = new WebhookClient({ request, response }); 

  function welcome(agent) {
      let conv = agent.conv();
      conv.close("会話終わり！");
      agent.add(conv);

  }

  let intentMap = new Map();

  // Intent名を指定するようになりました。
  intentMap.set('Default Welcome Intent', welcome);
  agent.handleRequest(intentMap);

```

<img width="806" alt="conv.png" src="https://qiita-image-store.s3.amazonaws.com/0/154355/12b48d8a-5d9d-5b90-8b86-a3634862ad9b.png">


#まとめ
Dialogflowがv2になったことで、ごそっとAPIが変更になりました。
今後もまとめていきます。。。変わりすぎて泣きそう(´Д⊂ヽ
jupyter をインストールする


* anaconda3 を入れる。[download](https://www.anaconda.com/download/#linux)
 * anaconda という python (Python 3.6 version)のパッケージをいれます。
 * jupyter も一緒にインストールされます。
 * windows の場合、PATHという環境変数の設定が必要です。インストール時もＰＡＴＨの設定可能です。（何故か推奨はされていません。）。手動で設定もできます。そのときは、下記を設定しましょう。
 
~~~
%USERPROFILE%\Anaconda3;%USERPROFILE%\Anaconda3\Scripts
~~~
* 一緒に vscode のインストール可能、但し、管理者権限が必要
* notebook の設定ファイル作成
 * jupyter notebook --generate-config
 * $HOME/.jupyter に、jupyter_notebook_config.py　が作成される

* jupyter の設定ファイルに下記を設定

設定箇所の説明
```
c.NotebookApp.iopub_data_rate_limit = 0  ←　大きなノートも扱えるようにする。
c.NotebookApp.ip = '*' ← 外部からアクセス可能に、不要ならなしでいいです。
c.NotebookApp.notebook_dir = '/home/tadashi/note' ← 任意なので適宜変更　私は、$HOME/note にしている
c.NotebookApp.open_browser = False　← 起動したときに、ブラウザが開かないように設定。
c.NotebookApp.password = 'sha1:適当に設定'
```

※ sha1 は下記でつくります。
```
ipythonを実行して、ipython 環境にはいって、
下記のコマンドでパスワードのハッシュ値を生成
from IPython.lib import passwd
passwd()
```


* jupyter に拡張をインストール （なくても動く）
 * conda-forge経由で、jupyter_contrib_nbextentions,jupyter_nbextensions_configurator を入れる（使えないことはないが、はいっていた方が便利）インストールのときに、依存するモジュールを結構インストールするようです。
 * これで、拡張機能をインスール可能になる

```shell
conda install -y -c conda-forge jupyter_contrib_nbextensions
conda install -y -c conda-forge jupyter_nbextensions_configurator
#
```
* extension の設定で、code foldingにチェックをいれます。これで、関数などをおりたたむことができて、notebook が見やすくなります。 


* $HOME/note を作業ディレクトリとする（任意）　実際に使用するスクリプトは、シンボリックリンクで設定する
popViewControllerするときに前の画面に値を渡す


画像を選択して選択した画像を前の画面に表示するみたいなことをやりたかったが、ハマったので、個人的なメモとして残しておきます。

## 戻る画面の方に受け取るようにメソッド、もしくは変数を用意する

自分の場合はメソッドを用意しました

```swift

func setSelectedImage(image: PHAsset) {

  // 引数でもらった画像を使ってなんかする
}
```

## popViewControllerする前に値を渡す

```swift
let nav = self.navigationController
// 一つ前のViewControllerを取得する
let createGroupViewController = nav?.viewControllers[(nav?.viewControllers.count)!-2] as! CreateGroupViewController
// 値を渡す
createGroupViewController.setSelectedImage()
        
// popする
_ = navigationController?.popViewController(animated: true)
```

iOSはまた、Androidと違った難しさがある。
Dockerで動かしているredashをv4.0.0にアップグレードする方法

# はじめに
redash v4.0.0がリリースされました。[^1]

現時点で Docker Hub に latest タグで登録されているのはまだ v3系のイメージですが、リリース直後に4.0.0.b3948というイメージが登録されており、おそらくこれは4.0.0の公式版かそれに近いイメージだと思われます。[^2]

そのイメージを利用してv3からv4にアップグレードする手順を共有しておきます。

# 手順

## イメージのインストール

まず、docker hubから上記のイメージを取得します。

```shell-session
% docker pull redash/redash:4.0.0.b3948
```

docker-compose.production.yml を編集して上記イメージを使用するようにします。

```diff
*** docker-compose.production.yml.bak   2018-04-19 11:56:49.057986536 +0900
--- docker-compose.production.yml       2018-04-19 11:57:25.017988679 +0900
***************
*** 7,13 ****
  version: '2'
  services:
    server:
!     image: redash/redash:latest
      command: server
      depends_on:
        - postgres
--- 7,13 ----
  version: '2'
  services:
    server:
!     image: redash/redash:4.0.0.b3948
      command: server
      depends_on:
        - postgres
```

これで、

```shell-session

% docker-compose -f docker-compose.production.yml up -d
```

と実行すればイメージが更新されて再起動します。ただし、v3以前からアップグレードした場合、DBスキーマを更新しないと500エラーになってしまいます。

## DBスキーマ更新

### migrationファイルの作成

起動したserverコンテナの/app/migrations/versions/ に migrationファイルが用意されていればこの手順は不要です。なぜか存在しなかったので作る必要がありました。すでに存在していれば何もしないので実行して問題ありません。

```shell-session
% docker-compose -f docker-compose.production.yml run --rm server ./manage.py db migrate
```

これでいいはずなのですが、なぜか今回ここで生成したファイルを使ってアップグレードしようとするとエラーになるので、このファイルを編集する必要があります。今回の場合、/app/migrations/versions/9a29a510be26_.py というファイルでした。[^3]

修正は下記のように1行挿入するだけです。

```diff
*** 9a29a510be26_.py.bak        2018-04-19 12:22:44.334204420 +0900
--- 9a29a510be26_.py    2018-04-19 01:46:28.162376408 +0900
***************
*** 7,12 ****
--- 7,13 ----
  """
  from alembic import op
  import sqlalchemy as sa
+ import sqlalchemy_utils

  # revision identifiers, used by Alembic.
  revision = '9a29a510be26'
```

コンテナにviが入ってないので、docker cp コマンドでホストに上記ファイルをもってきて編集して同じく docker cpで書き戻しました。

### upgrade

重要なデータがある場合、念のためバックアップを忘れずに。

```shell-session
% docker-compose -f docker-compose.production.yml run --rm server ./manage.py db upgrade
```

これで完了です。


[^1]: https://github.com/getredash/redash/releases/tag/v4.0.0
[^2]: https://hub.docker.com/r/redash/redash/tags/
[^3]: 環境により異なる可能性があるので upgradeのエラーメッセージを確認してください。
Raspberry Pi3 (Raspbian) にpostgresql9.6をインストール後、データベースを作成し直す

PostgreSQLをインストール後、自動で作成されたデーターベースのエンコーディングとロケールがja_JP.UTF-8（OS設定のロケール）になってしまうので、エンコーディングをUTF-8、照合順序（ソート順）をCに設定し直す。

```markdown
$ uname -a
Linux raspberrypi 4.9.80-v7+ #1098 SMP Fri Mar 9 19:11:42 GMT 2018 armv7l GNU/Linux
```

###PostgreSQLをインストール

```markdown
$ sudo apt-get install postgresql
```

###postgresユーザー（OSユーザー）のパスワード設定

```markdown
$ passwd postgres
```

###データを削除

データを削除する前にサービスを停止しておく。

```markdown
$ sudo service postgresql stop
```

ディレクトリごとデータを削除してしまう。
データディレクトリの場所は/etc/postgresql/9.6/main/postgresql.confファイルのdata_directoryで設定されている。

```postgresql.conf
#------------------------------------------------------------------------------
# FILE LOCATIONS
#------------------------------------------------------------------------------

# The default values of these variables are driven from the -D command-line
# option or PGDATA environment variable, represented here as ConfigDir.

data_directory = '/var/lib/postgresql/9.6/main'         # use data in another directory
                                        # (change requires restart)
```

削除！

```markdown
$ sudo rm -rf /var/lib/postgresql/9.6/main
```

###データベースの再作成

postgresユーザーでログイン

```markdown
$ su - postgres
```

データベースを、エンコーディングUTF-8、ロケールなしで初期化する。

```markdown
$ PGDATA=/var/lib/postgresql/9.6/main /usr/lib/postgresql/9.6/bin/initdb --no-locale -E UTF-8
$ exit
```

サービスを起動

```markdown
$ sudo service postgresql start
```

確認

```markdown
$ su - postgres
$ psql
postgres=# \l
                                        データベース一覧
   名前    |  所有者  | エンコーディング | 照合順序 | Ctype(変換演算子) |      アクセス権
-----------+----------+------------------+----------+-------------------+-----------------------
 postgres  | postgres | UTF8             | C        | C                 |
 template0 | postgres | UTF8             | C        | C                 | =c/postgres          +
           |          |                  |          |                   | postgres=CTc/postgres
 template1 | postgres | UTF8             | C        | C                 | =c/postgres          +
           |          |                  |          |                   | postgres=CTc/postgres
(3 行)
```

ユーザーの作成

```markdown
$ createuser -P <ユーザー名>
```
remiを入れているのに No package php72 available. など出たらexclude=php*を疑う

# 結論

`/etc/yum.conf`
に
`exclude=php*`
が書かれていた

[yum - No package php available on centos 6 vps - Unix & Linux Stack Exchange](https://unix.stackexchange.com/questions/353749/no-package-php-available-on-centos-6-vps)

デフォルトのPHPが更新禁止なので、ひとまず
`exclude=php php-*`
に書き換えて`php7*`を許可するようにしてみた。

[【yum update】yumのパッケージを安全にアップデートする | UX MILK](http://uxmilk.jp/9173)

# 動作環境

* CentOS 7.3.1611
* PHP 5.4.16　(更新厳禁)

サーバーは自分が組んだものでないためexcludeに気づけなかった。

# PHPを入れるために参考

* [CentOS 7 に PHP 7.2 を yum でインストールする手順 | WEB ARCH LABO](https://weblabo.oscasierra.net/centos7-php72-install/)
* [Yum で複数バージョンの PHP を共存させる - Qiita](https://qiita.com/bezeklik/items/860ba080bf4c664cd8e9)


# その他

[CentOS6のPHP7.0/7.1をPHP7.2にアップデート | riscascape.net](https://www.riscascape.net/archives/16990)

7.2ではlibargon2のエラーが出たので手順簡略化のために結局7.1を入れた。
PHPStan動かしたいだけなので問題はなし。
【webpack】Cannot find module "../lib/utils.js"

# 事の始まり
Electron + Reactで遊んでたら、
タイトルのエラーがおきた。

エラーの内容でググっても、すぐに解決記事が引っかからなかったので、
ここに書いておくよ。

# 忙しい人向け
webpack.configのexternalsの対象に、node_moduleを含めればいいよ。

# エラーの詳細
```js
var UglifyJS = exports;
var FILES = UglifyJS.FILES = [
    "../lib/utils.js",
    "../lib/ast.js",
    "../lib/parse.js",
    "../lib/transform.js",
    "../lib/scope.js",
    "../lib/output.js",
    "../lib/compress.js",
    "../lib/sourcemap.js",
    "../lib/mozilla-ast.js",
    "../lib/propmangle.js",
    "./exports.js",
].map(function(file){
    return /*require.resolve*/(!(function webpackMissingModule() { var e = new Error("Cannot find module \".\""); e.code = 'MODULE_NOT_FOUND'; throw e; }()));
});
```
UglifyJSの問題なのかな？

# 解決記事
https://github.com/webpack-contrib/uglifyjs-webpack-plugin/issues/226

>If it is a server-side project, just don't pack the node_modules.

サーバー側のプロジェクトの場合は、node_moduleをパックしないでください。

# そもそも
https://www.npmjs.com/package/webpack-node-externals
>When bundling with Webpack for the backend - you usually don't want to bundle its node_modules dependencies. 

バックエンド用のWebpackにバンドルするとき、通常はnode_modulesの依存関係をバンドルしたくない。

# ・・・そうなの？
これ！っていう理由が見つけられなかったのですが、
serverless + webpack関連の記事で、
外部モジュールのrequireでwebpackコマンドが失敗するよというものが何件が見受けられました。

私の事象とは異なりますが、requireを使える環境ではnode_moduleはバンドルの依存関係から
外したほうが良いという事でしょうか。

# 解決
[webpack-node-externals](https://www.npmjs.com/package/webpack-node-externals)を使うと、
いい感じにnode_moduleをexternals出来るらしいので、
そのようにいたします。

```bash
npm install webpack-node-externals --save-dev
```

```js:webpack.config.babel.js
import nodeExternals from 'webpack-node-externals';

export default {
    ・・・

    externals: [nodeExternals()],

    ・・・
};
```

動いた動いた。

詳しく解説いただける方、コメントいただけると助かりますm(__)m (主に私が
Vagrant 基本１　前準備とBOXについて

#概要
Vagrant を初めて使うこととなったので
何回かに分けて手順や備忘録や気になったことを記載していきます

# Vagrant Box の取得方法
`$ vagrant box add precise32 http://files.vagrantup.com/precise32.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'precise32' (v0) for provider: 
    box: Downloading: http://files.vagrantup.com/precise32.box
    box: Download redirected to host: hashicorp-files.hashicorp.com
==> box: Successfully added box 'precise32' (v0) for 'virtualbox'!`

- precise は　Ubuntu のOSのバージョン名
- 32は32ビットの意味を表す

# Vagrant Box の一覧を見る
 $ vagrant box list
 precise32 (virtualbox, 0)

# 他のVagrant Box を取得する
## Vagrant Box のリンク一覧
- 以下からURLが確認できます
`http://www.vagrantbox.es/`
- このURLをコピーしておいて
- $ vagrant box add CentOS64 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-i386-v20131103.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'CentOS64' (v0) for provider: 
    box: Downloading: http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-i386-v20131103.box
    box: Download redirected to host: sourceforge.net
==> box: Successfully added box 'CentOS64' (v0) for 'virtualbox'!
 

# Vagrant box 削除
 $ vargrint remove

# Vagrant box ヘルプ

$ vagrant box -help
Usage: vagrant box <subcommand> [<args>]

Available subcommands:
     add
     list
     outdated
     prune
     remove
     repackage
     update

For help on any individual subcommand run `vagrant box <subcommand> -h`

# boxはホームフォルダの　~./vagrant.d/boxes の下に格納される
-　ここにキャッシュされていく
Gitコミットメッセージの修正方法

##1. ログでHEADから何番目のコミットか確認

```
$ git log --oneline
555eeee コミットメッセージ
444dddd コミットメッセージ
333cccc 修正したいコミットメッセージ
222bbbb コミットメッセージ
111aaaa コミットメッセージ
```

##2. git rebase -i HEAD~{n番目} を実行
1.で確認した{n}番目をつけて実行

```
$ git rebase -i HEAD~{n番目}
```
例) git rebase -i HEAD~3

## vimが立ち上がるので編集
コミットメッセージを編集したい場合は、`pick`を`edit`に書き換えて`:wq`

### 例
```
pick 333cccc 修正したいコミットメッセージ
pick 444dddd コミットメッセージ
pick 555eeee コミットメッセージ
```
↑を、

```
edit 333cccc 修正したいコミットメッセージ
pick 444dddd コミットメッセージ
pick 555eeee コミットメッセージ
```
にする。
##4.git commit --amend実行
vimが立ち上がるので、コミットメッセージを修正する。

```
$ git commit --amend
```

##5.git rebase --continueを実行
```
git rebase --continue
```

を実行して完了。
onlineTool > JSON > JSON整形 > JSON-Viewer (JSON Pretty Linter Ver3)


[[リンク切れ] onlineTool > JSON整形ツール](https://qiita.com/7of9/items/acf2c7eab0a965ac7fa7)

> Not Found
The requested URL /jsonprettyprinter/ was not found on this server.

長らく使ってきたJSON整形ツールがリンク切れになっていた。

以下を見つけた。
https://lab.syncer.jp/Tool/JSON-Viewer/
(JSON Pretty Linter Ver3) by あらゆさん

**Note:「コピー用」内のウィンドウをクリックすると画像が表示されます。画像によっては誤解を招くかもしれないので、ご注意ください**
Office 365のライセンス認証エラー<0x80072EE7>を解決

#前置き
大学からOffice 365が無償提供されていて、それを利用している人も多いのではないでしょうか。
Officeを個人で購入すると結構な金額ですので、自分も利用者の一人です。

そんな大学のOffice 365なのですが、<b>30日ごとにインターネット経由で、ライセンス認証を行う</b>必要があります。
通常はofficeソフトを利用する度に自動的に認証を行ってくれるため、特にユーザが気にする必要がないのですが、ごく稀にエラーが発生してライセンス認証が出来ない事があるんですね。

自分もエラーによってライセンス認証が出来なくなり、解決に結構手間取ってしまったため共有目的で記事にしてみました。

#症状
ライセンス認証が失敗していたためか、officeソフト開くたびにライセンス認証ウィザードが出てきて<b>「ライセンス認証しないと〇〇日後にライセンスが無い状態になります」</b>と警告されるようになりました。
ライセンスが無い状態になると、ExcelやWordファイルを編集・保存することが出来なくなってしまう(ただしファイル閲覧は可能)為、ライセンス認証を手動で行うことにしました。

しかし、ライセンス認証ウィザードから認証を実行しようとすると
> サーバに接続することができませんでした。しばらくしてからお試しください。(0x80072EE7)

というエラーが発生してしまい、ライセンス認証を完了することが出来ませんでした……

以下では、ライセンス認証を完了するまでにやったことを書いていきます。
原因だけを知りたい方は、一番下の[正解]まで飛んでください。

##1.しばらくしてからお試し
エラー文に従い、しばらく経ってから再度認証を試みてみました。
が、何時間経っても認証することが出来ず……
どうやら原因は<b>時間帯ではない</b>ようです。

#2.タイムゾーン再設定
大学のIT部門のページのQ&Aによると
>OSの時刻が合っていないと認証に失敗することがある

という説明があった為、タイムゾーンを「東京 - 日本」に再設定し直してみました。
タイムゾーンの設定は、「設定」→「日付と時刻」から行うことが出来ます。

まあ予想していましたが、タイムゾーンを再設定してもライセンス認証を完了することが出来ませんでした。

#3.Officeにサインイン
OfficeにはMicrosoftアカウントでサインインする事が出来ます。
Office 365のインストールにはサインインが必要だった為、「ライセンス認証にもサインインが必要なのでは…？」と思い立ちました。
Officeへのサインインは、officeソフトの上部リボンの「ファイル」より、「アカウント」→画面左部の「サインイン」から行えます。

結果としては、サインインしてもライセンス認証を完了することが出来ませんでした。

#4.officeのライセンス認証に関するトラブルシューティングツールを使用する
手詰まりになってしまった為、公式のサポートで症状を調べてみる事にしました。
すると [公式サポートのとあるページ](https://support.office.com/ja-jp/article/office-%E3%81%AE%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9%E3%81%AE%E3%81%AA%E3%81%84%E8%A3%BD%E5%93%81%E3%81%A8%E3%81%84%E3%81%86%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%A8%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E5%8C%96%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC-0d23d3c0-c19c-4b2f-9845-5344fedc4380)から<b>ライセンス認証に関するトラブルシューティングツール</b>をダウンロードできる事に気づきました。

このツールを実行してみた所、ツール側でいくつかの問題の解決を完了したという表示が出たものの、ツール実行後もライセンス認証を完了することが出来ませんでした……
~~このツールは一体何を解決したと言うのだ~~

#[正解]Windowsの更新
その後も<0x80072EE7>について調査してみたものの、原因を特定することが出来ず。
そこで「大学側に問題があるのでは……？」と考え、大学のIT部門にメールで問い合わせてみたところ
>0x80072EE7はライセンスの問題ではなく通信エラーによって発生するもの
Windowsアップデートを実施して改善されるかご確認ください。

という文が返ってきました。
実際にWindowsアップデートを行ってみたところ、<b>無事にライセンス認証を完了することが出来ました！</b>

まさか原因がWindowsの更新をサボっていた事だったとは……
今回のエラーの対処法として、OSの更新を挙げているサイトが全く見つからなかった為、解決にかなりの時間がかかってしまいました。
同様のエラーに困っている方が居ましたら、とりあえずOSのアップデートを試してみてください。
Raspberry pi リンクメモ

回路を決める時に必要だった情報のメモ
(検索方法が悪いのか、なかなか見つからなかったやつ)

* [The Pi Zero W の 5v GPIOの最大電流について (Raspberry Pi Stack Exchange)](https://raspberrypi.stackexchange.com/questions/63415/the-pi-zero-w-has-5v-and-3v-rails-what-is-the-max-current-per-gpio-pin-on-the-5)
* [電源容量について](https://www.raspberrypi.org/help/faqs/#powerReqs)
【調べもの】AndroidのCUI開発環境

AndroidはLinuxカーネルを利用しているため、「Androidでも開発環境を作ろう」という試みはいくつもされてきた。

個人的に「古いAndroid端末をスレイブノードにしたクラスターシステムを作りたい」という野望があり、いくつか試してみた。ここではそのAndroidで使えるターミナル環境をまとめてみようと思う。
#試したもの

##Android Terminal Emulator (ATE)
<a href="https://play.google.com/store/apps/details?id=jackpal.androidterm&hl=ja">Google Play</a>
おそらく調べた限りでは一番古い。

* 容量が軽い。
* 古い端末にも対応している。
* sshdが使えない（多分）。
* ハードウェアキーが**US配列にしか対応していない**。（Google日本語入力を使えばJISが使える？）

##Termux
<a href="https://play.google.com/store/apps/details?id=com.termux&hl=ja">Google Play</a>

* aptが使える。
* ポートが固定されているなど制約はあるが、sshd（sshサーバ）が使える。
* gccが使えずllvm系のclangを使う必要がある。fortranは使えるコンパイラがない。
* openMPIもaptでは入らない。
* Emacsが重い。

### Archlinux on Termux
<a href="https://github.com/sdrausty/termux-archlinux">github</a>

Termux上にArchLinuxをインストールすることもできる。

* ArchLinuxなのでpacmanが使える。
* gccが使える。
* sshdが走らない。
* 容量が全部合わせて4GB近くなった。スマホやタブレットの限られたストレージでこの容量は痛い。

##UserLAnd
prootという機能を使って疑似的なroot環境を再現しているらしい。別記事にて。
https://qiita.com/Bluepost59/items/7f5608dff98c82ffb668



#調べたもの
##GNURoot Debian
<a href="https://play.google.com/store/apps/details?id=com.gnuroot.debian&hl=ja">Google Play</a>
名前に「Root」とあるが、root不要でインストールできる。prootという機能を使って疑似的なroot環境を再現しているらしい。インターフェースにATEを使っているようだ。

* aptが使える。
* gccも入る。
* openSSHではsshdを走らせることができないが、dropbearを使えばSSHサーバもできるらしい。
* なんと、お目当てのopenMPIもaptで入れることができる。
* ~~ATE同様US配列しか使えない。emacsでカーソルキーもつかえない（これはちゃんと設定すればいけるかも？）。~~ Google日本語入力を使えばJIS配列で使える。（ただしいろいろ癖がある。これについては別記事でまとめたいと思う。）
* 2018年夏頃に開発が終了し、UserLAndに受け継がれた模様。

##Linux on Android
https://qiita.com/iruka/items/5bcc36aa07518f099b5e

Androidに無理やりUbuntuをインストールする。rootが必要。手持ちの端末でrootを取ろうとしてできなかったので試せなかった。

Linux on Androidでクラスタコンピューティングをしている先行研究がある。
<a href="https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=110935&item_no=1&page_id=13&block_id=8">	Android端末を使用したクラスタ計算機システムの構築 </a>

その研究グループはその後openMPIをAndroidNDKで実装しなおしているようだ。
<a href="https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=105694&item_no=1&page_id=13&block_id=8">無線接続型Androidクラスタシステムの自動構築制御手法</a>

#キーボードとIME
CUIではCtrlやAltといったキーが必須になるが、通常のAndroid向けIMEの多くには備わっていない。そもそもコーディングするのにタッチは大変なので、物理キーボードはあった方がよい。

物理キーのつなぎ方はbluetoothでもUSBでもよい。最近は百均でもmicroUSB-USB Aの変換ケーブルを売っているので、108円でPCのものを流用できる。

#まとめ
おそらく一番お手軽なのはTermuxかUserLAndだと思う。gccを使いたいならUserLAnd一択だと思う。

ただし<b>openSSHでsshdが走ってMPIも使える、MPIクラスタのスレイブノードにできるもの</b>は見当たらなかった。もし知っていたら教えてください。
neovim install メモ

# 手順

neovimの導入

```
sudo apt install software-properties-common
sudo -E add-apt-repository ppa:neovim-ppa/unstable
sudo apt update
sudo apt install neovim
```

python周り

```
sudo apt install python3-dev python3-pip
```

pip3のupdate（update後、pip3はpipになります）

```
sudo -HE pip3 install -U pip
```

neovimのアップデート

```
sudo -HE pip install -U neovim
```

has('python3')の確認

```
nvim
```

```:nvim
:echo has('python3')
```

1なら成功

設定ファイルの用意

```
cd $HOME/.config
nvim init.vim
```

```:nvim
" 行数
set number

set noswapfile

" mapping
inoremap <silent> <C-j> <ESC>
nnoremap <silent> <Space>w :w<CR>

filetype indent on
set tabstop=4
set shiftwidth=4
set expandtab

" プラグインがインストールされるディレクトリ
let s:dein_dir = expand('~/.cache/dein')
" dein.vim 本体
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'

" dein.vim がなければ github から落としてくる
if &runtimepath !~# '/dein.vim'
    if !isdirectory(s:dein_repo_dir)
        execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
    endif
    execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p')
endif

" 設定開始
if dein#load_state(s:dein_dir)
    call dein#begin(s:dein_dir)

    " プラグインリストを収めた TOML ファイル
    " 予め TOML ファイルを用意しておく
    let g:rc_dir    = expand("~/.config/nvim/")
    let s:toml      = g:rc_dir . '/dein.toml'
    let s:lazy_toml = g:rc_dir . '/dein_lazy.toml'

    " TOML を読み込み、キャッシュしておく
    call dein#load_toml(s:toml,      {'lazy': 0})
    call dein#load_toml(s:lazy_toml, {'lazy': 1})

    " 設定終了
    call dein#end()
    call dein#save_state()
endif

" もし、未インストールものものがあったらインストール
if dein#check_install()
    call dein#install()
endif
```

```
vim dein.toml
```

```:nvim
[[plugins]]
repo = 'Shougo/deoplete.nvim'
hook_add = 'let g:deoplete#enable_at_startup = 1'
```

```
nvim dein_lazy.toml
```

```:nvim

```

プラグインのアップデート

```
nvim
```

```:nvim
:UpdateRemotePlugins
```

その後、mgtools/conf/rc/vim/vimrcをinit.vimにする

# 注意

・let.vimを環境に合わせて適宜変えてください。
例：deopleteのためのg:python3_host_progを適切なpythonバイナリのパスに合わせる、等

・deniteを使うなら、agをinstallしてください。

```
sudo apt -y install silversearcher-ag
```
VirtualBox インストール方法

#VirtualBox インストール方法

-初心者ようにVirtualBox インストール方法を記載します

##環境
- CentOS 6.5
 
`$ cat /etc/redhat-release 
CentOS release 6.5 (Final)`

- 64bitです

`$ uname -a
Linux localhost.localdomain 2.6.32-431.20.3.el6.x86_64 #1 SMP Thu Jun 19 21:14:45 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux`

##RPMのダウンロード
- CentOSなのでRPMパッケージをダウンロードします
- 以下にアクセスして Oracle Linux 6 の　AMD64をダウンロードする

`https://www.virtualbox.org/wiki/Linux_Downloads`

- 取得できたのは、VirtualBox-5.2-5.2.10_122088_el6-1.x86_64.rpm

## VirtualBoxのインストール
- コマンドラインから実行する場合は以下のようになります
` $ sudo rpm -Uvh VirtualBox-5.2-5.2.10_122088_el6-1.x86_64.rpm 
[sudo] password for XXXX: 
警告: VirtualBox-5.2-5.2.10_122088_el6-1.x86_64.rpm: ヘッダ V4 DSA/SHA1 Signature, key ID 98ab5139: NOKEY
準備中...                ########################################### [100%]
   1:VirtualBox-5.2         ########################################### [100%]

Creating group 'vboxusers'. VM users must be member of that group!

This system is currently not set up to build kernel modules.
Please install the Linux kernel "header" files matching the current kernel
for adding new hardware support to the system.
The distribution packages containing the headers are probably:
    kernel-devel kernel-devel-2.6.32-431.20.3.el6.x86_64
This system is currently not set up to build kernel modules.
Please install the Linux kernel "header" files matching the current kernel
for adding new hardware support to the system.
The distribution packages containing the headers are probably:
    kernel-devel kernel-devel-2.6.32-431.20.3.el6.x86_64

There were problems setting up VirtualBox.  To re-start the set-up process, run
  /sbin/vboxconfig
as root.`

これで完了です
Redmine3.3.4でmarkdownが使えないのでpandocを使ってtextileに変換する

# Redmine3.3.4でmarkdownが使えないのでpandocを使ってtextileに変換する

`Redmine 3.3.4.stable.16840`では、wikiをmarkdownで記述できるような設定があるものの、実際にはmarkdownが正しく反映されない。
そのため、TextileでWikiを記述することになるが、README.mdなど、有用な情報をMarkdownで蓄積している場合には、それをWikiにも反映できると望ましい。
そこで、MarkdownからTextileへ変換する作業をメモしておく。

## pandocのセットアップ

「pandoc」というコマンドラインツールを利用することで、形式を変換することが可能。
ネットで調べると、Mac版のものでブログへ掲載している人が多いが、Windows版も存在するため、ここではWindows版での方法を記載する。

* まずはpandocをインストールするため、下記へアクセスして「pandoc-2.1.1-windows.msi」をダウンロードする。  
※バージョンは、2018年1月29日時点の最新  
https://github.com/jgm/pandoc/releases
* msiファイルを実行してインストールを完了させる。  
インストール完了画面ではインストール先のフォルダが表示されるため、そのフォルダのパスを控えておく。
* システム環境変数 Path に、上記のインストール先フォルダのパスを追加する。

## 以下のコマンドを実行することでMarkdown → Textile形式へ変換できる

```
pandoc -s README.md -t textile -o README.textile
```

### 注意点

注意事項としては、README.mdなどのファイルがUTF-8形式でないと怒られる。
```
pandoc: Cannot decode byte '\x82': Data.Text.Internal.Encoding.decodeUtf8: Invalid UTF-8 stream
```

### 変換後のtextileのファイル

```text
h1(#redmine3.3.4でmarkdownが使えないのでpandocを使ってtextileに変換する). Redmine3.3.4でmarkdownが使えないのでpandocを使ってtextileに変換する

@Redmine 3.3.4.stable.16840@では、wikiをmarkdownで記述できるような設定があるものの、実際にはmarkdownが正しく反映されない。 そのため、TextileでWikiを記述することになるが、README.mdなど、有用な情報をMarkdownで蓄積している場合には、それをWikiにも反映できると望ましい。 そこで、MarkdownからTextileへ変換する作業をメモしておく。

h2(#pandocのセットアップ). pandocのセットアップ

「pandoc」というコマンドラインツールを利用することで、形式を変換することが可能。 ネットで調べると、Mac版のものでブログへ掲載している人が多いが、Windows版も存在するため、ここではWindows版での方法を記載する。

* まずはpandocをインストールするため、下記へアクセスして「pandoc&#45;2.1.1&#45;windows.msi」をダウンロードする。
※バージョンは、2018年1月29日時点の最新
https://github.com/jgm/pandoc/releases
* msiファイルを実行してインストールを完了させる。
インストール完了画面ではインストール先のフォルダが表示されるため、そのフォルダのパスを控えておく。
* システム環境変数 Path に、上記のインストール先フォルダのパスを追加する。

h2(#以下のコマンドを実行することでmarkdown-textile形式へ変換できる). 以下のコマンドを実行することでMarkdown → Textile形式へ変換できる

bc. pandoc -s README.md -t textile -o README.textile
```

ちょっと不備があるところは自分で修正するしかないですが、1つ1つ自分で作業するよりはマシかなぁと。
Chrome, Firefox, Edge で xpath の取得

Seleniumでよく使うxpathの取得・検証

現状は chrome が一番便利かなーという感じでしょうか
# Chrome
1. F12 を押してデベロッパーツールを開く
2. Ctrl + f で検索枠を開く
3. xpath を直接入力
4. 取得できると Element の箇所がハイライトされる

コンソールから $x('//input') で xpath を指定してもできますが
箇所がハイライトされた方が分かりやすいです

# Firefox
1. F12 を押して開発者ツールを開く
2. インスペクタで対象箇所を右クリック、コピー -> xpath でXPATHがコピーできる
3. Esc を押してコンソールペインを開く
4. $x('//xpath') で内容が取得できる

# Edge
ドキュメントではコンソールに $x('//xpath') で取得できるとあるが
実行すると そんな関数は undefined だと怒られるので、現状できないようです (Windows10 1709)

[Edge Documentation-DevTools-Console:Command Line](https://docs.microsoft.com/en-us/microsoft-edge/devtools-guide/console/command-line)
Python in シェルスクリプトでワンライナーを見やすく改行&ワンライナー内でシェル変数展開

## 環境
Python3.6.0
bash,sh:4.1.2

# 見やすく改行
```bash:minikui.sh
# 見難い
python -c "import pprint; print(pprint.__version);print(3+4)"
```

行末にセミコロンと~~スラッシュ~~バックスラッシュを置くことで改行できるようになります

```bash:miyasui.sh
# 見やすい
python -c " \
import pprint;\
print(pprint.pprint(3+4));"
```

for文の場合，for文が始まる直前に完全な空行を挟むとワンラインで書けます

```bash:miyasui_for.sh
python -c "
x=3;\
print(x);\

for i in range(3): \
  print(i)"
```

```bash:miyasui_for2.sh
python -c "
x=3;\
print(x);\

for i in range(3): # ここはバックスラッシュが無くてもいい
  print(i)"
```

```bash:miyasui_for_dame.sh
python -c "
x=3;\
print(x);\# for文の前に空行がないのでダメ
for i in range(3): \
  print(i)"
```

# 変数展開

```bash:var_expansion_good.sh
HOGE=hoge123

python -c "print('${HOGE}')"
```

~~角かっこ→｛｝で囲まないとダメです~~
なくても大丈夫でした

```bash:var_expansion_bad_janakatta.sh
HOGE=hoge123

python -c "print('$HOGE')"
```
外部変数の定義順を並べ替えるには

ASTERIA WARPの外部変数セットで変数や定数を定義した後、定義順を変更したい時があります。そんなときは、右クリックすると「上に移動」「下に移動」というメニューがあるのでこれをポチポチすれば好みの位置に移動できます。ボタンなどがないのでちょっとわかりづらいですけど。。

![exvar.png](https://qiita-image-store.s3.amazonaws.com/0/41603/c4f7d82b-cfae-84b0-24a0-523fbb978cac.png)

ちなみに、もっと一気にやりたいときは「CSV形式で編集」というのも使えます。定義がCSV形式で表示されてますので、テキストエディタで編集できます。ただし、壊れたらこまるのでバックアップは必須ですね^^

フィールド定義やフロー変数でもこの技は使えますので結構重宝しています。
【備忘】Effective Python 1章（スライス、リスト内包表記、lambda）

Pythonicな箇所をピックアップして残そうと思います。
これからPythonを勉強しようと思っている方にも役立つかもしれないです。

# シーケンスのスライス

```py
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

print('first four:', nums[:4])      # first four: [0, 1, 2, 3]
print('last four:', nums[-4:])      # last four: [7, 8, 9, 10]
print('middle two:', nums[3:-3])    # middle two: [3, 4, 5, 6, 7]

print(nums[:])        # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(nums[:5])       # [0, 1, 2, 3, 4]
print(nums[:-1])      # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(nums[4:])       # [4, 5, 6, 7, 8, 9, 10]
print(nums[-3:])      # [8, 9, 10]
print(nums[2:5])      # [2, 3, 4]
print(nums[2:-1])     # [2, 3, 4, 5, 6, 7, 8, 9]
print(nums[-3:-1])    # [8, 9]
```
スッキリ書ける。

# リスト内包表記とlambda

```py
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```
リスト内包表記

```py
[x**2 for x in nums]
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
```
lambda

```py
list(map(lambda x: x**2, nums))
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
```

条件式も使える

```py
[x**2 for x in nums if x % 2 == 0] 
# [4, 16, 36, 64, 100]
```

filterを使いlambdaでも表現できる

```py
list(map(lambda x: x**2, filter(lambda x: x % 2 == 0, nums)))
# [4, 16, 36, 64, 100]
```
内包表記は辞書にも使える

```py
chile_ranks = {'ghost': 1, 'habanero': 2, 'cayenne': 3}
{rank: name for name, rank in chile_ranks.items()}
# {1: 'ghost', 2: 'habanero', 3: 'cayenne'}

{len(name) for name in rank_dict.values()}
# {8, 5, 7}
```
lambdaは少し可読性が下がる。
内包表記はfor文より速い。
・appendメソッドの呼び出し部分のオーバーヘッド
・for文はループする度にリストオブジェクトのappendを参照する
・for文はappendをpythonの関数として実行する

速くて見やすいって最高。
30万件程度のデータを、ローカルの Cloud Functions で処理しようとするとエラーになってしまう

# 問題
Firebase Cloud FireStore にある30万件程度のデータを、Firebase Cloud Functions で5万件ずつ取得してごにょごにょしようと思ってたのですが、以下のようなエラーが発生して途中で処理が停止してしまっていました。

```
info: Execution took 599988 ms, finished with status: 'timeout'
```

もしくは、

```
info: Execution took 4093 ms, finished with status: 'crash'
```

また、10万件ほど処理が終わったタイミングで、以下の警告も表示されることがありました。

```
(node:38824) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: socket hang up
(node:38824) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
```

これが表示されると、新しく functionsの処理が再開され、合計3個並行して処理されるようになっていました。

# Cloud Functionsのバージョン

`v^0.8.1` 

# 対応

- タイムアウト制限をなくす

```
info: Execution took 599988 ms, finished with status: 'timeout'
```

ローカルだとタイムアウトが60秒なので、だいたい60秒経ったら止まっていました。
このタイムアウトの設定をなくしてあげると、処理が続くようになると教わり、やってみると60秒以上処理が続くようになりました。

```
~/.nvm/versions/node/v8.6.0/lib/node_modules/firebase-tools/node_modules/@google-cloud/functions-emulator/src/supervisor/supervisor.js
```

```
calculateTimeout (duration) {
    // The default is 60 seconds
    const DEFAULT = 60;
    const MAX = 9 * 60;
}
```

をいじる。

しかし、発生回数は減りましたが、

```
info: Execution took 599988 ms, finished with status: 'timeout'
```

が消えることはありませんでした。


# 対応

Cloud Functions のバージョンをアップグレードする。

バージョンを、 v1.0.1 にあげました。

しかし、

```
info: Execution took 4093 ms, finished with status: 'crash'
```

が消えることはありませんでした。

# 対応

https://github.com/firebase/firebase-tools/releases/tag/v3.18.3

> Fix bug where asynchronous operations inside emulated functions resulted in 500 statuses and "socket hangup" errors.

とあるので、以下の警告をなくせることを期待して、firebase-toosをアップグレード。

```
(node:38824) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: socket hang up
```

これが表示されることはなくなったかもしれない！

でも、以下のエラーのせいで最後まで処理されない！

```
info: Execution took 4093 ms, finished with status: 'crash'
```

# 解決策

Cloud Functions の emulator だから動かない説。
本番環境にアップして動かしてみたら、30万件処理された。

# まとめ

Cloud Functions の emulator には限界がある。