OmniAICreator/Qiita-1.07M huggingface dataset:
ノーコードが流行りだして少し心配に思うこと

「[ノーコードシフト プログラミングを使わない開発へ](https://www.google.co.jp/books/edition/%E3%83%8E%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B7%E3%83%95%E3%83%88_%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F/zww6EAAAQBAJ)」を読みました。
メリデメ、事例やツールの紹介などもわかりやすくまとめられていて読みやすかったです。
ありがとうございました。

ノーコード開発が大流行するとエンジニアの仕事ってなくなるのかなーなんて思いましたが当分はそんなことにはならなそうですね、当分は。

メリットがたくさんある一方、色々と心配はよぎりました。（そんなことを考える時点で遅れてるのかな、、）
下記、思ったことなど簡単にまとめてみました。


# 概要

ノーコードツールはその名の通りプログラミングすることなくアプリやウェブサイトなどを作ることができる。
大別すると、ウェブデザイン系、データ管理系、タスク自動化系、オールインワン系の4種類あり、目的に応じて正しく選定することで最大限のパフォーマンスを生むことができる。


### メリット

- エンジニア、デザイナーいらずでwebサイトやアプリが作れる
- 誰でも簡単
- 期間、予算を抑えスピーディに開発できる


### デメリット

- できることが限られる
- ノーコードツールを提供しているサービス側のコンディションに左右される


### 注意点

- 要件に応じてノーコードツールを正しく選定する必要がある
- クライアント含め案件に係る全ての人が選定したノーコードツールでどの範囲までできるかを正しく理解する必要がある


### 良い事例
- とある市役所がコロナ過における特別給付金申請の手続きをわずかサイボウズ株式会社のキントーンを用いての担当者一週間足らずで構築。サイボウズのアドバイスを受けながらというもののほとんど一人で構築したそうです。

- 某スポーツウェアブランドの日本総代理店がYappliを用いてアプリを制作。アプリ会員数も伸びECサイトへのECサイトへの流入も向上しているとのこと。Yappliの支援を受けながら開発し、運用にいたってはIT未経験の社員が行っているそうです。

などなど


### ノーコードツールの作業担当「ノーコーダー」の必要性

ノーコード開発運用の専門「ノーコーダー」という職種が増えるのでは、と書かれています。
上記の例のように、エンジニアやデザイナーを職務としている人材がなるわけではなく、各企業のIT事務担当者がノーコーダーを担っているケースが多いようです。


# 所感

## ノーコード開発におけるエンジニア、デザイナーの役割ってどの辺だろう

エンジニアにとって、今までめちゃくちゃ工数がかかっていた部分のみノーコードで簡単に作れる、みたいなことになると嬉しいですね。捗りそうです。

しかしオールインワン系でフルノーコード開発になるどエンジニアの出番は少ないのかもしれません。というかいらないですよね、そのためのノーコードツール。

じゃあ誰がやるのか、ということでノーコーダーが必要なんですね。

ノーコーダーが存在する場合、ノーコード開発においてエンジニア、デザイナーの力が必要になるのは、

**エンジニアの場合**
サイト全体の設計や用語解説など。
また、ツールによっては 外部 APIを 連携できるものもあるようなので、その場合はエンジニアの知見が必要になるかも。

**デザイナーの場合**
キービジュアルなど部分的なデザイン作成や全体のレイアウト相談など。

など、実際はこのような感じになるのかなと思いました。


## 心配事
### ノーコード開発ばかりになると

もし、もしノーコード開発案件が爆増してエンジニアやデザイナーのメイン業務がノーコード開発となった場合、、、モチベーション続くかな。
自分だったら続かなそう、。

### わからないところ、めんどくさいところだけエンジニアに振られるのでは？？
恐怖！

### ノーコード開発されたwebサイトやアプリの改修

ツールごとにできることが限られるという大前提、それを超える改修は不可能です。
それでも要求される場合はすべて作り直しになる可能性があります。あるいは部分的に外だし？
とにかくwordpressの既存テンプレート改修のようなパワープレイは出来ないということ。


### ノーコードコンサルタントの台頭

本書でもノーコードコンサルタントが台頭する未来が予想されていましたが、これは大いにあり得ると感じました。ちゃんとそれぞれのツールのメリデメを理解されている方であれば問題ないと思いますが、なんかノーコードって言いたいだけだよね、みたいな人もたくさん出現しそうなので、その辺は要注意かと思います、。
ツール選定を間違うと大事故になりかねないので関わる人間も慎重に選定する必要があると思います。

# まとめ・エンジニアとして感じたこと


なんとなく、規模は違うかも知りませんが、数年前に「レスポンシブweb」が流行りだした時を思い出します。

みなさん最初はこう思ってませんでしたか？
どうやら「レスポンシブ」にするとPCとスマホが同時に開発できて簡単！工数も削減できる！

実態は違います。レスポンシブめちゃくちゃ時間かかります。
デザインによってはPC、スマホ別々に作るより工数かかることがあります。

このように本質がちゃんと理解されず「レスポンシブ便利！」だけが一人歩きした結果、超絶短納期レスポンシブ案件が乱発しました。
多くのエンジニアの睡眠時間が削られたことでしょう。

ノーコード開発においても同様のことが懸念されます。
ノーコード開発の、誰でも！早い！安い！うまい！はとても大きなメリットだと思います。
ただ「できることが限られる」ことを絶対に忘れてはいけません。
ここを忘れるとレスポンシブ流行の二の舞です。

本書にも書かれていますが、とにかく正しいツール選定とクライアント & 制作側の理解が大切。

世の中がレスポンシブ流行の二の舞になりませんように...🙏
Rails ルーティングのrootについて

# ルーティングとは
ルーティングはwebサービスで言うとこのURLです。
ルーティングは***routes.rbに記載***できます。
ここで***どう処理してどう動くかを記載***します。

下の参考資料を参考に説明していきます。

# ルーティングの種類

主に代表的なものです。他にもあるので調べてみてください。

|種類|例|
|--|--|
|HTTPレスポンス|GET POST PUT PATCH DElETEなど|
|root|初にユーザーがアプリケーションにアクセスしたときに表示されるページを指定できます。|

***今回はrootをメインで説明***していきます。

❗️注意点
***同じ条件（HTTPリクエストとURL）のルーティングがあった場合***
***上の条件を優先的に処理をします。***

# ルーティングのroot

⚫︎rootとは

・特定のコントローラー内アクションへ割り当てる。
アクションはindex show create update edit new destroy

・***アプリを実行するときの軸となる場所でrootで指定したところを
URLの中心として開発していきます。***

ex

```routes.rb
root to: "home#index"
```
これは***homeコントローラーのindexメソッド中心のURLで処理***をしていくことになります。
localhost:3000でサーバーを起動すると

```index.html.erb
<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p>

```
のようにhomeコントローラーのindexアクションが呼び出されます。
homeコントローラーのindexアクションを中心としてして開発をしていきます。

詳しくは下の資料を参考にしてください。



# 参考資料

https://qiita.com/Hashimoto-Noriaki/items/78bc8191b8d6fb159ca8

https://web-camp.io/magazine/archives/16815

https://techacademy.jp/magazine/7131
Swift - fullScreenで画面遷移三つの方法

#背景
デフォルトで画面が遷移する時、新画面は旧画面に重ねて出てきます、↓のように。
でも、時々フルで画面を出したい時もあるでしょう。以下フルで画面を出す方法を紹介します。
![截圖 2021-09-02 21.37.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1326861/ba5df0cf-9d54-28da-2e5e-fb5a8e6d6082.png)
#その一：present
以下のコードを入れて、画面一のUIボタンをクリックすれば、フルで画面を出せます。

```simple.swift
    //画面一に入れたボタンのクリックイベント
    @IBAction func button(_ sender: UIButton) {
        let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController2") as! ViewController2
        //この行がポイント
        vc.modalPresentationStyle = .fullScreen
        present(vc, animated: true, completion: nil)
    }
```
#その二：segue
以下のコードを入れて、画面一のUIボタンをクリックすれば、フルで画面を出せます。


```simple.swift
    //画面一に入れたボタンのクリックイベント
    @IBAction func button(_ sender: UIButton) {
        performSegue(withIdentifier: "segue", sender: nil)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "segue" {
            if let vc = segue.destination as? ViewController2 {
                //この行がポイント
                vc.modalPresentationStyle = .fullScreen
            }
        }
    }
```
#其の三：Storyboard
だしたい画面のStoryboardのViewControllerに`Presentaion`項目があります。それを`Full Screen`に変更すれば、フルで画面を出せます。
![截圖 2021-09-02 22.12.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1326861/f1f148b2-850e-691e-70bf-026fcf706f36.png)
#終わりに
他にsegueのID、storyboardIDの設定、viewController2ファイルの作成なども必要ですが、ここでは割愛いたします。
SpringbootでbootRunを実行したときにエラーが出た[Gradle]

GradleでSpring bootアプリケーションを実装しようとしたときに躓いたエラーがあったので、忘備録として書いておく。

プロジェクトを作成後、画像にあるbootRunを実行したらエラーが発生。
(IDEはIntelliJ IDEA)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935552/f0a51481-9499-b7c6-b1d4-1193c62746d7.png)


```エラー文
Execution failed for task ':bootRun'.
> Process 'command 'C:\Users\user.name\.jdks\openjdk-16.0.2\bin\java.exe'' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output. Run with --scan to get full insights.

```

#　原因

bootRun実行時に別のJavaファイルが実行中だったためエラーが発生したとのこと。

# 対策

Windowsの場合、タスクマネージャーを開いて実行中のJavaファイルを停止させてから再度bootRunを実行する。(この時はJava.exeというファイルが実行中だったのでこちらを停止させた。)


とりあえず、忘備録として書いておきました。
VR空間上で使えるキーボードを作ってみる

###１．キーボードを作るきっかけ
VR空間上でのキーボードは遠くに表示させての操作がほとんどだが、空間上で自分の手入力（ハンドトラッキング）でやったらどうなるかをテストするために作った。
A～Z入力のとても簡素なキーボードです。

###２．開発環境

- Unity2020.3.4f1
- OculusIntegration

※OculusIntegrationの手順は紹介しませんが、以下の項目にあるEnable Physics Capsulesにはチェックを入れておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/bead1e9d-b1a6-220f-ca37-5622ceed2b91.png)


###３．どういった仕様で作るか

- VR空間上で入力したものはInputFieldに反映される。
- Inspectorを弄るのは、タイトル変更と一部のドラッグ&ドロップのみ


####４．ヒエラキー上に追加するもの

- InputField(TextMeshProでない場合、後に出るスクリプトを少々変更する必要あり)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/d3b4da89-a893-f8b5-fa5e-e9e4e2e299ad.png)

- VR空間上に配置するため、CanvasのRenderModeをWorldSpaceにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/f02f7590-d847-fde5-3e7d-15d0d7bf2d59.png)

- 3DObjectのテキストをA～Zまで作成する（スクリプトでテキストを変更するので、GameObjectNameの変更だけしてください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/7fe2b91d-b909-262e-dc8f-6281978ac71c.png)

###５．スクリプト

~~~C#
using UnityEngine;
using UnityEngine.UI;
using TMPro;

//このコードを入れとけばアタッチした時にAddComponentされる
[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(BoxCollider))]

public class QiitaKeyBoard : MonoBehaviour
{
    //InputField(TextMeshProを使用)を定義
    [SerializeField] TMP_InputField _InputField;


    //3DTextMeshProを定義
    TextMeshPro MyNameText;

    Rigidbody rb;

    BoxCollider bc;

    //自分のゲームオブジェクト名を取得する変数を設定
    string MyGameObjectName;

    // Start is called before the first frame update
    void Start()
    {
        //自分のゲームオブジェクト名を取得
        MyGameObjectName = gameObject.name;

        //自分のゲームオブジェクト名を3DTextに反映
        MyNameText = GetComponent<TextMeshPro>();
        MyNameText.text = MyGameObjectName;

        ///OnTriggerEnterを動かす為の設定
        
         
        //3DTextが落下しないようにする
        rb = GetComponent<Rigidbody>();
        rb.useGravity = false;

        //BoxColliderをTrueにするための設定
        bc = GetComponent<BoxCollider>();
        bc.isTrigger = true;    
    }

    //3DTextに手が触れたらInputFieldに反映される
    private void OnTriggerEnter(Collider other)
    {
        _InputField.text += MyGameObjectName;
    }
}
~~~

完成したスクリプトはA～Zすべてにアタッチをしてスクリプトの変数InputFieldに、ヒエラキー上にあるInputFieldを入れましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/f4d17e30-c3b2-7447-1384-f8ec5910213b.png)

A～Zを全て選択してから行うと一括で入れられます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/8fc17e7c-0aed-dc95-fd2d-589663bab261.png)

3DTextをハンドトラッキングで入力できるように配置する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/9366e1d4-ce66-73bd-c466-dce1a6d8fbc7.png)


###６．実際の動き

![qiitakeyboard.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/418d0b96-38f4-5f3c-c7e9-157363eb2c49.gif)



###７．感想

ハンドトラッキングで文字入力できるのは便利かと思っていたが実際のところそうではなかった、その要因を挙げると


- 人差し指で選んだ場合、他の指が別の文字を誤タッチする
- ハンドトラッキングはカプセルコライダーがいくつもあるので、この仕様だと複数回入力を受けてしまう。
- 空間上での操作なので、子供と大人とでは、やりやすさが異なる


これを回避する方法は、コライダー付きの細いオブジェクトを持ってのキーボード操作が一番手っ取り早いです。
連続入力は入力受付後コンマ数秒間コライダーをOFFにする等、色々な方法で回避が可能です。
【Rails】 Cannot assign to read only property 'exports' 【webpacker】

# 問題
RailsでとあるNodeモジュールを入れたらブラウザ上で
>Cannot assign to read only property 'exports'

っていうエラーが出た。調べると"module.exportsとimportを同時に使うとエラーになるぞ"という情報が出てくるのだが、別にそういうわけではない。

# 解決策
色々調べてるとこんな情報が出てきた。

> [I suspect @rails/webpacker v6 (not yet released) will fix this issue, because it drops the "nodeModules" loader completely. See changelog](https://github.com/apostrophecms/sanitize-html/issues/420)

実際にやってみたところ確かに出なくなった。

# 結論
原因はよくわからないがnodeModulesローダーがnode_moduls/以下をトランスパイルしてるせいでたまに出るエラーらしい。上の通りWebpacker 6からはデフォルトで削除されている。ビルドも軽くなるし一石二鳥。

```config/webpack/environment.js
const { environment } = require('@rails/webpacker')

environment.loaders.delete('nodeModules')
```
jQueryでAjax通信時サーバで200を返してもdoneが実行されない

# 概要
jQueryで下記のようにAjax通信をしていたときに、
サーバ側はステータスOKを返していても成功時のコールバック関数（done）
が実行されないという問題が起こったので備忘録として記載。

```Js
$.ajax({
  type: "POST",
  url: "APIのURL",
  dataType: "json",
  data: { 
    パラメータ... 
  }
})
.done(function () {
  alert("OK");
})
.fail(function () {
  alert("NG");
});
```

# TLDR
ajaxオプションのTypeにjsonを指定してるとレスポンスが存在している & 厳格なJSONであるかチェックする。
空レスポンスを返していたのでエラーとなりfailで処理されていた。
Typeをtextにして空文字列として処理するようにした。

# 詳細
$.ajaxのオプションであるtypeのリファレンスを見ると
オプションの意味及びJSON指定時は下記のように書いてある。

> dataType / string
サーバから返されるデータの型を指定します。
省略した場合は、jQueryがMIMEタイプなどを見ながら自動的に判別します。
指定可能な値は、次のようなものです。
：
"json": JSON形式のデータとして評価し、JavaScriptのオブジェクトに変換します。
"text": 通常の文字列。

APIのレスポンスは空だったのに対し、dataTypeはJSONを指定していたため、
空文字列をパースしようとしてエラー。
結果doneではなくfailが実行されていた。

対処として上記引用の`type:text`を指定して空文字列として扱うと、無事doneがコールされた。

# 参考
http://semooh.jp/jquery/api/ajax/jQuery.ajax/options/
https://trialanderror.jp/ajax-fail/
連番の任意のファイル関連のshellでの操作に関するメモ

##前書き
Linuxで連番ファイルについて取り扱ったのですが、思ったより手こずったのでメモを残しておこうと思いました。もっとわかりやすくてまどろっこしくない方法があったら知りたいです。

##番号がついている任意のファイルの中で中身のないものを判別し中身の存在するファイルだけをコピーする



```php

#!/bin/sh

echo "file名を入力してください" #これがターミナルに表示されます
read DATA #読み込んだ文字列

#何番から読むかの指定
echo "何番から読みます？"
read banme 


#何番まで読むかの指定
echo "何番まで読みます？"
read kaisuu

j=$kaisuu
k=$banme


#ここから本体
#今回XXXX_n.txt(nは任意の自然数)のようなものを読んでいるとします
for (( f=k; f<=j ;f++ ))
do
filename="$DATA"_"$f".txt

#桁数を合わせたかったのでファイル名を変更するために設定してあります。
PN=$(printf "%02d" $f)
Refilename="$DATA"_"$PN".txt

#このtest -s っていうのがファイル存在する？空じゃない？という判別に使われるそうです。
    if test -s "$filename"; then
       cp "$DATA"_"$f"_1.txt  ./cp/$Refilename
    fi
done
```

##抜けのある連番を詰めて保存する方法


こちらを参考にしました。
https://nullpopopo.blogcube.info/2015/06/renbanrename.html
ちょっと違うのは、任意のファイル名を読み込めるようにした点です。


```php
#!/bin/sh

#任意のFile名を読み込めます。
echo "file名を入力してください"
read DATA

for A in $(ls $DATA*.txt) ; do echo $A ; done | cat -n | awk -v data=$DATA '{print "mv",$2,data"_"$1".txt"}' | sh

```
gradleでbuildの前に自作のcustom taskを実行する

別に```build```に限る話ではないが説明のためにこれを使用する。

# 環境
* Gradle 7.2

# ソースコード

```groovy
plugins {
  id 'java'
}

task myTask {
  doLast {
    println 'myTask doLast'
  }
}
build.dependsOn myTask
```

上記にして実行すると以下の結果になる。

```groovy
>gradlew build

> Task :myTask
myTask doLast
```

taskの実行順としては以下のようになる。

```groovy
>gradlew build --dry-run
(省略)
:check SKIPPED
:myTask SKIPPED
:build SKIPPED
```

## ハマった点
```groovy
task myTask(dependsOn: build) {
  doLast {
    println 'myTask doLast'
  }
}
```

最初は上記のように書いていた。しかし、これは```gradlew build```しても```myTask```が実行されなくてかなり時間を浪費した。```myTask```には順序が設定されているが、```build```には設定されていない。だから```gradlew myTask```としたときは```build```（とこれに依存するタスク）→ ```myTask```となる。だいぶハマった。
push()の使い方(Javascript)

# 初めに
現在開発しているアプリでpushの使い方について基礎ではありますが、改めてなるほどな〜と思ったので記事書きました

# pushとは
push() メソッドは、<font color="red">配列の末尾</font>に 1 つ以上の要素を追加することができます。また戻り値として新しい配列の要素数を返します。

※MDN記事そのまま引用
参考サイト：https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/push

# 使い方
・用意した配列に1つの要素を追加したい場合

```javascript
let numbers = [1,2,3,4]
let addNumbers = 5
numbers.push(addNumbers)
console.log(numbers)

//[ 1, 2, 3, 4, 5 ]
```

・用意した配列に"配列"の中身データを追加したい場合

```javascript
let arr = [1,2,3,4]
let addArr = [5,6,7]
arr.push(...addArr)
console.log(arr)

//スプレッド構文(...配列)とすることで、配列→数字としてpushされる
//[1, 2, 3, 4,　　5, 6, 7]
```

・用意した配列に"配列"データを追加したい場合

```javascript
let arr2 = [1,2,3,4]
let addArr2 = [5,6,7]
arr2.push(addArr2)
console.log(arr2)

//arr2の中に配列が追加される
//この場合、arr2の4番目の要素は[5,6,7]となる
//[ 1, 2, 3, 4, [ 5, 6, 7 ] ]
```

・用意した多次元配列に"配列"のデータを追加したい場合

```javascript
let array = [[1,2],[3,4],[5,6]]
let addArray = [[7,8],[9,10]]
array.push(...addArray)
console.log(array)

//スプレッド構文(...2次元配列)とすることで、2次元配列→配列としてpushされる
//[ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ], [ 7, 8 ], [ 9, 10 ] ]
```

# 最後に
今回はpush（）の使い方について記事を記載しました。
誰かのご参考になれば幸いです。
Spring ValidationとModelAttributeメモ

#はじめに
Springbootでバリデーションを表示させようとしたのですが、原因がわからず詰まったため
解決方法を備忘録として記載します。

#環境
OS:macOS Big Sur 11.5.2
使用ブラウザ：GoogleChrome
Spring:2.5.4
Java：OpenJDK 11.0.2
DB:MySQL(AWSのRDS上で起動中)

#やりたいこと
更新フォームにおいて、バリデーションを出力する。
※入力フォームではバリデーションの出力はできていた。

```java:InquiryContoroller.java
 @GetMapping("/{id}")
    public String showUpdate(
    		InquiryForm inquiryForm,
        @PathVariable int id,
        Model model){
//省略
        model.addAttribute("inquiryForm", inquiryForm);
        List<Inquiry> list = inquiryService.getAll();
        model.addAttribute("list", list);
        model.addAttribute("inquiryId", id);
        model.addAttribute("title", "更新用フォーム");

        return "inquiry/update";
    }    
@PostMapping("/update")
        public String update(
            @ModelAttribute @Validated  InquiryForm inquiryForm,
            BindingResult result,
            @RequestParam("inquiryId") int inquiryId,
            Model model,
            RedirectAttributes redirectAttributes) {

            if (result.hasErrors()) {
                  model.addAttribute("InquiryForm", inquiryForm);
                model.addAttribute("inquiryId",inquiryId);
                model.addAttribute("title", "更新用フォーム");
                return "inquiry/update";
            }
           //省略
            } 
```

```html:update.html
<html xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">

<h1 th:text="${title}">更新用フォーム</h1>
<p th:if="${complete}" th:text="${complete}"></p>
    <form method="post" action="#" th:action="@{/inquiry/update}" th:object="${InquiryForm}">
//省略

```

#エラー内容
バリデーションが出力されない。

#調査
##①バリデーションについてGoogleで調べる
pom.xmlに下記の記述を追記するとの記載があったが、既に記載してあった。

```xml:pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
```
##②改めて、ソースコードに間違いがないか確認する。
コントローラー、htmlをともに確認したが誤った記載を見つけることができなかった。
##③テラテイルで質問する。（最終手段）
https://teratail.com/

#原因
＠ModelAttributeアノテーションは、名前を指定しない場合、先頭小文字のクラス名（inquiryForm）で名前解決されることを知らなかった事。
つまり、InquiryContoroller.javaのshowupdateメソッドとupdateメソッドにおいてmodel.addAttributeを利用する際に先頭文字を大文字（InquiryForm）にしている事が原因であった。

#解決策
InquiryContoroller.javaのshowupdateメソッドとupdateメソッド及びupdate.htmlを下記の通り小文字に修正した。

```java:InquiryContoroller.java
//省略
model.addAttribute("inquiryForm", inquiryForm);
```

```html:update.html
<html xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">

<h1 th:text="${title}">更新用フォーム</h1>
<p th:if="${complete}" th:text="${complete}"></p>
    <form method="post" action="#" th:action="@{/inquiry/update}" th:object="${inquiryForm}">
//省略

```

#参考

https://loglog.xyz/programming/spring_boot_starter_validation
【LPIC】LPIC-3 304を受ける方へ


# はじめに
2021年8月に１週間の勉強期間を設けて、LPIC 304 Virtualization & High Availability(ver 2.0)に合格したので、私の勉強方法についてまとめます。
私自身、他の方の合格体験記を励みに勉強していたので、これから受験する方の一つのサンプルになれば幸いです。

201,202に関してはこちらの記事にまとめています。

https://qiita.com/rocketboy555/items/6ebb62ada16031d9ef90

https://qiita.com/rocketboy555/items/71ce4a96444be9435d38

# LPIC-3 304とは
ここに訪れている方には説明不要かと思いますが、簡単に説明します。
LPICとは、Linux OSに関する知識を問うLPI認定資格です。
LPICにはLevel1〜Level3まであり、Level1から順に取得していく必要があります。
LPIC Level3はいくつかあるLevel3試験のうち、一つでも合格すれば認定となります。
LPIC-3 304は、Linuxにおける仮想化と高可用性に関する知識を問われる試験となっています。

# 筆者スペック
個人的に、合格体験記に筆者スペックが書いてあると自分と照らし合わせて考えられるので、なかなか好きな欄です。
このくらいのバックグラウンドの人が、このくらい勉強して合格したんだな、といった指標にもなると思うので、一つのサンプルとしてご査収ください。

|項目|内容|
|:---|:---|
|職業|地方の独立系SIer勤務4年目。|
|Linux経験|業務で一年ほど。Linuxベースシステムのミドルウェア開発。<br>Xen・KVM等の仮想化や可用性ソリューションの使用歴はないです。|
|他経験|制御系システム開発（C言語）。<br>最近はパブリッククラウドでのインフラ設計・構築。|
|学歴|地方国立理系卒（非情報分野）|
|年齢|28歳|
|保有資格|基本情報技術者 / LPIC1 / LPIC2 / AWS系 / Azure系|
|家族構成|配偶者有り。1歳の娘持ち。<br>家事育児のため、勉強時間は１日に多くても２時間程度。|


# 勉強期間
１週間です。
１日の勉強量は1〜2時間くらいだったと思います。
娘がまだ1歳ということもあり、本格的に勉強に充てられる時間は22時〜24時でした。
# 使用教材
|#|教材|概要|
|:---|:---|:---|
|1|徹底攻略 LPIC Level3 304 教科書+問題集[Version 2.0]対応|最強でしたね。最短で合格を目指す場合は、この本は必須だと思います。**特に最後の模擬試験2回分。本番試験の問題数の8割ほどは、本書の模擬試験と同じ問題が出ました。**|

今回はPing-tは使用しませんでした。
**黒本一本打法です。**
後述しますが点数は700/800だったので、黒本のみで十分合格可能です。

# 勉強方法
### サマリー
|#|内容|期間|
|:---|:---|:---|
|1|黒本 教科書 1周目|2日|
|2|黒本 模擬試験 1周目|2日|
|3|黒本 教科書 2周目|2日|
|4|黒本 模擬演習 2周目|1日|

### 1.黒本 教科書 一周目（2日）
試験範囲が全3章立てなので、1日1.5章ペースで読み進めました。
毎回このフェーズでは、内容を頭に入れることは意識しないで、「こんなんあるんだなー」くらいで、さらっと一周するイメージです。

### 2.黒本 模擬試験 一周目(2日)
もちろん全然問題解けないですけど、とりあえず演習して答えを熟読します。
この時、試験範囲の比重を意識して進めていました。
LPIの公式に試験範囲の出題の比重が乗っていますが、概ね仮想化だけで全体問題数の5割ほど出題されます。

### 3.黒本 教科書 二周目(2日)
2周目は理解しながら進めます。
すでに全体を見ることができているので、1周目に理解できなかったところが理解できたりするかと思います。
点と点をつなげて線にするイメージですね。


### 4.黒本 模擬演習 二周目(1)
最後の追い込みです。
問題暗記する気持ちで臨みましょう。
本当にそのまんま出るので。

# 結果
https://twitter.com/rocketboy555/status/1428944927828832256?s=20

700/800点で合格でした。
１週間という勉強期間でしたが、なかなか高得点を叩き出せました。
黒本で見た問題ばかりだったので、黒本すげー、と思って解いていました。
コマンド問題まで黒本と同じだったので「いいのかこれ・・」と心の中で突っ込みました。


# おわりに
今回は「資格取得する」という目的のため、１週間と言う短い期間で勉強をしました。
もっとじっくりと内容を理解したいと言う人には性に合わないやり方かもしれません。

資格というのは、実務に直結するかと言われると、案外そうでもないものです。
ですがITの"教養"を学ぶという意味ではLPICは勉強していて面白い資格でした。

スポーツで例えるならば、資格の勉強は筋トレ、実務は競技といったところでしょうか。
実戦から得られることが多いのも事実ですが、日々の筋トレから気づきがあることもまた事実です。

目標を立て、プロセスを決めて、実行に移し、合格する。
この一連の流れは非常に達成感がありましたし、何より自分の自信になりました。

この記事を読んでいる方はすでにLPIC2まで取られている方が多いと思います。
是非LPIC3まで取り、最後の達成感を味わってください。
【Laravel】seeder（シーダー）の使い方

#はじめに
テーブルの用意ができている前提で話を進めていきます。

seederを使うと...
####テストデータをデータベースに挿入することができます。

#seederの使い方
1) まずは、ターミナルもしくはコマンドプロンプトで以下のコマンドを実行し、シーダーファイルを作成します。

```
php artisan make:seeder UserTableSeeder
```

2) コマンドを実行すると、「database」内の「seeders」内に「UserTableSeeder.php」が作成されるので、runメソッドに以下のようにコードを記述していきます。

```php:UserTableSeeder.php
public function run()
{
    DB::table('users')->insert([
        'name' => 'yusuke',
        'mail' => 'yusuke@example.com',
        'age' => '32',
    ]);
}
```

3) デフォルトで用意されている「DatabaseSeeder.php」のrunメソッドを以下のように編集し、「DatabaseSeeder.php」から先ほど作成した「UserTableSeeder.php」を呼び出します。

```php:DatabaseSeeder.php
public function run()
{
    $this->call(UserTableSeeder::class);
}
```

4) 最後に、ターミナルもしくはコマンドプロンプトで以下のコマンドを実行し、runメソッドを実行します。

```
php artisan db:seed
```

これで、テストデータをデータベースに挿入することができました。

#おわりに
ちなみに、seederとは種をまく人という意味らしいです。
【1.21.1】Nginx 最新バージョン のソースビルド 【CentOS】

# Nginxのインストール方法

特に難しいことはなかったけどメモ

## 環境

- OS : CentOS Stream 8
- Cloud : GCP GCE
- Nginx : 1.21.2 (2021.09.02 最新)

## 手順

【参考】[公式手順](https://www.nginx.com/resources/wiki/start/topics/tutorials/install/)

### 1. tar を DL

```
# cd /usr/local/src
# wget https://nginx.org/download/nginx-1.21.2.tar.gz
```

### 2. tar 解凍

```
# tar xzvf nginx-1.21.2.tar.gz
# rm nginx-1.21.2.tar.gz
# cd nginx-1.21.2
```

### 3. ./configure

```
# ./configure
...
checking for PCRE library in /usr/pkg/ ... not found
checking for PCRE library in /opt/local/ ... not found

./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
```

ここでエラー
pcre のライブラリが必要らしい

- pcre-develをインストール

ggったらこれで解決している人がいたので。

```
# dnf install pcre-devel
```

### 4. make

```
# make
```

### 5. make install

```
# make install
```

### 6. パスを通す

```
# ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx

# nginx -v
nginx version: nginx/1.21.2
```

## Daemon化手順

ソースインストールだとsystemctlで操作できないのでデーモン化する
といっても/lib/systemd/system/にファイル作成するだけ

[手順](https://www.nginx.com/resources/wiki/start/topics/examples/systemd/)

- serviceファイル作成

```:nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
```

今回の手順だとPIDFILEが/usr/local/nginx/logs/nginx.pid になって起動できないので、
nginx.confで設定変更する

```:nginx.conf
pid        /var/run/nginx.pid;
```

コメントアウトを外して、/var/run/nginx.pid (もしくは /run/nginx.pid)にする

- 起動確認

```
# systemctl start nginx
# systemctl status nginx
```
「【Swift】平面座標系でのベクトルの内積の公式を用いてある3点からなるなす角を求める方法」を参考にWolframAlphaとSymPy Liveでやってみたい

# original link

https://qiita.com/sugurutakahashi12345/items/5818ba162d32323e63ed

(1,3),(3,4),(2,6) 
#wolframalphaで

いい方法があれば、教えて下さい。「ベクトル」があるみたいです。

https://www.wolframalpha.com/input/?i=arctan%28%286-3%29%2F%282-1%29%29-arctan%28%284-3%29%2F%283-1%29%29&lang=ja

別の形
π/4

https://www.wolframalpha.com/input/?i=%281%2C3%29%2C%283%2C4%29%2C%282%2C6%29&lang=ja

https://www.wolframalpha.com/input/?i=%E7%B7%9A%E5%88%86%281%2C3%29%2C%283%2C4%29+%2C%E7%B7%9A%E5%88%86%281%2C3%29+%282%2C6%29&lang=ja


以下入力は、(別件)「定義不等式」も表示して、素敵。

https://www.wolframalpha.com/input/?i=%281%2C3%29%2C%283%2C4%29%2C%282%2C6%29+%E4%B8%89%E8%A7%92%E5%BD%A2&lang=ja

特性(抜粋)
内角 | (π/4 rad | π/4 rad | π/2 rad)≈(0.785398 rad | 0.785398 rad | 1.5708 rad)



#SymPy Liveで
勉強中
【プログラミング基礎】オブジェクト指向とは

#はじめに#
　オブジェクト指向について、聞いたことがある方も多いと思いますが初心者には理解しづらい壁の一つかと思います。（私もその一人です・・・。）これは当然のことで、そもそも概念的な話なので明確な答えはありません。人によって説明の仕方が違ったりします。ですから100％理解する必要はなく、ここでは何となくこんなものかな？と言う程度で十分かと思います。

#オブジェクト指向とは#
　オブジェクト指向とは、プログラミングにおける考え方の一つです。様々な処理の一つ一つを「モノ」として捉えて、必要な場所で使います。単に処理を記述していくだけのプログラミングよりもたくさんメリットがあります。どんなメリットがあるのでしょうか。

・可読性が上がる
・メンテナンスが容易
・複数人での開発で役立つ

こんなところでしょうか。
####可読性が上がる####
　車の設計図で例えてみましょう。例えば、赤・白・黄の３種類の車があったとしましょう。赤い車に走ったり止まったり曲がったりする機能を付け加えます。次に白い車に走ったり止まったり・・・、次に黄の車に・・・のようにいちいち初めから作っていると中々大変です。そして処理が増えれば増えるほどコードが長くなり読みにくくなります。
　オブジェクト指向であればこういったことが解決できます。走ったり止まったり曲がったりする様々な動作をあらかじめ設計図に定義しておきます。そしてその設計図をもとに赤い車、白い車、黄色い車を作っていきます。そうすることでいちいち動作を記述する必要はなくなり、全体のコード量を減らすことが出来ます。

####メンテナンスが容易####
　車にクラクションを鳴らすという動作を追加する場合を考えてみましょう。オブジェクト指向を使わない方法だと、赤・白・黄それぞれにクラクションを鳴らすと言う動作を追加する必要があるため、やはり結構大変です。3台くらいなら何とかなるかもしれませんが、これが100台だとどうでしょうか。残業確定です。
　ところがオブジェクト指向だと設計図にクラクションを鳴らすと付け加えるだけでOKです。これが3台だろうが100台だろうが1000台だろうが一回の記述で済むので非常に簡単ですね。

####複数人での開発に役立つ####
　あらかじめ設計図を作っておけば、その中身を詳しく知っておく必要はありません。車が走るメカニズムを知っていなくても設計図があれば作れると言うわけですね。これによって、複数人で開発をする際でも非常に効率よく行えます。

#用語#
　オブジェクト指向には独特の用語がありますので一応覚えておきましょう。

####クラス####
　クラスとはあらかじめ定義されたもののことを言います。車で言うと設計図に当たります。クラスから個別のモノを作っていくことが出来ます。

####インスタンス####
　インスタンスとは、クラスから作られたモノのことを言います。車の設計図から作られた赤・白・黄の車がこれに当たります。設計図からモノを作ることを**インスタンス化**すると言います。

####プロパティ####
　プロパティとは、インスタンスが持っているデータのことです。車の名前や色、メーカーなど様々です。

####メソッド####
　メソッドとは、インスタンスが持つ動作のことを言います。走ったり止まったり曲がったりクラクションを鳴らすといった動作のことを言います。


#オブジェクト指向の3原則#
　オブジェクト指向には3原則と呼ばれるものがあります。

・継承
・ポリモーフィズム
・カプセル化

の3つになります。
少し難しくなってきましたね。一つずつ見ていきましょう。

##継承##
　継承とは、あるクラスを受け継いで新しいクラスを作ることを言います。
車の例で見ていくと、「車」と言うクラスには走ったり止まったり曲がったりといったメソッドやプロパティが定義されています。そこで、新しく「オープンカー」というクラスを作りたくなったとします。この時、最初から新しく作る必要はなく、「車」クラスからメソッドやプロパティを受け継いで「オープンカー」クラスを作ることができるのです。オープンカークラスは車クラスが持っているメソッドやプロパティを全て受け継いでいますので、走ったり止まったり・・・といった定義を改めて作る必要はありません。

##ポリモーフィズム##
　英語で多様性といった意味になります。ポリモーフィズムとは簡単に言うと、異なるクラスで同じメソッドがあった場合に、クラスによってよしなにメソッドの動作を変えてくれるということです。よく、ゲームの勇者一行に例えられますが、戦士・魔法使いというクラスがあったとします。普通であれば、"パンチ"とか"魔法"といったメソッドがそれぞれ与えられると思いますが、仮に新しい剣士というクラスを作った場合には新たに"切る"というメソッドを作る必要があります。これと同じようなことが何十件、何百件と増えれば結構面倒ですね。
　そんな場合に、役職に関わらず"攻撃"というメソッドを作っておけば、クラスをインスタンス化してメソッドを使う際に、クラスごとに区別する必要がなくなります。つまり、クラスによって同じメソッドでも異なる動きができるというのがポリモーフィズムという考え方になります。


##カプセル化##
　カプセル化とはあるクラスが他のクラスから干渉を受けないような設計にすることです。外部からアクセスできると、何かの間違いでプロパティの内容が書き換えられてしまう可能性があります。こういったことを防ぐためにクラスの内部だけで扱えるようにする設定が出来ます。
　具体的には**アクセス修飾子**を**private**に変えることで設定ができます。プロパティやメソッドの頭にprivateと付け加えることでクラスの外から参照することが出来なくなります。アクセス修飾子にはその他に**public**と**protected**があります。publicはクラスの外からでも参照可能で、protectedは自クラスおよび継承した子クラスからのみ参照可能になります。


#まとめ#
　オブジェクト指向についてまとめてきました。いずれも共通しているのは、面倒な処理をしたくない、同じ処理を何度も書きたくない、読みやすくしたいといった思想からきています。実に合理的で美しい考え方ですね。
　少し解釈が難しい部分もありますが、（私も理解出来ていない部分が多々ありますが）しっかり復習していきましょう！
行動探求で自分の意識レベルをあげよう

<h2>はじめに</h2>
<p>今回は、直接コードには関係ないけど、エンジニアとして、プロとして、人間として大事な行動探求について。
<br/>
会社で勉強会をしたのでメモを残します</p>

# 1-3章　要約

## 1章 行動探求の基本

- 自分たちの意識・行動に注目
- 自分が受けている制約がわかる！
- 制約抜きの判断ができるようになる
- 誠実な行動が取れるようになる

- そのために

1 **以下を直して、より良い行動にしよう**

１次ループ：外の世界における結果　例：リリース遅れた

　→なぜその結果（リリースが遅れた）が起きたのか？→結果から考えて改善

　

２次ループ：戦略・目標・構造　例：リリース間に合わすために手戻り少ないように事前に確認を意識した

　→なぜその戦略（手戻り少なく）の行動を取ったのか？最近聞くので実施しただけで、本当はもっと工夫できたのかも、他に遅くなっている原因があったのか？

３次ループ：意図・ビジョン　例：そもそも私は何がしたいのか？？

 →次の行動を判断する際に、まず「意図は何か？」「ほんとうにそれでよいか？」

(4方針)リリースを早くする方針の元

現状、(3領域：なぜその行動を取ったのか)言われたことをやれば良くなるだろうという意識しかなく、(2:行った行動)ただ言われたこと・手戻り少なくを何も考えず行った　、(1：結果)その結果、リリースが遅くなった

→そもそも、自分で考えずにそのまま行うことが多く、その時の状況を考慮した行動が取れてない、その時を分析できていない

2 **上記を実行するために、自分の特に以下を意識しよう**

4つの体験領域
第四領域：意図に関する注意（プレゼンシングの注意、ビジョン、直感／直観、目的）=どうあるべきか、方針、枠組み

第三領域：行動論理（戦略、スキーマ、策略、行動計画、典型的な経験についての内省の様式）=本の中身を理解する、会話の内容を理解する

第二領域：自分が認識する行動パフォーマンス（具現化の過程で認識される挙動、スキル、行動パターン、行為）=アクション、呼吸とか、ストレスへのフィードバック　顔がこわばるとか、ひげ触るとか、無意識的に出る、ストレスに対して気付ける。

第一領域：外部の出来事（結果、評価、観察される行動結果、環境への影響=身体感覚

自分が受けている制約がわかる！

制約抜きの判断ができるようになる

誠実行動が取れるようになる」

## 2章　話し方としての行動探求

話し方の行動探究をすることで、より深い相互性(お互いの意見を入れて、みんな納得・より良い答え）を産もう！

1. **枠組み：この目的は何か**

    例　今日はーーについてみんなが満足できるような決定を下したい

    自分の見解を並べて、検討できるようにする

    会議に抜けていることが多い！→相手が推測しなくてはいけなくなり、見当違いになりうる、うまく伝わりきらず話がずれる

2. **主張：**

    例：✖️「ペンある？（問いかけ）」→いいえ　で終わりかも

    　　○「ペンをつかいたのですが（主張）、余分なペンはある？（問いかけ）」

    感情の主張は、自分の弱みを曝け出すことになり、もっとも難しいが、共感を引き起こす可能性が高い！

3. **説明：具体的なストーリーをたす**

    例：

    「我々は出荷のペースをもっと早めるべきだ（主張）。最大の顧客が急ぎの注文を発注していて、今週中に必要としている（説明）」

    主張だけだと、誤解が生まれることがある。（反論のみとかも）

    説明があることで、納得できるし、動き方も変わる。より伝わる

4. **問いかけ：相手に問いかけを投げる**

    相手から何かを学ぼう

    効果的な回答を得るためにも1-3が大切。⇨聞きたいことが明確じゃないと、相手は今から言うことが合ってるか恐れて、答えずらくなる。１−３しっかり！

2.3 自分の見解を相手に伝えるために

1.4相手の理解を受け入れるために

相互性がないと、一方的な意見の押し付け、結局お互い理解できずにいい答えが生まれない、より良い意見も生まれない

常に自分と、相手の意見を交えて、相互性のたかいより良い答えを導ける」

### 3章　組織化する方法としての行動探求

- ビジョン策定
- 戦略策定
- 実行
- 評価

この４つをバランスよくやる
JetbrainsToolbox でインストールした Android studioにFlutterを入れようとしたら `unable to find bundled java version` が出て解決した話

JetbrainsToolboxでインストールしたAndroid studioにflutterを入れようとしたら `unable to find bundled java version` が出たので解決の備忘録

![スクリーンショット 2021-09-02 20.55.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131778/1c08c955-ec85-8883-817b-3062a353eeca.png)


こんなの出たら！

```
cd /Users/ここユーザーネーム/Library/ApplicationSupport/JetBrains/Toolbox/apps/AndroidStudio/ch-0/203.7621141/Android\ Studio.app/Contents/jre
```

ディレクトリを移動。ユーザー名は書き換えて下し

```
ln -s ../jre jdk
```

こうして

```
ln -s "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin" jdk
```

こう！

```
flutter doctor -v
```

そしたらいけると思います :thinking: 

変更した後にライセンス問題がでたらこちらが参考になるかもです

https://zenn.dev/captain_blue/articles/flutter-android-licenses-classnotfound

ちゃんちゃん
リーダブルコード


<h2>はじめに</h2>
<p>エンジニアとして働き始めて早半年。ワオ！
<br/>
<br/>
3ヵ月目だったときのわたしに、超すごすご先輩エンジニアの方が「リーダブルコード」を読むだけで実装力変わるよ、と教えてくれたので、必死で読みました。<br/>
その時の学びを今更ながら記録しますう📝。
<br/>
<br/>
駆け出しエンジニアでも入りやすいポイントばかりですし、少し意識するだけで可読性増し増しぃ➚🔥 なので、よければ参考にしてみてください。<br/>長めなので、少しずつ意識するのがおすすめです🙆‍♀️</p>



<h2>命名</h2>
- **「具体的」な命名を**

    😕get... どこから取ってくるの？キャッシュ？db?

    🙆🏻‍♀️FetchPage..インターネットから取ってくるとわかる！pageが付いてることで、「何を」取ってくるかまでわかる。

    🗝ヒント

    - 類義語を探していくとぴったりな言葉が見つかるかも！
    - 変数名には大切な情報を入れると良い(time →time_msだったらミリ秒なことがわかる)
    - 特殊やなつ(ファンバサダーとか)は、チーム全体で決めて認識揃えると良い

- **他の意味に誤解されないか確認してみる**

    名前を決める前に、反対意見を考えるなどして、他の人が自分のコードを読んだときに誤解されないか想像してみよう！

    🗝ヒント　

    - 限界値　min-max
    - 範囲の指定　first-last(その値も含んでいることが分かる)。begin-end(beginはその値を含み、endはその値を含んでいない。けど少し曖昧。けどこれがイディオムだから最善🤔)
    - bool　is,has,can,shouldをつけると良い。否定形よりも肯定系のものの方が良い（例：disable_ssl = false; → use_ssl = true;)

<h2>美しさ</h2>
- 改行でまとまり意識
    - 同じ内容ごとに塊にして、改行とか。
- 同じことを何回もしているのなら、１つの関数にまとめる
- 意味のある並び順（どの順番でも良いなら、重要順, アルファベット順にするとか。また、同じコード内では同じ順番にすべき)
- 複数行で同じ内容のことをしているなら、シルエットを揃える

<h2>コメント内容</h2>
👆コメントの目的は、書き手の意図を読み手に知らせること

**コメントすべきこと**

- なぜそうしたかなどの自分の考え
- コードの欠如(TODO:〜を使うとかで書く
- 他の人が後から見た時にハマりそうな罠に書く
- コードの理解に役立つwhat(全体像、何をしているのか) how(どうやってるのか) why(なぜやったのか)

    ※ただし、コメントで補おうとせず常に綺麗なコードを意識 

**どうコメントすべきか**

- 代名詞は避ける（×それ、これ。どれやねん
- 実例を書いてみる
- 情報密度の高い言葉を使って簡潔に（例：この情報はデータベースとここに保存する。このクラスを読み込むときにメンバが存在してたらそこから読み.....→このクラスは、データベースの**キャッシュ層**である


<h2>制御フローを読みやすくする</h2>
- if/elseの順番

    ```jsx
    if(a == b ){
     //第一ケース。
     //1,肯定系の条件を使う　▲ a!==b
     //単純な方を先に書く →if/esleが同じ画面に表示されてわかりやすい
     //目立つ条件を先に書く
     } else {

     }
    ```

- 三項演算子
    - 基本はif/else 。それによって簡潔になるもののみ三項演算子。

- 早期リターンはウェルカム🌺

- ネストは浅く
    - 変更するときに、既存のコードに付け足しちゃえ〜は危険。そうやってネストしていく...一歩下がってみて全体をみよう！！！
    - 失敗ケースを早めに返す、ネストが消える

- 要約変数・説明変数
    - 式を変数に代入しておく

        ```jsx
        例
        ▲ if(user_id === doucument.user_id) {
         ...
        }

        ↓

        ◎ const user_owns_document = user_id === document.user_id
        if(user_owns_document){
        	 ....
        }
        if(!user_owns_document){
         ....
        }
        ```

    ※何でもかんでも変数はダメ。✖️一度しか使わないもの

- 反対を考えてみる

- プライベートとグローバルの使い分け
    - 基本プライベート、他でも使う時にグローバル（変に他で使われないように！！

- 書き換えれない変数
    - letよりconstの方がベター


<h2>コードに思いを込める</h2>
- 誰もが分かるように書くべし！

    手順

    1. コードの動作を簡単な言葉で同僚にもわかるように説明する
    2. その説明の中で使ってるキーワードやフレーズに注目する
    3. その説明に合わせてコードを書く！✌️

🗝ヒント

デバック時にもかなり役立つ！

ある大学で、生徒はデバッグに悩んだ時に、🧸に問題を声を出して説明する。それだけで解決策が見つかる！！(ラバーダッキング

<h2>短いコードを書くべし</h2>
- 必要な要件のみ

　任意のユーザーの緯度経度にたいして、最も高い店舗を検索する

↓

🙆🏻‍♀️テキサス州のユーザーに、テキサスにある最も高い店舗を検索する

テキサスで考えられるものだけに絞られた！

- たまにライブラリを15分読もう

　知らなかった出来ることがでてきそう！

<h2>テストと読みやすさ</h2>
💁🏻‍♀️他のプログラマが安心してテストの追加や変更ができるよう、テストコードを読みやすくしよう
macOS Big Surのアップデート通知バッジを消す方法📛

macOS Mojaveが至高だと思っている私

macOS BigSurにアップデートしたくないけどセキュリティアップデートだけは適用しておきたい

しかしSystem Preferencesにアップデート通知バッジがつくのは嫌．．．というときありますよね

そんなときはterminalで以下を入力

```
defaults delete com.apple.preferences.softwareupdate LatestMajorOSSeenByUserBundleIdentifier && softwareupdate --list
```
最後にDockをkillする

```
killall Dock
```

完了．


追記：System Preferencesが立ち上がっているとバッジが消えないことがある為，
終了させてから上記コマンドを実行して下さい．


よきmacOSライフを！
セル選択の重複数を保持するUnion

#はじめに
ExcelVBAのUnionは、各セルが何重に選択されているかを無視して、セル範囲を結合する。
そこで、選択の重複数を保持したまま合算するUnionっぽいFunctionを自作した。
使い道があるかはわからぬ。

#コード
```vb:myUnion
'セル選択の重複数を保持するUnion
Private Function myUnion(rng1 As Range, rng2 As Range, ParamArray rng() As Variant) As Range
    Dim i As Long
    Dim str As String
    str = rng1.Address & "," & rng2.Address
    For i = 0 To UBound(rng)
        str = str & "," & rng(i).Address
    Next i
    str = sortAddress(str)
    Set myUnion = Range(str)
End Function

Private Function sortAddress(str0 As String) As String
    Dim ary() As String
    Dim str As String
    Dim strnext As String
    ary = Split(str0, ",")
    str = ary(0)
    For i = 1 To UBound(ary)
        If Not (Intersect(Range(str), Range(ary(i))) Is Nothing) Then
            If strnext = "" Then
                strnext = Intersect(Range(str), Range(ary(i))).Address
            Else
                strnext = strnext & "," & Intersect(Range(str), Range(ary(i))).Address
            End If
        End If
        str = Application.Union(Range(str), Range(ary(i))).Address
    Next i
    If strnext <> "" Then
        sortAddress = str & "," & sortAddress(strnext)
    Else
        sortAddress = str
    End If
End Function
```

#参考

https://qiita.com/shiro01/items/266279cd8d1170c24ab2
標準入力

###3行のデータの入力

```python
for i in range(3):
    s = input()
    print(s)
```

###N行のデータの入力

```python
n = int(input())

for i in range (n):
  input_line = input()
  print(input_line)

```

###区切り文字で分割

```python
#空白で区切る
s = input().split()
print(s[0])
print(s[1])
print(s[2])

#/で区切る
s = input().split('/')
print(s[0])
print(s[1])
print(s[2])
```
https://note.nkmk.me/python-split-rsplit-splitlines-re/

###N個のデータの入力

```python
n = int(input())
s = input().split()

for i in range(n):
    print(s[i])
```
入力例1
3
aaaaa bbbbbb cccc

出力例1
aaaaa
bbbbbb
cccc

###カンマ区切りの3つのデータの入力 

```python
s = input().split(',')

for i in range(3):
    print(s[i])
```
入力例1
aaaaa,bbbbbb,cccc

出力例1
aaaaa
bbbbbb
cccc

###複数行にわたる入力

```python
N = int(input())

for i in range(N):
    a = input()
    print(a)
```

##入力の配列による保持(配列作れる）

```python
n = int(input())

A = [0]*n

for i in range(n):
    a = int(input())
    A[i] = a

print(max(A))
```

###半角スペース区切りでの出力

```python
n = int(input())

p = ["paiza"]*n

print(" ".join(p))
```
入力例2
3

出力例2
paiza paiza paiza
【Salesforce】数式項目でアイコン表示


#きっかけ
できるんだろうな～と思ってはいたけど
実装する機会がやっと最近あったのでまとめました。

[Salesforceのヘルプ](https://help.salesforce.com/s/articleView?id=000327122&type=1) を見てもよく分からなかったので自己流です
静的リソースつかいます。手順は2つだけとっても簡単です。

#仕様
商談のフェーズごとに下記アイコンを表示する（新規は無し）

提案中　　失注　　成立
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/fe981e45-cdd8-f923-ff59-fb8aa1392145.png" width="50">　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/568d2ad1-f3e0-a10a-8ba7-2c05cda01557.png" width="50">　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/14fade86-7e96-ba00-b63c-7e47c2518588.png" width="50">



#手順
**①静的リソースにアイコン画像をアップロード**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/9711518a-d570-8c45-3c75-a7fef4df21d9.png)
静的リソースを新規作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/5f8f78fb-0b81-0c48-78ab-0ac8761d3323.png)
手順②で使用するため、静的リソースの名前を控えておきます。

**②数式項目の作成**
数式(テキスト)の項目を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/496d656f-64c5-e1da-abdf-288321b076ed.png)
数式は↓です。IMAGE()で静的リソースのファイルを指定します。

```
CASE( StageName, 
      "提案中", IMAGE("/resource/Proposal", "",25,25), 
      "失注",IMAGE("/resource/ClosedLost", "",25,25),
      "成立", IMAGE("/resource/ClosedWon", "",25,25),
      "")
```
これで準備は完了です！！

#動作確認
リストビューに表示してみました。ｱｲｺﾝはフェーズと連動しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/7c6df052-b547-8885-0106-082ddc1f78e8.png)
（画像が白黒で見分けがつきにくいですね！例なのであしからず。）

#参考
https://help.salesforce.com/s/articleView?id=000327122&type=1
https://help.salesforce.com/s/articleView?id=sf.customize_functions_i_z.htm&type=5
分岐のアンチパターン...かな（弱気）

## はじめに

　この記事を読む前に、よかったら以下も読んでください。

- [分岐アンチパターン - Qiita](https://qiita.com/pakkun/items/9bef9132f168ba0befd7)
- [読み手にやさしい if 文を書きたい - Qiita](https://qiita.com/Nossa/items/3fb1f1e4c429cacd3365)

## この記事の説明

　「これはアンチパターンである」と、ハッキリとは言えないのですが、最近たくさんのソースを読んでいて「これ、困るなあ」「こうなっていると嬉しいな」と思ったものがあるので記します。

　コード例は JavaScript のような、架空の言語で示します。`if` 文を持つ言語なら、だいたい当てはまるのではないかと思います。

　※ ポイント以外、コードは省略しますのでサンプルコードは動きません。

## （１）式の中に処理がある

　例えば、以下のようなコードです。

```js
if (registerUserProperty(obj) == true) {
    console.log("登録処理は成功しました");
}
```

　...と、こうではなく...

```js
let successful = registerUserProperty(obj);

if (successful) {
    console.log("登録処理は成功しました");
}
```

　...というようにしてほしい。

　理由としては、以下のようなものです。

- 「処理」と「判定」は別のもの。別々に書いてほしい。「このあたりで処理を呼んでるはずなんだけど...。妙だな、見当たらない。あっ！」となった。
- 関数の戻り値は、どうせデバッグ時に調べたくなる。「`true` か `false` を期待していたら実は `null` だった」などということが、言語によってはしばしば起きる。
- 下記の算術関数と違って、判定内容を明確に示す識別子（関数名）になっていない。

　以下はOK。処理ではなく、算術関数だから。意図が明確で読みやすい。

```js
if (isNumeric(value)) { ...
if (productCode.startsWith("ABC-")) { ...
```

　あと while の中の式とかも別にいい。以下のようなやつね。

```cs
while (reader.Read() == true)
{
    Console.WriteLine(reader["NAME"].ToString());
}
```

## （２）式が長い

　下記のようなコードではなく。

```js
if (user.profile.birthday.toAge().between(20, 30) && user.options.class.contains(CLASS_PREMIER)) {
    // 処理 ...
}
```

　...ではなく...

```js
let isTargetGen = user.profile.birthday.toAge().between(20, 30);
let isPremier = user.options.class.contains(CLASS_PREMIER);

if (isTargetGen && isPremier) {
    // 処理 ...
}
```

　...としてほしい。これなら読んですぐ「ああ『ターゲット世代かつプレミア会員かどうか』を判定しているのね」とかわかる。

　（VB とかの `And` と違って、`&&` とかはシンタックスハイライトしないエディタ多いこともあって、長くなると読みづらい）

　上記のようなケースは、長くて読みづらいとはいえ仕様とコードが一致しているからまだ良いのだけれど、複数の値を確認して初めて一つの状態が決まるようなケース。例えば、製造ライン番号と時間帯から作っている製品がなんなのかを判定するようなケース。

```js
if (lineCode == "A20" && timeRange <= 1200) {
    // 処理 ...
}
```

　こういったケースでは、判定結果の製品名と判定文の式がまったく結びつかないので、上記のような説明変数に入れるか、下記のように算術関数を作ってほしい。

```js
function isSandwich() {
    return (lineCode == "A20" && timeRange <= 1200);
}

if (isSandwich()) {
    // 処理 ...
}
```

　これなら「ああ、製品がサンドイッチかどうかを判定しているのね」とかわかる。

## まとめ

　短く書く要件があるような場合（ワンライナーだったり高速化のためだったりメモリの節約のためだったり）でなければ、保守性（読み易さ）を優先してほしいなあ。

　メインのロジックだけで良いです。ビジネスロジック・仕様が読み取れるようになっていて欲しいのです。なんのための判定なのか、判定結果はどのような意味を持つのか。そういったことがわかると、ドキュメントや要件との照合もしやすい。

## おわりに

　どちらも「あ。やってしまったことある」でした。ソースコードを書く立ち場と読む立ち場で、変わるのだと思います。
[Ruby] AtCoder過去問　B - Break Number

##はじめに
AtCoderのB問題を解いて見ました。

この問題は初学者の私からすると、非常に数学力というのでしょうか、経験不足というのでしょうか、頭の柔らかさと言うのでしょうか、、、

そのような力が必要だなと痛感した一問でした。
それではよろしくお願いします！

問題は以下から確認してください↓

https://atcoder.jp/contests/abc068/tasks/abc068_b

## B - Break Number
はじめに入力受け取りです。

```ruby
n = gets.to_i
```


ここからは本当に法則を見つけてそれをプログラムで組めるかです。
まずはじめに私が思いついたのは愚直に、入力された数字に2で割り切れるか調べて、割り切れたら何回割り切れるかプログラムを組んで、、、配列も使って、、、

みたいな感じでやってました。
するとかなり複雑ですし、途中で断念しました。

次にある法則を見つけました。
答えは全て1に2をかけていった数字であると言うこと。

Nには1~100しか入らないと言うことなので、答えは```2, 4, 8, 16, 32, 64```とNが1の時の```1```しかありえないのです。

私は本当にバカなのでこの法則を見つけて、書いた回答がこちら↓

```Ruby
n = gets.to_i

if n >= 64
  puts 64
elsif n >= 32
  puts 32
elsif n >= 16
  puts 16
elsif n >= 8
  puts 8
elsif n >= 4
  puts 4
elsif n >= 2
  puts 2
else
  puts 1
end
```

泥臭く頑張りすぎじゃね？？と思いながら他にも思いつかなかったのでこれで実行したら、一応ACいただきました！
しかし、非常に不格好なので他の方の回答を参考に、自分でわかりやすい且つ、簡潔な回答を考えて見ました。
それがこちら↓

```ruby
n = gets.to_i
 
i = 1
while i <= n
  i *=2
end
puts i / 2
```

上記のコードは、「答えは1に2をかけていった数値になる」と言う法則に加えて下記のような法則に気づければかけると思います。説明が難しいので例で説明しています。


例えば32に2をかけた数値は64です。
もし入力された数値Nが32以上で64より小さかったら、答えは32です。（32が一番2で割れる回数が多い）
Nが16以上で32より小さかったら、答えは16です。(16が一番2で割れる回数が多い)

上記のコードではnを超えるまで2をかけていきます。超えた時点で処理をやめますが、一回、余計に2をかけているので2で割って一回分戻してあげていると言う感じです。
Pythonを利用したMP3カバーアート取得・更新のやり方

前回の記事「[Pythonを利用したMP3メタデータ編集のやり方](https://qiita.com/moshi/items/57735f2602aa0cc3b88e)」で、MP3メタデータ編集について紹介しました。この記事では、MP3カバーアートの取得・更新方法を紹介します。

下記サイトのフリーBGMをMP3のサンプルデータとして利用しています。
[なんでしょう？ @ フリーBGM DOVA-SYNDROME](https://dova-s.jp/bgm/play710.html)

# 実行環境

下記pipコマンドにより音楽メタデータ操作ライブラリ**mutagen**及びイメージ操作ライブラリ**pillow**をインストール
`pip install mutagen pillow`

https://github.com/quodlibet/mutagen

**python 3.8.10** で実行可能なことを確認

# カバーアート取得

mutagenの**ID3**を利用することで、カバーアート(APIC:Attached Picture)を取得することができる。

```python
from io import BytesIO

from mutagen.id3 import ID3
from PIL import Image

mp3_file_path = "なんでしょう？.mp3"
tags = ID3(mp3_file_path)

# カバーアート情報取得
apic = tags.get("APIC:")
if apic is not None:
    cover_img = Image.open(BytesIO(apic.data))
    artist, title = tags.get("TPE1"), tags.get("TIT2")
    cover_img.save(f"{artist}_{title}.jpg")
```

下記カバーアートが出力される(KK_なんでしょう？.jpg)
![なんでしょう？_KK.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138429/14b7c422-f641-fea0-2fcc-a188d1d5bfc1.jpeg)


# カバーアート更新

```python
from io import BytesIO

from mutagen.id3 import APIC, ID3
from PIL import Image

mp3_file_path = "なんでしょう？.mp3"
tags = ID3(mp3_file_path)

# 更新用カバーアート画像ファイル作成
new_cover_file_path = "new_cover.jpg"
Image.new("RGB", (300, 300), (128, 0, 0)).save(new_cover_file_path)

# カバーアート更新
with open(new_cover_file_path, "rb") as img_file:
    cover_img_byte_str = img_file.read()
    tags.add(APIC(mime="image/jpeg", type=3, data=cover_img_byte_str))
tags.save()

# カバーアート更新結果確認
tags = ID3(mp3_file_path)
apic = tags.get("APIC:")
if apic is not None:
    cover_img = Image.open(BytesIO(apic.data))
    cover_img.show()
```

更新後の下記カバーアートが表示される(new_cover.jpg)
![cover_update.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138429/617caf73-0074-b33e-5a52-1d3b38f62efa.jpeg)



# 参考

- [mutagen docs](https://mutagen.readthedocs.io/en/latest/)
- [Mutagen : how to extract album art properties?](https://stackoverflow.com/questions/54757751/mutagen-how-to-extract-album-art-properties)
- [Mutagen's save() does not set or change cover art for MP3 files](https://stackoverflow.com/questions/59815698/mutagens-save-does-not-set-or-change-cover-art-for-mp3-files)
[PHP][Laravel]重い処理行うAPIの実行を止めたい

ローカルで動かしているLaravelで、重い処理行うAPIの実行を止めたい時の忘備録。
サーバー再起動やそれっぽいプロセスをkillしても動き続ける時。

### 結論

以下のコマンドで停止できる。

```bash
$ sudo kill $(sudo lsof -t -i:8000)
```

https://stackoverflow.com/questions/63913946/php-artisan-serve-keeps-working-even-after-i-shut-the-process-down-windows


### コマンド解説

lsofはオープンしているファイルを一覧表示するコマンド。
-iオプションで特定のポートで実行しているプロセスを表示できる。

```bash
$ lsof -i:8000

COMMAND     PID  USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
Google    91524 xxxxx   35u  IPv4 0x6f9544b817401ad3      0t0  TCP localhost:56762->localhost:irdmi (ESTABLISHED)
php       93463 xxxxx    5u  IPv4 0x6f9544b82f9287c3      0t0  TCP localhost:irdmi (LISTEN)
php       93463 xxxxx    6u  IPv4 0x6f9544b8190aa1eb      0t0  TCP localhost:irdmi->localhost:56762 (ESTABLISHED)
```

-tオプションでプロセス番号のみ表示し、それを$( )でネストしてkillする。

```bash
$ kill $(lsof -t -i:8000)
```


### 原因

下二つが該当のプロセスの模様。
artisan servを停止するだけだと上のプロセスのみが停止して、下のプロセスは動き続けていた。
コマンドでkillする場合は、プロセスの親子関係を考慮しないとうまく停止できない場合があるけど
上記のコマンドだと一気にプロセス削除できるので順番を気にしなくて良い。

```bash
  PID TTY       TIME CMD
xxxxx xxxxx  0:00.24 php artisan serv
xxxxx xxxxx  0:00.08 /usr/bin/php -S 127.0.0.1:8000 /path/to/server.php
```
因果ダイアグラム~バックドア基準

### はじめに
この記事は岩波データサイエンスVOL.3の内容を自分の観点でまとめたメモです。ぼかして書いている(すでに熟知している人でないと理解できないように書いている)つもりではありますが、著作者様から異議などありましたら早急に削除いたします。

### 相関≠因果

![09021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/a604daaf-525c-d9b4-73e8-20d00a952733.png)


## 回帰係数と介入効果のズレ
### 1.逆(Y→X)の介入効果は回帰式の変形といっちしない(ズレがある)
![09022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/a4ebb7c9-b9e2-7d9b-7b21-5aa8f956aab4.png)

### 3.合流点での選抜によるズレ
![09023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/0a7836ae-51e2-ba19-1c40-cd48b207b25a.png)

### 4.中間変数によるズレ
![09024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/0ee92a35-b37e-d40c-665c-f2dcf87473da.png)

kaggleでは特徴量を足しまくるのでほぼこれが発生して因果効果など図ることができないように思われる、、、

## バックドア基準のポイント
### 1.上流からの要因を遮断する
![09025.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/c60c39dc-0c95-a6c1-fec1-4d5011ef4577.png)

### 2/3 合流点・中間点を加えない

![09026.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/fc016fda-c3c6-a40a-fd1b-e640704c9679.png)

## バックドア基準
1.
![09027.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/65925dd9-b203-6931-9ed2-92e787b79c17.png)
2.

![09028.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/2902fbd0-f3b9-276f-ea3d-7af5e1499765.png)

### 所感
- ほぼ理解できたし面白かった。初心者にもわかりやすい。kaggleの予測とは目的がまるで違うので、今のところ因果推論の知識を活用するシーンがうまく思い浮かばない。
- 画像に文字を書き込んでしまうと後々修正がめんどくさいような気もするが、、
ElementTreeでxml整形

```python
import xml.etree.ElementTree as ET

tree = ET.parse('input.xml')
ET.indent(tree, space='  ')
tree.write('output.xml', encoding='UTF-8', xml_declaration=True)
```

python3.9からElementTreeにindent関数が追加されている
https://docs.python.org/ja/3/library/xml.etree.elementtree.html#xml.etree.ElementTree.indent
[The Composable Architecture] IfLetStoreで2段階下のStoreを指定する方法

```swift
IfLetStore(
  self.store.scope(
    state: { $0?.upgradeInterstitial },
    action: { .nagBanner(.upgradeInterstitial($0)) }
  ),
  then: UpgradeInterstitialView.init(store:)
)
```

https://github.com/pointfreeco/isowords/blob/main/Sources/HomeFeature/NagBanner.swift#L111-L117
因果推論ことはじめ

### はじめに
この記事は岩波データサイエンスVOL.3の内容を自分の観点でまとめたメモです。ぼかして書いている(すでに熟知している人でないと理解できないように書いている)つもりではありますが、著作者様から異議などありましたら早急に削除いたします。

### 因果推論のモチベ
## 交絡に対処して因果関係を判定したい

| 手法 | メリット | デメリット |
| ---------------------- | ---------------------- | ---------------------- |
| RCT | 交絡因子への影響をすべて無視して因果関係を判定できる。 | お金・時間・倫理的問題がネック |
| 観察研究 | 手元のデータで何とかしたいというモチベーションにこたえることができる <br> 時間とお金がrct程必要ない場合がある | 交絡因子が測定されている必要がある |
|  |  |  |

観察研究の手法

| 手法 | 概要 | 問題点 |
| ---------------------- | ---------------------- | ---------------------- |
| 層別解析 | 層ごとに交絡因子を固定 | 層別化する交絡因子の特定が困難 <br> 連続変数をどこで離散化するかが恣意的になる |
| 回帰モデル | 変回帰係数は交絡因子を固定した状態を発生させることができる | モデルが正しくないと因果効果を推定できない、モデルが正しいことを証明するのは困難 |
| マッチング |  | どの要因でマッチングさせるかが恣意的 <br> 多くの要因でマッチングできない場合あり |
| 傾向スコア |  |  |
| 準実験デザイン |  |  |
|  |  |  |
SageMath 手習い（SageMath で積分）

[Maxima 手習い（Maxima で積分）](https://qiita.com/tadashi9e/items/85f3046c4b85a90a5804) の SageMath 版です。

お題はこんな積分です。
$\int \sqrt{x + \sqrt{x + \sqrt{x + ...}}} dx$

被積分関数を $f$ とすると、上記の ... の部分もまた $f$ と同じになるので

$f = \sqrt{x + f}$

と書けます。変数 $x$ と関数 $f(x)$ があることを宣言して

```python
x = var('x')
f = function('f')(x)
```

$f=\sqrt{x+f}$ なる方程式 eq1 を定義します：

```python
eq1 = f == sqrt(x + f)
```

eq1 の両辺を２乗すると二次方程式 $f^2 = x + f$ になるので、solve でこの解を得ます。

```python
sols = solve(eq1**2, f)
```
sols には二次方程式の２つの解が入っています。

```python
[f(x) == -1/2*sqrt(4*x + 1) + 1/2, f(x) == 1/2*sqrt(4*x + 1) + 1/2]
```

前者の解は $x > 0$ のときに $f(x) < 0$ となってしまうので、後者が本当に得たい解です。
これは、plot コマンドでグラフを書いてみることで確認することもできます。

```python
plot(sols[0].rhs(), x, 0, 10)
plot(sols[1].rhs(), x, 0, 10)
```

なにも考えずにこれら２つを積分するには、以下のようにします。

```python
from sage.symbolic.integration.integral import indefinite_integral
[indefinite_integral(sol.rhs(), x) for sol in sols]
```

これにより、両者の積分結果が得られます：

```python
[-1/12*(4*x + 1)^(3/2) + 1/2*x, 1/12*(4*x + 1)^(3/2) + 1/2*x]
```

Maxima と比べて感想
-----------------

式変形と二次方程式の求解、不定積分くらしかやっていないので感想など言えた義理ではありませんが...

Maxima を触ったあとで SageMath を触ると記述方法が奇妙に思えました。しかし Python ベースの記法なのだと一旦気がつくと、リスト内包表記なども書ける SageMath の方が扱いやすい気もしてきました。
sudo apt install sagemath-jupyter (Ubuntuの場合）だけで簡単にインストールできて、すぐにノートブック形式で書けるというのも便利です。

しばらく Maxima と比べながら使ってみようと思います。
Shopifyでトップページを独自liquidに変更

![Screen Shot 2021-09-02 at 19.11.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346396/aad8e1c5-e33b-6bea-8263-16e089ecf0fe.png)

Sectionsに、トップページ用のliquidを作成(ここではtop-page.liquid)。
Configのsettings_data.jsonで、"current"の最後にあるcontent_for_indexに、
liquidの名称を指定する(上記画像)。
Python3 について strip()

#strip()について
括弧内の文字列を削除してくれる。何も入れないと空白を削除してくれる

```py
text=['あ　い　う　え　お']
text.strip()
print(text)

'あいうえお'
```

#if name =='__main__':について
pythonをターミナルで呼び出す時、import 〇〇と呼び出すとそこで実行されてしまう。
それを防ぐために、nameで呼び出されても、mainに変換して実行しないようにしている。
このサイトがすごくわかりやすい
https://blog.pyq.jp/entry/Python_kaiketsu_180207
あと、ifの後に半角スペース入れ忘れてエラーになることが多かったので、
皆さんも気をつけてください。

```py
if __name__ == '__main__':
  main()
```
[OutSystems]Reactive/MobileのEmailへの添付ファイル機能（Technical Preview）

[Reactive/MobileのEmail機能（Technical Preview）](https://qiita.com/jyunji_watanabe/items/0b58ddea7112b97348bf)で確認したReactive/Mobile向けのEmail（メールをScreenと同じようにGUIで定義する）機能に、添付ファイルも設定できる。

この記事を書いている2021/9/2時点ではまだTechnical Preview。
試している手順はまだ日本語化されていないようですが、[Adding email attachments](https://success.outsystems.com/Documentation/11/Developing_an_Application/Implement_Application_Logic/Technical_Preview_-_Emails_in_Mobile_and_Reactive_Web_Apps/Adding_email_attachments)に記述あり。

# 前提条件
Platform Serverのバージョンが11.13.0以上
Service Studioのバージョンが11.11.12以上
EmailのTechnical PreviewとService CenterでのSMTP設定が完了している
Emailの定義と、送信処理は作成済みであること（実装方法は最初のリンクを参照）

# 確認環境
Personal Environment(Version 11.13.0 (Build 31107))
Service Studio (Version 11.11.14)

# Technical Previewを有効にする
1. LifeTimeを開く
2. Environmentsタブをクリック
3. 右上の「Options」ドロップダウンリストからTechnical Previewをクリック
4. 「Attachments in Mobile and Reactive emails」のスイッチをオンにする
5. Saveボタンをクリック
5. Service Studioを起動していたら、再起動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/57c32d35-935e-05ba-67d2-d066aa6d6b69.png)

Previewを有効にしておかないと、Send Emailのプロパティも出てこないので注意。

# Send Emailに添付ファイル用のプロパティを設定する
EMailの定義は特に変更の必要がない。
Action Flowに配置したSend Email要素のAttachmentsプロパティに、ファイルを渡すだけで添付可能。

以下は、PDFとXLSXの2ファイルを、gmailのアドレス宛に送ってみたときの例。
送信は問題なくできた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/adebae84-d4db-916a-3949-463edbbcdd45.png)

名前から自明だが、Attachements各要素のプロパティは以下の通り。
- FileName：添付するファイルの名前
- FileContent：添付するファイルの実体（Binary Data型）
- MimeType：MIMEタイプ