OmniAICreator/Qiita-1.07M huggingface dataset:
Lambdaのtimeoutを検知してSlackに通知する

Lambdaのtimeoutを検知してSlackに通知する。
検知Lambdaが、検知対象のLambdaCloudwatchのtimeoutをトリガーとして、SNSを配信する。
# やること概要
* SNSを作成する
* timeout_checkのLambdaを作る
* テスト用Lambdaを作る


# SimpleNoticeService（SNS）

## トピックを作成
名前と表示名 `lambda_timeout_check`
`スタンダード方式` （FIFOでも変わらないと思う）

## サブスクリプションの作成
プロトコル： `EMAIL`
宛先： `Slackのチャンネルのメール`

サブスクリプションを作成すると初回のみ認証メールが届くので、メール内リンク `Confirm` を押す。


# テスト用Lambda
## コード
意図的にタイムアウトするよう処理を書きます。
`hoge-timeout-tester`

```python:
import json
import time

def lambda_handler(event, context):
    # TODO implement
    
    print("処理を開始")
    time.sleep(1)
    print("1秒経過しました。")
    
    time.sleep(9)
    print("10秒経過しました。")
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```

一般設定＞タイムアウト は初期値 `3秒` のままでよい。
コードをDeploy後、Testで走らせておく。

# チェック用Lambda
## コード
`hoge-timeout-monitor`

```python:
import os, json, base64, zlib, datetime, boto3

def lambda_handler(event, context):
    # print("### event", event)
    # print("### context", context)
    
    data = zlib.decompress(base64.b64decode(event['awslogs']['data']), 16+zlib.MAX_WBITS)
    data_json = json.loads(data)
    
    log_target_lambda = json.loads(json.dumps(data_json["logGroup"], ensure_ascii=False))
    log_target_lambda = log_target_lambda.split('/')[-1]
    print('### log_target_lambda', log_target_lambda)
    
    log_target_logstream = json.loads(json.dumps(data_json["logStream"], ensure_ascii=False))
    print('### log_target_logstream', log_target_logstream)
    
    
    log_entire_json = json.loads(json.dumps(data_json["logEvents"], ensure_ascii=False))
    log_entire_len = len(log_entire_json)
    
    print('### log_entire_json', log_entire_json)
    print('### log_entire_len', log_entire_len)
    
    for i in range(log_entire_len): 
        log_json = json.loads(json.dumps(data_json["logEvents"][i], ensure_ascii=False))

        log_timestamp = datetime.datetime.fromtimestamp(log_json["timestamp"]/1000, datetime.timezone(datetime.timedelta(hours=9)))
        
        msg = f'【メール内リンクは触らないで！通知解除ボタンです！】\nTimeoutエラーが発生しています。至急確認してください。\n●Lambda：{log_target_lambda}\n　●CloudWatch\n　・Log stream：{log_target_logstream}\n　・timestamp：{log_timestamp}\n\n【メール内リンクは触らないで！通知解除ボタンです！】'
        print("### msg", msg)

        try:
            sns = boto3.client('sns')
            publishResponse = sns.publish(
                TopicArn = os.environ['SNS_TOPIC_ARN'],
                Message = msg,
                Subject = "Timeoutエラー: " + log_target_lambda
            )
            print("publishResponse:",publishResponse)
            print("### SNSメッセージ送信完了")
        except Exception as e:
            print(e)
    
    return
```

## 環境変数
`SNS_TOPIC_ARN` : `SNSトピックのARN`

## 起動時間（タイムアウト）
一般設定＞タイムアウト : `1分程度`

## トリガーの設定
`CloudWatch Logs`
`hoge-timeout-tester(チェック対象としたいLambda関数のCloudWatch)`
フィルター名： `Task timed out`
フィルターパターン： `Task timed out`

# テスト
testerLambdaを実行させ、意図的にタイムアウトを起こす。
Slackに通知が走ればOK。
PHP strrev関数のマルチバイト対応

この記事はPHP 8.1.11を使用しています。

strrevがマルチバイト対応していないのでstrrevのマルチバイト対応関数をmb_strrevとして作成してみます。
結果から先にお伝えするとマルチバイト対応パターン1での対応が良さそうでした。

## マルチバイト非対応
PHP標準関数のstrrevはマルチバイト対応に対応していないためstrrevにマルチバイト文字列を使用すると文字化けします。
```php
$str = 'https://hogehoge.jp/りんご/バナナ/山田太郎/';
echo(strrev($str));
```
結果
```
'/��㎃骤尔籱匀�/��⊃㊃㐃㝀�/��━㓂㊂㙀�/pj.egohegoh//:sptth'
```
## マルチバイト対応パターン1
文字列を1文字ずつ配列化 -> 要素を逆順 -> 文字列化します。
```php
$str = 'https://hogehoge.jp/りんご/バナナ/山田太郎/';
echo implode('', array_reverse(mb_str_split($str, 1, 'UTF-8')));
```
結果
```
'/」郎太田山「/”ナナバ”/’ごんり’/pj.egohegoh//:sptth'
```

## マルチバイト対応パターン2
文字列を1文字ずつ配列化 -> 要素を逆順 -> 文字列化します。
```php
$str = 'https://hogehoge.jp/りんご/バナナ/山田太郎/';
$length = mb_strlen($str, 'UTF-8');
$array = [];
for ($i = 0; $i < $length; $i++){
    $text_string = mb_substr($str, $i, 1);
    $array[] = $text_string;
}

echo implode('', array_reverse($array));
```
結果
```
'/郎太田山/ナナバ/ごんり/pj.egohegoh//:sptth'
```
## パターン1とパターン2のパフォーマンスを比較
### パターン1
```php
$str = str_repeat('https://hogehoge.jp/りんご/バナナ/山田太郎/', 100);
for ($n = 0; $n < 10; $n++) {
    $time_start = microtime(true);

    $res = implode('', array_reverse(mb_str_split($str, 1, 'UTF-8')));

    $time_end = microtime(true);
    $time = $time_end - $time_start;
    echo $time . "\n";
}
```
計測結果
```
0.00064992904663086
0.00030207633972168
0.00022697448730469
0.00016403198242188
0.00016188621520996
0.00016283988952637
0.00016283988952637
0.0001988410949707
0.00016283988952637
0.00016188621520996
```

### パターン2
```php
$str = str_repeat('https://hogehoge.jp/りんご/バナナ/山田太郎/', 100);
for ($n = 0; $n < 10; $n++) {
    $time_start = microtime(true);

    $length = mb_strlen($str, 'UTF-8');
    $array = [];
    for ($i = 0; $i < $length; $i++){
        $text_string = mb_substr($str, $i, 1);
        $array[] = $text_string;
    }
    $res = implode('', array_reverse($array));

    $time_end = microtime(true);
    $time = $time_end - $time_start;
    echo $time . "\n";
}
```
計測結果
```
0.11650204658508
0.13163304328918
0.11916780471802
0.11850309371948
0.12335705757141
0.12020015716553
0.11864614486694
0.12817692756653
0.11864900588989
0.13683700561523
```
比較したところパターン1の方が数百倍程度パフォーマンスが良い結果となりました。

## 関数化
パフォーマンスの良かったパターン1をmb_strrevとして関数化して完了とします。
```php
public static function mb_strrev(string $str, string $from_encoding): string //{{{
{
    return implode('', array_reverse(mb_str_split($str, 1, $from_encoding)));
}
```
EC-CUBE4独自プラグインのパッケージ化

# 動作環境
php 7.4.27sy
EC-CUBE4.1.2-p1
Symfony 3.4.49
MariaDB　10.5.13

# プラグイン基本設定
file:/var/www/html/example.com/app/Plugin/CompanyNameOriginalPlugin
code:CompanyNameOriginalPlugin
name:companynameoriginalplugin
プラグイン名称:会社名オリジナルプラグイン

# 準備
### 使用していないファイルは削除

`/var/www/html/example.com/app/Plugin/CompanyNameOriginalPlugin`　内に使用していないファイルが残っていないか確認する

例）
CompanyNameOriginalPlugin/Controller/Admin
　　　　∟CompanyNameOriginalPluginController.php（使用中）
　　　　∟Controller.php（使用していないデフォルトファイル）

→使用していないファイルは削除

### composer.jsonを確認

name: パッケージ名
`"ec-cube/[プラグインコード]"`
namespace に対応している必要
例）
namespace:CompanyNameOriginalPlugin
name:ec-cube/CompanyNameOriginalPlugin


version: バージョン
` "version": "1.0.01"`
プラグインのバージョン番号
バージョンは1.*.**の形式で記入
1.0.00では申請できないため、最初のバージョンを1.0.01にする

description: [プラグイン名称]
`"description": "会社名オリジナルプラグイン"`
例）会社名オリジナルプラグイン
![スクリーンショット 2023-04-20 11.25.27のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/75fef23f-e312-c373-ab6c-e713ec10946c.png)

type: パッケージタイプ
`"type": "eccube-plugin"`
と記述

require: 依存パッケージ
プラグインが利用するパッケージがあれば追記します。
`"ec-cube/plugin-installer": "~0.0.7 || ^2.0"`
は常に記述してください。

extra: 付属情報
"code": "[プラグインコード]" を記述
`"code": "CompanyNameOriginalPlugin"`

・［ベンダー名］［プラグイン名］が推奨されている
・キャメルケースで記述
◯ CompanyNameOriginalPlugin
✗ companynameoriginalplugin
✗ company_name_original_plugin
・サーバーのプラグインディレクトリ名に対応する必要
例）
サーバーパス：/var/www/html/example.com/app/Plugin/CompanyNameOriginalPlugin
→ "code": "CompanyNameOriginalPlugin"
![スクリーンショット 2023-04-20 11.25.27のコピー2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/e93e2a59-4fb8-d3fb-e3a6-82af6cded080.png)



```
{
    "name": "ec-cube/companynameoriginalplugin",
    "version": "1.0.0",
    "description": "会社名オリジナルプラグイン",
    "type": "eccube-plugin",
    "require": {
        "ec-cube/plugin-installer": "~0.0.7 || ^2.0"
    },
    "extra": {
        "code": "CompanyNameOriginalPlugin"
    }
}
```

# プラグインパッケージ化
プラグインルートに移動
/var/www/html/example.com/app/Plugin/CompanyNameOriginalPlugin

```
cd app/Plugin/CompanyNameOriginalPlugin
```

`COPYFILE_DISABLE=1 tar --exclude  ".git" --exclude ".DS_Store" -cvzf ../[PluginDir].tar.gz *`でパッケージ化

```:/var/www/html/example.com/app/Plugin/
COPYFILE_DISABLE=1 tar --exclude  ".git" --exclude ".DS_Store" -cvzf ../CompanyNameOriginalPlugin.tar.gz *
```

# ファイルの確認

```
ls /var/www/html/example.com/app/Plugin/

CompanyNameOriginalPlugin
CompanyNameOriginalPlugin.tar.gz
```

*****
# 参考記事
https://github.com/EC-CUBE/ec-cube/issues/4737
Google UXデザイン：UXデザイナーの分類

# はじめに

わたしが[Google UX Design Certificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/masami-atwvn/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

https://qiita.com/mapami/items/71dadc7256b87d2b6fed

# 現在のコース

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/6a4c4f5e-8148-b120-42be-7acb1cd54a86.png" width="700">

<details><summary>これまでの振り返り</summary>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/d371bce4-836a-0ba5-fd7d-9d2e55f1b909.jpeg" width="700">

</details>

# UXデザイナーの分類

あなたが働く場所やキャリアパスによっては、特定の分野の知識を深く持っているかもしれません。あるいは、それぞれの分野で一般的な知識やスキルを持っているかもしれません。

UXデザインの仕事を見つけようとするとき、ジェネラリストを目指すのか、それともこれらのようなスペシャリストを目指すのかを考えることが重要です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/adddfc08-bc3b-18c0-6052-07fc554ce09d.png" width="700">

<dl>
  <dt>ビジュアルデザイナー</dt>
  <dd>図像、タイポグラフィー、色、スペース、レイアウトを使用して、製品や技術がどのように見えるかに焦点を当てます。</dd>
  <dt>インタラクションデザイナー</dt>
  <dd>製品の体験や機能をデザインすることに重点を置きます。</dd>
  <dt>モーションデザイナー</dt>
  <dd>ユーザーが製品内を移動するときの感覚や、アプリやWebサイトのページ間のスムーズな遷移を実現する方法について考えます。(ユーザーフロー、ワイヤーフレーム、プロトタイプなど）</dd>
  <dt>ユーザーインターフェース（UI）デザイナー</dt>
  <dd>UI、つまりユーザーインターフェイスのデザイナーは、ビジュアルデザイナーと似たような責任を負っています。デジタル製品のインターフェイスの見た目と機能をより重視し、ワイヤーフレームや情報アーキテクチャにはあまり重点を置きません。</dd>
  <dt>プロダクトデザイナー</dt>
  <dd>プロダクトデザイナーは、ビジュアルデザインとインタラクションデザインの両方を扱う傾向があり、製品全体がどのように組み合わされるかを把握する責任を負っています。プロダクトデザイナーは、ブランディングチームと協力して、製品のブランドやマーケティングを定義していくこともあります。</dd>
  <dt>UXデザイナー</dt>
  <dd>ジェネラリストとしてのスキルが必要で、幅広い職務をサポートします。</dd>
  <dt>スペシャリスト</dt>
  <dd>インタラクションデザイン、ビジュアルデザイン、モーションデザインなど、ある特定のUXデザインの役割を深く掘り下げていく仕事です。</dd>
</dl>
pythonでのファイル分割

# 環境
Python 3.11.0

# 参考
https://zenn.dev/t_takaji/articles/d29814d01a8555

# 内容
大容量のcsvファイルを分割して保存する必要があったため
参考をもとに作成

```file_section.py
input_file_name  = 'file_name.csv'
output_file_name = input_file_name.replace('.csv', '') + '_%d.csv'
file_encode = "utf-8"

# １ファイルあたりの行数
line_max = 200
# 初期化
line_index = 1
file_seqno = 1

with open(input_file_name, 'r', encoding=file_encode) as in_file:
    line = in_file.readline()
    while line:  
        # line_maxに達したらファイル名(番号)更新
        if line_index > line_max:
            line_index = 1
            file_seqno += 1
        with open(output_file_name % file_seqno, 'a', encoding=file_encode) as out_file:
            line_index += 1
            out_file.write(line)
        line = in_file.readline()
````

実行するとこんな感じで出力されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1822494/48cac631-ff25-1b9f-8df5-019e57e8a361.png)

以上！
配列の要素の追加、削除のまとめ(JavaScript)

配列の要素の追加、削除のまとめです。JavaScript編です

```JavaScript
'use strict';
    const scores = [80,90,40,70];
    // 要素の前に配列を追加
    scores.unshift(46,48);
    // 配列の要素の1番後ろを削除する
    scores.pop();

   for(let i=0;i<scores.length;i++){
    document.write(`<p> Score${i} : ${scores[i]} </p>`);
   }
```
unshiftメソッドで要素の1番前に要素を追加します。
popメソッドを使って要素の1番最後を削除します。

```JavaScript
 'use strict';
    const scores = [80,90,40,70];
    // 要素の後ろに配列を追加
    scores.push(60,50);
    // 配列の要素の1番最初を削除する
    scores.shift();

   for(let i=0;i<scores.length;i++){
    document.write(`<p> Score${i} : ${scores[i]} </p>`);
   }
```

pushメソッドで要素の1番後に要素を追加します。
shiftメソッドを使って要素の1番最初を削除します。
【悪用厳禁】straceコマンドで他の人の行動を追跡する

船井総研デジタルのよもぎたです。

[Linuxでのstraceコマンドの使い方まとめ](https://qiita.com/t_ymgt/items/7f13c89b08b889da2146)記事を書いていて、他の人のシェルにアタッチすれば、アタッチしたシェルで何をしているか追跡できるよね、と思ったので、具体的に考えてみました。

**タイトルにある通り、悪用厳禁でお願いします。他のユーザーのプライバシーは尊重しましょう。**

相手が悪意を持ったユーザーでもない限り、使う場面はないと思います。ただ、気付いたらまとめておきたい性分なので、まとめます。

# 他のユーザーが実行したコマンドを追跡する

``execve``システムコールを追跡することで、他のユーザーが実行したコマンドを追跡します。

**追跡される側**
```bash
$ ps | grep bas[h]
   2935 pts/2    00:00:00 bash
$ who >/dev/null
$ bash -c "date >/dev/null"
$ <CTRL-D>
logout
```

**追跡する側**
```bash
$ sudo strace -e execve -f -p 2935
strace: Process 2935 attached
strace: Process 2969 attached
strace: Process 2970 attached
[pid  2969] execve("/usr/bin/ps", ["ps"], 0x557f10ea52a0 /* 24 vars */) = 0
[pid  2970] execve("/usr/bin/grep", ["grep", "--color=auto", "bas[h]"], 0x557f10ea52a0 /* 24 vars */) = 0
[pid  2969] +++ exited with 0 +++
[pid  2970] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2969, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
strace: Process 2971 attached
[pid  2971] execve("/usr/bin/who", ["who"], 0x557f10ea52a0 /* 24 vars */) = 0
[pid  2971] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2971, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
strace: Process 2973 attached
[pid  2973] execve("/usr/bin/bash", ["bash", "-c", "date >/dev/null"], 0x557f10ea52a0 /* 24 vars */) = 0
strace: Process 2974 attached
[pid  2974] execve("/usr/bin/date", ["date"], 0x560baa96cf30 /* 24 vars */) = 0
[pid  2974] +++ exited with 0 +++
[pid  2973] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2974, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
[pid  2973] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2973, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
strace: Process 2975 attached
[pid  2975] execve("/usr/bin/clear_console", ["/usr/bin/clear_console", "-q"], 0x557f10ea52a0 /* 24 vars */) = 0
[pid  2975] +++ exited with 1 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2975, si_uid=1000, si_status=1, si_utime=0, si_stime=0} ---
+++ exited with 0 +++
```

# ``su``した時のパスワードも丸見え

``read()``、``write()``を追跡することで、``su``した時のパスワードも見えてしまいます。

**追跡される側**
```bash
$ su - test
Password:
su: warning: cannot change directory to /home/test: No such file or directory
$ <CTRL-D>
$ <CTRL-D>
```

**追跡する側**
```bash
~$ sudo strace -e read,write -f -p 3486 2>&1 | grep -A1 Password
[pid  3502] write(2, "Password: ", 10)  = 10
[pid  3502] read(0, "P@ssw0rd\n", 511)  = 9
```

同じようなやり方で、sshの秘密鍵を盗み見ることも出来てしまいます。冒頭にも書きましたが**悪用厳禁、他のユーザーのプライバシーを尊重する**ようにお願いします。

最後までお読みいただきありがとうございました。
某ゲームでわかる！オブジェクト指向(ざっくり分かりたい人向け)

その昔、文系からシステム会社に就職したものの、基本情報試験合格という課題を課せられました。
午後の基本情報試験は選択問題があり、Javaで戦うことを決意し猛勉強を始めました。

ところが、全くabstractやclassの概念が頭に入らず、頭の良い人に泣きつくことにしました。

**※大まかな枠を掴むレベルなので詳しく知りたい方は別の記事をご覧ください**

##  オブジェクト指向が分からない・・・
対策本とか読んでいると下記の３原則が出てきます。
・継承
・カプセル化
・ポリモーフィズム
これらを理解することでオブジェクト指向の理解度が大きく変わります。(個人的感想)


## Fateに置き換えて考えよう
私は特別Fateが好きとかではないのですが、ちょうどそのスマホゲームをやっていたので題材にしてくれました。
設計によって作り方は変わってきますのであくまで一例として認識いただければと思います。

## オブジェクト
英霊たちがオブジェクトにあたります。器を求めて攻撃したり、呪いをかけられたり、必殺技(メソッド)を使ったりします。
このクラスがわちゃわちゃすることで物語（システム）が動きます。

## インターフェース
サーヴァントという概念にあたります。
オブジェクトたちがぐちゃぐちゃだと物語がおかしくなったり、性能差がありすぎてバトルにならないなど問題が起きます。
ある程度決まりを持たせるために枠を作ってあげなければなりません。
それがインターフェースです。
例えば、「サーヴァントには宝具という必殺技を持っている」や「ランク」「属性」などのパラメータを持っています。

注意点としては、このインターフェース時点では「どういう宝具か」や「何属性か」は分からないという点です。あくまで枠であり実体ではないということを理解しておきましょう。
(Java8以降、defaultを使って実装可能らしい。言語によって違うのも要注意。)

## abstractクラス
アブストラクトクラス、抽象クラスと呼ばれます。カタカナで書くと変な感じがしますね。
これがセイバーやライダーなどのクラスにあたります。
セイバーのクラスには基本ステータスが設定されていたり、特殊能力があります。別のクラスにもそれぞれ異なる設定することができます。
ただし、アブストラクトクラスのみで実体化(オブジェクト)はされません。セイバーと言われても思い浮かぶのが、アルトリアペンドラゴンなのか、武蔵ちゃんなのかと「どれ？」と指定できないですよね。抽象的だから＝抽象クラスと覚えるとよいでしょう。
インターフェースとは違いは項目が設定された状態にできることでしょう。（細かく言うと違うところもありますが。。。）

## 継承
セイバーのクラスで「ケンシン」というサーヴァントを新規で作りたい場合、セイバーというアブストラクトクラスを継承した「ケンシン」を作れば完成です。
この「ケンシン」はセイバーとしての能力を持った実体(オブジェクト)になります。
作りたいものに合わせたアブストラクトクラスを作成、継承させてサーヴァントを作ると物語(システム)に合う実体(オブジェクト)を何も考えることなく作ることができます。

## カプセル化
アルトリアペンドラゴンと名前が分かると宝具が分かってしまい攻撃を受けやすくなります。それを防ぐために身命を隠して戦いますよね。
とはいえ、マスターも知らないとなると困るので真名を取得できるようにメソッドを持っておきます。すると、よくありがちな「実体の名前」と直接取得はできないが、「実体の名前を取得してきてくれい」や「実体の名前をくださーい」とマスターしか知らない呪文を唱えれば取得が可能です。
このように情報が簡単に漏れないよう隠しておくことカプセル化といいます。

## ポリモーフィズム
必殺技は宝具として扱われていますが、宝具の中身はそれぞれ違います。つまり、
宝具→アルトリアペンドラゴン→エクスカリバー
宝具→エミヤ→UBW
みたいに呼び出し方は同じでも実体(オブジェクト)が違うことで振る舞いが変わることをいいます。

## 結論
オブジェクト指向って意外と身近なものでも置き換え可能っぽいですね。
今回はゲームで例えたので実際のゲームのそんな感じで作ってるのかなーという感じですが。。。
個人的にはとてもしっくりきましたし、おかげで基本情報試験に合格できました。
【Flutter】アニメーションライブラリ「Lottie」の使い方 + 色変更

# はじめに

[lottie](https://pub.dev/packages/lottie) というパッケージを使えば、簡単にFlutterのアプリに以下のようなリッチなアニメーションを組み込むことができます。これの簡単な使い方とアニメーションの色を動的に変更する方法について記事にしてみました。

![lo-sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658739/aa6cedc4-1940-4a69-9622-19966a16bee1.gif)



# 使い方

## 準備

まずは使用するアニメーションを探します。下記サイトから入手可能です（ログイン必要）

https://lottiefiles.com/


今回は [こちら](https://lottiefiles.com/69380-success-check) を題材に説明します。

`Download` > `Lottie JSON` でjsonファイルをダウンロードします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658739/a672cf10-2a63-3ff4-c1ac-c62ae53fc009.png" width="600px">

ダウンロードしたファイルをプロジェクト内に配置し、`pubspec.yaml` を編集しておきます。(今回はassetsフォルダを作成しその中に`success_check.json`という名前で配置してます。)

```yaml
flutter:
  assets:
    - assets/
```

続けて、パッケージの依存関係も追加しておきます。

```yaml
dependencies:
  lottie: 2.1.0
```

https://pub.dev/packages/lottie


## コード

読み込ませるのは簡単で、`Lottie.asset()`で先程配置したjsonファイルのパスを指定するだけでOKです。

```dart
import 'package:lottie/lottie.dart';

...
..
.

  Widget build(BuildContext context) {
    return Center(
      child: Lottie.asset('assets/success_check.json'),
    );
  }
```

実行結果↓

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658739/9ebd0b6f-1bc9-36e5-907c-b67b113a835b.gif" width="300px">



# 動的に色を変更

読み込むアニメーションは実行時にプロパティ（色、不透明度等）を変更することができます。先程のアニメーションの色を実際に変えてみましょう。


まず、色が使用されているレイヤーを探します。今回使用したjsonファイルを開くと`layers`の構成は以下のようになっており、ここから変更したい色が使われている部分を見つけます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658739/879cf022-63c8-d27d-e407-916dcceec956.png" width="300px">



次に、アニメーションを読み込む際の引数`delegete`でアニメーションのプロパティを変更できるので、これを利用して色を変えます。

`ValueDelegate.color`の第１引数には、先程見つけた色が使用されているレイヤーを指定します。（`[レイヤー名, 要素名]` みたいに指定します）

`value` には変更後の色を指定します。


```dart
    return Center(
      child: Lottie.asset(
        'assets/success_check.json',
        delegates: LottieDelegates(
          values: [
            ValueDelegate.color(
              ['Shape Layer 2', '**'],
              value: Colors.cyan,
            ),
            ValueDelegate.color(
              ['Shape Layer 1', '**'],
              value: Colors.cyan[100],
            )
          ],
        ),
      ),
    );
```

実行した結果が以下になります。色が変わることを確認できました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658739/d2b8545c-cbf1-c4fb-8d67-803956b7dc54.gif" width="300px">



これを利用すると、アプリのテーマカラーの変更に合わせてアニメーションの色も変えるみたいなこともできますね。

# 備考

## ライセンス

配布されているアニメーションのライセンスはダウンロードページの下部に記載されており、基本的に [Lottie Simple License (FL 9.13.21)](https://lottiefiles.com/page/license) です。利用する際は確認しておきましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658739/2b91bfff-78bd-e07d-fa5d-84ebc7b0e817.png" width="600px">



以上です。

# 参考

[lottie - pub.dev](https://pub.dev/packages/lottie)

[lottiefiles.com](https://lottiefiles.com/)
AuraDefinitionBundleとAuraDefinitionとの子リレーション名

[AuraDefinition](https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_auradefinition.htm)オブジェクトにはAuraDefinitionBundleIdtという参照フィールドがあるので[AuraDefinitionBundle](https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_auradefinitionbundle.htm)オブジェクトとは親子の関係だと思っていいでしょう。

といういうことは子リレーション名が分かれば以下のように検索できると思っています。

```
select Id , (select Id, from 子リレーション名) from AuraDefinitionBundle
```

しかし見つからないんですよね。
AuraDefinitions　かなぁって思ったけどエラーになる。

子リレーション名を探すいい方法はないかと調べてみると...
よさげなApex Classが紹介されている。

+ [How to find an Object Child Relationship Name](https://salesforcecentral.com/how-to-find-an-object-child-relationship-name/)

2つのメソッドが紹介されているけど、結果は同じみたい。

```

        //Create sobject Instance 
        sObject dynamicObj = (SObject)Type.forName(parentsObj).newInstance();
        //get the type token
        SObjectType sObjType = dynamicObj.getSObjectType();
        //get describe
        DescribeSobjectResult sObjDescribe = sObjType.getDescribe();
        //loop through children
        for(Schema.ChildRelationship rels :sObjDescribe.getChildRelationships()){
            //find the child
            if(String.ValueOf(rels.getChildSObject()) == childsObj){
                return rels.getRelationshipName();
            }
        }
        return null;
    }
```

```
public static Map<String, ChildRelationship> getChildRelationshipMap(String parentsObj){

        Map<String, ChildRelationship> sObjChildRelationshipName = new Map<String, ChildRelationship>();
        //Create sobject Instance 
        sObject dynamicObj = (SObject)Type.forName(parentsObj).newInstance();
        //get the type token
        SObjectType sObjType = dynamicObj.getSObjectType();
        //get describe
        DescribeSobjectResult sObjDescribe = sObjType.getDescribe();
        //loop through children
        for(Schema.ChildRelationship rels :sObjDescribe.getChildRelationships()){
            //put the child in map
            sObjChildRelationshipName.put(String.ValueOf(rels.getChildSObject()), rels);
        }
        return sObjChildRelationshipName;
    }
```

でわ、早速調べてみますか？

```
system.debug(fkd_common.getChildRelationshipName('AuraDefinitionBundle', 'AuraDefinition'));

>null

system.debug(fkd_common.getChildRelationshipMap('AuraDefinitionBundle').get('AuraDefinition').getRelationshipName());

>null
```

えええ、結果はnull。子リレーション名が無いってこと。何でだ？
CJ Moses’ Security Predictions for 2023 and Beyondを斜め読みしながら、来年のAWSセキュリティを考えてみた



# はじめに
面白そうなe-Bookが公開されていたので、朝の英語の勉強がてらに流し読みしつつ、簡単な感想文を書いてみました。
https://aws.amazon.com/jp/blogs/security/new-ebook-cj-moses-security-predictions-in-2023-and-beyond/

メモ書き感覚で書いたため、齟齬などあるかもですが、何かあればコメントいただければ！

# 各章ごとの考察
## PREDICTION 1 - Security Will Be Integral to Everything Organizations Do
ここでは、文字どおり組織という意味でOrganizationsを使われていますが、組織単位でのガバナンスを効かせる機能を包含したAWS Organizationsの利活用が2023年は加速しそうです。
2022年は、弊社アイレットを含む、日本のクラウドインテグレーター各社からAWS Organizationsをお客様にてご利用いただけるサービスが提供されました。これにより、今後、より複数のアカウントを統合的にご利用されるお客様が増えると推測します。

2023年は、より便利にと同時に、より安全にご利用いただくためのサービスの提案も必要と考えます。

CSPM(Cloud Security Posture Management)が有効なシーンが増えてくると見込んでいます。
AWSでは、Security Hubやサードパーティツールでの実現が可能です。

## PREDICTION 2 - Diversity Will Help Address the Continued Security Talent Gap
この章は個人的に目から鱗でした。
自分自身、Divercityの推進は積極的にと考えいましたが、セキュリティ面でも効果的ということを理解できました。

さまざまなバックボーンを持つメンバーの採用による、ドメインごとの体制強化だけでなく、育成を前提とした採用も行うことで、経験者が見落としがちな部分の気づきも得られるかもと思いました。

## PREDICTION 3 - Automation Driven by AI/ML Will Enable Stronger Security
AI/MLを取り入れたサービスは数年前から増え続けていますが、2023年は[ハイプ・サイクル](https://www.gartner.co.jp/ja/research/methodologies/gartner-hype-cycle)の啓発期に入るサービスも増えてくると思います。
GuardDutyなどは、すでに啓発期に入っていると思いますが、それ以外のサービスが日本でも有効になってくると予想します。

AWS Identity and Access Management Access Analyzerはもっと活用されてもいいサービスと考えます。
Amazon Macieもローカライズが進めば、活用の機会も増えそうに思っています。

## PREDICTION 4 - People Will Drive Greater Data Protection Investment
データ保護は引き続き重要です。同時に、データ管理も重要です。
どこに重要データを置いているのかをしっかりと管理をして、定めたリテンションポリシーで運用しましょう。

この章については、AWSについてではなく、新しいサービスやサービス進化でもないと読み取ってます。
従来のデータ管理の重要性を改めて問われている章でした。
基本的なことのようですが、正しく運用することは簡単ではありません。

## PREDICTION 5 - More Advanced Forms of Multi-Factor Authentication Will Become Pervasive
2023年はMFAの普及が加速しそうです。

今でも、MFAは多くの場面で利用されていますが、さらに多くの場面で利用されるでしょう。
また、何かしらのMFAを使うだけでなく、MFAの強度を検討することも増えそうです。
認証の仕組みを理解の上、適切な選択をしましょう。

## PREDICTION 6 - Quantum Computing Will Benefit Security
この章については、少し先の未来に向けた取り組みのように考えています。

一方、バイデン政権下で進むであろうポスト量子暗号に遅れを取らないよう、情報のキャッチアップは重要です。
セキュリティ攻撃は、世界中からくることを想定する必要があります。

# まとめ
PREDICTION 4のような普遍的なことと、PREDICTION 6のような近未来的なこと、双方ありつつページも多くないので、ちょうどいい読み応えでした。
個人的には普遍的なことの方が、それだけ重要ということなんだと納得してます。

2023年は、とくにAWS Organizationsの普及に合わせた組織レベルでのセキュリティが重要になってくると考えてますので、引き続き情報のキャッチアップと、お客さまに向けた分かりやすくて使い勝手のいいサービスを検討していきたいと思います。
AndroidでNavigationを使ったDeep Linkの実装Part2

# 初めに
今回は届いた通知からDeep Linkを取り出す方法を紹介していきます
### 本文
`FirebaseMessagingService`を継承したクラス内部で下記のように実装することでFcmから受け取った通知に入っている`DeepLink`を取得することができます。
ついでに、通知のタイトルやメッセージの取得方法も載せておきます
```kotlin
override fun onMessageReceived(remoteMessage: RemoteMessage) {
        val deepLink = remoteMessage.data[PAYLOAD_NAME] ?: return null
        val title = remoteMessage.notification?.title ?: return
        val body = remoteMessage.notification?.body ?: return
    }
```
### 最後に
今回は、届いた通知に入っているDeepLinkの取得方法を紹介しました
次回の記事は追加次第リンクを貼り付けようと思ってるのでぜひご活用ください
Part1は下記の記事になります
https://qiita.com/ryuji_sato/items/a54a0530065637be1fa1
Part3は下記の記事になります
https://qiita.com/ryuji_sato/items/5cfe994cfe1fbe0c5976
NetBSD/armのカーネルビルドオプション

NetBSD/armでカーネルビルドでbuild.shに-V COPTS=-Osをつけたときのサイズを確認してみました。

armv6でNetBSD 10.99.2でgccは10.4.0です。

|オプション|サイズ(netbsd.ub)|
|:--|:--|
|無し(デフォルト)|3349652|
|-Os|3036436|

ざっくり一割くらい削減できているようです。

ブートは出来ましたが、ちゃんと使えるかはわからないのでテストが必要だと思われます。これくらいの差だとテストの手間を考えるとデフォルトの方が良いかもしれません。
1分で理解する基本情報技術者試験: OS編

## 記事の目的

- エンジニア実務や営業商談で使いそうなIT知識をざっくり理解したい。
- 基本情報技術者試験を受ける予定はないが勉強はしておきたい

## 関連記事
https://qiita.com/miumi/items/9ed3027ac74207302f2b?utm_campaign=post_article&utm_medium=twitter&utm_source=twitter_share
  
# OSとは？

OSとはハードウェアとソフトウェアの仲介役です！
というわけなのですが、ハードウェアとソフトウェア(アプリケーション)とは何なのかを下記にまとめました

- ハードウェア
    - CPU、メモリ、ハードディスク、入力装置、出力装置
- ソフトウェア
    - ワープロ、ゲームソフトなど
    - 応用ソフトウェアとも呼ばれる
- OS
    - ハードウェアとソフトウェアの仲介役
    - 基本ソフトウェアとも呼ばれる

![スクリーンショット 2022-12-26 8.47.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/4020bf72-36d6-63ac-458d-4274a3eb8fb3.png)


もうちょっと詳しい図を書くと下記の通りになります

![スクリーンショット 2022-12-26 8.44.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/6aafa699-6c0c-1c84-72f0-ef460b731c4d.png)


### 基本ソフトウェアとは？

- 制御プログラム(メイン)
    - 応用ソフトウェアやミドルウェアからコンピューターを利用するためのソフトウェア
        - これをカーネルと呼ぶ
    - 狭義のOS
- 言語処理プログラム
    - CとかPythonとか
- サービスプログラミング
    - ファイル圧縮など

## お世話になった本
https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C04%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF-%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297124513
Power Apps でデータ送信前に最終確認画面を表示する

# はじめに

Power Apps でフォームコントロールを利用してデータの登録をするアプリを作る際、入力したデータの送信前に入力した内容付きで最終確認画面を表示したいという場合があります。
アプリの利用者からするととても親切ですね。

いくつかアプローチがあるのですが、例えば、以下のアプリでは、[送信] ボタンを押すとデータが送信されますが、その前に、最終確認画面を簡単に表示する方法を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/f6658999-fbec-bd15-7567-77ff658c50c8.png)

# 実現方法

今回は、以下のような最終確認画面を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/1be1fa2c-a481-f1da-65dc-eb57112d6ef0.png)

構成した部品は以下のような感じです。コンテナーを利用していますが、もちろん、グループでも実現可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/460d623d-c614-cc9c-24c9-8b29ca7a1297.png)

ポイントとなる箇所を説明します。

## フォーム コントロール

まず、フォームのモードをビューにします。こちらのフォームでデータを送信するわけではなく、あくまで最終確認画面としてアプリ利用者に表示させたいだけのためです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/dc9e1d71-bd73-db64-f054-3c297ac5944e.png)
続いて、データソースをデータ送信用に作成していたフォームと同じにして、`[Items]` プロパティを以下のようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/252f6360-4330-824f-da11-f1290989f558.png)

```
FormNewRequest.Updates
```

入力画面で入力していた内容が最終確認画面に表示されていることが確認できます。
最終確認画面にラベルを沢山配置して、以下のフォームのそれぞれのデータカードの値を参照する方法と比較すると凄く簡単ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/6c89bbbf-4ae2-3cea-08cd-41d957cdc25b.png)






## その他

あとは、元々のフォームの `[OnSelect]` プロパティの内容を変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/a771d6b1-88b9-6351-fdd4-5b2b47d087e8.png)

データを送信する代わりに、最終確認画面を表示するための変数を true にします。

```
Set(gblShowLastConfirm,true)
```

以下のコンテナーの `[Visible]` プロパティを変数名にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/a7e687fe-ef2c-1fe6-9f2d-0487dd8941b8.png)

送信ボタンの `[OnSelect]` プロパティを以下のように変更します。
(こちらの箇所でデータ送信を行います)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/2693b394-6e58-0b94-ed8a-b0b24a549f14.png)

```
SubmitForm(FormNewRequest);
Set(gblShowLastConfirm,false)
```

最後にキャンセルボタンの `[OnSelect]` プロパティは以下の通りです。

```
Set(gblShowLastConfirm,false)
```

これで、ちょっといい感じの最終確認画面が出来ました。
【Svelte】やさしい神経衰弱ゲームを作ってみた

普段フロントエンドをReactやVueで書くことが多い私ですが、先日[SvelteKit 1.0](https://svelte.jp/blog/announcing-sveltekit-1.0)が発表されたので、記念に触ってみようと思い神経衰弱を作ってみました。

遊び方は普通の神経衰弱と同じです。最初に答えの絵柄を表示してシャッフルしているので、「やさしい神経衰弱」というタイトルにしました。瞬間記憶が得意な方は簡単かも。

https://easy-memory-game.vercel.app/

※PCのChromeブラウザ推奨

リポジトリも載せておくので気になる方はご覧ください。

https://github.com/mori-goq/easy-memory-game

# 解説

このゲームの特徴であるシャッフル動作について解説します。この動きはアニメーション機能の`flip`関数を利用しています。

コードの書き方は簡単で、そもそもカードは配列のループで表示させているのですが、DOMで`animate:flip`属性を追加して、元の配列の順番をランダムに入れ替えるだけです。後はSvelteが良しなに動かしてくれます。

ただし注意なのはシャッフルの際に、表示の動作時間を考慮する点です。1回毎にシャッフル時間+200ミリ秒待つことでスムーズな動作を表現しています。

```html
<script lang="ts">
  // シャッフル
  for (let _ of [...new Array(SHUFFLE_COUNT)]) {
    cardList = arrayShuffle(cardList)
    // シャッフルの動作を待つ
    await new Promise(resolve => setTimeout(resolve, SHUFFLE_DURATION + 200))
  }
</script>

<div class="box card-board">
  {#each cardList as card (card.id)}
    <div animate:flip="{{ duration: SHUFFLE_DURATION }}">
      <!-- 省略（カードの画像） -->
    </div>
  {/each}
</div>
```

# まとめ

初めてSvelteでコードを書いたため、Svelteの良さを活かしきれていないかもしれませんが、今回のシャッフルの動きを`flip`だけで実現できるのはSvelteの良さかなと思います。Svelteは[ドキュメント](https://svelte.jp/docs)や[チュートリアル](https://svelte.dev/examples/hello-world)が充実しており、初心者の方でも勉強しやすいので試してみてはいかがでしょうか。

# 参考サイト

https://svelte.jp/tutorial/animate

https://svelte.dev/repl/e2a353ab1df74f0e83a692d2dbedba48?version=3.24.1

# 最後に
### GoQSystemでは一緒に働いてくれる仲間を募集中です！

ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site?qiita=5607f99ca7eb0e615cbe
【断念】Androidの標準機能で音声認識（Oculus）を試す

少し気になっていた以下の記事を元に、Android自体の機能で
Oculusの音声認識ができるかを試します。

http://fantom1x.blog130.fc2.com/blog-entry-273.html

ダウンロードはこちらから。

https://booth.pm/ja/items/1556439

毎回思うのですが、先達は本当にすごいなと（感謝
早速、Oculus用にカスタマイズを行ってみます。

## サンプルのチェックを実施
ボタンがUnityのボタンでしたので、Oculusインテグレーションを導入して試したのですが
上手くボタンが押せず断念。

構成を確認したうえで、いったんMRTK3を入れて
動作をチェックすることにしました。
→やはり移動などの画面処理ができない状態に...

## コード解読に時間を要するようです...

マニフェストの問題が挙げられるようで、ますはその書き換えが必要とのことです。

http://fantom1x.blog130.fc2.com/blog-entry-284.html#fantomPlugin_SpeechReconizer_manifest

Go言語の習得が必要そうになる点、作品完成まであと2か月というスパンでの実装は
難しいと判断したため、また余裕があれば、Go言語の習得と実装を試してみたいと思います。
CDLE youth についてとこれからについて

# まずはじめに

この記事は僕をはじめとする10人以上の学生有志が運営している CDLE youth という団体が今後どのような方向に向かっていこうと考えているのかを述べたものです。CDLE youth というコミュニティに興味のある学生さん・協同でイベントの企画希望がある社会人の方がいらっしゃいましたら以下のリンクまたはTwitterの [@CDLE_youth](https://twitter.com/CDLE_youth) のDMまでぜひご連絡くださりますと大変幸いです！

:::note info
→[**HP**](https://sites.google.com/view/cdleyouthhp)
:::
:::note info
→[**申し込みページ**](https://sites.google.com/view/cdleyouthhp/%E3%81%8A%E5%95%8F%E5%90%88%E3%81%9B?authuser=0)
:::

# CDLE youth について
CDLE youth は大学にある様なエンジニア・CS系の団体やサークルではなく、**全国の大学生**を対象にしたオンラインコミュニティで、2020年に作られ、G検定・E資格保持者によって運営されています。また参加者も基本的には検定・資格保持者が多いです。

そしてCDLE youth の理念は<font color="Red">**AIを学ぶ学生の未来を広げる**</font>です。

> 欧米や東アジア隣国に比べて日本ではエンジニアリングやCS等を学ぶ学生を取り巻く環境が整備されていないこと、これらの職種の社会的地位がまだ十分に確立されていない現状を踏まえて、それらを改善していきたいという考えを踏まえた上で考えられた理念です。

また、一般社団法人日本ディープラーニング協会様やCDLE様といった大きな組織からのご支援をいただきながら活動を続けています。
> [日本ディープラーニング協会とは](https://www.jdla.org/)
> [CDLEとは](https://cdle.jp/about)


***CDLE youthの主な活動内容***
* 2022年の[**Retail AI Championship (RAIC)**](https://prtimes.jp/main/html/rd/p/000000035.000043820.html) で全国の大学生（や海外大生）のべ300名以上の学生が参加するコンペ・ハッカソンを実施しました。
* その他のイベントについては[こちらのページ](https://sites.google.com/view/cdleyouthhp/%E6%B4%BB%E5%8B%95%E3%83%96%E3%83%AD%E3%82%B0?authuser=0)からご覧ください

また運営メンバーも非常に優秀で卒業生は名だたる企業に就職しています。

***運営メンバーの出身大学***
* 旧帝大、早慶上智、関関同立、March、アメリカ海外大
* 都内の高校生やスタートアップのCTOをしているメンバーも在籍

***運営メンバー専攻や研究分野***
* NLP、CV、統計
* ブロックチェーン、VR、Web 3.0
* 経済・金融、心理学

***運営メンバーの卒業後就職先***
* AWS、Amazon、Microsoft、コニカミノルタ、SONY、EY、Accenture 等
* 起業家


# CDLE youth のこれから

CDLE youthでは、これまで様々なイベントを通して理念の実現を目指してきました。
イベント開催は1回、または複数回で完結する性質上、新しく参加する機会が多く、またまとまった期間で学びが得られるというメリットがありましたが、私たちの理念である<font color="Red">**AIを学ぶ学生の未来を広げる**</font> の5つの柱の1つである **「つながり」** は生まれにくい状態だったと思います。

しかし、嬉しいことにこれまでの活動の過程でコミュニティの拡大や運営体制の確立などの変化があり、これを機により深くAIを学ぶ学生の未来を広げられるような取り組みを実施していきたいと考えています。

具体的には、Slackでのコミュニティを継続しつつも、コミュニティ運営をよりオープンなものにして、“サークルのように“より縦横のつながりが生まれるコミュニティを作っていけたらと考えています。

現在、CDLE youthのメンバーも活動の中心となってコンペ参加や競プロ参加、情報交換などを行っています。
更に、CDLE youthは親組織であるCDLEを通して縦のつながりを深めていこうとしており、就活やキャリア形成について迷ったときなどに、CDLEに所属する社会人の方とマッチングして意見をもらえるようなプラットフォームを拡充させていこうと考えています。



# 最後に

CDLE youth はこれまでクローズドな組織運営をしてきたこともあり、あまり皆さんに認知されていないと思います

それでも「日本を良くしたい」「AI・CS・エンジニア関連の学問を学んでいる学生と一緒に盛り上げたい」「一緒に切磋琢磨したい」という気持ちは他の団体と同じかそれ以上にあります。

ですのでCDLE youth コミュニティに興味のある学生さん、運営に興味のある学生さん、一緒にイベント等を実施していただける社会人の方、他団体様がいらっしゃったらぜひ私たちの方にご連絡いただけると幸いです！私たちもどこかのタイミングでお誘いするかもしれません。

CDLE youthは今後も継続して日本全国の学生と一緒に何か良いものを生み出せられるように頑張っていこうと思います！

ここまで読んでくださりありがとうございました！！


:::note info
→[**Twitter @CDLE_youth**](https://twitter.com/CDLE_youth)
:::

:::note info
→[**HP**](https://sites.google.com/view/cdleyouthhp)
:::
:::note info
→[**申し込みページ**](https://sites.google.com/view/cdleyouthhp/%E3%81%8A%E5%95%8F%E5%90%88%E3%81%9B?authuser=0)
:::
1分で理解する基本情報技術者試験: CPU関連編

## 記事の目的

- エンジニア実務や営業商談で使いそうなIT知識をざっくり理解したい。
- 基本情報技術者試験を受ける予定はないが勉強はしておきたい
  
## CPUとは？

人間には手足があって自由に体を動かすことができます
![figure_happy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/f712ebfb-b4d1-0ab1-39be-c5ee6ed96e47.png)
これは脳みそが体を制御したりできるからです
![body_brain_nou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/76410315-fae4-8eed-2cb5-4c243991a828.png)
コンピューターで脳みそに当たる部分がCPUです。
各装置を制御したり、必要な演算を行ってます
![スクリーンショット 2022-12-26 7.29.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/75e3dd1e-3c9d-9568-4290-590dac9d200a.png)

メモリ等から読み込んだプログラムは**レジスタ**と呼ばれるCPU内部の記録装置に保存されます



## メモリとは？
さっきの画像の赤丸部分になります。
メモリとはコンピューターの動作に必要なデータを記録する装置です。
![スクリーンショット 2022-12-26 7.35.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/f59ae774-c3fb-f5a4-2a63-497253223457.png)

## キャッシュとは？

キャッシュの説明の前にCPUとメモリとハードディスクの処理速度の差に関して知る必要があります。
![スクリーンショット 2022-12-26 7.46.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/981f648c-66c3-9c07-8511-e5a8e2308fab.png)

このことからCPUとメモリ間だけで処理を行うとCPUの待ち時間が発生してしまいます
![スクリーンショット 2022-12-26 7.50.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/52a42ff3-ae4d-cda3-7c54-dc83789c7832.png)

この問題を解決するためにメモリから読み込んだデータはキャッシュメモリに保存し、データをキャッシュメモリから取得できるようにすることで処理速度差のロスを無くすようにしました
![スクリーンショット 2022-12-26 7.58.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/5ac04c89-fc0a-20fb-fa6c-3bc974a259dd.png)


CPUを軸とした処理の流れは下記のような感じになります。

```mermaid
flowchart LR
a[CPU]
b[キャッシュ]
c[メモリ　+ ハードディスクとか]
d[出力装置]
a --> |記憶を保持|b
a --> |命令|c
c --> |結果を返す|a
b --> |記録があれば結果を高速で返す|a
a --> |結果を出力|d

```

## お世話になった本
https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C04%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF-%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297124513
【AWS認定】最短で合格するための勉強法

# はじめに
以下に紹介するサイトを~~丸暗記~~学習することで、最短の学習時間でAWS認定試験に合格することができるでしょう。

※得た知識が業務で役立つ保証はありません。
※筆者は以下何れのサイトとの関連もありません。
※以下サイトを使用したことで如何なる不利益が生じた場合でも筆者は責任を負いかねます。

# 学習サイト
## [Tech Stock](https://techstock.jp/)（旧 AWS WEB問題集で学習しよう(koiwaclub)）

日本でのAWS認定学習における非公式問題集の中ではおそらく一番有名なサイトです。
2022年12月現在、プランは2つです。レベルに応じて購入しましょう。

#### ベーシックプラン（4,480円/月）
- CLF, SAA, DVA, SOAの学習が可能
- SAAであれば、現在1,162問（7問 × 166セクション）あります
おそらくこれだけやれば合格できるでしょうが、これだけだと不合格だったという声も稀にあるため不安な方は他のサイトでも学習しましょう

####  プロフェッショナルプラン（5,480円/月）
- 上記に加え、SAP, SOP, ANS, SCS, DAS, MLS, DBSの学習が可能


### 合格者の声
[【最速】既婚子持ち社会人のクラウド初心者でも、1ヶ月半でAWS資格11冠制覇できる方法](https://qiita.com/mrpepper/items/64039b828c82e12ad35f)
[【SAA-C02 対応】IT 未経験&インフラ知識 0 から 50 時間で合格する AWS 認定ソリューションアーキテクト-アソシエイト-](https://qiita.com/yu40ta_engineer/items/0c23b3b47a1bee80005b#web%E5%95%8F%E9%A1%8C%E9%9B%86)

## [ExamTopics](https://www.examtopics.com/)
知る人ぞ知るAWS試験の問題集サイトです。
「aws exam dump」でGoogle検索すると上位に表示されます。~~使用して問題ないのか疑問~~
全て英語なのが難点ですが、Tech Stockではプロフェッショナル/スペシャリティの問題が少ないためこちらを補うのに良いでしょう。

基本的に無料で使用できますが、$29.99/月を支払うことで表示変更等が可能になります。

### 合格者の声
[AWS Certified Data Analytics - Specialty試験に合格しました](https://qiita.com/amesel@github/items/dc71138afcf3346abfb0)
[【AWS】AWS Certified Machine Learning - Specialty 合格体験記 - 2022年10月01日](https://qiita.com/fufufuryu/items/9712c76f03f4154f1a8b)

## [CloudTech](https://kws-cloud-tech.com/)
最近人気が上昇しているAWSの学習サイトです。
問題/解説だけでなく、動画や会員コミュニティもあります。
SAA問題であれば800問あるので、Tech Stockと併せて学習すればほとんどの方が合格できるでしょう。

尚、問題の一部はExamTopicsと類似しているという噂もあります。
Tech Stockだけでは問題が足りないが英語での学習は辛い、という方にも良いかもしれません。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">CloudTechの問題、ExamTopicsに掲載されてるものと酷似してるけど、偶然かな？<a href="https://twitter.com/hashtag/%E3%82%AF%E3%83%A9%E3%83%86%E3%82%AF?src=hash&amp;ref_src=twsrc%5Etfw">#クラテク</a> <a href="https://twitter.com/hashtag/AWS?src=hash&amp;ref_src=twsrc%5Etfw">#AWS</a> <a href="https://t.co/mwTjaeMX1P">pic.twitter.com/mwTjaeMX1P</a></p>&mdash; すず (@forroso_) <a href="https://twitter.com/forroso_/status/1606516423609962498?ref_src=twsrc%5Etfw">December 24, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#### フリーコース
- SAA 200問 他

#### 単月コース（5,980円/30日） / 3ヶ月コース（11,980円/90日）
- SAA 800問 他

#### 永久ライセンス（49,800円）
- 上記に加え、ECS中級編講義動画

### 合格者の声
[新卒１年目がAWS認定SAAに１ヵ月で一発合格した話](https://qiita.com/Mikoto_Hashimoto/items/3125577b6edd66929041)
[【AWS SAA(C02)合格体験記】3週間で合格に至るまでのあれこれ](https://qiita.com/Sashiiii111/items/d065b809f59cf0f0add1)
CoE スターターキットを利用して、特定の環境の Dataverse の容量が想定を超えたら通知をする

# はじめに

まず、テナント全体で Dataverse の容量が制限に近づいている場合は通知がされます。

https://learn.microsoft.com/ja-jp/power-platform/admin/capacity-storage

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/c8879774-be5b-ea38-3883-e08068a6a13c.png)

しかし、標準機能では、特定の環境が利用する Dataverse の容量が想定していた容量を超えたら通知を出すようなことは出来ません。
今回は、CoE スターターキットを利用して、こちらを実現する方法を紹介します。

こちらの方法を利用することで、環境の所有者に早めに警告をする、容量の削減を依頼する、(組織が大きく費用を分けている場合は) 追加で費用請求をするなど、もう少しきめ細やかなアクションが可能になります。

# 全体の流れ

全体の流れは以下のような感じで、かなりシンプルです。

① "Power Platform Admin View" アプリで環境ごとの想定容量を設定する
② "Admin | Capacity Alerts" フローで通知をする

# "Power Platform Admin View" アプリ

CoE スターターキットのコアコンポーネントに含まれるモデル駆動型アプリです。
テナントに存在するアプリ、フロー、ボットなどの棚卸が可能で、モデル駆動型アプリのため、様々な観点でフィルター、検索をすることや、Excel へのエクスポートなどはもちろん、例えば、以下のようなことも簡単にできます。

* 特定のコネクタを利用しているアプリやフローの一覧表示
* 所有者が退職して (アカウントがなくなって) 孤立化したアプリの一覧表示
* アプリやフローの作成日時や変更日時の確認、(監査ログコンポーネントを利用して) アプリの最終起動日時の確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/6357e7a2-dbcf-50a0-8224-bc789a1833b3.png)

今回は、環境の欄の以下の箇所を利用します。
[Approved Capacity] が想定容量を意味します。言葉の通り、[Actual Consumption] が実際の消費量となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ed98665b-e814-f16b-38f6-b804556105c1.png)

今回は、意図的に小さいサイズにしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/cbe517af-5d22-39bc-673d-87280a651a2a.png)


# "Admin | Capacity Alerts" フロー

こちらのフローです。オンにすれば、[Approved Capacity] の設定を踏まえ通知をしてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/c0713d42-9c11-f557-7cbc-6c75d3c2fcf4.png)

ちょっと中身を覗いてみます。こちらを見ると、[Approved Capacity] のサイズを超えた場合と 80% を超えた場合に通知してくれるみたいですね。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/874f7353-dc40-c0af-bc7f-33ddef7bbbef.png)

メールの文面については、以下から変更可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/34ae313b-a191-b370-7da5-dfcb9efe63e7.png)

ベースとなる部分については (CC なども付けれますね)、"Admin - Command Center" アプリ側から変更しても良いかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/6c8a3b8e-1f5d-996b-3cb6-68981fb98c87.png)

既定では、以下のような通知が行われます。(見れなくはないですが、少し幅が。。。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/c2c80bae-d7db-43fa-9895-94970a768df8.png)

もちろん、こちらのフローを変更して、メール通知だけでなく、特定の Teams チャネルに通知することも可能です。
Map・ハッシュ操作 【Java】【Kotlin】【Ruby】

# 概要
自主学習のアウトプットです。

現場でJavaのMapを操作していた時に、自分の書いたコードがまわりくどいやり方かなと思って調べたらいい方法を見つけたので備忘録です。（実際は周辺のコードと合わなくて使えませんでしたが。。）

学習中のKotlinとRubyで同じことするには？と調べたものも共有します。

# まわりくどいやり方
コードを書いてふと思いました。

「なんやこれ、まわりくど」

思わず声に出てしまったコードがこちら

```Java:Java
Map<String, String> pokemons = new HashMap<Srting, String>();
pokemons.put("Pikachu", "ピカチュウ");
pokemons.put("Lapras", "ラプラス");
pokemons.put("Snorlax", "カビゴン");
pokemons.put("Venusaur", "フシギバナ");
pokemons.put("Charizard", "リザードン");
pokemons.put("Blastoise", "カメックス");

Map<String, String> type = new HashMap<Srting, String>();
pokemons.put("ピカチュウ", "Electric");
pokemons.put("ラプラス", "Water");
pokemons.put("カビゴン", "Nomrmal");
pokemons.put("フシギバナ", "Gtass");
pokemons.put("リザードン", "Fire");
pokemons.put("カメックス", "Water");

List<String> waterPokemons = new ArrayList<>();
for (String englishName : pokemons.keySet()) {
    if(StringUtis.isEqual(type.get(pokemons.get(englishName)), "Water")) {
        waterPokemons.add(englishName);
    }
}
System.out.println(waterPokemons.toString());

```

```:コンソール
[Lapras, Blastoise]
```

要するにpokemonsというMapから水タイプのポケモンを抽出してListに詰めるというコードです。
if文の中でMapから2回valueを取り出してるのが綺麗じゃないな〜と個人的に思っていました。
かといってListに詰めるためにenglishNameは使いたいし。。。

# entrySet()なるもの
調べたら便利なものを発見しました。
上のコードではsetKey()を使って拡張for文でMapのキーを繰り返し順番に使っていましたが
entrySet()を使うと、キーと値を同時に使うことができます。

「なんやこんなんあったんか」

思わず声に出てしまいました。

探せばもっといろんな便利なコードが見つかりそうですね。
まだまだ学習しないと！

entrySet()に修正したものがこちら
```Java:Java

List<String> waterPokemons = new ArrayList<>();
for (Map.Entry<String, String> entry : pokemons.entrySet()) {
    if(StringUtis.isEqual(type.get(entry.getValue(), "Water")) {
        waterPokemons.add(entry.getKey());
    }
}
```
処理自体は同じ結果ですが、Mapのキーだけを使って操作するよりわかりやすくてスッキリしてませんか？？

こっちの方がMapの活用性をフルに使えている気がします！


以下にはMapの構造は上記を前提にしてKotlinとRubyではどう書くの？と調べたものものを載せていきます。

# Kotlin
```kotlin:Kotlin
val waterPokemons = mutableListOf<String>()
pokemons.forEach{ it ->
    if (type[it.value] == "Water") {
        waterPokemons.add(it.key)
    }
}
```
pokemonsというMapを引数にして、itで参照しています。
Kotlinの方が簡単に見えますね。

# Ruby
```Ruby:Ruby
waterPokemons = Array.new
pokemons.each do |key, value|
    if type[key] == "Water"
        waterPokemons.push(value)
    end
end
```
Kotlinで書いたラムダ式と似ています。
こちらも分かりやすくて直感的で書きやすいです。


# まとめ
結果は変わらなくとも、見やすさや書きやすさ、処理の速さなどを考慮すると便利なコードはたくさんありますね。
特にプログラムシステムにおいてMapはより拡張性を持たせてくれるものだと思っているので、Map操作はしっかりと身につけておきたい。。
エンジニアマネジャー必読：公平と平等の違い

長年、マネジメントをやっているとぶつかる壁の一つとして、**公平と平等の違い**を理解する必要があります。

# 公平とは
```
公平は、公に平らなこと、すなわち一定の集団において、偏らないということである。 
人間には、「先に手を出したもの勝ち」とか、偏り、えこひいき、仲間外れなどがつきものである。
公平とは、義務履行の結果として、平らに報じるとの概念である。
```
「先に手を出したもの勝ち」とかがない状態。

# 平等とは
```
平等（びょうどう、英: equality）とは、偏りや差別が無く、みな等しいこと。 仏教用語。物事のあり方が真理の立場から見ればすべて同一であること。
```
物事のあり方が真理の立場から見ればすべて同一であること。の真理の立場からという所がポイント。

# 公平と平等の違い
会社の中でのマネジメントの立場としての僕の理解では、
## 公平とは
若い、シニア、スキルある、スキルなし、ポジティブ、ネガティブに関しては、不問として、全ての人に同一のチャンスを与える事。
## 公平である事が必要があるもの
公平な必要があるものとしては、福利厚生だったり、有給だったり、残業代、資格手当等の手当だったり全ての人に久しく権利を提供する必要があるものは、公平さが必要となります。
一方、プロジェクトへの参加チャンスやリーダーへの登用チャンス等の仕事上でのチャンスは、公平に与える必要がありません。成功する可能性が高いメンバーにチャンスは与えるべきであり、チャンスのために日頃から準備をしているメンバーにチャンスを与えるべきです。
## 平等とは
全員に一律、公平に与えるものではなく、メンバーに合わせて適切な権利やチャンスを適切なタイミングで与える事。
## 平等である事が必要があるもの
シニアエンジニアよりも、若いエンジニアを「幅広い技術が取得できる可能性があるプロジェクト」にアサインする事は平等です。シニアエンジニアは過去に「幅広い技術が取得できる可能性があるプロジェクト」にアサインされた事があるでしょうから、タイミングがずれて平等なチャンスを与えられてます。平等とは、タイミングずれて与えられる事があるし、優先順位が関係する事があります。又、より適任な人に適切なタイミングで適切なチャンスを与える事も平等だと言えます。

# まとめ
公平と平等をしっかり説明できる様になろう
マネジメントをやってると悩みます。
- 平等にチャンスを与える事が出来ているのか？心配になる
- 公平に権利を与えられているか？心配になる
- メンバーから平等にチャンスを与えて欲しいと言われる
**公平と平等の違い**が正しく理解できていれば、マネジメント側としてジャッジにブレがなく適切な権利を与える事ができます。又、メンバーにもしっかりと公平と平等の違いを説明できれば、納得度が向上します。

ひき続き記事を書いていきますので、フォロー、イイねお願いします！
IOTで子供の姿勢改善できないか

子供の姿勢が悪い
勉強よりも健康が心配

# 原因調査

自分の子供だけの話かと思えば、現代社会の抱える問題なのかもしれない・・・

https://style.nikkei.com/article/DGXBZO08280740Y0A520C1WZ8000/

https://plusseikotsuin.com/nekozekyosei/5953.html

# 課題感

先ずは改善においては、数値化と継続的なモニタリングから始める必要がある。

* 自宅が狭い　→　大がかりな運動器具は使いずらい
* 屋外を想定　→　カメラなどスタンドが必要 → 装着しながらセルフモニター出来れば良いが →　まずは設置型
* 常設カメラ　→　監視型のようなものは、子供のプライバシーを考え導入しない

# 具体的な改善案

## トレーニングアプリのようなもの
GoProのような、カメラ付きの体操アプリ
体操した後、姿勢判定チェック

## 姿勢をチェック
ＡＩでモーションキャプチャ
体軸を画像で抽出
姿勢を得点化、採点

## 既存技術との差異

switchのようなアプリでは、そもそも姿勢モニタすることは不可能
XBOXのダンスアプリでは、姿勢モニタリングは出来ていた　→　KINECT
画像センサーとしては、赤外線や３Ｄスキャンニングはありそう　→　LiDAR　
https://www.moguravr.com/lidar-scanner-introduction/

## 所感

画像判定で、どこまでの判定ができるのだろうか
どうすれば、継続的に毎日の生活習慣に馴染ませることができるか
スマートウォッチのように、背骨の角度センサーのようなもので、検出も必要かもしれない

先ずは、モニタリング方法の案だしを並行しつつ、現状の画像判定、ＡＩなどを調査
特許技術情報なども視野に入れる（たまたま自分がメーカーの知財部門なので・・・）


## 12/27
昨日調べたこと、特許出願で面白そうなアイデアを収集

その他のひらめき

* 監視カメラ　→　天井照明に仕掛けられないか？
  天井からのカメラの方が、寝そべり状態を画像で把握しやすい
デイトラ「Web制作コース」　受講内容をアウトプット 11日目


学んだことをアウトプットしています。完全に自己満足ですので悪しからず。
以下の点を確実にアウトプット
①何で学んでるか
②日々の学習内容
③学びのポイント
④制作物
⑤+αで参考にした記事
⑥+αでやってみたこと

①デイトラ「Web制作コース初級編」
②Bootstrapの基本を学ぼう②
③新たに学んだこと
　width/heightの調整
　padding/marginの調整※Bootstrapでよく使う
　Gridレイアウトの使い方※Bootstrapでかなりよく使う
　　必ず"container"ｸﾗｽで囲う。行を変えるときは、"row"ｸﾗｽで囲う。1つのﾌﾞﾛｯｸは"col"ｸﾗｽで囲う。
　　1行は12分割されてているので、‐6を入れると50％の幅になる。
　　最大の幅の設定も可能
　Bootstrapでのﾎﾞﾀﾝの作り方
④なし
⑤なし
⑥なし
WSL2にあるvenvに入ってjupyterファイルをvscode上で動かしたい

vscode上のターミナルでvenvに入っているかどうかではなく、vscode立ち上げ時にvenvに入っていることが必要。

でないとjupyterを動かしてもカーネルが起動しないとかいうエラーになる。
iphoneの画像を機械学習のデータセットにする(Windows)

これはRICORA言語班 Advent Calendarの25日目の記事です。
iphoneとWindowsを使います
スマホの画像を数枚パソコンにダウンロードする方法はたくさんありますが、数千枚となると大変ではないでしょうか
私がやったことがある方法を紹介します。

# icloud写真を直接アクセスできるようにする
1. [Windows 用 iCloud をダウンロード](https://apps.microsoft.com/store/detail/icloud/9PKTQ5699M62?hl=ja-jp&gl=jp)し、初期設定を済ませる。

2. iCloud for Windowsを開き、写真のオプションを選び、iCloud写真にチェックする
![2022-12-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070585/9852fd2c-9f14-7495-eeca-f9e695b5c1e2.png)
![2022-12-24 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070585/fec02b5c-bf96-6863-84b1-40e6fe4899cb.png)

これで自由にicoud写真を操作できます。大量の画像をコピペするのも楽ちんです

![2022-12-24 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070585/76e3135b-9f0d-690b-8c84-4159c5ac133b.png)

# 画像ファイル名について

画像ファイル名は上の画像の通り「IMG_(番号)」になります。ただ、連番になっていない場合があるので注意

![2022-12-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070585/ca6ea26f-eda7-81f6-cd68-7d343f051c50.png)


①. 同じ番号になる
②. 抜けがある

編集したり削除したりするとなるみたいです
利用する場合は注意

# データセットの作成

ここでは簡単に、二値分類問題を想定して、ファイル名と正解か不正解か（1か0）をカンマ区切りで書いたファイルを作成してみます。

```import os

path = "my_data"

files = os.listdir(path)

file = "hello.txt"
fileobj = open(file, "w", encoding = "shift_jis")
for i in files:
    fileobj.write(str(i) + ",0\n")
```

こんな感じで以下のようなテキストファイルができます

```
IMG_0013.JPG,0
IMG_0015.JPG,0
IMG_0016.JPG,0
IMG_0017.JPG,0
IMG_0018.JPG,0
IMG_0019.JPG,0
```
この上にImageIdとかtargetとか書いてcsvファイルにコピペすれば完成です。

```
ImageId,target
IMG_0013.JPG,0
IMG_0015.JPG,0
IMG_0016.JPG,0
IMG_0017.JPG,0
IMG_0018.JPG,0
IMG_0019.JPG,0
```
# 終わりに

自分の集めてた推しキャラの画像をデータセットに使うのにこのやり方をしました。

↓ icloud写真の設定で参考にしたユーザーガイド
[https://support.apple.com/ja-jp/guide/icloud-windows/icw9f0ba665f/1.0/icloud/1.0](https://support.apple.com/ja-jp/guide/icloud-windows/icw9f0ba665f/1.0/icloud/1.0)
洋書勉強用WEBアプリ作成記録①要件定義と設計

## はじめに
この記事は、現在大学生の私がWEBアプリを作るためにやったこととやるべきことを記録し、備忘録、モチベーション向上、外部へのアピール等を目的として投稿していく。

## サービス名と用途
### タイトル「洋書学習用アプリ」

用途はweb上に無料で公開されている洋書を学習しながら読むためのアプリである。

## なぜ作ろうと思ったのか
以前、読んでみたい洋書があったが英語力(特にreading)に自信がないため翻訳版を読む機会があった。しかし作者の後書きにて、「この物語の本当の美しさを感じるためには原書を読む必要がある。ただし一朝一夕で身についたような英語力ではその美しさを理解するのは困難である」と述べられていた。実際、英語力のない状態で英語の長文を読むというのはとても時間がかかる、疲弊する、正確に読解できないといった問題がつきものである。そこで、このアプリは洋書を「読む」ためのものではなく、「読めるようになる」ためのものとして作成していくことにする。

## 既存のアプリとの違い
既存の英語の作品を読むためのアプリは数多く存在する。その中でも有名なものとして「kindle」が挙げられると思う。確かにさまざまなサポート機能が存在しているが、それでもある程度の読解力があることが前提であると感じられ、「読める人」向けのアプリという印象は拭えない。そこで当アプリではより勉強的な機能を実装していくことで差別化を図るものとする。


## どのような利用者にどのような価値を提供するのか
このアプリは英語力に自信がないが英語の文章が読めるようになりたいという人に英文を読めるようになる喜びを提供するために作成する。

## サイトマップ
- トップ
  - ログイン
  - はじめての人向け
    - このアプリの紹介 
    - サンプルブック
  - 本検索
    - 検索欄
    - おすすめ表示
  - ユーザーページ
    - 進捗カレンダー
    - 読んでいる本一覧
      - テキストページ
        - 本文
        - メモ
        - 保存ボタン
    - 辞書
  - 英文法について

## ワイヤーフレーム
#### ユーザーページ
![ユーザーページ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3082018/9068cd3d-c6ad-722c-8287-d1a4c8c61546.png)
#### トップページ
![ホーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3082018/13fd86af-8727-7825-698c-1b69c95827ab.png)
#### テキストページ
![テキスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3082018/f688ccd0-3dec-66bc-4596-dd651dfea159.png)

他のページは割愛する
## URL
![URL設計.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3082018/bba32576-5856-eb3d-9b04-afc5ab7c2184.png)