OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon Athena どうしても日本語カラムを使ったテーブルをcliでCREATEしたい場合

# この記事の目的
　本記事では、Amazon Athenaのcliで日本語カラムがあるテーブルを作成する方法を記述します。備忘録です。
　Amazon Athenaに限らずDBテーブルで日本語カラムを設定するケースは殆どありませんが、運悪くそのような場面（SESで案件の規定がそうなっていた、など）に出会った時に活用していただければありがたいです。

# 使用する環境
vagrant（amazonlinux2） amazon athenaを使用できる環境構築は完了しているものとする（awscliのインストールなど）。

# 結論
日本語カラムはバックスラッシュ + バッククォーテーションで囲みます。
その他注意点として、WITH SerDePropertiesのカッコ内はダブルクォーテーションではなくシングルクォーテーションを使うほうが望ましいです（エスケープしようとするとぐちゃぐちゃになるため）。

下記は日本語カラムを用いたテーブル作成クエリです。s3に保存されたcsvをデータとして使用します。

```テーブル作成クエリ
aws athena start-query-execution --query-string "
CREATE EXTERNAL TABLE test1.user (
\`ⅠＤ\` int,
\`苗字\` string,
\`名前\`  string
) 
ROW FORMAT SerDe 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
WITH SerDeProperties ('field.delim' = ',', 'escapeChar'='\\\',  'quoteChar'='\"')
STORED AS TEXTFILE
LOCATION 's3://athenatest20220331/input/';
" --result-configuration OutputLocation=s3://athenatest20220331/output/
```


# 使用例
下記のcsvをs3://athenatest20220331/input/へ保存します。
```テストデータcsv
1,山田,太郎
2,鈴木,華子
```
Amazon athenaのデータベースをcliで作成します。
```データベースcli
aws athena start-query-execution --query-string "
CREATE DATABASE test1;
" --result-configuration OutputLocation=s3://athenatest20220331/output/
```

前述したテーブル作成cliを実行します（前述したcliの再掲です）。
```テーブル作成クエリ
aws athena start-query-execution --query-string "
CREATE EXTERNAL TABLE test1.user (
\`ⅠＤ\` int,
\`苗字\` string,
\`名前\`  string
) 
ROW FORMAT SerDe 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
WITH SerDeProperties ('field.delim' = ',', 'escapeChar'='\\\',  'quoteChar'='\"')
STORED AS TEXTFILE
LOCATION 's3://athenatest20220331/input/';
" --result-configuration OutputLocation=s3://athenatest20220331/output/
```

データをSELECT文で取得します。
```データ取得クエリ
aws athena start-query-execution --query-string "
SELECT * FROM test1.user;
" --result-configuration OutputLocation=s3://athenatest20220331/output/
```

取得したデータはs3://athenatest20220331/output/に保存されたファイルから閲覧できます。
```取得データ
"ⅰｄ","苗字","名前"
"1","山田","太郎"
"2","鈴木","華子"
```

以上
スマホとPCのデータ移動を簡単に

<h2>はじめに</h2>
皆様は自分のPC(Windows)とスマートフォンの間でデータを転送する場合、どういった手段をとられるでしょうか。
一般的にはUSBメモリ経由で移動させる方法や、one drive等のネットワークストレージに一旦データを保存してから、スマートフォンでそれをダウンロードする等の方法があると思います。

しかし、実に面倒ですよね。
慣れてしまえば無意識で出来ますが、実に面倒です。

これ。wifiルータ経由でやっちゃいましょう!!
どの機器もどうせ同じwifiルータに接続しているのですから。(多分)
せっかくスマート（賢い）フォンを使っているのだからデータ移動もスマートにいきましょう。

<h2>用意するもの</h2>
<b>1.ふつうのwifiルータ</b>

<b>2.Androidスマートフォン（root化してなくてもOK）</b>
※1,2は沢山の種類がありますが、この記事程度の事は概ねどれを選んでも実施できます。
<b>3.Androidスマートフォン用フォルダー操作アプリ</b>
※SMB機能が無いものもあるので使いやすさ・人気という観点で以下にお勧めアプリを書きます。

・x-plore:[LAN]機能で使用可能。勝手にwifiに接続されている機器をリストアップしてくれる
・ファイルマネージャー＋:[リモート]機能で使用可能
・ES ファイルエクスプローラー(googleplayからでは無く直接提供元からどうぞ)

<h2>アプリからからPCに接続する為の必要最低限の情報</h2>
<b>ホスト名:接続先のWindowsPCのIPアドレス</b>

※コマンドプロンプトでipconfigと打つと見れます。192.168.0.＊のやつです
<b>ユーザ名:接続先のWindowsPCで使用しているユーザ名</b>
※例）Yamada tarou
<b>パスワード:接続先のWindowsPCで使用しているユーザのパスワード</b>
たったこれだけ。
アプリやPC側でanonymous(匿名)接続が可能ならIPアドレスだけで接続できる場合もあります。

<h2>メリットとデメリット</h2>

<b>メリット</b>
・USBポートが埋まっている時でもデータを移動できる
・グローバルに繋がっていなくともOK
・データを移動させるまでの時間が短縮します

<b>デメリット</b>
・起動している事が条件
・DHCPだとIPアドレスが変わる可能性があるのでwifi機器側で手動でIPを固定化させた方が良いです

<h1>最後に</h1>
最近はwifiルータに大容量USBメモリを差して簡易NASとして利用できる製品が増えてきました。

その為、このやり方でアプリとwifiルータを接続すると簡易的なメディアサーバとして利用できます。
是非、お試しあれ!!
クラス図をUIデザインの際にも書く

## この記事の概要

私はデザイナーなのですが、普段ある程度のコードを書きます。
多少なりともコードを書いていると「デザインにもエンジニアリングの概念を持ち込むと便利そう」と思う機会が多くあります。

というわけでUIデザインをする際にクラス図も一緒に書いていく流れを記事にしてみました。
なお、クラス図を書くにしてもFigmaやSketch上で整理すると検索性が悪いとか、データとしての扱いが大変かもしれないとか、そんな考えもありこの記事ではMermaid[^1]で記載しています。

[^1]: Mermaidとは、テキストとコードを使ってダイアグラムやビジュアライゼーションを作成できるツールです。[最近Qiitaでも使えるようになった](https://qiita.com/release-notes#mermaidによるダイアグラムの表示をベータ版として公開しました)ので、それを試す意味合いもあります。

## 題材

ごく簡単なメモアプリを考えてみます。

### 要件を整理する

- メモが書ける
- メモが編集できる
- メモが削除できる
- メモを検索できる
- カテゴリーを作成できる
- カテゴリーを編集できる
- カテゴリーを削除できる
- メモをカテゴリーに紐付けられる

あまりにも簡素ですが、上記の内容で考えます。

### オブジェクトを拾い上げる

[OOUI本](https://www.amazon.co.jp/dp/B0893RK6WC/)や大元の[ソシオメディアさんの記事](https://www.sociomedia.co.jp/7279)にもあるように、まずは名詞を拾い上げます。

- カテゴリー
- メモ

簡単な例ですからここで出てくる要素が少ないのも当然です。
今回はこの2つがメインです。

というわけで、現時点ではこう。

```mermaid
classDiagram
  class カテゴリー
  class メモ
```

### オブジェクトの要素を考える

カテゴリーにはカテゴリー名だけ。
メモにはタイトルと作成日と本文があるとしましょう。

```mermaid
classDiagram
  class カテゴリー{
    カテゴリー名
  }
  class メモ{
    タイトル
    作成日
    本文
  }
```

それぞれの要素を並べただけです。特に難しいことはないでしょう。

### それぞれのオブジェクトに対してできるアクションを考える

要件で出していた内容がかなり近いです

- カテゴリー
    - 作成
    - 編集
    - 削除
- メモ
    - 作成
    - 編集
    - 削除

```mermaid
classDiagram
  class カテゴリー{
    カテゴリー名
    `作成()
    `編集()
    `削除()
  }
  class メモ{
    タイトル
    作成日
    本文
    `作成()
    `編集()
    `削除()
    `検索()
  }
```

### オブジェクト同士の関係性を考える

1つ1つのオブジェクトは整理できましたから、後は関係性を考えます。

- 1つのカテゴリーは0以上のメモをもつ
- 1つのメモは1つのカテゴリーに属す

```mermaid
classDiagram
  カテゴリー "1" -- "*"メモ
  class カテゴリー{
    カテゴリー名
    `作成()
    `編集()
    `削除()
  }
  class メモ{
    タイトル
    作成日
    本文
    `作成()
    `編集()
    `削除()
    `検索()
  }
```

### UIを作る

ここまでで考えた内容で、見た目としてはだいたい作れるようになっていると思います。
試しに作ってみました。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/e91f1af8-7c80-6846-462d-a95ca813d1a0.png)

メモの本文の編集はモードレスにとか、ハンバーガーメニューの中にアクションをまとめようとか、漏れなく考えやすいと思います。

:::note warn
あくまで例なので、ハンバーガーメニューの使用の是非はおいておいてください。
:::

### 1度見た目にすると気付くものを付け加える

例えば、先ほどの仕様では`1つのメモは1つのカテゴリーに属す`とあったので愚直にモックアップにおこしてみましたが`すべてのカテゴリー`のような形式で見れるビューが無いと不便そうだぞ？など

また、今回は文字列か日付かくらいしかありませんでしたが、真偽値や数字など色々なパターンをとるのであればそれもクラス図に書いていく方が良いでしょう。

## 最後に

例がかなり簡単なのでクラス図を作らずとも問題無い感じも否めませんが、ひとまず世の中にこういう作り方を共有してみます。

- UIを作るときにクラス図を考えておけると便利
    - かなり簡単な内容しか書いていなくても、要素の整理に使える
- エンジニアとデザイナーの（ほぼ）共通言語として使えるまでになれば「お互いが思っていた構成が違った」ような悲劇も防ぎやすい

---

最後まで読んでくださってありがとうございます！
Twitterでも情報を発信しているので、良かったらフォローお願いします！

https://twitter.com/xrxoxcxox
Flutterで生年月日をピックアプするModalを作成

# ソースコード
```birthday.dart
void showCupertinoDatePicker(BuildContext context) {
    showCupertinoModalPopup(
      context: context, 
      builder: (context) {
        final now = DateTime.now();
        return Container(
          height: MediaQuery.of(context).size.height * 0.3,
          child: CupertinoDatePicker(
            backgroundColor: Theme.of(context).focusColor,
            initialDateTime: DateTime(now.year - 18,12,31),
            minimumDate: DateTime(1900,12,31),
            maximumDate: DateTime(now.year - 6,12,31),
            mode: CupertinoDatePickerMode.date,
            onDateTimeChanged: (value){
              birthDay = value;
            }
          ),
        );
      }
    );
  }
```
chrono::NaiveDateTimeとdiesel::sql_types::Datetimeはバンドされないエラー

dieselでSQL検索で下記エラーが発生した。初心者であるため、解決方法をメモする。

```
the trait bound `chrono::NaiveDateTime: diesel::Queryable<diesel::sql_types::Datetime, diesel::mysql::Mysql>` is not satisfied
```

### 関連箇所

- schema.rs定義

```rust
created_at -> Datetime,
```

- 検索結果の受け皿struct

```rust
created_at: chrono::NaiveDateTime,
```

- Cargo.toml

```toml
diesel = { version = "1.4.8", features = ["mysql"] }
```

### 解決方法

- diesel依頼設定のfeaturesにchronoを追記

```toml
diesel = { version = "1.4.8", features = ["mysql", "chrono"] }
```
.DS_Storeが邪魔するのでmacOSはcdkの開発に注意

# TL; DR
.DS_Store ファイルが Lambda Layer などの中に紛れ込むと Lambda Layer 用 Asset のための hash 値に影響を与えるので macOS は CDK に向かない。 Windows とか Linux 使おう。

# 例

Lambda Layer はこんな感じに定義できます

- https://qiita.com/hrkzmaaa/items/afcf08a549c03e23e8a9

```dk-stack/lib/cdk-stack.ts
new LayerVersion(this, 'NodeModulesLayer',
  {
    code: AssetCode.fromAsset('../backend/src/layer/SharedLayer'),
...
  }
);
```

ここの例では `AssetCode.fromAsset('../backend/src/layer/SharedLayer')` として `../backend/src/layer/SharedLayer` フォルダの内容から Lambda Layer を構築していますが、このLayerが更新されたかどうかは、フォルダの中に含まれる全ファイルの内容で決まります。

つまり、同一の内容である限りは更新不要の内容として取り扱ってくれるわけです。

そのため、この中にこっそり .DS_Store ファイルが紛れ込むと、それは異なるアセット(更新されたアセット)として扱われてしまいます。

特にまずいのは、gitなどの管理システムによって複数の場所で開発を行っているときで、どこかの環境で .DS_Store ファイルが紛れ込んでしまうと、何もしてないのに Lambda Layer の状態が、常に更新が存在するものとして判断されてしまいます。

deploy する前は .DS_Store をすべて消し去るようにするのが直感的な解決方法ですが macOS とはそういう一手間が必要な OS であるので、もっと楽に開発したければ別の OS を使うのが低コストかも知れません。
FortiGateの初期設定コマンド

# はじめに

こんにちは。
FortiGateを使うたび初期設定コマンドを忘れてしまう者です。

この記事では

- IPアドレスの設定
- HTTP管理画面へのアクセス設定
 
の2点を紹介します。

# IPアドレスの設定

```
config system interface

# ポートの選択
edit port 1

# ポートのモードをstaticに変更
set mode static

# IPアドレスをサブネットマスクを設定
# 今回は192.168.1.254/24を設定します
set ip 192.168.1.254/255.255.255.0
```

# HTTP管理画面の設定

```
config system interface
edit port 1

# 試用版ライセンスだとHTTPSが無効なのでhttpを入れる
set allowaccess ping https ssh http fgfm fabric
```

# おわりに

これでFortiGateのポートにLANケーブルを指せばGUI操作ができるはずです
ForiGateはGUIが充実しているのでありがたいですよね

おわり
関数の分割と呼び出しのための考え方

# はじめに
C言語のソースコードにおける関数の呼び出し関係に注目して、読みやすいコードにするために気を付けるべきだと思うことをお話しします。
# やりかた
## 1.やりたい処理をフローチャートにする
今回は「あらかじめ与えられた2つのint型変数の相加平均を計算して表示する」という処理を例として考えていきます。
この処理をフローチャートにすると以下のような書き方が考えられます。
<div align="center">

![Untitled Diagram.drawio(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2415529/cb2ea302-9ccc-79e0-c115-6f6bd79d7e1f.png)

</div>
もしくは下のようにさらに細かくする方法も考えられます。
<div align="center">

![冗長な図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2415529/d2e77fb9-fbeb-b7ee-0c3f-d11bbc769fca.png)
</div>
しかし、ここまでに登場した処理をもとの処理をどれだけ分割したものかという点で見れば、以下のように3段階に分類できることは同意いただけるかと思います。

<div align="center">

![分類.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2415529/cd156468-cd59-2602-41a0-0a7d67424820.png)
</div>

## 2.フローチャートに従ってコードを書く
まずはなにも考えずに全てMainの中で書くことにしてみましょう。
```c:全部乗せ
#include <stdio.h>

num1 = 1;
num2 = 2;

int main(void){
    //合計値を求める処理
    double sum = num1 + num2;
    //合計値を除算する処理
    double ave = sum / 2;
    //数値を表示する処理
    printf("%f\n",ave);
    return 0;
}
```

これでもわかるような気はしますが
今回は関数の分割をテーマにしたいので、1.の図で示した処理の階層を使って分割をしてみたいと思います。
少し行が空いたので図を再掲します。
![分類.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2415529/6901e993-e37b-841f-de45-f4ae50b73952.png)
ここで考えることは単純な2点のみです。
* 上の図において同じ階層にある処理をコード中でも同じ階層に記述する
* 処理を呼び出すときには、必ず1つ上の階層の処理中で呼び出す

この2点を守ってコードを記述すると以下のようになります。
```c:分割バージョン
#include <stdio.h>

num1 = 1;
num2 = 2;

double Average(int num1,int num2);

int main(void){
    //平均値を求める処理
    double ave = Average(num1,num2);
    //数値を表示する処理
    printf("%f\n",ave);
    return 0;
}

//平均値を求める関数
double Average(int num1,int num2){
    //合計値を求める処理
    double sum = num1 + num2;
    //合計値を除算する処理
    double _ave = sum / 2;
    return _ave;
}
```
この2つのコードブロックを見比べれば心なしか下のコードの方が読みやすいような気がしてきませんか？
# おわりに

最後まで読んでくださりありがとうございました。
シフト制

[問題](https://atcoder.jp/contests/joi2014yo/tasks/joi2014yo_d)

```c++
const int MOD = 10007;
const int MAX_N = 1010;

int N;
char S[MAX_N];

int dp[MAX_N][8];

//文字→数字
int char_to_id(char c)
{
	switch (c) {
	case 'J': return 0;
	case 'O': return 1;
	case 'I': return 2;
	}
	return -1;
}

//p番を取り除く
void exclude(int pos, int p)
{
	for (int i = 0;i < 8;i++) if ((i & (1 << p)) == 0) dp[pos][i] = 0;
}

int main()
{
	scanf("%d%s", &N, S); //人数、文字列(参加必須の人)

	for (int i = 0;i < N;i++) {
		if (i == 0) {
			for (int j = 0;j < 8;j++) dp[i][j] = 1;

			exclude(i, 0); //最初 0番 が鍵を持っているため
		}
		else {
			for (int j = 0;j < 8;j++) dp[i][j] = 0;

			for (int j = 0;j < 8;j++)
				for (int k = 0;k < 8;k++) if (j & k) //同じ人が被っていれば
					dp[i][k] = (dp[i][k] + dp[i - 1][j]) % MOD;
		}

		exclude(i, char_to_id(S[i])); //参加必須の人
	}

	int sol = 0;
	for (int i = 0;i < 8;i++) sol = (sol + dp[N - 1][i]) % MOD;

	printf("%d\n", sol);

	return 0;
}
```
【LINE Messaging API, GAS】友だち追加時のあいさつメッセージを実装

## はじめに
このようなあいさつメッセージを [Messaging API](https://developers.line.biz/ja/reference/messaging-api/) で実装する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/6a584799-c7df-fd09-ccdb-c1ad121ac62b.png" width="400">

## Flex Message の実装
[Flex Message Simulator](https://developers.line.biz/flex-simulator/)でシミュレーションしながら実装できる。
このJSONコードはあとで使うのでコピーしておく。

```json:JSON
{
  "type": "bubble",
  "hero": {
    "type": "image",
    "url": "https://scdn.line-apps.com/n/channel_devcenter/img/fx/01_1_cafe.png",
    "size": "full",
    "aspectMode": "cover"
  },
  "body": {
    "type": "box",
    "layout": "vertical",
    "contents": [
      {
        "type": "text",
        "text": "HELLO!",
        "color": "#FFFFFF",
        "decoration": "none",
        "size": "lg",
        "weight": "bold",
        "align": "center"
      }
    ],
    "backgroundColor": "#DCA2A2"
  }
}
```

## フォローイベントについて
LINE公式アカウントが友だち追加またはブロック解除されたことを示すイベントを「フォローイベント」という。フォローイベントの type は `follow` である。

**フォローイベントのJSONコード例**（[Messaging APIリファレンス](https://developers.line.biz/ja/reference/messaging-api/#follow-event)より）

```json:JSON
{
  "destination": "xxxxxxxxxx",
  "events": [
    {
      "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
      "type": "follow",
      "mode": "active",
      "timestamp": 1462629479859,
      "source": {
        "type": "user",
        "userId": "U4af4980629..."
      }
    }
  ]
}
```

## 全体コード
```javascript:コード.gs
const ACCESS_TOKEN = 'Channel access token';

function doPost(e){
  const events = JSON.parse(e.postData.contents).events;
  for (var i = 0; i < events.length; i++){
    execute(events[i]);
  }
}

function execute(event){
  if(event.type === "follow"){
    var reply_token = event.replyToken;
    var messages = [{
      'type':'flex',
      'altText':'this is a flex message',
      'contents': 
        // ここにコピーしたJSONコードを貼り付ける
        {
          "type": "bubble",
          "hero": {
            "type": "image",
            "url": "https://scdn.line-apps.com/n/channel_devcenter/img/fx/01_1_cafe.png",
            "size": "full",
            "aspectMode": "cover"
          },
          "body": {
            "type": "box",
            "layout": "vertical",
            "contents": [
              {
                "type": "text",
                "text": "HELLO!",
                "color": "#FFFFFF",
                "decoration": "none",
                "size": "lg",
                "weight": "bold",
                "align": "center"
              }
            ],
            "backgroundColor": "#DCA2A2"
          }
        }
      }];
    sendReplyMessage(reply_token, messages);
  }
}

function sendReplyMessage(reply_token, messages){
  var url = 'https://api.line.me/v2/bot/message/reply';
  var res = UrlFetchApp.fetch(url, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': reply_token,
      'messages': messages 
    }),
  });
  return res;
}
```

## 参考
https://qiita.com/probabilityhill/items/1f923e742a6f18d3f163
AWS cliが使えないときに試したこと


cloud 9ではデフォルトでv1がインストールされている状態でした。
またpipコマンドはない状態です。
AWS CLIコマンドを叩くと、コマンドがv2対応らしくエラーになり、
そのままv2のインストールを行いました。
v1とv2の共存は推奨されていませんが、
それよりもまず、v1のプライオリティが高いようでコマンドは利用できないままでした。



## 行ったこと
１．AWS CLI v1のアンインストール
２．AWS CLI v2のアンインストール
３．AWS CLI v2のインストール

### １．AWS CLI v1のアンインストール
[【参考】AWS CLI バージョン 1 のバンドルされたインストーラのアンインストール](https://docs.aws.amazon.com/ja_jp/cli/v1/userguide/install-linux.html)

```
sudo rm -rf /usr/local/aws
sudo rm /usr/local/bin/aws
```

フォルダを消すことで完了

下記コマンドで確認
```
aws --version
```

バージョンが表示されなければ成功です。

### ２．AWS CLI v2のアンインストール
なぜアンインストールを行ったかというと、
cliコマンドが利用できないが、
下記エラーでv2のインストールもできない状態になっていた為。
先にDLしていたファイルが悪さをしているようなのでv2も消すことにしました。

>Found same AWS CLI version: /usr/local/aws-cli/v2/2.x.xx. Skipping install. 


[AWS CLIバージョン 2アンインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/uninstall.html)

上記を参考に削除を行いました。

### ３．AWS CLI v2のインストール

[AWS CLIの最新バージョンをインストールまたは更新する](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)

上記を参考にインストールを行いました。

下記コマンドで確認
```
aws --version
```

v2の表示がでれば完了です。

## その他
※CLIが利用できないパターンとして
CLIのバージョンが古い場合
最新化してインストールをすると動く場合もあります。
```
sudo ./aws/install --update
```
tmsh modify ltm node state user-downを実行した場合のGUIの状態

```
tmsh modify ltm node xxx state user-down
```

を実行した場合

GUIでは
Offline (Enabled) - Forced downの状態になる。
アイコンでは赤◇の状態

user-upを実行すれば
enableにstateは戻る。

state確認コマンド
tmsh show ltm node ysd2


参考URL
https://alpha-netzilla.blogspot.com/2011/07/big-ip.html
基本情報技術者試験対策　21日目

基本情報技術者試験勉強　21日目
-
この記事の目的
-
今年の5月に基本情報技術者試験を合格するために、過去問で間違えた箇所をただまとめる自分のための記事

プロフィール
-
・文系大学の３年生
・ITパスポートは保有
・ウェブアプリやサイト作成を個人で行ったことがある程度
・猫好き

今日の目標
-
ストラテジ系の問題を30問は解く。

間違えた箇所
-
1、ファブレス
製造設備を持たず、製品の企画、設計及び開発を行う

2、EDI（Electronic Data Interchange）
異なる組織間で取引するためのメッセージを通信回線を介して、標準的な規約を用いて、コンピュータ間で交換する仕組み

レベル１　情報伝達規約
ネットワーク回線や伝送手順など文字通り情報をやり取りするための取り決め

レベル２　情報表現規約
情報データをお互いのコンピュータで理解できるようにする取り決め。
データの構造やデータ項目といった表現法のルールなど

レベル3　業務運用規約
システムの運用に関する取り決め。
どんな情報をやり取りするか、情報の訂正方法やエラーの扱いなどの義務

レベル4　取引基本規約
EDIにおける取引の法的有効性を確立するための取り決め。
検収時期、支払い時期、支払い方法など

3、クロスセクション法
特定の事象に対する影響因子の相互関係を分析する手法

4、デルファイ法
複数の専門家からの意見収集、得られた意見の統計的集約など意見のフィードバックを繰り返して、最終的な意見としてまとめる。


振り返り
-
今日は、ストラテジ系をメインに取り掛かったが、正解率は割と高く、8割は取れていた。問題点としては、企業と法務の部分が低く、特に法律面の問題が解けていないため、改善ポイント。
次回は、本番と同じように80問解いて行きたい。また、午後問題も少しずつ取り組んでいきたい。

>引用
基本情報技術者試験ドットコム
https://www.fe-siken.com
絶対はずさないお店を検索できるwebアプリケーションをリリースするまで①

修正前
~~~js
<template>
  div id="app"
    <p>{{ cook.id }}</p>
    <ul>
        <li v-for ="cook in cooks">
          {{ cook.id }}
        </li>
    </ul>
  </div>
~~~

~~~js
</template>

<script>
export default {
  el: "#app",
  data: function () {
    return {
      cook:'cook.id',
      cooks: [
        {store: "awamori", lat: 26.2155658, lng: 127.6691134},
        {store: "awamori", lat: 1222.2222, lng: 3737},
        {store: "awamori", lat: 1222.2222, lng: 3737},
      ]
    }
  }


}
</script>


<template>
      <div>
      <google-map :myLatLng="{lat: 26.2125, lng:127.68111}" :zoom="15" />
     </div>
    </template>
~~~


修正後
下記の記述は不要ため削除する。
~~~js
<template>
      <div>
      <google-map :myLatLng="{lat: 26.2125, lng:127.68111}" :zoom="15" />
     </div>
    </template>
~~~



メモ
app.vueはHello.vue.jsを通じて表示する
IT企業で働いて感じた事

私はプログラマーではないので技術的なことはよくわかりません。
ここ数年IT企業と呼ばれる会社で働いて、感じたことなどを記載します。

①知識や言葉の問題
どの業界、どんな職種でもそうですが、しばらく一緒に働いている人であれば、その人が、どんな知識や感覚を持っているのかある程度わかれば問題ないですが、初めての人、あまり関わることがなかったについてはどんな知識や感覚を持っているのかを探る必要があります。
自分の常識＝世の中の常識ではない。育った場所、接してきた人、学んできたこと、やってきたことなど人によって様々。
自分自身も普通さ～何々だよね。と話すことはよくありますが、話している相手には果たして普通なのだろうか・・？
特に略語などを使うときは要注意です。この人は●●と言っても、別の人の●●は違う意味の物になってしまうことがあります。例えばBSと言えば何を思い浮かべますか？もちろん弊社の社員ならビットスター株式会社を思い浮かべますよね？でも人によっては衛星放送という人もいれば、貸借対照表という人もいるはずです。もちろん話の流れからわかることもありますが、ちゃんと自分が思っている言葉として認識しているのか、理解しているのかそれを確認しながら話さなければいけないですね。

②コミュニケーションの取り方
ここ数年、コロナの影響もあってか、Slackなどのコミュニケーションツールを使うことが多くなりました。在宅勤務なども増え、とても便利なものです。一方で直接話したりする機会が減りました。メールやSlackなどは相手が忙しくても、メッセージを送っておけば、相手の都合の良いときに確認して返事をもらうことが出来ますね。ですが、言葉の微妙なニュアンスが伝わりにくいです。直接話をする場合は口調であったり、声のトーン、表情などかわらも色々と伝わることがあります。どちらもメリット・デメリットがあるので、うまい使い分けが必要ですね。

③学び方
学生じゃなくても日々勉強は必要ですね。特にIT業界は変化が激しいので、特に日々新しいことを学ぶ必要があります。事務方も同じです。日々法律の改正は行われていますので、それに沿って色々な業務を行わなくてはいけないです。
おうち時間が増えたと言われたここ数年、本を買って独学で学んだり、動画を見て学んだりする人が多いようですね。ただ、それらに載っていないことを学ぶということが今じゃなかなか出来ないのではないでしょうか。この人の立ち振る舞い、対応の仕方、ちょっとした小技。なかなか文章や言葉では表しにくいようなものは在宅勤務や、オンライン上、一人ではなかなか習得するのが難しいですね。


今回3点あげてみましたが、いずれも、直接の人との交流ってやっぱり大事だなと思っています。
人間の中で生活している人間だもの。(誰かの名言みたいになってしまった）
Ubuntu 20.04.4 LTS にFTPサーバを構築

ファイルの移動を楽にするためにFTPサーバを導入したのでメモ。
FTPサーバはいくつか種類があるが、今回は`vsftpd`を使用する。

## 目次
1. `vsftpd`をインストール
1. 起動、自動起動の設定
1. 機能しているか確認

## 手順

### 1. vsftpdをインストール
`vsftpd`をインストールするには以下のコマンドを実行する。
```
~$ sudo apt install vsftpd -y
```
:::note info
オプション `-y` をつけると'Yes' or 'No'を聞かれずにインストールを開始することができる。
:::

### 2. 起動、自動起動の設定 

以下のコマンドでvsftpdを起動できる。
```
~$ systemctl start vsftpd
```
Ubuntuを起動した際にvsftpdを自動で起動させたい場合は以下のコマンドを実行する。
```
~$ systemctl enable vsftpd
```

### 3. 機能しているか確認
#### サーバ内での確認
以下のコマンドを実行。
```
~$ ftp localhost
```
機能しているとユーザ名の入力を促される。
```
~$ ftp localhost
Connected to localhost.
220 (vsFTPd 3.0.3)
Name (localhost:yuito):
```
ユーザ名とパスワードを入力してログインし、　`230 Login successful.`が表示されれば無事完了。終了するには`bye`を実行する。
```
Connected to localhost.
220 (vsFTPd 3.0.3)
Name (localhost:yuito): yuito
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> bye
221 Goodbye.
```
#### ftpクライアントを使用して他コンピュータから接続
講義で使用した経験があり、使いやすかったのでFile Zillaを使用。
File Zillaを起動したら、左上の白いボックスが3つ立っているボタンをクリックしサイトマネージャを開く。
右の一般の欄に情報を入力する。
![スクリーンショット 2022-03-31 23.01.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1831062/f2fe1b0f-44af-2250-8f48-4fc786c43ba8.png)
プロトコル：FTPを選択
ホスト：接続先のIPアドレス
ポート：**21番**
ユーザとパスワード：Ubuntuのアカウント

::: note warn
20番ポートもFTPで使用するポートだが、実際のデータを転送する際に使用しているポートである。
接続の際に使用されるポートは21番なので、20番ポートにしてしまうと接続できない。
:::

`接続　(C)`をクリックし、接続開始。
接続が成功すると、右側にUbuntuのディレクトリが表示される。

### 4. 書き込みの許可
ファイルを転送したり、書き込みを行う場合には設定ファイルをいじる必要がある。

1. /etc/vsftpd.confのwrite_enable=yesのコメントアウトを外す
1. 再起動　sudo systemctl restart vsftpd
Visual Studio 2022 をセットアップしよう

Visual Studio 2022 が出荷され、最新の .NET6.0 サポートとなったため、改めて WPF(C#) のアプリ開発からインストーラ作成までを記事にしたいと思います。
まずは、Visual Studio 2022 のインストール手順について記載したいと思います。

:::note info
まじめにリリースするようなアプリを開発するわけではないので Community 版とします。
:::

### Visual Studio ダウンロード
[Visual Studio のサイト](https://visualstudio.microsoft.com/ja/vs/)にアクセスし、「Community 2022」をダウンロード
![1.VS2022-Download.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184036/6aa8c229-c628-9f7b-2497-d0b3cf206962.png)
「VisualStudioSetup.exe」ファイルがダウンロードされます。

### インストール
1.「VisualStudioSetup.exe」ファイルをダブルクリックして実行し「継続」をクリック
![2.VS-Install.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184036/d626fe22-6c0e-1275-2237-610636c58ce7.png)
2.ワークロード画面で「.NET デスクトップ開発」を選択して「インストール」をクリック
![3.VS-Workload.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184036/477b53a3-13fe-800e-851d-ad4f48fef7b4.png)
3.インストールが完了したら「OK」をクリックし　Windows を再起動
![4.Installed.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184036/26ca6c29-f660-5de3-4400-2e9dec00569a.png)

### 初回起動
1.Visual Studio を起動します。
2.サインイン画面が出るが、Community 版ということで「後で行う」をクリック
![5.Signin.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184036/84ee12d6-916e-a67c-eb5c-8a144f907824.png)
3.テーマ選択画面で、開発設定は「全般」、配色テーマはデフォルトのままで「Visual Studio の開始」をクリック

:::note info
「開発設定」によって操作方法が変わりますので、まずは「全般」とします。
:::

![6.Theme.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184036/287d3b71-fdec-669c-b64c-786a878f7919.png)
4.起動するとまずはソリューションやプロジェクトの選択画面がでますが、今回はインストールの確認だけということで「コード無しで実行」をクリック
![7.Starting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184036/6ab98c15-f8ed-5316-07b0-c9c3a86702c0.png)
5.問題無ければ、Visual Studio の IDE が表示されます。
![8.IDE.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184036/fe52517f-a4c0-cf38-42d3-f6351742ddea.png)
### 次回予告
次回から、実際に c# により WPF のコーディングを進めていこうと思います。
すばらしきpyautogui

# pyautoguiとは

ざっくり、「マウス操作」や「キーボード入力」を自動操作するためのモジュールという感じです。

例えば、`デスクトップに表示している画面上で特定の表示がされた時は勝手にクリックされてほしいなぁ`などと人生の中で一度は思うことがあるのではないでしょうか(身近な例で言うと、僕は料理系の動画が好きなので参考程度に観ている最中で動画と一緒に進めていると、広告のスキップなどで自動にしてくれと思うことが多々あります。)

今回は僕の悩みを自動的な操作で解決してくれるのが、`pyautogui`になります。

## 実際に動かしてみる
実行環境については以下の通りです

```
macbook air
Python 3.9.6
PyAutoGUI==0.9.53
opencv-python==4.5.5.64
Pillow==9.0.1
```

 などで、とりあえずどれにおいても新しめのものをインストールしたつもりです。
`python3.9`についてはちょっと不服(個人的には3.8が安定しているのではないかと思っています。あんまり調べていないので確証はないですが。。。)

## とりあえず実行環境通りに全部インストールしてみましょう
- https://www.python.org/downloads/

python3のインストールについては、`python3 install`とかで調べていただくとわかりやすい記事とかたくさん出てくるので公式ページだけ貼っておきます。

モジュールたちについてはpipコマンドでインストールできます。

```
pip3 pyautogui==0.9.53
pip3 opencv-python==4.5.5.64
pip3 Pillow==9.0.1
```

## メインディッシュの前の準備
さて、準備ができたところでさっそくmainのソースコードを、、、
と、その前に画像認識するのにそのサンプルがないと認識なんてできるわけないじゃないかということで、何かサンプルの画像保存しときましょう。例えば、Youtubeの`広告をスキップ`のボタンとかどうですかね？(スクショで大丈夫です)


## メインディッシュ
お待たせしました、ようやくmain.pyの紹介に移ります。
以下が、ソースコード全容です。

```python
import pyautogui as pag

ad_png_path = "ad1.png"

# 同時押しのhotkeyメソッドでは、ウィンドウの切り替えができなかったので人間の動きを再現
pag.keyDown("command")
pag.press("tab")
pag.keyUp("command")

while True:
    try:
        if pag.locateOnScreen(ad_png_path, confidence=0.8) is None:
            continue
        else:
            # 広告位置にカーソル移動&スキップ
            icon_loc = pag.locateOnScreen(ad_png_path, confidence=0.8)
            x, y = pag.center(icon_loc)
            # x,yともに2で割らないと正しい座標をクリックできない(mac環境だけらしい)
            pag.click(x / 2, y / 2)
    except KeyboardInterrupt:
        exit("強制終了しました。(正常)")
    except:
        pass
```

どうでしょうか？
意外にも短すぎますね。画像認識といってもモジュールを使えば簡単に実現できてしまいます。
python様様です。

一個前の手順で保存した画像のファイル名だけ`ad1.png`じゃなくても良いので、しっかりコードとファイル名で合わせるようにしてください。

詰まった点としては、ターミナルでpythonを実行すると思うのですが最初はクリック(`pyautogui.click()`メソッドを使用)することでyoutubeのタブに飛んでいましたが、せっかくならと言うことで`cmd + tab`のショートカットキー使ってアプリケーション間移動しようとして`pyautogui.hotkey(cmd, tab)`で実行しましたがうまくいかない。

なんでやねんと思いながら、試行錯誤すること数分、、
hotkey()メソッドが`同時押し`ということに気づきました。最初から気づいてはいましたがコンピュータの同時押しというのは人間よりも正確であることを考慮漏れしていました。ということで人間っぽい動きをしてもらうことに。

```
pyautogui.keyDown("command")でcmdキーを押したまま
pyautogui.press("tab")でtabキーを一回押して
pyautogui.keyUp("command")でcmdキーを離す。
```

これで僕たち人間がやっている動作と同じですね。

また、別の問題にもぶつかりました。
`pyautogui.locateOnScreen()`メソッドで取得した画像の座標をそのまま使用しても意図したところをクリックしてくれないということです。
これはx,yともに2で割らないと正しい座標をクリックできない(たぶんmac環境だけらしい)ということです。
確かに、取得した座標を確認すると画面サイズの2倍の値になっていたのでいつまで経っても気づかないところでした。

そして、最後の問題はmacのセキュリティの問題でした。
```
設定 > セキュリティとプライバシー > 画面収録 から iterm
設定 > セキュリティとプライバシー > アクセシビリティ から iterm
```
をそれぞれ許可しないと実際に動作させても何も行わずに処理が終了してしまいました。(macに標準搭載のターミナルだとこの手順いらないかもしれません)

# 最後に
以上で、特定の画像が画面上に表示されるとそこに勝手にカーソルが移動して、クリックをしてくれるというツールの出来上がりです。

これで布団に入りながらでもyoutube見放題ですね！
あ、ただしフルスクリーンモードでは認識してくれないので、`シアター`か`標準`サイズで試してみてくださいね。

一応、リポジトリ置いておきます。
よしなに使ってみてください。
- https://github.com/ryo0819/tools/tree/add_skipAD
pythonのインタプリンタで四則演算する

## はじめに
プログラミング初心者が最初にやるお試し計算の記録です
## ゴール
pythonのインタプリンタで四則演算を行い解を表示する
## 手順
```:足し算
>>> 5 + 5
10
```

```:引き算
>>> 50 - 5
45
```

```:掛け算
>>> 10 * 10
100
```

```:割り算
>>> 100 / 10
10.0
```

## 終わりに
足し算引き算掛け算は整数表示（int型）になるが、割り算の場合は必ず小数点表示(float型)になる。
VBA 選択範囲のセル結合を解除し値埋めするマクロ

列や行で選択しても使えるマクロメモ。

対象は↓のようにセル結合された表。
![スクリーンショット 2022-04-02 221339.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572466/d0271f88-5b88-2870-520c-3a3493bc7ab0.png)

```vb:
Sub UnmergeSelectionAndFillValues()
    Dim rng As Range
    Dim targetRng As Range
    Dim cnt As Long

    cnt = 0

    '画面更新OFF
    Application.ScreenUpdating = False
    
    '選択範囲のうち使用されている範囲を取得
    Set targetRng = Intersect(Selection, ActiveSheet.UsedRange)
    
    '対象範囲の各セルをループ
    For Each rng In targetRng
        '結合セルのみ処理
        If rng.MergeCells Then
            With rng.MergeArea
                '結合範囲のセル結合解除
                .UnMerge
                '結合されていた範囲の一番左上の値を範囲全体にセット
                .Value = rng.Value
            End With
            
            'カウントアップ
            cnt = cnt + 1
            
            'ステータスバーに処理進行状況を表示
            Application.StatusBar = "処理中..." & String(Int(cnt / 10), "■")
        End If
    Next
    
    'ステータスバー解放
    Application.StatusBar = False
    
    '画面更新ON
    Application.ScreenUpdating = True
End Sub
```



縦に同じ値のセルが入っていたら一番上のセル以外の文字色を白くし上罫線を繰りクリアする機能を追加すると以下のようになる。

```vb:
Sub UnmergeSelectionAndFillValues()
    Dim rng As Range
    Dim targetRng As Range
    Dim cnt As Long

    cnt = 0

    '画面更新OFF
    Application.ScreenUpdating = False
    
    '選択範囲のうち使用されている範囲を取得
    Set targetRng = Intersect(Selection, ActiveSheet.UsedRange)
    
    '対象範囲の各セルをループ
    For Each rng In targetRng
        '結合セルのみ処理
        If rng.MergeCells Then
            With rng.MergeArea
                '結合範囲のセル結合解除
                .UnMerge
                '結合されていた範囲の一番左上の値を範囲全体にセット
                .Value = rng.Value
            End With
            
            'カウントアップ
            cnt = cnt + 1
            
            'ステータスバーに処理進行状況を表示
            Application.StatusBar = "処理中..." & String(Int(cnt / 10), "■")
        End If
    Next
    
    '選択範囲において1行上のセルと同じ値が入っているセルの文字色を白色にし上罫線クリア
    Call WhitenSuspendedCharOfSelection
    
    'ステータスバー解放
    Application.StatusBar = False
    
    '画面更新ON
    Application.ScreenUpdating = True
End Sub

'選択範囲において1行上のセルと同じ値が入っているセルの文字色を白色にし上罫線クリア
Sub WhitenSuspendedCharOfSelection()
    Dim rng As Range
    Dim targetRng As Range
    
    '選択範囲のうち使用されている範囲を取得
    Set targetRng = Intersect(Selection, ActiveSheet.UsedRange)

    '対象範囲の各セルをループ
    For Each rng In targetRng
        '1行上のセルと同じ値なら文字色を白色にし上罫線クリア
        If rng.Value = rng.Offset(-1).Value Then
            rng.Characters.Font.Color = vbWhite
            rng.Borders(xlEdgeTop).LineStyle = xlLineStyleNone
        End If
    Next
End Sub

```

B列を選択してマクロ実行すると↓のようになる。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572466/d633afe5-1da9-b315-ad0d-2b6cd086f337.png)



参考記事

【エクセルVBA】一瞬で結合セルを解除して値を埋めるマクロ
https://www.excelspeedup.com/ketsugoukaijyoshiteumeru/
ループ内でコールバック関数に変数を渡すとき、変数のスコープ次第でんぁぁぁぁってなる


## 突然ですが

以下のスクリプトの実行結果は

```js
  (function(){
    let i = 0;
    for (i = 0; i < 3; i++) {
      console.log(i);
      setTimeout(function(){ console.log(`hello ${i}`)}, 1000);
    }  
  })();
```

このようになります。

> 0  
> 1  
> 2  
> hello 3  
> hello 3  
> hello 3

Oh……全部3になってやがるぜ……。

変数iのスコープがforのブロック外にあるので、`setTimeout`に渡しているコールバック関数は***最新のiの値***を参照します。  
また、`let`で宣言せずに`for (var i = 0; i < 3; i++)`と記述しても同じ結果になります。varは関数以外ではブロックスコープを作りません。

この手のやつ、むかーし（letがないころ）すごいはまりました。イベントリスナーをループ内で設定しようとして「んぁぁぁぁぁぁぁ」ってなってました。ボタン複数作って、全部最後のボタンと同じ挙動になる術式。

## 変数のスコープを適切にする
シンプルにこのように記述すれば望み通りの結果になります。

```js
(function(){
  for (let i = 0; i < 3; i++) {
    console.log(i);
    setTimeout(function(){ console.log(`hello ${i}`)}, 1000);
  }  
})();
```
> 0  
> 1  
> 2  
> hello 0  
> hello 1  
> hello 2  

JavaScriptは歴史的な経緯もあり、変数のスコープが少し特殊ですね。

## varしか使えないとき

ES6より前であれば以下のようにクロージャを使うといいかもしれません。

```js
(function(){
  for (var i = 0; i < 3; i++) {
    console.log(i);
    var a = function(n) {
      return function() {
        console.log('hello ' + n); // テンプレートリテラルも使えなかった
      }
    };
    setTimeout(a(i), 1000);
  }  
})();

```

### varしか使えないとき②

@esk312 さんにご指摘いただきました。
`setTimeout`のコールバックで外部の値を渡すのであれば、第3引数に指定できるそうです！ありがとうございました。

```
(function(){
  for (var i = 0; i < 3; i++) {
    console.log(i);
    setTimeout(console.log, 1000, 'hello' + i);
  }  
})();
```


https://developer.mozilla.org/ja/docs/Web/API/setTimeout


## 補遺

自分が管理していない日報ツールのブックマークレット作っていたら、敵（）のスクリプト内でグローバルスコープの変数をコールバック数に渡していましてね・・・・・・。
AWS Systems Manager Runbook(旧 Automation Document)の`aws:createStack`にパラメーターを渡すやり方を考える

こんにちは。kosukeです。(すみませんがまだちゃんと書けてないです)

## はじめに

突然ですがAWS Systems Manager Runbookは好きですか!!!
私は最近Solrの環境構築をRunbookで実装する機会がありました。
これの中でずっと頭を悩ませていた`aws:createStack`にパラメーターを渡すやり方について考えたことを忘れる前にまとめようと思います。

## Runbookとは

> オートメーションは、AWS のサービス (Amazon Elastic Compute Cloud (Amazon EC2)、Amazon Relational Database Service (Amazon RDS)、Amazon Redshift、Amazon Simple Storage Service (Amazon S3) など) でのメンテナンス、デプロイ、および修復に関する一般的なタスクを簡素化するための、AWS Systems Manager の一機能です。
>オートメーションは、AWS リソースを大規模にデプロイ、設定、管理のための、自動化されたソリューションを構築するのに役立ちます。オートメーションを使用すると、自動化の同時実行性をきめ細かく制御できます。同時実行のターゲットにするリソースの数や、オートメーションを停止する前に許容可能なエラーの発生数を指定することが可能です。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-automation.html


Runbookでスクリプト実行したり、スクリプトの実行、インスタンスに対してコマンドを実行したりできます。


## 本題

Runbook1つでSolrインスタンス、書き込みAPI、アラーム等全部を作ろうとしていてそれらはCloudFormationで構築しようと考えておりました。
そこで問題になったのが、RunbookでCloudformationのデプロイを行うCreateStackの機能にはパラメーターをファイルで渡す機能がないことです。
素直にやろうとすると、Automationのデプロイテンプレートに全てのCFnのテンプレートを渡す方法がありますけど、これはしんどすぎる。。。
そこで考えた方法を紹介します。

リファレンス
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-action-createstack.html

### 案１: CloudFormationのデプロイをexecuteScriptで実行する

CFnの実行をPythonもしくはPowerShellで実行する。
実装次第で色々なパラメーターの渡し方ができる
s3のbucketをパラメーターに渡して渡すことができる

### 案2: AWS::Includeを使ってパラメーターを渡す

CloudFormationのテンプレートをモジュール化して渡すようにする。
runbookの中にパラメーターを直書きするようになってしまうので、AWSアカウント上のrunbookのパラメーターを使ってどうこうするみたいなのをやりずらくなる
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/create-reusable-transform-function-snippets-and-add-to-your-template-with-aws-include-transform.html


うまくまとまっていないですが、少しずつまとめていきます。
【Go】VSCodeの実行で標準入力を行うと「noDebug mode: unable to process 'evaluate' request」が発生

## 概要
GoでAtCoderをやる時など、標準入力を使うと思いますが、VSCodeで実行時に`noDebug mode: unable to process 'evaluate' request`というエラーが発生しました。
なお、Goの標準入力の詳細については、[[1分学習]Goで標準入力を受け付ける](https://zenn.dev/tomatomato/articles/onemin_golang_stdin)の記事を参照ください。

## 対応
[こちら](https://github.com/golang/vscode-go/issues/2015)のissueを参照すると、VSCodeの`launch.json`へ設定追加が必要なようです。`"console": "integratedTerminal"`の設定を追加すれば、動作しました。
念の為、`launch.json`の全体内容を以下に記載します。

```json:launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch Package",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${fileDirname}",
            "console": "integratedTerminal",
        }
    ]
}
```
Graph APIでAzure ADにユーザーを作成する

## Azure ADにアプリケーションを作成
### 1. Azure ADで「アプリの登録」⇒「新規登録」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/d86601bb-a625-b213-e93d-ff7440071d88.png)
任意の名前を付けて作成

作成できたら「概要」からクライアントIDとテナントIDを控えておく

### 2. APIのアクセス許可を追加
- Directory.ReadWrite.All
- User.ReadWrite.All
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/836ef6a4-49bd-f564-74b5-a3e7fd5fb4cd.png)
※アプリケーションにアクセス許可を追加する場合は管理者の同意が必要です。

### 3. 「証明書とシークレット」でクライアントシークレットを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/c05bd915-da40-6e20-0419-872fa14b9141.png)
値を控えておく

### 4. 任意のクライアントでトークン取得のAPIを実行
- メソッド：POST
- エンドポイント：https://login.microsoftonline.com/＜テナントID＞/oauth2/v2.0/token
- ヘッダー：
    - Content-Type：multipart/form-data
- form-data:
    - client_id: 1で控えたクライアントID
    - scope：https://graph.microsoft.com/.default
    - client_secret：3で控えたシークレット
    - grant_type：client_credentials

トークンがレスポンスされる
```
{
    "token_type": "Bearer",
    "expires_in": 0000,
    "ext_expires_in": 0000,
    "access_token": "ey*************"
}
```

### 任意のクライアントでGraph APIを実行
- メソッド：POST
- エンドポイント：https://graph.microsoft.com/v1.0/users
- ヘッダー
    - Content-Type：application/json
    - Authorization：Bearer <トークン>
- ボディ：
```
{
  "accountEnabled": true,
  "displayName": "Adele Vance",
  "mailNickname": "AdeleV",
  "userPrincipalName": "AdeleV@<Your Domain>.onmicrosoft.com",
  "passwordProfile" : {
    "forceChangePasswordNextSignIn": true,
    "password": "***********"
  }
}
```
M1 Macでpod installしたらエラーが出た

# はじめに
swiftでiOSアプリを作っているのですが、データベース接続したいと思い、調べてみたところ、Realmというのが使えるとわかりました。しかし、導入するのにエラーがたくさん出て、大変だったので解決した方法を書き残しておきます！

基本的な導入の進め方は[こちらの記事](https://qiita.com/pe-ta/items/616e0dbd364179ca284b)を参考にさせていただきました。


# エラー内容と解決方法
`pod install`実行時のエラーです。
## エラー１つ目　ー　[!] Automatically assigning platform `ios` with version `14.5` on target


``[!] Automatically assigning platform `ios` with version `14.5` on target `{プロジェクト名}` ``

## 解決方法1
```swift: Podfile
platform :ios, '14.5'
```
を追加する。

## エラー2つ目　ー　[NOTE] You may have encountered a bug in the Ruby interpreter or extension libraries.
`[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.`
これはM1 Macを使っていると出るエラー
らしい。

## 解決方法２つ目
Finderでターミナルを右クリックし、`情報を見る`を選択。
![スクリーンショット 2022-03-31 22.17.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600580/558dc3e2-4867-4337-8912-4505958e76fe.png)

`Rosettaで開く`にチェックをつける。
![スクリーンショット 2022-03-31 22.17.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600580/289d0d62-6c28-3f07-e9c7-648eb74b95cb.png)

ターミナル再起動。
```swift: ターミナル
sudo gem install ffi 
```
を実行。
ちなみに、ターミナルがRosettaで開かれているかどうかの確認方法は、アクティビティモニタでターミナルがの種類の列がIntelとなっていたら良いようです。
![スクリーンショット 2022-03-31 22.20.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600580/e0ac284c-c6c2-08d2-ebad-b7dfe8a6d9b1.png)

## エラー3つ目　ー　/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
下の写真みたいなエラーも、直接の関係があるのかわかりませんが、２つ目の方法で直りました。
![スクリーンショット 2022-03-31 22.16.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600580/cc4f7885-dbd3-5195-53b3-b23428e68f1e.png)


# 最後に
ただエラー調べてるだけだと、M1 Macが原因！といった先例が少ないようなことで困ることが多いので、そこら辺も考慮して調べていかないと難しいなと学びました。
【IBM/coursera】IBMのデータサイエンス専門家コース(11ヶ月)を正答率100％で修了した話。

# はじめに　
<a href = "https://www.coursera.org/">coursera</a>というオンライン教育プラットフォームで開催されていたIBMによるデータサイエンスコースを受講しました。完全オンライン性で、自分のペースで進められ、とても有意義でした。初心者向けということもあり推定11ヶ月のコースでしたが、2週間で修了する事ができました。ので、その時の経験についてまとめようと思います。

# Overview 
今回私が修了したデータサイエンス専門家コースですが、10個の小さいコースが集まっている物になります。それぞれの小コースを修了するたびに修了証書が配られ、全てのコースを修了するとこの様な修了証書がもらえます。左の10coursesの欄に記載されているのが今回受講した小コースになります。

![修了証書](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044781/e08a81a3-45cb-429d-d44e-d804784868bf.png)

#### 受講した10コース
- What is Data Science?
- Tools for Data Science
- Data Science Methodology
- Python for Data Science, Al & Development
- Python Project for Data Science
- Databases and SQL for Data Science with Python
- Data Analysis with Python
- Data Visualization with Python
- Machine Learning with Python
- Applied Data Science Capstone

"What is Data Science?" から始まり、最終プロジェクトでは<a href = "https://foursquare.com/">foursquare</a>とAPI連携し、ニューヨークにあるピザ屋さんのレビューと市街地からの距離の相関関係についてまとめたので、かなりデータサイエンスの事は学べたのではないかと思います。（最終プロジェクトに関しては、この記事のLGTM次第でまとめようかと思っています）
ちなみにコースは全部英語で行われており、講師や生徒同士のやり取りは基本英語でした。


# 授業スタイル
講義は基本ビデオや教科者を読むような事業でした。章末にテストがあり合格するまで何回でも受けれるのですが、2~3回不合格になると8時間そのテストを受ける事ができなくなるので、しっかり勉強したほうが時短になると思いました。ちなみに、講義ビデオの途中にも小テストセクションがあり、それも正解しないと先には進めません。油断禁物です。。
また、コースが終盤になってくるとプロジェクトがアサインされ、それが章末テストの代わりになる事もありました。

![成績表](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044781/e9e8cd44-5f51-8e7f-cd3b-68a080f48b36.png)

# Pros & Cons

### 1. 自分のペースで進められる (Pro & Con)
完全オンラインだったので、空き時間に動画再生したり、プロジェクトを進めたりできてとても良かったです。しかし、周りに同級生がいないというのは時にとても辛く、自制心を保たなければいつでもコースから離脱できて今します。実際に、コースを最後まで受講する生徒は全体の7~9%[^1]に留まっているようです。(生徒同士で交流が深められるスレッドはあるが、過疎っていました)

[^1]: 出典: フリー百科事典『ウィキペディア（Wikipedia）』 - https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%82%BB%E3%83%A9#cite_note-2


### 2. 章末プロジェクトが面白い (Pro)
特に最終プロジェクトなのですが、内容が被っていればどんなプロジェクトをしても良い（講師からの承認は必要）事があったので、自分がやりたい事をコースの一部として消化できたのはとても有意義でした。

### 3. 章末プロジェクトの採点方法が生徒による物 (Con)
courseraのコースは数千人もの生徒が一気に受講します。そのため、プロジェクトを評価する講師を割り当てる事が出来ないのでしょう。なので、同じプロジェクトを終えた生徒達が自分の評価をしてくれます。以下のように、複数名の生徒が採点し、投票制で点数がつけられるようです。点数をつける際に詳細なガイドラインはあるものの評価の質は下がるかなと思いました。ただ、同じコースを受けている生徒による評価なので過度に酷いプロジェクトなどは不合格になっている様でした。　
![Screen Shot 2022-03-31 at 21.51.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044781/e37b15d2-c82a-e1db-1713-5df48012a26b.png)

### 4. 技術的な説明が浅い (Con)
短期間のコースなので仕方ないのかもしれないのですが、コンセプト一個一個の濃度が薄い気がしました。回帰、分類、クラスタリングなどの手法に触れるものの、その手法の詳しい内容は自分で勉強する必要があると感じました。

### 5. IBM Cloud が使えるようになる (Pro)
IBMが提供しているコースなので、<a href = "https://www.ibm.com/cloud">IBM Cloud</a> を使って作業するプロジェクトがほとんどでした。IBM Cloudでpython環境を作りJupyter Notebookを使用する経験ができたのは、自分的にこのコース一番の収穫だったかと思います。もちろん、一挙書一投足サポートしてくれます。


# 総評
駆け出しデータサイエンティストにピッタリの内容かと思います！是非トライしてみて下さい！
WSLのコマンド履歴を自動で保存する

WSLでコマンド履歴をログファイルに自動で残したい。

# 設定

`~/.profile` に以下追記
```
script -f <ディレクトリ>/$(date +%Y%m%d%H%M%S)_wsl.log
```

例：
```
script -f /home/emi/wslscript/$(date +%Y%m%d%H%M%S)_wsl.log
```
↓再起動

```
Script started, file is /home/emi/wslscript/20220331220459_wsl.log
emi@LAPTOP-AOJR4Q2P:~$
```
これでログ保存開始できた。

# ログの確認
 - `cat ファイル名.log`
 - `less -r ファイル名.log`

で綺麗に参照できる。

例：
```
emi@LAPTOP-xxxxx:~/wslscript$ less -r 20220331220459_wsl.log
"20220331220459_wsl.log" may be a binary file.  See it anyway? ⇒y
```
※`q` で抜ける。


Windowsのエクスプローラーから直接開くとやや見づらい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/e50aa3f8-6e91-2d55-3b50-11c2a66d7ed4.png)


# 参考

https://qiita.com/rjegg/items/798008eefbd8b578c2ae

https://qiita.com/keigodasu/items/3eebbc079274ad8dd2c2
CloudFormationで権限周りのエラーにハマったとき

## 何がツライか

* CloudFormationでリソースを作るとき、以下のようなエラーにハマるのが辛い（Action教えてくれ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325101/a4309017-c50c-34fc-4221-1512850a1304.png)

## 何が私を救ってくれたか

* [`aws cloudformation describe-type`](https://awscli.amazonaws.com/v2/documentation/api/2.3.2/reference/cloudformation/describe-type.html) なる神コマンド

> Description
Returns detailed information about an extension that has been registered.
If you specify a VersionId , DescribeType returns information about that specific extension version. Otherwise, it returns information about the default extension version.


## 使い方：aws cloudformation describe-type

### コマンド

```bash
$ aws cloudformation describe-type --type RESOURCE --type-name AWS::NetworkFirewall::Firewall --query Schema --output text | jq .handlers
```

### 実行結果

```json
{
  "create": {
    "permissions": [
      "ec2:CreateVpcEndpoint",
      "ec2:DescribeVpcEndpoints",
      "ec2:DescribeSubnets",
      "ec2:DescribeVpcs",
      "network-firewall:CreateFirewall",
      "network-firewall:DescribeFirewallPolicy",
      "network-firewall:DescribeRuleGroup",
      "network-firewall:TagResource"
    ]
  },
  "read": {
    "permissions": [
      "network-firewall:DescribeFirewall",
      "network-firewall:ListTagsForResources"
    ]
  },
  "update": {
    "permissions": [
      "network-firewall:AssociateSubnets",
      "network-firewall:DisassociateSubnets",
      "network-firewall:UpdateFirewallDescription",
      "network-firewall:UpdateFirewallDeleteProtection",
      "network-firewall:UpdateSubnetChangeProtection",
      "network-firewall:UpdateFirewallPolicyChangeProtection",
      "network-firewall:AssociateFirewallPolicy",
      "network-firewall:TagResource",
      "network-firewall:UntagResource",
      "network-firewall:DescribeFirewall"
    ]
  },
  "delete": {
    "permissions": [
      "ec2:DeleteVpcEndpoints",
      "logs:DescribeLogGroups",
      "logs:DescribeResourcePolicies",
      "logs:GetLogDelivery",
      "logs:ListLogDeliveries",
      "network-firewall:DeleteFirewall",
      "network-firewall:UntagResource"
    ]
  },
  "list": {
    "permissions": [
      "network-firewall:ListFirewalls"
    ]
  }
}
```
Confluenceサーバーのpostgreを構築したときのメモ

pgadmin　を使えばGUIで確認できる

[バージョン情報](https://ja.wikipedia.org/wiki/PostgreSQL#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E5%B1%A5%E6%AD%B4)

PostgreSQL　インストール方法

yum install postgresql-server postgresql-devel postgresql-contrib -y

postgresql-setup initdb

systemctl start postgresql.service
systemctl enable postgresql.service

su - postgres

psql;
create database confluence;
終了は　¥q

バージョン確認：psql --version

version　10

https://www.setouchino.cloud/blogs/95 

postgres 11

https://qiita.com/libra_lt/items/f2d2d8ee389daf21d3fb 

バージョン１２ cpu使用率が200％超えていた　不安定だな

https://techviewleo.com/install-postgresql-12-on-amazon-linux/

設定変更

sudo -u postgres psql -l

$ sudo cp /var/lib/pgsql/data/postgresql.conf /var/lib/pgsql/data/postgresql.conf.bak
$ sudo vim /var/lib/pgsql/data/postgresql.conf
listen_addresses = '*'

cp /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.bak
vim /var/lib/pgsql/data/pg_hba.conf
localhost all all peer　の peerを　trustへ
host all all 127.0.0.1/32 ident　→　host all all 0.0.0.0/0 trust　へ変更
sudo passwd postgres
TQkLCyVafB8GTx
reboot

最初はインバウンドルールをすべてのトラフィックをあけないとだめ？

リスト
$ su - postgres
TQkLCyVafB8GTx
psql -l
dropdb confluence
psql -l
createdb confluence

https://www.suzu6.net/posts/159-amzon-linux2-install-postgres/ 

https://qiita.com/pugiemonn/items/75870ece3c8476bcb1c8 
http://www.kodnet.co.jp/blog/confluence/2015/2341/

postgreの操作
https://blog.clock-up.jp/entry/2014/12/30/centos-postgresql

心残り
postgreip制限したい

PostgreSQLで強制的にデータベースを削除する - Qiita
https://qiita.com/sayama0402/items/b3d96c25ecb60733beb9 

postgresデータの移行

sudo su

$ su - postgres
psql -l

https://qiita.com/rice_american/items/ceae28dad13c3977e3a8 

 pg_dump jira > jira.dump　をする

pg_dump -U postgres -d jira > jira.dump  それか、pg_dump -d confluence -Fc -U postgres -f confluence.dump 
https://qiita.com/hondy12345/items/47eb6a104a99170ae7aa

を行い
filezillaで取る

インポート

sudo su

psql -U postgres jira < jira.dump   それか、 pg_restore -d jira jira.dump

DB消す時

DROP DATABASE confluence;

今　posgresSQL10.4
コンフル上で
https://db-study.com/archives/133
１、cuiでdumpする
２、guiでdumpする　postgre my admin
https://torazuka.hatenablog.com/entry/20100415/pg
https://qiita.com/11ohina017/items/edb7d7a0812908200a0a
３、xmlと添付ファイルを保存して、appとdb全てインストールし直す
４、バックアップ.zipから、appとdb全てインストールし直す
５、ソースフォルダを移行して、appとdb全てインストールし直す
BottomSheetDialogFragment + GoogleMapで表示が崩れる問題を解決する方法

# はじめに
今回はBottomSheetDialogFragmentの中にGoogleMapを実装した際に発生した問題の解決方法を紹介します。

# 発生した問題
下記の動画のように、BottomSheetDialogFragmentをバックキーで閉じる際に、GoogleMapの表示が崩れるという問題が発生しました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199988/3d331968-d478-b0a6-a68e-a448cd90acb0.gif" width="420px"/>




# 実装概要
実装していたコードの概要は下記の通りです。
GoogleMapには[googlemaps/android-maps-compose](https://github.com/googlemaps/android-maps-compose) を使用していました。

```BottomSheetFragment.kt
...
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = FragmentBottomSheetBinding.inflate(inflater, container, false).apply {
            map.apply {
                setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
                setContent {
                    Column(
                        modifier = Modifier.fillMaxSize(),
                        horizontalAlignment = Alignment.CenterHorizontally,
                    ) {
                        GoogleMap(
                            modifier = Modifier
                                .fillMaxWidth()
                                .height(260.dp),
                        )
                    }
                }
            }
        }

        return binding.root
    }
...
```

```fragment_bottom_sheet.xml
...
　　　　　　　　　　　　<androidx.compose.ui.platform.ComposeView
            android:id="@+id/map"
            android:layout_width="0dp"
            android:layout_height="260dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/title"
            />
...

```

# 解決した方法
バックキーをで閉じる際に呼ばれる、`dismiss()`を`override`し、`BottomSheetBehavior`のプロパティを変更してあげます。

```BottomSheetDialogFragment.kt
...
override fun dismiss() {
    val parentView = binding?.root?.parent as? View ?: return
    BottomSheetBehavior.from(parentView).apply {
        isHideable = true
        state = BottomSheetBehavior.STATE_HIDDEN
    }
 }
...
```


# おわりに
参考になると幸いです！
［Python］複雑な大量のファイルを処理したい

# やりたいこと
- Python でこんなファイルを処理したい
- 同じようなファイルがめちゃある


# サンプルファイル
- ひとつのセルに、長々しいデータが入っている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520368/c7c1c033-b7fe-be03-a5fd-58107f427b51.png)


# Step
```
# パスを変数に入れる
path = "abc/def"
file_list = glob.glob(path + "/test.csv)

# 空のデータフレームを作成
df_cp_memory = pd.DataFrame()
for file in file_list:
# スラッシュで区切る
    df2 = pd.read_csv(file, header=None , sep='/' )
　　# 空のデータフレームに、フ変数にいれたファイルを入れていく
　　# 一つ大きなテーブルができる
    df_cp_memory = pd.concat([df_cp_memory, df2])

# 確認
print(df_cp_memory)

# Excelに書き出す
df_cp_memory.to_excel(path + '/cp_memory.xlsx', index=True , header=True )

```
#  そのほか
`skiprows=1` を設定すると、最初の一行目スキップされる

```
df2 = pd.read_csv(file, header=None , sep='/' , skiprows=1)
```
DearPyGui で UI を作るメモ

## .ini(レイアウトファイルなど)ファイル

imgui だと定期的(1 分ごと?)にレイアウトを .ini に保存してくれた気がしました.
dearpygui ではレイアウト自動セーブ機能はないようです(Python で保存用スレッド建てればいけるか).

https://dearpygui.readthedocs.io/en/latest/documentation/init-files.html#creating-init-files

自前で save 必要です.

ロードも明示的に `.ini`　をよむ必要があります.

また, window は自前で作ったものだけ保存されます.
font_manager など dpg にビルトインのはレイアウト保存されません.

## node editor でレイアウト保存

こちらも標準ではないようです.
自前でレイアウト保存/ロードの機能を書く必要ありそう.

## style を変えたい.

```
with dpg.theme() as global_theme:

    with dpg.theme_component(dpg.mvAll):
        ...
```

など. 注意点としては C++ だと色は `[0.0, 1.0]` ですが dearpygui では `[0, 255]` です.
sRGB はたぶん考慮されていないような気もします. カラースペースは各自ご調査ください.

## font をかえたい.

https://qiita.com/syoyo/items/863da7c55acf72ad8e37

## Docking window にしたい.

experimental であまり情報がありません.

https://dearpygui.readthedocs.io/en/latest/_modules/dearpygui/dearpygui.html?highlight=docking#

```
dpg.configure_app(docking=True, docking_space=True)
```

でいけます.

`docking_space=True` で背景全体が docking 用の領域になります.
(多くのひとはこれが想定の動作と思われる)

`docking_space=False` だと, フリーレイアウトのままです.