OmniAICreator/Qiita-1.07M huggingface dataset:
いいコード悪いコードまとめ６章　条件分岐

# 条件文のネストを早期リターンで避ける

# 条件分岐を一箇所にまとめているか

例えば、以下のようにクラスが複数あって、その中で条件に応じて表示を切り替えているコードがある場合、
これでは、抜け漏れがかなり起きやすいようになっています。

なぜなら、条件分岐が重複して色々なところに書かれているからです。
```
# 車のクラス
class Car
  def initialize(type)
    @type = type
  end

  def drive
    case @type
    when 'sedan'
      puts '乗用車を運転しています。'
    when 'truck'
      puts 'トラックを運転しています。'
    when 'suv'
      puts 'SUVを運転しています。'
    else
      puts '不明な車種です。'
    end
  end
end

# 自転車のクラス
class Bicycle
  def initialize(type)
    @type = type
  end

  def ride
    case @type
    when 'road'
      puts 'ロードバイクを乗っています。'
    when 'mountain'
      puts 'マウンテンバイクを乗っています。'
    else
      puts '不明な自転車種です。'
    end
  end
end

car = Car.new('sedan')
car.drive

bicycle = Bicycle.new('road')
bicycle.ride
```

このような場合は一箇所に条件分岐をまとめると良いです。
そうすることで修正や追加の抜け漏れが起こりにくくなるからです。
```
# 車両のクラス
class Vehicle
  def initialize(type)
    @type = type
  end

  def drive_or_ride
    case @type
    when 'sedan', 'truck', 'suv'
      puts "#{@type}を運転しています。"
    when 'road', 'mountain'
      puts "#{@type}バイクを乗っています。"
    else
      puts '不明な車両です。'
    end
  end
end

vehicle1 = Vehicle.new('sedan')
vehicle1.drive_or_ride

vehicle2 = Vehicle.new('mountain')
vehicle2.drive_or_ride
```

# フラグ引数やinteger引数を使っていないか
# パッとみて、何をするメソッドが想像がつくか
以下のようにメソッドの機能を切り替えるboolean型引数をフラグ引数と呼び、弊害が生じる。
```
damage(true, damageAmount)
```

また、以下のようにint型引数で機能を切り替えるのも弊害が生じる
```
damege(1, damageAmount)
```

例えば以下のようにフラグ引数で書いた場合、メソッドの内部ロジックを見にいく必要があり、開発の生産性が低下します。
パッとみて何をしているのかわからない！となります。
```
process_order(order, true)
```
例えば、実際の中身は以下のようになっています。
```
def process_order(order, flag)
  if true
    puts "特急配送で注文を処理します: #{order}"
    # ここに特急配送の処理を記述する
  else
    puts "通常配送で注文を処理します: #{order}"
    # ここに通常配送の処理を記述する
  end
end

order1 = '注文1'
process_order(order1, true)  # 特急配送で注文1を処理

order2 = '注文2'
process_order(order2, false)  # 通常配送で注文2を処理
```

これだと非常に分かりづらいので、メソッドを分離しましょう。

# メソッドが単機能で分離されているか
先ほどのフラグ引数のメソッドを分離したらこんな感じです。
パッとみて、何をするか想像できますよね。（蓋を開けたら訳のわからない中身が書かれているかもしれない...ということは置いておいて。たまにありますよね...）
```
process_express_order(order)
```
```
def process_order(order)
  puts "通常配送で注文を処理します: #{order}"
  # ここに通常配送の処理を記述する
end

def process_express_order(order)
  puts "特急配送で注文を処理します: #{order}"
  # ここに特急配送の処理を記述する
end
```
時代を彩るERCトークン：ERC-20、721、1155の詳細な変遷



本日はERCトークンについて、一緒に深掘りしてみましょう。それぞれの時代とともに変わるその特性と機能について、詳しく解説していきます。

## ERC-20: 代替可能トークンの出発点

まず初めに、ERC-20についてです。ERC-20は、2015年に提案された代替可能トークン（fungible tokens）の規格で、クリプト通貨やユーティリティトークンなどに使用されています。どういうことかというと、ERC-20トークンは互換性があり、一つ一つのトークンが全く同じ価値を持つという特性があります。たとえば、我々が知っているビットコインやイーサリウムがまさにこれですね。同じ価値を持つERC-20トークンは交換可能なため、取引所で取引するのに適しています。
主な関数は次の通りです：

1. `totalSupply()`: これは発行されたトークンの合計供給量を返す関数です。
2. `balanceOf(address _owner)`: これは特定のアドレスが所有するトークンの量を返す関数です。
3. `transfer(address _to, uint256 _value)`: これはトークンの送信を行う関数です。
4. `approve(address _spender, uint256 _value)`: これは他のアドレスに、自分のトークンを特定の量まで使うことを許可する関数です。
5. `allowance(address _owner, address _spender)`: これはあるアドレスが別のアドレスから使うことを許可されているトークンの量を返す関数です。



しかし、このERC-20トークンには一つ欠点があります。それは全てのトークンが同じ価値を持つという特性上、個々のトークンに独自の特性を持たせることができない点です。

 Alice :「俺日本円札持ってんだよね〜」
 Bob : 「俺もだけど。ちなみにその札にはなんていう数字が書いてある？」
 Alice :「1000...」
 Bob :「じゃあ俺と一緒だね。俺も1000って書いてあるよ」
 Alice : 「俺のはあの有名な俳優からもらったんだ！俺のは唯一無二なんだ！」
 Bob : 「そんなの知らんがな（でも、どうにかしてその付加価値を載せれないかな...」

--->　NFT誕生

## ERC-721: ユニークな存在、NFTの興隆

2017年になると、私たちはERC-721に出会います。ERC-721は非代替可能トークン（NFT）を規定する規格で、個々のトークンがユニークな属性を持つことが特徴です。これにより、デジタルアートやコレクティブアイテムなど、独自性が重視される領域で活用されるようになりました。

`CryptoKitties`は、ERC-721の代表的な例です。各キティは一意の属性を持ち、それらはメタデータとして保存されます。これにより、それぞれのキティがユニークな存在となり、値段が異なるのです。ERC-721の主な関数は次の通りです：

1. `balanceOf(address _owner)`: これは特定のアドレスが所有するNFTの数を返します。
2. `ownerOf(uint256 _tokenId)`: これは特定のトークンIDの所有者を返します。
3. `safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data)`: これは特定のトークンIDのNFTを安全に転送します。
4. `approve(address _approved, uint256 _tokenId)`: これは他のアドレスに特定のNFTを操作する権限を与えます。
5. `getApproved(uint256 _tokenId)`: これは特定のNFTに対する承認済みアドレスを返します。

しかしながら、ERC-721にも問題がありました。それは、複数のNFTを一度に移転したい場合、一つ一つのNFTに対して移転関数を呼び出さなければならないという点です。これは、例えばゲーム内で多くのユニークなアイテムを持っているプレイヤーがこれらのアイテムを一度に売買したいと思った場合、非常に手間がかかるという問題を示しています。

それを解決するために登場したのが、ERC-1155です。ERC-1155は2018年に提案され、代替可能トークン（FTs）と非代替可能トークン（NFTs）の両方を扱えるように設計されています。つまり、ERC-1155は一つの規格でERC-20とERC-721の両方の特性を持つことができるんです！また、ERC-1155は一度のトランザクションで複数のNFTまたはFTを送信することが可能です。これはトランザクションの効率性を大幅に向上させる重要な改良点です。

## ERC-1155: 効率性と柔軟性の向上

この問題を解決するために誕生したのが、ERC-1155です。ERC-1155は、一度のトランザクションで複数のトークンを送信できるように設計されました。さらに、この規格は代替可能トークン（FT）と非代替可能トークン（NFT）の両方を扱うことができます。

ERC-1155の主な関数は次の通りです：

1. `balanceOf(address _owner, uint256 _id)`: これは特定のアドレスが所有する特定のIDのトークンの数を返します。
2. `safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes _data)`: これは一つのトークンを安全に転送する関数です。
3. `safeBatchTransferFrom(address _from, address _to, uint256[] _ids, uint256[] _values, bytes _data)`: これは複数のトークンを一度に安全に転送する関数です。

ERCトークンの成長と変遷は、ブロックチェーン技術の進化と、それに対する社会のニーズの変化を反映していて面白いですね。
npm install && npm run dev ファイルが自動生成されない

# はじめに
Laravelの環境構築が終わり、まずLaravel UIを導入しようとinstallから進めているとエラーが発生し、自動生成されるはずのCSS、JSファイルが生成されないという沼にハマってしまいました。
いろいろ調べた結果、解決することができたため解決方法を共有したいと思います。
僕自身が二度と同じエラーで詰まらないように備忘録として、且つ同じnpmコマンドのエラーで詰まっている方が少しでも解決に繋がれば嬉しいです。

# エラー内容
・実行したコマンド
```
npm install && npm run dev
```
・返ってきたエラー![スクリーンショット 2023-07-19 16.29.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328602/ab453978-daf3-b4ed-2902-066a443638ce.png)
初心者なりにログを読んでみた結果どうやらnodeのバージョンと、Viteのバージョンに互換性がないことが原因でした。
# 原因
__nodeのバージョンが古い__
__Laravelのバージョンに対して実行したコマンドが違う__
この2点が主な原因でした。
# 解決方法
__nodeの最新バージョンをinstall__
__npm run devではなく npm run buildを実行__

### nodeのバージョンをアップデートし再度試してみる
・nodeの最新の安定版のバージョンをinstallしたら
```node -v```
バージョンを確認しアップデートされていることを確認してもう一度
```
npm install && npm run dev
```
実行すると、
![スクリーンショット 2023-07-19 16.48.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328602/fda8f207-1df3-b4c4-e856-13cfb7a2bfcd.png)
このように最初に出ていたnodeとviteのバージョンによる互換性がない等のエラーは解消されました！
しかしCSSとJSのファイルは生成されていません。
# CSS、JSファイルが生成されない原因
エラーは解消したのになぜファイルが自動生成されないんだと色々と原因を探り調べていると、、、
__コマンドを間違えている__
こちらが冒頭で書いた原因のひとつでした。
当たり前ですがコマンドが間違えていれば期待した出力はされません。
Laravel 9.1.8以降でViteという新しい機能が追加されたことが影響を及ぼしているようです。
なのでLaravel 9.1.8以降では別のコマンドを実行する必要があります。
# 実行するコマンド
「npm run dev」の代わりに以下のコマンドを実行します。
```
npm run build
```
「dev」が「build」になるだけです。
これを見つけるのに何時間もかかってしまいました。。。
コマンド実行後、![スクリーンショット 2023-07-19 17.13.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328602/c81ac906-1480-a40e-292b-c6601999b052.png)
このように無事CSS、JSファイルが生成されました。
ブラウザで確認してみると、
![スクリーンショット 2023-07-19 17.18.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328602/70192f7f-ea25-3a72-5faa-42a7226a48d6.png)
このように認証機能周りの雛形を導入することができました！
# まとめ
今回のエラーはバージョンが主な原因でした。
初歩的なところで何時間も詰まってしまいましたが、なんとか解決することができました！
やはりエラーを解消できたときの爽快感はたまらないです。
まだまだ勉強不足ですが、これからも自分の気づきや解決方法など記事を投稿していきたいと思います。
基本情報技術者試験合格体験記

# はじめに

初めまして。takunと申します。
これはJavaSilverを取得して、調子に乗って基本情報も１ヶ月くらいで取っちゃおうと思った男の日記です。

私は4月から某SES企業にIT未経験での転職をした初心者エンジニアです。間違ったことや不適切な内容となってしまう可能性もあることをご承知ください。また、助言など頂けると嬉しいです。
また、効率良い勉強法や絶対合格といったメソッドを記すものではないのでご注意ください。



# 目次

①資格取得に挑戦した理由
② 基本情報技術者試験までの流れと参考教材
③ 最後に


# ①資格取得に挑戦した理由

- 前回同様で案件参画に向けたアピールポイントとなる。
- ITにおいて全般的な知識を体系的に学び、今後何を勉強していくかという指針を持つため。
- 現場でコミュニケーションを円滑にするため。
# ②基本情報技術者試験までの流れと参考教材

## まず、２週間でキタミ式参考書を読破する。
<font color='blue'>できるのであれば１週間で読み終えていただいてもいいんじゃないかと思います。</font>
かなり内容も濃いし量も膨大なので、本を読むのが遅い私にとっては結構この時間が辛かったように思います。
ただ、いきなり過去問を解き始めてメンタル削るくらいなら、ある程度内容を把握してから過去問に入るのが良いのではないかと思います。



### 【活用サービスと教材の紹介】
#### 1.過去問道場　オススメ度☆×100

https://www.fe-siken.com

> <font color='red'>なんならこれが全てとまで言えます。</font>
ここをしっかりやればまず受かるのではないかと思います。
科目Aだけかと思いきや、科目Bのサンプル問題もあります。



#### 2.やるかやられるかチャンネル オススメ度☆☆☆

https://www.youtube.com/watch?v=bSQr0aEzVk4&t=66s

> <font color='red'>正直、めっちゃ参考にしました</font>
しかもこのチャンネルを見てるとモチベーションも上がるしオススメです。


#### 3.キタミ式 イラストIT塾　オススメ度☆☆☆

https://www.amazon.co.jp/キタミ式イラストIT塾-基本情報技術者-令和05年-きたみ-りゅうじ/dp/4297131862/ref=sr_1_2_sspa?__mk_ja_JP=カタカナ&crid=GKLC2DYL2P3T&keywords=キタミ式&qid=1689750930&sprefix=北見市%2Caps%2C209&sr=8-2-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&psc=1



> めっちゃとっつきやすいです。表紙のキャラクターたちの掛け合いは面白く、初心者の疑問に寄り添った内容だなと感じます。練習問題も多くはないですが、章末についています。


#### 4.情報処理教科書 出るとこだけ！　オススメ度☆☆

https://www.amazon.co.jp/情報処理教科書-出るとこだけ！基本情報技術者［科目B］第3版-橋本-祐史/dp/4798177679/ref=sr_1_14_sspa?__mk_ja_JP=カタカナ&crid=HYES32GKNCT6&keywords=基本情報技術者&qid=1689751527&sprefix=基本情報技術者%2Caps%2C205&sr=8-14-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9tdGY&psc=1


> 初学者が疑似言語、セキュリティの読解を解く練習にはなります。
もうすでに２年３年エンジニアをやってる方にとっては必要ないかもしれません。
私もJavaSilver取得、コードを書く習慣がついていたので、得られるものは少なかったように感じます。



### 【過去問を解きまくる】
キタミ式を一通り読んだら、過去問と出るとこだけ！を解き続けました。
わからなかったところは１つ１つノートにまとめました(地道が大事)
JavaSilverと違って過去問が多いためバンバン解いていき、合計で直近6回分をこなしました。
最初は5回までで絞っていたのですが、不安になり6回目も解きました。すると本番でも類似した問題があったので、科目Aは質より量だなと実感しました。
科目Bもそうなんですが問題を解く際は時間配分がわからなくなるので、実践を想定してタイマーをかけて練習するのをオススメします。


## 試験結果
結果は80％、無事合格でした。

# ③最後に
ここまで見ていただきありがとうございます。
最初合格率を見たら40%以下と心配になる方もいるかもしれませんが、しっかり過去問を解いて科目A,Bを十全に臨んでいただけたら大丈夫だと思います。
ご質問や意見などあれば是非コメントお願いします。
EKS Managed Node Group を EventBridge で毎日「起動/削除」する

# はじめに
EKS の検証で数台の Node を起動しているが、業務時間外は使わないので停止をしたい。毎回手動で起動/削除するのが面倒なので、なんとか自動化できないか調査したところ、EventBridgeで実現できそうなので検証した。

# 概要
アーキテクチャは以下の通り
- 起動、停止用の EventBridge を作成する
- トリガーは cron とし、決められた日時に EKS API を実行する
- EKS API の UpdateNodegroupConfig で、EKS Managed Node Group の Desired Capacity （希望する台数）をアップデートする

# 作成手順
作成手順は下記の通り
- EventBridge 用の IAM Role　を作成する
- EC2起動用の EventBridge Scheduler を作成する
- EC2削除用の EventBridge Scheduler を作成する


## EventBridge 用の IAM Role　を作成する

**信頼ポリシー**
```JSON
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

**インラインポリシー**
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "eks:UpdateNodegroupConfig",
            "Resource": "*"
        }
    ]
}
```
※ ここではインラインポリシーを使用しているが、IAM ポリシーでも可能
※ Resource 句は Node Group を指定するとより厳格になる

## 起動用の EventBridge Scheduler を作成する
主要な設定のみ記載

**スケジュール(cron）**
月曜日から金曜日の 9:00 に EC2 を起動させる場合
```
0 9 ? * 2-6 *
```

**ターゲット**
Amazon EKS の 「UpdateNodegroupConfig」 を選択
最小0台、最大4台、希望する台数4台の場合、入力値は下記の通り
なお「クラスタ名」と「ノードグループ名」は自身の環境に合わせて設定する

```JSON
{
  "ClusterName": "クラスタ名",
  "NodegroupName": "ノードグループ名",
  "ScalingConfig": {
    "MinSize": 0,
    "MaxSize": 4,
    "DesiredSize": 4
  }
}
```
参考：[UpdateNodegroupConfig](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateNodegroupConfig.html)

**アクセス許可**
事前に作成した EventBridge 用の IAM Role を指定する

**その他のパラメータ**
任意の値を指定する

## 削除用の EventBridge Scheduler を作成する
主要な設定のみ記載

**スケジュール(cron）**
月曜日から金曜日の 19:00 に EC2 を削除させる場合
```
0 19 ? * 2-6 *
```

**ターゲット**
Amazon EKS の 「UpdateNodegroupConfig」 を選択
最小0台、最大4台、希望する台数0台の場合、入力値は下記の通り
なお「クラスタ名」と「ノードグループ名」は自身の環境に合わせて設定する

```JSON
{
  "ClusterName": "クラスタ名",
  "NodegroupName": "ノードグループ名",
  "ScalingConfig": {
    "MinSize": 0,
    "MaxSize": 4,
    "DesiredSize": 0
  }
}
```
参考：[UpdateNodegroupConfig](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateNodegroupConfig.html)

**アクセス許可**
事前に作成した EventBridge 用の IAM Role を指定する

**その他のパラメータ**
任意の値を指定する

## 動作確認
ノードグループのページにある「更新履歴」から Config のアップデート履歴、内容が確認できる

下記の例では１時間おきに起動/削除を繰り返している
![スクリーンショット 2023-07-19 16.51.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659784/4bb8d096-bd68-712f-9a0f-9fa33efa53c4.png)

## 苦労した点
EventBridge のターゲットで指定する入力値の JSON のサンプルがなく、フォーマットが分からなかった。一旦 boto3 の例とデフォルトの例を元にアッパーキャメルで書いたところうまく行った。（その他のケースは未検証）

# CloudFormation Template
あとで書く
```JSON
```
microCMSのAPIでたまにビルド落ちる問題の光

## 超要約
- microCMSのAPIはまれにエラーレスポンスを返すことがある
- その場合再ビルドが必要
- リトライオプションを有効にすると、再ビルドしなくても自動的に解決してくれるかもしれない

## きっかけ
私が担当しているプロジェクトではmicroCMSで記事系のコンテンツを作成しています。

▼ざっくりな構成とか情報
- フレームワーク: Next.js
- フロントエンドのホスティング： Amplify
- microCMSのデータを使うページの一部はSSGにしている

ある日、本番環境のデプロイでビルドエラーになりました。

ステージング環境では問題なかったけど何か問題があったんだろうか？

とりあえずログを見てみよう。

```
[WARNING]: Error: fetch API response status: 500
```

このような表示が。

場所を見てみると、`microcms-js-sdk`のモジュールっぽいところで起きていることが分かりました。

なんかサーバーのエラーっぽいけどとりあえずAmplify再デプロイしよう。

🎉今度はデプロイ無事に成功🎉

とりあえず解決してよかったけど、なんだったんだろう..？

そういえば前にも謎のビルドエラー出て再デプロイしたら何事もなかったように復活したなぁ。ちょっと調べてみよう。

とググったところ、こちらの本家の記事を見つけました。

https://blog.microcms.io/js-sdk-retry-option/

あ、たぶん今回のエラーめっちゃこれじゃん！

しかもこの対処法が最近追加されてる！！

ってことで勢いでQiita書いてます。

## ビルド落ちる問題の背景
microCMSのAPIはリクエストが集中した際に500系のエラーレスポンスが返ることがあるようです。
（リクエスト集中したら落ちたりするのはmicroCMSに限った話ではないと思いますが）

>microCMSのAPIはサーバレスアーキテクチャを採用し、大量のリクエストにも対応できる構成となっていますが、短時間に極度にリクエストが集中した際に、まれに500番台のエラーレスポンスが返却されることがあります。

ログのエラーメッセージとも合致するので、おそらく今回私が遭遇したのはこいつです。

>その他にもmicroCMSの仕様として、GET APIの呼び出し回数が1秒あたり60回を超えた場合、429 Too Many Requestsのステータスコードが返却されるようになっています(制限事項)。SSGのようなアーキテクチャを採用し並行してビルドを行う際に、意図せずこちらの制約に抵触してしまう場合がありました。

また、短い間にめちゃくちゃ頻繁にAPIが呼び出されるような場合には429のステータスコードが返るようになっているようで、意図せずこのケースにハマってしまうこともあるようです。

これらのエラーが発生すると、多くは再ビルドする必要があります。

## リトライオプションの有効化
createClientをしているファイルに`retry: true`を追加するだけ！

これでAPIのエラーが返却された際に、自動的にリトライを行なってくれるようです。

```.ts
const client = createClient({
  serviceDomain: "YOUR_DOMAIN", 
  apiKey: "YOUR_API_KEY",
  retry: true  // この1行を追加するだけ！
});
```

注意点として、404が返ってくるようなリトライをしても解決されない可能性が高い場合には、リトライは行われないとのこと。

APIの500エラーを試せないので検証はしてないですが、今後同じようなエラーが出た際に再ビルドすることが減りますように！！

という願いを込めて1行追加しました。

:::note info
補足
`microcms-js-sdk`のver2.4.0で追加されたようなので、それ以下のバージョンを使っている場合はバージョンアップが必要です。
:::

## おわりに
「エラーが出ても再ビルドすればいいだけじゃん」といえばそうなのですが、

**ビルド失敗**

ってのを見ると一瞬ヒヤッとしません？

水面下でしれっとリトライして解消していてくれるのならそれが精神衛生的にもいいはずです！

ありがとうmicroCMSさん！
ブログいつも分かりやすいです！！
内部結合試験書（テスト仕様書）目的って？

現在エンジニア2カ月目。
未経験ながら毎日現場で多くのことを学んでいます。
まだまだ、用語に慣れないので調べまくる毎日を送っています。

フォローを貰いながらも作業の難易度が少しずつ上がってきています。

最近は内部結合試験書（テスト仕様書）を手掛けることが多くなってきました。

まず初めに内部結合試験書（テスト仕様書）って何？と最初は思うとおもいます。
最初はすごくドキドキしてましたが、上司からは慣れでもあるんだよね。って言われて（そうだよね～）って内心思っちゃいました。




内部結合試験書（テスト仕様書）は何のためなのか？
プログラムを動かしてテスト確認をすればいいというわけではありません。


目的
・誰がやっても迷わずに同じように動かすことができる
・誰がやっても同じ結果が得られる
・どのような動きがあれば結果に対してバグがあるのかOKなのか誰でも同じ基準で判断できる


第三者が客観的に見たときに！を考えながら書いてあげると優しさかなってなります。




内容は現場によって様々で書式もあると思います。
私のところは決まった書き方がないので各々好きなように書かれています。
決まってない分ちょっと難しいですね…

仕様書を作る際は、番号の振り方、枠の大きさ、分類わけなど
ちょっとした細かいところでも意識していこうと思います。
（見やすいね！わかりやすいね！って言われたい）

少し褒められたら自分の自信とやる気にも繋がりますよね！

項目は
        ・テストケース,テスト区分
        ・観点
        ・手順
        ・結果
        ・備考

だいたいこんな感じ。

テスト仕様書って検索したらたくさん出てきます！



いつも、「何も知らない人が客観的に見てやった時にこれできるか考えてあげて」と言われます。目の前のことに必死になってよくこの言葉が抜けてしまうので、Outputの意味も込めて書きました。

もう少し慣れてきたらJSの関数やオブジェクトをまとめた記事を作ってみたいと考えています。

それではここらへんで失礼します。
回線帯域使用率の計算をしてみた


## はじめに
数千台の端末が存在するNWにおいて、同時に何台の端末でダウンロード通信が行えるかを知りたく、帯域使用率を計算してみました。


アプリケーションのダウンロードを行う際、数千台が同時にダウンロードを開始してしまうと、回線帯域を超えたトラフィック量の通信が発生して負荷がかかってしまい、他の通信にも影響を及ぼしてしまいます。
そのため、端末をいくつかにグループ分けし、タスクスケジューラでダウンロード開始のタイミングを分散させようと考えました。
「一定間隔ごとに何台ずつのグループに端末を分ければ、安全にダウンロード通信を行えるのか」を知ることが目的です。

**※記事にしておいてなんですが、初心者で間違いがある可能性もあるため、お気づきの点があればご指摘いただけると幸いです！**








## 前提
[ダウンロードしたいアプリケーションの容量]
約500MB

[回線速度]
600Mbps(ベストエフォート型か帯域保証型か不明…)

[端末台数]
今回は4000台とした場合で計算







## 実際に行ったこと



#### ①端末のだいたいのグループ分け
数千台の端末をグループ分けする際、わかりやすいグループに分けたいと思い、毎週"月～金"で5つのグループに分けた。
端末台数的に、より小分けにする必要があったため、9時～17時の1時間ごとにさらに小分けにすることにし、全部で40のグループに分けると想定した。

>月～金の**5**グループ × 9時～17時の**8**グループ ＝ **40**グループ
<br>






#### ②現在の回線使用状況の確認
回線速度600Mbpsではあるが、もちろん今回のアプリケーションのダウンロード以外でも回線を使用しているため、600Mbpsの帯域をすべて使用できるわけではない。
既にどれくらいの通信が日々行われているのかを知るため、5分間隔で回線トラフィック量を記録したグラフを1か月分(30日分)用いて、だいたい何％使用して大丈夫そうなのかのあたりを付けた。


日々のグラフから、だいたい25％程度だったらどの曜日、どの時間帯でも使用して問題なさそうなことが分かった。
<br>
<br>







#### ③1グループの台数を計算
①で行っただいたいのグループ分けから、1グループ何台かを計算する。

>全体台数(4000台) ÷ 40グループ ＝ 1グループ台数

ここでは1グループ**100台**と仮定する。
<br>
<br>







#### ④1時間のデータダウンロード量の計算
1グループは毎日9時～17時を1時間ごとに区切ったグループであるので、1時間でダウンロードされる容量を計算する。
>アプリケーション容量**500MB** × 1グループ**100台** ＝ **50GB**

1時間のデータダウンロード量は**50GB**。

<br>
<br>







#### ⑤回線帯域の1時間のキャパを計算
回線速度は600Mbpsである。
「bps ＝ bits per second(1秒あたりのデータ転送ビット数)」なので、以下のように1時間あたりのバイト数に換算した。
>600Mbps ＝ 2,160,000Mbit/3600sec(1時間) ＝ 270,000MB/1時間 ＝ 270GB/1時間

1時間当たりだと**270GB/1時間**。

ただし、帯域を100％使用できるとは考えないほうがいいと判断し、MAXでも80％を使用可能という前提で計算することとした。
その場合、以下となる。
> 270GB/1時間 × 0.8 ＝ **216GB/1時間**

1時間換算で**216GB/1時間**の回線帯域として計算することとする。

<br>
<br>


#### ⑥帯域使用率の計算
1時間に行われるダウンロードにおいて、回線帯域をどの程度使用しているかの計算をする。
> データ容量 ÷ 回線速度 × 100 ＝ 帯域使用率

なので、

> 50GB ÷ 216GB/1時間 × 100 ≒ **23.1％**

<br>

以上のことから、
1時間に100台の端末が同時に約500MBのアプリケーションをダウンロードする際、
600Mbpsの回線の使用率は**23.1％と**いうことが分かった。

## まとめ
上記の計算により、今回の場合は同時に100台のダウンロードを行うと、回線帯域の23.1％を使用することとなり、一応はダウンロード可能という結論に至りました。
ただ、ダウンロード以外の何かしらの要因で通信量が増加した際に、かなりギリギリとなってしまう値かもしれないということもわかりました。
今後、どの程度余裕を持って計算をするべきなのか、経験者に確認しつつ、最終的な同時ダウンロード台数を決定していく方針となっております。
ボリュームを使う時のマウント先パーミッションを非rootにしたいんだが…

## はじめに
　ボリュームを使用する際、マウント先のフォルダがrootユーザーで作成されてしまって困りました。知識不足のため、なかなか解消できませんでした。メモとして残しておきます。


## 状況の確認

```yml:docker-compose.yml
version: '3.7'

services:
  web-back:
    build:
      context: ./backend/web-back
      args:
        - UID=${UID:-1000}
        - GID=${GID:-1000}
        - USERNAME=user
        - GROUPNAME=user
    volumes:
      - ./backend/web-back:/code
      - static_volume:/code/staticfiles

volumes:
  static_volume:
```

```dockerfile:Dockerfile
FROM python:3.11

WORKDIR /code

ARG UID
ARG GID
ARG USERNAME
ARG GROUPNAME
RUN groupadd -g ${GID} ${GROUPNAME} -f && \
    useradd -m -s /bin/bash -u ${UID} -g ${GID} ${USERNAME}

USER ${USERNAME}
```
　
　ボリュームとして`static_volume`を設定し、`code/staticfiles`にマウントします。`./backend/web-back`は空のディレクトリです。rootユーザー回避のため、`user`という一般ユーザーとして実行できるようにしています。

https://qiita.com/ma-me/items/c80f7f8bf9a61cbd21f7

　ここからコンテナを立ち上げると、指定したディレクトリが存在していないので`staticfiles`ディレクトリが作られますが、パーミッションがrootになってしまいます。他のパーミッションと食い違ってしまい問題の元になるので、`user`に揃えていきます。


## 先にディレクトリ作っておけばいい！

　結論から言うと、`statifiles`を事前に一般ユーザーで作っておけば、この問題を回避できます。Dockerfileに以下のように追記します。

```docker:Dockerfile
FROM python:3.11

WORKDIR /code

ARG UID
ARG GID
ARG USERNAME
ARG GROUPNAME
RUN groupadd -g ${GID} ${GROUPNAME} -f && \
    useradd -m -s /bin/bash -u ${UID} -g ${GID} ${USERNAME}
RUN mkdir staticfiles && \ #追記
    chown ${USERNAME}:${GROUPNAME} staticfiles #追記

USER ${USERNAME}
```
　
　`staticfiles`を作ったあと、`chown`でパーミッションを変更することで、非root権限を付与できます。作られたディレクトリをマウントすることになるので、そのパーミッションは保持されたままになるということですね。


## おわりに

　先にディレクトリ作っておけばパーミッションいじっておけばええんや！というのを見て、「え、それでいいの？」って感じになりました。言われればたったそれだけって感じですが、自分じゃ気づかないなぁ…。


## 参考
- [Docker-compose and named volume permission denied - Stack Overflow](https://stackoverflow.com/questions/64027052/docker-compose-and-named-volume-permission-denied)
いいコード悪いコードまとめ９章設計の健全性を損なうさまざまな悪魔たち

# デッドコードは消えているか
到達不能コードともいう

# YAGNI原則に則っているか
You aren't gonna need it.
必要になるまで先回りして実装する必要はない

# マジックナンバーは避けて、定数化しているか
定数化が難しい場面もありますが、基本的にマジックナンバーは避けましょう。

#　グローバル変数を使用していないか
グローバル変数は影響範囲が広すぎるので、必要に迫られるまで使用しないこと。

# nullを返したり、渡したりしていないか
rubyだとnilですが、`return nil`のはnilチェックしなければならなくなるので、良い書き方ではない。
ついやってしまいがちですが、`EMPTY`という変数を作り、それを返すようにした方がいいです。

# rescueの例外処理を書いているか
rubyだと、begin, raise, rescue, ensureなどで例外処理していくわけだが、rescueを忘れるとただ例外を握りつぶすだけなので意味がない。

# 問題検出時にけたたましく叫んでいるか
railseなどでエラーが発生した場合は、通知や記録、リカバリ処理、ログへの記録などを実装しよう。

# サンプルコードのコピペはしていないか

# 課題と目的を意識して技術を選択し、常にbetterを目指しているか
LaravelでTwigを使った際にphpのsessionを保存する方法

## 概要
LaravelにおいてTwigテンプレートを使用した際に、Twig上でsessionを使う方法

## 使用方法
```.php
//保存
{{app.session.put('key','value')}}

//全部取得
{{app.session.all()}}

//Keyで取得
{{app.session.get('key')}}

//Keyで存在確認
{{app.session.has('key')}}

//削除 
{{app.session.forget('key')}}

//削除 (全データ)
{{app.session.flush()}}
```

## 参照

https://laravel.com/api/8.x/Illuminate/Session/Store.html

Laravelフレームワークの下記に全メソッドがあります
`vendor\laravel\framework\src\Illuminate\Session\Store.php`
SmartBrush: Text and Shape Guided Object Inpainting With Diffusion Model

# 1. 概要
破損した画像や欠損した画像領域を補完する技術をInpaintingという。一般的に、破損個所の周囲の情報から破損領域を予測していくが、再構成されるのは背景のみで新たなコンテンツが追加されることはない。これに対し、提案手法ではテキストと画像のマルチモーダル(Multimodal)な情報を使って欠損領域を新たなコンテンツで補完する、拡散モデル(Diffusion model)ベースの手法”Smart Brush”を提案している。

---


# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/d6b19cf2-4139-16eb-5e7f-ebfd12421bc8.png)
従来手法ではできなかったユーザーのマスク入力に合わせたコンテンツの自動生成によるInpaintingを実現した。

---


# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/5e89c196-f4c9-7145-22f1-34634649eb84.png)
テキストと生成したいコンテンツの形状をマスクで入力する。マスク画像は粒度の詳細を荒くしながら多段階の物体形状が複製される(coarse-to-fine)。マスクを埋め込む位置にノイズを付与して拡散モデル(Diffusion model)に入力し、ノイズを除去するように学習させる。推論時は未知のマスクとテキストを入力すると、対象領域に対してマスクにフィットするようにテキストで指示した物体が生成される。

---


# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/fd5c8203-bd1f-7608-4f18-2e33709e6e3d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/2e3c4788-8565-6a5e-2a20-aeffbf196010.png)
生成結果を見てみると、背景がよく保存され、かつ前景のマスクにフィットさせるようにテキストで指示した新たな物体が生成されている。既存手法と比べても生成のクオリティが高いことがわかる。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Xie_SmartBrush_Text_and_Shape_Guided_Object_Inpainting_With_Diffusion_Model_CVPR_2023_paper.pdf>
last updates: July 12 2023
Next.js13(app router) Warning: Expected server HTML to contain a matching 〇〇

# 概要
Next.js(app router)で開発していた時に遭遇したエラーです。
今回のエラーはNext.js特有のエラーではないです。
ただ、海外のgithubのissueやstacoverlowの記事や参考になるものが少なく、自分でエラーを特定して白み潰しでやりました。
こちらのエラーに遭遇したら、こちらの記事を参考して頂けると幸いです。
	

	
## Warningが出ていた箇所
エラー内容の詳細を見てみますと、「`body`要素内に`html`要素が入っているよ！」という警告です。
chromeの検証ツールのElementsを見てみると、特に`<body>`要素内には`<html>`要素は入っていなくてエラーが出ていました。

「あれ？`<body>`要素内には特に`<html>`要素は入っていないのに、なんでwarningなんだ？」と思っていました。
ページを遷移する度にこの警告エラーは出ていました。

## 調べた箇所
今度は、chromeの「ページのソースの表示」というのを開いてみると、コンパイルしたソースコードが表示されるのですが、文字検索で「html」と調べたら、なんと、`<body>`内に`<html>`が入っていたのです。
	
しかし、buildが終わって、Topページにだけ遷移した時にはなぜかこのエラーは出てこなかったのです。
よくよく調べてみたら、`layout.tsx`は`app/layout.tsx`だとRootLayoutで全体的に反映されますが、`app/(ドメイン名)/layout.tsx`だと、変更部分だけを反映することができるみたいです。

	
## 解決
こちらNext.js(app router)での実装になります。
`<head>`タグ内にデータを入れる時に`layout.tsx`に書くのですが、ディレクトリの下に`layout.tsx`を作るとそのドメインのページだけに表示させたいコンテンツを含ませることが出来ます。

	
### 修正前

```tsx: layout.tsx
return (
    <html lang="ja">
      <body>{children}</body>
    </html>
  )
```

### 修正後
```tsx: layout.tsx
return <>{children}</>
```
	
# まとめ
ディレクトリごとにlayout.tsxファイルを作成しているのですが、どうやら`<html>`と`<body>`が悪さをしていたみたいです(僕のlayoutファイルの読み込みや役割について理解していなかっただけでした。。。)
それぞれのファイル毎に上記の`<html>`要素と`<body>`要素を削除したら、warningのエラーは解消されました！
Next.js13から初めて触ったのですが、Next12以前とは変更点が多いため、
意外とキャッチアップするのが大変です。公式ドキュメントと他の人が書いた記事を交互に読みつつ、
Nextjs13についてもっと知っていきたいと思います。
	
	
## 参考記事
https://reffect.co.jp/react/next-js-13/#layout-%E3%81%AE%E8%A8%AD%E5%AE%9A
	
https://dev.classmethod.jp/articles/nextjs-nested-layout/
	
### 公式ドキュメント
https://nextjs.org/docs/app/building-your-application/routing/pages-and-layouts
DisCo-CLIP: A Distributed Contrastive Loss for Memory Efficient CLIP Training

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/0c9c6b46-ac82-625f-e6b4-005b0b2eea49.png)
CLIP(Contrastive Language-Image Pretraining)は、大規模な画像とテキストのペアのデータセット(4億ペア)を学習した事前学習モデルで、画像とテキストをトランスフォーマーを使って特徴抽出し、異なるモダリティの特徴を同じ特徴空間でペアリングできるため、マルチモーダルの研究でよく用いられる。ここで、入力の画像とテキストのペアが同じクラスに属するかどうかを判別するため、画像とテキストのベクトルの関連性を評価する必要があり、対照損失(Contrastive Loss)が用いられている。同じクラスに属するペアはベクトル間の距離を小さくし、異なるクラスに属する場合は距離を大きくする。
一方で、対照損失(Contrastive Loss)のメモリ使用量は非常に大きく、バッチサイズ65,536に対して16GBのメモリを要する。この研究では、メモリ使用量を削減するための分散メモリ手法を提案している。

---


# 2. 新規性
対照損失(Contrastive Loss)とその勾配計算を2つの部分に分解し、1つはGPU内の勾配を計算し、もう1つは他のGPUから集約されるGPU間の勾配を計算することで、GPUのメモリ使用量を О(B^2)からО(B^2/N) と大幅に削減した。
(*Bはバッチサイズ、Nは学習に使用するGPU数を示す)

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/0dde5ceb-44a9-c32e-6adc-4f598d8d92ab.png)
GPU内の勾配を求める際は、該当GPU内の画像とすべてのテキストとの損失(Imaget-to-Text Contrastive Loss)と、該当GPU内のテキストとすべての画像との損失(Text-to-Image Contrastive Loss)だけを求める。GPU間の勾配を求める場合は、すでに求めたGPU内の勾配をAll_Reduce Operationを用いて各GPUの勾配を集約し(Reduce)共有する。

---


# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/38260d34-7a3a-bec9-d7ac-6919c34b3f7a.png)
CLIPはバッチサイズが大規模になるため、GPUを用いた効率的な分散コンピューティングは効果が高い。オリジナルのCLIPではViT-B/32を学習するのにNVIDIA社製A100(40GB)GPUを128個を必要としたが、提案手法では同等性能を達成するのに8~64個のGPUで済んでいる。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Chen_DisCo-CLIP_A_Distributed_Contrastive_Loss_for_Memory_Efficient_CLIP_Training_CVPR_2023_paper.pdf>

last updates: July 13 2023
Polynomial Implicit Neural Representations for Large Diverse Datasets


# 1. 概要
信号や画像などのデータを用いて、データの表現を直接的に学習することで少ないパラメータで高品質な結果が得られるネットワークアーキテクチャとして、Implicit Neural Representations(INRs)が知られる。画像であればピクセル値や特徴ベクトルなどの明示的な表現を必要とせず、ネットワークは入力データを予測するための関数として学習される。超解像(super-resolution)や3Dモデリングなどの応用で用いられるが、従来研究では生成時にボケやすい画像を抑制するため、高周波成分を考慮したSin波による位置のエンコーディング(positional encoding)を用いることが多かった。しかし、画像の位置で特徴を取得するPositional Encodingを用いると、大規模な画像データセットに共通する汎用的な特徴を学習することが難しくなってしまう。この研究では、多項式関数を使用して画像を表現しており、Positional Encodingを用いないことで、ImageNetなどの大規模データセットに対してより少ないパラメータ数で高い精度の画像生成(Image Generation)を実現している。

---

# 2. 新規性
学習するパラメータ数が少なく、畳み込み演算(Convolution)や正規化、アップサンプリング、セルフアテンションなどの層を一切用いずに、多項式のみの表現で拡散モデル(Diffusion model)を含む従来の画像生成の精度を上回っている。

---


# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/d9dfe4fb-ec7c-91f6-159c-5a4e4c03ce13.png)
Linear層とReLU層だけを用いた特徴取得設計になっている。ただし、この単純なMLPでは低次元の多項式しか表現できなくなるため、ネットワークの次元を増やすためにReLU層の後に座標位置をアフィン変換した値をピクセル単位(element-wise)で乗算している。潜在空間zは64次元で、Mapping Networkを介してアフィン行列で学習されるパラメータ空間を512次元に膨らめている。ネットワーク全体としては、ある座標(x,y)の画素値(R,G,B)を予測するモデルとなっている。

---


# 4. 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/4f5dc495-95ff-0674-4507-11c1a81d5acb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/0f4d5a0a-14f4-52fe-e68e-9ff318fa40d4.png)
CNNベースのGANs(Generative Adversarial Networks)を用いた手法(BigGAN/StyleGAN-XL)や、拡散モデル(Diffusion model)を用いた手法(CDM/ADM/DiT-XL)と比べて少ないパラメータ数で高精度に画像を生成できている。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Singh_Polynomial_Implicit_Neural_Representations_for_Large_Diverse_Datasets_CVPR_2023_paper.pdf>

last updates: July 14 2023
【AWS CDK】GuardDutyの信頼されている IP リストを設定する時のTips

# はじめに
GuardDutyの**信頼されているIPリスト**はいくつかのフォーマットのファイルで設定することができますが、
基本的にS3バケットにアップロードする必要があります。

CDKには、**信頼されているIPリスト**を設定できる [CfnIPSet](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_guardduty.CfnIPSet.html) が用意されています。

CDKでGuardDutyの**信頼されているIPリスト** を設定するならS3のファイルデプロイまでCDKで行いたいと思いました。

## 話さないこと
- Amazon GuardDutyについて
- AWS CDKの基本的なことについて

# 環境
CDK 2.86.0(TypeScript)

# BucketDeployment
CDKでS3のファイルをデプロイするには、公式で [aws_s3_deployment](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3_deployment-readme.html) というモジュールが用意されています。
これを使って任意のバケットにファイルをアップロードすることが可能です。

```
const whiteListIpBucket = new Bucket(this, 'WhitelistIpBucket', {});
const deployment = new BucketDeployment(this, 'WhitelistIp', {
  sources: [Source.asset(path.join(__dirname, './config/guardduty'))],
  destinationBucket: whiteListIpBucket
});
```

# CfnIPSet
上記のリファレンスにも記載されていますが、以下のような記述になります。

```
const ipSet = new CfnIPSet(this, 'IpSet', {
  activate: true,
  detectorId: detectorId,
  format: 'TXT',
  location: `s3://${whiteListIpBucket.bucketName}/whitelistip.txt`,
});
```

# エラー
上記の設定だけでは、Cloudformationが依存関係を正しく処理できないような挙動になり、エラーとなります。
Cloudformationのスタックを見ていると、 `deployment` が完了する前に `ipSet` を実行しようとしています。

このような場合は [addDependency](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_guardduty.CfnIPSet.html#addwbrdependencytarget) を使うと思います。
しかし、以下のように書くとエラーとなります。
```
ipSet.addDependency(deployment);

型 'BucketDeployment' の引数を型 'CfnResource' のパラメーターに割り当てることはできません。
型 'BucketDeployment' には 型 'CfnResource' からの次のプロパティがありません: cfnOptions, cfnResourceType, _cfnProperties,,,
```
これは、 `addDependency` の引数は `CfnResource` である必要がありますが、 `BucketDeployment` はそうではないためです（Cloudformationのカスタムリソースが作られます）

## 対応
[aws_s3_deployment](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3_deployment.BucketDeployment.html#deployedbucket) を眺めていたら、以下のような説明がありました

> If sequenced access to the original destination bucket is required, you may add a dependency on the bucket deployment instead: otherResource.node.addDependency(deployment)

上記の説明から、以下のような書き方になります。
```
ipSet.node.addDependency(deployment);
```
このようにすると、 `BucketDeployment` -> `CfnIPSet` と依存関係を指定することができ、正しくデプロイすることができます。


# おわりに
CDKはプログラミングの知識が浅くても抽象的に書けることがメリットですが、言語仕様など、定期的に壁に当たっています。
深く学習する機会をちゃんと作りたいと思いました。

コードは [ksaga9/cdk-sample](https://github.com/ksaga9/cdk-sample/blob/main/lib/guardduty-ipset.ts) にアップロードしています。参考にどうぞ。

# Appendix
[信頼できる IP リストと脅威リストをアップロードするには](https://docs.aws.amazon.com/ja_jp/guardduty/latest/ug/guardduty_upload-lists.html#upload-procedure)
Unsupervised Space-Time Network for Temporally-Consistent Segmentation of Multiple Motions

# 1. 概要
動画において連続するフレーム間のピクセルレベルでの動き情報を表現する方法としてオプティカルフロー(Optical Flow)が知られる。この研究では、オプティカルフローをセグメンテーションすることで前景物体の抽出を行っている。特に、時間的な動きの一貫性を評価項目に入れてセグメンテーションすることで従来手法よりも高精度なセグメンテーションを実現している。

---


# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/ffef2bb5-9791-aa56-4077-5251ebbb739d.png)
教師なし学習を用いてネットワークを訓練しており、損失関数には時空間的にパラメトリック推定をするモデルを採用してオプティカルフローの再構築を行っている。推論速度が速く、GPUを用いて100fpsで動作する。

---


# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/15688ab2-241f-89b3-669c-a85b70351e15.png)
オプティカルフローのフレームを入力として、時系列に沿って一貫性のあるようなセグメンテーションを予測する。まず、時空間的なパラメトリック推定のモデルについてパラメータを計算し、次に損失関数を求めてバックプロパゲーションに沿ってネットワーク全体のパラメータをアップデートしていく。ここで、生成されるマスクの一貫性を保つために時間的な一貫性を担保するように正則化を入れている。また、損失関数はReconstruction Loss(Lr)とTemporal Consistency Loss(Lc)があり、Lrは4クラスでパラメトリック推定を用いてセグメンテーションするときにオプティカルフローの再構築に使用し、Lcはセグメンテーションの4クラスのラベルが時間的に散在しないように用いる。

---


# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/4494a642-a0b0-5b11-809c-a9bcbe1bf4a9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/9848ab62-82e2-2ca9-5f7a-5792c0a5e20e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/09874a4b-3f0d-2964-ba8d-686ced6b230c.png)
教師なしによるセグメンテーション結果から時間方向に一貫性のあるクラス分類ができていることがわかる。また、従来手法と比べて複数のデータセットで効果があることを示している。

---


Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Meunier_Unsupervised_Space-Time_Network_for_Temporally-Consistent_Segmentation_of_Multiple_Motions_CVPR_2023_paper.pdf>
last updates: July 18 2023
Devil Is in the Queries: Advancing Mask Transformers for Real-World Medical Image Segmentation and Out-of-Distribution Localization

# 1. 概要
データセット内で頻度が非常に偏った分布を持つ複雑さの指標のことをLong-tailed Complexityと呼ぶ。偏りのあるデータでは学習時に見たことのない例が推論時に現れることがあり、これをOOD(Out-of-Distribution)と呼ぶ。例えば、医用画像のセグメンテーションではLong-tailed Complexityが顕著で、このデータカテゴリごとの複雑さとOODが比較的珍しい疾患の解明に役立つため、臨床研究で重要となっている。この研究では、OODが現れたときに学習しているデータ(Inliers)に疑似的に近づけて病変画像のセグメンテーションができるようにした。

---

# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/bf1f45d6-fc5c-8a92-463d-3cab1788ad33.png)
学習していない稀な病変や見たことのない病変の位置をピクセル単位で特定するOOD Localizationを提案している。検出対象である病変について、OODとInliersとの画像上の差は、背景との差に比べて圧倒的に小さいことを利用し、前景である病変と背景との境界を検出するための損失関数を用いて実現している。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/5d1d27a1-981f-af0c-01dc-26287174b5c7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/f4d572c3-3500-fe7a-b07c-5e263fa8b2c4.png)
セマンティックセグメンテーションでクエリ単位でどのクラスに属するか予測するMask Transformerをベースに使用しており、クエリには学習した病変の分布の重心の代表ベクトルが用いられている。こうすることで、セグメンテーションタスクをクラス分類問題に挿げ替えている。
また、損失関数としてQuery Distribution Lossを提案しており、学習した病変の代表ベクトルを調整しながら前景・背景の境界線を拾い出す機能を実現している。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/08a975c3-b0ef-0668-a7c9-94b02dcd5d65.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/5a72dfd4-2cdd-485f-98a7-0f6cb2f7a3af.png)
膵臓と肝臓の腫瘍を撮影したデータセットでセグメンテーションスコアを評価しており、AUROCで平均7.39%、AUPRで平均14.69%、FPR95で平均13.79%の性能向上を達成した。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Yuan_Devil_Is_in_the_Queries_Advancing_Mask_Transformers_for_Real-World_CVPR_2023_paper.pdf>

last updates: July 11 2023
初心者たちがデザインスプリントを回してみた話

前田は激怒した。必ず、かの邪智暴虐な顧客の要求を実現せねばならぬと決意した。前田には開発がわからぬ。前田は、初心者Webデザイナー兼初心者エンジニアである。コードを書き、adobe XDで遊んで暮して来た。けれども顧客の要求に対しては、人一倍に敏感であった。

# 要求を実現するのはむずい（邪智暴虐とか関係なく）

そもそもそんな顧客に当たったことはない(それどころか社内開発ばかりだった)。

企画設計、デザイン、開発まで一人やっていたことがありましたが、どの立場の状況もわかるためとてもやりやすかったです。
でも現代日本でのオーソドックスな開発は、基本的にPOはPO、デザイナーはデザイナー、開発チームは開発チームで動いていると思います。
でもそれって連携とれなくない？デザイナーからすると、その機能の背景は詳しくわからないし、作成中のデザインが開発として実装が難しいかなんてわからない。
じゃあどうすんのよ？というところで登場するのが**デザインスプリント**です。

# デザインスプリントってなんじゃらほい

関係者たちを巻き込んで、アイデアバンバン出して、プロトタイプ作って、ほんとにそれって効果ある？を短期間で行う取り組みです。
取り組みを通じてめちゃ素敵デザインを生み出すのが目標です。
下記のフェイズを通して問題を解決するためのデザインを考えます。

1. 理解フェイズ
取り組む問題への理解を深めます。
解決したい問題の背景は？目的は？根本的な課題はなんだろう？それを解決するには？

2. 発散フェイズ
課題を解決するためのアイデアをバシバシ集めます。
あなたのこのアイデアとってもクールだね！このUIとかどうよ？

3. 決定フェイズ
アイデアから具体策を練ります。
このアイデアとこのアイデアを組み合わせてみよう！このアイデアはここでも使えそう！

4. 試作フェイズ
プロトデザインをガシガシ作っていきます。
細部はあとで調整。だってこの後に待っているのは…

5. 検証フェイズ
シナリオに沿ってプロトタイプを触ってもらいます。
全く知らない人に触ってもらえば新しい発見も？

# 大体こんな感じで回してみた

## メンバーの皆さん
- スクラムマスター初心者。主にファシリテーター。質問があればツッコミもする。
- PO初心者。背景や要求をまとめ、事前にジャーニーマップを作成してくれる。
- 開発初心者。POやデザインの補佐もしてくれる。でもメインは開発。
- 自分。デザイン初心者。開発も初心者。何もわからない。ばなな。

ちなみに住んでる場所はバラバラ。つまりリモートです。

## 理解フェイズ
まずはPOから今回の問題について教えてもらいます。ジャーニーマップを使用した説明、実現したいことやゴール、利用者の声etc…
そしたらゴールまでの障害を考え、課題を明確にしていきます。それぞれの立場（開発、デザイナーなど）からの意見やコメントも交えます。
あわせてジャーニーマップもブラッシュアップ。

## 発散フェイズ
優れたデザインはいろんなところで使われます。他のサイトを見ながら、課題を解決できそうなデザインを探します。
それらを元に自分たちでアイデアを出していきます。とにかくいっぱい。我々は**クレイジー8**という手法を用いました。
そしたら出されたアイデアたちから手描きのスケッチを各々作成します。デザイナー以外も。

## 決定フェイズ
スケッチたちを見ながら、どのアイデアを採用するか決めていきます。
このスケッチのここがいい、あっちのスケッチのこれを組み合わせたい、というのもあるかもしれません。
アイデアを整理していき、最終的に一つのワイヤーフレームを作成します。

## 試作フェイズ
ここに来るまでにアイデアが収束してると思うので、それを元にプロトタイプを作成します。
この後は検証が待っていて没になる可能性もあるので、細かいところまで気を配らなくてOKです。
我々の場合、この裏でPOがテストを作成していました。理解フェイズで洗い出した課題やブラッシュアップしたジャーニーマップを元に作っていきます。

## 検証フェイズ
一人ずつ、複数人にプロトタイプを触ってもらいながらインタビューを行います。
テスターの様子を観察するのも大事です。どこで詰まっている？それはなんで？気になったことはメモしていきます。
我々はリモート会議で行い、テスターに画面共有してもらいました。マウスの動きだけで意外といろいろなことに気付きます。

# 思ったこと

## ファシリテーターめっちゃ大事
参加者が集中、必死になるため話題がズレても気付かなかったりします。起動修正役がいると安心感があります。
更に、柔軟な時間調整ができるとすごい助かる！
例えばクレイジー8。1分に一つの案を8回、計8つの案を出す手法なのですが、日本ではあまり馴染みがなく短時間でアイデアをバシバシ出すのは難しいです。
そんな時は一つのアイデアを2分で、というようにちょっと長くしたりしました。

## お互いに話し合える、意見を出し合える環境は必須
とにかく喋るので、普段から会議中に笑いあえるような雰囲気作りが必要だと思います。
意見を出しやすいという点でもそうですが、和やかな雰囲気があることで精神的な疲労を緩和できるんじゃないでしょうか？
問題を自分ごとと捉えて会議に参加する、という心構えも重要です。
あと水分も必ず用意してください。口の中がパサパサになります。

## 課題のスコープ決めるのむずい
課題の規模感によっては内容が膨れ上がります。そしてデザイナーは死ぬ(試作フェイズの規模的に)。
多分、検証もやりづらくなる。ストーリーが複雑化する原因になったりとかしそう。
内容によっては課題を切り分けたりするといいかもしれません。

## 思ったより楽しい
これが一番重要。そうでしょ？
わいわいしたりお菓子食べながら意見を出し合えて、非常に充実感がありました。

# おしまい
多分、本とか読んだ方が正確です。この記事は「こんな手法があるで！」と紹介するのが目的なので、「なんか良さそうだな」と思ってもらえたら幸いです。
どうせ仕事するなら楽しい方がいいと思います。デザインスプリントは楽しいぞ。
Box-Level Active Detection


# 1. 概要
通常、モデルの学習にはアノテーション/ラベリング付きのデータが必要となるが、モデルが自動的に最も学習に役立つと思われるデータを選択することで効率的に学習を進める方法をアクティブラーニング(Active Learning)という。特に、モデルがまだよく分類できない不確かなデータや境界付近のデータに着目してデータの選択がなされるので、より少ないラベルで性能の高いモデルが構築できる。物体検出のタスクでも有効性が確認されているが、同一画像内のすべての物体に人手でアノテーションをしてもモデルの性能向上には必ずしもつながらないためコスト削減には有用ではなかった。この研究では、情報量の多い物体を優先的に人にアノテーションしてもらえるよう、モデルが自分でわかるところは自動でピックアップし、少ない試行回数でボックスのアノテーションができるようにした。

---


# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/1a6ff360-fa53-e737-8f93-914f88ede2b5.png)
画像全体でアノテーションしていた従来のコストのかかる方法から、モデルがまだよくわからない不確かな個所をピックアップしてアノテーションすることで、大幅なアノテーションのコスト削減を実現した。

---


# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/a86ccc03-af8b-2aa7-bc15-0d4bfa6153d0.png)
人間のアノテーションとモデルの学習した知識を相互に補完するComplementary Pseudo Active Strategy(ComPAS)というフレームワークを提案している。すでに学習が進んで容易に認識できるターゲットに対しては、システムが自動でラベリングし、学習した時の価値の高いまだ学習の進んでいないターゲットだけを人間に提示する。

---


# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/d0d6cdfc-711c-e21f-5645-6f58abf74046.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/d842e9b9-0127-8bf0-3cab-97385fb576a4.png)
VOC0712データセットで100%完全教師有りの性能と同等性能を、わずか19%のボックスのアノテーションのみで実現した。また、COCOデータセットでは従来手法と比べ最大で4.3%のmAPの改善を達成した。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Lyu_Box-Level_Active_Detection_CVPR_2023_paper.pdf>

last updates: July 11 2023
Improving Cross-Modal Retrieval With Set of Diverse Embeddings

# 1. 概要
画像とテキストの異なるモダリティ間で検索を行うクロスモーダル検索は、画像とテキスト固有のあいまいさがあるため難しいタスクの一つとして知られる。従来手法として画像とテキストの特徴を高次元でペアで紐づけるセットベースの方法が提案されているが、異なるモダリティの特徴をうまく紐づけることは難しく、複数のペアに紐づいてしまったりほとんどペアにならなかったりした。この研究では、新たなセットベース手法を提案して従来の課題を解決した。

---


# 2. 新規性
新たにSmooth-Chamfer類似度というメトリックを導入しており従来手法の高次元空間での類似度マッチングよりも異なるモダリティの特徴をマッチングできるようにしている。またスロットアテンション(Slot-attention)を用いて、異なる意味の表現を持つ要素を集め、多様な情報を抽出できるようにした。

---


# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/0e952d3e-2904-db6f-9db1-eb40be1383b3.png)
画像と言語からそれぞれ高次元特徴を抽出し、ペアとなる特徴量を推定する(青枠: Set-prediction module)。ここで、スロットアテンションを用いて各スロットがより多様な特徴を集めるよう競い合うことで異なる意味の表現をエンコードできるようにしている。次に、Smooth-Chamfer類似度を用いて特徴量のペアをマッチングしていく(橙枠: Smooth-Chamfer similarity)。従来手法と比べて、特徴空間が疎になりすぎたり密になりすぎたりせず、異なるモダリティの表現をうまくマッピングできるようにしている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/99291c98-d112-81cb-5975-7bc0c5983bcd.png)

---


# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/2fb43919-0b64-fa6a-17b0-e9b5b01a3a8d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/21ef4e9b-62fe-f169-b3f8-d77e322d90dc.png)
COCOデータセットやFlickr30Kデータセットを使って評価しており、既存手法よりも少ない演算量で高精度に予測できることを示し、性能記録を更新している。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Kim_Improving_Cross-Modal_Retrieval_With_Set_of_Diverse_Embeddings_CVPR_2023_paper.pdf>

last updates: July 11 2023
SceneComposer: Any-Level Semantic Image Synthesis

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/a426c3af-177e-75a5-3e2a-326654f5375e.png)
テキストと任意の粒度のセグメンテーション画像から画像を生成する研究。ユーザーが細かくセグメンテーションして正確な結果を得たい場合や、テキストだけ入力して画像を生成する場合など、様々なニーズに対応する。

---


# 2. 新規性
テキストと画像の入力に対して、どちらも多重解像度の特徴ピラミッドを用いることで、セグメンテーション画像で指定された物体形状とテキストで与えられる対応箇所の意味情報をマージでき、任意の粒度で画像を生成できるようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/a1433d3f-1d1c-4926-c468-8d620841cf07.png)

---


# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/b984270c-05e3-8a84-7485-364aada43739.png)
画像生成時は拡散モデル(Diffusion model)を採用し、U-Netと合わせて高解像度な画像を出力する。最も低いレベルでは画像情報を用いずに形状情報がないテキストから画像への変換を行い、最も高いレベルではセグメンテーション画像からRGB画像を予測する。この間のレベルを合成できるようにしたことで、描画が得意な人も苦手な人もどちらも使えるシステムになっている。

---


# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/67b4cd11-20b6-aaa4-af5e-864f69241446.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/702e1810-e2d3-9d86-8ea8-001552504116.png)
新たな前景のコンテンツを生成しつつ、入力のマスクで成約した形状にフィットするように画像生成できている。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Zeng_SceneComposer_Any-Level_Semantic_Image_Synthesis_CVPR_2023_paper.pdf>

last updates: July 11 2023
JavaSilver SE11合格体験記

# はじめに

初めまして。takunと申します。
この記事では自動車免許、看護師免許をとって久しく資格勉強をしていなかった(もはや３年くらいペンも握っていなかった)男の日記です。

私は4月から某SES企業にIT未経験での転職をした初心者エンジニアです。間違ったことや不適切な内容となってしまう可能性もあることをご承知ください。また、助言など頂けると嬉しいです。
また、効率良い勉強法や絶対合格といったメソッドを記すものではないのでご注意ください。



# 目次

①資格取得に挑戦した理由
② JavaSilver試験までの流れと参考教材
③ 最後に


# ①資格取得に挑戦した理由

半分は、JavaSilverに関しては会社からの勧めで資格勉強しました。

もう半分はIT業界未経験で入社した私にとってアピールできるポイントとして、資格取得がわかりやすい指標であると営業担当の方が話されていたことが理由でした。

私はできるだけ早く開発案件に参画したいと思っていたので、やる気はあるのだと評価してもらえるよう短期間で合格できるよう努めました。
また、オリジナルのアプリ制作も取り組み同時並行で進めていました。

# ②JavaSilver試験までの流れと参考教材

プログラムのプの字も知らない未学習の状態が3月の末でした。
## 4〜5月まで研修を受ける合間で、資格勉強を進める。
研修の半分くらいはJavaのコードを書いており、出勤日は9-18時までPCと睨めっこしていました。昼休みや通勤時間をJavaの学習に充てて、自宅では授業の予習復習＋Java勉強していました。

今思うと、アウトプットとインプットの時間がちょうど良くできていたんだなと感じます。
座学での勉強については動画サービス＋参考書を活用して進めていきました。
研修時期に関しては、動画サービスでの学習がウェイト重めにやってたと思います。



### 活用サービスと教材の紹介
#### 1.せかチャン-世界一わかりやすい情報化チャンネル　オススメ度☆☆☆



https://www.youtube.com/watch?v=Q_2aC5-uEbs&t=98s

> Java学習の味方。神動画だと思います。通勤中ずっとこれ見てました。
本当に無料でいいのってレベルで詳しく解説されてるチャンネルなので、初学者〜JavaSilver合格目指している方まで超おすすめです。
<font color='red'>正直このロードマップをめっちゃ参考にしました</font>


#### 2.Udemy ウズウズカレッジ Java基礎　オススメ度☆☆

https://www.udemy.com/course/uz-java-kiso/

> 有料コンテンツではありますが、トータルで13時間にも及ぶ内容で丁寧に解説されている動画です。
私の場合①より先に初めてこの動画で勉強したためか、どちらかというとハンズオンの比重が重めで、演習はやや難しめだと感じました。

#### 3.黒本と紫本 オススメ度 ☆☆☆　<font color="red">購入される場合は受験するバージョンに注意</font>

https://www.amazon.co.jp/s?k=javasilver&__mk_ja_JP=カタカナ&crid=2SZTP3MS3Z5Y5&sprefix=javasilver%2Caps%2C176&ref=nb_sb_noss_2

> これは外せないですね。私的には一番合格に直結したと思います。
黒本だけでなく紫本からも過去問と類似した問題が出題されていたので、十分やっておく価値はあるんじゃないかなと思います。

## 研修が終わり待機期間での勉強
ここからは参考書での勉強がベースです。
研修終了までで紫本の練習問題は2周、黒本は練習問題2周、過去問1年分解いていました。その時点で点数は6割ちょっと取れていたので、ギリギリボーダーでしたね（笑）

<font color='blue'>過去問を初見で解いてボーダーに乗ったらできるだけ早い日程で試験日を決めることにしています。具体的に期日が決まることで、やることを明確にでき集中できるタイプでした。</font>
私の場合は１週間後に決まり、やることを割り振ってスケジュールを組み立てました。


過去問は黒本と紫本合わせて４回分しかなかったので、<font color='blue'>答えを丸暗記するリスクも配慮し</font>一気にやるのではなく２回分を日を分け交互に進めていき、8〜9割取れるようになったら次の過去問に進む計画で進めました。

## 試験結果
結果は87％とかだったと思います(ちゃんと覚えていない)
無事合格でした。

# ③最後に
ここまで見ていただきありがとうございます。
JavaSilverもそうですが、ベンダーの資格はめちゃくちゃ受験料が高いですよね。落ちたら笑えないので、しっかり万全を期して臨んでいただけたら幸いです。
ご質問や意見などあれば是非コメントお願いします。
Multiplicative Fourier Level of Detail

# 1. 概要
教師有り学習でニューラルネットワークを用いる場合、データに与えられたラベルを教師としてデータ間に明示的な特徴や表現を学習するが、モデル自身がデータに関連するパラメータを学習しそれを利用してデータ生成・変換・予測する技術のことを、Implicit Neural Representations(INRs)という。データ内の複雑なパターンや構造が自動で抽出でき、データにラベルが必要ないケースで用いられ、画像生成・3D形状表現、動画生成などに応用されている。
この研究では、Multiplicative Fourier Level of Detail(MFLOD)という、多重解像度を利用して得られる特徴をSin波の重ね合わせとして表現し学習するINRs技術を提案している。

---

# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/85e75f9e-3cf0-8e4e-4ec9-e36920f71633.png)
シーン全体の大局特徴と多重解像度を用いた局所的な詳細特徴のハイブリッドな特徴表現を学習できるように設計されており、フーリエ解析を利用して高精度な予測を可能としながら高速な学習・推論を実現している。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/6dddead5-3dac-7a09-68a5-3f36da43dae0.png)
多重解像度で特徴を取得し、各レベルの特徴をSin波で表現する。この処理を前のレイヤーの特徴表現に対しても同様に行い、線形変換と要素ごとの乗算で再帰的に掛け合わせていくことでマルチスケールを考慮した特徴量が得られる。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/262b563a-3eae-a13d-e807-97bf08866b9a.png)
線形の演算子を特定の関数にかけると、その関数は自身の定数倍になる性質がありこれを固有関数(eigenfunctions)と呼ぶ。固有関数を可視化してみると提案手法(MFLOD)では従来手法(NGLOD)より簡単に特徴表現を学習でき、また過学習(overfitting)の傾向が少ないことが分かった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/a8ca7ae5-75c0-01f5-ad0e-a2ac778dd750.png)
学習時に入力の画像サイズを半分にリサイズしておき、推論時に元の解像度で画像を予測する一種の超解像のタスクで評価したところ、提案手法の方が高精度に復元できていることが分かった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/2b974b1d-4ba1-3372-6cd8-1f8b347871e5.png)
提案手法では、NeRFなどと比べて少ない学習・推論時間で高精度にシーンを復元できている。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Dou_Multiplicative_Fourier_Level_of_Detail_CVPR_2023_paper.pdf>

last updates: July 10 2023
小数点以下の桁数を指定して四捨五入、切り上げ、切り捨て

# 小数点以下N桁で四捨五入
## .round
roundメソッドは、引数に小数点以下の桁数を渡し、それより下の桁を四捨五入
```
100.1111.round
# 出力結果 ==> 100

100.1111.round(1)
# 出力結果 ==> 100.1

100.3399.round(3)
# 出力結果 ==> 100.34
```

# 小数点以下N桁で切り上げ
## .ceil
```
100.1111.ceil
# 出力結果 ==> 101

100.3333.ceil(1)
# 出力結果 ==> 100.4

100.3383.ceil(3)
# 出力結果 ==> 100.339

100.3399.ceil(3)
# 出力結果 ==> 100.34
```
# 小数点以下N桁で切り捨てっぽいこと
## .floor
floorはずっと切り捨てだと思っていたんですが、正確には切り捨てっぽいことができるようです。
注意すべきは負の値です。`-1.2`をfloorしたら`-1`になってほしいところですが、これは`-2`になります。
`1.2`の場合は`1`です。

これはつまり、より小さい値にまとめられるというわけですね。この挙動知らないと思わないところで想定外のことがおきます。

また、引数にはマイナスを取ることもできるので便利です。
```
1.2.floor      # => 1
2.0.floor      # => 2
(-1.2).floor   # => -2
(-2.0).floor   # => -2

1.234567.floor(2)   # => 1.23
1.234567.floor(3)   # => 1.234
1.234567.floor(4)   # => 1.2345
1.234567.floor(5)   # => 1.23456

34567.89.floor(-5)  # => 0
34567.89.floor(-4)  # => 30000
34567.89.floor(-3)  # => 34000
34567.89.floor(-2)  # => 34500
34567.89.floor(-1)  # => 34560
34567.89.floor(0)   # => 34567
34567.89.floor(1)   # => 34567.8
34567.89.floor(2)   # => 34567.89
34567.89.floor(3)   # => 34567.89
```
AnyFlow: Arbitrary Scale Optical Flow With Implicit Neural Representation

# 1. 概要
動画の各フレーム間で画像のピクセルレベルの動きや変化を表現する手法のことをオプティカルフロー(Optical Flow)と呼ぶ。一般的に、オプティカルフローの計算はピクセル単位で動き方向のベクトルを求めるため、空間的に密に動き情報を求めようとすると演算時間がかかる。従来研究では、入力画像の解像度を小さくリサイズして演算量を削減する工夫が用いられていたが、小さな物体の動きがわからなくなるなど弊害も大きかった。この研究では、低解像度の入力から任意のスケールで出力のオプティカルフローを予測する多重解像度モデルを採用しており、アップサンプリング時にImplicit Neural Representations(INRs)を用いている。INRsはモデルがデータ内に埋め込まれた複雑なパターンや関係性を自分自身で学習する手法のことを指す。

---

# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/dc56f243-d698-b49e-01f8-280587e8f211.png)
低解像度な画像から任意の解像度のオプティカルフローの出力が得られるため、例えば50%縮小した画像から詳細な動き情報を予測することができる。特に、遠方の小さい物体は空間解像度が縮小すると情報量が非常に小さくなり推定が困難だが、提案手法では非常に頑健に多様な動きを予測することが可能となった。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/5e7ce5b7-cf77-3c1b-4958-0c5e89b19d40.png)
従来手法であるRAFT(ECCV2020)をベースに、3つの改善を行っている。
1) アップサンプリング時にImplicit Neural Representations(INRs)を採用し、低解像度の入力から任意のサイズのオプティカルフローを生成する
2) アップサンプリングした多重解像度のオプティカルフローの出力を合成(Warping)する
3) GRU(Gated Recurrent Unit)を用いてオプティカルフローの長期的な時間方向の依存性を捉え、空間的なサンプリング位置が動的に変化するルックアップテーブルを用いることで、入出力のサイズを自由に変えて予測できるようにする

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/a971fcbd-bb4f-ea7b-ed44-df905570e196.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/2930e6bd-e3ae-9624-1476-f8482c0f14aa.png)
KITTIデータセットを用いた手法の汎用性をテストするCross-dataset Generalizationのタスクで最高記録を更新した。また、オンラインベンチマークにおいても既存手法と同等性能を達成している。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2023/papers/Jung_AnyFlow_Arbitrary_Scale_Optical_Flow_With_Implicit_Neural_Representation_CVPR_2023_paper.pdf>

last updates: July 10 2023
【Flutter】スタックされた画面をすべて破棄する


ログアウトして、
スタックしていた画面をすべて破棄してスプラッシュやログイン画面を表示する場合、
`pushAndRemoveUntil`　を使う。

```dart
    Navigator.pushAndRemoveUntil(
      context,
      MaterialPageRoute<void>(builder: (context) => LoginPage()),
      (_) => false,
    );
```

第三引数の`predicate`を、falseにすることでスタックしていたものを全て消す。

### 環境
* Flutter version 3.10.5
* Android Studio (version 2022.2)
ブロックにオリジナルのアイコンを入れたいな＜WordPressのブロック制作＞

とりあえずブロックのひな型は作れたので、早速オリジナルブロックの作成に取り掛かろうということになるのですが、本番の中味に入る前にちょっと見た目を整えましょう。
ブロックの象徴は何といってもアイコンでしょ。やっぱりオリジナルのアイコンを入れたいですよね。ということで、その方法を説明します。
## FontFontAwesomeからダウンロード
まず、アイコンを作るのですが、一から作るのはかなり面倒ですので、[FontAwesome](https://fontawesome.com/search)などからフリーのSVGをダウンロードします。


![Font Awesome.png](https://itmaroon.net/home/wp-content/uploads/2023/07/c66f5062b1f444b983d3ae12bb112f5c.png)

好きなアイコンをクリックして


![choise.png](https://itmaroon.net/home/wp-content/uploads/2023/07/4eadba996e904fa4876a2340f3f04e36.png)

SVG形式でないとダメですよ。

## ブロックに登録

そしてブロックプロジェクトのsrcフォルダに入れて下さい。
アイコンの登録は通常block.jsonに
```
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 2,
	・・・
	"icon": "button",
	・・・
```
というように入っています。しかし、オリジナルアイコンはblock.jsonで登録することはできません。したがって、この`icon`の行を消して、`index.js`でのJavaScriptによる登録に切り替えます。
`index.js`は次のようになります。
```
import { registerBlockType } from '@wordpress/blocks';
import './style.scss';


import Edit from './edit';
import save from './save';
import metadata from './block.json';
import { ReactComponent as MyIcon } from './my-icon.svg';


registerBlockType(metadata.name, {
	icon: <MyIcon />,
	edit: Edit,
	save,
});
```

このときReactコンポーネントとして登録するので、アイコンのコンポーネント名はReactの規則に沿って頭文字は大文字でなければいけません。
なお、ChatGPTに聞くとwordpress/create-blockで作ったプロジェクトはデフォルトでSVGファイルを扱えないというような情報を示されましたが、2023年5月現在では扱えるようになっています。古いプロジェクトの場合はwebpackの上書きをしてSVGをトランスパイルするようにセットする必要があるようですが、その必要はありません。
## この際、Buttonコンポーネントに表示する方法も覚えておこう
Buttonコンポーネントにもアイコンを入れたいこともあるでしょう。
これはブロックコントロール内のButtonコンポーネントのアイコンの設定例です。svgファイルの用意の仕方は同じです。
```
import { ReactComponent as play } from './circle-play.svg';
import { ReactComponent as pause } from './circle-pause.svg';

<BlockControls>
	<Toolbar>
		<Button
			//属性 isEditMode の値により表示するラベルを切り替え
			label={is_anime ? "実行中" : "停止中"}
			//属性 isEditMode の値により表示するアイコンを切り替え
			icon={is_anime ? pause : play}
			//setAttributes を使って属性の値を更新（真偽値を反転）
			onClick={() => {
				setAttributes({ is_anime: !is_anime })
			}}
		/>
	</Toolbar>
</BlockControls>

```
このコードはpauseと playという名前でアイコンを読み込み、Buttonのクリックでis_animeを反転させて、アイコンの表示を切り替えるという例です。
この場合はicon属性にセットするのがオブジェクトなのでReactコンポーネント名の頭文字は小文字でも大丈夫です。
## WordPressが用意してくれているアイコンについて
WordPressが用意しているアイコンはいわゆるダッシュアイコンで一覧のURLは以下のとおりです。
ダッシュアイコンのページ
https://developer.wordpress.org/resource/dashicons/#database-import
これを使うのは一番簡単で先ほどのButtonコンポーネントの例でいうと
```
<Button
	icon="sticky"
/>
```
とするだけです。指定する文字列は以下のスクリーンショットのとおりです。

![Dashicons.png](https://itmaroon.net/home/wp-content/uploads/2023/07/aaa851b2eb7b47b8913e63c6beee1b16.png)

その次に種類があるのは@wordpress/icons パッケージからインポートするアイコンです。
手順としては@wordpress/iconsのインストール
```
npm install @wordpress/icons --save
```
そしてインポート
```
import { cloud, color } from '@wordpress/icons';
```
```
<Button
	icon=cloud
/>
```
という手順を踏みます。でもこれだけだとアイコン名がわからないので、[こちらのページ](https://wordpress.github.io/gutenberg/?path=/docs/icons-icon--default)から参照してください。

![Icons .png](https://itmaroon.net/home/wp-content/uploads/2023/07/550a91b05fa7497da9990c3eb31b2873.png)

この赤丸で囲んだところが指定すべき名称です。