OmniAICreator/Qiita-1.07M huggingface dataset:
【3D OD Stereo】Expandable YOLO : RGB-Dカメラで3D Object Detection


<h1>Expandable YOLO: 3D Object Detection from RGB-D Images*</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/8dcdf793-65f9-216a-d720-fbbf7657cdb5.png)
入力がRGB-Dの4channelのImageで出力が(conf,x,y,z,w,h,d)の7channel

・入力のRGB-DにはRealsenseを使っていた。StereoでDepthを推定しても動く。
・出力に何故かOrientationがない
・44.4FPSという恐ろしい速さ

<h1>結論</h1>
・3次元展開していないDepth Mapを使ったシステムだと恐らく精度はそんなに良くは出ないだろう。
・2Dに落とし込んだことで速い。

<h1>参考文献</h1>
Expandable YOLO: 3D Object Detection from RGB-D Images*
https://arxiv.org/pdf/2006.14837v1.pdf
pip install tensorflow==1.x がエラーになるとき

# pip install tensorflow==1.x ができない

こんなエラーになるとき

```bash
python -m pip install tensorflow==1.15
ERROR: Could not find a version that satisfies the requirement tensorflow==1.15 (from versions: 2.2.0rc3, 2.2.0rc4, 2.2.0, 2.2.1, 2.3.0rc0, 2.3.0rc1, 2.3.0rc2, 2.3.0, 2.3.1, 2.4.0rc0, 2.4.0rc1, 2.4.0rc2, 2.4.0rc3, 2.4.0rc4)
ERROR: No matching distribution found for tensorflow==1.15
```

# 原因
Pythonのバージョンが合っていないことが原因の可能性が高いです。

例えばPyPIのtensorflow 1.15.4 のページ↓を見ると、tensorflow 1.15.4 が用意しているパッケージはpython 3.5, 3.6, 3.7 用しか提供されていません。
https://pypi.org/project/tensorflow/1.15.4/#files


なので、Python 3.8や3.9でpip installしても対応するパッケージがないので入りません。


# 解決方法
Pythonのバージョンをpython 3.5, 3.6, 3.7にすればインストールできます。

```bash
# バージョン確認
$ python --version
Python 3.7.9

# インストール
$ python -m pip install tensorflow==1.15
///省略

# 確認。モジュールはあることが確認できる
$ python -m tensorflow
/.../bin/python: No module named tensorflow.__main__; 'tensorflow' is a package and cannot be directly executed
```

# 参考
https://github.com/tensorflow/tensorflow/issues/34302
「すみません家NW不安定です」、Slack(社外)をMattermost(社内)に転記しよう。


# はじめに

「●●さん、今Skype入るのでちょっとまってください」
「あー、▲▲さんのクライアントフリーズしちゃったので先に進めてましょう」
そんなオフィスでの一コマは、全社テレワークにより過去となりました。

隣にいる人が察して一報を入れてくれる、それは同じ場所にいるからできたことでした。
テレワークとなり、自宅のNWが不安定などで数分音信不通になることはないでしょうか。

そんなとき、みなさんはどうされてますか？

数分程度の不調では、なかなか上司や同僚へメール・電話とはならないのではないでしょうか。
かといって、自分に起きてることをサクッと通知したい。ぼやきたい。

そんな経緯から、ゆるっとサクッと通知する方法として
Slackにぼやいた内容を社内Mattermostに転記しようと考えました。

# やったこと

1. 社内Mattermostに転記先チャンネル(Slack2Mattermost)を作る。
2. Slack2Mattermost宛のincoming webhookを作成する。
3. Slackに転記元のグループ⁽もしくはチャンネル⁾を作成する。
4. Slackのトークンを作成する。
5. Slack→Mattermostの転記スクリプトを作成する。(Python)
    * Mattermostに転記する。（転記時、Slackのユーザ名とMattermostのユーザ名を置換する）
    * 転記済のマーキングとしてリアクション絵文字をSlackのPOSTにつける。
6. cronでスクリプトを定期実行する。


# 結果

こんな感じです。
![ICOPY_20201210_172148.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255407/5e0f0191-2959-366c-1b00-da61d1410aab.png)

※カナリア＝私用PCのラジコストリーミング　NW不安定の指標替わりに使用しています。

# これから

記載の転記botはまだ上司に伝えていません。
というのも、人によって良く情報収集するチャンネルが異なり
私はMattermost鬼推しtwitter状態ですが、上司はそれほどでもないので
達成したかった「ちょっとした伝達」にはなり得ないところが、なかなか難しいなと。

実装について、Mattermost→Mattermostで試作した後
Slack→Mattermostで実装しましたが、APIの仕様が全く違ったため面くらいました。
MattermostはSlackクローンですが、APIの世界では大きく異なることを知ることができました。
今後は他のSlack APIも試してみたいと思います。

# おわりに

**キーボードが固まってます。**といつかPOSTしたい（猫アレルギー）。

![shigoto_zaitaku_cat_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255407/98c5b33d-b10f-9562-4e88-9167ac69bf32.png)

以上です、ありがとうございました。
【TODO アプリ】プログラミング初心者が最初に作ったwebアプリ

<h1>1.はじめに</h1>
この記事のターゲットは<b>「駆け出しエンジニア」</b>もしくは<b>「エンジニアを全くしらない超初心者」</b>向けです。
特に以下のような悩みを抱えている方の悩みを解決できると思います。
<ul>
<li>プログラミング始めたばっかりだけど何を作ればいいかわからない</li>
<li>JavaScriptでできることとは</li>
<li>そもそもwebアプリってなんだろう</li>
</ul>

<h1>２.著者紹介</h1>
冒頭ですごく偉そうなことを言っていますが本記事の著者はプログラミングを初めて１ヶ月の<b>「超初心者」</b>です。
スキルセットとしては以下のような感じです。
<ul>
<li>HTML&CSSがだいたい分かる（progateで一周）</li>
<li>JavaScriptは全然わからない（progateで一周）</li>
<li>ちょっとしたデータサイエンスに関する知識</li>
</ul>
簡単に言うとまだまだポンコツです。

<h1>３.アプリ概要</h1>
【ホーム画面】
![スクリーンショット 2020-12-12 20.58.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896551/4d870487-a790-2e31-f87d-db26e17a88ae.png)

<h2>使い方</h2>
<ul>
<li>入力フォームにタスクを入力</li>
<li>タスクを「add」する</li>
<li>タスクが終了次第「done」ボタンを押す</li>
</ul>
<h1>４.作成理由</h1>
「アウトプット型の学習をしたかったから」です。

人間は基本的に【アウトプット：７・インプット：３】の学習がもっとも効果的だと言われています。そのため、progateなどのインプット中心の学習を手早く済ませて自分でwebアプリを作ってみたいと考えていました。
そこで「HTML、CSS、JAVASCRIPT」のすべてがまんべんなく理解できるTODOリストに挑戦することにしました。

<h2>作成期間</h2>
・２日間

<h1>５.設計</h1>
<b>
TODOアプリ（フォルダ）
├── index.html
├── style.css
├── app.js
</b>

<h1>６.使用技術</h1>
フロント：HTML、CSS、JavaScript
データベース：PostgreSQL
バージョン管理：Git hub
エディタ：VSCode

【ソースコード】
https://github.com/ShinKitayama/practice.git
<h1>７.機能</h1>
<b>
１.タスクの追加
２.タスクの消去

<h1>８.苦労した点</h1>
<ul>
<li>学習したことがない技術の導入</li>
<li>１からの学習</li>
<li>予期せぬエラーへの対処</li>
</ul>

<h1>９.反省点</h1>
<ul>
<li>一つのエラーに対処するのにすごく時間がかかった</li>
<font color="Blue">【解決策】技術に関する二次情報でなく、一次情報を探す</font>
<li>全て思いつきで機能を実装した</li>
<font color="Blue">【解決策】コーディングする前から設計を考えておく</font>
<li>見たことないコードに焦った</li>
<font color="Blue">【解決策】経験するのみ</font>
</ul>
<h1>1０.まとめ</h1>
今回私は初めて自分でwebアプリをを作成して見て大変だなあと感じた一方ですごく学びのある経験になりました。
最後に、予想される読者の悩みについて再度確認していきます。

<ul>
<li>プログラミング始めたばっかりだけど何を作ればいいかわからない</li>
<font color="Blue">→TODOアプリを作りましょう</font>
<li>JavaScriptでできることとは</li>
<font color="Blue">→「TODOアプリ、ブログ、カレンダー、クイズゲーム」画面の中で動作するものです</font>
<li>そもそもwebアプリってなんだろう</li>
<font color="Blue">→Webサイトの中でも多機能で、コメントやデータの加工、商品の購入などができる、インタラクティブなもの（今回私が作成した簡単なTODOリストもwebアプリです）</font>
</ul>

次は簡単なゲームを「HTML、CSS、JAVASCRIPT」で作成しようと思います。
Railsのモデルのpolymorphicの使い方

# はじめに
モデルのpolymorphicに関してちょっとまとめます

# マイグレーションファイルの作成

commentモデルを下記の様に作成します。

```ruby
class CreateComments < ActiveRecord::Migration[6.0]
  def change
    create_table :comments do |t|
      t.references :target, null: false, polymorphic: true
      t.text :body, null: false

      t.timestamps
    end
  end
end

```

`t.references :target, null: false, polymorphic: true`これによって、`target_type`と`target_id`カラムが追加されます。

`target_type`には対象のモデル名が入り、`target_id`には対象のデータのidが入ります。
これによって、どのモデルとでも関連を結ぶことができます。

# モデルファイルの修正

commentモデルとuserモデルが紐づく場合

commentのモデルファイルには

```ruby
class Comment < ApplicationRecord
  belongs_to :target, polymorphic: true
end

```

と記載し、userのモデルファイルには

```ruby
class User < ApplicationRecord
  has_many :comments, :as => :target
end
```

と記載します。

# データの作成


```ruby
user.comments.create(body: 'hello')
```

この様にしてデータを作成できます。

もちろん、別のモデルでも`has_many :comments, :as => :target`と記載するだけで、紐付けをすることができるので便利です。


# 終わりに

active storageに関してもこのポリモーフィックを使って、どのモデルに対しても画像を紐付けれる様にしています。
オセロの盤面 上から見るか 斜めから見るか

# はじめに
オセロアドベントカレンダー2020も残り1週間となりました。
3日目の記事「[【withコロナ】超リアルな対局サイトをビデオ通話付きで実現する](https://qiita.com/tanaka-a/items/b04b0d16155a491de6e9)」で斜めから盤を見たときの石の座標の計算が雑なままとなっていました。本記事では、この計算をきちんとやってみたいと思います。

なお、タイトルの元ネタはフレーズだけ聞いたことがあるものの何なのか全く知らなかったので、ググってみたところテレビドラマだったようですね。上から見たときについては特に書くべきことはないと思いますので、斜めから見たときの話だけをすることにします。

# 盤面を斜め上から見る
盤面を斜め上から見たいのですが、色々と計算が大変です。そこで少しでも計算の労力を減らすため、斜め上から見るのでなく、真上から見て盤面を傾けるというアプローチで計算したいと思います。

具体的には以下のような座標と盤で考えましょう。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202945/49e549ec-c3d3-4a6b-3035-752733d9601f.png">

xy平面上にあった盤面を、x軸を回転軸として角度$\theta$だけ傾けます。

すると、盤面上の点$(p,q,0)$は以下の点に移動することになります。
$$(p,q\cos\theta,-q\sin\theta)$$

視点を$(0,0,a)$、投影面をxy平面とすると、上記の点と視点を結んだ線分とxy平面の交点を求めれば良いことになります。下の図はyz平面です。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202945/68015a6f-7861-f9c6-02e9-854493cd8efd.png">

計算はちょっとややこしいですが、直線の方程式なので地道に計算すると、求める投影面上の点は以下のようになります。

$$\left(\displaystyle\frac{ap}{a+q\sin\theta},\frac{aq\cos\theta}{a+q\sin\theta},0\right)$$

pとqそれぞれ-4から4までが盤面上の格子点になります。これで「[【withコロナ】超リアルな対局サイトをビデオ通話付きで実現する](https://qiita.com/tanaka-a/items/b04b0d16155a491de6e9)」の記事で懸案となっていた石の座標の求め方がわかりました。

# 描いてみる
pとqを-4から4まで動かしてみると盤面を描くことができます。pythonのmatplotlibで描いてみました。aとth($\theta$)の値を変えると視点や角度を変えることができます。

```python
import math
import matplotlib.pyplot as plt

a = 15
th = 60 / 360 * 2 * math.pi

# 元の点(p,q)に対応する投影面上の点を求める
def projection(p, q):
    return a * p / (a + q * math.sin(th)), a * q * math.cos(th) / (a + q * math.sin(th))

plt.figure(figsize=(8, 8))
plt.xlim(-6, 6)
plt.ylim(-6, 6)

for i in range(-4, 5):
    # 縦方向の線
    x0, y0 = projection(i, -4)
    x1, y1 = projection(i, 4)
    plt.plot([x0, x1], [y0, y1], 'k-', lw = 2)

    # 横方向の線
    x2, y2 = projection(-4, i)
    x3, y3 = projection(4, i)
    plt.plot([x2, x3], [y2, y3], 'k-', lw = 2)

plt.show()
```

描いた結果は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202945/a761de29-4260-1640-8a02-3eeb9d63f1dc.png)

奥の方から手前にかけて段々線の間隔が広がっていることに注意してください。

# 石の問題
「[【withコロナ】超リアルな対局サイトをビデオ通話付きで実現する](https://qiita.com/tanaka-a/items/b04b0d16155a491de6e9)」の記事では、石はPOV-Rayで作成した画像で用意したので特に問題なかったのですが、石の円が斜めからみるとどうなるかも気になります。

これについても計算してみようと思ったのですが、実はこれはかなり難しい問題であることがわかりました。結果的には楕円になるのですが、長軸と短軸が少し傾いていたりなど、一筋縄ではいきません。
円を投影したときの話については、パースフリークスというサイトに記事がありましたので、興味のある方は読んでみてください。

- [円の性質](http://www.persfreaks.jp/main/circle/feature2/)
- [円](http://www.persfreaks.jp/main/math/circle/)

# おわりに
今回の記事はこれで終わりです。一応pythonの描画用ソースコードを入れてそれっぽくはしてみましたが、ほぼ数学の記事になってしまいました。
今年のオセロアドベントカレンダーの私の記事はこれまでとなります。あと1週間、どんな記事が公開されるか楽しみですね。では良いお年を！
Ruby の変数は箱じゃない

Ruby の初心者向けの記事で

> 変数とは値を入れる箱のようなものです

とか

> 変数とは名前の付いた箱です

といった記述を非常によく目にします。

しかし，Ruby の場合，変数を箱のアナロジー（類推）で捉えようとすると困ったことになります。

以下のコードを見てみましょう。

```rb
a = "Ruby"
b = a
a.upcase!

p a # => "RUBY"
p b # => "RUBY"
```

1 行目で，ローカル変数 `a` に文字列 `"Ruby"` を代入しました。
2 行目で，その `a` の値をローカル変数 `b` に代入しました。
3 行目で，`a` の値である文字列オブジェクトを破壊的に大文字化しました。
そして，`a` の値と `b` の値を表示させました。
どちらも大文字の `RUBY` が表示されました。

これは，`a` の値と `b` の値が**同じオブジェクト**であることを意味しています。
「同じ」というのは「内容的に同じ」という意味ではありません。`b` の値は `a` の値**そのもの**ということです。
「完璧に同じ姿をした二人の人物」ではなく「同一人物」ということです。

いったい，二つの箱の中に**同時に**一つの物体が入っている，などということが想像できるでしょうか。
これは箱のアナロジーが破綻していることを意味しています[^dp]。

[^dp]: 私はこのことをよく「[ドッペルゲンガー](https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%83%E3%83%9A%E3%83%AB%E3%82%B2%E3%83%B3%E3%82%AC%E3%83%BC) かい」と言っています。

アナロジーというものは，〈よく理解している似たもの〉を持ってきて，その類似性を手がかりにして〈よく知らないもの〉を理解したり推し量ったりすることですね。
このとき，何もかも似ている必要はなくて，違っているところがあっても構いません。しかし，その違っている部分のために理解に支障をきたすのであれば，そのアナロジーは適切ではなかったということになります。
Ruby の変数の箱のアナロジーは混乱を招くと私は考えています。

ではどのようなアナロジーならいいのでしょうか。
私は「名札」を推します。

代入とは「オブジェクトに名札を紐付けること」です。まあ，木の札に名前が書いてあって，そこからひゅるひゅると紐が伸びていてその先に物体が括り付けられている様子でも思い浮かべてください
変数の値とは「名札に紐付いたオブジェクト」です。
一つのオブジェクトにはいくつでも名札を紐付けることができます。
しかし，一つの名札を同時に複数のオブジェクトに紐付けることはできません。

上に掲げたコードは以下のように表現できます。

1 行目：文字列オブジェクト `"Ruby"` に名札 `a` を紐付けました。
2 行目：名札 `a` に紐付いたオブジェクトに名札 `b` を紐付けました。
3 行目：名札 `a` に紐付いた文字列オブジェクトを破壊的に大文字化しました。

二つの名札には同じオブジェクトが紐付いているので，表示させるオブジェクトをどちらの名札で指定しても，当然同じ結果になります。
ActiveRecordで生SQLを実行して結果を配列にキャストする

※ Railsのバージョンは5.2を想定

1. 何はともあれ生SQLを実行するコードを書く

    ```ruby
    result = ActiveRecord::Base.connection.select_all('SELECT x_id as id FROM users')
    ```
1. 取得結果から配列にしたいSELECT結果を指定して抜き出し、新たな配列を生成する
    
    ```ruby
    ids = result.map { |h| h['id'] }
    pp ids
    # [1, 2, 3, 4, 5, 6, 7]
    ```
GigalixirでPORTを4000以外の値にするのはだめよ (Elixir)

この記事は [Elixir その2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir2) 13日目です。
前日は [String.replace/3 (Elixir)](https://qiita.com/torifukukaiou/items/71f4b80d8f7dddf87293) でした。

---

# はじめに
- [Elixir](https://elixir-lang.org/)楽しんでいますか！
- [Phoenix](https://www.phoenixframework.org/)でWebアプリケーション作ったら、[Gigalixir](https://www.gigalixir.com/)にデプロイするのが簡単です
    - [Deploying on Gigalixir](https://hexdocs.pm/phoenix/gigalixir.html#content)
    - 手前味噌ですが、[Hello Gigalixir (Phoenix/Elixir)](https://qiita.com/torifukukaiou/items/d2d0e9f56ffe3bb8eda1)
- **[Phoenix](https://www.phoenixframework.org/)アプリケーションをdeployした場合、環境変数`PORT`を4000以外の値で設定追加すると`Unhealthy`になってしまいます**

# `PORT`を3000にする設定を追加してみます

![スクリーンショット 2020-12-12 21.24.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/dcd495da-46be-87c4-3ac7-3d465f862028.png)

- `Unhealthy`になっちゃいます

![スクリーンショット 2020-12-12 21.25.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/d52609fb-2be6-0823-b5f4-9fabe7c033e2.png)

- `PORT`を4000へUpdateしてみましょう
- `Healthy`に戻ります

![スクリーンショット 2020-12-12 21.27.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/7fb2b1ff-1650-9664-fa0e-d470f60ed5bf.png)

# [Gigalixir](https://www.gigalixir.com/)のドキュメント
- ここが該当します
    - [https://gigalixir.readthedocs.io/en/latest/troubleshooting.html#id1](https://gigalixir.readthedocs.io/en/latest/troubleshooting.html#id1)

> Our health checks simply check that your app is listening on port $PORT. If you’re running a non-HTTP Elixir app, but need to just get health checks to pass, take a look at https://github.com/jesseshieh/elixir-tcp-accept-and-close

- [Phoenix](https://www.phoenixframework.org/)アプリの場合、[Gigalixir](https://www.gigalixir.com/)のほうで環境変数`PORT`が4000に設定されていることを期待しています
- だから`PORT`を4000以外の値で、利用者自身が書き換えてしまうと`Unhealthy`になっちまうという流れです

# Wrapping Up :christmas_tree::santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5::christmas_tree:
- [Gigalixir](https://www.gigalixir.com/)で環境変数`PORT`に443を設定して、アプリは動いているんだけどヘルスチェックが失敗しているなあ、なんだろうなあ :thinking: と考え込んだことがありました
- `PORT`は4000以外にしちゃだめよ
- Enjoy [Elixir](https://elixir-lang.org/)!!! :rocket::rocket::rocket::rocket:
- 一息つきます
- @mnishiguchi さん続きお願いします
ArmのMacでiTerm2の設定

# 環境

- macOS Big Sur バージョン 11.0.1 MacBook Air (M1, 2020)
- iTerm2 3.4.3 （しばらくはRosetta2を使用）

# iTerm2の設定

## Rosettaを使用して開く
Homebrewなど，まだまだApple Siliconのarmアーキテクチャに対応していないので，しばらくの間はターミナルはRosetta2を利用して運用する．

Finderからアプリケーションディレクトリを開き，`iTerm.app`を右クリックして`情報を見る`をクリック．`Rosettaを使用して開く`にチェックを入れる．

以後，起動するとRosetta2が使用されて，今までのintelの`x86_64`のソフトが利用できる．iTerm2を起動して，次のコマンドを実行して，`x86_64`と表示されてばRosetta2が使用されている．

```
$ uname -m
x86_64
```

## Preferences

### General

#### Closing
- `Quit when all windows are closed`にチェック．

### Appearance
#### Tabs
- `Show tab bar even when there is only one tab`にチェック．

### Profiles
#### Colors
- 右下の`Color Presets...`のプルダウンから`Tango Dark`を選択．
- 背景色が黒すぎるので，`Backgroud`を`20% Gray`に変更．

#### Text
あとでプログラミングのフォントとしてよく使われるRictyをインストールして，ここでフォントをRictyに変更する．

#### Window
- だいたい画面いっぱいになるように`Setting for New Windows`のところで，`Columns: 193`，`Rows: 48`に設定．

#### Terminal
- `Scrollback lines: 10,000`に設定．
- sshの接続先などで勝手にlocaleを変更しないように，`Set locale variables automatically`のチェックを外す．

#### Keys
ターミナル上でEmacsなどを扱うときにMetaキーが無いと困るので，左右のoptionキーを`Esc+`として設定する．`Meta`ではなく`Esc+`にしないだめ．

- `Left Option Key: Esc+`
- `Right Option Key: Esc+`

### Pointer
#### Bindings
ペーストを2本指クリックでできるように変更．ついでにtabは空白4文字で貼り付けされるように設定する．
`Paste from Clipboard:`のことろをダブルクリックすると設定画面が出てくる．
 
- `Button/Gesture: Right Button`に変更．
- `Convert tabs to spaces: 4`にチェック．
`brew bundle --install`で特定のpackageをskipする方法


# How to
```
export HOMEBREW_BUNDLE_BREW_SKIP="foo bar"
export HOMEBREW_BUNDLE_CASK_SKIP="vaz"
export HOMEBREW_BUNDLE_MAS_SKIP="qux"
export HOMEBREW_BUNDLE_TAP_SKIP="quux"
```
[Consult a "bounce list" of formulae to skip](https://github.com/Homebrew/homebrew-bundle/pull/486)

# 対象
- 複数の環境で`.Brewfile`を共有している
- 特定のpackageに関するErrorを一時的に無視したい
    - 例）すでにインストール済みでindexから削除されたpackage


# その他試したこと
- [Homebrew Bundle#Usage](https://github.com/Homebrew/homebrew-bundle/blob/master/README.md#usage)の通りに`unless`を用いたが，`brew bundle --install --cleanup`時に条件が満たされuninstallされてしまうため却下．


# その他参考 

-  [foo, bar, baz の続き](https://qiita.com/ka_/items/3727c3f16dc69fed935c)
groupdateを使った際にGroupdate::Errorが出た話

##　はじめに
今回railsで簡単なグラフを作成する際にchartkickなどと一緒に使うgemのgroupdateを使った際に
出たエラー解決を備忘録として残します。
初学者のため間違えばあればご指摘頂けると幸いです。


##　Groupdate::Errorが出た
chartkickとgroupdateを無事導入しいざ実装と思った時にGroupdate::Errorの文字が、、、
bundleの確認やサーバーの再起動を試したが特に変化なし。

##　エラーが出た理由
エラー文を詳しく確認してみると
Groupdate::Error - Be sure to install time zone support - https://github.com/ankane/groupdate#for-mysql:
これはタイムゾーンサポートをこのURLからインストールしろと言われてました。

## 解決策
URL先でタイムゾーンサポートについての記述があり、そこで指定された以下のコマンドをターミナルで実行

```
$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
```

## 最後に
無事エラーは解消されグラフ機能を実装する事ができました！
エラー文は苦手意識があるのですが、しっかり読解しようとすれば案外解決方法を提示してくれてる場合が多いので今後はしっかりエラーと向き合っていきます！！
集約の整合性についてArchUnitを用いてテストする

「集約に含まれるオブジェクトは集約ルートからのみ依存される」ことをテストしてみる。

## テストコード

```java

@AnalyzeClasses(packages = "com.example")
public class DomainObjectTest {

    @ArchTest
    static ArchRule aggregate_object_be_depended_on_only_root_object =
        noClasses()
            .that().resideInAPackage("com.example")
            .should().dependOnClassesThat(new DescribedPredicate<>("domain.hoge") {
                @Override
                public boolean apply(final JavaClass clazz) {
                    return clazz.getPackageName().startsWith("com.example.domain.hoge")
                        && clazz.getSimpleName().equals("HogeRoot");
                }
            });
```

集約が特定のパッケージ配下に含まれている前提で、集約ルート以外のオブジェクトが他のクラスから依存されていないことをテストしている。

この場合だと、一時的な参照を渡すことも出来ないため、`dependOnClassThat`の代わりに`callMethod`を用いて判定しても良いかもしれない。
Grove Beginner Kit for Arduinoのマニュアル

Grove Beginner Kit for Arduinoをやってみようかな？と思っている方へ向けた、マニュアルの紹介です。

<img width="600" alt="109634/96b5d283-061b-08ec-0340-c8d9b557df3a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/96b5d283-061b-08ec-0340-c8d9b557df3a.png">

# Grove Beginner Kit for Arduinoとは？

Arduino Uno互換ボード（[Seeeduino Lotus](https://www.seeedstudio.com/Seeeduino-Lotus-V1-1-ATMega328-Board-with-Grove-Interface.html)）に、10個のGroveモジュールが同封されたArduino学習用キットです。同封といっても、個別の製品がひとつの箱に入っているようなパック商品ではなくて、1枚の基板にSeeeduino Lotusと10個のGroveモジュールが作りこまれています。個々のGroveモジュールはSeeeduino Lotusに結線された状態なので、Groveケーブルで接続する必要はありません。また、Groveケーブルも同封されているので、Groveモジュールを切り離して、必要なものだけをGroveケーブルでつなぐこともできます。（が、切り離した話は聞いたことがないです。）

Seeeduino Lotusは、Arduino Unoで採用されているATMEGA328Pと同じ（でもパッケージが違う）、ATMEGA328P-MUを搭載していて、Arduino Unoのスケッチやライブラリがそのまま利用できます。しかし、パソコンのUSBとATMEGA328Pを中継するインターフェイスチップが違うので、**パソコンに[CP2102のドライバ](https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers)をインストール**しなければいけません。

緑マルがATMEGA328P、赤マルがCP2102。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/b4439506-41b5-13a1-8b50-5dc29c7fd33b.png)

# マニュアル

学習用ってことで、wikiに長文のマニュアルがあります。

[Grove Beginner Kit for Arduino](https://wiki.seeedstudio.com/Grove-Beginner-Kit-For-Arduino/)

> wikiのメニューパスは、Grove > Others > Grove Beginner Kit for Arduino です。

同じものが[PDF](https://files.seeedstudio.com/wiki/Grove-Beginner-Kit-For-Arduino/res/Grove-Beginner-Kit-For-ArduinoPDF.pdf)でも提供されていますが、PDFだとスケッチをコピペしたときに変なところに改行が入ってコンパイルエラーになるとか、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/ace2d9ee-94ff-0177-1a86-0599325ea5ce.png)

スケッチが間違っている（滝汗）とか

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/a40b5714-bbe4-6802-99a7-1467ce3c927a.png)

あるので、**PDFは華麗に無視して、wikiを見る**ようにしましょう。

10つのレッスンがあって、解説を読みながら試すことで、Arduinoを使ったハードウェア制御を学べるようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/f35a0cba-e399-0972-8b77-ed610562ffac.png)

# おまけ

外装がたいへん破れやすくなっています。慎重に開けましょう。😢

<img width="600" alt="1abcd3a0-7572-c272-d5ff-0f3aa6d1043a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/1abcd3a0-7572-c272-d5ff-0f3aa6d1043a.png">


Enjoy!
BigQueryをなるべく安全に使うためにQuotas(割り当て)を設定する

# 最初に

「BigQueryで〇〇万円溶かした」なんてことをたまに聞くことがあり、BigQueryなんか怖いな、、という印象があります。
だけど、BigQueryはいいサービスだし、今のところ「**毎月1TBのクエリは無料**」で使えます（定額料金でなく、オンデマンドの場合）。すごくない？1TBだよ！
もう少し安全に使いたいな、と思っていたときに、**Quotas(割り当て)**の設定があることを知ったので、設定してみました。

# Quotas(割り当て)の設定

1. [IAMと管理] > [割り当て]をクリック
2. BigQueryでフィルタリング
3. [Query usage /日]を選択
4. [割り当てを編集]をクリック
5. Unlimitedのチェックを外し、[新しい上限]に設定したい量を指定
6. [完了]をクリック
7. [リクエストを送信]をクリック

![20201212-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112399/fd304237-73dc-405c-a631-ea85133bba0b.png)


1TBの範囲内で使いたかったので、1日当たりの使用量を0.03TiB(30GiB)に設定してみました。1ヵ月あたり1TBの範囲内で使えるはず。クエリ以外の課金もあるものの、Unlimitedとは安心感が違います。

割り当てを超えた場合のエラー
Custom quota exceeded: Your usage exceeded the custom quota for QueryUsagePerUserPerDay, which is set by your administrator. For more information, see https://cloud.google.com/bigquery/cost-controls

# 費用の予測

Quotas(割り当て)の設定とは関係ないですが、費用の予測も参考になります。
GCPのコンソールで費用の予測を確認することが出来ます。
あくまで予測ですが、目安になります。

1. [お支払い]をクリック
2. 請求先アカウントを選択
3. 「月末合計費用（予測）」の欄を確認
4. [レポートを表示]をクリックすると、更に詳細を確認することが出来る

# その他

- [BigQueryの料金](https://cloud.google.com/bigquery/pricing)
- [BigQueryで費用を抑える方法](https://cloud.google.com/bigquery/docs/best-practices-costs)
Bounded Contextを定義するヒント

## 目的
ドメイン駆動設計の本を読んでいると、たびたび出てくるBounded Contextですが、
(日本語だと、境界付けられたコンテキストと表現されます) 以下の情報は文献を読めば書いてあります。

 - Bounded Contextをシステム境界にするとよいだろう
 - この具体例だとここがBounded Contextと言えるだろう

しかし、実際に自分たちが扱っているドメインのBounded Contextを定義したい場合にその方法を書いてある文献はありません。
この記事を通して、みなさまのドメインのBounded Contextを定義する手助けをできればなと思います。

## Bounded Contextとは

Evans本で久々にBounded Contextの章を読み直しましたが、いい感じにまとまっている箇所があったので引用します。

> Explicitly define the context within which a model applies. Explicitly set boundaries in terms of team organization, usage within specific parts of the application, and physical manifestations such as code bases and database schemas. Keep the model strictly consistent within these bounds, but don't be distracted or confused by issues outside.

一言で表現するのは難しいですが、**Bounded Contextはユビキタス言語の境界であり、ドメインの境界であります。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561891/89befe2d-1a3e-5e50-edca-f3891cd43c36.png)

## そもそもBounded Contextを定義することの何が嬉しいの？

戦略的設計を行う際に、Bounded Contextに沿ってモジュール/サービスを分けることができたら、
**高凝集・疎結合**なまとまりになりやすいと言われています。

Sam Newmanさんの*Building Microservices*を読んだ方ならピンときたかもしれませんが、
マイクロサービスの境界の指針にもなります。
マイクロサービスと行かないまでも、サービスの境界を定義するときは高凝集・疎結合な単位でシステムを分割することができればお互いの依存が少ない形でシステムが構築できます。

モノリスをサービスに分割したい、というときや新しいドメインでシステムを作りたいというときにBounded Contextを定義できれば、それに沿ってサービスを作るように設計することで高凝集・疎結合なサービスへの順調な第一歩が踏み出せます。

## Bounded Contextを定義するヒント

さあ、Bounded Contextを定義するメリットは分かりました。
「結局どう定義すればいいの？」に対する具体的な回答は最後に書くとして、その際のヒントを以下に書きます。

 - Business Capabilityに着目する
 - ユビキタス言語の境界に着目する
 - アクターに着目する

#### Business Capabilityに着目する

*Business Capability* はそのビジネスが何をできるかを指す言葉です。
(日本語だとニュアンスが伝わりにくいので、英語文献でBusiness Capabilityについて記載がある記事をいくつか読めば感覚つかめると思います)
大きなドメインを小さいサブドメインに分けたいときに**そのビジネスが何をできるか**に着目して分けていけば、Bounded Contextを引くヒントになります。

#### ユビキタス言語の境界に着目する

例えば、同じ言葉で異なる意味を持つ言葉がある場合はBounded Contextを定義するヒントになります。
よく例に上がるのは"Account"という言葉です。扱うドメインの中で異なる意味で同じ言葉が使われている場合はユビキタス言語の境界があるということになります。

#### アクターに着目する

アクターもBounded Contextを定義する際のヒントになります。
例えば、会社の組織構造に着目すると「ほげほげ部」「ぴよぴよ部」等の部はヒントになります。
言われてみれば「ほげほげ部」の中で使われる「社内用語」ならぬ「部内用語」があるはずです。これはドメイン駆動設計では「ユビキタス言語」と言います。

## Bounded Contextの定義方法

いろいろ書いてきましたが、Bounded Contextを定義するにはずばり、


**正しい人を呼んで、全員で決める**

拍子抜けしたかもしれませんが、自分の現在の結論はこれしかないです。
正しい人というのはドメインエキスパートを含む、チームメンバーです。全員で議論して決めるものだと思います。

同じドメインでも「何が実現したいか」によってBounded Contextは変化してくると思います。
なので、一意に決まるようなものではなく、言ってしまえば正解もありません。
自分の記事で「見つける」という表現を敢えてしていないのはそういう意図です。
**「見つける」ものではなく、「決める」ものだと思っているからです。**

## チームでの決め方

議論を促進するように工夫をしてあげるのが大事だと思います。

 - 会議ではなく、ワークショップにする。
 - 大人数で集まっているなら半分ずつに分割して意見を吸いだす

などは実際に試してみて効果的でした。

また、*Domain Driven Design Distilled*の本の中でも紹介されている**EventStorming**という手法はワークショップの形式になっており、
チーム内の議論を活性化させるのに非常にいい手法なので、おすすめです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561891/27c04674-a757-63ea-8746-195172fea22f.png)



## おまけ

自分は最初、Bounded Contextを「見つける」ものだと思い、悶々としていました。
上で書いたように「もしかして、定義するものではないか」と解釈するようになってから、だいぶ気持ちも楽になったのと、
より主体的になれました。

具体的な定義方法は今の私から提示できませんが、この記事がだれかのヒントになれば幸いです。
Pythonの型（クラス）システム

Pythonの型（クラス）を扱う機能に関して調べてみて，面白かったので記事を投稿します．
[● Pythonの型（クラス）システム（PDF形式3ページ:395KB）](http://www.k-techlabo.org/www_python/Python_ClassSystem.pdf)
　（[Pythonのテキスト](https://qiita.com/KatsunoriNakamura/items/b465b0cf05b1b7fd4975)からの抜粋です）

　Pythonのオブジェクト指向プログラミング関連の機能はしっかりできているので，管理機能の全体とクラス階層を一度眺めてみる価値があると思います．
　あらゆる型（クラス）が「objectクラス」を頂点として整然と構成されている様子が面白いです．

● クラス階層を出力するサンプルプログラム：[getSubclasses.py](http://www.k-techlabo.org/www_python/getSubclasses.py)
　
オブジェクト指向プログラミング（OOP）の考え方は理解しやすいですが，非常に奥が深いものです．単に「動くプログラムが書ける」というだけではOOPの概念と目的，作法を十分に理解したことにはなりません．
[Pythonのオブジェクト指向に関して大変に良い記事](https://qiita.com/kaitolucifer/items/926ed9bc08426ad8e835)を[@kaitolucifer](https://qiita.com/kaitolucifer)さんが投稿してくださっていますのでお勧めします．
「図で見るソートアルゴリズム（C言語 / Java / VBA / Python）」を参考にWolframAlphaでやってみた。

(オリジナルポスト)
https://qiita.com/t-yama-3/items/8fa2d5608d14aeb9eb50

##SymPy Liveで
https://live.sympy.org/	
勉強中。教えて下さい。



##WolframAlphaで、sort
入力
sort 4, 6, 9, 7, 4, 2, 8, 0, 3, 2, 
出力
{0, 2, 2, 3, 4, 4, 6, 7, 8, 9}

https://ja.wolframalpha.com/input/?i=sort+4%2C+6%2C+9%2C+7%2C+4%2C+2%2C+8%2C+0%2C+3%2C+2%2C+&lang=en

##WolframAlphaで、並び替え
漢字は、並び替えしてくれない

入力
並び替え 4, 6, 9, 7, 4, 2, 8, 0, 3, 2, 

https://ja.wolframalpha.com/input/?i=%E4%B8%A6%E3%81%B3%E6%9B%BF%E3%81%88+4%2C+6%2C+9%2C+7%2C+4%2C+2%2C+8%2C+0%2C+3%2C+2%2C+&lang=en
テーブルのロック（と注意点）

##はじめに
更新対象のテーブルまたは行に対してロックをする方法を試したのでメモ。

##テーブルロック
指定したテーブル全体をロックします。
MODEによってロックする範囲が変わります。

```
LOCK TABLE テーブル名 
IN ロックのMODE 
MODE [ WAIT [ 待機時間 ] | NOWAIT ]
```

ロックのMODEはいくつか種類があり、以下いずれかを指定します。
・ROCK SHARE
・SHARE UPDATE
　ロックされたテーブルへの同時アクセスは可能。
　排他アクセスのためテーブル全体をロックはできません。
・ROW EXCLUSIVE
　挿入(INSERR)、更新(UPDATE)、削除(DELETE)の実行時に自動でロックされます。
・SHARE
　ロックされたテーブルへの同時アクセスは可能。
　ロックされたテーブルへの更新はできません。
・SHARE ROW EXCLUSIVE
　ロックされたテーブルの行を見ることは可能。
　SHAREでロックはできません。
　ロックされたテーブルへの更新はできません。
・EXCLUSIVE
　ロックされたテーブルへの同時アクセスは可能。
　他挿入(INSERR)、更新(UPDATE)、削除(DELETE)はできません。

※正直、EXCLUSIVEしか使用したことがないので間違いがあるかもしれません…
　確認後修正します。

MODEに記載するWAITとNOWAITとはロックをしたテーブルに対して更新や削除を行ったときに
・WAIT：ロックが取得できるまで何秒待機するか指定できます。
・NOWAIT：即時にエラーメッセージを表示します。
という違いがあります。
WAITもNOWAITどちらも記載しなかった場合には無限に待機します。

##使用例
Sample_T テーブルに対してロックを取得します。
この場合、他機能等からロックをしようとするとエラーが発生します。
すでにロックがされているテーブルに対してロックをしようとします。

```
LOCK TABLE Sample_T
IN EXCLUSIVE
MODE NOWAIT
```

すると以下のようなエラーが返されます。

```
ORA-00054: リソース・ビジー。NOWAITが指定されているか、タイムアウトしました
```

##テーブル行ロック
先ほどのテーブル全体をロックするのではなく、指定した行のみをロックします。
テーブルデータが数件しかない場合はテーブルロックでもよいかもしれませんが
データ件数が何百万ある場合や複数の人が対象のテーブルを操作する場合にはロックする行を指定する方がよいかも入れません。

```
SELECT 列名
FROM テーブル名
WHERE 条件
FOR UPDATE
[OF テーブル名.列名]
[ WAIT [ 待機時間 ] | NOWAIT ]
```

OFはテーブルを結合する場合に利用します。
今回は利用しなかったため、割愛します…。
WAIT、NOWAITは先ほどのテーブルロックと同じ意味となります。
NOWAITで発生するエラー内容も同様です。

PL/SQLの場合、SELECT文にはINTOが必要となります。
INTO句がないと以下のエラーが発生します。

```
PLS-00428: INTO句はこのSELECT文に入ります。
```

入ります。というよりは要りますよ、という意味だと思います。
そのためPL/SQLでこの行ロックを行う場合はSELECTで問い合わせた結果を変数に代入する必要があります。
また、変数だと問い合わせ結果が複数あった場合、0件だった場合にエラーとなります。
注意です。

##おわり
今回、行のロックの条件ではまったのでまた別記事でまとめようと思います。
ひとつの問題にはまったときにそもそも何がしたいのかという着眼点がずれるとはまりますねー。
最後まで見てくださりありがとうございました。
yamlファイルの書き方やと特徴

# はじめに
現在Railsを勉強中です。
アプリケーションを作成する上で、モデルやカラム、その他メッセージ等を日本語で出力したり扱いたい場面が必ずあると思います。自分の場合、すぐに忘れてしまうためその都度ググって、書き方合ってたかを確認しています。
ぶっちゃけYAMLファイルの仕様等を詳細に把握していなくても、問題なく作業が進むので今までないがしろにしてきましたが、今回は基本的な部分を調べて、アウトプットしようと思います。

## YAMLファイルの特徴
###  分かりやすさ
構造化されたデータを扱うためのフォーマットであり、目的はXML等と似ているが、「読みやすい」「書きやすい」「わかりやすい」という利点がある。

### 構造
インデントによって、階層の構造を表現している

## YAMLファイルで扱うデータ型
- スカラー(文字列・数値・真偽値 etc)
- シーケンス(配列)
- マッピング(ハッシュ)


## YAMLファイルの書き方

### スカラー
YAMLはデータ型を自動的に判別してくれる
数字を文字列で扱いたい場合は `'(シングルクォート)`もしくは`"(ダブルクォート)`で囲むと強制的に文字列として認識してくれる

```yaml
#数値
int1: 2
int2: 123,456

#浮動小数点
float1: 0.1

#NULL
nil1: nil
nil2: ~

#Boolean
bool1: true
bool2: false
bool3: yes
bool4: no
bool5: on
bool6: of

#日付
birthday: 1990-01-01
#タイムスタンプ
stamp: 2020-12-01 10:00:00 + 0900

#文字列
 str1:hoge
 str2:'true'
 str3:"333"
```

### 配列

行頭に`-`をいれることで、配列として扱うことが出来る。このときに`-`と値の間には`半角スペース`をいれること

```yaml

- Ruby
- Java
- PHP
```

### 出力用メソッド
以降の出力例でも同様のものを使用

```ruby
require 'yaml'

p YAML.load_file('test.yml')
```

出力結果

```ruby:yaml_test.rb
["Ruby", "Java", "PHP"]
```

半角スペースでインデントを入れると、配列をネストさせることが出来る

```yaml

- parent1
-
  - children1.1
  - children1.2
  - children1.3
  -
    - grandchild1.3.1
    - grandchild1.3.2
    - grandchild1.3.3
- parent2

```
出力結果

```ruby
["parent1", ["children1.1", "children1.2", "children1.3", ["grandchild1.3.1", "grandchild1.3.2", "grandchild1.3.3"]], "parent2"]
```

### ハッシュ
`:`で「キー:値」のように区切って記述する
おそらくこれが、railsで扱う中で一番多いパターンだと思います。

```yaml

name: 名前
age: 年齢
gender: 性別
address: 住所
```

出力結果

```ruby
{"name"=>"名前", "age"=>"年齢", "gender"=>"性別", "address"=>"住所"}
```
ハッシュに関しても半角スペースでインデントすることで、ネストさせることが可能

```yaml

music:
  rock: ロック
  pop: ポップス
  jaz: ジャズ
```

出力結果

```ruby
{"music"=>{"rock"=>"ロック", "pop"=>"ポップス", "jaz"=>"ジャズ"}}
```

### アンカーとエイリアス
YAMLではアンカーとエイリアスを仕様することで、対象の構造に対して参照することが出来る
`&name`でアンカーをつけ、`*name`で参照することができる。

Railsの `database.yml`などではデフォルトで使われている

```yml

default: &default
  adapter: postgresql
  encoding: unicode

development:
  <<: *default
```
ちなみにここで登場している `<<`を用いることでハッシュをマージ出来る。

```ruby
{"default"=>{"adapter"=>"postgresql", "encoding"=>"unicode"}, "development"=>{"adapter"=>"postgresql", "encoding"=>"unicode"}}
```

##### 参考文献
[プログラマーのための YAML 入門 (初級編)
](https://magazine.rubyist.net/articles/0009/0009-YAML.html#yaml-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
プロパティってなんじゃい？インスタンスって何じゃい？

プロパティについてのメモと、そこから引っ張ってComputedプロパティ（計算型プロパティ）のアクセサの必要性まで。

## プロパティとはなんぞや？
クラスや構造体(structで定義するやつ)、列挙体(enumのやつ)で定義することができる定数・変数のこと。

いろいろ種類はあるが今回はこの２つの違いについてから。

## 格納型プロパティ(Stored property)
```swift

struct Example {
  var A: Int
  let B: String
}
```

インスタンスの一部として定数や変数を格納するプロパティ。
###[補足]インスタンスって何じゃい？
オブジェクト、インスタンス、クラスとカタカナ語がごちゃごちゃしますがまとめるとこんな感じです。  

![IMG_3477.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935163/2e4eb7c8-1fc5-fe70-2c60-71cea9b61e01.png)  

オブジェクト指向言語は仮想ワールドにいろんな登場人物(これをオブジェクトとかインスタンスって呼んでる)を登場させて、それぞれにプロパティとか関数(メソッド)とかをくっつけてそれぞれのインスタンス(オブジェクト)の属性や操作を決めていきます。    

ちなみにオブジェクトはインスタンスだけではなくて、クラスのこともオブジェクトって呼ぶことがあるそうなのでオブジェクトって出てきたらクラスかインスタンスのどっちかの意味なんだろなと思ってもらえれば良いです。

![IMG_3478.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935163/44653acc-09b8-b22e-3f08-95636b4f7ec6.png)

これをコードで表すと以下。  

```swift
class teacher {
  let name:String
  var hp:Int

  init(name:String, hp:Int){
    self.name = name
    self.hp = hp

  func teach() ->
  func Shibaku() ->
  func Kireru() ->
  func Suneru() ->
}
}
```

※func 関数名　以下は適当です。  

こんな感じでコードを書いてコンパイルすると、インスタンス（オブジェクト）が爆誕します。  

で、話をプロパティに戻していくと、ここのnameやhpが格納型プロパティにあたり、上記のコードでは１番上のコードにはなかったinitと言う謎の文字を追加してありますが、これはイニシャライザと呼ばれ、クラスの属性を初期化しています。これをしないとエラーを出されてしまいます。  

##計算型プロパティ(Computed property)

特定の値を持っておらず、クラスコードがコンパイルされてインスタンスが生成されるたびに他のプロパティから計算されて値を取得、設定されるプロパティです。  
そしてこの「取得」には__getter__を「設定」には__setter__を使います。  
具体例をみながら説明していきます。以下のコードを見てください。  

```swift
class Circle {
  var radius:Double = 1.0
  var area:Double {
    get {
        return radius * radius * Double.pi
      }
    set(menseki) {
        radius = sqrt(menseki / Double.pi)
      }
  }
}
```

上記のradiusプロパティは格納型プロパティで、areaがgetとset（getterとsetterがあるので）を持つので__計算型プロパティ__となっている。  
ポイントはradiusの1.0のように値が格納されていない点で、以下のようにareaプロパティを呼び出すとgetの内容が実行されて出力される。  

```swift
let myCircle = Circle()

print("面積\(myCirclearea)")
//面積3.141592653589793
```

radiusの値を変えておくとgetの中のradiusも変化するのでareaの値も変わる。

```swift
let myCircle = Circle()
myCircle.area = 3.0
print("面積\(myCirclearea)")
// 面積28.274333882308138
```

### getterとsetterの存在価値

getterとsetterの存在価値は多く期は３つ。  
#####メリット１：「読むだけしかできない」、「書き込むだけしかできない」フィールド（属性・操作を書く場所）
外部から自由に読めるようにしたいけど、変更されては困ると言うフィールドを作りたい場合に多用されるテクニック。  

#####メリット2：フィールドの名前などクラスの内部設計を自由に変更できる  
もし、上のareaをnewAreaに変更したくなった時、getter、setterを使っていないと他のフィールドのコードを全てname→newNameに変えなければならない。  
だからget、setを挟むことで他のコードを変えなくて済む。

![IMG_3479.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935163/8b0b1ea8-b658-c665-61c8-9442ab5dd3f6.png)  

#####メリット3：フィールドへのアクセスの検査
setのなかに条件分岐文を用意することで変な値が書き込まれそうになったらエラーを出して弾くことができる。

##まとめ
自分の中でモヤモヤしていたものを調べてまとめてみました。  
間違った内容などありましたらどしどしご指摘いただければ幸いです。
開発好きの下剋上 ～ヒューマンミスを阻止するためには手段を選んでいられません～

はじめまして！Graat（グロース・アーキテクチャ＆チームス）の名も無きフロントエンジニアです。
この記事はグロースエクスパートナーズ アドベントカレンダー13日目の記事です。

この記事の対象読者は、次のような開発をしている人です。
* Webアプリケーションを開発している人
* ExcelでWeb画面のスクリーンショットを取るのが仕事になりかけてる人
* 修正するたびに想定外のレイアウトの崩れが発生して、心に闇を抱え始めてる人

## はじめに

プログラミングってとても楽しいですけれど、仕事で長く続けて積み重なっていくコードは怖いですよね。

とくにWebの画面構築は、シンプルな場合思った通りにレイアウトできるけれど、小さく部品化したり、他と組み合わせて要素がネストした構造になってしまったりすると、長くメンテしていくうちに予期しない見た目の崩れが発生することが多々あるので困ります。


## フロントエンド開発における愚痴とかあれこれ

そんな現在のWebアプリケーションは、意外と簡単にEnd To Endテストの自動化の導入ができるようになっていて、ビジネスクリティカルな機能やマネタイズとして外せない機能においては自動化・省力化やSemantic Monitoringなどの導入は、私の身の回りで良くみます。

また、ビジネスクリティカルな機能やマネタイズとして外せない機能以外のテストまで細かく書くと、アプリケーションが肥大化するにつれコストが見合わなくなり、楽をするためにテスト自動化してるはずなのに、テストのために苦しむという負の連鎖を生み出す原因になることもしばしばでした。

かといって機能は増えますし、画面の修正は発生するのが現実です。

修正したあとに些細なレイアウト崩れの確認を怠って、QAチームがいるからいいやって確認を押し付けるのは全体的に見て無駄なコストになるし、チーム全体の空気もわるくなっちゃいますよね。

また、そんなことをしてるとQAチームの稼働があがってビジネスクリティカルな部分のチェックが漏れてしまうのは本当避けたいお話です。

そして、QAチームも人間なので、いくら多重チェックしていたとしても前回の画面を細かく覚えてないから、些細なレイアウト崩れの見落としは当然でてきます。

そうなるとチーム間で冷戦がはじまってプロジェクト全体の空気が険悪に・・・

## 転生しました

1週目の私はそういう経験をしていたようなので、運よく転生した2週目の私はそうならないよう知識チートにより開発チーム内でレイアウト崩れを早期検知して、平和なスロー開発ライフを目指します！

スロー開発ライフの実現には、次のような物を準備する必要がありました。

* 画面のしょうもないレイアウトの崩れでも、サクッと見つけれる。
* わかりやすく、よみやすく、シンプルなテストコードをサクッと書ける。
* 自分の触っている部品が他の画面で影響ないかがサクッとわかる。

つまり冷凍した袋ドーナッツのごとく安心してサクサク開発したいのです！

そのために私たちがたどり着いた解決方法は、Cypressを利用したビジュアルリグレッションテストの導入でした。

## ビジュアルリグレッションテストとは？

一言で言うと、前回と現在の画面を比べ、変化があった場合に検知する仕組みです。

Cypressのビジュアルリグレッションテストはコードベースのe2eと違って、振る舞いやページの遷移、セマンティクスやwai-ariaなどのテストは出来ませんが、可視化可能なものをテストする場合は導入が非常に簡単であり運用のコストも安い優れたソリューションです。

どれくらい簡単なのか興味がある方は、以下のリポジトリのREADMEに書かれている手順をやってみてください。
10分程度で終わるので、サクッと体験できると思います。
[サンプルコード](https://github.com/mihirogi/visual-regression-test-sample)

このようなビジュアルリグレッションテストは、次のような構成の時に特に力を発揮します。

* デザインシステムでUIを構築しているシステム
* コンポーネント指向のシステム
* CI/CDが準備されている開発
もちろん、上記以外の構成でも利用できますし、メンテナンスが多々あるのであれば、フラットなHTMLページでも十分対費用効果が高いソリューションです。

また、マイクロフロントエンド構成かつデザインシステムを利用している場合はStorybookなどと合わせた導入であれば、テストの時間や内容を効率化することも可能です。

## Cypressを利用したビジュアルリグレッションテストの注意点

しかしながら、実際に運用していくと、次のような点を留意する必要が出てきます。

* MacやWindowsなどの異なるOSを利用した開発者が複数いる場合でも、皆同じ画像が生成されるようにする必要がある
* どのタイミングでビジュアルリグレッションテストを実行するのか計画する
* １つのテストケースでは１回の画像比較に留めておく（共通レイアウトの変更のせいでテストが将棋倒しにならないようにする）
* Cypressのsnapshotイベントではresizeが発生（画面が一時的に縮小される）ので、resizeに対する対策をする必要がある
* 画面の修正をしたら、どうやって比較用の画像を更新するのかの手順を考えておく
* 時間で new Date()など、ローカル自国を画面に表示しているケースは、実行するごとに画像にずれが出るためcy.clock()などの時間を固定にする必要がある
* アニメーションがある場合はキャプチャタイミングのズレにより差分が発生するため、なるべくアニメーションはOFFにできるソリューションをアプリに組み込んでおく。
* 比較用の画像を保存する必要があるため、何処に保存するのかと容量の問題をあらかじめ考慮しておく
細かく画像キャプチャを取ると時間がかかるため、差分テストやクラウドビルドなどを利用する

## まとめ

ビジュアルリグレッションテストそのものは導入して5年以上たちますが、立ち上げ当初に行っていたseleniumベースで自作していた時代と比べると、Cypressを利用したビジュアルリグレッションテストは圧倒的にローコストで導入できメンテナンスしやすいため、これは十分他のプロジェクトでも横展開する価値がある物だと実感しています。


下手をすると、適切に導入できればユニットテストよりも維持コストが安く、解決できる不安は自動化ソリューションの中でも随一であるため、本当に何の不安もなくサクッと実装・テストをできるようになります。

さらに、維持コストがやすいためテストケースも結構幅広いユースケースを書けたおかげで開発チーム内でのケアレスミスの発見数が増えQAチームへの負荷が下がり、関係性もすごく良いものになりました。


## 所感

レイアウト崩れの確認は気力をとっても使うので共通部分の修正は正直嫌でしたが、ビジュアルリグレッションテストを利用することで平和な開発が行えるようになりました。

いまは修正によるレイアウト崩れを気にしていた気持ちもどこかに去って、他チームとの交流も楽しいものとなっています。

みなさんも是非、ビジュアルリグレッションテストを導入して平和なスロー開発ライフをおくってください。
[JavaScript] すごく初歩のJavaScript (クラス)

#JavaScript (クラス)

JavaScript 自分用の覚え書きです。

JavaScriptでのクラスの使用 : コンストラクタ, メソッド, インスタンス

```javascript:script.js
class Character {
  // コンストラクタ
  constructor(name, level) {
    this.name = name;
    this.level = level;
  }

  // メソッド
  info() {
    console.log(`名前は${this.name}です`);
    console.log(`レベルは${this.level}です`);
  }
}

// インスタンスの生成
const character = new Character("山田", 20);
character.info();
```
Github Workflow 導入の前に考えておくこと

最近は、 Github Workflow を使うことが多くなってきたけど、まだまだ他の SaaS の CI の第一候補になりません.
検討する際に見落とすことがあるので、自分へのチェックシート代わりに この記事を書きました. 気がつくことがあれば常に更新していく様にします.

## Docker の実行が遅い
最近、よく使うツールの一つに Docker がありますが、 Github Workflow ではまだまだ遅いらしいです.

自分は Circle CI をメインにしてたので、気がつかなかったのですが以下の記事に書いてあって、 [github/super-linter](https://github.com/github/super-linter) が遅い理由はこれかもしれないと思いました.

- [DockerベースのGithub Actionsの憂鬱 - kbigwheelのプログラミング・ソフトウェア技術系ブログ](https://kbigwheel.hateblo.jp/entry/docker-base-github-actions-blues)

## 特定の Job の Rerun が無い
CI で複雑なワークフローを構築して一部だけ失敗したら、再実行したい時は結構あります.
例えば、依存パッケージをダウンロードしてキャッシュを作っておき、分岐したタスクでそれらを利用するとかです.

Github Workflow は Workflow を丸ごと Rerun することは出来ますが、 その内の特定の Job の Rerun は出来ません. 時間で課金されるので長時間動くような Workflow だと致命的です.

コミュニティでも指摘されてますが、現在まで特に公式からの対応はありません.

Workflow を 分割してトリガーを駆使すれば似た様なことは出来ますが、メンテナンス性が下がるので避けたいところです.

- [Ability to rerun just a single job in a workflow - Code to Cloud / GitHub Actions - GitHub Support Community](https://github.community/t/ability-to-rerun-just-a-single-job-in-a-workflow/17234/87)

## ハードウェアリソースが限られている
マシンパワーが必要な場合 CircleCI は [resource_class] の指定で、ある程度は選択できます. 
現状の GitHub Workflow では ハードウェア リソース が以下の要件で足りているか確認する.

> Each virtual machine has the same hardware resources available.
> 
> - 2-core CPU
> - 7 GB of RAM memory
> - 14 GB of SSD disk space

- [Specifications for GitHub-hosted runners - GitHub Docs](https://docs.github.com/en/free-pro-team@latest/actions/reference/specifications-for-github-hosted-runners#supported-runners-and-hardware-resources)

[resource_class]: https://circleci.com/docs/2.0/configuration-reference/#resource_class

## 自動キャンセルがない
コミットを新しく git-push したりすると、 Circle CI だと自動的に前回のワークフローが実行していた場合にキャンセルしてくれます.
GitHub Workflow ではキャンセルしてくれません. [rokroskar/workflow-run-cleanup-action] 等のアクションを使えば同様のことをしてくれます.

[rokroskar/workflow-run-cleanup-action]: https://github.com/rokroskar/workflow-run-cleanup-action

## コミットメッセージに `[ci skip]` を含めても CI はスキップしない.
Travis CI や Circle CI 等であれば、 `[ci skip]` をコミットメッセージに含めれば自動的にCIの実行をスキップしてくれます.

- [CIサービスの自動ビルドをスキップする方法まとめ - Qiita](https://qiita.com/vmmhypervisor/items/f10c77a375c2a663b300)

Github Workflow で以下のように仕掛けておけば、似た感じに動いてくれます.

```yaml
jobs:
  prepare:
    runs-on: ubuntu-latest
    if: "! contains(github.event.head_commit.message, '[ci skip]')"
    steps:
      - run: echo "ci skip"

  build:
    runs-on: ubuntu-latest
    needs: prepare
```
C言語をやめるべき5つの理由  ～  「C言語を組み込み系で使うの、もう無理じゃない？」っていう愚痴と落とし穴と業界の暗い未来？について思うところを書きなぐってみた

# C言語をやめるべき5つの理由

1. <b>[約50年も前に誕生した](https://ja.wikipedia.org/wiki/C%E8%A8%80%E8%AA%9E)古臭い言語である。</b>（言語仕様に、ソフトウェア工学における人類の英知が全くと言っていいほど反映されていない、生産性の低い、<b>バグを生みやすい言語</b>である。）

2. <b>可読性が低い。</b>とくにポインタ周りとプリプロセッサがヤバイ。  
（ベンダーのAUTOSARソフト部品が不具合とか得意先仕様との不一致のケースがあったときに、自動コードが入り組みすぎていて可読性がなく安易にパッチがあてられない。）


3. <b>まともに読み書きできる人間があまりいない。</b><font color="red"><b>C言語の言語仕様（落とし穴）を熟知している人間が希少</b></font>で、主観的な感覚だと、30代後半～50歳くらいで優秀なベテランしか言語仕様を知らない。最近の印象だと、歴の浅いの若手プログラマーが<b>ビルドも通らないようなクソコードを量産する</b>傾向がある。。[^1]

4. <b>移植性がない。</b>ターゲット環境（CPU）、開発環境（コンパイラ）依存が強すぎる。CPUが変わると、エンディアンとかintのbit長が変わってどっかでしぬ。

[^1]: もっとタチが悪いのが、無理やり明示キャストして、ビルドが通るっていう。。。

5. <b>使うためのオーバーヘッドが無駄。</b>コーディングルールで無理矢理オブジェクト指向風を実現（できてるのか？）しているが、その頑張りは何も<b>付加価値を生み出していない。</b>


C言語は、CPUやメモリとかの低レイヤーを学習するうえでは、非常に有用で、機械語やアセンブリを直接書くよりはよっぽどマシなのですが、もう使うべきじゃない言語だと最近思うわけです。


# 落とし穴について（概要）

- `#define`や`#include`が単なる単純置換である。(関数と見せかけて実体が変数に置換されてたり、多重インクルードガードのおまじないが必要だったり、括弧書き漏らすと演算子の結合順位が意図と違ってしまったり、、)
- CPUの性能を優先している思想があるっぽくて、処理系(CPU)依存な演算(負数の除算とかの結果が処理系によって異なるなど)がある。「C言語は高級言語ではない」と揶揄されるゆえんではないかと。
- オーバーフローしても気づきづらい

書き足りないけどこの辺で。。

酔った勢いで書いたので生暖かい目で見守っていただければと思います。 m(_ _)m

# 組み込み系における代案

Go言語とかC++(使いたくない)とかJava(もう古い気がする)を使う？
C言語向け以外のツールやソフト部品がどういう水準にあるのかが分からないので何とも言えない。。


# 追記 - 参考サイト

- [C言語 代替 - Google 検索](https://www.google.co.jp/search?q=c%E8%A8%80%E8%AA%9E+%E4%BB%A3%E6%9B%BF&oq=c%E8%A8%80%E8%AA%9E+%E4%BB%A3%E6%9B%BF)
- [Ｃ言語だけでの開発の現状を打破しよう](https://swest.toppers.jp/SWEST16/data/s5d_proceeding.pdf) 
- https://swest.toppers.jp/old-report/
- [組込みソフトウェア開発の課題分析と提言 ～アーキテクトをどのように育てるのか～ JEITA調査結果報告 2014年10月8日](https://home.jeita.or.jp/upload_file/20141224152959_rRZYhCLBDW.pdf)

# さらに追記

組み込み系におけるC言語の代替としては、Rustやモデルベースがわりと有力候補っぽい印象。
ただ、どちらも学習コストが高いようで、、、「見かけ上動くソフト」を作って（でっちあげて）くる輩が紛れ込まないように、<b>開発メンバ</b>（自社・委託とも）をアサインするときに、しっかり<b>技術力（言語の理解度とか）を査定</b>すべきな気がする。。（どんな開発言語・ツールを使うにしても。）
opkgの管理

# opkgについて
opkgはLinux向け軽量パッケージ管理システムです。
ipkgからのforkで、パッケージデータの拡張子は.ipkです。

- [openwrtフォーラム](https://openwrt.org/docs/guide-user/additional-software/opkg)
- [wikipedia](https://en.wikipedia.org/wiki/Opkg)

# 課題が発生するパターン
管理が結構原始的で、
野良パッケージデータをインストールした場合等、
ディストリビューション標準外のバージョンより新しいパッケージをinstallした場合、
removeしたとしても履歴にバージョン情報が残ってしまい、
元のバージョンをinstallしようとしても、
インストールした事の有るバージョンより低いバージョンの為、跳ねられてしまいます。
--force-reinstall を指定しても無駄でした。
色々と試しにinstallしてみる派だと、とても困ります。

# 解決法
結論としては、例としてLEDE 17.01 のパスで表現すると、
/overlay/upper/usr/lib/opkg/status
の中で該当するパッケージ情報を削除することで、
installした事の有るバージョンの履歴情報を消す事ができ、
一度もinstallした事がない状態に戻す事が出来ます。
vue3でバリデーションする

vue3でバリデーションについて調べたのでメモ
参考（https://www.npmjs.com/package/@vuelidate/core）

#環境
vue3
typescript

#vuelidateを使う
現時点でアルファ版ぽい
自分の環境ではバージョンの互換性がなかったので--legacy-peer-depsで強制的にインスコ

```
npm install @vuelidate/core @vuelidate/validators --save --legacy-peer-deps
```

```main.ts
import { createApp } from 'vue'
import App from './App.vue'
import { VuelidatePlugin } from '@vuelidate/core'
 
const app = createApp(App)
app.use(VuelidatePlugin)
app.mount('#app')
````

```App.vue
<template>
  <div>
    <input v-model="emailAddress" label="メールアドレス" @blur="$v.emailAddress.$touch()" >
    <p v-for="(error, index) of $v.$errors" :key="index">
            {{ error }}
    </p>
  </div>

</template>

<script lang="ts">
import { ref } from 'vue'
import { useVuelidate } from '@vuelidate/core'
import { email, required } from '@vuelidate/validators'

export default {
  setup () {
    const name = ref('')
    const emailAddress = ref('')
    const rules = {
      name: { required },
      emailAddress: { required, email }
    }
 
    const $v = useVuelidate(rules, { name, emailAddress })
 
    return { name, emailAddress, $v }
  }
}
</script>
```

こんな感じです
Kintoneはいいぞ。開発環境も全てにおいて。

Hiro_Matsunoです。
昨日はやらかしてしまいました。
今日も申し訳ないのですがあまり体調は良くないのでポエムになるかもしれません。
ダブリはないから許して。
[kintone Advent Calendar 2020](https://qiita.com/advent-calendar/2020/kintone "kintone Advent Calendar 2020")12日目です。
#KintoneはDX向き
正直言っておくとKintoneはDX向きです。
Javascriptの知識がなくても普通にノーコードで組めます。
慌てて環境作るよりはいいと思います。
ばらちごめんよ〜。
PowerAppよりも正直Kintoneのほうが有利です。
それはブラウザで使えるから。
これって一番いいと思いませんか。
#Kintoneは小さなデータベース
これはカレンダー主BBさんも大声で言ってますが。
ハッカソンなどで急ぎで開発しないといけない案件だったら断然Kintoneです。
はっきり言ってMySQLとPostgreSQLとOracleはハッカソンに向いていません。
むしろ大規模開発の方には向いています。
データベース性能は残念ながら素早くできるとは言い難いです。
レスポンス重視なら残念ながらMongoDBを選べといいます。
レスポンスよりデモだと思うのなら断然Kintoneと言っておきます。
#開発ライセンスは
CybouzuDeveloperNetworkに入会する上で無償で環境作ることは可能です。
これはあくまでも開発環境と思ってください。
5人まで使えるからそのまま自社作業に使っちゃえなんて考える人いると思いますがこれは開発優先になっています。
会社で自社作業に使いたいのならKintoneそのものを購入することを強くおすすめします。
俺は昔からのユーザーで青野社長とも仲がよく出た当時からくださいと言って分けていただいておりました。
今年でそのユーザがライセンス切れしますので実は別のところにもうすでに用意完了してるので開発はいつでもできるようになっています。
Kintoneはいろんな言語でも開発できます。
うちの職場でも急ぎ案件に使えるので是非開発ライセンスを持っておいたほうがいいと思いますが。
BB岐阜の日置江まで来てよなんて言いませんよｗ。
職場バレちまった。
#正直大規模開発には向きません
正直言うと大規模開発にはKintoneは向きません。
大規模開発になってくるとデータストアが足を引っ張る傾向がありそうです。
小さな会社なら使えるので是非DXに利用してください。
大きな会社だとデータストアを別のものを使えばなんとかなりそうな気がしますが公式には出ていないのであえてここはOracleやMySQL・PostgreSQL・SQLServerにつなぐ機能作っていただけると助かるのかなと思います。
出していたらごめんなさい。
#これからどう使っていくのか
やはりDX向けに使う要素が一番強いかと思います。
正直Teamsでやってよと言っている会社さんにはKintone強く推します。
Kintoneはしっかり開発できれば心強いツールになってくれると思います。
RPAに走るよりDXだと思います。
RPAは仕事を楽にするためのものだと思うからです。
仕事全体を変えていかなくてはアフターコロナには勝てませんよ。
リモートができるようにしていきましょうよ。
こんなところでおあとがよろしくなったので終了したいと思います。

明日は[iShinkai](https://qiita.com/iShinkai "iShinkai")です。
お楽しみに。
なぜドメインモデルを採用するのか?

**更新: ドメインモデルに切り出す判断基準**

有名なアーキテクチャである`DDD`や`クリーンアーキテクチャ`でもレイヤーとして存在しているドメインモデル。なぜドメインモデルを用いることが長期的な開発には有効とされているのかいまいちわからなかったので、ドメインモデルの中でも`ドメインEntity`についてまとめてみました。

## そもそもドメインモデルとは?
ドメインモデルとは、システムの主要な実体とそれらの関係を明確にし、一般にそれらの重要なメソッドと属性も洗い出す。すなわち、このモデルは、システムの構造的な観点を提供します。その先は`Use case`だったりのいわゆる`Service`に渡してビジネスロジックを組み立てていきます。

## なんのため?
ドメインモデルを導入する理由を一言で表現するのは難しいと思ったので、ここでは大きく分けて2つに分けて考えたいと思います。

**1.コードの表現力を上げるため**

例えば、`Qiita`のようなサービスを作るとします。記事は題名と本文が記載されていないと投稿はできない仕様の場合、`PHP`で`記事は題名と本文が記載されていない`表現をドメインモデルで表現してみるとこのように書くことができます。

```php
class Post
{
    ...
    public function isPublished(): bool
    {
        return $this->getAttribute('status') === Enums\Post\Status::PUBLISHED;
    }

    /**
     * 公開済みの場合はタイトルと本文が空ではいけない仕様を定義
     */
    protected function mustNotEmptyAttributesIfPublished(): void
    {
        if (!$this->isPublished()) {
            return;
        }

        $keys = ['title', 'body'];

        foreach ($keys as $key) {
            $value = $this->getAttribute($key);
            if (empty($value)) {
                throw new ValidationException('Published post must not have empty ' . $key . '.');
            }
        }
    }
    ...
}
```

このようにあらかじめ仕様を定義することが可能です。

これを例えば`Service`層で実装するとしても、`Service`層にはすでにビジネスロジックを担当するという責務があります。上記のようなビジネスロジックには該当しないような処理は書かない方が設計の破綻を防げますし、後々リファクタリングする際も処理が混在していないので比較的楽にリファクタリングできるかと思います。

**2.ロジックの混在を防ぐ**

こちらは`1`の最後に書いたことにつながります。各処理の実装はそれぞれのレイヤーが持つ責務に合わせて実装するべきで、通常1つのレイヤーに2つ以上の責務を持たせるのはアンチパターンとされています。([SOLID原則](https://ja.wikipedia.org/wiki/SOLID)違反)

## ドメインモデルに切り出す判断基準
ドメインモデルを用いるには、どこからどこをドメインとして切り出すかが重要になってくるかなと思います。
データベースのテーブルごとに考えるのか、サービスの機能ごとに考えるのか、また機能ごとに考えるにしてもデータのライフサイクルがその機能だけで実装されているのか等判断基準は様々です。

## ドメインモデルはこれで終わりではない
今回はかなり軽くまとめましたが、`ドメインEntity`に`Valueオブジェクト`を組み合わせると、`意図しない値を存在させない`,`意図しない代入を防ぐ`などの恩恵も受け取ることが可能になります。

## なぜドメインモデルを採用するのか?
長期的な開発になって規模も大きくなっていくとコード量やデータベースからの正しい(必要としている)値受け取り、機能などの処理の流れ... など複雑になっていきやることが必然的に大きくなっていきます。そういった作業を少しでも負担を減らすという意味でも`ドメインモデル`を採用することは受け取れる恩恵が大きいかなと思いました。

この記事を読んでなぜドメインモデルを採用することが良いとされているのか(開発規模によりますが)、少しでも興味を持ってくだされば幸いです。
Splunk DLTK: これでメモリ不足解消？DASK を使った KMeans クラスタリングを試してみた


# はじめに

KMeans自体は MLTKにあるのですが、データサイズが大きくなるとサーチヘッドのメモリ不足でエラーになることがあります（まずは設定をチェックしてね）。

DLTKを使うとサーチヘッドとは別のコンテナ環境で計算してくれるのである程度は問題解決できますが、さらに**Dask**を使うことでデータセットを分割して計算してくれるためもっと大量のデータでも取り扱えるようになります。

##Daskとは

こちらの記事を参考にさせていただきました。
https://qiita.com/simonritchie/items/e174f243bc03fb25462e

・　Pythonで並列処理・分散処理などを簡単に扱ってくれる。
・　データを部分的なかたまり単位(chunk/npartition)で処理してくれる
・　既存のpandasなどを置き換えるものというよりも、拡張してくれるライブラリー

メモリ制限に引っ掛かったけど、Sparkを利用するまでではない、中間的なケースに当てはまりそう。

# DLTKについて

今回はDLTKの使い方については解説しません。DLTKのセットアップや使い方についてはこちらの記事をご覧ください。
https://qiita.com/maroon/items/5a8b027631a674d6d8be

# サンプルコード確認

それでは早速サンプルコードをみていきましょう。

最初はライブラリーのインポート. dask関連のライブラリーをインポートしております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/24f96980-664b-35ca-4775-b7fd0c93f6ac.png)

### Stage1: データ取り込み

次にデータの取り込みです。Splunkで整形したデータを保存して取り込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/d7caf82f-8f92-c92f-50bd-056c15da4fe4.png)

下の図はSplunk側で実行した結果です。
サンプルデータは、isisのデータセットを利用してます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/2a1bfae2-155f-3b4f-3d65-b9e53f0f6f11.png)

### Stage2: 初期化

Daskのインスタンスを作成します。ここで複数のサーバ上に分散して実行する場合はClientを指定しますが、今回はローカルサーバ上で実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/95befd79-a241-7ea4-878d-b25edaf060cd.png)

### Stage3: 学習(fit) 

学習を始めます。今回はデータセットを４つのpartition(chunk）に分割して、Splunkからの引数で KMeansの kの数を読みこみ、dask_ml のKMeansを使って計算します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/d112d3d8-2bc1-e6e3-2714-5114e0dc07e6.png)

### Stage4: 適用(apply)

学習済みのデータラベル計算して、DataFrameに変換して返します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/0963a88f-39ba-5a57-dd7b-8f26e7989a75.png)

### その他ステージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/35bdfb8a-eb2c-17da-9510-9ae3b53c2672.png)

# Splunkから呼び出してみる

クラスター番号が追加されているのがわかります。データセットのサイズを大きくして試してみたいです。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/22f8d75d-8b04-023a-8d0f-b353b5bdc1f1.png)

# サンプルダッシュボードを確認

Splunk DLTKにはサンプルダッシュボードも用意されております。
特徴量をPCAで次元削減して 先ほどのクラスター結果をScatterplotで表示したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/500bb44a-0780-5f02-6da7-131a083f2661.png)

# まとめ

Dask MLでは、KMeans以外にも 回帰分析が使えたり、XGBoostや PyTorchなどとも連携できるようです。
https://ml.dask.org/

MLTKだとメモリ不足に陥るケースがあるので、このような機能が簡単に利用できるのはありがたいです。
Python エンジニア認定データ分析試験、対策　1日目

# 1.データ分析エンジニアの役割
Python とは、プログラミング言語である。
Python を用いてプログラミングすることで、
数値・テキスト・画像・音声といったデータを分析できる形に変更する。

## 1.Python の特徴
・コンパイルが不要である。
・オープンソースである。
・仕様がわかりやすい。

## 2. Python の得意分野
・サーバ系ツールである。
・Web システムを構築する。

## 3. Python の苦手分野
・ Web アプリケーションなどのフロントエンド

## 4. 機械学習とは
機械学習とは大量のデータから、**特性を見つけて予測などを行う塊**を作成することである。「特性を見つけて予測などを行う塊」を「**モデル**」という。

## 5. 機械学習の処理手順
データ入手 > データ加工 > データ可視化 > アルゴリズム選択 >
学習プロセス > 制度評価 > 試験運用 > 結果利用

#自作問題
１．データ分析エンジニアの役割に関する問題です。
自作問題です。誤字脱字がないように気を付けてますが、
不足・補足などありましたらコメントをお願いします。

Q1. 機械学習の処理の手順として正しいものを選んでください。

a) データ入手＞アルゴリズム選択＞データ可視化＞データ加工＞学習プロセス＞精度評価＞試験運用＞結果利用
b) アルゴリズム選択＞データ入手＞学習プロセス＞データ加工＞データ可視化＞精度評価＞試験運用＞結果利用
c) アルゴリズム選択＞データ可視化＞データ入手＞データ加工＞データ可視化＞精度評価＞試験運用＞結果利用
d) データ入手＞データ加工＞データ可視化＞アルゴリズム選択＞学習プロセス＞精度評価＞試験運用＞結果利用

Q2. データ分析に使う主なパッケージとして誤りがあるものを選んでください。
a)Numpy
b)Django
c)scikit-learn
d)SciPy




【解答】
Q1. d)
Q2. b)
v4l2loopbackをDKMSでビルド

OBSの出力をヴァーチャルカメラとするには、v4l2sinkを使う必要があります。
v4l2sinkを使うには、v4l2loopbackをカーネルに組み込む必要があります。

ubuntuのaptでインストールできるモジュールは古いようで、使えないので
ソースからビルドする必要があります。
ビルドしてカーネルに組み込みますが、カーネルのアップデートが行われるともう一度
同じ作業をしなくてはいけません。
（OBS→ZOOMという案件があって、当日カーネルのアップデートしてしまってヴァーチャルカメラが使えないと焦ることがありました
なんとか気がついて再度ビルド＆インストールで事なきを得ましたが、、）



そのような手間を省くためDKMSでビルドしたいと思っていたら、v4l2loopbackのgitにやり方書いてありました

```
mkdir -p ~/src/
cd ~/src/
version=0.12.5
# download and extract the tarball
curl -L https://github.com/umlaeute/v4l2loopback/archive/v${version}.tar.gz | tar xvz
# build and install the DKMS-module (requires superuser privileges)
dkms add -m v4l2loopback -v ${version}
dkms build -m v4l2loopback -v ${version}
dkms install -m v4l2loopback -v ${version}
```
※ダウンロード→展開したフォルダを/usr/srcに移動してからdkmsのコマンドを始める必要があります