OmniAICreator/Qiita-1.07M huggingface dataset:
(メモ)LinuxでVDI環境を作る

# はじめに

いままでノートPCをメインに使っていて、自分のホームディレクトリを全部持ち歩いていた(約700GB)のだが、バックアップ作業が家でしかできないとか、コンパイルやら仮想マシン構築をやってるときはノートPCの電源を入れとかなきゃいけないとか、何らかの理由でノートPCが使えなくなった時に作業が止まってしまうので、VDI環境を構築してみた。

まぁ、画面共有だけならVNCでええか、と思っていたのだが、RDPだと音も飛ばせて便利かな、と思って接続方式はそっちです。

# 環境とインストール

今回インストールした環境は

* VDIクライアント: ubuntu studio 20.04.3
* VDIサーバ: ubuntu studio 21.04

モジュールのインストールは以下の感じ(dependencyの都合で他のモジュールもあったけど)

```txt:VDI&#x20;クライアント

 apt-get install remmina*

```

```txt:VDI&#x20;サーバ

 apt install xrdp x11vnc

```

# x11vncの自動起動

xrdpはsystemd制御下なので、デフォルトでサーバ起動時に起動する。
x11vncはsystemd配下にないので、事前にsshでログインしてから手動で起動するか、サーバ起動時にsystemdで起動したい場合は以下の感じでファイルを作って:

```text:/etc/systemd/system/x11vnc-user.service

[Unit]
Description=x11vnc (Remote access)
Requires=display-manager.service
After=display-manager.service

[Service]
Type=simple
ExecStart=x11vnc -noipv6 -listen localhost -env FD_XDM=1 -display :0 -auth /home/普段ログインするユーザ/.Xauthority -rfbport 5900 -forever -loop -noxdamage -repeat -shared -nap -wait 50 -nomodtweak
ExecStop=/bin/kill -TERM $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
KillMode=control-group
Restart=on-failure

[Install]
WantedBy=multi-user.target

```

作ったら以下のコマンドを投入。

```terminal

 systemctl daemon-reload
 systemctl enable x11vnc-user
 systemctl restart x11vnc-user

```

ユーザディレクトリに.Xauthorityがないとログインできない事があるので、事前に一回ログインしておくか、sddmの設定で普段ログインするユーザでオートログインするようにしておく。
つーかXauthorityとかXDMCPまわりはようわからん。この辺Waylandでなんとかなってたりせんか？どうなんや？まぁ調べるのは今回は割愛

# Caps → Control_L問題

さーできた、と思ってサーバ側をリブートして、クライアントからVDI環境にアクセスしてみる。

**やっぱりCapsLockが生きてやがる!!**

まぁ長年来のemacs民なので左Control_Lは多用するわけで、本当にCapsLockは世界から滅びればいいのにって思いつつ試行錯誤してみたところ、結論としては以下の感じらしい。

- keymap周りの設定は、クライアントのX11→xrdp→x11vnc→サーバのX11と接続されるので、その度にキーボードレイアウトやらkeymapまわりの変換が入る(ぎゃぁぁぁぁ)
- クライアント側は単品で使うこともあるので xmodmapに
 `remove Lock = Caps_Lock`.
 `keysym Caps_L = Control_L`,
 `add Control = Control_L`,
 あたりを入れたりした。`setxkbdmap -option caps:ctrl_modifier`なんかでも可
- RDPクライアントのremminaにもグローバル設定のRDPタブの所に設定がある。とりあえずキーボードレイアウトは自動検出、クライアントのキーボードマッピングを使用するにチェックを入れといた
- `/etc/xrdp/xrdp_keybord.ini`の`[default]`セクションにキーボードレイアウトを指定する所があるので指定する。今回は`keybord_type=7`,`keyboard_subtype=2`,すなわちJapanese keyboard/FreeRDP JP keyboardとした。
- x11vncは起動時のオプションでキーマップを一部remapしたりしできるが、色々試した結果、とりあえず`-nomodtweak`オプションだけ指定することにした
- で、やっとこさVDIサーバのX11にアクセスできるわけであるが、`xev`で検出してるキーコード調べてみると、**Caps押すとクライアント側とは違うキーコードでCapsが送られてたりする**、なんでや。
- 今回はVDIサーバ側のxmodmapに以下の設定をしといた。
 - remove Lock = Caps_Lock
 - keysym Caps_Lock = Control_L
 - keysym Eisu_toggle = Control_L ←←←←←←←こいつ!!!
 - add Control = Control_L



# 残る課題

- たまにオートリピートが変(リモートだからしゃぁないか)
- やっぱなんか急にCapsLock入ってやがる、クソッ
- 音が引っ張ってこれない(このためにわざわざRDP選んだのに....)
 - RDPサーバ側にpulseaudio-module-xrdpを入れる必要があるらしい
 - そもそもubuntu studioはパッケージが用意されてないのでフォルトでpulseaudio-module-xrdp は入らない
 - やむなくapt source pulseaudio-module-xrdpなどしてコンパイル
   (知らんかったけどapt build-dependencyってやるとコンパイルに必要なモジュール全部引っ張ってきてくれるのな!!)
 - やっぱ鳴らない(というかなんか全般的に不調)
- remminaがたまに固まる....

これに加えてクライアントPCに水こぼしてタッチパネルがおかしくなったりトラブル続きで久々に難儀しました。
Waylandが標準になったら(もうなってる説あるけど)もっと楽に構築できるといいなぁ。
時代はPHP8だしFizzBuzz書いた

眠れない夜ってFizzBuzzを書きたくなりますよね。いままでさんざんFizzBuzzを書いてきましたが僕はまだ書き足りないです。

今回はきしださんが今年の1月に書いたらしいFizzBuzzをさっき知って「うむ、これこそ2021年のFizzBuzzだ」と思ったので、臆面もなくぱくることにいたししました。

https://nowokay.hatenablog.com/entry/2021/01/26/190658

今回のFizzBuzzのコンセプトは以下の通りです。

 * 元コードの魂を受け継ぎ、オブジェクト指向は時代に合ってないので`new`を使わない
 * 元コードの魂は受け継がず、シンプルではなく凝ったことをしており、エレガントではない
 * 元コードの魂は受け継がず、動く

また、判定方法は概ねきしださんのコードから拝借していますがループ方法は異っています。

## PHPコード

:::note alert
このコードに実用的な要素はありません
:::

```php
<?php

class FizzBuzz
{
    public static function __callStatic(string $n, array $args): void
    {
        echo match ($n % 3) {
            0 => match ($n % 5) {
                0 => self::fizz_buzz($n),
                default => self::fizz($n),
            },
            default => match ($n % 5) {
                0 => self::buzz($n),
                default => ($p = strval($n - 1) and self::{$p}()) ?: $n,
            },
        }, PHP_EOL;
    }

    public static function fizz(int $n): string
    {
        // fizzの直後にfizzが来ることはない
        if ($n % 5 == 0) {
            return self::buzz($n - 1);
        }

        $_ = fn($n): string => $n;
        self::{$_($n-1)}();

        return ucfirst(__FUNCTION__);
    }

    public static function buzz(int $n): string
    {
        // buzzの直後にbuzzが来ることはない
        if ($n % 3 == 0) {
            echo self::fizz($p), PHP_EOL;
        }

        $_ = fn($n): string => $n;
        self::{$_($n-1)}();

        return ucfirst(__FUNCTION__);
    }

    public static function fizz_buzz(int $n): string
    {
        $_ = fn($n): string => $n;

        // fizzbuzzの直後はnのみ
        self::{$_($n-1)}();

        return implode(array_map('ucfirst', explode('_', __FUNCTION__)));
    }
}

FizzBuzz::{'100'}();
```

## 解説

 * PHPは数字名のメソッド定義はできませんが、数字名のメソッド呼び出しは可能です
 * `__callStatic()` は[メソッドのオーバーロード](https://www.php.net/manual/ja/language.oop5.overloading.php#object.callstatic)と呼ばれるマジックメソッドです
 * 再帰を停止させるために、ぱっと見でわかりにくい書き方をしてます
 * ちなみにPHPにTCO(末尾呼び出し最適化)はありません

私からは以上です。この下は旧作FizzBuzzへのリンクです。

## いままでのFizzBuzz

### かなりまじめなFizzBuzz

https://qiita.com/tadsan/items/b9521f149d4964b506d0

### PHP7時代のFizzBuzz

https://qiita.com/tadsan/items/4883ecb9dadc9d4161a7

### まじめじゃないFizzBuzz

https://qiita.com/tadsan/items/13fd5b66e9ea4627c22c

### とにかくFizzBuzz

http://qiita.com/tadsan/items/51d39ec7b49a8e8ee7fd
グローバルデータベースのフェイルオーバー

リージョン全域にわたる停止からの災害復旧機能と低レイテンシ―でのグローバルな読み取り機能を備え、最大6つのAWSリージョンにまたがることのできる単一のデータベース。

プライマリリージョンの変更や災害復旧訓練などのシナリオにおける計画されたフェイルオーバープロセスが簡素化。

https://aws.amazon.com/jp/about-aws/whats-new/2021/02/amazon-aurora-global-database-supports-managed-planned-failover/
CentOS Stream のバージョンを調べてみた

さくらのクラウド（IaaS）でCentOS stream 8 を使い始めたのでバージョン情報を確認してみました。

## /etc/centos-release

```
$ cat /etc/centos-release
CentOS Stream release 8
```

## uname -r
```
$ uname -r
4.18.0-257.el8.x86_64
```

## uname -morsv
```
$ uname -morsv
Linux 4.18.0-257.el8.x86_64 #1 SMP Thu Dec 3 22:16:23 UTC 2020 x86_64 GNU/Linux
```


## /etc/os-release
```
$ cat /etc/os-release
NAME="CentOS Stream"
VERSION="8"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Stream 8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux 8"
REDHAT_SUPPORT_PRODUCT_VERSION="CentOS Stream"
```

## /etc/system-release-cpe
```
$ cat /etc/system-release-cpe
cpe:/o:centos:centos:8
```

## hostnamectl
```
$ hostnamectl
   Static hostname: localhost.localdomain
         Icon name: computer-vm
           Chassis: vm
        Machine ID: （省略）
           Boot ID: （省略）
    Virtualization: kvm
  Operating System: CentOS Stream 8
       CPE OS Name: cpe:/o:centos:centos:8
            Kernel: Linux 4.18.0-257.el8.x86_64
      Architecture: x86-64
```

## 参考
[CentOS Linux のバージョンを調べるコマンドやファイル](https://qiita.com/niwasawa/items/ee148a3ddd49e2e5a86f)
UnityでAlpha値を変更するshaderメモ

# はじめに
これは自らの戒めのために記事である．参考にならない人も多いかもしれない．

# 背景情報
objファイルに記載されているvertexカラーをunityに反映させると同時にalpha値をいじりたくなった．
アルファ値を追加する前のコードは以下の通り．メッシュに記述された情報を参照して反映している．

```_.shader
Shader "Custom/VertexColorShader" {
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		#pragma surface surf Lambert vertex:vert
		#pragma target 3.0

		struct Input {
			float4 vertColor;
		};

		void vert(inout appdata_full v, out Input o){
			UNITY_INITIALIZE_OUTPUT(Input, o);
			o.vertColor = v.color;

			}

		void surf (Input IN, inout SurfaceOutput o) {
			o.Albedo = IN.vertColor.rgb;
		}
		ENDCG
	}
	FallBack "Diffuse"
}
```
# やったこと
今回はvectorColorのアルファではなく，別の値を代入できるようにする．
SurfaceOutputとやらを使っているので，[Unity公式](https://docs.unity3d.com/ja/2018.4/Manual/SL-SurfaceShaders.html)を参考にするとAlphaを代入できるらしい．
ほならばsurfacePutputに一行追加するだけで済むはず．

```_.shader
        void surf (Input IN, inout SurfaceOutput o) {
            o.Albedo = IN.vertColor.rgb;
            o.Alpha = 0.1  // ここに追加
        }
```

> しかし，alpha値は反映されなかった

# 解決
1. ``` "RenderType"="Opaque" ```を``` "RenderType"="Transparent"  "Queue" = "Transparent"} ```に変更
1. ```pragma```に```alpha```を追加

* Opaqueというレンダリングタイプでは，alpha値を無視するようになっているらしい．[Unity公式-レンダリングモード-](https://docs.unity3d.com/ja/2018.4/Manual/StandardShaderMaterialParameterRenderingMode.html)
* ``` #pragma vertex```だけではalphaが使えない．ややこしい... [Unity公式-pragmaスニペット-](https://docs.unity3d.com/ja/2018.4/Manual/SL-ShaderPrograms.html)

以下，完成コード

```_.shader
Shader "Custom/TransParentShader" {

	SubShader {
		Tags { "RenderType"="Transparent"  "Queue" = "Transparent"}
        Blend SrcAlpha OneMinusSrcAlpha
        
		LOD 200
		
		CGPROGRAM
		#pragma surface surf Lambert vertex:vert alpha
		#pragma target 3.0

		struct Input {
			float4 vertColor;
		};
        // fixed4 _Color;
		void vert(inout appdata_full v, out Input o){
			UNITY_INITIALIZE_OUTPUT(Input, o);
			o.vertColor = v.color;
		}
		void surf (Input IN, inout SurfaceOutput o) {   
			o.Albedo = IN.vertColor.rgb;
            o.Alpha =  0.1;
		}
		ENDCG
	}
        // 影を描写しない
	FallBack "Transprent/Cutout/Diffuse"
}
```
Javaのクラス継承

Javaのクラス継承の検証をしました

```java
class Kotehan1 {
	void kotehan(String t) {
		System.out.println(t);
	}

}
//Kotehan1クラスを継承してAlparajyu1クラスを作成する
class Alparajyu1 extends Kotehan1 {
	private String kotehan_name;
	void kotehan(String t) {
		this.kotehan_name = t;
		System.out.println(this.kotehan_name);
	}
	String getkotehan() {
		//System.out.println(this.kotehan_name);
		return this.kotehan_name;
	}
}

public class Alpa15 {
	public static void main(String[] name) {
		// Kotehan1インスタンスを呼び出す
		Kotehan1 kt = new Kotehan1();
		// Alparajyu1インスタンスを呼び出す
		Alparajyu1 al = new Alparajyu1();
		// Alparajyu1インスタンスをKotehan1で呼び出す
		Kotehan1 kt2 = new Alparajyu1();
		//Kotehan1のkotehanメソッドを呼び出す
		kt.kotehan("アルファラジュ");
		//Alparajyu1のkotehanメソッドを呼び出す
		al.kotehan("アルファラジュ");
		//Alparajyu1のgetkotehanメソッドを呼び出す
		String name1 = al.getkotehan();
		//リターンコードを表示
		disp(name1);
		//Alparajyu1のkotehanメソッドを呼び出し、Kotehan1クラス型に変換する
		kt2.kotehan("アルファラジュ1");

	}
	public static void disp(String s) {
		System.out.println(s);
	}
}
```

実行結果は下記の画像になります

![結果.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/9e1749c5-e020-7a1d-e636-5b556eb44135.jpeg)
「マサカリ」とは

「技術力で殴る」という言葉。語源的には正義の鉄槌で殴るという方向のポジティブな意味合いだった。しかしその「殴る」の意味がただの「乱暴者」に解されるケースが出てきていた。時は令和。

https://qiita.com/e99h2121/items/49596d44dd22e859ca2e

「殴る」という言葉の強さゆえかも知れない。たしかにハラスメントと解されては心外だ。


## 「マサカリ」とは

さて最近「マサカリ」という言葉についても似たような議論があると解した。

https://scrapbox.io/nishio/%E3%83%9E%E3%82%B5%E3%82%AB%E3%83%AA

> 若い時期を楽しくマサカリを投げあって過ごしたアラサーエンジニアとしては世知辛い気持ちだが、まあ「かつてポジティブな意味で使われていたこともあったのだ」というエビデンスを、消え去ってしまう前に集めておこうと思った。

とのもともとの話。上の記事に紹介されている「マサカリの起源」は

https://qiita.com/kaityo256/items/d7d8f7a0e522895c8f5d

> 2015年〜 「マサカリ」の意味がかなり広くなる。もともとは「空気の読めない人による正論」という意味だったが、だんだん「単に対応に困るコメントや批判」という意味でも使われ始める。

ここにまとまっている。なるほど、なるほど。マサカリ世代の私の心情としてはどちらにも振れがたい。

https://qiita.com/KengoTODA/items/a44e275c94f9d902370e

> マサカリは大工道具であるからにして、建設的議論のきっかけであるべきです。
> 実現不能なこと、真偽で語れないこと、データで測れないこと、ルール化されていないことを細かくつっこむのは無意味です。
> 俗に言う宗教論争は大工の守備範囲外

言葉尻が丁寧で柔らかい事実に基づいた指摘もマサカリですわな。
この説明はとても腹落ちするんですが如何か。

## まとめ

https://nlab.itmedia.co.jp/nl/articles/1501/15/news170.html

「マサカリはここに置いて入室ください」
この記事が2015年01月15日のことだったので、既にその頃からマサカリは大工道具ではない「狂人の振り回す凶器」になりつつあった。

言葉は日々変化する。常に相手をリスペクトしながら言葉を選びたいものだぞ自分...。

https://qiita.com/hcrane/items/22ea96300dda82ec5b02

https://qiita.com/yuu_j/items/d6e6fc4476ab1dc35cdc

https://qiita.com/dairappa/items/5e954b27b81c646435f3

言いつつ、結構こういう記事読んでて楽しいと思っちゃうのですけれども :innocent: 
以上参考になればさいわいです。
「Microsoft Power Apps入門」を読んで

## はじめに
![PowerApps-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/fe588794-d4b7-d7ce-64ea-213f587fc7a7.jpeg)

　『[Microsoft Power Apps入門 手を動かしてわかるローコード開発の考え方](https://www.seshop.com/product/detail/24693)』を紀伊国屋 新宿本店のテスト販売（先行販売）で購入し、一読しました。

## 基本事項メモ

***発売日*** 2021/10/20（先行販売日 10/12、購入日 10/13）
***判型*** A5
***ページ数*** 408

### 章立て

序章 Power Appsとの出会い
　Ⅰ 外注システムは高い、遅い、使いにくい
　Ⅱ Power Appsとの出会い

第1章 Power Appsで何か作ってみる ～はじめてのアプリ～
　1 はじめてのPower Apps
　2 データソースの用意とアプリの自動生成
　3 自動生成されたアプリの画面について
　4 データソースの特性と注意点
　5 主要なデータソース
　6 自動生成したアプリをカスタマイズする

第2章 Power Appsで業務効率化 ～残業申請編～
　1 アプリを製作する前に
　2 アプリを自動生成する
　3 自動生成したアプリをカスタマイズする
　4 一覧画面の表示データをカスタマイズする
　5 一覧画面から不要なものを排除する
　6 編集フォームをカスタマイズする
　7 詳細表示画面をカスタマイズする
　8 アプリの共有
　9 アプリのフィードバック対応
　10 主に利用されるデバイスに合わせる
　11 長期間利用されたシーンを想定する
　12 業務アプリでよく使う関数

第3章 Power Appsで業務効率化 ～申請承認編～
　1 アプリ機能強化の構想設計
　2 運用イメージを考える
　3 アプリをイチから作る
　4 Power Automateとの連携（メール送信）
　5 作成したアプリの共有

第4章 Power Appsで業務効率化 ～運用編～
　1 展開方法を考える
　2 申請後に修正できてしまう問題を対処する
　3 委任に関する警告を対処する
　4 本番運用と業務改善実績

第5章 エピローグ ～未来にむけて～
　1 後継者をどうするか？
　2 初学者がつまずくポイント
　3 Power Apps特有の注意点について
　4 まとめ

付録 Appendix（Web提供PDF）
　1 その他 業務改善に活用しそうなコントロール
あなたへのおすすめ

## ここがよかった

### 物語と運用の話がいっぱい出てくる
　ローコードを囲んで実際にあるあるの会話が非常に多くでてきます。また、そのアプリを運用したらどうなる、というのわかります。

### コラムの説明が丁寧
　わかりやすい図説付きで、または分かりにくい話をコラムと、コラムが充実しており、コラムだけの飛ばし読みもおすすめです。

### 平易な言葉で書かれている
　はじめての方、経験が浅い方にも、画面、用語の解説が多すぎず、丁寧に書かれているので、分かりやすいです。

### セキュリティや委任の警告等とっつきにくい話も含んでいる
　「ここつまずくよね」といったところにフォーカスを当てて、大事な観点中心に説明があります。素敵。

## さらにここも欲しかった
　欲をいうとPower BIについても、どこかでひとこと触れてほしかったですw

## 終わりに
　約400ページの分厚さを感じさせない痛快さが素敵です。いろんなPower Appsに興味がある方におすすめです。Power Automateの連携の話も含まれているのも素晴らしく、Power BIの話がなかったのは少し残念ですが、良書の発行をありがとうございます。

![PowerApps-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/44eea3ea-6a65-cbaf-b21a-98ba41950735.jpeg)
UIImageの画像の大きさを変えるExtension(拡張)を作る


結論から書くとこんな感じ。

    import UIKit

    extension UIImage {
        
        func resize(size _size: CGSize) -> UIImage? {
            
            let widthRatio = _size.width / size.width
            let heightRatio = _size.height / size.height
            let ratio = widthRatio < heightRatio ? widthRatio : heightRatio
            
            let resizeSize = CGSize(width: size.width * ratio, height: size.height * ratio)
            
            UIGraphicsBeginImageContextWithOptions(resizeSize, false, 0.0)
            draw(in: CGRect(origin: .zero, size: resizeSize))
            let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            
            return resizedImage
        }

    }


使い方

    class BottomButtonView: UIView {
        
        var button: UIButton?
        
        init(frame: CGRect, width: CGFloat) {
            super.init(frame: frame)
            
            button = UIButton(type: .system)
            //　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　↓これ
            button?.setImage(UIImage(named: "")?.resize(size: .init(width: width * 0.4, height: width * 0.4)), for: .normal)
            
            required init?(coder: NSCoder) {
                fatalError("init(coder:) has not been implemented")
            }
        }
    }
　
拡張機能なので、元々UIImageで準備されている関数に欲しい関数がなかったので新しく関数を加えました。

class BottomButtonView: UIViewみたいな感じでUIViewのクラスを作成しているのは、storyboardなしでMVVMの練習も兼ねて行ったためです。

誰かの参考になれば幸いです。
Python環境構築メモ

#環境構築
###使うもの
 - pip (インストールに使う)
 - virtualenv (仮想環境構築に使う)

###pipのインストール
以下をコマンドプロンプトにて実行。

```
python get-pip.py
```
pipと打ってコマンド一覧が出てきたらインストール済みってこと

###virtualenvのインストール
以下をコマンドプロンプトにて実行

```
py -m pip install virtualenv
```
virtualenvと打ってコマンド一覧が出てきたらインストール済みってこと

###virtualenv使い方
#####使い方の前に説明します。。。
virtualenvは実行環境(仮想環境)を作ることができるらしい
virtualenvの仮想環境とは：
異なるバージョンのpythonやフレームワークなどを各仮想環境へインストールすることができ、簡単に仮想環境を切り替えることによる簡易テストが可能となる場所を用意してくれます。

#####本題(使い方)
仮想環境の作成↓
py -m virtualenv <仮想環境名>
これをコマンドプロンプトに記述します。
今回はtrialという名前の仮想環境を作成します。

```
py -m virtualenv trial
```
上記コマンドを実行するとディレクトリ内に以下のようなファイルが生成されます
![キャプチャ.PNG]
(https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1724045/818009fb-9485-5b93-36ca-f9d806b8b7a4.png)
ディレクトリの
PC > OS(C:) > Python > trial > Scripts
このtrialっていうファイルが仮想環境のフォルダーです。
仮想環境を起動する際はScriptsフォルダー内に存在する
・activate.bat
・deactivate.bat
をコマンドラインにて実行することで可能となります。

```
activate // 有効化するとき
deactivate // 無効化するとき
```

以上です。
Kria　KV260 スタータキットを動かしてみた

# はじめに
Kriaが手元に届いたので動作させてみました

# 環境
* [Kria KV260 ビジョン AI スターター キット](https://japan.xilinx.com/products/som/kria/kv260-vision-starter-kit.html)
* [Kria Kv260 ベーシック アクセサリ パック](https://japan.origin.xilinx.com/products/som/kria/kv260-vision-starter-kit/basic-accessory-pack.html)
* macOS BigSur 11.5.2 
* 26インチモニタ

# 手順
### １　Kriaのブートイメージを準備
1. Kria KV260 ビジョン AI スターター キット イメージをダウンロードして、コンピューターに保存
1. Balena Etcher をダウンロード
1. ツールの指示に従って、ダウンロードしたイメージを選択し、microSD カードに書き込み

### ２　ブート
1. microSD カード スロットに挿入
1. データ転送用に USBケーブルを準備し、USBA端子をPCにMicroB端子を接続
1. IAS カメラ モジュールを接続
1. DisplayPort/HDMI ケーブルを使用してモニター/ディスプレイに接続
1. LANケーブルを接続
1. 電源をDCジャックに接続

### ３　SSH接続
1. sshで接続する（事前に`ip -a`で[ipaddress]を確認：dhcp前提）

~~~
ssh petalinux@[ipadress]
~~~

　なお、xilinxの正式マニュアルにあるシリアルポートで接続して、コマンドプロンプト上にscreenする方法では、シリアルポート設定やscreen設定等を見直す必要があるため、おすすめできない。さらに、gtkterm的なツールを利用することも可能だが、特別な事情がなければsshで遠隔操作した方が良い。

### 4　FPGAイメージ（アプリケーションファームウェア）のロード
1.　利用できるパッケージを表示する

~~~s
sudo xmutil getpkgs
~~~

2.　正式マニュアルにもある代表的なパッケージをKiraへインストールする

~~~
sudo dnf install packagegroup-kv260-smartcam.noarch
~~~

　この際、Ethernet経由で最新版を取得するような動きになっているため、基本的にはEthernet接続をお勧めする。

3.　アプリケーションファームウェアの一覧を表示する

~~~
sudo xmutil listapps
~~~

4.　現在ロードされているデフォルトのアプリケーションファームウェアを破棄する

~~~
sudo xmutil unloadapp
~~~

5.　スマート カメラ アクセラレーション アプリケーションのファームウェアを読み込む

~~~
sudo xmutil loadapp kv260-smartcam
~~~

### 起動

1.　スマート カメラ アクセラレーション アプリケーションを起動

~~~
sudo smartcam --mipi -W 1920 -H 1080 -r 30 --target dp
~~~

# 結果
![secret.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423321/1a32e71c-6de6-26b9-a84d-5b522c5cdcb8.jpeg)
![image2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423321/fee56793-099a-2d61-75bb-3e2f9c220f1d.jpeg)


 このアプリケーションについては、特に驚きはありませんでした。認識精度もスピード感もソフトウェア制御と変わらない感覚です。ただ、マニュアルにあるようにソフトとハードの境界線を簡単に調整できるのであれば、かなり有用だと思うため、引き続き調査します。



# 参考
[Kria KV260 ビジョン AI スターター キット使用：xilinx正式ページ](https://japan.xilinx.com/products/som/kria/kv260-vision-starter-kit/kv260-getting-started/getting-started.html)
[設計開始 Kria KV260 ビジョン AI スターター キット使用”をやってみる3：marseeさんのページ](https://marsee101.blog.fc2.com/blog-entry-5347.html)
GoとGORMを使った勉強(2)　

#概要
・[GoとGORMを使った勉強(1)](https://qiita.com/yamauchikei/items/59b731d7f2870c04beac)の続き　※さらに[続き](https://qiita.com/yamauchikei/items/5645f18afc48ac39365c)あります
・機能を追加：logを記録
・改善：機能ごとにファイル分け


#機能追加(1)：logを記録する

func main()のカッコ{}の中に下記を追記。
app.logファイルが自動で作成されこれにlogが記録される。

````
    file, _ := os.OpenFile("app.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
    defer file.Close()
    gin.DefaultWriter = io.MultiWriter(file)
````

````golang:main.go
package main

import (
	"io"
	"os"

	"github.com/gin-gonic/gin"
	_ "github.com/joho/godotenv/autoload"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	file, _ := os.OpenFile("app.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
	defer file.Close()
	gin.DefaultWriter = io.MultiWriter(file)

	r := gin.Default()

	r.GET("/users", ListUsers)

	r.Run(":80")

}

func DB() *gorm.DB {
	dsn := "fuga:fugapass@tcp(127.0.0.1:3306)/hoge?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	if err != nil {
		panic("failed to connect database")
	}
	return db
}

func ListUsers(c *gin.Context) {
	var users []User
	db := DB()
	db.Find(&users) // find product with integer primary key
	c.JSON(200, gin.H{
		"user": users,
	})
}

type User struct {
	gorm.Model
	Name string
}

````

#改善：機能ごとにファイル分け
機能ごとにファイルを分ける。
・メインの処理⇨コントローラー
・データベースの設定とかを書いた処理⇨モデル


#実践
###controllerディレクトリを作成

````golang:controller/contlloer.go
package controller

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func DB() *gorm.DB {
	dsn := "fuga:fugapass@tcp(127.0.0.1:3306)/hoge?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	if err != nil {
		panic("failed to connect database")
	}
	return db
}
````

````golang:controller/user.go
package controller

import (
	"example.com/m/model"
	"github.com/gin-gonic/gin"
)

func ListUsers(c *gin.Context) {
	var users []model.User
	db := DB()
	db.Find(&users) // find product with integer primary key
	c.JSON(200, gin.H{
		"user": users,
	})
}
````




・modelディレクトリ作成

````Golang:model/users.go
package model

import "gorm.io/gorm"

type User struct {
	gorm.Model
	Name string
}
````

#main.goがスッキリした

````golang:main.go
package main

import (
	"io"
	"os"

	"example.com/m/controller"
	"github.com/gin-gonic/gin"
	_ "github.com/joho/godotenv/autoload"
)

func main() {
	file, _ := os.OpenFile("app.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
	defer file.Close()
	gin.DefaultWriter = io.MultiWriter(file)

	r := gin.Default()

	r.GET("/users", controller.ListUsers)

	r.Run(":80")

}

````
chromebook (lenovo duet) linux 設定 code-server編

Java のインストール
Java Runtime Environment
`sudo apt-get install default-jre -y`
確認
`$ java --version`

~~Java Development Kit
`sudo apt-get install default-jdk -y`
確認
`$ javac --version`~~

Graphviz のインストール
`sudo apt install graphviz`

code-server のインストール
`curl -fsSL https://code-server.dev/install.sh | sh`
パスワードの確認/変更
`vim ~/.config/code-server/config.yaml`
右側で指定されたユーザーとして、code-serverは動作
`sudo systemctl start code-server@ユーザー名`
code-serverを再起動します。
`sudo systemctl restart code-server@ユーザー名`

nginxをインストールしたうえで、次の設定をNginxに適用

```
server {
    listen 80;
    listen [::]:80;
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name VSCodeを動かすサイトのFQDN;
 
    ssl_certificate     SSL証明書のパス;
    ssl_certificate_key SSL証明書のキー;
 
    location / {
      proxy_pass http://localhost:8080/;
      proxy_set_header Host $host;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection upgrade;
      proxy_set_header Accept-Encoding gzip;
    }
}
```

設定を入れ込んだらnginxを再起動
sudo nginx -t
sudo systemctl restart nginx

https://remoteroom.jp/diary/2019-04-18/#2-nginx%E3%81%A7%E3%83%AA%E3%83%90%E3%83%97%E3%83%ADhttps://remoteroom.jp/diary/2019-04-18/#2-nginx%E3%81%A7%E3%83%AA%E3%83%90%E3%83%97%E3%83%AD
GitHubへのPush時にAWS CodeCommitにリポジトリを同期する

AWS AmplifyでWebアプリを開発していてAWS CodeCommitへのpushをトリガーにデプロイされる、という環境で開発していたのですが、コードの管理はGitHubで行うという機会が有りました。

そのため、GitHub Actionsから任意のタイミングでAWS CodeCommitに同期してデプロイが実行されるという環境を作りたかったので、その時のメモです。

# AWS CodeCommit SSHキーのアップロード

まずはAWSのIAMコンソールから、CodeCommitのSSHパブリックキーをアップロードして、SSHキーIDを取得します。
![ssh upload](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279032/b6209ebf-0fd6-d3b0-c007-4ef67ac153b0.jpeg)


# GitHubのSecretsにSSHキー情報を登録
GitHubの管理画面で、「Settings」 -> 「Secrets」から、先程取得したSSHキーIDと、SSHパブリックキーに対応するシークレットキーを登録します。

今回は例として、 `CODECOMMIT_SSH_KEY_ID` にSSHキーID、 `CODECOMMIT_SSH_PRIVATE_KEY` にシークレットキーを登録しました。
![github secrets](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279032/f34b5fa1-f113-3aa8-1f3b-904ddb67c1a8.jpeg)


# GitHub Actionsを設定

下記のコードを、GitHub Actionsのワークフローとして登録します。
`target_repo_url` には、CodeCommitのリポジトリのURLを指定してください。

```yaml
name: "Deploy"

on: [ workflow_dispatch ]

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 5

    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Push to AWS CodeCommit
        uses: pixta-dev/repository-mirroring-action@v1
        with:
          target_repo_url:
            ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/hoge
          ssh_private_key:
            ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY }}
          ssh_username:
            ${{ secrets.CODECOMMIT_SSH_KEY_ID }}
```

以上でGitHub Actions実行時にCodeCommitにリポジトリが同期されます。
意外と簡単ですね！
Windows Server 2022においてOSの表示言語は日本語でもWSUS管理コンソールの表示言語が英語となる

Windows Server 2022にWSUSをインストールした際に、日本語環境なのにWSUS管理コンソールが英語表記になりました。
20348.768でも私の環境では解決できませんでした。

::: note info

プレビュー版の更新プログラム (KB5014665) にて改善されたようです。
https://sccm.jp/2022/06/26/post-4586/
https://support.microsoft.com/ja-jp/topic/feebab2b-1851-4119-a531-89ca80300b10

現在は7月の最新の累積更新プログラム (KB5015827) にて提供されていますので、まだ英語表記になる場合は Windows Update を試してください。
https://support.microsoft.com/ja-jp/topic/b115183f-66b8-4eea-a631-5255a39b5991

:::

::: note info

Windows PCにWSUS管理コンソールをインストールすることにより、リモートで管理することも可能です。
参考手順は別記事をご覧ください。
https://qiita.com/rin309/items/4b756a5c6e7945a5d5b7

:::

![Windows Server 2022--Windows Update Service (WSUS) の管理コンソールの表示言語が英語](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667945/5c70ea10-ddbe-9316-3c26-30572420b664.png)
fishでbash/zshのgrouping commands相当のことをやる

# fish小ネタ

任意のディレクトリを別ディレクトリに丸ごとコピーする方法は色々ありますが、bourne shell一派を使ってた頃は以下のように書いてました。

~~~sh
> tar cf - ./nantoka | ( cd /dokoka; tar xf -)
~~~

[grouping commands](https://www.gnu.org/software/bash/manual/html_node/Command-Grouping.html)というやつです(gnu本家だと"grouping commands"で、手元でbash(1)見ると"group command"になってますね・・・)
そんなん後段のtarで-C指定すりゃいいじゃねえかという話で全くそのとおりなんですが、もう手癖なんでしょうがないんです。
tar以外のコマンドも入れたくなっちゃうことありますし。

癖なのでfishの場合も同じように書きたいんですが、()や{}は使えません。敢えて似たようなことをやろうとすると以下の感じになるようです。

~~~sh
> tar cf - ./nantoka | begin
                         cd /dokoka
                         tar xf -
                       end
~~~
[begin - start a new block of code](http://fishshell.com/docs/current/cmds/begin.html)

どうしてもone lineで書きたい場合は";"で逃げればよいです。

小ネタでした。
HAVING句でデータの歯抜けを探す方法（発展版 ~ 下限が1から始まらないパターンでも連続しているかどうかを調べる ~）2/2

## はじめに

HAVING句でデータの歯抜けを探す方法を勉強しています。

https://qiita.com/ryosuketter/items/8d41db1148ee8be6ddc3

前回の続きです。

前回は何かというと、**下限がどんな値かを問わない（1じゃないパターンもある）数列が連続しているかどうかを調べたい**でした。

今度は欠番の最小値を求めるクエリを書いていきます。

ケース１
欠番なし（開始値=1）

| id  |
| --- |
| 1   |
| 2   |
| 3   |
| 4   |
| 5   |

ケース2
欠番あり（開始値=1）

| id  |
| --- |
| 1   |
| 2   |
| 4   |
| 5   |
| 8   |

ケース3
欠番なし（開始値<>1）

| id  |
| --- |
| 3   |
| 4   |
| 5   |
| 6   |
| 7   |

ケース4
欠番あり（開始値<>1）

| id  |
| --- |
| 3   |
| 4   |
| 7   |
| 8   |
| 10  |

この4つのケースの場合、以下のような出力結果を期待します。

- ケース1: 6を返す（欠番がないので、最大値5の次の数）
- ケース2: 3を返す（最小の欠番）
- ケース3: 1を返す
- ケース4: 1を返す

```sql
SELECT CASE WHEN COUNT(*) = 0 OR MIN(id) > 1 THEN 1 -- ①
            ELSE (
                SELECT MIN(id + 1)
                FROM members1 m1
                WHERE NOT EXISTS(
                    SELECT * FROM members1 m2 WHERE m2.id = m1.id + 1)
           	) END AS minimum_value
FROM members1
```

- ① レコードの合計が0 または 下限値が1よりも大きい場合は
- そうじゃない場合は ELSE () の中が評価されます
    - ELSE()の中
        - idが1の場合しかなく
            - その場合
                - 欠番がある場合 → 最小の欠番を返す
                - 欠番がない場合 → 最大値の`+1`の値を返す

こんな感じです。

`NOT IN`ではなく、`NOT EXISTS`なのは、NULL対策です。

また、多くの場合、idはインデックスされているので、その場合はパフォーマンス上もいい結果だそうです。

本日は、以上です。

## 参照

https://www.amazon.co.jp/dp/4798157821/

110 - 111p

## アウトプット100本ノック実施中

https://qiita.com/ryosuketter/items/713474dbd009870e4103
npmパッケージのバージョン確認

## インストールパッケージ一覧確認
```:npm
npm list --depth=0
```

```:yarn
yarn list --depth=0 
```

## パッケージ情報の確認

```:npm
npm info パッケージ名
```

```:yarn
yarn info パッケージ名
```


## 参考
[npmとyarnのコマンド早見表](https://qiita.com/rubytomato@github/items/1696530bb9fd59aa28d8)
React Nativeで、ImageをView内ピッタリに収める方法

React Nativeで、画像のアスペクト比を維持しつつ、画像をView内にピッタリ、余白なしに収める方法を紹介します。


# 環境
- React Native: 0.64

# 概要

  1. `onLoad`を使い、画像のwidthとheightを取得し、widthとheightからアスペクト比を計算
  1. 計算したアスペクト比をImageコンポーネントの`style`props内の`aspectRatio`プロパティに当てる

# やり方

```react
import React, { useCallback, useState } from 'react-native'
import { Image, View, ImagePropsBase } from 'react-native'
(中略)

const Hoge: FC = () => {
  const [imageAspectRatio, setImageAspectRatio] = React.useState(1)

  const calculateAspectRatio = useCallback<ImagePropsBase['onLoad']>(
    ({
      nativeEvent: {
        source: { width, height },
      },
    }) =>
      setImageAspectRatio(width / height),
    [],
  );

  return (
    <View style={{ flex: 1 }}>
      <Image
        onLoad={calculateAspectRatio}
        resizeMode="contain"
        source={{ uri: 'http://example.com/hoge.jpg' }}
        style={{
          width: '100%' // 適宜指定したい値に変えてください。
          aspectRatio: imageAspectRatio
        }}
      />
    </View>
  )
}

```
HAVING句でデータの歯抜けを探す方法（発展版 ~ 下限が1から始まらないパターンでも連続しているかどうかを調べる ~）1/2

## はじめに

HAVING句でデータの歯抜けを探す方法を勉強しています。

https://qiita.com/ryosuketter/items/65fad52f54034bd91e8d

前に学んだクエリでは対応できないケースを考えましょう。

どういうケースかというと、**下限がどんな値かを問わない（1じゃないパターンもある）数列が連続しているかどうかを調べたい**

このケースでは前に学んだクエリでは対応できません。

ケース１
欠番なし（開始値=1）

| id  |
| --- |
| 1   |
| 2   |
| 3   |
| 4   |
| 5   |

ケース2
欠番あり（開始値=1）

| id  |
| --- |
| 1   |
| 2   |
| 4   |
| 5   |
| 8   |

ケース3
欠番なし（開始値<>1）

| id  |
| --- |
| 3   |
| 4   |
| 5   |
| 6   |
| 7   |

ケース4
欠番あり（開始値<>1）

| id  |
| --- |
| 3   |
| 4   |
| 7   |
| 8   |
| 10  |

テーブル全体を1つの集合と見なして、`count(*)`で集合の要素数を把握するという考え方は変わりません。

こんかいの4つのケースはいずれも`count(*) = 5`です。

そして、もし、数列の下限値と上限値のあいだに欠番がないのであれば、以下の式が成り立つはずです。

```
count(*) = 上限値 - 下限値 + 1
```

なので、下限値が1から始まっていなくても以下のようなクエリを書けば、歯抜け判定はできます。

```sql
SELECT '歯抜けあり' AS gap
FROM members
HAVING COUNT(*) <> MAX(id) - MIN(id) + 1
```

このクエリの場合、歯抜けのあるケース（2, 4）が以下のように出力されます。

| gap   |
| ----- |
| 歯抜けあり |

### HAVINGはGROUP BY と併用しなきゃダメなワケでは無い

:::note
現在の標準SQLでは、HAVING句を単独で使えるそうです。
ただし、SELECT句で元テーブルの列を参照できなくなるので、上記SQLのように、定数を返すようにするか、以下のように集約関数を使う必要があります。
:::

歯抜けの有無に関わらず1行の結果を返したいなら、SELECT句にCASEによる条件を書きましょう

```sql
SELECT
	CASE
    WHEN COUNT(*) = 0 THEN 'テーブルが空です'
    WHEN COUNT(*) <> MAX(id) - MIN(id) + 1 THEN '歯抜けあり'
    ELSE '連続' END AS gap
FROM members1
```

このクエリの場合、歯抜けのあるケース（2, 4）は以下のように出力されます。

| gap   |
| ----- |
| 歯抜けあり |

歯抜けのあるケース（1, 3）は以下のように出力されます。

| gap   |
| ----- |
| 連続 |

これで、下限がどんな値（1から始まらないパターン）でも連続しているかどうかを調べることができました。


本日は、以上です。

## 参照

https://www.amazon.co.jp/dp/4798157821/

109 - 110p

## アウトプット100本ノック実施中

https://qiita.com/ryosuketter/items/713474dbd009870e4103
線形回帰を実装する際は正規方程式を書かずにムーアペンローズの擬似逆行列を利用する

# 概要

- 線形回帰モデルの最尤推定を実装する場合に、正規方程式を書くと思います（PRML3章など）
- 正規方程式を実装した場合に、（たぶん）逆行列の精度が悪く、推定結果の精度が悪い場合がある
- そこで、ムーア-ペンローズの擬似逆行列を使うと良いよ　という話

正直なところ、何が原因かはっきりと理解できていないので、詳しい方教えてください。

[2021/11/30 追記]
速攻でコメントいただきましたし、Twitterでもご指摘いただきました。
以下に簡単にまとめておきますが、当たり前すぎて恥ずかしいす。

- 正規方程式で期待した解が得られない理由
    - 実験の条件では、モデルの次数よりもデータが少ない
    - そのため、逆行列がない
    - だから正規方程式で解を求めようというのがそもそも間違い
- 疑似逆行列では期待したよな解が得られた
    - 疑似逆行列ではコメントで頂いた通り、最小二乗法を利用して数値的に計算しているため、逆行列を求めるというようなことをしていない。
    - そのため、合理的な解が得られた。
- 正規方程式で求めようとしていた逆行列は何？
    - これはよくわかっていません（numpyでの逆行列の解法を調べておりません。。。）

わかってしまえば至極当然なので、ものすごく恥ずかしいわけですが、悩んでた時は考えが至らなかったんですよね。
そもそも、逆行列計算できてしまっていたので、逆行列が計算できない問題設定になっていることが頭から抜け落ちておりました。。。

# 環境

- ハード
    - macOS Big Sur (11.4)
    - Mac mini (M1, 2020)
    - チップ　Apple M1
- Python
    - Python 3.9.5
    - numpy 1.21.0

# 線形回帰の最尤推定解

モデルとしては以下の通り、普通の線形回帰モデルを考えます。

$$
y = \mathcal{N}(y | \mathbf{w}^{\top}\mathbf{\phi}(\mathbf{x}), \sigma^2)
$$

ここで今回は、特徴抽出関数$\phi_i(x)$は$x^{i}$の多項式を扱います。

導出は省きますが、計画行列$\Phi$を利用すると、最尤推定解は以下の通りとなります。

$$
\mathbf{w}_{MLE} = \left( \Phi^{\top} \Phi \right)^{-1} \Phi^{\top} \mathbf{y}
$$

これが正規方程式として知られているものです。

ここで、上記の正規方程式での以下の部分を行列$\Phi$のムーア-ペンローズの擬似逆行列(Moore-Penrose pseudo-inverse matrix)です。（本に書いてました）

$$
\Phi^{\dagger} \equiv \left( \Phi^{\top} \Phi \right)^{-1} \Phi^{\top}
$$

この$\Phi^{\dagger}$は`numpy.linalg.pinv`としてnumpyにて提供されています。

https://numpy.org/doc/stable/reference/generated/numpy.linalg.pinv.html

ということで、線形回帰のパラメータの最尤推定解は擬似逆行列を使って次のようにも書けます。

$$
\mathbf{w}_{MLE} = \Phi^{\dagger} \mathbf{y}
$$

numpyを使ってこの二つの挙動を確認してみます。
実装の詳細は、notebookを貼り付けておくのでご確認いただけたらと思います。

## トイデータ

今回実験を行うにあたって、下図のデータを生成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66005/6f911fa3-0295-5641-40be-51337a945b3e.png)

設定関数として、３次の多項式関数を仮定しています（青線）。サンプルデータは3点だけとします(オレンジ点)。

設定関数の係数は以下の通りとしました。

```python
w_set = [0, 2, -6, 1]
```

## 実装(正規方程式)

正規方程式は以下のように実装しました。

```python
pp = np.dot(Phi.T, Phi)
ppi = np.linalg.inv(pp)
ppp = np.dot(ppi, Phi.T)
w_ml1 = np.dot(ppp, y_sample)
```

ここで、`Phi`は計画行列を表します。

推論結果は下図の通りです。緑線が推定した関数です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66005/da51d7ae-8d4a-6ac4-a35c-425eeb12451f.png)

3点のデータで3次の多項式なので完全にデータ点を通って欲しいのですが全然値がずれています。

推定結果としての係数ベクトルは以下の通りとなりました。

```python
[26.74957281  3.67629247 -5.20741295  0.08003123]
```

## 実装(擬似逆行列)

擬似逆行列を使った場合は以下の通りです。

```python
pim = np.linalg.pinv(Phi)
w_ml2 = np.dot(pim, y_sample)
```

推論結果はこうなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66005/3e29d647-3c04-4cf4-f5de-2004d5b29f12.png)

こっちは期待通り、サンプルデータを全て通る関数が推定されました。

係数ベクトルはこうなりました。

```python
[-1.36044521  1.46444715 -6.47618665  1.16327901]
```

正規方程式を素直に書いた場合と値が全然違っています。


## どこが悪さをしているのか？

正規方程式における逆行列の計算がまずそうです。

```python
> np.allclose(np.dot(pp, ppi), np.eye(pp.shape[0]))
False
```

いくつか試してみていたところ、データ数よりもモデルの次数の方が大きい場合にこのような問題が発生しそうです。

線形モデルもライブラリに実装されているはずなので、実用上はあまり問題にならないと思います。
ですが、線形回帰は学習用によく使われているとも思うので、同じような問題にぶつかる方もいるのかなと思って書きました。


## 実装

実装したnotebookは以下のリンクで確認してください。
そして、何か問題を見つけていただけたら優しく教えていただけると泣いて喜びます。

https://gist.github.com/tok41/e85bfa347898ce0ecb22b4f76b76840a
[OutSystems]画面のInput ParameterをURL指定で渡す

https://qiita.com/jyunji_watanabe/items/f898e2467fe8fac88e0b#comment-1cbb4579f9ea3fa5288c

のコメント欄の質問から。

画面をURL指定で開くときに、Input Parameterを指定する方法。

# 画面サンプル
以下のような画面をURLで開くとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/af49cb19-4797-a11e-1fdb-d6cf50927ba3.png)

Input Parameterとして、Text型のTextVarと、DateTime型のDateTimeVarを持つ。
また、User Entityを検索するAggregate GetUsersByCreationDateを持っている。

Aggregateのフィルタ（Input Parameterを使ってUser Entityを検索する）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/28b72808-f66a-be0a-ae9d-b4a57a49e3f7.png)

このAggregateの結果を、画面に配置したWidgetに紐付けることで、検索したUser Entityのデータを表示する画面です。

# URLでサンプル画面とそのInput Parameterを指定する
OutSystemsの画面アクセスは、要するにHTTP GETの通信。
そのため、Input Parameterは、URLのクエリストリングに指定すればよい。
（クエリストリングとは何か、という点についてはWeb上に解説があるのでGoogleで検索してみてください）

すなわち

```
/モジュール名/画面名?InputParameter1=値&InputParameter2=値&...
```

のような形式になります。
モジュール名等は実際のアクセス先に応じて変更する。
例えば、アクセス元と同じモジュールのPDFTestTo画面（サンプルの画面）であれば、以下のように指定する。

```
GetOwnerURLPath() + "PDFTestTo?TextVar=" + TextVar + "&DateTimeVar=" + DateTimeToText(DateTimeVar)
```

　GetOwnerURLPath()はビルトイン関数の1つで、所属するモジュールの相対パスを返す。
　「?」はクエリストリングの開始を示す区切り文字で1回だけ登場。
　「&」はクエリストリング内で、各パラメータ間の区切り文字。パラメータ数-1回だけ登場。
　「=」はクエリストリング内で、各パラメータ名とその値の区切り文字。パラメータ数回だけ登場
　TextVarはText型なので値をそのまま渡せばよいが、DateTimeVarは元がDateTimeなので文字列であるクエリストリングに渡すためにText型に変換している点に注意。

上記の式は実行時に以下のようになる

```
/AssociateReactive/PDFTestTo?TextVar=Te&DateTimeVar=2021-06-29 23:51:00
```
TPLINK ARCHER のファイアウォールの設定について

突然通信が途絶することがある
---

TPLINKのルーターを使用しているときに突然通信が途絶（WIFIの接続は生きているが、外部との通信が突然途切れる、特定のクライアントのみで他のクライアントでは異常なし）することが頻繁に起きるので調べてみました。

シスログを見てみよう
---
DoS攻撃保護に関するエントリーが見つかったら、ファイアウォールの設定が原因と見られる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831262/1ed7c590-b20a-0a03-d766-9b6958991da7.png)

もしDoS攻撃保護が原因でインターネットとの通信が遮断されている場合は下記のリストにホストが登録される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831262/5113beec-0e84-da4f-13e0-d47bc2717846.png)


ファイアウォールの設定ーDoS攻撃保護
---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831262/05109d5a-5abc-5aa3-4e81-148e205152de.png)

高に設定された状態で通常の使用をしている最中にYouTubeの再生が途中で止まったり、VPNが途切れたり、色々と不具合が起きていたのですが、どうやらこの設定が原因でした。たしかに、問題が起きている最中はリストに該当のホストが登録されている状態が見えました。

中に下げると不具合はとりあえず今の所起きていません。（問題があれば低まで下げる必要がある・・・？）
※追記　中でも発生したので現在低まで下げました。

レベルの設定
---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831262/49de6e7b-97d3-d36f-48e6-d45e9a161f5e.png)
ここでフィルターされるパラメーターの調整ができるようです。最近のスマートフォンは高性能になったので、1秒あたりに送信するパケット数が多いのかな・・・。
【Django】ManyToManyFieldをQオブジェクトで検索する時の注意点

## 目的
- 多対多の関係にある動画モデルとタグモデルを用意した
- 動画のタイトルと動画に紐づいているタグを複数指定して、動画を検索する機能を追加する

## モデルのイメージ

```python
from django.db import models

class Movie(models.Model):
  """動画"""
  title = models.CharField()
  tag = models.ManyToManyField(Tags)


class Tag(models.Model):
  """タグ"""
  name = models.CharField()
```

- 動画テーブル(movie)

|ID|タイトル|
|:--|:--|
|1|A動画|
|2|B動画|

- 中間テーブル(movie_tag)

|ID|動画ID|タグID
|:--|:--|:--|
|1|1|1|
|2|1|2|
|3|1|3|
|4|2|2|
|5|2|4|

- タグテーブル(tags)

|ID|タグ名|
|:--|:--|
|1|ホラー|
|2|恋愛|
|3|SF|
|4|歴史|


## 失敗したコード
- ネットで調査しつつ以下の実装を行った

```python:失敗コード
class MovieSearch(generics.ListAPIView):
  def get(self, request):
    # キーワード抽出
    params = request.GET.get('keyword')
    # 全角スペースを半角スペースに変換
    # 半角スペースで分割
    keywords = keyword_serializer.validated_data.get('keyword').replace('　', ' ').split(' ')
    # Qオブジェクトを生成
    query = Q()
    # タイトルとタグをキーワードで絞り込む
    for keyword in keywords:
        query &= (Q(title__icontains=keyword) | Q(tag__name__icontains=keyword))
    # 対象の動画一覧取得
    queryset = Movie.object.filter(query)
```

- キーワードに`ホラー`と`恋愛`を指定して、`動画A`が取得できることを期待した
- しかし、結果は<b>0件で何も取得できなかった</b>


## 原因調査
- filterの後ろに`query`とつけることで、生クエリを確認することができる
- `print(Movie.object.filter(query).query)`をコードに定義し、生クエリを確認した


```sql
SELECT /*長いので省略*/ FROM movie LEFT OUTER JOIN movie_tag ON (movie.uuid = movie_tag.movie_id) LEFT OUTER JOIN tags ON (movie_tag.tags_id = tags.id) WHERE (movie.title LIKE %ホラー% OR tags.name LIKE %ホラー%) AND (movie.title LIKE %恋愛% OR tags.name LIKE %恋愛%))
```

- 中間テーブルとタグテーブルを`LEFT OUTER JOIN`しており、結合されたテーブルを`(タイトル | タグ)`のAND条件で検索していた

- 結合テーブルのイメージ

|動画ID|タイトル|中間テーブルID|タグID|タグ名|
|:--|:--|:--|:--|:--|
|1|A動画|1|1|ホラー|
|1|A動画|2|2|恋愛|
|1|A動画|3|3|SF|
|2|B動画|4|2|恋愛|
|2|B動画|5|4|歴史|

- `ホラー`と`恋愛`をもつ1レコードなど存在しないため、結果が0件になっていた



## 修正したコード
- 自力で色々試して、とりあえずやりたいことは以下のコードで実現できた

```python:成功コード
class MovieSearch(generics.ListAPIView):
  def get(self, request):
    # キーワード抽出
    params = request.GET.get('keyword')
    # 全角スペースを半角スペースに変換
    # 半角スペースで分割
    keywords = keyword_serializer.validated_data.get('keyword').replace('　', ' ').split(' ')
    # 対象の動画一覧取得
    queryset = Movie.object.all()
    # タイトルとタグをキーワードで絞り込む
    for keyword in keywords:
        queryset = queryset.filter(Q(title__icontains=keyword) | Q(tag__name__icontains=keyword))
    # 重複レコードを削除
    queryset = queryset.distinct()
```

- `ホラー`と`恋愛`で検索すると、１回目は結合テーブルを`ホラー`で、2回目は1回目の検索結果を元に結合テーブルを作成し`ホラー`と`恋愛`で検索するため、重複レコードが発生する
- そのため、`distinct()`で重複レコードを作成する処理を追加した


## 懸念
- 毎回filterを実行するので、処理時間は遅いでしょう。
- 大人しく生クエリ書くか・・・・


もし、もっと良い方法があればどなたか教えていただければと思います。。
AOJトライに関する知識知見の記録共有 （Volume0-0039）


# 概要
Roman Figure

https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0039

# コード
補助記号Zを使用

```

def roman_to_alabia(c):
    dict_r2a = {
        "Z": 0,
        "I": 1,
        "V": 5,
        "X": 10,
        "L": 50,
        "C": 100,
        "D": 500,
        "M": 1000,
    }
    return dict_r2a[c]

def calc_plus_minus(x, y):
    ret = 0
    xi, yi = [roman_to_alabia(r) for r in [x, y]]
    if xi < yi:
        ret = -1 * xi
    else:
        ret = xi
    return ret

def Roman_Figure(r_str):
    r_str = r_str + "Z"
    ret = 0
    for i in range(len(r_str)-1):
        ret = ret + calc_plus_minus(r_str[i], r_str[i+1])
    return ret

def hoge(*args):
    ret = []
    for arg in args:
        print(arg)
        ret.append(Roman_Figure(arg))
    return ret

print(hoge(
"IV",
"CCCCLXXXXVIIII",
"CDXCIX",
))
```

# 実行結果
デバッグログ出力部含む

```
IV
CCCCLXXXXVIIII
CDXCIX
[4, 499, 499]
```
VL6180Xを使ってみた

今回0mm〜150mm程度の長短距離を計測する必要があったため
TOF技術のVL6180Xを使用してみた。
購入は以下から行った
https://strawberry-linux.com/catalog/items?code=16180

<h1>まずは配線</h1>
![スクリーンショット 2021-10-13 23.38.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/c4d7755b-21bb-c5cd-2721-b852cba19f8d.png)
![スクリーンショット 2021-10-13 23.42.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/bcb9de47-ed9f-2d4b-8300-fff879fd5eb1.png)
※ICは、VL6180Xです。

<h1>arduino プログラム</h1>
arduinoIDE＞ツール＞ライブラリを管理
からVL6180Xを検索しインストール
![スクリーンショット 2021-10-13 23.45.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/170c59bb-28ac-932d-be38-a6778b3ac3c6.png)
ファイル＞スケッチ例
にVL6180Xのサンプルができるので早速「RangeSingleShot」を選択！
![スクリーンショット 2021-10-13 23.46.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/f71fda35-ba79-2873-0d90-bd1f9187c0dd.png)

arduinoにダウンロードすると計測した値がシリアルモニタで確認できます。


<h1>ちょっと困った点</h1>
計測できるのはいいが、製品にする場合、透明のプラスチックなどで
センサーを保護してあげる必要があります。
しかし、プラスチックを使うとその距離を計測値として表示してしまう。
どうすればいいんだ。。。

色々調べた結果、センサーにべったり透明のプラスチックをくっつけると
問題ないようでした！
以下が参考にした動画です。
https://www.youtube.com/watch?v=7INefyjvvdI
Jupyter Notebookでコードの自動補完


#概要

Jupyter Notebookでコードの自動補完できないものかと検索。Nbextensionsが良さそうなので実装した。


#環境
```
macOS: Catalina 10.15.7
xCode: version 12.4
```

#ライブラリのインストール
```bash:terminal
$pip install jupyter-contrib-nbextensions
$pip install jupyter-nbextensions-configurator
```
#拡張機能の有効化

```bash:terminal
$jupyter contrib nbextension install
$jupyter nbextensions_configurator enable
```
#補完の有効化
`jupyter notebook`を起動すると、`Nbextensions`タブができているので、そこの`Hinterland`を有効化すれば、補完機能が有効になる。

![スクリーンショット 2021-10-13 23.36.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488261/ed111b1c-eff6-a042-def5-e1d51401bc8f.png)

#まとめ
jupyter notebookでのコーディングが楽になった。もっと早く導入したら良かった。

#参考リンク

https://www.soudegesu.com/post/python/jupyter-autocomplete/
Spacemacsのtypescript-tsx-modeでインデント幅を設定する方法

## 挙動
- 複数行を選択し `=` でインデントの実行をした場合には4spaceでインデントされる
- 1行ごとに `==` でインデントを実行した場合には2spaceでインデントされる。

![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25428/c39e0809-b088-f9a2-c923-2b93ec618fe1.gif)

## System Info :computer:
- OS: darwin
- Emacs: 27.2
- Spacemacs: 0.300.0
- Spacemacs branch: develop (rev. f5bd49cc8)
- Graphic display: t
- Distribution: spacemacs
- Editing style: hybrid
- Completion: ivy
- Layers:

```elisp
 lsp
 (javascript :variables js-indent-level 2)
 (html :variables web-mode-code-indent-offset 2 
  web-mode-markup-indent-offset 2 
  web-mode-css-indent-offset 2 
  web-mode-script-padding 2)
 (typescript :variables typescript-indent-level 2)
```

## 修正方法
`dotspacemacs/user-config` に下記を追加。

```elisp
(with-eval-after-load 'lsp-mode
  (add-to-list 'lsp--formatting-indent-alist '(typescript-tsx-mode . typescript-indent-level)))
```

## 調査ログ
- typescript-layer と html-layer を呼び出す場合は `.tsx` のメジャーモードは typescript-tsx-mode になる
    - `typescript-tsx-mode` の実態は `web-mode`
    - https://github.com/syl20bnr/spacemacs/blob/63056ecb50f93808781b97feab1c3225d35c7aa1/layers/%2Blang/typescript/packages.el#L102-L103
- lsp-mode インデントテーブルには `typescript-tsx-mode`が定義されていないため `standard-indent` が使用される
    - https://github.com/emacs-lsp/lsp-mode/blob/237363939b2630a807261f31614ac98fad29b785/lsp-mode.el#L5517-L5556
    - `standard-indent` が `4` になっていたため、4spaceでインデントされていた
- regionを選択後に `=` した場合、formatする実態は `indent-region` だった
    - `indent-region-function` の設定を変更し lsp-mode の関数呼び出しをしない方法でも解決ができそう
    - つまり `(setq indent-region-function nil)` 的なことをする
    - https://github.com/emacs-lsp/lsp-mode/issues/398
Windows PowerShell AD関連 コマンド

#あいさつ
ども、こんにちは。
自分の中に「めんどくさい」の概念がないことがめんどくさい、けいしーです。

PowerShellコマンドの備忘録の記事を一括りにしていたのですが、別分けした方が見やすいかなと感じ、別で記事として出した次第です。
恐らく仕事で使用するコマンドがバラバラと出てくると思うので、これも随時更新する方針です。(´・ω・｀)

##AD関連

###コンピューターアカウントが所属するグループ名の情報を取得する。

```PowerShell:PowerShell
Get-ADGroup -Filter *| select Name, @{Label = "MemberNames"; Expression = {($_| Get-ADGroupMember| select -ExpandProperty Name) -join ","}}| Format-List
```

以下、元ネタ。

https://social.technet.microsoft.com/Forums/lync/ja-JP/0e9d8f76-a42c-4a94-97fc-8313dc2365a1/adgroup12392adgroup12513125311249612540123981996835239?forum=powershellja


###コンピューターアカウントが所属するグループ名の情報を取得する。パート 2

```PowerShell:PowerShell
Get-CimInstance -Class Win32_GroupUser -Filter 'Caption LIKE "a"'
```

#あとがき
ひとまず、整理するという形で転記だけ。(´・ω・｀)
何かあれば追記、大きな追加がされたらSNSとかで宣伝させていただくかもしれません。
よろしくお願い致します。m(_ _)m
うるせえさっさと docker buildx させろ - ubuntuならこれ一撃で動くよ！

「最新のMacからラズパイ4、それに従来のamd64まで
　マルチに対応したコンテナが作れる `docker buildx`」

なにそれすごい！

```無慈悲.sh
❯ docker buildx
docker: 'buildx' is not a docker command.
See 'docker --help'
```

おおう...

どうも2021/10時点で、「Windows/Mac版 Docker Desktop」なら設定一箇所変えるだけで使えるようですが、
Linux版はプロプリなバイナリを含む関係で apt 一発では入らないのでした。

てわけで tl&dr; なアナタに、一撃設定スクリプトを書いてみました。
Dockerデーモンの再起動までやっちゃいます。
`/etc/docker/daemon.json` を弄るので、もし何か設定をされている場合は上書きされてしまうのでご注意下さい!!

```setup_docker_buildx.sh
#!/usr/bin/env bash
# 必要なパッケージ
sudo apt-get install -y qemu qemu-user-static binfmt-support debootstrap

# linuxではbuildxランタイムの手動インストールが必要
# 参考: https://docs.docker.com/buildx/working-with-buildx/
mkdir -p ~/.docker/cli-plugins/
cd ~/.docker/cli-plugins/ || exit
wget https://github.com/docker/buildx/releases/download/v0.6.3/buildx-v0.6.3.linux-amd64
mv buildx-v0.6.3.linux-amd64 docker-buildx
chmod a+x ~/.docker/cli-plugins/docker-buildx

sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.backup$(date '+%Y%m%d_%H%M%S')
echo '{"experimental":true}' | sudo tee /etc/docker/daemon.json
sudo systemctl restart docker
```


数分で終わります。(複数アーキテクチャが並列ビルドされてちょっと面白いです)
終わったら `docker buildx version`が実行出来ることを確認します：

```試す.sh
❯ docker buildx version
github.com/docker/buildx v0.6.3-docker 266c0eac611d64fcc0c72d80206aa364e826758d
```
お、何か動いてる！


上記がOKでしたら、こんな感じで従来の
 `docker build` だった部分をそのまま `docker buildx build` + オプション指定に置き換えて実行すれば、
だいたい一発で動いちゃうと思います。こりゃすごい

```build_and_push.sh
# まずビルダーを作成
docker buildx create --name armBuilder
docker buildx use armBuilder

# multi arch ビルド & プッシュ
docker buildx build . \
    --platform linux/amd64,linux/arm64/v8 \
    --output=type=image,push=true \
    --tag taiyodayo/my_app
```

エラー無く実行できたら多分成功です！おめでとうございます！
ubuntuやalpineベースのイメージは結構な割合でそのままビルドできちゃう印象です。
こりゃ Apple Silicon が捗ります。

さてここからは確認だけですので忙しい方は読み飛ばしてOKです！
まず docker hub から イメージがマルチアーキになっているか確認します：

![Screenshot 2021-10-13 at 23.14.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255842/31c2523b-59df-99d9-8629-3741bbfe0706.png)

うへーいしっかりarm64/amd64が選べるようになってます！

コマンドからも確認できます。
`docker image inspect taiyodayo/my_app` するとJSONでイメージのマニフェストが確認できます

```
# M1 MacBook Air から docker pull taiyodayo/my_app した場合
        "Architecture": "arm64",
        "Os": "linux",
        "Size": 611768789,
        "VirtualSize": 611768789,

# amd64のUbuntuマシンで docker pull taiyodayo/my_app した場合
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 658537637,
        "VirtualSize": 658537637,
```

しっかり各アーキテクチャごとにビルドされてますね！
なにげに push も一緒に出来たり `buildx`、色々試しがいがありそうです。
こりゃ楽しい！
AlmaLinux8.4にbind-9.16.21をインストール

```
# 準備(必要な準備は環境よって違うでしょう)
sudo yum install automake
sudo yum install libtool
sudo yum install openssl-devel
# libuv
# bind-9.16からlibuvが必要らしい...
#
cd /usr/local/arch/
curl -O https://dist.libuv.org/dist/v1.42.0/libuv-v1.42.0.tar.gz
cd /usr/local/src/
tar zxvf ../arch/libuv-v1.42.0.tar.gz
cd libuv-v1.42.0/
./autogen.sh 2>&1 | tee autogen.sh.log
./configure 2>&1 | tee configure.log
make 2>&1 | tee make.log
sudo make install 2>&1 | tee make-install.log
# library pathに追加
# 環境汚したくない場合はやらなくてもOK
sudo vi /etc/ld.so.conf.d/usr_local.conf
---
/usr/local/lib
---
sudo ldconfig
# 確認
ldconfig -p | grep local
#
# bind
#
cd /usr/local/arch/
curl -O https://downloads.isc.org/isc/bind9/9.16.21/bind-9.16.21.tar.xz
cd /usr/local/src/
tar Jxvf ../arch/bind-9.16.21.tar.xz
cd bind-9.16.21/
# configureでLIBS='-luv'をわざわざつけないとmakeが失敗します...
./configure --disable-linux-caps LIBUV_CFLAGS='-I/usr/local/include' LIBUV_LIBS='-L/usr/local/lib' LIBS='-luv\
' 2>&1 | tee configure.log
# library pathに/usr/local/libを加えなかった場合はこちらで
# あるいはLD_LIBRARY_PATHやLD_RUN_PATHの環境変数を設定するのもありでしょう
./configure --disable-linux-caps LIBUV_CFLAGS='-I/usr/local/include' LIBUV_LIBS='-L/usr/local/lib' LDFLAGS='\
-L/usr/local/lib -Wl,-rpath,/usr/local/lib' LIBS='-luv' 2>&1 | tee configure.log
make 2>&1 | tee make.log
sudo make install 2>&1 | tee make-install.log
```