OmniAICreator/Qiita-1.07M huggingface dataset:
SOKOBOT をプログラマとして楽しむ3つの方法

[SOKOBOT](https://store.steampowered.com/app/1714050/SOKOBOT/) というパズルゲームに最近ハマってます。簡単なコマンドの組み合わせでパズルを解くゲームです。プログラマとして楽しめることが分かったので楽しみ方を共有します。
この記事ではゲームのステージ攻略法や解法の説明はしません。どうしても攻略法を知りたい方は攻略サイトを見てください。

＊筆者の進行時点までの情報です。ゲームの進行状況やゲームのアップデートによって数値が変化する可能性があります。詳しくは公式サイトやゲーム自体で確認してください。

## ゲームの概要

ロボットを操作してスタート(緑)のマスにある荷物をゴール(赤)のマスへ「正しい状態」で10回置ければステージクリアです。ロボットは事前に入力したコマンド群に従って動作します。実際にロボットを動作させて確認することができます。失敗によるペナルティはないので何度もコマンドを実行して意図したとおりに動作するかを確認して進めていきます。
10回ゴールしなければならないのでコマンドの繰り返し(ループ)を自然に学ぶことができ、初学者向けのプログラミング教育にもなりそうです。

### コマンド

ロボットは1ステップごとに1コマンドを実行できます。すべてのロボットでステップは同期します。
ロボット1台につき36コマンドまで入力できます。ロボットは同時に5台まで使うことができます。
6種類のコマンドがあります。もしコマンドが意図したとおりに実行できない状況ではそのコマンドは実行されずに次のコマンドに進みます。

- 待機する: 1ステップの間その場で待機します。
- 1マス進む: 指定した上下左右のどちらかに進みます。壁や他のロボットがいる方向などには進めません。
- 向きを変える: 向いている方向から指定した方(左回転か右回転)に90度向きを変えます。
- 荷物を持つ/置く: 正面に荷物がある場合に荷物を持つか置くかします。荷物を持っているかどうかで挙動が変わります。
- スリープする: スリープ状態になりそれ以降のコマンドが実行されなくなります。次のロボット起動コマンドが他のロボットから実行されると1ステップ後からコマンドが再開されます。
- 他のロボットを起動する: スリープ状態の他のロボットを起動します。全部のロボットを起動するコマンドと、近く(自分を中心とした5x5マス)のロボットを起動するコマンドの2種類があります。

荷物を移動するのに必ずしも持ち上げる必要はありません。複数の荷物を同時に移動することもできます。
ステージごとに存在するギミックなどはここでは解説しません。自分で操作して攻略法を見つけ出してください。

## プログラマ的楽しみ方

ゲームのステージをクリアするたびに新しく別のステージが選べるようになっていきます。
このゲームには単純にステージをクリアするだけではなくステージごとにスコアのランキングを上げるという楽しみ方があります。

### スコア

現時点では次の3つのスコアがあります。

1. SOKOBOTS
1. コマンド数
1. ステップ数

スコアの種類ごとにランキングの「TOP1」、「TOP10」、「自分のスコア」が表示されます。
自分のスコアをすべて TOP1 に近づけるのがランキングの楽しみ方です。

### スコアごとの楽しみ方

スコアごとにステージの解法が異なります。スコアの種類ごとに楽しみ方が違うので、すでにクリアしたステージでもそれぞれのスコアが上がるように「NEW FILE」で遊んで見てください。

#### SOKOBOTS

1つ目の「SOKOBOTS」では使用したロボットの台数で少ないほどスコアが上がります。1台のロボットを可能な限り最小の動きで荷物を運ぶことが要求されます。ゲーム序盤のステージでは簡単ですが、後半になるにつれて少ない台数で運ぶのが難しくなります。

#### コマンド数

2つ目の「コマンド数」では入力したコマンドの数が少ないほどスコアが上がります。ロボットの台数は関係なくすべてのロボットのコマンドの合計数でスコアが評価されます。いわゆるコードゴルフのような楽しみ方ができます。無駄な動きがいかに多くてもコマンドを1つでも多く削る遊び方です。

#### ステップ数

3つ目の「ステップ数」では荷物を10回ゴールに運ぶまでにかかった時間、すなわちステップの数が短いほどスコアが上がります。スループットを上げたりレイテンシを下げたりする開発力を問われます。

### スコアを上げるためのファイル保存

これらの3つのスコアをすべて同時に上げることは困難ですが、同時にすべてのスコアを上げる必要はありません。
このゲームではステージごとに複数のファイルに解法を保存しておくことができます。
任意のセーブファイルでもっとも高いスコアが個別にランキングに反映されます。
つまりスコアの種類ごとに個別のファイルに全く別の解法を使うことでそれぞれのスコアでのランキング上位を目指せます。
苦労して TOP1 の解法を見つけたときが一番楽しいです。

## ゲームの不満点

次のような不満点は少しありますが、概ね楽しいゲームです。

- Undo がないので意図しない書き換えをした場合にすべてが壊れること
- "e" と "r" を打ち間違えやすいこと
- コマンドを範囲でコピペできないので基本的に全部書き直しになること
- デバッグポイントがないので特定のステップで止めるのが少し面倒なこと

もし解決方法があれば教えていただけるとうれしいです。

## まとめ

SOKOBOT というパズルゲームを紹介しました。プログラマ的にも楽しめたので連休の大部分が吸われました。超絶優秀なプログラマのみなさまにはぜひ TOP1 のスコアを塗り替えて SNS で自慢していただければ幸いです。
ポートはPCのどこにあるのかを整理しました

# 1. はじめに｜抱いた疑問
以前まで、私は「ポートは PC が外部システムと通信する際の接続口」といった理解をしていました。
　
しかし、アプリを作る中で、Localhost という PC 内部への接続が発生するので、理解に矛盾が生じました。
　
さまざまなWebサイトを探してみましたが、ポートの所在地について網羅されて説明されているサイトが見当たらなかったため、その調査結果を整理しました。

# 2. 対象読者
- 「ポートは PC と外部システムとの通信する際の接続口」と理解している人
- 「PC とネットワークの境界にポートが存在する」と考えている人
- Docker やインフラ管理などを行い、ポートの管理を行う人

# 3. 結論
__ポートは「OS・サーバと接続する際に使用されるOS・サーバの接続口」です。__
　　
私のアプリとポートの関係性を図解すると下記の通りとなります。
![Qiita図解｜ポート所在地.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675074/2690e537-7635-35d4-6925-13965f356a12.jpeg)



# 4. 【間違い】当初の理解
当初、私は「ポートは PC と外部システムとの通信する際の接続口」程度の理解だったため、絵にすると下記のように理解していました。
![Qiita図解｜ポート所在地 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675074/53589833-9581-a214-4416-6acb2cf267dc.jpeg)
そのため、MySQL をインストールすると、接続する際のイメージは下記の通りになります。



この絵を描いた際に、何かおかしいとを感じました。
おかしいと感じた点は下記です。
## 4-1. おかしいと考えた 2 つの点
### おかしい点①localhost ってインターネットに接続していなくても動くのに、この絵だとインターネット上に出て行っている
「ポートは外部システムとのやりとりをするための接続口」という理解をしていると、一度、通信が PC 外部に出ていく必要があります。
　
ただ、アプリを localhost で動かしてみるとわかる通り、ローカルサーバを利用する場合、インターネット接続をしていなくても、接続できるんですよね。。

だから、PC から外に矢印が伸びているのはおかしいと考えました。

### おかしい点②そもそもPCの境界って何？ハードウェアの境界ってPCケースじゃない？
「PC とネットワークの境界にポートが存在する」と考えていると、「境界って何ですか？」という質問に回答することができません。

普通に考えると、境界は PC ケースとなります。PC ケースが通信の接続口となるポートとなるわけがないからです。

## 4-2. 上記おかしい点が生む更なる疑問点→より細かい視点を持つ必要性
おかしい点①・②を見ると、PC 内部で接続が行われていると考えるのが順当です。
　
__そうすると、登場人物は、PC ではなく、PC の中の複数の何かであることがわかります。（登場人物は誰か）__
__そして、その登場人物たちがどのように接続しているかを明らかにするべきです。（登場人物の関係性）__
　
私はこの「登場人物は誰か」と「登場人物の関係性」についてを調べました。

# 5.現在の理解
私の現在の理解はこちらです。
- 登場人物は、「OS」と「サーバ」
- (プロトコル名)：//(ホスト名)：(ポート番号) の形で「接続先」を指定する
- 「接続元」のポート番号は自動的に決まる

絵にすると数の通りです。
![Qiita図解｜ポート所在地 (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675074/1bb91f79-8528-50b6-763d-33e235657d6e.jpeg)



## 5-1. 登場人物は、「OS」と「サーバ」
登場人物は、「OS」と「サーバ」です。OSはサーバから情報を受け取ったり、演算をしたりします。一方、サーバは情報を渡したり、受け取ったりします。
 
処理では接続してデータの受け渡しを行うわけですから、順当に考えると、この 2 人がポートを所持していると考えられます。

## 5-2. (プロトコル名)：//(ホスト名)：(ポート番号) の形で「接続先」を指定する
接続する際、「(プロトコル名)：//(ホスト名)：(ポート番号) 」の形で接続方法・場所を指定します。

## 5-3. 「接続元」のポート番号は自動的に決まる
http 通信で使用する 80 番ポートはあくまで「接続先」のポート番号です。そのため、接続元のポート番号ではありません。

__接続元のポートは、「エフェメラルポート」という用途が決まっていないポートから自動的に決められます。__

> この送信元ポート番号と宛先ポート番号はネットサーフィンをしたり、メールを受信したり、FTPでコンテンツをアップロード[ダウンロード] したり、つまりなんらかの通信が発生した時点で必ずセットされるもので、例えば、特定のWebページを閲覧した場合には送信元ポート番号に25456番がセットされ、宛先ポート番号に80番がセットされるようになります。この25456番という数字は常にこの番号を使用すると言うわけでもなく上記で述べたようにランダムな値がセットされるようになります。
> [ポート番号とは？｜Server Architecture for Windows](http://win.kororo.jp/archi/tcp_ip/port.php)


※ 逆に、用途が決まっているポート番号（例えば、http通信の 80 番ポート、SSH 通信の 22 番ポートなど）は「ウェルノウンポート」と言います。


## ※おまけ　私のアプリでの実例
私のアプリでは Docker を利用していますので、ポート番号の関係性は上記の通りとなる理解です。

![Qiita図解｜ポート所在地.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675074/2690e537-7635-35d4-6925-13965f356a12.jpeg)



# おわりに
最後までお読みいただきありがとうございました。

本記事は正確な内容となるように、可能な限り、調査・表現をしていますが、誤植などが含まれる可能性がございます。
もし、お気づきになられた場合には、ご指摘いただけますと幸いです。
rspecで該当部分のSQLのログをコンソールに出力する

# 背景
実際にどんなSQL出てるのか見たい。
ローカルで単発想定。

belongs_toのvalidationでSQL呼ばれてるとかに気付くことができる。

# 出力方法

```.rb
    # before
    # subject { described_class.start!(user_id: user.id) }

    # after
    subject do
      user_id = user.id
      using_sql_logger do
        described_class.start!(user_id:)
      end
    end
```

こう書き換えるとSQLが出力されるようにした。

# 準備

```spec/support/sql_logger.rb
# frozen_string_literal: true

module SqlLogger
  def using_sql_logger
    cached_logger = ActiveRecord::Base.logger
    ActiveRecord::Base.logger = Logger.new($stdout)
    yield
    ActiveRecord::Base.logger = cached_logger
  end
end
```

```spec/rails_helper.rb
...
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }

...

RSpec.configure do |config|
...
  config.include SqlLogger
end
```

# 課題

subjectをまるっとくくってしまうと、letの遅延評価で呼ばれるクエリも出力されてしまう。
それを回避するために事前にロードしておくようにしたりするのが手間

# 参考
https://qiita.com/Esfahan/items/456df708d364987734ef
Laravel Tailwind CSSが効かない

## Tailwind CSSが効かない時の対処法
LaravelでTailwindを使って開発をしているときになぜか変更しても色だけが反映されない事象が起きました。marginやpaddingなどは反映されていたのでなぜ色だけ？となりました。
キャッシュクリアをしてみたりスーパーリロードしてみたりしましたが変わらず、、
結構詰まってたのですが、コマンド一発で解決しました！
```
npm run dev
```
たったこれだけで解決しました！
Rails6+MySQL+DockerでHerokuへのデプロイ手順

**まずはHerokuのアカウントを作りましょう**
https://id.heroku.com/login

**Heroku CLIを入れる**
```
$ brew tap heroku/brew && brew install heroku
```

**Herokuがインストールできていることを確認**
```
$ heroku -v
heroku/7.56.1 darwin-x64 node-v12.21.0
```

**config/database.ymlを修正**
　productionの部分を修正

```config/database.yml
production:
  <<: *default
  host: <%= ENV['DB_HOSTNAME'] %>
  port: <%= ENV['DB_PORT'] %>
  username: <%= ENV['DB_USERNAME'] %>
  password: <%= ENV['DB_PASSWORD'] %>
  database: <%= ENV['DB_NAME'] %>
```

**heroku.ymlを作成**
　※Docker使用しない場合は作成しなくて良い

```heroku.yml
build:
  docker:
    web: Dockerfile
run:
  web: bundle exec puma -C config/puma.rb
```

**Herokuでアプリケーションを作成**
```
$ heroku create
```

**リモートに接続**
heroku git:remote -a <アプリ名>

**HerokuでMySQLを使用する際はcleardbに変更するため下記のコマンド**
```
$ heroku addons:create cleardb:ignite
```

**コンテナをherokuにデプロイ**
```
$ heroku stack:set container
```

## Herokuアプリの環境変数設定
まずは設定を確認
```
$ heroku config
=== <アプリの名前> Config Vars
CLEARDB_DATABASE_URL: mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
```

上記コマンドで表示されたそれぞれの値を変数に設定
```
$ heroku config:add DB_NAME='<データベース名>'
$ heroku config:add DB_USERNAME='<ユーザー名>'
$ heroku config:add DB_PASSWORD='<パスワード>'
$ heroku config:add DB_HOSTNAME='<ホスト名>'
$ heroku config:add DB_PORT='3306'
$ heroku config:add DATABASE_URL='mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true'
$ heroku config:add CLEARDB_DATABASE_URL='mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true'
```

もう一度設定を確認しましょう。下記のように表示されていたらOK
```
$ heroku config
=== <アプリの名前> Config Vars
CLEARDB_DATABASE_URL: mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
DATABASE_URL:         mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
DB_HOSTNAME:          <ホスト名>
DB_NAME:              <データベース名>
DB_PASSWORD:          <パスワード>
DB_PORT:              3306
DB_USERNAME:          <ユーザー名>
```

**Container Registryにログイン**
```
$ heroku container:login
```

**Container Registryにdocker imageをpush**
```
$ heroku container:push web
```

**HerokuにPush**
```
$ git push heroku main
```

**Herokuのmigrate:status確認**
```
$ heroku run rails db:migrate:status
```

**Herokuでmigrate**
```
$ heroku run rails db:migrate
```

**Webサイトを開く**
```
$ heroku open
```

**ご自身のアプリが表示されれば完了！**
[書評]New Relic実践入門 監視からオブザーバビリティへの変革

## この記事について
献本頂いた「[New Relic実践入門 監視からオブザーバビリティへの変革]("https://www.amazon.co.jp/-/en/松本-大樹/dp/4798166596/ref=sr_1_1?keywords=new+relic実践入門&qid=1651671454&sprefix=New+Relic%2Caps%2C165&sr=8-1&language=ja_JP")」の書評となります。
この記事では、本の内容、良かった点について記載したいと思います。

## 内容紹介
主に３部構成となっています。
- Part1: New Relicを知る
- Part2: New Relicを始める
- Part3: New Relicを活用する

### Part1: New Relicを知る
Part1では、Observabilityの説明とNew RelicというPlatformの紹介です。
New Relicの機能を活用するに辺り、Observabilityの考え方はとても重要になります。
また、New Relic Platformの全体像についても触れられており、New Relicを初める方は、まずこのPartから読むのが良いと思います。

### Part2: New Relicを始める
Part2では、New Relicの各機能の紹介です。
New Relicを知っていて、気になる機能があった場合には個別に読んでも良いと思います。
以下が紹介されている機能の一覧です。
1. New Relic APM
2. New Relic Infrastructure
3. New Relic Synthetics
4. New Relic Browser
5. New Relic Mobile
6. Serverless
7. Logs in Context
8. Distributed Tracing
9. New Relic Alerts
10. New Relic Applied Intelligence

### Part3: New Relicを活用する
Part3では、Observability 成熟モデルと、成熟モデルの各Level（Getting Started, Reactive, Proactive, Data Driven）におけるNew Relic機能の活用方法が紹介されています。
Observabilityの成熟モデルの考え方もNew Relicを活用するにあたって重要な概念となります。
また、このPartでは、いくつかのシーンでのNew Relicの活用方法と必要な機能のパターンについて記載されています。
New Relic知っているけど、上手く活用できていないという方には特に役に立つPartだと思います。
個人的には、Level3のData Drivenで紹介されている「ビジネスKPI計測パターン」、「カオスエンジニアリングとオブサーバビリティ」が興味深かったです。


## 本書のおすすめポイント
### 「なぜ」必要かも記載されている
New Relicを実践できることを目的とされた本で、内容のメインはNew Relicの機能紹介及び導入の方法となりますが、単純に機能の紹介だけでなく、「なぜ」その機能/アクションが必要で、どういうシーンで活用できるかを丁寧に書かれていた点が好印象でした。
たまに技術書を読んでいると、導入方法については詳しく記載されているが、なぜそれが必要かについては言及されていないため、現在自信が置かれている状況とマッチするイメージが持てず、結果導入しないみたいな経験がたまにあったのですが、各機能毎に「なぜ」が記載されており、導入/活用するモチベーションについても理解することができる点は良かったと思います。
> e.g. 5.4.1 外形監視が必要な理由 (P 114)
> アプリケーションやインフラストラクチャの監視だけではすべての問題を検知できるわけではありません。皆さんはCDN(Content Delivery Network)やDNS(Domain Name System)で障害が発生し、ユーザーがアプリケーションに到達できなくなった場合、その問題にどのように気づきますか？エンドユーザーからの問い合わせを待つのではなく、実際に外部から常時アクセスしてWebアプリケーションが正常にアクセスできているかを確認し続ける。それが外形監視の役割となります。

### 実際のシーンに併せた機能のHow toが記載されている
Part3のメインコンテンツがこれにあたります。
機能はわかったけど、実際の業務でどう組み合わせたりするのが良いかいまいちイメージできない場合でも、Part3を読むと理解が進みます。
例えば、03 Mobile Crash分析パターン (P 217)だと、
利用する機能は、以下の二つを使ったモニタリング方法について紹介されています。
- Dashboards
- New Relic Mobile

これらの機能を活用方法と実際のアウトプット例のキャプチャも紹介されているため、New Relicを使った活用が現在直面している課題についてマッチしているかよりイメージがし易くなると思います。

## まとめ
この記事では、「[New Relic実践入門 監視からオブザーバビリティへの変革]("https://www.amazon.co.jp/-/en/松本-大樹/dp/4798166596/ref=sr_1_1?keywords=new+relic実践入門&qid=1651671454&sprefix=New+Relic%2Caps%2C165&sr=8-1&language=ja_JP")」について紹介しました。
私の現在の職種としてはエンジニアというより、プロダクトマネージャーやプロジェクトマネージャーが当てはまります。
Observabilityをより推進していくにはエンジニアはもちろんのこと、プロダクトマネージャーやプロジェクトマネージャーなどシステム開発に携わるメンバーが理解していくことが重要だと考えているため、改めてNew Relicの活用方法について学ぶことができて良かったです。
現在New Relicを活用している方、今後導入を検討している方、両方におすすめの一冊だと思います。
Swift の for と forEach のスニペット

## for 基本

　`for-in` という書き方なので、ほぼ他の言語の `foreach` と同等。

```swift
for i in 0 ..< 5 {
    print(i) // 0 から 4 までを出力する
}
```

## BASIC の Step にあたるもの

```swift
for i in stride(from: 100, through: 200, by: 20) {
    print(i) // 100 から 120, 140 ... と、200 までを 20 ステップずつ出力する。
}

for i in stride(from: 100, to: 200, by: 20) {
    print(i) // 100 から 180 までを出力する。200 は含まない。
}
```

## 逆順

```swift
for i in (0...5).reversed() {
    print(i)
}

for i in stride(from: 5, through: 0, by: -1) {
    print(i)
}
```

## 値とインデックスを一緒に使いたい

```swift
for (i, value) in (1...5).enumerated() {
    print(i, value)
}
```

## フィルタ（for-in-where）

```swift
for i in 0...10 where (i % 2 == 0) { /* 注： where の括弧は不要 */
    print(i) // 偶数のみ出力
}
```

　その他のフィルタは次を参照：https://qiita.com/yoichitgy/items/ee5e865b8ab2a0d02fcc

## 辞書の走査

　ちなみに順序は保証されない。

```swift
let dict = ["Apple": 200, "Banana": 150, "Citrus": 300]
for (key, value) in dict {
    print(String(format: "フルーツの価格：%@ %i", key, value))
}
```

　C# のように順序を保証して欲しいときは以下。

```swift
let fruitPrices: KeyValuePairs = ["Apple": 200, "Banana": 150, "Citrus": 300]
for fruitPrice in fruitPrices {
    print(String(format: "フルーツの価格：%@ %i", fruitPrice.key, fruitPrice.value))
}
```

　`String` の `format:` は https://www.sejuku.net/blog/34872 を参照

## forEach

```swift
(1...5).forEach {
    print($0)
}
```

## forEach-filter

```swift
(0...10).filter { $0 % 2 == 0 }.forEach {
    print($0)
}
```

## 確認環境

```sh
Apple Swift version 5.3.2 (swiftlang-1200.0.45 clang-1200.0.32.28)
Target: x86_64-apple-darwin19.6.0
```
B - Guidebook AtCoder

## 問題
https://atcoder.jp/contests/abc128/tasks/abc128_b

## 回答

```Python
N = int(input())
list = []
for i in range(N):
    s,p=input().split()
    list.append([s, int(p)])

b = sorted(list, key=lambda x:(x[0], -int(x[1])))

for i in b:
  print(list.index(i) + 1)

```

## ポイント

ラムダ式を使用し、2次元配列の第一引数でソート→第二引数でソートをする。
新しく作成した配列とappendで作成した配列を比較し、元の配列のインデックスを出力する。
新しくモジュールを作ったときにbuild.gradleを3行で済まし、カスタマイズをDSLで行う2

1がうまく動かない部分があったのですが、ジワジワLGTMしていただいて、うまく動かないものになっていて申し訳ないので、修正版を用意しました。

https://qiita.com/takahirom/items/50672e079f42c1b7b00c

# 結論とコード

androidComponents.finalizeDslを使って、カスタマイズしよう。

こちらで確認できます。buildSrcとライブラリのbuild.gradleをご確認ください。

https://github.com/takahirom/android-gradle-plugin-common-logic-sample

使う側のコード

```kotlin
plugins {
    id("my.custom.library")
}

myCustomExtension {
    useCompose = true // カスタマイズしたい部分だけ変更する
}
```



使われる側のコード

buildSrc/src/main/kotlin/my.custom.library.gradle.kts

```kotlin
plugins {
    id("com.android.library")
    id("org.jetbrains.kotlin.android")
}

open class MyCustomPluginExtension @JvmOverloads constructor(
    var useCompose: Boolean = false
)

val extension = project.extensions.create<MyCustomPluginExtension>("myCustomExtension")

android {
    compileSdk = 32
...普通のandroidブロック
}

dependencies {
    implementation("androidx.core:core-ktx:1.7.0")
...
}

// カスマイズしたいものは以下で書く
// https://developer.android.com/studio/build/extend-agp
androidComponents.finalizeDsl { androidExtension ->
    androidExtension.buildFeatures {
        println("extension.useCompose:" + extension.useCompose)
        compose = extension.useCompose
    }
}
```


## 具体的にに何がうまく動かなかったのか？

変更diffは以下の通りで、以下のように`useCompose = true`のように設定していた部分で設定が反映されていませんでした。


```kotlin
plugins {
    id("my.custom.library")
}

myCustomExtension {
    useCompose = true
}
```

## なぜうまく動かなかったか？

使う側のコード

```kotlin
plugins {
    id("my.custom.library")  // ←この時点でもうAndroidブロックが実行されてしまうので、下の設定を反映できない！！！
}

myCustomExtension {
    useCompose = true
}
```

## どうしたか？
androidComponents.finalizeDslを使って、カスタマイズしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/9684c20b-4c3b-d4c1-3276-9e190dde9d0c.png)

## androidComponents.finalizeDsl{}とは？

一般的にこういうときにはafterEvaluate{}が使えますが、Androidのドキュメントには以下のようにあり、AndroidのAGPと一緒に使う場合は推奨されていません。
このDSL parsingというAPIを使うことで、AGPが設定可能になったタイミングで、設定することができます。

> When interacting with AGP, use specially made extension points instead of registering the typical Gradle lifecycle callbacks (such as afterEvaluate()) or setting up explicit Task dependencies.

https://developer.android.com/studio/build/extend-agp


```kotlin
plugins {
    id("my.custom.library")
}

myCustomExtension {
    useCompose = true
}
 // ←この後でandroidComponents.finalizeDsl {}がよばれる！！
```

## 細かい変更点

Gradle Propertyを使っていましたが、特にTaskでもないので使う必要がないので普通のKotlin Propertyにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/ec18a79b-9b31-cf0c-a631-24d051686241.png)

これによって使う側で、より直感的に書くことができるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/6fe51c6b-0fef-716b-6aab-29e142370a8e.png)
Django favicon.ico 備忘録

favicon.ico は以下のサイトで作れる。

https://realfavicongenerator.net/

favicon.icon の置き場所は例えば

```plaintext
📂webapp1
  |
  +-- 📂static
      |
      +--🚀favicon.ico
```

テンプレートに以下のように追記

```plaintext
{% load static %} {% comment %} 👈あとで static "URL" を使うので load static します {% endcomment %}
<!DOCTYPE html>
<html>
    <head>
        <link rel="shortcut icon" type="image/png" href="{% static 'favicon.ico' %}" />
        中略
        <title>Tic Tac Toe</title>
    </head>
    <body>
以下略
```
Laravelでwhere句のグループ化

## where句のグループ化
以前入っていた現場で
```sql
select * from users
where ((status = 1) and (confirm_email1 = ? or confirm_email2 = ? or confirm_email3 = ?))
or ((status = 2) and (approve_email1 = ? or approve_email2 = ? or approve_email3 = ?))
```
上記のようなSQL文をLaravelで再現する必要がありました。（実際のコードから修正してあります）
そして私が最初に書いたコードはこんな感じでした。
```php
$users =  User::query()
    ->Where('status', 1)
    ->orWhere('confirm_email1', $email)
    ->orWhere('confirm_email2', $email)
    ->orWhere('confirm_email3', $email)
    ->orWhere('status', 2)
    ->orWhere('approve_email1', $email)
    ->orWhere('approve_email2', $email)
    ->orWhere('approve_email3', $email)
```
絶対こんなコードではデータを取得できないよなと思いつつもこんなコードしか書けなかったです。。。。

色々調べていく中でwhereメソッドにクロージャを渡してグループ化できることを知りました。
そして進化したコードがこちらです！
```php
$users =  User::query()
    ->where(function($query) use ($email) {
        $query->where(function($query) use ($email) {
            $query->Where('status', 1);
        })->where(function($query) use ($email) {
            $query->orWhere('confirm_email1', $email)
                  ->orWhere('confirm_email2', $email)
                  ->orWhere('confirm_email3', $email);
        });
    })
    ->orwhere(function($query) use ($email) {
        $query->where(function($query) use ($email) {
            $query->Where('status', 2);
        })->where(function($query) use ($email) {
            $query->orWhere('approve_email1', $email)
                  ->orWhere('approve_email2', $email)
                  ->orWhere('approve_email3', $email);
        });
    })
    ->get();
```
このコードを書いてうまくデータを取得できたときは少し感動しました。

参考にしたサイトはこちらです
[Laravel readouble, 論理グループ化](https://readouble.com/laravel/8.x/ja/queries.html)
データ前処理を学ぶ

# CRISP DM
・プロセスモデルのフレームワーク
・EDA 
　一つの手段に、pandas-profilingがあり、簡単に統計指標やグラフを可視化する
・データ前処理は、分析精度に関わるので、しっかり行う

#　構造化データの前処理

## 欠損値の処理
・欠損値の削除もしくは補完を行う・
　補完は他のデータから統計的に算出して。

isnull() /// 行ごとの欠損値の確認(True/False)
isunll().sum() /// カラムの欠損値の合計値
fillna(欠損値に置き換えたい処理,inplace=True) /// 置き換え処理。inplace=Trueはデータを完全に書き換える。なしだと、一時的な書き換え。
xxx.drop(カラム名,axis=○,inplace=True) /// 指定カラムの削除
 　　　　　　　※カラム名はリスト表記で複数同時削除可能。.drop(["aaa","bbb","ccc"],axis=1)みたいな
xxx.value_counts() /// 指定業のユニーク値ごとの集計値



## カテゴリーデータの処理
・数値で表せないデータ（晴れ曇り雨、、、みたいな）
・それぞれ数値で定義しなおす。
・辞書型などを活用
・One hot Encoding
・カテゴリ値の整数への変換
・SML→123　　辞書型で変数を定義してあげる。
　mapメソッドを使う
・名義尺度の場合、labelエンコーディングとone　hot　encoding
・get_dummies関数を使用
・やり方はいろいろある。pandasかsktlearnを使用

性別の数値化の例)
sex_dummy = pd.get_dummies(データ[カラム]) /// 数値化データの生成
xxx = pd.concat([ｘｘｘ,sex_dummy], axis=1)　/// データに数値化データを結合


##　二値化
欠損値とそれ以外で0,1で表記

##離散化
連続値を離散値に変換する（年齢や身長など）

#特徴量スケーリング（モデルの精度上げ）
・標準化・・・回帰分析などで用いることが多い
・正規化・・・画像などに用いることが多い

## データの可視化
・matplotlibやseabornでグラフ化する。データの傾向が見つけられる
.seaborn.countplot
 hueは、データを細分化する軸のこと。クロスを切るイメージ。
RDSアップグレード後にpg_dumpを使えるようにする方法

みなさまこんにちは、kumaです！
この間実務でDBのアップグレードを経験したのですが、その際に少し詰まった部分があったのでそちらを備忘録として残したいと思います。
似たような経験をされた方、これからされる方のお役に立てますと幸いです💦

## 実際に発生した事象
pg_dumpを使おうとすると、以下のエラーがでて使用できない。

```
pg_dump: server version: 12.8; pg_dump version: 9.6.22
pg_dump: aborting because of server version mismatch
```

## 原因
RDSのアップグレードを行った際に、サーバー側はアップグレードされたものの、クライアント側はバージョンアップをおこなっていなかったから。

## 方法
基本的には、参考記事の通りに進められるかとは思いますが、configureスクリプトを実行した際に、以下のエラーにぶち当たりました。
エラー文を読むと、自分の環境にはreadline-develがないとのことでしたので、`yum install readline-devel`を行いました。

```
configure: error: readline-devel library not found
　If you have readline already installed, see config.log for details on the
　failure. It is possible the compiler isn't looking in the proper directory.
　Use --without-readline to disable readline support.
```

あとは記事通りに進めれば、問題なく使用できるようになりました！（手抜きで申し訳ないのですが、本当にこの記事が全て書いてくれてました。。。すごい。）



## 参考記事

https://zenn.dev/dai0916/articles/a593ccd9ab3773b2b04f
Laravelのローカルスコープについて

### ローカルスコープとは？
簡単に説明するとローカルスコープとは、SQLのよく使う取得条件をあらかじめ定義しておいて再利用できる機能のことです。
```php
$posts = Post::query()
    ->select('title', 'body')
    ->where('status', 1)
    ->get();
```
上記のコードでは`where句`を使って`status`が`1`のデータを取得しています。この取得条件が他のところでも複数必要であれば、何回もこの`where句`を記述することになります。そんな時に使えるのがローカルスコープです。

モデルファイルにこのように記述します。
```php
public function scopeOnlyOpen($query)
{
    $query->where('status', 1);
}
```
メソッド名の先頭に`scope`を付けます。
そして、、
```php
$posts = Post::query()
    ->select('title', 'body')
    ->onlyOpen()
    ->get();
```
このように記述することによって利用することができます。
`where('status', 1)`の部分が`onlyOpen()`に置き換わってスッキリしました！何回も同じ取得条件を記述しているときは`scope`の機能を利用してみてください！
UnityのInputSystemでなんかUIのIPointerDownHandlerの入力がちゃんとできないときの対処法

UnityのInputSystemを使ってたら、IPointerDownHandlerとかの入力が遅れる？気がしていました。
# 原因
ProjectSettings > InputSystemPackage > UpdateMode が Process Events In Ficed Update になっていることが原因でした。

Process Events In Dynamic UpdateにするとUIIPointerDownHandlerがUpdateで動くようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344267/db51f957-fa6c-1163-361f-e2ffb00055a2.png)
【初心者にやさしい】CS(コンピューターサイエンス)基礎の基礎の学習：変数

# CS(コンピューターサイエンス)基礎の基礎
現在、CS基礎の基礎を一から学んでいるので、その学習成果のアウトプットに、、、

## 今回は「変数」

### 1. 「変数」と「定数」
　変数とは、値を代入したり、取り出したりすることができる「箱」のようなものです。
![変数と定数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/2004b4b9-ac7e-dbc5-ec5b-75f1b553da9a.png)
　同じように「定数」と呼ばれるものもありますが、変数との違いとして、「変数は格納したデータの上書きができる」、「定数は格納したデータの上書きができない」というものがあります。
　そのため、コードを書くうえで、変数と定数の扱い方には注意が必要です。

### 2. 変数を使用するメリット
　変数を使用するメリットとして大きく以下の２つが挙げられます。

　メリット①：再利用がしやすく、「保守性」が高まる
![変数.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/4901a7ea-8392-52e5-6eb4-35db6b32129c.jpeg)
　上の図から分かるように、何度も使用するデータは変数に代入しておき、何か修正が必要となったら、最初に定義した変数の部分のみ変更すればよいという形にしておけば、見落としなどを防いで保守性を高めることができます。

　メリット②：「どのようなデータなのか」を読み手が理解しやすくなり、可読性が高まる
![変数.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/63a4b4d6-7c25-6112-b945-6da8cdf4ed26.jpeg)
　これまた、上の図から分かるように、何度も使用するデータに対して「どのようなデータなのか」を明確に名付けておけば、読み手にとっての可読性が向上し、チームでのコミュニケーションも円滑になります。

### 3. 変数の使い方
　変数の使い方には、主に「宣言」と「代入」というものがあります。

#### 3-1. 変数宣言
　変数は使うとき、最初に「〇〇という名前の変数を使いますよ」という宣言をする必要があります。
　この時に、重要となるキーワードが「データ型」です。以前の記事でもアウトプットしましたが、コンピューターがそのデータがどのような種類のものなのかを判別できるようにするためのものが「データ型」でした。そのデータ型を変数宣言時に同時に指定する必要がある場合があります。

　データ型について解説した記事は以下からどうぞ！！
　https://qiita.com/hiddy19970329/items/3da50ae294cddbb2c6e4

##### 3-1-1. 静的型付け言語
　変数宣言時に「データ型の指定」が必要な言語を「静的型付け言語」と言います。具体的な言語名は「Java, TypeScript」などです。
　これらの言語は変数宣言をすると同時に「データ型」を指定する必要があります。

##### 3-1-2. 動的型付け言語
　一方、変数宣言時に「データ型の指定」が必要ない言語を「動的型付け言語」と言います。具体的には「JavaScript, PHP, Python, Ruby」などがあります。
　これらの言語はプログラム実行中に自動的に型を判断してくれるため、わざわざ自分で指定する必要がありません。

#### 3-2. 変数代入 
　変数を宣言した後は、具体的にどんなデータを格納するのかを明確にするために、値を代入する必要があります。この「宣言」と「代入」は基本的に同時に行われることが多いです。
![動的と静的.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/b06cf177-82d4-d686-2e2f-65272d2e31bc.png)

### 4. 変数がコンピュータで処理される流れ 
　変数で定義したデータがコンピューター上で実際にどのように使用されるのかを示した図が以下です。
![メモリとメモリアドレス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/882b9bdd-c19c-4e9b-e57b-4447c3f41151.png)
　入力したデータを機械が判断できる２進数に変換してメモリに保存するためにまずメモリ内の住所を割り当てる。そしてメモリに保存。CPUがそのメモリアドレスを参照してデータを取得できるようになる。
　大まかにはこのような流れになっています。
　この「メモリアドレスを割り振る」ことによって、CPUがメモリ上のどこにあるのかを素早く判断できるようになるため、非常に重要な工程だと言うことができますね。
　しかし、このようなメモリアドレスを割り振ってメモリに保存し、機械が使用できる言語に変換する作業をわざわざ人間の手でできるわけがありません。このような作業を自動で行なってくれるのが、「コンパイラ」です。
　コンパイラは記述されたコードに対して、一括でメモリアドレスを割り当てて機械語に変換します。

### 5. コンパイラ型言語とインタプリタ型言語
　先ほど「コンパイラ」というプログラムのおかげで自動的にソースコードが機械語に変換されると言いましたが、この仕組みを利用している言語を「コンパイラ型言語」と言います。これらの言語はソースコードを書いてからそれらを一括でまとめて機械語に変換します。C++やJavaなどの言語が該当します。
　一方、ソースコードをまとめてではなく、書きながら1行1行解釈していく言語のことを「インタプリタ型言語」と言います。RubyやPythonなどが該当します。
![インタプリタ言語とコンパイラ言語.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/c2569032-993c-6cf8-6772-a8b780569406.jpeg)

### 6. 学び
　変数の学習を通じて、「動的言語」や「静的言語」、「コンパイラ」や「インタプリタ」など理解が曖昧になりがちな言葉に対して理解が深まったように感じます。
Godot用 iOS版 Firebase Cloud Messagingのプラグインを作った

## 概要
以前、似た内容で[Godot用iOS版 Firebase Analyticsのプラグイン](https://qiita.com/yokochi@github/items/7df54cbf331408d1255d)を作りました
今回はプッシュ通知を送りたかったのでFirebaseのCloud Messagingのほうのプラグインになります。

作成したプラグインはこちらです
https://github.com/funseek/godot-ios-firebase-message

プラグインの作成方法は上記のプラグインと流れはまったく同じです。

## PlayFabでもプッシュ通知を送りたい
現在作成しているゲームではバックエンドに[PlayFab](https://azure.microsoft.com/ja-jp/services/playfab/)を利用しています。
全員にプッシュ通知をする場合はFCM、何かのトリガーで個別にプッシュ通知を送りたい場合はPlayFab側で送信という想定です。

ですので、PlayFab側にもプッシュ通知で必要なトークンを登録してあげないといけないです。
PlayFabではそれ専用のAPIが用意されていますのでそれを利用します。
https://docs.microsoft.com/ja-jp/rest/api/playfab/client/platform-specific-methods/register-for-ios-push-notification?view=playfab-rest

### トークンを登録すると400エラー
上記APIを実行すると以下のエラーが発生しました
```
Invalid parameter: Token Reason: iOS device tokens must be no more than 400 hexadecimal characters
```

FCMのSDKで取得できる、fcmTokenを渡したのですが、これはどうやらFCM側で発行されるトークンであり、ここで渡さなければいけないのは、APNSトークンのほうでした。そちらを渡すようにして無事解決
https://firebase.google.com/docs/cloud-messaging/ios/client#monitor-token-refresh
https://developer.apple.com/documentation/appkit/nsapplicationdelegate/1428766-application?language=objc

## 使い方
上記エラーなども踏まえてFCMトークンとAPNSトークンの両方を取得できるようにしました。

このライブラリは[iOS版Firebase Analytics](https://qiita.com/yokochi@github/items/7df54cbf331408d1255d)も必要となります。
※何故かというと、Analytics側のライブラリでFirebaseの初期化をおこなっているからです

大きな流れは以下です。
1. リポジトリをcloneしてビルドする（*.aが作成される）
2. 作成されたライブラリをプロジェクトにコピーする（gdipファイルも）
3. Godot側で必要な処理を実装する
4. iOSプロジェクトをエクスポートする
5. 関連ライブラリはCocoa Podsで管理しているので、Xcode側でpod installする

詳しくは[README](https://github.com/funseek/godot-ios-firebase-message#building-library-and-copy-them-to-godot-project)に記載あるので、Godot側の処理だけ記載します。

```gdscript
if Engine.has_singleton("FirebaseMessage"):
		  var singleton = Engine.get_singleton("FirebaseMessage")
		  singleton.get_fcm_token() # FCMトークンの取得
		  singleton.get_apns_token() # APNSトークンの取得（PlayFab側にはこちらを送信する）
		  firebase_message.connect('did_receive_registration_token', self, '_did_receive_registration_token') # signalの受け取り設定

# signalの受け取り
func _did_receive_registration_token(fcm_token, apns_token):
	print(fcm_token)
	print(apns_token)
```
注意点としては、get_fcm_tokenとget_apns_tokenはdid_receive_registration_tokenが呼ばれてから設定されるので、その前に呼ぶとnullが返ります

## まとめ
GodotはiOSのプラグインを作るのが若干面倒ですね。そのせいかAndroidはあってもiOSのプラグインがないというケースが多い気がします。
あと、PlayFabはゲーム専用mBaaSで非常に便利なのでおすすめです（登録数が10万ユーザーになるまでは無料で使えます）
rails twitterみたいに投稿してからの時間を表示　完全版


rails でTwitterのように投稿時間を「何分前」と表示したい場合

ステップ１　　posts controoller のcreateアクションでPost .newにcreated_at: 　　　　　　　params[:created_at])を追加する

ステップ２　　index.htmlで投稿一覧をつくる。（これは自分の作りたいものによって変わる）

ステップ３　　表示したいview(私の場合index.html)で<%= time_ago_in_words(post.created_at) %>前　を書く。

ステップ４　　about 1 hour  前　や　 1day 前　　　　　　　　　などが表示されるようになる。

ステップ５　　config.time_zone = "Asia/Tokyo"
    　　　　　　　　config.i18n.default_locale = :ja　　　をconfig/application.rbで入力する

ステップ６　　config/locales/en.yml で　
ja:
  datetime:
    distance_in_words:
      half_a_minute: "30秒前後"
      less_than_x_seconds:
        one:   "1秒"
        other: "%{count}秒"
      x_seconds:
        one:   "1秒"
        other: "%{count}秒"
      less_than_x_minutes:
        one:   "1分"
        other: "%{count}分"
      x_minutes:
        one:   "約1分"
        other: "%{count}分"
      about_x_hours:
        one:   "約1時間"
        other: "約%{count}時間"
      x_days:
        one:   "1日"
        other: "%{count}日"
      about_x_months:
        one:   "約1ヶ月"
        other: "約%{count}ヶ月"
      x_months:
        one:   "1ヶ月"
        other: "%{count}ヶ月"
      almost_x_years:
        one:   "１年弱"
        other: "%{count}年弱"
      about_x_years:
        one:   "約1年"
        other: "約%{count}年"
      over_x_years:
        one:   "1年以上"
        other: "%{count}年以上"
を入力する

ステップ６の内容を変えれば約を消せたりします。
Arduinoベースの自作基板のススメ②-2

注意：「Arduinoベースの自作基板のススメ」では、eagleを使って書いた回路を出力し、基板メーカに発注することをゴールにしています．
## 目次
書いたらリンクつけます．

1. [準備](https://qiita.com/conel_fg/items/f5091302145d757da7ea)
2. eagleライブラリ「.lbr」の編集方法 [その①](https://qiita.com/conel_fg/items/54e4477ea401dec159cb) / その②(今回)
3. eagleでの「.sch」「.brd」の編集方法
4. ブートローダーについて
5. 部品の選び方
6. 基板の発注



# はじめに

　Arduinoなどのマイコンボードを使ってスケッチ書いてDIYを楽しんでいる人，最近増えてる気がします．でも，せっかく完成したデバイスのジャンプワイヤが抜けたり断線したことはありませんか？ブレッドボードに挿した抵抗やコンデンサが何かの拍子にショートしたりしたことはありませんか？ジャンプワイヤが多すぎてイライラしたことはありませんか？同じデバイスをたくさん作りたいけど，いちいちジャンプワイヤつなぐのを面倒に思ったことはありませんか？

**それ全部基板化して解消できます**

## この記事の対象
* Arduinoを活用したハードウェア開発に興味があるひと
* eagleやKiCADなどの電子回路CADに興味がある人

## 概要
* eagleで編集する「.lbr」形式のファイルの編集方法について説明します．
* [前項](https://qiita.com/conel_fg/items/54e4477ea401dec159cb)読んでない方は、先にそちらへどうぞ．
* 今回は[前項](https://qiita.com/conel_fg/items/54e4477ea401dec159cb)で作成した回路記号とフットプリントを紐づけしてライブラリを完成させます．

## Deviceの作成
### Deviceの新規作成
さて，[前項]()で回路記号とフットプリントができたので，これらを紐付けしたら完成です．
ライブラリファイルの図の「Add Device...」をクリックするか，Footprintの編集画面の左上のアイコンから，Deviceを新規作成しましょう．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373248/25e9bab5-10f3-5a76-65a3-3c75479c8236.png" width="40%">
新規作成すると以下のような画面に移行します．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373248/d7f4164a-92f6-76e4-3811-b1f0f13868e8.png" width="80%">
まずは，画面左のツールの「Add Part」をクリックすると，先ほど作成したATTiny85の回路記号が出てくると思います．これを選択してOKをクリックし，回路記号を左側の画面の中央に配置します．
次に，画面右側の「New」をクリックし「Add local package」を選択すると，先ほど作成したATTiny85-20SURのフットプリントが出てくると思います．これを選択してOKすると，フットプリントが表示されます．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373248/9d32eee1-d132-f3d9-6b07-764c09ae095a.png" width="80%">
上図のような画面になったら，画面右側の「Connect」をクリックします．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373248/f7c11a0e-1000-de45-54ce-b1d298159902.png" width="60%">
　上図のウインドウでは，Pin(=回路記号内のPinの名前)とPad(フットプリント内のSmdの名前)が一致するものを選択している状態で「Connect」をクリックすると，その組み合わせがConnectionに移動していきます．
必要な組み合わせがConnectできたら，OKをクリックします．
　もっと極数の多いマイコンではVCCやGNDなどを複数の極で持つものがあります．
その場合は、ConnectionとPadの該当のものをそれぞれ選択した状態でAppendすると、短絡させることができます．

### Prefix・Value
　最後にPrefixとValueについて説明します．
　Prefixとは，回路図に回路記号を書いた際に、それが何の部品なのかを端的に表すための記号です(デフォルトはU$〇になっています)．
記号にルールはありませんが、基本的には部品の英語の頭文字を使用するのが通例のようです．例えば、コンデンサ(=Capacitor)の頭文字から **「C」** 、ATTiny85のようなマイコンを **「IC」** やUnitの **「U」** で表すような感じです．興味があれば、Arduinoなどのオープンソースハードウェアの回路図を調べてみるのも面白いかもしれませんね．

　Valueは、抵抗値や静電容量など、電子部品を選ぶ上で重要な数値のことです．
抵抗(チップ抵抗・リード線付き抵抗)やコンデンサ(チップコンデンサ・アルミ電解コンデンサ)、トランジスタ(FET含む)などのディスクリート部品は極の数が同じである場合が非常に多く、形状やサイズについて統一された規格で生産されています．すなわち、フットプリントは同一なのに抵抗値や静電容量が異なるという場合が非常に多くあるということです．
これらを個別にライブラリで管理するのは面倒なので、回路図側で編集できる数値を与えたものがValueというわけです．
　ValueをOnにすると、.schファイルや.brdファイルで抵抗値や静電容量を編集することができます．

　以上が完了したら、保存して完成です．

# 本記事のまとめ
ここまで、説明が長くなり申し訳ありませんでしたが、前項と今回で.lbrファイルにひとつ部品を登録できたのではないでしょうか．慣れてきたら使いやすいライブラリがどんなものかわかってくると思います．
ぜひいろいろなライブラリを作っていただけるとよいと思います．
それではまた次項でお会いしましょう．
Arduinoベースの自作基板のススメ①

注意：「Arduinoベースの自作基板のススメ」では、eagleを使って書いた回路を出力し、基板メーカに発注することをゴールにしています．

## 目次
書いたらリンクつけます．

1. 準備(今回)
2. eagleライブラリ「.lbr」の編集方法 [その①](https://qiita.com/conel_fg/items/54e4477ea401dec159cb) / [その②](https://qiita.com/conel_fg/items/999c157d72b91619010c)
3. eagleでの「.sch」「.brd」の編集方法
4. ブートローダーについて
5. 部品の選び方
6. 基板の発注


# はじめに

　Arduinoなどのマイコンボードを使ってスケッチ書いてDIYを楽しんでいる人，最近増えてる気がします．でも，せっかく完成したデバイスのジャンプワイヤが抜けたり断線したことはありませんか？ブレッドボードに挿した抵抗やコンデンサが何かの拍子にショートしたりしたことはありませんか？ジャンプワイヤが多すぎてイライラしたことはありませんか？同じデバイスをたくさん作りたいけど，いちいちジャンプワイヤつなぐのを面倒に思ったことはありませんか？

**それ全部基板化して解消できます**

## この記事の対象
* Arduinoを活用したハードウェア開発に興味があるひと
* eagleやKiCADなどの電子回路CADに興味がある人

## 概要
* 回路CAD「eagle」をインストールします．
* オープンソースの回路データを開きます．

# eagleをインストールしてみる
[AutodeskのWebサイト](https://www.autodesk.co.jp/products/eagle/free-download)から自分のパソコンの環境に合うやつをインストールしてください．
学生の方は有償版の機能を無料で使えるので，教育機関ライセンスの取得をオススメします．


## Arduinoの回路図・デザインをダウンロードする
eagleで編集できる回路データや基板デザインのファイルはそれぞれ「.sch」「.brd」形式です．
ダウンロードしたこれらファイルは同じディレクトリ内にあることが必要です．
ArduinoやAdafruitのボード，およびSwitchScienceの開発モジュールは商品ページやGithubなどから上記形式のファイルが無料で入手できます．

【参考】

1. Arduino UNOの場合，[公式ページ](https://store.arduino.cc/products/arduino-uno-rev3)のうち以下の「EAGLE FILES IN.ZIP」をクリックすればダウンロードが始まります．
![スクリーンショット 2021-11-12 15.35.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373248/45e24a5f-58d4-9ff1-b11f-2d42156f1cfa.png)

2. [Adafruit Metro M4 Express](https://github.com/adafruit/Adafruit-Metro-M4-Express-PCB)
3. [Adafruit Metro M0 Express](https://github.com/adafruit/Adafruit-Metro-M0-Express-PCB) 
4. [FTDI USBシリアル変換アダプター Rev.2](https://www.switch-science.com/catalog/2782/)

## eagleで回路データを開く
上記でインストールしたeagleを起動すると，「コントロールパネル」が開きます．
Windowsであれば「File」タブ，MacOSであればメニューバーの「File」の「Open」から，先程ダウンロードした「.sch」「.brd」形式のファイルのうちどちらかを選択しましょう．
以下が，それぞれのファイルを開いた様子です．

【UNO-TH_Rev3e.sch】
![スクリーンショット 2022-01-19 11.17.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373248/e9cf920d-37a8-3001-6a7f-c66b4eaf9620.png)

【UNO-TH_Rev3e.brd】
![スクリーンショット 2022-01-19 11.16.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373248/1a71cd45-4c4b-33ed-4cca-ef275fd9651b.png)

# 本記事のまとめ
今回はeagleのインストールとArduinoの基板データを見るというところまで行いました．
はじめて回路を引くひと向けに難しい部分を省きつつ細かく書いていこうと思います．
次回は回路図とフットプリントの部品単位の編集方法を見ていきます．
JavaScriptで列挙型(Enum)っぽい曜日(DayOfWeek)をSymbolを用いてやってみる

そもそもJavaScriptは曜日をなぜか数字で管理しています。(Dateクラス)
全く現代的ではないため、JavaのEnum型DayOfWeekみたいな感じにできたらなと思って書いてみようと思いました。

[JavaScriptでEnumを定義する - Qiita](https://qiita.com/dich1/items/4878ba4b089b3fe7ff30)
調べてみると、上記記事のコメント欄でSymbolを使うのはどうか？と書かれていました。
Symbolとは文字列引数を用いて唯一な定数を生成するものです。ref: [Symbol - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Symbol)

そんな感じで書いてみました。

```js
const DayOfWeek = {
  SUNDAY: Symbol('日'), // 0
  MONDAY: Symbol('月'), // 1
  TUESDAY: Symbol('火'), // 2
  WEDNESDAY: Symbol('水'), // 3
  THURSDAY: Symbol('木'), // 4
  FRIDAY: Symbol('金'), // 5
  SATURDAY: Symbol('土'), // 6
};
const DayOfWeeks = {
  values: [
    DayOfWeek.SUNDAY,
    DayOfWeek.MONDAY,
    DayOfWeek.TUESDAY,
    DayOfWeek.WEDNESDAY,
    DayOfWeek.THURSDAY,
    DayOfWeek.FRIDAY,
    DayOfWeek.SATURDAY,
  ],
  getDayOfWeek: index => {
    return DayOfWeeks.values[index];
  },
  getDayOfWeekOfJapaneseChar: char => {
    return DayOfWeeks.values.find(value => value.description == char);
  },
  getDayOfWeekOfJapaneseText: text => {
    return DayOfWeeks.getIndexOfJapaneseChar(text[0]);
  },
  getIndexOf: dayOfWeek => {
    return DayOfWeek.values.indexOf(dayOfWeek);
  },
  getDayOfWeekOfEnglish: text => {
    return DayOfWeek[text];
  },
};
```
AWS CLIのShorthand SyntaxでFirehoseを作成するコマンドのメモ

シンプルなメモ。
(Firehoseに限らず)AWS CLIでShorthand Syntaxを使いたい時に細かい書き方でエラーが出ることがよくあり、結構いつも億劫になるので。
```
aws firehose create-delivery-stream --delivery-stream-name cli-generated-stream \
--delivery-stream-type DirectPut \
--http-endpoint-destination-configuration 'EndpointConfiguration={Url=https://....},S3Configuration={BucketARN=arn:aws:s3:::<Bucket Name>,RoleARN=<Role ARN>}'
```

注意点

- シングルクォートがないとUnknown optionsのエラー
- {}の中はJSONではなく、Url=...のようにイコールで結ぶ

環境
MacOS バージョン 10.15.7
AWS CLI バージョン 2.0.38
機械学習を用いたデータ分析

# パラメータチューニング（モデルの改良）
## グリッドサーチ　GridSearchCV
　最も良い組み合わせのパラメータを調べることができる

## ランダムサーチ　RandomizedSearchCV
計算量が少ないが、必ずしも最適な組み合わせを見つけられるわkではない。

グリッドサーチとランダムサーチは精度と計算量のトレードオフの関係



# 流れ
・入出力のシステム
・学習用データの収集
・データの可視化・理解
・データ前処理
・アルゴリズム決定
・ハイパーパラメータの選択（？？）
・モデルの学習
・モデルの性能評価
・チューニング（前処理〜性能評価を繰り返す）
・API化しシステムやアプリに組み込む

# 学習前の処理
・データの分割
.iloc[a:c,x:z] /// データの範囲を指定


# 学習
・モデルの選定
・モデルに学習データを取り込む。
・学習データにｔｅｓｔデータを用いて処理（pred）

# 性能評価
・from sklearn.metrics から性能評価に使うメソッドを呼び出す
・正解率や適合率や再現率（accuracy＿scoreなど）
・predの予測データを目的変数データに当てて、評価する

# チューニング
・ハイパーパラメータのチューニング。
・
SSL/TLS

# SSL/TLSとは
SSL/TLSとはSSL(Secure Sockets Layer)または、TLS(Transport Layer Security) のプロトコルを使用し、インターネット上の通信の暗号化を行うことで、盗聴、改ざんを防止する技術のことである。
SSL/TLSと言っているが、SSLには脆弱性が見つかっており、今はTLSのプロトコルを使うことが推奨されている。

### TLS通信の流れ
(事前準備)
①.TLS通信を行いたいサーバは、サーバの秘密鍵と公開鍵を生成し、CA(認証局)にサーバ証明書の発行を依頼する。
②.CAはサーバの正当性を確認し、サーバ証明書を発行する。
  サーバ証明書には、サーバの公開鍵情報などが入っている。

(通信開始)
③.クライアントは、サーバに接続要求をする。(Client Hello)
④.サーバは、クライアントからの要求に対して、クライアントにサーバ証明書を返す。(Server Hello)
⑤.クライアントはサーバ証明書の正当性を確認する。
サーバ証明書は、CAの秘密鍵で暗号化されているため、CAの公開鍵で複合することで正当性を検証できる。
⑥.複合したサーバ証明書の中にある、サーバの公開鍵で通信の暗号化に使用する共通鍵を暗号化する。
暗号化した共通鍵をサーバに送る。
⑦.サーバは、サーバの秘密鍵で共通鍵を取得する。
⑧.取得した共通鍵で暗号通信を行う。


```plantuml
サーバ->CA : ①
CA->サーバ: ②
クライアント->サーバ : ③(Client Hello)
サーバ->クライアント : ④(Server Hello)
クライアント->CA : ⑤
CA ->クライアント
クライアント->サーバ : ⑥
サーバ->クライアント
クライアント->サーバ : ⑧
サーバ->クライアント
```
GraphQL[Introduction to GraphQL]

# [Introduction to GraphQL](https://graphql.org/learn/)

> 引用：https://graphql.org/learn/

> GraphQLについて学習しましょう。
1. GraphQLがどのように動作するか
2. GraphQLの使い方について

> GraphQLサービスの作り方に関するドキュメントを探していますか？
ここには[さまざまな言語](https://graphql.org/code/)におけるGraphQLの実装例があります。
実用的なチュートリアルで詳細な学習体験を得たければ、[How to GraphQL](https://www.howtographql.com/)をご覧ください。
無料のオンラインコース、[Exploring GraphQL: A Query Language for APIs](https://www.edx.org/course/exploring-graphql-a-query-language-for-apis)もチェックしてみてください。

GraphQLは、APIに対するのクエリ言語であり、クエリ実行のためのサーバサイドランタイムです。
クエリの実行には、データに対して定義する型を使用します。
GraphQLは、特定のデータベースやストレージエンジンには関連付いていません。代わりに、既存のコードとデータに支えられています。

GraphQLサービスを作る場合は、型とフィールドを定義します。
そして、各フィールドに対して関数を与えます。
たとえば、ログインユーザが誰であるか、だけでなく、そのユーザ名も通知してくれるようなGraphQLサービスを定義する場合は以下のような定義になります。

```:schema
type Query {
  me: User
}

type User {
  id: ID
  name: String
}
```

フィールド用の関数も、併せて定義します。

```javascript:functions
function Query_me(request) {
  return request.auth.user;
}

function User_name(user) {
  return user.getName();
}
```

GraphQLサービスを実行すると、GraphQLクエリを受信して検証することができます。
GraphQLサービスは、まずクエリをチェックして、定義済みの型とフィールドだけを参照していることを確認します。
次に、与えられた関数を実行して、結果を生成します。

たとえば、次のクエリで、

```:query
{
  me {
    name
  }
}
```
結果として、次のようなJSONを生成できます。

```json:result
{
  "me": {
    "name": "Luke Skywalker"
  }
}
```

もっと学習する場合は、[Continue Reading](https://graphql.org/learn/queries/)をクリックしてください。
[GAS]すべてのシートの中身を自動でA列基準で昇順にするロジック

## どういうときに使う？
シート数が多い状態で手作業ですべてのシートで昇順にするをクリックしたくないときに使ってみてください。

筆者は検索エンジンでcountを取得したとき、id基準ではなく件数基準の順番で表示されてしまったのをそのままスプレッドシートに移してしまったため、この作業が発生しました。

件数が多く300シートあったため手作業が嫌になり片手間で作りました。

せっかくだから共有しておこうと思いこの記事を書きました。

## ソースコードと説明（コメントアウト参照）

```javascript
function sortRowsInAllSheetsAsc() {
  var rng
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var all_sheet_list = spreadsheet.getSheets();
  var sort_info = {
    'sheet_list':{},
    'sheet_name_list':[]
  };

  try {

    // 下の記述でforを回せるように各シートの情報を配列sort_infoに格納
    for (var count = 0; count < all_sheet_list.length; count++) {
      var sheet_name = all_sheet_list[count].getName();      
      sort_info['sheet_list'][sheet_name] = all_sheet_list[count];
      sort_info['sheet_name_list'].push(sheet_name);
    }

    for (var sheet_count = 0; sheet_count < sort_info['sheet_name_list'].length; sheet_count++) {
      
      // 準備したシートを順次呼び出す
      var sheet_name = sort_info['sheet_name_list'][sheet_count];
      var active_sheet = sort_info['sheet_list'][sheet_name];
      Logger.log(sheet_name)
      active_sheet.activate();

      //sort範囲を指定
      rng = active_sheet.getRange("A:B");

      //1列目（A列）を昇順になるようにrngの範囲を整順
      rng.sort([{column:1,ascending:true}]);
    }

    // 成功したらspreadsheetの画面で報告
    Browser.msgBox('正常終了。ページを更新してください。');

      } catch(e) {
    // エラーが発生した場合は、spreadsheetの画面でその旨を表示してから処理中断
    Browser.msgBox(e.lineNumber + ':' + e);
  }
}

```

## 使い方
Google App Sheetを使えるようにして（この説明は割愛します）、コピーペーストして実行していただければすぐに使えます。
A列が嫌な場合は`rng.sort([{column:1,ascending:true}]);`のcolumn:1を好きな数字に変更すると他の列を基準とした昇順になります。

## 余談（着想の元になった記事）
記事の着想のもととなり、かつまるまる使わせてもらった内容として下記のものがあったため、こちらを紹介してこちらの記事は締めとさせていただきます。

[シート自体を名前で昇順にする方法についての記事](https://qiita.com/chanP_yamazaki/items/01c20108e1fdde2e2fef)
Inkscapeのコマンドラインで拡張子を素早く簡単に変更する

## はじめに
ゼミ原稿や論文を書くとき、私は Gnuplot で `eps` ファイルを作ります。そして作成した `eps` を Word や PowerPoint に使うときは、なるべく画質が落ちないように `eps` から `emf` へと変換させます。今までは Convertio を使って変換していましたが、やや面倒くさいんですよね。もっと素早く変換したいのです。

https://convertio.co/ja/eps-emf/

## 結論
`bat` ファイルを作りました。今まで、`png` を `eps` に変えたり、`eps` を `emf` に変えようと Convertio や Inkscape で「名前をつけて保存」をしていましたが、Inkscape のコマンドラインを利用して、より素早く処理できました。実は初めて `bat` を書いたので、参考文献には初歩的な文法の解説サイトも参考にさせて頂きました。

:::note info
バッチファイルはよく分からないけど、拡張子の変換は頻繁にする
:::

という方は是非参考サイトをチェックしてみて下さい。
※ Inkscape のダウンロードが必要です

## 必要な機能とスクリプト

前述の通り、私はよく `eps` を作り、`emf` に変換したい人です。また、LaTex に挿入するために `eps` に変換したいこともあります。大概はこの2つの変換で事足ります。そこで、**`eps` は `emf`に、それ以外は `eps` に変換するバッチファイルを作りました**。一気に複数の変更が可能です。やり方は、変えたいファイルをバッチファイルにドラッグ＆ドロップするだけ。

![メディア1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530290/7db29279-c322-fe5d-61fc-1b4ab8c649fe.gif)

`eps` は `emf` に。その他は `eps` に変換できています。

```bat: Eps2Emf_X2Eps.bat
@echo off
rem How to use : このバッチファイルに変換したいファイルを全てドラッグ&ドロップしてください
rem 拡張子の変換  : Eps To Emf / その他 To Eps
set file=%1
if not defined file (
 	echo please drag and drop file that you want to change extension
	goto eof
)
set inkscape1="%ProgramFiles%\Inkscape\bin\inkscape.com"
for %%f in (%*) do (
	if "%%~xf"==".eps" (
		%inkscape1% --export-filename=%%~nf.emf %%f
	) else (
		%inkscape1% --export-filename=%%~nf.eps %%f
	)
)
```

スクリプトの if 分岐を変更したり、 出力拡張子を変更することで、任意の拡張子から拡張子へと変更することが可能です。ネストを深くして、ディレクトリごとに出力する拡張子を変更してみたりしてもいいかもしれません。

## 参考文献

Inkscape のコマンドライン

https://qiita.com/ShortArrow/items/70279d90a456bee13d17

コメントの書き方

https://aprico-media.com/posts/6093

バッチファイルの引数とドラッグ＆ドロップ

https://www.softel.co.jp/blogs/tech/archives/2140

https://memo.morelents.com/batch-drag-drop/

http://tecsingularity.com/others/batfilelist/

if文

https://qiita.com/plcherrim/items/8edf3d3d33a0ae86cb5c
フォルダの中のファイルから特定の文字列を検索する方法

#背景

特定の文字が記載されているファイルを大量のフォルダの中から見つけたい。

そう思った場面はないでしょうか。

一つ一つを開いて「ctrl」 + 「F」だと時間がかかりすぎます。

そんな時は「grep検索」というフォルダ内から一気に検索できる方法で素早く見つけましょう！

#手順

１　さくらエディタを開きます。

２　次にgrep検索を選択します。

３　調べたい文字列を入力します。

４　検索します。

検索した結果、記載してある文字列にフォルダ、ファイルが記載されているので
どのファイルにあるのか確認できます。

大量のフォルダから特定の文字が記載されているファイルを見つけたい時は簡単にできますので
是非試してみてください。
S3 の Event notifications でエラー

S3 にオブジェクトが作成された時に、メールを受信したいのですが、エラーとなってしまいます。

"Unable to validate the following destination configurations"

と出力され、その上には、なんだか、権限が足りない、という記述があります。
これを解決するには、SNS トピックのアクセスポリシーを変更する必要があるようでした。

SNS トピックのアクセスポリシーを以下のように変更したところ、エラーがなくなりました。

```
{
  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "__default_statement_ID",
      "Effect": "Allow",
      "Principal": {
        "Service": "s3.amazonaws.com"
      },
      "Action": [
        "SNS:GetTopicAttributes",
        "SNS:SetTopicAttributes",
        "SNS:AddPermission",
        "SNS:RemovePermission",
        "SNS:DeleteTopic",
        "SNS:Subscribe",
        "SNS:ListSubscriptionsByTopic",
        "SNS:Publish"
      ],
      "Resource": "arn:aws:sns:<REGION>:<ACCOUNT_ID>:<SNS_TOPIC_NAME>",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:s3:*:*:<BUCKET_NAME>"
        }
      }
    }
  ]
}
```
（参考）
https://stackoverflow.com/questions/38088816/how-to-setup-permissions-for-s3-event-to-sns-topic
「ローコード開発ツール製品マップ＆カタログ解説セミナー」を視聴してみた

ローコード開発コミュニティがローコードの「ツール製品カタログ」を作成して公開しています。ユーザ企業（および、SIer）が自社や案件で必要としているツール選定の候補を見つけやすくすることを目的としたもので、今回はその紹介動画を見てみました。
動画の後半ではローコードツールのベンダーによるパネルディスカッションもあり、個人的にはそちらのほうが面白かったです。

## リンク
[ローコード開発ツール製品マップ＆カタログ解説セミナー](https://www.youtube.com/watch?v=XBKoOQryJjE)
[ローコード開発コミュニティ　Webサイト](https://www.x-rad.jp/index.html)

## 感想
### 良い点
<dl>
  <dt>ローコードツールを比較した貴重な資料</dt>
  <dd>ローコードツールは基本的に法人向けのサービスが多く、フリーで使えるものが少ないです。
    そのためローコードツールを比較したサイトなども少ないため、出来る出来ないをマトリクスでまとめてくれているのは非常にありがたいです。
  </dd>
<dt>　</dt>
  <dt>ツールの利用者を意識した比較表</dt>
  <dd>エンドユーザが使うEUC向けのノーコードツールと、開発者が入ることを前提としたローコードツールをごっちゃにしていることがよくあります。
    ローコード開発コミュニティの資料ではそこが意識されていて、利用者が誰かを明確にしている点が良いと思いました。</dd>
</dl>

#### 悪い点
<dl>
  <dt>掲載されているツールが限定的</dt>
  <dd>コミュニティに属している企業のツールしか乗っていないです。MicrosoftやAmazonなどのビッグテックの情報がないのは残念。
  </dd>
<dt>　</dt>
  <dt>掲載されている情報がツールの提供ベンダー目線</dt>
  <dd>ツールを提供しているベンダーが提供しているデータなので、情報の受け取り方には注意が必要です。
    機能はあるけど、実際は使い物にならないとかも多々あるかと思います。また、それぞれのツールを別の人が評価しているので、基準がばらばらになっているかと思います。例えば「基本操作/開発機能の習得時間」という項目がありますが、どこまで出来たら「習得」したのかわからないですよね。
  </dd>
<dt>　</dt>
  <dt>会員登録しないとカタログが見られない</dt>
  <dd>製品マップは見れますが、カタログは見れません。
    準会員登録は無料なので登録すればよいだけですが。
  </dd>
</dl>

## その他印象に残った話
<dl>
  <dt>UIや機能にばかり注目しがちだが、最も重要なのは間違いなくDB設計</dt>
  <dd>これは業務の中でも痛感しています。ローコードだからDB設計を適当にしてもいいことは絶対なくて、むしろアプリ側で緩衝できない分、DB設計の失敗はめちゃくちゃ響きます。
    でも現場ではER図すら作られず、多対多のリレーションがあったりして頭を悩ませます。ただでさえDB設計のリファクタリングは大変なものですが、ローコードツールだと一括修正ができずに全部画面でポチポチ直さなければならないとか・・・。ツールにもよりますがその苦しみは筆舌しがたいものがあります。</dd>
<dt>　</dt>
  <dt>ローコード開発コミュニティでやっているライブモデリング</dt>
  <dd>「お題を出してローコードツールのベンダーが1時間で行う」というイベント「ライブモデリング」なるものがあるらしいです。実際に開発する様子を横で見られるらしく非常に興味部会と思いました。
    動画でも言われていたのですが、「『できる？』と聞かれたらベンダーの営業は『できる』と答える。」に決まっているわけで、本当に要求を満たすものであるかは実際に開発してみないとわからないものですよね。
    コロナの影響で直近は開催できていないそうですが、次回があればぜひ参加したいと思いました。</dd>
</dl>

## 総括
+ ローコードツールってB2Bの比較的クローズドな印象で、ちょっと試したい！ができなかったり、ちょっとしたことでも資料請求しないとわからなかったりします。
そういった中でローコード開発コミュニティが提供してくれている情報は限定的ではあれど貴重な情報源だと思いました。
しかし世界で広く使われているツール(Bubble、Adalo、Outsystemsなどなど)はオープンな環境にあり、個人でも簡単に使うことができます。そして多くのフィードバックを得て成長し、独自のエコシステムを築いている物もあります。（中にはクローズドなものもありますが）
国内のツールももっと気軽に使えて、気軽に情報を得られるようになるとありがたいと思います。

+ DB設計の話を聞いて改めて思いましたが、ローコード開発はあくまで"開発"であり、"開発"において大事なことはローコード開発でも重要なはず。
ローコードでもDB設計は重要だし、ローコードでもリーダブルであることは重要だし、ローコードでも共通化は重要。もちろんローコードだとできないことも多々あります。静的解析ツールがなかったり、コーディング規約のベースとなるものもないことが多いでしょう。デザインパターンはもちろん共通化も実現できることは限定的かもしれません。
しかしそれらは確実に"重要"であること間違いありません。クリーンなアーキテクチャを保つすべが限定的であるからこそ、通常の開発以上にアーキテクチャを意識する必要があると感じます。
Webフロントエンドのプロを目指すためのコミュニティ - Frontier

https://zenn.dev/frontier/articles/20220424-hello-zenn のクロスポストです。

---

![](https://frontierjs.herokuapp.com/ogp.png)

[Frontier（フロンティア） | フロントエンドのプロを目指す学習コミュニティ](https://frontierjs.herokuapp.com/)

## Frontier とは

Frontier（フロンティア）は JavaScript を中心として、Web のフロントエンド領域を学習したい方のためのオンラインコミュニティです。

## コミュニティを作ろうと思ったきっかけ

[LINE オープンチャット](https://openchat-jp.line.me/) をご存知でしょうか。

ここではさまざまなテーマで作成されたトークルームに入り、大勢のメンバーと議論をすることができます。LINE のアカウントを使いますが、トークルームごとに個別の名前を設定できるため、匿名性が担保されています。

筆者もこのオープンチャット上でプログラミングに関するトークルームに入っていたのですが、オープンチャットの性質上、議論がしにくいと感じることが多々ありました。

オープンチャットにはトークルームに Slack や Discord でいうところのチャンネルという概念がないため、単一のスレッド上で会話が進みます。そのため、複数の質問が飛び交う際に最初の質問が忘れ去られたり、1 つの話題に対して深堀りする時間が取れなかったりするという問題がありました。

Frontier では Discord 上にコミュニティを作成していますので、この問題は発生しないはずです。

### サブトピック - コミュニティの非中央集権化

LINE オープンチャット上で筆者が参加していたプログラミングのコミュニティは、トークルームを管理する中央集権的な管理者が不在でも割とうまく回っているように見えました。筆者はいくつか他のオープンチャットのトークルームに属していましたが、他のコミュニティは割と管理者が明確にルールを定めていることが多かった印象があります。

筆者が知る限りでは、そのプログラミングのトークルームを作った人は早々にそのトークルームに関わらなくなっていました。その後は何度かサブの管理者としての共同管理者が変わりつつ、たまに発生する荒らしを排除するために共同管理者が動くくらいで、明確なルールは誰も定めないままコミュニティが形成されていっていました。

これは、最近何かと話題のいわゆる Web3.0 の文脈における [DAO（分散型自立組織）](https://ethereum.org/ja/dao/) と非常に似ているな、と思いました。個人的なサブのテーマとして、Frontier ではこのように中央管理者がいなくとも回るようなコミュニティ運営を目指していければな、と密かにたくらんでいます。

そのため、あまりこのコミュニティでは自分という存在を公に出さずにひっそりと運営に携わることができればな･･･と考えています。とはいえ、自分という存在を完全に隠しきろうとすると、運営上何かと面倒なこともあるので完全に匿名でやりきるのは一旦はやめることにしました（ちょっとやりたかったので残念ですが、笑）。

## このコミュニティで実現したいこと

筆者自身、普段は Web のフロントエンドの開発をメインに行なっており、フロントエンドに関わる人が多くなると良いな、と感じています。そのため、このコミュニティ上ではフロントエンドに関する技術について話したり、技術を学ぶ中で出てきた不明点を質問できるような場を提供したいですね。

将来的には何かしら学習コンテンツを提供したり、輪読会などのイベントを開催したりしたいなと思っていますが、それはコミュニティのメンバーとも相談しつつ、様子を見て決めていければなというところです。

## さいごに

コミュニティの参加時ですが、ちょっとした遊び心としてクイズを設けています。主に JavaScript を中心として、Web のフロントエンドに関する設問がメインで、正答率によって Discord にて権限を割り振るようにしています。

以下の公式サイトから登録後、クイズに回答し、コミュニティに招待されるという流れになっているので、気になった方はぜひご確認ください 🙌

[Frontier（フロンティア） | フロントエンドのプロを目指す学習コミュニティ](https://frontierjs.herokuapp.com/)
emfファイルのススメ

## 結論
gnuplot などで作成した `eps` ファイルをパワポや Word で使いたい場合、`emf` ファイルが便利です。`emf` ファイルは `eps` と同じく拡大しても画質が落ちません（ベクター画像）。

## emf ファイルの作り方

ブラウザ上で変換する converito が便利です。手軽に変換が可能です。

https://convertio.co/ja/eps-emf/

もし、PC に Inkscape が入っているならば、Inkscape で変換するのも手かもしれません。

https://eguweb.jp/inkscape/10870/

## 作ったら
作成した `emf` ファイルは、パワポにドラッグ＆ドロップなり挿入なりでスライドに入れることができます。gnuplot から作成した `eps` ファイルを `emf` ファイルに変換した場合、背景が白色でない、すなわち透明であることに違和感を覚えるかもしれません。もし背景が白の方がいい、と言う場合は、挿入した `emf` を `ctrl + x` にて切り取り、`ctrl + alt + v`にて、形式を選択して挿入しましょう。透過を許さない `jpg`として再貼り付けしてやると、背景が白色になります。ただし、そのときの`jpg`はやや荒くなるかもしれません（ラスター画像）。 


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2536951/4ea44adf-f5a4-0260-1e7e-00c30d2cb4fe.png)
パワポで、右は `emf` ファイルを、左は GsView にて開いた `eps` をペーストしたやつ。一見変わらないようですが…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2536951/0faa1ba4-dbcd-7644-7019-46b64665daa9.png)

拡大すると、やはり `emf` の方が画質はいいですね。パワポにかぎらず、[Word に貼り付けるときも `emf` にしたほうが良さげ](http://www.yamamo10.jp/yamamoto/comp/MS_Office/figure/index.php)です。論文投稿する際などは、特にその辺に気をつけてみては。