OmniAICreator/Qiita-1.07M huggingface dataset:
RubyでXPath 1.0 パーサを実装した

この記事は[ドワンゴ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/dwango) 16日目の記事です。アドベントカレンダーが好きすぎて、これに加えて最終日も書かせていただきます。急拵えなので内容は薄いですが、興味があればお付き合いください。

# はじめに

この記事で紹介するXPath 1.0パーサは、ドワンゴ Advent Calendar 2020 最終日にて紹介予定のHTMLパーサである「[gammo](https://github.com/namusyaka/gammo)」向けに開発したものである。

最終日の内容はHTMLパーサに特化したものとなるため、この記事ではgammoが構築したDOMツリーをtraverseするための仕組みとして、XPath 1.0を実装した話を紹介する。

# XPath 1.0

XPath 1.0は1999年に勧告されたXSLT 1.0と同時に公表されたもので、現在の最新バージョンである3.1と比較すると非常に機能が少ないシンプルな仕様となっている。
XPath 1.0を選択した理由は単に機能が非常にシンプルで実装し易そうであったこと、そしてgammoによって構築されたDOMツリーをtraverseするには必要十分なものであると考えたことが理由として挙げられる。

# 実装について

先に述べたように、XPathの仕様自体はさほど大きくはない。ましてや最新の仕様ではなく、XPath 1.0への追従を目指しているため、その実装に係るボリュームも小さなものとなっている。

詳細な[XPath 1.0の文法](https://www.w3.org/TR/1999/REC-xpath-19991116/)はw3cによって定義されており、原則的にこの内容に沿った実装をすることによって、ASTを組み上げることができる。

gammoはnative extensionなどは使わずにPureなRubyによって実装されていることから、XPath 1.0についても同様のアプローチをとった。加えて、サードパーティ製のgemなどは使わずに、runtimeライブラリが標準添付となっている[racc](http://i.loveruby.net/ja/projects/racc/doc/usage.html)を用いて構文解析を行い、字句解析には[strscan](https://github.com/ruby/strscan)を採用することとした。

HTMLとの対比として、XPathは(E)BNFによって表現可能であり、W3Cの標準仕様でもEBNFによって構文が定義されている。この仕様に対応するのが[Gammo::XPath::Parser](https://github.com/namusyaka/gammo/blob/master/lib/gammo/xpath/parser.y)である。これによって構築したAbstract Syntax Treeを基に、XPathを用いてtraverseする際のcontext nodeとなる要素(XPathを実行する対象のrootとなる要素ノード)に対して、XPath ASTの各ノード(e.g. Path, Axes, Predicate, Function)を順番に評価していき、候補となる要素を検索・追加したり、あるいは濾し取っていく。これらのプロセスを経て、最終的に残ったノードの集合が、与えられたXPathの評価結果として返される。

# Traverseの仕組み 

gammoは原則的にXPath 1.0の仕様に倣って実装を行っているため、ここではXPathがどのように動作するのかについて触れることとする。

省略を加味しない場合、XPathは基本的に次のような構文で以てノード集合を構築する。

```
/軸::名前空間:ノードテスト[述語]/~
```

XPathにおいては、まず軸によって探索の方向を決定する。これは`child`(子)や、`ancestor`(祖先)といった、現在のcontextノードから見た方向を意味する。そしてその方向に対して探索を開始し、候補となる要素群に対して、`名前空間:ノードテスト`に指定された要素名や式によってその要素をフィルタしていくことで、集合を組み上げる。`[述語]`となっている部分については、上記の手順で組み上げた集合に対し、追加で複雑な式を用いてフィルタしていくことができる。

またXPathではURIのように、`/`でを区切り文字として、左から順番にHTML文書を追跡していくことも可能となっている。

これらを考慮して、例えば次のようなHTMLに対し、`li`要素の`class`属性値に`foo`が指定されたもののみを取り出す。

```ruby
doc = Gammo.new(<<-EOS).parse
<!DOCTYPE html>
<html>
<head>
<title>hello world</title>
<meta charset="utf8">
</head>
<body>
<ul>
<li class="foo">a</li>
<li class="bar">b</li>
<li class="foo">c</li>
<li class="bar">d</li>
<li class="foo">e</li>
</ul>
</body>
</html>
EOS

p doc.xpath('descendant-or-self::li[@class="foo"]').map(&:inner_text)
  #=> ["a", "c", "e"]
```

# 関数について

筆者はこれを実装するまで存在を知らなかったが、XPathには関数という概念があるようだ。
文字列や数値・真偽値を扱う関数や、ノードの情報を扱う関数など、多くの関数が定義されている。

ここではその一例として、ある要素が特定の文字列をinner textとして持つかどうかを返す関数を紹介する。

```ruby
doc = Gammo.new(<<-EOS).parse
<!DOCTYPE html>
<html>
<head>
<title>hello world</title>
<meta charset="utf8">
</head>
<body>
</body>
</html>
EOS

# contains関数を使い、title要素配下のテキストノードが
# `hello`という文字列を含むかどうかをテストする。
p doc.xpath('contains(//title/text(), "hel")', result_type: Gammo::XPath::BOOLEAN_TYPE) #=> true
```

このように、XPath式の中で関数を用いることも可能というわけである。

とはいえ、あまり個人的に使いたい場面がないため、対応も不十分なものとなっている。もしGammoやXPathの関数について興味があれば、[対応表](https://github.com/namusyaka/gammo#functions)を見ながらパッチを送ってもらえると幸いである。

# おわりに

この記事は最終日の記事のサブセットという位置付けで書かれたものだが、XPath 1.0の概要やRubyでの実装について、イメージを掴んでもらえれば幸いである。
OpenBSD プロジェクトへの PayPal での寄付

# はじめに

オープンソースのプロジェクトへの寄付をいざ行おうと思ってもやり方が分からなくて止めてしまうことがあります。
プロジェクトへの感謝の印と活動継続の応援として寄付は大事だなと考えてます。

この記事ではちょっとコツのいる [OpenBSD プロジェクト](https://www.openbsd.org/) への日本からの PayPal での寄付の方法について書きます。

# PayPal から寄付できない？

寄付しようと思って普通に [OpenBSD の Donations](https://www.openbsd.org/donations.html) から「Donate」のボタンで寄付しようとすると「この受取人への寄付は、この国ではサポートされていません」と言われてしまいます。

OpenBSD の Donations ページの Donate ボタンをクリックしても、、、
![donate-001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103043/889f2196-e2a6-8ed9-6665-7371a126b056.png)

「この受取人への寄付は、この国ではサポートされていません」と表示されてしまう
![donate-002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103043/80fa176e-5f58-f7d3-72e8-eadac647198a.png)

[The OpenBSD Foundation の Donations](https://www.openbsdfoundation.org/donations.html) の「Donate」のボタンでも同様です。

で、銀行経由とか Bitcoin とか面倒だし PayPal では日本からの寄付はサポートされてないのか残念、と挫けそうになるのですが実は以下の記載が The OpenBSD Foundation の Donations のページの下の方にあります。

```
Sending Money via PayPal
If you are unable to use the donation buttons, but still wish to
contribute via PayPal, funds may be sent directly to the
foundation via PayPal using the address:
obsd-paypal@openbsdfoundation.org.

（意訳）
”Donations ボタンが使えないけどやっぱり PayPal 経由で寄付したいなら
アドレス指定で直接 Foundation に送金ができます。”
```

# アドレス指定で直接 Foundation に送金！

これは以下の手順で実行できます。

## 1. アドレスを入力
PayPal にログインして「支払い・請求」をクリックします。
”名前またはメールアドレス” の欄に「obsd-paypal@openbsdfoundation.org」と入力します。
よければ「次へ」をクリックします。
![donate-003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103043/b7605209-b22f-19eb-379d-88c0cd042bf8.png)

## 2. 寄付する金額を入力
次のページで寄付する金額を支払額の所に入力します。
”メモを追加” の所に何かメッセージを入れることもできます。
入力したら下の方にある「続行」をクリックします。
![donate-004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103043/26c68aea-d2c2-655f-c994-c591dd17611a.png)

## 3. 内容確認して支払を実行
内容確認のページが表示されるので、支払額など間違いがないか見直します。
問題なければ下の方にある「今すぐ支払う」をクリックします。
![donate-005.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103043/cfc37c49-d554-58c8-5cc6-704b61845f12.png)

以上で PayPal から寄付ができました。

# まとめ

日本からの PayPal での OpenBSD プロジェクトへの寄付の方法を書きました。
Webサイトに用意されているボタンからでは行えないので知っていないとできない方法ですね。

OpenBSD プロジェクトは寄付を募ってます。
メールアドレス指定で日本からでもPayPalでの寄付ができます。
詳しくはこちら： https://www.openbsd.org/donations.html もしくは https://www.openbsdfoundation.org/donations.html
Room Database ～初学者がアウトプット～

RoomDatabaseを用いてToDoアプリを作ろうと考えたので実装の方法を勉強したものを簡単にアウトプットしたいと思います。

・RoomDatabaseとは？
→SQLiteを最大限生かし、スムーズなデータベースアクセスできるような仕組み
→Roomを使ってDB(SQLite)にデータを保存・取得することができるような仕組み


(1)→dependencyに、Roomのライブラリを追加する

(2)→Roomを実装するには以下の三つのポイントが重要
・Entity→クラス定義前にアノテーションで、@Entityであることを明らかにしておく
![スクリーンショット (314).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975701/e608edf7-a3c6-b7cc-4b8b-c589818b8b2a.png)


・Database→abstractクラスで、@Databaseをアノテーションする
![スクリーンショット (313).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975701/b02ff9c2-83c8-ec7a-fbdd-b5b5f5c3d525.png)


・Dao→interfaceで、@Daoのアノテーションが必要で、@Insertで挿入　@Deleteで削除　@Queryで取得が
できる。
![スクリーンショット (315).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975701/763a4f69-6eac-c695-bb68-a116356dcbf5.png)


最後に、この記事のアウトプットは
Roomとはどういうものかを学んだだけなのでこれを使ったアプリ開発も終わればそちらも記事にしたいと思っています。
HTML datalistタグでvalueと違う値をsubmitしたい

# datalistでvalueとは違う値をsubmitしたい

datalistタグはselectタグとはちがって、valueが表示されてしまう。
optionの中に書いても、valueの方が目立って表示されるし不便……
表示自体は「name1」などのテキストにしたい。でもpostするのは「id1」とか別の値が良いのよな～
そんな時は、jsごりごりして、post用のhiddenなinputを用意すれば簡単。

### やればよいこと
- js(今回はjquery)でごにょごにょする。
- data属性を使えば良い。
- submitする際は、hiddenなinputでpostすればよい。

## HTML
```html:index.html
<label for="stage"></label>
<input id="stage_input" list="search_stages" class="" name="" value="$default_value">
<datalist id="search_stages">
    <option value="name1" data-id="id1"></option>
    <option value="name2" data-id="id2"></option>
    <option value="name3" data-id="id3"></option>
</datalist>
<input id="stage" type="hidden" name="stage" value="">

<script src="jsfile.js"></script>
```

## jQuery
```javascript:jsfile.js

let id = null;
// datalistのdata-id属性の値の取得
$('#stage_input').on('change', function () {
  id = $("#search_stages option[value='" + $(this).val() + "']").data('id');
});
// submit
$('#sub_btn').click(function () {
  $('#stage').val(id);
  $('#search_form').submit();
});
```
新卒から見た負債への取り組み

この記事は[Livesense Advent Calendar 2020](https://qiita.com/advent-calendar/2020/livesense) 24日目の記事です。
自分は今年新卒でリブセンスに入社し、10月途中からマッハバイトというサイトの開発を行っております。
現在マッハバイトは絶賛大きな負債解消に取り組んでいる最中(ようやく終わりが見えてきました)なのですが、モダンへの足掛かりも掴んでおり自分が一部の取り組みをさせているのでお話しできればと思います。

# 背景
自分の所属するマッハバイトは、2006年の弊社創業時から一度リニューアルを果たしていますが、15年近く運営されているサービスになります。
## 技術的負債
長期に運営されているサービスだとどうしても技術の進歩と共に、当時のトレンドはいずれ時代遅れな設計となってしまいます。そのため継続的な負債の返済が求められますが、ベンチャー企業の成長フェーズだとどうしても事業の成長に向けた方面に舵を切りがちです。事業として落ち着いてくると、負債の解消にも舵を切りますが、その時点で大きなモノリシックなサービスとして動き出していると負債の解消にはとても大きな労力を要します。実際マッハバイトにおいても、負債を解消していくのには長い時間がかかっています。

## Railsへの移行[^1]
2006年当初からサービスはPHP(どこかのタイミングでsymfony)で構成されていましたが、恐らく2015年頃からRailsへの移行が始まります。移行開始時点で10年レベルの負債なのでなかなか途方もない感じがしますね...。
方針としては既存のサービスを動かしながら移行を行う必要があるため、機能やページで分割しつつ移行を進めていきます。
一方で負債の解消だけでなく、growthの施策を進める必要ももちろんあります。growthを進めながらサブタスクで負債を解消するやり方では、継続的な新陳代謝という意味では正しいかもしれませんが、負債の問題が顕在化している段階では遅すぎる感は否めません。
また、これだけ長期化するとPHP側のロジックも遺産的になり、なぜこのようになっているかわからないし、実装者も既にいない...ということも起こりがちです。
しかし、冒頭でも触れましたがマッハバイトでは遂にRails移行の終わりが見えてきています。実に5年超えのプロジェクトです、大変ですね...

# 今後に向けて
レガシーからRailsへの移行は遂に終わりに近くなっていますが、Railsで終わりというわけでもありません。Rails化の次はフロントのモダン化やDBの改善などが計画されています。
## フロント改善
自分が担当しているのはここの部分です。マッハバイトのサービス本体ではないですが、マッハバイトの社内管理画面のフロントの環境構築と設計を行っています。
フロントのNext.jsの使用は事前に決まっており、開発、staging、本番における環境を設計・構築しますが、自分のスキルセットとしてサーバーの開発がメインであったため、モダンなフロントとインフラの構築は躓くことが多かったです。

### 躓き
まず大問題として自分がAWSへの知見がかなり薄く、構築には自信が全くありませんでした...(lambdaくらいしか使ったことない)
知識0, 自信0だとなかなかリモート化で１から教えて！というわけに行かないので、就業中はリファレンスと既存の構築を見ながら、検証環境を立てる。裏ではNextとAWSを使ったサイトを構築してみる。という形でようやく自分の中でほんの少しの自信が付いてきた気がしています。
無知な状態から自信や知識が少しでも付いてくると、先輩に尋ねることにもしやすくなり、動き出しができるようになってきます。(自分だけ技術スタックが極端に不足していると質問しにくい。。。)

### 現状
現状としては大まかな構成を決め、検証用の構築を済ませた段階です。(WIP)[^2]
![mb-admin2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270815/34657d98-6d45-c4a5-1d1c-368e7e679345.png)

今後もIaC等やることは山積していますが、0ベースで知識や物を作っていくのは貴重な経験として学習・共有を進めていきたいです。


## 取り組み
年末ということもあり、マッハバイト開発チームでは現在Hackdaysを行っています。
テーマはPHP→Ruby→???ということで今後の技術や言語の選定に対しても考える機会になって助かっています。

## まとめ
個人的には新卒でJoinして数ヶ月の段階で、大きなタスクに関われたことは成長機会としてありがたいです。
まだ、タスク自体の進捗やAWSの知識など不足している点も多いので吸収やチャレンジを続けていきたいと思います。


[^1]: 過去資料を漁っていますが、時期等は多少異なるかもしれません
[^2]: 少し前に作成した資料のため、現状は一部異なります
mongo-go-driverでクエリを書く時「primitive.E composite literal uses unkeyed fields」のwarningが表示される

## 概要
GolangでMongoDBを使うとなった時に、おそらく使用するのが[mongo-go-driver](https://github.com/mongodb/mongo-go-driver)でしょう。mongo-go-driverでは[こちら](https://github.com/mongodb/mongo-go-driver/blob/master/examples/documentation_examples/examples.go)のサンプルにある通り、`bsonD`という型にクエリの項目を入れていくのですが、この通りに設定していくと`primitive.E composite literal uses unkeyed fields`というワーニングが表示されます。
ワーニングなので、このままにしておいても良いのですが、ワーニングを消すためにどうすれば良いのかというのを今回書きます。

## 対応
[MongoDBの Offical Go言語 Driverを使ってみる（１）準備・Insert](https://qiita.com/h6591/items/f3a7c1bca31cfa634cca)の記事によると、`bsonD`は`primitive.E`のスライスとして定義されているので、きちんと型を書かないとワーニングが出るみたいです。ちなみに、primitive.Eとは[ドキュメント](https://godoc.org/go.mongodb.org/mongo-driver/bson/primitive#E)によるとKeyとValueが定義されている構造体です。
対応としては[Composite literal uses unkeyed fields](https://stackoverflow.com/questions/54548441/composite-literal-uses-unkeyed-fields)の記事に色々と対応が記載されています。ワーニングを出ない設定にするものや、愚直にprimitive.Eの型で書いていくものなどが挙げられています。ちなみに、`primitive.E`の記述は省略できるみたいなので、以下の実装サンプルのように書くのが、個人的に良いかなと感じました。

## 実装サンプル

```go:sample.go
findOptions := options.Find()
findOptions.SetSort(bson.D{{Key: "date", Value: 1}})
filter := bson.D{{Key: "status", Value: "on"},
  {Key: "date", Value: bson.D{{Key: "$lt", Value: time.Now()}}}}
cur, err := col.Find(context.Background(), filter, findOptions)
```
AWS CDKで「Error: ARNs must have at least 6 components: undefined」になる時の解決策

## エラー

AWS CDKで以下のようなエラーが出る事があります。

```
Error: ARNs must have at least 6 components: undefined
```

意味としては、`lambdaVersionArn`が`undefined`で、少なくとも６つのブロックをもつARNの形式が必要だと言っています。

## 発生個所

ここではARNでバージョン指定のLambdaを取得しています。

``` sample-stack.ts
const lambdaVersionArn = props.lambdaVersionArn;
const lambdaVersion = lambda.Version.fromVersionArn(this, 'LambdaFunc', lambdaVersionArn);
```

ARNを外部から受け取っているStackで、Bootstrapや該当Stackではない処理を実行する時に、`lambdaVersionArn`を指定しないので`undefined`になってしまいます。

## 対応方法

`lambdaVersionArn`の値は実際には実行時にしか使われないのでダミーを指定する事で回避ができます。

```
arn:aws:lambda:dummyAccount:function:dummyFunc:dummyVersion
```

ARNのフォーマットでダミーの値を作成します。

### 指定方法１：引数

``` shell
cdk bootstrap -c lambda-version-arn=arn:aws:lambda:dummyAccount:function:dummyFunc:dummyVersion
```

`-c`をつけて指定する方法は簡単ですが、bootstrapに関係ない引数が必要になるので、避けたい所です。

### 指定方法２：Stack内

``` sample-stack.ts
const lambdaVersionArn = props.lambdaVersionArn ?? 'arn:aws:lambda:dummyAccount:function:dummyFunc:dummyVersion';
const lambdaVersion = lambda.Version.fromVersionArn(this, 'LambdaFunc', lambdaVersionArn);
```

分かりやすくはありますが、環境要因をStack内に書きたくないですね。

### 指定方法３：Stack呼び出し

``` sample.ts
const lambdaVersionArn = app.node.tryGetContext('lambda-version-arn') ?? 'arn:aws:lambda:dummyAccount:function:dummyFunc:dummyVersion';
new SampleStack(app, `sample-stack`, {
    lambdaVersionArn : lambdaVersionArn,
});
```

引数を取る部分と近くなり、環境要因が纏まって、スッキリしました。

## 余談

CDKは非常に便利ですが、結構癖があるので、対応方法を考える時に悩む事が多い気がします。
ESXi Arm Edition v1.2 でどこまでできるか「vSphere沼にハマっておぼれてみた」


この記事はこの後も追記していく予定なので、別のブログに書いています。そちらのリンクを貼りました。
[ESXi Arm Edition v1.2 でどこまでできるか「vSphere沼にハマっておぼれてみた」](https://imaisato.hatenablog.jp/entry/2020/12/24/231320)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541683/3a551b0c-b45a-a76a-b1a4-2be441774f6c.png)
こんな環境を作る際のメモです。
vSAN の作り方もそちらの記事に書いています。
Raspberry Pi 2 Model B に Ubuntu Core 18 をインストールする

# 環境
Raspberry Pi 2 Model B

# インストール手順
基本の的な手順は以下のサイトを参考にした。
https://ubuntu.com/download/raspberry-pi-core

## ①　Ubuntu one のアカウントを作成する
###### [Ubuntu one](https://login.ubuntu.com/)でアカウントを作成する。
なぜアカウントを作成するか？
最初の起動セットアップの時に、ここで作成するアカウントにアクセスしアクティベーション的なこと行う。
また、アカウントに設定したユーザ名がUbuntu Coreのユーザ名になる。
という仕組みのため作成するようです。
###### SSHキーをUbuntuSSOアカウントにインポートする
SSH キーをインポートって、、、

```
ssh-keygen
```
を実行すると、指定したフォルダにid_rsaとid_rsa.pubが作成される。詳しくはこちらに書かれていました。[ssh-keygenコマンドの使い方](https://qiita.com/hana_shin/items/2003698873a5782b7efd)
id_rsa.pub側の中身を、アカウントのページのSSHキーに、張り付けて、登録する。

 
## ②　UbuntuCoreをダウンロードする
###### [RaspberryPi用UbuntuCore18イメージ](https://cdimage.ubuntu.com/ubuntu-core/18/stable/current/?_ga=2.188924651.1341296278.1608811992-800129593.1608551545)をダウンロードする
「ubuntu-core-18-armhf+raspi.img.xz」を使った。

## ③　microSDカードに書き込む
###### [インストールメディアの指示に従って](https://ubuntu.com/download/iot/installation-media)、UbuntuイメージをmicroSDカードにコピーする

## ④　UbuntuCoreをインストールする
###### microSDカードをRaspberry pi に差し込む
## ⑤　最初の起動セットアップをする
###### 「Press enter to configure」というプロンプトが表示されます。
Enterキーを押して進む。
ネットワークの設定をする。
Ubuntu one アカウントのメールアドレスを入力する。
###### Ubuntu Core にアクセスするための情報が表示される
## ⑥　ログインする
###### 同じネットワーク上のマシンからUbuntu CoreにSSHでログインする
```
ssh <Ubuntu SSO user name>@<device IP address>
```
画面に表示されている上記の情報を打てばログインできる。
# まとめ
ここまで来て初めて気づいたのですが、Ubuntu Coreはコマンドラインすら出ない。。。
自分は、超軽量で昔のパソコンの様に、立ち上げるとコマンドラインだけ現れるのを期待してたため、正直驚いた。
これで何ができるかはこれからいろいろ触ってみようと思います。
【Ruby On Rails】特定のidに紐づいた複数レコードのカラム情報をまとめて取り出し表示させる方法

# 前提

このようなテーブルがあったとします。

hoges テーブル

|id  |text  |content_id  |
|---|---|---|
|1  |morning  |1  |
|2  |afternoon  |2  |
|3  |evening  |2  |
|4  |night  |3  |
|5  |midnight  |3  |
|6  |late night  |3  |

# 考え方
特定のidに紐づいた複数レコードのカラム情報をまとめて取り出すには、ビューの中で"インスタンス変数.each"という形でeachメソッドを使用すれば、データ情報を複数表示することが可能。

# 書き方

1. eachメソッドを使用するには、配列を渡さなければいけない。whereメソッドを用いることで、条件に合致するオブジェクトを配列として取り出す。今回の場合は、Hoge（hogesテーブル）を指定し、whereメソッドを用いて、paramsで運んできたidがcontent_idと一致しているものを@hogesに代入。

```ruby:hoges_controller.rb
  def show
    @hoges = Hoge.where(content_id: params[:id])
  end
```

2.　考え方で述べたように、eachメソッドを使えば複数の情報を表示させることができる。例えば、下記のような記述になる。

```ruby:show.html.erb
  <% @hoges.each do |hoge| %>
    <%= hoge.text %>
  <% end %>
```

# 表示イメージ

上記の書き方をした場合、以下のような表示になると思います。

paramsにcontent_id "1" が入っていた場合

![スクリーンショット 2020-12-24 22.57.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/770386/4ae99ad5-27ab-20ea-13ad-5be63488edff.png)


paramsにcontent_id "2" が入っていた場合

![スクリーンショット 2020-12-24 22.59.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/770386/e6585a3e-607e-e79a-2522-8f1a65af89e8.png)


paramsにcontent_id "3" が入っていた場合

![スクリーンショット 2020-12-24 23.10.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/770386/b9f7a930-fcfe-adba-99a9-d2eb21fffdcb.png)

# 参考記事

https://qiita.com/tanaka7014/items/f1c4b6505a2c672ea1f7
プログラマが知るべき97のこと. マイピックアップ

プログラマが知るべき97のことを読み、今の自分にとって大切な考え方をピックアップ！


# 26. 言語だけでなく文化も学ぶ

- 多くの言語を学ぶことは、その言語の特性や文化から新たな発想を得て、同じ問題に対して違った解決策でアプローチできるようになること。

# 38.余分なコードは決して書かない

余分なコードを実装すると、実行時間の増加や保守の手間の原因となり得る。
では、余分の判断とはどのようなものであるか以下に示す。

- 余計かもしれないが、面白そうだと思えたコード(「面白い機能」はコードを書く理由にならない)
- 将来必要になるかもしれないと思ったコード(今不要なら、今書くべきではない。)YAGNI(You Ain't Gonna Need It. それはたぶん、必要ない)の原則に反する。
- 必要かどうか判断に迷ったコード
- 議論を経ておらず、ドキュメントにも書かれていない実装(要件を決めるのは顧客である。)


# 41. 無駄な警告を排除する

コードが増えるにつれて、警告もたくさん出るようになっていく。その警告の中には、即座に対応を要するわけではないものが多く含まれてくる。その中から真に意味のある警告を見つけるのが困難になってくる。そうなれば「警告」が本来の役割を果たさなくなる。
意味のある「警告」を見逃さないためには、

- ビルド時に警告が1つでも出たら、必ずその場でつぶす
- 出される警告が、どう考えても大した問題につながらない場合は、警告ポリシーの変更を検討する
 
# 44.IDEを知る

IDEの中には、「メソッドの抽出」の機能が存在するものも。
メソッドの中の一部のコードを選ぶと、その部分を新たなメソッドとして切り出してくれる機能。渡すべきパラメータも全てツールが自動的に判断してくれる。

# 48.いろいろな言葉を学ぶ

「いろいろな言葉」とは日本語・英語などやプログラミング言語だけのことではない。
「いろいろな言葉」とは、あらゆる分野に対する知識である。
例えば、会計士と話す際には、投資資本、使用資本といった基本的な知識が必要。
あらゆる分野の人とコミュニケーションをとるためには、それぞれの分野についての知識を学ぶことが大切であり、それらの相手の話に耳を傾けることが出来ることである。

# 60.真実を語るのはコードのみ

要件定義書やコメントがどれほど正確に書かれていたとしても、それが真実とはなり得ない。それらはどうゆう設定で作られる「予定だったか」を語っているに過ぎないし、実装(コード)と一致しない誤ったことが記載されている可能性もある。
真実を語るのはコードのみ。それを人が理解できるようにわかりやすく書くことが大切。


# 67.コードを読む
コードを読むことは自分の成長につながる。様々な人の発想に触れるからだ。また、過去の自分のコードを読み返すことも、自分の成長が感じられやる気につながる。プログラミング技術を磨くためのベストプラクティスの一つとして、「コードを読むこと」が挙げられる。

# 77. 偶然の仕様ではなく本物の仕様のためのテストを書く

実装の絶対条件ではなく「偶然の仕様」に対してテストして確かめても意味がないし、改善や保守の際の足かせとなる。
本当にテストすべきこと、本来の要求に合っているかを考え、的確なものにする必要がある。

# 78. テストは夜間と週末に
勤務中(平日の日中)にパソコンのパワーを最大限発揮するために、夜間や週末にテストすることを検討してみる。

- 長時間を要するテストの場合、週末を使えば金曜午後6時から月曜午前6時までの60時間取れる。
- 他の作業を控えたいパフォーマンステストをするのに夜間と週末が適切な時間

# 81. エラーがエラーを相殺してしまう
エラーが複数存在する場合、エラーがエラーを相殺し、見つけ出すことが困難な場合がある。どう対処すべきか絶対的な答えはないが、そういう問題が存在し得ると認識することが大切。

# 84. 正しいアルゴリズムとデータ構造を選ぶ
アルゴリズムやデータ構造に関して学ぶことは大切である。
Donald Knuthの「The Art of Computer Programming」を推奨する。

# 85. 冗長なログは眠り妨げる

ログにあまりに多くの情報が記録されると、システムの監視には約に立たなくなる。本当に重大な問題が起きた場合以外、基本的にエラーログには何も記録されないくらいの方がいい。その場合は、エラーログにメッセージがあるというだけで、システムに重大な問題が発生しているとすぐに判断できる。

# 89. 関数の「サイズ」を小さくする

# 96. テストは正確に、具体的に

テストに「具体例」を用いることで、わかりやすく曖昧さを残さず記述できる。
テストについては正確なだけではなく、誤解の余地がないものにしなくてはならない。
VPC領域を作成する方法（Amazon VPC）

　VPC領域を構成すると、AWS上に、好きな構成のネットワークを構築できる。今回は、「10.0.0.0/16」のCIDRブロックでVPC領域を構成するための手順を記載します。
 
### ■　作業手順
（「10.0.0.0/16」）のVPC領域を作る。

#### ①　AWSマネジメントコンソールでVPCを開く
　AWSマネジメントコンソールのホーム画面から**[VPC]**を選択する。
[![Image from Gyazo](https://i.gyazo.com/998dc3ba826dc4be538ba0b3e6a459d1.png)](https://gyazo.com/998dc3ba826dc4be538ba0b3e6a459d1)

#### ②　リージョンを設定する
　VPCの操作対象とするリージョンを右上から選択する。今回は、東京リージョンに実験用のネットワークを作るので、「アジアパシフィック（東京）」を選択する。
[![Image from Gyazo](https://i.gyazo.com/1da4968964c10edbaa3eb55fb894ceae.png)](https://gyazo.com/1da4968964c10edbaa3eb55fb894ceae)

#### ③　VPC領域を作成する
　⑴　「VPC」を選択する。
[![Image from Gyazo](https://i.gyazo.com/87b96cba01aa35453a3be34da2b4979b.png)](https://gyazo.com/87b96cba01aa35453a3be34da2b4979b)

　⑵　「VPCの作成」をクリックする。
[![Image from Gyazo](https://i.gyazo.com/fde4e469438e6f941bf9b8d2b97898c0.png)](https://gyazo.com/fde4e469438e6f941bf9b8d2b97898c0)

　⑶　名前タグに「VPC領域」を、IPv4 CIDR ブロックに「10.0.0.0/16」を入力する。
[![Image from Gyazo](https://i.gyazo.com/f370ff6e6a431ded7f6e391867871227.png)](https://gyazo.com/f370ff6e6a431ded7f6e391867871227)

　⑷　作成をクリックする。
[![Image from Gyazo](https://i.gyazo.com/2c359398c5bc3e8028abdf5c1cf3afc4.png)](https://gyazo.com/2c359398c5bc3e8028abdf5c1cf3afc4)
AWSのネットワーク構成＆ルーティングについて

AWSでEC2作ったり、サイト間VPN接続したりが何とな～く出来るようになってきたので、VPCのルーティングについて、
何とな～くではなく、しっかりと理解したいと思い書いてみました。
 ※間違ってたらすみませんがご指摘くださいm(_ _)m

# VPCコンソール画面の項目について
2020年12月時点のVPCコンソール画面はこんな感じです。

![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/103634bf-f71d-6e47-3ec1-ce24a5caffd0.png)





DHCPオプションセット・・・VPC内のオブジェクトに対して、DNSサーバやNTPなどの配布情報を登録します。
ルートテーブル・・・VPC内のルーティング情報を登録します。

上記環境ではVPCのアドレス空間は10.200.0.0/16 で、その中にサブネットがある感じになっております。
ちなみにサブネットは以下のような感じで表示されます。

![スライド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/acb4936c-30eb-b99c-8139-a4ceabff3625.png)




VPCの空間（10.200.0.0/16）を/24で区切って、10.200.1.0/24 をサブネットに割り当てしてます。 


# ルーティングテーブルの項目について
ルーティングテーブルは以下のような感じで表示されます。

![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/8c5581f7-c0b8-d50b-e744-f90279b9bf69.png)

この環境ではサイト間VPN接続を設定し、VPCとオンプレ環境を接続しています。
ちなみにルーティングは動的（GBP）で設定しています。

- 送信先10.200.0.0/16 はVPC内なので、ターゲットがAWS内＝「local」となっています。

- 送信先172.xx.xx.xxや192.xx.xx.xxはAWS内には存在しないセグメントなので、VPC外につながる仮想ゲートウェイに向けてルーティングされています。
今回172.xx.xx.xxや192.xx.xx.xxはサイト間VPNで接続しているオンプレ側拠点のアドレスなので、VPN GW（vgw-xxxxx）がターゲットになっています。

- 右側の「伝播済み」というパラメータですが、***カスタマーゲートウェイ（AWSとVPN接続している宅内ルータ≒CEルータ）から VPC 側の仮想プライペートゲートウェイ***へ伝播されているかということを表しています。

　何となくAWS → カスタマーゲートウェイ という流れで伝播させているように受け取れそうな文言ですが実は逆です...
　
　「伝播済み」となっているルートは宅内ルータからBGPでルートが広告されているルートということです。

　0.0.0.0 も「伝播済み」になっていることから、宅内ルータからVPCに対して、デフォルトルートを伝播させることも可能です。

　設定の「ルート伝達の編集」でVPC側が「伝播」を受け取らないという設定も可能ですが
　VPC からカスタマーゲートウェイへ伝播されるルートについて、 ***VPC の CIDR 宛のルートが伝播設定に依らず伝播される挙動***となります。
　（AWS側のNW情報は全部宅内ルータに伝播しちゃいます。隠ぺいできません...）

　ちなみに設定の「ルート伝達の編集」でVPC側が「伝播」を受け取らないという設定にした場合、オンプレ側でセグメントが増えたときにスタティックでルート追加してあげる必要があります。

# VPC（セキュリティグループ）とサブネットとルーティングテーブルの関係
こんがらがるところ（私の主観ですが）なのですが、以下の図ような感じです。
![VPC_スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/cbef68e4-6272-2e4f-e198-2db3a39286e4.png)

よくサブネットについて、Private Subnet とかpublic subnet という言い方をしますが
両者のちがいはインターネットゲートウェイへルーティングがテーブルにあるか、ないかだけです。
また同じVPCの中でもサブネットごとにルーティングテーブルは変更できます。

# オンプレNW機器との違い
①　サブネット間の通信について
　　オンプレ機器であればSwitchやルータなどでセグメントごとに分断されますがVPC内であれば別サブネットにもブロードキャストされます。
　　例えばVPCが192.168.0.0/16でサブネットが2つ（A: 192.168.1.0/24とB: 192.168.2.0)あった場合、サブネットA宛の通信が別サブネットB側にも配信されます。

②　サイト間VPN接続のルート伝播について
　　AWS側のセグメント情報が強制的にカスタマーゲートウェイに伝播される

③　UTMなどの付加機能はない（AWSの別サービスを利用）

# おわりに
NW系はCCNAの資格勉強の時に少しかじったぐらいですが、各パラメータの意味を理解できればAWSのルーティング設定はさくさくっとできますd(`・ω・’)
Splunkで見る新型コロナウィルスのファクトフルネス

メリークリスマス！2020年もあと1週間。今日の夕方のクリスマスケーキとチキンの行列はいつもより長かった気がします。みなさん自宅でのクリスマスなんでしょうか。

2020年1月から発覚した、新型コロナウィルスと3月のパンデミック。毎日報道されています。だいたいは最高人数更新のニュースなのですが、最高で無い場合は過去の曜日の最高や、大阪が最高だの、煽っているようにしか見えません。
2017年の日本のがん死亡者数：373,584人、（https://ganjoho.jp/reg_stat/statistics/stat/summary.html）

心筋梗塞などの心疾患死亡者数は204,837人(http://www.seikatsusyukanbyo.com/statistics/2019/009997.php#:~:text=%E5%8E%9A%E7%94%9F%E5%8A%B4%E5%83%8D%E7%9C%81%E7%99%BA%E8%A1%A8%E3%81%AE%E3%80%8C%E4%BA%BA%E5%8F%A3,%E3%81%AB%E5%A4%9A%E3%81%84%E6%95%B0%E5%AD%97%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82)

2015年の脳血管疾患死亡者数：111,973人。( http://www.seikatsusyukanbyo.com/statistics/2016/009216.php )

新型コロナウィルスの死亡者数は2941名。　(https://www3.nhk.or.jp/news/special/coronavirus/data-all/)　

ワクチンはできたばかりですがタバコ、酒、塩の方が死に至る可能性は高そうです。（でもECMOつける医療関係者の人数は少ない）またウィルスも新型のため、感染についても的確な予防や検査ができず、ワイドショーにはいろいろなお医者さんが出ずっぱりですが、誰を信じてよいのやら、頭が痛いです。（尾身さんは好きだけど）

そんな新型コロナウィルスの感染情報を調査し、公開している大学があります。たぶんみなさんご存じの
ジョンズ・ホプキンズ大学です。ジョンズ・ホプキンズ大学は、メリーランド州ボルチモアに本部を置くアメリカ合衆国の私立大学である。1876年に設置された。世界屈指の医学部を有するアメリカ最難関大学の一つであり、脳神経外科学、心臓外科学、小児科学、児童精神医学などの学問を生み出したーといったエリート大学です。

この公開データを見るSplunkのApp（拡張アドオン）を今日は試して、フェイクニュースに惑わされない、ファクトフルネスのためにSplunkを使ってみたいと思います。

１．Splunkbase でCOVID19を検索するとヒットします。
https://splunkbase.splunk.com/app/4925/
![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956423/0fd89d63-5a8c-aec8-a088-0bef6e6d68b1.png)
ログインしてAppをダウンロードします。ダウンロードファイルはSplunkのインストールしてある、/opt/splunk/etc/appsで解凍します。解凍するとその中にcovid-19のディレクトリができています。
または、Splunkの左側の列、Appの一覧の一番下「＋他のAppのサーチ」を押します。
COVIDと検索してヒットしたCOVID-19のAppをブラウザ上でインストールします。

ここで注意なのは、このCOVID-19Appは単体で動作しません。
 "Canary" app と "Sideview Utils" appも入れておきます。Splunkの管理画面か手動でAppインストールするとすぐに終わります。
合計３つのAppがセットアップされ実行可能になると動作を開始します。

デフォルトの国はイギリスやフランスとかがデフォルトでチェックで入っていますが、すごい数ですので、チェックを外します。プルダウンメニューから死者数、都市名を選択します。
最初に開いた時は少し重たいです。しかしここからいらんな事が気づけます。大阪は日本の半分の数の感染者が出ていたり、フランスは恐ろしい数値になっています。これを見たらロックダウンしてもおかしくないと気が付きます。

![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956423/7daa10d1-83e1-b931-6e51-665dd2ea3904.png)
 、
さて、デフォルトではこのデータ表示はとまってしまいます。データの新規取り込みには対応していません。コマンドラインで以下を実行しましょう。日次なのでcronでコマンド叩いてみるのも良いかと思います。とにかく途中でやめるとグラフも出てこなくなります。

cd /opt/splunk/etc/apps/covid-19/bin <CR>

このディレクトリで以下のコマンドを実行します。

![refresh.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956423/d5ea1e2b-8df3-972e-de8b-6fcf3cdf8d1b.jpeg)

/opt/splunk/bin/splunk cmd python refresh.py　＜CR>

とすると全世界の感染データがSplunkに送られます。しかしながら大きなデータのため、一晩ほったらかしにしておくのがおすすめです。
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956423/7c1143b2-b9e6-ac0d-dc92-10c8c837bc90.png)

プルダウンメニューで死者数とX軸数値を小さく50にします。（日本にいてよかった）
韓国とか車とかでPCR検査して感染数減ってドヤっ！みたいな報道してたのに結局増えてる....のに報道無いし....

Splunkは真実を語ります、真実に気が付けます。しかもリアルタイムで。
チンパンジーになってないか調べてみましょう
https://factquiz.chibicode.com

皆さんもSplunkのAppを色々入れて楽しんでみてください。
新型コロナウィルスはあと2年とか、2021年には東京都の感染者は1000人超えるとかそんな時代がまさにやってきます。真実を見ながら、コロナに打ち勝っていきましょう。
Discord botを試してみる

本記事はFusic Advent Calendar 2020の24日目の記事です。

自分で管理しているDiscordがあるんですが、そこにbotを突っ込んでみたくて突っ込みました。

どんなものかって言うと、議論しながら実行結果が見えればいいなぁという試みでコード結果を返すボットです。

## Discord botを作る
Discordでbotを作るために、以下を参考にしました。
https://qiita.com/1ntegrale9/items/aa4b373e8895273875a8

具体的には、
1. https://discordapp.com/developers/applications へアクセスして、アカウント作成
2. 左メニューのBotからAdd BotからサーバーへBotの追加
3. New Applicationからアプリの作成
4. 自分の書いたコードを適当なサーバーで起動

という流れです。
僕は今回herokuへ上げました。簡単なので、おすすめです。

## 実装

ボットを起動する部分だけ記載しておきます。
(具体的には、送られたコードブロックを解析する形で記述しました。)

```julia
module CodeBlockExecuter

using Discord


# Create a handler for the MessageCreate event.
function handler(c::Client, e::MessageCreate)
  body = e.message.content

  if !ismissing(e.message.author.bot)
    return
  end

  # メッセージのパース処理…
　parseresult = ....

　# 返答
  reply(c, e.message, parseresult)
end

function main()
  # Create a client.
  c = Client(ENV["ACCESS_TOKEN"])
  # Add the handler.
  add_handler!(c, MessageCreate, handler)
  # Log in to the Discord gateway.
  open(c)
  # Wait for the client to disconnect.
  wait(c)
end

end
```

なお、Discord.jlのexampleを参考にしています。
他にも、リアクションを飛ばせる
`create(c, Reaction, e.message, '👍')`のも使えたりします。

## 結果
![31EE0046-BEAE-4972-B4B4-7386EC2D3F56.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397374/fd606902-3a3b-c3d4-9962-054b54cf76a2.jpeg)

ちゃんと動いてくれることが確認できました。

## 他に
Dynoというカスタムコマンド等を追加できるものもあるようです。
けど、コードでカスタムしたりといったことはできないっぽい？かも？

slackみたいにスラッシュコマンドで実行できる形にできると便利ですね。
A-CSM研修はこんなことをしたかったのだろうのまとめ

# A-CSMで取り扱う4つの観点

スクラムマスターとして次のステップは以下の4つのスキルアップである
1. 開発チームへのサービスの提供
2. プロダクトオーナーへのサービスの提供
3. 組織へのサービスの提供
4. スクラムマスターとしての能力の向上

# スクラムの構成要素の観点でのA-CSMでフォーカスする部分

下記からなる3層構造(オニオンっぽい)の最も外側の部分に"3"にフォーカスする

1. スクラムの原理・原則
2. スクラムのフレームワーク・イベント・役割・アーティファクト
3. アジャイルな手法・組織・チーム・プロダクト

※1と2に関してはCSMですでに完了している

# 開発チームへのサービスの提供

## チームの立ち上げ

Lift off

* Purpose why
* Alignment How together
* Context whatelse

## 目指すところ
Hackmanモデルによる、
効果的なチームへとチームをリードするスクラムマスターであるために
どうサービス提供していくか学んでゆく。

## 効果的なチームの人数とは
要は5人

## ハックマンモデルに沿って自分の組織を考える
効果的な組織とはつまり以下の3点

* Deliver
* Grow as a team
* Indivisuals Learn

### 参考
https://www.amazon.co.jp/dp/4820118188

## チームの権限移譲状態
管理者とチームの実行責任の状態をマトリックスで考える

### 参考
https://www.infoq.com/jp/articles/what-are-self-organising-teams/

## タックマンモデル

4つのサイクルもしくは5番目の選択肢

* Forming
* Storming
* Norming
* Performing

* Adjuorning

https://www.businessballs.com/team-management/tuckman-forming-storming-norming-performing-model/

# プロダクトオーナーへのサービス提供

## プロダクトビジョン
プロダクトビジョンはありますか？

## ビジョン作りのサポート

プロダクトオーナーに対してビジョン作りのサポートをしていく

### エレベーターピッチ

ご存知のもの

### ジョブ理論 クレイトン・クリステンセン

下記の要素が大事であることをジョブ理論をよく読めば良さそう

* Functional
* Social
* Emotional

## The Value Proposition Canvas

フレームワークに沿って価値を考える
このフレームワークを体験する

## User Story Mindmap

https://www.dropbox.com/s/lugrqix1r3iodb2/User%20Story%20and%20Non%20Functional%20Requirements%20in%20Scrum%20jp.pdf?dl=0

## User Story Mapping

改めてユーザーストーリーマッピングで価値について考える
朝起きて会社に出発するまでを

* 180mins case
* 30mins case
* 5mins case

できることで
walking skelton
や
MVP
の概念を学ぶ

# 組織へのサービス提供

## 責任のプロセス

責任を持った仕事をするまでの段階を説明

## 責任の移譲

実行責任と結果責任の移譲

## クネビンフレームワークによる組織課題の抽出

# Scrum Masterのスキルアップ

## スクラムマスターの4つのスタンス

* Trainer/Teacher
* Consultant
* Facilitator
* Coach

## スクラムマスターのスキル

* Training
* Coaching
* Facilitation

### Trainingとは

* Trainerの姿勢
* Trainingを作る4つのC

### Coachingとは

* 傾聴
    * 傾聴の3段階
    * 傾聴の目指すもの
    * パワフルクエッション
    * オープンクエッション
* コーチングの姿勢
* GROWのフレームワーク

### Facititation

* ファシリテーションの姿勢
* ファシリテーションのテクニック
* 会議の段階
    * 拡散 (Divergence)
    * 探求 (Groan)
    * 収束 (Convergence)
* Dicision Making
    * Consensus
    * Consent
    * No Consent
    * 合意形成の手法
        * Fist to Five
        * Thmbs Up
    * 相違のマトリックス

とかを5日間で行った
専門統計調査士（CBT試験）対策

---
# 専門統計調査士(CBT試験）とは。
概要はこちら。https://www.toukei-kentei.jp/cbt/cbt_about/grade6/

# 試験対策。
対策本はほとんどなく、公式過去問集が2冊だけあります。
https://jitsumu.hondana.jp/book/b505613.html
さらに過去版があるらしいのですがすでに絶版のようです。
他にも紙試験の直近の試験1回分の過去問と解答が公開されています。
https://www.toukei-kentei.jp/about/senmontyousa/#pastp

計算問題は，母比率推定の問題が多く出ます。
標準誤差が以下の式で示されるヤツです。とにかく標準誤差を徹底的に理解しましょう。

```math
SE = \sqrt{p(1-p)/n}
```
計算問題の範囲としては，統計検定2級相当です。重回帰も少しだけ出ましたし，決定係数も出てきました。
統計を勉強するのは，Youtubeのヨビノリがお勧めです。
https://www.youtube.com/watch?v=Bj8fkq533Dc


# 出題内容。
出題内容自体はCBTなので公開できませんが、基本的には過去問をやっておけば半分ぐらいは大丈夫な感じです。
統計調査士に比べて，理論的な問題や計算問題が多いです。

# 感想。
計算が得意な人は，統計調査士より簡単です。記憶力・運・勘に頼る割合が統計調査士より少ないからです。
【初心者でもわかる】border付き下向きの吹き出しを作る方法

# どうも7noteです。枠線付きの吹き出しの作り方。

四角形を２つ使って吹き出しを作ります。
微調整しながら作らなければ、うまく線がつながらないので注意しましょう。

**完成イメージ**

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/23bb2f36-f4ac-5886-826b-4e98f13e4514.png)

## border付き吹き出しの作り方

```index.html
<p><span class="fukidashi">ふきだしのテキスト</span></p>
```

```style.css
.fukidashi {
  color: #333;           /* 文字色をグレーに指定 */
  text-align: center;    /* 文字を中央寄せにする */
  min-width: 200px;      /* 長くなっても大丈夫なようにmin-widthで横幅指定 */
  background: #FFF;      /* 背景色を指定 */
  border: 1px solid #666;/* 枠線をつける */
  padding: 8px;          /* 適度な余白 */
  display: inline-block; /* widthを効かせるために指定 */
  position: relative;    /* 基準値とする */
}

.fukidashi::after {
  content: '';           /* 疑似要素に必須 */
  position: absolute;    /* 相対位置に指定 */
  bottom: 0;             /* 下から0pxの位置に指定。 */
  left: 50%;             /* 左から50%の位置に指定 */
  width: 10px;           /* 四角形の横幅を指定 */
  height: 10px;          /* 四角形の高さを指定 */
  background: #FFF;      /* 背景色を指定 */
  border-right: 1px solid #666; /* 右側にborder */
  border-bottom: 1px solid #666;/* 下側にborder */
  transform: translate(-50%,55%) rotate(45deg); /* 表示位置を左方向に半分戻し、下方向に移動。かつ45度時計回りに回転 */
  transform-origin:center center; /* 回転の基準位置を中心に指定 */
}
```

## 解説

三角（▼）部分は四角形の線を右と下にだけつけて、45度回転させることで下向きの三角に見せています。
本来後ろに見えている線は、afterに背景色（白）を入れて、見えなくしています。

spanにだけ色をつけるとこんなかんじ。

![sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/52294bcd-24e4-788e-2e56-0ec37264a296.png)


そのため、もしafterと文字がかぶってしまうと文字が見えなくなったり、背景色が違うとこのように浮いてしまうのでそのあたりは作成時に注意が必要です。

またtranslateの値を微調整しなければ、うまく三角部分が繋がって見えないので、三角の大きさに合わせて微調整を行えばきれいに見せることができます。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
モダンにWordpressを開発しよう

#はじめに
最近お仕事でWordpressで作られたHP改修の依頼をいただくことが多いので
Webサービスで流行っている環境構築/デプロイ/テストの自動化みたいなことって
Wordpressでもあるのかなと思って調べて見ました。

ただ調べるだけだと面白くないので
英語で調べた内容を簡略して（分かるところだけ）紹介します。

検索クエリ「How to develop a modern WordPress」
上位8位ぐらいにあった記事を読ませてもらいました。
https://ae.godaddy.com/blog/modern-wordpress-development-and-deployment/

#Modern WordPress development and deployment
##introduction
この記事はWordPress、Plugin、Themaの開発、
またデプロイについて最新状況を説明します。
Wordpressはインターネットの35%、CMSの62%で使われてるから汎用性あるよ。

##Dependency Manager
今はワンクリックでWordpressを作成できるけど
開発/ステージング/本番で環境管理するのは大変だよね。

※PHPデベロッパーであればComposerの有用性に気付いているだろう

一度各環境を作成したらどう自動的に環境同期する？
それはBranchCIのようなCI/CDツールがいいよ。
それはビルドしてテストしてデプロイしてくれる。

また、コマンドラインから操作したい人はWP-CLIなんかもいいよ。
WP-CLIが提供するものは以下だ。
(すみません、理解できたものしか載せてません。興味ある方は是非原文へ)

・キャッシュクリア
・config fileの作成
・cronの実行
・WXR fileのimport/export
・language packの管理
・maintenance modeの管理(enable, disable)
・投稿タイプやタクソノミー、子テーマなどのコード生成

詳しくは公式を見てくれ
https://developer.wordpress.org/cli/commands/

それでは次はPlugin、Themaの開発方法を見ていこう。

##Modern Plugin Development
Roots.ioがLaravel、Ruby on Railsの開発方法を取り入れたCloverというツールがいいよ。
Cloverが提供するものは以下だ。
(こちらも理解できたもののみです)

・初期構造の作成
・ビューと他でコード分ける
・BladeとEloquent ORMが使える
・Artisanのようなコマンドが使えるよ

現在はベータモードだから注意。

##Modern Theme Development
Themaの開発についても同会社が提供してるSagaを使うといいよ。
これはバックエンド、フロントエンド両方の開発方法を参考にしていて、
Sassを使用してjsのエラーチェックや画像の最適化（軽量化？）もしてくれるし、
Laravelのようなファイル構造で管理できるんだ。

##Final words about WordPress development
見てもらったようにPlugin、Themaおよび
Wordpressのweb siteの開発はエキサイティングにできるんだ。

#まとめ
バックボーンが浅くて読めても、え？ってなるところもあったけど
（日本語でもよくあるよね）
大きくWordpress界隈でもそれぞれ
Wordpressの環境構築（ここではWP-CLIとかBranchCI）、
Plugin（Clover）、
Thema（Saga）などの便利なツールがあって、それらは
LaravelとかRailsで作られているような最近のwebサービスの
開発手順、方法と似たような設計で作られたもの、って感じですかね。

捉え方違くね？とかあったら是非コメントください。
rails db:migrateでエラー


rails db:migrateを行った後のエラー


```
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
.
.
.
```

<h1>原因</h1>
`rais db:migrate`の前に行ったコマンドで何か手違いが起きている？たぶん。。。

<h1>解決策</h1>

```
$ rails db:migrate:reset
```

```
$ rails db:migrate
```

これで解決！！！
AWS Data Pipelineで利用しているAMIをリストアップする

AWS DataPipelineで利用しているAMIのImage IDを調べるために使ったスクリプトです。

```python
import boto3
from time import sleep

session = boto3.Session(profile_name="{プロファイル名}")
client = session.client("datapipeline")


def main():
    for x in list_all_pipelines():
        for i in get_ec2_resources(x):
            print(x, i)


def list_all_pipelines():
    """markerを指定しないと途中で終わってしまう
    """
    result = client.list_pipelines()
    pipelines = [x["id"] for x in result["pipelineIdList"]]
    marker = result["marker"]
    while marker is not None:
        y = client.list_pipelines(marker=marker)
        pipelines += [x["id"] for x in y["pipelineIdList"]]
        marker = y.get("marker", None)
    return pipelines


def get_ec2_resources(pipeline_id):
    resources = []
    result = client.get_pipeline_definition(pipelineId=pipeline_id)
    for x in result["pipelineObjects"]:
        if x["name"] == "Ec2":
            for y in x["fields"]:
                if y["key"] == "imageId":
                    resources.append(y["stringValue"])
    return resources


if __name__ == "__main__":
    main()
```
micro:bit v2 用 MicroPython の beta-3 が出たので試してみた

# はじめに

micro:bit Advent Calendar 2020 6日目の「[micro:bit v2 用 MicroPython で新機能を試してみる](https://qiita.com/inachi/items/c86a07818e717b3d8836)」を書いたときには V2用MicroPython は beta-2 でしたが、早くも12月21日に [beta-3](https://github.com/microbit-foundation/micropython-microbit-v2/releases/tag/v2.0.0-beta.3) が出たので新機能や変わったところを試してみました。

# タッチセンサーのモードの変更

端子 0, 1, 2 を静電容量式のタッチセンサーに変更できる `set_touch_mode()` メソッドが追加になりました。これでロゴ以外でも GND 端子に触れることなくタッチセンスできるようになります。

```python
from microbit import *

touch_pin = pin0

touch_pin.set_touch_mode(touch_pin.CAPACITIVE)  # 静電容量
#touch_pin.set_touch_mode(touch_pin.RESISTIVE)  # 抵抗膜

while True:
    if touch_pin.is_touched():
        display.show(Image.HAPPY)
    else:
        display.show(Image.SAD)
```

一方、ロゴのほうを抵抗膜式に変更できるかというと、それはうまくいきませんでした。

# アセンブラ関数

V1 にはあったアセンブラ関数が V2 でもサポートされました。以下は簡単な整数の足し算の例です。

```python
from microbit import *

@micropython.asm_thumb
def asm_add(r0, r1):
    add(r0, r0, r1)

display.show(asm_add(1, 2))
```

# スピーカ関連の変更

[以前の記事](https://qiita.com/inachi/items/c86a07818e717b3d8836#%E3%82%B9%E3%83%94%E3%83%BC%E3%82%AB%E3%83%BC)で、内蔵スピーカーと外付けのスピーカーの両方を指定するAPI仕様が正式にサポートされるか微妙と書いていましたが、beta-3 では廃止となりました。

デフォルトで内蔵スピーカーと端子 0 から音が出るのは今までどおりです。

内蔵スピーカーを有効/無効にする `speaker.on()/off()` が追加になりました。

```python
from microbit import speaker
import music

speaker.off()  # 内蔵スピーカーを無効にする
music.play(music.PYTHON)  # 端子0に繋いだスピーカーからだけ音が出る
```

内蔵スピーカーからだけ音を出すようにする(端子0 を別の目的に使えるようにする)には次のようにします。

```python
import music

music.play(music.PYTHON, pin=None)
```

端子1や2に繋いだスピーカからだけ音を出すには次のようにします。

```python
from microbit import speaker, pin1, pin2
import music

speaker.off()
music.play(music.PYTHON, pin=pin1)  #　端子１に繋いだスピーカーの場合
music.play(music.PYTHON, pin=pin2)  #　端子2に繋いだスピーカーの場合
```
[SwiftUI] Textの省略位置の指定方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638786/d8465754-0bc8-dec4-d213-d2fdc238fea7.png)

調べ方が悪くなかなか情報が見つからず、「SwiftUI Text Overflow」で調べてようやく見つかりました。文字溢れっていうんですね。

```Swift
struct TestView: View {
    var body: some View {
        VStack{
            Text("SwiftUIでTextの省略位置を指定するにはtruncationModeを使用しましょう")
                .truncationMode(.tail)
                .lineLimit(1)
            Text("SwiftUIでTextの省略位置を指定するにはtruncationModeを使用しましょう")
                .truncationMode(.head)
                .lineLimit(1)
            Text("SwiftUIでTextの省略位置を指定するにはtruncationModeを使用しましょう")
                .truncationMode(.middle)
                .lineLimit(1)

        }
    }
}
```

このように`truncationMode`をセットすることで「……」にする位置を調整できます。
Webアプリのファイルアップロードで413 Request Entity Too Largeを回避した話

以下のようなリバースプロキシ構成でJSPとか使ってWebアプリケーションを開発しているのですが、アプリケーションについているファイルアップロード機能で「**413 Request Entity Too Large** というエラーが出てファイルのアップロードに失敗する」という問題が発生しました。

```
[client]----->[nginx]----->[Tomcat]
```

詳しく聞いてみると、いつもよりちょっと大きい1.5MB程度のファイルをアップロードしたところこのエラーが出たとのこと。

たしか、Tomcatにこういう制限があったなと思いだして、マニュアルを見てみると。

https://tomcat.apache.org/tomcat-9.0-doc/config/http.html

> maxPostSize	
>> The maximum size in bytes of the POST which will be handled by the container FORM URL parameter parsing. The limit can be disabled by setting this attribute to a value less than zero. If not specified, this attribute is set to 2097152 (2 megabytes). Note that the FailedRequestFilter can be used to reject requests that exceed this limit.

デフォルトで2MB... **2メガバイト**まではいけるのにどうして？？
と暫く考えましたが、前段のnginxにも同様の設定があり、

https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size

> Syntax: client_max_body_size size;
> Default: client_max_body_size 1m;
>> Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field. If the size in a request exceeds the configured value, the 413 (Request Entity Too Large) error is returned to the client. Please be aware that browsers cannot correctly display this error. Setting size to 0 disables checking of client request body size.

こっちはもっと小さく、デフォルト1MB ... **1メガバイト** でした。
ここでエラーになっていたわけですね。

そこで、nginxの設定ファイルに ```client_max_body_size``` を足して再起動し、無事アップロードできるようになりました！

```nginx.conf
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  localhost;
        root         /usr/share/nginx/html;
        client_max_body_size 10M;
        ....
```

通り道にも気を付けましょうというお話でした。
EC-CUBE4をカスタムする方法に悩んだお話。

EC-CUBEのカスタマイズ案件をよく受けています。

４系になりカスタマイズする方法は大きく分けて３種ではないでしょうか？

- 本体をカスタマイズ
- 自作プラグインでカスタマイズ
- Customizeフォルダでカスタマイズ

初めてEC-CUBEのカスタマイズ案件を受けたのが３系で、どのようにカスタマイズするのかかなり悩みました。

##初めてのカスタマイズ案件（３系）
３系はCustomizeフォルダがないので、本体をカスタマイズするか、プラグインを自作するかの２択です。

そして、symfonyさえ触ったことのない状態で、ない頭をフル回転させて、プラグインでカスタマイズする方法を選択しました。

理由は以下の点です。

- 本体をいじるとバージョンアップが大変な点
- プラグインを作成すると、使い回しができる点

ちなみに、今でこそ少しgitを使ってますが、この時は使ったことがありませんでした。

まぁ、３系で作成したECは無くなってしまったのですが、良い経験にはなりました。

##２回目の案件から４系を使う

次に関わった案件のバージョンは「4.0.3」を利用しました。
（当時、最新のバージョン）

Customizeフォルダが用意されていたのは知っていたのですが、よくわからなかったので、ここでも自作プラグインでのカスタムを行いました。

理由は３系の時と変わりませんが、カスタマイズしていくうちに、少し疑問が湧いてきました。

その疑問は、**プラグインとして作っても、このまま再利用（使い回し）できなくね？**

実は２回目の案件の要件がかなり特殊で、同じようなカスタムは二度とないだろうと思ったのです。

###機能がてんこ盛りすぎて再利用が難しい
要件が多く特殊すぎて、全く同じ機能を必要とする案件がなさそうなので、使い回しが出来ないというか、する機会がないと思いました。

そして、次の案件で使うとしても、機能を削る、もしくは一部分を抜き出しながらでしか使えないです。

でも、影響する箇所が分かりずらく、ゼロから作った方が早いですよね。。。

そこでプラグインではなくて、Customizeフォルダを今度からは使おうと思いました。

##３回目の案件はCustomizeフォルダを使おうと思ったのだが
再利用しないのであれば、Customizeフォルダだけで行おうと思いました。

しかし、今度の要件がそれを拒んだのです。

EC-CUBEは会員と管理者の２グループですが、そこへもう１グループ増やす要件だったのです。

管理者とは別の権限で管理ページを作るって事で、色々調べて試行錯誤してましたが、Customizeフォルダではできませんでした。

結局プラグインでその後も作り続ける事になるのですが。

そして、たまにCustomizeフォルダも使ってます。

##カスタマイズだけ頼まれる
今までの案件は、ほぼ直受けでしたので基本的に自分だけしか触らないです。

だからどんなにくそったれでも、自分が管理するので好きなように作ってきました。

しかし、カスタマイズだけして、保守管理は自分でする必要がない案件なども出てきました。

そのような場合は、Customizeフォルダだけでカスタムするようにしています。

理由は以下になります。

- 自分が影響を与えた範囲を分かり易く伝えれる。
- プラグインのON・OFFなどされない。

ガッツリしたカスタムの内容ではないので、Customizeフォルダで対応出来ているというのもあります。

##今後どう考えているのか

まず自作プラグインでのカスタムは行わないようにしようと思っています。

理由は様々なのですが、大きな点は**特殊な要件になる事が多いので、再利用する機会がない**という事です。
（プラグインは多くのシステムで使わなければ、プラグインという恩恵が受けられないかもですね。）

だったらCustomizeフォルダでいいやってなるのですが、それも微妙です。

それは、「app/config」内の設定ファイルなどにも手を入れる事もあるからです。

バージョンアッププラグインなどが用意されるようになり、4.0.4から4.0.5へといったバージョンアップが簡単になりました。

しかし、上書きされる心配があるファイルのカスタムへも手を伸ばす事があるので、難しくなる時が来ます。

ということは、EC-CUBE Advent Calendar 202016日目の[EC-CUBEのバージョンアップを見据えたカスタマイズ方法2020年度版](https://qiita.com/nanasess/items/7ad3592073458adae09d)を読み込むのが良いかと思ってます。

まぁ、状況や要件によって臨機応変に対応で良いかと思っていますので、基本的にはCustomizeフォルダを使ったカスタムを行おうと思っています。

でも、カスタムの要件が大きくなればなるほど、バージョンアップを見据えたカスタマイズ方法の記事が役立ってくるのも事実！！

gitの勉強、まだまだ続けなければ。。。



ただ書きなぐっただけの文章で、何を言っているのか分からない状態ですが、最後まで読んで頂き有り難うございます。
[Python Windows] Pythonバージョンを指定してpip install

* Windows の Python ランチャを利用



# インストールされているPythonのバージョン確認
* ```*``` がついているバージョンがデフォルトバージョン

```terminal
C:\Users>py --list
Installed Pythons found by py Launcher for Windows
 -3.8-64 *
 -3.6-64
 -2.7-64
```

* ※ 各バージョンのpython.exeのパスを知りたい場合は、```--list``` を ``` --list-paths ``` にする

```terminal
C:\Users>py --list-paths
Installed Pythons found by py Launcher for Windows
 -3.8-64        C:\Users\username\AppData\Local\Programs\Python\Python38\python.exe *
 -3.6-64        C:\Users\username\AppData\Local\Programs\Python\Python36\python.exe
 -2.7-64        C:\Python27\python.exe
```

# バージョンを指定してPip Install

```terminal
# バージョン3.6のPythonにsklearnをインストール
py -3.6 -m pip install sklearn
# バージョン指定した場合
py -3.6 -m pip install sklearn==0.22

# ※ Uninstall時
py -3.6 -m pip uninstall sklearn
```

# Reference

* [3. Windows で Python を使う>  Windows の Python ランチャ — Python 3.9.1 ドキュメント](https://docs.python.org/ja/3.9/using/windows.html#python-launcher-for-windows)
[書評]「人工知能は人間を超えるか」を読んで

#読んだ本
* [人工知能は人間を超えるか](https://www.amazon.co.jp/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%E3%81%AF%E4%BA%BA%E9%96%93%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E3%81%8B-%E8%A7%92%E5%B7%9D%EF%BC%A5%EF%BC%B0%EF%BC%B5%EF%BC%A2%E9%81%B8%E6%9B%B8-%E6%9D%BE%E5%B0%BE-%E8%B1%8A-ebook/dp/B00UAAK07S)  
* KADOKAWA
* 松尾　豊

#概要
人類史ではこれまでに3回の人工知能ブームがおとずれた。それぞれのブームについて、人工知能技術の発展を追いかけながら、現在ある人工知能ブームを巻き起こした新技術ディープラーニングがどういった技術であるか、そして筆者がその技術にこれまでのブームでは存在しえなかった大きな可能性を感じている理由などがこの本では述べられている。
また、これまで人工知能ブームは失望とともに閉幕してきたが、それらを引き起こすような無知で過度な期待を寄せられてきた人工知能に対してどういった姿勢で関心を持つべきかをはっきりと主張している。

#感想
私は情報系の学生で、機械学習については多少話には聞いていたがまとまった知識はなかったので、面白いと聞いて、この本を読んだ。
探索によって予想する技術によって引き起こされた第一次人工知能ブーム。
状態全体の空間をええ感じに分けることでパソコンに判断させる機械学習による第二次人工知能ブーム。
そして、有効な特徴量の発見をヒューリスティックにではなくパソコンに実施させることができるようになった第三次人工知能ブーム。
これまでの人間の職人的な勘に頼っていた機械学習に対して、高次のものを低次に圧縮して復元する際に最適なパフォーマンスを発揮するもの、そして多少のノイズの中でも間違いなく力を発揮できるrobust性を持った特徴量を求めるという考えで実現されたディープラーニング技術についてとてもワクワクして読み進めることができた。
最後の方では、過度の期待に対して警鐘を鳴らしながら、冷静にディープラーニング技術によって理論的には可能になった「概念」そのものの獲得にそくして、これからどのようなことが起こりえるかを解析していく。
徐々に獲得していく概念を生かしながらより高度に人間的な概念を獲得していく様は、われわれが高級言語をかけるようになった図をほうふつとさせる。
アセンブリをコンパイルするコンパイラを最初に書いた人はアセンブリで書いたはずで、それを用いてc、...,java,pythonと抽象化された使いやすいものが登場したが、すべては最初にアセンブリでコンパイラを書いてくれた人のおかげである。
ディープラーニングの技術は現状一つの(人間にとっては明白な!)概念を獲得するのにとてつもない計算量とデータを必要とするらしい。
これからが一番大変で重要な工程なのだと思うと、学んでみようと思えてくる。モチベーションはすごく上がった！
著者の性格がすごく出ている人のいい文章で研究者へのあこがれも増した。
NEMのNIS1で簡単に物理NFTデジタルメッセージBOXを作る+山林を無価値トークンで貸し出す社会実験概要


NEMのNIS1で簡単に物理NFTデジタルメッセージBOXを作る！

参考完成形（試作）
![DSC_0082.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546181/cb2aff8a-332e-cf21-e770-31bcb5e2c497.jpeg)


内部にFNCタグを封入している。レジンからくる発熱で破損はしなかった。
![DSC_0084.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546181/bfdce82e-63dd-ff7b-b79e-393e3e798687.jpeg)
 

 




おサイフケータイを近づけるとWEBページが開き、NEMNIS１に刻まれたメッセージが読めるという仕組み。
https://explorer.nemtool.com/#/s_tx?hash=6e33465c25b48fddfb1f6fb101c12e42a233123de13c8267f3efb4999bada44f
UIを作ればもっとそれっぽくなると思う。


用意するものは
・パソコン
・nem(NIS1ウォレットアドレス）https://nemplatform.com/wallets/
・おサイフケータイ機能スマホ
・NFCタグ書き込みスマホアプリ
　（私はタグマティックを使いました。）https://www.nfctags.co.jp/nfc-news/nfc-new/2393
　（PCと専用リーダーライターでもできそうだけどプログラムが必要なのでまたあとで）
・ハンドメイドレジン製作物
 

１．nemウォレットを公式からダウンロードしてパソコンにインストールします。
２．nemウォレットでアドレスを作成します。
３．おサイフケータイスマホにNFCタグ書き込みソフトをインストールしておきます。
４．Amazonから適当なNFCカードを購入しておきます。（なんでもいいような気がします）
５．nemウォレットから作成したアドレスにメッセージを書き込み０XEM送信します。（手数料は必要）
６．NEM https://explorer.nemtool.com/にアクセスしてメッセージを刻んだウォレットアドレスを入力します。
メッセージのいれたハッシュにアクセスします（リンク先に行く感じ）

直接リンク先が開きますので
https://explorer.nemtool.com/#/s_tx?hash=6e33465c25b48fddfb1f6fb101c12e42a233123de13c8267f3efb4999bada44f
↑をメモして
NFCタグ書き込みスマホアプリの「ブラウザでWeb表示」を選択してURLを入力します。
入力したらNFCタグに近づけると数秒で書き込まれます。
で、完成！

 

考察：
・ウォレットアドレス１個に１メッセージ１カードにすると、単純に世界で１個だけのNFTカードが完成する。
・さらに複製されるようなことを防ぎたいなら、別のウォレットアドレス１個を台帳アドレスとし、
　そこからメッセージを他のアドレスに書き込めば、他の人が複製しても調べればわかる状態になる。
・作家と購入者はウォレットアドレスを介してメッセージがやり取りでき、それが半永久的に残されるので
　作品としての歴史価値が深まると思います。
（場合によっては黒歴史になりますが、過去の汚点は失敗談として語り継いだ方がいいと思います）




【付録】山林を無価値トークンで貸し出す社会実験概要
私が来年秋までにやろうとしている事
nemlog+貨幣価値のないモザイク（トークン）+不動産

年末、nemlog内で会社ごっこをやるのですが（参照https://nemlog.nem.social/blog/53061）
、そこで参加貢献者にネムカコイン（貨幣価値のないモザイク）（参照https://nemlog.nem.social/blog/49534）を
１ユーザー５万枚報酬として差し上げます。

ネムカの創造主はソラネコさん
![1591095470id.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546181/450061de-95cb-34ab-3970-c25bf7a540b1.png)



ただいま、過疎地域の山林を調達すべく交渉を進めています。（会社設立用）
※こちらはイメージです
![IMG_0038_R.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546181/1386ffb4-5f09-7a8c-087a-b06c0ff7b22a.jpeg)


ちょっと広めの山林を入手するつもりですので、ネムカコイン５万枚で１年間区分けされた１M×１Mの土地を借りることができます。
土地はランダムにしますが、管理者の私を通して構造物の設置、植物の定植、植林、センサー等の取り付け
定点カメラの取り付け等を行うことができます。また、その区画で発生した成果物、元々あった土、他土壌資源を管理者の私を通して
利用することができます。小さいガーデンを作っても良し、天候の定点観測してもよし、放置して定期的に送られてくる写真を眺めるもよし。
そんなプロジェクトです。

ああ、もちろん計画倒れする場合もあります。
micro:bit V2 タッチセンサーとスピーカーを使った簡単演奏楽器


Advent Calendar に空きがあるようなので書きます。


## 経緯とか

micro:bit V2 にスピーカーが追加され、外付けでスピーカーを用意する必要がなくなりました。
せっかくなので、micro:bit単体で音が出る何かを作りたいと思った時、ふと頭をよぎったのが、某どうぶつが島の住民なゲームの中の楽器でした。
micro:bitに付いているA/Bボタンは、離したとき判定をするには複雑になりそうでしたし、端子を指で触るには小さすぎました。
V2で追加されたタッチセンサーでは、触ったとき、離したときのプログラミングが容易になっています。


## コーディング

プログラミングはMakeCodeで行います。
V2用に追加されたブロックを使います。

音符の音の長さをタッチセンサーを触っている長さで表現するため、`on logo`ブロックの`touched`と`離した`の2つを使ってプログラミングします。

`touched` で音を鳴らし、`離した`で音を停止します。

某どうぶつが島の住民なゲームの中の楽器では、ただランダムに音が出るだけ（ゲーム内で有名なミュージシャンの曲だという話もあるようですが未確認）ですが、決まった順序で音を出したいので、配列に出したい順番に音を並べています。

![2020-12-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84215/4523f495-12ec-654c-9df2-8dae54284788.png)


## 実際に動かしてみる

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">micro:bit v2でクリスマスソングを演奏してみる🎄<br>メリークリスマス❗️<a href="https://twitter.com/hashtag/microbit?src=hash&amp;ref_src=twsrc%5Etfw">#microbit</a> <a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0?src=hash&amp;ref_src=twsrc%5Etfw">#プログラミング</a> <a href="https://t.co/hHxtk2aAdu">pic.twitter.com/hHxtk2aAdu</a></p>&mdash; ちょっと岡P！ (Masafumi.Okamoto) ＠ IT Engineer &amp; Magic (@Mao172) <a href="https://twitter.com/Mao172/status/1342090265914298373?ref_src=twsrc%5Etfw">December 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## シェアします

作ったプログラムを公開しましたので、こちらからどうぞ。

https://makecode.microbit.org/_0uLLwpLwWCgf


## まとめ

というわけで、皆さん、メリークリスマス！
Mac スクリーンショットのショートカットキー

全体のスクリーンショットをファイルに保存
```「command」＋「shift」＋「3」 ```

全体のスクリーンショットをクリップボードにコピー
```「command」＋「shift」＋「control」+「3」 ```

選択した範囲のスクリーンショットをファイルに保存
``` 「command」＋「shift」＋「4」 ```

選択した範囲のスクリーンショットをクリップボードにコピー
``` 「command」＋「shift」＋「control」+「4」 ```


「3」　全体スクリーンショット 
「4」　選択した範囲スクリーンショット
「control」 でクリップボードへ

[Mac でスクリーンショットを撮る方法（マウスカーソルを含む方法） – act2 サポート](https://support.act2.com/hc/ja/articles/204261579-Mac-%E3%81%A7%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E3%82%92%E6%92%AE%E3%82%8B%E6%96%B9%E6%B3%95-%E3%83%9E%E3%82%A6%E3%82%B9%E3%82%AB%E3%83%BC%E3%82%BD%E3%83%AB%E3%82%92%E5%90%AB%E3%82%80%E6%96%B9%E6%B3%95-)