OmniAICreator/Qiita-1.07M huggingface dataset:
ログイン状態の出品者でも、売却済みの商品に対しては「編集・削除ボタン」が表示されないこと

##はじめに##

ひたすらfurimaアプリを作成中です。

今回は複数の条件分岐が重なり、自分でも訳が分からなくなったのでまとめたいと思います。

##やりたいこと##

- ログイン状態の出品者でも、売却済みの商品に対しては「編集・削除ボタン」が表示されないこと

- ログイン状態の出品者以外のユーザーでも、売却済みの商品に対しては「購入画面に進む」ボタンが表示されないこと

①.ログイン中のユーザーと商品を出品したユーザーが一緒の場合かつ、商品が売り切れではない場合は編集ボタン・削除ボタンが出現する。

②.ログイン中のユーザーかつ、出品者以外のユーザーで商品が売り切れではない場合は購入ボタンが表示される。

##最初に作成した記述##

```erb
 <% if user_signed_in? %> #ログインしているユーザー限定
  <% if current_user == @item.user%> #出品者とログイン中のユーザーが一緒の場合
    <% unless @item.purchase_history.present? %> #商品が売り切れてない場合
      <%= link_to "商品の編集",  edit_item_path(@item.id) , method: :get, class: "item-red-btn" %>
        <p class="or-text">or</p>
          <%= link_to "削除", item_path(@item.id), method: :delete, class:"item-destroy" %>
    <% end %>
  <% else %>
    <%= link_to "購入画面に進む", item_purchase_histories_path(@item.id), class:"item-red-btn"%>
  end
```

すんごい重複してしまいました。
もっと簡潔に記述するには。。。
<h3>同じを条件をまとめてみる。<h3>

ログイン中が絶対条件だから大枠は　*if user_signed_in?*

ログインしているユーザかつ出品者、そして商品がある場合のときだけ編集・削除ページ出現
*<% if user_signed_in? && @item.purchase_history == nil %>*
商品履歴は空っぽですよという意味。

```erb
<% if user_signed_in? && @item.purchase_history == nil %>
  <% if current_user == @item.user%>
    <%= link_to "商品の編集",  edit_item_path(@item.id) , method: :get, class: "item-red-btn" %>
       <p class="or-text">or</p>
         <%= link_to "削除", item_path(@item.id), method: :delete, class:"item-destroy" %>
  <% else %>
          <%# 商品が売れていない場合はこちらを表示しましょう %>
          <%= link_to "購入画面に進む", item_purchase_histories_path(@item.id), class:"item-red-btn"%>
       <% end %>
    <% end %>
```

紙などに書いて整理することが大事という事が分かりました。
Nextcloud 21のcronプロセスがメモリリークしていたのを解決してみた。

#あらすじ

Nextcloud 21にバージョンアップしたあたりで同じVPSに構築した
あらゆるサービスが不安定になっていたので対応してみた。

#あらまし

ある日、VPSに構築したVPNサーバが時折落ちていることに気づいた。
``` /var/log/messages ``` を覗いてみると、色んなサービスが無差別に
oom-killerとかいう物騒なプロセスに軒並み殺されていた。／(^o^)＼ﾅﾝﾃｺｯﾀｲ
どうやらメモリ領域が足りなくなって強制的にシステムが色んなサービスを殺して回っていたらしい。

色々と調べてみると、Nextcloudのcron.phpがやたらめったらメモリを食いまくっていることに気づいた。

# 対処

[Nextcloudのフォーラム](https://help.nextcloud.com/t/solved-occ-command-php-fatal-error-allowed-memory-size-of-xxx-bytes-exhausted/108521/45)を探すと、わりとあっさりと対処方法が見つかった。
config.phpを以下のように変更または追加すればいいらしい。

```php:config.php

  'debug' => false,
  'loglevel' => 2,

```
20代後半のプログラミング未経験者が、プログラミング学習から転職活動までを通して感じること【転職活動編】

# はじめに
前回の投稿の続きになります。
自己紹介からプログラミング学習までを記載していますので、よければこちらもお読みいただければです。

https://qiita.com/Shuhei_Takeuchi/items/e0245452d7f6594e579e

# 振り返り
プログラミング学習開始から転職活動終了までのスケジュールは下記のようになりました。
この中で本記事では転職活動に関して記載します！

|年月     | 活動内容 |
|---------|--------|
|2020/10/中 ~ 2020/12/末 | プログラミングカリキュラム学習|
|2021/1/初 ~ 2021/2/中 |オリジナルポートフォリオ作成|
| 2021/3/初 ~ 2021/5/初 | 転職活動 |

# 転職活動

結果から。すみません、ベタ打ちで書きます。
- 計約60社応募、内定は2社。
- 媒体：リクルートエージェントとwantedlyを使用。後者のwantedlyをメインとしていた。
- 応募した中で2割程度カジュアル面談に進むことができた。
- 10社程度面接を実施。4社最終まで通過した中で、2社最終面接を実施し、2社内定を得た。

私は当初"web系エンジニア"を目指して、プログラミング学習を進めて、転職活動を進めました。ただ実際転職活動の中で自分と向き合い、自分が今後本当にやりたいことを考えたときに、何か違うのではないかと違和感を抱きました。(一番の決め手は学習中にコードを書いていてめっちゃ楽しいと感じなかったことかもしれません。)結果的に私は自分自身の経験や強みを活かすことができる”ITコンサル”の道を歩む選択をしました。→内定2社は両者ITコンサルで内定をいただき、給与等総合的に判断して内1社への内定を決めました。

# さいごに

目を通していただきまして、ありがとうございました！
正直私が最も伝えたいことは『エネルギーを持って人生することの大切さ』です。
私はメーカーで安定した暮らしを得たものの、このままでいいのかな？と感じつつ日々過ごしていました。
そこから少しずつ自分の意思を以て行動をすることで、環境を変えることができました。
正直もしかしたら行動して得た環境が良くないかもしれません。
それでも一度自分で行動して、環境を変えることができたという成功体験が人生に余裕を持たせます。
一度きりの人生、せっかくなので楽しんでいきましょう！！！
私は今はジムに通っており、弱々な自分を少しでも強くすることが目標です！笑
今回私が記載した体験や想いがどなたかの参考になれば幸甚です。
dfコマンドで表示される/dev/loopとは

とても初歩的なことですが、dfコマンドを入力した際に表示される/dev/loopが何か分からなかったので備忘録の為、残しておきます。

ubuntuをAWSで利用しており、dfコマンドにて容量を確認した際に/dev/loopの表示が出てきました。

```
$ df -i

>Filesystem      Inodes  IUsed   IFree IUse% Mounted on
 udev            121641    308  121333    1% /dev
 tmpfs           125259    500  124759    1% /run
 /dev/xvda1     3840000 295428 3544572    8% /
 tmpfs           125259      1  125258    1% /dev/shm
 tmpfs           125259      4  125255    1% /run/lock
 tmpfs           125259     18  125241    1% /sys/fs/cgroup
 /dev/loop0       12841  12841       0  100% /snap/core/10958
 /dev/loop1         474    474       0  100% /snap/snapd/11588
 /dev/loop2       10790  10790       0  100% /snap/core18/1997
 /dev/loop3          16     16       0  100% /snap/amazon-ssm-agent/3552
 /dev/loop4         474    474       0  100% /snap/snapd/11841
 /dev/loop5       12842  12842       0  100% /snap/core/11081
 tmpfs           125259     15  125244    1% /run/user/1000
```

使用量が100%になっていたので、マズイのでは？？と思いました。
しかしこのloopデバイスは読み取り専用の仮想デバイスとのことで、100%でも問題ありませんでした…。
「command+shift+g」でファイル先を探しても見つからなかった理由も明確になって安心でした。
DockerfileでCOPYのファイルパスが正しいのに動かないのはおかしい！

# はじめに
Dockerは環境を何度作っても毎度詰まります。
今回もKaggleをするための環境を作っていたのですが、案の定詰まりました。

今回は[こちら](https://amalog.hateblo.jp/entry/data-analysis-docker)の記事を参考にKaggleの環境を作成していました。

そこにjupyter notebookの設定ファイルである、`jupyter_notebook_config.py`を作成し、コンテナにコピーしようとしたのですが、なかなかできず。調べても解決方法が見つからなかったため、まとめます。

私のミスによるのが原因ですが、同じ症状に悩まされる人がいたら参考になるかと思います。

# 問題

Dockerを[記事](https://amalog.hateblo.jp/entry/data-analysis-docker)通りにまず作成を行い、
`jupyter_notebook_config.py`を作成しました。

ディレクトリはこのようになっています。

```
┣ libraries
  ┣ setting
    ┣ jupyter_notebook_config.py
┣ notebook
┣ docker-compose.yml
┣ Dockerfile
┣ .dockerignore
```

そしてDockerfileの最後に`jupyter_notebook_config.py`をコピーする文章を追加しました。

```
COPY ./libraries/setting/jupyter_notebook_config.py .jupyter/
```

すると以下のエラーが発生して、コピーができませんでした。

```
 > [3/3] COPY /notebook/jupyter_notebook_config.py /tmp/jupyter_notebook_config.py:
------
failed to compute cache key: "/notebook/jupyter_notebook_config.py" not found: not found
ERROR: Service 'jupyter' failed to build : Build failed
```

ファイルが存在しないとなります。しかしパスはあっているはずです。

`jupyter_notebook_config.py`をDockerfileと同じ階層に移動して、以下を実行するとうまく動きます。

```
COPY ./jupyter_notebook_config.py .jupyter/
```

なぜか、`./notebook/setting`だとnot foundになりました。


# 解決方法

問題は`.dockerignore`にありました。

`.dockerignore`

```
notebook
```

notebookをビルドのタイミングで無視する設定にしていました。

`.dockerignore`を削除したところ無事動きました。

# おわりに
`.dockerignore`を使ったことがなく、初めて導入しましたがまさかそれが原因になるとは思ってもいませんでした。

いままで扱ったことがないため、ここが原因になるということが完全に視野から外れていたため、いろいろパスを変えたり、ファイルの位置を変えたりしました。

検索しても引っかからない(当たり前)ので、同じことで悩む人が現れると思い、記事にしました。

Dockerもっと詳しくなりたいです。
DSPラジオモジュールM6959でのFMラジオ作成



最近電子工作してないなーという事でラジオを作ることにしました

完全に雰囲気でやってるので
こんな人もいるんだ―ぐらいの気持ちで見てやってください


※DSPラジオの説明は省きます


## 作りたいラジオの仕様

1. 電源駆動 DCジャック給電が良い
2. バーアンテナからFM受信(ロマン)
3. つまみで音量調整
4. つまみで選局 
5. スピーカー、ジャック挿入でスイッチ切り替え対応


## 部品表

### aitendo 

★6959★DSPラジオモジュール（18バンド） [M6959]

国産3端子電圧レギュレータ（3.3V） [TA48033S] 

オーディオボリューム [R16C] ×2

★特売品★φ15x16★ツマミ [KN1516A]

テレスコピックアンテナ [TANT-5261-5]



---

### amazon

- イヤホンプラグ
uxcell 3.5mmステレオオーディオジャック メタルPCBパネルマウントソケットコネクタ

- スピーカ
uxcell マグネットスピーカー 0.25W 8 Ω ラウンドのシェイプ 27 x 9mm

- 電源スイッチ
押しボタン切り替え押し オルタネイト 押しボタンスイッチ ブルー LED 1NO1NC SPDT ON/OFF ブラックメタル 12-24V ブルー LED 16mm IP67 防水 (青) + 専用 ソケット

---

### 秋月電商

- アンプ
ＰＡＭ８０１２使用２ワットＤ級アンプモジュール

---

### たしか千石(秋葉で買って持ってた奴)

DCジャックメス(千石２階のオーディオのとこにあるよ)

--- 

### その他

ACDCケーブル
パスコン
ネジ(適当に合うやつ)
熱収縮チューブ 

--- 

### あると良いもの

1. バンドスイッチキット [K-BAND69XXB]
はじめてラジオ触るのでいろいろ試したくて使用(最終構成には含まれません)

2. 3Dプリンタ
さいつよ


## 構成図

最終的にはこんな感じになりました

フルバンドなのですが、自分はFMしか聴かないので、バンドスイッチ機能は入れませんでした
(抵抗もあったけどスイッチ増やすのが嫌だったので)
そのためBAND-AMはそのままVpに繋いでます(BAND-FMはGNDです)

ボリューム調整も内部でやってくれるとは思ってなくてビックリしました。
一応内部アンプで動くようなのですが自分は持ってるスピーカーに合わせるためにアンプを入れました

![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67904/6ebf9433-e039-d554-b76e-22976917bf32.png)


## 箱の作成

箱は3Dプリンタで作成しました


操作系の部品は基板取付タイプを採用しているので、穴があいた箱を作ります
(なので3Dプリンタが無くても適当な箱に穴をあける方法でもできますよ！)

![stl01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67904/e019c61c-cdb9-44bd-9722-24f44f8292b4.png)

![stl02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67904/94dbb477-a066-1904-b04d-8b7b74cf463c.png)



バーアンテナの取り付けがネックでどうしようか悩んだ末に
アンテナ接続用のパーツを作り、横からネジ止めで固定する方式にしました
強度的には問題があるかもしれないですが。。。(一枚目の箱の側面の穴がパーツを取り付ける穴です)



![stl03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67904/83f892aa-5cb9-f5a4-1137-a59a01a3a7ec.png)


## 完成品



<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">初の自作ラジオ完成した... <a href="https://t.co/dEJ51Nzqc0">pic.twitter.com/dEJ51Nzqc0</a></p>&mdash; ぱくぱくむし (@starswirl_k) <a href="https://twitter.com/starswirl_k/status/1388649722127085573?ref_src=twsrc%5Etfw">May 2, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">音が程よい <a href="https://t.co/DGIyhaAEgo">pic.twitter.com/DGIyhaAEgo</a></p>&mdash; ぱくぱくむし (@starswirl_k) <a href="https://twitter.com/starswirl_k/status/1394628262651785218?ref_src=twsrc%5Etfw">May 18, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 最後に

初めてにしては結構完成度高くできてビックリしました！
音も良いしかなり満足

イヤホン切り替え対応なので夜も使えるしかなり愛用できるものになりました
結果として使う部品はFM単体のラジオモジュールでよかったかなと

ほんとはマイコン制御でコード書く気バリバリでいたんですが使用満たす上で不要なことに気づいたのでノーコードになりました、0行が最強のコードなのかもしれないなぁ

今度作るときはフルバンドにしたいのとディスプレイ有のラジオを作りたいなと思ったので
機会があればまた作りたいと思います。
読んでくれてありがとうございました。
AWSの学習を開始する：クラウド (クラウドサービス) とは？

## 宣言
本日より、AWSの学習を開始する事を宣言します。

###AWSを勉強する目的
- 転職に伴い、求人内容からAWSを採用している企業に出会うことが多い事から、クラウドサービスの利用に携わる機会に備え、自身のインフラの知識を補う
- 新しい技術に挑戦し、視野を広げる

###教材の選定
最初のステップとして以下の記事を参考に勉強を進める

https://qiita.com/toma_shohei/items/b7a001d26bd988d52021

理由

- AWSの公式の教材に従っているから
- 作者の経歴と記事の評価の高さから信憑性の高さが伺えるから

本日はまず一歩目のまとめを投稿します。



#クラウド (クラウドサービス) とは？

https://aws.amazon.com/jp/cloud/

## **代表的なクラウドのタイプ**

1. クラウドとは？
2. クラウド導入のメリット
3. クラウドのタイプ
4. クラウドの活用用途
5. AWS のクラウドサービス
6. お客様事例

## 1. クラウドとは？

---

「クラウド（クラウドサービス、クラウドコンピューティング）」とは、クラウドサービスプラットフォームからインターネット経由でコンピューティング、データベース、ストレージ、アプリケーションをはじめとした、さまざまな IT リソースをオンデマンドで利用することができるサービスの総称です。

必要な時に必要な量

→　それに伴い課金 = 煩わしい作業軽減↓

## 2. クラウドサービスで得られる6つのメリット

---

1. 固定の償却コスト → 変動コストに

    リソースを使用したときに使用した分だけ支払うことができます

2. スケールによる大きなコストメリット

    規模の経済を活かして、従量課金制の料金も低く提供できるから

3. キャパシティ予測が不要に（使いたい分だけ増やせばいい
4. 速度と迅速性の向上（早い
5. データセンターの運用保守投資が不要
6. わずか数分で世界中にデプロイ

分からんかった単語
レイテンシーは、ユーザーのアクションとその結果である応答の間に要する時間を指します

## 3. クラウドのタイプ

---

### 代表的なクラウドのタイプ

IaaS

クラウド IT の基本要素から成るもの。通常は

- ネットワーキング機能（サーバー）
- コンピュータ (仮想または専用ハードウェア)
- データストレージ領域

へのアクセスを提供するもの

PaaS

メリット：基盤となるインフラストラクチャ (通常はハードウェアやオペレーティングシステム) を組織内で管理する必要性がなくなる

→　アプリケーションのデプロイと管理に集中できるようになる

SaaS

サービスプロバイダーが実行および管理している完成した製品を利用できる

### クラウドのデプロイモデル

クラウドネイティブとは...

CNCF（Cloud Native Computing Foundation)によってこのように定義されいるアーキテクチャのことをさします。

「クラウドネイティブ技術は、

パブリッククラウド / プライベートクラウド/ ハイブリッドクラウド

などの環境において、スケーラブルなアプリケーションを構築および実行するための能力を組織にもたらします。

 代表例として、コンテナ、サービスメッシュ、マイクロサービス、イミュータブルインフラストラクチャ、および宣言型 API があり、

回復性、管理力、および可観測性のある疎結合システムが実現します。 また、これらを自動化することで、インパクトのある変更を簡単に行うことができます。」

クラウド

クラウドベースのアプリケーションは完全にクラウド上にデプロイされており、アプリケーション全体がクラウド上で実行されます。

様々な環境構築に基づき、柔軟なインフラを実現できますよ、と。

ハイブリッド

クラウドベースのリソースと、クラウド上にはない既存のリソースとの間でインフラストラクチャとアプリケーションを接続する方法

クラウドのリソースを社内システムに接続することで組織のインフラストラクチャをクラウドに拡張し、大きくするというもの

オンプレミス

「プライベートクラウド」と呼ばれることもある。

4と5は具体例。AWSの様々なサービス名とそれを活用している企業の関係を示している。
Githubのマニュアルトリガーworkflow_dispatchをdefault以外のブランチから試す方法

# 概要
github actionsのworkflow_dispatchをPR内で試してみたい、そんなあなたへ贈るtips  
 (2021/05/18現在、default branchからでしかGithub GUIのアクションからworkflow_dispatchを実行することはできません)

# 結論
`gh` コマンドを使い、以下のようにブランチ名を指定して実行する。
`gh workflow run --ref branch_name`

そうすると実行可能なworkflow一覧が出てくるので選択し、実行する。


# workflow_dispatchとは

https://docs.github.com/en/actions/reference/events-that-trigger-workflows

Github actionsをmanualで実行し、inputで以下のように値を渡せる便利機能です！

```yaml
on: 
  workflow_dispatch:
    inputs:
      logLevel:
        description: 'Log level'     
        required: true
        default: 'warning'
      tags:
        description: 'Test scenario tags'  
jobs:
  printInputs:
    runs-on: ubuntu-latest
    steps:
    - run: |
        echo "Log level: ${{ github.event.inputs.logLevel }}"
        echo "Tags: ${{ github.event.inputs.tags }}" 
```

![Screenshot 2021-05-18 at 16.54.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650287/ca799ad9-9d6c-5c28-40e0-cd87ce9d0cbc.png)

ref: https://github.blog/changelog/2020-07-06-github-actions-manual-triggers-with-workflow_dispatch/


しかし、現在だとdefaultに設定したブランチに存在しない限りworkflow_dispatchをgithub GUI上で試すことはできません。
そこでgithub 公式のcliツールである `gh`を使います。

# gh (GitHub CLI)

https://github.com/cli/cli


macだったら簡単に`brew install gh`でインストールできます。

インストール完了したら`gh workflow run --ref branch_name`とコマンドラインから実行してみてください、ここのbranch_nameは検証したいworkflowが存在するブランチ名を指定します。

そうすると実行可能なworkflow一覧が見れるかと思います、なので対象のworkflowを選択しenterを押すと実行できます。

ちなみに `gh run view <run-id>` で実行中のworkflowのログを見ることができます。
はじめてC++で画面を作ろう! (3) Menu編

#8.メニューを作ろう!
QtCreatorの画面から、__.ui__ファイルをダブルクリックすると、デザインモードになる。(練習用の.uiファイルは、__mainwindow.ui__ )

__[1] File: ファイル(F)__
デザイン画面の左上に「ここに入力」があるので、ダブルクリックすると、テキスト入力モードになるので、__「File」__と入力して、___Enter___

このメニューに入力した文字が、QMenuオブジェクト名になるので、ここでは、あえて「ファイル(F)」と入力としない。

メニューの表示する文字は、あとでプロパティを変更するので、最初は、オブジェクト名を入力しよう!

__[2] Open: 開く(O)__
上の「File」と入力して、Enterした後に 今度は、下の段に「ここに入力」と「セパレータを追加」が表示されるので、__「ここに入力」__をダブルクリックして、「Open」と入力して、___Enter___

すると、QtCreatorのアクションエディタの画面に__「actionOpen」__が追加される。

__[3] セパレータの追加__
Openの下に区切り線を入れるので、__「セパレータを追加」__をダブルクリックすると、区切り線が登録される。

__[4] Save: 保存(S)__
更に下の__「ここに入力」__をダブルクリックして、__「Save」__と入力して、___Enter___
すると、QtCreatorのアクションエディタの画面に__「actionSave」__が追加される。

__[5] SaveAs: 名前を付けて保存(A)__
更に下の__「ここに入力」__をダブルクリックして、__「SaveAs」__と入力して、___Enter___
すると、QtCreatorのアクションエディタの画面に__「actionSaveAs」__が追加される。

※「SaveAs」を「Save As」とスペースを空けると、「actionSave_As」になるので注意

__[6] セパレータの追加__
SaveAsの下に区切り線を入れるので、__「セパレータを追加」__をダブルクリックすると、区切り線が登録される。

__[7] Exit: 終了(X)__
更に下の__「ここに入力」__をダブルクリックして、__「Exit」__と入力して、Enter
すると、QtCreatorのアクションエディタの画面に__「actionExit」__が追加される。

__[8] actionExitに終了の処理を書く__
アクションエディタ画面より、__「actionExit」__をクリック、続けてマウスの__右ボタン__をクリックすると、ポップアップ メニューが表示されるので、__「スロットへ移動」__をクリックします。

QAction trggered()をタプルクリックすると、自動的にC++のエディタに移動します。

#9. mainwindow.cppにC++のコードを書く__

```mainwindow.cpp
void MainWindow::on_actionExit_triggered()
{
    
}
```
と、自動的にイベントを処理する関数が作られているので、ここで初めて、今回 C++コードを書きます!!
完成形は、下記のようになります。

```mainwindow.cpp
void MainWindow::on_actionExit_triggered()
{
    this->close();
}
```

__「thi」__と入力するだけで、候補が表示されるので、__「this」__をup/downキーを動かして選択して、___Enter___

次に__「.」__ピリオドを入力すると、また候補が出てくるので、そのまま「cl」を入力して、__「Close」__をup/downキーを動かして選択して、___Enter___

ここまでで、「this->close()」となっているので、C/C++言語の文法
行の最後は、「;」セミコロンで終わるので、__「;」__を入力して、___Enter___

入力が終わったら、QtCreator画面のメニューより、__[ファイル(F)| Save All]__をクリックする。

#10.動作の確認!!
画面の左下にある、右三角マークの__「実行」__ボタンをクリックすると、何やら右下側にビルドしている状況が表示され、「MainWindow」が出てくる!

作ったアプリのメニューで、__[File | Exit]__で、アプリが終了することを確認しましょう!!

#11.コードの補完機能
QtCreatorには、__FakeVim__と言うエディタが内蔵されており、これがコードを入力するときにアシストしてくれる。

Microsoftの__VSCode__に比べると、ちょっと見劣りするが使えるレベルになっている。

今回は、ここまで次回は、「ファイルを開く」を作ろう!!です。
Swift 5.3.2 ver での入出力Sample

ver. Swift 5.3.2

備忘録: Swift 値の入出力

```swift:入力受け取り
// -> Hello, World!!
let tmp = readLine()!

// -> 19990809
var my_birth = Int(readLine()!)!

// -> 20210518 
my_birth = Int(readLine()!)! // <- update value

// 複数行の場合
// -> John/Bob/Alice/Billy
let employee: [String] = readLine()!.components(separatedBy: "/")

// -> 34 29 21 23
let age: [Int] = readLine()!.components(separatedBy: " ").map { Int($0)! }
```

```swift:出力

// print(***)での出力は改行が入ります。

print(tmp)
// -> Hello, World!!

print(my_birth)
// -> 20210518

print(employee[0] + " " + age[0])
// -> John 34
```
Windwos版PostgteSQLのインストールで"Problem running post-install step, Installation may not complete correctly The database cluster initialisation failed."エラーが発生した場合の対策メモ

##Windows版PostgreSQL V11をインストールでエラー発生

新しPCを導入したのでひさしぶりにPostgreSQL V11 Windows版をインストールしたところ
> "Problem running post-install step, Installation may not complete correctly The database cluster initialisation failed."

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46156/d8826fb8-930e-4f9b-be64-e7026989758a.png)

なんてエラーが発生しました。
一応インストーラは最後まで動作して完了しますが、WindowsのサービスにPostgreSQLが登録されない、起動できていないのでもちろん各種操作はエラーになるという状況です。

最初はウイルス対策ソフトの挙動を疑っていたのですが、そうではありませんでした。

ググるとinitdbするためのdataフォルダのパーミッションの可能性がと出てくるものの、フルアクセスにしても現象は変わりませんでした。（最終的にその通りだったのですが、手順が必要でした）


##最終的にこれで解決

- エラーは発生しても一旦インストールを行う。
 - エラー発生してもインストールは完了します。PostgreSQLのサービス登録がされない、dataフォルダが空のままです。
 - ここでアンインストールして、いろいろいじりながら再インストールしていたのですが何度やっても同じエラーが発生しました。
- dataフォルダのパーミッションをフルコントロールに設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46156/545c63c9-e943-9493-8b45-fb41bc8f26d3.png)
 - 変更の許可だけで良いという記載もありましたが、とりあえずフルコントロールで
 - 確認のため以下を実施し、initdbできるか確認
 - C:\PostgreSQL\11\bin\initdb -D "C:\PostgreSQL\11\data" -U postgres

- もう一回インストーラーを走らせる
 - もう一回インストールを走らせると追加コンポーネントのインストール or 上書きのような形でインストーラーが実行されます。（ちょっとよくわからない）
 - インストール成功します。


## まとめ
本当はもう一回再インストールして正確な手順を検証したいところですが、パワー不足で今回はこのメモ程度に留めようと思います。
ただパーミッションを整えたdataフォルダを事前に用意しておけばすんなりインストールは完了できそうですね。

もしエラーが発生したら手動でinitdbコマンドを実行して、パーミッションの確認を取れば間違いないと思います。
※initdbしたdataフォルダをインストーラーで指定しても問題なくインストールすることができました。
> initdb -D "C:\PostgreSQL\11\data"
Bio Rug Cleaners

Contact
Address:
320 Pearl St 
New York, NY 10038
Phone: 
212-390-1479
Website URL:
http://www.biorugcleaners.com/
About US:
Welcome To Bio Rug Cleaners. Rug cleaning is our forte and we at Bio Rug Cleaners specialize in Area rug cleaning. If you are in Manhattan then look no further, we are here to provide you with professional rug cleaning services.
Do not take a chance by going to cheap local service providers as it may cost you more considering the overall life and quality of your rug. We provide the professional help for all your rug cleaning needs in NYC.
Area rugs are mostly  delicate items and every piece is in itself a has qualities and beauty onto itself. Therefore, they need to be taken care of on a regular basis to keep them in shape for regular use for years.
The cleaning agents used for your rug are very carefully selected by Bio Rug Cleaners to ensure proper cleaning action without causing any harm to the delicate fabric and specialized weaves. We only employ 100% organic substances to ensure delicate and thorough wash.
Keep our number handy for immediate pick-up and delivery services in Manhattan. You can contact our customer service representatives in NYC to find out more about us.
Related Searches:
Rug cleaning near me, carpet cleaning near me, best rug cleaner, best carpet cleaner, house carpet cleaning, house rug cleaning, oriental rug cleaning, wool rug cleaning, antique rug cleaning, silk rug cleaning, persian rug cleaning, area rug cleaning, rug cleaning, rug dry cleaning, commercial carpet cleaner, commercial rug cleaner, office carpet cleaning, office rug cleaning, shag rug cleaning, deep carpet cleaning, spotless carpet cleaning, upholstery service, Manhattan, NYC, New York, NY.
Additional Details
Hours:
24 h
Payment: 
Cash, cc
GMB:
https://g.page/bio-rug-cleaners?share
KDE neon (Ubuntu based) でVPN接続を行う。

# 実現したいこと
- 大学の学内ネットにVPNを用いて接続したい

# やること
- l2tpクライアントをインストール
- KDEシステム設定からVPN接続の設定



## network-manager-l2tpのインストール

他のディストリビューションではどうなっているのかわからないけど、KDE neonの場合は初期状態ではL2TP/IPSec接続用のクライアントがインストールされていないので、追加でインストールする。
これを行わないと、VPN設定時にIPSecの設定を行うボタンがグレーアウトしていて、設定できない。

```bash:Konsole
sudo apt install network-manager-l2tp
```

## VPN接続の設定

うまい記事の書き方がわからないので箇条書きでとりあえず書き連ねる。

- 接続のタイプ->レイヤ2トンネリングプロトコル(L2TP)
 - Gateway->VPNサーバのアドレス
 - Authentication Type->Password
 - Username->大学から提供されたID
 - Password->大学から提供されたパスワード
- IPsec Settings
    - Enable IPsec tunnel to L2TP host
        - Type->PSK
        - Pre-shared Key->大学から提供された事前共有キー
- PPP Settings
    - Use MPPE Encryption->Check
        - Crypto->Any
        - Use stateful encryption->Check
    - Echo
        - Send PPP echo packets->Check


# おわりに
これは自分の大学のネットワークに接続する際の設定なので、他大学では通用しないかもしれない。

適当なVPN接続設定を作成して、いざ接続しようとしたときに「VPNプラグインが見つからない(Missing VPN Plugin)」と表示された場合は、必要なクライアントをとにかく追加でインストールすれば良さそう。
KDEシステム設定に初期で表示されている接続方式でも、クライアントは入っていないみたい。

とりあえず自分用に書いたけど、同じ大学に通っていてLinuxを使用してますって人にはもしかしたら役立つかも？
htmlの一番端に枠線を引く方法

***bodyとかhtmlにborderいれると枠をはみ出してしまうので、その解決策***

開発環境：
macosx catalina　バージョン10.15.17
visualStudioCode


以下をbodyタグに入れて、枠線にすることで解決できる

```
box-sizing: border-box
```
引数を使ったデータの呼び出し方　備忘録


```〇〇.html.erb
<%= f.collection_select(:category_id, Category.all, :id,
:name, {}, {class:"select-box", id:"item-category"}) %>
```

第一引数, category_id
保存先のカラム名

第二引数, Category.all
配列データを指定する

第三引数, id
表示する際に参照するDBのカラム名

第四引数, name
実際に表示されるカラム名

第五引数, {}
（オプション) 今回はオプションの指定なし
（include_blankという値のない選択肢を先頭にするオプションなどがあります。）

htmlオプション {class:"select-box"} 今回はクラス名を付与
（cssを当てるため）

**リストを入れたモデルを作成し、そのモデルからデータを取り出す為ビューに使用したコード**です。一時は引数を省略しすぎて、表示できませんでしたが、引数の意味合いを考え、入力していきたいです。
ppk?pem?まとめ

# はじめに
ec2へsshログイン時に必須のキーペアについて備忘録も兼ねてまとめました。

## sshkey設定の仕方
pemキーの保存
mv aws_test.pem .ssh
mv aws_test.pem id_rsa
chmod 600 id_rsa

# 暗号化方式
共通鍵暗号方式（秘密鍵暗号方式）
暗号化と復号に使う鍵が同一である暗号方式
通信相手ごとに異なる共通鍵を準備しなければならない点がデメリット

公開鍵暗号方式
暗号化するための鍵と復号するための鍵が異なる暗号方式
暗号化するための鍵を公開鍵
復号する鍵を秘密鍵
暗号化や復号に時間を要するのがデメリット

# aws
awsの場合、EC2作成時に鍵の作成を行い、サーバーには/.ssh以下にauthorized_keysの公開鍵が自動で置かれる

# pemとppkとは
## pem
OpenSSH形式の秘密鍵
暗号化鍵や証明書をを入れておく箱(コンテナ)
awsで発行されるものはこれ
OpenSSH形式の秘密鍵
## ppk
PuTTY形式の秘密鍵
windows専用の形式

# windowsからEC2サーバへSSH接続の仕方
## teraterm
teratermを使う場合はpemからppkファイルへ変換して用意する必要がある

## windows terminal
pemファイルでSSH接続が可能
Javaを０から学ぶ 基本構文と変数

PythonとExcel VBAを四年くらいやってきただけの、
しょぼしょぼな私が色々あってJavaを学ぶ事になった（何か開発するわけではない）ので、
自身の学びのためにも、ここに色々書いていこうと思います。
知識本当に無いので、違うこととかあったら、すみません。
ご指摘いただければ、随時直していきます。

環境：macOS 10.14.6
参考資料：スッキリわかるJava入門　その他色々なサイト（すみません色々転々と見ています）

 [Javaを０から学ぶ](https://qiita.com/sandream/items/ce240423c880b972b9bb)でいくつか試しましたが、とりあえず、ファイル構造の理解まではJDKを利用していきます。

# 基本構成
```java
public class Main(){
    public static void main(String[] args){
    //ここにコードを書いていく。
    }
}
```

○ファイル名＝クラス名とする（上記の場合はMain.java というファイルになる）
○クラス名は大文字から始める（のが一般的）
○英数字は基本的に半角で入力。（大文字小文字も意識すること）

<b> public static void main(String[] args){} は、とりあえずそう書くもの！　という認識で今時点はOK
 () {} が多く使われるので、コードを書き出す前に先に開始と終了のカッコを書いておく、癖をつける。</b>

# インデント
```java
public class Main(){public static void main(String[] args){//ここにコードを書いていく。}}
```

インデントはつけなくても、コンパイルはうまくいくそうですが、見やすくするためにもインデントはつける。
基本としては、ブロックの開始時と終了時では正確にインデントをつける。

# コメント
```java
/* コメント本文（複数行も可能） */
// コメント本文（1行のみ）
```
ソースコード中に解説文を書き込むなどに使えます。コンパイル時、実行時には無視されます。

# 変数
### 変数とは？
データを格納するための、箱のようなイメージです。
変数に何を入れる予定なのかを、あらかじめ想定して指定してあげる必要があります。

### 変数宣言の文
<b>型　変数名;</b>

### 名前の付け方
○アルファベット、アンダースコア、ドル記号などを組み合わせてつける
○禁止されている単語(予約語)を使わない

|予約語一覧|||||
|:-----------:|:------------:|:------------:|:------------:|:------------:|
abstract|	assert	|boolean	|break	|byte|
case|	catch|	char|	class|	const|
continue|	default|	do	|double	|else|
enum|	extends	|final	|finally	|float|
for|	goto	|if	|implements|	import|
instanceof|	int	|interface	|long	|native|
new|	package	|private	|protected	|public|
return|	short|	static|	strictfp|	super|
switch|	synchrnized|	this|	throw|	throws|
transient|	try|	void|	volatile|	while|
_|||||				

○すでに使っている変数名は使わない
○大文字、小文字、全角、半角の違いは区別される
○小文字で始まるわかりやすい名前をつける（複数の単語を繋げる時は、2つ目以降の単語を大文字から始める　例：myName ）

# 変数の型
まずは、基本の9つの型を覚える

|型名|データ|格納可能な整数の範囲|
|:-----------:|:-----------:|:-----------:|
|byte|とても小さな整数|-128～127|
|short|小さな整数|-32768～32767|
|<font color ="red">int</font>|<font color ="red">普通の整数</font>|-2147483648～2147483647|
|long|大きな整数|-9223372036854775808～9223372036854775807|
|float|少し曖昧でもいい少数|
|<font color ="blue">double</font>|<font color ="blue">普通の少数</font>|
|<font color ="blue">boolean</font>|<font color ="blue">trueかfalse</font>|
|char|1文字|
|<font color ="red">String</font>|<font color ="red">文字の並び</font>|

<font color ="red">赤文字</font>はよくつかわれる。
<font color ="blue">青文字</font>はまぁまぁよくつかわれる。

変数を用意すると、格納するためのメモリを確保するため、扱いたいデータに合わせて、利用する型を考える必要がある。

# 変数の初期化
<b>型　変数名 = 代入するデータ;</b>

変数は1度代入した後に、別の値を代入し直す事ができます。
ただし、別の値に書き換えたくない時もあります。
書き換えたくない場合は、

<b>final 型　変数名 = 代入するデータ;</b>
とし、書き換え防止をします。
finalで宣言された変数は<font color ="red">定数</font>と呼ばれ、変数名は全て大文字にし、複数の単語を組み合わせるときはアンダーバーでつなげる名前の付け方がよく使われます。

finalで宣言した変数を後から書き換えようとした場合、コンパイル時にエラーがでます。


##### [Javaを０から学ぶ](https://qiita.com/sandream/items/ce240423c880b972b9bb)
有益なDjangoライブラリをまとめ

## はじめに

初めまして、筆者はフリーランスでDjangoを使って個人開発をしていますが、Djangoは管理者画面やらORMやらが揃っているので個人開発するときにはすごい便利ですよね。

本記事では、DjangoのWeb開発を便利にしてくれる3rdパーティ製ライブラリをまとめていきます。
この記事は良さげなライブラリを見つけるたびに不定期更新していきます。
「こんなライブラリもあるよ！」という方はコメント欄へ🙏


## 一般系

### django-import-export
CSVファイル等を管理画面からインポートしたりエクスポートしたり出来るライブラリ。
インポート、エクスポート時の処理とかも簡単にカスタマイズできます。
データベースを持っていない企業ではデータをCSVやXSLで管理しているところが多いので入れておくと便利です。

https://github.com/django-import-export/django-import-export


### Cacheops

簡単な設定をするだけでORM経由でのDBアクセスをキャッシュしてくれるライブラリ。
ORMキャッシュのバックエンドとしては[Redis](http://redis.io/)を使っています。
Function Cache と View Cache もサポートされていているので重宝します。

https://github.com/Suor/django-cacheops

### Django Debug Toolbar
デバッグ用の便利機能を画面に表示してくれるライブラリ。
私は全てのプロジェクトに必ず入れてます！
とりあえず入れておけばいい系のやtです👍

https://github.com/jazzband/django-debug-toolbar

## Security

### Django Security
セキュリティ対策用のミドルウェアなんかが大量に詰め込まれたライブラリ。
https://github.com/sdelements/django-security/

### django-otp
One time password (otp)を利用可能にしてくれるライブラリ。
カスタマイズもかなりでき、そのほかのライブラリのバックエンドとして利用されていたりします。

https://github.com/django-otp/django-otp

### Django Two-Factor Authentication

二重認証をサポートしてくれるライブラリ。
上記のdjango-otpをバックエンドで使用しています。

https://github.com/Bouke/django-two-factor-auth

## API
### Django REST framework
DjangoをREST APIとして利用できるようにしてくれるライブラリ。
自分はFrontendをReactでバックエンドをREST APIとして実装することが多いので重宝しています。

https://github.com/encode/django-rest-framework

### Django Cors Headers
Cross-Origin Resource Sharing (CORS)をHTTPのヘッダーに追加してくれます。
Corsは予期せぬAPIからのデータ漏洩を防ぐことができるので、プライベートなAPIを作る場合はいつも利用しています。

https://github.com/adamchainz/django-cors-headers

### Simple JWT
APIにJWTをサポートしてくれるライブラリです。
簡単に利用できるので認証にJWTを用いたい場合には便利です。

https://github.com/jazzband/djangorestframework-simplejwt

## その他

### wagtail

wagtailはDjango用のCMS(Content Management System)を提供するライブラリ。
GoogleやNasaなんかの大企業でも採用されています。

https://github.com/wagtail/wagtail

以下ホームページではどんなサイトを構築できるか事例が紹介されています。

https://madewithwagtail.org
【Tips】Macのコンピュータ名（ホスト名）をターミナルで変更する

## 問題
「システム環境設定 > コンピュータ名」で表示されているコンピュータ名（ローカルネットワーク上のコンピュータ名）とターミナルで表示されるホスト名が異なっていた。以前別の端末で使用していた古い名前がホスト名としてそのまま引き継がれており、システム環境設定でコンピュータ名を変更しても、ターミナル上の表示が変更できない。

## 解決方法
scutilコマンドを使用して、ターミナルのコマンドラインからホスト名を変更する。

1. ターミナルを開く。

1. ターミナルで下記のコマンドを入力する。パスワードを要求され、入力するとコンピュータ名を確認できる。

```
$ sudo scutil --get HostName
```

さらに、下記のコマンドでコンピュータ名を変更できる。

```
$ sudo scutil --set HostName "XXX(新しいホスト名)"
```

一度ターミナルを閉じて、再度起動させると、ホスト名が反映されている。

## 参考
[ターミナルから Mac のホスト名またはコンピュータ名を設定する方法](https://knowledge.autodesk.com/ja/support/flame-products/learn-explore/caas/sfdcarticles/sfdcarticles/JPN/Setting-the-Mac-hostname-or-computer-name-from-the-terminal.html)
[【Tips】Macのコンピューター名を変更する方法](https://softantenna.com/wp/tips/mac-change-conputer-name/)
別サーバーのファイル存在チェック

# はじめに
サーバーAからサーバーBのファイル存在チェックを行いました。

# 実装
サーバーAにてlsコマンドを使って以下のようなshellを実装をしましたが、
ファイルが存在しない場合にlsコマンドがエラーとなってしまうためか、後続の処理が行われませんでした。

```shell
# ↓でファイルが存在しない旨のエラー
FILENAME=`ssh サーバーB "ls ファイル名"`
# ↓が処理されない
if [ -n ${FILENAME} ] && [ ${FILENAME} = "対象ファイル名" ] ; then
  # パーミッション変更などの処理
fi
```

なので最終的に以下のように実装しました。

```shell
FILECHECK=0
ssh サーバーB "test -e ファイル名" || FILECHECK=1
if [ ${FILECHECK} -eq 0 ] ; then
  # パーミッション変更などの処理
if
```
FILECHECKを終了ステータスに見立てて、testコマンドのエラーをもみ消しています。
こんな実装許されるのでしょうか…。

# 最後に
よい方法が思いつかず、無理矢理に近い実装になってしまいました。
ファイルが存在しなかった場合に後続処理が行われない点も理解できぬままです。

1. サーバーB側でエラー
2. 終了ステータス1がサーバーAに返ってくる
3. 終了ステータスが1だからエラー終了

ということでしょうか…？
ご存知の方がいらっしゃいましたら教えていただきたいです。

# 参考
- [リモート先のファイルがあるないかを確認する](https://ex1.m-yabe.com/archives/3039)
- [【 test 】コマンド（基礎編）――ファイルの有無などを判定する](https://www.atmarkit.co.jp/ait/articles/1807/05/news041.html)
NVActivityIndicatorViewのライブラリを使ってみた

今回は、NVActivityIndicatorViewを使ってみたので、忘れないうちに備忘録としてアウトプットしようと思います。

#環境
・Mac Book Pro(macOS:BigSur)
・Xcode(ver:12.5)

#実装例
![Unknown-3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864623/d2640395-ffbe-b040-4176-7ab15dec609c.gif)

pacmanでやってみましたが、種類は色々あるのでgithubを覗いてみてください。

#コード例
```ruby:ViewController.swift
import NVActivityIndicatorView

class ViewController: UIViewController {

    @IBOutlet weak var indi1: UIView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let activityView = NVActivityIndicatorView(frame: indi1.bounds, type: .pacman, color: .blue,padding: .none)
        
        indi1.addSubview(activityView)
        activityView.startAnimating()
    }
}
```
TypeScript　分割代入　　＋　言語の優れた点



##　分割代入について

pages/api/register.ts

```typescript
const handler = (req, res)  => {
    const {id, name} = req.body;　　★ココ
    const data = {id, name}　　
    return res.status(200).json(data);
}

export default handler;
```


★ココの行は以下と同義

```typescript 
const id= req.body.id
const name =req.body.name 

```




>　bodyの中の[name]というキーを元に、値を変数に代入してる


##　小さく動かしてみよう

使うツール：advanced rest client

URL:http://localhost:3000/api/register

HTTPメソッド：POST

設定するjsonBody:

```json
{
 "id": 5,
  "name" : "test"
}

```



結果は想定通り

```json
{
"id": 5,
"name": "test"
}
```


##　便利そうな場面

- DBにjsonのキーを指定して１つ登録したいとき


```
こんなデータを登録したい
{
 first_name: "test",
 last_name: "test",
 age: 20,
 bmi: 3.21
}


※キーの数だけconst宣言も大変なので分割代入が便利

const {first_name, last_name, age, bmi} = req.body;
```



## 【おまけ】なぜTypeScriptを使うのか？
端的に

> 1.実行時ではなくコンパイル時に型チェックを行うことができる

コンパイラはエラーを投げて、
間違ったコードについて警告してくれる

>2. 厳密な型付け（変数を特定のデータ型に束縛する）が偉大





============================================


詳しく
>※以下の文章は要するに
『JavaScriptは実行してみないとバグ、エラーわからないよ』ってこと。『実行前におかしなコードがわかる（＝コンパイル時）TypeScriptは便利』

=======================================
>TypeScriptは、JavaScriptの「最大の問題点」を克服している。型変換問題がJavaScriptのランタイム中にしか検出できず、その結果、バグのあるアプリケーションがエンドユーザーに出荷される可能性がある、という点。

>この問題はもともと、ユーザーエクスペリエンスを阻害することで、あらゆるビジネスに悪影響を及ぼす。

>TypeScriptでは、コンパイル時に問題がないかどうかをチェックすることで、この問題を解消している。



Qなぜ、TypeScriptのコードをJavaScriptにコンパイルするの？
➡TypeScriptはどのブラウザでも理解できないので、ブラウザがコードを実行できるようにJavaScriptに変換する必要があるから
Raspbery vi .vimrc

ラズベリーパイのviのカーソル移動がややこしいのでそれらを回避する手段

以下のコマンドを打ち込む
:set nocompatible

もしくは、ホームディレクトリに .vimrc を作り以下のように記述
set nocompatible
set number
set autoindent
set smartindent
set tabstop=4
EC2 インスタンスの特定の情報を収集する

<code>素人が自分のノートとして書いてますが、改善点あれば是非コメントください</code>


###リージョン指定
ec2クライアント定義時に、region_name = 'us-west-2' 。

```python:lambda-python38
import json
import boto3

def lambda_handler(event, context):

    #ec2 client を定義、引数の region_name = 'xxx' でリージョン指定。
    ec2client = boto3.client('ec2', region_name = 'us-west-2')
    
    #describe した値を response に入力
    response = ec2client.describe_instances()
    
    #response を出力
    print(response) 
```

### Describeで出力される順番を使った特定のインスタンスを指定。
response['Reservations'][x]["Instances"][y] の様に辞書型の要素番号で指定。1つ目は0。
ちなみに、Instances の中に複数Instanceは含まれないので基本的に y=0。
それぞれの Instance は x の値で指定する。

```python:lambda-python38
import json
import boto3

def lambda_handler(event, context):

    #ec2 client を定義、引数の region_name = 'xxx' でリージョン指定。
    ec2client = boto3.client('ec2', region_name = 'ap-northeast-1')
    
    #describe した値を response に入力
    response = ec2client.describe_instances()
    print("response=",response)

    #Reservations の1つ目の要素を抽出。ただし、Reservations には group[]が含まれる。
    reservation0 = response['Reservations'][0]
    print("reservation0=", reservation0)
    
    #Reservations の1つ目の要素の中のさらに、Instances の中の1つ目の要素＝1つ目のEC2インスタンスの情報だけ抽出。
    instance0 = response['Reservations'][0]["Instances"][0]
    print("instance0=", instance0)   

    #Reservations の4つ目の要素の中のさらに、Instances の中の1つ目の要素＝4つ目のEC2インスタンスの情報だけ抽出。
    instance3 = response['Reservations'][3]["Instances"][0]
    print("instance3=", instance3)   
    
```

### 特定インスタンスの特定項目(InstanceTypeとか)だけを指定。
instance0['InstanceType'] のような形式で。

```python:lambda-python38
import json
import boto3

def lambda_handler(event, context):

    #ec2 client を定義
    ec2client = boto3.client('ec2')
    
    #describe した値を response に入力
    response = ec2client.describe_instances()
    print("response=",response)

    #Reservations の1つ目の要素を抽出。ただし、Reservations には group[]が含まれる。
    reservation0 = response['Reservations'][0]
    print("reservation0=", reservation0)
    
    #Reservations の1つ目の要素の中のさらに、Instances の中の1つ目の要素＝1つ目のEC2インスタンスの情報だけ抽出。
    instance0 = response['Reservations'][0]["Instances"][0]

    #instance0 に入力したインスタンスの InstanceType を抽出
    instance0_type = instance0['InstanceType']
    print("instance0_type=", instance0_type)
```
ssm inventory を aws lambda / python3.8 でたたいてみた。

<code>素人が自分のノートとして書いてますが、改善点あれば是非コメントください</code>

###まず AWS CLI でコマンドを確認
InstanceID と インベントリタイプの指定が必要。

```awscli:aws-cli
aws ssm list-inventory-entries --instance-id i-xxxxxxxxxxxx --type-name AWS:Application
```
今回リストしたかったのは PV Driver。確認出来た。

```awscli出力:awscli出力(一部抽出)
{
    "TypeName": "AWS:Application",
    "InstanceId": "i-xxxxxxxxxxxxxxx",
    "SchemaVersion": "1.1",
    "CaptureTime": "2021-05-17T10:44:06Z",
    "Entries": [
        {
            "Architecture": "x86_64",
            "InstalledTime": "2020-09-09T00:00:00Z",
            "Name": "AWS PV Drivers",
            "PackageId": "{90C09D7C-18EB-4853-9F4F-D3040CC23924}",
            "Publisher": "Amazon Web Services",
            "Version": "8.3.4"
        }
    ]
}
```
### lambda / python3.8 で同等の情報を抽出してみる

```python3:aws-lambda/python3.8
import json
import boto3

def lambda_handler(event, context):

    ssmclient = boto3.client('ssm')
    
    response = ssmclient.list_inventory_entries(
        InstanceId ='i-xxxxxxxxxxxx',
        TypeName ='AWS:Application'
        )
    
    print("inventory=", response)

```
### 権限エラーとのこと。

```aws:権限エラー
Response
{
  "errorMessage": "An error occurred (AccessDeniedException) when calling the ListInventoryEntries operation: User: arn:aws:sts::xxxxxxxxxxxx:assumed-role/pvdriver-listing-role-8pgwts5t/pvdriver-listing is not authorized to perform: ssm:ListInventoryEntries on resource: arn:aws:ec2:ap-northeast-1:xxxxxxxxxxxx:instance/i-xxxxxxxxxxxx",
  "errorType": "ClientError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 8, in lambda_handler\n    response = ssmclient.list_inventory_entries(\n",
    "  File \"/var/runtime/botocore/client.py\", line 357, in _api_call\n    return self._make_api_call(operation_name, kwargs)\n",
    "  File \"/var/runtime/botocore/client.py\", line 676, in _make_api_call\n    raise error_class(parsed_response, operation_name)\n"
  ]
}
```
対象のLambda関数に付与されたIAMロールに AmazonSSMReadOnlyAccess を追加する。
Lambda > 関数 > 対象Lambda関数 > 設定タブ > アクセス権限 > 実行ロール > 【対象ロール】> IAM設定画面に遷移 > 【ポリシーをアタッチします】> AmazonSSMReadOnlyAccess を選択 > 【ポリシーのアタッチ】

```aws:出力
inventory= {'TypeName': 'AWS:Application', 'InstanceId': 'i-xxxxxxxxxxxx', 'SchemaVersion': '1.1', 'CaptureTime': '2021-05-17T11:14:44Z', 'Entries': [{'Architecture': 'x86_64', 'InstalledTime': '2020-09-09T00:00:00Z', 'Name': 'AWS PV Drivers', 'PackageId': '{90C09D7C-18EB-4853-9F4F-D3040CC23924}', 'Publisher': 'Amazon Web Services', 'Version': '8.3.4'}], 'ResponseMetadata': {'RequestId': '4f6eed77-16bd-4b8b-9212-xxxxxxxxxxxx', 'HTTPStatusCode': 200, 'HTTPHeaders': {'server': 'Server', 'date': 'Mon, 17 May 2021 11:21:42 GMT', 'content-type': 'application/x-amz-json-1.1', 'content-length': '1558', 'connection': 'keep-alive', 'x-amzn-requestid': '4f6eed77-16bd-4b8b-9212-xxxxxxxxxxxx'}, 'RetryAttempts': 0}}
```
無事出力できました。
Slack API 使用時のtoken送信メソッドはPOSTを使う


<h2>tokenの送信メソッドはPOSTのみに</h2>
トークン(xox...)はPOSTじゃなきゃダメになったらしい。
[Three major deprecations you may be impacted by beginning February 24, 2021](https://api.slack.com/changelog/2021-02-24-how-we-broke-your-slack-app)

```php
// これじゃダメ（仕変前に作ったものであればOK）
$url = "https://slack.com/api/chat.postMessage?token=${token}&channel=${channel}&text=${text}";
file_get_contents($url);
```

```php
// OK
$url = "https://slack.com/api/chat.postMessage?channel=${channel}&text=${text}";
$body = 'token='.$token;
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_URL,$url);
$result = curl_exec($ch);
curl_close($ch);
```

今回新規でSlack Botの開発案件があったんですが、前作ったBotのソースコピペでトークンだけ変えればいけるだろうと思ってたところ、この仕変に気付かず小１時間ハマりました…そもそもクレデンシャルをGet送信するなというのとちゃんとドキュメント読めという話ではありますが；
公式のテストツールもGetで投げてるのでtoken指定だとエラーになります。
https://api.slack.com/methods/chat.postMessage/test
describe 等で取得した情報を Dynamo DB に保存する

<code>素人が自分のノートとして書いてますが、改善点あれば是非コメントください</code>

DynamoDBテーブルに入力する値を渡された関数だけをピックアップ。

```python:aws-lambda-python3_8
import json
import boto3

def lambda_handler():

    #DynamoDBテーブルはあらかじめ作ってある前提。本来なら、テーブルが無ければ作るみたいな感じにすべき。
    table_name = 'test'

    #DynamoDBテーブルに行として追加する情報を item として定義
    item = {
            "db-instance-id": 'i-xxxxxxxxxxxx',
            "db-instance-version": '1.23.3'
    }

    #DynamoDBクライアントを定義
    dynamodb_client = boto3.resource('dynamodb')

    #テーブルにItemを入力
    dynamo_table = dynamodb_client.Table(table_name)
    dynamo_table.put_item(Item=item)

    return
```


"An error occurred (AccessDeniedException) when calling the PutItem operation のエラーが出たときは権限問題。

```json:エラー
{
  "errorMessage": "An error occurred (AccessDeniedException) when calling the PutItem operation: User: arn:aws:sts::xxxxxxxxx:assumed-role/xxxx-listing-role-8pgwts5t/pvdriver-listing is not authorized to perform: dynamodb:PutItem on resource: arn:aws:dynamodb:ap-northeast-1:xxxxxxxxxxxx:table/yyyyyyyy",
  "errorType": "ClientError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 40, in lambda_handler\n    insert(index, name, version)\n",
    "  File \"/var/task/lambda_function.py\", line 16, in insert\n    dynamodb_table.put_item(Item=item)\n",
    "  File \"/var/runtime/boto3/resources/factory.py\", line 520, in do_action\n    response = action(self, *args, **kwargs)\n",
    "  File \"/var/runtime/boto3/resources/action.py\", line 83, in __call__\n    response = getattr(parent.meta.client, operation_name)(*args, **params)\n",
    "  File \"/var/runtime/botocore/client.py\", line 357, in _api_call\n    return self._make_api_call(operation_name, kwargs)\n",
    "  File \"/var/runtime/botocore/client.py\", line 676, in _make_api_call\n    raise error_class(parsed_response, operation_name)\n"
  ]
}
```

対象のLambda関数に付与されたIAMロールに AmazonDynamoDBFullAccess を追加する。
Lambda > 関数 > 対象Lambda関数 > 設定タブ > アクセス権限 > 実行ロール > 【対象ロール】> IAM設定画面に遷移 > 【ポリシーをアタッチします】> AmazonDynamoDBFullAccess を選択 > 【ポリシーのアタッチ】
Putが出来ないといけないので、とりあえず FullAccess を選択。
SwiftUI 点滅

え、自分で作るしかないの?!
Appleさん公式に追加してくれてもええんやで。 6月のWWDC楽しみにしとるわ。

<img width="50%" alt="kira.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982650/12f4c932-becc-c9f0-6ec1-17987b26d382.gif">

# 使い方
点滅させたい **View** に対して ```.blinkEffect()``` を付加します。

- デフォルト: ```.blinkEffect()```
- 透明さの範囲を指定: ```.blinkEffect(opacity: 0.2...1)```
- 点滅の間隔(秒)を指定: ```.blinkEffect(interval: 0.5)```

```Sample.swift
// 点滅する文字 "きらきら"
Text("きらきら")
    .blinkEffect()
```


# コピペ用コード

丸々コピペして、プロジェクト内のどこかにおいて下さい。

```BlinkEffect.swift
import SwiftUI
struct BlinkEffect: ViewModifier {
    @State var isOn: Bool = false
    let opacityRange: ClosedRange<Double>
    let interval: Double
    
    init(opacity: ClosedRange<Double>, interval: Double) {
        self.opacityRange = opacity
        self.interval = interval
    }
    
    func body(content: Content) -> some View {
        content
            .opacity(self.isOn ? self.opacityRange.lowerBound : self.opacityRange.upperBound)
            .animation(Animation.linear(duration: self.interval).repeatForever())
            .onAppear(perform: {
                self.isOn = true
            })
    }
}

extension View {
    func blinkEffect(opacity: ClosedRange<Double> = 0.1...1, interval: Double = 0.6) -> some View {
        self.modifier(BlinkEffect(opacity: opacity, interval: interval))
    }
}
```

# さいごに

もしも点滅したり止めたりしたい時は、 

1. 同じViewを2つ用意
1.  ```.blinkEffect()``` を付けたのと付けてないのに分ける
1. if文で条件によってViewを出し分ける

みたいな方法でも良ければこのコードでも出来ます。
【初心者ならわかる】HTML・CSSのよくやりがちな誤字と、スペルミスを減らす方法

# どうも7noteです。初心者ならではのよくやってしまいがちな誤字集を作ってみました。スペルミスを減らす方法も！

初心者のうちはまだHTML・CSSに慣れていなくて「あれ、うまく効かないなぁ」なんて事が多いと思います。

そして原因を調べてるうちに、あることに気付きます。

***「ここスペルミスってるやん。」***

そんなあるあるを一覧にしてみました。
誤字を探すときに参考にしていただければと。


また**スペルミスを減らす方法についても後半でまとめています！**

## HTML・CSSでやりがちな誤字

### HTML編
|◎ 正しいスペル|✕ 間違ったスペル|間違っている理由・補足|
|:--|:--|:--|
|header|herder|「a」が「r」になってる|
|footer|fotter|「o」ではなく「t」が2個ある|
|nav|navi|「i」がいらない|
|table|tabre<br>teble|「l」が「r」になってる<br>「a」が「e」になってる|
|form|from|「o」と「r」が逆になってる|
|button|botton<br>buton|「u」が「o」になってる<br>「t」が抜けてる|



### CSS編
|◎ 正しいスペル|✕ 間違ったスペル|間違っている理由・補足|
|:--|:--|:--|
|margin|magin|「r」が抜けてる|
|important|inportant<br>impotant|「m」が「n」になってる<br>「r」が抜けてる|
|center|centar<br>centr|「e」が「a」になってる<br>「e」が抜けてる|
|background|backgraund|「o」が「a」になってる|
|border|barder|「o」が「a」になってる|
|linear-gradient|linar-gradient<br>liner-gradient|「e」が抜けてる<br>「a」が抜けてる|
|font|fonts|「s」がいらない|
|height|hight|「e」が抜けてる|
|padding|pading|「d」が抜けてる|
|clear|cler|「a」が抜けてる|
|float|flort|「r」が「a」になってる|
|position|postion<br>posision|「i」が抜けてる<br>「t」が「s」になってる|
|vertical-align|vartical-align|「e」が「a」になってる|









### クラス名・id名編
|◎ 正しいスペル|✕ 間違ったスペル|間違っている理由・補足|
|:--|:--|:--|
|data|deta<br>date|「a」が「e」になっている|
|menu|manu|「e」が「a」になってる|
|main|mein|「a」が「e」になってる|
|about|abaut|「o」が「a」になってる|
|archive|arcive|「h」が抜けてる|
|group|grupe|「gr」しかあってない|
|area|aria|「e」が「i」になってる|
|column|colmun|「u」と「m」が逆になってる|
|error|erorr|「o」と「r」が逆になってる|









## スペルミスを減らす方法

### ▼ 見直す

必ずHTML側とCSS側両方見直しましょう。
**指差し**で確認したり、**声に出して**チェックしましょう。

### ▼ コピペする

特にclass名なんかは**必ずコピペ**して利用しましょう。

### ▼ Emmetなどの入力補填ツールを使う

自動入力や、入力補填ツールを使いことで手入力をできる限り減らしましょう。
**ミスだけでなく、時短にも繋がります。**

### ▼ 英単語を覚える

英語ができれば間違える数は減るでしょう。ただし日本人でも日本語を間違えることはあるので完璧には難しいです。

### ▼ 経験を積む

なれてくればミスは絶対に減ります。人間慣れればできるようになるものです。

### ▼ プロパティ名などに色がつくエディタを使う

エディタでスペルミスをしていれば気づくように、プロパティに色がつくエディタがあります。
そのようなエディタをつかっていれば、**ミスしても気づきやすくなるのでオススメ**です。


## まとめ

人間が手入力しているうちはミスはつきものです。
なんで間違えたんだろうと悔やむ時間があれば、**「どうやったらミスが減らせるのか」を考えるのに時間を使ったほうが合理的でしょう。**

ここで紹介した方法を使えば確実にミスは減っていくと思います。
少しずつHTML・CSSに慣れて行きましょう！

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
aws lambda で「Task timed out after 3.00 seconds」エラー

【Task timed out】
timeout だよ。lambda 関数の実行時間はデフォルト3秒に制限されているので、処理終了が3秒以上かかるときは変更が必要です！

```json:エラー
{
  "errorMessage": "2021-05-18T04:20:10.454Z 95510f9b-1d66-48f6-bad0-xxxxxxxxx Task timed out after 3.00 seconds"
}
```

設定 → 一般設定 → タイムアウト で、デフォルト3秒を変更。
"errorMessage": "name 'instnaceid' is not defined" エラー

<code>素人が自分のノートとして書いてますが、改善点あれば是非コメントください</code>


32行目 の【instnaceid】という文字が定義されていないよ。というエラー。
まぁ、だいたい入力間違い。ｗ
よく文字を見直してね。
67行目 がクローズアップされているのは67行目から呼び出された関数内での事象だから。

```json:エラー
{
  "errorMessage": "name 'instnaceid' is not defined",
  "errorType": "NameError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 67, in lambda_handler\n    get_inventory(instanceid)\n",
    "  File \"/var/task/lambda_function.py\", line 32, in get_inventory\n    print(instanceid_name, instnaceid, name, version)\n"
  ]
}

```
【初心者】windowsにHomebrew入れてvscodeと連携した


スクールではAWSのサービスcloud9で開発環境を作っていたのですが、
みんなのPFを確かめ合って技術を高めよう！ということでclone&VScodeに変更したら
環境の違いに最初から躓き･･･

ようやくHomebrewを入れてrbenv出来たので忘備録。。。

---
今の状況：
VScodeインストール済

##①Microsoftにubuntuを導入
https://qiita.com/yukiarrr/items/1e1562fb2a3ba7384d1b
この方の記事を参考にMicrosoftストアから導入

##②管理者を作成
https://www.delftstack.com/ja/howto/linux/how-to-add-sudo-users-in-ubuntu/
こちらを参考に作成。ここが一番時間かかりました。。。

https://win2012r2.com/2020/05/04/%E3%80%8Csudo-i%E3%80%8D-%E3%81%A8-%E3%80%8Csudo-su-%E3%80%8D%E3%81%AE%E3%81%A9%E3%81%A1%E3%82%89%E3%82%92%E4%BD%BF%E3%81%86%E3%81%B9%E3%81%8D%E3%81%8B%EF%BC%9F/
sudoコマンドについて

##③Home brewの導入
https://docs.brew.sh/Homebrew-on-Linux
https://www.rk-k.com/archives/3877
を参考にしました
rootユーザでやるとエラーになるので③の処理が必要と分かりました

##④ubuntu側でpathの設定
https://snowsystem.net/other/windows/vscode-wsl-run-error/
こちらを参考にVScode binが入っているpathを設定

追記
Homebrewのパスの設定が上手くいっていなかったので、設定し直しました。

```console:ubuntuのconsole
hogeadmin@LAPTOP-AIUEO:/$ vi /home/hogeadmin/.bash_profile
```
vi画面に。`Esc`→`i`キーを押して編集モードに。下記を追加

```bash:/home/hogeadmin/.bash_profile
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib=$HOME/perl5)"
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
export PATH=$PATH:'/bin:/sbin'
export PATH=$PATH:'/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin'
```

`Esc`キー→`:wq`と入力→エンターでOK

##⑤VScodeのターミナルに接続
F1キーかctrl + shift + Pでコマンドパレットを表示して、Remote-WSLと入力するとRemote-WSL: New WSL Windowが出てくるのでクリック
左下で接続が確認出来ればOK
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1110799/dd5b7983-5d00-eea1-ea9e-f3b6ff64d9b9.png" width=10%>

再起動するとターミナルにwslが増えているので選択すれば完了
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1110799/6e62da6a-7f58-d0e6-8db8-90bd9ea13b8f.png" width=40%>

これで使えるようになりました。。。

---

rbenvを入れようとしていたのですが、Homebrew入れた方が圧倒的に早く導入できたので、
もっと早く気づいて導入すればよかった、、、と思ってます
Google Colabを用いてPytorchのモデルをTFLiteに変換

#何の記事？

PytorchのモデルからTensorflow Liteへの変換を、Google colabを用いて行う方法です。

#Pytorch → ONNX

```
import torch
import torchvision.models as models

model_name = "resnet50"

dummy_input = torch.randn((1, 3, 224, 224))
model = models.resnet50()
torch.onnx.export(model, dummy_input, "converted.onnx", verbose=True, input_names=['input'], output_names=['output'])
```

#ONNX → Tensorflow

```
!pip install onnx_tf
from onnx_tf.backend import prepare
import onnx

TF_PATH = "./converted.pb" 
ONNX_PATH = "./converted.onnx" 
onnx_model = onnx.load(ONNX_PATH)  


tf_rep = prepare(onnx_model)  
tf_rep.export_graph(TF_PATH)
```

#Tensorflow → TFLite

```
# Convert the model
converter = tf.lite.TFLiteConverter.from_saved_model(TF_PATH) # path to the SavedModel directory
converter.target_spec.supported_ops = [
  tf.lite.OpsSet.TFLITE_BUILTINS, # enable TensorFlow Lite ops.
  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()

# Save the model.
with open(model_name +".tflite", "wb") as f:
  f.write(tflite_model)
```

#最後に
細かい説明は省略します。コピペでOKです。
EC2 を台数分リストする

<code>素人が自分のノートとして書いてますが、改善点あれば是非コメントください</code>

EC2 を台数分リストします。

```python:aws-lambda-python38
import boto3
import json

def lambda_handler(event, context):

    #EC2クライアント定義
    ec2_client = boto3.client('ec2')

    #EC2インスタンスのリストを取得するため、describe。
    response = ec2_client.describe_instances()

    #インスタンス台数分 for 文で回す
    for reservation in response["Reservations"]:
        for instance in reservation['Instances']:
            instanceid = instance['InstanceId']
            #表示
            print("instanceid=", instnaceid)
```

たとえばAvailabilityZoneの情報を追加したい場合は、以下のような感じで追加。
['Placement']が増えているのは、describe した JSON の結果として、{Placement}の配下にあるから。
追加したい情報ごとに、都度都度 describe の JSON 結果を見ながら調整してくださいませ。

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Client.describe_instances

```python3:aws-lambda-python38
            availabilityzone = instance['Placement']['AvailabilityZone']
            print("AvailabilityZone=", availabilityzone)
```
WinPEを作成 (Win10PESE、WinPtchX)

## 制限

* WinPE は 72時間で再起動する様子。

## AOMEI PE Builder

https://forest.watch.impress.co.jp/library/software/aomei_pe/

## Win10PESE

海外製。WinPtchXより良い面も多い様子

Win10XPEというものもあった。同じ？

https://github.com/ChrisRfr/Win10XPE

## WinPtchX

* [作者HP](http://kiki2.suppa.jp/pe_winpetch.htm)
* [ダウンロード](https://www.vector.co.jp/soft/dl/winnt/util/se516230.html)

![win.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/59242be0-1355-5d95-d198-ecfc55adf470.png)

![win2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/516c47b9-0128-b532-c76d-adbd834681a6.png)

### 起動

![VirtualBox_win10_18_05_2021_20_20_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/743d6d49-788d-ea52-b81f-36bd5e7c421a.png)

![taskmgr.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/e11a1197-faf6-b059-c7db-171c5afcff46.png)
"errorMessage": "Syntax error in module 'lambda_function': invalid syntax (lambda_function.py, line 14)"エラー

【Syntax error in module 'lambda_function':】
構文ミスです。

例の場合は、関数定義の行末に「:」が抜けてたもの。
ほぼ間違いなく、指摘のある行数(今回は14行目)のどこかに、正しくない構文(何かが足りないとか、コロンとセミコロンがまちがってるとか)があるので、おちついてじっくり1文字ずつ見直そう！

```json:エラー
{
  "errorMessage": "Syntax error in module 'lambda_function': invalid syntax (lambda_function.py, line 14)",
  "errorType": "Runtime.UserCodeSyntaxError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\" Line 14\n    def get_inventory(instanceid)\n"
  ]
}