OmniAICreator/Qiita-1.07M huggingface dataset:
[Hubspot] 遅延させた上で希望時間に実行する

Hubspotのワークフローには
遅延実行と希望時間での実行の機能があります.
その方法を実例から紹介します.


公式のやり方紹介はこちらです
* [スケジュール済みワークフローの作成
](https://knowledge.hubspot.com/ja/workflows/create-a-scheduled-trigger-workflow#%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B)
* [ワークフローアクションを選択する
](https://knowledge.hubspot.com/ja/workflows/choose-your-workflow-actions)


# 実例紹介
リマインドメッセージを送るのは、返信が来なくなってから24時間以上経ってから。
送信時間は21時にしたい。
という要件があった時のワークフローを紹介します

## 概要図
![実装イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108154/80b43c01-3d06-fa27-1949-703a2c8378b2.png)

ワークフロー(１)で24時間以上を遅延させて、ワークフロー(２)で希望時間に送信をします。

### ワークフロー(１)遅延
![スクリーンショット 2022-12-05 15.54.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108154/d83aaad2-cd57-7da9-1a63-9f3ef7272e92.png)

今回24時間以上経ったユーザにリマインドを送りたいということで、
対象コンタクトの条件(返信が来ていない状態)をトリガーにした上で
遅延の処理を設定します。

#### 実行時間
このワークフローの実行時間は”いつでも”としておきます
![スクリーンショット 2022-12-05 15.56.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108154/653ff89e-de6d-7846-3122-c139afd86b10.png)

#### 登録解除
もしこの遅延させている間に
コンタクトが登録条件から外れたら
当該コンタクトは遅延の対象から外れるようにしておきます
![スクリーンショット 2022-12-05 16.01.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108154/65ac73ba-2e09-3cdd-0e89-ee259b63335a.png)

### ワークフロー(2)実行

![スクリーンショット 2022-12-05 16.03.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108154/23d0a030-86ce-ccb8-ae6b-cc80052348de.png)
登録条件は
「ワークフロー(１)遅延と同じもの　**AND** ワークフロー(１)遅延を完了した」
という条件にします

#### 実行時間
今回は21時に実行したいということで
画像のように実行時間を21:00-21:30とします。
ワークフローのスケジュールは30分の間でしか時間を指定できないので注意です。
![スクリーンショット 2022-12-05 16.05.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108154/86e0041a-2b9f-67df-a076-38aac5245634.png)

#### 登録解除
ワークフロー(１)と同じように
実行待ちの状態で、コンタクトが登録条件から外れたら
当該コンタクトは実行対象から外れるようにしておきます
![スクリーンショット 2022-12-05 16.01.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108154/65ac73ba-2e09-3cdd-0e89-ee259b63335a.png)


## 完成の様子

![スクリーンショット 2022-12-05 16.10.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108154/8374e2b2-e1ff-a02f-60db-b1a2730cb406.png)

今回実行内容がLITTLE HELPによるメッセージの送信だったので上記のようなアクティビティになっています。
時間のログを見ると、ちゃんと最後の送信から24時間以上経った最初の21時にメッセージを送れています。

# まとめ
ワークフローを２つ使い、遅延の実行を実現しました。
条件から外れた時に登録除外にする設定を２つのワークフロで設定し忘れないようにするのと
コンタクトの登録条件を揃えるのが
のがミソです。

コンタクトの条件を２回も書くのがめんどくさいという場合は
動的なコンタクトリストであらかじめ対象を用意して、
そのリストを登録条件にしてもスマートに書けるかと思います

ユーザアクティブタイムにリマインド送信には便利なやり方かと思うので是非ご活用ください

# 最後に
弊社では、一緒に働いてくれるエンジニアを募集しています。
↓最新技術や自社開発に興味のある方はこちらから↓
[Wantedly - スタジオアンビルト株式会社](https://www.wantedly.com/companies/studiounbuilt)

こんなWebサービスを作っています。
・[マドリー](https://madree.jp/)
・[Studio Unbuilt](https://www.studiounbuilt.com/)
今年参加したコンペの感想

**この記事はAcademiX Advent Calendar 2022　5日目の記事です。**

### はじめに
情報系の学科に在籍中の学生です。
機械学習コンペの実績はsignateブロンズ×2のみのまだまだな学生です。
今回は、今年参加したコンペについて振り返ります。

### 今年参加したコンペ
今年参加したコンペは以下の三つです。
- SIGNATE Student Cup 2022
https://signate.jp/competitions/735

-  MUFG Data Science Champion Ship
https://signate.jp/competitions/754

-  Feedback Prize - English Language Learning
https://www.kaggle.com/competitions/feedback-prize-english-language-learning

### SIGNATE Student Cup 2022
とあるきっかけからしっかりとコンペに取り組もうと決心し、ちょうどよくsigntateで学生限定コンペが開催されていたので、
「これはメダル取らなければ．．．」と思い参加しました。

このコンペは求人情報を用いた職種判別だったのですが、結果銅圏でした。

**良かった点** としては、
- 目標であったメダルを獲得できたこと
- 久しぶりにコンペに参加し、知識を大雑把に取り戻せたこと

**反省点** としては、
- アイデアを試すための技術がまだ足りないこと（transformerの理解が足りない）
- そもそもどういった工夫・改良をしていいのかわからないこと

でした。

上位入賞者の解法を見ていると、ベースは変わらずに大量のモデルをアンサンブルしたり、大規模モデルを使用していたりと力技が多かったので、ハイスペックマシンが欲しいなと感じたコンペでした。

### MUFG Data Science Champion
上記のコンペが終わってすぐに同じく学生限定コンペが開催されたので参加しました。
このコンペの意気込みとしては、前回銅までしか行けなかったため、銀以上をとることでした。

結果は前回同様に、銅圏でした．．．

**良かった点** としては、
- メモリを効率よく使用するための方法を理解できたこと。
- 自然言語データの有効さまざまな前処理の種類を知れたこと

**反省点** としては、
- 提出数が少なかったこと
- 結果の管理がごちゃごちゃになってしまい、自分が試した内容が途中で分からなくなってしまったこと

### Feedback Prize - English Language Learning
kaggleにもそろそろ出たいと思っていたところで自然言語処理のコンペがあったので参加しました。
こちらのコンペははじめてチームで参加しました。

**良かった点** としては、
- チームで参加することの楽しさ・難しさを知れたこと
- discussionで銀メダルを取れたこと
- bertの理解が深まったこと（チームの皆様ありがとうございました！）
- GCPを使えるようになったこと
- GPUスペックの違いを知れたこと（GCPで調子に乗ってA100を使用してみると、4時間くらいかかっていた処理が1時間くらいで終わって、GPUスペックって大事なんだ．．．と思いました。費用はぼちぼちかかりますが．．．）

**反省点** としては、
- チーム参加の利点を生かしきれなかったこと
- 提出回数が少ないこと

### 来年の目標
- kaggleでexpertになる
- 参加するコンペの試行回数と提出回数を増やす


ここまで読んでいただきありがとうございました。
Qulacs新機能の紹介

この記事は[量子コンピューター Advent Calendar 2022](https://qiita.com/advent-calendar/2022/quantum)の5日目の記事です。

大阪大学で量子コンピュータの研究開発をやっておりますエンジニアの森と申します。

今年の5月から大阪大学の[QIQB](https://qiqb.osaka-u.ac.jp)という組織に参加しまして、量子機械学習をやっているのですが、[Qulacs](https://github.com/qulacs/qulacs)の中の人もやっています。
（※実際の実装は大阪大学を始めとした情報学科系の競プロをやっている、つよつよエンジニア達が開発しているんですけどね！）

https://qiqb.osaka-u.ac.jp

https://github.com/qulacs/qulacs

この記事で紹介させて頂く[Qulacs](https://github.com/qulacs/qulacs)とは、量子コンピュータの回路シミュレータです。
類似ソフトウェアとして、[Qiskit](https://qiskit.org/)や[Cirq](https://quantumai.google/cirq)等があります。

https://qiskit.org

https://quantumai.google/cirq

[Qulacs](https://github.com/qulacs/qulacs)の売りは、世界最高速の量子コンピュータの回路シミュレータなのですが、知名度がちょっと低いので今日は宣伝にきました。

[Qulacs](https://github.com/qulacs/qulacs)は、元々大阪大学で開発され、[QunaSys](https://qunasys.com)（こちらも大阪大学発のスタートアップ）で保守されていました。

研究用の新機能は、[Qulacs-Osaka)で追加されていたのですが、リポジトリを分けて管理するのも面倒になってきたので、[Release v0.5.0](https://github.com/qulacs/qulacs/releases/tag/v0.5.0)で統合しました。

今回はこの[v0.5.0以降](https://github.com/qulacs/qulacs/releases)でリリースされた機能についてご紹介できればと思っております。

https://github.com/Qulacs-Osaka/qulacs-osaka

いろいろ細かい機能もあるのですが、覚えている大きめの機能をご紹介させて頂きます。（[Qulacsドキュメント](http://docs.qulacs.org/ja/latest/index.html)を更新せねば。。）

# シミュレータ

[シミュレータ機能](http://docs.qulacs.org/ja/latest/guide/2.0_python_advanced.html#id55)は、チュートリアルに反映しています。（[英語版](http://docs.qulacs.org/en/latest/guide/2.0_python_advanced.html)も更新せねば。。）

- NoiseSimulator: ノイズをシミュレートした環境で回路を実行することができます！
- CausalConeSimulator: 測定する量子ビットに関係するゲートのみシミュレートしますので、回路の深さが浅ければ大きいサイズの量子ビットの回路の期待値を求めることができます。

http://docs.qulacs.org/ja/latest/guide/2.0_python_advanced.html#id55

# backprop

量子機械学習の勾配計算を高速にするため、backprop を実装しました！

https://github.com/qulacs/qulacs/blob/main/src/vqcsim/parametric_circuit.cpp#L260

# KAK分解

任意の２量子ビットゲートを既存ゲート（回転ゲートとCNOTのみ）に分解します。
量子コンピュータの実機では、実行できるゲートが限られているため、分解する必要があります。
機種によっては回転ゲートも実行できないものもあるため、TゲートやSゲートに変換する必要があります。
KAK分解はその前段階の回転ゲートへの分解になります。

https://github.com/qulacs/qulacs/blob/main/src/cppsim/matrix_decomposition.hpp#L178

# 回転ゲートの方向

[Qulacs](https://github.com/qulacs/qulacs)は、歴史のあるソフトウェアなので、教科書やqiskitの回転ゲートと方向が違う場合があります。
そのため方向を逆にした、[RotXゲート](http://docs.qulacs.org/ja/latest/pyRef/modules.html?highlight=RotX#qulacs_core.gate.RotX)やその逆[RotInvXゲート](http://docs.qulacs.org/ja/latest/pyRef/modules.html?highlight=RotInvX#qulacs_core.gate.RotInvX)を追加しました！

# NoisyEvolution

[確率的作用](http://docs.qulacs.org/ja/latest/guide/2.0_python_advanced.html?highlight=NoisyEvolution#id39)をするゲートに、NoisyEvolution を追加しました。
環境から相互作用（ノイズ）を受け、時間発展によって減衰させるゲートです！
（難しい専門用語の概説だけなので、もう少しイメージしやすい資料を作りたいですね。。）

https://github.com/qulacs/qulacs/blob/main/src/cppsim/gate_noisy_evolution.cpp#L425

# 逆回路

逆ゲートが`get_inverse()`で呼び出せます。

https://github.com/qulacs/qulacs/pull/381

# QASM対応

QASMとQulacs回路を相互変換します。
DenseMatrixはQASMが対応していないので、独自拡張しています。

https://github.com/qulacs/qulacs/pull/421

# SVE対応

ARMのSVEに対応しました。M1 MacのNEONにも対応したいですね。
（M1用のネイティブバイナリ（SIMD未対応版）はPyPIに公開しました。）

https://github.com/qulacs/qulacs/pull/401

# 今後について

等など、いろいろな機能が追加されております。
また、日々、研究に必要な機能がいろいろと実装されています。
当面はもっとドキュメントを頑張らないといけないなと思っています。
後、研究室に44台の計算ノードがあるクラスタがあり自由に使えるので、
QulacsをMPI対応させて無駄に大きい量子ビット回路をガンガン計算したいと思います！！
AZ-900:Describe cloud concepts ①

AZ-900の試験を英語で受けるに至り、翻訳なしで勉強をしてまとめていく勉強ノートです。

自身の復習用としても記事を書くつもりではありますが、同じように英語で受講予定＆翻訳なしでそのまま英語で勉強した方がやりやすい方の参考に少しでもなることが出来ればと思います。

日本語で勉強をしたい方は、こちらのサイトを是非参考にしてみてください：

https://qiita.com/fsd-jume/items/cdef9615ba28b2fbc885

# 学習内容
**Intro to cloud computing: Describing cloud concepts**
- [学習内容](#学習内容)
	- [Define cloud computing.](#define-cloud-computing)
	- [Describe the shared responsibility model](#describe-the-shared-responsibility-model)


<a id="#define-cloud-computing"></a>
## Define cloud computing.

* Cloud computing is the delivery of computing services including common IT infrastructure such as networking, databases, storage, and virtual machines.

* Cloud computing is delivered over the internet, thus it doesn't have to be constrained by physical infrastructure any more. This allows us to not wait to build a new datacenter when a arpid increase of IT infrastructure is needed.

<a id="#describe-the-shared-responsibility-model"></a>
## Describe the shared responsibility model

* The responsibilities maintaining the cloud services get shared between the cloud provider and the consumer.

* Cloud provider is always responsible for:
  * physical datacenter
  * physical network
  * physical hosts

* Consumer is always responsible for
  * data and information stored in the cloud
  * devices that are allowed to connect to the consumer's cloud such as cell phones, computers, etc.
  * Accounts and identities of the people, services, and devices within consumer's organization.

* Responsibility of some things such as listed below, depends on the situation. The consumer's service model determine the responsibility.
  * Operating systems
  * Network controls
  * Applications
  * Identity and infrastructure

* With an on-premises datacenter, consumer is responsible for everything.

* The shared responsibility model is heavily tied int othe cloud service types:
  * infrastructure as a service (IaaS)
  * platform as a service (PaaS)
  * software as a service (SaaS)

---

AZ-900:Describe cloud concepts② はこちら：

https://qiita.com/fsd-lukapyon/items/99edd38b566f6ed0d096

AZ-900:Describe cloud concepts③ はこちら：

https://qiita.com/fsd-lukapyon/private/0324140f0b6c2034db68

AZ-900:Describe cloud concepts④ はこちら：

https://qiita.com/fsd-lukapyon/items/90ed9d652da29f19f06e

AZ-900:Describe cloud concepts⑤ はこちら：

https://qiita.com/fsd-lukapyon/items/3d489123078f765ccb87

AZ-900:Describe cloud concepts⑥ はこちら：

https://qiita.com/fsd-lukapyon/items/6b5e612044dd37b42386

AZ-900:Describe cloud concepts⑦ はこちら：

https://qiita.com/fsd-lukapyon/items/83390ae397ff8e7b8989

AZ-900:Describe cloud concepts⑧ はこちら：

https://qiita.com/fsd-lukapyon/items/abfc398d55bf28160b90

AZ-900:Describe cloud concepts⑨ はこちら：

https://qiita.com/fsd-lukapyon/items/4881ce9db481dd4173eb
これから物流エンジニアになる人が覚えておきたいこと

## この記事について
この記事が想定している読者はこれから物流エンジニアになる方
物流システムに興味のある方に向けて書いています。

物流業界では、この記事を書いている2022/12/02現在、2024年問題という問題を抱えています。
この問題を解決するためにも少しでも多くの人に物流システムについて知って欲しくこの記事を書いています。

## 多岐に渡る〇〇物流
物流にはさまざまな種類があり、種類によって配送のオペレーションも異なります。

### 1. 調達物流
調達物流は、主に製造業などで、自社で何かしらの材料を使用し生産するための材料を調達するものになります。

サプライヤーが配送するパターン
```
サプライヤー　=納品=> 仕入企業
```
仕入企業が集荷するパターン
```
仕入企業A =集荷=> サプライヤー =帰庫=> 仕入企業A
```
センターに集荷するパターン
```
サプライヤーA =納品=>
サプライヤーB =納品=> 流通センター ==納品=> 仕入企業A
サプライヤーC =納品=>
```
仕入企業が集荷して回るパターン(ミルクラン集荷)
```
仕入企業A =集荷=> サプライヤーA =集荷=> サプライヤーB =集荷=> サプライヤーC  =納品=> 仕入企業A
```

### 2. 販売物流
販売に携わる物流のことを販売物流といい、製品や商品を消費者に届ける物流を指します。
販売物流では、一般的にセンター倉庫から、地域倉庫、デポ倉庫、卸売業者、顧客と扇状に関係者が広がっていきます。

```
センター倉庫 → 地域倉庫 → デポ倉庫 → 顧客
                    → 卸売業者 → 顧客
                         ↓
                      ２次卸売  → 顧客
```

### 3. 返品・回収物流
顧客に届けている中で、誤出荷などで不要になったものを、そのままセンター又は倉庫に戻すことを返品物流といいます。
製品の場合は再度利用できるか確認しできそうであれば倉庫内で管理、食品などで、期限が決まっていて再使用できないものは破棄するなどをWMSで行います。一方回収物流は、顧客が利用したものを再度回収し、リサイクル・リユースするといった流れになります。

## 物流システムの大枠であるTMSとWMS
物流システムには大まかに分けると倉庫管理システム(WMS)と輸配送管理システム(TMS)があります。

WMSは、商品のロットナンバーや入庫日、出庫日を細かく管理するシステムで倉庫内の物を管理します。
一方で、TMSは、物量に合わせてトラックの台数を算出したり、実際にドライバー配車を行なったり配送ルートや積載物を決定したりするシステムです。日本は国土が狭く、インフラが整っているためルート決定が難しく導入されづらいシステムで、今も熟練の配車マンやドライバーの経験によるルート決めなどが行われています。

## 参考文献
- エンジニアが学ぶ物流システムの「知識」と「技術」
エンジニアとして起業して、5年経過して気づいたこと

「株式会社やどかり」をやっている松澤です。会社としては請負での受託開発を社内でみんなでやっている会社になります。

今回は起業してちょうど5期目が終わったので、今後起業を考えているエンジニアに向けて、少しでも私が気づいたことが参考になればと思います。

# 創業初期（1〜2期目）
この時期はひたすら生き残るのに必死でした。
会社経営はやっぱりやってみないとわからないことも多くて、いろんな先輩経営者に回ってひたすらお話を聞かせていただきましたし、とにかくお金がない^^;
そして人もいないから何かあったら、自分でもバグ潰しにいつまでも対応する必要があるし、その中で別メンバーのプロジェクトを気にしたり、採用もやろうとしたり、もう全てのことが人もいないし分業できるわけでもなく同時にいろいろとこなしていた気がします。

結局今振り返っていえることとすると、起業前にどれだけ社内や社外含めて、いろいろな人とのつながりや信頼関係がきずけているか、またそれに対してどれだけ感謝の気持ちで向き合えるかが大事だったんじゃないかなあと思います。

# 創業終期（3〜4期目）
この時期になると社員も10名を超えてきていて、さすがにプログラムを組む機会は減ってきていて、ただそれでもクライアントからの依頼を整理するための要件定義や設計は残り続けていたと思います。

組織作りやチーム作りといったことを考えた時に、とにかく信じて任せようというトライはしました。
ただこれがびっくりするくらいそんなに簡単にいくわけでもなく、現場の作業もありつつ、会社のことも考えつつで、現場と経営のバランスをどうとるのかが難しかったです。

ただ現状を改善もしつつ採用も頑張っていい人を採用していくと、少しづつ変化もうまれてきているなという手応えも感じ始めた気がします。ただ小さい会社で採用がそんなに順風満帆なわけもないのですが、なんか仲間が増えていくことの楽しさを感じていた時期でもあります。

この時期くらいから経営者のカラーが少しづつ会社に対して出始めるような気がします。

# 変革期成長期？（5期目〜）
さすがに5期目にもなると新人経営者ともいえなくなってきますw
社員もこの時期に20人を超えました。

少しづつチーム作りがうまくいっていたのもあって、この頃からはプロジェクトに参加する回数も減り始めてきました。普段はみんなに任せて、何かあれば参加するよというスタイルに変わっていきます。このスタイルの難しいところは普段のやりとりは参加していないのであまり見えていないのに、何かトラブルなどが発生したときに最小限の時間、情報しかない中で最短距離で正解を出すのが楽しいけど大変だったりします。

結局何か問題があったときに現場で対応していくけれど、最後のストッパーとしてどこまで価値が出せるのかがエンジニア出身の経営者には求められるのではないでしょうか。ここでプログラムまで見るときもあったりはするんですが、できればプログラムを見なくても発生しそうなバグのポイントをアドバイスできるとかっこいいwそんなことを考えつつさりげないサポートをどうできるかですね。

自分でコードを書きたいタイプの経営者の場合は20−30人くらいが適正な人数な気がします。どうもそこを超えていくとマネジメントや経営に関しての課題が増えてくるので、この辺りは自分がやりたいことに合わせて社員数も調整がいいんでしょうね。

なんかよく言われる30人の壁みたいなものが、ジワジワと襲ってくる感じですw
どんなに良いメンバーで構成されていても、なぜだかわかりませんが毎回新しい課題が降ってくるんですよね。正直プログラムも自分で書いていたりしつつだとしたらとても大変です。

# まとめ
社長営業という言葉があるように社長が営業のほうが会社として自然な流れなんだろうなーとも思ったりはします。でもエンジニア出身の社長も別の良さはあるんじゃないでしょうか。この辺りはバランスがとても大事な気もしますので、もし自分に不足しているものがあれ助けてくれる仲間がいれば解決する場合もあります。どちらかというとエンジニアは外部との接点が少なく今まできている場合もあるので、経験として不足している外部との接点を増やすといいのかもしれません。
ただこれはエンジニア思想で考えると非効率な部分も多いので、その両立した考え方をどう作るかができると深みが強まるんじゃないかなあと思っています。

自分も今までの経験をいかしつつ、これからどう成長していくかを今後も悩み続けたいと思います。
ありがとうございました。
【Laravel】Eagerロード時に脳死でwithせず必要なカラムだけ記述する

## 概要

EloquentのEagerロード、便利ですよね。いつも脳死で``Hoge::with('huga')->get()``
って書いてたんですけど、カラム指定出来るみたいです


## 使うカラムだけ指定する

DB
ユーザーテーブルと予定テーブル

![スクリーンショット 2022-12-05 15.39.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/c42c01f2-ab43-c3a2-d8de-0648001eec6b.png)
![スクリーンショット 2022-12-05 15.41.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/d795d2f5-84c4-402c-eb25-cb1f866f508f.png)

予定レコードからユーザー名だけ取得して使用したい場合は``with('user:id,name')``と記述します。

:::note alert 
リレーションに必要な主キーや外部キーは必ず指定してください。
今回の場合だと``id``が必ず必要
:::

```php:さんぷる
dd([
    'ビフォー' => Schedule::with('user')->first()->user->getOriginal(),
    'アフター' => Schedule::with('user:id,name')->first()->user->getOriginal()
]);
```


```php:結果
array:2 [▼ // app/Http/Livewire/Sample1202.php:21
  "ビフォー" => array:9 [▼
    "id" => 1
    "name" => "田中太郎"
    "email" => "rau.terry@example.net"
    "email_verified_at" => Illuminate\Support\Carbon @1670220795 {#1393 ▶}
    "password" => "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi"
    "remember_token" => "rfxTH8ZLXy"
    "created_at" => Illuminate\Support\Carbon @1670220795 {#1412 ▶}
    "updated_at" => Illuminate\Support\Carbon @1670220795 {#1415 ▶}
    "deleted_at" => null
  ]
  "アフター" => array:2 [▼
    "id" => 1
    "name" => "田中太郎"
  ]
]
```


https://readouble.com/laravel/9.x/ja/eloquent-relationships.html#eager-loading
python 自分メモ

# インストール
## Visual Studio Code
・全部デフォルトでインストール
## Python
・Customize Installationを選び、「install for all user」（launcher,python本体ともに）
・Add python to environment variables
## pipenv
・コマンドプロンプトを管理者として起動(一般ユーザだとユーザホームにインストールされ、path追加が必要)
```
pip install pipenv
```

## プロジェクト
・システムに環境変数を追加（PIPENV_VENV_IN_PROJECT=true）
　仮想環境がプロジェクトディレクトリ配下(.venv)に作成される。設定しないとユーザホームに作成される。
・プロジェクトフォルダでコマンドを実行
```
  pipenv install
```
・プロジェクトフォルダをvs codeで開く
・ファイル→ユーザ設定→設定で、「python.venv path」に「.venv」を設定

# pipenvあれこれ

## 仮想環境を作成（python x.y）
```
pipenv --python x.y
```

## ディレクトリ内のPipfileを元に仮想環境を構築
```
pipenv install
```

## 仮想環境にライブラリをインストールする
インストール後、Pipfileに追加される
version指定も可能
```
pipenv install [package]
```

## 仮想環境のライブラリ削除
Pipfileからもエントリが削除される
※依存ライブラリは削除されない
```
pipenv uninstall [package]
```

## シェルを起動
```
pipenv shell
```
## シェルを抜ける
```
exit
```

## 仮想環境でコマンドを実行
```
pipenv run [コマンド]
```

## 仮想環境を削除
```
pipenv --rm
```

## 仮想環境のパスを確認
```
pipenv --venv
```

# pipenv留意点
プロジェクトディレクトリを移動すると、仮想環境の再構築が必要（どうにもならないらしい）

## pyinstaller
```
pyinstaller hoge.py --onefile
pyinstaller hoge.py -F
```

# おまけ（venv）
## シェルを起動
```
activate.ps1
```
## シェルを終了
```
deactivate.ps1
```

## py
シェルを起動
```
py
```
バージョン指定でシェルを起動
```
py -3.11
```
LocalizedStringKeyの簡単な説明(Swift)

## はじめに

本記事は [Swift Advent Calendar 2022](https://qiita.com/advent-calendar/2022/swift) の2日目の記事です。
昨日も私で [iOS 15.0+ではNSLocalizedStringよりString(localized:)を使おう(Swift)](https://qiita.com/uhooi/items/41ead3ad632dc911a4f9) でした。

`LocalizedStringKey` について簡単に説明します。

## 環境

- OS：macOS Ventura 13.0.1
- Xcode：14.1 (14B47b)
- Swift：5.7.1

## 「LocalizedStringKey」とは？

文字列ファイル内のエントリの検索に使うキーのことです。

https://developer.apple.com/documentation/swiftui/localizedstringkey

以下の文字列ファイルがある場合、 `LocalizedStringKey` に `"Uhooi"` を渡すことで `"ウホーイ"` を取得できます。

```:Localizable.strings
"Uhooi" = "ウホーイ";
```

Viewのイニシャライザが `LocalizedStringKey` に対応していると、 `String(localized:)` などを使ってローカライズされた文字列を取得する必要がなく、そのままキーを渡せるので、記述がスッキリします。

例えば [前日の記事](https://qiita.com/uhooi/items/41ead3ad632dc911a4f9) で私が紹介した記述は、実はもう少しスッキリさせることができます。

```diff_swift:FooView.swift
import SwiftUI

struct FooView: View {
  var body: some View {
    VStack {
-     Text(String(localized: "Set \(Int(3) + 1)", bundle: .module))
+     Text("Set \(Int(3) + 1)", bundle: .module)
    }
  }
}
```

これは `Text` のイニシャライザが `String` のみでなく `LocalizedStringKey` も受け付けているためです。

## おわりに

`LocalizedStringKey` の簡単な説明でした。

以上 [Swift Advent Calendar 2022](https://qiita.com/advent-calendar/2022/swift) の2日目の記事でした。
明日も私で何か書きます。
Google検索にChatGPTの結果を表示【ChatGPT for Google】

![ezgif-5-e037f3ffd4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/f2850bed-451f-4f57-72ea-0be44b555c41.gif)

# 導入方法

## Chrome

リンクを開いて`Chromeに追加`をクリック
https://chrome.google.com/webstore/detail/chatgpt-for-google/jgjaeacdkonaoafenlfkkkmbaopkbilf

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/ecf4ffd6-de15-20bd-6b99-e5a4966a74d0.png)

## Firefox

リンクを開いて`Firefoxへ追加`をクリック
https://addons.mozilla.org/addon/chatgpt-for-google/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/3a8bfdc9-7b1e-ca63-a078-b8e9873abedc.png)

# まとめ

検索するだけでChatGPTも使えるので便利です。

もしよろしければスターいただけると嬉しいです

https://github.com/wong2/chat-gpt-google-extension
Elixir × GraphQLシリーズ ②   ~ サクッと Abshinthe-crient Setup ~

# Elixir × GraphQLシリーズ  
## ~ サクッと Abshinthe-crient Setup ~

この記事は「[Elixir Advent Calendar 2022](https://qiita.com/advent-calendar/2022/elixir)」15日目の記事です
東京にいるけどfukuoka.exのYOSUKEです。

GraphQLセットアップシリーズものの2つ目の記事です。今回は GraphQL clientのセットアップを簡単に手順のみをシンプルにサクッと書いていこう。というコンセプトで作っていきます。

このシリーズは３部作で考えています。

プロジェクトの作成
```zsh
mix phx.new ql_crient --no-ecto
```

依存関係の追加

```mix.exs
defp deps do
    [
    # 省略 #
      {:absinthe_client, "~> 0.1.0"}
    ]
  end
```

実行

```zsh
mix deps.get
```
Elixir × GraphQLシリーズ①で作成したサーバーがポスト番号 4000なので被らないように
ポート番号を4001に変更

```dev.exs
# 省略　#
config :ql_crient, QlCrientWeb.Endpoint,
  http: [ip: {127, 0, 0, 1}, port: 4001],
# 省略 #
```

これで完了 早速サーバーを立ち上げましょう。

```
iex -S mix phx.server
```

iex側でまずはデータ取得できるか実験
前回作成したGraphQLサーバー側も立ち上げておきましょう。

```elixir
iex> alias AbsintheClient.{Utils, WebSocket}
iex> alias Req.Request
iex> req = Req.new(base_url: "http://localhost:4000/api") |> AbsintheClient.attach()
%Req.Request{
  method: :get,
  url: URI.parse(""),
  headers: [],
  body: nil,
  options: %{base_url: "http://localhost:4000/api"},
  registered_options: #MapSet<[:async, :auth, :base_url, :cache, :cache_dir,
# 省略 #
```

Req.post!関数に取得したいデータのみ記述したGraphQLを記載する以下データが取得できたら成功

```elixir
iex()> Req.post!(req,
...()> graphql: """  
...()> query {
...()>  places {
...()>  id
...()>  name
...()>  }
...()> }
...()> """
...()> ).body["data"]
%{
  "places" => [
    %{"id" => "1", "name" => "test1"},
    %{"id" => "2", "name" => "test2"},
    %{"id" => "3", "name" => "test3"}
  ]
}
```

データが取得可能なことが確認できたので、実装

```ql_crient_web/graphql/query.ex
defmodule QlCrientWeb.Graphql.Query do
  alias AbsintheClient.{Utils, WebSocket}
  alias Req.Request

  def set(path) do
    Req.new(base_url: "#{path}") |> AbsintheClient.attach()
  end

  def places_all_post!(req) do
    Req.post!(req,
      graphql: """
        query {
          places {
            id
            name
            location
            lat
            lon
            scale
          }
        }
      """
    ).body["data"]
  end
end
```

とりあえず、 index.html.heex に上記関数を利用してデータを表示してみる。

```index.html.heex![スクリーンショット 2022-12-05 15.37.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/097208d9-ccd6-da9c-6c28-677443d8da5f.png)

<%
  req = QlCrientWeb.Graphql.Query.set("http://localhost:4000/api")
  %{ "places" => lists } = QlCrientWeb.Graphql.Query.places_all_post!(req)
%>

<section class="phx-hero">
  <%= for list <- lists do %>
    <h2>  <%= list["name"] %> </h2><br>
  <% end %>
</section>
```

とりあえず、以下のように表示されたら成功！

![スクリーンショット 2022-12-05 15.37.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/c58c994b-36b0-f249-8121-32af37a0c8ce.png)


はい、ということで、ここまで準備が完了です。ようやっと色々できる土台ができましたね。
InfluxDB v2: 時系列データの取り扱い例

## 準備
バケットの作成

```bash
influx bucket create -n tochigi -r 72h
```

バケットの一覧

```bash
influx bucket list
```

バケットの削除

```bash
influx bucket delete -n tochigi
```

Token の確認

```bash
influx auth list
```

## データの書き込み
2秒間隔で、6つのデータを書き込みます。

```py:write_temperature.py
#! /usr/bin/python
#
#	write_temperature.py
#
#					Dec/05/2022
# ------------------------------------------------------------------
import sys
import time
import influxdb_client
from influxdb_client.client.write_api import SYNCHRONOUS
# ------------------------------------------------------------------

bucket = "tochigi"
org = "ekzemplaro"
token = '****VpyyJg6nskHEwcl6bMsjc1vyzY9b11hSyGiQMOg=='
#
url="http://localhost:8086"

sys.stderr.write("*** start ***\n")

client = influxdb_client.InfluxDBClient(
   url=url,
   token=token,
   org=org
)

write_api = client.write_api(write_options=SYNCHRONOUS)

ttx = [20.4,21.3,22.7,23.5,22.2,20.2]
for it in range(len(ttx)):
	print(ttx[it])
	pp = influxdb_client.Point("data") \
		.field("temperature", ttx[it])
	write_api.write(bucket=bucket, org=org, record=pp)
	time.sleep(2)
#
sys.stderr.write("*** end ***\n")
# ------------------------------------------------------------------
```

## データの読み込み
30分以内に書き込まれたデータを読みます。

```py:query_temperature.py
#! /usr/bin/python
#
#	query_temperature.py
#
#						Dec/05/2022
# ------------------------------------------------------------------
import sys
import influxdb_client
from influxdb_client.client.write_api import SYNCHRONOUS
import datetime
# ------------------------------------------------------------------
def utc_to_jst(datetime_utc):
	datetime_jst = datetime_utc.astimezone(datetime.timezone(datetime.timedelta(hours=+9)))
	str_jst = datetime.datetime.strftime(datetime_jst, '%Y-%m-%d %H:%M:%S')
	return str_jst
# ------------------------------------------------------------------
bucket = "tochigi"
org = "ekzemplaro"
token = '****VpyyJg6nskHEwcl6bMsjc1vyzY9b11hSyGiQMOg=='
#
url="http://localhost:8086"
sys.stderr.write("*** start ***\n")
client = influxdb_client.InfluxDBClient(
   url=url,
   token=token,
   org=org
)

query_api = client.query_api()
query = ' from(bucket:"tochigi") |> range(start: -30m)'
result = client.query_api().query(org=org, query=query)
results = []
for table in result:
	for record in table.records:
		results.append((record.get_field(), record.get_value(),record.get_time()))
#
for rr in results:
	ttx = utc_to_jst(rr[2])
	print(rr[0],rr[1],ttx)
#
sys.stderr.write("*** end ***\n")
# ------------------------------------------------------------------
```

実行結果

```text
$ ./query_temperature.py 
*** start ***
temperature 20.4 2022-12-05 15:34:23
temperature 21.3 2022-12-05 15:34:25
temperature 22.7 2022-12-05 15:34:27
temperature 23.5 2022-12-05 15:34:29
temperature 22.2 2022-12-05 15:34:31
temperature 20.2 2022-12-05 15:34:33
*** end ***
```
ARアプリをテストするときのテスト観点簡単にまとめてみた

この記事は [【STYLY 主催】XR Advent Calendar 2022](https://qiita.com/advent-calendar/2022/styly) の 5 日目の投稿です
## ARアプリをテストするときのテスト観点簡単にまとめてみた
こんにちは！！
STYLY QAエンジニアのuechanです

自分がSTYLY開発にJoinしてはや9ヶ月が経ちます
思い返してみるとジョイントしたての頃、テストやるぞ！となった時にふと思ったことがあります
## ARのテスト観点なくね？

ということでちょろっと調べた結果を載せてみます
(あくまで一例です。もっといろいろ調べてますよ！！！)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705249/32ea1d96-5e86-564c-356d-3dc407111107.png)
__"AR"の文言が無視されておる…__

これ最初の頃のテストしているときかなり苦しみました…

ですのでARアプリのテストをするときに必要な __AR特有のテスト観点__ についてお話します

 __今回のテスト観点はARの機能を満足するテストを書くという目的で行うことにします！__


## そもそもARとは？
AR(拡張現実)とは「拡張現実」という意味で、現実にデジタル情報を重ね合わせ、現実世界に情報を拡張する技術のことを指します。
こんな感じ↓
![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705249/5af81946-fd33-9f1b-5b71-5e9cf8a3fe02.gif)
現実：元自宅のキッチン
デジタル情報：謎のモデル（QAちゃん）を重ね合わせる
ということができる機能をARと呼ぶことにします

今回のARの機能とは
* 現実世界にデジタル情報を **重ね合わせる**という機能を持つことになります

本記事でのARの機能はシンプルに **現実の平面に3Dモデルを出すことのできる機能** とします


## ARの機能を分解してみる
現実世界にデジタル情報を重ね合わせるという機能を満足するテストになるので細かく機能を分解していきましょう 
1. 現実を映すカメラ機能
1. 現実の平面を認識する画像処理機能
1. 認識した位置とデジタル情報を掛け合わせて配置する3D機能

このぐらいでしょうか？

## 分解した機能を「○○できること」という形式に書き換えてみる
分解した機能を、何ができれば満たされるか？という形式に置き換えます
1. 現実を映すカメラ機能
    1. カメラの映像が正しく映っていること
1. 現実の平面を認識する画像処理機能
    1. 現実に存在する平面が正しく検知できること
1. 認識した位置とデジタル情報を掛け合わせて配置する3D機能
    1. 3Dモデルが意図した描画になっていること
    1. 現実の位置とモデルの位置がずれないこと


## 置き換えた現象の派生形を考えてみる
「○○できること」に書き換えた機能の派生を考えてみましょう

検索機能であれば
1. フォームに入れた検索キーワードで検索できること
    1.様々で文字種で検索
    2.and検索を使う
    3.or検索を使う

などなど…

**実際にやってみよう！**
1. 現実を映すカメラ機能
    1. カメラの映像が正しく映っていること
        1. 室内で映像が映るか
        1. 屋外で映像が映るか
        1. 暗いところで映像が映るか
        1. 明るいところで映像が映るか
1. 現実の平面を認識する画像処理機能
    1. 現実に存在する平面が正しく検知できること
        1. 屋外の地面(コンクリート、アスファルト、土)が認識するか
        1. 屋内の地面(フローリング、畳)が認識するか
        1. ガラスなど、鏡面な場所が認識するか
        1. 暗いところで映像が映るか
        1. 明るいところで映像が映るか
1. 認識した位置とデジタル情報を掛け合わせて配置する3D機能
    1. 3Dモデルが意図した描画になっていること
        1. 3Dモデルの形式がどこまで対応しているか
        1. シェーダーは？ポリゴン数は？
    1. 現実の位置とモデルの位置がずれないこと
        1. スマホを動かしてトラッキングできるか
        1. 歩いてみてトラッキングできるか
        1. 階段を上ったり、スマホを上下にしてトラッキングできるか


## もうこれで完成です！！！
**気が付いたらざっくりしたARのテスト観点できてますね！**
1. 現実を映すカメラ機能
    1. カメラの映像が正しく映っていること
        1. 室内で映像が映るか
        1. 屋外で映像が映るか
        1. 暗いところで映像が映るか
        1. 明るいところで映像が映るか
1. 現実の平面を認識する画像処理機能
    1. 現実に存在する平面が正しく検知できること
        1. 屋外の地面(コンクリート、アスファルト、土)が認識するか
        1. 屋内の地面(フローリング、畳)が認識するか
        1. ガラスなど、鏡面な場所が認識するか
        1. 暗いところで映像が映るか
        1. 明るいところで映像が映るか
1. 認識した位置とデジタル情報を掛け合わせて配置する3D機能
    1. 3Dモデルが意図した描画になっていること
        1. 3Dモデルの形式がどこまで対応しているか
        1. シェーダーは？ポリゴン数は？
    1. 現実の位置とモデルの位置がずれないこと
        1. スマホを動かしてトラッキングできるか
        1. 歩いてみてトラッキングできるか
        1. 階段を上ったり、スマホを上下にしてトラッキングできるか

あとは細かいパラメータをかけあわせたり、テストケースの形式になるように手順を補完するなりすきにしてください！

## 終わりに
文字ばっかりで読みにくい記事ですが再度まで読んでいただきありがとうございます

テスト観点の作成方法みたいな記事になってしまいましたが
これを読んだ方のテストライフがより良いものになりますように！
Ansible lintのルールの適用方法について

こちらの記事は[Ansible lint Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ansible-lint) 6日目の記事になります。

今回はAnsible lintのルールの適用方法について考察します。

### ブラックリスト方式とホワイトリスト方式について

セキュリティーの分野においてよく使われる用語に`ブラックリスト方式`と`ホワイトリスト方式`があります。`ブラックリスト方式`は脅威となる対象をリスト化します。反対に`ホワイトリスト方式`は安全と考えられる対象をリスト化します。

これは[firewalld](https://ja.wikipedia.org/wiki/Firewalld)の設定やAWS EC2の[セキュリティーグループ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-security-groups.html)を思い浮かべれば分かりやすいかと思います。


### Ansible lintで適用するルールを指定する基本的な考え方

Ansible lintの初期設定では`ホワイトリスト方式`が採用されておりAnsible lint実行時にはすべてのルールが適用されます。「**全てのルールが適用された状態から必要に応じて適用しないルールを指定する**。」これがAnsible lintのルールの適用方法の基本的な考え方です。

### Ansible lintで採用しないルールを指定する

Ansible lint実行時に適用しないルールを指定する方法は２つあります。`skip_list`と`warn_list`です。`skip_list`で指定されたルールもしくは[タグ](https://qiita.com/mamono210/items/a8c9c6301522f471229c)は処理がスキップされます。`warn_list`に指定された場合は処理は実行されますがエラーが検出された場合は警告が出力されます。

#### コマンドオプションで指定

```bash
# skip_list

ansible-lint <target> -x SKIP_LIST
# もしくは
ansible-lint <target> --skip-list SKIP_LIST
```

SKIP_LISTにルール名もしくは[タグ](https://qiita.com/mamono210/items/a8c9c6301522f471229c)名を指定します。


```bash
# warn_list

ansible-lint <target> -w WARN_LIST
# もしくは
ansible-lint <target> --warn-list WARN_LIST
```

WARN_LISTにルール名もしくは[タグ](https://qiita.com/mamono210/items/a8c9c6301522f471229c)名を指定します。

#### 設定ファイルで指定

```yaml
# skip_list

skip_list:
  - SKIP_LIST
```

SKIP_LISTにルール名もしくは[タグ](https://qiita.com/mamono210/items/a8c9c6301522f471229c)名を指定します。

```yaml
# warn_list

warn_list:
  - WARN_LIST
```

WARN_LISTにルール名もしくは[タグ](https://qiita.com/mamono210/items/a8c9c6301522f471229c)名を指定します。


#### skip_listとwarn_listはどちらを採用すべきか

基本的には`warn_list`を採用すべきでしょう。採用しないルールを`skip_list`に指定してしまうと警告も出力されないためずっとコンテンツの改善がなされないままになります。`warn_list`を採用してこのコンテンツには問題があると言う表示は出力させておくべきです。

### プロファイルで指定する

Ansible lintには[プロファイル](https://qiita.com/mamono210/items/b7c6beafe28ddd24eff4)と言うルールの分類方法もあり[プロファイル](https://qiita.com/mamono210/items/b7c6beafe28ddd24eff4)で指定して採用するルールを指定する事も可能です。

#### コマンドオプションで指定

```bash
ansible-lint -p <profile> <target>
```

#### 設定ファイルで指定

```yaml
profile: <profile> # min, basic, moderate,safety, shared, production
```

#### プロファイルを利用すべきか

[プロファイル](https://qiita.com/mamono210/items/b7c6beafe28ddd24eff4)は最近追加された機能です。将来的に[プロファイル](https://qiita.com/mamono210/items/b7c6beafe28ddd24eff4)で分類されているルールが変更になる可能性が非常に高く現時点では積極的に採用する段階ではないかと思われます。
gunzip でオリジナルのタイムスタンプを保持して展開する


過去のアクセスログファイルなどを調査する際、特に AWS の ELB や CloudFront のログなどは大量のファイルが作成されます。

そんな時、ログファイルのタイムスタンプを保持しながら展開すると、更新時間別にファイルをソートして調べたい時間帯のログを見つけやすくなります。

```
cd [ログの保存先]
gunzip -N *.gz
```

他のオプション

短縮 | 内容
----|---
-k  | 圧縮・展開前のファイルを残す
-N  | ファイル名とタイムスタンプを保持する
-n  | ファイル名とタイムスタンプを展開・圧縮時のものにアップデートする
-r  | ディレクトリの中も展開・圧縮する
-v  | 処理を表示



参考: [【 gzip 】コマンド／【 gunzip 】コマンド――ファイルを圧縮する／伸張する](https://atmarkit.itmedia.co.jp/ait/articles/1608/09/news018.html)
論理削除が存在するテーブルをQuery Builderで取得する際の注意

## 概要

LaravelでのDB操作にはEloquentとQuery Builderがあります。

操作対象のテーブルに論理削除の概念があった場合、QueryBuilderには注意が必要です。

## QueryBuilderはデフォでは削除済みデータも含む

DB
1人だけ論理削除します
![スクリーンショット 2022-12-05 15.19.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/84bbb5af-23ba-1c02-bece-7ac549cf70ae.png)

Eloquentで[全て取得、削除済みも含む]
QueryBuilderで[全て取得]
処理を行います
```php:さんぷる
dd([
    'Eloquent:User all' =>  User::all(),
    'Eloquent:User withTrashed' => User::withTrashed()->get(),
    'QueryBuilder:User get' => DB::table('users')->get(),
]);
```

### 結果

```php
array:3 [
  "Eloquent:User all" => Illuminate\Database\Eloquent\Collection {#1408 ▼
    #items: array:3 [▶]
    #escapeWhenCastingToString: false
  }
  "Eloquent:User withTrashed" => Illuminate\Database\Eloquent\Collection {#1412 ▼
    #items: array:4 [▶]
    #escapeWhenCastingToString: false
  }
  "QueryBuilder:User get" => Illuminate\Support\Collection {#1179 ▼
    #items: array:4 [▶]
    #escapeWhenCastingToString: false
  }
]
```


QueryBuilderでdeleted_atに条件指定せずに``get()``した場合削除済みのデータまで引っ張ってしまいます。
TypeScript AST viewerの使い方

## 背景
インターン先のプロジェクトでTypeScript AST Viewerを触る機会があり、備忘録として記事に残してみました。
現時点（2022/12/9現在）でTypeScript AST Viewerの細かなドキュメントがないのと、前提知識としてTypeScriptのAST（抽象構文木）の理解が必要で、使いこなせるようになるまでに時間がかかってしまいました。

## TypeScript AST Viewerとは
知りたいTypeScriptのコードを与えてあげるとそのコードに関するASTの構造やその詳細を知ることができるツールです。

https://ts-ast-viewer.com/

### 何に使われる？
TypeScirpt AST Viewerの作成者（[David Sherret](https://github.com/dsherret "github")さん）が行ったTSconf 2018の登壇によると、コードの自動生成ツールやコードの静的解析を行うツールを作成する際に使われるケースが多いそうです。

https://youtu.be/CTpKZgy0dpo

## 使い方

TypeScript AST Viewerは以下の画像のように４つのエリアに分かれています。これらのエリアについてみていきましょう。
![ts-ast-viewer.com_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600371/1a7716cf-e7dc-386c-a341-05d9eaf9d16a.png)


### ① コードエディターエリア
画面左上のコードエディターエリアに調べたいコードを記入します。記入するとリアルタイムで②~④のエリアが更新されます。
また、下部の青いバーはカーソルの位置、行数、カラム数を示しています。
![AST_viewer_blue_bar.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600371/0393fc79-3fb8-4bb4-cf78-b4dd649da92c.gif)

### ② ASTエリア
真ん中の②のエリアであるASTエリアは、①のコードエディターエリアに記入したコードのASTが表示されます。
一つ一つの項目をNodeと言い、表示される項目名は[こちら](https://github.com/microsoft/TypeScript/blob/main/src/compiler/types.ts#L21-L464)のSyntaxKindで定義されています。

### ③ プロパティエリア
画面右側のエリア

<img width="400" alt="プロパティエリア" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600371/f33513cf-a399-e6c1-d996-2d32556e0a59.png" >

②のASTエリアで選択した項目の詳細が表示されます。表示される種類として、
- Node
- Type
- Symbol
- Signature
- FlowNode

が表示されます。以下ではこれらを説明していきます。

#### Node
選択した項目のNodeの詳細が表示されます。


#### Type
選択した項目のNodeのTypeが表示されます。
Typeは選択された項目のNodeの型推論の内容を示しています。
`flags`に番号が記入されているのは[こちらのTypeFlags](https://github.com/microsoft/TypeScript/blob/48fa3a5f18a7090a7b3fb8836159fee7e48a8013/lib/typescript.d.ts#L2286-L2334)で定義されている型の種類です。

#### Symbol
選択した項目のNodeのSymbolが表示されます。
Symbolというのは [TypeScript Deep Dive](https://basarat.gitbook.io/typescript/overview/binder#symbol) に説明があったのですが、わかりづらかったので[こちらのページ](https://katashin.info/2018/02/24/221)を参考にさせていただいました。
抜粋させていただくと、
> シンボルに関しては理解が怪しいのですが、束縛を表すもので、それへの参照を解決するために生成されるオブジェクトだという理解です。例えば、以下のようにあるクラス Foo が宣言されている時、その下で new Foo() が呼び出されている時、この2つのノードはあるシンボルを通じて結ばれています。

```typescript
class Foo {
  name = 'Foo'
}
 
const foo = new Foo()
```

#### Signature
選択した項目のNodeのSignatureが表示されます。

https://qiita.com/Takepepe/items/1d61b3314459e81d849c#tstypecheckergetreturntypeofsignature

こちらの記事を参考にさせていただくと、signatureは関数宣言やアロー関数を指しています。

#### FlowNode
選択した項目のNodeのFlowNodeが表示されます。

### ④ 自動生成コードエリア
①のコードエディタエリアで選択されたエリアを自動で生成してくれるコードが生成されます。（便利！！笑）
githubはこちら

https://github.com/dsherret/ts-factory-code-generator-generator/

## まとめ
以上、TypeScript AST Viewerの説明でした！
紹介した以外にも色々なツールやユースケースがあるのでみなさんも調べてみてはいかがでしょうか。

## 参考
- https://qiita.com/Takepepe/items/3353159894ed57b6f0a8
- https://youtu.be/CTpKZgy0dpo
- https://katashin.info/2018/02/24/221
ワーケーション実証実験に参加してみた！

皆様こんにちは。

この記事は ハンズラボ [AdventCalendar2022](https://qiita.com/advent-calendar/2022/handslab) 6日目です！

宜しくお願い致します。

# はじめに

昨今働き方改革がお国や企業で騒がれておりますが、今回は色々ありましてワーケーションの実証実験をすることになり、
実際に行った感想や仕事に必要な物、ホテル選びなど共有できればと思います！

# 今回のワーケーションで感じた必要な持ち物

### 必須

* パソコン
* 充電ケーブル
* 充電器（できればAnkerとかの小さくて軽い充電器）

※正直電波さえあればこれとスマホだけでテザリングを使ってネットはできる

### あると良い

* プライバシーフィルター
* 衝撃吸収できるパソコンケース
* モバイルモニタ
* ポケットWi-Fi 又は LTE対応の通信ドングル
* 映像ケーブル類
* キーボード
* マウス
* エアクッション

※基本的に軽量にしておいた方が旅行の際の荷物を減らせるので良い


# ホテル選び

### 必須条件

* スマホの電波がつながる
* 電源がある（使える）

### あると良い条件

* ワーケーションプランがある（各機材の貸し出し等）
* デスク（なければワークルームみたいな物がある）
* 暗号化されたWi-Fi
* レストラン等がある(温泉地等だと意外と食べる場所が限られるので)
* 温泉（疲れを取りやすくなる）
    * コーヒー牛乳
* コンビニ・スーパー, 電気屋が近い（忘れ物や緊急時にリカバリしやすい）


# ワーケーションでの実際の流れ

* 最寄り駅：小田急線 箱根湯本駅
* ホテル：[湯元富士屋ホテル](https://www.yumotofujiya.jp/) ワーケーションプラン

### 移動

移動には途中まで在来線を使って、小田急線の特急「ロマンスカー」を利用しました。

![IMG_2488.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181414/f7c40586-5958-f63d-da01-c777a5980bbc.jpeg)

移動中は特にやることもないのでお昼を済ませました。
指定席でしたが隣も居なかったのでゆったり出来ました！

![IMG_2489.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181414/5c5b5902-a351-3e2b-2910-a4c6561e7a0b.jpeg)

### 箱根湯本着

駅降りて目の前の橋を渡ったらホテルでした。
徒歩3-5分程度のところにあるので買い物も比較的しやすかったです。

![IMG_2490.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181414/fcc0e526-5bbc-a064-a09a-b9c99240d4c6.jpeg)

### ホテル＆部屋着

部屋はツインで奥にデスクが設置されている形でした

![IMG_2491.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181414/26cf81a9-d1d7-3d78-91bf-a3178c17dbeb.jpeg)

因みに下記はレンタルできたので事前に申請していました。
* デスク
* 椅子
* スタンドライト
* モニタ（フルHD）
* ケーブル（HDMI, D-sub)
* 電源タップ（USB充電付き）

一通り業務に必要な物があったので凄く助かりました（荷物が減る）

![IMG_2492.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181414/6c4c3af8-873e-0f98-db04-2146614a920d.jpeg)

また、無料でラウンジのコーヒー・紅茶が飲み放題で泊まってる間に４回ぐらい飲みました！
箱根なので当然ホテルに温泉もあり昼休みに温泉に行ったり出来るので気分転換も出来てとても良かったです。

※きちんと温泉にコーヒー牛乳ありました！！（ここ凄く大事）

![IMG_2522.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181414/a7f7b4f3-94c7-fa64-c072-67377dae55f3.jpeg)

# 総評

### 良かった点

* 休憩で温泉に行けるのは最高（コーヒー牛乳もあった）
* いつもと違う環境なのでいい意味で新鮮
* 無料でラウンジのコーヒー・紅茶が飲み放題だった（部屋へ持ち帰りOK）
* 仕事が終わったら観光に行ける

### 悪かった点

* パソコンの画面を割った（移動中の荷物管理）
* 観光地故に営業時間の短いお店が多かった（夕食難民）
* 快適すぎて帰りたくなくなった

### 感想

実際にワーケーションをやってみて思いましたが、思ったよりも仕事しやすく、またリフレッシもしやすかったのでいつもより仕事ははかどりました。
反対派の意見として旅行先で仕事したくないなど色々考えはあると思いますが、
個人的には滞在時間を長く出来るので観光やご当地グルメを食べる機会を増やせると考えればありだと思いました。
ただ、事前の準備として必要なもののリストアップや執務予定の場所のネットワーク環境など事前に調査しておくべきことは多いように感じました。
※最悪PCとスマホの電波が通ればどうにかはなりますが...

エンジニアは常にモニターを見て机に座ってする仕事なので朝昼夜で温泉に行けるのはだいぶ良かったです。
家の風呂でもある程度は賄えますが、やはり足が伸ばせる大きい温泉は最高でした。

もし制度としてワーケーションがある方は是非試してみては如何でしょうか！
以上、ワーケーションの検証に参加してみた感想でした。
AWS 系の操作 手順と注意点まとめ

まずはドキュメント読め、、に尽きるのですが、次に自分でやる時は素早くできるように備忘録として参考手順と注意点を記録してます。

## EC2

- [EBSの拡張](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html)
    - 注意点: ファイルシステムによって拡張コマンドが異なるので、拡張前に調べること
Windowsのサービス開始停止をbat（コマンド）で実行

# 概要

テスト環境のデータベースのサービス。
    
『誤ってテスト環境に向いたままの本番プログラム』
があったらエラーになって検知できるように、念の為普段はサービス停止してる。
（常にサービスを起動しておけない事情がある）

テスト環境で動作確認したい時は、
タスクマネージャー開いてサービスタブまで行って右クリック ⇒ 開始 or 停止
してる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0ba56b30-c99e-2604-c950-e0abc5318bd8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5a4117a2-27be-2e86-51f5-13e4813845d3.png)

タスクマネージャー開くのとか面倒くさいのでコマンドで実行したい。
（bat用意しときたい）

# やり方

```bat:サービス開始
sc start "サービス名"
```

```bat:サービス停止
sc stop "サービス名"
```

# 実行権限

下記のように『アクセスが拒否されました。』となったら、コマンドプロンプトを管理者権限で開いて実行する必要あり。
（停止についても同様）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d8e418b5-684a-3adc-145e-0a2663050629.png)

# すでに開始してるサービスを開始しようとした場合

下記のようにエラー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0594d97e-e62c-d876-1c78-a3bbfa679257.png)

# すでに停止しているサービスを停止しようとした場合

下記のようにエラー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8dce85c8-d811-d1f8-cd3d-f1b38c980a9b.png)

# 参考サイトさん

https://mr-star.hatenablog.com/entry/Windows%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E5%81%9C%E6%AD%A2%E3%83%BB%E8%B5%B7%E5%8B%95%E3%82%92%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E5%AE%9F%E6%96%BD%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2311
【WordPress】get_posts の総ページ数を取得したい場合

ページネーション実装時などで総ページ数を取得したい場合、 `get_posts()` では取得できない問題がある。

```php
$args = [...];
$post_list = get_post($args);

foreach($post_list as $post) {
    ...
}
// page_max は？取れる方法がありません。
```

以下で同じ `$post_list` を取得しつつ総ページ数も取得できるっぽい。
```php
$args = [...];
$q = new WP_Query($args);
$post_list = $q->get_posts();

foreach($post_list as $post) {
    ...
}

$q->max_num_pages;

```

WordPress によく慣れている人なら `have_posts()` や `the_post()` 使って書くのが普通なのかもしれないけど
あれ何やってるか分からん…という人向けの解決方法でした
自己紹介

みーです。《》に入るeの数は8つです。

はじプロを2385時間もしてる凄い人です。2385時間もしてる割にはあまりクオリティは高くありません。それでも遊んでくれる人は好きです。いいねしてくれたりRTしてくれる人はもっと好きです。感想もくれたらまじで大好きです。

…ということで、この記事では以下のようなことが書かれております。

・たくげーについて
・ホラゲーの極意
・最後に

それではいってみよー！



【《たくげーについて》】


まずたくげーってなんぞや？って人のために、詳しく説明しときます。

-たくげーとは-
TACTYさんが主人公のゲームのことでありますが、TACTYさんのみ出演してる作品もあれば、TACTYさん以外の人も出演している作品もあります。


私が作っているたくげーは、TACTYさん以外も出演するタイプのたくげーです。しかもただのたくげーではなく、どのたくげーも10個を超える大規模作品となっています。私が作ったたくげーの種類は今のところ5つあります。


バレンタインアドベンチャー(10連結)
バトルofホワイトデー(13連結)
みんなで海に行こう！(16連結)
FALL BATTEL(14連結)
トリック★ハロウィン(16連結)

今思えばとんでもない量作ってんなって自分でも思います。本当とんでもない時間をはじプロに費やしてると思います。

なぜここまでたくげーを作っているのか？

時は遡り、2022/2/15のたくてぃさんの配信にて
2/14に制作したバレンタインアドベンチャーをなんと特別配信でプレイしてくれました！(URL貼っておきます)

https://youtu.be/TDMMV8psiAA

約40分間配信でプレイしてくれて、私はとても嬉しかった。頑張ってアイコンを書いてよかった。喜んでくれてホッとした。

また作ってみたいと思った。

そこから私は、たくげーを作るのにハマり、たくさん作っていくようになりました。
そしてバレンタインアドベンチャーの配信のチャット欄では「私も参加させて！」「私も参加したい！」「サムネに選ばれたい！」みたいなコメントがチラチラあったので、当時は思わずニヤニヤしちゃいましたw

そして、私が1からポチポチ打ったアイコンの数はこんだけ増えました！

before
![F5260AB5-28E9-4962-8F70-74655C0CC498.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3019555/d31477a0-b08b-becd-810d-85e6f2b11880.jpeg)

after
![E6034194-B850-42AB-A39E-0CC0E39F1247.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3019555/cd72fe7e-e141-5882-2d03-bdeb1c1cd36c.jpeg)

…どうでしょう？初期の頃と比べるとすげぇ増えました！こんだけ書いてて頭おかしくなりそうです！嘘です！
とはいえ、よくここまで書いたなあ自分…ﾜﾀｼｽｹﾞｰ!

たくげーも参加者希望が増えてくれて嬉しい一方、もちろん悩み(ほぼ愚痴)もあります。
私はバレンタインアドベンチャー、バトルofホワイトデー、みんなで海に行こう！、計3種類は、参加者を募集する方式ではなく、個人的に出したい人を厳選して(勝手に)出演させちゃってました。それだと相手側に迷惑がかかると反省し、FALL BATTELから、参加者をTwitter、discord、YouTubeで募集するようにしました。

ここで問題発生

「…この人、はじプロしてる人？」

そう、はじプロしてる人かどうかわからない人が参加希望を出していることがあったのです。私のたくげーは、一応参加者の作品をリスペクトして出演させているため、これだとどう作ろうか迷ってしまうんですよね～。だから個人的にはもっとはじプロで作品を投稿して、その人の作品の個性が知りたい！ってのが、悩みです。はい、終わり！次いこう！

【《ホラゲーの極意》】

実は私、ホラゲー作るの好きなんですよね(最近はとある配信者の影響で作っていませんが)。
そのホラゲーを配信者にやってもらい、びっくりしてもらうのが生き甲斐です♪

そんなことばっかりしていたら、あるコメントを見かけました。

「クソでかいびっくり音声の作り方教えて」

と、来たような気がします。
なので、丁度いいので作り方をご説明いたします。

使うノードンの数は6種類！
音ノードン(おどろく女)【音量2速度1.2】
音ノードン(おどろく女)【音量2速度2】
音ノードン(ヘリコプター)【音量2速度1.2】
ボタンノードン【再生ポートに入れる】
定数1.2
定数2

これで完成！あとはホラー画像を自分で作って、配信者をビビらせよう！
追記:これで配信者に嫌われたりNGされたりしても知りません。ご了承ください。

【《最後に》】
いかがだったでしょうか？私の裏話的な話は楽しめたでしょうか？たくげーやホラゲー以外も作ってるので、気が向いたらでいいので、プレイして感想を送ってもいいんですよ？ﾁﾗﾁﾗ

ということで、ここまで読んでくれてありがとうございましたー！！！
reactiveに業務をしながらproactiveに動くこと、持つべき視座について（別名：EM忙殺問題）

キャディ株式会社でエンジニアリングマネージャーをしている平岩です。
本エントリは [Engineering Manager Advent Calendar 2022
](https://qiita.com/advent-calendar/2022/em) のカレンダー1の5日目の記事です。

今年もアドベントカレンダーのシーズンになりましたね。クリスマスシーズンだからポエムを書こうと思います。

```
クリスマスプレゼントの提案です。
敵には許しを、
競争相手には寛大さを、
友には心を、
顧客にはサービスを、
すべての人に慈悲を、
すべての子供たちには良き先例を、
そして自分自身には尊敬の念を。

by オーレン・アーノルド （1960年代に活躍したアメリカのジャーナリスト・小説家）
```

~~（「クリスマス　ポエム」で検索した結果を貼りました。）~~

非常に抽象的でよくわからないタイトルのエントリに見えるかもしれませんが、こんな感じの素敵なポエムになったら良いなという気持ちで、綴っていこうと思います。

ではさて、

# EMの皆さん、こんなことありませんか？

- カレンダーがスクラムイベントと組織系の会議と1on1で全部埋まった
- 会議や採用面接が連続していて、準備とアフターフォローをする時間もない
- 突発的なトラブルのフォローで予定を全部リスケしてしまった
- ちょっと手が空いたなと思ったら、差し込みタスクが大量に来た
- あまりに手が空かないので会議中に内職してしまい、他参加者から不興を買う
- すぐやらなくても大丈夫な仕事を先延ばしにし続けて半年くらい経った
- どんどん舞い込む仕事に対応しつづけていたら
    - 上司やメンバーから「何をしているのかわからない」と言われる
    - 自分自身も何屋なのかわからなくなってくる…

# reactiveに動くことの限界

エンジニアリングチームやエンジニアリング組織の様々なマネジメントに向き合っているEMにとって、イベントが発生してからそれに対応するということはよくあることだと思います。もちろん、そういうイベントを発生させるための仕組み（プロダクト戦略や人事戦略など）も含めてEMの仕事の範疇とも言えるのですが、運用に載った段階で対応の仕方としてはどうしてもreactiveな動き方になってしまうことも多いと思います。

そうして、どんどんreactiveな仕事が多くなっていった結果、どうしても普段の業務を切り離してじっくり考える時間が取れず、EMとして本当に価値発揮すべき仕事を見失ってしまうこともありうると思います。

経験的にですが、reactiveな仕事とproactiveな仕事、結構使うアタマが違う気がするんですよね。reactiveな仕事が大半を占めた結果として、proactiveにアタマを使うことのコストが大きくなってくるような、コンテキストスイッチといえばそうなのかもしれませんが、reactiveにアタマを使うことが多いとproactiveな発想が出てきづらくなることはある気がしています。

# proactiveに動くためにreactiveな仕事を何とかする

では、その状況への回答として、proactiveに動いていくにはどうすれば良いのでしょうか。

問題の一つはreactiveなマネジメント仕事がEMに集中しやすいことです。チームや組織のサイズやカルチャーにもよりますが、採用やピープルマネジメントだけでなく、EMは担当範囲内でこぼれたボールは全部拾うことになりがちです。マネジメントスキル的に他メンバーが対応しづらい、エンジニアにやってもらうのは忍びないから自分で巻き取っちゃう、といったケースがあるでしょう。

この状況を打破するには、やらないことを増やすか、仕事をシェアするか、大枠どちらかしかないように思います。業務整理や見直しによって少ないトレードオフでやらないことを増やせれば、それに越したことはないですが、そうもいかない場合はつらいところ。どれも不可欠な仕事なのであれば、他の人でもやれるように仕組み化や育成や採用を行っていくしかなくなりますが、どうしてもリードタイムが長くなります。その徴候を感じたら、将来的にエンジニアリング組織が迷走する要因になりかねません。組織課題として担当範囲のメンバーだけでなく、上長や経営陣に相談しておき、半年〜1年での組織課題としてマイルストーンも考えた方が良いと思います。

# proactiveに動くための方法を考える

仮に、ある程度は仕事の集中を緩和できて、EMが考える時間を確保できたとします。その後、どうやってproactiveなアクションを決めて実施していくのでしょうか。その一つは、現在の課題ではなく（現在の課題という時点でreactiveでもある）、将来的な課題に目を向けることが基本になる気がしています。

例えば、将来的にそのプロジェクトが本格始動したら浮きそうなボールをあらかじめ拾いにいくといったものです。ちょうど、今年のアドベントカレンダーの記事でそれに近いことを主題に議論されている記事がありました。

https://note.com/hidenorigoto/n/na7f3f3e0da84

やや抽象的ではありますが、事業戦略や組織戦略を理解し、現状や理想を照らしあわせることで、エアスポットになっていたり、曖昧になっている部分をケアしにいく、という発想ですが、EMがproactiveに動くための考え方として参考になります。

一方、EMがproactiveに動かざるを得ない仕組みを作る、という発想もあると思います。OKRやKPIのオーナーになることや、大きな定性目標をまずは標榜してしまうといった、目標ドリブンに動き、目標からの逆算で実際の行動を決めていくというのは定番に近いやり方だと思います。

また他の仕組みとしては、以下の今年のアドベントカレンダーの記事で紹介されていた、LayerXさんの「20%口出しルール」は面白いものだと思いました。

https://tech.layerx.co.jp/entry/bakuraku-scrum

EMだけが対象ではないですが、よりproactiveな動きを奨励していくカルチャーの作り方として参考になります。

# EMの付加価値って何だろう？

https://qiita.com/hiraiva/items/2f279b507300515c6336

去年のこちらの~~ふざけた~~エントリでも軽く言及させていただきましたが、開発チームに明確な課題がある場合は、マイナスをゼロにする的な意味でEMは価値を発揮しやすいと思います。そうでないとき、ゼロをプラスにさらに上げていきたい場合に、どういった価値を発揮していくかがEMの持つべき考えとして重要なのではないかと最近考えています。

なぜなら、事業やプロダクトの競合優位性を築くには、問題ないことを超えて、明確な強みが必要になると思うからです。起こり続ける課題や問題に対応し続けることに忙殺されてしまうと、なかなかそこまで考えを巡らすことは難しいことも多いかもしれませんが、少なくともそういったアップサイドを取りに行く意思をEMとして大事にしていきたい、そんなことを思った師走でした。
Pythonをdocker-composeで立ち上げてみる

# はじめに
　docker-composeでなくても、「dockerで一つコンテナを用意するだけではだめなのか」という問いもあるかもしれません。ですが、そもそもこれは通信アルゴリズムのテストに使用したかった、という経緯ですので、そこはまずご了承くださいな。
　この記事では、docker-composeによりpythonの仮想環境を整えるということのみに焦点を当てています。他、TCP/UDPによるnode.jsとの通信は他の記事にて解説する気ですのでよろしくお願いします。
　なお、この記事の成果物は以下のリポジトリに入ってますので、多少docker-composeに慣れていて「見れば分かるわ～わはははは～」という方は次のURLからクローンしてみてくださいな。(そもそもこの記事を見てないかな？)

https://github.com/DogKingFun/docker-compose_python

# ディレクトリ構成

```
　
docker-compose.yml
python/
 　├ app.py
 　├ Dockerfile
 　└ requirements.txt
```

# docker-compose

```docker-compose.yml
version: '3'

services:
   python:
     build: ./python
     container_name: PYTHON
```

　重要なのはbuildの項だけでしょう。
　これはpythonディレクトリにDockerfileがあるので、それを参考にコンテナを作ってね、ということです。docker-composeでは他にも環境変数をいじったり出来る用ですが、pythonコンテナをとりあえず建てたいというだけであれば、問題はありません。

# Dockerfile

```Dockerfile
FROM python:3

# アプリケーションディレクトリを作成する
WORKDIR /usr/src/python

# pipのアップデート
RUN pip install --upgrade pip

# pipでインストールしたいモジュールをrequirements.txtに記述しておいて、
# コンテナ内でpipにインストールさせる
# requirements.txtの書き方は[pip freeze]コマンドから参考に出来る
COPY requirements.txt ./
RUN pip install -r requirements.txt

# アプリケーションコードをコンテナにコピー
COPY . .

EXPOSE 8000
CMD [ "python", "app.py" ]
```

## FROM python:3
　「Python3.xのバージョンのあるイメージを使う」という意味…だと思います。たぶん。

## WORKDIR /usr/src/python
　コンテナ内では仮想のLinuxOSが起動しています。
　その/usr/srcディレクトリにpythonディレクトリを作成し、どうやらカレントディレクトリにしているようです。

## RUN pip install -rf requirements.txt
　これはrequirements.txtに書かれているインストールしたいモジュールをインストールする処理です。この前にCOPYによって、用意していたrequirements.txtをコンテナ内にコピーしているため使うことが出来ています。インストールしたいモジュールをRUN pip install numpyのようにいくつも書くのはめんどくさいのでこのインストール方法を採用しました。
　requirements.txtの書き方は「pip freeze」コマンドで確認できます。

## COPY . .
　コンテナ外のカレントディレクトリの全ファイルおよびディレクトリを、コンテナ内のカレントディレクトリにコピーしています。これにより、コンテナ外にあるファイルを編集することでプログラムの変更が可能です。
　docker-composeを使ってアプリ開発をするのであれば、必須級のコマンドだと思います。
```Dockerfile
COPY . .
```

# app.py
　コンテナを起動して、ちゃんと動くか確認するためのコード。
　なのでとても短い。

```app.py
print('test')
```

# requirements.txt
　requirements.txtの内容です。参考までにnumpyをインストールしていますが、見ての通り今回は使用していません。

```requirements.txt
numpy
```

# 起動

```
docker-compose up --build
```

　コマンドを実行するとprintのアウトプットが表示されると思われます。

```
Attaching to PYTHON
PYTHON    | test
PYTHON exited with code 0
```

# 終わりに
　docker-composeは他のコンテナを同時に立ち上げ、ネットワークを構築することに強みがあります。なのでpythonコンテナを一つ立ち上げるだけではさほど意味があるとは言えません、もしdocker-compose初心者の方がこの記事を見て、pythonのコンテナを立ち上げたのなら、そこから他のコンテナとの通信を試して見すことをお勧めします。
　docker-compose玄人の方がこの記事を見たなら、間違ってる点を指摘して頂ければと思います。僕の勉強にもなりますので。
　以上です。
Apple Developer Program のサイトで毎年行うデバイス削除の知識整理

# はじめに

Ad HocビルドのiOSアプリをiPhoneやiPadにインストールするには、事前にApple Developer ProgramにiPhoneやiPadのUDIDを登録しておく必要があります。
登録できるデバイスの台数には上限があり、登録済みデバイスを削除できるタイミングは年に一回しかありません。

今回はこの、年に一回のデバイス削除（※）について予備知識を整理します。年に一回しかやらないから、毎回忘れちゃいますしね。
※ 「デバイスリセット」「デバイスリストのリセット」などと呼ばれたりもするようです。

デバイス削除に関するApple公式の説明は下記に少しあります。
https://developer.apple.com/jp/support/account/

# 台数のカウントルール

登録できるデバイスの台数上限は、デバイスの種類毎に100台**ずつ**です。iPhoneとiPadは別枠でカウントされます。

登録済みのデバイスは、あとから無効化することもできますが、**無効化しても台数にカウントされ続けます。**
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188748/f5698d54-7603-9c05-5631-1650a58fe60a.png)

# 登録と無効化・有効化はいつでもできる

デバイスの登録は、年中いつでもできます。**それだけに、上限には注意しながら登録しましょう。**

登録したデバイスの無効化や再度の有効化についても、年中いつでもできます。
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188748/862bfa11-72da-ce94-feab-365fe77e9f6f.png)

# デバイスを削除して台数の空きを作れる機会は、年に一回だけ

台数を減らして空きを作るには、無効化でなく削除が必要です。これができるのが、**毎年の契約更新後の一回だけになります。**

![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188748/48cc0ddb-009d-aff4-fd57-14515a6f9cfb.png)

# 事前準備はそれほど必要なく、デバイス削除の時だけ落ち着いて操作すればOK

毎年の契約更新の日付は、Apple Developer Programのサイトで確認できます。
https://developer.apple.com/account/

**デバイス削除ができるようになると、サイト上にお知らせがひょっこり表示されます。**
具体的なUIは時々変わりますが、とにかくサイトにアクセスすれば自然と気づけます。
表示が出始めるタイミングは、契約更新の当日ぴったりとは限らないようです。1〜2日後であることもあります。

**実際にデバイス削除の操作を完了させるまでは表示は出続けるので、慌てる必要はありません。**
「年に一回、xx月xx日にしかできない」わけではないです。「例のやつ出た」「明日にでもやりますか」ぐらいでも大丈夫です。

**削除したいデバイスは、事前に無効化していなくても大丈夫です。**
現在有効なデバイスも無効なデバイスも、両方とも削除可能です。お知らせが表示されてから棚卸しを始めても大丈夫です。

実際に削除操作をする画面まで進むと、デバイス一覧が表示されます。一覧の中から、残すデバイスと削除するデバイスをチェックボックスで選び分けます。
具体的なUIは時々変わる可能性がありますが、事前に無効化済みのデバイスは、一覧表示の時点で「削除する方」になっているようです（今のところ）。

**残すかどうか迷うぐらいのデバイスは、いったん削除しましょう。**
登録は年中できますから、迷ったら削除で問題ありません。**削除し損ねることの方が問題です。**

# まとめ

- デバイス削除は年に一回しかできないけど、慌てる必要はない。その時期が来てから思い出すぐらいでもセーフ。
- 年の途中で100台の上限に達すると困る。登録に関しては、残りの空きを見据えながらやっていく。
- デバイス削除当日は、「迷ったら削除」でOK。再登録は年中できる。
Nuxt.js で旧バージョン(2.x)のプロジェクトを新規作成する

# 概要
- Nuxt.js で旧バージョン(2.x)のプロジェクトを新規作成したい
- 2022/12/05 時点で以下ドキュメントの参考にコマンドを実行すると 3.x で作成される
    - https://nuxtjs.org/docs/get-started/installation
    - `yarn create nuxt-app <project-name>`

# 対応方法
- create-nuxt-app のバージョンを指定して実行する
- ツールに合わせて以下のいづれかを
    - `yarn create nuxt-app@4.0.0 <project-name>`
    - `npx create-nuxt-app@4.0.0 <project-name>`
    - `npm init nuxt-app@4.0.0 <project-name>`

# 背景
- 実行したコマンドは以下モジュールの最新バージョンが使われる
    - https://www.npmjs.com/package/create-nuxt-app
- バージョンを指定することで、今後も特定のバージョンを使用できる
    -  https://www.npmjs.com/package/create-nuxt-app?activeTab=versions
    -  今日時点の最新は `5.0.0` で、こちらが使用されると nuxt.js の 3.x になる