OmniAICreator/Qiita-1.07M huggingface dataset:
インスタンスメソッド・スタティックメソッド・値型のmutatingキーワードを理解しよう！

# インスタンスメソッドとは
型のインスタンスに紐づいたメソッド
funcキーワードで定義したメソッドは、デフォルトではインスタンスメソッドである。
インスタンスを生成し、プロパティに値を保持させたい時。

Playgroundで見てみましょう！
```Swift
struct Counter {
    var count = 0
    func printCount() {
        print("\(self.count)")
    }
}

var counter1 = Counter()
counter1.count = 1
counter1.printCount()

var counter2 = Counter()
counter2.count = 2
counter2.printCount()
```
実行結果それぞれのインスタンスを生成し、インスタンスごとに応じた値が出力される。
**出力結果**
```
1
2
```

# スタティックメソッドとは
型自身に紐づくメソッドであり、インスタンスに依存しない処理に使用する！
プロパティに値を保持させる必要なく、型に紐づけたい時。
```Swift
struct Counter {
    static var count = 0
    static func changeCount(changeNumber: Int) {
        Self.count = changeNumber
        print("\(Self.count)")
    }
}

print("\(Counter.count)")
Counter.changeCount(changeNumber: 5)
```
型自身に紐づくメソッドであるため、インスタンス化せず、`型名.メソッド`で、`Counter.changeCount(changeNumber: 5)`で呼び出せる！
**出力結果**
```
0
5
```
# 値型のmutatingキーワードとは
値型では、mutatingキーワードをメソッドの宣言に追加することで、自身の値を変更する処理を実行できる！
メソッドを実行してインスタンスの値を変更すると、`変数へ暗黙的な再代入`が行われる！
```Swift
struct Counter {
    var count = 0
    mutating func addcount() {
        self.count += 1
    }
}
//letで宣言するとコンパイルエラー
var counter1 = Counter()
print("\(counter1.count)")
counter1.addcount()//countに再代入
counter1.addcount()//countに再代入
counter1.addcount()//countに再代入
print("\(counter1.count)")
```
**出力結果**
```
0
3
```
構造体は直接ストアドプロパティを変更できないが、mutatingを使用することで、プロパティに再代入可能になる！
`var counter1 = Counter()`はletではエラーになる！
`counter1.addcount()`が呼ばれ、counter1に再代入が行われ、インスタンスが保持する値が変更されるため。
counter1インスタンスを再代入の都度、新しい実体を生成しているイメージ。

# classはmutatingキーワード不要
```Swift
class Counter {
    var count = 0
    func addcount() {
        self.count += 1
    }
}
//letで宣言できる！
let counter2 = Counter()
print("\(counter2.count)")
counter2.addcount()
counter2.addcount()
counter2.addcount()
print("\(counter2.count)")
```
mutatingを使用しなくても、classはプロパティに再代入できる！
classがletで宣言できるのは、参照型で、インスタンスの値が共有できるからだと考えられます！
値が共有できるため、counter2の実体のプロパティの変更が自動更新されるイメージ。

**出力結果**
```
0
3
```
# 参考文献

https://gihyo.jp/book/2020/978-4-297-11213-4

https://zenn.dev/tanukidevelop/articles/7ac12aba4114ac

https://qiita.com/hinakko/items/201587d4c018f10a174e

https://qiita.com/hinakko/items/70c05a1abcc44fea5174
ranked-modelで既存のレコードに値を入れる際の注意点

# はじめに
こんにちは、HappyManaです。
ranked-modelを使った際、既存レコードに値を入れる処理を書いたのですが、
ranked-modelのREADMEに書いてある方法で困ったことがあったため備忘録として書きます。

# 困ったこと
ranked-modelの[README](https://github.com/brendon/ranked-model#migrations-for-existing-data)には、以下の方法が書いてあります。
```
Duck.update_all('row_order = EXTRACT(EPOCH FROM created_at)')
```

これは、timestamp型のcreated_atをUNIX時間に変換するというものです。
UNIX時間は、1970年1月1日午前0時ちょうどからの経過秒数なので整数値になります。
なので並び替えのカラムの型をINTEGER型とすると、型としては問題はありせん。

しかし、created_atをUNIX時間に変換する際に、ミリ秒が四捨五入されるという処理になりました。
たとえば、created_atが`2023-12-25T12:00:00.193967+09:00`のとき、UNIXに変換すると、**1703473200**となります。
また、`2023-12-25T12:00:00.542731+09:00`のときは、**1703473201**になります。

このように、小数点以下1桁目で四捨五入されます。
こうなると、並び替え用のカラムに同じ値が入って同じ重みのレコードが複数でき、並び番号が同じになってしまいます。

そのため、既存のレコードに対してUNIXに変換した値を入れるのはよくないです。

# どうするべきなのか
idなどユニーク制約がついたカラムを使って値を入れましょう。
```
Duck.update_all('row_order = id')
```

また、eachなどで回してインデックスを入れてもいいですが、N+1になるので、注意が必要です。
DAT vs MD

[インターネット老人会の魔法書 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ancient-internet) の21日目の記事です。

# DAT

デジタルオーディオテープ（DAT）は、デジタル方式の音声記録媒体である。その特徴は、複製時やテープの摩耗などによる波形の歪みが起こりにくく、CDを超える高音質での記録が可能であることだ。
これらの特性から業務用機器で普及した。
しかし、一般消費者向けとしては過剰品質で製品が高価すぎたため、アナログテープや後に現れたミニディスク（MD）などの規格に押され、あまり普及しなかった。一部の音響沼の間では絶賛されてはいた。

# MD

一方、ミニディスク（MD）は、1991年にソニーが発表したデジタルオーディオの光学ディスク記録方式である。MDは、ディスクの直径が64mm、厚さ1.2mmで、カートリッジは横72mm、縦68mm、厚さ5mmとなっており、傷やほこりに強い点が特徴的だった。発売当初は録音メディアの主流はカセットテープであったが、MDは曲のスキップが可能で、カセットより薄く持ち運びがしやすい点が優れていた。しかし、CDと比べると音質や情報量で劣り、発売当初のものは記録量が少なかったこともあり、なかなか受け入れられなかった。

# DAT vs MD

DATとMDの対比を考えると、DATは高音質である一方で高価であったため、一般消費者にはあまり普及しなかった。それに対して、MDはコンパクトで持ち運びやすく、その後の技術進歩により記録容量は増加し、データ転送速度も高速化され、何より安価だったため、MDは一時期、音楽を楽しむためのポータブルメディアとして人気を博した。

# 終焉

しかし、PCやインターネットの普及、そしてiPodなどの登場により、MDの需要は低下した。現在では、新品のMDプレーヤーを手に入れるのは困難である。
私の家にも多数のMDメディアがあるが、もはや聞く機会も機械もない。
acts_as_listとranked-modelの違い

# はじめに
こんにちは、HappyManaです。
Railsで並び替えをしたいときに使うgemで、大きく[acts_at_list](https://github.com/brendon/acts_as_list)と[ranked-model](https://github.com/brendon/ranked-model)があります。
この2つのgemの違いがわかりにくかったため、紹介するとともに違いを書いていきます。

並び替え用のdbカラムは、row_orderカラムとします。

# dbに入る値が異なる
最も異なるのがこれです。
他にもいろいろ違いはありますが、1番大きな違いなので、これを説明していきます。

## acts_as_list
acts_as_listでは、カラムに1、2など「そのレコードが何番目か」が入っています。
例えば、現在3番目のレコードを2番目に並べ替えたいとき、acts_as_listでは、2番目と3番目のレコードのrow_orderカラムが変更されます。

| id | row_order |
| - | - |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |

↓
| id | row_order |
| - | - |
| 1 | 1 |
| **2** | **3** |
| **3** | **2** |

そのため、並べ替えたい先の番号より後の番号のレコードはすべて更新されます。

値の更新では、対象のレコードと、それ以外の変更する必要のあるレコードをwhereで絞り込んで+1もしくは-1するというUPDATE文になるので、クエリ数は2回で済むようになります。
今回の例では、id=2と3の2レコードしかありませんが、100行になっても2回で済みます。

ただし、デメリットとして、3レコードしかない状況で、「100」などの最後尾の番号より大きい値を入れると、最後尾の番号ではなく、100番という絶対的な値が入るというデメリットがあります。

## ranked-model
一方で、ranked-modelは、カラムに-1073741823、126322567など「そのレコードの重み」が入っています。

これをすると、重みが軽い順に並びます。
これによって、「1レコードを並び替えた時に、そのレコードのみUPDATEされる」という処理になります。

例えば、現在3番目のレコードを2番目に並べ替えたいとき、ranked-modelでは、1番目と2番目のrow_orderカラムの値の合計/2の値が3番目のレコードのrow_orderカラムに入ります。

| id | row_order |
| - | - |
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |

↓
| id | row_order |
| - | - |
| 1 | 100 |
| 2 | 200 |
| **3** | **150** |

そのため、対象のレコードのみUPDATEされます。

ただし、1番目と2番目のrow_orderカラムの値にすき間がない場合、重みが振り分けられます。
そうなると、すべてのレコードのrow_orderカラムの値が変わるため、クエリ数がN+1になります。

まあINTEGER型なので、-2147483647~2147483647の間で均等に割り振られるため、頻繁にN+1は起きないと考えられます。

デメリットとしては、上で挙げた重みを振り分ける際にクエリ数がN+1になる可能性があるということ、またすべてのレコードを確認しないとそのレコードが何番目かわからないということがあります。

# おわりに
acts_as_listとranked-modelの違いを書きました。
それぞれで処理の内容が違って興味深かったです。
個人的には、関係ないレコードはUPDATEされないranked-modelの方が好みではあるのですが、2クエリでまとめてUPDATEするacts_as_listも魅力的ではあるなと思いました。
VCI開発するときのお役立ち Unity編-その２

この記事はVCIアドベントカレンダー2023 18日目の記事です。

VCIを開発していると、だんだんたくさんのオブジェクトを使うようになってきたりします。いじるものが少ないうちはいいのです。でもそのうち初心者を卒業して、なまじできることが増えてくる 中級者になってくると 管理すべきパラメーターが膨大になってきて 作業が煩雑になってきてしまいます。今回はそういう めんどくさい状況を少しでも楽にする趣旨で３回くらいの続きで記事にしようと思います。
一回目:https://qiita.com/sakkinonana/items/73ca38ec474d49da2fee

前回、連番でコピーをたくさん作りました。そのうえで一気に数値を設定する方法をお伝えしましたが、それらはすべて同じ数値でした。これを今回は応用していきたいと思います。

### 整列
整列したいオブジェクトをすべて選択して、L(a,b)と入力するとaからbを等間隔で配置してくれます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/94b263ff-862b-4a4b-bbdf-d3a449c9ac76.png)

こちらは無名さんがhttps://www.fanbox.cc/@mumei-no-douguya/posts/7071415 で紹介して頂いておりますので、詳しくはこちらもご参照ください。

### 関数
上記の整列以外にも、関数を適応することができます。ここで前回の連番の設定が効いてきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/49e57d15-e4d4-b470-a430-2eb553258de3.png)
まずsin,cosの例。transformのXにsin(2*pi/10*#)、Yにcos(2*pi/10*#)を入れると円形に配置するときなどは特に便利です。（画像では同時に表示できないのでYだけに入っているように見えますが、Xを先に入れてあります。ここで使う＃は連番を示しているので、連番にしていないと動作しません。
同様に使える関数はsin,cos,tanの三角関数、floor,ceil,roundなどの切り捨て、切り上げ、四捨五入の関数
R(0,1)にすると0から1までの乱数になります。乱雑に配置したい場合は便利です。

### あとからtransformを適用
VCIは実使用の際のスケールは１であったほうが何かと都合がいいです。あまり極端な数が入っていると拡縮などの際に挙動がおかしくなるほか、スケールが非対称だったりするとスクリプティングの際に苦労することになります。ですので、使用するモデルのスケールをあらかじめすべて１にすることが望ましいです。
ところが、unityではモデルをいじることができないので、blenderに戻ってやらなければならず大変です。そこで、横着してunityだけでやる方法をよく使います。
やり方は簡単で、fbxを読み込む際に、scaleを入れる場所があるので、そこに所定の数値、例えば10分の1にしたかったら0.1を入れて下のほうにあるapplyを押します。これでそのfbxを使っているオブジェクトはすべて元の十分の一の大きさがスケール1になります。
（これをやらないと面倒なことになる例をユエムさんがhttps://qiita.com/johnny-um/items/5eb71c221524b0dedd80 で紹介してくださっています。併せてご参照ください）

### 疑似的にtransformを適用
これはunityの機能というよりはテクニックに近いものです。
unityのデフォルトオブジェクトなどblenderで編集できないものがあります。例えば正方形の板(Quad)を長方形にしたい場合はどうしてもスケールを(1,0.5)など非対称にする必要があります。しかし、このままだとスクリプトで取り扱いが面倒です。そこで、親に空のオブジェクトを作成しそこの下に入れてしまいます。すると、親オブジェクトを元のオブジェクトとして扱えば、拡縮も座標取得も簡単になります。

### コンポーネントの数値だけコピー
オブジェクトを後から追加したときに、コンポーネントの数値を一から設定しなおすの、面倒なことがありますよね。こんな時はコンポーネントのコピー機能の出番です。
コンポーネントの右上の三点マークをクリックすると、"copy component"がありますので、こちらを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/7bcbddc8-2cb8-1c44-32fb-a4936b9a6f57.png)
そして、新しくし作成したオブジェクトの適当なコンポーネントで同様にすると、今度はpaste component as newとpaste component valuesが現れますので、すでにコンポーネントが存在する場合はvaluesを選択すると、値だけコピーされます。簡単なことですが、意外に重宝します。

### 特定のオブジェクト・ファイルを検索
いろいろ作るものが多くなってくると、何がどこにあるかわからなくなってきます。
自分はよくシーンファイルがどこに行ったか分からなくなって困ることがあるのですが、そのようなときはファイル検索で、隣にある四角三角丸のアイコンをクリックすると、ファイルの種類を指定して検索できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/efdbd624-80e3-4ac2-b41b-17f39ef2cf62.png)
これも地味に便利です。

## 参考
https://creator.cluster.mu/2022/08/22/unity_inspector/
Tailwind CSSで要素を一度だけ一回転させる

Tailwind CSSで作成しているウェブサイトで
「クリックするたびに、アイコンが反時計回りに一回転する」
という演出を作ろうとしたところ、意外と難しかったのでメモしておきます。

## うまく行かない例：その１

アイコンを0.7秒でくるんと回したいので、`.-rotate-[360].transition-transform.duration-700` を付与して以下のようにHTMLを書いてビルドしました。

```HTML
<span class="w-16 h-16 flex flex-col justify-center items-center gap-2
  -rotate-[360deg]
  transition-transform
  duration-700
">
  ここにアイコンが入る
</span>
```

すると、HTMLをブラウザで表示した途端に一回転してしまいました。

## うまく行かない例：その２

`-rotate-[360deg]`が入っているのがいけないのだな、と思い、先ほどのコードから削除しました。

```HTML
<span class="w-16 h-16 flex flex-col justify-center items-center gap-2
  transition-transform
  duration-700
">
  ここにアイコンが入る
</span>
```

このままだとTailwindが`-rotate-[360deg]`クラスを書き出してくれないので、必ず書き出させるよう、セーフリストに入れておきます。

```javascript:tailwind_config.js
・・・
safelist: [
  '-rotate-[360deg]'
],
・・・
```

`-rotate-[360deg]`は、JavaScriptのクリックイベントが発生したときに付与することにしました。

```javascript
icon.addEventListener('click', ()=> {
    icon.classList.add('-rotate-[360deg]');
    const delay = setTimeout(() => {
      icon.classList.remove('-rotate-[360deg]');
    },700);
});
```

よーしこれで完璧やー！
…と思ったのですが、なんと一回転したあと、逆回転して元に戻ってしまいます。

## 原因

`.transition-transform.duration-700` をアイコンに付与していたのが原因でした。
そもそも回転の場合は、transitionは必要なかったです…

動きと早さがHTMLに固定されているため、DOM操作でrotateクラスを削除した途端に、元に戻るアニメーションが発動してしまっていたのです。

## 正しい書き方

アイコンから不要なクラスを削除します。

```HTML
<span class="w-16 h-16 flex flex-col justify-center items-center gap-2">
  ここにアイコンが入る
</span>
```

セーフリストには`duration-700`も追加しておきます。

```javascript:tailwind_config.js
・・・
safelist: [
  '-rotate-[360deg]',
  'duration-700'
],
・・・
```

そのうえで、JavaScriptのクリックイベントが発生したときに、rotateとdurationの両方を付与・削除させます。

```javascript
icon.addEventListener('click', ()=> {
    icon.classList.add('-rotate-[360deg]', 'duration-700');
    const delay = setTimeout(() => {
      icon.classList.remove('-rotate-[360deg]', 'duration-700');
    },700);
});
```

これでイメージ通り、クリックするたびにくるんと回転するようになりました。
かわいいいい！！😍
いろんなもの回したいね！

## 余談

なお、Tailwind CSSのtransitionクラス群は、自動的に`transition-duration: 150ms;`が付与される仕様となっています。
これを使用しているときにDOMで打ち消すには、`.duration-0`をさらに付与する必要があります。

https://tailwindcss.com/docs/transition-property
Pythonで「タプルの要素を取得する」の動作を確認してみた

# 概要

Pythonで「タプルの要素を取得する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/tuple/index2.html

# 実装

以下のファイルを作成しました。
```sample.py
mytuple = ("Orange", "Lemon", "Apple")
print(mytuple[0])
print(mytuple[1])
print(mytuple[2])

mytuple = ("Orange", "Lemon", "Apple")
print(mytuple[-1])
print(mytuple[-2])
print(mytuple[-3])

mytuple = ("Orange", "Lemon", "Apple")
#print(mytuple[3])

mytuple = ("Orange", "Lemon", "Apple")
print(len(mytuple))

mytuple = ("Orange", "Lemon", "Apple")
print(mytuple[len(mytuple) - 1])

animaltuple = ("Cat", "Dog", "Cow", "Monkey")
print("最初の要素は " + animaltuple[0] + " です。")
print("最後の要素は " + animaltuple[len(animaltuple) - 1] + " です。")
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
Orange
Lemon
Apple
Apple
Lemon
Orange
3
Apple
最初の要素は Cat です。
最後の要素は Monkey です。
```

# まとめ

何かの役に立てばと。
EC2コンソールからAWSのリソースにアクセスしようとしてストレスマックス

備忘録
# An error occurred(InvalidClientTokenID)が出てストレスマックス
今までアクセスキーやシークレットキーをexportするという全く持ってセキュアではないことをしていたがさすがにやめようと思い、IAMロールでs3等にアクセスしようとしたが
An error occurred(xxxxxxxxxxxxxxxxx)
どのリソースに対してもこんな感じで、調べてもズバリな答えがなく2時間が過ぎた。

この時点でストレスマックス

原因は./aws/credentialを移動させれば解決。
多分こいつがいると先にこれを見に行ってエラーになる。よく知らんが備忘録

BARDに聞いたらアクセスキーが間違っているとかいうテンプレ回答だった。
【Vue.js Composition API】子コンポーネントで定義したメソッドを別の子コンポーネントから呼び出す

## はじめに

ある子コンポーネントで定義したメソッドを別の子コンポーネントで使いたかったので、親コンポーネントを経由して受け渡ししました。

## 環境

- Vue.js 3.2
- Composition API

## 前提知識

子から親へメソッドを渡すのに `defineExpose` を使用します。

https://qiita.com/wsigma21/items/07353771136c753db733

子で発生したイベントを検知して、親のメソッドを呼び出すには `emit` を使用します。

https://qiita.com/daichiccchi/items/9a76314f59f2d9b15ba1

## 実装

Child1コンポーネントに定義されたメソッドを、Child2コンポーネントのボタンが押されたときに呼び出しています。

### 親コンポーネント

```vuejs:Parent.vue
<script setup>
import { ref } from "vue";
import Child1 from "./Child1.vue";
import Child2 from "./Child2.vue";

// Child1コンポーネントの情報を受け取る
const child1Ref = ref();

const callChild1Method = () => {
  // Child1コンポーネントのメソッドを呼び出す
  child1Ref.value.child1Method();
};
</script>

<template>
  <div>
    <Child1 ref="child1Ref" />
    <Child2 @doEmit="callChild1Method()" />
  </div>
</template>
```

### 子（Child1）コンポーネント

```vuejs:Child1.vue
<script setup>
// Parentに渡しChild2から呼び出されるメソッドを定義
const child1Method = () => {
  console.log("child1コンポーネントのメソッドが呼ばれた！");
};

// Parentからの呼び出しを可能にする
defineExpose({ child1Method });
</script>
```

### 子（Child2）コンポーネント

```vuejs:Child2.vue
<script setup>
// emitを定義しイベントの発火を親が検知できるようにする
const emit = defineEmits(["doEmit"]);
</script>

<template>
  <div>
    <button @click="emit('doEmit')">Child1のメソッドを呼ぶ</button>
  </div>
</template>
```

## おわりに

Vue.jsにまだ慣れていないので、他にもっと良い方法がある気がします、、

もしよければ、コメント欄でご教示いただけますと幸いです。

## 参考

https://code-examples-ja.hateblo.jp/entry/2021/08/04/props%E3%81%AB%E9%96%A2%E6%95%B0%E3%82%92%E6%B8%A1%E3%81%99%E3%81%AE%E3%81%AF_Vue.js_%E3%81%AE%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%A7%E3%81%82%E3%82%8B
CityGMLをGDALで2D GISデータに変換する

# はじめに

国土交通省からオープンデータとして公開された3D都市モデルPLATEAUは、G空間情報センターの[3D都市モデル（Project PLATEAU）ポータルサイト](https://www.geospatial.jp/ckan/dataset/plateau)からダウンロードすることが出来ます。

しかし、G空間情報センターに登録されているデータのフォーマットは CityGMLや3DTiles, MVTがメインとなっており、その他の FBX, OBJ, FGDBといったフォーマットのデータが用意されているのは2020年度に公開された都市だけで、2022年度のデータには用意されていません。

また、PLATEAUの公式サイトに書かれている[CityGMLから各種データ形式へのコンバート](https://www.mlit.go.jp/plateau/learning/tpc04-1/)する方法は、有償のソフトウェアであるFMEを使う方法しか記述されていません。

ここではGISソフトウェアで利用するための2Dのデータフォーマットに変換する方法を説明します。

# QGISのプラグイン

単にQGISにCityGMLデータをインポートするだけであれば[プラグイン](https://plugins.qgis.org/plugins/plateau_plugin/)を使う方法が簡単です。ただしファイルが大量にある場合、対象のファイルやオプションを画面上のUIで一個ずつ設定するのは面倒です。

https://plugins.qgis.org/plugins/plateau_plugin/


# GDALのogr2ogrコマンド

2023年12月時点でGDALは[バージョン3.8.2がリリース](https://gdal.org/download.html#current-release)されており、CityGMLにも対応しています。

2Dでベクター形式のジオデータにフォーマットを変換する場合には [ogr2ogrコマンド](https://gdal.org/programs/ogr2ogr.html)が使えます。例えば、GeoPackageフォーマットに出力する場合には `-g GPKG`を指定します。

```shell
ogr2ogr -f GPKG -t_srs EPSG:4326 xxx.gpkg -s_srs EPSG:6668 xxx.gml -skipfailures
```

上記のコマンドで変換した場合、LoD2の地物を含んだgmlファイルを変換した場合に正しく変換できません。このような場合、変換時にどのレベルのLoD要素のジオメトリを使うかは **GFS_TEMPLATE** オプションで指定することができます。

まず何も指定せずに ogr2ogrコマンドを実行すると自動的に xxx.gfsファイルが作られます。そのファイルを編集して `<GeometryElementPath>lod1Solid</GeometryElementPath>` という行を追加します。

```xxx.gfsの例
<GMLFeatureClassList>
    <GMLFeatureClass>
        <Name>Building</Name>
        <ElementPath>Building</ElementPath>
        <GeometryElementPath>lod1Solid</GeometryElementPath>
    ......
    </GMLFeatureClass>
</GMLFeatureClassList>
```

このファイルを指定することで gmlの中に LoD2の要素が含まれていたとしても、LoD1のジオメトリを使ってファイルを変換することが出来ます。

```shell
ogr2ogr -f GPKG -t_srs EPSG:4326 xxx.gpkg -s_srs EPSG:6668 xxx.gml -skipfailures -oo GFS_TEMPLATE=xxx.gfs
```

※ 詳しい説明はGDALの[GML](https://gdal.org/drivers/vector/gml.html#schema)の説明を参照してください（英語ですが）

https://gdal.org/drivers/vector/gml.html#schema

# 複数ファイルを並列処理する

LinuxやMacOSなどでは xargsコマンドを使うことで引数をコマンドに渡して並列実行させることができます。

1. lsコマンドでワイルドカード(*)を使ってディレクトリ内のgmlファイルを列挙する
1. パイプラインで xargsコマンドにファイル名を渡します。
1. xargsコマンドでは `-n 1`を指定することで引数を一つずつ受け取ります。`-P 4`で実行するプロセスの個数を指定します。CPUのコア数に応じて適当な数値を指定してください。`-I{}`は引数の値を格納するプレースホルダを指定しています。
1. 後ろにある`{}`にはソースとなる gmlファイルのパスが格納されています。その前にある`{}.gpkg`でソースファイルに拡張子.gpkgを追加したファイルを出力先として指定しています。

```shell
ls ./udx/bldg/*.gml | xargs -n 1 -P 4 -I{} ogr2ogr -f GPKG {}.gpkg {} -skipfailures -oo GFS_TEMPLATE=xxx.gfs
```

上記のコマンドを実行すると .gmlファイルと同じディレクトリ内に .gpkgファイルが作られます。複数のファイルを一つにまとめるにはGDALの [ogrmerge.pyコマンド](https://gdal.org/programs/ogrmerge.html)が利用できます。

```shell
ogrmerge.py -f GPKG -o xxx_merged.gpkg ./udx/bldg/*.gpkg
```

# おまけ

GDALの古〜いバージョンでは座標参照系の処理に不具合があり、XYの順番がひっくり返って読み込まれるなど不具合がありました。

https://qiita.com/Yfuruchin/items/aa3a847db26c7f378d6e

この不具合に関してはバージョン3.4.0では解決されています。

https://zenn.dev/mugwort_rc/articles/34a427a9394580
Pythonで家計予算自動配分プログラムを作ってみる（PySimpleGUIを使ったGUI実装※未完成）

# はじめに

　↓の記事で、家計予算自動配分プログラムを作成しました。

　今回の記事では、 **PySimpleGUI** を利用してGUIを実装し、 **よりデザイン性の高いGUIを作る** ためのコードを書きます。

* 通常版

https://qiita.com/awonohata/items/41a8a50acc2a82624225

* Tkinter版

https://qiita.com/awonohata/items/e2797a8e4f8ea5e8ef9d

# Pythonで家計予算自動配分プログラムを作ってみる（PySimpleGUIを使ったGUI実装※未完成）

## PySimpleGUIのドキュメント

https://www.pysimplegui.org/en/latest/

## コード

:::note alert
こちらは未完成のコードです。
テキストボックスとボタンを配置するところまでは辿り着いたのですが、その後のボタンを押して計算を実行するところがまだ実装できていません。
:::

~~~Python
import PySimpleGUI as sg

sg.theme('Light Blue')


layout = [  [sg.Text('お仕事お疲れ様でした！　予算配分をしましょう！')],
            [sg.Text('入力できたらOKを押してください。')],
            [sg.Text('先月の給与を教えてください。   '), sg.InputText()],
            [sg.Text('家賃（月額）を教えてください。'), sg.InputText()],
            [sg.OK(), sg.Cancel()]]

# Create the Window
window = sg.Window('Window Title', layout)
# Event Loop to process "events"
while True:
    event, values = window.read()
    if event in (sg.WIN_CLOSED, 'Cancel'):
        break

window.close()

~~~

## 出力イメージ

* `sg.theme('Light Blue')`の場合

![スクリーンショット 2023-12-25 19.03.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974182/0ce0380a-baff-9927-1869-f0595464d825.png)

* `sg.theme('Dark Blue')`の場合

![スクリーンショット 2023-12-25 19.06.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974182/edf2d84f-aede-5b2d-eee4-dbb61f3e2a73.png)


# まとめ

　『Python2年生』で「デザイン性の高いライブラリ」と紹介されているだけあって、TKinterとはまた違った出力になって面白かったです！ 色変えが簡単なのも面白いですね。

 あとは、テキストとテキストボックスの配置が、Tkinterと比べてとても楽でした😊
 細かい位置調整が必要になるとまた違ってくるんでしょうけど…🤔

　OKを押す→計算結果を表示まで実装できるように、Tkinterと一緒にコード考えてみます！

## 参考リンク

https://qiita.com/ku_a_i/items/20004800adc78fa94a0b
組織とアーキテクチャの話

# 自己紹介
はじめまして。JINSのITデジタル部（いわゆる情報システム部門）でシニアディレクターをしている布袋 @hotaken といいます。

# はじめに
皆さんは「コンウェイの法則」を知っていますか？

最近ホットなGoogle Bardに聞いてみました。

![スクリーンショット 2023-12-25 16.30.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631446/748ee2fc-7b5b-4b14-2a59-38eeb4834707.png)

```
・部門ごとに分割された組織では、モジュール化されたシステムが設計される。
・機能ごとに分割された組織では、機能指向のシステムが設計される。
・チーム間のコミュニケーションが制限されている組織では、疎結合なシステムが設計される。
````

上記は一例ですが、要するに「組織の形がアーキテクチャに影響を与える」という法則です。

組織の分け方はいろいろとありますが、大きく2つのタイプがあります。

1. 職能型組織（タテ）
2. 機能型組織（ヨコ）

1はプロダクトやサービスなど、機能／Featureごとに組織を分ける形、2はアプリ、インフラ、データなど専門性ごとに組織を分ける形です。

![team_structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631446/aaf02075-bf12-b826-bcb5-871460d466af.png)

※わかりやすさのためにものすごく抽象的に描いてます！

# ちょっと前のJINSのIT組織
私が入社した5年くらい前、名称はそこまでストレートではなかったものの、IT部門はどちらかというと職能型組織で、実態としては左のような「アプリ」「インフラ」「データ」など、ITの専門性の近いメンバーでチームを構成していました。

ところがVUCAの時代が始まり、クラウドがどんどん進化していくに伴って、プロダクトやサービスの開発にスピードやアジリティが求められるようになります。

職能型組織は専門性の境界に合わせてタテに疎結合なアーキテクチャになります。
特定のプロダクトやサービスがアジリティを高めようとしても、変更の影響がヨコに波及してしまうため思うようにスピードが出ず、外注やコストをかけて無理やりスピードを出そうとするとますますヨコに広がりが出てしまう、というジレンマを抱えてしまいます。

そしてもう1つの課題が、人材育成です。
内製チームをいくつも抱えてプロダクトやサービスの開発をしている大きな会社ならいいのですが、ジンズのようにまだそこまでIT部門の規模が大きくなく、比較的若いメンバーが活躍している会社ではスキルの広がりが専門性にロックされてしまうことも将来を見据えたときにボトルネックになる可能性があります。


# タテからヨコへの変換
いろいろと思考を重ねた結果、昨年IT部門をタテからヨコに変えることを決めました。

ただ、組織の形をタテからヨコにしただけではもちろん何も変わりません。
アーキテクチャをタテからヨコに変えていくことも必要ですし、仕事のやり方、人もタテからヨコに変えていく必要があります。

過渡期をうまく乗り越えるために、職能型組織を一部「エンジニアチーム」として残しています。
ここにはアプリ、データ、クラウド、ネットワークなど、様々な専門性を持ったメンバーが所属しており、各プロダクトやサービスの開発プロジェクトに横断的に参画する、という動き方をしてもらっています。

![team_structure_jins.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631446/c10af92b-3ed9-a132-cfcb-ee7c7f8a4d2c.png)


他のチームメンバーの専門性の広がりをサポートすることはもちろん、自分自身もプロダクトやサービスの理解を深めることでお互いがタテにストレッチする楔になってくれています。

# まとめ
いろいろと書きましたが、人はもちろん、組織は生き物なので思い描いた通りに機能するかどうかはわかりませんし、過渡期ということもあり、日々いろいろな課題が出てきています。
悩みながら、学びながら、でも本質的なポイントはブレずに進んで行こうと思っているので、また何か気づきがあれば記事を書きたいと思います。
Git rebase操作・vimコマンドについて

gitでコミットをまとめる際に、リベースを行うことはよくあると思う。

GitBashであれば、その際にVimで編集することになるので
その際に利用するvimコマンドもまとめておこうと思う

## 練習
まずは適当なコミットを用意して、それをリベースしてみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565426/9eaa19a1-99e3-70e3-d830-75f16cd24aca.png)

この例であれば、`53707c2`のコミットに対してリベースを行ってみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565426/ea63a5f3-e5b9-9a7b-1ef3-b2f57b9e8b27.png)

## リベースを実行
リベースを実行すると、以下のようにvim操作画面になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565426/b3443cd6-632b-1525-e89d-1961197b3c8f.png)

`yy`でフォーカスされている行のコピーを行う。

今回であれば`pick da7522e...`の行をコピーする。
vimコマンドを実行しても、コピーできているかは視覚的には分からない。

`p`でコピーした行のペーストをフォーカスしている行に対して行う。

これらを実行すると以下のように、ペーストが行える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565426/bd869c1c-5cc5-0d40-d7cb-74b2593af29c.png)

削除をするときはINSERTモード（編集）で削除するか、`dd`コマンドで切り取って削除する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565426/b99c94e6-ad3e-c8ee-8259-ccf23af7030f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565426/1049ddc5-33fa-9fd0-4555-47f86b1fb5fb.png)

`i`でINSERTモード（要は編集）になり、ここで内容の削除・追加などが行える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565426/7a48898a-6f11-c972-1291-da2e3cf07916.png)


当たり前だが、ここはキーボード操作になるのでvimコマンドは使えない。

vimコマンドを使いたい場合はESCキーを押下して、INSERTモードから抜ける。

## リベースによるコミットの扱いを変える

リベースの操作は、画面に表示されている通り。
これはvimの操作ではなく、gitのrebaseコマンド特有の操作である。

‌
実は他にも表示されるコマンドはあるが、使うことはほぼない。
使う機会が出てきたらまとめようと思う。

```
p, pick → コミットをそのまま利用する。
r, reword → コミットはそのまま使うが、コミットメッセージは修正する
s, squash → コミットは利用せず、前のコミットに結合する
f, fixup → コミットを利用せず、そのコミットメッセージは消える
```

## リベースによるコミット順番の操作
一応、コピー・ペースト・削除をつかうことで、コミットの順番を変えることができる。

しかし、コミットタイミングを変えたことで高確率で競合が発生してしまうので、あまりお勧めはしない。

そうならないようにコミットメッセージは分かりやすくする。

もしくは、順番を変えるまでする必要のあるわけのわからないコミットは入れないようにした方が良い。
Kor - Kubernetes Orphaned Resources Finder を使って利用されてないKubernetesリソースをあぶり出す

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

Kubernetesを使っていて、リソースのゴミが残ることはありませんか？

- デプロイしようとして途中で止めたHelmチャート
- デプロイしたけど動かなくて削除したdeployment
- 忘れ去られたCRD
- 使わなくなったJob

こういったお化けリソースを見つけるのが、今回ご紹介するKorです。

yonahd/kor: A Golang Tool to discover unused Kubernetes Resources
https://github.com/yonahd/kor

# 1. Kor のインストール

インストールはbrewを使ってインストールするのが便利です。

```
brew install kor
```

# 2. 使い方

KUBECONFIGが読める状態にしておいて、

```
kor all
```
で現在利用されていない各種リソースが出力されます。

自動的に削除するオプションもあります

```
kor all --delete
```

しかし、「ヒャッハー、大掃除だぜー」と上記の --deleteを付けて気軽に実行しない方がいいでしょう。

kor allで出てくるのは殆どが、ConfigMap,Secret,Role,CRD,Jobだと思います。

RoleやCRDは現在使われていなくても使われる可能性がありますし、ConfigMapやSecretもこれらを使うDeploymentがデプロイされるかもしれませんし、たまたまノードが落ちていて利用されていないリソースなのかもしれません。

よって、Korを使う場合にもこんな使われてないリソースがあるのねー、と眺めるぐらいにしておきましょう。もしくは、削除する前にバックアップを取得しましょう。
baserCMS BurgerEditorプラグインのオリジナルブロックを再帰的に利用する方法

## BurgerEditorとは
[BurgerEditor](https://market.basercms.net/products/detail.php?product_id=66)とは、[baserCMS](https://basercms.net/)のコンテンツ編集エリアを積み上げ式のブロック編集型に変更できるプラグインです。
デフォルトでレスポンシブデザインにも対応しているため、グリッドデザインのページなどが管理画面から簡単に生成できるエディターです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553367/1a2d4408-f2ec-eaba-0984-762cbf8a4320.png)

こちらのBurgerEditorの有償版は、オリジナルブロックを追加する機能がついており、
サイトに合った専用ブロックや、何度も使うような特定リンクボタンなどをオリジナルブロックにして編集エリアに呼び出すことが可能になります。

ただ、app/Plugin/BurgerEditor/ フォルダ配下に直接オリジナルブロックを追加してしまうと、BurgerEditor本体のセキュリティアップデートを行ったときに、誤って消してしまったりするおそれがあります。
また、他のサイトで同じブロックを使いたいときにも、該当ファイルを選んでコピーする必要があり、結構面倒です。

実はあまり知られていないのですが、
2020年夏頃から、外部プラグインから Addon の参照先を追加できるような機能が追加されました。
こちらの機能を使うことで、BurgerEditorとオリジナルブロックを切り離すことができるようになり、BurgerEditor本体のアップデートなどを行った際にまるごと入れ替えてアップデートしたり、オリジナルブロックを他のサイトのBurgerEditorで使用することがより簡単になりました。
（一部 Config.setting（_customize）.phpの記述だけは必要になります）

README.md には

> ## 外部プラグインでブロックやタイプを追加する
> 
> 外部プラグインを作成し、直下に `BurgerAddon` をいう名称でフォルダを作ると、BurgerEditor のアドオン用のディレクトリとして認識させることができます。
> 追加したブロックを、 `/BurgerAddon/block/category.php` に定義するとエディタで読み込むことができます。

といった記述が追加されておりますが、ちょっとわかりにくいかもしれないので、実際にやってみました。

## 1,案件専用プラグインなどを作成
app/Plugin/ 配下にBurgerEditorオリジナルブロック用のプラグインを作成します。
今回の場合、わかりやすいようにBurgerAddon という名前の新規プラグインを作成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553367/17cbae49-fddb-5af0-746f-ca024565e40f.png)

※後でなんのプラグインか分からなくならないようにconfig.phpに機能の説明も書いておくと良いかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553367/413a95a5-ee14-44d8-c4a4-ef31295f1330.png)
```php:config.php
<?php
/**
 * [BurgerAddon] config
 *
 */
$title = 'BurgerEditor案件専用オリジナルブロック';
$description = 'BurgerEditor案件専用オリジナルブロックを管理するプラグインです。';
$author = '';
$url = '';
```
## 2,下記の様にディレクトリを作成
```
/app/Plugin/BurgerAddon/BurgerAddon/block/
/app/Plugin/BurgerAddon/BurgerAddon/type/ （オリジナルtypeを使わない場合不要）
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553367/80da7069-9ea8-805a-42bf-6d69b3cec486.png)

## 3,category.phpの作成

記述内容
```php:/app/Plugin/BurgerAddon/BurgerAddon/block/category.php
<?php 
$bgCategory = array(
	'オリジナルカテゴリー' => array(
		'｛追加したいブロックのname｝' => '{追加したいブロックの表示名}',
	),
);
```
## 4,オリジナルブロックの追加
```
/app/Plugin/BurgerAddon/BurgerAddon/block/｛追加したいブロックのname｝/
```
の中に
```
panel.svg
index.php
style.css
```
を配置
## 5,setting_customize.phpのenableAddonPluginの設定
```
/app/Plugin/BurgerEditor/Config/setting_customize.php
```
の下の方の

```
'enableAddonPlugin' => array()
```
を
```
'enableAddonPlugin' => array('BurgerAddon')
```
に修正

:::note warn
注意
このファイルだけは、アップデートしたりするときに再設定が必要になることがあります。
:::



## 6,管理画面よりプラグインを有効化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553367/e59717ea-6bb9-894d-36ab-78febb6501e7.png)

以上で完成となります。

## 完成形

![block.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553367/e204c5f5-3571-38d5-a511-7dbae867c0ee.jpeg)

:::note info
因みに、追加されたカテゴリーやブロックは、一番最後（下）に追加されます。 
:::
Open Interpreterを使ってデータ分析をしてみた（Azure OpenAI使用）

## はじめに
Open Interpreterを使ってデータ分析をしてみました。

## 環境
- Python 3.11.5
- Open Interpreter
- Azure OpenAI


## 実装
### 必要なライブラリのインストール
```terminal
pip install open-interpreter
```

### 使用データセット
今回使用したcsvファイルは[こちら](https://gist.github.com/sarchak/b87ad2be315ce05f7a047550646f3c41)のdiamonsデータセットというものです。

### Pythonファイルの実行

Open Interpreterとの会話を始めます。環境変数はご自身の環境に合わせてください。
```test.py
import interpreter
import os

os.environ['AZURE_API_KEY'] = "キーを指定"
os.environ['AZURE_API_BASE'] = "エンドポイントを指定"
os.environ['AZURE_API_VERSION'] = "2023-07-01-preview"

# gpt-4はデプロイ名
interpreter.model = "azure/gpt-4"
interpreter.chat()
```
　　
上記のファイルを実行し、以下のコマンドを入力してください。

```terminal
次のCSVファイルを解析してください。ファイルは"（diamonds.csvのパスを指定）"にあります。 基本統計表を出し てください。コード生成でエラー が出ないように注意してください。
```


上記のコマンドを入力していくと、会話が始まります。
コードを実行するか確認のために「y or n」を適宜入力していきます。
私の場合は実行結果が以下のようになりました。

```terminal
  carat         depth  ...             y             z
  count  53940.000000  53940.000000  ...  53940.000000  53940.000000
  mean       0.797940     61.749405  ...      5.734526      3.538734
  std        0.474011      1.432621  ...      1.142135      0.705699
  min        0.200000     43.000000  ...      0.000000      0.000000
  25%        0.400000     61.000000  ...      4.720000      2.910000
  50%        0.700000     61.800000  ...      5.710000      3.530000
  75%        1.040000     62.500000  ...      6.540000      4.040000
  max        5.010000     79.000000  ...     58.900000     31.800000
  [8 rows x 7 columns]


  以下は、"diamonds.csv"ファイルの基本的な統計情報です：



            carat   depth   table   price   x       y       z
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    count   53940   53940   53940   53940   53940   53940   53940
    mean    0.798   61.75   57.46   3933    5.73    5.73    3.54
    std     0.474   1.43    2.23    3989    1.12    1.14    0.71
    min     0.2     43      43      326     0       0       0
    25%     0.4     61      56      950     4.71    4.72    2.91
    50%     0.7     61.8    57      2401    5.7     5.71    3.53
    75%     1.04    62.5    59      5324    6.54    6.54    4.04
    max     5.01    79      95      18823   10.74   58.9    31.8


  これらの統計情報は、各列のカウント、平均、標準偏差、最小値、25パーセンタイル、中央値（50パーセンタイル）、75パーセン
  タイル、最大値を示しています。
```
基本的な統計情報が表で返ってきましたね。


　　
次は以下のコマンドを入力してみます。
```
 次のCSVファイルを解析してください。ファイルは"C:\\Users\\admin\\Downloads\\diamonds.csv"にあります。 "cut"の分布を円グラフにしてください。コード生成でエラー が出ないように注意してください。
```
　　
最終的な結果は以下のとおりです。
```terminal
 cut
  Ideal        39.953652
  Premium      25.567297
  Very Good    22.398962
  Good          9.095291
  Fair          2.984798
  Name: count, dtype: float64


  "cut"列の値の分布のパーセンテージは次のとおりです：

   • Ideal: 39.95%
   • Premium: 25.57%
   • Very Good: 22.40%
   • Good: 9.10%
   • Fair: 2.98%

  これらの値は、"cut"の分布を表す円グラフの各セクションの大きさを決定します。ただし、このプラットフォームではグラ
  フィカルな出力を表示することができないため、このテキスト形式の出力を使用してください。
```

円グラフまではプロットしてくれませんでしたね。
　　
## おわりに
お疲れ様でした！

参考文献は以下のとおりです。

https://qiita.com/hiromitsu_iwasaki/items/ef0f302d87e240d9f880

https://qiita.com/ot12/items/d2672144b914cb6f252f

https://qiita.com/marimo0825/items/be49c9fc1a22b7ae69b4
サーバレスSQLを利用しPower BIと接続する

## はじめに
今年の下半期に東京リージョンでもDatabrikcs上でサーバレスSQLが利用できるようになりました。
従来のSQLウェアハウスに比べて管理や起動速度の面でメリットが非常に多いと感じています。
業務の中ではPowerBIと接続するパターンが多いのでこちらについてご共有します。
## 利用サンプルデータの作成
サンプルデータを作成します。今回は昨日行われた某コンテストのデータを可視化してみます。
```python
#データフレームを作成
df_m = spark.createDataFrame([
    (90, 94, 94, 93, 94, 91, 92),
    (88, 91, 92, 90, 91, 88, 87),
    (89, 94, 96, 93, 95, 94, 98),
    (88, 92, 95, 89, 88, 89, 94),
    (91, 92, 92, 92, 96, 90, 92), 
    (93, 93, 96, 93, 97, 91, 93),
    (92, 91, 91, 91, 93, 95, 90),
    (87, 89, 90, 91, 92, 89, 93),
    (86, 90, 89, 90, 89, 87, 89),
    (91, 91, 93, 91, 90, 89, 87)
], ["HM", "RN", "TU", "NH", "TT", "DH", "KY"])

#テーブルとして保存
df_m.write.format('delta').saveAsTable("dataframe_M")
```
## サーバレスSQLの作成
以下の画像のように設定していきます。
1.エンドポイントの名前について設定します。
2.クラスターサイズを設定します。クォータ制限等によっては大きいサイズのものが選択不可になっている場合があります。ここではSサイズを選択します。
3.自動停止時間を選択します。サーバレスSQLは起動時間が数十秒なので、こまめに自動停止する方がコストも抑えられて良いかと思います。
4.スケーリングを選択します。
5.タイプを選択します。ここではサーバレスを選択します。
上記を埋めたら作成を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699921/d10c7ef7-d4bb-b478-befc-4483ca87f1b2.png)

下記のようになっていれば問題ないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699921/2c744a87-27d3-b135-a2cb-a7d96dc342e9.png)

利用するSQLウェアハウスを選択し、接続の詳細から情報を取得します。こちらについてはのちほど使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699921/8be65d71-f77d-dff4-fb8f-884e56b9a1ac.png)

## Power BIとの接続
ではサーバレスSQLを用いてデータを取得していきます。
PowerBIデスクトップを開き、データの取得を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699921/4c2a34ac-56b7-2f3b-4763-614386fad935.png)

[Azure]→[Azure Databricks]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699921/736a09b9-2d7e-717e-a23f-d5093a893473.png)

選択するとAzure Databricksへの接続情報を入力することになるので、先程取得した[サーバーのホスト名]と[HTTPパス]を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699921/f7dd7182-0913-f46a-d558-63e10450b8d4.png)

接続ができたら、ナビゲーター画面より利用するテーブルを選択し、読み込みを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699921/5615772a-b1fc-ff84-7f40-a5533407d720.png)

選択すると十数秒程度でデータが読み込まれるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699921/5d05614c-4a92-db8b-de68-3b46588fca52.png)

読み込めたので、PowerQueryを使って標準偏差を出してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699921/d92e0aa7-e909-1042-73dc-6b5e5dcb98f5.png)

これを見ると非常にKYさんは点数のばらつきが多いことや、NHさんは点数に差をつけられなかったことがわかります。

## 最後に
またナレッジコミュニケーションでは[Musubite](https://musubite-job.com/)というエンジニア同士のカジュアルトークサービスを利用しています！この記事にあるような生成 AI 技術を使ったプロジェクトに携わるメンバーと直接話せるサービスですので興味がある方は是非利用を検討してください！
Orchestrator サーバー証明書の期限切れにご注意を！（オンプレをお使いの方）

Merry Christmas!

ということで、年の瀬も迫ってまいりました！

皆様のOrchestratorが、年末年始も正常稼働して至急対応で開ける信念にならないためにも、いくつか注意しなくてはいけないことがあります。

・来年度の非稼働日の入力？

それも大事ですが、Orchestratorが突然止まらないために、年を超す前に今一度、サーバー証明書の期限が切れていないかお確かめになってから、年越しそばをすすりましょう！

さて、確認も終わりましたね！

そこで、年内に証明書の期限が切れてしまう方、期限は来年だけれどももうすぐ切れてしまう皆様！

証明書の発行を急いで行いましょう！！！

そして、新しい証明書をサーバーへインストール＆バインド完了！


ふぅ…これで、一安心…



では、ありません！！！


もし、あなたのOrchestratorのバージョンが<b>v2020.4以降</b>でしたら、証明書を差し替えるだけなんて甘い対応ですと、年始にはプロセスが止まりまくってることでしょう！

Orchestrator v2020.4以降からはではHTTPS化に加えて、Orchestratorに内包されるIdentity Serverと呼ばれる認証・認可を行うサービスがアクセストークンを発行するために使用されています。

以前、職場で「あ、TestSuiteって新しい機能いれたから、Identity　Serverの証明書設定が必要です！」とこじつけ的な言い訳を聞きましたが、( ﾟДﾟ)ﾊｧ?と内心思ったものです…。が…、違います！
新しい機能云々関係なくv2020.4以降では上記の理由で、Identity Server側での設定も必要になってきます！（詳しい構造に関しては公式にて！）


では、その設定方法です！
<h4>IISマネージャーでの設定</h4>
まず、証明書の有効期限の確認方法はご存知ということでお話をすすめさせていただきます。

新しい証明書をインストール＆バインドしましたら、IISマネージャーを開き"UiPath Orchestrator" サイトを選択ます。

１左側の縦のメニューから①バインド > ②https 編集 > サイトバインドの編集 画面にて SSL証明書の ③[表示] をクリックし、証明書の詳細タブにて新しい証明書の拇印を確認＆メモ帳にコピーします（ここで、証明書の有効期限も確認できます）

（あとで画像張りますね…(｡-人-｡) ｺﾞﾒﾝﾈ）

確認がおわりましたら、サイトバインドの編集 画面に戻ります！

SSL証明書のドロップダウンメニューより「新しい証明書」を選択し、OKをクリックします。

<h4>ppsettings.Production.jsonの編集</h4>
次に先ほどコピーした新しい証明書の拇印ですが、たぶん小文字のままでもいけるのですが、「appsettings.Production.json」の書式を見ると大文字なので、拇印の小文字を大文字に置き換えます。

先ほどちらっと「appsettings.Production.json」と言いましたが、次の作業は下記のファイル内の作業になります。

 C:\Program Files (x86)\UiPath\Orchestrator\Identity\appsettings.Production.json

 このファイル内にAppSettingsという大項目内のSigningCredentialSettings内のStoreLocationにあるNameが古い証明書の拇印になっていると思います。

この古い証明書の拇印を消し、先ほどコピーして大文字に置き換えた新しい証明書上書きしてファイルを保存します。

<h4>証明書へのアクセス許可を設定</h4>
ウィンドウズ検索より証明書ストアを検索して開きます。（ファイルを指定して実行で開く場合は「certlm.msc」とタイプ）

新しい証明書を右クリックし、秘密キーの管理をクリックします。

証明書のアクセス許可画面にて「追加」をクリックします。

Orchestratorホストがドメイン参加している場合「場所」をクリックして「ローカルコンピューター」を選択します。オブジェクト名に<b>IIS_IUSRS</b>を指定し「名前を確認」をクリックします。 

上記完了しましたら、OKをクリックします。

※IIS_IUSRS にはフルコントロールのアクセス権が付与してあることもかくにんしてください！

<h4>やっぱりお世話になりますPowershellコンソール</h4>
管理者権限PowerShellコンソールにて iisresetを実行しIISを再起動します。

<h4>良いお年を！</h4>
ここまでの、設定を終えて証明書の入れ替えが完了になります！

それでは皆様、来年も良いAutomation Lifeをお送りくださいませ！

<h3>A Happy Automation Year!</h3>
PHPで名前のマスキングをする

# 環境
- php:8.1

# 対象
- 名前のマスキングをしたい人


# 対応
今回は以下のような関数を作りました
```php:Controller.php
    private function nameMasking(string $value)
    {
        // 正規表現を使用して文字列から空白（半角スペースと全角スペース）を取り除く（名前と苗字にスペースがあると綺麗にマスキングされないため）
        $stringValue  = preg_replace("/( |　)/", "", $value);
        // 文字列を配列化
        $arr = mb_str_split($stringValue);
        $itemCount = 1;
        $replaceValue = '';
        foreach ($arr as $item) {
            if ($itemCount % 2 === 0) {
                // 偶数文字目だったら●に置き換え
                $replaceValue = $replaceValue . '●';
            } else {
                // 奇数文字目だったらそのまま
                $replaceValue = $replaceValue . $item;
            }
            $itemCount++;
        }

        return $replaceValue;
    }
```
応用情報技術者試験 午後対策時のメモなど(R5春期)

# はじめに
R5春期の応用情報技術者試験に合格出来ましたので、午後試験に関して行った対策法などについてまとめてみます。
[試験全体などの所感](https://qiita.com/TKY_study/items/5b04dcd68a3b5ca4f0a1)、[午前問題](https://qiita.com/TKY_study/items/2d40b091beca9c5d4c07)に関しては別記事に記載を行っています。

# 午後試験について行った対策など
実際に行った対策などについてまとめます
## 自身の結果など
72点という結果となり、以下の問題を選択しました
- 問１	情報セキュリティ
- 問４	システムアーキテクチャ
- 問７	組込みシステム開発
- 問８	情報システム開発
- 問１０	サービスマネジメント
## 利用した教材など
学習にあたっては以下の教材を利用しました
- IPA公式が配布している過去問題
- 応用情報技術者試験ドットコム 過去問道場(午後)
- Udemy講座(石田先生 応用情報午後)

## 学習法など
学習については以下の様な順序で進めました
### 1. 石田先生のUdemy講座を見る
**個人的に決め手となった教材**で非常に分かりやすい説明で以下のような要素について効率よく学ぶことが出来ます。
地力のある方であればこれだけでの合格も普通にあるのではないかと感じます。
- 選択問題でどれを選ぶべきか？
    - 午後試験では必答の情報セキュリティに加えて、残りの10分野から4つの設問を選択するという形式です。しかし、年度ごとの問題難易度のバラつき等がある為、保険の意味で6~7分野程度勉強をしておくことが望ましいです。そういった戦略立てやアタリを付けるにあたって有益な情報が得られます。
- 各選択分野の解答にあたって必要な知識
    - 例えばネットワークであればパケットトレーサーを利用した実例等に基づいて解説が行われているなど、文字だけの説明に比べて非常に頭に入ってきやすいと感じました。
- 各選択分野の代表的な過去問題の解法
    - 問題の年度を軸にするのではなく、知識分野を軸に過去問題のピックアップ及び解説が行われているため(例えばデータベースであればキー/正規化/SQLなど)、偏りなく効率的な学習を進める事が出来ます。

### 2. 過去問道場にて選択候補の過去問を実際に解く
「解説を聞いて理解できる」と「実際に問題が解ける」の間にはやはり壁が有りますので、実際に問題演習を行ってアウトプット重視の学習に移行していきます。
- 利便性を重視して過去問道場(午後)を利用します。個人的に感じた利点は以下の通りです。
    - 情報端末があればどこでもできます
    - 画面の隅に30分間のタイマー(制限時間)が表示される
    - 学習状況が管理しやすい
    - なんと全問題に解説が付いています。 
- 必答の情報セキュリティは直近10回分実施
- アタリを付けた他の6分野について直近5回分実施
### 3. 過去問題を印刷して解く
過去問題を実際に印刷して幾つか解いてみます。自分は以下のような気付きを得られましたので、個人的に行うべきフェーズかと感じました。
- 役所に行った際などにしか筆記を行わないため、単純に「非常に文字が書きづらい」(;´༎ຶД༎ຶ`)
- マウスホイールでの快適スクロールと、紙をめくりながらの解答では取り回し等が中々変わってくる
- 「キーボードでちょっと消して書くを繰り返して答案を練る」といった無意識に行っていたスタイルが紙では難しい
### 4. 当日と同じタイムスケジュールで午前午後通しで印刷して解く
過去問題を1年分印刷して、起床時間も合わせて本番と同じタイムスケジュールで解いてみます。自分は以下のような気付きが得られましたので、実行するコストは高いのですが可能であれば行うべきフェーズかと感じました。
- 想像以上に疲労が激しい
    - 午前試験を終えた後に、150分間/5問の連戦となるため、後半は集中力の維持すら難しくなってきます。
        - 疲弊している状態でも6割に載せて、時間配分も間に合わせる必要が有るという意味で、過去問演習を暫くした後の「もう行けるんじゃね？」的な状態から更に学習を積む動機となりました。
        - 午前問題を余り考えこまずに突破/早期退出出来る程度に鍛えておくことも疲労対策といった観点では大きいです。
- 前日の過ごし方も重要
    - 当日は朝から夕方までの戦いとなりますので、先ほどの疲労と関連して以下のような要素も重要になってくると感じました。
        - 前日しっかり眠れているか？
        - 前日夜の食事が重すぎたりしないか？
        - 生活リズムが狂っていないか？
- 甘いものが有るととても良い
    - 頭を使う際には糖分が良いとは随所で言われている気がしますが真理であると感じました。午前試験終了後の休み時間にラムネなどを摂取すると良いかもです。
- **~~ハルンケア最強卍~~**
    - ※医薬品ですのでもし試される場合は十分ご注意ください
        - 健康面は勿論ですが、間違ってもぶっつけ本番で試す事の無いように... 
    - 午前(早めに解き終えて途中退出設定)が終わった直後に服用すると、午後試験の2時間半くらいの間であれば面白いぐらい尿意が襲ってこなくなります。
        - ~~まさか20代後半で愛用する事になるとは~~ 
        - 個人的に飛行機に乗る前などの必須アイテムとなっています。 
        - ~~プラセボ説も濃厚ですが、尿意が来ないならもはや何でもいい~~

## 当日の過ごし方など
先ほどの4.と殆ど共通となりましたが、以下のような点に差異が感じられました
- 自宅とは異なりトイレ待ちの概念がある
    - もし行きたいのに行けなかったといった状態になってしまうと悲惨かと思いますので、お手洗いに関しては余裕を持ちすぎるくらいでちょうど良いかと思いました。
- 試験会場の机が家の物よりも狭い
    - 自宅では筆記用具や問題用紙などを卓上に好きに広げて実施していましたが、本番では少しこじんまりとした感じ(?)で実施する必要が有りました。 
- 紙をめくる音や鉛筆の音が一斉に響き渡るので意外と賑やか
    - 性質上問題用紙をめくりまくる必要が有る＋筆記式ですので、会場内は結構賑やかな状態となります
        - 自宅等の静かな環境で対策を行っている + 特に音が気になるタイプの方であれば注意点かもしれません

# おわりに
実際に挑戦を行ってみたところ、対策から当日まで結構な労力を要する一大イベントであると感じました。
記憶が薄れてしまう前にとまとめてみたこの記事の、どこか一文だけでも参考になりましたら幸いです。

# 参考にさせて頂いた記事など
https://www.ipa.go.jp/shiken/kubun/ap.html 

https://www.ap-siken.com/ 

https://www.udemy.com/course/ouyou_pm/

https://www.taiho.co.jp/chc/product/harncare/granule/
応用情報技術者試験 午前対策時のメモなど(R5春期)

# はじめに
R5春期の応用情報技術者試験に合格出来ましたので、午前試験に関して行った対策法などについてまとめてみます。
[試験全体などの所感](https://qiita.com/TKY_study/items/5b04dcd68a3b5ca4f0a1)、[午後問題](https://qiita.com/TKY_study/items/eda5886dc77d1c63e48c)に関しては別記事に記載を行っています。

# 午前試験について行った対策など
実際に行った対策などについてまとめます

## 自身の結果など
81.25点という結果となり、内訳は以下の通りでした
- ストラテジ系	21.25点（85%）（満点25.00点）
- マネジメント系	8.75点（70%）（満点12.50点）
- テクノロジ系	51.25点（82%）（満点62.50点）

## 利用した教材など
学習にあたっては以下の教材を利用しました
- IPA公式が配布している過去問題
- 応用情報技術者試験ドットコム 過去問道場(午前)
- Udemy講座(石田先生 応用情報午前)

## 学習法など
学習については以下の様な順序で進めました
### 1. 石田先生のUdemy講座を見る
- 午前試験の内容を効率良く体系的に学ぶことが出来、後の過去問周回時の効率も向上すると感じられますので最初に1周見ておくことをオススメしたいです。
- しかし以下のような方であれば必ずしも必要でないかもしれません(**※午後講座は必見**)
    - 過去問道場を試しに解いてみて正答率が5割程度以上出る~~強者~~
    - 過去問道場での正答率が低くとも苦しいとあまり感じない

### 2. ひたすら過去問道場を回す
午前試験特有の対策としてはこちらに尽きると感じています。というのも以下のような性質があるためです。
- 過去問題からの流用が非常に多く、良くわからず暗記しているだけでも一定の得点源として機能する(してしまう？)ほどである
    - 過去問題を見ておくことが純粋な問題演習＋暗記の2重の意味で有用
- 午後試験の対策を進めて行く過程で午前も補強されていく

午前試験の突破自体は正答率6割で可能ですし、合否判定において午前/午後は分離されているため過剰な対策をするよりも午後試験対策に充てた方が良いです。(午後試験は**午前通過者の約半数が脱落する難関**です)
しかし、午前試験で途中退出が出来るとその分午後試験が楽になるという性質が有りますので、可能であれば以下のような水準で仕上げると良いかと感じました。
- 過去問題の正答率85％以上
- 問題文・選択肢になんだか見覚えがあり、見た瞬間に答えが分かるといった現象が結構な確率で発生する

### 3. 当日と同じタイムスケジュールで午前午後通しで印刷して解く
こちらに関しては午後試験対策としての性質が強いため、そちらの記事にまとめています。
午前試験特有の点としては、午前試験は可能であれば時間を余らせての途中退出を狙いたいという点が上げられます。と言いますのも当日は1日を通した疲労・集中力との闘いとなり、午後に向けて力を温存出来ると有利に働くためです。

## 当日の過ごし方など
こちらも午後の記事の内容と共通となっていますが、可能であれば以下のような点を狙っていきます。
- 午後試験に備えて途中退出を狙う
- 合格が確信できるような状態に到達したらそれ以上の見直し、特に複雑な計算問題の検算等は深追いしない
    - ※落ちてしまっては元も子もない為、間違ってもギリギリを攻めないように
- ~~**午前終了後にハルンケアを飲む**~~
    - ~~詳しくは午後試験で~~ 

# おわりに
記憶が薄れてしまう前にとまとめてみたこの記事の、どこか一文だけでも参考になりましたら幸いです。

# 参考にさせて頂いた記事など
https://www.ipa.go.jp/shiken/kubun/ap.html 

https://www.ap-siken.com/ 

https://www.udemy.com/course/ouyou_joho/ 

https://www.taiho.co.jp/chc/product/harncare/granule/
応用情報技術者試験に挑戦してみた (R5春期)

## はじめに
令和5年春期開催(2023/4/16)の応用情報技術者試験に挑戦し、合格出来ました！
誰かのお役に立てばと思い、記憶が薄れる前に雑記として情報を残そうと思います

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617151/d673bcd5-c23b-3d80-a23d-d732295e5d47.png)

## 何故受けようと思ったのか？
- ~~学生時代に挑んだものの散ったという過去を持つため~~
- 実務経験だけでは学べない部分を浅く広く補強できると考えたため
    - 自分はIT業界内の1企業の1開発者にすぎぬ...という訳で、自分の経験や知見の偏りについて知りたい、また欠けている部分を補強したいと考えました
- 社内の営業さんの実感として、応用情報持ちが居ることで特に官公庁系案件の入札にて有利に働いているというものがある
    - 持っているだけで案件獲得に寄与できるならお得だと考えました

## 学習開始時のレベル感など
- 組み込み系の学部を卒業していました...が実務で使わない部分の記憶はかなり薄れてしまっている状況でした
- Rails/AWSを利用した案件開発を4年ほど行っていました
  - 開発周りでは一定の知見がある反面、ネットワーク周りなどは社内のSRE/インフラ管理部署に頼り切りで良く分からないといった状況でした。
- IPA資格に関しては学生時代に基本情報を取得しており、応用情報も一度受けたことがあるのですが午後が2点足らずに散ってしまいました😢


## 学習面について
- 学習ペースに関しては以下のような形で行っておりました
    - 期間:1月に試験申し込みを行ってからの約3か月間
    - 累計学習時間: 約80時間
    - 1日あたりの学習時間：(時間を取れるタイミングで)平日2h、休日4h

- 詳細な勉強法や意識していた点に関しては長くなりそうだと感じた為、
[午前対策](https://qiita.com/TKY_study/items/2d40b091beca9c5d4c07)/[午後対策](https://qiita.com/TKY_study/items/eda5886dc77d1c63e48c)別に記事に分割しております。

## 得られた学び・感想など
- 実務経験では得られない部分の知見を得られることを期待していたのですが、個人的には本当に期待通りの内容でした
- すぐには役立たなくとも「視野が広がった」と感じられる場面が多かった
    - 概要レベルだけでもネットワーク等について把握しておくことにより、インフラ/SRE部の方々との意思疎通が円滑になったと感じます 
    - 開発中の分からんけど多分〇〇なんじゃないですかね～みたいな場面での精度が目に見えて高くなった(？)
- 学生時代に散った時に比べて情報理論といった基礎理論周りの問題は少し解きづらくなっていたが、その代わり実務関連の設問が圧倒的に解きやすくなっていて驚いた
    - 長い目で見れば強くなっているのだと実感できて嬉しかったです
- 案件獲得に寄与出来たら嬉しい

## おわりに
IT関連を取り巻く幅広い知識が得られるため個人的に強くオススメしたい内容となっております🍀
確かにとある1企業の1開発者の実務ベース...という視点で見るとすぐには役に立たない内容も多いのですが、実務経験で得られない知見を補強するものとして逆にそこが良いのだ！と自分は感じました:relaxed:

## 参考にさせて頂いた記事など
https://www.ipa.go.jp/shiken/kubun/ap.html
エンジニア人事制度改定ver1.1（プレモーテム編）

# はじめに
この記事では、3月にリリース予定の「エンジニア人事制度ver1.1」のPJ過程について紹介します。前回の記事は以下をご参照ください。

- [エンジニアの人事制度について考える](https://qiita.com/takasu_mtg/items/94abb6ed32f36471ed7d)


## プロジェクトの工程計画
本プロジェクトでは以下の工程を踏んで進行します。
今回は、プロジェクトでも特に重要な工程である「プレモーテム」に焦点を当てて、その詳細と成果を共有します。

1. キックオフ
2. プレモーテム ⭐️
3. マイスターエンジニア
4. マルチ・リードエンジニア
5. テックリード
6. リードエンジニア
7. サブリードエンジニア
8. 内部レビュー
9. 経営レビュー
10. 説明会
11. ポストモーテム

# プレモーテムの実施方法
プレモーテムは、プロジェクト開始前に潜在的なリスクを特定し、その予防策を検討する手法です。本プロジェクトではプレモーテムを2つのステップに分けて実施しました。


プレモーテム何それ？という方は、Google re:Workの以下記事をご参照ください。

- [イノベーションが生まれる職場環境をつくる](https://rework.withgoogle.com/jp/guides/foster-an-innovative-workplace#introduction)

※[プレモーテム用のテンプレート](https://docs.google.com/document/d/1fOK3oPdPg4iuPSymMb1tuB2VxSH2VNVdPGDMpLUSfLw/edit)も配布されています。

## ステップ1: 個人でのリスクや懸念の記載
各参加者は個別に潜在的なリスクや懸念を自由に記載します。このステップでは、どのようなリスクでも、たとえ非現実的であっても受け入れます。

※引用元：[プレモーテム用のテンプレート](https://docs.google.com/document/d/1fOK3oPdPg4iuPSymMb1tuB2VxSH2VNVdPGDMpLUSfLw/edit)

> もし明日インターネットが使えなくなったら...もし会社が倒産したら...もし上司が怪物に喰べられてしまったら…
> 各自に発言の機会を与え、全員でチームのすべてのアイデアを共有します。他人のアイデアを批判せず、冗談が言える雰囲気が大切です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167604/757f82e0-873f-0f87-6050-38548d079e30.png)




## ステップ2: リスク評価と対策
次に、記載されたリスクについて「影響度」と「発生頻度」を定義し、対応の優先度を決定しました。上位3〜5のリスクについては、具体的な対策を実施することになります。
よりそうでは、以下のようなフォーマットを作ってステップ1、2を運用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167604/c6288328-9da2-2cf7-c90a-f65bf7664997.png)


# プレモーテムで挙がった意見と対策
プレモーテムのセッションで特定された主要なリスク、その評価、および対策を以下に示します。

1. **新規「プロジェクトマネージャー」等級の定義不明瞭さ（影響度: 高、発生度: 高）**
   - **対応優先度:** 1
   - **リスクや懸念:** 評価基準や目標設定の置き方などがちゃんと定義されておらず職務定義が浸透しない。
   - **対応内容:** 職務定義の明確化と周知。
2. **評価基準と目標設定の不明瞭さ（影響度: 高、発生度: 高）**
   - **対応優先度:** 1
   - **リスクや懸念:** 現実との乖離から、ほとんど誰も見ることが無く、運用されない。
   - **対応内容:** 役割定義の明確化。

あがった意見はリスト化し、後から確認できるようにします。
プロジェクト終了後に実施する ポストモーテム（PJ振り返り） の際に、プレモーテムで事前にリスクとして認識できていたかどうかで、プロジェクトの学びを多く得ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167604/a4f8c6ba-0af8-9266-1dff-0f2df275e84a.png)

# 結論
プレモーテムは、リスクを事前に特定し対策を講じることで、プロジェクトの成功率を高める効果的な手法です。このプロセスを通じて、私たちは「エンジニア人事制度ver1.1」の開発をより効率的かつ効果的に進めるイメージをPJメンバー内で共有することができました。
実施する際は、経営メンバー、マネージャー、メンバーなど様々な役割のメンバーと実施をすることで、異なる視点を得ることができ、PJの成功率が飛躍的に向上します。

引き続き、働きやすい職場づくりのため、エンジニア人事制度の改定に取り組みます！
mediba tech cafeについて

# はじめに
この記事は [mediba Advent Calendar 2023](https://qiita.com/advent-calendar/2023/mediba) の記事です。

みなさん、こんにちは。
medibaでSREをしています、[Mary](https://twitter.com/mary_tuba)こと、板谷です。
今年はmediba tech cafeのご紹介をしたいと思います。

# mediba tech cafeとは
mediba tech cafeとは、medibaのエンジニアチームの~~内情~~生態を赤裸々に公開しているYoutubeチャンネルになります。大体２〜３ヶ月ごとに何かしらのコンテンツをだすように心がけて頑張って運営運営してます。

https://mediba-tech-cafe.connpass.com/

https://www.youtube.com/@medibatechcafe5035

# なぜYoutubeチャンネルなのか
元々は現地イベントなども行いたかったのですが、始めたのがちょうど2021年3月と、ちょうど某感染症が流行っていた時期であることもあり、Youtubeチャンネルで情報を出すこということで始めました。

元々はLIVE配信やリアルタイムのコンテンツもありましたが、直近では収録したものを編集して公開する形に落ち着いています。

（今後、Liveイベントもやりたいなーという気持ちももちろんありますよ！）

# どんな人におすすめか
採用関連はもちろんのこと、基本的にのんびり喋っているだけなので、ラジオ代わりに聞いてもらうのもおすすめです。
（実際に mediba tech radioというサブコンテンツもやってました）

# おすすめ動画
私のイチオシ動画は以下。

mediba Tech Cafe #14 会社の福利厚生の紹介
https://www.youtube.com/watch?v=uQCqSOYPCVY

mediba独自の面白系福利厚生を、福利厚生のお弁当を食べながら喋ってます。
弊社のエンジニアの雰囲気が一番良くわかるんじゃないかなぁと思います。

# これから
これからも定期的に動画を上げていけるように運営をしていく予定です。

実は、12月28日に年内最後の動画をアップする予定ですので、こちらもお楽しみに！
速報URLなどは以下のConnpass登録をしていただいたら、通知などを送りますので、
登録お待ちしています。

https://mediba-tech-cafe.connpass.com/event/305783/


# 最後に弊社からのお知らせです。
現在medibaでは、メンバーを大募集しています。
[募集・応募ページ](https://www.mediba.jp/recruit)
medibaってどんな会社だろう？ と興味を持っていただいた方は、
カジュアル面談もやっておりますので、お気軽にお申込み頂ければと思います。
slackのwebhook通知でinvalid_payload エラーが出る原因

## エラー内容

### 実行コマンド

```sh
#!/bin/bash

tmpfile=$(mktemp)

echo "\"hoge\"" >> $tmpfile

HOGE_LOG=$(cat $tmpfile | sed "s/\"/'/g")

echo "Hoge log:"
echo "$HOGE_LOG"

curl -s -X POST -H 'Content-Type: application/json' \
    -d "{\"text\": \"$HOGE_LOG\"}" \
    $SLACK_WEBHOOK_URL

rm $tmpfile
```

### 出力結果

```sh
Hoge log:
"hoge"
invalid_payload
```

## 原因

メッセージにダブルクォートを含むことが原因であることが判明

## 解決方法

`/"`を`'`で全て置換する

### 実行コマンド

```sh
#!/bin/bash

tmpfile=$(mktemp)

echo "\"hoge\"" >> $tmpfile

HOGE_LOG=$(cat $tmpfile | sed "s/\"/'/g")

echo "Hoge log:"
echo "$HOGE_LOG"

curl -s -X POST -H 'Content-Type: application/json' \
    -d "{\"text\": \"$HOGE_LOG\"}" \
    $SLACK_WEBHOOK_URL

rm $tmpfile
```

###　出力結果

```sh
Hoge log:
'hoge'
ok
```

## 参考

https://stackoverflow.com/questions/51330529/getting-invalid-payload-when-trying-to-curl-slack
M1 Macへの移行で苦戦したこと（Xcode）

IntelのMacからM1のMacに移行するのにとんでもなく苦戦しました。
有線とかWifiとかでデータ移したりとかしなかったので、全部ファイルもアプリも手動でいれました。いらないファイル多くて選別したかったからです。
苦戦してから1、2週間経って記憶がちょっと朧げになっているのですが忘備録としてメモ。

アプリ開発でcarthageを使ってるのでいろんなものを導入していく。
まずHomeBrewを入れ、次にRosettaをいれ、carthageをいれ……。この辺りは他の人がいっぱい書いてくれてるので略。
（多分この順番だったような。rosettaは他のアプリを入れた時に入れろって言われた気がする）

Xcodeでアプリビルドしようと思ったらエラーが
>/usr/local/bin/carthage : No such file or directory

carthageファイルがないそうです。フォルダ移動なりターミナルで移動なりで確認したところ、確かにない。

調べてみるとM1Macからはusrではなくoptにcarthageファイルは置かれるようになったとか。
なるほでょ。Xcodeはusrを見てるからないだのうんだの言ってるらしい。

なので、以下のコマンドでシンボリックリンクを作って解決
```
ln -s /opt/homebrew/bin/carthage /usr/local/bin/carthage
```
でも、/usr/local/bin/だったか/usr/local/bin/carthageだったかにparmissionがないぞって私の場合は言われたので
```
sudo chown -R $USER /usr/local/bin/
```
これで権限をつけた後にもう一回、上のlnのコマンド打ってシンボリックリンクを作成。無事できました。

Xcodeビルドできた！と思ったらデバッグエリアになにやらよくわからないエラーが。
>Warning: Error creating LLDB target at path ?
'/Users/ユーザー名/Library/Developer/Xcode/DerivedData/アプリ名-文字列/Build/Products/Debug->iphonesimulator/アプリ名.app'- using an empty LLDB target which can cause 
slow memory reads from remote devices.

ちょっと何言ってるかわかんないですね（画像略）。
グーグル先生で翻訳してみたりそのまま検索をかけてみたりしてもさっぱりぽん。

結局、ビルドできるしアプリも動くからと動かしていたら突如クラッシュ。
LLDB関連のエラーが。解消してなかったから出たらしく。
>rosetta error: unable to get state for thread the runtime suspended
Message from debugger: The LLDB RPC server has crashed. You may need to manually terminate your process. The crash log is located in ~/Library/Logs/DiagnosticReports and has a prefix 'lldb-rpc-server'. Please file a bug and attach the most recent crash log.

rosettaが関係しているらしい。
多分入れた気がする朧げな記憶があったので、一旦本当にインストールしていたか確認しようとグーグル先生に「rosetta　インストール　確認」と聞いたところXcodeが動いてる環境がIntelなのかM1なのか確認できるよと言われて試しにアクティビティモニタから確認したところ、見事に「Apple」ひとつもIntelを使ってなかったぞい。XcodeももちろんApple。絶対コレだ。アプリはIntel環境のものなのでエラーが出るのは当然でした。

rosetta環境で動かす方法もグーグル先生は知っている。
```
1. Xcodeが起動していたらまず終了
2. アプリケーションからXcodeの「情報を見る」を開く
3. Rosettaで開くという設定があるのでチェックをつける
4. Xcodeを起動する
```

準備できたのでもう一回アクティビティモニタで確認するとちゃんとXcodeがIntelで動いてるじゃありませんか！
えらい！
ビルドしてみても、デバッグエリアにはLLDBがエラーでダメだったぞいなんて書いてない！
えらい！

以上終わり。