OmniAICreator/Qiita-1.07M huggingface dataset:
IPアドレスから天気を取得するサイトを作ってみよう

# 1.はじめに
今回はIPアドレスから現在地を取得して気象情報を表示するサイトを作成してみました。
また、天気の状況によって表示される背景を変更できるようにしました。
使用したAPIは
[Open Weather Map](https://openweathermap.org/api)
[IPInfo](https://ipinfo.io/)
です。
```:環境
windows10
vscode
IP info API
Open Weather API
```

# 2.HTML
```html:index.html
<!DOCTYPE html>
<html lang="ja">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;700&display=swap" rel="stylesheet">
<head>
    <meta charset="UTF-8">
    <title>現在地の天気</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <div id="weather-container">
        <h1>現在地の天気の情報</h1>
        <div id="weather"></div>
    </div>
    <script src="weather.js"></script>
</body>
</html>

```

# 3.CSS
```css:style.css
#weather-container {
    text-align: center;
    margin-top: 150px;
}

#weather {
    font-size: 40px;
    margin-top: 20px;
}
body {
    font-family: 'Noto Sans JP', sans-serif;
}

```
# 4.JavaScript
```javascript:open weather map
async function fetchWeatherData(city) {
    const apiKey = 'API'; // OpenWeatherMapのAPIキー
    const url = `http://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${apiKey}&units=metric&lang=ja`;

    try {
        const response = await fetch(url);
        const data = await response.json();
        changeBackground(data.weather[0].main.toLowerCase());
        return data;
    } catch (error) {
        console.error("天気データの取得に失敗しました", error);
    }
}
```
```javascript:IPInfo
async function displayWeather() {
    // IPアドレスから位置情報を取得
    const ipInfoToken = 'TOKEN'; // IPinfoのトークンを設定
    const ipResponse = await fetch(`https://ipinfo.io/json?token=${ipInfoToken}`);
    const ipData = await ipResponse.json();
    const city = ipData.city; 

    // 天気情報を取得
    const weatherData = await fetchWeatherData(city);
    if (weatherData) {
        const weatherElement = document.getElementById('weather');
        weatherElement.textContent = `現在地：${city}、天気：${weatherData.weather[0].description}、気温：${weatherData.main.temp}℃`;
    }
}
```
```javascript:天気によって背景を変える
function changeBackground(weather) {
    const body = document.body;
    switch(weather) {
        case 'clear':
            body.style.backgroundImage = 'url("sunny.png")';
            break;
        case 'rain':
            body.style.backgroundImage = 'url("rainy.png")';
            break;
        case 'cloud':
            body.style.backgroundImage = 'url("cloudy.png")';
            break;
        case 'snow':
            body.style.backgroundImage = 'url("snowy.png")';
            break;
        // 他の天気条件に応じた背景を追加
        default:
            body.style.backgroundImage = 'url("default.png")';
    }
}

displayWeather();
```

# 5.完成

![SnapCrab_NoName_2023-11-21_15-26-15_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531555/8beeca00-5e27-7897-4815-7597682f6c57.png)

東京に住んでるんですけど、埼玉県になってました。
サーバーかなんかが埼玉にあるんですかね？
【Unity】VContainerとUnity Screen Navigatorを同時に使う方法。

# VContainerとは
DI（Dependency Inject）のためのUnity Packageです。

https://vcontainer.hadashikick.jp/ja/

# Unity Screen Navigatorとは
Cyber Agent所属の矢野さんが開発したUI周りの超便利Unity Packageです。

https://github.com/Haruma-K/UnityScreenNavigator/tree/master


# 今回やること
今回はUnityのアウトゲームをオニオンアーキテクチャで実装しようとしたときにUnity Screen Navigatorを使うと、当たり前ですが依存性注入できなくなったので、備忘録的に残します。

## やり方
### 1.`IPageContainerCallbackReceiver`を実装したクラスを作成する。
このインターフェースは、Unity Screen Navigatorで提供される、Pageを切り替えたとき（Push及びPop）のコールバックを実装するためのものです。

### 2.作成したクラスに`IObjectResolver`の変数を渡せるようにする。
渡す形は、DIを使っても今回の例のように単純に渡してもどちらでもよいと思います。

また、BeforePush及びBeforePopの中この変数を使って`InjectGameObject`メソッドでPageのオブジェクトを登録すると、Injectすることができます。

### 3.ページを変えるクラスでコールバックを登録する。
Unity Screen Navigatorの`PageContainer`コンポーネントで提供されている、`AddCallbackResolver`メソッドに先ほど作成したクラスのインスタンスを渡します。
そうすると、完成です！

## ソースコード
```Csharp:IPageContainerCallbackRecelverを実装したクラス(1, 2)
using UnityEngine;
using UnityScreenNavigator.Runtime.Core.Page;
using VContainer;
using VContainer.Unity;

public class VContainerPageCallbackRegister : IPageContainerCallbackReceiver
{
    private IObjectResolver _resolver;
    public VContainerPageCallbackRegister(IObjectResolver resolver)
    {
        _resolver = resolver;
    }
    public void BeforePush(Page enterPage, Page exitPage)
    {
        _resolver.InjectGameObject(enterPage.gameObject);
    }
    // 続く...
}
```
```Csharp:ページを変えることを司るクラス（3）
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityScreenNavigator.Runtime.Core.Page;
using VContainer;
using VContainer.Unity;

public class MainScreenPageManager : IInitializable
{
    private PageContainer _miniPageContainer;
    private IObjectResolver _resolver;

    [Inject]
    public MainScreenPageManager(PageContainer miniPageContainer, IObjectResolver resolver)
    {
        _miniPageContainer = miniPageContainer;
        _resolver = resolver;
    }

    public void Initialize()
    {
        _miniPageContainer.AddCallbackReceiver(new VContainerPageCallbackRegister(_resolver));
    }
    public async void ChangePage(string pageName)
    {
        _miniPageContainer.Push(pageName, true).ToUniTask(); 
    }
}
```

# おわり
オニオンアーキテクチャ、意外に分かりやすくて実装していて楽しいです。
また、今回紹介した２つのパッケージ神なのでぜひ使ってください。
では、また。
Neither the property "_token" nor one of the methods "_token()", "get_token()"/"is_token()"/"has_token()" or "__call()" exist and have public access in class "Symfony\Component\Form\FormView"

<h2>CSRF保護が有効になっているのが原因</h2>
symfony 2.8 で作成されたウェブサイトを symfony 6 台で再構築している時に表題のエラーが表示されました。
Symfony では CSRF (クロスサイト リクエスト フォージェリ)からの保護がデフォルトで有効になっているようです。<br>

通常のウェブサイトの運営であれば有効な方が良いとは思いますが、
今回は、ひとまず開発を先に進めるため旧サイトの設定（CSRF保護は無効）に合わせ、有効化についてはクライアントと相談する事にします。

<h4>①CSRF 保護有効/無効のパッケージをインストール</h4>

```powershell 
composer require symfony/security-csrf
```

<h4>②config/packages/framework.yaml の framework以下に csrf_protection: ~ を追加（CSFR保護の無効化）</h4>

```config/packages/framework.yaml
framework:
    csrf_protection: ~
```
公式ドキュメント通りなのですが、エラーメッセージで検索してすぐに分からなかったので、投稿することにしました。

<h2>参考</h2>
CSRF 保護を実装する方法

https://symfony.com/doc/current/security/csrf.html


https://github.com/lexik/LexikMailerBundle/issues/68
TOP Y MACHINERY CO.,LTD

TOP Y MACHINERY CO.,LTD

https://www.xinyaopack.com/

+86-757-27832571

info@topymachinery.com

Auger Filler for powders, Filling machine for liquids, Linear weigher for granules

301-302, 3# Building, Qide Industrial Park, Beijiao Town, Shunde District, FoShan City 528311, Guangdong,China



TOP Y MACHINERY CO.,LTD was founded in October 2011,locates in Qide Industrial Park, Beijiao Town. We are integrated company with R&D, building, marketing and providing after-sale services backup.We are dedicated in producing all kind of packing machines and filling machines:These products are widely used in foods,toys and ironware industries.
TOP Y MACHINERY CO.,LTD believes in machine innovation and design. We gather up persistent efforts and technology to aim at customers’ satisfaction quality. We are keen to better detailed design and engineers work on every working stage in the drafts. In the working shop the workers assemble the whole machine by batches to make sure each batch works well first. “Customers First” to ensure customers get good quality machines and also let us win good reputation in customers. We are ready to provide quality machines and sincerely hope to have chances to cooperate with you.
AIイラストの投稿や閲覧ができるウェブアプリがリリース


近年、AI技術の進化により、様々な分野で新たな可能性が広がっています。その中でも注目を集めているのが、AIによって生成されたアート作品です。如月翔が2023年にスタートさせた「AIアートワークス」は、この分野における新たな一翼を担うウェブアプリケーションです。

本記事では、AIアートワークスの概要や特徴、そしてその魅力に迫ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625387/e159a3aa-8526-2c49-11c4-cf25b829650c.png)

（画像：AI Art Works）

## AIアートワークスのご紹介

AIアートワークス（AI Art Works・[https://aiarts.work/](https://aiarts.work/)）は、AIによって生成された画像やイラストを集めたフォトギャラリーです。

このプラットフォームでは、ユーザーが自身のAI作品を投稿し、他のユーザーと共有することができ、更にはその作品から利益を得ることも可能です。これにより、アートの創造と共有がより身近になり、多くの人々がAIアートに触れる機会が広がります。

## 今世紀を代表するAIアートギャラリーアプリ

AIアートワークスは、今世紀を代表するAIアートギャラリーアプリの一つとして確立されることを目指しています。如月翔は、これまでのアートの在り方に新たな風を吹き込むべく、AI技術を駆使してこのサービスを開始しました。

彼の持つ哲学は、誰もが自分の創造性を発揮し、独自のAI作品を生み出し、それを広くシェアできる環境を提供することです。

## 誰がAIアートワークスを運営しているか

如月翔は、AIアートワークスを運営する主要なフィギュアの一人です。彼はAI技術とアートへの情熱を結集し、多くの人々に新しい形のアート体験を提供しています。

彼のリーダーシップのもと、AIアートワークスは着実に成長し、世界中のアーティストやアート愛好者が集まるプラットフォームとなることが期待されています。

## AIアートワークスの使用例

ユーザーはAIアートワークスを通じて、様々な使い方ができます。例えば、自身のポートフォリオの一環としてAI作品をアップロードし、他のユーザーからのフィードバックを得ることができます。

また、お気に入りのAI作品を見つけた際には、それを簡単に友達やSNS上でシェアすることも可能です。

さらに、タグ付け機能や組み込まれた機械学習によるオブジェクトの検出、ディープラーニングベースの類似画像分類機能など、ユーザーがより効果的に作品を管理できる機能も充実しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625387/0cdb2fdf-a1af-047b-662a-2bc33c2d9885.png)

（画像：AI Art Works "What is AI Art Works?"）

## おわりに

AIアートワークスは、AI技術とアートが融合した先駆的なプロジェクトの一環として、アートの未来を切り開いています。

如月翔のビジョンのもと、ユーザーは自由な発想でAIアートを楽しむとともに、世界中のアートコミュニティと交流することができます。本ウェブアプリケーションを通じて、新しい形のアート表現が広がり、創造性の可能性が無限大となることでしょう。

最後まで読んでいただき、ありがとうございました。
Video-Text As Game Players: Hierarchical Banzhaf Interaction for Cross-Modal Representation Learning

# 1. 概要
ビデオとテキストをマルチバリエイト協力ゲーム理論でゲームプレイヤーとして創造的にモデル化し、多様な粒度、柔軟な組み合わせ、曖昧な強度で微細な意味的相互作用を巧みに処理する手法。

---
# 2. 新規性

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/2ea50d4b-ee8f-d215-f488-4ebb3a4fb2bf.png)

粗粒でグローバルな相互作用を明確化し、さらなる精度向上を達成するためには、細粒なクロスモーダル学習のために困難なシェルブレイキングの相互作用に直面する必要がある。本手法では、ビデオとテキストをマルチバリエイト協力ゲーム理論でゲームプレイヤーとしてクリエイティブにモデル化し、多様な粒度、柔軟な組み合わせ、曖昧な強度で微細な意味的相互作用を賢く処理している。

---
# 3. 実現方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/0db9bc6b-6cd2-340b-2e81-f838a614b9b1.png)

ビデオフレームとテキストワードの間の可能な対応関係を評価するために、階層的バンツハフ相互作用（HBI）を提案し、敏感で説明可能なクロスモーダルコントラストを実現する。複数のビデオフレームと複数のテキストワードの協力ゲームを効率的に実現するために、提案手法は元のビデオフレーム（テキストワード）をクラスタリングし、マージされたトークン間のバンツハフ相互作用を計算する。トークンマージモジュールを積み重ねることで、異なる意味的レベルでの協力ゲームを達成する。

---
# 4. 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/283e1f65-a9d2-9e6e-f407-86ffd29143fc.png)

一般的に使用されるテキスト-ビデオ検索とビデオ-質問回答のベンチマークでの幅広い実験で、本手法のHBIの有効性が証明された。さらに、クロスモーダル相互作用の理解を促進する視覚化ツールとしても機能し、学術コミュニティに重要な影響を与える可能性がある。

---
Paper URL: 
https://openaccess.thecvf.com/content/CVPR2023/papers/Jin_Video-Text_As_Game_Players_Hierarchical_Banzhaf_Interaction_for_Cross-Modal_Representation_CVPR_2023_paper.pdf
Actionlet-Dependent Contrastive Learning for Unsupervised Skeleton-Based Action Recognition

# 1. 概要

アクションレット依存の対比学習法（ActCLR）。アクションレットは、人間の骨格の識別的な部分集合と定義され、より良いアクションモデリングのために動作領域を効果的に分解する。

---
# 2. 新規性

自己教師あり事前学習のパラダイムは、骨格ベースのアクション認識で大きな成果をあげているが、これらの手法では動きと静止した部分を同等に扱っており、異なる部分に適応的な設計が欠如しているため、アクション認識の精度に悪影響を及している。本手法では両方の部分に適応したアクションモデリングを実現している。

---
# 3. 実現方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/7a1c0385-4de8-11d2-0426-0941ff60c740.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/5bd2e0bb-8847-c913-10d4-a12b73834239.png)


動きのない静止したアンカーと対比させることで、非教師付きの方法で骨格データの動作領域を抽出し、それをアクションレットとして利用し、アクションレットを中心に、動作適応型のデータ変換方法を構築する。アクションレットと非アクションレットの領域には異なるデータ変換が適用され、より多様性を導入しながらそれぞれの特徴を保持する。同時に、運動と静止領域の特徴表現を、意味に敏感な特徴プーリング法を用いて区別的に構築する。

---
# 4. 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/cd43177e-3ce5-5cd6-ebbb-9ed7067d73ba.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/5deb48f3-d7f9-b46e-5c5e-d81fafa90e77.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/64c4ed90-9783-35e1-8200-65cb9cfcf7ed.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/09de15bf-7680-294f-78c8-23e5ac096105.png)

NTU RGB+DとPKUMMDでの多くの実験により、提案手法が優れたアクション認識性能を達成することが示された。さらなる可視化と定量的な実験により、私たちの手法の有効性が示されている。

---
Paper URL: 
https://openaccess.thecvf.com/content/CVPR2023/papers/Lin_Actionlet-Dependent_Contrastive_Learning_for_Unsupervised_Skeleton-Based_Action_Recognition_CVPR_2023_paper.pdf
screen の paste buffer をスクリプトで設定する

# 背景

Mac では `pbcopy` コマンドでクリップボードの内容を設定できます。スクリプトの結果をクリップボードにコピーするなど、コマンドラインでクリップボードを扱うときに便利です。

`pbcopy` と同じように、[GNU Screen](https://www.gnu.org/software/screen/) の paste buffer を設定するコマンドがあると便利だと考えました。

# screen の paste buffer は readbuf コマンドで設定する

`screen` の paste buffer は [readbuf コマンド](https://www.gnu.org/software/screen/manual/html_node/Screen-Exchange.html#Screen-Exchange) で設定できます。

# screen.readbuf という関数にまとめた

以下の関数を作成しました。これを `.bashrc` などに書いておきます。

```bash:.bashrc
function screen.readbuf
{
    if [[ "${STY:-}" == '' ]]; then
        echo 'Not in screen.' >&2
        exit 1
    fi

    # 一時ファイルのパス.
    declare -r exchange_file_path='/tmp/screen-exchange'

    if [[ -p /dev/stdin ]]; then
        # パイプ経由で実行された場合は, その内容を一時ファイルに書き出す.
        cat > "${exchange_file_path}"
    elif [[ $# == 0 ]]; then
        echo 'File not specified.' >&2
        exit 1
    else
        # ファイルが指定された場合は, その内容を一時ファイルに書き出す.
        cat "$@" > "${exchange_file_path}"
    fi

    # 一時ファイルの内容を paste buffer に読み込む.
    screen -S "${STY}" -X readbuf "${exchange_file_path}"

    # 一時ファイルを削除する.
    rm "${exchange_file_path}"
}
```

次のように呼び出すことで `screen` の paste buffer を設定できます。

```bash
# ファイルの内容を paste buffer に設定する.
$ screen.readbuf /path/to/file

# 他のコマンドの結果を paste buffer に設定する.
$ echo 'Hello' | screen.readbuf
```

`screen` にスクリプトからコマンドを送る方法は [screen のカレントディレクトリをココに変更する](https://qiita.com/suzuki-kei/items/665f1805b0a315bb3e83) の [screen.chdir の解説](https://qiita.com/suzuki-kei/items/665f1805b0a315bb3e83#screenchdir-%E3%81%AE%E8%A7%A3%E8%AA%AC) を参照ください。
QPGesture: Quantization-Based and Phase-Guided Motion Matching for Natural Speech-Driven Gesture Generation

# 1. 概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/5f5c5f92-d90f-8f4d-29e2-5e8a0f9ca39f.png)

新しい量子化ベースのモーションマッチングフレームワーク。既存手法と比較して、ジェスチャー生成の品質を向上させている。

---
# 2. 新規性

ランダムな揺れと音声との非同期性の理由により、人間らしく、適切なジェスチャーを生成することは難しい。既存の研究ではニューラルネットワークを使用して問題を解決しようとしているが、その結果が制約されている。最近の研究でもこの問題は解決されておらず、モーションマッチングベースの手法が最も効果的であることが示されている。本手法では、ランダムな揺れに対処するための低次元かつ離散的な表現と、音声とジェスチャーのアライメントを改善するためのレーベンシュタイン距離に基づく手法が含まれている。さらに、フェーズを使用して適切な音声とテキストの候補を選択することで、ジェスチャー生成の精度を向上させる。

---
# 3. 実現方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/ca07650c-4d5d-207d-9a22-2addcb368fde.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/d7bbc05e-cf6d-8146-ccd8-426758b09221.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/30d4bb1b-159a-b912-375e-e2270ee3c947.png)

ジェスチャーモーションの連続したシーケンスとモーションデータベースを、自動的に離散化された形式に前処理する。それから、音声の最適な候補とテキストの最適な候補をそれぞれ見つけ、最後に、シードコードに対応するフェーズと2つの候補に対応するフェーズに基づいて最適なジェスチャーを選択する。

---
# 4. 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/dcc7211b-eefc-1e11-044d-c13e07d2be9e.png)

BEATデータセットを用いて、人間のジェスチャー生成のためのモデルを提案している。データセットは、トレーニング、バリデーション、テストの割合を8:1:1に分けて使用した。また、上半身の関節に対応する15のジョイントを使用し、姿勢の次元数は9である。さらに、コードブックのサイズは512、動きのマッチングには音声とテキストの情報が使用された。モデルのトレーニングには、VQ-VAEとGRUを使用し、オプティマイザはADAMとAdamWを使用した。評価指標として、ジェスチャーの速度ヒストグラムの距離、Frechetジェスチャー距離、人間の動作のスピード分布と比較したHellinger距離などを使用した。実験の結果、提案モデルが他のモデルに比べて優れたパフォーマンスを示し、ユーザースタディでも高い評価を得た。さらに、各モデルの各要素の有効性を検証するためのアブレーションスタディも行われた。この研究によって、ジェスチャー生成のモデルの最新のアプローチとその評価結果が示された。

---
Paper URL: https://openaccess.thecvf.com/content/CVPR2023/papers/Yang_QPGesture_Quantization-Based_and_Phase-Guided_Motion_Matching_for_Natural_Speech-Driven_Gesture_CVPR_2023_paper.pdf
ダイクストラ法（Dijkstra's Algorithm）をPythonで実装する

# この記事で得られるもの
- ダイクストラ法の手順
- Pythonでの実装例

# 環境
- Google Colaboratory

# 背景
大学で離散数学の講義を取っていたのですが、理論を学び、演習として手計算をするという形式でした。

この講義の試験では資料等の持ち込みが許可されていたため、
**「アルゴリズム実装して持ち込めば計算しなくて良くない？」**
と思い、作成しました。

「アルゴリズムをそのまま実装する」という部分に重きを置いているため、効率や読みやすさは重視していません。

# ダイクストラ法の手順
1. 始点の頂点を決定し、その頂点からの最短距離を0と設定する
2. 始点以外の全ての頂点への最短距離を無限大に設定する
3. 未訪問の頂点の中で最短距離が最小の頂点を選ぶ
4. 3で選ばれた頂点から直接接続されている各頂点について、その頂点までの距離（選ばれた頂点までの最短距離 + 選ばれた頂点からその頂点へのエッジの重み）が現在記録されている最短距離よりも小さい場合は、最短距離を更新する
5. 3～4を、未訪問の頂点がなくなるまで繰り返す

# 実装例

## ダイクストラ法
~~~python
import heapq

def shortest_path(graph, start, end):
    queue = [(0, start, [])]
    seen = set()
    mins = {start: 0}
    while queue:
        (cost, node, path) = heapq.heappop(queue)
        if node not in seen:
            seen.add(node)
            path = path + [node]
            if node == end:
                return cost, path

            for next_node, next_cost in graph[node].items():
                prev_cost = mins.get(next_node, None)
                next_cost += cost
                if prev_cost is None or next_cost < prev_cost:
                    heapq.heappush(queue, (next_cost, next_node, path))
                    mins[next_node] = next_cost

    return float("inf"), []

~~~

## 使用例
以下のグラフを例として考える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998181/677f08ea-f8e2-3188-89ec-503a7863b462.png)

~~~python
# define graph
graph = {
    'v0':{'v1':8,'v2':3, 'v3':1},
    'v1':{'v0':8,'v2':3,'v4':1},
    'v2':{'v0':3,'v1':3,'v4':4},
    'v3':{'v0':1,'v4':2},
    'v4':{'v1':1,'v2':4,'v3':2}
}    

# Create a list of all vertices
vertices = ['v' + str(i) for i in range(0, 5)]

# Iterate over all pairs of vertices
for start in vertices:
    for end in vertices:
        # Skip if start and end are the same
        if start == end:
          cost, path = '-','-'
        else:
          cost, path = shortest_path(graph, start, end)
        print(f"{start} to {end} : {cost}, {path}")
~~~

結果
~~~
v0 to v0 : -, -
v0 to v1 : 4, ['v0', 'v3', 'v4', 'v1']
v0 to v2 : 3, ['v0', 'v2']
v0 to v3 : 1, ['v0', 'v3']
v0 to v4 : 3, ['v0', 'v3', 'v4']
v1 to v0 : 4, ['v1', 'v4', 'v3', 'v0']
v1 to v1 : -, -
v1 to v2 : 3, ['v1', 'v2']
v1 to v3 : 3, ['v1', 'v4', 'v3']
v1 to v4 : 1, ['v1', 'v4']
v2 to v0 : 3, ['v2', 'v0']
v2 to v1 : 3, ['v2', 'v1']
v2 to v2 : -, -
v2 to v3 : 4, ['v2', 'v0', 'v3']
v2 to v4 : 4, ['v2', 'v4']
v3 to v0 : 1, ['v3', 'v0']
v3 to v1 : 3, ['v3', 'v4', 'v1']
v3 to v2 : 4, ['v3', 'v0', 'v2']
v3 to v3 : -, -
v3 to v4 : 2, ['v3', 'v4']
v4 to v0 : 3, ['v4', 'v3', 'v0']
v4 to v1 : 1, ['v4', 'v1']
v4 to v2 : 4, ['v4', 'v2']
v4 to v3 : 2, ['v4', 'v3']
v4 to v4 : -, -
~~~
Masked Image Modeling With Local Multi-Scale Reconstruction

# 1. 概要

既存のマスク画像モデル（Masked Image Model: MIM）と比較して、事前学習のコストが少なく、複数のタスクで優れたパフォーマンスを示すモデル。

---
# 2. 新規性

MIMモデルは通常、計算負荷が大きく、学習プロセスが重い。それが産業応用への不可避の障害となっている。MIMでは下位層が重要な役割を果たしているにも関わらず、既存のMIMモデルでは再構築タスクはエンコーダーの上位層のみで行われている。本手法では、目標信号を推論するために非自明なパッチ間の相互作用を、下位層および上位層を含む複数のローカル層に適用する。

---
# 3. 実現方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/515bb033-4696-e5fe-eceb-bc3aad3f3841.png)

複数の層で異なるスケールの情報を学習することを期待しているため、下位層は微細なスケールの補完信号を、上位層は粗いスケールの補完信号を再構築する。この設計により、複数の層を明示的にガイドすることで表現学習プロセスを大幅に加速するだけでなく、入力のマルチスケールの意味理解を容易にする。

---
# 4. 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/6d62d434-37d5-5789-f9f0-5310d897da91.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/381a19c2-a122-80e2-db04-12ad94040cfb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/9944d5f6-d3c0-0c2c-088b-ccd8611fa308.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/c9f0feee-622e-5e22-a2ae-bbeff50d86b4.png)


既存のMIMモデルと比較し、ImageNet-1K上での事前トレーニング効率とトップ1ファインチューニング精度を評価した。ViT-Bでは、LocalMIMはMAEとMaskFeatに対してそれぞれ3.1倍と5.6倍の加速度を実現し、Swin-BではSimMIM192とGreenMIM に対してそれぞれ3.6倍と6.4倍の加速度を実現した。最終的なトップ1ファインチューニング精度に関しては、ViT-Bでは84.0％、Swin-Bでは84.1％の精度を達成した。先行研究と比べて、LocalMIMはより少ないトレーニング時間で同等のパフォーマンスを達成している。さらに、LocalMIMはADE20K上の意味的セグメンテーションやCOCO上の物体検出とセグメンテーションにも適用でき、優れた結果を示している。また、ViT-BとSwin-Bのアブレーションスタディも行い、HOG特徴、マスク比、デコーダの設計など、さまざまな要素の影響を評価した。最後に、LocalMIMのSelf-Attention Mechanism(自己注意機構)の分析結果を示し、クエリ位置に応じて異なる関心領域を特定する能力を持つことを示した。

---
Paper URL: https://openaccess.thecvf.com/content/CVPR2023/papers/Wang_Masked_Image_Modeling_With_Local_Multi-Scale_Reconstruction_CVPR_2023_paper.pdf
Lapras.comの市場価値スコア(α版)の結果

## Lapras信者なのか？

いえ、違います。
当初はフリーランス案件紹介サービスだったので使っていたら、ランキングが出るので面白くてまだ使ってます。

## Lapras.comの市場価値スコア(α版)とは


```
「市場価値スコア」は、あなたの ITエンジニア転職マーケットでの競争力を表す 指標で、職歴情報（職歴、職務要約、活かせる経験・スキル）から計算されます。

技術力スコアなどと同じく1.0〜5.0の数値で表されます。

スコアの計算方法
職歴情報の経験の内容や長さからどの年収帯の求人の要件を満たしているかを判定し、そのカバー率などをスコアとして表しています
LAPRASの求人情報とその年収情報を利用して職種・年収帯ごとのスキル条件を作成しています。職歴情報から、そのスキル条件をどれくらいクリアしているかを判定しています。

年収の高い求人に求められる募集要項を満たしていたり、幅広い求人の募集要項を満たしているとスコアが高くなります。
```

https://news.intercom.com/lapras/news/34781


## Lapras.comの市場価値スコア(α版)の結果

どの値も、登録している方の相対的なスコアになるので、ユーザー数が増えると下がると思います。
だからといって、スコア上げてる様に頑張るかと言うと、普通に仕事で手一杯で、やっぱブログも長続きしないなというのが現状です。

![lapras市場価値.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39256/9c74b9cb-c3f8-2b60-3cc9-2f93c9dac7ed.png)

https://lapras.com/public/nakamoto

## 起業・転職・フリーランス・プログラミング研修・エンジニア採用コンサルティングのご相談


https://park.jp/service_menu/2491


- 60分の人生相談を行っております。
- 企業の方は初回限定割引はご利用できません。
- 企業向けDXコンサルティングは年間契約でお受けしております。


https://park.jp/service_menu/2491



## 自分でもサービスを販売したい方へ

副業として無形のサービス提供をする場合、できるだけ手数料を下げて、安心して支払ってもらうスキル販売ショップサービス、【PARK】のご紹介です。

- クラウドワークスが運営
- 販売手数料 3%・決済手数料 3.5% + 40円/件
- サービスを提供する予定がなくてもストレスを減らす方法で使える（⇠重要）
↓ご登録はこちらから↓

[クラウドワークス運営スキル販売ショップPark](https://park.jp/?outer_ref=INV-BU076T "クラウドワークス運営のスキル販売ショップPark")
M5stackのIMUセンサーの数値の動き方

arduinoのシリアルプロッターでM5stackGoのセンサーの動きを観察してみた。

# きっかけ
以下の記事で加速度センサーの動きの解説をみた際に実際に動きを試したくなった。
https://note.com/plenproject/n/n2d4a7495f947



# 加速度センサー３軸
　縦方向に45度UP→90度（画面が見える）→元に戻す→横に45度倒す→横90度
![スクリーンショット 2023-11-21 14.15.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624849/63f817a3-1d0a-69f2-f295-3b8b6134859a.png)

　正しくスクワット
 ![スクリーンショット 2023-11-21 14.39.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624849/4e320149-2812-2f82-74f0-584131f65437.png)

　前後に動きながらフォームを崩すスクワット→ガニ股スクワット
 ![スクリーンショット 2023-11-21 14.40.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624849/1822b1f7-fe74-0629-41fa-e980ee38bfef.png)


# 角速度センサー３軸
　45度UP→90度UP→ゆっくり45度Down→一気に45度Down
![スクリーンショット 2023-11-21 14.20.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624849/d0667149-fc58-0523-9c67-ca38854399ed.png)

　横に90度→静止→元に戻す
![スクリーンショット 2023-11-21 14.25.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624849/24c307f0-371f-8676-2212-a547cd54d7c6.png)

　正しくスクワット
 ![スクリーンショット 2023-11-21 14.33.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624849/49542a4b-c27c-b7db-db1b-fb09b2999b90.png)
 
　左から正しいスクワット→前後に動きながらフォームを崩すスクワット→ガニ股スクワット
 　![スクリーンショット 2023-11-21 14.35.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624849/62bed68b-b8e3-a758-3e45-212d5408df3d.png)
スクラムよくあるアンチパターン6選


1個目
タイムボックス超えるようならそこでイベントを終わらせる 
 　頑張って詰めようとしない 
 　ただし終わらないイベントがあった場合、次は終わるために工夫を毎スプリントなにかしら考える 

2個目
スピード感
 どちらでもいいことも、多人数で議論や確認しようとするクセがある人がいる
　設計の方針の共有は全員にする必要はあるが、全員で設計からどうしようか考えるのは人数分開発工数の無駄
　設計は2-3人で、共有は全員での考え方が一番丸い
　SMが心の中でテックリーダーを決めて、その人に頼るスタンスが良いかと。
　フロントAさん、バックBさんみたいに

3個目
完璧を目指しすぎ
　チームメンバーが最低限一人一人頑張って成長してさえいればスクラムとしては成功。
　そのくらい肩の力を抜いてたほうが雰囲気が良くなり結果開発速度があがる

4個目
 スラックのタスク管理
 依頼したこと、されたことをスラックのブックマーク機能で忘れずしないと埋もれちゃうので死ぬ

5個目
　SMがどちらかといえば完全にdev寄りになっている
　SMがdev寄りだと望ましくないし、そうでない場合と比べてチームの開発効率が落ちます。
　POとの信頼関係に弊害が出たり、POがスクラムとして正しい振る舞いをおこなうことに弊害が出てしまう
 
6個目
　SMがベンダー視点
　POがお客様かつお客様として扱うと、指摘などがしづらくなる。
　結果として
　POがスクラムとして正しくない振る舞いをしても是正がしづらいので望ましくない。
　ビジネスの関係なので丁寧さは必要ですが、下手に出るのは弊害がある。
Understanding and Improving Features Learned in Deep Functional Maps

# 1. 概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/f41e6a89-deb6-4dbd-c0fe-36b79f8c12a2.png)

Deep functional mapsは、非剛体3Dシェイプ対応タスクにおいて成功している。特に、学習された特徴量は、直接異なる形状間で比較できる点ごとの記述子として使用することができ、また、学習された特徴の構造的特性を促進する改良を提案し、理論的な特性を促進する簡単なアーキテクチャの変更によってDeep functional maps特徴抽出の外向型アーキテクチャを改善することが可能である。これにより、形状マッチングの成功に必要かつ十分な条件を提供し、内在的および外在的表面ベースの学習のギャップを埋めることができる。

---

# 2. 新規性

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/6729c607-25dc-ff18-bd51-df9c7e28e91c.png)

形状間の対応付け問題に対する新しい深層学習パイプラインを提案している。このパイプラインは、形状間の機能的なマップを学習することにより、独自の手法と既存手法の違いを強調する。このパイプラインでは、形状の特徴量を抽出するためのニューラルネットワークを用いており、この特徴量を基に最適化された機能的なマップを求めることができる。また、このパイプラインは、学習データが制限されている場合でも使用でき、教師あり・なしの両方の損失関数を使用することができる。しかし、この手法ではニューラルネットワークの特徴量を用いて最適化を行うことが目的であり、実際に抽出された特徴量がどのように使用されるかは不明である。

---

# 3. 実現方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/fc8e5877-3ec7-f3d0-5d61-dc887ae6beae.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/ac6a1b2a-b670-3516-1f29-34a25d4a856b.png)

深層学習を用いた関数マップにおいて、プローブ関数を用いた点毎の記述子と、従来の関数マップによる点対応との等価性を実証し、より高精度な点対応を得るための手法を提案している。それにより、既存手法では失敗する困難な場合でも、より高い精度を得ることができる。具体的には、互換性が期待できる正しい構造条件を持つ堅牢な関数マップを使用することで、より高い精度を得ることができる。また、特徴抽出器においては、Laplacian基底によるスムーズな特徴を取り扱うことを提案している。

---

# 4. 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/67254e78-18c9-40b3-5c2c-cbb6bc36ac20.png)

FAUST、SCAPE、SHREC'19など5つのデータセットを使用し、外部特徴抽出器DGCNN、DeltaConv、および内部特徴抽出器DiffusionNetを使用して、実験を行った。結果として、提案手法が、すべての機能抽出器で性能を向上させ、特に元の特徴抽出器で失敗していた場合でも、同等の結果を得られることがわかった。また、習得された特徴が幾何学的な意味を持ち、またp2pマップを計算しなくても直接形状マッチングに使用できることを明らかにした。最後に、ランダムな点座標よりも事前にトレーニングされた特徴が、他のタスクに対しても一定の汎化能力を持つことを示した。

---

Paper URL: https://openaccess.thecvf.com/content/CVPR2023/papers/Attaiki_Understanding_and_Improving_Features_Learned_in_Deep_Functional_Maps_CVPR_2023_paper.pdf
AtCoder ABC327 D問題をRustで実装してみた

# はじめに
最近、就活関係でアルゴリズムについて聞かれることが多くなり、勉強しようとAtCoderを久しぶりやったら全然解けませんでした。研究ではPythonを多用していますが、競プロにおいてはRustを使いたいと思っているため勉強中です。


今回対象にするのはこの問題です。DFSを使った基礎的な二部グラフ判定の問題です。
- [AtCoder ABC327 D問題](https://atcoder.jp/contests/abc327/tasks/abc327_d)
- [AtCoder ABC327 D問題 公式解説](https://atcoder.jp/contests/abc327/editorial/7578)

# D問題の公式解説はC++でDFSを使って解いている
詳細な解説は、[前述のリンク](https://atcoder.jp/contests/abc327/editorial/7578)から読んでください。

Rustで書き換えます。再帰で借用は書いたことなかったため、試行錯誤しながら書きました。色々通って結局これに落ち着きました。


借用とかたいそうな名前がついていますがただのポインタとして扱えば何も問題ないなと一人で勝手に腑に落ちてました。

```rust:good_tuple_problem.rs
use proconio::input;
use std::collections::HashSet;

fn dfs(graph: &Vec::<HashSet::<usize>>, x:&mut Vec::<isize>, node:usize, value: usize) -> bool{
    x[node] = value as isize;
    for i in &graph[node] {
        if x[node] == x[*i] || (x[*i] == -1 && !dfs(graph, x, *i, 1 - value)){
            return false;
        }
    }
    return true;
}

fn main() {
    input! {
        n: usize,
        m: usize,
        a: [usize; m],
        b: [usize; m],
    }

    let mut x = vec![-1_isize; n];
    let mut graph = vec![HashSet::<usize>::new(); n];
    for i in 0..m {
        graph[a[i]-1].insert(b[i]-1);
        graph[b[i]-1].insert(a[i]-1);
    }
    let graph = graph;

    for i in 0..n {
        if x[i] == -1 && !dfs(&graph, &mut x, i, 0){
            println!("No");
            std::process::exit(0);
        }
    }
    println!("Yes");
}

```
【javascript】urlの文字列編集

# コード
```javascript

var url1 = "http://192.168.55.33/nnnnnn/aaaaaaa";
 var match = url1.match(/\/\/[^/]+(\/.*)/);
 console.log(match ? match[1] : url1);

  var url2 = "https://192.168.55.33/aaa/";
   var match = url2.match(/\/\/[^/]+(\/.*)/);
    console.log(match ? match[1] : url2);


var url3 = "http://192.168.55.33";
 var match = url3.match(/\/\/[^/]+(\/.*)/);
 console.log(match ? match[1] : url3);

```

```javascript
const url1 = new URL("http://192.168.55.33/nnnnnn/aaaaaaa");
console.log(url1.pathname);

const url2 = new URL("https://192.168.55.33/aaa/");
console.log(url2.pathname);

const url3 = new URL("http://192.168.55.33");
console.log(url3.origin);

const url4 = new URL("http://192.168.55.33/nnnnnn/aaaaaaa");
console.log(url4.host);

```

# 結果
```javascript

"/nnnnnn/aaaaaaa"
"/aaa/"
"http://192.168.55.33"
"192.168.55.33"
```

# 参考
```javascript
URL {
  href: 'https://example.com/path?param1=value1&param2=value2',
  origin: 'https://example.com',
  protocol: 'https:',
  username: '',
  password: '',
  host: 'example.com',
  hostname: 'example.com',
  port: '',
  pathname: '/path',
  search: '?param1=value1&param2=value2',
  searchParams: URLSearchParams { 'param1' => 'value1', 'param2' => 'value2' },
  hash: ''
}
```
Progressive Transformation Learning for Leveraging Virtual Images in Training

# 1. 概要

UAV（無人航空機）で人物を検出するには、大量のデータが必要だが、手作業でのデータ作成はコストがかかる。そのため、仮想画像を実画像に近づけることで、徐々に訓練データセットを拡張する手法がある。ただし、画質低下の問題が発生することがある。そこで、本手法であるPTLでは、仮想画像のプールから差異を考慮したサブセットを選択し、選択された仮想画像をリアルに近づける変換を施してから、トレーニングセットに追加することで拡張する。そして、対象物検出器の特徴表現空間を多変量正規分布としてモデル化し、マハラノビス距離を計算することで、ドメインの差異を評価する。

---

# 2. 新規性

トランスフォーメーションジェネレータのトレーニング時に現実的にトランスフォームされた仮想画像の一部を使用し、全体を一度に拡張するのではなく、増加するトレーニングセットを段階的に拡大することで、本手法は現実画像と仮想画像間のドメインギャップを回避することを目的としている。また、特徴量空間のマハラノビス距離によって、新しい画像と各カテゴリの分布の間のドメインギャップを計測する。

---

# 3. 実現方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/bdcdb230-ea21-dd07-8d6f-49d9010e3f35.png)
![image.png](/.attachments/image-69043ab7-f7e3-4c76-9c3f-a878be8d9535.png)
Progressive Transformation Learningによってトレーニングセットを拡張することで、検出器の性能を向上し、仮想画像と現実画像の差異を回避する。検出器には、シグモイド関数を使用し、多変量ガウス分布で表現される表現空間にカテゴリをモデル化する。また、現実世界の画像の収集が難しい場合には、Progressive Transformation Learningを使用し仮想画像から現実画像を生成して、現実画像のセットで学習される人物検出モデルを構築することを試みる。これにより、人物領域にフォーカスを当てつつ、仮想画像の細かいスタイルを維持することが可能になる。


---

# 4. 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/ab207fcb-f327-6bf4-ae5e-561876631646.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/14d0dcde-f06d-d3ac-cec1-6977f035f328.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/7a16a96e-de22-5899-451c-b59a4e8c12f1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/4d708518-861a-d2ab-c444-7c3853ac5a3c.png)

VisDrone、OkutamaAction、ICG、ArchangelSyntheticなどのデータセットを用いて実験を行い、PTLの有効性を確認した。結果として、PTLによって訓練セットに仮想画像を追加すると、検出精度が著しく改善されることがわかった。さらに、ドメイン間の差異を考慮した仮想画像変換手法をPTLに適用することで、より高い検出精度が実現された。

---

Paper URL: 
https://openaccess.thecvf.com/content/CVPR2023/papers/Shen_Progressive_Transformation_Learning_for_Leveraging_Virtual_Images_in_Training_CVPR_2023_paper.pdf
Magic3D: High-Resolution Text-to-3D Content Creation

# 1. 概要

DreamFusionは事前に学習されたテキストから画像に変換するモデルを使用し、Neural Radiance Fields（NeRF）の最適化を行うことで、テキストから3D合成で驚くべき結果を得た。しかしながら、Dreamfusionには2つの限界がある：（a）NeRFの最適化が非常に遅いこと、（b）NeRFの低解像度な画像空間でのスーパーバイズが低品質の3Dモデルを導き、処理時間が長くなること。本論文では、これらの限界に取り組み、2段階の最適化枠組みを利用することで、限界を解決する。まず、低解像度のdiffusion priorを使用して、荒いモデルを取得し、スパースな3Dハッシュグリッド構造を用いて加速する。荒い表現を初期化として使用し、高解像度のlatent diffusion model(LDM)と相互作用する効率的なdifferentiable rendererを用いてテキスチャ付きの3Dメッシュモデルをさらに最適化する。

---
# 2. 新規性

Magic3Dは、DreamFusionよりも2倍速く、40分で高品質の3Dメッシュモデルを作成できる。また、解像度も高くなっており、DreamFusionよりも優れている。ユーザーの評価では、61.7％の評価者がDreamFusionよりも本手法を好むことが分かった。画像条件付きの生成能力と合わせて、新しい3D合成の制御方法を提供し、様々なクリエイティブアプリケーションに新しい可能性を開くことができる。

---
# 3. 実現方法

## 背景: Dreamfusion

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/3221e7f3-810f-3b15-1982-3d0b6ec295c2.png)

DreamFusionは、シーンモデルとテキストから画像を生成するジェネレーターモデルの2つの重要なコンポーネントにより、テキストから3D画像を生成することができる。シーンモデルは、望ましいカメラの位置で画像を生成することができるパラメトリック関数x=g(θ)である。ここで、gはボリューメトリックレンダリングであり、θは3Dボリュームを表す座標ベースのMLPである。拡散モデルϕには、テキスト埋め込みy、ノイズレベルt、およびノイズのサンプリング予測が含まれる学習済みのノイズ低減関数ϵϕ(xt; y, t)がある。拡散事前分布の条件付き下で、すべてのレンダリングされた画像が高確率密度領域にプッシュされるように、θを更新するための勾配方向を提供する。具体的には、DreamFusionはスコア蒸留サンプリング（Score Distillation Sample: SDS）を導入し、勾配を計算する。

## 手法
高解像度のジオメトリとテクスチャを生成するために、Coarse-to-fineへの二つの異なる拡散事前分布を使用する。最初の段階では、eDiff-Iで説明されている基本的な拡散モデルを使用し、64×64の低解像度でレンダリングされた画像上で定義された損失を介して、シーンモデルの勾配を計算する。2番目の段階では、高解像度の512×512のレンダリング画像に勾配を逆伝播できるLDMを使用する。

---

# 4. 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/b31da499-a06c-f74e-3b18-3fcf8841baca.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/2ad538c4-c85e-6778-116d-75d7f185f827.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479168/3ae77e1e-ffd3-c458-6880-2bc6a0a4ad17.png)


DreamFusionと比較し、Magic3Dがより高品質な3Dモデルを生成することが確認された。また、ユーザー調査でもMagic3Dがより高い品質を持つことが示された。初期モデルに高解像度のLDMプライヤーを使用することは適切ではないことが示され、代わりにメモリ効率の良い3D表現を用いる必要があることが分かった。また、Coarse-to-fineの手法を用いることで、シーンモデルのメッシュとNeRF両方で質的な向上が見られた。

---
Paper URL: https://openaccess.thecvf.com/content/CVPR2023/papers/Lin_Magic3D_High-Resolution_Text-to-3D_Content_Creation_CVPR_2023_paper.pdf
[TypeScript]イベントリスナー内のthisの参照問題を解決！[bind]

## イベントリスナー内のthisの参照問題
TypeScriptでクラスメソッドをイベントリスナーとして使用する際に、thisの参照が期待通りにならない問題が発生することがあります。
これを解決する方法として、bindメソッドを使用するという方法があります。
今回は、この問題の発生原因とbindを使った解決法について、実際のコードを元に紹介します！


# 1. 問題の発生
イベントリスナー内でクラスメソッドを呼び出すと、thisの参照が予期せず上書きされ、意図しない挙動を引き起こすことがあります。
例えば、以下のコードように、生成したボタンへ押下時に「Click me!」を表示させるメソッドをイベントリスナーにて設定しようとしたときに、問題が発生します。

```typescript
class MyButton {
  private buttonText: string;

  constructor(buttonText: string) {
    this.buttonText = buttonText;
    this.setupButton();
  }

  private setupButton() {
    const button = document.createElement('button');
    button.innerText = this.buttonText;
    button.addEventListener('click', this.handleClick);
    document.body.appendChild(button);
  }

  private handleClick() {
    // 'this'の参照が 'MyButton' インスタンスではなく、
    // イベントが発生した 'button' 要素になってしまう
    console.log(this.buttonText);
  }
}

const myButton = new MyButton('Click me!');
```
ボタンを押下した時、イベントリスナーにて、handleClickメソッドが呼び出されるのですが、その際、this.buttonTextにアクセスします。
しかし、実際でのthisの参照がbutton要素になってしまい、button要素には勿論buttonTextプロパティなどなくundefinedとなってしまい、想定と異なる挙動になってしまいます！



# 2. 解決
この問題を解決するために、bindメソッドを使ってイベントリスナー内でのthisの参照を正しく設定できます！
```typescript
class MyButton {
  // ...

  private setupButton() {
    const button = document.createElement('button');
    button.innerText = this.buttonText;

    // bindメソッドを使って、handleClickメソッド内の'this'を'MyButton'インスタンスに固定する
    button.addEventListener('click', this.handleClick.bind(this));

    document.body.appendChild(button);
  }

  private handleClick() {
    // 'this'は'MyButton'インスタンスを指す
    console.log(this.buttonText);
  }
}
```
このようにbindメソッドを使用することで、handleClickメソッド内でのthisの参照を正しく設定できます！

# まとめ
thisの参照の問題はよく発生してしまうので、どこを参照してしまうのかを意識してコードを書いていきましょう！

次回は、このbindメソッドをもっと再利用できるように、デコレータを使ってのbindメソッドの使用例を紹介します！
R と RStudio を超簡単に GUI でインストールする

絶対に Homebrew などでインストールしようなどとは思わないこと。
これは，Python などをインストールするときも同じ。

以下の Web ページを訪れ，Rstudio をインストールしようとすると，その前提として必要な R のインストールを行うように指示される。

一番最初に，以下をクリック

https://posit.co/download/rstudio-desktop/ 

以下のような画面になる。

![スクリーンショット 2023-11-21 14.08.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/bf4c72e1-d133-1702-17fb-16cb55919a38.png)

まず最初に，1: Install R をクリックする。

以下のような画面になる。

![スクリーンショット 2023-11-21 14.08.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/d5aaebda-5a77-b749-a296-996eae564ea5.png)

Linux, macOS, Windows のいずれかをクリックする。

macOS をクリックすると以下のような画面になる。

![スクリーンショット 2023-11-21 14.09.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/703e63fb-52c9-7ad0-4e85-e89148dc9b91.png)

R-4.3.2-arm64.pkg，　R-4.3.2-x86_64.pkg のいずれかをクリックする（どちらを選択してよいかわからない（そんな人いないと思いたいが）場合には，後者。

ダウンロードされた R-4.3.2-arm64.pkg をダブルクリックしインストールする。
以下のような画面になる。

![スクリーンショット 2023-11-21 14.09.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/3c956c4c-e14a-373e-e169-f110272842e8.png)
以下，「続ける」をクリックしていけばインストールが完了する。

次いで， 2：Install RStudio をクリックして，ダウンロードされた RStudio-2023.09.1-494 (1).dmgをダブルクリックして，以下の画面になり

![スクリーンショット 2023-11-21 14.10.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/7e494482-7568-8588-acc6-1aecae69b29c.png)


RStudio.app を Applications へ，ドラッグ・アンド・ドロップすればインストールは完了する。
Azure App Service：Azure Virtual Network 経由でのカスタムバックアップと復元 


## 概要
今まで、Azure App Serviceのカスタムバックアップはパブリックインタネットを経由して、StorageAccountにバックアップしますが、10月05にAzure Virtual Network経由でバックアップできるようにGAされました。
パブリックインターネットを経由せずに、セキュリティ面は良くなるため、実現していきましょう！

https://azure.microsoft.com/ja-jp/updates/app-service-backup-and-restore-over-azure-virtual-network/
## Step1:Resource Group作成
![截屏2023-11-15 18.36.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/7410d592-b6e3-871e-0f10-e489bb965dc2.png)

## Step2:VNet構築
基本設定に仮想ネットワーク名を入力し、セキュリティ、IPアドレス、タグ、確認及び作成をデフォルトままでVNetを作成する
![截屏2023-11-15 18.37.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/6af2d3d4-6608-9a49-b9cf-51b7031d8a1c.png)

## Step3:StorageAccoun構築
StorageAccoun名を入力し、他の設定をデフォルトままで構築する
![截屏2023-11-15 18.41.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/52cdec82-e611-29a1-1690-354813ca0321.png)

## Step4:Azure App Service構築
App Service名前、ランタイムスタック、リージョンを選択し、
※Vnet統合機能はBasic以上のApp Service Planが要求されるため、ご注意くださいを選択してください。
他の設定をデフォルトままで構築する
![截屏2023-11-15 18.44.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/a443dcc7-9275-91e5-0db2-c980bdeaf791.png)

## Step5:Azure Virtual Network 経由でのカスタムバックアップ設定

1.アプリは仮想ネットワークと統合されているか、アプリが v3 App Service 環境内にあります。
2.ストレージ アカウントには、アプリが統合されているか、v3 App Service 環境が作成された仮想ネットワークからのアクセス権が付与されています。

Docにより、以上の二つ設定が必要です。

https://learn.microsoft.com/ja-jp/azure/app-service/manage-backup?tabs=portal#back-up-and-restore-over-azure-virtual-network-preview

①App Serviceを仮想ネットワークに統合しましょう。
VNET統合をクリックする

![截屏2023-11-15 18.54.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/dc6c1449-f345-7f3c-29e5-b5b6041a7788.png)
Step2で構築したVNETを選択し、Defaultサブネットを選択する
![截屏2023-11-15 18.55.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/8a5fc50e-a8f4-a677-2097-c3bed05590cc.png)
App Serviceを仮想ネットワークに統合しました
![截屏2023-11-15 18.57.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/989c0216-a279-5337-e8be-b0c6089c4354.png)

②ストレージ アカウントに仮想ネットワークからのアクセス権が付与する
Step3で構築したストレージアカウントのネットワック設定に「選択した仮想ネットワークと IP アドレスから有効」を選択し、「既存の仮想ネットワークを追加する」をクリックし、Step2で構築したVNETを選択し、Defaultサブネットを選択し、有効化をクリックする
![截屏2023-11-15 19.02.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/78d6971e-38b5-8125-c7a7-53edd5764e3d.png)

早速ですが、カスタムバックアップを実装しましょう
カスタムバックアップをクリックする
![截屏2023-11-15 19.05.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/c95308d9-616f-319b-fb13-ce0c6e322afa.png)
[仮想ネットワーク統合でのバックアップ復元（プレビュー）]を選択し、構成をクリックする

![截屏2023-11-15 19.06.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/d9384528-34eb-e06a-16b5-3d2981298c0e.png)

※チェックボックスが表示されない場合、またはチェックボックスが無効になっている場合、前述の①、②要件を満たしていることを確認します。


## Step6:[今すぐバックアップ]

![截屏2023-11-21 13.58.53_副本.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/1e3ad269-e9f0-1efc-b956-9b59f2357cec.png)

バックアップ成功したことを確認しました。
二項分布の計算

二項分布の計算


```math
\displaystyle {n \choose k} \ p^{k}(1-p)^{n - k} = {}_{n}C{}_{k}\ p^{k}(1-p)^{n - k}
```

計算方法によっては $n$ が大きいときに問題が生じることがある。

正しい結果を得るための計算方法をメモしておく。


```julia
(n, k, p) = (5000, 250, 0.2)
```




    (5000, 250, 0.2)



定義に従ってやってみる。


```julia
prod(1:n)/prod(1:k)/prod(1:n-k) * p^k * (1 - p)^(n - k)
```




    NaN




```julia
for i in 1:50
    println(i, " ", factorial(i))
end
```

    1 1
    2 2
    3 6
    4 24
    5 120
    6 720
    7 5040
    8 40320
    9 362880
    10 3628800
    11 39916800
    12 479001600
    13 6227020800
    14 87178291200
    15 1307674368000
    16 20922789888000
    17 355687428096000
    18 6402373705728000
    19 121645100408832000
    20 2432902008176640000



    OverflowError: 21 is too large to look up in the table; consider using `factorial(big(21))` instead



prod() を使う時点ですでにダメダメ。
prod(1:20) = 2432902008176640000 で，prod(21) = -4249290049419214848 となる。整数乗算でオーバーフローして，たちの悪いことにオーバーフローしたという警告も出さない。

せめて，階乗を計算する関数 factorial() があるんだからそれを使う。


```julia
factorial(n)/factorial(k)/factorial(n-k) * p^k * (1 - p)^(n - k)
```


    OverflowError: 5000 is too large to look up in the table; consider using `factorial(big(5000))` instead



factorial(big(5000)) を使えと言われる。factorial() も引数が 21 以上になるとオーバーフローする。prod() と同じではあるが，警告を出して，対策を示唆してくれるだけまだマシだ。

ちなみに，factorial() を 3 回も使わなくても，binomial() があるが，オーバーフローするのは同じ。


```julia
binomial(n, k) * p^k * (1 - p)^(n - k)
```


    OverflowError: binomial(5000, 250 overflows


アドバイスに従い，big(n) にする。


```julia
binomial(big(n), k) * p^k * (1 - p)^(n - k)
```




    0.0



binomial(big(n)) だけでは駄目であることを思い知らされる。
結果的にこの場合は結果がすごく小さい値なので 0 でよいのだが。

p も big(p) にする。


```julia
binomial(big(n), k) * big(p)^k * big(1 - p)^(n - k)
```




    2.619654607343296396548610217800488236419868201777212660296348285637584422438959e-206



これで正確に計算できた。

しかし，結果の有効桁はそんなに大きくなくてよいので，別に big() を使わなくても，途中の乗除算を log() で計算して最後に exp() で答えを出せばよい。

factorial() は対数版の logfactorial() があるが，logbinomial() はない。  


```julia
using SpecialFunctions
exp(logfactorial(n) - logfactorial(k)- logfactorial(n-k) + k*log(p) + (n - k)*log(1 - p))
```




    2.6196546073430885e-206



他の方法として，R の dbinom() を使うことができる。これが一番簡単。


```julia
using Rmath
dbinom(k, n, p)
```




    2.619654607342791e-206



普通ではあまり遭遇しないので気にすることもなく使っているのだが，たとえば，「二項分布は正規分布で近似できる」というデモンストレーションをするときに必要になったりする。

n が大きくなると（p は 0.5 でなくても），正規分布に近づく。


```julia
using Plots
bar(4700:5300, dbinom.(4700:5300, 100000, 0.05))
```
![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/4362162b-5825-0e50-ceb2-2a05d842affc.png)

念のため，比較しておこう。


```julia
(n, k, p) = (100000, 5200, 0.05)
exp(logfactorial(n) - logfactorial(k)- logfactorial(n-k) + k*log(p) + (n - k)*log(1 - p))
```




    8.882487929572304e-5




```julia
dbinom(k, n, p)
```




    8.882487930930893e-5
Poetryのクイックスタート (Linux、macOS、WSL)

Poetryでサクッと環境を作成したいとき用の備忘録

# インストール
[Poetry公式サイト](https://python-poetry.org/docs/#installing-with-the-official-installer)

#### 1. Poetryをインストールする

以下のコマンドで公式インストーラを使ってインストールする。

```sh
$ curl -sSL https://install.python-poetry.org | python3 -
```

#### 2. PATHを通す

インストール後にパスを通すコマンドが出力される。
これをPATHファイルに記述する。

例）シェルがBashの場合
```sh
$ echo 'export PATH="/Users/○○○/.local/bin:$PATH"' >> ~/.bashrc
```

#### 3. 更新する

```sh
$ poetry self update
```

# セットアップ方法

#### 1. 初期設定

以下のコマンドを実行し、virtualenvがプロジェクト直下に置かれるようにする。

```sh
$ poetry config virtualenvs.in-project true --local
```

#### 2-a. プロジェクトのセットアップ

[Poetry公式サイト](https://python-poetry.org/docs/basic-usage/)

プロジェクトの始め方は2通りあります。
まずは新しくプロジェクトを作成する場合で、以下のコマンドを実行する。

```sh
$ poetry new <プロジェクト名>
```

上記のコマンドを実行すると以下のようなフォルダが生成される。

```
<プロジェクト名>
├── pyproject.toml
├── README.md
├── poetry_demo
│   └── __init__.py
└── tests
    └── __init__.py
```

#### 2-b. 既存のプロジェクトでのセットアップ

もう一つは既存のプロジェクトに対してセットアップする方法です。
既存プロジェクトに`cd`コマンドで移動し、`poetry init`で初期化する。
`pyproject.toml`ファイルが生成される。

```sh
$ cd pre-existing-project
$ poetry init
```

#### 3. 仮想環境を有効化し、インストール

初回は以下の２つのコマンドを続けて実行する。

```sh
$ poetry shell
$ poetry install
```

`poetry shell`で`.venv`が作成し、`poetry install`で`poetry.lock`が生成する。

# 仮想環境の有効化・無効化

[Poetry公式サイト](https://python-poetry.org/docs/basic-usage/#activating-the-virtual-environment)

- `poetry shell`：仮想環境を起動
- `exit`：仮想環境を終了して新しいシェルを終了
- `deactivate`：シェルを無くさずに仮想環境を終了

# 依存関係のインストール・アンインストール

- `poetry install`：現在のプロジェクトにある pyproject.toml ファイルを読み込み、依存関係を解決し、インストールする
- `poetry add`：pyproject.toml に要求しているパッケージを追加し、インストールする
    - `poetry add numpy`
- `poetry remove`：現在のインストールされたパッケージの一覧からパッケージを削除
    - `poetry remove numpy`

#### requirements.txtを作成する

```sh
$ poetry export --without-hashes --dev --output requirements.txt
```

- `--without-hashes`：poetry.lockで持っているハッシュを出力しないようにするオプション
- `--dev`：dev-dependenciesも含めるというオプション


# アンインストール

[Poetry公式サイト](https://python-poetry.org/docs/#installing-with-the-official-installer)

以下のコマンドを実行する。


```sh
$ curl -sSL https://install.python-poetry.org | python3 - --uninstall
$ curl -sSL https://install.python-poetry.org | POETRY_UNINSTALL=1 python3 -
```
Vue 基礎勉強 v-bind

(Vue.js 3.1.5を使用)

**v-bind**
属性のデータバインディング

```javascript:javascript
const app = Vue.createApp({
    data: () => ({
        message: 'データバインディング'
    })
})
app.mount('#app')
```

マスタッシュ構文はテキストのための記法なので、属性には使えない。
＝＞**v-bind**を使う。
```html:html
    <div id="app">
        <p><input type="text" v-bind:value="message"></p>
    </div>
```

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/1f3f65ed-9db8-b438-d186-2ca0f6aec3f0.png)
PowerShellでWSUSのクリーンアップを定期的に自動実行

WSUS管理コンソールから任意のタイミングで手動実行できることですが、
Powershellコマンドレットとタスクスケジュールを利用し定期的に掃除してもらうことができます。

# WSUS管理コンソールから
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/b288d863-d87f-f356-fd62-20374e936def.png)

# PowerShellから

```WSUS_Cleanup.ps1
Powershell -Command "Invoke-WsusServerCleanup 
-CompressUpdates 
-CleanupObsoleteUpdates 
-CleanupObsoleteComputers 
-CleanupUnneededContentFiles 
-DeclineExpiredUpdates 
-DeclineSupersededUpdates" > C:\WSUS_Cleanup.log
```

```WSUS_Cleanup_イベントログへ出力.ps1
$message = "WSUSクリーンアップ処理を開始します。"

Write-EventLog -LogName System -Source "WSUS Cleanup Task" -EventID 65000 -EntryType INFORMATION -Message $message

try{
	$result = (Invoke-WsusServerCleanup -CompressUpdates -CleanupObsoleteUpdates -CleanupObsoleteComputers -CleanupUnneededContentFiles -DeclineExpiredUpdates -DeclineSupersededUpdates)
	if($result -ne $null){
		$message = "WSUSクリーンアップ処理が正常終了しました。`r`n`r`n"+$result
		Write-EventLog -LogName System -Source "WSUS Cleanup Task" -EventID 65001 -EntryType INFORMATION -Message $message
	}else{
		$message = "WSUSクリーンアップ処理が正常終了しましたが結果が空です。"
		Write-EventLog -LogName System -Source "WSUS Cleanup Task" -EventID 65002 -EntryType WARNING -Message $message
	}
}
catch{
	$message = $error[0].Exception.Message
	$message = "WSUSクリーンアップ処理がエラー終了しました。`r`n`r`n"+$message
	Write-EventLog -LogName System -Source "WSUS Cleanup Task" -EventID 65003 -EntryType ERROR -Message $message
}
```

# 解説
```
■不要な更新プログラムおよび更新のリビジョン
-CompressUpdate
-CleanupObsoleteUpdates

■サーバーにアクセスしていないコンピューター
-CleanupObsoleteComputers

■不要な更新ファイル
-CleanupUnneededContentFiles

■期限の切れた更新プログラム
-DeclineExpiredUpdates

■置き換えられた更新
-DeclineSupersededUpdates
```
【UE5】何もないプロジェクトの作成

UE5を勉強し始めてまだ2日目ですが、学んだことをまとめていこうと思います。


## プロジェクト作成
UE5を起動　→　Blank　を選択
![bandicam 2023-11-21 12-02-22-851.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940156/46ddfab6-859d-a81d-ac9f-7e68c9f23519.jpeg)

すると以下のような画面になりました
![bandicam 2023-11-21 13-32-59-161.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940156/5131345e-c65c-0887-9a49-d16642e92e24.jpeg)

ちょっとこの勝手に作られてしまう地形が邪魔なので、なにもないマップを設定したいと思います。

左上のFile　から　NewLevel　を選択します
![bandicam 2023-11-21 13-35-23-143.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940156/a027ae12-1132-7424-9019-3b2e6895de90.jpeg)

以下の画面が出てくるので、Basicを選択
![bandicam 2023-11-21 13-35-32-449.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940156/6cc6e8bf-59d7-4880-7564-8fd84803f8d9.jpeg)

すると以下の画面のように何もないマップが出てきます。
![bandicam 2023-11-21 13-35-46-088.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940156/b755f458-5f21-6342-985a-0b5e43f97c38.jpeg)

一旦保存します。
するとContentフォルダにNewMapというLevelが生成されていると思います。（名前は変更可能です）
![bandicam 2023-11-21 13-39-05-772.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940156/a058f70b-c995-8ee2-c347-418d06d03ce9.jpeg)

このままプロジェクトを閉じると、なぜか次開いたとき、元の砂漠のマップが出ているので設定します。


Edit →　ProjectSettings　を選択
![bandicam 2023-11-21 13-41-35-326.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940156/67675ff7-307c-4803-51f9-7d4f9b386e8c.jpeg)

AllSettingsを選択
![bandicam 2023-11-21 13-41-51-828.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940156/a5eed91c-f6c6-3ae0-5657-2bc9ddd9007e.jpeg)


下の方にスクロールすると、DefaultMapsの設定ができる場所があります
![bandicam 2023-11-21 13-42-01-279.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940156/a3d79d2f-6939-a803-66ff-f521dc25aeff.jpeg)

そこに先ほど作成したNewMapを設定すると、設定したMapで作業や実行することができます。

以上です。