OmniAICreator/Qiita-1.07M huggingface dataset:
【アウトプット】やりたいことからRubyを最速で学ぶ・その２「フローチャートを作成する」

# はじめに

みなさん、おはようございます！
本記事は「やりたいことからRubyを最速で学ぶ」の第2回です。

この連載記事では、「オリジナルプログラム作成」を通じて手を動かしながらRubyの基礎を理解する、積極的に「アウトプットをしていこう！」という記事です。

もちろんインプットも大事です。が、それ以上にアウトプットが重要です。

今回は、第1回の記事で触れたフローチャート（みたいな図）をもとに機能を分解する方法を説明する予定でしたが、その前にフローチャート（風）の書き起こし方を説明します。

# 対象となる読者
本記事では、「プログラミング初心者」「何か作ってみたい！」という人たちを対象としています。
連載記事なので、まだ第１回の記事を読んでいない方はまずこちらをお読みください。

[【アウトプット】やりたいことからRubyを最速で学ぶ・その１「作りたいものを考える」 - Qiita](https://qiita.com/Ikko-T/items/f1676f9f3b6e25b29f3b)

# この記事で学ぶこと
本記事では、第１回の記事で書き起こしたフローチャート（みたいな）作成に関する以下の知識を学びます。

- 構造化プログラミング

この知識を理解し、応用することで複雑な処理の流れを読みやすく、かつ分かりやすくなるはずです。
短めの内容ですが、ときどきお茶休憩を挟みつつ進めるようにしてくださいね。

# 動作環境
- Ruby 2.6.6

# 構造化プログラミング
まず、構造化プログラミングとは何か？

「構造化プログラミングは、プログラムを機能単位の部品に分けて、その組み合わせによって全体を形作る考え方です。」（きたみ、2020、p.539）

構造化プログラミングでは、基本的に下記の３つの制御構造だけを使ってプログラミングを行います。

- 順次構造（上から順番に処理を実行する）
- 選択構造（何かしらの条件によって分岐させ、いずれかの処理を実行する）
- 繰り返し構造（ある条件が満たされるまで、一定の処理を繰り返す）

![programming_structures.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628330/b515782f-6e72-21de-855d-eb4313884cab.png)


# ゲームの流れを言語化する
構造化プログラミングの３つの制御構造を理解したところで、次にゲームの流れを言語化します。
今回は「あっち、むいて、ホイっ！」のゲームを参考にして、大まかな流れを書き出します。

```
ゲーム開始 ⇨ ユーザー上下左右の選択 ⇨ コンピュータ上下左右の選択 ⇨ ユーザー勝敗 ⇨ 続行 ⇨ ゲーム終了
```
書き出した大まかな流れを、上記で説明した制御構造に当てはめると、、、ドン！

![flow-chart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628330/137c315f-6f63-217f-a9d5-40a5c80e1a4f.png)

順次構造、選択構造、繰返し構造を組み合わせたフローチャートです！
今回のゲームでは３つの構造を組み合わせた結果になりましたが、内容によっては１つだけだったり、２つ組み合わせたものだったりするはずです。

# まとめ
いかがだったでしょうか？
今回は、かなり短めの内容でした。

本記事では、以下のようなことを学びました。

- 構造化プログラミング
- 順次構造
- 選択構造
- 繰返し構造
- ゲーム流れの言語化

今回の内容を理解できれば、フローチャート作成のバリエーションが増えてくるはずです！

次回の記事では、「機能の分解」を説明する予定です（今度こそ）。

やりたいことからRubyを学びたい！という読者の方は、次回以降の記事も引き続き読んでやってください。

最後までご覧いただきありがとうございました(^-^)/

# 参考本
- キタミ式イラストIT塾 基本情報技術者
【試験合格記】AWS 認定 Alexa スキルビルダー – 専門知識(AXS-C01)

お疲れさまです。
表題の試験に合格したため記録として残したいと思います。

# 結果
合格(815点)

|分野|名称|割合|
|:-----------------|:-------------------|:-------------------|
|1|音声ファーストのデザイン手法および機能|14%|
|2|スキルデザイン|24%|
|3|スキルアーキテクチャ|14%|
|4|スキル作成|20%|
|5|テスト、検証、トラブルシューティング|18%|
|6|公開、運用、およびライフサイクル管理|10%|

# 所有資格

| 資格名       |取得年月日 |
|:-----------------|:-------------------|
|AWS Certified Solutions Architect - Associate (SAA)|2018-06-14|
|AWS Certified SysOps Administrator - Associate (SOA)|2018-06-22|
|AWS Certified Developer - Associate (DVA)|2018-06-25|
|AWS Certified Solutions Architect - Professional (SAP)|2018-07-19|
|AWS Certified DevOps Engineer - Professional (DOP)| 2020-02-19| 
|AWS Certified Big Data - Speciality (BDS)| 2020-03-23| 
|AWS Certified Security - Speciality (SCS)| 2020-04-01| 
|AWS Certified Machine Learning - Speciality (MLS)| 2020-04-13| 
|AWS Certified Advanced Networking - Speciality (ANS)| 2020-04-27| 
|AWS Certified Cloud Practitioner (CLF)| 2020-04-27| 
|AWS Certified Database - Specialty (DBS)| 2020-09-22|
|AWS Certified Alexa Skill Builder (AXS)| 2020-12-06| 

# 事前知識
全くありませんでした。
Amazon Echoも所持していないし、「Alexa」と発言したことも無いぐらいです。

# 所感
学習開始時点ではAWSと一線を画した未知の分野になるため、知らない概念だらけで心が折れかけました。
まずは取っ掛かりを作らなければと思い、whizlabsの有料問題集に手を付ける前に公式の資料を読み漁りました。

* [Alexaスキル開発トレーニング](https://developer.amazon.com/ja-JP/alexa/alexa-skills-kit/get-deeper/tutorials-code-samples/build-a-skill)
* [Exam Readiness: AWS Certified Alexa Skill Builder - Specialty (Japanese)](https://www.aws.training/Details/eLearning?id=45890)
* [Alexa公式 動画シリーズ「Alexa道場」](https://developer.amazon.com/ja-JP/alexa/alexa-skills-kit/get-deeper/webinars)

ワケが分からないながらもこれらを消化してから有料問題集に入ることで、単語と単語がリンクしていくのを感じて理解を深めることに繋がったと思います。
もちろん、可能であれば実際にスキルを作成してシミュレーターで試すことをガッツリやったりスキルを公開して修正するフローを経験するほうがより良いのは間違いありません。

# 受験者に向けたアドバイス
- スキルを作る、試す、公開するといった一連の開発フローは必ず理解しなければならない
- LambdaとAlexaを連携する場合の手順やトラブルシューティングを覚えよう
- jsonを読みとく能力が必要になる
- 標準組み込みインテントをどうやって拡張するかを考える
- セッションコントロールやデータの永続性をどう確保するべきか、アーキテクチャを学ぶ
- スキルの目的に応じて遵守されるべきポリシーがあるので間違えないこと
- スキルの命名規則や専門用語を正しく覚える

# まとめ
これでAWS資格はコンプリートとなりました、年内にこの目標を達成することができて一安心です。
次の資格は来年のうちにSAPの更新が控えているのと、Kubernetesの上位資格である「[CKS(Certified Kubernetes Security Specialist)](https://training.linuxfoundation.org/certification/certified-kubernetes-security-specialist/?utm_source=cncf&utm_medium=blog&utm_campaign=cks0720)」の取得に注力しようと思います。

AWSの進化は早く、資格を持っていても「特定分野のベストプラクティスを理解した」という証明にしかならないため、学習して得た内容を言語化して業務知識へと昇格できるよう引き続き頑張りたいと思います。
laravel6 tinkerを使ってHTMLメールの送信を確認する

# 目的

- laravelのtinkerからHTMLの送信を行う方法をまとめる。

# 前提情報

- gmailを使ったlaravelアプリからのメール送信は下記を参考にメールサーバの設定を実施する。
- 紹介する内容を実施するとメールサーバの設定がされているとメールが送信されるので注意する。

# 詳細

1. laravelアプリ名ディレクトリで下記コマンドを実行してtinkerを開く。

    ```terminal
    $ php artisan tinker
    ```
1. 下記を実行してメールを送信する。

    ```php
    Mail::send([], [], function($message) {$message->to('a@example.com')->subject('Test')->setBody("<h1>mail content</h1>", 'text/html');});
    ```
1. 下記に実行したPHPのソースのメールに関係ある部分を日本語にして記載する。

    ```php
    Mail::send([], [], function($message) {$message->to('送信先アドレス')->subject('メールの件名')->setBody("HTMLのタグを含むメール本文", 'text/html');});
    ```
SwitchBot 温湿度計をenebular-agentに繋ぐ（その１）

enebular-agentは、Gatewayとしての役割を持ちます。直接、Webに繋がらないデバイスを中継して、IoTシステムを構築することができます。
Bluetooth接続のセンサーをenebular-agentがインストールされているRaspberry Piに繋げて、センサーの値をWebにアップロードするデバイスを作ってみたいと思います。
Bluetooth接続のセンサーはさまざまな種類がありますが、今回はとても安価な[SwitchBot 温湿度計](https://www.switchbot.jp/meter)を使います。Amazonで2000円ほどで購入できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/eefc3e4f-f16d-236c-aec2-d5ab7050bc96.png)

# 使用するもの
* Raspberry Pi 3B+
    * microSDカード（[Raspbian Buster base](downloads.raspberrypi.org/raspbian/images/raspbian-2019-09-30/) + [enebular-agent v2.15.2](https://docs.enebular.com/ja/Releases/enebular-agent/2.15.2.html) ）
        * enebular-agentのインストール方法は[enebular-agentのドキュメント](https://docs.enebular.com/ja/EnebularAgent/Installation.html)を参照ください
        * [こちら](https://qiita.com/jksoft/items/8974bbecf578239bb76f)も参考に
    * 電源
* [SwitchBot 温湿度計](https://www.switchbot.jp/meter)



# SwitchBot 温湿度計
なぜ、このセンサーを選んだかと言いますと安価ということもありますが、Bluetooth（BLE）の通信仕様がオフィシャルで公開されています。

https://github.com/OpenWonderLabs/python-host/wiki/Meter-BLE-open-API#New_Broadcast_Message

そのため、通信仕様を調べる必要はありません。

単体で調べる方法もありますが手間がかかるため、SwitchBotのスマホアプリに接続して、事前にBLEの固有アドレスを調べてます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/1ad73820-9d01-537a-88df-763741ac9f3c.png)

# 事前準備
センサーとBluetooth通信する部分はPythonのbluepyを使いました。それを事前にインストールします。
通信を簡単にするため、毎回Scanする様にします。bluepyでScanを使用するにはルート権限が必要なため、ルートでbluepyをインストールします。

```
> sudo pip3 install bluepy
```

pythonのプログラムは引数でBLEの固有アドレスを指定し、標準出力でJSON型の温度、湿度を出力するようにしました。このプログラムをexecノードで呼び出し、結果を取ります。

```sensor.py
import sys
import binascii
from bluepy.btle import Scanner, DefaultDelegate

macaddr = ''

class ScanDelegate( DefaultDelegate ):
  def __init__( self ):
    DefaultDelegate.__init__( self )

  def handleDiscovery( self, dev, isNewDev, isNewData ):
    if dev.addr == macaddr:
      data = dev.getScanData()
      for item in data:
        if(item[0] == 22):
          bytedata = binascii.unhexlify( item[2] )
          flag = bytedata[6] & 0x80
          temperature = ( bytedata[6] & 0x7F ) + ( bytedata[5] & 0x0F ) / 10
          if not flag:
            temperature = -temperature
          humidity = bytedata[7] & 0x7F
          print( '{ "temperature": ' + str( temperature ) + ', "humidity": ' + str( humidity ) + ' }' )
          exit()

macaddr = sys.argv[1]
scanner = Scanner().withDelegate( ScanDelegate() )
scanner.scan( 0 )
```

# フローの準備
単純にinjectノードで、定期的に呼び出し、debugノードでセンサーの値を確認します。直接、確認するためenebular-agentはenebular editorからリモートモードで接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/85982158-72c5-340f-c7b2-e844a3659fe6.png)

execノードの設定は以下のようになってます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/f07f46e4-8b90-34c0-8225-07eabd769ffb.png)

# 動作確認
簡単に温度・湿度がjson型で取得できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/20f01213-1728-5be4-d321-037b705fa536.png)

# 次回
次はセンサーの値をWebにアップロードしてグラフ化・・というのはありきたりなので、アップロードして、何かと連動させてみたいと思います。
俺式 docker-compose チートシート

### 起動時
0. docker-for-macアイコンをクリック

1. コンテナの立ち上げ (-d: バックグラウンドで立ち上げる)
    -  docker-compose.ymlがある階層に移動する<br />
`docker-compose up  -d `

2. コンテナ内に入る 
```docker-compose exec `service名前` /bin/bash````

```:例
docker-compose exec web /bin/bash
```

---
#### 終了時

1. service内から抜ける
`exit`

2. 終了するservice(コンテナ)を見極めるために現在起動しているserviceを確認する。
`docker ps `

3. service(コンテナ)を止める（=終了する) *vagrantで例えると`vagrant halt`

```docker stop `CONTAINER ID` ```

```:例
docker stop 5efheiwoe
```

#付録
a. 作成した全てのコンテナを確認する
` docker ps -a `

- 不要になったコンテナを削除する ```docker rm -f `CONTAINER ID` ```

b. 作成した全てのimageを確認する
`docker images`

- 不要になったイメージを削除する ```docker rmi -f `IMAGE ID` ```


### rails new 
1. `rails new フォルダ名 --database=postgresql`
2. database.ymlの編集

```:config/database.yml
   default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5
```

3. `rails db:create`

 ---- 作業開始！！！！　----
備忘録(Ruby:基礎文法:繰り返し処理)

### timesメソッド
指定した回数だけ繰り返し処理を行えるメソッド


```ruby
数値.times do
  # 繰り返す処理
end
```

### ブロック変数
メソッドの中だけで使用できる変数、||で囲う
timesメソッドのブロック変数には、繰り返し処理が1回実行されるごとに、0から1ずつ増加する数値が代入される

```ruby
数値.times do |ブロック変数|
  # 繰り返す処理（0から始まるブロック変数が使える）
end
```

例:

```ruby
10.times do |i|
  puts i + 1
end
# 0から始まるブロック変数に1ずつ足していく処理
```

### eachメソッド
配列の一つ一つに対して配列の要素の数だけ繰り返し処理が行えるメソッド
ブロックを置くことで、そのブロック変数には配列の要素が入る

```ruby
配列.each do |item|
  # 処理
end
#eachに続けてdo~endの間に繰り返したい処理を記述する
```

例:

```ruby
colors = ["あか", "あお", "きいろ"]
colors.each do |color|
  puts "色: #{color}"
end
```

出力:

```bash
% ruby loop.rb
色: あか
色: あお
色: きいろ
```
離島でリモートワーク

伊豆大島で一週間ほどワーケーションしてきたのでレポートです。
（会社では許可されていないので、正確には有給使って個人開発一人合宿です）
![IMG_20201217_132226.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244191/dbac4096-4faf-9593-c92d-3ea62f3b09f5.jpeg)

#### 今回利用したプラン
[伊豆大島でリモートワーク](https://www.tokaikisen.co.jp/wordpress/wp-content/uploads/2020/09/acbdc791bafed228a76dd06402dc24cb.pdf)
7泊8日2食付き船代込でGoTo利用して32,500円に8000円分クーポン還元という割安プランです。
一人部屋追加料金が無いのもポイント。
残念ながら10月上旬頃に完売しており、支払いは振込限定なので各種割引は使えず。
部屋はこんな感じで、建物は古いけど落ち着いたいいところでした。
![IMG_20201214_162154.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244191/e289b7ec-f900-c5b5-d74e-2be4a87729dc.jpeg)


#### 作業に集中できるか
私は自室より図書館やコワーキングスペースのほうが集中できて好みなのですが、
そういった場所と同程度には集中できました。

#### 注意点
##### ネット回線が貧弱
たまに繋がらなくなることがありましたが、2つあるホテルのSSIDを切り替えれば全く繋がらない時間というのはなかったです。
ただし速度的にはあまり早くありませんし、オンラインミーティングやリモートペアプロだと支障をきたすかもしれません。
ホテル内であれば基本的に携帯の電波は問題無かったので、テザリングにするのもありだと思いますが、
離島ならではの問題として島内の電波が悪いところだとDoCoMo回線ですらアンテナが立たないところがありました。

##### 食事のバリエーションが貧弱
基本的には毎食魚がでますが、個人的には美味しくいただけました。
ただし、ホテル内のレストランは1つなので、後半は味付けに飽きていました。
昼食に関しても数キロ県内には店は一切無いので、前日におにぎりや弁当を頼むか、インスタントで済ませるか、
遥々食べに行くかとなります。

##### 部屋が寒い
広縁で作業しようと思ったら暖房ガンガン入れても寒かったです。
フロントに連絡して毛布を借りて、丸まって作業してました。

#### 気分転換できるか
ワーケーションの醍醐味といえば観光や食事ですが、
温泉と天体観測以外はちょっとした気分転換に何か、というのは難しいです。
街灯も無いため、特に日没後は絶望的になります。
デメリットでもありますが、作業に強制的に集中させられる、という意味ではアリかもしれません。
日中にガッツリ観光するつもりなら登山や釣りやダイビングなどいろいろあるようです。
私は1週間のうち2日のみ観光しました。
![IMG_20201217_133203.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244191/3f07b590-b41b-7bb6-b415-8e40c4460c4d.jpeg)

#### まとめ
1週間程度であれば作業効率は悪くなかったですし、
温泉好きとしてはいい気分転換になりました。

ただ、主に食事のバリエーションの関係でそれ以上の期間となると個人的には厳しいです。
また、今回は遭遇しませんでしたが、忘れ物や機器の故障などあってもすぐに対応するのは難しいでしょうし、
ワーケーションが初めてということならもう少し利便性が高いところをおすすめします。

#### おまけ
ご飯美味しかったです。べっこう寿司がなかったのが残念。
![lunch1.jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244191/f55aa39e-cbb2-f3db-eb20-834a3a81fb82.jpeg)
![lunch2.jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244191/06fff75d-3eb1-198f-7ddd-352d67d4f177.jpeg)
![lunch3.jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244191/e5645857-1656-f50f-1e44-26ca70bf44dd.jpeg)
【Java】現在日時の取得と表示形式の指定方法

# 現在日時を取得し表示形式を指定する(LocalDateTime クラス)

`LocalDateTimeクラス`は現在日時を取得し表示形式を指定するクラスです。
タイムゾーンのない日付/時間を扱います。
`DateTimeFormatterクラス`を使うと、取得した日時を指定した表示形式に整形することが出来ます。

①の処理では`DateTimeFormatterクラス`の`ofPatternメソッド`で表示形式を指定しています。
②の処理では`DateTimeFormatterクラス`の`formatメソッド`で設定しています。

```java
public class Sample {
	public static void main(String[] args) {
        
        // 現在日時を取得
		LocalDateTime nowDate = LocalDateTime.now();
		System.out.println(nowDate); //2020-12-20T13:32:48.293

        // 表示形式を指定
		DateTimeFormatter dtf1 =
			DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS"); // ①
		String formatNowDate = dtf1.format(nowDate); // ②
		System.out.println(formatNowDate); // 2020/12/20 13:32:48.293

        // 表示形式を指定
		DateTimeFormatter dtf2 =
		  DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH時mm分ss秒 E曜日");
		String formatNowDate = dtf2.format(nowDate);
		System.out.println(formatNowDate); // 2020年12月20日 13時32分48秒 日曜日

        // 表示形式を指定
		DateTimeFormatter dtf3 =
			DateTimeFormatter.ofPattern("yyyyMMddHHmm");
				String formatNowDate = dtf3.format(nowDate);
				System.out.println(formatNowDate); // 202012201332
 	}
}
```

# 現在日時を取得し表示形式を指定する(Date クラス)

`Dateクラス`は Unix時間(1970年1月1日 0時0分0秒からの経過時間)をベースにしている、日付と時間を扱うクラスです。
`SimpleDateFormatクラス`は取得した日時を指定した表示形式に整形することが可能です。

```java
public class Test1 {
	public static void main(String[] args) {

		// 現在日時を取得
		Date nowDate = new Date();
		System.out.println(nowDate); //Sun Dec 20 13:56:23 JST 2020

		// 表示形式を指定
		SimpleDateFormat sdf1
		= new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
		String formatNowDate = sdf1.format(nowDate);
		System.out.println(formatNowDate); // 2020/12/20 13:56:23.372

		// 表示形式を指定
		SimpleDateFormat sdf2
		= new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒");
		String formatNowDate = sdf2.format(nowDate);
		System.out.println(formatNowDate); // 2020年12月20日 13時56分23秒
 	}
}
```

# 参照
[Java Date and Time](https://www.w3schools.com/java/java_date.asp)
wsl2になってコマンドの補完が重いと感じたらwindows側のPATHを消して必要なものだけシンボリックリンクを貼ろう

# そもそもなぜ重いのか？

私はこういう理由が一つあると考えます。

1. wsl側からwindows側のファイルを見るのに9pを使っている。
2. 9pは遅い
3. Shellは補完をする時、実行権限のあるファイルを検索している。
4. wsl側から見たwindows側のファイルはファイルシステムの違いから777に設定されている。
5. よって、shellは遅い9pを使いながら、毎回dllなどの実行できないファイルまでも検索してくる。

よって、重い！！

wsl1ではwindows側のファイルは直接触れていて、9pを通していなかったので軽かったのだと考えられます。

# ではどうすればよいのか？

検索するファイルを最小限にすれば良い。

# やり方

windows側のPATHを消す

```rego:/etc/wsl.conf
[interop]
appendWindowsPath = false
```

適当なPATHの通っているディレクトリーにwindows側のシンボリックリンクを貼る。

```bash:bash
# 適当なディレクトリを作成してパスを通した。
mkdir windows_commands
export PATH = $PATH:$HOME/windows_commands
cd ~/windows_commands

# シンボリックリンクを貼っていく
ln -s "/mnt/c/Users/morihaya/AppData/Local/Programs/Microsoft VS Code/bin/code"
# wsl側からdocker を使うなら必要
ln -s "/mnt/c/Program Files/Docker/Docker/resources/bin/docker-credential-desktop.exe"
ln -s "/mnt/c/Program Files/Mozilla Firefox/firefox.exe"
                             ︙
```

終わり
GoのBRMS（Grule）でビジネスロジックを管理する

この記事は、[株式会社アトラエ アドベントカレンダー](https://qiita.com/advent-calendar/2020/atrae)21日目の記事です。

# BRMS
ビジネスルールをアプリケーションと切り離して管理するためのもので、業務要件やビジネスの制約をルールとして定義してアプリケーションで実行することができます。

# BRMSを調査した背景
レガシーなサービスの大規模なリファクタを行っているのですが、その時に頭を悩ます問題なのが、 **何に使われているデータなのか分からない** ものと遭遇することです。
**状態を表すカラムが存在し、さらにパッと見同じようなカラムが複数存在したり、抽象的な名前だったり**で、コードを読みながら挙動を確認して理解するという調査の過程が作業時間のほとんどを占めています。
データの構造を理解した上でリファクタと同時にテストコードを書いていますが、進めるに連れて**過去にリファクタした機能のビジネスルールが記憶から薄れて**いきました。
**ビジネスルールをテストコードで確認する**のはいささか辛いなと思い（ドキュメントにまとめてないのがいけないのですが。。。）、BRMSを用いてビジネスルールをまとめつつリファクタできないかと調査することにしました。

# [Grule](https://github.com/hyperjumptech/grule-rule-engine)の使い方

Articleに `is_open` と `status` というデータがある場合の例、、、
## Ruleを定義する
`salience` は優先度を定義しています。複数ある場合値が大きい方が優先されます。

`article.grl`

```dsl
rule CheckActive "Check Active" salience 100 {
    when
        A.IsOpen && A.Status ==  1
    then
        A.IsActive = true
}
```

公開状態を表す値として `isActive` を用意しています。

```golang
import (
	"fmt"
	"github.com/hyperjumptech/grule-rule-engine/ast"
	"github.com/hyperjumptech/grule-rule-engine/builder"
	"github.com/hyperjumptech/grule-rule-engine/engine"
	"github.com/hyperjumptech/grule-rule-engine/pkg"
)

func main() {
	lib := ast.NewKnowledgeLibrary()
	rb := builder.NewRuleBuilder(lib)
	err := rb.BuildRuleFromResource("ArticleRule", "1.0", pkg.NewFileResource("path/to/article.grl"))
	e := engine.NewGruleEngine()
	knowledgeBase := lib.NewKnowledgeBaseInstance("ArticleRule", "1.0")
	err = e.Execute(dataCtx, knowledgeBase)

	if err != nil {
		log.Printf("error: %v", err)
		return
	}

    a := models.Article{
		IsOpen: true,
		Status: 0,
	}
	dataCtx := ast.NewDataContext()
	err = dataCtx.Add("A", a)
	if err != nil {
		log.Printf("error: %v", err)
		return
	}

	fmt.Printf("isActive: %v", a.IsActive)
    // isActive: true
}
```

まだプロダクションに載せていませんが、仕様を理解しながらルールをまとめてドキュメントとしても活用できないか模索したいと思います。
エディタでnlコマンドを代替する

nlコマンドを用いずにテキストに行番号をつける方法をまとめます。あまり細かい挙動にはこだわりません。今回はエディタ編です。


# SED

非対話エディタの定番ですがStreamEDitorを利用した方法です。

## `=`と`paste`

```console
$ yes | head | sed = | paste - -
1	y
2	y
3	y
4	y
5	y
6	y
7	y
8	y
9	y
10	y
```

行番号と行テキストの間にタブが入るだけなので、書式は`ln`に近いですね。`sed`は`=`で行番号が出力できるのですが、改行されてしまいますので`paste`で横に並べています。

```console
$ yes | head -n 2 | sed = 
1
y
2
y
```



# Vim

代表的なテキストエディタ、Vimです。これも非対話に実行することができます。

## `:set number`
```console
$ yes | head | vim -es /dev/stdin +':set number' +%p +q!
      1 y
      2 y
      3 y
      4 y
      5 y
      6 y
      7 y
      8 y
      9 y
     10 y
```

書式は`rn`です。Vimは`-e`でexモードで実行、`-s`はサイレントモードというオプションらしいです。`/dev/stdin`は`-`で置き換え可能ですが余計なメッセージが出ます。やっていることは、行番号を表示`:set number`して、出力`%p`して閉じる`q!`だけですね。

```console
$ yes | head | vim - -es  +':set number' +%p +q!
Vim: 標準入力から読込中...
      1 y
      2 y
      3 y
      4 y
      5 y
      6 y
      7 y
      8 y
      9 y
     10 y
```

詳しくはこちら「[【なにそれこわい】Vimシェル芸というvimshellとは異なる何かが誕生した模様](https://togetter.com/li/1080646)」を読んでみてください。よくわかりません。

---

この他にも[シェル芸bot](https://twitter.com/minyoruminyon)などでおもしろい方法を見つけたら追記していこうと思います。
nginxでBasic認証を設定する

#概要

Webアプリ開発のための環境構築を以下の環境で行っています。
・OS：CentOS
・アプリケーションサーバ：django
・Nginx：Webサーバ
・データベース：MySQL

誰でもアクセスできる状態はまずいな、ということでBasic認証をかけていきます。
参考にさせていただいた記事は以下です。
https://qiita.com/You_name_is_YU/items/e8db11eaa10067556e52

#Basic認証とは
Web上で利用できる認証システムです。
Basic認証が設定されているページへ行くと、IDとパスワードが求められるポップアップが現れます。

##セキュリティレベル
「.htaccess」というものを利用して設定する、非常に簡単な認証機能です。
そのため、セキュリティレベルは低いです。
あくまでも、取り急ぎ行う認証であることは把握しておきましょう。

#Basic認証の設定

##nginxコンテナにアクセス
まず、Docker内のnginxコンテナに入ります。
以下のコマンドで入ることができます。

```
# docker-compose exec {コンテナ名} {コマンド}
```

コンテナ名はdocker-compose.ymlで確認できます。
自分の場合は以下です。

```
# docker-compose exec nginx bash
```

##Badic認証の設定
本題のBasic認証の設定を行っていきます。
Basic認証を設定するためには、htpasswdコマンドを実行し、.htpasswdファイルを作成します。
そこでまず、コマンドをインストールします。

```
# yum -y install httpd-tools
```

```
bash: yum: command not found
```

Oh...yumが入っていない。
そうですね、コンテナ内ではyumがインストールされていませんでした。

一方でaptが使えました。
この辺はRedhut系なのかなど、環境によりけりですね。

```
# apt -v
apt 1.4.8 (amd64)
```

とりあえずupdateをかけます。

```
# apt update
```

aptでもパッケージのインストールはできますが、yumの方がいい場合は以下で行けます。

```
# apt install yum
```

#Basic認証の準備

```
# apt install apache2-utils
```

```
# htpasswd -c /etc/nginx/.htpasswd [username]
```

```
# vim /etc/nginx/nginx.conf
```

以下を追記しました。

```
location / {
        auth_basic "Restricted";                   # 認証時に表示されるメッセージ
        auth_basic_user_file /etc/nginx/.htpasswd; # .htpasswdファイルのパス
    }
```

nginxを再起動して。

```
# service nginx restart
```

webページにアクセスすると、basic認証が確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764778/78798627-4c66-4f5e-7fb1-2fb5642ba061.png)









#参照記事
* Basic認証とは：https://www.shadan-kun.com/blog/measure/461/
* Basic認証の設定：https://qiita.com/You_name_is_YU/items/e8db11eaa10067556e52
アジャイル開発手法という言葉をこの世から消したい...

## アジャイルを開発手法だと勘違いしている人、結構多くない??

最近、色々なところで`アジャイル開発手法`というワードよく耳にします。
私はこのワードて毎回「あれっ?」と思ってしまうんです。

アジャイルって開発手法なんだっけと...

## アジャイル開発

簡単に言うと

- 素早い、機敏である
- 小さいサイクルで開発工程を繰り返す

で、「アジャイルソフトウェア開発宣言」の

```
私たちは、ソフトウェア開発の実践

あるいは実践を手助けをする活動を通じて、

よりよい開発方法を見つけだそうとしている。

この活動を通して、私たちは以下の価値に至った。

プロセスやツールよりも個人と対話を、

包括的なドキュメントよりも動くソフトウェアを、

契約交渉よりも顧客との協調を、

計画に従うことよりも変化への対応を、

価値とする。すなわち、左記のことがらに価値があることを

認めながらも、私たちは右記のことがらにより価値をおく。

引用: アジャイルソフトウェア開発宣言
```

という考え方(思想)を定義してあるだけで、
開発手法ではないと思うんですよね...

## スクラムやSAFeが開発手法に該当する気がする

スクラムやSAFeはよくフレームワークと言う名で紹介されます。
フレームワークは「枠組み」、「骨組み」、「構造」という意味です。
これがまさに開発手法に該当するのではないでしょうか。

## なぜアジャイル開発手法と記述してしまうのか
### 1. アジャイルとスクラムがイコールだと勘違いしている

アジャイル型開発のなかで一番メジャーであるスクラム開発は、エンジニアであれば聞いたことがあると思います。しかし、経験者でなければどんなものかイメージしにくいはずです。

その状態でアジャイル開発、スクラム開発などのワードがでてきてしまうと、説明されても似たような内容だしどっちも一緒か！ってなる気がします。
(私はスクラム開発経験するまではこんな印象でした。)

結局は、アジャイルとスクラム開発をはっきり理解できていない人がまだまだ多いと言うことです...

### 2. アジャイルの思想とウォーターフォール型開発を比べがち

アジャイルの思想とウォータフォール開発の手法を比較している記事をちらほら見かけます。
比較するなら両方、手法でないとおかしいですよね。

アジャイル型開発手法には

- スクラム
- SAFe
- エクストリームプログラミング（XP）

のような手法がイメージされますが、
ウォータフォール型開発手法にはアジャイル型開発手法のようにはっきり名前が浮かぶ手法がでてこないと思うんです。
だから、みなさんウォータフォールといえば手法だと解釈するはずです。

その流れでアジャイルも手法だと解釈する人がいるのではないでしょうか...??


## 最後に伝えたいこと
- アジャイルは手法じゃなくて思想だよ
- アジャイルとスクラムは一緒じゃないよ
- アジャイル型開発手法はOK、アジャイル開発手法はNGだと私は思う
- 私はアジャイル開発ではなく、`アジャイルな開発`というワードを使うようにしています
Hello! After World!! 2D - (第0章)

この記事は[Elixir Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir)の21日目です。
昨日は @sanpo_shihoさんの[Phoenixにおける現代的なアーキテクチャを考える](https://sanposhiho.com/posts/phoenix-architecture-for-me/)でした。

# ・はじめに

[Hello After World!](https://qiita.com/GKBR/items/55849a43c2643be9bc72)でサーバサイドにelixirを使用したmmoを作成しました。
クライアントはwindows専用/3Dでしたが、これをブラウザ専用/2D(liveview)、サーバはphoenixで新規開発してみます！
まずは計画たててみます。


# ・計画
- 第0章　Hello! After World!! 2D 目次公開(2020/12/21公開)
- 第1章　スキル・道具/セーブ機能の実装(2021/2/21公開予定)
- 第2章　パーティ機能の実装(2021/4/21予定)
- 第3章　ダンジョン機能の実装(2021/6/21予定)
- 第4章　ボス機能の実装(2021/8/21予定)
- 第5章　ジョブ機能の実装(2021/10/21予定)
- 最終章　ゲーム公開！(2021/12/21予定)

## ゲーム画面
開発中のゲーム画面です。
どこかで見たような。。

![map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256958/a6fcd629-5c0a-44c2-42a3-3a3791077fb7.png)

![battle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256958/32042fa3-bd3d-0649-93c9-0d5d0219157f.png)




# ・参考文献 
|書籍名|著者|出版年|
|:--|:--|:--|
|MMORPGゲームサーバープログラミング|ナム ジェウク|2005|
|オンラインゲームを支える技術　壮大なプレイ空間の舞台裏|中嶋 謙互|2011|
|プログラミングElixir|Dave Thomas|2016|


# ・開発環境
|PC|Mac Book Pro (Retina, 13-inch, Late 2013) |
|:--|:--|
|OS|Mojave|
|Memory|8GB|
|言語|elixir v1.10|
|FW|phoenix v1.5|


 
# ・まとめ 
- 今回はmmo.ex 2Dの開発予定を立てました。
- 2021年12月頃の公開予定を目標とします！ 
- お時間ありましたらテスト参加よろしくお願いします
ACPIの復習

今日は冬至です。寒い裏日本の町からの投稿です。

Windows 95の頃の電源制御はAPM(Advanced Power Management)という仕組みでしたが、Windows 98の頃からACPIという仕組みが利用されるようになりました。FreeBSDでも5くらいからACPIのサポートが入りました。

ACPIはBIOSの頃にできたものですが、現在のUEFIでも使われています。FreeBSDでACPIがサポートされているのはi386とamd64だけです。

ACPIはAdvanced Configuration and Power Interfaceの略称で、パワーマネージメントだけでなく、デバイスのコンフィグレーションの機能もあります。近年arm環境などで利用されているDTSに似ています。

しかしながらDTSはコンフィグレーションを取得して実際のコンフィグレーションはデバイスを直接叩くよう仕組みですがACPIはそれ自体にも設定機能があります。

電源周りについては、ACPIはノートパソコンのリジュームやハイバネーションまたパソコン一般の電源のOFF機能などに利用されます。

ACPIはOSが起動してマシンが保持しているAMLといわれるバイナリを取得して解釈して、それの方法に従って処理を行います。

FreeBSDではacpicaというintelが主導しているリファレンス実装をカーネルに入れて、FreeBSD固有の処理を行っています。

なぜACPIのことを調べていたかというと、FreeBSD/i386をインストールした、VALUESTARがWOLできないためです。AC電源入れたあとはWOLできるのですが、FreeBSDでpoweroffした後はWOLできません。ACPIまわりの問題のような気がしていますが、まだ解決できてません。

sys/dev/acpica/acpi.cのacpi_shutdown_final(void *arg, int howto)という関数があって、i386やamd64の場合最後の処理になるのではないかと思います。

2000年くらいには日本ではFreeBSDをノートパソコンで使うための環境の[PAO](http://www.jp.freebsd.org/PAO/index-j.html)がありました。結構利用されていた方も多かったのではないでしょうか。PAOは主にAPMとPCMCIAをカスタマイズしていました。当初のACPIサポートはノートパソコンが先行していて、PAOの流れだったのかFreeBSDのACPIサポートは日本の開発者の方々が主導していたようです。PAOのもう一つの機能のPCMCIA/CardBusのサポートはメインラインに取り入れられず、それにより日本ではFreeBSDの開発者のモチベーションが低下して、ユーザーが減っていく事になりました。

代わりに入ったPCMCIAサポートも13Rで消されてしまうようで、昔の事を思い出しました。

復習としたのは昔初代VAIO C1でFreeBSDを使っていて、この頃はいろいろAMLをいじっていたからでした。C1はACPI過渡期のWindows 98のマシンでAMLはぐちゃぐちゃでした。SONYがこんな製品作るんだとがっかりした記憶があります。

C1のようにACPIのサポートが不完全なものはFreeBSDではブラックリストでACPIが使われないようになっていました。このため修正したAMLをオーバーライトしていました。

https://docs.freebsd.org/doc/6.1-RELEASE/usr/share/doc/handbook/acpi-debug.html
Hello! After World!! Serverless - (第0章)


これは [fukuoka.ex Elixir／Phoenix Advent Calendar 2020](https://qiita.com/advent-calendar/2020/fukuokaex) の21日目です。
昨日は @kikuyuta さんの[組込みに欠かせない Elixir でのビットの扱い方](https://qiita.com/kikuyuta/items/e200a6208013f38333de)でした。
バイナリのパターンマッチめちゃくちゃ便利ですよね。mmo.exでも多用してます。

# ・はじめに

[Hello After World!](https://qiita.com/GKBR/items/55849a43c2643be9bc72)でサーバサイドにelixirを使用したmmoを作成しました。
クローズドテストを行った際、

- 複数台のサーバ管理
- 急激な負荷増加への対応
- ~~サーバ代~~ 

が今後の課題となりました。
これらを解決したい！
ならば流行りのサーバレスに挑戦してみよう！
まずは予定を立てることから始めてみます。


# ・サーバレス化計画
- 第0章　Hello! After World!! Serverless 目次公開(2020/12/21公開)
- 第1章　mmo.ex serverless 複数人で同時歩行(2021/2/21予定)
- 第2章　mmo.ex serverless 複数人で共闘戦闘(2021/4/21予定)
- 第3章　mmo.ex serverless ちょっと公開してみる(2021/6末or7末予定)


## mmo.ex ec2
現在のmmo.exの構成は下図のようになってます。（割愛部分あり)
実際の構成とは多少異なりますが、イメージとしてはこんな感じです。
いろいろめんどくさいです。。

![mmoex_ec2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256958/d5992d21-68e0-b6f9-e2d6-e7aa97690910.png)


## mmo.ex serverless(予定)
mmo.ex serverlessの構成(予定)です。
楽したいです。。
![mmoex_serverless.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256958/b4da3d49-47dc-eaca-0a69-0dd0cb3983bc.png)

# ・参考文献 
|書籍名|著者|出版年|
|:--|:--|:--|
|MMORPGゲームサーバープログラミング|ナム ジェウク|2005|
|オンラインゲームを支える技術　壮大なプレイ空間の舞台裏|中嶋 謙互|2011|
|プログラミングElixir|Dave Thomas|2016|


# ・開発環境

|PC|Mac Book Pro (Retina, 13-inch, Late 2013) |
|:--|:--|
|OS|Mojave|
|Memory|8GB|
|言語|elixir v1.10|

 
# ・まとめ 
- 今回はmmo.exのサーバレス化計画を立てました。
- 2021年6月頃の公開予定を目標とします！ 
- お時間ありましたらテスト参加よろしくお願いします
- ~~実装が間に合わいませんでした。ごめんなさい~~

明日は @im_miolabさんの記事です。お楽しみに！
プログラミング初学者がAidemyを受講した話

# はじめに
こんにちは！プログラミング初学者です。
Aidemyでの3ヶ月間の受講期間がそろそろ終了に近づいてきています。この3ヶ月間に勉強したことの総まとめとしてブログを記載させて頂こうと思います。

*初めてブログを書くので、多少読みにくさがあると思います。ご了承お願い致します。

# 本記事の概要
本記事は以下の方におススメです。

・これからAIを学んでみたい方
・AIを独学で学んでいるけど躓いてしまった方
・これからAidemyでの受講を考えている方

# なぜAIに興味を持ったのか
私がAIに興味を持ったきっかけは、オリエンタルラジオ 中田敦彦さんのYoutube大学での動画でした。動画を見たときに、メーカーで技術系の仕事をしていながら、AIに関して何も知らないな～と感じました。そこから、AIとは何なのかを詳しく知りたいと思うようになりました。

# Aidemyを受講しようとしたきっかけ
AIに関して調べてみて分かったことは、AIは基本的にはプログラミングで動いていて、PythonがAIの分野で最も活躍している言語ということでした。そこからPythonの学習を独学で進めていきました。主に行ったのは以下の3点です。

**・Progate**
プログラミング経験が0だったので、1からPythonの基礎を習得

**・Python3エンジニア認定基礎試験**
Progateでやったことを定着できればと思い取得

**・Python3エンジニア認定データ分析試験**
Numpy, Pandasなどのライブラリが学習できると思い取得

これらをやりきり、いよいよAIに本腰入れてやってみよう！！と思いました。しかしながら、

これから何をやったら良いのか分からない...


と何を参考にどう進めていけば良いのかが分からなくなってしまいました。そこで調べてみるとAidemyでプログラミングスクールがあることを知りました。色んなコースがある中で、画像を用いたAIができるようになったら、今後活かせそうだぞと思い、AIアプリ開発コースを受講することに決めました。

# Aidemyでの学習の振り返り
#### 学習スタンス
普段の仕事をやりながら、当然Aidemyでの学習も進めていかなければなりません。
私がこの3ヶ月間、徹底して行ってきたのは以下の3つになります。

**・ 超朝型の生活をする**
仕事が終わって疲れている状態で、Aidemyの学習を行っても疲れが勝って中々進まないのでは？と思いました。ですので、朝早く起き仕事前にAidemyでの学習を行うようにして、出来る限り勉強に集中できる環境を作るようにしていました。

**・分からない所は悩まずに質問をする**
Slackというチャットツールを用いてメッセージを送れば、分からないことを回答してもらえます。少し調べてみて分からなそうであれば、直ぐに質問をSlackに送って問題解決を行っていました。

**・ 有給を上手く活用する**
これは誰しもが実践できる訳ではないですが、有給を取得しやすい職場であったので、この3ヶ月間は有給を多めに貰っていました。

#### 作成したもの
写真からディズニーキャラクターを自動判別するWebアプリを作成しました！
Pythonの基礎を勉強していたこともあり、予定よりも早めにWebアプリ作成に取り掛かることができ、約2ヶ月で作成することができました！
取り組んでいて思ったのは、WebアプリフレームワークFalskの使い方を独学で学ぶのは恐らく厳しそうということでした。ですので、今回AIアプリ開発コースを受講して本当に良かったな～と思いました。

以下に作成したもののリンクを貼りますので、宜しかったらご覧下さい。

https://character-classifier.herokuapp.com/

# おわりに
今までプログラミングスクールに通ったこともなく、途中で挫折してしまうのではと思いましたが、Aidemy講師の方々のご支援の下、無事に成果物まで作成することができました。
この学習期間中に、学んでいく楽しさを感じることができ、これからも学び続けて行きたい！と思うようになりました。
初学者にとって、この記事が参考になると幸いです。初学者の方、一緒に頑張りましょう!
1on1の活用術

#はじめに

この記事は<a href="https://qiita.com/advent-calendar/2020/ateam-brides">Ateam Brides Inc. Advent Calendar 2020</a> 22日目の記事です。

私の職場では週１回チームのメンバーとの1on1を実施しています。
また、機会によっては違う部署の人との1on1や他子会社メンバーとの1on1などを行うこともあります。
私はチームメンバーと1on1する機会も上司と1on1する機会もあるので両方の立場から
効果的な1on1のやり方を考えてみたいと思います。

#1on1とは
主に上司と部下が1対1で１回30分話をすることで上司が部下の能力を引き出します。
1on1は上司による部下のための時間です。
特に決まった型などはないので色々なやり方があると思います。
![friends_hagemasu_businessman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210436/ff33497c-2643-b8b0-ef21-6b84b97f281d.png)
###目的
メンバーの成長をサポートすること。
・業務支援　
　業務で困ってることを確認し、サポートする。
・内省支援
　振り返りをして、考えを深めたり気づきを得られるようなサポートをする。
・精神支援　
　職場環境や人間関係で不安に感じてること、仕事だけでなくプライベートなことも含めて負荷軽減をサポートする。

#効果的な1on1とは
受ける側も聞く側も1on1をより良い場にする意識をもつことが一番重要だと思いますが、下記を意識するだけで1on1が有効な時間になるのではないでしょうか。

###受ける側（メンティー）
・事前にアジェンダを作成しておき、自分が何を話したいのか整理しておく。
・前回を振り返りテーマをピックアップしておく。
（1on1を行った後は振り返りをして改善点、次回までのアクション等をメモしておくと次回に活用できます。）
・テンションをちょっとだけ上げておく。

1on1は信頼関係の構築と自分を成長させる場だと認識しておこう。
振り返りをしておくと次のアクションが決めやすいのでおすすめ。
自分の考えが足りていない部分や考え方のヒントがもらえる場だと思うと話の中からも色々な学びがあると思います。

###聞く側（メンター）
・相手の時間だということを意識し、相手の話を傾聴する。
・感謝や期待を伝える。
・ティーチング、コーチング、フィードバックをうまく使い分ける。
・今後の取り組みなど決めたことをチャットワークなどで共有する。

私は結構自分が話してしまいがちになることが多いので、聞く側に徹することを意識しています。
また、考え方やきっかけを与えられる場にしていきたい。
![shinsyakaijin_couple2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210436/16b2b7c3-f8b9-1222-5881-5d3a200ae339.png)


#おわりに
コミュニケーションが苦手なエンジニアはこの機会を活用しない手はないですね。
リモートワークが増えて来た今だからこそ1on1を有効的に使ってコミュニケーションを
積極的に取れる場として活用できればと思います。
私自身もできているところできていないところ、まだまだありますが改善を続け
1on1が有意義な時間になるように継続していこうと思います。


明日はDXマスターのMAB_exが面白い記事を書いてくれるので、乞うご期待！！
#lesson 6 tableau public で100万行以上（エクセルでは無理）のオープンデータを公開 折れ線グラフを、輸出輸入に分ける

# 税関別データの年別の合計金額の折れ線グラフを輸出輸入にわけます。

**マークという機能をつかいます。輸出入(exp_imp)をマークにもってきて、輸出、輸入の折れ線を違う色にします**


## 使うデータ
[kaggle](https://www.kaggle.com/zanjibar/japantradestat) にあります。ダウンロードには、kaggle のアカウントが必要です。

- custom_y_hs2_from_1998.csv(93.49 MB)


## 説明動画は、[これ](https://youtu.be/1JKY6tazkqE)　

- マークにカテゴリをもっていて、折れ線をカテゴリごとに色づける方法
「カタログ」、開発者提案書と普通に言ったほうが世の役に立つ説

[エンジニア提案をしよう](https://qiita.com/k-sekido/items/5e5f1f12c79f8eb3ebb8)
[指示をするなら”得たい結果”を指示する](https://note.com/shion_coach/n/n0ed5e7d29b13) 

という記事を最近読んだ。またそれがきっかけで[外資ITトップセールスが考えた提案書テンプレートを配布します!!](https://note.com/dj141/n/nea644010328f)という記事を見つけた。

で、自分は経験上「[カタログ](https://type.jp/et/feature/165/)」というものを書いてきたのだが、それについて考えたもの。時間があれば以下から読んでもらうとわかりやすい。あるいは「カタログ」にピンとこない人は[これ](https://type.jp/et/feature/165/)、あるいはこの[カタログレビュー](https://www.career.works-hi.co.jp/career/engineer/product_development_member)というプロセスを見てほしい。

## それは「開発者による提案書」
まず結論。「[カタログ](https://type.jp/et/feature/165/)」を叩き込まれてきたが。

開発者が書く「[カタログ](https://type.jp/et/feature/165/)」という言葉、知らない人にはなんのこっちゃであるうえ仕様書とも設計書とも違う「電化製品のカタログのようなものですよ」とか旧来説明されてきたのだが、十分な説明はそれだけでは難しいと思っている。というか客観的に考えてちょっと言葉のチョイスがおかしい。

冒頭の記事を読み、それって、そういやこういうこと言っていたのではなかったか？と、もう一度言語化したくなった。以下私の理解を書く。



## それはこういうものだった
### 機能の「メリット」を書く
「メリット」あるいは「デメリット」という考え。これは[辞書的に引用すれば](https://qiita.com/k-sekido/items/5e5f1f12c79f8eb3ebb8#sier%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E6%8F%90%E6%A1%88) 

>ITストラテジスト試験では、顧客企業の競合優位性の確保など経営課題を定義し、その経営課題に対してITを活用したビジネスモデルを考え、そのビジネスモデルがユーザーにどのような価値を届けることによって事業として成り立つのかを考える観点を学ぶことができます。

の「ユーザーにどのような価値を届ける」のか、というのがわかりやすい。

### 「なぜ」それが必要なのか書く

理由を書く。背景を書く。例えば「ボタンが正面に1つだけあります」ではなくて、老若男女どのような誰でもそのボタンを押せばスタートとなるホームポジションに「安全に」「迷わずに」戻ることが出来ます、などという感じ。お気づきだと思うがこれはiphoneを例えば説明しようとする場合。

### 「理想」を書く
>ネイティブアプリのページであれば、わざわざAppleのロゴを出す必要はないと思います。ただ、Webサイトを考えたときに何のサイトを見ているかの情報をなくすことはできないので、その解決策としてスクロールしない限りは上に隠れるという考え方

冒頭の記事で引用されていたAppleの製品ページに関する話。
例えば「〇〇ができます」ではなく、「どうして」それができるのか。それができると何が嬉しいのか。IT界の有名な風刺画に「[顧客が本当に必要だったもの](https://www.casleyconsulting.co.jp/blog/engineer/4334/)」があるがそのギャップを埋めようとしたツールこのカタログだったのだと自分は理解していて。つまり**開発者だからこそ書ける技術的リアリティと顧客への嗅覚** への落とし所がその肝だったと思っている。

では逆に？

## それはこういうものではなかった
### ボタンの上の文言の説明ではない
「読込」ボタンをつけるとなったときに、ただ「これを押すと読み込むことが出来ます」というのはカタログではない。ボタンを押すと写真が取れます、というのもカタログではない。

### 「CSVが出せます」ではない
「CSVファイルが出力出来ます」というのはカタログではない。よく言うドリルの穴とドリルの話。CSVを出したいのではなく、外部システムと連携したい、ということを書くのが「カタログ」。

### そして無責任な空想ではない
ええと、本題。**開発者が地に足のついた技術的リアリティを持って、顧客に提案する資料。**
本来、それをいつお客様に届けるか、どういった価値を届けるかという文書だった「カタログ」。それは無責任に夢だけ描いた怪文書ではなく、定量的な価値判断や市場、価格動向すら理解して、実現のための道を示すものだったと思っている。

## 結論：開発者だから書けるリアリティを持った「提案書」

[指示をするなら”得たい結果”を指示する](https://note.com/shion_coach/n/n0ed5e7d29b13)。得たい結果というよりは「理由」を先に説明しろってことだよな、と思った。調査でdumpファイル下さい！って言ったら標準出力、エラー出力のログくらいはセットで下さいって思うけれど、でも、それが伝わる人はよほど慣れている人で普通はdumpファイルしかくれない。

だから、「◯月◯日◯時◯分に何がアプリケーションサーバで起こったかを確認したいです」からの、「なので、〇〇ログ下さい、それがあれば把握できます」。というか視点が離れがちな相手ほどこれを意識したほうが良い。ってこれ、本来こういうときすら「カタログ」がそのプロトコルだ。

でネットを漁っていたらそんな概念、既にある。[例えばこういうテンプレート](https://note.com/dj141/n/nea644010328f)。妥当な表現が本当は「開発者提案書」って感じじゃないだろうか。
**開発者が地に足のついた技術的リアリティを持って、実現の道筋を顧客に提案する資料。**
とは、[外資ITトップセールスが考えた提案書テンプレートを配布します!!](https://note.com/dj141/n/nea644010328f) 仰っていることがほぼそれである。

つまり「カタログ」というやつ、カタログっていう呼び方がミスリーディングだしましてや神格化の必要は全く無いし、このおかげで新人さんへの教育コスト無駄上がりするし、ま、控えめに言ってイケてないかもね～と思った話でした。一般的な用語、**「提案書」**等にでも置き換えて定義し直して、良いところ見直して書籍化でもしたほうがメソッドとしてもう一発売れるとおもう、良い考え方だと思うのである。

### 他所参考

https://qiita.com/hiyasichuka/items/ba44688ec34b41c72c98

以上なにがしか、有用になればさいわいです。
Storyboardを使わずにカウントアプリを作ってみる


iPhoneアプリをSwiftで開発している人は必ずStoryboardを使ったことがあると思います。
Storyboardを使わずにUIを構築する方法を知っておくと、色んな場面(ユーザーの操作に合わせてUIを追加したい時など)で役に立つので、本記事ではStoryboardを使わずにカウントアプリを実装して、Storyboardを使った開発との違いを示したいと思います。

# 対象読者
- iPhoneアプリ開発初心者〜ちょっと慣れてきた人
- Storyboardを使ったアプリ開発に慣れてきて、コードだけでUIを構築してみたい人
- Storyboardなんてboredだぜ！って人 (は？)

# バージョン
Swift 5.3
Xcode 12.2
iOS 14.2

# 実装
一旦実装です

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
	let countLabel: UILabel = UILabel()
	let plusButton: UIButton = UIButton()
	var count: Int = 0
	
	override func viewDidLoad() {
		super.viewDidLoad()
		// ラベルの位置を指定
		countLabel.frame.size = CGSize(width: 100, height: 50)
		countLabel.center = CGPoint(x: view.frame.width / 2 , y: 250)
		// ラベルの文字を中央揃えに
		countLabel.textAlignment = .center
		// フォントを設定
		countLabel.font = UIFont(name: "HiraginoSans-W6", size: 32)
		// ラベルに文字を設定
		countLabel.text = String(count)
		// viewにラベルを追加
		view.addSubview(countLabel)
		
		plusButton.frame = CGRect(x: view.frame.width / 2, y: 300, width: 150, height: 50)
		plusButton.center = view.center
		plusButton.titleLabel?.textAlignment = .center
		plusButton.titleLabel?.font = UIFont(name: "HiraginoSans-W6", size: 32)
		// 背景色を設定
		plusButton.backgroundColor = UIColor.systemOrange
		// ボタンを角丸に
		plusButton.layer.cornerRadius = 10
		// ボタンの文字を設定
		plusButton.setTitle("+1", for: .normal)
		// 文字の色を設定
		plusButton.setTitleColor(UIColor.white, for: .normal)
		// ボタンが押された時に発火するイベントを設定
		plusButton.addTarget(nil, action: #selector(plus), for: .touchUpInside)
		view.addSubview(plusButton)
		
	}
	
	@objc func plus() {
		count += 1
		countLabel.text = String(count)
	}
	
}
```

# 解説
Storyboardを使った実装との違いを軸に解説していきたいと思います。

## UIの配置
Storyboardを使ったUIはドラッグ＆ドロップで配置できましたが、コードで実装する場合、主に`frame`というものを設定する必要があります。
frameとはCGRect型のUIViewクラスのプロパティで、親要素からみたUIView自身の位置を指定するときに使います。
例えば、今回はカウントアプリのボタンはframeプロパティを使って、x,y,width,heightを指定しています。

```swift
plusButton.frame = CGRect(x: view.frame.width / 2, y: 300, width: 150, height: 50)
```

また、frameでは大きさだけを指定して、UIViewが持つ`center`というプロパティからUIの位置を指定することも可能です。
`center`はUIViewの中心をどの位置に配置するかを指定するプロパティです。今回の例ではラベルを`frame`と`center`を用いて指定しています。
親要素の中心に配置したいときに便利です。

```swift
countLabel.frame.size = CGSize(width: 100, height: 50)
countLabel.center = CGPoint(x: view.frame.width / 2 , y: 250)
```
そして、最後に`addSubView(_ view:)`でUIを配置します。これはviewのsubviewを追加したい時の関数です。
今回でいうとviewはUIViewControllerが持っている`view`というプロパティ、subviewは`UIButton`や`UILabel`に当たります。

```swift
view.addSubview(countLabel)
view.addSubview(plusButton)
```

## イベントの登録
Storyboardを使う方法ではドラッグ＆ドロップで関数とボタンを関連付けとボタンがどのように操作(Touch up Insideなど)されたら関数が起動するかを設定していました。
コードで実装する場合は`addTarget(_:action:for)`を使って関数とボタンの関連付けをします。

```swift
plusButton.addTarget(nil, action: #selector(plus), for: .touchUpInside)
```

# 終わりに
意外とやってみると簡単だと感じた方が多いんではないかと思います。
Web系の言語から入った自分としてはこっちのほうが性に合ってる気がします🤔

# 参考文献
- [frame | Apple Developer Documentation](https://developer.apple.com/documentation/uikit/uiview/1622621-frame)
- [addSubview(_:) | Apple Developer Documentation](https://developer.apple.com/documentation/uikit/uiview/1622616-addsubview)
Amazon Detective が気になるので調べてみた 

[Amazon AI by ナレコム アドベントカレンダー 2020](https://qiita.com/advent-calendar/2020/knowcom-amazonai)の21日目の記事です。

初めまして、josonです
Amazon Detectiveがすごく良いと見かけ、気になったので調べました。

# Amazon Detectiveとは
セキュリティデータの分析、視覚化を行い潜在的なセキュリティ問題の根本原因を迅速に特定する。
リソースからログデータを自動収集し、機械学習・統計分析・グラフ理論を使用し可視化します。
セキュリティインシデントへの迅速な対応が可能となる。

これを実施するためには、下記の懸念点が挙げられます。

- 高度なセキュリティ人材
- 対策コスト
- データノイズ
- 複雑性
etc

上記懸念点や仕組みづくりの問題点を Amazon Detective ならば解決できます。

# フロー
![nist_csf_detective_after-960x461.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940736/1c1fb63b-024f-734d-8f72-36e837ed3f9d.png)

#特徴

- ログの自動収集　
- 分析の自動化
- インタラクティブな視覚化

# Detectiveの処理の流れ
リソースから自動収集　→　集約とグラフモデル変換　→　データ分析　→　視覚化

CloudTrail VPCFlowlogs GuardDuty から自動で収集してくれます。

# ユースケース
- 脅威検出結果の分析
アラートの正常な検出 or 誤った検出かを素早く分析することが可能。
誤った検出の場合は、調査を実施しない。
判断ができない場合は、優先順位から調査へ

- 影響範囲の特定
インシデントの根本原因、被害の影響の特定。
関連リソースや他のデータの相関調査も可能。

- 侵害痕跡の調査
内外の侵害痕跡を元にした、影響調査。

# 料金
Amazon Detectiveに取り込まれたデータの量に基づき発生。
一度取り込んだデータに課金はない。
１年間のデータ保持期間。
最初の30日間無料 → ここでコストを計っておく


東京リージョン　
最初の 1,000 GB/アカウント/リージョン/月	2.70USD/GB
次の 4,000 GB/アカウント/リージョン/月	1.35USD/GB
次の 5,000 GB/アカウント/リージョン/月	0.68USD/GB
10,000 GB 以上/アカウント/リージョン/月	0.34USD/GB

# Amazon Detective の有効化
前提として、GuardDutyを有効にしておかなければなりません。（有効化に48時間必要）
推奨設定として、検出結果のエクスポート時間を15分に変更。
Amazon Detective の有効化には24時間かかります。
データ収集とグラフモデルへの変換が行われます。

#まとめ
料金も安く、自動でセキュリティインシデント調査の仕組みが作れるのはすごく魅力的です。
実際に動かして見たかったのですが、時間がなかったため断念。BlackBeltでデモが見れます。
サービスが増えていく中で、すぐに取り入れることができて有用性の高いものがあるので情報収集を怠ってはいけませんね。

#参考文献
https://aws.amazon.com/jp/blogs/news/webinar-bb-amazon-detective-2020/
https://aws.amazon.com/jp/detective/
Pythonの自作クラスに対して、object['key']でデータにアクセスする方法

表題の実装方法ですが、パッと思い浮かぶでしょうか？
そもそも何に使うのか、と疑問に思われるかもしれませんが
私の場合は、Pandasと全く同じIFでデータが操作出来るカラム志向のライブラリを
自作してみようとした時にこの問題にぶつかりました。

```python

# この(↓)データアクセスをどう実装すれば良いのだろう？
df['column_name']
```

表題のような実装方法は、公開ライブラリなどを作る際に求められる知識だと思うのですが
個人的にとても印象深かったので、今回記事を投稿させて頂きました。

※本記事の動作検証には、Pythonのバージョン3.7.3を使用しています。

---

object['key']の形で自作クラスからデータを取得するには、\_\_getitem\_\_という特殊メソッドを定義する必要があります。

```python

class SampleClass:
    
    def __init__(self):
        self.dict = {'key': 'keyが取得出来ました。'}
        
    def __getitem__(self, key):
        
        if not isinstance(key, str):
            raise Exception()
                
        return self.dict.get(key)
```

上記のサンプルコードでは、SampleClassがフィールドに辞書型のデータ(self.dict)を持っており、SampleClass['key']を実行した時に\_\_getitem\_\_が呼び出されて、辞書型のデータ内でkeyというキー名とペアになっているデータを取り出す動きになります。

```python:実行例

sample = SampleClass()
print(sample['key'])
```

---

逆に、自作クラスに対してobject['key']の形でデータを追加する時の動作を定義するには、\_\_setitem\_\_という特殊メソッドを使います。

```python

class SampleClass:
    
    def __init__(self):
        self.dict = {}
        
    def __setitem__(self, key, value):
        
        if not isinstance(key, str):
            raise Exception()
                
        self.dict[key] = value
```

上記のサンプルコードでは、SampleClass['key']に対する代入処理を実行した時に、\_\_setitem\_\_が呼び出されて、SampleClassに定義されている辞書型のデータ(self.dict)に指定したキーと値のペアを登録する動きになります。

```python:実行例

sample = SampleClass()
sample['key'] = 'keyが取得出来ました。'
```

---

このように、特殊メソッドを用いる事で自作のクラスに様々な振る舞いを与える事が可能になります。他にも、例えば+演算子を使った時の挙動を定義したい場合は\_\_add\_\_メソッドを使う事で実現出来ます。

```python

class SampleClass:
    
    def __init__(self, in_list):
        self.list = in_list
        
    def __add__(self, other):
        
        if not isinstance(other, SampleClass):
            raise Exception()
                
        return SampleClass([*self.list, *other.list])
```

上記のサンプルコードでは、2つのSampleClassのインスタンスを足した時に(+演算子で処理した時に)、\_\_add\_\_が呼び出されて、2つのインスタンスのリスト(self.list)を結合した新しいSampleClassのインスタンスを生成する動きになります。

```python:実行例

sample1 = SampleClass(['1', '2', '3'])
sample2 = SampleClass(['4', '5'])
sample3 = sample1 + sample2
```

---

異なる型のインスタンスの足し算を考慮する必要がある場合には、\_\_add\_\_メソッドに加えて\_\_radd\_\_メソッドを定義する必要があります。
(+演算子から見て前方のクラスに\_\_add\_\_メソッドが定義されていない場合に後方のクラスの\_\_radd\_\_メソッドが動作します。)

```python

class SampleClass:
    
    def __init__(self, in_list):
        self.list = in_list
        
    def __radd__(self, other):
        
        if not isinstance(other, str):
            raise Exception()
                
        return SampleClass([*self.list, other])
```

上記のサンプルコードは、自作のクラス(SampleClass)が+演算子の後方にある場合に期待する挙動を\_\_radd\_\_メソッドに定義しています。

```python:実行例

sample = SampleClass(['1', '2', '3'])
sample2 = '4' + sample
```

---

後、個人的に便利だと感じたのは\_\_repr\_\_メソッドです。
これはインスタンスがprint関数などで呼び出された時に表示する文字列を定義するメソッドで
これを定義しておくと、(おそらく誰にでも経験がある)以下のような表示を回避する事が出来ます。

```cronsole
<__main__.SampleClass object at 0x7f3d06feb3c9>
```


```python

class SampleClass:
    
    def __init__(self):
        self.list = ['1', '2', '3']
        
    def __repr__(self):
        return '{}'.format(vars(self))
```

```python:実行例

sample = SampleClass()
print(sample)
```

---
Emacs 詩

複雑な二人を追っかけてもやもやする。

Emacs とvim 。

ときどきおんなじひとにみえて、間違えて声かけちゃうけど、なにゆってんのよって相手にしてもらえなくって、とりつくろって C-x g 。

:set number

C-x g
C-x g

M-x
あ、ごめん
Del del C.. - x g

きみだれだっけ、コロンじゃない
M - x linum-mode

垂直分割じゃ見えない違い。

Evil な。

どっちかわからない。

Ctrl z

:diffthis
z-index の最大値を 530000 にしたい

## 宇宙最強の z-index

突然ですが「いかなる時も最前面に表示したい」そんなレイヤーがあった時 z-index をいくつに設定しますか？
私は迷うことなく 530000 とします。
なぜかというと「宇宙最強の数字」だと（勝手に）思うからです。

```css
z-index: 530000;
```

どうですか。
なんとなく、これを超えちゃいけない感が伝わってきます。

## 2147483647

調べたところ「ブラウザが認識できる z-index の最大値は 2147483647」っていう記事が散見されます。

```css
z-index: 2147483647;
```

声に出すと「にじゅういち億よんせんななひゃくよんじゅうはち万さんぜんろっぴゃくよんじゅうなな」なんですが、桁が大きすぎるうえに直感的に最大値って伝わってきません。
それにブラウザの実装次第では、さらに大きい数字が使えるようになるかもしれません。

```css
z-index: 530000; 
```

やはりこちらの方がしっくりきます。

```css
z-index: 530000; /* もちろんフルパワーで
あなたと戦う気はありませんからご心配なく… */
```

コメント付けてもいいかもしれません。

## 最強を超える……

外部ライブラリによっては 530000 を超えてくる事があります。
そんな時はこんなコメントにするといいと思います。

```css
z-index: 530000; /* 初めてですよ…ここまで私をコケにしたおバカさん達は… */
```

規格外に大きな z-index は、劇場版やパラレルワールドのものと思って目をつぶりましょう。

## 覚悟はよろしいですね

あなたも z-index の最大値を 530000 に（勝手に）しませんか？
Udemyで躓かないReact入門

こんにちは、本記事は[あなたの学びをシェア！2020年までにUdemyで学んだこと02](https://qiita.com/advent-calendar/2020/udemy02)の21日目の記事です。

~~アプリ作成は間に合いませんでした。。。すみません！！~~

# 今回受講した講座

今回受講した講座はこちらです。
・[モダンJavaSciptの基礎から始める挫折しないためのReact入門](https://www.udemy.com/share/103FxlBEIccF9bQ3o=/)

## この講座の対象者（コースより抜粋）
- Reactを習得したい人
- Reactの学習を１度挫折した人
- 近代JavaScriptを学びつつフレームワークやライブラリも習得したい人
- モダンフロントエンドも知っておきたいサーバーサイドエンジニア

# コースの紹介

アロー関数式などの最近のJavaScriptの記法をおさらいした後に、TODOアプリを生のJSで作成。さらに、その後ReactでそのTODOアプリを書き直すという流れになっています。

# 受講してよかったポイント

端的に上げると下記の３つです。

- ボリューム(6H)
- 「React」に導入するための必要最低限のコンテンツ
- 生JSとの対比


## ボリュームについて

Udemyの講座は定期的なセールでボリュームの多い講座も、そうでない講座も同じ価格になります。
ここで「同じ価格ならボリューム多いほうがお得！」と変な関西人根性を発揮してしまいがちです。
ただ、夏休みの宿題同様に学ぶ内容が多すぎると途中でダレがちになり、しまいには積んでしまいます。 ~~(n敗)~~
講座の時間は6Hですが、実質コードを書いているのは５時間ほどなので本気を出せば土日で終わるボリューム感がちょうどいいと思います。

## 「React」に導入するための必要最低限のコンテンツ

ずぶの素人から、モダンなJSライブラリ・フレームワークに入門するとなったときに最初に立ちはだかるのが環境構築の壁です。
各ライブラリのアップデートが非常に早く、ウェブで検索してもなかなか初心者では正しい情報を見極めることが難しいと感じました。

この講座では、そういった環境構築で躓くことを避けるため、[Codesandbox](https://codesandbox.io/?from-app=1)上で演習を進めています。
Reactの本質的ではないところで躓くことを避けられる点も非常に良いと感じました。


## 生JSとの対比

この講座受講前にReactとVueに手を付けてはいましたが、Vueには馴染めたもののReactの理解度は遅々として進んでいませんでした。
この動画を見て振り返ると、これは私の生JSに対する理解度のなさが問題でした。

生のJSで簡単なアプリ作成を通して、記述の大変さ・状態を扱う難しさなどを実感し、
またReactの良さ（記述がすっきりする・状態が簡単に管理できる）を知ることができました。


# 最後に

Reactの入門で躓いている方、基礎が足りていないと感じている方はぜひ受講してみてはいかがでしょうか？
Mapbox-GL.js用に用意したglyphのpbfを活用出来ないか調べている話 Part1

こちらはMIERUNEアドベントカレンダーの12月20日分の記事です
当初は１記事で完結させるつもりだったのですが、解決しなかったので、２部以上に分かれます

## 概要
Mapbox-GL.jsで文字を表示させるためにフォントデータをpbf（Protocol Buffers）に変換して使うのですが
そのpbfを活用出来たら色々便利なのでは。。。ということで、まずはブラウザで読み込んでみようと思いました
ちなみに、glyph pbfは以下のツールで作れます
https://github.com/openmaptiles/genfontgl

## まずはProtocol Buffersのスキーマ定義を調べる
最初、Mapboxのソースコードを追いかけていたのですが、ありました
https://github.com/mapbox/glyph-pbf-composite/blob/master/proto/glyphs.proto

Mapboxはこのスキーマ定義に沿ってJavascriptにてパースを行っておりましたが、今回はこのprotoファイルを利用しました

protobuf.jsを利用します
https://github.com/protobufjs/protobuf.js
まずはこの定義ファイルをglyphs.protoとして設置して、protobuf.jsでloadします

``` javascript
protobuf.load("glyphs.proto", function(err, root) {
    // 定義を取得
    const glyph = root.lookupType("llmr.glyphs.glyphs");

}
```

## pbfファイルを取得して、デコードする
pbfファイルを取得して、定義を利用してデコードします

``` javascript
protobuf.load("glyphs.proto", function(err, root) {
    // 定義を取得
    const glyph = root.lookupType("llmr.glyphs.glyphs");

    load("ココに読み込みたいpbfファイルを設定").then(val => {
        // ArrayBufferから変換
        const buf = new Uint8Array(val)
        // 定義でデコード
        const message = glyph.decode(buf)
        const obj = glyph.toObject(message)
        console.log(obj);
    });

}
```

## gryphのpbfの内容が見れた
ここまでで以下の内容を取得できます

``` javascript
stacks:[
    glyphs:[
        {
            advance: 6
            bitmap: [
                // BufferArray
                ]
            height: 17
            id: 33
            left: 1
            top: -5
            width: 4
        }
        ... //省略
    ],
    name:"フォントの名前",
    range:"0-255"
]
```

ここで、私はbitmap取れたから表示出来るのでは…と思い、取れたBitmapと思われるBufferArrayをBlobにして、createImageBitmapを利用して画像表示を試みましたが、エラーになりました

ということで、Part2へ続きます
https://qiita.com/northprint/items/949ac1f7dcfbf73dd85f
"sudo apt update"が出来ないときの解決方法

# はじめに
![raspi01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/963393/11ab825c-6d56-c1b3-8ec7-0b429063773e.jpeg)
こんな感じでエラーが出るときの解決法。
（追記）そもそもインターネット接続が出来ていないみたい。その解決法。

参考サイト:
https://qiita.com/TakSus/items/e0b9da1415382514a67b
https://www.1ft-seabass.jp/memo/2015/05/15/raspberry-pi-dhclient-refresh-wlan/

# 解決方法
IPアドレスを振りなおす。
`sudo dhclient wlan0` で次のような結果になるまで繰り返す。
![raspi02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/963393/e54bcf25-e196-21f7-3448-787234c6b737.jpeg)

# まとめ
VNC接続出来ているのに、インターネットに接続できないときには
この方法を試してみると良い。
進化し続けるJPHACKS【参加レポート】

# はじめに
本記事はJPHACKS 2019とJPHACKS 2020で大きく変わった「審査」についてのレポートです。審査については思い出深いことがあったので、それに焦点を当てています。ここでいう「審査」はJPHACKS賞についてです。企業賞は含みません。
JPHACKSについては[JPHACKS HP](https://jphacks.com/)を参照してください。
なお私はJPHACKS 2018、JPHACKS 2019、JPHACKS 2020と3回出場し、すべてAward Dayに参加することができました。

# 不満が残ったJPHACKS 2019
JPHACKS 2019のJPHACKS賞に関する変更点はほとんどなかったのですが、「Best Hack Award」という賞が部門分けされ、「**ハードウェア部門・ソフトウェア部門**」の最大2チームが受賞することになっていました（JPHACKS 2018は1チームだけ選出）。詳しくは[JPHACKS 2019 のJPHACKS賞について](https://jphacks.github.io/2019-guideline/jphacks-awards/)を参照してください。

「Best Audience Award」や「Best Hack Award」といったJPHACKS賞はAward Day（全国大会）に進んだチームから選出されます。
そしてAward Dayの結果発表。なんと「Best Hack Award」に選ばれたのは2チームとも**ソフトウェアのチームでした**。自分のチームのプロダクトがハードウェアだったこともあるのですが、他のハードウェアのチームも素晴らしいプロダクトだったので「なんで…どうして…」という気持ちでいっぱいでした。
大会後どうしても納得できなかったので、運営の方（確かまっくすさん）に思いを伝えました。運営の方が「**これは審査委員長と直接話したほうが良い**」ということで審査委員長と話すことになりました。審査委員長には以下のことを伝えました。

* 元々アナウンスしていたことは大会が終了するまで守って欲しいこと(今回はハードウェア部門があったのにそれを事前にアナウンスせずなくした)。
* わざわざハードウェア部門をなくしてまでソフトウェアの作品を2つ選出した理由が不明瞭であったこと（審査の不透明性があった）。

審査委員長は私の言葉に耳を傾け「来年は改善できるようにします」と約束してくださいました。

# そしてJPHACKS 2020
Kickoff Dayで説明されたJPHACKS賞の内容から改善がなされていました。審査委員特別賞を除く全ての賞が**完全点数制になっていました**。説明されていた方の言葉の選び方も非常に慎重で、どこまでもフェアにジャッジするという運営側の意志がひしひしと伝わってきました。JPHACKS賞の詳細は[JPHACKS 2020 のJPHACKS賞について](https://jphacks.github.io/2020-guideline/jphacks-awards/)を参照してください。

JPHACKS賞の発表は第5位から点数のランキングで発表されました。これは今年はじめての試みで、自分のチームがどの位置にいるのか、あとどれくらいで届いたのかを客観的に捉えられたり、審査の透明性を担保できたりしてすごく画期的だと思いました。

# JPHACKS 2020を終えて
私のチームはInnovator認定だけとなりましたが、非常に達成感がありました。審査方法が明確で納得できる結果だったからです。しかしながら、どの賞にもTOP5に入れなかったことは非常に悔しいです。来年リベンジできるものならしたい！（悲しいことに来年からは社会人）

個人的に今年新設された「Best Team Collaboration Award」はとても良い賞だと思いました。この賞はチーム開発力や開発ツールを利用する力を点数化し、順位を決めるものです（[Best Team Collaboration Awardについて](https://jphacks.github.io/2020-guideline/team-collaboration-award/)や[まっくすさんの記事](https://blog.maximum80.me/entry/best-team-collaboration)で詳しく述べられています）。今までのJPHACKSには直接技術で競う賞がなかった（他の賞はアイディアやビジョンも審査対象）ので、来年以降も継続されてほしいです。これも最終的に評価項目が開示されて、透明性がバツグンでした。

2020年はコロナの影響で大会が縮小されるのかと思いましたが、そんなことは全くなく**JPHACKSはさらに進化していました**。

# さいごに
長々と書いてきましたが、一言で表すと「**JPHACKS最高！！**」です。
学生（参加者）の意見をここまで**反映してくれるイベントはそうそうない**と思います(今回の一件も参加者から多数の意見があったらしい)。「学生でハッカソンに参加したことないけど参加してみたい！」という方は**JPHACKをオススメします**。必ず良い経験が積めることでしょう！

私は3年間JPHACKにお世話になりました。来年からは社会人のため今年で引退です。運営の方々、審査員の方々本当にありがとうございました！
来年以降、なんらかの形でJPHACKの運営に携われる機会があれば参加したいと考えています。

最後はいつもので締めたいと思います。**「ジェーピー」じゃなくて「ジャパン」！**
Power BI Desktopの開発でPower Query処理負荷が高く、レポートの動作が重い場合の対処方法

## 概要
Power BI DesktopにてPower Queryで負荷が高くなるような開発を実施したところ、データの読み込みも実施できないほど重くなった場合の対処法の１つを紹介します。

Power BIでは、データの前処理の実装を補助するための機能として、バックグラウンドでデータ プレビューのダウンロードを実施するようで、Power Queryでけっこうな作りこみを実施した場合に、"Microsoft Mashup Evaluation Container"というプロセスがPCの多くのリソースを利用されてしまう事象に遭遇しました。

サイズが大きなPowre BI データセットを開発する際には、"バックグラウンド データ"機能をオフにすることを検討してもいいかもしれません。

## 事象
Power BI Desktopにてレポートを表示したところ、"Microsoft Mashup Evaluation Container"というプロセスが多数起動しており、CPUへの負荷が高くなっておりました。新規データ取り込みに時間がかかり、ファイルを開くたびにPCが重くなり困っておりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/88beee20-a2df-5d3f-4f39-ec5f8772ad4c.png)


## 解決策
"ファイル" -> "オプションと設定" -> "オプション"を選択後、"現在のファイル"における"バックグラウンド データ"のチェックを外してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/559c00d5-0f95-866f-dbc9-048ae382c2ec.png)

## 参考リンク

- [Solved: Microsoft Mashup Evaluation Container is killing m... - Microsoft Power BI Community](https://community.powerbi.com/t5/Desktop/Microsoft-Mashup-Evaluation-Container-is-killing-my-box-PowerBI/td-p/120441)
- [Power Query のバックグラウンド更新を無効にする](https://docs.microsoft.com/ja-jp/power-bi/guidance/power-query-background-refresh)
    - 推奨はオンですが本記事での事象と結びつく以下のような記載から注意は必要です。

> ただし、Power BI Desktop ファイルに多数のクエリが含まれている場合、プレビュー データを取得して保存すると、更新の完了にかかる時間が長くなる可能性があります。