OmniAICreator/Qiita-1.07M huggingface dataset:
（工事中）スマートデバイスやクラウドについての研究（Tuya,SmartLife等）

# はじめに

最近、職場で新しいシステムを作るかもという話が出てきました。前回のシステムに関わった際に、もっとこうなっていればという苦い思いを何度したような気がします。
もし新しいシステム開発等に自分も関われるのならば、ぜひとも前回の経験から追加してほしい機能を提案したいものです。

ただ、いざクラウドシステムの導入を進言してみると、かなり反発がありました。そのことについても書いてみたいと思います。


# クラウドシステムは何が便利なのか？
クラウドシステムは最近の流行りでよく耳にしますが、なぜこれが支持されるのかというのを考えてみたところ、

## サーバーをレンタルすることができる。オンプレミス型のように自前で建てる必要はない。

この点は大きいと思っています。前回のシステムはオンプレミス型です。10年以上経ちますが、サーバの通信関連での不具合は正直日常茶飯事です。AWSなどのクラウドサーバ側も同じようなことはあるかもしれませんが、自分たちで全部修正する必要はなくなると思うし、現在の少数で運営で対応するのは正直難しいと思っています。

クラウドサーバにはレンタル料が発生するから敬遠したいという話もよく出ました。しかし、現在のオンプレミス型の自前サーバで発生する障害対応を行っても対価を得ることは難しいです。現在のシステムのコストが適正なのか検証したいです。




## wifi搭載モジュールの低価格化で、機能集中型からクラウドを介した機能分散型端末の開発・発展を加速する可能性

前回のシステム端末はもう20年弱前に設計が始まったのですが、今との違いはインターネット接続が前提ではない時代でした。

<!-- 
当時は電話回線でDTMF信号で信号を送信するというのがメインの時代で、電話回線の通信速度なんていうのは1秒間に2～６byte程度起これたらよいみたいな感じです。。
そのため、回線に乗せる信号は最小限にする必要があったため、簡単に信号を送信することはできませんでした。やっていたら電話代がいくらかかるかわかりません。
そのため、親機からRS485通信で複数の子機と通信してセンサ信号のポーリングを行って、通報が必要な信号を常に検索するというのを親機が全部やるようなCPUプログラムが組まれていました。

親機ー複数子機間をRS485通信のための有線を敷設しなければいけないですし、通信ノイズも考慮しなければならずかなり複雑な配線となっていました。このような配線もクラウド化できると解放される可能性が高いと思います。
-->


ADSLとかが出だしていましたが、当時は回線障害や回線工事などで一時的に止まる等がよく発生していました。

しかし、もう時代は変わったと思います。ペイペイとかスマート決済サービスなどで当時のような回線断が頻繁に起こっていたら、誰も使わないでしょう。そういうのが一応を解決できたら今の活況があるのだと思います。

## クライアントサービス開発に集中できる。
クラウドサービスを手軽にレンタルして利用できるようになれば、開発スタイル等もかなり変わってくるのではないでしょうか。

## ESP32など安価にwifiを搭載したモジュールが販売されるようになってきた
ESP32等の手軽にネット接続できるようなモジュール基盤が安価に変えるようになってきたことは、クラウド化の流れを加速するでしょう。
収集したデータをとりあえずクラウドに流すというプログラムだけ書けばよいと割り切れば、作業コストも大幅に削減できるかも。

今までのように、通信機器を中心として、センサー、表示器、入力機等などを有線で繋げていくようなシステムだと、コストも基板内の部品点数や部品配置による省スペース化が難しくなるなど、いろいろな問題がありました。（前回のシステムはとてもハイスペックなハードウェアではありましたが、大きさはパチンコ台のようでした）

各機能をそれぞれを単体の端末として開発し、必要なものだけ追加して、有線ではなくネット通信を介したクラウドで管理するようなものがシステムに移行していければ、開発面でも設置・運用面でも今までとは全く別のやり方や発想もでてくるかもです。


<!-- 
これもESP32など安価なwifi搭載モジュールを搭載したIoT用の基板が販売されるようになったことが大きいと思うのですが、収集したデータはとにかくクラウドに流すという
-->

# Tuya対応機器というのをaliexpressで発見
3年くらい前に、IoT機器としてAmazon Echo Flexのセンサー機能とalexaに対応したACコンセントを組み合わせたリレー出力システムをこのアカウントの記事として紹介したことがあります。

3年程度しか経過していませんが、IoTやクラウドサービスはさらに発展してきているように感じます。
個人レベルでもIoTサービス的なものが開発できたりするのかな？と感じ、AWS IoTやAmplfyなど見てみると、大体のテンプレ的なプログラミング的なものがあるらしいということはわかりました。
AWSなどクラウド側のログインシステム関連などのテンプレを使用すれば、ローコードでスマホシステムでよくあるやり方的なシステムが組めるらしいですが、やはり細かいところはそれ相応の知識が必要と感じます。まずプログラミングを始める前に、大方の仕様やデザイン、それとAWSの開発環境に対する知識は必須のように感じました。（やっぱり大変でしたプログラミングとか正直大変でしたTT）

また、大方の仕様（スマホアプリでのログイン画面とか、ユーザーが端末を登録する等の操作等など）

そういうことを思っていたら、すでに私が作りたいと思ってるシステムってAmazonでは売ってないのか？

という疑問が出てきました。

Amazonではあまり同様のホームシステムというのはみつかりませんでした。（panasonicのホームシステムは親機と子機間は省電力セキュリティ426Mhzで通信）

aliexpressではホームセキュリティを検索してみると、たくさんの装置が販売されていることがわかりました。特に”Tuya”というロゴが付いた端末がたくさん売られていることに気が付きました。(続く)
Teratermコンソール接続

CiscoSwichにコンソール接続したが、シリアルポート用のドライバがなかったので、接続出来なかった。そこで、ドライバをインストールして接続を試みた。
なお、シリアルポートを選択しているが、Enter押しても接続できないなら、デバイスマネージャーの`ポート(COMとLPT)`をプルダウンして`USBSerialPort(COM番手)`が無ければインストールする必要あり。

<img width='400' alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/3f2d9977-ea58-d456-0be1-3c04070ff982.png">

## ドライバインストール
https://ftdichip.com/wp-content/uploads/2021/08/CDM212364_Setup.zip

上のURLからダウンロード。(winddows用)

<img width="400" alt="ドライバインストール１.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/b99ac666-257b-e69c-5d43-9c43043b8f2d.png">

ダウンロードしたアプリをダブルクリック。
「このアプリがデバイスに変更を加えることを許可しますか？」と画面が出ますので、`はい`を選択。



<img width="400" alt="ドライバインストール２.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/059d0a16-fab8-ea33-4b32-cea164e33437.png">

`Extract`を選択。


<img width="400" alt="ドライバインストール３.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/1f212628-3d8b-22c7-ea1e-f2ce4da98aa6.png">

`次へ`を選択。


<img width="400" alt="ドライバインストール４.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/aa0fc871-1eaa-db50-7642-a2a1e7ec5141.png">

`同意します`にチェックを入れて、`次へ`を選択。

<img width="400" alt="ドライバインストール５.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/93eaeec5-c6b6-81c8-7b7d-9c30167ad253.png">

`完了`を選択。

<img width="400" alt="ドライバインストール６.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2929519/a494b0f0-fc80-adbc-d81f-b69c9bae48ca.png">

シリアルポートが選択できるようになり、コンソール接続が出来る。
【備忘録(エラー解消)】"App\Http\Controllers\Request" does not exist

# この記事の目的
- laravel9にてstoreメソッドのテスト実行時に出たエラーについての備忘録

# エラー
エラー内容
```
Class "App\Http\Controllers\Request" does not exist
```

# エラー原因
- 簡潔にいうとエラーで表示された内容通り`App\Http\Controllers\Request`が通っていないということ。
- storeメソッドの引数を勝手に変更してしまったこと

#### 詳細
laravel9でプロジェクトを作成しコントローラー等を作成した後にデフォルトのstoreメソッドを参考にしていたサイトと同じように下記のような変更を行なってしまっていた
```
public function store(StoreTaskRequest $request)
```
```
public function store(Request $request)
```
これによって`use App\Http\Requests\StoreTaskRequest;`が記載されたいたものが使用されなくなり
わざわざ`use App\Http\Controllers\Request`を記載しなければいけない状態にしてしまっていた。

## エラー対応
- 対応もそもそも必要なく`public function store(StoreTaskRequest $request)`を使用すれば良いだけ.
- `public function store(Request $request)`するなら`use Illuminate\Http\Request;`を追加する
参考しているののもバージョン等が違うことやなぜ記載が異なるのかを考えてなく脳死で作業していたことがいけなかった、、戒め

# エラーが出た経緯（一応）
作成したstoreメソッドのunitテストを実行したら上記のエラーが表示された
#### ①storeメソッド
処理はシンプルにリクエストで送られた情報の登録
```app/Http/Controllers/TaskController.php
    /**
     * @param  Request  $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function store(Request $request)
    {
        $task = Task::create($request->all());

        return $task
            ? response()->json($task, 201)
            : response()->json([], 500);
    }
```
#### ②テストコード
```tests/Feature/TaskTest.php
    /**
     * @test
     */
    public function 登録テスト()
    {
        // 登録するデータの作成
        $data = [
            'title' => 'テスト投稿'
        ];
        // storeメソッドはpostで受け取るためpostJsonとし第２引数にデータを指定する
        $response = $this->postJson('api/tasks', $data);
        dd($response->json());

        $response->assertStatus(201);
    }
```

#### ③テスト実行
```
vendor/bin/phpunit tests/Feature/TaskTest.php --filter "登録テスト"
```

# 参考サイト
[Laravel - 対象クラス [App\Http\Controllers\Request] が存在しない - 解決済み](https://www.itsolutionstuff.com/post/laravel-target-class-apphttpcontrollersrequest-does-not-exist-solvedexample.html)
BertとWord2vecを組み合わせて謎かけWEBサイトを作ってみた。

お遊びアプリとして
BertとWord2vecを組み合わせて謎かけWEBサイトを作ってみた。


https://nazokake.suicacello.link/


## 謎かけって何
以下のようなもの
　　お題：野球
　　「野球」とかけて「システム」と説く　
　　　その心は!どちらも「捕手/保守(ホシュ)」がつきものです。

## 謎かけAIでやるには
- ×ねずっちの回答を学習させるにはデータ量が足りない。
- 〇既存の学習済みモデルを使う。

使った技術は
- Bert（2018年：Googleの自然言語処理モデル）
   文章としての正しさを特定
- Word2Vec（単語をベクトル化し類似度を推測）
   単語の類似度を特定

## アルゴリズム

![謎かけ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22057/6199fd00-382b-e199-1876-dc5bc9f03674.png)
事前に何個かの定型文を用意する。
```
XXXにYYYは必要です
XXXはYYYが課題です
```
2.定型文のXXX(例：利根川)の部分にお題をいれる。YYYをマスクする。
```
利根川に[MASK]は必要です
```
3.上記をBERTを使って、複数の[MASK]の候補リスト（100個ほど）する。

4.上記だけだと、お題と無関係な単語も出てきやすいので、（「僕」とか、「それ」が）
　word2vecを使って、候補リストで、お題と関係性の強い単語に
　絞り込む
（今回は用水（ようすい）が候補の一つ）

5.上記で絞り込んだ候補リストのうち、**同音異義語のDB** に該当する単語があるか
　求めて、同音異義語の候補リストを求める（今回は羊水（ようすい）が候補の一つ）。

6.候補リストを定型文のYYYにおいてXXXをマスクする。
```
[MASK]に羊水は必要です
```
7.上記をさらにBERTを使って、複数の[MASK]の候補リストを求める（100個ほど）。

8.上記だけだと、候補と無関係な単語も出てきやすいので、
　word2vec.most_similarを使って、候補と関係性の強い単語に
　絞り込む(この場合：出産)

9.上記で複数候補がでてくるので，一定の判断基準で並べ変えて出てきたものを解答する。（BertのスコアとWord2Vecのスコアでソート、多少ランダム要素を入れています。）


## 同音異義語のDB

こちらのVocabulary Database for Reading Japanese (VDRJ) Ver. 1.1
重要度順語彙データベース (Top 60894)　重要度順位　00001-60894 (42MB)
から作成
http://tatsuma2010.web.fc2.com/VDRJ_Ver1_1_Research_Top60894.xlsx
感謝です。

# 今後の課題
 * 時事問題に弱い。BERTや同音異義語の辞書を改める。
 * いくつかの候補の中から、何が最適解かを判断するのが難しい。
G検定対策〜定理・法則系〜

来月3日 / 4日にあるG検定に向けて、対策資料作りました。
今回は〇〇の定理系のものを一覧。


## ノーフリーランチ定理
あらゆる問題を解くことができる万能な機械学習モデル・アルゴリズムは存在しないと主張する定理

## みにくいアヒルの子定理
「普通のアヒル」と「みにくいアヒル」の区別はできず、類似性が同じになるという定理
仮定がないと分類はできないため、何らかの仮定に基づいて主観的に特徴量を選択することが必要ある。

## バーニーおじさんのルール
学習には調整が必要なパラメータ数に対して、最低でもその10倍以上の訓練データが必要であるという経験則

## モラベックのパラドックス
高度な推論よりも感覚運動スキルの方が多くの計算資源を要するというパラドックスのこと
コンピュータにとっては、高度な知性にもとづく推論よりも1才児レベルの知覚や運動のスキルを与える方が遥かに難しい、もしくは不可能である

## ムーアの法則
半導体の性能と集積は18ヶ月ごとに2倍になるという経験則

## 知識獲得のボトルネック
人間が持っている一般常識は膨大なため、それらの知識をすべて扱うことは困難なため、コンピュータが知識を獲得する難しさのこと

## ヒューリスティックな知識
探索に利用する経験的な知識のこと
人工知能では組み合わせの数が膨大で網羅的な探索はコストがかかりすぎるため、ヒューリスティックな知識を利用することで探索を短縮する。
PowerShellでCSVのカラムを抽出する（Get-Content,Import-Csv）

PowerShellでCSVのカラムを抽出する際に、CSVファイルの形式違いでちょっとはまりました。
背景的には元データの行数が多すぎてExcelで処理が出来ないから。
ちなみに壁打ち相手はChatGPTなので、どんな質問したかとかもメモ。



# したいこと


以下のようなCSVファイルの特定カラムを抽出したい。
※カンマ区切り、ダブルクォーテーションで括られている。

```
"Column1","Column2","Column3"
"Value1","Value2","Value3"
"Value1","Value2","Value3"
```

CSVファイルは同じフォルダに複数あり、結果は別ファイルに出力もしたい。


# Get-Content

以下のようなコマンドを実行します。



```
Get-Content ./in_*.csv | Select-Object -Property Column2, Column3 -Unique | Out-File .\out.txt -append
```

処理内容は以下
- `Get-Content`でCSVの内容を読み取り
- `Select-object` -Propertyでカラムの値を抽出
  - -uniqueで抽出した値から重複を配乗
- `Out-file`でファイルに出力。
  - -appendで追記モード。


ですが、出力結果は空でした…


ダメだったポイントは
- Select-object で指定するColumn2,3は2列目、3列目ではなく、Column2という列の**名前**
- ダブルクォーテーションで括られた値がGet-Contentでは正しく取得できない

ダブルクォーテーションについてはChatGPTに冒頭に示したようなCSVの中身を提示することで教えてもらえました。
Column2が行数じゃなくて名前であることは最後の最後まで気が付けませんでした…



# Import-CSV


`Get-Content`はファイルの指定にワイルドカードが利用できましたが、`Import-CSV`でワイルドカード指定するとエラーに。
`Import-CSV`はワイルドカード利用が出来ずに配列をForeachで回す必要がありました。


```
$files = Get-ChildItem .\in_*.csv
foreach ($file in $files) {
    Import-Csv $file.FullName | Select-Object -Property Column2, Column3 -Unique | Out-File out.txt" -append
}
```

途中、配列をForeachで回す際に明らかにPowerShellじゃない構文だったので、指摘して修正してもらっています。
ChatGPT、コードスニペットの左上の言語のところ、かなりいい加減なことに気が付きました。



# Get-Content と Import-CSVの違い

`Get-Content`コマンドはその名前の通り、CSVやテキストだけでなく、様々形式のファイルを操作することが可能なようです。

`Import-CSV`はCSVに特化しているので、`Export-CSV`と組み合わせて活用するのがよさそうです。


# 参考
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/get-content?view=powershell-7.3


https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/import-csv?view=powershell-7.3



https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/select-object?view=powershell-7.3
【備忘録】DjangoでリクエストをPOSTする際に必要な{% csrf_token %}とは何か？

## はじめに
DjangoでリクエストをPOSTする際、formタグに、`{% csrf_token %}`が必要だが、
そもそもcsrfとは何か？ということで備忘録にします。
基本的なことですが、ご了承ください。

```base.html
<div class="card-body">
        <h4 class="card-title">コメントを投稿する</h4>
        <form method="post" action="{% url 'comment_new' snippet.id %}">{% csrf_token %}
            {% bootstrap_form comment_form %}
            {% bootstrap_button button_type="submit" content="コメント" %}
        </form>
</div>
```

## csrfとは？
csrfとは、「クロスサイトリクエストフォージェリ」。
悪意のある実行を、ログインした人が行うこととする、偽装の処理のこと。
ログインした人はその気が無いのに、勝手に記事やコメントがされることになる。
以下は引用。

>ウェブサイトの中には、サービスの提供に際しログイン機能を設けているものがあります。
ここで、ログインした利用者からのリクエストについて、その利用者が意図したリクエストであるかどうかを識別する仕組みを持たないウェブサイトは、外部サイトを経由した悪意のあるリクエストを受け入れてしまう場合があります。
このようなウェブサイトにログインした利用者は、悪意のある人が用意した罠により、利用者が予期しない処理を実行させられてしまう可能性があります。
このような問題を「CSRF（Cross-Site Request Forgeries／クロスサイト・リクエスト・フォージェリ）の脆弱性」と呼び、これを悪用した攻撃を、「CSRF攻撃」と呼びます。
引用： IPA情報処理推進機構

https://www.ipa.go.jp/security/vuln/websecurity-HTML-1_6.html

## csrf攻撃の対策
上記の対策として、以下の処理を行う。
```
①ユーザーが画面表示時に、サーバーからトークンを発行する。
②POSTなどの処理をする際には、このトークンが一致していることで、サーバーは処理を受理する。
```

なるほど、Djangoは上記の処理を行うため、`{% csrf_token %}`が必要なんですね。


## 参考記事

以下の記事も非常に参考になりました。

https://qiita.com/wanko5296/items/142b5b82485b0196a2da
Googleマップで今いる場所から近いドライブスルーが検索できなかったから自分で作った話

# 何についての記事か
タイトルの通りですが、今いる場所から近いドライブスルーを検索するWEBアプリを作りました。作成する上での技術の選定について(主にお金をかけずにリリースするための話)と、作成するに至った動機について記事にします。

# 何を作ったか
こういうWEBアプリを作りました。


https://drive-thru-serch.site/

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316746/3cb4e38b-592c-6405-bea7-d9b0cb64907b.png" width="200">

できることは、「今いる場所から近いドライブスルーがあるお店を検索できる」アプリです。
※アプリの性質上スマホからの操作を前提としています。PCからでも使えるっちゃ使えます。

## 技術スタック
- デプロイ先
  - vercel
- フロントエンド
  - Next.js
  - tailwindcss
  - Googleマップ（google Maps JavaScript API）
- バックエンド
　 - Next.jsのAPI Routesを使用
- データ収集
　 - WEBクローラ作成(selenium・ruby)
　 - 住所から緯度経度に変換（google Geocoding API）

# どうして作ろうと思ったか
技術スタックの説明をする前に、このアプリを作ろうと思った動機です。
旅行でも何でも良いんですが、車で出かけている時にドライブスルーに行きたいなって思うこと、あるじゃないですか。私の場合不意に「小腹空いたな」とか「喉乾いたな」ということが頭をよぎったが最後、今すぐにドライブスルーに入らないと気が済みません。笑

これがコンビニで何か買うとかだったらコンビニに入ればそれで事足りるんですが、スタバ飲みたいとか、マック食べたいとかの場合はそこに行くしか無いわけです。で、そうなった時に近場のドライブスルーがある店舗はどこにあるんだとなるわけですが、これがなかなか検索できないんです。
「Googleマップとかで調べれば出てくるでしょ」と私も最初はそう思って「スタバ ドライブスルー」とかで検索したんですが、ドライブスルーが無い店舗も検索結果に出てきてしまって、結局一店舗ずつ写真を見て判断しないと分からないんですよね。（これ共感してくれる方いるのかなぁ）

意外と、「近くの」ドライブスルーをサクッと検索できるようなサイトも無かったので、無いなら作るかということで作りました。

テイクアウトで良いじゃんとか言わないでくださいね笑
ドライブスルーがしたいんだよぅ！

# アプリ作成にあたっての方針
使用した技術、フレームワークについてはご覧の通りで、特に変わったことはしていません。詳しい説明はそれぞれキーワードで検索すれば素晴らしい記事がたくさん出てくると思うので、今回の記事ではどうしてこの技術スタックになったのかについてフォーカスを当てたいと思います。

今回のアプリを作る前に決めたポイントについて説明していきます。
## お金をかけない
これは趣味の範疇なのでできるだけお金をかけたく無かったのと、機能もそんなに複雑なことをしない（店舗のデータ取得して画面に出すだけ）ので、ほぼ０円で行けるだろうと考えていました。実際にかかった費用で言うとドメイン代のみでした。主にgoogleという神とvercelという仏様方のおかげなのですが、、、本当にこの内容が無料でできるのは感謝ですね。詳しくどう実現したかはお声があれば書こうと思います。
DBの記載がないですが、スクレイピングしたデータをJSONファイルにしてapiが読み取っているだけなのでDB無しです。店舗のデータもそんなに頻繁にスクレイピングしなくて良いかなと思っているのでたまに自分のPCで回せば良いかなくらいで、特にサーバーを用意したりもしていません。

## シンプルな操作
多機能にすると画面がゴチャついてUX上よろしくないので、できるだけシンプルを心がけました。ユースケースとしては「近くのドライブスルーを探す」なので、それ以外の機能は持たせないようにしました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316746/2bbf5ebd-479e-c374-2922-f2b2d1f033e1.png" width="200">

また、検索結果が近い順に表示されるので一目で近い店舗が分かるのは何気に良いポイントだと思います。
店舗の詳細データや道順といった情報は無理にアプリ内で表示せず、公式ページやGoogleマップ様に投げることでシンプルを保っています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316746/52516d00-7f1e-2deb-d94c-4ef902a324cc.png" width="200">

# 最後に
私と同じ悩みを持った方がどれくらいいるか分かりませんが、もしいらっしゃればぜひ一度使ってみて下さい。
何気にアプリをリリースするのは初めてなので、ご意見があればじゃんじゃん下さい！
それでは、良いドライブスルーライフを！笑
ASE Sybaseのテーブルにテストレコードを大量挿入する方法

ASE Sybaseのバックアップリカバリーテストを実施した時に、テスト用テーブルを作ってデータが正しく復旧できることを確認した時の手順メモ。

## テスト用テーブルを作成

```
CREATE TABLE testtbl_0821
(
 c1 INT NOT NULL,
 c2 VARCHAR(20) NULL
)
GO
```

## テスト用テーブルにデータを投入

```
-- Run a loop to insert 10000 rows
DECLARE @i INT,
        @start DATETIME

SET @i = 1
SET @start = GETDATE()

 WHILE @i <= 10000 BEGIN

 -- Start a transaction
 IF @i % 10000 = 1 BEGIN
    BEGIN TRANSACTION
    PRINT 'Transaction started'
 END

  INSERT INTO testtbl_0821 VALUES (@i, 'Sample data...')
  SET @i = @i + 1

 -- Commit after each 10,000 row
 IF @i % 100000 = 0 BEGIN
   COMMIT
   PRINT 'Committed'
 END

 END

 -- Output the execution time in seconds
 SELECT DATEDIFF(ss, @start, GETDATE())

 go
```

<details><summary>実行ログ</summary>

```
(1 row affected)
(1 row affected)
(1 row affected)
(1 row affected)
(1 row affected)
(1 row affected)
(1 row affected)
(1 row affected)
(1 row affected)
(1 row affected)
(1 row affected)
(1 row affected)

 -----------
           2
```
</details>


## データが挿入されたことを確認

```
select count(*) from testtbl_0821
go
```

<details><summary>実行ログ</summary>

```
 -----------
       10000

(1 row affected)
```
</details>

## リカバリーテストの実施

1. DBのバックアップを取得
2. テストテーブルのデータを削除
3. バックアップを使ってバックアップ取得断面までDBをリカバリー
4. データ削除前の状態に戻っている（10000件存在する）ことを確認

## 用が済んだらテスト用テーブルを削除
```
drop table testtbl_0821
go
```
BarrageSpritesの遊び方

![20230225172250_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/c8bf3873-a578-5ba8-ccb7-f6e30e96b250.jpeg)

# このゲームについて
1対1の対戦シューティングです。
敵を連鎖で倒すことで相手に攻撃を送り合って、2ラウンド制したほうが勝利。

# 遊び方
NeosVRをインストールして以下のURLにアクセス
http://cloudx.azurewebsites.net/open/world/U-e1ght3/R-7d3fa382-145d-46c0-b2ba-3b2cf4a097b3

# 操作
移動:標準機能のFly機能と同等。ダッシュはありません。
トリガーor左クリック：ショット(攻撃力1)
![スクリーンショット 2023-03-01 212703.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/0f730239-467e-44a2-beea-3383afc65947.jpeg)


トリガーor左クリックを2秒間長押しして離す：チャージショット(貫通弾、攻撃力13)
![スクリーンショット 2023-03-01 212720.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/810ab044-d7f3-6860-1dbf-5803be43b7b6.jpeg)


# 基本ルール

### ショットやチャージショットで敵を倒すと爆発するよ
![スクリーンショット 2023-02-25 172939.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/4bebcfd3-7ee2-9eae-6eb9-7b320803ff6d.jpeg)


### これを連鎖させると相手に攻撃できるよ！ 連鎖が長いほど攻撃は強力！！
![スクリーンショット 2023-02-25 172808.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/9962f21a-81a5-ef76-3a68-2d086a21e3e8.jpeg)


### 攻撃されたら、避ける、射撃で撃ち返す、爆破に巻き込んで撃ち返すのいずれかでやり過ごそう！


### 中には破壊も撃ち返しもできない攻撃もあるから気を付けてね!
![20230226135319_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/2ee8028c-e384-2166-f451-5c3b0fb8530c.jpeg)


### 先に2ラウンド取得したプレイヤーが勝利！レッツバトル！！


# 対戦攻略

### ダメージの秘密
雑魚敵にあたると1ダメージを受けて大きく吹き飛ばされるよ！
更にスタン状態になってしばらく移動速度が半分の大ピンチ！！
敵の攻撃やエキストラアタックにあたると3ダメージ！
スタンはしないけどとても痛い！！

### 狙おうパーフェクトボーナス
敵1匹分の爆破だけで全滅させるとパーフェクト達成！
成功すると効果音が鳴って、こちらの攻撃と相手側の雑魚敵の速度がアップするよ！
更に相手からの攻撃速度と雑魚敵の速度が少しダウン！
達成した分だけお得なので積極的に狙おう！！
チャージショットは強力だけど、複数体巻き込まれてパーフェクトが取りにくいので注意。

### 攻撃の応酬
敵を連爆すると通常攻撃が発生(HP2)
![20230301203431_12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/e689e8b4-3968-fa07-24c3-0eb1abcd6da6.jpeg)
コンボが伸びると攻撃のサイズが増大(HP5)
![20230301203622_13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/a9f40773-c368-360b-3741-e4700dcd60d8.jpeg)

通常攻撃を撃ち返すと「リバーサル」が発生
![20230301203530_12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/23890869-a2ea-d3ce-8661-29e7ebd661a1.jpeg)

それを更に撃ち返すと破壊も撃ち返しもできない「エキストラアタック」が発生するよ！
![20230226135259_12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/3ba66a00-37db-b6e2-12e8-f3f03902685b.jpeg)


状況によってはあえて避けた方がお得かも？

### 雑魚敵の生態
雑魚敵は
S・M・L・LLの4つのサイズがあり、HPごとに色が変わるよ
![鶏の色とHP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/8d4f29c5-c104-aaaf-aba0-fc43b5313551.png)
紫(HP5)>青(HP4)>緑(HP3)>黄(HP2)>赤(HP1)


### 雑魚敵は鉾にも盾にもなる
雑魚敵は倒すと攻撃ができるけど
相手の攻撃を爆風に巻き込むことで防御にも使えるよ！
すぐに倒して先制攻撃するか、引き付けて盾にするかは君次第！！

### サドンデス
いつまでも決着がつかないと、警報とともにサドンデスが始まるよ！
お互いの陣地にエキストラアタックが撃ち込まれて
時間が経つと攻撃がどんどん激しくなるので早く決着をつけよう！！
Yii2 で Gmailを使用したメール送信を実装する方法

## config/web.php に メーラーの設定を行う

Yii2の設定ファイルである
config/web.php
内にある
'components'の配列内に以下を記述します。

```php:config/web.php

 'components' => [
   
    'mailer' => [
            'class' => \yii\symfonymailer\Mailer::class,
            'viewPath' => '@app/mail',
            'useFileTransport' => false,
            'transport' => [
                'class' => 'Swift_SmtpTransport',
                'scheme' => 'smtp',//この記述がないとエラーになった
                'host' => 'smtp.gmail.com',
                'port' => '587',
                'encryption' => 'tls',
                //自分のGmailメールアドレスを記述
                'username' => 'your.mail.address@gmail.com',
                //googleアカウント管理/セキュリティ/アプリパスワードで生成されたもの
                'password' => 'yourgmailapppassword',
            ],             
        ],


]

```

以上で基本設定が行えます。
Gmailを開発中のアプリ用に使用する設定は、こちらが参考になりました。

「WebアプリでGmailを使うためのアプリパスワード発行方法」
https://zenn.dev/wtkn25/articles/gmail-web-app-setting

## コントローラーなどでメール送信を行う

あとはコントローラーなどで、以下を記述すれば
送信されます。

```php:SiteController.php

        Yii::$app->mailer->compose()
        ->setTo('sousinnsaki@mail.com')
        ->setFrom('your.mail.address@gmail.com')
        ->setSubject('メールタイトル')
        ->setTextBody('メール本文')
        ->send();

```


日本のYii人口は少ないらしいので、
日本語での情報があまりありません。
参考になれば幸いです。

Yiiは軽量な動作で大規模な開発に向いているとのことですよ。
ASE Sybaseの環境情報を取得する方法


# masterのシステムテーブルを参照
`select SYSTEM_TABLE`
masterデータベースにあるシステムテーブルを参照する事により情報の取得が可能。
他のDBからは権限があれば下記で参照可。
`select master..SYSTEM_TABLE`

| 情報 | システムテーブル名 |
|:--|:--|
| ユーザアカウントの一覧 | syslogins |
| リモートユーザアカウントの一覧 | sysremotelogins |
| ログイン中のサーバーが対話可能なリモートサーバの一覧 | sysservers |
| 実行中プロセスの一覧 | sysprocesses |
| 設定可能な環境変数の一覧 | sysconfigures |
| 定義済のシステムエラーメッセージ一覧 | sysmessages |
| データベース一覧 | sysdatabases |
| データベースへのデータ領域割当状況 | sysusages |
| デバイス(データファイル等)の一覧 | sysdevices |
| アクティブなロックの一覧 | syslocks |
| 使用可能なキャラクタセットの一覧 | syscharsets |


下記を参照。
[SAP Adaptive Server Enterprise | System Administration Guide: Volume 1 - The master Database](https://help.sap.com/docs/SAP_ASE/aa939a27edb34f019f71cc47b9c0fd9a/a744ec23bc2b1014b57d97ad3162b3f2.html?locale=en-US&version=16.0.3.7)
[SAP Adaptive Server Enterprise | Reference Manual: Tables - System Tables](https://help.sap.com/docs/SAP_ASE/ad4a1ddf1bf34768841bd09d1eddf434/ab8ae56fbc2b1014aa84dbfdf57db919.html?locale=en-US&version=16.0.3.7&q=syslanguages)
【iOS】Sandboxのアカウントを変更する方法


## 困ったこと

Sandboxでサブスクリプションの支払いテストを行う際に、すでにアカウントが登録されていて切り替え方法がわからなかった。

<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/2411d8ad-d06f-987d-3dfa-41ba94c1d01b.png">


## 解決方法

設定画面のApp Storeから`SANDBOX` アカウントの項目を確認
設定されているアカウントを外すことで支払いテスト時に最初からアカウントが固定されなくなる。

<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/c49f930e-1f91-3d9d-68dd-d345f3dd1ab8.png">
<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/a3cf994e-0d13-2f81-fefc-4512ebfd8203.png">


## おわりに
とても簡単なことでしたが、どこから変更できるかとても分かりにくかったので備忘録としてまとめました。
マルチサイト時にカスタムフィールド含めて、タグクラウドやカテゴリを共通にする

以下を参考にカテゴリーの共通化はできましたが、
カテゴリーに紐づいているACFのカスタムフィールドは表示されないので、そこを共通化するように変更します。
https://www.tomiryu.com/wordpress/mu-central-taxonomie/


# コード
```php
add_action('init','central_taxonomies');
add_action('switch_blog','central_taxonomies');
function central_taxonomies () {
    global $wpdb;
    global $pagenow;
    $wpdb->terms = $wpdb->base_prefix."terms";
    $wpdb->term_taxonomy = $wpdb->base_prefix."term_taxonomy";
    //追加ここから
    if(is_admin() && ($pagenow === "edit-tags.php" || $pagenow === "term.php")){
        $wpdb->termmeta = $wpdb->base_prefix."termmeta";
        $wpdb->posts = $wpdb->base_prefix."posts";
        //acfはpostsにカスタムフィールドの設定が入るのでカテゴリー編集時のみ親サイトページを読むようにする
    }
    //追加ここまで
}
```
## 解説
termmetaだけそのまま読むようにしてもacfはpostsに各カスタムフィールドの設定が入るので表示されません。
postsを全体で読むようにすると、今度は固定ページなども親サイトの内容を読むようになるので、条件分岐してカテゴリー追加もしくは、編集時のみ読むようにして上げて完了です。

フロントでカスタムフィールドの内容を表示する場合は「switch_to_blog」で親サイトを読むようにします。

## 失敗例
条件分岐させずに直接編集時に読み込ませたほうが良いと思ったので、追加しましたが、おそらく読み込みの順番が遅いので効きませんでした。

```php
add_action('load-edit-tags.php','edit_tags_page');
function edit_tags_page() {
    global $wpdb;
    $wpdb->termmeta = $wpdb->base_prefix."termmeta";
    $wpdb->posts = $wpdb->base_prefix."posts";
}
```
「Webを支える技術」読書メモ#15 リソース設計

:::note info
本記事の内容
[Webを支える技術](https://amzn.asia/d/6TCP9kg)を読んだ際のノートのようなものです。
省略している部分もあり、書籍の内容を完全に要約するものではありません。

今回は第17章以降の内容です。これが最後。
:::

何にリソースとして名前（URI）をつけるかが難しい点。

[読み取り専用Webサービス設計でリソース指向アーキテクチャが登場した](https://qiita.com/masaozi3/items/7d9b6652b318c182230e#%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E6%8C%87%E5%90%91%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3)が、
データを決めてリソースに落とし込むあたりの手法が曖昧。

## Relational Model
ER図でデータモデルを示し、それを元にする手法。

中止となるテーブルの１行ずつをリソースにするなどといったイメージ。
正規表現を崩していくイメージ。

階層表現の解釈が難しい点。

## オブジェクト指向モデル
クラス図から作成する手法。
クラス図から起こすとややこしいが、`処理 ≠ リソース`な点に注意する。

メソッド情報も役に立つのが良いところ。

`has-a`関係、`is-a`関係を考えると、リソースの階層表現がしやすい。

## 情報アーキテクチャ
いかに情報を分類するか（知識やデータの組織化）といった観点で設計する。

ただしリソースに対してどういった操作が可能かは導出できないので、
リソース指向アーキテクチャと組み合わせるとちょうどよい。
「Webを支える技術」読書メモ#14 Webサービス設計

:::note info
本記事の内容
[Webを支える技術](https://amzn.asia/d/6TCP9kg)を読んだ際のノートのようなものです。
省略している部分もあり、書籍の内容を完全に要約するものではありません。

今回は第15〜16章あたりの内容です。
:::

# Webサービス設計？
システムの構成と開発手段を決める。
WebサービスとAPIを一体で考えることが良い設計のポイント。

設計とはバランスを取る作業。
なるべくシンプルに、困ったらリソースに立ち返って考える、いざとなればPOSTで何でもできるということを覚えておくとよい。

# 読み取り専用Webサービス設計
下記を大事にしながら設計すること。
* アドレサビリティ
* 接続性
* 統一インタフェース
* ステートレス性

キーワード的にはWebの重要な要素で出てきたものたち。

### リソース指向アーキテクチャ
1. 提供するデータの特定

2. データをリソースに分ける
    機能からリソースに変換する感じ

3. リソースにURIをつける
    パスの階層でリソースの親子関係を表現する

4. リソース表現を設計する
    XMLなのか？JSONにするのか？
    URIで拡張子指定をさせてあげるか？などなど

5. リソース同士の結び付け
    レスポンスにリンクを入れる

6. イベントの標準コースを決める
    ユーザーの一連の操作を考える

7. エラーの設計

:::note info
ざっくりまとめると

どういうデータを、どう分けて、どういうエンドポイントで提供する。
どういう表現で返して、その内容は何で…
という流れで考える感じ。
:::

# 書き込み可能Webサービス設計
読み取り専用に比べて、書き込み操作がある分難しさが上がる。

下記のような点を考慮する必要がある。
* 操作がバッティングしたらどうするのか
* 複数リソースの操作はどうするか
* 複数の操作手順のかたまりをどうするか

### リソース作成
下記の２パターンがある。
* ファクトリリソースのPOST
* 直接PUT
    * 更新との区別をしなくていいのは楽
    * URIの仕様をクライアント側が守る必要が生まれる

### リソース更新
* Bulk Update
    * 更新しない要素も含め全てを送信する
    * 通信量が膨大になりがち
* Partial Update
    * 一部だけを送信する

PUTだとリソースをURIで指定するので、一般的にはPOSTで行う。

### バッチ
途中で失敗した場合はステータスコード`207`。
または`200`を返しておいてBodyなどで独自に内容を返却する。

## トランザクション
RESTfulにするにはトランザクションリソースが重要。

リソース状態とセッション状態は別なので、分けて考えよう。

## 排他制御
操作がバッティングしたときにのためにリソースに対してロックをかけたりするが、悲観的ロックと楽観的ロックがある。

### 悲観的ロック
ユーザーを信用しない姿勢。
ステータスコードは`423 Locked`を返却する。

### 楽観的ロック
競合したときに考える姿勢。

条件付きPUT/DELETEを使って、変更されてなかったらやるスタイル。
変更されていなければ、ステータスコード`412 Precondition Failed`を返却する。
「Webを支える技術」読書メモ#13 JSON

:::note info
本記事の内容
[Webを支える技術](https://amzn.asia/d/6TCP9kg)を読んだ際のノートのようなものです。
省略している部分もあり、書籍の内容を完全に要約するものではありません。

今回は第14章あたりの内容です。
:::

# JSON?
JavaScript Object Nation

* マークアップはできないけどプログラム的には扱いやすい
* xmlより冗長性が低い

といあったあたりが旨味。

:::note warn
ハイパーメディアフォーマットとして使う事もできるが、その場合はリンクを入れ忘れないように注意すること。
:::

## 細々としたポイント
### オブジェクト
nameとvalueの組 = メンバ
nameは常にString。

### 日時
組み込みはないので、js処理系にも依存しないような標準形式が安定。
ということでいつもの（ISO8061）が使われがち。

### 文字列
エスケープするときは`\uXXXX`の形式。
`\u`の後ろは16進数。

# JSONP
PはPaddingのP。

勝手に情報を転送しないよう、XMLHttpRequest(Ajaxなどで使われる)などでは
クロスドメイン通信が止められてたりする。
そういったときに`<script>`タグを使ってクロスドメイン通信をするためのもの。
Ajaxでは必須。


```mermaid
%%{init:{'theme':'base','themeVariables':{'primaryColor':'#20b2aa','primaryTextColor':'white','primaryBorderColor':'#20b2aa','lineColor':'gray','textColor':'#6A7FABCC','fontSize':'20px'}}}%%

graph LR;

f(("クライアント指定の<br>コールバック関数"))
f--"オリジナルのJSON送信"-->A("ドメインA")
f--"オリジナルのJSON送信"-->B("ドメインB")
```
こんな感じで動く。

レスポンスは`application/javascript`が返る。
「Webを支える技術」読書メモ#12 Atom

:::note info
本記事の内容
[Webを支える技術](https://amzn.asia/d/6TCP9kg)を読んだ際のノートのようなものです。
省略している部分もあり、書籍の内容を完全に要約するものではありません。

今回は第12〜13章あたりの内容です。
:::

# Atom?
Atom Syndication Format
仕様は [RFC 4287](https://www.ietf.org/rfc/rfc822.txt)。

RSSとかをうまいこと扱いたい、拡張性のある標準フォーマットを策定したいという流れで生まれたデータフォーマット。
メタデータを使ってなにかしたい系のアプリケーションで割と活躍する。

外部マークアップを使って拡張することもできる。

## Atomの構成
```mermaid
%%{init:{'theme':'base','themeVariables':{'primaryColor':'#20b2aa','primaryTextColor':'white','primaryBorderColor':'#20b2aa','lineColor':'gray','textColor':'#6A7FABCC','fontSize':'20px'}}}%%

graph TD;

A["コレクションリソース"].-B["メンバリソース"]

B---C["エントリリソース"]
C---D["メディアリンクエントリ"]
B---E["メディアリソース"]
```

### コレクションリソース
<feed>
type=feed
必須要素は同じ

### メンバリソース
最小のリソース単位。
コレクションリソース1つに対してメンバリソースは複数存在しうる。

### エントリリソース
<entry>
type=entry

XML。
ブログ本文とメタデータを保持する。
id, title, author, updatedなどといった情報を持つ。
tagスキームも多い。

Base64エンコードすればcontentに画像を入れることもできるが、重くなる。

### メディアリンクエントリ
画像などの、テキスト化できないもの。

### メディアリソース
XML**ではない。**

## Atomのリンク表現
* alternate
* self
* enclosure
* related
* via

リンクの関係性を表現できる。

# Atom Publishing Protocol(AtomPub)
ブラウザ以外からも操作することができる。

Atomはデータフォーマット。
AtomPubはそのリソースを編集したりするプロトコル仕様。

サービス文書とカテゴリ文書からなる。
サービス文書はメタデータを保持するもの。コレクションリソースのリストを持つが、それに対してCRUD操作はできない。
カテゴリ文書は名前の通り、エントリのカテゴリを保持するもの。

### 注意点
PUTは常に全要素を送る必要がある。
内容を更新したくてPUTする際も同じなので、変更してはいけない要素を変更する危険に気をつけよう。

## 向き不向き
### 向いてるもの
* ブログ
* 検索
* タグ系ソーシャルサービス

### 向いてないもの
* ストリーム系
* メタデータがそもそもいらないもの（そらそう）
「Webを支える技術」読書メモ#11 microformats

:::note info
本記事の内容
[Webを支える技術](https://amzn.asia/d/6TCP9kg)を読んだ際のノートのようなものです。
省略している部分もあり、書籍の内容を完全に要約するものではありません。

今回は第11章あたりの内容です。
:::

セマンティックWebを現実的にするもの。
細かいリンクの意味表がんやイベント情報を表現できる。

microformatsのおかげで人が読むページ(HTML)をWebAPIのレスポンスを共通化しやすい。（らしい）

## セマンティクス？
日本語でいうと意味論。

文脈によって説明が変わる。

* 言語学：ただの文字。音ではなく意味を扱う。
* プログラミング言語：プログラミング言語がもつ意味を確定させる理論。
* Web：リソースが保つ意味を、人にも機会にも意味がわかるように確定させる理論。

### セマンティクス実現の歴史
#### RDF
主語、術後、目的語でメタデータを付与する。
表現力が高いが、その分冗長になりやすく同じ情報でも複数の表現があるなどの課題がある。
また表現する対象のデータと別に作成しないといけない。

#### microformats
RDFが抱えていた課題を全て解決したのがmicroformats。

ただし属性が重複してバグるという新たな課題が発生。

#### RDFa
「名前空間」を作ることでmicroformatsの課題を解決。

## elementalとcompound
microformatsには下記の2つの種類がある。
* elemental：リンク関係でメタデータを表現するフォーマット
* compound：class等を使って階層のあるメタデータ表現するフォーマット
「Webを支える技術」読書メモ#10 ハイパーメディアフォーマット、HTML

:::note info
本記事の内容
[Webを支える技術](https://amzn.asia/d/6TCP9kg)を読んだ際のノートのようなものです。
省略している部分もあり、書籍の内容を完全に要約するものではありません。

今回は第10章あたりの内容です。
:::

# HTML？
マークアップ言語、構造化文書。
HTML5では、アプリケーション用途の拡張がたくさんある。

拡張子は`.html`か`.htm`。
`.htm`は古いOS向けと思って良い。

SGMLベースからXMLベースに進化して今の姿になった。
### メディアタイプの違い
text/html : SGMLベース
application/xhtml+xml : XMLベース 

<details><summary>IEの悲しみ :cry: </summary>
MIMEタイプの`application/xhtml+xml`が使えない。<br>
`text/html`しか使えないのでXHTML1.1は使用できない。<br>
そのためIEでは「なんかうまく表示されない」問題が起きる。
</details>

# XMLの基礎
木構造で要素を読む、というのがポイント。

`要素 = 開始タグ + 内容（ないとき〜は空要素） + 終了タグ`

開始タグには属性を入れれるが、入れ子にできないし順序という概念はないので注意。

## 実体参照と文字参照
#### 実体参照
`<`を`&lt;`と書くなど、XMLで使う文字を別で表現する。

#### 文字参照
XMLの予約記号以外のエスケープする。

## 名前空間
`<html>`でxmlnsを使って宣言する。
どこにも属さない属性はローカル属性。

`xmlns:{接頭辞}="{名前空間名}"`で属性の名前空間を指定できる。

# HTML要素
基本はこう。
```mermaid
%%{init:{'theme':'base','themeVariables':{'primaryColor':'#20b2aa','primaryTextColor':'white','primaryBorderColor':'#20b2aa','lineColor':'gray','textColor':'#6A7FABCC','fontSize':'20px'}}}%%

graph LR;
A[ヘッダ]
B[ボディ]---C("ブロックレベル要素(でかい)")
B---D("インライン要素(その中に入る)")
```

## 属性
idとclassがあって、cssのスタイル指定なんかではどっちも使えたりするが
本来の意味が異なる。

### id
その名の通り、文書内でユニーク。
URIフラグメントなんかで活用する。

### class
その要素が持つ意味を示すメタデータ。

# ハイパーメディアフォーマットとしてのHTML
## いわゆるリンク
1. みんな知ってる`<a>`タグ
こちらはブロック内でリンクする。

2. `<link>`タグ
ヘッダ内でリンクする。ページ同士の関係を表現するもの。

## オブジェクト埋め込み
`<img>`や`<object>`タグ。
ページに埋め込んでいるけど、リソースを結びつけているリンクともいえるね。

## フォーム
フォームコントロール要素（input-type）
`action`でターゲットURI、`inputのid`でクエリパラメータ名を指定する。

リソース操作へのリンクといえるね。
他のリンク手段と違って、POSTもできるのがポイント。

## リンクの意味について
プログラムなどクライアントが人じゃない場合にも、どのリンクをたどればいいのかコンピュータに理解させないといけない。

* rel属性: リンク関係の記述
* microformats: rel属性の拡張

このあたりを使って、リンクの意味を記述することができる。

「リンクをたどる→アプリケーションの状態が遷移する」ということを意識しよう。
Webサービスに使用する技術 (インフラ編)

現在ポートフォリオ作成のためにテーマの検討や使用技術の選定をしています。
インフラに使用する技術についてまとめました。
(2023年2月25日時点でざっと調べてわかったことをメモしています。誤った情報があるかもしれませんのでご了承ください。調査を加え次第随時更新します。)

## Apache
* Webサーバ
* １リクエストに対して１プロセスが処理される

### メリット
* 開発者向け技術情報を入手しやすい
* 重い処理が得意


## Nginx
* Apache で出る問題を解決するために開発されたWebサーバ
* 1プロセスで複数のリクエストが処理される

### メリット
* 速くて高負荷に強い
* 柔軟にカスタマイズ可能


#### 参考サイト
* [ApacheとNginxを比較！それぞれのメリット・デメリットを解説 | GeeklyMedia(ギークリーメディア)](https://www.geekly.co.jp/column/cat-technology/1903_096/#Apache)
* [AWS Fargateとは？Amazon ECSとの関係性やメリット・デメリットを解説｜コラム｜クラウドソリューション｜サービス｜法人のお客さま｜NTT東日本](https://business.ntt-east.co.jp/content/cloudsolution/column-171.html)
Goでのmultipart uploadの実装

## 概要
S3に**5GB以上**のデータをアップロードする際は、[multipart upload](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html)を使う必要があります。Goで実装してみたコードや調査した情報を共有します。aws-sdk-go-v2を使っています。**5MB未満**のデータについては、multipart uploadは対応しておらず、PutObjectでアップロードする必要があるので注意してください。

## multipart uploadの考え方
基本的にはどの言語で実装する際も、以下の手順になると思います。分割データのサイズを決めて、分割回数分、以下の手順の1〜4を行い、最後に手順5を行います。

1. `CreateMultipartUpload`でmultipart uploadを開始し、Upload IDを取得します。このUpload IDは特定のmultipart uploadの全てのpartを関連付けるために使用されます。
2. `UploadPart`で分割データをアップロードします。
3. `AbortMultipartUpload`は手順2で失敗した場合に実行します。エラーが発生する前に、先にアップロードが成功していた分割データの削除を行います。
4. `CompletedPart`にアップロードが完了した分割データの情報を格納します。
分割数分、1〜4のループが終わった後に、以下の手順5を行います。
5. `CompleteMultipartUpload`で全ての分割データのアップロードが完了したことをS3に伝えます。S3はPart numberを元に、昇順にデータをつなぎ合わせて、新しいオブジェクトを作成します。

## 実装
分割データをforループで50MBずつアップロードしています。今回はやっていませんが、goroutineを使って分割データを並列にアップロードすれば、さらに高速化することができそうです。
```golang
import (
	"bytes"
	"context"
	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/service/s3"
	"github.com/aws/aws-sdk-go-v2/service/s3/types"
)

func multipartUpload(client *s3.Client, body []byte, uploadPath string, contType string, fileSize int64, bucket string) error {
	input := &s3.CreateMultipartUploadInput{
		Bucket:      aws.String(bucket),
		Key:         aws.String(uploadPath),
		ContentType: aws.String(contType),
	}
	resp, err := client.CreateMultipartUpload(context.TODO(), input)
	if err != nil {
		return err
	}

	var curr, partLength int64
	var remaining = fileSize
	var completedParts []types.CompletedPart
	const maxPartSize int64 = int64(50 * 1024 * 1024)
	partNumber := 1
	for curr = 0; remaining != 0; curr += partLength {
		if remaining < maxPartSize {
			partLength = remaining
		} else {
			partLength = maxPartSize
		}

		partInput := &s3.UploadPartInput{
			Body:       bytes.NewReader(body[curr : curr+partLength]),
			Bucket:     resp.Bucket,
			Key:        resp.Key,
			PartNumber: int32(partNumber),
			UploadId:   resp.UploadId,
		}
		uploadResult, err := client.UploadPart(context.TODO(), partInput)
		if err != nil {
			aboInput := &s3.AbortMultipartUploadInput{
				Bucket:   resp.Bucket,
				Key:      resp.Key,
				UploadId: resp.UploadId,
			}
			_, aboErr := client.AbortMultipartUpload(context.TODO(), aboInput)
			if aboErr != nil {
				return aboErr
			}
			return err
		}

		completedParts = append(completedParts, types.CompletedPart{
			ETag:       uploadResult.ETag,
			PartNumber: int32(partNumber),
		})
		remaining -= partLength
		partNumber++
	}

	compInput := &s3.CompleteMultipartUploadInput{
		Bucket:   resp.Bucket,
		Key:      resp.Key,
		UploadId: resp.UploadId,
		MultipartUpload: &types.CompletedMultipartUpload{
			Parts: completedParts,
		},
	}
	_, compErr := client.CompleteMultipartUpload(context.TODO(), compInput)
	if err != nil {
		return compErr
	}

	return nil
}
```

## まとめ
SDKの内部で、データの容量からmultipart uploadを行うか判断して、処理してくれると最高なんだけど。求めすぎかな。

## 参考資料
- [Go s3 package](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3)
- [S3のマルチパートアップロードを理解して、異なるS3サービス間でも大容量ファイルを効率良くコピーする](https://zenn.dev/mryhryki/articles/2022-12-01-s3-multipart-upload)
プログラミング初心者1年目が受けたレビュー

## 前置き
初心を忘れない為に、残しておきます。
初歩の初歩が記載してあるので、内容は簡単なものになっています。

## ①不要な改行

```php
      $array = [
                 'a' => 'あ',
                 'i' => 'い'
             ];
      // 改行
      // 改行
      $b = [];
```
メールの文章を書く時みたいに、見やすさを意識して複数行の改行を使用していた。
普通は1行程度でいいみたい。


## ②定数の活用
```php
      $time = 60;
      //↓リファクタ
      $time = config('const.TIME.HOURS');
```
関数内にいきなり数字が出てくるのはよくない(マジックナンバーと言われている)。
定数に定義した方が、何の用途の数字なのかが分かりやすくなる。


## ③関数があるなら使おう
```php
      $fruitList = collect();
      
      if (!$fruitList->isEmpty()) {
      //↓リファクタ
      if ($fruitList->isNotEmpty()) {
```
真偽値の判定を行う時、「!」を使うことがあるが、該当する関数があればそれを使った方が読みやすい。
結構いろんな関数があるから調べると面白い。

## ④タイプヒンティング

```
    public function getUser($id) {
    //↓リファクタ
　　　　　　　　public function getUser(int $id):Collection {
```
引数や返り値に型の宣言をしてあげると、可読性が上がることやエラーを早めに検出できるなどのメリットがある。
タイプヒンディングがあるおかげで、人が書いたコードでもある程度読めるようになるから助かる。


## まとめ
今では初歩的な指摘と思えるが、案外忘れることが多い。
まだまだたくさんレビューを受けているので、今後も役立つものがあれば記事に残していこうと思ってます。
React初心者がAxiosをやってみた

# はじめに
今回はReactでAxiosを使いデータ取得する方法を実践してみました。
## 参考にしたもの
**あべちゃんのフロントエンド塾~Youtube教室~**様の
[【ReactHooks入門】第3回-2：useEffectの理解後編](https://www.youtube.com/watch?v=ivi5fv22Erw&list=PLtbitg0evathYRtNKN3kht99yQCqmjOUm&index=4 "【ReactHooks入門】第3回-2：useEffectの理解後編")

非常に参考になりました。ありがとうございます!

# Axiosとは
[Axios](https://axios-http.com/ "Axios")の公式サイトより引用
>Axiosは、ブラウザとnode.jsのためのシンプルなプロミスベースのHTTPクライアントです。
>Axiosは、非常に拡張性の高いインターフェイスを持つ小さなパッケージで、シンプルに使えるライブラリを提供します。

非常にわかりやすく言うとHTTP通信を簡単に行うことが出来るJavaScriptライブラリ

# プロジェクト作成
```zsh
npx create-react-app axios-tutorial --template typescript
```

## Tailwind CSS導入
プラグインとしてdaisyUIも導入、以下の記事を参照してください。
[ReactにdaisyUIを導入するまで](https://qiita.com/mavengr/items/455c56ece37d03cfa06d "ReactにdaisyUIを導入するまで")

## Axiosインストール
[JSONPlaceHolder](https://jsonplaceholder.typicode.com/ "JSONPlaceHolder")よりデータ取得をするためAxiosを導入
```zsh
npm install axios
```

# ItemList.tsx作成
```src/components/ItemList.tsx
import React, { useState, useEffect } from 'react';
import axios from 'axios';

interface Todo {
  userId: number;
  id: number;
  title: string;
  completed: boolean;
}

interface Post extends Todo {
  body: string;
}

interface Item {
  id: number;
  title: string;
}
type ResourceType = 'todos' | 'posts';

const ItemList: React.FC = () => {
  const [items, setItems] = useState<Item[]>([]);
  const [resource, setResource] = useState<ResourceType>('todos');

  useEffect(() => {
    const fetchItems = async () => {
      try {
        const response = await axios.get(
          `https://jsonplaceholder.typicode.com/${resource}`
        );
        console.log(response);
        const itemData: Item[] = response.data.map(
          (responseData: Todo | Post) => {
            return { id: responseData.id, title: responseData.title };
          }
        );
        setItems(itemData);
      } catch (err) {
        console.error(err);
      }
    };
    fetchItems();
  }, [resource]);
  const onTodoButtonClick = () => {
    setResource('todos');
  };
  const onPostButtonClick = () => {
    setResource('posts');
  };
  return (
    <div>
      <button
        onClick={() => onTodoButtonClick()}
        className="btn btn-primary mx-2"
      >
        Todos
      </button>
      <button
        onClick={() => onPostButtonClick()}
        className="btn btn-secondary mx-2"
      >
        Posts
      </button>
      <ul>
        {items.map((item) => (
          <li key={item.id}>{item.title}</li>
        ))}
      </ul>
    </div>
  );
};

export default ItemList;
```

# App.tsx作成
```App.tsx
import React from 'react';
import './App.css';
import ItemList from './components/ItemList';

const App: React.FC = () => {
  return (
    <div className="App">
      <h1 className="m-7 text-4xl font-extrabold leading-none tracking-tight text-gray-900 md:text-5xl lg:text-6xl">
        Axios Tutorial
      </h1>
      <ItemList />
    </div>
  );
};

export default App;
```

# 完成系
TODOSボタンとPOSTSボタンを押すと、それぞれデータ取得が出来るようになった
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2860566/604d7be9-3d3f-f4cc-4f44-01413ea6dbed.gif)
ExcelのCOUNTIF関数を使いこなせるようになると「結局Excelでいいか」と思うようになった件

# 背景

- 業務で使うExcelで「複数条件によるデータ件数を数え上げたい」というテーマへの取組。
- 約500行のレコード。Excelが管理台帳を兼ねており、このExcel自体をなくすことはできない。
- 「PythonやTableauを使っても良い」というご指示。（※第一感は「そんなの使う気にはならん」）

# ソリューション

そういう時に、検索すると `COUNTIF()` さらに `COUNTIFS()` が出てくる。

>データ分析では、ある「条件」に当てはまる要素の数を調べなければならないケースがあります。そんなときに便利なのがエクセルの「COUNTIF関数」です。
>COUNTIF関数は、「COUNT」と「IF」という文字列が使われていることからもわかるとおり、条件に当てはまるセルの数をカウントする関数です。単純に数値が含まれるセルの数をカウントしたい場合は、COUNT関数を用います。COUNTIF関数は、条件を満たすセルのみをカウントの対象にする関数です。
>まずはCOUNTIF関数の構文を確認しましょう。
>`=COUNTIF（範囲, 検索条件）`

>COUNTIFS関数の構文は以下のとおりです。
>= COUNTIFS（範囲1, 検索条件1, 範囲2, 検索条件2, …）
>各範囲は同じ範囲が指定されていても問題ありません。範囲2、検索条件2以降、ユーザーが望むだけ範囲・条件を指定できます。結果を出力するために条件範囲1、検索条件1の入力は必須ですが、それ以降は任意です。

https://udemy.benesse.co.jp/business/office/excel-countif.html

検索条件はワイルドカードでもOK。
さらに下のような機能と組み合わせたら、やっぱもうExcelだけでいいんじゃないかなという気になり、それでやり遂げた。

https://atmarkit.itmedia.co.jp/ait/articles/2302/13/news019.html

# 振り返り

実際のところ **レコードが数千件までの量ならExcelで十分** 足りるような気もする。
※それ以上になるとさすがに厳しそうだが…

（この項終わり）
スクラム開発におけるミーティング効率化のために必要なこと

こんにちは、Webエンジニアの吉田です。

スクラム開発では、様々なミーティングが行われますが、適切な時間管理が行われないと、開発時間が減ってしまうことがあります。今回は、スクラム開発を行う中で学んだ、ミーティングの時間を短縮し、開発に集中できる方法を紹介します。

スクラム開発を行う方々の参考になれば幸いです。

## 1.デイリースクラム

デイリースクラムは、チーム内の進捗状況を共有し、問題点を洗い出すことで、開発を円滑に進めることを目的としており、通常15分程度で行われます。
短い時間で簡潔に報告を行うために、以下のことを心がけていました。

- 必要最低限の情報のみを伝える
- 開始、終了時間を厳守する

進捗報告を行う中で「詳細な情報を伝える必要がある場合」「開発メンバーのみで共有したい内容」については、デイリースクラム以外の場を別途設け、共有を行いました。
また複数のプロジェクトを兼任している場合も多く、参加者が遅れにより終了時間が遅くなったという場合もありました。対策として「時間が来たら、必ず終わらせる」ことを意識していました。

## 2.スプリントレビュー

スプリントレビューは、開発した成果物をステークホルダーに紹介するために行われます。発表が長くなり、ステークホルダーの集中力が途切れないように、以下のことを心がけていました。

- デモンストレーションの準備をしっかり行う
- ステークホルダーに事前に情報を提供する
- フィードバックを後日まとめて受け取る

スプリントレビューの中で全ての成果物を紹介し、フィードバックを受けると多くの時間がかかってしまいます。あらかじめ成果物を確認してもらい、テキストベースで伝えるのが難しい内容に絞って、説明を行っていました。また次のスプリントで改善する急ぎの内容以外は、後日フィードバックを受け取る等の対策を行い、時間短縮を行っていました。

## 3.スプリントレトロスペクティブ

スプリントレトロスペクティブは、スプリントの振り返りを行うために行われます。時には議論が白熱する場合もあるため、以下のことを心がけていました。

- 時間を決めて厳守する
- 改善点は事前にメモしておく

スケジュールが順調に進まない場合は、反省点が多く振り返りが長引いてしまうことがありました。
タイムキーパーを設け時間管理を行い、円滑に意見を述べるためにも「日々感じた内容を自身でまとめておく」「時間がある際はデイリースクラムで共有する」習慣をつけていました。

## 最後に
これらの内容に加え、ミーティングの必要性を見直すことや、頻度を減らすことにも取り組みが大切です。
実際、週1回の定例会議を別途設けていましたが見直しを行ったことで、全員参加からリーダーのみの参加に変更となり、開発時間を週に1時間半増やすことができました。

スクラム開発のみならず、ミーティングの効率化に取り組んでみてはいかがでしょうか。
Microsoft Teamsの公開チームとその所有者をCSVに出力する🤔

# はじめに

Teamsを運用していると、意図せずパブリックでチームを運用している場合があります。本人も周囲もしばらく気づかないケースも多く、ふとしたときに知らないチームのファイルや更新情報が見えてしまってびっくりすることもあります💪

ということで、管理者としては、パブリックになっているチームを定期的に確認しておくのがおすすめです。組織内とはいえ適切な情報コントロールをこころがけたいですよね。

# まずはモジュールをインストール

```モジュールインストール.ps1
Install-Module -Name MicrosoftTeams
```

# teams_public_owner.csvを作成する。

`Connect-MicrosoftTeams`でTeamsへの接続を確立します。

まず、`Get-Team` コマンドを使用して、パブリックなチームの一覧を取得します。

その後、各チームのオーナーを取得し、オーナーのメールアドレスを含むオブジェクトを作成します。

最後に、`Export-Csv` コマンドを使用して、カスタムオブジェクトを CSV ファイルにエクスポートします。

- NoTypeInformation パラメータを使用すると、CSV ファイルに型情報が含まれないようになります。
- encoding Default パラメータを使用して、CSV ファイルのエンコーディングを既定値に設定します。これを指定しないと、全角文字が文字化けしてしまいます。

```teams_public_owner.ps1
Connect-MicrosoftTeams

$publicTeams = Get-Team | Where-Object { $_.Visibility -eq "Public" }

$teamOwners = @()
    foreach ($team in $publicTeams) {
        $owners = (Get-TeamUser -GroupId $team.GroupId -Role Owner).User -join ', '
        $ownerData = @{
            TeamName = $team.DisplayName
            OwnerEmail = $owners
        }
        $teamOwners += New-Object -TypeName PSObject -Property $ownerData
    }

$teamOwners | Export-Csv -Path "C:\teams_public_owner.csv" -NoTypeInformation -encoding Default

```

# まとめ

これで任意のフォルダにCSVをダンロードすることができます。あとは、batファイルを作成して、タスクスケジューラーで定期実行するもよし、Power Automateで調理してもよし🤔

```hoge.bat
@echo off
PowerShell.exe -ExecutionPolicy Bypass -File "C:\path\to\teams_public_owner.ps1"
pause
```

実運用では、自動メールにしようかと思ったのですが、**意図して公開**にしているチームもあると思うので、自動にしてしまうと除外設定などめんどくさいなと思ったので、時間が空いたときにポチポチメールしてあげようかなと考えています。
アソシエーションとは

本日はアソシエーションについて学んだので投稿します！

○アソシエーションとは
----
モデルを利用したテーブル同士を関連づけることをいいます。



○アソシエーションの使い方
-
まず関連づける時のイメージします。
例えば投稿サイトを作成するとして一人の人が２つ以上投稿するとします。
この場合、一人が２つ以上投稿、つまり「1対多」のつながりがあると考えられます。

この状態の事をhas many（ハズ　メニー）の関係といいます。
今回の場合は「User（人） has many Tweets（複数投稿）」の状態であると言えます。


記述方法
-
user（人）側のモデルファイルに


    has_many :tweets

と記述します。

次にtweets（投稿）側には

    belongs_to :user

と記述します。

このbelongs to（ビロングス　トｳー）は１つの投稿は一人の user（人）が投稿したもの。
１つの投稿は複数人では投稿出来ないよ！っていう時の関係性の時に使われるメソッドです。

今日は以上です！ありがとうございました！！
インスタント通知アプリケーションの作成


質問
+ [I could not see my pop-up messages and those messages in notification window in last 2 steps in Build an Instant Notification App](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JgG81SAF)

+ [インスタント通知アプリケーションの作成 >プラットフォームイベントの定義](https://trailhead.salesforce.com/ja/content/learn/projects/workshop-platform-events/platform-event-define)


何もしないで確認ボタンをクリック

:::note alert
Could not find an object named 'Notification__e'.
:::

複数形を入れるところが表示されない？


Messageをしていない

:::note alert
Could not find a 'Message__c' string field on the Notification platform event. Check field type and possible typos.
:::

複数形なしだがクリアー


+ [インスタント通知アプリケーションの作成 >Lightning コンソールアプリケーションの作成](https://trailhead.salesforce.com/ja/content/learn/projects/workshop-platform-events/create-app)


何もしないで確認ボタンをクリック

:::note alert
The 'notificationConsole' component was not found. Check for typos.
:::

コンポーネントだけ

:::note alert
The 'notificationConsole' Lightning Component controller does not include the expected code.
:::

コントローラを追加

:::note alert
The 'notificationConsole' Lightning Component helper does not include the expected code.
:::

ヘルパーを追加

:::note alert
The 'notificationConsole' Lightning Component style is missing or incorrect.
:::


コンポーネントのスタイル設定して確認したら合格した。なぜ？


+ [インスタント通知アプリケーションの作成 >プラットフォームイベントへの登録](https://trailhead.salesforce.com/ja/content/learn/projects/workshop-platform-events/platform-event-subscribe)

何もしないで確認ボタンをクリック

:::note alert
The 'notificationConsole' Lightning Component markup does not include the expected code.
:::


コンポーネント、ヘルパー、コントローラを変更

:::note alert
It doesn't appear that you've logged into the Bear Watch app yet. Please do so now or log out then log in again.
:::

指示どおり行ったけど、何も変化しない


しかし、確認ボタンを押すと何故か合格

+ [インスタント通知アプリケーションの作成 >プラットフォームイベントの公開](https://trailhead.salesforce.com/ja/content/learn/projects/workshop-platform-events/platform-event-publish)


何もしないで確認ボタンをクリック

:::note alert
The 'BearAlertTopicAssignmentTrigger' Apex trigger was not found. Check for typos.
:::

トリガーだけ

:::note alert
Expected Chatter post not found. Please check for typos and ensure that the #BearAlert topic is present.
:::

チャターを投稿したけど何もおきませんが、ここでも何故か合格

開発者コンソールのログをみたら成功にはなっているんだけど?
「第II幕　Apple：ディレクター」からの学びメモ(2)(リーダーの作法／マイケル・ロップ)

マイケル・ロップ氏の「リーダーの作法　ささいなことをていねいに」を読み解きながら、メモを残しています。

:::note info
各章ごとにまとめていますが、章の原題ではなく**私にとってのまとめ**をタイトルにつけなおしています。
:::

https://www.oreilly.co.jp/books/9784873119892/

この本との出会いと、アウトプットしながら読み解く経緯はこちらの記事で。

https://qiita.com/w2mjra555/items/73fcac51e65dc20e8cba

:::note warn
本文で登場する「ランズ」は、ロップ氏のネット上のハンドルネームです。
「はじめに」で、自身を「ロップ」とも「ランズ」とも呼ぶと宣言しています。
:::

# 第II幕　Apple：ディレクター

「リーダーの作法　ささいなことをていねいに」は、大きくは3部構成になっています。

- 第I幕　Netscape：マネージャー
- 第II幕　Apple：ディレクター
- 第III幕　Slack：エグゼクティブ

今回は **「第II幕　Apple：ディレクター」の13章～15章** について学びメモを残します。

```
第II幕　Apple：ディレクター

13章　陰口・うわさ話・作り話
    13.1　耐えがたく多い厄介事
    13.2　悪気のないミーティング嫌い
    13.3　3 点のアジェンダ
    13.4　ミーティングは症状であって治療法ではない

14章　素敵なほめ言葉
    14.1　過度な満足感が得られる瞬間
    14.2　それはそう
    14.3　ほめ言葉の分析
    14.4　ほめ言葉によるキャリアの転向

15章　手厳しいことを言う
    15.1　頭の中の声
    15.2　手厳しいことを言う
    15.3　手厳しいことを聞き出す
    15.4　人生の目標
```
## 前の記事

https://qiita.com/w2mjra555/items/c33f2069262d53b6c818

## 13章　納得できないことこそ、オープンに

ロップ氏は、**スタッフミーティングの必要性**を語ることを通じて、**チームや組織の腐敗を防ぐ健全さ**をどう実現するかを伝えている、そんな風に読めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/370f7dce-165a-579f-ae06-75d7a4c04208.png)

章タイトルが **「陰口・うわさ話・作り話」** と一見ネガティブ。しかし、これらを**あるはずのないもの、あってはいけないもの**のように取り扱ったらどうでしょう。**完全な逆効果**で、どんどんこじらせてしまします。

**納得できないことこそオープンに**できる。そんなスタッフミーティングをつくらなくては。
アジェンダにあえて **「陰口・うわさ話・作り話」** を盛り込み、そこに**光を当てる**のです。

:::note info
**「この場に価値がありますか」** と
邪心なく問う者あれば、
**「勇気ある発言を
　本当にありがとう」** と
心から歓迎し、いやな顔などしない。

情報の流れを**健全**にし、
**脱線もいとわず。**
重要な課題を、**忖度や例外なしで
率直に**チームで取り扱う。

そういうスタッフミーティングに、
私たちはなりたい。
:::

## 14章　無欲で繊細なほめ言葉は、エレガントな持続性

ロップ氏は、**ほめ言葉の重要性**を語りつつも、よい効果をもたらすほめ言葉の背後には**いくつかの条件がある**ことを示すことで、ほめ言葉を**機能させる難しさ**も示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/2bff210a-3f68-df4b-e43c-809b60dc546a.png)

つまりは、こういうことらしいですが…(たとえ話が私にはちょっと遠かった)。

https://www.ea.com/ja-jp/games/peggle/

>楽しさとワクワクが最高潮の中で、すべてのピンに当てて**ゲームを完了すればエクストリームフィーバーを達成できるぞ。**

**細心の注意**…**無欲**といった言葉が何回も繰り返されます。これは、**ほめることが相手を支配することに結びつくリスク**に、慎重にアプローチしている…ということかもしれません。あるいは **「ほめておけばいいんでしょ」のような思考停止**もリスクでしょうか。

ただ、そんな**ほめ言葉の「暗黒面」** を乗り越える、まさに**細心の注意**さえ払えば。
受け手にとって、**キャリアを左右するほど意味のあるリターン**になることもある。

:::note info
そしてそれは**上品であり、持続的な**、ある一つの冴えたやり方でもある…ようです。
現代的でもあり、同時に普遍的？
:::

## 15章　手厳しいフィードバックは、相手を見ている証
ロップ氏は、**手厳しいフィードバック**について、自分が**言う場合と聞く場合**について掘り下げています。そして**言うと聞くはそもそもセット**であり、双方向性がないままでは**本当には機能しない**ということも示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/422b85d8-c8a6-9481-cd1c-06276fe4b7c8.png)

> フィードバックはとても**価値ある人間同士の取引**です。あなたの一面を**じっくりと観察してくれた**人がいるということです。**他にもやるべきことがあるのに、今日はあなたに時間を使っている**のです。あなたは**自分のことを理解しているつもりでも、そうではない**のです。

**ぐうの音も出ない**です。へへへ(誰だ、変な笑い方をしているのは)。

:::note info
言うのと聞くのと、どちらがつらいか……？
**2つマルをつけてちょっぴりオトナになりたい**です。
:::

## ここまでの雑感
よいことも悪いことも、**よいのか悪いのかわからない**ことも。
あるいは**誰かにとってはよくても、誰かにとって悪い**ことでも。
とにかくフラットに、**痛みや副作用のリスクも受け入れて伝え合うチーム**をつくる。

ただただ、そのための行動を**愚直に積み重ねるんだよ**ということが書いてあるようですね。
まさに、**ささいなことをていねいに。**

## 次の記事
https://qiita.com/w2mjra555/items/0d6c532b169d61fa81b9
VScode + venv + JupyterNotebook + SSHの環境で仮想環境をカーネルに追加する方法

# 背景
私の研究室では研究室のサーバにsshで接続して機械学習モデルの学習などを行っています．
普段はvenvで仮想環境を作って`python3 train.py`みたいにPythonのプログラムを実行しているのですが，急に研究室のサーバ上でJupyterNotebookを使う必要性が出てきました．
しかし，VScodeでそのままJupyterNotebookを開いただけではvenvで作った仮想環境を有効にすることができませんでした．

# 何がしたいか
ssh接続した先にある`.ipynb`ファイルをVScodeで開き，あらかじめ作ったvenvの仮想環境上でpythonプログラムを実行したい．

# 解決策
:::note info
例では`venv`で作った仮想環境をカーネルに指定していますが，anacondaなどのパッケージ管理ツールで作った仮想環境でも指定可能です．
:::

まずはVScodeで使いたいサーバにssh接続します．
VScodeでssh接続する方法はこちらにあります．

https://qiita.com/nlog2n2/items/1d1358f6913249f3e186

VScodeでssh接続ができたら`command+shift+p`でコマンドパレットを開きます．（windowsなら`ctrl+shift+p`）
そこで「python」と打つと 「**Python: Select Interpreter** 」というものが検索に引っかかるのでこれを選択．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842766/5d391f03-68ca-d253-82d3-e7e104a6597e.png)
すると自動で検知されたカーネルがいくつか出現します．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842766/74c52338-efb9-cd65-f87e-e4909111c580.png)
使いたい仮想環境がここにあれば一度`esc`を押してコマンドパレットから離れます．
使いたい仮想環境が無ければ「 **+ Enter interpreter path...** 」を選択してpathで仮想環境を指定します．この時指定するpathは`(絶対パス)/(仮想環境の名前)/bin/python3`です．
サジェストが出るので自分で打たなくてもぽちぽちしていれば追加できます．
無事追加できると先程のカーネル一覧に`python (バージョン)('仮想環境の名前')`という項目が追加されているはずです．

これでVScodeが仮想環境のカーネルを認識できる状態になりました．
次はこれをJupyterNotebook側で選択してあげます．

「jupyter」と打つと「 **Jupyter: Select Interpreter to Start Jupyter Server** 」というものが検索に引っかかるのでこれを選択．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842766/80350ea9-9ef4-0acd-cca3-64851c73cc9e.png)

洗濯が完了すると以下のように自分で作った仮想環境の名前が右上に表示されます．
私の場合は`base`という名前の仮想環境を使っているのでこのようになります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842766/f529320e-cee6-11be-acd6-a71f5e9596a1.png)

これで無事pythonのコードが実行できれば完了です．
お疲れ様でした．