OmniAICreator/Qiita-1.07M huggingface dataset:
CSS ”text-align:center” と”margin:0 auto”のユースケース

-”text-align:center”はブロック要素に記述されている内容（インライン）に効く。
-”margin: 0 auto”はブロック要素にダイレクトに効く。しかしwidthが100%の状態だと効かない。（実際には効いているが幅が広すぎて身動きできないような状態で中央に動かない。）

考察：
ユースケース１：ブロックの幅は100%のままで良く、記述されている内容を中央に寄せたいのであればtext-align: centerで十分。
ユースケース２：ブロックの幅を小さくする必要があり、且つそのブロック要素を中央に寄せたい場合はmargin: 0 autoを使う必要があり。（さらにブロック内に記述される内容も中央寄せしたい場合はtext align: centerも併用。）




```CSS
ユースケース１
p {
    text-align: center
}
```
```CSS
ユースケース２
p{
    text-align: center/left/right;
    max-width: 30%;
    margin: 0 auto
}
```
MT5バックテストのシャープレシオ(旧計算方法)をOnTesterで出力するためのプログラム【コピペ用】

　MT5のアップデートでバックテストの評価項目__「シャープレシオ」__の計算方法が変わってしまったので、OnTesterで旧計算方法のシャープレシオを出力するためのプログラムを作りました。

>旧計算方法
__シャープレシオ = 取引損益の平均値 ÷ 取引損益の標準偏差__

#プログラムを貼っておくので任意のEAにコピペして使ってください。

```.cpp
#include <Math\Stat\Math.mqh>

double OnTester()
  {
   const int dig = 2;   // ←シャープレシオの小数点以下何桁まで表示するか
   
   double PL_Results[];
   double mean = 0, std = 0, SR = 0;

//--- 取引損益を配列に書き込み
   if(!GetTradeResultsToArray(PL_Results))
      return 0;

//--- 取引損益の平均値を計算
   mean = MathMean(PL_Results);

//--- 取引損益の標準偏差を計算
   std = MathStandardDeviation(PL_Results);

//--- 旧計算方法 シャープレシオ
   SR = mean / std;
   SR = MathRound(SR, dig);

   return SR;
  }

//+------------------------------------------------------------------+
//| 取引損益を配列に書き込む
//+------------------------------------------------------------------+
bool GetTradeResultsToArray(double &pl_results[])
  {
//--- 全期間の取引履歴をリクエストする
   if(!HistorySelect(0, TimeCurrent()))
      return (false);

   uint total_deals = HistoryDealsTotal();

//--- 配列を、履歴の取引数にリサイズ
   ArrayResize(pl_results, total_deals);

   int   counter = 0;             // 取引回数カウンター
   ulong ticket_history_deal = 0; // ディールチケット

//--- 全ての取引を配列に取得
   for(uint i = 0; i < total_deals; i++)
     {
      //--- 取引を選択する
      if((ticket_history_deal = HistoryDealGetTicket(i)) > 0)
        {
         ENUM_DEAL_ENTRY deal_entry  = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket_history_deal, DEAL_ENTRY);
         long            deal_type   = HistoryDealGetInteger(ticket_history_deal, DEAL_TYPE);
         double          deal_profit = HistoryDealGetDouble(ticket_history_deal, DEAL_PROFIT);

         //--- 取引操作以外はスルー
         if((deal_type != DEAL_TYPE_BUY) && (deal_type != DEAL_TYPE_SELL))
            continue;

         //--- エントリーアウトのみ
         if(deal_entry != DEAL_ENTRY_IN)
           {
            //--- 取引結果を配列に書き込み、取引のカウントアップ
            pl_results[counter] = deal_profit;
            counter++;
           }
        }
     }
//--- 配列の最終サイズを設定する
   ArrayResize(pl_results, counter);
   return (true);
  }
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1882169/9bc598a1-0377-2f1f-e28d-574de5a264c0.png)
IPC Trading Bot Programmed To Analyze The Forex Market Efficiently

Programming is a very powerful system to build innovations across the globe. A lot of individuals have come to the knowledge of putting up some programming languages to get a specified result.

In the era of Artificial Intelligence (AI), machines now replace human labor, with the sole purpose of relieving the stress that comes with manual labor. More efficiency is realized now because of the proliferation of programmed machines known as robots.

Now, Intelligence Prime Capital now built a robot that trades the forex market through programming. Making trades to end in profit at 97% win rate and 3% loss. This is the first of its kind. All you have to do is locate a link on my profile and click to learn more on how to get started.

#ipc_trading_bot
40 代おっさん GASのデータ型

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## データ型

データ型とは
データの種類のこと言う.

| データ型 | 説明 | 例 |
|----------|------|----|
| 数値型(Number) | 数値値や浮動小数点値 | 100、1.08 |
| 文字列型(String) | 文字列 | 'データ',　"Google"|
| 真偽型 | true, falseのどちらかの値を取るデータ型 | true, false |
| null | 値がないことを表す値 | null |
| undefined | 未定義であることを表す値 | undefined|
| 配列側(Array) | インデックスをキーとするデータ型 | [10,20,30],['ABC',true,100}|
| オブジェクト型 | プロパティをキーとするデータの集合 | {x:10,y:20,z:30},{name:'Taro',age:25}|

定められた記法のこと、またはそれによって記述された値自体のことを
<font color="Red">リテラル</font>と呼ぶ

### typeof演算子

```javascript
typeof 値
```

#### 実行してみる

```javascript
function myFunction() {
  console.log(typeof "利樹");
}
```

コンソールに stringと出たと思います。

## 文字列リテラルとエスケープシーケンス

文字列を扱う場合は、シングルクォーテーション(')またはダブルクォーテーション(")またはバックティック(`)で囲みます。

### バックティック

バックティックで囲まれた文字列はテンプレート文字列と言う。
文字列の中に式を組み込むことや、複数行テンプレート文字列には、｛${式}｝と言う形式のプレートホルダーを含めることが出来る。
プレートホルダーの波括弧には変数や定数、任意の指揮を記述し埋め込むことが出来る。

#### 実践

```javascript
function myFunction() {
  const name = '利樹';
  const age = 4;

  console.log(`僕は ${name}, 僕は ${age}歳`);
}
```

実行すると　僕は利樹、4歳と出るはずです。

### エスケープシーケンス

改行やシングルクォーテーションなど、直接表現ができない文字はバックスラッシュ(\)に指定の文字を組み合わせることで表現できる。

## 参考資料

<https://www.amazon.co.jp/s?k=google+apps+script+%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80&adgrpid=110264232688&gclid=CjwKCAiA9aKQBhBREiwAyGP5lSl7AJJLCvOEHb4wQgMlyqW1fll5X8GDTT_Rkd1_soUAyIPMXQr26hoClHEQAvD_BwE&hvadid=553833563682&hvdev=c&hvlocphy=1009076&hvnetw=g&hvqmt=b&hvrand=4378489642044417389&hvtargid=kwd-594191211348&hydadcr=4106_13159878&jp-ad-ap=0&tag=googhydr-22&ref=pd_sl_2x1owglv0s_b_p52>
SparkConfを使用してSparkContextの設定をカスタマイズ


```python
# SparkConfクラスからインスタンスを初期化し、SparkContextクラスのインスタンス時の引数に入れる
# pysparkだとSparkContextクラスのインスタンスが最初から初期化されている

print(sc)  # 最初から初期化されている

from pyspark.conf import SparkConf
from pyspark.context import SparkContext

conf = SparkConf()
# conf.set('spark.executor.memory', '2g')
print(conf.getAll())

# もう存在するのでエラーにならないよう既存のものをstopする必要あり
sc.stop()
sc = SparkContext(conf=conf)
```

    <SparkContext master=local[*] appName=PySparkShell>
    [('spark.master', 'local[*]'), ('spark.submit.pyFiles', ''), ('spark.submit.deployMode', 'client'), ('spark.app.name', 'PySparkShell'), ('spark.ui.showConsoleProgress', 'true')]
    


```python
sc.getConf()
```




    <pyspark.conf.SparkConf at 0x1c6aa4b2d00>




```python
# Attributes
print(sc.applicationId)
print(sc.defaultMinPartitions)  # A unique identifier for the Spark application.
print(sc.defaultParallelism)  # CPUのスレッド数だっけ？そしたら21だったと思うけど
print(sc.resources)
print(sc.startTime)
print(sc.uiWebUrl)
print(sc.version)
sc.stop()
```

    local-1644843835282
    2
    20
    {}
    1644843835148
    http://kubernetes.docker.internal:4041
    3.2.0
    

# sparkConfの設定をいろいろ変えてみる


```python
conf = SparkConf()
conf.getAll()
```




    [('spark.master', 'local[*]'),
     ('spark.submit.pyFiles', ''),
     ('spark.submit.deployMode', 'client'),
     ('spark.app.name', 'PySparkShell'),
     ('spark.ui.showConsoleProgress', 'true')]




```python
from pprint import pprint
conf.setMaster("local").setAppName("changed app name")
conf.setMaster("CHANGED")
pprint(conf.getAll())

conf.setExecutorEnv("VAR1", "value1")
pprint(conf.getAll())
```

    [('spark.app.name', 'changed app name'),
     ('spark.submit.pyFiles', ''),
     ('spark.submit.deployMode', 'client'),
     ('spark.master', 'CHANGED'),
     ('spark.ui.showConsoleProgress', 'true')]
    [('spark.executorEnv.VAR1', 'value1'),
     ('spark.app.name', 'changed app name'),
     ('spark.submit.pyFiles', ''),
     ('spark.submit.deployMode', 'client'),
     ('spark.master', 'CHANGED'),
     ('spark.ui.showConsoleProgress', 'true')]
    

# ほかのアプローチ

- sparkConfは設定できる項目が少ない。ほかの設定方法を探す。
https://spark.apache.org/docs/latest/configuration.html#environment-variables

> Properties set directly on the SparkConf take highest precedence, then flags passed to spark-submit or spark-shell, then options in the spark-defaults.conf file.

以上の記載によると、優先度の関係で、
`spark-3.2.0-bin-hadoop3.2\conf\spark-defaults.conf.template`
でなく、cli上で実行するときのオプションや`spark-submit`のオプションに設定すると反映される。

- コマンドライン上で`pyspark --NAME CHANGE`とすると、`spark.app.name=CHANGE`になっていることがわかる。設定は4040のenviromentから参照できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/0cb82509-af7b-dd4f-3f1b-35603f3ba4a2.png)

- `--executor-cores`などの反映は`sum.java.command`から参照できる模様。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/99b61a5f-2c27-9a1b-c379-880c0b15f256.png)
gitには気を付けるべし

結果的に作業用ブランチを作らずstagingブランチに直接pushしてしまい、社員の方に迷惑と無駄な手間をかけてしまったので、少し反省点を書く。

## 会社のgit状況が曖昧なまま進めない
会社のgit管理がどのようになっているかは絶対に把握する。
その中でも大事なのはブランチで、どのようなブランチが存在して、どのブランチを作成して切るかは知っておくべき。これを知らずに進めないこと。

以下のような流れを意識する。

1. 作業ブランチを作成する 　`git branch <ブランチ名>` <br>
※ ブランチ名も適当にせず話を聞く
2. ブランチを切り替える　`git checkout <ブランチ名>` <br>
※ 1,2は`git checkout -b <ブランチ名>`で一気に行うことができる
3. 作業ブランチにmasterやstagingなどのブランチを反映　`git pull origin master`
4. 開発（確認しやすくするため、1コミットごとの作業はできるだけ少なく）
5. 作業ブランチのリモートリポジトリにpush　`git push origin <ブランチ名>`
6. プルリクエスト作成

## 事前に学習するべし
何度か炎上事例があるように、gitのミスは大惨事になることがある。僕の場合は社員の方が優しくて丁寧に指摘や注意をしてくださったが、人によっては怒号を浴びせられることも。
人間誰しもミスはあるが、gitのミスはできるだけ起こさないように事前に調べ、学習しておく必要がある。
隙間時間や暇なときは「[サル先生のGit入門](https://backlog.com/ja/git-tutorial/)」を見ておくと良いかも。

もし間違えてpushしてしまった場合、`git reset`や`git revert`といった対処があると思うが、素直に社員の方に事情を説明するほうが安全。そもそも個人じゃなくて会社のリポジトリなんで、あまり慣れてないことを色々試すなんて怖くて自分にはできないしやらないほうが良いはず。更に悪化したら顔面蒼白です。
onNewIntentで状態を更新する(Jetpack Compose)

# はじめに
Jetpack Composeを使用している状況でActivityの`onNewIntent`や`onActivityResult`でアプリの画面状態を更新する方法についての記事となります。
Jetpack Composeでは状態を`MutableState`として保持し、`remember`を使用することで再Compose後も状態を保持することができます。ただしこれら基本的に特定のComposable関数以下のスコープ内に制限されてしまい、`onNewIntent`や`onActivityResult`からどうやって更新すればいいんや～だったたのでコードを書いてみたという流れになります。

# やったこと

方針としては`MutableState`をActivityのメンバとして保持し、その値を`remember`でComposable関数に記憶させます。

1.Activityのメンバ変数に`MutableState`で変数を持たせる。
ここで定義した値を`onNewIntent`や`onActivityResult`で更新し、それらを読みこむComposable関数を更新させる算段です。

```kotlin
class MainActivity : ComponentActivity() {
  private val _message = mutableStateOf("initial message")
}
```

2.`remember`で再Compose後も状態を保持する。

```kotlin
class MainActivity : ComponentActivity() {
　// 他省略
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContent {
      val message by remember { _message }
      Text(text = message)
    }
  }
}
```

3.`onNewIntent`で`MutableState`を更新する。

```kotlin
class MainActivity : ComponentActivity() {
  // 他省略
  override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    _message.value = "onNewIntent"
  }
}
```

# 結果

- `onCreate`の後に`onNewIntent`を呼び出しています。
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2130833/30613265-2910-9cb2-130a-4f0965ec821b.gif)



# 感想
結構簡単にできました。

ちなみに自分はほかのアプリから明示的Intentで起動できるアプリを作成しており、`onNewIntent`で値をもらってUIに反映するということがしたかったという背景があります。
また`onNewIntent`を呼ぶにはActivityの`LaunchModel`が`singleTask`などになるようにあらかじめ設定してあげましょう。

それと、今回の場合`remember`は使わなくても良いのでしょうかね。`remember`はComposition前後で値を保持し続けるための処理ですが、今回の場合値をメンバで保持しているため、rememberがなくても値は取得できていました。


以上です。
クラス図を作成できない方でも大丈夫　eclipceでクラス図を自動生成してみた

##はじめに
ある時、Buildingパターンのクラス図を作ろうとしましたが、クラス図の作り方がわかリませんでした。なのでeclipceで自動生成してみました。

##全体の流れ
たった３ステップで作成できてしまいます。

①GEF SDKをインストール
②GEF SDKのインストール
③クラス図の作成

##GEF SDKのインストール
①ヘルプボタンを押下し「新規ソフトウェアのインストールを押下しましょう。
![スクリーンショット 2022-02-14 21.48.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526916/c534721f-cf54-115a-377a-4b60c9f2675a.png)

②作業対象に「http://download.eclipse.org/releases/oxygen」を検索しましょう。
③モデリング選択し、GEF (MVC) SDKをインストールしましょう。
![スクリーンショット 2022-02-14 22.30.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526916/a58d3bc1-2010-5504-dc19-db30e16c059f.png)

:::note info
GEFとはGraphical Editing Frameworkの略です。
要はプラグインです。
:::

##AmaterasUMLをインストール
①下記のサイトからAmaterasUML_1.3.4.zipをインストールします
http://amateras.osdn.jp/cgi-bin/fswiki/wiki.cgi?page=AmaterasUML

②ダウンロードしたAmaterasUML_1.3.4.zipファイルを解凍し、「eclipse\dropins」配下にコピーします。

:::note info
AmaterasUMLとはクラス図やシーケンス図を描画するためのEclipseプラグインです。
:::

##クラス図を作ろう
①クラスを作るようにパッケージエクスプローラーで右クリックをして新規からその他を選択
![スクリーンショット 2022-02-14 22.41.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526916/bad921a3-b31f-f158-261d-4ee8aeb65f1a.png)

②AmaterasUMLのフォルダーからクラス図を選択し、次へボタンを押下
![スクリーンショット 2022-02-14 22.45.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526916/451bbe30-8cbc-4c11-09de-43d2a65ffd57.png)

③ファイル名を入力し完了ボタンを押下
④ワークスペースにクラス図を作成したいクラスをドラックインするとクラス図ができる。
![スクリーンショット 2022-02-14 22.54.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526916/881f7069-4f43-2b24-11cc-a95eb58f50d3.png)

##参考サイト
https://medium-company.com/eclipse-%E3%82%AF%E3%83%A9%E3%82%B9%E5%9B%B3-%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90/

https://qiita.com/stu345/items/e37fb0b657d08db975be#amaterasuml%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
3ウェイ・ハンドシェイクについて

# 3ウェイ・ハンドシェイク
TCP通信を行う際に接続を確立する為に用いられる手段

相手と自分の双方が通信が可能である事を認識するのがゴール


## 3ウェイ・ハンドシェイクの手順

1. 通信要求者(クライアント)が相手(サーバ)に対して、通信を要求するSYNパケットを送信する
2. SYNパケットを受け取ったサーバはクライアントに対して、通信を許可するSYN ACKパケットを送信する
3. SYN ACKパケットを受け取ったクライアントはサーバに対して、接続開始をするACKパケットを送信する

## TCPプロトコルの内部ステート

TCPではオープン/クローズ、通信が確立する状態を持っている。

https://qiita.com/mogulla3/items/196124b9fb36578e5c80


TCPの状態や状態遷移は上記の記事の通りである。

Linuxでは、[include/net/tcp_states.h](https://elixir.bootlin.com/linux/latest/source/include/net/tcp_states.h#L12)にステートが定義されている

##  3ウェイ・ハンドシェイクとステート
1. 初期状態
   * クライアント: CLOSED
   * サーバ: LISTEN
1. 通信要求者(クライアント)が相手(サーバ)に対して、通信を要求するSYNパケットを送信する
   * クライアント: SYN_SENT
   * サーバ: LISTEN
2. SYNパケットを受け取ったサーバはクライアントに対して、通信を許可するSYN ACKパケットを送信する
   * クライアント: SYN_SENT
   * サーバ: SYN_RECEIVED
3. SYN ACKパケットを受け取ったクライアントはサーバに対して、接続開始をするACKパケットを送信しコネクションを確立する
   * クライアント: ESTABLISHED
   * サーバ: SYN_RECEIVED
4. ACKパケットを受け取ったサーバは、コネクションを確立する
   * クライアント: ESTABLISHED
   * サーバ: ESTABLISHED
# 参考文献

https://qiita.com/mogulla3/items/196124b9fb36578e5c80
【C#】Head First デザインパターン5章　Singletonパターン

#シングルトンパターン
今回は5章シングルトンパターンをC#で勉強していきます

Head Firstデザインパターン
https://www.oreilly.co.jp


シングルトンパターンはクラスのインスタンスの単一性を保証するデザインパターンです。
今回の例はチョコレート工場で、チョコレートと牛乳をボイラーにいれ、沸騰させたものを固めることでチョコレートバーを作ることができます。今回注目するのはボイラーの単一性なので、インスタンス周り以外に特に実装はありません。


```ChocolateBoiler.cs
public class ChocolateBoiler
    {
        private bool empty;
        private bool boiled;
        public ChocolateBoiler()
        {
            empty = true;
            boiled = false;
        }
        private static ChocolateBoiler uniqueInstance;
        public static ChocolateBoiler getInstance()
        {
            if (uniqueInstance == null)
            {
                 uniqueInstance = new ChocolateBoiler();
            }
            return uniqueInstance;
        }

        public void fill()
        {
            if (isEmpty())
            {
                empty = false;
                boiled = false;
            }
        }

        public void drain()
        {
            if(!isEmpty() && isBoiled())
            {
                empty = true;
            }
        }

        public void boil()
        {
            if(!isEmpty() && !isBoiled())
            {
                boiled = true;
            }
        }

        public bool isEmpty()
        {
            return empty;
        }

        public bool isBoiled()
        {
            return boiled;
        }
    }
```

一番大事なのはgetInstanceの部分です。uniqueInstanceがもうすでにある場合、新しくインスタンスが作られないため単一性を維持することができます。
実際にボイラーを二つgetInstanceを介して作り、その二つが同じかどうかを確かめます。


```Program.cs
 ChocolateBoiler boiler = ChocolateBoiler.getInstance();
 ChocolateBoiler boiler2 = ChocolateBoiler.getInstance();

if (boiler == boiler2)
{
        Console.WriteLine("True");
}
else
{
        Console.WriteLine("False");
}
```

この場合Trueが返ってきます。
二つのオブジェクトをgetInstanceを介さず別々に作った場合は違う結果が返ってきます。

```Program.cs
 ChocolateBoiler boiler = new ChocolateBoiler();
 ChocolateBoiler boiler2 = new ChocolateBoiler();
```

インスタンスを新しく作った場合は別のインスタンスなので、Falseがかえってきます


:::note warn
スレッドが複数ある場合、この書き方だと必ずしもインスタンスの単一性が守られるとは限りません
:::

```ChocolateBoiler.cs
public static ChocolateBoiler getInstance()
{

   if (uniqueInstance == null)
   {
         uniqueInstance = new ChocolateBoiler();
   }
   return uniqueInstance;
}
```

getInstance部分に再度注目し、スレッドが二つある場合を考えます。その二つのスレッドがif文を同時に処理した場合、最初のuniqueInstanceが作られる前に両方のスレッドでuniqueInstance == nullが実行されてしまうかもしれません。その場合インスタンスが生成される前にnullチェックが行われるので、新しいインスタンスが二つ作られてしまうことになります。それを回避する方法の一つとしてlockが挙げられます。

```ChocolateBoiler.cs
private static object lockObj = new object();
private static ChocolateBoiler uniqueInstance;
public static ChocolateBoiler getInstance()
{
    lock (lockObj)
    {
         if (uniqueInstance == null)
         {
              uniqueInstance = new ChocolateBoiler();
         }
         return uniqueInstance;
    }
}
```

if文の中をロックすることで、一つのスレッドが処理をしている間はほかのプロセスが処理をできないようにすることができます。こうすることで、インスタンスの単一性を保つことができます。
今回の章は短かったです、次回は6章をやっていきます。
【DDD】Domain層についてざっくり

ドメイン駆動開発のDomain層についてざっくりと。
完全に個人の勉強メモ用です。

※こちらに記述されている表現は、いろいろな捉え方があり「これが正解」という訳ではございません。

# 基礎概念
基礎となる概念。

## ロジックが書かれる場所には2種類ある
- 「使う側(クライアントコード)」と「使われる側」

## 「使う側」に知識がある場合のデメリット
- **関数の共通化や定数化のみ**では、どこでどのように使うのかまでチーム全体で把握できない
    - 関数の存在を知らないメンバーが同じような関数を書き始める
- 「使う側」に知識があると、どこでどのように使わないといけないか、をプログラマーが永遠に覚えておかないといけない
- 「使う側(各画面)」で値の加工をしてしまうと、画面Aでは小数点切り捨て、画面Bでは切り上げになったり、単位名がカタカナだったり、アルファベットだったり、ビジネスロジック(仕様)がバラける可能性が高くなる
- 呼び出す時に「これはこう使うんだな」と分かる作りにする必要がある

## 「使われる側」に知識がある場合のメリット
- 呼び出す時にインテリセンスが効くので、インテリセンスの中から選ぶだけの状態になる
    - 知識は「使われる側」に集約されているので、使う側は知る必要がない

## これら課題を解決するために
- データ取得後の値の加工を早い段階で行なってあげる
- EntityやValueObjectを使って実装する

# Entity
(DDDにおけるEntityは、Clean ArchitectureのEntityとは別の意味になります)

- データを運ぶ入れ物であり、運んでいる値に対するビジネスロジックの置き場所
- ValueObjectを運べるようになる
- 一意生のあるデータのひとかたまり
- SQLなどで取得するデータの1行分
- 型はDBの型を各言語に置き換えたもの
- Entityクラス内でValuObjectクラスに変換する

# ValueObject
- 値として扱うクラス
- 完全コンストラクタパターン(必須)
- 値をロジックを一体化させる
- 別インスタンスでも値が同じなら同じものと判断する
- 突き詰めていけばDB項目全てをValueObjectにできるが、ビジネスロジックがないのであれば基本の型でもよい
- 現場でロジックが散らばる原因は、値を基本の型で動かすから
    - DBから取得してきたらできるだけ早い段階で、ValueObjectにして値とロジックが一緒になっているクラスに変更することで、ロジックは1つの場所に集約される
- 現場でバグが生まれるのは、値を基本の型で動かすから

# Repository(インターフェイス)
- リポジトリは永続化や再構築を担う(インフラストラクチャ)
- DB操作はプログラムの意図をぼやけさせるので分離する
- テスト実行を容易にさせ、変更の難易度を下げる
NameError: name ‘os’ is not definedが表示される場合の2つの解決法

#はじめに
僕はこのエラーに2回遭遇した経験があります。
1回目は、はじめてのDjango使用時にstartappしようとしたとき
2回目は、画像アップロード機能を追加するためsettings.pyにMEDIA_ROOTに以下の記述を追加し、migtateを実行したときです。

``` python:settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
```
両者とも同じ方法で解決することができました。
しかし2回目解決の際、1回目の解決法を思い出すことが出来ず調べていて、別の方法を発見しましたので、備忘録としてまとめます。
（思い出せなかった件がアカウント作成のきっかけでもあります。アウトプット、メモ書き大事）

#解決方法

1. settings.py内に **import os** を記述する
2. os.pathを利用せず、**BASE_DIR/ ' '** という**pathlib形式**で記入する


#詳細

1. の方法に関してはsettings.pyの最初の行にでも追記すればよいだけなので、非常に簡潔な方法ですね。startapp実行初期の状態では未記入の状態ですので、os.pathを利用する場合には忘れずに記入しましょう。

2. の方法に関しては、**Django 3.1以上で**利用できる方法になります。
Django3.1以降では、標準でpathlibというパッケージが入っています。
pathlibはファイルやディレクトリを操作することができるライブラリになります。

```python:settings.py
from pathlib import Path
```
Djangoに標準搭載につき、この記述を自分でする必要はありません。
また、記述量も少なく見やすくなります。

```python:os.pathの場合
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
```

```python:pathlibの場合
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR/'media'
```

また、今回の問題とは直接関係ありませんが、pathlib形式で記入することでBASE_DIRの記述方法も変化しています。ここは別記事でまとめようと思います。

どちらの場合でも動作自体は正しくすることが確認できましたが、 os.path と pathlib が混在している場合、500エラーというものが出る場合もあるそうです。

素人ながら、コードは短いに越したことは無いと思いますので、今後は pathlib を主に利用していきたいと考えています。
以上！
【JavaScript関数ドリル】を毎日やる【勉強用】その5



#【JavaScript関数ドリル】初級編のtake関数の実装のアウトプット

       
```javascript:take関数の挙動
_.take([1, 2, 3]);
// => [1]
 
_.take([1, 2, 3], 2);
// => [1, 2]
 
_.take([1, 2, 3], 5);
// => [1, 2, 3]
 
_.take([1, 2, 3], 0);
// => []
```
第2引数分の値を先頭から取得するもの
##take関数の課題内容
https://youtu.be/3euFMRP0XqA

##take関数に取り組む前の状態
- 前回作成したtakeRight関数をそのまま使用することにした

##take関数に取り組んだ後の状態
- 単純な機能でも様々な実装方法があるとわかった


##take関数の実装コード

```javascript:
const take = (array, num) => {
    let newArray = [];
    if (num === 0) {
        return newArray;
    } else if (num > 1) {
        const sliceNumber = num;
        newArray = array.slice(0, sliceNumber);
    } else {
        newArray = array.slice(0, 1);
    }
    return newArray;
};

console.log(take([1, 2, 3, 4, 5, 6], 3));
//[1,2,3]
console.log(take([1, 2, 3, 4, 5, 6]));
//[1]
console.log(take([1, 2, 3, 4, 5, 6], 8));
//[1,2,3,4,5,6]
console.log(take([1, 2, 3, 4, 5, 6], 0));
//[]
```



##take関数の解答コード

```javascript:
function take(array, n = 1) {
  if(n === 0) {
    return [];
  }
  if(n > array.length) {
    return [...array];
  }

  const takenValues = [];
  for(let i = 0; i < n; i++) {
    takenValues.push( array[i] );
  }

  return takenValues;
}

console.log( take([1, 2, 3]) );
// => [1]

console.log( take([1, 2, 3], 2) );
// => [1, 2]

console.log( take([1, 2, 3], 5) );
// => [1, 2, 3]

console.log( take([1, 2, 3], 0) );
// => []
```
AWSの学習をするうえでわからなかった横文字をひたすらまとめておく

# はじめに
はじめにもなにも題名の通り。ひたすら書いていく。


## ダウンタイム
常に使用できることが期待されているシステムとかサービスが停止・中断してしまっている時間のこと。

## レイテンシー
データの転送に関しての指標のひとつ。データの転送を要求してから実際にデータが送られてくるまでに生じる通信の遅延時間のこと。

## マネージド型
通信サービスやITサービスなどで、そのサービスの利用に必要な機器やソフトウェアの導入や管理、運用などの業務もすべて請け負うサービスのこと。

## スパイク
何かが急激に増加すること。

## スティッキーセッション
ロードバランサーの機能の１つ。セッションがつづいている間は同じクライアントを同じサーバーに誘導すること。

## スナップショット
ある時点(瞬間)でのソースコードやファイル、データベースファイルなどの情報(状態)を保存したもののこと。

## シーケンス
あらかじめ決められた順序で処理を行うこと。

## スループット
一定時間にどれだけの処理ができるのか、そのデータ量のこと。

## フォールトレランス
システムや機器の一部が故障・停止しても、予備の系統に切り替えるなどして機能を保ち、正常に稼働させ続ける仕組みのこと。
フォールが「障害」、トレランスが「耐久力」で「障害耐性」のことらしい。

## スケーラビリティー
拡張性、拡張可能性のこと。

## キャパシティーユニット
書き込み/読み込み容量のこと。

## オーバーヘッド
付加的な処理のこと。オンプレミスからクラウドにデータを移行するときに、何か手間がかかることなどをオーバヘッドとかいうらしい。

## ハイパーバイザー
コンピューターを仮想化するためのソフトウェアのこと。

## パッチ
ソフトウェアを構成するプログラムやデータを更新・修正するために、新しいものとの相違点（差分）を抜き出したデータのこと。

## プロビジョニング
必要に応じてネットワークやコンピュータの設備などのリソースを提供できるよう予測して、準備しておくこと。

## データストア
情報システムの構成で、データを決められた形で記憶装置に永続的に保存・蓄積する機能やそのもの事体を抽象的・総称的に表す用語らしい。リレーショナルデータベース（RDBMS）、キーバリューストア（KVS）、クラウドストレージなどはその一形態とみなせる。

## ストライピング
複数のハードディスクに分割して書き込みを行うこと。
Railsのscopeとは

## scope（スコープ）とは

特定のSQL文をメソッドのように呼び出すことができる機能のことです。

下記のように、モデル内にscopeを定義することで使用することができます。

```hoge_hoge.rb
class HogeHoge < ApplicationRecord
  scope :active, -> { where(deleted: false) } 
  scope :by_account, -> lambda{|account_id|where(account_id: account_id)}
end
```


```rb 
# 使用例
HogeHoge.active

HogeHoge.by_account(params[:account_id])

HogeHoge.by_account(params[:account_id]).active
```

## 何が便利なのか？
・コードが短くなる。

・適切なscope名をつけることで、直感的に読みやすいコードになる。

・何度も同じようなクエリを使いまわしている場合、
　scopeを使用していれば、一箇所修正するだけで済む。


### 参考記事：

https://pikawaka.com/rails/scope
https://qiita.com/ozin/items/24d1b220a002004a6351
https://qiita.com/ngron/items/14a39ce62c9d30bf3ac3
【C#】関数から2つ以上の戻り値を返す方法

# 結論
`Tuple`型もしくは`自作(カスタム)`クラスを使います。

# 解説
簡単に関数から2つ以上の戻り値を返したい場合は`Tuple`型を使用します。

使用方法は下記になります。

```C#:Tuple型で返す
        /// <summary>
        /// ユーザーの名前と年齢を返します。
        /// </summary>
        /// <returns>item1：ユーザー名, item2：年齢</returns>
        private (string, int) GetUserData()
        {
            return ("山田", 25);
        }
```

`Tuple`型からデータを取得するには下記のように記載します。

```C#:Tuple型からデータを取得する例
        private (string, int) GetUserData()
        {
            return ("山田", 25);
        }

        private void User()
        {
            var tupleData = GetUserDatas();

            //名前を取得
            var userName = tupleData.Item1;

            //年齢を取得
            var userAge = tupleData.Item2;
        }
```

戻り値に名前をつけることも可能です。
([@ktz_alias](https://qiita.com/ktz_alias)さん、[コメント](https://qiita.com/rait0/items/b2ec3f3768943a70f893#comment-0fa9e2cc760b72b24b33)で教えて頂きありがとうございます！)

```C#:名前付きTuple型からデータを取得する方法
// フィールド名付きタプルでメソッド定義
private (string Name, int Age) GetUserData()
{
    return ("山田", 25);
}

private void User()
{
    var tupleData = GetUserDatas();

    //名前を取得
    var userName = tupleData.Name; // フィールド名でアクセス

    //年齢を取得
    var userAge = tupleData.Age; // フィールド名でアクセス
}
```

厳格に関数から2つ以上の戻り値を返したい場合は`自作クラス`を使用します。

```C#:自作クラスを実装
    public class User
    {
        public string Name { get; }

        public int Age { get; }

        public User(string name, int age)
        {
            Name = name;
            Age = age;
        }
    }
```

使用方法は下記になります。

```C#:自作クラス(User)で返す
        /// <summary>
        /// ユーザーの名前と年齢を返します。
        /// </summary>
        /// <returns>Userクラス</returns>
        private User GetUserData()
        {
            return new User("山田", 25);
        }
```

自作クラス(User)からデータを取得するには下記のように記載します。

```C#:自作クラス(User)からデータを取得する例
        private User GetUserData()
        {
            return new User("山田", 25);
        }

        private void User()
        {
            var userData = GetUserData();

            //名前を取得
            var userName = userData.Name;

            //年齢を取得
            var userAge = userData.Age;
        }
```

以上です。

# 追記(2022/02/15)

`Taple`と記載しておりましたが`Tuple`が正しい綴りでした。[@apashoni](https://qiita.com/apashoni)さん、編集リクエストを頂きありがとうございました！
40 代おっさん GASの変数・定数

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## 変数

変数とは、スクリプトを実行するうえで発生する数値、文字列、オブジェクトなどのデータを格納するデータの箱

変数を使うのに宣言する必要がある。

```javascript
let 変数名 = 値,…
```

カンマ区切りをすることで、複数の変数の宣言ができる。

```javascript
let a, b;
```

### 代入

代入とは
変数にデータを格納することを代入と言う

## 定数

変数は上書き可能ですが、定数は上書きできない。
他は変数と同じ

```javascript
const 変数名 =　値,…
```

## 識別子の命名規則

変数、定数、または関数などに付ける名前を、識別子と呼ぶ

### 識別子のルール

先頭文字に数字、一部（アンダースコア（＿）、ドル記号（＄))を除いて記号文字は使えない
予約語は使用できない
大文字と小文字は区別される

予約語とは
let,functionなど

### 命名のコツ

中宮役割が分かる意味にする
英単語、日本語は使わない
用途や場所によってキャメル記法、スネーク記法、パスカル記法を使い分ける

#### キャメル記法

2つ目の以降の単語の頭文字を大文字にする記法

maxRow, userNameなど

一般的に、<font color="Red">関数名、関数内</font>の変数名、定数名に用いる

#### パスカル記法

キャメル記法の最初の単語の頭文字を大文字にする

DateObject, SlackAppなど

クラス名に用いられる

#### スネーク記法

単語をアンダースコア(_)で連結しつつすべてを大文字とする記法

TAX_RATE, USER_IDなど

グローバル定数、プロパティストアのキーに用いられる

## 参考資料

<https://www.amazon.co.jp/s?k=google+apps+script+%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80&adgrpid=110264232688&gclid=CjwKCAiA9aKQBhBREiwAyGP5lSl7AJJLCvOEHb4wQgMlyqW1fll5X8GDTT_Rkd1_soUAyIPMXQr26hoClHEQAvD_BwE&hvadid=553833563682&hvdev=c&hvlocphy=1009076&hvnetw=g&hvqmt=b&hvrand=4378489642044417389&hvtargid=kwd-594191211348&hydadcr=4106_13159878&jp-ad-ap=0&tag=googhydr-22&ref=pd_sl_2x1owglv0s_b_p52>
RXファミリーのCANサンプルコードで拡張CAN IDモードが動かなかった件


# はじめに
去年末からマイコン系の作業を振られるようになりました。
Arduinoの次は、RXってレベルアップし過ぎでは？と思いつつ作業している途中、RXファミリーのCAN通信用のサンプルコードで拡張CAN IDモードが動かなかった件に躓いたので、同じように困っている人向けの記事。
ビルドなどの細かな手順は省略してます。

#環境
* ボード：RX71M-Starter-Kit-Plus
* IDE：Renesas e² studio（Version: 2022-01 (22.1.0)）
* CANコンポーネント：r_can_rx rev.5.20
* ツールチェーン: Renesas CCRX v.3.03.00
* サンプルコード：r01an2472xx0520-rx-can.zip内のcan_demo_rskrx71m.zip

#サンプルコード修正箇所
* src/demo/can_api_demo.c  
ループバックモードでテストするために、232行目のコメントアウトを解除  
```
//api_status = R_CAN_PortSet(g_can_channel, CANPORT_TEST_1_INT_LOOPBACK);
```
* r_can_rx_config.h  
拡張CANIDモードにするために、81行目の```STD_ID_MODE```を```EXT_ID_MODE```に変更する。  
```
#define FRAME_ID_MODE   (STD_ID_MODE)
```

#現象
起動時にシリアルモニターに「Success! Sent first CAN frame.」と出力されるはずが、出力されない。
より詳細には、R_CAN_TxSetXidで送信用のデータセットした後、データが送信されず、送信状態のまま（R_CAN_TxCheck()の戻り値が、R_CAN_NO_SENTDATA(0x08)のまま）になる。

#原因
下のように、```FRAME_ID_MODE```が```STD_ID_MODE```の時は、```R_CAN_Control(g_can_channel, OPERATE_CANMODE);```が呼ばれているが、```EXT_ID_MODE```では呼ばれていない。
OPERATEモードにしないと送受信始まらないので、そりゃ動きませんわ。

```
    /***************************************************
     * Try to send very first frame. Stop if no success.
     ***************************************************/
    if (FRAME_ID_MODE == STD_ID_MODE )
    {
        R_CAN_Control(g_can_channel, OPERATE_CANMODE);
        api_status |= R_CAN_TxSet(g_can_channel, g_mb_mode, CANBOX_TX, &tx_dataframe, DATA_FRAME);
    }
    else
    {
        api_status |= R_CAN_TxSetXid(g_can_channel, g_mb_mode, CANBOX_TX, &tx_dataframe, DATA_FRAME);
    }
```

#対策
```EXT_ID_MODE```の場合でも、```R_CAN_Control(g_can_channel, OPERATE_CANMODE);```を実行するようにする。

#最後に
マイコン開発はプログラムが悪いのか、ハードが悪いのか（故障含む）の問題切り分けノウハウが無くて辛い。
あと、ルネサスさん。サンプルコードに含まれている説明書に、「動作確認環境」の項目にRX71Mがありましたが、どんな確認しているんですかねぇ。
とりあえず、明日ルネサスの株売っておきますね。
Ubuntu20.04にphpenvを入れる

## はじめに
古いバージョンからUbuntuをアップデートしたりして使っている人はもしかしたら記載している以外にもライブラリやツールが必要になることがあるかもしれないです。
タイトルは「phpenvを入れる」となっていますが、普通のphp単体のビルドにも利用できる。。。かも？

他にも同じような内容でQiitaに記事を方がいらっしゃいますが、「PHPのバージョンが古いのでもしかしたら必要なライブラリが違うのかも」、とか「書いた人の環境ではそうだったのかな？」とか思ったので編集リクエストではなく新規で記事を書きました。
もしお互いに記事を更新して内容が同じになった場合はこちらの記事を消そうと思っています。

## 環境
- OS: Ubuntu 20.04.03(Desktop)
- PHP: 8.0.15

## コマンド
Desktop版のまっさらな状態からは以下のコマンドを実行すればたぶん大丈夫なはずです。

```bash
$ sudo apt install \
autoconf \
build-essential \
libbz2-dev \
libcurl4-openssl-dev \
libfreetype6-dev \
libjpeg-dev \
libkrb5-dev \
libmcrypt-dev \
libonig-dev \
libpng-dev \
libreadline-dev \
libsqlite3-dev \
libssl-dev \
libtidy-dev \
libxml2-dev \
libxslt1-dev \
libzip-dev
```

## 備考
phpenvのreadmeには`.bash_profile`にパスを記載していますが、Ubuntuの人は`.bashrc`に書くと綺麗かもです。
rails heroku上のDBをリセットする

# 結論
heroku上のDBをリセットするには、以下のコマンドを実行する。

```ターミナル.
heroku run rails db:migrate:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1
```
---
# 環境
- rails 6.0.4.4
- ruby 2.6.5
- MySQL 5.6.51 
- heroku


## heroku runでDBリセットのコマンドを実行
heroku上のDBをリセットしようと以下のコマンドを実行した。

```ターミナル.
heroku run rails db:reset
```
以下のエラーが発生。

```ターミナル.
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.
If you are sure you want to continue, run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1
```
エラー内容をgoogle翻訳で訳すと以下のようになる。

```ターミナル.
ActiveRecord :: ProtectedEnvironmentError：「本番」データベースに対して破壊的なアクションを実行しようとしています。
続行することが確実な場合は、環境変数を使用して同じコマンドを実行します。
DISABLE_DATABASE_ENVIRONMENT_CHECK = 1
```

「データベースに対して破壊的なアクション」が実行されるので、本当に実行する場合は「DISABLE〜(以下省略)」を使用してください、ということらしい。

「DISABLE〜(以下省略)」を追記してコマンドを実行する。

```ターミナル.
heroku run rails db:migrate:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1
```
heroku上のDBが予定通りにリセットされ、アプリの挙動も問題なし。
ローカル環境でDBをリセットした後に、本番環境のDBも忘れずにリセットする必要がある。

# 参考
- https://qiita.com/yusuke_s221/items/cefb1808fdf481e6e445
- https://qiita.com/saika_0/items/7afe389471adb4e69f9a
ブラウザの開発者ツールでjqueryが使われているか判定する

対象のサイトにjqueryが使用されているかどうか判定する方法

１開発者ツールを開く(F12)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2306409/3992f0c6-d534-0e4b-0a4a-0ee27183a483.png)

２Consoleを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2306409/d419917f-a308-88a8-ed92-8f8388ba8478.png)


３ $.fn.jqueryを入力する

- jqueryが使用されている場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2306409/ad527aad-0487-f8b8-fef3-a846aee2a9e6.png)

- jqueryが使用されていない場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2306409/22bcf3ba-9d5a-8ded-aac7-2df036f66511.png)
WindowsのGoogleChromeのフォントをすべて変更するまでの書置き



##挨拶
こんにちは
今回はGoogle Chromeの表示フォントをすべてNoto Sans CJK JPにします。
**理由はメイリオなんて大っ嫌いだからです。**

##使うもの
Chromeの拡張機能を使います。
Advanced Font Settingsという拡張機能を使い、Chromeのデフォルトのフォントを変更して、
Stylusを使用して、すべてのタグのフォントを変更します。
Stylusを使用した理由としては、同様の拡張機能Stylishが閲覧データを利用していたことで問題になったからです。
##導入方法
まずはこちらの[リンク][Link]からAdvanced Font Settingsという拡張機能をインストールしてください。
その後、拡張機能のオプションから、フォントを選んで下さい。
[Link]:https://chrome.google.com/webstore/detail/advanced-font-settings/caclkomlalccbpcdllchkeecicepbmbm
その次に、この[リンク][Link2]からSylusという拡張機能をインストールしてください。
そして、その後オプションから新規スタイルを作成から次のスクリプト(のような何か)をコピペしてください。
Noto Sans CJKのところは適宜変更してください。

:::note warn
警告
Chromeの"chrome://settings/fonts"からそのフォントが設定できるか確かめてください。
WindowsにインストールされていてもChromeで使えない可能性があります。
:::

```css:font.css
*{ 
    font-family: 'Noto Sans CJK JP Medium' ;
}
```
[Link2]:https://chrome.google.com/webstore/detail/stylus/clngdbkpkpeebahjckkjfobafhncgmne

##あとがき
Chromeの通常の設定フォントを変更しても反映されなかったので、この解決法にたどりつくまでにめっちゃ時間かかりました。
dockerでの環境構築時に出る、PHP Fatal error:  require(): Failed opening required '/var/www/public/../vendor/autoload.php' の解決方法

皆様こんにちは。
本日新しい会社に転職したのですが、その際に開発環境を構築していて、沼にはまったので、その時のことを備忘録として残そうと思います。

## エラーログ

```
[error] 31#31: *3 FastCGI sent in stderr:
PHP message: PHP Fatal error:  require(): Failed opening required'/var/www/public/../vendor/autoload.php' 
```

## エラー文の意味
vender/autoload.phpを開こうとしたが、失敗した。

## 対処方法

```
docker-compose exec php bash # php用のコンテナを用意していたため

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '906a84df04cea2aa72f40b5f787e49f22d4c2f19492ac310e8cba5b96ac8b64115ac402c8cd292b8a03482574915d1a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

sudo mv composer.phar /usr/local/bin/composer

composer -V

composer install
```

### 解説

まず、phpのコンテナ内のbashに入る。
その後、https://getcomposer.org/download/ に従って、composerをインストールする。
インストール後、composerにパスを通し、 `composer -V`でcomposerがインストールされていることを確認する。
最後に、`composer install`を行って、他のライブラリをインストールする。

## 最後に

用意されていたDockerfileだと、composerをインストールするコマンドが書いてあったのに、何故かcomposerがインストールされなかった。。
他の人も同様のDockerfileでうまくいっていたようなので、原因は不明。（もしわかったらこの記事に追記します。）
セキュリティ用語

## 疎通

通信が正常に通じるか

## ペネトレーションテスト

kalilinux等を用いたホストやネットワークへの侵入を行うために攻撃するテスト

## PCIDSS

クレジット会社が共同で策定したセキュリティ規格

## CSRFトークン

CSRF攻撃を防ぐために利用されるトークン文字列

## header body

httpリクエストのヘッダー部分とボディー部分

## ペイロード

通信内容のボディ部分？

## origin

同一生成元の単位？
Bitnami版Redashで502 Proxy Errorが発生したら

# 環境
- GCP（Compute Engine）
- 「Re:dash packaged by Bitnami」を使用してRedashのインスタンスを運用中
- Redash 8.0.0

# 事象
とあるクエリの結果をExcelダウンロードしようとすると、「502 Proxy Error」が発生した。
行数は15万行で、条件を絞って取得行数を減らした場合はダウンロードできる。

# 結論
Apache（Webサーバ）にきたものをGunicorn（アプリケーションサーバ）に流して処理する構成になっていたため、ApacheとGunicornのTimeoutを伸ばすことでダウンロードできるようになった。

# 対応手順
Gunicornは設定ファイルを見つけられなかったため、起動スクリプトにタイムアウト設定を仕込みました。
もっと良いやり方があればコメントで教えていただけると助かります。

## Gunicorn
スクリプトの先頭にあるGunicorn起動用のコマンドに引数でタイムアウトを設定します。

```sh:/opt/bitnami/apps/redash/scripts/ctl_redash_gunicorn.sh(編集前)
GUNICORN_START="/opt/bitnami/apps/redash/htdocs/bin/run gunicorn -b 127.0.0.1:5000 --pid /opt/bitnami/apps/redash/logs/redash_gunicorn.pid --log-file /opt/bitnami/apps/redash/logs/redash_gunicorn.log --name redash -w 4 --max-requests 1000 redash.wsgi:app"
```
↓
```sh:/opt/bitnami/apps/redash/scripts/ctl_redash_gunicorn.sh(編集後)
GUNICORN_START="/opt/bitnami/apps/redash/htdocs/bin/run gunicorn -b 127.0.0.1:5000 -t 300 --pid /opt/bitnami/apps/redash/logs/redash_gunicorn.pid --log-file /opt/bitnami/apps/redash/logs/redash_gunicorn.log --name redash -w 4 --max-requests 1000 redash.wsgi:app"
```

## Apache
既存の設定にはなかったので、適当なところにTimeoutを置きます。

```conf:/opt/bitnami/apache2/conf/httpd.conf(編集後)
# Timeout
Timeout 300
```

VMを再起動して完了です。

# おまけ

Apacheのログは`/opt/bitnami/apache2/logs/error_log`
Gunicornのログは`/opt/bitnami/apps/redash/logs/redash_gunicorn.log`
で確認できます。
scikit-learnのロジスティック回帰の正則化項ハマった話

　完全に2値分類できる問題があったとする。scikit-learn のロジスティック回帰を使って分類する場合、scikit-learn のロジスティック回帰では**デフォルトでL2ノルム**が加えられている。この正則化項により、うまく分類できない場合があった。
## 解決策
　そういうときは以下のように```penalty=none```を追加して正則化項を削除するとうまくいった。
```lr = LogisticRegression(penalty = "none")```

　理論的には完全分類できる問題で正則化項を入れないと、係数が発散するのでL2やL1の罰則項を追加しておくべき。
　私が試した問題ではなぜか正則化項を削除したらうまくいったという話。
# 参考
https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html
Ubuntu Software(Ubuntuソフトウェアセンター)の installed タブが読み込まれないときの対処

個人的メモ

# 背景

Ubuntu Software（日本語名: Ubuntuソフトウェアセンター）のInstalledタブが待てど暮せど開けなかったので、以下の操作をしたころ開くことができた。
どれが効いたのかは切り分けていない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218242/c993e760-936d-56a7-9748-581a5f73a8e0.png)

自分の他端末でも起きたことがある気がするので、備忘録として投稿

# 環境

- Ubuntu 20.04.3 (64bit)
- HW:  NEC VersaPro VC-7
- CPU: Intel Core i3-10110Y
- RAM: 4GB
- SSD: 256GB

# やったこと

キャッシュの削除

``` shell
pkill gnome-software
sudo rm -r /var/cache/app-info
sudo appstreamcli refresh --force --verbose
```

この段階では動かない。


```  shell
# 
killall snap-store
```
このコマンドで開きっぱなしだったUbuntu Softwareが終了し、次に起動したときには自動的にネットからカタログをDLした上で動いた

# 感想

askUbuntuの[コメント](https://askubuntu.com/a/1342025)によると、

> This is due to a conflict in the Software Center

らしい。手元では端末再起動してもだめだったが…

また、[先人](https://yutarine.blogspot.com/2020/08/ubuntu20.04-snap-store-ubutnu-store.html)によると、Ubuntu Softwareには「snap-store」と「gnome-software」の2種類が存在するらしい。なんでやねん。

<br> <br>
とりあえず動いたのでヨシ
 <br>

## 参考
- [Software Center Not Showing Installed Apps (ask Ubuntu)](https://askubuntu.com/questions/1230644/software-center-not-showing-installed-apps)
- [Software Center Not Showing Installed Apps]()
[python]オブジェクト指向で記述するgithubのURLのあれこれを取得

訳あってpythonを個人的に書いているのだが、最近の意識として、クソコードならクソコードらしく、ちゃんとオブジェクト指向で書いてみようじゃんかよ！ということで改めて書き直してみた。
ただ、この書き方が正しいのかどうかは分からん。

やっていることとしては、アカウント名とリポジトリ名を取得する事。
リポジトリ名については.gitが含まれる場合があるので、それについての判定も書いてみた。


```py:main.py
from array import array

url = "https://github.com/TatsuyaMaeta/tama-camp-univ-janken.git"

class SplitUrl:
    def __init__(self,url):
        self.url = url
        # self.lastArrIndex = len(self.url.split(self))-1
        self.slsh = "/"
        self.dot = "."
        self.repositoryName = ""
        self.dotIndex = 0
        self.arrIndex = 0
        self.arrayURL = []
        self.dotflg = False
        self.tmpStr = ""
        
    def split(self):
        self.arrayURL = self.url.split(self.slsh)
        # 配列を返す
        return self.arrayURL
    
    def getArrIndex(self):
        self.arrayURL = self.url.split(self.slsh)
        self.arrIndex = len(self.arrayURL)
        # 数値を返す
        return self.arrIndex
    
    def checkIncludeDot(self):
        self.arrayURL = self.split()
        self.arrIndex = self.getArrIndex()
        self.dotIndex = self.arrayURL[self.arrIndex - 1].find(self.dot)
        if self.dotIndex > -1:
            print(f'ドットの位置は{self.dotIndex}文字目です')
            self.dotflg = True
            return self.dotflg
        else:
            return self.dotflg
        
    def getRepoName(self):
        self.tmpStr = self.arrayURL[self.arrIndex -1]
        self.repositoryName = self.tmpStr[0:self.dotIndex]
        return self.repositoryName
    
gitRepo = SplitUrl(url)

print(gitRepo.split())
print(gitRepo.getArrIndex())
print(gitRepo.checkIncludeDot())
print(gitRepo.dotIndex)
print(gitRepo.getRepoName())
```


プリント結果

```terminal:ターミナル表示結果
['https:', '', 'github.com', 'TatsuyaMaeta', 'tama-camp-univ-janken.git']
5
ドットの位置は21文字目です
True
21
tama-camp-univ-janken
```

書き方についてよく分からず書いているので、オブジェクト指向はこう書いたらもっと良くなるよ！とかあれば是非教えてもらいたいです。

以上
解決方法_Webpacker::Manifest::MissingEntryError

# 初めに
原因は細かに追求していません。（調べたけどわかりませんでした）
あくまでも解決方法をまとめています。

# エラー内容
Railsアプリを新規作成し、諸々初期設定を終え、いざ`bin/rails s`してブラウザで表示すると、下記のエラー文が表示。
エラー内容は、１.You〜に書いてある通り,webpackerの設定がコンパイルしないようになっていることが原因のよう。

`javascript_pack_tag`がレイズされてるのはなぜなのか、、。
webpackerでコンパイルしない設定になっているのに、JSをwebpackerでコンパイルする記述になっているから？

Webpacker::Manifest::MissingEntryError
Webpacker can't find application in /Users/"ユーザ名"/app/public/packs/manifest.json. 
Possible causes:
1. You want to set webpacker.yml value of compile to true for your environment unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to reflect updates.
3. You have misconfigured Webpacker's config/webpacker.yml file.
4. Your webpack configuration is not creating a manifest.
Your manifest contains:
{
}

```ruby
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
```

### 開発環境

- ruby 2.6.5
- rails 6.0.0


# 解決までの道筋

### 1. webpackerをインストールして、webpackerを用いたコンパイルを実行
ターミナルにて対象のRailsアプリのディレクトリで下記コマンドを実行

```
rails webpacker:install
rails webpacker:compile
```

しかし、解決せず。同様のエラーが発生。

### 2. Gemfileを書き換え

`gem 'webpacker', '~> 5.0’`　に書き換え

### 3. package.jsonに`"@rails/webpacker": "5.4.3"`を追記
    
```package.json
"dependencies": {
  略
  "@rails/webpacker": "5.4.3"
```

### 4. `yarn.lock`削除
`yarn install`する前に`yarn.lock`を削除。
削除せずに`yarn install`すると、先ほどの変更が反映されないため。
（`yarn.lock`を元に`yarn install`されてしまう。）

### 5. `yarn install` と `yarn add node-sass` を実行
3.で行った変更を反映させる。

### 6. 再度コンパイル実行

```
rails webpacker:install
rails webpacker:compile
```

### 7. 解決！

webpackerでコンパイルできるようになりました。

# 終わりに

本エラーは2回再現されたため、メモとして残す。
せっかくなのでなぜこのエラーが発生するのかまで追求したかったのですが、分からず。

以下調べた内容をまとめる。

Rails6はデフォルトの設定だとSprocketsとWebpackerを併用することにより、アセットファイルのコンパイルを行っている。WebpackerはJavaScriptファイル、Sprocketsはその他のアセット（CSSや画像など）のコンパイル。

今回のエラーはWebpackerでのコンパイルが動作していなかった。

# 参考記事
https://qiita.com/negisys/items/2bf88659f584fe45b686
https://qiita.com/hryau6/items/820d0b404325688574ba
AWSのチュートリアルでハマった話

## チュートリアルなのにハマる
AWSは一年ほど前に少しだけ勉強したことがあったので、簡単って言ってるlambdaなら楽勝でしょ？
から、数時間ハマったので備忘録として投稿

## 試したチュートリアル
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-s3-example.html

## テストでエラー
チュートリアル通りに進めて行って、「コンソールでテストする」の箇所でエラー。
公式のチュートリアルなんだから手順通りにやっていれば必ず上手くいくはずと思って、何度もチュートリアルを見直して初めからやったりしたがダメ
An error occurred (AccessDenied) when calling the GetObject operation: Access Denied
![スクリーンショット 2022-02-14 20.16.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2528516/b5209839-9305-c745-974d-859e251864e5.png)

## 解決した方法
諦めてエラーメッセージなどで調べたらIAMの設定がダメっぽいので、試しにlambdaに設定しているIAMロールにAmazonS3ReadOnlyAccessを追加してみたら普通に成功
よくよくエラーメッセージを読んでみれば、GetObjectの呼び出しでエラーって書いてある…

その後、AmazonS3ReadOnlyAccessをロールから削除して、IAMポリシーの"GetObject"の部分を"Get*"に変更してみたら普通に動きました。

## 反省
様々にサービスが追加され続けているので、チュートリアル記載時点から変更があった影響なのかな？と思いました。
教訓として、エラーメッセージをきちんと読んで自分で考えること！
Laravelで複数のDBを繋ぐ時のTips

# 結論
ちょっとはサポートしていますが、```migrate:fresh```と```RefreshDatabase```が対応してないのが大分痛いです😣

# DockerでMySQLの複数のデータベースの立ち上げ方が分からない
Laravel関係ないですけど、まずここからが大変なんですよね。結論からいうとdocker-compose.ymlでもDB1個しか対応していないため、コンテナ作成時に自動実行されるSQLファイルを設定して、地道にDB作成やらユーザー設定のSQLを書くというアプローチがベターのようです。変に分散するとアレなんで。

```yml
  db:
    image: mysql:8.0.27
    container_name: db
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
      # 複数のDBを立ち上げたいがdocker-composeのオプションで対応してないので、
      # コンテナ作成時に自動で実行されるSQLファイル内で設定する
      - ./docker/db/sql:/docker-entrypoint-initdb.d
```

# migrate:freshで片方のDBしか消えてない
片方のDBしかマイグレーションされないのですが**エラーとかは出ずに成功したかのような表記になります。** なんでや！😫
結論から言うと[今のところ対応していません。](https://github.com/laravel/framework/issues/21009)```php artisan db:wipe --database 【接続名】```で1個ずつ消してからmigrateしましょう。

# マイグレーションやEroquentで毎回::connection(【DB名】)を書くのが辛い
これについては[公式で対処法が用意されています。](https://readouble.com/laravel/8.x/ja/migrations.html)マイグレーションのクラスに下記のようにconnectionプロパティを設定することで切り替えることができます。

```php
/**
 * マイグレーションが使用するデータベース接続
 *
 * @var string
 */
protected $connection = '【DB接続名】';

/**
 * マイグレーションの実行
 *
 * @return void
 */
public function up()
{
    //
}
```

# 自動テストでRefreshDatabaseが効かない
RefreshDatabaseは内部でmigrate:freshを使っているので効きません。ここは流石に[自分でArtisanコマンド作る](https://readouble.com/laravel/8.x/ja/artisan.html)して呼び出すしかないですね……。

# 🙏Laravel公式ドキュメント翻訳者への支援のお願い
Laravelの公式ドキュメントの日本語版である[ReaDouble.com](https://readouble.com/)を運営されている川瀬裕久氏が、広告収入の低下と持病の悪化のため、翻訳プロジェクトを継続することが困難になり、[GitHub sponsorsを募集しています。](https://github.com/sponsors/HiroKws) 日本のLaravelユーザーでここを見たことない人はいないと思うので、もし恩義を感じているならば是非支援のほどお願いします。私も支援させていただいております

# 参考
- [【Docker】MySQLで複数database環境を構築する - Qiita](https://qiita.com/piggydev/items/2096258dc45a6bbe2a19)
- [[Laravel]Laravelで別々のDB（MySQL）に接続させる方法 - Qiita](https://qiita.com/qiita-kurara/items/2e3efb4ccbb2489b05c3)
- [複数の DB コネクションを使ってる場合に RefreshDatabase が失敗する - Qiita](https://qiita.com/yuuAn/items/e61d7fc887e16fe81ee8)
- [Laravel 7.x Multiple Database Connections, Migrations, Relationships & Querying | StackCoder](https://stackcoder.in/posts/laravel-7x-multiple-database-connections-migrations-relationships-querying)
【VRChat】Udonって何？

## 更新情報
2025年06月21日: UdonSharpに関する情報など、一部情報を更新
2023年09月18日: UdonSharp 1.x系への言及など、一部情報を更新
2022年02月14日: 投稿

## 大雑把に言うと
VRChatのSDK3で追加された、ギミック作成のための仕組みです。
SDK3でのワールドギミックの殆どはUdonで作られていると思って問題ないでしょう。

## もう少し詳しく
Udonはプログラミング言語で、作った処理をGameObjectに付けて動作させることが出来ます。
有名な作成方法は幾つかあり、

- UdonGraph
SDK3に備え付けの方法です。
任天堂の「はじめてゲームプログラミング」みたいな感じで、処理・データ同士を線で繋いで作ります。
こちらで作ってみたい方は、私の入門記事が参考になるかもしれません。サンプルはBoothにも無料で配布しています。
[【VRChat】Udon Graph 入門【SDK3】](https://qiita.com/Sayamame/items/c36a1a87d4189d51099c)

- UdonSharp
~~別途アセットを導入することで使える方法です。(SDK3.4.0からはSDK側に1.x系が統合されるという話があります)~~
SDK 3.4.0から標準で同梱されている方法です。
テキストベースでUdonの処理が書けるため、プログラミングに馴染みのある方はこちらを好む傾向にあると思います。
VCC以前で利用されていたのは0.x系、VCC/ALCOM経由で導入可能なもの(及びSDKに同梱されているもの)は1.x系であり、互換性があまり無いため注意が必要です。(自動変換は付いていますが、上手く変換されずに壊れることがあります)
VCC/ALCOMから導入出来るSDKをご利用の場合、旧バージョン(0.x系)のUdonSharpを導入する必要はありません。(むしろ、そうするとエラーが出てしまうため、導入しないでください。)
旧リンク: https://github.com/MerlinVR/UdonSharp/
新リンク: https://github.com/vrchat-community/UdonSharp/

などがあります。

## 更に詳しく
「Udon」と一口に言っても、文脈によって意味合いが少し異なります。
そのため、ここまでに出した単語についても改めて記述したいと思います。

### "Udon"とUdon VMについて
一般に"Udon"というと"SDK3でのワールドギミック作成手段"のことを指しますが、厳密には、UdonはUdonAssembly(後述)から生成されたバイトコードを実行するVMであり、文脈によってはこちらを指す場合があります。
UdonGraphもUdonSharpも、実際には全てUdonAssemblyに変換(コンパイル)され、実行されています。
そのため、UdonAssemblyやVM用のバイトコードに変換する機構(Unityエディタ拡張)を作成することで、自由に言語を作ることが出来ます。
実際に、UdonSharp以外にもUdonを扱う方法を有志が作成しており、例えば[CyanTrigger](https://cyanlaser.booth.pm/items/3194594)などがあります。(ただし、CyanTriggerは将来的な開発終了が宣言されています。)

なお、私が知っているUdon VMに関する重要な仕様として、UdonGraphでは変数512個分しかヒープ領域が用意されていない、というものがあります。
(UdonSharpやCyanTriggerなどではヒープ領域の大きさをコンパイル時に決定しているようです。)
他にも色々あるかもしれません。

### UdonAssemblyについて
UdonAssemblyはアセンブリ言語のようなプログラミング言語です。
Udon VMで実行するためのバイトコードに対応しているため、自作コンパイラはバイトコードを直接生成せずにUdonAssemblyを中継することが出来ます。

### UdonGraphについて
UdonGraphは公式が提供するノード型のビジュアルプログラミング言語です。
VRChatが用意したAPIやUnity/C#のメソッド等をノードで扱います。
複雑なものを作ると、ノードを置くたびに数秒待たされることになったりするため、本格的なものを作るにはあまり向いていない面もあります。

### UdonSharpについて
UdonSharpはMerlin氏が作成した、C#風に記述できるプログラミング言語です。
Udonの仕様上、本来のC#ほど自由には記述出来ませんが、それでも非常に有用です。
複雑なものを作るための方法として選ぶ人は多いです。
【初心者memo】Git hubの基本操作

仕事ではbitbucketとsource treeeを使用していて（しかもだいたいコーディングチームのソースをクローン
して自分の環境で確認するくらいであまりプッシュすることはない）git hubは使用し始めてまだ1ヶ月くらいの初心者のメモです。

**開発環境**
gitは既にinstall済
Mac OS Monterey 12.1

**初めてプロジェクトをアップロードする時**
1.git hubのrepositoryタブを選択
2.＋マークのボタンで新規repositoryを作成
3.repositoryの名前を入力してcreate
4.
```
$ cd portfolio（アップロードしたいディレクトリ名）
$ git init

$ git add .
$ git commit -m "Initial Commit（コメント。最初のcommitとわかるようにInitial Commitと入力）"

$ git remote add origin https://github.com/（3で作成したrepositoryのURL）
$ git push -u origin master
```

**すでにリポジトリをgit上に作っていて、ソースを更新したい時**
```
$ cd フォルダ名
$ git add .
$ git commit -m ""
$ git push
```

**アクセストークンが必要な時**
tokenを以前取得してからまた期限が切れてしまってエラー。再度取得を行って、
```
$ git remote add origin https://<トークン>@github.com/<ユーザ>/<リポジトリ>.git
```
で解決。

**参考にした記事**
https://qiita.com/atsymd/items/a1ff5a496b78f47ce80e
https://qiita.com/devzip8/items/28ac253ea295ad6c2b73
とてもわかりやすかったです。ありがとうございます。

tokenの取得方法は公式がわかりやすかったです。
https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token
RaspberryPi4BにGoを入れる。

#概要
ちょっとしたツールを使おうと思ったらGoで書かれてたからGoを入れようとしてハマった話。

#手順
好きなところに```wget https://golang.org/dl/go1.17.7.linux-armv6l.tar.gz```でダウンロード。
```sudo tar -C /usr/local -xzf go1.10.1.linux-armv6l.tar.gz```で展開。今回は```/usr/local```を指定。
```~/.bashrc```に```export PATH=$PATH:/usr/local/go/bin```を追記してパスを通す。
```source ~/.bashrc```で適用。

#ところが…
```go version```が通らず```no such file or directory```が返る…。
あちこち調べるもののピンとこない。
なんとなく```uname -m```を打ってみると```aarch64```と返ってきた。ここで気がついた…参考ページが結構古くてターゲットも**RaspberryPi**としか書いていないことに。
試しにarmv6l向けではなくarm64向けをインストールしてみたら…
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548777/d0dab623-ab18-3079-7e65-e19a37638997.png)
通った…。

armややこしいな。
git管理したJenkinsfile内から同じリポジトリの別のスクリプトを呼びたい

## 事象

Jenkinsfile内に以下記述を行い、実行すると、
`hoge.sh: No such file or directory`のエラーが出てしまう。

```groovy
sh "./scripte/hoge.sh"
```

## 結論
Jenkinsfile内で`git clone`を行う

## 説明
Jenkinsから「Pipeline script from SCM」でgitリポジトリとScript Pathを設定していたのですが、それはJeninsfileを実行するため。
パイプラインの中でgit cloneを再度行いその内部のスクリプトを実行しにいく必要がありました。

Snippet GeneratorからGenerate Groovyをすると手軽にスクリプトが生成できます。