OmniAICreator/Qiita-1.07M huggingface dataset:
量子ファイナンスの紹介


大学で学んだ量子力学の復習および、業務活用を目的として、経済物理学の1分野である量子ファイナンスについて勉強を始めたので、紹介します.
投稿遅れてしまい申し訳ありませんでした．

#1．量子ファイナンスとは

[Wiki「量子ファイナンス」](https://ja.wikipedia.org/wiki/%E9%87%8F%E5%AD%90%E3%83%95%E3%82%A1%E3%82%A4%E3%83%8A%E3%83%B3%E3%82%B9)から抜粋↓
>　ファイナンスにおける問題を解決するため量子物理学者と経済学者によって発展した理論と方法を応用する学際的な研究領域である。
…
ファイナンスのコミュニティーはオプションの価格付けにおいて表れる結果としてのパフォーマンスの問題を克服する方法を常に探している。
このようなほかの計算方法の一つが量子コンピューティングである。
(抜粋終)

量子ファイナンスとは、ファイナンスにおける複雑な問題を、文字通り量子論的な考え方を適用して克服するということをモチベーションに研究されている．

何本か論文や記事を読んだが、量子ファイナンスという分野は、
大きく分けて下記の2つのどちらかのアプローチに当てはまると思われる．

- ファイナンス領域でよく使われる数式(ブラックショールズ方程式など)を量子論に拡張し、拡張以前では説明できなかったことを説明できるようにする．(下記の1つ目の論文)

- 従来の計算方法に量子アルゴリズムを適用し、計算のパフォーマンスを向上させる．(下記の2つ目の論文)

#2．論文の紹介
 量子ファイナンスの論文を2点紹介します.ただし、計算はすべて追えていなく、完全に理解はできていません．そのため、今回は紹介のみに留まりますが、今後はより具体的な論文紹介もしていく予定．

###The Black–Scholes pricing formula in the quantum context(量子的な文脈における、ブラックショールズ方程式) at 1989/3
https://www.pnas.org/content/95/7/4072

####【要約】

- 金融市場における価格推移の不規則性は量子効果によってもたらされると主張

- ブラックショールズマートン方程式を量子論的に拡張し、極端な価格変動を示す市場の振る舞いに対して、従来のモデルよりも説明、検証可能なモデルを提供した．

※おそらく、ファイナンスに量子力学の考え方を導入した最初の論文だと思われる．
 (もっと古いのがあるよという方がいたら是非教えてください)

###Quantum computational finance: Monte Carlo pricing of financial derivatives(量子コンピュータファイナンス： 金融派生商品のモンテカルロプライシング) at 2018/8
https://arxiv.org/abs/1805.00109

####【要約】

- 金融派生商品のプライシングの計算手法の1つであるモンテカルロ法に、量子アルゴリズムを適用した．

- その結果、精度(標準偏差)を、εとした場合、古典的手法だと、サンプル数に対して1/ε依存性、量子論的手法だと、1/ε^2依存性となることを示した.(計算速度が2次的に向上)
- ヨーロピアンコールオプションとアジアンコールオプションで検証し、2次の速度向上を示すことができた．

#その他
今回紹介したのは、ブラックショールズ方程式関連の話題のみであったが、その他に量子二項モデルというものもあるらしい.

[Quantum Theory for the Binomial Model in Finance Thoery](
https://arxiv.org/abs/quant-ph/0112156)

今後は余力があればこちらの紹介などもしていきたい．
タイトルって何文字まで書けるんだろう？って思ったので，適当に打って試してるんですが，本当にこれ何文字まで書けるんでしょう？調べても出てこないし，検証してみようというのがこの記事の趣旨です．はい，ここ・←ここで100文字目です！本当にどこまで書けるんでしょうね？一度これで投稿してみよう…→普通に全部表示されてたので，限界に挑戦してみましょうか．ええ，タイトルの文字数に上限がないのかってことですよ．もうここまで来たらとにかく打ち込むのみですよ．あ，いま投稿しようとしたら255文字以上はダメって言われてし(ry

255ってキリが良いですよね！（）

---

【参考】こういうのもあるみたいです
[Qiitaの画像アップロード上限について](https://qiita.com/hideto2112/items/4d10343d151249c50fa5) by @hideto2112

---

追記
いつか，「よく知らないQiitaの仕様集」みたいなの作ろうかな

---

更に追記
「Qiita 文字数　制限」で調べても当記事がヒットしないことが発覚
=同じことをやらかす人がほかにも出てくるかもしれない
↓
記事内に「文字数制限」のキーワードを書いて，アクセシビリティを上げる改善をすることにしました
EOS 2018 年 12 月時点の個人まとめ

時間が早いものです。昨年は、[一人で「イーサリアム・スマートコントラクト」 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ethereum-smart-contract)　を頑張りました。今年は EOS でした。

今回は１人じゃないですが、一応無事に最後まで出来て良かったです。

個人の意見になりますが、イーサリアムをやっている開発者の視点から`EOS`を触って感じたことをまとめたいところです。

## EOS が優れているところ
触ってみて、感じた良いところです。

- TPS がやはり速い
    - 記録された最大値は、メインネットで 3,990、テストネットで 9,179 になっています
    - ちょうど今週、[BlockBase, Inc. さん](https://block-base.co/)が[E-Channel - EOSのエアドロ質問箱 -](http://e-channel.io/)サービスをリリースしました。触って見ればお分かりと思いますが、すべてのデータが `EOS` 上に保持しているにも関わらず、普通のウェブサービスと変わらないレスポンスになっています
- エンドーユーザが無料でトランザクション発行できるので、やはり最初の利用ハードルが低くなる
    - イーサリアムはトランザクション発行するために`GAS`が必要ですが、`EOS`の場合エンドーユーザが無料でトランザクションを発行することができるので、`トークンをもらったけど、友達に送金できない`というケースがなくなる
- RDB のテーブルと同じ感じで使えるマルチインデックステーブル仕組みが便利
    - イーサリアムの場合、データベースの概念がなく、全部ステートデータとしてブロックチェーンに乗っているので、保存したいデータは、全部 `mapping` や配列などのデータ型で保持する
    - 対して、`EOS`のマルチインデックステーブルは、普通の RDB テーブルと同じく、行と列があり、普通に `find` で検索できたりするので、理解しやすい

## 困ったこと
実際自分のサービスを作ろうとする時、困ったこと

- 日本語の開発資料が少ない
    - 公式サイト http://eos.io はまだ英語だけ
    - EOS ブロックチェーンのデータ構成などは書かれていない
- BP が各自の開発をやっていて、何をやっているのか、どれを見る必要があるのか、などは分からない
    - たとえブロックエクスプローラだけでもいくつあるので、どれが一番信頼できるかは分かりません
- c++ はやはりハードルが高い
    - 個人的にやはり慣れてない。。。
- CPU / NET / RAM リソースがややこしい
    - 開発者に対して、どう確保するのか、利用制限に引っかかった時どう対応すべきか、いろいろ対応しないと行けない
    - 特に CPU と NET は、自分ではなく、EOS 全体のリソース利用状況と関係しているので、予測が難しい

## 課題
ホワイトペーパーに書いているがまだ実装できてない箇所とか、実際問題が発生した箇所とか、まだ課題がいろいろあります。

### セキュリティ周り
EOS はパフォーマンス重視するため、いろいろ工夫していますが、その中、いくつの対策がセキュリティ面で攻撃しやすい箇所があります。

- ガバナンスについて、実際の遂行はブロックチェーンに乗っていない
    - たとえブラックリスト機能がありますが、BP によって対応していなかったり、データ追加が遅かったりする

- BP のブロック生成順番が固定になっていると、予測できるため、攻撃しやすい
    - ブロック生成時間を 0.5 秒まで短縮するために、現状の BP 順番は固定になっています
    - 前項のブラックリストと合わせて、１つ被害がありました
        - ハッカーのアカウントがブラックリストに入っていましたが、ある BP の対応が遅かったので、その BP だけブラックリストに追加していない
        - ハッカーがその事実を把握できた上で、BP の順番が固定になっているので、その BP ブロック生成している 6 秒の間、持っている残高を他のアカウントに送金できてしまいました

- ステートデータがブロックチェーンに含まれていない
    - イーサリアムはブロックチェーンデータにステートツリーも設けられていますが、EOS の場合、パフォーマンスのため、ステートがブロックチェーンデータに含まれていません
    - そもそも理論上、異なるノードでブロックチェーンデータに従って実行した後のステートデータは、ソフトウェアのバグやネットワークの状況によって異なる可能性がなくはないです
    - そして、先週まさにこの問題が悪用されてハッキング事件が起こってしまいました　⇒　[EOS dapp ハッキング事件と解説](https://qiita.com/blueplanet/items/f06bdabe72f9c3088e9b)
    - なので、根本的な設計を変えるか、ノードの実装を修正するかになると思いますが、対策を取らないとちょっと危ない感じがあります

### スケーラビリティ
- まずリソース周りは、トップレベルの DApp は既に CPU の制限に引っかかっているので、サイドチェーンや layer 2などを検討しているようです
    - DApp がどんどん出ているので、この問題を解決しないと、単に `TPS が 4000 までできる`と言っても意味がありません
- ホワイトペーパーには、百万程度の TPS と書かれていますが、2018 年 １２ 月現在、EOS まだシングルスレッドで稼働していて、マルチスレッドになっていません。
    - リソースの課題が解決出来たら、次は恐らくこの課題になるでしょう
    - イーサリアムのシャーディングが難航していて、サイドチェーンや layer 2などいろいろ検討しているようになっていますが、EOS の場合、結局マルチスレッドを実現できるかどうかを少し心配しているのは本音です

## 告知
困ったことで書いた通り、開発ドキュメントが英語しかなかったり、ブロックチェーンの構成がなかったり、DApp 開発する時結局どこを調査すればよいかは分からないので、苦労していました。
なので、基本のデータ構成から、DApp の開発まで、一連の流れができたら良いなと思い、電子書籍にまとめました。

[![](https://s3.amazonaws.com/titlepages.leanpub.com/eos/hero?1543645393)](https://leanpub.com/eos)
[EOS による分散型アプリケーション開発 魚振江 著](https://leanpub.com/eos)

EOS の基本知識から DApp 開発方法、更にパブリックチェーンへの接続方法まで解説しているので、この一冊で EOS の dapp を開発できるようになると思います。

興味がある方はどうぞ〜

ではでは、メリークリスマス〜
君は全てのケースに備えているか？ 〜コード静的解析のススメ〜 #golang

# 動機

こんなカンジの型と定数リストがあったとします。

```go:a/a.go
package a

type TestKind int

const (
	TestKindHoge TestKind = iota
	TestKindFuga
	TestKindPiyo
)
```

いわゆる列挙というか区分みたいなヤツですが、これに対してswitch文とか書きますよね。

```go:sample.go
switch v {
case a.TestKindHoge:
	// do something
case a.TestKindFuga:
	// do something
case a.TestKindPiyo:
	// do something
}
```

で、実装後に誰か他の開発者が区分が追加したとします。

```go:a/a.go
package a

type TestKind int

const (
	TestKindHoge TestKind = iota
	TestKindFuga
	TestKindPiyo
	TestKindBosukete // Add!
)
```

その時にswitch文のcaseの追加が漏れていて意図しない挙動になったりすることってないでしょうか。

```go
switch v {
case a.TestKindHoge:
	// do something
case a.TestKindFuga:
	// do something
case a.TestKindPiyo:
	// do something
default:
	panic("unexpected")
}
```

などとしておけば最悪実行時に検知はできるかもですが、可能ならビルド時に検知したいですよね。

# 静的解析

`go vet` や `golint` みたいなコンパイル前のコード静的解析で検知することができるのでは？
と思い立ちました。

https://godoc.org/golang.org/x/tools/go/analysis

上のパッケージを使用するとGoの静的解析ツールが作成できます（しかもGo1.12からgo vetで呼び出せる様になるらしい）。

ちょうど日本におけるGo静的解析の（というかGoの）伝道師 @tenntenn さんが超わかりやすい記事を書いてくれました！

[Goにおける静的解析のモジュール化について](https://tech.mercari.com/entry/2018/12/16/150000)
[モジュール化された静的解析の実装を追ってみよう](https://qiita.com/tenntenn/items/65b9a39e6db09efabd74)

本記事ではanalysisパッケージについての詳細は割愛し、上記を参考に作成したツールを紹介します。

# allcasesチェッカー

てな訳で作りました。

[allcases](https://github.com/knightso/allcases)

## インストール

```
$ go get github.com/knightso/allcases/cmd/allcases
```

## 使い方

```
$ allcases [-flag] [package] 
```

- flagは全て `go/analysis` から引き継いだもので、必須ではないです。興味ある方は `allcases -help` でチェックしてください
- package指定はgo tool準拠です

## アノテーション

switch文の前に `// allcases` というコメントをつけることで、評価する値の型の定数全てのcaseが網羅されるかをチェックします。

```go:sample.go
// allcases
switch v {
case a.TestKindHoge:
	// do something
case a.TestKindFuga:
	// do something
case a.TestKindPiyo:
	// do something
}
```

出力例↓

```
/src/sample/sample.go:36:2: no case of a.TestKindBosukete
```

## 最後に

個人的にコード静的解析は今後ブームになるのではないかと予想していたのですが、go/analysisパッケージとgo1.12のgo vet組み込みの話を聞いてますます確信に近づきました。(というか自分が遅れてるだけですでに流行ってるってことかな？^^;)

go vetやgolintなどに用意されている汎用的なチェッカーを使うのみでなく、各プロジェクトに特化したカスタムlinterやanalyzerを開発者が気軽につくることで生産性を上げる開発手法が流行る気がしてます。

さいごにもう一つ、今回のツールを作るのに、やはり @tenntenn さん作の `commentmap.Analyzer`　を利用させて貰いました。ありがとうございました。 :bow:
https://github.com/tenntenn/comment
アノテーションコメントの解析を簡単に行うことができるユーティリティAnalyzerです。Analyzer.Requiresフィールドに設定することで利用できます(^^)
vscodeでflask_sqlalchemyの動的メンバへの参照箇所のpylintエラー(E1101)を抑制する

# 抑制の方法
settings.jsonに以下を追加する。

```
"python.linting.pylintArgs": ["--load-plugins", "pylint_flask"]
```

# どんな時の話？
vscodeでflask_sqlalchemyを使っている時の↓のような赤線がうざい場合の話です。
![sqlalchemy_pylint_warn1.png](https://qiita-image-store.s3.amazonaws.com/0/196303/bacacd6b-0df5-caca-1948-abe3c480a441.png)

# 少しだけ説明
設定次第でpylintによりSQLAlchemyのメンバー参照でE1101が発生しますが、これはライブラリ内で動的に付加されるメンバーへの参照なので安全です。
しかし、だからと言って不用意にE1101全体を抑制するのはあまりよろしくないので、こんな設定が良さそうです。
※pylint_flaskの詳しい仕様までは追っていませんので、思わぬ副作用がある可能性もあります。
　(副作用とはつまり、本来のエラーまで抑制してしまう可能性)
EOS の CPU / NET の問題点と対応方法

## 問題
EOS のスマートコントラクトを運用する時必要になるリソースは、`RAM / CPU / NET` があります。
`RAM` のほうは、データベースのように、自分のサービス状況に従って、データの変動傾向を予測して追加購入すれば良いのですが、 `CPU` と `NET` は、そもそも自分だけではなく、`EOS`ネットワーク全体の状況に従って変動するので、予測が難しい状況です。

## CPU / NET の購入方法
厳密的には、`購入` ではなく、`ステーキング(staking)`か、他のアカウントに代理して`ステーキング`してもらうか、になります

- 保証金みたいに、使いたい `CPU / NET`の分に対して `EOS` をシステムスマートコントラクトに預かっておく感じになります
- もっと多く使いたい時、もっと多く預かって置けば良いですし、それほど必要がない場合は、アンステーキングすれば良いです
- ただ、ステーキングする場合は、即時アカウントに反映されますが、アンステーキングの場合は、３日間の遅延期間があります。３日間立ってからその分の `EOS` がアカウントに戻されます

## 計算方法
`RAM` の購入は、その時のレートに従って、支払った分の `EOS` で換算されて、結果的にそのアカウントが使える `RAM` がいくらバイト増えたという感じになりますが、`CPU / NET` のほうは、絶対値ではなく、相対の値になります。

- まず、アカウントの過去 72 時間分の利用量を合計しておく
- 次に、`アカウントのステーキングしている EOS 量 / EOS　ネットワーク全体がステーキングしている EOS 量`で、そのアカウントが使えるシステムリソースの割合を計算する
- 次に、`その割合 x システム全体のリソース量` で実際使える利用量を計算する

計算できた値は、トランザクションが実行される都度、そのトランザクションで使った量を加算して、実際使える利用量を超えたかどうかを判定しています。

上記の計算方法でお分かりと思いますが、結局使えるリソースは、自分がステーキングした `EOS` だけではなく、システム全体のステーキングしている `EOS` の量と関係しているので、他の人がどんどんステーキングしてくると、自分が使えるリソースがどんどん減って行ってしまいます。

よって、実際サービスを提供する時は、`CPU / NET`の利用状況を監視・対応しないと行けない状況です。

## 対応方法
対応方法として、監視＋自動対応と、事前に多く用意しておくと、２つのやり方があります。

### 監視＋自動対応
このほうのサービスは、まだ少ない印象です。

日本では、[アットコイン株式会社](https://www.atcoin.co.jp) が最近リリースされた https://irex.io/ サービスがあります。
自動対応のほうは、まだ開発中のようです。

### 事前に多く用意しておく
余裕があれば、勿論多く用意しておけば良いのですが、みんな全員行けるわけではないので、少額の料金で別の人に代理してステーキングしてもらうサービスがいくつあります。

- [Chintai - EOS Token Leasing Platform | EOS Dapp Bandwidth Resources](https://www.chintai.io/)
    - `CPU / NET`のリソースを代理してステーキングして頂きたい人と、持っている`EOS` を代理でステーキングしてあげることで利息をもらいたい人と、マッチングするサービス
    - システムの利用手数料がゼロ
    - ![eos_chaintai.jpeg](https://qiita-image-store.s3.amazonaws.com/0/4777/d36acf70-b78f-f0db-8e29-9f3b29c2f62e.jpeg)

- [Bank of Staked](https://eoslaomao.com/bankofstaked)
    - EOSLaomao が開発したサービス
    - 定額のプラン制で、少額の EOS で、いくつの BP から提供してもらった EOS をステーキングしてもらう
    - たとえ、`0.2 EOS` で、`CPU 70 EOS / NET 2 EOS`の分を `7 日間`代理してステーキングして頂くことができる
    - プランや代理・ステーキングは全部スマートコントラクトで管理されている
    - ![bank_of_staked.jpeg](https://qiita-image-store.s3.amazonaws.com/0/4777/6b797fc1-6698-05cb-492d-06b51dfd5b99.jpeg)
- REX
    - EOS システムのリソースレンタルマーケット機能
    - `v1.6.0` で提供する予定
- 番外：[EOS Charge](https://www.eoscharge.io/)
    - アカウントを指定して、そのアカウントのリソースで、有名なコントラクトでどの程度の操作回数ができるかを計算してくれるサービス
    
## まとめ
`EOS` は、エンドーユーザが無料でトランザクションを送信できるようにするため、イーサリアムの `GAS` のような仕組みがありません。その代わりに、ネットワーク全体に対する攻撃を防ぐために、`CPU / NET / RAM`というリソースで制限するようにしています。
AWSソリューションアーキテクト・アソシエイト受験録

#この記事の内容

　AWSソリューションアーキテクト・アソシエイトを受験（運良く合格）したので、その際の準備内容や経験から得た気付きを書いてみます。

#前提条件

　私は大手SIerで、主には、基幹系のアプリケーション開発プロジェクトを担当することが多く、インフラの知識はさほどありません。ただし、業界経験は長いので幅広くうっすらと知っている感じです。
　今年度は、事業部レベルでAWS技術者育成・資格取得に励んでいた（費用的な補助もある）というラッキーな状況で、私のチームからも私含め数名が受験しました。
各自それぞれに前提知識や勉強方法は異なります。

　尚、認定試験に申し込んだ段階で、規約に同意したことになり、試験内容の詳細についてはあまり書けないので、ふわ～っとした表記になってしまう点はご容赦ください。

#まず感想です

　一言でいえば**チャレンジしてみて良かったと思います。**
　実用的なユースケースにもとづいた問題が多く、そのためにはAWSのどのようなサービスを適用するべきか？というのが問われます。なので、単なる知識というよりは知識をベースとして実務にどう適用するか？という感覚が養われます。
　そういう意味ですごく良い試験問題が出るなぁ…と、試験中に感心しました。

　また、ほとんどAWSを使ったことの無い状態からのスタートでしたので、全てが新鮮で大変でしたが、非常に充実した日々を過ごせたと思います。（とはいえ、準備期間が短く最後の方は知識詰め込みで吐きそうでしたｗ）

#どのような準備をしたか？

##AWSのおすすめコース
  [認定の準備](https://aws.amazon.com/jp/certification/certification-prep/)によれば、以下のようなコースが勧められています。

- ステップ 1: AWS トレーニングクラスを受講する
- ステップ 2: 試験ガイドとサンプル問題を確認する
- ステップ 3: AWS ホワイトペーパーおよびよくある質問から学習する
- ステップ 4: 試験対策トレーニングを受講する
- ステップ 5: 模擬試験を受ける
- ステップ 6: 試験のスケジュールを立て、認定を取得する

##実際にやったこと
　しかし、諸事情でこの通りにはやりませんでした。（たぶん上記の通りやったほうが勝率は上がると思いますが…）
　ちなみに、準備期間はUdemy開始から約2ヶ月です。

　まず、トレーニングクラスは３日がかりなので、日程を確保するのが困難でした。従ってここは、後述のUdemyのコースを活用しました。
　また、ホワイトペーパーもある程度目を通しましたが、書籍のほうがまとまっていて良いというおすすめもあり、後述の参考書を４周くらい読みました。
　問題集も取り組みました。

　方法としては、まず、Udemyで実際にAWSに触ってみる。次に、書籍で細部の知識を詰め込む（２周くらい）。そして問題集という順にしました。

　しかしながら、**問題集に全く歯が立たないということに、試験の概ね1週間前に気づきました。**(^^;

　ここからが勝負どころだったと振り返ると思うのですが、問題集で分からないことをググったり色々調べてとにかく知識として吸収する。というのを地道にやりました。意外と読み落としてただけで、書籍にちゃんと書いてあることが多々あり、さらに２周くらい書籍を精読するようにしました。

　最終的に、弱点の部分をUdemy視聴しなおしてみると、座学の部分でちゃんと説明してあったり…
　Udemyをやっている時はとにかく早くマネジメントコンソールを使いたくて、座学の部分はあまりちゃんと聞いてなかったんだなぁと再認識。

　まとめると、あまり色々な教材に手を出さずに、行ったり来たりしながら、復習に務めるのが自分には向いていたのだと思います。


#各種教材などのリンク

##Udemyのコース　

  このコースは非常にお勧めです。講師の方とはTwitterでも色々やり取りさせていただき、励みになりました！自分は知識だけ詰め込むのが嫌な人で、実際手を動かしてみないと気が済まないので、そういう人には特にお勧めです。

　[手を動かしながら2週間で学ぶ AWS 基本から応用まで](https://www.udemy.com/aws-14days/)

##書籍

　コンパクトにまとまっていて最低限の知識が十分得られるという意味で必携だと思いました。ただし、もう２年前の本になるので、これだけだと足りないサービスがあったりします。そこはホワイトペーパーなどでざっと補う必要があります。

　[合格対策 AWS認定ソリューションアーキテクト - アソシエイト](https://www.amazon.co.jp/%E5%90%88%E6%A0%BC%E5%AF%BE%E7%AD%96-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%E5%A4%A7%E5%A1%9A%E5%BA%B7%E5%BE%B3-%E6%97%A5%E7%AB%8B%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A9%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%82%AB%E3%83%87%E3%83%9F%E3%83%BC/dp/486594043X)

#最後に

　受験録ということで、つらつら書きましたので、読みづらくなってしまいました。最後までお読みいただきありがとうございます。
　何かありましたらフィードバックや質問など下されば可能な範囲で対応します。
AdventCalendar2018 7 WordPress でつくるブログメディアの企画で、WordPress のテーマについて


- [x]  6日目
 - WordPress の設定
  - パーマリンク
  - 検索設定
  - ウィジェットの編集
  - ナビゲーションメニューの設定
- [ ]  7日目
 - WordPress のテーマについて
    - 有料テーマのメリット
 - WordPress 独自テーマの作成
 - テーマを GitHub へ登録

# WordPress のテーマについて
WordPress のテーマで何を使うかは悩みどころです。

結論から言えば、私は1万円前後の有料のテーマを購入するのが良いと考えています。

## 有料テーマのメリット
有料テーマは以下の点で優れている場合が多いです。

- デザイン
- 品質


今回は最初からそこまで予算を避けないので無料テーマにします。


# WordPress 独自テーマの作成
独自テーマを作成する場合は、以下の記事を参考にしてください。
[Docker Compose で WordPress のテーマ開発環境を構築 \- Qiita](https://qiita.com/pugiemonn/items/9a40762bbc9ec977fa02)

## テーマを GitHub へ登録
独自にテーマを作る場合は、バージョン管理をシたほうがいいです。GitHub にプッシュしておくと良いでしょう。
AdventCalendar2018 6 WordPress でつくるブログメディアの企画で、WordPress の設定をする


- [x]  5日目 
 - ドメイン取得
 - レンタルサーバーの決定
 - WordPress のインストール
- [ ]  6日目
 - WordPress の設定
  - パーマリンク
  - 検索設定
  - ウィジェットの編集
  - ナビゲーションメニューの設定
- [ ]  7日目
 - WordPress 独自テーマの作成
 - テーマを GitHub へ登録

# WordPress の設定
WordPress の基本的な設定を行います。

# アップデートをする
アップデートします。
<img width="438" alt="スクリーンショット 2018-12-24 5.41.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/5a91664d-c56d-dda7-871e-2fe25bda311c.png">


プラグインを全てアップデートします。
<img width="597" alt="スクリーンショット 2018-12-24 5.10.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/6edc430d-902c-1c14-e573-4e7f6b24c703.png">


# パーマリンク
パーマリンクは以下のページから設定します。
http://aipicks.net/wp-admin/options-permalink.php

# 検索設定
`検索エンジンがサイトをインデックスしないようにする` のチェックを外しておきます。

http://aipicks.net/wp-admin/options-reading.php

# ウィジェットの編集
ウィジェットページにアクセスします。
http://aipicks.net/wp-admin/widgets.php

`メタ情報` のウィジェットを削除しておきます。

# ナビゲーションメニューの設定
最初に設定されているテーマにはナビゲーションは無いのでそのままにします。
AdventCalendar2018 5 WordPress でつくるブログメディアのリリースと実装



# 直近の計画
カレンダーの計画はこの様になっています。

- [x]  企画
    - [x] 3日目 
        - 全体スケジュール
    - [x] 4日目 
        - 類似サイトの調査
- [ ]  リリース & 実装
    - [ ]  5日目 
        - ドメイン取得
        - レンタルサーバーの決定
        - WordPress のインストール

# ドメイン
新メディアのドメインを考えます。
ドメインを考えるのは通常時間がかかります。半日から数日かかるかもしれません。

ただ今回は時間を使わずさくっと決めます。
ドメインの取得は ValueDomain を使用します。ValueDomain に最も慣れているからです。どのドメインサービスを利用しても良いです。

## ai ドメインは高い

前回の投稿で調査した ainow.ai のような、ai ドメインは高いので諦めました。

## 新規ドメインを取得
ドメインは ai という名前をとって aipicks.net にしました。（所要時間10分）


ドメインの次にはサーバーが必要です。

# レンタルサーバーを決める


## なぜレンタルサーバーか
WordPress の導入はレンタルサーバーを利用するのが簡単だからです。

さまざまなレンタルサーバーがありますが、さくらレンタルサーバーやロリポップなどの有名な会社のサーバーで問題ありません。

当投稿では、さくらレンタルサーバーのスタンダードプランを利用します。


# ValueDomain からさくらレンタルサーバーにドメインをふる

以下を参考にします。
[Value\-Domainからさくらレンタルサーバーにドメインを設定する \- Qiita](https://qiita.com/pugiemonn/items/a9e453b3b0542ddf1476)


![アップロードに失敗しました スクリーンショット 2018-12-24 3.50.10.png: 不明なエラー]()

# WordPress のインストール
さくらレンタルサーバーで WordPress をクイックインスールします。

以下を参考にしながらインストールをします。
[さくらレンタルサーバーにWordPressをクイックインストールするポイント \- Qiita](https://qiita.com/pugiemonn/items/06d6af77ee174010e797)

- データベースを作成する
- ドメインを割り当てるディレクトリを作成する

<img width="425" alt="スクリーンショット 2018-12-24 4.06.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/5cba34c2-a428-7623-3263-e27eb2c437ba.png">

クイックインストールでディレクトリは、 `/wordpress` とします。

<img width="508" alt="スクリーンショット 2018-12-24 4.56.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/41397e23-1c37-d300-6b70-25111f31293f.png">

## ディレクトリの修正
現在の WordPress のディレクトリは `http://aipicks.net/wordpress/` のようになっています。

この `/wordpress` からルートに変更します。

WordPress の一般設定のページに移動します。 
`http://aipicks.net/wordpress/wp-admin/options-general.php` のような URL です。

こちらで、 **WordPress アドレス (URL)** と **サイトアドレス (URL)** を `http://aipicks.net/wordpress` から `http://aipicks.net` に変更します。

### ファイルマネージャーからファイルを移動
さくらレンタルサーバーのファイルマネージャーを利用してファイルをコピーします。

<img width="263" alt="スクリーンショット 2018-12-24 5.00.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/4fdc9943-e84b-4a80-42f0-b7914d68a663.png">

<img width="393" alt="スクリーンショット 2018-12-24 5.00.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/fe623f6c-128e-ae5a-0572-3649da9acd87.png">


# 最後に
以上で設定が完了します。
http://aipicks.net/ にアクセスしてページが表示されたら完了です(☝ ՞ਊ ՞)
Maya Typeノードへ、Pythonから日本語文字入力

**Maya Advent Calendar 2018** に空きがございましたので
https://qiita.com/advent-calendar/2018/maya
参戦してみます

***

**Maya Typeツールでも愛が生まれた**
https://qiita.com/it_ks/items/7cfd0c3069b980be8d86

（▲）こちらの内容の続きのようなものを書いていきたいと思います。
「～～でも愛が生まれた」、懐かしいですね。

***

Maya 2016 Ext2らへんで登場したTypeツール(Typeノード)ですが、
Typeノードの **textInput** アトリビュートに set すればpythonからも文字入力できるのですが、
なんと
普通に文字をsetしても受け付けてくれません。
例えばこのような感じです

![type001.png](https://qiita-image-store.s3.amazonaws.com/0/102581/1fc025df-2eb8-bb56-b9f8-c92489e0d3d2.png)

`set('a')` とすれば「a」という文字が入ってくれてもよさそうなものですが、ダメです。
なにならいいのかというと、
先に挙げた記事でもやっているのですが、unicodeコードなら受け付けてくれます。

# コード変換

「a」を入力したければ「a」のunicodeコード '61' を渡す必要があります。
これを得るには「ord」と「hex」を使います。

```python
hex( ord(u'a') )
```

これで大丈夫かと思いきや、まだダメです

![type002.png](https://qiita-image-store.s3.amazonaws.com/0/102581/d01a1ed7-61b9-c3b4-b016-a1187e63f9e1.png)

アトリビュートエディタには「a」を入力できたのですが、
警告が出てTypeノード自体には反映されません。

# 接頭辞

よくみてみると、単に61が得られたのではなく、
16進数として扱うための接頭辞「0x」がついていることがわかります

![type003.png](https://qiita-image-store.s3.amazonaws.com/0/102581/768a381a-308b-d1d5-2a38-50a915b53537.png)

これで大丈夫

![type004.png](https://qiita-image-store.s3.amazonaws.com/0/102581/50fa5b39-a6c8-32c2-ed1c-8c05f1f60586.png)

…かと思いきや、まだダメです

# 複数文字対応

`ord`は一文字しか変換できず、複数文字あたえるとエラーになってしまいます

![type005.png](https://qiita-image-store.s3.amazonaws.com/0/102581/4d619cde-494a-415f-5e1d-57c82d2525db.png)

もうちょっと気合みせてくれよ…

そんなわけで、forに渡して個別に処理します。
さらに、複数文字を　textInput.set　するときは、
文字ごとに **半角スペースで区切り** ます。

これは実際に入力してみて確認しました。

![type006.png](https://qiita-image-store.s3.amazonaws.com/0/102581/adf0e798-4a9b-4542-07fd-2fe0969ddd55.png)

なるほどね。

# できた

以上をまとめて、次のような関数にしてみました

```python
import pymel.core as pm

def set_type_node_text( target_str ):
    # unicode型で来なかったら変換
    if not isinstance(target_str,unicode):
        target_str = unicode( target_str,'cp932' )
    
    # unicodeコードに変換、リストにためる
    input_str = []
    for c in target_str:
        input_str.append( hex(ord(c))[2:] )

    # 半角スペース区切りにして　textInput.set
    pm.selected()[0].textInput.set( u' '.join(input_str) )

target_str = "かきくけこ"
set_type_node_text( target_str )
```

実行時には Type ノードを選択していることを期待しています。

![type007.png](https://qiita-image-store.s3.amazonaws.com/0/102581/dade9977-7eec-1514-f863-0185bce88260.png)

これで愛が生まれた系の文言(?)を与えても大丈夫（大変にシュール）

***

# 参考

タイプ ツール(Type Tool)オプション
https://knowledge.autodesk.com/ja/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2018/JPN/Maya-Modeling/files/GUID-92112B70-161B-4D89-A1E5-BC3D58274EFB-htm.html

ポリゴン テキストを作成する
http://help.autodesk.com/view/MAYAUL/2018/JPN/?guid=GUID-5715F385-F27A-49E0-A624-CB376B669EDC
オフラインリアルタイムどう書く E29 の実装例(BrainF**k)

# はじめに
こちらは、「オフラインリアルタイムどう書く」のBrinF\*\*kによる実装例です。

* 問題の名前 : アンエスケープ
* 問題 : http://nabetani.sakura.ne.jp/hena/orde29unes/
* 実装リンク集 : https://qiita.com/Nabetani/items/f2db9b916c0a301b744f

# コード
[githubのレポジトリ](https://github.com/angel-p57/yhpg/blob/master/e29/solve.bf)より。

```solve.bf
->+>>+>>,+[
 [
  [->+>[->>>]<[>+++++++>+>]<<<<]
  >>>--[---
   <<-<<+<[-[-[-
      ** 3 **
      <<[-
       ** e==1 **
       >>>->>>[-]+>-[+[-]
        ** not slash **
        <->
       ]
       <[-
        ** slash **
        <<<<+>>>>
       ]
      <<<<<<]
      >>>[-
       ** e==0 **
       >>>>>+<[-[[-]
         ** other **
         >-<<[-]<<<<+>>>[->+<]<++++[->+++++++++++<]>>>
        ]>[-
         ** slash **
         <<<<<<+>>>>>>
        ]
       <]>[-
         ** quote **
         <<[-<<<<<+>>>>>]<[-]<++++[->+++++++++++<]<<++<<+>>>>>>>>
       ]
      <<<<<]
     ]>[-
      ** 2 **
      <<[->+>>>>-<<<<<]>[-<+>]
      >>>>[+++++[-]>+<]+>[[-]
       ** not q **
       <-<<<<++<<[-]>>>>>>>
      ]<[-
       ** q **
       <[-]<<<<[-]>+>>>>
      ]
     <<]
    <]>[-
      ** 1 **
      >>>>>+<[-[[-]
        ** other **
        >-<<[-]<<<<+<<[-]>>>>>>>
       ]>[-
        ** slash **
        <<<[-]<<<+++>>>>>>
       ]
      <]>[-
        ** quote **
        <<[-<<<<<+>>>>>]<[-]<<<++>>>>>>
      ]
    <<<<]
   <]>[-
      ** 0 **
      >>[-]>[-]>[-]
   <<<]
   >[<<<[->+<]<[->+<]<[->+<]>>>>>[-<<<<<+>>>>>]>]
  <,+>>>]
  <[
   ** newline **
   [-]<[-]>
  ]
 <<]
 <<<[-]<[->>+<<]>+>-[+[-]
  ** wrong **
  <++++[-<+++++++++>]<.
 >>]
 <[-
  ** correct **
  <-<+[-<+]->+[-.>+]
 ]
 +[[-]<+]++++++++++.[-]
->+>>+>>,+]
```

# 実行例
次のように、問題のパラメータを1行ずつファイルに登録して食わせると、答えを1行ずつ出力するようになっています。

```shell-session:実行例
$ cat input.txt
foo/bar/baz
/foo/bar/baz'/
"
(略)
/"/'//'/"""''//'/"'''
0gK"koYUb""S/p''z/"Et
Foo/Bar/"Hoge'/'Fuga"
$ bff solve.bf < input.txt
foo,bar,baz
-
-
(略)
-
0gKkoYUbS/p''z/Et
Foo,Bar,Hoge'/'Fuga
```
# 概要
上のコードは、次のような有限状態機械を想定して作ったものです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/74396/5890d482-545a-85b3-d7d6-29fa5aaa70f9.png)

本当に細かく状態を細分化すると、Start,End,Abort以外に8種類の状態となるのですが、一部を変数とすることでN,Q,Sの3状態に絞り込みました。
コード中では、Abort,N,Q,Sにそれぞれ0～3の数字を割り当てて管理しています。
※Abortを管理する必要があるのは、一旦Abortになったら延々読み捨てる必要があるから

そして変数としたのはe,qで、それぞれ次のような意味を持ちます。

* e : 最近のスラッシュ以降、エレメントになる文字列が今の所空である ( 0: 空でない、1: 空 )
* q : クォートの開始文字 ( シングルかダブルか )  
  ※実際の処理では、文字は変則divmod8の結果で識別しており、qにはその余り部分を保持します

そのため、コード中では、文字を処理するところの左に e,q,s ( s は状態 ) の3変数を常に持ちまわるようにします。
出力する文字 ( スラッシュのところはカンマに変える ) は、順次左端に送っていって、最後に一括で出力できるようにしています。

# おわりに
正規表現で処理できるんだから、BrainF\*\*kでも書けるよね! ということで、実装してみました。
聖なる夜に贈るインフラ事件簿〜Nginxアクセスログをlogrotateで欠損させてしまった話〜

このエントリーは、GMOアドマーケティング Advent Calendar 2018
（https://qiita.com/advent-calendar/2018/gmo-am） の 【12/24】 の記事です。
GMOアドマーケティングとしては初のAdvent Calendar参戦です。

# はじめに

はじめまして、2017年3月にインフラエンジニアになりました@sandatsです。

インフラエンジニアになって様々な事件(障害)に遭遇したので、それを書きたかったのですがあまりに多かったので、今日はその中で最近起きたNginxのlogrotateの設定を誤って、アクセスログが消失した話を記したいと思います。



 ![Untitled(1).png](https://qiita-image-store.s3.amazonaws.com/0/315813/8d0487a8-a629-efdf-533b-62e2fd27c48b.png)



# TL;DR

logrotateのpostrotateとNginxのログ書き込み動作を把握しておらず、ローテートする瞬間のログが一部消失していた。

# 詳しく

一部のプロダクトで、Nginxのログを整形し集計ログとして扱っていました。

ログの書き込み先は以下の通り。

```
Nginxログ : /var/log/nginx
logrotateで整形されたログ出力先 : /var/log/nginx/preformatted
```

ログの整形は、logrotate内のprerotateでシェル芸を駆使して行うという奇想天外な手法で行っていました。
(同じ方法使っている人が居たらごめんなさい)

## logrotate設定内容

```
/var/log/nginx/*.access.log
{
    create 0644 hoge hoge
    missingok
    hourly
    rotate 24
    nocompress
    dateext
    dateformat -%Y%m%d%H
    sharedscripts
    prerotate
        for filename in $1; do
            cat $filename | sed 's/\\x22/"/g' | sed 's/-}$/{}}/g' | gzip -c > /var/log/nginx/preformatted/`basename $filename`-`date -d '1 hour ago' '+%Y%m%d%H'`.gz
        done
    endscript
    postrotate
        [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
        for filename in $1; do
            cat $filename-`date '+%Y%m%d%H'` | gzip -c > $filename-`date '+%Y%m%d%H' -d '1 hour ago'`.gz
        done
    endscript
}
```

**あれれ〜おかしいゾ〜？**


既に一部の方はお気付きかと思いますが、 **prerotate内でログを整形し、postrotateでNginxのログを再読み込みした事により、アクセスログの一部が消失してしまっているのである。**

図解すると下記感じになります。

### 1. prerotateの実行

![prerotate.png](https://qiita-image-store.s3.amazonaws.com/0/315813/eaf93f8a-caf3-4e88-f49c-7a2f2181b0ce.png)

時間を跨ぐと、/etc/logrotate.hourly/nginx がキックされ、preroteが実行される。

### 2. postrotateの実行

![postrotate.png](https://qiita-image-store.s3.amazonaws.com/0/315813/396c8e8f-856c-9297-80ff-ea4cde5c220d.png)

postrotate内でログを圧縮します。(何故かloglotate設定内のcompressで行っていませんでした。

### 3. ログが消える

![ログ削除.png](https://qiita-image-store.s3.amazonaws.com/0/315813/dd4d6242-3d0d-08ff-cfde-4db1a098f6c1.png)

＿人人人人人人人人人＿
＞　突然のログ消失　＜
￣Y^Y^Y^Y^Y^Y^Y^Y￣

突然でもなんでもないですが、prerotateが実施された後に書き込まれたアクセスログは、整形後のアクセスログ内には書き込まれていませんでした。

## その後

prerotate→postrotate、postrotate→lastactionへ修正し、ログの欠損は無くなりました。


## そもそもどうやって気づいたのか

Nginxのupstream先でJAVAアプリケーションが動作し、そのアプリケーションが出すログと比較した結果、差異があり発覚しました。


## 反省点

- ログローテート設定のレビュー
 - 整形後のログが正しく出力されていたので、そこで問題ないと思ってしまっていた

- 実稼働後のログチェック
 - トラフィックが徐々に増え、差異が大きくなりようやく気付いた。
 - そもそもlogrotateのpostrotateで何が起こっているのかしっかり把握していればこんな事にはならなかったはず…:cry:


# 最後に

こんな事件もありましたが、なんとか元気にインフラやってます。
他にも様々な事件があったので、自分への戒めという意味も込めてお伝えできたらなあと思います！


明日はいよいよカレンダーも最終日！ @dandasoさんのお話です。
[GMOアドマーケティング Advent Calendar 2018](https://qiita.com/advent-calendar/2018/gmo-am) 最終日の投稿もお楽しみに！

■エンジニアによるTechblog公開中！
https://techblog.gmo-ap.jp/
■Wantedlyページ　～ブログや求人を公開中！～
https://www.wantedly.com/projects/199431
■エンジニア採用ページ　～福利厚生や各種制度のご案内はこちら～
https://www.gmo-ap.jp/engineer/
■エンジニア学生インターン募集中！　～有償型インターンで開発現場を体験しよう～
https://hrmos.co/pages/gmo-ap/jobs/0000027
Home Assistant (hass.io) と Google Home で自宅のレガシーデバイスを操作する話

(内容に知見めいたことはあまりなく、自分はこうやっている、という紹介だけの記事です！)

# Google Home に任意のデバイスを追加したい


Google Home は様々な家電に対応しているようだが、それ単体では既存のレガシーデバイスとの接続はできない。 私の手元には昔買った [IRKit](http://getirkit.com/) があるが、これだけだとあまりスマートな利用法にならない。

- IFTT の起動フレーズで「エアコンつけて」などと登録すると [予約語と衝突して怒られる](https://keycox.hatenablog.com/entry/2018/04/12/215721)という問題がある (ショートカットを使えば良いようだが)。最近は改善されただろうか？
- IFTTT で追加したデバイスはただのスイッチにしか見えないのがちょっぴり残念。

そこで、自宅の家電を [Home Assistant の Google Assistant 拡張](https://www.home-assistant.io/components/google_assistant/) と IRKit やスマートスイッチを使ってレガシーな照明やエアコンを操作するようにしてみた。 それに加えて、スクリプトによる制御も入れてみた。 これにより、

- 「エアコンつけて」「でんきつけて」で照明やエアコンを（予約語衝突の心配なしに）コントロール
- 「おはよう」ですべての照明を同時に点灯
- 「おやすみ」で、暖房のオンタイマーを翌朝 5時にセットして照明を消灯（これが地味に便利）

ということができており、かれこれ１年以上、問題なく運用している。家ではほかに Chromecast でテレビを操作したりするので Google Home の発声操作自体に抵抗はなく、非常に便利に使っている。

Home Assistant 自体は以下のようにややしょぼい見た目だが、一度設定したら開かないので気になることはない。

![hassio.png](https://qiita-image-store.s3.amazonaws.com/0/8163/671ddb5b-91b9-944e-e7e8-7611cc194297.png)


より具体的には、自宅サーバー (Raspberry Pi など) に [Home Assistant (hass.io)](https://www.home-assistant.io/) を入れると、Google Home に任意の仮想的なデバイスを追加できるようになる。
メリットとしては、

- 手元のデバイスをより適切な種類の家電として Google Home に追加できるようになる
- 予約語の衝突を気にせず操作できるようになる (ショートカットも不要)
- 複数の操作の組み合わせもシェルスクリプトで書ける

などの恩恵が得られる。一方、面倒な点も多々ある：

- Home Assistant へのデバイスの登録が必要
  - configuration.yaml を編集するのは少し面倒
- サーバーの https を公開するのが必要
  - Let's Encrypt などを使うことになる
- Actions on Google の設定が必要
  - 自分専用の Google Home のサービスプロバイダを作ることになります。 初期設定がわりと面倒なのと、しばらく放置したあと unlink すると 再リンクできなくなることがあります (ありました)
  - 面倒であれば [Home Assistant Cloud](https://www.nabucasa.com/) の有償サービスを使う？
- 実はエアコンをコマンドラインで操作する方法はないので、Home Assistant をカスタマイズする Python コードを書く必要があった


## Home Assistant のインストール

[色々あります](https://www.home-assistant.io/docs/installation/). 私は Raspberry Pi に [Manual installation on a Raspberry Pi](https://www.home-assistant.io/docs/installation/raspberry-pi/) の方法で入れました。

## Google Assistant の設定、Actions on Google の設定

[Google Assistant コンポーネントの説明ページ](https://www.home-assistant.io/components/google_assistant/) の First time setup を参考にセットアップ。

スマホの Google Home アプリに `[test] あなたのアプリ名` が出てこれば成功。
URL などの設定を変えたら Actions on Google のページで Test を押して更新するのを忘れずに。

## Home Assistant へのデバイスの追加、カスタマイズ

- [私の自宅の設定](https://github.com/keigoi/hass-config/) を晒しておきます。
- エアコンをコマンドラインで操作するために [カスタムコンポーネント](https://github.com/keigoi/hass-config/blob/master/custom_components/climate/command_line.py) を作りました。適当に書き散らかしてます。元は Home Assistant の他の部分のコードのコピペです。
- script も Google Home から呼べます。
  - 複数の機器を同時に操作できて便利です。

## こまかい話


- エアコンは Home Assistant 側から Thermostat として見えるようにしている（Google にとってのエアコンはこいつのことらしい）。
- 私の場合、IRKit の設定がかなり原始的なので結構手間がかかってしまったが、もっと賢いリモコンであれば簡単にできるのかもしれない。
  - (一応 [もっと多機能な学習リモコン](https://smartio.life/smartspeaker/setting/google-home/air-con/) も世の中にはある)
Gitlab で リポジトリをローカルにクローンする

# 概要
Gitlabのリポジトリをローカルにクローンするまでにけっこう時間がかかったので
備忘録がてら手順を書いていこうと思う。


## 前提環境
- ローカル端末がMac
- MacにGitがインストール済み
- Gitlab上にリポジトリを作成済み

## 流れ
1. ローカル環境にGitlab用の暗号鍵を作成する
2. Gitlabに作成した公開鍵を登録する
3. Macにリポジトリをクローンする  

### 1. ローカル環境にGitlab用の暗号鍵を作成する
まずはクローンする前の下準備を行なっていく。
Macのターミナルを開き以下のようなコマンドを実行し暗号鍵を作成しよう。  

1. **暗号鍵を作成**　※コマンドを実行するといくつかy/nが聞かれるが、今回はすべてに`Enter`を押す。
 
    ```bash
    $ ssh-keygen -t rsa -f id_rsa_gitlab    #id_rsa_gitlabをファイル名として暗号鍵を作成
    ```

1. **鍵の権限変更**
お次は、暗号鍵の権限を変更してあげよう。
権限が適切でないとGitlabに接続できないので忘れずに行うこと。

    ```bash
    $ chmod 600 ~/.ssh/id_rsa_gitlab ~/.ssh/id_rsa_gitlab.pub    # 暗号鍵の権限を600に変更する
    ```

1. **公開鍵の内容を控える**
次の手順でGitlabに作成した公開鍵の内容を登録するので、コマンドの出力結果をクリップボードにコピーしておこう。

    ```bash
    $ cat ~/.ssh/id_rsa_gitlab.pub
    ```

出力結果をコピーしたら暗号鍵の下準備はできたので、次は作成した鍵をGitalabに登録していく。
  
### 2. Gitlabに作成した公開鍵を登録する
1. https://gitlab.com にログインし、画面右上のアカウントアイコンから「setting」を開く
1. 画面左のサイドメニューから「SSH Keys」を開く
1. `key`欄に先ほど控えておいた公開鍵の内容をペーストする
1. `Add key`をクリックし鍵を登録する
 
以上でGitlab上にMacの公開鍵の登録は完了。
これでやっとリポジトリをクローンできる状態になったので
いよいよ次はリポジトリをクローンしていく。

### 3. Macにリポジトリをクローンする  
お待ちかねのリポジトリのクローン手順だ。
まずはGitlab上で操作する。

1. Gitlabトップページの画面左上の「projects」からクローンしたいリポジトリを開く
1. 画面右上の「clone」をクリックし「Clone with HTTPS」欄の内容をクリップボードにコピーする
1. Macのターミナルから以下コマンドを実行しリポジトリをクローンする  
※下記のコマンドのhttps://から.gitまではクリップボードの内容をそのまま貼り付ける、

```bash
git clone https://gitlab.com/TairaU/TairaU.git TairaU # git clone [クリップボードの内容] [ローカルリポジトリ名(任意の名前)] 
```
  
以上でおわり。おつかれさまでした。
## 最後に
手順に起こしてしまえばどうってことはないんだけれど
調べるまでに結構時間てかかってしまうんですよね。
これを見た人はサクサク準備できていたら嬉しいです。
VBAでマストドンにトゥート！

#VBAからマストドンにトゥートしてみよう！(全く需要なし)
やり方は簡単です。
まずソースコードを書く前に参照設定からMicrosoft XML, 6.0にチェックを付けます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176021/79eb3e5a-70b4-48d7-8bc4-14014e136d97.png)

ではソースコードを書いていきます。

```vb:toot関数
Private Sub toot(status As String)
    Const ACCESS_TOKEN As String = "accessToken"
    Dim paramStr As String: paramStr = "&status=" & status
    Dim req As XMLHTTP60: Set req = New XMLHTTP60
    
    With req
        .Open "POST", "https://friends.nico/api/v1/statuses"
        .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        .setRequestHeader "Authorization", "Bearer " & ACCESS_TOKEN
        .send paramStr
    End With

    Set req = Nothing
End Sub
```
これだけです。
```paramStr ```に、status(必須)等のパラメータを追記できます。
たとえば、デバッグ用にvisibilityを判定する関数を作って、それを追加なんてことも可能ですね。
詳しくはMastodonのドキュメント [statuses](https://docs.joinmastodon.org/methods/statuses/) の`Form Data Parameters`を確認してください。
ちなみに、`REQUIRED`と赤字で書いてあるパラメータは、その名の通り必須のため、送信する時はどれか必ずパラメータに入れなければなりません。
今回はstatuses(トゥート文字)を送る想定なので、パラメータ的には成立しています。
```OPTIONAL```は、必ずしもパラメータに入れる必要はありません。
VBAのデフォルト引数で書く```Optional```とほぼ意味は同じでしょう。

#参考サイト
- [エクセルVBAでHTTPリクエストをする最も簡単なプログラム](https://tonari-it.com/excel-vba-http-request/)
- [ExcelVBA、ExcelマクロからHTTPでPOSTする](http://piyopiyocs.blog115.fc2.com/blog-entry-433.html)

#最後に
これ、全く需要ないと思います(なんで書いた)

#追記① 2018/12/25

レスポンスチェックを書いていなかったので一応記載します。
(正直VBAならトゥートされてればどうでもいい)


~~```.send paramStr```の下に以下を記載します。~~

```vb:追記①
Do While .readyState < 4
    DoEvents
Loop
If .responseText Like "*error*" Then _
    MsgBox "エラー", vbOKOnly + vbCritical, "トゥート"
```


JScripttypeinfoにはExistsはないんですかね？使い方がわからない…
解説としましては、```.readyState```が4になったら返事が帰ってきます。
その後、```.responseText```にレスポンスされたJSonが格納されていますので、
```error```があるかどうかをチェックします。(本当はパースした後ExistsでBooleanを返す関数を作りたかった)


#追記② 2020/5/16
単純に```.status```を確認するだけでよかったみたいです。
追記①でもチェックはできますが、忘れてください。

```vb:追記②
Do While .readyState < 4
    DoEvents
Loop
If .status = 200 Then
    MsgBox "トゥートしました。", vbOKOnly + vbInformation, "トゥート！"
Else
    MsgBox "失敗しました。" & vbCrLf & "エラーコード：" & .status, vbOKOnly + vbCritical, "トゥート！"
End If
```
リクエスト結果が、200(成功)かどうかをチェックし、それ以外はエラーとしてみました。

#追記③ 2020/10/21
アクセストークンをURLからヘッダーに入れるよう変更しました。(上記toot関数修正済み)

```vb:変更前
Dim paramStr As String: paramStr = "&access_token=" & ACCESS_TOKEN & "&status=" & status
                                 ～中略～
With req
    .Open "POST", "https://friends.nico/api/v1/statuses"
    .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    .send (paramStr)
```

```vb:変更後
Dim paramStr As String: paramStr = "&status=" & status
                                 ～中略～
With req
    .Open "POST", "https://friends.nico/api/v1/statuses"
    .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    .setRequestHeader "Authorization", "Bearer " & ACCESS_TOKEN
    .send (paramStr)
```

セキュリティ的にまずいとのことなので、```.setRequestHeader``` に入れるよう修正しました。
そもそもなんでパラメータにアクセストークンを記載してもトゥートできるのが、API的に不思議という:thinking:
あとはちょこっとAPIに関するところも追記しました。
【初心者向け】React Nativeだぁいすき 

# はじめに
こんにちは。みなさん。ナンデモアリなアドベントカレンダーラストを飾るのは私,@yutaroudです。
正直何を書こうかめちゃくちゃ迷いました:angel_tone2:。
で、なんか興味ある事について勉強ついでに書きたいなと思いました。
Dockerかな～？k8sかな～？でも最近のフロントエンドのことも少し興味あるしな～Vue.js いやいっそWebGLで three.jsとか行くか～？
いや、Webも面白いけどほとんど作ったことないし、やっぱりネイティブアプリ作りたいよね。ということで
React Nativeやってみようかな～～と思いました！！:airplane:

## React Nativeとは？
[React Nativeとは何なのか？](https://qiita.com/Iwark/items/7c27e919bb71f8b256f6)
上記の記事ですごく纏められている良い記事があったので、詳しくは上記記事を参照してみてください。
iOSとAndroidに一つのコードで動くものが作れる便利なJavaScriptのフレームワークという雑な説明を本記事ではしておきます。
と思っていたらどうやら

React Nativeのコンセプトは、一つのコードでどこでも動くではなく、Learn Once, Run Anywhere(一度学べば、どこでも動かせる）だそう・・・。
[Web開発者、アプリ開発者に捧ぐReactの提唱する"learn once, write anywhere"はどこまで本当なのか？](https://qiita.com/gonta616/items/050a72aadcce44ec9774)

まあその他、なんか問題もあるみたいですが、僕は初心者なのでまあ気にせず行きましょう。
[一部の企業でReact Native離れが始まる](https://tech.nikkeibp.co.jp/it/atcl/idg/14/481709/082000458/?ST=cio-appli&P=1)

## 開発環境
macOS High Sierra ver 10.13.6
Xcode ver 10.1
Node.js ver 8.9.4
npm ver 6.5.0

## Hello Worldやるぞい。
できればiOSとAndroid両方やりたいところですが、今回はiOSだけ時間の都合上失礼いたします。
Node.jsが必要になるので、入っていない方は下記記事参照するのが良いかと思います。
[node.jsのversionを管理するためにnodebrewを利用する。](https://qiita.com/sinmetal/items/154e81823f386279b33c)ついでにnpm入ってない方はいれておいてください。

そしたらFaceBookが開発したファイル監視ツールの[Watchman](https://facebook.github.io/watchman/)を入れます

```terminal
$ brew install watchman
```

でmacOSがHigh Sierraだとたぶんこんなこと言われます。

```terminal
Xcode alone is not sufficient on High Sieera 
Install the Command Line Tools:
xcode-select --install
```
なんかXcodeだけだと不十分らしいです。xcode-select --installと入力しましょう。

つづいて、React NativeのCLIツールを入れていきます。

```terminal
$ npm install -g react-native-cli
```

ここまでで準備は完了です！ 」

それではプロジェクトを作っていきます！名前をHelloWorldにしました！
Node.jsのversionが低いとあれやこれ言われるのでなるべく新しいversionにしておきましょう・・・。
react-native run-iosを実行するとかなり時間がかかりますが、iOSのsimulatorが起動します。

```terminal
$ react-native init HelloWorld
$ cd HelloWorld
$ open ios/HelloWorld.xcodeproj/
```

~~最初react-native run-iosとコマンド打って起動してたが、シミュレータはすぐ立ち上がるがアプリのビルドになぜか失敗した。原因を教えてください。~~

Xcodeが起動したら、左上にある　>　をクリックしてアプリをビルドしましょう（時間かかります。）
![スクリーンショット 2018-12-24 3.12.57.png](https://qiita-image-store.s3.amazonaws.com/0/224825/4d955a6b-e052-3f4b-3292-f88b3b36516b.png)

![スクリーンショット 2018-12-24 3.12.30.png](https://qiita-image-store.s3.amazonaws.com/0/224825/f0babd9a-0b2b-c378-b261-2026109fb26c.png)

やったあ。これで開発環境の完成だあ！（多分本格的にやろうと思ったらもっと色々必要なんだろうけど。）

で、React Nativeのいいところはビルドの時間はかかるが、一度ビルドしてしまえばJavaScriptなのですぐ反映できることらしい。
試してみた。
![画面収録.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/224825/d94014b0-d1a9-8e26-2424-53b94ec436c5.gif)

これかなりええなーーーーー。ちょっと色々試してみようかなと思いました。


### 参考
[React Native入門 ─ Hello,Worldからネイティブ連携まで](https://html5experts.jp/shohey1226/20480/)
# おわりに
みなさん、最後まで読んでくれてありがとうございます～。
良いクリスマスは過ごせましたか？　今年ももう終わりですね。
最後まで悔いのないように大切に一日一日を過ごしていきましょう。
IPv4 によるマルチキャスト

## 1. 概要
この記事では、IPv4 によるマルチキャスト実現のための Golang のサンプルコードを投稿します。

## 2. はじめに
UDP は、信頼性、順序性、完全性は保証されないものの、処理コストが削減できることなどから用途によってはとても有用です。
例えば一般的には、UDP によるマルチキャストは、動画、音声、画像などのストリーム配信や、オンラインゲーム、SNMP、NTP、DNS などでよく利用されています。
また、コンピュータの死活監視制御においては、TCP 通信による監視対象ノードからのレスポンスの監視よりも、UDP 通信による監視対象ノードからの一方的なデータ送信の監視の方が、はるかに効率的に生存確認をする事が可能な場合があります。
更には、これをマルチキャスト方式にすることにより、Hot-standby 構成のような主副関係の集権型監視クラスターを特別に用意しなくても、個々のコンピュータが相互に監視しあう分散型自律ネットワークが可能となりえます。
また、結果整合性データ群については、マルチキャストグループへの一斉同期により、RDB や KVS 等でよくあるマスター/スレーブのような煩雑な主副関係のクラスター構成を排除する事が要件によっては可能となりえます。
これらの設計手法については、集権型管理か分散型管理かなどの 0/1 の極論ではなく、目的に応じて手段を選択していくことによって、より生産性の高い設計が実現できるようになるでしょう。
UDP やマルチキャストはそれらの手段の一つであり、今後は更にこれらが選択される機会は増えていくでしょう。

IPv6 によるマルチキャストの実現方法については次回投稿しますが、今回の記事ではまず、IPv4 のマルチキャスト実現のための Golang のサンプルコードを投稿します。
（IPv6 によるマルチキャストのための Golang のサンプルコードを “[IPv6 によるマルチキャスト](https://qiita.com/KyojiOsada/items/714a6e352707429882e1)” で投稿しました。）

## 3. 環境
* RHEL-7 系
* Go 1.9

## 4. 設計
* IPv4 マルチキャスト送信サーバー x 1
    * sender1: 192.0.2.1
* IPv4 マルチキャスト受信サーバー x 2
    * receiver1: 192.0.2.2
    * receiver2: 192.0.2.3

## 5. IPv4 マルチキャストアドレス
IPv4 アドレスでは、クラス D のアドレス範囲がマルチキャストアドレスとして予約されています。

```
224.0.0.0/4（224.0.0.0 ～ 239.255.255.255）
```
また、以下の範囲が、ローカルマルチキャストアドレス用として予約されていますので、テストなどにも使用可能です。

```
224.0.0.0/24（224.0.0.0 ～ 224.0.0.255）
```

この記事では、224.0.0.1 の IPv4 マルチキャストアドレスと 56789 ポートを例示に使用します。

## 6. Golang サンプルコード
@ sender1
`$ sudo nvim ~/go/ipv4_multicast_sender.go`

```go:~/go/ipv4_multicast_sender.go
package main

import (
	"fmt"
	"net"
	"strconv"
	"time"
)

func main() {
	ipv4 := "224.0.0.1"
	port := ":56789"
	addr := ipv4 + port
	wait_time := 1
	format := "Message "

	fmt.Println("Sender:", addr)
	conn, err := net.Dial("udp", addr)
	_error(err)
	defer conn.Close()

	c := 0
	for {
		time.Sleep(time.Duration(wait_time) * time.Second)
		message := format + strconv.Itoa(c)
		conn.Write([]byte(message))
		fmt.Printf("%s\n", message)
		c++
	}
}

func _error(_err error) {
	if _err != nil {
		panic(_err)
	}
}
```

@ receiver1, 2
`$ sudo nvim ~/go/ipv4_multicast_receiver.go`

```go:~/go/ipv4_multicast_receiver.go
package main

import (
	"fmt"
	"net"
)

func main() {
	ipv4 := "224.0.0.1"
	port := ":56789"
	addr := ipv4 + port
	fmt.Println("Receiver:", addr)
	udp_addr, err := net.ResolveUDPAddr("udp", addr)
	_error(err)

	listener, err := net.ListenMulticastUDP("udp", nil, udp_addr)
	_error(err)
	defer listener.Close()

	buffer := make([]byte, 1240)
	for {
		length, remoteAddress, err := listener.ReadFrom(buffer)
		_error(err)

		fmt.Printf("Sender: %v\n", remoteAddress)
		fmt.Printf("Contents: %s\n", string(buffer[:length]))
	}
}

func _error(_err error) {
	if _err != nil {
		panic(_err)
	}
}
```

## 7. Golang サンプルコード実行
@ receiver1, 2
`$ sudo go run ~/go/ipv4_multicast_receiver.go`

@ sender1
`$ sudo go run ~/go/ipv4_multicast_sender.go`

## 8. まとめ
この記事では、IPv4 のマルチキャストの実現方法を Golang のサンプルコードで例示しました。
UDP マルチキャストは、要件によっては、効率的な死活監視や、自律ネットワーク、あるいは No Cluster データリソースなどの設計が可能となりえます。
OculusPlatformのSettingについて

# **概要**

この記事では、OculusPlatformの設定方法について説明します。OculusPlatformについて知りたい場合は、[前回の投稿](https://qiita.com/yuma1217/items/5dca28e0b99f59d9edc5)を是非読んでみてください。

なお、今回はsuinさんの[こちらの記事](https://twitter.com/suin/status/976704532163039232)を参考にして
HackMDを使って英語で書いてみて[Dev.to](https://dev.to/yuma1217_ja/oculus-platform-settings-5gf2)にPostしてから、記事を書いてみました。凄い画期的な方法だなと思ったので是非！（Google翻訳の日本語になってるので少々おかしいかも）

このQiitaは、[転載いたしました](https://xrdeveloper.hatenablog.com/entry/2018/12/24/024221)

# **[](https://hackmd.io/1lDso5-MQYKH_myII-SPVg?view#Setting)設定**

## **[](https://hackmd.io/1lDso5-MQYKH_myII-SPVg?view#OculusDashBoard)OculusDashBoard**

1. [Oculus DashBoardに行く](https://dashboard.oculus.com/my-apps/)
2. 新しいアプリケーションを作成します。アプリIDを取得できるので、メモしてください。

![](https://i.imgur.com/Ypixal0.png)

---

ここからは、OculusPlatformでマルチプレイ機能をテストするならば、読んでみてください。テストユーザーを追加します。

1. 左側のサイドバーで、[管理]> [ユーザー名]> [設定]> [ユーザーのテスト]の順に選択します。

    ![](https://i.imgur.com/GyPREJo.png)

2. テストユーザーを追加します。パスワードと暗証番号を入力してください。送信します。後でパスワードを使用するのでメモ。

    ![](https://i.imgur.com/3IbGttR.png)

3. テストユーザーが追加されました、Oculus IDとメールアドレスを書き留めてください。

![](https://i.imgur.com/apQfedv.png)

1. （重要）作成したテストユーザーを開発者として登録します。これを行わないと、テストユーザーに作成したアプリの資格が付きません。
2. 設定 > メンバーを選択してから、「開発者を追加」を選択します。

    ![](https://i.imgur.com/ZMfgjrU.png)

3. 作成したテストユーザーのOculus IDを入力し、追加を選択します。

    ![](https://i.imgur.com/MqS4UlG.png)

これでテストユーザーが登録されました。

![](https://i.imgur.com/0dfHCw5.png)

OculusPlatformの設定は完了です。

---

## **[](https://hackmd.io/1lDso5-MQYKH_myII-SPVg?view#UnitySetting)UnitySetting**

1. UnityのAssetStoreで、Oculus Integrationを入力してインポートします。
2. トップメニューで、OculuPlatform> EditSettingsを選択。

    ![](https://i.imgur.com/KJl4BjS.png)

3. アプリIDを入力します。さっき取得したOculusDashBoardでの設定時の16桁の数字です。OculusDashBoardでOculusRift Appsを作成した場合は、OculusRiftAppId行にappIDを入力します。OculusDashBoardでGearVR / OculusGoアプリを作成した場合は、GearVRアプリID行に入力します。

    ![](https://i.imgur.com/M2yVBds.png)

4. 次に、appId設定の下のUnityIditorSettingsを開き、テストユーザーのアドレスとパスワードを入力し、[ログイン]をクリックします。テストユーザーを使用しない場合は、自分のOculusアカウントのメールアドレスとパスワードを使用してください。
または`Use Stand Platform`チェックボックスをオフにします。チェックマークをはずすと、UnityはOculusApplicationを見つけて、アプリケーションにログインしているOculusユーザーの情報を使います。

    ![](https://i.imgur.com/gsEEe7e.png)

---

設定が完了しました。

次回は、実際にUnityでのOculusPlatformAPIの使い方を書きます。
elasticsearchのインストール

やってみたのでメモ。あまりやる手順はない

# 前提
- CentOS7

# 手順
1. サインインキーを登録する

    ```
    # rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
    ```

2. リポジトリ情報を登録する

    ```
    # vi /etc/yum.repos.d/elasticsearch.repo
    ```
    
    ```elasticsearch.repo
    [elasticsearch]
    name=Elasticsearch repository for 7.x packages
    baseurl=https://artifacts.elastic.co/packages/7.x/yum
    gpgcheck=1
    gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
    enabled=0
    autorefresh=1
    type=rpm-md
    ```

3. yumでインストールする

    ```
    # yum -y install --enablerepo=elasticsearch elasticsearch
    ```

4. 再読み込みする

    ```
    # systemctl daemon-reload
    ```

5. 起動する

    ```
    # systemctl start elasticsearch
    ```

# 参考
- [Installing from the RPM repository](https://www.elastic.co/guide/en/elasticsearch/reference/7.6/rpm.html)
- [Running Elasticsearch with systemd](https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html#rpm-running-systemd)
パフォーマンステストのためのデータ作成メモ

今回、SQLのパフォーマンステストのためにたくさんテストデータを作成したため、その知見を少しでも残します。
## 基本ロジック
基本的なロジックは、親のテーブルにランダムで作成、子のテーブルやコードなどの参照したいものはVLOOKUPで参照していくとなります。

## 前提
この記事は、以下の方針で進めていきます。
- 中盤から終盤以降で、DDLまたはテーブル定義書（hogehoge.xlsx）、コード定義が手に入る前提
- エクセル関数をメインに、他のテーブルと連動して動的にデータを作成する
- 揮発性のエクセル関数（rand関数など）を使用するため、同一のデータの再生成は不可能

特に最後の条件は確認お願いします。
もちろん、csvを作成するため、ある程度の復元は可能です。作成したエクセルにコピペしなおせばOKです。ですが以下の2点の注意点に気を付けなければいけません。

- csvからコピペするため、値が入力される
  - 値が固定となるため、今後のデータ変更時に、ズレが生じる恐れアリ
- 文字列の0詰めが消えてしまう恐れアリ
  - コードとの結合がうまくいかなくなる可能性がｶﾞｶﾞｶﾞｶﾞ
  
## 目次
では前置きが長くなりました。
以下の内容でお送りいたします。


- テーブル情報取得
- ヘッダー作成（物理・論理名、制約、桁数、データ型）
- セルの書式設定
- id列作成
- データランダム作成
- VLOOKUP基本▶応用
- サクラエディタへのコピペ、csv作成

### テーブル情報取得
DDLまたはテーブル定義書から情報を抜き出します。
ここに関してはそれぞれのフォーマットがあるため、「こちらに抜き出したものを用意してあります」と料理番組風に進めさせていただきます。

しいて言うなら、DDLからの場合、正規表現を使うと抜き出しが楽になる気がします。
![サクラエディタ置換UI.jpg](https://qiita-image-store.s3.amazonaws.com/0/319265/a6073559-5630-f094-2495-fa820479bec4.jpeg)

`Ctrl+Z`で戻しながら、作業を行えばテーブル一覧が取得できます。

```
カラム物理名を取得
置換前：^(	| +)([^ ]+).+
置換後：$2

カラムの桁数を取得
置換前：^(	| +)([^ ]+).+(.+).+
置換後：$3

データ型を取得(Postgres参照)
    文字列
       置換前：.+(character varying).+
       置換後：String
    整数
       置換前：.+(integer).+
       置換後：$1
    小数
       置換前：.+(decimal).+
       置換後：$1
```
この手順が終了すると、テーブルの型定義が縦にならんで取得できていると思います。

### ヘッダー作成（物理・論理名、制約、桁数、データ型etc...）
取得したテーブル情報をExcel上に反映していきます。
基本的に、ここは個人の自由とは思っております。上記のように、「物理名」「論理名」「外部制約の参照先」「データ型」「桁数」「作成時の数式」として保持してあると便利かと思っています。
![デモデータ作成用.jpg](https://qiita-image-store.s3.amazonaws.com/0/319265/cc6a2374-e1cc-8382-5cd5-73c42827a304.jpeg)

### セルの書式設定
`Ctrl+1`でセルの書式の設定を行います。ユーザー定義などで以下の通り設定すると桁数などを調整できます。
![デモデータ作成用2.jpg](https://qiita-image-store.s3.amazonaws.com/0/319265/9a7d226d-7f31-c494-2453-241bc711b2b7.jpeg)

```
0詰め（5桁）
    00000
ダブルコーテーション付与
    ”＠”
```
### id列作成
検索に用いるid列を作成、昇順にソートします。
他のテーブルから参照する際、どの列を意識しているのかを結合して作成します。

```
桁数5桁と桁数指定なし
=TEXT(参照先1,"00000")&TEXT(参照先2,)
```

### データランダム作成
https://www.excelist.net/function/RANDBETWEEN.html
RANDBETWEEN関数を用いて、ランダム作成を行います。
またコードなどを自動生成を行う場合、コードを別シートに記載してidとして列数を用いてINDEX関数で参照しています。

```
数字のランダム作成
=RANDBETWEEN(最小値,最大値)
数字のランダム作成（下2桁00）
=RANDBETWEEN()*100
文字列のランダム作成
=CHAR(RANDBETWEEN(CODE("あ"),CODE("ん"))))
コードの生成
=INDEX(【参照先シート名】【取得列】:【取得列】,
　　　　　MATCH( RANDBETWEEN(1,COUNT(【参照先シート名】【取得列】:【取得列】)-【コードのヘッダー数】) ,【参照先シート名】【取得列】:【取得列】,0))
```

### VLOOKUP基本▶応用
https://raku2life.com/excel-comb-indexmatch/
https://tech.nikkeibp.co.jp/it/pc/article/technique/20081209/1010410/
追加、削除されても参照先がずれないよう以下の構造を組み合わせて参照します。

```
=INDEX(【参照先シート名】【取得列】:【取得列】,
　　　　　MATCH(【検索キー】,【参照先シート名】【取得列】:【取得列】,0))

取得列の取得(論理名:１行を参考)
=LEFT( ADDRESS(1,MATCH("【論理名】",【参照先シート名】1:1,0),2),
       FIND("$",ADDRESS(1,MATCH("【論理名】",【参照先シート名】1:1,0),2) )-1 )
```

### サクラエディタへのコピペ、csv作成
作成したデータからサクラエディタへコピペします。
タブをカンマに置換すればCSVにも対応できます。

##感想
以上、テストデータの作成となります。
基本的にランダムで作ってしまうので、条件がある場合IF関数でRANDBETWEEN関数の範囲を指定することでほしいデータを作成することができます。

…VLOOKUPでやるって言ったのにINDEXでしかやってない
Redisのインストール

やってみたのでメモ

# 前提
- CentOS7

# 手順
1. Redisのtarファイルをダウンロードする

    ```
    # curl -LkvOf http://download.redis.io/releases/redis-5.0.3.tar.gz
    ```

2. tarファイルを展開する

    ```
    # tar xzf redis-5.0.3.tar.gz
    ```

3. 展開したディレクトリに移動し、ビルドする

    ```
    # cd redis-5.0.3
    # make
    ```

4. srcフォルダ配下にビルドしてできたファイルを実行する

    ```
    # src/redis-server
    ```

# 参考
- [公式ドキュメント - Installation](https://redis.io/download#installation)
micro:bit 用クラッピーアダプタ

#クラッピーチャレンジ Advent Calendar 2018 23日目の記事です。

こんばんは。普段は神奈川の中央付近でハードウエアエンジニアをやっているMasawo Yamazaki(tomorrow56)です。

今年の初めの電子デバイスGGJで「micro:bit 用クラッピーアダプタ」を作ったのですが、よく考えたらほとんど内容を説明していなかったので、今年のまとめとして書いておきます。

# 作ったもの
クラッピーにmicro:bitが挿せるアダプターです。まずは完成した状態から。
![clappy_bit.jpg](https://qiita-image-store.s3.amazonaws.com/0/120903/1f3cdabb-f943-8b66-addc-b67241e2edbe.jpeg)

スピーカーと振動モータを内蔵しています。
また、手の部分に磁気リードスイッチを内蔵し、パチパチするのを検出する事が出来ます。

# 胴体部分の改造
## micro:bit装着用ソケット
秋月電子の「マイクロビット用コネクターブレイクアウトボードキット (http://akizukidenshi.com/catalog/g/gK-13090/) 」を使用しました。
クラッピー(トールくん)のレバーを有効にするために配線に必要な端子部分以外をカットしました。
![socket_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/120903/abc09226-0a92-93e3-37b2-6ee03ff6b767.jpeg)

## スピーカー
手持ちの薄型スピーカーを装着しました。micro:bitのGPIOでは駆動しきれないので、ドライブ用のトランジスタ回路をつけています。
![Speaker.jpg](https://qiita-image-store.s3.amazonaws.com/0/120903/6cbafa9c-42c5-072f-743f-97fb3a616922.jpeg)

## 振動モーター
コパル製の円盤形ブラシレス振動モータ「LBV10B-0009 (http://akizukidenshi.com/catalog/g/gP-06787/) 」を使用しました。
こちらもmicro:bitのGPIOでは駆動しきれないので、ドライブ用のトランジスタ回路をつけています。
![vive.jpg](https://qiita-image-store.s3.amazonaws.com/0/120903/6d372b01-3ef2-4c53-8ac8-6db73888ae06.jpeg)

## 電池ケース
電池はボタン電池(CR2032)を2個使いました。電池ケースは秋月電子の「CR2032x2個用スイッチ付PHコネクタ付電池ケース(http://akizukidenshi.com/catalog/g/gP-12666/) 」です。オリジナルは直列接続(6V)なので並列接続(3V)になるように改造しています。
![battery.jpg](https://qiita-image-store.s3.amazonaws.com/0/120903/8358f7ee-c16e-20a9-2f91-cd2fab1b7618.jpeg)

## 部品の固定
これらの部品をレバーに当たらないように胴体部分の内側にホットボンドで固定しました。電池ボックスは電池交換しやすい様に底面の外側に両面テープで固定しています。
![body.jpg](https://qiita-image-store.s3.amazonaws.com/0/120903/45910bba-da27-bed4-f853-9072ae8e0734.jpeg)

# 手の部分の改造
パチパチを検出するために左手側に磁気リードスイッチを入れました。また光らせる為に砲弾型のフルカラーLED(Neopixel互換)を内蔵しています。
![LeftHand.jpg](https://qiita-image-store.s3.amazonaws.com/0/120903/c0a17be8-9ba7-4a10-44c4-fc94f9731a97.jpeg)

右手側にはネオジウム磁石を装着して両手がくっついたら磁気リードスイッチがONする様にしました。もちろんこちらにも砲弾型のフルカラーLED(Neopixel互換)を内蔵しています。
![RightHand.jpg](https://qiita-image-store.s3.amazonaws.com/0/120903/9ea6c750-db77-09e7-89cf-26fd02a4afb0.jpeg)

# 動作確認用コード
以下が動作確認用に作成した簡単なコードです。Aボタンを押すとメロディ鳴ります。Bボタンを押すと胴体部分がブルっと振動します。
手が閉じている時は内蔵のLEDが青になり、micro:bitのLEDがスマイルになります。
手が開くと内蔵のLEDが赤になり、micro:bitのLEDがハートになります。

![code.JPG](https://qiita-image-store.s3.amazonaws.com/0/120903/95921acb-904a-3619-fff8-481889c0a074.jpeg)

もともとクラッピーに入力(パチパチ)と出力(振動・音)を追加してゲームコントローラっぽくしたかったので、まずはこれを使って次は何かゲームを作れるといいな...