OmniAICreator/Qiita-1.07M huggingface dataset:
文系卒が海外エンジニアになるには

記事を見ていただきありがとうございます。
この記事は今後自分が海外エンジニアとして働くためにどういうステップを歩むか考え、調べた内容です。参考までに見てください。

## 　対象者
・まだエンジニアになり始めで、今後海外で働くことを目指している方。
・未経験だけど、海外でエンジニアとして就職したいと思っている方。
・働きながらCS（Computer Science）を取りたい方。

## 　目次
　STEP1 　海外エンジニアになるにはまず英語
　STEP2　CSの学位を取得（オンライン）
　STEP3　就職活動

## 　STEP1 　海外エンジニアになるにはまず英語
　海外で働く上で、英語は必須（それ以前にエンジニアとして英語も必須かな）。ではどのような英語学習をすれば良いか？
自分はDuolingoというアプリとHello talkのみを愛用。

### 　Duolingo
<img width="200" alt="[image.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1935269/076749b4-bd3e-9721-f4ef-fcdec032223b.png"><br>
　Duolingoとはリスニング、スピーキング、リーディングを用いて学習する言語学習アプリ。
なぜたくさんある言語アプリで、Duolingなのかというと、Duolingo English Testが受けられるからです。
詳しくはhttps://englishtest.duolingo.com/applicants
よく海外留学留学行くときはTOEFLやIELTSを証明として使いますが、最近はDuolingo English Testのスコアを提出するケースもあります。
海外で働く場合、英語で会話することも大事なので、非常に役立つかと思います。

### 　Hello talk

<img width="200" alt="[image.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1935269/232dc0c3-b151-f497-da6d-4427989020e0.png"><br>
　Hello talkとは言語交換アプリ。例えば日本語を学びたいアメリカ人と英語を学びたい日本人がお互いに学習パートナーとして言語を教え合うアプリです。
これは外国人と知り合うきっかけにもなりますし、コミュニケーションを取ることで上達も早いです。さらに海外の方がエンジニア多いので、プロフィールにソフトウェアエンジニアが多いのが印象です。知り合う良いきっかけにもなります。

## 　STEP2　CSの学位を取得（オンライン）
では英語をクリアしたら、次は大学選びです。調べた結果、数多くヒットしたのが、University of London(ロンドン大学)とUniversity of the People(ピープル大学)です。こちらであれば定額かつオンラインで学士が取得できます。働きながら海外大学の学士を取得できるのなら、この２校が最適。

## 　STEP3　就職活動
では海外大学のCS学士号が取れたら、就職活動。
海外の就職サイトは基本Linkedinで行われている模様。大学の学歴はもちろんオンライン上で修了したコースの証明書をLinkedinに登録することも可能。
大学の入学準備段階でLinkedinのアカウントを発行しておいても良いかも。

## 　おまけ
　とはいえ、いきなりCSの勉強についていけるかは不安なので、予習は大事。
無料教材の中でもCS50がおすすめ。CS50はハーバード大学とイェール大学で教えられているコンピュータサイエンスに関するキャンパス内およびオンラインの入門コースです。動画を見て、課題を提出するので、実際のカリキュラムを受ける感じはわかるかもしれない。あとは動画内の日本語字幕が
自動翻訳ではなく、人が修正した翻訳なのでかなりわかりやすい。まずは英語学習と並行して受けるのも良いかも。
GASでスプシにアラート出してみた

父の業務を効率化するためにGASを組んだのですが、その際に使ったアラート機能をここに残します🔥

# 経緯
経緯としては、プログラミングに疎い父のために、GASでUI的にアラートを出してあげよう！というのが始まりです。少しだけ入力させる工程があり、お得意先さんの名前とそのコードを記入しないといけないのですが、そこでおっちょこちょいの父は、片方しか入力しなかったりしてミスる訳です。その時に、プログラミングできない父はログとか読むと思いますか？いや読める訳ないんです笑
そこで、UI的にスプレッドシート側にアラートを出そう！と決めました💪

# 使い方
アラートの使い方には、主に２種類があると思っています。
1. シンプルにコードで使う
1. 例外処理と組み合わせて使う

上記の順で説明します🙌

## 簡単な使い方
以下の内容が表示するコードです。
至ってシンプル！！！
```javascript:main.gs
  if(clientCode.length === 0) {
    SpreadsheetApp.getUi().alert('エラー\n得意先コードが未入力です。\n実行できません。')
    return
  }　else if(clientName.length === 0) {
    SpreadsheetApp.getUi().alert('エラー\n得意先名が未入力です。\n実行できません。')
    return
  }
```
SpreadSheetAppクラスのgetUiメソッド群の中にあるalert()を使います。
DOMのalertとほとんど同じ用法で、()の中には、文字列を格納する以外の使い道はありません。

https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#getui

## 例外処理との組み合わせ
また、例外処理と組み合わせる場合は以下のように使うと良いでしょう！
```javascript
  // 新しいシートの作成
  let newSheet = sheet.insertSheet() 
  const title = `${clientCode} ${clientName}`
  try {
    newSheet.setName(title)
  } catch(e) {
    SpreadsheetApp.getUi().alert(e.message)
    sheet.deleteSheet(newSheet)
    return
  }
```
このコードは、新しいシートを作成するのですが、シート名を設定するtitle変数に値がない場合setName関数がエラーを吐きます。そのエラーをtry-catch構文でキャッチし、例外クラスのメッセージフィールドをalertで表示し、return文でGASの実行を停止します。

# 最後に
このように、例外処理try-catchと組み合わせることで、プログラミングが苦手な父も使えるサービスになりました⭐️
UIを意識する場合は、使ってみると良いかもしれません！それでは〜🙋‍♂️

# 参考文献

https://developers.google.com/apps-script/reference/base/ui.html
【Unity】3Dモデル読み込みツールTriLib2入門

# 初めに
本記事は公式Wikiの一部を抜粋翻訳した内容に一部付け加えた記事です。
誤った記載等があればコメント頂けると幸いです。

# TriLib2とは

https://assetstore.unity.com/packages/tools/modeling/trilib-2-model-loading-package-157548

* アプリ外部の3Dモデルや画像ファイルを動的に読み込むことができる有償アセット
    * 特に3Dモデルを読み込む機能は希少
    * 一応標準機能のAssetBundle,Addressableでも読み込むことができるが、事前にUnityEditorからビルドする必要があるので使いづらい
* エクスポート機能は付いていないので注意
* アバターの読み込み時は階層の名前が正しければHumanoidとして読み込むことができる。
    * FBX,GLTF(Vroidもいける？)のみ
    * T-Pose,Star-Poseに設定している必要がある 
* 数カ月に一回セール対象になっている

# 対応ファイル形式
## 3Dモデル
* FBX ※バージョン7.0以降に対応
* OBJ
* GLTF2 ※実験的機能としてDracoの解凍に対応
* STL
* PLY
* 3MF
* ZIP
### 画像
* BMP
* GIF
* JPG
* PNG
* PSD
* TGA
* HDR ※Skyboxを読み込みに使用

# サンプルシーン
## AssetViewer
ローカルディレクトリ及びURLからアセットを読み込むサンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/33acd54b-4e10-ea17-f190-92d4bb3fa86b.png)

## AvatarLoader
モデルを呼び出し、Humanoidのアバターとしてシーンに読み込み、操作することができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/e9ab9dc8-333e-0bc1-dcb2-fbcff4461f37.png)

## ListModelResources
Models" フォルダから "TriLibSample.obj" モデルをロードし、モデルリソースをリストアップするサンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/5d1d4171-178c-0f08-c8c6-ad7ee69475d7.png)


## LoadExtraAnimations
ベースモデルから読み出した他のモデルにアニメーションをアタッチすることができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/6d346c1e-8659-e1df-3da7-de9c180ce814.png)

### LoadModelFromFile
Models" フォルダから "TriLibSample.obj" Model を読み込むサンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/e192a276-5508-9e4e-1bed-85e0d941d6cf.png)

### LoadModelFromFilePicker
FilePickerでローカルファイルを読み出すサンプル

#### LoadModelFromURL
zipされたモデルをURLから読み込むサンプル

### MergeAnimations
選択されたモデルを読み込み、"AnimationNamesA" と "AnimationNamesB" のペアの名前を持つアニメーションをマージして、新しいアニメーションを作成するサンプル

### SimpleCustomLoader
Stringsからテクスチャを1つのOBJモデルをデータソースとして読み込む

### UserPropertiesLoading
FilePickerを使ってモデルをロードし、モデルのユーザープロパティを表示するサンプル

# トラブルシューティング
### マテリアルの読み込みができない（URP/HDRP）
デフォルト設定ではBRP用の設定になっているためURPまたはHDRPで利用する際にはプロジェクト設定の変更を行う必要がある。

[Edit] > [ProjectSettings] > [TriLib] > [MaterialMappers]の利用したいパイプラインにチェックボックスを切り替える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/32d20fbc-092d-1621-dddc-4343b247426f.png)

そこで、使用しているパイプラインに適したマテリアルマッパーを有効にすることができます。
gradleで〜must be locked before it can be used to compute a classpath!と言われた時にチラ見する記事

## 対象読者
graldeで以下のようなエラー(XXXXXXXXの部分は16進数)に遭遇し、理由はともかく手っ取り早く解決(する可能性のある体験談)を求めている人。

```
java.lang.IllegalArgumentException: org.gradle.api.internal.initialization.DefaultClassLoaderScope@XXXXXXXX must be locked before it can be used to compute a classpath!
```

## 環境
+ IntelliJ IDEA 2022.2.1 (Community Edition)
+ gradle 7.4.2
+ build.gradle.kts
+ Koltin 1.6.21

## 対応
調べると出てくるのは、[gradle.properties内のconfigureondemandをFalseにする](https://qiita.com/narumichi7373/items/f368bed93d05cf52900b)方法だが、これで解決しなかった人は以下の観点で検討してはどうだろう。

`build.gradle.kts`でビルドするクラスを`build.gradle.kts`自身でインポートしたり依存対象にしたりしていないだろうか。深く検証していないが、コンパイルして生成する予定のクラスを`dependencies`に含めようとすると、たとえそれが`build.gradle.kts`でビルドするファイルと別のソースから提供されるものであっても表題のエラーが出るっぽい。

`build.gradle.kts`での生成の対象から外したらエラーが表示されなくなった(※個人の体験です)。

## 浅い考察
冷静に考えれば自己へのループ構造になるので、通常はこんなことにはならないはずなのだが、gradleのプラグインの作成と使用をサブプロジェクトを用いて同一プロジェクト内で済ませようとしたらハマってしまった。

gradleの動作に詳しい人には当然なのかもしれないが、何が`locked`なのかわからず何時間か費やしたので、(そんなにはいないとは思うが)犠牲者が少しでも減ればと書いた。
【Laravel】storageシンボリックのパスの対応のメモ

アップロードした後のファイルをブラウザから参照するにはどういうパスのルールになるのか？
ということが整理したかったのでメモです。

階層
--
> C:\~\projectフォルダ\storage\app\public (ここまでLaravel標準階層?)
 ┗ asset (ここからユーザー任意のフォルダ階層)
     ┗ image 
         ┗ 画像.jpeg

[シンボリックリンク生成先]
> C:\~\projectフォルダ\public\storage (ここまでLaravelでシンボリックリンクを生成するパス)
   ┗ asset (ここからユーザー任意のフォルダ階層)
     ┗ image 
         ┗ 画像.jpeg

シンボリックリンクの「\public\storage」に実際のファイルパス「\storage\app\public」までが集約されていると理解しました。

ブラウザからの参照
--
以下のURLでブラウザから画像参照できるようになります。
> localhost/project/public/storage/asset/image/画像.jpeg

「public/storage」まではLaravelの自動生成されたシンボリックリンクに従ったパス、
以降がユーザー任意のフォルダパス階層と同じです。

ファイルを保存するときの処理
--
[サーバー側で保存する処理（Repositoryなど）]
```php
//実際に保存するパスを指定
//publicの前に自動で「storage\app\」が付くイメージ
$ICONFILE_DIR = 'public/asset\image/';
$path = $file->storeAs($ICONFILE_DIR,$fileName);
```

[ControllerでViewにパスの変数を渡す処理]
```php
$CLIENT_ICONFILE_DIR = '/storage/asset/image/';
return view('/file/upload/complate', compact(['iconLink' => $CLIENT_ICONFILE_DIR, 'fileName' => '画像.jpeg']));
```

[View側]
```php
<image src="{{ asset( $iconLink.$fileName) }}"></image>
```

その他
--
StorageやFileなどのファサードを使う場合、filesystem.phpで基準になるパスをカスタマイズできそうです。

[参考]
https://readouble.com/laravel/8.x/ja/filesystem.html
https://reffect.co.jp/laravel/laravel-storage-manipulation-master
https://codelikes.com/laravel-storage/
【Railsチュートリアル】benchmark-ips gemで処理の実行速度を計測してみる

Railsチュートリアルの第4章に以下のような問いがあります。

>Rubyのbenchmark-ips gemを使い、ハッシュのキーを「数字」「 文字列」「シンボル」にした際のそれぞれの実行時間を測定してみましょう。
>Railsチュートリアル第４章より

４章までの復習兼ねて解いていきます。

まずbenchmark-ips gemをインストールします。
```ruby:Gemfileへ追記
group :development, :test do
    (省略)
  gem 'benchmark-ips'
end
```
本番環境ではいらないと思うので、開発・テストのみのインストールとしました。
```ruby:コマンド実行
$ bundle install
```
上記コマンドだと、インストール済みのものはインストールされず追記したbenchmark-ips gemのみインストールされます。
```ruby:実行結果
…
Using ansi 1.5.0                #インストール済みのgemはUsingとなっている
Fetching benchmark-ips 2.10.0   #未インストールなのでフェッチ
Installing benchmark-ips 2.10.0 #からのインストール
Using bindex 0.8.1
…
```
benchmark-ips gemがインストールできた為、実際に使ってみます。
基本的に以下のような記述で計測ができます。

```
Benchmark.ips do |x|
  x.report{ 計測したい処理 }
end
```


以下今回書いたプログラムです。

```ruby:書いたプログラム
hushes = {1=>"one","1"=>"one", :one=>"one"}

Benchmark.ips do |x|
  x.config(:time => 5, :warmup => 2)
  x.report{hushes[1]}
  x.report{hushes["1"]}
  x.report{hushes[:one]}
end
```
RubyファイルをRails環境で動かす場合、以下コマンドで実行できます。
```ruby:railsで実行
$ rails runner (ファイル名)
```

```ruby:実行結果
Running via Spring preloader in process 1734
Warming up --------------------------------------
                         1.291M i/100ms
                       992.726k i/100ms
                         1.260M i/100ms
Calculating -------------------------------------
                         11.237M (± 1.4%) i/s -     56.810M in   5.056730s
                          9.160M (± 3.2%) i/s -     46.658M in   5.100025s
                         11.223M (± 0.9%) i/s -     56.679M in   5.050841s
```
同じ時間内で数字とシンボルが文字列よりも多く処理されることが分かりました。
私の見解ですが、シンボルや数字ってイミュータブルな(変更不可な)オブジェクトなので、その分データの占める領域が狭く、その分呼び出しが早いのではないかと考えます。

逆に、文字列はミュータブルな(変更可能な)オブジェクトなので、ユーザの変更に対応できるよう領域を多めに取っている、つまりその分呼び出しに時間がかかっているのではないでしょうか。
rbenvでRubyのバージョン切り替えをする方法

## 概要
以下の記事を参考に勉強を進めており、Rubyのバージョンを指定する必要があったため、rbenvでバージョン切り替えてみました。

https://zenn.dev/hibriiiiidge/books/49ee4063b10cec1df1a2/viewer/dc751838fa3715f814dd

## 方法
rbenvのインストール
```
brew install rbenv ruby-build
```

rbenvのインストール確認
```
rbenv -v
```

ruby 2.6.6のインストール
```
rbenv install 2.6.6
```

ruby 2.6.6のローカル使用指定
```
rbenv local 2.6.6
```

bash_profileを開く
```
vi ~/.bash_profile
```

以下を追加
```
eval "$(rbenv init -)"
```

設定を反映
```
source ~/.bash_profile
```

rubyのバージョン確認
```
ruby -v
ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-darwin20]
```


## 参考
https://ichitasu.com/ruby-rbenv/

https://qiita.com/karlley/items/9c70d8c804f2e19c5895

https://valed.press/programming-learning/how-to-install-ruby-with-rbenv/
AndroidのAPN Type一覧

# 前提
Androidのモバイルネットワークの設定においてAPNを登録することがあります。その中でもAPN Typeに関してまとまった記事がなかったため、メモがてらに作成します。


## Android　コード
https://android.googlesource.com/platform/frameworks/base/+/a79bad63a3a813d0c38babd8d74c4076a43d47d/telephony/java/android/telephony/data/ApnSetting.java

# Type　一覧
| 内容 | 文字列 | 概要 |
| ---- | ---- | ---- |
| TYPE_ALL_STRING | "*" | データ接続用のAPNタイプ |
| TYPE_DEFAULT_STRING | "default" | デフォルトのデータトラフィックのAPNタイプ |
| TYPE_MMS_STRING | "mms" | MMS（Multimedia Messaging Service）トラフィックのためのAPNタイプ |
| TYPE_SUPL_STRING | "supl" |　SUPL (Secure User Plane Location)アシストGPSのAPNタイプ |
| TYPE_DUN_STRING |  "dun" |  DUN（ダイヤルアップネットワーキング）トラフィック用APNタイプ |
| TYPE_HIPRI_STRING | "hipri" | 高優先度トラフィック用APNタイプ |
| TYPE_FOTA_STRING | "fota" |FOTA（Firmware over-the-air）トラフィック用のAPNタイプ |
| TYPE_IMS_STRING | "ims" | IMS（IP Multimedia Subsystem）トラフィックのためのAPNタイプ |
| TYPE_CBS_STRING | "cbs" | CBS (Carrier Branded Services)トラフィックのAPNタイプ | 
| TYPE_IA_STRING | "ia" |  IA（イニシャルアタッチ）APNのAPNタイプ | 
| TYPE_EMERGENCY_STRING | "emergency" | Emergency PDN の APN タイプ。これはIA APNではありませんが、緊急電話の状況下でキャリアサービスにアクセスするために使用されます。緊急通報の際に通信事業者のサービスにアクセスするために使用されます。 |
| TYPE_MCX_STRING | "mcx" | ミッションクリティカルなサービスのためのAPNタイプ | 
| TYPE_XCAP_STRING | "xcap" | XCAP（XML Configuration Access Protocol）トラフィックのためのAPNタイプ | 
| TYPE_VSIM_STRING | "vsim" | バーチャルSIMサービスのAPNタイプ | 
| TYPE_BIP_STRING | "bip" | Bearer Independent ProtocolのAPNタイプ | 
| TYPE_ENTERPRISE_STRING | "enterprise" |ENTERPRISEトラフィックのAPNタイプ | 


### 作成時疑問点
- テザリング時に`tether`を追加する場合があるが、androidのソース上にないためメーカー独自のカスタムが入っている可能性がある。
-
PowerShell ISE上で、ファイル選択ダイアログと16進数ダンプ

[【PowerShellにて16進数ダンプ】](https://qiita.com/AnimaLibera/items/4add9a9502202704d729)と[【PowerShellファイル選択ダイアログについて。】](https://qiita.com/AnimaLibera/items/9cf7a965fcc4c0dbaaac)を組み合わせてダンプをファイルに追加して開く。
```powershell:ISE.ps1

#C#(.NETライブラリ)の名前空間を指定してアセンブリを有効にする
#※記述しなくても動いた？
[void][Reflection.Assembly]::LoadWithPartialName("Ststem.Windows.Forms")

#ファイル選択ダイアログのインスタンス生成
$OpenFileDialog=New-Object Windows.Forms.OpenFileDialog

#タイトル、指定しない場合「開く」になる
$OpenFileDialog.Title="ファイル選択"

#拡張子、指定しない場合「空白で全てのファイル」になる
$OpenFileDialog.Filter="テキスト(*.txt)|*.txt|全てのファイル(*.*)|*.*"

#デフォルトディレクトリ、指定しない場合「このスクリプトと同じ場所」になる
$InitialDirectory="C:\Users\Public"
$OpenFileDialog.InitialDirectory=$InitialDirectory

#ダイアログ表示
$Rsult=$OpenFileDialog.ShowDialog()

#ファイルを選択した場合
IF($Rsult-eq[System.Windows.Forms.DialogResult]::OK){
    
    #選択したファイルを開く前にMessage
    Write-Host "選択したファイルを開きます。"

    #コンソールにファイル名表示
    Write-Host "選択したファイルは「"($OpenFileDialog.FileName)"」です。"
    
    #logファイルの場所を代入
    $str=$InitialDirectory+'\log.csv'

    #新規にlogファイルを作成し、現在の年月日時分秒を書き込む
    #get-date | set-content $str 
    Set-Content $str -Value ""
    
    $readcount=16
    $totalCount=$readcount*1000
    #
    #ファイルから100要素ずつ読み込み一連の文字をバイトのシーケンスにエンコードする、パイプの後は改行できる
    #この場合一度に-readcountバイト読み込みそれを-TotalCountバイトになるまで繰り返す指定なしは全て読み込む
    Get-content -path $OpenFileDialog.FileName -encoding byte -readcount $readcount -TotalCount $totalCount|
   
    #2桁表示にする。空白なら無しにする。
    foreach-object{
        ('{0:x2}'-f$_).replace(' ',",")
    }|
    
    #ファイルに追加する
    add-content $str
    #>

    #現在の年月日時分秒をファイルに追加する
    #get-date | add-content $str 

    #コンソールにメッセージ表示
    Write-Host "log.csvに結果を出力しました。log.csvファイルを開きます。"

    #log.csvファイルを開く
    Invoke-Item $str
}
else{

    #コンソールにメッセージ表示
    Write-Host "ファイルを選択しませんでした。"
}




```
httpでwordpressのapplication passwordsを有効にする方法。

# やったこと
[Application Passwords](https://news.mynavi.jp/techplus/article/20201215-1590294/#:~:text=WordPress%205.6%E3%81%AB%E5%B0%8E%E5%85%A5%E3%81%95%E3%82%8C,%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82)をdockerでlocalhostに立てたwordpressで使おうとした際、Application Passwordsをhttpで使うには"WP_ENVIRONMENT_TYPE"を"local"にする必要があり([参考](https://core.trac.wordpress.org/ticket/53658))、日本語に情報がなかったため(少し調べた限りでは)記事にしてみました。
ちなみに私はWordpressをDockerでしか立ち上げたことがないため、Dockerでの設定方法のみを記載しています。申し訳ありません、、m(_ _)m

## 環境
* wordpress 6.0.1
    * [dockerでの立ち上げ方](https://docs.docker.jp/compose/wordpress.html)

## 設定方法
### dockerの場合
docker-compose.yamlに"WP_ENVIRONMENT_TYPE: local"を追加するだけです。

```docker-compose.yaml
...
   wordpress:
     ...
     environment:
       ...
       WP_ENVIRONMENT_TYPE: local
...
```

## 参考
* https://core.trac.wordpress.org/ticket/53658
* [wp_get_environment_type()](https://developer.wordpress.org/reference/functions/wp_get_environment_type/)
【SwiftUI】NavigationBarに背景画像を設定

# サンプル素材
![12133](https://user-images.githubusercontent.com/84154073/183103011-4cca5889-334c-4065-b797-a53506ef1781.jpg)

<a href='https://jp.freepik.com/vectors/background'>Kjpargeter - jp.freepik.com によって作成された background ベクトル</a>


# タイトル画像の表示方法
https://qiita.com/SNQ-2001/items/9e705bca6d72fc7c0d68

# 実装
```diff_swift
import SwiftUI

struct ContentView: View {
+   init() {
+       let appearance = UINavigationBarAppearance()
+       appearance.backgroundImage = UIImage(named: "12133")
+       UINavigationBar.appearance().standardAppearance = appearance
+       UINavigationBar.appearance().compactAppearance = appearance
+       UINavigationBar.appearance().scrollEdgeAppearance = appearance
+   }
    var body: some View {
        NavigationView {
            Text("Hello, world!")
+               .navigationBarTitleDisplayMode(.inline)
        }
    }
}
```

# 完成系
![simulator_screenshot_940E301C-6F8D-4EC7-9BA1-813A25347FAF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/3e522480-ba75-03e2-5103-adb41c8cee91.png)

# おわり
結構やり方迷いました
LaravelのテストでDBがうまく反映されなくてハマった話

## 現象
バッチのテストを実装
exitcodeで、「0:正常終了すること」を確認

バッチ内でDB登録しているので、**1件登録されていること**を確認するテストを作成

**しかし、結果は0件**。

バッチの最後に
ddコマンドやログを仕込んで、DBに1件登録されていることは確認ずみ。

なのに、なぜかバッチの処理抜けた後のテスト内では0件。。。。

## コード

```
    /**
     * テスト実施
     */
    public function test()
    {

        $resultCode = $this->execCommand();
        // 正常終了
        $resultCode->assertExitCode(0);
        // データは登録されないので変わらないこと
        $result = TestDB::query()->get()->count();
        $this->assertSame($result, 1);　🌟ここが0件。。。

    }

    /**
     * コマンド実行command
     */
    private function execCommand()
    {
        return $this->artisan('command:test-batch' . $option);
    }
```
## 原因
どうも
>$resultCode = $this->execCommand();

ここで、変数に入れていたのがよくなかったらしい。

```
$this->execCommand($today)->assertExitCode(0);
```
変数に入れずに、直接正常終了の確認を行うと
後続の、DBの件数チェックもOKとなった。


正直、原因はわかってないけど
多分、変数に入れることでバッチ処理自体が完結して
テストが終了扱い＝DBの中身がクリア。。。

みたいな感じになったのかも。

反省のメモとして残します
Herokuアップデートエラー Aws::Sigv4::Errors::MissingCredentialsError


# エラー内容
Heroku上にアップデートしていたアプリの画像の保存場所をLocal環境からAWS S3に画像に変更した後、
Heroku上にアップデートしたサイトにアクセスするとapplication errorの表示。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672823/279d6446-b764-2ae9-cc17-2eeaff75950e.png)
次にエラーメッセージに従い
コマンドラインでheroku logs --tailの確認。
```
Aws::Sigv4::Errors::MissingCredentialsError
```
Credentialsエラーということで環境設定周りが間違っていると推測できます。


# 解決方法
①環境変数に設定するAWSの項目名を正しい名称に修正。
名称を間違って設定してしまったようです。
```
×　AWS_SECRET_ACCESS_KEY_ID:
○　AWS_SECRET_ACCESS_KEY:
```

以下がAWSの環境設定に使用するACCESS KEYの組み合わせ。
```
AWS_ACCESS_KEY_ID：
AWS_SECRET_ACCESS_KEY：
```
②コマンドライン上で新しくAWSのシークレットアクセスキーを設定。
```
config:set AWS_SECRET_ACCESS_KEY="------------
```
③間違っていた環境変数の項目をconfig:unsetで削除。
```
config:unset AWS_SECRET_ACCESS_KEY_ID
heroku config:unset AWS_SECRET_ACCESS_KEY_ID
```

④git push heroku masterをして更新。

以上で解決です。
Error Analyzing App Version library

xcodeのorganizerからApp Store Connectにアプリをバイナリアップロードしようとしたとき、表記エラーが発生して、アップロードできない。

## 調査

検索するといろいろでてくるが、どれも違う。

- https://dev.classmethod.jp/articles/ios-xcode-13-app-store-connect-rxswift-6-2-0/
- https://stackoverflow.com/questions/69548498/xcode-error-analyzing-app-version-when-validating-app-in-archive-organizer
- https://stackoverflow.com/questions/69433432/what-is-an-error-analyzing-app-version-when-distributing-from-xcode
- https://developer.apple.com/forums/thread/693335

## 解決
ビルドバージョンに「ハイフン」が入っていた。
数字だけに変更して解決！
皆の README をイケてる風にしたい

README の見出しのタイトルだけ「キリッ:sunglasses:」とさせる。
ちょっとだけイケてる風にする方法をご紹介。

# 普通に書くと

```markdown: README.md
# Lame

An example of lame README!
```

![lame-readme.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2181622/9a9ccb74-0e26-c758-55dc-e520b994a04a.png)

「のっぺり:disappointed:」

ちょっと味気ない。知らんけど。

# ちょっとかっこよく :sunglasses:

こうするのだ

```markdown: README.md
<div align="center">
  
# Cool

**An example of cool README!**

</div>
```


![スクリーンショット 2022-08-20 21.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2181622/2da58650-de91-827e-cce5-3027f29d7757.png)

「キリッ:sunglasses:」

なんか味がある。美味しそう。
インデントの有無はお好みで。


# どうですか

見出しのタイトルだけ HTML で書いてキリッとさせると、全体の見栄えもだいぶ変わる気がします。
それ以下はいつものように markdown で書いていけばええ感じなる。

って気がしたので久しぶりに雑なQiita記事書いてみたのでした。おやすみなさい。
Jetpack Composeで画面幅を取得して4分割する方法

## はじめに 
今回はまず画面の幅を取得して、その上で最小値を設定して4分割した値を取得し、Jetpack ComposeのRowの中でそれぞれ要素に横幅を設定して呼び出していこうと思います。

## 画面の幅を取得 
まず、画面の横幅を取得するところからやっていこうと思います。 

```Kotlin

@Composable
fun Root() {
  DetailSection(
    modifier = Modifier
      .fillMaxWidth()
  )
}


@Composable
fun DetailSection(
  modifier: Modifier = Modifier
) {
  val configuration = LocalConfiguration.current.screenWidthDp.dp
  
  Row(
    modifier = modifier,
    horizontalArrangement = Arrangement.Start,
    verticalAlignment = Alignment.CenterVertically
  ) {
    DetailSectionButton(
      modifier = Modifier
    )
  }
}

```

上の`val configuration = LocalConfiguration.current.screenWidthDp.dp`で画面の横幅を取得しています。

## 左右のpaddingと最小値の設定　
次に最小値を設定していこうと思います。　

```Kotlin
@Composable
fun DetailSection(
  modifier: Modifier = Modifier
) {
  val screenWidth = LocalConfiguration.current.screenWidthDp.dp
  val minWidth = dimensionResource(id = R.dimen.section_width) // 80dp
  val buttonWidth = (screenWidth * (1F / 4F)).coerceAtLeast(minWidth)
  
  Row(
    modifier = modifier,
    horizontalArrangement = Arrangement.Start,
    verticalAlignment = Alignment.CenterVertically
  ) {
    DetailSectionButton(
      modifier = Modifier
        .width(buttonWidth)
    )
    ......
  }
}

```

`val minWidth = dimensionResource(id = R.dimen.section_width)`で最小値を取得して、 
`val buttonWidth = (screenWidth * (1F / 4F)).coerceAtLeast(minWidth)`で、`buttonWidth`の値を`80dp`に設定しています。　
あとはこれを、各コンポーネントに渡していけば完了です！ 

以上です🫡
[React]useMemo使ったのに再描画されてる問題

# 背景
パフォーマンス上げるためにcomponentをuseMemoを使ってメモ化したのですが、なぜか再描画されている。
原因はmemo化したcomponentの表示を条件付きレンダーで切り替えていたこと。
簡潔に書くとこんな感じでした。。。

```tsx:親
const Parent = () => {
  const child = useMemo(() => <Children />)
  return (
    ...
    {isOpen && (
      <Modal>
        {child}
      </Modal>
    )}
  )
}
```

# 解決
js側でレンダリングさせると重くなってしまうのでcssで切り替える。
```tsx:親
return (
  ...
  <Modal style={{ display: isOpen ? '' : 'none' }}>
    {child}
  </Modal>
)
```
:::note warn
ちなみに{visibility: hidden}だとcomponentの階層ごとに消えていくのでめっちゃちらついた
:::
STM32G031と秋月シリアル7セグで3分タイマー SPI


x 超超重要 なぜか秋月STM32G031J6M6がうり切れていた。注意!!(2022/8/27現在)


x 過去ログを見よ!!

x Mbedでのボード設定は、NUCLEO-G031K8
x 赤色７セグメントＬＥＤシリアルドライバモジュール　完成品
x OSL10564-74HC595-R M-12642
x ここで言うSTM32G031は、秋月で売っているSTM32G031J6M6の事


![o_con696.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a6845773-fc7d-0f4d-414e-541eacac988f.jpeg)



```c++



//spi_7seg_3min_031_1

#include "mbed.h"

//*          *****  *****  
//*         *       *    * 
//*         ******  *    *
//*         *       *    *
//*         *       *    *
//********   *****  *****


SPI spi( PA_12 , PA_11 , PA_1); // mosi, miso, sclk //031
DigitalOut en( PB_7 ); //031


char seg[32] = {
   0x00 , //0 @ -> ' '
   0x77 , //1 A  o
   0x7c , //2 B     　combined use "6"
   0x39 , //3 C
   0x5e , //4 D
   0x79 , //5 E  o
   0x71 , //6 F
   0x3d , //7 G

   0x76 , //8 H  o
   0x06 , //9 I    　combined use "1"
   0x1e , //10 J
   0x75 , //11 K 
   0x38 , //12 L  o
   0x15 , //13 M
   0x37 , //14 N  o
   0x3f , //15 O  o　combined use "0"

   0x73  , //16 P
   0x67  , //17 Q　combined use "9"
   0x50  , //18 R
   0x6d  , //19 S　combined use "5"
   0x78  , //20 T
   0x3e  , //21 U
   0x1c  , //22 V
   0x2a  , //23 W  o
   0x64  , //24 X

   0x6e  , //25 Y
   0x5b  , //26 Z　combined use "2"
   0x4f  , //27 [  --> "3"
   0x66  , //28 \  --> "4"
   0x27  , //29 ]  --> "7"
   0x7f  , //26 ^  --> "8"
   0x08    //31 _
};

int ii; //ループカウンター
#define s60()   for(ii=0;ii<60;ii++)wait_us(1000*1000);

int main() {

    spi.format(8,0);
    spi.frequency(1000000);

    en=0;    

    //0分
    spi.write(0);spi.write(0);spi.write(0);
    spi.write(seg['O'-64]);en=1;en=0;
    s60();

    //1分
    spi.write(0);spi.write(0);spi.write(0);
    spi.write(seg['I'-64]);en=1;en=0;
    s60();

    //2分
    spi.write(0);spi.write(0);spi.write(0);
    spi.write(seg['Z'-64]);en=1;en=0;
    s60();

    //3分
    spi.write(0);spi.write(0);spi.write(0);
    spi.write(seg['['-64]);en=1;en=0;

    while(1){} //無限ループ

}//main





```
Railsのdevice_token_authでArgumentError in DeviseTokenAuth::ConfirmationsController#show

# はじめに

この記事は2022年2月にまとめていた「細かいつまずいたことをメモしておく(2月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

device_token_authのShowアクションにアクセスしたところ以下のエラーが発生した

```
ArgumentError in DeviseTokenAuth::ConfirmationsController#show
```

そのようなルートはないというエラーだった

# 解決方法

`/view/devise/mailer/confirmation_instructinos.html.erb`を以下に変更すると治った

```erb:/view/devise/mailer/confirmation_instructinos.html.erb
<p><%= t(:welcome).capitalize + ' ' + @email %>!</p>

<p><%= t '.instruction' %> </p>

<%=# 下記の様に書かれているはずなので %>
<%# <p><%= link_to t('.action'), confirmation_url(@resource, {confirmation_token: @token, config: message['client-config'].to_s}).html_safe</p> %> %>

<%=# こちらにいれかえる %>
<%=# redirect_url: message['redirect-url'] が最後にたされている %>
<p><%= link_to t('.action'), confirmation_url(@resource, {confirmation_token: @token, config: message['client-config'].to_s, redirect_url: message['redirect-url']}).html_safe %></p>
```

# 参考
https://qiita.com/mtoyopet/items/076b623ac72f4f83c5f6

https://github.com/lynndylanhurley/devise_token_auth/issues/339
DjangoでModuleNotFoundError→urls.pyの書き方誤りだった

## ModuleNotFoundError: No module named 'sample_app/urls'

python manage.py runserver
を実行し、下記エラー。
```
ModuleNotFoundError: No module named 'sample_app/urls'
```

### 原因
urls.pyで、
```
path('sample_app/', include('sample_app/urls')),
```
ではなく、
```
path('sample_app/', include('sample_app.urls')),
```
が正しかった。

こんなつまらないミスに気づけず、プロジェクトを削除して作成し直すなどして時間を使ってしまいました。。
Windows で python に netifaces をインストールする

# pythonのnetifacesで何をする？
python3 の netifaces でネットワークインタフェースの情報を取得できるようにします。

# python3のインストール
## Visual Studio でインストールの場合
ツールと機能を取得でチェックしてインストールしてください。
自動でインストールされます。プログラムのアンインストールまたは変更に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729656/7811572e-25ed-a812-f86e-b3d58a0d4b2d.png)

インストールしたパスと、その下のScriptsを環境変数に追加します。
```
C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python39_64
C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python39_64\Scripts
```
この時、注意することは、下記より上にすることです。ダミーの python.exe が実行されてしまうのです。もし、インストールしていないと、 python.exe を実行すると、Microsoft Storeが立ち上がります。
```
%USERPROFILE%\AppData\Local\Microsoft\WindowsApps
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729656/d79bf105-ac8f-c8ba-18a1-e28d89fbdf94.png)



## インストーラでインストールの場合
インストーラをダウンロードしインストールしてください。
python-3.10.6-amd64.exe(2022/08/20 現在)

同様にインストールしたパスと、その下のScriptsを環境変数に追加します。

```
%USERPROFILE%\AppData\Local\Programs\Python\Python310\
%USERPROFILE%\AppData\Local\Programs\Python\Python310\Scripts\
```

# netifaces をインストール
## pythonでpipをアップデートする

下記コマンドを実行し pip をアップグレードします。
`
python.exe -m pip install --upgrade pip
`
## netifaces をインストールする
下記コマンドを実行し netifaces をインストールします。
`
pip install netifaces
`
コピペで練習 git コミットとプッシュ

````
# コミット
# ファイルの追加・変更
touch test.txt
mkdir test
touch test/test.txt
sed -i -e 's/パノラマ</パノラマ test</g' views/index.php
git status
git diff
git add .
git status
git commit -m "test commit"


# リモートリポジトリの確認とプッシュ
git remote -v
git push -f origin main
git push -f origin test

# コミットログのメールアドレス変更方法
git log
git log --all --pretty=full --graph
git checkout remotes/origin/HEAD
git checkout remotes/origin/main
git checkout origin/main
git branch -a
git filter-branch -f --env-filter 'export GIT_AUTHOR_EMAIL=""'
git filter-branch -f --env-filter 'export GIT_COMMITTER_EMAIL=""'

````
Arduino UNO,STM32L010等SPIのいろいろ「まとめ」


x 超超重要 なぜか秋月STM32G031J6M6がうり切れていた。注意!!(2022/8/27現在)

リンク集

1 08/20 STM32G031と秋月シリアル7セグで3分タイマー SPI

https://qiita.com/caa45040/items/5b3b4af900f8971ab5e4

19 07/04 ArduinoUNOとDS1307で時計 秋月シリアル7セグに出力 (SPI)(Arduino)

https://qiita.com/caa45040/items/8a36d3f13500d55a9e94

19 07/01 ArduinoUNOとMCP9701で温度を秋月シリアル7セグに出力 (SPI)(Arduino) 

https://qiita.com/caa45040/items/8de70c9da511e1084ed1

19 07/01 STM32F767とMCP9701で温度を秋月シリアル7セグに出力 (SPI)(STM32)

https://qiita.com/caa45040/items/33cc73b9292c325afc52

20 06/24 Arduino UNOと秋月シリアル7セグで3分タイマー SPI

https://qiita.com/caa45040/items/16b3146a63d4ff2ad400

20 06/24 STM32F103C8と秋月シリアル7セグで3分タイマー SPI

https://qiita.com/caa45040/items/3c6f65d3c7a6ac3ec3ab

20 06/24 STM32F303K8と秋月シリアル7セグで3分タイマー SPI

https://qiita.com/caa45040/items/952ca9576aa68dc94826

20 06/24 STM32F767と秋月シリアル7セグで3分タイマー SPI

https://qiita.com/caa45040/items/ba4153053c48415e3d3c

22 06/05 STM32L010のSPIの速度を変える。

https://qiita.com/caa45040/items/d4da4f6d2427bfbe16c7

22 06/02 STM32L010でSPIを使いEEPROM AT93C46を読み出す。

https://qiita.com/caa45040/items/dc6d8b11feda35752f0d

22 06/02 STM32F767でSPIを使いEEPROM AT93C46を読み出す。

https://qiita.com/caa45040/items/3ac4ba25ad208ab09602

23 05/18 STM32L010と秋月シリアル7セグで3分タイマー SPI

https://qiita.com/caa45040/items/141a6131adc3e7f92ddc
[Laravel]Carbonで週の初めを取得する

# はじめに
今回は、Carbonの基本について調べたので、備忘録として残しておきます。
基本的な使い方について説明した後、タイトルのコードをご紹介します。

# 環境
- Laravel：8.83.4

# 1. Carbonとは

https://carbon.nesbot.com/docs/

PHPのDateTimeクラスを拡張したパッケージのことです。phpでそのまま日付や時刻を扱うよりも直感的かつシンプルに操作することができます。
Laravelには標準でインストールされています。

# 2. 基本的な使い方
### 2-1. インスタンスを取得する
newで作ると、現在の日付のインスタンスができます。
```php
$cb = Carbon::now();
echo $cb; //　2022-08-03 20:00:30
```
### 2-2. 日時データを取得する
インスタンスから年月日や時分秒を取得するには下記のように書きます。
```php
$cb = new Carbon(); // 2022-08-03 20:00:30

// 年
echo $cb->year; // 2022

// 月
echo $cb->month; // 8

// 日
echo $cb->day; // 3

// 時
echo $cb->hour; // 20

// 分
echo $cb->minute; // 00

// 秒
echo $cb->second; // 30
```
### 2-3. 日付を判定する
```php
$cb = new Carbon();

// 今日かどうか 
echo $dt->isToday(); // true 

// 明日かどうか 
echo $dt->isTomorrow(); // false 
  
// 昨日かどうか 
echo $dt->isYesterday(); // false 
```

### 2-3. 日付を比較する
```php
$cb1 = new Carbon('2022-08-03');
$cb2 = new Carbon('2022-08-05');

// より大きい
echo $cb1->gt($cb2); // false

// 以上
echo $cb1->gte($cb2); // false

// 未満
echo $cb1->lt($cb2); // true

// 以下
echo $cb1->lte($cb2); // true
```
Carbonにはこれ以外にもたくさん日付を操作するものがありますので必要に応じて調べてみて下さい。
# 3. やりたかったこと
「2022-08-03」の書式で、週の初めの日付を取得する。
```php
$cb1 = new Carbon();
echo $cb1->startOfWeek()->toDateString();
```
以上で実装完了です。
調べた以外にも様々な日付操作が簡単に行えそうだったので、うまく活用して効率よく開発を進めていきたいと思います。

# 4. 参考文献

https://carbon.nesbot.com/docs/
「球面上の円（Circle of a sphere）」について調べてみた。

wikipediaの日本語版にありませんでした。英語から翻訳-

https://www.google.com/search?q=%E7%90%83%E9%9D%A2%E4%B8%8A%E3%81%AE%E5%86%86&oq=&aqs=chrome.2.35i39i362l15.-1j0j7&client=ms-android-huawei&sourceid=chrome-mobile&ie=UTF-8


オリジナル

https://en.m.wikipedia.org/wiki/Circle_of_a_sphere

https://en.m.wikipedia.org/wiki/Sphere

https://ja.wikipedia.org/wiki/%E7%90%83%E9%9D%A2

# わかった事


球面（きゅうめん、英: sphere[注釈 1]）と完全球体 (ball)は、意味が違うということ。
すみません。リンクタブばかりで、私の中身がありませんでした。

# sympyで
勉強中。近日?公開予定。






# 参考
Line-sphere intersection＜

https://en.m.wikipedia.org/wiki/Line%E2%80%93sphere_intersection

Sphere-plane intersection＜

https://en.m.wikipedia.org/wiki/Circle_of_a_sphere#Sphere-plane_intersection

日本語版で。



https://ja.m.wikipedia.org/wiki/%E5%A4%A7%E5%86%86

https://en.wikipedia.org/wiki/Great_circle

以上deeplで。

# 以下もdeeplで。「入試問題」より抜粋
DeepL翻訳日本語→英語
「ベクトルがなかなかできるようにならなくて…」
I'm having a hard time getting the vectors right..."

DeepL翻訳英語→日本語
ベクトルがうまくいかないんです..."
別の訳語一覧：
ベクトルがうまくいかず..."
ベクトルがうまくいかない..."

**全文翻訳がおすすめです。**

 "I can't seem to get good at vector calculations..." 

# 入試問題

https://mathmathmass.exblog.jp/32162564/
WebブラウザでPostgreSQLに触れてみる

# PostgreSQLとは

原子性、整合性、独立性、耐久性 (ACID)プロパティを持つトランザクション、自動更新可能なビュー、マテリアライズドビュー、トリガ、外部キー、ストアドプロシージャを特徴とするRDBMSである。([Wikipedia](https://ja.wikipedia.org/wiki/PostgreSQL)より)

# Crunchy Dataとは

PostgreSQLの商用サービスを提供しているアメリカの会社

# Crunchy DataがWebAssembly化したPostgreSQLをWebブラウザ上で実際に動かしながら学べる[Postgres playground](https://www.crunchydata.com/developers/tutorials)を公開した

# 実際に触れてみる

画面左側に機能の説明があって、右側にターミナルが表示される
チュートリアルごとにサンプルのテーブルとデータが用意されていて、簡単なクエリを打つぐらいならすぐできる
CREATE TABLEもできるので、ある程度好き勝手に触れる
だけど、なぜか<strong>ターミナル部分にペーストができない</strong>
なので、どんなに長いクエリでも打ち込むしかない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625409/5258e8da-772b-4648-9e28-bf6f7c411d0c.png)
Cygwin をセットアップ

昔なつかし Cygwin.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/da7271a7-19ad-6905-c0fa-f1e8cb753656.png)

今も同じように使えるのかな? 改めてインストール。

# 環境

- Microsoft Windows 10 Pro 21H2

インストール日 2022/08/20

# 32bit? 64bit?

以前は 32bit しかなかったけれども、今は 64 bit を使うようになっているらしい。

> You have been warned. If you're still sure you really need a 32 bit Cygwin, and there's absolutely no way around it, you may run the setup-x86.exe installer. The signature can be used to verify the validity of this binary.

# インストール

https://cygwin.com/install.html からダウンロード。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/85d2a872-0370-0d9b-57a9-39ff43ec22e2.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/23a265a2-7d07-23f8-20ca-6adbccee43d2.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f2d001f5-cc23-c79b-5f2e-d630bd8461a3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/78034c34-5ec4-cf8e-067f-69e9f391cb2f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/7efde7eb-92c1-d744-3cb6-d4562eec6fe1.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d9f2ad98-e971-b01e-42be-0a5ba7576f56.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/dc898cd0-53f5-d14b-fc89-ebe113d1abf2.png)


# 動作確認

```
$ uname -a
CYGWIN_NT-10.0-19044 WinTest-PC 3.3.5-341.x86_64 2022-05-13 12:27 UTC x86_64 Cygwin

$ cygcheck -c cygwin
Cygwin Package Information
Package              Version        Status
cygwin               3.3.5-1        OK

```

# apt-cyg を使えるようにする

apt-cyg は現在は以下のものが使えるようだ。
https://github.com/kou1okada/apt-cyg

以下のものに依存している
- wget
- ca-certificates
- gnupg
- libiconv

このうち、wget は初期状態で使える。他の3つを setup.exe を使ってインストールしておく。

https://github.com/kou1okada/apt-cyg#upgrade-apt-cyg
には以下のようにしてセットアップするように記述されている。

```
git clone https://github.com/kou1okada/apt-cyg.git
ln -s "$(realpath apt-cyg/apt-cyg)" /usr/local/bin/
```


git の代わりに以下のようにした。

```
$ wget https://raw.githubusercontent.com/kou1okada/apt-cyg/master/apt-cyg
$ chmod 755 apt-cyg
$ mv apt-cyg /usr/local/bin/
```

一度ミラーを国内に設定して覚え込ませます。
```
$ apt-cyg -m https://ftp.iij.ad.jp/pub/cygwin/ update
```
ミラーは以下から選びました。

https://raw.githubusercontent.com/kou1okada/apt-cyg/master/apt-cyg

# 開発環境をインストールする

```
$ apt-cyg install vim git
```

としてインストールに問題がなければ、build-essencial 相当の以下をインストールします。

- gcc-core
- gcc-g++
- make
- automake
PythonでPostgreSQLを操作する部分をライブラリ化してみた

# 初めに
今までにPostgresを操作するために必要なものはライブラリとして作ってしまった方が楽だなと思いライブラリにしてみました。基本的な機能は以前書いた[flask](https://qiita.com/kihara-takahiro/items/603845712a59c2e671ea)のラッピングをしている中で作成したDB用の部分をライブラリにしたものになります。

https://github.com/KiharaTakahiro/pgsupporter

# インストール
```
pip install  git+https://github.com/KiharaTakahiro/pgsupporter.git
```
# 簡単な使い方
psycopg2を使用しているのでQueryの書き方等は基本的に同じです
```python
from pgsupporter import start_transaction, DbConnecter

connector = DbConnecter("DB名","ホスト名", "ユーザ名", "パスワード")
# 参照系
with start_transaction(connector=connector) as tx:
  sql = "SQL文"
  values = [] # パラメタを指定する場合は引数が必要
  # 1件取得 
  result = tx.find_one(sql, values)
  # 全件取得
  result = tx.find_all(sql, values)
  print(result)

# 更新系 readonlyではないのでFalseを指定するのがポイントです
with start_transaction(False, connector=connector) as tx:
  sql = "SQL文"
  values = [] # パラメタを指定する場合は引数が必要
  tx.save(sql, values)

```
# クエリビルダ使用
下記のように使用することでクエリビルダも使用できます。
```python
from pgsupporter import start_transaction, DbConnecter, QueryBuilder

with start_transaction(connector=connector) as tx:
  query_result = QueryBuilder(tx=tx)table('{テーブル名}').where('{フィールド名}', '=', 2).or_where('{フィールド名2}', '=', 3).select()
  print(query_result)
```
クエリビルダのその他の細かな使い方は下記と同じのため興味があればご参照ください。

https://qiita.com/kihara-takahiro/items/603845712a59c2e671ea

# 終わりに
どちらかといえば今回はライブラリとして提供することを試してみるためにやってみましたが、せっかく簡単に使えるようにしたのでこのような紹介をさせていただきました。
今まで作ったものを細かくライブラリにして使いやすくするのは結構いいなと思い始めてきたので徐々にライブラリ化していこうと思います。
QGISでPluginを作るのに役立ったページ集

## ブックマークを忘れないように保存！
### Editor
 [Git for Windows](https://git-scm.com/download/win)
 　VS-CodeとGitHUBを連携するのに必要
 [VS-code](https://code.visualstudio.com/download)
　拡張機能
　・Japanese Language Pack for Visual Studio Code
　・Markdown All in One
　・スペースを表示しないとマークダウンで分かりにくいので表示へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2015118/aad56a52-1da2-efbf-1bbe-958a5d68e6b8.png)

### QGIS Python API  
　このサイトがなければ先に進まないといってもいい重要なサイト
　https://qgis.org/pyqgis/3.14/ 
### PyQGIS 開発者用 Cookbook
　参考になる　最初に見るべきサイト 
　https://docs.qgis.org/3.10/ja/docs/pyqgis_developer_cookbook/index.html  
### 関数
　かゆいところに手が届いてました（私と思考回路が同じか？）
　https://slhistory.at.webry.info/202112/article_4.html
### 使い方がわからないとき
　サンプルサイト  
　https://python.hotexamples.com/jp/  
　Q&Aサイト　よくヒットします！
　https://gis.stackexchange.com/questions
### 公開
　公開するサイト、似たプラグインがあると指導が入ります。
　https://plugins.qgis.org/plugins/
TrailheadのハンズオンChallengeで気をつける4つのポイント

こんにちは
本橋孝昭です

皆さんはTraiheadをご存じでしょうか？

TrailheadはSalesforceが提供している無料で学べるオンラインツールです
Salesforce のことをはじめ、様々なことがゲーム感覚で楽しく学べます

興味がある方はぜひ↓からご確認ください

Trailhead
https://trailhead.salesforce.com/ja



さて、このTrailheadですが、ハンズオンChallengeで気をつける4つのポイントがございます。

TrailheadのハンズオンChallengeで気をつける4つのポイントを４つご説明します


なお、こちらの内容はYou Tubeにも公開しています
https://www.youtube.com/watch?v=EQutsi039vM

<iframe width="560" height="315" src="https://www.youtube.com/embed/EQutsi039vM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>




### 1.組織とユーザの地域・言語設定を「英語」にしましょう
Playgroundの組織を英語に切り替えないとハンズオンChallengeがクリアできない場合があります。
もしも正しい設定をしてもクリアできない場合、設定を英語にして再度実行しましょう

設定変更箇所は２か所あります。
１つは組織情報からです。
組織情報の地域のデフォルト値を英語にしましょう
組織情報の言語のデフォルト値も英語にしましょう

もう１つはユーザの設定です。
こちらは右上部分の「設定」をクリックしましょう
そして
「言語とタイムゾーン」から、地域を英語にして、言語も英語にしましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/589bef62-566e-6c1a-2a97-b55093f34c9c.png)




###  2.Trailheadの環境を英語にしましょう
Trailheadを日本語で解こうとしてもクリアできない場合がございます。
その場合、Trailheadの言語を英語に切り替えれば、クリアのヒントが見つかるかもしれません。
例として、こちらのチャレンジ
「AppExchange を使用したレポート戦略の拡張」
https://trailhead.salesforce.com/ja/content/learn/modules/lex_implementation_reports_dashboards/lex_implementation_reports_dashboards_appexchange」
は日本語では「千代田区」となっています。
しかし、英語に切り替えると「San Francisco」と記載されています。そして実際に「千代田区」ではなく「San Francisco」と設定しないとクリアできません

言語設定は右下から変更することが可能です。
もしも正しい設定をしてもなかなかクリアできない場合、言語を英語に切り替えれば、クリアのヒントが見つかるかもしれません。

###  3.モジュールごとにPlaygroundを作成しましょう
１つのPlaygroundを使いまわしハンズオンChallengeを何個もクリアすると、
以前のハンズオンChallengeの設定変更が残っていることが原因で、クリアできない場合があります。
そのため、１つのモジュールがクリアしたらPlaygroundを使いまわすのではなく、新規playgroundを作成することをおすすめします


### 4,選択したPlaygroundが正しいか確認して実行しましょう
意外とやってしまうのがこれです。
複数のPlaygroundを作成してしまうと、今どのPlaygroundで設定したか分からなくなることがあります。
Playground名を変更したりして確認しやすくしましょう。
そして実行前にどのPlaygroundを選択しているか確認しましょう



##  本日の内容をまとめます

TrailheadのハンズオンChallengeで気をつける4つのポイント
1.組織とユーザの地域・言語設定を「英語」にしましょう
2.Trailheadの環境を英語にしましょう
3.モジュールごとにPlaygroundを作成しましょう
4.選択したPlaygroundが正しいか確認して実行しましょう

ぜひ皆様も、このTrailheadを学習するうえで気をつけるポイントを確認し、楽しく元気にSalesforceを学びましょう
ESP32 / Arduino でDHCPでIPを取得後にDNSサーバを変更する方法

# ESP32 / Arduino でDHCPでIPを取得後にDNSサーバを変更する方法

ESP32/Arduinoで、DHCPでIPを取得しつつ、DNSサーバのみ独自に設定したいことがあり、その方法を試行錯誤しました。

## 結論
lwip/dns.h をincludeし、DHCPでWIFIに接続した後に、set_dnsserver()で設定できました。

```setdns.cpp
#include "lwip/dns.h"
...
void setup()
{
  WiFi.begin("XXXX", "YYYY");
  while (WiFi.status() != WL_CONNECTED) delay(1000);
  ip_addr_t dnsserver = IPADDR4_INIT_BYTES(8,8,8,8);  // googleのDNSサーバを使う
  dns_setserver(0,&dnsserver);
  ...

```

現在設定されているDNSサーバ設定は使いつつ、リストの最後に追加する場合
```setdns.cpp
#include "lwip/dns.h"
...
void setup()
{
  WiFi.begin("XXXX", "YYYY");
  while (WiFi.status() != WL_CONNECTED) delay(1000);
  for(int i=0;i<DNS_MAX_SERVERS;i++){
    if(WiFi.dnsIP(i)==IPAddress(0,0,0,0)){
      ip_addr_t dnsserver = IPADDR4_INIT_BYTES(8,8,8,8);
      dns_setserver(i,&dnsserver);
      break;
    }
  }
  ...
```
日付軸の折れ線をプロットする際、値の型が`datetime.date`だと描画されないときがある

# 環境
* Python3.10.2
* bokeh 2.4.3


# やりたいこと
X軸が日付である折れ線グラフを作成したいです。
以下を参考にして、折れ線を描画しました。

https://docs.bokeh.org/en/2.4.3/docs/first_steps/first_steps_4.html?#enabling-datetime-axes

```python
dates = [datetime.datetime(2022, 8, 1), datetime.datetime(2022, 8, 2)]
sales = [100, 200]
plot = figure(x_axis_type="datetime")
plot.line(x=dates, y=sales)
show(plot)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/aecb43ab-2904-2581-c0eb-cfdaa4375fc8.png)

# ハマったこと
`dates`の要素の型が`datetime.datetime`でなく`datetime.date`の場合、折れ線は描画されませんでした。
ブラウザのコンソールには、`[bokeh] could not set initial ranges`というログが出力されました。

```python
dates = [datetime.date(2022, 8, 1), datetime.date(2022, 8, 2)]
sales = [100, 200]
plot = figure(x_axis_type="datetime")
plot.line(x=dates, y=sales)
show(plot)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/dfe99ac6-6a89-5aba-18eb-ec3fc2662f3b.png)

`figure(x_axis_type="datetime")`と指定しているので、`datetime.datetime`でないといけないのは理解できます。
しかし、`dates`の型が`list`でなく`numpy.ndarray`ならば、`dates`の要素の型が`datetime.date`でも折れ線が描画されました。

```python
dates = numpy.array([datetime.date(2022, 8, 1), datetime.date(2022, 8, 2)])
sales = [100, 200]
plot = figure(x_axis_type="datetime")
plot.line(x=dates, y=sales)
show(plot)
```

bokehの内部で`datetime.date`を`datetime.datetime`に変換しているのでしょうか？
もともと私は`numpy.ndarray`の変数を渡して日付の折れ線を描画していたので、`datetime.date`型が原因であることになかなか気づけませんでした。
Raspberry Pi 3B上でGstreamer経由の音声がうまく扱えなかった件

# 1. 概要
Raspberry Pi 3BでGstreamer、WebRTCを使った色々なことをしているとき、マイクの音声を一緒に扱えないの？という話題が出たので試したり、失敗したときの記録。

# 2. 使用機器
* Raspberry Pi Zero WH
OSはBuster(Debian 10)
* UVCカメラ: Buffalo BSW500M
* 適当なイヤホン
* マイクは手持ちがなかった(内蔵音源でごまかし)

# 3. 実験
話を持ち出した人いわく、Gstreamerで音は出なかったそうだ。

# 3.1. まずは試す
カメラの映像をRaspberry Pi 3Bで確認してみる。
サンプルデータ（カラーバー）を表示。VNC Viewer上である、SSHで接続したターミナルでやっても出ないので注意。
テスト映像「videotestsrc」が表示される。Gstreamerは正常動作していることがわかった。
```
gst-launch-1.0 videotestsrc ! autovideosink
```

次に音声版の「autoaudiosink」で試してみるが、イヤホンから音が聞こえてこない。単純には動かないようだ。
```
gst-launch-1.0 audiotestsrc ! autoaudiosink
```

## 3.2. そもそも音は出るのか？
実は音声出力ができない状態かもしれないので、音声テストとしてGstreamer以外を試してみる。

出た。イヤホンでピー音聞こえている。
```
speaker-test -t sine -f 600
```

これも出る。OSインストール時に勝手に入ったサンプル音源のようだ。
```
aplay -Dhw:1,0 /usr/share/sounds/alsa/Front_Center.wav
```

## 3.3 ハードウェア確認
いまさらだけど、音関係のデバイス確認。存在するし、認識もされている。
イヤホンだと1番ということになる。

```
pi@raspberrypi:~ $ aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: b1 [bcm2835 HDMI 1], デバイス 0: bcm2835 HDMI 1 [bcm2835 HDMI 1]
  サブデバイス: 4/4
  サブデバイス #0: subdevice #0
  サブデバイス #1: subdevice #1
  サブデバイス #2: subdevice #2
  サブデバイス #3: subdevice #3
カード 1: Headphones [bcm2835 Headphones], デバイス 0: bcm2835 Headphones [bcm2835 Headphones]
  サブデバイス: 4/4
  サブデバイス #0: subdevice #0
  サブデバイス #1: subdevice #1
  サブデバイス #2: subdevice #2
  サブデバイス #3: subdevice #3
```

# 4. ALSA
Gstreamer, Raspberry, audioあたりで調べていると、alsaが良く出てくる。
ということは、AudioはALSA(alsasink)で扱わないとダメっぽい？ 「autoaudiosink」はオートではないのか？
Raspberry Pi OSのせいなのか、Gstreamerのせいなのか分からない。

## 4.1 改めて実験
ピー音というかポー音というかとにかく聞こえた。
```
gst-launch-1.0 audiotestsrc ! alsasink
```

デバイス指定しても聞こえる。0にすると繋いでないHDMI側にでるらしく聞こえない。
```
gst-launch-1.0 audiotestsrc ! alsasink device=hw:1
```
.Net 6: DataSet の使い方

こちらのプログラムを DataSet を使うように書き換えました。
[.Net 6: C# で PostgreSQL の Read](https://qiita.com/ekzemplaro/items/5f416b136fbc2c9c1998)

```cs:Program.cs
// ----------------------------------------------------------------
/*
	Program.cs

					Aug/20/2022

*/
// ----------------------------------------------------------------
using System;
using System.Data;
using Npgsql;

// ----------------------------------------------------------------
public static class postgres_read
{
// ----------------------------------------------------------------
public static void Main (string[] args)
{
	Console.WriteLine ("*** 開始 ***");
	string server="localhost";
	string str_db="city";

	string user="scott";
	string password="tiger123";

	string str_connect = "Host=" + server + ";Username="
		+ user + ";Password="
		+ password + ";Database=" + str_db + ";";

	NpgsqlConnection conn = new NpgsqlConnection(str_connect);
	
	NpgsqlCommand cmd = new NpgsqlCommand("SELECT * FROM cities", conn);

	NpgsqlDataAdapter adapter = new NpgsqlDataAdapter(cmd);

	DataSet dsx = new DataSet();
	adapter.Fill(dsx);

	Console.WriteLine(dsx.Tables[0].Rows.Count);

	for (int it=0; it< dsx.Tables[0].Rows.Count; it++)
		{
		var Row = dsx.Tables[0].Rows[it];

		string out_str = "";
		out_str += Row[0] + "\t";
		out_str += Row[1] + "\t";
		out_str += Row[2] + "\t";
		out_str += Row[3];

		Console.WriteLine(out_str);
		}

	Console.WriteLine ("*** 終了 ***");
}

// ----------------------------------------------------------------
}
// ----------------------------------------------------------------
```

次のバージョンで確認しました。

```text
$ dotnet --version
6.0.400
```
PHP oci_connect で AWS（RDS） oracleDBへ接続方法

# AWS RDS へ接続。

## お使いのDBの値へ入れ替えてください。

#### コード
```php:index.php

// エラーを出力する
ini_set('display_errors', "On");

$conn = oci_connect('ユーザー名','パスワード','orcl-03.cbmsqs9alrus.ap-northeast-1.rds.amazonaws.com/orcl','AL32UTF8');

if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}else{
    echo "接続完了！";
}

?>



```
git 初期設定おすすめ



git init
↑複数回NG
git config --global user.name "githubのユーザ名"
git config --global user.email githubに登録したメアド

------ここからは意味もわからず使わないこと------
git config --global merge.ff false
→マージのときにファストフォワード起こらない
git config --global pull.rebase merges
→プルのときにリベースする
git config --list
→設定確認
【サイバー攻撃】ポートスキャンとは

# ポートスキャンの概要
サーバーに対して攻撃を仕掛ける時にはセキュリティの弱いところを狙う必要があります。
そのようなときに、ターゲットのサーバーはどのポートを開けているかを確認することで攻撃の足がかりを見つけます。
ターゲットのサーバーの空いているポートを取得することをポートスキャンと言います。
これ自体が攻撃というよりも、攻撃をするための準備的なものだと思います。

### ポート
ポートは0~65535番まで存在していて、よく使われるものには`22番:ssh接続`、`80番:http通信`、`443番:https通信`などがあります。

ポートについて知らないかたはこちらを！

https://www.cman.jp/network/term/port/


# ポートスキャンの具体例
ポートスキャンをするにはnmapというツールが使用されるようです。ここでは説明を割愛します。
nmapというツールを使うことでWebサーバーのソフトウェアが何か、バージョンは何かということまでわかってしまうので、そのバージョンの脆弱性をついた攻撃をされてしまいます。

ポートスキャンにはいくつかの方法があり、ここではTCPスキャンとUDPスキャンを紹介します。

## TCPスキャン
TCPスキャンを理解するためにまず、TCP通信を簡単に紹介します。

### TCP通信
TCPでは通信を始める前に以下の3ステップで、相手と通信可能かどうかを確かめます。
**①通信したい相手のサーバーにSYNパケットを送信(通信してもいい？)**
**②相手のサーバーからSYN/ACKパケットが返ってくる(いいよー！)**
**③ACKパケットを送り返す(ほんじゃ通信するね！)**

このように相手と通信できるかどうかを確認することを``スリーウェイハンドシェイク``といいます。

### TCP通信を用いたポートが空いているかの判別方法
TCP通信ではスリーウェイハンドシェイクを行うので、こちらから特定のポートにSYNパケットを送り相手からSYN/ACKパケットが返ってきた時点でポートが空いているということがわかります。
ここまでで、ポートが開いているかどうかがわかるためACKパケットは送る必要がありません。加えて、もしACKパケットを送り返してしまうと相手のサーバーにログとしてやりとりが残ってしまいます。
攻撃者にとってそれは都合が悪いので、ACKパケットの代わりにRSTパケットを送ります。こうすることで相手のサーバーにログを残すことなく開いているポートを調べることができます。

## UDPスキャン
こちらも同じく、まずはUDP通信について軽く紹介します。

## UDP通信
TCP通信では相手としっかり通信ができるかを確認してから通信を開始していました。それに対してUDPは相手に届いているかどうかは確認しません。とにかくこちらから相手に向かって送ります。

相手に届いているか確認した方がいいじゃないかとも思いますが、TCPのようにいちいち確認をしているとスピードが落ちます。多少データが届いていない部分があってもいいからとにかく送るという時にはUDP通信を使います。

音声や動画ではUDPが使われているそうです。
確かにビデオ通話とかでは所々通信が悪くて途切れ途切れになることがありますもんね。

## UDP通信を用いたポートが空いているかの判別方法
UDP通信では一方的に相手にデータを送るので、相手のサーバーから返信は返ってきません。
ただし、相手のサーバーの閉じているポートに通信を行おうとするとエラーが返ってくるので、これを用いてポートが開いているかを判断します。

**つまり、UDP通信を行なってエラーが返って来なければポートが空いているということか！**

となりそうなんですが、そうでもないみたいです。
相手のサーバーの設定で、もし開けていないポートに対して通信があってもエラーを返さないようにする。ということもできるみたいです。

つまり、エラーが返ってこない場合は
**①ポートが開いていてエラーが返ってこない**
**②ポートが閉じているが設定でエラーが返らないようになっている**
という2パターンがあるので、ポートが空いているかどうかは確実にはわからないみたいです。

# 対策
### 不要なポートは閉じる
使用していないポートが不用意に開いていると攻撃の対象になってしまう可能性があるので、使っていないポートは閉じておきます。

### IDS/IPSを導入
IDSやIPSはパケットの中身をチェックして攻撃と思われるものが送られてきた時には管理者に通知したり、遮断したりできるものです。

### WAFの導入
WebサーバーやWebアプリケーションに特化した、ファイアーウォール。WAFを導入すると、IDS/IPSで検知できないものも防げたりするようです。

# おわりに
セキュリティ難しい！
以上です！！