OmniAICreator/Qiita-1.07M huggingface dataset:
今日からdockerイメージのubuntu:latestは22.04 LTSです！

本日(2022/4/22)から、latestタグが22.04に変わってますのでお気をつけください。
（タグ無指定も22.04になります）

```terminal
docker run -it --rm --pull always ubuntu
```

```terminal
root@ea2a62ba0ecd:/# cat /etc/os-release 
```

```console
PRETTY_NAME="Ubuntu 22.04 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04 (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
```

20.04が使いたい場合は、タグを20.04で指定しましょう。

```terminal
docker run -it --rm --pull always ubuntu:20.04
```

```terminal
root@9a8f26b1f72a:/# cat /etc/os-release 
```

```console
NAME="Ubuntu"
VERSION="20.04.4 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.4 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
```
Laravel9のauth導入手順（Windows）

私は、Laravel6の開発経験があるのですが、最新バージョンを勉強がてらやろうと思ったのですが、
`make:auth`コマンドが廃止されていたため、導入手順を備忘録として残します。
※実施環境：Windows、Laravel9

---
①composerからlaravel/uiを導入
```
composer require laravel/ui
```

②authソースのジェネレートと、マイグレーション
```
php artisan ui vue --auth
php artisan migrate
```

③npmからパッケージのインストール
　※npmがインストールされていない場合は、以下のURLからインストールする。
　　（npmが一緒にインストールされます。）
　　https://nodejs.org/en/
```
npm -i
npm i vue-loader
```

④npmからパッケージのビルド
```
npm run dev
```

ここまでの手順を実施すると、以下の画面が表示されます。
http://localhost/login

---
![login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698420/9e840c93-4c75-0a4a-6c03-797c5da54fb7.png)
「ノーコードシフト」要点抜粋

![ss.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667780/c660d753-bf4f-4d0e-bb9c-46a887e79e8f.jpeg)
# はじめに
- プログラミングができる人は世界全体で約0.3%

# ノーコードはなぜ今ブームなのか
### ブームの背景
- クラウドの一般化 -> SaaS利活用の浸透 -> APIエコシステムの発展


- 社会の複雑化によるニッチサービス需要の増加
    - 懐中時計の販売仲介システム
    - 特定の病気を持つ人々のSNS
    - 住む街の回覧板のオンライン化


- IT人材の不足
- コミュニティの強い後押し
    - ノーコードキャンプ
    - ノーコードファウンダーズ
### ノーコードで代替される技術
- 定常型IT業務
- 定常化したプログラミング業務


### ノーコードで代替されない技術
- 「非定常」「非定型」の業務に必要な技術


### ノーコードの分類と特徴
- Webデザイン系
    - Webflow（コードに書き出し可）
    - STUDIO
    - Wix
    - ペライチ


- データ管理系
    - Airtable
    - キントーン


- タスク自動化系（iPaaS）
    - Zappier


- オールインワン系
    - Babble（Web開発）
    - Adalo（Web開発 / モバイル開発・スマホ標準機能へのアクセス不可）
    - Thunkable（モバイル開発）
    - AppGyver（Web開発 / モバイル開発）


- オールインワン系特化ツール
    - Shopify
    - Arcadier
    - Sharetribe

# ノーコードをどのように導入活用するのか
### メリット
- 速いスピード
- 柔軟性（追加機能・オプション機能の多さ）
- 学習コストが低い
- 社内人材を活用できる
- 精神的負担の軽減
- 初期導入費用が安い

### デメリット（開発前にしっかり共有すべき）
- できることが決まっている
- サービス停止のリスク
- セキュリティ ※個人的にノーコード特有ではないと感じます

### 業務用途のための5つのステップ
1. 業務範囲を明確にする
1. 要件を明確にする
1. ツールを選定し、フィット&ギャップする
    1. 広告用Webサイト -> Webサイト
    1. エクセル業務のオンライン化 -> データ格納
    1. 給与計算と経理データ転送 -> 給与計算のSaaSとタスク自動化

4.ロードマップを作る
　　まずは最小単位の業務範囲でノーコードを活用
5.IKEO型ツール運用体制を作る
　　運用者が導入開発する

### 新規サービス検証のための5つのステップ
1. 仮説を明確にする
1. 検証したい内容を数値化して明確にする
1. 成功とするしきい値を明確にする
1. ツールを選定し、フィット&ギャップする
1. 外部メンバーも入れつつIKEA型運用を

# ノーコードは何を良くするのか
- 個人が作りたいサービスを作れる
- 納品までにかかる工数を削減できる
- 細かく改善できる（すぐに修正できる）
- 低予算で業務をデジタル化する
- IT人材不足を補い内制化する　など

# ノーコード開発事例紹介
- 1人の職員が特別定額給付金申請の手続きを、「キントーン」で1週間ほどで構築
- 位置情報付きSNS投稿を自然言語分析し、まちに関する質的評価を行うことで、テナント誘致やまちの活性化施策につなげるシステムを「MatrixFlow」で開発　など

# ノーコードツールの種類と選定基準
### ノーコードツールの分類
- Webデザイン系 -> ビュー、フロントエンド
- データ管理系 -> モデル、データベース
- タスク自動化　ー> コントローラー、ビジネスロジック
- オールインワン系

### Webデザイン系
- ペライチ：1ページもののデザインに最適
- carrd：海外版ペライチ。StripeやPayPalなどとの連携が簡単
- Google Sites
- STUDIO：国産
- Wix：AI自動生成機能
- WebFlow:豊富なアニメーション。外部DBとの連携
- WordPress
- Notion：頻繁に更新が入る簡易サイト向け
- Softr：AirtableをDBとして使用

### データ管理／顧客情報管理系
- Airtable：使いやすいUI
- キントーン：入力画面から作る
- Zoho
- Salesforce
- Notion

### タスク自動化ツール
- Zapier
- Integromat
- IFTTT
- Parabola
- Automate.io

### オールインワン系
- Bubble：HTMLを埋め込め、JavaScriptで書ける
- Adalo：モバイル開発に特化
- Glide：Googleスプレットシートをもとにモバイル開発
- Shopify：ECサイトに特化
- MemberSpace：決済とログイン認証に特化
- Retool：データ修正や集計などのデータ管理業務に特化

# ノーコードの学習方法
- まずはYouTube
- 1回作ってみる
- SNSでつながる
- 作りたいものを見つける
- 公式ドキュメントを読み込む
- 公開して使ってもらって振り返る
### おすすめ学習コンテンツ
- NoCode School：チュートリアル形式
- ノーコードラボ：Bubbleに広い知見あり
- NoCodeCamp：国内最大
- MakerPad：世界最大のノーコードオンライン学習サイト
- No Code Founders：Slackコミュニティ

### ノーコードでも必要な基礎IT知識
- データベース（主にRDB）：正規化・非正規化の方法、関係性や外部キーの考え方、表の結合や並べ替えなど
- セキュリティ：脅威、脆弱性、攻撃手法、暗号技術、認証技術
- ネットワーク：IPアドレス、ドメイン、通信プロトコル、SSL、電子メールの仕組み、WiFi、モバイルネットワークなど
- 要件定義
- 動作確認テスト：正常系、異常系、それらの組み合わせ、網羅性基準の設定方法、同値分割、境界値分析など
- 法律：著作権、知的財産権

# 先端技術とノーコード
- ビジネス開発とシステム開発の境目がなくなる
- 会社の各部門にノーコーダーが配置される
- ノーコードコンサルタント
- 社会課題の解決加速化
- 当事者たちがニッチサービスを作る
- アイデアを実現するための障壁がなくなる

# 所感
ノーコードを推薦している本だと思っていましたが、客観的に考察している内容に感じました。機械的な作業はノーコードツールやAIに任せ、よりクリエイティブな部分に注力できる世の中になっていくことが予想されます。ノーコードの便利さを紹介しつつ、学ばないといけない周辺知識も教えてくれている、読者の立場になってまとめてくれている本です。
Makeを使って食事のカロリーを教えてくれるLINEBot作りに挑戦！

こんにちは。こんばんわ。
昨年秋から新天地での生活を始めました。これまでの生活リズムを取り戻すまでに時間もかかり、休日も体力回復だけに費やすことも多くなり「これじゃ不健康まっしぐらだなぁ」と思いながらも「せめて食事はおいしく楽しく食べたい」とレシピ動画を流し見していた時です。
「食べるもので簡単に健康管理出来たらいいのにな・・・。そうだ作ってみようかな。ついでにパソコン苦手からも脱出しよう！」
ということで、**日常で一番使っているLINEで健康管理できるものを作ってみる**ことにしました。まずは【立志編】といったところでしょうか・・・
# LINE Botをつくるまで
* 食べるものを管理すること
* 理想のLINE公式アカウントからヒントを得る
* Makeを使ってみる
* メッセージが返ってくるけど・・・
# 食べるものを管理すること
日々体力回復に時間を費やしてきた私がなぜ「健康管理」をやってみようと思ったのかというと、いまの上司の影響です。上司は超健康志向で、食べ物はストイックに制限し、毎日欠かさずランニングをしている方です。手すきの時間には健康論を熱く語っております。自身の経験談を話しているので説得力もあります。
しかし、私は急にストイックになれるほど芯が強い人間ではないので、まずは、**自分が食べているものを数値化する**ところから始めることにしました。やはり、カロリーから入るのが一番わかりやすいだろうと思い、食べ物のカロリーを教えてくれるLINE Botを作ることにしました。
# 理想のLINE公式アカウントからヒントを得る
生活の中でもLINEはとても便利ですよね。よく使っているのはレシピを教えてくれるLINE公式アカウントです。食材を入力すると、おすすめのレシピ１つが出てきます。さらに「他にもたくさんありますよ！」とその食材の他のレシピが見れるURLが出てきます。つまり、これと同じ仕組みを作って、レシピではなくカロリーを教えてもらおう！という作戦です。
# Makeを使ってみる
LINE Bot作りに使ったのはMakeです。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620758/ee434e50-f113-9c5a-d162-25a5c632fe0f.png)
まずは、オウム返しBot、そして天気を教えてくれるBotを作りました。ここまでは順調です。
![Screenshot_20220422-214525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620758/2ed6302f-e7d2-4343-9da6-f87b97e7230e.png)
もう１つ違うものにトライしたくなったので「国の祝日を教えてくれるBot」を作ってみることにしました。しかし、これが全然うまくできないんです。何度やってもメッセージが返ってきません。
![Screenshot_20220422-215747.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620758/716b14fa-0ad1-5f1d-dff6-dd6d4846ef37.png)
既読スルー祭りに心が折れまして、一度、祝日を教えてくれるBot作りは中止して、講座で作った天気Botに戻すことにしました（戻すのも一苦労でした涙）。再インプットのため講座を見返したり、YouTubeを見たり、本を読んだりしました。そして祝日Botに再挑戦すると、返事がきましたー！
![Screenshot_20220422-220049.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620758/c249312b-4954-4d94-3bbf-4dc7026cc384.png)
やったーーー！
正直、何の祝日なのかは分からないのですが笑、とりあえず返事が来るって素晴らしいことだと実感しました。このいい流れのまま本題のカロリー表示Botを作ります。
# メッセージが返ってくるけど・・・
しかし、チャレンジの神様はそう甘くはありません。
![Screenshot_20220422-201826.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620758/0dabd104-b0d0-3529-acf7-1cc5f211b4b0.png)
食材情報関連のAPIは様々あるのですが、どれが一番適しているのかを見極めることも難しく、さらに、「食材」を入力して「そのカロリーを表示する」という仕組みをどうやって作ったらいいのかまだ解明できていません。ひとまずは何かメッセージが返ってくる状態まで進めることが出来ました。

そもそも「苦手」だったところから一歩、いや半歩は前進できたかな、と思います。私と同じく「苦手」ながらもコツコツ取り組んでいる方に共感していただけたら嬉しいです。

次回は、完成までの道のりが投稿できるよう引き続に制作します☆
～Make（旧integromat)でLine連携～

普段使っているLineを入口に簡単にできる事
*****************
### 動機　Lineを使っていろいろ便利にしたい
* * *
### 
コード？ラインボット？ガチのプログラム初心者ITに興味はあれど、入り込めずにいましたが「楽したい」「便利にしたい」という気持ちでいろいろ探ってみました。特に仕事でつかえるような、ちょっと便利になる事ができないかを考えました。



*****************
### 超初心者でもできたLineBot
* * *

まずは[Make](https://www.make.com/en/integromat-evolves-to-make)で登録
最初にLineにJSONAPIからの情報をかえすものを作ってみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2617007/c683322c-c204-91db-a924-ad1a35c028c4.png)
こんな感じで　LineからのメッセージにJasonから得たデータを加えてリプライで返す仕組みができました



*****************
### 応用　LineとGoogleをつなげる
* * *
Googleスプレッドシートやドライブなど普段を使っていて、何かできないかと考えた

# ①写真をラインでグーグルドライブで共有できないか

撮った写真をGoogleドライブにまとめるのは便利だ、でもGoogleドライブを共有したりはちょっと怖い勝手に触られるのは怖い、のでLine経由で写真をアップロードできれば管理がしやすく便利

# ②シフト集計にGoogleフォームを活用したい
が、フォームのＵＲＬをライングループで一斉通知しようとしたら、グループ内に他の人にラインを知られたくないからグループは組みたくないとの事、そこでLinebotと個人個人のやり取りなら良いんじゃないか? 


*****************
### 超初心者でもできたLine
* * *

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2617007/b186f53e-7855-e7c0-a91f-5837b5af4cc6.png)
組んでみたのがこれ↑　　↓主な内容

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2617007/0ec7dcfc-0465-1ca8-ce2b-80676579b894.png)

1.ラインからのメッセージを取得
2.メッセージの内容で条件で分ける
3.どれにも当てはまらないメッセージは
4.「メモ」と含んだメッセージはスプレッドシートに記憶
5.スプレッドシートに書いたよっとリプライを返す
6.写真ならこっちを通す
7.Googleドライブに写真を保存
8.シフト入力の為のGoogleフォームのアドレスを返す
***
画像送信

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2617007/182dbde0-87bc-b206-b704-03506254425a.png)

***
メモ機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2617007/0e0469d6-df13-a162-33ef-b02132d48fae.png)

***
ここまで5日間、ネットでinegromatやLineBotと検索するとまだまだできそうなことがいろいろ
試してみようと思います！
THREE.DeviceOrientationControls のデバイス差を吸収する

Three.js で Web VR/AR アプリを作るとき、スマホの向きに応じて空間内のカメラの向きを操作するのに THREE.DeviceOrientationControls が使われる。しかしこのクラスを使うのは一筋縄ではいかず、その課題と対処法についてまとめる。

## THREE.DeviceOrientationControls のデバイス差問題
Three.js でスマホのジャイロセンサーと空間内のカメラを同期させる方法を調べると、だいたい THREE.DeviceOrientationControls を使用するやり方が出てくる。

しかしこのクラスは2021年10月にリリースされた [r134](https://github.com/mrdoob/three.js/releases/tag/r134) にて削除されてしまっている。

関連する Issue を読んでいくと、以下のことがわかる。

- [#15828](https://github.com/mrdoob/three.js/issues/15828)
    - デバイスによって `THREE.DeviceOrientationControls` を使用した場合の初期方向が異なってしまう問題が発生している
    - → これはデバイスの実装に依存するもので、Three.js 側では対応しない
- [#22613](https://github.com/mrdoob/three.js/issues/22613)
    - (Issue の内容としては同様)
    - → このクラスを削除することに (r134 で削除)
- [#22996](https://github.com/mrdoob/three.js/issues/22996)
    - `THREE.DeviceOrientationControls` を復活させてほしいという Issue
    - → クラスを復活させることはしないが、ユーザが過去のコミットからクラスを復元して使用しても問題ない

クラスそのものは過去のものを復元して使用すればいいとして、デバイス差が発生する問題は解決されていない。

実際に自分で試した際にも、iPhone 11 (Safari) で初期状態で正面になるようにオブジェクトを配置したところ、それを Pixel 6 (Chrome) で見た際には左側に表示されてしまった。(初期状態でのカメラの向きが90°ズレている)

## デバイス差を無理矢理に吸収する
初期状態でのジャイロセンサーの向きの値を取得して、それをオフセットとして設定して相殺してやればデバイス間の差分は吸収できるだろう、という雑な考え。

``` typescript
const controls = ... // DeviceOrientationControls オブジェクト

/**
 * スクリーンが垂直になるようにスマホを持っているときの、スクリーン裏面が向いている方角 (-180 〜 180) を計算する
 */
function calcDeviceDirection(e: DeviceOrientationEvent): number {
  const ry = ((e.gamma || 0) * Math.PI) / 180
  const rx = ((e.beta || 0) * Math.PI) / 180
  const rz = ((e.alpha || 0) * Math.PI) / 180
  const cy = Math.cos(ry)
  const sy = Math.sin(ry)
  const cx = Math.cos(rx)
  const sx = Math.sin(rx)
  const cz = Math.cos(rz)
  const sz = Math.sin(rz)
  const x = -(sy * cz + cy * sx * sz)
  const y = -(sy * sz - cy * sx * cz)
  const z = -(cy * cx)

  const angle = Math.atan2(-x, y) * (180.0 / Math.PI)
  return angle
}

window.addEventListener(
  'deviceorientation',
  (event: DeviceOrientationEvent) => {
    const deg = calcDeviceDirection(event)
    const rad = deg * (Math.PI / 180) // deg2rad (-π 〜 π)
    if (controls) controls.alphaOffset -= rad
  },
  { once: true }
)
```

一度だけ `'deviceorientation'` イベントを受け取って `DeviceOrientationControls` のオフセットを更新している。

例えば [この example コード](https://github.com/mrdoob/three.js/blob/r133/examples/misc_controls_deviceorientation.html) でいえば、init 関数の末尾にこの処理を追加しておくだけでよい。これで各端末で同じ方向を向けるようになった。

## 参考
- [JavaScriptプログラミング講座【DeviceOrientation Event について】](https://hakuhin.jp/js/device_orientation_event.html)
技術者のための！かいつまみ哲学


# 概要
システム開発、ハードウェア開発、ソフトウェア開発を志している技術者、学生のために開発・設計・勉強に役に立つであろう哲学をまとめます。簡単な古代の哲学から始め、現代のシステム開発方法論に至るまで文献に基づいて追っていきます。そして時折、哲学と技術との関連を示して、読者がよりよい開発方法、設計方法、勉強方法を探るヒントになるようにします。
# なぜ哲学なのか
大学でシステム開発のための授業がなかったからか、システム開発を知らないままこの業界に飛び込み悩みました。そのうちに自分が作ろうとする"システム"とは何かを知らないことに気づき、それを理解するにはこれまでの西洋哲学を学ばなければならないことに気づきました。そして老齢の技術者は経験からシステムの意味に気付いているがほとんどの技術者はこのことについて無知であることにも気づきました。

# ロードマップ
哲学を次のようにまとめます。
古代の哲学→中世の哲学→近代の哲学→現代の哲学

# 古代の哲学
アリストテレスは形而上学の中でより根源的に物事を説明できる知を探求しました。
これは東洋の哲学にはないと思います。西洋では伝統的に「なぜ」に答えられる
ことが重要視されるのです。

個人的にアリストテレスのことがすごいと思う点は2つあります。
・論理学を作ったこと
・(当時としては)完成された物事を説明するフレームワークを作ったこと

# アリストテレスの論理学
アリストテレスの論理学は非常によく知られています。
今日では命題論理と呼ばれるものと、問答法的論理と呼ばれるものを作りました。
命題論理とは形式論理とも言われます。
命題A,B,Cがあったとして
Aが真ならばBも真、Bが真ならばCも真ゆえにAが真ならばCも真というやつです。
これに対し問答法的論理とは非形式論理とも言われます。
ある命題について論証以外の方法で確証を試み、反論をすべてはねのければ蓋然性があるとみなすというものです。
論証の前提となる真であるべき命題(上記でいえば命題A)は論証できないので、問答法的論理に頼る必要があります。また、論証に頼れない部分も問答法的論理に頼る必要があります。

技術者としても、取り急ぎ簡単に論理的に話を進めるのならアリストテレスの論理学で十分事足りるのではないでしょうか。

# アリストテレスの説明フレームワーク
アリストテレスは物事を説明するために現代でいう5W1Hのようなフレームワークをすでに持っていました。
それは次のような問いに答えるものでした。
(1)実体：それが何(what)であるか
(2)数量：それがどれくらい(how much or how many)であるか
(3)性質：それがどんな(how)か
(4)関係：それ自体または他と比較してどういう関係を持つか
　　　　(例:2倍、半分、等しい、似ている、大きい、小さい)
(5)場所：それがどこ(where)か
(6)時間：それがいつ(when)か
さらに次がオプションとして付け加えられる。
(7)姿勢
(8)所持
(9)作用    (action)
(10)被作用    (reaction)

現代でも物事を説明するための基本ですね。さすがアリストテレス。
さらに物事が成り立つ原因(whyに対する答え方)の分類をしました。
①質量因：何からできているかを説明する
②形相因：何であるかを説明する
③始動因：それが成立するための動きや変化を与えるものを説明する
④目的因：何(どういう目的)のために成立するかを説明する

これを仕事で使うとしたら次のように役に立つでしょう。
機能について説明する
1.いくつのサブ機能からなりたつのか
2.どんな機能なのか
3.何が始動となって機能が働くのか、機能するためにどんな前提条件があるのか、いつ必要なのか、どこで必要なのか
4.その機能は何のために使われるのか

物について説明する。
1.それは何でできているのか(サブモジュール、電気、ビット、機械、材質など)
2.それは何か(形式、見た目、構造など)
3.それはどのような環境下で性能を維持するのか(温度、電磁的環境、振動、衝撃など)、始動するための条件(電源、温度など)
4.それは何のために使われるのか

# 真理の定義
アリストテレスの師、プラトンは真理は私たちには見えない超次元の世界のルールであると言いました。これをわかりやすく言えば、この世の中が映画「マトリックス」の中の仮想現実であったとして、仮想現実のプログラムが真理であるということです。我々は仮想現実の中で起きる現象から仮想現実のプログラムを想像するが、それが正しいとは限らないとしました。これに対しアリストテレスは真理とは「認識と対象が一致していること」と述べたとされ、これが西洋哲学の伝統的な真理の定義とされています。ただし、実際にはアリストテレスは「存在するものを存在しないと言い、あるいは存在しないものを存在するというのは偽であり、存在するものを存在すると言い、あるいは存在しないものを存在しないと言うは真であるからして...(以下略)」と述べているだけのようです。プラトンの真理は超次元の話であるのに対し、対象は現実世界の現象です。我々、技術者はどちらの立場のほうが良いでしょうか？
よく3現主義と言われます。現場・現物・現実を重視する立場はこの伝統的な真理観に適合していると思います。

今回は古代の哲学をまとめてみました。次は中世の哲学をまとめてみます。

# 参考文献
アリストテレス形而上学 上, 岩波文庫
アリストテレス入門, ちくま新書

https://qiita.com/Okome-man/items/7ebbc18a8838b5503b44

https://qiita.com/Okome-man/items/0a934cc36faf7f0048e5

https://qiita.com/Okome-man/items/d11b46357be83f51ad65
JavaScript: reduce は map で書ける

[map / filter は reduce で書ける。](https://qiita.com/ttatsf/items/1df2cb13d151a60a3885)じゃあ reduce は? mapで書ける。
実用性はないんだけど何となく思いついたので。
ここでは初期値ありバージョンの reduce だけとりあつかいます。
こんな感じ。

```js:
const reduce = init => f => xs =>
	xs.map( x => init = f(init, x) )[xs.length - 1]
```
こんな感じで使えます。

```js:
// 使用例：
const sum = reduce(0)( (acc, x) => acc + x )

sum([ 1, 2, 3, 4 ])		// 10
```

分解して考えると：
初期値init、2変数の関数f、配列xs を取り、累算の結果を返す関数reduceを考えます。 
累算の一回ごとの途中の値の配列を返す補助的な関数scanを考えると、reduce はこんな風になります。

```js:
const reduce = init => f => xs =>
	scan(init)(f)(xs)[xs.length - 1]
```
scanで返ってくる配列の最後の要素が reduce で求めたい値になります。

scanです。
アキュムレータの初期値acc、2変数の関数f、配列xsを取り、累算の一回ごとの値の配列を返します。

```js:
const scan = acc => f => xs => 
	xs.map( x => acc = f(acc, x) )
```
ラズパイ Raspberry Pi はシーケンサーの代わりになるか

### はじめに  
私自身３年ほど前からRaspberry Pi（通称:ラズパイ)を使用し、製造現場で２０台ほど２４時間稼動しておりますが、「ラズパイ Raspberry Pi はシーケンサーの代わりになるか」と題して独断と偏見で以下の内容を纏めてみました。  
###### ※あくまでも個人的な見解です。
* 結論
* ラズパイとシーケンサーの違い
* シーケンサーと同様な事をする為にクリアしなければならない課題
* 実例

### 結論
先ず最初に結論を申し上げると条件付きで有りだと思っております。  
条件ですが、ラズパイはRaspberry Pi財団が教育を目的として製作した物である為、製造現場での使用は想定しておりません。２４時間過酷な制御が必要な場所では使用は避けた方が良いと思います。
幸い私が製作した装置は今の所故障は発生しておりません。万が一故障しても簡便装置な為、壊れても簡単な修理で復旧する為、工程に大きな損害は発生しません。  
もし過酷な制御、大きなシステムをラズパイで行う場合、私自身使った事はないので詳しくは分かりませんがラズパイコンピュートモジュールを組み込んで産業用途として保証している物もあるので、それを使ってみるのが良いかと思います。

### ラズパイとシーケンサーの違い  
#### 出力ポートの電流
* シーケンサーの出力は大きな電流を流す事ができる為、モーター、バルブ等直接駆動できる。    
* ラズパイはLEDの様な小さな物しか直接制御できない。  
#### 電源電圧
* シーケンサーは電源が２４Ｖであり、機械装置に必要な光電センサーの多くが２４Ｖで動作する。
* ラズパイの電源は５Ｖであるが５Ｖで動作する光電センサーが少ない。
#### 開発言語
* シーケンサーは一般的にラダー図を使用
* ラズパイは一般的にPythonを使用
### シーケンサーと同様な事をする為にクリアしなければならない課題
#### 出力ポートの電流について
私の場合出力にトランジスタアレイTBD62083を使用しております。
このトランジスタアレイですが１チャンネルあたり５００ｍＡ流す事ができる為、エアバルブ等の駆動も可能になります。８チャンネルありますので基板もシンプルになります。  また、さらに容量が必要な場合はTBD62064APGというのもあり４チャンネルになりますが１チャンネルあたり１．５Ａと大容量になります。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2623232/47bc3b1b-7be9-57dc-0087-1446bb27c959.png)
#### 電源電圧について
仮に光電センサーの接続だけのシステムで、２４Ｖのスイッチング電源の搭載が許される装置なら、２４Ｖのセンサーを使用する事ができますが、スイッチング電源の搭載はできないとなると５Ｖの光電センサーが必要になります。しかし、５Ｖの光電センサーが見当たりません。
私の調べでは国産品ではセンサテック製[(こちら)](https://www.sensatec.co.jp/products/list.php?transactionid=4cff65445e4a8c26f92ae7ff0e251d965fe32613&mode=search&name=&category_id=314)の商品か中国製の[Ｅ１８－Ｄ８０ＮＫ](https://www.amazon.co.jp/Ren-He-E18-D80NK-%E6%8B%A1%E6%95%A3%E5%8F%8D%E5%B0%84%E5%BC%8F%E9%9A%9C%E5%AE%B3%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-%E6%84%9F%E7%9F%A5%E8%B7%9D%E9%9B%A2%EF%BC%9A3%E3%80%9C50/dp/B07MRKXV9G/ref=pd_lpo_1?pd_rd_i=B07MRKXV9G&psc=1)になります。
私は検出距離の調整ができ、検出の状態をＬＥＤで表示してくれるＥ１８－Ｄ８０ＮＫを使用しております。ただ、少々大きいので取り付けに工夫が必要です。※是非国内のメーカーからも５Ｖ仕様の光電センサーのラインナップを願いたい。
#### 開発言語について
どちらの言語が良いとは言えません。過去にラダー図での簡便自動機の開発もやってきましたが、Ｐｙｔｈｏｎに慣れてしまったらラダー図には戻れなくなりました。
因みにラズパイでも[ＣＯＤＥＳＹＳ](https://linx.jp/product/codesys/)という世界標準の開発環境を使う事によりラダー図で開発が可能です。※ライセンス料があるかと思いますので注意
### 実例
一纏めにすると下記の様なイメージになります。
![システム.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2623232/938f8102-0d31-0438-bd67-520818804016.jpeg)
### さいごに  
製造現場でのＤＸは欠かせない取り組みになっておりますが、ラズパイは大きな役割になる物と思っております。
PHPでフレームワークを使わずに、掲示板アプリを作ってみる①DB設計編

# はじめに
※自身の学習を記事に投稿することでアウトプットするのが目的です。
「よくわかるPHPの教科書」のchapter6に書いてある通りにアプリを
作成していくので、私と同じような駆け出しエンジニアの皆さんは、
書籍を買ってアプリを作っていただいた方がわかりやすいかもしれません。


# 使用しているエディタ、実行環境
* VS Code
* XAMPP

* PHP7
* windows



# DBを設計していく

### 必要な機能の洗い出し

掲示板アプリに必要な機能を洗い出していきます。
簡単なもので、思いつくところだと、こんな感じでしょうか。



* 文章を投稿する機能

* 文章に返信できる機能
* 写真をアップロードできる機能
* 会員登録ができる機能
* 退会できる機能
* ログインできる機能
* ログアウトできる機能


### 機能に対するデータベースの項目を考えてみる

大まかに、重複してもいいので考えてみます

<dl>

<dt>・文章を投稿する機能</dt>
<dd>メッセージ</dd>
<dd>会員情報</dd>

<dt>・文章に返信できる機能</dt>
<dd>メッセージ</dd>
<dd>会員情報</dd>
<dd>返信先のメッセージ</dd>

<dt>・写真をアップロードする機能</dt>
<dd>写真があるファイルの情報（パス）</dd>


<dt>・会員登録が出来る機能</dt>
<dd>ニックネーム</dd>
<dd>パスワード</dd>
<dd>メールアドレス</dd>

<dt>・退会できる</dt>
<dd>会員情報</dd>


<dt>・ログインできる機能</dt>
<dd>メールアドレス</dd>
<dd>パスワード</dd>

<dt>・ログアウトできる機能</dt>
<dd>会員情報</dd>

</dl>



### テーブル設計をしていく

次に、洗い出したデータベースの項目をまとめて、
実際にカラム名とデータ型を決めてテーブル設計をしていきます。

##### ・members-会員関係 [テーブル]

| カラム名 | 型 | 意味 |
|:-----------|------------:|:------------:|
| id | INT | 会員情報[PRIMARY KEY] |
| name | VARCHAR(255) | ニックネーム |
| email | VARCHAR(255) | メールアドレス |
| password | VARCHAR(100) | パスワード |
| picture | VARCHAR(255) | 写真のパス |
| created | DATETIME | 作成日 |
| modified | TIMESTAMP | 更新日 |

##### ・posts-投稿関係[テーブル]

| カラム名 | 型 | 意味 |
|:-----------|------------:|:------------:|
| id | INT | メッセージid[PRIMARY KEY] |
| message | TEXT | メッセージ |
| member_id | INT | 投稿者のid |
| reply_post_id | INT | 返信先のメッセージid |
| created | DATETIME | 作成日 |
| modified | TIMESTAMP | 更新日 |

こんな感じですね。ひとまずこれにてDB設計は終了です。
実際に、XAMPPのMySQL管理画面で作成してください。

# 終わりに
最初にアプリに必要な機能を洗い出したうえで、その機能に必要な情報を考える。
この手順でやると分かりやすいですね。
今回は簡単な掲示板アプリなので、必要な情報がそんなに多くないのでＤＢ設計を
考えやすいですが、これが大規模がアプリになると、どんだけ大変なんだろう・・・。
震えます。
ライブ映像から顔向き取得までの道のり

# 目的
https://qiita.com/nom-7/items/f06d1f838940383163c9

上記記事にも記載しているが、ライブ中にアーティストが上手下手どちらに向くことが多いのか調査したい。
このデータを取得するまでの道のりを記載しておく。

1. 映像から画像取得
1. 人物判別
1. 特定人物の顔向き取得
1. 画像から人物切り抜き、背景を取得
1. 背景の壁またはステージ向きを取得
    1. watershedで領域分離
    1. 面検出
    1. 面向き取得

背景の向き推定が難しい

# 他にも使えそうな情報(メモ書き)
* OpenPoseで顔向き推定
* 楽器（ドラム等）で背景の推定
* カメラの姿勢推定
*
DjangoでAmazon SESを使用したとき発生した500エラーの解決方法

EC2を使ってDjangoアプリをデプロイし、その中のメール送信フォームからメールを送信したところ500エラーが発生した。
メール送信にはAmazon SESを使用していて、サンドボックスは解除済みである。
エラー文を見ると、

```
botocore.errorfactory.MessageRejected: An error occurred (MessageRejected) when calling the SendRawEmail operation: Email address is not verified. The following identities failed the check in region US-EAST-1: [メールアドレス]
```

と書かれていた。

<h1>解決方法</h1>

settings.pyに

```
AWS_SES_REGION_NAME = 'ap-northeast-1'
AWS_SES_REGION_ENDPOINT = 'email.ap-northeast-1.amazonaws.com'
```

と書き込む。
リージョンは登録したときによって変わる。
[Terraform] cidrsubnetを使ったときの参照

# はじめに
cidrsubnetを使ってsubnetを作ったときにどのように参照するかいつも忘れるのでメモ。

- インデックスを使う参照
- listにする参照


# サブネットの記載
vpcのCIDRブロックからAZ数だけ/24で取ってくる記載。
AWSの場合はコピペでいけると思う。(きっと)

``` terraform
data "aws_availability_zones" "available" {}

resource "aws_subnet" "private" {
  count             = var.az_count
  cidr_block        = cidrsubnet(aws_vpc.main.cidr_block, 8, count.index)
  availability_zone = data.aws_availability_zones.available.names[count.index]
  vpc_id            = aws_vpc.main.id
}
```

# 参照方法

aws_security_groupのcidr_blocksでいつも迷うので、サンプル記載する。

## インデックスを使う参照
数分だけベタ書き。これでは変更されたとき気づけないので微妙。
```terraform
resource "aws_security_group" "rds-sg" {
  name        = "mysql-rds-sg"
  description = "MySQL security group"
  vpc_id      = aws_vpc.main.id

  ingress {
    from_port   = 3306
    to_port     = 3306
    protocol    = "tcp"
+   cidr_blocks = [aws_subnet.private[0].cidr_block,aws_subnet.private[1].cidr_block]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "example-rds-sg"
  }
}
```

## listにする参照

これをいつも忘れる。

``` Terraform
resource "aws_security_group" "rds-sg" {
  name        = "mysql-rds-sg"
  description = "MySQL security group"
  vpc_id      = aws_vpc.main.id

  ingress {
    from_port   = 3306
    to_port     = 3306
    protocol    = "tcp"
+   cidr_blocks = [ for cb in aws_subnet.private[*].cidr_block : cb ]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "example-rds-sg"
  }
}
```
ServiceNow - 曜日タイプを使う

曜日を選択するフィールドを作成します。
普通にはチェックボックスを7つ作成しますが、今回はServiceNowに隠れている「週」型を利用します。週型を利用すると次のように1つのフィールドに月曜日から日曜日のチェックブックスが並ぶので便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/3aff54df-ca94-0dfb-3625-c8cd5a88d9bb.png)

#週型のフィールド作成手順
1. フィールドを追加するテーブル名を探します。今回は新しいテーブルを作成しました。
1. Webブラウザから次ぎのURLを開きます。<br/>https://<インスタンス名>.service-now.com/sys_dictionary.do?sys_id=-1&sysparm_query=internal_type=days_of_week
1. 辞書エントリの新規レコードページが開きます。タイプは「週」とされています。テーブル名、列ラベル、列名を入力して登録します。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/53e09c55-cf1c-8788-ab68-736fa442ceb6.png)
1. テーブル定義ページを表示すると週型のフィールドが追加されていることを確認できます。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/fca83ba1-8e1d-f106-7523-1d2651207ca4.png)
1. テーブルのフォームを開くと曜日選択フィールドが表示されます。

#週不型フィールドの値を調べる
週型フィールドにどのような値が登録されるかを調べます。
1.フォームデザインを利用してフォームに文字列フィールドを追加します。このフィールドにonChange()スクリプトで週型フィールドの値を表示させます。
```
function onChange(control, oldValue, newValue, isLoading, isTemplate) {
   if (isLoading || newValue === '') {
      return;
   }
   g_form.setValue('u_value_of_days_of_week', newValue);
}
```
クライアントスクリプトを作成した後にフォームを開いて、曜日をチェックして見ます。そうすると月曜日から日曜日に対応して1から7が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/748e7856-dba8-b929-abf8-c09b80708809.png)
曜日に対応する数字がフィールド値に含まれているかを確認したらその曜日がチェックされたかを確認することができます。

#隠し型を探す
[雑談]
テーブル定義の列タイプからは選択できませんが、辞書エントリ一覧を見ているとタイプが週のフィールドがあります。このように辞書を閲覧していると色々と探すことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/146c3c82-ca02-ef59-87b2-384233d484e7.png)

以上
パージのプロセス

## ３、パージのプロセス

パージと参照マーカーは個別に実行できます。通常、パージはフレームごとにインクリメントして実行されます。

IncrementalPurgeGarbage（bool bUseTimeLimit、float TimeLimit）を呼び出して、2つのパラメーターを受け入れ、ガベージパージを行います。

>bUseTimeLimit：パージの時間制限があるかどうか
TimeLimit：メソッドの1回の実行の時間制限

この2つのパラメーターを使用してインクリメンタルクリーニングまたはフルクリーニングを選択的に実行できます。

最初に、UnhashUnreachableObjectsメソッドが呼び出され、RF_BeginDestroyedが設定されていないすべての到達不能なUObjectに対してBeginDestroyメソッドが呼び出され、UObjectが破棄されることを通知して、UObjectが非同期パージ操作を実行できるようにします。カスタム操作を実行するために、BeginDestroyメソッドを上書き処理できます。

**その後、GCロックを取得できます。**

パージするオブジェクトをトラバースし、それらのオブジェクトのFinishDestroyメソッドを呼び出します。ただし、オブジェクトがBeginDestroyを終了していない可能性があります。レンダリングスレッドが使い果たされるのを待機しているグラフィックアセットなど、非同期操作があるため、これらのオブジェクトはすぐにFinishDestroyを呼び出すことはできません。代わりに、まずGGCObjectsPendingDestruction配列に配置した後に処理します。トラバーサルプロセス中に、経過時間がチェックされます。制限時間に達すると、途中で停止し、現在の進行状況を記録してから、パージプロセスを終了します。

パージするすべてのオブジェクトをトラバースした場合、つまり、それらに対してFinishDestroyメソッドを呼び出すことを試みた場合は、GGCObjectsPendingDestruction配列を再度トラバースし、FinishDestroyの実行を再試行します。このGGCObjectsPendingDestructionのトラバーサルが完了したら、TimeLimitを使用するかどうかを確認する必要があります。 TimeLimitを使用すると、次のロジックが直接実行され、GGCObjectsPendingDestruction内のオブジェクトが次回処理されます。使用しない場合は、この場所でブロックされ、それらのUObjectがBeginDestroyの実行を終了することを強制的に待機し、主にレンダリングスレッドを待機します。GGCObjectsPendingDestruction内のすべてのオブジェクトがFinishDestroyを実行した後、次のパージ操作が実行されます。

次は、実際のパージプロセスです。これは主に、パージされるオブジェクトをトラバースし、UObjectのデストラクタを実行し、メモリスペースを解放します。この手順では、リリースがTimeLimitを超えていることも確認し、超過分は次のフレームで引き続きパージされます。

--- 

### 3.1 UObjectへのポインタがどのようにNULLに更新されるか

これは、拡張された質問です。UobjectのDestroy（）関数の呼び出しを表示して、UObjectが次のガベージコレクションでリサイクルされるようにすることができますが、UObjectのUPropertyポインター、またはコンテナー内のポインターはどうなりますか。ダングリングポインタということが引き起こされるか？答えはノーです。UE4を使用した後、UPropertyポインターが有効かどうかを判断するには、それが空かどうかを判断するだけでよいことがわかります。これにより、C++の開発に非常に便利です。オブジェクトが破棄されると、UE4はオブジェクトを指すUPropertyポインターを自動的にNullに更新します。UPropertyではないポインターは更新されず、ダングリングポインターの問題が発生します。 [UE4の公式ドキュメント](https://docs.unrealengine.com/5.0/en-US/unreal-object-handling/)に詳細な説明(Automatic Updating of References)があります。

### 3.2ポインターの自動更新の実現原理
到達可能性分析フェーズでは、各オブジェクトのtokenstreamを解析して、現在のオブジェクトによって参照されている他のオブジェクトを見つけます。他のオブジェクトがPendingKillとしてマークされている場合、そのオブジェクトへのポインターはNULLに設定されます。したがって、ポインタの更新プロセスでは、最初に破棄するオブジェクトへのすべてのポインタをNULLに設定し、次にオブジェクトを破棄して、ダングリングポインタの問題が発生しないようにします。

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

今なら、UWA GOTローカルツールが**15日間に無償試用**できます！！
よければ、ぜひ！

UWA公式サイト：https://jp.uwa4d.com
UWA GOT OnlineレポートDemo：https://jp.uwa4d.com/u/got/demo.html
UWA公式ブログ：https://blog.jp.uwa4d.com
Windows 用のファイル複製スクリプト(日時付加、二重拡張子対応)

# Windows 用のファイル複製スクリプト

Windows のエクスプローラで、ファイルをコピー→貼り付けすると、元ファイルのコピーができます。
ですが、下記の点がちょっと不満でした。

- 二重拡張子に対応していない。「test.xxx.txt」をコピペすると「test.xxx - コピー.txt」のようになる。（「test - コピー.xxx.txt」のようになるべき）
- バックアップしたファイル名にファイル生成日時を入れたい。

そこで、ファイルを引数として渡したらファイルの複製を作るだけのスクリプトを用意してみました。
「test.xxx.txt」に対して「test_20220421_200859.xxx.txt」のようなファイル名でバックアップが生成されます。
同名のファイルが既に存在する場合は、「test_20220421_200859(1).xxx.txt」「test_20220421_200859(2).xxx.txt」のように番号が追加されていきます。今のところ連番は10個までです。


# このスクリプトを「送る」に登録する

- 記事末尾のソースを「backup_file.vbs」の名前でローカルに保存します。文字コードは Shift_JIS としてください。
- エクスプローラで shell:sendto を指定すると、「送る」フォルダが開きますので、「送る」フォルダに backup_file.vbs へのショートカットを配置します。


# 使い方

- エクスプローラでバックアップしたいファイルを右クリックして、「送る」からbackup_file.vbsを実行してください。
- ファイルを複数選択している場合は、選択したファイルそれぞれについてバックアップを作成します。
- フォルダのバックアップは生成しません。


# ソース

```vb
'
' backup_file.vbs
'

Dim oFileSys: Set oFileSys = CreateObject("Scripting.FileSystemObject")
Dim arg, n

Set arg = WScript.Arguments
For n = 0 To arg.Count - 1
	Backup arg.item(n)
Next

Sub Backup(ByVal sFile_full)
	Dim oFile, sFolderTo
	Dim d, sTime
	Dim sFile1, sFileExt, sFileNew, sFileNew_full
	Dim nPos
	Dim i

	If Not oFileSys.FileExists(sFile_full) Then
		MsgBox "ファイルが見つかりません" & vbCrLf & sFile_full
		Exit Sub
	End If

	Set oFile = oFileSys.GetFile(sFile_full)
	sFolderTo = oFile.ParentFolder.Path

	d = oFile.DateLastModified	'最終更新日時
	sTime = Year(d) & Right("0" & Month(d), 2) & Right("0" & Day(d), 2)
	sTime = sTime & "_" & Right("0" & Hour(d), 2) & Right("0" & Minute(d), 2) & Right("0" & Second(d), 2)

	'oFileSys.GetExtensionName は使わない
	sFile1 = oFile.Name
	nPos = Instr(sFile1, ".")
	If nPos = 0 Then
		sFileExt = ""
		sFileNew = sFile1 & "_" & sTime
	Else
		sFileExt = "." & Mid(sFile1, nPos + 1)
		sFileNew = Left(sFile1, nPos - 1) & "_" & sTime
	End If
	sFileNew_full = oFileSys.BuildPath(sFolderTo, sFileNew & sFileExt)

	For i = 1 To 11
		If Not oFileSys.FileExists(sFileNew_full) Then
			oFile.Copy(sFileNew_full)
			Exit Sub
		ElseIf i = 11 Then
			MsgBox sFileNew_full & " が既に存在します."
			Exit Sub
		End If
		sFileNew_full = oFileSys.BuildPath(sFolderTo, sFileNew & "(" & i & ")" & sFileExt)
	Next
End Sub
```
UE4GCの概要

## １、UE4GCの概要

UE4には、一連のUObjectオブジェクトシステムが構築され、ガベージコレクションメカニズムも追加されました。これにより、ゲーム開発にC ++を使用しやすくなり、ゲーム自体でメモリリークの問題を大幅に回避できます。

UE4は、従来のガベージコレクション方式である「マーク・パージ」というガベージコレクション方式を採用しています。ガベージコレクションは2つの段階に分かれています。第一段階はあるルートコレクションから始まり、到達可能なすべてのオブジェクトをトラバースします。トラバースが完了すると、到達可能なオブジェクトと到達不可能なオブジェクトにマークを付けることができます。このステージは1フレームで完了します。第2段階では、これらの到達不能なオブジェクトを徐々にパージします。到達不能なオブジェクトにはアクセスできないため、一度に多くのUObjectがパージされ（例えば、mapがアンロードされると、明らかなフリーズが発生します。）ないように、フレーム内でパージできます。

GCはゲームスレッドで発生し、UObjectをパージし、マルチスレッドGCをサポートします。

ゲーム内で最大のUObjectオブジェクトを指定するMaxObjectsInGameなど、いくつかのパラメーターをGCに設定できます（エディターでは有効になりません）。モバイルプラットフォームのデフォルト設定は131072です。UObjectの数がこのしきい値を超えると、ゲームがクラッシュします。その他の詳細なパラメーター関連するプロパティは、UGarbageCollectionSettings、GarbageCollection.cpp、およびUnrealEngine.cppで確認できます。

次の図は、マークパージの動作原理を示しています。
![GC1.1603875357853.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/ced785d1-8c60-40c1-8047-853218b7fec1.png)



 

### 1.1 GCの開始時期：

UE4のGCは、アクティブトリガーと自動トリガーの2つの方法に分けることができます。

#### 1.1.1 アクティブトリガー

ある操作を実行する同時に手動で呼び出せます。例えば、アセットをアンロードするとすぐにGCを呼び出してパージすることができます。

そして、多くの方法があります。例えば、ゲームはForceGarbageCollectionを呼び出して、Worldに次のtickでガベージコレクションを実行させることができます。また、CollectGarbageを直接呼び出すこともできます。エンジンのほとんどの状況は、この方法でアクティブにトリガーされます。

#### 1.1.2 自動トリガー

ゲームでは、ほとんどのガベージコレクション操作はUE4によって自動的にトリガーされます。通常の状況では、手動でGCを呼び出す必要はありません。これは、GCを使用するための理想的な方法でもあります。

World tickが発生すると、UEngine::ConditionalCollectGarbage()関数が呼び出され、関数でいくつかの判断が行われます。GC条件が満たされると、GCが実行されます。ConditionalCollectGarbageの実行ロジックを分析してみましょう。
![绘图1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/6c6c917e-8700-f7c6-b596-68964940b473.png)

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

今なら、UWA GOTローカルツールが**15日間に無償試用**できます！！
よければ、ぜひ！

UWA公式サイト：https://jp.uwa4d.com
UWA GOT OnlineレポートDemo：https://jp.uwa4d.com/u/got/demo.html
UWA公式ブログ：https://blog.jp.uwa4d.com
【2022年版】独学でPythonエンジニアになる手順とエンジニアのメリット・デメリット〜実体験を元に解説〜

# はじめに

この記事では筆者の実体験をもとに「独学でPythonエンジニアになる手順」について紹介していきます。

「**独学でPython学習する具体的な手順は？**」

「**Pythonエンジニアになるにはどんなことをすれば良いの？**」

「**実際に独学でPythonエンジニアになった人ってどんなことをしてるの？**」

この記事を読むことで上記の悩みを解決することができます。

この記事を読んでPythonエンジニアを目指していきましょう！

:::note warn
この記事では、以下の記事の「**僕がPythonエンジニアになるまでにしたこと**」について書いていきます。
記事の全体は以下から読めます！（もちろん無料です。）
:::

https://chaldene.net/python-engineer

それでは早速みていきましょう！

# Pythonエンジニアになるまでにしたこと

この章ではPythonエンジニアになるまでに自分がしてきたことを紹介していきます。

時系列に沿って紹介していくので、読んでくれる方の参考になれば幸いです。

それでは早速みていこう！

## プログラミング学習開始

最初の方でも書いたように筆者は2020年1月に独学でプログラミング学習を開始しました。

最初はHTML、CSSを学習して、フロントエンジンを目指していました。

しかし、プログラミングスクールのTA（ティーチング・アシスタント）のお誘いがあり、急遽Pythonの学習を始めることにしました。

## ひたすらPython

プログラミングスクールではPythonの質問などに答えられる必要があるため、なるべく早くPythonやIT関連の知識をつける必要がありました。

本を読んだり、動画を見たりしてひたすらインプットしては、何か作ったりとアウトプットをしていました。

「オセロ」、「Slackボット」、「競技プログラミング」などとにかくできる範囲でアウトプットしてました。(特にオセロがおすすめです。)

## ひたすらDjango

今度はPythonのフレームワーク（アプリケーションのひな型のようなもの）であるDjangoの学習を始めました。

個人的には機械学習もやってみたかったのですが、数学が苦手な自分にはハードルが高くまずはDjangoから取り組みました。

DjangoもPython同様ひたすらインプットとアウトプットを繰り返していました。

「todoリスト」、「メモ帳」などほんと基本的なものですが…。

Djangoは関数で書く方法と、クラスで書く方法（ちょっと専門的ですが）の2種類があります。

筆者はクラスで始め書いていたのですが、基礎的な部分から先に進めず1ヶ月くらい足踏みしてました。

しかし、とある記事をきっかけに爆発的にDjangoスキルが向上し、さらにアウトプットを重ねました。

## 機械学習の森に入る

ここからついに機械学習という深い深い森に足を踏み入れました。

そもそも数学が苦手なため、基礎の基礎からやってましたが、まぁ理解できない！

一回数学は置いておいて概念理解とコード実装の方に注力していきました。

そのタイミングで学生を対象に100万円する講座を無料で受けられるインターン、というのを開催していたので迷うことなく参加しました。

月1くらいでテストがあり、そのテストに合格しないと次のステップに進まないためわからないながらがむしゃらにがんばりました。

その結果、最終テストには合格できませんでしたが良い経験をすることができました。

## 機械学習のバイトに合格

未経験かつ機械学習についてペーペーだった筆者がなんと機械学習エンジニアのバイトに受かりました！

このときはめちゃくちゃ嬉しかったですね。

やる気満々で業務に携わっていきましたが、まあできない。

できないながら一生懸命でしたが、本当に社長には迷惑かけたなと今でも思います。

機械学習に関してはDjango以上に理解に時間がかかっていました。(今でも理解しきれてない)

最初は機械学習エンジニアを目指していましたが、あまりにも自分ができないのでその夢は捨てました。

## 就職先決まる

そんなこんなしているうちに、あっという間に就活の時期が来てしまいました。

とりあえずベンチャーがいいなと思い、自分が興味持ったところを受けていたところ、1社から採用の連絡があり就活を終えました。

なぜベンチャーにしたのかについては最終章で述べているのでそちらも読んでいただけると嬉しいです！

## 就職先でバイト開始

就職先が決まった際に、「早めからバイトとして入ってくれると嬉しい」ということを言われ、自分的にも断る理由がなかったので、就職先でのバイトが始まりました。

週2日くらいの頻度で1年くらいバイトをしてから本格的に4月に入社しました。

1年くらいバイトしていたので、社内の雰囲気などもわかっていますし、他の人のこともある程度わかっていたのでスムーズに業務に取り掛かかれたのがよかったです。

## まとめ

この章では筆者がエンジニアになるまでやってきたことを時系列順で紹介してきました。

振り返ると最初の1年はだいぶ濃厚でした。

途中少し減速しましたが、継続することが何よりも大事なので諦めず挑戦し続けてこれてよかったです。

# 最後に

この記事では、「**僕がPythonエンジニアになるまでにしたこと**」について書いてきました。

以下の記事の一部を抜き出して書いたので全体を読みたい方は以下から読めます！（もちろん無料です！）

全体の構成としては、

:::note info
- **筆者の現状と経歴**
- **なぜPythonエンジニアになろうと思ったか？**
- **Pythonの特徴**
- **Pythonエンジニアになるまでにしたこと**
- **エンジニアになってみてどうか**
- **【コラム】
就職するなら大企業？ベンチャー？**
:::

https://chaldene.net/python-engineer

お役に立てれば幸いです🙇‍♂️
Railsの {OO: :OO} これ何⁇　{OO: OO} とどう違う？　【シンボル、ハッシュ】

# Railsによく出てくるシンボル、ハッシュについて
## 結論
`{OO: OO}`は、ハッシュのキーとしてシンボルを用いた形である。
そして、
`{OO: :OO}` は、キーがシンボルで値もシンボルであるハッシュのことを指している。
これについて以下で詳しく調べてみる。
## シンボルって何？
文字列の先頭に`:(コロン)`がついているオブジェクトのことを指す。
Stringオブジェクトが文字列を表すのに対して、Symbolオブジェクトは名前を表すものと理解しておく。
##### 1 シンボルは書き換えられない
文字列は書き換えることができるが、シンボルは変更不可である。
##### 2 同じobject_idが割り当てられる
シンボルは同じobject_idが割り当てられるので、以下の通り2つのオブジェクトは同一である。しかし、文字列は2つのオブジェクトは等しいが同一ではない。
``` ruby:ruby
 # 文字列
"foo1" == "foo1"      #=> true
"foo1".equal? "foo1"  #=> false

 # シンボル
:foo1 == :foo1        #=> true
:foo1.equal? :foo1    #=> true
```
##### 3 処理が少しだけ早くなる
シンボルは内部では整数として扱われるので、文字列に比べて処理が速くなる。

## ハッシュって何？
ハッシュは両側を`波カッコ{}`で囲んで、キーと値の組をカンマで区切ることで指定できる。
ハッシュのキーとシンボルは重複を許さないので相性が良く利用されている。
``` ruby:ruby
a = {:foo1 => 1, :foo2 => 2, :foo3 => 3}
 # 上も下も同じ
a = {foo1: 1, foo2: 2, foo3: 3}　　# =>の代わりに:で区切る
```
ハッシュのキーとしてシンボルを用いた形が`{OO: OO}`である。
シンボルをキーにして値をコロンで区切っている。
つまり `{OO: :OO}` はキーがシンボルで値もシンボルであるということがわかる。
例えば、
``` ruby:ruby
user = { name: "Michael", email: "michael@example.com" }
```
これは`user`のハッシュの中に`:name`と`:email`をキーとして、`Michael`という名前と`michael@example.com`というemailアドレスを定義している。
また、
``` ruby:ruby
{ name: :apple }
```
これだと`:name`をキーとしたハッシュであり、値が`:apple`となっている。
ハッシュのキーも値も、シンボルである。
## Rubyをこちらの教材で学びました

https://www.amazon.co.jp/%E6%94%B9%E8%A8%822%E7%89%88-Ruby%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC-Silver-Gold%E5%AF%BE%E5%BF%9C-Ruby%E5%85%AC%E5%BC%8F%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8/dp/4774191949
pyrealsenseでdepthにthread_filterをかける方法



## 目的
↓これの"Score Minimum Threshold"と"Score Maximum Threshold"をpyrealsenseで同じことをしたい

![realsense_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608274/8985cb25-3b10-aa13-e415-76fa756b1d77.png)


## 方法
```python

depth_frame = frames.get_depth_frame()
t = rs.threshold_filter(min_dist=1, max_dist=2)
depth_frame = t.process(depth_frame)

```

### 実行結果
<details><summary>プログラム</summary><div>

```python
import pyrealsense2 as rs

pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.rgb8, 30)

pipeline.start(config)

align_to = rs.stream.color
align = rs.align(align_to)

for x in range(10):
  pipeline.wait_for_frames()

frames = pipeline.wait_for_frames()
frames = align.process(frames)

depth_frame = frames.get_depth_frame()
t = rs.threshold_filter(min_dist=1, max_dist=2)
depth_frame = t.process(depth_frame)

pipeline.stop()
```
</div></details>
	
- 生画像

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608274/5aeef0f9-c790-ab39-bf42-e08b32ae9b5d.png)



- thread_filter(max_depth=1)

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608274/91ab8d8c-dab3-96ec-54de-debec371b991.png)
ubuntu 22.04LTSで最新のnodejsぶち込む方法

ubuntu 22.04LTSでは
```
curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs
```
をしても12ver止まりなので
12verから16or最新verにアップデートする方法
```
sudo npm install -g n
```
最新版のNode.jsのコマンド
```
sudo n latest
```
最新のLTS版のNode.jsのインストール
```
sudo n lts
```
今のnodeのver確認方法
```
node -v
```
今のnpmの確認方法
```
npm -v
```
最新のnodeやnpmこれで行けると思います。
POSIXメッセージキューを実装した時のメモ【最小構成編】

# 目次
0. 前置き
1. POSIXメッセージキューとは
2. 最小構成(できるだけ）
3. 最後に

# 1. 前置き
・仕事でPOSIXメッセージキューのことを知ったので実装してみようと思った
・筆者のITスキルレベルは脱初心者くらい
・Linuxの理解度は初心者に毛が生えた程度

# 2. POSIXメッセージキューとは
POSIXメッセージキューはUnix系OSにあるプロセス間通信をするためのライブラリの一つ。
SystemVというメッセージキューもあるらしいが、今回はPOSIXメッセージキューを実装する。以下のURLを参考にした。
[POSIX メッセージキューについて調べてみた](https://mcommit.hatenadiary.com/entry/2019/07/24/170000)
[Man page of MQ_OVERVIEW](https://linuxjm.osdn.jp/html/LDP_man-pages/man7/mq_overview.7.html)

# 3. 最小構成（できるだけ）
以下のコードは[ここ](https://github.com/y-lab-nk/posix_message_queue/tree/main/posix_min)から引用。引用元は私の個人利用しているgithubである。

```cpp:qsend.cpp
#include <mqueue.h>
#include <string.h>
#include <iostream>

int main(){
    const char * que_name = "/sample";
    struct mq_attr attr;
    mqd_t q;
    
    char buf[] = "hoge";

    // queue open (writeonly or create)
    q = mq_open(que_name, O_WRONLY | O_CREAT, S_IRWXU, NULL);
    
    // queue set message
    mq_send( q, (const char *)(&buf) , sizeof(buf) , 0);
    
    // if queue don't closed, can't open new queue and can't unliunk
    mq_close(q);

    // process stop
    std::cout << "please Enter" << std::endl;
    std::cin.get();

    // queue kill
    mq_unlink(que_name);

    return 0;
}
```

```cpp:qrecv.cpp
#include <mqueue.h>
#include <string.h>
#include <iostream>

int main(){
    const char * que_name = "/sample";
    struct mq_attr attr;
    mqd_t q;
    
    char *buf;

    // queue open (readonly) 
    q = mq_open(que_name, O_RDONLY);

    // queue get setting value
    mq_getattr( q ,&attr );

    // buf size reserve
    buf = (char *)malloc(attr.mq_msgsize);
    
    // messeage get 
    mq_receive( q, (char*)buf, attr.mq_msgsize,NULL);
    
    // buf debug
    std::cout << "buf = " << buf << std::endl;
    
    // malloc release
    free(buf);

    // if queue don't closed, can't open new queue and can't unliunk
    mq_close(q);

    return 0;
}
```

## 実行結果

qsendを先に実行して、キューにメッセージを入れる。「please Enter」って書いてあるけど、enter押すとmq_unlinkするからqrecvを実行してからenterすること。分かっていると思うが、qrecvは別のコマンドプロンプト開いて実行。

```
~/cpp_workspace/POSIX_min$ ./qsend
please Enter
```

```
~/cpp_workspace/POSIX_min$ ./qrecv
buf = hoge
```

qrecvの結果を見るとhogeがちゃんと取得できている。これで2つのプロセス間通信ができていることが確認できた！

## 最小構成のtips集
**・mq_closeするのを忘れる**
忘れるとmq_openもできないし、mq_unlinkもできない。仮想環境のメモリが不足してるので、メモリリークのせいで動かなくなった（一敗）

**・mq_openの第2引数(int oflag)にO_CREATを選択すると、引数4つ必要になる**
[Man page of MQ_OVERVIEW](https://linuxjm.osdn.jp/html/LDP_man-pages/man7/mq_overview.7.html)に書いてあるが、mq_openは引数が4つのパターンと2つのパターンがある。どうやらO_CREATがあると4つのパターンを利用する必要があるみたい。
ちなみにmq_openの第4引数である「struct mq_attr *attr」はNULLにすると、キューには初期設定がされる。初期設定のsizeは8129バイトなので、これより大きいデータを扱う場合は注意。

**・mq_openで第2引数(int oflag)にO_CREATだけ選ぶとエラーを吐く**
何故か作成するフラグだけだとダメらしい。どんなユースケース考えてるのかよく分からない。

**・mq_sendとmq_receiveの第2引数の型変換**
constの有無に注意。mq_receiveでconstを外すのは…char以外の型に変換したいから（？）

# 4. まとめ
今回はPOSIXメッセージキューの最小構成を構築して、実際にメッセージの送受信を確認した。

次回は構造体の送受信と、POSIXメッセージキューのめんどくさい点を隠蔽したクラスの設計をしてみる。ちなみにエラーチェックしてないのは最小構成にするために無駄なコードを省いた結果なので、次回はエラーも考慮して実装する。
RDSのアラートログで「Thread 1 cannot allocate new log」が出力された時の対応

# 目次
[1.前提](#1-前提)
[2.事象](#2-事象)
[3.とりあえずエラーメッセージで検索した結果](#3-とりあえずエラーメッセージで検索した結果)
[4.ログファイルサイズを大きくしたが](#4-ログファイルサイズを大きくしたが)
[5.困ってサポートに問い合わせた結果](#5-困ってサポートに問い合わせた結果)
[6.感想](#6-感想)

# 1. 前提
+ データベースエンジンはOracle 19c
+ 作成直後のRDSで、後述するエラー発生条件である膨大な更新処理などは実施していない

# 2. 事象
RDSのアラートログにおいて、5分おきに下記のエラーメッセージが出力されていました。
```
Thread 1 cannot allocate new log, sequence XXXX Checkpoint not complete
```
# 3. とりあえずエラーメッセージで検索した結果
クラスメソッド様の[こちら](https://dev.classmethod.jp/articles/rds-oracle-resize-redologfile/)の記事がヒットし、下記の内容が記載されていました。
>+ 上記エラーメッセージはログスイッチ発生時にチェックポイントが未完了であり、ログスイッチが待ち状態になっている時に出力される。
>
>+ ログスイッチの頻発が上記エラーメッセージの一因になっているため、出力REDOログファイルのサイズ・数を増加してログスイッチの発生間隔を長くする必要がある。

# 4. ログファイルサイズを大きくしたが
記事の内容に沿って、デフォルトのREDOログファイル構成「128MB×4」を「500MB×3」に変更しました。
しかしアラートログのエラーメッセージ内容は変わらず、出力頻度も変わらず5分おきでした(つまりログスイッチ発生頻度も変わっていません)。
サイズが不足していたのかもしれないと考え「1000MB×3」に設定しましたが状況は変わりませんでした。

# 5. 困ってサポートに問い合わせた結果
AWSサポートに問い合わせた結果、下記のような回答が返ってきました。
>+ エラーメッセージが出力されることはRDS for Oracleで想定される動作であり、問題ない。チェックポイント完了時にログスイッチは正常に実行される。
>
>+ ポイントインリカバリのためにログスイッチは5分間隔で発生するよう設定されており、5分以上に設定することはできない。(設定内容は初期化パラメーター ARCHIVE_LAG_TARGETで確認可能。)
>
>+ もしログスイッチが5分より短い頻度で実行されている場合は更新量に対してREDOログファイルサイズが小さい可能性があるためサイズ増強を勧める。
>
>+ ログスイッチ関連が原因となってRDSのパフォーマンスに悪影響が発生している場合、Performance Insightsにおいて下記のような[待機イベント](https://docs.oracle.com/cd/F19136_01/refrn/descriptions-of-wait-events.html#GUID-2FDDFAA4-24D0-4B80-A157-A907AF5C68E2)という形で現れる。
　・log file sync
　・log file switch (checkpoint incomplete)
　・log file switch completion

上記待機イベントは発生していなかったので、特に何もする必要はないことが分かりました。
最初に確認しとけよって話ですが、パフォーマンスに問題ない本番稼働RDSのアラートログにも上記エラーメッセージが5分おきに出力されていたので、本当に仕様らしいです。

# 6. 感想
「オンプレのOracleだとログスイッチ頻度は20分に1回ペースが理想らしいから、5分に1回ペースは異常じゃん‥合わせなければ！」と思って奔走していましたが、結局RDSの仕様だったというオチでした。オンプレにおける定石は決してクラウドにおける定石ではないことを思い知りました。

また、Performance Insightsはとりあえず設定しているものの全然使っていなかったのでこまめにチェックしようと心に決めました。

特にエビデンスも何もない記事になってしまいましたが、同じエラーメッセージが出てびっくりした人の一助となれば幸いです。
PythonでQRコード生成

## はじめに
QRコードを作成する必要があったのですが、Pythonで簡単に生成できたのでメモ。
簡易的な生成コードなのでデフォルトパラメータでの出力となっています。
カスタマイズが必要な場合はドキュメントを参考にしてください。

## 必要なライブラリをインストール
```
$ pip install qrcode
$ pip install pillow
```

## 生成コード
```qr.py
import sys
import qrcode

def generate_qr(data, output):
    qr = qrcode.QRCode()
    qr.add_data(data)
    img = qr.make_image()
    img.save(output)


if __name__ == '__main__':
    args = sys.argv
    generate_qr(args[1], args[2])
```

## 実行
```
$ python qr.py <URL等のQRコードに埋め込みたいデータ> <出力ファイルパス>
```

## 参考
https://github.com/lincolnloop/python-qrcode
Visual Studio CodeのExtensionで、CSS in JSでもCSS Custom Propertiesを補完させる

## この記事の概要

私は最近CSS in JSでスタイルを書くことが多いのですが、CSS Custom Properties（CSS変数）が補完されず微妙に非効率な思いをしていました。
これを解消できるVisual Studio CodeのExtensionを発見したので、簡単な使い方とともに紹介します。

また、`新人プログラマ応援 - みんなで新人を育てよう！`イベントへの参加記事でもあります。

https://qiita.com/official-events/3f21c92121aa125807b4

## 最終イメージ

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/67f51e75-47e1-9741-75d5-28a0e62938ca.png)

CSS Custom Propertiesを定義しているのも、それを呼び出しているのもTypeScriptのファイルです。
しかし、ちゃんと補完が効いています。

## Extension

こちらのExtensionです。

https://marketplace.visualstudio.com/items?itemName=vunguyentuan.vscode-css-variables

似たようなExtensionはいくつかありましたが、`.css`のファイルを触っている間しか補完が効かないなど……。
`CSS Custom Properties`や`CSS Variable`などで検索してヒットするものをひとしきり試した中ではこのExtensionが1番求めるものに近かったです。

### デフォルト設定

上記のドキュメントにある通りですが、デフォルトでは以下のファイルを対象にして補完されます。

```
[
  "**/*.css",
  "**/*.scss",
  "**/*.sass",
  "**/*.less"
]
```

また、以下のものは除外されています。

```
[
  "**/.git",
  "**/.svn",
  "**/.hg",
  "**/CVS",
  "**/.DS_Store",
  "**/.git",
  "**/node_modules",
  "**/bower_components",
  "**/tmp",
  "**/dist",
  "**/tests"
]
```

### `.js`や`.ts`内でCustom Propertiesを定義する際

styled-componentsの`createGlobalStyle`やEmotionの`Global`を使用している場合、`.js`や`.ts`のファイル内でCustom Propertiesを定義することもあると思います。

この場合、Visual Studio Codeの`settings.json`を開いて、以下のように記載します。

```json-doc
{
  // 既存の設定
  "cssVariables.lookupFiles": [
    "**/*.css",
    "**/*.scss",
    "**/*.sass",
    "**/*.less",
    "**/*.js",
    "**/*.ts"
  ],
}
```

グローバルな`settings.json`ではなく、ワークスペース固有の`settings.json`に対して指定するのももちろんOKです。

```json-doc
{
  // 既存の設定
  "cssVariables.lookupFiles": [
    "path/to/styles.js",
    "path/to/styles.ts"
  ],
}
```

---

最後まで読んでくださってありがとうございます！
Twitterでも情報を発信しているので、良かったらフォローお願いします！

https://twitter.com/xrxoxcxox
【Laravel】ポリシーのauthorizeメソッドの引数についてのメモ

環境 Laravel6.2

## ポリシー側で使わないモデルでも引数に入れる必要がある

例えば、ArticleクラスからArticlePolicyを使用したくてauthorizeメソッドを使う際、
Policy側のメソッド内で特にArticleモデルが必要なかったとしても
どのポリシーを使うのかは指定しなければならないので
`$this->authorize('ポリシー側のメソッド名', Article::class);`
といった形でArticleモデルを引数に入れる必要がある。

## モデル以外で渡したい値がある場合

下記のように配列で渡す。

```php
public function deleteComment(Request $request)
    {
        $comment = Comment::find($request->commeid);
        $this->authorize('deleteComment', [Article::class,$comment->user_id]);
        $comment->delete();
    }
```

ちなみにArticlePolicy側は下記のような感じ。

```php
public function deleteComment(User $user,int $commentUserId)
    {
        return $user->id === $commentUserId;
    }
```

## 公式

https://readouble.com/laravel/6.x/ja/authorization.html#via-the-user-model
【php】tips


### 入力データの受け取り
```PHP
$e = trim(fgets(STDIN));
```
trim = 文字列の先頭や末尾にある空白や改行を取り除く
fgets() = 指定した場所からデータを一行受け取る
STDIN = 標準入力

### 平方数の判定
与えられた整数の平方根の小数点以下を切り捨て、それを二乗して元の数になるかどうかを判定
```PHP
function is_square($n)
{
    $sqrt = floor(sqrt($n));
    return ($sqrt*$sqrt == $n);
}
```

### 絶対値
```PHP
abs(-1);
```
```PHP
1
```

### ランダム関数
```PHP
$e = rand(x,y);
```
x～yの範囲でランダムな値を生成する
【php】配列操作基礎

# 配列

配列すべてはechoでは出力できない
```PHP
$team = array("勇者", "魔法使い");
print_r($team);
```

特定の要素のみを出力する場合はechoを用いる
```PHP
echo $team[1];
```
```PHP
魔法使い
```

### 要素の追加
```PHP
$team[] = "ドラゴン";
print_r($team);
```
```PHP
Array (
	[0] => 勇者
	[1] => 魔法使い
	[2] => ドラゴン
)
```

### 要素の削除(unset)
ただしunsetを用いた場合、その番号は歯抜けになる
```PHP
unset($team[1]);
print_r($team);
```
```PHP
Array (
	[0] => 勇者
	[2] => ドラゴン
)
```

### 特定の文字で区切って配列に追加(explode)
```
勇者,魔法使い,ドラゴン
```
```PHP
$input = trim(fgets(STDIN));
$array = explode(",", $input);
print_r($array);

```
```
Array (
	[0] => 勇者
	[1] => 魔法使い
	[2] => ドラゴン
	)
```

### 要素数をカウント
```PHP
echo count($array);
```

foreachで配列の値を取り出す

foreach(配列 as バリューを代入する変数)
```PHP
foreach($array as $value) {
	//処理
}
```

### 特定の値で配列を埋める
array_fill(最初のインデックス, 埋める個数, 埋める内容)
```PHP
$a = array_fill(0, 5, "森");
print_r($array_fill);
```

```PHP
Array (
	[0] => 森
	[1] => 森
	[2] => 森
	[3] => 森
	[4] => 森
)

```

# 連想配列

配列名 = array(key => value)
```PHP
$a = array(
	"ロングソード" => 4,
	"ショートソード" => 3
);
print_r($a);
```
```
Array (
	[ロングソード] => 4,
	[ショートソード] => 3
)
```

### 連想配列の追加

```PHP
$add["ダガー"] = 5;
print_r($add);
```

```PHP
Array (
	[ダガー] => 5;
)
```

### 連想配列の削除

unset(配列名[key]);

```PHP
unset($a["ロングソード"]);
```

### 連想配列の整理

- **sort**(配列);
配列のvalueを小さい順（1,2,3,,や あ,い,う,, という順）に並び替えます。
連想配列に対して実行するとキーが失われるので注意。

- **asort**(配列);
連想配列のvalueを小さい順（1,2,3,,や あ,い,う,, という順）に並び替えます。

- **arsort**(配列);
連想配列のvalueを大きい順（3,2,1 や う,い,あ という順）に並び替えます。

- **ksort**(配列);
連想配列のkeyを小さい順（1,2,3,,や あ,い,う,, という順）に並び替えます。

- **krsort**(配列);
連想配列のkeyを大きい順（1,2,3,,や あ,い,う,, という順）に並び替えます。

foreachで連想配列の値を取り出す
foreach(配列 as キーを代入する変数 => バリューを代入する変数)
```PHP
foreach($array as $key => $value){
	//処理
}
```

### 重複した配列要素を削除
array_unique
```PHP
 $array = ["one", "two", "three","two"];
 $unique = array_unique($array);
 
 print_r($unique);
```
```PHP
Array
(
 [0] => one
 [1] => two
 [2] => three
)
```

### 配列の中を検索
in_array(string, array)
```PHP
$array = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $array)) {
    echo "true";
}
```
```
true
```

### 要素の先頭を削除し、要素を詰める
```PHP
$fruits = array("いちご", "りんご", "ぶどう", "ばなな");
array_shift($fruits);
var_dump($fruits);
```
```PHP
array(3) {
  [0]=>
  string(9) "りんご"
  [1]=>
  string(9) "ぶどう"
  [2]=>
  string(9) "ばなな"
}
```
【Rails】データベースを元に戻す方法

# はじめに
Railsでアプリを開発しているときに、、
やっばっ！！間違って「rails db:migrate」しちゃった！！:cloud_lightning:

ってときありますよね。

そんな時に使える「元に戻す方法」を伝授します:older_man::sparkles:

# 元に戻す方法

### マイグレーションの変更を元に戻す
```
$ rails db:migrate
# を元に戻したい場合は、、

$ rails db:rollback
#　とすればOK！
```

ちなみに、最初の状態に戻したい時は
```
$ rails db:migrate VERSION=0
# とすれば戻ります！
```

## その他、元に戻す方法

### コントローラー
```Ruby
$ rails generate controller StaticPages home help
# 生成したコントローラーを元に戻すには

$ rails destroy  controller StaticPages home help
#　として削除すればOK！
```
コントローラー名、アクション名は、削除したい対象に変更してください:point_up:

### モデル
```Ruby
 $ rails generate model User name:string email:string
# 生成したモデルを元に戻すには

$ rails destroy model User
# とすればOK！
```
こちらもモデル名などは、適宜変更してください:point_up::point_up:

# まとめ
以上、簡単にですが生成したデータベースなどを元に戻したり、削除したりする方法をまとめてみました。
コントローラーやモデルに関しては、生成時に関連ファイルも大量に生成するので、コントローラファイルやモデルファイルを削除するだけでは元に戻らないので、注意しましょう。
Zemax .txt を C++ で読みたいメモ

Zemax(最近の Optics Studio) の .txt ファイル(e.g. PSF とか)は, 中身が UTF-16LE(bom 付き. Windows 標準?)です.
(ANSI(ASCII) で保存するオプションもある)

C++ で直接みたいときはちょっとめんどいです.
(Python なら encode='utf-16' で読める)

まず, ファイル名が UTF-16 になっている場合.

C++11 ~ C++ 17 で Windows で fopen/fstream で UTF-8 or Windows パス名(UTF-16)を扱うメモ 
https://qiita.com/syoyo/items/52d55bc1a0dd5d91191d

で対応が必要です.

ファイル内容(content)については codecvt で UTF-16 -> UTF-8 変換できるかもしれません.

## おまけ

C++ で UTF-16 直でなくてもいいのであれば,
python で一旦変換する,
もしくは vim で一旦ひらいて保存すると utf-8 にしてくれるようです.
あとは iconv で変換でしょうか.