OmniAICreator/Qiita-1.07M huggingface dataset:
SPIRE: v1.3.0 変更内容

_この記事は [Z Lab](https://qiita.com/organizations/zlab) の業務の一環として作成したものです。_

## はじめに

SPIRE v1.3.0 の変更内容を紹介します。
https://github.com/spiffe/spire/releases/tag/v1.3.0

:pencil: がついた文章は、CHANGELOG の公式内容ではなく筆者の補足です。

## Added

- Windows が実験的にサポートされました (https://github.com/spiffe/spire/projects/12)
- Envoy での SPIFFE 証明書の検証を標準の X.509 の検証に戻す機能が追加されました ([#3009](https://github.com/spiffe/spire/pull/3009), [#3014](https://github.com/spiffe/spire/pull/3014), [#3020](https://github.com/spiffe/spire/pull/3020), [#3034](https://github.com/spiffe/spire/pull/3034))
    - :pencil: SPIRE Agent が Envoy に返す検証用コンテキストには [SPIFFE Certificate Validator](https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.proto) がデフォルトで含まれているのですが、この修正で追加された `disable_spiffe_cert_validation` パラメータを true にすることで、その拡張機能を省略することができます。この拡張が無くなると Envoy での証明書検証が X.509 に準拠しているかの検証のみになるイメージです。詳細は [Envoy SDS Support](https://github.com/spiffe/spire/blob/v1.3.0/doc/spire_agent.md#envoy-sds-support) をご参照ください。SPIFFE Certificate Validator については[こちら](https://speakerdeck.com/mathetake/isolated-multiple-trust-domain-mtls-in-envoy-and-istio?slide=41)が参考になります。
- K8s Workload Registrar で Leader Election ロックに使用するリソース種別を設定できるようになりました ([#3030](https://github.com/spiffe/spire/pull/3030))
- Delegated Identity API を介してワークロードに代わって JWT SVID と JWT Bundle を取得する機能が追加されました ([#2789](https://github.com/spiffe/spire/pull/2789))
    - :pencil: [spiffe/spire-api-sdk#20](https://github.com/spiffe/spire-api-sdk/pull/20) で追加された API を実装する PR となっています。
- NodeAttestor のレスポンスに CanReattest フラグが追加されました ([#2646](https://github.com/spiffe/spire/pull/2646))

## Fixed

- プラグイン設定に plugin_data セクションがない場合に標準出力に誤ったメッセージが表示される問題を修正しました ([#2927](https://github.com/spiffe/spire/pull/2927))

## Changed

- SPIRE Server 起動時に不正な Parent ID または SPIFFE ID を持つエントリーが削除されるようになりました ([#2965](https://github.com/spiffe/spire/pull/2965))
- API に渡されるパスの先頭にスラッシュを付加しないようになりました ([#2963](https://github.com/spiffe/spire/pull/2963))
- K8s Workload Registrar は SPIRE Server への接続を最大5秒まで再試行するようになりました ([#2921](https://github.com/spiffe/spire/pull/2921))
- SDS 経由で不正なリソースを要求した場合のエラーメッセージが改善されました ([#2916](https://github.com/spiffe/spire/pull/2916))
- ドキュメントの軽微な改善を実施しました ([#2934](https://github.com/spiffe/spire/pull/2934), [#2947](https://github.com/spiffe/spire/pull/2947), [#3013](https://github.com/spiffe/spire/pull/3013))

## Deprecated

- K8s Workload Register の webhook モードが非推奨となりました ([#2964](https://github.com/spiffe/spire/pull/2964))
ことすたぐらむ目次

# 初めに
ことすたぐらむの作成記事まとめです。
使用は自己責任でお願いします。
ご指摘、ご質問お待ちしております。

# 要件定義・設計書
1. 要件定義

https://qiita.com/fishyamamoto/items/a3b98a61e1c02451abef

2. 設計書

https://qiita.com/fishyamamoto/items/f11174a5ec9e163b8b29 

# 自動フォロー機能1
1. ログイン

https://qiita.com/fishyamamoto/items/3bc909051d13207f885d

2.有効フォロウィーのフォロワー全件取得

https://qiita.com/fishyamamoto/items/c280521edad9f825342e

３. 任意のアカウントのプロフィールから自動フォローする

https://qiita.com/fishyamamoto/items/f3ae7ce45ea34735ba96

# 自動フォロー機能2
1. 特定ユーザーの最新の投稿にいいねしたアカウントを全件取得する

https://qiita.com/fishyamamoto/items/d3ae98f06c2e2214dbdb

# 自動いいね機能
1. 自動検索して、投稿のURLを取得する

https://qiita.com/fishyamamoto/items/6c0192accf019cdad678

２. 投稿を自動いいねする

https://qiita.com/fishyamamoto/items/af35deffbc2734ef3414

# タイプドアン(ことすたぐらむver.1.00)

https://qiita.com/fishyamamoto/items/a8c556c84fb3631ae1fa

# フォロー解除機能
# Django(有効フォロウィー管理サイト)
Active Directory パスワードに関する覚え書き

パスワード格納先： NTDS.DIT
%SystemRoot%\NTDS\ntds.dit
ESE　(Extensible Storage Engine) 形式
ESEとは？ https://docs.microsoft.com/ja-jp/windows/win32/extensible-storage-engine/extensible-storage-engine
（Domain Controller = NTDS.DIT を保持し管理しそれを使っていろいろな機能を提供するサーバ）

Active Directory 属性： unicodePwd
パスワードのNTハッシュ(MD4)が暗号化されたもの
（暗号化： DES + CNG BCrypt AES-256)

Windows パスワードのハッシュ処理： NTハッシュ および LMハッシュ

NTハッシュ: MD4

LMハッシュ: 名の通り互換性のために温存されている
    1. 14バイト分までパディング
    2. 大文字に変換
    3. 7バイトずつに分割
    4. それぞれで、ある固定のバイトデータを暗号化
    5. それらを連結

Windows ログオンでのパスワードハンドリング
ユーザーがユーザー名/パスワード入力
→ パスワードがNTハッシュとLMハッシュに計算される
→ NTハッシュがKerberosログオンに渡される
Oracle Analytics Cloud のサービス作成

はじめに
---
Oracle Analytics Cloud (OAC) は、気軽に利用できるPaaS型のAnalyticsサービスです。
トライアル環境を申し込んで試すことができます。
この記事を書いている時点での最新版は6.5でした。

OCI管理コンソールへのログイン
---
OCI管理コンソールにログインします。
ナビゲータアイコンをクリックし、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/b5bb5d1e-32f5-1319-1e19-0efa3f352f55.png)
アナリティクスとAIをクリックします。
アナリティクス・クラウドをクリックすると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/b423bf63-e228-1470-55c7-7b7ba08100cc.png)
アナリティクス・インスタンスの画面が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/aa3a99b7-9341-ded0-d06a-4aab349f81a5.png)

OACサービスの作成
---
※この記事ではコンパートメントのルート <テナント名>(root)の子階層にtrial1というコンパートメントを作成している前提で、trial1にサービス作成します。
コンパートメントを選択します。コンパートメントの検索で、trial1を選択します。
インスタンスの作成をクリックします
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/ae6fc0c1-5798-9ce3-ed45-e54f118423c5.png)
作成は非常に簡単です。
名前と説明を入力します。作成をクリックします。
ここでは双方oactrial1と入力しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/c9165e72-ad64-4e18-02a6-c2368f1fbee4.png)
暫く待ちます。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/405f2b14-f8f9-7008-72c9-b6665a60d373.png)
※この記事を記載した時点ではおおよそ15分後にサービスが作成完了しました。
ステータスがアクティブに変わります。
アクセス情報のところにOACの開始URLが表示されています。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/95180920-d03e-9423-9609-10780176dd02.png)

OACにアクセスしてみる
---
分析ホームページをクリックし、OACへアクセスします
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/3f89b737-3f3d-a09e-16fd-1073b8ecc938.png)

OACサービスにアクセスできました。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/b061de8a-6a82-e455-9913-a9cfce978775.png)

数クリック、名前、説明入力で僅か10数分でOACサービスを作成できました。
※業務の本番で利用する場合、サービス作成の際に検討すべきものとして、ネットワーク構成（PublicかPrivateか）、機能セット（EnterpriseまたはProfessional）、OCPUかユーザー単位化の課金体系の選択があります。
なりたい自分

初投稿
今までいろんなことに挑戦しては諦めて、挑戦しては諦めて、、
何も続かず、自己否定ばっかり

始めるのは得意だが、やめるのも得意。
そんな私なんかが果たしてプログラマーになんてなれるのだろうか、、、。

人は”未知”が一番怖い生き物である。
だったら知っていくしかない。２０代前半はたくさん失敗して、たくさん傷ついて、たくさん変化していきたい。

幸運にも、いつしかそう思えるようになっていた。
それは、今まで行動して、失敗してきたから。今更多少の失敗や変化には怖くない。

水は容器の形になるのと同じで、人は周りの環境によって作られていく。

なりたい自分があるのならば、それを取り巻く環境を自ら構築していくのが一番手っ取り早く効率が良い。


「女には、男を追いかける人と、夢を追いかける人がいる。
どっちを追いかけるべきか迷っているなら、覚えていおて。
あなたのキャリアは、ある日突然目覚めて、
もう好きじゃないと言って裏切ったりはしない。」　　レディー・ガガ

なりたい自分なる。

一応、こんなダメ人間でも、毎日やることをリスト化して、微量だがなりたい自分へと近づく努力はしているつもりだが、
今のところ自分で設定したアクションプランにも関わらず、未達が多すぎる。
自分への甘えと、たくさんの言い訳がそうさせている。

”時は金なり”

23歳になってやっと時間の大切さを実感している。

現在勉強しているのは、＃ruby_on_rails ,＃HTML　＃CSS 

今日からプログラミング学習で学んだことをアウトプットがてら書いていこうと思う。
インスタグラムで自動フォローと自動いいねを実装する②(設計書)

# 基本設計
　設計方針は以下のとおりである。
1. ローカルでseleniumを使用し、フォロー・いいねを行う
2. サーバー側で、有効フォロウィー(初めにを参照)を取得する
3. サーバーはCentOs7, django3で開発する。
3. 有効フォロウィーは専用サイトで管理できるようにする
　
# 自動フォロー機能1
  1. サーバーから有効フォロウィーリストを取得
  2. seleniumでinstagramにログイン
  3. 有効フォロウィーのフォロワーを全件取得
  4. フォローした人数が30人を超えるまでフォローする

# 自動フォロー機能2
  1. 有効フォロウィーの最新の投稿にいいねしたアカウントを全件取得
  2. フォローした人数が30人を超えるまで、フォローする

# 自動いいね機能
  1. 検索条件をサーバーから取得する
  2. 検索して、最新の投稿10件のURLを取得する
  3. 最新の投稿10件にいいねする

フォロー解除機能や解析機能は作成していないため、順次、更新していきます。
rails5 progate 整理　メモ

人に見せるために書いていません。あくまで自分を落ち着かせるためです。

# ログインしている場合のアクセス制限
ログイン中のユーザーが以下のURLにアクセスした場合には、投稿一覧ページにリダイレクトしてください。
・get /signup
・get /login
・get /　（localhost:3000）
・post /users/create
・post /login

## どういう条件をつければいいのだろうか？
前の問題のようにすればいいのではないか？
```application_controller.rb
def already_user
    if @current_user
      flash[:notice] = "すでにログインしています"
      redirect_to("posts/index")
    end
  end
```

```users_controller.rb
class UsersController < ApplicationController
  before_action :authenticate_user, {only:[:index, :show, :edit, :update]}
  before_action :already_user, {only:[:new, :create, :login, :login_form]}
.
.
.
```
```home_controller.rb
class HomeController < ApplicationController
  before_action :already_user, {only:[:top]}
.
.
.
```
# ide-proxy.prog-8.composts のサーバーの IP アドレスが見つかりませんでした。
検索してみると...
1.DNSサーバーに該当ドメインが登録されていない
2.DNSサーバーがダウンしている
3.自身のネット回線に問題がある
4.ブラウザやキャッシュに問題がある
これらの原因を見てみたがコードと何が関係あるのかわからなくなった。
答えを見てしまった。

```application_controller.rb
def already_user
    if @current_user
      flash[:notice] = "すでにログインしています"
      redirect_to("/posts/index")
    end
  end
```
```/```がついていなかったからだ。

## 思ったこと
```/```とIPアドレスとの関係がわからない。

# 自分の情報のみ編集できるようにしよう
```before_action```で編集できないようにしよう。
```users_controller.rb
  before_action :only_edit,         {only: [:edit, :update]}
.
.
.
  def only_edit
    if @current_user =! User.find_by(id: params[:id])
      flash[:notice] = "権限がありません"
      redirect_to("/posts/index")
    end
  end

end
```
```show.html
.
.
.
<%= link_to("編集", "/users/#{@user.id}/edit")%>
.
.
.
```
これでできるか。
urlで入力すると違うユーザーに編集できてしまう。
もしかして```=!```違うのかも。
調べてみると
```!=```だった。

これを治してみると
```users_controller.rb
.
.
.
if @current_user != User.find_by(id: params[:id])
.
.
.
```
urlで表示されなくなった。これで合格か？
成功！

道場コース終了。
ROS2 Navigation2での群衆管理

## はじめに

先進的な企業により、自動走行できるロボットがどんどん開発されつつありますが、
今の一般的な自動走行ロボットは、”1台のロボットの自動走行”が主な機能かと思います。
次のフェーズとして考えられるのは群衆管理の機能だと思います。

複数機体に対して、Aはトイレ掃除をし、Bは買い物に行ってくるというような、
複数の同じROBOTに対して、違う司令を出すというようなシチュエーションに対して、どのような方法で対処すればいいのか

についての解として
一つの方法を紹介したいと思います。

## FreeFleet

https://github.com/open-rmf/free_fleet

紹介するのは、FreeFleetというRos2のパッケージになります。
ROSにも対応しているみたいですが、今回はROS2の機能について説明します。


## 仕組み
同一ネットワーク内、違うロボット間で各々がNavigation2を起動した場合、
Topicが共有されるため、「同じ動きをするロボット」ができてしまいます。

![paint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93168/cb0d5c46-7456-8332-32b1-86843dec35ef.png)


同じ動きをさせないためにはTopicを非共有の状態にする必要があります。
その場合、
Robot1に対しては、export ROS_DOMAIN_ID=1
Robot2に対しては、export ROS_DOMAIN_ID=2
と設定することにより、

![paint (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93168/30095be5-33a0-ea55-62b4-0ecf3549f9ae.png)

Topicが共有されなくなり、Robot1とRobot2が、
独立してNavigation2を動かせるようになります。

すると、どういう問題が出るかというと、
Topicが非共有になることで、逆に統合して、司令を出せなくなるという問題が出ます。
そこで登場するのが、FreeFleetという仕組みになります。

各々のRobotをFreetServerというNodeとやり取りをすることで、
統合管理ができるというのがざっとした概要になります。
このときに使うIDは、ROS_DOMAIN_IDではなく、
dds_domainというものを利用します。
ROS_DOMAIN_IDが違うNode間でも、dds_domainが一致するFreetServerとであれば
やり取りをすることができます。

![paint (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93168/fda941b8-a1d3-408e-c6a3-4b952ad926c4.png)




## DEMO
同一ネットワーク内で、別々のPCでそれぞれ、Navigation2を動かし、
FreetServerから司令を出して、別々の動きをさせるというDEMOになります。

https://www.youtube.com/watch?v=rQpqN4tadJo


まとめるのが下手なのですが、
新しい知見としては面白いかと思います。

今後は、1台の走行精度よりも
群衆としてどう動かすかが、研究の課題になっていくかと思っています。
Nuxt.jsでメソッドをグローバルで使用できるようにする方法

## やりたいこと
バックエンドからユーザーネームを取得するのだが、カラムが`first_name`,`last_name`に別れている。
どのコンポーネントからでも、`$userFullName`を使用すれば、フルネームを取得できるようにしたい！！


### 手順１、 pluginに`utils.js`を作成する。
※util は ユーティリティのことで、英語で「役に立つもの」という意味
ファイル名は何でも大丈夫です！

```
const userFullName = (profile) => {
  return profile.lastName + ' ' + profile.firstName
}

export default ({_}, inject) => {
  inject('userFullName', userFullName);
}
```

### 手順２、 nuxt_confingにpluginを記載！
```
  plugins: [
    { src: '@/plugins/utils' }
  ],
```

### 手順３, コンポーネントやページから関数を呼び出す！
```
{{ $userFullName(profile) }}
```
eclipse (Java)デバック方法

# eclipse(Java) を使ったデバック方法
プログラミングをしていると変数の途中経過だったり処理がどのように動いているか確認したいときがある
eclipse を使ったデバック方法を簡易に記載（Java で main メソッド実行時）

1. ブレークポイントを設定
エディタの止めたい行の行数横あたりで [ダブルクリック] or [右クリック] -> [ブレークポイントの切り替え]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/69c48b87-f287-ade7-a209-e4d3971708b9.png)

1. デバック実行
実行したいものを選択した状態で [右クリック] -> [デバック] -> [Javaアプリケーション]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/1f1ea027-177a-bac7-6691-33789bb22fcc.png)

1. ブレークポイントで止まればOK（止まった後の進め方、見方など）
ブレークポイントで止まった後の画面（例）
※進め方は簡単なやつのみ記載してます（ステップインなどは省略）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/8dda5763-d4e3-763c-d461-835f89a9e46d.png)
Gimpで出力する画像(PNG)のファイルサイズを縮小したい

- 画像 -> モード -> インデックス -> 「最適パレットの生成」がONになっていることを確認・最大色数が255になっていることを確認 -> 「変換」をクリック
- PNGファイルエクスポート時、以下の不要データのチェックを外す。
    - `Save Exif Data`
    - `Save XMP Data`
    - `Save IPTC Data`
    - `Save thumbnail`
    - `Save color profile`

これで1~2MBの画像が数百KBにまで減りましたのでお勧めです。


[画像を圧縮加工して容量を軽く！フリーソフトgimpを使って簡単に！](https://inokou.com/archives/49)
[How To Reduce PNG File Size By 70% with GIMP](https://logosbynick.com/gimp-reduce-file-size-png/)
rex0220 重複チェックプラグイン

複数項目の組合せでレコードの重複チェックを行うプラグインです。
開始日・終了日を持つ期間の重複などをチェックできます。

主な機能
・複数項目の組合せでレコードの重複チェック
・重複したレコードをダイアログ表示
・PC・モバイル対応
・３ヶ国語対応

Ver.9
・DIC_MAP 関数を追加
・EV_INFO 関数に、appId オプション追加
・APP_URL, LOOKUP_GETID, RELATED_GETID 関数追加
・TABLE_DATA, TABLE_MAP, TPDIC 関数追加
　TABLE_DATA(TABLE_MAP(テーブル1,
　TPDIC("ドロップダウンT2",ドロップダウンT1, "数値T2",数値T1, "金額T2", 単価T1*数量T1)))
・プラグイン設定画面初期処理でエラー発生時に、ダイアログ表示するように変更
・kintone.Promise を Promise に変更

# 概要

レコード保存時に、指定された項目で重複レコードがあればレコードをダイアログ表示します。

![2022-05-16_12h41_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/3bd28a11-1b70-57f7-b34a-b04023cee2fc.png)

モバイル表示では、表示項目を絞って見やすく調整できます。

![2022-05-16_12h43_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/5ea3beb9-abe2-d426-65ce-3fbeabce3131.png)

# エラーチェック操作例

エラー表示後。期間を調整して保存
![2022-05-16_12h49_36.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/06ae8345-71c9-c106-cf9e-bd3dd1781c05.gif)


# プラグインの設定例

- プラグイン有効
- プラグイン設定のダウンロード
- プラグイン設定のアップロード
- プラグイン設定ツール：　設定の複写・入替・クリアなど
- 実行条件：　計算式で重複チェックを実行する条件を指定
    - 計算式例：　部屋番号　：部屋番号の値が設定されていれば重複チェックを行う
    - 計算式例：　1　：常に重複チェックを行う
- 重複チェック条件：　重複の条件となる項目を指定
- メッセージ表示項目：　重複エラー時に、ダイアログに表示する項目を指定
- メッセージ：　重複エラー時に、ダイアログに表示するメッセージ
- メッセージ（日）：　日本語のメッセージ
- メッセージ（英）：　英語のメッセージ
- メッセージ（中）：　中国語のメッセージ
- 運用環境に反映：　「保存する」をクリック時に運用環境に反映

![2022-05-16_12h54_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/58ce0d41-c82d-2531-3859-f4a10830c649.png)

## 重複チェック条件

- OR条件の位置：　「-」AND で条件をチェック。数値を指定時：OR条件の位置
- 参照項目：　レコード検索対象の項目
- 条件：　検索時の条件
- 条件値：　計算式で条件値を指定

![2022-05-16_12h54_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/cd50fcd4-aa42-0654-2a65-2e82d222c8f4.png)

# メッセージ表示項目

- 項目：　表示項目
- ソート：　表示順
- モバイル非表示：　チェックした項目をモバイル非表示
    - モバイルは表示幅が狭いので表示項目を絞ったほうが見やすくなります

![2022-05-16_12h54_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/99962048-fd63-4b55-75ba-1feb9eb077c0.png)

# ルックアップの重複チェック
ルックアップ項目の重複チェックも対応できます。
![2022-05-20_09h39_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/67bc89f3-716f-5279-486a-ba80723890e8.png)

ルックアップが指定されている場合にチェックします。
![2022-05-20_09h39_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9ca84119-42d4-f8bb-b5c6-cb50a22bfa69.png)

# 注意事項
- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
Flutter3.0の重要な変更点を整理してみました

---
# :book: Flutterの記事を整理し本にしました :book:
https://zenn.dev/kazutxt/books/flutter_practice_introduction

* <font color="red"><b>本稿の記事を含む様々な記事を体系的に整理し本にまとめました</b></font>
* 今後はこちらを最新化するため、<font color="red"><b>最新情報はこちらをご確認ください</b></font>
* 35万文字を超える超大作になっています!!

---

## まとめ記事
* [Flutter系の記事のまとめ](https://qiita.com/kazutxt/items/524acb1c134015682ccf)

---

# 概要
* 2022/5/12にFlutter3がリリースされました
* Flutter2が2021/9だったので、8ヶ月でメジャーバージョンがあがった形となります

# 元記事
https://medium.com/flutter/whats-new-in-flutter-3-8c74a5bc32d0


# 重要なポイント


## Ready for production on all desktop platforms
* デスクトップアプリについては、Windowsのみ正式対応で、MacOSとLinuxがbeta版だったのですが、3.0で正式となります
* macOSアプリケーションメニューに表示される内容を制御できるようになりました
* スクリーンリーダー、アクセス可能なナビゲーション、反転色などのユーザー補助サービスをサポートしています

## Deprecating Windows 7/8 for development
* Windows7/8は非推奨になりました
* サポートはベストエフォートになりました

## Foldable phone support
* 折りたたみ式のモバイルアプリにも対応しました

## Gradle version update
* Gradleのバージョンが上がったため、既存からアップデートをした場合は、Gradleのバージョンの追従も必要になります
  * Gradleの場合は7.4
  * AndroidGradleプラグインの場合は7.1.2

## Updated lint package
* lintパッケージのバージョン2.0になりました


## Performance improvements
* オープンソースの寄稿者の貢献により、Androidの部分レンダリング、スレッドの制御、フレームスケジューリングのバグ解消などが行われました

## Impeller
* iOSで実験的なレンダリングバックエンドを利用できます
    * フラグを有効にする必要があります
    * まだ全ての機能で使えるわけではないので注意が必要です


## Material 3
* [MaterialDesign3](https://m3.material.io/) に対応しました。
* テーマの拡張もできます

## Breaking changes
* 非推奨のAPIはv2.10以降に削除されました
* ページ遷移がZoomPageTransitionsBuilderに置き換えられました
* useDeleteButtonTooltipがdeleteButtonTooltipMessageに移行します

# まとめ
* 機能の抜本的な追加はありませんでしたが、Mac/Linuxのデスクトップアプリの正式対応が行われました
* MaterialDesign3や折りたたみへの対応など先端技術には引き続き追従してくれています
* 性能も2.0/2.5のときの極端な改善やツールの提供こそありませんでしたが、日々改善されています
* OSやAPIが非推奨や使えなくなっているので、コマンドやツールを使って安全な移行をする必要があります
* 上記では省略しましたが、広告配信に関してもいくつかトピックが上がっていますので、気になる方はオリジナルの記事をご参照ください
filter()사용하기

# fileter()메쏘드 사용하방법
# 봐도봐도 잘 이해가 되지 않는다.

```javascript:store.js

export default new Vuex.Store({
  namespaced: true,
  state: {
    //data
    items: [],
  },
  getters: {},
  mutations: {
    addItem(state, item) {
      const resultItems = state.items.filter((cartItem) => {
        cartItem.id = item.id;
      });

      if (resultItems.length === 0) {
        state.items.push({
          ...item,
          qty: 1,
        });
      } else {
        resultItems[0].qty++;
      }
    },
  },
  actions: {
    addItem({ commit }, item) {
      commit("addItem", item);
    },
  },
});

```
vuex에서 모듈을 사용 스토어에서 데이터 불러오는 방법

몇일동안 헤맸다

#foodList.vue
```vuejs:foodList.vue
<template>
  <div>
    <h1>매일먹는거</h1>
    <ul>
      <li
        v-for="(food,index) in foodList"
        :key="index"
      >
        {{ food.image }}
      </li>
    </ul>
  </div> 
</template>

<script>
import {mapState} from 'vuex';
export default {
  data(){
    return {
    }
  },
    computed:{
        ...mapState('foodListModule',["foodList"])
    },
    created(){
      this.$store.dispatch("foodListModule/setFoodList");
    },
}
</script>

```
```javascript

import { createStore} from 'vuex'
import { foodListModule } from "./foodlist/index"

export default createStore({
  modules: {
    foodListModule,
  }
})
```
# store
```javascript
import foodListApi from "../../api/foodList";

export const foodListModule = {
  namespaced:true,
  state: {
    foodList :[]
  },
  mutations: {
    setFoodList(state, foodList) {
      state.foodList = [].concat(foodList);
    },    
   },
  actions: {
    async setFoodList({commit}) {
      const response = await foodListApi.getFoodList()
      commit('setFoodList', response.data.food)
    }
   },
  getters: { }
}

```
paging 만들기



1. page은 백엔드가 아닌 json 파일에서 가져와서 만든다.
```json:all-product.json
{
  "allproduct":[
    {
      "id":9,
      "image": "https://picsum.photos/720/960/?image=476",
      "title": "Herschel supply co 25l",
      "link": "",
      "price": 75.00,
      "badge": "new"
    },
     .....
    {
      "id":10,
      "image": "https://picsum.photos/720/960/?image=478",
      "title": "Denim jacket blue",
      "link": "",
      "price": 92.50,
      "badge": null
    },    
  ],
  "total":24
  
}
```
2.api 를 작성

```javascript
import http from "./http";
//aync es6 에 promise 가 좀 더  편하게 바뀌었다고 생각하면 됨
export default {
  async getAllProduct(page = 1) {
    return http.get("api/all-product.json", {
      page,
    });
  },
};
```
3. store 에 총상품을 담을 array선언
```javascript:store/index.js
import allproductApi from "@/api/product";
export default {
  namespaced: true,  state: {
    //data
    allproduct: [],
    totalproduct: 0,
    page: 0,
  },

  mutations: {
   //모든상품
    setAllProduct(state, allproduct) {
      state.allproduct = [].concat(allproduct);
    },
    //paging 처리를 위한 상품 호출 count
    setAllProductCount(state, totalCount) {
      state.totalproduct = totalCount;
    },
    setPage(state, page) {
      state.page = page;
    },
  },
  actions: {
    async setAllProduct({ commit }, page = 0) {
      const response = await allproductApi.getAllProduct(page);
      // 모든상품데이터 호출
      commit("setAllProduct", response.data.allproduct);
      // 모든상품의 count 호출
      commit("setAllProductCount", response.data.total);
      commit("setPage", page);
    },
  },
};
```

```vuejs:ShopView template
<template>
  <div>
            <div class="flex-sb-m flex-w p-b-35">
              <span class="s-text8 p-t-5 p-b-5">
                Showing {{ page * 12 + 1 }}–{{ page * 12 + 12 }} of
                {{ totalProduct }} results
              </span>
            </div>

            <ProductList />
            <!-- Product -->
            <div class="row">
              <!-- Block2 -->
            </div>
            <!-- Pagination -->
            <div class="pagination flex-m flex-w p-t-26">
              <template v-for="(p, index) in totalproduct / 12">
                <button
                  :key="index"
                  class="item-pagination flex-c-m trans-0-4"
                  :class="{ 'active-pagination': p - 1 === page }"
                  @click="changePage(p - 1)"
                >
                  {{ p }}
                </button>
              </template>
  </div>
</template>
```
```vuejs:script
<script>
import { mapState } from "vuex";
export default {
  data() {
    return {};
  },
  computed: {
    //스토어의 state에서 총상품의 카운트와 page 수를 가져온다.,
    ...mapState("product", ["totalproduct", "page"]),
  },
  methods: {
    changePage(page) {
      this.$store.dispatch("product/setAllProduct", page);
    },
  },
};
</script>

<style></style>

```
상품선택(구현하지 못하고 있음)

몇일동안 고생해서 작업했지만
생각한것을 구현하지는 못했다.
```vuejs
<template>
  <div>
    <div>
      <h1>매일 먹는거</h1>
      <swiper
        
        class="swiper"
        :modules="modules"
        :space-between="10"
        :slides-per-view="3"
        :free-mode="true"
        :pagination="{ clickable: true }"
      >
        <swiper-slide
          v-for="(food,index) in foodList"
          :key="index"
          class="slide"
        >
          <div
            :key="index"
            :class="{'active' :isActive === index}"
            @click="addToCart(food,index)"
          >
            {{ index }}
            <!-- <img :src="food.image"> -->
            <div>
              <span>
                {{ food.name }}       
              </span>
            </div>        
          </div>
        </swiper-slide>
      </swiper>
    </div>
    <h1>자주 먹는거</h1>
    <h1>가끔 먹는거</h1>
    <h1>애들 먹는거</h1>
  </div>
</template>

<script>
import { defineComponent } from 'vue'
import {mapState} from 'vuex';
import { Pagination,FreeMode } from 'swiper'
import { Swiper, SwiperSlide } from 'vue-awesome-swiper'

// import swiper module styles
import 'swiper/css'
import 'swiper/css/pagination'
import 'swiper/css/free-mode'
// more module style...

export default defineComponent({    
    name: 'SwiperExampleFreeMode',
    title: 'Free mode / no fixed positions',
    url: import.meta.url,    
    components: {
      Swiper,
      SwiperSlide
    },
    setup() {
      return {
        modules: [Pagination, FreeMode]
      }
    },
   data(){
     return {
       isActive:null

     }
   },

  computed:{
      ...mapState('foodListModule',["foodList"])
  },
  created(){
    this.$store.dispatch("foodListModule/setFoodList");
  },  
  methods:{
    addToCart(food,index) {
      this.$store.dispatch("foodListModule/addToCart", food);
      if(this.isActive === index){
          this.isActive = null;
        }else{
          this.isActive = index;
        }
    },  
  },    
  })
</script>
<style lang="scss" scoped>
  @import '@/styles/init.scss';
  @import './style.scss';

  .swiper {
    @include swiper-wrapper();
  }

  .slide {
    @include swiper-slide();
  }

  .active {border:solid 3px red}
</style>
```
Apacheの再起動でphp.iniの設定が反映されなかったとき

## Apacheの再起動
Webサーバへ反映するとき、
下記のコマンドを打っても反映されていないときがあります。
```
$ service httpd restart
```

## なぜphp.iniが反映されないか

Apacheでphpを実行するには**モジュール版**と**CGI版**のどちらかを使っています。

CGI版を使っている場合、**PHP-FPM**を通してphpを実行します。

Apacheを再起動しても**PHP-FPMがphp.iniの設定を読み込めない**のが原因です。

## CGI版
CGI版はPHP-FPMを通してphpを実行しています。
PHP-FPMに対して、php.iniの設定を読み込ませるため、下記コマンドを実行します。
```
$ service php-fpm restart
```

## モジュール版
Apacheが直接phpを実行しているためApacheの再起動だけで良いようです。

## FastCGIとは
Webサーバのプログラムを一度起動させて**しばらくメモリ上へ保持し待機させる仕組み**となっています。
なので、一度起動させたプログラムを待機させることで**処理の高速化**と**負荷の軽減**が見込めます。
CompTIA Security+ (SY0-601) 勉強法

先日、CompTIA Security+ (SY0-601) に合格しました。

https://www.credly.com/badges/4a5acd00-1304-4db7-97bf-a9c1d09d942d/public_url

初めてのセキュリティ資格でした。
私の勉強方法が誰かの参考になればよいと思います。

取得済み資格：
・IPA：基本情報(FE)、応用情報(AP)
・その他クラウド資格（AWS SAA、GCP ACE など）

使用教材：
・[TAC Web模擬試験（2回分）](https://www.tac-school.co.jp/kouza_it/comptia_web_mogi.html)
・[Udemy 模擬試験（6回分）](https://www.udemy.com/share/104XUE3@l93LmAg9l68eLzScxbUHH8vWBisfVitYx1-kBSTPf4YCGhgUXkXCUt_Oho9LI7vXmA==/)
どちらも良い教材でした。TACの方が本番に近い印象ですが、2回分しかないのでUdemyも併用することをおすすめします。

勉強方法：
模擬試験のみで学習しました。すべて2周は行いました。
解説を読むだけでなく、周辺知識を調べることでやっと合格基準にのった感覚です。

結果：
762点でギリギリ合格。100～900点のスコア形式で、合格スコアは750。
模擬試験だけだとこんなものでしょうか。
もう少し学習時間があれば、模試のなかで気になるところをもっと調べられたかな、と思います。

以上、よろしければ参考にしてみてください。
【React】Warning: Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it. のエラー対処法

## エラーが発生
コンパイル後、コンソール画面にエラーが発生した
```
index.js:1437 Warning: Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it.
    at div
    at Dashboard (http://localhost:3000/static/js/main.chunk.js:175:77)
    at AuthProvider (http://localhost:3000/static/js/main.chunk.js:441:23)
    at App

【 訳 】
警告：関数はReactの子としては無効です。 
これは、レンダリングから<Component/>ではなくComponentを返す場合に発生する可能性があります。 
または、この関数を返すのではなく呼び出すつもりだったのかもしれません。
```

## エラーの発生原因
関数呼び出し時に、()を書くのを忘れていた
``` Dashboard.js
import React, {useState, useContext} from "react";
import dig from "object-dig";
import { signInWithGoogle, logOut } from "../service/firebase";
import { AuthContext } from "../providers/AuthProvider";

const Dashboard = () => {
    const currentUser = useContext(AuthContext);

    const formRender = () => {
        let dom;
        if ( dig(currentUser, 'currentUser', 'uid')) {
            dom =
                <form>
                    <input placeHolder="ToDoName" />
                <button>追加</button>
            </form>;
        } else {
            dom = <button onClick={signInWithGoogle}>ログイン</button>
        }
        return dom;
    };

    return(
        <div>
            // 原因： 以下関数呼び出し時に、()を書くのを忘れていた
            {formRender}
        </div>
    )
};

export default Dashboard;
```

## エラーの解決方法
以下のように修正すればOK
``` Dashboard.js
// 略
{formRender()}
// 略
```
rails5 progate 整理メモ

# ログインしていない場合のアクセス制限
ログインしていないと特定のアクションを作動することができないようにする。
その後ログインページへリダイレクトさせる。

・postsコントローラの全アクション
・usersコントローラのindex, show, edit, updateアクション

その場合にエラーメッセージを表示させる。

## まずログインの条件をつけてみる
どうすればよかったか?
```if @current_user```とかにすれば良かったと思う。
じゃない。
```before_action```を使えば良かったと思う。
そこでアクションをする前にメソッドを作動させる。

### どのようなメソッドをつけるのか？
ログインしていることがわかればいいから```application_controller```の```set_current_user```を使えばいいのか？　それにonlyをつければいいのかな。
やってみよう。

```users_controller.rb
before_action :set_current_user, only:[:index :show :edit :update]
```
と書いてみた。
がエラーメッセージを表示させなくてはならないことに気づく。
なので新しくメソッドを作成をしようと思う。
どのようなメソッドにすればよいだろうか？
```application_controller.rb
  def check_current_user
    if @current_user
    else
      flash[:notice] = "ログインが必要です"
      redirect_to("/login")
    end
  end
```
ログインの可否を問い、```else```でエラーメッセージを表示させるか？
ifも空だし何か腑に落ちない。
その場合```@current_user```を使いidと照合し...んーーわからん。
答えを見た。
```rb
if @current_user == nil
  flash[:notice] = "ログインが必要です"
  redirect_to("/login")
end
```

```@current_user```が空の場合を想定するのか。だから```else```が必要ないのか。
しかし```@current_user == nil```に慣れていないので中身が記録がない時にこれを用いるのか。
否定的なif文だな。
```if @current_user```は肯定的if文だと自分の中で解釈した。
これらを使い分けることによって```なんとかでない場合```を書けるようになると思う。

```authenticate_user```というメソッド名は統一なのだろうか？

```posts_controller.rb
class PostsController < ApplicationController
  before_action :authenticate_user
.
.
.
end
```
```users_controller.rb
class UsersController < ApplicationController
  before_action :authenticate_user, only:[:index :show :edit :update]
.
.
.
end
```

## ログインしていないユーザーがusersコントローラのindexアクションにアクセスした時に、ログインページへリダイレクトしてください。
すぐに答えを見てしまった。これから頑張る。
```only```の部分がおかしいのがわかる。
ログインページへリダイレクトしてください。と書いてあるため```before_action```が作動していないことがわかる。
```users_controller.rb
class UsersController < ApplicationController
  before_action :authenticate_user, {only:[:index, :show, :edit, :update]}
.
.
.
end
```
```{}```と```,```がついていなかった。
laravel-openapiライブラリ コマンド集

# 概要

- laravel-openapiにて各種クラス作成時のphp artisan コマンドをまとめる。

# コマンド集（簡易版）

| ユースケース | コマンド | 備考 |
| --- | --- | --- |
| OpenAPI 出力 | `$ php artisan openapi:generate コレクション名` |  |
| リクエストボディークラス作成 | `$ php artiasn openapi:make-requestBody リクエストボディークラス名` | ファイル名の`RequestBody.php`は**自動付与されない** |
| レスポンスクラス作成 | `$ php artisan openapi:make-response レスポンスクラス名` | ファイル名の`Response.php`は**自動付与されない** |
| パラメータークラス作成 | `$ php artisan openapi:make-parameters パラメータークラス名` | ファイル名の`Parameters.php`は自動付与 |
| スキーマクラス作成 | `$ php artisan openapi:make-schema スキーマクラス名` | ファイル名の`Schema.php`は自動付与 |
| セキュリティースキーマクラス作成 | `$ php artisan openapi:make-security-scheme セキュリティースキーマクラス名` | ファイル名の`SecurityScheme.php`は自動付与 |

# コマンド集

### OpenAPIのドキュメントを出力したい

- コマンド

    ```
    $ php artisan openapi:generate コレクション名
    ```

- コマンド例

    ```
    $ php artisan openapi:generate default
    ```

- 出力先とファイル名

    ```
    ※ターミナルにJSONで出力される
    ```

- 備考
    - JSONのみ出力可能
    - yamlでの出力不可
    - 引数のコレクション名は省略可能、省略したときdefaultのコレクションが適用される。

### リクエストボディークラスを作成したい

- コマンド

    ```
    $ php artiasn openapi:make-requestBody リクエストボディークラス名
    ```

- コマンド例

    ```
    $ php artiasn openapi:make-requestBody CreateUserRequestBody
    ```

- 出力先とファイル名

    ```
    app/OpenApi/RequestBodies/CreateUserRequestBody.php
    ```

- 備考
    - ファイル名末尾の`RequestBody.php`は**自動で付与されないので注意**

### レスポンスクラスを作成したい

- コマンド

    ```
    $ php artisan openapi:make-response レスポンスクラス名
    ```

- コマンド例

    ```
    $ php artisan openapi:make-response CreateUserResponse
    ```

- 出力先とファイル名

    ```
    app/OpenApi/Responses/CreateUserResponse.php
    ```

- 備考
    - ファイル名末尾の`Response.php`は**自動で付与されないので注意**

### パラメータークラスを作成したい

- コマンド

    ```
    $ php artisan openapi:make-parameters パラメータークラス名
    ```

- コマンド例

    ```
    $ php artisan openapi:make-parameters CreateUser
    ```

- 出力先とファイル名

    ```
    app/OpenApi/Parameters/CreateUserParameters.php
    ```

- 備考
    - ファイル名末尾の`Parameters.php`は自動で付与される

### スキーマクラスを作成したい

- コマンド

    ```
    $ php artisan openapi:make-schema スキーマクラス名
    ```

- コマンド例

    ```
    $ php artisan openapi:make-schema CreateUserResponse
    ```

- 出力先とファイル名

    ```
    app/OpenApi/Schemas/CreateUserResponseSchema.php
    ```

- 備考
    - ファイル名末尾の`Schema.php`は自動で付与される

### セキュリティースキーマクラスを作成したい

- コマンド

    ```
    $ php artisan openapi:make-security-scheme セキュリティースキーマクラス名
    ```

- コマンド例

    ```
    $ php artisan openapi:make-security-scheme App
    ```

- 出力先とファイル名

    ```
    app/OpenApi/SecuritySchemes/AppSecurityScheme.php
    ```

- 備考
    - ファイル名末尾の`SecurityScheme.php`は自動で付与される
フロベニウスの硬貨交換問題とその応用


### フロベニウスの硬貨交換問題

[フロベニウスの硬貨交換問題 Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%AD%E3%83%99%E3%83%8B%E3%82%A6%E3%82%B9%E3%81%AE%E7%A1%AC%E8%B2%A8%E4%BA%A4%E6%8F%9B%E5%95%8F%E9%A1%8C)という面白い問題を見つけたので紹介します。

> 指定された硬貨だけではぴったり払えない最大の金額を求める数学の問題。
> 例えば、3円と5円のコインだけでは作れない最大の金額は7円。
> 式で書くと、フロベニウス数 $g(3,5) = 7$

### 2個のコインの場合の公式

これは簡単な公式があって

```math
\begin{align}
gcd(a_1, a_2) &= 1のとき　\\
\large g( a_1, a_2 ) &= a_1 a_2-a_1-a_2
\end{align}
```
例えば、$(a_1, a_2) = (3,5)$の時は$3 \times 5 - 3-5=7$となります。</br>
念のため$a_1x + a_2y $で表せない数をプログラムでリストしてみると${1, 2, 4, 7}$となり$g(3,5)=7$となりそうです。

```python
from itertools import product
a,b = 3,5
nall = set([n for n in range(31)])   # set of non-negative integers up to 30
lc =  set(sorted([a*x+b*y for x, y in product(range(6),repeat=2)]))
print(nall-lc)
#  {1, 2, 4, 7}
```

### ３個以上のコインの場合

３個以上のコインの場合は簡単な公式は無いようですが、ある条件の場合には導きだせるようです。以下の論文から必要な所だけ抽出すると、

* [ON A LINEAR DIOPHANTINE PROBLEM OF FROBENIUS, Amitabha Tripathi(2006)](https://www.emis.de/journals/INTEGERS/papers/g14/g14.pdf)

```math 
\begin{align}
& \large [定理 1]　\\
&a_1, a_2,　\dots , a_k を互いに素な正の整数とする \\
&P = a_1 \times a_2 \times　\dots \times a_k \\
&A_i = P / a_i \quad (1 \le i \le k ) \\
&このとき　\\
&g(A_1 ,A_2 , \dots , A_k)=(k-1)P - (A_1 + A_2 + \dots + A_k)
\end{align}
```

この式だけだとちょっと分かりずらいので具体例で見てみます。

### [例題] 6円, 10円, 15円のコインで表せない最大の金額を求めよ

これは[定理 1]の$a_1, a_2 , a_3 = 5,3,2 $の場合に当てはまるので。

```math 
\begin{align}
&P = 5 \times 3 \times 2 = 30 \\
&A_1, A_2 , A_3 = 6,10,15\\
&g(6,10,15) = (3-1) \times 30 - (6+10+15) = 29
\end{align}
```

同様にしてプログラムで$6x+10y+15z$で表せない数をリストすると最大値は29となることが確認できました。

```python 
from itertools import product
a,b,c = 6,10,15
nall = set([n for n in range(101)])   # set of non-negative integers up to 100
lc =  set(sorted([a*x+b*y+c*z for x, y, z in product(range(6),repeat=3)]))
print(nall-lc)
# {1, 2, 3, 4, 5, 7, 8, 9, 11, 13, 14, 17, 19, 23, 29}
```
この考え方は Euler Project: Problem 278を解くのに役に立ちます。

（開発環境：Google Colab）
NeoVim に簡易電卓機能を追加

ややこしい計算は電卓に頼りたくなるのだけど、これが案外、面倒くさいという話を学生さんと交しました。

- まずは、電卓アプリを起動するのが面倒。そして
- 数式を入力するのに、仕事の文脈と行き来しながら何度か数値をコピペするのが面倒。おまけに、
- 計算結果をコピーして、どこかに貼るのが面倒。

    計算した結果はほぼ確実にどこかにペーストするのだから、計算結果は勝手にコピーされるべきだ。

というわけで、仕事の中心にいるテキストエティタ (`neovim` - `vim` の進化版) に自分が望む電卓機能を追加したというお話しです。

# 最初に Python との連携機能を用いた実装

こちらは Vim script ２行でできました。

``` vim
py3 from math import *
command! -nargs=* P let @* = py3eval("str(<args>)") | echo @*
```

その心は `:P 2 + 3 + 5` とやれば、結果の 10 を表示し、これをクリップボードにコピーします。neovim の文書に `"*p` でペーストできることはもちろん、ほかのアプリ (Word, Excel, ブラウザ、なんでもあれ) にもペーストできます。

また、この設定の１行目で `math` モジュールをインポートしているので、`:P sin(pi / 6)` のような `math` モジュールに定義されている定数や関数も簡単に利用できます。

# つぎに NeoVim に組込まれている Lua を用いた実装。

NeoVim 0.5.0 は Lua を内包し、最近、利用できるようになった NeoVim 0.7.0 で Lua から NeoVim の機能拡張がしやすくなりました。

数式の文法は Python でも Lua でもほとんど違いはないだろうと思ったので、NeoVim がもともと含んでいる Lua で実装した方が軽いかと思って作ってみました。（もっとも、Python API を利用するパッケージがほかにあるから、Lua で実装する意義はほとんどないけれど）

前の実装よりすこしややこしいけれど、こんな感じです。

``` lua
vim.api.nvim_create_user_command('C', function (args)
    vim.fn.setreg('*', tostring(load('return ' .. args.args)()))
    print(vim.fn.getreg('*'))
  end, { nargs='+' } )
```

`load` 関数は `eval` っぽい役割を果し、引数に与えられた文字列を本体とする関数を構成してくれるので、その場で呼び出して計算結果 (`result`) を得ています。`C` コマンドとともに書いた数式が Lua の引数 (`args.args`) に与えられるので、それを `return ` と連結して `load` 関数に与えると、数式を評価する関数が得られます。これをその場で呼び出す（`load(...)()`）ことで計算しています。

vim のレジスタには文字列を収めるものらしいので、保存する前に文字列化しています。ちなみに、`setreg` の第一引数に与えている `*` はクリップボードに該当する vim のレジスタです。

よくわからなかった、Python での `from math import *` 相当のことを Lua で実現する方法です。Lua の `math` モジュールで定義されている要素を走査して、大域モジュール (`_G`) に追加すればよいことを [StackOverflow](https://stackoverflow.com/a/62932954/15578861) で学びました。

``` lua
function using(module, ...)
  for k,v in pairs(module) do
    if _G[k] then
      io.stderr:write("use: skipping duplicate symbol ", k, "\n")
    else
      _G[k] = module[k]
    end
  end
end

using(math)
```

もうすこし簡単にできないものかなぁ。
インスタグラムで自動フォローと自動いいねを実装する①(要件定義)

![kotostagram-icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2660786/70e52a7f-32f9-4f5c-8c16-f828982f3c89.png)
# 初めに
インスタグラムはスクレイビングやその他の自動機能を認めていません。こちら使用される際は自己責任でお願いします。
# 作ることになったわけ
　私の友人にインスタグラムを本気で行っている人がいる。この友人は自営業をしており、いつも時間が足りないと嘆いていた。私がSEであるということを知った彼女から、インスタグラムのフォロワーを増やすために、フォローといいねをしていきたいが、自分でやるには時間がないし、面倒だ。これを自動化することはできないか、という相談を持ち掛けられた。
　そこで彼女からヒアリングを行い、どのような人たちをフォローするか、どのような投稿にいいねをするかを決定した。
# 要件概要
## 前提
　フォローといいねをする理由はフォローバックによるフォロワー増加を狙うためだ。フォローによるフォロバ率は大体20～30%だといわれる。
　また、フォローバックを狙うために、最近アクティブなユーザーをフォローする。いいねする投稿は自分のアカウントに関連のあるもので、比較的新しい投稿からいいねを行う
## instagramの仕様
　これがとても大切になってくるのだが、instagramはスクレイビング対策が厳重になされている。以下にインスタグラムの仕様を箇条書きする。
・1時間にフォローできるのは人ほど
・1時間にいいねできるのは人ほど
・フォローされている人のプロフィールにはフォローバックすると記載されている
・フォローしている人のプロフィールにはフォロー中と記載されている
## 要件定義
　以上のことから要件を満たすために以下の機能を実装する。
・定期的に投稿しており、自分の投稿と関連のある投稿をしている、フォロワー(以下有効フォロウィー)のフォロワーからフォローを行う。
・有効フォロウィーの最新の投稿にいいねしているユーザーをフォローする。
・設定したキーワードで検索をかけ、最新から30件いいねを行う。
・フォローして一定時間経過したユーザーのフォローを解除する。
・フォローバックがあったユーザーと、その時間をエクセルファイルに出力する。
・有効フォロウィーの管理がしやすいように、フォロワー(フォロウィー)一覧から、有効フォロウィーに追加できるようにする。
・キーワードを管理者ではなく使用ユーザーが追加できるようにする。
# プロジェクト名について
　プロジェクト名は依頼者の名前を用いて、「ことすたぐらむ」とする。
　この記事を書いている時点で、フォロー解除機能と、解析機能以外は完成しているため、早めにQiitaにアップロードできるようにします。
Git ActionsAWSステージング環境へのマージでEnvironment still has health Red 30 seconds after update finished!が出たの時の解決方法

## PRをステージングにマージ中に下記のエラーが出現

```
Environment still has health Red 30 seconds after update finished!
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/832042/308680f2-e00d-9a4d-21ce-e6a729378ac4.png)

### エラーの原因
今回は、Elastic Beanstalk 環境が更新中であるのに、更に更新をかけってしまったことが原因。
つまり、まとめてPRをマージしすぎた。
参照先
https://aws.amazon.com/jp/premiumsupport/knowledge-center/elastic-beanstalk-yellow-warning/

## 解決策
### GIThubの画面から
re-run failed jobを押下して、もう一度マージをしてみる。

### 感想
PRをまとめてマージするのは、エラーの原因になるのでこまめに更新して行きたい。
rails５ progate 整理メモ

# ユーザー名を表示させる
問題を出題されたすぐに```application.html.erb```が表示されたのでここに書けばいいのか迷った。
それは```users_controller.rb```にインスタンス変数に代入させてそこでhtmlに表示されば良いのかどうかと考えたからだ。
結果```users_controller.rb```に@userが入っていたのでこの名前のインスタンス変数を使えないので
htmlに直接書いた。
今思うと別の名前のインスタンス変数を作れば良かったかなと思った。
```application.html
.
.
.
      <ul class="header-menus">
        <% if session[:user_id] %>
          <li>
            <%= link_to("#{User.find_by(id: session[:user_id]).name}", "users/#{User.find_by(id: session[:user_id]).id}" %>
          </li>
.
.
.
```
なんか長くなった。
## SyntaxError in HomeController#top
```top```アクションの画面がこのリンクのせいで表示されないないことがわかるが、どういうふうにリンクが悪さをしているのかがわからない。
とりあえず
今さっき書いたリンクを消せばこのエラーを解消することがわかった。
## リンクを書く。
リンクの名前とリンク先のパスを書かなければならない。
名前はいいとしてパスの書き方がわからない。
仮に
```html
<%= link_to( "#{User.find_by(id: session[:user_id])}", "/users/1" %>
```
を書いてみた。

## SyntaxError in HomeController#top
```application.html.erb```のelseで止まってしまう。
どういうことだろうか？


### 解決法
```html
<%= link_to( "#{User.find_by(id: session[:user_id])}", "/users/1")%>
```
()を閉じていなかったためだ。
そのため
elseまでlink_toに入っていたのでエラーになったと思われる。

## リンク先を書いてみよう。
```html
 <%= link_to("#{User.find_by(id: session[:user_id].name)}", "/users/#{session[:user_id]}" )%>
```
こう書いてみた。
そうすると
### ユーザー詳細画面の画像がおかしくなっていた。
どういうことだろう?
```show.html
.
.
.
 <img src="<%= "/user_images/#{@user.image_name}" %>">
.
.
.
```
で@userが呼び出されていないからだと思う。
ではusers_controller.rbのshowアクションを見てみよう。
```users_controller.rb
  def show
    @user = User.find_by(id: params[:id])
  end
```
しかしここでパスにidがあったはずなのでここで表示されないと思う。

わからない。次いこう。

## ヒントを見ると```before_action```が使われていた。
やっぱりインスタンス変数を使っていたか。

## before_actionを使い共通処理を行わせる
ここで```application.html.erb```で書いていたことを@current_userに代入させる。
またログイン中のユーザーを```@current_user```と定義することを忘れていた。

### applicationコントローラ
全てのコントローラで共通する処理はapplicationコントローラにまとめることができます。
図を見ると書くコントローラがアクションを起こす前にapplicationコントローラが作動し書くアクションが作動する。
そしてapplicationコントローラが定義した変数は各コントローラで使うことができる。

```application_controller.rb
class ApplicationController < ActionController::Base
  before_action :set_current_user

  def set_current_user
    @current_user = User.find_by(id: session[:user_id])
  end
end
```
```application.html
      <ul class="header-menus">
        <% if @current_user %>
          <li>
            <%= link_to(@current_user.name, "/users/#{@current_user.id}") %>
          </li>
```
AutomationStudioのまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)

+ [SFMCのまとめ](https://qiita.com/Keiji_otsubo/items/f2ca9dce189979fe96f3)

[Automation Studio](https://help.salesforce.com/s/articleView?id=sf.mc_as_automation_studio.htm&type=5)

Automation Studio で Marketing Cloud メール送信、クエリ、インポートなどがどのように自動実行されるかを説明します。

Automation Studio は、即時、トリガー、またはスケジュールによって複数ステップのマーケティングおよびデータ管理アクティビティを実行するために使用される、Marketing Cloud アプリケーションです。Automation Studio のワークフローキャンバスを使用して、簡易型オートメーションまたは複数ステップのオートメーションを作成します。

Automation Studio には、各オートメーションのステータスを表示する概要ページが含まれています。すばやく回復できるように、対応するオートメーションと共にエラー情報が表示されます。必要に応じて、このページで個々にオートメーションを実行することもできます。

オートメーションは、メール送信、ファイルのインポート、SQL クエリなどのオートメーションアクティビティを使用して作成します。[アクティビティ] ページでオートメーションアクティビティを構成および管理します。このページで個々にオートメーションアクティビティを実行することもできます。

# 設定

+ [AutomationStudioアクティビティでファイルの場所にアクセスできません](https://qiita.com/Keiji_otsubo/items/e13b93a82593a30ff07e)
+ [AutomationStudioでSQLクエリを使用してDEにデータを入力する](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HDM4V)
【Android Studio】Error launching Studioエラーでインストールできないときの対処法

WindowsでAndroid Studioを日本語化した後、起動しない/起動できなかったので、その時の備忘録。

***■事象までにやったこと***
①AndroidStudioをダウンロード
②日本語化するためのアプリケーションpleiades-winをインストール
③AndroidStudioが立ち上がらず。。

エラーメッセージ：
Error launching Studio
Could not find main class com/intellij/idea/Main
![スクリーンショット 2022-05-14 012727.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/777576/a123029a-df97-7c6d-bd50-f5323e0eb567.png)

上記メッセージで検索しても、全然ヒットせず。
親しいワードでは、Javaをインストールしろとかあったけど、日本語化する前は普通に動いていたので、違うだろうなと思いつつJava入れたりしてみた、解決には至らず。
似たような状況で、アプデ後に起動できなかった記事を参考に、以下方法で解決できたのでこちらに残します。


***【解決方法】***
①AndroidStudioをアンインストール
②以下フォルダのファイルも削除
・C:\Users\ユーザー.gradle
●Android Studio 4.1 以降の場合:
・Windows: %APPDATA%\Google\AndroidStudio(version)
ex: C:\Users\your_user_name\AppData\Roaming\Google\AndroidStudio...

●Android Studio 4.0 以前の場合:
・Windows: %HOMEPATH%\.AndroidStudio(version)\config
ex: C:\Users\your_user_name\.AndroidStudio...\config

③AndroidStudioを再インストール

上記フォルダ削除で再インストールできました！！
（この結果に至るまで12時間ほど費やしました、、無駄な時間だったけど解決への知見を得られたし、同様の事象で苦しんでいる方々の助けになれたら、私の時間も浮かばれます＾＾）

現時点でpleiades-winを再度使用して日本語化はしておりません。（また同じことが再現するのか、時間できたら再チャレンジしてみますw）
一旦今は日本語化諦めて、英語のままでAndroidアプリ開発進めていこうと思います！
頑張るぞーーー！！💪💪💪
「Duplicate entry ‘1’ for key ‘PRIMARY’」とSQLでエラー表示されるとき　

## SQLでデータの更新をかけようとすると、下記のエラーが発生
```
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
```
### 意味
キーが重複している.
すでにそのデータが存在している時などに出力されるエラー。

### 対応策
更新使用としているデータを別の値にしてあげる。
また自動入力されるカラムの場合は、nullにして上げる自動で入力でされる。
[たぶん一時的なメモ(2022/05/16)]Azure AD B2Cでテナントを作成しようとしたら対象地域なのに対象外と怒られテナントが作成できなかった話

<h1>はじめに</h1>
一時的なバグなのでメモ書き程度の内容になりますが残しておきます。
またAzureADB2C以外でも似たようなバグが起きている可能性があります。B2Cでなくともエラーの文言で検索に引っかかった方は参考になるかもしれないです。<br>
※テナント作成については他の方の記事を参考にしてください
<h1>何が起きたのか</h1>
2022年の5月に入ったあたりからAzure AD B2Cでテナントを作成しようとしたら以下のエラーが発生するようになりました。

![エラー画面.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309045/bd9ad4ac-bbd9-07b3-bcaf-af039d187f9c.jpeg)

```
The provided location 'アジア太平洋' is not available for resource type 'Microsoft.AzureActiveDirectory/b2cDirectories'. List of available regions for the resource type is 'global,unitedstates,europe,asiapacific,australia,japan'.
```

簡単に言うとアジア太平洋では使えないということです。そんな馬鹿なはずはない数日前まで使えてたのに...
しかもエラーの指定してくれと言っている対象地域に「asiapacific」→アジア太平洋って書いてある。
なぜなのか。

<h1>解決方法</h1>
この記事を見に来た方は原因とかはともかく解決方法だけ早く知りたいと思うので解決方法を書きます。<br>
<B>Azureポータルの言語設定を「English」だけです。</B><br>
以上です。
レイアウトにもよったりするのかもしれないのですがポータル右上の歯車アイコンを押して、左側の「言語と地域」のところから変更するだけです。<br>

![言語設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309045/beeeee75-d951-9e39-ff15-66fb4a5ad864.jpeg)
とりあえずMicrosoft側もこの問題を数日前に把握したらしく次回アップデートで修正されるそうです。

<h1>原因</h1>
もう大体察しが付くと思いますが「アジア太平洋」がダメなだけで「asiapacific」は大丈夫なんです。
例えば国の選択をする際にプルダウンで日本を選ぶとデータセンタは「アジア太平洋」になります。

![テナント作成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309045/76d984ed-6501-5f5f-feb8-e34dad212f72.jpeg)

この勝手に選択される「アジア太平洋」の文字列を英語の「asiapacific」に置き換えられていないため、テナントを作成する際に前述したエラーが発生するんだと思われます。確かにエラー内容を見ると「アジア太平洋」という文字列がそのまま出力されていますね。
まさか向こうが勝手に選んでるデータのせいでエラーが出るとは思わない＋数日前まで普通にテナント作成できていたことからすぐには原因に気づけませんでした。(色々試してマイクロソフトが悪いんじゃないかという予感はしていた)
言語設定を英語にすれば「asiapacific」でデータが入力されているので問題ないという訳です。

<h2>あとがき</h2>
なんだこのバグは...。
クラウドサービスを使っているとこういうことがあるんだなと勉強になりました！！！
オフライン環境: pipでファイルからpythonパッケージインストール

最近、オフラインでpip installすることも増えました。私はLinuxコマンドなどあまり使わないので作業手順をメモしておきます。
以下の手順で実施します。

1. オンライン環境
    1. Pythonパッケージダウンロード
    1. 圧縮
2. オフライン環境
    1. 解凍
    1. インストール

# 手順
## 1. オンライン環境
オンラインでPyPIと接続できる環境での作業です。

### 1.1. Pythonパッケージダウンロード
`pip download`でPyPIから必要パッケージをダウンロードします。依存パッケージもダウンロードされます。
ここでは、ディレクトリ`/packages`にPythonパッケージ`shap`をダウンロード。

```bash
pip download -d ./packages shap
```

### 1.2. 圧縮
ディレクトリ`/packages`ごとgzipに圧縮し、`archive.tar.gz`というファイルにします。

```bash
tar cfvz archive.tar.gz ./packages
```

## 2. オフライン環境
オフライン環境での作業です。gzip圧縮ファイルを適当な場所に置きます。

### 2.1. 解凍
ファイルを解凍します。

```bash
tar xfvz archive.tar.gz
```

### 2.1. インストール
pip install でファイルからインストールします。

```bash
pip install --no-index --find-links=./packages shap
```

# 参考リンク
以下のリンクを参考にしました。

https://densan-hoshigumi.com/develop/python-pip-offline-install

https://webkaru.net/linux/tar-command/
vConsole「スマホでもコンソール使えるようにしてみた」

## はじめに
ある日、Mediumというサイトで、下記の記事が投稿されていました。

https://javascript.plainenglish.io/5-javascript-utility-libraries-to-improve-your-efficiency-4380b1d373c5

**わい「ほうほう。どんなライブラリがあるんじゃろか」**

興味を持って、記事を読んでみるとvConsoleなるライブラリが紹介されていました。

**わい「vConsole？ なになに…」**

>Debugging web pages on mobile is very difficult, but with “Vconsole” everything will be much easier. 
>
>~日本語訳~
モバイルでのWebページのデバッグは非常に難しいですが、vConsoleがあればすごく簡単にデバッグ作業ができます

**わい「なにこれおもしろそう…」**

ということでvConsoleなるものについて少し調べてみたところ、なかなかに便利そうだったので、わたしみたいな初級者Webエンジニアの同志にも是非知ってほしいと思い、記事にしてみました。

## vConsoleとは？
モバイルデバイスでもコンソール機能を使えるようにするJavaScriptライブラリです。
フレームワーク依存はなく、VueやReactでも使用可能です。
WeChatミニプログラムの公式デバッグツールでもあるそうです。

![gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006362/37973e01-32e1-b491-f697-dfa903432420.gif)

**Githubリポジトリ**

https://github.com/Tencent/vConsole

**デモサイト**

https://wechatfe.github.io/vconsole/demo.html

## 確認できる項目
- Logs: `console.log|info|error|...`
- Network: `XMLHttpRequest, Fetch, sendBeacon`
- Element: `HTML elements tree`
- Storage: `Cookies, LocalStorage, SessionStorage`

など

## 使い方

### インストールと初期化
npm(推奨)
```
npm install vconsole
```

```javascript
import VConsole from 'vconsole';
const vConsole = new VConsole();
```

CDN
```javascript
<script src="https://unpkg.com/vconsole@latest/dist/vconsole.min.js"></script>
<script>
  const vConsole = new window.VConsole();
</script>
```

※利用可能なCDNは下記
- https://unpkg.com/vconsole@latest/dist/vconsole.min.js
- https://cdn.jsdelivr.net/npm/vconsole@latest/dist/vconsole.min.js

初期設定が完了すると、左下に緑のボタンが配置されます。
このボタンを押下するとコンソール画面を確認することができます。

![スクリーンショット 2022-05-14 18.03.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006362/daf85436-e23e-00f5-e5f5-cfc84e011d3c.png)

### プロパティ設定
インスタンスを生成するときにoptionを渡すことで、コンソールに関する設定を変更することができます。
optionはオブジェクト形式で渡してあげます。
```javascript
var vConsole = new VConsole(option);
```

例えば、下記のようなpropertyをoptionとして渡すことでダークテーマに変更することができます。

```javascript
const vConsole = new VConsole({ theme: 'dark' });
```

![スクリーンショット 2022-05-14 18.11.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006362/31e20193-054e-fc85-23f6-d4a6174f612c.png)

### Propertyの一部抜粋

| Key  |Type  |Optional  |デフォルト値  |概要  |
|---|---|---|---|---|
|defaultPlugins|Array(String)|true  |['system', 'network', 'element', 'storage'] |リストアップされた項目のみを、vConsoleに取り込むことができます。|
|pluginOrder |Array(String)|true |[] |項目順をソートできます。リストにないものは最後に表示されます。 |
|onReady | Function  | true | |vConsoleが起動し、ロードされた後にトリガーされます。 |
|theme  |String | true |'light' |表示テーマを変更できます。  |
|target  |String, HTMLElement| true |document.documentElement  |vConsoleのレンダー先を指定できます。  |

上記以外にも、さまざまなpropertyやMethodなんかもあるようなので、詳しくは下記より参照してみてください。
https://github.com/Tencent/vConsole/blob/dev/doc/public_properties_methods.md

## 所感
実際に使ってみると、設定がとても簡単ですぐに導入することができました。
Logやネットワーク通信なんかも結構具体的に確認することができたので、通常のデバッグであれば充分すぎる機能が揃っているのではないかと感じます。
実際に[LIFFに活用するかた](https://qiita.com/sumihiro3/items/9f4f1adb5d8883d9ceeb)や[Pepperのタブレットに活用するかた](https://qiita.com/trashrash/items/d7c3621a972f95d69ca9)がいて使い所の幅も多そうだなと思っています。
わたし自身も業務で使う機会があれば、ぜひ活用してみたいなと思いました！