OmniAICreator/Qiita-1.07M huggingface dataset:
qube render farm ae to mp4

```
@echo off
echo "This script create by satou 20220826"
set arg=%*
set arg=%arg:J:\=\\isilon-nas\tomotoon\%

@echo off
setlocal enabledelayedexpansion

set args=%*
set arr.length=0

if #!args!==# goto :usage

for %%I in ("%args: =" "%") do (
    set val=%%I
    set arr[!arr.length!]=!val:"=!
    set /a arr.length=!arr.length! + 1
)

@REM echo arr[] has a length of %arr.length%.

set /a arr.Ubound=%arr.length% - 1
set targetFile = ""
for /L %%I in (0, 1, %arr.Ubound%) do (
    echo !arr[%%I]!|find "output" >nul
    if not errorlevel 1 (
      set /a idx=%%I+1
    )
    if %%I == !idx! (
      
      @REM for %%F in (!arr[%%I]!) do (
      @REM   echo %%~nxF
      @REM   echo F| xcopy /s !arr[%%I]! %temp%\%%~nxF
      @REM   @REM I:/script/bin/td/tools/opensource/ImageMagick-6.8.9-Q16/ffmpeg.exe  -i %temp%\%%~nxF -qscale 0 %temp%\%%~nxF:~0,-4!.mp4
      @REM   I:/script/bin/td/tools/ffmpeg-master-latest-win64-gpl-shared/bin/ffmpeg.exe -i %temp%\%%~nxF -qscale 0 %temp%\%%~nxF:~0,-4!.mp4
      @REM )
      @REM I:/script/bin/td/tools/opensource/ImageMagick-6.8.9-Q16/ffmpeg.exe  -i !arr[%%I]! -qscale 0 !arr[%%I]:~0,-4!.mp4
      
      @REM IF EXIST !arr[%%I]:~0,-4!.mp4 (
      @REM   echo !arr[%%I]:~0,-4!.mp4
      @REM   del !arr[%%I]:~0,-4!.mp4
      @REM )

      I:/script/bin/td/tools/ffmpeg-master-latest-win64-gpl-shared/bin/ffmpeg.exe  -i !arr[%%I]! -qscale 0 !arr[%%I]:~0,-4!.mp4
      
      goto :EOF
    )
)
```
ffmpeg convert mp4

https://github.com/BtbN/FFmpeg-Builds/releases

```
if not exist "mp4" mkdir mp4
for %%f in (*.avi) do (
  I:/script/bin/td/tools/ffmpeg-master-latest-win64-gpl-shared/bin/ffmpeg.exe -i %%f -qscale 0 mp4/%%~nf.mp4
)
```
Macのcommandファイル（シェルスクリプト）でネットワークドライブ自動マウント（システム環境設定オンリーのやり方も）

# 概要

Macでログインするたびに
**Finder⇒移動⇒サーバーへ接続**
をしてネットワークドライブをマウントするのが面倒…　_(:3」∠)_

**『ネットワークドライブマウントしてくれるcommandファイル』** があればいいなあ…。
（ネットワークドライブをマウントしたい時はそのcommandファイルを実行するだけでOK）

さらに、そのcommandファイルをログイン項目に設定しておけば、 **ログインと同時にネットーワークドライブが自動マウント** されてさらに便利だよね。

そんな時。

（commandファイルの作り方や、ログイン項目の設定の仕方を知らなくても、マウスでポチポチするだけで設定できる方法も後半に書いてあるよー）

# やり方

```shell:commandファイルの中身
open 'smb://ユーザー名:パスワード@サーバー名/マウントするフォルダー名'
```

ここでのユーザー名とパスワードは **ネットワークドライブ接続する時の** ユーザー名とパスワード。
（Macのユーザーではない）

サーバー名の部分はIPアドレスでもよい。

## ファイルサーバー側の環境

Ubuntu + Samba でファイルサーバーを構築した場合のやり方です。

# commandファイル作るのとかだりーわ…

**ただマウントできればいい**

そんな場合はシステム環境設定のユーザーとグループ…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/9a1420dc-e388-5b09-f465-2d22e3f43f90.png)

ログイン項目にボリューム（マウントしたいファイルサーバーのフォルダー）を登録。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/99f51218-caff-960c-83d7-743687983b5a.png)

これならCommandファイルいちいち作らなくていいから楽。

要件によってはこの方法で充分ということもある。

# 参考サイトさん

https://rui-log.com/mac-networkdrive-automount/

# バージョン

macOS Monterey バージョン12.5.1

Ubuntu 20.04.5 LTS
Samba Version 4.13.17-Ubuntu
Exchange Onlineで受信メールを捨てる(/dev/null)

現在の職場ではExchange Onlineを使っています。
そこのメールサーバー設定で、PostfixやsendmailなどUnix系メールサーバでおなじみの「配送先指定に /dev/null を指定する」という設定をしたくなりました。
でも受信メールを破棄する設定なんて見た覚えがありません。
＃ユーザーがどうしても受信したくないという

当然ググってみたり docs.microsoft.com を検索して回ったりしましたが、回答は出てきませんでした。
そこでひねり出した方法がこれ
> 転送先・もしくはそのメールアドレス自体を、メンバーが空の「メールアドレスが有効なグループ」にする
``` PowerShell
New-DistributionGroup -Name DEV-NULL -DisplayName "転送破棄用" Type Security -MemberJoinRestriction Closed
```
このグループに alias を追加していってもよいし、転送先をこのグループにしてもよいという仕掛けにしています。
まだ1例でしか採用していませんが、特に問題なくメールを破棄できているようです。
【Azure DevOps】ACRにPushするコンテナタグにコミットハッシュを指定する

Azure DevOpsで成果物であるコンテナをACRにPushし、Webapp for Containerへデプロイするパイプラインを作成しました。
その際、ACRのコンテナタグを一意にするため、コミットハッシュを使いたかたったのですが、情報があまりなかったので手順を残しておきます。

ベースとなるDevOpsの設定や、WebAppについてはこちらの記事を参照

https://qiita.com/Yosuke_Sakaue/items/aad936218dde42411bb2

### yamlを修正
tagを`$(Build.SourceVersion)`に変更
`$(Build.SourceVersion)`はPipelineがトリガーされたgit commitのハッシュを参照する変数です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/4024888e-23f6-d31d-59f6-98dade4b1c13.png)

### Releasesを修正
Pipelineを変更しただけではACRにPushするところまでですので、実際にどのtagをデプロイするか管理しているReleasesも修正する必要があります
Releasesでも同じく`$(Build.SourceVersion)`が利用できます

Azure App Service deployのTask内でtagを指定している箇所があるので、ここを`$(Build.SourceVersion)`に置き換えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/4f4e02cf-1c02-7296-5330-60096d3edaa0.png)


### 動作確認
ACRにコミットハッシュでイメージがPushされており、WebAppが更新されていればOKです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/377fbf12-a0e5-17ea-2c8e-4dd54d3d731d.png)

### 雑感
`$(Build.SourceVersion)`で参照できるハッシュが長いのでShort Hash(8桁)で利用できる方法があればなお良し
Go言語 – Slice / 配列 を for~range で展開してポインタを append すると全部同じ値になる

# 参考

>Goにおいてスライスおよびマップをforで回す際には「rangeで取ってきている値は常に同じメモリアドレスに格納される」ようになっています

https://zenn.dev/canalun/articles/go_for_loop_pointer_trap



後述するが、このせいで一部挙動に問題が出るようだ。


# TL; DR

あまり深く考えずGolangの仕様と割り切ったら良い気がした。

こちらも後述するがループ内で変数を再定義することで回避できる。

# 例


```go
package main

import "fmt"

func main() {
	numbers := []int{1, 2, 3}

	for _, number := range numbers {
		fmt.Println(number)
		fmt.Println(&number)
	}
}

// 結果
// 1
// 0xc0000b2000
// 2
// 0xc0000b2000
// 3
// 0xc0000b2000

```

この例でいうと number に全て同じアドレスが割り当てられている。
値はそれぞれ別のものをPrint出来るがアドレスは同じ。

は？？？

**同じアドレスが使われている…だから何やねん** っていう。

深く考えたら負けというか、追いかけても理解が一筋縄にはいかない気がした。
気持ち的にはGolangの仕様というかバグぐらいって言いたい。

# append で困る場合

たとえば各値のポインタで新配列/スライスを作ろうとする場合などに問題が起きそうだ。

```go
package main

import "fmt"

func main() {
	numbers := []int{1, 2, 3}
	copy_numbers := []*int{}

	for _, number := range numbers {
		copy_numbers = append(copy_numbers, &number)
	}

	for _, copy_number := range copy_numbers {
		fmt.Println(*copy_number)
	}

}

// 結果
// 3
// 3
// 3
```

>ループを抜けた後にアドレスを参照して値を確認すると全てが

全てが最後の値を参照してしまうらしい。

https://zenn.dev/muro/articles/c988a58bd48814

この場合の対策

ループ内で変数を再定義すると良いようだ。

```diff
package main

import "fmt"

func main() {
	numbers := []int{1, 2, 3}
	copy_numbers := []*int{}

	for _, number := range numbers {
-		copy_numbers = append(copy_numbers, &number)
+		n := number
+		copy_numbers = append(copy_numbers, &n)
	}

	for _, copy_number := range copy_numbers {
		fmt.Println(*copy_number)
	}

}
// 結果
// 1
// 2
// 3
```

# 参考

https://pyteyon.hatenablog.com/entry/2021/10/12/032217#range-%E3%81%AE%E4%BB%95%E6%A7%98%E3%81%AE%E8%AA%BF%E6%9F%BB

>私は `for i, n := range sl {...}` という for 文を実装したとき、「n にはループ毎に sl[i] が入るから、その値へのポインタも `sl[i]` へのポインタに等しい。だからループ毎に n へのポインタも書き換わるはず。」と考えていた。しかし、実際にはn はループ用に定義された一時的な変数であり、for 文のブロックに入った時に一度だけメモリが確保され、ループ毎に値が上書きされるだけの変数である。つまり、range によって定義された n へのポインタはループ中は一定である。

<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura

<!-- Update From Qiita API -->
Ubuntuで自身のIPアドレス確認コマンド

# やり方

端末開いて下記。
（とにかく短いコマンド）

```shell
ip a
```

いくつか出てくる中の ```inet``` のところにIPアドレス出てくるやつ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d24fd43d-0400-cf26-c92f-7855832dbed3.png)

# バージョン

Ubuntu 20.04.5 LTS
javascirptで64の倍数の配列（数列）をモダンな記法、fill()やmap()でスマートに作る方法

## 例：こんな配列がほしい

```javascript
[ 64, 128, 192, 256, 320, 384, 448, 512, 576, 640, 704, 768 ]
```

## レガシーな書き方

```javascript
var array = []
for(let i=1; i<10; i++){
    array[i] = i*64
}
```


## なるべくモダンな記法で書きたい

```javascript
const array = new Array(12).fill(64).map((v, i) => {return (i + 1) * v})
```

## 解説

new Array(12) で空要素が12個ある配列を作ります
Array.fill(64)で64を埋めます 
各要素をMapで繰り返し処理してindex+1を乗算しています

## コメント頂きました

@shiracamus さん提供

関数ブロックを式にして、よりスッキリとした書き方。

```javascript
const array1 = Array(12).fill(64).map((v, i) => (i + 1) * v)
const array2 = Array(12).fill().map((_, i) => ++i * 64)
const array3 = [...Array(12).keys()].map(i => ++i * 64)
```


@think49 さん提供

ジェネレータ関数を定義して使い回せるようにした書き方。

```javascript
'use strict';
function* multiple(number, length) {
  let i = 0;
  while (length - i) yield number * ++i;
}

console.log([...multiple(2, 5)]);  // [2, 4, 6, 8, 10]
console.log([...multiple(64, 5)]); // [64, 128, 192, 256, 320]
```

他にもあれば教えて下さい！編集リクエストもお待ちしています！
brew doctor Warning:Install Clang or run `brew install gcc`.から、抜け出せなくなったのち、解決した。

# はじめに

brew doctor
Warning: No developer tools installed.
Install Clang or run `brew install gcc`.から、抜け出せなくなったのち、解決した。

# 最終更新日
2022年8月29日

# 環境の情報
OS
Ubuntu20.04

# 注意
最新の状態を確認して下さい。

# 参考さまはこちら
https://brew.sh/
https://docs.brew.sh/Homebrew-on-Linux#requirements
https://blog.tagbangers.co.jp/ja/2019/07/13/linuxbrew
https://www.ni4.jp/2021/09/04-141000.html
https://github.com/Homebrew/linuxbrew-core/issues/23436
https://github.com/Homebrew/discussions/discussions/3030
https://packages.ubuntu.com/focal/build-essential
https://kazuhira-r.hatenablog.com/entry/2020/11/30/204027
https://packages.debian.org/ja/sid/build-essential
https://qiita.com/h_tyokinuhata/items/431a56fb054145468c16
https://e-words.jp/w/gcc.html


# 簡単な状況説明

・brewはインストール。
・パスは取っている。
・$ brew doctorしたところ、
「Warning: No developer tools installed.
Install Clang or run `brew install gcc`.」になり進めない。



# 詳しい状況説明

brewインストールする。
```
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
↓
パスを通す。
↓
よしよし、では、お目当てのwardenをインストールして・・・
```
$ brew install davidalger/warden/warden
==> Downloading 
```
↓
バキッ！
```
Error: The following formula cannot be installed from bottle and must be
built from source.
  warden
Install Clang or run `brew install gcc`.
```

(　･ิω･ิ)＜・・・


# 行ったこと

brew doctorで確認する。
Homebrewの問題をチェックしてくれる。
やはり、brew install gccが出る模様。
```
$ brew doctor
Warning: No developer tools installed.
Install Clang or run `brew install gcc`.
```
↓
gccを、インストールする。
しかし、うまくいかない。
```
$ brew install gcc
Warning: The post-install step did not complete successfully
You can try again using:
  brew postinstall gcc
```
↓
postinstallでは？
うまくいかない。
```
$ brew postinstall gcc
==> Postinstalling gcc
Warning: The post-install step did not complete successfully
You can try again using:
  brew postinstall gcc
```
↓
また、出たので、 brew postinstall gccする…
```
$ brew postinstall gcc
==> Postinstalling gcc
Warning: The post-install step did not complete successfully
You can try again using:
  brew postinstall gcc
```

(　･ิω･ิ)＜・・・


↓
気づく。
インストールする。
```
$ sudo apt-get install build-essential procps curl file git
[sudo] password for user: 
```
パッケージリストを読み込んでいます... 完了
↓
postinstallする。
```
$ brew postinstall gcc
==> Postinstalling gcc
==> Creating the GCC specs file: /home/linuxbrew/.linuxbrew/Cellar/gcc/12.2.0/bin/../lib/gcc/current/gcc/x86_64-pc-l
```
↓
大丈夫そう。
```
$ brew doctor
Your system is ready to brew.
```
↓
無事出来ました！
```
$ brew install davidalger/warden/warden
==> Installing warden from davidalger/warden
```


# 補足

## build-essentialとは

Debianのパッケージを作るために、
必要なパッケージを、色々インストールする。
gccとか、g++とか、
makeとかその他色々入るらしい。


## gccとは

GNU Compiler Collection
コンパイラ。
GNUプロジェクトが開発している。
くだらないアプリのアイデアを教えてくれ

[Tell me a stupid app idea and I'll make it](https://dev.to/virejdasani/tell-me-a-stupid-app-idea-and-ill-make-it-1a9f)という、いかにも立て逃げにしか見えないスレッドに何故かやたら返信が集まっていたので軽く紹介してみます。

著者はVirej Dasani( [Twitter](https://twitter.com/VirejDasani) / [GitHub](https://github.com/virejdasani) / [Webサイト](https://virejdasani.github.io/) )です。

# Tell me a stupid app idea and I'll make it

くだらないアプリのアイデアを教えてださいな。
最近暇なので、何か作りたいと思ってるんだ。

返信はここでもいいし、[Youtubeのコミュニティ](https://www.youtube.com/channel/UCRzS48bskynAxoI38BFypfQ/community?lb=Ugkx1ujaEJERmzBGsV5O_iydsG7HqUNvrO80)でもいいよ。


# コメント欄

## Sorin Costea

くだらないアプリのアイデアを生み出すアプリ。

## Keff

日付を当てるゲーム。
間違ってたら『正解との間にラクダが2世代死んでる』とかヒントを出す。

## Kirill Shestakov

↑Wikipediaとかを使って『正解との間に○○のイベントが起こった』みたいにヒントを出したら本格的な推理ゲームにできそう。

## Jon Randy

ブロックチェーンでよくわからんアートワークを買い漁って所有権を主張しよう。

## James Thomson

分散型台帳。
あらゆるマーケティング用語を網羅し、現実世界のあらゆる問題を解決すると豪語するけど、実際はあらゆる問題をさらに複雑化するだけ。

## jonosellier

コードに自動でコメントしてくれるアプリ。

```js
const a = "27" //declare a constant called a with the string value of 27
```

## José Aponte

タイマーを凝視している間だけタイマーがカウントされ、そのタイマーでランキングする。

## Marcelo Rafael

ランダムに褒め言葉を通知してくれる。
間違って無い髪を褒めないようにbaldモードも実装すること。

## Vladimir Ivakhnenko

Gitの履歴から動画を生成する。
ファイルの追加削除数、コードの追加削除行数、プロジェクトの参加者などを動画にまとめてくれる。

## Shinigami

太陽系の各惑星の時刻を見れる世界時計。

## Benny Neugebauer

コンパイラが見つけたエラーの数に応じて怪我がひどくなる[VS拡張](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6jptbqxx1sce8upqsm6s.jpg)。

## ayan-404

週末までの時間をカウントダウンする。
週末になったらアクセスできなくなって、月曜日の00:01にふたたびカウントダウンが始まる。

## notsoavailablemako

モチベーションを下げよう。

## Now is the time

ペットが使うためのTinder。

## Dave

過去の発言傾向から、あなたと最も相性の悪いコミュニティを紹介してくれるアプリ。

## Matthew Terrence

お料理レシピアプリ。
ただし1行ごとに言語と単位系が変わるぞ。

## chrdek

読み上げた音声サンプルを文字起こししてテキスト化し、そのテキストを合成音声ソフトに取り込んでスピーカーから鳴らし、マイクを繋いで録音し、Bluetoothで別のアクセスポイントに転送し、スピーカーから合成音声で音声を聞くことができます。

## Luke Shiru

写真を共有する、と言いつつ実際は[FOMO](https://ja.wikipedia.org/wiki/FOMO)を利用して24時間で勝手に消してしまうアプリ。
…あれ？そんなのが既に実在したような？



# [Youtubeコミュニティ](https://www.youtube.com/channel/UCRzS48bskynAxoI38BFypfQ/community?lb=Ugkx1ujaEJERmzBGsV5O_iydsG7HqUNvrO80)

・おすすめ曲だけをスキップする音楽アプリ。

・Youtubeの広告だけをダウンロードするアプリ。

・リックロールするアプリ。 ( ※海外における[バーボンハウス](https://dic.nicovideo.jp/a/%E3%83%90%E3%83%BC%E3%83%9C%E3%83%B3%E3%83%8F%E3%82%A6%E3%82%B9)的ミームらしい )

・冬に端末を温かくして暖を取るアプリ。

・アプリ内課金の累計額が表示されるアプリ。

・あなたの身長を聞いたあと、身長を教えてくれる。

・"git"って文字を全て"VirGit"にする。

・バックグラウンドノイズをランダムに鳴らす睡眠導入アプリ。

・"2 + 2 = 5"を証明する。

・アイドルクリッカー。

・アプリを開くとUwUとかLOLとか言ってくる。


# その後

てっきり立て逃げかと思いきや、一部のアイデアは本当に作ってしまいました。
まさかの有言実行。

https://www.youtube.com/watch?v=ndmzLQPbg7s
https://www.youtube.com/watch?v=SGFNhz91yNQ
https://www.youtube.com/watch?v=gheeg-5sxDQ

編集もサクサクで見やすくていいですね。



# 感想

アイドルクリッカー作ってくれ。

本当にくだらないアイデアから、肉付けすれば普通に使えるようなアイデアまで様々なものが集まっています。
紹介してない返信にも面白そうなのが幾つもあったので、アイデアに詰まってる人は参考にしてみてはいかがでしょう。
ポートフォリオで使用したGem一覧

Railsポートフォリオで使用したGemの一覧です。

|Gem名  |使用目的  |説明|
|---|---|---|
|devise|ログイン機能
|carrierwave  |画像アップロード用 <br>保存先は開発環境はローカル、本番環境はS3に設定  |DBを圧迫させないためにファイル名をDBに保存している。画像表示は、画像が格納されてるパスとDBに保存されているファイル名を使用|
|fog-aws |S3に保存用
|dotenv-rails |環境変数を設定|プロジェクト配下に.envファイルを作成し、ファイル内に環境変数を記入し、ENVで呼び出す
|ransack|検索機能の実装用|
|kaminari|ページネーションの実装用|kaminari-bootstrapを使うと簡単に綺麗なページネーション作成可能
|rspec-rails|テスト用
|factory_bot_rails|テスト用のデータを生成してくれる
|pry-rails|デバッグツール|処理の確認したい箇所にbinding.pryを入れて値など確認できる
|rubcop-airbnb|Rubyコードの自動整形ツール|
Azure App Service インスタンス に ローカルからファイル転送したい。(vscode plugin 利用時)

deploy するソースコードとは別に、Azure App Service の インスタンス 内にファイルを送りこみたい時に使えます。

# 前提
- [Azure App Service の　Vscode Plugin](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureappservice) で ssh ができること

# 手順
- ファイルを転送する先の Azure App Service インスタンスに Vscode Plugin のメニューから `SSH into Web App` を実行する
- `SSH into Web App` するとターミナルに ssh コマンドが表示される
- 上記 ssh コマンドを以下の形式に加工して実行する
    - `scp -c aes256-cbc  -P <app_service_ssh_port> <path_to_your_file> root@127.0.0.1:/tmp`
    - /tmp に `<path_to_your_file>` が転送される

以上です。
LOD チャレンジ 2021 レポート

2022年3月に LOD チャレンジ 2021 の [授賞式シンポジウム](https://2021.lodc.jp/awardSymposium2021Report.html) が開催されてから時間が経ってしまいましたが、このイベント時点での LOD の利用状況と私たちの取り組みを（ログとして残す目的も兼ねて）レポートしておきたいと思います。

![lodc2021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410176/d04e8b58-13da-e5b4-0153-c223347e994c.png)
※ https://2021.lodc.jp/

LOD とは Linked Open Data の略で、公共機関や企業がオープンデータを公開する際に、ユーザーの活用の幅を広げるための最も効果的な手法として提案されているものです。LOD チャレンジはこの技術普及の促進を目指したコンテストとして 2011年より毎年開催されています。

その間、オープンデータの重要性は広く認識されるようになり、ウェブ上のオープンデータは大きく増加しました。科学論文誌や生命科学データの共有といった一部の研究機関によるオープンデータ利用だけでなく、公共機関がデータを公開することにより市民が課題解決に参加できるようになるという考え方が一般的になり、各国でオープンデータへの取り組みが義務付けられました。

同時に、データの公開手法についても、技術的な議論が進みました。多くの場合、ただ文書ファイルのようなデータをサイト上に置いておくよりも、機械可読なデータにすることによりより簡単にデータ分析やアプリケーション開発が可能になります。LOD とともに提案されている「オープンデータのための 5つ星スキーム」は、これが常に必須もしくは正解とは言えないまでも、一つの指針として広く知られるようになりました。

![5-star-steps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410176/f8c4b023-47eb-57e5-f53a-c14f0977a6fd.png)
※ https://5stardata.info/images/5-star-steps.png

現在では、統計センターや文化庁のように積極的に LOD を提供している公共機関が多く見受けられるようになりました。これら信頼のあるデータソースを核として、その他のオープンデータ、例えば、ウェブ上でメンテナンスされている地図や、メディア企業が提供するコンテンツ、博物館や図書館の所蔵品、といった情報も紐付けられてきています。

例えば、統計センターのサイト「e-Stat」では「統計 LOD」の API が公開されており、プログラムを書けるユーザーはここにアクセスすることで、データを分析したりアプリケーションを作成したりすることができます。このようなユーザーは「市民データサイエンティスト」と呼ばれ、市民の IT リテラシの向上を社会課題に役立てるために重要な役割を担っています。

![e-stat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410176/d31899c5-275d-1334-fb1e-297040b8eb27.png)
※ https://data.e-stat.go.jp/lodw/

LOD チャレンジ 2021 では実際に統計 LOD から取得されたデータを用いて開発された「全国人口ピラミッダー」といった作品も見受けられました。お住まいの市区町村の人口の変化をすぐに見ることができるので、[こちら](https://www.mirko.jp/pyramid/
)からぜひ試してみてください。今後、データが広く活用されることで、データの整備も進んでいくといった好循環が生まれることが期待されます。

![pyramid_yubari.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410176/bc7ea456-9828-9ca8-0176-4a179df185ce.gif)
※ https://www.mirko.jp/pyramid/

今回、弊社（日本オラクル）はスポンサーとして LOD チャレンジに参加させていただきました。技術パートナーとして、Oracle Cloud の無料枠を
利用して SPARQL エンドポイント（＝ LOD 公開のためのサーバー）を構築する方法を[セミナー](https://lodc2021sparql.peatix.com/)にて紹介しました。学生にも参加いただけるよう、クレジットカードなしでクラウドのアカウントを作成できるようにしましたが、実際の作品でお使いいただいた例はまだまだ限られていました。

また、オラクル賞は [学習指導要領 LOD](https://jp-cos.github.io/) という作品に授与されましたので、その講評をこちらに再掲させていただきます。この作品はデータ整備の価値が高く評価されて最優秀も受賞しており、今後の利活用が期待されます。受賞作品の一覧は[こちら](https://2021.lodc.jp/awardPressRelease2021.html)から確認することができます。

>学習指導要領という用途の広い情報のモデル構築に貢献されているだけでなく、各リソース URI に対する HTML ページや英語の概要ページ、GitHub を使った issue 管理やサイト公開など、丁寧かつ独創的な LOD の作成手法であると評価しました。 今後、外部データとの連携や SPARQL エンドポイントの公開など、LOD 構築の見本となる活動として発展されることを期待しています。

現在、LOD チャレンジ 2022 の作品を募集中で、セミナーにて Oracle Cloud アカウントも提供されます。SPARQL エンドポイントの構築方法は Qiita 記事にもしていますので、ぜひご参照ください。

- [LOD チャレンジ 2022](https://2022.lodc.jp/)（応募期間：2022年6月12日～10月2日）
- [SPARQL エンドポイントの使い方・作り方 2022](https://lodc2022sparql.peatix.com/)（2022年8月30日）
- [Always Free 環境で SPARQL エンドポイントを構築！](https://qiita.com/ryotayamanaka/items/0c924525c7fc3f1e8b80)（Qiita 記事）
【HTML/CSS】画像を見切れて表示させたい

例えば200px × 200pxの枠内に画像を表示させたいとき、imgタグで表示させると画像全体が200px × 200pxに歪められて表示される。
見切れてもいいから縦横比を維持して表示させたい。

```css
img{
    object-fit: cover;
    object-position: top;
}
```

上のように設定すると、画像の上部が縦横比を維持したまま表示され、下部分が見切れて表示されなくなる。
object-positionをbottom、left、rightなどに設定すると、表示する範囲を変えられる。
BOOTSELボタンでLチカ【Raspberry Pi Pico W】

![ezgif-1-e212f3d6c5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/07de1f8c-e083-a423-850c-e287cfff110b.gif)

[Raspberry Pi Pico Wの開発環境構築はこちら](https://qiita.com/relu/items/945bcb45120c30837745)

```python:main.py
import time
    
while True:
    if rp2.bootsel_button() == 1:
        machine.Pin('LED', machine.Pin.OUT).on()
    else:
        machine.Pin('LED', machine.Pin.OUT).off()
    time.sleep(0.1)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/1a72c745-9a1b-1293-295d-d1c1b4c608a4.png)


Raspberry Pi Pico Wのカスタムファームウェアを用意しました。
https://github.com/GitHub30/micropython/blob/GitHub30-patch-1/firmware.uf2

<details><summary>Ubuntuでカスタムファームウェアをビルドすることもできます。</summary>


```bash
# https://www.cnx-software.com/2022/07/03/getting-started-with-wifi-on-raspberry-pi-pico-w-board/#using-wifi-on-raspberry-pi-pico-w-with-c-programming
sudo apt install -y cmake gcc-arm-none-eabi libnewlib-arm-none-eabi build-essential

# https://datasheets.raspberrypi.com/picow/connecting-to-the-internet-with-pico-w.pdf
mkdir picow
cd picow
git clone https://github.com/GitHub30/micropython
git clone https://github.com/micropython/micropython-lib

cd micropython
git checkout rp2-bootsel
# https://forums.raspberrypi.com/viewtopic.php?t=304620
git submodule update --init lib/pico-sdk lib/tinyusb
make -C ports/rp2 BOARD=PICO_W submodules
make -C mpy-cross
cd ports/rp2
make BOARD=PICO_W
# build-PICO_W/firmware.uf2にカスタムファームウェアが作成されます。
```
</details>

変更箇所
https://github.com/micropython/micropython/pull/9134/files

ファームウェア書き込み以外にBOOTSELボタンの近い道が広がりそうです

### 参考

https://github.com/micropython/micropython/issues/6852
Azure Cognitive Search のカスタムAPIで画像を処理する際の設定

初見で手こずったので記録を残す。

手順

- ストレージアカウント と blob コンテナーの作成
- Azure Cognitive Search サービスの作成
    - プランなどを選択する
- Azure Cognitive Search の データソースの作成
    - 前工程で作成した blob コンテナー を参照させる
-  Azure Cognitive Search のインデックスを作成
    -  最初は特に設定しない
    -  ![スクリーンショット 2022-04-22 16.39.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110482/0e32b59d-f61a-f009-6854-5c4ccf0a7e46.png)

- インデクサーを作成する
    - ![スクリーンショット 2022-04-22 19.10.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110482/c8f86a85-c758-0967-31da-28ee08b8f072.png)
    - 抽出されるデータ
        - コンテンツとメタデータを選択する
    - 解析モード
        - 規定を選択する
    - 画像アクション `imageAction` は 3パターン
        - `None` : image を出さない
        - `generateNormalizedImages` : ドキュメント解析の一部として正規化された画像の配列を生成
        - `generateNormalizedImagePerPage` : PDF 内の各ページを 1 つの出力画像にレンダリングする正規化された画像の配列を生成
    - スキルセットでのファイルデータの読み取りを許可する
        - チェックをつける



## カスタムスキルで画像を入力にする際
- カスタム スキル内で画像を使用するには、カスタム スキルへの入力として `/document/normalized_images/*/data` を設定します



# 参考
- [AI エンリッチメントの概念 - Azure Cognitive Search | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-concept-intro#enrichment-steps-)
- [画像からテキストを抽出する - Azure Cognitive Search | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-concept-image-scenarios)
- [プロジェクションを定義する - Azure Cognitive Search | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/search/knowledge-store-projections-examples#define-a-file-projection)
- [ドキュメント抽出の認知技術 - Azure Cognitive Search | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-skill-document-extraction)
- [スキルセットを作成する - Azure Cognitive Search | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-defining-skillset)
- [スキルの出力フィールドをマップする - Azure Cognitive Search | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-output-field-mapping#flattening-information-from-complex-types)
- [AI エンリッチメントの設計に関するヒント - Azure Cognitive Search | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-concept-troubleshooting)
- [スキルセットで入力と出力を参照する - Azure Cognitive Search | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-concept-annotations-syntax)
- [スキル コンテキストと入力注釈の参照言語 - Azure Cognitive Search | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-skill-annotation-language)
- [Shaper コグニティブ スキル - Azure Cognitive Search | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-skill-shaper)
    - 複合の強化ツリーを作成する
- 強化ツリーを作成する
    - https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-working-with-skillsets#enrichment-tree
コピペでできるCloudWatch LogsからSlackに通知するコード

Node.jsだと、レイヤーを導入するのが面倒なので、今回はPythonで。

1. 環境変数`WEBHOOK_URL`にSlackから生成したWebhook URLを設定してください。
2. トリガーのソースはCloudWatch Logsで、ロググループを指定しておきます。

従来のSlack Appを使わないIncoming Webhookはレガシーな方法のようです。1Webhook/チャンネルになったんですね。

https://qiita.com/kshibata101/items/0e13c420080a993c5d16

なので、今回はSlack Appを使うことを前提にしたコードです。
CloudWatch LogsのPayloadを全て出力するようになってます。

```python
#!/usr/bin/python3.9
import urllib3
import json
import base64
import gzip
import os

http = urllib3.PoolManager()

def lambda_handler(event, context):
    
    decoded_data = base64.b64decode(event['awslogs']['data'])
    json_data = json.loads(gzip.decompress(decoded_data))
    
    url = os.environ["WEBHOOK_URL"]
    msg = {
        "text": json.dumps(json_data)
    }

    encoded_msg = json.dumps(msg).encode("utf-8")
    resp = http.request("POST", url, body=encoded_msg)
    print(
        {
            "status_code": resp.status,
            "response": resp.data,
        }
    )
```

## 参考
https://slack.com/intl/ja-jp/help/articles/115005265063-Slack-%E3%81%A7%E3%81%AE-Incoming-Webhook-%E3%81%AE%E5%88%A9%E7%94%A8

https://aws.amazon.com/jp/premiumsupport/knowledge-center/sns-lambda-webhooks-chime-slack-teams/
AWS認定クラウドプラクティショナー試験のためにやったこと

AWS認定クラウドプラクティショナー試験に合格したので、断片的な情報になりますが、やってみたことを記録しておきます。
インスタンスを削除したので合格記録以外の記録はもうここにしか残っていません。

### EC2のインスタンスを起動
オレゴンのリージョンでAWS EC2のインスタンスを起動し、秘密鍵を使ってパブリックのIPアドレスにアクセスするところまでやってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/a9470473-18db-49d7-77b7-d7c62809eb31.png)

### Webサーバを構築
むらびとにいろいろ聞いてみて、どうぐもそろったのでWebサーバを構築してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/97f661e0-99f7-3185-5c4b-d887af48e600.png)

### VPCをやってみる
Virtual Private Cloud（VPC）あたりで仮想化が多重化されていてややこしくなってきました。
ここが踏ん張りどころ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/2592bbcc-e777-9687-8fb3-6424662f5e2d.png)

### ドメインの登録
ドメインをひとつ登録しておきました。
別のレジストラからAWS Route53 に移管することもできるようです。おいおい考えていこう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/beddfce4-5002-73ff-cab8-43459c54e88c.png)

### 東京リージョンに変更
AWSのベースとするリージョンをオレゴンから東京に変えました。
やっぱり日本語化が進んでいるようなので。
それで、EC2クラシックネットワークは先日廃止されたことが分かりました。新規でいろいろ設定しようとすれば必然的にクラシックロードバランサ―は使えなくなるということか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/e7b232ec-7afa-5b68-a337-4fc7cc82eb90.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/5ef68571-c7a2-6db5-9d93-fceffdf5edd7.png)

### 画像をアップロードして公開
AWSの中では当面は S3(Simple Storage Service)を頻繁に使うことになるように思います。
テスト画像をアップロードして公開してみました。
amazonaws.com ドメインの東京リージョン配下のURLになっています。
ということはデータのコンテナであるバケットの名称はリージョン内で一意でなければならないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/925e075e-f6ca-1a38-fbf1-0d82f4e68146.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/6897c1ce-5b7b-c520-e949-1fe53d844253.png)

### データベースを作成 
Amazon RDS で MySQL のデータベースを作成して、徐々にアプリケーション寄りになってきました。
RDSを使う限りにおいてはインフラまわりの責任はAmazon側にかかってくるので助かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/1a371f72-3cad-c178-34d3-8d544fafa637.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/c8111845-1f28-9cfe-5166-d9b7b6a7e75d.png)

### CloudTrailを使ってみる
AWSについてCloudTrailでログファイルの作成と解析について確認してみました。
分析ツール名が Amazon Athena というからには 知恵や戦略を司るということか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/03a9c6e6-da90-1fe0-7b01-095472af1abf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/36f6d453-56d6-613e-2f45-07eb6c10c942.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/48f88934-d43f-8ebb-b4eb-3121870ea751.png)

### 合格記録
実務経験はこれから積んでゆきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/eb2fd71e-7996-6345-1a49-530a429b28db.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/e8249f7e-4f5e-69b5-03f4-2e3ca540e04d.png)
rspecテストで実行コマンドを押しても回らない

# エラー画面

https://gyazo.com/ae90547dac639975630a6f11e989f294
ターミナルがそこで止まって、全く動かない状況。
https://gyazo.com/8d831227cc81304526ad6232a0fad014
パンケーキもずっとloadingしている。

# 解決手順
まずは、データベースを直すところから始める。
### ①mysqlに接続する。

```
mysql接続コマンド
mysql -u root 　　
```
https://gyazo.com/b1c48549fed672bfe0865b13510d2d39

### ②データベースを確認する。
このように、現在のデータベースが確認できる。
https://business.facebook.com/commerce/catalogs/476007677054230/home?business_id=903880390185351


### ③データベースを削除する。

```
drop database circusvell_test;
```
https://gyazo.com/34ebdbcd72fc2a2d84fe17f3c1c9bf2a
### ④データーベースを作成する。
```
 CREATE DATABASE circusvell_test;
```
https://gyazo.com/2fc56020e79e1c4a6d38732aa3999ff1
### ⑤再度データベースを確認する。
```
show databases;
```
### ⑥mysqlをexitで抜ける。
パンケーキを確認すると、まっさらなcircusvell_testがあった。
https://gyazo.com/31c5adf5c4a711128d01ce096b10ece8
### ⑦migrateする。
```
rails db:migrate RAILS_ENV=test
```
### ⑧パンケーキを確認する。
circusvell_testにテーブルとカラムが追加されている。完成。
https://gyazo.com/b518e7fe14155c137443e0e25185aea7
# NoDatabaseError
そもそも実行コマンドを押しても動かなくなる前に、NoDatabaseErrorが出てて、色々いじってた。
これエラーがデータベースがないってなってるから作ってあげるだけでなおってたのかもしれない。
https://gyazo.com/f023056a21aed7656ac0e1f933cef61c

# 参考記事
https://www.dbonline.jp/mysql/database/index5.html
https://prog-8.com/docs/mysql-database-setup
https://qiita.com/waniwaninowani/items/d39a9e4f172b11f62c51
OpenCVで生成した動画をWebブラウザで表示する

# はじめに
OpenCVをDocker環境で動かそうとしたら、ホストOSにアプリのインストールが必要だったりとGUI環境の構築が面倒だったのでブラウザで表示できるようにしました。
# ファイル
```bash
$ tree .
.
├── main.py
├── routes.py
├── sample.mp4
├── videos
│   └── output.webm
├── templates
    └── show.html
├── Dockerfile
└── docker-compose.yml
```
# コード
```python:main.py
import cv2

def run():
    videoCapture = cv2.VideoCapture('sample.mp4') # 読み込む動画
    video = cv2.VideoWriter('videos/output.webm', cv.VideoWriter_fourcc(*'VP90'), fps, size)
    while (videoCapture.isOpend()):
        success, frame = videoCapture.read()
        if not success:
            break

        # 任意の処理

        video.write(frame)

    video.release()
```
MP4でも動画の生成はできるのですが、WebM形式じゃないとブラウザで表示できなかったのでWebM形式で出力しています。

```python:routes.py
from flask import Flask, render_template, request
import main

app = Flask(__name__, static_folder='videos') # static_folderは出力した動画のdirectory

@app.route('/show', methods=['GET'])
def show():    
    main.run()
    return render_template('show.html', video_url='videos/output.webm')

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=8000, threaded=True)
```
```html:show.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>opencv_web</title>
</head>
<body>
  <video controls src="{{video_url}}" type="video/webm"></video>
</body>
</html>
```
```docker:Dockerfile
FROM python:3.10

RUN apt-get update && apt-get upgrade -y
RUN pip3 install --upgrade pip setuptools

# OpenCV
RUN apt-get install -y libgl1-mesa-glx
RUN pip3 install opencv-python

# Flask
RUN pip3 install Flask

RUN apt-get clean

CMD ["python3", "routes.py"]
```
```yaml:docker-compose.yml
version: '3'
services:
  opencv_web:
    tty: true
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./:/app
    working_dir: /app
    ports:
      - 8000:8000
```


# 使い方
```
$ docker compose up --build
```
で起動して、ブラウザで`http://localhost:8000/show`にアクセスすると表示されます。
`OpenCV: FFMPEG: tag 0x30395056/'VP90' is not supported with codec id 167 and format 'webm / WebM'`というエラーメッセージが出ますが動画は出力されるのでおそらく問題ないです。

# 感想
表示されるまでに少し時間かかるので、大きいサイズの動画の場合はローカルに環境を構築したほうがいいかもしれないです。
【ExcelVBA】VBAからSQLServerに接続したとき起こるオートメーションエラーはタイムアウトが原因かも

SQLServerへの接続を含むVBAを実行すると「オートメーションエラー」が発生するようになった。
どうやらVBAに埋め込んでいるクエリの実行時間が長すぎるのが原因っぽい。

デフォルトだと実行時間が30秒を超えるとタイムアウトになるらしいので、以下のコードで120秒に延長。

```
Set con = CreateObject("ADODB.Connection")

con.CommandTimeout = 120
```

無事オートメーションエラーが解消されました。
ちなみに「0」を設定するとタイムアウトがなくなるらしい。
Java Staticについて

# 初め
今回は、JavaのStatic変数のについて短くメモしていきたいと思います。
以下は自分のブログです。

https://anveloper.com/
# 特徴
- staticがついている変数やメソッドは全てのインスタンスが共有する。
- プログラム起動時に1回のみ、メモリに割り付けられる。
- クラス名前で直接に参照ができる。
    - Person.nameのようにインスタンス化をしなくても利用可能になる。
- 静的ファクトリメソッドパターンやシングルトンパターンの構築に使われる。
- Java8の以前にはPermang generation area領域に保存されたが、Java8以降にはMetaspaceに保存し、できるだけGCされるように最適化している。
# Static変数
```java:qiita.rb
class NakamuraFamily {
    String lastname = "中村";
}
```
```java:qiita.rb
public class Sample {
    public static void main(String[] args) {
        NakamuraFamily nakamura1 = new NakamuraFamily();
        NakamuraFamily nakamura2 = new NakamuraFamily();
    }
}
```
上記は中村さんの家族のクラスです。上記のようにクラスを作成してしまうとオブジェクトが生成されるたびに「lastname」を保存するため、メモリがオブジェクトごとに割り付けれられます。

でも、中村さんの家族のクラスはどんなオブジェクトでも「lastname」が中村でならなければなりません。このように値が変わらない場合はstaticをつけるといいでしょう。
```java:qiita.rb
class NakamuraFamily {
    static String lastname = "中村";
}
```
```java:qiita.rb
public class Sample {
    public static void main(String[] args) {
        NakamuraFamily nakamura1 = new NakamuraFamily();
        NakamuraFamily nakamura2 = new NakamuraFamily();
    }
}
```
上記のように「static」をつけることで1回だけ、メモリに割り付けられます。

# Staticメソッド
staticメソッド内ではオブジェクト変数を参照することができません。変数もstaticがついてなければなりません。

その理由は「static」がついている静的変数や静的メソッドは**プログラムが起動時にメモリに割りつけれれ、オブジェクト変数やメソッドはインスタンス化されたらメモリに割り付けられる**からです。

つまり、静的変数や静的メソッドとオブジェクト変数やメソッドがメモリに割り付けれられるタイミングが違う、**静的変数や静的メソッドが割り付けられる時点ではオブジェクト変数やメソッドがメモリに割り付けられていないです。**

静的メソッドはUtilクラスやヘルパークラスを作成時によく使われます。

# シングルトンパターン
```java:qiita.rb
class Singleton {
    // 静的変数として定義したので、プログラム起動時に1回だけ、　メモリに割り付けられる。
    private static final instance = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance;
    }
}
```
# 参照
https://anveloper.com/2022/08/28/java-static%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/

https://wikidocs.net/228#static

https://syundev.tistory.com/222?category=870166
vagrantのホスト名を指定してそこにscpでファイルアップロード

ホスト名を決める、`ubuntu-host`とする。

```
vagrant ssh-config --host ubuntu-host >> ~/.ssh/config
```

ホストからゲストへ転送

```
scp -P 2200 -F ~/.ssh/config myfile vagrant@ubuntu-host:/home/vagrant
```

参考：

https://qiita.com/ritukiii/items/628a87af6008e2a398fd
Golangで関数にメソッドを生やす

# ある日

関数の型をdefined typeで定義していたとき、ふと思いました。「Golangはdefined typeで型を定義して、その型にメソッドを定義できる。一方関数がファーストクラスオブジェクトな言語であり、関数の型もdefined typeで定義できる・・・、なら関数の型にもメソッドを定義できるのでは？」と :thinking: 

# 試してみた

```golang
package main

import "fmt"

type F func() int

func (r F) Add(i int) F {
	return func() int {
		return r() + i
	}
}

func (r F) Inc() F {
	return r.Add(1)
}

func (r F) Calc() int {
	return r()
}

func main() {
	var f F = func() int { return 1 }
	fmt.Printf("%d\n", f.Add(2).Inc().Calc())
}
```

できました :congratulations: 

# 利用してるライブラリはないだろうか？

`net/http`で実際に使われていました！

```net/http/server.go
// The HandlerFunc type is an adapter to allow the use of
// ordinary functions as HTTP handlers. If f is a function
// with the appropriate signature, HandlerFunc(f) is a
// Handler that calls f.
type HandlerFunc func(ResponseWriter, *Request)

// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
	f(w, r)
}
```

# 感想

1年近くGolangを書いていましたが、つい最近まで知りませんでした。ジェネリクスも導入された今、これがないと困る！というほどのものではないかも？しれませんが、これを覚えておけば役に立つ日がきっとくる！・・・かもしれません！ :joy: 

もしどなたかより良い例やこれぞまさに使い所！という例がありましたら教えてください。
【Docker】ARGの値を必須にする方法

## ARGの値を必須にする方法

`Dockerfile`に以下のように記述することでARGの値が渡されていない場合にエラーとすることができます。

```Dockerfile:Dockerfile

ARG SAMPLE_VARIABLE

RUN test -n "$EXAMPLE_VARIABLE"

```

`SAMPLE_VARIABLE`の中身が空の場合には以下のようなエラーが出てビルドが失敗します。

```zsh:ターミナル
% docker build .
[+] Building 1.2s (5/7)                                                                                         
 => [internal] load build definition from Dockerfile                                                       0.0s
 => => transferring dockerfile: 620B                                                                       0.0s
 => [internal] load .dockerignore                                                                          0.0s
 => => transferring context: 2B                                                                            0.0s
 => [internal] load metadata for docker.io/library/node:16.17.0                                            0.9s
 => CACHED [1/5] FROM docker.io/library/node:16.17.0@sha256:0jfvaoifeojoa5fe64808ea28b49c5772b1026f81b3b716  0.0s
 => ERROR [2/5] RUN test -n "$EXAMPLE_VARIABLE"                                                                   0.2s
------
 > [2/5] RUN test -n "$EXAMPLE_VARIABLE":
------
executor failed running [/bin/sh -c test -n "$EXAMPLE_VARIABLE"]: exit code: 1

```
Laravel messageを上書きできるカスタムRuleを作成する

LaravelのFormRequestで上書きできるカスタムRuleを作成する方法について記載。


以下のような独自に作成したRuleクラスをvalidateに使用する場合、
ContactFormRequestクラスに記載しているようなmessagesの上書きは反映されずに、
AlphaNumCheckクラスに記載の元のmessageが表示されてしまう。


・ContactFormRequestクラス
```
use Illuminate\Foundation\Http\FormRequest;

class ContactFormRequest extends FormRequest
{
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'number' => ['required', new AlphaNumCheck()],
        ];
    }

    public function attributes()
    {
        return [
            'number' => '数値',        
        ];
    }

    public function messages()
    {
        return [
            'number.*' => ':attribute 上書きしたメッセージ',
        ];
    }
}
```


・Ruleクラス
```
namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class AlphaNumCheck implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        return preg_match('/^[a-zA-Z0-9]+$/', $value);
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return '元のメッセージ';
    }
}
```


これだと、Ruleを使用するFormRequestによってメッセージを変えられないので、
作成した独自Ruleでかつ、上書き可能な方法を記載。
（上記のAlphaNumCheckクラスを流用する）


・ App\Providers\AppServiceProviderのboot()にバリデーションの処理と登録名称を記載
```
public function boot()
{
    Validator::extend('alpha_num_check','App\Rules\AlphaNumCheck@passes');
}        
```


・ContactFormRequestクラスのrules()で登録したrule名を指定
```
use Illuminate\Foundation\Http\FormRequest;

class ContactFormRequest extends FormRequest
{
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'number' => ['required','alpha_num_check'],
        ];
    }

    public function attributes()
    {
        return [
            'number' => '数値',        
        ];
    }

    public function messages()
    {
        return [
            'number.*' => ':attribute 上書きしたメッセージ',
        ];
    }
}
```


これで、バリデーションに引っかかった場合にContactFormRequestに記載のmessagesで上書きされます。


以上
Google Colaboratory 環境で Stable Diffusion - GPU RAM 節約術（考察）

# Google Colaboratory

Colab 環境の Stable Diffusion で、日々遊んでおります。

10GB 以上のGPUをリソースとして無料で利用できるの、なんなんでしょうね。
神とまではいかないにしても、国,自治体レベルのサービス超えてきてますよね。税金払ってましたっけ？

## GPU バックエンドに接続できません

ただ、がっつり遊んでいると、半日ぐらいで上のメッセージが出て、無料枠ではもう GPU 使わせないよとなります。
あなたはリソースを使いすぎてるよということだと思います。

Google はこの制限について、基準をあえて示していないみたいです。現在アクティブな利用者数、使用量など、いろいろな変数で、状況に応じて無料枠を調整しているのかなと想像できます。

で、このStableDiffusion旋風です。公式？のチュートリアルが Colab なので、当然、アクセスは増えますよねー。
先週は20時間かからずに再利用可能となったのですが、今日はそろそろ24時間過ぎたところなのですが、まだ接続できないです。。。（記事を書く原動力になっていますねw）
## GPU RAM 使用率の確認方法

右上のほうにある ▼ から「リソースを表示」とすると、起動中いつも見えている「RAM」「ディスク」とは別に「GPU RAM」の利用をグラフで確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322146/4d2c3cd8-ac81-af72-ed37-0b45d58d241c.png)

この記事は、公式チュートリアルのコードなどをベースに、このグラフを見ながら、画像生成のコストに関わりそうなパラメータを変更し、GPU RAM どうなるの？という検証と、つたない考察をしていきます。（本職は機械学習やpythonなどあまり縁がなく、バックボーンがぺらぺらなので、間違いの指摘や、こっちのほうがいいよ！といったコメント大歓迎です。）

ちなみに、先にも述べていますが、Google は「GPU バックエンドに接続できません」処置の詳細について、基準など明確にしていません。なので、そもそも GPU RAM を節約したからといって、無料枠が有利に利用できるかどうかは全くわかりません。あしからず。


# 【節約術 その１】RAM そのまま使いっぱなし問題

まずグラフを見ながら画像生成させると、すぐに気づくのですが、（メモリだからでしょうね、）一度画像を生成するとずっと使用率が上昇したままになります。

すぐに次の施行を流すなら問題ないような気もしますが、プロンプトを考えたり、パラメータ変更したり、いろいろやる間、ずっと使用中っぽくなるのは、あまりいいような気がしないです。

## 対策

以下のように、仕事の後に```torch.cuda.empty_cache()```を入れると、仕事前の状態（パイプライン初期化？の状態）まで戻ります。
```python
with autocast("cuda"):
  image = pipe(prompt)["sample"][0]
torch.cuda.empty_cache()
```


# 【節約術 その２】半精度？

パイプライン初期化？のところにある２つのパラメータ```revision="fp16"``` ```torch_dtype=torch.float16``` と、
画像生成するときの```with autocast("cuda"):``` 
この2か所の記述で、軽いほうのモデルを利用しますよということなのか？

いくつかのチュートリアル記事では、これらのパラメータ、コードを利用していないことがあり GPU RAM の利用量が違ってくる。
下のコードコメント部分(# の行)がない状態で動かしている場合は、適宜追加すると節約できます。（当然、精度が下がるの？なんの精度？）（調査します）
```python
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", 
                                               # revision="fp16",
                                               # torch_dtype=torch.float16,
                                               use_auth_token=True).to("cuda")
# with autocast("cuda"):
  image = pipe(prompt)["sample"][0]
```

# 【節約術 その３】複数画像生成

promptを配列で複数枚生成するより、ループで複数枚作ったほうが GPU RAM の節約になっている。

記載中ですが、時間切れのため、一度アップしてしまいます。
Floorpというブラウザを使ってみた

[窓の杜](https://forest.watch.impress.co.jp/docs/review/1433448.html)でFloorpというFirefox互換のブラウザが紹介されていたのでFirefox使いとして使ってみることにしました。
## Floorpとは
一応紹介記事に譲るとして今のFloorpはバージョン10.4（2022/08/29現在）です。感覚としてFirefox ESRの102を元にしているのかReleaseの104なのかもしれません。
次期バージョンは[Firefoxのソースを読み込んでサイドバーを2つだすようにするようです。](https://blog.ablaze.one/2311/2022-08-00/)そうするとFirefoxとFloorpの差が出てくるのかなと思います。ただFirefox拡張のOpen sidebarが使いやすくなるか、バグるかちょっと不安です。

## Floorpの特徴
箇条書きに羅列していきます。
- FirefoxとSyncできる
- Tree Style Tabプレイストール
    - TSTの設定が通常の「設定」内にある。
      多少設定が抜かれているような気がしないでもない
- ublockOrigin　プレインストール
    - 初回起動時にインストールされて1分後に無効にしているので拡張機能から有効化する必要がある
      元々FirefoxでublockOriginを使っていて、Syncすると勝手に有効になる
    - リストが古いので更新しましょう！
- Gesturefyプレインストール
    - マウスジェスチャー用の拡張
    - 筆者は実はトラックボーラーなのであまり使わない
- Pocketはabout:configで有効化する
    - about:configで `extensions.pocket.enabled` をtrueにするか、user.jsで`user_pref("extensions.pocket.enabled",true);`を記述しておく。（user.jsは後述）
- Firefox互換なのでFirefoxのAddonはきちんと動く
- 設定にTrreStyleTabの設定とか、垂直タブにブラウザーを最適化とか、多段タブにする（テスト仕様）とか「ユーザーエージェント」の変更ボタンとか普段のFirefoxではみない設定がある

## 使用感
今は「垂直タブにブラウザーを最適化」と「サイドボタンによるマウス操作にプラウザーを最適化」というのをチェックして上の方がかなりすっきりしています。タイトルバーすらないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524/c84de050-16b9-5873-61c7-cfd768e1ca19.png)
あとは普通にFirefoxなので必要な拡張をそのまま突っ込んであります。ブログなどによるとCSSは自分でいじれるんですが（userChrome.cssとuserContent.cssがインストールするとできていていじると変更ができるように何っています）面倒臭いのでStylusとか入れています。

## user.jsについて
Firefoxのabout:configは画面からも変更できますがこのような必ず設定を変更するというものについてはuser.jsを書いて外に保管しておくと楽です。筆者のuser.jsは
```JavaScript:user.js
`user_pref("toolkit.legacyUserProfileCustomizations.stylesheets",true);`
chromeフォルダ内のuserChrome.css,userContent.cssを利用するため（Default）
これがないと垂直タブ最適化画面とか多段タブとかできない
`user_pref("browser.tabs.loadBookmarksInTabs", true);`
ブックマークを新しいタブで開く
`user_pref("browser.search.openintab", true);`
検索バーから新しいタブを開く
`user_pref("browser.tabs.closeWindowWithLastTab", false);`
全部のタブを閉じたときにブラウザを終了させない
`user_pref("browser.cache.disk.max_entry_size",128);`
YouTube視聴時のキャッシュ設定が古いのでSSDが死ぬという記事があってキャッシュメモリーを小さくしている
`user_pref("browser.urlbar.openintab",true);`
アドレスバーのURLを新しいタブで開く
`user_pref("extensions.pocket.enabled",true)`;
Pocketを使えるようにする
```
となっています。FirefoxでTSTを使うときに1行目はいるのですがFloorpではデフォルトで使えるようになっているのでいらないはずです。（あっても問題無いようです）
このようにいろいろなものを新しいタブで開きたがるのでChromeには移行できないでいます。以前はこれができる拡張があったのですが…。センタークリックすればいいだけなんですけどそれは面倒だしホイール傷みますよね。

## 全体的な感想
Firefox使いとしてはこのような互換ブラウザが出てくるとは思ってもいなかったですし、一番使うTSTとublockOriginが元々入っているのはとても便利でみなさんにお勧めしたいところです。
ただ特に早くなっているとかそういうことはなかったです。Octane2.0でScoreは33358でしたのでFirefoxと変わらないですし、Chromium系と比べると50,000くらいのスコア差があります。ただ実用的にはあまり感じないので気にしなくてもいいかもしれません。

ぜひFloorpをつかってみていただいてFirefox系の人が増えるといいなあと思っています。
【Xcode】Missing required module 'XXXXX'を修正する

# はじめに
UITestでメインターゲットをインポートしようとした時に発生したエラーを治すのに苦戦したので備忘録として残しておきます。

# エラー
![スクリーンショット 2022-08-24 20.40.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/400df42e-19dd-f94d-e022-452cf8a4f8c0.png)
![スクリーンショット 2022-08-24 20.41.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/05ac928d-b5c2-c721-a8b0-05ae8f69550e.png)

```
Missing required module 'Purchases'
```

# 修正方法
① プロジェクトを選択
② UITestのターゲットを選択
③ 「Build Phases」を選択
④ 「Link Binary With Libraies」を開く
⑤ 「+」を選択
![スクリーンショット 2022-08-24 20.42.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/22652d20-916c-b70f-fc1a-9669c36ad6a4.png)

⑥ エラーが出ているライブラリを選択する
⑦ 「Add」を選択
![スクリーンショット 2022-08-24 20.46.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/54bbeb29-7b85-90ef-ff64-aeddaf9a46f2.png)

# 参考記事
https://stackoverflow.com/questions/58125428/missing-required-module-xyz-on-unit-tests-when-using-swift-package-manager
【Element Plus】チェックボックスのカスタマイズ

本記事では[Element Plus](https://element-plus.org/)でチェックボックスのデザインを変更する方法について解説します。
まずは適当にチェックボックスを作成してみます。

```vuejs
<script setup lang="ts">
import { ref } from 'vue'
const checked1 = ref(true)
const checked2 = ref(false)
</script>

<template>
  <div>
    <el-checkbox v-model="checked1" label="on" />
    <el-checkbox v-model="checked2" label="off" />
  </div>
</template>
```

すると画面表示はこうなります。
このチェックボックスの色や形を変更するのが今回の目標です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247330/1e8c4a5b-0353-9e41-d2b4-6bcd8c8e501d.png)


# 結論
CSSで`.el-checkbox`のカスタムプロパティを上書きすることで簡単にカスタマイズすることが可能です。
デフォルト値は以下のようになっています。
```css
.el-checkbox {
  --el-checkbox-font-size: 14px;
  --el-checkbox-font-weight: var(--el-font-weight-primary);
  --el-checkbox-text-color: var(--el-text-color-regular);
  --el-checkbox-input-height: 14px;
  --el-checkbox-input-width: 14px;
  --el-checkbox-border-radius: var(--el-border-radius-small);
  --el-checkbox-bg-color: var(--el-fill-color-blank);
  --el-checkbox-input-border: var(--el-border);
  --el-checkbox-disabled-border-color: var(--el-border-color);
  --el-checkbox-disabled-input-fill: var(--el-fill-color-light);
  --el-checkbox-disabled-icon-color: var(--el-text-color-placeholder);
  --el-checkbox-disabled-checked-input-fill: var(--el-border-color-extra-light);
  --el-checkbox-disabled-checked-input-border-color: var(--el-border-color);
  --el-checkbox-disabled-checked-icon-color: var(--el-text-color-placeholder);
  --el-checkbox-checked-text-color: var(--el-color-primary);
  --el-checkbox-checked-input-border-color: var(--el-color-primary);
  --el-checkbox-checked-bg-color: var(--el-color-primary);
  --el-checkbox-checked-icon-color: var(--el-color-white);
  --el-checkbox-input-border-color-hover: var(--el-color-primary);
}
```

# 例
ひとつ例を挙げておきます。
チェックボックスを丸くして、チェック時はオレンジに、非チェック時はグレーにする場合

```vuejs
.el-checkbox {
  --el-checkbox-input-border-color: rgb(233, 160, 0);
  --el-checkbox-border-radius: 50%;
  --el-checkbox-bg-color: gray;
  --el-checkbox-input-border: var(--el-border-width) var(--el-border-style) gray;
  --el-checkbox-checked-input-border-color: rgb(233, 160, 0);
  --el-checkbox-checked-bg-color: rgb(233, 160, 0);
  --el-checkbox-input-border-color-hover: gray;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247330/7f976850-a5aa-0886-e316-8209967204a0.png)
MacでChrome OS flex の USB インストーラを作成する際に詰まったこと

# はじめに
知人にいらないPCを渡す際にParrotOSが入っていたので一旦使いやすそうなChromeOSを導入してあげようとした時に陥ったポイントの紹介記事です。
久々にAndoroidじゃない記事。

# 詰まった点
まず基本的にはGoogleが公開しているこの公式Document通りにやれば良いです。
読めば誰でもできるように書かれています。
https://support.google.com/chromeosflex/answer/11541904?hl=ja

ただ今回はこの手順でやったのにUSBを起動ディスクとして認識してもらえず非常に時間がかかりました。
試しにUbuntuの起動USBとして作成し直したところ正常に動作したのでUSBの問題ではなさそうでした。

# 結論
USBフォーマットの問題。
以下解決方法

1. Macでディスクユーティリティを起動します。
2. 起動ディスクにしたいUSBを選択後消去を押下。
3. フォーマットをMS-DOS（FAT）に設定
4. パーティション方式をマスター・ブート・レコードに設定

再度上記の公式ドキュメントの手順に従って終了です。


# 追記
ちゃんと調べたらApple側も詳しく記載してくれていました...
https://support.apple.com/ja-jp/guide/disk-utility/dsku19ed921c/mac
https://support.apple.com/ja-jp/guide/disk-utility/dsku1c614201/21.0/mac/12.0
40代プログラミング初心者 自分のコードはクソコードだと思うことで成長できてる気がする

40代python初心者、しかも独学誰かにコードを見てもらうことはない

世の中は良いコードと悪いコードであふれているらしい

私の場合は40代今さらプログラミング　今更感がある

だから自分のコードはクソコードと思っている

<b>だから1回完成させたら

<b>自分の推しに罵られる妄想をします

<b>「クソコード描くな、もっと良くなるから書き直せ！べつに期待していないんだから」

繰り返し発生する処理→関数化しよう
if文の見直し
同じような部分を変数にまとめる
数値を変更したい可能性が出る部分→変数化
pythonの組み込み関数で便利なのないか調べる

完成したあとに書き直しながらコードの長さを短くしていく作業をしています

完全に自己満足です

<b>コードの見直しをしていて大事だなって思う修正ポイント

<b>あれこれなんだっけ？って悩んだ部分を修正する
<b>ここ書くのめんどくさい、長い、短くならないかなぁ・・・
<b>見た目美しくない

ってところ

きっと完成したコードもクソコードなのだろうけれど、それでも自分の中で最低限の改善はできているのです

あとは、汚いコードだな！こうなおせよ！って言ってくれるツンデレを見つけるだけです
devise導入

devise導入の基礎的なフローについての備忘録です。

## 導入手順

Gemのインストール

```ruby:gemfile
gem 'devise'
```


deviseの設定ファイルを作成


    % rails g devise:install

deviseコマンドでモデルを作成


    % rails g devise モデル名


deviseのビューファイル作成

    % rails g devise:views


## データベースにカラムを追加する場合

    % rails g migration Addアッパーキャメルでカラム名Toファイル名 カラム名:データ型

## deviseで追加したカラムに値を保存する処理

deviseの処理を行うコントローラーはGem内に記述されているため、編集ができない。
よって、deviseのコントローラーにストロングパラメーターを反映するために、全コントローラーの共通処理ができるapplication_controller.rbにdeviseのストロングパラメーターを定義する。

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
# if: :devise_controller？でdeviseに関する処理コントローラーの処理であればメソッドを呼び出す
  before_action :configure_permitted_parameters, if: :devise_controller?

  private

  def configure_permitted_parameters #メソッド名は慣習
    #deviseのUserモデルにパラメーターを許可
    devise_parameter_sanitizer.permit(:deviseの処理名【sign_up等】, keys: [:許可するカラム名【nickname等】])
  end
end
```