OmniAICreator/Qiita-1.07M huggingface dataset:
CallableStatement

derbyにprocedure登録。https://qiita.com/Natukasi/items/23476095cc798d41fa58
```java
public class ProcedureExample {
    public static void method(String pname) {
        try {
            Connection con = DriverManager.getConnection("jdbc:default:connection");
            String sql = "update firsttable set name = ? where id = 10";
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(1,pname);
            ps.executeUpdate();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
    
}
```
```java
public class Outer {
    public static void main(String[] args) {
        try {
        Connection con = DriverManager.getConnection("jdbc:derby://localhost:1527/data/Sample");
            try(con) {
                shokai(con);
                String proc = "CALL UPDATE_ITEM(?)";
                CallableStatement cs = con.prepareCall(proc);
                cs.setString(1,"change name");
                cs.execute();
                shokai(con);
            }
        } catch (SQLException ex ) {
            ex.printStackTrace();
        }
    }
    static void shokai(Connection con) {
        try {
            String sql = "select * from firsttable";
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while(rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                System.out.println(id + ":" + name);
            }
        } catch (SQLException ex ) {
            ex.printStackTrace();
        }
    }
}
```
```
10:TEN
20:TWENTY
30:THIRTY
60:sixty
50:sixty
90:AAA
110:hundred ten
200:one hundred
210:hundred ten
10:change name
20:TWENTY
30:THIRTY
60:sixty
50:sixty
90:AAA
110:hundred ten
200:one hundred
210:hundred ten
```
github pagesの使い方を初心者向けにわかりやすく説明


  # GitHub Pagesとは
      GitHub Pagesとは…GitHubが提供するホスティングサービスのこと。
      GitHubのリポジトリがベースなので、GitHubを使っていれば簡単に公開することが可能です。
## 手順
:::note warn
注意
- GitHubのツールなので、アカウントを持っていないと使うことはできません。
- githubのアカウントがない場合は[ここから](https://github.co.jp/)作成。
:::

    STEP1: リポジトリの作成
 まず、GitHubにログインして右上のメニューから「New repository」で新しいリポジトリを作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126024/dfccdddd-3a65-f480-cb67-c70c2d0882d0.png)
引用元： https://i0.wp.com/colorfree-map.com/wp-content/uploads/2021/01/tsubasa-ito__tsubasa-ito_.jpg?resize=626%2C527&ssl=1

リポジトリ名を決める。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126024/d496c865-b8b4-79a5-7c2e-d5a74513e054.png)
引用元: https://i0.wp.com/colorfree-map.com/wp-content/uploads/2021/01/Create_a_New_Repository.jpg?w=908&ssl=1

Create repositoryをクリックして新規リポジトリの作成が完了。ここで、緑で囲んだリンクをコピーしておいてください。後に使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126024/77280e70-0cab-aa55-a493-c1088c54e585.png)

Create repositoryをクリックしたら上のような画面になると思います。

    STEP2: GitHubにプッシュする
ターミナルにて公開したいフォルダに移動。
`git add .`→`git commit 'initial commit'`→`git remote add origin 先ほどコピーしたURL`→`git push origin main`でGitHubとファイルを連携させます。

自分GitHubのリポジトリのページに戻って更新してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126024/29e153dc-2eac-90c8-5f5e-c91def43f093.png)
引用元: https://i0.wp.com/colorfree-map.com/wp-content/uploads/2021/01/36bbbdce4ad05890f591e21202aaaf0e.jpg?w=1200&ssl=1

この画面になったら成功です。

    STEP3: Step3：GitHub Pagesを設定

最後にGitHub Pagesで公開していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126024/c481d623-22e8-e307-57c0-a47baaa871ba.png)
引用元： https://i0.wp.com/colorfree-map.com/wp-content/uploads/2021/01/tsubasa-ito_github-pages-prekansei.jpg?w=1200&ssl=1

Setting>Options の下の方に『GitHub Pages』にいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126024/63c8b3ca-856c-965f-190c-a81fb1a0983e.png)
引用元： https://i0.wp.com/colorfree-map.com/wp-content/uploads/2021/01/Options.jpg?w=1026&ssl=1

「Source」の欄を『None』→『Branch : master』に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126024/41c7529d-d3e0-dc48-8dd6-506189aa833a.png)
引用元： https://i0.wp.com/colorfree-map.com/wp-content/uploads/2021/01/Options-ok.jpg?w=1002&ssl=1

すると画面がリロードし、『https://GitHubのアカウント名.github.io/リポジトリ名/』 のように右上にリンクが発行されます。
例：https://tsubasa-ito.github.io/github-pages-pre/

そのリンクをクリックしてみると、Webページが公開できているはずです。

これで終わりです！お疲れ様でした！
9kmovies: A Comprehensive Platform for Watching Movies

Are you looking for a comprehensive platform to watch movies? Then 9kmovies is the perfect website for you! 9kmovies provides an extensive library of movies from all genres, ranging from horror to comedy, adventure to romance. The website also offers a variety of streaming options and quality settings, so you can choose the best way to watch your favorite movies.

9kmovies wine has an easy-to-use interface that makes it simple to find what you're looking for. With its advanced search feature, you can easily filter by genre, release year, quality, and more. You can also sort by rating and popularity to find the most popular films on the site. And if you're not sure what movie to watch, there are several curated lists of recommendations based on different themes.

In addition to its large selection of movies, 9kmovies also offers TV shows and documentaries. With a wide range of topics and genres, there's something for everyone on this platform. Plus, the website frequently updates its library with new releases so you'll always have something new to watch.

One of the great things about 9kmovies is that it allows users to download content directly to their device without having to use any third-party software or apps. This makes it incredibly convenient for those who prefer watching movies offline or on the go.

Overall, 9kmovies is an excellent resource for movie fans looking for a comprehensive platform with an easy-to-use interface and plenty of content options. Whether you're in the mood for a classic film or the latest blockbuster, 9kmovies has something for everyone.
https://www.techtoreview.com/top-picks/9kmovies-wine.html
エンジニアインターン13日目

lambdaの関数urlを使ってDBから一定の情報だけを取って配列に渡す機能を実装しようとした。apiの知識も食い込んできて難しかった。先輩エンジニアが何回も優しく説明していただきとても助かった。しかし、完成まではいかなかった…また次チャレンジだ！エンジニアインターンも約1ヶ月の期間が過ぎた。1ヶ月間で学んだことはエラーの解決法やwordpress,awsなどの新しい技術をたくさん学ぶことができた。まだまだできないことだらけだが、自分に新しい技術を任せていただき、課題にぶつかりながら成長できる環境だと思う。毎日感謝を忘れずに一生懸命にやっていきたい。
AWS CodePipeline - aws ecr get-login-password ... docker login が失敗する ( pre_build )

# buildspec.yml

チュートリアル通りのだいたいこんなやつ

```yaml
version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws --version
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin 012345678910.dkr.ecr.us-west-2.amazonaws.com
      - REPOSITORY_URI=012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=${COMMIT_HASH:=latest}
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $REPOSITORY_URI:latest .
      - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker images...
      - docker push $REPOSITORY_URI:latest
      - docker push $REPOSITORY_URI:$IMAGE_TAG
      - echo Writing image definitions file...
      - printf '[{"name":"hello-world","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
artifacts:
    files: imagedefinitions.json
```

# エラー例

```
[Container] 2023/02/08 09:45:48 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin *********.dkr.ecr.ap-northeast-1.amazonaws.com. Reason: exit status 1
```

# 解決

ビルドプロジェクト > ビルドの詳細 > サービスロール

のリンクからIAMでポリシーを許可することで解決した
( *EC2InstanceProfileForImageBuilderECRContainerBuilds* を追加 )

![image](https://user-images.githubusercontent.com/13635059/217496514-6ecbc0eb-060d-4c12-bf3b-384bf04ef405.png)

![image](https://user-images.githubusercontent.com/13635059/217496520-815bde40-ce50-4f23-a189-62407a55cae5.png)

![image](https://user-images.githubusercontent.com/13635059/217496522-3e241e3a-ec60-42a2-99f6-05b5d6f4039d.png)


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
json-server tips

# json-serverとは何？
expressベースのAPIモックサーバーです。
通常のAPIモックサーバーとしてJSONを定義するだけで簡単に使えます。
また、DBを内蔵しており、POSTなどの更新にも対応しているようです（未使用）
追記：直接、db.jsonを書き換えるようです。

例えば以下のようなJSONファイルを用意するだけでモックサーバーが簡単に作れます。
```json:db.json
{
  "posts": [
    { "id": 1, "title": "json-server", "author": "typicode" }
  ],
  "comments": [
    { "id": 1, "body": "some comment", "postId": 1 }
  ],
  "profile": { "name": "typicode" }
}
```

CLIで以下のコマンドを叩くことでモックサーバーが起動します。

```bash
$ json-server --watch db.json
```

但し、後述しますが、CLIにはバグがあるため、モジュールを書くのが無難です。

# Tips

## 複数階層のルートを指定したい
そのままだと指定できないため、rewriterを利用して、リクエストがあったルートを書き換えます。
例：/hoge/barへのアクセスを/barへ流す

```javascript
server.use(jsonServer.rewriter({
  "/hoge/bar": "/bar",
}))
```

## POSTメソッドなどでJSONを返却したい
そのままだと更新系APIとして動作してしまうため、midddlewareでGETメソッドへ置き換えます。
```javascript
server.use(middlewares)

server.use((req, res, next) => {

  if (req.method === 'POST') {
    req.method = 'GET';
  }
  next();
});
```

## CLIからmiddlewareを指定しても機能しない
公式にもサンプルが載っているのにCLIからはバグで使えません。
モジュールを書く必要があります。

https://github.com/typicode/json-server/issues/996
No4_ググったこと投稿(5分)_IP関連


## 目次
 [1.IPアドレスとは](#1-IPアドレスとは)
 [2.IPアドレスどうつながる](#2-IPアドレスどうつながる)
 [3.IPアドレスの枯渇問題](#3-IPアドレスの枯渇問題)

# 1. IPアドレスとは
- スマホやPCなど、ネットワーク上の機器に割り当てられるインターネット上の住所のようなアドレス
    - グローバルIPアドレス
        - 世界中で通用するIPアドレス
    - プライベートIPアドレス
        - 自宅や会社など特定のネットワークの範囲内で用いられるIPアドレスのこと
## IPアドレスはどこから？
- ICANNと呼ばれる組織に管理されていて、ICANN→JPNIC（日本組織）に割り振られ、ISP（インターネット・サービス・プロバイダ）を経由し、ユーザーに振られる


# 2. IPアドレスどうつながる
- グローバルIPアドレスが、外部との連絡するための外線電話、プライベートIPアドレスは内線電話のような感じ
![スクリーンショット 2023-02-05 23.43.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/03147ba5-33c1-f44e-7a5e-7793abc778e6.png)

# 3. IPアドレスの枯渇問題
- IPv4
    - 0〜255の数字4組の番号を割り振る「IPv4」というプロトコルを採用し、約43奥通りかんりできる予定だったが、Iotが爆発的に増え、IPv6が新たに作られた
``` IPv4：198.51.100.100（43億通り） ```
- IPv6 
    - 4桁の英数字8組で表記するIPv6では43億✕43億✕43億✕43億までIPアドレスを管理できる
``` IPv6：2001:0db8:0000:0000:0000:0000:0000:0001（43億の4乗通り） ```

参考）
https://am.arara.com/blog/20190625_ipaddress
Pythonのf-stringの!

# 手短に
下記のような表示をしたかった。
```
a=1
b='hello'
```
文字列の時はクオーテーションマークをつけたいが、`f"b={b}"`だとうまく行かない。
こうすると良い。
```python
print(f"b={b!r}")
# b='hello'
```
`!`以降はconversionを示す。
>```
>replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"
>field_name        ::=  arg_name ("." attribute_name | "[" element_index "]")*
>arg_name          ::=  [identifier | digit+]
>attribute_name    ::=  identifier
>element_index     ::=  digit+ | index_string
>index_string      ::=  <any source character except "]"> +
>conversion        ::=  "r" | "s" | "a"
>format_spec       ::=  <described in the next section>
>```
>field_name の後に、感嘆符 '!' を挟んで conversion フィールドを続けることができます。
>現在 3つの変換フラグがサポートされています: 値に対して str() を呼ぶ '!s' 、 repr() を呼ぶ '!r' 、 ascii() を呼ぶ '!a'。
# ソース
https://docs.python.org/ja/3/library/string.html#format-string-syntax

# 蛇足＆感想
`f"b={repr(b)}"`でもよい。
知らなかった。
【Golang】go.mod file not found in current directory or any parent directory.の対処法

## はじめに
最近Golangの学習を始めました。ざっと[A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)を一通りやったので、実際に何かを書いてみようと思い、Go+Gin+Gorm+Mysql+Docker+Nginxで簡単なAPIを作成しようとしていました。そんな時に下記のようなエラーに遭遇したので、備忘録がてら記事にします。

## 実行手順とエラーの内容
さて、簡単なREST APIを作成するために、Dockerで環境を構築しようと下記のように最小構成でDockerfileを記載しました。

```dockerfile:Dockerfile_修正前
FROM golang:1.20.0-bullseye

WORKDIR /data

RUN apt-get update \
    && apt-get install git \
    && go get github.com/gin-gonic/gin \
    && go get github.com/jinzhu/gorm \
    && go get github.com/go-sql-driver/mysql
```
早速コマンドを叩いてビルドしようとすると、
```bash
$ docker compose build
```
下記のようなエラーに遭遇しました。
```bash:実行結果
// (省略)
go: go.mod file not found in current directory or any parent directory.
       'go get' is no longer supported outside a module.
       To build and install a command, use 'go install' with a version,
       like 'go install example.com/cmd@latest'
       For more information, see https://golang.org/doc/go-get-install-deprecation
       or run 'go help get' or 'go help install'.
```

こちらを翻訳すると、

:::note warn
go.mod ファイルが現在のディレクトリまたは親ディレクトリに見つかりませんでした。コマンドをビルドしてインストールするには、'go install example.com/cmd@latest' のように、バージョンを指定して 'go install' を使ってください。詳細については、https://golang.org/doc/go-get-install-deprecation を参照するか、 'go help get' または 'go help install' を実行してください。
:::

とのこと。

つまり、本エラーは`go.mod`ファイルがなかったことが原因でした。（多分ものすごーく初歩的な躓き・・・）

## 解決策 ： Dockerfileにgo.modファイルを作成する処理を追記する
先ほど原因だと判明した「`go.mod`ファイルがないこと」に対して、アプローチをしていきます。解決策は単純で、下記のようにDockerfileに対して、go.modのファイルを追加するコマンド`go mod init ＜プロジェクト名＞`を追記します。
```diff_docker:Dockerfile_修正後
FROM golang:1.20.0-bullseye

WORKDIR /data

+ RUN go mod init web-service-gin
+ RUN go mod tidy

RUN apt-get update \
    && apt-get install git \
    && go get github.com/gin-gonic/gin \
    && go get github.com/jinzhu/gorm \
    && go get github.com/go-sql-driver/mysql
```
これを実行すると、
```bash:実行結果
// （省略）
[+] Running 3/3
 ⠿ Container web-service-gin-web-1  Running  0.0s
 ⠿ Container web-service-gin-db-1   Running  0.0s
 ⠿ Container web-service-gin-app-1  Running  0.0s
```
となり、上手くコンテナが立ち上がりましたね。

※ コンテナはGolang(App)、Nginx(Web)、Mysql(Db)の3つを立ち上げています

go.modファイルについては下記サイトに詳しく記載があったので、よければご覧ください。

https://go.dev/ref/mod#go-mod-file

## おわりに
「go.mod file not found in current directory or any parent directory.」の対処法は以上です。サーバーサイドでは初めてPHP以外の言語を扱っているので（新卒の会社でC言語は研修で触りましたが）、超初歩的な内容となっています。

今後は業務でずっとPHP（Laravel）を触ってきて、現在Golangの学習をしている人に向けて、それぞれを比較しながら記事を書けたらいいなあと何となく思っています。

何かご指摘等あればコメントいただけると嬉しいです。
初投稿！自己紹介

初めまして！YOSHIKIと申します！
現在オンラインスクールでプログラミングを学んでます。
主にRubyを学んでおります。

勉強する中で発信力の大事さを知り、自分が学んだ事を言語化して投稿して
自分自身の成長に繋げる目的でQiitaを利用させて頂いてます！

またいろいろな方々の投稿も確認しながら知識を得ていけたらなと思っております！

これから宜しくお願いします！！
stable diffusion 関連資料

# 初めに
Stable Diffusionに関する資料を集めておきます。定期的に更新します。

# プログラム
1. Web UI
    1.   AUTOMATIC111 本家： https://github.com/AUTOMATIC1111/stable-diffusion-webui
    1.   設置方法：https://nanorisia.com/stable-diffusion2-1-web-ui/
    1.   https://koubou-rei.com/entry/stable-diffusion-web-ui
    1.  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/1eafd753-2d90-b261-c63e-2ca093efa4f6.png)

    1.  
1.   GUI Windows
    1.   NMKD　：https://nmkd.itch.io/t2i-gui
    1.    設置方法： https://gigazine.net/news/20220831-stable-diffusion-windows-gui/

# Video
1. deforum-stable-diffusion https://github.com/deforum-art/deforum-stable-diffusion
# Prompt Search
positive: perfect realistic eyes, 8k Resolution, octane render, realistic lighting
negative:Bad anatomy, Bad hands, Bad Face, Bad eyes
1. Lexia:　https://lexica.art/
1. Ptsearch : https://www.ptsearch.info/home/
https://www.ptsearch.info/articles/detail/90a56ef1-a3d0-4929-a664-a044629c3b57
positive : a 3 d film animation still portrait of a 2 1 0 0\s manga heroine, finely detailed features, sun light, painted by greg rutkowski, akira toriyama studio ghibli

negative: (bad quality, worst quality, low quality:1.6)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/29b00738-4f5f-a8b9-8eec-aee958eaa6b4.png)

1. chichi-pui : https://www.chichi-pui.com/

# Model Search
https://civitai.com/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/0fbab903-2126-9af3-adaa-cfda6829661b.png)


# ControlNet
1.設置方法　https://gigazine.net/news/20230216-stable-diffusion-controlnet/#1



# API
1. kerascv :  https://keras.io/api/keras_cv/models/stable_diffusion/
1. A Keras / Tensorflow implementation of Stable Diffusion. : https://github.com/divamgupta/stable-diffusion-tensorflow

#起動バッチスクリプト(Windows 11)
1. stablediffusion.batを作成

前提条件
Windowsユーザー名：your_id
Stable Diffusion保存フォルダ：c:\stable-diffusion-webui

```batch
rem @echo off
set local
cd C:\Users\your_id
rem 仮想環境立ち上げ
call C:\Users\your_id\anaconda3\Scripts\activate.bat
call activate stable_diffusion_py310
cd c:\stable-diffusion-webui
webui-user.bat

```
*　参考資料全般
https://qiita.com/peka2/items/fdef492bcae84580edf4
RaspiのSSH公開鍵の設定とiPhoneショートカットでのSSH接続

# 環境

* 下記サイトに従って昔設定したRaspberryPi

https://qiita.com/c60evaporator/items/ebe9c6e8a445fed859dc

* Windows 11

# 作業

まず、公開鍵認証を使わない、パスワードでのログインを試みた。
以前パスワードログインは無効にしていたため、
raspi上の
`/etc/ssh/sshd_config`
の
`PasswordAuthenticaiton No`
をコメントアウトしておく。
(※なお、画像はWindows11からssh接続したもの。以前設定した情報でログインできている)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/e709151f-5fb5-0491-0e34-c8e01286df20.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/e4c8fb1a-5455-ab7a-059e-499c7ef2b13f.png)

そして忘れずsshをリスタート。じゃないと変更が適用されない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/6dcdb918-2d3f-527c-dda1-fb6f6be2cef9.png)

次にiPhoneのショートカットで`ls`の実行。
認証方法はパスワード。
右下の再生ボタンを押すと、コマンドブロックの下に実行結果が出力された。
ホームディレクトリで`ls`が実行された様子が分かる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/82260083-68ce-2dd1-0f41-032d5c224566.png)

次に、認証をSSHキーに変更。
(※以下は実行後のキャプチャなので、実行結果がすでに出力されている)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/b2910c19-d9c1-dad4-d7bf-b1283c0d4370.png)

`SSHキー ed25519キー`をタップすると以下のような画面が現れ、公開鍵をテキスト形式でコピーできる。
メールやSlackなどで上手く文字列をraspiと共有する。
Windowsでssh-keygenを使うと.pubというファイル形式で公開鍵が出力されるから、大層な情報が入っていると勘違いしていた。単純な文字列だったとは思わなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/c8a50f90-f3ef-3778-1d43-3ea5b1d4682e.png)

共有したSSHキー文字列は`~.ssh/authorized_keys`に追加する。
`vim authorized_keys`
で新しい行にSSHキー文字列を丸々コピペ。日本語が入っているのが不安だったが、問題なかった。
ssh-ed25519 以降が今回新しく追加した公開鍵。
authorized_keysってこんな風に単純に書き加えていけば良いって知れて良かった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/3e627fad-0274-e2bb-e7ef-a330186ee3b7.png)

右下の再生ボタンで実行すると結果が下に出力される。
(※先ほどと同じ画像)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/b2910c19-d9c1-dad4-d7bf-b1283c0d4370.png)

iPhoneのショートカットはnfcタグをトリガーに出来るから、
これと組み合わせればraspiを経由して出来ることは何でもnfcタグが出来る。
AR FoundationのAR Occlusion Managerを使ったときって実機でどこまで動くの？

## 事の始まり
AR FoundationにAR Occlusion Managerってあるなぁ
でもAR CoreとAR Kitでオクルージョンの処理は別ものなのにどうやって共通化しているんだろ？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705249/84616200-b776-3946-38b0-0970b137149c.png)

実機で見たときにどんな動作の違いが出るんだろうか？？

検証しました！

## 環境
Unity 2019.4.29f1
AR Foundation 4.1.7

Device:
* Android
    * SONY Xperia 1 III (Depth API対応機種)
    * Huawei P20 Pro(Depth API非対応機種)
* iOS
    * iPhone 13 Pro Max (LiDAR搭載機種)
    * iPhone 11 (LiDAR非搭載機種)

## やったこと
ARアプリを作成、AR Occlusion Managerを以下のように設定
Environment Depth Mode： __Best__
Human Segmentation Stencil Mode： __Best__
Human Segmentation Depth Mode： __Best__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705249/84616200-b776-3946-38b0-0970b137149c.png)

シーン再生中に、AR Occlusion Managerの
currentEnvironmentDepthMode
currentHumanDepthMode
currentHumanStencilMode
↑の状態を表示する

## 結果
見やすくまとめるとこんな感じ

|  | SONY Xperia 1 III <br/>(Depth API <br/>対応機種) | Huawei P20 Pro <br/>(Depth API <br/>非対応機種) | iPhone 13 Pro Max  <br/>(LiDAR搭載機種) | iPhone 11 <br/> (LiDAR非搭載機種) |
| :---: | :---: | :---: | :---: | :---: |
| __Environment Depth Mode__ | ◯ | × | ◯ | × |
| __Human Segmentation Stencil Mode__ | × | × | ◯ | ◯ |
| __Human Segmentation Depth Mode__ | × | × | ◯ | ◯ |

◯：Best
×：Disabled

Human Segmentation はAR Kitの機能なのでAndroid(AR Core)で出来ないのは納得です

LiDARの有無によってEnvironment Depthができないんですねー
確かにAppleのサイトにこんな記述があります
>Depth API
LiDARスキャナに内蔵された高度なシーン認識機能により、周囲の環境についての深度情報がピクセル単位で利用可能になります。
この深度情報を、シーンジオメトリによって生成された3Dメッシュデータと合成することで、バーチャルオブジェクトを瞬時に配置して、
周囲の物理的な環境とシームレスに溶け込ませることで、よりリアルなバーチャルオブジェクトオクルージョンを実現できます。
これにより、さらに精密な測定をしたり、ユーザーの環境にエフェクトを適用するといった、新しい機能をAppに搭載できるようになります。

https://developer.apple.com/jp/augmented-reality/arkit/#:~:text=Depth%20API,%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82


## まとめ
* Android (Depth API対応)
    * 机、壁などのみオクルージョンできる
* Android (Depth API非対応)
    * オクルージョンできない
* iPhone (LiDAR非搭載)
    * 人間の全身、人体の一部のみオクルージョン出来る
* iPhone (LiDAR搭載)
    * 机、壁などに加えて人間の全身、人体の一部もオクルージョンできる
githubのプルリクエストのわかりやすい書き方について

## はじめに
今回ほぼ初めて案件に入ることになり、他メンバーと共同で作業をすることになったので相手を気遣ったgithubの使い方を覚えていく。
とにかく思いやり。

## PR(プルリクエスト)の内容を記載する
どういった点を確認してほしいか、どのような変更があるのかを理解してもらうために内容は必ず記載する。

### Issue の記載
Issueに課題を書いてある場合はそこのリンクに紐づくように、`#数字`で書いてあげることでリンクでIssueへ飛べるようになるので書いてあげると親切

### 概要の記載
項目名はなんでも良いが、わかりやすく概要などとしてあげる。
- 今回のPRで何を見てほしいか
- PRを出した理由など

ルールはないと思うが、できるだけわかりやすく書いてあげると良さそう。

### 確認方法
テストだったりをPRしてもらいたい場合は、具体的なコマンドなど貼ってあげると親切。

### レビュー観点
具体的に何をレビューしてもらいたいか記載してあげると親切。
また対象ファイルなど細かくあるようなら、ここにマークダウンなどを使ってファイル名を書いてあげる。

### その他
上記に書ききれない場合だったり、あえて分けたい場合はその他などにまとめてあげると良さそう。

マークダウン形式で書くことができるので、段落を分けてあげたりとわかりやすく書いてあげることが重要。

## PRの指摘に関する修正時のコメントの書き方
### 修正後の差分がわかるようにリンクを貼ってあげる
PRを出したあと修正が入ってくると思うが、このときだた「修正しました」とかだけだと、どの箇所が修正されたか差分がわからない。
コミット・プッシュをしてあげるとgithubの`Commits`箇所に新たにプッシュされた変更コードが反映されるので、そこのコミット詳細をコピーして添付してあげる。そうするとリンクが作成されるので、一発で対象箇所の差分へ飛ぶことができ、レビュアーの労力をへらすことができる。
![スクリーンショット 2023-02-08 17.39.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589286/8448fcd9-fd0b-fe94-2cf5-d0d9c65d953c.png)

![スクリーンショット 2023-02-08 17.41.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589286/ba214bed-0bf8-3fd8-9f91-c1f551b9598f.png)

### なるべく1つの指摘毎にコミット・プッシュする
上記にあげた部分は1つのコミットごとに作成がされます。
なので1つのコミットにいろんなファイルの修正がされていると結果ごちゃごちゃしてしまいます。

レビューワーの方がわかりやすいようにできる範囲でコミットをわけるようにしましょう!

## 最後に
レビュワーは常にいろんな案件を抱えている可能性があるので、レビューをしてもらう上で極力労力を割かせないように気を配ってあげる必要がある。
書き方をマスターして常にわかりやすいPRを出せるようになりたいですね。

以上
5分で作る【VS Code×Docker×Python環境】の作り方

# 概要
VS CodeとDockerのインストールが完了していることを前提に、5分程度でひとまず、Pythonを動かせる状況までもっていきます。**本当に必要最低限の環境だけ**作ります。

VS CodeでDockerを使い、Pythonで開発したいと思ったので、その備忘録として。

## 環境
Windows11です。
あと、VS CodeとDockerDesktopのインストールができている状況を想定しています。

## 事前準備
VS Codeの拡張機能から『Dev Containers』と検索してインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687015/9372edc0-90be-2e36-bbd8-075accc89a83.png)

どこでも良いので、テキトーにフォルダを作ります。
```
└ .devcontainer/
　　├ devcontainer.json
　　└ Dockerfile
```

そしたら、```devcontainer.json```に次の内容を書きます。
```
{
	// 名前を付ける。何でもOK
	"name": "PythonEnvironmentSample",
	
	// Dockerfileでイメージ・コンテナを作成
	"dockerFile": "Dockerfile",
	
	// リモート先のVS Codeにインストールする拡張機能
	"extensions": [
		"ms-python.python"
	],
}
```

次に```Dockerfile```を開いて次のような内容を書きます。
```
FROM python:3

RUN pip3 install pandas
RUN pip3 install numpy
```
- ※1：Python3環境を作っています。
- ※2：インストールしたいライブラリはここで記載しておきます。後でターミナルからpipコマンドで入れることもできますが、事前に入れたいライブラリがあるときは先に入れておいた方がラクだと思います。


## 起動させる
VSCodeをここから触っていくのですが、その前にお作法として、まずはDockerDesktopを起動させておきます。

ウインドウの左下のほうにある「><」みたいなマークをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687015/b9e5633f-a92a-f7f5-dc79-6b5b768eea3a.png)

そうすると画面中央上の方に、下画像のようなものが出てくるので、「Open Folder in Container」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687015/a6c6deb7-43f9-242c-60c7-20cbd58a5223.png)


どのフォルダを使いたいか選択できるので、先ほど作成したテキトーフォルダを選択します。
すると、自動的にDockerが走り出すので、```.py```ファイルを作って"F5"で実行させれば、pythonが動きます。

以上です。
コンパイルって何？

# コンパイルとは

[こちら](https://e-words.jp/w/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB.html)を見ると、

>コンパイルとは、プログラミング言語で書かれたコンピュータプログラム（ソースコード）を解析し、コンピュータが直接実行可能な形式のプログラム（オブジェクトコード）に変換すること。そのためのソフトウェアをコンパイラ（compiler）という。

人間が読めるコードをコンピュータ言語（オブジェクトコード）にするものと理解しました。

対して、PythonやRubyはスクリプト言語です。

スクリプト言語は、実行時に少しずつ機械語に変換していくものだそうです。


# gccとは

とある言語を勉強していると、gccなるものが出てきました。

gccは、[こちら](https://e-words.jp/w/gcc.html)によると、

GNU Compiler Collectionのことで、

>gccとは、GNUプロジェクトが開発・公開しているコンパイラ。様々なプログラミング言語のコンパイラを集めたパッケージとなっている。多くのUNIX系OSで標準的に利用され、オープンソースのOSではOS自体のコンパイルに用いられることも多い。


コンパイル言語を使う際には、こういったコンパイラが必要ということで理解。
WSL上のKubernetesクラスタで動作するnginxに接続する

# はじめに
WSL(Ubuntu)上に構築したKubernetesのnginxサービスを立ち上げ、ホスト(Windows)側からブラウザアクセスする方法をまとめます。

# 動作環境
WSL上にminikubeとkubectlをインストールした環境を用意します。
今回の動作を確認した環境は下の表のとおりです。
| ターゲット | OS |
|------|-------|
|ホスト|Windows 11 Home  21H2 |
|WSL|Ubuntu 20.04          |

# nginxの起動
minikubeを起動します。
```
minikube start
```

nginx用のマニフェストを作成します。([こちら](https://blog.inductor.me/entry/2020/05/06/173315#minikube-on-Docker-for-Windows-with-WSL2)の記事の内容を使わせていただきました)
```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
```

nginxサービスをデプロイします。
```
kubectl apply -f nginx.yaml
kubectl expose deploy/nginx --port=80
```

以下のコマンドを実行し、8080番ポートのアクセスをnginxの80番ポートにポートフォワードします。
```
kubectl port-forward svc/nginx 8080:80
```

ゲスト側のターミナルでcurlを実行し、nginxが動作していることを確認します。
```
$ curl localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
～(略)～
```
# ブラウザからのアクセス
ホスト側のブラウザを立ち上げ、アドレスバーにlocalhost:8080を入力することで、nginxにアクセスすることができます。以前は[こちら](https://qiita.com/snaka/items/a8eee4cfc8f7d733e6ab)の記事に書かれている設定が必要のようでしたが、今回は特に設定せずにブラウザからアクセスすることができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2243249/832d4126-8345-b0ff-1cb5-1361833f41b4.png)

# おわりに
結論としてはシンプルなのですが、WSLとKubernetesの知識が必要で試行錯誤しました。この記事の内容が誰かの参考になればうれしいです。
CSVHelper の小ネタ 出力時に日付を指定のフォーマットで出力する

超小ネタです。

CSVHelper でファイルの書き出しをする際、DateTime の項目を指定のフォーマットで出力したい時があります。
何もしなければ、

```csv:デフォルトの DateTime の項目
徳川　家康,男,01/31/1543 00:00:00
```

というふうに、アメリカンな感じになってしまいます。


そんな時は、TypeConverterOptionsCache を使うと便利です。

```c#:サンプル
private void ExportCSV(string filename, List<data> SendDataList)
{
  try
  {
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
      HasHeaderRecord = true,
      ShouldQuote = (context) => false,
    };

    using (var writer = new StreamWriter(FileName, false, Encoding.UTF8))
    {
      using (var csv = new CsvWriter(writer, config))
      {
        // コンバータを定義します
        var options = new TypeConverterOptions { Formats = new[] { "yyyy年MM月dd日" } };
        // DateTime 項目だった場合にコンバータを使うように登録します
        csv.Context.TypeConverterOptionsCache.AddOptions<DateTime>(options);

        //出力します
        csv.WriteRecords(SendDataList);
      }
   }
 }
 catch (Exception err)
 {
   Console.WriteLine(err.Message);
 }
}
```

```csv:コンバータを有効に！
徳川　家康,男,1543年1月31日
```

日本でおなじみのフォーマットになりました。
いい感じです。

## 関連記事

[CSVファイルを扱うのに便利な CSVHelper ver 25.0 の Getting Started](https://qiita.com/tnishiki/items/bfe0978592e023099588)
ディスクの空き容量が足りなくなった時【gitのログ見直し】

### 状況
 - ```git clone```をして検証したいブランチを反映している。
 - 検証環境でディスクの空き容量が足りなくなり「No space left on device」が発生する。
 - 不要なログ、ファイルを削除しても解消されない。

### 試したこと
 - 容量の重いファイルを```du -m```コマンドを使って探していく。
 - プロジェクトディレクトリの```.git/objects```の容量が大きくなっていることを確認

### ```.git/objects```って何してるの？
 - リポジトリにあるファイルの差分や履歴を管理しているオブジェクト
 - コミットが多くなると容量は肥大化していく
 - 容量の大きいファイルをコミットした場合なども容量が大きくなるため危険

### 解決策
 - Shallow Clone
    - 検証環境では、毎回クローンしなおしていたので、```git clone```時に```--depth```のオプションをつけることでクローンするときに、どこまでログを遡って取得するかを指定する。
    - ```git log```で変更ログを確認したい場合は、クローン時に指定したところまでしか確認できないので注意
    - 今回は検証環境で変更ログを確認することもないため```1```を指定する。
    ```
     git clone --depth 1
    ``` 

### 他にも
**あまり使うことはないかもしれませんが、他にも```.git/objects```を軽量化したい場合の方法を紹介します。**

 - リポジトリを作り直す
 - ```git filter-branch```コマンドを使って指定したファイルのログを削除する。
     - 大きいファイルを間違ってコミットしてしまった場合とかは良いかも
【AWS】Nodeのバージョンを16から18にして、V2からV3へ全体的に対応させる

## 背景
 * 急にCloudWatchのログにバージョン切り替えましょうね的なエラーロクが出るようになった。

## Node.jsのバージョンを16から18へバージョンをあげると何が起こるのか
 * AWS SDK for JavaScript v2だったが18からはAWS SDK for JavaScript v3になる
 →これにより、全体的にAWSのサービスの実装の書き方が変わる

## 対応が必要なこと
 * ①サービスごとにモジュールをインストールする必要がある
 * ②AWS SDK for JavaScript v2の書き方から18からはAWS SDK for JavaScript v3の書き方に変更
 * ③AWS Lambdaの場合はランタイムバージョンを変更する

## ①サービスごとにモジュールをインストールする必要がある
このようにサービスごとにインストールを行う。
※以下はssmの例
```
npm install @aws-sdk/client-ssm
```

もし、sqsやdynamoがあるなら「npm install @aws-sdk/client-サービス名」でダウンロードを行う
※S3なら「client-s3」だしDynamoなら「dynamo-db」だったりするので公式リポジトリを見て確認する。

## ②AWS SDK for JavaScript v2の書き方から18からはAWS SDK for JavaScript v3の書き方に変更
### v2とv3の書き方の比較
 * v2の書き方
```typescript:anime-suko.ts
import * as AWS from 'aws-sdk'
const s3 = new AWS.S3()
```
 * v3の書き方
```typescript:anime-suko.ts
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'
const s3 = new S3Client({})
```

### v3の対応は慣れれば簡単
★どのawsサービスも、クライアントとコマンドを用意して、最後にsendするだけ。全て同じやり方でできる。
※DynamoでのPutItemのような登録処理では登録するデータには型まで指定しなくてはならなくなったりしているが、他のサービスのほとんどは今までと同じパラメータを渡してうまくいく。

①importの中には、クライアントと～Commandを指定
※今回はS3を例にしているがもしDynamoのBatchWriteを使う場合は「BatchWriteItemCommand」というものが用意されている(from後はdynamoのモジュールを指定)
②from後は、さっきのnpm install例であったモジュール名を指定
```typescript:anime-suko.ts
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'
```

③ 各AWSサービスに必要ないつものパラメータを用意して、それを引数にクライアント.send()で実行。
```typescript:anime-suko.ts
s3.send(new PutObjectCommand(data)
```


## ③AWS Lambdaの場合はランタイムバージョンを変更する
ラムダの設定画面で実行バージョンは変更可能。わいの場合はNode.jsを16から18にした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179803/e9e6d3e9-dd88-c599-94f7-e7f1d69b9ba0.png)

## 必ずv3にしないと動かないわけではないが、将来的にはやるしかない
v2のやり方をそのまま使う方法もあるが、将来的には削除されるっぽい。
https://aws.amazon.com/jp/blogs/developer/modular-packages-in-aws-sdk-for-javascript/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179803/f4da0a7a-5bc3-ed24-0df1-4f0dd6a39b36.png)
[Android]自アプリからGoogle標準時計アプリのアラーム画面を開きたい[Jetpack Compose]

AndroidManifestに追記
``` AndroidManifest.xml
    <queries>
        <package android:name="com.google.android.deskclock" />
    </queries>
```

呼び出すコード

```kotlin
val context = LocalContext.current
val intent = Intent(ACTION_SHOW_ALARMS).apply {
                            setPackage("com.google.android.deskclock")
                        }
if (intent.resolveActivity(context.packageManager) != null) {
                        context.startActivity(intent)
}

```


https://play.google.com/store/apps/details?id=com.google.android.deskclock&pli=1
Node.js: setTimeout の使い方

## プログラム

```js:timeout_test.js
#! /usr/local/bin/node
//	timeout_test.js
//
//						Feb/08/2023
//
// ---------------------------------------------------------------
'use strict'
// ---------------------------------------------------------------
function first_function(aa,bb)
{
	console.error("This is the first function")
	console.error("aa = " + aa)
	console.error("bb = " + bb)
	const sum = aa + bb
	console.error("first: sum = " + sum)
}

// ---------------------------------------------------------------
function second_function(aa,bb)
{
	console.error("This is the second function")
	console.error("aa = " + aa)
	console.error("bb = " + bb)
	const diff = aa + bb
	console.error("second: diff = " + diff)
}

// ---------------------------------------------------------------
function third_function(aa,bb)
{
	console.error("This is the third function")
	console.error("aa = " + aa)
	console.error("bb = " + bb)
	const sum = aa + bb
	console.error("third: sum = " + sum)
}

// ---------------------------------------------------------------
console.error ("*** 開始 ***")
setTimeout(() => first_function(12,34), 1000)
setTimeout(() => second_function(45,56), 2000)
setTimeout(() => third_function(71,82), 3000)
setTimeout(() => {console.error("*** 終了 ***")}, 4000)

console.error ("*** check bbb ***")

// ---------------------------------------------------------------
```

実行結果

```text
$ ./timeout_test.js 
*** 開始 ***
*** check bbb ***
This is the first function
aa = 12
bb = 34
first: sum = 46
This is the second function
aa = 45
bb = 56
second: diff = 101
This is the third function
aa = 71
bb = 82
third: sum = 153
*** 終了 ***
```

## 確認したバージョン

```text
$ node --version
v19.6.0
```
【SwiftUI】フワフワ点滅させたい

# 概要
- 点滅するアニメーションを作りたかったので作った

# 環境
- macOS: 13.0.1
- iOS: 16.1
- XCode: 14.1

# 完成品
- 画質荒いですが、フワフワ点滅してます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918864/df8f561b-bdff-06b2-7e26-4466926462bc.gif" width=300>

# ソースコード

- 以下のように「ON AIR」のそれっぽいやつを作りました。
- `isAnimation`がコロコロ切り替わるたびチカチカするアニメーションを実装しています。

    ```swift: ContentView.swift
    import SwiftUI
    
    
    struct ContentView: View {
        
        @State var isOn = false
        @State var isAnimating = false
        
        var body: some View {
            VStack {
                Text("ON AIR")
                    .padding()
                    .frame(maxWidth: .infinity)
                    .background(isOn ? .red : .secondary)
                    .font(.largeTitle)
                    .padding()
                    .foregroundColor(.white)
                    .opacity(isAnimating ? 0.3 : 1.0)
                    .onChange(of: isOn) { newIsOn in
                        if newIsOn {
                            withAnimation(
                                .linear(duration: 1.0)  // 1秒ごと
                                .repeatForever()
                            ){
                                isAnimating.toggle()
                            }
                        } else {
                            isAnimating = false
                        }
                    }
                Button("スイッチ") {
                    isOn.toggle()
                }
            }
        }
    }
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
    
    ```

- 以上
laravel9 Sail 環境に追加したphpmyadminでログイン出来ない問題

Laravel Sailを使って構築した環境にphpMyAdminを追加しましたが、ログインしようとすると以下のエラーが出てログイン出来ませんでした。
`mysqli::real_connect(): The server requested authentication method unknown to the client [caching_sha2_password]`

どうやら、パスワードの認証方式を変更しないといけないようです
[参考](https://labor.ewigleere.net/2020/11/01/phpmyadmin_login_caching_sha2_password/)

しかし、sail　mysqlコマンドではrootでログインする事が出来ません。
そこでsailではなくmysqlのコンテナに直接ログインするためにコンテナIDを調べます。
```console
% docker ps
```
```
CONTAINER ID   IMAGE                         COMMAND                  CREATED          STATUS                    PORTS                                                  NAMES
xxxxxxxxxxxx   mysql/mysql-server:8.0        "/entrypoint.sh mysq…"   30 minutes ago   Up 30 minutes (healthy)   0.0.0.0:3306->3306/tcp, 33060-33061/tcp                test-app-mysql-1
```

調べたコンテナIDを使ってmysqlのコンテナに入ります。
```
% docker exec -it xxxxxxxxxx /bin/bash
```

```
# mysql -u root -p
```
```
mysql> use mysql;
mysql> alter user 'sail'@'%' identified with mysql_native_password by '.envに記載したパスワード';
```
これで無事phpMyAdminからログインする事ができるようになりました。
[こちらの記事を参考にさせていただきました](https://motomotosukiyaki.com/mysql-from-php-server-requested-authentication-method-unknown-to-the-client)

しかし、ここまでやった後dockerデスクトップから簡単にシェルに入れる事に気がつきました。。
PowerQuery Tips: 全てのシートもしくはテーブルを結合する

# 問題意識
PowerQueryでExcelファイルの全てのシート、もしくは全てのテーブルを読み込んで、結合したい、というニーズは割とよくあることだと思います。
GUIでその操作が可能なことはわかります。しかし一回ならまだしも、頻繁にそういう作業が発生するとしたら、毎回毎回GUIでその操作をするのは手間です。
もしその操作をM言語で記述しておけば、クエリをテンプレートに保存するなりM言語をコピペするなりすれば、読み込み・結合までが一発で終わります。

というわけで読み込み・結合までをM言語で書いてみたらどうなるか、というサンプルです。

# M言語のコード

```M:読み込み・結合１.pqm
let
    // Excelブックを展開したtable
    excelBookTable = Excel.Workbook(Web.Contents(path), null, true),
    // シートならSheet、テーブルならTableを指定
    Sheet_or_Table = "Sheet",
    ブックから抽出 = if(not List.Contains({"Sheet","Table"},Sheet_or_Table))
        then error Error.Record("KindError","Kindの指定が不正です。Sheet_or_Table で Sheet か Table のどちらかを指定してください。")
        else Table.SelectRows(excelBookTable, each [Kind]=Sheet_or_Table),
    結合したテーブル = Table.Combine(ブックから抽出[Data])
in
    結合したテーブル
```

一応簡単に説明すると次のような流れになっています。
1. １つ目のステップ`excelBookTable`は、Excelブックをパスで読み込んで名前を付けただけです。実際に使うときは`path`のところに適切なファイルパスを文字列で入れておきます。
1. ２つ目のステップ`Sheet_or_Table`では、シートオブジェクトかテーブルオブジェクトかを選択します（ここではデフォルト値として"Sheet"を設定しています）。
1. ３つ目のステップ`ブックから抽出`では、Excelブックが持つオブジェクトのうち、２つ目のステップ`Sheet_or_Table`で指定した形式のオブジェクトのみを抽出しています。
1. 最後のステップ`結合したテーブル`で、抽出されたオブジェクトを結合したテーブルを返しています。

必要に応じて一部の定数をパラメータ化するとなお使いやすいかも。
poetryのomegaconfで躓いた話

# はじめに
私は研究をpoetry上で行っていたのですが、ある時を境にエラーが発生して解決に時間がかかりました。その備忘録として今回の記事を書こうと思いました。

# エラーメッセージ
いつも通り研究をしようと思ったら、突然以下のようなエラーメッセージが出ました。
> ModuleNotFoundError: No module named 'omegaconf'

今まで出たことのないエラーでしたし、変更を加えた点から出たわけでもないので原因が分かりませんでした。

# 試したこと
- pipでomegaconfをインストール
    ⇒omegaconfが無いと言われたため

- poetryのtomlファイルの変更
    ⇒インストールしたモジュールを反映するため

- omegaconfをバージョン指定してインストール
    ⇒[omegaconfのリリース履歴](https://pypi.org/project/omegaconf/#history)を確認したら、当時バージョンアップが入っていたため 

以上のことは試してもエラーメッセージが変わりませんでした。

# 解決方法
poetryのバージョンを指定してインストールしたら解決しました。
```
curl -sSL https://install.python-poetry.org | python3 - --version 1.2.2
```
omegaconfのエラーが出ていて盲点になっていましたが、poetry自体にもアップデートがあったようです。
[poetryのリリース履歴](https://pypi.org/project/poetry/#history)を確認したところ、1.2系から1.3系へのアップデートが入っていたみたいです。かなり大きなアップデートだったようで、依存関係の整理ができなくなったのかなと思っています。
ChatGPTに関するフリートークで出てきた発言の一部をまとめてみた + α

# 前置き
参加したミートアップでchatGPTに関するフリートークに参加してみました｡
`chatGPTを含むai`というテーマだけ決まっており､あとは参加者が自分の意見や考えを言ったり､他の参加者に意見を聞くという形でした｡
今回はそのフリートークで出てきた発言をカテゴライズしてまとめました｡
近い意見､付随する意見は近くに書いています
私自身の意見や考えには`★`をつけます｡

# 参加者がどういうふうに使っているか､使い方を聞いたか｡
* googleで検索する感覚で使っている
* youtubeの動画やサイトを要約する
* 個人開発のテーマカラーやサービス名を考えてもらう
    * アプリの目的､どういうふうに使うかなどを記入すると帰ってくる
* 関数名､変数名を考えてもらう
* テストコードを作ってもらう
* aiノベリストみたいに使う
* 上司に聞く代わりにchatgdpに聞く
    * というか上司の方から｢chatgdpに聞いて｣と言われた｡


# 参加者の意見や考え､参加者が聞いた話
* ★チャットで英会話を練習するのに使えるのでは?
* chatGptローコード､ノーコードみたいなものかも?
    * どんどんブラックボックス化して行く
    * ★chatGptはフレームワークみたなものだと思う
* アシスタントやメンターのような立ち位置にしばらくはなると思う｡
* aiを使いこなせるエンジニアが今後強いエンジニアとなる
* aiに任せられるところは任せてしまうことにより開発速度が上がるかもしれない
    * 車輪の再開発を防ぐためにライブラリやテンプレートを探してもらうと良いかも｡
    * 過去に正解がある場合はaiが強いと思う
* aiを使ったさくらレビューが増えてくる
    * そしてそのさくらレビューを見つけるaiが出てくる
        * ★いたちごっこだ｡｡｡
* ブレストや壁打ちなどに使えるかもしれない｡
* aiノベリストの良いに使う場合､aiと一緒に話し合いながら1つの小説を執筆すると楽しいかもしれない
* ★aiが事務､営業､企画などをして従業員全員aiの会社が出てくるかも
* 海外ではchatGPTマスターなる職業があるらしい
* 今後上司に意見を募るには｢chatgptはこう答えていますがあなたはどう思いますか?｣みたいに聞く必要があるかも｡
* ★他人のコードを読む練習になるかもしれない
* aiがaiを学習させて新しいaiを作るかもしれない｡
* 人間が知らないところでネット上にaiの街ができるかも｡
* ★敵になるか味方になるかは人間の使い方次第
* 全く新しいものを作るのはまだ苦手

# 駄文(自分語りなど)
私の今後chatGPTを使い道としては主にアシスタントとして使うことが多いと思う｡
今後の使い道の予定
* コードなどのテンプレートを探してもらう
* 変数名､関数名を決めてもらう
* アイデア出しなどで壁打ち相手になってもらう
* エントリーシートや志望動機などの添削をしてもらう(就活エージェントみたいな感じ)
* 人生相談をしてみる
* aiノベリストで私のニッチな要求を満たす｡
Docker compose

## はじめに
自分が書き留めていた記事を公開する

# Docker compose
複数のコンテナをまとめて操作する
基本はこちらを使う

## コマンド
`docker-compose.yml`で管理しているコンテナに対して作用する
現在の階層の`docker-compose.yml`に対して行われる
無い場合は親の階層を探す
```shell
# imageを作成する
# DokerfileやGemfileを修正した際なども叩く
docker compose build
docker-compose build --no-cache

# コンテナの立ち上げ
# ymlで指定されたImageかDockerfileを利用して構築
docker compose up -d
docker compose up -d --build

# コンテナを停止&削除
docker compose down

# ymlで管理されたコンテナを全て再起動
docker compose restart
```

```shell
# 対象のymlで管理されたコンテナのみ一覧表示
docker compose ps

# ログを表示
docker compose logs [コンテナ名]
```

```shell
# ymlで管理されたサービスを１つ指定してコマンドを実行
# Imageの構築/コンテナ作成/コマンドの実行を１度で行う
docker compose run <サービス> <コマンド>

# 起動中のコンテナでコマンド実行 shellなどを使える
docker compose exec <サービス> <コマンド>
```

```shell
# dangling（宙ぶらりん)状態のImageを全て削除
docker image prune
```
```shell
# 起動中のコンテナ内部に入る
docker-compose exec サービス名 bash
```

## docker -compose.yml
ymlファイルはスペースで親子関係を表現するファイル形式
設定ファイルでよく使われる
```yml
# versionとserviceを登録する
version: "3"
services:
  web:
    build: ./php # dockerfileの相対path
    container_name: "php8"
    ports:
      - "8080:80" 
  db:
    image: mariadb:10.4
    container_name: "db2"
    volumes:
      - ./data:/var/lib/mysql # ホスト:Container ホストは相対pathがおすすめ
```

## linux/amd64対応
```yml
platform: linux/amd64
```
Docker

## はじめに
個人的に書き留めていた記事を公開する

# Docker
Dockerの基本
現在ではdocker-composeを使うのが主流

```shell:images
# Imageを作成 Dockerfileから作る 
# -t [名前]:タグ [dockerfile-path]で名前をつける
docker image build -t hoge:latest [Deckerfile-path]

# Docker Imageを全て表示
docker images

# Docker Imageを削除
docker rmi [id or name]
```

```shell:container run
# Dockerコンテナを作成して起動
docker container run --name <任意の名前> <Image名>

# option
--name [コンテナ名] # コンテナ名を指定
-p ホストのポート番号:コンテナのポート番号 # ポートを設定
-it # コンテナ内部に入る
--rm # コマンドの実行が完了した時、コンテナを破棄
-d # バックグラウンドでコンテナを実行
-v ホストのパス:コンテナのパス # volumeを指定する
-e TEST_ENV=Tee # ENV 環境変数 

# コマンド例
docker run -it --name hoge -v  Ubuntu:20.04
docker run --name sample --rm -d -p 8000:8000 sample

# nginxは/usr/share/nginx/html/にrootのhtmlがある
# Imageでwebserverをinstallしている場合ポートを開ける必要がある
docker run -v /Users/tee/Desktop/test/:/usr/share/nginx/html --name mynginx -p 8080:80 nginx:1.16
```

```shell:container
# 起動中のコンテナの中でコマンドを実行する
docker exec [id or name] [実行したいコマンド]

# コンテナを確認
docker ps -a

# コンテナを再開
docker start [id or name]

# コンテナを止める
docker down [id or name]

# コンテナを再起動
docker restart [id or name]

# 停止中のコンテナを削除
docker rm [id or name]
```

```shell:一括
# Imageを全て削除
docker image prune -a

# コンテナを全て削除
docker container prune
```

```shell
# コンテナにホストからファイルをコピー # 逆も可　
docker cp [host-path] [id]:[dorcerのpath]

# ログ表示 # -fでリアルタイム
docker logs [id or name]

# 起動中のコンテナの中に入る
docker exec [name or id] /bin/bash
```

```shell
# 詳細情報を表示
# ENVを確認したりするのに使う
docker inspect [コンテナ名]
```

## 消す系コマンド
```shell
## 一括コンテナ停止
docker stop $(docker ps -q)

## 一括コンテナ削除
docker rm $(docker ps -q -a)

## 一括イメージ削除
docker rmi $(docker images -q)
```
Statement#exeuteBatch

addBatchでregisterしたsqlをまとめてexecuteBatchする
```java
public class Outer {
    public static void main(String[] args) {
        try {
        Connection con = DriverManager.getConnection("jdbc:derby://localhost:1527/data/Sample");
            try(con) {
                shokai(con);
                String sql = "insert into firsttable values (?, ?)";
                PreparedStatement ps = con.prepareStatement(sql);
                ps.setInt(1,200);
                ps.setString(2,"one hundred");
                ps.addBatch();
                ps.setInt(1,210);
                ps.setString(2,"hundred ten");
                ps.addBatch();
                int[] ret = ps.executeBatch();
                System.out.println("insert count:" + Arrays.toString(ret));
                shokai(con);
            }
        } catch (SQLException ex ) {
            ex.printStackTrace();
        }
    }
    static void shokai(Connection con) {
        try {
            String sql = "select * from firsttable";
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while(rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                System.out.println(id + ":" + name);
            }
        } catch (SQLException ex ) {
            ex.printStackTrace();
        }
    }
}
```
```
10:TEN
20:TWENTY
30:THIRTY
60:sixty
50:sixty
90:AAA
110:hundred ten
insert count:[1, 1]
10:TEN
20:TWENTY
30:THIRTY
60:sixty
50:sixty
90:AAA
110:hundred ten
200:one hundred
210:hundred ten
```
【Docker】コンテナ作成時にデータベース作成して任意のSQLを実行させたい ※ 20230210追記あり

# 概要
DockerコンテナでとあるサービスのPostgreSQLデータベース用のコンテナを作成するとき、
起動後にデータベース作成やらSQL投入するのが面倒だったのでやり方を調査したメモ

# やり方
いろいろとやり方はあると思うが、docker-entrypoint.shを使う方法で。
Dockerfile内でENTRYPOINTを設定することで、
任意のスクリプトをコンテナ起動時に実行可能なので、これを活用します。

:::note warn
PostgreSQLの自動起動の前に実行されるため、
明示的にPostgreSQLを起動してから
データベースの作成やSQLの実行を記述する必要があります。
自動起動に影響を与えないように処理完了後にPostgreSQLは停止しています。
:::

# 2023/02/10追記
::: note warn
ENTRYPOINTはコンテナ作成時だけでなく起動時にも実行されるため、
一度作成後に、コンテナを停止→起動した際にも実行されてしまいます。
結果、二重でSQLを投入しようとするためエラーになってしまいます。
:::

これを解決するために、
実行後にentrypoint実行完了ファイルを作成し、
実行完了ファイルがある場合はSQL関連の操作を実行しないようにします。

# コード
```shell:Dockerfile
#... 諸々の処理

# 実行SQLファイルをアップロード
ADD ./entrypoint.sql /tmp
# docker-entrypoint.shのアップロードと権限設定
COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
# ENTRYPOINT設定
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
```

```shell:docker-entrypoint.sh
#!/bin/bash
set -e

# 一回だけ実行
if [ ! -e /entrypoint-done ]; then
    # PostgreSQLサーバーの起動
    su - postgres -c "pg_ctl start -D [postgresデータディレクトリ]"
    
    # データベースの作成やSQLの実行（例）
    psql -U postgres -c "CREATE DATABASE testdb"
    psql -U postgres testdb < /tmp/entrypoint.sql
    
    # PostgreSQLサーバーの停止
    su - postgres -c "pg_ctl stop -D [postgresデータディレクトリ]"
fi

# Entrypointの完了ファイルを作成
echo "done" > /entrypoint-done

# コマンドラインに制御を戻す
exec "$@"
```
Cの基本5 ~文~　備忘録

###　はじめに
私は初心者である。この備忘録を参考にされようとしている他の初心者の方は、ここに書かれていることを鵜呑みになさらぬようお願いしたい。何か間違いを見つけた方はコメント欄でご報告頂きたい。

### 基本的な演算子　その他
前回まで学んでいた基本的な演算子の類で記録し忘れたものをまず並べる。

式にセミコロンをつけて文にしたものを式分という。

インクリメントについて、`z`への代入と`y`のインクリメントを一つの式で行っている例が以下。
エラーは発生せず、結果についてはコメントの通り。
```c
    int x, y, z;
    x = 1;
    y = x + 1;
    z = x * y++ + 1;
    printf("z = %d\n", z);    // 結果はz = 3
    printf("y = %d\n", y);    // 結果はy = 3
```

### 制御構造
参考にしている書籍では6章に凸乳した。
前章では演算子について学んだ。この章では制御構造について学ぶ。
プログラムは通常、複数の文から構成される。それらの実行の順序を決めるのが制御構造。

Cでは基本的に、文を上から実行する。

これまでにも登場した`if`文や`while`文に加え、式の形をした文を**式分**という。
他にも何もしない**空文**というものがある。こちらは文法的に文が必要なところで、
何もしたくない時に使う。(pythonでいう`pass`的な？)

文のまとまりを囲んだものをブロックという。最後にセミコロンは書かない。
```c
{
    // この間に文が複数ある感じ
}
```
`if`文の`then`、`else`とか`while`文の後に続くかたまりがブロックに当たるのかな。

Cには`else if`は予約語としては存在しないらしいが`else`を書いたあとに改行して`if`を書くのが煩わしいから`else if`と書く慣習があるとのこと。

これらの実行の流れを制御するものを制御構造と呼ぶらしい。

___

*`while`文、`switch`文,`for`文について書き留めていたデータが飛んでしまった。
大事だと思ったものだけ気を取り直して再度書く。*

___

##### `switch`文
`switch`文では各`case`ラベルの末尾に`break;`を置かないと`default`も実行してしまうから注意しよう。（さすがに例文書く気力はもう残ってない笑）
もう一つ`switch`文に関して言えば列挙型と相性が良いということ。

##### `for`文
`for`文について書く。`for`文は下記のような形式の文のことだ。
`for (式１; 式２; 式3)`
1. 式１の評価
1. 式２を評価し、真ならブロックを実行する
1. ブロックの実行後、式３を評価
1. 式２の評価から繰り返す
1. もし式２が偽だったら`for`文の実行終了

1から10を表示させるコード
```c
    int i;
    for (i = 1; i <= 10; i++){
        printf("i = %d\n", i);    
    }
```
結果は
```c
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 10
```
上記の場合の変数`i`のように、繰り返しの回数を制御する変数をループ変数と呼ぶ。
書籍によるとC99では式１の部分で変数を宣言することもできる。
そして、その場合の変数はその`for`文内でのみ有効となる。下記が例。
```c
for (int i = 1; i <= 10; i++){
        printf("i = %d\n", i);
    }    // 結果は先程と同様
```
そして`for`分の括弧内の式１、式３は省略が可能で、（式１、式３で）複数の式を書きたいときはカンマ演算子を使う。*書籍には記載されてなかったが私の環境では、式１での変数の宣言は式が複数あるとできないようだった(だから`for`文の外で宣言した)。* また式２に関しては論理演算子を用いれば条件を複数書き込めた。(諸々下記の通り)
```c
    int i, x;
    for (i = 1, x = 5; i <= 10 && x > 0; i++, x--){
        printf("i = %d ", i);
        printf("x = %d\n", x);
    }
```
結果は
```c
i = 1 x = 5
i = 2 x = 4
i = 3 x = 3
i = 4 x = 2
i = 5 x = 1
```
コメント欄では[`for`文での空文の使用例](https://qiita.com/yuto1009/items/fba4e1c920b3d6751a4a#comment-077a3619163b1e147f9d)を教えていただいた。簡潔な文なのにしっかり機能がある感じが面白い。
ここらはしっかり習得すべきものだろう。

##### `do`文
`do`文は`while`文や`for`文と違って、まず本体となるブロックを実行してから、条件判断をする。上記のようなコードでは、負の値を入力する限り、ずっと年齢を聞いてくる。
```c
    do {
        printf("Your age?\n");
        scanf("%d", &age);
    } while (age < 0);
```
*この場合は最後にセミコロンが必要だ。[頂いたコメントを参照](https://qiita.com/yuto1009/items/fba4e1c920b3d6751a4a#comment-2826e7e944ffd8aff22d)*

### 繰り返しの制御

##### `break`文
`break`文は繰り返しと`switch`文のうち、一番内側にあるものを抜ける。
`break`文は例外的なことが起きた場合に繰り返しを終えるためいよく使われるとのこと。
Javaでもやったから割愛。

##### `continue`文
`continue`文は、繰り返しの本体の中に書く。
それを実行すると一番内側の繰り返しの本体のその回を終え、次の回を始める。`for`文の場合は、式３の評価に飛ぶ。

明日からは演習もやろう。
___

>今回の内容も富永和人氏の[新しいC言語の教科書](https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84C%E8%A8%80%E8%AA%9E%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E5%86%A8%E6%B0%B8%E5%92%8C%E4%BA%BA-ebook/dp/B07P1TC98P)を参考に書き留めてます。