OmniAICreator/Qiita-1.07M huggingface dataset:
プログラミング学習を学ぶ前に知っておきたいこと~環境構築なしで触れてみる~

## 初めに
この記事は**プログラミング学習を学ぶ前に知っておきたいこと**と題したシリーズの一つです。
このシリーズは各テーマごとに連日投稿予定です。

## このシリーズ記事の対象者
- プログラミングに興味を持って、学習を検討している方
- 学習したいけど、何から手をつけたらいいのかわからない方

[前回の記事](https://qiita.com/MPrg2011/items/ed6d77a08665e1b0e267)の続きです。

https://qiita.com/MPrg2011/items/ed6d77a08665e1b0e267

## PCをゲットしたら
### まずはWebブラウザでプログラミングを体感してみよう
プログラミングを行うためには環境構築というものが必要です。

:::note info
**環境構築とは**
システムやソフトウェアの実行環境や開発環境を整えること。機材や回線、ソフトウェアなど動作に必要な要素を手配・導入し、利用者が実際に使用可能な状態に全体を整える作業を指します。
:::

教材や参考書の初めの章に当たり前のように載っていますが、初心者がいきなりやるのはおすすめしません。
理由としては
- OSやバージョンの相性で失敗することがあるので、初心者がいきなり行うとうまく行かない
- 時間をかけすぎて、肝心の言語学習に使う時間が減る

何事も慣れが大切ですので、一度しかやらない環境構築よりも、言語に費やす時間を確保しましょう。

### 体感後はアウトプットしてみよう
アウトプット先はどこでも構いません。今見られているQiitaでもいいですし、ネット上に公開するのは気が引けるという人はメモ帳(物理でもアプリでも可)などに書いておくとよおいでしょう。
個人的にはNotionがおすすめですが、Evernoteも根強い人気があります。

https://www.notion.so/ja-jp/product?fredir=1

https://evernote.com/intl/jp

## WEBブラウザでプログラミングの体験ができるサイト5選

### Progate

https://prog-8.com/

プログラミングやりたい！と思ったら最初に選ばれる可能性が高いのがProgate。
まずは[HTML & CSS 初級編](https://prog-8.com/courses/html)をやってみましょう。どの講座も中級の途中からは課金(¥1078/月)が必要です。
個人的には興味がある分野の初級編をいろいろ触ってみるのもいいと思います。
なにやったらいいか決められないけど教えてほしい！という人は公式が用意しているロードマップを参考にしてみて下さい。

https://journey.prog-8.com/ja/scenes/

### Visual Studio Code for the Web

https://vscode.dev/

もともとVisual Studio Codeはコーディングに特化したエディタで、使用にはインストールが必要でした。
こちらのサイトはブラウザでアクセスするだけでエディタを使用することができます。
詳しい使い方のコツは過去記事を参照ください。

https://qiita.com/MPrg2011/items/4ea66fb8a68b8b9979b2

### paiza.io

https://paiza.io/ja

### Paiza Cloud


https://paiza.cloud/ja/

ITエンジニア向け転職・就職・学習プラットフォームPaizaが運営。
paiza.ioはブラウザ上でコードを書け、書いたコードをその場で実行できるオンラインのプログラム実行環境です。気になる言語で少しだけ触ってみたいときに最適です。
Paiza CloudはLinuxというOSの開発環境が実行でき、サーバーも使用できるため言語以外にデータベースなどの利用も可能。無料で使用できますが一部制限あり。

### Google Colaboratory

https://colab.research.google.com/?hl=ja

Googleが提供しているPythonや機械学習・深層学習の環境を整えることが出来る無料のサービスです。
私もMySQLの学習に利用させていただきました。
他に紹介したサイトと比較するととっつきにくいところはありますが、Googleアカウントがあればすぐ使えるのでTOPページ内のチュートリアルを読んだり、**Colaboratory 使い方**など検索して触ってみて下さい。

### 最後に
短い記事でしたが最後まで見ていただきありがとうございました。

明日は無料で教材を提供しているサイト等の紹介を投稿予定です。


### 参照サイト
[環境構築とは - 意味をわかりやすく - IT用語辞典 e-Words](https://e-words.jp/w/%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89.html)
EchoShow 5を時計表示で固定する方法

# EchoShow5をデスクに設置するときの難点
Amazonのブラックフライデーセールで，EchoShow5が安く買った人も多いハズ．

ただ，EchoShowはデジタルフォトフレームを意識しているのか，画面が10秒程度で変わる仕様で，デスクに置いておくと目障りです．

そこで，EchoShow5を時計で固定する方法を紹介します．
# EchoShow5を時計表示で固定する方法
①セッティングの時計→ホームコンテンツ内にある機能を全てオフ．
②時計の背景がサイクルになっている場合は，特定の背景にセット．
③ナイトモードをオンにする．

ナイトモードの機能をオンにすると，アラームや一部の通知を除いて通知されないようになります．
ヤマハルーターでL2TPv3

# ヤマハルーターでL2TPv3を実現する
あるきっかけがあって、ヤマハルーターでL2TPv3を扱うことになった。次のサイト（本家）を参考に実現したときのメモである。
- [L2TPv3を用いたL2VPN](http://www.rtpro.yamaha.co.jp/RT/docs/l2tpv3/)

## ネットワークトポロジー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/6b18e03e-34a0-d8e9-ed8e-f293d73afd04.png)
上記のネットワークで末端のPCどうしが同一セグメントとなる。

## 設定
ルーターどうしがDirectにネットワーク接続されているため、設定は比較的簡単になる（理解できれば）。CUIで設定（GUIではおそらく不可）。関連するところのみ記載。

下記はRouter 1の設定、Router 2では、各種IPアドレスが反転する。ホスト名も別のものとなる。
```
bridge member bridge1 lan1 tunnel1  # LAN側とトンネルとをブリッジ化
ip bridge1 address 192.168.2.10/24  # ブリッジにIPアドレスアサイン
ip lan2 address 10.0.0.1/24         # WAN側IPアドレス
ip lan2 nat descriptor 1            # 適用するNATディスクリプタ
tunnel select 1                     # トンネル設定
 tunnel encapsulation l2tpv3-raw    # L2TPv3トンネル
 tunnel endpoint address 192.168.2.10 10.0.0.2  # トンネル始点（ブリッジIPアドレス）と終点（対向ルーターのWAN IPアドレス）
 l2tp always-on on                  # L2TPv3の常時接続
 l2tp hostname RT1                  # ホスト名
 l2tp tunnel auth on yamaha         # トンネル認証ONおよびパスワード
 l2tp tunnel disconnect time off    # トンネル切断タイマーOFF
 l2tp keepalive use on 60 3         # トンネルキープアライブON、インターバル（秒）、ダウン検出カウント
 l2tp keepalive log on              # トンネルキープアライブログON
 l2tp syslog on                     # L2TPトンネル制御をSyslog化
 l2tp local router-id 192.168.2.10  # ローカル（自分）ルーターID
 l2tp remote router-id 192.168.2.20 # リモート（対向）ルーターID
 l2tp remote end-id yamaha          # リモートエンドID（ルーターどうしで同一）
 ip tunnel tcp mss limit auto       # TCP MSS自動制御
 tunnel enable 1                    # トンネル有効化
nat descriptor type 1 masquerade    # NAT IPマスカレード 
nat descriptor address outer 1 primary # NAT外側IPアドレス（LAN2）
nat descriptor address inner 1 auto # NAT内側IPアドレス（自動）
nat descriptor masquerade static 1 1 192.168.2.10 udp 1701 # L2TPポート番号（1701）をブリッジIPアドレスへ転送
l2tp service on l2tpv3              # L2TPv3有効化
```

## ルーター間のネットワークキャプチャデータ
![Wiresharkのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/ceb6fa3c-4ec5-5f6e-0284-f9d968e93994.png)
L2TPパケットデータが見られる。なお、Wiresharkでは、L2TPv3の実データ一部を正しく解釈しないように見える。

## L2TP状況
```
# show status l2tp  
------------------- L2TP INFORMATION -------------------
L2TP情報テーブル
  L2TPトンネル数: 1, L2TPセッション数: 1 
TUNNEL[1]:
  トンネルの状態: established
  バージョン: L2TPv3
  自機側トンネルID: 1278
  相手側トンネルID: 5158
  自機側IPアドレス: 192.168.2.10
  相手側IPアドレス: 10.0.0.2
  自機側送信元ポート: 1701
  相手側送信元ポート: 1701
  ベンダ名: YAMAHA Corporation
  ホスト名: RT2
  Next Transmit sequence(Ns): 20
  Next Receive sequence(Nr) : 18
  トンネル内のセッション数: 1 session
  セッション情報:
    セッションの状態: established
    自機側セッションID: 17593
    相手側セッションID: 50640
    Circuit Status 自機側:UP 相手側:UP
    通信時間: 16分27秒
    受信: 571 パケット [221060 オクテット]
    送信: 189 パケット [26375 オクテット]
```

## 終わりに
次回は、L2TPv3 over IPsecにトライ。
npmstartできない　babel-jestのエラー解消


# [概要]
npx create-react-appから作成後
前までは何事もなく起動できていたのに！久しぶりにnpm start しようとしたら下記画像のエラー出て起動できなかった。


## 環境
Mac(M1, 2020)
vscode5

## ぶつかったエラー
![スクリーンショット 2022-12-03 17.49.27（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884551/02eb3456-dfa5-5ff6-cb90-379c9520722d.png)


翻訳・意味　（下記URL記事参照)
react-scriptsのパッケージのbabel-jestはバージョン26.6.0を推奨しているのだが、それよりも高いバージョンを利用しているとエラーになる。らしい

自分の場合は"23.6.0"を推奨している

## やったこと

1.この記事の内容を試したら解決できた
https://iwb.jp/create-react-app-yarn-start-babel-jest-error/
Googleドライブのファイルのオーナーをまとめて変更したい！

※まだまだ投稿が不慣れなので、温かい気持ちで読んでいただけると幸いです。

# 背景
弊社はグループウェアとしてGoogleWorkSpace（旧GSuite）を導入しています。
社内PJに関するファイルはGoogleAppsで作成するので入社してから期間が経てば経つほど
ドキュメントやらスプレッドシートやらスライドやら持ち物がどんどん増えていきます！

となると、悩みになるのは**どこかのタイミングでのファイルの棚卸や権限変更**です（少し無理やりwww）

最近、ショートカットキーでファイルのコピペができるようになるなど
徐々に使いやすくはなっているものの、まだまとめてのファイル操作というのは不便さが残っている状態です汗

ないなら、どうする？ そう！ **作っちゃおう！**

# やったこと
* 自身がオーナーのファイル、フォルダの**取得**
* 特定のファイル、フォルダの**削除**
* ファイル、フォルダの**オーナー変更**

# 完成イメージ
![スクリーンショット 2022-12-03 17.46.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748416/b240f87e-49f9-609f-d28e-30c431987e63.png)

# 自身がオーナーのファイル、フォルダの取得
```javascript:getOwnFileList()
  //スクリプト実行者がオーナーのファイルを取得
  var allFiles = DriveApp.searchFiles('"me" in owners');
  //フォルダの場合はこちら
  var allFolders = DriveApp.searchFolders('"me" in owners');
```
# 特定のファイル、フォルダの削除
削除の列のチェックボックスにチェックが入っているものを消していきます。

```javascript:deleteFiles()
  //ファイルの削除
  DriveApp.getFileById(ファイルID).setTrashed(true);
  //フォルダの削除
  DriveApp.getFolderById(フォルダID).setTrashed(true);

```
# ファイル、フォルダのオーナー変更
オーナー列のメールアドレスが、左上の対象者Eメールと違うものに対してーなー変更を行います。

```javascript:changeOwner()
  //ファイルのオーナー変更
  DriveApp.getFileById(ファイルID).setOwner(変更先のオーナーのメールアドレス);
  //フォルダのオーナー変更
  DriveApp.getFolderById(フォルダID).setOwner(変更先のオーナーのメールアドレス);
```

# 最後に
GASでめんどくさいを自動化してハッピーライフ

# 参考
[GASとは](https://developers.google.com/apps-script)
WIndowsの記憶域プールにディスクが追加できないときの対処法メモ

記憶域プールに追加できないディスクを追加したときのメモ
# エラー内容
```
Add-PhysicalDisk : One or more physical disks use a sector size that is not supported by this storage pool.
Extended information:
                            One or more physical disks encountered an error during addition to the storage pool.
Physical Disks:
                            {1557cac8-7215-b5dc-4310-1ecb3621d6e2}: 物理ディスクのセクター サイズが記憶域プールでサポートされていません。

Activity ID: {4945b7ee-06c0-0002-a679-5249c006d901}
発生場所 行:1 文字:1
+ Add-PhysicalDisk -StoragePool  $STORAGEPOOL -PhysicalDisks $NEWDISK
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (StorageWMI:ROOT/Microsoft/..._StorageCmdlets) [Add-PhysicalDisk], CimException
    + FullyQualifiedErrorId : StorageWMI 51003,Add-PhysicalDisk
```
#　対処法
PowerShellで以下を実行
```powershell
Get-PhysicalDisk
```

```powershell
Reset-PhysicalDisk -FriendlyName [ここに対象DsikのFriendlyName]
```
もしくは
```powershell
Reset-PhysicalDisk -SerialNumber [ここに対象DsikのSerialNumber]
```
Pythonに関するメモ（":"コロンとインデント編）

# はじめに
この記事は、Javaをかじってる人がPythonを学び始めて
- 思ったこと
- 疑問に思ったこと
- Javaとの違い
などに関する備忘録です。

# Pythonは変数の代入処理、関数の呼び出し時には文末に";"セミコロンを付けない

# Pythonはmainメゾッドを明示的な呼び出しが必要
Javaのmainメゾッドは、mainメゾッドが含まれているクラスを実行する度に暗示的に呼び出されるが、Pythonはmainメゾッドであっても、**明示的に呼び出す必要がある**

# Javaの"{}"は、Pythonにおいては"："と"インデント"
Javaにおいては、if文、for文、クラス等を記述する際に以下のように"{}"で処理内容を囲み、その中身は可読性を上げるためにインデントするが、
```java:Sample1.java
public class Sample1{
    public static void main(String[] args){
        for(int i = 0; i < 10; i++){
            if(i%3 == 0){
                System.out.print("Hello World");
            }
        }
    }
}
```
以下のようにインデントしなくても、めちゃくちゃでもエラー無くプログラムは動く
```java:Sample2.java
            public class Sample2{
public static void main(String[] args){
    for(int i = 0; i < 10; i++){
if(i%3 == 0){
System.out.print("Hello World");
}
}
}
}
```
一方、Pythonは"{}"が無いため、":"で"{"を表し、インデントでif文、for文、関数、クラス等の範囲を指定する。

```python:Sample3.py
class Sample3:
    def main():
        for i in range(10):
            if i%3 == 0:
                print("Hello World")

    if __name__ == "__main__":
        main()
```
そもそもこの程度の処理は、クラスや関数を用いずに以下のように書ける
これは、Processingと似ている
```python:Sample4.py
for i in range(10):
    if i%3 == 0:
        print("Hello World")
```

# 参考文献等

https://udemy.benesse.co.jp/development/python-work/python-for.html

https://yu-nix.com/archives/python-main/

https://www.lifewithpython.com/2021/01/python-main-function.html

https://blog.pyq.jp/entry/Python_kaiketsu_180207

# 更新履歴
- 2022.12.03　投稿
開発チームの生産性を計測している話

# これはなに
[Uniposアドベントカレンダー2022](https://qiita.com/advent-calendar/2022/unipos)　３日目です。
開発組織をマネジメントする部隊に所属しています。

今回は弊社の開発組織の生産性計測についてお話ししていきます。

# 課題

組織マネジメントする上で開発の健全性を定量的に評価できていない状況にありました。


## 開発の健全性
開発の健全性が高いとは

- プロダクトの価値が素早く顧客に届けられること
- プロダクトの品質が高いこと

が満たされている状態のことと解釈しています。

これら２項目を同時に高めるための手法について、
[LeanとDevOpsの科学](https://www.amazon.co.jp/dp/4295004901)という書籍を参考にしました。
また、以降でお話しする内容は本書の語る結果だけ引用しているので、前提知識を知りたい方は是非読んでもらえるとこの記事が読みやすくなると思います。

忙しい人のために、簡単にまとめられている記事もありますので一応貼っておきます。
[『LeanとDevOpsの科学』まとめ (Qiita)](https://qiita.com/takeshi_nozawa/items/c115379fafeb263ed807)

一般的に品質とスピードは相反すると思われがちですが、そうでないということを本書では語られています。
では、どのような指標を評価し改善することで健全性を高められるかについて話します。

# 何を見るといいの？
本書では

- リードタイム
- デプロイ頻度
- 変更失敗率
- 平均復旧時間

の4指標を見ると良いとしています。
この4指標をまんべんなく高いと、品質の高いプロダクトをすばやく提供できる状態にあると評価できると述べられています。
それぞれの指標の定義と弊社での算出方法について話します。

|指標|定義|算出方法|
|-|-|-|
|リードタイム|コードのコミットから本番稼働（リリース）までの所要時間|github上の最初のコミットからマージ完了までの時間|
|デプロイ頻度|リリースの頻度|github上のリリースタグ数|
|変更失敗率|リリースした結果、品質低下し修正する必要が生じた割合|github上の `バグissue / 上記デプロイ頻度`|
|平均復旧時間|インシデント等の不具合が発生した際のサービス復旧に要する時間|インシデント報告書からヒアリング|


# 現状の評価
平均復旧時間以外は取得できるような体制が整いました。

![リードタイム-2022-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376573/69b35b2e-7d8a-7673-573e-99302be888d3.png)
![リリース頻度-2022-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376573/7499d61d-6ee1-6764-e837-fc58a4847dc4.png)
![変更失敗率-2022-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376573/0ce3a113-de71-4b9d-82a5-7ec160789d87.png)



# 残る課題と展望
一方で算出対象の妥当性については開発チームのgithub運用次第でちょろまかすことも可能になってしまう懸念があります。
また平均復旧時間は人力でかつ曖昧な定量情報になってしまっています。
そのため、githubの運用ルールやインシデント報告フローの整備・合意をしていく必要があります。

これらの指標が見える化されることで、ビジネスサイドとのコミュニケーションがより円滑になったり、開発組織内のモチベーションアップに繋がる良い体験が社内に増えることを期待しています。
AWS re:Invent 2022 AWS Glue for Ray の翻訳まとめ記事

## はじめに

AWS re:Invent 2022 が開催されており、様々なサービスの情報が公開されております。
今回は、AWS Glue for Ray の情報が公開されたので、記事の内容をまとめてみました。
AWS Glue for Ray の詳細については、下記リンクを参照ください。


■リンク
- [Announcing AWS Glue for Ray (Preview)](https://aws.amazon.com/jp/about-aws/whats-new/2022/11/aws-glue-ray-preview/)
- [Introducing AWS Glue for Ray: Scaling your data integration workloads using Python](https://aws.amazon.com/jp/blogs/big-data/introducing-aws-glue-for-ray-scaling-your-data-integration-workloads-using-python/)

## AWS Glue
### AWS Glue の特徴

AWS Glue は以下の特徴を持つ AWS サービスです。

- サーバレスなデータ統合サービス
- 複数のソースからデータを検出、準備、移動、統合することが可能
- 分析、機械学習 (ML)、アプリケーション開発が可能

### AWS Glue のメリット
AWS GLue を使うメリットとして、以下の点が挙げられます。

- AWS などのクラウド環境は大規模なデータの保存や利用に適しているため、データ分析に向いた環境
- AWS Glue はデータ分析時の各種 AWS サービスとの連携を一括で管理することが可能
- サーバレスなのでインフラ環境の整備・システム管理が不要


## AWS Glue for Ray
### AWS Glue for Ray とは
Ray は AWs Glue の新しいジョブタイプで、統合化されたオープンソースのコンピュートフレームワークです。
Ray の主な特徴は以下です。

■AWS Glue for Ray の特徴
- Pythonの分散並列処理のフレームワークで、AI や Python のワークロードを簡単にスケール可能
- Python で書かれたアプリケーションであれば、マルチノード環境の分散クラスターで Ray を用いてスケールさせることが可能
- AWS SDK for pandasと組み合わせて、データ分析やMLワークロード実行のためのデータ準備・統合・変換を行うことが可能
- Glue Studio Notebooks、SageMaker Studio Notebook、そしてローカルノートブックや IDE で利用が可能

また、ユーザは AWS Glue job と AWS Glue interactive session primitives それぞれを使うことが可能です。
それぞれの特徴は以下となります。

- AWS Glue job
  - Rayコードを AWS Glue ジョブ API に送信すると、AWS Glue が自動的に必要な計算資源をプロビジョニングしてジョブを実行する、ファイア・アンド・フォーゲットなシステム

- AWS Glue interactive session primitives
  - ジョブ開発を目的としたデータのインタラクティブな探索を可能にする

AWS Glue for Rayは、大きく2つのコンポーネントで構成されています。

Ray Core - 分散コンピューティングフレームワーク
Ray Dataset - Apache Arrowをベースとした分散データフレームワーク

下図は、Rayのアーキテクチャを紹介したもので、Raylet と呼ばれるプロセスを通じて　Ray がどのようにジョブをスケジューリングできるかを説明しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/5e3402c7-4eaa-c44b-1535-b01da728d8ec.png)

ワーカーノードと共有メモリ型オブジェクトストアの構成要素を表しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/14248fff-321c-ea54-6d09-f7085c329c6f.png)

ヘッドノードには Global Control Store が存在し、Apache Spark がワーカーをノードとして扱うのと同様に、各個別のマシンをノードとして扱うことができます。 下図は、ヘッドノードのコンポーネントと、クラスタレベルのメタデータを管理する Global Control Store を表しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/f7f140a7-c791-2fb3-6d84-4cad9a9f2a19.png)


### まとめ
AWS Glue for Ray では、ユーザがこれまで培ってきたスキル・パラダイム・フレームワーク・ライブラリを AWS Glue に持ち込み、最小限のコード変更で大規模なデータセットを扱えるように拡張することを可能にします。

AWS Glue for Rayは、以下のようなユースケースを想定しています。

■ユースケース
- タスク並列アプリケーション（例えば、複数の変換を並列に適用したい場合など）
- Pythonネイティブライブラリの利用だけでなく、Pythonワークロードを高速化する。
- 数百のデータソースにまたがって同じワークロードを実行する。
- MLインジェストとデータへの並列バッチ推論


## おわりに
AWS Glue for Rayについてのまとめは以上となります。
より詳しい情報などについては、本記事をご参照ください。
やることリストを半減させる方法

メモ帳やメモアプリにやることをリストしていくと、項目が多くなり過ぎて管理が大変になることがあります。
でも実はそのやることリストの半分ぐらいは今この場で消せたりします。

その方法は**今できないことを**やることリストから**リマインダーに移す**ことです。

例えば次のようなやることリストを抱えている場合
![スクリーンショット 2022-12-01 18.10.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507537/7a6a0098-fa30-6ee0-832b-5cb109a8741d.png)
**今できないことをリマインダーに移す**とやることリストがスッキリします。
![スクリーンショット 2022-12-01 18.11.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507537/e3057f9d-2d24-1d50-1652-290ced04167e.png)

この時リマインダーを設定する**作業負荷を限りなく少なくする**ことをオススメします。

自分の場合、例えば「帰りにスーパーで卵を買う」をリマインダーに設定したい時は

1. ショートカットでSlackを開く
2. 「/remind スーパーで卵を買う 18:00」と入力して投稿

以上で終了です。
あとは忘れて業務に集中しても帰る頃にリマインドが届きます。

ちなみにSlackのリマインダーでは**日付指定**や**繰り返し**もワンライナーで可能です。
詳しくは[Slackの公式案内](https://slack.com/intl/ja-jp/help/articles/208423427-%E3%83%AA%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%80%E3%83%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)を参照ください。

ちなみにLINEのリマインくんも使いやすいと思います。

![1670056352200.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507537/9b6dc111-ed65-f52e-9972-601827a68802.jpeg)

リマインダーを活用して、やることリストを減らすと気持ちが楽になるのでオススメです。
本日からGomaの学習記録を開始

# はじめに
自身の学習記録として記事を書いていこうと思いたち、本日からGomaの学習記録を開始したいと思い、本記事を書きました。

# 自己紹介
新卒2年目の26歳です。学生時代は情報系を専攻し、自動車関連メーカーに入社しました。
新製品開発の部署からの異動をきっかけにWEBアプリの開発を行うことになったので、学習のアウトプットとして記事を書いていこうと思っています。 学生時代は情報系を専攻しておりましたがITの基礎知識が抜けていたり、そもそもWEB関係の知識が乏しいので、幅広く学習していきます。

# 経験期間：学生時代から社会人まで
- HTML/CSS：2年
- JavaScript：半年
    - Vue2.0：1ヶ月
- Python：3年
    - Flask：3ヶ月
- Go：2ヶ月
- Java：半年
- C言語：半年
- 機械学習：2年
- 画像処理：2年
Databricksの新エディタを試してみる

こちらのマニュアルで説明されているエディタを試してみます。

https://qiita.com/taka_yayoi/items/b6adb35a48e77b4962c8

# 新エディタの有効化

1. 画面右上のユーザー名をクリックして、**ユーザー設定**をクリックします。
1. **ノートブック設定**にある**新しいノートブックエディタをオンにする**にチェックします。
![Screen Shot 2022-12-03 at 17.16.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f31c94ac-260a-e816-b7b8-0e63cdf8643b.png)
1. これでエディタが新バージョンになります。

# オートコンプリート

オートコンプリートを利用するには、ノートブックが稼働中のクラスターにアタッチされている必要があります。新エディタでコーディングしている際に、オートコンプリートが表示されます。[こちら](https://code.visualstudio.com/docs/editor/intellisense)を見ると、VSCodeと同じUIであることがわかります。前のオートコンプリートよりも洗練されている感じ。
![Screen Shot 2022-12-03 at 17.17.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b8cf678c-5f1f-bca6-6331-208b41458b5d.png)

# 変数の確認

変数の上にマウスカーソルを移動すると変数の詳細を確認できます。地味に便利。
![Screen Shot 2022-12-03 at 17.18.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3378e4d2-5df2-5fda-7ef6-6a1325c8112b.png)

# コードの折りたたみ

ブロックごとに折りたたみ・展開できます。これも嬉しい。セルの右側にカーソルを持っていくと矢印が表示されるので、それで表示・非表示を切り替えます。
![Screen Shot 2022-12-03 at 17.18.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7b3d595d-2162-f768-ed59-9ba5519e764b.png)
![Screen Shot 2022-12-03 at 17.18.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e9540d27-1858-1b90-d5be-4732b8ae78c4.png)

# マルチカーソル

同じ様な処理を記述する際には便利かもしれません(私は使いこなせません)。縦方向だけでなくて、任意の場所にカーソルを作成できます(MacならOption押しながらクリック、WinならAlt押しながら)。
![Screen Shot 2022-12-03 at 17.19.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8c29798d-3f01-19d4-5f54-65b3785110d3.png)

# カラム選択

これも正直使い所が。CSV形式のテキストで範囲選択するとかでしょうか。`Shift + Option`を押しながらマウスをドラッグ。
![Screen Shot 2022-12-03 at 17.20.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e744dbd1-dff7-015f-a8f2-cdb2ebb49904.png)

# 隣り合わせでDiffの表示

これは前よりもわかりやすくなりましたね。なお、履歴表示するには画面上に表示されいる`前回の編集はxx前に行われました`をクリックします。
![Screen Shot 2022-12-03 at 17.20.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4092d0cb-3134-266a-e67e-178cf2efecc5.png)

いずれにしても、使いこなせればコーディングの効率が上がりそうです。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
[Swift]配列の中身で一致する型を検索する

## 
先程コードを書いているとき、こんなことを思いました。
「クラスを配列でまとめているとき、あるclassが存在するときだけ特定の処理をしたいなあ」と。

具体的にはこんな具合です。
*5個の異なるTableViewCellなどを配列として持たせておいて、〇〇Cellが含まれるときにだけ、配列の0番目に別のCellを追加したい*
といった感じです。

## サンプルコード

```swift
//Cellしか持たない配列を5つ用意する
final class A: UITableViewCell {}
final class B: UITableViewCell {}
final class C: UITableViewCell {}
final class D: UITableViewCell {}
final class E: UITableViewCell {}

// 今回0番目に差し込みたいCell
final class InsertCell: UITableViewCell {}

private var cellArray = [A(), B(), C(), D(), E()]

if cellArray.contains(where: { $0 is E }) { //Eが含まれる場合にInsertCellを差し込みたい
    // 配列の0番目に追加する
    cellArray.insert(InsertCell(), at: 0)
}  else {
    print("配列にEのCellが含まれない")
}

```

ここでもポイントは**is**になります。
isを用いることがインスタンスに対して型をチェックすることができます。
通常何か比較してチェックしたい場合は`hoge == foo`と書きますが、クラスや構造体の比較に`==`は基本的に行えません。（もちろん行う方法もありますがここでも説明は割愛します。）
そこで**is**を使用することで簡単に型チェックを行うことができるというわけです。
バックエンドのDB操作をSQLのように直感で書けるknex.js（Node.js向けのSQLクエリービルダー）とは

# はじめに
バックエンド開発でNode.js + express を使用する際に、DB操作をどのライブラリを使用したら良いかと思って、たどり着いたのがknex.jsというNode.js向けのSQL Query Builderでした。
本記事はknex.jsの検索、登録、更新、削除の文法をSQLと対比して説明する。

## knex.jsとは
Node.js向けのSQLクエリービルダーである。以下のデータベースに対応している。
PostgreSQL, CockroachDB, MSSQL, MySQL, MariaDB, SQLite3, Better-SQLite3, Oracle, and Amazon Redshift

※Knex.jsの[公式ページ](https://knexjs.org/)から引用



# SQLの文法とknex.jsの文法の対比

## 全件検索
### SQLの場合
```sql
select * from users;
```

### knexの場合
```
knex.select('*')
  .from('users')
```

## 条件検索
### SQLの場合
```sql
select * from users where id = 1;
```
### knexの場合
```
knex.select('*')
  .from('users')
  .where('id', 1)
```

## 登録
### SQLの場合
```sql
insert into users (id, name) values (1, 'Yamada Taro');
```
### knexの場合
```
knex('users').insert({id: 1, name: 'Yamada Taro'})
```

## 更新
### SQLの場合
```sql
update users set name = 'Yamada Hanako' where id = 1;
```
### knexの場合
```
knex('users')
  .update({
    name: 'Yamada Hanako'
  })
 .where('id', 1)
```

## 削除
### SQLの場合
```sql
delete from users where id = 1;
```
### knexの場合
```
knex('users')
  .del()
  .where('id', 1)
```


# さいごに
本記事は、一般的なknex.jsの検索、登録、更新、削除の文法を説明した。
knex.jsの詳細の機能、文法について、下記ガイドを参照ください。
[knex.jsのガイド](https://knexjs.org/guide/)
IaCのSQL版が気になっていたので改めて調べてみる

メタップスアドベントカレンダー第三日目の記事です。
IaCのSQL版が少し前に話題になり、ずっと気になっていたので改めて調べてみました。

# 新たな領域のIaCが登場
最近、IaC(Infrastructure as Code)という言葉が一般的になりつつあり、インフラをコードで管理するという概念が市民権を得てきていると感じています。
代表的なツールとしては
- Terraform
- AWS CloudFormation
- AWS CDK
- Google Cloud Deployment Manager
- Azure Resource Manager

あたりが挙げられると思います。これらは様々なプログラミング言語、YAML、JSON等で記述されます。
IaCのメリットとして
- 開発期間の短縮
- 信頼性・保守性の向上

がありますが、開発者側はインフラ領域に、インフラ側はコードを書く事に対して苦手意識がある人が多く、導入にはそれなりのコストがかかってしまいます。


これに対してインフラの構成をSQLで記述するものが登場しました。既にいくつかツールやSaaSが出ているようで、
- IaSQL
- CloudQuery
- Steampipe
- trino-cloud
- StackQL

といったものが登場しています。
今年の5、6月くらいにTwitterを中心に一時話題となりましたが、まだまだ認知度はあまり無いようで、Googleトレンドを見るとあまり検索はされていないようです。
![image24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343817/57590aea-1b10-b42c-f85a-49b7a9f43565.png)


# 特徴
特徴は以下のとおりです。

- __普段コードを触っていない人でも取っ付きやすい__
インフラエンジニア等コードよりSQLが慣れている人にとっては最初のハードルが低くなるのではないでしょうか。

- __切り戻し方法はDB Snapshotからrestore__
Snapshotからrestoreして過去のインフラ状態を復元します。
DBのsnapshotがインフラのsnapshotになるんですね。Disaster Recoveryの設計等でDBの復旧方法が応用できるかもしれない点面白そうです。

- __システムに組み込みやすい__
やっていることはRDBの操作なので、たとえばWebシステムに組み込んでボタン1つでインフラ環境を簡単に変更できる等作り込みがしやすそうです。
他のIaCは独自のツールやコマンド操作が必要でなかなか導入ハードルは高そうな点を考えるとこの特徴は大きな利点になりそうです。
（AWS CDKは組み込みやすそうだが、マルチクラウドな環境を構築するといった場合対応できない）

# 欠点

欠点は以下が考えられます。
- __既にIaCを導入している組織にあまり旨味が無い__
IaCツールをすでに使用している場合、わざわざ乗り換えるメリットはあまり無さそうです。
SQLを扱える人が多い組織で新たにIaCを導入する際候補に挙がるのではないでしょうか。

- __複雑な処理をするのが大変__
条件分岐等柔軟な記述ができないため、難読SQLが発生しやすくメンテナンス性が悪くなる等SQLを扱う上での困り事が発生しやすそうです。

- __対応可能なクラウド、リソースが限定的__
現在はAWSの一部リソースのみに対応しており、用途が限定的です。
githubを見ると扱えるリソースは増えそうでありマルチクラウドに対応する動きもあるようで将来的には扱えるものは増えると思われますが、現状はまだまだ少ないです。

# 実際に触ってみた
今回はIaSQLというSaaSを触ってみました。

2022年1２月３日時点の画面は以下のようになっており、画面の右はモジュールやスキーマの情報、左はSQLの入力画面、下はSQLの入力結果が表示されていました。
![image23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343817/aacbfc22-3cde-acff-615c-057c50f8c532.png)

### EC2インスタンスを作成
```
# tableにEC2インスタンスの行を追加
INSERT INTO instance (ami, instance_type, tags)
  VALUES ('resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2', 't2.micro', '{"name":"i-1"}');
```
INSERT後のinstanceテーブル
|ID|INSTANCE_ID|AMI|INSTANCE_TYPE|KEY_PAIR_NAME|STATE|USER_DATA|TAGS|	HIBERNATION_ENABLED|REGION|ROLE_NAME|SUBNET_ID|
|-|-|-|-|-|-|-|-|-|-|-|-|
|1|null|resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2|t2.micro|null|running|null|{"name":"i-1"}|null|ap-northeast-1|null|null|


挿入されたレコードの情報を元にAWS環境にapply
```
# AWS環境にapply
SELECT * FROM iasql_apply();
```
apply後のinstanceテーブル
|ID|INSTANCE_ID|AMI|INSTANCE_TYPE|KEY_PAIR_NAME|STATE|USER_DATA|TAGS|	HIBERNATION_ENABLED|REGION|ROLE_NAME|SUBNET_ID|
|-|-|-|-|-|-|-|-|-|-|-|-|
|1|i-XXXXXXXXXXXXXXXXX|ami-0b73aa7c1d1b2e901|t2.micro|null|running|null|{"owner":"iasql-engine","name":"i-1"}|null|ap-northeast-1|null|29|

これで実際にAWS環境にインスタンスが作成されていました。
割と簡単に作成できて驚きです。
[LaTeX]パッケージを自分でインストールする

# 環境

- WSL2上

```bash
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.5 LTS"
```

- TeX Live 2019
    - lualatex
    ```
    $ lualatex --version
    This is LuaTeX, Version 1.10.0 (TeX Live 2019/Debian)
    ...（以下略）
    ```

# 問題

`mhchem`を使おうとすると，`mhchem.sty not found.`とエラー．

おそらく，TeX Liveをインストールしたときにフルインストールしなかったからだと思われる．

# 解決方法

CTANから必要なstyファイルをダウンロードして，適切な場所にインストールする．

# 必要なパッケージ

- `mhchem`：[mhchem – Typeset chemical formulae/equations and H and P statements](https://ctan.org/pkg/mhchem)
- `chemgreek`：[chemgreek – Upright Greek letters in chemistry](https://www.ctan.org/tex-archive/macros/latex/contrib/chemgreek)

# 手順

## 1. ミラーサイトからパッケージのzipファイルをダウンロードして展開

適当なディレクトリ(ここでは`~/Downloads/`)に移動して，`wget`する．

```bash
$ cd ~/Downloads
$ wget https://mirrors.ctan.org/macros/latex/contrib/mhchem.zip
$ wget http://mirrors.ctan.org/macros/latex/contrib/chemgreek.zip
```

次に，ダウンロードしたzipファイルを`unzip`コマンドで展開する
```bash
$ unzip ~/Downloads/mhchem.zip
$ unzip ~/Downloads/chemgreek.zip
```

このとき，ディレクトリ名はパッケージ名と同じにする．（`wget`・`unzip`時に特に変更を加えなければそのようになっているはず）

## 2. styファイルの置き場所を調べる

ほかのstyファイルが置いてある場所を`kpsewhich`コマンドで調べる．例えば`amsmath.sty`は，

```bash
$ kpsewhich amsmath.sty
/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
```

にある．
よって，`/usr/share/texlive/texmf-dist/tex/latex/`に先程展開したディレクトリを置くことにする．

## 3. 展開したディレクトリを置き場所に移動

root権限が必要なことに注意．

```
$ sudo mv ~/Downloads/mhchem /usr/share/texlive/texmf-dist/tex/latex/
$ sudo mv ~/Downloads/chemgreek /usr/share/texlive/texmf-dist/tex/latex/
```

## 4. `mktexlsr`で一覧表を更新

一覧表についての詳細は，本記事末尾の参考記事を参照のこと．

```bash
$ sudo mktexlsr
mktexlsr: Updating /usr/local/share/texmf/ls-R...
mktexlsr: Updating /var/lib/texmf/ls-R-TEXLIVEDIST...
mktexlsr: Updating /var/lib/texmf/ls-R-TEXMFMAIN...
mktexlsr: Updating /var/lib/texmf/ls-R...
mktexlsr: Done.
```

（参考）[LaTeX入門/各種パッケージの利用](https://texwiki.texjp.org/?LaTeX%E5%85%A5%E9%96%80%2F%E5%90%84%E7%A8%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E5%88%A9%E7%94%A8#tc299bdb)

以上．
FlashListで使われているセルリサイクリング

## はじめに

[前回書いた記事](https://qiita.com/alternacrow/private/fc2e5ea3168ed90a5f4f)で、FlashListはRecyclerListViewの機能であるセルリサイクリングを使用していることが分かりました。
今回はその機能が実際にどのように作用しているのか確認していきます。

## 実際に動かしてみる

コードは[こちら](https://snack.expo.dev/@kazuaki.horita/suburi-flash-list-1)。
スマホアプリの[Expo Go](https://expo.dev/client)を使えば、実機で動作を確認することが出来ます。

以下は簡略化したコードになります。

```react
const App = () => {
  const data = useMemo(() => generateRandomColorList(), []);

  const renderItem = useCallback(
    ({ item }) => {
      return <ListItem item={item} />;
    },
    [width]
  );

  return (
    <FlashList
      data={data}
      renderItem={renderItem}
      pagingEnabled
      horizontal
    />
  );
};

const ListItem = ({ item }) => {
  const [visibleIcon, setVisibleIcon] = useState(false);

  const handlePress = useCallback(() => {
    setVisibleIcon((prev) => !prev);
  }, []);

  return (
    <ScrollView>
      <Text style={{ color: item.color }}>{item.color}</Text>
      <Button title="Press" onPress={handlePress} />
      {visibleIcon ? <ThumbsUpIcon /> : null}
    </ScrollView>
  );
};
```

FlashListで使用するdataは、300個のランダムなカラーコードの配列です。
dataのカラーコードを受け取ってレンダリングされるアイテムコンポーネントでは、内部でScrollViewを使用しており縦スクロールが可能です。
また、[Press]ボタンを押すと :+1: がボタン下に表示されるように、アイテムコンポーネント内でvisibleIconというstateを宣言しています。
なにはともあれ、実際の挙動を見てみましょう。

![ezgif-3-0a073164fa.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684679/55312c55-3efe-3c12-60dd-d64e4f6a7a8c.gif)

最初のページでは最下部へスクロールし、2つめのページではボタンを押して :+1: を表示しました。
その後横スクロールを続けていくと、カラーコードは異なるものの、スクロール済みのページや:+1:が表示されているページが何度も繰り返されています。
FlatListではこのような現象は起きないのですが、FlashListではビューポートから外れるコンポーネントを再利用して表示しているため、このような挙動が起きます。

## どう対応していくか

主な対応策としては下記になります。
1. アイテムコンポーネント内でStateを持たず、外部から注入する。
2. propsから渡されるitemの変更を検知してコンポーネントの状態やStateを初期化する。

### 1. アイテムコンポーネント内でStateを持たず、外部から注入する。

この対応はシンプルで、親コンポーネントでStateの管理を行います。
今回の例では、カラーコードの配列のみを扱っているdataの各アイテムデータに対してvisibleIconのプロパティを追加することになります。
handlePressなどのhandlerはextraDataというpropsに渡す方法もあります。

### 2. propsから渡されるitemの変更を検知してコンポーネントの状態やStateを初期化する。

このパターンでは、refやグローバル変数などを使用してitemの変更を検知し、初期化を行います。
例えば下記のような実装です。

```react
const ListItem = ({ item }) => {
  const scrollViewRef = useRef(null);
  const [visibleIcon, setVisibleIcon] = useState(false);
  const lastItemKey = useRef(item.key);
  if (item.key !== lastItemKey.current) {
    lastItemKey.current = item.key;
    setVisibleIcon(false);

    scrollViewRef.current?.scrollTo({x: 0, y: 0, animated: false});
  }

  ...
　
  return (
    <ScrollView
      ref={scrollViewRef}
      ...
    />
```

refで変更前のitemを保持することでpropsから渡されるitemと比較し、
異なるitemが渡される（コンポーネントがリサイクルされる）タイミングで、visiableIconとScrollViewのスクロール状態を初期化することで、コンポーネントのリサイクルが起きていないように見せています。

業務などで対応する場合には、1と2を合わせて対応するケースが多くなりそうですね。
ついでに実際に対応してみた挙動も見てみましょう。
コードは[こちら](https://snack.expo.dev/@kazuaki.horita/suburi-flash-list-2)

![ezgif-4-80b3f37cd7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684679/fb90b0a8-fab3-1371-cc1d-98b3fb2eee99.gif)
diffコマンドで差分を表示する方法

# 概要
diffコマンドを使用するとファイル間の差分を取得できるが、diffコマンドで差分がある場合の終了ステータスは0ではないため、後続する処理がある場合はそこでエラー終了してしまう。  
そのためスクリプトに書いた一連の処理の中にdiffが含まれる場合は、差分があってもエラーとして扱われないようにする必要がある。  

# 対処方法
以下のようなコードで`file_1.txt`と`file_2.txt`の間に差分が存在する場合、`file_1.txt`と`file_3.txt`の差分を取得する前にエラー終了となる。
  
```shell
diff file_1.txt file_2.txt
diff file_1.txt file_3.txt
```

上記の場合でも処理を継続させるには終了ステータスを上書きする必要がある。
  
```shell
diff file_1.txt file_2.txt || true
diff file_1.txt file_3.txt || true
```

`|| true`を後ろに付け加えると差分があった場合でも終了ステータスを0にしてくれる。
linear-gradientとradial-gradientを学び直す

[ひとりCSS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/css-becolomochi) 4日目です。

linear-gradientとradial-gradientを学び直します。

## linear-gradientとradial-gradientとは

グラデーションを作れる。background プロパティの値として指定する。

- linear-gradient()
    - 直線状のグラデーション
    - 初期値は上から下
- radial-gradient()
    - 円形のグラデーション
    - 初期値は中央（原点）から外

### サンプル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41088/7e4f0431-f718-7d1d-320c-b34c14a4fb80.png)


```html
<h2>linear-gradient</h2>
<div class="linear-gradient">
</div>

<h2>radial-gradient</h2>
<div class="radial-gradient">
</div>
```

```css
:root {
  --color1: #edb658;
  --color2: #e7719b;
}

div {
  width: 100px;
  height: 100px;
}

.linear-gradient {
  background: linear-gradient(var(--color1), var(--color2));
}

.radial-gradient {
  background: radial-gradient(var(--color1), var(--color2));
}
```

### linear-gradient に指定する値

- side-or-corner - 軸の開始点の位置
- angle - 軸の方向を角度で示す
- 色とパーセンテージで位置指定


### radial-gradient に指定する値

- position - グラデーションの位置
    - デフォルトは `center`
    - background-position や transform-origin と同じように解釈される
- ending-shape - グラデーションの端の形状
    - デフォルトは `ellipse` （楕円）
    - `center` (円)
- size - グラデーションの端の形状の大きさ
    - デフォルトは `farthest-corner` - 端の図形は一番遠い辺に接する
    - `closest-side` - 端の図形はボックスの中心から一番近い辺に内接する
    - `closest-corner` - 端の図形はボックスの中心から一番近い頂点に接する
    - `farthest-side` - 端の図形は一番遠い頂点に接する
- 色とパーセンテージで位置指定

#### at

- at で細かく位置を指定できる。
- `farthest-corner at 40px` なら、中心位置が40pxずれる。

## 遊んでみた

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41088/dfcaabab-a02a-6473-05e5-d18e8c09238e.png)


## 感想

- linear-gradient
    - `turn` という単位があったの知らなかった。
- radial-gradient
    - ちょっと触っただけではよくわからなかった。
- 引き続き触っていきたい。

## 参考

- https://developer.mozilla.org/ja/docs/Web/CSS/gradient/linear-gradient
- https://developer.mozilla.org/ja/docs/Web/CSS/gradient/radial-gradient
test.js: line 1: syntax error near unexpected token `(' の解決例

## 何が起きた？
ソースコード上（vscode上）ではエラーがないのに実行しようとするとエラーが発生した。

## 原因
実行コマンドを間違えていた。（`sh test.js`と打っていた。）

## 解決方法
`node test.js`で実行できた。
MacでLaTex環境構築 備忘録

超絶久し振りの更新です
内定先でインターンをやらせて頂いているときに，自分の作業ログや得た知見を記事やドキュメントにする習慣を付けることで後から見直せるようにしたいなと思い更新することにしました

## 目的
研究室でそろそろ修論を書かねばならない時期になってきました
Macに変えてからLaTexを使ったことがなかったので，MacでLaTexの環境構築を行うことを目標としたいと思います

## 作業環境
デバイス: Macbook Air M1, macOS Monterey ver. 12.4 
シェル: zsh 5.8.1 (x86_64-apple-darwin21.0)
Homebrew:
Homebrew 3.6.13
Homebrew/homebrew-core (git revision ed1743c1320; last commit 2022-12-03)
Homebrew/homebrew-cask (git revision a724903d42; last commit 2022-12-03)


## やったこと
基本的には以下の記事を参考にしました
https://qiita.com/DaikiSuyama/items/d463c5b7afdabc5fcde5#fnref7

以下のコマンドを実行しました
```
# Homebrewのアップデート（15分程度？かかった）
% brew update && brew upgrade && brew cleanup
# LaTexのインストール（20分程度？かかった）
% brew install --cask mactex
# 環境変数のPATH追加
% export PATH=$PATH:/usr/local/texlive/2020/bin/x86_64-darwin
```

Qiitaの参考記事ではここまでうまく実行できたのですが，以下のコマンドでエラーが発生しました

```
% sudo tlmgr update --self --all

tlmgr: command not found
```

以下の記事より以下のコマンドを実行しました
https://oldbigbuddha.dev/posts/setup-latex-on-mac
```
% eval "$(/usr/libexec/path_helper)"
```

するとこちら実行できるようになりました（エラーは出ているらしいですが）
```
% sudo tlmgr update --self --all

...
tlmgr: package log updated: /usr/local/texlive/2022/texmf-var/web2c/tlmgr.log
tlmgr: command log updated: /usr/local/texlive/2022/texmf-var/web2c/tlmgr-commands.log
tlmgr: An error has occurred. See above messages. Exiting.
```

最後に同じディレクトリに以下ののテンプレファイル（hoge.tex）と.latexmkrcを置いて，以下のコマンドを実行するとpdfが生成されました！
http://www.damp.tottori-u.ac.jp/~hoshi/info/doc-info-2009/sample.tex

```bash:.latexmkrc
#最大のタイプセット回数
$max_repeat = 5;

#DVI経由でPDFをビルドすることを明示
$pdf_mode = 3;

#pLaTeXを使う
#-halt-on-error:初めのエラーで終わらせる
$latex = 'platex %O %S -halt-on-error';

#pBibTeXを使う(参考文献)
$bibtex = 'pbibtex %O %S';

#Mendexを使う(索引)
$makeindex = 'mendex %O -o %D %S';

#DVIからPDFへの変換
$dvipdf = 'dvipdfmx %O -o %D %S';

```

```
% latexmk hoge.tex
```

以上です！
もっと記事を書く習慣を付けて速く記事を書けるようになりたいなあ...


## 追記（2022/12/04）
一度シェルを終了して，こちらのコマンドを実行すると

```
% latexmk hoge.tex

zsh: command not found: latexmk
```

となってしまうので，シェルを再起動する度に

```
% eval "$(/usr/libexec/path_helper)"
```

を実行する必要がありそうです
ここは何かしら工夫できそうな気がするのでまた調べてみたいと思います
今年1年を振り返って


僕自身が、社会人になって10年が経ったのですが、今年一つ自分のキャリアにとっていろいろと考えるきっかけとなったので、そのことについて書いてみたいと思う。

<b>■目次</b>
・自分のキャリアについて考えたきっかけ
・エンジニアと人生コミュニティとの出会い
・エンジニアと人生コミュニティに入ってみて


###### ＜自分のキャリアについて考えたきっかけ＞
新卒から2011年IT業界に入って10年。
月～金曜まで働いていたら、何不自由なく生活できるし、土日もそれなりに楽しんでいました。
休日はぼくの好きな日本酒専門店や、自分の家の近くでおいしいお店を新しく開拓するのは楽しかったし、バトミントンやランニングなどをして運動することも好きだ。

ただそんな日々の生活をしていた中でふと感じたことがあった。
自分が家族をもったり子供ができたりすると、どんな生活になりたいのだろうか？
実家の両親がこのまま高齢になるとどうなるのだろうか？

こういったことを想像した時、ぼくは平日の半分は今のように働き、もう半分は自分で案件をとっていって、自由に動ける状態を作った方がよいと感じた。

まわりをみていても、特に子供が生まれたあと特に女性の方が大変そうな感じはしていたので、ぼくは半分くらいの負担で子育てをやりたいと思っていた。
またボクが子供だった時、父の仕事の影響で全然顔を合わせられなかったので、自分の子供には接する時間を多くしたいとも思っている。
平日の昼間に子供と一緒にあそんだりときには授業参観に参加したり、将来できるであろう奥さんと昼間共にどこか出かける像はボクにとって魅力的だ。

そういったことを想像した時、自分の中で何か変える必要があると感じた。

###### ＜エンジニアと人生コミュニティとの出会い＞
こういったことを考えていた時に、「複業」という言葉を聞くようになった。
「副業」は、一つメインの仕事があって別の仕事をサブでやることだが、「複業」は複数の本業をもつ、ということだった。

今後のボクの将来像のキャリアを考えた時、「複業」することは、自分が家族を持つ上でも大切だし、また発展が著しいIT業界で働くぼくにとって、自分と直接つながっているお客様をもっておくことは大切だと感じた。

それでいろいろと情報を調べていくうち見つけたのが「エンジニアと人生コミュニティ」だ。

https://community.camp-fire.jp/projects/view/280040

実際に入ってみると、実にいろいろなバッググラウンドを持っている人が所属していることに気づいた。
・モバイル（Android、iOS)、Web開発はもちろんITと全く違う業界でメインで働きつつ、個人開発をやっている人
・子育てをしながら仕事をやっている父親
・すでに年収1000万以上の人や、会社を自分で立ち上げている人

ある人は医療関係の仕事をやるかたわら、その仕事の時間の中でちょっとしたアプリをつくって職場の人の手助けになれば、と動いている人もいれば、
もともと人前でパフォーマンスを披露するエンターテイナーがどうしてこのコミュニティにはいっていたりして興味がわいてきた。

こういう条件じゃなきゃ、複業はできないという思い込みを外すにはちょうどよいコミュニティだと感じた。

###### ＜エンジニアと人生コミュニティに入ってみて＞
まず、このコミュニティに入って感じたのが、
・仕事のことだけでなく、人間らしさがつたわるような日常生活の中で感じたことを発信している。
・自発的に情報を発信している。
・ITの相談ごとなどあれば、みんな親身になって答えてくれる。
ということだ。

たとえ、このやりとりがテキストべースであっても十分に人としての暖かさや親しみやすさが伝わってきたのが第一印象だ。
こういう暖かさがあるからこそ、どんどんコミュニティが発展していくし、稼ぐ人も出てくる、全然ITの経験のない人でも受け入れる体制ができているのだな、と感じました。

また、「読書会」や「交流会」、さらに直接対面で会うことができる「オフ会」まで活動が多岐にわたっており、こういう会を通じて、実際にメンバーの方と話してみたりする機会ができました。

特にびっくりしたのが、メンバー一人一人をゲストにまねいて「ラジオ」で生い立ちをインタービューするといった活動だ。
仕事に特化しているのでなくどうしてIT業界に入ろうと思ったかのきっかけや、全然IT関係のないその人の趣味を聞いているだけでおもしろいし、ボクもそのゲストの人と話してみたいと思うきっかけとなっている。

こういった活動に背中を押されて、ぼくも「朝会」（※) を主催する流れになったし、エンジニアとして技術記事をどんどん書いていこうと思うきっかけとなった。

（※) 毎朝出勤前にちょっとした雑談をして、その日1日の活気づけになればと思ってはじめた会。

ボク自身、ITの知識がまったくない状態から1年目4月にお客さんのところで一人常駐することになり、まわりに聞く人がいなくて苦労した経験がある。
いずれかはこういった「朝会」を通じて、これからIT業界に転職を考えている人もどんどん交流していってちょっとでも手助けになったり、共に高めあうような場になればよいなあと思っている。


まだまだぼく自身もこのコミュニティにはいって2か月で、このコミュニティの魅力を完全に感じとれているわけでもないし、自分の仕事に対してまだプラスの成果を出せているわけではない。

ただ少なくても精神的に不安にかんじていたことが、将来どうなるか楽しみといったワクワクに変わるきっかけになった。
来年またこの記事を書く自分自身が楽しみだ。
PG16:Tab completion for identity columns in ALTER TABLE

# はじめに
にゃーん。趣味でポスグレをやっている者だ。

この記事は[PostgreSQL 16 全部ぬこ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/pg16-all-nuko) 5日目の記事です。

今回は``psql``の小ネタ、``ALTER TABLE``コマンドのタブ補完の追加について書いてみます。

# 概要

|項目|内容|
|:--|:--|
|タイトル|[Tab completion for identity columns in ALTER TABLE](https://commitfest.postgresql.org/40/3947/)|
|Topic|Clients|
|ステータス|commited|
|Last Modified|2022-11-01|
|概要|``ALTER TABLE``コマンド のIDENTITY列への操作に関するタブ補完を追加。|

# 変更内容
``ALTER TABLE``コマンドのIDENTITY列に関するいくつかのタブ補完が強化されました。

## タブ補完確認のための設定
以下のような単純なテーブルを作成します。
idという列には``NOT NULL``制約をつけておきます。

```sql
=# CREATE TABLE foo (id int NOT NULL, data text);
CREATE TABLE
=# \d foo
                Table "public.foo"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 id     | integer |           | not null |
 data   | text    |           |          |

=# 
```

この状態で以下の以下の``ALTER TABLE``のタブ補完機能の差を見てみます。

## PostgreSQL 15まで

```sql
ALTER TABLE foo ALTER COLUMN id SET
```
この状態でTABを押すと以下の補完候補が出力されます。

```SQL
(            COMPRESSION  DEFAULT      NOT NULL     STATISTICS   STORAGE
```

## PostgreSQL 16

```sql
ALTER TABLE foo ALTER COLUMN id SET
```

この状態でTABを押すと以下の補完候補が出力されます。

```sql
(            COMPRESSION  DEFAULT      INCREMENT    MINVALUE     NOT NULL     STATISTICS
CACHE        CYCLE        GENERATED    MAXVALUE     NO           START        STORAGE
```
PostgreSQL 15と比較すると、``INCREMENT``, ``MINVALUE``, ``CYCLE``, ``GENERATED``, ``MAXVALUE``, ``NO``, ``START``という語がTAB補完の候補として増えています。

# おわりに

PostgreSQL 16でもpsqlへの改善は継続します。今回上げたコミットのように、タブ補完については、まだまだ強化の余地が残っているのかもしれませんね。
そして、改めてALTER TABLEコマンドは複雑ということを思い知らされました・・・。
［エラー］node_modulesを削除してしまった。npm i.   or.     yarn

reactの作業中にfunctionnsののなかにあるnode_modulesを削除してしまいエラーがでた。
![スクリーンショット 2022-11-15 6.23.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884551/6e709cdd-4a6b-9b8a-0784-f1f6f609e067.png)



# やったこと
 1.　functionsディレクトリに移動　　　cd　functions　コマンド
 2.　functionsディレクトリ内で　npm i　(yarnの人はyarn)


# 結果
node_modulesがインストールされエラーが解決した。
![スクリーンショット 2022-11-28 15.50.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884551/b21375d6-e8b5-aa87-2a9e-0936c1f6b9bc.png)
Vue.jsのcreated()とmounted()の違いについて調べた

Vue.jsのcreated()とmounted()の違いがわからなかったので,勉強がてらライフサイクルフックについて調べました．
参考：[ライフサイクルフックとは](https://reffect.co.jp/vue/vue-js-created-mounted-diffrence#i)
### ライフサイクルフックとは
> Vue.jsの初期化の中の決まったタイミングで実行される関数.
 初期化とはvue.jsが使えるようになるまでのvue.jsの内部で行われる処理のことです。WindowsやMac OSが起動するときに接続しているデバイスを認識したらサービスを起動したりするためにユーザが利用できるまで少し時間がかかります。Vue.jsでも同様にユーザが利用できるまでに内部でさまざまな初期化の処理が行われます。
> 
Vue.jsが適用される対象要素において，どのタイミングでVue.jsを実行するかをプログラムに記述することでVue.jsが動く．

### elとは
Vueライフサイクルの中で出てくるelってなんなん？
> elはVue.jsがマウントを行う要素
> 
 よく見る`el: "#app"` をすることで，elを指定した要素の中でのみvue.jsを動かせる（ちなみに`app` は任意の文字列に変更可）．
LaravelではApp.jsに`el` を指定することで，コンポーネントファイルをVue.jsを記述できるようになっている．

### elには何が入ってる？
 consoleで`this.$el` の中身を確認してみる
```json
<div id="app">
	<p>Hello World!</p>
</div>
```
new Vueしたインスタンスで指定した中身を指していることが分かります．

### 本題
ライフサイクルフックのどのタイミングで`created` と`mounted` は実行されるか？
→`this$el` を使って調べる．
DOM要素がない=`this$el`は存在しない．
```php
created() {
    console.log('created');
    console.log(this.$el);
  },
  mounted() {
    console.log('mounted');
    console.log(this.$el);
	}
```
結果をコンソールで確認
![](https://storage.googleapis.com/zenn-user-upload/919127214659-20221202.png)
`created` は**DOMがレンダリングされる前**に実行され，`mouted` は**DOMがレンダリングされた後**に実行される．
これで，ライフサイクルの図にある通りの動作が確認できました．

### じゃあ，createdは何ができる？
結論：リアクティブ`data`および`events`にアクセスできる．
```php
new Vue({
	el: '#app',
	data: {
		message : 'Hello World'
	},
	created : function() {
	this.message = 'Hello Vue.js'
	console.log('created')
  console.log(this)
	},
});
```
結果をコンソールで確認
![](https://storage.googleapis.com/zenn-user-upload/08fbc83287ef-20221202.png)
createdではVueインスタンスの作成を行い，dataがリアクティブになっている（更新されている）ことも確認できる．

### まとめ
`created`はDOM要素へアクセスは不可(getElementById()とか),Vueインスタンスは生成され，dataオブジェクトがリアクティブな状態になっている（dataへのアクセス，操作は可能）．
`mounted`はDOM要素へアクセス可，Vueインスタンスも作成済，dataオブジェクトはリアクティブ（基本的に何にでもアクセスできる状態）．

ライフサイクルフックは他にも
- `beforeCreate`
- `beforeMount`
- `beforeUpdate`
- `updated`
- `beforeDestroy`
- `destroyed`
こんなにたくさんのフック関数があるんですね…

これらのフック関数にも積極的に触っていきたいと思います．

間違ってたらコメントで教えていただけると幸いです!
AWSでWordPressを動かすPart1

会社の勉強会でおよそ2ヶ月かけてAWS×Terraformについて学んでいる真っ只中です。
そもそもAWSの理解度が低すぎるので、AWSの基礎について書籍を用いて学ぶことにしました！
内容を備忘録として、アウトプットしていきます！
ボリュームが大きいので、何回かに分けて投稿予定で、今回はネットワークの構築にフォーカスした内容です。
## ネットワーク構築編
### IPアドレスのあれこれ　
- パブリックIP
勝手にIPアドレス割り振ることができない公開用のIPアドレス
- プライベートIP
クラスA〜Cの範囲で自由にIPアドレスを割り振ってOKな範囲。
個人開発の場合、大体がクラスCで事足ります。
```
192.168.0.0 ~ 192.168.255.255
```
第2オクテッドまでの`192.168` が`ネットワーク部` 、第3オクテッド以降が`ホスト部` 。
↑は記述が長いため、**CIDR表記かサブネットマスク記法**で記述するのが　一般的。
- CIDR表記
`192.168.1.0 ~ 192.168.1.255`を**CIDR表記**で記述
```bash
192.168.1.0/24
```
`/24`はプレフィックスと呼ばれ、ネットワーク部のビット長で記述しています。簡単ですね。
- サブネットマスク表記
`192.168.1.0 ~ 192.168.1.255`を**サブネットマスク表記**で記述
```bash
102.168.1.0/255.255.255.0
```
ネットワーク部を全て`1` として考える。これも簡単。
### VPCを作成し、サブネットを作成
VPCのCIDRブロックを作成した上で、サブネットでパブリックとプライベートを分けるという手法がよくある。
VPCとしては多めにCIDRブロックを取得し、実際に使うのは小さく区分けしたCIDRブロックというイメージ。
これを行うメリットは
- パブリックサブネットにwebサーバー、プライベートサブネットにDB設置という役割分担を行える。
- 社内のローカル環境であれば、部署ごとにサブネットを分けることで管理しやすい
- サブネットを分散させた方がセキュリティ面で安全
```bash
#CIDR
10.0.0.0/16

#パブリックサブネット
10.0.0.1/24

#プライベートサブネット
10.0.0.2/24
```
### インターネットゲートウェイへの接続
インターネットをVPCに接続します。
VPCにインターネット回線を引き込むイメージ。
### ルートテーブルの設定
TCP/IPプロトコルでデータ送受信を行うためのルールを簡単に↓
- データの送受信には「パケット」を用いる
- パケットには宛先IPアドレス（ディスティネーション）をヘッダー情報に含んでいる
- ルータがヘッダー情報を元にデータをバケツリレー形式で流す
- バケツリレー形式データを流すためにはルートテーブルの設定が必須
- ルートテーブルの設定があれば、ターゲット（流すべきネットワーク先）を判断できる
AWSはこの辺の設定を自動でやってくれますが、TCP/IPプロトコルの原理原則をわかっていた方が障害にも強くなります。

今回はここまでです！
次回はサーバー構築編です！

間違っている場合、コメントで教えていただけると幸いです！
TypeScript opaque type

TypeScriptでidなどを扱う際に意図せず値を代入することがないように型をつけることができる。

```
const idKey: unique symbol = Symbol();
type ID = string & { [idKey]: 'IDENTIFIER' };
```

このようにすることで
ID型 → string型 の代入はできて
string型 → ID型 はできないような型が定義できる。（ID型の実体はただのstring型）

string型をID型として扱うには
``` 
function g_ID(x: string): ID {
  return x as ID;
}
```
こうする。

C++とかでよく使われるらしい。

こんな書き方もあった
```
declare const idKey: unique symbol;
type ID = string & { [idKey]: never };
```
Outlookのデータファイル（pstファイル）とメールアカウントの引っ越し

# 概要

PC交換時などにOutlookを丸ごと引っ越しする方法についてです。

日常的にメール送受信しているPC
 ↓ 
Outlookのメールアカウント設定などを全くやっていないPC

ユーザー名（ActiveDirectoryのユーザーなど）は変わらない。
Outlookのバージョンも変わらない。
pstファイルの場所は標準の『C:\Users\ユーザー名\Documents\Outlook ファイル』。

という前提となります。

# pstファイル

Outlookのデータはpstという拡張子のファイルに入っています。

そこには

* 受信 or 送信したメールデータ。
* 仕訳設定。

などが入っています。

ですが、pstファイルには『メールアカウント情報』は含まれていません。
**『pstファイルを移動』だけでは引っ越しができない** のが注意点です。


# pstファイルの場所確認

左上の『ファイル』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/744e27d6-575a-9465-7e95-b41f9e52ba81.png)

『情報』 ⇒ 『アカウントの設定』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/07646c9c-0ec1-7d1c-99b7-4d31a09be783.png)

『データファイル』 ⇒ 『場所』。
この『場所』にpstファイルのパスがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/80061bd4-69fb-343b-1234-ad3a79e8edce.png)
pstファイルはメールアドレスごとに分かれています。
特別な設定をしていなければ『unko<foo>@</foo>kuso.co.jp.pst』みたいなファイル名です。

# 引っ越し元からメールアカウント情報エクスポート

まずコマンドプロンプトを起動します。

この時『管理者として実行』で起動は **しないように** 。
『管理者として実行』で起動すると想定通りにエクスポートできない場合があります。

下記コマンドでログインしているユーザーのデスクトップにregファイルが出来上がります。

```bat
regedit /e C:\Users\%username%\Desktop\outlook_account.reg HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Profiles\Outlook
```

:::note warn
このregファイルにはサーバーに接続するパスワードは含まれていません。
引っ越し先のOutlookの初回送受信時にはパスワード入力が必要になります。
:::

:::note warn
エクスポートするレジストリの場所は

Microsoft Outlook for Microsoft 365 MSO (バージョン 2210 ビルド 16.0.15726.20188) 32 ビット

におけるものとなっています。
環境によってはレジストリの場所は変わる場合があります。
:::


# 引っ越し先のOutlookはまだ起動しない

pstファイル設置とレジストリ更新が済むまでは起動しないように。

# 引っ越し先にpstファイル置く

引っ越し先PCに下記フォルダーを作ります。

```
C:\Users\%username%\Documents\Outlook ファイル
```

コマンドプロンプトの下記コマンドで作成もできます。

```bat:
md "C:\Users\%username%\Documents\Outlook ファイル"
```

新規作成した上記フォルダーに引っ越し **元** からコピーしてきたpstファイルを置きます。

# 引っ越し先でアカウント情報設定

引っ越し **元** でエクスポートした『outlook_account.reg』を、引っ越し **先** で実行。


下記は『はい』ボタン。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d75cb27d-4701-2098-e0eb-89b7d5579589.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/197bef41-4144-6893-5bd1-3c284faf61d2.png)


# 引っ越し先のOutlook起動

初回起動時に下記が出るので、『規定のプロファイルとして設定』にチェック入れて『OK』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/26ca7a87-e87a-03dc-3408-e2b7965ff387.png)

また、初回の送受信ではサーバーに接続するためのパスワードを入力する必要があります。
レジストリーではアカウント情報は引っ越せるのですが、パスワードまでは引っ越せません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ebaea6ce-fc9a-9569-4b09-e7e13248af59.png)

# 蛇足

レジストリに触るようなことは極力したくないから…

* メールアカウント情報（regファイル）はOutlook初期設定時のみ保存。
* 日常的なバックアップはpstファイルだけ。

で十分かも。

# 参考サイトさん

https://www.saka-en.com/office/outlook-account-migrate/

https://lifekeynotes.com/how-to-open-outlook-without-email-account/

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2311
Microsoft Outlook for Microsoft 365 MSO (バージョン 2210 ビルド 16.0.15726.20188) 32 ビット
python pandas :条件指定による抽出

# query
条件を付けて任意の行を抽出できます。

## code
適当なデータを使って、任意行の抽出を行いました。比較演算子、論理演算子で条件を絞ることができます。また、listや変数も扱うことができます。使用例を下記にまとめてみました。

```python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import pandas as pd
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], 
      'year': [2000, 2001, 2002, 2001, 2002, 2003], 
      'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]} 

df = pd.DataFrame(data)
print(df)
#   state  year  pop
#    Ohio  2000  1.5
#    Ohio  2001  1.7
#    Ohio  2002  3.6
#  Nevada  2001  2.4
#  Nevada  2002  2.9
#  Nevada  2003  3.2

print("\n一致する行の抽出(数値・比較演算子が使える)")
print(df.query('year == 2002'))
#   state  year  pop
#    Ohio  2002  3.6
#  Nevada  2002  2.9

print("\n一致する行の抽出(文字列・比較演算子が使える)")
print(df.query('state == "Ohio"'))
#  state  year  pop
#  Ohio  2000  1.5
#  Ohio  2001  1.7
#  Ohio  2002  3.6
print("\n複数条件に一致する行の抽出(論理演算子を用いる)")
print(df.query('year == 2002 and pop == 2.9'))
#   state  year  pop
#  Nevada  2002  2.9

print("\nlistを使用して出力する")
print(df.query('year == [2001, 2002]'))
#    state  year  pop
#    Ohio  2001  1.7
#    Ohio  2002  3.6
#  Nevada  2001  2.4
#  Nevada  2002  2.9

print("\n変数を利用する")
df_year_count = 2002
print(df.query('year == @df_year_count'))
```
### 比較演算子
queryでは、比較演算子を使うことができます。
|演算子  | 例|Trueとなる条件|
|------|------|---|
|==    |a == b|aがbと等しいとき|
|!=    |a != b|aがbと異なるとき|
|>     |a >  b|aがbより大きいとき|
|>=    |a >= b|aがb以上のとき|
|<     |a <  b|aがbより小さいとき|
|is    |a is b|aがbと等しいとき |
|is not|a is not b|aがbと異なるとき |
|in |a in b|aがbに含まれるとき(a, b は共に文字列、または、b はリストやタプル) |
|not in |a not in b|aがbに含まれないとき(a, b は共に文字列、または、b はリストやタプル)|

### ブール演算子
queryでは、ブール演算子も使うことができます。
|演算子  | 例|Trueとなる条件|
|---|---|---|
|and|a and b|aとbも含まれているとき|
|or |a or b|aもしくはbが含まれているとき|
|not|a not b|aが含まれてないとき|

#### link
参考にしたリンク先です。
[条件指定による抽出](https://potesara-tips.com/pandas-query/)
[演算子](演算子https://www.tohoho-web.com/python/operators.html)
【Python】Listに値を一括で追加したいときは 「extend()」 を使用する

# やりたかったこと
Listに値を一括で追加したい(List同士を結合したい)

## INPUT
```python
list_hoge = [2, 3, 5]
list_fuga = [7, 11, 13]
```

## 期待するOUTPUT
```python
[2, 3, 5, 7, 11, 13]
```

# append()を使用してみる
## ソースコード
```python
list_hoge = [2, 3, 5]
list_fuga = [7, 11, 13]
list_hoge.append(list_fuga)
print(list_hoge)
```

## 結果
「List」として追加されてしまったため、期待するOUTPUTとは異なる形になってしまった
```python
[2, 3, 5, [7, 11, 13]]
```

# extend()を使用してみる
## ソースコード
```python
list_hoge = [2, 3, 5]
list_fuga = [7, 11, 13]
list_hoge.extend(list_fuga)
print(list_hoge)
```

## 結果
期待したOUTPUTと同じ形になった
```python
[2, 3, 5, 7, 11, 13]
```

# 参考にしたもの
Python3 ドキュメント

https://docs.python.org/ja/3/tutorial/datastructures.html
Eclipse　でJava演習～その前に～

# はじめに
スクールや本、progateで学んだことを実際に自分のPCで演習してみるために、Pleiadesをインストールしました。
そもそも新規プロジェクトを作るのになんだか苦戦したので備忘録としてまとめます。
（Pleiadesの中にEclipseが入っているのねー:sweat_smile:）
（ヘルプの虎の巻は英語なのねー:sweat_smile:）

Eclipse IDE for Java Developers (Ver.2022-09 (4.25.0))を使用

# Javaプロジェクトの作成
先ずはパッケージ・エクスプローラで右クリック。
「新規」から「Javaプロジェクト」を選択。
![スクリーンショット_20221203_153629.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984665/51fb3eac-e95a-0c23-c837-1987f80daeab.png)

プロジェクト名は任意でOK！（ここ適当にして、いつも後で困る）
とくに他に触れず「完了」
![スクリーンショット_20221203_154057.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984665/ac637724-fe61-ae9b-5ade-9fa4bfb40b2b.png)


できてますね。
![スクリーンショット_20221203_154432.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984665/2f273b62-7ea8-8bdc-7e2a-83d5284a1c21.png)

# クラスの作成
作成したいプロジェクトの上で右クリック。
「新規」から「クラス」を選択。
![スクリーンショット_20221203_154705.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984665/c53e4262-454d-302b-65ce-fc00f9b068d0.png)

クラス名を任意でつけたら完了。
※public static void main(String[] args)を打つの面倒なんでいつもここで甘えます。
![スクリーンショット_20221203_154742.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984665/eb67c49d-6d1c-f21a-11af-eaca50afe0d7.png)

この備忘録を忘れるくらいがんばるぞー！:triumph:
![スクリーンショット_20221203_155240.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984665/52296b2a-4a49-e6c1-aff1-a12d2ee79e61.png)

参考サイト
https://sukkiri.jp/technologies/ides/eclipse/eclipse_basic_use.html