OmniAICreator/Qiita-1.07M huggingface dataset:
PowerPlatformの環境間のソリューションの移行で学んだこと

# はじめに

本記事の主な目的は、PowerPlatformの環境間でソリューションを移行する際に困った経験を共有することで、読んでくださる皆さんが私（著者）の屍を踏み越えてより楽に移行作業をできるようになることです。

## ソリューションとは
Power Platformのソリューションは、Windowsのフォルダのように機能し、PowerApps、Dataverseテーブル、Power Automateフローなどのコンポーネントを一つのパッケージ内で整理し、バージョン管理と環境の移行に役立つツールです。

詳しくはこちらを見てください。

https://qiita.com/skuramoto/items/bb053bdc8b12b771c6e4

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641616/b534453b-efcf-3133-7500-964e80501c4b.png" width="300">

# ソリューションのエクスポートとインポートの方法
こちらに関してはすでに記事があるのでそちらの記事を参照してください。

https://qiita.com/skuramoto/items/a425e128cad2a827a5dc

本記事ではskuramotoさんが注意と書いているインポートできなかった際のトラブルシューティングを詳しく説明します。

## インポート時のエラーとトラブルシューティング
1. ソリューションをインポート
1. 参照
1. zipを選んで
1. 次へ
いざ、インポート！っと思いきや
「依存関係がありません」
・
・
・
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641616/958eeb97-4d63-2bd8-a2fb-29076c447719.png" width="50%">

どうやら、依存関係のあるものは移行先の環境にすべてあらかじめ存在していないといけないようです。

### エラーとなった場合の解決方法
時には、うまくいかない時があります。そんな時は、問題解決に全力を注ぎましょう。
移行に必要なコンポーネントを特定するため、「依存関係がありません」の隣の「リストを表示」ボタンをクリックして、不足している要素（テーブル、フロー、接続、等々）を確認し、それらをソリューションに追加します。

例えばテーブルが不足している場合：

1. 「既存を追加」を探して、「テーブル」セクションへ
1. 必要なテーブルを見つけ、選択してください
1. 「次へ」をクリックして進み、「追加」でテーブルをプロジェクトに含めます

:::note info

依存関係のリストを表示した際に、接続の表示名が「○○○○○_sharedc…」となって見たい情報が見えなくなってしまうと、どれを選べばいいのか分かりにくくなりますね。ここで役立つのが、開発者の親友、F12キーです。

1. F12を押して開発者ツールを開きます
1. 「要素を検証」を使って、省略された表示名をクリックします。すると、その全文が表示されます
1. これで、表示名の全貌がクリアに。あなたはもはや、謎の表示名に惑わされることはありません
<img src="http://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641616/7dd4f7e1-e242-b801-1ace-841ebbe86fb9.png" width="300">

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641616/133c7d7d-bc8b-52ea-c9ae-778756542906.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641616/f88d5b1f-b9f5-49df-519f-2a9542c93da9.png)

:::

もう一度インポートの作業を行えば今度は問題なく行えるでしょう。
またエラーが出た場合また同じ方法で対応しましょう。

# そもそもエラーを出さないために
移行前の準備として、まずはテーブルと選択肢から成るソリューションを移行し、続いてアプリやフローを含むソリューションの移行を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641616/52919b8d-bc7a-6819-7be8-58e0590342ad.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641616/61d6991d-cd30-cae8-ff88-d5ea0669d2c5.png)


## この方法にするメリット
1. 移行がしやすくなる：基盤となるものがまとまっていて、それさえ移行していれば後で移行されるフローやアプリでは依存関係の不足は起こりにくい

1. トラブルシューティングを簡単に行えるようになる：ソリューションごと果たしている役割が明確になっているので、トラブルが出た際の影響範囲が絞られて、修正も簡単になる

# まとめ

本記事は著者が試行錯誤して得た知識や対処法について解説しました。
PowerPlatformのソリューションの移行に関してお役に立てれば幸いです。
'GoogleMobileAds/GoogleMobileAds.h' file not found

Pods > Google-Mobile-Ads-SDK > Frameworks > GoogleMobileAdsFramework > GoogleMobileAds.xcframework > ios-arm64 > GoogleMobileAds.framework
このフレームワークをUnity-iPhoneのFrameWorkフォルダにコピー
![スクリーンショット 2024-03-28 16.01.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117011/7182d66b-3f66-dbb9-e7a1-59396fdb5df9.png)

TARGETS > Build Setting > Search Paths > FrameWork Search Pathsを開いてドラッグでパスを追加。このパスを追加することが解決法でフレームワークをコピーする場所はどこでもいい
![スクリーンショット 2024-03-28 16.03.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117011/e6ec7e13-ffef-c575-485f-0e039c56fa8b.png)
PaloaltoNetworks 次世代ファイアウォール(VMシリーズ)について

## はじめに
私が業務内で利用しているPaloalto(VMシリーズ)について概要を共有させていただきPJにて機器選定を行う際の一助になればと考えております。

## PaloaltoNetworks次世代ファイアウォールとは？
Paloalto社が提供する従来型ファイアウォール機能に加えて、アプリケーションの制御、ユーザーの識別、アンチウイルス、不正侵入防御、アンチスパイウェアやURLフィルタリング、クラウド型サンドボックス機能を持つ次世代型ファイアウォール製品となります。

## なぜ従来型ファイアウォールを使わないのか？
従来、各アプリケーションがそれぞれルールを守ってネットワークを利用してきました。
例えばTelnetは23番ポート、DNSは53番ポートというように、定められたポートを利用していました。
従来型ファイアウォールは、ポートの開閉を制御することによりセキュリティを確保することができましたが、昨今注目を集めている新しいアプリケーション群（Teams、Slackなど）は、WEBブラウザで利用する80/443ポートなど、企業活動において閉塞できないポートを利用して通信を実施しています。
上記からトラフィックをポートでしか見ない従来型のファイアウォールでは、制御ができないしどのように利用されているかの把握もできないのでアプリケーション単位で制御できたりできるような次世代ファイアウォールを利用している。

次世代ファイアウォールのどこが「次世代」かというと、『アプリケーションをきちんと識別し、制御できる』ということが「次世代」である所以だそうです。

## PaloaltoNetworks 次世代ファイアウォール(VMシリーズ)でできること
PaloaltoNetworks 次世代ファイアウォール(VMシリーズ)(以下PA-VM)では以下のことができる。

##### 1. 標的型サイバー攻撃対策が1台で完結する
標的型サイバー攻撃は、今までの単一の防御策では対抗できない。
対策として有効な多層防御をアプライアンス1台で実現できる。

[機能名]
・アプリケーション制御と可視化（App-ID）
・高性能UTM/IPS
・未知のマルウェア検知（クラウドサンドボックス WildFire）
・振る舞い検知（ボットネット検知）

##### 2. アプリケーション利用を制御
禁止したいアプリケーションのみを遮断し、許可されたアプリケーションを特定のユーザーのみに許可

[機能名]
・アプリケーション制御と可視化（App-ID）
・ユーザー識別（User-ID）
・モバイルデバイスをセキュアに利用(GlobalProtect)

##### 3. 情報漏洩防止
独自の入口・出口対策で新種や亜種のマルウェアを防ぐことができる。仮に感染した場合でも、いち早く発見し被害を最小限に留めることができる。
標的型攻撃で利用される特定国を指定して通信を遮断することができる。

[機能名]
・未知のマルウェア検知（クラウドサンドボックス WildFire）
・モバイルデバイスをセキュアに利用(GlobalProtect)
・振る舞い検知（ボットネット検知）

##### 4. ネットワークリスクの見逃しを防止
リスクの見逃しを防ぎ、必要な対策をタイムリーな検討を支援

[機能名]
・レポート機能
・統合管理製品 Panorama

## PA-VMのスペックについて
PA-VMシリーズについてはスペックがありCPU、メモリ、セッション数、HDDでそれぞれ必要量に応じて選択していく必要がある。
詳しくはURLを参照ください。

## おわりに
従来型ファイアウォールで対応しきれないPJにて機器選定をする際にはPaloalto社製品も候補に挙げてみてはいかがでしょうか？
従来型ファイアウォールの構築、NW構築を経験していると考え方については違和感のないものとなっております。


## 参考URL
[Paloalto社公式HP](https://www.paloaltonetworks.jp/network-security/vm-series-virtual-next-generation-firewall)
[PA-VMスペック一覧](https://docs.paloaltonetworks.com/vm-series/10-2/vm-series-deployment/license-the-vm-series-firewall/vm-series-models/vm-series-system-requirements)
LLM　コード3

## 文章生成する
```
from transformers import pipeline
generator = pipeline(
    "text-generation",model="abeja/gpt2-large-japanese"

)
outputs = generator("日本一番高い山は")
print(outputs[0]["generated_text"])
```
私の出力は
Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
日本一番高い山は金閣寺で、ここは世界遺産でもあり、世界有数の観光スポットだ。金閣寺のすぐ近くには、清水寺がある。清水寺のある奈良の鹿公園には、奈良公園を代表する日本庭園があり、多くの外国人
となり、精度があまりよくない？
ここでは後続に続くテキストを予測。GPTは次から次へと予測する。

## BERTを使ってマスク部を予測
```
import pandas as pd
fill_mask = pipeline(
    "fill-mask",model="cl-tohoku/bert-base-japanese-v3"
)
masked_text = "日本の首都は[MASK]である"
outputs = fill_mask(masked_text)
display(pd.DataFrame(outputs[:3]))
masked_text = "今日の映画は刺激的で面白かった。この映画は[MASK]。"
outputs = fill_mask(masked_text)
display(pd.DataFrame(outputs[:3]))
```
高確率で東京と予測できている。
面白いのが二文目で。をいれないと。や、が予測結果になる。
## seq2seq2モデルのtransformerバージョン
```

```
【学習メモ：Flutter入門編】Drawerの使い方

これから「Flutter」を勉強していこうと思っている人向けには「メモ」程度で参照してみてください。

■ メニューボタンの呼び方
以下の種類がある。

* ハンバーガーメニュー
* ケバブメニュー
* ドネルメニュー
* ミートボールメニュー
* ベントーメニュー

■ Drawer（ドロワー）メニューとは？
「ドロワー」は「引き出し」という意味で、メニューの表示方法が横から引き出しのように出てくるように見える事から成り立っている。

「ドロワー」の中に含まれている内容が「サイドメニュー」となる。

■ サイドメニューの構成
一番上は「DrawerHeader（ドロワーヘッダー）」を定義する。
各メニューは「ListTile（リストタイル）」のWidgetを利用する。

見た目のレイアウトは「column」or「ListView」のWidgetの子供（children:）に追加する形で問題ない。

■ メニューのアクションを登録
「ListTile」の項目に「onTap：」の項目を追加して、実行する関数等（go_router）を利用して画面遷移させる。

【サンプルコード】
```diff
return ListView(
  children: [
    DrawerHeader(
      child: Text('ドロワーヘッダー')
    ),
    ListTile(
      title: Text('メニュー１'),
+     onTap: () {
+       debugPrint('「メニュー１」がタップされました。');
+     }
    ),
    ListTile(
      title: Text('メニュー２'),
+     onTap: () {
+       debugPrint('「メニュー２」がタップされました。');
+     }
    ),
  ],
);
```

また「ListTile」には文字の横にアイコン等も描画が可能。

■ 「Drawer」メニューの追加方法
作成したサイドメニューのWidgetをimportとしておき、メインコードの方で「Drawer」に関する定義を追加する事で実現が可能。なお、実際にメニュー画面に表示させるよう為には、「Scaffold」の「drawer:」という項目への定義も忘れてはいけない。

【サンプルコード】
```
const drawer = Drawer(
  child: SideMenu(),
);

final scaffold = Scaffold(
    drawer: drawer,
);
```

上記定義で、画面にドロワー（引き出し）が連結されることになります。
また、「ハンバーガーメニュー」のアイコンについては、Flutterが自動的に表示してくれるようです。

■ 「Scaffold（スキャフォールド）」の6つの便利機能について
画面レイアウトを作成する際に定義している「Scaffold」には「6つ」の便利機能が存在している。

* appBar（アップバー）：画面上部（ヘッダー）
* drawer（ドロワー）：左サイドメニュー
* endDrawer（エンドドロワー）：右サイトメニュー
* body（ボディ）：本体
* floatingActionButton（フローティングアクションボタン：FAB）：画面右下にアクションボタンを表示
* bottomNavigationBar（ボトムナビゲーションバー）：画面下部（フッターナビゲーションメニュー）

# 最後に
Flutter（Dart言語）に関する最低限の情報を「学習メモ」としてまとめてみました。
内容に誤りがありそうであれば、遠慮なくご指摘いただけますと幸いです。

【学習の参考にした動画】
素敵な解説動画の作成ありがとうございます。
本記事の内容より。動画を見た方が解りやすいと思います。

https://www.youtube.com/watch?v=TOVjS4g4mWU&list=PLY1cxwSQf6nz6zo2Y_UJlDjGOpASAO4hd&index=12
【学習メモ：Flutter入門編】 go_routerの使い方

これから「Flutter」を勉強していこうと思っている人向けには「メモ」程度で参照してみてください。

■ go_router（ゴールーター）とは？
昔から使われていた「navogator」の仕組みが、時代の移り変わりで利用しにくくなってきたので、新しく「navogator 2.0」が提供されたが、仕様（仕組み）が複雑のため、その機能を使いやすくするため（補完するため）に提供されているパッケージ。

■ 「go_router」の使い方
「パス」と「画面」の組み合わせを決める（定義する）だけなようです。

■ 「go_router」使うための定義
「pubspec.yaml」に以下の定義を追加する必要がある。

```diff
dependencies:
+ go_router:
  flutter_riverpod:
  flutter:
    sdk: flutter
  cupertino_icons: ^1.0.6
```

保存するとVSCodeが、自動的に必要なパッケージをダウンロードしてくれる模様。

■ アプリ全体を作成する際のポイント
「StatelessWidget」をひな形を作成した際に付与されている「const」の定義は、「go_router」では一緒に利用する事ができないので、記載を削除しておく必要がある。
```diff
class MainApp extends StatelessWidget {
- const MainApp({super.key});
+ MainApp({super.key});
```

「go_router」による画面遷移を利用するために必要な定義を以下のように定義しておく必要がある。
```diff
@override
Widget build(BuildContext context) {
  // ここから
+ return MaterialApp.router(
+   routeInformationProvider: router.routeInformationProvider,
+   routeInformationParser: router.routeInformationParser,
+   routerDelegate: router.routerDelegate,
+ );
  // ここまでが「go_router」の決まった書き方となる。
}
```

画面の繊維は「go_router」の機能で用意されている「push()」と「pop()」を呼び出すことで簡単に画面遷移が可能となる。

なお「go()」という関数を利用する事で、直接指定したパスに遷移する事もできるようだ。

【定義例】
```
// 指定した画面に移動（進む）
push(BuildContext context) {
  context.push('/b');
}

// 一つ前の画面に移動（戻る）
back(BuildContext context) {
  context.pop();
}

// 指定した画面に移動（ジャンプ）
move(BuildContext context) {
  context.go('/c');
}
```

■ 「BuildContext」について
基本的には「Flutter」が自動で作成してくれるものであり、余り詳しく学習する必要は現時点ではないらしい。

# 最後に
Flutter（Dart言語）に関する最低限の情報を「学習メモ」としてまとめてみました。
内容に誤りがありそうであれば、遠慮なくご指摘いただけますと幸いです。

【学習の参考にした動画】
素敵な解説動画の作成ありがとうございます。
本記事の内容より。動画を見た方が解りやすいと思います。

https://www.youtube.com/watch?v=9lRpNOwHH4Y&list=PLY1cxwSQf6nz6zo2Y_UJlDjGOpASAO4hd&index=11
【学習メモ：Flutter入門編】 ListViewの使い方

これから「Flutter」を勉強していこうと思っている人向けには「メモ」程度で参照してみてください。

■ ListView（リストビュー）
SNS等で利用されている「無限スクロール」で利用されている。
一般的なリスト表示の仕様としては、まず表示したい数のデータ分の「モデル」を用意する必要がある。

* 描画：画面に表示されていない部分も描画処理がされている **（無駄な処理なので、アプリが重たくなる！）**
* 表示：画面に表示されている範囲だけが描画処理されている（仮想スクロール）

リストビューは「仮想スクロール」の仕組みを提供してくれている。
表示対象のデータが足りなくなった際に、追加でデータの取得処理を行う仕組みが「無限スクロール」という機能にあたる。

■ 「Column」Widgetと「ListView」Widgetの違い
【Column】
決められたスペースにバランスよくデータを配置できる。

【ListView】
たくさん存在するモデルの中から、決められた範囲の中に表示できる分だけ描画してくれる。
機能としては以下を提供してくれる。

* 仮想スクロール
* 無限スクロール

■ 「ListView」の定義方法
「ListView」のWidgetを作成する部分だけを抜粋してみました。
普段見慣れない定義が一部存在しているので、簡単に説明だけをのこしておきます。
```
final list = ListView.builder(
  itemCount: models.length,
  itemBuilder: (c,i) => modelToWidget(models[i]),
);
```

`itemBuilder: (c,i) => modelToWidget(models[i]),`

上記定義の「(c,i)」はそれぞれ
* c（context）：そのウィジェットのメタ情報&WidgetTree上の位置・・らしいです。（詳しく説明できなくてごめんなさい。）
* i（index）：何番目のモデルを参照するか番号を返却してくる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755252/c0e723f4-4fbf-2650-eab3-831a329c095a.png)

なお「models」の定義自体は事前に専用のclassを定義しており、テスト用に約20件のデータを宣言してあります。

■ 実際の動作画面のキャプチャ
スクロールしていくと、きちんとテスト用に作成したデータが表示されていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755252/8744d309-3938-3147-1131-e908bc75c5bf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755252/b02e58b6-6374-859c-c1f3-a5ccc0d0b06c.png)

■ その他
「引っ張り更新」の機能や「無限スクロール」等の機能については今回の説明では割愛させていただきます。（まだ作り方をしらないので・・）

# 最後に
Flutter（Dart言語）に関する最低限の情報を「学習メモ」としてまとめてみました。
内容に誤りがありそうであれば、遠慮なくご指摘いただけますと幸いです。

【学習の参考にした動画】
素敵な解説動画の作成ありがとうございます。
本記事の内容より。動画を見た方が解りやすいと思います。

https://www.youtube.com/watch?v=dZzkFJR8p-w&list=PLY1cxwSQf6nz6zo2Y_UJlDjGOpASAO4hd&index=10
CloudWatchLogsのログを日次でS3に転送

```
import boto3
import datetime
import time
import csv
import logging

def lambda_handler(event, context):
        # 実行日取得
    to_time = datetime.datetime.now()
    # 1日前取得
    from_time = datetime.datetime.now() - datetime.timedelta(days=1)
    # エポック時刻取得(float型)
    epoc_from_time = from_time.timestamp()
    epoc_to_time = to_time.timestamp()
    # エポック時刻をミリ秒にしint型にキャスト
    m_epoc_from_time = int(epoc_from_time * 1000)
    m_epoc_epoc_to_time = int(epoc_to_time * 1000)
    
    # S3からCSVファイルを読み込む
    s3 = boto3.client('s3')
    bucket_name = 'バケット名'
    key = 'example.csv'
    obj = s3.get_object(Bucket=bucket_name, Key=key)
    rows = csv.reader(obj['Body'].read().decode('utf-8').splitlines())
    
    client = boto3.client('logs')
    # ロググループに保存されているログをS3にエクスポート
    for row in rows:
        logging.basicConfig(level=logging.DEBUG)
        log_group_name = row[0]
        s3_bucket = row[1]
        
        client.create_export_task(
            logGroupName=log_group_name,
            fromTime=m_epoc_from_time,
            to=m_epoc_epoc_to_time,
            destination=s3_bucket,
            destinationPrefix=log_group_name
        )

        # ログエクスポートが実行中か確認し、実行中の場合処理を5秒停止
        time.sleep(5) #記載しないとエラーになる
        export_tasks = client.describe_export_tasks(statusCode='RUNNING')
        print(export_tasks)
        while len(export_tasks['exportTasks']) >= 1:
            export_tasks = client.describe_export_tasks(statusCode='RUNNING')
            # time.sleep(5)
```
【CloudOne】コンソールに接続し、ウィルス感染状況を確認したい


![コンソールに接続し、ウィルス感染状況を確認したい.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/a3355b45-5ab7-da94-7a19-58f563b8b27a.png)

## 本記事で実現できること
CloudOneコンソールに接続し、ウィルス感染状況等を確認する

## 前提
- AWSマネコンはログイン済み
- CloudOneのアカウントを所持していること。

## 簡単な解説
全部で7フェーズ

①下記のURLにアクセスする。
[ログイン画面URL](https://cloudone.trendmicro.com/login)

②メールアドレスとパスワードを入力し、ログインする。
![コンソールに接続し、ウィルス感染状況を確認したい (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/26236406-41b9-af32-f0b7-b757c62d50a5.png)


③アカウントの切り替えが発生する場合
　右上のメニューからアカウントの切り替えを選択する。
![コンソールに接続し、ウィルス感染状況を確認したい (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/a4ffc91b-46e2-d325-a9fe-e997bc8d6ced.png)

④切り替えたいアカウントを選択し、「**アカウントに移動**」をクリックする。
![コンソールに接続し、ウィルス感染状況を確認したい (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/cfa41e2e-4a1f-57f1-dd98-db4668bf7018.png)


⑤目的のアカウントに切り替えられたことを確認したら、次に「**File Strage Security**」を選択する。
![コンソールに接続し、ウィルス感染状況を確認したい (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/2979f4d8-544d-7bb5-fb8f-28d1f362a8ce.png)


⑥左のペインから「**Scan Activity**」を選択する。

![コンソールに接続し、ウィルス感染状況を確認したい (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/bcf24e1f-d47d-fbf8-0f7d-38a3d06854f6.png)

⑦以下のページに移り、CloudOneによるスキャン結果を確認することができる。
　**正常なファイルは緑**で、**問題のあるファイルは赤**で表示される。
　また、赤枠で囲った部分をプルダウンすることで、**最大30日前まで**の結果が確認できる。

![コンソールに接続し、ウィルス感染状況を確認したい (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/821eb664-be66-5c0e-11b8-197f7f06c023.png)

## まとめ
本稿が、CloudOneでウィルス感染状況等の確認を行いたい方の参考になれば嬉しいです。

ITエンジニア向け、AWS資格取得を目指す方向けに個人ブログで記事も投稿していますので、
合わせて読んでもらえると嬉しいです。
[ことなの学校(個人ブログ)](https://kotona-school.com)

更によりレベル感の高そうなAWS関連の発信はZennの方で行います。
こちらももしよければフォロー、ご確認いただけると嬉しいです。
[Zenn個人アカウント](https://zenn.dev/tomo_itbizblog)

Twitterでも役立つ情報を発信しますのでフォローしてもらえると嬉しいです 
→ [@tomo_ITBizBlog](https://twitter.com/tomo_ITBizBlog)
equal to 操作の "..." と "~~~" 間での照合順序の競合を解決できません の対処法

データベースAのテーブルAのカラムAの値がとデータベースBのテーブルBのカラムBに含まれるレコードのみアップデートしたいとき以下のようなクエリを実行したとする

```sql
UPDATE [データベースA].[スキーマ].[テーブル名A]
SET [カラムX] = 'hoge'
WHERE
  [カラムA] IN (
    SELECT [カラムB]
    FROM [データベースB].[スキーマ].[テーブル名B]
  )
```

すると以下のようなエラーが発生することがある
```
equal to 操作の "japanese_ci_as" と "japanese_xjis_100_ci_as" 間での照合順序の競合を解決できません。
```

上記のエラーは データベースBの照合順序が"japanese_ci_as"でありデータベースAの照合順序が"japanese_xjis_100_ci_as"に設定されているため起きる

エラー解消のためには データベースBのカラムB から取得した値の照合順序を COLLATE句で"japanese_xjis_100_ci_as"に設定してやればよい
```sql
UPDATE [データベースA].[dbo].[テーブル名]
SET [カラムX] = 'hoge'
WHERE
  [カラムA] IN (
    SELECT [カラムB] COLLATE Japanese_XJIS_100_CI_AS --データベースAの照合順序を指定する
    FROM [データベースB].[dbo].[テーブル名B]
  )
  ```

  参考サイト
  https://learn.microsoft.com/ja-jp/sql/t-sql/statements/collations?view=sql-server-ver16
Cloudflare PagesとCloudflare Accessで安全にWebサイトを共有する

## Webサイトを特定の人に向けて共有したい！

- 自分だけが使えればいい
- 社内の一部にだけ公開したい

などなど、特定範囲にだけWebサイトを共有するニーズは、常に一定存在していると思います

## そんなあなたに！

Cloudflare Pages + Cloudflare Accessという技術スタックがおすすめです

## Cloudflare Pages

- Webアプリケーション（サイト）を専門とするPaaS
- VercelやNetlify、Amplify Hosting相当のサービス
- GitHub連携、CLI経由、Zipのアップロードなどデプロイ方法は色々
- ブランチ単位でデプロイする機能もあるよ！
- SSRしない限りは完全無料
  - SSRする場合も1000万アクセスぐらいまでは無料（2024/9/5）

https://pages.cloudflare.com/

https://qiita.com/aki-y/items/900fdf0209357cb7b08e

## Cloudflare Access

- Cloudflare ZeroTrustの1機能
- Cloudflareでプロキシしているアプリケーションなどに様々なアクセス制限を追加できる
    - IP制限、メール認証、SAML、OpenIDConnect etc...
- 50名までは無料！
  - 小規模なチームなら十分

https://www.cloudflare.com/ja-jp/zero-trust/products/access/

https://dev.classmethod.jp/articles/cloudflareaccess-ztna/

## 手順

1. Cloudflare Pagesにデプロイ
1. Pagesプロジェクトの設定からアクセス制限を有効にする

おわりです！

## 認証掛けられるとどうなる？

こんな感じ
SAMLのみ有効化しています

![cloudflare-access.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591669/82091cd5-9470-121a-9e99-22a4add2f6d5.png)

## 注意点

便利ですが難点か注意点があります

- Pagesの設定でアクセス制限を有効にしても、本番環境の.pages.devドメインには認証がかかりません
    - 手動で認証対象に本番環境を含める必要があります
    - 初期状態では一番上のワイルドカードサブドメインのみ対象になっているはずです
    - 2番目のサブドメイン指定なしの設定が必要です
      ![スクリーンショット 2024-03-28 14.46.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591669/654abb09-365e-c387-7f12-5baa1647103b.png)

- GitHub連携するといきなりデプロイが始まるので、アクセス制限を掛ける前に公開されてしまう
    - ビルドをわざと失敗させる（ビルドコマンドを適当に設定するなど）など、工夫が必要
- Zipで公開する場合も空Zipを渡すと言った工夫をしたほうがいいでしょう

## 認証方法

- メール認証
    - デフォルトで有効
    - メールを飛ばして認証コードを入力させる方式
    - メールアドレスのドメインを制限できます
        - @dokokanokigyou.co.jpのみするなど
    - ただ、届くまでやたら遅延することがある…
- SAML、OpenIDConnect
    - 個人的なおすすめ
    - 非常にシームレスに連携可能
    - Cloudflare Access側の追加費用がなく素晴らしい
- その他
    - IP制限などなど

最初はメール認証で検証し、良さそうならSAML、OpenIDConnectの設定を行うのがおすすめです

AWSのIdentify CenterやCognito、GMOトラスト・ログイン、Auth0など、個人 or 少人数であれば非常に安価でSAML、OpenIDConnetを提供するサービスもあるので、連携しておくと幸せになれます

## 最後に

- Cloudflareはいいぞ
- 設定が容易でかつ、（SAMLやOpenIDConnect提供側が対応していれば）MFAも絡めて認証できるため、非常にセキュアに共有する事ができます
- 本記事のスコープから外れているため省略しましたが、Cloudflare Pagesも非常に魅力的なサービスです
    - サーバサイドも行けるし、ホスティングの費用がほぼかからない！
MistralForTokenClassificationによる日本語品詞付与モデルSwallow-MS-7b-uposをリリース

[3月18日に書いた](https://qiita.com/KoichiYasuoka/items/6e0d3b23e680879a4314)MistralForTokenClassificationを使って、[Swallow-MS-7b-upos](https://huggingface.co/KoichiYasuoka/Swallow-MS-7b-upos)を[作ってみた](https://huggingface.co/KoichiYasuoka/Swallow-MS-7b-upos/blob/main/maker.sh)。NVIDIA A100-SXM4-40GBを8枚使えば、モデルの作成時間を1時間30分にまで短縮できるようになったが、予想に反して品詞付与の精度はイマイチだったりする。

```
>>> from transformers import pipeline
>>> tag=pipeline("upos","KoichiYasuoka/Swallow-MS-7b-upos",trust_remote_code=True)
>>> nlp=lambda x:[(x[t["start"]:t["end"]],t["entity"]) for t in tag(x)]
>>> print(nlp("予想に反して品詞付与の精度はイマイチ"))
[('予想', 'NOUN'), ('に', 'ADP'), ('反', 'B-NOUN'), ('して', 'I-NOUN'), ('品', 'NOUN'), ('詞', 'B-NOUN'), ('付与', 'I-NOUN'), ('が', 'ADP'), ('イマイチ', 'B-VERB')]
```

うーむ、[昨日の記事](https://qiita.com/KoichiYasuoka/items/71c23f945b0c59db5c4a)と同様に、「反」「し」「て」とトークナイズして

> [('予想', 'NOUN'), ('に', 'ADP'), ('反', 'B-VERB'), ('し', 'I-VERB'), ('て', 'SCONJ'), ('品', 'B-NOUN'), ('詞', 'I-NOUN'), ('付与', 'NOUN'), ('の', 'ADP'), ('精度', 'NOUN'), ('は', 'ADP'), ('イマイチ', 'ADV')]

と品詞付与できればいいのだけど。すでに[Pull Request](https://github.com/huggingface/transformers/pull/29878)も出てるので、さて、どうやって精度あげようかな。
240328 dependencies issue in nuxt.js 

## Situation
* download website data from Git Hub which is pushed 4 years ago from a different environment so taht update information and re-deploy.
* failed to `nuxt dev` because nuxt is not found. 

## How to solve errors

1. `npm install` --> failed to install node-sass

2. interpret error code to solve dependencies issues and change the version to appropriate one `npm install package_name@version`

   * node-sass require python@2 but @3 is set
     * get python path using `which python2`
     * set python@2 in npm `npm config set python python2_path`
   * npm was  downgraded to @8 for python@2
   * nuxt was downgraded to @2
   * sass-loader was downgraded to 10.0.2

3. Node-sass install

4. after these version changes, run `npm audit fix`

5. install modules required: vue-meta[^1] / vue-no-ssr / vue-router@3 

   1. install required modules in according to errors `npm install module_name` --> module names will be on "dependencies" of `package.json`.
   2. remove old modules and install content `rm -rf node_modules` -->`rm package-lock.json`.
   3. npm install` --> `node_modules` and `package-lock.json` (contents installed is recorded in this file) will be generated. 


*vue-meta installation help:  https://github.com/nuxt/nuxt/issues/2535

*vue-router@3 installation help (vue-router@4 competed with vue@3): https://stackoverflow.com/questions/72444072/i-cant-install-vue-router-by-npm
Drupalのバックアップや復元方法

### データベースのバックアップ

```shell-session
$ drush sql:dump --result-file=../backup.sql
```

プロジェクトルート直下にbackup.sqlファイルが生成される。


### フルバックアップ

```shell-session
$ drush archive:dump --destination=../archive.tar.gz
```

プロジェクトルート直下にarchive.tar.gzファイルが生成される。展開するとコード、データベース、ファイルのバックアップファイルにアクセスできる。

### バックアップファイルからデータベースをインポートする

```shell-session
$ drush sql:cli < backup.sql
```

データベースのバックアップファイルが.gzで圧縮されている場合は、次のコマンドで解凍してからインポートする。

```shell-session
$ gunzip backup.sql.gz
```
【Flutter】最近実装する上で役に立った記事特集

# UI周り

満を持して。
Expandedを有効に使えるようになると、デバイス間のサイズ微調整を回避できると思うんですよね。

https://qiita.com/suga_slj/items/d740247537ea24a994ea

---

TextFormFieldの最大文字数の指定に！

https://zenn.dev/mukkun69n/articles/67462fdca73a06

# エラー対応周り

iOSビルドで以下のエラーに詰まった時の対応。
RunnerTestsを作成するか、PodFileのコメントアウトをするかのどちらかですね。

```
Unable to find a target named RunnerTests in project Runner.xcodeproj, did find Runner
```

https://minpro.net/unable-to-find-a-target-named-runnertests-in-project-runner-xcodeproj-did-find-runner

https://zenn.dev/tsukatsuka1783/articles/3a857b86626a0e

---

FlutterWebでdart:ioのPlatform判定を入れた時に起きた不具合。

https://zenn.dev/ryo_ryukalice/articles/140a64f894afad

---

SharedPreferencesやenv、Firebaseのなど、アプリ起動時に初期化やインスタンス化を行った際に、```Zone mismatch```とエラーが吐かれた時に、公式がベストプラクティスを紹介してくれていたのでその通りに解決しました。

https://docs.flutter.dev/release/breaking-changes/zone-errors


# パッケージ周り

Firebase導入時のセッティングに！

https://firebase.google.com/docs/flutter/setup?hl=ja&platform=android

---

Freezedパッケージを使用する際に！

https://zenn.dev/sae_eng/articles/ed68107fdae18d

---

参考サイトどっか行っちゃったけど、envを実装するとき参考にしてください。

https://qiita.com/suga_slj/items/991bca9f241fbfcce111

---
# 番外編

これは、あ〜なるほどなって思った。
実際ローディングは基本的に```CircularProgressIndicator()```を使ってるから、コンポーネントにしてしまうのと使い勝手いいかも。

https://zenn.dev/3ta/articles/807b3d2009e093
JavaScript 「今月の最終日」を取得するコード

## 概要

JavaScriptにて今月の最終日を取得する方法を簡単にまとめる。

## 方法

下記のように記載する。

```js
const today = new Date();
const todayYear = today.getFullYear();
const todayMonth = today.getMonth() + 1; // getMonthは1月の場合０を、2月の場合1を返すため+1している。
const lastDay = 0; // 月末日は日付を0に設定することで取得できる。

var endOfMonthDate = new Date(todayYear, todayMonth, lastDay);

console.log(endOfMonthDate);
```
【JavaScript】同期処理と非同期処理 part1

## はじめに
JSにおける同期処理と非同期処理の違いについて知らなかったので、理解を図るべくメモを残したいと思います。

この記事では、まだあまり深いところにはまだ立ち入らないと思います。

コードなどは以下のサイトからお借りしています。

https://jsprimer.net/basic/async/

## 同期処理（sync）とは？
* （おそらく）初心者が最初に学ぶコードの書き方
* コードを順番に処理していき、一つの処理が終了するまで次の処理は始まらない
* つまり実行している処理は一つだけ

## 非同期処理（async）とは？
* コードは順番に処理して行くが、一つの非同期処理が終わるのを待たずに次の処理を評価する
* つまり同時に実行している処理が複数ある

## なぜ非同期処理が必要なのか？
* 同期処理だと問題になる場面がある
* 例えば以下のように同期的にブロックする処理がある場合

>次のコードのblockTime関数は指定したtimeoutミリ秒だけ無限ループを実行し、同期的にブロックする処理です。 timeoutミリ秒経過したかの判定には、無限ループの中でUnix時間（1970年1月1日午前0時0分0秒から経過した時間）のミリ秒を返すDate.nowメソッドを利用しています。 このblockTime関数を呼び出すと、指定時間が経過するまで次の処理（タスクB）は呼ばれません。

```javascript: 
function taskA() {
    console.log("タスクAを実行 at " + Date.now());
}
function taskB() {
    console.log("タスクBを実行 at " + Date.now());
}
// 指定した`timeout`ミリ秒経過するまで同期的にブロックする関数
function blockTime(timeout) {
    // Date.now()は現在の時間をUnix時間（1970年1月1日午前0時0分0秒から経過した時間）のミリ秒を返す
    const startTime = Date.now();
    // `timeout`ミリ秒経過するまで無限ループをする
    while (true) {
        const diffTime = Date.now() - startTime;
        if (diffTime >= timeout) {
            return; // 指定時間経過したら関数の実行を終了
        }
    }
}
taskA();
blockTime(1000); // 他の処理を1000ミリ秒（1秒間）ブロックする
taskB();

```

* 同期的にブロックする処理があると、ブラウザでは大きな問題になる
* なぜならJSはブラウザのメインスレッドで基本的に処理されるから
* メインスレッドでは表示の更新といったUIの処理も行なっている
* そのためメインスレッドをJSの処理で占有すると、表示の更新もフリーズしたようになる

先程のコード例では1秒間コードの実行をブロックしています。

これにより、画面も1秒間スクロールできないといったUI面での問題が出るわけですね。

## しかし・・・非同期処理もメインスレッドで処理される

同期処理はメインスレッドで基本的に処理され、ブロックする処理などがあると、他の表示更新などに悪影響を及ぼします。

しかし非同期処理も基本的にはメインスレッドで処理されます。

非同期処理はメインスレッドで処理されないから、同期的なブロックの影響を受けないと思いがちですが、そうではありません。

```javascript
function taskA() {
    console.log("タスクAを実行 at " + Date.now());
}
function taskB() {
    console.log("タスクBを実行 at " + Date.now());
}
function taskAsync() {
    console.log("非同期のタスクを実行 at " + Date.now());
}
// 指定した`timeout`ミリ秒経過するまで同期的にブロックする関数
function blockTime(timeout) {
    const startTime = Date.now();
    while (true) {
        const diffTime = Date.now() - startTime;
        if (diffTime >= timeout) {
            return; // 指定時間経過したら関数の実行を終了
        }
    }
}

const startTime = Date.now();
taskA();
// 10ミリ秒後にコールバック関数を呼び出すようにタイマーに登録する
setTimeout(() => {
    const endTime = Date.now();
    taskAsync();
    console.log(`非同期処理のコールバックが呼ばれるまで${endTime - startTime}ミリ秒かかりました`);
}, 10);
blockTime(1000); // 1秒間処理をブロックする
taskB();
```

上のコードでは、setTimeout関数で、非同期処理のコールバック（taskAsync()）が呼ばれるまで何秒かかったかを計測しています。

setTimeout関数内では10ミリ秒後にtaskAsync()を呼び出すように設定しています。

しかし実行してみると、コールバックが呼び出されるまでに1秒以上を要します。

これは非同期処理が同期処理と同じくメインスレッド内で処理されており、同期的なブロック（blockTime(1000)）の影響を受けているためです。


## 疑問など
* 「同期的に」ブロックする処理とは何か？非同期的にブロックする処理があるのか？
* 非同期処理もメインスレッドで処理されるとしたら、非同期処理の存在価値は？

## 参考・引用
https://jsprimer.net/basic/async/
ZED SDK で、WORLD 座標系の点群を取得する

# 想定する読者
stereolabsのzed2, zed mini, zed x などのステレオカメラの利用者
いまどきのステレオカメラは何ができるのかを知りたい人

# 前提
ZED SDK 4.0
Ubuntu 20.04
ZED2i
Python 版のAPI

# 本文
- ZED2iなどのstereolabsのカメラにはIMUのデータが利用でき、カメラの姿勢が得られる。
- そのため、以下のようにデータを取得する時点で、カメラの姿勢を考慮した世界座標系(WORLD 座標系）が得られることを期待するだろう。
```.py:
zed.retrieve_measure(point_cloud, sl.MEASURE.XYZRGBA)
```

## 動作スクリプトの断片

```.py:
runtime_parameters = sl.RuntimeParameters()

# runtime_parameters.measure3D_reference_frame = sl.REFERENCE_FRAME.CAMERA
runtime_parameters.measure3D_reference_frame = sl.REFERENCE_FRAME.WORLD

point_cloud = sl.Mat()
if zed.grab(runtime_parameters) == sl.ERROR_CODE.SUCCESS:
    zed.retrieve_measure(point_cloud, sl.MEASURE.XYZRGBA)
    points = point_cloud.get_data()

```

このようにすることで、最初から、world座標系での点群を得ることができる。
Databricksのインタラクティブデバッガー

こちらの新機能を試します。

https://docs.databricks.com/ja/notebooks/debugger.html

:::note info
**プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

# 要件

- Pythonノートブック
- Databricks Runtimeバージョン 13.3 LTS 以降。
- アクセスモードは、**シングル ユーザー**(割り当て済み) または **[分離共有なし]** である必要があります。

# 設定

**[実験的な機能]** セクションで、**[Python ノートブック インタラクティブ デバッガー]** をオンにします。

![Screenshot 2024-03-28 at 9.46.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c26ae5ae-665c-661e-7eba-644a7bc07e54.png)

# ウォークスルー

DatabricksランタイムML 15.0のクラスターを使います。以下のロジックを記述します。

```py
def foo(df):
  print(df)
```
```py
import time
import pandas as pd

d = {"col1": [1, 2], "col2": [3, 4]}
df = pd.DataFrame(data=d)
x = 5
time.sleep(6)
x = 6
print("pre foo")
foo(df)
print("done!")
```

## ブレークポイントの設定

![](https://docs.databricks.com/ja/_images/breakpoints.gif)

## デバッガの起動

1つ目のセルを実行し、2つ目のセルを実行する際に**セルをデバッグ**を選択します。
![Screenshot 2024-03-28 at 14.03.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5ed75886-0d3d-4e6e-269a-be051536d0de.png)

デバッグメニューと変数エクスプローラが表示されます。
![Screenshot 2024-03-28 at 14.23.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/62c45a54-f94f-1e8e-c85b-4fa2c7371b46.png)

## デバッガの実行

実行中の行は赤く表示されます。次の行に移動します。
![Screenshot 2024-03-28 at 14.37.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3afdcfde-e33c-c420-26b3-ed2d1bd2b225.png)

変数`x`の値が更新されます。
![Screenshot 2024-03-28 at 14.38.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/17bae584-6d1a-a54d-dd66-2eb61009c5a1.png)

関数`foo`にフォーカスされている状態で、**Step in**を選択します。
![Screenshot 2024-03-28 at 14.40.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/104e9a5c-b470-b58b-0505-ebb808b5b9b3.png)

関数の挙動を確認できます。
![Screenshot 2024-03-28 at 14.40.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2a8e0026-d0af-f5e0-a9fc-4c9ac8152148.png)

一番下まで実行するとデバッガーが終了します。
![Screenshot 2024-03-28 at 14.41.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e8c41924-2adb-33ac-054b-c067724528f3.png)

是非ご活用ください！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
「現代数理統計学の基礎」演習問題解法メモ　第7章問4～6

問4　すっきりわからないままとりあえず記載しています。
問6　Xはn個で、Yはm個です。文字が小さいので見落としやすいです。また、iidですね。(2)もすっきりしません。
![第7章問4 P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/74a5e970-3e40-fe3c-6070-08da864545ae.jpeg)
![第7章問4 P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/ce2a710d-1f4c-ecaf-5987-f3100e46c0e0.jpeg)
![第7章問4 P3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/d77586bf-2a7f-8b1b-601e-98e5b03d26fb.jpeg)
![第7章問5 P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/b3467a6a-a9a1-7aa4-67e8-5f345b626a07.jpeg)
![第7章問5 P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/e88c6291-4f1f-f9e5-5e20-f022b86b7f45.jpeg)
![第7章問5 P3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/45ebbdd1-1581-73da-b79f-03114d835fb8.jpeg)
![第7章問6 P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/14a73b73-f0c2-8032-9d45-778fd383911e.jpeg)
![第7章問6 P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/01fc63c0-1ce9-4c2b-ef32-8d6517c0a265.jpeg)
![第7章問6 P3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/36eada5b-3099-f888-d6e8-13dc18e828b8.jpeg)
![第7章問6 P4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/f4ab9c84-f9fd-e87f-2d19-e090d7fe2faa.jpeg)
[PowerShell]PowerShellでファイルをコピーする方法[Copy-Item]

# PowerShellでファイルをコピーする方法について

今回は、PowerShellでファイルのコピーをする方法、Copy-Itemコマンドを紹介します！

## Copy-Itemの基本的な使い方

現在のPowerShell実行ポリシーを確認するには、次のコマンドを使用します。

```powershell
Copy-Item -Path <source> -Destination <destination>
```
`<source>`: コピー元のファイルやフォルダーのパスを指定します。
`<destination>`: コピー先のフォルダーのパスを指定します。

例えば、Desktopフォルダー内のexample.txtをDocumentsフォルダーにコピーする場合、以下のようにコマンドを実行します。

```powershell
Copy-Item -Path C:\Users\Username\Desktop\example.txt -Destination C:\Users\Username\Documents\
```
## 追加オプション
1.**再帰的にコピー**
フォルダー内のすべてのファイルやフォルダーを含めてコピーするには、`-Recurse`オプションを使用します。
```powershell
Copy-Item -Path <source> -Destination <destination> -Recurse
```
2.**ファイルの上書き**
ファイルの上書きするには、`-Force`オプションを使用します。
```powershell
Copy-Item -Path <source> -Destination <destination> -Force
```
3.**ログの記録**
コピー操作をログに記録するには、`-PassThru`オプションを使用します。これにより、コピーされたファイルやフォルダーの情報が表示されます。
```powershell
Copy-Item -Path <source> -Destination <destination> -PassThru
```
## まとめ

今回は、PowerShellでファイルのコピーをする方法、Copy-Itemコマンドを紹介しました！
今回の記事を参考に、Copy-Itemコマンドを使用してみてください！
Tips: BigQueryで直近の期間で絞り込みたい時は*_SUB関数が便利

## この記事は何

TreasureDataには以下のような`TD_INTERVAL`という、直近の機関による絞り込みを行う関数が存在します。

```sql
SELECT *
FROM example_tables
WHERE TD_INTERVAL(time, '-30d/now', 'JST') --　直近30日のデータを絞り込む
```

BigQueryにはこのような関数は存在しないため、`BETWEEN`を用いてクエリを書く必要があります。
この時に、`*_SUB`関数を使うと簡単に書けるよ、という記事です。

## `*_SUB`関数とは
`*_SUB`関数とは、日時系の時間の引き算を行える関数です。
`DATE`型、`DATETIME`型、`TIMESTAMP`型、色々な型に対応した関数が用意されています。

https://cloud.google.com/bigquery/docs/reference/standard-sql/date_functions#date_sub

https://cloud.google.com/bigquery/docs/reference/standard-sql/datetime_functions#datetime_sub

https://cloud.google.com/bigquery/docs/reference/standard-sql/timestamp_functions#timestamp_sub

この`*_SUB`関数を用いると、以下のような書き方で直近〇〇日のデータを出すことができます。
`DATETIME`型を用いる場合は以下のように書けます。

```sql
SELECT *
FROM example_tables
WHERE time BETWEEN DATETIME_SUB(DATETIME_TRUNC(CURRENT_DATETIME('Japan'), DAY), INTERVAL 30 DAY) AND CURRENT_DATETIME('Japan')　--　直近30日のデータを絞り込む
```

クエリ内で用いている`DATETIME_TRUNC`関数は、時間の丸め込みを行う関数です。

https://cloud.google.com/bigquery/docs/reference/standard-sql/datetime_functions#datetime_trunc
Terraformにて、実践的なAzureサイトインフラを作成する。

# はじめに

naritomoと申します。

本職はインフラエンジニアを行っています。
最近扱ったterraformについて、更に進めたAzureインフラを作ってみました。

いろいろアドバイスいただけると嬉しいです。

## 立ち上げ概要

Azureにて2つのサブネットを作成し、それぞれのサブネットでWindows/Linuxを立ち上げ、片方のサブネットのVMにパブリックIPを割り当てる。

ソースは以下になります。

https://github.com/naritomo08/terraform_azure_source_public

## 前提

以下のページなどを参考に、terraform稼働環境を作成し、OCIでの適当なリソースが作成できる状態にあること。

[Terraformをdocker環境で立ち上げてみる。](https://qiita.com/naritomo08/items/7e5a9d1b7eaf18dc0060)

Dockerを使用しない場合、以下のコマンドを利用できている状態になっていること。

```bash
aws

brew
*Terraform導入時に必要

tfenv
*terraform稼働コンテナを利用しない場合は必要
```

### (コンテナ利用しない場合)指定バージョン(1.５．７)のterraformを導入する。

```bash
tfenv install
```

## terraformソースファイル入手

terraformを動かすフォルダ内にて、以下コマンドを稼働する。

```bash
git clone https://github.com/naritomo08/terraform_azure_source_public.git
cd terraform_oci_source_public
rm -rf .git
```

## 作成(tfstate保存ストレージ作成)

tfstateフォルダ内へ入り、リソース作成を実施する。

```bash
cd tfstate

terraform init
terraform plan
terraform apply
cd ..
```

作成実施したときに出てくるtfstate_nameの値を控える。

## ストレージパス設定

```bash
az login
export ARM_ACCESS_KEY=$(az storage account keys list --resource-group tfstate --account-name <ストレージアカウント名> --query '[0].value' -o tsv)
→新しくターミナルを立ち上げるたびに設定すること。
```

## 作成（リソースグループ作成）

networkフォルダ内へ入り、リソース作成を実施する。

```bash
cd ResourceGroup

vi backend.tf

<ストレージ名>を保存ストレージ作成で控えた名前をいれる。

terraform init
terraform plan
terraform apply
cd ..
```


## 作成（基本ネットワーク作成）

networkフォルダ内へ入り、リソース作成を実施する。

```bash
cd network

vi backend.tf

<ストレージ名>を保存ストレージ作成で控えた名前をいれる。

terraform init
terraform plan
terraform apply
cd ..
```

## 作成（PublicVM(Windows/Linux)作成）

publicvmフォルダ内へ入り、リソース作成を実施する。

```bash
cd publicvm

vi backend.tf

<ストレージ名>を保存ストレージ作成で控えた名前をいれる。

terraform init
terraform plan
terraform apply
cd ..
```

applyコマンド実施後に出てくるIPを控え、
"vmXX.tf"内の以下のパラメータを使用してRDPログインする。
admin_username
admin_password

## 作成（PrivateVM(Windows/Linux)作成）

publicvmフォルダ内へ入り、リソース作成を実施する。

```bash
cd privatevm

vi backend.tf

<ストレージ名>を保存ストレージ作成で控えた名前をいれる。

terraform init
terraform plan
terraform apply
cd ..
```

applyコマンド実施後に出てくるIPを控え、
"vmXX.tf"内の以下のパラメータを使用してRDPログインする。
admin_username
admin_password

## 削除方法

作成とは逆の手順で削除する。

以下のコマンドで削除可能

一度作成できれば最後のコマンドのみでよい。
```bash
terraform destroy
```

仮想マシンについては仮想ディスクのみ残るため、
リソースグループ消す前にこれらもコンソールから消すこと。

## 一部リソースのみの削除手順

```bash
terraform state list
→リソース確認
terraform apply --target="リソース名"
→再作成対象のリソース指定
terraform destroy --target="リソース名"
→削除対象のリソース指定
```

# おわりに

この記事がterraformを扱う方の助けになればと思います。
[TCA] TCA 1.8で強化されたマクロで画面遷移処理の見通しを大幅に改善する

## TCA 1.7以前で抱えていた画面遷移の悩み

TCAでの画面遷移を実装する際、↓のように遷移先を定義するためのReducerを実装することがあるかと思います。

```swift
@Reducer
struct Path {
    @ObservableState
    enum State: Equatable {
        case login(LoginReducer.State)
        case home(HomeReducer.State)
    }

    enum Action {
        case login(LoginReducer.Action)
        case home(HomeReducer.Action)
    }

    var body: some ReducerOf<Self> {
        Scope(state: \.login, action: \.login) {
            LoginReducer()
        }
        Scope(state: \.home, action: \.home) {
            HomeReducer()
        }
    }
}
```

この`Path`というReducer、1つ画面遷移先を増やすためだけに 
- State
- Action
- Scope

と3箇所にコードを追加する必要があり、
さらに遷移先が多くなってくると「それぞれ順番合わせた方が読みやすいかな」といったように可読性のための作業も増えてしまい、個人的に結構ストレスを抱えていました。

これがTCA 1.8で強化されたマクロによって、大幅にコード量を削減できるようになっていたので共有します。

## Reducerマクロで解決

僕はExampleを読み漁っていて、「なんだこれ！めっちゃいいじゃん！」ってなった（[該当箇所](https://github.com/pointfreeco/swift-composable-architecture/blob/2722a3466b78860ebf493103fc82ac85b076e1bd/Examples/SyncUps/SyncUps/AppFeature.swift#L6C12-L11C4)）のですが、ちゃんと Migration Guide に記載がありました。
https://pointfreeco.github.io/swift-composable-architecture/main/documentation/composablearchitecture/migratingto1.8#Destination-and-path-reducers

元々の `Path` が
```swift
@Reducer
struct Path {
    @ObservableState
    enum State: Equatable {
        case login(LoginReducer.State)
        case home(HomeReducer.State)
    }

    enum Action {
        case login(LoginReducer.Action)
        case home(HomeReducer.Action)
    }

    var body: some ReducerOf<Self> {
        Scope(state: \.login, action: \.login) {
            LoginReducer()
        }
        Scope(state: \.home, action: \.home) {
            HomeReducer()
        }
    }
}
```
こうなります。スッキリ。
```swift
@Reducer(state: .equatable)
enum Path {
    case login(LoginReducer)
    case home(HomeReducer)
}
```

マクロを展開してみると、しっかりと元のReducerと（ほぼ）同じコードが展開されていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238072/e8d07f47-3edb-971d-150a-1d185d4e2e87.png)

小ネタですが、同じ悩みを抱えられている方の助けになれば幸いです！
【監視の落とし穴】失敗アラートだけじゃ危険！バッチ処理の"成功監視"が重要な理由

### バッチ処理の監視に関して、みんながやってる「失敗アラート」。でもちょっと待って！それだけじゃダメな理由をお話しします！

みなさん、こんにちは！今回はバッチ処理の監視という、エンジニアなら誰もが一度は頭を悩ませるであろうトピックについてお話したいと思います。特に「失敗したらアラート」っていう監視手法に焦点を当ててみたいと思います。

#### 監視するなら失敗だけじゃなく、成功も見よう！

まずはじめに、私たちがよくやる「失敗時にアラート」の手法。これ、結構リスキーだって知ってましたか？実は、失敗メトリクスだけ監視してると、大事なことを見落とす可能性があるんです。

例えば、システム自体に何か問題が発生して、エラーメトリクス自体がうまく出力できない場合。失敗してるのに、その失敗が検知されない...という最悪のパターンもありえますよね。その結果、重要な問題がずっと放置されることになりかねません。
私自身、駆け出しの頃に超初歩的なcronの設定ミスでプロセスの起動すらしていないのにしばらく気付かなかったということをやらかしたことがありました...

#### 「処理が成功しているか」をガッツリ監視するメリット

というわけで、私たちが本当にやるべきことは「処理が成功しているかどうか」の監視です。つまり、バッチ処理が予定通りに動作しているか、しっかり出力されているかという「成功メトリクス」に注目するんです。

成功しているかの監視をすることで、もし処理がうまく行っていなかったら、すぐにアクションを取ることができます。これが、バッチ処理を安定させる秘訣なんですね。

#### まとめ：成功監視のススメ

最後に、私からのおすすめポイントをおさらいしておきましょう。バッチ処理の監視で大事なのは、「失敗したらアラートだ！」だけではないんです。そもそも失敗が正しく検知できないこともあるから、私たちは「成功しているか」もきちんと監視しなければなりません。

つまり、バッチ処理の監視においては「失敗した時にアラートする」ことも大事ですが、「正常に動いていることを確認する」ことがもっともっと大事ってわけです。

それでは、監視の盲点を克服して、より安定したバッチ処理の運用にチャレンジしましょう！

***

みなさんが監視を見直すきっかけになれば幸いです！
PG BATTLE 2023 参戦記（ましゅまろ担当）

 2023年10月21日（土）に行われた、**企業・学校対抗のプログラミングバトル** [**PG BATTLE 2023**](https://products.sint.co.jp/pg_battle) に参戦しました。
 この記事では、**Python 3によるましゅまろ問題の解説**や**大会の結果**を共有します。

 同じチームのかつおぶし担当の方も参戦記を執筆しているので、こちらの記事も是非読んでください！
 
 https://qiita.com/biprogy-si/items/d78248ac584161471730

## PG BATTLE とは
[**PG BATTLE**](https://products.sint.co.jp/pg_battle)とは「企業・学校対抗プログラミングコンテスト」です。
3人1チームで参加し、3人それぞれに異なる4問の問題を制限時間内に解きプログラムを提出します。
コンテスト終了後にプログラムが採点され、チームの合計点数と解答時間で順位が決まります。

## ましゅまろ担当 問題と解答例
下記ページに問題一覧とAtCoder社による解答例が公開されています。

https://products.sint.co.jp/q_list_2023

https://products.sint.co.jp/a_list_2023

## ましゅまろ 難易度1 : コイントス
### 考察
各コイン投げの結果は独立しているため、単一のコイン投げにおける裏が出る確率 $\frac{1}{2}$ を $N$ 回掛け合わせたものを出力します。
### コード
```python
N = int(input())
print(pow(0.5, N))
```

## ましゅまろ 難易度2 : 微分
### 考察
微分の知識がなくても、問題文の通りに実装すれば正解できます。
### コード
```python
A, B = map(int, input().split("x^"))
print(f"{A * B}x^{B - 1}")
```

## ましゅまろ 難易度3 : 2 進数と 10 進数
### 考察
Pythonの特定のバージョン以降において桁数が4300を超える数を入力で受け取り`str`から`int`へ変換する場合、工夫をしないで`int(input())`とするとエラーになります。

`sys.set_int_max_str_digits(n)`を追加することで、整数の文字列変換の長さの制限を設定することができます。
### コード
```python
import sys

sys.set_int_max_str_digits(5000)

A = int(input())
B = int(input(), 2)

if A > B:
    print(">")
elif A < B:
    print("<")
else:
    print("=")
```

### 補足
解答例は、`decimal`モジュールを使用して大きな桁数の数の変換で起きるエラーを回避しています。
ただし、`decimal.Decimal`クラスでは、`int(x, base)`のように基数を指定して数値を変換するメソッドは提供されていません。
そのため、2進数と10進数の変換を自力で実装する必要があります。

## ましゅまろ 難易度5 : ダンス
自力では解けず、解答例を見ました。

### 解答例
https://products.sint.co.jp/a_list_2023#04

### 解答例のコード説明
解答例では、前半で二項係数を事前に計算し、後半で区間DPを使用して問題を解いています。

#### 前半：二項係数の計算
後半の処理で多数の二項係数の計算が必要であるため、事前に計算します。
必要な二項係数は[パスカルの三角形](https://ja.wikipedia.org/wiki/パスカルの三角形)を使用して$O(N^2)$で計算できます。
計算速度に影響が出ないように値は`mod = 998244353`で割った余りを格納します。
(合同式の性質により最終的な結果は正しく計算することが保証されます)

```python
binominal = [[0] * (N + 1) for _ in range(N + 1)]
binominal[0][0] = 1
for i in range(1, N + 1):
    binominal[i][0] = 1
    for j in range(1, i + 1):
        binominal[i][j] = (binominal[i - 1][j - 1] + binominal[i - 1][j]) % mod
```

#### 後半：区間DP
区間DPを使用して最終的な結果を求めることができます。
DPテーブルを以下のように定義します。
* `dp[l][r]` := 位置`l`から位置`r-1`までの範囲にいる人々を列から取り除くための方法の総数を`mod`で割った余り

初期条件として、`l = r`のとき`dp[l][r] = 1`とします。
`l`と`r`の差が小さいほうから順にDPを計算していき、`dp[0][N]`を出力することで正解できます。
```python
dp = [[0] * (N + 1) for _ in range(N + 1)]
for i in range(N + 1):
    dp[i][i] = 1

for w in range(2, N + 1, 2):
    for r in range(w, N + 1):
        l = r - w
        for m in range(l + 1, r, 2):
            if S[l] != S[m]:
                dp[l][r] = (dp[l][r] + dp[l + 1][m] * dp[m + 1][r] * binominal[(r - l) // 2][(r - (m + 1)) // 2]) % mod

print(dp[0][N])
```

## 結果・感想
企業の部 **23位/187チーム中** でした！

https://products.sint.co.jp/hubfs/images/topsic/pgbattle2023/result/company.pdf

個人としては、全問正解を目指していたのですが、2問しか正解することができませんでした。。。
次回は、全問正解できるよう精進します！

## We Are Hiring!

https://www.biprogy.com/recruit/recruiting/

## 参考

https://zenn.dev/ykesamaru/articles/2175b317a5410e
ブックデザインについて学んだこと２

原稿を渡され、本を作って欲しい。
そんな依頼が来ましたが、ほとんど知識がありません。
でも、本を１冊作ることになりました。
私が本を作るために学んだことを書いていきます。

今回は、一つの原稿が書籍となり、知らない誰かが手にして読むという過程から考えたいと思います。
作者が書いた原稿を書籍という形で、興味のある人の手に渡り、伝えたい内容がより正確に伝えられるために、ブックデザインはあります。
そのため、本の装丁、そして本文、本を書いた人の情報などを記載する奥付のデザインをレイアウトするとき、書籍によっての違いやなにか大切なことがあるのではないか？今回はそんな疑問を持ちました。

## カバーデザインや本文のレイアウトで何が大切か？

### １　カバーデザインについて
カバーデザインは本の顔なので、非常に重要なポイントとなる！

#### コンセプトの設定

- テーマ
- ターゲット層
- 本の内容を踏まえる

コンセプトに基づき、色使い、イメージ、書体を決定する必要があります。コンセプトの設定といっても考えなければいけないことが多そうなので、ここも次回、深掘りしていきましょう。
    
#### 象徴的なイメージ 

本の内容を的確に表すイメージを用いるのも有効。
例えば小説なら登場人物、旅行書なら風景写真など、ジャンルを象徴するモチーフを取り入れる。

なるほど、確かにキャラクターのイラストが表紙に描かれていたら何の本かわかりやすいです。


#### タイポグラフィーの工夫 
タイトルの書体の選択とレイアウトはカバーの印象に大きく影響します。デザインに合わせてユニークな書体を選んだり、タイトルの配置を工夫したりする。
表紙の文字はやはり、内容や本のジャンルに影響します。
ホラー小説なのに、丸文字の書体とかだと怖くなさそうですが、目を惹くかもしれません。書体の工夫は大切ですね。

#### 原稿の活用
原稿からのヒントは重要ですね。引用文やイラスト、著者の肖像写真などを上手に取り入れると個性的になります。

### 2　本文のレイアウトについて
本文のレイアウトのポイントは読みやすさ・構成と流れ
空間・リズムも大切
行間が狭い、文字サイズが小さい、次のページへ読み進めるときの流れとかも影響します。

#### 読みやすさの確保

- 適切な行送り、行間、字間を設定し、読みづらさを避ける
- 見出しや写真・イラストとの位置関係に配慮する
- ページの切れ目で文章が分断されないよう注意する

#### 構成と流れ
 
-  章立てやセクション分けを明確にし、全体の流れをつくる
- 見開きページ間での情報の分け方を工夫する
- 目次やノンブルなどでナビゲーション性を高める

#### バランスとリズム感

- テキストボックスや画像の配置にメリハリをつける
- 見開きページ同士の左右のバランスを意識する
- グリッドを活用し、整然とした構成を目指す

#### 装飾性とデザイン性

- 写真・イラストのレイアウト、トリミングなどを工夫
- 余白の取り方で開放感や引き締め感を演出
- 飾り線やアクセントなどの装飾要素を効果的に使用

#### 用途・ジャンル特性の尊重

- 読物か資料かなど、その本の用途に適したレイアウト
- 小説、絵本、ビジネス書など、ジャンルの特性を踏まえる
確かに、用途やジャンルを間違えてしまうと、手に取った人がページを閉じてしまうかもしれません。

## 次回！

実際の依頼内容をもとにデザインについて具体的に考えていきます

- ジャンルの特性から言えること
- ブックデザインのコンセプトでは何を検討すればいいのか
- コンセプトをもとにまとめること
朝会にファイブフィンガーを導入したらみんなの調子がわかりやすくなりました

## これは何

自分の所属しているグループではスクラムを導入しているのですが、ある時メンバー間で業務を調整するためのコミュニケーションをもっと取っていきたいよねという話になりました。

具体的には、「重いレビューと重いタスクが重なってしまって余裕がない」、「ミーティングが多くて時間が足りない」、「体調不良で思うように働けない」などなどの個別の事情をもっと共有しあってチームで調整したいよねという内容です。

元々グループで毎日朝会を実施していて、そこに「困ったこと」を書くセクションを設けてはいました。

しかし、ちょっとした困りごとは「頑張ればなんとかなるし..」「わざわざ共有するほどでもないかな」といった感じで共有されづらい状況でした。

そんな時に以前『カイゼン・ジャーニー』で読んだ「ファイブフィンガー」を思い出し、チームに導入してみたら、些細な困り事が共有されるようになりました。

https://kaizenjourney.jp/

## ファイブフィンガーとは

ファイブフィンガーとは、文字通り5本の指で自分の考えを表明する方法です。
指が1本なら全然ダメで、5本なら絶好調という感じで、指の数によって状態を表します。

『カイゼン・ジャーニー』では、スプリントや仕事の今の状態を表明するための方法として、以下の指標が紹介されていました。

> 5本:とってもうまくやれている
4本:うまくやれている感触あり
3本:可もなく不可もなく
2本:不安は少しある
1本:全然ダメで絶望的

## どう導入したか

導入する上でいくつか工夫した点があるので紹介します。

『カイゼン・ジャーニー』で紹介されていた指標をそのまま導入すると、みんな「可もなく不可もなく」を選んで結局あまり変わらなそうな気がしていました。

今回の導入の目的は「少しでも不安や困っていることがあれば共有できるようにする」ことなので、好調<->普通<->不調 の「普通<->不調」の部分に厚みを持たせてみることにしました。

なんやかんやして作成した指標がこちらです。

- 5 順調 良い感じ
- 4 普通 特に問題ない
- 3 程々 不安はあるけど進められそう
- 2 微妙 不安や困りごとがある
- 1 不調 全然ダメ

**「不安はあるけど進められそう」** という指標を作ることで、「ちょっと困ってるけど頑張ればなんとかできるから大丈夫」という微妙な部分を拾えるようにしています。

また、記入してもらうときにわざわざ記事を編集するのが面倒で風化するなどがないよう、チェックボックス形式で簡単に入力できるようにしました。

![朝会記事のスクリーンショット。今日の調子と書かれた下に5、4、3、2、1のチェックボックスが並んでおり、3にチェックが入っている。数字の横にはその数字の説明が書かれている。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/58d86194-58f6-1eb8-68d2-bd1af63c6cb8.png)

あとは朝会を進行するメンバーが、3以下を選んでいるメンバーに不安や困りごとの内容を聞くことで、今誰が何で困っているのかがわかるという流れです。

## 導入してみてどうだったか

導入前はみんな「特に問題ない」しか選ばないかもと思っていましたが、実際始めてみると1~3を選択されて、チームで誰が今業務に追われているかや体調が本調子でないかなどが共有されるようになりました。
chromebookのlinux上のxamppでpythonを動かす方法

### １．はじめに
chromebook上にxamppをインストールして遊んでいたが、pythonを動かしたくなった。

### ２．方法
```terminal:/opt/lampp/etc/httpd.conf
AddHandler cgi-script .py
<Directory /usr/local/apache2/htdocs/python>
  Options +ExecCGI
</Directory>
```
を一番下に追記する。

```python:/opt/lampp/htdocs/python/test.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
print("Content-Type: text/html\n")
print("<h1>Hello World</h1>")
```
を配置する。

```terminal:
sudo chmod 755 /opt/lampp/htdocs/python/test.py
```
を実行する。

xamppをrestartする。

http://localhost/python/test.py にアクセスすると確認できる。
どうかな。

### ３．参考文献
> 「Python」CGI プログラムとして動かしてみる
> https://a4dosanddos.hatenablog.com/entry/2013/08/08/011355

> XAMPP - ArchWiki
> https://wiki.archlinux.jp/index.php/XAMPP
オリジナルのカーソルの作り方


# オリジナルのカーソルの作り方

今回は RealWorld Cursor Editor を使ってオリジナルのカーソルを作成する方法を紹介します．

http://www.rw-designer.com/cursor-maker

## RealWorld Cursor Editor のダウンロード

上記の公式サイト，または窓の社からダウンロードしてください．

https://forest.watch.impress.co.jp/library/software/realworldce/

# カーソルの作成

1. RealWorld Cursor Editor を起動し，左の作成タブをクリック
1. 作成する方法を選択し，作成をクリック

:::note info
すでにあるカーソルを編集する場合は，左の開くタブをクリックし，編集したいカーソルを選択してください．
:::

:::note warn
キャンパスサイズや色の設定を変更することができますが，基本はデフォルトのままで問題ありません．
:::

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670528/4f57e4df-b763-ad6c-b728-25d429f48baa.png">

# 使い方

よく使う機能のみ，列挙して説明します．

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670528/0a1fec36-f67b-4aca-a134-e9996e632395.png">

① カーソル編集画面全体に対しての操作 - ファイル - 上書き保存 - 名前をつけて保存 - イメージ - 回転 - 反転 - 鏡面

② フレームのプロパティ - ホットスポット : カーソルのクリック位置 - フレームの表示時間 : カーソルのアニメーション時間

③ テスト領域 - 作成したカーソルの動作確認

④ フレームの編集 - フレームの追加 - フレームの削除 - フレームのコピー - フレームの貼り付け - フレームの移動

:::note warn
ctrl + c, ctrl + v でコピー＆ペーストができますが，複数レイヤーの場合は一つに結合されてしまうので，ここの機能を使うことをおすすめします．
:::

⑤ カーソルを描画 - 切り取り・移動 - 消しゴム - テキスト - ペン - ライン - 塗りつぶし - レタッチ・ブラシ - スポイト : 色を取得 - カーソルのクリック位置を設定

:::note info
少しだけショートカットキーが割り当てられている．
キー | 機能 |
--- | --- |
x | 切り取り・移動 |
e | 消しゴム |
t | テキスト |
b | ペン |
f | 塗りつぶし |
r | レタッチ・ブラシ |
h | カーソルのクリック位置を設定 |
:::

⑥ 編集・レイヤー - 色の選択 - レイヤーの追加

# カーソルの保存

カーソルの保存場所は，`C:\Windows\Cursors` がデフォルトですが，ファイルの書きこみには管理者権限が必要であるため，表示されるポップアップを**2 回**許可してください．

:::note warn
2 回目の忠告はパソコン側からなので，ポップアップが裏側で開いている可能性があります．見当たらない場合は開いている画面を確認してみてください．
:::

# 最後に

アニメーションのカーソルを作るのは手間がかかりますが，自分だけのカーソルを作ることができるので，ぜひ挑戦してみてください！

また，[カーソルの情報](https://qiita.com/magix/items/e985f7d0a79105bc2085 "カーソルの種類")，[カーソルの変更方法](https://qiita.com/magix/items/4c010fd44b129676e840 "カーソルの変更方法")についての記事もあるので，参考にしてください．
JAWS-UG初心者支部LT会に1人で突撃した件

こんにちは、駆け出し12冠エンジニアのアスカです。昨日、JAWS初心者支部のLT会に初めて１人で対面参加してきました。その感想を共有します。
https://jawsug-bgnr.connpass.com/
# 伝えたい事
１人でも勇気を持って行くと良い。(当然仲間がいれば心強い)
AWSと出会った時を思い出してきっと熱くなれます。

# 今までのJAWS-UG歴
▪︎JAWS-UG初心者支部#56 Systems Manager 入門ハンズオン(オンライン参加)
のみ

# LT会の内容
山下光洋さんのキャリアに関するセッションが最初にあり、続けて4人のライトニンクトークが入りました。
詳細は以下のリンクを参照してください。
https://jawsug-bgnr.connpass.com/event/310308/



# 感想
特に山下さんとjornymanさんの話が心に響きました。
▪︎"思っている事、 やろうとしている事は、 口に出してまわりに 言った方がいいですよ。"
(山下さん)
▪︎"AWSの新サービスが発表されたら、 全員そのサービスの初心者。 知らないことを知らないと言えて、 やってみたことをアウトプットできる。 これからもコミュニティで 思いっきり初心者します！"
(山下さん)

▪︎"技術に少しでも興味があれば、経験は関係なく学び始めれば良い。エキスパートなキャリアがあって「今更初心者に戻れない症候群」の影響で幅が狭まるのは勿体無い。自分の興味関心に素直に従ってチャレンジしよう。"
(jornymanさん)

2人の積み重ねてきたキャリアと行動原理みたいなものが講演から伺え、何より初心者であり続ける事とアウトプットし続ける事を楽しんでいる姿がとても輝いて見えました。

# (★飲み会★)
AWS歴3年以下の同志が多く、沢山飲んで語り合う事が出来ました。
社外にも技術を楽しんで磨いている同志が沢山いる事を知り胸が熱くなってしまいました。

# 総じて
▪︎講演者や初心者の同志から多くの刺激をもらい熱くなれます。
▪︎１人でも心配ありません。１人の人も沢山来ていて飲み会後には１人ではなくなっています。
▪︎AWSと出会った頃の新鮮な気持ちに戻れます。
▪︎初めての方は是非一度参加してみましょう。

# 次のアクション(熱くなっただけで終わらないために)
山下さんおすすめの自前ブログ制作やっていきます！
(せっかくならヘッドレスCMSで作りたい)
oracle テーブル構造を取得

SELECT
    table_name as テーブル名,
    column_name カラム名,
    (case 
        WHEN data_type = 'VARCHAR2' THEN data_type || '(' || nvl(data_precision,data_length) ||')'
        WHEN   data_type = 'NUMBER' THEN
        data_type || '(' || nvl(data_precision,data_length) || ',' || nvl(data_scale,'0') ||')'
        ELSE data_type
        END
    ) as データテープ
    ,nullable 非必須
FROM
    user_tab_columns
WHERE
     table_name = IN_VCHR_TABLE_NAME
Order by column_id
dependabot の pull request が作成されない事象の対応(PHP)

## 記事対象者
dependabot の 諸々の設定は完了しているが、 Pull request が作成されない状況になっている方


## 原因
メニュー「Actions」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867400/c1ad6e75-0667-8c28-a3db-e731385ddfcd.png)
より、workflowsの状況を確認すると、失敗していることが分かる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867400/c88f4e06-5ad1-7ba5-e77f-7e45f3c8735e.png)

エラーを確認すると、php7.4.33と判定されている模様。(実際はphp8.1を利用していた)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867400/ee5593b8-ac8b-9993-e0f4-a6a33128cbef.png)


## 解決方法

composer.json に phpのバージョン情報が記載されていない可能性がある。

composer.json に以下のようにphpのバージョン指定を行う。

```
    "require": {
        "php": "^8.1",
        .
        .
```

参考: https://github.com/dependabot/dependabot-core/issues/5301#issuecomment-1851597423