OmniAICreator/Qiita-1.07M huggingface dataset:
Observer Pattern

# Observer Pattern
- Observer Pattern is one of the pattern often used in JDK.
- one-to-many relationship between objects such as if one object is modified, its depenedent objects are to be notified automatically. Observer pattern falls under behavioral pattern category.
- Observer pattern uses three actor classes. Subject, Observer and Client. Subject is an object having methods to attach and detach observers to a client object. We have created an abstract class Observer and a concrete class Subject that is extending class Observer.


# Reference
- [tutorialspoint:Observer](https://www.tutorialspoint.com/design_pattern/observer_pattern.htm)
- [journaldev:Observer](https://www.journaldev.com/1739/observer-design-pattern-in-java)
- [geeksforgeeks:Observer](https://www.geeksforgeeks.org/observer-pattern-set-1-introduction/)
- [iluwatar:Observer](https://github.com/iluwatar/java-design-patterns/tree/master/observer)
Memento Pattern

# Memento Pattern
- Memento design pattern is implemented with two objects – Originator and Caretaker
- Originator is the object whose state needs to be saved and restored and it uses an inner class to save the state of Object. The inner class is called Memento and it’s private, so that it can’t be accessed from other objects.
- Caretaker is the helper class that is responsible for storing and restoring the Originator’s state through Memento object. Since Memento is private to Originator, Caretaker can’t access it and it’s stored as an Object within the caretaker.



# Reference
- [tutorialspoint:Memento](https://www.tutorialspoint.com/design_pattern/memento_pattern.htm)
- [journaldev:Memento](https://www.journaldev.com/1734/memento-design-pattern-java)
- [geeksforgeeks:Memento](https://www.geeksforgeeks.org/memento-design-pattern/)
- [iluwatar:Memento](https://github.com/iluwatar/java-design-patterns/tree/master/memento)
Memento Pattern

# Memento Pattern

# Reference
- [tutorialspoint:Memento](https://www.tutorialspoint.com/design_pattern/memento_pattern.htm)
- [journaldev:Memento](https://www.journaldev.com/1734/memento-design-pattern-java)
- [geeksforgeeks:Memento](https://www.geeksforgeeks.org/memento-design-pattern/)
- [iluwatar:Memento](https://github.com/iluwatar/java-design-patterns/tree/master/memento)
ローカルで Ethereum のトランザクションに署名してからブロードキャスト

* ローカルで秘密鍵を管理していてる場合、次の2ステップで Ethereum のトランザクションを実行可能です。
  * Ethereum のトランザクションの作成から署名まではローカルで行います。
  * 署名済みトランザクションは JSON RPC API 等を通じて Ethereum ネットワークに投げます。

# ライブラリのインストール
* [ethereumjs-tx](https://github.com/ethereumjs/ethereumjs-tx)を使用します。
* npm でのインストール
  * `$ npm install ethereumjs-tx`
* Node.js でのインポート
  * `const EthereumTx = require('ethereumjs-tx');`

# Ethereum のトランザクションを作成
* 0.01 ETH を `0x2890228D4478e2c3B0eBf5a38479E3396C1d6074` に送る例です。

```js
const txParams = {
  nonce: '0x00',
  gasPrice: '0x4a817c800',    // 20000000000
  gasLimit: '0x5208',         // 21000
  to: '0x2890228D4478e2c3B0eBf5a38479E3396C1d6074', 
  value: '0x2386f26fc10000',  // 0.01
  data: null,
  chainId: 3  //  mainnet: 1, ropsten: 3
}
const tx = new EthereumTx(txParams);
```

# トランザクションに署名
* トランザクションの署名には秘密鍵が必要です。

```js
const privateKey = Buffer.from('61ce8b95ca5fd6f55cd97ac60817777bdf64f1670e903758ce53efc32c3dffeb', 'hex');
tx.sign(privateKey);
```

# トランザクションのバイト列を取得
* シリアライズして16進数のバイト列形式にします。

```js
const serializedTx = tx.serialize();
const signedTx = '0x' + serializedTx.toString('hex');
```

#トランザクションをブロードキャスト
* トランザクションのブロードキャストには、Web3 を使用すると簡単です。
* npm での Web3 のインストール
  * `$ npm install web3`
* Node.js でのインポート
  * `const Web3 = require('Web3');`

```js
var web3 = new Web3('wss://ropsten.infura.io/ws');      // Ropsten
// var web3 = new Web3('wss://mainnet.infura.io/ws');   // Mainnet

web3.eth.sendSignedTransaction(signedTx)
.on('transactionHash', function(hash){
  console.log(hash);
})
```

# 実際に作成した署名済みトランザクションのバイト列
`0xf86b808504a817c800825208942890228d4478e2c3b0ebf5a38479e3396c1d6074872386f26fc100008029a0520e5053c1b573d747f823a0b23d52e5a619298f46cd781d677d0e5e78fbc750a075be461137c2c2a5594beff76ecb11a215384c574a7e5b620dba5cc63b0a0f13`

# 実際に送信したトランザクション
[http://ropsten.etherscan.io/tx/0xf4727b35f10cbe2256b38adcc594f25854a7f16c8461e280079e7003a18d446d](http://ropsten.etherscan.io/tx/0xf4727b35f10cbe2256b38adcc594f25854a7f16c8461e280079e7003a18d446d)

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/ローカルで_Ethereum_のトランザクションに署名してからブロードキャスト
デジタルトークンで「富の再分配」ができちゃうかもしれないという話

## ジンバブエドル・ショックは、あなたのすぐそばに
突然ですが、みなさん、アフリカにあるジンバブエという国をご存知でしょうか？
様々な政策の失敗により、天文学的なハイパーインフレを引き起こし、パン１つ買うのに3000億ジンバブエドルが必要という異常状態を引き起こしたことで有名な国です。
http://www.huffingtonpost.jp/2015/06/12/zimbabwe-dollar_n_7574706.html
このサイトにあるように、膨大な量の札束を持ち運んでいるのが特に印象的です。

私自身もグローバルシステムを構築している際に、「ジンバブエに出店したら、オーバーフローが発生して死ねるねｗ」なんてネタにしてましたし、ネタにするくらいなのでまったく実感がない状態でした（遠い国の話ですしね）

しかし、後述しますが、このジンバブエドルショックに似た状況が水面下で発生しています。

 
## トークンの価値アップ→円安進行
2017年の末から2018年の年初にかけて、仮想通貨がかなりヒートアップしていました。
ここからは、その仮想通貨界で基軸通貨ともいえるビットコインの話をしたいと思います。

ビットコインは2008年に生まれました。
2009年に初めて値段がついたのですが、その時の価格が1BTC=0.07円。その後じわじわ値を上げ続け、2017/12/8に200万円を突破しました。その倍率、実に2857万倍！！
世間では「ビットコインを買うと儲かる！」と価値上昇だけがフォーカスされてますが、これは見方を変えると、円の価値が8年で1/2857万になってしまったということです。
2857万円あれば、地方なら一軒家が買えます。
8年前に2857万円出して買ったマイホームは、2017/12/8には評価額が1円になるわけです。恐ろしいですね・・・。

まだジンバブエドルには到底及びませんが、私達が使う円で同じ状況が発生していることがご理解いただけるでしょうか。

しかも、ビットコインはビットコイン経済圏を維持する（マイニングしてもらう）ために、デフレに向かうように設計されています。
マイナーがマイニングしたくなるように、マイニングで得られたコインが将来的に価値が上がるように最初から考えられているのです。

ビットコインが当初の想定通りに使われ続けると、ひょっとするとジンバブエドルを超える事態になるかもしれません。

 

## 「富の再分配」が密かに実現中
経済学でよく考えられているものの一つとして「富の再分配」があります。
お金をたくさん持っている人からお金を取り上げて、お金がない人に回しましょうという動きです。

ニュースでよく報道されますが、現代の若者の年収は右肩下がりで下がり続けています。そして、全員がそうというわけではないですが、高齢者ほどお金を持っています。

「富の再分配」を考えると、お金をたくさん持っている高齢者からお金を取り上げて、若者に回したほうがいいということになりますが、これを実現する政策なんてもちろん出てこない。一見すると「富の再分配」はまったく機能していないように見えます。

しかし、前述した通り、デジタル化の動きによって円は仮想通貨との対比でどんどん円安に向かっています。

若者がビットコインを始めとするデジタルトークンを持ち、高齢者が法定通貨をもつという構造になれば、若者の資産が増え、高齢者の資産が目減りしていくという状況が生まれるため、「富の再分配」が実現できてしまうのです。

 

## 円安の利益を享受したもん勝ち
仮想通貨界に最近出現している「億り人」は、まさに円安による「富の再分配」の利益を最大限享受した人といえます。

デジタルトークンは、現時点では投機的側面が強いためキワモノ扱いされていますが、「富の再分配」という側面で見ると、すごくまっとうなものだと思いますし、長年の課題であった「富の再分配」を、あっさり実現してしまうあたりが、ビットコインを含むデジタルトークンの革命的要素なのかもしれません。
Proxy環境下でMavenを利用してAzure Functionsをデプロイする

Azure Functionsのデプロイで嵌ったので、そのときの解決メモ。
プロキシの設定をどこに書けばいいのかわからず、丸1日費やしてしまいました。

# 結論
mvnコマンド実行時に-Dオプションでproxyを指定しましょう。

```shell
mvn azure-functions:deploy -Dhttps.proxyHost=example.proxy.com -Dhttps.proxyPort=8080
```
Linuxコマンドのまとめ!

#Linuxコマンドのまとめ!

エンジニアには欠かせないLinuxコマンド。  
今回はわかりやすくまとめてみました。

##Linuxって何？
　そもそもLinuxとはwebプログラミングでサーバーの操作をするときによく使われるものです。  
そのLinuxを操作するために使われるのが**Linuxコマンド**です。


##基礎のコマンド
| コマンド名 |     説明　　　　　|
| --------| --------------  |
| cd  　　　| ディレクトリを移動  |
| pwd　　　 | 今いる場所を表示　　|
| mv      | ファイルを移動　　　|
| ls      | 今いるディレクトリの中身を表示|
| mkdir   | ディレクトリを作成　|
| touch | ファイルを作成　|
| rmdir| 空のディレクトリを削除 |
| rm  | ファイルやディレクトリを削除|
|find| ファイルを検索|
|cat | 今いるファイルの中身を表示|




##まとめ
　今回は基本的なコマンドを紹介しましたが、学ぶにつれてよく使うコマンドを更新していこうと思います。
ブロックチェーンを活用する意義について考える


## イントロダクション

「それブロックチェーンでやる意味あるんだっけ？」
ブロックチェーンを活用したサービスを検討するとき、必ずといって言いほどこの問題に直面します。 
私もブロックチェーンに携わるようになってから、ずっとこの問題を考えていたのですが、一旦自分なりに結論が出たのでここで共有したいと思います。
※あくまでも個人の見解ですので参考程度にお読みください。

 

## プロトコルファースト設計
ブロックチェーンは「価値交換のインフラ」と言われ、「デジタルアセットを人から人へと流通させていく」ことを確実に記録するソリューションです。
ここから、ブロックチェーンが暗黙の前提としている要素が２つ見えてきます。
1. 複数の参加者がいること
1. 参加者間でデジタルアセットが管理・運営されていくこと   

複数の参加者によってデジタルアセットを管理運営していくためには、まず、データ構造等の規約（プロトコル）がきちんと整備・統一し、参加者がそれに準拠する必要があります。
従来のアプリケーション設計は「業務駆動設計」（業務としてやりたいことをまず定義して、それに合うシステムを作りあげる方式）だったので、プロトコルに合わせて業務をデザインするのは、なかなかチャレンジングな取り組みになると思います。

 

## 「人間によるガバナンス」からの開放
「それブロックチェーンじゃなくてもできるじゃん」という悩み・指摘は大筋で的を得ていますが、重要な視点がひとつ抜けています。
ブロックチェーン以外のテクノロジーで「デジタルアセットが人から人へと流通する仕組み」を実現しようとすると、多かれ少なかれ、「人間によるガバナンス」に頼らざるを得なくなるという点です。
たとえば、複数の会社間でデータ連携をしようとすると、各社ごとに異なる規格の中で、コニュニケーションしながら連携方法を決めていきます。そして、仕様を変える場合は事前に各社に連絡するといった、「人間のコミュニケーションによる全体維持」が必要となります。

現実問題、これがすごく難しい・・・。  
大抵１社くらいは勝手に仕様を変更して、全体を混乱に陥れたりします。
ブロックチェーンは「人間によるガバナンス」といった不確実なものではなく、「テクノロジー（プロトコル）によるガバナンス」で縛るため、１社だけで勝手な仕様変更はできず、結果として全体維持を確実なものにする効果があります。

 

## ブロックチェーンが向く領域・向かない領域
これらの整理から、ガバナンスが効かせづらい領域（＝参加者が複数いて、放っておくと縦割りな仕様を作り出してしまいそうな領域）にこそ、ブロックチェーンを活用する意義があるように思います。

一方、「人間によるガバナンス」が十分に機能する状況下では、ブロックチェーンを導入するメリットは限りなく低くなるのではないかと考えています。(単一企業内でのデータ連携、国による存在証明など)
ブロックチェーンを検討するときに知っておいたほうがいいこと

## はじめに
FinTechでブロックチェーンが話題になっていますが、いざ業務で使おうとするとどう使えばいいのか分からなくなります。
この問題を解決するには、ブロックチェーンの技術面だけではなく、時代の流れやビットコインで実現したかったことを知っておく必要があります。
今回はこれらの説明とともに、ブロックチェーンを採用することの意義を考えてみたいと思います。

## ブロックチェーン一般論
ブロックチェーンは下記４つの特性があります
1. 非中央集権的
1. 高可用性
1. 改ざん困難性
1. データ共有特性（ビザンチン障害耐性、非決定性排除）

どの企業もそうですが、特に金融業界は「絶対にダウンしてはいけない」「絶対に改ざんされてはいけない」という要求が強いようです。
そのため、「高可用性」「改ざん困難性」を持つブロックチェーンを各社で鋭意検証しています。
私達も銀行業務にブロックチェーンを適用することを検討していますが、さまざまな課題に直面しています。

## 「それブロックチェーンじゃなくてもできるじゃん」の呪縛
一般的に銀行業務は「信用のスコアリング」と「商行為の記録」という、大きく２つのコア業務で成り立っていると言われています。
私達のPoCでは「商行為の記録」業務でブロックチェーンの適用を検討しています。具体的には、預金管理、送金、融資実行、返済などをスマートコントラクトとしてプログラム化し、ブロックチェーン上で動かします。
（信用のスコアリングは様々な要素が関わってくるので、外部データ参照が必要となり、オラクル問題を考慮する必要があります）

しかし、ある程度作っていくとふと気づくわけです。「これ、ブロックチェーンにする意味あるんだっけ」と。
私が直面した悩みは下記のとおりです。

* 分散台帳はRDBのレプリケーションと何が違うのか
* プライベートチェーンにおいて、コンセンサス（分散ノードに対するデータ同期）を意識する必要があるのか（クローズドシステムの前提で、プライベート型チェーンで検証しました）
* プログラムにバグがあった場合のデータパッチや、法的な取消遡及効を考えるとRDBのほうが対応しやすいのでは？
* スマートコントラクトを更新したい場合、スマートコントラクトを保持する各ノードへの更新が発生して大変
* スマートコントラクトは直列実行されるので、パフォーマンスが心配


ブロックチェーンの特性にフォーカスして考えれば考えるほど、ブロックチェーンを採用するメリットが見えてこないという呪縛に陥りました。

 
## 必要なのはテクノロジー全体の流れと知ることと、ビットコインが必要となった背景を知ること
テクノロジーは何かしらの必要性に迫られて生み出されます。ここではブロックチェーンに裏付けられたビットコインが生み出された理由について考えてみます。

真意は生みの親であるサトシナカモト氏のみぞ知るなのですが、ブロックチェーン技術の本質は「独自の経済圏を作ること（＝自分たちの理想の世界を作ること）」にあると思います。

ビットコインの場合、まず「誰にも邪魔されずに送金できる経済圏を作る」という目的がありました。
その経済圏で流通する価値基準としてビットコインを定義し、お金を取り扱う上での最大の問題である「二重支払」を防止するために、全員が同じデータを参照できる仕組みを作り、それが結果として高可用性や改ざん耐性をもたらしました。

つまり、ブロックチェーンの特性は、独自経済圏を作るという目的からの結果に過ぎないのです。

別の視点からも考えたいと思います。
ブロックチェーンを始めとする近年のテクノロジーは「組織が保有していた力を個人に付与すること」、つまり「徹底した民主化」を志向するという特徴があります。

例えばGoogleが提供する検索サービスは、世界中の知識にアクセスする力を個人に与え、AmazonやMicrosoftが提供しているクラウドインフラサービスは企業レベルでしか持ち得なかった開発能力を個人に与えました。

では、ブロックチェーンは個人にどのような力を与えるのでしょうか。
ブロックチェーン技術は「経済そのもの」を民主化し、自分たちが必要とする経済圏を自由に創出することを可能とするテクノロジーなのです。

ブロックチェーンの本質を考えずに、枝葉末節である技術特性ばかりに目を奪われると、前述したような呪縛にとらわれてしまいます。

 

## 独自経済圏を作るというチャレンジングな課題
近年、銀行のコア業務である「信用のスコアリング」はAIに、「商行為の記録」はDB技術により代替されつつあります。
また、銀行の存在意義である「お金を企業や個人に融資して、経済を循環させる」ことすら、クラウドファンディングの登場によって脅かされています。
そのため、銀行を始めとする金融機関は、これまでの業務から離れ、全く別のフィールドで戦うことを余儀なくされます。
独自の経済圏を創ることは、その解決策の一つになりそうです。
独自の経済圏を創ろうとすると、そこでの価値基準が必要となります。サトシナカモト氏はそれをビットコインとして定義しました。世間一般のアルトコインやトークンもその経済圏における価値基準です。

ブロックチェーン上での価値基準を定義するためには、独自のトークンを発行するのが手っ取り早く、それが「トークンエコノミー」の形成につながっていきます。

今後の金融機関に求められるのは、「どのようなトークンエコノミーを形成するか」の戦略であり、テクノロジーサイドに求められるのは、「ブロックチェーンを活用して独自トークンを発行し、それを流通・循環させていく」ための技術論だと思います。

ビットコインやイーサリアムがほとんど問題なく動き続けていることから分かるように、ブロックチェーンはトークンエコノミーを形成して維持するテクノロジーとして非常に優れているのです。

ブロックチェーンの採用をするときは、「非中央集権」「高可用性」「改ざん不可性」「分散性」といった技術特性だけでなく、「どのようなトークンエコノミーを形成していくか」に焦点をあてて検討するのがよいのではないでしょうか。
 

### 参考：
お金2.0　新しい経済のルールと生き方 (NewsPicks Book) 佐藤航陽
https://www.amazon.co.jp/dp/B077N93YYV/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

世界を動かす小さな経済圏、「しあわせの経済」とは
http://alternas.jp/study/global/73034

銀行の役割と存在意義について再考する
https://asset-formation.com/2015/12/31/column-money-29/

ブロックチェーン・エコノミクス 分散と自動化による新しい経済のかたち
https://www.amazon.co.jp/gp/product/B0718ZLXQ7/ref=oh_aui_search_detailpage?ie=UTF8&psc=1
2分でできるcatapult環境構築 on Amazon EC2

catapult環境を作成するには[Catapult Service Bootstrap](https://github.com/tech-bureau/catapult-service-bootstrap)を使うと簡単。

以下、Amazon EC2でインスタンス作成後にやったこと。

### git/docker/docker-composeインストール
```
sudo yum update -y
sudo yum install -y git docker 
sudo curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo gpasswd -a $USER docker
sudo service docker start
```

### Catapult Service Bootstrap
```
git clone https://github.com/tech-bureau/catapult-service-bootstrap
cd catapult-service-bootstrap/
./cmds/start-all
```

おっ動いた。

```
api-node-0_1              | 2018-05-25 00:54:27.013300 0x00007f1016ffd700:<info> (disruptor::ConsumerDispatcher.cpp@44) completing processing of element 1 (1 blocks (heights 2 - 2) [F91EBB0B] from Remote_Pull), last consumer is 0 elements behind
peer-node-0_1             | 2018-05-25 00:54:27.614133 0x00007fa6a0aa6700: <debug> (src::NetworkHeightService.cpp@45) network chain height increased from 1 to 2
peer-node-1_1             | 2018-05-25 00:54:27.614892 0x00007f75c99e2700: <debug> (src::NetworkHeightService.cpp@45) network chain height increased from 1 to 2
api-node-0_1              | 2018-05-25 00:54:27.774238 0x00007f103d056700: <debug> (src::NetworkHeightService.cpp@45) network chain height increased from 1 to 2
```

接続してみる。

```
$ docker ps
CONTAINER ID        IMAGE                                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
23c2fc211408        techbureau/catapult-rest-server:1.0.7   "ash -c '/bin-mount/…"   20 minutes ago      Up 20 minutes       0.0.0.0:3000->3000/tcp   catapultservicebootstrap_rest-gateway_1
3455f1909e9c        catapultservicebootstrap_api-node-0     "bash -c '/bin-mount…"   20 minutes ago      Up 20 minutes                                catapultservicebootstrap_api-node-0_1
eba47d76554a        catapultservicebootstrap_peer-node-0    "bash -c '/bin-mount…"   20 minutes ago      Up 20 minutes                                catapultservicebootstrap_peer-node-0_1
75c9768d7d32        catapultservicebootstrap_peer-node-1    "bash -c '/bin-mount…"   20 minutes ago      Up 20 minutes                                catapultservicebootstrap_peer-node-1_1
507b9af6f2b0        mongo                                   "docker-entrypoint.s…"   20 minutes ago      Up 20 minutes       27017/tcp                catapultservicebootstrap_db_1

$ docker exec -it eba47d76554a /bin/bash
#
```

## 追記

以下に各設定ファイル等があるので適宜参照。

### アドレス/秘密鍵/公開鍵一覧
```
 catapult-service-bootstrap/build/generated-addresses/raw-addresses.txt
```

設定ファイルのアドレス/鍵情報は上記を参照。

### 各サーバの設定ファイル
```
 catapult-service-bootstrap/build/catapult-config
  - peer-node-0
  - peer-node-1
  - api-node-0
  - rest-gateway-0
```

### nemesisファイルの設定ファイル
```
 catapult-service-bootstrap/build/nemesis/block-properties-file.properties
```

mijin-test用のxemを持っている人の鍵もわかったので、次はnem2-cliでいろいろ操作してみよう。

## 追記
以下追記しました。
[catapult環境でのxemの送金(nem2-cli)](https://qiita.com/ryosasa/items/f051c0443089803a8a75)
UTF-8形式のCSVファイルをRailsのmodelにインポートする手順

追記： nkf使えば、コマンドで一発で文字コード変換できます。

# オンラインで公開されているUTF-8形式のCSVデータをmodelに入れたい
駅データがダウンロードできる「[駅データ.jp](http://www.ekidata.jp/)」

大変ありがてぇ

このデータをDBに入れたいと思ったのですが、utf-8の扱いで結構戸惑ったので、ここにまとめます。環境はwindowsです。

## まず立ちはだかる、文字化けるん
MSのExcelで作業する場合、普通に開くと、、、

「![image.png](https://qiita-image-store.s3.amazonaws.com/0/225665/10d6cd97-35c4-3e93-53cf-8e4fe9d801da.png)」

まずは、普通にExcelで編集できるようにしましょう。

非常に簡単で、一度メモ帳で開いて保存しなおすだけ。

「ファイルを右クリック」 => 「プログラムから開く」 => 「メモ帳」

これを上書き保存しておくだけであら不思議、見事Excelでも正しく表示されるようになります。

「![image.png](https://qiita-image-store.s3.amazonaws.com/0/225665/08d37715-4b00-3d31-f863-39d902220af2.png)」

どうやら、一度メモ帳を介すことで"BOM"と呼ばれる文字コードを解釈するためのデータが、ファイルの先頭部分に付与されるようです。

これにより、ExcelでもUTF-8のファイルが正しく読み込めるようになります。

Excel上で、自分に都合の良いようにデータをいじります。

## BOMありのまま、CSVをインポートする際の第二の罠
さてインポートするぞと思いまして。[こちらの記事](https://qiita.com/junara/items/183aaff5e5b77ec1c679)を参考にインポートする手はずを整え、さぁ行くぞ！

`ArgumentError - invalid byte sequence in UTF-8`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/225665/e7bbbb07-4a11-e9f5-9850-e979895592b4.png)

いやまたか！

utf-8むずいです。

どうやら、BOMが付いてると余計なデータが付与されてしまうため、エラーが出てくるそう。
これを取り除く必要があります。

そこで出てくるのがTeraPad!
神でした。

[ここ](https://www.1-firststep.com/archives/2258)に詳しいことはあるので、参考にしながらTeraPadでBOMを取り除きます。

行うこととしては、
「再びメモ帳で開く」 => 「カンマ区切りで保存されていることを確認したら、それをコピー」 => 「TeraPadに貼り付け」 => 「保存」

「文字/改行コード指定保存」から、保存形式として「utf-8n」、改行コード「LF」を選びます。csv形式が保存の際のファイルの種類として選択できなかったので、ファイルの種類は「すべてのファイル」にして、file_name.csvとして保存しましょう。

これで、問題なくいけます。わーい

お疲れさまでした。これでもう、utf-8も怖くない

# 参考
[全モデルで使えるシンプルなインポート機能を実装する](https://qiita.com/junara/items/183aaff5e5b77ec1c679)
- 大変助かった。すごい楽にimportできます。

[文字コードをUTF-8 BOMなし(UTF-8N)でファイル保存をする方法](https://www.1-firststep.com/archives/2258)
- TeraPad神かよ。もうメモ帳は捨てます
実際にgitへアップロードしてみよう!

#実際にgitへアップロードしてみよう!

これまでにgitの基本的な説明をしてきました。  
詳しくはこちら↓

* [エンジニアの必須であるgitとは何か](https://qiita.com/n_hirai/items/de895134194400110fd2)  
* [リポジトリを共有しよう](https://qiita.com/n_hirai/items/dd98a29a4b070dd65026)  
* [ブランチのいろいろ](https://qiita.com/n_hirai/items/06b6d1d5049bd1eecc5f)

では内容を理解しただけでは結局どうやるの？と思いますよね。
今回は実際にコマンドを使ってgitにアップロードするための手順を紹介します。  



##基本的なアップロード手順
今回はgitでディレクトリとファイルを管理するという程で、ローカルリポジトリでディレクトリとファイルを作成していきます。
コマンドについてはこちら[Linuxコマンドのまとめ!](https://qiita.com/n_hirai/items/bf3dfd0af8b42fb4ab90)をご覧ぐださい。


### 1. リモートリポジトリをつくる  

```  
* backlogのgit管理画面で新規のリポジトリをつくる  
* HTTPSのURLを把握する
```


### 2. コミットまでの準備をする 

今回はhirai_testというディレクトリをつくりました。

* hirai_testというディレクトリをつくる

```
:n_hirai$ mkdir hirai_test

```  
 
* 作成したディレクトリに移動する

```
:n_hirai$ cd hirai_test

```    

* そのディレクトリにファイルを作る  

```
:hirai_test n_hirai$ touch README.txt

```  

### 3. gitにアップロードする
  
* gitを初期化する   
 
```
:hirai_test n_hirai$ git init

```  
    
* ファイルをインデックスにあげる  

```
:hirai_test n_hirai$ git add README.txt

``` 

* 名前をつけてコミットする  

```
:hirai_test n_hirai$ git commit -m 'test'

```    



* リモートリポジトリのURLのアドレスにoriginという名前でリモートする  

```
:hirai_test n_hirai$　git remote add origin [URL]

```    


* 統合ブランチのmasterにプッシュする  
  
```
:hirai_test n_hirai$ git push -u origin master

```    


##まとめ
　今回は基本的なアップロード手順でした。pushするまでには、インデックスというステージにあげてからコミットしなければならないということが重要です。  
今回はmasterという統合ブランチにあげましたが、ブランチを作りトピックブランチにあげることも可能です。

##参考文献
[サルでもわかるgit入門](https://backlog.com/ja/git-tutorial/)
Figmaで日本語を使う

## 日本語が消える
Figmaの標準フォントで日本語を入力すると消えてしまいます。
ネットでググってもWeb版で日本語を使うという記事は観測時点では検索上位に出てきません。
日本語には対応してないのか、、、と思っていて、Figmaを使っていたら要望のポップアップが出てきたので、聞いてみることにしました。
> 「Japanese plz!」

するとしばらく立ってかFigmaからメールで返信が来ていました。

> Hey sakapun,

> In case you didn't know, we do support some Japanese Fonts, such as Noto Sans JP. You can also enable local fonts to use your own!


どうやら日本語が使えるフォントがいくつかあるようです。探せたのは下記です・
- Noto Sans JP
- Noto Serif JP
- Nico moji
- Nikukyu

Note Sans JP、Note Serif JP以外は装飾フォントなので、FigmaをWebで使っていくにはNoto ＊ JPであれば日本語が使えます。

### 2018/08/24追記 対応フォントが増えた
喜ばしいことにフォントが増えました。下記のフォントで使えるようです
https://fonts.google.com/?subset=japanese&sort=date

### Figmaをデスクトップアプリで使うとローカルフォント使える
試していないのですが、メールの中にリンクが載っていました
http://help.figma.com/text/using-local-fonts

この記事を書いている中、ネットでぐぐるとたしかにこちらはやっている人がいるみたいでした。


## 番外ポエム）Adobe XDと使い比べてFigmaの良さ
最近Adobe XDの無料版が復活し、再度使ってみました。

### SVGのエクスポートが楽
私はSVGが好きです。
特にVueを知り、SVGをコントロールできるようになってから、ReactとVueではアイコンをSVGコンポーネントにして使うようになりました。
Adobe XDではファイルとしてSVGを吐き出すことができますが、それだとエディタに貼り付けるのが面倒です。
Figmaであれば右クリック→Copy as→Copy as SVGでコードとしてコピーできます。
<img width="202" alt="agri-note_logo_–_Figma.png" src="https://qiita-image-store.s3.amazonaws.com/0/24049/1ffd0530-fcfb-a969-04f2-bb024bc22f93.png">

#### さいごに
あまり良い点を書き出せませんでしたが、なんだかFigmaの方がすごくお気に入りです。
UIが英語で普及させるにはハードルが高いFigmaですが、個人用途ではこれからも使っていこうと思います。
Markdown 記法

# Markdown 記法メモ
## 見出し
### 記述
```html:sample
# H1
## H2
### H3
#### H4
##### H5
###### H6
```
### 表示
# H1
## H2
### H3
#### H4
##### H5
###### H6

## 引用
### 記述
```html:sample
> 引用文をここに書く
>> 引用文の入れ子
```
### 表示
> 引用文をここに書く
>> 引用文の入れ子

## 箇条書き
### 記述
```html:sample
* リスト1
    * リスト1-1
        * リスト1-1-1
        * リスト1-1-2
    * リスト1-2
* リスト2
    * リスト2-1
    * リスト2-2
* リスト3
```
### 表示
* リスト1
    * リスト1-1
        * リスト1-1-1
        * リスト1-1-2
    * リスト1-2
* リスト2
    * リスト2-1
    * リスト2-2
* リスト3

## 番号付きリスト
### 記述
```html:sample
1. リスト1
    2. リスト1-1
3. リスト2
```
### 表示
1. リスト1
    2. リスト1-1
3. リスト2

## チェックリスト
### 記述
```html:sample
* [ ] リスト1
* [x] リスト2
```
### 表示
* [ ] リスト1
* [x] リスト2

## 水平線
### 記述
アスタリスク(もしくはハイフン)を3つ以上並べる

```html:sample
***
```
### 表示
***

## 強調・打ち消し
### 記述
```html:sample
*イタリック*
**強調**
***強調イタリック***
~~打ち消し~~
```
### 表示
*イタリック*
**強調**
***強調イタリック***
~~打ち消し~~

## テーブル
### 記述
```html:sample
| 主格 | 所有格 | 目的格 |
|:--|:-:|--:|
| I | my | me |
| you | your | you |
| he | his | him |
| she | her | her |
```
### 表示
| 主格 | 所有格 | 目的格 |
|:--|:-:|--:|
| I | my | me |
| you | your | you |
| he | his | him |
| she | her | her |


## リンク
### 記述
```html:sample
https://qiita.com/

[Qiita](https://qiita.com/)

[Qiita](https://qiita.com/ "プログラミングに関する知識を記録・共有するためのサービス")
```
### 表示
https://qiita.com/
[Qiita](https://qiita.com/)
[Qiita](https://qiita.com/ "プログラミングに関する知識を記録・共有するためのサービス") (タイトル付き)

## 画像
### 記述
```html:sample
![shutter.png](https://hogehoge.com/shutter.png)

![shutter.png](https://hogehoge.com/shutter.png "shutter")
```
### 表示
![shutter_128x128.png](https://qiita-image-store.s3.amazonaws.com/0/85274/0841e4f5-22b9-06bd-4404-fa329fc10161.png)

![shutter_128x128.png](https://qiita-image-store.s3.amazonaws.com/0/85274/0841e4f5-22b9-06bd-4404-fa329fc10161.png "shutter") (タイトル付き)
SlackみたいなMattermostを構築する（インストール）

# ソースのダウンロード
　公式サイトからソースをダウンロードします。（https://about.mattermost.com/download/）
Enterpriseとteamがあるので間違わないようにしましょう。
Enterpriseは有償です。
docker版とソース版があるのですが、ソース版を使用します。

#ソースの解凍

```
$ tar -xvf mattermost-team-x.x.x-libnux-amd64.tar
```
で解凍します。解凍するとmattermostのフォルダが生成されます。

#ソースをコピー
/opt配下に解凍したフォルダを移動します。

```
$ mv mattermost /opt/
```

コピーしたら所有者の変更をしておきましょう。

```
$ chown -r mattermost:mattermost /opt/mattermost
```

#初期設定
```/opt/mattermost/config/config.json
"SqlSettings": {
        "DriverName": "mysql",　←mysqlを使用します。
        "DataSource": "mmuser:<passwd>@tcp(<SQL_ADDR>:3306)/mattermost?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s",　←SQLサーバへ接続するためのユーザ名・パスワード・ホスト名・ポートを変更します。
        "DataSourceReplicas": [],
        "DataSourceSearchReplicas": [],
        "MaxIdleConns": 20,
        "MaxOpenConns": 300,
        "Trace": false,
```
#mattermostの起動
```
$ sudo -u mattermost /opt/mattermost/bin/platform
```
でエラーがないか確認します。問題なければ、ブラウザからhttp://<ホスト名>:8065/に接続すると管理者ユーザ作成の画面が表示されます。
うまく表示できたら、CTRL+Cで終了しましょう。
#pluginのエラー
```
mkdir ./client/plugin no such file or directory
```
というエラーが発生しました。ただ単に環境変数の設定が悪いような気もしますが、./clientが/opt/mattermost/binにないのが原因にようです。ちなみにclientは/opt/mattermostにあります。そこで、/opt/mattermost/clientを/opt/mattermost/bin/clientとしてリンクします。
```
$ ln -s /opt/mattermost/client /opt/mattermost/bin/client
```
これでpluginも利用可能になりました。
#自動起動
このままでは再起動してもmattermostは起動しません。
自動起動用のスクリプトを設置します。

```/etc/systemd/system/mattermost.service
[Unit]
Description=Mattermost
After=syslog.target network.target mariadb.service

[Service]
Type=simple
WorkingDirectory=/opt/mattermost/bin
User=mattermost
ExecStart=/opt/mattermost/bin/platform
PIDFile=/var/spool/mattermost/pid/master.pid
```
systemdに登録します。

```
$sudo systemctl daemon-reload
$sudo systemctl enable mattermost
$sudo systemctl start mattermost
```
あとはWebGUIで設定します。
SlackみたいなMattermostを構築する（事前準備）

# はじめに
　IT関係の仕事をしていると、ちょっとみんなに相談したいことなんかがあります。メールするほどではないし、グループウェアにチャット機能はないし。でもSlackみたいな外部のサービスは利用できない。
　そういう時にSlackみたいなチャットツールのMattermostを知り、構築してみました。

# サーバの前提条件
　今回は、CentOS7（さくらのVPS）を使用しています。
　lxcでコンテナ2個作って、1個はmattermost本体、もう1個がMySQL（MariaDBね）にします。

# データベースの構築
　DB用のLXCコンテナにyumでMySQL（MariaDB）をインストールします。
　これは、コマンド一発でOK

```
 $ sudo yum install -y mariadb mariadb-devel mariadb-server mariadb-libs
```

 文字コードを変更しておきます。

```/etc/my.cnf
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
character-set-server=utf8 ←追加
```

 次に、MariaDBを起動します。

```
 $ sudo syatemctl start mariadb
対話型で初期設定を進めます。
 $ sudo mysql_secure_installation
```
次にデータベースの作成して、ユーザ作成と権限の設定

```
$ mysql -u root -p
 Password:
 MariaDB[(none)]> create database mattermost
 MariaDB[(none)]> create user 'userxxx'@'1.1.1.%' identified by 'passwd';
＊userxxxは1.1.1.0/24のマシンから接続を許可し、パスワードはpasswdです
 MariaDB[(none)]> grant all privileges on mattermost.* to 'userxxx'@'1.1.1.%';
```
MySQLはデフォルトのエンジンがInnoDBなんですが、これだとFULLTEXTのIndexができず、matermostインストール時にエラーになります。そこで、FULLTEXTのIndexが可能なMyISAMにエンジンを変更します。

```
 MariaDB[(none)]> use mattermost
 MariaDB[(none)]> alter table <テーブル名> engine=myisam;
＊変更はテーブル単位で行います。とりあえず、show tables;でテーブル名見ながら地道に変更しました。（ワイルドカードが使えなった・・・）
```
これでデータベースの準備ができました。
jQueryとbootstrapのDatePickerを同時に使う方法

#目的
jQueryとbootstrapのDatePicerを合わせて使う

#経緯
既存のシステムがjQueryのDatePicerを使用しているが、
期間のフィールドを追加する事となり、jQueryのDatePicerではフィットする機能がなかったため、
bootstrapのDatePicerを使用する事となった。

###jQuery DatePicerの呼び出し方
```ruby:filename.rb
$('#datepickerjQuery').datepicker();
```

###BootstrapDatePicerの呼び出し方
```ruby:filename.rb
$('#datepickerBootstrap').datepicker();
```

え？宣言のやつが同じなの？
そもそも一緒に使っちゃダメなの？
案の定後に実行したDatePicerのオブジェクトになった。

##解決方法

bootstrap側を以下のコードに修正

```ruby:filename.rb
$.fn.bootstrapDP = $.fn.datepicker.noConflict();
$('#datepickerBootstrap').bootstrapDP();
```

一応動くみたいだけど、noConflictの説明がわからぬ・・・
bootstrapのdatepickerを取り出して別名にしてやってるようなイメージかな。
RSpecでオリジナルのexample method(it, example, xitに値するもの)を追加する

## 要約
`RSpec::Code::ExampleGroup.define_example_group_method`, 
`RSpec::Code::ExampleGroup.define_example_method`

を使うと、独自のexample_method ((x)it, (x)example など) やexample_group_method ((x)describe, (x)context など) を定義することができ、特定のタグを自動付与できて便利だった、という話を紹介します。

### サンプル実装

```ruby
# ./spec/supports/rspec_extend.rbなどを作って以下を記述。

RSpec::Core::ExampleGroup.define_example_group_method(:ciskipdescribe, :ciskip => true)
RSpec::Core::ExampleGroup.define_example_method(:ciskip, :ciskip => true)

# itの代わりにciskipを使うとciskipタグが自動付与される
# `rspec --tag @ciskip` で一時的にこのタグがあるテストをCIで回さないようにしたい

ciskip 'hoge spec' do; end
# it 'hoge spec', ciskip: true do; endと同等

ciskipdescribe '#hoge' do
    it 'hoge' do; end
end
# describe 'hoge spec', ciskip: true do
#     it 'hoge' do; end
# end 
# と同等
```

### テスト方法
```bash
# ciskipタグが付いているテストだけ実行する
$ bundle exec rspec . --tag @ciskip

# ciskipタグが付いているテストを除外して実行する
$ bundle exec rspec . --tag ~@ciskip
```

この部分は純粋にrspecのはなしですね :bird: 


### **NOTICE!**
`@private` と打たれている、いわゆるruby外で用いられる一般的な意味でのprivateメソッドを呼び出しているのでお行儀はよくないと思われます...
よりよい方法があればコメントお寄せください


以下、この導入にいたった経緯や参考URLまとめなので、必要なければ読み飛ばしてください :ok_hand: 

## 詳細

### なにを解決したかったのか
- ciでだけ一時的にskipさせたいテストがある
- xit, pendingはこの場合使えない
    - 全テストケースから、ciskipさせているものだけを抽出して定期的にローカルでテスト走らせたい
        - それに限らずともローカルでは常に実行対象にしておきたい
    - また、安易に使うと「未実装の機能」「failの原因調査中」などの理由でpendingにしているテストと混同する
- さてどうしよう :thinking: 



### そこで考える選択肢
- rspecにはタグを打てるのでそれを使うのが王道だろうな
    - rspecは特定のタグだけ実行対象としたり除外したりできる
        - ref https://relishapp.com/rspec/rspec-core/v/2-4/docs/command-line/tag-option
    - でも都度タグを書くのは面倒
        - できればxitにするだけでpendingにできるみたいなのが嬉しい
- RSpec::Code::ExampleGroup.define_example_group_method がxit, itなどを定義している
    - xitはskipタグを自動で付与し、pendingはpendingタグを自動で付与している
        - ref https://github.com/rspec/rspec-core/blob/7b6b9c3f2e2878213f97d6fc9e9eb23c323cfe1c/lib/rspec/core/example_group.rb#L186
    - CIでは `rspec --tag ~@ciskip` すればよさそう (実際はparallel_rspecをつかっています)
    - 良さそう :sunglasses:


### 方針

1. 愚直にタグを付ける
    - ex `it ciskip: true do; end`
2. example_method, example_group_methodを増やす
    - 実装は冒頭サンプル実装の通り
    - ex `ciskip do; end`
        - これでciskipタグが自動でつく

### メリットとデメリット
方針2の立場からみてみます。（方針1のメリット・デメリットはおおよそこの逆）

- メリット: 
    - `it ciskip: true { }` がsyntax errorで厄介なのを回避できる
    - パット見、わかりやすい気がする
- デメリット
    - `RSpec::Core::ExampleGroup.define_example_group_method`, `RSpec::Core::ExampleGroup.define_example_method` には `@private` と書かれているのでご法度感はある
        - とはいえ追従は直ぐにできそう
    - 独自定義したメソッドなので「ciskipというexample_methodみたこと無いんですけど」とチームに思われうる

### **NOTICE!**
話の筋からはそれますが、そもそもCIでテストをスキップさせるのはよろしくありません。
そもそもciskipというexample_methodの導入をするべきかという議論はチーム内でするべきだと思います。

今回は一時的な利用目的ということで採用しました。


### 結果
一時的な利用目的ではありますが、　ciskipが導入されました :star2: 
（実際はxitに併せてcitという名前になりました）

しばらく運用してみて様子を見てみたいと思います。
UnityでVSCodeを使うための最低限必要な設定

これだけやればとりあえずVSCodeで開発できる！というところだけ書いていきます。
コード補完が効く状態までいけます。
# インストールするもの
## VSCode
https://code.visualstudio.com/

## Visual Studio (Windowsのみ)
後述の.NET Framework 4.5 Targeting PackのインストールにVisual Studioが必要です(我慢してインストールしましょう…)

## Mono
MonoはUnityがサポートするコンパイラ。

インストーラーのダウンロード
https://www.mono-project.com/download/stable/#download-win

Macの場合はHomebrewでインストール可能(おすすめ)

```terminal
brew install mono
```

Homebrewの詳細は↓
https://brew.sh/index_ja

## .NET CLI tools
https://dotnet.microsoft.com/download/
.NET Coreをダウンロード→インストールします

## .NET Framework 4.5 Targeting Pack (Windowsのみ)
Windowsのみですが .NET Framework 4.5 Targeting Pack のインストールが必要です。
Visual Studioを起動し、「コードなしで続行」から、プロジェクトを作成することなく開くことができます。
メニューの ツール→ツールと機能を取得　Visual Studio Installerが起動します。
個別のコンポーネントから .NET Framework 4.5 Targeting Pack をチェックし変更ボタンを押下、ダウンロードとインストールが実行されます。

![コメント 2020-09-02 130530.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87892/46ea0d4f-64a2-58a5-ab85-a26f18d4d953.png)


# VSCodeの設定
## 拡張機能のインストール
<img width="247" alt="スクリーンショット 2018-05-25 09.16.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/87892/f70d872a-760f-1c9f-6795-cf6061877a58.png">

- C#
- Debugger for Unity
- Mono Debug

の3つを入れておく。

# Unityの設定
## VSCodeをUnityの標準エディタに設定する
- Preferences > External Tools > External Script Editorを選択
- Browse...からVSCodeを選択して設定
<img width="534" alt="スクリーンショット 2018-05-25 09.12.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/87892/55061e97-7412-abd2-4197-e772b3a9b607.png">


# 完了
とりあえずこれで使えるようになったはず。
コード補完やインテリセンスが効かなくて詰んでた人はこれを見て解決すると嬉しいです。

VSCodeには本家VisualStudioのブレークポイントやステップ実行なんかも使えるので、気になる人は掘り下げて調べてみてね٩( ᐛ )و
[【Visual Studio Code】Unity をデバッグできるようにする拡張機能「Debugger for Unity」](http://baba-s.hatenablog.com/entry/2018/01/08/112000)


# 追記 2020/5/24
Unity2019からPackageManagerにVisual Studio Code Editorが追加され、それによる補完が効かなくなる等の不具合が起きるようです。
Visual Studio Code Editorのバージョンを1.2.0↑にアップデートすると改善します。


# 追記 2020/8/24
OmniSharpアップデートで補完が効かなくなる問題は下記の通り、 設定から Omnisharp:useGlobalMonoを always に変更すると改善します。
![スクリーンショット 2020-08-24 13.53.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87892/1cf1272a-1acc-fc1d-e4ef-211f1eed362e.png)
サクッと初心者がサービス作れるチュートリアルまとめ（rails,javascript,LINE API,GAS）

最近webサービスづくりのチュートリアルがnoteとかでも増えて良いなあと思ったのでまとめてみた。基準は下記。

* 初心者でも楽しめるレベル
* 完了したらwebサービスを作れる、楽しめる
* 所要時間そんなにかからない（railsチュートリアルはかかりすぎ）。サクッとが重要。

# rails

## 【Big Tweetチュートリアル】Ruby on Railsで簡単なサービスを作ってみよう！（初学者向け）

https://note.mu/ysk1180/n/n551cafc1f8e1

必要そうな技術

* rails

# 機械学習

## 【AIプログラミング】LINEに画像を送ったら自動で文字起こししてくれる機械学習アプリを作ろう
https://note.mu/daikawai/n/n9e203dd4063a?magazine_key=mf629e9cefc1b

必要そうな技術

* javascript
* GAS
* LINE API

## 【Pythonで5万円稼ぐ技術をつけよう①】ツイッターの自動化ができるクローリングアプリを作ろう
https://note.mu/daikawai/n/n255d06e5d1a6?magazine_key=mf629e9cefc1b

必要そうな技術

* python

## スケベAI「スケベ博士」をPythonとGoogle Apps Scriptで作るスケベ・チュートリアルを公開します
https://note.mu/daikawai/n/n252b3f8d1138?magazine_key=mf629e9cefc1b

必要そうな技術

* GAS
* python
* LINE API

## プログラミング初心者でも無料で簡単にLINE BOTが作れるチュートリアル
https://note.mu/tatsuaki_w/n/nfed622429f4a

必要そうな技術

* GAS
* LINE API
* javascript

googleスプレッドシートをDB代わりに使うの面白そう。
tf.clip_by_value

# はじめに
強化学習,DQNのモデルで使われていました
# 前提
Tensorflow1.8
# Gradient Clippingについて
tensorflowでは以下のような行列の切り取りをするopsをいくつか提供しています.このような関数はデータの切り取りにも使えるし,よく勾配の発散や消失を防ぐことにも使われます.

* tf.clip_by_value
* tf.clip_by_norm
* tf.clip_by_average_norm
* tf.clip_by_global_norm
* tf.global_norm


## tf.clip_by_valueの定義

```python
tf.clip_by_value(
    t,
    clip_value_min,
    clip_value_max,
    name=None
)
```
行列(t)を与えて,最小値(clip_value_min)と最大値(clip_value_max)を決め実行することで,その範囲外の値を切り取る.ここでの切り取るとは値を削除するという意味ではなくclip_value_max以上の値はclip_value_maxの値に,clip_value_min以下の値はclip_value_maxの値に修正するという意味である.

##　使い方確認

```python
import tensorflow as tf

a = tf.clip_by_value([1,0.3,-10,0,2,0.4,6,],0.0,1.0)

sess = tf.Session()
a_result = sess.run(a)

print("length = {},\ntype = {}\nvalue = {}".format(len(a_result),type(a_result),a_result))
```
PythonでExcelデータのマイニング

# 概要

私のところには、多数のExcel(xlsx)ファイルが存在します。
私が作成したものであったり、他の人が作成したものであったりします。
そして、それらを定期的に収集や集計をして、報告する必要があります。
毎回、いちいちファイルを開いて収集や集計するわけですが、
あるときふと、その手間が惜しくなり、pythonのopenpyxlを使って
効率的にデータ収集する方法を検討し、実装しました。
比較的うまく行ったので共有したいと思います。

# 環境
macbook
Python 3.5.1
openpyxl 2.5.3  

# やったこと

xlsxのデータマイニングをするpythonライブラリを比較したところ、
openpyxlが良いとのことなので使ってみた。

https://note.nkmk.me/python-excel-library/

今回は、データマイニングが目的なので、
xlsxの作成や編集の機能ではなく、
xlsxファイルを開いたり、データを取り出す機能にフォーカスしたところ、
openpyxlが使いやすそうだったので選択肢ました。

## 構想

excelファイルには２通りの使い方があり、
１つは行と列がしっかりしているシンプルなもの、
もう１つは帳票のような複雑なもの。
前者は、openpyxlを使うまでもなく、直接pandasで読み込んだほうが良いと思うが、
後者は、行と列がしっかりしていないので、
データを取り出すには工夫が必要。

また、前者であっても、ヘッダーが複数行に分かれていて、
ピポッドテーブル的に使えないExcelも同様にうまくいかない。

従って、データマイニングの手順は以下とする。

キーワードが含まれるcellの位置を取得する。
そこから右下方向に次のキーワードを探しに行く。
最後のキーワードが見つかったら、そこからのオフセット位置のデータを取得する。

こうすることで、同じ列名があったとしても、
親の列名で絞り込んだ後に子の列名でデータを取得できる。
（行と列が逆で、親の行名で絞り込んだ後に子の行名を取得も可能）

# 使用したデータ

使用したデータは以下。
オープンデータでxlsxを検索して見つけた適当なもの。

行政保有データ(統計関連)の棚卸し結果
http://www.data.go.jp/data/dataset/cas_20180312_0001

# 使用例

親の行名：「管理職への任用状況等について」
子の行名：「業務統計」
取得したいデータ：業務統計の２つ右のセルデータ

まず、xlsxファイルを開く。

```python
pyxl = MyOpenpyxl('tanaoroshikekka_toukei.xlsx')
```

次に、親の行名が含まれるセルを探す。
cell_parentには、親のセルが返る。
col_idxとrowにそれぞれ行番号と列番号が入る。

```python
cell_parent = pyxl.get_cell('管理職への任用状況等について')
cell_parent.value, cell_parent.col_idx, cell_parent.row
('管理職への任用状況等について', 3, 12)
```

最後に、親のセルを起点（＝cell_from)に、子の行名が含まれるセルを探す。
今回はオフセットを指定しているので、業務統計セルのx方向（col）に２、y方向（row)に０のデータの値を返す。
valueに求めたい値が入っている。

```python
cell_child = pyxl.get_cell('業務統計', cell_from=cell_parent, offset_x=2, offset_y=0)
cell_child.value, cell_child.col_idx, cell_child.row
('12～１月', 6, 12)
```


# コード

```python

import openpyxl as px

class MyOpenpyxl:
    
    def __init__(self, filename):
        self.wb = px.load_workbook(filename)
        self.ws = self.wb.active

    def get_cell(self, keyword, offset_x=0, offset_y=0, cell_from=None):
        try:
            min_col = cell_from.col_idx
            min_row = cell_from.row
        except AttributeError:
            min_col, min_row = 1, 1

        for col in self.ws.iter_cols(min_row=min_row, min_col=min_col,
                                     max_row=y+30, max_col=x+30):
            for cell in col:
                if cell.value != None and keyword in cell.value:
                    return self.ws.cell(row=cell.row + offset_y,
                                        column=cell.col_idx + offset_x)
        return None
```

# まとめ

１つずつExcelファイルを開いていたときと比べて、
サクサクとデータ収集出来ました。
更にCLIコマンドのラッパーを作って、より便利なツールを作ってみたいと思います。
scoop でパッケージ管理する bucket が変更された時の追跡の仕方 ( 主に Java )

久しぶりに scoop パッケージの棚卸しをした際、こんな事になっていた。

```powershell
PS> scoop status
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/20198/fc6d0a96-abd4-d9f0-9db2-7e1893d13301.png)

メンテナンスによって、**openjdk のマニフェストファイルが [main Bucket](https://github.com/lukesampson/scoop) から無くなっていた**。
( 因みに Bazel の方は、extras Bucket から main Bucket に昇格していた )

# Java Bucket

では、Java はどこに行ってしまったのかというと、どうやら Java 関連のパッケージをまとめて独立させたらしい。

https://github.com/lukesampson/scoop/wiki/Java
https://github.com/se35710/scoop-java

これは公式 Bucket なので、以下だけで追加が可能

```powershell
PS> scoop bucket add java
```

# バージョンアップ

ということで、ようやく openjdk もアップグレードできるな、と思っていると、

```powershell
PS> scoop update openjdk

# openjdk: 1.8.0.141-1 (latest version)
# Latest versions for all apps are installed! For more information try 'scoop status'
```
できない。

どうやら、**Bucket を移動したものは更新を追跡しないらしい**。
さて、どうしよう。

## A. 最終手段

どうしようもない場合、一回消して入れ直せば対応はできる。

```powershell
PS> scoop uninstall openjdk
PS> scoop install openjdk
```

しかし、これだと過去バージョンも全て削除されるので、場合によっては困ったことになる。
( 以前、同様の手段で Conda 環境を全バージョン削除してしまった。 )

## B. 裏技

**これは裏技なので、失敗しても泣かないように**

では、scoop は何故、無くなった main bucket の manifest にこだわるのか。
実は、`~/scoop/apps/APP_NAME/current/` 以下に各アプリケーションの最新の実体があるのだが、どうやらその中の `install.json` を見て Bucket を判定しているらしい。

なので、以下のように変更することで、アップデートが追跡できるようになる。

```diff:install.json
{
+    "bucket":  "java",
    "architecture":  "64bit"
}
```

```powershell
PS> scoop update openjdk
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/20198/de2b45ed-7f21-c9b0-1630-21388fc93725.png)

ちなみに、Bazel のように main に昇格した場合は、`"bucket":  "extras"` の行を丸ごと消せば良い。

# おまけ

Java Bucket に移動したことで、JRE/JDK が **ビルド毎 × バージョン毎** に提供される事になったので、システムのバージョン切り替えを scoop で管理することができるようになった。

◆ 提供パッケージ

- Oracle Java
- OpenJDK
- Zulu
- ojdkbuild
- AdoptOpenJDK

◆ 切り替え

```powershell
PS> scoop install openjdk9 openjdk10 zulu10

# Open JDK 9 に切り替え
PS> scoop reset openjdk9

# Open JDK 10 に切り替え
PS> scoop reset openjdk10

# Zulu 10 に切り替え
PS> scoop reset zulu10
```

これで、`java` コマンドと `JAVA_HOME` の参照先を切り替えてくれる。シビアな開発してなければこれで十分。
history コマンドをシェルスクリプト内で使う方法

Bash の場合、スクリプト内での history コマンドはデフォルトで無効化されています。

history コマンドを有効にするためには、
以下のように -o history オプションをセットします。

```shell
#!/bin/bash
set -o history  # historyを有効化
export HISTTIMEFORMAT='%F %T '  # historyの出力に時刻情報を追加

echo test

history
```

上記を実行すると、

```log
 1  2018-04-29 11:58:47 export HISTTIMEFORMAT='%F %T '
 2  2018-04-29 11:58:47 echo test
 3  2018-04-29 11:58:47 history
```

という風にスクリプト内で実行したコマンドの履歴が出力されます。

スクリプト内での実行履歴ではなく、
コマンドプロンプトに打った履歴がほしい場合は、

```
history -r /path/to/.bash_history
```

のようにして履歴ファイルを読み込むこともできます。
（ファイルの場所はシェル変数のHISTFILEで指定されています）
Node.js + Expressの使い方

[前回](https://qiita.com/kamihork/items/cc7d01195b1a5d283bba)の続きになります。
今回は、Node.js + Expressを使い、Hello Worldを行います。

# npmとは
npm = Node Packge Managerの略。

- JavaScriptのパッケージマネージャー
- JSモジュールをいろんな人が再利用できるようにするエコシステム
- モジュール情報や依存関係等のプロジェクトに関する基本情報をpackage.jsonに保持する

## npmの使い方
### プロジェクトの初期化（=package.jsonの作成）

```
npm init
```
※ --globalオプションでグローバル（プロジェクトをまたがった）インストールが可能

### パッケージのインストール
■ 例 : utf-8以外のファイルを読み書きするパッケージをインストール
※ パッケージの種類は[https://www.npmjs.com/](https://www.npmjs.com/)を参照


```
npm install iconv-lite --save
```

### インストールしたモジュールの確認

```
npm ls
```

### モジュールの利用

```node.js
// httpモジュールの用意
var http = require('http');
```

のように、モジュールはrequireで読み込む。
※ 一度requireされたものはキャッシュに残るため、複数ファイルにまたがるようなrequireについて無限ループすることはない。


### モジュールの作成
1. jsファイルに記述
2. module.exportsへモジュール化したいものを出力

■ 例1 : 出力値が関数の場合

```module1.js
module.exports = function () {
    console.log("Hello World");
};
```

```export.js
// 関数の場合
(function () {
    var module = require("./module1.js");
    module();
})();
```

■ 例2 : 出力値が文字列の場合

```module2.js
module.exports = "こんにちは"
```

```export.js
// 文字列の場合
(function () {
    var module = require("./module2.js");
    console.log(module);
})();
```

■ 例3 : 出力値クラスの場合

```module3.js
var PolarBear = function (height, weight) {
    this.height = height;
    this.weight = weight;
};

PolarBear.prototype.power = function () {
    return this.height * this.weight;
};

module.exports = PolarBear;
```

```export.js
// クラスの場合
(function () {
    var PolarBear = require("./module3.js");
    var obj = new PolarBear(200, 450); 
    console.log(obj.power());
})();
```

# Expressとは

- Webアプリケーション開発のフレームワーク
- Node.jsで作成するサーバーサイドWebアプリケーションのデファクトスタンダード
- Express自体は最低限の機能だけ提供しており、必要なミドルェアを組み込んで拡張子する必要がある

## 単独でできること/できないこと

- ○ : ルーディング
- ○ : レスポンスの整形 
- × : クエリパラメータ分析
- × : クッキー分析
- × : セッション管理
- × : 認証許可
- × : DB接続

## ミドルウェアの例
リクエスト分析 : cookie-parser, bode-parser
セッション管理 : expresss-session
認証 : passport

# Hello World
1, プロジェクトの初期化

```
npm install
```

以下のようなpackage.jsonの設定を行う。
※ エントリポイントをapp.jsと置いている。


```package.json
{
  "name": "sample",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "kamihork",
  "license": "ISC",
  "dependencies": {
    "express": "^4.16.3",
    "iconv-lite": "^0.4.23"
  }
}
```

2, expressのインストール

```
npm install express --save
```

※package-lock.jsonが自動生成される。

3, app.js

expressはcoreモジュールに対し拡張を行なっている。
httpモジュールに対しても拡張を行なっており、例えばgetメソッドのみに対してのみ処理を行いた時は、以下のように記述することができる。

```app.js
// moduleをrequire
var express = require("express");
var app = express();

// getパラメータに対する処理を記述
app.get("/", (request, response) => {
    // response.writeHead(200);
    // response.write('hello world');
    // res.end();
    // -> expressでの場合、こう書くこともできる
    response.status(200).send("Hello World");
});

// ポート指定で接続
app.listen(3000);

```

以上、[http://localhost:3000/](http://localhost:3000/)にアクセスすればHello Worldできる。
[メモ] 最小限の手間で、debパッケージ作成 (非推奨)

最小限の手間で、debパッケージを作成する(非推奨)

# 概要

- 最小限の手間で、debパッケージを作成する。
- 生成物と、`control` ファイルに3行書けば(`Package:`, `Version:`, `Architecture:`)、とりあえず、できる。<br>(Warningがでるので、`Maintainer:` と `Description:` も入れるとベター)
- Debianの関係者の方からは、怒られる方法だと思うので、プライベートな使用にしておきましょう
- [www.debian.org](https://www.debian.org/)
=> [文書](https://www.debian.org/doc/)
=> [Debian メンテナ入門](https://www.debian.org/doc/devel-manuals#maint-guide)
=> [日本語 HTML](https://www.debian.org/doc/manuals/maint-guide/index.ja.html)
=> [4. debian/ ディレクトリー以下に無くてはならないファイル](https://www.debian.org/doc/manuals/maint-guide/dreq.ja.html)

# 環境
- Debian Stretch

# とりあえず実行例

1. 以下をコピペすると、`hellodeb.deb`ができるハズ。

	```bash:以下コピペする
	#フォルダ作成
	mkdir -p hellodeb/DEBIAN
	mkdir -p hellodeb/usr/local/bin

	# インストールする実行ファイル作成
	cat <<'EOF' > hellodeb/usr/local/bin/hellodeb.sh
	#!/bin/sh
	echo 'Hello Deb!'
	EOF
	chmod a+x hellodeb/usr/local/bin/hellodeb.sh
	
	# DEBIAN/controlファイル作成
	cat <<'EOF' > hellodeb/DEBIAN/control
	Package: hellodeb
	Version: 1
	Architecture: all
	Maintainer: mt08
	Description: Hello Deb!
	EOF

	dpkg-deb --build hellodeb

	# hellodeb.debができているハズ
	```

2. 作成したdebファイルを使ってみる

	```shell-session:使用例
	vagrant@stretch:~$ pwd
	/home/vagrant
	vagrant@stretch:~$ dpkg-deb --build hellodeb
	dpkg-deb: building package 'hellodeb' in 'hellodeb.deb'.
	vagrant@stretch:~$ sudo apt install -y ./hellodeb.deb
	Reading package lists... Done
	Building dependency tree
	Reading state information... Done
	Note, selecting 'hellodeb' instead of './hellodeb.deb'
	The following NEW packages will be installed:
	  hellodeb
	0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
	Need to get 0 B/668 B of archives.
	After this operation, 0 B of additional disk space will be used.
	Get:1 /home/vagrant/hellodeb.deb hellodeb all 1 [668 B]
	Selecting previously unselected package hellodeb.
	(Reading database ... 27807 files and directories currently installed.)
	Preparing to unpack /home/vagrant/hellodeb.deb ...
	Unpacking hellodeb (1) ...
	Setting up hellodeb (1) ...
	vagrant@stretch:~$ hellodeb.sh
	Hello Deb!
	vagrant@stretch:~$ which hellodeb.sh
	/usr/local/bin/hellodeb.sh
	vagrant@stretch:~$ sudo apt remove -y hellodeb
	Reading package lists... Done
	Building dependency tree
	Reading state information... Done
	The following packages will be REMOVED:
	  hellodeb
	0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
	After this operation, 0 B of additional disk space will be used.
	(Reading database ... 27810 files and directories currently installed.)
	Removing hellodeb (1) ...
	dpkg: warning: while removing hellodeb, directory '/usr/local' not empty so not removed
	vagrant@stretch:~$ hash -r
	vagrant@stretch:~$ hellodeb.sh
	-bash: hellodeb.sh: command not found
	```

# ちょっとした手順説明

1. パッケージ名のフォルダを作成
2. パッケージ名フォルダの中に、`/`(ルート)へコピーされるフォルダ構成で、ファイルを入れる。
3. パッケージ名フォルダ/`DEBIAN`フォルダを作成し、その中に `control`というファイルを以下の内容で作る

	```txt:パッケージ名フォルダ/DEBIAN/control
	Package: hellodeb
	Version: 0.1
	Architecture: all
	Maintainer: mt08 <mt08@email.address.dayo>
	Description: Hello Deb!
	```

4. `dpkg-deb --build パッケージ名` を実行


# その他
- 依存パッケージ(`Depends:`)とかもあるので、そのへんは、ググる。
phpStorm買ってもらった話

# 背景
phpStormは有償のIDEですが、とても便利です。
自分でも使いたいですし、特にこだわりが無ければ同僚にも使って欲しい。
とはいえ、「便利」「かしこい」では予算が取れないところも多いと思います。取れませんでした。
なので説得用の材料をリストアップしました。

# お詫び
2013~2015年ごろに、当時の現場で主流だったNetbeans、Eclipseとの比較したメモが元で、情報が古いです。
今更新記事として起こすのは躊躇いましたが、何かの役に立つかもしれないということで公開しました。
また、私の知識不足により欠落している点が多々あると思いますので、ご指摘いただけると幸いです。

# いいところ
| 概要 | 補足 |
| ------ | ------ |
| 1つ前/後の操作位置へ戻る | Ctrl + Alt + Left / Right |
| リファクタリングが簡単 | Shift + F6<br>IDEなら大体ありそうだが、Netbeansだと「開かれているプロジェクトの外部で定義されている{ファイル名}はリファクタリングできません」がでていた|
| 設定項目の絞り込みが便利 | 例えば空白文字の表示設定なら<br>File > Settings > 検索窓に"whitespace"<br>Shift*2 > 検索窓に"whitespace" > 候補から Show Whitespaces<br>Ctrl+Shift+A > 検索"whitespace" > 候補から Show Whitespaces<br>など<br>Visual Studio Codeなどにも搭載されている|
| 検索絞り込みが便利 |ファイル名検索はどのIDEにもあるが、同名ファイルが多いと特定が大変<br>Shift*2 > 検索窓に"FooController"  > 候補が大量 > ”BarBundle\FooController”で絞り込める|
| ディレクトリ単位のGit logが見える |プロジェクトタブのディレクトリを右クリックでGit > Show History<br>このブランチに詳しい/手を入れた人は誰か、というのが分かる|
| スペルチェッカーが優秀 | typoがあれば指摘してくれる<br>typoによるデータ受け渡し失敗によるバグなどを防げるかも |
| データベースのサジェストがエイリアス不要かつ部分一致 | fooテーブルにbar_bazとqux_barカラムが存在する場合、<br>select bar[tab key] from foo でbar_bazとqux_barカラムの両方が候補にでる<br>Netbeansだとエイリアス不要だが、カラム名は前方一致しか補完されない<br>(IDEではないが)HeidiSQLではエイリアスが必要で、カラム名は前方一致しか補完されない<br>|
| (symfonyの場合)Serviceもコード補完できる ||
| (symfonyの場合)DIコンテナで取得したものもコード補完できる |phpDocを適切に書いておく必要はある|
| (symfonyの場合)Controllerとtwigが相互に飛べる ||
| カーソルがある行の関数名が分かる | 巨大な関数がなければ不要 |
| 警告が若干シビア | 例えばself::FOOなどが未定義で使おうとしたら警告がでる<br>Netbeansでは出ない |
| 不可視文字が特殊文字として見える | （♂ U+000B）など<br>画面に依るかも<br>コピペ時の混入を防げるかも |
| ローカル履歴を保存 | アンドゥだけではなく、擬似的にgitのように使える |

# 欠点
- 有料
- インターフェースが英語（日本語化パッチも存在はするらしい）

# 購入の前に
- 30日間無料トライアルがあります。
- [大量購入割引](https://sales.jetbrains.com/hc/en-gb/articles/207240655-What-volume-discounts-does-JetBrains-offer-)、[スタートアップ割引](https://www.jetbrains.com/shop/eform/startup)、[継続割引](https://sales.jetbrains.com/hc/en-gb/articles/206386064-What-is-a-continuity-discount-)など、いくつか割引があります。

# 購入先 
本家：[JetBrains](https://www.jetbrains.com/phpstorm/buy/#edition=commercial)
日本代理店：[サムライズム](http://samuraism.com/products/jetbrains/phpstorm)
他にも日本代理店がいくつか増えてるようですが未確認。

# 導入の期待値
超大雑把にエンジニアの人月単価が100万円、アプリが月2000円として
0.2％以上の効率アップが見込めるならアリじゃないでしょうか。

# 結果
無事に予算貰えました。
導入前は懐疑的だったエンジニアからも好評で、全員使い続けてます。
プレゼン時点では、プラスの機能はエンジニアへの受けが良く、
マイナスを減らす（過去に出たバグの再発予防になる）機能は上司への受けが良かった印象ですので、
相手に応じて売り込み方を変えてみてください。

# JetBrainsの中の人に教えてもらった他IDEとの比較記事
たしか2015年3月頃に聞いたはずです。今でも通じるか不明ですが一応。
> Hello,
Thank you for sharing your experience of using PhpStorm. We appreciate your feedback.
I've checked some available data on internet and found those:
1) overview: https://stackshare.io/stackups/eclipse-vs-netbeans-vs-phpstorm
2) ratings: https://www.g2crowd.com/compare/netbeans-vs-phpstorm
3) another article: http://www.discoversdk.com/blog/10-best-php-ides

以上です。
どこの現場でも使えるようになりますように(人-ω-`)
超お手軽!!LINEを使ったwebサーバーの監視

### はじめに
---
別に商用環境でもないし、そんなに真面目にやらなくてもいいんだけど
webサーバーの死活判断を「簡単に」やりたいなぁ(´・ω・`)
しかも、メールじゃなくてLINEに通知こないかなぁ(｀；ω；´)
そんなあなたに2分で作れるweb監視ツール(?)のご紹介

### 用意するもの
---
1. 監視したいwebサーバー
2. 監視するサーバー
3. LINEのアカウント
4. 2分の時間

以上!!

### さぁ作るぞ!!
---
監視するサーバーで作業
どこでもいいですが、下記ファイルを作成
(今回はホームディレクトリにおいてます)


``` emergency.sh
#!/bin/bash

file1=index.html
file2=.emergency

wget https://hogehoge.com >/dev/null 2>&1

if [ -e $file1 ]; then
    rm -f $file1
    rm -f $file2
else
    if [ ! -e $file2 ]; then
        curl -X POST -H 'Authorization: Bearer aaaaaaaaaaaaaaaaa' -F 'message=webサーバーに異常が発生中です。' https://notify-api.line.me/api/notify >/dev/null 2>&1
        touch $file2
    fi
fi
```

※1 hogehoge.comは監視したいwebサーバのドメインを記載
※2 aaaaaは[こちら](https://engineering.linecorp.com/ja/blog/detail/88)を参考に、発行したLINEのトークンを記載

最後にcrontabにでも仕込めばおしまい

```crontab
*/1 * * * * sh ~/emergency.sh
```
(今回は1分おきでの監視)

終わり!!!!!!!!!!!
お疲れ様でした。

### ちょっと解説
---
解説するまでもないと思いますが、今回のスクリプトの動作は
1. 対象webサーバーにwgetをかけて、ファイルをダウンロード
2. ダウンロードできれば、ダウンロードファイルの存在を検知して、ダウンロードしたファイルと異常検知用ファイル(emergency)を削除して終了
3. ダウンロードができず、かつ異常検知用ファイルがなければLINEで通知
4. 異常検知用ファイルを生成
となってます。

異常検知用ファイルは作らなくてもいいんですが、作らないとダウンしたwebサーバーを修復するまで、1分おきにLINEに通知が来るので、鬱陶しい人向け用においておきました。

ブログ始めました、よかったら遊びに来てください
https://red-full-moon.com/
Oculus GoへのUE4アプリビルド時にAndroid SDK APIレベルで躓きました

先日、OculusGoにUE4で作成したアプリを転送しようとビルドしたとき、下記のエラーに遭遇しました。

>Requires at least SDK API level 23, currently set to 'android-21'
>ERROR: Can't make an APK without SDK API 'android-23' minimum installed

-
OculusGoを購入していくつかのアプリを試した頃、UnrealEngine4を使われていることで有名な alwei さんの下記の記事を見かけました。

●UE4 Oculus GoでVRアプリの開発を開始するまでの方法
http://unrealengine.hatenablog.com/entry/2018/05/04/232708

この記事に加え、下記のOculus開発者向けドキュメントも参考に、UE4のプロジェクト設定を行いました。
●Unreal Mobile Development
https://developer.oculus.com/documentation/unreal/latest/concepts/unreal-gsg-mobile/

そして、いざUE4のプロジェクトを転送しようと起動ボタンを押したところで、ビルドエラー通知とともに冒頭の2行がログウィンドウの終わりに出力されました。
要するに、
『APKの作成には最低でもSDK API android-23をインストールしていることが必要だが、現在はandroid-21である。』
ということですね。

GearVRはおろかAndroid端末での開発作業をしたことがなく、ログのSDK APIレベルとは何ぞや？という心境でしたが、SDKのインストールで思い当たる箇所といえば、上記手順の中ではCodeworks for Androidを使用した部分です。
そこで、ログ内容に従い再度Codeworks for Androidを実行し、Android 6.0 (API 23)をインストールしました。
（下の画像ではインストール後のものですので、Action欄がno actionとなっています）

![codeworks.png](https://qiita-image-store.s3.amazonaws.com/0/259518/d3beb437-aa95-b924-49df-eefc0020f70f.png)


その後、改めて先ほど失敗したUE4プロジェクトを再度ビルドしたところ、無事にOculusGoへ転送することができました！

…と、ここまで終えたところで alwei さんの記事中にあった、

>Code Works for Androidのインストールだけ間違わないように注意してください。

の一文を思い出し、今回のようなミスをしないようにと書いてくださっていたのかなと、手順を表面的になぞっていただけの我が身を反省。

-
ちなみに、SDKの追加インストールだけで解決できたかのように書きましたが、
『UE4プロジェクトの保存場所へのパスに日本語が含まれている』
という初歩的なミスもやらかしており、もう少しだけ躓いた、反省しきりの数日間でした。