OmniAICreator/Qiita-1.07M huggingface dataset:
IF関数の使い方(Excel)

エクセルのIF関数を勉強メモとして残します。
基本的に``関数の式の読み方``について書く為、ツールバーの``数式タブ``からのやり方は他の方の記事を参照下さい。

# ①IF関数の説明

IF関数の書く流れは主に3つに分かれています。
```ruby:IF関数
=IF(A：条件式,B：OKの場合,C：NGの場合)
```


A：指定のセルの値に対して``比較(例：A1>1)``したり``文字列を照合(例：A1＝"あ")``したりした結果
B：``OKの場合``に表示したいものを書いて
C：``NGの場合``に表示したいものを書く


# ②IF関数の注意点
・文字列を扱うときは``ダブルクォーテーション``で囲む
```ruby:IF関数(文字列)
=IF(A1="東京","東京です","東京ではありません")
```
・参照セルを固定にしてオートフィルを使いたい時には``絶対参照``を使用する(例：$A$1)
```ruby:IF関数(絶対参照)
=IF($A$1="東京",$A1,A$1)
参考：$A$1はA1を固定,$A1はAを固定,A$1は1を固定
```
・IF関数を``書いているセル``を条件式に入れない(``循環参照``になる為)
```ruby:IF関数(循環参照)
=IF(A1="東京","東京です","東京ではありません")
参考：上記の式をA1に書いていると条件式が成り立たず循環参照(何度も参照)してしまう
```


# ③IF関数を使う場面としては以下の業務があります
##### ・``条件に合う数値``のみ表示させたい
　(例：集計上``2個以上の値``のみ表示させたい時)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552137/bae2cc7b-e333-4751-1abe-a600dcc660aa.png)
##### ・対象のセルの数値が一目で正常かどうか``判断したい``
　(例：目標値2個に対して達成できているかの``OK/NG判定``)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552137/69f71a1d-4edb-5140-a724-482dbdd8b4dd.png)
##### ・条件に合う文字列の場合のみ``特定の文字列``を表示させたい
　(例：セルの値が株式会社〇〇の時は``東京都``と表示させたい)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552137/cc6a39ff-278b-2756-d909-b68121dfeac0.png)

# ④IF関数の応用や併用方法
##### IF関数の入れ子(応用)
表示させたいものが3パターン以上ある場合は下記の``C:NGの場合``の個所に
さらにIF関数を入れます(＝は入れない)
```diff_ruby:IF関数
-通常　➡ =IF(A：条件式,B：OKの場合,C：NGの場合)
+入れ子➡ =IF(A：条件式,B：パターン１,IF(A：条件式2,B：パターン２,C：パターン３))
```
##### IF関数の複数条件(応用)
条件が2パターンあり、その2つが``どちらもOK``の場合はAND関数
``どちらかOK``の場合はOR関数を使用する
```diff_ruby:IF関数
-どちらもOK➡ =IF(AND(条件式１,条件式２),OKの場合,NGの場合)
+どちらかOK➡ =IF(OR(条件式１,条件式２),OKの場合,NGの場合)
```
##### IF関数の複数条件(併用)
IF関数によりOK/NG判定をするときに外部の人が見てもわかりやすいように
下図のように色を変えると誰が見ても感覚的に判別できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552137/7d8c861b-8c27-7101-24d8-2aeae4778cd7.png)
このような``条件付きのセルの書式設定``を行う場合は下記5つの手順を行います。
　①ホームタブの条件付き書式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552137/6cb22c6e-f15c-d39c-2af9-ed6f6cfe4b36.png)
　②新しいルール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552137/04a27661-2f03-bacf-fc1f-885e54e31361.png)
　③指定の値を含むセルだけを書式設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552137/41e42ed7-5c72-a0eb-ceb0-cfa6bdd17f59.png)
　④特定の文字列
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552137/98ded5ee-ea1b-95de-4b46-4451e937f040.png)
　⑤条件の値(例：OK)を打ち込み書式ボタンから変更したい書式を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552137/ed374973-808a-1327-2d96-6cadd7ce89af.png)

# まとめ
エクセルのIF関数は使い方次第で``見やすい資料``や``誰が見ても良否が判別できる表``を
作ることができます。
ほかの関数を掛け合わせると更に多くの応用もできるので試してみてください。
【Swift】ループ内を並列処理する

# はじめに
DispatchQueueを使用しての並列処理の例はいくつも出てきますが、Swift Concurrencyでの並列処理の例はなかなか見つからなかったので記事にしておきます。

# DispatchQueue
```swift
func sample1() {
    let dispatchGroup = DispatchGroup()
    let dispatchQueue = DispatchQueue(label: "sample", attributes: .concurrent)
    for i in 0..<10 {
        dispatchQueue.async(group: dispatchGroup) {
            Thread.sleep(forTimeInterval: TimeInterval(Int.random(in: 1...10)))
            print(i)
        }
        Thread.sleep(forTimeInterval: 1.0)
    }
}
```

# Swift Concurrency
```swift
func sample2() async throws {
    try await withThrowingTaskGroup(of: Void.self) { group in
        for i in 0..<10 {
            group.addTask {
                try await Task.sleep(until: .now + .seconds(Int.random(in: 1...10)), clock: .suspending)
                print(i)
            }
            try await Task.sleep(until: .now + .seconds(1.0), clock: .suspending)
        }
    }
}
```

# 参考記事
https://qiita.com/uhooi/items/1d2c94df69c75fcfbdbf

https://zenn.dev/koher/articles/swift-concurrency-cheatsheet
UnrealEngine(4.27)でSemanticSegmentation画像を生成①


# 概要


UnrealCVというプラグインを用いてUnrealEngine(Ver4.27)で下図のような
SemanticSegmentation画像をCG空間から取得する方法を説明していきます。

![mask.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2922354/594f47dc-f309-73a1-e65d-acac6d063726.png)

今回は環境設定から簡単な取得方法までを説明していきます。

# 目次
- 実行環境
- UnrealCVとは?
- プラグイン取得
- VisualStudioで再ビルド
- Segmentationの取得
- 終わりに

# 実行環境

~~~
Python 3.7.13
UnrealCV 0.4.0
~~~
上に加えてUnrealEngine4.27とビルド用にVisualStudioを用いています。
またUnrealEngineは2022/10/20時点でVer.5.0がリリースされていますが、UnrealCV側が未対応のため、
対応中で最新の4.27を用いています。

# UnrealCVとは
UnrealEngineから原画像、Segmentation画像、Depth画像を手軽に取得できるプラグインです。
現実で取得が難しいシーンや面倒なSegmentation画像作成を自動でできる点で非常に優れています。
[論文](https://arxiv.org/abs/1609.01326)も無料で読めるので興味があればぜひ読んでみてください。

# プラグイン取得
それでは早速環境を設定していきましょう。
まずはライブラリを取得していきます。最新版をインストールして特に問題ないと思います。
~~~
pip install unrealcv
~~~
次にプラグインを[Github](https://github.com/unrealcv/unrealcv/tree/4.27)からダウンロードします。
このときtreeが4.27になっていることを確認してください。
ダウンロードできたらファイルを解凍してbuild.pyをたたきます。
~~~
python build.py
~~~
実行すると文字がたくさん表示されて、終わりに「BUILD FAILED」と表示されます。
表示の通りビルドが失敗しています。
ここで学部生時代躓いて2日ほど無駄にしたので、ここからが本記事のミソです。
実はbuild.pyを実行した後「Plugins」フォルダが生成されています。
このフォルダを用いてビルドを完了させていきます。

# Visual Studioで再ビルド

まずはVisual Studioで新しいプロジェクトを作成します。
そして作成したプロジェクトの中に先ほどのPluginsフォルダを移動させます。
そしたらVisual Studio側からビルドを実行します。
実行後Pluginsフォルダを潜っていき、「HostProject」をクリックしてUEのProjectを起動させます。
このとき複数のUEのバージョンをダウンロードしていると選択画面が表示されるので「4.27」を選択してください。
以上で環境設定は完了です。
ほかのプロジェクトで使用する場合は「HostProject」と同列にある「Plugins」をほかのUEのプロジェクトファイルに
コピーして使用してください。

# Segmentation画像の取得

それでは実際に使用してみましょう。
下図のように適当にオブジェクトを配置します。

![スクリーンショット 2022-10-20 221622.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2922354/52e2cbca-553e-2386-2de1-c3e2f0a7406a.png)

プレイを押してゲーム画面をクリックしゲーム内に入り、「`」キーを2回おして以下のコマンドを入力します。
~~~
vget /camera/1/lit lit.png
vget /camera/1/object_mask mask.png
~~~
そうすると以下の画像を取得できます。
![lit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2922354/db6bbd63-5fdd-8bb6-0537-bb8e32ba352b.png)
![mask.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2922354/594f47dc-f309-73a1-e65d-acac6d063726.png)
# 終わりに

UnrealCVの環境構築を紹介しました。
CGを用いてのSegmentatino画像の取得は様々な用途で使用できるので興味があればぜひ使ってみてください。
Qiita初投稿で伝わりづらい部分があると思いますので、わからない箇所は質問いただけると幸いです。
また上で紹介したコマンドをたたくだけでは実用的でないので、Python、ブループリントを用いて
自動で取得できる方法を随時紹介していこうと思います。
研究室時代、これを発展させて強化学習環境構築まで行ったのでそこまで紹介できると少しでも無駄な労力が減ると思います。





それではまたお会いしましょう。。
JavaScriptの配列sortを複数条件で行う方式の提案

こんなデータを複数条件でソートしたいときの提案です。

```js
const arr = [
    {name: 'Tanaka', age: 26, sex: 'Male'},
    {name: 'Sato', age: 15, sex: 'Female'},
    {name: 'Ishida', age: 42, sex: 'Male'}
];
```
    
## よくあるやつ
調べると出てくるやつです。
直感的ですが全ての比較を2回ずつ書かなきゃいけないところが嫌な感じです。
```js
arr.sort((a, b) => {
    if (a.name > b.name) return 1;
    if (a.name < b.name) return -1;
    if (a.age > b.age) return 1;
    if (a.age < b.age) return -1;
    if (a.sex > b.sex) return 1;
    if (a.sex > b.sex) return 1;
    return 0
});
```

## 提案方式
こんな風に書くのはどうでしょうか。
比較値生成関数を定義する手間はかかりますがスマートな感じがします。
```js
const comp = (a, b) => [
    a.name > b.name,
    a.age > b.age,
    a.sex > b.sex
].reduce((x, y) => x << 1 | y);
arr.sort((a, b) => comp(a, b) - comp(b, a));
```
comp関数で、bit演算で各桁と比較条件を対応付けて、真のときに1立てています。
例えば以下のようになります。
```js
const a = {name: "AAA", age: 1, sex: "Male"};
const b = {name: "XXX", age: 0, sex: "Male"};

// comp(a, b) = 0b010
// comp(b, a) = 0b100
```
[メモ] エラーコードホテルをまとめてみたメモ

2021年11月のtogetterのホテルの記事が面白いので、まとめ＆一部創作してみました。

引用：

https://togetter.com/li/1801143

https://www.hp-maker.net/magazine/status-code/

https://www.itmanage.co.jp/column/http-www-request-response-statuscode/

## 200番台

200 OK
ホ「お客様の部屋は200です」
俺「いったいどの部屋に行けばいいのか」
リクエストが正常に処理できた

201 Created
ホ「お客様の部屋は201です」
俺「わざわざ新しく部屋を作ったんですか」
リクエストが成功してリソースの作成が完了

## 300番台

300 Multiple Choice
ホ「お客様の部屋は300です」
俺「この中から好きに選べということですか」
リクエストに対して複数のレスポンスがあることを示す

301 Moved Permanently
ホ「お客様の部屋は301です」
俺「違う部屋に行けということか」
恒久的に移動する

## 400番台

400：Bad Request
ホ「お客様の部屋は400です」 
俺「俺の言葉通じてないんですか？」
エラーコード「400」は、ユーザーからのリクエストに不正があり、処理できないことを表しています。

401：Unauthorized
ホ「お客様の部屋は401です」 
俺「会員専用なんて聞いてないですよ」
WEBサイトにアクセスするにはIDやパスワードが必要なことを表しています。 

402：Payment Required
ホ「402ですね」
俺「いや、お金ならちゃんと払いますから…」
主に、必要な資金が不足しているためにリクエストを処理できないということを表しています。
例：Shopifyの料金を支払っておらず、ストアが一時的に無効になっているときなど 

403：Forbidden
ホ「403ですね」
俺「俺このホテル出禁になってるんですか？」
クライアントがアクセス制限などを設定している場合に返されます。
アクセス権がないとWEBサイトにアクセスできないことを表しています。 

404：Not Found
ホ「本日のお部屋は404です」
俺「あ、今日は部屋ないんですか？404なら他のホテル探します」
見る機会が多いコードです。ページが存在しない場合や、ページを削除したり、ホームページをリニューアルしてURLが変わった時などに表示されることが多いです。

408：Request Timeout
ホ「本日のお部屋は408です」
俺「時間制限厳しすぎませんか！？」
サーバーが、ブラウザからの残りのリクエストを待機してタイムアウトになったことを意味します。このコードは、ブラウザからの完全なリクエストを待っている間にサーバーがタイムアウトすると返されます。 

410：Gone
ホ「410ですね」
俺「部屋が消滅したんですか！？」
要求されたリソースがなくなっており、消滅している状態を指します。これは「404 Not Found」コードに似ていますが、410は永続的であり二度と復活しないものであることを意味します。 

413 Payload Too Large
ホ「413ですね」
俺「どんだけ小さい部屋なんですか！？！？」
ファイルをアップロードする際にサーバで定めたファイル容量の上限を超えてしまった為アクセス拒否された

414 URI Too Long
ホ「お部屋は414です」
俺「部屋遠すぎでしょ」
指定したURLが長すぎる

416 Range Not Satisfiable
ホ「416ですね」
俺「何部屋取ろうとしてるんですか！？」
サーバーがリクエストされた範囲（容量）を提供できない

418：I’m a teapot
ホ「お客様の部屋は418です」 
俺「ティーポットだからコーヒーを入れたらだめなのか」
「418：I’m a teapot」はサーバーが、自身がティーポットであることを理由にコーヒーを注ぐことを拒否した場合に表示されます。

429 Too Many Requests
ホ「429ですね」
俺「そりゃ何度も部屋変えたらそうなるよ！」
一定時間内にリクエスト数が多すぎるためアクセスを拒否した ※DDos攻撃によるサーバダウンのリスクを回避する為

## 500番台

500：Internal Server Error
ホ「お客様の部屋は500です」 
俺「修理中の部屋ですか！？」
サーバー側に以上が発生したりやプログラムにミスがあった場合などで返されるコードです。

501 Not Implemented
ホ「お客様の部屋は501です」 
俺「部屋の中何もないじゃん」
サーバーがリクエストに満たすのに必要な機能をサポートしていない

502：Bad Gateway
ホ「お客様の部屋は502です」 
俺「現在使用中なんですか？」
プロキシサーバーの使用中などといった理由をはじめ、あるサーバーが別のサーバーから無効なリクエストを受信したことを意味します。また、リクエストに時間がかかりすぎることで、サーバーにより接続がキャンセルまたは強制終了され、データベースへの接続が切断されるケースもあります。

503：Service Unavailable
ホ「お客様の部屋は503です」 
俺「満室ですか、なら別のホテル探します」
404と同じぐらいよく見る機会があるエラーコードです。サーバーへのアクセス数の制限を超えてしまって、サーバーに負荷がかかっている場合などに返されます。同時刻にサーバーへのアクセスが大量に集まった際などに表示されます。時間をおいてからアクセスしてみてください。

504：Gateway Timeout
ホ「お客様の部屋は504です」
俺「ちょっとよく聞き取れないんですが」
サーバー同士の通信エラーです。制限時間内にゲートウェイ・プロキシサーバーが処理できなかった場合に返されます。 

505：HTTP Version Not Supported
ホ「○%×$☆♭#▲！※（お客様の部屋は505です）」
俺「日本語でおｋ」
サーバーが、クライアントがリクエストの作成に使用したHTTPバージョンをサポートしていないことを意味します。

508：Loop Detected
ホ「お客様の部屋は508です」
ホ「お客様の部屋は508です」
ホ「お客様の部屋は508です」
ホ「お客様の部屋は508です」
ホ「お客様の部屋は508です」
サーバー内でリダイレクトループに入ったときに返されるコードです。 

## おまけ（エラーコードではない）

010：ルパンレンジャーに変身
ホ「お部屋は010号室です」
俺「快盗になってギャングラーと戦えってことかい」
快盗戦隊ルパンレンジャーVS警察戦隊パトレンジャーで、ルパンレンジャーに変身する時のコードです

555：仮面ライダーファイズに変身
ホ「お部屋は555号室です」
俺「いや俺オルフェノクじゃないしはじかれるよ(ネタばれ)」
仮面ライダーファイズに変身する時のコードです

801：やおい
ホ「お部屋は801号室です」
「男性同士の戯れをゆっくりご覧ください」
＊ご自分でお調べください

810：ハッテン
ホ「お部屋は810号室です」
「男性のお連れ様が先にお待ちです」 「ごゆっくりおくつろぎ下さい」
＊ご自分でお調べください
tailwindcssでコーディングすると冗長的になりすぎる…は解決できることを知った。

ここ最近やっと学び始めたTailwindの嫌いだなと思っていたのが、HTMLに付与するclass名が冗長的になりすぎること。
良いなと思う反面どうにもならないものだと思ってたけど解決策があったんですね…

## Tailwindの冗長的なclass名は`@apply`でまとめる！

結論から言えば[公式](https://tailwindcss.com/docs/reusing-styles#extracting-classes-with-apply)に書いてあったのを見逃していただけです…。
リファレンス読み飛ばしがちなので気をつけます…

```HTML
<input
  class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
  type="text"
  placeholder="hoge"
  value="hoge"
/>

<!-- After -->
<input
  class="form-input"
  type="text"
  placeholder="hoge"
  value="hoge"
/>

```

```CSS
@layer components {
  .form-input {
    @apply shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight;
  }
}
```

@layerでカスタムCSSを定義することでTailwindにデフォルトで組み込まれているすべてのクラスと同様に、そのCSSが実際にHTMLで使用される場合にのみ、最終ビルドに含まれます。

使用されていないCSSを省くには`tailwind.config.js`にcontentで設定を書きます。
```javascript:tailwind.config.js
module.exports = {
  content: ['./index.html'],
  theme: {
    extend: {}
  },
  variants: {
    extend: {}
  },
  plugins: []
};
```


## `@apply`の使い所

- 汎用的なコンポネントをカスタムCSSとして定義する時
- 外部ライブラリの一部コードをオーバーライドする時
- baseにリセットCSSなどベースのスタイルを追加したい時

などが挙げられます。

ただ、[公式には下記のように記載](https://tailwindcss.com/docs/reusing-styles#avoiding-premature-abstraction)があります。

> Whatever you do, don’t use @apply just to make things look “cleaner”. Yes, HTML templates littered with Tailwind classes are kind of ugly. Making changes in a project that has tons of custom CSS is worse.
If you start using @apply for everything, you are basically just writing CSS again and throwing away all of the workflow and maintainability advantages Tailwind gives you, for example:

> If you’re going to use @apply, use it for very small, highly reusable things like buttons and form controls — and even then only if you’re not using a framework like React where a component would be a better choice.

書いてあることをまとめると…
- `@apply`を無闇に使わない。将来大量のカスタムCSSに変更を加えるになりかねない。
- `@apply`を使い始めると、基本的にCSSを再び書くことになり、Tailwindの利点がなくなる。
- `@apply`を使う場合再利用性の高いものにする。

という感じです。
ただHTMLが見やすくなるからといって`@apply`を使いすぎるとTailwindの利点がなくなってしまうので気をつけないといけません…。



## 【おまけ】Tailwindを使う時に便利なvscodeの拡張機能
### Tailwind CSS IntelliSense
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/75e6559f-d825-9262-9f77-2efe7c36f7fb.png)

vscodeでTailwindのclassを補完してくれる拡張機能です。
拡張機能を使うと下記のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/638dbce6-4091-d933-da40-5bb4743caa8f.png)

もっと早く入れればよかった…
以上です！
Quiitaにメール認証できない対処法

<b>■初投稿</b>

自主的に学んだことをQuiitaを使用して
OutPutしようかなと考えたときに
そもそも認証できないから投稿ができないじゃん！！となったので
どのようにしたら登録できるのか記載していく。


<b>■事例</b>
「メールアドレスの認証が完了していません。認証用メールを送信するにはこちらをクリックしてください」


<b>■経緯</b>
iPhoneにて登録時にメールアドレス宛に認証を行う画面へ推移し、
そこで自分はグーグルアカウントで認証をしましたが、
YouTubeの画面へ、その後ログインはできたものの。

ログインできること確認後
PCから再度ログインするも再度事例の登場。。。
認証できていないのループ

<b>■対処法</b>
①最初に飛ばされたリンクからアクセスする
下記記事より試してみましたが
再度同じ認証できていないループ
>https://qiita.com/Teba_eleven/items/a042569ebdba2ff62486

②①の画面から、再度認証用のクリック押下
①と掛け合わせて実施すると、
なんと！！！
認証できました！！

初投稿が無事にできてよかったです
PowerAutomateで全角を半角に一括変換する

# はじめに
PowerAutomateで文字列中の全角を半角に修正する場合、文字一つ一つをreplaceする方法が最初に思い浮かびますが、余りにも労力がかかりすぎるため一括変換する手法は無いか考えてみました。

# 正攻法
まず考え付くのは上述の通りreplace関数を使い、置き換えていく方法ですね。
![replace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641628/60e465db-b9eb-39d2-b585-513dc49ed3c4.png)
こんな感じで全ての文字を対象にreplaceします。
アルファベットまで含めると途方もない数になってしまいかなり面倒です。

# 逃げ道
そういえばExcelにASC関数（全角を半角に変換する関数）があったことを思い出し、ExcelOnlineを経由すればPowerAutomate上でも可能なのではないかと思い、トライしました。
まずExcelで、変換対象文字列を入れるテーブルを作成し、OneDrive配下に格納します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641628/9f5ee385-4b56-c698-dc49-b33b8db57c95.png)

今回はテストのため、手動で変換対象文字列を送るトリガーを作成しました。
変換対象の文字列が渡せればなんでも良いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641628/e7d0a35d-0ba3-bf91-9ecb-ddd9d06984ca.png)

先ほど作成したExcelファイルに行を追加するコネクタを追加。
ExcelOnlineの「表に行を追加」アクションを使用します。
変換対象文字列の欄に、「=ASC("変換対象文字列")」を入力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641628/1d1a6fa9-4338-8df7-c564-50ad89dbeab6.png)

これで本当にできているのか、試しに取得してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641628/83e7201b-1260-32e0-89ba-9b84f9e7cc65.png)

念には念を入れ、取得した値をExcelに書き込んでみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641628/57303c1b-eed8-6118-eef9-abfcef1409ca.png)

全体はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641628/a1da7ec9-e192-4375-c767-b15326659faf.png)

# 実行と結果
適当な文字列を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641628/acc22418-3721-4079-03f1-1a4a1afc0e78.png)

結果は下記。謎の一行目ができていますが、ちゃんと変換されてますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641628/cf77e4ba-5510-b3cf-73bf-3ad7827812fd.png)

フロー上でも問題なさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641628/d9b9fa13-fbd7-cf52-0379-29d5431a1352.png)

# まとめ
今回はPowerAutomate上で全角を半角に一括変換するフローを作成しました。
使用したのはASC関数でしたが、（ExcelOnlineを経由してよいのであれば）PowerAutomate上で疑似的にExcel関数を使うことができることに気が付くきっかけとなりました。
今後のフロー作成にも役立ちそうです。
PyCon JP 2022 day1 GeoDjango ORMと地理空間データの世界

現地参加したPyCon JP 2022のセッションのまとめ6本目です。

今回は、Day1の「GeoDjango ORMと地理空間データの世界」です。

# 動画
<iframe width="560" height="315" src="https://www.youtube.com/embed/4dPXOZeTg2Y?start=15625" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# スライド
- https://speakerdeck.com/selfsryo/geodjango-ormtodi-li-kong-jian-detanoshi-jie

# スピーカー
- 阿部 涼平さん
  - 株式会社MIERUNE
    - バックエンドエンジニア

# 内容
- 位置情報に関する技術や実績が豊富なMIERUNEさんからの発表でした
- 内容は、地理空間・地理情報システムについてです

## GeoDjangoとは
- Djangoが持つGIS Webフレームワーク用ラブラリ
- サードパーティではなく公式

## GISとは
- 地理情報システム
- 位置情報データを扱う技術
### GISで扱うデータ
- ベクタデータ
  - ポイント(点)
  - ライン(線)
  - ポリゴン(面)
- ラスタデータ(画像)

## GeoDjangoの対応DB
- PostgreSQL(PostGIS)
  - GeoDjangoの公式で推奨
- MySQL
- Oracle
- SQLite(SpatiaLite)

## PostGISについて
- GISを扱うためのPostgreSQLの拡張モジュール
- データ型にジオメトリ型が追加される
- 地理空間データの演算を行う空間関数が追される
  - 関数名は`ST_XXX`になる
    - `ST_Contains`・`ST_Union`など

## GeoDjangoとORM
- GeoDjangoは、空間演算用のORMを持っている
- SQLを意識せずに空間関数を実行できる

## 空間演算用ORM
### lookup
- DjangoのQuerySetを、様々な条件で取得できる
- `contains`・`itersects`など
### DB関数
- 集計関数やフィルタの中で利用される
- `AsGeoJSON`・`Centroid`など

## REST API
### DjangoでのREST API
- Django REST framework
  - サードパーティ
  - ブラウザ操作可能
### GeoDjangoでのREST API
- django-resr-framework-gis
  - GISの機能が追加
  - URLでリファクタリングが可能
  - JOSNでページネーションできる

# 感想
- 私自身、地理空間とか地図データに関する処理はやったことがないので、こちらも初見の内容がほとんどでした。
- PostGISも初見だったのですが、PostgreSQLにはいろいろな拡張機能がありますね。
一般のマッチング問題（二部グラフではない）を解く

マッチング問題を解きたいが, 調べると二部グラフマッチングばかり出てくる. 
一般のグラフにおいて, 辺で結ばれた頂点同士をマッチさせたい. 
「完全マッチング」「最大マッチング」「極大マッチング」などで調べると, アルゴリズムが出てくるが, 実装するには面倒そう. 
速度はそこまで必要ないので, 手軽にマッチングを試してみたい.
そんな人に向けた記事. 


# マッチング問題
定式化してPuLPで解きます. 
- [PuLPクイック入門](https://qiita.com/birdwatcher/items/d5c2a88c733ca71ae91e#pulp%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E5%85%A5%E9%96%80)


高速に解く必要がある人は, 汎用ソルバーではなく, グラフマッチング用の記事を参照しましょう. 
- [GabowのEdmonds' Algorithm(一般マッチング O(VElogV))の解説と実装](https://qiita.com/Kutimoti_T/items/5b579773e0a24d650bdf)

## 問題設定
$n$人がいて, 各人同士で仲の良さが対称行列$W\in\mathbb{R}^{n\times n}$で与えられているとする. 
人$i$と人$j$がマッチングするかどうかを$X_{i,j}\in \\{0,1\\}$で表す. 

- なるべく多くのペアを作りたい
- なるべく仲の良い人同士をマッチさせたい

## 定式化
### 目的関数
$$
\max_{X\in \\{0,1\\}^{n\times n}}  \sum_{i,j}X_{i,j} + \lambda \sum_{i,j} W_{i,j} X_{i,j}
$$
- 1項目: マッチする数を増やしたい項
    - これを制約として$m$ペア以上マッチさせたいとかにしてもよい
- 2項目: 選ばれた辺の重みを最大化したい項
- $\lambda$: バランスを調整する項

### 制約
- 辺を選ぶか選ばないか
$$
X_{i,j}\in\\{0,1\\}, \forall i,j
$$
- 各人は別の一人だけとマッチする
$$
\sum_{i} X_{i,j} \le 1, \forall j \\\\
\sum_{j} X_{i,j} \le 1, \forall i \\\\
 X_{i,i} = 0, \forall i
$$
- Xは対称行列である
$$
X_{i,j}=X_{j,i}, \forall i,j
$$

## PuLPを使って解いてみる
定式化した式を書くだけです. 

```python
import pulp
import numpy as np
# 人数
n = 10
# 調整係数
lam = 1
# 重み行列
W = np.random.rand(n,n) - 0.5
W += W.T
# 変数
X = np.array(
    [
        [
            pulp.LpVariable(f"X_{i}_{j}", cat="Binary")
            for j in range(n)
        ]
        for i in range(n)
    ]
)
# 最大化問題
problem = pulp.LpProblem("matching", pulp.LpMaximize)
# 目的関数
problem += pulp.lpSum(X) + lam * pulp.lpDot(W, X)
# 制約
for i in range(n):
    problem += pulp.lpSum(X[i,:]) <= 1
    problem += pulp.lpSum(X[:,i]) <= 1
    problem += X[i,i] == 0
for i in range(n):
    for j in range(i):
        problem += X[i,j] == X[j,i]
# 解く
problem.solve()
# ステータス確認
print(pulp.LpStatus[problem.status])
# 答え
ans = np.array([
    [
        pulp.value(X[i,j])
        for j in range(n)
    ]
    for i in range(n)
])
print(ans)
# マッチした人数
print(np.sum(ans))
# 選ばれた辺
print(np.sum(W*ans))
```

実行結果:
>Optimal
[[0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
 [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]]
10.0
4.944025203899315
package.jsonのscriptsでTypeScriptファイルを実行させる

`docker-compose`経由で`TypeScript`で書いたサーバーサイドのコードが動くように設定している時に躓きました。。。
ルート直下に`lib`ディレクトリを作成し、その中に`db.ts`ファイルを作り`Sequelize`の`Model`を定義しました。 通常の.`jsファイル`なら
```package.json
{
  "scripts": {
    "node": "node ./lib/db.js"
  }
}
```
で`npm run スクリプト名(node)`で実行できますが、`.tsファイル`の場合は
```package.json
{
  "scripts": {
    "node": "node ./lib/db.ts"
  }
}
```
`node --trace-warnings`を付与して`npm run`しろと怒られてしまいます。TypeScriptのファイルを読み込みたい時は`ts-code`のパッケージを入れて、
```
npm i --save-dev ts-node
```
こんな感じで書いてあげましょう。
```package.json
{
  "scripts": {
    "ts-node": "ts-node --compiler-options {\\\"module\\\":\\\"CommonJS\\\"}  ./lib/db.ts"
  }
}
```
`npm run ts-node`
結局の所、`Model`のマイグレーションを走らせたかったので、
```docker-compose.yml

version: '3.9'

services:
  app:
    build:
      context: .
    command: npm run ts-node
    volumes:
      - .:/app
    links:
      - db
    ports:
      - 3000:3000
    environment:
      - WATCHPACK_POLLING=true
  db:
    〜省略〜
```
こちらのコマンドを書き換えて`docker-compose up`し無事立ち上がりました。
Pythonで美しいグラフを描こう！（plotnineのテーマ編）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/6f2f3870-f6d9-bd25-08af-b51f2a92e540.png)
##  はじめに

この記事は、[**plotnine**](https://pypi.org/project/plotnine/) のテーマ紹介です。

[**plotnine**](https://pypi.org/project/plotnine/)は様々なテーマ設定が可能です。

https://qiita.com/hima2b4/items/fc0c43309a7320f34eeb

設定は簡単なので、気に入ったテーマがあればぜひ。

　
##  実行条件など

>-Google colabで実行
-[前回の記事](https://qiita.com/hima2b4/items/fc0c43309a7320f34eeb)で描いた、ワインの種類別散布図（直線回帰付き）をテーマ別に描きます。


##  実行

まずはplotnineデフォルトテーマです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/14705602-1297-d8be-aacb-63ec370727dd.png)

### xkcd
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/b7e2f6ea-c96d-051c-4988-05de7abc2546.png)

### seaborn
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/19813022-f634-ba7a-c4b6-cad0d1db12f4.png)

### light
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/a5fedb6d-3fe9-1b96-d8a2-9ff1f6216f97.png)

### minimal
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/fbc2a91b-e5f2-6d5d-ae31-df3277301152.png)

### linedraw
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/d6583afc-8691-3652-d828-9e521b401bfc.png)

### 538
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/19a0bba9-4d10-10a4-7c60-828de6a785c3.png)

### bw
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/1cd4506b-db5e-4388-94ac-50e6e4bc53fe.png)

### dark
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/4a491b0f-40ab-9a1d-79b0-f8fc2d9f2584.png)

### classic
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/446c17e3-acf4-1f65-1874-5bb40b4f41f5.png)

### gray
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/2fc71dde-b4de-b157-6441-0d98377bd8e2.png)

### matplotlib
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/326a0a6d-ece4-6182-10ee-0dcd911978bc.png)

### void
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/7d2c7ad9-6462-8d6c-ec9d-f0333c0ceae1.png)


## 実行コード
実行に必要なコードは、[前回の記事](https://qiita.com/hima2b4/items/fc0c43309a7320f34eeb) を確認してください。

以下、テーマ変更に関するコードのみを記述します。
最終行の + theme_**** を任意書き換えるだけです。
 
```Python:クラス毎に直線回帰付き散布図
#@title Scatter-plot for each target variable with linear regression（theme***）

X_column_name =  'alcohol'#@param {type:"raw"}
y_column_name =  'od280/od315_of_diluted_wines'#@param {type:"raw"}

(ggplot(df, aes(x=X_column_name, y=y_column_name, color = TARGET))
 + geom_point()
 + stat_smooth(method='lm')
 + facet_wrap(TARGET)
 + theme_xkcd())  #theme_seaborn,theme_light,theme_minimal,theme_linedraw,theme_538,theme_bw,theme_dark,theme_gray,theme_classic,theme_matplotlib,theme_void
```

##  最後に
テーマがいろいろ変更できるのはおもしろいですね。
seaborn と matplotlib が選べるというのは・・・何ともいえませんが。


## 参考
https://plotnine.readthedocs.io/en/stable/api.html
PyCon JP 2022 day1 Playwrightを使って簡単に自動テストしてみる

現地参加したPyCon JP 2022のセッションのまとめ5本目です。

今回は、Day1の「Playwrightを使って簡単に自動テストしてみる」です。

# 動画
<iframe width="560" height="315" src="https://www.youtube.com/embed/D3nBkJwEUB4?start=12529" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# スライド
- 公開なし

# スピーカー
- Takahiro Hama
  - PyConKyushu実行委員会（運営代表）

# 内容まとめ
- ブラウザを操作するライブラリPlaywrightについて

## Playwrightとは
- Microsoft社のOSS
  - https://github.com/microsoft/playwright
- 多言語対応
  - TypeScript、Python、Java、C#

## Playwrightの良いところ
### Seleniumよりも高速に動く
- Selenium
  - WebDriverに対してHTTP Requestを投げるため、低速
- Playwright
  - WebSocketでPlaywrightに接続して操作をリクエストするため、高速

### CodeGenerator
- Selenium
  - DriverをDLしないと動作しない
- Playwright
  - コマンド実行でCodeGeneratorが起動
  - ブラウザを操作してコードが生成できる
  - 生成したコードのデバッグも実行可能

### 自動待機機能
- Selenium
  - 待機を明示的に記載する、暗黙的に設定する必要がある
- Playwright
  - アクション実行前に自動待機する仕組みがあるため、設定不要

### iFrameの自動切り替え
- Selenium
  - iFrame内の要素へのアクセスは明示的な切替が必要
- Playwright
  - iFrame内の要素を切り替えず指定できる

## レポーティング機能
- Selenium・Playwrightともに、レポーティング機能はない
- Pythonのフレームワークやライブラリを使うことで、補完できる

### Robot Framework
- 可読性の高い独自構文
- Pythonで独自メソッドの追加が可能
- Playwrightのライブラリがある

### allure Report
- 多言語からの接続でレポート出力
- pytest用のライブラリ`allure-pytest`がある

### pylenium.io
- seleniumのラッパーライブラリ
- Cypressに似てる構文
- pytestでの利用を前提

## まとめ
- Microsoft製なので利便性・継続性が○
- seleniumよりも高速
- 多言語対応してるので、Python以外でも導入可能
- ただ最近できたばっかりなので、日本語の資料はseleniumに劣る

# 感想
- PlaywrightとSeleniumの比較がメインのセッションでした。
- SeleniumはE2Eテストを導入する際に使ったことがあるのですが、Playwrightは初見だったのでまた使ってみたいと思います。
pytorchを使った関数のフィッテング

# はじめに
以下で、pytorchを使って線形回帰をやってみたが、もう少し複雑な関数を使って、自動微分と最適化の動作を確認する。

https://qiita.com/mo_kazuya/private/142f6fbbd239b87a4615

## 求める関数
以下のような、二次関数($5x^2+6x+7$に乱数を加えたもの)を再現できるか試してみる。

``` python:コード
import numpy as np
import torch
import matplotlib.pyplot as plt

xi = np.arange( -10, 11, 1. )
yi = 5*xi**2 + 6*xi + 7 + np.random.normal( loc=0 , scale=50, size=len(xi) )
Xi = torch.tensor( xi )
Yi = torch.tensor( yi )

plt.scatter( xi, yi )
```
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884285/c6aa3890-be67-e709-9884-3fdb12ec2230.png)

# 関数の定義
今回は、pytorch.nn.Moduleを使う。
$y=ax^2+bx+c$という二次関数でフィッテングするために、
パラメタは3つを持つ以下のようなクラスを作った。

```python
class MyModule( torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.A = torch.nn.Parameter( torch.rand(1) )
        self.B = torch.nn.Parameter( torch.rand(1) )
        self.C = torch.nn.Parameter( torch.rand(1) )
    def forward(self, x):
        return self.A*x**2 + self.B*x + self.C
```
ポイントは、torch.nn.Paramete()で、パラメタとなる変数を登録するところ。

これにより、自動微分で傾き(grad)が求まるので、オプティマイザが変数の最適化を実行することができるようになる。

学習については、イデオム通り。
```python
# モデルの生成
net = MyModule()

# オプティマイザにパラメタを登録
optim = torch.optim.RMSprop(net.parameters(), lr=0.001)

# 誤差計算用
mseloss  = torch.nn.MSELoss()

# 学習
for i in range(7000):
    # パラメタ(A,B,C)に格納されている、傾きをゼロクリア
    optim.zero_grad()

    # 予測値を計算
    Y = net(Xi)

    # 予測値(Y)と正解ラベル(Yi)の誤差を計算
    loss = mseloss( Y, Yi )

    # 自動微分で各パラメタ(A,B,C)の傾きを計算
    #  → A,B,Cの微小変化がlossにどう影響するか算出
    loss.backward()

    # 求まった傾きを使って、パラメタ(A,B,C)を更新
    optim.step()

print( net.A , net.B , net.C )
```

```出力
Parameter containing:
tensor([5.0715], requires_grad=True) Parameter containing:
tensor([4.6012], requires_grad=True) Parameter containing:
tensor([6.2303], requires_grad=True)
```

元の関数は、A=5,B=6,C=7なので少しずれているが、グラフにすると以下なので大体あっていそう。(摂動を与えた分のずれが見えている様子)

```python:結果表示
plt.scatter(xi,yi)
Y = net(Xi)
plt.plot( xi , Y.detach().numpy() , color="red" )
```
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884285/9d7c2261-92de-ff4b-1031-cd3a89b5667d.png)
【Terraform】Terraformのモジュールを作ってみよう

# はじめに
udemyを使ってTerraformの勉強をしたので、Terraformのモジュールについての学習備忘録です。

https://www.udemy.com/course/iac-with-terraform/

# Terraformのモジュールとは
リソース生成処理を１つの塊にして呼び出せるようにしたもの　→　関数のようなもの

# Terraformのモジュールを作成してみよう
試しにserverというモジュールを作成してみたいと思います。

modulesフォルダを作成し、serverフォルダを作成します。
その配下にモジュール作成に下記の空のファイルを用意します。

* variables.tf : 引数
* main.tf : 処理
* outputs.tf : 戻り値
* README.md : 説明

![スクリーンショット 2022-10-17 23.33.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/3a1f652b-8b42-2d25-27c1-61242d229afd.png)


serverフォルダ内のファイルにEC2起動のTerraformを書きます。

```terraform:/modules/server/main.tf
resource "aws_instance" "server" {
  ami           = "ami-078296f82eb463377"  # Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type
  instance_type = var.instance_type
  tags = {
    Name = "hogeServer"
  }
}
```

```terraform:/modules/server/outputs.tf
output "instance_id" {
  value = aws_instance.server.id
}
```

```terraform:/modules/server/variables.tf
variable "instance_type" {
  type    = string
  default = "t2.micro"
}
```

これで、モジュールの完成です。

# 作成したモジュールを呼んでみよう
作成したモジュールを呼び出して使って見たいと思います。


```terraform:main.tf
terraform {
  required_version = ">=0.13"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}

# モジュールの呼び出し
module "webserver" {
  # モジュールのパスを記載する
  source = "./modules/server/"
  instance_type = "t2.micro"
}

output "web_server_id" {
  value = module.webserver.instance_id
}
```

実行します。
```zsh
$ terraform init
$ terraform plan
$ terraform apply
```

モジュールで記載した内容がデプロイできてればOKです。
microCMS の API の使い方

エンドポイントが test の API を用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/bb310810-3e1a-31de-78ac-d199b4275a73.png)

## curl

```bash:api_curl.sh
URL="https://ekzemplaro.microcms.io/api/v1/test"
curl ${URL} -H "X-MICROCMS-API-KEY: f038c60c94f441aab007d511b94788a*****"
```

## Httpie

```bash:api_httpie.sh
URL="https://ekzemplaro.microcms.io/api/v1/test"
http ${URL} X-MICROCMS-API-KEY:f038c60c94f441aab007d511b94788a*****
```

## python

```py:api_get.py
#! /usr/bin/python
#
#	api_get.py
#
#					Oct/20/2022
#
# ------------------------------------------------------------------
import	sys
import	json
import	requests
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
url="https://ekzemplaro.microcms.io/api/v1/test"
headers = {'X-MICROCMS-API-KEY': 'f038c60c94f441aab007d511b94788a*****'}
#
rr=requests.get(url,headers=headers)
#
print(rr.status_code)
print(rr.url)
print()
dict_data = json.loads(rr.text)
print(dict_data)
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```
[GAS] Google Apps Script で YouTube Data API V3 を使うための設定

# はじめに
YouTube関連の案件が続いたこともあり、GASの拡張サービスを利用し、**YouTube Data API**を使用するための設定についてまとめておきます。当方で受ける案件の多くはトリガーの設定はもとより、各種設定は原則としてクライアント様にて実行していただくことが多いです。

本記事は主に当方クライアント様に向けたマニュアルを再編集した内容となります。もちろん、GAS初心者の方も参考になると思います。なお、本記事にて使用している画面のキャプチャは執筆時点のものとなります。[^1]

[^1]: Magicodeから記事移動後、若干の文言修正をしています。

::: note
拡張サービスを使用するため、`API KEY` の取得や設定は不要です。
:::

# 設定方法
以下の設定は原則として当該プロジェクトの管理者様にて行うことを前提としています。編集権限を持ったユーザーでも設定可能ですが、管理者が行うほうが何かと都合がよろしいかと思います。

## 1. スクリプトエディタ画面を開く
当該案件のメインＵＩ、恐らく９割方はスプレッドシートになると思いますが、上部メニューの**拡張機能**より**Apps Script**を選択します。

![00_open_editor_spreadsheet_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1111613/74dabd93-85d8-a6dd-7769-ca7467ed027b.png)

## 2. サービスからYouTube Data API を追加
スクリプトエディタ画面の左側に「サービス　+」という項目がありますので、その項目をクリックします。

![01_add_youtubedataapi01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1111613/17029f4e-c168-1c24-1629-22a7363a50d4.png)

以下のようなモーダル画面が表示されます。利用可能な拡張サービスリストの下の方に「YouTube Data API v3」という項目がありますので、選択します。その他の項目につきましては特別変更する必要はありません。

![01_select_youtubedataapi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1111613/f4749c4f-fddf-8b9e-1913-8386b04fa7c0.png)

補足ですが、項目内の**ドキュメント**をクリックすると、[GASリファレンスのYouTube Service](https://developers.google.com/apps-script/advanced/youtube?authuser=0)へジャンプします。[YouTube Data API v3の公式リファレンス](https://developers.google.com/youtube/v3/docs?authuser=0)ではありませんのでご注意ください。


**追加**ボタンクリックで左側メニューの下部に**YouTube**が追加されます。拡張サービスとして**YouTube Data API**が利用可能となります。

::: note info
**YouTube**が追加されていない場合は設定をやり直してください。
:::

![02_add_youtubedataapi02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1111613/841d25c2-52bc-2998-f947-e4a029667c06.png)

設定は以上となります。

# 最後に
GASの拡張サービスを利用することで、`UrlFetch`からAPIを叩くよりも簡単にAPIへのリクエストが可能になります。もちろん、提供されているものに限定されますが、どのような拡張サービスが提供されているのか確認してみるのもよいかと思います。

なお、新たに拡張サービスを追加した場合、その後の最初のスクリプト実行時に、**アクセス権限の確認リクエスト（実行承認プロセス）画面**が表示されると思います。

![03_accept.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1111613/7bfd0594-621f-bda2-7792-099dcce3c977.png)

拙記事ですが、以下を参考にして実行承認を行ってください。

https://qiita.com/STSHISHO/items/f2ce468ab78682c26699

誰かのお役に立てれば幸いです。

# [参考・引用]
+ [[GAS] 主に初回実行時「承認が必要です」ダイアログが出た場合の承認作業とアクセス権限の確認プロセス](https://qiita.com/STSHISHO/items/f2ce468ab78682c26699)
【Ruby】%記法一覧

## 文字列

### `%`, `%Q`

`%`および`%Q`は式展開できる文字列を表現します。  
ダブルクォーテーションで文字列を囲んだ`"文字列"`と同等になります。  

```ruby
%(a b c)
# => "a b c"

a, b, c = 1, 2, 3
%(#{a} #{b} #{c})
# => "1 2 3"
%Q(#{a} #{b} #{c})
# => "1 2 3" 
```

### `%q`

`%q`は`%`や`%Q`と同様に文字列を表現しますが、式展開ができない点で異なります。  
シンブルクォーテーションで文字列を囲んだ`'文字列'`と同等になります。  

```ruby
%q(a b c)
# => 'a b c'

a, b, c = 1, 2, 3
%q(#{a} #{b} #{c})
# => "\#{a} \#{b} \#{c}"
```

## 配列

### `%W`

`%W`はスペースで区切った文字列を含む配列を表します。  

```ruby
a, b, c = 1, 2, 3
%W(#{a} #{b} #{c})
# => ["1", "2", "3"]
```

### `%w`

`%w`は`%W`と同様に配列を表しますが、式展開ができない点で異なります。  

```ruby
a, b, c = 1, 2, 3
%w(a b c)
# => ['a', 'b', 'c']
```

### `%I`

`%I`はシンボルの配列を表現します。  

```ruby
a, b, c = 1, 2, 3
%I(#{a} #{b} #{c})
#=> [:"1", :"2", :"3"]
```

### `%i`

`%i`は`%I`と同様にシンボルの配列を表しますが、式展開ができない点で異なります。

```ruby
a, b, c = 1, 2, 3
%i(a b c)
# => [:a, :b, :c]
```

## シンボル

### `%s`

`%s`はシンボルを表します。

```ruby
%s(a b c)
# => :"a b c"
```

## コマンド

### `%x`

`%x`はコマンドを実行できます。
バッククォーテーションで囲んだ`` `some command` ``と同等です。

```ruby
%x(date)
# => "Thu Oct 20 18:25:04 JST 2022\n"
```

## 正規表現

### `%r`

`%r`は正規表現を表します。

```ruby
%r(^http://)
# => /^http:\/\//
```
Swift Package Manager を利用した Realm のインストール方法


参考: https://www.mongodb.com/docs/realm/sdk/swift/install/

XCodeのVersion14.0.1で行いました


- 1　`File` → `Add Packages...`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302952/bb6978b1-4903-f78e-a5d8-a773bb7132e4.png" width="350px" />

- 2  下記のウィンドウが開きます。操作については画像の下に記載しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302952/032c0417-d3b5-2329-dc9b-3a3392ce1cb1.png)

  - (1) の検索ボックスに`https://github.com/realm/realm-swift.git`を入力
  - (2) に`realm-swift`が表示される
  - (3) の`Dependency Rule` を `Up to Next Major Version` に変更
    - ※(3)と(4)は必須ではないようですが、推奨のようです
  - (4) 現在のバージョンを入力
    -  https://github.com/realm/realm-swift/releases を開いて下記のようにLatestマークがついているのが最新バージョンです
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302952/52404b72-012a-1b70-8c3b-747970d38817.png" width="150px"/>
  - (5) `Add Package`

- 3 `Realm`と`RealmSwift`にチェックを入れて`Add Package`で完了
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302952/94ceb9e9-4b7d-ad7a-c7fb-885d5268c946.png" width="500px"/>
久しぶりの開発案件に参加してみて

# 経歴について

---
## １社目
新卒として自社開発会社に入社(2年半在籍)
PHP(CakePHP 1)を使用したWeb開発を実施
規模が少なくコーディング規約などもなかった。
※良く言えば自由に開発が行える。

---
## 現在
PHP(CakePHP 4)を使用したWeb開発を実施
規模は変わらないがコーディング規約などがしっかり決まっている。
そして、静的解析ツールなどをきちんと導入されている。

---
## 今回の案件で初めて触れた技術
- Git
- 静的解析ツール(PHPStan)
- コードフォーマット(PHP-CS-Fixer)
- Redmine

---
## 静的解析ツール(PHPStan)
### 検知できる問題点
1. 存在しないクラスをインスタンス化している。
2. 存在しないメソッド、関数を呼び出している。
3. 参照しているクラス名の大文字小文字が定義と異なる。
4. メソッド仮引数とメソッド呼び出し実引数の型が一致しない。
5. メソッドに型宣言が指定されていない。
※型チェックをしてくれる優れものという認識です。

https://phpstan.org/

---
### 検知レベル
検知をする際に0~9のレベルがある。
※ levelの範囲はPHPStanのバージョンによって変わります

https://phpstan.org/config-reference#rule-level
#### 参考
導入をする際はlevel5をおすすめします。
導入する際の推奨レベルといわれているレベルです。
※このレベルを超えないとメンテナンスが大変になる。

https://qiita.com/shimabox/items/df03dde8bd6db4733231

---
## コードフォーマット(PHP-CS-Fixer)
### PSR(PHP Standards Recommendations)
公式が発表しているPHPコーディング規約です。

https://www.php-fig.org/psr/

---
### PHP-CS-Fixer
PSR(主にPSR-2とPSR-12)に従ってコードを整形してくれる。
VSCodeの拡張機能として「PHP-CS-Fixer」があるのでそれを使用して自動的に整形を行う。
これによりメンテナス性が向上する

https://minna-systems.co.jp/blogs/177/

---
### 一か月経っての感想
- ロジックを考えるということから離れていたので苦戦している。
- 新卒で入った会社に比べて規約などがしっかりしていて勉強なる。
- 離れていた分自分の時間を使ってコードを書かないと追いつけない。
【備忘録】データベースのテーブル作成（Laravel）

## テーブル作成
コンテナに入った後、下記記載
```
php artisan make:migration create_tr_records_table
```

### ファイルが作成されるのでcreate箇所にカラム情報を記載する
```
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tr_records', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
            $table->foreignId('user_id')->nullable()->constrained('users');
            $table->timestamp('tr_date')->nullable($value = true);
            $table->string('part');
            $table->string('menu');
            $table->string('set_type');
            $table->float('weight_first', 8, 2);
            $table->integer('reps_first');
            $table->float('weight_second', 8, 2);
            $table->integer('reps_second');
            $table->float('weight_third', 8, 2);
            $table->integer('reps_third');
            $table->float('weight_fourth', 8, 2);
            $table->integer('reps_fourth');
            $table->float('weight_fifth', 8, 2);
            $table->integer('reps_fifth');
            $table->text('memo');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tr_records');
    }
};
```

### 記載したらmigrateする
```
php artisan migrate
```

## モデル作成
```
php artisan make:model TrRecord
```

## コントローラ作成
```
php artisan make:controller TrRecordController
```
Azure PortalをMFA化する

# はじめに
Azure管理の入り口であるAzure Portalですが、デフォルトではインターネットからパスワード認証のみでアクセスが可能になっています。MFA(多要素認証)を必須化することにより不正なアクセスを防ぐためのメモです。

# 設定する前に
Azure Portalの設定を行う前に自分（を含めた全利用者）のアカウントのMFA設定を行っておきます。

1. [セキュリティ情報](https://mysignins.microsoft.com/security-info)のサイトから [サインイン情報の追加]を行う。
1. 認証方法としてスマホのMicrosoft Authenticatorを利用する場合は[認証アプリ]を選択する。
1. 後は画面の指示通りにQRコードを読み取ったりしながら進める。

# 条件付きアクセスの設定
アクセスするための条件を設定する機能です。下記記事の手順の通りに進めます。設定を間違えると管理者として入れなくなってしまう可能性があるので要注意です。

https://learn.microsoft.com/ja-jp/azure/active-directory/conditional-access/howto-conditional-access-policy-azure-management

Azure Portalは[Microsoft Azure の管理]という名前のアプリとして登録されているので、これに対して条件付きアクセスを設定することになります。とりあえず管理者のアカウントだけでも設定しておけば安心です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/044234d6-e833-014b-3f82-7f87e93ab8df.png)

# おわりに
最近Azureの利用者アカウントが乗っ取られるケースが何件か目にしました。その後すかさず該当アカウントでAzure Portalへのログインを複数の国から施行されているのが見つかり、ドキッとしました。AzureのユーザーIDはメールアドレスとなど普段のOA業務にも利用するので、AWSのIAMユーザーに比べると流出する機会が多いはずです。パスワードを強力にするのも大事ですが、それ以外の対策もとっておかないとわりとすぐに被害に逢うことが予想されます。
「PaceJs」を使用してページローダーを作る

## はじめに
PaceJsを使用してかっこいいローダーを作成したので議事録です。
初めての使用だったこともありメモとして記録しておきます。

## 公式サイト
https://codebyzach.github.io/pace/

## 完成
![pacejs_test2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/859347/e1fcae33-e85f-f9a5-585d-9f9f38dce4d8.gif)

## pacejsとは
Pace.jsで用意されているプログレスバーは14種類のデザインがあります。
バー、スピーナー、パーセント表示タイプなど様々です。

## Pace.jsの使い方
headタグ内に記述する。
JavaScriptは閉じるbodyタグ直前に書くことが多いですが、Pace.jsは最初に読み込まれるようにheadタグの上部に書くのがベストです。

```html
<head>
    <script src="https://cdn.jsdelivr.net/npm/pace-js@latest/pace.min.js"></script>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/pace-js@latest/pace-theme-default.min.css">
</head>
```
公式サイトの以下から取得↓↓

![スクリーンショット 2022-10-20 17.43.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/859347/eb1d1fec-e53c-8e73-1afe-5f7670546ffb.png)


ページのローディング中は読み込むコンテンツの重さによって、少しずつバラバラに表示されることがあります。
そんな時は、ローディング中のコンテンツを隠すとイラつきは少しは解消できます。


```html
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <link rel="stylesheet" href="loader.css">
  <script src="./pace.js"></script>
</head>
<body>
  <div id="global-container">
    <div><img src="https://picsum.photos/id/1/5616/3744" alt=""></div>
    <div><img src="https://picsum.photos/id/2/5616/3744" alt=""></div>
    <div><img src="https://picsum.photos/id/3/5616/3744" alt=""></div>
    <div><img src="https://picsum.photos/id/4/5616/3744" alt=""></div>
    <div><img src="https://picsum.photos/id/6/5616/3744" alt=""></div>
    <div><img src="https://picsum.photos/id/8/5616/3744" alt=""></div>
    <div><img src="https://picsum.photos/id/9/5616/3744" alt=""></div>
    <style>
      img {
        max-width: 100%;
      }
    </style>
  </div>
</body>
</html>

```

重たい画像を数枚用意してそこにローダーを配置していきます。

公式のLoading Barを今回使用するので、こちらのcssをダウンロードします。

![スクリーンショット 2022-10-20 17.51.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/859347/fb7cccf8-013b-691d-792b-0c2a32be02ca.png)

cssファイルにコピペするだけで使用できます。

## 使用後
![pacejs_test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/859347/78455f23-7144-aaf5-be6a-6c8164af03de.gif)

## カスタムは自由
デフォルトではこのような感じですが、cssファイルの内容を変更すること当然アレンジは自由です。
自分好みにアレンジしてかっこいいローダーを作ってみてください！



## おわりに
javascriptを使って学習中にいいアニメーション効果を見つけたので、
記録に残しました。
今後はjavascriptを使ったことを述べていきアウトプット　の質を上げていきます。
Java JDBCの基本構文


研修の中でJDBCに関して学びましたが、わかりにくくかつ覚えることが多いように感じたのでまとめてみました。

<h2>パッケージのインポート</h2>

``` Java 
import java.sql.Connection; //DB接続のためのインタフェース
import java.sql.DriverManager;　//ドライバのロード
import java.sql.PreparedStatement;//プリペアードステートメント（SQL文をコンパイルするやつ）
import java.sql.ResultSet;//SELECT文を実行した際取得するデータの型
import java.sql.SQLException;//例外
```
<h2>JDBCドライバのロード</h2>

```Java
Class.forName("ドライバの名前");
```
| DBMS           | ドライバクラスのFQCN                        |      
| -------------- | ------------------------------------------- |  
| OracleDatabase | Oracle.jdbc.driver.OracleDriver             |      
| Db2            | com.ibm.db2.jcc.DB2Driver                   |      
| SQL Server     | com.microsoft.sqlserver.jdbc,SQLSeverDriver |      
| MySQL          | com.mysql.jdbc.Driver                       |      
| MariaDB        | org.mariadb.jdbc.Driver                     |      
| PostgreSQL     | org.postgresql.Driver                       |      
| SQLite         | org.sqlite.JDBC                             |      
| H2 Datebase    | org.h2.Driver                               |    


<h2>DB接続</h2>

``` JAVA
Connection conn 
    =DriverManeger.getConnection("データベースのURL","ログインID","パスワード");
```
<h2>プリペアドステートメント</h2>

``` Java
PreparedStatment pstmt=conn.prepareStatement("SQL文");
//SQL文にプレースホルダ（？）があった場合
pstmt.setString("n番目の数","入れる文字列");
```

<h2>SQL文がSELECT文だった場合</h2>

```java
ResultSet rset =pstmt.executeQuery();//実行
rset.getString("データベースの列名"); //文字列の値を取得
```

<h2>SQL文がDDL文およびDML文だった場合</h2>

```java
pstmt.executeUpdate();//実行
```

<h2>SQLの操作を終えた場合</h2>
各々のインタフェースにclose（）；を実行する。
その際、例外処理で実行してできなかった場合にはSQLExceptionをキャッチし、
何かしらのエラーを出力。
pythonでfortigateの設定を自動取得する

### 前提条件
Fortigateはexec_commandではchannelが切れてしまうようで、

    config vdom
    edit XXXXX
に入れない

### invoke_shell()を利用する
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect('hostname', username='username', password='password')
    channel = client.invoke_shell()
こんな感じ。

    stdin = channel.makefile('w')
    stdout = channel.makefile('r')

    stdin.write('''
        config vdom
        edit XXXXX
        show firewall policy
        exit
    ''')
こうするとコマンドが流し込めます。

    for l in stdout:
        print(l)
で出力ができます。
Salesforce上級アドミニストレーター試験の公式サンプル問題解説してみた-05

こんにちは
本橋孝昭です

今回の内容は動画でも解説しています

https://www.youtube.com/watch?v=OiVY2608jeU

<iframe width="560" height="315" src="https://www.youtube.com/embed/OiVY2608jeU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


Salesforce上級アドミニストレーター試験の公式サンプル問題があるのはご存じでしょうか

こちらの受験ガイドからサンプル問題を確認することが可能です

https://quip.com/dyBMAO1z6pJ9/SALESFORCE-


https://tandc.salesforce.com/credentials


今回は
Salesforce上級アドミニストレーター試験の公式サンプル問題問目をご紹介します

なお、
以下の問題は、Salesforce 認定上級アドミニストレーター試験のサンプル問題です。問題はあく まで出題形式に慣れていただくためのものであり、試験に合格するかどうかを判断するための問題ではありません。実際の問題の難易度は、以下のサンプル問題とは異なる場合があります。

と書いてありますのでご確認ください

問題はこちらです

5)
ユニバーサルコンテナ社では、確度が 50% を下回った商談について報告する必要がありま す。システム管理者はこれらのレコードを識別する方法としてカスタムチェックボックスを 作成しました。

システム管理者はこの要件を満たすために他に何をする必要がありますか？ 答えを 1 つ選んでください。

A.  項目の履歴管理を有効にしてレポートの検索条件に履歴を含める 
B.  カスタムチェックボックスがオンの場合に商談を送信して承認を受ける承認プロセスを 作成する 
C.  確度が 50% を下回った場合に項目を更新するワークフロールールを作成する 
D.  ユーザが 50% 未満の確度を入力したときにエラーを表示する入力規則を作成する 



正解はCです


ワークフロールールを作成すれば特定の項目値が下回った場合に項目更新をすることが可能で項目自動更新が可能です
[小ネタ] 会議中に通知で信頼を失わないために

## はじめに

ビデオ会議中に通知が表示されて焦ったことはないでしょうか。
会議前に通知を切っておけば良いのですが、つい忘れたりどのように切るのかわからないということが起こりうるかもしれません。
そういうときにタスクバーのアイコンをクリックすれば通知設定のメニューを開けるような機能を実現するのがこの記事の目的です。

## 通知を切るためのメニューを一回で表示する
Windowsの設定メニューを3回くらいクリックしたら通知を切れるメニューを表示できます。
しかし、開き方を忘れたり、すぐに表示したいシチュエーションがあるでしょう。
そういうときにアイコンをクリックしたら表示するということを実現する記事です。

## powershellのスクリプトを作成

最終的にはタスクバーに以下のような「ベルのアイコン」を表示しクリックすれば通知センターが開けるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33329/c49ad504-348b-1b5f-78ea-7709e8a1d692.png)

以下のコードで通知設定を開けます。

```open_notification.ps1
start ms-settings:notifications
```

## ショートカットを作成

このコードに対するショートカットを作成します。
以下の画像のようにショートカットを保存する場所で右クリックし作りましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33329/c2be1e19-e34e-58ab-58f3-b84f7cbbf611.png)

そのショートカットのプロパティを開き、リンク先に前の節で作成したpowershellスクリプトを以下のように追加します。

```
powershell "open_notification.ps1のパス"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33329/4cb3d403-a2a0-d441-d5f4-d8b1e244fd89.png)

そしてアイコンを編集します。任意のベルの画像を設定してください。拡張子はicoが使えるので適当に変換してください。

最後にショートカットを右クリックして「その他のオプションを表示」からタスクバーにピン止めするのを選べば完了です。

これでアイコンをクリックしたら通知センターがすぐ開け事故を防げるでしょう。

### あとがき
本当は一発で通知を切る方法について調べたかったのですが、
複雑なことと目視で確認できた方が良いと思ったためこの記事のような方法にいたしました。
【tsubame】jupyterlabのカーネルを作るための関数

# ぼくがかんがえたさいきょうのかすたむかーねるさくせいかんすう
東工大のスパコンtsubameではwebサービスとしてjupyterlabを使うことができます。
jupyterlab上で使えるpythonのバージョンがデフォルトの3.6.5のみかと思い込んでいましたが、どうやら```t3jpttools```モジュールを使ってカスタムカーネルを作成することでバージョンを変更できるようです。
[Jupyter Lab 利用の手引き](https://helpdesk.t3.gsic.titech.ac.jp/manuals/jupyter.ja/)

ということで一発で所望のカスタムカーネルを作る関数を書きました。
```Python:create_kernel.py
import sys
from t3jpttools import create_kernel
​
def main():
    """
    create kernel with modules that you want to use.
    """
    print("#################################################")
    print('Be sure that your virtual env has been activated.')
    print('#################################################')
    args = sys.argv
    name = str(args[1]) # 実行しているpyファイルの名前が第一コマンドライン引数
    module_list = args[2:]
    modules =''
    modules = ' '.join(module_list)
    print(f'kernel name : {name} / modules : {module_list}')
    create_kernel(name, modules)
    print('done!!')
​
if __name__ == '__main__':
    main()
```

実行例
```terminal:Terminal
python create_kernel.py test_kernel jupyterlab/2.1.0-py383 cuda/10.2.89 cudnn/7.6 nccl/2.4.2
```
```jupyterlab/2.1.0-py383```を指定することでjupyterlab上でのpythonのバージョンが3.8.3になります。選択肢としては3.8.3か3.6.5しかないようです。
ちなみに使えるモジュールについては```module avail```でリストを表示することで確認できます。