OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby on Rails テスト環境を本番環境にしてみた

# 記事の背景
Ruby on Rails本番環境で再現していたバグをテスト環境で確認する為、テスト環境を本番環境に変更してバグ修正を試みようと思ったが、テスト環境を本番環境にするのにかなり詰まった為、記事を書いてみました。

## まず、環境を変えるとはどういうことか？？
テスト環境では環境変数testで実行していたものをproductionに変える(**RAILS_ENV=test**を**RAILS_ENV=production**に変える)

## 詰まったこと
1. テスト環境で**RAILS_ENV=production**が実行出来ない。
2. コンソールが使用が出来ない。
3. テスト環境のデータベースが反映されない。
4. アセットプリコンパイルしてもcssや画像が反映されない。

# 各事象と解決方法
## ①テスト環境で**RAILS_ENV=production**が実行出来ないの解決方法
### 事象
下記コマンドを打つと、
```
$ bundle exec rails assets:precompile RAILS_ENV=production
```
下記のエラーが表示され、本番環境のコマンドが実行出来ない。
```
ArgumentError: Missing `secret_key_base` for 'production' environment, set this string with `rails credentials:edit`
```
### 原因
railsアプリケーションconfig配下に**credentials.yml.enc**ファイルがある事が原因。credentials.yml.enc が本番環境のキーとあってない為のエラーが発生。
```
$ ls
application.rb  cable.yml            database.yml    environments  leaflet.rb  puma.rb    spring.rb
boot.rb         credentials.yml.enc  environment.rb  initializers  locales     routes.rb  storage.yml
```
### 解決方法
下記コマンドで**credentials.yml.enc**を消し、
```
アプリ名（config)$ rm credentials.yml.enc
```
下記コマンドでキーを再生成する。※viｍコマンドが開きますが、何も編集せず抜けてOK。
```
$ EDITOR=vim rails credentials:edit
```
## ②コンソールが使用が出来ないの解決方法
### 事象
下記コマンドを打つと、
```
$ rails c
```
下記エラーが表示されて、コンソールが起動しない。
```
/home/ec2-user/.rvm/gems/ruby-2.6.3/gems/bootsnap-
1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:
in `require': Could not load the 'listen' gem. Add `gem 'listen'` 
to the development group of your Gemfile (LoadError)
```
### 原因
gemの**listen**が開発環境にしかないということらしい…。
### 解決方法
下記コマンド、
```
$ rails c production
```
もしくは下記コマンドのように環境を定義した上で起動すればOK
```
$ export RAILS_ENV=production
$ rails c
```
## ③テスト環境のデータベースが反映されないの解決方法
### 事象
エラーが出てデータベースに接続出来ない。
### 原因
本来は実行環境がテスト環境なので、テスト環境に紐づくDBしか参照にもかかわらず、環境変数を本番環境に指定して実行しているので、本番環境のDBを参照しようとしているが、テスト環境からは接続が出来ないのでエラーが発生している。
### 解決方法
DBは本番環境を参照出来ないので、テスト環境を参照するよう変更する。
アプリケーションファイル**config/database.yml**の本番環境設定を下記のように変更する。
```
production:
  <<: *default
  database: テスト環境のDB名
  username: テスト環境のユーザー名
  password: テスト環境パスワード
  host: テスト環境のホスト名
```
## ④アセットプリコンパイルしてもcssや画像が反映されないの解決方法
### 事象
下記コマンドでアセットプリコンパイルしてもcssや画像が反映されず、画面上HTMLだけの寂しい画面になってしまう…。
```
bundle exec rails assets:precompile RAILS_ENV=production
```
### 原因
アプリケーションファイル**config/environments/production.rb**で静的コンテンツの公開がfalseになっている為。
```
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
```
### 解決方法
falseの場合、public配下のファイルが公開されないので、trueにするとうまく行く。
下記コマンドを実行するとtrueになる。
```
$ export RAILS_SERVE_STATIC_FILES=true
```
そしてサーバーを再起動する。
# まとめ
ネット記事を読み漁り、何とかテスト環境で本番環境を再現する事が出来ました。この方法まずいんじゃないか、もっとこうした方がいいんじゃないかという意見がある方は、コメント頂けたら嬉しいです。

## 参考記事
https://mattun-programming.hatenablog.com/entry/2020/01/16/123811
https://www.task-notes.com/entry/20160920/1474343389
https://qiita.com/yuiko_akiyoshi/items/263fc49414fb3c7a0162
https://qiita.com/aiandrox/items/408724ab8a4482fb5873
cscの作法 その197

# 概要
cscの作法、調べてみた。
qiitaapi、叩いてみた。

# コンパイル手順

```
>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%


>csc lit1.cs /reference:LitJSON.dll

```

# サンプルコード

```
using System.Collections;
using System.IO;
using System;
using System.Text;
using LitJson;
using System.Net;

namespace app
{
	class test0 {
		static void Main() {
			ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
			WebClient wc = new WebClient();
			string jsonText = "";
			using (Stream st = wc.OpenRead("https://qiita.com/api/v2/users/ohisama@github/items?page=1&per_page=5"))
			{
				using (StreamReader sr = new StreamReader(st))
				{
					jsonText = sr.ReadToEnd();
					LitJson.JsonData json = LitJson.JsonMapper.ToObject(jsonText);
					Console.WriteLine(json[0]["title"]);
					Console.WriteLine(json[1]["title"]);
					Console.WriteLine(json[2]["title"]);
					Console.WriteLine(json[3]["title"]);
					Console.WriteLine(json[4]["title"]);
				}
			}
		}
	}
}





```


以上。
Atomエディタの開発中止とMicrosoftのハロウィーン文章 [開かれた社会とその敵 Part 1.]

# はじめに

Atomと言えば、原子ではなく、Githubの開発したテキストエディタですが、とうとう
その開発の中止が決定されたらしいですね。
えっ俺Atom使ってないしいいやって？私だって生粋のvim使いで、Atomなんて触った事もなければ、インストールをした事さえありません。
ぶっちゃけ言えば「これ以上分割できない物」の代名詞であるatomをエディタの名前として使うのは、物理学徒としても許し難いです。
なのでatomが開発中止？ざまぁと思う人も多いかもしれませんが、話はそう簡単なもんではございません。
少し付き合ってください。

# MicrosoftとGithub

MicrosoftによるGithub買収は多くの人の記憶に新しいのではないのでしょうか。
当時沢山のOSS(オープンソースソフトウェア)が[Gitlab](https://gitlab.com/)に鞍替えしましたね。
また、gitlabのCSSが[edgeで正しく表示されない](https://twitter.com/alexandrughinea/status/1003634919682211846)
などのおわらいも発生しました。
ログアウトしてから再ログインするのに、toppageから直接ログインできず、ググってもできず、いろいろ探してやっと、signin→already have an accuont?からログインみたいな感じにやらないと再ログインできない事をしって、怒りのサポートメールを出したのを覚えています。ログインボタンをなくすとか気でも狂ってんのかと思いましたよ本当に。
後々twitterで検索してみると、同じように怒りのメールを書いた人が沢山いたようです。

とまぁ移行時に色々なグダグダがありました。ただググっても当時の情報が全くでてこないんですよね。あった事は思いだせるのに証拠が提出できない。
どなたか魚拓かwebarchiveとってたら教えてください。

まぁとにかく、マイクロソフトとかいう会社はOSSとはまるで無縁のパラダイムでソフトウェア開発を行なっていました。
利益のために独自規格をバリバリに盛り込んだ仕様、最初は無料で配布、業界のスタンダードにした後は有料で法外な料金をとり、
頻繁な意味のないアプデとその度に増える後方互換性のない規格。
そんな邪悪な事をやりつづけた会社が創業40年後にいきなりOSSの開発の総本山を買収なんてキナくさいと思う団体が多くいたのは当然ではないでしょうか。
特に、後述の[ハロウィン文書](https://cruel.org/freeware/halloween.html)を代表としたMicrosoftの悪行知る者達としては、どうしても裏があるようにしか思えなかったのでしょう。

続きはこちらで

https://jp.magicode.io/RandomScientist/articles/d0e81fb1eff7496dbc90b36cf040799e
Blenderで作成したオリジナルモデルをUE5で動かしてみる


# はじめに
最近、UnrealEngineの勉強を始めた初心者です。よろしくお願いいたします。(scince 2022.5)
UnrealEngine5がリリースされたとのことなので、Blender(2.8以降)で作成したオリジナルモデルを取り込んで、動かすことができるか試してみました。
とても簡単で、もっと正式な方法があるかもしれませんが、とりあえず上手くできて感動しているので、記録として掲載させていただきます。

【実行画面のサンプル動画「おにごっこ」(gif)】
![gifGame.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608747/0b4b7d30-e806-5ad5-8f61-e61c0f5b6117.gif)

なお、サンプル動画のベースは、「作れる！学べる！Unreal Engine 4 ゲーム開発入門 第2版」で学習して作成したゲームです。UE4のものですが、とてもわかりやすい学習本だと思います。

# 開発環境
PC OS:Windows 10
UnrealEngine Version: 5.0.2
グラフィックボード：NVIDIA geforce RTX 2060
# BlenderからFBXでエクスポート
１　blenderで作成したモデル、ボーン、アニメーションのデータを選択して、【ファイル】→【エクスポート】→【FBX】をクリックします。
![BlenderOutput1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608747/916f6bf1-0ce8-471a-8182-8912cd202ee5.png)
２　【内容】欄で、limit to の【選択したオブジェクト】をチェックして、該当のモデル等だけを出力するようにします。また、トランスフォームの前方・上がUEにあった方向か確認します。アニメーションを出力するときは、【アニメーションをベイク】にチェックします。
![BlenderOutput2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608747/005542a6-d717-465d-8389-8e390356769c.png)

これでデータが作成できるはずです。

# UE5にFBXを取り込む
エクスプローラから、作成したデータをドラッグ（インポートで操作することも可）すると、自動的に【FBXインポートオプション】が開きます。
![Createaset1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608747/b70b8a7f-b5c7-76b6-ec0f-617fc8ccddc3.png)
設定は、臨機応変に設定する必要があります。特に使う設定を列挙します。（説明は、自己流です。正式には公式をご確認ください。）
・Skeleton 欄は、既存のスケルトンを適応するときに選択します。
・Skeletal Mesh は、スケルトンデータを作成するときチェックします。
・Import Mesh　は、メッシュデータを作成するときチェックします。
・Import animation　は、アニメーションデータを取り込み作成するときにチェックします。
・その他　Convert SceneおよびConvert Scene Unit　は、作成しているシーンに合わせて取り込むチェックボックスのようなので、通常チェックを入れます。

(アニメーションの例)
![ANME-demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608747/a24378aa-d89a-0ce0-2aad-070d0d0bd99c.png)
作成したメッシュやスケルトン、アニメーションデータ等をダブルクリックすると、内容が確認できます。

# あとがき
* ボディーと服等複数を分けてモデルを作成し、ブループリントのキャラクタークラスでメッシュを追加して表示することが可能でした。アニメーション設定も並行してできるので、表現が広がります。
* 「作れる！学べる！Unreal Engine 4 ゲーム開発入門 第2版」はUE4の学習本です。UE5で作るとき、配置が違っていますので文字を探して設定しましたが、大きく変更されている点やいまだにできない内容もあります。
* UE5と4の気になった違いとトラブル
① プラグインのApexDestructionで爆発処理がでてこない（Chaosに移行？）
②　UIのアンカー設定はどこにあるのかな？（代用でレンダートランスフォームのScaleで設定）
③　UIに２つ以上インプットが置けないのかな？（いくつか作ってブループリントで連結して表示。デバイスセーフゾーンセットを設定する必要があるのかな？）
④　UE4で目立っていたアクタの配置がプルダウンになったことに気づくまで探し続けてしまいました・・・。
<del> ⑤　いまだにパッケージ化して実行ファイルを作ることがSDKエラーでできません・・・。</del>ランタイムインストールで解決(2022.6.20追伸)
初心者で申し訳ないのですが、何かの参考になればと思い掲載しましたのでご容赦ください。トラブル解決のため学習中ですので、ご指南して頂けると幸いです。よろしくお願いいたします。

＜＜服を変えた実行結果「おにごっこ」＞＞
![Made2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608747/f9b4580c-1f96-0d5f-d8ba-bd6e43814a0d.gif)

参考書籍
「作れる！学べる！Unreal Engine 4 ゲーム開発入門 第2版」
荒川 巧也 (著) 翔泳社

# 追伸
⑤のパッケージ化について、ログを確認し、リンク先のSDKをインストールすることでできるようになりました。
.NET Core 3.1 ランタイムが必要のようで、
https://dotnet.microsoft.com/ja-jp/download/dotnet/3.1/runtime?cid=getdotnetcore
からインストールできました。(バンドルしてないんかい＃)
（Windows64bitの場合）
![rantime_download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608747/01427733-0b7c-db4b-c2da-8a9b578a1539.png)
個々の環境で違うかもしれないので、エラーログからリンク先をご確認いただくとよいと思います。
【TypeScript】高度な型

## 型の互換性
```ts
// 型互換性あり
let fooCompatible: any
let barCompatible: string = "TypeScript"

console.log(typeof fooCompatible)
// > undefined
fooCompatible = barCompatible
console.log(typeof fooCompatible)
// > string
// any型にstring型のデータを代入することでstring型になる

let fooString: string
let barString: string = "string"

fooString = barString

let string: string
let stringLiteral: "fooStringLiteral" = "fooStringLiteral"
string = stringLiteral

let fooNumber: number
let fooNumberLiteral: 1000 = 1000

fooNumber = fooNumberLiteral

// 型互換性なし
let fooIncompatible: string
let barIncompatible: number

// fooIncompatible = barIncompatible
// error TS2454: Variable 'barIncompatible' is used before being assigned.

// interfaceとclassのconstructorでも型互換性が評価される
interface Animal {
  age: number
  name: string
}
class Person {
  constructor(public age: number, public name: string) {}
}

let me: Animal
me = new Person(24, "a")
```

## ジェネリクス
```ts
// const echo = (arg: number): number => {
//   return arg
// }
// const echo = (arg: string): string => {
//   return arg
// }

// 上記を以下のように記述することができる
const echo = <T>(arg: T): T => {
  return arg
}
console.log(echo<number>(100))
// > 100
console.log(echo<string>("hello"))
// > hello
console.log(echo<boolean>(false))
// > false

class Mirror<T> {
  constructor(public value: T) {}
  echo(): T {
    return this.value
  }
}

console.log(new Mirror<number>(123).echo())
// > 123
console.log(new Mirror<string>("hello, generics!").echo())
// > hello, generics!
console.log(new Mirror<boolean>(true).echo())
// > true
```

## 型アサーション
```ts
let name: any = "Tanaka"

let length = (name as string).length

// length = "foo"
// > error TS2322: Type 'string' is not assignable to type 'number'.

let name2: any = "Tanaka"
```

## constアサーション
```ts
let name = "Tanaka"

name = "Tatsuya"

let nickname = "Tatsuya" as const
nickname = "Tatsuya"
// nickname = "Tatsu"
// > error TS2322: Type '"Tatsu"' is not assignable to type '"Tatsuya"'.

let profile = {
  name: "Tanaka",
  height: 201
} as const

// let profile: {
//   readonly name: "Tanaka";
//   readonly height: 201;
// }

// profile.name = "Tanaka"
// error TS2540: Cannot assign to 'name' because it is a read-only property.
// profile.height = 400
// error TS2540: Cannot assign to 'height' because it is a read-only property.

// as const を記述することで別の値を代入することを制限することができる
```

## Nullable
```ts
let profile: { name: string, age: number | null } = {
  name: "hana",
  age: null
}
```

## インデックスシグネチャ
```ts
interface Profile {
  name: string
  underTwenty: boolean,
  [index: string]: string | number | boolean
}

// 上記に具体的に記述されているプロパティは初期化する必要がある
let profile: Profile = { 
  name: "Tanaka",
  underTwenty: false 
}

profile.name = "Tanaka"
profile.age = 41
profile.nationality = "Japan"
```
データの変換と検証（WebDataBinder）

WebDataBinder : データのタイプを変換し、検証もしてくれる。

1．データの変換
（1）PropertyEditor : 双方向タイプ変換 (タイプ↔String)。特定のタイプまたは名前のフィールドに
　　　　　　　　　　適用可能。プログラム内で提供するDefault PEと、
　　　　　　　　　　ユーザーが直接登録可能なCustom PEがある。
　　　　　　　　　　種類（https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/propertyeditors/package-summary.html）
（2）Converter : 単方向タイプ変換(タイプA→タイプB)。PEの欠点を改善することによって
　　　　　　　　安全性が良くなった（stateful→stateless）。
（3）ConversionService  複数のConverterを登録しておいたもの。タイプ変換サービスを提供。
（4）Formatter : 双方向タイプ変換 (タイプ↔String)。
　　　　　　　　@NumberFormat、@DateTimeFormatなどのアノテーション。
    
　処理優先順位はCustom PE、ConversionService、Default PEの順。


2．データ検証
（1）Validator : オブジェクトを検証するためのInterface。
  　　　Global Validator：1つのValidatorで複数のオブジェクトを検証するとき登録して使用する。
（2）MessageSource：ファイル、配列などのさまざまなリソースからメッセージを読み取るための
　　　　　　　　　　Interface。
laravelのjqueryでautocompleteを利用するとエラーになる

## 動作環境
Laravel 6.20
php 8.0
ローカルPC開発
chrome

## やりたいこと
- laravelでテキストボックスで検索するときに、サジェストしてくれる機能を追加したい。
- そこで、jqueryのautocompleteを利用して実装しようとしたがエラーが出ました。
  - laravelを利用しないで、webのサンプルをhtmlでコピペしてchromeで表示すると検索のサジェストの機能は問題なく表示されたので、laravelに起因するエラーだと考えられる状態。 

## エラーの内容
- chromeの開発者コンソールで以下のようなエラーが発生しました。

```sh
jQuery.Deferred exception: $(...).autocomplete is not a function TypeError: $(...).autocomplete is not a function

Uncaught TypeError: $(...).autocomplete is not a function
```


## エラー内容をwebで検索して調べると・・・
- jqueryのCDNを書き忘れているのがエラーの原因だと書かれている記事がほとんどでした。
  - https://stackoverflow.com/questions/19591155/autocomplete-is-not-a-function-error

- autocompleteはjQuery UIなのでjQuery.UIライブラリを利用すれば解決するとのことです。
  - https://teratail.com/questions/179399
  - ですが自分の場合、解決しませんでした。

``` html
  <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" />
  <script src="https://code.jquery.com/jquery-3.6.0.js"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
```

## 本当のエラーの原因
- laravelのjs/app.jsのファイルがエラーの原因でした。
  - https://nebikatsu.com/7232.html/
  - js/app.jsを読み込むのを止めて解決しました。
  - 「app.jsを読み込むページによっては、
手書きで書くJavascriptとバッティングして、Javascriptが動かなくなる」とのことです。
コルーチンとチャネル入門#7 進捗の表示

ソース記事は[こちら](https://play.kotlinlang.org/hands-on/Introduction%20to%20Coroutines%20and%20Channels/07_Progress)
いくつかのリポジトリの情報はかなり早くロードされるにもかかわらず、ユーザーはすべてのデータが一旦ロードされると結果リストを見るだけである。それまでは、ロード中アイコンが進捗を表示するが、どのコントリビューターがすでにロードされているのかという、現在の状態についての情報がない。
中間の結果を早めに見せ、それぞれのリポジトリのデータをロードした後で、すべてのコントリビューターを表示することができるかもしれない。
![img](https://play.kotlinlang.org/resources/hands-on/Introduction%20to%20Coroutines%20and%20Channels/assets/7-progress/Loading.gif)
この機能を実装するには、中間の状態について呼び出されるコールバックとして、UIを更新するロジックを渡す必要がある。
```Kotlin
suspend fun loadContributorsProgress(
    service: GitHubService,
    req: RequestData,
    suspend updateResults: (List<User>, completed: Boolean) -> Unit
) {
    // データのロード
    // 中間の状態について`updateResults`の呼び出し 
}
```
呼び出し側では、`Main`スレッドから結果を更新するコールバックを渡す。
```Kotlin
launch(Dispatchers.Default) {
    loadContributorsProgress(service, req) { users, completed ->
        withContext(Dispatchers.Main) {
            updateResults(users, startTime, completed)
        }
    }
}
```
`updateResults`パラメータは`loadContributorsProgress`内で`suspend`として宣言されている。対応するラムダ引数の内部で`suspend`関数である、`withContext`を呼ぶために、それが必要である。
`updateResult`コールバックは、すべてのローディングが完了し、結果が最終かどうかを意味する引数として、追加の`Boolean`パラメータを取る。
## 課題
中間結果を表示する`loadContributorsProgress`関数を実装すること(`Request6Progress.kt`ファイル内で)。それは(`Request4Suspend.kt`からの)`loadContributorsSuspend`関数をもとにすること。並列性の無い、簡単なバージョンを使う。というのは次のセクションでこの解法に並列性を追加する方法を議論するからである。
留意すべきは、コントリビューターの中間結果リストは「集約された」状態で表示すべきであり、単にそれぞれのリポジトリにロードされたユーザーの一覧ではない。それぞれのユーザーごとの貢献合計数は、それぞれの新しいリポジトリがロードされるときに増加するはずである。
## 解法
ロードされたコントリビューターの中間結果の一覧は「集約された」状態で格納される必要がある。ユーザーの一覧を保存する`allUsers`変数を定義することができ、その後、それぞれの新しいリポジトリのコントリビューターがロードされた後で、それを更新する。
```Kotlin
suspend fun loadContributorsProgress(
    service: GitHubService,
    req: RequestData,
    updateResults: suspend (List<User>, completed: Boolean) -> Unit
) {
    val repos = service
        .getOrgRepos(req.org)
        .also { logRepos(req, it) }
        .bodyList()

    var allUsers = emptyList<User>()
    for ((index, repo) in repos.withIndex()) {
        val users = service.getRepoContributors(req.org, repo.name)
            .also { logUsers(repo, it) }
            .bodyList()

        allUsers = (allUsers + users).aggregate()
        updateResults(allUsers, index == repos.lastIndex)
    }
}
```
`updateResults`コールバックは、それぞれの要求が完了した後で、呼び出される。
![img](https://play.kotlinlang.org/resources/hands-on/Introduction%20to%20Coroutines%20and%20Channels/assets/7-progress/Progress.png)
今のところ、並列性は使われていない。このコードはシーケンシャルであり、同期化は必要ない。
要求を並列に送り、それぞれのリポジトリの応答を得た後で、中間結果を更新したいと思う。
![img2](https://play.kotlinlang.org/resources/hands-on/Introduction%20to%20Coroutines%20and%20Channels/assets/7-progress/ProgressAndConcurrency.png)
この解法にどのように並列性を追加するのか？チャネルがそれを解決する。

https://qiita.com/CuriosityKilledTheCat/items/f55b8736778e7b48f89d
DispatcherServletの役割

DispatcherServlet

Webの処理ロジックの中、リクエスト、処理、レスポンスを1つのGroupにして処理するのをServeletという。複数のServeletで共通に処理できる部分だけを１つにして先に処理するようにしたのがDispatcherServlet。重複作業を1つにすることで処理に効率が高くなる。
関心の分離の1つの例である。関心の分離については以前投稿したので、Linkを貼っておきます。


https://qiita.com/KyungJoon960/items/6acdbf857789b22511d3
会社の受付を進化しましょう！Vioceflowで受付システムを作ってみた

## ｢誰に電話すればいいの？｣

こんにちは。

新卒面接時のことを思い出して恥ずかしすぎる、コードとか見たらすぐ頭が痛くなるのにDXに関わっている部門で働くスーパーマーケット社員でーす。

うちの会社が古い。どこまで古いだと、受付がまず古い。

数年前新卒面接の話です。無事に（?）一次面接を通過でき、二次面接に進出しました。
結果電話を受けた時、｢受付の電話で#”$%&さんにかければ、向かいにいきます｣と言われましたが、この｢**#”$%&**｣、名前の部分を全然聞き取りませんでしたまま、二次面接の日、受付の前に立ちました。
受付のところに今でも置かれている名前と呼出番号を載せる全社座席表を見ても、｢名前がわからない、誰に電話すればいいの？｣と困りました。

面接、配達、郵便、商談などなど、｢ゲスト｣に迷惑をかけず、Vioceflowで進化した受付システムのプロトタイプを作ってみた。

## Voiceflowとは？

**Voiceflow**とはノンコーディングで、Amazon AlexaとGoogle Assistant用の音声アプリを作成できるサービスです。 
Voiceflowは直接的なインターフェースなので、会話的なプログラムを作成する際にもってこいです。

:::note 
以下、Amazon Alexaを｢Alexa｣と略します
:::

## 完成品

https://twitter.com/Ex2kSU5kdtINw9K/status/1537826205671759872

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669194/7cc1ec5e-3a5a-1351-e59e-acd179b94b45.png)
フロー全体

## 作成過程

### 使用シナリオ想定

受付の電話の代わりに、AlexaやGoogle Assistantを使用して、ゲストが｢`受付(uketsuke)`｣と話せば、フローを起動し、最終、担当部門のTeamsチャネルに通知して、担当者を呼び出すものと想定します。

::: note warn
実際に動けるかどうか、Alexaなどがないので、確認できません。
あくまでも、プロトタイプです、ご了承下さい。
:::

では、なかみを見てみましょう。

### 最初の挨拶
起動した後の一言をSpeakブロックに入れます。受付用ので、｢いらっしゃいませ｣は欠かせません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669194/14a5b99e-55a7-5042-8112-16b472abe6ef.png)


### 呼び出し希望の部門を判断
理由がわかりませんが、選択肢に英語しか入りませんので、`hr`(人事部)、`ga`(総務部)、`bu`(開発建設部)、`pd`(商品部)を設置しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669194/c4196b9e-4e4b-5db3-12a9-ced71c2572a8.png)

最初の質問に対する答えが部署名ではないと想定しますので、用件をサンプルフレーズとして設置しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669194/e412146c-0ad2-7d00-6ca6-942a17b44c85.png)

仮に、認識できない時、もう一度聞くのを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669194/01f7d1bb-9cf9-ba9a-8b96-b50d3677e211.png)
対応できない部署の最終はどうすればいいでしょう･･･

### 呼び出し部門に連絡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669194/a92700b5-d911-16ab-0a06-492ca4b94044.png)

商品部の下、各部署までもう一度設置しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669194/1af14f7c-4829-6a0e-476a-f832d36ff475.png)
Teamsに連携のやり方がわかりませんので、今回は仮にExitブロックを設置しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669194/08dddf3f-53a9-f770-031c-0ece64a226e1.png)


## チャレンジ
Teamsへの通知予定ですが、[Microsoft Graph](https://docs.microsoft.com/ja-jp/graph/overview?view=graph-rest-1.0)を見るとちょっと複雑すぎるので、今回は実装できません。代わりに、Slackを使用して試しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669194/9647fd67-21cd-68f0-6c1a-afb14a2aa706.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669194/e40850c0-5190-c11f-3bf5-f4bc14299786.png)
何と、成功しました。

詳細設定はこちらの記事を参考してください👇🏻。

https://note.com/yucky_sun/n/n05e3e4724cb7#d4oef

また今回の記事も、この記事を大変参考になりました🙇🏻‍♂️🙇🏻‍♂️🙇🏻‍♂️
## 反省と考察

今回の作品がとても簡単です(個人的に)。API連携以外完全ノンコードで作りましたが、発音がすごく硬いとかんじました(笑)。Speakブロック内`Add Effects`で色々アッセントを調節できますので、面白い発音が出てきました。
(アニメのギルガメッシュの｢雑種｣もできるwww会社用ものなのでやめたwww)

最初の一歩、｢ゲストとして考えたら、どうやってAlexaを起動するの？｣と疑問です。
掲示一枚で｢Alexaを呼んでください｣、とは？

また、記事の中も書いた通り、担当部署が当たらない時どうすればいいでしょう･･･
viteでサブディレクトリ用にbuildする

まずenvファイルにサブディレクトリ名を書いておく

```.env
VITE_APP_BASE_URL = "subdirectory-name"

```


routerにenvファイル読み込む

```
const router = createRouter({
  history: createMemoryHistory(import.meta.env.VITE_APP_BASE_URL),
  routes: [
    //...
  ],
})

```


オプションをつけて　vite buildする

```
vite build --base=/subdirectory-name/

```


本番サーバーのサブディレクトリにアップして、htaccessもアップする

```
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /subdirectoryName
RewriteRule ^subdirectoryName/index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /subdirectoryName/index.html [L]
</IfModule>

```


これでできる、はず


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
参考


https://router.vuejs.org/guide/essentials/history-mode.html#memory-mode


https://ja.vitejs.dev/guide/env-and-mode.html


https://ja.vitejs.dev/guide/build.html#public-base-path


https://stackoverflow.com/questions/52119135/vue-router-on-apache-spa-in-sub-directory-can-only-access-pages-by-redirect
elitedeskのnvme を　＊そのまま＊　latitude 7280 にくっつけた後の後始末でsupergrubを使う

https://pcguide-ad.net/review/latitude-7280-1/

```
より

ファンクションキーのファンクション機能の切り替えは、［Fn］＋［ESC］キーを押すことで、
ディスプレイの明るさ調整や
ボリュームコントロールなどのマルチメディア系の制御と、

カタカナや英字に変換する標準的なファンクションキーの機能に
かんたんに切り替えられます。
```

https://pcguide-ad.net/review/latitude-7280-2/

https://nattokude.gozaru.jp/latitude7280/review.html


![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/4614b2c8-e151-875b-2464-2db8daf8b239.png)

https://www.dell.com/support/manuals/ja-jp/latitude-12-7280-laptop/latitude_7280_ownersmanual/%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%81%AE%E4%BB%95%E6%A7%98?guid=guid-2835c8a5-e7d0-4930-8d31-485eb77dd5ce&lang=ja-jp

より

```
ストレージの仕様
このノートパソコンは1台のM.2 SATA SSDまたはM.2 PCIe NVMe SSDをサポートしています。
オプションは次のとおりです。

    最大512 GBのSATA SSD
    最大1 TBのPCIe NVMe SSD
    最大512 GBのNVMe SED SSD
```

という　**不思議な両用ポート** みたいです


https://www.youtube.com/watch?v=h8X3xkV30xY&t=298s

をみて　nvme置き換えしてるのをみて　、　やってみよう気になりました




今まで大きなデスクトップの中に入れていた nvme を
このノートパソコンのngffを
外してくっつけました

すると Windows 11がそのまま立ち上がってきました

ただし デュアルブートしていたLinux の方は
大きなデスクトップでは　このnvmeを　cloverで使っていたせいかだめでした

それで
USB に入れていたsupergrub

https://distrowatch.com/table.php?distribution=supergrub

を使って　マンジャロ Linux が立ち上げます

それから
grub-install /dev/nvme0n1

念のために
grub-mkconfig > kg
cp kg /boot/grub/grub.conf
をしました

これにて
![IMG_20220618_015454_7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/2d144933-0cd5-664e-3b34-fb400cff7ca0.jpeg)

となりほっとです


なお
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/30ac50af-6775-bb72-1892-45fe613af92b.jpeg)
にて　LITEONのハードディスクにいれていた　OpenBSD が　**Cポート** から立ち上がります



ーーーーーーー

https://www.youtube.com/watch?v=1qUrdcRkRLc&feature=youtu.be

今は　ビッグバン前に　興味津々

https://www.youtube.com/watch?v=vWgj0mVA-yg&feature=youtu.be

ところで

https://www.youtube.com/watch?v=weR18UTitxc

なので　我々は地球の物以外の　要素がはいってます、　つまり　**宇宙人**　です
Springでの例外処理

5つの方法

1. コントローラメソッド内でのtry-catch処理。
try-catchはすべてのコードにつけなければいけないので不便である。

2. コントローラ内での@ExceptionHandlerで処理。
特定コントローラで発生する例外を処理するのが特徴であるが、複数のコントローラで生じる例外なら処理コードが重複する可能性が高い。

3. 例外処理するメソッドを別のクラスにして@ControllerAdvice作成。
複数のコントローラの例外も処理できる

4. 例外の種類によるビューの指定 (SimpleMappingExceptionResolver)。
複数のコントローラに散在している例外処理の設定を中央に集中させる（centralize）。

5. 応答状態コード別にビューを指定する error-page タグを使用する。
Oracle SQL Developer 起動時フリーズの対処

# 事象
昨日まで使えていた SQL Developer が、今朝になって起動処理の途中でフリーズする。
プログレスバーの表示は10%あたり。
![スクリーンショット 2022-06-18 0.45.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640011/b7dd6ca2-9d87-572e-2ef8-23f19a6d1440.png)

# 環境
- macOS 12.4 Monterey
- SQLDeveloper 21.2.1.204 (ビルド204.1703)
- Oracle Instanct Client 19.8
- Java 1.8.0_311

# 推定要因
キャッシュファイル all-resources.dat の肥大によってフリーズが引き起こされた模様。
この時は 1.9GB まで大きくなっていた。
```肥大したキャッシュファイル.
ls -l ~/.sqldeveloper/system21.2.1.204.1703/system_cache/var/cache
(中略)
-rw-r--r--  1 xxxxxx  staff  1915907111  1  7 17:04 all-resources.dat
(後略)
```

# 対応
キャッシュファイル all-resources.dat を削除して再起動。

# 対応経過 (ご参考)
- (うろ覚え) macOS 12.4 Monterey に更新した翌日に発生。
  これが影響しているかどうかは不明。
- ~/.sqldeveloper をまるごと削除 → 起動成功。
  ただし個別の設定は当然なくなっている。
- ~/.sqldeveloper を前日のタイムマシンからリストア → 復旧成功。すべて元通り。
- 数日して再発。
- 正常時とフリーズ時の ~/.sqldeveloper の差異を探る。 
- all-resources.dat の肥大を発見。
- キャッシュなので遠慮せず all-resources.dat を消してみる。 
- 犯人はお前だ。 真犯人ではないかもしれないがお前がいると起動しない。
【yocto】特定のタスクでbitbakeを停止する方法

# はじめに
- do_patch等でbitbakeを停止したい人向け
- 特定のタスクでbitbakeを止め、tmpディレクトリ以下(主にはtmp/work)を解析することで、どのタスクで問題が発生しているか等を解析できたりする。

# 方法
- cオプションを指定して、停止したいタスク(do_xxx)を指定する
~~~
bitbake -c do_xxx recipe-name
~~~

# 例
- ビルド準備
~~~
takeshi@X250:~/yocto/poky$ source oe-init-build-env 
(略)
~~~
- ビルド
~~~
takeshi@X250:~/yocto/poky/build$ bitbake -c do_patch core-image-minimal
(略)
~~~
- do_patchまででビルドが終わっているかを確認(★参照)
~~~
takeshi@X250:~/yocto/poky/build$ cat tmp/log/cooker/qemux86-64/console-latest.log
WARNING: Host distribution "zorin-15" has not been validated with this version of the build system; you may possibly experience unexpected failures. It is recommended that you use a tested distribution.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION           = "1.44.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "zorin-15"
TARGET_SYS           = "x86_64-poky-linux"
MACHINE              = "qemux86-64"
DISTRO               = "poky"
DISTRO_VERSION       = "3.0"
TUNE_FEATURES        = "m64 core2"
TARGET_FPU           = ""
meta                 
meta-poky            
meta-yocto-bsp       = "my-yocto-3.0:94f6b31befda5c496f65e863a6f8152b42d7ebf0"

NOTE: Executing Tasks
NOTE: Running setscene task 1 of 1 (/home/takeshi/yocto/poky/meta/recipes-devtools/quilt/quilt-native_0.66.bb:do_populate_sysroot_setscene)
NOTE: Running noexec task 1 of 11 (/home/takeshi/yocto/poky/meta/recipes-core/images/core-image-minimal.bb:do_fetch)
NOTE: Running noexec task 2 of 11 (/home/takeshi/yocto/poky/meta/recipes-core/images/core-image-minimal.bb:do_unpack)
NOTE: recipe quilt-native-0.66-r0: task do_populate_sysroot_setscene: Started
NOTE: recipe quilt-native-0.66-r0: task do_populate_sysroot_setscene: Succeeded
NOTE: Setscene tasks completed
★　NOTE: Running noexec task 11 of 11 (/home/takeshi/yocto/poky/meta/recipes-core/images/core-image-minimal.bb:do_patch)
NOTE: Tasks Summary: Attempted 11 tasks of which 8 didn't need to be rerun and all succeeded.
NOTE: Writing buildhistory
NOTE: Writing buildhistory took: 1 seconds
~~~
【PHP基礎⑧】if構文-3

［問題］　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksBasic.html)
整数値を入力させ、値が正であればpositiveと表示するプログラムを作成しなさい。ただし0は正に含まないものとする。


# コード
```php
$a = intval(fgets(STDIN));
if($a > 0){
    echo 'positive';
}
```

↓　「2」と入力


# 結果
```
positive

```
浮動小数点数の内部表現を取得する

:::note alert
未定義動作かもしれません
:::

# 浮動小数点数の内部表現を取得する

整数型はビット演算を駆使して取り出したり `std::bitset` に突っ込むなどすれば内部表現を簡単に取得できるが, 浮動小数点数はだるい

共用体やポインタ等を利用して, 内部表現が取得しやすい型に無理やり突っ込むというような方法が必要になる

```c++:例
#include <bits/stdc++.h>
using namespace std;

union{ double f; uint64_t d; } bi;

void hoge(double f){
  bi.f = f;
  cout << bi.f << "\n";
  cout << bitset<64>(bi.d) << "\n\n";
}

int main(){
  hoge(3.14);
  hoge(0);
  hoge(-9);
  hoge(numeric_limits<double>::max());
  hoge(numeric_limits<double>::lowest());
}
```

```:出力
3.14
0100000000001001000111101011100001010001111010111000010100011111

0
0000000000000000000000000000000000000000000000000000000000000000

-9
1100000000100010000000000000000000000000000000000000000000000000

1.79769e+308
0111111111101111111111111111111111111111111111111111111111111111

-1.79769e+308
1111111111101111111111111111111111111111111111111111111111111111

```

# おまけ: 大小関係を保ったまま符号なし整数と相互に変換する

自分としてはこちらが本題で, radix heap に小数を突っ込めるようにするためにこういうことを調べた

double と uint64_t は値を表現するために使用しているビット数が同じなので, 上手く大小関係を保つような全単射が作れるはず

とりあえず内部表現そのままを見てみると, 符号の正負と値の大小が逆になってしまっている
ということで最上位ビットを反転させてみる

すると, 元々負数だったもの同士の大小が逆になってしまう (浮動小数点数は abs を持っているので)
ということで, 全ビットを反転させてみる

すると, 大小関係が維持でき, 逆に整数から小数に戻すのも簡単にできる

```c++
#include <bits/stdc++.h>
using namespace std;

union{ double f; uint64_t d; } bi;
constexpr int digits = 64;

uint64_t ftod(double f){
  bi.f = f;
  if(bi.d >> (digits - 1) & 1) bi.d ^= -1ull;
  else bi.d ^= 1ull << (digits - 1);
  return bi.d;
}

double dtof(uint64_t d){
  if(d >> (digits - 1) & 1) d ^= 1ull << (digits - 1);
  else d ^= -1ull;
  bi.d = d;
  return bi.f;
}

void hoge(double f){
  bi.f = f;
  cout << bi.f << "\n";
  cout << bitset<64>(bi.d) << "\n";
  uint64_t d = ftod(f);
  cout << bitset<64>(d) << "\n";
  cout << dtof(d) << "\n\n";
}

int main(){
  hoge(3.14);
  hoge(0);
  hoge(-9);
  hoge(numeric_limits<double>::max());
  hoge(numeric_limits<double>::lowest());
  cout << dtof(0) << "\n";
  cout << dtof(-1) << "\n";
}
```

```:出力
3.14
0100000000001001000111101011100001010001111010111000010100011111
1100000000001001000111101011100001010001111010111000010100011111
3.14

0
0000000000000000000000000000000000000000000000000000000000000000
1000000000000000000000000000000000000000000000000000000000000000
0

-9
1100000000100010000000000000000000000000000000000000000000000000
0011111111011101111111111111111111111111111111111111111111111111
-9

1.79769e+308
0111111111101111111111111111111111111111111111111111111111111111
1111111111101111111111111111111111111111111111111111111111111111
1.79769e+308

-1.79769e+308
1111111111101111111111111111111111111111111111111111111111111111
0000000000010000000000000000000000000000000000000000000000000000
-1.79769e+308

-nan
nan
```

# おわりに

いい感じに関数作って radix heap に使いたい～
これ使ったら実数で誤差なし二分探索とかできたりするかも？ 考えてみます
連番PNGをアニメーションWebPに変換する（Mac）

自分用の備忘録です。
PhotoshopがWebPに対応し、WebPを取り扱う環境も整ってきた感じがありますが、アニメーションのついたWebPの出力の仕方が分からず、ネットの海を漂っておりました。
最初はffmpegでやってみたものの、あまり綺麗に書き出せず。

調べると[Google公式のツール](https://developers.google.com/speed/webp/download)がありました。公式のページからダウンロードしてインストールすることもできますが、Homebrewの入っている環境なら、Homebrewからもインストールできます。
[Webp - Homebrew](https://formulae.brew.sh/formula/webp)

```
brew install webp
```

まず、After EffectsやAnimateなどから連番のPNGを書き出します。
![images.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1726777/5a0ae97c-1406-1169-9ef3-570a2323972c.png)

複数の画像からアニメーションWebPを書き出すためのコマンドは、`img2webp`です。`*`をつけることで、ファイル名の順番で書き出してくれます。

```
img2webp -d 33 -loop 1 icon_* -o icon.webp
```
オプションは[Googleのページ](https://developers.google.com/speed/webp/docs/img2webp)に解説があります。
一部抜粋すると
`-d` 1フレームあたりの秒数（ms） もし30fpsなら、33msです。
`-loop` ループの回数。0を指定すると無限ループになります。
`-o` アウトプットするファイル名

ちょっとしたアニメーションなら割と簡単に書き出すことができました。
ファイルサイズは大きくなりがちなので、短めのアニメーションにするとか、フレームレートを下げるなどの対策は必要そうです。
Powershell，ワンライナー，正規表現でファイルを選択，そのままtar.gzに圧縮

本当はあまりPowershelをは使いたくないが，需要に駆られたので適当に対策した時のメモ…<br>
最近になってようやく`tar`と`gzip`が使えるようになったらしい，あまりにも最低限すぎるだろ

# コード

```powershell
ls | ? { $_.Name -match '.*.mp4'} -outvariable files |  tar -cf 'xxx.tar' $files | gzip -9 'xxx.tar'
```

最大圧縮以外あり得ない
Gitコマンド一覧


# はじめに

今回は、Github・Gitについて私の備忘録も含め解説していきます。最近GUIからCLI操作に移行したのでしっかりアウトプットしていきたいと思います。

また、GitHub・Gitはコードを管理する際にバージョン管理ツールとして使われます。


# 本題
まずは、Githubからリモートリポジトリを作成します。＊説明は省く

次にGitで管理したいプロジェクトが存在するディレクトリに移動して以下のコマンドでGitの初期化をします。
これを実行することで```.git```といった隠しファイルが生成され、Gitの管理下に置くことが可能となります。

 ``` 　
$ git init 
 ```

または、```git init```の後にディレクトリを指定することで移動しなくても実行可能になります。


```
$ git init ディレクトリ名
```

逆に、Gitでの管理をやめたい場合は```git init```したディレクトリで以下のコマンドを実行するといけます。
```
$ rm -rf .git/
```

そして、追加・変更された部分をGitに履歴として残すために```git add```と```git commit```を実行する必要があります。

最初に、```git add```で指定したファイルをステージングにあげます。

```
$ git add 指定したファイル名
```
```
$ git add .
```

また、```git add```の後にピリオド（.）をつけることで全てのファイルを指定することが可能になります。
```git add```されたファイルはコミットするファイルと認識されるようになります。


続いては、```git add```されたファイルを実際に履歴に残すために```git commit```します。


```
$ git commit -m 'メッセージ内容'
```

このようにしてコミットします。```-m```の後はダブルクオーテーションでも問題ないです。クオーテーションで囲まれている中身にはコミットメッセージを書きます。ファイルに変更を加えたのであれば、```git commit -m 'ファイル修正'```など、、、

この２つのコマンドでGitに履歴を残すことができたので、変更・追加したファイルをローカルリポジトリからリモートリポジトリに情報を送りたいと思います。

そこで登場するのが、```git push origin ブランチ名```です。

ですが、初回の```push```コマンド、のちに登場する```pull```コマンドを実行するにはリモートリポジトリを追加してあげる必要があります。

```
$ git add remote origin URL
```

ここでの```URL```とは、GitHub側でご自身のリポジトリがある場所で表示されているHTTPSをコピペでいけます。

そうすることで、リモートリポジトリが追加されるはずです。
実際に追加されているか確認するコマンドとして以下のものがあります。
```
$ git remote -v
```

これで、何か表示されていたら成功です。

ここで先ほどにも出た、変更・追加したファイルをローカルリポジトリからリモートリポジトリに情報を送る方法として```push```が登場します。

```
$ git push origin ブランチ名
```

これでリモート側に変更が加わります。

実際にチーム開発する際には、masterブランチ（大元となるもの）から派生させて作業するブランチを個人で使います。
個人開発では、masterブランチへの直pushで良いでしょうが（良くはない）チーム開発ではそうはいきません。

作用ブランチからmasterブランチへ```push```した後に```pull request```を出してメンバーにコードレビューを依頼しましょう。そこで、許可が下るとマージされるというのがベストではないでしょうか。

また、チーム開発をしていると他のメンバーが```push```してどんどんリモートブランチが更新されていきます。そこで、自分側にもその更新を反映したいときに使うGitコマンドがあります。

```
$ git pull origin ブランチ名
```
このコマンドで指定したブランチ名の中身を自分のローカル側に反映することができます。
ローカル側でも反映したいブランチに切り替えてから実行しましょう！

```
$ git checkout ブランチ名
```

注意点として、現在の作業しているブランチでコミットなどがされていないとブランチを切り替えた時に変更が失われます。なので、切り替える前にしっかり履歴として残しておきましょう。

また、現在どのブランチにいるか確認するコマンドがあります。

```
$ git branch
```
```-a```を付けてあげると、リモートブランチも併せて確認することができます。
```
$ git branch -a
```

ブランチ作成コマンド

```
$ git checkout -b ブランチ名
```

# その他、頻出Gitコマンド

```
$ git status   -　　　　現在のファイル状況（修正・削除されたファイルなど）を確認することができます。
$ git log      -  誰がいつコミットしたかコミットIDと一緒に確認することができます。
$ git diff     -  変更された差分を確認することができます。
```

以上です、ありがとうございました！
まだまだ、勉強中ですのでアドバイス等ありましたらお願いします。
【Git】GitLabで管理を楽にする（定期更新）

■紐付いているGitlabのリポジトリが自動で開く（cloneしている前提）

```
git config --get remote.origin.url  | xargs open
```
*「リポジトリの選択ミスが減る」という恩恵を受けます。
（目視だけよりも、正確性があります）
Tensor Cores の能力を測る

Tensor Coresは、複数の単純な計算を同時に実行できるユニットで、特にAIで必要とされる密行列の積を実行する能力が高いと言われています。そこで、512×1024の行列と1024×2048の行列の掛け算にかかる時間を計測して確認してみます。

以下のレポジトリに動作するプログラムは置いてあります。記事中のプログラムはここからの抜粋です。
https://github.com/Satachito/matpro

## 前提

行列のデータは Row-major order で格納しています。

## 環境

<dl>
    <dt>CPU
        <dd>Intel(R) Xeon(R) CPU @ 2.80GHz<dd>
    </dt>
    <dt>GPU
        <dd>A100<dd>
        <dd>GEFORCE RTX 3090<dd>
        <dd>T4<dd>
    </dt>
</dl>

## 準備

```
#define M   512 
#define K   1024
#define N   2048
```

### C++

参考のために C++ でのプログラムを作成し、計測します。

```
void
MatPro( float* a, float* b, float* c ) { 
    for ( auto m = 0; m < M; m++ ) { 
        for ( auto n = 0; n < N; n++ ) { 
            auto $ = 0.; 
            for ( auto k = 0; k < K; k++ ) $ += a[ m * K + k ] * b[ k * N + n ];
            c[ m * N + n ] = $;
        }   
    }   
}
```

-Ofast オプションをつけてコンパイルしたとき、実行時間は 317,639 μs でした。

### CUDA Cores を使う

```
__global__ void
MatPro( float* a, float* b, float* c ) { 
    auto $ = 0.; 
    auto n = blockIdx.x * blockDim.x + threadIdx.x;
    auto m = blockIdx.y * blockDim.y + threadIdx.y;
    for ( auto k = 0; k < K; k++ ) $ += a[ m * K + k ] * b[ k * K + n ];
    c[ m * N + n ] = $;
}

MatPro<<< dim3( N / 32, M / 32 ), dim3( 32, 32 ) >>>( a, b, c );
```

実行時間：
|A100|RTX 3090|T4|
|---|---|---|
|1,222μs|9,329μs|52,495μs|



### Tensor Cores を半精度(16bit)データで使う

```
template < typename F > __global__ void
MatPro(
    const   half*   _a
,   const   half*   _b
,           F*      _c
) {
    wmma::fragment< wmma::matrix_a, 16, 16, 16, half, wmma::row_major > a;
    wmma::fragment< wmma::matrix_b, 16, 16, 16, half, wmma::row_major > b;
    wmma::fragment< wmma::accumulator, 16, 16, 16, F > c;

    wmma::fill_fragment( c, 0 );

    for ( auto k = 0; k < K; k += 16 ) {
        wmma::load_matrix_sync( a, _a + ( blockIdx.y * K * 16 + k ), K );
        wmma::load_matrix_sync( b, _b + ( k * N + blockIdx.x * 16 ), N );
        wmma::mma_sync( c, a, b, c );
    }

    wmma::store_matrix_sync( _c + ( blockIdx.y * N * 16 + blockIdx.x * 16 ), c, N, wmma::mem_row_major );
}

MatPro< F ><<< dim3( N / 16, M / 16 ), 32 >>>( a, b, c );
```


実行時間(結果が単精度:32bit)：
|A100|RTX 3090|T4|
|---|---|---|
|547μs|472μs|2035μs|


実行時間(結果が半精度:16bit)：
|A100|RTX 3090|T4|
|---|---|---|
|435μs|319μs|1,815μs|


### 考察

Tensor Coresは、行列積の計算において、半精度データを使用することで、メモリの節約と計算速度の向上が可能であることを示しています。

https://github.com/Satachito/matpro
このレポジトリに密行列の積を計算するマルチCPUやSIMD(AVX-512)を使った場合などのさまざまなプログラムを入れてあります。

### 英文

https://satachito.github.io/TechBLOG/
Laravel8 ローカル環境構築

# 参考にした記事
* [公式ドキュメント](https://readouble.com/laravel/8.x/ja/installation.html)
* [Rエフェクト:laravel8インストール](https://reffect.co.jp/laravel/laravel8_install)
* [MySQLデータベースを使ってLaravel構築 in Mac](https://reffect.co.jp/laravel/mysql-laravel-in-mac)


# 方法
**前提条件：docker desktop appがインストール済みであること**
1. 公式ドキュメントの通りLaravelをインストール
```curl -s "https://laravel.build/example-app" | bash```
1. ```cd example-app```
1. ```./vendor/bin/sail up```
このsail upコマンドはdockerを構築し、動かす。ターミナル上では止めるまでコンテナが動いている。
これを止めるとLaravelもとまってしまう。
**※注意点**
3がうまくいかない時はdocker desktop appを最新版にしてみる。

4.  ```php artisan serve```
このコマンドで、ローカルでLaravelが起動する。
5. mysql -u root -p
上記コマンドでその後出てくるPasswordにrootを入力し、mysqlに接続する。

以上で、基本的な構築は完了。
mysqlなどの設定は別途以下に記述。


## Laravelプロジェクトとmysqlを繋げる
参考：* [MySQLデータベースを使ってLaravel構築 in Mac](https://reffect.co.jp/laravel/mysql-laravel-in-mac)
1. 
1. ```mysql -u root -p```でmysqlにログイン
1. ```create database　hoge_db;```ここは任意のDB名で作成
1. ```show databases;```で作成したDBが正しく表示されるか確認
1. ```show variables like 'port';```でローカルのmysqlのポート番号を確認
1. Laravelの```.env```ファイルの記述を今作成したDBの内容に変更する

**.env**

```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_practice
DB_USERNAME=root
DB_PASSWORD=root
```
上記のように既存の記述からポート番号とDB名を変更する。


ここまで出来たら、mysqlとの接続にGUI（table plus)を使用する
[TablePlusをMACにインストールしMySQL,SQLite接続](https://reffect.co.jp/windows/tableplus-connect-mysql-sqlite)



## GithubからLaravelをデプロイする

[参考サイト](https://brainlog.jp/server/aws/post-2808/)
しかしこのサイトの
>GithubからLaravelアプリをCloneする
```
# ルートディレクトリに移動
$ cd /var/www

# Cloneする
$ git clone git@github.com:[アカウント名]/[リポジトリ名].git .
```
>cloneコマンドの最後に「.」ドットを付けると、ルートディレクトリ直下にファイルが展開されます。付けないとディレクトリごと>cloneされるので、ルートディレクトリの設定を変更する必要があります。
ここでcloneができなかった！

そこで参考にしたサイト
https://baby-sun.hatenablog.com/entry/2020/06/08/234109
https://webree.jp/article/ssh-add-error/

### ssh-addしたら警告がでた
```
[ec2-user@ip-10-0-10-10 www]$ ssh-add ~/.ssh/id_rsa.pub
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
```

https://mhagemann.medium.com/how-to-fix-ssh-permission-denied-with-git-clone-f669b65f90ac

この記事を参考に
```cd ~/.ssh```で.sshディレクトリへ移動し
```chmod 600 id_rsa.pub```を実行する

この後に```ssh-add ~/.ssh/id_rsa.pub```（この作業の必要性は不明）
パスフレーズを求められたが、空欄のままエンターを押した。

```git clone```をsudoなしでやったがいけた！


、、、と思ったが、/var/www/の配下では権限の関係でいけず、
この時行けたのは ~/.ssh/の配下でやるとcloneできたというもの


検証は続く
【yocto】イメージ一覧を確認する方法

# はじめに
- core-image-minimal以外で、どんなイメージがあるかのかよくわからない…という方向け

# 方法
~~~
ls meta*/recipes*/images/*.bb
~~~

# 例
- pokyディレクトリでコマンドを実施
~~~
takeshi@X250:~/yocto/poky$ ls meta*/recipes*/images/*.bb
meta-selftest/recipes-test/images/error-image.bb                      meta/recipes-extended/images/core-image-kernel-dev.bb
meta-selftest/recipes-test/images/oe-selftest-image.bb                meta/recipes-extended/images/core-image-testmaster-initramfs.bb
meta-selftest/recipes-test/images/test-empty-image.bb                 meta/recipes-extended/images/core-image-testmaster.bb
meta-selftest/recipes-test/images/wic-image-minimal.bb                meta/recipes-graphics/images/core-image-clutter.bb
meta-skeleton/recipes-multilib/images/core-image-multilib-example.bb  meta/recipes-graphics/images/core-image-weston.bb
meta/recipes-core/images/build-appliance-image_15.0.0.bb              meta/recipes-graphics/images/core-image-x11.bb
meta/recipes-core/images/core-image-base.bb                           meta/recipes-rt/images/core-image-rt-sdk.bb
meta/recipes-core/images/core-image-minimal-dev.bb                    meta/recipes-rt/images/core-image-rt.bb
meta/recipes-core/images/core-image-minimal-initramfs.bb              meta/recipes-sato/images/core-image-sato-dev.bb
meta/recipes-core/images/core-image-minimal-mtdutils.bb               meta/recipes-sato/images/core-image-sato-ptest-fast.bb
meta/recipes-core/images/core-image-minimal.bb                        meta/recipes-sato/images/core-image-sato-sdk-ptest.bb
meta/recipes-core/images/core-image-tiny-initramfs.bb                 meta/recipes-sato/images/core-image-sato-sdk.bb
meta/recipes-extended/images/core-image-full-cmdline.bb               meta/recipes-sato/images/core-image-sato.bb
~~~
GithubCopilotの補完が効かなかった時の解決方法

## 事象
Github Copliotでコメントを書いても補完候補がでてこないことがあった
```
# 引数二つを足し算する
```

本来上のようなコメントをすると、以下のように候補を出してくれる
```
# 引数2つを足し算する
def add(a, b):
    return a + b
```

出なくなってしまったので調べた。

### 解決策

出力のログを見ればOK。
出力ログはターミナルがでていれば、ターミナルの左に表示があるのでそこを押下すればよい。
もしくは表示（View）→出力（Output）でも出力ログはみれる。

自分は以上で見れた。以上で解決しなければログを見て原因を特定すべし。


[参考](https://github.com/github-community/community/discussions/6785)
【完全自分用】Rubyの問題を解いて知識を深める②

# はじめに
前回に引き続き、完全に自分用アウトプットです。
Rubyの問題を解いて、プログラムの知識や考え方を深堀りするために記述します。

# Q6 繰り返し処理
- 1〜10の数字を順番に足し合わせる。
- 足し算の合計値がターミナルに出力される
- 繰り返し処理で記述しなければならない。
```
sum = 0 #sum = 0で常に結果を保存する変数を準備

10.times do |i|
  sum += i + 1  #1〜10の数値を順番に足していく
end

puts sum #値を出力
```
# Q7 配列を利用したrubyプログラムの作成
以下の配列から任意の数字を探して何番目に含まれているかという結果を返すsearchメソッドを、each_with_indexを用いて作成する
```
input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
```
```
def search(target_num, input)
  input.each_with_index  do |num, index| #配列にinputメソッドを定義
    if num == target_num
      puts "#{index + 1}番目にあります"　#配列が0から始まることを考慮した記述
      return
    end
  end
  puts "その数は含まれていません"
end

input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
search(11, input)
```
# Q8 特定の文字列を検知するプログラムの実装
以下の要件を満たすcheck_nameメソッドを実装
- 名前を入力すると「登録が完了しました」という文字列を出力すること
- 名前の中にピリオド(.)がある場合は、「 "!エラー!記号は登録できません"」という文字列を出力すること
- 名前の中に空白（半角のみ）がある場合は、「 "!エラー!空白は登録できません"」という文字列を出力すること
```
def check_name(str) 
  if str.include?(".")
    puts "!エラー!記号は登録できません"
  elsif str.include?(" ")
    puts "!エラー!空白は登録できません"
  else
    puts "登録が完了しました"
  end
end

puts "登録したい名前を入力してください(例)YamadaTaro"
str = gets
check_name(str) 
```
include?メソッドは指定した値が配列や文字列に含まれているかを判断するメソッド。
上記では()にしているが["."," "]のように複数の値を入力することが可能。

# Q9 条件分岐
ターミナルから数字を入力して、数字に応じて以下のように出力するプログラムを書く。
- 10以下なら10以下の数字です
- 10より大きい数値なら10より大きい数字です
- 10以下でかつ0以下なら0以下の数字です
```
input = gets.to_i

if input <= 0
  puts "0以下の数字です"
elsif input <= 10
  puts "10以下の数字です"
else
  puts "10より大きい数字です"
end
```
# Q10 eachの入れ子
果物の名前と値段が入った配列がある。
```
fruits_price = [["apple", [200, 250, 220]], ["orange", [100, 120, 80]], ["melon", [1200, 1500]]]
```
この配列を用いて、果物の名前とそれぞれの合計額が出力されるコードを記述。
以下が出力されるコード。
```
（出力）
appleの合計金額は670円です
orangeの合計金額は300円です
melonの合計金額は2700円です
```
```
fruits_price = [["apple", [200, 250, 220]], ["orange", [100, 120, 80]], ["melon", [1200, 1500]]]

fruits_price.each do |fruit| #まずはブロック変数に
  sum = 0 #金額を入れるsumを準備
  fruit[1].each do |price|　
    sum += price
  end
  puts "#{fruit[0]}の合計金額は#{sum}円です。"
end
```
appleの場合
sum = 0
sum = 0 + 200
sum = 200
sum = 200 + 250
sum = 450
sum = 450 + 220
sum = 670
のように追加されていく。

# おわりに
知識の深堀り続けていきます。
PowerAutomate: フロー並行処理追加と結合

# 背景
フローを作る際に並行処理を簡単に設定出来るのはいいんだけど、結合ってどうやるの？って話があったので

# 概要
- 分岐は、並行処理追加メニューが出る場所のみ
    - Scope を突っ込めば、Scope内では分岐可能で、Scope出る際に結合
- 結合は、一番下にある New Step で全部を結合
    - Scope 内で分岐すれば、結合は勝手にやってくれる

# 詳細
## 分岐
こんな感じで、➕記号メニューで並行アクションが追加出来る場合にのみ分岐可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/8df7ffb5-d98c-1dd7-52c7-a3644f89bb99.png)

条件としては以下かな？と
- 並行処理内はダメ。
    - 多段にする場合は、閉じず並行処理追加していくか、Scope 追加で

OK/NGの場所は以下な感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/418a0d1d-60cf-16c8-4b7c-da1712298bd2.png)

Scope 追加すれば並行処理内でも追加可能。結合もScope出るところで勝手にやってくれて便利
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/12482efe-c132-9963-f79b-a63dd2575738.png)

## 結合
一番下にある、[New Steps] で並行処理を全部結合

以下の例は、Scope 内なので、Add an action で結合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/946de3f2-2f2f-2afd-bbcd-ec97e4700c9e.png)

::: note info
並行処理が三点あったとして、そのうち選択した二点だけを結合したい、みたいなときは
- 二点だけを Scope で分岐・結合
- 先に分岐・結合後に、改めて分岐追加
:::

# あとがき
Automate で複雑な並行処理はあまりしないと思うけど、したくなったらやっぱり Scope 使いましょう、かな
tidyverseでselect()とeverything()を使って任意の列を最後尾に並べ替えたい

# TL;DR
これを実行すると`Sepal.Length`列が一番後ろ（右）にくる
```R
d %>%
  select(-Sepal.Length, Sepal.Length) %>%
  head(1)
```
# select()関数を使った並べ替え

tidyverseを使ってると、見栄え的な問題で列を並べ替えたくなったりする。
別にどうでもいいけどどうでもよくない、牛丼の真ん中に生卵を綺麗に落とせるかくらいどうでもよくない。
そんなとき、tidyverseの`select()`関数を使うと色々便利で、特に`everything()`と組み合わせると最強になれる（[参考](https://mom-neuroscience.com/r-order-column/)）。
例えば、こんな感じ。とりあえずirisデータセットを読み込む。
```R
# とりあえず読み込んで中身を覗く
library(datasets)
d <- iris
head(d)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa
```
ここで、Species列を前に持ってきたいとする。select()関数の中に、並べ替えたい順に列名を入れる。
```R
d %>%
  select(Species, Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) %>%
  head(1)
#   Species Sepal.Length Sepal.Width Petal.Length Petal.Width
# 1  setosa          5.1         3.5          1.4         0.2
```
でも、これで列数が増えるとめんどくさい。その時には`everything()`が使える。
```R
d %>%
  select(Species, everything()) %>%
  head(1)
#   Species Sepal.Length Sepal.Width Petal.Length Petal.Width
# 1  setosa          5.1         3.5          1.4         0.2
```
`everything()`の関数便利すぎだろ！

# everything()が使えないとき
マジクソ鬼便利な`everything()`だが、`select()`の末尾にしか使えない。
下の例は上手くいかない。
```R
d %>%
  select(everything(), Sepal.Length) %>%
  head(1)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
```
多分、`everything()`関数で`Sepal.Length`がすでに呼び出されているため、二個目が無効になってるんだと思う。

なら、`select(-hoge)`を使って一旦目的の列をはじいてしまえばいいのでは。
```R
d %>%
  select(-Sepal.Length, Sepal.Length) %>%
  head(1)
#   Sepal.Width Petal.Length Petal.Width Species Sepal.Length
# 1         3.5          1.4         0.2  setosa          5.1
```
上手くいった！
一度`select(-hoge)`ではじいても、同じ関数内なら再度呼び出せるらしい。
# まとめ
多分これで列の並べ替えは変幻自在なはず。
# 追記
これでもいけるっぽい。こっちの方が分かり易いかも。
```R
select(Sepal.Width:Species, Sepal.Length)
```
WebSocket Ping-Pong Frame実践

# WebSocket Ping-Pong Frame 実践

## inspire
mdnからWebSocketの規格を見ていたところ、Ping-Pong Frameの実装についてサーバー側からする必要があると記載を見たのでGoから実装しました。
[レファランス](https://websockets.spec.whatwg.org/#ping-and-pong-frames)

## 使うライブラリ
- [gorilla](https://github.com/gorilla/websocket)　>= 1.5.0
- golang >= 1.18


## gorillaのAPIレファランス

Ping Frameは直接転送し、Pong Frameは[PongHandler](https://pkg.go.dev/github.com/gorilla/websocket#Conn.PongHandler)を設定することで、Ping-Pong Frameが実装できます。



## ソースコード

### サーバー側
- クライアントと接続が完了したところからのソースコードになります。

#### ping Frameの実装

一定間隔でPingを送信したいので、タイマーを使います。

	ticker := time.NewTicker(pingPeriod)
	defer func() {
		ticker.Stop()
		c.conn.Close()
	}()


タイマーのトリガーが起動されたらPingメッセージを送信します。

		case <-ticker.C:
			log.Println("ping")
			log.Println(time.Now())
			c.conn.SetWriteDeadline(time.Now().Add(writeWait))
			if err := c.conn.WriteMessage(websocket.PingMessage, nil); err != nil {
				return
			}
		}



#### pong Frameの実装

クライアントからのPong Frameを受け取る側の実装になります。
ブラウザからはPingFrameを受け取った際に自動的にPing Frameを転送してますので、クライアント側の実装は不要です。

PongHandlerに受け取った際のイベントハンドラーを登録し、届いたPong Frameを確認します。


	c.conn.SetPongHandler(func(string) error {
		c.conn.SetReadDeadline(time.Now().Add(pongWait))
		log.Println("print line", time.Now())
		return nil
	})


## 終わり

ここからもう少し応用すると、クライアント、サーバー間の遅延時間を計算することも可能になります。
今回使ったソースコードは下記のURLにありますので確認いただければと思います。

https://github.com/dlstjq7685/ws-pingpongTutorial
TECH CAMP12日目　~ルーティングのネスト~

# ルーティングのネスト
- ルーティングのネストとは、段階に分けてルーティングを記述すること

__書き方の例__
```ruby
Rails.application.routes.draw do
  resources :tweets do
    resources :comments, only: [:create]
  end
end
```

## メリット
- ルーティングの記述をネストさせるとURLの階層構造ができる。
上記のようにルーティングした場合のURL
`/tweets/id(数字)/comments`
このようにどのツイートに対してのコメントなのかが一目でわかる。

- パラメーターに親要素のカラムを入れることができる
ちょっと分かりにくいので使わなかったらどうなるか↓

### 使わなかったら...
例）
```ruby
Rails.application.routes.draw do
  resources :tweets 
  resources :comments
end
```
```html.erb
<%= form_with 'hoge', comments_path, method: :post %>
```

comments_pathにはどのツイートのコメントなのかを表すパラメーターがない
コメントコントローラーでは
```ruby
def create
  @tweet = Tweet.find(params [:tweet_id])
  @comment = @tweet.comment.new
end
```
上のようなtweet_idをパラメーターとして持たせることができない。