OmniAICreator/Qiita-1.07M huggingface dataset:
環境模含めた画像内に人の感情を分析

この記事は映像メディアの課題で、そこで論文を再現し、論文の分析を含めてブログを書きます。
選択された論文はTPAMIのContext based emotion recognition using emotic datasetです。
この論文は画像内の人の感情分析に、環境もその分析に手伝えるということが分かりました。
# Abstract
画像内の人の感情を機械で認識するの研究が盛んでいましたが、環境がない方法が人だけ分析が出きるけど、ある方が制限されています。そこで、環境を一種に分析することで、環境が感情分析をよくするメリットがあります。その分析ができるために、EMOTICというデータセットを作りました。VADと感情ラベルを使って、感情を定量と定性的な分析ができるデータセットで、環境がある画像内の人の感情を分析します。
# 画像感情分析
CVPRにもよく感情分析の論文が出てきます。例として、ARTEMISの論文とか、感情の分析方と新しいデータセットの作り方話題になっています。ですが、普通の場合だと画像から感情のend2endで、人の感情だと人の画像が入力で、感情が出力になります。今回の論文では、その古都だけではなくて、環境contextの影響もあるという仮説があって、いろんな実験をやったところ、環境と人の画像の二つ入力でVADの定量的な感情分析法と定性的な感情ラベルの二つの出力で、モデルを構築しました。
# 論文のいいところ
* Context注視で、いい発想でした。
* 珍しいVAD付きのデータを作りました。
* いろいろなモデル、損失関数で実験し、作業量が多いです。
# 実現したところ
ipynbで書いたので、すべてがそこにあります。https://github.com/zszwrsjf/eizou_media

# 参考文献
Kosti R, Alvarez J M, Recasens A, et al. Context based emotion recognition using emotic dataset[J]. IEEE transactions on pattern analysis and machine intelligence, 2019, 42(11): 2755-2766.
Achlioptas P, Ovsjanikov M, Haydarov K, et al. Artemis: Affective language for visual art[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2021: 11569-11579.
React Three FiberでのAnnotation(注釈)

# 概要

筆者が開発しているWebサイト、「3D Aerospace Museum」は最近(4か月くらいかけて)実装をRazor + Three.jsからReact + react-three/fiberに移行したのですが、その際にAnnotation(注釈)機能をある程度変更したので、覚書で記録します。


## (本記事での)Annotationとは

↓の絵の、矢印 +テキストボックスで説明をしている部分のこと 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664470/41380dbd-75a7-d313-494d-8e9820b11264.png)


## 元々の実装

当初は、[こちらの記事](https://manu.ninja/webgl-three-js-annotations)を参考に実装をしていました。

簡単に言うと、Three jsの絵にHTML要素を重ねることでAnnotationを実装するという作りです。

赤い矢印まではThree jsの絵ですが、テキストボックスの部分はthree jsのキャンバス上に乗っていますがcssで重畳を許す設定にしたHTML要素です。

3D空間上の表示したい座標をキャンバス上の2D座標に変換し、更にその位置を現在表示しているWEBページの絶対位置に変換し、その位置にdiv要素を表示しています。

比較的簡単に実装出来て便利ですが、サイト全体のスタイル設定次第でズレが発生するリスクがあることと、react-three/fiber実装する場合のやり方が調べても良く分からなかったことから、せっかくなのでもっと良い実装がないか調査しました。


## 変更後の実装

結論から言うと、[React Three DreiのHTML](https://github.com/pmndrs/drei#html)表示機能を使用することで実装することにしました。
具体的には、[こちらのReact Three/Fiberのサンプルページ](https://docs.pmnd.rs/react-three-fiber/getting-started/examples)に乗っている、「HTML annotations」というサンプルを小改造した内容です。
公式のサンプルは、↑のサンプルページからも飛べますが、[ここから](https://codesandbox.io/s/html-annotations-zu2wo)も飛べます。(CodeSandboxのページ)


サンプルの図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664470/1e2a20a3-8706-e22d-4506-d6b0f8c1c65c.png)



このままだと矢印機能が備わっていないので、Allowhelperで矢印を付けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664470/09771f7d-a172-e18d-704c-52be8caddfef.png)


変更したコードは[こちら](https://codesandbox.io/s/html-annotations-forked-and-add-arrow-kyxsc2)です。
(元サンプルをフォーク+ヘルパー追加、位置・cssなどを微修正)

## システムへの組み込み
移行後はこちらです。
テキストボックスの色も元サイトと同じにすることもできますが、気分転換も兼ねてr3f(react-three/fiberの略称)のサンプルとスタイルを合わせています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664470/ad0a9587-5d4d-f6d8-c27e-55d75274ed58.png)
『Python一年生』を途中まで読んでみた

# 『Python一年生 著:森巧尚』を読んで、実際にPythonを動かしてみた
全部でLesson1~27の内、15までやった

13:if文
14:for文
15:def文

13,14,15が特に難しかった。
スペースの個数が異なると、プログラムを実行する手順がどのように違うのかを理解するのに時間がかかった。
15まで実際にやってみた後、3から999までの素数を表示させるプログラムを作ってみた
AtCoder Beginner Contest 259

## [A - Growth Record](https://atcoder.jp/contests/abc259/tasks/abc259_a)

O(1)
問題文を読み計算式を作成する。

```C++:C++
#include <bits/stdc++.h>

int main() {
    int N, M, X, T, D;
    cin >> N >> M >> X >> T >> D;

    if(X <= M) cout << T << endl;
    else{
        cout << T - (X - M) * D << endl;  
    }

    return 0;
} 
```

## [B - Counterclockwise Rotation](https://atcoder.jp/contests/abc259/tasks/abc259_b)

O(１)
三角関数

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    double a, b, d;
    cin >> a >> b >> d;
    d = d * (pai / 180.0);
    cout << fixed_setprecision(6) << a * cos(d) - b * sin(d) << ' ' << a * sin(d) + b * cos(d) << endl;
    return 0;
} 
```

## [C - XX to XXX](https://atcoder.jp/contests/abc259/tasks/abc259_c)

O(N)
ランレングス圧縮

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

vector<pair<char,int>> func(string s){
    vector<pair<char,int>> res;
    string temp;
    for(int  i=0; i<s.size(); i++){
        if(temp.size()>0){
            if(temp[0] == s[i]){
                temp += s[i];
            }else{
                res.push_back({temp[0], temp.size()});
                temp = "";
                temp = s[i];
            }
        }else{
            temp += s[i];
        }
    }
    res.push_back({temp[0], temp.size()});
    return res;
}

int main() {
    string s, t;
    cin >> s >> t;

    vector<pair<char,int>> S, T;
    S = func(s);
    T = func(t);

    if(S.size() != T.size()){
        cout << "No" << endl;
        return 0;
    }

    int n = S.size(), ng = 0;
    for(int  i=0; i<n; i++){
        if(S[i].first != T[i].first) ng=1;
        if(S[i].first == T[i].first){
            if(S[i].second > T[i].second) ng=1;
            if(S[i].second > 1 && T[i].second == 1) ng=1;
            if(S[i].second == 1 && T[i].second > 1) ng=1;
        }
        if(ng) break;
    }
    if(ng) cout << "No" << endl;
    else cout << "Yes" << endl;

    rep(i, hoge.size()){
        cout << hoge[i] << endl;
    }

    return 0;
} 
```
『チームトポロジー』の感想、まとめ

# 読んだ本

『チームトポロジー　価値あるソフトウェアをすばやく届ける適応型組織設計』

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595926/df43f872-595d-c20e-1a27-e785fb484183.png)

著：マシュー・スケルトン、マニュエル・パイス
訳：原田騎郎、永瀬美穂、吉羽龍太郎

https://pub.jmam.co.jp/book/b593881.html

# 実現したいこと

ソフトウェアシステムの**素早く安定したデリバリー**。

# デリバリーを妨げる要因

コード、ドメイン、コミュニケーションなどの様々な複雑さから**認知負荷**が増加し、それが組織の認知容量を超えてしまうことによりパフォーマンスの低下を招いている。
しかし実際には（特に組織設計で）認知負荷について議論されることはほとんどない。

認知負荷とは、ワーキングメモリ（情報を一時的に保ちながら操作するための能力）に対する負荷。

# チームトポロジーのアプローチ

複雑性をコントロールするために重要になる２つの設計、「**ソフトウェアの設計**」と「**組織の設計**」。
このうち「**組織の設計**」に取り組むことで認知負荷の解決を目指すのがチームトポロジーのアプローチ。

# コンウェイの法則

:::note info
> "システムを設計する組織は、そのコミュニケーション構造をそっくりまねた構造の設計を生み出してしまう"

メルヴィン・コンウェイ　『How Do Committees Invent?』
:::

特に設計やデリバリーの問題を扱うシーンで見かけることが多いが、チームトポロジーでもこの法則を重要視しており、**ソフトウェア設計を組織から独立したものと考えるのは根本的な間違いだ**と結論付けている。

# チームファースト

チームトポロジーでは近年のソフトウェア開発において、ソフトウェアを開発して進化させていくには**個人では継続不可能**として、「**チーム**」に注目している。
チームの認知不可を軽減させ、チームやチーム連携のパフォーマンスを最大化させることを目指している。

# ４つのチームタイプと３つのインタラクションモード

チームの役割やコミュニケーションの**曖昧さを減らす**ため、組織設計のテンプレートをたった４つのチームタイプと３つのインタラクションモードに限定している。

## ４つのチームタイプ

- ストリームアラインドチーム
- プラットフォームチーム
- イネイブリングチーム
- コンプリケイテッド・サブシステムチーム

価値のある単一の仕事のストリームを扱うストリームアラインドチームと、それを支援する３つのチーム。

## ３つのインタラクションモード

- コラボレーション
- X-as-a-Service
- ファシリテーション

４つのチームは、その都度適切なモードでインタラクションする。

# 組織設計を進化させる

ソフトウェアと同じく、組織設計も最初から正しいものができるわけではないし、状況は常に変化する。**組織的センシングに投資する**ことでそのきっかけを捉え、適切に修正していくことで、デリバリーを継続していくことが可能になる。

# 感想

仕事の規模が個人を超えて組織的になり始めた頃から、認知負荷が増大しているのを感じている。組織が拡大するについれて組織構造や労働環境の向上に着手することが多いが、それはあくまで一般的な組織についてのそれであり、ソフトウェア開発を扱う組織としてはそのプラス要素を覆して余りある。

コンウェイの法則については、個人的な経験からも、組織構造からくる意思決定は多いと感じるし、システムの境界付近は一際複雑になっていることが多い。

デリバリー速度増加の需要とそのために組織へのアプローチが必要な点は、GoogleのDORAチームのレポートなどからも見て取れる。

:::note info
> "当社の調査では、サービスやチーム間の細かな依存関係を解消することで、ITパフォーマンスを向上させることができることが分かっています。"

『Accelerate State of DevOps 2021』（DeepL翻訳）
:::

このような複雑さの増加とスピードの要求が高まるなかで、チームトポロジーのようなアプローチを持って、ソフトウェア開発に適合する組織を設計していく必要を感じている。

# （おまけ）最近読んだ書籍からコンウェイの法則に言及しているもの

:::note info
> "さらにコンウェイは、組織図が最初のシステムデザインをまず反映するが、そのデザインはほとんど正しくないに決まっている、とまで言っている。システムデザインが自由に変更できるものだと言うなら、組織も変更に対応できなくてはならない。"

フレデリック・P・ブルックス　『人月の神話』
:::

:::note info
> "システム開発者は、コミュニケーションコストの坂道と同じようにシステムの構造を作っていくという行為が最も効率的な設計であると思ってしまいます。これが、「コンウェイの法則」という経験則が生まれる背景です。"

広木大地　『エンジニアリング組織論への招待～不確実性に向き合う思考と組織のリファクタリング』
:::

「コンウェイの法則」はソフトウェア開発の原理・原則なのだろう。
onAppearメソッドとは

<h1>onAppearメソッドとは</h1>
<p>Viewが最初に描画された時に呼び出されるメソッド
  <br>(要は一番最初に呼び出されるメソッド)
</p>

```swift:
struct ContentView: View {
    @State private var showMenu = true
    
    var body: some View {
            VStack{
                if showMenu {
                    TestView()
                }
            }
            .onAppear {
                showMenu = false
            }
      }
}
```
<p>状態変数showMenu(@Stateって書いてあるやつ)の値がtrueでも、onAppearでshowMenu変数の値をfalseに設定しているので、TestViewが呼び出されることはない。
</p>
next.js 画面をリロードさせる


## 結論
next.jsで画面をリロードさせるのは、以下のコードで出来ます。

```
router.reload()
```

トップページに移動させたい場合は、`router.push("/")`と書きます。

## 全体のコード

全体のコードとしては、以下のような感じです。ログインボタンを押して、ログインが成功した時、ログアウトボタンを押した時に画面をリロードさせるという処理です。なお、amplifyとcognitoを使っています。
5行目の`import Router, { useRouter } from 'next/router'`
と
8行目の`const router = useRouter()`
が必要な行です。

```javascript
import React, { useState } from "react"
import type { NextPage } from 'next'
import Amplify, { Auth } from 'aws-amplify'
import * as cognito from "./api/cognito"
import Router, { useRouter } from 'next/router'

const Sign_in: NextPage = () => {
  const router = useRouter()

  // ログイン時
  const onLogin = async (e:any) => {
    try {
      // ログインを実行する
      const user = await cognito.login(userId, password);
      console.log("ログイン成功 : ")
      router.reload() // リロードしないと、認証の状態が変わらないため
    } catch (e:any) {
      console.log("ログイン失敗")
    }
  };

  // ログアウト時
  const onLogout = async (e:any) => {
    try {
      await Auth.signOut();
    } catch (error) {
      console.log('Error Logging Out', error);
    }
    router.reload() // リロードしないと、認証の状態が変わらないため
  };

  return (
    <div>
　　　　　　　　　　　〜〜省略〜〜
    </div>
  );
}

export default Sign_in;
```

## 動作環境

```bash
$ sw_vers
ProductName:	macOS
ProductVersion:	11.6.5
BuildVersion:	20G527

$ node -v
v16.13.0

$ npm list -g
├── next@12.2.2
├── react@18.2.0
├── typescript@4.7.4
```

めでたし、めでたし。
EntityReferenceとOptionSetValue値設定 

    var service = factory.CreateOrganizationService(context.UserId);
    var target = (Entity)context.InputParameters["Target"];

    var entityTest = new Entity("entityTest");

    // GUID　設定
    entityTest["new_infoid"] = objectid.Id;  //objectid ⇒EntityReference

    //オプションセットバリュー設定
    entityTest["new_status"] = new OptionSetValue((int)100000001);


    // EntityReference　設定
    entityTest["new_regist_bank_account"] = new EntityReference("new_account", target.Id);

    Guid Value = (Guid)mstEntity.Attributes["new_masterid"];
    EntityReference master = new EntityReference("new_master", Value);
    ["new_name"] = master;

    service.Update(entityTest);
Railsでタイトルをページごとに変化させて表示させたい

# titleをページごとに変化させて表示させたい

・イメージとしては『移動先のページタイトル | 固定タイトル』のようにしたい

・アクセスした時ページは『移動先のページタイトル | 固定タイトル』の『移動先のページタイトル｜』はいらないので固定タイトルのみ表示させたい

カスタムヘルパーを作成

app/helper/application.rb下

```ruby
def page_title(page_title = '')
  base_title = '固定ページ名' 

  page_title.empty? ? base_title : page_title + " | " + base_title
end
```

そしてview/layout/application.html.erbの<head>内の<title>内に

```ruby
<%= page_title(yield(:title)) %>
```

と先ほど作成したヘルパーを使用し、webページ全体に適用させる

そして各viewページで

```ruby
<%= content_for(:title, t('.title')) %>
```

と埋め込むことで:titleにviewファイルで設定しているページ名が渡され、page_titleメソッドの引数にわたされるため『移動先のページタイトル | 固定タイトル』と表示できるようになる。

ちなみにviewファイルのt('.title')は事前にconfig/locales/view/ja.ymlに翻訳を登録しておくと良い。ユーザー登録画面のタイトルを翻訳するなら

config/locales/view/ja.yml下

```ruby
users:
    new:
      title: 'ユーザー登録'
```

こうすることでusers/newにアクセスした時にt('.title')がユーザー登録と翻訳される。
初心者向けSQLメモ SELECT(集約関数)

# はじめに

SQL未経験の私が、勉強したことを整理、備忘のための記事を作成しました。
1つの記事だと長くなりすぎるので、分割した1つになります。

なお、この記事内のサンプルはすべて、以下のテーブルに対して実施したものです。
|id|name|category|price|costs|start_date|
|-|-|-|-:|-:|-|
|0001|白菜|食品|400|200|2021/11/01|
|0002|玉ねぎ|食品|300|100|2022/03/01|
|0003|スマホ|電化製品|20000||2021/12/24|
|0004|PC|電化製品|198000|120000|2022/01/01|
|0005|ディスプレイ|電化製品|50000|30000|
|0006|バーベキューコンロ|キャンプ用品|6000|4000|2022/04/01|
|0007|飯ごう|キャンプ用品|1000||2021/10/01|
|0008|テント|キャンプ用品|50000|38000|2022/02/01|

## 集約関数
- 複数行をまとめ、列の合計や平均などを計算します

|集約関数|説明|
|-|-|
|SUM()|合計を返す
|AVG()|平均を返す
|COUNT()|行数を数える
|MIN()|最小値を返す
|MAX()|最大値を返す

## SUM：合計を返す

```console:構文
SELECT SUM(<カラム名>)
FROM <テーブル名>
```

##### サンプル
```SQL
SELECT SUM(price)
FROM Product;
```
|sum|
|-|
|325700|

##### サンプル(nullレコードあり)
- nullは合計に含まれない
```SQL
SELECT SUM(price), SUM(costs)
FROM Product;
```
|sum|sum_1|
|-|-|
|325700|192300|

##### サンプル
```SQL
SELECT SUM(price), SUM(DISTINCT price) AS "sum(重複除外)"
FROM Product;
```
|sum|sum(重複除外)|
|-|-|
|325700|275700|

## AVG：平均を返す

```console:構文
SELECT AVG(<カラム名>)
FROM <テーブル名>
```

##### サンプル
```SQL
SELECT AVG(price)
FROM Product
WHERE category = '電化製品';
```
|avg|
|-|
|89333.33333|

##### サンプル(nullレコードあり)
- nullは分母/分子に含まれない
```SQL
SELECT AVG(price), AVG(costs)
FROM Product;
```
|avg|avg_1|
|-|-|
|40712.5|32050|

## COUNT：行数を数える

```console:構文
SELECT COUNT(<カラム名>)
FROM <テーブル名>
```

##### サンプル
```SQL
SELECT COUNT(*)
FROM Product;
```
|count|
|-|
|8|

##### サンプル(nullレコードあり)
- nullは数えない
```SQL
SELECT COUNT(price), COUNT(costs)
FROM Product;
```
|count|count_1|
|-|-|
|8|6|

##### サンプル(重複除外)
```SQL
SELECT COUNT(category), COUNT(DISTINCT category) AS "count(重複除外)"
FROM Product;
```
|count|count(重複除外)|
|-|-|
|8|3|

## MAX／MIN：最大／最小を返す
- 数値以外に対しても使用できる
```console:構文
SELECT MAX(<カラム名>)
FROM <テーブル名>
```

##### サンプル
```SQL
SELECT MAX(price), MIN(costs)
FROM Product;
```
|max|min|
|-|-|
|198000|100|

##### サンプル(数値以外)
```SQL
SELECT MAX(start_date), MIN(start_date)
FROM Product;
```
|max|min|
|-|-|
|2022/04/01|2021/10/01|
M1 MacでPytorchのc++版、libtorchをインストールして実行する

PyTorchのc++版のlibtorchをM1 Macでインストールする方法についてまとめます。




# インストール
- 必要なもの
gccとcmake
適当にbrewでインストールしてください。

次に、PyTorchのウェブサイトに行って、Macのlibtorchをダウンロードし、どこかに展開しておきます。このディレクトリをlibtorchとします。

なお、このlibtorchの中身を使ってもm1 Macの場合はコンパイルできません。ですので、ソースからビルドすることにします。
方法は[こちら](https://stackoverflow.com/questions/65593177/how-to-build-libtorch-on-mac-arm)にありました。

```bash
git clone -b main --recurse-submodule https://github.com/pytorch/pytorch.git
mkdir pytorch-build
cd pytorch-build 
cmake -DBUILD_SHARED_LIBS:BOOL=ON -DCMAKE_BUILD_TYPE:STRING=Release -DPYTHON_EXECUTABLE:PATH=`which python3` -DCMAKE_INSTALL_PREFIX:PATH=../pytorch-install ../pytorch
cmake --build . --target install 
```
を順番に実行し、エラーが起きないのを祈ります。[以前はmasterでしたが、現在はmainです。]

## 2023/08/30追記
M2 Maxでのインストールを試みました。yamlがないと言われた場合には
```
python3 -m pip install pyyaml
```
をしてください。

## コンパイル後

無事に終了すると、ディレクトリ```pytorch-install```ができています。このディレクトリの中の

```bash
bin
include
lib
share
```
をlibtorchの同じ場所にコピーします。つまり、

```bash
cp -r ./pytorch-install/bin/* ~/libtorch/bin 
```
みたいにしてコピーします。コピー先とコピー元はご自分のディレクトリの場所にしてください。includeもlibもshareも同様にします。これで終わりです。

# テスト
次にテストしましょう。あるディレクトリに

```
example-app.cpp
CMakeLists.txt
```
という二つのファイルを用意します。それぞれ中身は

```c++:example-app.cpp
#include <torch/torch.h>
#include <iostream>

int main() {
  torch::Tensor tensor = torch::rand({2, 3});
  std::cout << tensor << std::endl;
}
```

```cmake:CMakeLists.txt
cmake_minimum_required(VERSION 3.2 FATAL_ERROR)
project(example-app)

list(APPEND CMAKE_PREFIX_PATH ./libtorch)
find_package(Torch REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")

add_executable(example-app example-app.cpp)
target_link_libraries(example-app "${TORCH_LIBRARIES}")
set_property(TARGET example-app PROPERTY CXX_STANDARD 17)
```
とします。```list(APPEND CMAKE_PREFIX_PATH ./libtorch)```の部分は、ご自分のlibtorchのディレクトリを指定してください。
これらを作ったあと、

```bash
mkdir build
cd build
cmake ..
make
```
とすれば、実行ファイルができます。実行結果は

```
./example-app 
 0.6674  0.3057  0.8953
 0.3742  0.9715  0.9115
[ CPUFloatType{2,3} ]
```
となれば、libtorchが動いていることがわかります。
Flutter shared_preferencesで保存し取り出す

`Provider`は親のWidgetから`Provider<T>.value()`でデータを飛ばして、子Widget内で`Provider.of<T>()`を使用しキャッチする`Flutter`の状態を管理するパッケージとは違い、
[Shared preferences plugin](https://pub.dev/packages/shared_preferences)は
`prefs.setXXXXX('key', 保存する値);`で保存したものを`prefs.getXXXXX('key')`で取り出すことができます。
XXXXXにはそれぞれ型があり、
| XXXXXに入る型 | SET(保存) | GET(取得) |
|:-----------|------------:|:------------:|
| int型 | setInt('i', 1) | getInt('i') |
| bool型 | setBool('b', true) | getBool('b') |
| double型 | setDouble('d', 0.5) | getDouble('d') |
| string型 | setString('s', 'abc') | getString('s') |
| list型　| setStringList('l', <string>['abc', 'efg', 'hij']) | getStringList('l') |

を適用。使用例として、
```dart
import 'dart:async';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';

// getInstance()はFuture型を返すのでasync awaitさせる
Future<double> getDoubleState() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  double isDouble = await prefs.getDouble("double") ?? 0.0;
  print(isDouble);
  return isDouble;
}

Future<bool> getBoolState() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  bool isBool = await prefs.getBool("bool") ?? true;
  print(isBool);
  return isBool;
}

Future<double> saveDoubleState(double value) async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setDouble("double", value);
  print('saved $value');
  return value;
}

Future<bool> saveBoolState(bool value) async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setBool("bool", value);
  print('saved $value');
  return prefs.setBool("bool", value);
}

class BoolAndDouble extends HookConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final snapShotdouble = useMemoized(() => getDoubleState());
    var d = useFuture(snapShotDouble);     
    final doubleValue = useState<double>(0.1);

    useEffect(() {
      if (d.hasData) {
        doubleValue.value = d.data!;
      }
      return null;
    }, [d.data]);

    final snapShotBool = useMemoized(() => getBoolState());
    var b = useFuture(snapShotBool);
    final boolValue = useState<bool>(true);

    useEffect(() {
      if (b.hasData) {
        boolValue.value = b.data!;
      }
      return null;
    }, [b.data]);
```
で、`useState`のvalueを渡します。
ストーリー法で複雑な業務プロセスを見える化する

## はじめに
「上司からのレビュー返しが多い...」
「優先順位ちゃんと考えて！」っていつも怒られる...

そんなあなたはストーリー法で業務プロセスの洗い出しをしたほうが良いかも？
ということで、本記事では複雑なプロセスをわかりやすくまとめるストーリー法について解説します。

:::note warn
この記事で紹介されるステップは筆者の自己流のテクニックも含まれます。
「教科書的なストーリー法」ではなく、「現場で使いやすいストーリー法」になっているのでご注意ください。
:::

## 対象者
この記事は下記のような人を対象にしています。

- 駆け出しエンジニア
- プログラミング初学者
- 段取りが上手になりたい人
- 上司からのレビュー返しが多すぎる人


## 結論
書き出して、並べ替えて、もう一回書き足せば、ストーリー法完成！

## ストーリー法とは
ストーリー法とは、体系的な解決を目指すのではなく、実施の場面に沿って問題を解決するためのフレームワークです。
会議室で話し合うよりも、**事件は現場で起きてるんだ**という人にこそおすすめのテクニックです。

ストーリー法は下記の4つのステップで進めます。

:::note
STEP1 タスクを書き出す
STEP2 タスクをグループ化して時系列に並べる
STEP3 グループに名前をつける
STEP4 タスクを付け足す
:::

それではそれぞれを詳しく解説していきましょう！

## STEP1 タスクを書き出す
まずは自分が整理したい仕事のプロセスについて、思い出せるだけ書き出しましょう。
この時に**タスクのレベル・粒度は揃っていなくて良いので、とにかく書き出す**ことが大事です。

後で並べ替えるので、時系列も気にしなくていいです！
また、後で書き足すので、この時点でMECEになってる必要はないです。

今回はプログラマーがクライアントから新機能の実装を依頼された場合の業務プロセスについて考えてみます。

![ストーリー1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/fc0cdbb2-a058-a6e5-5a98-18ec051b4e55.png)


## STEP2 タスクをグループ化して時系列に並べる
書き出したタスクを、時系列に並べ替えましょう。
ある程度、時系列に並んだら、似ているタスクでグループ化しましょう。

機能実装のタスクを並べ替えてみました。
なんとなく、5つのグループに分けられそうです。

![ストーリー2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/1340717c-ff9f-43ec-34bc-ee57dad23d53.png)


## STEP3 グループに名前をつける
分類したグループに名前をつけます。
これで、プロセスのフェーズがはっきりと分類できました。

機能実装のグループに、下記のように並べ替えてみました。

![ストーリー3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/5268822e-9719-b2c5-4914-5cf2f4d7d350.png)


## STEP4 タスクを付け足す
最後に、それぞれのグループの中を見直して、書き忘れているタスクはないか、確認しましょう。
この段階でMECEになっていればOKです！

機能実装のタスクリストを追加しました。
これで完成ですね！

![ストーリー4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/32938e03-4be2-2467-c603-8f34fdb3d99d.png)

## ストーリー法と併用すると効果的なビジネスフレームワーク

https://qiita.com/YutaManaka/items/0fa94826082c7505d1b9

タスクを書く際に5W2Hを意識すると、MECEになりやすいのでおすすめです。

https://qiita.com/YutaManaka/items/6e6df2fd0397898d930a

大人数で進めるプロセスでは「誰が」やるのか、「いつ」やるのか、が大事です。
ストーリー法である程度洗い出しができたら、IPOやSIPOCでまとめると、より見やすくまとめられるでしょう。

## おわりに
業務プロセスをまとめるのに役立つストーリー法についてまとめました。
初心者　MySQL8に挑戦する 6

# 今日はこれ？

https://www.youtube.com/watch?v=F4Q6lEhmwCY&t=182s

　きのう寝る前に見つけたこちら。私がやりたいことにけっこう近い。しかしこのビデオ、黙々とコードを書いていくだけ。英語を聞くのもしんどいが、なければ楽かといったらそんなことはぜんぜんないというのを実感。画面では書く、エラー出たら直す、仮置きしてあったとこを補足する・・・ひたすら、黙々と50分。
　一回目は目がチカチカするだけだったので、できあがりのコードを先に読んだ。ビデオ後半にはUIが出てくるので、少しイメージしやすい。ああ、ここを書き換えると、ここがこう変わるのね、みたいな。

　よし、これを写経するか･･･と思ったのだけれど、改めてビデオを頭から見ていくと、問題が。
　まずいきなり、きのう採用を見送ったphpMyAdminが出てくる。それとセットでXAMPPも出てくる。そうか、php使うのよね。ふうむ。避けてはとおれないのか、やるっきゃないのか？

　でも、きのう導入したmysql1は、要するに phpオミットしてFlutterとMySQLを直に繋ぐためのものではないの？　情報少ないんだけどねえ。ようやく見つけたのがこちら。

## まずこっち！

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

　これもまた無音なんだけれど、さっきと違って短い！　たった６分。こっち先にいこう。
　ところがちょうど真ん中辺で、またなんか出た。phpMyAdmin ? ちがうな、これはMySQLWOrkbenchだ。
　そう、きのう私は、フロントに繋げばphpMyAdmin要らないじゃん、的なことをいったけれども、こういうの（クライアントツールと呼ぶらしい）って、きのう私が最後にやった、ちゃんとできてるかterminalで確認、みたいな部分もできるわけだ。Firebaseのconsoleみたいなもんだわね。ちゃんと入った〜？って、見にいく的な。ということは、やっぱりあったほうが楽だろう。

　ならphpじゃなく公式のWorkbenchをいれるか？とダウンロードサイトに行ってるみと、最初MySQL本体のダウンロードで躓いたARMとx86の、x86しかない。おや、M1Mac用はない？　x86でいける？

　試しに検索掛けると、M1MacにWorkbenchを入れる、というのもあるけど、偶然にもこちらを発見。

https://qiita.com/ms2geki/items/96526d062db64c77a62e

　いくつか追加検索して、なんとなく気に入ったので、今回はこれを導入することに決定。ま、気分です。AppStoreからなので楽ちん。

　さあ、気分よく先に進もう、と思ったら繋がらない。

　げ。今日は時間切れ。また明日。

https://qiita.com/dongri727/items/be64695a70f1481fdd26

https://qiita.com/dongri727/items/f36bf2155bd98e7449d0
上司への質問の仕方について考えてみた

# なぜこの記事を書こうと思ったのか。
私は、実務経験6ヶ月のエンジニアです。サーバーサイドエンジニアとして働いています。
先日、上司から「君が何を言ってるのかわからない」と言われたため、原因と改善策を記録していきます。

そもそも未経験エンジニアを採用している時点である程度の教育コストは想定しているはずです。
しかし、ヘルプの出し方が下手で、上司が私の課題を把握できないと、
**上司：「助けようがない、、」**
となるのは当たり前ですよね。

それでも、上司は私の課題を把握しようと、私に様々な質問を投げかけ、時には隣で会話しながら確認してくれます。
とてもありがたいです。優しい。。本当にありがたいです。

しかし、それは**余計な**教育コストだと、最近気がつきました。

### **余計な**教育コストがかかるとどうなるのか。

・私や上司のタスクの遅延
・私の成長スピードの低下
・上司のリソースを、私の課題で食い潰してしまう。

私の課題を、上司に正確に伝えることができれば、上司は私につきっきりになることはなかったでしょう。
最小限のリソースで私の課題を解決に導くヒントを出すことができたかもしれません。

**余計な**コストは排除するに限ります。

## 原因
「何を言っているのかが分からない」と言われた原因を分解して見ました。

・主語・述語が曖昧(これ,それ, etc)
・上司に何を聞けばいいのか分からない。
・私のゴールへの認識が、上司やクライアントと差がある
・自分の行動を記録していない
・調査方法がヘタクソ
・課題に対する認識が甘い

質問もできず、課題が解決できていないどころか、課題を認識できていない状態が続くと
**「一体1日何してたんや」**
せめて、「考えていることだけでも共有してほしい。」　と僕が上司ならそう考えます。

## 改善策

・分解した原因に合わせてフォーマットを作る。
・上司に伝えるべきことを明確にする。
　　　　・何がしたいのか
　　　　・何で困っている。
　　　　・何をしたのか。
　　　　・した上で何で困っているのか。
　　
## フォーマット

上司の知りたいこと && 私が伝えるべきことを記載します。

```
1.何がしたいのか

2.何で困っているのか。

３.2に対して、何を実施のか。（根拠も添えましょう）

4.実施した上で、どんなエラー・不具合が出ている？

5.結果から得られたこと。考察
```

これを埋めるために調査すれば自ずと解決策に向かうはず。
そのために必要なことは下記になります。
* 行動を記録していく
* 結果を記録していく
* 思考を記録していく

チームのslackに作業用のメモとして残していくのもいいと思います。
今、どんなことを考えて作業しているのかをslackのスレッドにまとめていきます。

そうすると、質問する前にチームの人達が助けてくれることもよくあります。

### まとめ
どんな仕事でも初めての時は、上司の力は絶対に必要です。
しかし、自力で解決に向かおうとする姿勢も大切です。
いつまでも上司や同僚に頼りきりだと、自分の成長もないです。


自分の実施したことをまとめていくうちに、原因がわかってきたり、解決策を思いつくこともあります。

適切な質問を投げかけることができれば、業務に対しての上司との認識も合わせることができるので、間違った方向に進むことも減っていきます。

このフォーマットは簡易的なものですが、自分の中で一つ基準ができました。
何か課題に当たった時は、このフォーマットに沿って課題を書き出して問題を整理しています。



## 追記
最近、このフォーマット使っているおかげもあってか自力で解決できることが増えた気がします。
より難しい業務も任されるようになりました。嬉しい。

記事を書いたりするのも、思考の整理になっていいですね。
みなさん、ブログを書きましょう。
Constructor

# Constructor
classは基本生成者を持っているが接近指定者が*privateなのでseに目立たない
* 基本生成者　
(1) seが生成者を定義しないと、基本生成者を自動的に生成する
(2) 媒介変数と何のコマンドも含まない
(3)seが生成者を作ったら基本生成はない


* private : classの中だけオブジェクト化
* オブジェクト化(instance)
  (1)オブジェクト化とはクラス(設計図)を参照してオブジェクト(商品)を作ることを意味する。
     一つの設計図を利用して様々な商品を作ることができる。
* Constructorは Overloadingができる
---
# Constructor使い方
class 中で生成者を呼び出すためにはオブジェクト化をした後に呼び出すことができる。
 ``` 
className ObjectName = new className();
 ```
* new : メモリの空間を確保し、その空間のアドレスをオブジェクトに渡す役割をする
* クラスは参照型データで、オブジェクトのアドレスを保存する
 ```
接近指定者 className(媒介変数){
}

ex) public Student(媒介変数){
}
 ```
* classの中で生成者同士で生成者を呼び出すときはthis();を使う
* this.変数
 ```
ex) class Student {
      String name;
      int age;

      Student() {
          this("parkbeb", 10);
      }

      Student(String name, int age) {
          this.name = name;
          this.age = age;        
      }
 ```
* 子クラスの生成者から親クラスの生成者を呼び出すときはsuper();を使う
C# プロパティ（setter/getter）の書き方と使い方

## 0.0 はじめに
C#でのプロパティの書き方と使い方を記載します。




以下はプロパティに関する基礎知識です。


* C#のクラスは「フィールド」と「メソッド」で構成されてます。
* フィールドは変数の定義する場所であり、データの格納する場所です。「メンバ変数」とも呼ばれます。
* カプセル化などクラス外部から直接アクセスを防ぐには、メンバ変数にprivateアクセス修飾子を付けます。このメンバ変数の値を変更したり取り出すときは、外部からのアクセス用にpublicアクセス修飾子を付けたメソッド、setter（セッター）やgetter（ゲッター）を作成し、それを通して行うのが他の言語では一般的です。
* setter（セッター）やgetter（ゲッター）をアクセッサと呼んでいます。
* C#ではプロパティと言う便利なものがあり、このプロパティはクラス外部からはメンバ変数のように使え、クラス内部から見るとメソッドのように使うことができます。








## 1.0 プロパティの書き方
#### 1.1 ゲッター（getter）とセッター（setter）と呼ばれるアクセッサを使う場合
privateな変数を定義して、その変数に他のクラスからもアクセスするためのプロパティをつくります。
プロパティではgetterを通して値を返し、setterではvalue変数を介して値を受け取ります。
ちなみにプロパティでgetterを省くと値の取得不可、setterを省くと代入不可となります。
プロパティの変数名は、定義されているprivateな変数と区別するために同じ名前で大文字始まりにするのが一般的です。






```C# Test.cs
private string myName; // メンバ変数

// プロパティ
public string MyName { 
    get { return myName; } // getterの部分
    set { myName = value; } // setterの部分
}
```






#### 1.2 条件付きプロパティ（条件付きで代入・取得する）
プロパティ内のgetter、setterにて条件を付けられます。
```C# Test.cs
private int height; // メンバ変数
public int Height {
    get { return height; } // getterの部分
    set { if(value > 100) // setterの部分、100を超えたときのみ代入する
          height = value; } 
}
```









## 2.0 取得方法
クラスの外からは human.Height や human.Height = 150 というかんじでメンバ変数のように使えます。

```C# Human.cs
// HumanからTestクラスの変数heightにアクセスする
public class Human :MonoBehaviour
{
   void Start()
   {
    Human human = new Human();
    human.Height = 150; // Heightで設定
    Debug.Log(human.Height); // Heightで取得
    }

}
```






## 3.0 自動実装プロパティ（自動プロパティ宣言）
以下のように短縮して記述することもできます。ただし、カプセル化などクラス外部から直接アクセスを防ぐ目的でプロパティを使っているので自動実装プロパティをそのまま使うのは少し疑問です。


```C# Test.cs
// プロパティ
public int Age { get; set; }
```



```C# Test.cs
// プロパティ
public int Age { get; set; } = 16;
```


ちなみに調べると自動実装プロパティC# 3.0以降、初期値設定はC# 6.0から使えるようになったようです。（C# 6.0でもVisual Studio 2015と同じ時期ですから気にする必要ないと思います。）







## 4.0 入力ショートカット
ショートカットというか予測変換です。コードスニペットと言われるようです。

##### 4.1 自動実装プロパティ

propと入力してTabキーを2回押すと下記のコードが自動生成されます。

```C# Test.cs
public int MyProperty { get; set; }
```


##### 4.1 アクセッサ含みのプロパティ

propf(propfullの略)と入力してTabキーを2回押すと下記のコードが自動生成されます。

```C# Test.cs
private int myVar;

public int MyProperty {
    get { return myVar; }
    set { myVar = value; }
}
```

## 5.0 クイックアクションの使用
フィールド変数を定義してその上で右クリック、**クイックアクションと....**を選ぶとフィールドのカプセル化が選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/50ce46f9-b7fd-009c-fd43-46911ef848aa.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/6dca88ac-8e4d-60ce-6e26-d611460b10b4.png)
[GCP] もう怖くない。リソースの階層とアクセス制御について

## 背景
- GCPの「プロジェクト」「組織」などなど、リソースの階層が理解できてなかった。
- それに伴うアクセス制御のやり方が理解できてなかった。
- （課金も管理できるらしいのでついでに調べてみる）

## リソースの階層
1. 組織（組織ノード)
1. フォルダー
1. プロジェクト

図で表すとこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314481/060bfb53-c0d9-dc5f-4866-e61d30bad0b9.png)

### 1. 組織（組織ノード）
- フォルダーをまとめる
- G Suiteを利用していればそのドメインで自動的に組織ノードを作成する
- G Suiteを利用していない場合、Google Cloud Identityを利用して組織ノードを作成する
- IAMポリシーを継承する

### 2. フォルダー
- 組織ノードに紐づく
- プロジェクトをまとめることができる。
- フォルダー内にフォルダーを作成できる
- IAMポリシーを継承する

### 3. プロジェクトとは
- フォルダーに属するもの
- GCPリソースを作成・使用するにはプロジェクトが必要
- プロジェクト単位で、課金・API・IAMポリシーを作成できる
- IAMポリシーを継承する
- プロジェクトには以下のメカニズムで識別される
  - プロジェクトID(一意・変更不可）
  - プロジェクト番号(一意・変更不可）
  - プロジェクト名（一意・変更可） 
- 誤って削除した場合の復旧も可能

IAMポリシーの継承イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314481/129dce2d-5e9f-90c6-57d0-9a2810b017a6.png)

## 課金
- 課金はプロジェクトレベルに蓄積される。
- プロジェクトを定義すると、それに課金アカウントがリンクされる。その課金アカウントで支払いオプションを含む全ての課金情報が設定される。=> 課金アカウントは複数のプロジェクトにリンクさせられる。
### Googleの請求額を高くしないようにするために
1. 予算の上限額を決めてwebhook等でアラートを受け取る設定にする
1. 使わないサービスは切っておく
1. クラスタの管理設定自体への呼び出しを制限しておく


## 参考
- https://qiita.com/meta_plankton/items/6d723a9b7032703523a5
- https://qiita.com/SMAC/items/01614b62eaf33f33bd78
- Getting Started with Google Kubernetes Engine
Google Cloud
Android SDKディレクトリにcmdline-toolsが無い時（Mac環境）

設定を開いて`Appearance & Behavior` > `System Settings` > `Android SDK`の順でAndroid SDKの設定画面を開く。

画面中部に`SDK Platforms`・`SDK Tools`・`SDK Update Sites`の3つのタブがあるので、`SDK Tools`タブを開く。（下の画像を参照）

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f33393735362f39626334336339372d373035302d376361312d363737622d3565613130626335613035312e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39756/0e0fab07-2291-ae5f-1945-084b52fae841.png)

OKを押すとCommand-line Toolsがインストールされ、完了後にAndroid SDKのパスに`cmdline-tools`ディレクトリが作成されている。
Discord.js V14の変更点(私的メモ)

# 初めに
Discord.jsがV14になったので自分のBOTのV13移行ついでにメモとして記事を書きました。
Bot: https://github.com/Zel9278/ced-bot-rewrite
今後この記事を更新するかもしれないです。

# GatewayIntentBits
IntentというClientに権限を設定するものを使うために使用するものです。
https://discord.js.org/#/docs/discord.js/main/class/IntentsBitField

```javascript
const { Client, GatewayIntentBits } = require("discord.js")
const client = new Client({
  intents: Object.values(GatewayIntentBits).filter(Number.isInteger) // ALL Intents
});
...
```

# 追加されたもの
https://discord-api-types.dev/api/discord-api-types-v10/

https://discord-api-types.dev/api/discord-api-types-v10/enum/ApplicationCommandOptionType


# 終わりに
V14になってから、コマンドの引数にAttachmentなどが導入できるようになったので結構うれしいです、
でもちょっと分かりにくくなってたりしてたのが不満点だったりします。
【自分用】入れておきたいVSCODE拡張機能


## 全般
### 日本語化
[Japanese Language Pack for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja)
英語のままでもそれなりには使えるけど、作業効率はやっぱ母国語が一番なので。。。

### スペルチェック
[Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)
stratとかの誤字。たまにコードにいるよね。
そんな負の遺産を少なくするために入れたほうが良いのかも。

### 全角スペースを目立たせる
[zenkaku](https://marketplace.visualstudio.com/items?itemName=mosapride.zenkaku)
何故か想定と違う動きするって時にたまにいる悪党「全角スペース」を目立たせる。
場合によってはすごい時間節約できる。

## マークダウン関連
### マークダウン書くならとりあえず入れるべし
[Markdown All in One](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one)
マークダウン関連の便利な動作が多数追加される。
これ無しの時のマークダウン編集が嫌になるレベルに便利。

### プレビューのチェックボックスでチェックの切り替えをできるようにする
[Markdown Checkboxes](https://marketplace.visualstudio.com/items?itemName=bierner.markdown-checkbox)
なくてもいいけど、あると作業が捗る系。
なんで標準のプレビューにこの機能ないんだろうか。。。。

### マークダウンをマインドマップ表示にする
[Markmap](https://marketplace.visualstudio.com/items?itemName=gera2ld.markmap-vscode)
マインドマップをよく使う自分にとっては痒い所に手が届く拡張。
アイディア出しとかで使いやすい。

### Mermaid記法のプレビューを行う
[Markdown Preview Mermaid Support](https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid)
フロー図などを書いたりできるMermaid記法のプレビュー表示を行う拡張。
Mermaid記法は勉強中なので自分はあまり使いこなせていないけど、ロジック組み立てる時に重宝している

## HTML関連
### タグ自動クローズ
[Auto Close Tag](https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-close-tag)
タグ書いた時に自動でクローズタグを追加してくれる。

### タグリネーム時に開始とクローズ連動して書き換え
[Auto Rename Tag](https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag)
開始タグもしくは終了タグを書き換える時、対応するタグ開始終了タグも同時に書き換えてくれる。
2箇所書き換える手間が省ける

## CSV
### CSVを見やすく表示
[Rainbow CSV](https://marketplace.visualstudio.com/items?itemName=mechatroner.rainbow-csv)
カンマ区切りで色分けはもちろん。
マウスオーバーで対応するヘッダーの値表示してくれたりSQLを使ってデータの絞り込みも行える。

## 番外編。
### spotify操作
[vscode-spotify](https://marketplace.visualstudio.com/items?itemName=shyykoserhiy.vscode-spotify)
コーディングしてる時によくspotify流しているんだけど、曲変えるときにわざわざアプリ切り替えるのめんどくさいから入れている。
異論は認める。

### RSSリーダー
[RSS](https://marketplace.visualstudio.com/items?itemName=luyuhuang.rss)
最新情報収集は欠かせないよね。
VSCODE上で記事読めるので便利。VSCODE上で読む意味は多分ない。
Ubuntuでpyenvがmake: *** [Makefile:1280: install] Error 1でインストールできない問題

## エラー

```
subprocess.CalledProcessError: Command '['/tmp/python-build.20220718055011.16571/Python-3.10.4/python', '-W', 'ignore::DeprecationWarning', '-c', '\nimport runpy\nimport sys\nsys.path = [\'/tmp/tmpbf3uxb3u/setuptools-58.1.0-py3-none-any.whl\', \'/tmp/tmpbf3uxb3u/pip-22.0.4-py3-none-any.whl\'] + sys.path\nsys.argv[1:] = [\'install\', \'--no-cache-dir\', \'--no-index\', \'--find-links\', \'/tmp/tmpbf3uxb3u\', \'--root\', \'/\', \'--upgrade\', \'setuptools\', \'pip\']\nrunpy.run_module("pip", run_name="__main__", alter_sys=True)\n']' returned non-zero exit status 1.
make: *** [Makefile:1280: install] Error 1
```

こんなエラーが出てインストールに失敗してしまいます。

どうやら依存関係がまだ足りないみたいです。

現状
```
sudo apt install update
sudo apt install upgrade
sudo apt install build-essential
```
は実行した状態です。

プラスで
```
sudo apt install libssl-dev libffi-dev libncurses5-dev zlib1g zlib1g-dev libreadline-dev libbz2-dev libsqlite3-dev make gcc
```

これらもインストールしなくてはいけなかった。
これらはpyenvの[依存関係](https://stackoverflow.com/questions/1157192/what-do-the-dev-packages-in-the-linux-package-repositories-actually-contain)です。
既に入っているのもあると思いますがとりあえずインストールしておきましょう。

[こちら](https://stackoverflow.com/questions/70848502/make-makefile1280-install-error-1)の記事を参考に解決したのですが、意外と辿り着けなかったので記事にしました。

お役に立てれば幸いです。
chatter いいねのついた投稿を抽出する


+ [chatter いいねのついた投稿を抽出する2:Apexバッチを組んでみる](https://qiita.com/Keiji_otsubo/items/e89686cbfa09e34eff21)


元の質問
[Can you build a flow based on an unacknowledged Chatter?](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HEKkHSAX)

いいねのついてない投稿が知りたいとのことですが、まずいいねが付いた場合はどうなるかです。

データモデルの確認です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8be52bf9-bcde-a4f2-fac0-3815d2a5f359.png)

投稿の本体はまいどながらイメージがわかない　Feed Itemsです。何でChatter とかいう分かりやすい名前でないんだろうなぁ。

いいねは何だ。オブジェクト名から推測すると FeedLikeかな？

https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_feedlike.htm

ユーザがフィード項目にいいね! と言ったことを示します。このオブジェクトは、API バージョン 21.0 以降で使用できます。
FeedLike レコードは、投稿に対するいいね! は表示しますが、コメントに対するいいね! は表示しません。コメントへのいいね! は、API を介して照会できません。FeedLike は FeedItem、FeedTrackedChange、または AccountFeed などのオブジェクトフィードに関連付けられている子オブジェクトです。

正解ですね、さっそくSOQLで確認してみましょう。

これはエラーです。FeedLikeの子リレーション名が分からん。仕方ないので複数形にしてみます。
```
select Id,Body,createddate, (select Id from FeedLike) from FeedItem
```

正解です。なんとなくそう思っただけですが、一発で解決です。
```
select Id,Body,createddate, (select Id from FeedLikes) from FeedItem
```

思ったとおりいいねが付いた場合が識別できそうですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/714716a2-907b-236c-671b-d953e52a3480.png)

どうやったらフローでできるかは分かりません。Apexバッチでならできそうです。
Flutterからtwitterにシェアする

表題の通り、めっちゃハマったので、記録しておく。

### 要件
flutterからTwitterにシェアするとき、アプリをインストールしていればアプリへ、そうでなければwebへ。
シェアする内容はtext, url, hashtags

### 事前準備
1. iOSの設定: info.plistにschemeを登録

```xml
<key>LSApplicationQueriesSchemes</key>
	<array>
     ...
     <string>twitter</string>
    </array>
```

2. Androidの設定：sdk30以降必要。`AndroidManifest.xml`に以下を追加（他のschemeへ飛べるための設定）
```xml
    <intent>
        <action android:name="android.intent.action.SEND" />
        <data android:mimeType="*/*" />
    </intent>
```

### シェアする時
`twitter://post`する時、`url`と`hashtags`は認識されないので、`text`にそのまま追加

```dart
    final tweetQuery = <String, dynamic>{
      'text': 'myText',
      'url': 'https://...',
      'hashtags': ['tag1', 'tag2'],
    };

    final text = 'myText'
        ' #tag1 #tag2'
        ' ${https://...}';
    final tweetScheme = Uri(
      scheme: 'twitter',
      host: 'post',
      queryParameters: <String, String>{'text': text},
    );
    final tweetIntentUrl =
        Uri.https('twitter.com', '/intent/tweet', tweetQuery);
    await canLaunchUrl(tweetScheme)
        ? await launchUrl(tweetScheme)
        : await launchUrl(tweetIntentUrl);
```
【UiPath】On-Prem Orchestratorの運用設計を考えてみる（監視編）

# はじめに
この記事はUiPathブログ発信チャレンジ2022サマーの18日目の記事です。

https://note.com/shumpei_w/n/n19383ce5abb1

昨日は[@shumpeiwatanabe](https://twitter.com/shumpeiwatanabe)さんの記事、明日は[@kambekinu](https://twitter.com/kambekinu)さんの記事です。

---
今回はOn-Prem Orchestratorの運用設計の内、監視について説明します。

# その他の記事
**バックアップ編**

https://qiita.com/shuy/items/8517272a1d4fad3e4a79

**メンテナンス編**

https://qiita.com/shuy/items/b85fca01daa6d76931a4

# 前提
* On-Prem Orchestrator 2021.4

構成は冗長化（Active-Standby）したもの仮定します。
※シングル構成で仮定してもOKです。HA構成（Active-Active）だと構成要素が変わるため（Redisのクラスター構成が追加）、本記事より運用も複雑になります。
![構成1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/1d69a062-198f-44e3-4903-004ebe6a4ae5.png)

# 1. 死活監視
死活監視とは、サーバ自身の稼働状況をチェックすることです。各サーバのpingをチェックしてもよいのですが、以下、ヘルスチェック用のURLのレスポンスをチェックすることもできます。

**リクエスト**：　GET /api/Status
**レスポンス**：　成功 (200)

# 2. リソース監視
サーバリソースの使用状況を監視します。UiPath固有の検討事項ではありませんので、一般的な設定で問題ありません。
以下は参考値です。

**CPU使用率**
5分間隔の平均が連続2回80％を超える

**メモリ使用率**
5分間隔の平均が連続3回90％を超える

**ディスク使用率**
5分間隔の最小が90％を超える

# 3. ミドルウェア監視
IISやSQL Serverのサービスの死活やパフォーマンスの監視します。これもUiPath固有の検討事項ではありませんので、一般的な設定で問題ありません。

# 4. ログ監視
主に以下のメッセージがイベントログに書き込まれていないかをチェックします。

|ログメッセージ|状況|
|-|-|
|License expired! Starting jobs is no longer possible!|ライセンスの有効期限が切れている場合|
|The transaction log for database 'UiPath' is full|DBのトランザクションログが一杯になった場合|
|System.CompenentModel.Win32Exception: 待ち操作がタイムアウトになりました。|SQLのタイムアウトが発生した場合|
|System.InvalidOperationException: タイムアウトに達しました。プールから接続を取得する前にタイムアウト期間が過ぎました。|コネクションプールが枯渇した場合（ロボット接続台数が過剰に増えた状態）|

# 5. その他の監視
以下は任意です。

**Unattendedの接続状態の監視**
Unattendedが知らない間に切断などされていると、ジョブの実行に影響が出るので、接続状態を監視します。方法は以下の過去記事で紹介しています。

https://qiita.com/shuy/items/9bce3ce08b92e320366b

**Unattendedジョブ起動失敗**
認証エラーなどでジョブが起動できない場合、Orchestrator画面上でしか状況の確認できないので、運用管理チームへエラーを通知します。
方法は色々ありますが、過去記事ではWebhookとAWS（API Gateway、lambda）を使って通知する方法を紹介しています。

https://qiita.com/shuy/items/febcfd1677d17eda17fc

# おわりに
次回は最後、「メンテナンス」についてです。

# 参考
v2019.10を対象としたドキュメントとなりますが、v2022.4でも十分参考になります。

https://www.uipath.com/ja/resources/knowledge-base/uipath-orchestrator-design-operation-guide

https://www.uipath.com/ja/resources/knowledge-base/middleware-config-maintenance-guide
Intellij IDEA_構造ビューのアイコン一覧 (構造及び可視性)

使用しているバージョンは以下です。(そんな差異はないと思いますが他のバージョンがどうかは知りません、、。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/6f9ef81b-544d-a082-bbe3-b182787768be.png)

これまでEclipseをずっと使っていたのですがIntellij IDEAの軽さ、自動補完の優秀さなど総合的に見て
Intellij IDEA推しになってきました。世の中的に今更なのは承知の上ですww

ただ一つEclipseのアウトラインの表示に慣れすぎていたせいでIntellij IDEAでの表示の意味が分かりづらかったので
思いつくものを備忘としてまとめました。まとめてみて思ったのはIntellij IDEAも全然分かりやすい。

### 構造

- クラス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/958d2d6e-e4c4-5863-e4b9-a760f420351b.png)

- 抽象クラス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/eb60c7b2-3426-2449-6543-e85f481b2f68.png)

- インターフェース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/f23952f7-19b3-6c6e-abec-ac0519179886.png)

- フィールド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/c3252e20-0b25-3ebe-b9db-fb100237ef48.png)

- 抽象メソッド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/131bb15d-cd17-eea2-d0b9-f3aa75272fef.png)

- 具象メソッド(正確にはメンバーなのでコンストラクタ含む)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/400508a7-b2a9-785c-5950-a8cb2eb4e81e.png)

- static XXX (共通のためstaticな具象メソッドの場合を抜粋) ※要するに左下に何か四角アイコンが追加される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/7405a980-764e-ebbf-a75b-ef246f1a3802.png)


- おまけ

  staticでabstractな構文エラーとなるメソッドを定義すると、ちゃんとコンパイルエラーになるがアイコン表示は以下となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/3813bdd1-dd2d-37ab-e364-e7605695c1f8.png)

- setterのみ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/de2b8e56-a600-8ff2-31e8-5f642552dc17.png)

- getterのみ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/a426693e-d8f5-13cd-2c31-3de6ce5df156.png)

- setter & getter
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/b24db552-2ac1-5386-a189-7874c056053f.png)

### 可視性

- public
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/89480330-9465-1261-d825-e59f9352395e.png)

- protected
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/cfe49746-fe1e-4848-8e0c-d1582b4d0b54.png)

- package private
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/4bdf1d9a-f62b-0b3c-518a-48a01c385f6e.png)

- private
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/b8b19690-9cb5-858a-db9b-98948e1f2209.png)
<hr>

- 構造ビュー(アウトライン)の表示の方法は以下

表示 > ツールウィンドウ > 構造
Claris Connect を使ってみようと思ったけど秒殺で無理でした。(Salesforceとfreeeの連携）


参加にあたっての事前準備　

[Salesforce Integration using Webhooks 【事前準備編】](https://qiita.com/Keiji_otsubo/items/80147f9d5d0bf55c5bc9)

# Claris Connect評価版の入手

まずは、Claris Connect評価版をインストールします。

無料評価版のURLをクリックすると...
こんな画面になったけど、さて次は何をしたらいいかな？

とりあえず、カートに追加をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/562dea8e-7ad9-f1af-dcf4-7eef5a54438d.png)

ご注文かなぁ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2a6f2635-6827-50ac-a033-22e9ef4d4907.png)

おおお、次はClaris IDを作成だろう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6af28ab6-f0af-f183-a9fd-a0ef0d4d2a47.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/06cd687a-f51e-b37b-8393-963c57745204.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/926c6f6c-ad30-346b-8a2e-b42862b5977e.png)

ログインしたらさっきまでの情報はどっかに消えたなぁ。ハードル高い。

違う入口から再スタートだな。Salesforceより難しい、またfreeeよりもはるかに難しそうだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a09ada57-9665-ac1e-2e1b-e17175afef90.png)

どういうことだろう？　さっぱり分からん。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f120317a-eb30-abca-620b-ed745fd2db79.png)

Idは登録出来たけど、次は何をやるんだろう。最近は英語モードでSalesforceで遊んでいますが、日本語のサイトの方が分からない。う～ん、日本語は理解できているつもりなんですがね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8fe72eaf-fdf4-15e9-5594-484f0d47c756.png)

これかな？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/da14b1c6-5a12-9f10-375d-c0299622c6d4.png)

コンソールには何にもないけど...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/03feacf6-f0b1-d85b-b634-2a6d606e841c.png)

わーおお、今まで触ったクラウドでは一番難しいかもしれない。

Salesforceでは英語版の質問者コーナーで回答をさせていただいていますが、初心者さんたちの気持ちが分かったような気がします。
残念ですが先に進めそうにないですね。

まぁ、仕事で使うわけでないので諦めも肝心です。　だんだんイライラしてきそうなので諦めてSalesforceの世界に戻ります。日本は休日ですが世界は平日みたいなのでボチボチ質問が増えてくる時間です。

最近、クラウドシステムを簡単に使ってもらうには気軽に質問できて解決に導いてくれるコミュニティーの存在が不可欠だと思っています。まぁ、私が英語が分かってないのでいいとは思えないことも多いですがね。

他のシステムは全く知らないので、ちょっと使ってみたかったです。残念。


次にログインすることはないと思うけど　ログインサイトが探せないかったら困るので記録。
https://my.claris.com/login

今は仕事で使うのでないので、どうしても更に調べて先に進むという気力がわかないです。
ごめんなさい。

案外分からんかったら使わなくて結構という姿勢はいいかもしれません。既存のユーザよりも新規のユーザに対して手厚いサービスがあるのとどちらがいいかだけでしょう。しかし毎年6月くらいからは前にも見たよというような初心者レベル（ああ、今の私）の質問が多くて既存のユーザから見たら最新の情報が得られなくて少々欲求不満が溜まってきます。そういう意味では自力でたどり着けない初心者はお帰りいただくのは既存のユーザさんのためにはいいかなと思う次第です。
aws cli で DynamoDB を更新

こちらで作成したテーブルを更新します。
[aws cli で DynamoDB を使う](https://qiita.com/ekzemplaro/items/93c0aef433a2b633ab4a)
次のページを参考にしました。
[更新式](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html)

```bash:go_update.sh
aws dynamodb update-item --table-name uchida-test-cities \
       --key '{"key": {"S": "t0923"}}' \
	--update-expression "SET population = :pp, date_mod = :dd" \
    --expression-attribute-values file://values.json \
    --return-values ALL_NEW
```

```json:values.json
{
    ":pp": { "N": "19991" },
    ":dd": { "S": "2022-7-17" }
}
```

次のバージョンで確認しました。

```text
$ aws --version
aws-cli/2.7.16 Python/3.9.11 Linux/5.15.0-1015-aws exe/x86_64.ubuntu.22 prompt/off
```
Ionic6でAPP開発の参考URLメモ

IonicでApp構築に活用した参考URLメモ

ionic環境
``` json
{
"@angular/common": "~13.2.2",
"@angular/core": "~13.2.2",
"@angular/forms": "~13.2.2",
"@angular/platform-browser": "~13.2.2",
"@angular/platform-browser-dynamic": "~13.2.2",
"@angular/router": "~13.2.2",
"@ionic/angular": "^6.0.0",
"date-fns": "^2.28.0",
}
```

## ionic

### 

#### 【ionic】@InputでObjectをバインドするといろいろハマる【Angular】

https://qiita.com/KuwaK/items/6fd6ca3fc1c5262524f8

#### IonicでjQuery/jQueryプラグインを従来通り使う方法

https://qiita.com/rdlabo/items/a66063019aa5b65fa0ad

#### Ionicでカスタムアイコンを使う

https://qiita.com/gekijin/items/3dea91c5abadba50abce

#### Angularで「配列」の内容を順に出力するには？（ngFor）

https://atmarkit.itmedia.co.jp/ait/articles/1711/06/news127.html

#### ionic4でのhtmlからscssの使い方

https://teratail.com/questions/239859

#### Adding Tabs Navigation in Ionic 6 Angular Application
https://www.positronx.io/adding-tabs-navigation-in-ionic-angular/

#### [Ionic]タブバーのアイコンを変更する

https://qiita.com/scrpgil/items/f3b00a31e1c6687b639b

#### [Ionic Angular] v6で新しくなったion-datetimeについて考える

https://zenn.dev/rdlabo/articles/62f404d448df01




### Component

|||
|---|---|
|ion-toolbar|https://ionicframework.com/docs/api/toolbar|
|ion-tabs|https://ionicframework.com/docs/api/tabs|
|ion-button|https://ionicframework.com/docs/api/button|
|ion-grid|https://ionicframework.com/docs/api/grid|
|ion-label|https://ionicframework.com/docs/ja/api/label|
|ion-datetime|https://ionicframework.com/docs/ja/api/datetime|

### Color

#### Colors

https://ionicframework.com/docs/ja/theming/colors

#### Color Generator

https://ionicframework.com/docs/ja/theming/color-generator
![スクリーンショット 2022-07-18 092813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/6705788f-dfb4-4241-524b-3537af8402e2.png)

#### Stepped Color Generator

https://ionicframework.com/docs/ja/theming/themes
![スクリーンショット 2022-07-18 092851.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/e2716a43-f7b0-26e3-278f-f4001f935720.png)




## AngularJS

### 【AngularJS】*ngFor属性で配列の要素を順に取り出し
https://algorithm.joho.info/programming/javascript/angularjs-ngfor/






## CSS

### [css, filter, brightness, invert]hover時に画像の色を白くする

https://makurazaki.org/web/css/post-1602/




## JS

### javascript 2次元配列を1次元配列に変換する

https://mebee.info/2021/01/28/post-20964/

### 0パディング

https://zenn.dev/cigar/articles/js-zero-padding

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/padStart

### date-fns 使い方あれこれ

https://zenn.dev/snjssk/articles/f05d1bcfeb9604
G検定取得してみた

# 対象読者

G検取りたいけど、何から手を付けてよいかわからない人

# この記事を読んだら得られること

G検に合格した我流の勉強方法と、試験に対する意気込み・挑み方

# この記事を読んでも得られないこと

G検には、どういう知識が必要か？

# まずはじめに

私は7/2のG検に挑み合格しました
以下の正解率から65～70%前後が合格ラインになってくるのではないでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/37516a22-51f7-caca-6bcd-2c47f4f7d99d.png)
試験を受けた後、合格できてるか怪しいという状態だったので実務経験なしだと結構厳しいと感じました

# 勉強時間

勉強期間1ヵ月
1日0～3時間（合計30時間前後）

# 使用した教材

* [深層学習教科書 ディープラーニング G検定(ジェネラリスト)公式テキスト 第2版](https://amzn.to/3OfuLgo)
* [最短突破 ディープラーニングG検定(ジェネラリスト) 問題集](https://amzn.to/3uRmSac)

# 勉強方法

1. [公式テキスト](https://amzn.to/3OfuLgo)を1周読む
わからなくても、一通り読み進めること
1. [問題集](https://amzn.to/3uRmSac)を1周実施する
わからない箇所は解説をよく読む、必要に応じて公式テキストやネットで調べること
1. 1つの章ごとに何度か繰り返し9割取れるように問題を解き進める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/cd5af125-bbe7-4976-92be-803e5b321434.png)
参考までにスプレッドシートで解答のformatを作り何度も問題を解いた
1. 試験2日前からは問題集を1周し、公式テキストの問題を1周解いた
知識の定着状態を確認すること（8割前後解けること）

# 試験の心構え

**圧倒的に時間が足りなくなるので、わからない沼にハマりそうになったら、フラグつけて、適当に解いて次に進めること**

G検定は検索をしながら問題を解くことができる
「G検 チートシート」でググって参考になりそうなページを2、3タブで開いておいて、いつでも調べられる状態にしておくと良い

ただし問題数が200問前後あり、それを120分で解かなければならない
1問約30秒で解く必要があり、長文問題の比率もそこそこ高いので検索に頼りすぎると時間が足りなくなる

参考までに、私が試験を受けた時は190問を120分で解かなければならなかった
全問解いた瞬間に120分となったので、見直し時間の確保はできなかった

# 最後に

**試験の難易度は容易という評価だが、私個人はAWSの試験より苦手と感じた**

* 検索できる試験のため問題を解いても解答に自信がなくなる傾向にあり、毎度調べてしまうので時間を奪われた
* 公式テキストや問題集にないケースの問題もそこそこあったため、試験範囲はかなり広いと感じた

合格に必要な正解率を70%とすると、50~60問は間違えられるので、わからない問題は仕方がないという気持ちで挑むのが良いかもしれない