OmniAICreator/Qiita-1.07M huggingface dataset:
Laravelでよく起こるらしいN + 1問題ってなんだ

## はじめに
この記事は「LaravelのEloquent便利だなー、リレーションの使い方を調べて見よう。ふむふむ`with`を使って書いとけばとりあえずいいんやな。」と、なぜ`with`を使えば良いかを対して理解せずに使っていたので`N + 1問題`というものがなんなのか調べてみてわかったことをまとめる記事です。

#### 環境
```terminal
$ php artisan --version
Laravel Framework 8.36.2

$ php --version
PHP 8.0.23 (cli) (built: Sep 13 2022 11:09:24) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.23, Copyright (c) Zend Technologies
```

## N + 1問題ってそもそもなに？
「N件のデータを取得し、それぞれに紐付くデータを取得する際にクエリを発行する回数が`N + 1`回になってしまうこと。」らしいです。
LaravelのようなORMがあるフレームワークを使用しているとSQLの発行回数等の意識が薄くなりがちだと思いますがパフォーマンスに大きく影響するのでEloquent等を使用する際は自身が発行しているSQLの内容をきちんと理解するのが大切ですね。（ブーメラン)

### N + 1問題が起こっているコード１例
リレーションについて調べているとよく出てくる`Book`と`Author`を例にしてかいてみます。
N件の`Book`を取得しそれぞれに紐付く`Author`を取得してみます。
```php
// use, リレーションメソッド等は省略

$books = Book::all();
foreach ($books as $book) {
    $book->author;
}
```
はい、これ`N + 1問題`起こってますよね！？って言っても見えないので見えるようにしてみます。

```php

DB::enableQueryLog();

$books = Book::get();
foreach ($books as $book) {
    $book->author;
}

dd($books, DB::getQueryLog());
```
`dd()`の第２引数に渡している`DB::getQueryLog()`で発行されたクエリを見ることができます。
`Book`取得で１回、Bookの件数分(N件)の`Author`を取得するので`N + 1`回取得していることが確認できたと思います。
(*ログも出さないなんて不親切な記事なんだ)

## N + 1問題の解決
Laravelでは`with`を使って`N + 1問題`が発生しないようにできます。

```php
DB::enableQueryLog();
$books = Book::with(['author'])->get();
dd($books, DB::getQueryLog());
```
確認すると`Book`と`Author`それぞれに１回ずつクエリが発行されていることがわかりました。めでたしめでたし。

## おわりに
これを書いたきっかけが`株式会社　ゆめみ`様が`with`についてソースコードリーディング会をされていたのでこっそり視聴させていただきました。（まったりな感じのソースコードリーディング会のようなものは参加しやすいので非常にありがたいですね。）
コードはなんとなくぎりぎりある程度・・・追うことができたのですが、`Eager Loading`や`Lazy Loading`と言った単語を良く分かっていなかったため理解しておこうと思い色々調べたので記事にしました。それでは。

https://yumemi.connpass.com/event/261231/
Djangoのログ出力

Djangoのログ出力はsettings.pyのLOGGINGに記述する
# ターミナルとファイルにログ出力する記述の例
```settings.py
LOGGING = {
    'version': 1, #ロガーのバージョン
    'disable_existing_loggers': False, #デフォルトのログを無効化するかどうか
    'formatters':{
        'standard':{
            'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter':'standard',
        },
        'file': { 
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join('logs', 'debug.log'),
            'maxBytes': 50000,
            'backupCount':2,
            'formatter':'standard',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console','file'],
            'level': 'DEBUG',
            'propagate': True,
        }
    },
}
```

## formattersの書き方
```settings.py
'formatters':{
    'standard':{ #formatter名
        'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s", #形式
    },
}
```
- %(asctime)s：ログが出力された時刻
- %(levelname)s：ログレベル名 
- %(name)s：ロガーの名前
- %(lineno)s：ログを出力した行番号
- %(message)s：ログメッセージ

## handlersの書き方
```settings.py
'handlers': {
    'console': {  #ターミナル上に出力
        'level': 'INFO',  #ログレベル
        'class': 'logging.StreamHandler', # ターミナルに表示する
        'formatter':'standard', #formatterを指定する
    },
    'file': {   #ファイルに出力
        'level': 'INFO',
        'class': 'logging.handlers.RotatingFileHandler',  #ログをローテーションしてファイルに出力する
        'filename': os.path.join('logs', 'debug.log'), #出力するファイルの場所
        'maxBytes': 50000, #ローテーションの基準となるファイルサイズ
        'backupCount':2, #バックアップを作成するファイルの数
        'formatter':'standard', 
    },
}
```
ログレベルは、CRITICAL、ERROR、WARNING、INFO、DEBUGの順で重大
時間でローテーションさせるTimedRotatingFileHandlerなどもある

## loggersの書き方
```settigs.py
'loggers': {
    'django': {
        'handlers': ['console','file'], #handlersを指定する
        'level': 'DEBUG', #ログレベル
        'propagate': True,  #親ロガーへ伝搬するかどうか
    }
}
```

## 参考
https://docs.python.org/ja/3/library/logging.html
https://qiita.com/okoppe8/items/3e8ab77c5801a7d21991
【Jetpack Compose】確認ボタンを作成する

# 概要
こんな感じで、なにかを選択する時に決定かキャンセルかを決めるボタンを作ります。
![スクリーンショット 2022-09-28 10.17.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524029/58d09314-e359-7088-2b6a-73afc05a36fb.png)

# コード
```Kotlin:confirmation.kt
@Composable
fun HandConfirmationCard(determine_button: () -> Unit, cancel_button: () -> Unit, handCardNumber: Int?) {
    Card(modifier = Modifier.size(370.dp, 200.dp), shape = RoundedCornerShape(20)) {
        Column(
            modifier = Modifier.padding(top = 20.dp),
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Text(text = "確認", fontSize = 30.sp, fontWeight = FontWeight.Bold)
            Text(text = "${deckCardNumber}を選択していいですか？", fontSize = 20.sp)
            Column(modifier = Modifier.padding(top = 20.dp)) {
                Row(verticalAlignment = Alignment.CenterVertically) {
                    Card(
                        elevation = 4.dp,
                        modifier = Modifier
                            .size(200.dp, 100.dp)
                            .clickable(
                                enabled = true,
                                onClick = cancel_button
                            )
                    ) {
                        Box(contentAlignment = Alignment.Center) {
                            Text(
                                text = "キャンセル",
                                fontSize = 30.sp,
                                fontWeight = FontWeight.Bold,
                                color = Color.Blue
                            )
                        }
                    }
                    Card(
                        modifier = Modifier
                            .size(200.dp, 100.dp)
                            .clickable(
                                enabled = true,
                                onClick = determine_button
                            )
                    ) {
                        Box(contentAlignment = Alignment.Center) {
                            Text(
                                text = "決定",
                                fontSize = 30.sp,
                                fontWeight = FontWeight.Bold,
                                color = Color.Red
                            )
                        }
                    }
                }
            }

        }
    }
}
```

# 引数
```Kotlin:引数
fun HandConfirmationCard(determine_button: () -> Unit, cancel_button: () -> Unit, handCardNumber: Int?) {

}
```
onClickでの処理をdetermine_button、cancel_buttonの引数でそれぞれラムダ式によって呼び出し先に処理を飛ばしています。
また、handCardNumberでは選ぶ手札の数値をInt型で渡しています。
AWS CLI よく使うコマンド集【忘備録】

aws cli でよく使うコマンドのサンプルを掲載しています。随時アップデートしていきます。

## EC2の情報取得

```bash
# 一覧表示
aws ec2 describe-instances \
  --query 'Reservations[].Instances[].{dns:PublicDnsName, name:Tags[?Key==`Name`] | [0].Value}' \
  --output table
----------------------------------------------------------------------------------------------------------------
|                                               DescribeInstances                                              |
+--------------------------------------------------------------+----------------------+----------+-------------+
|                             Name                             |         id           | status   |    type     |
+--------------------------------------------------------------+----------------------+----------+-------------+
|  aws-cloud9-handson-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |  i-xxxxxxxxxxxxxxxxx |  stopped |  t3.small   |
|  aws-cloud9-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx                 |  i-xxxxxxxxxxxxxxxxx |  running |  t3a.small  |
+--------------------------------------------------------------+----------------------+----------+-------------+

# 詳細表示
 aws ec2 describe-instances --instance-ids i-xxxxxxxxxxxxx --output json
```

## CloudFrontの情報取得

```bash
# cloudfrontの情報を表組みして表示
aws cloudfront list-distributions \
  --query 'DistributionList.Items[].{ID:Id, DomainName:DomainName, URL: Aliases.Items[0]}' \
  --output table
---------------------------------------------------------------------------------------------
|                                     ListDistributions                                     |
+--------------------------------+-----------------+----------------------------------------+
|           DomainName           |       ID        |                  URL                   |
+--------------------------------+-----------------+----------------------------------------+
|  xxxxxxxxxxxxxx.cloudfront.net |  xxxxxxxxxxxxx  |  xxxxx.example.jp                      |
+--------------------------------+-----------------+----------------------------------------+

# 詳細表示
aws cloudfront get-distribution --id xxxxxxxxxxxxx
```

# S3の情報取得

ダウンロードせずに内容を出力する方法

```bash
# 通常のテキストファイルの出力
aws s3 cp s3://[bucket_name]/path/to/textfile.txt -
# 圧縮ファイルの出力
aws s3 cp s3://[bucket_name]/path/to/access_log.gz - | zcat
```

### 比較

```bash
diff -u <(aws s3 cp s3://[bucket_name]/path/to/textfile.txt -) path/to/file
```


## 参考

AWS CLI 出力をフィルタリングする  
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-filter.html

JMESPath is a query language for JSON.  
https://jmespath.org/
GitHub 空リポジトリ作成 ＆ eclipse からプロジェクトを入れる

GitHub に空リポジトリを作って eclipse のプロジェクトを入れる（プッシュする）方法を備忘録でメモ

## GItHub で空リポジトリ作成
1. 左メニュー上 [New] をクリック ※画面が違う人は左上のGithub アイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/e15dfcdf-9aae-9841-11d9-9eb769dad94e.png)

1. Repository Name に適当な名前(英数字,-,_のみ推奨)いれて一番下の [Create Repository] をクリック
※ほかの値はデフォルト（任意）でOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/d30c30ac-d138-9ee3-7ba0-84ad7651feb0.png)

1. 作ったリポジトリのページに移って作成OK
水色枠にあるURLを後で使う（いつでも見れる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/74f1ebea-373d-113d-5d2d-e5a24a3b2a5f.png)

1. これで空リポジトリ作成は終了

参考： 作成後（コード入れた後）のリポジトリのURL取得方法
- リポジトリのページ開く - [Code]プルダウンを押下 - Clone より取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/dbe7c604-52d1-3b24-6293-ed3e3b1ccd32.png)

## eclipse のプロジェクトを GitHub のリポジトリに入れる(プッシュする)
eclipse から gitローカルリポジトリ作って GitHub のリポジトリに入れる感じの手順になるかと

### eclips のプロジェクトのローカルリポジトリ作成
1. eclipse のプロジェクト選択して右クリック - [チーム] - [プロジェクトの共有] をクリック 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/bb674dc0-d051-f7d6-a83c-5c3909912eab.png)

1. [Git] 選択 - [次へ] をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/e0f47b97-631f-ffad-7831-6fb3d491e764.png)

1. [プロジェクトの親フォルダ内のリポジトリを使用または作成] をチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/86c19ab2-f464-5a3b-8b0f-4c93b3592ffc.png)

1. [プロジェクト] をチェック - [リポジトリ―の作成] をクリック
    ※ダイアログに警告でてチェックされないですが気にせず [リポジトリーの作成] をクリックしてOKです！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/75025019-d031-e235-ca40-89aca19df9e5.png)

1. [完了] がアクティブになるのでクリック（ここまででがローカルリポジトリ作成）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/d60a94cf-dc4b-ce6d-13cf-2b50b23a0121.png)

1. ローカルリポジトリの作成OK

### eclips のプロジェクトを GitHub のリポジトリに入れる
1. eclipse のプロジェクト選択して右クリック - [チーム] - 上の方にある[コミット]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/3772d5db-76a0-3f62-c55b-903c818dfc26.png)

1. [Gitステージング]ビュー - [++] をクリック - [コミットメッセージ] 記入 - [コミットおよびプッシュ] をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/3ee49003-3bbb-4fc7-a2d8-7e7defe7478b.png)

1. 以下を入力して [次へ] をクリック

    - URI : Github のリポジトリより取得した URL ※これを入力でホスト、リポジトリ―パスは自動保管
    - ユーザー : Github のアカウント
    - パスワード : **アクセストークン**(コミットなどするときのために Repo の権限必要)
※アクセストークンの取得はこちらを参照 [GitHubアカウント作成＆アクセストークン取得 (2022/09/22)](https://qiita.com/sueasen/items/d00156f2617305b01511)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/8b0a3c7f-58c9-7ff8-e347-ba28cd6fd51c.png)

1. デフォルトのままで [次へ] をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/2046f2d3-c427-730d-25bf-b5cf2c1543f8.png)

1. [完了] でOK
※ URL あるのでクリックして GitHub上で更新を確認しよう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/07c01664-8c45-7aea-27e9-a7d78f89371d.png)
IT初心者がショートカットキーをまとめてみた。

# はじめに
皆さんこんにちは！　OBG新入社員の平塚です。
今回は研修で学んだ現場で使えそうなショートカットキーをまとめてみました。
未経験で入社したためわからないことが多く
勉強も含めて纏めてみたいと考え記事にしました。

よかったらご覧ください。



# 研修で必須と言われたショートカットキー

今から紹介するものは覚えておくと業務を何倍も速く終了させることができる
<font color="purple">**魔法のような**</font>ショートカットキーです。



#### 1.コピー
Windowsの場合　```Ctrl```＋```C```
Macの場合　　　```Cmd```＋```C```

- 選択したテキストやファイルのコピーができます。


#### 2.切り取り
Windowsの場合　```Ctrl```＋```X```
Macの場合　　　```Cmd```＋```X```

- 選択したテキストやファイルを移動させるために使用されることの多い
ショートカットキーです。
切り取った部分は消えますが、下記のCtrl＋Vを押すことによって
移動先に貼り付けられます。

#### **3.貼り付け**
Windowsの場合　```Ctrl```＋```V```
Macの場合　　　```Cmd```＋```V```

- 上記のコピーや切り取りなどで選択したテキストやファイルを貼り付けます。

#### 4.保存する
Windowsの場合　```Ctrl```＋```S```
Macの場合　　　```Cmd```＋```S```

- 上書き保存用のショートカットキーです。
私は正直初めて知ったショートカットキーでした。
こまめに使っていきたいですね。

#### 5.操作を元に戻す
Windowsの場合　```Ctrl```＋```Z```
Macの場合　　　```Cmd```＋```Z```

- 消してはいけないファイルやテキストを
消してしまった時などに使用します。

#### 6.全てを選択
Windowsの場合　```Ctrl```＋```A```
Macの場合　　　```Cmd```＋```A```

- フォルダの中のファイルやテキスト全体を選択ができます。
全選択した状態からCtrl+クリックで一部だけのぞけます。

#### 7.パソコン画面をロック
Windowsの場合　```Windows```（4つの四角）+```L```
Macの場合　　　```Cmd```+```Ctrl```+```Q```

- 離席するときに使いましょう。
セキュリティ対策になります。


# 覚えておくといいショートカットキー


使う頻度は高くないですが、覚えおいて<font color="light blue">**損のない**</font>ショートカットキーです。



#### 1.名前をつけて保存
Windowsの場合　　```F12```
Macの場合　　　　```Cmd```+```Shift```+```S```

- 元のファイルに変更をくわえず保存したい場合に使います。


#### 2.新しいファイル・新しいウィンドウを開く
Windowsの場合　　```Ctrl```+```N```
Macの場合　　　　```Cmd```+```N```

#### 3.表示ページを更新する
Windowsの場合　　```F5``` or ```Ctrl```+```R```
Macの場合　　　　```Cmd```+```R```

- 更新内容が反映されないときなどに使用します。

#### 4.範囲指定スクリーンショット
Windowsの場合　　```Windows```+```PrintScreen```
Macの場合　　　　```Cmd```+```Shift```+```4```

- エラーメッセージなど一部分だけをスクリーンショットしたいときに使用できます。

#### 5.デスクトップを表示させる。
Windowsの場合　　```Windows```+```D```
Macの場合　　　　```Cmd```+```F3```

- 複数ウィンドウを開いているときに全てのウィンドウを最小化にしデスクトップを表示します。

#### 6.タブ切り替え
Windowsの場合　　　   ```Ctrl```+```Tab```
Macの場合           　　　chrome：```Option```+```Cmd```+```左右キー```
  　　　　　　　　　Safari：```Ctrl```+```Tab```
　　　　　　　　　Finder:Safariと同じ

#### 7.アクティブウィンドウの切り替え
Windowsの場合　　　```Alt```+```Tab```
Macの場合      　　　　　```Alt```+```F1```

- 素早くウィンドウを切り替えたいときやウィンドウ同士を見比べたいときなどに使用されます。複数のウィンドウでコピペを繰り返すときに使用します。

#### 8.全角カタカナ
Windowsの場合　　　```F7```
Macの場合         　　　　　```Ctrl```+```K```

- カタカナに変換するときに使用します。
　F7は半角カタカナになります。

#### 9.半角英数
Windowsの場合　　　　　```F10```
Macの場合　　　　　　　```Ctrl+:```

- メールアドレスの入力など、日本語入力の状態でローマ字入力したいときに使用できます。

# 終わりに

未経験で入社し、知らないことが多く恥ずかしいと思う反面、知らなかったことを知れることが面白くとても楽しい毎日を過ごしています。
この記事を書いているときにも、実際に試しながら書いていたため少し時間がかかってしまいましたが記事を書いている時間はとても楽しかったです。
また機会がありましたら書いていきたいなと思っています。

最後までご覧いただきありがとうございました。
【React】axios.getでCloudFunctions呼び出し時に遭遇したエラーの対処法

<h2>初めに</h2>
ReactでCloudFunctions呼び出し時にエラーに遭遇したので解決策を記載します。

<h2>実行コード</h2>
今回はaxios.getを使って、呼び出しを行っています。

```main.js
useEffect(()=>{
    axios.get("https://....")
      .then(res => {
        console.log(res.data);
      }).catch(error=>{
        console.log(error);
      })
},[])
```
上記コードを実行後以下のエラーが出力されました。

```
Error: Network Error
```

<h2>対処法</h2>
Cloud Functionの関数に以下のコードを記入してください。

```
res.append('Access-Control-Allow-Origin', ['*']);
res.append('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE');
res.append('Access-Control-Allow-Headers', 'Content-Type');
```
<h2>最後に</h2>
今後もGCP関連の投稿をしていくので、ぜひご覧ください。
AWS Amplifyだけ？それともマークアップ言語全て共通のエラー？

# HTMLの名前は使っちゃいけない言葉がある？
こんにちは道産子ゆうです！

今回はAWS Amplifyのチュートリアルをやって15分くらい悩んだ内容を紹介します

プログラミング初心者なので変なことしてるかもですが、、、

## Markup.htmlをzipにしてデプロイすると
なんとAccess Deniedされました笑

index.htmlにしたら普通に表示できたんですが、命名規則があるんでしょうか…
適当に名前をつけて同じ悩みが出た人の助けになればうれしいです！
enebularでkuromoji

# 概要
enebularでkuromojiやってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2cd21d59-fb27-7451-a847-ba9ff075e3ea.png)


# インストール

- ハンバーガーメニュー>パレットの管理>ノードを追加でnode-red-kuromojiノードを検索して追加

# フローの作成

```
[{"id":"bbeddc2c.8b4bb","type":"Kuromoji Tokenizer","z":"51ad95ea.8b77ec","name":"","x":390,"y":440,"wires":[["625f2278.b53d9c"]]},{"id":"24487af2.e473e6","type":"inject","z":"51ad95ea.8b77ec","name":"","topic":"","payload":"すもももももももものうち","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":150,"y":440,"wires":[["bbeddc2c.8b4bb"]]},{"id":"625f2278.b53d9c","type":"debug","z":"51ad95ea.8b77ec","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":590,"y":440,"wires":[]}]
```

以上。
[メモ] サーバー証明書の透明性(CT/Certificate Logs)

# はじめに
ヘボいフルスタエンジニアなので、まさかり投げられるとアワアワします。
基本的にメモ、備忘録です。

# 経緯
少し前に、AWSからお知らせが来ていた

```
We are reaching out to you as you have an active AWS account with AWS Certificate Manager (ACM).
Starting October 8, 2022, any public certificate obtained through ACM will be issued
from one of the multiple intermediate CAs (ICA) or subordinate CAs that we manage.
An ICA chains up to the root CA and is used to issue the leaf certificates that
you receive and use.

The change in ICAs will be transparent to you unless you explicitly
make use of ICA information through certificate pinning.

You can read more about the changes and any actions you need to take if you pin to an ICA here [1].
If you have any questions or concerns, please reach out to AWS Support [2].

[1] https://aws.amazon.com/blogs/security/amazon-introduces-dynamic-intermediate-certificate-authorities/
[2] https://aws.amazon.com/support
```

Google翻訳にかけたものを抜粋すると

```
2022 年 10 月 8 日以降、ACM を通じて取得された公開証明書は、
当社が管理する複数の中間 CA (ICA) または下位 CA のいずれかから発行されます。
ICA はルート CA まで連鎖し、受信して使用するリーフ証明書を発行するために使用されます。
ICA の変更は、証明書のピン留めによって ICA 情報を明示的に使用しない限り、透過的です。
```

よくわからん！
特にわからんのが、、「透過的」という点
サーバー証明書が透過的ってどういうこと？

# 調べてみた
https://www.cybertrust.co.jp/blog/ssl/certificate-transparency.html

多分これ、というブログがあったので、これを私なりに読み解くと
（※私なりの解釈です、間違ってる可能性があるので、ご注意を）

```
Certificate Logs(CT ログサーバー) というログサーバーに、証明書の発行状況が保存される＋誰でも見れる
```

誰が、いつ、どんな証明書を発行したかが見えるので、
- メリット
自分でSSL証明書を発行したことが証明できる（？）
自分が発行してないのに、誰かに自分の証明書を発行されている（不正発行の確認）
- デメリット
証明書からサーバーが特定できるので、攻撃対象のピックアップに悪用されている

という感じみたい。

証明書を発行した直後
＝サーバーを新規に立ち上げた直後
＝セキュリティがガバい可能性が高い
ということで攻撃対象にピックアップされるみたいですね、ブログによると。

# ということで
AWSからのお知らせに戻ると、2022年10月8日以降、Amazon Certificate Managerで証明書を発行すると
CTログサーバーに保存される仕様になったからね、ということをお知らせしてくれたんだろうなー
【Front Door/Traffic Manager】Azureで使う負荷分散の違いをまとめてみる【Load Balancer/Application Gateway】

# 【Front Door/Traffic Manager】Azureで使う負荷分散の違いをまとめてみる【Load Balancer/Application Gateway】

## 一目でわかるようにざっくりとまとめてみました。

| サービス            | グローバルor地域 | 推奨されるトラフィック | 使いどころ                                                                                              |
| ------------------- | ---------------- | ---------------------- | ------------------------------------------------------------------------------------------------------- |
| Azure Front Door    | グローバル       | http(s)                | リージョンまたぎの負荷分散 & WAF & CDN<br>リージョンレベルの災害対策と高速化                            |
| Traffic Manager     | グローバル       | 非http(s)              | リージョンまたぎの負荷分散                                                                              |
| Application Gateway | 地域             | http(s)                | パスベースで負荷分散&TLS終端&WAFを追加できる<br>アプリケーションの一般公開&可用性ゾーンレベルの災害対策 |
| Load Balancer       | 地域             | 非http(s)              | IPアドレス&ポートで負荷分散<br>仮想ネットワーク内の負荷分散&可用性ゾーンレベルの災害対策                |


# 各種詳細な説明

# Front Door 
Webアプリケーション向けのグローバル負荷分散およびサイト アクセラレーション サービスを提供するアプリケーション配信ネットワークです。 TLS/SSL オフロード、パスベースのルーティング、高速フェールオーバー、Web アプリケーション ファイアウォール、キャッシュなどのレイヤー 7 機能をアプリケーションに提供して、アプリケーションのパフォーマンスと高可用性を向上させます。 このオプションは、複数の Azure リージョンにわたってデプロイされた Web アプリを負荷分散するようなシナリオで選択します。
# Traffic Manager 
世界中の Azure リージョン間でサービスへのトラフィックを最適に配分しつつ、高可用性と応答性を実現する DNS ベースのトラフィック ロード バランサーです。 Traffic Manager は DNS ベースの負荷分散サービスであるため、負荷分散はドメイン レベルでのみ行われます。 そのため、DNS キャッシュに関連した、また DNS TTL を遵守しないシステムに関連した一般的な課題が理由で、Front Door ほど高速なフェールオーバーはできません。
# Azure Load Balancer
すべての UDP と TCP プロトコル向けの高パフォーマンス、超低待機時間のレイヤー 4 負荷分散サービス (受信および送信) です。 これは、ソリューションの高可用性を確保しながら、1 秒あたり数百万の要求を処理するように構築されています。 Azure Load Balancer は、ゾーン冗長であるため、可用性ゾーン全体で高可用性を確保します。 Azure Load Balancer は、グローバルではなくリージョン内で動作します。
# Application Gateway
アプリケーション配信コントローラー (ADC) をサービスとして提供することで、さまざまなレイヤー 7 負荷分散機能を利用できるようにします。 これを使用して、CPU を集中的に使用する TLS/SSL 終端をゲートウェイにオフロードすることによって、Web ファームの生産性を最適化します。 Application Gateway はグローバルではなくリージョン内で動作します。
【Power Automate】コピー-->別名保存したワークシート内のテーブルにデータを追加する

[tfunakoshiさんのQiita](https://qiita.com/tfunakoshi/items/bebd41380a2fd3906939)の記事でファイルをコピーして別名保存することができます。

### この別名保存で作成したExcelファイルに行追加したい

「ファイルのプロパティを取得する」アクションの出力に完全パスがありますが
Excel Onlineコネクタの表に行を追加するアクションの入力-ファイルにそのまま設定するとフローの応答がなくなってしまいます。
上記のtfunakoshiさんのQiitaにあるとおり、Substringで"Shared Document"を削ってあげる必要があります。

```
Substring('完全パス',15)   <--Shared Documentの15文字
```

![スクリーンショット 2022-09-29 104814.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469675/f77c873e-8266-0258-3185-dd10a6d9205e.png)


### テストで躓いたところ

#### 同名ファイルを削除して毎回新規ファイルを作りたい

ファイルのコピーアクションを利用していないため、同名の場合別名でファイルをコピーする、ということができません。

今回のケースでは月次でファイルを作成するので次月はバッティングしない（無害）ので、
ファイルの削除→ファイルの原本コピー別名保存→ファイルの中身を編集というフローにしてみます。

https://blog-tips.sekenkodqx.jp/2021/01/19/power-automate-action-delete-file-sharepoint/

↑こちらの記事にあるとおり、ファイルの削除アクションは癖があるようです。
（フォルダのパスではなくIDで一意という解説が勉強になりました！）

2022/9/8時点でこの記事どおり実装すると「条件」アクション→「フォルダーの一覧」アクションの「Name」で指定する場合、判定に用いるファイル名が長いとフローの保存が正しく行われず（ファイル名が崩れる）、
変数や作成アクションでファイル名を定義して"Name"と比較しても結果がFalseになってしまい"DisplayName"と前方一致させることでTrueの判定ができる、という状況でした。

例えばフローで作成するファイルの命名がhogehoge_202208.xlsx（年月だけ変える）で、
同じ階層にhogehoge_202208（ここまで同じ）改.xlsxみたいなコピーファイルを作成されると"改"のファイルも削除されます。。
上手いやり方ではないが他にやりようがないな、というところです。


#### ファイルをロックしているため削除できません、でファイルの作成アクションが失敗する

こちらは上手い手立てが見つかっていないのですが、自分と別の人がファイルを開いているとロックされている旨のエラーとなります。
フローが途中でエラーになった後フローを編集→リランすると「（自分のメールアドレス）がファイルをロックしています」のエラーが表示されます。

自分がロックしている場合はファイルを直接削除する操作が必要になります。（アイテムの共有を外してから削除するフローの順序にしたほうがよい。。？）
【Python】Wordファイルからのテキスト抽出

# はじめに
ビジネス系部門からシステム系部門にテキスト解析して欲しいという依頼があったものの、解析対象のデータは全てWordファイル！という状況は時々あると思います。
そのような時、まずはWordファイルからテキストを抽出する必要があり、本記事ではその方法をご紹介します。

# Wordファイルからのテキスト抽出
## ライブラリのインストール
Pythonの[python-docx](https://python-docx.readthedocs.io/en/latest/)というライブラリを使えば、簡単にWordファイルからテキスト抽出ができます。
python-docxは、次のようにpipコマンドを使えば一発でインストールできます。

```
$ pip install python-docx
```

## テキスト抽出対象のWordファイル
次のようなWordファイルを用意します。ファイル名は`sample.docx`とします。
![スクリーンショット 2022-09-27 10.37.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127582/b3b6ed7b-7f5c-2e5a-d4ff-62959fb8eb46.png)

## 本文中のテキスト抽出
``` sample1.py
from docx import Document

document = Document('./sample.docx')
for i, p in enumerate(document.paragraphs):
    print(i, p.text)
```

上記のプログラムを実行すると、次のような結果が得られます。フォントサイズも関係なく、また箇条書きの文も抽出されていることが分かります。
ただし、表の中のテキストは抽出されていません。表の中のテキストを抽出するためには、別の書き方をする必要があります。

```
$ python sample2.py
0 テスト
1 これはテストです。
2 
3 みかん
4 りんご
5 バナナ
6 
7 
8 
9 Python-docx を使えば、Word ファイルから簡単にテキスト抽出ができます。
10 
11 終わり
```

## 表中のテキスト抽出
``` sample2.py
from docx import Document

document = Document('./sample.docx')
for i, t in enumerate(document.tables):
    for j, r in enumerate(t.rows):
        for k, c in enumerate(r.cells):
            print(i, j, k, c.text)
```

やや冗長な書き方になりますが、上記のプログラムを実行すると、次のような結果が得られます。
表の中のテキストをセル毎に抽出できていることが分かります。

```
$ python sample2.py
0 0 0 野球
0 0 1 サッカー
0 0 2 テニス
0 1 0 baseball
0 1 1 soccer
0 1 2 tennis
1 0 0 犬
1 0 1 猫
1 0 2 ライオン
1 1 0 dog
1 1 1 cat
1 1 2 lion
```

# Wordファイルからの文字列検索
Wordファイルからのテキスト抽出ができれば、そこから文字列検索もできます。
特定の単語の出現有無を自動判定したいというのは、ビジネス上のユースケースとしてよくあると思います。
サンプルプログラムを下記に載せておきます。

``` sample3.py
from docx import Document

document = Document('./sample.docx')
text = ''

# 本文中のテキスト抽出
for i, p in enumerate(document.paragraphs):
    text += p.text

# 表中のテキスト抽出
for i, t in enumerate(document.tables):
    for j, r in enumerate(t.rows):
        for k, c in enumerate(r.cells):
            text += c.text

# 特定の単語（例：バナナ）の文字列検索
if 'バナナ' in text:
    print('Found.')
else:
    print('Not found.')
```

# おわりに
Wordファイルからのテキスト抽出、および文字列検索の方法をご紹介しました。
本記事では、元のファイルからテキストを抜き出す処理に焦点を絞りましたが、[python-docx](https://python-docx.readthedocs.io/en/latest/)は元のファイルにテキストを追加する処理もできるようです。
サンプルコードに載っているように、テキストや表の書き込みだけでなく画像貼り付けもできます。ご興味がある方は是非チャレンジして下さい。

また、本記事ではあえて触れませんでしたが、WordファイルからではなくPDFファイルからテキストを抽出したいという場面もあると思います。
ビジネスの現場では、WordファイルよりもPDFファイルの方が使用頻度が高いはずです。
その場合、[pdf2docx](https://pypi.org/project/pdf2docx/)のようなPDFファイルをWordファイルに変換するライブラリを利用し、PDFファイルをWordファイルに変換した上で本記事でご紹介した方法を試すという解決策が考えられます。

ただし、PDFファイルをWordファイルに変換する過程で、意図しない箇所（Wordは見た目は改行されれていも文が続いていればそれを内部で把握しているが、PDFは見た目が改行されていると文が続いていたとしてもそこで改行されていると見なす）に改行が入ります。
そのため、文単位でテキスト処理をしたい場合、不具合が生じることがあります。
これはPDFの仕様上仕方がないことであり、詳しく知りたい方は[こちら](https://www.antenna.co.jp/pdf/reference/pdftext.html)の記事をご覧下さい。
その場合、PDFファイルではなくWordファイルを使うように業務側のフローを変更するなどの対応が必要になります。
大きな組織では業務側のフロー変更はハードルが高いことが多いですが、Wordファイルであればテキスト抽出からテキスト処理まで自動で処理できるようになるため得られるメリットは非常に大きいはずです。
Tello SDK を自分なりに最適化してみた（Tello-Console）

# Tello SDK を自分なりに最適化してみた（Tello-Console）
　Tello を python でプログラミングするときに辿り着く SDK、それは Tello-Python だろう。この記事ではそんな Tello-Python にある tello.py を僕なりに改良した **Tello-Console tello.py** を紹介しようと思う。
　今回初めてこのような記事を書くので、分かりづらい点もあるかもしれないが、そこは指摘があり次第、修正する。

## そもそも Tello って？
![tello画像.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729782/8d13042e-4f4d-f627-becc-fcd30bb9910d.jpeg)
　そもそも Tello って何なのか。知らない方に簡単に説明すると、**小さなプログラミングで飛ばすことができるドローン**である。とても小型なので室内で飛ばして遊ぶことができ、しかもホバリング性能やカメラの性能が類似する大きさのドローンの中ではトップクラスで優秀で、ドローンのプログラミングの入門機としてとても人気なドローンなのだ。[公式ページ](https://www.ryzerobotics.com/jp/tello)に詳細が書かれているので、是非参照してほしい。
![stella edu 画像.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729782/72fc1839-3ef4-3e80-5416-c41aeeb24085.jpeg)
　Tello にも種類があり、今回プログラミング用に特化された Tello EDU を前提に話を進める。Tello EDU は 1.7万円ほどで購入できる。 tello EDU については[こちらの公式ページ](https://www.ryzerobotics.com/jp/tello-edu)で参照できる。

## Tello-Python って？
　そんな Tello を Python を使ってプログラミングできるように公式から用意された SDK が Tello-Python だ。この中に含まれている tello.py が Tello を飛ばすのに重要なプログラムである。Tello を使ってプログラミングをしている人のほとんどがこの SDK をベースにいろんなタスクを作っていることだろう。僕もこの1人だ。
 [こちらの記事](https://www.google.co.jp/url?sa=i&url=https%3A%2F%2Fqiita.com%2Fhsgucci%2Fitems%2F3327cc29ddf10a321f3c&psig=AOvVaw17A9PsZVz1zLvllUjntgFq&ust=1663976182974000&source=images&cd=vfe&ved=0CA0QjhxqFwoTCNDixMLIqfoCFQAAAAAdAAAAABAD)で Tello-Python についての詳細やサンプルコードについての解説がされているので、Tello-Python を始めたい方は是非こちらを参照してほしい。

## Tello-Console って？
　では、そんな Tello-Console とは何なのかついて説明しよう。Tello-Console は簡単に言ってしまえば僕が作った **Tello-Python のパクリ**である。作成に至った経緯は今から1年前、大学1年の時（記述時では大学2年）に Python のクラスの勉強をしていた時、Tello-Python の tello.py がクラスで構築されているのを見て自分でもこれを1から再現しようと思ったことが始まりである。そこから色々試行錯誤をし、一般公開しても大丈夫だろうと思いブログ感覚で今この記事を書いている。

### Tello-Console の機能
　一応 Tello-Python を全部パクっているわけではなく、独自の機能も搭載している。以下が Tello-Console の機能である。
|機能名|機能の説明|
|:---|:---|
|バッテリーチェック|プログラムが実行された際にドローンのバッテリー残量を確認し、タスクが続行可能かどうかを判断する。バッテリー残量が10％以下だとプログラムは停止される。|
|タイムアウト回避|Tello は15秒間コマンドを受信しないと飛行中の場合自動で着陸してしまう。そのためプログラムが実行されたら Tello-Console 内で10秒周期で任意のコマンドを送信し、タイムアウトを防ぐ。このコマンドはユーザーが任意に設定することもできる。|
|詳細エラー表示|ドローンからのエラーはかなり大雑把だが、エラー発生前の事象とエラーの種類が分かれば原因と解決方法がわかる。この機能はドローンからの何かしらのエラー（プログラムのエラーではない）を検知し、原因と解決方法を出力する。|
|簡単なビデオデータアクセス|ドローンに搭載されたカメラデータにアクセスするには、ただクラス内の一つの変数を取得するだけでできる。Tello-Console 内でカメラデータをすぐに取得できるので、作業の手間が省ける。|

　他にも色々細かい機能があるが、この記事では記述しない。このプログラムは **[GitHub にて公開している](https://github.com/GAI-313/Tello-Console)**ので、気になる方は是非使ってほしい。また、まだ不完全の部分もあるのでさまざまのユーザーが使い、知見を共有したい。

## 今後。このサイトを通じて、tello-console のチュートリアルを随時作成していこうと思う。これから python を始める方でもわかりやすく作成する予定だ。
【JavaScript】URLパラメータを今風に取得する

# 概要

かなり昔に書かれたコード[^1]を修正していく途中で、ふと共通関数に実装されていた「URLパラメータを取ってくれるところってどんなふうに実装してるんだろう？」と気になって見てみたら、うーん。。。って思うような実装だったので、もっとスッキリした今風な書き方は無いのか調べてみたらちゃんとあったので共有します。

# 元々の実装

※一部改変を入れていますがほぼ元のコード

```js
getParam = function()
{
	var paramsArray = {};
	var url = location.href;
	var parameters = url.split("?");
	if (parameters.length == 2){
		var params = parameters[1].split("&");
		for ( i = 0; i < params.length; i++ ) {
			var neet = params[i].split("=");
			if (neet.length == 1)
				paramsArray[neet[0]] = "";
			if (neet.length == 2)
				paramsArray[neet[0]] = neet[1];
		}
	}
	return paramsArray;
};
```

URLを`?`でsplitして2つに分割できたら`?`以降を`&`で分割して、それをさらに`=`で分割して連想配列に入れていく・・・という愚直な実装

後はコーディングルール周りとして(今風な実装に書き換えるとほぼ関係ないですが)

- 変数の定義がvarを使っているレガシーな実装
- ifの中身が1行であっても`{}`使ってほしい
- 細かいところで `if ( ){` と `for () {` のように条件式の`)`とスコープ`{`の間にスペース入れる/入れないは統一したほうがいい
- neetってなんや。。。


```js
var url = location.href;
var parameters = url.split("?");
if (parameters.length == 2){
    ...
```

の箇所はそもそも`location.search`で取れますね。。。

# 元ネタ

StackOverFlowから引用させて頂いた上で補足しつつ書いていこうと思います。

https://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript

# 今風な書き方

## 実装1

```js
const urlParams = new URLSearchParams(window.location.search);

// urlParams.get('keyName') とすると値が取得できる
```

とりあえずシンプルでわかりやすい

### 詳細

[URLSerchParams](https://developer.mozilla.org/ja/docs/Web/API/URLSearchParams)を使用します。


> URLSearchParams コンストラクターは完全な URL をパースしません。ただし、先頭に ? が存在すれば、読み飛ばします。

ということで、`window.location.search`で取得できるクエリ文字列をそのまま`URLSearchParams`に渡してObjectを作れば、あとは`myParam.get(paramName)`で取得できるというわけですね。


## 実装2

```js
const param = Object.fromEntries(new URLSearchParams(window.location.search));

// paramsは連想配列なので、params['keyName']やparams.keyNameで値が取得できる
```

連想配列化したものを返す方法
(開発者ツールで`params`を見るとさっと確認できるので個人的にはこれが好み)


### 詳細

[#実装1](#実装1)と同じく`URLSearchParams(window.location.search)`でObjectを作り、[URLSearchParams.entries()](https://developer.mozilla.org/ja/docs/Web/API/URLSearchParams/entries)でKey-Valのiteratorを取得

[Object.fromEntries()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries)でKey-Valのオブジェクト(連想配列)化します。

## 実装3

```js
const params = new Proxy(new URLSearchParams(window.location.search), {
  get: (searchParams, prop) => searchParams.get(prop),
});

// params.keyName とすると値が取得できる
```

[#実装2](#実装2)よりもパフォーマンス的に良いらしいけど~~ちょっとわかりにくいかも。。。~~ Proxy()を知らなかったので、個人的にはわかりにくかったけど使い勝手は良さそう

ちょっと書き換えて

```js
const params = new Proxy(new URLSearchParams(window.location.search), {
  get: (searchParams, prop) => searchParams.get(prop) ?? '',
});
```

とすると、存在しないパラメータを参照したときにnullではなく空文字が返ってくるようにできる。

### 詳細

[Proxy](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Proxy) で`URLSearchParams`オブジェクトのgetメソッドを再定義しているので、[#実装1](#実装1)のように`urlParams.get('keyName')`のようにせずとも`params.keyName`だけで値が取得できる。

---


個人的には実装2がわかりやすくて好みです。
パラメータが大量にあって何度もパラメータを参照する処理があるならパフォーマンスも気にしなければなりませんが、そんなに呼び出されるわけではないので、デバッグもしやすそうな実装2へ置き換えすることにしました。

# 終わりに

「共通関数系は作ったら終わり！」ではなくメンテナンス大事ですね。。。

[^1]: gitやらsvnのログを辿ったところ10年近く前が起点だったので、URLSerchParamsやObject.fromEntriesは使えなかった時代ですね。。。(IEで動くことも考えていたのかも・・・にしても元のコードは冗長的・・・)
Falco Ruleを紹介するシリーズ - Console Login Without MFA

:::note info
10/28（金）コンテナクラウドセキュリティで訊かれる「ランタイムセキュリティ」とは？と題してFalcoをSysdigが徹底解説するウェビナーを開催します。ご興味ある方はこちらから
https://go.sysdig.com/20221028JapanWebinar1.html
:::
本シリーズでは、ランタイム脅威検知のデファクトスタンダードである<a href=https://falco.org/ target=new>Falco</a>の検知Ruleを、１つの記事で１つ簡単に紹介していきます。
ランタイムセキュリティやFalco自体の概要を知りたい方は<a href=https://sysdig.jp/blog/intro-runtime-security-falco/ target=new>こちらのブログ記事</a>をご参照ください。
https://go.sysdig.com/20221028JapanWebinar1.html
今回ご紹介する検知Ruleは<b>「Console Login Without MFA」</b>です。

# Rule記述
```
- rule: Console Login Without MFA
  desc: Detect a console login without MFA.
  condition:
    ct.name="ConsoleLogin" and not ct.error exists
    and ct.user.identitytype!="AssumedRole"
    and json.value[/responseElements/ConsoleLogin]="Success"
    and json.value[/additionalEventData/MFAUsed]="No"
  output:
    Detected a console login without MFA
    (requesting user=%ct.user,
     requesting IP=%ct.srcip,
     AWS region=%ct.region)
  priority: CRITICAL
  tags:
    - cloud
    - aws
    - aws_console
    - aws_iam
  source: aws_cloudtrail
```
# Rule概要
<a href="https://github.com/falcosecurity/plugins/tree/master/plugins/cloudtrail" target=new>CloudTrailプラグイン</a>をインストールすることで使用可能になるルールです。
MFA（多要素認証）なしでのAWSマネージメントコンソールへのログインを検知します。
MFAは不正ログインを防ぐために有効な手段であり、<a href="https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa.html" target=new>AWSでもMFAを設定してAWSリソースを保護することを推奨</a>しています。
AWS IAMを保護する方法については、<a href="https://sysdig.jp/blog/securing-aws-iam-with-sysdig-secure/" target=new>こちらのブログ記事</a>もご参照ください。

# Condition（条件）
`ct.name="ConsoleLogin" and not ct.error exists`
CloudTrailのイベント名が"ConsoleLogin"で、エラーが発生しておらず、

`and ct.user.identitytype!="AssumedRole"`
ユーザーのアイデンティティタイプが"AssumedRole"ではなく、

`and json.value[/responseElements/ConsoleLogin]="Success"`
コンソールログインの結果が"Success"で、

`and json.value[/additionalEventData/MFAUsed]="No"`
MFA使用が"No"の場合

# Output（出力）
MFAなしでのコンソールログインを検知しました。

`%ct.user`
ユーザー名

`%ct.srcip`
送信元IPアドレス

`%ct.region`
AWSリージョン
Azure Time Series Insights無くなるってよ

なにげなくdocs（learn?）を見ていたら、大事な情報があったので要点だけ書いておきます。

* Azure Time Series Insights、**2025年3月以降はサポートされない**。
* **Azure Data Explorerへ移行**せよ。
* 2025年3月31日までに移行していないAzure Time Series Insightsのリソースは、**自動的に削除**される。

https://learn.microsoft.com/ja-jp/azure/time-series-insights/migration-to-adx
初めてのPower BI  #1  アイコンの意味

# はじめに

データ分析・可視化というジャンルは”専門家や理系出身の人のもの”的な印象を持っている方もいらっしゃるかもしれません（私もそうでした）。
しかし、実際の業務のなかではグラフ化されていたほうがわかりやすい情報がたくさんあると思います。
売上情報や予約管理表などもパッと見て状況が分かったほうが次どうするかを判断できるし、
その分仕事も効率的に進められて結果として業務時間短縮にもなりそうです。

データ分析を業務に活用いただけるよう**データ分析を難しく考えすぎずデータで遊ぶ** ことを体感していただきたい。
そんな思いでPower BIをお客様に紹介しています。

このブログではお客様にPower BIを紹介している中でお客様からよく聞かれる質問を紹介していこうと思います。

# 今回は「アイコン」

Power BI Desktopを使ってレポート作成しようとすると、フィールド一覧の中にマークがついているケースがあることに気が付かれるかと思います。
「きっと何か意味があるのかなぁ」くらいの気持ちでレポート作成していただくことももちろん可能です。（正直、私がそうでした。。。）

　　　『このゼットみたいなマーク（＝シグママーク）なんですか？』
　　　『テーブルにfxついてるのは何ですか？』
　　　
お客様と会話しているなかでよく聞かれるポイントなので、ちゃんと確認してみました。

当時はPower BIのこういった情報は複数のDocsに分散していたので確認作業が大変だったのですが、最近はDocs記事も充実しているので、こういったアイコンマークの紹介もちゃんと記事として公開されてました。:hugging:

よく聞かれるシグママーク、計算機マークだけでなく、テーブルにfxがついてるマークなどなど、今まで（私が）スルーしてきたアイコンたちの詳細を説明してくれているので慌てずにレポート作成できるようになりました。

"フィールド一覧アイコン"
https://learn.microsoft.com/ja-jp/power-bi/transform-model/desktop-field-list#field-list-icons

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851825/0d1385e6-7c20-c19f-bff7-68f25f489ac4.png)


また、パワポなどでアイコンを使って説明資料を作成したいといった要望をお持ちの方もいらっしゃるかと思います。
githubでアイコン集が公開されていましたので、こちらもご活用ください。

"Power BI アイコン集"
https://github.com/microsoft/PowerBI-Icons

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851825/a0c2baff-7f9c-1f59-0b62-301f9841b5c6.png)

# おわりに
Power BI Desktop ツール自体は無償なのでどなたでもダウンロード可能です。

https://learn.microsoft.com/ja-jp/power-bi/fundamentals/desktop-get-the-desktop

Power BI Desktop は Excel のような操作感でデータを収集して、PowerPoint のような操作感で画面を作成できるツールです。

無償ツールなので是非気軽に触っていただきデータ分析を業務に活用いただけるよう**データ分析を難しく考えすぎずデータで遊ぶ** ことを体感していただければ嬉しいです。
UbuntuにDocker-composeをインストールする手順

## 事前知識

https://qiita.com/ryome/items/240f36923f5cb989da27

https://qiita.com/ryome/items/4b6b934b1b2021acfa26

https://qiita.com/ryome/items/6e59dcbe4735d45d58a3

https://qiita.com/ryome/items/3d4de62b560aac31bede

## UbuntuにDocker-composeをインストールする手順

1.パッケージをアップデートする
- コマンド
```
sudo apt-get update
```

- 実行例
```
$ sudo apt-get update
[sudo] password for ユーザ名:
Hit:1 http://archive.ubuntu.com/ubuntu focal InRelease
...省略
```

2.必要なパッケージをインストール
- コマンド
```
sudo apt install apt-transport-https ca-certificates curl software-properties-common
```

- 実行例
```
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
Reading package lists... Done
Building dependency tree
Reading state information... Done
...省略
```

3.docker-composeのインストール
- コマンド
```
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```

- 実行例
```
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 12.1M  100 12.1M    0     0  10.4M      0  0:00:01  0:00:01 --:--:-- 25.4M
```

4.`chmod` でdocker-composeコマンドを扱えるようにする
- コマンド
```
sudo chmod +x /usr/local/bin/docker-compose
```

5.docker-composeのバージョン確認
- コマンド
```
docker-compose -v
```

- 実行例
```
$ docker-compose -v
docker-compose version 1.29.2, build 5becea4c
```

## 関連
https://qiita.com/ryome/items/54d23052babda2d88bf6

https://qiita.com/ryome/items/12d8fb5f64acfbdd22e9

https://qiita.com/ryome/items/873938ca6734adec1c11

https://qiita.com/ryome/items/c9fded9da60bce0f0b94
WineHQ公式のUbuntuインストール手順不具合対応 (Fix install process)

##### おはようございます。(ただいまAM6:20)ねむねむ(ふわぁぁぁ〜

##### WineHQ公式のインストール手順に(ぶんぶん)振り回されて完徹明けの筆者です。

##### 公式のUbuntu向けインストール手順を調べていて、なんとかインストール済までもっていくことができたので、共有します。

## **-- 追記 2022/10/20 --**
#### winehqの公式がDevelopment版について、7.18から7.19にバージョンアップした際に、サイトのインストール手順のapt-keyのdepricated対策をしたようです。
#### 以下、公式より引用です。
#### --ここから-------------------------------------------------
#### ・Apt-key is now deprecated
#### Previously, apt-key was used to add the Wine key. If you get this warning, remove the Wine key with: sudo apt-key del "D43F 6401 4536 9C51 D786 DDEA 76F1 A20F F987 672F" And remove the the line about the WineHQ repository from \/etc\/apt\/sources.list(.d\/\*).
#### --ここまで-------------------------------------------------
#### 意訳すると、以前はapt-keyを使ってwine keyを追加してたけど、もし警告が出てたなら、apt-keyでキーを削除する行をやめて、公式リポジトリより、\/etc\/apt\/sources.list(.d\/\*)のキーを削除するようにしたよ、的な感じでしょうか。
#### というわけで、この記事は過去のものとなりました。

### **環境**

|   | バージョン | エディション  |
|:-:|:-:|:-:|
| Zorin OS | 16.1 (※) | Pro |
| WineHQ | 7.18 | Developer |

(※: Ubuntu 20.04相当

WineHQのUbuntu向け[**インストール手順ページ**](https://wiki.winehq.org/Ubuntu)

公式からですが、途中に追加の手順が入るので、変更がない手順も引用しておきます。

#### Preparation
```shell:bash
$ sudo dpkg --add-architecture i386
```


#### Add the repository
```shell:bash
$ sudo mkdir -pm755 /etc/apt/keyrings
$ sudo wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key
```


#### Move the key file (追加)
```diff_shell:bash
+ sudo mv /etc/apt/keyrings/winehq-archive.key /usr/share/keyrings/
```


##### Select your Ubuntu version and download the WineHQ sources file:
|   |   |
|:-:|:- |
| **Ubuntu 22.04** (Jammy Jellyfish) **Linux Mint 21.x** | $ sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/jammy/winehq-jammy.sources |
| **Ubuntu 20.04** (Focal Fossa) **Linux Mint 20.x** | $ sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/focal/winehq-focal.sources |
| **Ubuntu 18.04** (Bionic Beaver) **Linux Mint 19.x** | $ sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/bionic/winehq-bionic.sources |


#### Install Wine
|   |   |
|:-:|:- |
| Stable branch | $ sudo apt install --install-recommends winehq-stable |
| Development branch | $ sudo apt install --install-recommends winehq-devel |
| Staging branch | $ sudo apt install --install-recommends winehq-staging |


**sudo apt update** のところで公開鍵エラーになっていた原因は、**Add the repository** でキーファイルを作成したキーリングディレクトリにダウンロードしてくるのですが、その後にダウンロードする **/etc/apt/sources.list.d/winehq-focal.sources** の最下行(Signed-By項目)でキーファイルの指定先ディレクトリが違っていたからという(~_~:::
そりゃあ、がんばってキーファイルをダウンロードしてきても読み込めんわな、と。

なので、 **Move the key file (追加)** でキーファイルを指定先ディレクトリに移動してやれば、 **sudo apt update** の公開鍵エラーも消え、WineHQがダウンロードできるようになる、という仕組みです。

ただ、この方法自体、あまり良いやりかたではないかもしれない(セキュリティ的に)ので、あくまで公式が手順を修正するまでの暫定手順かな、という感じです。

##### 現在AM7:37。
##### これで心置きなく眠れます(笑

##### つぎの投稿はいつになるかわかりませんが、気が向いてなになトピックがあれば投稿しますんで、そのときまでまた〜 (^_^)/~~~
Awkワンライナーでズンドコキヨシ

株式会社船井総研デジタルのよもぎたと申します。よろしくお願いいたします。

最近ズンドコキヨシというものを知り、Bashの機能のみでそれを実現しました。ふとどのくらいズンドコしたらキヨシ！に到達できるのだろう？と気になり、100万1回ループさせて待ち時間が発生しました。
そこで、```Awk```ワンライナー版のズンドコキヨシを作成しました。使用したのはGNU AwkでVersionは次の通りです。

```bash
$ awk --version
GNU Awk 5.1.0, API: 3.0 (GNU MPFR 4.1.0, GNU MP 6.2.1)
Copyright (C) 1989, 1991-2020 Free Software Foundation.
```

作成したワンライナーと実行結果は次の通りです。

```awk
$ awk 'BEGIN{srand();list=""; while(list!="dzzzz"){if(rand()<0.5){zd="z"; printf("%s","ズン");}else{zd="d"; printf("%s","ドコ");} list=substr(zd list,1,5);} printf("キ☆ヨ☆シ\n")}'
ドコズンズンドコズンドコズンズンドコズンドコドコズンズンドコズンドコズンドコズンズンドコズンズンドコズンズンズンドコドコドコドコドコズンドコドコズンドコズンドコズンドコドコドコズンズンズンドコドコズンズンドコドコズンズンズンドコズンドコズンズンドコドコドコズンズンドコズンドコズンドコドコドコドコズンズンドコズンドコズンズンドコズンドコドコズンズンズンドコズンドコズンズンズンズンドコキ☆ヨ☆シ
```

ロジックは基本Bash版と同じです。違うのは次のような点でしょうか。

* ```Awk```はrand()関数を使うのに先にsrand()関数で乱数生成器を初期化してやる必要があります。
* ```rand()```関数が返してくれるのは0から1までの実数なので、```0.5```をズンドコボーダーにしました。
* ```AWk```版はズンドコ試行回数を数えるのはやめました。

すべてを```BEGIN{}```に入れてしまったのですが、```printf("キ☆ヨ☆シ\n");```は```END{}```に入れてもよかったかもしれません。ていうか、本来終わりの処理だし…と考えちゃいますが、ワンライナーでそこまで気にすることもないですかね。

100万1回ループさせてるBash版ズンドコ試行は現在60万回程度の進捗です。集計まで記事にしていると始業に間に合いそうにありません。終業後にやるしかないでしょうか。

**終業後の時間に趣味をやる時間があるというのに困惑しなくなってきました。社畜ぶりが弱まってきたなと思います。良い傾向です。本当に転職してよかったです。**

**趣味がズンドコ試行というのはどうなんだ、という問題はありますが。**

朝起きて始業（在宅勤務）前にこんなことをしていて、今日は一日頭の中でズンドコズンドコ繰り返されそうです。

# 参考にした記事
* [ズンドコキヨシ on LISP](https://qiita.com/hisawotakase/items/2e7c2a1a3e4dcb518f85)
* [ズンドコキヨシまとめ](https://qiita.com/shunsugai@github/items/971a15461de29563bf90)
* [Qiitaの「ズンドコキヨシ」タグ](https://qiita.com/tags/%e3%82%ba%e3%83%b3%e3%83%89%e3%82%b3%e3%82%ad%e3%83%a8%e3%82%b7)
* [The GNU Awk User’s Guide](https://www.gnu.org/software/gawk/manual/gawk.html)
* [Bashの機能だけでズンドコキヨシ](https://qiita.com/t_ymgt/items/8ef1a3f071a85236b0d6)

最後までお付き合いいただきありがとうございました。
Arduino UNOで有機エレクトロルミネッセンス時計。(DS1307)(Adafruit SSD1306,Adafruit GFX)


x ライブラリのインストール方法は、めんどいので省略
x サイズは、約13KB

x 時間合わせは、別
x Arduino UNOは、そのArduino UNO互換機

x 非営利、研究調査目的で引用する。


目的
OLEDのテスト
アイテンドウの0.96 128x64(OLED) OLED096UNO-A
秋月のDS1307ZN+T&R I-06950


![o_con804.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0d5a20b0-0088-7f26-8bb0-00208f74aa18.jpeg)


![o_con625.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a8b58d6a-bd52-6332-8c34-c36507c2d89b.jpeg)




参考



https://qiita.com/jakalada/items/793a6cf5ff2796db4e86



STM32G071のプログラムの完全にそのまま



```c++



#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>



#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);



// コンパイル時にヘッダーファイルが適切に編集されていない場合に
// "Height incorrect, please fix Adafruit_SSD1306.h!"
// というエラーを表示するための記述
//#if (SSD1306_LCDHEIGHT != 64)
//#error("Height incorrect, please fix Adafruit_SSD1306.h!");
//#endif

// RSTピンがない互換品を使用するので-1を指定
//Adafruit_SSD1306 display(-1);

void setup() {
  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
}


// デバイスアドレス(スレーブ)
#define ADDR    0x68    // 2進数 1101000

char data_read[16];


void loop() {
  // 画面表示をクリア
  display.clearDisplay();

  // テキストサイズを設定
  display.setTextSize(3);
  // テキスト色を設定
  display.setTextColor(WHITE);
  // テキストの開始位置を設定
  display.setCursor(0, 10);


  // レジスタのアドレスを先頭にする
  Wire.beginTransmission(ADDR);
    Wire.write(0x00);
  Wire.endTransmission();
  delay(1);

  // I2Cスレーブに8byteのレジスタデータを要求する
  Wire.requestFrom(ADDR, 8);

  // 8byteのデータを取得する
  for (int ii = 0; ii < 8; ii++) {
    while (Wire.available() == 0 ) {}
    data_read[ii] = Wire.read();
  }
  delay(1);




  //表示変換する
  char str1[16];
  str1[0] = '0' + (data_read[2] >> 4);
  str1[1] = '0' + (data_read[2] & 0xf);
  str1[2] = ':';
  str1[3] = '0' + (data_read[1] >> 4);
  str1[4] = '0' + (data_read[1] & 0xf);
  str1[5] =  0;




  // 1行目に"Hello"を表示
  display.println(str1);
  // 2行目に"World!"を表示
  //display.println("World!");

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000);
}



```
エンジニアチームで自社サービスを実際に触ってみる会を企画したら結構良かった件

## はじめに
私は現在、[Catallaxy](https://catallaxy.me/)というスタートアップで、
「[Mitsuri](https://mitsu-ri.net/)」という金属加工の商取引プラットフォーム(SaaS)の開発しています。

エンジニアチームで自社サービスを実際に触ってみる会を企画したら
結構良かったので、今回記事にしてみました。

## なぜ企画したのか

実は私自身、この会社に入社してまだ二ヶ月ほどなのですが、
スタートアップという特性上、開発スピードが非常に速く、
システム仕様については実際にコードを触りながら把握するという感じでした。

仕様のドキュメントに関しては、
開発スピードの関係ですぐ風化してしまうという問題もありました。

なので、自分自身のシステム仕様&サービスの把握と、
サービスの品質向上のために、現状の良いところ悪いところをみんなで把握しようという試みで企画しました。

~~仕様がよく分からんなら、先輩方に解説してもらえば良いんや~~

ちなみに技術スタックとしては以下のような感じです。
TypeScript + React + Ant Design + frourio（NextJS + fastify, TypeORM, PostgreSQL）

エンジニアチームはフルスタックなメンバーが集まっております。

自社サービスを実際に触ってみる会の名称は、「Mitsuriを見る会」としました。

## どうやったか

弊社は全員がフルリモート勤務なので、
エンジニアチームで、Slackの一つのチャンネルのハドルに集まり、リモートで行いました。

私(ファシリテーター)が画面共有をしてサービスを触りながら、参加者がその箇所の仕様またはUI/UXについて
会話するという流れで進めました。

時間に関しては当初、30分~60分程度を想定しました。

## 何が良かったのか？

サービスの使い方はもちろんですが、
実際の開発した時の状況(なぜその機能が必要になったのか)や、どう実装したのかを実装した本人たちから聞けたので、すんなりと仕様の把握ができました。

また、諸先輩方でも自分達が触ってこなかった機能の仕様を
正しく把握できていなかったことが見えてきたので、全員にとって有意義な時間となりました。

UI/UXに関しても、エンジニア視点ならではの濃い話ができたと思います。

## 反省点

話が盛り上がりすぎて、想定していた時間を1時間以上にオーバーしてしまいました。
翌日、さらにその続きで2時間ほど話し込みました。笑
まずは特定の領域に限り(例えば、会社情報の編集画面だけなど)、時間を決めて取り組むのが良さそうです。

また、弊社はタスク管理にAsanaを利用しているのですが、
そのタスク作成(チケット起票)のために、しっかり内容がわかるように話した内容をチャンネルのスレッドに書き留めておけば良かったかなーと思いました。

## まとめ

「Mitsuriを見る会」は今後スケジュールを調整し、月に一度行なっていくこととなりました。

また、私のように新人がプロジェクトに参画した際にもオンボーディングを兼ねて行うことで、
新人にとってシステム仕様&サービスの把握ができ、先輩は他機能の把握、自身の実装の振り返りが行えて
お互いにwin winではないでしょうか。

今後もこのような企画を考えて、やってみて良かったら記事にしようと思います。
Mode X ⇔ Mode Y みたいなボタンを並べたUIの間に何かこうピカピカする矢印のアニメーションを入れたいな、と思って書いた HTML+SCSS+JS の例

# つまりこういうUIの矢印のところ

![a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33891/66887316-b0e4-cfa7-ca40-578d65589f29.gif)

# CodePen

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="YzLYReL" data-user="usagi-network" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/usagi-network/pen/YzLYReL">
  Untitled</a> by Usagi Ito (<a href="https://codepen.io/usagi-network">@usagi-network</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 実装の要

この手の「背景スクロール」はタテなりヨコなりのスクロールを伴ったシューティングゲームやRPGのマップチップ、あるいはGoogle Mapsや地理院地図のタイルデータ、あの手のスクロール技術の原理的な部分が大昔から使われ続けています💪 ゲームの背景や地図タイルだと気が付きやすいですが、今回のように文字が対象だと思いつくまでに少し頭をひねる事になりますね。

※矢印は文字なのか？⇨今回はGoogle Font/Material Iconsを使っていますが、使わずに `《` `》` あるいはUNICODE絵文字でも同様です。💡

- `-webkit-background-clip: text` `-webkit-text-fill-color: transparent` を使うと文字をステンシルにして透かした `background` を表示できる。(`background-clip`は標準化されているけど標準版の挙動ではこの実装を書いた時点のChrome-105で期待動作しなかったため `-webkit` 版を使用しています。)
- `background-size` `background-position` で背景は比較的柔軟かつ簡単に広げたり見せる位置を調整したりしやすい。
- と、いうわけで後は CSS Animation で比較的かんたんにできちゃいます。

## おまけ: `:has` があれば .js なしでも・・・？

⇧は`<button>`の`:hover`(≈`onpointerenter`&`onpointerleave`) 制御は .js で書きましたが、 `:has` 疑似セレクターが Chrome の通常リリースチャンネルに降ってきた今ではたぶん今回のようなHTML構造でも子要素に`:hover`を持った親要素(`:has(:hover)`)がどうしたこうしたで辿れば .js なしでもたぶん実装できる。たぶん。

そう思って書いてみたけど何故か片方しか発動しないのでとりあえず stackoverflow してみました👀

- https://stackoverflow.com/questions/73872857/there-are-two-has-selectors-but-only-one-of-them-is-active
- https://codepen.io/usagi-network/pen/VwxyRaM

# 参考

- https://stackoverflow.com/a/50797549/1211392
- https://dev.to/gmeben/animating-gradients-with-pure-css-3bi8
- https://developer.mozilla.org/en-US/docs/Web/CSS/background-clip
AdMobでアプリを紐付けようとすると追加済みと表示されてアプリを紐付けられない問題の解決法

こんにちは。[virapture株式会社](https://virapture.com)でCEOしながら[ラグナロク株式会社](https://ragna-rock.com)でもCKOとして働いている[@mogmet](https://twitter.com/mogmet)です。

今回はadmobのtips的なメモです。

## 問題

admobの収益が悪くなぜかと思って調べたらadmobとストアの紐付けができてないことが確認できました。

そこでストアを追加しようとしたのですがなぜか追加済みと表示されて追加できませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/0731fd07-034d-a378-346a-949e14957aa8.png)

[お問い合わせ](https://admob.google.com/intl/ja/home/request-consult/)もしようと思ったのですが、エラーによってお問い合わせできない状況でした。

## 解決法

一覧からみたら既にリンクした他のappがあるのが原因でした。
しかも非表示にしていたせいで見つけられませんでした。

右上の全てのアプリを選択したら発見することができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/8e74348f-1fd3-2bef-f706-a8d2b6470579.png)


## まとめ

admobのアプリは一度作ったら消すことができないので間違えて作ったとしても大切に扱いましょう。
また非表示は使わないようにしましょう！

最後に、[ワンナイト人狼オンライン](https://online.1nite-jinro.com/link/blog)というゲームを作ってます！よかったら遊んでね！

https://online.1nite-jinro.com/link/blog

他にも[Camecon](https://camecon.me/)や[Offcha](https://offcha.com/)、問い合わせ対応が簡単にできる[CSmart](https://csmart.jp/lp)、フリーランスのコミュニティの[NextFreelance](https://next-freelance.net/)といったサービスも作ってるのでよかったら使ってね！

https://camecon.me/

https://offcha.com/

https://csmart.jp/lp

https://next-freelance.net/

また、チームビルディングや技術顧問、Firebaseの設計やアドバイスといったお話も受け付けてますので御用の方は弊社までお問い合わせください。

https://virapture.com/

ラグナロクでもエンジニアやデザイナーのメンバーを募集しています！！楽しくぶち上げたい人はぜひお話ししましょう！！

https://ragna-rock.com