OmniAICreator/Qiita-1.07M huggingface dataset:
【Terraform】null_resourceを使ってコードを用意せずにLambda実行環境を作成する

## 背景
TerraformでLambda実行環境を作成しようと試みたものの、エラーが発生

```
Error: filename, s3_* or image_uri attributes must be set
```

TerraformでLambda関数を作成するときは、関数ファイルを用意しなければならない。
しかし、とりあえずLambdaの実行環境だけ作成して、関数は後で用意したいパターンもある。
そういうときはどうすればいいのか・・？


## 解決策

**null_resource**を使って`terraform apply`時に空のzipファイルを生成し、それを


### コード
```main.tf
# 関数作成
resource "aws_lambda_function" "lambda" {
    filename = data.archive_file.null.output_path
    function_name = "hoge_function"
    handler = "hoge_function"
    runtime = "go1.x"
    role  = data.aws_iam_role.role.arn
}

# ダミーの関数ファイルを作成する
data "archive_file" "null" {
    type        = "zip"
    output_path = "${path.module}/null.zip"
    source {
        content  = "null"
        filename = "bootstrap"
    }

    depends_on = [
        null_resource.this
    ]
}

resource "null_resource" "this" {}

# 適当なロール(for Lambda)を用意しておく
data "aws_iam_role" "role" {
    name = "hoge-role"
}

```


```tf
depends_on = [
    null_resource.this
]
```

archive_fileとnull_resourceの間で依存関係を設定しており、
`terraform apply`を実行すると、null_resourceの生成をトリガーに、**ダミーファイル(null.zip)** が生成される


![スクリーンショット 2022-12-22 16.25.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/019c048e-602b-e00e-7d1a-ea58ee9f3b4b.png)

`terraform apply`時にローカルにダミーファイルが作成される。



### コンソールで作成したLambda関数を確認
ダミーファイルがコードソースとして登録されている。
![スクリーンショット 2022-12-22 18.03.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/34a8be94-81e2-9d00-0fad-78117e025e74.png)

実行環境が作成できているのを確認したら、別途でソースコードをアップロードすればOK

## 参考記事

https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource

https://febc-yamamoto.hatenablog.jp/entry/2018/02/04/180655
Ruby moduleの特異メソッドとして取り込む

# moduleとは
クラスによく似た機能であり、`任意の式`や`メソッドを定義`できます。
クラスとの大きな違いは
- インスタンスを生成できない
- 継承できない

また、用途はいくつかありますが、特異メソッドの取り込み方についてまとめていきます。

# moduleに特異メソッドを定義

モジュールには特異メソッドを直接定義することができます。`self`をメソッド名の前につけて定義します

```ruby
module A
  def self.foo
    puts "hello"  
  end
end

A.foo # => hello
```
このように、moduleで定義したものは特異メソッドとなります。
# classへ特異メソッドを追加する
特定のclassへmoduleから特異クラスを追加する場合、`class拡張する（classのスコープに入る）`必要があります。

- 特異メソッドは特異クラスへ定義する必要がある
- 特異クラスはクラスの裏に隠れている

2つめは抽象的な表現ですが、クラスには特異クラスがセットで存在して、特異メソッドを定義するには`class << self`という構文が必要だと大まかに理解しておきます。

```ruby
module Bar
    def bar
      puts "hello"
    end
end

class Baz
    class << self
      include Bar
    end
end


p Baz.singleton_methods # => [:bar]
```
`singleton_method`は特異メソッドを定義したものを調べることができます。
moduleを使用し、`class << self`することで特異メソッドが定義されていることがわかります。

ちなみにこれは、インスタンスオブジェクトにも使用可能です。

```ruby
module MyModule
    def my_method
       puts "hello"
    end
end

obj = Object.new

class << obj
    include MyModule
end

obj.my_method         # => "hello"
obj.singleton_methods # =>[:my_method]
```

# extendを使う
`class << self`構文は、`extend`を使用することで同様に書き換えることもできます。


```ruby
module Bar
    def bar
      puts "hello"
    end
end

class Baz
    extend Bar
end


p Baz.singleton_methods # => [:bar]
```

extendを使用した時の方がコードが短くなる分描きやすそうですね！
COBOLをElixirにトランスパイルしたらどうだろう？というアイデア記事に関するコラム

この記事は「Elixir Advent Calendar 2022 カレンダー14」23日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

今回はコラムネタです。

本日、DX推進を進める担当の方とのMTGで最後少しだけ雑談ベースで話すことができた際についついElixirの良さを語ってしまったのですが、その際に自社のシステム基盤はまだCOBOLだという話しを聞き、そういえば僕自身もITの仕事をするきっかけとなった最初の言語はCOBOLだったので、COBOLをElixirにトランスパイルしたらどうだろう？という漠然としたアイデア？のような事を考えていた事もあったのですが、ここでまた考えるきっかけができたので調べてみる事に。

早速調べてみるとDockYardの記事で[What If...CobolToElixir](https://dockyard.com/blog/2021/08/10/what-if-coboltoelixir) という記事を見つけました。

一部、翻訳してこちらで紹介すると以下のような内容が書かれている記事です。

> ロイター通信によると
銀行システムの43％がCOBOLで構築されている。
対面取引の80％がCOBOLを使用している。
ATMのスワイプの95%はCOBOLのコードに依存している。
今日、2200億行のCOBOLが使用されている。
同記事にはこうある。

>COBOLと呼ばれる古いプログラミング言語が、米国の金融業界の多くを支えているが、コーダーの間では人気がなくなってきている。このため、システムの不具合や更新が必要なときに、COBOLの専門家がいないことが問題になる。

>最近の政治情勢で「インフラ」に再び注目が集まり、これらのCOBOLシステムが見直される可能性が非常に高くなったため、DockYardのディスカッションでこのような質問が出されました。"COBOLをElixirにトランスパイルしたらどうだろう？"

これを見るに、COBOLのエンジニア不足と社会インフラを担うシステムがCOBOLで動いている事は何も日本だけの問題ではない事がわかります。

という事で、まだ開発途中ではあるものの、夢のあるチャレンジの内容ですね。
現在開発中のロードマップや、ソースコードはこちらで見れます。

https://github.com/TheFirstAvenger/cobol_to_elixir

この記事を読むに、 cobol_to_elixir は、ボタン一つでCOBOLで書かれたプログラムをElixirにトランスパイルする世界を夢見てるのではなく、部分的に何度もCOBOLとElixirを行ったり来たりしながらよりElixirらしいコードへリファクタリングすると同時に、出力結果が同じである事を保証していくようなイメージなのかな？と解釈しました。（英語得意な方、違ってたら教えてください）

ただ、日本でもCOBOLのメンテナンスの難しさには、COBOLのソースコードが汚いままに、放置されてしまい、どうしてそのようなコードになったのかの経緯を知る人がいなくなり勘所が失われてブラックボックス化してしまっている事に課題があるのでは？

という話しを聞いた事があるので、このアプローチはあっているような気がします。

また、@zacky1972先生が書かれた、以下の記事でも紹介されているようにElixirは「データ変換パラダイム」という次のパラダイムシフトについて触れられているのですが、

https://qiita.com/zacky1972/items/0c2869f9f39f7bb917a5

このパラダイムは、技術者が少なくなり保守が難しくなってきた言語で書かれた古いシステムも、最終的には予定された入力に期待された出力を返す事にだけ着目してレガシーなシステムを作り替えれば良いだけという「楽観的」な希望が持てる事も一つ、重い腰を上げるに充分な動機付けをしてくれるように考えますw
Visual StudioをVS Codeにする（ニワトリ🐔と卵🥚）

# 🫣TL;DR
.NET系の開発をしているときにVS CodeでコーディングをしてVisual Studioでデバッグみたいなことをしてしまっていて、ある日「えっ、何でこんな面倒くさいことしてるんや。。。」と我に返った。

やろうと思えばどちらもコーディング、デバッグ環境の構築はできると思うが、最近はVisual Studioの方がデバッグ環境が整っているというような話も聞いた。

そこでVisual Studioに統一したいと思いつつ、よく見ると細かいところが違うなぁと気になったので見た目を寄せていく。

# Visual StudioをVS Codeライクにする
とりあえず完成形がこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252806/649301e6-0f8d-65f5-118a-22f9631e3fe3.png)

## テーマを変更する
なんといってもまずはテーマを変えましょう。
Visual Studio Marketplaceにテーマパックがあったり、単体のテーマもたくさんあります。
気に入ったものがあればインストールし、[ツール] > [テーマ(T)] から選択します。

https://marketplace.visualstudio.com/items?itemName=idex.vsthemepack

https://marketplace.visualstudio.com/search?term=theme&target=VS&category=All%20categories&vsVersion=vs2022&sortBy=Relevance

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252806/ddee5e27-0324-0e64-6c4a-39d5abcddf20.png)

## レイアウトを変更する
デフォルトではソリューションエクスプローラー（ファイル一覧）が右側にあったりターミナルが表示されていなかったりします。
ソリューションエクスプローラーをドラッグで移動させたり、あまり使わないと思うものは非表示にします。

## フォント
とりあえずメイリオにしておけと誰かが書いていました。


## ターミナル
ターミナルを下側の出力やエラー一覧と同じゾーンにおいてあげましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252806/24731946-aec8-dbdf-4b39-8bea5ea919db.png)

「自動的に隠す」を有効にして、ショートカットで`Ctrl + {バッククウォート}`で表示、`Shift + Esc` で非表示を切り替えるとさらに快適になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252806/a95829b2-ddc6-263a-2a73-9e2e709daa8c.png)

Powershell 7の設定などはWindows Terminalなど別記事を参考にしてください。

https://qiita.com/pitao/items/75995665294715f00847

## ミニマップの表示
あるとやっぱりいいよね。

https://www.curict.com/item/46/4659a84.html

## 背景透過

できなさそう？

# その他拡張機能
ちょっと調べてみた中で確実にあった方がよさそうなものを３つ紹介。

- インデントや括弧の色付け

https://marketplace.visualstudio.com/items?itemName=chingucoding.IndentRainbow

https://marketplace.visualstudio.com/items?itemName=TomasRestrepo.Viasfora

- `Ctrl + /`で選択範囲をコメントアウト

https://marketplace.visualstudio.com/items?itemName=TechHypno.ToggleComment

# まとめ
ひと手間加えてVisual Studioライフをさらに快適に。

# 参考
- https://qiita.com/HnniTns/items/5da671d6a9cb002eb25d
イーサリアム 2.0：LMD-GHOST について

イーサリアム 2.0 のコンセンサス処理の中、エポック単位の分岐がある場合は、Casper FFG のルールで決められています。エポック内の分岐については、LMD-GHOST を使って対応してます。

## LMD-GHOST とは
LMD-GHOST(latest message driven GHOST) とは、GHOST の変更版であり、ブロックチェーンの分岐がある場合の選択ルールです。ブロックチェーンの分岐は、ネットワークの遅延や悪意の行為などによるものであり、よく起きることです。

- PoW の場合は、GHOST(Greedy Heaviest Observed Subtree) というアプローチを使って、ブロックの数を合計し各分岐チェーンの重みとして、一番重いチェーンを正しいとみなすようになっています
- LMD-GHOSTは、分岐チェーンの重みを計算する際は、サブツリーを含めて、そのチェーンにあるバリデーターの数を合計して重みとしています

LMD-GHOST が、GHOST と異なるのは下記２箇所になります
- １個前の「正当化」のブロック以降の投票、つまり、バリデーターごとの最新の投票のみ合計するところ
- ブロック数ではなく、ブロックに投票するバリデーターの数を合計するところ

## 詳細流れ
チェーンの分岐がある場合、バリデーターは、

1. 最新の正当化のブロックから計算をスタートする
2. 各分岐チェーンに対して
    2.1. ブロック毎にそのブロックに投票したバリデーターの数を合計する
    2.2 そのブロックの子ブロックがある場合、子ブロックのバリデーター数も合計する
    2.3 子ブロックがなくなるまで繰り返す
    2.4 バリデーターの合計値が一番多いチェーンを選択する

## 投票データ
投票データは LMD-GHOST が使うのは、下記の `beacon_block_root` になります。
これはバリデーターが、正しいと思っているチェーンの先頭におくべきブロックのハッシュ値になります。

```python
class AttestationData(Container):
    slot: Slot
    index: CommitteeIndex
    # LMD GHOST vote
    beacon_block_root: Root
    # FFG vote
    source: Checkpoint
    target: Checkpoint
```

## まとめ
エポック内でチェーンの分岐が起きる場合の選択ルールは、LMD-GHOST でした。
初めまして、Vue.js

こんにちは！
最近、Vue.jsに入門したので、その内容について書いていきたいと思います。
# そもそもなぜ学ぶのか？
### 社内の取り組みで必要だから
1つ目の理由が社内の取り組みで必要だからです。
JSフレームワークを仕事で使う機会は今のところ多くはないのですが、時代の流れとともに必要になる時が必ずきます。
その時に備えて、Webアプリ制作の知見を貯めておく取り組みを社内で行なう予定です。
この取り組みでVue.jsを使用するので、最低限の知識をインプットしておく必要があります。

### 理由もなく使ってこなかったから
2つ目の理由が、特にこれといった理由もなくVue.jsに触れてこなかったからです。
Vue.jsよりもReactが人気なイメージがあるからReactの勉強だけをすれば良いかー、といった感じで今まではReactのみを勉強していました。
ただ、それぞれに良いところ悪いところがあるはずなので、今回の勉強を通してその辺りを明確にしていければと思っています。
ということで、さっそく内容に入ります。

# Vue.jsの特徴
### ディレクティブ
Vue.jsには**ディレクティブ**という機能があります。
ディレクティブは接頭辞に`v-`がついたVue.jsの特別な属性のことです。
Vue.jsでは、このディレクティブが便利な機能を提供してくれます。
今回は3つほど紹介したいと思います。

#### v-if
まず、`v-if`です。
`v-if`を使うと条件分岐によって要素の有無の切り替えを簡単に行えます。
ディレクティブの式がtrueを返す場合に描画がされます。
ReactではJavaScriptのif文を使うのでReactを勉強してきた自分にとっては、すごく新鮮でした。
```vuejs
<h1 v-if="awesome">Vue is awesome!</h1>
```
下記のようにv-else、v-else-ifもあります。
```vuejs
<div v-if="type === 'A'">
  A
</div>
<div v-else-if="type === 'B'">
  B
</div>
<div v-else-if="type === 'C'">
  C
</div>
<div v-else>
  Not A/B/C
</div>
```
#### v-bind
次に`v-bind`です。
`v-bind`を用いると、要素の属性を束縛することができます。
```vuejs
<a v-bind:href="url">リンク</a>
```
下記のような省略記法もあります。
```vuejs
<img :src="imageSrc">
```
#### v-show
最後に、`v-show`です。
`v-show`は真偽値によって、要素の表示・非表示を切り替えることができる、ディレクティブです。
これだけ聞くとv-ifと何が違うの？という感じですよね。
`v-show`と`v-if`では非表示の時の挙動に違いがあります。
`v-if`の場合、非表示の時には**DOMごと削除されます**
しかし、`v-show`の場合、非表示の時には`display:none;`で非表示になるため、DOM上には常に存在しています。
```vuejs
<h1 v-show="ok">Hello!</h1>
```

### コンポーネントシステム
コンポーネントはVue.jsに用意されている、機能の1つです。
Vue.jsは便利ですが、Vue.jsで値を操作して表示を行う時に毎回インスタンスを作成するのは面倒くさいですよね？
そんな時に利用するのがコンポーネントです。
コンポーネントでは**Vueのインスタンスを作成して、特定のタグにレンダリングを適用する**という操作が可能になります。
下記のドキュメントから引っ張ってきた例では、`button-counter`というコンポーネントを定義しています。
```js
// Vue アプリケーションを作成します
const app = Vue.createApp({})

// グローバルな button-counter というコンポーネントを定義します
app.component('button-counter', {
  data() {
    return {
      count: 0
    }
  },
  template: `
    <button @click="count++">
      You clicked me {{ count }} times.
    </button>`
})
```
しかし、大概のVueプロジェクトでは文字列のテンプレートではなく、vueファイルを作成して、その中にロジックやスタイルを全部書いていくようです。
詳しくは[こちら](https://v3.ja.vuejs.org/guide/single-file-component.html#%E5%89%8D%E6%9B%B8%E3%81%8D)をご覧ください。
# Vue3で何が変わったの？
Vue.jsについて全く知らない僕ですが、Vue3で大きな変化があったことは知っています。
では、どういったところがVue2から変わったのでしょうか。

### コードがシンプルに書けるようになった
**Vue3からは`<script setup>`という記法を使うことでコードがより簡単に書ける**ようになリました。
`<script setup>`で以前までの形式的な記述を削減でき、コード量やネストを減らすことができます。
詳しくは[こちら](https://zenn.dev/azukiazusa/articles/676d88675e4e74)の記事が分かりやすかったので、よければみてください。

### TypeScript全面サポート 
また、**Vue3からTypeScriptの本格的なサポート**が始まりました。
Vue2でも使えないことはないみたいですが、サポートは限定的だったようです。
最近、TypeScriptの勉強も進めているので、ガンガンTypeScriptで書いていきたいと思います。

### パフォーマンスの向上
そして、Vue2と比べるとパフォーマンスも向上しました。
**高速のノーバンドルツールの[Vite](https://ja.vitejs.dev/)を使用して、簡単にプロジェクトを開始できるようになった**ようです。
自分も最近の開発環境はViteで作ることが多いので、こちらもガンガン使っていきたいと思います。


# Vue.jsを触ってみた感想
軽く触った感想としては、独自の書き方が多く、覚えるの大変そう！という感じです。
特にディレクティブは使い方や書き方を覚える必要があり、なんじゃこれっと現在進行形でなっています。
ただ、使いこなせると強力な武器になる（？）と思ってしっかりこの辺りも勉強を進めていきたいと思います。



# まとめ
Reactしか触ったことのない自分にとっては、Vue.jsは少しクセがあるように感じました。
Reactと同じ感じでしょ？と思っていたので、全然違って驚きました。
個人的にディレクティブという機能に興味を持ったので、もっと深掘りしてみたいと思います。
最後まで読んでいただきありがとうございました！
paizaラーニング「辞書順に出力 2 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__string_dictionary_step2
#### 私の解答
```Python3
li =  (input().split())
sorted_li = sorted(li)

for ele in sorted_li:
    print(ele)
```
#### 解答例1
```Python3
S = [0] * 5
values = input().split()
for i in range(5):
    S[i] = values[i]

sorted_S = sorted(S)

for s in sorted_S:
    print(s)
```
#### 解答例2
```Python3
S = [0] * 5
values = input().split()
for i in range(5):
    S[i] = values[i]

S.sort()

for s in S:
    print(s)
```
paizaラーニング「辞書順に出力 1 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__string_dictionary_step1
#### 私の解答
```Python3
A = ["zaipa",  "izapa",  "paiza"]

for a in sorted(A):
    print(a)
```
#### 解答例
```Python3
li = ["zaipa", "izapa", "paiza"]
sorted_li = sorted(li)

for ele in sorted_li:
    print(ele)
```
paizaラーニング「i 番目の出力 4 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__string_i-thinput_step4
#### 私の解答
```Python3
n, m, l = map(int,input().split())
values = input().split()
print(values[n-1][l-1])
```
WolfMoon先生の解答例を参考にさせていただきました。
#### 解答例
```Python3
values = input().split()
N = int(values[0])
M = int(values[1])
L = int(values[2])

S = [0] * M
values = input().split()
for i in range(M):
    S[i] = values[i]

print(S[N - 1][L - 1])
```
誰でもすぐに使えるAIサービスまとめ【随時更新】

# 🫣TL;DR
昨今AIが騒がれて久しいですが、今年は特にそのAIがエンジニアや特殊な職業に従事する人に限らず多くの人が身近な形で提供され始めました。
特に個人的にはテキストから画像を自動生成する「Midjourney」が秋ごろに一般公開され、関連するサービス開発辺りから急速に広がった印象があります。

この記事ではそういったサービスをまとめます。（随時更新予定）

# 🧠AIサービス一覧
## お絵描き

https://www.midjourney.com/home/?callbackUrl=%2Fapp%2F

https://stablediffusionweb.com/

https://aipicasso.studio.site/

AIピカソはAIいらすとやというサービスも公開

https://aisozai.com/

## プログラミング

https://aiprogrammer.hashlab.jp/

https://github.com/features/copilot

## 会話、文章生成

https://chat.openai.com/

https://www.notion.so/product/ai

## 文章要約

https://www.digest.elyza.ai/

## 議事録

https://gijirokukun.com/

## 俳句

https://aihaiku.org/

## 作曲

https://creevo-music.com/

## ネタ
NAGI

https://huggingface.co/spaces/gojiteji/NAGISystem

## AI構築プラットフォーム

https://openai.com/api/

https://huggingface.co/


# まとめ
これからはAIの使い方をどんどん人が学習していかないといけないですね。
そのためにもAIを触らないと...
JavaScript クラスとインスタンス

# クラスを使う背景
このように同じ情報を持った複数のオブジェクトがあると書きづらくごちゃごちゃする。

```javascript
const tanaka = {
    lastName: 'tanaka',
    firstName: 'taro'
}

const suzuki = {
    lastName: 'suzuki',
    firstName: 'jiro'
}

const sato = {
    lastName: 'sato',
    firstName: 'saburo'
}
```
# クラスとは何か

だから使いまわせる情報を持った型のようなものを持っておく。
これがクラス。
```javascript
class Profile{
    constructor(lastName, firstName){
        this.lastName = lastName;
        this.firstName = firstName;
    }
}
```
# インスタンスとは何か

雛形となるクラスを用いて新しく(new)作った情報がインスタンス。

```javascript
class Profile{
    constructor(lastName, firstName){
        this.lastName = lastName;
        this.firstName = firstName;
    }
}

//インスタンスの生成
const tanaka = new Profile('tanaka', 'taro');
console.log(tanaka.lastName)
//tanaka
console.log(tanaka.firstName)
//taro
```

Dataの時もDateというクラスを元にインスタンスを作っていく。
Dataオブジェクトと言いながら実はクラス。
```javascript
const noe = new Date()
```

# クラスの継承
lastNameとfirstNameの情報を持つProfileクラス。
この二つの情報に年齢と出身地の情報を加え、自己紹介できるようにしたいとする。
その場合はProfileクラスを拡張して新しいクラス'myProfile'を作る。
これがクラスの継承である。
```javascript
//クラスの生成
class Profile{
    constructor(lastName, firstName){
        this.lastName = lastName;
        this.firstName = firstName;
    }
}

//クラスの継承
class myProfile extends Profile {
    constructor(lastName, firstName, age, placeOfBirth){
        super(lastName, firstName);
        this.age = age;
        this.placeOfBirth = placeOfBirth;
    }
    introduce() {
        console.log(`私の名前は${this.lastName}です。年齢は${this.age}歳で${this.placeOfBirth}出身です。`);
    }
}

const takashi = new myProfile('田中','たけし',100, '東京');
takashi.introduce();
//私の名前は田中です。年齢は100で東京出身です。
```

メモ:
スーパークラスは元々のクラスのメソッドも利用できる

# ES5以前のクラス
誰でも簡単に使えるAIの紹介

# はじめに
今回はBit192 Labsが手掛ける「[AIのべりすと](https://ai-novel.com/index.php)」というサイトでAIを使った小説作成をやってみました。
# 実演
AIのべりすとの使い方は至って簡単で、自分でストーリーの出だしを書くだけです。![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982415/84495f27-280d-7455-b4a8-b1fa6bb37a82.png)
試しにこの出だしで続きの文を書いてもらいます。

3回ほど続きの文を書いてもらったものがこちらです。
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982415/0427e564-d7f7-d688-4892-0fc97fec076e.png)
__おや・・・・・__

一人称を「私」にしたせいで、主人公の性別が女になってしまいました。だいぶ私は煙たがられていますね。後半のほうは展開がわからなくなってきました。
　今度は一人称を「僕」に変更して少し情報を足してみましょう。
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982415/63e8886e-6a7a-7b10-912d-3b3c011f2f49.png)
　タイトルと詳細なプロフィールを追加しました。これでどうなるでしょう。
![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982415/ce918830-ecc0-ef32-01bd-0fb2dc2f4b03.png)
うまくいきましたね。
具体的な内容を詰めることでAIが情景や人物像を理解してくれたようです。
# 感想
実際に使ってみて自分で学習をさせていないAIを思い通りに動かすのはとても難しかったです。AIのべりすとのページではMODを追加したりお絵かきをしてもらうこともできます。プレミアム会員になることでAIに自分でさまざまな機能を追加できるようなので気になる人は試してみてください。
WindowsイベントからPCのON/OFF情報を取得したい

# WindowsイベントからPCのON/OFF情報を取得したい
## 結論
```cmd
;; 起動時刻
wevtutil qe System /f:Text /rd:true /c:1 "/q:*[System[(EventID=7001 or EventID=6005)]]"

;; 停止時刻
wevtutil qe System /f:Text /rd:true /c:1 "/q:*[System[(EventID=7002 or EventID=6006)]]"
```
## Windowsイベントについて
PCのOnOffに関するWindowsイベントは主に四種類あります。
|ID|イベント|
|---|---|
|6005|PC起動（完全シャットダウンからの復帰）|
|7001|PC起動|
|6006|完全シャットダウン|
|7002|シャットダウン|

Windows10からは起動を早くするため、(意図的な操作をしない限り)完全シャットダウンをしません。そのため、Windows10以降でPCの起動/停止のログを取るためにはイベントID[7001][7002]を指定する必要があります。

## イベントを取得するためのコマンド
Windowsイベントを取得するため、wevtutilコマンドを利用します。
取得するデータは「最新のPC起動時刻」と「最新のPC停止時刻」です。上記で説明したイベントIDを全て取得した上で、現在時刻から近いものを一件取得することとします。
```:PC起動時刻
wevtutil qe System /f:Text /rd:true /c:1 "/q:*[System[(EventID=7001 or EventID=6005)]]"
```
```:PC停止時刻
wevtutil qe System /f:Text /rd:true /c:1 "/q:*[System[(EventID=7002 or EventID=6006)]]"
```
|オプション|概要|
|---|---|
|/f|出力形式をテキストに変更。XML形式も指定できる。|
|/rd|データの読み込み方向を指定。「true」で新しい順に取得できる。|
|/c|取得する件数を指定。今回は一件だけ読めればよいので、「1」を指定。|
|/q|取得するデータのクエリを指定。今回はイベントIDを指定。|

## おわりに
オプションの「/q」がどうにも腑に落ちなかったので調べてみたら、Xpathクエリと呼ばれる書き方のようです。データの検索にSQLしか使ってこなかった私は、名前すら聞いたことなかったです。まだまだ学習しないといけない事は沢山ありそうですね。
JavaScriptのビルトインオブジェクト

JavaScriptではたくさんのオブジェクトが元から用意されている。
ほぼ全ての値はこれを利用して作られたもの。

例えば、
```javascript
console.log()
```
は分解すると
consoleオブジェクトのlogメソッド。
consoleに紐づく様々なメソッドが用意されており、それを使っている。

```javascript
const str = 'hello';

console.log(str.length);
console.log(str.toUpperCase());

//5
//HELLO
```

## Mathオブジェクト

ex) Mathオブジェクトのroundメソッドを利用して50~100までのランダムな値を取得する
```javascript
const generateRoundNum = (start, end) =>  Math.round(start + Math.random() * (end - start));
console.log(generateRoundNum(50, 100));
```

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math

## Dateオブジェクト

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

※Dateオブジェクトを使うときはnewを使う
【ROS2】Gazeboで動的環境のシミュレーション

# はじめに
本記事はROS2アドベントカレンダーの17日目の記事です。

https://qiita.com/advent-calendar/2022/ros2

# なにをしたか
以下のような、人が動く環境をGazeboで試してみました。

https://twitter.com/ko1_baseba11/status/1605195176255049728?s=20&t=f7v2lkGX6FghZN1ZiAUPBQ

# 環境
以下の環境で動作しています。

| 項目 | バージョン |
|:--: | :--: |
| Windows | 10 |
| WSL | 2 |
| Ubuntu | 20.04 |
| ROS2 | Foxy |

# 参考リポジトリ
以下がGazebo環境のROSパッケージです。
galactic対応とのことでしたが、foxyでも動作しています。

https://github.com/robotics-upo/gazebo_sfm_plugin

また、人が動くモデル自体は以下のソフトウェアをインストールします。
SFM(Social Force Model)というモデルで人が動いています。

https://github.com/robotics-upo/lightsfm

# インストール
## SFMライブラリのインストール
以下のコマンドを実行します。

```shell
$ git clone https://github.com/robotics-upo/lightsfm.git
$ cd lightsfm
$ make
$ sudo make install
```

## Gazeboプラグインのインストール

```shell
$ cd {your_ros2_ws}/src
$ git clone -b galactic https://github.com/robotics-upo/gazebo_sfm_plugin.git
$ cd {your_ros2_ws}
$ colcon build --packages-select gazebo_sfm_plugin
```

# 実行
以下で実行します。
※同じターミナルで続けて作業する場合は実行前に`install/setup.bash`を実行する必要があります。

```shell
# 環境変数の読み込み
$ source /usr/share/gazebo/setup.bash
# 起動
$ ros2 launch gazebo_sfm_plugin cafe_ros2.launch.py
```

Gazeboの画面が立ち上がれば成功です！

# おわりに
実は以下のツイートとROBOTIS JapanのGitHubリポジトリにインスピレーションを得て試してみました。
ROS2でもSFM自体は動いたのでTurtlebot3も召喚することができたらなーと目論んでいます。

https://twitter.com/Toukairinn_FUZZ/status/1595392932391288832?s=20&t=f7v2lkGX6FghZN1ZiAUPBQ


https://github.com/ROBOTIS-JAPAN-GIT/turtlebot3_jp_custom/tree/master

# 参考
せっかくなので、Social Force Modelについての参考文献(サイト)を載せておきます。

- 論文
    - https://arxiv.org/abs/cond-mat/9805244
- Pythonでの実装例
    - https://qiita.com/ReoNagai/items/5f94aecec4c3e7fa9135
    - https://qiita.com/KMASAHIRO/items/882c79dfbfc4949087e2
デジタル地図データベースHEREを動かしてみたいけどjsが書けないpythonユーザーのための記事

[here](https://www.here.com/)の地図をpythonで出そうとしたのになかなか出なかったので、try & errorしたことをまとめておきます。

- Problem 1
 [Python Package Index](https://pypi.org/search/?q=here)でhereと検索してもどれをinstallして良いかわからない、もっとunique nameにしてよ！
![スクリーンショット 2022-12-22 21.46.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60629/b0c09e46-a502-765f-e7bb-d8e483ee1528.png)

- Solution1
[here-map-widget-for-jupyter](https://github.com/heremaps/here-map-widget-for-jupyter)だけ入れたらとりあえずjupyter上で、地図が出ます。

---
- Problem 2
[HERE 無料アカウント](https://qiita.com/kekomat/items/d2e29bac84a27c1ec521)を作ったらいっぱいキーを渡される、俺が欲しい奴だけくれよ！

1. organization ID
1. アプリ ID
1. アクセス キー ID
1. アクセス キー シークレット
1. APIキー

- Solution 2
5のAPIキーだけ使えば、地図が出ます。他は忘れましょう。

---
- Problem 3
地図が出ないときに、APIキーが本当に有効になっているのか不安になる！

- Solution 3

APIキーを[テストできる（for ver2）のURL](https://1.base.maps.ls.hereapi.com/maptile/2.1/maptile/newest/normal.day/13/4400/2686/256/png8?apiKey={YOUR_API_KEY})で {YOUR_API_KEY} の部分を、自分のAPIキーに置き換えて、ブラウザのurlとして貼ってloadしてください。APIキーが有効になっていたら、地図が出ます。
![png8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60629/d5135502-77df-4e71-0c1f-297ca620f4bc.png)

今後[こちらのテストできるURL（for ver3）](https://maps.hereapi.com/v3/base/mc/11/1819/806/png8?apiKey={YOUR_API_KEY})に置き換わっていくようです

[参考記事1](https://developer.here.com/documentation/map-tile/dev_guide/topics/quick-start-map-tile.html
)
[参考記事2](https://developer.here.com/documentation/map-tile/dev_guide/topics/guide.html
)

---
- Problem 4
[here-map-widget-for-jupyter](https://github.com/heremaps/here-map-widget-for-jupyter)をDLして、Desktop/here-map-widget-for-jupyter/examplesの下にあるサンプルコードをrunしても、

```
ModuleNotFoundError: No module named 'here_map_widget'
```
って言われる！

- Solution 4
Desktop/here-map-widget-for-jupyter/examplesの下にあるサンプルコードを、Desktop/here-map-widget-for-jupyter/の下にコピーしてrunしてください。pathが通って、地図が出ます。

---
- Problem 5
jupyter上でサンプルコードがエラーを一つも吐かずに全てrunできたのに、地図が出ない。どこの環境設定が悪いか分からない！

- Solution 5
[google colab](https://www.python.jp/train/experience/colab.html)を使えば、地図が出ます。
![スクリーンショット 2022-12-22 23.16.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60629/37db6b17-abf3-c455-6101-1ff3984bdb89.png)
実務未経験から受託開発の会社に入社して半年経った

こんにちは、リッキーです。

久しぶりに記事を書きたいと思います。IT業界に転職してから、半年が経ちましたが、今の自分の状況や今後の目標などについて、振り返ってみようと思います。

# 簡単な自己紹介
理系の大学院を卒業し、化学メーカーに入社しますが、自分のイメージしていた働き方ではなかったため、入社後すぐに転職を決意する。働きながら毎日2,3時間ほど独学で勉強する毎日を送り、2年目の春に受託系のIT企業に転職して、現在に至ります。

# 現在の自分の状況
私は実務未経験で入社したのですが、社内制度としてあったプログラミング研修（３ヶ月）を受けるだろうと予想していたのですが、面接の時に見せたポートフォリオの出来などから、研修不要と判断されました。
自分と同時期に入社した実務未経験の方は、研修を受けていました。
入社してから現在までずっと、自社で運営しているサービスのお金周りを扱うWebアプリを開発しています。入社前までは、受託開発の印象が強かったのですが、いざ入社してみると、いきなり自社サービスの新規開発に携わることができました。同期などは、先輩エンジニアの方のサポートを受けて一人前を目指しているみたいです。ただ、作業の様子を見ていると、エクセルでスクショを貼ったり、テスト仕様書を作っているのをみると、いきなり開発に携わることができたのは、幸運だったと思います。実務未経験の人が、同じ会社に入社するにしても、やはり初期ステータス（自己学習の積み重ね）によって、与えられるタスクは変わるなと実感しました。

# 実際の業務について
社内で使うアプリを内製しています。今年の６月に入社してすぐ取り組み、来年の夏頃に完成する予定です。自社以外の会社からデータをもらってきて、それを加工して複数のサービスを提供します。私はその中の一つのサービスを運用するためのアプリを開発しています。システムの設計書を先輩エンジニアの方にいただき、それをもとに製造とテストをおこなっています。使用言語はPHPで、フレームワークはLaravelです。入社前からPHPをメインに勉強していたので、コーディングはそれほど難しくありませんでした。

次に具体的な仕事内容については、満足な点・不満な点を整理します。
## 満足な点
１.いきなりコーディングをさせてもらえていること
ネットで「エンジニア　未経験　転職」などで調べると、最初はテスターとして業務をスタートする所もあると聞きました。またそうでなくても、保守運用をするのが多いそうです。私の会社には、他にも同じ時期に入社された方（業界未経験）がいますが、先輩エンジニアについて、保守対応をしています。自分の開発するアプリは、会社の主力サービスに関わるものなので、周りの状況を見ても、ガッツリコーディングをさせてもらえるのは、ありがたいと思います。

２.前職と比べて働き方が改善した
転職は化学メーカーの工場で働いていました。工場は薬品の匂いがきつく、また、怪我をしやすい場所です。現場でオペレーター業務を担当していたので、夜勤もあり、またシフト制で休日が少なかったです。
今は日勤でオフィス勤務なので、快適な環境で働かせてもらっています。

## 不満な点
1.コードレビューの機会がない
自分が担当するアプリの機能がある程度完成すると、その度に先輩エンジニアにレビューを受けていますが、それは機能（要件）を満たしているかのチェックで、コード自体のレビューはしてもらえていないことが少し不満です。

2.お客さんとのやりとりがない
受託開発の案件を担当しているエンジニアの方を見ると、結構お客さんと打ち合わせをしたり、電話で話していることが多いようです。たまに先輩と一緒に社外との会議に参加させてもらいますが、私は聞いているだけです。その時、質疑応答や交渉・折衝している先輩の姿を見ると、自分もできるようになりたいという気持ちになります。

# 今後の方針
今の会社にすごく不満があるわけではありませんが、あと1年ほど働いたら、次の会社を見つけるために転職活動をしてもいいかなと考えています。不満な点で書いたことはありますが、環境のせいにするのではなく、自分で改善できるところは改善していこうと思います。

スキル面に関しては、上流工程に携われるようになるのが当面の目標です。。DBの設計についてやAWSについて、書籍で勉強しています。
また、自分一人でプログラミングの勉強するだけでなく、社外の勉強会に参加してみたいです。
DataFrameでgroupbyしてmode(最頻値)を出す

# 発端：平均はパッと出せる
pandasのDataFrameって本当に便利．項目ごとの平均値も簡単に出せる．
```python:sample
df = pd.DataFrame({
    'color': ['red', 'red', 'blue', 'blue', 'blue', 'blue'],
    'type': ['A', 'B', 'B', 'C', 'C', 'C'],
    'quantity': [10, 15, 12, 10, 10, 20]
})
```
|    | color   | type   |   quantity |
|---:|:--------|:-------|-----------:|
|  0 | red     | A      |         10 |
|  1 | red     | B      |         15 |
|  2 | blue    | B      |         12 |
|  3 | blue    | C      |         10 |
|  4 | blue    | C      |         10 |
|  5 | blue    | C      |         20 |

簡単だ〜．
```python:mean
df.groupby('color').mean()
```
| color   |   quantity |
|:--------|-----------:|
| blue    |       13   |
| red     |       12.5 |

# meanみたくやってみる
最頻値もパッと出したい．
pandasのissue ([Groupby.mode() - feature request](https://github.com/pandas-dev/pandas/issues/19254))で`value_counts()`でやれって言われてる．でも最頻値だけパッとほしい時もあるじゃん．
最頻値はこう？
```python:mode
df.groupby('color').mode()
```
`AttributeError`出た．
こうか？
```python:mode
df.groupby('color').agg('mode')
```
`AttributeError`...

# 結論
`lambda`使わないとできない．でも，同じ出現数の値がある場合ちゃんとどちらも出してくれる．
```python:mode
df.groupby('color').quantity.apply(lambda x: x.mode())
```
|             |   quantity |
|:------------|-----------:|
| ('blue', 0) |         10 |
| ('red', 0)  |         10 |
| ('red', 1)  |         15 |

感覚的にmeanと同じように出力して欲しいけど，出現数が同じ値があるときの処理がうまく決まらないのかな

参考サイト: ['mode' not recognized by df.groupby().agg(), but pd.Series.mode works #11562](https://github.com/pandas-dev/pandas/issues/11562)
【ルール説明・shared】no-handler

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

今回はルール [no-handler](https://ansible-lint.readthedocs.io/rules/no-handler/) について説明します。

### no-handler

[no-handler](https://ansible-lint.readthedocs.io/rules/no-handler/) は [handler](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_handlers.html) が正しく設定されているか検証します。

条件に`when: result.changed`（もしくは`when: 変数.changed`）が付与された場合、Ansibleはその処理を [handler](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_handlers.html) と認識します。しかし [handler](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_handlers.html) には正式な書き方があるためそちらの書式で書く事が推奨されています。

#### 問題のあるコード

```yaml
---
- name: Example of no-handler rule
  hosts: localhost
  tasks:
    - name: Register result of a task
      ansible.builtin.copy:
        dest: "/tmp/placeholder"
        content: "Ansible made this!"
        mode: 0600
      register: is_copied # <- 実行結果を変数へ登録する
    - name: Second command to run
      ansible.builtin.debug:
        msg: The placeholder file was modified!
      when: is_copied.changed # <- handler を実行する
```

#### 修正されたコード１

```yaml
---
# ルール no-handler の検証を無効化する
when: is_copied.changed # noqa: no-handler
```

#### 修正されたコード２

タスクの結果を変数に登録せずに [handler](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_handlers.html) を直接実行します。


```yaml
---
- name: Example of no-handler rule
  hosts: localhost
  tasks:
    - name: Register result of a task
      ansible.builtin.copy:
        dest: "/tmp/placeholder"
        content: "Ansible made this!"
        mode: 0600
      notify:
        - Second command to run # <-- ファイルが変更された場合のみ handler が実行される
  handlers:
    - name: Second command to run
      ansible.builtin.debug:
        msg: The placeholder file was modified!
```

### 参考サイト

* [no-handler — Ansible Lint Documentation](https://ansible-lint.readthedocs.io/rules/no-handler/)
* [Handlers: running operations on change — Ansible Documentation](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_handlers.html)
Notionで転職のタスク管理

## はじめに

初めまして、2021年に転職をして現在某SaaS企業でSEとして働いているmujiと申します。
自分自身コロナ禍に転職をおこなって、大変だったなという点について備忘録な形で記載をしておこうと思います。

## 転職活動はマルチタスクだ

私が転職活動をしていて、一番大変だったのはこの「マルチタスク性」でした。
初めての転職活動でしたので、当時はてんやわんやでした。

情報をうまく整理できずに面接に臨んでしまい、面接官に全然しらない話をされて冷や汗をかいたこともありますし、スケジュールがバッティングしそうになって急いでリスケしたことも…

私はエージェント経由もダイレクトも両方使っていたのですが、複数の転職エージェントを使う場合、それぞれのエージェントとのコミュニケーションが必要だし、ダイレクト応募やwantedly・LinkdInなどを利用する場合は、ここでもコミュニケーションが必要です。

更に面接が始まれば、その面接の進捗を管理しながら、情報収集し準備をしていかなければなりません。
そう、まるで小さなプロジェクトマネジメントだなぁと思いながら転職活動をしていました。

## タスク管理・情報を集約すること

この**タスク管理・情報の集約**というのが転職の肝になると思っています。

私は、IT企業＋コンサル系の企業をいくつか受けていたのですが、上にかいた並行して行われる様々なタスクの管理もそうですし、自分が考えた質問の回答や、面接での振り返りをもととしたTipsをまとめておいて、なるべく少ない時間で効率よく転職活動をすることを、途中から意識するようになりました。

特に仕事をしながら転職活動を考えているIT系の方はこのあたりを意識しないと私と同じでてんやわんや状態になる気がします…（仕事も忙しいと特に）

## 選んだのは、Notionでした

このタスク管理と情報集約で私が選んだのは、**Notion**というサービスです。

Notionとは、メモやタスク管理、ドキュメント管理、データベースなど、仕事で使うさまざまなツールを1つにまとめた「オールインワンワークスペース」と言われるサービスで、最近はかなり人気になってきて、ご存じの方も多いかと思います。

私は転職活動で使い始めてから、英語の勉強や日々のアイデア等々も全部Notionに置くようになりました。とにかく大好きなサービスです。（回し者ではございませんw）

このNotion、どこが転職活動におすすめなのかというのを、いくつかご紹介しようと思います

####  ①- 転職活動用のテンプレートがある

Notionの公式で、転職活動用のテンプレートがあるので、サクッと転職タスク管理用のページが作れてしまいます。

Notionってなんでもできてしまうので、逆に凝ってしまったり、どうしたらいいか悩んでしまうのですが、このテンプレートを使うだけでOKです。ここで迷っている暇は転職活動中にはないと思うので、それ用のテンプレートがあるのはだいぶありがたかったです。

[https://www.notion.so/ja-jp/templates/job-applications](https://www.notion.so/ja-jp/templates/job-applications)

#### ②-応募・面接のステータスを管理できる

「この会社って応募したっけ？」
「この会社って何次面接だっけ？いつやるんだっけ？」

みたいなのもNotionのデータベース機能のステータス管理で管理できます。

■ 実際の自分のJob applicationのページ
![スクリーンショット 2022-12-18 18.13.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176783/b67da0c3-1ec7-ba82-c570-df595493edec.png)

Stageのところで、何次面接を今受けているのかを管理していて、Due Dateのところで日付を置いていました。
志望度とかは自分は言葉で書いていたのですが、★★★などで表現してもよさそう。

#### ③-面接に必要な情報を一つにまとめられる

逆質問や、よく聞かれそうな質問の答えなどもこのページ内にまとめておくことが可能です。

■ 実際のページ
（めちゃくちゃ隠しててすみませんw）
![スクリーンショット 2022-12-18 18.21.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176783/f5961094-4e7d-5141-a125-c87f7da38242.png)

その他各社固有の内容は、データベースのCompany（オレンジの枠線の部分）をクリックして開く個別のページにまとめておけます。

私は面接の感想やカジュアル面談で受けた印象などもここにまとめておいて、後で見返して志望度を変更させたりしていました。

![スクリーンショット 2022-12-18 18.13.24のコピー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176783/310247b3-53af-aad3-4fd7-9b0de409f17f.jpeg)

#### ④-転職が終わった後見返すのにも便利

なんとなくこの記事を書こうと思ったのも、きちんと**当時の情報が残っているから**こそです。私のその当時の葛藤も含めて、Notionに残してあるデータを見ながら、「そういえばこうだったなぁ〜」と転職の振り返りができるのがとてもありがたいです。

次回転職をする際のinputとしても使えそうなので、１回の転職活動だけではなく、長い目でみてもいいなと思っています。

## 転職活動にてんやわんやにならないために…

私自身の経験をベースとして、ほぼNotionの回者みたいな記事が出来上がってしまいました。

とはいえ、転職活動のタスク管理・情報収集は本当に大事だと思っています。これから転職とりあえずやってみよ〜な方は、ぜひNotionはじめ、いろんな効率化できるサービスを使って大変な時期を乗り越えていただければと思います。
curlをupdateする(MAC)

MACでcurlをupdateする際に少し戸惑ったので、メモしておく

公式docsの読み方がわからなかった（勉強不足）のであっているかはわからないが、
以下の方法で実行しました

```
# バージョン確認
$curl -V
⇨curl 7.64.0

# アンインストール 
$brew uninstall curl

# 再度インスール
# 環境の書き換えが必要な場合は処理する
$brew install curl

# バージョン確認
# 変わっていない場合はターミナルを再起動してみてください
$curl -V
⇨curl 7.87.0

```
 
簡単な方法だが、この方法で無事最新版がインストールできた。
もし他のきちんとした方法をご存知できたら、是非教えていただきたいです。
Heroku Roadmap を見てみよう


こちらは [Heroku Advent Calendar 2022](https://qiita.com/advent-calendar/2022/heroku) 23日目、今年もゆかちゃんの誕生日にお祝い申し上げるために Advent Calendarを書き綴って記しております。
ゆかちゃん本当におめでとう。

さて、Heroku。最近、動きがないんじゃないか。SalesforceはHerokuのことをどう思っているんだろうか。そう思われても仕方のないくらい、アップデートがたしかにありません。しかし、みなさまのそういった感情を逆なでするかのように、[Heroku Roadmap](https://github.com/orgs/heroku/projects/130/views/9) が地味に公開されております。

今日は、この[Heroku Roadmap](https://github.com/orgs/heroku/projects/130/views/9)から、気になるポイントを見ていってみましょう。あくまでも、2022年12月23日時点での Forward-Looking Statement ですので、将来的に機能が実装されるかどうかはわたしにはわかりません。あしからず。

---

![Screen Shot 2022-12-22 at 21.50.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37263/4dd54020-80eb-6eeb-a301-7a6ad1ed93de.png)

# Comming soon

## EOL TLS 1.0/1.1 in Private Spaces

https://github.com/heroku/roadmap/issues/35

ごく一部の人は気をつけていただきたいところですが、未だに地味に使えていた TLS1.0/1.1 in Private Spaces 機能が近い将来シャットダウンしそうです。気をつけましょう。

## Additional Availability Zone in Private Spaces

https://github.com/heroku/roadmap/issues/114

Availability Zone 実は 2つしか使われていなくて、2023/1 からは 3つのゾーンを利用されるようになり、さらに可用性が高まるという記載があるんです。そうなんですか、そうだったんですね。ほんまか。

# Working on it

## Heroku platform support for Cloud Native Buildpacks

https://github.com/heroku/roadmap/issues/20

今までは、Heroku独自のbuildpackを使っていたのですが、[CNB](https://buildpacks.io/)も利用可能になるということで、より標準的な仕様に従っていく所存ということですね。ありがたい。

## Credits for Students and Power of Us program for Non-profits

https://github.com/heroku/roadmap/issues/18

Free PlanのなくなったHerokuですが、NPOや学生向けの低コストプランを考えているようです。ありがたい。

## New Regions for Private Spaces

https://github.com/heroku/roadmap/issues/98

新しい Private Space が増えるようです。ありがたい。新たに追加されるのは5つ。ヨーロッパやインド、シンガポールですね。

- singapore
- mumbai
- montreal
- paris
- london

# Researching

こっからは、期待せずですが、来たら嬉しい機能もあります。

## Support HTTP/2

https://github.com/heroku/roadmap/issues/34

ktkr。HTTP/3 も言及してますね。楽しみです。はよしてほしい。

## New Postgres plans with emphasis on disk size flexibility

https://github.com/heroku/roadmap/issues/60

おっとこれは、Heroku PostgresのストレージとCPU/RAMとで影響を受けないプランの匂わせか...?

## Private Space Transit Gateway

https://github.com/heroku/roadmap/issues/65

これは期待。今は[Private Space Peering](https://devcenter.heroku.com/ja/articles/private-space-peering)(いわゆるVPC Peering)しかできず、連携先のVPC数が固定化されていますし、ホップを考慮するとちょっと大変でした。が、Transit Gatewayにつながってくれるようになると、Direct Connectなんかも視野に入ってきたりして、ネットワークの柔軟性が広がります。楽しみです。

## Larger Dyno Sizes (Private XL/Performance XL/GPU)

https://github.com/heroku/roadmap/issues/66

Lサイズより大きなプランと言うか 'GPU' も気になりますねぇ。現行最大RAM14GBですが、超巨大モノリスとかインメモリでの高速化とかを考えるとちょっと小さいとか、CPUも控えめというお客様もいたことでしょう。コレはこれで楽しみですが、MとLの間を補完するようなプランもほしい。2.5GB→14GBって飛びすぎ。

---

いかがでしょう、他にも様々な機能が準備されているので、ぜひご覧ください。Heroku まだまだ進化していきますよー
ARで某エネルギーの波動を出す

この記事は鈴鹿高専Advent Calendar 2022 22日目の記事です。

https://qiita.com/advent-calendar/2022/snct
## はじめに
この記事では鈴鹿高専祭に展示した、某7つの球を集める漫画作品に登場するエネルギーを打ち出す技をARで誰でも出せるようにした作品の話をします。
なお、私自身はその漫画を読んだことがありませんし、その技も使えませんので原作とずれていても怒らないでください。

### 企画について
実はこの作品は、高専祭四日前に部として出せる作品があまりないことに気がつき、何かできることはないかと雑談をしていた時に顧問の教員がちらっとおっしゃったことをもとにしています。（多分その雑談中では誰も本当に作ってくるとは思ってもいなかったであろう...）
高専祭四日前であり高専祭二日前の日は学校が休みなので、その時点で部に顔を出せるのは雑談の翌日と高専祭前日の二回のみです。流石に何の相談もせずに前日に出すのは避けたかったので、雑談した日の夜の一夜だけでデモを完成させ、翌日の部活で話そうと企みました。

つまり、一夜で大体完成させる必要があったので、開発期間の高速化を優先し、既存のシステムを組み合わせて即席で作品を構築することにしました。

## とりあえず動かすまでの2時間

デモ完成までの二時間でやったことです。

### 設計(10分)
考えた結果、ARのための位置推定には使用したことのあるposenetを主軸に行うことに決定しました。
ARの合成にはunityでエフェクトを表示しOBSというYoutubeなどで配信をする際に使うストリーミングソフトでその映像をカメラ画像と合成することにします。posenetでpythonを利用しているので、pythonで完結させても良かったのですが、時間がかかりそうで怖かったので、obsを使用した合成という強引な手法を使うことにしました。
Unityとposenet(Python)間はUDPで通信しています。(部のPCのスペックが不明だったため、万が一の時はUnityとPosenetを別PC間でUDPしてケアする意味もある)

```mermaid
graph TD;
Webカメラ --> Python/Posenet
Python/Posenet -- UDP --> Unity
Python/Posenet -- カメラ画像 --> OBS
Unity -- エフェクト --> OBS
OBS --> プロジェクター
```

### 開発

#### Posenet(Python)(40分)
Posenetにより、手と腰の位置推定を行い、その座標をUDPでUnityに送信します。

実は第一の落とし穴がここにありました。Posenetがtensorflowの1系を利用していたのです。
私は、ノートPCとしてM1 macを利用しているのですが、tensorflowの1系はうまく動きません。ということで、開発に家のWindowsのデスクトップを使用することとなり、学校での開発は不可能になりました。

Posenetが推定した関節の位置情報をそのままUDPで送ります。
実際には`{頂点番号}:{x座標},{y座標}`の形で直接Unityに送りつけました。

#### Unity(70分)
姿勢を解析し、エネルギーのエフェクトを描画するためだけのUnityです。

まず、気を貯める姿勢を検出します。これは、左右の手の距離から判断しています。Posenetは片手が隠れていても両手分の位置を推定してくれるので愚直に両手間の距離を求めて閾値以内かで判断できます。

次に、エネルギーの放出の姿勢を検知します。エネルギーの放出の姿勢は胴体から両手を一定以上離した時と設計時点で定義していたため、胴体のx座標を左右の肩の位置の中間点から求め、中間点と両手のx座標の距離で判断しています。しかし、ここで閾値を一定にしてしまうと、腕の長さが短い小さな子供などが体験をするときに、大人と同じ設定では胴体と両手の距離が足りずにエネルギーが出せません。そこで、身長に応じて胴体から離さなければならない両手の距離の閾値を動的に更新するように設計しました。

## 前日の準備

作品自体は素早く完成させることにより、どうにか高専祭当日で展示できることになりました。ですが、前日の準備で思いもよらないトラブルが発生し、かなり苦労をしました。

まず、プロジェクターとモニターのに画面出力を行う予定だったのですが、展示用PCがWindows Serverだったので、古いグラフィックボートに対応したドライバーが正規の方法でインストールできず、詰まります。（どうにか、ドライバーを入れてくださった先輩、ありがとうございました)
また、姿勢推定でPythonからWebカメラを利用するのですが、Webカメラのドライバーもまともに入らず、PythonがWebカメラを認識しないトラブルもありました。
最も苦労したのが、Pythonのパッケージのインストールです。Anaconda環境、素のPythonへのパッケージインストールを試みたのですが、どのバージョンのPythonでもパッケージが入らなかったのです。しまいにはpipコマンドでOpenSSLのエラーが出てきてしまい、どうしようもなくなりました。~~(準備日が10/29で　OpenSSLの脆弱性の修正リリースが11/1なのでOpenSSLのせいにしたい...が調査はできていない)~~

## まとめ

PosenetとUnityという既存技術をOBSで無理やり組み合わせたキメラで時短してどうにか当日までに作品を作った話でした。~~時間さえあればもう少しまともな開発をしたかったです。~~
前日の準備日に本番PCで動かないというトラブルがあったので、もう少し前から動けていればよかったのかなと思います。

最後に、高専祭前日の準備日に遅くまで手伝ってくださった先輩方、本当にありがとうございます。
Docker を始めようとして躓いたこと

# はじめに

Docker で開発しようとしてどうも起動ができなかったときに躓いていたことについての備忘録

# インストール条件

公式サイトのシステム要件にはこう書かれている

### システム要件
- Windows 10 64 ビット：Pro、Enterprise、Education（ビルド 15063 以上）
- Hyper-V と Windows コンテナ機能の有効化が必要
- 以下は、Windows 10 以上で Hyper-V クライアントを問題なく実行するために必要なハードウェア要件
    - 64 ビット SLAT （Second Level Address Translation 対応プロセッサ
    - 4GB システムメモリ
    - BIOS レベルでのハードウェア仮想化が、BIOS 設定で有効にする必要。詳細な情報は 仮想化 を参照

この点のHyper-Vは有効になっていたが、Windows コンテナの有効化がされていないめDokcerが起動しなかった。

# 解決、およびインストール方法

1. Windows 10 Pro (11 Pro) を使用する
2. Hyper-V と Windowsコンテナ(コンテナ) を`Windowsの機能の有効化または無効化`で有効化する。
3. 公式サイトからDockerのインストーラーをダウンロードしてインストールする。

# 参考

https://docs.docker.jp/docker-for-windows/install.html
【Swift】初心者のランダム通話アプリ開発奮闘記 #16

# 今日の積み上げ
次に作るアプリケーションはテキスト通りだと、じゃんけんアプリですが・・・
普通にじゃんけんアプリ作っても面白みがないので、inputをチェキをしてみました。
Powerpointでイメージを作ったらこんな感じ…

![2022:12:22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/997222/6bdb363a-b3d8-393d-bd0a-29d4826037a6.png)

# 日記
僕の会社のボーナスは12/25付で出るのですが、今年も手取りで400,000円ほど頂けました。
今日は会社の忘年会なんですが、僕はコロナで不参加なので、その分１万ボーナスが増えるといいなあ
物語を語ろう

## はじめに
[UN Open GIS Initiative DWG7 on Smart Maps](https://github.com/unopengis/7) は開かれた実践コミュニティであり、オープンさの中に共通のカルチャーと求心力を持っていく必要があります。

しかし、開かれたコミュニティであるからこそ、共通の経験やアイデンティティを共有する良い方法を持つ必要があります。

ストーリーテリング（storytelling）はそのための良い手法であるように思います。ここでは、Smart Maps のストーリーを試作してみようと思います。

## The setup
地図というのはそもそも、空間の認識を共有するためのツールです。空間は共有のものと私的のものとがありますが、多くの場合、地図は共有の空間を扱います。そういった地図は、共有の空間についての認識を共有するものなので、**情報は自由になりたがる**の原理に従います。

だからこそ、地図技術者は多くの場合、**地図を開かれた共有のものにする**中で相応の報酬を得ることを狙います。

## The Confrontation
しかしながら、**地図を開かれた共有のものにする**ことが妨げられる状況は発生するものです。例えば、事業的な戦略から、あるいは政治的立場の多様性から、あるいは情報管理の必要から、地図の共有が妨げられる場合があります。

国連のような多国間の協力においても、さまざまな事情から**地図の共有が妨げられる**ことがあります。

**地図を開かれた共有のものにする**ことを通常のモードとする地図技術者にとって、**地図の共有が妨げられる**状況との直面は大きな危機でした。

## The Resolution
UN Open GIS Initiative DWG7 on Smart Maps では、**ウェブ地図を開かれたものに保つ（Keep Web Maps Open）** ことをビジョンにし、**技術の共有**をデータの共有以上に重視しています。データの共有は必ずしも叶わない場合もあるし、データが示す情報の内容に必ずしも合意する必要はない、**それでも、技術であれば共有できる**ことがある、というのが我々の答えです。

このようなビジョンやアプローチに賛同してくれる、可能な限り多くの方が、Smart Mapsの活動に参加していただけるようにしたいと思っています。

## おわりに
引き続き、ヒントや支援や参加をいただければと思います。良いお年を。

来年は、少しでも多くの方が、FOSS4G 2023 が開催される Prizren に行けるようにしたいと思っています。
情報処理安全確保支援士試験の合格体験記

# 0. はじめに
令和4年秋期に受験した、情報処理安全確保支援士試験にギリギリ合格しました。
これから勉強する人に向け、合格体験記を書きます。
<img width="600" alt="IMG_9073.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/9ee680c7-e444-1b6a-f1e3-c64eb7b25761.jpeg">

# 1．筆者の状態(受験時)
　<b>学生のとき</b>
　情報系の4年生国公立大学　学部卒
　成績は平凡ちょい下くらい
　学部卒業とともに応用情報技術者試験を合格、その後はCCNAを取得
　
　<b>社会人になってから</b>
　保守エンジニアとして、PG,テスト,運用を1年経験
　9:00~18:00の勤務で、大きな残業や心身への負荷は無し

# 2．受験動機
- 学習習慣を身に着けるため。
- セキュリティは業務内容にかかわらず、必要な知識であるため。

### 学習習慣を身に着けるため
できることを増やすためには、長期的な継続学習が必要です。
オンラインFPSゲームをしているだけでは、Webサイトの立ち上げ方は身に付きません。
また、無理な学習を続けようとすると、心身の健康が保てず、仕事に悪影響を及ぼしたりします。

自分の人生に"うまい具合"で学習の習慣を追加できれば、しんどくならず、日々成長できて褒められて感謝されて嬉しいです。
自分は目の前に餌があると容易に走り続けることができるタイプなので、
"うまい具合"を見つけるために、資格試験というわかりやすい到達目標を設定し、継続学習をしました。

### セキュリティは業務内容にかかわらず、必要な知識であるため
　最近はAIなどIT技術の発展が目覚ましいですが、それらを利用する人間にセキュリティ知識がない場合、ITと人間のインターフェースはセキュリティ面で脆弱な点となります。
知識があれば、様々な行動に伴うリスクを考慮することができ、問題発生時にも適切な対処を取れます。
自分や周囲の人が困ったとき、ITエンジニアとして助言・対処できるように知識を身に着けたいという動機です。

# 3．試験勉強
受験申請の期限日に申し込みおよび学習開始をしたので、以下内容を3ヶ月間で行いました。
## 日々学習をする中で一貫して意識していたこと
- 無理をしない
- 学習できる環境に、とりあえず身を置いてみる
- 学習初期はしんどいものである

### 無理をしない
　継続学習の癖をつける目的もあるので、無理をして心身に悪影響が出たり、そもそも学習にネガティブなイメージを持ってしまっては本末転倒です。
また、参考書を読む、問題を解くなどコンテンツを消費する系の学習で、頭に入らないのにもかかわらず学習をするのは、学習の機会を失っているだけだと思うので、頭に入らなそうなときは学習しませんでた。

### 学習できる環境に、とりあえず身を置いてみる
　学習モードに切り替えるために、平日21:00~23:00の2時間カフェにいる状態を作っていました。家には誘惑が多すぎて集中できません。私は家で3時間学習するより、カフェで1時間勉強したほうが頭に入ります。

### 学習初期はしんどいものである
　私の体感ですが、試験範囲の7割以上を正解できるようになるまで、どの試験勉強でもしんどいです。合格までに覚えなければならない知識が多く、到底理解できる量に思えないことが一因だと思います。1日 0.1つでも新しいことをを覚え、1ページでも進めればいつか無双できる日が来ます。

## 午前対策
体感では過去に出た問題が半分以上出題されます。したがって、過去問が解けるようになれば本番も問題ありません。
### 午後1（応用情報技術者試験の午前問題と同じ四択問題）
　免除です。もし免除でない場合、範囲としては応用情報技術者試験の範囲だと思うので、[応用情報技術者試験ドットコム](https://www.ap-siken.com/)を使うと思います。
### 午前2（情報処理安全確保支援士試験用の四択問題）
　まずは、上原本を1周だけ読みました。この時点では内容が全然理解できないので、全体を把握する目的で、理解していなくとも速度感を重視して読みました。
　その後、[情報処理安全確保支援士ドットコム](https://www.sc-siken.com/)で約400問解きました。感覚としては、見たことある問題であれば回答および正解の理由がざっくりとわかっている。見たことない問題であれば選択肢が半分まで絞れる。という感じです。
詳しい内容は午後問題を解いていけば身につくので理解度6割ほどで済ませました。
<img width="600" alt="solve_report.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/0526804b-75ca-c419-970c-001019c851b9.png">

## 午後対策
　午前とは異なり、内容を理解していないと解けない問題ばかりなので、理解することを目的に勉強をしました。
その認証方法はどういう手順で行われるか。セキュリティ的に良い点、悪い点およびその理由がイメージできるようにしました。同じ問題を3度は間違えないようにしました。
### 午後1（長文読解＆記述）
　過去問演習,模擬問題をひたすら解きました。まずは解説が充実している模擬問題を解いて理解します。私は重点対策本を使いました。1周だけですが、内容を理解して全問説きました。次に、IPAが過去問及び回答を公開しているので、過去4年計7,8回分は解きました。

### 午後2（超長文読解＆記述）
　基本的には午後1と同様の方法です。問題文が長く、解答の分量も増えるので慣れが必要です。たくさん問題に触れれば、それぞれの技術でインシデントの傾向が掴めると思います。

# 4.試験を合格して
　試験は合格できましたが、RPGみたくデジタル(離散)的にレベルアップするわけでもないので、明確に生活や思考が切り替わることはないですが、様々な技術に対する解像度が上がった感覚があります。
　また、継続的に学習をするにあたり、自分にとってベストの勉強方法やモチベーションを高く保ち続けるための方法がわかったり、時間の使い方が少し上手になったことは、これから役に立ってくれるかなと思います。


# 5.おわりに
　本試験は、IT担当者として、利用者として役に立つ知識を得ることができます。ICカードリーダーの認証や無線通信にかかわる技術など、少し詳しく知ることができるので、「ほえ～」と思いながら、能動的に学習していければ効率よく頭に入ると思います。

---
何か追記があれば随時更新します
Swift の Hashable は自分で実装しない限りキャッシュが効かない

小ネタです。Swift の Hashable について実にとんでもない勘違いをしていました。

Swift 4.2 から `Hashable` 適合の際に必要な実装が `var hashValue: Int` から `func hash(into hasher: inout Hasher)` に変わりました。これは当然ながらハッシュ値の生成をより簡単にかつ効率的に作るためであって、`Hashable` 独自適合の際にハッシュアルゴリズムを気にしなくても大丈夫なようになりました。

ところがなぜか、これで `hashValue` も内部で `lazy var` 的な仕組みでキャッシュしてくれるんじゃないかと勘違いしていました。勝手にキャッシュして欲しかったからなのでしょうか。

検証のためにこのようなコードを書いてみました：

```swift
import Foundation

struct Demo: Hashable {
    var p001: Int
    var p002: Int
    var p003: Int
    // ...
    var p100: Int
}

let demo1 = Demo(p001: 123, p002: 123, p003: 123, /* ... */, p100: 123)
let demo2 = Demo(p001: 123, p002: 123, p003: 123, /* ... */, p100: 123)

let loopTimesA = 0 ..< 1_000_000
let loopTimesB = 0 ..< 10_000_000

let date1 = Date()
for _ in loopTimesA {
    _ = demo1 == demo2
}
print("elapsed time of comparing raw in A times:", -date1.timeIntervalSinceNow)

let date2 = Date()
for _ in loopTimesB {
    _ = demo1 == demo2
}
print("elapsed time of comparing raw in B times:", -date2.timeIntervalSinceNow)

let date3 = Date()
for _ in loopTimesA {
    _ = demo1.hashValue == demo2.hashValue
}
print("elapsed time of comparing hash in A times:", -date3.timeIntervalSinceNow)

let date4 = Date()
for _ in loopTimesB {
    _ = demo1.hashValue == demo2.hashValue
}
print("elapsed time of comparing hash in B times:", -date4.timeIntervalSinceNow)
```

上記のコードで 100 のプロパティーを持つ型 `Demo` を作って、そして値が同じ `demo1` と `demo2` を作って、お互い自身の比較を2回違うループ数で行ってみました；そしてさらに `hashValue` も同じく、違うループ回数で2回比較しました。

そして自分の環境での実行結果は、最適化なしの場合は、値自身の比較にしろ、`hashValue` の比較にしろ、どっちもかかる時間はループ回数に比例します；ただし `hashValue` の比較よりも、値自身の比較の方が早いです。

```shell
 % swift -Onone main.swift
elapsed time of comparing raw in A times: 0.2997390031814575
elapsed time of comparing raw in B times: 3.01657497882843
elapsed time of comparing hash in A times: 1.6205110549926758
elapsed time of comparing hash in B times: 16.24207305908203
```

これでわかるのは、やはり少なくともこの場合 `hashValue` はキャッシュされないし、`hashValue` の計算自体もそれなりにコストがかかります。

ちなみに最適化をかけた場合、`hashValue` の経過時間も同じようにループ回数に比例して増加します、つまり最適化してもキャッシュがないことがわかります；ところが、逆にむしろ値自身の比較の方が2回目では全く時間がかかりませんでした。まあ `let` だったので、最適化の結果値の比較は 1 回だけしか行わなかったでしょう。そして最適化なしの場合と比較しても、`hashValue` の比較にかかった時間はあまり変わらなかったので、ハッシュ値の計算は最適化の効果が非常に限られてると言えるでしょう。

```shell
% swift -O main.swift
elapsed time of comparing raw in A times: 5.1021575927734375e-05
elapsed time of comparing raw in B times: -0.0
elapsed time of comparing hash in A times: 1.3289411067962646
elapsed time of comparing hash in B times: 13.25122594833374
```

結論：プロパティーが多い型でハッシュ値を何回も必要とするときは、もし必要でしたら自分でキャッシュを実装した方がいいかもしれないですね。
casa-androidを使ってcatalogアプリを試しに作ってみた

[casa-android](https://github.com/google/casa-android) という catalog アプリを作れるフレームワークが新たに登場したので、どのようなことができるのか試しに使ってみました。

casa-android は 2022/12/22 時点で Ver 0.1.0 となっており、将来的に大きく実装が変わる可能性があります。

## 導入

基本的には https://github.com/google/casa-android#how-to-use-it に書かれている通りです。
ただし、Ver 0.1.0 ではいくつかハマりポイントがあります。

- パッケージ名が `com.google.android.catalog.framework:xxx:0.1.0` として配布されている
    - README にある `com.google.android.casa` ではない
- [sample modules の設定](https://github.com/google/casa-android#create-sample-modules)では省略されているが、ksp を使用しているので、`kotlin.srcDir("build/generated/ksp/${valiant}/kotlin")` の設定が必要
    - https://kotlinlang.org/docs/ksp-quickstart.html#make-ide-aware-of-generated-code
    - この設定がないと `@Sample` を ksp で探して生成されたコードが見つけられずにビルドエラーになる
- minSdk 26 が要求される
  - catalog アプリだけ別アプリにしてしまえば問題はないが、アプリ本体に組み込む場合は注意が必要



## 実装される catalog アプリの様子

Compose の場合は Composable fun に `@Sample` をつけていくだけで catalog アプリに実装されます。
(`@Preview` は特につけやすい)
Activity や Fragment にも `@Sample` とつけるだけで catalog アプリに組み込まれるようになります。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/cea781c5-f40f-8f2c-298e-96f9c7694816.gif" width="400px" />

## Showcase との違い

似たような機能を持つライブラリに [Showcase](https://github.com/airbnb/Showkase) が既に存在します。
case-android はまだ出たばかりということもあり機能が充実しているとは言えませんが、

- case-android は Compose だけでなく Activity や Fragment も catalog アプリの中に組み込める
    - Showcase は Compose only  
- catalog アプリとして standalone で動かすことができる
    - `startActivity` でアプリの中から開く Showcase とは異なり、単独の catalog アプリとして作ることができるようになっている

あたりが Showcase との現時点での差となっています。


<hr />

Google 公式の catalog アプリが作れるフレームワークである casa-android は出たばかりでまだまだ開発途中なので今後の発展が楽しみですね。
TargetSdkVersionを更新しないとどうなるのか

こんんにちは、メグリ株式会社でAndroidエンジニアをしている増田と申します。
少し前に約2年ほどTargetSdkVersionを更新していなかったアプリについて、アプリの公開にまつわる重要なお知らせがGoogleから来ていたので備忘録的にまとめたいと思います。

## 少しおさらい
TargetSdkVersionの対応期限について軽くおさらいです。
Android開発者であればおなじみのTargetSdkVersionの更新は、毎年Googleから通達があって、新規アプリの場合と既にストアで公開されているアプリで対応期限が異なります。

通例だと毎年、新規アプリの場合は8月1日、既にストアで公開されているアプリでは11月1日が対応期限となっており、それ以降は基準に満たないバージョンが指定されている apk/aab はplay consoleにアップロードできないようになっています。
![スクリーンショット 2022-12-22 20.11.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218703/ceac7810-b622-49be-f5d8-060865ac491b.png)

## もし更新しなかったら
そのまま放置しつづけた場合　、ある条件下でPlayストアで検索しても表示されなくなってしまいます（**＝インストールできなくなる**）

その条件とは **googleが最低限更新してしてほしいTargetSdkVersionに更新できていないアプリ × それ以降のOSバージョンを搭載している端末**となり
例えばアプリで指定しているTargetSdkVersionが29だとしたら**Android10**が対象となるので、**Android11以降**の端末ではplayストアでは非表示となってしまうイメージです。
多方面にかなりインパクトがありそうですね・・😱

肝心の期限は　**2023/1/31**　（2022/12/23現在）までとなっているので、もし対応していない場合は早めに対応しておくことをお勧めします！
だいたい1年間隔でリリースがあるので、おおよそ2年で2つ前のバージョンがゆくゆくは非表示となってしまうようです。
>アップデートのない既存の Google Play アプリ: Android の最新のメジャー バージョンのリリースから 2 年を過ぎてもその Android API レベルをターゲットにしていないアプリは、それ以降のバージョンの Android OS を搭載したデバイスの新規ユーザーからアクセスできなくなります。そのアプリを以前に Google Play からインストールしたユーザーは、アプリでサポートされていればどのバージョンの Android OS でも、引き続きアプリを検索、再インストール、使用できます。


対応が必須となっている理由としては以下の通りで、Googleからもアナウンスがあります。
>Google Play では、Android と Google Play のユーザーに安全な利用環境を提供するため、すべてのアプリに以下の対象 API レベル要件を満たすことを義務付けています。

https://support.google.com/googleplay/android-developer/answer/11926878?hl=ja#zippy=%2C%E6%97%A2%E5%AD%98%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E4%BB%8A%E5%9B%9E%E3%81%AE%E6%9B%B4%E6%96%B0%E3%82%92%E9%81%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AB%E6%99%82%E9%96%93%E3%81%8C%E3%81%8B%E3%81%8B%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B

## 解消方法
解消方法については暫定的な対応と恒久的な対応の2つがあります。
- 恒久的な対応
    - ごくごくシンプルにTargetSdkVersionを現行バージョンよりも上に更新する
        - 1つだけバージョンを更新する方法でも乗り切れますが、結局1年後も同じ対応をしなければいけないことになるので、なるべく現行最新バージョン（33）まで上げられるのが理想です。
- 暫定的な対応
    - TragetSdkVersion引き上げの勧告に関するメールが来ており、そこには対応期限を延長できるオプションが用意されているのでそれに従って操作すればOK 
    -  （※スクショが少し古くて、2022/11/1となっていますがご容赦ください）
        - これもあくまで延命措置なので、期限内に必ず対応しないといけません。
![スクリーンショット 2022-12-22 19.12.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218703/eded3e8a-6301-90f0-24c8-657a6584d4cd.png)
![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218703/a2e8aaed-1467-dc33-b7cd-7650ff51a783.png)
![スクリーンショット 2022-12-22 20.44.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218703/acd92210-a810-b79b-5bb5-7b816a7b7013.png)


## まとめ
早めにTargetSdkVersionを上げておくのが吉！！！
（最初見た時かなり肝を冷やしました）
延長申請してお茶を濁しても結果的に後々やらなければいけないので、早めに更新による変更点の情報をキャッチしておいて、
変更が必要な箇所の特定とその対応が早め早めで出来るとより一層いいかなと思います。

ご覧いただき、ありがとうございました🙇‍♂️