OmniAICreator/Qiita-1.07M huggingface dataset:
UiPath 【エラー】メッセージが大きすぎて処理できなかったことが原因である可能性があります 

## UiPath【エラー】「メッセージが大きすぎて処理できなかったことが原因である可能性があります。 」

Outlook メール メッセージを取得（GetOutlookMailMessage）アクティビティで取得した List< MailMessage > 型のオブジェクトを出力引数とするxamlを実行する際、件名のエラーが発生します。エラーが発生するxamlを呼び出す側の実行ではエラーは発生しない。（UiPath 2021.10.8）

未解決のためメモとして残しておきます。


## エラー時のスクリーンショットとエラーの詳細

![Qiitaエラーメッセージオーバーフロー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005333/70c3a118-d420-830d-72b9-e474dfd408b8.png)
```:エラーの詳細
RemoteException wrapping System.Exception: ジョブの実行結果を取得できませんでした。メッセージが大きすぎて処理できなかったことが原因である可能性があります。 
```

## エラーとなるワークフロー

「シーケンス.xaml」のみ実行するとエラーが発生する:thinking:

![Qiitaエラーメッセージオーバーフローサンプルソース.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005333/2ff03fd2-494c-a2a9-9788-c7a5e20c6d5f.png)
![Qiitaエラーメッセージオーバーフローサンプルソース引数.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005333/a901a586-ad2c-ca39-3249-7693e8f30352.png)



## エラーが発生するxamlを呼び出すワークフロー

エラーが発生するxamlを呼び出す側（ここではMain.xaml）の実行ではエラーは発生しない。:robot:

![Qiitaエラーメッセージオーバーフローサンプルソース呼び出し.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005333/46de6862-d86d-2153-47da-fbf1f38af8a9.png)



## 調査のためにやってみたこと

・Outlook メール メッセージを取得（GetOutlookMailMessage）アクティビティの「上限数」プロパティを小さな値にする。　

　→　「上限数」プロパティ値を１件としてもエラーとなる

・uipath.config ファイル内の maxMessageSizeInMegabytes パラメーターの値を 増やしてみた。
　例：50MB（最大値はおそらく255MB）
　【メッセージが大きすぎて処理できない】ガイド
　https://docs.uipath.com/robot/lang-ja/docs/message-too-large-to-process

![Qiitaエラーメッセージオーバーフロー解決方法２.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005333/f7e5cf4c-85bd-8a16-15fb-282d876c4131.png)


　uipath.configは管理者権限じゃないと更新できません。
　uipath.config更新後はStudioを再起動する必要があると思います。

　→　255MBに設定してもエラーが発生する状況は変わりませんでした。

:::note 

 【今回のコメント】

　・エラーが発生するxaml単体テスト時は、xamlファイルの最後に出力引数をNullまたはNothingとしてエラーとならないようにしました。
![Qiitaエラーメッセージオーバーフローサンプルソース呼び出しデバッグ時の回避策.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005333/18b58490-14d1-3df3-2bb9-fd74cd2bcedc.png)

　・ 【メッセージが大きすぎて処理できない】ガイドについては、メールに限ったことではなさそうです。本件とは関係なさそう。
　・本件はバグかな？という印象。分かる方いらっしゃいましたらコメント頂けたら嬉しいです。

:::
次の水曜日の Date型 を取得する

### サンプルコード

```swift
import Foundation

let calendar = Calendar(identifier: .gregorian)
let wednesdayComponent = DateComponents(weekday: 4)
let wednesday = calendar.nextDate(after: Date(), matching: wednesdayComponent, matchingPolicy: .nextTime)!

print(Date())
print(wednesday)
```

出力結果
```
2022-09-16 09:05:06 +0000
2022-09-21 00:00:00 +0000
```

https://swiftfiddle.com/xxubpj4fv5gtjmgrznxrmbvybu

### 使ったAPI

[nextDate(after:matching:matchingPolicy:repeatedTimePolicy:direction:)](https://developer.apple.com/documentation/foundation/calendar/2293473-nextdate)

### コメント

https://qiita.com/takashings/items/06ca54974f9ee80c3e97

https://ez-net.jp/article/E0/AoVCmpRM/t6v8TJxbMJgV/

適当に検索するとこれらの記事が引っかかり参考にできそうと思いましたが、
Apple Developerのドキュメントを読んでいるとiOS 8から`nextDate()`のAPIが使えることがわかりました。
こちらを採用しました。
【UE4】数学0点でも分かる、レベルの切り替え方法

**次のステージに行きたい！！！！**
その時に役に立つノードが「**Open Level**」ブループリントです


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/a8129f90-e6cf-d467-85f9-4afcdb2b8e7e.png)


**【使い方】**
「Open　Level」ブループリントの欄に「Level Name」の横に「None」とありますが
そこの欄に移動したいマップの名前を書きます。

＿＿＿＿＿＿＿＿＿＿

**【使い方の例】**
今回の場合は「Main」というマップに移動したいと思います
適当に新規レベル（既存のレベルでも可）を開きましょう。

いろいろな呼び出し方がありますが
今回の場合は「**Awardくん（メインキャラ）**」が「**アクタに触れたら移動**」するようにします。（どこかで聞いた名前だな...）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/558fb425-f5e7-a984-9879-ec6c4adf468d.png)

あとはOpen Levelに行きたいステージネームを書いてね　（上のブループリントは頑張って書いてね（）

＿＿＿＿＿＿＿＿＿＿

**「ステージ1」から「ステージ2」に移動する方法**（ほにゃららLevelのところの「LevelName」は行きたいマップ名を入力してね）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/dcf04570-842a-090a-1438-906da74dfa95.png)

＿＿＿＿＿＿＿＿＿＿

**簡単ですね？？**
はい、もう終わりです、終わりですよ？？

すんごい簡単！！！！！！！！！！！！！
はい終わりでぇぇええぇーーーーすうぅぅううーぅーー！？！？！！！？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/d709d280-0cd0-6082-e91b-11e4393aff80.png)


お借りした最高にロックなプロ銀だかー
https://uuum.jp/creator/kattsu
https://kattu0403.com/
https://www.youtube.com/channel/UC_MTz4eFIPt2ihuqFk8tMqQ/videos

＿＿＿＿＿＿＿＿＿＿

Twitter　https://twitter.com/MapleSyrup77
Noto　https://note.com/ggrks_ue4

ちなみに数学0点はノンフィクションです（中2のころ）

＿＿＿＿＿＿＿＿＿＿
（**注意**！・この記事はUE4歴4ヶ月の人間が書いた記事です、
参考にする場合は気をつけてください、多分大丈夫なはずです、多分）
【Xcode】ローカルのSwift Packageをプロジェクトに追加する方法

# はじめに
検索するといろいろな方法が出てきますが、どれも`import`が出来ませんでした。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620576/9c39294a-6140-10a7-8100-a731ed17f139.png">
自分の環境で正常に動作した方法を共有します。


# 環境
Xcode 13.4.1, 14.0
macOS Monterey 12.6

# 解説
### 前提
ローカルのSwift Packageはgit管理されていることが前提です。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620576/4f028c51-4c54-ff21-e147-b0e58052236c.png">


### 方法
1. Xcodeのメニューバーから`File > Add Packages`を選択
   <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620576/f95ccb86-fb38-6887-fd5e-fb778fcebb9d.png">

2. 右上のサーチバーに`ローカルのSwift Packageのフルパス`(Package.swiftがあるフォルダ)を入力し、右下の`Add Package`をクリック
   <img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620576/e962b851-f248-ee48-0dee-bc799926f5b6.png">

3. `Add Package`をクリック
   <img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620576/6ed81aba-7edb-a1a2-0298-3cee0d42717e.png">

4. 完了！
   <img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620576/89921c8a-7f6f-5623-c139-4e0afd36c245.png">
Rustのrand8.5系でランダム文字列を作成する

# 目的
以前[Rustでランダム文字列を作成する](https://qiita.com/aoyagikouhei/items/b796632ff6581197737c)という記事を書いています。そちらではrand0.5系でランダム文字列を作成しています。
ここではrand8.5系ではどのように変わったかを見てみます。

# コード
```rust:main.rs
use rand::distributions::{Alphanumeric, DistString};

// ランダム文字列を生成する
fn main {
    let mut rng = rand::thread_rng();
    let random_code = Alphanumeric.sample_string(&mut rng, 32);
}
```

```text:結果
2ZN1htXkSjnVzZroFJiHXi2HZXvuFJRS
```


# まとめ
大分シンプルになりました。
AlphanumericはA-Za-z0-9の範囲で生成してくれます。
もうひとつStandardがあり、範囲は「Uniformly distributed over all Unicode scalar values」とのことなので実行すると以下のようになります。

```text:結果
𦹡􀀤𣃠񿕉񳮳𫱜񃕽􂥢𑇘񏳖񵡴񻮍󺓈򑯹񇞽𕛨򄙾𿄯𬙊򑔽񺕞𡻌򂹋𔫍􌁹񈲙򖪊𥹷𐘱򭍩󱔋𡬇
```
1分でわかるNextJS+ChaktaUI画面遷移

## 早速説明いたします。

```
yarn add next/link
```

```
yarn add @chakra-ui/react
```
まずはプロジェクトのルートディレクトリでこの二つを実行しましょう。

そしてjsxファイルなどで

```js
import React from 'react'
import { ChakraProvider } from '@chakra-ui/react'
import { Link } from 'next/link'

//Homeの部分は任意でOKです。
function Home () {
    return (
        <div>
            <NextLink href='./page2' passHref>
                <Link>page2</Link>
            </NextLink>
        </div>
    )
}

export default Home

```

で実装できるはずです。

事前に遷移先のページファイルも用意しておくとよいでしょう。

それでは。

(間違いとうありましたらやさーしくコメントよろです。)
AppSheet UX設定について

## 前置き

前回はAppSheetの概要を紹介させていただきましたが、
今回はアプリの見栄え、Excelでいうところの条件付き書式のような設定を紹介させていただきます。

前回の「AppSheet触ってみた」の記事はこちらから
https://qiita.com/shoyo0111/items/57432f35d9d81fcdefd6


## Format Rulesについて
AppSheetのサイドメニューから[UX]をクリックします。
前回も紹介させていただきましたが、UXはアプリの見栄えなどを設定できる項目になります。

上部タブの[Format Rules]をクリックします。
ここでは条件に応じて項目に色を付けたり、文字を太字にしたりなど、Excelでいうところの条件付き書式のような設定が行えます。

[New Format Rule] をクリックして条件を追加していきます。
![New Format rules.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739387/156ad694-e581-c998-bc81-eecaf7538c75.png)

クリックすると以下のような、条件を追加できる画面が表示されます。


![Format Rules.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739387/982f02e6-0e69-5322-c295-b007b6d6cdee.png)
①Rule name : ルールの名称
②For this data : 元データとなるデータベース
③If this condition is true : ルールの数式
④Format these columns and actions : ルールの条件を適用させるカラム(複数選択可)

![visual Format.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739387/4800c35a-a7b5-441a-88db-e5dc6d19c1c4.png)
⑤Icon : ④で選択したカラムの先頭に表示させるアイコン
⑥Highlight color : アイコンの色。⑤で指定しない場合は選択した色の丸印のアイコンが表示される。
⑦Text color : ④で選択したカラムの文字の色を変更できる


![Text Format.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739387/1477fa60-cbd5-0ae6-42bd-02c6504720f0.png)
⑧Text size : テキストサイズの変更
⑨Underline : 下線を引く
⑩Bold : 太字に変更
⑪Italic : 斜体に変更
⑫Uppercase : 英小文字を英大文字に変更
⑬Strikethrough : 取り消し線を引く

## 実際に設定してみる
条件は「ステータスカラムが完了だったら」[名前]のカラムに設定値を適用で設定しました。
![数式.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739387/0a14e099-cb90-46f4-e176-8ef9f43e0c09.png)

設定値は以下の通りです。
・チェックマークのアイコンを表示
・アイコンの色は青、テキストの色は赤
・文字は太字で取り消し線を追加
![設定値.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739387/c33e428d-f14e-34a9-5167-86e523fa0c19.png)

アプリ上の見栄えはこんな感じです。
しっかりと条件が反映されてますね。
![アプリ画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739387/d6213dc9-c975-bdda-4c01-f563b7ff856f.png)

## 最後に
ステータスやカテゴリなどに合わせて文字の色やアイコンなどを付けるとアプリが華やかになりそうですね。
（あまりやりすぎるとごちゃごちゃしそうですが）

是非簡単に設定できるので試してみてください。
【備忘録】M1 Mac PCのPythonがごちゃごちゃになったので整理した


一年前に購入したM1 Macに、ちゃんと理解せず、とりあえず今まで使っていたHomebrewを入れました。
その後、何かエラーが出る度に、何か入れたり（理解しろ）、何か消したり（理解してないのに消すな）、修正したりして、意味もなくPythonとPython3の両方が存在していたので、整理することにしました。

参考にさせてもらった記事をブックマークする忘備録です。
超初級者向け。

<h2>状況</h2>
Pythonが2つ入っていた。PythonとPython3。
使用頻度はPython3のみ。ちなみに業務ではあまり使わず、仕事でちょっとした自動化をしたり、趣味で勉強しています。




<h2>参考にした記事①</h2>

/etc/paths でパスの優先度が変えられるとかそう言うことも全然知りませんでした。わたしってば本当アホ。


https://skume.net/entry/2022/01/19/060000


よし、これでHomebrewのPython3が優先で使われるぞー！と思って.pyを動かしたらこけた。.pyで使っていたpandasがないって言われました。なぜ。
pipで確認したら、pythonとpandasの場所が違うらしい。どういうこと…


<h2>参考にした記事②</h2>
pandasの場所が、こちらに載っているURLとクリソツだったので、そっちを削除しました。
①で整理したhomebrew Python3にpip install pandasでインストール。
これで無事に使う予定だった.pyが機能しました。


https://code-graffiti.com/how-to-uninstall-official-python3-on-mac/#toc1


他にも参考にさせてもらっていたサイトがあったはずなのですが、URL紛失しました。
そうならないために、こうやって残しておこうと思ったのに。絶対PC機種変えたらまたやってしまう。


とりあえずここで終わります。
Linux SysVinitでの制御とchkconfigコマンドについて

●SysVinitでのサービスの制御
従来のinitプログラムであるSysVinitのシステムでは、システムの起動時initが「/etc/inittab」を参照し、ランレベルに応じた起動スクリプトを実行して各種サービスを順に起動していく。

各ランレベルに応じたスクリプトは「/etc/rc[0-6].d」に入っている。

これらファイルはシンボリックリンクで、「/etc/init.d/（サービス名）」という起動スクリプトの実体にリンクされている。


systemdが採用される前のRHEL 6系ディストリビューションでは、serviceコマンドを使用して手動でサービスの起動・停止やステータス確認を行える。serviceコマンドにサービス名と指示を引数として与えると、「/etc/init.d/」配下の対応するスクリプトを見つけ、実行。

・サービスのステータス確認
service サービス名 status

・サービスの起動
service サービス名 start

・サービスの停止
service サービス名 stop


●chkconfigコマンド
サービスの自動起動を設定。

・サービスの自動起動設定の確認
chkconfig --list [サービス名]

・サービスの自動起動の有効化
chkconfig サービス名 on

・サービスの自動起動の無効化
chkconfig サービス名 off



●「/etc/nologin」ファイル
/etc/nologin」ファイルが存在すると、rootユーザのみログインが許可される。rootユーザ以外の、一般ユーザによるログインを禁止するときに作成。
一般ユーザアカウントは必要だけれど、ログインはさせたくない場合などに使用。

touch /etc/nologin
グラフィック系ソフト 必要メモリまとめ

# ソフトウェア別 必要メモリ
各ソフトウェアによって必要システム構成がありますが、初めて自分のパソコンを買おうとしている学生にとっては項目が多すぎて難しいという声が多い。そこでグラフィック系の学生が使う新品のMacであれば多くの条件をクリアしているので、特に注意すべきメモリの容量をまとめました

#### Adobe
| アプリ | メモリ（最小） | メモリ（推奨） | 参考リンク | 最終更新日 |
|:--|:--|:--|:--|:--|
| Illustrator | 8GB | 16GB | https://helpx.adobe.com/jp/illustrator/system-requirements.html | 2022.08.24 |
| Photoshop | 8GB | 16GB | https://helpx.adobe.com/jp/photoshop/system-requirements.html | 2022.04.09 |
| InDesign | 4GB | 16GB | https://helpx.adobe.com/jp/indesign/system-requirements.html | 2022.05.26 |
| Dreamweaver | 2GB | 4GB | https://helpx.adobe.com/jp/dreamweaver/system-requirements.html | 2022.07.04 |
| AdobeXD | 4GB | - | https://helpx.adobe.com/jp/xd/system-requirements.html | 2022.06.07 |
| Animate | 8GB | 16GB | https://helpx.adobe.com/jp/animate/system-requirements.html | 2021.12.16 |
| Premier | 8GB | 16GB | https://helpx.adobe.com/jp/premiere-pro/system-requirements.html | 2022.08.29 |
| After Effects | 16GB | 32GB | https://helpx.adobe.com/jp/after-effects/system-requirements.html | 2022.09.08 |
| Fresco(Win) | 8GB | - | https://helpx.adobe.com/jp/fresco/system-requirements.html | 2022.08.18 |

#### Other
| アプリ | メモリ（最小） | メモリ（推奨） | 参考リンク | 最終更新日 |
|:--|:--|:--|:--|:--|
| CLIP STUDIO PAINT | 2GB | 8GB | https://www.clipstudio.net/ja/dl/system/ | - |
| MediBang Paint for Pro | - | 8GB | https://medibangpaint.com/pc/about/ | - |
| Maya | 8GB | 16GB | https://knowledge.autodesk.com/ja/support/maya/learn-explore/caas/sfdcarticles/sfdcarticles/JPN/System-requirements-for-Autodesk-Maya-2022.html | 2021.11.29 |
Ubuntu上で、curl使用時やruby/open-uri使用時の"dh key too small"エラー対処法

# 発生した問題
Rubyでopen-uriライブラリを使用してWebスクレイビングをしていたところ、openメソッド実行時に以下のエラーが表示され、サイトにアクセスできなかった。
```
/home/user/.rbenv/versions/3.0.3/lib/ruby/3.0.0/net/protocol.rb:46:in `connect_nonblock': SSL_connect returned=1 errno=0 state=error: dh key too small (OpenSSL::SSL::SSLError)
```

この後、Ubuntu上でcurlコマンド使用時に
```
$ curl (URL)
[1] 3589
curl: (35) error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small
```
というエラーが表示され、curlコマンドでもサイトにアクセスできなかった。
私が取った解決法を2パターンまとめる。

また、この問題はUbuntuの設定の問題なので、Ruby以外の言語で同様のことが起きた際も解決に役立つかもしれない。
Ubuntu上でcurlコマンドを使ったときに上と同様の表示になる場合は、以下の解決法を試してみてほしい。

# 前提条件
筆者の環境はWindows11上のWSL2を用いてUbuntu20.04LTSを起動している。また、Ruby3.03を使用して開発している。
```
$ uname -a
Linux LAPTOP-01OUKT07 5.15.57.1-microsoft-standard-WSL2 #1 SMP Wed Jul 27 02:20:31 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.5 LTS"

$ ruby -v
ruby 3.0.3p157 (2021-11-24 revision 3fb7d2cadc) [x86_64-linux]
```

# 2つの解決法の概説

### 解決法1. OSの設定を変更する
Ubuntuの設定ファイルであるopenssl.cnfを書き換える方法
* 良い点: 設定が一度で終わり、以降は気にしなくてよくなる
* 悪い点: OS全体のセキュリティレベルが下がる

### 解決法2. Rubyのソースコード中に設定を書き込む
ソースコード中で一時的に設定を行う方法
* 良い点: プログラムの中で設定が完結し、他に影響を与えない
* 悪い点: プログラムを書くたびにソースコード中に設定を記載しないといけない

開発環境なら解決法1が楽で良いが、プログラムをお客様に納品する場合などは解決法2が適しているだろう。

# 解決法1
こちらの記事と全く同じ方法なのでこちらを確認してほしい。
https://qiita.com/sidious/items/f9a6eaaf6b1786d6a92c

筆者の場合、openssl.cnfはこの記事の通り"/usr/lib/ssl"配下にあった。
ファイルの編集はviコマンドやnanoコマンドなどでできる。
分からなければ「Ubuntu ファイル編集」などで検索してほしい。

筆者はnanoコマンドが好みなのでそれを使う。
```
$ sudo nano /usr/lib/ssl
```

ファイルの冒頭に
```
openssl_conf = default_conf
```
を追加し、ファイルの末尾に
```
[ default_conf ]

ssl_conf = ssl_sect

[ssl_sect]

system_default = system_default_sect

[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT:@SECLEVEL=1
```
を追加する。
Ubuntu等の再起動は不要で、openssl.cnfを書き換えた直後からcurlコマンドが通るようになる。

# 解決法2
こちらの記事を参考にした。
https://blog.n-z.jp/blog/2020-12-18-dh-key-too-small-workaround-open-uri.html

細かいことは記事を確認してほしいが、要はソースコード中(openメソッド実行前)に
```
require 'net/http'
Net::HTTP.prepend Module.new {
  def use_ssl=(flag)
    super
    self.ciphers = "DEFAULT:!DH"
  end
}
```
を貼り付けることで解決できる。

このコードは、cipher(サイファー)の設定からDHを除外するという内容である。
open-uriからはこの設定変更ができないため、net/httpから変更する。

# どうしてこのエラーが起こるのか
opensslのセキュリティ設定が強化されたからである。
(参考:https://github.com/openssl/openssl/commit/70b0b977f73cd70e17538af3095d18e0cf59132e)

opensslのバージョンが1.1.1になったタイミングでこの変更が適用され、暗号化に用いる鍵長がデフォルトで2048ビットとなった。
記事冒頭に示したエラー文は、SSL/TLSの暗号化で使われている鍵長が短すぎることを示しており、接続が弾かれている。
XCode 14でSigning for ... requires a development team.を解決

FlutterでiOSをbuildするとき、はまったので、メモ

以下のコードをPodfileに追加
```
if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle"
      target.build_configurations.each do |config|
          config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
      end
    end
```
create-react-appプロジェクトの開発中にSpring Bootへプロキシさせる

開発中のcreate-react-appで作成したプロジェクトから、Spring Bootアプリケーションへプロキシさせる設定で躓いたので、ここに記します。
create-react-appのバージョンは5.0.1、Spring Bootは2.7.3です。

# proxyオブションで済むなら問題なし

[Proxying API Requests in Development](https://create-react-app.dev/docs/proxying-api-requests-in-development/)を参考に

```json:package.json
"proxy": "http://localhost:8080"
```
を追加するだけで

```plantuml
[ブラウザ] as browser

interface "http\n(ポート3000)" as http3000
[create-react-app\nプロジェクト] as react

interface "http\n(ポート8080)" as http8080
[Spring Bootアプリ] as spring 

browser -r-> http3000
http3000 - react

react -r-> http8080
http8080 - spring
```
のような連係が可能になります。簡単ですねぇ

ただ注意が必要なのが、<b>プロキシされるのはブラウザからのリクエストのAcceptヘッダにtext/htmlが無い場合だけ</b>です。


# プロキシの手動設定で問題発生
例えば自分の場合は、ファイルダウンロード処理が必要となり、proxyオブションを諦める必要がありました。
そこでドキュメントを参考に

```javascript:src/setupProxy.js
const { createProxyMiddleware } = require('http-proxy-middleware');

module.exports = function(app) {
  app.use(
    '/api',
    createProxyMiddleware({
      target: 'http://localhost:8080',
      changeOrigin: true,
    })
  );
  app.use(
    '/resource',
    createProxyMiddleware({
      target: 'http://localhost:8080',
      changeOrigin: true,
    })
  );
};
```
としたところ、Spring Bootへ通信が全て 403 Forbidden になってしまいました。レスポンスのボディ部には「Invalid CORS request」の文字があります。

# 原因
proxyオブションの場合と、手動設定の場合でSpring Boot側の動きの違いを確認すると、CorsFilterから呼び出された

```java:org.springframework.web.cors.DefaultCorsProcessor.java
public class DefaultCorsProcessor implements CorsProcessor {
	public boolean processRequest(@Nullable CorsConfiguration config, HttpServletRequest request,
			HttpServletResponse response) throws IOException {

        〜 省略 〜
		if (!CorsUtils.isCorsRequest(request)) {
			return true;
		}
```
CorsUtils.isCorsRequestメソッドで、前者はfalseでCross Originではないと判定され、後者はCross Originと判定されてました。
CorsUtils.isCorsRequestメソッドの内部ではhostヘッダとoriginヘッダのスキーマ、ホスト名、ポート番号の何れかが異なるとCross Originと判定されます。

各設定でSpring Bootが受信している値が以下になります。

||hostヘッダ|originヘッダ|
|---|---|---|
|proxyオブション|localhost:8080|http\://localhost:8080|
|手動設定(changeOrigin: true)|localhost:8080|http\://localhost:3000|
|手動設定(changeOrigin: false)|localhost:3000|http\://localhost:3000|

* hostヘッダにないスキーマは、HttpServletRequest.getScheme()より取得。この値は、Tomcatの場合、受信したコネクタで決まる。

つまり、
* [changeOriginという名前のイメージと異なり、hostヘッダが変わって、originヘッダは変わりません。](https://github.com/http-party/node-http-proxy/blob/9b96cd725127a024dabebec6c7ea8c807272223d/lib/http-proxy/common.js#L100-)
* changeOrigin: false (デフォルト)なら、実態と異なるhostヘッダの値である気持ち悪さはありますが、CORSでエラーにはなりません。

ということで、CORS問題を回避しているつもりでtrueにしたら、逆にCORS問題に躓いたみたいです、、、orz


# 対処
本来はCORSの設定を怠らないべきなんでしょうが、開発中というこで、changeOrigin: trueにしたまま、Spring Boot側のCORSチェックを無効化する道を選びました。

[GraphQL Java KickstartのGraphQL Spring Boot](https://github.com/graphql-java-kickstart/graphql-spring-boot)を使用しているなら以下の設定です。

```yaml:application.yml
graphql:
  servlet:
    cors-enabled: false
```
SPSS Statistics 29の新機能

IBM SPSS Statistics v29が2022/9/13にリリースされました。
最新バージョン29の新機能をご紹介します。

https://www.ibm.com/docs/ja/spss-statistics/29.0.0?topic=overview-whats-new-in-version-29

# Version 29の新機能
　1.線形OLS(Ordinary Least Squares：最小二乗法)代替
　　・Lasso回帰
　　・Ridge回帰
　　・Elastic Net回帰
　2.Acceralated Failer Time(AFT)モデル
　3.疑似R2乗指標
　4.バイオリンプロット
　5.PythonとRのアップグレード
　6.選択されていないケースを非表示にする機能の削除
　7.ワークブックモードの強化
　8.検索の機能強化

# １．線形OLS代替
過学習を抑えた汎化性のある線形回帰モデルを追加
・Lasso回帰とElastic Net回帰は、Base機能　<del>SPSS Regressionオプションの機能

・Ridge回帰は、Base機能　<del>SPSS Advanced Statisticsオプションの機能

・拡張ハブからモジュールをインストール
・[分析]メニュー＞[回帰]＞[線形OLS代替]
## Lasso回帰
　・L1ノルムの正則化の線形回帰モデルを推定
　・トレースプロットの表示
　・交差検証に基づいてアルファ・ハイパーパラメーター値を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/5f20a245-55f8-130a-813c-fa70fd7c3bb2.png)
## Ridge回帰
　・L2ノルムの正則化の線形回帰モデルを推定
　・トレースプロットの表示
　・交差検証に基づいてアルファ・ハイパーパラメーター値を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/1ae1b5c6-b778-dd13-2c3d-f4cf06ed8562.png)

## Elastic Net回帰
　・L1ノルム(Lasso)とL2ノルム(Ridge)を組み合わせ線形回帰モデルを推定
　・トレースプロットの表示
　・交差検証に基づいて L1 比率とアルファ・ハイパーパラメーター値を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/02fd1a2b-0c93-8295-ae62-ffa93bda355a.png)

# 2.Acceralated Failer Time(AFT)モデル
これまでのノンパラメトリック：Kaplan-Meier法、セミパラメトリック：Cox回帰に加えて、パラメトリックな生存分析モデルを追加
・SPSS Advanced Statisticsオプションの機能
・[分析]メニュー＞[生存分析]＞[Parametric Acceralated Failer Time(AFT)モデル]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/c0dc441e-9209-9b2c-3813-219da17ddb5b.png)

# 3.疑似R2乗指標
混合モデルの出力に、決定係数疑似R2乗と級内相関係数ICCのモデル評価指標を追加
*線型混合モデルではv28.0.1から疑似R2乗指標を出力しています
・SPSS Advanced Statisticsオプションの機能
・[分析]メニュー＞[混合モデル]＞[線型]で[変量因子]を指定
・[分析]メニュー＞[混合モデル]＞[一般化線型]で[変量効果]を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/5a1ddfd4-6c8c-eeb9-0d51-27366f497131.png)

# 4.バイオリンプロット
変数のカテゴリごとに要約統計量と密度を表すグラフを追加
・SPSS Baseの機能
・[グラフ]メニュー＞[グラフボードテンプレート選択]で[スケール変数]と[カテゴリ変数]を１つずつ選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/c2a21034-9b14-8d36-8998-47d699996b28.png)

# 5.Python と R のアップグレード
Python 3.10.4 および 、R 4.2.0がIBM® SPSS® Statistics 29と一緒ににインストールされます。

# 6.選択されていないケースを非表示にする機能の削除
[データ]メニュー＞[ケースの選択]で、[選択されなかったケースを除外]を選び実行すると、選択されなかったケースはデータエディタウィンドウから非表示となっていましたが、ケースは表示したままで、処理の対象から除外するSPSS Statistics 27.0.1 以前のバージョンの動作に戻りました。以下の図の罫線があるケースは、選択されなかったケースで処理から除外されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/0e905559-b59b-7dad-2eda-a6d43e48c846.png)

# 7.ワークブックモードの強化
ワークブックツールバーに、[すべてのシンタックスの表示/非表示]と[すべての出力の消去]の2つの項目が追加されました。また、ステータスバーに[クラシック]（出力とシンタックス）モードと[ワークブック]モードを切り替えるボタンが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/3860e58f-e383-c7d6-c2aa-a52321a75c6a.png)

# 8.検索の機能強化
ツールバーのフィールドに直接用語を入力するオプションと、ドロップダウン・ペインで結果を表示するオプションが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/95700280-7f90-3e4f-8951-1d6047df8e2f.png)

# まとめ
ぜひ、お試しください。

https://community.ibm.com/community/user/datascience/communities/community-home?CommunityKey=886b6874-0fb1-402c-8243-c70ef8179a99
日時型の変数をDATEVALUEで変換した時のローカル時間の扱い


日時型をTEXT関数で変換すると　GTM表示されます。
しかしDATEVALUE関数はGTMでなくローカルタイムゾーンで評価されるようです。

上は日時型をDATEVALUEで変換したもの
下は日時型をTEXTで変換したもの

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/47de2348-16c5-983d-7f64-062f198f9589.png)

```
IF( IsAcquiredDuringDaylightSavings__c, 

AND( 
WEEKDAY(DATEVALUE(AcquisitionDatetime__c )) != 1, 
WEEKDAY(DATEVALUE(AcquisitionDatetime__c )) != 7, 
TIMEVALUE(AcquisitionDatetime__c + (11 / 24)) >= TIMEVALUE("08:30:00.000"), 
TIMEVALUE(AcquisitionDatetime__c + (11 / 24)) <= TIMEVALUE("17:30:00.000") 
), 

AND( 
WEEKDAY(DATEVALUE(AcquisitionDatetime__c )) <> 1, 
WEEKDAY(DATEVALUE(AcquisitionDatetime__c )) <> 7, 
TIMEVALUE(AcquisitionDatetime__c + (10 / 24)) >= TIMEVALUE("08:30:00.000"), 
TIMEVALUE(AcquisitionDatetime__c + (10 / 24)) <= TIMEVALUE("17:30:00.000") 
) 

) 
```

[Acquired during business hours formula](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JdbzqSAB)

# DATETIMEVALUEを使った時の時間（ローカル？ GMT?）

普通に日付フィールドにした場合はちゃんと日本時間

```
TEXT(datetime_1__c) + ":" + TEXT(datetime_2__c) + ":" + TEXT(datetime_1__c - datetime_1__c)
```

2022-07-09 03:15:00Z:**2022-07-08 03:00:00Z**:1.01041666666666666666666666666666666667

DATETIMEVALUEを使ったらGMTになっていますねぇ。

```
TEXT(datetime_1__c) + ":" + TEXT(DATETIMEVALUE("2022-07-08 12:00:30")) + ":" + TEXT(datetime_1__c - DATETIMEVALUE("2022-07-08 12:00:30") )
```

2022-07-09 03:15:00Z:**2022-07-08 12:00:30Z**:.635069444444444444444444444444444444444


もしかして、+09:00が必要かな。

```
TEXT(datetime_1__c) + ":" + TEXT(DATETIMEVALUE("2022-07-08T12:00:30+09:00")) + ":" + TEXT(datetime_1__c - DATETIMEVALUE("2022-07-08T12:00:30+09:00") )
```
これでは何も表示されません。

```
TEXT(datetime_1__c) + ":" + TEXT(DATETIMEVALUE("2022-07-08 12:00:30+09:00")) + ":" + TEXT(datetime_1__c - DATETIMEVALUE("2022-07-08 12:00:30+09:00") )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/595391de-31b0-48ab-f052-2584add30111.png)

Looks like there's a problem.

Unfortunately, there was a problem. Please try again. If the problem continues, get in touch with your administrator with the error ID shown here and any other related details.

ui.services.connection.api.PartnerConnectionException: UNKNOWN_EXCEPTION: An unexpected error occurred. Please include this ErrorId if you contact support: 772115904-244412 (1814626073)


[数式 (テキスト)で2つの日付/時間型項目の差異を秒数まで表示したい場合](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000IQNILSA5)
ServiceNow sys_class_nameの仕様について

# sys_class_nameの仕様について
##### sys_class_nameの仕様
テーブルを作成した際や既存のテーブルのカラムを参照した際、"sys_class_name"というカラムが作成されているのをご覧になったことがあるかと思います。
このカラムが何の情報を持っているか、どんな時に使うのか、などについてまとめました。弊社ブログへも[同様の記事を投稿](https://alpcom.co.jp/blog/20220916-2/?utm_source=Qiita&utm_medium=post&utm_campaign=ysi&utm_id=20220916-2)しております。

sys_class_nameは、対象レコードが実際に存在するテーブルの物理名を持っているカラムです。
このカラムは、
(1)Table作成時、ないし設定画面のControlsタブで”Extensible”にチェックを入れたとき
(2)Table作成時にほかのテーブルを継承して作成したとき
に自動的に生成されます。

このカラムを参照するメリットは、子テーブル、親テーブルを区別してテーブル名を返してくれることです。

具体的にスクリプトとその実行結果から見ていきます。
以下に示すのは、バックグラウンドで実行したサーバ側のスクリプトです。

```javascript
// sys_class_nameの使用例１
var gr = new GlideRecord("incident");
gr.get("2173267587c5811020e31f4bbbbb3565");//Incidentレコードのsys_id
gs.info(gr.sys_class_name); //=>実行結果："incident"

// sys_class_nameの使用例２
var gr = new GlideRecord("task");
gr.get("2173267587c5811020e31f4bbbbb3565");//Incidentレコードのsys_id
gs.info(gr.sys_class_name); //=> 実行結果："incident"

```

使用例１ではIncidentテーブルのGlideRecordオブジェクトを新規作成し、テスト用に作成したIncidentレコードのオブジェクトを取得します。このオブジェクトのsys_class_nameには、当該レコードが格納されているIncident[incident]テーブルを示す値が入っています。

対して使用例２で作成しているのTaskテーブルのGlideRecordオブジェクトです。Incident[incident]テーブルはTask[task]テーブルを拡張して作られています。そのため、Incidentレコードは親テーブルであるTaskにも存在しています。しかしながら、TaskのGlideRecordオブジェクトを作成してsys_class_nameの中身を見ると、子テーブルであるIncident[incident]を示す値が入っています。

このように、sys_class_nameの値を利用すれば、親子関係を持つテーブルに格納されたレコードの正確な所在を取得することが出来ます。

##### getTableName()との違い
他方、比較として、sys_class_nameの代わりにgetTableName()というAPIを使ったスクリプトを実行してみます。

```javascript
// getTableName()の使用例１
var gr = new GlideRecord("incident");
gr.get("2173267587c5811020e31f4bbbbb3565");//Incidentレコードのsys_id
gs.info(gr.getTableName()); //=>実行結果："incident"

// getTableName()の使用例２
var gr = new GlideRecord("task");
gr.get("2173267587c5811020e31f4bbbbb3565");//Incidentレコードのsys_id
gs.info(gr.getTableName()); //=>実行結果："task"

```

こちらの実行結果はそれぞれ"incident"と"task"となりました。これは、getTableName()というAPIが、参照するGlideRecordオブジェクトに紐づくテーブル名を取得するGlideRecord APIだからです。


とはいえ、sys_class_nameを使ったときと同様の処理は、currentオブジェクトが使えるBusiness RuleやEmail Scriptといったサーバ側スクリプトでなら、getTableName()を使っても実装することが可能です。

たとえば、current.getTableName()などとすれば、現在参照しているレコードのテーブル名が得られます。そのテーブルが他のテーブルを継承していたとしても、親テーブルの名前が取得されることはありません。なので、current.sys_class_nameとcurrent.getTableName()とでは、どちらを使ったとしても同じアウトプットが得られます。

また、クライアント側のスクリプトでも、getTableName()というGlideForm APIがありますが、これも現在のレコードが属しているテーブル名を返してくれます。

したがって、sys_class_nameのメリットが発揮されるのは、サーバ側スクリプトでもcurrentオブジェクトが使えないScheduled Jobや、クライアント側のスクリプトでGlideRecordオブジェクトを使ってDB操作を行うときなどであろうと考えられます。

##### 参考リンク（いずれもコミュニティ記事です）
[What is the difference between current.getTableName() and current.sys_class_name in terms of operation](https://community.servicenow.com/community?id=community_question&sys_id=6a3e87eddb9cdbc01dcaf3231f9619b0)
[Access current object in script include](https://community.servicenow.com/community?id=community_question&sys_id=2b678b69db1cdbc01dcaf3231f96198e)
パソコン１つで箱庭IoT

# きっかけ
仕事で、AI/IoT関係の開発者の方々から定期的にお話を聞く機会がありまして。

# やったこと
たぶん、「こういう環境あるとうれしいんじゃない？」って勝手に思って、こんな環境を作りました。

https://github.com/toppers/hakoniwa-iot

# コンセプト
パソコン１つで、IoTのデバイス側の通信周りの開発がやれちゃう。サーバーいらない。

# デバイス側の環境構成

* 通信プロトコル：MQTT
* 暗号化：TLS v1.2
* プログラミング言語：python

# できること
パソコン１個あれば、以下がやれます。

* デバイス側から、ダミーサーバーに対して、MQTTでデータ送信できます
* TLS通信も手軽にできます
* サーバーとの通信途絶などの異常系のテスト
* デバイス側の通信データ量の計測(tcpdumpで手軽に見れます)

# 裏野望
TOPPERS/箱庭というWG活動では、箱庭チュートリアルとして、AI開発者向けの箱庭環境を作ろうとしております。

いまは、デバイス側しかないですけども、クラウド側も整備していく予定です。
最終的には、MLOps もやれるようになります。

乞うご期待くださいまし～。
GitBash (Git for Windows) にて、SJIS の文字列を探して、 結果を UTF-8 でファイル出力する

## やりたいこと

* GitBash (Git for Windows) にて、SJIS で特定の文字列を探して、結果を UTF-8 でファイル出力する


## やったこと

```bash
grep -naorF `echo 'しふとじす' | iconv -t SJIS` | iconv -f SJIS > ../sjis_char_output.txt
```

## 動作環境

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239314/7922433a-68ee-93b1-c8a1-51aee933e18a.png)
githubのrole

# Repository の role

| category | action | Read | Triage | Write | Maintain | Admin |
|:--|:--|:--|:--|:--|:--|:--|
| repository | read | 〇 | 〇 | 〇 | 〇 | 〇 |
| repository | clone | 〇 | 〇 | 〇 | 〇 | 〇 |
| repository | push | - | - | 〇 | 〇 | 〇 |
| repository | pull request | 〇 | 〇 | 〇 | 〇 | 〇 |
| repository | settings | - | - | - | 〇 | 〇 |
| repository | add collaborators | - | - | - | - | 〇 |
| issue | open | 〇 | 〇 | 〇 | 〇 | 〇 |
| issue | comment | 〇 | 〇 | 〇 | 〇 | 〇 |
| issue | manage | - | 〇 | 〇 | 〇 | 〇 |
rocky linuxでmysql-connector-c++をレポジトリ経由で導入する

mysql(mariadb)をc++で操作するためのライブラリは`mysql-connector-c++`。

#### レポジトリをインストール
以下から該当するバージョンのレポジトリをインストール
https://dev.mysql.com/downloads/repo/yum/

```bash
$ sudo yum install https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm
$ sudo dnf install mysql-connector-c++-devel
```
`mysql-connector-c++`ライブラリのヘッダーファイルの場所は`/usr/include/mysql-cppconn-8/jdbc/`
ライブラリのパスは`/lib64/libmysqlcppconn.so.9`
なのでMakefileなどでは上記ファイルとパスを指定してmakeする。
【Git】「error: cannot lock ref ～」エラーが出る

個人的な備忘録です。

# 事象
- リモートブランチを削除した後に、gitコマンドを叩くと「error: cannot lock ref ～」エラーが出る
- fetch も pull も push もできない

# 調査
https://stackoverflow.com/questions/6656619/git-and-nasty-error-cannot-lock-existing-info-refs-fatal

https://www.out48.com/archives/3603/

https://genzouw.com/entry/2021/07/21/093334/2734/

# 原因
- ローカルに到達不能な追跡ブランチがのこっていたことが原因とのこと

# 解決方法
- prune（〈余分な枝を〉おろす，切り取る）で、到達不能なコミットを掃除するために、以下のコマンドを叩く

```bach
git remote prune origin
```
計測・制御に関する理論

# ホール素子

ホールICとは
半導体を利用した磁気センサは様々なものがありますが、その中で代表的なのがホール素子です。ホール素子はホール効果(Hall Effect)と言われる```電流磁気効果を応用したセンサ```です。ホール素子は自身から得られる電圧は大変に小さく、一般的にオペアンプなどの増幅回路が必要です。ホールICはホール素子とオペアンプを一体化させたもので、外付け部品点数を削減し、回路設計を容易にします。

ホールICは、単体での磁極判別が可能です。民生から車載用まで幅広い分野で採用されています。```主な検知用途は回転検出、位置検出、開閉検出、電流検知、方位検出など多岐にわたります。```民生向けでは、洗濯機や冷蔵庫などの白物家電から携帯電話まで幅広く利用されています。```車載向けでは、扉や窓の開閉検出はもちろん、車高や速度の検知、モータの回転数検出```など数多くのホールICが使用されています。
出典 https://www.ablic.com/jp/semicon/products/sensor/magnetism-sensor-ic/intro/

# サーミスタ
温度が変わると電気の流れにくさ（抵抗）が変化する電子部品です。
温度が高くなると電気が流れやすくなり、温度が低くなると電気が流れにくくなります。
出典 https://www.shibaura-e.co.jp/products/what_thermistor/#content-01

## 利用例
* エアコンは、室内機と室外機の間を行き来する冷媒を凝縮/気化させることにより熱交換を実施し、室内を適温に保ちます。この```室内機と室外機の温度センサーとして、サーミスタが使われている```のです。サーミスタにより温度を計測することで温度を管理し、適切な温度の維持を可能としています。

* 自動車には多くのサーミスタが使われています。```エンジン内温度、吸排気温度、油温、冷却水温等の確認用としてサーミスタは設置されており、エンジン内の燃焼が適切に行われているか管理```できるようになっているのです。

* 家庭でよく見かけるコーヒーメーカーにもサーミスタは使われています。湯を入れる際、湯が熱すぎる、または冷たすぎるとおいしいコーヒーを入れることができません。```サーミスタにより水の温度を計測することで、常に適切な温度```となるよう管理し、おいしいコーヒーを入れることができるようになっています。

* スマートフォンでは多くの演算処理が行われることから、温度が上昇しやすい機器となっています。一部の機器では発火が起き、問題となることもあるほどです。そこでスマートフォンの```必要以上の過熱を防止するため、内部温度を適切に管理する必要```があります。そこでサーミスタが使われているのです。

# ひずみゲージ
実装部品の損傷や剥離につながる可能性もあるため、事前にひずみゲージを使ってプリント基板の強度・ひずみを検査することが大切です。
出典 https://www.keyence.co.jp/ss/products/recorder/lab/strain/applications.jsp

### 歪み
物体に外力を加えたときに現れる形状または体積の変化。ねじれ・ゆがみ・ちぢみなど。
出典 https://kotobank.jp/word/%E6%AD%AA%E3%81%BF-430999#:~:text=%E3%81%B2%E3%81%9A%E3%81%BF%E3%80%94%E3%81%B2%E3%81%A5%E3%81%BF%E3%80%95%E3%80%90%C3%97,%E3%81%AD%E3%81%98%E3%82%8C%E3%83%BB%E3%82%86%E3%81%8C%E3%81%BF%E3%83%BB%E3%81%A1%E3%81%A2%E3%81%BF%E3%81%AA%E3%81%A9%E3%80%82&text=%EF%BC%93%20%E3%83%86%E3%83%AC%E3%83%93%E3%83%BB%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%E3%81%AA%E3%81%A9%E3%81%A7,%E6%B3%A2%E3%81%A8%E7%AD%89%E3%81%97%E3%81%8F%E3%81%AA%E3%81%84%E7%8A%B6%E6%85%8B%E3%80%82

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
Chromeにて証明書信頼登録の表示が変わったのでその対処法 ※証明書エラー(NET::ERR_CERT_AUTHORITY_INVALID)

# 今回の問題点
ローカルで開発している際に、HTTPS接続をしていて下記の画像のように「**この接続ではプライバシーが保護されません**」が出るので毎月1ヶ月ごとに証明書を信頼するようにして対処していたが、**どうやら最近のChromeのアップデートで画像が表示されないように**なってしまった。

- これまで行ってきた解決策
    - https://qiita.com/hanakok/items/d3db29d017d627293bf1


- 問題の証明書エラー画面
![スクリーンショット 2022-09-16 14.43.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1040483/a70a06a7-d53f-07ce-edef-a31229b8669f.png)

- Chromeアップデート後の証明書表示画面(今までのように証明書画像が取得できなくなった)
![スクリーンショット 2022-09-16 14.52.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1040483/9ab3adb1-664e-06dc-e249-6e3486a78db8.png)

# 解決策
Safariなどの別ブラウザで、開いて対応

- リンクをクリック
![スクリーンショット 2022-09-16 15.10.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1040483/c3e93ded-864c-567f-c5d7-5c292788a950.png)

- 証明書画像が表示されるので、下記を参考に証明書を信頼させる。
    - https://qiita.com/hanakok/items/d3db29d017d627293bf1
![スクリーンショット 2022-09-16 15.10.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1040483/78c5550b-42a2-7f16-668f-08614d8015a7.png)

# 参考
https://qiita.com/hanakok/items/d3db29d017d627293bf1
VPSに検索系Djangoアプリをデプロイしたらタイムアウトしたので修正した際のメモ

Conoha VPSにDjangoアプリをデプロイしました。
デプロイするにあたって参考にした記事はこちらです。

https://blog.codecamp.jp/django-release-basic

こちらの記事に沿って順に設定を行ったところデプロイはできたものの、
502 Bad Gateway
が発生しました。

エラーログを確認します。

```
vi /var/log/nginx/error.log
```

エラーログを確認すると、

```
2022/09/05 16:09:21 [error] 906#906: *575 upstream prematurely closed connection while reading response header from upstream,...
```

のエラーが出ていたのと、検索件数を少なくした場合に発生しなかったため、タイムアウトしているらしいということがわかりました。
タイムアウトの設定を追加する方法を確認します。

## nginx
### nginxの設定
```
/etc/nginx/nginx.conf
```

nginx起動時に読み込まれる主の設定ファイル。
このファイルの設定を変更してnginxを制御。


### 設定内容
httpディレクティブ配下に、serverディレクティブを配置し、

```
http {
    server {
            listen 80;
            server_name サーバーIP;
    
             location / {
                proxy_set_header Connection "";
                proxy_http_version 1.1;
              }
            }
        }
        keepalive_timeout 100;
    }
   (以下略)
}
```
keepalive_timeoutの設定がデフォルトでは0秒になっていたので、
こちらを100秒にしました。

次に、nginxを再起動し、起動状態を確認します。
```
systemctl restart nginx
systemctl status nginx
```

ちなみに、nginxを再起動時に、nginx.confの設定が間違っていると
エラーが起きて起動できないことがあります。

```
Job for nginx.service failed because the control process exited with error code.
```
これが出たら、

```
nginx -t　
```
を実行するとどこでエラーになっているのかわかります。



VPSに作成したサーバ自体を再起動するには、
```
reboot
```
を実施します。

次に、gunicornの起動を行います。

```
systemctl start gunicorn
systemctl status gunicorn.service
```

これでタイムアウトが発生しなくなりました。


あと、nginxを起動時にエラーが出るので

```
nginx: [warn] conflicting server name "xxx.xxx.xxx.xxx" on 0.0.0.0:80, ignored
```

ポート80が使われているようです。ポート80を使用しているサービスは何か、調べます。

```
sudo lsof -i:80
```
Apache２が起動していました。
Apache2が使うポートを変更します。

```
sudo vi /etc/apache2/ports.conf
```

```
Listen 8080
```

ポートを80から8080などに変更し、Apacheを再起動します。
```
sudo service apache2 restart
```
【 Azure AD B2C 】サインインのリダイレクト時にエラーが発生する際の解決策

Azure AD B2C サインイン時にリダイレクトのエラーが発生する際の解決策をまとめておきます。

# 実現したかったこと
Azure App Service にデプロイ済みのシングルページアプリケーション (SPA) で、Azure AD B2C を用いたサインインを行う。(ローカル環境でのテスト時には正常動作を確認済み)

**エラー内容**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/0033dcbc-2348-9b45-e8d0-174be38e9123.png" width="400">

> The redirect URI 'https://xxxxx.azurewebsites.net/' specified in the request does not match the redirect URIs configured for the application '9cd1ccf6-xxxx-xxxx-xxxx-xxxxxxxxxx'. Make sure the redirect URI sent in the request matches one added to your application in the Azure portal. Navigate to https://aka.ms/redirectUriMismatchError to learn more about how to fix this.

(意訳) リクエストに含まれているリダイレクトURIは、アプリケーション構成のリダイレクトURIs と一致しません。リクエストで送信されたリダイレクトURIが Azure Portal のアプリケーションに追加されているか、確認してください。この問題の解決方法の詳細は [エラー AADSTS50011: 要求で指定されたリダイレクト URI が一致しません](https://docs.microsoft.com/ja-jp/troubleshoot/azure/active-directory/error-code-aadsts50011-redirect-uri-mismatch) をご覧ください。

# 解決方法
**Azure Portal 上で Azure AD B2C リソースへアクセスして、対象のアプリケーションの認証ページより、リダイレクトURI を追加する。**

まず、このエラーの最初に表記されているリダイレクトURIは、アプリケーション (ソースコード) 側で設定しているものになります。そして、このリダイレクトURIと一致していないとされているのが Azure AD B2C に登録されているアプリケーションのリダイレクトURIs です。Azure AD B2C 認証サーバーは、サインイン後リダイレクトURIに対して、認証コードやトークンを送信するため、Azure AD B2C アプリケーションに登録されているリダイレクト先にのみ、リダイレクトが許可される仕組みになっています。

Web アプリケーション側は ``@azure/msal-browser`` SDK を使用して、以下のように設定しています。

```authConfig.ts
import { Configuration, PopupRequest } from "@azure/msal-browser";

export const msalConfig: Configuration = {
  auth: {
    clientId: "<Azure AD B2C アプリケーション(クライアント) ID>",
    authority: "https://login.microsoftonline.com/<ディレクトリ(テナント)ID>",
    redirectUri: "<リダイレクトURI>",
    postLogoutRedirectUri: "<ログアウト時のリダイレクトURI>"
  },
  cache: {
    cacheLocation: "sessionStorage",
    storeAuthStateInCookie: false
  }
};
```

今回の問題は、上記ソースコードで指定した ``redirectUri`` が Azure AD B2C アプリケーションのリダイレクト先URIとして登録されていないことが原因なので、早速登録をしていきたいと思います。

Azure Portal を開き、今回使用する Azure AD B2C リソースへアクセスします。ナビゲーションメニューから **管理 > アプリの登録** ページを開き、対象のアプリケーションを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/51ffb7c5-c91c-65b4-b3a5-53cd9e867bd5.png)

アプリケーションページに遷移後、ナビゲーションメニューから **管理 > 認証** を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/69ee6562-922a-0507-9889-aa13f9ca47b0.png)

**シングルページアプリケーション > リダイレクトURI > URI** の追加 ボタンを押して、Azure AD B2C アプリケーションに リダイレクト URI を追加します。(シングルページアプリケーション以外のプラットフォームの方は、プラットフォームを追加後に、同様の手順を行ってください。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/e2dfc338-78df-f004-eeb0-bf15e56f1882.png)

追加後、再度アプリケーションにサインインを行うと、無事にサインインすることができました。


# 参考文献
- [エラー AADSTS50011: 要求で指定されたリダイレクト URI が一致しません](https://docs.microsoft.com/ja-jp/troubleshoot/azure/active-directory/error-code-aadsts50011-redirect-uri-mismatch)
- [リダイレクト URI (応答 URL) に関する制約と制限](https://docs.microsoft.com/ja-jp/azure/active-directory/develop/reply-url)
SPSS ModelerからSnowflakeに接続する（Nativeドライバー）

SPSS Modeler18.4からSnowflakeにSnowflakeのNativeドライバー接続します。

* テスト環境
    * Windows 11 64bit
    * Modeler 18.4
    * Snowflake ODBC ドライバー 2.25.2

# サポートされるODBCドライバーの確認

以下で確認します。Snowflake native driver 2.25.2とSDAP8.1.1のドライバーがサポートされています。ここではSnowflake native driverで接続してみます。

https://www.ibm.com/software/reports/compatibility/clarity-reports/report/html/softwareReqsForProduct?deliverableId=0E1C00D07E5C11EC93C02AA4DE91E682&osPlatforms=Linux|Mac%20OS|Windows&duComponentIds=D001|S002&mandatoryCapIds=13&optionalCapIds=7|47|22|72|186|223

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/6e7cc714-4ffb-d1ed-ac2a-0cd4d6bba699.png)

なお、SDAPドライバーで接続する方法は以下の記事で書いています。

SPSS ModelerからSnowflakeに接続する （SDAPドライバー） - Qiita 

https://qiita.com/kawada2017/items/2ce5e954e1b9869cd142

特にどちらのドライバーが方が優れているかという情報はありません。


# ODBC接続
ODBCのドライバー導入と接続設定は以下の手順で行います。

ODBCでSnowflakeに接続する - Qiita 

https://qiita.com/kawada2017/items/e1f1aa4afa040e12c02a

# Modelerからの接続
データベースインポートノードで「新規データベース接続の追加」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/eae6fe66-0b01-de6a-3e98-4275d77f273a.png)


データソースで設定したデータソースを選び、ユーザーとパスワードを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5305ac16-1629-2440-020e-76a8a0270edf.png)



接続ができたら、OKで閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/52e0ca3a-91fe-354b-d672-c69b4a536a39.png)



テーブル名を指定し、「プレビュー」します。ここでは「TPCH_SF1.REGION」を選んでいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a30e7336-0c98-fd5e-9fbb-e7b18feae0a0.png)


参照できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ac02e049-82bf-3e4c-8d42-e8b68dad5d48.png)

なお、日本語データも読めました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e158baea-c86d-3426-c1bb-8af6ee097abd.png)
ODBCでSnowflakeに接続する

WindowsのODBCでSnowflakeに接続します。

* テスト環境
    * Windows 11 64bit
    * Snowflake ODBC ドライバー 2.25.2


# ODBCドライバーのダウンロード
以下からODBCドライバーをダウンロードします。ここでは少し古い2.25.2のバージョンのドライバーを使います。

Windows用 ODBC ドライバーのインストールおよび構成 — Snowflake Documentation 

https://docs.snowflake.com/ja/user-guide/odbc-windows.html


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d54bff09-1661-8881-af4a-ad4e63688300.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0ec40fc3-6acf-4840-6ac6-0e59a80e40ec.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a32ebf71-9d84-077f-8551-d4c282699cd9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/23c30978-8c37-2a51-8f0c-a683d0103f74.png)


# ODBCドライバーの導入
snowflake64_odbc-2.25.2.msiを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c031ceba-1728-8b65-4eda-36cc81e2cc4e.png)



「Next」で進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/dfa93b6f-3941-d7b6-2390-02f6a2d1b044.png)



「Next」で進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f63e80e3-86e5-2c24-6fd2-3976ee3b9690.png)



「Install」で進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d120708e-070d-1783-7536-4fb638ba11d7.png)



「Finish」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/cc0bc2a2-3f95-5ba2-b9b1-24169efd17ac.png)


# ODBCの設定
ODBCデータソースアドミニストレーター(64bit)を起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9fd133d2-fecd-52f7-e490-ebba03cd56d8.png)

ユーザーDSNかシステムDSNで「追加」をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/393d34e7-6856-3958-7fbb-ef402bbea93d.png)


「SnowflakeDSIIDriver」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/cb5f6823-2f68-dfc6-64fd-f677a6580234.png)

WebブラウザでSnowflakeのコンソールに入り、「管理者」＿「アカウント」を開き、をクリックします。アカウントのURLを取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/81ba4e71-765a-ef7b-cbd6-a15cf9bb2dce.png)

接続したいデータベースも確認しておきます。ここではSNOWFLAKE_SAMPLE_DATAにつなぎます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4ed3b247-b3be-2e11-eed4-6188c81df5d9.png)

利用するウェアハウスも確認しておきます。ここではSFTESTを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/02141ad6-eade-b023-75ab-22b337a18956.png)


ODBCデータソースアドミニストレーターに戻ります。
「Data Source」には任意の名前を選びます。
「Server」には上で得たURLから「https://」を除いたホスト名のみを貼り付けます。
「Database」と「Warehouse」はコンソールで確認したものを入力します。この例ではSNOWFLAKE_SAMPLE_DATAとSFTESTです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0a53b26e-b929-2b71-7e0b-e6344f874b46.png)

「Test」ボタンで接続確認をします。テストが成功したらOKで保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e7b09b00-9bba-57e1-0cee-28053a0e518f.png)
情報に関する理論

# AI（人工知能)とは？
```人間の頭脳の振る舞いを模倣した```システム。
```知識ベース```と```推論エンジン```に加えて、```学習や判断や認識機能を持つ```。
学習や判断は、```機械学習```や```ディープラーニング```の技術を利用する。
## 機械学習
```与えられたデータを基に反復学習```を行って特徴や法則を見つけ出す。
その後```未知のデータについて推論```を行う。
```学習が進むほど認識や判断の精度が向上```する。
ただし```学習の方向性は人間が与える必要```がある。

### 教師あり学習
```特徴付きのデータを与え```たり、入力に対する```正解をデータとして与え```たりすることで、```未知のデータに対する推論や判断```に結びつける。

### 教師なし学習
```正解を与えない```方法。データを蓄積することで```出現頻度を分析したり、規則性によりグルーピング```したりすることで解答を導き出す。

### 強化学習
```行動及びその良し悪しを得点として与え```、最適な解を試行させる。

## ディープラーニング（深層学習)
```機械学習を進化```させた手法。
```ニューラルネットワークにより学習```を行う。
人間が方向性を与えなくても、コンピュータが```多方面のデータを基に自律的に学習を進めていく```。
ただし```過程や結果が意図しない方向性へ進む```こともある。

# 正規表現
コンピュータがなどで情報として扱うために、```曖昧さを排除した言語を形式言語```という。
形式言語の構文を形式的（厳密な表現としう意味)に定義するための言語に正規言語があり、その表現の方法が```正規表現```である。
記憶機能を持たせた表現の代表例に構文規則を記述に用いる```BNF(Backus-Naur Form: バッカス・ナウア記法)```がある。

## BNFのルール
プログラム言語の構文を形式的(厳密な表現という意味)に定義する表現方法。

＜平日＞　：：＝月｜火|水|木|金|土 ＜休日＞　：：＝　日

```::```は右辺で左辺を定義すること
```|```はまたはを表す。

なので平日は月火水木金土のいずれか、休日は日

## 再帰記述
BNFは、再起的な表現（自分自身を呼び出す性質）を許しており、
＜文字列＞　：：＝＜文字＞　｜　＜文字列＞＜文字＞
＜文字＞　：：＝　a|b|c

これは
文字列は文字または文字列の後ろに文字が付く。
文字はabcのいずれか

なので1文字以上の文字a,b,cの組み合わせとなる。

# 逆ポーランド記法
括弧なしで数式が表現でき、算術式の評価が単純に行える利点がある。
演算子を被演算子をの後ろに置く。
A＋BはAB＋となる。

ABCD÷＋ーの場合は、
AB（C÷D）＋ー
A(B+(C÷D）)ー
Aー（B＋(C÷D））

# ２分木を使った逆ポーランド記法への変換
算術式を２分木の表現にして、その２分木を後攻順序木としてなぞると後置記法（逆ポーランド記法)で表現した式が得られる。
p４３を見る。

# オートマトン
入力、処理、出力といったコンピュータの動作をモデル化し、問題解決のための```処理手順（アルゴリズム）を定式化したもの```。
状態が有限のものを```有限オートマトン```という。
通常、データには初期状態があり、その後複数の状態を遷移しながら、最終状態で停止する。
この遷移しを表や図にしたものが、```状態遷移表```、```状態遷移図```である。

## 状態遷移図
```状態が遷移する様子を図に書いて図形や矢印などのビジュアルで表現したもの```です。状態遷移図では```四角で表現された「状態名」```、```矢印で表現された「遷移」```、その矢印のそばに```どういう動作を行ったのか記入する「イベント（アクション）」```で構成されます。
出典 https://cacoo.com/ja/blog/what-is-state-machine-diagram/

### 気づき
参考書には丸になっている。
こういうこともあるのか。

## 状態遷移表
「状態」と「イベント」をマトリクスで表現したものです。状態遷移図と比較すると、```状態とイベントの組み合わせを網羅的に検討できる```ため、仕様として無効な組み合わせも検討することができます。
出典 https://service.shiftinc.jp/column/4960/

### マトリクスとは？
一般には```「数学の行列」```のことを指す。マーケティングで用いられる際には「マトリクス図」の意味となることが多い。
出典 https://www.synergy-marketing.co.jp/glossary/matrix/#:~:text=%E3%83%9E%E3%83%88%E3%83%AA%E3%82%AF%E3%82%B9%E3%81%A8%E3%81%AF%E3%80%81%E6%9C%AC%E6%9D%A5%E3%81%AF,%E3%82%92%E6%8D%89%E3%81%88%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82

# アルゴリズムの計算量
アルゴリズムの計算量は、処理の効率性を見積もる上で重要となる。

## 検索の計算量
|          | 平均  | 最大      | オーダ   | 
| -------- | ----- | --------- | -------- | 
| 線形探索 | n/2   | n         | o(n)     | 
| ２分探索 | log2n | log2n + 1 | o(log2n) | 
| ハッシュ | 1     | 1         | o(1)     | 

## 整列の計算量
|                              | 比較回数 | オーダ          | 大きさ | 
| ---------------------------- | -------- | --------------- | ------ | 
| 交換法、選択法、挿入法       | n(n-1)/2 | O(n^2)          | 大     | 
| シェルソート                 | nlog2n   | O(n^1.25~n^1.5) | 中     | 
| クイックソート、ヒープソート | nlog2n   | O(nlog2n)       | 小     | 

これを覚えるしかないのか。
コードレビューをするときの３つのポイント

## はじめに

「コードレビューが通りません...」

プログラマ・エンジニアになってから、しばらく付き合うことになる大きな壁だと思います。

この地獄からどうしたら抜け出せるのか？

スーパースキルの先輩エンジニアがレビュー時にボソッと言っていた観点を咀嚼し、数多のインプット・アウトプットを繰り返して、気づけばレビューをする側になっていました。

ここに気を付ければレビューで引っかかることが減った。自分がレビューするときはここに気を付けよう。というポイントを今回は紹介してみようと思います。

※コードに関してはそれぞれの思想があったり、必ずしもこれが正解といえるものの方が少ないと思います。考え方の１つとしてこういうのもあるよ程度に見てもらえれば幸いです。

## コードレビューをするときの３つのポイント
細かいところをあげればきりがないですが、ここでは大きく分けて３つのポイントを紹介します。また、自分がコードを書き終わってプルリクエストを送る前に自分の書いたコードをこれらの観点で見返してみるのも良いと思います。

### 目的が達成されているか？
コードを書いたということは何かやりたいことがあったはず。コーディングする際の仕様があるのであれば、その仕様は網羅されているかみてみましょう。コードを記述した量が多くなるほど、意外と抜け落ちてしまうことは良くあります。

また、本当は実装する前に気づきたいですが「そもそもその仕様で目的は達成されるのか？」という観点でもコードは確認したいです。

### 最短工数で理解できるコードになっているか？
コードレビューがあるということは基本的にチームで開発しているはず。いいコードとは自分以外（数ヶ月後の自分かも）が最短工数で理解できるコードのことです。この辺は[リーダブルコード](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655)に書いてあるので暗記できるくらい読み込みましょう。

また、チーム内のコードの記述に関しては共通認識を取れるように言語やフレームワークのコーディング規約に沿って記述しましょう。

ex)
[php](https://www.php-fig.org/psr/)
[cakephp](https://book.cakephp.org/3/ja/contributing/cakephp-coding-conventions.html)

 
### 名前とロジックが一致しているか？
既存ロジックを修正する際によくなってしまうパターンです。変更によって想定する挙動や渡す引数などが変わってしまうと、その変更を知らないメンバーが流用した時など思わぬバグが発生したり、そのコードを理解するための余計なコストがかかったりします。追加時はもちろん、変更が加わったときには注意しましょう。

ex）　
```diff_php
- public function getRowById(int $id) {
-     return //idに紐づくデータを１件取得する。
- }
+ public function getRowById(array $ids) {
+     return //配列形式で渡したidに紐づくデータを複数取得する;
+ }
```
:::note alert
メソッド名と返される値が一致してない。
ex) getListByIds
:::

### 番外編
３つと言ったのに４つ目ですね...

チーム内で決まっているコーディングルールは守りましょう。

ex) プライベートメソッドはパブリックメソッドと差別化する
```diff_php
- 
+ private function getFullName() {
+     return $this->firstName . $this->lastName;
+ }
```
:::note alert
プライベートメソッドは一目でわかるように下記のようにアンダーバーをつけてください
__getFullName()
:::


ex) cssクラスの命名規則
```diff_css
.block {
}
.block__element1 {
}
-
+ .blockElement2 {
+ }
```
:::note alert
命名規則はBEMを採用しているのでクラス名は下記のようにしてください
block__Element2
:::

## さいごに

運動通信社は「日本を世界が憧れるスポーツ大国にする」というビジョンを達成するべく、一緒に働く仲間を募集しています！

https://sportsbull.jp/about/#recruit
Ruby/Railsに関してのメモ置き場

Progateを使って一週間弱でWeb開発の基礎を攫っていったが、なかなか理解が難しい、、、
まだまだ理解できていないことも多いが役に立った記事などを感謝も込めてまとめておきたい。

※MVCモデルに関しての記述は特に役に立ったので、これだけでも見て欲しい。
★MVCモデルについて：
https://blank-oldstranger.com/2019/01/11/mvc-model/


◆showアクションについて：
https://www.web-knowledge-info.com/wp/ruby_on_rails11/

◆Rails controllerについて：
https://udemy.benesse.co.jp/development/system/rails-controller.html

◆paramsメソッドについて：
https://techacademy.jp/magazine/19878
https://www.sejuku.net/blog/29763
https://pikawaka.com/rails/params

◆マイグレーションファイルについて：
https://qiita.com/right1121/items/0a54ba76dc4261702d1e

◆ルーティングについて：
https://qiita.com/akk11_k/items/a6a21beb2b736ebbc147

◆Flash変数について：
https://qiita.com/d0ne1s/items/2eccf6b22e7ed1d25925
https://www.sejuku.net/blog/27875

◆Newメソッドについて：
https://style.potepan.com/articles/29301.html#:~:text=%E7%B5%90%E8%AB%96%E3%81%A8%E3%81%97%E3%81%A6%E3%80%8Cnew%E3%80%8D%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AF,%E3%80%8Cinitialize%E3%80%8D%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%A8%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82
https://www.sejuku.net/blog/21170

◆バリデーションについて：
https://qiita.com/h1kita/items/772b81a1cc066e67930e

◆ルーティングの順番について：
https://qiita.com/gawach/items/4e7460d06f70e3013eea
https://qiita.com/harinezumi-html/items/46931ffc56c101fc6a4e

◆form-tagについて：
https://www.sejuku.net/blog/29083

◆Nilについて：
https://style.potepan.com/articles/29396.html

◆sessionについて：
https://qiita.com/ozackiee/items/4ee774c81b2a0c571c05
https://qiita.com/zettaittenani/items/a75f0da8f44cfe0f85c0
https://post-output.com/rails-session/

◆Application.html.erbについて：
https://pg-happy.jp/rails-applicationo-layout.html
https://pikawaka.com/rails/layout

◆before_actionについて：
https://qiita.com/shizen-shin/items/0f9a39eb2b571ce1b595
https://qiita.com/kouhei_matuura/items/5d0fb826363878535510
https://railsdoc.com/page/before_action
https://pikawaka.com/rails/before_action