OmniAICreator/Qiita-1.07M huggingface dataset:
Macでの初期設定、開発環境構築(python、node.js、docker)メモ

# Macでの初期設定、開発環境構築

大学入学時に購入して何もわからず環境構築したMacBook Pro。
何かがおかしいと気づきつつ無理矢理使ってきましたが本当に限界を感じたので一旦出荷状態まで戻して全てを最初からやり直します。
次にMacOSでゼロから環境構築する時のためのメモとして好みの設定からよく使う開発環境の構築までを書き残します。
この記事はハブのイメージでそれぞれのコンテンツは分割して記事にしていくので必要な部分だけ切り取ってご覧ください。

## 環境
MacBook Pro (13-inch, 2018)
macOS　Monterey Version 12.5
メモリ intel Core i5
zsh 5.8.1 (x86_64-apple-darwin21.0)

## 目指す状態・方針

### 初期設定
個人的に使い心地のいい設定に変更していきます。
正直ほとんど需要はないと思いますが個人的メモが一番の目的なのでこれも書きます。
おすすめの設定がある人がいたらコメントください。
とりあえず下の設定をいじります。(他にもいじったかもしれませんが覚えてません)
- トラックパッドの感度
- メニューバーの表示
- finderの環境設定
- ゴミ箱からの消去
- ディスプレイ表示サイズ
- スクリーンショットの保存先

### 開発環境
個人的に開発でよく使う環境を構築していきます。
構築する環境の中身と方針はざっくりこんな感じです。
理由はわかる範囲で分岐した記事内で書きます。
- python
    - Homebrew→pyenv→python
- node.js
    - Homebrew→nodenv→node.js
- docker
- VScode

### よく使うアプリが入っている(おまけ)
個人的によく使うアプリをインストールして初期設定が少しめんどくさいものは初期設定の仕方を残します。
本格的に個人的メモです。
よく使うアプリは以下。
- Discord
- slack
- notion
- chrome
- zoom
- Microsoft...

## 記事一覧
具体的な内容は下の下のリンクからアクセスしてご確認ください。
- [MacOS最初に設定しておきたい設定メモ](https://qiita.com/TakayoshiK/items/c96329b254835473763a)
- [ゼロからPython環境をHomebrew、pyenv経由で構築(MacOS)](https://qiita.com/TakayoshiK/items/e4273336044880d3eea0)
- [ゼロからNode.js環境をHomebrew、nodenv経由で構築(MacOS)](https://qiita.com/TakayoshiK/items/090e7e693cbbfa0a493a)
- [ゼロからDocker環境構築(MacOS、Docker Desktop)](https://qiita.com/TakayoshiK/items/cb941118a3d3e7e8b741)
DockerでPythonを1回だけ実行したいとき

Docker Hubの公式ページのやつそのままだとエラーになったので。

[Python - Official Image | Docker Hub](https://hub.docker.com/_/python)

コマンドプロンプトかターミナルかでカレントディレクトリの参照の仕方が変わるみたい。

- コマンドプロンプトで実行する時は`%cd%`
- エディタのターミナル系で実行する時は`$(pwd)`

実行するときはダブルクォーテーションを付けるといいっぽい。
Python2系は`python:2`を使ってください。

- コマンドプロンプト(Windows)
```bash
docker run -it --rm -v "%cd%:/usr/src/myapp" -w /usr/src/myapp python:3 python main.py
```

- Windows PowerShell、
```bash
docker run -it --rm -v "$(pwd):/usr/src/myapp" -w /usr/src/myapp python:3 python main.py
```
ESXiにAlmaLinux8.6のVMを構築する

# はじめに
- 本記事は、2022年7月末に書いたものです。
AlmaLinuxのページ構成や、バージョンなど変更があるかもしれません。
- ESXiのバージョンは7.0u2eです。
- AlmaLinuxに限らず、この手順で構築できると思います。

# イメージのダウンロード
AlmaLinuxのサイトからisoイメージファイルをダウンロードします。

https://almalinux.org/ja/

1. トップページにダウンロードページへのリンクがありますので、クリック。
2. x86_64のバージョン8.6のリンクをクリック。
3. RegionがJPのリンクいずれかをクリック。
どれでもいいはず。私は、ftp.iij.ad.jpを選びました。
4. AlmaLinux-8.6-x86_64-dvd.isoをクリックするとダウンロードが始まります。
※10GBくらいあるので時間かかります！

# イメージファイルのアップロード
ESXi HostClientで操作します。
1. ストレージを選択。
2. データストアブラウザをクリック。
3. ディレクトリを作成をクリック。
私は、imagefileという名前のディレクトリを作成しました。
4. imagefileディレクトリをクリックし、アップロードをクリック。
5. 先ほどダウンロードした、isoイメージファイルを選択してアップロード。

# 仮想マシン(VM)構築
ESXi HostClientで操作します。
1. ホスト画面から、`仮想マシンの作成/登録`を選択。
2. 作成タイプの選択では、`新規仮想マシンの作成`を選択。
3. 名前とゲストOSの選択は、以下のとおり選択。
a. 互換性：ESXi7.0U2仮想マシン
b. ゲストOSファミリ：Linux
c. ゲストOSのバージョン：CentOS8(64bit)　を選べばいいはず・・・
4. ストレージの選択：datastore1を選択（私の設定ではこれしかない）
5. 設定のカスタマイズは、お好きなスペックで設定。
6. 設定の確認画面で問題なければ完了。

# 仮想マシン(VM)完成
これで仮想マシンが完成です。
パワーオンするとAlmaLinuxが起動します。

以上です。細かな設定は別の記事にまとめます。
AWS（Amazon Web Service）とは？ 

Amazon Web Service(AWS)・・クラウドコンピューティングサービス

（簡単なイメージ）
サーバーやネットワークをインターネット経由で貸してくれるサービス
AWSはさまざまなサービスを提供しているので組み合わせ次第で、あらゆるアプリケーションやインフラを実現できる
ex)コンピューティング、ストレージ、データベース、分析、ネットワーキング、モバイル、開発者ツール、管理ツール、IoT、セキュリティ、エンタープライズアプリケーション

AWSの特徴
・システム運用に必要なサービス一式を借りられる
今までバラバラの事業者から借りていたインフラを一括で借りられるようになった。
・サービスを組み合わせやすい
AWS内で複数のサービスを組み合わせ、サービスを構築することが容易にできる
年々サービス間の連携が強化されている。もちろんAWS外のシステムとの連携も可能。
・従量制なので使う分だけ借りられる
自分が必要だと思う分だけ借りられる
・専門家でなくても使える
あまり技術が詳しくなくても操作できる、さまざまな仕組みが備わってる
・日本語と日本円の支払いに対応
・セキュリティの基準
・グローバル展開しやすい
AWSはサーバーなどを置いて運用するデータセンターを世界21の地域にある66の施設で運用している。日本では東京と大阪（大規模災害のバックアップ用）にある。
Cloud9でRails7の環境構築を行う

## 前提
- 学習用途のRailsプロジェクトを想定しています
- Rubyの環境構築を行なっていること（前回の記事で手順を記載しています）

https://qiita.com/chiepon115/items/eeea61818e0e8701f747

- Version
    - Ruby 3.0.2
    - Rails 7.0.0

## Railsプロジェクトの作成
### Railsのインストール
- `gem install rails -v 7.0.0 -N`でRails7.0.0をインストール

### Railsプロジェクトの作成
- `mkdir rails_projects`でRailsプロジェクト用フォルダを作成
- `rails _7.0.0_ new hello`でRailsプロジェクト作成
    - Railsのバージョン7.0.0を指定してインストール
    - `hello`という名前のプロジェクトで作成
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744934/c311917b-2afe-67ec-bd77-37bd3a6a9e28.png" width="600">

### Railsサーバを起動
- 動作確認のためホワイトリストを一時的にクリア
    - config/environments/development.rbに`config.hosts.clear`を追記

- `rails s`でwebサーバのpumaを起動
    - `rails server`でも可
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744934/95e50521-d2ba-14f3-26cb-8559979b4714.png" width="600">

- インターネット経由でwebアプリを確認
    - Previre > Preview Running Application　でPreviewを表示
    - 右上のPop out into new Window押下して新規タブを開く
        - プレビューウィンドウが表示されないため、新規タブで開きます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744934/4458b5bc-6af9-2edf-00df-d80cc5ffff44.png" width="600">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744934/0cd2a8a9-d5fb-f0c8-e038-5ea27160fcd9.png" width="600">

- Railsのwelcomeのページが開きました
    - railsとrubyのバージョンも確認できます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744934/50416383-3525-f10d-39f5-bcdec298d262.png" width="600">


## 最後に
- とりあえずのRailsプロジェクトの構築のみでした。次回Hello, Worldを表示させる手順をまとめようと思います。
- 手順書みたいになっているので、目的やコマンドの説明も書いていけるといいなと思いました（小並感）
- 仕事ではガンガンにgemのバージョン依存やモデルの関連、specなど分からないことたくさんなので、早く試行錯誤できる土台プロジェクトを作りたいです:cry:
DNSトンネリング とは

## 勉強前イメージ

攻撃の名前だった気がする・・・

## 調査

### DNSトンネリング とは

DNSの仕組みを利用してサイバー攻撃や情報漏洩に悪用する攻撃になります。
httpに比べてfirewallなどで制限されていない場合も多く、日常の中で大量にDNSの通信を行うので紛れ込ませることが可能です。

### 基本的なDNSの通信

基本的にはDNSの仕組みは以下になります。

![12022-07-30 # DNSトンネリング とは - diagrams.net - Google.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/fe78123d-ef30-3e3e-7620-a9f6ae89f5dd.png)

流れとしては以下になります。

1. クライアントPCからDNSサーバに聞きに行く
2. DNSサーバはわからないのでルートのDNSサーバに聞きに行く
3. ルートのDNSサーバはわからないのでcomのDNSサーバを教える
4. comのDNSサーバに聞きに行く
5. comのDNSサーバはわからないのでexampleのDNSサーバを教える
6. exampleのDNSサーバに聞きに行く
7. IPアドレスを教えてもらう
8. DNSサーバはクライアントPCにIPアドレスを教える

### 悪用される際のDNSの通信

それが悪用されると以下のような流れになります。

![22022-07-30 # DNSトンネリング とは - diagrams.net - Google.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/a887c314-0285-34ce-1eba-4e7bdff32f3a.png)

1. クライアントPCからDNSサーバに聞きに行く
2. DNSサーバはわからないのでルートのDNSサーバに聞きに行く
3. ルートのDNSサーバはわからないのでcomのDNSサーバを教える
4. comのDNSサーバに聞きに行く
5. comのDNSサーバはわからないのでexampleのDNSサーバを教える
6. exampleのDNSサーバに聞きに行く
7. TXTレコードを教えてもらう
8. DNSサーバはクライアントPCにTXTレコードを教える
9. 送られたマルウェアなどをダウンロードし、コマンド結果などを送付します

exampleのDNSサーバは悪意を持っていて、TXTレコードにマルウェアを仕込んだりデータを送るような指示を書いて送ります。
また1回の問い合わせで送れない場合は複数回の問い合わせで送信します。
そのため、情報漏洩に繋がったりします。

## 勉強後イメージ

DNSは普通にweb見てても発生するからぱっとすぐわかったりしないし
firewallでhttpに比べて制限されていることも少ないから使われるのね・・・・

## 参考

- [DNSを悪用する新たな標的型攻撃が日本を襲う](https://xtech.nikkei.com/it/atcl/column/15/071200172/021000009/)
- [標的型攻撃で使われるトンネリング技術](https://engineers.ffri.jp/entry/2021/08/02/191213)
エンジニア転職　9ヶ月目振り返り

こんにちは！未経験からエンジニア転職した『まさきち』です。
エンジニアに転職して９ヶ月経ちましたので業務や感じた事などを振り返ろうと思います。

これまでの振り返りは下記の記事に書きましたので合わせて読んでいただけると嬉しいです。

https://qiita.com/masakichi_eng/items/be6604f78ebf90f5df69

https://qiita.com/masakichi_eng/items/9495eac6e3ae27898ca9

https://qiita.com/masakichi_eng/items/1d5cbafcca60b5746fe8



9ヶ月目は新規案件の仕様書や設計書を書きながら実装を行なっておりました。
詳細設計書、機能設計書、単体テスト仕様書など様々なドキュメントを作成することに。。。
このようなドキュメント作成の経験はなかったので、以前のプロジェクトで作成されたものを参考にして作っていきました。

# 仕様書関連

詳細設計書
画面単位で作成して画面に表示される項目(データ取得先も併せて)、使用できる機能(処理内容の詳細)、条件(ログインの有無)などを細かく記述していきました。

機能設計書
アプリケーションで使用できる機能一覧を作成しそれに対してプログラムをどのように実装するかを設計しました。
例えば各機能に対して、ルーティング、コントローラー、ビュー、などを割り当てる作業になります。

単体テスト仕様書
自分の作成したプログラムが期待通りに動くかをテスト出来るように作成しました。
詳細設計に記述されている表示項目がしっかり表示されているか、入力チェックが効いているか、画面遷移やデータの引き継ぎがなされているかなど確認しました。

# 実装

microCMS
ヘッドレスCMSのmicroCMSを使いコンテンツ管理周りを実装しました。
コンテンツ作成、編集機能、画像データの管理などはmicroCMSの管理画面で管理出来るので
アプリケーション側はデータを表示する機能を作るだけなのでコンテンツ作成/編集機能を作り込むことなく、データの管理もしなくて良いため、スムーズにシンプルな実装ができます。

https://document.microcms.io/tutorial/php/php-top

CSVアップロード
CSVのデータをLaravelの機能を使ってmySQLのデータベースに取り込む機能を作成しました。
市区町村等のデータを一括で作成できるので便利ですね。(全てのパターンを自分で作ると大変ですから、)

https://codelikes.com/laravel-seeder-csv-json/

S3画像アップロード
アプリケーションのストレージに画像をアップロードしていくと重くなってしまうので、AWSのストレージ、S３に保存します。ローカル開発環境でS3への保存を再現するためにminIOコンテナを作って検証しました。

https://www.ritolab.com/entry/232

# まとめ
成長を感じた部分
初めて触れる技術でも、難易度がそこまで高くない場合は自分で調べながら実装できるようになってきました。
コードを書くときに、今までは実装できればいいかな、と思っていたけど、クリーンアーキテクチャを意識して考えられるようになった。ここはもっと共通化できる部分だーとか、逆にまとめすぎると可読性が下がりそうだなーとか。

課題に感じた部分
進捗管理がうまくできておらず、蓋を開けてみれば予定よりも遅れててまずい！っと言った場合もあるので、
こまめに進捗を管理、共有していきたいと思いました。

# 余談
今はフル出社ですが、来月から段階的にリモート導入するらしい！？　結果に乞うご期待。
また、最近、Twitterなどで一緒に働きたいと言っていただける機会が増えておりありがたいと感じています。

以上になります。最後まで読んでいただきありがとうございました。
SPAをわかりやすく説明する

SPA・・・Single Page Applicationの略

特徴
ブラウザによるページ遷移を行うことなく、単一のWebページでコンテンツの切り替えをおこなうアプリケーションのこと。

SPAサイトをまとめたものはこちら
https://bm.s5-style.com/category/technic/spa

従来のWebアプリは、
ユーザのアクション→それに対しサーバーに通信（リクエスト）→ユーザーでHTMLを作成し、ブラウザに返す（レスポンス）→HTMLに反映
この方式では変更のない要素（フッター、ヘッダーなど）までも読み込む必要があり、時間（コスト）がかかる。
ex)ページ遷移の時に一瞬画面が白くなる特徴。

それに対して、SPAは、
ユーザーのアクション→それに対して必要なデータのみをサーバーに要求→返ってきたデータをJSで処理→処理をHTMLに反映
このように、ブラウザでできる処理はJSで終わらせることで、サーバーとの通信量を抑え、動作の向上が図れる。また、データの取得は非同期的に実行でき、ページ遷移時に画面がチラつくことなく、快適に閲覧できる。

SPAを使うメリット
・ユーザー体験の向上
ページの表示速度がとても重要で、ECサイトでは売り上げに直結する
・コンポーネント分割が容易になることでの開発効率のアップ
各ページごとにHTMLファイルを用意するケースと違い、SPAはHTMLファイルは１つのみでJSによるDOMの書き換えで画面遷移をしている。すなわち、各要素をコンポーネントで定義している。
GitHub を登録


まずはユーザー名(GitHubに登録したもの)を登録
```
$ git config --global usr.name "ユーザー名"
```

メールアドレス(GitHubに登録したもの)を登録
```
$ git config --global user.email "メールアドレス"
```

mergeの際にファストフォワードが起きないようにする設定
```
$ git config --global merge.ff false
```

pullの際に毎回リベースする設定
```
$ git config --global pull.rebase merges
```

設定ができているかを確認
```
$ git config --list
```
↓
↓
```
credential.helper=osxkeychain
user.name="name"
user.email=email
core.editor=code --wait
alias.ci=commit
alias.st=status
alias.br=branch
alias.co=checkout
credential.helper=cache --timeout=86400
usr.name=name
merge.ff=false
pull.rebase=merges
```
このように表示されればOK
flutterでAndroidの地図(map)が正しく表示されない問題

# 概要
flutterでgoogle mapを表示させたかったが、webではうまくいきAndroidではうまく行かなくて、下記の画面のようにMakerとかは表示されるが、大事な地図の部分だけ表示されなかった
![Screenshot_20220730_134840.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/454c8470-2ea1-77eb-9db5-d9e66217ebd2.png)


## 対処方法
自分は下記の２つの対応を加えたところ正しく表示された
### 1. Maps SDK for Androidを有効にする

とても恥ずかしい話なのですが、Maps JavaScript APIの方は有効にしていたのですが、Maps SDK for Androidを有効にできておらず...
下記の画面で有効にしました
![スクリーンショット 2022-07-30 13.54.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/3fa87b1c-6943-1432-d2ba-f92b23c64c43.png)

### 2. mapTypeの変更

web側で表示されているマップの見え方を買えたく
```dart
    return Scaffold(
      body: GoogleMap(
        mapType: MapType.none,
        initialCameraPosition: _kGooglePlex,
        markers: _createMarker(),
        onMapCreated: (GoogleMapController controller) {
          _controller.complete(controller);
        },
      ),
```
このようにMapType.noneを指定していたのですが、これが良くなかったみたいでこの部分を削除 or MapType.normalに変更したところ問題なく動きました...
Quartoで日本語PDFを作成する

## Quartoとは

QuartoはR markdownがR言語以外でも利用可能になったすごいやつです。RStudio社の推進するプロジェクトで、データサイエンスやR言語の世界を超えて、科学界全体に大きなインパクトを与えることを目標としているそうです。

https://quarto.org/

Quartoの背後では、PandocやLaTeXが動作しているため、日本語の環境構築にはひと手間必要です。

## Quartoを日本語にするYAMLヘッダー

結論から書くと、[TinyTeX](https://yihui.org/tinytex/)をインストールして、

XeLaTexを使う場合は、

```yaml
---
title: "fda"
format: pdf
pdf-engine: xelatex
documentclass: bxjsbook
classoption: xelatex,ja=standard
editor: visual
---
```

もしくは、LuaLaTeXを使う場合は、

```yaml
---
title: "fuga"
format: pdf
pdf-engine: lualatex
documentclass: ltjsarticle 
editor: visual
---
```

とすれば良いようです。これがベストプラクティスというわけでもないと思うので、良い方法があったら、コメント欄で教えてください。もしくは、新しくQiita記事やブログ記事、Zenn記事などを作成してコミュニティ全体の知見を増やしてくださると助かります。この記事は以上です。

参考文献：

https://qiita.com/Atsushi776/items/9ef1e5d744e2b91c61ee

https://qiita.com/nozma/items/1c6b000b674225fd40d7
laravel/breezeをインストールしようとしたらエラーが出た

# 概要

- composerを用いてbreezeをインストールしようとしたらエラーが出たので筆者の場合の解消方法をまとめる。

# エラー

- どうやらバージョンがコンフリクトしている模様

```
$ composer require laravel/breeze

Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
Using version ^1.11 for laravel/breeze
./composer.json has been updated
Running composer update laravel/breeze
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - laravel/breeze[v1.11.2, ..., 1.x-dev] require illuminate/console ^9.21 -> found illuminate/console[v9.21.0, ..., 9.x-dev] but these were not loaded, likely because it conflicts with another require.
    - laravel/framework is locked to version v9.1.0 and an update of this package was not requested.
    - laravel/breeze[v1.11.0, ..., v1.11.1] conflict with laravel/framework <9.19.0.
    - Root composer.json requires laravel/breeze ^1.11 -> satisfiable by laravel/breeze[v1.11.0, v1.11.1, v1.11.2, 1.x-dev].

You can also try re-running composer require with an explicit version constraint, e.g. "composer require laravel/breeze:*" to figure out if any version is installable, or "composer require laravel/breeze:^2.1" if you know which you need.

Installation failed, reverting ./composer.json and ./composer.lock to their original content.
```

# 解決までの経緯

- 下記を実行してcomposerのupdateを実施した。

    ```shell
    composer update
    ```

- 再度下記を実行したところ問題なくbreezeがインストールできた。

    ```shell
    composer require laravel/breeze --dev
    ```
フルスクリーンでレイマーチ(RayMarching)

# 環境
Unity2021.3.4f1
# 概要
フルスクリーンでRayMarchingをやってみました。
この10個のメタボールからなる形状とその影はRayMarchingで描画しています。黄色の床はUnityのPlaneのGameObjectです。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/k/kenken5050/20220730/20220730123943.png)

「3D Objects > Quad」でQuadを作成して、カメラの階層に置き、このシェーダのマテリアルを設定すれば動作すると思います。

Clusterのワールドクラフトで実装してみました。

https://cluster.mu/w/f4058816-df98-429d-b793-908c7896263d


Clusterでは自作スクリプトを動作させることができないのでシェーダで全部やっています。
デスクトップ版でしか試してないのでVRだとまともに見えないかも知れません。
<br><br>


[ここ](https://kenken5050.hatenablog.com/entry/2022/07/30/125625)に全コード記載しています。

頂点シェーダでは以下で視錐台（ニアクリップ面）のコーナーのワールド座標を求めています。
```hlsl
float4 posWS = mul(inverse(UNITY_MATRIX_VP), o_pos);
```

影の描画パスのためにカメラ位置も同じような感じで求めています。_WorldSpaceCameraPosは使用していません。
```hlsl
inline float3 GetCameraPos()
{
	//_WorldSpaceCameraPosを使用しない
	//影描画の時はカメラ位置はライト位置になってほしい為
	float3 cpos = mul(inverse(UNITY_MATRIX_V), float4(0, 0, 0, 1)).xyz;
	return cpos;
}
```


# 参考

https://gurutaka-log.com/ray-marching-tutorial:title
ディスク容量のアラートをSlackで通知するジョブ

ディスク容量のアラート通知を出すジョブを作りました。
定期実行すればいいかな・・？という。

```groovy
/**
 * 容量チェックアラートジョブ
 */
pipeline { 
    agent {
        label "動かしたいノード" // どこのマシンの容量チェックしたいか次第
    }

    stages {
        stage('disk容量チェック') {
            steps {
                script {
                    def command = """
                    df --total -h | tail -1 | sed -r 's/^.* ([0-9].*)%.*\$/\\1/'
                    """
                    def usage = sh(script:command, returnStdout:true)
                    println 'usage:' + usage
                    usage = usage.replaceAll("\n", "")
                    int usageValue = usage as int
                    if (usageValue > 60) { // いい感じの数値で実際はやる
                        def notify_message = """:alert: `[hogeマシン]のディスク容量が${usage}%です。`
                        """
                        if (params.notify_channels != '') {
                            slackSend channel: notify_channels,
                            message: notify_message,
                            color: "danger"
                        }
                    }
                }
            }
        }
    }       
}

```

# つまづいたとこ
jenkinsは、pipeを使うとうまくいかなかったり、sedを使ったり、jq使ったりするとうまくいかなかったりすることがあります。
'か、"かの問題があったりするんですが、私がつまづいたのは、

1. 主にぐぐると大体出てくる方法ではなく、それ＋sedコマンドに-rをつけないとだめだった
1. 抜き出しで、\1/する時に、さらに\をつける必要があった

という部分。$とかは変数扱いになってしまうので、\つけないといけないというのはわかってたのですが、sedなんだかうまく動かないなー　みたいなのはちょこちょこあります。

# 感想
ジョブ自体の失敗・成功通知は入れても良かったもしれないけど、どっちでもいいかな。
sedコマンドはまだまだ使い慣れてない感。

# 参考

https://qiita.com/koara-local/items/2911bd81df2420a420ad

https://tech.thekyo.jp/%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E5%AE%B9%E9%87%8Fdf%E3%82%92%E7%9B%A3%E8%A6%96%E3%81%97%E3%81%A6%E3%80%81%E8%A6%8F%E5%AE%9A%E5%80%A4%E4%BB%A5%E4%B8%8A%E3%82%92%E8%B6%85%E3%81%88%E3%81%9F/
2022年版 flutterでbottom sheetを表示する方法

最近のアプリでは一般的になっているbottom　sheet

```dart
  void _showBottomSheetMenu(BuildContext context) {
    showModalBottomSheet(
        context: context,
        shape: const RoundedRectangleBorder(
          borderRadius: BorderRadius.vertical(top: Radius.circular(25.0)),
        ),
        builder: (builder) {
          return Container(
            height: 350.0,
            color: Colors.transparent,
            child: const Center(
              child: Text("This is a modal sheet"),
            ),
          );
        });
  }
```
このようなメソッドを定義して
例えばfloatingActionButtonのonPressedで呼び出すなら
```dart
      floatingActionButton: FloatingActionButton(
        onPressed: (){
          _showBottomSheetMenu(context);
        },
        child: const Icon(Icons.add)
      ),

```
こんな感じでできてしまう
![スクリーンショット 2022-07-30 13.04.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/11a630e4-507b-c149-69c1-5437595bd186.png)
Excelの列数をアルファベットに変換する方法を丁寧に調べた

## 要約
- 「あ、こいつネットでコピーしてきたな。しかも間違ってるじゃんｗｗｗ」みたいになったら嫌だなと思ったので気が済むまで考えました。
- テストの書き方がよく分かりません。

``` test.py
def number_to_excelABC(n):
    excelABC = ""
    while n > 0:
        n,a =divmod(n-1,26)
        excelABC = chr(a+65) + excelABC
    return excelABC

def test_numbert_to_excelABC_function(func):
    test_list = [1,26,27,52,53,676,677,702,703,1000]
    answer_list = ["A","Z","AA","AZ","BA","YZ","ZA","ZZ","AAA","ALL"]
    compare_list = [func(t) == ans for t,ans in zip(test_list,answer_list)]
    if all(compare_list):
        print("pass the test")
    else:
        print("fail the test")
        print(test_list)
        print(answer_list)
        print(compare_list)
        
test_numbert_to_excelABC_function(number_to_excelABC)
```

## excel10進数を考える
[1, 2, 3, 4, 5, 6, 7, 8, 9, X, 11, 12, ……, 19, 1X, 21, 22]
みたいになっている。数字の0がない代わりに10個目の数字で10を表すXが存在する。
他にも、100と101は「9X,X1」になる。110が「XX」で111が「111」になる。
**つまり。。。よくわかんないってこと**

## 気を付けなければいけないポイント
#### 普通のn進変換とは繰り上がるタイミングが異なる
Excel26進数では26はZ、27になって初めてAAとなる
52,53も普通の26進数では20,21と表すところだが、AZ＝26＋26とBA＝52+1のような表し方になっている（数字のゼロが無いので52+0=B0は表現できない）
商が増えるタイミングをずらすために、26で割り算をする前に1を引く。1ずらした分は文字列に変換する際に調整する

## 具体例
#### 1373→AZUの変換をする
答えから考えるとA=1, Z=26, U=21なので
**1373 = 1×26×26 + 26×26 + 21**と分解できればOK
1. 1を引いて26で割る→52余り20
1. 21番目の文字Uが一桁目となる
    **(以降はn=0までループ)**
1. 52-1=51は1余り25
1. 二桁目は26文字目のZとなる
    **(ループ)**
1. 1-1=0は0余り0
1. 1番目の文字Aが3桁目となる
    商が0となったら終了




## 謝辞
数字のゼロを考えてくれたインドの何某さん。ありがとうございます
PHPファイルを自動整形(vscode,intelephense)

## 問題の背景
phpファイルに`<div>`タグなどのhtmlタグを記述したり、ソースコードをベタ張りしても、初期状態ではインデントが調整されないため、見づらくて不便です。

そこで、php専用のフォーマッターを導入するとインデント調整やhtmlタグを自動で補完してくれるので便利です。
今回は、vscodeの拡張機能である`intelephense`を導入しました。

## 導入・設定方法
### intelephenseをインストール
vscodeの左側にあるブロックアイコン(Extensions)の検索窓から`intelephense`で調べます。
![スクリーンショット 2022-07-30 12.21.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954882/08e704f4-8ff3-bef2-41f3-a8ee3f352554.png)
すると`PHP Intelephense`のインストール画面が出るので`Install`を押してインストール。

### Formatterの指定
フォーマッターの指定をしないとphpファイルにおいて自動整形をしてくれないのでフォーマッター指定する設定を行います。

左下の歯車アイコンのドロップダウンリストより`Settings`をクリック。
![スクリーンショット 2022-07-30 12.19.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954882/129bebfe-2d22-a401-db3c-f1bf36eb5cce.png)

そうすると`Setting`タブが開きます。
なお、`Settings`の項目が多いので、こちらも検索窓から`formatter`と入力。
![スクリーンショット 2022-07-30 12.20.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954882/6c3292a6-cc93-3cd8-e4c9-e27c04e1d92d.png)
すると、`Editor: Default Formatter`の項目が現れるので、先ほどインストールした`PHP Intelephense`を選択しておきます。

### 入力時に整形するように変更
phpファイルにコードを入力または、ペーストしたタイミングで自動整形してくれるように、先ほどフォーマッターを指定した下にある、`Format On Paste`と`Format On Save`にチェックが入っていることを確認します。
![スクリーンショット 2022-07-30 12.33.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954882/b08fa842-5ace-0f3a-905f-f5fc948ec539.png)

## 動作確認
htmlタグのみのコードをコピペして整形されるかみていきます。
### phpファイルにペースト(整形なし)
[![Image from Gyazo](https://i.gyazo.com/6d5f1d1d917eab39202fe4a615098c58.gif)](https://gyazo.com/6d5f1d1d917eab39202fe4a615098c58)
### phpファイルにペースト(整形あり)
[![Image from Gyazo](https://i.gyazo.com/94b500ca17106c1516624e97b8d57860.gif)](https://gyazo.com/94b500ca17106c1516624e97b8d57860)
### ソースコード

```html
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Blog</title>
<!-- Bootstrap core CSS -->
<link href="./css/bootstrap.min.css" rel="stylesheet">
<style>
.bd-placeholder-img {
font-size: 1.125rem;
text-anchor: middle;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
@media (min-width: 768px) {
.bd-placeholder-img-lg {
font-size: 3.5rem;
}
}
</style>
<!-- Custom styles for this template -->
<link href="./css/signin.css" rel="stylesheet">
</head>
<body class="text-center">
<main class="form-signin">
<form>
<h1 class="h3 mb-3 fw-normal">ログインする</h1>
<label class="visually-hidden">ユーザ名</label>
<input type="text" name="name" class="form-control" placeholder="ユーザ名" required autofocus>
<label class="visually-hidden">パスワード</label>
<input type="password" name="password" class="form-control" placeholder="パスワード" required>
<button class="w-100 btn btn-lg btn-primary" type="submit">ログインする</button>
<p class="mt-5 mb-3 text-muted">&copy; 2021</p>
</form>
</main>
</body>
</html>
```
dockerの基本操作

# この記事の目的

dockerの基本操作について記述する

# dockerの通常運用

## dockerのインストール

https://www.docker.com/get-started/

## dockerインストールの確認

```terminal
＄ docker --version
```

## dockerイメージの準備（Docker Hubから取得）

https://hub.docker.com/

以下はMySQLの例

![スクリーンショット 2022-07-30 10.45.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711205/be94d2f8-033e-a274-45e7-005f62ad4964.png)

```terminal
// mysqlのdockerイメージをプル
$ docker pull mysql
```

```terminal
// 存在するdockerイメージの確認
$ docker images
```

## dockerコンテナの起動(Docker Hubから取得）

以下はMySQLの例

![スクリーンショット 2022-07-30 10.51.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711205/bf0f8423-58ca-dceb-5820-91b5b8362e08.png)

```diff_terminal
// mysqlのdockerコンテナ起動(docker Hub）
- $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
// mysqlのdockerコンテナ起動(docker Hubカスタマイズ）
+ $ docker run --name ks-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -d mysql

※上記はコンテナ側の環境設定をしている
※上記の:tagはdocker HubにあるTagsにあるバージョンを設定する
 今回はlatestなので省略する
※-pでポートフォワディングの設定(ローカル:コンテナ)

// dockerコンテナ起動の確認
＄ docker ps
```

```terminal
// dockerコンテナ起動の確認
＄ docker ps
```

![スクリーンショット 2022-07-30 10.58.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711205/0d3b8421-aa03-c78a-4923-ea0ccdad7512.png)

// dockerコンテナの中に入り、コンテナ内で操作

```terminal
// kｓ-mysqlコンテナ内で操作
$ docker exec -it ks-mysql bash

// mysqlにログイン
bash-4.4# mysql -u root -p

// mysqlの操作
mysql> CREATE DATABASE ks_db;
mysql> exit

// コンテナから抜ける
Ctrl + P + Q
```

```terminal
// 起動中のコンテナを確認
＄ docker ps

// コンテナの停止
$ docker stop ks-mysql

// 起動中のコンテナを確認
$ docker ps

// すべてのコンテナを確認
$ docker ps -a

// コンテナの起動
$ docker start ks-mysql

// 起動中のコンテナを確認
$ docker ps
```

## ローカル側からコンテナ内のデータを確認する

```terminal
// ローカル側でMySQLサーバ起動
$ mysql.server start
```

※mysqlログインできなかったのでそちらの対処

```terminal
// サーバの停止
$ mysql.server stop

// セーフモードで起動
$ mysqld_safe --skip-grant-tables &

// 別コマンドラインでmysqlに接続
$$ mysql

// ユーザ設定の確認
$$ mysql> use mysql
$$ mysql> select Host, User, authentication_string from user;

// ユーザをすべて削除
$$ mysql> truncate table user;

// GRANTテーブルからすべて再読み込み
$$ mysql> flush privileges;

// rootユーザを再作成
$$ mysql> CREATE USER 'root'@'localhost' IDENTIFIED BY 'PASSWORD';
$$ mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
$$ mysql> FLUSH PRIVILEGES;

※上記でも上手くいかなかったので、MySQLの再インストール
// mysqlの停止
$ mysql.server stop
// homebrewのインストール内容を確認
$ brew list
// homebrew内でアンインストール
$ brew uninstall mysql
// homebrew内でインストール
$ arch -arm64 brew install mysql ※1 arch -arm64をつけないといけない
```

※1 homebrewでmysqlのインストール時のエラー対処

Cannot install under Rosetta 2 in ARM default prefix (/opt/homebrew)!

https://webrandum.net/cannot-install-under-rosetta2-in-arm-default-prefix/

※homebrew内でmysqlを再インストールしたけどできなかったので
　おそらくmysqlの環境構築の問題→これは後日対応するとして先に進む

##  コンテナの停止と削除

```terminal
// コンテナの停止

// コンテナの削除

// イメージの削除

```
Autodesk Inventor API Hacking (安全にDefinitionに到達する)

# 0. はじめに
[Freeradical](https://www.freeradical.jp)の中の人、[yamarah](https://qiita.com/yamarah)です。
ツールを作ったものの、後日`Occurrence.Definition`を参照する部分で例外が発生する、ということがあります。
想定していなかった条件に遭遇したからなのですが、毎度毎度この罠にハマるので、条件を整理してみます。
# 1. Occurrence.Definition
`Occurrence.Definition`の取得で注意すべき条件です。
|条件|Definition|ReferencedDocumentDescriptor.ReferenceMissing|Suppressed|Enabled|
|:--|:--|:--|:--|:--|
|省略|例外送出|...|true|...|
|リンク切れ|例外送出|true|...|...|
|仮想コンポーネント|VirtualComponentDefinition|ReferencedDocumentDescriptorがnull|...|...|
|[有効]がoff|〇|...|...|false|

使っている事例を見たことが無いのですが、[有効]がoffの場合も調べました。これは無視して構わなさそうです。
やっかいなのは、省略とリンク切れで、これらの場合は`Definition`に触るだけで例外が送出されます。また、リンク切れの判断に使う`ReferencedDocumentDescriptor.ReferenceMissing`は、仮想コンポーネントの場合に`ReferencedDocumentDescriptor`がnullであるという罠があります。
これらの条件を加味して、判断のコードは以下になります。評価順序が大切です。

```c#
var occ = InventorApplication.ActiveDocument.SelectSet[1] as ComponentOccurrence;
string message;

if (occ is null)
{
    message = "occ is null.";
}
else if (occ.Suppressed)
{
    message = "occ is suppressed.";
}
else if (occ.ReferencedDocumentDescriptor?.ReferenceMissing == true)
{
    message = "occ's reference is missing.";
}
else if (occ.Definition is VirtualComponentDefinition)
{
    message = "occ is a virtual component occurrence.";
}
else
{
    message = "occ is a normal occurrence.";
}
Console.WriteLine(message);
```

# 2. BOMRow.ComponentDefinitions
Occurrenceを省略して、BOM数量が0になった場合は注意が必要です。`BOMRow`は数量0のまま残るのですが、`BOMRow.ComponentDefinitions`はitem数0のCollectionを返します。
ですので、次のようなコードは、そのうちに例外を送出します。

```c#
foreach (BOMRow bomRow in bomRows)
{
    var definition = bomRow.ComponentDefinitions[1];    // ここで例外送出の可能性
    // 何か処理
}
```

# 99. 親の記事に戻る
[Autodesk Inventor API Hacking (概略)](https://qiita.com/yamarah/items/cee08eb8f2b7aecbda83)
Unity 基本まとめ

# 目的
他エンジンとごっちゃになる事があるため。

# 座標系
左手y-up
左手系なので、軸先端から中心を見て時計回りが正方向

# ポリゴンの向き
N字（時計回りが正）

# 行列のメジャー
c#　列メジャー
shader : 行メジャー

# Quartenionの順序
https://qiita.com/tangotarou2/items/a9e374bcc10da4eb59d1


# 計算順序
ZXY

# Pivot とCenter
Center : Unityが表示する座標系が基準
pivot : 3dモデリングツールが表示する座標系が基準
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/6d37687a-597b-c1a8-ea28-5f55a6cb57fd.png)

# Quartenion
回転情報のみ、スケール情報は捨てられる。

# Aos/SoA
AoS(array of structures)
SoA(structure of arrays)

#　座標の親子関係

親
local_position = 0
local_rattion = 0
local_scale = 1,1,1

子供：Blazer_chinatsu
local_position = (3,3,3)
local_rattion = 0,0,0

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/eae76b6e-3575-64ee-c380-3e75b7f1ed89.png)

(1) 親のscale.z = -1 (z軸反転)
この状態で、親のlocal_scale = 1,1,-1 とする。これはZ軸の反転となる。

位置も移動する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/ed819055-e026-0b66-8613-ab76c4e545ce.png)

(2)  子のscale.z = -1 

親のscaleを初期状態に戻してから、子供のscale.z = -1 にする。
これはその場でZ軸反転をする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/c9390103-5981-0140-8c7c-75f72667934d.png)

(3) 子供のlocal_rotation = 0,45,0
回転に関しても同じで、子供を回転させた場合はその場で回転する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/a81ecfe5-801e-23b1-10ad-cfbab6469f69.png)

(4) 親のlocal_rotation = 0,45,0

親を回転させた場合は、原点を中心に移動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/543a45eb-610a-b1ee-83d2-3f67622b2786.png)

# 主要な座標系


|Unity  |UnReal  |Blender  |
|---|---|---|
| 1|2  |3 |
|左手Yup  |左手Zup  |右手Zup  |

|FBX  |3dtile  |glTF  |
|---|---|---|
|選択できる |2  |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/d47b5707-00ec-236e-61d1-825974f41457.png)  |
|左手Yup  |左手Zup  |6  |

メモ：http://www.f.waseda.jp/moriya/PUBLIC_HTML/education/classes/infomath6/applet/fractal/coord/

https://kuwamai.hatenablog.com/entry/2021/01/31/232610
エラーを無視せずLaravel9プロジェクトを作成する

# はじめに
[前回記事](https://qiita.com/asuka-hanerock/items/1e14eff782ce6b03085e)のLaravelプロジェクトがとにかく動けば良いという簡易版だったので、理解を深めるためにちゃんと設定する方法を書いていきます

誤っている点やもっと良い方法があればコメントにてご教授お願いいたします
<!-- 発端や概要を記載 -->


<!-- 各チャプター -->
<a id="#Chapter0"></a>
# 前提
PHP、Composerがインストールされており実行できる状態であること

<a id="#Chapter1"></a>
# 構築環境
OS：Windows 11 Home
ターミナル：Windows11デフォルトのターミナル（PowerShell）
ブラウザ：Google Chrome

<a id="#Chapter2"></a>
# 前回の問題点
出てきたエラーに対して対処をせず無視をするという強行手段を取っていた点
根本解決にはなっていないし理解が浅すぎたと反省しつつ今回はちゃんと対応していきます

<a id="#Chapter3"></a>
# プロジェクトの作成
```bash
composer create-project --prefer-dist laravel/laravel PROJECT_NAME "9.*"
```
するとエラー発生
```bash
Your requirements could not be resolved to an installable set of packages.

Problem 1
    - laravel/framework[v8.75.0, ..., 8.x-dev] require league/flysystem ^1.1 -> satisfiable by league/flysystem[1.1.0, ..., 1.x-dev].
    - league/flysystem[1.1.0, ..., 1.x-dev] require ext-fileinfo * -> it is missing from your system. Install or enable PHP's fileinfo extension.
    - Root composer.json requires laravel/framework ^8.75 -> satisfiable by laravel/framework[v8.75.0, ..., 8.x-dev].
```
エラー内容としてはfileinfoという拡張機能が有効になっていないということで、これを有効にしたらクリアできます
ターミナル上での編集が嫌いという理由でVSCode上で編集しますが、ターミナル上で実施しても問題ありません

編集するファイルはエラーの下の方に表示される`php.ini`です
私の場合は921行目にありました

```php.ini
;extension=fileinfo
       ↓
extension=fileinfo
```
セミコロンを外してファイルを保存すると有効化できます
先ほどのコマンドで途中までインストールが走っているので一度フォルダを消してから再実行します
1番下に  ` INFO  Application key set successfully.`と表示されればインストールは無事完了です

<a id="#Chapter3"></a>
# 動作確認
```bash
cd PROJECT_NAME
php artisan serve
```

ローカルサーバーが起動したら表示されているURLにアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1956952/f1f2df8e-f1e8-815e-453b-a2cbd65fa744.png)

こんな画面が表示されればOKです
paizaでアセンブラ その15


# 概要
paizaでアセンブラ、やってみた。

# 参考にしたページ

https://qiita.com/s0sasaki/items/3651837a9a52f20ce2c6

# サンプルコード

```
import subprocess
import os

def gcc():
    c_file = 'test.s'
    test_c = """
//.intel_syntax noprefix
.text
.globl main
main:
	pushq 	%rbp
	movq 	%rsp, %rbp
	pushq 	$6
	pushq 	$3
	popq 	%rax
	addq 	%rax, (%rsp)
	pushq 	$2
	popq 	%rax
	subq 	%rax, (%rsp)
	popq 	%rsi
	leaq 	IO, %rdi
	movq 	$0, %rax
	callq 	printf
	pushq	$3
	pushq 	$4
	popq 	%rax
	imulq 	(%rsp), %rax
	movq 	%rax, (%rsp)
	pushq 	$2
	popq 	%rbx
	popq 	%rax
	cqto
	idivq 	%rbx
	pushq 	%rax
	pushq 	$1
	popq 	%rax
	addq 	%rax, (%rsp)
	popq 	%rsi
	leaq 	IO, %rdi
	movq 	$0, %rax
	callq 	printf
	pushq 	$2
	pushq 	$3
	addq 	$8, %rsp
	movq 	(%rsp), %rax
	pushq 	%rax
	movq 	(%rsp), %rax
	pushq 	%rax
	pushq 	$1
	popq 	%rax
	addq 	%rax, (%rsp)
	popq 	%rax
	addq 	%rax, (%rsp)
	popq 	%rax
	addq 	%rax, (%rsp)
	pushq 	$7
	movq 	(%rsp), %rax
	pushq 	%rax
	popq 	%rsi
	leaq 	IO, %rdi
	movq 	$0, %rax
	callq 	printf
	popq 	%rsi
	leaq 	IO, %rdi
	movq 	$0, %rax
	callq 	printf
	popq 	%rsi
	leaq 	IO, %rdi
	movq 	$0, %rax
	callq	printf
	movq 	$0, %rax
	leaveq
	retq
	.data
IO:
	.string "%lld"
"""
    with open(c_file, 'w') as f:
        f.write(test_c)
    #os.system("cat test.s")
    os.system("gcc -no-pie %s" % c_file)
    os.system("./a.out")
    #os.system("ls")
    
if __name__ == '__main__':
  gcc()

```


# 実行結果

```
77777
```

# 成果物


https://paiza.io/projects/xqRb9WsrUsa2DyjIQT8zIA?language=python

以上。
Linuxについて１１（自分用メモ




・メモリ上で実行中のプログラムのことをプロセスという。

●プロセスの情報を表示
ps ［オプション］

オプション一覧
a 他のユーザーの情報も表示
u ユーザー名を表示
x 端末から実行されたものではないプロセス（サーバープロセスなど）も表示

プロセスを起動すると、プロセスごとに固有のID番号が割り当てられる。これをプロセスIDという。
※psコマンドでは「-」をつけない。

●プロセスの親子関係の表示
プロセスは実行中の他のプロセスから起動される。これをフォークという。起動元のプロセスを親プロセス、親プロセスが起動したプロセスを子プロセスという。
pstree ［オプション］

topコマンドを使うとプロセスの実行状況をモニタリングできる。
Qキーを押すとtopコマンドを終了できる。

・プロセスに送る信号をシグナルという。
主なシグナル
９　KILL　強制終了
１５　TERM　終了（デフォルト）
１８　CONT　再開
１９　STOP　一時停止

●シグナルの送信　KILLコマンド
kill -[シグナルID] プロセスID
kill -s [シグナル名] プロセスID

※killコマンドではデフォルトでTERMコマンドが送られるので、シグナルを指定しなくても構わない。もし、TERMシグナルを送ってプロセスが反応しないときは、プロセスが以上動作を起こしている可能性がある。そのままでは終了しないのでkillコマンドを使う。

●プロセスの強制終了
kill -s KILL プロセスID

※一般ユーザーは、自身の実行したプロセスのみ終了させることができる。rootユーザーは全てのプロセスを終了することができる。

●killallコマンド
killallコマンドを使うとプロセスIDではなく、プロセス名を指定できる。
例）killall −10 vim
vimというプロセス名のプロセスを終了。

・ユーザー側の処理の単位をジョブという。
ジョブにはフォアグラウンドジョブとバッググラウンドジョブがある。

バッググラウンドジョブを実行するには、コマンドラインの末尾に「&」とつける。

●実行中のジョブを確認
jobs

●ジョブをフォアグラウンドで確認
fg ［%ジョブID］

フォアグラウンドでジョブが実行されている最中にCtrl＋Zキーを押すと、そのジョブを一時停止状態にできる。そのジョブをバッググラウンドで再開させるには、bgコマンドを使う。

bg [%ジョブID]
コンパイラを作る。 その5

# 概要

コンパイラを作る。
スタック指向言語ソースをコンパイルしてアセンブラを出力してみた。

# 参考にしたページ

https://qiita.com/s0sasaki/items/3651837a9a52f20ce2c6

# 命令セット


|コマンド	|意味|				stackの状態|
|:--|:--|:--|
|1	|stackに整数 1を積む。			|1個増える
|. 			|stackを数値で印刷。		|1個減る
|dup			|stackにコピーを積む。		|1個増える
|drop		|stackを一個減らす。			|1個減る
|+			|stack-1,stackの加算を求める。	|1個減る
|-			|stack-1,stackの減算を求める。	|1個減る
|*			|stack-1,stackの乗算を求める。	|1個減る
|/			|stack-1,stackの除算を求める。	|1個減る

# 投入したソースコード

```
6 3 + 2 - . 3 4 * 2 / 1 + . 2 3 drop dup dup 1 + + + 7 dup . . .
```

# 実行結果

```
.text
.globl main
main:
	pushq 	%rbp
	movq 	%rsp, %rbp
	pushq 	$6
	pushq 	$3
	popq 	%rax
	addq 	%rax, (%rsp)
	pushq 	$2
	popq 	%rax
	subq 	%rax, (%rsp)
	popq 	%rsi
	leaq 	IO, %rdi
	movq 	$0, %rax
	callq 	printf
	pushq	$3
	pushq 	$4
	popq 	%rax
	imulq 	(%rsp), %rax
	movq 	%rax, (%rsp)
	pushq 	$2
	popq 	%rbx
	popq 	%rax
	cqto
	idivq 	%rbx
	pushq 	%rax
	pushq 	$1
	popq 	%rax
	addq 	%rax, (%rsp)
	popq 	%rsi
	leaq 	IO, %rdi
	movq 	$0, %rax
	callq 	printf
	pushq 	$2
	pushq 	$3
	addq 	$8, %rsp
	movq 	(%rsp), %rax
	pushq 	%rax
	movq 	(%rsp), %rax
	pushq 	%rax
	pushq 	$1
	popq 	%rax
	addq 	%rax, (%rsp)
	popq 	%rax
	addq 	%rax, (%rsp)
	popq 	%rax
	addq 	%rax, (%rsp)
	pushq 	$7
	movq 	(%rsp), %rax
	pushq 	%rax
	popq 	%rsi
	leaq 	IO, %rdi
	movq 	$0, %rax
	callq 	printf
	popq 	%rsi
	leaq 	IO, %rdi
	movq 	$0, %rax
	callq 	printf
	popq 	%rsi
	leaq 	IO, %rdi
	movq 	$0, %rax
	callq	printf
	movq 	$0, %rax
	leaveq
	retq
	.data
IO:
	.string "%lld"
```

# 成果物


https://paiza.io/projects/2p2JE9m15EIRkcRNxW77RA?language=php


以上。
Juliaでガンマ関数とベッセル関数を使う

<h1> 概要 </h1>
昔調べた時に結構詰まったので備忘録がわりに書いておきます。<br>
<h1> やり方 </h1>
juliaはccallでmath.hの関数を呼び出せるのでそれを使うだけです

```julia
#ガンマ関数
function gamma(x::T) where T
    result = ccall(:gamma,Cdouble,(Cdouble,),x)
    t < typemax(T) ? T(t) : t #引数が整数の場合ガンマ関数は整数を返す方が望ましいため変換　ただしInf行くこともあるのでtypemaxを通しました
end
#第1種ベッセル関数
function jn(n::Integer,x::Real)
    ccall(:jn,Cdouble,(Cint,Cdouble),n,x)
end
#第2種ベッセル関数
function yn(n::Integer,x::Real)
    ccall(:yn,Cdouble,(Cint,Cdouble),n,x)
end

```
<h1> 参考文献 </h1>
math.hの関数

[IBM document ベッセル関数](https://www.ibm.com/docs/ja/i/7.3?topic=functions-bessel)
[IBM document  ガンマ関数](https://www.ibm.com/docs/ja/i/7.3?topic=functions-gamma-gamma-function)
上のIBM documentを探してみると意外な関数が見つかるかも。
ccall周り
[Juliaの公式ドキュメント(英語)](https://docs.julialang.org/en/v1/manual/calling-c-and-fortran-code/)
Dockerについて 個人メモ

# Dockerとは
## 概要
### まず第一にコンテナとは

- 依存関係から解放された仮想化技術
- OSとカーネルは共有

- 他プロセスから隔離された状態でOS上からソフトウェアを実装する仕組み.....よくわからない

> ソフトウェアの定義 : 電子機器に搭載されているプログラムのこと

- コンテナとよく比較される技術として「サーバー仮想化」が存在する

### サーバー仮想化って？？

- ハードウェアの上にハイパーバイザーを用いて仮想マシンを立ち上げ、その上にゲストOSが乗っかりアプリケーションが展開される仕組み

> ハイパーバイザーとは、仮想マシンを立ち上げるソフトウェアの事、VirtualBoxとか

- 複数のOSを同一のハードウェア上で扱う
- ゲストOSは1つのサーバーとして見なされ、ミドルウェアや複数のライブラリをインストールした状態で複数のアプリケーションを立ち上げるのが一般的
## Docker コマンド

### 基本操作

#### docker image build -t myapp:v1 .

dockerfileからイメージを作成するコマンド

#### docker image ls

イメージの情報の表示

#### docker image rm (IDまたは名前)

イメージの削除

#### docker image tag myapp:v1 myapp:20220131 

イメージにタグ付け

#### docker image push myapp:v1

イメージをレジストリへ保存

#### docker image pull myapp:v1

レジストリからイメージを取得

#### docker container run -d -p 80:80 myapp:v1

コンテナの実行

#### docker container logs (コンテナID)

コンテナのログを確認

#### docker container stop (コンテナID)

コンテナをストップ
laravelのヘルパ関数とPHPのマジック定数で自らのクラス名を取得する

# 概要

- laravelのヘルパ関数とPHPのマジック定数で実行中のクラスのクラス名を取得する方法をまとめる。

# 方法

- 下記のように記載すると実行中クラスのクラス名を取得する事ができる。

    ```php
    $myClass = class_basename(__CLASS__);
    ```

# 簡単な解説

### `__CLASS__`

- PHPのマジック定数
- 実行中のクラス名を名前空間ごと格納している。
- `Hoge\Fuga\Piyo`のPiyoクラス内では`__CLASS__`に`Hoge\Fuga\Piyo`が格納されている。
- [マジック定数](https://www.php.net/manual/ja/language.constants.magic.php)

### `class_basename()`

- laravelのヘルパ関数。
- 名前空間が含まれる指定クラスの名前から、名前空間部分を取り除く。
- 下記のように記載した場合`Piyo`が返される。

    ```php
    class_basename('Hoge\Fuga\Piyo');
    ```

- [class_basename](https://readouble.com/laravel/9.x/ja/helpers.html#method-class-basename)
「A Tour of Go」 の Exercise: Slices を解きました

引き続きGo公式のチュートリアル「[A Tour of Go](https://go-tour-jp.appspot.com/list)」を読み進めています。その中に練習問題がいくつか用意されています。当記事は、Sliceに関する練習問題「[Exercise: Slices](https://go-tour-jp.appspot.com/moretypes/18)」を解いた記録です。

# コード
```go
package main

import "golang.org/x/tour/pic"

func Pic(dx, dy int) [][]uint8 {
	ret := make([][]uint8, dy)
	for i := 0; i < dy; i++ {
		ret[i] = make([]uint8, dx)
		for j := 0; j < dx; j++ {
            // 式によって表示される画像が変わる
            ret[i][j] = uint8(i^j)
			// ret[i][j] = uint8((i^2) * (j^2))
			// ret[i][j] = uint8((i + j) / 2)
			// ret[i][j] = uint8(i * j)
		}
	}
	return ret
}

func main() {
	pic.Show(Pic)
}
```
# 解説
処理は
1. main関数がPic関数を呼び出す
2. 二次元でサイズdyのスライスret（可変長配列）を定義
3. retの各要素をサイズdxの配列に調整
4. forのインデックスによってretの各要素を更新
5. main関数に戻り描画

の流れです。
```go
ret[i][j] = ?
```
上式の?によって表示される画像が変わるので色々試してみると面白いです。

# 最後に
main関数が呼び出しているpic.Showには立ち入っていないので、余裕ができたらこちらも確認してみたいと思います。
Unityのインストール方法（Windows）

WindowsでのUnityインストール手順をまとめています。
インストール開始からアプリ作成が開始できるようになるまで大体30分くらいかかりました。

## Unityをダウンロード

[Download - Unity](https://unity3d.com/jp/get-unity/download)にアクセスして、『Unity Hub をダウンロード』ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/e349f9f2-336c-e09a-1497-2d97b0049504.png)
インストーラがダウンロードされる

## インストーラの実行
利用規約に同意してインストールを実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/ad5efbb9-eb27-537e-aef8-bf984994d14d.png)

Unity Hubのインストールが完了する

## Unity Hubを実行
サインイン画面が出てくるので、アカウントがない場合は『Create account』をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/d7a15200-1275-bde0-e1ba-6b79ae89c7c4.png)

ブラウザでアカウント作成画面が表示されるので、必要な情報を入力してアカウントを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/9a725ac8-d8ac-8997-ff7c-a8ff6dd006c8.png)

## Unity Hubへサインイン
アカウント作成が完了したら、Unity Hubの画面に戻って『Sign in』をクリックしてサインインする

## Unity Editorのインストール
サインインが完了すると、以下の画面が表示されるので『Install Unity Editor』をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/b9088d31-c2f6-9c63-bd98-a25ac34dc74c.png)

以下の画面が表示されるので、適切なライセンスを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/2bb59f2f-22eb-1d03-2cc8-ad0cd07d73ec.png)

今回は、個人用かつ商用での利用ではないため
『Agree and get personal edition license』を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/bc4ffc5f-8c75-a11a-80f1-a75078986e54.png)

Unity Editorのインストールが開始される（インストール完了まで15分くらいかかった）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/5f59d27a-a2df-ed10-1254-b7de21aea880.png)

サイドバーの『Installs』をクリックするとインストールが完了されていることが確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/08b8f490-2743-1c92-7c09-03b8cf57d82c.png)

サイドバーの『Projects』→右上の『New project』をクリックすることでアプリの開発を開始することができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/73fe74cb-6ce6-bf4a-64ef-620c4caa62df.png)
【Google App Script】Googleスプレッドシートにデータを出力する方法

GoogleAppScriptを使ってwebスクレイピングをした後、Googleスプレッドシートに書き込む、というケースはよくあります。
「よくあるケースだけど、すぐ忘れちゃう」というのはあるあるなので、この記事でまとめておきます。

# 操作対象のスプレッドシートを指定
ブックの指定には **「SpreadsheetApp.openById()」** 、シートの指定には **「getSheetByName()」** または　**「getSheets()」** を使います。
以下の例では、対象のブックとシートの情報が、変数「sheet1」と「sheet2」に格納されています。
~~~
function myFunction() {
  var id = "[スプレッドシートのid]"
  var ss = SpreadsheetApp.openById(id)
  var sheet1 = ss.getSheetByName("[スプレッドシートのシート名]")
  var sheet2 = ss.getSheets()[0]
}
~~~
「スプレッドシートのid」は、スプレッドシートを開いた時のURLのうち、以下の「**xxxxxxx**」の部分を指します。
　→ https\://docs.google.com/spreadsheets/d/**xxxxxxx**/edit#gid=0

シートの指定における2つのメソッドの使い分けは以下の通り。
<dl>
  <dt>getSheetByName()</dt>
  <dd>シート名称で指定</dd>
  <dt>getSheets()</dt>
  <dd>シートの順序（そのシートが何番目のシートか）
</dl>

# 特定のセルにデータを書き込み
先程指定したシートに対して、 **「getRange().setValue()」** を使います。
A1セルに「テストデータ」という文字列を書き込む場合は、以下のようになります。
~~~
function myFunction() {
  var id = "[スプレッドシートのid]"
  var ss = SpreadsheetApp.openById(id)
  var sheet1 = ss.getSheetByName("[スプレッドシートのシート名]")
  var sheet2 = ss.getSheets()[0]
  sheet1.getRange("A1").setValue("テストデータ")
}
~~~

# スプレッドシートの最終行に書き込み
スプレッドシートの内容から最終行を自動で判断して、書き込んでくれる便利な方法があります。
**「appendRow()」** を使うと、自動で最終行にデータを書き込んでくれます。
さらに、配列形式でデータを渡すと、最終行に対して複数列のデータをまとめて出力できます。

~~~
function myFunction() {
  var id = "[スプレッドシートのid]"
  var ss = SpreadsheetApp.openById(id)
  var sheet1 = ss.getSheetByName("[スプレッドシートのシート名]")
  var sheet2 = ss.getSheets()[0]
  sheet1.appendRow(["テストデータ1", "テストデータ2"])
}
~~~

# スプレッドシートの最終行の取得
先程のappendRow()だと、最終行の次の行に、データを続けて出力することしかできません。
**「最終行の次に1行空けて、その次の行からデータ書き込みを開始したい」** のようなニーズを満たせませんね。
そんな時は、 **「getLastRow()」** を使うと、スプレッドシートの最終行を取得できるので、それを使って細かい調整ができます。
~~~
function myFunction() {
  var id = "[スプレッドシートのid]"
  var ss = SpreadsheetApp.openById(id)
  var sheet1 = ss.getSheetByName("[スプレッドシートのシート名]")
  var sheet2 = ss.getSheets()[0]
  var lastRow = sheet1.getLastRow()  
  sheet1.getRange(lastRow+1, 1).setValue("テストデータ")
}
~~~

# 参考記事
https://blog.8basetech.com/google-apps-script/gas-spleadsheet-setvalue/#toc2
laravel FakerPHPを使ってダミーデータを生成する

# 概要

- laravelのFactoryなどでFakerPHPを用いてダミーデータを生成する方法をまとめる。

# 生成方法

- 下記の様に記載することでダミーデータを生成する事ができる。

    ```FooFactory.php
    // Factoryクラス内での使用
    $this->faker->指定フォーマットの関数名;

    // それ以外のクラスでの使用（言語はデフォルト）
    use Faker\Factory;
    Factory::create()->指定フォーマットの関数名;

    // それ以外のクラスでの使用（言語は日本語を指定）
    use Faker\Factory;
    Factory::create('ja_JP')->指定フォーマットの関数名;
    ```

# 指定フォーマット

- 下記のFakerPHP非公式リファレンスや、本家のリファレンスで各フォーマットの指定方法がわかりやすく記載されている。
    - [FakerPHP非公式リファレンス](https://fwhy.github.io/faker-docs/)
    - [公式リファレンス](https://fakerphp.github.io/formatters/)

# 言語の指定

- `config/app.php`で`faker_locale`に指定を行うことでデフォルトの言語を指定できる
Active Storageのしくみ

Ruby on Railsにて、Active Storageのインストール後に生成されるマイグレーションファイルの中身が気になったので、その仕組みを読み解いてみる。

### 〜Active Storage の導入コマンド〜
`$ rails active_storage:install`
↓
`$ rails db:migrate`で、Active Storageが使えるようになる。


## マイグレーションファイルに定義される３つのテーブル
1. active_storage_blobsテーブル
1. active_storage_attachementsテーブル
1. active_storage_variant_recordsテーブル

### active_storage_blobsテーブル
- ActiveStorage::Blobモデルのテーブル 
- 添付されたファイルに対応
- 識別key（`:key`）、ファイル名（`:filename`）、Content-Type（`:content_type`）、ファイルのメタデータ（`:metadata`）、サイズ（`:byte_size`）などを管理

### active_storage_attachementsテーブル
- ActiveStorage::Attachmentモデルのテーブル
- ActiveStorage::Blobモデルとアプリ内のモデルを関連付ける中間テーブル
- 関連付けるモデルのクラス名(`:record_type`)や連携するFKカラム名(`:name`)を、FK値(`:record_id`)と共に保持。
- ポリモーフィック関連付けがされている。
  - `t.references :record, polymorphic: true`とすることで、`record_type`と`record_id`が自動生成される
  - メリット：ファイルがアップロードされるたびにactive_storage_attachementsテーブル&ActiveStorage::Attachmentモデルを更新する必要がなくなる
- 疑問点
なぜ`t.references :record, polymorphic: true, index: false`とココではindexを付与せずに、下記のように後でindexを追加しているのか？
```ruby
t.index [ :record_type, :record_id, :name, :blob_id ], name: :index_active_storage_attachments_uniqueness, unique: true
```
　→複合キーを作っている。関連づけるモデルのクラス名(`:record_type`)、そのモデルのFKカラム名（`:name`）、FK値（`:record_id`）、BlobモデルのFK値（`:blob_id`）を合わせた複合キーを作ることで、中間テーブルの役目を果たせる。

### active_storage_variant_recordsテーブル
- ActiveStorage::Variantモデルのテーブル
- サイズの変更などの加工情報を記録する

### 参考
https://qiita.com/itkrt2y/items/32ad1512fce1bf90c20b
laravel-openapiライブラリ パスパラメーターの値にdescriptionを入れる

# 概要

- laravel-openapiにてパスパラメーターの値にdescriptionを設定する方法をメモ的にまとめる。

# 方法

1. 下記のようなルーティングとコントローラーの記載があったとする。
    1. ルーティング

        ```web.php
        Route::get('/Hoge/{hogeType}/{hogeId}', [HogeController::class, 'get']);
        ```

    1. コントローラー

        ```HogeController.php
        use Vyuldashev\LaravelOpenApi\Attributes as OpenApi;

        #[OpenApi\PathItem]
        class HogeController extends Controller
        {
            #[OpenApi\Operation()]
            public function get(string $hogeType, string $hogeId): void
            {
            }
        }
        ```

1. 下記のようにコントローラーの関数にパラメーターをPHPDocで記載する。

    ```HogeController.php
    use Vyuldashev\LaravelOpenApi\Attributes as OpenApi;

    #[OpenApi\PathItem]
    class HogeController extends Controller
    {
        /**
         * @param string $hogeType hogeのtype
         * @param string $hogeId hogeのid
         * @return void
         */
        #[OpenApi\Operation()]
        public function get(string $hogeType, string $hogeId): void
        {
        }
    }
    ```

1. 出力すると下記のようにSwaggerで表示される。

    ![Swagger_Preview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/f8169089-ac98-48fe-8705-ba376820e6c6.png)
laravel CarbonImmutableインスタンスのタイムゾーンを変更する

# 概要

- UTCで作成されたCarbomImmutableインスタンスのタイムゾーンをAsia/Tokyoに変更する方法をまとめる。

# 方法

- 既に作成されているCarbonImmutableインスタンスにtimezone関数をメソッドチェーンすることでタイムゾーンを変更する事が可能となる。

    ```php
    use Carbon\CarbonImmutable;

    $utcDateTime = '2022-07-30 00:00:00';

    $utc = new CarbonImmutable($utcDateTime, 'utc');
    $asiaTokyo = $utc->timezone('Asia/Tokyo');
    ```
laravel タイムゾーンを指定してCarbonImmutableインスタンスを生成する

# 概要

- タイムゾーンを指定してCarbonImmutableインスタンスを生成する方法をまとめる。

# UTC現在時刻でCarbonImmutableインスタンス生成

- 下記の様に記載する。

    ```php
    use Carbon\CarbonImmutable;

    $nowUtc = CarbonImmutable::now('utc');
    ```
情熱プログラマーを読んで、心に残ったこと

## 読んだ本

![51KYrsCBI2L._SX353_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182399/d662427e-de71-a051-6c5b-dcd2e9511093.jpeg)



## 全体の感想
- プログラマ向けの自己啓発本
- なので、行動に移さないと意味がない
- 53章に分けられているかつ、章の最後に「今すぐ始めよう！」があって行動に移しやすい
- 抽象的に書かれている内容が多いので気になる章だけ読めるし、何度も読みやすい


## 心に残った章とその感想
### #4: いちばんの下手くそでいよう
自分が一番下手くそ ＝　周りがすごく優秀な環境
ということで、周りに追いつこうと頑張ったり、良い習慣や思考を浴びれるので仕事の質が上がる。

簡単に職場やプロジェクトチームを変更するのは難易度が高いので、
良い影響を与えてくれる開発者達と関われるコミュニティやOSSなどに参加する。


### #14: 師匠になる
誰かに教えてみれば、自分が本当に理解しているかはっきりする。
最近、質問される機会や意見を聞かれる事が増えたので実感中の内容です。
正式な師弟関係ではなく人助けからで良い。


### #28: 8時間燃焼
ダラダラと長時間労働をするのではなくて、８時間集中して取り組む。
短い時間で集中してやると能率が上がる。（学生時代のレポートの感覚。）
プログラマーは頭脳労働なので、長く働けば良いというものではない。
睡眠・運動・朝食などに気を遣って仕事の時間を有効に使うこと。

### #35: オレ、作文的なの得意っすよ
今のプログラマーは文章を書くことが仕事の一部になっているので、作文技術を磨くことによるコスパは高い。
エンジニアとして優秀だとしても、自分自身を言葉で伝えられないと周りは優秀だと判断してくれない。
開発日誌や自分の書いた文章を読み返して分析すること。

### #36: そこに居ること
リーダーやお客さんや同僚と直接顔を合わせる機会を無駄にしない。
コロナ禍でオフラインが増えた今、改めて心に残った。

### #49: 鏡の中の太った男
体重だったら体重計に乗れば良いが、ソフトフェアの開発者としての市場性やスキルには計りがないので、自身を客観的に見れる環境を持つこと。
信頼できる人からフィードバックをもらえる機会を作ること。
日記や作業メモを書いて、数ヶ月後に客観的に見直すこと。
(#35の読み返しも出来るし、作業メモは資産になるし)


良い内容だったので定期的に読み返します。
以上になります〜。