OmniAICreator/Qiita-1.07M huggingface dataset:
PythorchのConvTranspose2dのパラメータ設定方法

# 1. はじめに

GANの生成の際などに用いるPytorchのConvTranspose2dの使い方について、
色々と調べたりしましたので、簡単にまとめておこうと思います。

# 2. ConvTranspose2Dのパラメータ

Conv2dの逆変換を行うConvTranspose2Dは、その変換前のConv2Dの際のパラメータと同じものを用いるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2048607/e1e16629-6275-3261-503b-941268232b79.png)

Conv2d
![no_padding_no_strides.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2048607/00682a20-29c3-d63b-eade-166fb732487e.gif)

ConvTranspose2d
![no_padding_no_strides_transposed.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2048607/984ecf34-5741-f521-3b78-052241195e75.gif)

Conv2dの感覚でConvTranspose2dを見ると、パディングのパラメータが0でないように見えます。しかし、ConvTranpose2dのパディングのパラメータは、Conv2dの際にパディングをしているかどうかによって決定します。他にも例を見たい方はこちらのサイトをご参照ください。

https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md

# 3. 出力サイズの導出

https://pytorch.org/docs/stable/generated/torch.nn.ConvTranspose2d.html

出力サイズは以下の数式で導き出されます。

```math
\begin{align}
&Input : (N, C_{in}, H_{in}, W_{in}) \; or \; (C_{in}, H_{in}, W_{in})\\
&Output : (N, C_{out}, H_{out}, W_{out})\; or \; (C_{out}, H_{out}, W_{out}), where
\end{align}
```
 
 
```math
\begin{align}
H_{out} &= (H_{in}-1) \times stride[0] - 2 \times padding[0] + dilation[0] \times (kernel\_size[0]-1) + output\_padding[0] + 1\\


W_{out} &= (W_{in}-1) \times stride[1] - 2 \times padding[1] + dilation[1] \times (kernel\_size[1]-1) + output\_padding[1] + 1
\end{align}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2048607/27175617-7104-8b12-d57a-68e5f90ae8d0.png)

この数式を単体で理解するのは難しいですが、Conv2dの以下の数式の逆変換と考えると理解しやすいと思います。

https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html

```math
H_{out} = \lfloor \frac{H_{in} + 2 \times padding[0] - dilation[0] \times (kernel\_size[0]-1) -1}{stride[0]} + 1 \rfloor\\
W_{out} = \lfloor \frac{W_{in} + 2 \times padding[1] - dilation[1] \times (kernel\_size[1]-1) -1}{stride[1]} + 1 \rfloor
```

このとき、output_paddingだけはConvTranspose2dでしか出現しない変数となります。
これはoutput shapeをコントロールするように、出力の片側に追加するもののようです。

# 4.まとめ

今回はPytorchのConvTranspose2dのパラメータ設定について、覚書程度にまとめました。
自分でGANやVAEのネットワーク構築をするときがあれば、使えればと思います。
【Laravel】CRUD実装：ルーティング編

Laravelを勉強中の非エンジニア
学習したことのメモとしての投稿です。

# 環境
Lraravel8

# CRUD実装に必要なルーティング

### 通常のルーティング

```php:/routes/web.php
Route::get('index', [BlogController::class, 'index']);
Route::get('create', [BlogController::class, 'create']);
Route::post('store', [BlogController::class, 'store']);
Route::get('show/{id}', [BlogController::class, 'show']);
Route::get('/show/{id}/edit', [BlogController::class, 'edit']);
Route::put('/show/{id}/update', [BlogController::class, 'update']);
Route::delete('/show/{id}/delete', [BogController::class, 'delete']);
```

###  リソースルート
↑上記のCRUDルーティングが一括で設定できるルーティング方法(リソースルート）があるとのこと

下記コマンドで対応するコントローラーとメソッドを自動生成してくれる
```
$ php artisan make:controller PhotoController --resource
```

ルーティング方法
```php:routes/web.php
Route::resource('blogs', BlogController::class);
```

### 部分的なリソースルート

①リソースルートで特定のルーティングのみ使いたい場合
　例）indexとshowのみ使いたい
```php:routes/web.php
Route::resource('blogs', BlogController::class)->only([
    'index', 'show']);
```

②リソースルートで特定のルーティングを除きたい場合
　例）destroyは使わない
```php:routes/web.php
Route::resource('blogs', BlogController::class)->except([
    'destroy']);
```

# まとめ
リソースルートを使用するとCRUD実装が一括でできるのでとても便利！

でも勉強のためにしばらくは通常ルートを書いていきます。
【PHP基礎0⃣】文字列を表示させる

［問題］　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksBasic.html)
実行するとHello Ruki!と表示するプログラムを作成しなさい。


# コード
```PHP
<?php 
echo 'Hello Ruki!';
?>

```

# 結果
```
Hello Ruki!

```

☆echo＝表示させる
【Salesforce】数式を参照する入力規則でハマったポイント

# 導入

常識かもしれませんが、入力規則の中でも数式項目を参照できます。

本記事では、上代 × 下代率を算出する数式項目と、その数式項目を変更不可に制御する入力規則が存在する状態で説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573865/4b4af33a-6586-5337-c467-2861df86ac73.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573865/3b5cafbd-6e5f-6cfe-76e3-f31532d334fe.png)

この状態だと、`UnitPrice__c * CostRate__c`の結果が変更される場合に入力規則によって保存が中断されます。
そのため`UnitPrice__c`・`CostRate__c`を個別で監視する必要がなく、下記の例では下代が￥500以外の値となる場合に中断されます。

- 例1：上代を￥1,000 → ￥2,000に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573865/976acfe6-d7a7-3e2c-e6f7-ba9d8f392202.png)

- 例2：下代率を50% → 100%に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573865/3cd4d2da-b0e9-4daa-b2b7-9d73bcf6bd0f.png)

# 本題

上代を￥333に設定した状態で、何も変更を加えずに保存を掛けると怒られます。
何も変更してないのに何故。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573865/09a1f7a3-26d1-c252-16ce-b863e876c21e.png)

結論としては、数式項目の「小数点の位置」が原因でした。
入力規則の実行時に￥167と￥166.5で比較検証されるため、`ISCHANGED(CostPriceFormula__c)`だと値が変更扱いになるようです。
数式項目はアクセスされる度に値が計算されると思っていたのですが、小数点の位置など補助的な設定は別ということですかね、、

# 対策

入力規則内で、四捨五入を行った値に対して検証を行えばOKです。
PRIOVALUE（変更前の値）と現在の値がそれぞれ四捨五入された後に比較されることで、小数点切り捨てによる値の不一致が解消されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573865/dd33c74c-2b63-24bb-c228-def6bed74f47.png)

結果としてはとても単純な解決方法ですが、この現象に直面した時は何が起こっているのか分からずかなり混乱しました、、
入力規則が想定外の動きをする場合に、今回挙げた例が参考になれば幸いです！
<flutter基礎>下書き

### hello world表示のみ
```dart
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text("hello world")
          ],
        ),
      ),
    );
  }
}
CloudFront Function でCookieを読み込み・書き込みする方法

AWSで使えるCDNのCloudFrontで、Edge側で処理を書くために使える機能がCloudFront Functionsです。
従来から使えるLambda＠Edgeに比べて低機能で制約が多いですが、無料利用枠があることやコストが安いので、できればこっちで書いたほうがお得です。

[CloudFront Functions の導入 – 任意の規模において低レイテンシーでコードをエッジで実行 \| Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/introducing-cloudfront-functions-run-your-code-at-the-edge-with-low-latency-at-any-scale/)

ということで、実際にCloudFront Functionsでどこまでやれるのかも知りたかったので、Cookieを読み書きすることぐらいならできるだろうと思って調べてみました。

## Cookieを読み込む

```javascript
function handler(event) {

    var response = event.response;
    var request = event.request;

    // event.request.cookies 配下に当リクエスト時に読み取れたCookie情報は含まれる。
    // event.request.cookies['キー名'].value で値が取得可能
    
    return response;
}
```


## Cookieを書き込む

```javascript
function handler(event) {

    // Cookie をセットする時に必要な有効期限文字列情報を生成(サンプルでは365日間を期限とするCookieにする)
    var e = new Date();
    e.setDate(e.getDate() + 365);

    var response = event.response;

    // event.response.cookies 配下にキー名のノードを作れば設定可能
    // サンプルとしてmanjiro.netで動かしたとした場合のDomain設定を記載。
    if(!('hoge' in event.response.cookies)){
        event.response.cookies['hoge'] = {
            'value': 'fuga',
            'attributes': 'Secure; Domain=.manjiro.net; Path=/; SameSite=none; Expires='+ e.toUTCString()
        };
    }

     return response;
}       

```

結構簡単にできちゃいますねこれ。
【基本情報技術者】信頼性設計

基本情報技術者試験の分野「信頼性設計」についてご紹介いたします。
システムの信頼性を向上させる手法には、次のようなものがあります。
## フォールトアボイダンス
構成要素の信頼性を高め、故障そのものを回避する設計。
**フォールト（故障)** を **アボイダンス（回避）** するという意味である。
なるべく障害や故障を発生させないようにする考え方です。

例：10万回押しても壊れないボタン
　　水に濡れても壊れないスマホ
　　雷による超高圧電力で壊れない電源

## フォールトトレランス
構成要素を冗長化して、故障が発生しても必要な機能は維持する設計。
**フォールト（故障)** を **トレランス（許容）** するという意味である。
「故障しても耐える」という考え方がフォールトトレランスです。

例：惑星探査機が4基のエンジンを搭載しているが、推進に必要なのが3基だけなので、1基が故障しても他のものを使うことができる。

## フェールセーフ
システムの一部が故障しても、危険が生じないような構造や仕組みを導入する設計。
製品やシステムに故障あるいはエラーが発生しても **安全(セーフ）** が維持できるように工夫することです。つまり、ミスやエラーが発生しても、安全側に向かうような工夫です。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/1bce3924-c05b-89ca-5a30-d812253c0e3a.png)

例：異常を検知した列車が自動的に緊急停止する。
　　信号機が異常検知して、全ての信号機が赤になる。
　　医療機器を誤った使用法で操作しようとした場合に自動的に機能を停止する。

## フェールソフト
故障が発生した場合、一部のサービスレベルを低下させても運転を継続させる設計。
故障した場合システムを部分的に停止させることで**縮退運転**を行う、 **継続重視**の考えである。

例：飛行機のエンジンで片方が故障しても、片方のエンジンで動かす。
　　ブログの運用で使っているサーバーが停止時、表示速度が落ちるが表示ができる。

## フールプルーフ
**人が誤った操作や取扱いができないような構造や仕組みをシステムに組み込む設計。**
「人がミスをしようとしてもできないようにする工夫」のことです。
**フールとは「愚者」** 、**プルーフは「耐える」** という意味があります。

例：洗濯機や電事レンジは扉の開いた状態では操作することができない。
　　手を挟まないように両手で押さないと作動しないようになっている工作機械。
　　同じ色の差込口に挿すようになっている三色の映像ケーブル端子。
目標設定の最強フレームワークSMARTとは？

## はじめに
「年も明けたし、新年の目標立てたい！」
「新年度になったから、目標立てよっか〜」
って言われても、どんな風にやったら良いかわからない！

そんなあなたのために、この記事では目標を立てる際に役立つフレームワークSMARTを解説します。

## 対象者
この記事は下記のような人を対象にしています。

- 駆け出しエンジニア
- プログラミング初学者
- 3日坊主になりがちな人
- 年初になんか目標立てた気がするけど、もう忘れた

## 結論

:::note
目標はSMARTに立てましょう。
- **Specific** 具体的である
- **Measurable** 測定可能な
- **Achievable** 達成可能な
- **Relevant** 関連性がある
- **Time-bound** 期限がある
:::

## 目標設定の最強フレームワークSMARTとは？
SMARTとは、目標設定をする時の定番のフレームワークです。
以下の5つの要素の頭文字をとってSMARTと略されています。

:::note
**SMART**とは
- **Specific** 具体的である
- **Measurable** 測定可能な
- **Achievable** 達成可能な
- **Relevant** 関連性がある
- **Time-bound** 期限がある
:::

要するに「誰がいつみても同じ判断ができる」ように客観的な目標を立てることが大事ですね、ってことです。

### 目標設定の最強フレームワークSMARTの「Specific 具体的である」とは？
目標は「具体的であること」がとても大事です。
ふんわりした目標だと、振り返りをする時に達成できた/できなかったの判断ができず、曖昧なまま終わることになります。
具体的な目標であれば、できた/できなかったの振り返りがはっきりするので、次の目標を立てるのも簡単ですね！

エンジニアであれば、下記のような目標を立てることがあると思います。

:::note alert
NG例
- 仕事を早く出来るようにする。
- 情報発信力をアップする。
- AWSに詳しくなる。
:::

うーん...ふんわりしててNGですね！
これらをSpecificな目標にすると、下記のようになります。

:::note
OK例
- Gitlabに修正をpushして、上司にレビューしてもらい、マージ完了する。
- Qiita記事をアップする。
- 「AWS認定ソリューションアーキテクト」に合格する。
:::

上記であれば具体的なので、できた/できなかったの判断が誰からみても出来る状態になってますよね。


### 目標設定の最強フレームワークSMARTの「Measurable 測定可能な」とは？

エンジニアであれば、下記のような目標を立てることがあると思います。

:::note alert
NG例
- AWSのプロになる。
- Qiita記事をがっつり書く。
:::

うーん...ふんわりしててNGですね！これでは客観的に振り返りができませんね。
これらをMeasurableな目標にすると、下記のようになります。

:::note
OK例
- AWS認定試験を720点で合格する。
- Qiita記事を月に5記事アップする。
:::

上記であれば具体的なので、できた/できなかったの判断が誰からみても出来る状態になってますよね。

### 目標設定の最強フレームワークSMARTの「Achievable 達成可能である」とは？

「目標は高く」と言われることもありますが、無理に高すぎる目標を掲げるのは意味がありません。
少し背伸びすればできるんじゃないか、というくらいのレベルの目標を設定することが大事です。

エンジニアであれば、下記のような目標を立てることがあると思います。

:::note alert
NG例
- 年収1兆円を目指す！
- 未経験から1ヶ月でフルスタックエンジニアでバリバリ働く！
:::

うーん...これはいくらなんでも無理そうなのでNGですね！
これらをAchievableな目標にすると、下記のようになります。

:::note
OK例
- 年収500万円を目指して転職活動する。
- 未経験から1ヶ月でポートフォリオを作成する。
:::

上記であれば「頑張ればできるんじゃないか？」というくらいになっていると思います。

### 目標設定の最強フレームワークSMARTの「Relevant 関連性がある」とは？

例えば、自分の今年の目標を立てているのであれば、「自分の人生で達成したいことに今年の目標がきちんとつながっているかどうか」を考えた方が良いでしょう。
また、会社から「個人目標を立ててくれ」と言われているのであれば、「自分の目標が会社やチームの目標に貢献できるか」を考慮する必要があります。

エンジニアであれば、下記のような目標を立てることがあると思います。

:::note alert
NG例
- 副業で月1万円稼ぐ(会社の個人目標としては会社の目標と関係ないのでNG)
:::

うーん...会社の目標と関連性がないのでNGですね！
これらをRelevantな目標にすると、下記のようになります。

:::note
OK例
- 副業で月1万円稼ぐ(個人の今年の目標としてはOK)
:::

「もっとバリバリ稼ぎたい！」という大きな目標があれば、個人の目標としてはOKな内容になってますね。

### 目標設定の最強フレームワークSMARTの「Time-bound 期限がある」とは？
最後は「期限がある」ことが大事です。
「いつかやりたい」ではいつまでもやらずに終わってしまうでしょう。
期限を決めることで、「この日までにやろう！」とか、期限を過ぎた時に「そろそろ振り返りしなきゃな」と言う意識になるのでとても大事です。

エンジニアであれば、下記のような目標を立てることがあると思います。

:::note alert
NG例
- なる早で
- 後ほど
:::

うーん...ふんわりしててNGですね！
これらをTime-boundな目標にすると、下記のようになります。

:::note
OK例
- 本日の19:00までに
- 今週中(5/13(金)18:00まで)
- 今年中(12/31(土)まで)
:::

上記であれば具体的なので、誰からみても同じ日時の期限が設定できてますね。

## おわりに
目標設定の最強フレームワークSMARTについてまとめました。

:::note
目標はSMARTに立てましょう。
- **Specific** 具体的である
- **Measurable** 測定可能な
- **Achievable** 達成可能な
- **Relevant** 関連性がある
- **Time-bound** 期限がある
:::


## 参考記事
[適切な目標設定のコツ5つ！役立つ法則や具体的な改善例も紹介](https://tech-camp.in/note/careerchange/39707/)
eguiを動かしてみようとしたらエラーでハマった件


## この記事を書こうと思ったきっかけ
RustのGUI周りの状況を調査しようとして[既存記事](https://zenn.dev/tris/articles/rust-egui-01 "eguiで作るRustのGUI（基本的な使い方と日本語表示）")で紹介されている手順通りに実行したがハマってしまったので。同じ事象にはまった人の参考になればうれしい。

## 動かしてみようとした
動いたものを見ないと何も言えないので手順に従い動かしてみることにする。
GitHubからcloneしてcargo run --releaseしたところで下記エラーに当たった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399160/8a4ef72e-ca4f-0985-7745-934d6d20a915.png)

まずは定石通り以下のエラー文でググることにする。
「Rust  failed to select a version for the requirement」

一番上に出てきた[この記事](https://qiita.com/bc_yuuuuuki/items/6f566ddef60a201af1bc "cargo installでfailed to select a version for the requirementが発生した場合の対処法")の通り依存関係の問題だと考えられるのでeframeのバージョンを以下のように変更
0.18.0　→　0.17.0

再びcargo run --releaseしてみる。動かない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399160/7e9f35e5-d0b8-5df0-8f62-b72c207ac343.png)

eguiのバージョンも以下のように変更。
0.17.0　→　0.18.0

再度cargo run --releaseしてみる。動かない。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399160/d65e89bc-512f-9122-f8c9-b7f3539edfca.png)

Rustcのバージョンを1.60以上にしろということなのでバージョン上げる方法をググる。
「Rustc バージョン　上げる」でググる。
この記事通りでrustup updateでversionupした。バージョンが上がったことをrustc --versionで確認した後。
再びcargo run --releaseしてみる。動かない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399160/3d1818c5-a991-248c-544d-9b1f6073f1bc.png)

今度はなかなか長いエラーを吐いているが、全部eframeクレートの中に見つかりませんというエラーみたいなので、もしかすると先ほどeframeとeguiのバージョンを下げたのがダメだったのではないかということでバージョンを戻してcargo run --releaseしたところ動きました。

結果として原因はRustのバージョンの方の問題だったということです。
Neothesiaでピアノロール動画を生成

# Neothesia とは
* MIDIファイルを入力することでピアノロールを生成してくれるアプリケーション。
* Synthesiaのオープンソース版。
* mp4(x264)形式でエンコードすることも可能だが、リリースされているバイナリでは不可。(v0.0.11時点)
* よって、コンパイルが必要。
# 環境
* Ubuntu 24.04(最小インストールしたての状態を想定)
* GPUクセラレーションが使える環境(UHD Graphics 620環境で確認)
# ビルド手順
```
sudo apt update
sudo apt upgrade
sudo apt install git
sudo apt install curl
sudo apt install ffmpeg
sudo apt install build-essential
sudo apt install pkg-config
sudo apt install libavcodec-dev
sudo apt install libavformat-dev
sudo apt install libswscale-dev
sudo apt install libclang-dev

wget https://static.rust-lang.org/rustup/rustup-init.sh
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh rustup-init.sh
. "$HOME/.cargo/env"
git clone https://github.com/PolyMeilex/Neothesia.git
cargo build --release -p neothesia-cli
```
# 実行方法
```
./target/release/neothesia-cli ./test.mid 
```
PyCaret で ValueError: Setting a random_state has no effect since shuffle is False. You should leave random_state to its default (None), or set shuffle=True が出た時の対処法

# PyCaret で ValueError: Setting a random_state has no effect since shuffle is False. You should leave random_state to its default (None), or set shuffle=True が出た時の対処法

## こんなコード
```python
# pycaret の初期化
from pycaret.regression import *

setup(data=df, target="price", session_id=123)
```

## こんなエラーが出た時
```
ValueError: Setting a random_state has no effect since shuffle is False. You should leave random_state to its default (None), or set shuffle=True
```

## fold_shuffleを指定します
```python
setup(data=df, target="price", fold_shuffle=True, session_id=123)
```
エラー文の通りに shuffle=True ってやると怒られる
【Java】Caused by: org.flywaydb.core.internal.license.FlywayEditionUpgradeRequiredExceptionの対処方法

# 参考

https://stackoverflow.com/questions/70438180/what-is-the-last-version-of-flyway-community-edition-that-supported-mysql-5-7

# 事象
MySQL(v5.7)に対して、Flyway(v8.5.10)でマイグレーション実行したら下記のエラーが発生。
```
Caused by: org.flywaydb.core.internal.license.FlywayEditionUpgradeRequiredException: 
Flyway Teams Edition or MySQL upgrade required: 
MySQL 5.7 is no longer supported by Flyway Community Edition, but still supported by Flyway Teams Edition.
```
Flywayの依存
```xml
<dependency>
   <groupId>org.flywaydb</groupId>
   <artifactId>flyway-core</artifactId>
   <version>8.5.10</version>
</dependency>
<dependency>
   <groupId>org.flywaydb</groupId>
   <artifactId>flyway-mysql</artifactId>
   <version>8.5.10</version>
</dependency>
```

# 原因
**【7.15.0】より新しいバージョンのFlyway Teams Editionは、【8.0】以上のMySQLしか受け入れないため。**

今回の状況だと

　Flyway【8.5.10】 ← このバージョンのFlywayが受け入れるMySQLのバージョンは最低でも8.0以上じゃないとダメ。
　MySQL【5.7】 

# 対処方法
２つ対処方法がある。

　Flyway【8.5.10】 ← こいつが7.15.0以下だったら問題ない。
　MySQL【5.7】 　← こいつが8.0以上だったら問題ない

**対処方法① Flywayのバージョンを【7.15.0】以下にする。**
**対処方法② MySQLのバージョンを【8.0】以上にする。**

どちらかのバージョンを変えればOK。私が出くわした環境だと、MySQLのバージョンは変えられない状況であったため、Flywayのバージョンを↓のように【7.15.0】に変更することで対処した。flyway-mysqlは、7.15.0より新しいFlywayで必要になる依存のようなので、取り除く。
```xml
<dependency>
   <groupId>org.flywaydb</groupId>
   <artifactId>flyway-core</artifactId>
   <version>7.15.0</version>
</dependency>
<!-- 不要なので削除する -->
<!-- <dependency>
   <groupId>org.flywaydb</groupId>
   <artifactId>flyway-mysql</artifactId>
   <version>8.5.10</version>
</dependency>
--!>
```

# 余談
## MySQLのバージョン
正直MySQLのバージョンなんて今まで1度も気にしてなかったよね(´・ω・)

✅メジャーバージョンは【5.6】【5.7】【8.0】 ※現時点(2022/05/11)

✅AWS RDSインスタンスでは、2022年2月時点で【5.6】は非推奨化されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/11290339-d0bb-879e-926f-4e30310970d1.png)

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_MySQL.html

https://dev.mysql.com/doc/refman/8.0/en/installing.html

## Flywayは2つのEdition(Teams Edition/Community Edition)がある。
### Flyway Community Edition（今回使っている方）
```xml
<dependency>
   <groupId>org.flywaydb</groupId>
   <artifactId>flyway-core</artifactId>
   <version>7.15.0</version>
</dependency>
```
https://mvnrepository.com/artifact/org.flywaydb

### Flyway Teams Edition（Enterprise）
```xml
<dependency>
   <groupId>org.flywaydb.enterprise</groupId>
   <artifactId>flyway-core</artifactId>
   <version>7.15.0</version>
</dependency>
```

https://mvnrepository.com/artifact/org.flywaydb.enterprise
yarn のサブコマンドを補完する方法


git や docker 等、サブコマンドを多用するコマンドには補完のための設定方法が公式で用意されています。

https://git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Bash

https://docs.docker.com/compose/completion/

しかし、 yarn は公式からサブコマンドを補完するための方法が提供されていないため、どうにかして yarn でもサブコマンドを補完する方法がないか探してみました。

## 方法1 dsifford/yarn-completion

補完する方法を探している際に、最初に発見した方法がこちらです。

https://github.com/dsifford/yarn-completion

READMEに記載されているインストールのコマンドを実行します。

```
mkdir -p "${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions/"
curl -o "${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions/yarn" https://raw.githubusercontent.com/dsifford/yarn-completion/master/yarn-completion.bash
```

`yarn ` まで入力してtabキーを入力すると、以下のように yarn のサブコマンド一覧が表示されました。

```bash
$ yarn
access               info                 remove
add                  init                 run
audit                install              tag
autoclean            licenses             team
bin                  link                 unlink
cache                list                 unplug
check                login                upgrade
config               logout               upgrade-interactive
create               node                 version
exec                 outdated             versions
generate-lock-entry  owner                why
global               pack                 workspace
help                 policies             workspaces
import               publish
```

```
$ yarn a
access     add        audit      autoclean
```

## 方法2: fish shell による補完

yarn のサブコマンドを補完するもう一つの方法は fish shell による補完です。

https://fishshell.com/

fish shell はわかりやすさを重視したユーザーにやさしい shell で、デフォルトで yarn の補完機能が備わっていました。

以下のように各コマンドと説明が表示されました。

```
> yarn
access                               (Not implemented)
add                                     (Add packages)
audit                    (Perform vulnerability audit)
autoclean  (Clean unnecessary files from dependencies)
bin               (Show location of Yarn `bin` folder)
cache                              (Manage Yarn cache)
check                   (Check dependencies integrity)
config                     (Manage Yarn configuration)
create                            (Create new project)
exec                                    (Run binaries)
generate-lock-entry          (Generate lockfile entry)
global                        (Manage global packages)
help               (Show available commands and flags)
rows 1 to 13 of 41
```

## おまけ

npm は公式からサブコマンドを補完するためのサブコマンドが用意されています。

https://docs.npmjs.com/cli/v8/commands/npm-completion

`npm completion` の出力を `~/.bashrc` 等に追加することで補完できるようになります。
バス、リアルタイム情報


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/f4b14a38-be34-83a9-57d9-97e3f1cb1843.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/411c26d5-53e3-951a-1006-1aac8e642aee.png)

https://ckan.odpt.org/dataset/b_bus_location-toei/resource/535e778c-2bd4-49bc-a89a-a7bf1e26aeac
git で branch を切り忘れた時のリカバリー方法のメモ

よくブランチを切り忘れてPRの際に困るのでリカバリー方法をメモっておく。

### 例えば、 develop ブランチで作業中

1. コードの修正がたくさん発生するも無事問題解決
1. hotfix ブランチ作成 （これを忘れる）
1. せっせと commit する
1. origin に push。と思ったら ２を忘れていた事に気がつく
    
    ### リカバリー開始
    
1. git の log チェック。 どこに戻すか確認しておく
1. HEAD で hotfix の branch 作成 して local の develop の余計な Commit を削除する (リカバリー完了)
1. hotfix を origin に push
1. PR作成
1. Mergeされる
1. local の develop で pull

### コマンドだと

```
$ git log --oneline develop
EEEEEEE hoge4 NG (HEAD -> develop)
DDDDDDD hoge3 NG
CCCCCCC hoge2 NG
BBBBBBB hoge1 (origin/develop)

$ git checkout -b hotfix-hoge234
$ git checkout develop
Your branch is ahead of 'origin/develop' by 3 commits.
$ git reset --hard HEAD~3
HEAD is now at BBBBBBB hoge1
$ git checkout hotfix-hoge
$ git push origin hotfix-hoge234
```

無事 GithubでPR作成。


## 参考
- [Git]誤ったブランチで実施した変更を正しいブランチに移動する
    - https://dev.classmethod.jp/articles/git-move-change-to-another-branch/
xcodegenの使い方（その一：入門）

# ダウンロード

> `brew xcodegen`

# 使用（コマンドを実行してプロジェクトファイルを作成）

> `xcodegen generate`

# project.ymlの定義

> `<>`で囲んだものは書き換えが必要、自分のプロジェクトに応じて書き換えてください

```
name: <project_name>
configFiles:
  Debug: configs/debug.xcconfig
  Release: configs/release.xcconfig

options:
  deploymentTarget:
    iOS: 14.1

packages:
  <package_name>:
    url: <the_url_of_git>
    version: <version>
  ...

```

# 空きのプロジェクトを作成する時：

> 実はnameのフィールドを入れることで作成出来てしまます

```
name: <project_name>
```

この一行だけのymlファイルを作成して`xcodegen generate`を実行すれば出来てしまいます！

以上、入門はできました。
【pychrome】高度にヒューマンライクなbotを作る


# SeleniumはBOTだとバレている

Seleniumやpupeteer始めとしたブラウザの自動操縦ライブラリはたくさんありますが、  
大手CDNを利用しているサイトやスクレイピング対策を頑張っているサイトだと簡単に  
アクセスが拒否されてしまいます。


## Google Chromeでは

chromeのDevTools上で

```Javascript
navigator.webdriver;
```

を実行してみてください。

`webdriver`で実行しているわけではないので`false` が返ってきます。

## Seleniumでは

今度はSeleniumで同じ値を見てみましょう。以下を実行すると

```Python
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.google.com/')
is_driver = driver.execute_script("return navigator.webdriver;")
print(is_driver)
driver.quit()
```

```
true
```
が出力されます。botだとバレています。

## pychromeを使う
先の例から、普段使っているGoogle Chromeを操作できれば良さそうなので、
[pychrome](https://github.com/fate0/pychrome)というPythonプログラミングからChromeを操作するライブラリを使います。


### Google Chromeを起動する
pychromeを使うにはdebugging-portを指定してChromeを起動しておく必要があります。

linuxの場合

```bash
google-chrome --headless --disable-gpu --remote-debugging-port=9222 --no-sandbox
```

macOSの場合
```bash
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --disable-gpu --remote-debugging-port=9222 --no-sandbox
```

 とする必要があります。

### 注意
headlessモードで起動した場合、UserAgentに

```
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/99.0.4844.51 Safari/537.36
```

`Headless`の文字が含まれています。厳し目のサイトではここの値をチェックされ得るので注意が必要です。
Chromeの起動時に安全なUserAgentを指定して上げましょう。

```bash
google-chrome --user-agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36" --headless　--disable-gpu --no-sandbox
```
`--blink-settings=imagesEnabled=false`オプションもおすすめです。
画像の読み込みがなくなるため、ページの読み込みがかなり速くなります。
スクリーンショットを取りたい場合以外は積極的に使いたいです。

## サンプルプログラム

適当なURLにアクセスしてHTMLの取得と、画面をPDFとして出力して見ます。
debugging-portを指定してChromeが起動されている必要があります。

```Python
import sys
import time
import base64
import pychrome

browser = pychrome.Browser(url="http://127.0.0.1:9222")
tab = browser.new_tab()
tab.start()
tab.Network.enable()

url = 'https://www.youtube.com/'
try:
    tab.Page.navigate(url=url, _timeout=7)
except pychrome.exceptions.TimeoutException as e:
    print(e)
    sys.exit()

# javascriptが以下のように実行できます
time.sleep(1)
res = tab.Runtime.evaluate(expression='document.querySelector("html").outerHTML;')
html = res['result']['value']

# pdf出力
pdf_content = tab.Page.printToPDF()
with open('sample.pdf', 'wb') as f:
    data = pdf_content['data']
    f.write(base64.b64decode(data))

```
ジェネレータ式に入門する【Python】

# やりたいこと
- ジェネレータ式について入門する。

# 復習
- イテレータ、イテラブルオブジェクト、ジェネレータ、ジェネレータ関数、ジェネレータイテレータについては[こちら](https://qiita.com/yyyyy__78/items/ba938c555f78a984c364)の記事にまとめました。手前味噌で恐縮ですが、よければ参照ください。

# ジェネレータ式とは
- ジェネレータ関数の定義について、リスト内包表記を使って簡単に記述したもの。

ジェネレータ式を使わずに、defでジェネレータ関数を定義し、ジェネレータイテレータを取得する場合、以下のようになります。
```py
def sample_generator_before():
    for x in range(3):
        yield x

g = sample_generator_before()
```

ジェネレータ式を使って、ジェネレータイテレータを取得する場合、以下のようになります。
```py
# ジェネレータイテレータ = ( 式 for 取り出す要素 in イテラブルオブジェクト ) 
g = (x for x in range(2))
```

ジェネレータ式を使うと、関数の定義が不要なのでシンプルに書けますね。
複雑な処理を行いその値を返す場合は、ジェネレータ式ではなくジェネレータ関数を使うと良いかもしれません。
ちなみに、どちらの方法で作成したジェネレータイテレータも、以下のように要素を取り出すことができます。
```py
print(g.__next__())  # 0
print(g.__next__())  # 1
print(g.__next__())  # 2
print(g.__next__())  # StopIteration
```
Amazonlinux xrdp



# コマンド

## mateのインストール
```
amazon-linux-extras install mate-desktop1.x
```

## xrdpのデスクトップ環境を「MATE」にする
```
bash -c 'echo PREFERRED=/usr/bin/mate-session > /etc/sysconfig/desktop'

amazon-linux-extras install epel

yum install xrdp
```

# 説明

MATE とは、GNOME のバージョン２の外観（ルック）や操作性（フィール）を引き継いだデスクトップ環境です。

## 画面イメージの描画

## VNC

Virtual Network Computing
RFBプロトコル
サーバは常にスクリーンをキャプチャし続けてそのデータをクライアントに送り，クライアントは届いたキャプチャデータを使ってリモート環境の画面を表示
書き換えが必要な領域のデータのみを送ったり，データを圧縮してやりとりする
VNCは画面の変化点だけを伝送するため、帯域の細いWAN経由でも早い描画を可能にしています。

## RDP
Windowsのリモートデスクトップ機能
複数ログインができます。
RDPはVNCより、パフォーマンスがよいです。
VNCとは違い、通信内容は暗号化される
Linuxサーバにxrdpが使われます。xrdpは、バックエンドで、VNC(tigervnc)を利用しています。
【脱VLOOKUP】XLOOKUPとFILTERの紹介

# はじめに
エンジニアといえども保守運用の現場ではプログラミングとは縁遠く、Excelベースので業務を実施することが多いのではないでしょうか。
僕の常駐している現場でも連携される手順書等でこれでもかというほどVLOOKUPが使われており、挙句の果てにVLOOKUPを使う為に手順が増えてしまっている始末です。
今回紹介する関数はVLOOKUPの完全上位互換といっても差し支えないので、業務でExcelを使う方は是非使いこなしてもらえればと思います。


# VLOOKUP

>VLOOKUP(検索値,検索範囲,列番号,検索方法)

念の為VLOOKUPについておさらいします。
検索値、検索範囲を指定し検索値を基準として何列目の値が欲しいのかを列番号で指定します。検索方法は基本False。
例：以下の表でD子のIDが欲しい場合
=VLOOKUP("D子",A:C,3,FALSE)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358152/499f2ec3-97e1-db9d-ddfd-f54cdb1f4026.png)


以上のように値を持ってこれるので膨大なデータから値を持ってきたいとき等に使えます。
しかし、検索値は検索範囲の再左になければならない制限があるのでこの表だとIDから名前を持ってきたりすることはできません。
それこそ元の表の列を入れ替える等のデータの加工が必要になります。

# XLOOKUP
>XLOOKUP(検索値,検索範囲,戻り範囲,見つからない場合,一致モード,検索モード)

検索値と検索範囲を指定し、欲しい値を範囲で指定します。それ以外の3つはここでは省略します。
例：以下の表でID1003の名前が欲しい場合
=XLOOKUP(1003,C:C,A:A)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358152/4f3a65f7-0f62-1fd3-fbe1-3c7fec19fee8.png)

以上のようにどの列からでも値を持ってこれます。
ちなみに以下のように戻り範囲を広げると複数の値を持ってこれます。
=XLOOKUP(1003,C:C,A:B)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358152/594fc95c-f601-61b3-d4ad-7a2f3cef3126.png)

# FILTER
>=FILTER(配列,含む,空の場合)

配列で欲しい値の範囲を指定し、含むで条件を指定する。空の場合はここでは省略します。
例：以下の表で役職が技術の名前がすべて欲しい場合
=FILTER(A:A,B:B="技術")


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358152/649f3993-3aa8-e635-13f6-df8084911ede.png)
以上のように条件に当てはまる名前をすべて持ってこれます。

縦ではなく横に出力したいときはTRANSPOSEを使いましょう
例：TRANSPOSE(FILTER(A:A,B:B="技術"))
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358152/0bc26b8e-ebcb-a0fd-0628-3aada5276183.png)

1セルに収めたいときはTEXTJOINを使いましょう
例：TEXTJOIN(",",TRUE,FILTER(A:A,B:B="技術"))
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358152/ba803bcc-0ea3-2ccc-7bdf-915f7c7e4e7e.png)


# 終わりに
いかがでしたでしょうか。かなり省略したので細かい使い方までは理解できないかもしれませんが、こんなものもあるんだと知っていただき、業務内で選択肢の一つとして思い出してもらえれば幸いです。特にFILTER関数知れば世界が変わるのでこの機会に調べてみてはいかがでしょうか。
独自SSL証明書発行手順

### 1. さくらサーバー（任意）に入って、コントロールパネルのドメイン/SSLより、更新のURLを選択、秘密鍵や中間証明書、SSL証明書を自分のPCに落とす。



### 2.　新しいCSRを作成するために先ほど落とした秘密鍵を使って新しい設定を作成する。（秘密鍵がある場合を選択）
（新しい設定を作成するのに数日かかる）
https://help.sakura.ad.jp/ssl/2340/?article_anchor=js-nav-4


### 3. CSRが獲得できたら、以下のURLの手順よりSSL証明書を更新する
https://help.sakura.ad.jp/ssl/2338/?article_anchor=js-nav-2
Node.jsの雛形の作り方

# Next.jsの雛形の作り方
Node.jsで基本的な操作である雛形の作成を忘れないように残しておく。


## Next.jsの雛形とは(完成品）
雛形とはこのようになっている
この雛形をいじっていくことによって、作りたい形に変化させていく。

<img src="https://i.gyazo.com/2d3bb8875367fd587e888c551b42766b.jpg "width="50%">

## 雛形のフォルダの作り方
* 事前準備として、**node.js**のインストールと**npx**と**yarn**のパッケージをインストールしておく必要がある。
* 雛形のフォルダを下のコマンドを入力して自動作成する。
```
$ npx create -next -app [フォルダ名]
```
   
 このようなフォルダが作成される。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
<img src="https://i.gyazo.com/acc1f6c1f2bee9b9a72dd6b90eacd528.png" width="40%">

* 作成後フォルダの中に入り、実行する
```
$ cd [フォルダ名]
$ npm run dev
```
* 実行後、ローカルで雛形の様子を確認できる。
    * Google検索など検索エンジンで、localhost:3000と検索すると立ち上がる。
<img src="https://i.gyazo.com/2d3bb8875367fd587e888c551b42766b.jpg "width="50%">

## まとめ
以上がNext.jsの雛形作成のフローである。
非常に簡単で、いじっていくのが楽しい。
Nrealアプリ開発のはじめにやるべきこと

<h2>対象となる読者</h2>
<ul>
 	<li>わりとちゃんとしたNrealアプリを作ろうという人
<ul>
 	<li>1ヶ月以上制作するなら、本記事の対応コストは回収できそう</li>
</ul>
</li>
 	<li>ある程度はUnityを使ったことがある人
<ul>
 	<li>スクリプトをプレハブに付けたり、非同期リソースロードしたり</li>
</ul>
</li>
</ul>
<h2>やるべきこと</h2>
<ol>
 	<li><a href="https://kondeneenen.com/nreal_devenv/" target="_blank" rel="noopener">Nrealアプリの開発環境構築</a></li>
 	<li><a href="https://kondeneenen.com/nreal_demo/" target="_blank" rel="noopener">Nrealアプリ開発前に NRSDK の Demo を実行</a></li>
 	<li><a href="https://kondeneenen.com/nreal_display_errorlog/" target="_blank" rel="noopener">Nrealアプリで追従UIやエラーログを表示する方法</a></li>
 	<li><a href="https://kondeneenen.com/unity_preprocessor_directive/" target="_blank" rel="noopener">Unity でプリプロセッサディレクティブ（条件付きコンパイル）を使う方法</a></li>
 	<li><a href="https://kondeneenen.com/unity_exclude_debug_resource/" target="_blank" rel="noopener">Unity でデバッグリソースを除外してビルドする</a></li>
 	<li><a href="https://kondeneenen.com/nreal_cpuprofiling/" target="_blank" rel="noopener">Nrealアプリの実機でのCPU処理計測（UnityアプリのスクリプトでのCPU処理計測）</a></li>
</ol>
手順1, 2 でNrealのことを知り、

手順3 で開発速度を上げ、
手順4, 5 でDevelop版とRelease版を区別し、
手順6 でCPU処理負荷増加に気付けるようにする。

手順4, 5, 6 はNrealに限らず、一般的なUnityアプリ開発でも使える。
<h2>トラブルシューティング</h2>
<ul>
 	<li><a href="https://kondeneenen.com/nreal_developmentbuild_error/" target="_blank" rel="noopener">Nrealアプリ作成時に Unity の DevelopmentBuild をONにすると起動できない</a></li>
 	<li><a href="https://kondeneenen.com/unity_android_shared_so/" target="_blank" rel="noopener">Unity で Androidビルド時の「More than one file was found with OS independent path 'lib/armeabi-v7a/libc++_shared.so'.」エラーの対処法</a></li>
</ul>

<h2>よいNrealライフを！</h2>

![Nreal.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2467542/bfca3ea1-0442-45a4-ad8b-d118618f419f.jpeg)
TypeScriptを環境構築をして試してみよう

## はじめに
筆者はWindows環境を使用していますので、
もしOSが違う場合は、コマンド部分など自身の環境によって、
適宜読み替えて頂けると良いかと思います。

## Node.jsをインストール

TypeScriptは、最終的にJavaScriptにコンパイル(トランスパイル)されます。
そのためTypeScriptコンパイラのためのNode.jsが必要になります。

[こちら](https://nodejs.org/ja/)からインストーラーをダウンロードします。
特に理由がなければ最新版で良いかと思います。

## TypeScriptコンパイラをインストール
ターミナルやコマンドプロンプトでコマンドを入力し実行します。

```
npm install -g typescript
```

これでtscコマンドが使用可能になったので、
バージョンを確認してみます。

```
tsc -v
Version 4.6.4
```

このように表示できればOKです。

## tsファイルの作成して画面表示する

拡張子.tsはTypeScriptで使われる拡張子です。
Hello, world!を表示させるために、まずはtestフォルダを作成しその内にHTMLファイルとtsファイルを用意します。

```HTML:test.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
</head>
<body>
  <h1 id="test1"></h1>
</body>
<script src="test.js" type="text/javascript"></script>
</html>
```

```TypeScript:test.ts
const message:string = "Hello, world!";
window.onload = () => {
    const test1 = document.getElementById("test1");
    test1.innerText = message;
}
```

```
test
├─ test.html
└─ test.ts
```

画面に文字を表示するだけの非常に簡単なコードです。


## tscコマンドでコンパイルする

tsファイルをjsファイルにコンパイルします。

```
tsc test.ts
```

コンパイルが成功すると、このようなjsファイルが生成されます。
中身もしっかり変わっています。

```JavaScript:test.js
var message = "Hello, world!";
window.onload = function () {
    var test1 = document.getElementById("test1");
    test1.innerText = message;
};
```

フォルダ構成は以下のようになります。

```
test
├─ test.html
├─ test.js
└─ test.ts
```

## 画面を表示する

あとは、
Chromeを起動して表示できるかを確認します。

```
start chrome C:\hoge\test\test.html
```
![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392337/57f959af-d8b6-09e0-6e1d-994dd8046988.png)

このように表示できれば成功です。
非常に簡単でしたね。

## 参考
https://typescript-jp.gitbook.io/deep-dive/getting-started

https://gihyo.jp/book/2022/978-4-297-12747-3
【AppleWatch開発】Apple Watchの実機ビルドが終わらない現象の解決方法

# 【AppleWatch開発】Apple Watchの実機ビルドが終わらない現象の解決方法

## 1. どんな記事か？

### はじめに
折角アプリができたのに、実機で動かそうと思ったら全然ビルドが通らない…何時間もビルドのために待っている…ホントうんざりしますよね…。
そんなときにこの記事を読んでもらえればビルドが通るようになると思います。ぜひ試してみてください。

### 解決したい問題

```
💡 XcodeのSimulatorでは問題なくアプリが動くが、Apple Watchのビルドができない現象の解決。
```

具体的には以下のような状況を想定しています。
- device unavailable for developmentの表示が出てビルドを開始できない。
- Making Apple Watch ready for developmentの表示が出てビルドが終了しない。
- preparing <watchの名前> for developmentが終了せず、ビルドが終了しない。
- ビルドを実行してもダイアログが出て、Timeoutしてしまう。

## 2. 解決方法

以下の方法を試してもらえれば、ビルドが通るようになると思います。試してみてください！

### 2-1. Apple WatchとiPhoneの再起動

これだけでビルドが通るようになる場合があります。簡単にできるので試してみてください。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565588/3a964e27-105e-b3b9-f7ae-ee695b99dee5.png)


### 2-2. Xcodeの再起動

上方のタブのXcode > Quit XcodeからXcodeを終了し、再度Xcodeを立ち上げてください。

![Untitled 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565588/681b061e-8e50-48a2-4c04-771face5afc3.png)


### 2-3. Apple WatchでiPhoneを鳴らす

Apple WatchのコントロールセンターからiPhoneを鳴らして、Xcodeを再び再起動してみてください。

<img width="300" alt="Untitled 2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565588/8fa15d75-f1c1-0db9-ac2e-0ed3dac75fca.png">


### 2-4. Apple WatchのWiFiを切る

Apple WatchのコントロールセンターからWiFiを切る or 機内モードにする。加えてiPhoneのBluetoothをOFFにする。後にすべてONに戻す。

![Untitled 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565588/a09215c8-5a61-b0d5-5725-3c51fe547522.png)


### 2-5. OSバージョンを最新にする

OSのバージョンをすべて最新にしてみてください。
<img width="500" alt="Untitled 4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565588/edf66dee-f728-6d64-9d47-143818051e8a.png">


### 2-6. ペアリングをし直す

少し時間がかかるのですが、iPhoneとApple Watchのペアリングを切って、後に再度ペアリングしてみてください。

具体的にはiPhoneのWatchアプリからすべてのWatch > 該当するApple Watchのinformationマーク(iマーク)をタップ → Apple Watchとのペアリングを解除、でペアリングを解除することができます。
<img width="300" alt="Untitled 5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565588/10f757d0-3e87-5895-14f0-6d786d5d35e3.png">

### 2-7. 機内モードにする

Apple Watchを機内モードにする。

### 私の場合は…

2-1, 2-2, 2-4の方法でビルドが通るようになりました。環境によって異なると思いますので、色々試してみてください。

## 参考記事

[iPhone is busy: Making Apple Watch... | Apple Developer Forums](https://developer.apple.com/forums/thread/691452)

[AppleWatchアプリを実機で試そうとするとdevice unavailable for development - Qiita](https://qiita.com/lejay-g/items/f9118fa511ca1b473832)
俺のLaravel

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/%E4%BF%BA%E3%81%AELaravel/)をご覧ください😀


LaravelのTipsを書き溜めていく。

# テクニック系

## 子でループせず孫の情報を直接取得したい

pluck メソッドと collapse メソッドを使用して、子のコレクションを取得し、それを一つのコレクションに結合することで、子の要素をループせずに孫の要素にアクセスすることができます。

### 孫の要素をユニーク化して取得

例）会社の社員の持ってる携帯種類を一覧化したいときとか

```php
$company->staffs->pluck('phones')->collapse()->unique('type');
```

### 更新日時が最も新しい孫を1つ取得
```php
$company->staffs->pluck('phones')->collapse()->sortByDesc('updated_at')->first();
```



## バリデーションrequiredだけどnullableにしたい

present という便利なルールがあるのでこれを使う。

present自体は空を許容するが、他ルールとセットで使う場合はnullableも指定すればOK！
```
present|nullable|string
```

## 実行されたSQLを確認したい

### 方法1. dddで出力

webの場合お手軽で便利。
引数必要なので適当に `ddd('a')` などでOK。

### 方法2. enableQueryLogを使う

確認したいSQLの前後に記述する

```php
\DB::enableQueryLog();
処理
dd(\DB::getQueryLog());
```

### 方法3. toSqlを使う（laravel9の場合）

eloquentの関数。ワンライナーで書けてよさそう
`dd($model->toSql(), $model->getBindings());`
参考: https://codelikes.com/confirm-laravel-sql/#toc1

## sortいろいろ

https://qiita.com/naoqoo2/items/ef53ae0cc926c287b9ed


## Resource内でSQL発行してないか確認する

N+1問題とか起きがち。

```php:Controller
return new HogeResource(['fuga' => $fuga]);
```

↓
```php:Controller
// return new HogeResource(['fuga' => $fuga]);
\DB::enableQueryLog();
new HogeResource(['fuga' => $fuga])->toArray($request);
print_r(\DB::getQueryLog());exit;
```

## スラッシュを含むURLパラメータを取得したい

`http〜/hoge/aa/bb/c.jpg?123`
のとき `aa/bb/c.jpg` の部分をパラメータとして取得したい。

```php:誤）これだと404エラーになる
Route::get('hoge/{file_path}', 'HogeController@index');
```

```php:正）whereで正規表現でスラッシュ含む形にしてあげればOK（?以降は含まれない）
Route::get('hoge/{file_path}', 'HogeController@index')->where('file_path', '(.*)');
```

## ポリモーフィックリレーションでリレーション先のモデルが存在しないものは取得対象外にしたい

https://qiita.com/naoqoo2/items/78568a78fe6a70600167

# 挙動注意系

## ExistsバリデーションでEloquent使う際の落とし穴

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56789/b4694e75-abcb-3aa5-aa01-54816624bce7.png)

eloquentを使うことでテーブル名を直接書かなくて済む
ただしexistsはeloquentのスコープ使えない
deleted_atも見ない
グローバルスコープも効かない
うーん。。

## テストコード assertModelExists

idだけの比較で各カラムの値まではチェックしてくれない。。
【PHP】クラス static public Protected Privateについてのまとめ

１・static function →インスタンスの生成が不要でクラスを定義するだけで呼び出せる     (スタティック)
２・public function →クラス外から呼び出す関数        (パブリック)
３・Protected function →継承にのみ呼び出す関数       (プロテクティド)
４・private function →クラス内のみから呼び出す関数    (プライベート)
# コード
```PHP
<?php
class Super {
    static function Static(){
        echo "static",PHP_EOL;
    }
    public function Public(){
        echo "public",PHP_EOL;
    }
    private function Private(){
        echo "Private",PHP_EOL;
    }
    function pri(){
        $this->Private();
    }
    protected function Protected(){
        echo "Protected",PHP_EOL;
    }
}
class Sub extends Super {
    function prot(){
        parent::Protected();
    }
}
echo Super::Static();
$super = new Sub;
$super->Public();  
$super->pri();  
$super->prot();  
```

# 結果

```
static
public
Private
Protected

```
rails プロゲート　整理メモ

困ったことを書いたものです。

# テーブルに新しいカラムを追加する
```
rails generate migration user image_name:string
```
userモデルにstring型のimage_nameカラムを追加する

```
add_column(テーブル名, カラム名, タイプ（データ型）, オプション引数)
```

テーブルを編集したときは　
```
 rails db:migrate
```
# ユーザー登録時に初期画像を設定
登録時のアクションに新しく追加しする
```
@user = User.new(
      name: params[:name],
      email: params[:email]
      image_name: "default_user.jpg"
      )
```
カラムに書いておく。
出典　https://qiita.com/you8/items/137c87945da3cac19953

## SyntaxError in UsersController#show
追加したカラムに```,```をつけ忘れた。

# 画像が表示されない
```html
<img src="<%= "default_user.jpg" %>">
```
最初は表示されなかった。
```html
<img src= "<%= "/user_images/default_user.jpg" %>">
```
user_imagesのファイルから取り出すようにした。
表示されたが合格できなかった。
これだと 全員のユーザーの画像がこれになってしまうので
```html
<img src= "<%= "/user_images/#{@user.image_name}" %>">
```
image_nameカラムから引っ張ってくることで一人一人の画像を表示することができる。

# rails の流れ（rails特有）
```html
<img src= "<%= "/user_images/#{@user.image_name}" %>">
```
このurlの要求をしたらrailsは最初```public```ファイルから```user_images```を探し出し特定のファイルを見つける。
しかし
publicの中になかった場合は```routes.rb```からリクエストのパターンと同じものを探しコントローラからアクションを作動させる。

# ユーザー画像を編集
## 画像を保存ボタンを押されたときにデータを送信する
```rb
form_tag(リンク先={}, オプション={}, HTML属性={} or イベント属性={}, ブロック引数)
```
```:multipart```マルチパートを指定をすることで画像を送ることができる。


https://railsdoc.com/page/form_tag

```html
<%= form_tag("/users/#{@user.id}/update", {multipart: true}) do %>
```

```html
 <input type="file" src="button.gif" alt="保存">
```
一応画像を選択することはできる。
送信するためにファイルを保存することができる。

### 画像データが存在する時にだけ画像が保存されるようにしてください。
何だろうこの意味？
```html
if params[:image_name] 
```
こうすることで中身が入っていいたら```True```になる。

NoMethodError in UsersController#update
undefined method `read' 
```rb
.
.
.
    if params[:image_name]
      @user.image_name = params[:image_name]
      image = @user.image_name
      File.binwrite("public/user_images/#{@user.image_name}", image.read)
    end
.
.
.
```
```
<input name="image" type="file">
```
nameをimageにするとparamsのパラメータの名前も変えなければならない
```
params[:image]
```
imageに直す
成功

# Fileクラス
```rb
File.write(ファイルの場所, ファイルの中身)
```
ファイルを読み込んでファイルを作成することができます
```
File.binwrite("public/user_images/#{@user.image_name}", image.read)
```
```public/user_images/#{@user.image_name}```の場所にファイル(imageの内容)を作成することができる。
### read
全ての文字列を読み込む
分散型データ検索プロトコル「The Graph」に挑戦してみる

# はじめに
初めての投稿がかなり特殊なものにはなってしまいますが、Web3やNFT領域のスタートアップでインターンをしているグヌさんです。ブロックチェーンやNFT等に関連するプロダクトの開発において、ブロックチェーンから様々な情報(トランザクション、NFTプロジェクトの関連性、勢いのあるプロジェクトなど)を取得する必要があるのですが、現時点ではブロックチェーンからデータを取得するには、スマートコントラクトやweb3のための特別なコードを書く必要があるため、それだけで大きな負担となります。そこで、ブロックチェーンの情報を検索するための新たな手法として、今回挑戦する「The Graph」が登場します。

:::note warn
注意
この記事ではコードを書かずに概要だけを説明する形になります。
:::

この記事から何度かに分けてThe GraphのDocumentationを攻略していくことを目的としています。

# 今回のテーマ 「The Graph」概要
#### 1. The Graphとは
[公式のドキュメント](https://thegraph.com/docs/ja/about/introduction/ "The Graph Doc")の内容をベースに、説明をしていきます。
The Grahpは既に書いたように分散型データ検索のプロトコルで、ブロックチェーンから直接データを取得することが難しいものをより簡単に実現することができるようにするためのものです。
NFTのようにスマートコントラクトを利用してデータを管理している一連のデータ群と情報をやりとりする場合、所有者のアドレスや、TokenIdのような情報などプログラムされたものについては、シンプルな手順を踏めば情報を取得することができます。しかし、BAYCのようなコレクティブルNFTの特徴量などでFilterをかけたり、より高度なクエリやデータ操作については、現在は簡単には実現することができません。
そこで、ブロックチェーンデータにIdexをつけ、情報操作をしやすくするThe Graphを用いてこれらの問題を解決しようということです。

#### 2. どのように機能するのか
The Graphは、Graph Nodeと呼ばれるオープンソースのノードを中心に、各人が構築するsubgraphが集まることで機能しています。Graph Nodeは、ブロックチェーン上に追加され続けるデータを収集する機能を備えており、それらのデータをsubgraphの定義に従ってクエリできるようにします。Graph Nodeのデータをクエリするには、標準のGraphQL APIを利用することができ、それを使って分散型アプリケーション(dApps)に役立てることができます。

また、The Graphのネットワークにはトークンエコノミーが採用されており、subgraphの設計、構築をはじめとしてThe Graphのエコシステムの持続、繁栄に貢献する人々への報酬としてGRT(グラフトークン)が支払われ、The Graph APIの利用者は、反対にGRTを消費してデータをクエリする必要がある。

#### 3. 実際に使ってみる
実際に、subgraphの構築や既に誰かが構築したsubgraphからGraphQLを利用してデータを取得してみる作業を次回以降説明していきます。

## 感想
概要を見る限り色々な用途で使える便利なサービスですが、subgraphを構築することやトークンのやりとりに際して一定以上の技術、知識が必要になりそうな予感がするので、その辺を調査していこうと思います。
C# プロパティ書き方 (=>を使って）

=>を使って1行で書ける。
```csharp
public string ItemUnitName => Item.UnitName;
```
参考
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/properties
https://ufcpp.net/study/csharp/oo_property.html#expression-bodied
https://ufcpp.net/study/csharp/st_function.html?sec=sec-expression-bodied#sec-expression-bodied
Macのpyenv環境でTkinterが使えない時の対処法

## 開発環境を一新したら、プロジェクトが動かなくなった件
以前、以下の記事を投稿しました。

https://qiita.com/lberc_yuki_ono/items/075e08ae32124e1e3aa7

投稿後、MacBookを買い替えたのですが、上記のじゃんけんゲームを動かそうとすると以下のエラーが出る様になりました。

```python
_tkinter.TclError: couldn't recognize data in image file "src/file/janken.png"
```

また、別プロジェクトで作成しようとしてもLabelなどが表示がされない症状も出ました。

原因がわからず、まず上記の頃の環境との違いをチェックしていました。

### 環境の違い　

| 項目 | 旧環境 | 新環境 |
|  :-:  |  :-:  |  :-:  |
| PC | MacBook Pro 2012 | MacBook Pro 2017 |
| OS | catalina | monterey |
| Python | 3.10 | 3.10(pyenv) |

賢い方やPythonを使い慣れている方には、わかるかもしれませんが新環境ではpyenvとpipenv環境で3.10を入れておりました。
そこで、`pyenv Tkinter 使えない`などで調べた所一発で対処法を見つけました。


## 対処法

以下の方法を取る事で想定された動きをする様になりました。

### pyenv環境化のpythonの削除

まずは、pyenvで入れたpythonを一度削除します。

```terminal
# 一旦システムのPythonに切り替え
$ pyenv global system
$ pyenv versions
* system
  3.X.X (set by /Users/myname/.pyenv/version)

# 3.X.Xになっていないことを確認したらアンインストール
$ pyenv uninstall 3.X.X
```

### tcl-tkのインストール

次にtcl-tkをbrewを使ってインストールします。

```terminal
brew install tcl-tk
```

すると以下の様なログが出ます。
```
(略)
==> tcl-tk
tcl-tk is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have tcl-tk first in your PATH run:
  echo 'export PATH="/usr/local/opt/tcl-tk/bin:$PATH"' >> /Users/<username>/.bash_profile

For compilers to find tcl-tk you may need to set:
  export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"
  export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"

For pkg-config to find tcl-tk you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"
```

### tcl-tkの設定

参考にした記事では`.bash_profile`に書く様になっていますが、私は`.zshrc`に記載しました。


```terminal
$ vim ~/.zshrc

# 以下の内容を追記

export PATH="/usr/local/opt/tcl-tk/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"
export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"
export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"
```

記入後に以下のコマンドを入力します。

```terminal
$ source ~/.zshrc
```

### pyenvを使用してpythonの再インストール

先程削除したpythonを再インストールします。

```terminal
$ PYTHON_CONFIGURE_OPTS="--with-tcltk-includes='-I/usr/local/opt/tcl-tk/include' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6'" pyenv install 3.X.X
```

*※こちらのオプションの説明や、オプションをつける理由については参考にした記事を読んでください。*

ここまで作業をした後プロジェクトを起動すると、きちんと最初に書いたエラーが出ないでGUIが起動する事が確認できます。

皆さんももし同じ状況になった場合は試してみてください。

## 参考

https://qiita.com/saki-engineering/items/92b7ec12ed07338929a3
Flutter：Lottieの表示が遅い、キャッシュしておきたい

#### 参考
https://github.com/xvrh/lottie-flutter/issues/175
## 発生した事象
・Lottieで表示したいアニメーションの表示が遅れる。
・今回Lottieを使ったところがローディング中に表示するWidgetのため何度もAssetsから読み込むことをやめたい。

## 使用しているライブラリ
riverpod（他の状態管理でも実装は変わらないと思います。）
Lottie

## 実装
キャッシュの実装
キャッシュが存在すればそれを使用する。ない場合には読み込んで表示する。
```dart: lottie_cache.dart
final lottieCache = LottieCache();

class LottieCache {
  final Map<String, LottieComposition> _compositions = {};

  Future<void> add(String assetName) async {
    _compositions[assetName] = await AssetLottie(assetName).load();
  }

  Widget load(String assetName) {
    final composition = _compositions[assetName];
    if (composition != null) {
      return Lottie(composition: composition);
    } else {
      add(assetName);
      return Lottie.asset(assetName);
    }
  }
}

```
あとは呼び出すだけ
```dart: loading.dart
// ローディングを表示するか状態管理
final loadingProvider = StateProvider.autoDispose<bool>((ref) => false);

class LoadingWidget extends ConsumerWidget {
  const LoadingWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    return Visibility(
      // 表示非表示の切り替え
      visible: ref.watch(loadingProvider),
      // ローディング中は画面を操作させたくないので透明のScaffoldを置いています
      child: Scaffold(
        backgroundColor: Colors.transparent,
        body: Center(
          child: SizedBox(
            height: 150,
            width: 150,
            child: lottieCache.load("hoge/fuga.json"),
          ),
        ),
      ),
    );
  }
}

```
【エポック秒】コンソールからSidekiqの情報を見るときに created_at, enqueued_at などが日時じゃなくて謎の数字


問題
-
実例をあげます。
試しにデッド状態のジョブをひとつ見てみましょう。

```ruby
# rails console

Sidekiq::DeadSet.new.to_a.first
=> #<Sidekiq::SortedEntry:0x00007fb9e8788d78
 @args=nil,
 @item=
  {"retry"=>3,
   "queue"=>"default",
   "class"=>"FooClass",
   "args"=>["8ecd1021-62d7-4068-8d7b-bb11033163f6"],
   "jid"=>"746d59154e31e75f09109f0b",
   "created_at"=>1649321038.4516313,
   "enqueued_at"=>1649321184.3722708,
   "error_message"=>"undefined method `-' for nil:NilClass",
   "error_class"=>"NoMethodError",
   "failed_at"=>1649321039.5810795,
   "retry_count"=>3,
   "retried_at"=>1649321184.4531639},
 @parent=#<Sidekiq::DeadSet:0x00007fb9e8712510 @_size=40, @name="dead">,
 @queue="default",
 @score=1649321184.45449,
 @value="(ここは省略します)">
```
`created_at`、`enqueued_at`、`failed_at`等が日時じゃなくて`Float`型になっていますね :thinking:
日時を見せてくれ！日時を！

解決策
-

さっそく解決策です。
`Time.at`で`Time`オブジェクトに変換すると日時を見ることができます。
```ruby
Time.at(Sidekiq::DeadSet.new.to_a.first["created_at"])
=> 2022-04-14 04:14:19 +0000
```
### よりよい方法

`Time.at`だと協定世界時（UTC）になります。
`Time.zone.at`で変換すると日本標準時（JST）になるので、多くのケースではこちらでよいかなと思います。
```ruby
Time.zone.at(Sidekiq::DeadSet.new.to_a.first["created_at"])      
=> Thu, 14 Apr 2022 13:14:19 JST +09:00
```


解説
-
では、この数字の正体はいったい何でしょうか？
調べたところどうやら、1970年1月1日午前0時からの経過秒数のようです。



>Time オブジェクトは時刻を起算時からの経過秒数で保持しています。起算時は協定世界時(UTC、もしくはその旧称から GMT とも表記されます) の 1970年1月1日午前0時です。

https://docs.ruby-lang.org/ja/latest/class/Time.html#S_AT

こういうのをエポック秒（UNIX秒）というそうです。

https://wa3.i-3-i.info/word18476.html

### 試してみた

```ruby
 # Timeオブジェクトは内部的には起算日からの経過秒数を保持しています。
Time.now.to_i
=> 1652253033

 # Time.atを使うと、起算日からの経過秒数をTimeオブジェクトに変換可能
Time.at(1652253033)
=> 2022-05-11 07:10:33 +0000

 # 0だとどうなるか見てみましょう
Time.at(0)
=> 1970-01-01 00:00:00 +0000
```



ちょっと便利なワンライナー
-

デッド状態のジョブを`failed_at`の昇順で並びかえた上で、`failed_at`の一覧を表示します
```ruby
Sidekiq::DeadSet.new.to_a.sort_by{|job| job["failed_at"] }.map{|job| Time.zone.at(job["failed_at"])}
=> [Thu, 07 Apr 2022 17:42:13 JST +09:00,
 Thu, 07 Apr 2022 17:42:16 JST +09:00,
 Thu, 07 Apr 2022 17:43:12 JST +09:00,
 Thu, 07 Apr 2022 17:43:59 JST +09:00,
 Thu, 07 Apr 2022 17:43:59 JST +09:00 ]

```

`failed_at`を`enqueued_at`など任意なものに変える