OmniAICreator/Qiita-1.07M huggingface dataset:
s3のCSE,SSE とは

## 勉強前イメージ

わからない・・・

## 調査

### CSE,SSE とは

#### CSE

Client Side Encryption の略で、
クライアント側で暗号化・復号化を行う暗号化方式です。
s3のCSEには以下の2種類があります。

- CSE-KMS
	- KMSで作成したCMKを使って暗号化を行う
- CSE-C
	- ユーザが用意した鍵で暗号化を行う

#### SSE

Server Side Encryption の略で、
サーバ側で暗号化・復号化を行う暗号化方式です。
s3のSSEには以下の3種類あります。

- SSE-S3
	- 暗号化のキーや管理をAWSで管理
- SSE-KMS
	- 暗号化のキーをKMSで管理
	- 暗号化キーの権限を設定することができる
- SSE-C
	- ユーザが用意したキーでの暗号化
	- キーを自分で管理しないといけない


### s3での設定方法

バケットを作成する箇所で、以下の設定を行うことができる

![1S3 bucket - Google Chrome 2021-08-16 21.05.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/9015aad8-bfff-e87a-b2bc-b86c9b691550.png)


## 勉強後イメージ

見たことはあったけど、
正直なんやろなぁとは思ってた。
KMSとかはわかってたけど。。。
それぞれの要件によって決めないといけない

## 参考

- [S3 のセキュリティの落とし穴](https://www.wafcharm.com/blog/s3-security-pitfalls/)
- [Amazon S3 サーバーサイド暗号化について](https://zenn.dev/amarelo_n24/articles/3d252c27cfb98e)
[Ruby on rails]タグ付け機能③投稿編集時のタグの編集と削除 (with 記事の下書き保存）

<h2>初めに</h2>
②までの実装だと、投稿編集時にタグの数を減らしたりすると、
エラーが出るかと思います。

https://qiita.com/ki_87/items/a344ea566c88b10b950c

https://qiita.com/ki_87/items/ae5d44af096df01ca587

<h2>コードについて</h2>
③の記事から、投稿の下書き機能も導入しているため、
少しコードが見にくくなっています。
下書き機能については、以下の記事で説明しています。

https://qiita.com/ki_87/items/3e2d570e3ee3710ff506

下書き保存ではタグの保存はしないようにしたいので、以下のコードでは、
if params[:post][:status]== "公開"か、そうじゃないか（下書き）で、
条件分岐しています。

<h2>コントローラー</h2>

```perl:post_controller.rb
def update
    # postのid持ってくる
    @post = Post.find(params[:id])
    # 入力されたタグを受け取る
    tag_list = params[:post][:name].split(',')
    # もしpostの情報が更新されたら
    if @post.update(post_params)
      if params[:post][:status]== "公開"
    # このpost_idに紐づいていたタグを@oldに入れる
        @old_relations=PostTag.where(post_id: @post.id)
    # それらを取り出し、消す。消し終わる
        @old_relations.each do |relation|
        relation.delete
        end  
         @post.save_tag(tag_list)
        redirect_to post_path(@post.id), notice: '更新完了しました:)'
      else redirect_to posts_path, notice: '下書きに登録しました。'
      end
    else
      render :edit
    end
  end
```

記事の編集では、その投稿についていたタグを一旦全て削除し、
再度タグを登録し直しています。
①のモデルでの記述を思い出してみて、この方法しか思いつきませんでした。

<h2>とても参考になった記事</h2>

https://qiita.com/tochisuke221/items/992198e40ead2f0c42f8
[iOSショートカット] ログインユーザー名・パスワードを入力


:::note info
クリップボードが「ユーザー名 → パスワード」に切り替わるので、ペーストするだけでログインできる
キーボード入力から開放されるので、タイピングミスによるエラーはなくなる
:::

## 事前準備

[iPhone、iPad、iPod touch で共有ショートカットを有効にする](https://support.apple.com/ja-jp/HT210628)

## 共有ショートカット

https://www.icloud.com/shortcuts/457ef554498f475b8fe77b64e2b076e3

:::note warn
マイショートカットに追加されるので、ユーザー名とパスワードを編集してください
:::

## 導入後のログイン操作

```
メニュー「クリップボードにユーザー名にします」をタップ
↓
IDにペースト
↓
パスワードがコピーされたメッセージが表示されたら、
パスワードにペースト

```

:::note info
オートメーションで、アプリ起動時に上記の共有ショートカットを実行させることで、
起動時にログインユーザー名・パスワードを求められるアプリで使用することができるかと思います。
:::

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/4845c9e9-e4eb-83c5-4853-8510163894d6.png)



## 仕組み

```
メニュー「クリップボードにユーザー名にします」をタップ
↓
クリップボードに辞書に指定したユーザー名をコピー
↓
５秒後
↓
クリップボードにパスワードがコピーされたメッセージが表示し、
クリップボードに辞書に指定したパスワードをコピー
```
Reactポートフォリオをgh-pagesでGitHub Pagesに公開するまで

社会人2年目の僕がReactポートフォリオをGitHub Pagesで公開するまでの話。

# 大まかな流れ
1. ビルドする
1. gh-pagesをインストール
1. package.jsonを編集
1. BrowserRouterにbasename={process.env.PUBLIC_URL}を追記
1. gh-pagesを実行
1. 公開完了

# 環境
何を書いておけばいいのかイマイチ分かりませんが参考までに。
Windows 10 Pro
Visual Studio Code
Node.jsをnvm-windowsでインストール
npmでyarnをインストール

# ビルドする
サーバーにReactのフォルダを放り込んだら表示されるのかなと思っていましたが表示されません。
ビルドっていうのをしてReactのファイル達をWeb上で表示する用に変換しないといけないみたいです。

```:Git&#x20;Bash
yarn build
```

実行するとbuildというフォルダができます。
これをアップロードすればいいんですね、すごく簡単。
早速build内のファイル達をGitHubにアップロードしページを確認。
、、、真っ白。

# gh-pagesをインストール
ページが真っ白な原因を調べていると便利そうなものを発見。
どうやらGitHub Pagesに公開するまで手順を簡単にするものらしい。
npmでパッケージをインストールする。

```:Git&#x20;Bash
npm install gh-pages --save-dev
```

# package.jsonを編集
gh-pagesを使うにあたって2か所追記が必要だそうです。

```ruby:package.json
"homepage": "https://自分のGitHubユーザー名.github.io/自分のGitHubリポジトリ名"
```

nameやversionと同じ並びにhomepageを追記。

```json:package.json
"scripts": {
  "predeploy": "npm run build",
  "deploy": "yarn build && gh-pages -d build"
}
```

scriptはすでに記載されていたのでその中のstartやbuildの並びに2行追記。

#BrowserRouterにbasename={process.env.PUBLIC_URL}を追記
BrowserRouterで画面遷移させている人はこれをしないと404エラーで画面が真っ白だったり404ページが表示されてしまうようです。
自分の場合も画面が真っ白だった時開発者ツールにたくさんの404エラーが出ていました。

```xml
<BrowserRouter basename={process.env.PUBLIC_URL}>
  ...
</BrowserRouter>
```

これを書くことでpackage.jsonに書いたhomepageが参照されてどうにかなるらしいです。

# gh-pagesを実行

```:Git&#x20;Bash
git add .
git commit -m'first commit'
git remote origin add https://自分のGitHubユーザー名.github.io/自分のGitHubリポジトリ名.git 
git push origin master
```

1度実行しないとエラーで進めませんでした。
理由は分かりませんがgit remoteなんたらをやる必要があるみたいです。
これで準備完了ということで実行コマンドを入力します。

```:Git&#x20;Bash
yarn deploy
```

最初はPowerShellでコマンド実行していたのですがなにかとエラーが多かったのでGit Bashがおすすめです。
無事実行出来たらGitHubでリポジトリを確認します。
masterとは別にgh-pagesというブランチができていてそこにbuildフォルダの中身がアップロードされているのが確認できます。
GitHub Pagesを確認。
表示されていました、、、
感動。

# さいごに
ざっくり書いてみたのですがいかがでしたでしょうか。
同じような環境で躓いてしまった人の情報の足しになれば幸いです。
ちなみに僕は今回書いたGitHub Pagesでポートフォリオを公開にあたって5時間近くかかりました。
初学者はこれの繰り返しですよね。
今回は備忘録として書いてみました。
見てくださった方々ありがとうございました。
cronの使い方メモ


#概要
ジョブを定期実行するcronの簡単な説明。

```bash
crontab -e #cronにジョブを登録する.テキストエディタが起動する.

crontab -l #現在登録されているジョブが表示される.

crontab -r #ジョブを削除する.
```

##cronの書き方

```bash
#初期状態(1分毎に実行)
* * * * * command
```
時間は整数値で指定。単位は前から分、時、日、月、曜日、最小単位は分なのでそれ以上の粒度で実行するには別に用意する必要がある。例:[任意の時間内に任意の間隔でシェルスクリプトを実行する変なやつのメモ](https://qiita.com/FizmimiFiz/items/74054dd0008c512247b1)
###指定可能な数値
|単位|範囲|備考|
|:-|:-|:-|
|分|0-59|
|時|0-23|
|日|1-31|
|月|1-12|
|曜日|0-7|0と7は日曜日|

#参考
[【入門】cron（クロン）設定・書き方の基本](https://www.kagoya.jp/howto/rentalserver/cron/)
プログラミング初心者が書いたGitHubのパスワード認証廃止の対策について(Mac版)

はじめに
-----
先日の8月14日にいつも通りローカルのリポジトリからリモートへプッシュしようとしたところ
何故か突然下記のメッセージが表示されました。

```
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: unable to access 'https://github.com/◯◯◯◯◯◯/◯◯◯◯◯◯◯◯◯◯◯◯.git/': The requested URL returned error: 403
```

August 13(8月13日)って何かあったっけか？と思い、エラー文をベタ貼りして調べてみると
こんなニュース記事を見つけました。

https://news.mynavi.jp/article/20201222-1604003/

正直な話、GitHubがパスワードでの操作を禁止するなんてこの瞬間まで知らなかったので驚きでしたね。。。
ただこのままではpushがいつまでも出来ないので個人のトークン作成というものを行いたいと思います！

トークンの作成
------
まずは下記のリンクへアクセスをします。
https://github.com/settings/tokens

そしてアクセスした画面の右上にある``Generate new token``をクリックします。
![トークン作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1478204/de82301c-4936-f191-675b-45e9064715bb.png)
続いて写真の画面に遷移しますので、赤丸で括られたところ記入します。
``Note``のところにはトークンの名前を、``Expiration``は有効期限を選択できるので適当に選びます。
``Select scopes``のところは僕はリポジトリへのアクセスにのみ使用するため「repo」を選択しました。

そこまで記入し終えたら一番下にある``Generate token``というボタンを押して作成します。
ここでトークンが作成されますので、そのトークンの文字列ごとコピーしておきます。

続きましてmacのアプリケーションを検索するところから``キーチェーンアクセス``を呼び出します。
![IMG_2648.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1478204/2f5530cc-c701-993a-4101-fa5d2ca120d2.jpeg)
``キーチェーンアクセス``を呼び出したら再び右上の検索窓から``github``と検索します。
検索するといくつか該当のものが出ますので、その中から``インターネットアクセス``と書いてあるものを選びます。
![IMG_2650.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1478204/3810ad60-a307-9fda-56c5-126b044a0511.jpeg)
そうしましたら画像のような画面が出ますので、パスワードを表示にチェックを付け現在のパスワードを表示させます。
そして現在のパスワードが表示されたところに先ほど作成したトークンを貼り付けて保存します。

この状態で再びgithubをpushすると僕は出来るようになりました！
最初はめちゃくちゃ焦りましたが落ち着いて色々と調べてみると解決策も出てくるので
まずは自分で検索することが大事だなと改めて実感しましたね。

参考記事
https://predora005.hatenablog.com/entry/2021/02/04/190000
https://zenn.dev/suzuki_hoge/articles/2021-08-github-access-f732e5b9868137
Support for password authentication was removed. Please use a personal access token instead. git push エラー

# 背景
[近年、GitHubのお客様は、二要素認証、サインインアラート、認証済みデバイス、漏洩したパスワードの使用防止、WebAuthnなどのセキュリティ機能の恩恵を受けています。これらの機能により、攻撃者が複数のウェブサイトで再利用されているパスワードを使ってGitHubアカウントにアクセスしようとすることが難しくなります。これらの改善にもかかわらず、歴史的な理由により、二要素認証を有効にしていないお客様は、GitHubのユーザー名とパスワードだけでGitやAPIの操作を行なっていました。](https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/)

2021年8月13日以降、GitHub上で認証されたすべてのGit操作において、アカウントのパスワードを受け付けなくなり、パーソナルアクセストークン（開発者向け）やOAuthまたはGitHub Appインストールトークン（インテグレーター向け）などのトークンベースの認証の使用が必要になります。また、引き続きSSH鍵を使用することも可能です。

<br>

```
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
```

 

<!-- 各チャプター -->
<a id="#トークン認証のメリット"></a>
# トークン認証のメリット


**・ユニーク：**
トークンはGitHub固有のものなので、使用ごと、またはデバイスごとに生成することができます。

**・取り消し可能：**
影響を受けていない認証情報を更新することなく、いつでも個別にトークンを取り消すことができます。

**・限定：**
ユースケースで必要なアクセスのみを許可するようにトークンを絞ることができます。

**・ランダム：**
トークンを覚える必要がなく、ディクショナリアタックの影響を受ける可能性が低い。


<br>
<a id="#解決方法"></a>
# 解決方法
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1065841/a9022593-c7c0-d9bd-7acb-6f8cb1d52401.png" width=20%>　　　
 　　　　　　　　　　↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1065841/ef9158f5-424b-7f4a-362e-0f944a5b7a11.png" width=70%>　　　
 　　　　　　　　　　↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1065841/4dd897dc-f2ac-5b67-4fcd-9f65225097cb.png" width=50%>　　　

<br>
<br>

・トークンを発行したら

```
git remote set-url origin https://<your_token>@github.com/<USERNAME>/<REPO>.git
```

 <　your_token　> : 先発行したトークン
 <　USERNAME　>　: ユーザーネーム
 <　REPO>　: リポジトリ名


<br>

<a id="#reference"></a>
# 参考文献
- https://stackoverflow.com/questions/68775869/support-for-password-authentication-was-removed-please-use-a-personal-access-to
資格試験の合格率の考察

#概要
資格試験の勉強をしていると、自分がどれくらいの確率で合格するか気になりませんか？
私も近々、資格試験を控えていますが、実力を発揮した時の合格率って果たしてどのくらい？と、疑問に思ったので調べてみることにしました。


#データ抽出

8月になってから取り組んだ過去問５年分のデータを使います。結果は以下のとおりとなりました。

```math
76.5,87.7, 71.4, 82.6, 78.8
```
因みに試験の合格最低点は70点です。３回目のテストでは70点ギリギリの点数でしたがそれ以外は概ね70点+α位の点数をとっています。本番もこのくらい取れれば嬉しいですね、、、

平均$\bar{x}$と、分散$\sigma^2$は以下のとおりです。

```math
\bar{x} = 79.4 \\\sigma^2 = 30.4
```

#T分布から合格率を推定する
先ほどの5つのデータを用いてデータ分析をしていきます。今回はデータ量が少ないので簡易的に考えて合格率を推測します。
方法はT分布を使って、母平均の区間推定をします。推定した区間が合格点の70点以上となるとき、「合格」として確率を計算します。
本来であれば、カイ二乗分布で母分散の区間を調べて、母平均と母分散の両方から確率を求めようかと考えましたが、計算が途方もなく大きくなりそうなので省略しました。
まず、T分布で使用する平方和$S$と不偏分散$V$を求めます。

```math
S = \Sigma{x^2_{i}} - \frac{(\Sigma x_{i})^2}{n}=151.9\\

V = \frac{S}{n-1}=\frac{151.9}{4}=38.0
```

区間推定する時の信頼率$100(1-\alpha)$%の$\mu$の信頼区間は下式で求められます。$t$はT分布の表から求めます（自由度$\phi =4$、$\alpha = 5$%（片側確率））

```math
\biggl(\bar{x}-t(\phi, \alpha)\sqrt{\frac{V}{n}}, \bar{x}-t(\phi, \alpha)\sqrt{\frac{V}{n}}\biggr)
```

この式を参考にして母平均$\mu$を信頼率95%で片側区間推定をすると、以下の不等式になりました。

```math
\mu \geqq 73.5
```

無事、70点以上となっています。今度は70点以上となる区間の確率を逆算してみると

```math
P=0.986
```
となり、99%に近い値が出ました。
これだけを見ると受かったも同然に見えるかもしれません。しかし、本当ならこの母平均に母分散を合わせて合格率の推定をしなければいけません。仮に、母平均が70%であれば、受かる確率は50%となります。このように母平均が70点台では試験に落ちる確率も計算に入れなければいけない程大きい値になります。なので、全体でみたときの合格率は99%よりも確実に下がりますが、今回の標本平均$\bar{x}=79.4$と$\sigma=\sqrt{30.4}=5.5$から考えても、90%程度の合格率はあるのかなと考えています。
僕の今までの資格試験の経験でも合格点＋10点をコンスタントに取れるようになっているときは大体受かっていたので、実際これくらいの合格率が妥当かなと思います。
最後は定性的な評価になってしまいましたが参考になれば幸いです。

#参考文献・サイト
https://keisan.casio.jp/exec/system/1161228824

https://manabitimes.jp/math/1081
～ Union-Find ～ チートシート

#目次
[Union-Findとは](#Union-Findとは)
**[実装](#実装)**
[工夫](#工夫)

#はじめに

チートシートの扱いついては[ここ](https://qiita.com/ysys_Ba/items/d27282b888abbd1f43e7#%E3%83%81%E3%83%BC%E3%83%88%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)を読んでください

#Union-Findとは

要素同士の結合から、グループの数や要素数などを求めるためのデータ構造
要素全体を森、同じ木に属する要素を同じグループとして扱う

Union-Find木を使う手順
①すべての要素を独立した木とし、自身を根とする
②２つの要素の結合が与えられそれぞれが異なる木の場合、２つの木を結合し１つの木とする
③根が同じ要素は同じ木に属することを利用し、要素同士が同一のグループかを判定する

詳しくは[こちらのページのスライド](https://atcoder.jp/contests/atc001/tasks/unionfind_a)を参照

#実装

[classを使うのに不安を覚える雑魚](https://twitter.com/ysys_Ba) 用のコード

```python:Union-Find.py
N,M = map(int,input().split())

root = [i for i in range(N+1)] # 要素の根を格納する配列
rank = [0]*(N+1) # 木のランク（高さ）を格納する配列
size = [1]*(N+1) # 木のサイズ（要素数）を格納する配列

def union(x,y):
  root_x = find(x)
  root_y = find(y)
  if root_x != root_y:
    if rank[root_x] >= rank[root_y]:
      if rank[root_x] == rank[root_y]:
        rank[root_x] += 1
      root[root_y] = root_x
      size[root_x] += size[root_y]
    else:
      root[root_x] = root_y
      size[root_y] += size[root_x]
      
def find(x):
  tmp_root = x
  while True:
    if tmp_root == root[tmp_root]:
      break
    tmp_root = root[tmp_root]
  root[x] = tmp_root
  return tmp_root

# find(A) == find(B) ならばAとBは同じグループに属する
# size[find(A)] でAを含むグループの要素数を得られる

for i in range(M):
  A,B = map(int,input().split())
  union(A,B)
```
#工夫

計算量を落とすために、主に２つの工夫を行う

##①ランクの利用
根が等しいかどうかで要素のグループが等しいかを判定するので、木同士を結合する際に片方の木の根をもう片方の木の根に直接つなぐ
この時、ランク（木の高さ）が小さくなるように**ランクが小さい方の根を大きい方の根につなぐ**

##②経路圧縮
途中で要素の根がわかったら、**その要素を根に直接つなぎなおす**（要素の根を格納する配列を更新する）
[QGIS]別ファイルからの複数レイヤの読み込み

# [QGIS]別ファイルからの複数レイヤの読み込み
起動時にプロジェクトファイルを読み込む形ですと、レイヤ数・ラスタレイヤが多い場合にQGISの起動が遅くなってしまうための対応策として、別タイミングでの複数レイヤでの読み込みを試していきます。

- 環境
    - QGIS 3.16

## 別ファイル

QGISが定義するファイルで複数レイヤが定義されているのは下記のファイルになります。
pythonを使用しての下記のファイルでの追加方法について記載していきます。


- project.qgz, project.qgs
    - プロジェクトファイル
- layers.qlr
    - レイヤ定義ファイル


## プロジェクトファイルからのレイヤ追加

`QgsProject.createEmbeddedGroup`でプロジェクトファイル内のグループ名とプロジェクトファイル・非表示にするレイヤリストを指定することで、GroupNodeを作成します。
その後、追加したいGroupに対して`.addChildNode`で追加することが可能です。
オプションでプロジェクトの読み込み(QgsProject.ReadFlags)を制限できます。


    path = r'C:\Users\ikura\work\temp\tiles.qgz'
    project = QgsProject.instance()
    root = project.layerTreeRoot()
    invisible_layer_ids = []
    
    group = project.createEmbeddedGroup('Tiles', path, invisible_layer_ids)
    root.addChildNode(group)


## レイヤ定義ファイルからのレイヤ追加

レイヤ定義ファイル用クラスのQgsLayerDefinitionから読み込みます

**レイヤのみの読み込み**
`QgsLayerDefinition.loadLayerDefinitionLayers`に`.qlr`を指定することでLayerのみの配列を取得することができます。
取得したレイヤ配列をprojectに追加することでレイヤのみを追加することが可能です。


    project = QgsProject.instance()
    path = r'C:\Users\ikura\work\temp\tiles.qlr'
    
    layer_list = QgsLayerDefinition.loadLayerDefinitionLayers(path)
    project.addMapLayers(layer_list)

**フォルダを含めた読み込み**
`QgsLayerDefinition.loadLayerDefinition`に`.qlr`ファイルとプロジェクト・グループノードを指定することでグループノードに.qlrファイルに定義されたグループ・ファイルを追加することが可能です。


    project = QgsProject.instance()
    group = project.layerTreeRoot()
    path = r'C:\Users\ikura\work\temp\tiles.qlr'
    
    QgsLayerDefinition.loadLayerDefinition(path, project, group)
## 参考


https://gis.stackexchange.com/questions/351409/export-import-a-layer-as-qlr-in-qgis-3-4-using-pyqgis
Call to undefined method StdClass::save()

Laravelで**記事を更新する処理(update)**を書いている際に起こったエラーです。原因は単純なことだったのですが、エラー解消に２日ほど時間がかかってしまったので共有したいと思いました。

![スクリーンショット 2021-08-16 18.44.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807496/c68bac7a-f557-67cb-bb21-974f67c771b0.png)


##　環境

・PC: Macbook Pro 2017
・Laravel 5.8
・PHP 7.4.15
・Mysql 5.7.34



##　 原因
更新したい記事を取得する際に*Eloquent*で取得したレコードと*クエリビルダ*で取得した**レコードの型が違うこと**が原因でした。
色々な方の記事を参考にしてアップデートの処理を書いていたため、上記のことを理解しておらずハマりました。

*Eloquent*

```php
$rsv = Book::where('user_id','=',$user)
        ->orderBy('created_at','desc')
        ->first();
```

*Eloquentで返すレコード(object(Illuminate\Support\Collection)*
![スクリーンショット 2021-08-16 19.09.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807496/3290d4bf-51cf-dd7e-271e-488cf7322d44.png)



*クエリビルダ*

```php
$rsv = DB::table('books')
        ->where('user_id','=',$user)
        ->orderBy('created_at','desc')
        ->first();
```

*クエリビルダで返すレコード(array(n) { [0]=> object(stdClass)*
![スクリーンショット 2021-08-16 19.29.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807496/a354d282-c64d-9953-2bd8-3a7f10a42637.png)


僕の場合はEloquentで処理を書いていたので、クエリビルダではなくEloquentのモデルを使ってデータを取得しなければならなかったということです。

お役に立てたら嬉しいです。

## 　参考にさせて頂いた記事
[・Eloquentとクエリビルダ返す値の違い](https://qiita.com/Calmar/items/d17c4230197b1536cf26)
[・Laravel Eloquent](https://readouble.com/laravel/5.8/ja/eloquent.html#updates)
React-Redux-TypescriptアプリでCarousel機能を実装

# 初めに
この記事は現在アプリ開発している際に、自身が使用したものに対しての備忘録用として記載します。

# Carouselとは
Carouselとは以下画像のようにセットした枚数分を一枚ずつスライド式で表示するもの

イメージ画像（以下に記載するコードとは関係ありません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1452625/9849772f-15e8-1d40-451a-918a22ca43ec.png)

# ライブラリの使用
このCarousel機能を１から実装するととても手間がかかるので、用意されているライブラリを使用しました。

何個かあるのですが、自分は<font color="Red">react-material-ui-carousel</font>を使用しました。
これを使用した理由はCSSを整えたい場合に簡単に変更が可能だからです。

もし、インポートしたCarouselをそのまま使用するのなら<font color="orange">react-responsive-carousel</font>がオススメです。

リンク先：
react-material-ui-carousel : https://www.npmjs.com/package/react-material-ui-carousel
react-responsive-carousel : https://www.npmjs.com/package/react-responsive-carousel

#使い方
・インストール
`npm install react-material-ui-carousel --save`
・yarnの場合
`yarn add react-material-ui-carousel`

```javascript
import Carousel from 'react-material-ui-carousel';

//省略

export default function test(){
  return(
     <>
       <Carousel>
          <div>test1</div>
          <div>test2</div>
          <div>test3</div>
       </Carousel>
     </>
  )
}
```

これだけで要素が3つのCarouselが完成です。

#styleを変更したい場合
上記だけでもUIは自動的に整った形で表示されるのですが、高さやNextボタンの配置や色合いなどを変更したい場合は以下のように記載します。

```javascript
import Carousel from 'react-material-ui-carousel';

//省略

export default function test(){
  return(
     <>
       <Carousel
        indicatorIconButtonProps={{
          style: {
              padding: '0 15px',
          }
        }}
        indicatorContainerProps={{
          style: {
            margin: "3px 0px 0px 0px"
          }
        }}
        navButtonsWrapperProps={{
          style: {
              marginTop: "55px",
          }
        }}
        navButtonsProps={{
          style: {
            color: "rgb(0,0,0,1)",
            background: "rgb(255,255,255,0)",
          }
        }}>
          <div>test1</div>
          <div>test2</div>
          <div>test3</div>
       </Carousel>
     </>
  )
}
```

どこがのスタイルが変更になるかは試しながら実装していっていただきたいですが、公式HPにあるstyleの変更Propsは以下となります。（漏れがあったらすみません）
・navButtonsWrapperProps
・navButtonsProps
・indicatorIconButtonProps
・activeIndicatorIconButtonProps
・indicatorContainerProps

#最後に
拙い記事ではございますが、以上がCarousel機能のご紹介でした。
react-material-ui-carouselはCSSの変更以外にもオートプレイをtrue/falseにするなど、細かい機能がありますので、Carousel機能の実装を考えている方は是非色々試しながら使用してみてください。
wordpressのおすすめプラグイン

# はじめに

私が普段使っているwordpressプラグインを共有します。

初学者向けです。

# 目次

- WP Multibyte Patch
- Show Current Template
- Query Monitor
- Yoast Duplicate Post
- Admin Bar Position
- Breadcrumb NavXT
- contact form7
- Table of Contents Plus
- EWWW Image Optimizer
- All-in-One WP Migration

# 各種プラグイン説明


##  [1. WP Multibyte Patch](https://ja.wordpress.org/plugins/wp-multibyte-patch/)

<img src="https://s.w.org/plugins/geopattern-icon/wp-multibyte-patch.svg" width="120">

英語版wordpressを日本語設定で使う際文字化けや表示のずれを防いでくれる。

~~日本語版wordpressには標準搭載されている~~
**2018年12月6日にWordPressバージョン5.0がリリースされると同時に標準されなくなりました。**

なら日本語版使えって？？


[Local by Flywheel](https://localwp.com/)　※超有名なwordpress開発環境

を使う関係上英語版wordpressになってしまうのです!!

[WP Multibyte Patchを使う利点はこちらの記事を参考にしてください](https://wp-lab.net/1429/)


## [2. Show Current Template](https://ja.wordpress.org/plugins/show-current-template/)

<img src="https://ps.w.org/show-current-template/assets/icon-256x256.png?rev=976031" width="120">
　
 
現在のテンプレートをアドミンバーに表示する

## [3. Query Monitor](https://ja.wordpress.org/plugins/query-monitor/)

<img src="https://ps.w.org/query-monitor/assets/icon-256x256.png?rev=2301273" width="120">

そのページで使える条件分岐タグ等の情報がわかる

## [4. Yoast Duplicate Post](https://ja.wordpress.org/plugins/duplicate-post/)

<img src="https://ps.w.org/duplicate-post/assets/icon-256x256.png?rev=2336666" width="120">

記事を複製することができる

表示確認のための記事複製がものの数秒で完了します

## [5. Admin Bar Position](https://wordpress.org/plugins/admin-bar-position/)

<img src="https://s.w.org/plugins/geopattern-icon/admin-bar-position.svg" width="120">

アドインバーを下に下げることができる

アドミンバーとヘッダーが重なってみずらい!!を解消してくれる

## [6. Breadcrumb NavXT](https://ja.wordpress.org/plugins/breadcrumb-navxt/)

<img src="https://ps.w.org/breadcrumb-navxt/assets/icon-256x256.png?rev=2410525" width="120">

パンクズリストといったらこれ!!

表示したい場所に`bcn_display();`と記入するだけ
cssはお好みで

## [7. contact form7](https://ja.wordpress.org/plugins/contact-form-7/)

<img src="https://ps.w.org/contact-form-7/assets/icon-256x256.png?rev=2279696" width="120">

フォームを簡単に作ることができるプラグイン

確認画面がないことから人気を博している



## [8. Table of Contents Plus](https://ja.wordpress.org/plugins/table-of-contents-plus/)

<img src="https://ps.w.org/table-of-contents-plus/assets/icon-256x256.png?rev=1151771" width="120">

目次を簡単に作ることができるプラグイン!!
基本的にはデフォルト設定でOK


## [9. EWWW Image Optimizer](https://ja.wordpress.org/plugins/ewww-image-optimizer/)

<img src="https://ps.w.org/ewww-image-optimizer/assets/icon-256x256.png?rev=1582276" width="120">

wordpress内の画像を圧縮してくれるプラグイン


プラグインを有効かした後、追加される画像を自動圧縮

既存の画像を一括圧縮もできる

## [10. All-in-One WP Migration](https://ja.wordpress.org/plugins/all-in-one-wp-migration/)

<img src="https://ps.w.org/all-in-one-wp-migration/assets/icon-256x256.png?rev=2458334" width="120">

ローカル環境から本番環境への移行をプラグインで解決!!

手動で移行するやり方を知るのは重要ですが、普段はプラグインで時短しましょ!!

# おわりに

wordpressはプラグインを使うことでより快適に便利に扱うことができるCMSです。

今回あげたプラグインはとても便利なので使ってみてください!!
知らないと損！Power Automate Desktopでログインとファイル移動を無料で自動化！



##面倒な請求書発行システムへのログインを自動化
毎月26日に請求明細のダウンロード業務があるのですが、そのサイトのログインが
**とにかく面倒くさい。**（IDが32桁もあり、入力箇所が４か所に分かれていてコピペも面倒）
今回は、**「webレコーダー機能」で誰でも手軽**にフローが作成できる
Power Automate Desktop（以下PAD）を使って**ログイン～明細のダウンロードまでを自動化**してみたところ2分程度の作業が、ボタンひとつで**約50秒に短縮**できました（感動）

実行させたら放置でよいので、その間は別の業務に取り掛かる事ができて効率UPになりました。
ログインの自動化はRPAの初歩的な設定だと思いますが、こんなに便利になるとは。他の事も小さな事から自動化していって、さらには各自が自由に使いこなせたらスピードアップ＆楽ができるようになりますね。
まずは、無料版のPADを使って「デジタルコワイ勢」の人達の壁を崩す足掛かりにしたいです。


##使用ツール
Power Automate Desktop（無料）
Microsoft Edge
##事前準備
今回はMicrosoft Edgeを使用するため、事前に拡張機能のインストールを実施します。
手順は下記のサイトを参考にしました。
**Power Automateサポート**https://support.asahi-robo.jp/tutorial/power-automate-desktop/beginner/web-recorder

##実装内容
今回私が使ったのはPADの「Webレコーダー」という機能。
PC上で自分が操作した通りに記憶してくれるので、アクション機能を理解していない初心者でも簡単に設定できます。
◆PADのフロー全体図
![フロー全体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1792185/9d09f2af-8182-4915-50fc-6cf9f3693bb2.png)


##ステップ１：システムへのログインをwebフローで生成
①PADを起動して「+新しいフロー」をクリックし、任意のフロー名をつけて作成
②上のバーにある「webレコーダー」をクリック
③使用するwebブラウザーインスタンスを指定という画面が出てくるので
　任意のブラウザーを選んで次へ（今回はMicrosft Edge）
④Webレコーダーがポップアップで立ち上がるので、左上の「●レコード」を押して記録スタート
　自分のやりたい作業を進め、終わったら終了ボタンをクリックする
⑤アクションフローが自動で生成されているので、「▷実行」をクリックして動作確認する

##ステップ２：ダウンロードしたファイルを任意のフォルダーへ移動
①アクションメニューのループから「For each」を選び、自動生成されたアクションの一番下へドラッグ＆ドロップする
②「For each」の編集で、パラメータ選択の{x}をクリックし「Files」を選択して保存
③アクションメニューのファイルから「ファイルの移動」を選び、For eachとEndの間にドラッグ＆ドロップする
④「ファイルの移動」の編集で、パラメータの{x}をクリックし「Currentitem」、宛先フォルダーに任意のフォルダーを選び保存

##制作を終えて
私も含めて、周囲はまだまだデジタル技術に明るくない従業員が多いですが
ぜひ自分で触ってみて欲しいツールだと思います。
「難しい」「私にはわからないから」という壁はなかなかに高いので
推し引きを考えながら徐々に堀を固めていきたいと思います。
ファイルの有無を確認する単体テストについて

商品出品機能の単体テストを行った際に以下のようなメッセージが表示された。

*ActiveSupport::MessageVerifier::InvalidSignature*

調べてみるとFactoryBotでimageの情報をFakerを用いて用意していたことが誤りだったようだった。
※型(stringやintegerなど)の違いによるもの

下記のようにimageファイルを用意したところ事象は解決した。

```ruby
after(:build) do |item|
  item.image.attach(io: File.open('public/images/test.png'), filename: 'test_image.png')
end
```
Rails apiモード構築時にBundleがインストールできないエラー＆解決方法（db:MySQL）

Rails apiモードの構築時、Bundleがインストールできないエラーが発生しました。
解決に至った方法をメモも兼ねて記述しておきます。
当方初学者なので、気になるところや、こうした方が良かった等のご意見も頂ければ嬉しいです！

Railsのバージョンは

```
~ % rails -v
  Rails 5.2.6

~ % bundle -v
  Bundler version 1.17.2
```

###エラー内容
（コマンド中の「％」などは人によって異なると思います。）

```
~ % cd myapp

myapp % rails new api --database=mysql --skip-bundle --api
	  create  
      create  README.md
      create  Rakefile
      create  .ruby-version
      create  config.ru
      create  .gitignore
      create  Gemfile
         run  git init from “."
	  ・
	  ・
	  ・
myapp % cd api
```

Railsインストール完了後

```
api % bundle install
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/............
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Using rake 13.0.6
Using concurrent-ruby 1.1.9
	・
	・
	・
Fetching mysql2 0.5.3
Installing mysql2 0.5.3 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
	・
	・
	・
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2

Gem files will remain installed in
/Users/{ユーザー名}/.rbenv/versions/2.6.8/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3 for
inspection.
Results logged to
/Users/{ユーザー名}/.rbenv/versions/2.6.8/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-20/2.6.0/mysql2-0.5.3/gem_make.out

An error occurred while installing mysql2 (0.5.3), and Bundler cannot
continue.
Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'`
succeeds before bundling.

In Gemfile:
  mysql2

```

Macを使用している場合、Apple は独自の TLS と暗号化ライブラリを使用して OpenSSL の使用を推奨しておらず、自身でGemをインストール・ビルドする際は、環境変数を設定し直さないといけないようです。

###解決方法

```
api % bundle config --local build.mysql2 “—with-ldflags=-L/usr/local/opt/openssl/lib"
```
入力後

```
api % bundle install
```

で、Bundleのインストールが完了しました。

・参考記事
　[bundle install時にmysql2でエラーした時の対応](https://nyakanishi.work/bundle-install%E6%99%82%E3%81%ABmysql2%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%97%E3%81%9F%E6%99%82%E3%81%AE%E5%AF%BE%E5%BF%9C/)
AtCoder参加記録 No.2 ーABC214

#ABC214
今回参加したABC214についての参加記録

2021年8月14日（土）のAtCoder Beginner Contest 214でした。

https://atcoder.jp/contests/abc214



##結果

A,B問題を正解
レート：16→28 (+12) Highest!
順位:7073/ 8405
時間: A問題53:33   B問題70:09
パフォーマンス:90

##詳細

###A問題
[問題](https://atcoder.jp/contests/abc214/tasks/abc214_a)

提出コード（AC)

```python:A問題.py
a = int(input())
if a>=212:
  print(8)
elif a>=126:
  print(6)
else:
  print(4)
```

[提出コード詳細](https://atcoder.jp/contests/abc214/submissions/25045449)


###B問題

[問題](https://atcoder.jp/contests/abc214/tasks/abc214_b)

提出1回目（WA)

```python:B問題_1.py
s,t = map(int,input().split())
x=0
for a in range(100):
  for b in range(100):
    for c in range(100):
      if a*b*c<=t:
        if a+b+c <=s:
          x +=1
        else:
          x=x
      else:
        x=x
print(x)
```

[詳細](https://atcoder.jp/contests/abc214/submissions/25048474)

2回目（AC)

```python:B問題_2.py
s,t = map(int,input().split())
x=0
for a in range(101):
  for b in range(101):
    for c in range(101):
      if a*b*c<=t:
        if a+b+c <=s:
          x +=1
        else:
          x=x
      else:
        x=x
print(x)
```

[詳細](https://atcoder.jp/contests/abc214/submissions/25049341)

###C問題

解法が全く思いつかずに未回答


##振り返り、反省
今回もバイト後の参加のためスタートが遅れてしまい、だいぶ遅い時間からの参加になってしまった。

Ａ問題は普通に解くことができ、B問題で1回ミスしてしまった。

A問題については特になし

B問題はfor文の回す回数が0~100の101回なのに初めの提出時には100回で回していたためWAとなってしまった。
全体同様凡ミスが原因である。

C問題については解法が分からなかったためC問題が解けるように勉強していきたい


##感想

凡ミスをなくす努力をしたい。
コンテスト以外にも問題をといて経験を積みたい。
月に1,2回バイトを入れずにコンテストに参加することにした
[メモ] Django の DurationField を使って有効期間切れ判定をする


|本シリーズのトップページ|
|:--|
|https://qiita.com/robozushi10/items/4559a281d0319eb62c6c|

# はじめに

ある model のメンバに有効期間(有効時間)を持たせておき、
その後、一定周期の監視の際に有効期限切れであるか否かを判定する実装例.

具体的には以下である.
>ユーザが 1月1日 00:00:00 に有効期間「90分間」と入力すれば、
有効期限は 1月1日 01:30:00 となる

一見簡単に思えたが、Django では苦戦したので書き残しておく.

何か泥臭い方法で他に良い方法がありそうな気もするが...


#### models.py

```python
class XXXX(models.Model):
  # ユーザに有効期間を「HH:MM:SS」形式で入力させる.
  # ユーザによる時間入力が無ければ、90分間とする.
  duration = models.DurationField(verbose_name='有効期間', 
                                  default=timedelta(minutes=90),
                                  null=True,
                                  blank=True,
                                  help_text=('HH:MM:SS'))

  # 失効時刻 を設定するためのメンバである.
  # 「ユーザが入力したときの日時」に上記 duration を加算した時刻が入る.
  # 例: ユーザ 1/1 00:00:00 に 90分間と入力すれば、有効期限は 1/1 01:30:00 となる
  expired_at = models.DateTimeField(verbose_name='失効時刻',
                                    null=True, blank=True) 

  略
```

　

#### 失効時刻の設定をする

上記「expired_at」に失効時刻を設定する.
ここでは、**現在時刻(now) から 90分後 を失効時刻** とする.

なお「90分」というのは、上記 models.py の duration の初期値であり、
ユーザが時刻指定をしなかった場合である.

```python
## 見本のために、ここでは適当に 1件取り出す
x = XXXX.objects.all()[0]

## 現在時刻を得る
now = timezone.now()

## 「失効時刻」を現在時刻(now)から 90分加算した時刻とする
x.expired_at = now + timezone.timedelta(seconds=x.duration.total_seconds())
```

　

#### 有効期間が切れていないか判定をする

```python
## 現在時刻を得る
now = timezone.now()

## 現在時刻 > 失効時刻 という関係が成立するので 有効期間切れ(失効) となる
if((now - x.expired_at).total_seconds() > 0):
  print("失効しました")
else:
  print("有効期間内です")
```

　

#### 参考サイト

|URL|
|:--|
|https://stackoverflow.com/questions/33834562/set-value-for-django-durationfield-type-in-query|

　

以上.
Arduino IoT Cloudのデバイス登録でめちゃハマった件 #Arduino


Arduino MKR WiFiでArduino IoT Cloudを利用してみようと思い試しましたがデバイス登録でめちゃハマりました。

進める際に参考にした[Arduino MKR WiFi 1010 で始める Arduino IoT Cloud【下準備編】](https://qiita.com/youtoy/items/930f0e05302785856366)の記事ではトラブルは発生してなさそうな雰囲気です。

他の人でこのハマり方をする人がいるか分からないですが記録しておきます。

## セットアップから先に進まないトラブル発生

何かがエラーになってる模様で、`Arduino Create Agent`を再起動しろなど指示が出てますが、

`Arduino Create Agent`を停止&再起動を試しても特に何も解決せず......

> ![スクリーンショット 2021-08-16 17.36.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/016e2541-148f-e36f-a2f5-208f76accb30.png "スクリーンショット 2021-08-16 17.36.12.png")

具体的には↓の画面と↑の画面が交互にくるような感じでした。

> ![スクリーンショット 2021-08-16 17.36.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/e8142b86-2253-774a-5701-97ed22d9123c.png "スクリーンショット 2021-08-16 17.36.56.png")

しばらく待ってね〜の表示のあとにエラー画面になるというループ...

以下を試してなんとか進みましたが、どれが効果的だったのかはよくわかりません。

- Arduino IDEが起動していたので落としてみた
- ブラウザが複数立ち上がっていた(Chrome以外にBrave)のでChromeのみにした
- USBケーブルを抜き差ししてみた
- PCの再起動
- これらを試したあとに`Arduino Create Agent`の再インストール
- エラーが出た後にArduion Create Agentを停止&再起動してたけど、一旦アプリ自体を落とす`Pause Agent`ではなく`Quit Agent`にしてみた

## やっと先に進んだ

など色々試してやっと進みました。

> ![スクリーンショット 2021-08-16 18.11.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/8caf4f45-3534-f60b-2673-bcb013b706a7.png "スクリーンショット 2021-08-16 18.11.30.png")

## 雑観

一番最後の`Quit Agent`で再起動したらウィザードが次に進みましたがどこが根本原因だったかは不明な感じなので明確なことは言えないですが、みなさんQuit Agentしましょうね。

`Arduino Create Agent`がブラウザ依存ということでChromeのバージョンなどにもよって安定しないとかもあるのかもしれません。また、デフォルトブラウザを最近はBraveにしてたというのも少し怪しいかも。。。？
PDFの内容をExcelに書き込み、集約作業の効率化を目指す



請求書など経費処理って大変だなと感じたことはありませんか。

私は、毎月部署の経費処理を行っています。
自部署で扱う請求書はPDFでの管理が主です。
メールに請求書のPDFが添付され、紙で郵送されたものはPDF化して保管しています。

送付先、金額、経費科目など確認する部分も多く、時間もかかりミスも起こりやすいです。
（月末前、筆者もこの記事を書いているタイミングはちょうど経費の整理を始めてます。）

本当は、請求書を自動で入力してくれる仕組みを作れると直結すると思いますが、
まずは、PDFの内容をExcelに書き込めると集約しやすく確認の負担を軽減できると思い、挑戦してみました。

#使用したもの#
・[PowerAutomateDesktop](https://flow.microsoft.com/ja-jp/desktop/)
・Excel
・PDF

#作成したもの#
https://twitter.com/aya26481/status/1427191117552836614
フローについて
![フロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1802156/14b555bc-ca57-c9d2-8117-73a06d1d00ba.png)

#作成してみて#
Googleのスプレッドシートは、URLも発行でき自動化や連携しやすい印象を受けており、
Excelは難しいのかなと思っていましたが、設定できました。

実験として！
請求書は1枚であれば多少書いてある文字数が多くても書き込みしてくれますが、
レシートのPDF画像は出来ませんでした。
業務と私生活へも導入できたらと考えてみましたが少し難しかったようです。

最後まで読んで下さりありがとうございました。
poetryでsetup.pyを自動生成する

[Poetry](https://python-poetry.org/) ってパッケージ管理だけじゃなくて、ビルドとかインストールもやってくれるから、Poetry 使っているとsetup.py (setuptools) って要らなくなるんだけど、やっぱまだなんか怖いし、Pythonコマンド（CLIアプリ）作って [pipx](https://github.com/pypa/pipx) で動かしたい、なんて時には、まだやっぱり setup.py が必要な訳で。

# 余談
余談なんだけど、[pyenv](https://github.com/pyenv/pyenv) 特に [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv) を使ってて、プロジェクトの数が多くなってしまったとする。ふと整理しようとして、どのプロジェクトがどの virtualenv 使ってたかな、って調べようとすると、これが意外と面倒くさい。

* .python-version のファイルを find を使って調べる
    * `find . -name .python-version`
* これで virtualenv を使っている Python プロジェクトが分かる
* なんていう virtualenv を使っているかは、.python-version ファイルの中に書いてある
    * `find . -name .python-version | xargs cat | sort | uniq -c`
* はいはい、使っている　virtualenv は分かりました
* で、どのプロジェクトがどの virtualenv 使ってるんだっけ？
* ムキー！！

ということで、作りました。

https://github.com/tetutaro/ls_pyenv

`ls-pyenv`　ってやると、一覧表示にしてくれるよ！

```
> ls-pyenv
Search under the directory: .
jupyter (3):
  deeplearning_models_pytorch
  object_detection_metrics
  practical_application_ai
ls-pyenv-jaMYHStk-py3.9 (1):
  ls_pyenv
nlp (2):
  fasttext_binary_jawiki
  mecab_dictionary
tflite (1):
  object_detection_tflite
vino (1):
  yolo_various_framework
```

便利だね！（自画自賛）（たぶんしばらくしたら作ったの忘れる）

# Poetryの追加設定
折角[pyenv, pyenv-virtialenv, poetry を統合した](https://qiita.com/tetutaro/items/53b746412285920180b6)から、開発は Poetry の下でやりたい。でも折角コマンド作ったから pipx で動かしたい。pipx には setup.py が必要...

[poetry の github repository の issue で poetry build の結果から setup.py を抜き出すって会話してた](https://github.com/python-poetry/poetry/issues/761)。

まずは　poetry　の追加設定。コマンドの entrypoint を教えないとならない。

```
[tool.poetry.scripts]
ls-pyenv = "ls_pyenv.ls_pyenv:main"
```

pyproject.toml に上記を追加しただけ。setup.py の entrypoint の表記とほぼ変わらないので、迷うことはないだろう。もちろんみなさんの状況に応じて `ls_pyenv` とかなっている所は変更してね。

# Makefileの作成
poetry build して、tarball から setup.py を抜き出すんだけど、Makefile 書けば一発じゃんって思った。

```make
PACKAGE = ls_pyenv

.PHONY: build-package, install, install-pipx, clean
build-package:
	$(eval VERSION := $(shell poetry version -s))
	poetry build
	@tar zxf dist/$(PACKAGE)-$(VERSION).tar.gz -C ./dist
	@cp dist/$(PACKAGE)-$(VERSION)/setup.py setup.py
	@rm -rf dist

install: build-package
	python setup.py install

install-pipx: build-package
	pipx install .

uninstall:
	pip uninstall -y $(PACKAGE)

uninstall-pipx:
	pipx uninstall $(PACKAGE)

clean:
	@rm -rf dist
	@rm -rf build
	@rm -rf $(PACKAGE).egg-info
	@rm -f setup.py
```

これ、`PACKAGE`の値を変えれば、ほとんどの場合で使えるんじゃないの？なんかすげー気持ち良い（自画自賛）

Makefile なんで、コマンドの先頭はソフトタブじゃなくてハードタブじゃなきゃ駄目ってことに注意。（Makefile 超久しぶりに書いたわ）

後は .gitignore に setup.py を追加すれば、キレイに管理できる。（ビルドにpoetry使っているように見える！）
Gitのコミット日付をまとめて書き換えるワンライナー

なんらかの理由でGitのコミットに入っている日付（タイムスタンプ）をまとめて書き換えたいとします。特定のブランチの日付がまとめて変だ、とかですね。やり方を調べてまとめました。

## TL;DR

mainから現在のブランチまでのコミットを全て現在時刻にしたい場合こう書くといいみたいです。

```bash
DT=$(date -R); git filter-branch --env-filter "GIT_AUTHOR_DATE='${DT}'; GIT_COMMITTER_DATE='${DT}';" main...HEAD
```

- `$(date -R)`を書き換えれば現在時刻以外にもできます
- `main...HEAD`を書き換えれば任意のリビジョンを選択できます
- 何回も流すときは[`-f`を付けることになるみたい？](https://git-scm.com/docs/git-filter-branch#Documentation/git-filter-branch.txt--f)

## どういう事をやっているスクリプトなのか
おそらくGitに慣れている人にとっては大したことない処理だと思うのですが、要所についてまとめ直してみました。

### author dateとcommitter date
Gitの日付にはauthor dateとcommitter dateがあります。多くの場合に目にするのはauthor dateですがcommitter dateも記録されています。

```bash
$ git show --pretty=fuller | head -5
commit da9899ed76379b951cb80cdd540e533861c02576
Author:     saka1 <github@example.com>
AuthorDate: Mon Aug 16 09:13:17 2021 +0900
Commit:     saka1 <github@example.com>
CommitDate: Mon Aug 16 09:13:17 2021 +0900
```

そもそもauthorとcommitterは何が違うのだろうと思うところです。どうやらGitはその差分を作った人と実際にコミットする人が分離することも想定して作られているようです。『入門Git』 P.13にはこうあります。

> 多くのオープンソースのプロジェクトでは、プロジェクト参加者がプロジェクトの最新版に対して、パッチ（patch）という形で提案した修正・改良・拡張を、プロジェクトを管理する立場の人に審査し、良いものだけをプロジェクトに取り入れる、という進め方をします（後に、10.1節にて詳述します）。このような作業の流れでは、変更をもともと作成した人と、それを審査して取り入れることを決め、実際にコミットオブジェクトを作成する人とが同一人物でない事は普通に起こります。前者はauthor、後者はcommitterとして記録されます。

したがって日付もまたauthor dateとcommitter dateとして分離しうる、という背景のようでした。

### Gitが認識する日付

Gitの公式ドキュメントにはauthor dateとcommitter dateに入れられる日付形式について規定があります。
https://git-scm.com/docs/git-commit/2.32.0#_date_formats

これによると、認識してくれる形式は3つ（Git内部形式、RFC 2822、ISO 8601）あるのですが、ワンライナーではdateコマンドの`-R`オプションで生成が容易なRFC 2822形式を使いました。

```bash
$ date -R
Mon, 16 Aug 2021 08:41:54 +0900
```

### git filter-branch

filter-branchは危険……とは言うものの今回のようなことをしたい時には頼りになります。多数のオプションがありますが今回の用途では`--env-filter`が最適そうでした。

> This filter may be used if you only need to modify the environment in which the commit will be performed. Specifically, you might want to rewrite the author/committer name/email/time environment variables (see git-commit-tree[1] for details).
> https://git-scm.com/docs/git-filter-branch#Documentation/git-filter-branch.txt---env-filterltcommandgt
dockerのコンテナのライフサイクル

#dockerのコンテナは作ったら捨てる
**作成→起動→停止→廃止**

dockerは同じコンテナを使い続けるのではなく、
新しいコンテナに乗り換える

***


###作成と起動

```
docker run
```



docker pull
docker create
docker start
というコマンドもあるが、docker runでまとめて実行できる
___
###停止
```
docker stop
```
___
###廃棄
```
docker rm
```
Laravel:バリデーションで403エラー（フォームリクエストを使用している場合）

フォームリクエストでのバリエーションを使用してPOSTした際にエラーが発生した。

# 403エラー発生
"THIS ACTION IS UNAUTHORIZED."
「権限がありません」とのこと。

#原因
フォームリクエストのauthorizeメソッドがfalseのままだった。

```PHP:app/Http/Requests/RecordPostRequest.php
    public function authorize()
    {
        return false;
    }
```

# 解決策
これをtrueに変えればOK。

```PHP:app/Http/Requests/RecordPostRequest.php
    public function authorize()
    {
        return true;
    }
```

# authorizeメソッドとは
Laravelにより生成される各フォームリクエストには、authorizeとrulesの2つのメソッドがあります。

ご想像のとおり、authorizeメソッドは、現在認証されているユーザーがリクエストによって表されるアクションを実行できるかどうかを判断し、rulesメソッドはリクエスト中のデータを検証するバリデーションルールを返します。

authorizeメソッドがfalseを返すと、403ステータスコードのHTTPレスポンスを自動的に返し、コントローラメソッドは実行しません。
アプリケーションの別の部分でリクエストの認可ロジックを処理する場合は、authorizeメソッドからtrueを返してください。（すべて公式ドキュメントより）
GCPのCloud Shellをターミナルから使う

# What is Cloud Shell...?
まずは...
`公式ドキュメントより`

> Google Cloud Shell は、Google Cloud のインタラクティブなシェル環境です。これにより、Google Cloud を使った学習やテスト、ウェブブラウザからのプロジェクトやリソースの管理が簡単になります。Cloud Shell を使用すると、Cloud SDK [`gcloud`](https://cloud.google.com/sdk/gcloud?hl=ja) コマンドライン ツールと、その他の必要なユーティリティがプリインストールされて完全に認証され、必要なときにいつでも、最新の状態で利用できます。さらに、Cloud Shell には統合された Cloud Code 機能を備えた組み込みのコードエディタが付属しており、クラウドベースのアプリの開発、ビルド、デバッグ、デプロイをすべてクラウド内で行うことができます。Cloud Shell の仮想マシン インスタンスで、インタラクティブ チュートリアルを起動することや、クローン作成したリポジトリを開くこと、ウェブアプリをプレビューすることもできます。[詳細](https://cloud.google.com/shell/docs/how-cloud-shell-works?hl=ja)

つまり、`Cloud Shell` は `<PROJECT>` 内の仮想マシン上(Linux)に接続し、ファイル操作、バージョン制御、アプリケーションの実行等を行うことを可能としたサービスである。


## Cloud Shellへの接続方法

方法は次の二通りだが、`1. `はとても簡単なので説明しない。
1. [GCPコンソール](https://console.cloud.google.com/)を開き、上部の`Cloud Shellをアクティブにする`を選択
2. [ターミナルからsshを用いて接続する](https://cloud.google.com/shell/docs/using-the-cloud-shell-terminal?hl=ja)

### 1. SSHを用いてセッションを確立

`gcloud cloud-shell ssh --authorize-session`

ログインを求められるので、ブラウザを開き認証を行う。（入り方によってKeyをshellに貼り付けることがある。）
これでターミナルからGCP上のサービスにアクセス出来る。
基本は`Bash` で動作しているため、Aliasなど適宜追加して使いやすい環境にしてもらえば良いだろう。

ファイル移動、コピーなどは適宜sshを用いたコピーコマンド、`scp`  を用いると良い。

しかし、このままでファイル変更した後などにコマンドを叩かないといけないのでとても不便。

`ssh` を用いたマウントコマンド`sshfs`  を用いれば、ローカル・リモートの変更が直ちに反映されるので大変便利。

### 2. sshfsをインストール

[# sshfsで別サーバのディレクトリをマウントする](https://www.server-memo.net/tips/sshfs.html) が参考になった。
Mac, Linuxのバージョンによってインストール方法、依存関係が異なるので、各自自分の環境に合わせて設定すること。
詳細は[公式ドキュメント](https://wiki.archlinux.jp/index.php/SSHFS)を参考にされたい。
　

### 3. sshfsの実行コマンドを取得

`gcloud` コマンドの`get-mount-command`でターミナルに入力するコマンドを取得する。

#### コマンド:
`gcloud cloud-shell get-mount-command <LOCAL_DIR>` 

#### 例: 
`gcloud cloud-shell get-mount-command ~/cloud_shell_local`

#### 生成されたsshfcコマンド

`sshfs <GCP_USER_NAME>@<IP>: /home/user/cloud_shell_local -p 6000 -oIdentityFile=/home/user/.ssh/google_compute_engine -oStrictHostKeyChecking=no`

生成された`sshfs`コマンドをターミナルに入力すると画像のように、ローカル環境から`Cloud Shell` の環境に接続出来る。


![Screenshot from 2021-08-16 17-27-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1899434/7d26421e-435b-725c-7e19-44808a6e75ac.png)
GitHubのパスワード認証廃止によるエラーに立ち向かう

##はじめに
とあるお盆の日。
東京オリンピックも終わり、実家で1日中ゴロゴロしながらアニメを見るという~~人生の無駄使い...~~。 もとい、充実した時間を過ごしていたころ。

GitHubではパスワード認証が廃止されていました...。
https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/

自分がパスワード認証の廃止に気付いたのは撮り溜めたアニメを消化し、YouTubeのリロードを永遠と繰り返し半ば廃人になりかけていた時。
ふと個人開発中のwebアプリのアイデアが浮かび、編集した後git pushしたところ...謎のエラー

```
$ git push origin branch名
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: unable to access 'https://github.com/名前/リポジトリ.git/': The requested URL returned error: 403
```

この時点で半ば心が折れ...パソコンをそっ閉じ...。

##教えてGoogle先生！

とはいえエラーを放置するわけにもいかず、とりまGoogle翻訳にかける。
すると以下のようなことが書かれてました

- パスワード認証のサポートは2021年8月13日に削除された事
- 代わりに個人アクセストークンが必要だという事
- https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ を読めとの事

##必要なもの
- **個人アクセストークン**
- **キーチェーンアクセスの変更**

##個人アクセストークン作成

下記のものを参照し取得
https://docs.github.com/ja/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token

※トークンを使用してコマンドラインからリポジトリにアクセスするには、権限設定で[repo] を選択します。

##キーチェーンアクセスの変更
まずは**「コマンド⌘キー + スペースキー」**を押して**Spotlight**の検索画面を表示し、 **”キーチェーン”**と入力してキーチェーンアクセス.appを選択して起動する。
もしくは、Dockの中にあるロケットアイコン**Launchpad**を選択し、**「その他」**のグループの中にある**「キーチェーンアクセス」**を選択して起動します。
![画像01](https://cyberforensic.focus-s.com/knowledge/adm_manager/wp-content/uploads/2018/12/dad8dd2e850e297bbc2e0994c429bf1c-1024x840.png)


![画像02](https://cyberforensic.focus-s.com/knowledge/adm_manager/wp-content/uploads/2018/12/af78d8cfbe86a3149e60a67db6a6be21-1024x634.png)


1.キーチェーンアクセスを開けたら**「github.com」**で検索。
2.**「種類」**が**「インターネットパスワード」**と記載されているレコードを開く。
3.**「パスワードを表示」**をクリックし、表示されたパスワードを先ほど取得したアクセストークンに置き換えて保存！
![画像03](https://static.zenn.dev/deployed-images/11363898f1c482360969cae8.png)
![画像04](https://static.zenn.dev/deployed-images/cf1045066fc82341135cb88c.png)

##そしてgit pushへ
```
$ git push origin branch名

Enumerating objects: 23, done.
Counting objects: 100% (23/23), done.
Delta compression using up to 4 threads
Compressing objects: 100% (20/20), done.
Writing objects: 100% (23/23), 208.62 KiB | 5.21 MiB/s, done.
Total 23 (delta 0), reused 0 (delta 0), pack-reused 0
To https://XXXXX
 * [new branch]      branch名 -> branch名
```
無事成功しました！

##参考にさせていただいた記事

https://qiita.com/shiro01/items/e886aa1e4beb404f9038

https://qiita.com/shunsa10/items/e43564cf48f84b95455b

**↑上記の２つの記事にはSSH接続による解決方も載ってます。**

https://zenn.dev/hayata_yamamoto/articles/github-access-key

**↑今回使わせて頂いた手法です。**

##最後に

初めての記事投稿なので至らぬ部分もあると思いますが、同じ問題に直面した方々の助けに少しでもなれたなら幸いです。
[メモ] Django Admin 管理者作成のワンライナー



|本シリーズのトップページ|
|:--|
|https://qiita.com/robozushi10/items/4559a281d0319eb62c6c|

# 内容

「`python manage.py createsuperuser`」での登録処理のワンライナー.

「参考サイト」のそのまま転載となり申し訳ない.
が、echo で送り付ける内容を変更してやれば応用が利く.

```bash
$ echo "from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@example.com', 'admin')" | python manage.py shell"
```

# 参考サイト

|URL|
|:--|
|https://stackoverflow.com/questions/6244382/how-to-automate-createsuperuser-on-django|
Rubyのオブジェクトについて

#オブジェクトとは
オブジェクトとは、関連する変数（値）とメソッド（動作）をまとめて、そのまとまりに名前を付けたものです。関連する変数やメソッドを1つのオブジェクト内でまとめてしまうことで、管理しやすくするのが
***オブジェクト指向***です。

#Rubyはオブジェクトでできている
Rubyで出てくるオブジェクトは全て,いずれかの型に属する。
この***型をクラス***と言います。

```
#String (文字列)型           #Integer(整数)型
"Hello,world"                 10

```

#オブジェクトの性質
Rubyの世界

```
  　　　　　　　　　　　　　　　　　　　　　　　　オブジェクト 

　　　　　　　　　　　　String  Class                       Integer Class

    "Hello,world" .length                    10000
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　.downcase
     インスタンス　　　　　　　　　　　メソッド      

```
*補足　　lengthはインスタンスの長さを表しています。 "Hello,world" .length
で出力すると11と出てきます。 Hello,worldが11文字だからですね。
lengthと似たものだとsizeなどあります。

downcaseは全部小文字にするメソッドです。"Hello,world".downcaseで
=> "hello,world"と出力されます。

#オブジェクトの型の変換
型(class)が違うとプログラムはうまく処理ができません

```
⚫︎クラスが異なると処理できない?
ex) "15" + 20
2] pry(main)> "15" + 20
TypeError: no implicit conversion of Integer into String
from (pry):2:in `+'

⚫︎クラスを変換して,計算できるようにする
ex) "10".to_i + 2
[3] pry(main)> "10".to_i + 2
=> 12

#補足
.to_iのiはInteger型　のiです。　"10"だと10は文字扱いですが
.to_iにすることにより数字扱いになります。だから10+2が成立して12になります。

他のも.to_sが使えます。

pry(main)> 10.to_s + 2
TypeError: no implicit conversion of Integer into String
from (pry):2:in `+'

エラーの原因は10が.to_sによって整数扱いになっているからです。

pry(main)> 10 + 2
なら１２と出力されます。
```


#Rubyでよく使われるクラス
```
string   文字列　　　
Float  少数　
Array 配列
integer   整数　　　
Hash 連想配列　
TrueClass   true(正)          
FalseClass false (誤)
NilClass  nil(値なし)

```
今までGitHubとアイパスで接続してた人向け

散々警告されていた通り、2021年8月13日からGitHubにアイパスで繋がらなくなってしまった

```
# git fetch
Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
```

散々言ってただろと。

きちんと認証局を使っていた人は問題ないが、当方みたいに横着して接続用のURLにアイパスを直接書いていた人は以下が正攻法なようです。


### VSCodeの設定：(Windows)

```
GitHub上からアクセストークンを取得して、(※後述)
コントロールパネル → 資格情報マネージャー → Windows資格情報 → https://github.com を選んで編集
ユーザ名 → 今まで通り
パスワード → 発行したアクセストークン
```

たぶんVSCodeだけじゃなくて一般的なIDEなら全部これでいけるはず


### Linux系を使っている場合の設定：(当方はCentOS)
```
# git credential-store --file ~/git.store store
protocol=https
host=github.com
username → 今まで通り
password → 発行したアクセストークン
```

これでOK

.git/config に url=ユーザ名:パスワード@github.com と書いていたアホ(私です) は、ユーザ名パスワードをきちんと消しておきましょう。


#### タイムアウト無制限 (100年)
```
# git config --global credential.helper "cache --timeout=3153600000"
```


## ■アクセストークンの取得方法
あろうことか公式ドキュメントが一番わかりやすい
(https://docs.github.com/ja/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token)
要約すると

```
プロフィールアイコン → Setting → Developer settings → Personal access tokens → Generate new token →
適当な名前で、スコープはとりあえず全部付けておく
expireはめんどいので無期限を選択
```
画面にトークンコードが表示されるのでメモ
※ 今後二度と表示出来なくなるので確実にメモしておいてください
Androidで簡単にアニメーションを追加する【Lottie】

##Lottieって何？
Android,iOS,React Nativeで、アニメーションを画像のように簡単にアプリに埋め込める！
アニメーションはGIFアニメのようなもので、人様が作成してくれたのを選んで使える！
サイズや繰り返し設定など変更可能！
宿泊関係のサービスで有名なAirbnbが作成しており無料で使える！
![lottie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252283/7aa20eba-bbec-79ca-ad7e-d7e275ee71a5.gif)
※サンプルはローディング画面に入れてみました

##リンク集
公式トップ
https://airbnb.design/lottie/
Android GitHub
https://github.com/airbnb/lottie-android
Androidドキュメント
http://airbnb.io/lottie/#/android
サンプルアプリ
https://play.google.com/store/apps/details?id=com.airbnb.lottie
アニメーション一覧
https://lottiefiles.com/recent
自分のお気に入り
https://lottiefiles.com/likes

##実装方法

####設定
```xml:build.gradle
dependencies {
  implementation 'com.airbnb.android:lottie:$lottieVersion'
}
```
バージョンをどれにするかはこちらを参照
https://github.com/airbnb/lottie-android#download

####アニメーションを選ぶ
最新のアニメーション一覧はこちら
https://lottiefiles.com/recent
ページが重くアニメーションを探していくのが辛いのでアカウント登録後、検索ワードで絞り込んで、少しでも気に入ったのはお気に入り登録して後からこちらから見るのが良さそう
https://lottiefiles.com/likes
使いたいアニメーションが決まったらDownloadからLottie JSONを選択してダウンロードしましょう

####アニメーションの設置
落としたファイルをリネームしないと警告が出るのでわかりやすい名前に変更します
その後src/main/resディレクトリの下にrawディレクトリを作成して、落としてきたjsonファイルを入れます

####レイアウトファイルに設定
```xml:layout.xml
<com.airbnb.lottie.LottieAnimationView
    android:id="@+id/lottie_animation"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:lottie_autoPlay="true"
    app:lottie_loop="true"
    app:lottie_rawRes="@raw/lottie_idea_into_book_machine" />
```

こんな感じで画像ファイルのように設定でき、タップ処理を追加することも可能
ループさせたくない場合はlottie_loopをfalseに設定

以上で完成です
他の細かい設定はリンク集のドキュメントを参考にしてみてください
アニメーションにより余白が違ったりして使い所は工夫が必要だったりします
今更 Docker 再学習

# Docker の利点

- OS とミドルウェア、アプリケーションを含めてパッケージ化できる点
    - 仮想サーバーを立てられることは別に利点では無い
    - パッケージ化することで頒布や流用がしやすくなる

# 自分の認識違いを正す

- docker 上で稼働するアプリケーションも各種ミドルウェアと同様、都度 update（=checkout）して起動させるべき
    - 稼働中の docker で checkout して web サーバー再起動、みたいな運用はナンセンス
    - ソース更新 -> docker 停止（or 破棄）-> docker 起動（-> 最新のソースを checkout）-> 動作確認
        - みたいな動きが思想に則った運用方法

# Docker 役立ちコマンド

1. コンテナ一覧表示（停止中含む）
    - ```$ docker container ls -a```

2. コンテナをバックグラウンドで起動する
    - ```$ docker container run -d -p 8080:80 nginx```

3. 起動中コンテナでコマンドを実行する
    - ```$ docker container exec -it nginx bash```
    - __-it__ 入れると、ターミナル操作になる。入れないと実行してコンテナから離脱する。

4. コンテナのログを確認する
    - ```$ docker container logs -t -f 6009f159a8a0```
    - __-t__ を入れるとログ一行ずつのタイムスタンプも表示する。

5. コンテナの統計情報（top情報）を確認する
    - ```$ docker container stats --no-stream```
    - __--no-stream__ を付けるとスナップショットを取得する。付けないと更新し続ける。
    - __--format='hogehoge'__ で出力フォーマット指定。Goテンプレート。