OmniAICreator/Qiita-1.07M huggingface dataset:
空間図形「2021京都大学前期文系【４】」をsympyとFreeCADでやってみた。 

直方体のサイズ1x2x3

オリジナル

https://math.nakaken88.com/problem/kyoto-u-b-2021-4/

大学入試数学問題集成＞前期文系【4】

https://mathexamtest.web.fc2.com/2021/202110541/2021105410100mj.html#top-0105

# sympyだけで
(省略) 

# FreeCADのマクロで
![png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/c107fe9f-650f-ba61-59af-6be15c91cc94.png)
Pycharmを使わなくてもできました。FreeCADのmacroフォルダ内のファイルから、sympyをimportしています。
ワイヤーフレームです。サーフェスおよびソリッドを勉強中です。
エディタは、サクラエディタです。
```python
import FreeCAD
import Part
import Draft
import Mesh
#########################################################################################################
# 計算
from sympy import *
var('t tt')
def myPtoM(myPoint3D):
    return Matrix([myPoint3D.x,myPoint3D.y,myPoint3D.z])
def myMtoP(myMatrix):
    return Point3D(myMatrix[0],myMatrix[1],myMatrix[2])
def myCrosstoP(P1,P2):
    return myMtoP(myPtoM(P1).cross(myPtoM(P2)))
O=Point(0,0,0)
A=Point(1,0,0)
B=Point(1,2,0)
C=Point(0,2,0)
D=Point(0,0,3)
E=Point(1,0,3)
F=Point(1,2,3)
G=Point(0,2,3)
P=Point(1,0,t)
Q=Plane(O,P,F).intersection(Line3D(C,G))[0]
myGaiseki=myCrosstoP((P-O),(Q-O))
S2=myGaiseki.x**2+myGaiseki.y**2+myGaiseki.z**2
mySubs={t:solve(diff(S2,t),t)[0]}
P=Point(P.x.subs(mySubs),P.y.subs(mySubs),P.z.subs(mySubs))
Q=Point(Q.x.subs(mySubs),Q.y.subs(mySubs),Q.z.subs(mySubs))
print("#",P)
print("#",Q)
print("#",sqrt(S2.subs(mySubs)))
# Point3D(1, 0, 3/5)
# Point3D(0, 2, 12/5)
# 2*sqrt(70)/5
# #########################################################################################################
# 3D作図
def myXYZ2Txt(A):
    return '(' + str(A.x) + ',' + str(A.y) + ',' + str(A.z) + ')'
def myTxt_XYZ(A,myWedgei):
    P5x=float(A.x)
    P5y=float(A.y)
    P5z=float(A.z)
    p5 = FreeCAD.Vector(P5x, P5y, P5z)
    myText = Draft.makeText(myWedgei, p5)
    myText.Label = myWedgei
    FreeCADGui.ActiveDocument.ActiveObject.FontSize = '0.2 mm'
def myLine(A,B):
    Ax,Ay,Az=float(A.x),float(A.y),float(A.z)
    Bx,By,Bz=float(B.x),float(B.y),float(B.z)
    pl = FreeCAD.Placement()
    pl.Rotation.Q = (0.4247081540122249, 0.17592004639554645, 0.33985110062924484, 0.8204732460821097)
    pl.Base = FreeCAD.Vector(-3.9166066876399563, -2.1670824762243774, 1.7495260956243028)
    points = [FreeCAD.Vector(Ax,Ay,Az), FreeCAD.Vector(Bx,By,Bz)]
    line = Draft.make_wire(points, placement=pl, closed=False, face=True, support=None)
    Draft.autogroup(line)
myTxt_XYZ(O,"O"+myXYZ2Txt(O))
myTxt_XYZ(A,"A"+myXYZ2Txt(A))
myTxt_XYZ(B,"B"+myXYZ2Txt(B))
myTxt_XYZ(C,"C"+myXYZ2Txt(C))
myTxt_XYZ(D,"D"+myXYZ2Txt(D))
myTxt_XYZ(E,"E"+myXYZ2Txt(E))
myTxt_XYZ(F,"F"+myXYZ2Txt(F))
myTxt_XYZ(G,"G"+myXYZ2Txt(G))
myTxt_XYZ(P,"P"+myXYZ2Txt(P))
myTxt_XYZ(Q,"Q"+myXYZ2Txt(Q))
myLine(O,A)
myLine(A,B)
myLine(B,C)
myLine(C,O)
myLine(D,E)
myLine(E,F)
myLine(F,G)
myLine(G,D)
myLine(O,D)
myLine(A,E)
myLine(B,F)
myLine(C,G)
myLine(O,P)
myLine(P,F)
myLine(F,Q)
myLine(Q,O)
doc = App.activeDocument()
App.ActiveDocument.addObject("App::Origin", "Origin")
App.ActiveDocument.getObject('Origin').Visibility = True
App.ActiveDocument.recompute()
Gui.activeDocument().activeView().viewAxonometric()
Gui.SendMsgToActiveView("ViewFit")
```

# 参考
ext4 ディスクの空き領域を回復する 

EPGStation を使った録画システムのディスクがいっぱいになってしまったので、いらないファイルを削除してちょっと整理。

空いたかな? と思ったら・・・

```
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/sda3       7.3T  6.9T     0 100% /
...
```

Avail 0 のまま。何故かな?


# 環境

```
# cat /etc/issue
Ubuntu 20.04.4 LTS \n \l
```


# 予約ブロック

tune2fs で見てみると

```

$ sudo tune2fs -l /dev/sda3
tune2fs 1.45.5 (07-Jan-2020)
Filesystem volume name:   <none>
Last mounted on:          /
...
Filesystem OS type:       Linux
Inode count:              244174848
Block count:              1953374720
Reserved block count:     97668736
Free blocks:              96948076
Free inodes:              242932556
First block:              0
Block size:               4096
Fragment size:            4096
...
```

こちらでは
```

Free blocks:              96948076
```

となってますね。

これは Reserved block count が
```

Reserved block count:     97668736
```
とありますが、 
man tune2fs とすると、以下のような説明がありました。



> DESCRIPTION
       tune2fs allows the system administrator to adjust various tunable  file  system  parameters  on         Linux  ext2,  ext3, or ext4 file systems.  The current values of these options can be displayed         by using the -l option to tune2fs(8) program, or by using the dumpe2fs(8) program.


Reserved block は root の稼働環境をキープするために デフォルトでは5% 予約されているそうです。今使っているディスクは 8TBytes なので、400GBytes ぐらいですね。

さっきの作業では、
```
/dev/sda3       7.3T  6.9T     0 100% /
```
とありますが、おそらく利用可能として表示しているのは Reserved block を引いた値ということでしょうか。
Reserved block の割合を下げる方法もあるらしいですが、今回は設定はこのままで更に不要ディスクを整理して空き領域を広げます。
今までの作業ではちょうど400Gぐらい空けていたので、もうちょっとがんばればいいことになります。

その後、
「拡張子の異なる同じファイルを削除するワンライナー」
https://qiita.com/nanbuwks/items/7f09b7aaed9ae17c4c1e#comment-8b55ed21b6de59a66bce

などを行い無事 Avail が確保できました。
```
# df -h
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/sda3       7.3T  3.0T  3.9T  44% /
```

# 予約ブロックの割合を変更する


試しに、予約ブロックの割合を 5% から 3% に変更してみました。

```
# tune2fs -m 3 /dev/sda3
tune2fs 1.45.5 (07-Jan-2020)
Setting reserved blocks percentage to 3% (58601241 blocks)
```

すぐに終了。うまくいったかな?

```

# tune2fs -l /dev/sda3
tune2fs 1.45.5 (07-Jan-2020)
Filesystem volume name:   <none>
Last mounted on:          /
...
Filesystem OS type:       Linux
Inode count:              244174848
Block count:              1953374720
Reserved block count:     58601241
Free blocks:              738221457
Free inodes:              242933316
First block:              0
Block size:               4096
...
```
無事変更になったようです。
df の値も調べてみました。

```
# df -h
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/sda3       7.3T  3.0T  4.1T  43% /
...
```
予約ブロック分は
Size-Used-Avail=0.2T
となっていて、大体3%ぐらいになっているようです。
Unityで初めてのゲーム制作 1st Mission: 企画

### 1st Mission Start!!
# はじめに
未経験でゲーム会社に転職するため独学でUnityの学習を開始しました。
※希望職種はプログラマー（将来的にはプランナーも）。
ポートフォリオに掲載するゲームを作り始めたので、制作過程を備忘録的に記していきます。

### 筆者の能力
システムエンジニア（入社二年目）なのでプログラミングスキルはあり。
ゲーム制作は全くの未経験。
UnityのスキルはUdemyの初心者向け講座をいくつか見た程度。
3Dモデル作成やアニメーション制作の知識はなし。

# 企画
プログラマー志望とはいえゲームを作るなら企画書は必須なので、簡易的なものを作成します。
ゲーム自体も（言い訳だが）時間がないため簡易的なものです。

## 企画書

### 『Have nice 7 minutes.』

#### ジャンル
3Dアクションアドベンチャー

#### プラットフォーム

PC

#### プレイ人数

1人

#### ターゲット

ポートフォリオを閲覧する人

### コンセプト

7分間で最大限楽しんでもらう。
技術力を見てもらう。

#### 舞台

精神的原因で寝たきりになった彼女の精神世界。

#### 概要

精神世界に巣食う、彼女を寝たきりにした元凶を打ち倒す。
元凶を倒しにいく道中で、彼女にとって大切な思い出を集めて元凶を倒す力に変える。
精神世界に入れる制限時間は7分間。

#### ゲームプレイ

思い出を見つけるたびにアクションが増える。
思い出は「絵」となってフィールドに存在し、絵の前に行くとアクションを得られる。
思い出を探さず原因と闘うこともできるが、思い出を見つけた数だけ楽に勝てる。

#### UX
- 7分で完結できるスピード感
- 暖かい？ストーリー
- 新アクションを手に入れていく成長感

## 記事を読む人向けのその他詳細事項

#### 実装するアクション
- Move（移動）（ジョギングのみ）
- Sword（攻撃）（コンボ）
- Shield（防御）
- Accel（加速）
- Magic（魔法攻撃）
- Special（必殺技）

※余裕があれば
- Charge（溜め攻撃）（3段階）

#### 実装するモンスター

アセットのあるやつ4種類

#### ボス

アセットのあるやつ1種類

#### 思い出の絵
7枚
- キスシーン（Move取得）
- 無邪気に遊んでるシーン（Sword取得）
- デートシーン（Shield取得）
- ベッドシーン（Accel取得）
- 結婚式のシーン（Magic取得）
- 暗い部屋で泣いているシーン（なし）
- 手を差し伸べるシーン（Special取得）


---
この企画書を元に次からゲームを制作していきます。

### 1st Mission Cleared!!

Next Mission → [アセットインポート](https://qiita.com/homarinn/items/d17002ec3df094de6213)
AOSPのAndroidX開発環境メモ

AndroidXのリポジトリにあるサンプルとかを動かしたくなるときって時々ありますよね？(ない？)

ちょっと動かなかったところをメモしておいて、あとでまた環境作るときに役立てようかと思いました。
基本的な手順は3ステップです
1. repoをインストール
2. initしてsyncする
3. Android Studioを立ち上げる


基本はこの手順でうまく動きます。

https://android.googlesource.com/platform//frameworks/support/+/refs/heads/androidx-main/docs/onboarding.md


# 1. repoをインストール

repoは複数のgitリポジトリをいい感じにまとめて管理するコマンドです。(という認識)
ここに書いてある手順で動きます。
https://android.googlesource.com/platform//frameworks/support/+/refs/heads/androidx-main/docs/onboarding.md#setup-linux-mac
(repo syncなしで`https://android.googlesource.com/platform//frameworks/support`をgit cloneするだけでいけるんでは？と思って試したんですが、色々パスの参照などでめんどくさいので、syncしちゃうほうが楽そうでした。)

repoをpython3で動くようにする必要があるんですが、
fishのシェルを作っている方は以下のようにするとうまく動きます。

```:~/.config/fish/config.fish
function repo
  command python3 ~/bin/repo $argv
end
```

# 2. initしてsyncする

以下の手順がonboardingにあるのですが、おそらくGooglerの方しかうまく動かないと思うのですが、 (動く方法あったら教えて下さい)

```
mkdir androidx-main && cd androidx-main
repo init -u sso://android/platform/manifest \
    -b androidx-main --partial-clone --clone-filter=blob:limit=10M
repo sync -c -j8
```

以下のようにhttpsのURLを指定したらうまく動きました。

```
repo init -u https://android.googlesource.com/platform/manifest \
     -b androidx-main --partial-clone --clone-filter=blob:limit=10M
repo sync -c -j8
```

# 3. Android Studioを立ち上げる
普通にAndroid Studioを立ち上げてimport。。するの**ではなく**。
**frameworks/supportにあるstudiow**を動かします。 (そうしないと怒られる)
すると以下のようにどれでAndroid Studioをimportして起動するか聞かれるので、

```
./studiow 
Project subset is required
Usage: studiow [--clear-caches] [--clean] [--reinstall] [--profile] <project subset>

OPTIONS

 --clear-caches
   Clear generated caches (but not user settings) before launching

 --clean
   Clear (with backup) generated files (settings, caches, etc) before launching
   Also implies --clear-caches

 --reinstall
   Remove and re-download Studio itself. Also implies --clean

 --profile
   Enables profiling of Studio

Project subsets:
 m, main
  Open the project subset main: non-Compose Jetpack libraries

 c, compose
  Open the project subset compose

 ca, camera
  Open the project subset camera

 f, flan
  Open the project subset flan: Fragment, Lifecycle, Activity, and Navigation

 media
  Open the project subset media: Media, Media2, and MediaRouter

 kmp
  Open the project subset KMP: Projects that have KMP builds

 w, wear
  Open the project subset for Wear OS libraries

 g, glance
  Open the project subset for glance projects


 native
  Open the project subset for native projects

 a, all
  Open the project subset all
```

例えばComposeを見たいのであれば`./studiow c`で起動できます。

あとは自分が動かしたいデモなりテストなりをAndroid Studio内で走らせるだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/114cac16-54e6-7411-c22f-ca4699266055.png)
.gitignoreの使い方

# .gitignoreとは
Gitによる追跡の対象外となるファイルを書き込む設定ファイルのこと。  
.gitignoreにファイルを記述すれば、``git add``時にインデックスに追加されないようになる。  
記述は後に書いた除外設定が上書きをしていくので注意。


# 記述
```
# コメントアウトの記述可能

# 追跡しないファイルを指定
.gitignore
.env
.htaccess


# ディレクトリや、ディレクトリ内のファイルも指定可能
config/
config/file.html


# ワイルドカード、文字クラスも使用可能
.ht*
*.jpg
file_0[1-9].html


# 否定表現の!も使用可能
# 特定のファイルのみ追跡
!/only-track.html
!*.jpg
```


## 参照
- [.gitignore の書き方。ファイル/ディレクトリの除外](https://www-creators.com/archives/1662)
- [gitignoreを設定して無視するファイルを指定しよう](https://www.sejuku.net/blog/72389)
[Rails]複数キーワードで動的にLIKE句のOR検索をする方法

今回は実務で使う機会があったちょっとしたことについての記事です

## やりたいこと

```ruby
# keywords = ["hoge", "fuga", "piyo"]
Post.where("title LIKE ?", "%hoge%")
    .or(Post.where("title LIKE ?", "%fuga%"))
    .or(Post.where("title LIKE ?", "%piyo%"))
```

上記のように複数キーワードを渡したときに、いずれかのキーワードを含むPostを検索したい。

## やり方

先に結論を書きますと、以下のようなScopeを作って対応しました
```ruby
class Post < ApplicationRecord
  scope :by_keywords, lambda { |keywords|
    keywords.map { |keyword| where("content LIKE ?", "%#{keyword}%") }.reduce(:or)
  }
end

keywords = ["hoge", "fuga", "piyo"]
Post.by_keywords(keywords)
```

他に見かけたやり方だと、、、

```ruby
keywords = ["hoge", "fuga", "piyo"]
@posts = Post.none
keywords.each do |keyword|
  @posts = @posts.or(Post.where("content LIKE ?", "%#{keyword}%"))
end
return @posts
```

のようなeachで回すやり方です。`Post.none`をしたり、`@posts`に再代入が行われるのも違和感がありました。
reduceでorを繋げるなら1行でいけますし、当然1クエリで済むので個人的に気に入りました。
Raspberry Piでスマートロックをつくる

会社の研修の一環で「Raspberry Piを使ってなんか作りなさい！」と、Raspberry Pi 4 Model B と [Raspberry Piキット](https://docs.sunfounder.com/projects/davinci-kit/ja/latest/)を渡されたので、スマートロックを作りました。 
外からはスマホ操作で、中からはボタンを押して解錠・施錠を行います。

完成動画↓
<iframe width="560" height="500" src="https://www.youtube.com/embed/qCjIQEaw-as" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


各部品の説明↓
<img width="1000" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2858441/489559f5-e222-6d76-9a21-4d2667569536.png">


使用したもの
・Raspberry Pi 4 Model B 
・ブレッドボード
・GPIO拡張ボード
・サーボモーター：SG92R
・ボタン：Raspberry Piキットに付属のもの
・抵抗やジャンパ線
・Webiopi（ライブラリ）
<br>
思っていたよりもいいものができました。
余裕があれば解説記事も書いていこうかと思います。
【自分用メモ】goofysでAWSのS3バケットをAnsibleを使ってマウントする

## 前提
* 環境
    * AWS
    * RHEL8.6
    * ansible 2.9.27

## やったこと

### ポリシー
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:GetAccessPoint",
                "s3:PutAccountPublicAccessBlock",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAllMyBuckets",
                "s3:ListAccessPoints",
                "s3:ListJobs",
                "s3:CreateJob"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::<バケット名>",
                "arn:aws:s3:::<バケット名>/*"
            ],
            "Effect": "Allow"
        }
    ]
}
```
> インスタンスに上記ポリシーが追加されたIAMロールを直接アタッチしました。

### Ansible
```
- name: install packages
  yum:
    name: "{{ packages }}"
  vars:
    packages:
      - fuse
      - golang
  become: true

- name: download bind
  get_url:
    url: https://github.com/kahing/goofys/releases/download/v0.24.0/goofys
    dest: /usr/local/bin/goofys

- name: change permissions on goofys
  file:
    path: /usr/local/bin/goofys
    owner: root
    group: root
    mode: 0755

- name: bucket is mounted
  mount:
    path: "{{ <マウントパス> }}"
    src: "/usr/local/bin/goofys#dev-mkamimura-{{ <バケット名> }}-s3b"
    fstype: fuse
    opts: _netdev,allow_other,--dir-mode=0755,--file-mode=0644,--uid=0,--gid=0
    dump: 0
    passno: 0
    state: mounted
```
> goが使えなかったのでget_urlで持ってきました（golangは不要だったかも）。

### Ansible実行後
* /etc/fstabの設定例
```
/usr/local/bin/goofys#<バケット名> <マウントパス> fuse _netdev,allow_other,--dir-mode=0755,--file-mode=0644,--uid=0,--gid=0 0 0
```

* df -hの実行例
```
<バケット名>   1.0P     0  1.0P    0% <マウントパス>
```
【レガシー】Macbook Pro 2013にOS Xをクリーンインストールする際、App Storeで正しいAppleIDと正しいパスワードを入力したにもかかわらず、ログインできない事象について

## My Story

Macbook Pro 2013が起動しなくなったので、クリーンインストールをしたあとCatalinaをインストールしようとして詰んでいたところ、アップルサポートに助けていただいた。対応に感動したので記しておきます。

### やったこと
- Macbook Pro 2013をにOS Xをクリーンインストールする
    - Command+R+電源長押しでクリーンインストールを実行する。
- Macbook Pro 2013にCatalinaをインストールする
    - AppStoreからCatalinaをダウンロードしようとした
        - IDとパスワードを入力するダイアログが表示された
            - 正しいIDを入力した
            - 正しいパスワードを入力した
### 事象発生

「IDかパスワードが間違っています」旨の赤色メッセージが表示され、Appleアカウントにログインできない事象に遭遇した。

## Solution

アップルサポートに電話した後、アドバイザーの感動的な対応とともに解決策を授けていただいた。

1. iPhoneの「パスワードとセキュリティ」画面の「確認コードを入手」をタップして6桁の確認コードを手元にメモする
1. AppStoreからCatalinaのダウンロード画面でAppleアカウントへログインする
1. IDを入力する
1. パスワードを入力する際に「パスワード文字列」＋「確認コード」を入力する←今回お伝えしたいコト
    1. 例）パスワード：abcdefg  確認コード：123456の場合
        1. 入力するパスワード：abcdefg123456

上記パスワード入力によりAppleアカウントにログインできた。
その後、Catalinaのダウンロードを進めることができた。

非常に助かりました！！！！

### 原因について

MacOSXの当時のAppStoreアプリは2段階認証に対応していない。
私はAppleアカウントの2段階認証をONにしていた。
よって、なんらかの不整合のためにログインできない状態となっていた、ということらしいです。

## Conclusion

どこかのどなたかのなんらかに貢献できましたら幸いです。
DockerとVS Codeを使ってWindows上にSwift環境を構築する

## 概要

Swiftが大好きでWindowsでもSwiftが書きたい人に向けての記事です。

2022年7月14日にSwift公式サイトのブログで、VS Code のSwift拡張機能について発表がありました。この拡張機能を使ってWindows上でSwift環境を構築するまでの手順を紹介します。

この記事ではWindows上でSwift Package プロジェクト を作成するところまで紹介します。

## 環境

- Docker Desktop
- VS Code

この記事で作成する Swift 環境の Swift バージョンは5.7です。

## 作業手順

1. VS Code に Swift 拡張機能をインストールします。

> Swift
> https://marketplace.visualstudio.com/items?itemName=sswg.swift-lang&ssr=false#overview

3. VS Code に Remote Development 拡張機能をインストールします。

> Remote Development
> https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack

4. Docker Desktop を起動して Docker Engine を起動します。
5. VS Code のフォルダ内に.devcontainerフォルダを作成し、そのフォルダの中にdevcontainer.jsonファイルを作成します。全体的な構成は VS Code で開いているフォルダ/.devcontainer/devcontainer.json となっています。
``` ファイル構成
- VS Code で開いているフォルダ
    - .deccontainer
        - devcontainer.json
```
5. devcontainer.jsonの中身を次のように書き換えます。
```json: devcontainer.json
{
    "name": "Swift-5.7",
    "image": "swift:5.7",
    "extensions": [
      "sswg.swift-lang"
    ],
    "settings": {
      "lldb.library": "/usr/lib/liblldb.so"
    }
}
```

6. このようにdevcontainer.jsonの中身を書き換えたら、VS Code のコマンドパレットから Reopen in Containerを選択し実行します。すると、コンテナ環境の立ち上げが始まります。

```
Reopen in Container
```

8. 立ち上げが完了すると Swift を実行できる環境が完成しています。
9. Swift Package プロジェクトを作成します。ターミナルを開き、swift package init と入力して実行します。
```
swift package init
```
9. 実行が完了すると Swift Package が作成されていると思います。Sorceフォルダの中にコードを書き、Testsフォルダの中でテストを書いていく流れはXcodeでの Swift Package 開発と同じです。
10. 余談ですが、ctr + shift + B でビルドを実行することができます。 

## まとめ

この記事ではDockerとVSCodeを使用して、WindowsでSwift開発をできることを紹介した記事です。

Swiftが大好きで、WindowsでもSwiftを書きたいと思ったことをきっかけに始めた作業ですが、日本語の情報が全然見つけきれなくて苦労しました。

この記事が少しでもお役に立てれば幸いです。ご意見やご感想をお待ちしています。

## 参考資料

> Swift Extension for Visual Studio Code
> https://www.swift.org/blog/vscode-extension/
80が付くからと10080番ポートでWebサービスを起動してはいけない

自宅内でいろいろサーバーを弄っていた際にデフォルトのサービスポートが8080番のサービスがあり、同サーバー内のNextcloudと被るので10080番で起動したらアクセスできなかったという内容。同じことまたやりそうな気がしたので備忘録として残します。

## 結論から
Chromeの他Firefox、Edgh等の主要ブラウザでは10080番ポートは`ERR_UNSAFE_PORT`となりアクセスできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169143/606425ac-c8be-d31f-d0ba-8395c183519e.png)

## 切り分けまでの流れ
1. 疎通確認
    とはいえ対象サーバーはSAMBAを起動しており、普通に接続できていたので疎通は問題ないはず…

2. Raspberry Pi OSを入れていたのでローカルからブラウザでアクセスしてみる。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169143/5fb63ee9-5d3d-c705-6a75-e4374ca92974.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169143/05278cb3-884a-c6aa-9a10-fcaca833577a.png)
    だ、だめだ…

3. そもそもポートは空いているのか確認
    ```
    @raspberrypi:~ $ netstat -ant | grep 10080
    tcp6       0      0 :::10080                :::*                    LISTEN     
    ```
    ちゃんと空いている。でもTCP6限定？と思い込んでサービスの起動をIPv4にだけに変更したうえで再度確認
    ```
    @raspberrypi:~ $ netstat -ant | grep 10080
    tcp        0      0 0.0.0.0:10080           0.0.0.0:*               LISTEN     
    ```
    変わらずアクセスできなかった…
4. ブラウザでダメならコマンドでどうだろう？
    ```powershell
    > curl http://172.16.0.10:10080
    
    StatusCode        : 200
    StatusDescription : OK
    Content           : <!DOCTYPE html>
                        <html lang="ja">
    ```
    あれ！？いける！？？とここでブラウザ側の問題と判明。
    ブラウザのエラーを見ると`ERR_UNSAFE_PORT`とあり、10080番ポートを安全なポートではないと判断してアクセスできないようにしていると想定
5. サービスの起動ポートを変更
    7080番ポートで起動してみて正常にアクセスできましたとさ♪

あとはあまり関係ないですが、特にIPv6でアクセスする必要性が無いのでIPv4のみのままにしていたりします。

## 素敵な参考サイト
[nanoblog(ナノブログ)様](http://nanoappli.com/blog/archives/7772 "開発中、ChromeでERR_UNSAFE_PORTエラーが出たときにチェックすべきこと(312エラー)")

10080番ポートについては書いてないですが、結構いろいろなポートでNGになりそうですね。  
今度ハイポートでどのぐらいあるのか見てみようかな。
【React】create-react-appで出たエラーの対処法

# はじめに
普段はVue.jsを使っているのですが、React.jsの学習をしようと思い、create-react-appでプロジェクトを作ろうとしたときに出たエラーの対処法について、備忘録も兼ねて残しておきます。

## エラー内容

```
You are running `create-react-app` 4.0.3, which is behind the latest release (5.0.1). 

We no longer support global installation of Create React App.

Please remove any global installs with one of the following commands:
- npm uninstall -g create-react-app
- yarn global remove create-react-app

The latest instructions for creating a new app can be found here:
https://create-react-app.dev/docs/getting-started/
```

create-react-appを実行したときにバージョンがアップされました。
そのバージョンを用いて、プロジェクトを作ろうとすると、使用しているバージョンが古いからダメだと怒られました。

バージョンアップしたのに、バージョンが古いって、、はにゃ、、、？って感じですね。笑

それにグローバル環境にインストールした覚えもないです。

## 原因と解決方法
バージョンをアップデートしてもまだ古いバージョンのキャッシュが残っているのが原因のようなので、npxのキャッシュを削除することで解決できました。

```
npx clear-npx-cache
```
Chemistry ボッシュ自動車handbook 11版(12) p.182

人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2

残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>
# ボッシュ自動車ハンドブック version 11, 2022
Automotive Handbook  May 2, 2022

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

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e

# Chemistry 
p.182

## Elements 
## Chemical bonds 
## Substances 
## Substance concentrations 
## Reaction of substances 
## Electrochemistry 

# Reference


# 参考資料　

ボッシュ自動車handbook(英語)11版(0)

https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e

ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9


自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20221016

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
個人開発したWebサービスをMENTAでレビューしてもらった

MENTAという`プログラミングに関する質問`や`ソースコードレビュー`をプロのメンターにお願いできるサービスを利用させていただきました。

https://menta.work/

今回は個人開発したWebサービスの`デザイン、UI/UX`面をレビューしていただいたので、内容を記載していきます。
皆さんが開発しているWebサービスの参考になれば幸いです。

https://qiita.com/ryouya3948/items/1fc06116a211f3bc62f7

# レビュー内容
画面ごとにレビュ―内容を絡めて、修正前後の画像を貼っていきます。
### トップ画面
#### Before
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/b695d668-c591-e63d-3aa1-3f624a249bfe.png)
#### After
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/cd09f873-660a-bf07-4743-b38ec634e80d.png)
### 新規登録画面
#### Before
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/3fe734c0-5bd0-82e8-5301-22ace75531f3.png)
#### After
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/e63432eb-cc3c-f6ea-f24b-2cf35e6f8035.png)
### 投稿画面
#### Before
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/9509a8d6-a9d2-a099-c79d-a7a4bd532b3d.png)
#### After
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/780422f2-774f-8661-672a-8f081ac9ef8a.png)

# まとめ
本記事に記載しているレビュー以外にもたくさんのご指摘をいただきました。（パワポで10枚以上…！）自分だと気づかなかった点などを修正できたので、サービスのブラッシュアップができたと感じています。

最後に今回レビューしてくださったメンターさんを紹介します。

https://menta.work/user/18319
Unknown database 'データベース名'の対処法

## 開発環境
Laravel 8.0
PHP 8.1.4
Mysql 8.0.28

## エラー発生状況
1.新規アプリ作成後、php artisan migrateでマイグレーションを実行
2.エラー発生
```terminal:terminal
SQLSTATE[HY000] [1049] Unknown database 'laravel' (SQL: select * from information_schema.tables where table_schema = Laravel and table_name = migrations and table_type = 'BASE TABLE')
```
## 対処法
Mysql上にlaravelという名前のデータベースがないようなので、laravelでデータベースを作成。
```terminal:terminal
mysql> mysql -u root 
mysql> create database laravel; 
```
※データベース名は自分が作成しているアプリ名でも可。
　例: testappというアプリを作成しているのなら、create database testapp等

## 参考情報
https://laracasts.com/discuss/channels/general-discussion/unknown-database-laravel-new-registration-of-user
Linuxのシェルスクリプトでフォルダー存在判定

# やり方

```shell
if [ -d /home/unko ]; then
    echo 'あるよ'
else
    echo 'そんなものはない'
fi
```

# 蛇足

外付けHDDや外付けUSBメモリがマウントされているかどうかの判定にも使える。

# 参考サイトさん

https://www.server-memo.net/shellscript/file_check.html#:~:text=File%20not%20exists.-,%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%8C%E5%AD%98%E5%9C%A8%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88,d%E3%80%8D%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%BE%E3%81%99%E3%80%82&text=%E4%B8%8B%E8%A8%98%E3%81%AF%E3%80%8Ctest%E3%80%8D%E3%81%A8%E3%81%84%E3%81%86%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA,%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82&text=echo%20%22Directory%20exists.%22

# バージョン

Ubuntu 20.04.5 LTS
GNU bash, バージョン 5.0.17(1)-release (x86_64-pc-linux-gnu)
【EXCEL】プルダウンを使用せずダブルクリックだけでリスト選択できる機能の実装

# 概要

仕事していてこれいいな、と思った機能・実装があったのでご紹介

通常EXCELでリスト選択というとプルダウン機能を思い浮かべる方がほとんどだと思います。
ただ、こんな場面に遭遇したことがないでしょうか？

[![Image from Gyazo](https://i.gyazo.com/9d0f174284fe3d75da0b7a1dcfb7d8c3.gif)](https://gyazo.com/9d0f174284fe3d75da0b7a1dcfb7d8c3)
操作の際、毎回右の▽ボタンを押すことがめんどい、、、

そんなあなたに朗報…！
VBAの実装を行うことで、ダブルクリックするだけの手間いらずなリスト機能が簡単に作れちゃいます！

# 実装
①VBEにて対象シートを開く
![ 2022-10-16 12.50.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263891/d8b02808-2718-9900-b297-b7000cabd2b6.png)

②以下コードを記述
```vb
Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    With Target
        
        'C列をダブルクリックしたら
        If .Column = 3 Then
            If .Value = "" Then
                .Value = "はい"
            ElseIf .Value = "はい" Then
                .Value = "いいえ"
            ElseIf .Value = "いいえ" Then
                .Value = "はい"
            End If
            
             'セル内編集をキャンセル
            Cancel = True
         End If
         
    End With
End Sub
```

# 動作デモ
[![Image from Gyazo](https://i.gyazo.com/85c9494dd6b86c8b59539e947ac213cd.gif)](https://gyazo.com/85c9494dd6b86c8b59539e947ac213cd)

ダブルクリックするだけで次々と入力できちゃいます！
「はい/いいえ」の切り替えもダブルクリックするだけ
これぞストレスフリーな世界線

# 拡張

選択肢を増やしたい場合もIf文内にコード追記するだけです。

```diff
        'C列をダブルクリックしたら
        If .Column = 3 Then
            If .Value = "" Then
                .Value = "はい"
            ElseIf .Value = "はい" Then
                .Value = "いいえ"
            ElseIf .Value = "いいえ" Then
-                .Value = "はい"
+                .Value = "わからない"
+           ElseIf .Value = "わからない" Then
+                .Value = "はい"
+           End If
            
             'セル内編集をキャンセル
            Cancel = True
         End If
```

[![Image from Gyazo](https://i.gyazo.com/cff30055cacfb137c6c4ade2b9282707.gif)](https://gyazo.com/cff30055cacfb137c6c4ade2b9282707)

しかし、リストの選択肢が多いとその分ダブルクリックする回数が増えるので
その場合はプルダウンの方が良いかな、、といった感じにはなりますね笑

「はい/いいえ」だけの簡易的なアンケートを作りたいケース等には実装する価値ありかと思います！
OS別 VSCodeの設定を削除･初期化する方法

# 概要

OS別に Visual Studio Code の設定を削除･初期化(リセット)する方法を記載する

`.vscode` には拡張機能、 `Code` には設定プロファイルが格納されている


## Linux

ターミナルを開いて以下のコマンドを実行

```sh
rm -rf ~/.vscode
rm -rf ~/.config/Code
```

## macOS

ターミナルを開いて以下のコマンドを実行

```zsh
rm -rf ~/.vscode
rm -rf ~/Library/Application\ Support/Code
```

## Windows

PowerShellを開いて以下のコマンドを実行

```powershell
Remove-Item -Recurse -Force $env:USERPROFILE\.vscode
Remove-Item -Recurse -Force $env:APPDATA\Code
```

## 再同期

設定の同期を有効化していた場合、 `F1` キーより、「コマンドパレット」を開き、下記コマンドを入力

```
Settings Sync: Turn On...
```

GitHub もしくは Microsoft アカウントにて設定の同期を再度有効化する

![SettingsSyncTurnOn.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149815/f7f2a49b-6ca0-5793-3f00-31d01b1ee5d2.gif)
VirtualBox 7.0 に Windows11 をインストール

Ubuntu 22.04 に VirtualBox 7.0 をインストールし、それに Windows11 をインストールしました。
![windows_oct16_cc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/17bf6a84-55a5-d33e-acff-17b995d21792.png)

## VirtualBox のインストール
こちらのサイトからダウンロードします。
[Download VirtualBox for Linux Hosts](https://www.virtualbox.org/wiki/Linux_Downloads)
virtualbox-7.0_7.0.0-153978_Ubuntu_jammy_amd64.deb

必要なライブラリーのインストール

```bash
sudo apt install libqt5core5a libqt5dbus5 libqt5gui5 libqt5gui5-gles libqt5help5 libqt5opengl5
```

インストール

```bash
sudo dpkg -i virtualbox-7.0_7.0.0-153978_Ubuntu_jammy_amd64.deb
```

## Windows11 のインストール
こちらのサイトからダウンロードします。
[Windows 11開発環境を取得する](https://developer.microsoft.com/ja-jp/windows/downloads/virtual-machines/)
WinDev2209Eval.VirtualBox.zip

解凍

```bash
unzip WinDev2209Eval.VirtualBox.zip
```

次のファイルが出来ます。

```text
20654M  9月 14 03:22 WinDev2209Eval.ova
```

このファイルをダブルクリックすると、VirtualBox に Windows11 がインストールされます。

インストール中
![windows_oct16_aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/2edf471a-9bdf-646a-9926-6f5b7066b5b2.png)

インストール完了
![windows_oct16_bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/388fab6e-94e1-6ab0-013f-a24fd8082631.png)

インストール後に、VirtualBox マネージャーから起動が出来ます。
![virtualbox_oct16_aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/e2bfe0ac-5edd-9dcd-502a-030d018f494f.png)

日本語を追加
![language.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/c935cf83-2785-a6fd-e666-763cd2d06e87.png)

## 共有フォルダーの使い方
ホスト(linux) と Windows11 でフォルダーを共有します。

/home/uchida/tmp を共有します。
Oracle VM Virtual Box マネージャーで　「設定」　をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/5511a32b-e961-3262-a9f1-d1840b773b92.png)

設定 -> 共有フォルダー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/4624d546-d6f9-c6ac-88da-dcf34e5b472d.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/c70d1429-3eb5-6a97-f0ad-032d22258743.png)

Windows11 での見え方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/14c0ea92-c07c-9a52-d908-e2d084640a30.png)
ABC273 E問題を Git で処理（※TLE注意）

https://atcoder.jp/contests/abc273/tasks/abc273_e

SAVE と LOAD の処理を高速にする方法を考えていたら、「これって **Git みたいなものを作れ** ってことか」と思い至った。

だったら **本物の Git を使っても解けるのでは？** と思い、やってみた。残念ながら例題以外は全て TLE になってしまったので、正しく解けているかは不明。

## コード
[公式解説](https://atcoder.jp/contests/abc273/editorial/5023)の内容を Git の機能に置き換えていく。

* 根付き木 → コミットグラフ
	* 頂点 → コミット
	* 根 → initial commit
* 「コマ」 → `HEAD`
* ノートの各ページ → タグ（またはブランチ名）

あとは `HEAD` をひたすら動かせばいい。値はコミットメッセージに保存することにして、ファイルのバージョン管理を省く。

```bash
#!/bin/bash
set -eu

# 適当な作業用ディレクトリを作り移動しておく
cd $(mktemp -d)

{
# Git を初期化する
git init
git config --local user.name "atcoder"
git config --local user.email "atcoder@example.com"

# 根付き木の根を initial commit で表現する
git commit --allow-empty -m "-1"
git tag "root"
} > /dev/null

read n
for (( i = 0; i < $n ; i++ )); do
  read op x

  case ${op} in
    ADD )
      # 配列に push → コミットメッセージの形で数値を記録する
      git commit --allow-empty -m "${x}"
      ;;
    DELETE )
      # 配列を pop → 直前のコミットを指し直す
      git reset --hard HEAD~ || true
      ;;
    SAVE )
      # 配列を保存 → 現在のコミットにタグを付ける
      git tag -d "page-${x}" || true
      git tag "page-${x}"
      ;;
    LOAD )
      # 配列を復元 → タグを利用してコミットを指し直す
      git reset --hard "page-${x}" || git reset --hard "root"
      ;;
  esac

  # 配列末尾を出力 → 現在指しているコミットから数値を取り出す
  git show --no-patch --format=format:" %s" >> answer.txt
done > /dev/null 2>&1

# 解答を出力する（念のため末尾に改行を追加）
echo >> answer.txt
cat answer.txt

# （おまけ）コミットグラフを stderr に出す
# git reflog | awk '{ print $1 }' | xargs git log --graph --pretty='%h%d %s%n' | cat >&2
```

### グラフ
スクリプト最終行をコメントアウト解除すると、完成した根付き木が見られる。入力例2だと以下のようになる。（コミットのハッシュ値は毎回変わる）

```text
* fe6c1ec 4
|
| * 2e5f6a8 8
|/
|
* bcde297 7
|
* 1bc8440 (HEAD -> master, tag: page-5) 1
|
| * a709950 2
|/
|
* 5228b7c 5
|
* 43aa206 4
|
| * b7040b0 10
|/
|
| * 4033e27 3
|/
|
* 49347c6 4
|
* 830b062 (tag: root) -1

```

少し面白いことが `49347c6` で起きている。1番目と8番目のクエリは共に「 `root` を基点にして `4` を追加する」処理で、ふつうならコミットは別になる。しかし本スクリプトで実行すると**秒単位での時刻も含めて完全に同じコミット**になるため Git は区別していない。（ sleep を挟んだりすればコミットが分かれることを確認できる）

## Ruby に翻訳
Git の語句を変数名などに使った。こちらは問題なく AC になる。
https://atcoder.jp/contests/abc273/submissions/35707481

```ruby
answer = []

Commit = Struct.new(:message, :parent)
head = root = Commit.new(-1, nil)
tags = {}

n = gets.to_i
n.times do
  op, x = gets.split

  case op.to_sym
  when :ADD
    head = Commit.new(x.to_i, head)
  when :DELETE
    head = head.parent if head != root
  when :SAVE
    tags[x] = head
  when :LOAD
    head = tags[x] || root
  end

  answer << head.message
end

puts answer.join(" ")
```
マークダウン入門

# 見出しの書き方
```
# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
```
# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5

# コードブロック
バッククォート３つでコードを囲みます
````
```
function hello() {
    echo 'hello';
}
```
````

```
function hello() {
    echo 'hello';
}
```
TerraformでVPCを構築しよう

# はじめに
Terraformを利用して、VPCを構築するテンプレートのサンプルです。

Terraformのバージョンは ```v1.1.6```とする。

コードは[GitHub](https://github.com/miyabiz-room/Terraform-Template/tree/vpc-01)にもあります。

今回は、akane というシステムの dev 環境を想定しています。
同じ構成で違う環境を作成する場合は、{環境名}のディレクトリを別途作成します。

```text:ディレクトリ構成
akane (システム)
  ├── common (共通テンプレート)
  │   ├── network.tf (スタック)
  │   ├── outputs.tf (リソースのアプトプット生成)
  │   └── variables.tf (パラメータ型定義)
  └── dev (dev 環境)
      └── main (dev 環境のテンプレート)
          ├── locals.tf (dev 環境の共通パラメータ)
          ├── main.tf (dev 環境のパラメータ)
          ├── outputs.tf (リソースのアプトプット出力)
          └── providers.tf (AWS プロバイダー)
```

# AWS リソース構築内容
- VPC (10.0.0.0/16)

# AWS システム構成図
![vpc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682035/150a0925-0a29-84ce-00ae-83af0c5fed2c.png)

# 実行環境の準備
[AWSでTerraformを動かすための設定](https://qiita.com/miyabiz/items/b647c93aaf3c05c61525)を参考にしてください。

# AWS リソース構築手順
1. 下記を実行してスタックを作成

    ```
    cd akane/dev/main
    terraform init
    terraform apply
    ```

2. 下記を実行してスタックを削除

    ```
    cd akane/dev/main
    terraform destroy
    ```

# 構築テンプレート
**1. 共通テンプレート**

```tf:network.tf
module "vpc" {
  source = "terraform-aws-modules/vpc/aws"

  name = "${var.system_name}-${var.env_type}-vpc"
  cidr = var.vpc_cidr
}
```

```tf:outputs.tf
##############################
# Network
##############################
output "network_vpc_id" {
  value       = module.vpc.vpc_id
  description = "The name of the VPC id."
}
```

```tf:variables.tf
variable "system_name" {
  type = string
}

variable "env_type" {
  type = string
}

variable "vpc_cidr" {
  type = string
}
```

**2. 環境毎のテンプレート**

```tf:locals.tf
locals {
  tags = {
    "EnvType"     = "dev"
    "SystemName"  = "akane"
    "Terraform"   = "true"
  }
}
```

```tf:main.tf
module "common" {
  source = "../../common"

  system_name = local.tags.SystemName
  env_type    = local.tags.EnvType
  vpc_cidr    = "10.0.0.0/16"
}

```

```tf:outputs.tf
##############################
# Network
##############################
output "network_vpc_id" {
  value       = module.common.network_vpc_id
  description = "The name of the VPC id."
}
```

```tf:providers.tf
provider "aws" {
  region = "ap-northeast-1"
  default_tags {
    tags = local.tags
  }
}
```
Unreal Engine：UPhysicsHandleComponentでグラブしたはずのアクターをグラブできない時の解決方法　#CPP

Rayを当てたりして取得したアクター`UPhysicsHandleComponent`の`GrabComponentAtLocationWithRotation`を使って物体を取得し保持することはよくある方法だと思いますが正常に取得できないことがあります。それの解決方法の備忘録。
```c++:grabActorSample.cpp
	UPhysicsHandleComponent* handle = GetOwner()->FindComponentByClass<UPhysicsHandleComponent>();
	if (handle == nullptr) return;

	UPrimitiveComponent* hitComponent = hitResult.GetComponent();
	handle->GrabComponentAtLocationWithRotation(
        hitComponent, 
        NAME_None, 
        result.ImpactPoint, 
        GetComponentRotation()
    );
```
## 原因
取得したオブジェクトのPhysicsが寝てしまっている。
## 解決方法
`UPrimitiveComponent`の`WakeAllRigidBodies`を使って、取得したオブジェクトを起こしてやります。
```c++:grabActorAwakedSample.cpp
	UPhysicsHandleComponent* handle = GetOwner()->FindComponentByClass<UPhysicsHandleComponent>();
	if (handle == nullptr) return;

	UPrimitiveComponent* hitComponent = hitResult.GetComponent();
	hitComponent->WakeAllRigidBodies();  //これを追加
	handle->GrabComponentAtLocationWithRotation(
        hitComponent, 
        NAME_None, 
        result.ImpactPoint, 
        GetComponentRotation()
    );
```

簡単だけど知らないとはまる。

## 因みにリリースする時も同様
```c++:releaseActorAwakedSample.cpp
	UPhysicsHandleComponent* handle = GetOwner()->FindComponentByClass<UPhysicsHandleComponent>();
	if (handle == nullptr) return;

	// Release grabbed object
	if (handle->GetGrabbedComponent())
		handle->GetGrabbedComponent()->WakeAllRigidBodies();
		handle->ReleaseComponent();
```
おしまい。
[Flutter] MacOSで_ClientSocketException: Connection faild が出たときの対応

## 経緯
Flutterアプリを作る際に、
[サンプル](https://docs.flutter.dev/cookbook/networking/fetch-data "Fetch data from the internet")を参考にしながら
APIからJSONの値を取得して、その値をそのまま表示するサンプルを作るときに躓きました。

## 内容
`package:http/http.dart` を使って get をすると以下のようなエラーが出ました。

```
_ClientSocketException (Connection failed)
```

Exceptionの内容は以下の通り。(xxx.comは仮)

```
Exception has occurred.
SocketException (SocketException: Connection failed (OS Error: Operation not permitted, errno = 1), address = xxxx.com, port = 443)
```

## 対応
Flutterの[MacOSアプリセッティング](https://docs.flutter.dev/development/platform-integration/macos/building "Building macOS apps with Flutter")に[記載](https://docs.flutter.dev/development/platform-integration/macos/building#setting-up-entitlements "Setting up entitlements")がありまして、
アプリからネットワークのリクエストを投げるには
`com.apple.security.network.client`のentitlementsを追加する必要があるようでした。

そのため、対応としては
`macos/Runner/DebugProfile.entitlements`
ファイルの<dict>要素内に以下を追加することで解決。

```xml:macos/Runner/DebugProfile.entitlements
    <key>com.apple.security.network.client</key>
    <true/>
```

やっとデータが取れた。
Windows11 WSL2 Ubuntu22.04LTSの環境構築でうまくいかない部分の対処

Windows11, WSL2, Ubuntu22.04LTSで↓の環境構築記事と同じことをやったとき、そのままではいかない部分を個別に処理していく

https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1

## pyenv installでのopensslバージョンエラーを避ける
linuxbrewでインストールしたpyenvを使ってpython各バージョンをインストールしようとするとopensslエラーになる (openssl-devなどの各種ライブラリを入れていても再現し続ける)

```
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
```

色んなところに色んな策がありつつ、最終的には「brewでopenssl v3をインストールした上で、 [この記事](https://blog.ikappio.com/missing-the-openssl-lib-on-pyenv-install-version/)と同じことをする」で解決した

```shell-session
brew install openssl@3
```

毎回指定するのがつらすぎるので、pyenvコマンドを上書きしておくこともできた

```bash:~/.bash_profile
# pyenvでopensslバージョンエラーを避けるための環境変数指定を毎回やる
alias pyenv='CFLAGS="-I$(brew --prefix openssl)/include" \
LDFLAGS="-L$(brew --prefix openssl)/lib" \
pyenv'
```

## ターミナルは日本語表示できるのにGUIアプリの日本語が表示されないのを直す
諸々をやればWindows Terminalでの表示は日本語になるが、fcitx-config-gtk3やemacsなどでUbuntuのGUIを開いてみると日本語が表現できていない ( `☒` みたいな感じの記号で補完されてしまう)

Source Code Proフォントだけインストールしてあるとこうなる。
別の日本語対応フォント (たとえばSource Han Code Pro)をインストールすると直る

環境構築記事と同じ方法は `afdkoのセットアップ` がエラーで動かなかったが、一方でpython3.6.14ならいきなりsource-han-code-pro/commands.shを実行したらうまくいった。なにもわからない
AWSコンソールでリソースが表示されない時

# はじめに
プログラミング学習中の[@kat_log](https://twitter.com/kat__log "Twitter")と申します。

AWSコンソールにアクセスした際に、存在するはずのインスタンスなどのリソースが表示されず、何か間違って全部消えた！？と戸惑ったのですが、解決したため共有です。

![image.png](https://soco-st.com/wp-content/themes/socost/upload/11813_color.svg)

# 結論
リージョンの切り替えが必要でした。

# 設定前
リソースが何も表示されていません…！
![Screenshot 2022-10-16 120549AWS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/7b12a101-bf2b-f09b-3241-83844348d248.png)


# 設定
右上から設定できます！
どのリージョンにリソースが存在するかは、リソースの作成段階？に指定しているのではと思います！
（不明でしたらポチポチ切り替えていきましょう！）
（今回自分は東京にありました🗼）

![Screenshot 2022-10-16 120708AWS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/28128f8c-3012-e637-9e41-9a00176165fc.png)

# 設定後

![Screenshot 2022-10-16 120625AWS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/db39c661-6206-eecc-8f7b-dfa4fc812d1e.png)

リソースが存在するリージョンを選ぶと無事に表示されました！

# 後書き
お読みいただきありがとうございました！
普段リージョンを意識していなかったので、
リソースの表示（リソースの場所）に関係している（というかそのもの）と学びになりました。

リソースが表示されない他の理由として、

- 別アカウントではないか
- 権限があるか

というのが関係している可能性もあるようで、この記事で解決しなかった場合、↓の参考に載せている公式ページ等も見てみてください！

# 参考

https://aws.amazon.com/jp/premiumsupport/knowledge-center/find-resources/
Flaskのスケルトン作成

## Flask APPの生成
自然言語処理が必要になったので
やっぱPythonかなぁ
というわけで今更ながら
Python + Flask の勉強を開始しました。

まぁ自分用の備忘録的なものです。


### 準備
　python3 pip3 はインストールされているという前提で始めます。

### SampleAPPの作成

ディレクトリを生成し作成したディレクトリ内に仮想環境を導入します。
```bash
% mkdir sampleApp
% python3 -m venv sampleApp
```

ディレクトリに入り仮想環境を有効化します。
仮想環境が有効化されるとプロンプトが (ディレクトリ名)となります。

```bash
cd sampleApp
source bin/activate
(sampleApp) 
```

仮想環境にFlaskを導入します。
```bash
(sampleApp) pip3 install Flask
```

hello.pyを作成します。
みんな大好き`Hello World!` です。

```python:hello.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
  return 'Hello World!'
```

アプリのエントリポイントを
環境変数 `FLASK_APP`に設定します。
```bash
(sampleApp) export FLASK_APP=hello.py
```

そしてFlaskを実行します。
```bash
(sampleApp) flask run
 * Serving Flask app 'hello.py'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. 
Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit
```

正しく動作すると Webブラウザから``localhost:5000`` へのアクセスによって確認できます。


![スクリーンショット 0004-10-16 12.11.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481708/71f5fdb2-b4f6-33b5-9e98-c412acd30a44.png)

### RESTfulAPI的な作りにするには

メソッドの切り分けは `@app.route` の第二引数で指定する。
queryの読み込みは `request` オブジェクト？から取り出せる。
JSON出力は `return (json.dumps(...))` で大丈夫。

```python:app.py
import json
from flask import Flask, request
app = Flask(__name__)

@app.route('/api', methods=['GET'])
def api_get():
    query = request.args
    return json.dumps({'querys:':query})

@app.route('/api', methods=['POST'])
def api_post():
    query = request.form
    return json.dumps({'querys:':query})
```


### 感想
とりあえず最低限の Flask でのWebアプリの構築方法をまとめてみた。
なんとかなりそうな手応えです。
今後の予定としては mecab等の自然言語処理ライブラリの利用し
WebAPIを実装したいと考えてます。
Cookieとは？Cacheとは？2つの違いも含めて徹底解説

## Cookieとは？

Cookie（クッキー）とはWebサイト(Webサーバー)にアクセスしたクライアント(ユーザー)の情報を一定期間保持するファイルまたは仕組みのことです

Cookieにはアクセスしたクライアントの
- セッションID(IDやパスワードなどの個人情報を直接保存することは一般的に避けられいるため)
- IPアドレス
- 訪れた日時
- 訪問回数

など様々なデータが保存されており、アクセスしたWEBサイトから自身のブラウザに送られ、保存されます。

### Cookieの仕組み
![cookie.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/3b0f5afa-9dac-e3b5-a676-0bc06368de47.png)

上の図のようにサイトを利用する際に一度IDとパスワードでログインすると、しばらくの間ログイン情報を入力することなく、自分のアカウントにアクセスできるのはCookie内にログイン情報が入っているからです
Cookieがあることでクライアント(ユーザ)は２回目以降訪れたサイトを毎回情報を再入力せずに利用できるため、便利です

## Cacheとは？
訪れたWEBページの
- HTML
- 画像
- アイコン

などの情報をブラウザが一時的に保存する仕組みです
ブラウザの中に保存したキャッシュを読み込むことで、次に同じWebページを訪問したときにブラウザに保存されたデータを参照するため、表示するスピードが早くなり、閲覧しやすくなります

### Cacheの仕組み
![cache.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/a70078fc-40a2-c957-29d7-f3170894cf1f.png)


上の図のようにサイトを利用する際に一度サイトにアクセスすると、ブラウザからキャッシュを参照するので表示が高速になります。
ただし、一時的に保存された古いキャッシュが原因で、古いままページの情報が表示されたり、正しく表示されなかったりすることがあります
キャッシュを削除することで更新された最新のページが表示されるので例えばWebページを更新したのになんで反映されないんだ、と思った時はキャッシュを消してみるのも手です

## CookieとCacheの違い
どちらも情報をブラウザに一時保存する仕組みですが保存する情報が違います
CookieにセッションIDなどサイトの閲覧情報が保存されるのに対して
CacheにサイトのHTMLや画像が保存されます
Cookieを削除すると閲覧情報が消えるため、例えばサイトにログインする際はもう一度ログインする必要があります
Cacheを削除するとサイトを表示するHTMLデータや画像が消えるため、ブラウザではなくサイトから直接取得するので表示が遅くなります

## 参考
https://gmotech.jp/semlabo/seo/blog/cookie/

https://www.geekly.co.jp/column/cat-webgame/1910_001/

https://myajo.net/tips/7527

https://www.orixbank.co.jp/aboutus/policy/guide/cache.html

https://pcdr-chiebukuro.com/cache-sakujo-dounaru/

https://www.engilaboo.com/definitely-understand-cookie-session/
【Unity】PICO4 VRアプリ開発 パススルーアプリを作る

# はじめに
PICO4のカラーパススルーはARコンテンツにも使えます。
本記事では、パススルー用カメラ映像をUnityで利用する方法を説明します。
PICO4でのアプリ開発についてはこちらを参照してください。
* [PICO 4 VRアプリ開発 開発者モード設定](https://qiita.com/afjk/items/14085d944915334cffc5)
* [【Unity】Pico Neo 3/Pico 4 VRアプリ開発 (1) Pico SDK 2.1.1版](https://qiita.com/afjk/items/6b587034c9ff3afb9e5c)


https://twitter.com/afjk01/status/1578272004217573376?s=20&t=LCKnMViGUcBA03yQnIDvhg

# Camera設定
MainCameraのClear FlagsをSolid Color
Backgroundを000000(Alpha値0)にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/b8f2cc7e-7a1d-b380-6ee0-05da70280d03.png)

# パススルーAPIを呼び出す
Pico SDKの`PXR_Boundary.EnableSeeThroughManual(true)` を呼び出すことで背景をパススルーカメラの映像に出来ます。
なお、このAPIはスリープからの復帰時にも呼ぶ必要があります。
## サンプルコード
PassThroughSetter.csファイルを作成し、空のGameObject PassThroughSetterにアタッチします。
```
using Unity.XR.PXR;
using UnityEngine;

public class PassThroughSetter : MonoBehaviour
{
    void Start()
    {
        // シースルー設定
        PXR_Boundary.EnableSeeThroughManual(true);   
    }
    
    private void OnApplicationPause(bool pauseStatus)
    {
        // Pauseからの復帰時、再度シースルーにする
        if (!pauseStatus)
        {
            PXR_Boundary.EnableSeeThroughManual(true);
        }
    }
}

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43734/85e4c0fa-c5a0-1ba4-1bc7-0ab14226c57d.png)

以上で設定は終わりです。ビルドしてPICO4で動かせば背景がパススルー映像になります。

# パススルーカメラの映像をUnityで取得できるか？
以前はパススルー映像をRawImageとして取得するAPI `PXR_PassThrough` が存在していたのですが、最新のSDK(v2.1.1)にはないようです。
空間にCameraを配置しRenderTextureへ書き出す方法も試してみましたが、Backgroudのカラーが映るのみでパススルー映像は映りませんでした。

# 作例
PICO4のパススルーは単眼カメラですが、立体的に映像を歪ませ補正されています。
例えばこのような椅子の上に置いたオブジェクトもきちんと椅子に乗っているように見ることが出来ます。

https://twitter.com/afjk01/status/1579022001338912773?s=20&t=Ihyd9_PQ_ZdglcjMZ-N2ig

ただし、近くの物体は補正による歪みの影響が強いので注意が必要です（例えば手を顔に近づけるなど）

https://twitter.com/afjk01/status/1579006318983057408?s=20&t=Ihyd9_PQ_ZdglcjMZ-N2ig

# おわりに
カラーパススルーができる一般向けのスタンドアローンVRデバイスの登場により、現実とVRを混ぜた新しい表現が生まれる可能性を感じます。

# 参考
公式ドキュメント
https://developer-global.pico-interactive.com/docs/en/12058/seethrough_camera_related/
docker-composeでnginx-django-mysqlを構築した（ハンズオン）

# やりたいこと
- nginx-django-mysqlを使った環境構築をdocker-composeで可能にする
- Python（Django）に限らず可能な限りどの言語でも使えるコンテナ環境を作成する

## 大まかな流れ
- ハンズオン用のリポジトリを使ってnginx-django-mysql環境を構築する
- .envと.gitignoreを修正
- ソースコード作成
- settings.pyを修正
- docker-compose upして実際に表示できるか確認

- ハンズオン用のリポジトリをclone
```:bash
git clone https://github.com/hkobashi/docker-for-python-django
```

- .env_sampleを参考に.envファイルを作成
~~※.gitignoreに追記を忘れずに-~~
→[すでに追記されているので改めての追記は不要でした](https://github.com/github/gitignore/blob/main/Python.gitignore
)
※@shun198 さんご指摘ありがとうございます

- この時点でこんな感じのディレクトリ構成になっている
```:tree
.
├── README.md # 本ファイル
├── docker-compose-dev.yml # 開発環境用コンテナ設定ファイル（django-mysqlのみ）
├── docker-compose-prd.yml # 本番環境用コンテナ設定ファイル（django-mysql-nginx）
├── dockerfiles # 各コンテナの詳細設定ファイルを格納
│   ├── mysql
│   │   ├── Dockerfile # mysqlのバージョンなどを設定
│   │   ├── init.sql # Djangoで使用するDBユーザーに権限を付与
│   │   └── my.cnf # 文字コードやシステム時刻を設定
│   ├── nginx
│   │   ├── Dockerfile # nginxのバージョンなどを設定
│   │   └── django.conf # リバースプロキシ、静的ファイルの設定
│   └── python
│       ├── Dockerfile # pythonのバージョンなどを設定
│       ├── entrypoint.sh # 本番環境用の起動スクリプト
│       └── requirements.txt # インストールするPythonライブラリ群
└── src # ソースコードを格納するディレクトリ
```

## サンプル用ソースコード作成 
- [djangogirlsチュートリアル](https://tutorial.djangogirls.org/ja/django_start_project/)を使ってソースコードを作成していく
```:bash
# djangoプロジェクトを作成
docker-compose -f docker-compose-dev.yml exec app django-admin startproject mysite .
```

- settings.pyを修正
```python:src/settings.py
# settings.pyに「STATIC_ROOT」を追記
STATIC_ROOT = '/static/'
# DB接続情報をSQLite→MySQLに変更
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        # .envで設定した環境変数をDATABASESのパラメータに反映
        "NAME": os.environ.get("MYSQL_DATABASE"),
        "USER": os.environ.get("MYSQL_USER"),
        "PASSWORD": os.environ.get("MYSQL_PASSWORD"),
        "HOST": "db",
        "PORT": 3306, # コンテナ側のポート番号を指定
    }
}
```

- 開発環境用コンテナを起動
```:bash
docker-compose -f docker-compose-dev.yml up -d
# DBマイグレーション
docker-compose -f docker-compose-dev.yml exec app　python manage.py migrate
```

- 「127.0.0.1:16000」にアクセスしてお馴染みのロケットが出てきたらOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730991/4780b78a-64f8-7da7-73d9-64fb3634c5d1.png)


## 今後について
- 現状だとrootユーザーでコンテナが実行されているためこの辺りの権限制御もしていきたい
→セキュリティの観点からこのままデプロイするわけにはいかないため
- 後日、ECSかEKSにデプロイした記事を投稿する予定

### 参考にした記事
https://qiita.com/shun198/items/f6864ef381ed658b5aba

https://dailydevsblog.com/troubleshoot/resolved-gunicorn-command-not-found-197026/