OmniAICreator/Qiita-1.07M huggingface dataset:
Carthageビルドでビルド設定を変更したい時

Carthageを今更使っているプロジェクトは少なくなっているかもしれませんが、それでも使うにはそれぞれの理由があるかと思います。

私のプロジェクトでもCarthageビルドが前提の環境となっており、まだSPMへの移行はできていません。

そんなとき、下記のエラーがCarthageビルドで発生しました。

> ld: file not found: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a
clang: error: linker command failed with exit code 1 (use -v to see invocation)
> The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 11.0 to 16.4.99.
> ** ARCHIVE FAILED **


## Carthageビルド時にフレームワークのビルド設定を任意の値に変更する

こちらのコメントを参考に対応できました。
https://github.com/Carthage/Carthage/issues/3333#issuecomment-1605757401

下記のスクリプトを介してCarthageコマンドを実行することで、フレームワークの最低OSバージョンを11に変更しています。
またビットコード対応の設定をオフにしています。

```bash
#!/usr/bin/env bash 

# carthage.sh
# Usage example: ./carthage.sh build --platform iOS

set -euo pipefail

xcconfig=$(mktemp /tmp/static.xcconfig.XXXXXX)
trap 'rm -f "$xcconfig"' INT TERM HUP EXIT

## optional
echo 'IPHONEOS_DEPLOYMENT_TARGET = 11.0' >> $xcconfig
echo "ENABLE_BITCODE=NO" >> $xcconfig

export XCODE_XCCONFIG_FILE="$xcconfig"
carthage "$@"
```

ワークアラウンドを用いて時間を稼いでる間になんとかSPM移行を進めたいと思います。
Deno KVの管理画面【phpMyAdmin】

2行追加するだけで、Deno KVの管理画面CRUDができます。

```typescript
import denoKvAdmin from "https://deno.land/x/deno_kv_admin@0.0.4/mod.ts";

Deno.serve(async (req: Request) => {
    if (new URL(req.url).pathname.startsWith("/kv")) return denoKvAdmin(req)
    return new Response("Hello World")
});
```

Demo https://kv-api.deno.dev/kv

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/aac4c4ed-0f46-0283-7ef1-8af05e4b2a28.png)

引用

https://deno.land/x/deno_kv_admin

https://github.com/lab8-tomofi/denoKvAdmin
Udemyの動画をスクリーンショットするとUdemyの動画の部分だけ黒くなってしまって悩んだ話

## はじめに
はじめまして。初記事になります。
JavaScript,Reactなどを中心にUdemyでプログラムを勉強しております。

勉強しながらメモする中で動画の静止画のキャプチャなどをよく撮っていたのですが、つい数日前から撮れなくなりました。(撮れなくなったというか、スクリーンショットするとUdemyの動画の部分だけ黒くなる)

勉強のメモとしてキャプチャが使えなくなったのは困ったので調べてみた記録になります。


## 解決方法の模索

日本語で調べてもよくわからなかったので、拙い英語というか、ほぼほぼ自動翻訳で英語の情報を調べたところ、いろいろ同じ現象で困っている人がいました。

それらを読むとどうもUdemyのコンテンツにDRM保護がかけられたのが原因っぽい？です。

確証はありませんが、私の環境で、購入前にプレビューできるレクチャーはスクリーンショットがとれて、そうでないレクチャーは真っ黒になってしまうので権利保護関係である可能性は高いです。

海外のコンテンツでは別に著作権侵害とかではなくノートととしてキャプチャしたいのにこんなことするなー｜｜って怒ってらっしゃる方もおられました。

まあ、私も同じ思いはありますが。。

私個人の謎としてはこれらの議論は海外では数年前からされいるのに、私がこの現象に陥ったのは、つい数日前。それまでは普通にキャプチャできていた、という点です。

日本向けの環境でつい数日前に対応したものなのか、それともDRM保護とは関係なく私個人の環境なのか、そこら辺がもやもやしております。（私も同じ！という方がいらしたらぜひコメントください）

とはいえ、海外で同じ悩みを持っていた人の情報により、とあるChromeのキャプチャーの拡張機能を入れることにより、とりあえず、ノート用のキャプチャはできるようになりました。（今までよりは一手間かかり不便だけど。。。どんな拡張機能かはとりあえず省略。興味あったらコメントください。）

とりあえず解決はしたけど、勉強用にノート取りたいだけだから気軽にキャプチャさせて欲しいなという思いと、とはいえ著作権的に保護は必要だろうなという思いと、私の環境だけの勘違いが交錯しております。
Flutter×MySQLでデータ管理



## データベース使ってみた
- これまでローカルファイルでやってたけど、だんだん面倒になってきたからデータベース使うことにした。
- 何がいいかわかんないけど、MySQL にした（初めて触った笑）。

## まだ解決してない問題
下記のコードでやったんだけど、非同期処理がうまくいってない。
※多分 riverpod で管理するなら、loading で処理できると思ってる。
```
var conn = await MySqlConnection.connect( settings );
```

## 出力結果
```bash
flutter: connected!!
flutter: 2.1. added
flutter: +------+--------+-------+------------------------------+
flutter: |  id  |  user  |  age  |           email              |
flutter: |2     |Taro    |25     |X.cm                          |
flutter: |0     |banana  |25     |Ta1r@.com                     |
flutter: |1     |yamada  |26     |Ta2r@.com                     |
flutter: |2     |hanako  |28     |Ta3f@.com                     |
flutter: |3     |aaa     |20     |Ta4r@.com                     |
```

## ソース
例によって、コメント書きまくってるから説明なしで。
```dart

import 'package:flutter/material.dart';
import 'package:mysql1/mysql1.dart';

// database table
// user
// +-------------------------+
// | id | name | age | email |

void main() async {

  var res;

// 0. MySQL の設定
  var settings = ConnectionSettings(
      host      : "localhost",
      port      : 3306,
      user      : "root",
      password  : "XXXXX",
      db        : "fluttertest",
  );


// 1. MySQL データベースに接続する
  var conn = await MySqlConnection.connect( settings );
  debugPrint( "connected!!" );


// 2. データの追加

// 2.1. 1つ追加
  res = await conn.query( // id を受け取ることもある
    'insert into user(id, name, age, email) values(?, ?, ?, ?);', // 命令文
    [ 2, "Taro", "25", "X.cm" ]                           // ? の引数
  );
  debugPrint( "2.1. added" );

// 2.2. 一括追加
  // リスト形式で一括追加する
  res = await conn.queryMulti( 
    "insert into user (id, name, age, email) values (?, ?, ?, ?);",
    [ 
      [ 0, "banana", 25, "Ta1r@.com" ],
      [ 1, "yamada", 26, "Ta2r@.com" ],
      [ 2, "hanako", 28, "Ta3f@.com" ],
      [ 3, "aaa"   , 20, "Ta4r@.com" ],
    ]
  );


// 3. データベースから取得
  res = await conn.query( "SELECT * FROM user" );
  debugPrint( "+------+--------+-------+------------------------------+" );
  debugPrint( "|  id  |  user  |  age  |           email              |" );
  for ( var r in res ) {
    String id    = r[0].toString().padRight(6);
    String user  = r[1].toString().padRight(8);
    String age   = r[2].toString().padRight(7);
    String email = r[3].toString().padRight(30);
    debugPrint( "|$id|$user|$age|$email|" );
  }

// 4. 接続終了
  await conn.close();

}

```
「FlutterでOpenAIを活用したAIお絵描き日記サービスを作ってみました」

こんにちは。

最近、AIが注目を集めているため、サイドプロジェクトとしてチームメンバーと一緒にFlutterを使ってAIお絵描き日記アプリを作成してみました。
FlutterでCubitとClean Architectureを使用しました。
ユーザーは日常の出来事や感情をテキストや絵で記録することができ、AIはそれを元に対応するイラストやアートを生成します

サービス映像

https://youtube.com/shorts/yC6wbgSY1XA?feature=shared


現在、Google PlayストアとApp Storeにリリースされています。

[今日の一日を描いて] アプリ OneLink (モバイルでアクセス)：

https://draw-my-today.netlify.app/en

[今日の一日を描いて] サービス紹介 Notionページ：

https://draw-my-today.notion.site/Draw-My-Today-b48a53959f3542d8a24a102aa5573590

もしもこのアプリに対する良い意見やアイデアがございましたら、アプリ内のお問い合わせフォームまたはコメントでお知らせいただければ幸いです。大切に聞かせていただきます。ありがとうございます。
【Xcode】1行全体を1回のbackspaceボタンで消すショートカット

# はじめに
ショートカットマスターに俺はなる！

# こんな感じ
![画面収録-2023-08-28-22.37.40.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/07a2ad1a-901d-0f16-1ba2-a3d8bb9e4547.gif)

# やりかた
`command` + `shift` + `backspace`

# おわり
ショートカットを使いこなして高速開発
【プラクティス紹介】1分でさらっと分かる「ユーザーストーリー」

## プラクティス名（別名）
ユーザーストーリー　（ストーリーカード、３つのC、Role-Feature-Reason）

## プラクティスの目的・狙い
* ユーザ要求とその価値を明確化する
* 要求事項を一件一葉に切り分ける
* ユーザとDEVの会話を促す

## どんな時に使うか
* ユーザ要求を言語化する時
（もともとは物理的なカードに記載して整理していたが、近年はPBLの記入フォーマットとして用いられるケースが多い）

## 実施手順
ユーザのニーズを以下の記述形式で数行のシンプルな文章で表現する。

**〈誰〉として〈何〉がしたい。なぜなら〈理由〉だからだ。**

なおWho/What/Whyの3要素が含まれていれば、必ずしも上記の形式に沿わなくても構わない。書き手が誰であっても内容は常にユーザ視点で書かれていなければならない。またシステム知識がない人にも意味が通じるように書く。もちろん端的な文章だけで詳細な要件を伝えきることはできないため、ストーリーをきっかけにユーザとDEVが後日会話することが暗黙の前提となる。

ユーザーストーリーの重要な要素を「３つのＣ」という言葉で表現することがある。
|英単語|和訳|特性|
|:---:|:---:|:----|
|Card|カード|要求をカードに（書けるぐらいに）端的に表現する|
|Conversation|会話|会話を通じて、ユーザからDEVに伝えられる|
|Confirmation|確認|DEVは何をもって完了となるのか確認する|

## アレンジ例
* 受け入れ条件を明確化するための記述（AC：Acceptance Criteria）を追記する
* ユーザーストーリーとしては粗すぎる要求事項（エピック）も一旦カード化しておき、後日詳細化する
* 記述形式を5Wに拡張する（When/Where/Who/What/Why）

## アンチパターン
* システム目線の機能一覧になってしまっている（ユーザにとっての価値が読み取れない）
* どうやって実現するか、という手段（How）を書いてしまっている
* 要求内容が抽象的すぎて何をもって完了となるのか判断がつかない

## 参考情報
ユーザーストーリーとユースケースの違い
https://agnozingdays.hatenablog.com/entry/2015/07/22/011732

ユーザストーリーとユーザシナリオの違い
https://archeco.co.jp/ux-design/user-scenario/


## こぼれ話（私的コメント）
まったくの新規アプリならまだ分かりやすいのですが、システム再構築とかで、既存の要件定義書や機能一覧を元にシステム屋がPBLを書き起こしてたりすると、たいてい中身はユーザーストーリーになっていない。それならばと、ユーザさん（PO）に直接書いてもらおうと記入をお願いすると、今度はシステム屋さんに伝わるようにとシステム目線で書こうとしてしまって、やっぱりユーザーストーリーにならない。これまでの習慣を変えるのって難しいですね。

　[アジャイルプラクティス一覧へ戻る](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)
HTMLやvueにて、モーダルで開いた画面をJavaScriptから閉じる方法

最近はchatGPTにきけば大体教えてくれる。
円安の影響で月3000円ほどになってしまったけれど
優秀な秘書を雇っていると思えばめちゃ安いのでは。

しかし、久々にchatGPTに聞いても解決できないことにぶちあたったので備忘録。

やりたいのは
モーダルによって開いた画面を
JavaScriptによってcloseする処理。


## 結論
見えない「モーダルを閉じる」ボタンを作成し
それをJavaScriptから「クリック」してやればいい。

```HTML:HTML
<button
    id="closeModalButton"
    type="button"
    class="btn-close"
    data-bs-dismiss="modal"
    aria-label="Close"
>
```

```JavaScript:JavaScript
// モーダルを閉じる
const closeModalButton = document.getElementById('closeModalButton')
closeModalButton.click()
```

## codepen使ってみました。(初めて!)
まだまだ見苦しいですが
動くものがあるって信憑性高くない！？

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="xxmZYRY" data-user="kartis0207" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kartis0207/pen/xxmZYRY">
  JavaScript Bootstrap close modal without click</a> by kartis (<a href="https://codepen.io/kartis0207">@kartis0207</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
【Laravel】CSRF対策 「@csrf」や「 {{ csrf_field() }} 」が意味するもの

LaravelではCSRF攻撃からアプリケーションを保護する仕組みが備わっている。
フォーム送信の際にソースコードでよく見かける「**{{ csrf_field() }}**」や「**<span>@</span>csrf**」もその仕組みのもの。
これらは一体何を意味していて、何のために記述する必要があるのかを正しく理解しておきたい。

## CSRF攻撃とは
Webアプリケーションの脆弱性を悪用したサイバー攻撃の一種で、**悪意のある攻撃者が用意した罠サイトへとユーザを誘導して、本来ユーザの意図していないリクエストを攻撃対象のWebサイトへ送信させる攻撃**のこと。

CSRF攻撃の身近な例だと、身に覚えのないSNS上の情報発信・ネットバンキングの不正送金等が挙げられます。

CSRFは「**シーサーフ**」と呼ばれることが多いですが、正しくは「**クロスサイトリクエストフォージェリ**（Cross-Site Request Forgery）」と呼びます。
クロスサイトは「**サイトを横断する**」・フォージェリは「**偽装**」という意味なので、どんな攻撃なのかのイメージも湧きやすいと思います。


## トークン生成によりCSRF対策
Laravelでは、CSRF対策としてトークン生成が採用されている。

トークン生成によって、どのようにCSRF対策されているかというと、
1. ユーザがWebアプリケーションにアクセスした際にトークンが自動的に生成され、ユーザ毎のセッションに保存される。
2. ユーザがリクエストを送信する際は、生成されたトークンも含めて送信する。
3. サーバー側の処理でリクエスト送信されたトークンと予めセッションに保存されていたトークンの値を比較して両者が一致するかどうかを検証する。
4. トークンの値が一致すればリクエスト処理を開始。一致しなければエラーを返す。

簡単ではあるが、このような流れのトークン検証を通してCSRF対策を実現している。

2番のリクエストで送信するトークンはサーバ側でトークン検証を行うために、「**_token**」というname属性を持つ非表示の**inputタグ**をformタグの中に含めて送信する必要がある。

このときに必要なセッションのトークンは、コントローラ内でリクエストのセッションにアクセスすることで取得できる。

```php
// コントローラでの処理
public function(Request $requet) {
    $token = $request->session()->token();
    ...
}
```

```html
<!-- ビューのformタグ -->
<form method="POST" action="/profile">
    <input type="hidden" name="_token" value="{{ $token }}" />

    <!-- 以下も同様 -->    
    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
```
上記の例では、コントローラにて、Requestインスタンスを用いてセッションのトークンを取得したが、「**csrf_token()へルパ関数**」を用いると簡単にセッションのトークンを取得できる。

しかし、更にもっと言えば、「**<span>@</span>csrfディレクティブ**」を用いると、非表示のトークン付きinputタグを丸ごと生成してくれる。
実際に開発者ツールとかを用いてソースを確認すると<span>@</span>csrfの部分がinputタグに置き換わっていることを確認できる。
（ちなみにLaravel5.5までは、「csrf_field()へルパ関数」を用いると同じことができていたが、Laravel5.6から登場した<span>@</span>csrfディレクティブが現在は主流になっているみたい。）

```html
<form method="POST" action="/profile">
    @csrf
    <!-- 以下と同様 -->
    <input type="hidden" name="_token" value="{{ csrf_token() }}" /> 
</form>

```



ちなみに、このCSRF対策のためのトークン検証は「**App\Http\Middleware\VerificationCsrfToken**」ミドルウェアで行われており、Laravelのデフォルト設定で有効になっている。そのため、特定のサイトアクセスや用途に応じてトークン検証の有効・無効を切り替えることもできる。

## トークン送信は特定のHTTPメソッドのみで必要
CSRF対策のためのトークン検証は**POST, PUT, PATCH, DELETEメソッド**で有効になっており、リクエスト送信する際はトークンを含める必要がある。
これらのHTTPメソッドは、データベース内容の変更・削除などの悪意あるサイバー攻撃に繋がりやすいためである。

一方で、**GETメソッド**ではトークン検証は実施されないようになっている。
GETメソッドはリクエスト送信しても情報を引き出すだけなので、CSRF攻撃の観点においては悪意のある攻撃に繋がりにくいためだと思われる。

## おわりに
formタグの中に記述する「<span>@</span>csrf」は、リクエスト送信を成功させるための特別な記号でもおまじないでもなく、CSRF対策の１つであるトークン検証を行うための重要なものであるということを忘れないようにしておきたい。

---
参考サイト
　- [CSRF（クロスサイトリクエストフォージェリ）とは？被害と対策も](https://www.shadan-kun.com/blog/measure/2640/)
　- [Laravel 8.x CSRF保護](https://readouble.com/laravel/8.x/ja/csrf.html)
VBAでmap関数を作りたい

`Application.Runメソッド`の引数に、プロシージャ（Sub, Functionなど）の名前を渡すと、間接的にプロシージャを呼び出せる。
これを使えば、VBA版のmap関数が作れるのではと思い、作ってみた。

> - **Application.Run メソッド (Excel) \| Microsoft Learn**
>   - [https://learn.microsoft.com/ja-jp/office/vba/api/excel.application.run](<https://learn.microsoft.com/ja-jp/office/vba/api/excel.application.run>)

``` vb
Option Explicit

'メイン関数
Public Sub main()
    Dim i As Long
    Dim arr(9) As Variant '要素数が10個（0～9）の配列
    
    '配列を初期化する
    For i = LBound(arr) To UBound(arr)
        arr(i) = i '0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    Next
    
    'map関数を呼び出す（※プロシージャの名前"square"と、配列arrを渡す）
    Call map("square", arr)
    
    '結果を表示する
    For i = LBound(arr) To UBound(arr)
        Debug.Print arr(i) '0, 1, 4, 9, 16, 25, 36, 49, 64, 81
    Next
End Sub

'map関数
Public Function map(ProcName As Variant, ByRef arr() As Variant)
    Dim i As Long
    
    For i = LBound(arr) To UBound(arr)
        arr(i) = Application.Run(ProcName, i)
    Next
End Function

'二乗を返す関数
Public Function square(Num As Variant) As Variant
    square = Num ^ 2
End Function
```

コードの良し悪しは別として、想定通りに動くものが出来た。

## 注意

- マクロ名は、「アクティブ シートの状態に応じて評価され」るため、注意が必要。
    - 「アクティブ シートの状態に応じて評価され」るとは？<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115724/0edab3cd-4170-c06a-718f-23b748598a88.png)
- 引数の個数は、1～30個

## 参考

- [呼び出すプロシージャを文字列で指定する方法\[エクセルVBA\] : バヤシタ](<https://bayashita.com/p/entry/show/282>)
  - [https://bayashita.com/p/entry/show/282](<https://bayashita.com/p/entry/show/282>)
- [VBAでコールバック関数を使ういろんな方法](<https://qiita.com/Kamo123/items/e676e0cbe6de83410980>)
NixOS で /boot/efi がいっぱいになったとき

いっぱいになると `nixos-rebuild switch` すらできない。

```
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       197M   197M    0 100% /boot/efi

$ sudo nixos-rebuild switch  
building Nix...
building the system configuration...
updating systemd-boot from 250.4 to 250.9
Failed to copy data from "/nix/store/a55d0mc43m0ibl328yxd5dggrr7r4f1h-systemd-250.9/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/efi/EFI/systemd/.#systemd-bootx64.efic86e6ccb08db22c7": No space left on device
Failed to copy data from "/nix/store/a55d0mc43m0ibl328yxd5dggrr7r4f1h-systemd-250.9/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/efi/EFI/BOOT/.#BOOTX64.EFIf823f30d08cc220e": No space left on device
Traceback (most recent call last):
  File "/nix/store/c30xfwqyfbhwq9kxirdis4aqq8vcs2yi-systemd-boot", line 317, in <module>
    main()
  File "/nix/store/c30xfwqyfbhwq9kxirdis4aqq8vcs2yi-systemd-boot", line 266, in main
    subprocess.check_call(["/nix/store/a55d0mc43m0ibl328yxd5dggrr7r4f1h-systemd-250.9/bin/bootctl", "--path=/boot/efi", "update"])
  File "/nix/store/3yn3fb99d9d5br9ghrviwzcvkdxpkmvx-python3-3.9.16/lib/python3.9/subprocess.py", line 373, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/nix/store/a55d0mc43m0ibl328yxd5dggrr7r4f1h-systemd-250.9/bin/bootctl', '--path=/boot/efi', 'update']' returned non-zero exit status 1.
warning: error(s) occurred while switching to the new configuration
```

:::note alert
以下で記述する解決方法はかなりパワープレイでの解決をしています。
これにより発生したいかなる損害について責任を負えません。
後述しますが、実際筆者は少しだけ事故りました。
:::

:::note info
作業中コマンドの出力等は消し飛ばしたので、全体的に雑な再現です
:::

## TL;DR

※筆者はこのコマンドを使っていないので更に注意

```
find /boot/efi -not -name "*$(uname -r)*" -exec sudo rm -i {} +
```

## 原因の特定

```
$ du -h /boot/efi | sort -rh 
150M	/boot/efi/EFI/nixos
```

`/boot/efi/EFI/nixos` というディレクトリが容量を食っているのがわかる。

中身を見るとカーネルのブート関連のなにかっぽいものが入っている。

```
$ ls -al /boot/efi/EFI/nixos
total 23529
drwxr-xr-x 3 root root     3072  8月 28 21:53 .
drwxr-xr-x 7 root root      512  6月 30  2022 ..
-rwxr-xr-x 1 root root 16011084  8月 28 21:53 b7vi1pd46lmq1gmr0v7v8wj0wgxw5shd-initrd-linux-5.15.85-initrd.efi
drwxr-xr-x 2 root root      512  8月 28 21:53 .extra-files
-rwxr-xr-x 1 root root  8077920  8月 28 21:53 g42zfki362myf6jkdyn060f74r0gcf7z-linux-5.15.85-bzImage.efi
f6jkdyn060f74r0gcf7z-linux-5.15.85-bzImage.efi

# 多分もっとたくさん
```

こいつらを消せば解消しそう。

## 解決

`/boot/efi/EFI/nixos/*.efi` なファイルを消す。
ただし、どう見てもカーネルに関連するため、今使っていそうなものは除外する。

:::note alert
繰り返しになりますが、とても危険な操作をしています。
各コマンドの意味を理解できない場合は実行しないことをおすすめします。
:::

```
# 今動いているカーネルのバージョンを確認する
$ uname -r
5.15.85

# 動いているもの以外を全部消す
find /boot/efi -not -name "*$(uname -r)*" -exec sudo rm -i {} +
```

各ファイルを削除するかのプロンプトが出るので、注意深くファイル名を見てから `y` を打つ。

そして `reboot`。

## 問題発生

再起動後、なぜかもともとつかっていた X11 ではなく Wayland で起動した。  
`conifguration.nix` に以下を書き加えて switch、再起動したらなおった。

```
services.xserver.displayManager.gdm.wayland = false;
```

OS のバージョンが上がったりしたのだろうか。わからんけど治ったからヨシ
Pythonの演算子



| 演算子   | 意味   | 例           |
|:-------:|:------:|:------------:|
| +       | 足し算 | 2+4 = 6      |
| -| 引き算| 2-4 = -2|
| *| かけ算| 2*4 = 8|
| /| 割り算| 2/4 = 0.5|
| //| 商| 9//2 = 4|
| %| 剰余| 9%2 = 1|
| **| 累乗| 2**4 = 16|

##### 足し算
足し算は、" + "記号を使います。
```
2 + 2
### 
# 実行結果
# 4
```
```
-2 + 2
###
# 実行結果
# 0
```
##### 引き算
引き算は、" -  "記号を使います。
```
4 - 2
###
# 実行結果
# 2
```
```
2 - 4
###
# 実行結果
# -2
```
##### かけ算
かけ算は、" * "記号を使います。
```
2 * 4
###
# 実行結果
# 8
```
##### 割り算
割り算は、" / "記号を使います。
```
4 / 2
###
# 実行結果
# 2.0
```
そのまま2と返してくれると思っていたかもしれないが、2.0となっています。これは、Pythonが整数と小数を区別するために起こります。小数点以下の数字が書かれているときは、その数字は小数として扱われます。
では、なぜ今回は小数扱いになっているのか、、、
割り算の結果は割り切れることの方が稀です。そのため、割り算の結果を小数で返す仕組みになっています。
```
2 / 4
###
# 実行結果
# 0.5
```
このように、結果が1より下なら違和感がありません。
##### 商（割り算の商）
記号は、" // "を使います。
割り算の商のみを整数値として返します。
```
9 // 2
###
# 実行結果
# 4
```
被演算子の型によって返り値の型が変わります。
```
9.0 // 2
###
# 実行結果
# 4.0
```
被演算子が浮動小数点型のため、結果も浮動少数点型で返します。

##### 剰余（割り算の余り）
剰余は、" % "記号を使います。
割り算の余りのみを結果として返します。
```
9 % 2
###
# 実行結果
# 1
```
「9 ÷ 2 = 4 余り 1」であり、余りの1を返しています。
##### 累乗
累乗は、" ** "記号を使います。
```
2 ** 4
###
# 実行結果
# 16
```
##### 計算の順番
計算の順番は、普通の数式と同じような丸括弧（）で指定できます。
```
1 + 5 / 2 + 3
###
# 実行結果
# 6.5
```
剰余は除算より優先されるため、「5 / 2」の後「1」と「3」を足す。
```
( 1 + 5 ) / ( 2 + 3 )
###
# 実行結果
# 1.2
```
せんせー、セラミックエアロジェルってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、プロトセルってなに？

# プロトセルとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## セラミックエアロジェルって何？

みんな、マシュマロを知ってるよね？フワフワしてて軽いですよね。
セラミックエアロジェルも、すごく軽くてフワフワの素材です。
でも、これはお菓子じゃなくて、特別な素材なんです。

## どういうこと？

セラミックエアロジェルは、小さな空気の穴がたくさん入っている素材で、だからとっても軽いんです。
でも、同時にとても丈夫で、高温にも強いんです。

## どうしてそれがすごいの？

この素材は、宇宙の探査やエネルギーの保存、さらには防火材料としても使われることができるんです。
とても軽くて、かつ高温に強いから、色んな場面で役立ちます。

## だから、セラミックエアロジェルってなに？

セラミックエアロジェルは、フワフワしてて軽いけど、とても強くて高温にも強い特別な素材なんです。


# まとめ

このように、セラミックエアロジェルは非常に軽く、しかし高温や圧力にも耐えることができる特別な素材です。それにより、さまざまな先進的な技術や応用分野での使用が考えられます。
DBMS(DataBase Management System)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/629ba883-a0f0-2c2a-7dbb-0eb2031b6494.png)
１：２相コミットメント制御
　口座Aを管理しているデータベース（DB1）と講座Bを管理しているデータベース（DB2）が異なるデータベースである場合もあります。情報をさまざまな箇所で管理しているデータベースを分散データベースと言います。分散データベースでは、２相コミットメント制御を行なってコミット/ロールバックをします。
　DB1、DB2の両方から準備完了応答（ACK）がかえってきた時のみ、両方に対して、コミット指示を出します。片方からでもエラー応答（NACK）が返ってきた場合には、両方に対してロールバック指示を出します。
LPWAとは

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiita.com/7_inai_)


# LPWAとは
LPWA（Low-Power Wide-Area Network）は、名前の通り、`低消費電力で幅広い範囲の通信を実現する通信技術の総称`です。この技術は、IoTデバイスが __バッテリ駆動される場合や、電力供給が限られている環境でも効率的に通信するために開発__ されました。LPWAは、データレート(一定時間で送るデータ量)を抑えつつ、長距離通信を可能にするため、センサーデバイスなどが遠隔地からのデータ送信に利用する際に非常に有用です。

# LPWAが注目される背景
[IoT](https://qiita.com/7_inai_/items/f2a56498b70b39befa0b)の急速な発展により、様々なデバイスがインターネットを介して接続され、情報を交換しています。このIoTの成長に伴い、デバイス同士の通信が重要な役割を果たしています。その中でも、特に注目すべき技術の一つが「LPWA」です。LPWAは、__低消費電力で広域の通信を可能にする技術であり、IoTデバイスにとって最適な通信方法__ であるため、IoTにとってLPWAは非常に重要な技術です。

# 主要なLPWA技術
いくつかのLPWA技術が開発・導入されており、それぞれ特徴を持っています。以下にいくつかの主要なLPWA技術を紹介します。

- LoRaWAN（Long Range Wide Area Network）
LoRaWANは、センサーデバイスが低消費電力で広範囲にデータを送信するためのプロトコルです。長距離通信が可能であり、都市部から郊外まで幅広い範囲で使用されています。
- Sigfox
Sigfoxは、IoTデバイスが狭帯域(通信速度が遅いが安定している帯域)で低消費電力で通信するためのネットワークを提供する企業です。独自の通信技術を使用しており、センサーデバイスのバッテリ寿命を延ばすことができます。
- NB-IoT（Narrowband IoT）
NB-IoTは、既存のモバイルネットワークを活用して、低消費電力のIoTデバイスと通信する技術です。広く普及しているモバイルネットワークの基盤を利用するため、カバレッジの拡大が期待されています。

# LPWAの利点と応用
LPWA技術の利点は、省エネルギー性と広範なカバレッジにあります。バッテリ駆動のデバイスが長期間稼働し、遠隔地に位置するデバイスとの通信が可能となります。これにより、製造業、農業、スマートシティ、環境モニタリングなど、さまざまな分野でLPWA技術が活用されています。

# 終わりに
LPWAは、IoTの急速な拡大において重要な役割を果たす通信技術です。省エネルギー性と広範なカバレッジを特徴としており、センサーデバイスや小型デバイスの通信に適しています。これにより、エネルギー効率の向上や遠隔地でのデータ送信が可能となり、IoTの進化を推進しています。LPWA技術は、ますます多様な分野でのイノベーションと発展を支える重要な技術であることは間違いありません。


最後までお付き合いくださりありがとうございました。
JAVA×SQL①

# 課題
問題：JAVAでSELECT文を実行せよ（IDが３以下に限る）
使用ソフト：XAMPP、eclipse

~~~~~java
package DBA;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DBA1 {
	public static void main(String[] args) throws SQLException {
		 String url="jdbc:mysql://localhost/JDBC";
		String user ="root";
		String password ="";
		Connection con = DriverManager.getConnection(url,user,password);
		PreparedStatement pstmt =con.prepareStatement
				("SELECT id,name,age FROM woker WHERE id<4");
		ResultSet rs =pstmt.executeQuery();
		while(rs.next()){
			int id =rs.getInt("id");
			String name =rs.getString("name");
			int age=rs.getInt("age");
			System.out.println("ID:"+ id +" 名前:"+ name +" 年齢:"+ age );
		}
		pstmt.close();
		con.close();
	}
	
	}
~~~~~~~

## 結果

~~~~~
ID:1 名前:山田太郎 年齢:22
ID:2 名前:花田次郎 年齢:23
ID:3 名前:川田三郎 年齢:22
~~~~~


本日の学び：一回SQLでSELECT文を実行するとわかりやすい
HTML基礎②

# 課題
問題：簡単なアンケートをhtmlで作成せよ。
使用ソフト：eclipse

訂正後回答例

~~~~html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>formx</title>
</head>
<body>
<div style="border: solid;"><br>アンケートに協力お願いします。
<form action="" method="post">
<br>
  <dl>
  <dt>◆性別</dt>
  	<dd>
      <input type="radio" name="man" value="男">男性
      <input type="radio" name="woman" value="女">女性
    </dd>
      <dt>◆年代</dt>
  	<dd>
      <label><input type="radio" name="age_range" value="20代">20代</label>
    　<label><input type="radio" name="age_range" value="30代">30代</label>
　    <label><input type="radio" name="age_range" value="40代">40代</label>
　    <label><input type="radio" name="age_range" value="50代">50代</label>
　   <label><input type="radio" name="age_range" 
    </dd>
    <dt>◆あなたが好きな食品は何ですか？</dt>
    <dd><input type="text" name="like food" required></dd>
  </dl>
  <input type="submit" value="送信">
  <input type ="reset" value="クリア">
  <br>
</form>
</div>
</body>
</html>

~~~~~~
本日の気付き：ポチポチするボタンはラジオボタンといいます。
本日の学び：<input type ="reset" value="クリア">ボタンが作れます。
EC2でディスクのレスキューを行う！

## 目的
ログインが出来なくなってしまったEC2インスタンスが出てきた場合のレスキュー方法についてまとめる。

## イメージ図
![ディスクレスキュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738475/f89aafd9-a373-57c2-77f6-c12a3d41c860.png)



## 手順

### AWSコンソール側

1. EC2を選択する
EC2 > インスタンス > i-xxxxxxxx


2. 「詳細」「セキュリティ」「ネットワーク」などを選べる下のタブから「ストレージ」を選択

3. 「ボリュームID」をクリック
「vol-xxxxxxxxx」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738475/dca5007f-1e09-a5d8-03f5-8f16b30d4e39.png)

4. アクションから、ボリュームのデタッチを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738475/d5bbbd6c-67de-1aba-69bb-8675b1a90daa.png)

5. ボリュームのアタッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738475/6db9eb14-bb53-abd8-615d-e76d81deac0e.png)


6. インスタンスを選択し、ボリュームのパスを設定後、ボリュームのアタッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738475/d338a02c-8f4e-d4a6-a8c5-60431506831e.png)


### EC2にログイン

ボリュームを一覧表示
```bash
$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
├─xvda1 202:1    0   1M  0 part
└─xvda2 202:2    0   8G  0 part /
xvdf    202:80   0   8G  0 disk
├─xvdf1 202:81   0   1M  0 part
└─xvdf2 202:82   0   8G  0 part
```

xvdfを/dataにマウントする（一時的）
```bash
$ mkdir /data
```

```bash
$ mount -t xfs -o nouuid /dev/xvdf2 /data
```

### 確認

マウントされている事を確認
```
$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
├─xvda1 202:1    0   1M  0 part
└─xvda2 202:2    0   8G  0 part /
xvdf    202:80   0   8G  0 disk
├─xvdf1 202:81   0   1M  0 part
└─xvdf2 202:82   0   8G  0 part /mnt/data
```

ディスクの中身が見れた
```
$ ll /data/
.autorelabel  boot/         etc/          lib/          media/        opt/          root/         run/          srv/          tmp/          var/
bin/          dev/          home/         lib64/        mnt/          proc/         rootfs/       sbin/         sys/          usr/
```

```
$ ll /mnt/data/home/
shoma/  ec2-user/
```
フルサーバーレスでwebアプリ開発、実際やってみて感じたこと

# はじめに
髙橋愛理です！  :frog:
AWSサーバーレス開発のチームリーダーやってます。

私のチームでは、AWSでサーバレス開発を行っているのですが、１年半と少しの間、実際がっつりやってみた思ったことや感じたことをまとめてみました。

# サーバレス開発とは
サーバレス開発とは、サーバを意識せず、**クラウドのサービスをフル活用して行う**開発手法。
ようは、<font color="blue ">「インフラの面倒くさそうな設定は全部クラウドに任せて、開発に専念してね！」</font>ってやつ。

# 開発の経緯・概要
私が所属している事業推進チームでは、自社webアプリ開発を行っている。
総勢8名、フロントエンド、バックエンド、インフラの3つのチームに分かれている。

去年（2022年）1月に、事情によって前任のリーダーが退職し、
私が新しくリーダーに就任したが、技術選定から設計まで、全ての工程をやり直すことに。

その際、「どうせ一からなら、サーバーレス開発やりたい！」と思い、開発に踏み切った。

# 実際やってみて感じたこと

### :scream: キャッチアップがすごく大変
まず、真っ先に感じたのが、コレ。
サーバレス開発はクラウドのサービスをフル活用して構築するため、覚える量が多いのなんの。
今使用しているサービスで、**ざっと10個は超える**。

しかも、構築がサービスに頼りきりなので、**深い粒度まで理解していないと、事故の原因につながる**。

その上、**AWSのドキュメントが見にくい！！**
機能がかなり多いくせに、英語をそのまま翻訳したみたいな呪文で書かれているので、調べにくい。
もうちょいドキュメントわかりやすくしてください、AWSさん。。

### :scream: 情報が少ない
フルでサーバレス開発をやっている人があんまりいないせいか、情報が少ない。
だから呪文のような公式ドキュメントや、SDKの仕様書みたいのを頑張って読まなくてはいけない時がある。

### :scream: 各コンポーネントのチューニングが面倒
各リソースのチューニング、ちゃんとやると普通に面倒くさい。
設定値が多いし、それを全部理解して設計に落とし込むってなると、もうヤダ！ってなる。
もちろん大体は自動でスケールしてくれるけど、**同時実行数に限りがあるものもあるので、理解してないと事故の原因になる**。
サーバがないからインフラの設定必要ないジャン！ってのがサーバレスの売りなはずなのに…。

### :kissing_closed_eyes: 開発が早い
覚えてしまえば、開発は結構早い。
サーバレスで使うのは、マネージドサービスがほとんどで、**初期設定のような作業がほぼ必要ない**。
小機能くらいだったら本当ささーっと開発できる。

### :kissing_closed_eyes: 初期費用が掛からない
サーバレスで使うサービスって、**何万リクエストまで無料、かつ超過しても１リクエスト1円？みたいなオッたまげな単位** 。 
どうやって採算とるんだ？って思うくらい。
まぁベンダーロックインさせて、後からどんどんかかるゾってやつなんだろうけど…。
だから、スタートアップ企業とかで非常に導入しやすい。

### :confused: 全員がフルスタック気味になってく
サーバレスはリソース間連携がキモなので、「この部分のこのリソースだけお願いネ！」なんてわけにはいかず。
連携している一連のサービスを理解してないとなかなか対応が難しい。
かつ、インフラ系のタスクがバックエンドに足突っ込んでたり、フロントでもAWSリソースの仕様がわかってないといけなかったりするので、**完全分業はムリじゃね？って思う**。
チーム皆仲良しが重要。

### :confused: 設計が重要
**AWSリソースだけで作るから、設計間違えると地獄**。
関数の中で関数呼び出して…みたいなのが続くような設計とか、本当死に向かっているようなもの。

小機能を作るようなイメージでリソース同士を組み合わせて、コンポーネント化して疎結合にし、それぞれを連携させることが重要。
まぁその設計のノウハウってどんだけの人が持ってるんだろう？と疑問に思うが…。
逆に、それさえ出来れば、変更に強いアーキテクチャになる。

### :confused: 運用監視の設定が独特
コンポーネント間の連携をしくったら？コンポーネント内でエラーが起きたら？
っていうのを全部考えると、これまた大変。
**その辺のノウハウに関する情報が、調べてもあんまりないのよね**。

ログ設計とかも、必要なログちゃんと拾おうってなると、結構細かくやる必要がある。
運用・監視設計とかも、集計したログをどうやって検索するかとか、考えることは多い。
最終的に、自分達で要件にあった設計をするしかないねってなった。

# 最後に
AWSはサーバレス製品をガンガンリリースしてた時期があったし、サーバレスを押している感あったので、もっと広まるだろうと思っていた。
が、キャッチアップコストがかなりかかるし、そこに対しての費用を捻出できる企業が少ないから、フルサーバレスでの開発は、正直あまり増えない気もする。

体力のある大手企業では、サーバレスを採用することもあると思うが、
中小企業では、一部サーバーレスで構築するという形が多くなるのではないかと思う。

サーバレスは部分使いでサクッと機能を作るのはかなり得意なので、是非そういう形で増えていってほしいなぁ。
個人的にはやっぱサーバレス好きだし、もっともっと増えて欲しいと思いつつも…　
サーバレスの味方には、なり切れないでいる。
【aws】クロスアカウントでのS3取得

# 実現したいこと
- account1にあるLambdaからaccount2にあるS3内のファイルを取得する
- S3の取得には何かしらの制限をかける必要がある
![スクリーンショット 2023-08-28 17.59.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363249/c91467dd-ecab-d502-93d0-7610f7d75153.png)


# [NG] LambdaのIPを固定してS3にIP制限をかける
### AWS構成
![スクリーンショット 2023-08-28 18.03.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363249/346d00df-f10b-9914-765a-84ae647db6b3.png)

- LambdaのIPを固定

https://repost.aws/ja/knowledge-center/lambda-static-ip

- S3にIP制限をかける
    - ブロックパブリックアクセス：オフ
    - バケットポリシー：以下の通り
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::{バケット名}/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": {NAT Gatewayの固定IP}
                }
            }
        }
    ]
}
```

### 結果
ファイル取得できず。
S3から `403 Forbidden`　が返ってきていました。 

試しにS3のIP制限をなくしたところ、画像が取得できたため、取得元のIPが間違っていると推測。
**NAT Gatewayを経由していないようです。**

# VPCエンドポイント経由で取得していた
### AWS構成
![スクリーンショット 2023-08-28 20.59.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363249/b73a55a3-625f-b1e7-54fa-2d65420fd909.png)

- S3のバケットポリシーでVPCエンドポイントIDを指定すると、無事ファイルが取得できました。
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::{バケット名}/*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceVpce": {VPCエンドポイントID（s3）}
                }
            }
        }
    ]
}
```
たのしいmicrobitコンテスト2023応募作品「フーフー★バトル」

## 作品名
フーフー★バトル

## 作品概要
爆弾を相手にぶつける2人対戦型ゲームです。

<遊び方>
お互いの息をそれぞれのmicro:bitに吹きかけてそのチカラで爆弾を相手の陣地にはね返します。

爆弾ルが自分の陣地の一番奥まで来るとゲームオーバー。

自分の陣地(緑のライン)に入って来る前に息を吹きかけても爆弾は相手には戻っていきません。

ウラワザ：自分の陣地の奥ギリギリで跳ね返すとスピードアップだぞ！(危ないけどね！)




## プログラム


本体
https://makecode.microbit.org/_TqzLXPCVbhvL

プレイヤーA
https://makecode.microbit.org/S59614-68856-90807-06310

プレイヤーB
https://makecode.microbit.org/S93994-83115-63320-62944
同じUnityプロジェクトで複数のandroidアプリをインストール

Unityでandroidアプリをビルドする際にProjectSettingのPlayerからCompanyNameとProductNameを変えれば別アプリとしてandroid端末にインストール出来ると思っていましたが、そのままでは一つのUnityプロジェクトからは一つのandroidアプリしかインストールできませんでした。一つのUnityプロジェクトで複数のアプリをインストールするための方法の忘備録です。

まず完成したアプリを**ビルド**ではなく**エクスポート**します。
BuldSettingの"Export Project"にチェックを入れると、BuildボタンがExportに変わりエクスポートできます。
![Android_export.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1146955/56859e49-28c4-a0f4-ba0e-603ce8af54cc.png)

エクスポートするとファイルで表示されるので、エクスポート先のフォルダからluncher/build.gradleファイルをプロジェクトの外、個別アプリのフォルダを作って保存しておきます*1

UnityのProjectSettingのAndroidの項目のPublishingSettingのCustomMainManifestとCustomLauncherGradleTempleにチェックを入れます。
![Android_Setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1146955/4b3a245d-4c7f-383a-df29-ae1c05cf7d97.png)

そうするとプロジェクトのAseets/Plugins/Androidというフォルダに
AndroidManifest.xml
launcherTemplate.gradle
というファイルが生成されます。
AndroidManifest.xmlをテキストビューワーで開き、package部分を別アプリとして登録する予定のProjectSettingのCompanyNameとProfuctNameで設定した文字列と同じに書き換えます（XXXとYYYの部分）
```
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.XXX.YYY"
    ・・・
```
次にlauncherTemplate.gradleもテキストビューワーで開き、先ほど*1で保存したbuild.gradleの内容を全てコピーしてlauncherTemplate.gradleに上書きペーストします。さらにdefaultConfig内のapplicationIdを先ほどのPackageと同じ文字列にします。
```
    defaultConfig {
        applicationId 'com.XXX.YYY'
        ・・・
```

BuildSettingのExportProjectのチェックを外してビルドすると、別なアプリとしてインストールが可能になります。

次に同じプロジェクトで別なアプリを登録したい場合はその都度ビルド前にAndroidManifest.xmlのPackageとlauncherTemplate.gradleのapplicationIdを書き換えます。
『BizRobo! LAND Community』を活用してみた

就業先では、RPAツールのBizRobo!を使用しています。BizRobo!開発で悩み、BizRobo!ナレッジベースで日々検索しています。

BizRobo!を改修する時に不明点が出てきた場合、BizRobo!ナレッジベースを使用していましたが、BizRobo! LAND　Communityを活用することも多くなりました。
今回は、BizRobo! LAND Communityを活用する方法について、共有いたします。

※時間が経過して変わってしまった箇所や間違っている箇所、不適切な表現があるかもしれませんが、その時は都度修正いたしますので、ご指摘いただけると幸いです。

## My BizRobo!リリースに伴う変更点
24年1月11日追記
BizRobo! LAND Communityは、My BizRobo!のリリースに伴い、新規投稿ができなくなりました。BizRobo!に関する質問はMy BizRobo!で行えるため、そちらをご活用ください。

My BizRobo!の詳細は下記をご参照ください。
[2023/12/4にリリースされた『My BizRobo!』とは](https://qiita.com/TBO/items/0571c4cf31904a2b6ba1)

## BizRobo! LAND Communityとは
不明点がある場合、RPAテクノロジーズ株式会社が提供しているBizRobo!ナレッジベースを調べることが多いかと思います。しかし、BizRobo! LAND Communityでも不明点を解決できます。
BizRobo! LAND Communityは、BizRobo!に関して、情報共有や悩み相談、ユーザー同士の交流を行うSNSであり、Facebookのようなインターフェースとなっています。過去の類似する投稿を探したり、質問を投稿したりすることで、不明点を解決することができます。

BizRobo! LAND Communityにログインするには、BizRobo! PORTALのアカウントが必要です。
詳細は以下のサイトをご確認ください。
[BizRobo! LAND Community](https://rpa-technologies.com/bizrobo-land-community/)

## 実際に活用してみた結果
[BizRobo!でExcelマクロを実行する方法は](https://qiita.com/TBO/items/95d7f84939679eb6c2ed)
以前、私は上記のような記事を書きました。

コマンドライン実行ステップで、VBSを動かし、VBSによってExcelマクロを動かそうと思いましたが、自分の私用PC(Window10)で動かすことができず、2日も悩み、躓いてしまいました。

その時に、BizRobo! LAND Communityで質問したところ、コマンドの一部にスペースがないという初歩的なミスであると教えてくれました。初歩的なミスで申し訳なかったですが、こういうミスは意外と気づかずに長引いてしまうことがあります。こういう質問にも丁寧に答えてくれるので、ありがたいです。
また、VBSによるエラーが発生した場合のハンドリング方法やExcelマクロをVBSで動かす理由など、BizRobo!ナレッジベースに載っていないことも教えてくれました。
BizRobo! LAND Communityにて、積極的に質問してみることをオススメします。

※ただし、質問したことに対して確実に解決してくれる訳ではないため、ご注意ください。あくまでもコミュニティに登録しているユーザーが善意で答えてくださっているため、もし解決できなかったとしても、礼儀と感謝を忘れずに接することが大事だと考えています。

## 最後に
BizRobo! LAND Communityを活用する方法について、ご紹介しました。
不明点がある場合、まずBizRobo!ナレッジベースを調べます。アクションステップの使い方など、BizRobo!ナレッジベースで解決できることは多いです。

しかし就業先の環境で発生するエラーは解決できないことが多いです。その場合は、BizRobo! LAND Communityにて質問を投げます。日本全国BizRobo!開発者が集まっているため知っている誰かしらが回答してくれるのです。私もBizRobo! LAND Communityに質問したことで、就業先の課題(Kintoneの仕様変更で発生したRPAのバグ)を解決したことがあります。

BizRobo!開発していく上で、不明点がでてくることは避けられません。このように悩みを解決してくれるコミュニティがあることはとてもありがたいなと感じています。今回の記事が、RPA開発で悩んでいる人の為になれば幸いです。

今後もBizRobo!開発に役立つような記事を書いていきます。
plunkerでvue その61

# 概要
plunkerでvueやってみた。
練習問題、やってみた。

# 練習問題
vueファイルでsin波を書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c1e31fbc-146e-5f9d-43e4-a2f2d9e00b8c.png)

# サンプルコード

```

<template>
  <div>
    <h2>sin波</h2>
    <canvas id="canvas" ref="canvas" width="400" height="400"></canvas>
  </div>
</template>

<script>
define(['Vue'], function(Vue) {
  return new Vue({
    template: template,
    data() {
	    return {
	      canvas: null,
	      context: null,
	      px: 20,
				data: []
	    }
    },
    created() {
		}, 
    mounted() {
	    this.canvas = this.$refs.canvas;
	    this.context = this.canvas.getContext("2d");
			this.draw2();
		},
		watch: {
		},
		methods: {
			draw2() {				
				let ctx = this.context.canvas.getContext("2d");
				for (var i = 0; i < 400; i++)
				{
					var x = i / 30.0;
					var y = Math.sin(x);
					this.data.push(y);
				}
				var hc = 100 + 100;
				ctx.strokeStyle = "#f00";
				ctx.lineWidth = 5;
				ctx.moveTo(0, hc);
				for (var i = 1; i < 400; i++)
				{
					ctx.lineTo(i, hc - this.data[i] * 70);
				}
				ctx.stroke();
			}
    }
  });
});
</script>

<style>
</style>




```

# 成果物

https://embed.plnkr.co/plunk/1wnbw8nDwpDhpHu3


以上。
NVIDIA Isaacについて一言

NVIDIA Isaac関連で間違いや混乱が見られているのでまとめる。ただし公式情報ではないのでユーザー視点の解釈であると同時に今後変わる可能性がある点はご了承いただきたい。

## スペルについて
**Isaac**です。IssacでもIsaccでもありません。

## Isaacソリューションについて

NVIDIAはIsaacと名の付くものを3つ展開している。**以下の4つに深い関係はない。**
#### Isaac Sim

ロボットシミュレータ。ロボットで使用することが多い機械学習データの生成。

#### Isaac SDK

NVIDIAオリジナルなROS/ROS 2。ただし開発は終了してIsaac ROSへの移行を促している。ただこの資産を活用しようとする動きは見られる。

#### Isaac ROS
NVIDA GPUを活用したVSLAMや動画エンコードなどのパッケージ群。


####  Isaac Gym
Isaac Simを活用したロボット強化学習プラットフォーム。最近、ロボットAI界隈で使われているのを見かける。
KiCad7備忘録　ライン状の禁止領域の追加

# はじめに

電源の分離などにわざわざベタをゾーンの切り抜きで区切っていくのは面倒だし、ベタとベタの間を等間隔にするのもそれなりに大変。

そんな時にライン状の禁止領域を引くと楽なのでその作業の備忘録

# 説明

適当にベタを引いた図面を用意する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/37bb505e-7d89-9b58-e4c2-fe86af4476bb.png)

適当なレイヤに線を"線を描画(Ctrl+Shift+L)"コマンドで線を引く。
レイヤは後で変更するのでどのレイヤでも良い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/ab5d396d-933f-9c89-dd74-da8dc501f630.png)

引いた線を禁止したい幅にする。今回は線幅1.0mmとした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/5ebd45bb-fc1e-24ba-a8dd-4f52040e0daf.png)

線を選択して
右クリック⇒選択対象から作成⇒選択対象からルールエリアを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/0d717c36-9549-6e11-fd0a-d1b9056f2df4.png)


線分をルールエリアに変換ウィンドウが表示されるので
以下の様に設定。レイヤ、ルールについては目的に応じて変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/1e5b0946-a302-d567-df25-2b14fa78d75a.png)

OKを押してゾーンの塗り直しをするとラインを引いた部分のみが抜ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/7d8aa9c5-e7ff-5532-cba9-1b689ea7ac2b.png)

これを線ではなく、円弧で同様の操作をすれば円弧の形で抜ける。

ほなまた
Flutter Android API レベルを上げる方法

# はじめに
![Screenshot 2023-08-28 at 19.13.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/97d8aa61-7bf8-8f7d-fe71-b712a857e539.png)
Androidで公開しているアプリに対して、以下のような警告が届いた。

>古いバージョンの Android を対象にしているアプリが 2 個あることが判明しました。Google Play では、ユーザーに安全で保護されたエクスペリエンスを提供するため、すべてのアプリについて 2023/08/31までに対象 API レベル要件に準拠することを義務付けています。

https://developer.android.com/google/play/requirements/target-sdk?hl=ja

アプリを更新して Android 13 を対象にしないといけないようです:sweat:

# ターゲットとなるAndroidのOSバージョン（APIレベル）を変更する

```gradle:android/app/build.gradle
android {
    compileSdkVersion 33 // // 33に変更！
    ndkVersion flutter.ndkVersion

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.sample.app"
        // You can update the following values to match your application needs.
        // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
        minSdkVersion flutter.minSdkVersion
        targetSdkVersion 33 // 33に変更！
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
            storePassword keystoreProperties['storePassword']
        }
    }

    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.release 
        }
    }
}
```

**`compileSdkVersion`と`targetSdkVersion`を33に変更しましょう。**

初期値では以下のようになってるかと思いますが、

```gradle
defaultConfig {
    targetSdkVersion flutter.targetSdkVersion
    ...
  }
```

`flutter.targetSdkVersion`を消して「33」みたいな数値を直接入れても問題ないようです！

https://mascularseal.blogspot.com/2022/10/android-api-targetsdkversionsdkandroidf.html

あとはバージョンを上げて公開すればOKです:v:

https://qiita.com/kokogento/items/fb07e6926db0fe850f98


![Screenshot 2023-08-28 at 21.00.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/18068a07-337f-935a-d6e6-3cdfdb1f8e74.png)
かなり強めの警告が出てるので早めに対処しましょう・・・・
CSS すぐできるレスポンシブ 3つのやり方

## 学習に使用した教材・サイト
この記事は下記の教材やサイトを参考に作成いたしました。

[【PHP, MYSQL, Apache】ガチで学びたい人のためのWEB開発の基礎(バックエンド編)](https://www.udemy.com/share/104sQu3@ZAHh0tyi_EEMgFYs-igVZZeAjCI3VtVPtdInoEG0i76XqLrnlyX9aR3IWH_S1wLCMw==/)

## やり方1：HTMLが読み込むCSSを分岐させる
html内 linkタグでcssを読み込む時点で、対応するcssを読み込ませる
```html:HTML
<link rel="stylesheet" href="mobile.css" media="screen and (max-width: 400px)">
<link rel="stylesheet" href="desktop.css" media="screen and (min-width: 401px)">
```

## やり方2：CSS内で対応するCSSを読み込ませる
htmlからは、style.cssを固定で読み込むようにしたうえで、css内で対応するcssを読み込むようにする
```css:CSS
@import url("mobile.css") screen and (max-width: 400px);
@import url("desktop.css") screen and (min-width: 401px);
```

## やり方3：mediaクエリで設定する
htmlからは、style.cssを固定で読み込むようにしたうえで、css内でmediaクエリを使って画面サイズに応じたcssプロパティの設定値を定義する
```css:CSS
@media screen and (max-width: 400px) {
    h1{
        background-color: black;
    }
}

@media screen and (min-width: 401px) {
    h1 {
        background-color: white;
    }
}
```

## モバイルか、デスクトップか、どちらかを基準にして書いたほうがいい
* 共通の内容は、基準となる方に書く
* 基本は、デザインがシンプルになりやすいモバイルを基準としたほうがいい
    * デスクトップの方は、デザインを追加修正するイメージ
```css:CSS
h1 {
    color: red;
    background-color: black;
}

@media screen and (min-width: 601px) {
  h1 {
        background-color: white;
  }
}
```

## HTMLヘッダにviewportを設定するのを忘れずに
* `content="width=device-width"` に！
```html:HTML
<head>
    <!-- ~~~略~~~ -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- ~~~略~~~ -->
</head>
```
plunkerでvue その60

# 概要
plunkerでvueやってみた。
練習問題、やってみた。

# 練習問題
vueファイルで湯婆婆を書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9d533e6d-61bf-878e-9bd2-3d4671267d35.png)


# サンプルコード

```

<template>
  <div>
    <h2>湯婆婆</h2>
		<div class="yubaba">
			<div>契約書</div>
			<div>甲は油屋当主として、乙を油屋に雇用することを</div>
			<div>契約し、労働に伴う対価の支払いを右の通り、約定する。</div>
			<div>なお、一日の労働の対価は金百円とする。</div>
			<div>甲　油屋当主　湯婆婆</div>
			<div>乙</div>
			<div>契約書だよ。そこに名前を書きな。</div>
			<input type="text" v-model="name"><br><br>
			<button v-on:click="outputName(),createNewName()" id="keiyakubtn">契約する</button>
			<div>{{displayName}}</div><br>
			<div>{{newName}}</div>
			<div v-if="!name">{{allClear()}}</div>
			<button v-on:click="contractCancellation">契約を破棄する</button>
		</div>
  </div>
</template>

<script>
define(['Vue'], function(Vue) {
  return new Vue({
    template: template,
		data() {
			return {
				name: '',
				displayName: '',
				newName: '',
				setTimeID: '',
			};
		},
		methods: {
			outputName() {
				if (!this.name) 
				{
					alert('名前を書きな!!')
				} 
				else if (this.name) 
				{
					this.displayName = 'ふん。「' + this.name + '」っていうのかい。贅沢な名前だねぇ'
				}
			},
			createNewName() {
				const displayNameArray = this.name.split('')
				this.setTimeID = setTimeout(() => {
					const randomName = displayNameArray[Math.floor(Math.random() * this.name.length)]
					this.newName = 'お前の名前は「' + randomName + '」だよ。いいかい「' + randomName + '」だよ。わかったら返事をするんだ！！'
				}, 3000)
			},
			allClear() {
				if (!this.name) 
				{
					this.displayName = ''
					this.newName = ''
				}
			},
			contractCancellation() {
				alert('契約破棄')
				this.name = '';
				this.displayName = ''
				this.newName = ''
				for(let i = 0; i < 1000; i++) 
				{
					document.write('　　わたしゃ残念だよ　　')
				}
			}
		},
  })
});
</script>

<style>
h3 {
	margin: 40px 0 0;
}
ul {
	list-style-type: none;
	padding: 0;
}
li {
	display: inline-block;
	margin: 0 10px;
}
a {
	color: #42b983;
}
#keiyakubtn {
	background-color: red;
	color: white;
	width: 4cm;
	height: 4cm;
}
</style>




```

# 成果物

https://embed.plnkr.co/plunk/LH5Fu9AELacXtzXE


以上。
2023: Week 34 - HR Month - Turnover Rate / Preppin' Data / Tableau Prep

# Challenge Preppin'Data 2023:Week 34

## 概要
### DCごとの月別在籍者数及び関連項目

従業員のDCごとの勤務データがあります。
そのデータを使って、月別の在籍数及び関連項目を算出します。
歯抜けデータが多いので、歯抜けをTableu Prepの機能を使い行を追加します。

＜オリジナルデータ＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531257/3d653427-043d-fb5a-e629-e5fa7c461149.png)

* 集計時の注意事項

以下の通り、いろいろなパターンのデータになっています。
** 働いた月しかデータがないため、休職のデータが歯抜けになっている
** 退職した人
** DC間を異動した人
** 期間だけ働く雇用体系の人（たとえば、毎年7～9月だけ働く）
** 再雇用の人
** 雇用開始した月(hire_date)と働き始めた月(month_end_date)がずれている人

## 問題のページ（英語）※ここからデータをダウンロード
https://preppindata.blogspot.com/2023/08/2023-week-34-hr-month-turnover-rate.html

## 出題者の回答のページ（英語）※動画あり
https://preppindata.blogspot.com/2023/08/2023-week-34-solution.html

## 自分の解決法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531257/35d712ca-f2e7-4707-f745-22d8cd85763a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531257/f98368df-a680-250c-847f-6bddda4bafdc.png)

### ポイント
「新しい行」を生成する際のコツは以下の通りです。

### <b>1つの項目の日にち ＜ 2つの項目の日にち</b>

hire_date(1つめの項目)を基準に同じ日が生成される。最終月はleave_date(2つめも項目)と同じ日が生成される。それぞれの日にちが相違する場合は最終月のデータがダブルで生成されていないかチェック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531257/8e2c47d9-9936-8e3a-d173-f8c62a96a6d1.png)


### <b>1つの項目の日にち ＞ 2つの項目の日にち</b>

各月のデータの日にちはhire_date(1つめの項目)から生成されるが、最終月のデータの日にちはleave_date(2つめも項目)から生成される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531257/f278ffef-d93e-c6aa-a78e-4fc37dd58109.png)

これらを解決方法の一つとして、月ごとの行を生成したい場合は、1日（ついたち）にデータを変換してやると、わかりやすいです。

### <b>1日（ついたち）のデータを作る計算式</br>

DATE(DATETRUNC('month',[hire_date]))

DATETRUNC関数で月データに変換すると結果として1日（ついたつ）データになります。
なお、計算後の値が日時型になるので、DATA関数で日付型へ変換します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531257/0e5cb7d7-52d5-30e3-d814-b9993f0a677f.png)


### <b>月末日のデータを作る計算式</br>
DATE(DATEADD('day',-1,DATEADD('month',1,[month])))

月初データに1か月足して翌月の1日を作成し、そこから-1することで月末を算出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531257/fe6f5cfc-3af4-171c-8032-4181b6bffb9c.png)


### 前月データ（1件前のデータ）を参照する計算式

{ PARTITION [dc_nbr]:{ ORDERBY [month_end_date] ASC: LOOKUP([ee_count],-1)}}

PARTITIONで指定した項目ごとに、ORDERBYで指定した項目でソートして、-1つまり1行前のデータを参照します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531257/b52daa01-8ce5-4eb8-0320-ec01b6d88972.png)
Unity エディタ再起動方法 ( UnityHubが開いちゃう人向け )  

Unityエディタ拡張をしてたりしてエディタを再起動する機能を追加する時にググったコードだとUnityHubが起動するまでは行くけどそのあとにプロジェクトを開いてくれなかったのでちょっと調べてみた。    

## 最初に試したコード  
よくあるのは以下のような Process.Start でアプリケーションのパスを指定し、アプリ起動をしてからエディタを閉じる方法

```cs
static void Restart()
{
    Process.Start(EditorApplication.applicationPath);
    EditorApplication.Exit(0);
}
```

ただこの方法だと 2023/08/28 現在では UnityHub が開くのみでプロジェクトまでは開いてくれなった    


## 解決策   

Unityのフォーラムを見つけたのでそのコードを試してみた  
https://forum.unity.com/threads/is-there-an-api-to-restart-the-editor-via-script.1021639/    

```cs

static void Restart()
{
    EditorApplication.OpenProject(Directory.GetCurrentDirectory());
}

```

Unity の CsReference 覗いてみたところエディタの再起動は以下のようなコードになっていた 
https://github.com/Unity-Technologies/UnityCsReference/blob/62633e3912ab891be4c6f5ef4500e69f59d85ed4/Editor/Mono/Inspector/PlayerSettingsEditor/PlayerSettingsEditor.cs#L2916  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212999/4fd39faf-1ebb-4739-628e-c4f9f19953e6.png)

Environment.CurrentDirectory と Directory.GetCurrentDirectory() はどちらもカレントディレクトリのパスを返すプロパティ or メソッド   
どちらを使うかはほぼ好みに分かれるけど Environment.CurrentDirectory の方は setter でカレントディレクトリを移動出来てしまうので取得オンリーの Directory.GetCurrentDirectory() を採用した
VanJSでカスタムフック（Custom Hook）を作ってみた

VanJSでReactのカスタムフックのようなものを作ってみました。VanJSの公式としてカスタムフックがあるわけではないですが、作ってみたらできたので共有します。

## 作成したカスタムフック

カウンターの数字の増減とリセットができるものです。引数に初期値と増減する数値を渡して使用できます。

## 作成したもの

デモ画面を用意したので、実際の動作を試してみてください。

https://stackblitz.com/edit/vitejs-vite-djfwob?file=src%2Fmain.ts,src%2FuseCounter.ts&terminal=dev

## コード

再利用可能を証明するために、カスタムフックである`useCounter`を２つ宣言しています。`handler`で値を変更した時に`count2`に影響が無いことが確認できます。

```typescript:src/main.ts
import van from 'vanjs-core'

import { useCounter } from './useCounter'

const App = () => {
  const { div, p, button } = van.tags

  // 初期値は０、増減の間隔は１
  const [count, handler] = useCounter(0, 1)

  // 初期値は１０、増減の間隔は３
  const [count2, handler2] = useCounter(10, 3)

  return div(
    p(count),
    button({ type: 'button', onclick: () => handler.increment() }, 'increment'),
    button({ type: 'button', onclick: () => handler.decrement() }, 'decrement'),
    button({ type: 'button', onclick: () => handler.reset() }, 'reset'),
    p(count2),
    button({ type: 'button', onclick: () => handler2.increment() }, 'increment2'),
    button({ type: 'button', onclick: () => handler2.decrement() }, 'decrement2'),
    button({ type: 'button', onclick: () => handler2.reset() }, 'reset2'),
  )
}

van.add(document.getElementById('app')!, App())
```

Reactのカスタムフックの関数名は`use`から始まる必要がありますが、VanJSはその必要はありません。ただし、何の役割を持つ関数なのか分かりやすくするために、敢えて`useCounter`としています。

```typescript:src/useCounter.ts
import van from 'vanjs-core'

export const useCounter = (initialCount: number, step: number) => {
  const count = van.state(initialCount)

  // カウントを増やす
  const increment = () => {
    count.val += step
  }

  // カウントを減らす
  const decrement = () => {
    count.val -= step
  }

  // カウントをリセット
  const reset = () => {
    count.val = initialCount
  }

  return [count, { increment, decrement, reset }] as const
}
```

## まとめ

今回はVanJSでカスタムフックを作ってみました。VanJSでもReactのカスタムフックようなものが作成できるので、うまく利用すればロジックの再利用やコンポーネントのコードをシンプルに保つことができると思います。



## 最後に

### GoQSystemでは一緒に働いてくれる仲間を募集中です！

ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site?qiita=099093d85c4fc71eba20