OmniAICreator/Qiita-1.07M huggingface dataset:
Gmail自動転送が禁止なら GAS で転送しようじゃないか

企業によっては、セキュリティやコンプライアンス等の規定によりメールの自動転送（他メールアドレスへの全自動転送）が禁止されてものと思います。Google アカウントが会社で管理されているのであれば設定が無効化されているでしょう。

今回は GAS（Google Apps Script）を利用し Gmail の自動転送を擬似的に再現します。
※なお、企業ごとの規定理由によってはかなりグレーな方法であることをご認識おきください。

### 1. GAS プロジェクトの作成
Apps Script トップより新規プロジェクトを作成します。

```javascript
const FORWARD_MAIL_ADDRESS = '【転送先メールアドレス】';
const MY_MAIL_ADDRESS = '【転送元メールアドレス】';
const FIRE_INTERVAL_MINUTES = 1;

function forward() {
  const now = Math.floor(new Date().getTime() / 1000);
  const interval = now - (60 * FIRE_INTERVAL_MINUTES);

  const query = 'is:unread' + ' ' + '-from:' + MY_MAIL_ADDRESS + ' ' + 'after:' + interval;

  const threads = GmailApp.search(query);
  const messages = GmailApp.getMessagesForThreads(threads);
  for (const i in messages) {
    const lastNo = messages[i].length - 1;
    const subject = messages[i][lastNo].getSubject();
    const body = messages[i][lastNo].getPlainBody();

    GmailApp.sendEmail(FORWARD_MAIL_ADDRESS, subject, body);
  }
}
```

コードの流れは読めばわかるかと思います。

肝は `query` で定義される Gmail 検索キーワードでしょうか。
未読で、転送元メールアドレスでない、実行間隔内に届いたメールが対象となります。

GAS は実行の間隔として定義できるので、その間隔時間[分]を `FIRE_INTERVAL_MINUTES` で定義してあげてください。

### 2. GAS プロジェクトのデプロイ
トリガーを宣言します。

- 実行する関数を選択

→ `forward` を選択

- 時間ベースのトリガーのタイプを選択

→ 「分ベースのタイマー」を選択

- 時間の間隔を選択（分）

→ 「1分おき」を選択（しました、私は。）

※GASの実行回数や実行時間には制限があります。詳しくは [Google サービスの割り当て - 現在の制限](https://developers.google.com/apps-script/guides/services/quotas#current_limitations) をご参照ください。

### おまけ
私はメール通知を受け取るためだけにメーラーを常時バックグラウンド起動しておきたくありません。「 Slack で」スケジュールやメールも管理したい主義でいます。

ので、私は「**[Slack へのメールの転送](https://slack.com/intl/ja-jp/help/articles/206819278-Slack-%E3%81%AB%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B#h_01F4WE06MBF06BBHQNZ1G0H2K5)**」機能を利用し Slackbot 転送先メールアドレスを発行、発行したメールアドレスを `FORWARD_MAIL_ADDRESS` に設定しています。
Slack を最大限を活用するアイデアとして、来週は「Slackとカレンダーアプリを連携して生産性が爆上げ」を執筆予定です。
AtCoder Beginner Contest 278 A問題とB問題をPythonで解いてみました

ABC278(AtCoder Beginners Contest 278)
A問題とB問題をPythonで解いてみました。
- コードは雑めです。ゆるしてー
- 競技プログラミングの勉強一切したこと無いので、テクニックは知らないよ。ごめんねー

## A問題(diff=17)
[提出コード](https://atcoder.jp/contests/abc278/submissions/36621193)
```python
n, k = map(int,input().split())
a = list(map(int,input().split()))
k = min(n,k)
print(" ".join(str(n) for n in a[k:]+[0]*k))
```

## B問題(diff=123)
[提出コード](https://atcoder.jp/contests/abc278/submissions/36661116)
```python
h, m = map(int,input().split())
 
def misread(h,m):
    b = h%10
    h2 = (h-b) + (m//10)
    m2 = b*10 + (m%10)
    if h2<24 and m2<60:     # 入れ替えても時間として正しい場合
        return True         # 見間違えやすい値として返す
    return False
 
def next(h,m):
    m+=1
    if m>59:
        h+=1
        m=0
        if h>23:
            h=0
    return h,m
 
while not misread(h,m):
    h,m = next(h,m)
 
print(f"{h} {m}")
```

### B補足
質問のとこ、私もミスりました
質問してくれた人ナイス
https://atcoder.jp/contests/abc278/clarifications
```
0時0分や2時20分のように，題意の数字を入れ換えたときにもとの時刻と同じになる時刻は，見間違えやすい時刻に入りますか？
```
これ考慮してプログラムしちゃった

## 追記
初心者代表さんが[PythonでAtCoderを解くときにちょっと得するメモ](https://qiita.com/T_death/items/c415728b309173c2521f)にちょっとしたテクニックを書いてくれました！  
緑の人を初心者と言って良いのかはさておき...  
便利！あざす！
PythonでCloudStorageにあるCSVファイルをDataFrameで読み込む

## 何をするのか

GCPのCloudStorageにあるcsvファイルをPythonプログラムから読み込み，pandasのDataFrameに格納します．

## 前提条件

* CloudStorageにcsvデータが格納されている
* [認証（サービスアカウント）の設定が完了している](https://cloud.google.com/docs/authentication/getting-started)
* 必要なPythonライブラリがインストールされている

### CloudStorageに格納しているcsvファイル

今回は，愛知県・岐阜県・三重県の人口データが入っているcsvファイルを，サンプルとしてCloud Storageに格納しています．

```
id,prefecture,population
1,Aichi,7497521
2,Gifu,1945350
3,Mie,1759711
```

### 必要なライブラリをインストール

`requirements.txt` を用意して，以下のライブラリをインストールします．

```requirements.txt
pandas
google-cloud-storage
```

```
pip install -r requirements.txt
```

## プログラム

以下，CloudStorageにあるcsvファイルをDataFrameに格納するプログラムです．

今回，ファイル名は `sample.csv` でCloudStorageに格納しています．

```python
import pandas as pd
from google.cloud import storage
from io import BytesIO

def fetch_csv():
    client = storage.Client()

    # Cloud Storageのバケットを定義
    bucket = client.get_bucket('{YOUR_BUCKET_NAME}')

    # csvファイルのパスを定義する
    blob = bucket.blob('sample.csv')

    # ファイルのデータを取得
    content = blob.download_as_bytes() 

    # バイトデータからpandasに変換
    stop_times_df = pd.read_csv(BytesIO(content))

    print(stop_times_df)

if __name__ == '__main__':
    fetch_csv()

```

出力結果は下記のとおりです．

```
   id prefecture  population
0   1      Aichi     7497521
1   2       Gifu     1945350
2   3        Mie     1759711
```

csvファイルの `id` をindexに指定したい場合は， `read_csv` でindexを設定してください．

```python
# バイトデータからpandasに変換
stop_times_pd = pd.read_csv(BytesIO(content), index_col=0)
```

```
   prefecture  population
id                       
1       Aichi     7497521
2        Gifu     1945350
3         Mie     1759711
```
macOSをVenturaにしたらSSHでリモートホストに接続できなくなって結構無駄な時間を過ごした話

# はじめに

これまで32bitアプリケーションを使うためにずっとMojave(10.14)からバージョンアップしてこなかったMacBook Proでしたが、どうしても使わないといけないソフトがありVentura(13.0)にしてみました。

すると、意外とサクサク動いて、これはこれで良いかなって思っていたら落とし穴が...

# SSHで接続失敗する

公開鍵認証を使ってログインしていたサーバーに突然SSHでログインができなくなりました。
表示は以下のとおり。

```
$ ssh [user名]@[host名]
[user名]@[host名]: Permission denied (publickey).
```

...え？！えぇ〜〜！！

確認してみると、公開鍵認証を利用したサーバーだけにアクセスができなくなっている模様。

そして、そういう時に限って該当サーバーに不具合が...

# 解決策

.sshフォルダーにconfigというファイルを作成して、以下の文字列を追記することで解決。

```.ssh/config
Host *
        HostkeyAlgorithms +ssh-rsa
        PubkeyAcceptedAlgorithms +ssh-rsa
```

[参考URL]
https://superuser.com/questions/1749364/git-ssh-permission-denied-in-macos-13-ventura

わかってしまえば簡単ですが、めちゃくちゃ焦ったし、めちゃくちゃ無駄な時間を過ごしました。

...とりあえずできるようになって良かったです。
find()で識別子が長すぎる場合の対処法

## 環境
PHP：7.4
cakePHP：4.2
DB：Oracle Database
## 概要
cakephpのfindメソッドでデータ取得する際、「ORA-00972:識別子が長すぎます」のエラーが表示され、はまってしまうことが多くありました。
その際の対処法を記載します。
##エラーの理由
バージョン12.2より前のOracle Databaseでは、表名、列名、主キー名などの識別子名が30文字に制限されているそうです。
エラーの通り、識別子が30文字以上あるため、データが取得できませんでした。

https://docs.oracle.com/cd/F37623_01/odpnt/EFCoreIdentifier.html#GUID-FA43F1A1-EDA2-462F-8844-45D49EF67607
## 対処法
### select()で識別子を指定する
```index.php
$query = $player->find()
                ->select([
                    'SOCCERPLAYER_NAME' => 'PLAYER.SOCCERPLAYER_NAME'
                ]);
```
### find('list')で取得する場合
selectメソッドでカラム名と同じ識別子にするとエラーになります。

```index.php
$query = $player->find('list', [
             'keyField' => 'id',
             'valueField' => 'name'
         ])->select([
             'id' => 'PLAYER.SOCCERPLAYER_id'
             'name' => 'PLAYER.SOCCERPLAYER_NAME'
         ]);

$data = $query->toArray();
```
[AWS IAM] EC2インスタンスからS3にアクセスする

## 前提

- group has many users
- user, groupe, role has many identity-based policies
- role is assumed by user, group, service (e.g. ec2).
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/19d3c468-c418-5d97-b919-c27ac71e163b.png)

policyには2種類ある。

- identity-based policy
    - VO
- resource-based policy
    - SVOでOに貼り付けられる。
    - 多分 S=principalに設定できるのはrole, user, group。EC2インスタンスのARNは設定できなさそう？
    - e.g. S3 bucket policy






## Roleについて


(1) roleの作成
(2) roleの貼り付け


<details>
<summary>スクショ: trust relationshop の作成</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/319690aa-7601-f043-9fe6-8d1b83b41ada.png)

なお、EC2に assume roleを許可するtrust relationのことを、IAM instance profile と呼ぶ。

</details>


<details>
<summary>スクショ: roleの貼り付け</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/56d51875-b74a-c44c-84f0-923a9b243202.png)

</details>


## EC2からS3のバケットのリストを取得する

以下の手順で行う。
1. S3へのreadアクセス権限を持つIAM role 🟢を作成する 
1. そのIAM roleをEC2に貼り付ける
    1. そもそもroleがEC2に貼り付けられていないと、awsコマンドにcredentialが設定されなさそう？
1. EC2 -> S3へのネットワーク通信を可能にする。いずれか
    1. EC2をpublic subnet内に置く = EC2を含むVPCにInternet Gatewayを作成し、デフォルトルートとして設定する。
    1. EC2からNAT経由で外部インターネットへのアクセスを可能にする。
    1. EC2からS3へのアクセスを Gateway VPC endpoint経由で可能にする。

⚠️ 取得したいのはS3のバケットのリストであるため、バケットポリシーの設定は不要。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/7221e0f4-ab39-21f4-94e4-44d7680b89a4.png)


<details>
<summary>スクショ: S3へのreadアクセス権限を持つIAM role🟢</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/236a15b9-0db3-8b28-cd06-3ce45b37b603.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/e63a25ce-ec3d-4c13-4af9-2396c4046f4e.png)


</details>




### EC2からS3の `my_bucket` 内のオブジェクトのをリストを取得する

1. S3へのアクセス権限🟥を持つIAM roleを作成する
1. そのIAM roleをEC2に貼り付ける
1. EC2 -> S3へのネットワーク通信を可能にする。いずれか
    - EC2をpublic subnet内に置く = EC2を含むVPCにInternet Gatewayを作成し、デフォルトルートとして設定する。
    - EC2からNAT経由で外部インターネットへのアクセスを可能にする。
    - EC2からS3へのアクセスを Gateway VPC endpoint経由で可能にする。
1. S3のバケットポリシー🟦を設定し、上記のroleからのアクセスをallowする。
    - S3のバケットポリシーはデフォルトでは全拒否となっている
    - おそらくバケットポリシーのPrincipalとしてroleではなくEC2インスタンスのARNを指定することはできなさそう。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/cf325eb7-58dd-e718-2ad3-9da5c0b5a7b3.png)

<details>
<summary>スクショ: バケット内オブジェクトのリストを許可するバケットポリシー🟦</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/88983657-38e1-bbcc-649f-e64d98752ba3.png)

</details>


なお、🟥 🟦のどちらかがあればバケット内のリスト取得のアクションは可能であることを実験で確かめた。

(roleにs3 read accessが含まれる, bucket policyでroleにS3:ListBucketをallow) = 
- (true, true) -> 取れる
- (true, false) -> 取れる
- (false, true) -> 取れる
- (false, false) -> 取れない


## その他

- 前述のroleを貼り付けられたEC2インスタンスは、STSから6時間ごとにcredentialを取得する。このcredentialはインスタンスのメタデータとして保存される。

## Ref.

- https://tech-dive.xyz/2018/12/24/post-1181/#toc7
- https://dev.classmethod.jp/articles/aws-cli-commands-ec2-credentials-error/
- https://www.youtube.com/watch?v=YYtvL459uWY
Lenovo Thikpad T480 Linuxの開発環境セットアップメモ



# 所要時間
30~40分


# 開発環境
Thikpad T480
US配列キーボード


# BIOS

bios config -> keyborad -> fn swap ctrl（fnキーとctrlキーを入れ替え）
bios config -> keyborad -> disabling Hotkey Mode (fnキーをデフォルト化）


# LINUX


CapsとCtrlを入れ替え

```:/etc/defalt/keyboard
XKBOPTIONS="ctrl:swapcaps"
```
ログアウトして反映

キーボードのキー入力の速度とリピート間隔を設定
```
リピート間隔220
リピート速度40
```


システム更新

```
sudo apt -y update
sudo apt -y upgrade
sudo apt  dist-upgrade
sudo apt  autoremove
sudo apt autoclean
reboot 
```

タイムゾーン変更

```
sudo timedatectl set-timezone Asia/Tokyo
```

日本語の言語サポートインストール

```
sudo apt -y update
sudo apt -y install language-selector-common
sudo apt -y install $(check-language-support)
```

ディレクトリを英語表記

```
sudo apt -y update
sudo apt -y install xdg-user-dirs-gtk 
LANG=C LC_ALL=C xdg-user-dirs-gtk-update
```

日本語入力機能

```
sudo apt -y update
sudo apt -y install fcitx-mozc
im-config -n fcitx
```

不要な入力機能を削除

```
sudo apt -y update
sudo apt -y install zenity
sudo apt remove -y ibus-mozc
sudo apt remove -y ibus-table
sudo apt remove -y ibus-gtk
sudo apt remove -y ibus-gtk3
sudo apt remove -y ibus-gtk4
sudo apt remove -y ibus-data
sudo apt remove -y ibus
```


パッケージインストール

```
sudo apt install zsh vim-gtk git tmux redshift
```
ただのvimだとclipboardに対応していないためgtk版やgnome版をつかう


シェルを変更

```:zshのパスを取得
which zsh
```

```:ユーザのシェル変更
chsh

あなた のログインシェルを変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
	ログインシェル [/usr/bin/zsh]: 

```

```:rootのシェル変更
sudo passwd root # まずrootパスワードが未設定なら設定する
su -
chsh 
```

```:直接/etc/passwdを編集してシェルを変更
sudo vi /etc/passwd

...
...

root:xxxxxxxx/root:/usr/bin/zsh
yourname:xxxxx:/home/yourname:/usr/bin/zsh
```

Brave（ブラウザ）
https://brave.com/
同期コードを使って同期


GitクローンしてDotファイルを同期させる


VisualStudioCodeをインストール
https://code.visualstudio.com/

Cascadia Code（フォント）
https://github.com/microsoft/cascadia-code

フォントサイズ
```
システム: 13
アプリ: 18
```

redshift（ブルーライトフィルター)
```~/.config/redshift.conf
  1 ; Global settings for redshift                                                                  
  2 [redshift]
  3 temp-day=5000
  4 temp-night=4500
  5 fade=1
  6 gamma=1.0
  7 brightness=0.6
  8 location-provider=manual
  9 adjustment-method=randr
 10 [manual]
 11 lat=35.6
 12 lon=139.6
 13 [randr]
 14 screen=0
```
DDDがわからない～条件メモ～

# 条件を把握すためのメモ
本来は人が、何を判断するかを決めます。しかし、携帯会社の料金割引プランのように組織内で使いまわす条件は条件メモとして用意してみんなで共有する方がよいでしょう。

例: 
年齢が20歳未満(若者割条件メモ)
年齢が35歳以上・利用年数が10以上(ご愛顧割引条件メモ)
年齢が65歳以上・男性(爺割条件メモ)

# 条件は組み合わせる
条件は組み合わせて使うことが多いです。なので、条件メモと条件メモを組み合わせて**新しい条件メモ**を作れるようにしましょう。
組み合わせるときには、条件Aと条件Bのどちらも一致する場合、条件Aと条件Bのいずれか一致する場合という所謂ANDとORどっちにも対応できるようにしましょう。
また、便利なので条件が一致しない場合を作り出すNotのようなものを作っておくとさらに便利です。
【簡単】MacでWebサーバーを構築し、hello worldを表示する。

対象：Macが手元にある。Terminalで基本的なコマンドが理解できているかた。

## 下準備①Apach起動
最近のMacにはWebサーバー(ミドルウェア)が初めから入っている場合が多い。
Terminalで以下のコマンドを押下してみる。

```bash:webサーバーの起動
sudo /usr/sbin/apachectl start
```
＊sudoで管理者権限で実行。PCログインのPasswordを求められる。
ブラウザのURLにlocalhostと入力しEnterを押下すると、It Works!の画面が出ることを確認。
もし、上記のコマンドが使えなければApacheがMacに入っていない可能性があるため、ここで終了または、要インストール。


## 下準備② 設定ファイルの確認
```bash:設定ファイルの中身をcatコマンドで確認
sudo cat /etc/apache2/httpd.conf
```
Finder(GUI)から、
Macintosh HD>etc/apache2/ で見ても良い。
*1 apache2は2022時点。今後versionが上がる可能性がある。
*2 Finderではetcは隠しファイルである。
　(Shift+Command+.で隠しファイル表示)

設定ファイルのDocumentRootの文字列を検索。
通常は
DocumentRoot "/Library/WebServer/Documents"
と記載されており、htmlファイルをどこに入れれば反映されるのかが分かる。

## htmlファイルの用意
viエディタで以下のファイルを作成
```shell:hello.html
sudo vi /Library/WebServer/Documents/hello.html
```
Insert-modeでhello worldと記述、保存。

または、
Finder(GUI)から、Macintosh > Library > WebServer > Documents
を開き、以下のファイルを作成。

```html:hello.html
hello world
```

## hello worldを確認
ブラウザのURLにlocalhost/hello.htmlと入力しEnterを押下すると、
hello worldの画面が出ることを確認。
確認ができたらApachは止めておく。
```bash:webサーバーの停止
sudo /usr/sbin/apachectl stop
```
以上
React+Socket.ioの画面からCelery経由でPythonプログラムを呼び出すやつ

探しても見つからなかったので自分で書いた。

https://github.com/cress-cc/react-socketio-celery-example

# 起動方法

## Reactクライアント

```powershell:
cd client
npm install
npm start
```

## Socket.ioサーバー

```powershell:
cd server
npm install
node index.js
```

## Pythonプログラム

Windows環境だと `-P solo` を付けないと動かないので注意。あと、CeleryはWindowsを正式にはサポートしていないので、あくまでもテスト用とすること。

```powershell:
cd worker
pip install -r requirements.txt
celery -A tasks worker -P solo
```

# どこが素晴らしいのか

Node.jsのサーバーからPythonプログラムを非同期で呼ぶようにすることで、Flask-SocketIOでゴリゴリ書くよりもシンプルかつコンパクトになる。たとえば、Pythonで書かれた機械学習のプログラムを呼び出したりなんかしても面白い。というか、まさにそれ用に作った。

# その他

## テスト用にRedisを無料で使いたい場合

RedisLabsで無料版あり。クレジットカードの登録等も不要。

https://redis.com/
【Mac】.DS_Storeの一括削除コマンドの作成

# はじめに
MacのFinderにてフォルダの操作を行なっていると、
自動で「.DS_Store」が作成されるが開発時に意外と邪魔になる。。。

リポジトリの管理的には基本的にgitignoreしておけばよいが、
ディレクトごとファイルのアップロードや同期などを行う時などには、予期せず.DS_Storeが紛れてしまったりすることがあったりする

サクッと一括削除しておきたいので、シェルに削除コマンドを作成しておく


# .DS_Storeとは
Macでフォルダやファイルの操作を行なった際に、自動生成されるメタデータを格納したもの

Finderでフォルダをパカパカ開いた際に状態を保持してくれてたりするやつ（多分）
![スクリーンショット 2022-11-20 13.07.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122907/8e5126d1-cba6-55e0-8909-4f44267e30b6.png)

Finder上で隠しファイルを表示するようにしていても、Mac上では「.DS_Store」は表示されずに目視できないので、フォルダごとアップロードなどした際に忘れていて.DS_Storeが紛れてしまうことがあり厄介

# 動作環境
- OS：macOS Monterey
- shell：zsh

# .DS_Storeを作らなくする
```
% defaults write com.apple.desktopservices DSDontWriteNetworkStores true
```

これで作成されないようになるらしいが、自分の環境だと変化なし。。。

# .DS_Store一括削除コマンド

## カレントディレクトリ以下の.DS_Store一覧表示
```
% find . -name ".DS_Store" -ls
```

## カレントディレクトリ以下の.DS_Storeを一括削除
```
% find . -name ".DS_Store" -ls -delete
```
（`-ls`で一応何が削除されたのか一覧も表示）

# コマンドのエイリアスを登録
毎回上記コマンドを入力したりコピペするのも面倒なので、コマンドをエイリアスで登録しておく

`.zshrc`を編集
```
% vi ~/.zshrc
```
`.zshrc`にエイリアスを追記する
```:.zshrc
・
・
・
# 以下追記
alias dsfind='find . -name ".DS_Store" -ls'
alias dsdel='find . -name ".DS_Store"　-ls -delete'

```
（エイリアス名はお好みで）

`.zshrc`再読み込み
```
% source ~/.zshrc
```

# コマンド実行
シェルにて`dsfind`、`dsdel`のコマンドを叩けば、「.DS_Store」の一覧表示と一括削除がサクッと可能

```
# カレントディレクトリ以下の.DS_Store一覧表示
% dsfind

#　カレントディレクトリ以下の.DS_Storeを一括削除
% dsdel
```


# さいごに
基本的にgitignoreに記載しておいたり、
ファイルのアップロードや同期系のコマンドで`–exclude`系のオプションがある場合は、こちらにも記述しておくのが安全ですね（めんどくさい:confounded:）
Windowsでファイルを連番付きで大量にコピーしたい

# やりたいこと
コマンドラインを一切使わずに（ここが重要）、スクリプトファイルをダブルクリックするとカレントディレクトリのファイルに連番をつけてコピーされるようにしたい。ユーザーはスクリプトファイル自体を（メモ帳などで）書き換えられることを想定する。環境はWindows。

# 使い方
インストールするものを極力減らしたいので、Windowsのバッチファイルを採用する。以下を書き込んだファイルをコピーしたいファイルがあるディレクトリにコピーして、ファイル名と番号を書き換えて保存し、ダブルクリックするだけ。

# コード
```copy_with_serial_number.bat
@echo off

setlocal enabledelayedexpansion

for /l %%i in (1, 1, 100) do (
    set formatted_num=0000%%i
    set formatted_num=!formatted_num:~-4!
    copy test.tif test_!formatted_num!.tif
)

endlocal
```

# ひっかかったポイント
ほぼ初めてバッチファイルを作ったので、ありとあらゆる段階でひっかかった。この言語、ひいき目に見てく（以下、略）。ただし、フォーマット構文はシンプルで素敵。

## for文のかっこ
```
for /l %%i in (1, 1, 100) do (
    rem 処理したい内容
)
```
のところで、「()」を「{}」にしてしまった。あと、コメント行の「rem」ってなんやねん。

## for文の中でローカル変数を変更したい時には
```
setlocal enabledelayedexpansion

rem ここに本文

endlocal
```
のように記述しなければいけない。「enebledelayedexpansion」っておまじない、おまじないすぎるやろ！笑 あと、変数の参照は普段は「%変数名%」だけど、ローカル変数を参照するときには「!変数名!」としなければいけない。
改・【図解】プロセス・スレッドについてまとめ

以前[こちらの記事](https://qiita.com/Amby/items/66073b2df242c3bd6558)を書きましたが、追加・修正すべき情報がありましたので、こちらの記事を書いています。

以前の記事で、「CPUでは1つのコアにつき、1つのスレッドしか処理できません。」と書きましたが、これは誤りでした。
1つのコアでも2つ以上のスレッドを処理できる場合があります。それを実現する技術が**同時マルチスレッディング**です。
同時マルチスレッディング登場以前のコアだと1つのスレッドしか処理できないため、コアに余力がある場合が多く、非効率でした。
同時マルチスレッディングではその余力を利用して1つのコアで2つ以上のスレッドを処理できるようにしました。

以前の記事に載せた図を修正すると以下のようになると思います。
![プロセスとスレッド (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345720/1bdf5419-b9e9-d2ad-5e9d-c6e9763ad3b6.png)
よく、CPUの種類で4コア/８スレッドのような表記がありますが、これはCPUのコアが4つで、この4つで同時に処理できるスレッド数が8つという意味なんですね。もし１コアにつき１スレッドしか処理できなかったら4コア/4スレッドなので、それよりも処理能力が高いと言えます。

コア数とスレッド数が多ければ多いほど、CPUの処理能力は高いと考えておけば良いと思います。
良いコードを書くための学習サイト

# 参考動画

https://www.youtube.com/watch?v=Dta1huW2CSE&t=604s

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

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

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

https://www.youtube.com/watch?v=WDsa-SjMldM

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

https://www.youtube.com/watch?v=GjbWHLB5zMA&t=1s

# 参考サイト

https://qiita.com/taku_maru/items/4d1a5625d91edd0a0b77

https://qiita.com/mokio/items/bf5b598136ada1728156

https://qiita.com/mingchun_zhao/items/407b73279e268a9ed871

https://zenn.dev/qnighy/articles/b39ff132777758

https://qiita.com/hiraike32/items/f0a211cceb0ecc516b6c

https://qiita.com/SocVioEn_yuki/items/761beb16514d3a4baf87

https://qiita.com/SocVioEn_yuki/items/47c8c6833dfe23d15c45

https://qiita.com/SocVioEn_yuki/items/4de4da84d760025f6b1b


https://zenn.dev/nameless_sn/articles/point_mino_techbook


https://zenn.dev/hinoshin/articles/80391c94a0b1a7


https://zenn.dev/hinoshin/articles/7441768c5bb921


https://zenn.dev/hinoshin/articles/4e8af6217a0daf

https://zenn.dev/ishiyama/articles/a0c5a7504b856f

https://zenn.dev/nameless_sn/articles/watched_japanese_documents

https://qiita.com/ouauai/items/d38eeef9f0af5a4a87da

https://logmi.jp/tech/articles/328023

https://zenn.dev/offers/articles/20230110-my_code_review_knowhow
【Ruby】Adobe Acrobat Reader DC印刷コマンド実行の注意点

## Rubyで印刷する
RubyではKernelモジュールのお陰でRubyファイル上からでもコマンドプロンプトが叩けるようになっている。
```ruby
# プロセス完了まで待つコマンド実行
process1 = system "dir"
# プロセス実行が完了したらRubyのプロセスに戻る
process2 = spawn "dir"
```
印刷する場合はAdobe Acrobat Reader DCのシステムコールを使用して実行すれば良い
```batchfile
"(exeまでのパス)\AcroRd32.exe" /s /l /h /t "(PDFファイルのフルパス)" "(プリンタ名)"
```
※64bit版はAcrobat.exe
※オプションの意味は本題とずれるのでググってくれ！


## 本題
上記方法を使用すれば印刷はできるが、`system`と`spawn`のどちらを使用すべきかと言われたら迷わず`spawn`をお勧めする。

印刷の自動化が要求される場面は、昔ながらの書類管理をしている業務の自動化くらいだろう。
そういう現場でよくあるのが、印刷プロセスのスタックである。

ワイがRPA案件で参加していた会社では受発注システムへの注文登録後、注文書を印刷をすることが義務付けられていた。
そこで発生したのは印刷プロセス実行時のネットワークの一時的な断絶、そして大量の印刷プロセスがあることによるRuby側のスタックである。
当時は`system`を使用していたことにより、印刷が成功したというプロセスが返ってくるまでRuby側がスタックしてしまう現象が発生していた。

`spawn`を使用すればRuby側の実行とコマンドプロンプト側の実行を別個にできるので、Rubyのスタックは発生しない。

もし実行完了までのタイムアウト時間が欲しいのであれば、`Thread`を使用するか、1秒ごとに印刷プロセスを監視する処理を作成すれば良い。

個人的な感覚としては、`system`はサーバ内で完結する処理で使用し、`spawn`は外部接続関連の処理で使用するのが良い印象。

## まとめ
- Rubyで印刷コマンドを実行する場合は`spawn`を使用する。
- 印刷プロセスはスタックしやすい。
- `system`はサーバ内で完結する処理で使用する。
- `spawn`は外部接続関連の処理で使用する。

保守って辛いよな、兄弟。
Salesforce認定Platformアプリケーションビルダー試験の公式サンプル問題解説してみた-10

こんにちは

Salesforce認定Platformアプリケーションビルダー試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

https://trailhead.salesforce.com/ja/content/learn/modules/platform-app-builder-pt1/platform-app-builder-security-ui


今回は

Platform アプリケーションビルダー試験に向けた学習
認定 Platform アプリケーションビルダー資格の受験準備: Data Modeling and App Deployment (データモデリングとアプリケーションリリース)
データのモデリングと管理の学習

にある問題2問目をご紹介します

なお今回の内容は動画でも公開しております

https://www.youtube.com/watch?v=8vvrlYItA7A


![bug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6266f3cb-af7e-3dcb-8b72-9dba99517bde.png)


正解はDです


今回の内容は
Bugというカスタムオブジェクトがあり
「ケースに複数のBugを関連づけたい」
「Bugに複数のケースを関連づけたい」
という話になります

多対多のリレーションを作成して連結すれば対応可能です

詳細は以下のリンクからご確認ください
https://help.salesforce.com/apex/HTViewHelpDoc?id=sf.relationships_manytomany.htm&language=ja
【C言語】void型- 何も無いことを意味するってどういうこと？

# はじめに
コードを書いているとよく出てくるvoid型。
意味を調べると「何もない」ことを意味するデータ型と出てくる。
率直に思った感想、「何もないってどういうこと？」です。
まだまだプログラミング初心者な私は型の本質が理解できていないのかも。
ということで深掘ってみました。

#  Voidの 『何もない』 を解説
__何もない=型がない__
int型やfloat型が１~100などの数ある数値だとすると、void型は0である。
0の為、返す必要がないのである。

__voidは関数の引数と戻り値のデータ型としてよく使われる。__
関数のは４通り考えられる
引数あり、戻り値あり
引数あり、戻り値なし
引数なし、戻り値あり
★引数なし、戻り値なし　＝何もない

voidは4つ目のどちらもない時のデータ型として使われる。


本来の関数
```
【戻り値】 【関数の名前】(【引数】){
　　【処理の内容】
}
```

voidの場合
```
(優しめ)
【なし】 【関数の名前】(【なし】)
{
}

(こうなる)
【void】 【関数の名前】(void)
{
//return文は不要だよ！
}
```

## 型についてまとめた記事
https://qiita.com/hanatan079/items/fe1de7bd542719a62570

https://qiita.com/hanatan079/items/36386ae4335bb0b06c88
Leetcode 154. Find Minimum in Rotated Sorted Array II

# 154. Find Minimum in Rotated Sorted Array II

https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/description/

## アプローチ
### 1. 二分探索
```java
class Solution {
    public int findMin(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }

        int start = 0;
        int end = nums.length - 1;

        if (nums[start] < nums[end]) {
            return nums[start];
        }

        while (start < end) {// not putting <= because the array contains unique elements

            int mid = start + (end - start) / 2;

            if (nums[mid] < nums[end]) {
                end = mid;
                // end を利用
            } else if ( nums[mid] > nums[end] ) {
                // right side is rotated, expecting smallest number between mid + 1 <=  end;
                // 5 6 7 8 9 1 2 3
                start = mid + 1;
            } else {
                // reduce duplicate
                // 5 6 7 8 9 1 1 3
                end--;
            }
        }
        return nums[end];
    }
}
```

### 2. ソート
```java
class Solution {
    public int findMin(int[] nums) {
        Arrays.sort(nums);
        return nums[0];
    }
}
```

### 3. 全体探索
```java
class Solution {
    public int findMin(int[] nums) {
        int min = Integer.MAX_VALUE;
        for (int num : nums) {
            if (num < min)
                min = num;
        }
        return min;
    }
}
```
事業会社で働くプロジェクトマネージャーにオススメな取り組み

## 初めに
エムスリーキャリア FY22 AdventCalendarの初日は、近藤（@atkondo）が記載させて頂きます。
内容としては、「事業会社で働くプロジェクトマネージャーにオススメな取り組み」とさせて頂きました。
同じような立場で働く方々への参考になればと思います。ご質問やご意見あれば頂ければと思います。

私は22年4月中途入社で入社後1年半年経過しています。
当社のご説明を差し上げておくとエムスリーグループの一社として、医療従事者（主に医師、薬剤師）の方向けの人材紹介・派遣事業を中心に、近年では、経営支援・採用支援、産業保健・健康経営の事業を行っています。

当社の社員は600名強で、エンジニア部門には50名のエンジニアが所属しています。私は複数のプロジェクトを取りまとめるプロジェクトマネージャーを努めています。

事業会社でのエンジニアとしては、「医療従者向けのtoC領域システム」、「医療機関向けtoB領域のシステム」、「キャリコンサルタント・営業向けのSFA/CRM」の開発を担っています。



## エンジニア組織を率いて行く上での取り組み　〜ミッション、存在意義共有会

当社では、「ミッション、存在意義」を会社全体、部門で定めています。私が所属していますエンジニア部門では、「技術力を持って誠実に会社の事業の成長を支える」という内容となっています。

事業会社で、エンジア部門はともすれば、間接部門として、会社全体の目線から距離が空きがちになりえるかと思えます。リーダーがチームメンバーに伝えるだけでは無く、一緒に考えてみることで、自分ごととして考えることが可能です。

そういった意味で、「共有会」という取り組みがお薦めです。共有会というのは、リーダーが4〜7名程度のメンバーと開催します。先ずはリーダーがミッション、存在意義について、自分の行動がどう結びついているかを説明します。続いて、メンバーがそれぞれ同様に自分の行動を振り返ります。

この試みはクオーターごとに取り組んでいます。
振り返りをチーム内でシェアすることで、リーダー、メンバーそれぞれが大切にしている価値観も共有できるのが優れた試みだと考えています。


## 事業に関する関わり方　〜戦略パッケージ、数値の読み合わせ

事業会社のエンジニア部門に求められていることは当然ながら「事業成績に貢献する」ことととなります。
当社の場合では2つの試みを行っています。

1つは、戦略パッケージ、と呼んでいる事業計画です。
これは年次で予算とともに事業部門ごとに策定しています。エンジニア部門でも策定しています。
これは特定のフォーマットで、「DMU」、「重み」、「差」を整理した上で、重要施策等をまとめています。
エンジニアとして、一年間という長いスパンで、自分たちのお客様　・　現場に対しての当社の施策が何であるか、振り返り、戻るべきドキュメンテーションとして有効に働いていると思います。

もう1つが、数値の読み合わせ、です。
自分たちの施策の実現として開発したシステムがどう施策結果として、事業の数値に貢献できているのか？
施策と事業数値の関係は分かりやすいものばかりではありませんが、週一程度、関係者で数値の読み合わせを行うことはお薦めです。
当社のエンジニア部門では、さまざまな形で実施しています。
リーダー陣を集めた定例、事業部門の定例に分担して参加した結果をフィードバックするMTG等、です。
　
事業に対する理解度は問わず、参加者が自由に、質問、仮説をぶつけてみることで、エンジニアの事業に対する理解度は昨年と比べても大きく変わったところだと感じています。

　　　

## エンジニアとしての解を出して行く　〜開発ロードマップ

エンジニアとしては、技術で課題を解いて行くということが求められています。
その中で、日常の依頼業務に埋没されて、細かなPDCAでの改善案件、テクニカルサポート、運用等に埋没してしまうような起こりがちではありませんでしょうか？

1つの解決策として、チーム/担当事業ごとの開発　ロードマップ　の策定がお薦めです。
施策自体はサービスロードマップからピックアップし易いですが、新しい技術の導入 / 技術的負債の返済についてはエンジニアから提案を行い、事業上のサービス展開とタイミングを調整して行く必要があることが多いと思います。

トレンド、テーマを見定めて、技術的に新しいことに取り組む上では、エンジニア部門の役割だと考えています。今期だと以下のような取り組みを実施しています。

- Ruby,Ruby on Railsのバージョンアップ
- オンプレ　→ AWS移行
　- ElasticSearch → OpenSearchへの移行
　- Flutterアプリケーション再構築
- LINE公式アカウントの開催、LIFFアプリケーションの再構築
- LPOアーキテクチャの見直し
　- Vue.js+Ruby on Rails　→ Figma＋Vue.js＋Amplify
- データの持ち方の見直しやマイクロサービス化の検討
- MAツールとしてMarketoの活用見直し
等

エンジニアとしても新しい技術への取り組みの機会を増やして行くということもプロジェクトマネージャーの大きな仕事と考えています。



## チームマネージメントとしての新しいチャレンジの場作り　〜公募制度

　メンバーに新しい活躍の場を持ってもらう、挑戦する場を持ち続ける　ということが、チームマネージメントの上で大切なことだと考えています。

当社では、概ね5-7名程度で開発チームを構成しており、10チームの編成となっています。
このチームのサイズでは新しいことに取り組むとしても難しいところがあったりします。

そこで、横串で　課題に取り組む　お薦めが、公募制度　、です。
特定のプロジェクトのメイン担当者を公募により募る形としています。
この上期では1つの新サービス、プロジェクトとして、昨年度はあまり開発を行っていなかった事業で、大きめ新施策を展開することができました。

また、この下期からよりエンジニア主体の制度として、R&Dプロジェクトをスタートさせています


## 最後に
エムスリーキャリアでは、積極的にエンジニアを採用しています。
カジュアル面談も行っていますので、是非、関心を持って頂きました方お話しさせて下さい。

- toC,toBシステムを担当する、Webアプリケーションエンジニア、
- SFA&CRMの開発を手掛ける、社内システムエンジニア、
- QAエンジニア

https://career.m3career.com/midcareer/engineer
【プログラミング基礎】型の本質をつかもう

（大前提）
プログラミングは、見やすくスッキリさせよう
プログラミングは機械脳である

(型とは)
関数の定義や宣言などを記述する際に、引数や戻り値を明示するキーワードとし型名を記載する

（なぜ型を使うのか）
例えば、１＋２＝３の計算をしたいのか、1＋２＝１２の文字を並べたいのか。１＋２＝の記述だけでは上手く読み取れず間違った答えが返ってくることがある。
そこで『 この変数にはこの種類のデータを格納する 』という型で知らせることで、正しい答えを受け取ることが出来るようになる。

また、あらかじめ格納するデータの種類を宣言する事で想定外の形式のデータが登録されないようにすることが出来る。


(データ型の種類（一例）)
文字列型
文字や文字列を表すデータ型

数値型
整数を表す型と、小数を表す型

日付型／日付時刻型
日付や時刻を表すデータ型

論理型
YESかNOかを表すデータ型

バイナリ型
ファイルのデータや画像データなどを表すデータ型
配列型
複数のデータを一度に格納出来る配列を表すデータ型

オブジェクト型
ログラムの中で定義されたクラスなどを表すデータ型


(使用する言語)
C言語やJavaは型を使用する。
PHP,Ruby,Python等は型を宣言しなくて良い。
調達計画と実施

# 調達計画・実施
## 調達計画
要件定義を踏まえ、製品やサービスの購入、内部や外部委託によるシステム開発などから```調達方法を選択```。
調達の対象、要求事項、条件などを定義して```調達計画を策定する```。

## 調達の実施（調達の依頼〜契約締結）
### 情報提供依頼書
ベンダ（場合により複数）に対しシステム化の```目的や業務内容を示す、RFI(Request For Information: 提案依頼書)```を示し、```提案書、見積書の提出```を依頼する。

#### システム要求事項策定
```システム化の範囲・必要な機能や性能```などをまとめる。

#### 調達選定基準、提案評価基準の作成
```何を重視するか、評価基準```などをまとめる。

#### 調達先の候補の選定
RFIを配布。```事前に候補企業を絞り込む```こともある。

#### RFP（提案依頼書）の作成と配布・説明
システム対象や提案を求める事柄や調達条件などを明示して、提案書を依頼するために```RFP、RFQ(Request For Quotation: 見積依頼書）を作成・配布して、説明```を行う。

#### 提案書の作成
ベンダ企業は、```RFPを元に提案書を作成```する。また、RFPに記載された作業の範囲に必要な```費用を計算し、見積書を作成```する。

#### 提案書の評価
提案された```開発手法や技術が適切かを分析```。また、見積書から、必要な作業項目が過不足なく含まれているか、```見積金額は妥当かなどを確認```する。

#### 調達先の選定
選定基準に基づいて、```調達先を選定```。

#### 契約締結
選定した調達先の```ベンダ企業と契約を交わす```。

# 調達時の配慮
### CSR(Corporative Sosial Responsibility)調達
相手先（サプライチェーン全体を含む）が社員や外注先の```人権や労働条件に配慮```しているか、```環境への配慮を行っているか```などを評価基準として考慮し、調達先を決めること。

### グリーン調達（購入）
```環境負荷に考慮した製品づくりや部品調達```を行ってるかを評価基準として考慮し、調達先を選定すること。直接の取引先だけでなく、サプライチェーン全体として、```環境負荷を評価する選定基準を共有していくことが重要```となる。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
ターミナル起動時に「N/A: version "N/A -> N/A" is not yet installed.」のエラー

### 概要
zshターミナル起動時に、下記文言のエラーが出たときの対処方法
（デフォルトのnodeバージョンの指定し直し）
（私の場合は、前触れなく急にエラーが発生。。。🥲）

### エラー
```:ターミナル起動時
N/A: version "N/A -> N/A" is not yet installed.

You need to run "nvm install N/A" to install it before using it.
```
この状態だと<font color="red">`node`コマンドが使えない。。。</font>(`command not found: node`)
（指示通り`nvm install N/A`コマンドを実行しても解消せず）

### 対処方法
下記コマンドをターミナルで実行するのみ
```shell:ターミナル
nvm alias default デフォルトで利用したいnodeバージョン
# 例）　nvm alias default v16.18.1
```
※利用するバージョンは`nvm ls`コマンドで確認

### 対処前後の`nvm ls`の状況
```shell-session:対処前
$ nvm ls
       v16.15.0
       v16.17.1
       v16.18.1
default -> lts/* (-> N/A)　　 # ここが N/A になってることでエラーが発生
node -> stable (-> v16.18.1) (default)
stable -> 16.18 (-> v16.18.1) (default)
iojs -> N/A (default)
unstable -> N/A (default)
~以下省略~
```

```shell-session:対処後
$ nvm ls
       v16.15.0
       v16.17.1
       v16.18.1
default -> v16.18.1 # 無事defaultにバージョンが設定された
node -> stable (-> v16.18.1) (default)
stable -> 16.18 (-> v16.18.1) (default)
iojs -> N/A (default)
unstable -> N/A (default)
~以下省略~
```

```diff_shell:変更差分抜粋
- default -> lts/* (-> N/A)
+ default -> v16.18.1
```


### 補足(1)
.zshrcの設定状況
```shell:.zshrc
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # ⇦ここでエラーが出ていた
```

### 補足(2)
`nvm unalias default`というコマンドでも
エラー自体は出なくなるが、
<font color="red">defaultでnodeバージョンが指定されない</font>ので、
「ターミナル起動後に何もせずに、nodeコマンドを使いたい」場合には
向かない様子

### 参考記事
https://qiita.com/yuzooho/items/a5072ade3a0787640ef9

https://qiita.com/hgsgtk/items/de38064fa885f1ffeea3
時系列を分解する(SPSS Modeler データ加工逆引き10-5)

# 時系列を分解する（新グラフ）

![スクリーンショット 2022-11-12 18.13.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c61bc841-cc32-0494-f040-51bb9c89fc49.png)

＊一般的な時系列グラフには逆引き10-4で紹介した複数系列の表示を用います。

## 1.想定される利用目的

・時系列予測モデリングのためのデータ理解


## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/time_series.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-11-12 18.14.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9d3862f1-7a8a-3323-a3f2-1429b92081dd.png)

入力するデータを確認するため[テーブル]を実行します。
![スクリーンショット 2022-11-12 18.13.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bf4b761e-332b-2e78-3180-dda2d52402f2.png)

[時系列グラフ]ノードで従来のグラフを表示します。
![スクリーンショット 2022-11-12 18.14.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f5b4a7b8-f293-bc52-c4be-39dccce0459d.png)

[ユーザー入力]ノードを右クリックして[データの表示]を選択します。
![スクリーンショット 2022-11-11 14.15.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/89d2cd8f-fd15-cef5-21fe-0365e80efc8c.png)

[時系列]を選択します。
![スクリーンショット 2022-11-12 17.24.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/18a4b9aa-41c9-6434-7376-b69814471acc.png)

以下の画面左の設定に従いセットします。

![スクリーンショット 2022-11-12 18.08.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/605f35ac-b950-86ed-2c96-586e2b0e9ec7.png)

![スクリーンショット 2022-11-12 18.09.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ba938bcc-3841-4a8f-6afe-09cfc5ba3b58.png)

![スクリーンショット 2022-11-12 18.10.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/138c8ddf-0436-2684-d113-957d50143e6d.png)


#### 注意事項

新グラフ機能はバージョン18.1以降で装備されました。

## 4.参考情報

#### 新グラフを解説した記事

https://www.ibm.com/blogs/solutions/jp-ja/learn-modeler-04/

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
TailwindCSSの任意のバリアントがややこしいなって思った話

# 前提

こんな感じのやつを見てもある程度は理解できる人向け
この時点ですでに頭を抱えていると多分、無理です

```html
<div class="w-6 h-6 bg-blue-700 rounded-full shadow cursor-pointer animate-bounce"></div>
```

# 本題

https://tailwindcss.com/docs/hover-focus-and-other-states#using-arbitrary-variants

ドキュメントに載ってるHTMLをもとに使っていきます

## 親要素
`[&]`が親になります

```html:多分svelte
<ul role="list">
  {#each items as item}
    <li class="[&:nth-child(3)]:underline">{item}</li>
  {/each}
</ul>
```
どんな感じに出力されるかっていうと
```html:output
<ul role="list">
  <li class="[&:nth-child(3)]:underline">apple</li>
  <li class="[&:nth-child(3)]:underline">strawberry</li>
  <li class="[&:nth-child(3)]:underline">orange</li>
  <li class="[&:nth-child(3)]:underline">kiwi</li>
</ul>
```
![スクリーンショット 2022-11-20 10.31.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565925/3afd4535-3730-bfbf-d7b0-5bf443313e13.png)

つまりは&が自分の要素で、その3番目だったらアンダーラインするよって奴です

これにブレークポイントとhoverを加えると:angel: 
```html
<ul role="list">
  {#each items as item}
    <li class="lg:[&:nth-child(3)]:hover:underline">{item}</li>
  {/each}
</ul>
```

読めるけど、、、読めるけど、、、
もし一箇所に複数出てくるようであれば既に辛いですね...(2-5番目の要素にそれぞれ違うスタイルを与えるとか)

## 子要素

`[&>*]`で子要素になります

```html
<div class="[&>*]:mt-4 [&>*]:underline">
  <p>Lorem ipsum...</p>
  <div>Orange</div>
  <p>Lorem ipsum...</p>
  <ul>
    <li>
      <p>Lorem ipsum...</p>
    </li>
    <li>Apple</li>
  </ul>
</div>
```
![スクリーンショット 2022-11-20 11.07.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565925/8d099cd8-882d-39b8-2bde-e2e0c8104269.png)

ulにmt-4がかかってて、liにはかかってないですね。

pタグだけにしたいとかだとこう
```html
<div class="[&>p]:mt-4 [&>p]:text-blue-700">
  <p>Lorem ipsum...</p>
  <div>Orange</div>
  <p>Lorem ipsum...</p>
  <ul>
    <li>
      <p>Lorem ipsum...</p>
    </li>
    <li>Apple</li>
  </ul>
</div>
```
![スクリーンショット 2022-11-20 11.10.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565925/060ec396-8a32-7dd2-22fc-290ae62a3fed.png)

## グローバル要素

スペースをアンダースコア(_)に置き換えるようです

```html
<div className="[&_p]:mt-4 [&_p]:underline" id="root">
  <p>Lorem ipsum...</p>
  <div>Orange</div>
  <ul>
    <li>
      <p>Lorem ipsum...</p>
    </li>
    <li>Apple</li>
  </ul>
</div>
```
![スクリーンショット 2022-11-20 10.41.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565925/1f184ebd-587b-ee2e-2ae1-3a943372e82e.png)

わからない人向け：CSSに直すと
```css
#root p{
  @apply underline mt-4;
}
```

上位でネストされるとただただ辛い

# まとめ

ハイ、いかがでしたでしょうか。
TailwindCSS自体はCSSとクラス名が紐づいているので割と簡単に書けますが、
任意のバリアントだけは、ややこしさを増すだけの代物になりそうです...

ドキュメントを見るのは結構楽しいので皆さんもいかがでしょうか
擬似クラスは一覧で見ると結構あるなぁと...

https://tailwindcss.com/docs/hover-focus-and-other-states#pseudo-class-reference

# お題

Arbitrary peersのところに下記HTMLが記載されていました
これの意味、わかりますか?

https://tailwindcss.com/docs/hover-focus-and-other-states#arbitrary-peers

```html
<div>
  <input type="text" class="peer" />
  <div class="hidden peer-[:nth-of-type(3)_&]:block">
    <!-- ... -->
  </div>
</div>
```
SpringBoot/thymeleafで一覧データを受け渡しする

# はじめに
SpringBootを初めて使って一覧画面を作った際、値の受け渡しについて調べたことをまとめます。
今回は勤務表の一覧画面を作りましたが、その一部を紹介します。

# モデルクラス
画面に表示させる値を保持するクラスです。
とりあえず2項目分用意します。
```java
@Data
public class KinmuhyoModel {
  /**
   * 日.
   */
  private String day;

  /**
   * 曜日.
   */
  private String dayOfWeek;
}
```
```java
@Data
@Component
public class MakeKinmuModel implements Cloneable {

  /**
   * 勤務表.
   */
  private ArrayList<KinmuhyoModel> kinmuhyoList;
}
```
MakeKinmuModelクラスに、一覧の各項目の値を持つKinmuhyoModelをList形式で保持させる作りにしています。
ちなみに、SpringBootでは@Dataをクラスに付与するだけで、getter/setterを使えるようになります。

# Controllerクラス(GET処理)
```java
@Controller
public class MakeKinmuController {

  @Autowired
  private MakeKinmuService makeKinmuService;
  
  @GetMapping("/makeKinmu")
  public String init(Model model) {
    KinmuhyoModel kinmuhyoModel1 = new KinmuhyoModel();
    kinmuhyoModel1.setDay("1");
    kinmuhyoModel1.setDayOfWeek("月");
    KinmuhyoModel kinmuhyoModel2 = new KinmuhyoModel();
    kinmuhyoModel2.setDay("2");
    kinmuhyoModel2.setDayOfWeek("火");
    ArrayList<KinmuhyoModel> kinmuhyoModelList = new ArrayList<KinmuhyoModel>();
    kinmuhyoModelList.add(kinmuhyoModel1);
    kinmuhyoModelList.add(kinmuhyoModel2);
    
    MakeKinmuModel makeKinmuModel = new MakeKinmuModel();
    makeKinmuModel.setKinmuhyoList(kinmuhyoModelList);
    model.addAttribute("makeKinmuModel", makeKinmuModel);

    return "makeKinmu/makeKinmu";
  }
```
とりあえず簡易的に、以下のように表示される値をセットします。
|日  |曜日  |
|---|---|
|1  |月  |
|2  |火  |



# .html
```html
<form th:action="@{/makeKinmu/output}" th:object="${makeKinmuModel}" method="post">
    <input type="submit" value="送信"　class="outputBtn">
    <table class="kinmuhyo-table">
        <thead>
        	<tr>
        		<th>日</th>
    			<th>曜日</th>
        	</tr>
    	</thead>
    	<tbody>
        	<tr th:each="kinmu,stat : ${makeKinmuModel.kinmuhyoList}" class="align-middle">
        		<th width="50" th:text="${makeKinmuModel.kinmuhyoList[__${stat.index}__].day}"></th>
        		<th width="50" th:text="${makeKinmuModel.kinmuhyoList[__${stat.index}__].dayOfWeek}"></th>
    		</tr>
    	</tbody>
    </table>
</form>
```
送信ボタンを押下すると、表示された値がPOSTされるようにしています。
th:eachでループ処理を行い、stat.indexで現在のインデックスを取得し、Listから値を取得しています。

#formクラス
```java
@Data
public class MakeKinmuForm {

  /**
   * 日.
   */
  private String[] day;

  /**
   * 曜日.
   */
  private String[] dayOfWeek;
}
```
POSTされる値を保持するformクラスです。
一覧画面であるため、各値は配列で取得されるようにする必要があります。


# Controllerクラス(POST処理)
```java
@PostMapping("/makeKinmu/output")
public String output(@ModelAttribute("makeKinmuModel") MakeKinmuForm formData, Model model) {
    任意の処理
}
```
POST時に呼ばれるhjava側のメソッドです。
引数のformDataに一覧画面の値が入ることになります。
変数を使ってみる【JavaScript】

今回は「変数を宣言して、変数に値を入れ、変数の値を使って表示する」ところまでやってみます。

現在の個人的な目標として「ユーザーに値を入力させ、その値を取得して加工し画面に表示する」といったことをやってみたいと思っています。そのためには変数の扱い方がわかっていた方が良いと思うので、今回は上記をテーマにしました。

<h2>変数とは？</h2>

では早速「そもそも変数とは何か？」ということですが、「入れ物」とよく説明されます。
こちらの説明が技術的に正しいのかどうかは私にはわかりませんが、一旦は上記の理解で問題ないかと思います。

イメージとして、例えば「値を2倍にしてそれを表示する」という処理を作りたいとします。
ここでは厳密なプログラミング言語を使用せずに、ざっくりと説明します。

```
A ← 10
画面に表示（A × 2）
```

「←」は「左に書かれた入れ物に値を入れます」という指示です。
「画面に表示（）」は「カッコ内の値を画面に表示します」という指示になります。

ここでは、Aに10が入り、そのAを2倍したものが画面に表示されますので、「20」という値が画面に表示されるのだろうと予測できます。

この時のAが「入れ物」で「変数」と呼ばれます。

こちらの変数ですが、基本的には「変数を宣言する」という処理を書く必要があります。
「宣言する」と言うとわかりにくいかもしれませんが、簡単に言えば「入れ物を用意する」ことです。
先程のイメージを使用して説明すると、

```
入れ物Aを用意します
A ← 10
画面に表示（A × 2）
```

1行目の「入れ物Aを用意します」が「変数を宣言する」こととなり、これによって初めてその変数を使用することができるようになるわけです。

日常生活と同じように「入れ物がなければ物を入れようがない」と考えていただいても良いですし、コンピュータ側の視点に立って「急に『Aに10を入れてください』と言われたけど、Aとは何ですか？」と戸惑う様子を想像していただいても構いません。ご自身にとって理解しやすいイメージを持っていただければ幸いです。

では「変数のイメージ」「変数は宣言しないと使えないといったルール」などがわかったところで、JavaScriptで記述していきたいと思います。

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <title>タイトル</title>
    	<script>
		// 変数Aを宣言します。
		let A; // 入れ物Aを用意します
		
		// 変数Aに値を代入します。
		A = 10; // A ← 10
		
		// 変数Aを2倍した値を表示します。
		alert(A * 2); // 画面に表示（A × 2）
		</script>
  </head>
  <body>
  </body>
</html>
```

上記を拡張子htmlで保存し、ブラウザで実行していただくと「20」という値が表示されます。
![practice2_monitor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982997/690a91ff-99f3-4561-da31-3cf54c104aa2.png)

scriptタグ内のletですが、こちらは、
```
let 変数名;
```

と書くことで、変数を宣言する（入れ物を用意する）ことができます。

変数に値を代入する（変数に値を入れる）ためには、
```
A = 10;
```
のように「=」を使用します。

最後にalert()を用いて、（）内の値を画面に表示します。

```
alert(値);
```


「//」についてですが、「//」以降はコメント部分で処理されない範囲になります。コメントを書いたことで処理が速くなる、新たな処理が追加される、といったことはありません。ただ、後から振り返る時や他の方が読んだ時に、上記のように説明やメモを書いておくとわかりやすいと思います。
今回は処理の上の行に「処理の説明」、処理と同じ行に「先程記載したイメージ」を書きました。


<h2>余談</h2>

ここからは余談ですので、もう疲れてしまった方や急いでいる方はスルーで問題ありません。

「なぜ変数などというものを使用するのか？」という疑問が出てくる方もいらっしゃるのではないでしょうか。例えば、今回のケースであれば「そのまま10を2倍してしまえばよい」と考えて、以下のように記載しても同じ結果を返します。

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <title>タイトル</title>
    	<script>
		// 10を2倍した値を表示します。
		alert(10 * 2); // 画面に表示（10 × 2）
	</script>
  </head>
  <body>
  </body>
</html>
```

今回のような「2倍にした値を表示する」というケースでは上記のように変数を使用しなくても問題ないかもしれません。
しかし、冒頭で申し上げたような「ユーザーに値を入力させ、その値を取得して加工し画面に表示する」といったような処理を行う場合、「ユーザーが入力した値」を変数で確保していた方がプログラミングを行う側としてはやりやすそうではありませんか？

「この入れ物にはユーザーが入力した値が入っている」とわかれば、使いたい時にその入れ物を使えばよいわけです。
また、イメージで申し訳ありませんが、

```
入れ物Aを用意します
A ← ユーザーに値を入力させます
画面に表示（A × 2）
画面に表示（A + A）
画面に表示（A - 2）
```

といったように、「ユーザーが入力した値」を繰り返し使用する場合に備えて、変数を用意しておくととても便利なのです。

この辺りの感覚についてはプログラミングを進めていく過程で徐々にわかっていくと思いますのでゆっくりで大丈夫です。
「わざわざ変数を用意しなくてもよさそうだ」と感じた方に向けて上記の考え方が参考になればと思いますし、またそういった視点でプログラミングを進めて行くと新しい発見があるのではないかと考えています。


今回の記事を作成するにあたって、以下を参考にいたしました。ありがとうございます。

【参考文献】

https://jsprimer.net/basic/variables/
東京ガスiネットハッカソン　参加レポート


## 概要

- そもそも東京ガスiネットハッカソンとは?
- 参加者一覧
- プレゼン（発表ピッチ）


## そもそも東京ガスiネットハッカソンとは？

東京ガスiネット株式会社さんが11月19日-20日に開催したハッカソン。
参加者は二日間という短い期間のなか、
<strong>「テクノロジーを駆使してスマートシティを実現せよ!」</strong>
という大テーマのもと、開発に取り組みました。


## 参加者一覧
- 私、夜勤明けで参加したため満身創痍。
- そらくん、ハッカソンをこれまで20回ほど経験しているらしいつよつよ（自称よわよわ）エンジニア
- こうきくん、授業でflaskをいじったことがあるという珍しい経歴の持ち主。




---
### マンダラートによるアイデア出し
そもそも何を開発するかが決まっていなかったため、マンダラートというアイデアチャートを使用し、
チームメンバーそれぞれがアイデアを出していきました。以下はその例になります。

![スクリーンショット 2022-11-20 10.10.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884108/63fb02d2-4c38-78e7-3036-7fe056330eef.png)

そらくんは割とすらすらアイデアを書き出していたような印象。
私とこうきくんはマンダラートをあまりうめられず。

### アイデアスケッチによる具体化とアイデアの選定
それぞれ書いたマンダラートをもとに、何が作りたいのかを具体化しましたた。
チーム内での投票の結果。私たちはウェブ版貯金箱を作ることにしましたた。
![スクリーンショット 2022-11-20 10.20.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884108/2d270402-bfc7-429c-7427-2736cd8dde29.png)
<strong> ボツアイデア供養 </strong>
![スクリーンショット 2022-11-20 10.20.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884108/6ffad4c6-0bd6-975d-1c14-54be5d6677ad.png)
![スクリーンショット 2022-11-20 10.20.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884108/29646069-bf38-ef22-3581-023901187222.png)

### 選定したアイデアのブラッシュアップ
選定したアイデア（ウェブ版貯金箱）をもとに、
どのように貯金箱のシステムを実装するかを考えました。

選定言語) 
- HTML / CSS / JavaScript /Python(Flask)/ AzureFunctions

実装する仕様）
- 貯金箱: 貯金箱本体。貯金を行うと、褒めるメッセージを出してくれる。 あと貯金残高を表示する。
- 貯金箱のデザイン：ガラスのような質感、使ってておもしろみのあるもの。
- 貯金用ボタン: 10円,50円,100円,500円のボタンをそれぞれ押すと、その金額分だけ貯金残高が増える仕様。
- ボタンのデザイン:流通している硬貨それぞれの写真をそのまま流用。

### 開発ピッチ入り
アイデアのブラッシュアップが終わり、私たちのチーム「ハリガネマスクまんじゅう」は開発フェーズに移りました。

〜　最新のトレンドを取り入れ、私たちのチームもGitを用いて開発を進めることにした。ほとんどのメンバーが普段Gitを使用していないため、
pushやmergeがうまくいかずにメンターさんに30分間見てもらうなどしてかなりのタイムロスを被った。

〜　APIを叩いて受け取ったJSONがHTML側で表示できない！

〜　貯金箱の表示残高を上記のAzureFunctions内で保持し、フロントエンド側でアクションがあった場合（ボタンが押された）に更新されるように実装を頑張った。

〜　貯金箱に入金した際に、一定の金額毎にrandomで褒めるメッセージが出るように工夫した。

〜　FLASK側でフロントエンド・バックエンドの実装。デザインのブラッシュアップ。

初日は5時間ほど開発時間が用意されました。
貯金箱の形ができた段階で、初日の作業は終了しました。
2日目は前日と同様に開発を行ったので割愛します。


### 最終結果
最終的にプロダクトは完成し、万全の体制でプレゼンを行うことができました。

結果として、審査員特別賞を受賞し、一番良い商品を受け取ることができました。
Xiaomi のスマートウォッチみたいなやつです。
![unnamed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884108/175cb991-6393-8adb-db97-db43c207f295.jpeg)
悩むのって無駄無駄無駄

https://www.pixiv.net/artworks/42376683

# 悩み事と考え事
どちらも同じ意味合いに見えるが、僕の定義の中では、両者は全く事なるものだと定義してます。
・ただいつまでも考え続けて、結論が出ないのが悩み事。
・一方、結論を出しに行くのが考え事。
電車の中やお風呂の中やドライブ中や、寝る前には、悩んでいると色んな考え方が浮かんで来る。
僕は特に、寝る前が良い。突然、起きてメモをメールしています。
後は、仕事が終わって、ボーットしながらお酒を飲んでいる時。この時も、直ぐにメールします。
これは、悩んでるだけで、考え事ではないので結論が出てないのでアイデアだけメモに保存しときます。

# 考え事とは
考え事をする時は、必ずＰＣに向かってる時か、メモ用紙とペンを持っている時にするのがベストです。
何故なら、書くものも何も無い状態で結論を出しにくいからです。
それが無い状態で考え事をしてるというのは、ただの妄想を考え事を勘違いしている人。
考え事というのは、EXCELなり、PPTなり、手書きでマインドマップなり、しっかりと考えて、整合性のあう形で検証して整理して実行する迄をしっかりと考える必要がある。これが考え事。

# 悩むのではなく考える
１．枠を外して、沢山妄想して、色んなアイデアを出す。
２．それをしっかりと考え込んでアウトプットとして残す。
ただ、悩んだだけでは、全く何も残りません。悩み事から考え事として昇華させて結論を出しましょう。
逆に考えても結論が出ないことは、悩んでも仕方ありません。心配しても無駄です。
不安気味な人は、このプロセスを踏む事で、無駄な悩みと考える必要がある悩みが理解でき、安心して寝れる様になると思います。
プログラミング初心者にもおすすめ！「Github Copilot」を半年程度使用して感じたメリット・デメリット

# はじめに
私は`Github Copilot` を使用し始めてから、約５ヶ月が経ちました。
使用感をお伝えしていきます。

結論としては、以下になります。
・個人的には新しい分野を勉強する時の強い味方である
・プログラミング初心者や実務経験1~3年未満程度の方には学習効率を上げる効果が期待できる
・熟達したプログラマーには不要
・著作権や脆弱性の問題が示唆されている点を認識したうえで使用する必要がある

# Github Copilot とは
> GitHub Copilot では、コーディング時にオートコンプリート スタイルの候補を提示する AI ペア プログラマーです。 使用するコードを書き始めるか、そのコードに何をさせたいかを自然言語のコメントで記述することで、GitHub Copilot から候補を取り入れることができます。 GitHub Copilot は、編集中のファイルや関連ファイルのコンテキストを分析し、テキスト エディター内から候補の提示を行います。

https://github.com/features/copilot

https://docs.github.com/ja/copilot

# メリット
### 自分の知らなかった記法を教えてくれる
これは初心者に向けた内容ですが、
自分が認知していない記法を提案してくれることがあります。
それが必ずしも適切で効率の良い書き方とは限りませんが、初心者にとっては勉強になるでしょう。

### 成長率が2倍近くなる？
`Github Copilot`は必ずしも適切なコードを提示してくれるわけではありません。
ただ、1つのメソッドや機能を作成する時に、 自分の考え以外の書き方を提示してくれることがあります。
下記公式サイトを見ればイメージがつかめるかと思います。

https://github.com/features/copilot

プログラムを書き始めて間もない人にとっては、
他者からのレビューを受ける前にある程度のレビューを受けられるので、経験値が倍増すると考えて良いかと思います。（２倍は言い過ぎかもですが）

### 新しい分野を勉強する時の強い味方
自分があまり経験していない言語やフレームワークを勉強するときに、大変重宝します。
よくある書き方が提示されることが多いので、ベーシックな書き方について知ることができます。

例えば、Go 言語を学習するときに、[A Tour of Go](https://go-tour-jp.appspot.com/)をやっているとします。
下記のセクションをエディタで書いているとすると、、、

https://go-tour-jp.appspot.com/concurrency/5

下のキャプチャのように `Github Copilot`が補完してくれます。
![スクリーンショット 2022-11-20 9.46.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916052/27502d03-0ca3-67b4-15b1-394598536f2c.png)

上記のように、書籍や`Udemy`などの教材に出てくる、サンプル的なコードは補完してくれる確率が高いです。
有名な教材であればあるほど、多くのひとが同じコードを書いています。
ですので、高い確率で補完してくれす。
**写経したり、サンプルアプリを作っている時に、つまらないタイポを防ぐ効果があります。**

さらに、サンプルアプリなどの退屈なコーディング（HTMLタグとかですね）を補完してくれるので、**勉強のモチベーションを保つ効果もありました。**

一方で、仕事でコーディングをしているときに、`Github Copilot`が提案してきたコードを採用しないことも多くあります。
しかし、提案されたコードを私たちは知覚しています。
**そういった、見たことがある・なんとなく知っていることに関しては、心理的障壁が減るかと思います。**
つぎに勉強や仕事の際にそういったコードに触れる機会があれば、スムーズに頭に入ってくるのではないでしょうか。


### めんどくさい時にも助けてくれる
勉強や仕事で、何時間もコーディングをするときに、キーボードを叩くことすらめんどくさくなる時はないですか？

![towfiqu-barbhuiya-7uHPhxZYQpY-unsplash.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916052/cfcd2613-4816-d03f-1f10-3582327d441b.jpeg)

そういった時にも`Github Copilot`は重宝します。

人間の集中力が切れてきても、`Github Copilot`は変わらずコードの提案をしてくれます。

ほかに例を挙げると、
テストコードのようなある程度書き方が決まっているものは`Github Copilot`の得意分野です。
めんどくさい、煩雑なパターン化されているコーディングを助けてくれます。

# デメリット
### 著作権や脆弱性の問題が示唆されている
`Github Copilot`が登場してからずっと指摘されてきた問題です。
詳しくは以下のニュースなどを参照してください。
こういった問題が存在することは認知しておきましょう。

https://www.itmedia.co.jp/news/articles/2210/18/news167.html

https://gigazine.net/news/20221019-github-copilot-erases-open-source-community/

https://gigazine.net/news/20221018-github-copilot-emit-copyrighted-code/

繰り返しになりますが、
`Github Copilot`が提案してきたコードは以下の可能性があるので、それを認識したうえで使用してください。
・著作権を侵害している可能性
・脆弱性の問題がある可能性

### 思考の幅が狭まる？
これは私が感じたことでは無いですが同僚が`Github Copilot` を使っていて、言っていた感想です。
`Github Copilot`が提案してくれるので自分で考える力が育たないかもしれません。

**`Github Copilot`が 提案してくれるコードを鵜呑みにせず、自分で考える必要が ありますね。**

### お金がかかる
最初の2カ月間は無料で使うことができます。（2022年11月20日時点）
それ以降はサブスクリプション制度でお金を払っていく必要があります。

# まとめ
`Github Copilot`を半年ほど使用してみて感じたことをまとめてみました。

冒頭にも述べましたが、以下が大きなメリットです。
・新しい分野を勉強する時の強い味方である
・プログラミング初心者や実務経験1~3年未満程度の方には学習効率を上げる効果が期待できる

コーディングが楽になるというよりかは、サポートをしてくれるというイメージが強いです。

`Github Copilot`にはデメリットもあるので、使用前に確認してください。
PhpStormのSpotlightサービス？

よく分かりませんが、 `macOS Ventura` にしてから、 PhpStorm の複数ファイル内検索（Command + Shift + F)をすると以下のようなポップアップが出るようになりました。

```
The "Spotlight" service could not be used because the "Spotlight.service" application could not be opened.
Try reinstalling "Spotlight.service."
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/e2f9bb82-193c-1b5c-4574-5db839961058.png)

意味が分かりません。

"Show Application" してみても、ちゃんと Spotlight.service はあるし。
macOS標準の Spotlight はちゃんと動いてるし。
`再インストール` なんて項目はないし、 `削除` の項目もない。
ストレスしか溜まらない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/3bc0640c-af34-67a0-776d-1cc38a78dc76.png)

macOS側のSpotlightが何かショートカットをかぶせてきたのかとも思ったけど見当たらないし……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/dadd6d38-1358-2924-483a-e32f5da744b0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/b3f6cbf1-091b-662f-eafb-fe69ab8e426a.png)

別のキーボードショートカットを設定したら、上のダイアログが表示されたので、システム側のショートカット消してくれるのかしら、と思ったらそんなことはなかったです。

---

## いただいたコメントをもとに

同じ画面に辿り着こうとするのも一苦労でした（笑）
インターフェースが頻繁に変更されるので厳しい……
ちなみに操作環境は `Ventura 13.3.1` です。

システム設定 → キーボード → キーボードショートカット… → サービス → 検索 → Spotlight ですね。
Spotlight検索の「キーボードショートカット」でも近くまで行けるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/c11ac931-de99-a15a-e87c-736c9f9cc6c2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/85e951b3-f1fe-3cb1-a3ed-d7c3ab38c308.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/b30222e5-e981-a616-3fb0-9c183a486bc0.png)
ABC278回答メモ

0.はじめに
　今回はD問題まではそこそこの難易度で
　久々に4問正解達成。
　レートも+38でした。
　40分残してE問題にたどり着いたけど、ちょっと難しかったです・・。

1.A - Shift
　サーッと問題読んで、A問題だから素直に
　ループしてもいいとは思いつつ
　若干手を抜きました。
　
　N個の0数列の先頭から、
　インプットしたA数列のK個目から最後までを入れて
　最後にアウトプットする。
　といった感じで実装しました。

　https://atcoder.jp/contests/abc278/submissions/36605710

2.B - Misjudge the Time
　どう考えても時計のデザインが悪いだろ・・・。と思いつつ
　以下のように実装。
　1) 見間違えやすい時刻(以下ダメ時間)になるまで以下をループ
　　1-1)現在時刻、時間Hと分MをA,B,C,Dに分解してダメ時間判定
　　　1-1-2)A＆Cが時として見られるか判定
　　　　-Aが1以下ならOK
　　　　-Aが2の時はCが3以下ならOK
　　　1-1-3)B＆Dが分として見られるか判定
　　　　-Bが5以下ならOK
　　　1-1-4)1-2と1-3がOKの時、ダメ時間と判定してループを抜ける
　　1-2)現在時刻がダメ時間でない時、1分進める
　　　1-2-1)Mが59の時
　　　　1-2-1-1)Hが23の時
　　　　　-Hに0をセット
　　　　　-Mに0をセット
　　　　1-2-1-2)Hが23以外
　　　　　-Hに1加算
　　　　　-Mに0をセット
　　　1-2-2)Mが59以外の時
　　　　　-Hに1加算
　　2)ループを抜けたら、現在時刻を表示

　最初、なぜか、1-1-3でBが6以下ならOKとしてしまいNGでしたが
　すぐに気づけて修正してACでした。
　なかなか面白い問題でした。

　https://atcoder.jp/contests/abc278/submissions/36617488

3.C - FF
　最近のC問題にしてはやさしめの問題だなと思いつつ取り掛かる。
　【考え方】
　　フォロー用の辞書dictを作成し
　　フォロー情報がはいったら(T=1)、A*(10**10)+Bをキーに
　　dictへ値1で登録(or更新)
　　フォロー情報が消えたら(T=2)、A*(10**10)+Bをキーに
　　dictを検索し、値0に更新
　　フォローチェック(T=3)の時は、A*(10**10)+Bと
　　B*(10**10)+Aをキーにdictを検索し、
　　どちらも値が1だったら”Yes”を
　　それ以外なら”No”を表示

　単純に実装しましたが、特にTLEにもならず一発合格でした。

　https://atcoder.jp/contests/abc278/submissions/36623769

4.D - All Assign Point Add
　一見考え方自体は簡単そうだったので、TLE回避問題と思いつつ
　まずは素直に実装。
　【考え方１】
　　入力数列をリストAに保存
　　クエリ1の時
　　　リストAをｘで初期化
　　クエリ2の時
　　　リストA[i]にｘを加算
　　クエリ3の時
　　　リストA[i]を出力
　上記実装で7/15のTLE。
　まぁ、リストAの初期化が時間を食っているんだろうなと
　新たな考え方を導入。
　【考え方２】
　　クリア時変数QL(初期値-1)を用意
　　ついでに加算用辞書dictを用意
　　入力数列をリストAに保存
　　クエリ1の時
　　　QLにｘをセット
　　　dictを初期化
　　クエリ2の時
　　　dict[i]にｘをセットor(すでにあれば加算）
　　クエリ3の時
　　　QLが-1の時
　　　　リストA[i]+dict[i](iがあれば)を出力
　　　QLが-1以外の時
　　　　QL+dict[i](iがあれば)を出力
　上記回収でACゲットでした。

　https://atcoder.jp/contests/abc278/submissions/36631666