OmniAICreator/Qiita-1.07M huggingface dataset:
マーメイド#17 ユーザージャーニーマップ

**ひとりマーメイド17日目**
**ユーザージャーニーマップ**

## 概要
マーメイドエンジニアのひろきです。こんにちは。
最近流行り（流行らせたい）のマーメイドについて理解を深めていこうと思います。

この記事ではユーザージャーニーマップの記述について紹介します！

↓↓前回の記事はこちら

https://qiita.com/hirokiwa/items/94b73d5e542cac3d99fa

## マーメイドで記述するジャーニーマップ
前回の記事ではgitグラフの記法について紹介しました。

今日はジャーニーマップを見ていきます！ジャーニーマップはユーザーの行動やフローを可視化するダイアグラムです。横軸が時間、縦軸が感情を表します。

```:mermaid
journey
    title Flow

    section Plane
        Phase a: 4: user1
        Phase b: 1: user1, user2
        Phase c: 2: user3
    section Do
        Phase d: 3: user1
        Phase e: 5: user1, user2, user3
```
```mermaid
journey
    title Flow

    section Plane
        Phase a: 4: user1
        Phase b: 1: user1, user2
        Phase c: 2: user3
    section Do
        Phase d: 3: user1
        Phase e: 5: user1, user2, user3
```

## 宣言とタイトル
ジャーニーマップは`journey`で宣言されます。

`title`でダイアグラムにタイトルをつけることができます。こちらは省略可能です。
```:mermaid
journey
    title Develop

    Phase a: 4
    Phase b: 1
    Phase c: 2
```
```mermaid
journey
    title Develop

    Phase a: 4
    Phase b: 1
    Phase c: 2
```

## フェーズと感情
フロー中のフェーズと感情の指標を記述します。感情は数字で表され、大きい方がポジティブになります。

`PHASE: NUMBER`
```:mermaid
journey
    Phase a: 1
    Phase b: 2
    Phase c: 3
    Phase d: 4
    Phase e: 5
```
```mermaid
journey
    Phase a: 1
    Phase b: 2
    Phase c: 3
    Phase d: 4
    Phase e: 5
```

小数も使用可能です。
```:mermaid
journey
    Phase a: 1
    Phase b: 1.5
    Phase c: 2
    Phase d: 3.141592
    Phase e: 5.0
```
```mermaid
journey
    Phase a: 1
    Phase b: 1.5
    Phase c: 2
    Phase d: 3.141592
    Phase e: 5.0
```

## 数字の範囲
マーメイドで記述するジャーニーマップでは感情を数字で表します。原則数字の範囲は1~5です。

ただし範囲を超えてもレンダリング上問題はないので、軸を突き抜けて表示されます。この場合上限・下限はありません。負の値もとることができます。
```:mermaid
journey
    Phase a: -10
    Phase b: 3
    Phase c: 9
    Phase d: 20
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2293026/a6b96b19-c685-48d6-7bac-3cb33ee19b28.png)

Qiita上でレンダリングすると描画領域が限られているため、見切れてしまいます。
```mermaid
journey
    title Qiita上でのレンダリング
    Phase a: -10
    Phase b: 3
    Phase c: 9
    Phase d: 20
```

## セクション
フローを複数のセクションに区切ることができます。
`section SECTION_NAME`
```:mermaid
journey
    section Plane
      Phase a: 1
      Phase b: 2
      Phase c: 3
    section Do
      Phase d: 4
      Phase e: 5
```
```mermaid
journey
    section Plane
      Phase a: 1
      Phase b: 2
      Phase c: 3
    section Do
      Phase d: 4
      Phase e: 5
```

## ユーザーの追加
ユーザーを追加してフェーズにアイコンを付与することができます。同一フェーズに複数人のユーザーがいる場合はコンマで区切って並べます。
`PHASE_NAME: NUMBER: USER_NAME`
```:mermaid
journey
    Phase a: 1: user1
    Phase b: 2: user1, user2
    Phase c: 3: user3
    Phase d: 4: user1
    Phase e: 5: user1, user2, user3
```
```mermaid
journey
    Phase a: 1: user1
    Phase b: 2: user1, user2
    Phase c: 3: user3
    Phase d: 4: user1
    Phase e: 5: user1, user2, user3
```

## まとめ
ユーザージャーニーマップの記法を紹介しました！

↓↓次回の記事はこちら！！

https://qiita.com/hirokiwa/items/742a250e8847bf763541

## 参考

https://mermaid.js.org
Linux mintでFortiClientを使う

# はじめに

大学にFortiClientでVPN接続を利用していたのですが、Version7以降になってから接続できなくなったため接続する方法を探していました。接続する方法を見つけたので、メモがてら書きます

# 接続方法

1. `openfortivpn`をインストールする
    
    自分は、FortiClient利用していたときに入れていたみたいなので不要でした。
    cli苦手な方はSynapticパッケージマネージャよりインストールできます。([FortiClient VPN](https://www.fortinet.com/support/product-downloads))
    
    以後記すファイルが指定の場所にないよって場合は、
    `dpkg -L openfortivpn`で関連ファイル見ることできますのでそちらから類似ファイル探してください。

2. `/etc/openfortivpn/config`を編集
    
    ```config:/etc/openfortivpn/config
    host = <接続先IPアドレス>
    port = <接続先ポート番号>
    username = <ユーザ名>
    password = <パスワード>
    ```
    上のように記述する。コメントアウトされていると思うので、それらは外します。

3. serviceファイルの作成

    ```service:/lib/systemd/system/openfortivpn.service 
    [Unit]
    Description=openfortivpn
    
    [Service]
    Restart=always
    ExecStart=/opt/openfortivpn/openfortivpn
    
    [Install]
    WantedBy=default.target
    ```
   `systemctl cat ssh`みたいに適当なコマンドのserviceファイルをcatするとファイル作るべき場所がわかります。Linux mintは`/lib/systemd/system/`の下に作成されていたので、こちらに`sudo vim /lib/systemd/system/openfortivpn.service`などでファイル作成・編集しました。
    
4. 実行
    
    ```bash:terminal
    systemctl daemon-reload
    sudo openfortivpn
    ```
    設定変更したので、一応再読込させておきます。
    参考にしたサイトでは、`systemctl start openfortivpn`で起動していたのですが、うまくできなかったため、管理者権限でopenfortivpnを指定したところvpnにつなぐことができました。ログも表示されるのでこれでいいかな...

# 参考にしたサイト
https://ikiri96hyo.hateblo.jp/entry/2020/08/01/142237
ぽえむ「セカンドシステム症候群のたとえ話」には何を使っていますか？

ぽえむ（advent calendarの埋め草?:-?）です

セカンドシステム症候群というのは、こういうことや！という説明をするのに、みなさんは、なにを例に出していますか？私は、これです！

- 機動戦士Zガンダム
- スタートレック THE NEXT GENERATION (TNG)
- 宇宙戦艦ヤマト2199

問題は、どれも（最近の人に）通じなさそうなことでしょうか？いや2199くらいなら通じるか?とも思いますが、オリジナルのヤマト(1974)を見てないなら、やはり通じないですよね;-)

他にも、良い例があれば、ご紹介していただけるとさいわいです


### セカンドシステム症候群

> セカンドシステムは、人間が設計したものの中で、最も危険である。なぜなら、作り込みすぎてしまうというのが、一般的な傾向だからである。

([Wikipedia「『人月の神話』本書で述べられている見解」より引用](https://ja.wikipedia.org/wiki/%E4%BA%BA%E6%9C%88%E3%81%AE%E7%A5%9E%E8%A9%B1#%E3%82%BB%E3%82%AB%E3%83%B3%E3%83%89%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E7%97%87%E5%80%99%E7%BE%A4%EF%BC%88%E7%AC%AC%E4%BA%94%E7%AB%A0%EF%BC%89))

### 参考文献

https://www.maruzen-publishing.co.jp/item/b294733.html


### CHANGES

- 2022/12/23: タグの"#"を削除
理想・問題・課題・対策 入門

ある日の出来事

とある”問題”が発生したので、それに対する”課題”を洗い出してみようとなりました。
まとまってきたので、内容を上司に共有したとき、以下の会話が起こりました。

〜〜〜Slackにて〜〜〜
上司：「内容はOKなんですが、ちょいとこの機会にインストールしてほしい考え方があるので、少し話せませんか？」
自分：（え、なんだろう、内容OKなら進めたいな）
〜〜〜Zoomにて〜〜〜
上司：「あなたが書いたやつは”問題”であって”課題”ではないです」
自分：「あれ、あれ、あれ」


# 問題と課題について

改めて調べてみると、問題と課題は当たり前ですが、全くの別物です。
しかし、ニュアンスとして同じように扱われてしまい、整理する際や会話する際にごっちゃになって使ってしまっている人もいるかと思います。（最近の自分です）

整理して理解するために、問題と課題だけにフォーカスを当てるのではなく、「理想」、「問題」、「課題」、「対策」というを順番で説明していこうと思います。


# 理想

英語にすると、「the ideal」となります。
辞書を引くと、「考えうる最も完全なもの」と出てきます。

これを考えると、ステップとして、まずは自分が思うこうありたいという最高の状態を定義していくことが大事だとわかります。
「理想は高くもて！」と話をされると思いますが、そのとおりですね。
まずは、何を目指しているのかを明確にすることが大事そうです。


# 問題

英語にすると、「the problem」となります。
辞書を引くと、「研究などの対象となる事柄」と出てきます。

これを考えると、事柄とあるので「ありさま」要するに現状起きていることを指している事がわかります。
何をやるかではなく、どういったことが事実として起こっているのかをあぶり出すことが大事そうです。

問題は理想と現実のギャップによって生まれるとい言われています。
理想が高ければ高い程、それによるギャップの溝は深くなると思いますので、様々な問題が出てくるかと思います。


# 課題

英語にすると、「the task」となります。
辞書を引くと、「解決すべき問題のこと。対処する、解決するといった行動に重点がおかれる問題を指し示す表現」と出てきます。

課題の説明に、解決すべき問題のこととあるので、ここがかなりごちゃつくポイントだと思います。
問題は前述したとおりですが、問題にも種類があり、解決すべきものや、解決しなくてもよいものもあるかと思います。
（いわゆる問題ではあるけど、インパクトが小さかったり、対応工数がかかる等の理由で対応しないと判断したものが解決しなくてもよいものと考える）
その中でも課題は解決すべきものにフォーカスを当てているという点がポイントだと思います。

そして、タスクと置き換えるとかなりニュアンスとしてはわかりやすいのではと思います。
やるべきこと、実施すべきことが課題にあたることがわかります。

# 対策

英語にすると、「the measures」となります。
辞書を引くと、「相手の態度や事件の状況に対応するための方法・手段」と出てきます。

課題を設定しても具体的な方法や手段が設定されていない場合があると思います。
そこで、より具体的にどう対処していくかを考えることが大事になると思います。

課題をさらに深堀りして、実現可能な粒度まで落とし込んで行くものだと思います。


# 流れを考えてみると・・
 
- 理想を考えることがまずは大事である
- 理想と現実のギャップ、いわゆるこれが問題であり、今の起こっている事実のことである
- 問題を解決させていくために取り組むべきことが課題である
    - 必ずしも問題がすべて課題になるとは限らず、対処すべきものが課題となる
- 課題をより具体的にしていき、取り組める粒度の行動に落とし込むことが対策である

理想：自分が成し遂げたいと思うこと
問題：理想と現実の間で起こるギャップで、現実起きていること
課題：対処すべき行動
対策：より実現可能な粒度まで落とし込まれた行動


# 例を上げて理想・問題・課題・対策を考えてみる

〜ダイエットを例にあげて考えてみる〜

ある日ダイエットを決意しました
一年前に比べると+5kgも増えてしまっていました
目指すは1年前の体型に近づけるために-5kgにしようと決意しました

**理想：現状の体重から-5kg**

そして月日が流れ・・2週間頑張ってやってみたけど、全然体重に結果が跳ね返ってこなかった
そこでこの2週間を振り返ってみたいと思います

**問題：2週間頑張ったけど、体重が減らなかったこと**

さて、ではこの2週間を思い出してみましょう

- 置き換えとして朝はプロテインを飲んでいた
- いっぱい食べても大丈夫なサプリを飲んでいた
- 昼と夜はおもいっきり食べていた
- 時間がないから運動はやらなかった
- 初日に体重計に乗ってから2週間後に体重計に乗った

振り返ってみると、更に細かな問題が発覚しました

**問題1：サプリでは効かないぐらいたくさん食べている**
**問題2：運動が全くできていない**
**問題3：こまめなFBができていない**

ではこれを解決するために実行することを考えてみましょう

**課題1：食事制限をしてカロリー・炭水化物摂取を抑える**
**課題2：適切量の運動を実施する**
**課題3：毎日の体重を計測して確認する**

ではこれを更に対策という形で具体的な策を考えて2週間のスケジュールに落とし込んでみます

**対策一覧**
- **1日の食事は1400カロリー以下にする**
- **1日の食事は炭水化物100g以下にする**
- **毎日8時に1時間筋トレを実施する**
- **毎日寝る前に体重を計測し、こまめに自分の体重を確認することでモチベーションを上げる**

これで対策もできたので、改めて2週間回してみることで理想に近づけるかがわかります
改めて2週間経ったときに振り返ってみて、理想の状態になればゴール
理想の状態でなければ改めて問題をあぶり出し、課題を設定し、対策を講じる、この繰り返しで最終的には理想に近づけるでしょう

# まとめ

言葉は力です。

特にマネージャーは人を動かす力を持つ必要がありますので、こういった違いを理解して適切につかっていき、情報を整理していく必要があります。

改めてこういったところを指摘してくれる上司には感謝しております！

# 参考

本当に色々なサイトで紹介されております。
以下は自分が見て理解が深まった記事です。

https://www.necmp.co.jp/pj_column/column_0013.html

https://toyokeizai.net/articles/-/474094

https://u-note.me/note/47497254
CSSとJSでハンバーガーメニューを作る

## はじめに


こんにちは。未経験エンジニアりーたまです。
JSの勉強を初めて、もうそろそろ1か月...。
今回はよくあるハンバーガーメニューを作成しました。

*お昼にタイムリーな記事ではありませんが、今日の昼ご飯はマックにしようと思います。

ちなみに

https://suzume-tojimari-movie.jp/

のハンバーガーメニューをお手本にして作成しております(一部分抜粋の為完成形ではありません)


## コード

<p class="codepen" data-height="488.0000305175781" data-default-tab="html,result" data-slug-hash="oNMXwJr" data-user="ri-tama" style="height: 488.0000305175781px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ri-tama/pen/oNMXwJr">
  ハンバーガーメニュー</a> by ri-tama (<a href="https://codepen.io/ri-tama">@ri-tama</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


CODEPENを埋め込みましたが、再現性が、、！(ちょっといじりましたが、×部分がかなりの失敗)



## JavaScript抜粋

```HTML
<script>
    'use strict'
// 1
    const menu = document.querySelector(".menu")
    const button = document.querySelector(".Button")
    const button1 = document.querySelector(".Button-top")
    const button2 =document.querySelector(".Button-bottom")
    const button3 =document.querySelector(".Button-medium")
    
// 2
    const toggleMenu =()=>{
        menu.classList.toggle("MenuIsOpen")
        button1.classList.toggle("change")
        button2.classList.toggle("change2")
        button3.classList.toggle("change3")

    }
// 3
     button.addEventListener("click",()=>{
        toggleMenu()
    })
</script>
```

以下簡単に説明です。

1
変更したいクラスをそれぞれ変数に代入。
2
toggleMenu関数
クラスの付け外しができるtoggleメソッドを実行する関数を作成。
3
button変数をクリックしたら、さきほどの関数が呼び出されるというイベントを作ります。


仕組みとしてはmenu部分がX軸に100%ずれている状態をデフォルトにして、
クリックすることでそのずれている状態を0%に戻すということをしています。


## 問題点・改善点
 **・挙動**
　ハンバーガーメニュー→Xの挙動は上手くいくが
　X→ハンバーガーメニューへの挙動が初期値に戻る動きで、スムーズさがない。
　あとX印の再現性もどうにかしたい(自分のPC上ではX印となっていますが)
　改善の余地あり。
**・コーディング**
　HTMLとCSSのコーディング力の低さから、時間を大半使ってしまった。
　コーディング力は必須なので、クローンサイトを作りつつ、本や記事を見ながら
　やっていこうと思います。


## まとめ
1からコーディングは初めてだったので、苦戦したけど得られる物も多かったです。
現状これぐらいしかできない、という力の無さも実感できました。
できたという達成感は素直に受け止めて、次の勉強へ進みます。

次はスクロールアニメーションに取り組みます。
またそれも完成次第投稿します。
読んでいただきありがとうございました！



参考記事
https://twitter.com/hideki_climax/status/1604415675069476864

訂正
簡単に説明の文章が間違っていたので、訂正しました(12/23)
ExcelからDelta Sharing経由でデータにアクセスする

きっかけはこちらのLinkedInのポスト。

https://www.linkedin.com/posts/junta-nakai_excel-deltasharing-deltalake-activity-7011030797231005696-q2vL?utm_source=share&utm_medium=member_desktop

Excelから[Delta Sharing](https://qiita.com/taka_yayoi/items/f93f1b70fef0f75585be)を利用できる！これは試すしかない！

ということで、コネクターを開発しているこちらのサイトから問い合わせました。

https://www.exponam.com/

そしたら、CEOから丁寧な説明が。

- コネクターは現状はWindowsのみ、もうすぐMac版も出るよ。
- 現在は制限なしの一般リリースプレビュー中、http://files.exponam.com/installers/connect/excel/setup.exe をダウンロードすればインストールできるよ。Excelのアドインとして直接インストールされるよ(Microsoftフレームワークのアップデートに少し時間かかるよ)。

# Excelアドインのインストール

1. Windowsマシンで上のsetup.exeを実行します。フレームワークのインストールや再起動を挟むのでそれなりに時間を要します。
1. インストールが終了したらExcelを開きます。
1. **Exponam**のタブをクリックすると**Delta Sharing**が！
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b81d529c-49e2-6049-db68-37ae0e05cc31.png)

# Delta Sharingの設定

こちらの手順に従ってShare(共有)とRecipient(受信者)を作成します。

https://qiita.com/taka_yayoi/items/3a53516c4434c0ee76f0

認証情報ダウンロード用のリンクにアクセスして、Excelがインストールされているマシンに認証情報ファイル(`.share`)をダウンロードしておきます。
![Screen Shot 2022-12-23 at 11.52.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/75dfef7f-8224-70e1-bc95-1fe75e3c6498.png)


# Excelアドオンの操作

1. **Read from Delta Sharing**をクリックします。
1. ダイアログが表示されます。
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7f365bd1-6c9f-6415-7d44-71b2da06ae4c.png)
1. 左上のDelta Sharingアイコンをクリックします。
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/896a69f7-565e-b3c4-4c4c-dd346191c872.png)
1. `.share`ファイルを選択します。
1. 画面左側に共有に含まれるテーブルが一覧されます。
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5d89297b-345a-2e4b-f89a-f5d121c16530.png)
1. テーブルをクリックしてプレビューを表示します。
![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/41334b40-6287-3ac9-5cfc-34ee0f6a2ab3.png)
1. **Import to Excel**をクリックします。
![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7d1ba55e-cb65-58ee-9c3f-2785860369fa.png)
1. Excel上にデータが表示されました！
![59E618DC3189433E877AD59F63A0B829.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2bbbe520-e32f-0e7f-0f4b-4f9476eba637.png)

メニュー構成からすると、書き込みもサポートされそうな予感です。

Excelでデータを参照、操作するケースは現在でも多いかと思います。そう言った際のデータソースとして、セキュアかつオープンなデータ共有プロトコルであるDelta Sharingを活用してみてはいかがでしょうか。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
laravel 日付関連


```
★日付フォーマット
$date = '20221201';
$dt = new Carbon($date);
$dt->addDay();
$dt = $dt->format('Y年m月d日');//  厳重注意 Y必ず大文字です。

echo "date=  ".$date."<br>";
結果
2022年12月01日

★コントローラー内部にフォーマット

$test = Carbon::createFromFormat('Ymd', $test)->addDays(91)->format('Ymd');

一年後一日減算   subDays() 一日減算
$test = Carbon::createFromFormat('Ymd', $test)->addYear()->subDays()->format('Ymd');

★差分等
<?php
  // carbonをダウンロードしたパス(前回の記事を参考)
  require '/home/○○○/bin/vendor/autoload.php';

  use Carbon\Carbon;

  // 今日
  echo Carbon::now();
	
  // 昨日
  echo Carbon::yesterday();
	
  // 明日
  echo Carbon::tomorrow();

  // 現時刻のタイムスタンプ
  echo Carbon::now()->timestamp;
		
  // 一週間前
  echo Carbon::now()->subWeek(1);
	
  // 一週間後
  echo Carbon::now()->addWeek(1);
	
  // 一ヶ月前
  echo Carbon::now()->subMonth(1);
	
  // 一ヶ月後
  echo Carbon::now()->addMonth(1);
	
  // 一年前
  echo Carbon::now()->subYear(1);
	
  // 一年後
  echo Carbon::now()->addYear(1);

  //月初
  echo Carbon::now()->startOfMonth();

  // 月末
  echo Carbon::now()->endOfMonth();
	
  // 一ヶ月前の月末
  echo Carbon::parse('-1 month')->endOfMonth();
	
  // 一ヶ月後の月末
  echo Carbon::parse('+1 month')->endOfMonth();
?>

日付のみ表示したい場合
<?php 
  $carbon = Carbon::now();
  echo $carbon->toDateString();
?>
日付の書式を変更したい場合
<?php 
  $carbon = Carbon::now();
  echo $carbon->format('Y年m月d日');
?>
生年月日から年齢判定
<?php 
$birthday = Carbon::parse('1990-05-15');
echo $birthday->age;
?>
日付の差分
<?php 
$date1 = Carbon::createMidnightDate(2018, 1, 1);
$date2 = Carbon::createMidnightDate(2018, 12, 31);

//秒
echo $date1->diffInSeconds($date2);
//分
echo $date1->diffInMinutes($date2);
//時間
echo $date1->diffInHours($date2);
//日
echo $date1->diffInDays($date2);
//週
echo $date1->diffInWeeks($date2);
//月
echo $date1->diffInMonths($date2);
//年
echo $date1->diffInYears($date2);
?>




























view   blade に日付フォーマット

<p>{{ \Carbon\Carbon::now()->format('Y/m/d') }}</p>
{{ \Carbon\Carbon::$insures['insured_birthday']->format('Y/m/d') }}
{{ $insures['insured_birthday']->format('Y/m/d')  }}

<p>{{ \Carbon\Carbon::now()->format('年/月/日') }}</p>
{{ \Carbon\Carbon::$insures['insured_birthday']->format('年/月/日') }}
{{ $insures['insured_birthday']->format('年/月/日') }}

上記は配列の場合、エラーになります。
【初心者向け🔰】Flutter（フラッター）とは何か？

## 概要
Flutter について、どんなものなのかをごく簡単にまとめた記事です。

## Flutter とは？
Flutter（フラッター）とは、Google が開発したクロスプラットフォーム対応のアプリケーションフレームワークです。

すごく簡単に言うと、
単一のソースコードを書くだけで、「モバイル」でも「Web」でも「デスクトップ」でも「組み込み系」でも動くアプリを開発することができる技術です。

従来は「Webアプリ」「iOSアプリ」「Androidアプリ」などを、それぞれ別の言語で、別々に開発していましたが、Flutter でたった１つのプログラムを作れば、同じ見た目のアプリを、それぞれのアプリとして書き出すことができるという、とても素晴らしい技術です。
![Flutter_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/77aea4a3-f596-638c-3126-56548472f690.png)
この様な、複数の環境で動作できる技術のことを「クロスプラットフォーム対応」や「マルチプラットフォーム対応」などと言います。

ビジネスの面で見ても、Flutter 等を利用すれば、これまで個別にかけていた人件費・開発費やランニングコストも小さくできます。つまり、技術者側にも、運用・経営側にもメリットのある技術です。

クロスプラットフォーム対応の技術は他にもいくつかありますが、
Flutter は、例えばスマホアプリ開発なら、カメラ操作機能などデバイス固有のネイティブなAPIにもアクセスでき、まるでスマホ専用の言語で開発したのと遜色ないアプリを生み出すことができる、というのが（登場当初の）１つの特徴です。

## Flutter の特徴
ざっくりと簡単にまとめると、以下のような技術です。

- Dart（ダート）という言語で書かれている
- クロスプラットフォーム対応（iOS、Android、Web、Windows、Mac、Linux など）
- ホットリロード（ソースコードを書きながら、リアルタイムに画面に反映する機能）がある
- 高速なアプリ動作
- 「ウィジェット」と呼ばれる部品の集まりで、画面を表現する

## （ざっくり） Flutter の導入・開発の流れ

- 公式サイトから SDK を入手・インストール
  - SDKを配置して、パスを通せば環境構築完了
  - Mac なら Homebrew ですぐ導入完了
- Android Studio、Xcode をPCに導入
  - ビルドして各OSのアプリとして書き出すときに必要
- プロジェクト新規作成
  - 最初はカウントアップアプリがデフォルトで自動生成される
  - 画面右下に＋ボタンがあり、押すと中央表示の数値が増えるだけの簡素なアプリ
  - ここからソースをいじって独自アプリを作っていく
- Google/Apple のアプリの Developer 登録
  - 個人や法人代表なら年額でお金かかる
  - アプリを書き出して、各専用サイトからアプリ申請
  - 審査落ちたら指摘箇所を修正
  - 審査合格で世の中にリリース
  - 身内のみで使用する非公開アプリなら、配布ツール使ってアプリ配布

とりあえず、アプリ申請・リリースするつもりなくても、勉強目的でインストールして触ってみるだけでも面白いです！

※ 環境構築方法や書き方など、より具体的な内容は別記事にします

## 参考

- [Flutter 公式サイト（英語）](https://flutter.dev/)
追認試験を語る

## はじめに
(aoym先生へその節は大変お世話になりました。)
わざわざアドカレを書こうという人に追認試験を経験したことのある人はいないんじゃないか、と思いその経験を後世に残すため今回一枠貰いました。これを読めば追認試験にかかることがいかに愚かなことであるかよくわかると思うので、現在進行形でピンチな人への注意喚起になればなと思います。

## 追認試験について
そもそも追認試験とは必修科目の総合成績が60点未満だった場合のみに行われる最後の試験でこのテストで60点未満をとった場合留年が確定します。
試験があるのは大体3月の中旬ごろです。去年僕が受けたのは3月16日で、午前中にテストがあってその日のうちに合格の連絡が担任より送られてきました。

## 追認試験にかかるな
基本的に2月上旬に学年末試験があり、その結果で一年の成績が決定します。そこで60点未満の教科があった場合、先生にもよりますが提出してない課題、定期テスト・小テストの再試・再再試、追加レポートなどの救済措置を経て成績を60点にしてもらいます。そういった救済措置を経てなお60点未満だった場合や、そもそも救済措置がない場合は追認試験行きとなります。去年の経験から一般科目は救済措置をとってくれることが多いですが、専門科目はあまり期待しない方がいいと思います。実際、僕が受ける試験が一教科に確定したのは2月の20日ぐらいでした。
そこから追認試験に向けの勉強を本格的にしていくわけですが、追認試験を受けるような人なんて一人で勉強しても分からない人か、そもそも一人じゃ勉強する気なんて起きないって人たちなんで、変なプライド捨てておとなしく担当の先生の研究室に行きましょう。
追認試験にかかったら春休みは潰れると思っといたほうがいいです。例えばバイトがある人とかはシフトは入れれないと思っときましょう。ってか入れてる場合じゃないです。特に通年の科目でかかったらまず死にます。死ぬと思って勉強しましょう。僕は半期科目だったので2週間とちょっとで「もう受かる」って言われたんですけど、通年のやつ落ちてたら普通に死んでたと思います。

## 追認試験にかからないために
じゃあ追認にかからないためにはどうしたらいいんだって話ですが、大事なのは3つで
- 提出物を期限内に出す。
- 提出物を遅れても出す。
- 再試はちゃんと60点を取る。
 
この3つです。再試にかかる前提みたいですが、かからないに越したことはないです。
提出物を出すことの何が大事かって言う話なんですが、もちろん成績点が上がるっていう直接的な理由もそうなんですけど間接的な理由もあって、提出物を出しているうえで成績が良くない人の先生からの評価は「頑張ってはいるけど結果が出てない人」になって、こういう人は救済措置をとってもらいやすいです。
で、総合成績が60点未満になっちゃったって人は下の3つのタイプに分けられると思っていて、
-　提出物は出してるけどテストで点が取れてない人
-　提出物は出してないけどテストである程度点は取れてる人
-　手出物は出してないしテストでも点が取れてない人

このうち、1つ目は上記の通り救済措置をとってもらいやすいので何とか耐えれて、2つ目は提出物さえ出せばいいので、先生と話して「提出物を出すから成績を60点にしてもらう」交渉をしましょう。僕は去年3教科ほど救ってもらいました。ただ、総合成績が出てそこで60点を切っていたら問答無用で追認行きっていう先生もいるので、できる限り早く提出して先生に見てくれるように言いましょう。問題なのは3つ目で、これはもう追認確定です。はい。去年の僕はこれですね。今の段階でこういう教科がある人は冬休み頑張りましょう。僕も頑張ります。
で、気づいた人もいるかもしれないんですけど、もしこれ再試で60点取れてたらみんな何とか耐えれるんですよね。だから「再試でちゃんと60点を取る」ことが大事って話になってきます。


## 最後に
今回は追認試験についていろいろ語らさせてもらいました。やっぱりかからないのが精神的にも一番いいのでかからない程度に頑張りましょう。
今回初めて「記事」というものを書きました。文字ばっかで結構読みにくいのが出来上がっちゃったと思うんですが、ここまで読んでいただきありがとうございました。
鈴鹿高専アドベントカレンダー2022/12/23 「追認試験を語る」でした。
モーダルでバリデーションのエラー時モーダルにエラーメッセージ表示

# 今回の対応について
今回laravelを使用し、モーダル画面で送信ボタンが押下された時にバリデーションチェックを行い、
モーダル画面にメッセージを表示するという事をしたく、実装を行いました。

- モーダル画面で送信を押下します。押下時はajax通信でcontrollerへ飛ばします。
- FormRequestを作成し項目名のバリデーションを追加します。
- controllerへ飛んできたときにバリデーションでひかかった場合は
ajaxの方でfailとして受け取ります。バリデーションエラーの<font color="Red">ステータスは422</font>です。
- ステータスが422の時にメッセージを追加するように行いました。


```js:modal_submit.js
$(document).on('click','#form_submit',function(event) {
  var $form = $('#form');
  var id = $('#id').val();
  $form.attr('action', '{{ url('aaaa/aaaa') }}/'+ id);
  // 操作対象のフォーム要素を取得
  $.ajax({
    headers: {
      'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    },
    url: $form.attr('action'),
    type: $form.attr('method'),
    data: $form.serialize(),
    datatype: 'json',
  })
  .done(function(data) {
    $('#modalForm').modal('hide');
  })
  .fail(function(error) {
    console.log('失敗');
    if (error.status === 422) {
      $.each(error.responseJSON, function(id, val) {
        $('#add_task_table').after(`<span class=\"help-block has-error\"> <strong>${val}</strong></span>`);
      });
    }
  });
});
```

```php:modal_submit.php
<form id="form" action="" method="post">
  <div class="modal fade confirm-dialog" id="modalForm" tabindex="-1">
    <div class="modal-dialog" style="width:40%">
      <div class="modal-content">
        <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal"> <span>×</span> </button>
          <h4 class="modal-title">登録モーダル<h4>
        </div>
        <input id="id" type="hidden" name="project_id" value="" />
        {{ csrf_field() }}
        <div class="modal-body">
          <table class="table table-bordered doc-base-table" id="add_task_table">
            <tr>
              <th>名前</th>
              <td>{{ Form::text( 'name', old('name'), ['class' => 'form-control']) }}</td>
            </tr>
            <tr>
              <th>名前2</th>
              <td>{{ Form::text( 'name2', old('name2'), ['class' => 'form-control']) }}</td>
            </tr>
          </table>
        </div>
        <div class="modal-footer" style="border-top:none;">
          <button type="button"class="btn btn-default btn-green btn-primary" id='form_submit'>登録</button>
          <button type="button" class="btn btn-default btn-green btn-primary" data-dismiss="modal">キャンセル</button>
        </div>
      </div>
    </div>
  </div>
</form>
```

``responseJSON``のはこのように入ってきます。

```
{
name: ['名前は必須です']
name2: ['名前2は必須です']
}
```
tableタグの下の表示するようにタグの下にメッセージは表示するように追加しました。

:::note warn
注意
追加するだけなので閉じるときなどにエラーメッセージを消去などは行っておりません。

:::
Javascriptのことはじめ色々

私が唯一書けない（？）Javascriptを学習する機会があったので、色々まとめました。
~~（これで側が作れないですって常套句が使えなくなりました）~~

# 型付け

Javascriptは`動的型付け`。また、型に一貫性を持たない（弱い型）
（個人的にはバグの温床になるから嫌いな仕様です）

```javascript:静的型付け
let qiita = "qiita";
// ⇒実行時にString型で判断される

qiita = 100;
// ⇒代入可能
```

Javaなどの静的型付けとは挙動が異なる。

```java:動的型付け
char qiita;
qiita = "qiita";
// ⇒記載した地点でChar型

qiita = 100;
// ⇒エラーで代入不可
```

# 変数と定数の宣言

constとletで宣言

```javascript
const qiita = "qiita"; // 定数
let qiita = "qiita"; // 変数
```

# 演算子

**至って普通です。**

```javascript
const num1 = 1;
const num2 = 2;
const num3 = 3;

// 四則演算
console.log(num1 + num2);
console.log(num1 - num2);
console.log(num1 * num2);
console.log(num1 / num2);

// 余りと累乗
console.log(num1 % num2);
console.log(num1 ** num2);

// 計算の優先度も普通
console.log(num1 + num2 * num3);
console.log((num1 + num2) * num3);
```

# イベント処理（クリック / WEBページが読み込まれた 等）

```javascript
対象要素.addEventListener(種類, 関数, イベント伝播)
// イベント伝播はデフォルトでfalse
```

```javascript:イベント処理
function hoge() {
    // 処理
}

// クリックイベントが発火した時に関数を呼び出す
addButton.addEventListener("click", hoge);
```

以下はNG。
（今はとりあえず理屈は置いておきます）

```javascript:NG
function hoge() {
    // 処理
}

function fuga(num1) {
    // 処理
}

addButton.addEventListener("click", hoge());
addButton.addEventListener("click", fuga(aaa));
```

# 型の色々

## 型の確認
```javascript
const num = 0;
console.log(typeof num);
```

## 型変換

```javascript:string -> num
const str = "0";
console.log(typeof str)
console.log(typeof parseInt(str));
```

```javascript:num -> string
const num = 0;
console.log(typeof num)
console.log(typeof num.toString());
```

## Array型

（細かいArrayの操作は置いておきます）

```javascript:Array
let array = [];
array.push("hoge"); // 要素の追加
console.log(array);
```

## Object型

```javascript:Object
const object = {
    name: "John",
    age: 30
};

console.log("object: ", object);

// オブジェクトの要素取得はどちらの記載でもOK
console.log("name: ", object.name);
console.log("age: ", object["age"]);
```

# スプレッド構文 / レスト構文

```javascript:スプレッド構文
const array1 = [1, 2];
const array2 = [3, 4];
const log = [...array1, ...array2];

// 配列の中身が展開される
console.log(log); // [1, 2, 3, 4]
```

```javascript:レスト構文
const array3 = [1, 2, 3, 4, 5];
const [x, y, ...z] = array3;

// x, yには配列の要素が分割代入される
// zには残った配列が代入される
console.log(x, y, z); // 1 2  [3, 4, 5]
```

# 高階関数

高階関数 -> 関数を引数に取る関数のこと
~~（私のPCだと高階関数って変換が出なかったです）~~

```javascript:filter
const words = ["a", "bbb", "ccccc"];
// filter 配列に使える高階関数
const log = words.filter(words => words.length > 4);
console.log(log) // ccccc <- 4文字以上の要素が出力される
```

```javascript:map
const array = [1, 4, 9, 16];
// map 配列の各要素に処理を行う
const mappedArray = u.map(x => x * 2);
console.log(mappedArray) // [2, 8, 18, 32] <- それぞれの要素が2倍される
```

# TypeScriptとJavascriptの違いで一番幸せだったところ

**TypeScriptではJavascriptと違い変数に型を宣言できる。**

```typescript:定数
const example: string = "Hello World"
```

関数の引数や戻り値にも同様に型が宣言できる。

```typescript:関数
const hello = (name: string): string => {
    return 'hello, ' + name
}
```

# 参考
https://www.udemy.com/course/vue3-typescript/
グローバル化が進む社内の英語MTGに必死に付いていくためにやっていること

こちらは [EDOCODE Advent Calendar](https://adventar.org/calendars/7645) 2022年12月23日の記事となります。

## 自己紹介
はじめまして、EDOCODEでプロダクトマネージャーをしている山田です。
EDOCODEではPmall事業とPUSHCODE事業という2つの事業に関わっています。
PUSHCODE事業は外国人メンバーで構成されているため、英語でMTGをすることがあります。この記事では、私が英語MTGに必死に付いていくためにやっていることを紹介します。

## 英語MTGで必要なこと

私が10年ほど前に受けたTOEICの結果は600点ほどでした。600点は特に高い点数ではなく、海外旅行で必要最低限なコミュニケーションが取れるレベルです。

そんなレベルの自分が英語でMTGするために必要なことは、以下の3つだと考えています。

- 英語を英語のまま理解する（日本語に訳さない）
- リスニングの集中力を維持する
- 業務に関連する英単語を覚える

#### 英語を英語のまま理解する
発言を頭の中で日本語に翻訳していたら、MTGのスピードに付いていくことができません。
英語を英語のまま理解するためには、日ごろからトレーニングが必要です。

#### リスニングの集中力を維持する
日本語でMTGする場合は、誰かが発言している際に別のことを考える余裕があります。
しかし、英語でのMTGは常に全力でリスニングに集中する必要があります。少しでも集中を切らすと、すぐに話に付いていけなくなってしまうからです。
英語のMTG中は、集中力を維持することがとても大切です。

#### 業務に関連する英単語を覚える
業務で使う英単語は、日常の英語学習で目にする英単語と異なります。
例えば、急にdata migrationという単語が出てきた際に、何の話をしているのか分からなくなりました。
業務に関連する英単語は普段から覚える習慣があると良いです。

これらの3つのことを実践するために、自分が普段またはMTG中にやっていることを紹介します。

## 多読

英語を英語のまま理解するためには、大量の英語に触れることが効果的です。
多読とは、洋書を大量に読む勉強方法です。

英語の問題集1冊の中の単語数は1万語程度だそうです。受験勉強のために問題集10冊読んでも10万語だけで、これはペーパーバック1冊分とほぼ同じ量のようです。

難解な問題集ではなく簡単な英語の本をたくさん読むことで、「使える英語が身に着く」という考えです。

多読をする際に気を付けることは以下の2点です。
- 9割以上の単語を理解できる簡単な本を選ぶ
- 分からない単語が出てきても調べない

この勉強法に興味を持ち、100万語の英語を読むことを目標として多読を始めました。
多読のスタートとして絵本から入ることを推奨されていますが、絵本を継続して読む自身がなかったので、漫画で多読をすることにしました。
特に、過去に何度か読んだことがあり、内容を知っている漫画であれば、知らない単語が出てきてもストーリーは理解できます。漫画は1冊1万語程度なので、とりあえず10巻分を読むこと目指しました。
始めは横文字に抵抗がありましたが、慣れてくると、内容を知っていることもあり、意外とスラスラ読むことができました。知らない単語も結構出てきますが、雰囲気から意味を推測して、辞書を使わずに1冊読むことができました。漫画だとしても英語の本をスラスラ読めたことに少し感動しました。

次の教材に選んだのはハリーポッターです。ハリーポッターは英語学習用の洋書としてはかなりレベルが高い方です。ただ、自分は日本語版のハリーポッターを何度も読み返しており、細かいストーリーまで覚えている自身があったので、ハリーポッターの洋書に挑戦しました。
文章は難しい単語や表現が多いですが、内容を細かく覚えているので、あまりストレスを感じずに読むことができました。

多読によって、英語を日本語に訳さずに理解できるようになったと思います。

## MTG中のシャドーイング

MTG中にただ話を聞いているだけだと、どうしても集中が切れるタイミングがあります。一度集中が切れると、もうその後はBGMを聞いている状態になってしまいます。

私が英語のMTG中に集中力を維持するためにやっていることは、口パクのシャドーイングです。他のメンバーが言っていることを、声に出さず口パクでシャドーイングしています。MTG中にずっと口パクをしているのはかなり怪しいですが、ZoomでのMTG中は画面共有されていますし、対面のMTG中はマスクをしているのでまったく気づかれません。

シャドーイングすることで集中を維持することができ、かつ英語を単純に聞くよりもリスニング能力が向上します。

ただし、シャドーイングにはテクニックが必要なので、普段から練習は必要です。

自分は小説を読みながら、Audibleで朗読を聞き、シャドーイングをしています。オリジナルのスピードでは速すぎるため、0.8倍速にして調整しています。（通常速度は速すぎて無理です。。。）

シャドーイングする際のコツは、感情を込めることです。ナレータと同じくらい登場人物の感情に入り込むことで、イントネーションに抑揚を付けやすく、普段よりも流暢に英語を発音することができます。

## 英語の日報

業務に必要な英単語を覚えるために、日報を英語で書くようにしています。自分が最も使う英単語や表現を効率的に覚えるためにとてもお勧めです。
日報を書くときは、日本語で書いてからDeepLで英語に翻訳しています。自力で英語を書くと、自分の知っている単語や表現を使ってしまいます。日本語から英語に翻訳すれば、新しい単語や表現を学ぶことができます。

## 結論

実際に英語を使うためにやっている勉強は、TOEICや受験勉強の方法とはまったく異なることに気づきました。英語学習の教材を使って新しい単語や文法を覚えなくても、普段から大量の英語に触れることで、表現できる幅が少しずつ広がっていると感じます。
自分の英語能力はまだまだ未熟ですが、仕事でさらに英語を使えるように日々勉強中です。

## 最後に

こちらが今年の [EDOCODE Advent Calendar](https://adventar.org/calendars/7645) の最後の記事となります。
サーバサイドエンジニアの井内さんと塩谷さん、企画・運営ありがとうございました。

Eメンバーが書いたそれぞれ記事から会社の雰囲気がとても強く伝わります。
EDOCODEに少しでも興味のある方は、他の方の記事にも目を通していただけますと幸いです。


現在 EDOCODE では、エンジニア・デザイナー・プロダクトマネジャーを募集しています。
ご興味のある方は、こちらの採用ページも是非ご覧ください。
[https://go.edocode.co.jp/jobs](https://go.edocode.co.jp/jobs)
Vue.jsでjQueryを使いたい

# はじめに
VueとTypeScriptを使用した案件で、jQueryの$.eachと$.inArrayを使いたかったため、Vueに、jQueryを導入しました。

# npm インストール
``` 
npm install --save jquery @types/jquery
```

# import
``` create.vue
import $ from "jquery";
```

# 最後に
以上を行う前は、機能としてはちゃんと動いていましたが、以下のエラーが出ていました。
```
Cannot find name '$'. Do you need to install type definitions for jQuery? Try `npm i --save-dev @types/jquery` and then add `jquery` to the types field in your tsconfig.
```
npm インストールとimportを行いエラーが出なくなりました。
Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「Azure ADの概念」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「Azure ADの概念」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure での ID とガバナンスの管理](https://learn.microsoft.com/ja-jp/training/paths/az-104-manage-identities-governance/)
◇対応するモジュール
[Azure Active Directory の概念を説明する](https://learn.microsoft.com/ja-jp/training/modules/configure-azure-active-directory/3-describe-azure-active-directory-concepts)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「Azure ADの利点と機能」](https://qiita.com/fsd-jume/items/10ccc889bd1696c0a05e)

## Azure ADの概念
### ID
**Azure ADには認証に使用できる様々なIDが用意されている**

**◆User**
・Azure ADによって管理されているUserのID
・ユーザがログインやアクセスを行う際に使用
・個別にアクセス権の付与が可能
・Userをまとめてグループを作成し、グループに権限付与も可能

**◆サービスプリンシパル**
・アプリケーションのID
・アプリをAzure ADに登録することでアプリの認証や認可でAzure ADが使用可能

**◆マネージドID**
・Azure ADで自動的に管理されるサービスプリンシパルの一種
⇒開発者が資格情報を管理する必要がなくなる
・マネージドIDの種類
　-システム割り当て
　　1つのAzureリソースに関連付けて作成されるID(リソース削除と併せて削除される)
　-ユーザ割り当て
　　ユーザ自身が作成し複数のAzureリソースに割り当て可能なID

**◆デバイス**
・ハードウェアに紐づくID
・デバイスの種類
　-Azure AD登録済みデバイス
　　例：BYODなど組織のリソースにアクセスさせたい個人所有のデバイス
　-Azure AD参加済みデバイス
　　例：Azure ADに参加した組織所有のデバイス
　-Hybrid Azure AD Joinを使用したデバイス
　　例：オンプレミスのADに参加した組織所有のデバイス

### アカウント
・データが関連付けられているID
・IDを持たないアカウントは使用不可

### Azure ADアカウント
・職場または学校アカウントとも呼ばれる
・Azure AD/それ以外のMicrosoftクラウドサービス(Microsoft365など)を通じて作成されるID
⇒IDはAzure ADに保存される
・組織のクラウドサービスのサブスクリプションで利用可能

### Azureテナント
・Azure ADの信頼された専用インスタンス
・Azure ADとテナントは1:1の関係 ⇒ Azure ADを追加するとテナントも追加
・1つのテナントは単一の組織を表す
・組織がMicrosoftクラウドサービスのサブスクリプションにサインアップしたときに自動で作成
※Microsoftクラウドサービスのサブスクリプション：Azure、Intune、Microsoft365など

### Azure ADディレクトリ(≒Azureテナント)
・各テナントには信頼された専用のAzure ADディレクトリが用意
・テナントのユーザ、グループ、アプリを含む
・テナントのリソースに対して認証/認可を行うために使用
・複数サブスクリプションを関連付け可能
※1つのサブスクリプションを複数のディレクトリに関連付けることは不可

### Azureサブスクリプション
・Azureクラウドサービスの料金を支払うために使用
・クレジットカードにリンクされている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/0508496c-96e0-b27c-2960-6952ae576eff.png)

## 次の学習内容
**◆AD DSとAzure ADの比較**

https://qiita.com/fsd-jume/items/e017f120a61e93b3f5e1

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
Laravel9 – S3 設定をしてファイルをアップロードする ( create project からの手順 )

# Create Project

```
composer create-project --prefer-dist laravel/laravel:^9.0 laravel9-aws-s3-example
cd laravel9-aws-s3-example
```

# Install adaptor

```
composer require league/flysystem-aws-s3-v3
```

# Edit .env

AWS 情報を .env に設定する

S3権限を持ったユーザーを作成してアクセスキーを発行するなどして ACCESS_KEY_ID / SECRET_ACCESS_KEY を発行しておくこと
バケットはAWSのコンソールからてきとうに作成しておくこと


```diff
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

MEMCACHED_HOST=127.0.0.1

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
- AWS_ACCESS_KEY_ID=
- AWS_SECRET_ACCESS_KEY=
- AWS_DEFAULT_REGION=us-east-1
- AWS_BUCKET=
+ AWS_ACCESS_KEY_ID=**************
+ AWS_SECRET_ACCESS_KEY=**************
+ AWS_DEFAULT_REGION=your-bucket-reagion
+ AWS_BUCKET=your-bucket

AWS_USE_PATH_STYLE_ENDPOINT=false

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1

VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
```

# For debug, Enable throw option

デフォルトだと.envの設定が間違っていてもエラーが発生しないので設定を変えておく

`config/filesystems.php`

```diff
    'disks' => [

        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
            'throw' => false,
        ],

        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
            'throw' => false,
        ],

        's3' => [
            'driver' => 's3',
            'key' => env('AWS_ACCESS_KEY_ID'),
            'secret' => env('AWS_SECRET_ACCESS_KEY'),
            'region' => env('AWS_DEFAULT_REGION'),
            'bucket' => env('AWS_BUCKET'),
            'url' => env('AWS_URL'),
            'endpoint' => env('AWS_ENDPOINT'),
            'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
-            'throw' => false,
+            'throw' => true,
        ],

    ],
```


# Test

Webからではなくても tinker で動作確認出来る

`php artisan tinker`

```
> Storage::disk('s3')->put('example.txt', 'Contents');
= true
```

ファイルを作成したら AWSのコンソールなどでファイルを確認する



# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
Chrome Extensionのcontent script内で、chrome.runtime.sendMessageすると、Uncaught Error: Extension context invalidated. が発生する

# はじめに

- Chrome拡張開発時(Ver2, Ver3共通)、Uncaught Error: Extension context invalidated. が発生する
- ソースも全然替えてないのに・・・
- 突然発生し始めた、解決方法がGoogleしてもAIさんに聞いてもわからない・・・

# 原因

- 読み込み元のソースと、Chromeが読み込んでいる Extension のソースに差がある
- 関連する拡張を、すべて、[拡張タブ](chrome://extensions/)からリロードする
- Uncaught Error: Extension context invalidated. が発生しなくなる
- 拡張をリロードしても発生する場合は、Chromeを再起動してみる
- 拡張をリロードしても、再起動しても発生する場合は、[拡張タブ](chrome://extensions/)で、拡張を削除して再度登録し直す

# さいごに

- Uncaught Error: Extension context invalidated. というエラーに焦りますが、ソースをいじると発生しやすく、盲点になりがちです。
Powerpointのプロパティ情報消したいんや

どうも夢ノ島です。
さて皆さん。Powerpointファイルの資料を社外に送付するときに、PDF化したりするときってありますよね。
今日はちょっと送らないといけない資料があるので、今から早速やってみようと思います。

拡張子をPDFにしてっと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/57c93b65-3871-0305-a35c-f3318b6a0402.png)

じゃあ送信する前に一応中身の確認でもしておきますか。
PDFを開いて・・・ん？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/ec0bc9a4-19dc-110c-7d6b-4c70215e8f4a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/71f2c7c0-6195-cd9f-ebc7-abbe481c7bca.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/e34871b1-bcd2-029f-64ba-67e6d9b1c8ba.png)

<b>「夢ノ島のドキドキ★アドベンチャーNight」</b>

な、なんじゃこりゃー！
そ、そんな文言ファイル名には全然入ってないはず・・・<b>はっ！</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/003dafeb-0788-e597-b777-c8c254798e4f.png)

<b>タイトルに入ってるやん・・・！</b>
※Powerpointにはファイル名とは別にタイトルが設定されています。空白の場合はファイル名がそのままタイトル名になりますが、ファイルをコピーして使った場合、元のファイルのタイトルがそのまま残ります。

↓Powerpointファイルをプロパティから見たとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/2b0d84d1-719d-db65-5ca9-f86319e92788.png)

<b>これはまずい。</b>
今回は気付けたからよかったけど、今後資料を作るときに都度削除するやり方だと漏れかねない・・・

そこで、今回はファイルリストにあるすべてのPowerpointファイルのタイトル含むプロパティ情報を削除するワークフローを作成してみました。

# Powerpointプロパティ情報削除ワークフロー

まずは指定フォルダ配下にあるファイルパスをすべて取得して、データテーブルにします。

```Directory.GetFiles(入力フォルダ, "*", System.IO.SearchOption.AllDirectories)```

取得したらフィルタしやすいように拡張子も付与して、Excelに出力したりします。
（全体の流れはこんな感じ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/0d8870aa-506e-4893-fb61-e04b1715da95.png)

ファイルパスから拡張子を抜き出すのはこれでやってます
```Path.GetExtension(CurrentRow("ファイルパス").Tostring)```

これでファイルパスと拡張子のリストができたので、フィルターして処理対象を絞ります。
今回は「.pptx」「.pptm」の拡張子に絞ってますが、お好みで「フィルターを設定」から増やせます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/34f3158c-6772-57de-5388-030f0b2795e6.png)

肝心なPowerpointプロパティ情報の削除ですが、ポチポチGUIで編集でもいいんですが、今回はExcelマクロ実行で処理できるようにしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/2a36559b-be69-6f21-a018-0693801a42bb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/e782a88e-639d-8ba6-9f58-84fc472a8d3a.png)
※参照からMicrosoft Powerpoint Object Libraryのチェックが必要です

あとはこれにファイルパスを引数として渡す形でマクロ実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/044a52a1-110a-8b80-03ad-ad2f5e6f026a.png)

あとは繰り返しで実行していきます。

ワークフローを実行して…できました。

あとはもう一度PDF化すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/cdead0bb-c50d-6849-03cb-5e805b21c460.png)

ちゃんとファイル名が出ているのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/c6045661-6174-e84e-1d28-6e9682634c45.png)
プロパティもキレイに。

PowerpointをPDF化する際は、こういったひと手間をかけてトラブルを避けていきたいですよね。
Spring Boot フォーム入力のエラーメッセージを簡単に出す

## はじめに

今回はフォーム入力のエラーメッセージを簡単に実装する方法です。

## Entityクラス

今回は書籍投稿アプリのEntityクラスのコードです。

```
@NotBlank(message = "入力必須です!")
  @Column(name = "title")
  @Size(max = 30)
  private String title;

  @NotBlank(message = "入力必須です!")
  @Column(name = "genre")
  @Size(max = 10)
  private String genre;

  @NotNull(message = "入力必須です!")
  @Column(name = "favorite")
  @Min(0)
  @Max(5)
  private int favorite;

  @NotBlank(message = "入力必須です!")
  @Column(name = "content")
  @Size(max = 500)
  private String content;

  @NotBlank(message = "入力必須です!")
  @Column(name = "publisher")
  private String publisher;

  @NotNull(message = "入力必須です!")
  @Column(name = "price")
  @Min(0)
  private Integer price;
```

![スクリーンショット 2022-12-23 10.46.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/aab45b81-6c40-4e5b-01eb-01810cb50159.png)

このようにSpring Bootのバリデーション機能を実装する、@NotBlank,@NotNull,@Sizeなどのアノテーションを後ろに、message = ""と記述するとmessageに指定した通りのエラーメッセージが表示されます。
@Sizeアノテーションにもつけられます。

```
@Size(min = 0, max = 20, message = "20文字以内で入力してください!")
```

以上です。
Laravel – .env で設定したAWS S3の値が空文字が返ってくるんだが


# 問題

.envで設定しているはずが空文字が返って来る。


```php
> env('AWS_SECRET_ACCESS_KEY')
= ""
```

`php artisan cache:clear` でも解決しない。

# 解決


初歩的なミスだった。
.env ファイルで二重に設定していた。


# .envの例

```

AWS_ACCESS_KEY_ID=xxx
AWS_SECRET_ACCESS_KEY=yyy

...(たくさんの行)...

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
```

# 分かったこと

Laravelの .env は丁寧にAWSの例までデフォルトで用意してくれていた。
AWS推しのフレームワークだった。


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
Amazon EC2 のキーペアの管理について

# パターン
秘密鍵は管理者以外には共有しないのが基本。管理者以外の開発者には共有しない。
状況に応じたパターンはあるが、一番の正攻法はIAMを使った方法。

## 1. シークレットマネージャーとIAMで管理する
キーペアの秘密鍵は管理者以外には教えずに、シークレットマネージャーとIAMで管理する。
最も正攻法。

## 2. そのユーザーが持つパブリックキーを認証キーとして登録する
作成したキーペアを教えずに、GitHub等に登録している公開鍵（パブリックキー）を共有してもらう。
それを管理者が認証キーに登録。
退職するタイミングで、認証キーに登録していた公開鍵を削除すればOK。

## 3. 退職者が出るたびに鍵を交換する
秘密鍵を他の開発者に教えて、既に運用している場合。
懸念通り退職者がアクセスできてしまうので、退職者が出るたびに鍵を交換する。

鍵を交換した後は、1や2の運用に寄せた方が良い。

# 関連記事
- [Amazon EC2 のキーペアと Linux インスタンス](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html)
- [AWS Secrets ManagerでEC2キーペア秘密鍵の安全な受け渡しを管理してみる](https://dev.classmethod.jp/articles/managing-keypairs-with-secrets-manager/)
- [EC2のSSHアクセスをIAMで制御できるEC2 Instance Connectが発表されました](https://dev.classmethod.jp/articles/ec2-instance-connect/)
【Docker】コンテナ内でMysqlに接続する

## Dockerコンテナ内でMysqlに接続をする
### コンテナに入る
```
CA8775:toreka 01048656$ docker-compose exec db bash
```

### Mysqlに接続する
```
bash-4.4# mysql -h 127.0.0.1 -P 3306 -u root -p
```

### パスワードが要求されるので入力しエンターを押す
```
Enter password: 
```
※このときパスワードは表示されないので注意(しっかり入力はされています)
 パスワードは.envに記載されています

これでMysqlに接続することができました。

データベースの確認など必要であれば下記コマンドなどで確認してみてください。

```
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| laravel            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)
```
組込ソフトウエア開発概説：CPU、ブートストラップの選定

<h3>■CPU、メモリ、デバイスについての情報</h3>
さて、組込機器向けソフトウエア＝ファームウエアを開発するとなると考えることはたくさんあります。まずはターゲットのハードウエア、具体的にはCPU・メモリ・搭載デバイスについての情報を入手しましょう。
（さすがにこの世界に入ったばかりのエンジニアに、それらも何を使うか考えろとは言われないと思います...）
パソコン向けのCPUはそれほど種類はありませんが、マイコンは対応機能が限定されていたり、搭載されているメモリのサイズが異なるなど、目的に応じて様々な仕様のものが各社から販売されています。

<h4>例）</h4>
ルネサスエレクトロニクス　RX72M

https://www.renesas.com/jp/ja/products/microcontrollers-microprocessors/rx-32-bit-performance-efficiency-mcus/rx72m-high-performance-32-bit-microcontroller-industrial-network-solutions

STマイクロエレクトロニクス　STM32F4

https://www.st.com/content/st_com/ja/products/microcontrollers-microprocessors/stm32-32-bit-arm-cortex-mcus/stm32-high-performance-mcus/stm32f4-series.html

NXPセミコンダクターズ　i.MX8

https://www.nxp.com/products/processors-and-microcontrollers/arm-processors/i-mx-applications-processors/i-mx-8-applications-processors/i-mx-8-family-arm-cortex-a53-cortex-a72-virtualization-vision-3d-graphics-4k-video:i.MX8


おそらくハードウエア開発担当者が開発対象の機器の要求仕様から適切なものを選択してくれて、ファームウエアエンジニアの皆さんには以下の情報が伝えられるはずです。
・使用するCPUと、CPUの設定内容（BSC、PFCなど）、エンディアン
・CPU内蔵のROM/RAMサイズ、外付けのROM/RAMサイズ
・USB、Ethernetなどデバイスと使用するコントローラ（CPU内蔵？外付け？）
これらの情報がファームウエアを開発するときに必要となります。


<h3>■ファームウエアの全体構成</h3>
前回「ファームウエアは、ソフトウエアモジュールを組み合わせて作る」のようなお話をしたかと思います。
WindowsやLinuxなど汎用OSには最初からいろいろなモジュールが入っていますが、リソース（CPUの処理能力やメモリサイズ）が限定されている組込機器ではその機器に必要なソフトウエアモジュールだけを、自分で書いたり外部から入手して、組み合わせて作ります。
一般的な組込機器ファームウエアで登場するソフトウエアモジュールとしてはこんな感じでしょうか。
（下がハードウエアに近い方、上がユーザに近い方）

・ユーザアプリケーション
・ミドルウエア
・デバイスドライバ
・OS
・ブートストラップ

上記の各ソフトウエアモジュールをどうするか、ということの他に、
・開発環境
・デバッグ環境
をどうするか、ということも考える必要があります。

これから一つづつ説明します。まずブートストラップについてです。


<h3>■ブートストラップ</h3>
組込機器に電源を入れると最初に動くプログラムです。パソコンで言うとBIOSのようなもの、というとイメージできますでしょうか。。
ハードウエア固有のCPU設定、ピン設定、メモリ設定を行い、ファームウエアの先頭番地にジャンプするところまでを担当します。以下のいずれかの方法で用意することになります。

・自分で書く
前述のハードウエア情報をCPUのレジスタにセットする、というプログラムを自分でアセンブラで書く方法です。さらに、起動するファームウエアを選択する、ネットワーク経由でファームウエアをダウンロードする、などより複雑な処理をブートストラップに持たせる場合は、全部アセンブラで書くのは現実的ではないので、最低限必要な部分のみアセンブラで書いて、本体のプログラムの先頭番地にジャンプさせる場合もあります。

・外部から入手する
先に「自分で書く」を書いて怖がらせましたが、ご安心ください、それは昔のお話で、今はほぼ100%外部から入手するものを使います。というのも、よっぽどマイナーなCPUを選択しない限り、世の中にはCPUベンダやサードパーティがマイコンの評価基板というものを出しており、その上で動くブートストラップがついているからです。

<h4>例）</h4>
ルネサスエレクトロニクス　RX72Mネットワークソリューション

https://www.renesas.com/jp/ja/application/industrial/rx72m-network-solution

STマイクロエレクトロニクス　STM32429I-EVAL

https://www.st.com/ja/evaluation-tools/stm32429i-eval.html

NXPセミコンダクターズ　8MNANOD4-EVK

https://www.nxp.jp/design/development-boards/i-mx-evaluation-and-development-boards/evaluation-kit-for-the-i-mx-8m-nano-applications-processor:8MNANOD4-EVK

今はこういったマイコン評価基板についてくるブートストラップ・サンプルプログラムをベースにファームウエア開発を進めて、実際の製品ハードウエアができてきた時点で評価基板との差分だけ書き換えて移植することになると思います。

------
■今日の閑話
申し遅れました、筆者はCente（セント、と読みます）の中の一人です。Centeは上記のファームウエア構成に出てくる「ミドルウエア」のブランドで、我々がこの事業を始めて今年でもう20年になります。この業界の老舗だからこそ持っている実績とノウハウで、この世界に初めて入った皆さんの良き相談役になりたいと考えています。ただ、「エンジニア視点で一緒に良い製品になるよう考えたい」気持ちが先行してしまい、商談の場で「その仕様ならCente使わない方が良いです」と言い放って同席した営業の人を慌てさせたのは私です。(笑)
次回はおそらく最も悩ましい「OSの選定」です。


Cente：
https://www.cente.jp/
STM32G071とカラーOLED、SSD1331にアイテムを表示する(drawBitmap)


x Adafruit SSD1331 OLED Driver Library for Arduino を　インストール
x Adafruit GFX Library を　インストール

x 回路は、Arduinoと同じ

目的
カラーOLEDのテスト

sclk 13　, SCL
mosi 11 , SDA
cs 10 , CS
rst 9 , RES
dc 8 , DC

有機ＥＬディスプレイ　０．９５インチ　９６×６４ドット　ＲＧＢ
[QT095B]
通販コード　P-14435
発売日　2019/09/02


参考


https://qiita.com/ELIXIR/items/cd634aff3a1b45398cf7


https://qiita.com/osobono/items/184c6139dd14ce0bc249



![o_cop273.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/dc9ff19d-f32f-4630-a3df-7fefed3881f1.jpeg)



![o_cop274.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a455c96d-56d9-acaa-3e24-25efff88e0ad.jpeg)


![o_cop275.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/990c082f-b655-6063-2aea-57f3ecf292fe.jpeg)


いろいろ
なんか、しらんが、「モーレツ」な勢いで食いついてきてるがなー!!
今日は、カウンターが大漁だー(2022/12/23 16:06)
ヤーレン　ソーラン　大漁だ　ソイヤ　(大漁まつり)(知らんがな)
へーーーー
なんで、文字からパターンに変えた瞬間から食いつきがよくなるんだ
ソフト的には、おんなじだぞ

あと、違いは、カラー

まれにみる「ホームラン」やー酎ハイので寝よう。

まーいいや


プログラム


```c++



//OLED_SSD1331_BITMAP_TEST1_071

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1331.h>
#include <SPI.h>


// You can use any (4 or) 5 pins
#define sclk 13
#define mosi 11
#define cs   10
#define rst  9
#define dc   8


// Color definitions
#define BLACK           0x0000
#define BLUE            0x001F
#define RED             0xF800
#define GREEN           0x07E0
#define CYAN            0x07FF
#define MAGENTA         0xF81F
#define YELLOW          0xFFE0
#define WHITE           0xFFFF


Adafruit_SSD1331 display = Adafruit_SSD1331(&SPI, cs, dc, rst);


// ビットマップデータ
uint8_t databytes[8] = 

{

0b01100110,
0b10101111,
0b10111111,
0b11011111,

0b01111110,
0b01111110,
0b00111100,
0b00011000

};


//初期化
void setup() {

  display.begin();

  //display.fillScreen(BLACK);

}//setup


//メインループ
void loop() {

  // 画面表示をクリア
  display.fillScreen(BLACK);

  //ビットマップの表示
  display.drawBitmap(0, 0, databytes, 8, 8,  RED);


  delay(1000); //1秒待つ

}//loop



```
ruby 練習問題４１　（アウトプット用）

3つの整数a、b、cが与えられた場合に以下条件を満たすメソッドを作成する問題。

・aとbの差が1かつbとcとの差が2以上の場合「True」と出力する
・aとcの差が1、かつbとcとの差が2以上の場合「True」と出力する
・それ以外は「False」と出力する

出力例：
close_far(1, 2, 10) → True
close_far(1, 2, 3) → False
close_far(4, 1, 3) → True

以下、模範解答。
```ruby
def close_far(a,b,c)
  x = (a-b).abs
  y = (a-c).abs
  z = (b-c).abs

  if (x == 1 && z >= 2)
    puts "True"
  elsif ( y == 1 && z >= 2)
    puts "True"
  else
    puts "False"
  end
end
```
以下、解説。
close_farメソッドを作成してx,y,zに代入。
```ruby
def close_far(a,b,c)
  x = (a-b).abs
  y = (a-c).abs
  z = (b-c).abs
```
xにaとbの差、yにaとcの差、zにbとcの差
ここでabsメソッドを使用。
absメソッドとは対象となる数値に対して絶対値を取得する事ができるメソッド。
正の数に対してはそのままだが負の数に対しては符号を取り除いてくれる。
例えば、-5 → 5のようになる。
そしてif文で条件分岐
```ruby
if (x == 1 && z >= 2)
    puts "True"
  elsif ( y == 1 && z >= 2)
    puts "True"
  else
    puts "False"
  end
end
```
x ==（等しい）1 &&(かつ) z >=(以上) 2
でTrueを出力
y ==（等しい）1 &&(かつ) z >=(以上) 2
でTrueを出力
それ以外は
Falseを出力
laravel タスクスケジューラー 単一サーバ上でのタスク実行指定

:::note info
この記事は[miriwoお一人様 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/miriwo)の23日目の記事です
:::

# 概要

- タスクスケジューラーにて1つのサーバでのみcommandを実行してほしい時の設定方法をまとめる。

# 方法

- `$schedule->command()`のメソッドチェーンに`onOneServer()`を付与する。

    ```php
    $schedule->command('hogehoge')
        ->onOneServer();
    ```

- コマンド（バッチ）実行サーバが複数あり、すべてのサーバで実行する必要のない処理（集計処理など）は本メソッドを指定することで複数サーバでの実行を防げる。

# 参考文献

https://readouble.com/laravel/8.x/ja/scheduling.html#running-tasks-on-one-server
Jupyter Notebook内でSQLを操作する方法

# はじめに
* データ分析の勉強をしている初心者かつSQLの環境構築がめんどくさい人向けに、SQLのコマンド練習が出来るように書きました


# １．マジックコマンドを使えるようにする
まずは以下のコードをそれぞれ打ち込み、SQLを使えるようにする

```
pip install ipython-sql
```
```
%load ext-sql
```
そうするとコマンドの最初に%%sqlと入力することで、そのセルだけSQLのコマンドが使えるようになる

# ２．SQLサーバーを立てる
次にSQLサーバーを立てるが、今回はOSSであるSQLiteを使う。
環境構築を必要とせずライブラリ感覚で使える。
```
%sql sqlite:///tmp.sqlite3
```
これでもうSQLは使えるようになった。
ぜひSQLコマンドを入力して試してほしい
```
%%sql
SELECT 'Hello' as World
```
しかし、ただ単にSQLが使えてもPandasでいいじゃんとなりそうなので互換性を持つためにデータの共有をするためのコマンドを以下に記載しておく

# ３．PandasからSQLにデータを送る
最初にPandasにデータを読み込んでもらった場合
```
import pandas as pd
df = pd.read_csv('データへのパス')
```
そしてデータをSQLに送る
```
df.to_sql('自分でつけるテーブル名','sqlite:///tmp.sqlite3（サーバー名）')
```
そうすると出力結果として謎の数値が出てきますがこれは行数なので気にしないでください。

# ４．SQLからPandasにデータを送る
例えばデータを抽出してPandasに送る場合は以下の通りである
（今回はgroup byでまとめてその個数も表示するような状態）

```
data = pd.read_sql_query(
'''
select カラム, count(*) as num
from テーブル名
group by
    カラム名
order by
    num desc
''','sqlite:///tmp.sqlite3（サーバー）')
```

要約すると
```
data = pd.read_sql_query('''SQLコマンドでデータ選択''','もらってくるサーバー')
```
後はSQLでのデータ加工をし放題です。
サーバーとの通信を確認するコマンド備忘録


SQL/Webサーバーを立てたり、特定のサーバーにSSHでログインする際に、ネットワーク周りの確認は必須である。それらネットワーク設定の確認コマンドを一覧化した。

### 特定のIPと通信ができているか確認

```
ping 192.168.***.***
```


### 特定のIPのサーバーの特定のポートが開いているか確認

```
Test-NetConnection -ComputerName 192.168.***.*** -Port 80
```

### 現在アクティブになっているTCPの通信状態を調べる

```
netstat
netstat -n //名前解決前のIPアドレスで表示
netstat -f //ドメインネームをフルで表示
netstat -p //プロセスIDを表示
```

### ARPテーブルの確認
MACアドレスとIPアドレスの対応表が表示される
```
arp -a
```

### ルーティングテーブルの確認
宛先ネットワーク(IP/サブネット)とインターフェースアドレスが載っている。

```
route print
route
```

### DNSサーバーで名前解決できているか確認

```
nslookup www.sagawa-exp.co.jp
```

### IP/マスクなどネットワーク設定の確認

```
ipconfig
ipconfig /all
ifconfig
```