OmniAICreator/Qiita-1.07M huggingface dataset:
Figmaと仲良くなるために覚えておきたいショートカット3選

## はじめに
この記事はHRBrain Advent Calendar 2022カレンダー2の5日目の記事です。

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

プロダクトデザイナーの松戸です。

昨今のUIデザインツールといえばFigmaの勢いが増していて、UIデザインのスタンダードツールになりかけていると思います。2021年のデータですが以下のようなデータからも読み取れます。

![スクリーンショット 2022-11-29 21.40.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2334528/aa94d5d4-09aa-4c59-9804-40cfd2e409eb.png)

https://uxtools.co/survey/2021/#ui-design

また、シェアが拡大していること以外にも、コラボレーションを軸に置いたツールというコンセプトもあって、デザイナー以外の開発者もFigmaに触れる機会が多いと思います。

そこで改めてFigmaを触るうえで、覚えておくと便利なショートカットや操作を紹介します。
## フレームをPNGとしてコピー
![62b1e25ea760388d06954f9ce2363746.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2334528/efc2d412-48bb-ad75-6613-5b47ad8f0e31.gif)

**【mac】Shift + ⌘ + C**
**【Win】Shift + ctrl + C**

エクスポートの細かい設定などをせずに、選択中のフレームをPNGとしてクリップボードにコピーできます。SlackやGoogleスライドにそのまま貼り付けられるので、とても使用頻度が高いです。
## フレームのリンクをコピー
![b840fb034321578d5278db6c3ddb5143.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2334528/e35d9301-fee0-f4d9-25cb-4c801f276630.gif)

**【mac】⌘ + L**
**【Win】ctrl + L**

選択中のフレームのリンクをコピーしてくれます。ここでコピーしたリンクを踏むと、該当のフレームが選択された状態でFigmaが開きます。仕様書などにUIを貼り付けるときは画像ではなく、このリンクを記載しておけばFigmaと仕様書の整合性が取りやすいです。

※注意
このショートカット、とても便利なんですがframeではなくpage全体に飛ばされて機能しないことがあります。体感だとAuto LayoutのFrameに使うとバグる率高めなので単なるFrameのときやFigjamで使うといいかも。
https://forum.figma.com/t/bug-share-links-lead-to-page-rather-than-specifically-selected-frame/15103
## 最下層のレイヤーを選択
![a08bfce31bcae17a56ab76fcad2623d0.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2334528/b2413e50-1664-5547-9377-25a69382c360.gif)

**【mac】⌘ + クリック**
**【Win】ctrl + クリック**

スタイルを見るために、ひたすらダブルクリックをした経験はないでしょうか。FigmaはAuto Layoutを使っていると、どうしても深くネストされてしまいます。

⌘を押している間は一番深いレイヤーを直接選択できるので、いくらネストされていても関係なく目標物のスタイルを確認できます。また、この操作とセットでひとつ上の階層を選択する**Shift + Enter**のショートカットも覚えると、キーボードだけでレイヤー移動ができるのでInspectでスタイルを確認するストレスがかなり減ると思います。
## 最後に
デザイナーとやり取りをするくらいなら、今日紹介した3つを覚えればもうFigmaはお友達です。この記事をきっかけにデザインツールに苦手意識がある方も、Figmaを触り始めてくれると嬉しいです。
tkinterで残業代計算

# 初めに
この記事は、[ニフティグループ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nifty) 6日目の記事です。

残業代の計算方法を知らなかったので、
デスクトップアプリを作成しながら学ぶ
※Tkinterの書き方は他の方の記事があるので触れません

# 環境
MAC bookair M1
python3.1

# 残業代の計算方法
下記を参考にしました。
https://www.obc.co.jp/360/list/post247

残業時間は
１時間あたりの賃金（時給）×1.25（割増率）×残業時間」で算出します。

1時間当たりの賃金は、「月給÷所定労働時間」で求めます。
※月給にはボーナスなどは含まれません

![Screenshot 2022-12-06_14-36-24-601.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411486/e6f1ac00-c00d-a3d1-cef4-3c16e2da1135.png)


# 実行イメージ
値を入力し、実行ボタンを押して実行

上記を踏まえて、

月収と所定労働時間と今月の残業時間と割増率を入力し、判定ボタンを押して残業代計算をするデスクトップアプリ作成
画像の場合
手当等を抜いた月収を２８万円、一日の所定労働時間８時間x月２０日労働で１６０時間
今月の残業時間２０時間、深夜残業はしていないので割増率を１.２５
として計算

![Screenshot 2022-12-06_14-25-32-742.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411486/d6fbc957-6051-c0eb-0aea-d4da1a325ea1.png)

# code
```
import tkinter as tk

#１時間あたりの賃金 月給 ÷ 月平均所定労働時間
def calcwages(fee, avrworktime):
    return fee / avrworktime


root = tk.Tk()
root.title('残業代チェック')
root.geometry('400x400')

#Labelウィジェット
label_1 = tk.Label(root, text='収入(基本給)')
label_2 = tk.Label(root, text='円')
label_3 = tk.Label(root, text='所定労働時間')
label_4 = tk.Label(root, text='h')
label_5 = tk.Label(root, text='1時間あたりの賃金を計算')
label_6 = tk.Label(root, text='計算結果')
label_7 = tk.Label(root, text='今月の残業時間')
label_8 = tk.Label(root, text='割増率（深夜だったら1.5など）')

#entryウィジェット
fee = tk.Entry(width=6)
avrworktime = tk.Entry(width=5)
workovertime = tk.Entry(width=5)
raiserate = tk.Entry(width=5)

#Buttonのハンドラ関数
def judgement():
    f = int(fee.get())
    h = int(avrworktime.get()) #所定労働時間
    t = int(workovertime.get()) #残業時間
    k = float(raiserate.get()) #割増率係数
    s = calcwages(f, h)
    label_5['text'] = '１時間あたりの賃金:' + str(s)   #str組み込み関数で計算結果を文字列にして返す
    label_6['text'] = '残業代' + str(s * t * k)

#Buttonウィジェットの作成
button = tk.Button(root, text='判定', command=judgement)

root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=1)
root.columnconfigure(2, weight=1)
root.rowconfigure(0, weight=1)
root.rowconfigure(1, weight=1)
root.rowconfigure(2, weight=1)
root.rowconfigure(3, weight=1)

#grid関数でウィジェットの配置
label_1.grid(column=0, row=0, sticky=tk.E)
fee.grid(column=1, row=0)
label_2.grid(column=2, row=0, sticky=tk.W)
label_3.grid(column=0, row=1, sticky=tk.E)
avrworktime.grid(column=1, row=1)
workovertime.grid(column=1, row=2)
raiserate.grid(column=1, row=3)
label_4.grid(column=2, row=1, sticky=tk.W)
button.grid(column=3, row=2, columnspan=5)
label_5.grid(column=0, row=4, columnspan=3)
label_6.grid(column=0, row=5, columnspan=4)
label_7.grid(column=0, row=2)
label_8.grid(column=0, row=3)
root.mainloop()
```


明日は、@IWS_113(https://qiita.com/IWS_113)さんの[NIFTY Tech Talkのこと]です。
UbuntuをWindowsが入っているマシンにインストールしてデュアルブートする

##  注意事項
備忘録用。
途中で手順を間違うとデータを失うかもしれないので自己責任でお願いします。

[参考にした記事](https://itsfoss.com/install-ubuntu-1404-dual-boot-mode-windows-8-81-uefi/ "How to Install Ubuntu Alongside Windows 10")

##  下準備
*　<strong>先にWindowsを入れる。</strong>後で入れると設定が面倒なのでできれば先に。。
*　[公式のチュートリアル](https://ubuntu.com/tutorials/create-a-usb-stick-on-windows#1-overview "Create a bootable USB stick with Rufus on Windows")で Ubuntu Bootable USBを作る。
*　UbuntuをBootする。
*　再起動してもUbuntuが実行されない場合はWindowsの「PCの起動をカスタマイズする」→「再起動」→「デバイスの使用」→自分が用意したUSBを選択する。

##  手順
*　Install Ubuntuを選択。
![image8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498423/0813a4c4-cd74-3be0-bafa-e2798161265d.png)

*　好きな言語とキーボード設定を選択。
![image12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498423/607a34bc-35dd-5bcc-f773-d01200ac9168.jpeg)

*　Normal installation、Minimal Installationどっちでもいい。Normalのほうがデフォルトでいろいろインストールされて便利だが、使わないであろう物も一緒にインストールされる。Download updates while installing ubuntuはチェックを入れとくのがおすすめ。
![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498423/f2687f1b-0189-efba-a5dd-18fe8636f9bb.png)

*　以下の画面が出てきたら<strong>Something Else</strong>を選択。
![image6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498423/24bc2f43-6735-978b-4771-1405643b441d.jpeg)

*　フリースペースにUbuntuのパーティションを作る。
![image7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498423/5e0689ec-2a35-bd4b-4efe-e95033c515f4.png)

*　Root(/)から作っていく。インストールされるものはここに入る。参考としてドライバ+CUDAだけで10GBは使うので大きめがいい。
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498423/c58eaf53-1768-f09e-14f4-f9770aab4869.png)

*　次にHomeを作る。画像や動画などのデータはここに入るので、大きめがいい。
![image17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498423/4a21bdf5-8e60-20d7-895a-80b29236cf78.png)

*　Swapを作る。サイズは自分のPCのメモリサイズの2倍が推薦されている。
![image11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498423/042a074d-855e-f0c2-32a5-e8f7f9012480.png)

*　最後にHomeとRootがフォーマットするを選択されているか確認（Format?の行）。できていたらOk。
![image16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498423/cb03edcc-50e0-5861-b33a-dd7cba6fca9c.png)

*　時間設定とユーザー設定した後にインストールが始まる。
![image19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498423/a5e3ff03-fe3c-05ea-fb70-f1e8b6cceaca.png)

*　無事インストールできたら再起動+USBを取る。
![image9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498423/d5411458-55c1-4437-6ecd-40c1a5ea07b4.png)

*　再起動後、UbuntuのGRUBが立ち上がってUbuntuとWindowsが選べるようになる。Ubuntuにログインできれば成功。
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498423/f484e4e0-bcd2-68e0-0e1e-2aabc91437e2.png)

:::note warn
人によっては何も聞かれないままWindowsに入ります。その時はBIOSに入ってUbuntuのBootLoaderを優先するように設定します。
*　Windowsで「PCの起動をカスタマイズする」→再起動→「トラブルシューティング」→「詳細オプション」→「UEFIファームウェアの設定」→再起動
*　Boot OptionでUbuntuが出てこればそれを最優先にします。
*　もしなければ「UEFI Hard Disk Drive BBS Priorities」に似たものを探して下さい。そこでWindowsとUbuntuの優先度を変えることができます。
*　再起動すればUbuntuのGRUBが出てくるはずです。
:::
fly.ioのビルドをやり直す。(備忘録)

railsをfly.ioにデプロイする時の備忘録です。

ビルドからやり直そう😭😭ってなった時のメモ書き的なやつです。
ちゃんと調べたら一発でやり直すコマンドとかあると思うので、急いでる人向けです。

半ば強引に消しているので、ご自身のアプリはしっかりコピーを取っておいてください。

# fly.ioのページから自分のdb関連を消す
1-1.まずはDashboardを開きましょう
https://fly.io/dashboard

1-2.開いたらApps内の内容（スクショ赤線範囲内）を消していきましょう

一度もリリースしたアプリがない方は全て消して大丈夫です。

![apps_range.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874115/9ecd3fb3-e904-3280-1f9e-413fd9bd88c4.png)

`消すやつを選択`→　`サイドバーのsettings`　→　`Delete app`　→　`ファイルの名前を打ち込んで「Yes, delete it」`
で消せます

１つずつ消すの大変ですが頑張りましょう😎😎
PDF.js のデバッグ


某プロダクトには PDF.js で PDF をレンダリングする機能があるのですが、

- 特定のフォントだけレンダリングされない
- 文字化け
- canvasが真っ白になる

などといったバグに悩まされることが多々ありました。
そこでデバッグできたらいいなって思うじゃないですが、できるんですよ

c.f. [https://github.com/mozilla/pdf.js/wiki/Debugging-PDF.js](https://github.com/mozilla/pdf.js/wiki/Debugging-PDF.js)


```diff_javascript
    pdfjs
      .getDocument({
        cMapPacked: true,
        // 文字化けしたり歯抜けになったりするときは cmapurl を疑う
        cMapUrl: `https://mozilla.github.io/pdf.js/web/cmaps/`,
        enableXfa: true,
        url,
        fontExtraProperties: false,
+       pdfBug: true,
+       verbosity: 5,
        disableFontFace: false,
      })
```

`pdfBug: true` を渡すとデバッグログがブラウザコンソールに流れてきます。
`verbosity` は以下の通りです

|値|ログレベル|
|--|--|
|0|エラー|
|1|警告|
|5|詳細|

参照: https://github.com/mozilla/pdf.js/blob/1f082d3e1de0beb514087f6d241eda9ca9646e4a/src/shared/util.js#L267
TechConfにて英語で発表しよう〜ElixirConf US/EUを題材に〜その1 すごい技術を発明しないとElixirConfで発表できないのか？

技術についてある程度自信を持ってきたら，次に積極的に情報発信をしていくことと思います．この記事では，その1つの手段として，いわゆるTechConf(テック・カンフ)，すなわち技術系の国際会議で発表・登壇する方法について紹介していこうと思います．

私は，ElixirConf(エリクサー・コンフ)という，並列プログラミング言語Elixirにおいて世界最高峰のTechConfに，日本人で初めて発表したのが2019年のことでした．またその後，何度も発表する機会をいただきました．それがとても良い体験だったので，もっと仲間を増やそうとして，2021年には何人もの友達を誘ってElixirConfで発表するための勉強会を企画し，結果，4名の発表の機会をいただけました．

https://youtu.be/iEsU6icxfQE

https://youtu.be/CkoxCly11yQ

https://youtu.be/vHNqZmLLTj4

https://youtu.be/t5TT0-mI2O4


TechConfで発表をすると，次のような利点があると考えています．

1. その技術についての国内外での知名度が向上します．
1. 海外において，その技術に関する友人ができます．
1. 英語でその技術について説明するスキルが身につきます．
1. 海外におけるその技術の潮流を知るきっかけになります．

この記事のシリーズではElixirConfについて説明しますが，他のTechConfにも通じる内容が多く含まれているのではないかと思います．この記事をきっかけにして，より多くの日本の方々が，もちろん，それだけに限定するつもりもないのですが．TechConfで発表することになると良いなと考えています．

追記: 本メソッドでElixirConf EU 2023で @RyoWakabayashi さんが発表することになりました！

https://www.elixirconf.eu/talks/distributed-and-parallel-image-processing-on-livebook/

# ElixirConfに関する誤解〜すごい技術を発明しないとElixirConfで発表できないのか？

前述のように，日本人で初めてElixirConfで発表した私の発表が，ElixirからGPUを駆動するという，当時それまでに存在しなかった新たな技術領域を開拓するものでしたので，Elixirコミュニティにおいて「すごい技術を発明しないとElixirConfで発表できない」という誤解が広まったように感じています．

しかし，ElixirConfの公募要領である，いわゆるCFP(もともとCall for papers，すなわち「論文募集」と言葉が日本で広まったのでCFPと呼ぶことが多いのですが，ElixirConfの場合には，Call for Talksというように呼ばれています)をよく読んでみると，また，実際に発表された数々の過去のYouTube動画を見ると，けっしてそんなことはないと私は思っています．

それどころか，Qiitaで書かれるような技術入門記事をそのまま英語でのプレゼンテーションにしたというタイプの講演内容がけっこう多く見受けられます．むしろその方がマジョリティかなとも思えます．

入門記事的な発表と最新技術的な発表の割合を見ていくと，発表の数が少ないElixirConf EUにおいては，相対的に後者の比重が多いように見えます．一方，発表の数が多いElixirConf USにおいては，かなりの数が前者，すなわち入門記事的な発表が多いように見受けられます．

そのことから，普段から勉強会やQiita/Zenn，雑誌等で，入門記事的なことを書いている人は，その内容やスタイルをElixirConfで発表しても，受け入れられる可能性が高いのではないか？という仮説を持っていました．

その仮説に基づいて，実際，前述のように2021年に大挙して応募し，ElixirConf USで発表実績を生み出すことができました．そのことについて，ElixirConf USの主催者であるJim Freeze氏からも好評価の言葉をいただけました．

# ElixirConfに応募することによる特典

ElixirConfでは，もし発表が採択される(acceptされる)と，そのElixirConfの本会議の参加費が無料になるという特典があります．virtualでの参加でしたら旅費も不要なので，完全無料でElixirConfを堪能できますね！

もし不採択になる(rejectされる)場合でも，一番安いチケットでの購入ができるという特典があります．通常だと発表内容が公開されるより前にしか購入できない超早売りのチケット(Super early bird)と同等の価格で購入できるという特典です．

# 次の機会は ElixirConf US 2023

ElixirConf US 2023については，2023年9月5日〜8日に開催となりました．会場については追ってアナウンス出されるそうです．Call for Talksについても近々公募するのでしょうね．今から準備を始めて損はないと思います．

続きはこちらです．

* [TechConfにて英語で発表しよう〜ElixirConf US/EUを題材に〜その2 Talk Descriptionの書き方](https://qiita.com/zacky1972/items/a2c3b8b91a8aadb52022)
* [TechConfにて英語で発表しよう〜ElixirConf US/EUを題材に〜その3 Bio(自己紹介文)の書き方](https://qiita.com/zacky1972/items/6212a4c227ae7df9bc24)
UniVRM使用時に色空間をGammaに設定すると設定変更を促すダイアログを閉じれなくなる問題対策

# 初めに
UniVRMは色空間Linearでの使用を推奨されているため、gammaを設定しようとした際に以下の様なポップアップが表示されてしまいUnityEditorが操作できなくなってしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/5ebb937e-ce8e-0bc7-d701-4491e0e7fb7e.png)
モバイルでの対応端末を広げようとすると必然的にWebGL1.0を選択することになるが、その場合はgamma設定が必須となるため、このポップアップが非常に邪魔になってしまう。
※iOS15以降でWebGL2.0に対応しているがリリース後は不具合が多かったためiOS15でも動作しない可能性がある。

# ポップアップの消し方
ScriptingDefineSymbolsに以下のシンボルを追加し `Apply`を押す。
`UNIGLTF_USE_GAMMA_COLORSPACE`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/454aef03-ee54-531f-4dc5-90d9c59a2853.png)

# 関連Issue
本対策は以下のIssueで機能追加して頂きました。

https://github.com/vrm-c/UniVRM/issues/1559
JavaScript/TypeScriptで変数で指定したオブジェクトのメソッドを発火させる

JavaScript(TypeScript)でのオブジェクトのプロパティへのアクセスは以下のようにすることができます。

```javascript
const o = {key: 'value'};
console.log(o.key)
console.log(o['key']); // これもまた動作する

const k = 'key';
console.log(o[k]); // これもまたOK
```

なので…

```javascript
const o = {f: () => console.log('function')};
o.f();
o['f'](); // これもまた動作する

const k = 'f';
o[k](); // これもまたOK
```

こういうことができるようです。
glueを使ってみて

## はじめに
いろんな形式のデータを他システムに連携するため、glueを使用することになったので、経験して詰まったところを忘れないようにメモ

## Glueとは？
- サーバーレスのETLサービス（詳細なことはGlueのマニュアルを見て理解して）
- 分析用（Athena）用のデータレイクの作成

## 実際にやってみた！
1. Glueジョブの作成
    - type: Spark
    - Language: python3
    - worker数: 10
    - worker type: G1X
1. 作成したGlueジョブを実行

## 実際に使用した関数の例
### S3バケットのファイルを別のS3バケットに格納
- 連携元のS3バケットのファイルはクローリング済み、コネクション作成済み
```python
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark import SparkContext, SparkConf
from awsglue.context import GlueContext
from awsglue.job import Job
from pyspark.sql import SQLContext
from awsglue.dynamicframe import DynamicFrame
from datetime import timedelta, timezone

# Job の初期化
args = getResolvedOptions(sys.argv, [
    'JOB_NAME',
    'WORKFLOW_NAME',
])

spark = glueContext.spark_session
    job = Job(glueContext)
    job.init(args['JOB_NAME'], args)
try:
    # DynamicFrameの作成
    datasource1 = glueContext.create_dynamic_frame.from_catalog(
            database={コネクションDB名}, table_name={コネクションテーブル名}, transformation_ctx="datasource1")
    # Dataframe変換
    df = datasource1.toDF()
    # カラムの型変換
    df = df.withColumn("test", "string")
    # 変換後のカラムを取得
    df_schema1 = df.schema.fields
    # parquetでS3バケットに書き込み
    df.write.mode('overwrite').parquet({格納先のS3バケット})
except Exception as e:
    # 処理落ちした行数取得
    exception_traceback = sys.exc_info()[2]
    err_line_number = exception_traceback.tb_lineno

```

#### 関数の説明
- create_dynamic_frame.from_catalog
    - コネクション経由でS3バケット内のファイルをダイナミックフレームとして取得
- toDF
    - ダイナミックフレームをデータフレームに変換
    - データフレームのカラム名を変換（引数に配列を設定し、一括で変換する用途で使用）
- withColumn
    - データフレームのカラムの型を変更するときに使用
    - 第一引数に型を変換したいカラム名、第二引数に変換したい型を指定
- schema.fields
    - データフレームのカラムの名前と型を連想配列で取得
- mode('overwrite').parquet({格納先のS3バケット})
    - 格納先のS3バケットにparquet形式でファイルを格納
    - mode('overwrite')を指定することでファイルを上書きする

## Glueでできること
- DBのテーブルデータを別のDBもしくはS3バケットにファイルとして連携
    - JDBCコネクションもできるが、コネクションを利用して接続することも可能（詳しくはGlueのリファレンスを参照）
- S3バケット内のファイルを別S3バケットにCSVもしくはparquet形式でデータを連携
- aws-sdkを使用できるので、sdkを利用してできることは可能だが、複雑なロジックはお薦めしない
    - 場合によってはジョブのスペックに限らず、処理が固まったり、不整合が発生し、それ用にカスタムロジックを組み込まなければいけないなど、大幅にコストがかかる可能性があるので、そこは注意

## 注意点
- 現状の構成でpandasを用いるとGlueジョブに高負荷をかけすぎるとJOB自体が固まって、エラーになることがある
- 基本的に連携元と連携先を1:1の関係で１つのジョブを作成すると思うが、S3バケットにパラメータファイルを定義しておけば１つのジョブで複数の連携先もしくは連携元にデータ連携可能にはなるが、その分汎用的なロジックを作成するため、リスクがあったりコストがかかる
- 連携したS3バケットのファイルのデータをクローリングする場合、Glueがデータの中身を見て、型を決めるので、場合によっては意図した型にならない場合があるので、その場合は手運用もしくは変換用のスクリプトを作成するなどの工夫が必要
- 連携先をDBにする場合、glueのリファレンスにある関数を利用すると、TRUNCATE、INSERTを行う。取り扱うデータによっては連携先のDBに高負荷がかかるので、メモリーオーバフローを起こさないようなスペックが必要になる。
- 格納先のS3バケットにファイルを格納するとき、ファイル名はこちらで指定できないので、もしファイル名が指定したい場合は格納後、SDKを利用してファイルのリネームを行うスクリプトや手運用でのリネームが必要

## 今後
S3バケットのファイルを取り扱ったものを記事としてまとめたので、今度はDBを取り扱ったものを記事として書こうと思う
AWS DevOps Engineer Professional認定更新の記録

# 概要

少し日が経ってしまいましたが、先日
DevOps Professional試験を無事更新しました。
今回もやったことと感想を記録しておきます。

# About me
インフラエンジニア6年目、AWSメインで業務を日々行っています。
AWS認定資格は全冠しました。
（新試験SAP on AWSの記録は今度書きます）

# DevOps試験はどんな試験なのか

AWSサービスの中でもDevOpsに関わるサービスの知識を問われます。

**配点比率**

- SDLC のオートメーション 22%
- 構成管理と Infrastructure as Code 19%
- モニタリングとロギング 15%
- ポリシーと標準のオートメーション 10%
- インシデントとイベントへの対応 18%
- 高可用性、耐障害性、災害対策 16%


# 具体的な内容

### SDLC のオートメーション 22%

SDLC=ソフトウェア開発ライフサイクルらしいです。
主に、アプリケーション環境に必要なデプロイ環境などの知識が必要です。

• AWS CodeArtifact
• AWS CodeBuild
• AWS CodeCommit
• AWS CodeDeploy
• AWS CodePipeline
• AWS CodeStar

など、関連サービスの基礎知識は[Blackbelt](https://aws.amazon.com/jp/events/aws-event-resource/archive/?cards.sort-by=item.additionalFields.SortDate&cards.sort-order=desc&awsf.tech-category=*all)を見ましょう。


・Blue/Greenデプロイメントについて
・ステータスの確認方法
・ロールバック方法や自動化手法
のようなデプロイ時の知見があると理解できる内容も多いので
最低限**サンプルのECSなどをデプロイする過程**を触っておくと良さそうです。


### 構成管理と Infrastructure as Code 19%

構成管理はConfigなどが優秀なサービスです。
最近はSecurityHubで一括ルール適用ができますが
具体的にAWSアカウントで利用してみるとイメージが出来ます。

AWSのIaCといえば**CloudFormation**というサービスがあります。
こちらも何度か触っておくと理解がしやすいです。
特に、失敗時の動作や、親子スタックで作ったりすると良さそうです。

自身で[数年前に書いたサンプルコード](https://qiita.com/shinon_uk/items/13bfd0b5908d01829999)も一応ありますが、
他にもたくさん良い記事があると思います。


また、オートメーションツールはAWSサービスにたくさんありますが
全てを触るのは難しいと思いますので、ある程度触ったらあとはBlackbeltでも良さそうです。


### モニタリングとロギング 15%

**SysOps Administrator試験**の延長線でもありますが、

・CloudWatchによるメトリクス収集、メトリクスを利用したアラート作成
・CloudWatch Agentを利用したログ出力結果を用いた、ログサブスクリプションフィルター
・蓄積するログのライフサイクル設定やS3出力
などの基礎知識に加えて

・S3イベントをトリガーとしたアラートおよびLambdaアクションへの統合
・OpsWorkやInspectorを用いたEC2運用
・スケーリングやアラートをトリガーとした、各種AWSサービスのアクション統合
など、**運用における自動化管理知識**も要ります。


### ポリシーと標準のオートメーション 10%

運用自動化のために、AWSサービスの機能をフル活用する知識が問われます。

ガバナンス系なのでここもConfigですが
サービスごとに具体的にどういうことが改善できるのか？を知ることが試験対策では大事です。
Configで検知したあとのアクション（サービス統合）をイメージしておくと良さそうです。

少なくとも
• AWS CloudTrail
• Amazon CloudWatch
• AWS Config
• AWS OpsWorks
• AWS Organizations
• AWS Systems Manager
• AWS Trusted Advisor
あたりのBlackbeltは見ておきましょう。
※試験関係なく、AWS運用にとても役立ちます。


### インシデントとイベントへの対応 18%
　＆
### 高可用性、耐障害性、災害対策 16%

各トラブルシチュエーションに応じた対応策を問われるような問題が想定されます。

負荷を最適化させるためにスケール設定やルーティング設定を変更したり
様々なパターンがあると思います。

AWS認定試験で選ぶ選択肢は、**消去法で選ぶこと**が基本です。
問題の要件を満たす必要はあるのですが
**「最終的に何を重視すれば良いのか？」**というのが非常に大事です。
いわゆるその問題＝状況におけるビジネス目標ですね。

例えばコスト重視ならば、SLAを担保できる最低限の構成にする必要があります。

DatabaseやComputingマシンを、リージョンを跨いだ構成にしたらデータは冗長化されますし、**RTO/RPO**はとても短く出来ますが、AWSコストも膨れ上がります。

AWS設計にはたくさんの選択肢があります。
EC2であればコンピューティングタイプも様々、ストレージにもたくさんのEBSストレージプランやEFSといったサービスもありますが、このあたりを一通り知ることでよりベストプラクティスを導き出せると思います。

といった具合で、やはり知識だけでは難しい部分もあるので
特に問題演習が必須な分野だと思います。
**※今回の更新にあたり、この分野を主に意識した対策をしました。**


以上、ある程度具体的に書きましたが実は**ほぼ全て[試験ガイド](https://aws.amazon.com/jp/certification/certified-devops-engineer-professional/)に載っている情報です。**

どのAWS試験も試験ガイドを熟読するのが大事であり、
問題演習が対策の要であることは間違いないです。


# 感想

今回はなかなか時間を取れず、問題演習を数日こなして対策は終わりでした。

82%というそんなに余裕のない結果でしたが、
まだ使っていない機能もあることが知れてよかったです。

試験はテストセンターで行いました。
やはりいろんな方の感想を見ても家では受けたくないなと思ったのと、
終わったあとのコーヒーが格別ですね。


次はANS（Network）試験を更新してきます。
ありがとうございました。
非デザイナーがはじめてFigmaでデザインを作るときに知っておくと良さそうなこと ~基礎設計編~

## これは何

[Figma Tips Advent Calendar 2022](https://qiita.com/advent-calendar/2022/figma-operation-tips)の参加記事です

エンジニアの同期に、Figmaで初めてデザインを作ろうとしているエンジニア向けに知っておいたことを書いて欲しいと言われたので書きます

この記事はFigmaのファイルを開いてデザインをいざ作成するぞ！というところからスタートします。その前の基本的なFigmaの見方や使い方は以下の記事をご覧ください！

https://qiita.com/kabechiyo13/items/e2460960d105df9ddda3

## 本編

実際に手を動かしながらFigmaを使っていきます。

まずはデザインするページのワイヤーフレームを用意します。
ワイヤーフレームはFigmaで作っても手書きでもなんでも大丈夫です。

今回はゲームのレビューサイトのユーザーページを作成しようと思い、こんなワイヤーフレームを用意しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/21e92dc2-45ca-b74b-a112-e40c96b02444.png)

ヘッダーがあってユーザーの情報があってピックアップゲーム、ゲーム機、各媒体のゲーム...最後にフッターと並んでいるページです。

### 下準備

では早速作っていきましょう！と言いたいところですが、後々楽をするためにここで一度下準備をしておきます。

Figmaには`Text styles`や`Color styles`というものがあり、デザインないで使うテキストや色を定義して使い回すことができます。

最初にこれを定義しておくと、だんだんデザインが増えてきたときの管理のしやすさや作りやすさが段違いに上がるので、最初に定義してしまいましょう！

さまざまな企業が公開しているFigmaのデザインシステムやHIG、Material Designなどを覗いてみるとどんな定義がされているかがなんとなく掴めるのでおすすめです。

https://developer.apple.com/design/human-interface-guidelines/foundations/color


1から構築するのは大変なため、今回は筆者が使い慣れている[Qiita Blog](https://blog.qiita.com/increments-design-system/)でも公開しているQiitaのデザインシステムをそのまま定義しようと思います。

### Text Styles

Text Stylesは「[Text Styles Generator](https://www.figma.com/community/plugin/759472336242530542)」を使って定義していきます。

1. [Text Styles Generator](https://www.figma.com/community/plugin/759472336242530542)プラグインをダウンロードする
1. [このFigmaファイル](https://www.figma.com/file/1eNgvLswXLt7ZRYcaAMCJK/%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B5%E3%82%A4%E3%83%88?node-id=608%3A1132&t=u3ownnkcE8IDvaC1-1)の「Text styles」というレイヤーをコピーして、手元のファイルにペーストする
1. 「⌘ + /」でコマンドパレットを開き、「Text Styles Generator」を検索して「Generate Text Styles」を選択する
1. Text stylesが追加される :tada:

プラグインの説明はこちらの記事をご覧ください！

https://qiita.com/kabechiyo13/private/5d39eac830672697a8df

### Color Styles

次に、Color Stylesを定義します。
Qiitaのデザインシステムをベースにサービスのメインカラーを入れて定義していきます。

メインカラーはプライマリーボタンの色になることが多いので、ボタンの背景に敷いた時に違和感がないかやテキストが読みづらくないかを考慮して決めましょう！

注意が必要なのはイエロー系と赤系の色です。

イエロー系は、背景にしても文字色にしても文字が読みにくくなりがちなので、少しオレンジに寄せるのがおすすめです。

赤系の色をプライマリーにするときは、ボタンがエラー表示に見えてしまうので、赤以外の色でプライマリーボタンの色を設定するのがおすすめです。

メインカラーが決まったらColor stylesに登録します。

1. 登録したい色を指定したオブジェクトを選択して右サイドバーの「Fill」のメニューから「::」のアイコンを選択し
1. ドロップダウンの右上の「+」アイコンをクリック
1. Nameに「Main」と入力して「Create style」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/934b59e4-1121-a828-565e-eb0c2bf1ee2e.png)

残りのColor stylesは、プラグインで一気に登録してしまいます！

1. [Chroma Colors](https://www.figma.com/community/plugin/739237058450529919/Chroma-Colors)プラグインをダウンロードする
1. [このFigmaファイル](https://www.figma.com/file/1eNgvLswXLt7ZRYcaAMCJK/%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B5%E3%82%A4%E3%83%88?node-id=636%3A5530&t=u3ownnkcE8IDvaC1-1)の「Color styles」というレイヤーの中にある四角形のオブジェクトをコピーして、手元のファイルにペーストする
    - :speech_left: テキスト部分はロックしてあるので、ドラッグで選択すれば四角形のオブジェクトのみが選択できます
    - ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/afa3ba4e-dea0-4192-b74a-92ec66d80fb2.png)

1. 「⌘ + /」でコマンドパレットを開き、「Chroma Colors」を検索して選択する
1. Color stylesが追加される :tada:

ここまでで下準備が完了しました！次回は実際にデザインを作成していきます :)
Azure Administrator(AZ-104)：Azure管理者向けの前提条件「ARMテンプレートのパラメーター」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「ARMテンプレートのパラメーター」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure 管理者向けの前提条件](https://learn.microsoft.com/ja-jp/training/paths/az-104-administrator-prerequisites/)
◇対応するモジュール
[Azure Resource Manager テンプレートのパラメーターについて詳しく知る](https://learn.microsoft.com/ja-jp/training/modules/configure-resources-arm-templates/4-explore-template-parameters)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure管理者向けの前提条件「ARMテンプレートスキーマ」](https://qiita.com/fsd-jume/items/254134e3934ee6cd45d3)

## ARMテンプレートのパラメーター
### ARMテンプレートパラメーター
・パラメーターを使用することでデプロイ時に特定の値を設定可能になる
⇒SKUやサイズ、容量、リソース名をデプロイ時に入力して個別設定が可能
・セキュリティ上の理由からユーザ名やパスワードは常にパラメーターを使用することを推奨
⇒securestring型やsecureObject型のパラメーターを使用することでデプロイ後の読み取りを防ぐことが可能

### パラメーターで使用可能なプロパティ
```:JSON
"parameters": {
  "<parameter-name>": {
    "type": "<type-of-parameter-value>",
    "defaultValue": "<default-value-of-parameter>",
    "allowedValues": [
      "<array-of-allowed-values>"
    ],
    "minValue": <minimum-value-for-int>,
    "maxValue": <maximum-value-for-int>,
    "minLength": <minimum-length-for-string-or-array>,
    "maxLength": <maximum-length-for-string-or-array-parameters>,
    "metadata": {
      "description": "<description-of-the-parameter>"
    }
  }
}
```
**・parameter-name**
デプロイ時にここで決めたパラメーター名を指定することで値を設定できる
**・type**
入力するパラメーターのデータ型を指定
　-array：配列
　-bool：ブール値(true/false)
　-int：整数
　-object：オブジェクト(key: valueで構成され名前やIDなど細かい内容を定義可能)
　-string：文字列
　-secureObject：セキュリティで保護されたオブジェクト(デプロイ履歴やログに記録されない)
　-securestring：セキュリティで保護された文字列(デプロイ履歴やログに記録されない)
**・defaultValue**
既定値であり、デプロイ時にパラメーターを指定しなかった場合に適用される値
**・allowedValues**
パラメーター入力時に入力できる値を定義
**・minValue/maxValue**
入力可能な最小値と最大値を定義(整数型使用時に設定可能)
**・minLength/maxLength**
入力可能な文字数を定義(配列と文字列型使用時に設定可能)
**・description**
ポータル上でデプロイする際に、表示される注釈
例) "description": "Storage Account type"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/2b0a61f3-cc50-497c-29f9-62132578f0ab.png)

## 次の学習内容
**◆Bicepテンプレート**

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

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
未経験にオススメ！ハッカソンの魅力

# はじめに
この記事は[**ハッカソン Advent Calendar 2022**](https://qiita.com/advent-calendar/2022/hackathon)の1日目の記事です。
記念すべき1日目は、**ハッカソンの魅力**について書きます。

## なぜアドカレを作ったか？
1日目なので、**アドカレを作成した理由**を話そうと思います。
大きく分けて**3つ**あります。
### 1. ハッカソンの魅力を伝えたい
**ハッカソン参加**は、多くのエンジニアにとって**有益**だと思っています
ハッカソンを知らない（出たことない）人が読んで、参加する**きっかけ**になってくれれば嬉しいです
### 2. 初心者の後押しをしたい
私はこれまで10回程度ハッカソンに参加して、だんだんと**受賞**もできるようになってきました
もちろん受賞がすべてではありませんが、成果が認められると**達成感**が増します
**開発初心者向け**に、どうすれば**良いプロダクト**を発明できるかを説明します
### 3. 完走賞欲しい！
**欲しいです！**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/08bcb5f5-3dbb-ccc8-6fcd-be5469cd45c9.png)


# そもそもハッカソンって何？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/825715af-ea0f-88e9-901c-8e04ff047b5e.png)

「**ハック**」と「**マラソン**」を組み合わせた造語です。
決められた期間内で、アプリを**チーム開発**し、その成果を競い合う**イベント**です。

# ハッカソンの魅力
**ハッカソンの魅力**は、たくさんありますがその中で私が感じる大きな魅力を**3つピックアップ**します！

## 1. 開発スキルが身に付く
まず一番に挙げたいのは、自身の**開発スキル**が**向上**することです
開発スキルだけでなく、**企画**・**プレゼン**スキルも身に付きます
基本的に**開発サポート**をしてくれる方がいるので、**初心者でも安心**して参加できます！

## 2. たくさんの人と交流できる
社外（学外）の人と**交流**することができます
私もたくさんの人と交流し、いつも**良い刺激**を受けています！

## 3. 色々もらえる
受賞すると**景品**をもらうことができます
また、参加賞があるハッカソンもあります！

### 【参考】Digital Hack Day 2022のノベルティ

https://twitter.com/rarpipipi/status/1570247239737708545?s=20&t=AF8RZ4tGqsambh_U8Pct7g

# おわりに
**ハッカソン**に興味を持っていただけましたか？
明日以降は、**初心者の方**がハッカソン参加する際、**役に立つ**記事を書いていく予定です！
ドットファイルに入門する

【完走賞】MxShun ひとりマラソン 🏃 Advent Calendar 2022 毎週水曜日は Advent Calendar を機になにかに入門しよう！2記事目です。

転職をし開発環境が Mac になったことを機に、先週は Zsh プラグインに入門しました。同じ理由で今回はドットファイルに入門してみます。
というのも、Mac ではシンボリックリンクが使えるのでドットファイル管理リポジトリとシームレスに調整ができるうまみが大きいからです。

https://github.com/MxShun/dotfiles

### 管理するファイル
実際にユーザディレクトリ下にあるバージョン管理したいドットファイルを洗い出します。
VSCode や IntelliJ IDEA など、バージョン管理しなくてもサービスごとに設定が同期されているものは省きました。結果、ドットファイルとして管理したいものはそーんなになかったですね。

- `.gitconfig`
- `.vimrc`
- `.zshrc`（ Mac 用）
- `.bashrc`（ Windows 用）

### インストーラー
ドットファイル初期導入・更新用のシェルを用意しました。

`uname` コマンドを活用し、Windows と Mac それぞれ個別のセットアップも定義しています。

```bash
#!/bin/bash
set -eux

BASEDIR=$(dirname $0)
cd $BASEDIR

git pull

files=`find . -mindepth 2 -type f -name ".*" -not -path ".git/*"`
if [ "$(uname)" == "Darwin" ]; then
    for file in $files; do
        [[ $file == "./bash/.bashrc" ]] && continue

        ln -snfv ${PWD}/$file ~/
    done
elif [ "$(expr substr $(uname -s) 1 5)" == "MINGW" ]; then
    for file in $files; do
        [[ $file == "./zsh/.zshrc" ]] && continue

        cp ${PWD}/$file ~/
    done

    # Colorscheme for Mintty
    curl https://raw.githubusercontent.com/mavnn/mintty-colors-solarized/master/sol.dark > ~/dev/theme/mintty-colors-solarized/sol.dark
else
    echo Do not supported
fi

# Colorscheme for Vim
curl https://raw.githubusercontent.com/altercation/solarized/master/vim-colors-solarized/colors/solarized.vim > ~/.vim/colors/solarized.vim
```

一旦雛形はできたので、引き続き更新をしていきます。
VSCode Remoteで開発中に、ブラウザの画面から直接ReactコンポーネントファイルをVSCodeで開く方法

こちらは金属加工プラットフォームを開発・運用する[Catallaxy](https://catallaxy.me/)の[Catallaxy Advent Calendar 2022](https://qiita.com/advent-calendar/2022/catallaxy)の12/5の記事となります。

## 背景

もともと以下のTwitterの投稿見て便利そうなので導入しようと思ったのですが、

https://twitter.com/housecor/status/1594348217625628674?s=20&t=y-b2o_GXzvErSSZr-uQWRg

LocatorJSが対象としているファイルパスはローカルPCのパスなので、Remote SSHを使って開いているVSCodeのファイルが開けず困った、となって少し調べました。


結論から書くと、Remote SSHを使ってVSCodeでリモートファイルを開いている場合でも問題なく使えたので、設定方法を書いておこうと思います。

## LocatorJSのインストール

もしローカルPC上のReactコンポーネントファイルを対象としている場合、LocatorJSのChrome拡張をインストールするだけでOKです。上記Twitterの動画にあるように、`Alt`を押しながら画面上のコンポーネントをクリックすると、VSCodeの当該コンポーネントファイルが開くはずです。

## Remote SSHのファイル用設定

Remote SSHでリモート環境のファイルをVSCodeで開いている場合は、拡張機能 > LocatorJSを選択して設定を開きます

![LocatorJS-settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187353/364c8a96-1d95-509c-cb8a-3604b785932b.png)

デフォルトでは上記のように、VSCodeのローカルファイルパスを取得するようになっているので、上記設定で「Custom link」を選択後、リンクを以下のように置換します

```
vscode://vscode-remote/ssh-remote+{HOST}/path/to/${projectPath}${filePath}:${line}:${column}
```

{HOST}の部分はsshで接続しているホスト名を入れて、`/path/to/${projectPath}`の部分は適宜プロジェクトに合わせて置換すればOKです。うまく動作している場合はブラウザからLocatorJSで当該コンポーネントをクリックした場合、既存Remote SSHのVSCode上で当該ファイルが開くはずです。

ファイルパスの設定がおかしい場合は、remote SSHのwindowが毎回新規に立ち上がるようです。

以下、Next.jsのexamplesのblogをローカル環境で動かした際の様子ですが、`Alt`を押しながらマウスを動かすと赤い枠線がコンポーネントの周りに表示されて、LocatorJSが動いている様子が分かります。LocatorJSで画面から当該コンポーネントをクリックすると、該当するファイルをVsCodeで開けます。

![locatorjs.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187353/98fc8b2b-5912-f30a-bccf-a21e38e20233.gif)


## まとめ

LocatorJSを使うと、開発中のブラウザ画面から、chrome devtoolを使う感覚でReactの当該コンポーネントファイルをVSCodeで開けるので非常に便利です！ぜひ活用してみてください。

参考
- https://github.com/microsoft/vscode-remote-release/issues/4779
ソフトウェアエンジニアが起業してCEOになった話

株式会社アンチパターンの小笹([@yuki.ozasa](https://twitter.com/yukiozasa))です。
CEO兼VPoEという肩書きを自称し、日本CTO協会では法人会員兼コントリビュータとして活動させていただいております。

機会を賜りましたので、日本CTO協会の新しいバリューに沿ったエピソードをお伝えできればと思います。

それは一ソフトウェアエンジニアであった私が2019年7月に起業するまでに至ったお話です。
自分にとっては自然な流れで起業していますが、*Give First*ということで書かせていただきます。

## ソフトウェアエンジニアになってからCTO見習いになるまで

中高キリスト教系の学校に通っており、チャプレンの方からいただいたユング心理学の本にを読んだことをきっかけに、大学時代には心理学を学んでいました。
大学で学んだりサークル活動など仲間と共に過ごしたりする中で、自分自身が目指したいのは個性が発揮されて個人が輝くような社会であると感じるようになりました。
そのためには人々が多くの時間を費やす「働く」ということがもっとポジティブなものとして捉えられるような社会にしたいと思いました。
一時は専門職に就くことも考えましたが、そういった考えが芽生えたため、ビジネスの世界に飛び込むことにしました。

結果、BtoBマーケティングを変革し「働く」を変えるといったような理念を持ったベンチャー企業に新卒で入社いたしました。
この時点では、ソフトウェアエンジニアリングには触れてもいなかったのですが、内定者アルバイトでマーケティングSaaSのカスタマーサポートを経験したことでソフトウェアへの関心が高まり、自ら勉強をし始めました。

勉強をしてみると、今まで社会の中で見えてこなかった世界が一気に広がった感覚があり、のめり込んでいきました。
当時ソフトウェア開発の内製化PJなども担わせていただき、組織拡大の機運も高かったことで早くからマネージャの職にも就かせていただきました。

思い起こせば、2015年か2016年あたり、当時アパレルテック系企業のCTOとしてイベントに登壇されていた今村さん(BuySell Technologies 取締役CTO / 日本CTO協会理事)のお話をお聞きして、CTOという役職を初めて知りました。
経営とテクノロジーを繋げる役割はどちらにも関心の強かった私からして魅力的であり、それからは「CTO見習い」という肩書きで活動するようになったことを覚えています。

## 起業の契機

起業の一つの契機になったと今思うのは「CTO見習い」として参加させていただいたAWS re:Inventです。
そこにはソフトウェアエンジニアリングとビジネスが一体となり、熱狂している様相が見て取れ、海外、特に米国との圧倒的な差を見せつけられたような気がいたしました。
発表される新サービスも自分たちではまだ活用に至れないような先進的なものばかりで、ワクワクと同時に付いていけていない自分に焦りを感じたことを覚えています。

そんな体験ののち、帰国をし、マネージャとして活動していました。
その頃には組織外のエンジニアやエンジニアマネージャ、CTOとも交流させていただく機会が増えていました。

現場の不満や経営者への啓蒙活動の苦労など、色々な話を見聞きしてきました。
交流をする度に自分はこのままここにいていいのだろうかと疑問が強くなっていきました。

そんな違和感がずっと続いている中で、同僚とも話し込み、自分が成し遂げたいと思っていることは何なのか言語化するワークを長い時間をかけて行いました。
そこでまとめてきたものが「**日本のソフトウェアエンジニアを憧れの職業へ**」という現在の会社で掲げている理念です。

この理念を実現するのには自分たち自身で社会を変えていく必要があると考え、まずは自らがビジネスを興すために起業をすることにしました。
*Think Big, Start Small* というには、大きな一歩だったような気もします。

なお、起業に関して言えば、身の回りに起業経験者が多いと起業しやすいというデータもあるようです。
(馬田隆明さんによるこちらの[記事](https://blog.takaumada.com/entry/career-and-entrepreneurship-education)で取り上げられています)
私の場合、父母とも起業家であることもあり、自分の成し遂げたいことが見つかった時に起業するという手段を通じて社会へ発信していくことは自然なことでした。

## 現在感じている課題

そのような流れで、2019年7月より、理念を掲げ、ビジネスを作り、組織を作り、資金を集め、多くの方のご支援を賜り、何とか起業家として活動しています。
*Fail Fast, Learn Fast* として、色々なことにチャレンジし失敗を含めて血肉とする日々であります。

さて、改めて、自分自身が経営者となり、一スタートアップとしてVCの方々をはじめとするある種の資本市場と向き合ったり、同じ経営者との交流をする中で感じるのは、「**ソフトウェアエンジニアリングを理解した経営者が少ない**」ということです。
海外で活躍する起業家にはエンジニアリングを理解していると思しき方々がいらっしゃるように見えます。
(シンクエージェント株式会社の[記事](https://engineer-shukatu.jp/column/archives/26155)より)

**“Software is eating the world”** と言われてから早10年、
私たちの社会はソフトウェアによって成り立っているといっても過言ではない状況かと思います。

当然、ソフトウェアを扱ったビジネスも増えてきています。
しかしながら、経営者の多くはソフトウェアエンジニアリングに向き合っていることは少なく、また、ソフトウェアエンジニアもビジネスと向き合っていないと思うことが多々あります。
餅は餅屋と決め込み、半ば無関心になってしまっているように思います。

そんな中、CTOという役割はその橋渡しとして経営にもテクノロジーにも責務を負う重要なものであると考えています。
そういった意味では、もっとソフトウェアエンジニアリングやテクノロジーの話だけじゃない経営の話をできるコミュニティに日本CTO協会がなれればと考えており、少しでもその力になれればと思っております。

なお、個人的には経営者がソフトウェアエンジニアリングを学ぶよりも、ソフトウェアエンジニアリングの知識を持った人が経営を学んでいく方が早いのではないかと思っています。

そういった考えもあるので、もっと気軽に起業について考えてみてもらいたいなと思いますし、真剣にビジネスに向き合ってほしいなとも思っています。

## 終わりに

この文章は数年ぶりに参加しているAWS re:Invent 2022の現地会場で執筆いたしました。
私も未熟者でありますが、起業の契機になったイベントで、改めて*Always Day One*を意識して精進して参りたいと思っています。

ここまで読んでくださった方、ありがとうございました。
BigQueryで構造体の各フィールドを展開したテーブルを作成する方法

まず以下のような構造体からなるテーブルを考えます。

```sql
with t as (
  select struct(1 as hoge, 2 as fuga) as s union all
  select struct(3, 4) union all
  select struct(5, 6)
)
```

この構造体の各要素を列として取り出すにはどうすればよいでしょうか？
素直な実装は以下のように　`.` で各要素を取り出すことです。
しかし、この方法では要素が多くなった時に煩雑です。

```sql
select s.hoge, s.fuga from t
```

BigQueryのSQLには `select as value` という記法があるので、これを使うと簡単に構造体の要素を展開できます。
この方法は構造体の要素名を明示的に指定していないので、要素の増減があっても変更する必要がないです。

```sql
select as value s from t
```
OSI参照モデルL2〜L4層

- L2：データリンク層
    - 隣接するコンピュータ同士を接続
    - イーサネット（有線）・LAN（無線）で接続
    - ポイントは、L2はローカル通信であること
- L3：ネットワーク層
    - IPを使用してコンピュータ同士を接続
    - ルータを使用し、隣接してない離れたコンピュータに接続できる
- L4：トランスポート層
    - WebサーバとDBをつなぐ
    - 代表的なプロトコル2つ
        - TCP
            - 確実に情報届けるけど通信速度遅い
        - UDP
            - 確実ではないけどとりあえず届ける、その代わり通信速度早い
LWCでテキストエリア項目、カスタム表示ラベルを改行させて表示する

改行を含むテキストエリア項目、カスタム表示ラベルをLWC、Visualforceなどで表示させようとすると改行せずに表示されてしまいます。
そのような時は下記のCSSを適用させることで改行を表示できます。長い英字も途中開業する場合は`overflow-wrap: anywhere;`。

```css
.textarea {
  white-space: pre-line;
}
```

![改行サンプル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125621/9da96aa3-6132-6e9f-f906-0fa4dd9e828c.png)

テキストエリア項目、カスタム表示ラベルの改行は[NBSP](https://ja.wikipedia.org/wiki/%E3%83%8E%E3%83%BC%E3%83%96%E3%83%AC%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9)として扱われます。

### 参考
- [white-space - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/white-space)
- [overflow-wrap - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/overflow-wrap)
- [word-break - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/word-break)
【All-in-One WP Migration】エクスポートエラー「Out of disk space. Unable to write content to file.」

## ****`Out of disk space. Unable to write content to file. File ~~`****

All-in-One WP Migrationを使ってデータのエクスポートをした際に下記エラーが出ました。

****`Out of disk space. Unable to write content to file. File ~~`****

→ディスク容量が不足しています。コンテンツをファイルに書き込めません。

## 原因

ディスク容量が不足

## 解決策

過去のいらないバックアップファイルを削除する
Blazor WebAssembly がセキュリティソフトによってマルウェア判定されるのを迂回する方法

## Blazor WebAssembly とは

Blazor WebAssembly とは、JavaSript を使わずに、C# (.NET) でクライアント Web アプリケーションを実装する技術、ないしはそのようにして作られたクライアント Web アプリケーションです。C# のソースコードを JavaScript にトランスパイルするのではなく、Web ブラウザ内の WebAssembly 上で .NET の MSIL 中間言語のインタープリタを稼働させ、**.NET のバイナリファイル (.dll) をブラウザ内でそのまま実行**することで実現されています (※近年は MSIL 中間言語バイナリを、さらに WebAssembly ネイティブにコンパイルする AOT 方式も選べるようになっています)。

このような仕組みなので、開発者ツールを開いた Web ブラウザで Blazor WebAssembly で作られたサイトにアクセスすると、その Blazor WebAssembly サイトを構成している **.dll ファイル群が次々とブラウザに読み込まれていく**様子を見ることができます (下図例。事前 Brotli 圧縮してあるため、拡張子が .dll.br になってますが)。

![movie-001.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58450/0656d6ce-aca6-5841-b048-f5b85479d2b8.gif)


## ウィルス対策ソフトによって読み込みが阻止される!?

しかしです。一部のウィルス対策ソフトやファイヤーウォール製品は、この Blazor WebAssembly サイトへのアクセスを阻止してしまうようです。たしかに、普通は、Web ブラウザによって読み込まれるコンテンツは、HTML や CSS や JavaScript などといったテキストファイル類や、音声、動画、画像類などでしょう。そのような前提のところ、

**「拡張子が .dll で、しかも PE ヘッダ付きの、コンテンツ内先頭 2バイトが "MZ" で始まるようなバイナリ実行形式ファイルが、ブラウザによって吸い上げられているだとー!? これ絶対ヤバイって!」**

...というような感じに、ウィルス対策ソフトやファイヤーウォール製品によって判断されてしまうようで、結果、アクセスがブロックされてしまうことがあるそうです。

このような環境に向けては、Blazor WebAssembly サイトは供給できないのでしょうか? 諦めて、JavaScript で作り直すしかないのでしょうか? 😥

## BlazorWasmAntivirusProtection NuGet パッケージを使えば OK!

幸い、この状況には簡単な回避策があります! **"BlazorWasmAntivirusProtection"** という NuGet パッケージを、その Blazor WebAssembly プロジェクトに追加すればよいのです。

https://github.com/stavroskasidis/BlazorWasmAntivirusProtection

この NuGet パッケージをプロジェクトに追加してあるだけで、そのプロジェクトを発行すると、発行結果に以下の加工がなされます。

- .dll ファイルの拡張子を .bin に変更
- .dll ファイルの内容を所定のキーバイト列によって XOR 反転

さらに、このように加工された .dll ファイルであっても読み込んで実行できるよう、そのための Blazor WebAssembly のブートローダーもちゃんと自動で構成されます。

結果、各種ウィルス対策ソフトやファイヤーウォール製品は、「なんかよくわからないけど、何かのバイナリデータが流れてるようだな、まぁ、大丈夫っぽいな」と判断してくれるようで、これで無事、Blazor WebAssembly サイトが必要なコンテンツをちゃんと吸い上げて正常稼働できるようになるわけですね。

## まとめ

このように、開発者は手放しで、NuGet パッケージを 1 個追加するだけで、Blazor WebAssembly がセキュリティソフトによってマルウェア判定されるのを迂回できるんですね。

幸いにして自分はまだ、このような対策の必要に迫られたことはなく、BlazorWasmAntivirusProtection NuGet パッケージを本格的に使用・利用したことはありません。とはいえ、この先将来、もしかしてもしかすると、お世話になることがあるかもしれませんよね。もしものときに備えて、覚えておきたいと思います。
【Microsoft】PowerPagesでif文を用いたデータ列の作り方

Power Pagesとは、2022年10月12日にローコード・ノーコードでビジネス向けWebサイトが作成できるツールとしてMicrosoftからリリースされたアプリです。今回は、このサービスを利用するにあたって、if文を用いたDBのカラムの設定方法についてまとめました。

if文を用いることで自動で計算した値を入力するカラムを作成することが出来るため、主に**更新日付**や**削除日付**などのカラムを作成する際にとても便利です。

# 削除日付を作成する
今回は例として、レコード（行）が論理削除された場合の日付を自動的に入力するカラムを作成しようと思います。


## やり方
メニューからデータ設定画面を開いて、新しい列を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/49510dc8-438f-fbcd-8678-7b6c4e719734.png)


表示名などの基本的な項目を入力します。
今回は削除日付のカラムを作成するため、型を「日付と時刻」にしていますが、データの種類や書式は、なんでも構いません。

<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/cc63c0d2-b9ac-aa60-d05d-da3e5aaa9202.png">


次に、**動作**項目を**計算**に設定します。
すると、「計算を編集する際は、まず列を保存します。」という表示が出ると思うので、必要な項目を入力した上で一度保存します。
<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/73fa2f12-52c3-7c19-fca1-ce01a2b8e6af.png">

保存すると、別ウィンドウか別タブで以下の画面が開きます。
ここでif文の条件分岐を入力します。

<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/a4e19514-8eaf-8515-82dd-b54430560a79.png">

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/dd6054c1-2fc7-f00f-c770-4a3fc02ddae9.png)

入力画面はこのような感じで、プルダウンで選択肢が設定出来るためプログラミング経験がない方でも扱えるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/b27ef2e3-ae72-1d5a-7eaa-50879c48208d.png)

今回は削除日付を作成したいため、デフォルトで存在している**ステータス**のデータが**非アクティブ**になったら**現在日付**を入力するという条件文を作成しようと思います。

以下のような条件文になりました。
<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/ba44d056-4431-2b67-3694-ff3f3452df95.png">

左上の「保存して閉じる」ボタンを押して設定は完了です。

データ設定画面に戻ると1番右の列に「削除日付」が追加されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/6f732541-0e5c-48f7-1ff1-c6b46c75ae28.png)


# 動作確認
最後に実際にうまく入力されているかテストします。
「その他の26件」からステータス列を表示させて、こちらのデータを**非アクティブ**にしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/c89a3a12-7d1e-6e4e-63d3-7741becc330f.png)

「非アクティブ」にすると同時に「削除日付」の値が自動的に入力されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/4e22b037-700d-d441-f87e-39a411bab236.png)


# まとめ
以上、PowerPagesでのif文を用いたDB定義の作り方でした。
プログラミングを行なったことのない方でも扱いやすいUIで、うまく使いこなせればやや複雑な条件文も書くことができそうです。
fvmを使ってFlutterプロジェクトを作成する

* fvmで管理したい
* リポジトリ名はハイフン区切りにしたい

新規でFlutterプロジェクトをつくるにあたって、上記の要件を満たすようにしたかったのですが、意外とつまずく点が多かったので共有します。

## コマンド
```zsh
$ mkdir sample-app
$ cd sample-app
$ fvm use 使いたいversion --force
$ fvm flutter create . --project-name sample_app --platforms android,ios --org com.sampleapp -e
```

### fvm version指定
通常、useコマンドは既存のflutter projectでしか使用できないが、
`--force`フラグを使用することでflutter project以外のディレクトリでも使用可能になるみたいです。

ちなみに
`$ fvm install インストールしたいversion`で特定のSDKバージョンをインストールでき、
`$ fvm list`で現在インストールされているバージョン一覧を確認できます。

### flutter project作成
* ポイント① `fvm flutter create .` 
`fvm flutter create sample-app`としてしまうと`sample-app/sample-app`という構成になってしまうので注意が必要です。

* ポイント② `--project-name sample_app`
Flutterアプリのパッケージ名に使う区切り文字にハイフンは使えないため、リポジトリ名をハイフン区切りにしたい場合はproject-nameでアンダーバー区切りを指定する必要があります。

* ポイント③ `--platforms android,ios`
platformsを指定しないとweb,macos,linuxも対象になってしまうので、必要なプラットフォームだけ指定してあげたほうが無駄なファイルが生成されずに済みます。

* ポイント④ `--org com.sampleapp`
任意の名前にドメイン指定できます

* ポイント⑤ `-e`
これを指定することでデフォルトで作られるSample実装や大量のコメントを消す作業がなくなります。

https://twitter.com/biz84/status/1663204152032231425

## おまけ：version指定前にやっておきたいこと
version指定する際はなるべく最新版を使いましょう！

```
fvm releases
```
とコマンドを打つとリリースされているバージョン一覧が表示されるのでstableのversionを記憶しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670405/0c1823a0-02ed-a3df-2d4e-bcce6fb50960.png)

あとは
```
fvm install 使いたいversion
```
でインストールして
```
fvm use 使いたいversion -force
```
or
```
fvm global 使いたいversion
```
すればOK

### そもそも最新バージョンを調べるのがめんどくさい方へ
最新バージョンを調べるのがめんどくさいときは
```
$ fvm use stable --force
```
が便利です！ 現時点での最新の安定版バージョンをインストールできます。
インストールしますか？と聞かれたら、Yesを選べばインストールもしてくれます！


### 参考にしたURL
https://zenn.dev/susatthi/articles/20220410-064851-package-naming

https://qiita.com/Slowhand0309/items/0767abee120fcb3ba0b4
EDA は仮説生成が大事

# よくある新人と先輩の風景

データ分析/AIの PoC で、新人に「データを増やしてください」と言われたことはないでしょうか？

たとえば、こんな感じ。

新人「いただいたデータを〇〇（バズったアルゴリズム）にかけました。Accuracy が〇〇%でよくありません。データ量が足りないからだと思います。データを増やしてください」


先輩「〇〇（オシャレなアルゴリズム）の前にさ、データはちゃんと見たの？」

新人「いえ、でも〇〇なら、みんな使ってるし、データ量の問題だと思います」

先輩「アルゴリズムとデータ量の前に、損失関数を最小化する特徴量を見つけないとダメなんじゃないの、って言ってんの」

新人「でも、データ量を増やすのも、施策のひとつですよね」

先輩「君は、自分の仕事をやりきる前にお客さんの工数を使え、って言ってんだよ。そんなこと言って競合に変えられたら、どうするの？　部長に説明できる？」

新人「できないです・・・　でも、具体的にどうしたらいいんですか？」

先輩「いろいろな可視化の手法をためして、試行錯誤しなよ。それが君の仕事だよ」


世の中的には、すぐれた手法がたくさんあります。

しかし新人がよい分析結果を出せるかというと、時間がかかるのではないでしょうか。

どうやったら効率的に進められるか、というと、タイトルの通りなのですが、EDA の話をツラツラとポエムしてみたいと思います。




# 今どきのデータは、仮説検定がやりづらい

AI 案件の採用面接をしたことがありました。正解率がでなくて困ったらどうするか聞くと、よく返ってくるセリフの一つが

「お客様の業務をよく聞くこと」

でした。

私は、この答えを聞くと、「AI と IT の違いを考えてないのかなぁ」と思ってしまいます。

ポイントは、①完璧じゃないこと、②多次元性、の2点です。

## 完璧じゃないこと

True/False できれいに答えが出るシステム開発ならそれでいいんですけど。AI はたいていの場合でだいたいうまくいくやり方です。完璧じゃありません。

お客様が教えてくれる「お客様の業務」は、正確な答えじゃありません。

アンケートで１０段階評価をすれば参考になるかもしれませんが、正確さに欠けます。

データでの裏付けがないと、正しく理解したとは言えないのではないでしょうか。

## 多次元性

正確さを欠いた情報を仮説にしてしまえば、少しはやりやすくなります。教科書的には仮説検定にもっていって、仮説の成否を見ればよいハズ。

仮設検定の典型的な使い方は、科学的な実験で、
1. コントロール可能な変数と目的変数を観察する
1. １〜３個くらいまで説明変数を絞り込む
1. 実験をする
1. 仮説の成否を確認する
というやり方ではないでしょうか。

仮説が成り立たない場合、仮説そのものが間違っていたか、ランダムではなかったり、別仮説（別変数）の混入の可能性があります。

昨今のデータは、多次元量になっています。人間は完璧ではないので、変数の量が多くなると見逃してしまいがちです。

## 意外と多い？　テキトー項目データ

さらに、目的を考えずに、「とりあえず、取れるだけ取ってみましたー」みたいなデータが意外と多くないでしょうか。私も痛い目を見たことが何度かあります。

これも一種のノイズが混入しやすく、仮説検定を扱うには、厄介な問題ではないかと推測しています。


# 歴史的背景

歴史を振り返ると、探索的データ分析は、統計的仮説検定の偏重への警鐘と、その対策として提示されたようです。

以下、[Wikipedia の統計的データ解析](https://ja.wikipedia.org/wiki/探索的データ解析 "統計的データ解析")から「展開」の項を抜粋します。

> テューキーは、統計学においては統計的仮説検定（確証的データ解析）が重視されすぎており、データを用いて検定すべき仮説を示唆することにもっと重点を置くべきと主張した。

要は、データから仮説を出そうよ、ってコンセプトですね。

このコンセプトは、多次元化したデータ、テキトー項目データを扱うときには、とくに有効と思いますが、いかがでしょう？

# EDA を実施する、効率的なやり方 -仮説生成-

それでは、どのように仮説を検証していけばよいでしょうか。

データの項目から仮説を出す例がありました。

https://www.analyticsvidhya.com/blog/2020/11/an-efficient-way-of-performing-eda-hypothesis-generation/

仮説を出した後に、可視化へと進めています。


# さらに効率的なやり方　-ビジネスとデータの解像度をあげる-

データだけを見て業務担当に見せると、「そんなの当り前」と言われてしまうことがあります。昔の部下がやってました。

結果、「ビジネスとデータ、両方大事」という、いつものオチになってしまいがちです。

しかし、現実の仕事で顧客のヒアリングと EDA をまわしていくのは、かなりのパワーが必要ではないでしょうか。

解決策の方向は二つあると思います。一つはツールに頑張ってもらう。もう一つは重要なところを早く見つける。

前者は、いくつかツールが出てきているようです。アドベントカレンダーで触れる予定です。

後者は、ビジネスとデータを行き来しながら、解像度をあげていきます。この考え方は「解像度を上げる」というスライドに、深さ、広さ、構造、という３つの考え方が出てきます。

https://speakerdeck.com/tumada/jie-xiang-du-wogao-meru?slide=14

データ分析においての、深さ、広さ、構造は、なんでしょうか？

例えば

- 深さ：　現場でデータが生成される場面を見学する。リモートで工場見学をする。
- 広さ：　データが生成される、仕事のプロセスを確認する
- 構造：　用語集を作成し、業務の概念とデータのカラムの関係を整理する

などがあるかもしれません。

分析麻痺症候群に気をつけながら、分析の目的に関係ある箇所に注目します。そこを深堀りしていき、仮説を作成します。

無駄な作業を避けながら、重要なところだけをピックアップすれば、より効率的になるでしょう。

このやり方はジュニアには難しいものの、ビジネスとデータ分析の経験が一定以上あると、こちらの方が早いです。また、マネジメントする人はビジネスの仮説を出し、ジュニアにはデータから仮説を出す、という役割分担をすると、納得感をもって仕事を進めてもらえるようです。

まぁ、私だけの特殊事例かもしれませんが、うまくいった方はコメント欄で教えてください。
WebRTCについて

備忘録

## WebRTCとは
- P2P通信を前提としたRTC
- 音声/動画やデータのやり取りができる
- 通信方法のみ規定
- 通信内容は全て暗号化(DTLS)される
- シグナリングについては規定なし

## 開始までの流れ
1. シグナリング(やり取りの方法の決定・接続候補の交換)
2. 接続試行(接続候補を元に通信可能な経路を探す・一番良さげな通信経路の決定)
3. P2P通信開始

## シグナリング
- 通信経路の決定(SDP)
- 経路候補のやりとり(ICE Candidate)
- RFCで規定はされていないので、方法は自由
- WebSocketを使う方法が多い

## NATがある場合のP2P通信の方法
NATがあると、端末単体ではP2P通信が開始できないのでいくつか仕組みがある
- STUN: Traversal Using Relay around NAT
- TURN: Session Traversal Utilities for NATs
【Lambda functions URL】IP制限をかける方法（Python）

# はじめに

Lambda functions URL を使っていて IP 制限をかけたいと思って IAM ポリシーで色々試してみたもののできませんでした。

無理くり Lambda 内で実装したので、その方法を共有したいと思います。



# 環境変数

環境変数に```IP_RANGE```=```'['111.111.111.111', '222.222.222.222']'```を設定する。

# ソースコード

```python
import json
import os
import ast

# IPアドレスチェック
def check_ip(IP_ADDRESS, IP_RANGE):
    valid_ip = False
    if not valid_ip and IP_ADDRESS in IP_RANGE:
        valid_ip = True

    return valid_ip


def lambda_handler(event, context):
    IP_ADDRESS = event["requestContext"]["http"]["sourceIp"]
    IP_RANGE = ast.literal_eval(os.environ.get("IP_RANGE", "[]"))

    valid_ip = check_ip(IP_ADDRESS, IP_RANGE)

    if not valid_ip:
        return {
            'statusCode': 500,
            'body': json.dumps('500 Unauthorized')
        }

    return {
        'statusCode': 200,
        'body': json.dumps('200 Success!')
    }
```

# あとがき

参考までに、、API Gateway では 以下の記事のように IAM ポリシー で IP 制限をかけることができます。

* 特定の IP アドレスのみが API Gateway REST API にアクセスすることを許可するにはどうすればよいですか?
    * https://aws.amazon.com/jp/premiumsupport/knowledge-center/api-gateway-resource-policy-access/


# 参考
* GitHub (srcecde / aws-tutorial-code)
    * https://github.com/srcecde/aws-tutorial-code/blob/master/lambda/lambda_ip_val_func_url.py
* Whitelist IP addresses for Lambda function URLs
    * https://medium.com/srcecde/whitelist-ip-addresses-for-lambda-function-urls-8f69c8285e0a

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
【Swift入門】extentionについて

# extentionとは
・メソッドを用途別に分類して、ソースコードを複数のファイルに分けるためのしくみ
・エクステンションを利用すると、1つの大きなクラスをいくつかのファイルに分割して記述できる

# 使用例
例えば、
```swift:test.swift
class hoge { 
// プロパティの定義 　　
// メソッドの定義
} 
```
という記述を、

```swift:test.swift
class hoge { 
// プロパティの定義
} 
extention hoge { 
// メソッドの定義(1)
}
extention hoge { 
// メソッドの定義(2)
}
```
のように分けて記述することができる。
ちなみに、struct(構造体)やenum(列挙型)にも同様にextensionを用いることができる。
クリスマスも寂しくない！？会話AIアプリを作った


会話できる人工知能を作成するiOSアプリ「Eveki」を[App Storeにてリリースしました](https://textcheckai.page.link/jofZ)。
今回は機能や開発の経緯についてご紹介します。

[![黄 鹿 イラスト ビジネス ロゴ Twitterヘッダー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/713689/8409d1b8-d1b2-ddf0-a9b8-fe488391d8c5.jpeg)](https://textcheckai.page.link/jofZ)

# Evekiについて


## 会話AI

Evekiの主な機能は会話可能なAIを作成するというものです。従来のサービスだと自然な会話を行うまでにユーザーがトレーニングをしたり調整する必要がありました。これでは不便なので、Evekiでは作ってすぐ話せるような応答を可能にしています。

## 個性の構築

![スクリーンショット 2022-11-30 23.18.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/713689/11b18132-1040-50ef-91b5-36072de95f35.png)


もうひとつの特徴は個性を創造、再現できることです。好きなことや職業などを設定すればそれに沿った会話を行なってくれます。口調も数パターン用意しています。[^1] これらを活用することでアニメキャラや歴史上の人物などの再現も可能です。

## 設定の方法

個性の決め方は簡単で、SNSのプロフィールを決めるように「趣味」「職業・肩書き」などを日本語で入力するだけです。より多くの人が使えるように「プロンプト」などの専門用語は使わないようにしています。

## AIを共有

作ったAIは公開することもできます。そのため他の人が作成したキャラクターとの会話も楽しめます。[^2] もちろん非公開も選べますし、過激な発言[^3]はあらかじめ避けるようになっているので安心してお使いいただけます。会話も以下のように文章にしてSNSに投稿することができます。
![note　ノート　記事見出し画像　アイキャッチのコピーのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/713689/12979fa2-d967-13ce-b27a-d2a3eaa19df1.png)


## 機能制限など

AIの作成数や設定などに制限は設けておらず、すべての機能は無料でお使いいただけます。広告も設置していません。色々な人が作ったAIを見てみたいというのがその理由です。今後有料プランを追加することもありそうですが、その際でも新しい機能の提供という形をとる方針です。

# 開発について

## きっかけ

人工知能はここ数年で目覚ましく発展し、かなり身近なものにもなっています。しかしゲームや映画で見たようなAIとは少し違うような気がしていました。質問に答えてくれるのはもちろん嬉しいですが、冗談や皮肉を言うくらいの人間味[^4]は欲しいところです。Evekiはこれを目指しました。

## 使用技術

![スクリーンショット 2022-11-30 23.53.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/713689/44e49687-7601-4294-b1bf-5aae52869aec.png)

機械学習による応答の大部分はPythonで成り立っていますが、iOS側の言語処理を扱う箇所はSwiftで構築している部分もあります。アプリ本体はすべてSwiftを使っています。

フレームワークは全てSwiftUIを用いており、ライブラリもSwift Pacekege Managerでの管理に統一しています。どちらも比較的新しい技術ですが主要な機能はほとんど完成させられるようになってきたと思います。

## 今後の展望

まずはSiriのように音声を使って会話できるような機能を追加したいと考えています。現時点ではGoogleのCloud Text-to-Speechの導入を検討しています。会話データの記憶も管理して、同じAIでも会話するユーザーごとに違った反応ができるようにする構想もあります。もし質問や要望があれば下のフォームかコメントをお使いください。

- [お問い合わせフォーム](https://docs.google.com/forms/d/e/1FAIpQLScWUV4e2wWTTuOWsKPOaQjLscI2sK_j2-YOK-7iEdYSOAC0Yg/viewform?usp=sf_link)


# さいごに

まだまだ改善の余地はあるとはいえ、Qiitaを含めた先人の知恵のおかげで正式なリリースまで行うことができました。もし少しでも興味があればぜひ使ってみてください。

[^1]: デモ版ではお嬢様言葉を採用していました

[^2]: 同じキャラの再現でも人によって解釈が違うと面白い差が出るかもしれません。

[^3]: 性的な発言や差別的な表現はフィルタリングされています。

[^4]: 色々な作品が例に挙げられますが、一番は「火の鳥」のロビタのイメージですね。