OmniAICreator/Qiita-1.07M huggingface dataset:
Unity上でNays2DHの計算結果を3D表示する【開発記録 vol.3】

# はじめに
表題の通り、iRIC Nays2DHの計算結果をUnity上で3D表示できるようにしよう！
という個人的なプロジェクトの開発記録です。
6月中にパーティクルによる流速表示ができるところまで持っていきたいですね。

# 現状の共有
前回から変わっていないです。

今回は、前回一つにまとめた水面のOBJファイルに対して
表示切替用のスクリプトをかけていきます。

# 表示切替スクリプトの適用
## 事前知識
Unityのことなんて欠片も知らなかった半年前の自分に向けて
SceneビューとGameビューについて説明しておきます。
（Unity触ったことある人なら余裕で知っている内容なのでスルーしてください）

Unityを開くとSceneビューとGameビューという二つの画面が表示されています。

このうちSceneビューはクリエイターが3Dモデルの配置やカメラの設定などを行う設定画面です。
一方、Gameビューはゲームのプレイヤーが実際に見る画面で、アプリケーションとして
公開した場合は、Gameビューの方が公開されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1147458/56e05331-95f5-2dff-8d6f-420625983f41.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1147458/ac7eda1d-158b-7c8d-556a-7053bb76ae37.png)

PCでゲームをやったことがある方なら、キーボードやマウスで
キャラクターを操作した経験があるかと思いますが、
あんな風に視線やキャラクターを動かすためには
キーボード操作とキャラクターの動きを連動させるプログラムが必要になります。

そういったプログラムはプレイヤーのための操作になるので
Game画面でしか使えません。
（Sceneビューで一生懸命キーボードを押してもキャラクターは動かない）

今回の水面切り替えスクリプトもGame画面でしか効かないので
ご注意ください。

## 水面の表示切替スクリプト
キーボードの「A」を押したら一つ前の時刻、「S」を押したら一つ後の時刻の
水面を表示するスクリプトがこちら。

```c#:kirikae.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class kirikae : MonoBehaviour
{
    public GameObject[] models; // モデルの配列

    private int currentModelIndex = 0; // 現在のモデルインデックス

    void Start()
    {
        // 最初に表示するモデルのみ有効化する
        models[0].SetActive(true);

        // それ以外のモデルは非表示にする
        for (int i = 1; i < models.Length; i++)
        {
            models[i].SetActive(false);
        }
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            // 現在のモデルを非表示にする
            models[currentModelIndex].SetActive(false);

            // 前のモデルをアクティブにする
            currentModelIndex--;
            if (currentModelIndex < 0)
            {
                currentModelIndex = models.Length - 1;
            }
            models[currentModelIndex].SetActive(true);
        }
        else if (Input.GetKeyDown(KeyCode.S))
        {
            // 現在のモデルを非表示にする
            models[currentModelIndex].SetActive(false);

            // 次のモデルをアクティブにする
            currentModelIndex++;
            if (currentModelIndex >= models.Length)
            {
                currentModelIndex = 0;
            }
            models[currentModelIndex].SetActive(true);
        }
    }
}
```

ちなみにファイル名とクラス名は一致していないといけないので
お気をつけください。（今回はkirikaeで統一）

## スクリプトを水面モデルに適用
適用手順は以下の通りです。
1. 水面モデルを選択し、「Add Component」を押す。
2. 作成したスクリプトを選択する。（kirikaeで検索すればすぐ出てくる）
3. 「Models」にstep1～最後までを割り当てる（+を押せば欄は増やせる）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1147458/18382697-64c8-f060-e71f-2587d2fad85d.png)

あとは「▶」ボタンを押してGameビューでの挙動を確認すれば
水面の切り替えができるはずです。

前回、説明を省きましたが、こんな感じで表示切替のスクリプトは
一つのオブジェクト（今回はwsurf）にかけるイメージなので
水面モデルを一つのオブジェクトにまとめる必要があります。（多分）

# おわりに
水面の表示を切り替えるスクリプトとその適用方法について説明しました。
次回はGameビューで視点操作ができるように
カメラにスクリプトを割り当てるところに挑戦する予定です。

# （自分用）やりたいことのメモ
- Game画面で視点移動をできるようにしたい
- 流速をパーティクルで表示したい
- PLATEAUの建物を表示したい
- 水面のシェーダーを流速と合わせたい
【ＰＨＰ】指定した文字列を切り取りpreg_match_allを使う

プレグマッチオール
# コード
```PHP
<?php
$contents = 'ナルト<h3>aaa</h3>サスケ<h3>bbb</h3>サクラ<h3>ccc</h3>チョウジ';
preg_match_all('/<h3>(.*?)<\/h3>/', $contents, $h3);
var_dump($h3);
```

# 結果
```javascript
array(2) {
  [0]=>
  array(3) {
    [0]=>
    string(12) "<h3>aaa</h3>"
    [1]=>
    string(12) "<h3>bbb</h3>"
    [2]=>
    string(12) "<h3>ccc</h3>"
  }
  [1]=>
  array(3) {
    [0]=>
    string(3) "aaa"
    [1]=>
    string(3) "bbb"
    [2]=>
    string(3) "ccc"
  }
}
```

# コード
```PHP
<?php
$contents = 'ナルト<h3 clsss="">aaa</h3>サスケ<h3 id="">bbb</h3>サクラ<h3>ccc</h3>チョウジ';
preg_match_all('/<h3(.*?)>(.*?)<\/h3>/', $contents, $h3);
var_dump($h3);
```

# 結果
```javascript
array(3) {
  [0]=>
  array(3) {
    [0]=>
    string(12) "<h3>aaa</h3>"
    [1]=>
    string(12) "<h3>bbb</h3>"
    [2]=>
    string(12) "<h3>ccc</h3>"
  }
  [1]=>
  array(3) {
    [0]=>
    string(0) ""
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
  }
  [2]=>
  array(3) {
    [0]=>
    string(3) "aaa"
    [1]=>
    string(3) "bbb"
    [2]=>
    string(3) "ccc"
  }
}
```
DjangoのDEBUGにはboolを渡そう

# はじめに
AWS環境にデプロイする際に、SSMParameterから取得した値を設定していたら沼ったので記事にしました。
誰かの助けになれば幸いです🙏

# DEBUGモードとは?
`settings.py` にある
こいつのことである
↓
```python
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG=True
```

## DEBUG=True の場合
エラー時に詳細な情報が表示される
METAデータがすべて表示される(一応パスワード系の項目は伏せ字になるがそれ以外は全部見れる)

![95e6a79e41ea-20230427.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256055/18d4463e-43cf-3a62-4869-0238a7b9d2e0.png)

## DEBUG=False の場合
汎用的なエラーにまとめられ詳細は表示されない

`# SECURITY WARNING: don't run with debug turned on in production!`
と書いてあるように、本番環境で丸見えはまずいのでFalseにする必要がある

![スクリーンショット 2023-04-27 10.04.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256055/425ebdac-1684-d912-a149-db9d5b06b1ec.png)

# 本題
AWS環境(AppRunner)にデプロイするぞ！
というタイミングで下記のように設定を行った

![スクリーンショット 2023-04-27 10.06.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256055/5b434395-be98-f0fe-50a3-f167c4b01b2d.png)

ところが`DEBUG=True`のままになっていて原因の特定に時間がかかった

# 解決案
SSMParameterから取得したDEBUGはstrなのでboolに変換してあげる

```python
DEBUG = bool(strtobool(env('DEBUG'))) if type(
    env('DEBUG')) is str else env('DEBUG')
```

文字列FalseはTrueと判定される

```python
DEBUG = "False"
if DEBUG:
    print('debug mode on')
else:
    print('debug mode off')

# debug mode on がprintされる
```

# まとめ
沼るときって意外としょーもない理由だったりするなぁと痛感しました
GGP関係

##### ApigeeX
* ApigeeXは、Googleが提供するAPI管理プラットフォームであり、エンタープライズレベルでのAPI管理とセキュリティ機能を提供します。ApigeeXを使用すると、APIのトラフィック管理、アクセス制御、監視、分析、およびAPIのモニタリングなど、様々なAPI管理タスクを実行することができます。
ApigeeXには、API開発者向けのツール、API管理者向けのツール、およびAPIコンシューマー向けのツールが含まれています。API開発者は、ApigeeXを使用してAPIを設計、開発、デプロイし、APIのドキュメントを管理することができます。API管理者は、ApigeeXを使用してAPIトラフィックを監視し、APIのパフォーマンスを最適化し、セキュリティを確保することができます。APIコンシューマーは、ApigeeXを使用してAPIにアクセスし、APIを使用するためのクライアントアプリケーションを開発することができます。
ApigeeXは、オンプレミスでのデプロイメント、クラウドでのデプロイメント、ハイブリッドクラウドでのデプロイメントのいずれにも対応しています。また、多くのAPIをサポートしており、様々な開発言語やフレームワークに対応しています。

---

##### VPCピアリング
* VPCピアリングとは、Amazon Web Services（AWS）の仮想プライベートクラウド（VPC）間でのプライベートネットワーク接続を実現するサービスのことです。VPCピアリングにより、異なるVPCの間でトラフィックをルーティングすることができます。
VPCピアリングにより、異なるVPC間でトラフィックをルーティングすることができるため、複数のVPCを使用する場合でも、それらを1つの大きなネットワークのように扱うことができます。VPCピアリングを使用すると、異なるVPCの間でセキュリティグループを共有することもできます。
VPCピアリングは、同一リージョン内のVPC間でのみ使用できます。また、異なるAWSアカウントのVPC間でのピアリングも可能ですが、その場合は、ピアリングする両方のアカウントの所有者が同意する必要があります。
ただし、VPCピアリングを使用すると、VPC間での通信がプライベートネットワークであるため、インターネット経由のトラフィックはサポートされません。また、ピアリングするVPCのCIDRブロックが重複する場合は、ピアリングできません。さらに、VPCピアリングには一定の制限があり、ピークトラフィックやスループットなどの面で制限があるため、大規模なネットワークには適していません

---
##### Anthos Service Mesh

* Anthos Service Meshは、Google Cloudが提供する、[マイクロサービスアプリケーション](#マイクロサービスアプリケーション)を構築、管理するためのプラットフォームです。このプラットフォームには、アプリケーション内のマイクロサービス間での通信を管理するための[サービスメッシュ](#サービスメッシュ)が含まれています。
Anthos Service Meshは、Istioというオープンソースのサービスメッシュをベースにしています。これにより、トラフィック管理、セキュリティ、監視、トレースなどの機能が提供され、開発者はこれらの機能を手軽に利用することができます。また、IstioはKubernetes上で動作するため、Anthos Service MeshもKubernetes上で動作することができます。
Anthos Service Meshは、Google Cloud上でアプリケーションを実行する場合に利用できますが、オンプレミスの環境でも利用することができます。また、Anthos Service Meshは、Google CloudのAnthosプラットフォームの一部であり、アプリケーションを複数の環境で実行することができるようになります。

---
##### IDM
* IDMとは、Identity and Access Managementの略で、ユーザーのアイデンティティとアクセスを管理するためのシステムのことです。IDMは、企業や組織内でのユーザーアカウントの作成、削除、管理、認証、認可などを中心に行います。
IDMにより、ユーザーのアクセス権限を適切に管理することができ、情報漏洩や不正アクセスなどのセキュリティ上のリスクを低減することができます。また、ユーザーのアイデンティティを一元的に管理することで、アカウントの重複や重複したアクセス権限などを回避することができます。
IDMは、一般的に、LDAP（Lightweight Directory Access Protocol）やActive Directoryなどのディレクトリサービスや、SAML（Security Assertion Markup Language）やOAuthなどの認証プロトコルを使用して実装されます。また、最近では、クラウド環境におけるIDMサービスも提供されています。

---
### 参考
##### マイクロサービスアプリケーション
* マイクロサービスアプリケーションは、大規模で複雑なアプリケーションを、複数の小さなサービスに分割して開発する手法です。各サービスは、独立して開発、デプロイ、スケール、保守することができます。
マイクロサービスアプリケーションでは、各サービスがAPIを介して通信することで、全体としてのアプリケーションを構成します。これにより、各サービスが独立して開発されるため、開発チームはより迅速かつ柔軟にアプリケーションを開発することができます。また、各サービスを個別にスケールすることができるため、システム全体のパフォーマンスを最適化することができます。
マイクロサービスアプリケーションの開発には、コンテナ技術やクラウドネイティブアプリケーションプラットフォームなどの新しい技術が使用されることが一般的です。また、各サービスの管理や通信のためのサービスメッシュなどのツールも活用されます。

##### サービスメッシュ
* サービスメッシュは、マイクロサービスアプリケーション内のサービス間通信を管理するためのプラットフォームです。サービスメッシュは、各サービスの通信を中央で制御するため、アプリケーションの信頼性やセキュリティを向上させることができます。
一般的に、サービスメッシュは、各サービス間の通信をプロキシによって中継し、トラフィックの制御、セキュリティ、監視、トレースなどの機能を提供します。これにより、各サービスが独立して開発され、デプロイされることができるため、アプリケーション全体の信頼性や可用性を向上させることができます。
代表的なサービスメッシュの実装としては、IstioやLinkerdがあります。これらのサービスメッシュは、コンテナ技術やクラウドネイティブアプリケーションプラットフォームなどの新しい技術と組み合わせて使用されることが一般的です。
Git 特定のコミットまで戻したい

誤ってマージしてしまい、特定のコミットまで戻したいとなった時の覚書


<h1>まずコマンドラインを使って自分が今いるブランチを確認する</h1>


```:コマンド
$ git branch --contains
```

# 次に戻したいコミットのハッシュ値を調べて、そこまで戻す

```:コマンド
$ git log
commit ハッシュ値

$ git reset --hard ハッシュ値
```


# リモートへ強制Pushする　SourceTree編

Sourcetree（メニュー） > 環境設定 > 高度な設定


![スクリーンショット 2023-04-27 10.11.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749681/4229b719-540e-7d54-b911-105d4e4a21a9.png)
![スクリーンショット 2023-04-27 10.13.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749681/d3b79b68-4db1-6f88-9af6-4097bc166d53.png)


Mac版のSourceTreeのバージョンによって高度な設定ができない場合がある。

# SourceTreeを英語版に切り替える

Sourcetree（メニュー） > 環境設定 >　一般

Language ＆　Regionの項目のPreferred language：を日本語からEnglish（U.S.）に変更して再起動する


Sourcetree（メニュー） > Preferences > Advancedから
高度な設定が使えるようになります

![スクリーンショット 2023-04-27 10.20.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749681/344317ea-e1ab-6982-812c-41ecc2052c97.png)

Allow force pushにチェックを入れます。←これで強制プッシュを有効化できる


あとは、言語を日本語に戻して再起動

そして
ローカルブランチからリモートブランチへ強制プッシュする

![スクリーンショット 2023-04-27 10.22.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749681/bb12e64d-7ec3-0e5a-4e37-d566966c5085.png)



以上
【SQL】orderbyの列数指定


## きっかけ
SQLのorderby句の指定方法で、以外と知られてないと感じたので投稿です。

メンバーの障害調査をどれどれ、とフォローしていました。
テーブルを見ようとした際に「○○カラムで降順にして！」と伝えたところ、
1列名の主キーなのは共通認識だけど物理項目名が分からなくて探し出すことがありました。

## こうした
orderby句は「左から何列目」の数値を定義して昇順／降順指定できるのでサクっとデータを見たい時に便利です。


<table>
  <caption>hogehogeテーブル</caption>
  <thead>
    <tr>
      <th>USER_ID</th>
      <th>NAME</th>
      <th>BIRTHDAY</th>
    </tr>
  </thead>
  <tr>
    <td>ID001</td>
    <td>さとう</td>
    <td>19930218</td>
  </tr>
  <tr>
    <td>ID002</td>
    <td>すずき</td>
    <td>19891102</td>
  </tr>
  <tr>
    <td>ID003</td>
    <td>やまだ</td>
    <td>20000612</td>
  </tr>
</table>


```sql:サンプル
SELECT
    USER_ID
    , NAME
    , BIRTHDAY
FROM hogehoge
ORDER BY 1 desc -- 1列目（USER_ID）の降順指定
```

実行結果
<table>
  <caption>hogehogeテーブル</caption>
  <thead>
    <tr>
      <th>USER_ID</th>
      <th>NAME</th>
      <th>BIRTHDAY</th>
    </tr>
  </thead>
  <tr>
    <td>ID003</td>
    <td>やまだ</td>
    <td>20000612</td>
  </tr>
  <tr>
    <td>ID002</td>
    <td>すずき</td>
    <td>19891102</td>
  </tr>
  <tr>
    <td>ID001</td>
    <td>さとう</td>
    <td>19930218</td>
  </tr>
</table>

:::note warn
※実際の開発時はコーディング規約を遵守しましょう！
[PostgreSQL]サブスクライバーのテーブルにはパブリッシャーで指定されたテーブルと列がすべて存在している必要がある

PostgreSQLの論理レプリケーションの話題です。

サブスクライバーのテーブルにはパブリッシャーで指定されたテーブルと列がすべて存在している必要があります。

例えば以下のようなテーブルがあったとします。
```
                                       Table "public.brandlist"
         Column         |  Type   | Collation | Nullable |                   Default
------------------------+---------+-----------+----------+---------------------------------------------
 id                     | integer |           | not null | nextval('brandlist_id_seq'::text::regclass)
 brandname              | text    |           | not null |
 brandfurigana          | text    |           | not null |
 makername              | text    |           |          |
 makerfurigana          | text    |           |          |
 url                    | text    |           |          |
 checked                | boolean |           |          | false
 kind                   | text    |           |          | 'CORPORATION'::text
 lost                   | boolean |           |          | false
 directlink             | boolean |           |          | true
 median                 | integer |           |          |
 http_response_code     | integer |           |          |
 twitter                | text    |           |          |
 twitter_data_widget_id | text    |           |          |
 notes                  | text    |           |          |
 erogetrailers          | integer |           |          |
 cien                   | integer |           |          |
```
これを
```sql
CREATE PUBLICATION mypublication FOR TABLE brandlist;
```
とした場合、
```sql
CREATE SUBSCRIPTION mysub CONNECTION 'dbname=**** host=****' PUBLICATION mypublication;
```
で、サブスクライブする側はpublic.brandlistが存在して、かつpublic.brandlistに上記テーブル定義で示したすべての列が存在している必要があります。

自分的に困ったのは…サブスクライブする側にテーブルが存在しない場合は明示的にエラーがでるのですが、列が足りない場合はエラーがでないことでした。
パブリッシャー側のログを見ると
```
2023-04-26 15:57:43.168 JST [1300649] LOG:  logical decoding found consistent point at 33/9D722DB0
2023-04-26 15:57:43.168 JST [1300649] DETAIL:  There are no running transactions.
2023-04-26 15:57:43.168 JST [1300649] STATEMENT:  CREATE_REPLICATION_SLOT 
2023-04-26 15:57:48.997 JST [1300651] LOG:  logical decoding found consistent point at 33/9D722DE8
2023-04-26 15:57:48.997 JST [1300651] DETAIL:  There are no running transactions.
2023-04-26 15:57:48.997 JST [1300651] STATEMENT:  CREATE_REPLICATION_SLOT 
```
が繰り返し記録されるのみです。
```
SELECT * FROM brandlist;
```
とすると初期データが挿入されないので、なにか失敗してるな…と分かるのですが、列が足りていないことに気がつけませんでした。

[PostgreSQLのマニュアル](https://www.postgresql.jp/document/14/html/logical-replication-restrictions.html)に
> データベーススキーマおよびDDLコマンドはレプリケーションされません。 初期スキーマは、pg_dump --schema-onlyを使ってコピーすることができます。 以後のスキーマ変更の同期は手動で行ないます。 （なお、両者でスキーマは完全に同じである必要はないことに留意してください。） 稼働中のスキーマ定義変更に対して、論理レプリケーションは頑健です。 スキーマがパブリッシャー側で変更され、複製データがサブスクライバー側に到着し始めたものの、データがテーブルスキーマに合致しない場合は、スキーマが変更されるまではレプリケーションはエラーとなります。 多くの場合、間欠的なエラーは、サブスクライバーに先に追加的なスキーマ変更を行うことで避けることができます。

と記載があるので、どこかでエラーを検出できると思うのですが、分かりませんでした。
GCP 遠隔監視オンライン試験(GCP-PDE)受験記

# はじめに
先月、GCP 遠隔監視オンライン試験を利用して、GCP Professional Data Engineerを受験・合格してきました。
遠隔監視試験の受験記になります。

## GCP 遠隔監視オンライン試験とは
遠隔監視試験とは、自宅等から資格試験を受験出来る仕組みのことです。
テストセンターでの受験は、昨今のコロナ禍のせいかテストセンターが閉鎖されていたり、予約が取れない(特に土日)といった状況ですが、こちらはかなり空いています。
ほぼ24時間受験出来ますし、今から1時間後といったケースも可能そうです。

## 受験してみて感じた事
メリット
* 予約可能な時間が多い
* テストセンターへ行く手間が省ける
* 直前まで勉強できる
* 受験料は同じ

デメリット
* 身分証の名前確認が厳格すぎる
　→漢字⇔アルファベット、「SHI」⇔「SI」のような違いもNG
* 机の片付けが必要
* 誰かが部屋に入ってきたりすると、試験中断される為、家族がいる場合は事前周知が必要
→私は、受験時間は外出してもらいました
* PC必須

## 準備するもの
* 身分証：パスポート(有効期限内)
　→申し込みサイトに登録しているプロファイルの姓名が一致していないと駄目
　→プロファイルが、ローマ字登録の場合、ローマ字表記のある身分証(パスポートなど)が必要
　※コロナでしばらく使っていないと思うので、有効期限をチェックしましょう
* 手鏡(※)
→必要という記事があったが、使いませんでした。
→100均で買える為、念の為準備しておいた方が良い

# 事前準備
* 机の上に、PCと手鏡のみある状態にする
  * 普段使い(テレワークで使ってる机)の机は、ディスプレイアームが付いていたりと、
セットが大変なので、昔使っていたリビング用机(90cm*90cmくらい？)を組み立てることに

# 試験の流れ(※以下の流れは全て、英語のチャットでやり取り)
* 本人確認
  * 証明書を出してと言われるので、パスポートをPCのカメラに映す
→「This is my passport. OK?」のような返信でいけた
* セキュリティチェック
  * PCのカメラで、机の上を映してと言われる。
→パスポート、手鏡を別の机に置き、PCを持ち上げて、机の上を映す。
→机の上は何も無い状態
→「OK?」の返信でいけた
  * 部屋を映してと言われる
→PCを持ち上げて、ゆっくり部屋を1周映す
→ディスプレイがあるから、電源OFFしてねと言われる
→「I already turned them off.」と返信していけた
* 試験開始
→試験開始のボタンを押してからカウントダウン開始
→本人確認、セキュリティチェックの時間は試験時間に含まれない
→後は、テストセンター受験と同じでした

# 試験終了後
試験終了後すぐに、結果表示されます
→webassessorでも後日確認可能
→テストセンター受験と同じく、認定証発行までは数日掛かりました
BigQuery API

```Python
from google.cloud import bigquery_datatransfer
from google.oauth2.service_account import Credentials
import time

transfer_client = bigquery_datatransfer.DataTransferServiceClient(
    credentials=Credentials.from_service_account_file('/path/to/your/credentials.json')
)

# The project where the query job runs is the same as the project
# containing the destination dataset.
project_id = "your-project-id"
dataset_id = "your_dataset_id"

# Use standard SQL syntax for the query.
query_string = """
SELECT
  CURRENT_TIMESTAMP() as current_time,
  @run_time as intended_run_time,
  @run_date as intended_run_date,
  17 as some_integer
"""

parent = transfer_client.common_project_path(project_id)

# Schedule at 14:00 every Friday
schedule = "every friday 14:00"

# Wait until scheduled time
while True:
    current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    if current_time.endswith(schedule.split()[1]):
        break
    time.sleep(60)

transfer_config = bigquery_datatransfer.TransferConfig(
    destination_dataset_id=dataset_id,
    display_name="Your Scheduled Query Name",
    data_source_id="scheduled_query",
    params={
        "query": query_string,
        "destination_table_name_template": "your_table_{run_date}",
        "write_disposition": "WRITE_TRUNCATE",
        "partitioning_field": "",
    },
    schedule=schedule,
)

transfer_config = transfer_client.create_transfer_config(
    bigquery_datatransfer.CreateTransferConfigRequest(
        parent=parent,
        transfer_config=transfer_config,
    )
)

print("Created scheduled query '{}'".format(transfer_config.name))
```
このコードはTransferConfigのscheduleパラメーターで指定された日時を待って自動実行されるようになっています。そのため、指定した時間に実行されるようにスケジュールすることができます。

したがって、即時実行を避けるために、スケジュールの日時になるまで待機する必要があります。次のようにtimeモジュールを使用して指定の日時まで待機することができます。

必ず一回実行するのでこうするしか無い。。。
Databricksのサイドメニューがリニューアルされました！

こちらでお知らせしたサイドメニューのリニューアルがデプロイされました。

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

サイドメニューの左下にトグルが表示されました。
![Screenshot 2023-04-27 at 9.03.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/932bc69f-225c-f494-5938-cc43cc7dd8da.png)

こちらをオンにするとダイアログが表示されますので**有効化**をクリックします。
![Screenshot 2023-04-27 at 9.03.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/55d8bc20-988e-ccc0-e472-ea35fd013743.png)

サイドメニューがリニューアルされます。
![Screenshot 2023-04-27 at 9.03.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/36a8262f-67cc-743a-8010-97ed1280781c.png)

これまでは**ペルソナスイッチャー**でD/M/Sを切り替えていましたが、正直イマイチ使いづらかったかと。

- 今回、全てのメニューアイテムが統合されSQL/データエンジニアリング/機械学習の下に各メニューアイテムが含まれる形になります。
- ペルソナの切り替えが不要となります。個人的にもこちらの方が好きです。
- ワークスペース、リポジトリ、データなど共通のメニューアイテムは上に並ぶ形になります。

![Screenshot 2023-04-27 at 9.04.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6b5a70d8-ea09-9a7e-2da7-3ff6b732ea18.png)

是非お試しください！

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
PythonのTkinterでGUIプログラムを作るときのシンプルな雛形

私がPythonを用いるときの目的は文字列の加工なのですが、いつもCUIで実施していたのでGUIで出来たら良いなと思っていました。
今回は私の目的においては色々と使いまわせるtkinterを用いたGUIプログラムの雛形を作成しました。
createボタンをクリックすると、テキストボックスに入力された文字列がinput_str_procで加工された新しいウィンドウのテキストボックスで出力されます。

```python
import tkinter as tk
import tkinter.messagebox as mbox


root = tk.Tk()


label = tk.Label(root, text="文字列処理の雛形")
label.pack()


# ボタンを格納するフレームを作成
frame = tk.Frame(root)
frame.pack()


def input_str_proc(string):
    #テキストボックスに入力された文字列を加工する処理を記載する
    return string


def create_new_window():
    # 新しいウィンドウを作成
    new_window = tk.Toplevel(root)

    # Scrollbarを作成
    sub_scrollbar = tk.Scrollbar(new_window)
    sub_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

    # Textウィジェットを作成し、初期テキストを設定
    sub_text_box = tk.Text(new_window,yscrollcommand=sub_scrollbar.set)

    # ScrollbarとTextウィジェットを紐づける
    sub_scrollbar.config(command=sub_text_box.yview)

    # Textウィジェットの幅と高さを設定
    sub_text_box.config(width=50, height=10)

    # Textウィジェットを配置
    sub_text_box.pack(side = "bottom",fill=tk.BOTH, expand=True)

    #テキストボックスから文字列を取得
    input_str = text_box.get("1.0", "end-1c")

    #入力文字列を加工
    output_str = input_str_proc( input_str )
    
    sub_text_box.insert(tk.END, output_str)




# Scrollbarを作成
scrollbar = tk.Scrollbar(root)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)


# Textウィジェットを作成し、初期テキストを設定
text_box = tk.Text(root,yscrollcommand=scrollbar.set,undo=True)
text_box.insert(tk.END, "Type your text here")

# ScrollbarとTextウィジェットを紐づける
scrollbar.config(command=text_box.yview)

# Textウィジェットの幅と高さを設定
text_box.config(width=50, height=10)

#テキストボックスのundoを実施。
def undo(event):
    if event.state == 4 and event.keysym == "z":
        text_box.edit_undo()


text_box.edit_modified(False)
text_box.bind("<Key>", undo)


# Textウィジェットを配置
text_box.pack(side="bottom",fill=tk.BOTH, expand=True)



def button_click4():
    text_box.delete('1.0', tk.END)
    text_box.insert(tk.END, insertMsg)
    
button4 = tk.Button(frame, text="create", command=create_new_window)
button4.pack(side="left")


root.mainloop()

```
Swipper.jsを使ってみた



# swipperjsの概要

スワイプ画面を作製するためのjavascriptライブラリです

```
言語: JavaSciprt
ライセンス: MIT Licence
スター: 35k
```

- ソースコード

https://github.com/nolimits4web/swiper

- デモページ

https://swiperjs.com/demos

#
MongoDBのスロークエリ探索

MongoDBのログからスロークエリの洗い出しを行った際のメモです。

```bash
# COLLSCAN（インデックスを使わないフルスキャン）のみ抽出
$ sudo grep "COLLSCAN" <path_to>/mongod.log > stats.txt

# awkとsortで実行時間順（降順）に並び替え、headで上位10件を取得
$ awk '{ print $NF,$0 }' stats.txt | sort -r | head
642ms 2023-02-06T14:35:56.695+0900 *****
261ms 2023-02-06T14:35:57.862+0900 *****
256ms 2023-02-06T14:35:57.860+0900 *****
243ms 2023-02-06T14:35:59.892+0900 *****
234ms 2023-02-06T14:35:56.121+0900 *****
232ms 2023-02-06T14:35:54.101+0900 *****
229ms 2023-02-06T14:35:48.463+0900 *****
218ms 2023-02-06T14:35:56.094+0900 *****
215ms 2023-02-06T14:35:53.985+0900 *****
215ms 2023-02-06T14:35:48.458+0900 *****
```

※MongoDBのデフォルト設定では100ms以上かかったクエリしかログに残らないようなので、100ms未満のクエリを確認する際は設定の変更が必要。
バニラVisaの残高確認ブックマークレット

バニラVisaギフトカードの残高確認で毎回番号を入力するのが面倒なので、ブックマークレットを作ってみました。
ブックマークしたURLに追加しておいたお客様番号をテキストボックスに設定するだけです。
SafariとChromeで確認しました。


**ブックマークするURL**
「0000-0000」は、「お問合せ用お客様番号」の下8桁に置き換えてください
`https://vvgift.jp/login.action?0000-0000`

```js:お問合せ用お客様番号を設定するブックマークレット
javascript: (function() {
    if (location.search.length==10){
        var nums = location.search.substring(1).split("-");
        document.getElementsByName("contact_number1")[0].value = '6102';
        document.getElementsByName("contact_number2")[0].value = nums[0];
        document.getElementsByName("contact_number3")[0].value = nums[1];
    }
})();
```

**エンコードしたブックマークレット**
`javascript:(function(){if(location.search.length==10){var%20nums=location.search.substring(1).split("-");document.getElementsByName("contact_number1")[0].value='6102';document.getElementsByName("contact_number2")[0].value=nums[0];document.getElementsByName("contact_number3")[0].value=nums[1];}})();`

## 使い方

**1)以下URLをブックマークに追加します**
「0000-0000」は、「お問合せ用お客様番号」の下8桁に置き換えてください
`https://vvgift.jp/login.action?0000-0000`

**2)ブックマークレットをブックマークに追加します**

**3)1のブックマークを開きます**

**4)2のブックマークを開きます**

**実行結果**
![スクリーンショット 2023-04-27 8.52.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52320/02ff123a-62ad-f846-9425-e2f2227a3910.png)

## 次へボタンも自動で押したい場合
```js:次へボタンも自動で押したい場合、7行目に以下追加
document.getElementById("next").click();
```
フッター要素をページ下部に常に固定で表示したい場合のCSS

## CSSの書き方

ページの下部に常に表示されるフッターを作成するには、CSSの`position: fixed`と`bottom: 0`を使用することができます。例えば、以下のようなスタイルを適用することができます。

```css
footer {
  position: fixed;
  bottom: 0;
  width: 100%;
}
```


別の方法として、position: stickyを使用することもできます。position: stickyは、要素がスクロールされるときに、指定された位置に固定されるように動作します。例えば、以下のようなスタイルを適用することができます。

```css
footer {
  position: sticky;
  bottom: 0;
  width: 100%;
}
```

## positon: fixed と position: stickyの挙動の違い

position: fixedとposition: stickyは、要素をページ上の特定の位置に固定するために使用されるCSSプロパティですが、動作が異なります。

position: fixedは、要素をビューポート（ブラウザの表示領域）に対して固定します。つまり、ページがスクロールされても、要素は常にビューポート内の指定された位置に表示されます。

一方、position: stickyは、要素がスクロールされるときに、指定された位置に固定されるように動作します。つまり、要素がスクロールされるときに、指定された位置を超えると固定されますが、それ以外の場合は通常の要素と同様に動作します。

例えば、フッターをページ下部に常に表示する場合、position: fixedを使用すると、フッターは常にページ下部に固定されます。一方、position: stickyを使用すると、フッターはページ下部に固定されますが、ページがスクロールされるときには通常の要素と同様に動作します。

以上が、position: fixedとposition: stickyの違いです。どちらを使用するかは、要素をどのように表示したいかによって決定します。
[PHP][paiza]入力データを自前で用意する

# はじめに
paizaはブラウザ上でもエラーコードを出力してくれたり標準入力の内容をいじれるようになっているが、提出したコードのデータを手元に置いておけた方が見返したり他の課題に使える内容を流用しやすいのでVScode上で書いていこうと思ったのがきっかけ。

標準入力のデータを自分で用意しよう！みたいな記事がパッと見なかったので、今まで
```
$data = [
  [1 0 2],
  [2 3 1]
];
```
みたいなのを手書きでやっていたがさすがに手間だったからここを楽にしたかった。


B級程度の問題解いていくなら全部二元配列化しちゃった方が書き方統一できて簡単なのでそこも併せて。
初心者だし回答速度、実行速度は気にしない方針でいく。

VScodeではF5で実行してデバッグコンソールに出力。

二元配列にしている都合上、縦1列のデータでi行目の値を取りたい場合でも
`$arr[i-1][0]`
で指定する必要があることだけ注意したい。

# 準備
default.php
data.txt
を同じファイル内に作成する。


# コード
```php:default.php
<?php
//VScode上のみで扱う
$file_path = "./data.txt";
$STDIN = fopen($file_path, "r");

//提出するときは$STDINをSTDINに修正する
while ($std = trim(fgets($STDIN))) {
  $arr[] = $std;
}

foreach ($arr as &$element) {
  $element = explode(' ', $element);
};

//出力の確認とfclose
print_r($arr);
fclose($STDIN);

?>
```

# 確認
## テストデータの作成
```txt:data.txt
test
10 11
20 21
30 31
```

## 出力

```:デバッグコンソール
Array
(
    [0] => Array
        (
            [0] => test
        )

    [1] => Array
        (
            [0] => 10
            [1] => 11
        )

    [2] => Array
        (
            [0] => 20
            [1] => 21
        )

    [3] => Array
        (
            [0] => 30
            [1] => 31
        )
```
FlutterでInvalid constant value. が起きた時の対応方法

下記ではエラーが起きないが

    child: const SettingsList(
      lightTheme: SettingsThemeData(
        settingsListBackground: Colors.transparent,
      )
    )

以下にすると`Theme.of(context).colorscheme.background`のところで`Invalid constant value. `になる。

    child: const SettingsList(
      lightTheme: SettingsThemeData(
        settingsListBackground: Theme.of(context).colorscheme.background,
      )
    )

原因は`Theme.of(context).colorscheme.background`のところではなく、`const SettingsList`の部分で、`const`を除外すれば解決する。

    child: SettingsList(
      lightTheme: SettingsThemeData(
        settingsListBackground: Theme.of(context).colorscheme.background,
      )
    )

以上
Microsoft (のサービス) にログインする際「Outlook Consulting」のページに飛びうまくいかない場合

メールアドレスの末尾を以下のように間違えている可能性があります。
一度ご確認ください。

誤: xxx@outlook.co.jp
正: xxx@outlook.jp

(私自身がやってしまったので記事にしておきます)
「Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書」のメモ

「Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書」で重要だと思ったところをメモしておきます(書き途中なので随時更新します)

# 仮想化と分散処理

クラウドを支える2つの重要な技術

- 仮想化
    - 1つの物理サーバーに対して複数の仮想サーバーをインスタンス化させておくことで、アクセスが大量に来て仮想サーバーが1つ落ちても別の仮想サーバーで一時的に補うことができる
    - 
- 分散処理
    - 一台あたりのサーバーの負荷を減らして、ダウンしたり、応答時間がかかりすぎてしまうのを防ぐ
    - ロードバランサーが分散処理をおこなってくれる(AWSではElastic Load Balancing)

仮想化と分散の技術があることで冗長化につながる

冗長化とは、万が一にもシステムやサーバーに何かあった時でも稼働し続けれられるように対策をしておくこと。(バックアップを取ったり、複数台で運用するのが一般的) 

# サーバーとインスタンス

サーバーとは何かサービスを提供するものを指す

| Webサーバー |
| --- |
| メールサーバー |
| データベースサーバー |
| ファイルサーバー |
| プロキシサーバー |
| DNSサーバー |

サーバーは普段使っているPCと同じく、CPUやメモリ、ストレージ、OSおsなどの機器が備わっている

インスタンス : サーバーとして稼働している仮想サーバーのこと(EC2インスタンス)

EC2ではサーバーをインスタンスとして作られる

# DNSとドメイン

サーバーなどの端末(ホスト)はIPアドレスで認識されている

- DNSとはURLに含まれる名前に対応するIPアドレスのサーバーを教えてくれる仕組みのこと
    - DNSサーバーに名前をもとに調べに行ってIPアドレスを返してくれる

AWSではRoute53がDNSサーバーとして働いている


# Amazon Elastic Compute Cloud (EC2)

- サーバーに必要なものを一式借りることができる
- アンマネージドサービスでAWSによる強制アップデートが必要
- 多様なサーバーマシンやOSやソフトウェアの組み合わせが用意されていて選ぶ
    - CPUやメモリのスペックなど
    - OSやソフトウェア
    - 他のAWSサービス
- メリット
    - すぐに作れてすぐに壊せる
        - ためにしに作りたい、どのくらいアクセスが来るかわからない場合
    - 負荷が大きくなった場合に複製がすぐに作れて負荷分散させやすい
    - 不確定要素が多い場合に強みを発揮する
- デメリット
    - 定期的にメンテナンスや見直しが必要

# Amazon Elastic Block Store (EBS)

データをバイトのブロック単位で記録して保存しておく場所のこと

# Elastic Load Balancing (ELB)

サーバーに集中するアクセス(トラフィック)を振り分ける仕組み

- ELB
    - ALB (Application Load Balancing)
        - 対応プロトコル : HTTP,HTTPS
        - 振り分け先として静的IPアドレスを設定し、IPを持つホスト先へ転送することはできない
    - NLB (Network Load Balancing)
        - 静的IPアドレスを設定でき、そのままサーバーにIPを伝える設定にできる
        - 対応プロトコル : TCP,TLS
    - CLB (Classic Load Balancing)
        - 古いタイプのロードバランサーで、これから作るシステムではあまり使われない
        - 対応プロトコル : TCP,TLS,HTTP,HTTPS

# Auto Scaling

サーバーへのアクセス状態によって、サーバーの台数を増減する機能

- 単体のでの使用だけでなく、CloudWatchからサーバーの負荷情報を参照してスケーリングに役立てられる
hardhat consoleで別ウォレットからトランザクションを送る方法 | hardhat consoleの使い方

## 結論

```
const wallet = await ethers.getSigners(); //wallet情報取得
await contract.connect(wallet[1]).mint(); //walletを繋いで、トランザクション実行
```

## 詳細

### localhostでnodeの起動

```
yarn hardhat node
```
![スクリーンショット 2023-04-27 7.57.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/964a5e54-3582-2d38-4cb9-6f935695559f.png)

### コントラクトのデプロイ

```
npx hardhat run --network localhost scripts/deploy.ts
```
※ scripts/deploy.tsはhardhatのプロジェクトを作ったときに作られたファイルです。デプロイしたいコントラクトに合わせて修正してください。ファイル名を変更した時は、最後の`scripts/deploy.ts` のファイル指定の部分を変更してください。


### hardhat console

#### hardhat consoleの立ち上げ

```
npx hardhat console --network localhost
```
以下の作業はconsole内で実行 (コントラクトにトランザクションを送るための準備 ~)

#### コントラクトにトランザクションを送るための準備

```
const Contract = await ethers.getContractFactory("コントラクト名");
const contract = await Contract.attach("コントラクトのアドレス")
```

※ depoly.tsを修正していなければ、consoleにアドレスを吐き出すコードが含まれているので、そこで確認できます。(`console.log("..${〇〇.address}.")`みたいな箇所)
※ nodeを起動しているターミナルのログにもデプロイしたコントラクトのアドレスは表示されます


#### コントラクトにトランザクションを送る

```
await contract.mint()
```
コントラクトのmint関数を実行しています。(mint関数は自分で定義)

![スクリーンショット 2023-04-27 8.13.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/fb6ccb32-f002-1bf4-857c-7cbe3d6ace75.png)

0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 から実行されていることが分かります。
nodeを立ち上げた時に1番上に表示されたアドレスです。

#### 別アカウントからトランザクションを送る

```
const wallet = await ethers.getSigners();
await contract.connect(wallet[1]).mint();
```

![スクリーンショット 2023-04-27 8.15.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/8a928174-0189-d583-cd80-3e28d0a0731e.png)

0x70997970C51812dc3A010C7d01b50e0d17dc79C8から実行されていることが分かります。
nodeを立ち上げた時に2番目に表示されたアドレスです。

これで別アカウントからトランザクションを送ることが出来ました👏

　

ちなみに、walletにはnode起動時に割り当てられた20個分全てのアドレスの情報が入ってます。
![スクリーンショット 2023-04-27 8.19.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/38d40d0e-a106-2499-f532-6971e66bc08e.png)
【Swift】Firestoreで配列やMap型配列に要素を追加・削除する方法

# 配列への追加・削除
![スクリーンショット 2023-04-27 7.38.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640032/c1971e0b-7db7-2aaf-8cfc-3ab2acd569f2.png)
`users`というコレクションにある`taro`というドキュメントの`favorites`フィールドに要素を追加・削除することを考えます。
```swift
let taroRef = db.collection("users").document("taro")
// 追加
taroRef.updateData([
    "favorites": FieldValue.arrayUnion(["焼肉"])
])
// 削除
taroRef.updateData([
    "favorites": FieldValue.arrayRemove(["リンゴ"])
])
```
# Map型配列への追加・削除
![スクリーンショット 2023-04-27 7.45.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640032/9bebacf4-cfcf-add6-6f93-f826bddc8a6a.png)
`users`というコレクションにある`jiro`というドキュメントの`homework`フィールドに要素を追加・削除することを考えます。
`homework`フィールドはMap型の配列になっており、それぞれの要素には「科目名」と「優先度」のデータが入っています。
`[]`の数に注意してください。
```swift
let jiroRef = db.collection("users").document("jiro")
// 追加
jiroRef.updateData([
    "homework": FieldValue.arrayUnion([[
        "subject": "社会",
        "priority": 4
    ]])
])
// 削除
jiroRef.updateData([
    "homework": FieldValue.arrayRemove([[
        "subject": "国語",
        "priority": 1
    ]])
])
```
## 注意点
この方法では、配列に既に存在する要素と同じ内容のものは追加することができないので注意する必要があります。
上の例だと「カレー」「リンゴ」「ピザ」は既に存在するため、再度追加することはできません。
## 参考
https://cloud.google.com/firestore/docs/manage-data/add-data?hl=ja#update_elements_in_an_array
フローのテキストテンプレート

+ [スクリーンフローに戻る](https://qiita.com/Keiji_otsubo/items/228717557f9a72b92a36)


[HTMLのタグを消したい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Pk3qQ)

:::note

```
As for the <p>s in the message, simply change the drop down in your text template from "View as Rich text" to "View as plain text"
```

メッセージ内の <p> については、テキスト テンプレートのドロップダウンを [リッチ テキストとして表示] から [プレーン テキストとして表示] に変更するだけです。
:::

+ [Help with Flow Text Templates adding Extra blank line](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmQno)

:::note
try to use single <p> tag for all and use <br> tag to line break

```
<p>This is a paragraph.<br>This is another line in the same paragraph.</p>
```

:::


# ハイパーリンク：テキストテンプレート

+ [メールの本文をテキストテンプレートをフロー内で用意しているのですが、リッチテキストでハイパーリンクを貼ってもリンク化されない状況です。また、フロー内で数式変数を作成して本文に記載してもハイパーリンク化されない状況です。フロー内で送信するメールにてハイパーリンクの記載方法をご存じであればご教授頂きたいです！](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ah9X0)

:::note
メールをリッチテキストとして送信できているかを確認してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3d9141af-fd47-6091-a873-adc6e5413ebe.png)
:::


# 差し込み項目

+ [画面フローで作成した質問への回答をケースの１つの項目にまとめて表示させたい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epk8T)

:::note
各質問の結果をテキストテンプレート（プレーンテキスト）に配置してこのテキストテンプレートを使って更新する方法が可能です。

これを使えば改行もできるので、見やすい形で登録できると思います。

テキストテンプレートにその他のリソースの情報を参照するには、差し込み項目を使用します。

https://help.salesforce.com/s/articleView?id=sf.flow_ref_resources_texttemplate.htm&type=5
:::
PostGraphile の使い方

参考ページ
[PostGraphile Introduction](https://www.graphile.org/postgraphile/introduction/)

## 前提条件

```text
$ psql -U scott city
psql (15.2)
"help"でヘルプを表示します。

city=> select * from cities;
  id   |  name  | population |  date_mod  
-------+--------+------------+------------
 t3461 | 広島   |      72814 | 2001-09-14
 t3462 | 福山   |      41738 | 2001-07-21
 t3463 | 東広島 |      92513 | 2001-06-12
 t3464 | 呉     |      93167 | 2001-09-29
 t3465 | 尾道   |      95419 | 2001-03-18
 t3466 | 竹原   |      82314 | 2001-02-21
 t3467 | 三次   |      76152 | 2001-08-16
 t3468 | 大竹   |      37541 | 2001-07-07
 t3469 | 府中   |      46518 | 2001-10-09
(9 行)
```

## インストール

```bash
sudo npm install -g postgraphile
```

## サーバーの起動

```bash
npx postgraphile -c \
  'postgres://scott:tiger123@localhost:5432/city' \
  --watch --enhance-graphiql --dynamic-json
```

## クライアント

```bash:curl_get.sh
URL="http://localhost:5000/graphql"
#
curl -X POST \
	-H "Content-Type: application/json" \
	-d@query.json ${URL}
```

```bash:http_get.sh
URL="http://localhost:5000/graphql"
#
http ${URL} < query.json
```

```json:query.json
{"query": "query MyQuery { allCities { edges { node { id name population } } } }"}
```
タワーデフェンスゲーム　Unity　敵の機能　9/10 HPバーが０になった時消える処理を実装

# 概要

https://qiita.com/RYA234/items/b1f54272c1d63d95d859

前回の続きです。

今回はHPが０になった時消える処理を実装します。
以下gifアニメはaボタンを２回押して敵のHPが０になった時に消滅する様子です。
尚問題としては、敵が倒れたら次Waveの敵が現れないことです。
次回解決します。

![Die.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/55ece9b4-b810-e9bd-ac61-6946a48bed34.gif)

次へ

https://qiita.com/RYA234/items/2793200acb300ef6bf67



# 開発環境

IDE:Rider
Unity:2020.3.42(LTS)
OS:Windows10

# UnityEditor上の設定

前回と変更点なし

# 実装のポイント
EnemyHealthにDieMethodを追加します。処理の内容としては
１．HPの初期化
２．オブジェクトを非表示

を行います。


# コード部分
```diff_c_sharp:EnemyHealth.cs
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using UnityEngine;
using UnityEngine.UI;

public class EnemyHealth : MonoBehaviour
{
    // Start is called before the first frame update
    [SerializeField] private GameObject healthBarPrefab;
    [SerializeField] private Transform barPosition;

    [SerializeField] private float initialHealth = 10f;
    [SerializeField] private float maxHealth = 10f;

    public float CurrentHealth { get; set; }
    private Image _healthBar;
    void Start()
    {
        CreateHealthBar();
        CurrentHealth = initialHealth;
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            DealDamage(5f);
        }

        _healthBar.fillAmount = Mathf.Lerp(_healthBar.fillAmount, CurrentHealth / maxHealth, Time.deltaTime * 10f);
    }

    private void CreateHealthBar()
    {
        GameObject newBar = Instantiate(healthBarPrefab,barPosition.position,Quaternion.identity);
        newBar.transform.SetParent(transform);
        
        EnemyHealthContainer container = newBar.GetComponent<EnemyHealthContainer>();
        _healthBar = container.FillAmountImage;
    }

    public void DealDamage(float damageReceived)
    {
        CurrentHealth -= damageReceived;
+        if (CurrentHealth <= 0)
+        {
+            CurrentHealth = 0;
+            Die();
+        }
    }

+    private void Die()
+    {
+        CurrentHealth = initialHealth;
+        _healthBar.fillAmount = 1f;
+        ObjectPooler.ReturnToPool(gameObject);
+    }
    
    
}



```

```diff_c_sharp:ObjectPooler.cs
using System.Collections.Generic;
using UnityEngine;

public class ObjectPooler : MonoBehaviour
{
    // 中略
    public static void ReturnToPool(GameObject instance)
    {
        instance.SetActive(false);
    }
}


```


# 参考

Section4 17

https://www.udemy.com/course/learn-how-to-create-a-2d-tower-defense-game-in-unity-2020/learn/lecture/23020844#content


github コミット分

https://github.com/RYA234/2DTowerDeffenceMyLearning/commit/0ca80b2cc1940b053306451b45100430fe9e48ac


章まとめ

https://qiita.com/RYA234/private/6d878a7958a3c760c8af
Java Beans

## Java Beansとは

Javaコードで書かれた再利用可能なコンポーネントや仕様のこと
主にビジネスアプリケーションやGUIアプリケーションの開発で使用される

## Java Beansの特徴

- インスタンス変数：プロパティと呼ばれるインスタンス変数を持つ
→プロパティは、カプセル化され、getterおよびsetterメソッドを使用してアクセスされる

- イベントモデル：イベントモデルをサポートしている
→コンポーネントは、アプリケーションの他の部分とやり取りできる

- シリアル化：シリアル化に対応
→Java Beansオブジェクトは、ストリームに書き込んだり、ストリームから読み込んだりすることができる

- 継承：継承をサポートしている
→他のJava Beansから派生することができる
VSCodeでクリップボードの画像をそのままMarkdownに貼り付ける

VSCodeに下記のような設定を追加すると、クリップボードの画像をそのままMarkdownへペーストできるようになります（2023年4月時点）。

```jsonc
// settings.json
{
    "markdown.experimental.copyFiles.destination": {
        "**/*": "images/"
    },
    "editor.experimental.pasteActions.enabled": true,
}
```

実際にWindows上でペーストしてみると、次のような感じになりました。

```md
![Alt text](images/image.png)
![Alt text](images/image-1.png)
![Alt text](images/image-2.png)
```

画像は自動で `images` フォルダ内に連番で保存されました。

サクッとスクリーンショット入りのドキュメントを書く際にとても便利な機能だと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1662605/b60bbba8-03d7-0712-b28f-d80a71615470.png)

experimentalな設定なので将来的にどうなるかは不明ですが、もし使えなくなっても画像コピペは別ツールの [Obsidian](https://obsidian.md/) や [MarkText](https://github.com/marktext/marktext) の同等機能で一応は代替可能です。

この機能は下記の質問で偶然知りました。

https://stackoverflow.com/questions/75831497/how-can-i-paste-images-into-my-markdown-files-in-vs-code/

##### おまけ - 画像圧縮

Microsoftのlearn-imagesというVSCode拡張を使うと、フォルダ内の画像をまとめて縮小・圧縮できます。

https://marketplace.visualstudio.com/items?itemName=docsmsft.docs-images

コンテキストメニューにフォルダ内の画像を圧縮する項目が追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1662605/a3bd1427-42e8-0b5a-551b-88b3882106bd.png)

実行すると、巨大な画像をいい感じに縮小してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1662605/467ca288-a41a-8173-18e4-fae01024567c.png)

この拡張期のは [Microsoft Learn](https://learn.microsoft.com/) の編集者向けツール [vscode-docs-authoring](https://github.com/Microsoft/vscode-docs-authoring) の一つとして提供されているようです。
【zsh/iTerm2】lessの閲覧結果が通常の画面に残ってしまう＆マウスホイールによるスクロールが効かない不具合を治す

# 環境
- macOS 13.3.1
- zsh 5.9 (x86_64-apple-darwin22.0)
- iTerm2 3.4.19

# 症状
1. 本来 `less` で読んだ中身は通常画面(コマンド打ったりするとこ)に残らないはずであるが、それが**残ってしまう。**(図1)
1. `less` や `man` などで長い文書を読む際、マウスホイールによるスクロールが反映されない。それだけではなく、**上にスクロールすると通常画面が見えてしまう。**(図2)

### 画像
![図1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2316693/7e05f693-175f-205e-e8aa-b833f9928e9c.png "図1")
図1. このようにlessで見た中身が残ってしまう。通常ならこの画面には残らないはず。

![図2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2316693/dbe1075a-1442-7af5-f3ce-9c576598f605.png "図2")
図2. ウィンドウバーを見ると分かる通り、現在 `$ man ls`を実行中(qキーで抜ける前)。上にスクロールするとコマンド部分が見える。

# 原因
### lessのデフォルトオプション設定に-Xが付いていた
`~/.zprofile` にlessコマンドのデフォルトオプション設定があった。
そこにて **デフォルトで-Xオプションがつけられており、これがマウスホイールの動作に影響を与えていた。**

おそらくPreztoか何かを導入した際に自動で生成されたものだと思う(不明)。以下はいつの間にか書かれていたもののコピペ
```shell:~/.zprofile
# Set the default Less options.
# Mouse-wheel scrolling has been disabled by -X (disable screen clearing).
# Remove -X to enable it.
if [[ -z "$LESS" ]]; then
  export LESS='-N -g -i -M -R -S -w -X -z-4'
fi
```
~~こんな丁寧に書いてくれてるや〜ん~~

### iTerm2のprofile設定にalternate screenに関する項目があった
iTerm2 > Settings… > Profiles > Terminal に次のような設定項目がある。
**「 [x] Disable save/restore alternate screen 」**
この設定によって謎の内容保持が行われていた。

# 解決法
1. lessのデフォルトオプションから-Xをなくす。
1. iTerm2のprofile設定「Disable save/restore alternate screen」のチェックを外す。

※自分の好みによってこの辺の設定を変えるのもあり。


# おまけ
めっちゃ検索しまくったけどマジで見つからなくて泣いてた。これで助かる人がいればいいなぁ
俺たちはあといくつの「魏t」に出会うんだろうな

もう出会うことはありません。

## どういうことなの

日本語入力がオフだと思って入力したらオンだったりすることよくありますよね（何故かその逆はない）。

でも「半角/全角」キーの「日本語入力のオン/オフを切り替える」という動作に対して「そもそも今オンかオフかなんて知る由もない！ オンかオフかを知るために1文字打って削除するなんてまどろっこしくてできない！ ぼわーんと出てくるアレ[^1]は鬱陶しいから切ってる！ えっ？ タスクバーにあるIMEのアイコンが『あ』か『A』かで判断できるって？ 見てない。お前だけ見てた」という人のために、現在の日本語入力のオン/オフにかかわらず日本語入力をオンにする機能を「変換」キーに、同様にオフにする機能を「無変換」キーに割り当てる方法を備忘録として残しておきます。OSはWindows 10 バージョン 22H2です。

[^1]: 「IME 入力モード切替の通知」というらしいです。

## やり方

1. スタートメニュー
1. 設定
1. 検索欄に「IME」と入力すると出てくる「日本語 IME 設定」を選択
1. 「キーとタッチのカスタマイズ」を選択
1. 「キーの割り当て」の「各キーに好みの機能を割り当てる」を「オン」にする
1. 「変換キー」を「IME-オン」に、「無変換キー」を「IME-オフ」にする

## 結論

冪等性は大事。
【zsh】historyとaliasで、今日(昨日)実行した全コマンドを表示するコマンドを作った

# きっかけ・やりたいこと
- 最近実行したコマンドから検索をしたいって場面がある。
- 一覧で出したいので^+rはダメ。
- ちょっと前までなら `history | grep "hoge"` でいいのだが、historyの表示数によってはヒットしないこともある。
- なら、今日実行したコマンドを表示するコマンドを作って、それにgrepすればいいじゃん！
- ついでに今日と昨日の2日間verも作るか。

# 結果
```shell:~/.zshrc
# 今日の全履歴
alias histt='history -i 0 | grep --color=none "$(date "+%Y-%m-%d")"'

# 今日と昨日の全履歴
alias histtt='history -i 0 | grep --color=none -e "$(date "+%Y-%m-%d")" -e "$(date -v -1d "+%Y-%m-%d")"'

# おまけ: history自体も常に時刻表示＆30件表示にした。
alias hist="history -i -30"
```

# かんたんな解説
-iオプションは、時刻表示を有効にするオプション。yyyy-mm-dd形式で出してくれる。
historyへの引数0は、0番目(つまり最初)からの履歴を出力してねという意味。`$ history 0 10` みたいにすると0番目から10番目の履歴を出力してくれる。

あとはdateコマンドでいい感じの文字列を生成してgrepすれば完了。dateをちゃんと使ったことがなくてちょっと躓いた。

# 参考
どうせ同じだろと思ってlinux版date説明読んでたら、--dateオプションがないらしい。

https://qiita.com/___uhu/items/3c2312359da542cda163
おいお前ら、女の子紹介するわ

# Poeで女子を作った
![OIG-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66355/34889849-91b0-f105-d3b1-6169003ae069.jpeg)
彼女の名前は「小林たまき」とにかく無愛想だ。
諸君には彼女と打ち解けて話せるように頑張ってほしい。

https://poe.com/BuaisoGirl

話は以上だ。
【zsh】aliasを使ってpwdにクリップボードにコピーする機能を追加&クリップボードのパスにcdするコマンドを作成した

# きっかけ・やりたいこと
- 複数のシェルを扱うとき、一方のシェルのカレントディレクトリに他方のシェルでcdしたい事が多かった
- ↓↓↓みたいなことをしたい
1. 一方のシェルでいい感じのコマンドを打つ
1. クリップボードにパスがコピーされる
1. 他方のシェルでいい感じのコマンドを打つ
1. クリップボードのパスにcdしてくれる
- ついでにホームディレクトリは~で表示されてほしい。↑↑↑の用途なら不要だけど、普通にカレントディレクトリを他のソースコードとかに打ったりするときにそうであってほしいから。


+ pwdの結果をクリップボードにコピーするワンライナーを作ってaliasに登録すれば解決やん！→作るか〜
+ クリップボードのパスをcdにぶちこむワンライナーを作ってaliasに登録すれば解決やん！→作るか〜


# 結果
```shell:~/.zshrc
# pwdついでにパスをクリップボードにコピー
alias p='pwd | tr -d '\n' | sed "s;$HOME;~;g" | pbcopy ; echo "$(pbpaste)" ' 

# クリップボードのパスに移動
alias cdp='cd "$(pbpaste | sed "s;~;$HOME;g")"'
```

# 解説
## 前提: クリップボード関連のコマンド
```zsh:/bin/zsh
# pbcopy: クリップボードにコピー
$ echo "abc" | pbcopy

# pbpaste: クリップボードから貼り付け
$ pbpaste
abc
```

## pwdのほう
`pwd`の結果をパイプラインで加工加工。んでコピー。

`tr -d '\n'` で末尾の改行を削除。
`sed "s;$HOME;~;g"` でホームディレクトリ部分`$HOME`が含まれていれば`~`に置換している。

最後の`; echo "$(pbpaste)"`だが、pwdの(標準)出力が全部tr→sed→pbcopyに食べられちゃうので、pwdの結果を表示するために追加している。
echoの引数を`$(pbpaste)`にするとpbpasteの状態によって変な挙動をするので、ちゃんとダブルクォーテーションをつけよう！


## cdのほう

実はcdとかいうやつ、**標準入力を完全に無視する！！**(なんでや)
`$ echo "/bin" | cd` とか `$ pbpaste | cd`みたいにしても思うようになってはくれない。

代わりに `$ cd "$( pbpaste )"` を使う必要がある。

あと何故か~入りのままだとうまく動いてくれなかったので、`sed "s;~;$HOME;g"` を噛ませて展開している。

# 参考
https://qiita.com/catfist/items/0ebd4350cc2976a95105
英語が詰まったExcelシートを一括翻訳

# 背景
この前、英語で書かれたExcelファイルを渡されました。。。
Excelって、Wordと違って、一括変換できないんですよね。2016以下だと、一セルずつ
翻訳ボタン押さないといけなくて、英語ヨワヨワ人間の私からするとかなり辛いです。
そこで、Excelシートを一括翻訳してしまおうと思います。

# 環境

言語: python 3.10
モジュール:
 - xlwings
 - googletrans


# 実装

まず、Excelファイル「English.xlsx」を用意します。
今回は、以下から英語の記事のタイトルと要約部分を抜粋しました。

https://www.wired.com/

.pyファイルと同じ階層に保存してください。
このシートは"English"シートとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143329/e5886b32-d8cc-3a33-95f3-7b1e45501fa2.png)

また、翻訳を挿入するための"Japanese"シートを作成しておきます。

次に、翻訳するためのpythonファイルを実装します。

```englishTojapanese.py
import xlwings as xb
from googletrans import Translator

def main():
    translated = Translator()
    #エクセルシートを開く
    book = xb.Book(".\English.xlsx")
    sheet = book.sheets['English']
    ja_sheet = book.sheets['Japanese']
    #エクセルB列の最終行を求める
    end_row_title = sheet.range("B2").end("down").row
    #エクセルC列の最終行を求める
    end_row_content = sheet.range("C2").end("down").row
    Num = 1
    #Ｂ行のタイトルを翻訳して、Japaneseシートに翻訳を書き出し、A行に項番を書き出す
    for i in range(end_row_title -1):
        ja_sheet.range("A"+str(i+2)).value = Num
        Num = Num + 1
        text = sheet.range("B"+str(i+2)).value
        result = translated.translate(text,dest="ja")
        ja_sheet.range("B"+str(i+2)).value = result.text
        ja_sheet.range("B"+str(i+2)).wrap_text = True
    #C行の要約を翻訳して、Japaneseシートに書き出す
    for i in range(end_row_content -1):
        text = sheet.range("C"+str(i+2)).value
        result = translated.translate(text,dest="ja")
        ja_sheet.range("C"+str(i+2)).value = result.text
        ja_sheet.range("C"+str(i+2)).wrap_text = True
    #開いたエクセルシートを保存する
    book.save()
    #エクセルシートを閉じる
    book.close()
if __name__ == "__main__":
    main()
```

xlwingがpythonでExcelを操作するモジュールとなります。
以下、基本的なExcelの開き方からセルの値を取得・書き込み・保存する方法になります。
```
import xlwings as xb
book = xb.Book("エクセルファイルパス") #　エクセルを開く
sheet = book.sheets['シート名']　# シートを開く
cell_value = sheet.range("セル番号").value
sheet.range("セル番号").value = "任意の値" #セルに値を代入
book.save() #エクセルファイルを保存する
book.close() #エクセルファイルを閉じる
```
あとは今回、各特定の列の使用中の最終行を取得します。
```
end_row = sheet.range("セル番号").end("down").row #指定のセル番号から下向きに最終行を求める
```
翻訳ですが、googletransを使っていきます。
```
from googletrans import Translator
translated = Translator() #インスタンス作成
result = translated.translate("翻訳する文字列",dest="ja")　#日本語に翻訳
```

# 実行

では実行してみます。
こんな感じで、"Japanese"シートに翻訳を一括で翻訳できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143329/c4691c48-0b87-0819-3dab-51b19a21fd39.png)


# まとめ
とはいえ、本当にめんどくさい場合です。
英語の勉強するほうがいいですね。。。
Blenderの練習はじめた

# 技術を身につけたい
現在WEB制作会社で働いてるヘラクレスオオカブ子ちゃん。
特にモダンな技術を使うでもなく、Wordpressでサイトを作る日々。

**将来なんとなくフリーになってクリエイティブなことして食っていきて～～**
という舐めた考えをしているのですが、せっかくVtuberしてるしWebよりも物体（デジタルだが）を作る方で技術身につけたいなと思った所存。
Live2Dも勉強したいけど、自分の3Dが欲しいっていう欲求があるのでBlenderから勉強するのである。
これはその日記なのである。

# 目標
- 自分の3Dの体を作る
- イケそうやな、ってなったらSKIMAとかで仕事探す

# やったこと日記
とりあえずYoutubeでチュートリアル動画探して練習した
![tutorial.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983623/2be8c325-f9a6-7814-5cba-5c10e8fbbf2a.png)
[参考動画](https://www.youtube.com/watch?v=S6aAvxUx2ko)
ブロックチェーン関連の用語など（まとめ）

# はじめに
ブロックチェーン関連の用語などについてまとめていこうと思います。※ 随時更新予定

# 用語など
DeFi（Decentralized Finance）：ディーファイとは分散型金融のこと。中央管理者のいない金融仲介アプリケーション。

Dex（Decentralized Exchange）：デックスとは分散型取引所のこと。異なる仮想通貨を両替する取引所。

関係性：DeFi > Dex

Ethereum向けのコントラクトはSolidityで実装される。

EVM（Ethereum Virtual Machine）

Ethereumテストネット
-SepoliaかGoerliを使用する。

テスト用のイーサをMetaMask送る↓（sepoliaの場合）
https://sepolia-faucet.pk910.de/

# 参考
https://www.udemy.com/course/web3dapps
（Java一般の話として誤り記事でしたごめんなさい）Mybatis Generatorで生成したsetterについて

~~**DTOのセッターで値をセットするとき、値の末尾に半角スペースが入っていると自動的にtrimされます。**~~

~~※Java17で確認。他のJDKのバージョンは確認、調査していません。~~

```java
        CommentUser cu = new CommentUser();
        String name = "KM    ";
        cu.setUserName(name);

        System.out.println(cu.getUserName() + "aaa");
```

~~実行結果：KMaaa~~

~~※半角スペースが1つでも複数でもすべてtrimされます。~~


---------------------------------------------

~~全角スペースの場合はtrimされません。~~

```java
        CommentUser cu = new CommentUser();
        String name = "KM　　　　　　";
        cu.setUserName(name);

        System.out.println(cu.getUserName() + "aaa");
```

~~実行結果：KM　　　　　　aaa~~


-------------------------------------------

## これに気づいたきっかけ

MyBatisを使ってPostgreSQLにアクセスしています。
comment_userテーブルの主キーがuser_nameです。

この時、下記のコードを実行したらduplicateエラーが発生しました。
レコード検索して存在しなかったらテーブル登録という処理にしていたのに、なぜだ？

```java

    public void insertUserTables(String userName) throws Exception{

        try{
            CommentUser commentUser = commentUserMapper.selectByPrimaryKey(userName);
            // 検索結果がない場合、新規登録
            if (commentUser == null){
                System.out.println("新規登録");
                commentUser = new CommentUser();
                commentUser.setUserName(userName);
                commentUser.setNumOfComment(1L);
                commentUser.setTotalVolOfComment(0L);
                commentUserMapper.insertSelective(commentUser);
            }else{
                commentUser.setNumOfComment(commentUser.getNumOfComment()+1);
                // commentUser.setTotalVolOfComment(0L);
                System.out.println("更新");
                commentUserMapper.updateByPrimaryKey(commentUser);
            }
        }catch(Exception e){
            throw(e);
        }
    }

```

引数userNameの値を確認すると、「KM 」。※半角スペースがついている。

このとき、テーブルには「KM」が既に登録されているのですが、
「KM 」<>「KM」なので、commentUserMapper.selectByPrimaryKey(userName);の戻り値はnullになります。

ここまでは想定通り。

しかし、その後、commentUser.setUserName(userName);で入ったセットされた値は
**「KM 」ではなく「KM」。**

よってinsertで重複エラーになりました。

とりあえず、

```java
CommentUser commentUser = commentUserMapper.selectByPrimaryKey(userName.trim());
```

とトリムして解消しました。