OmniAICreator/Qiita-1.07M huggingface dataset:
【rails】seedやコンソールを使わず環境変数で管理者権限を実装する。(脳筋)

# 追記　2023/5/03
現在は以下コードでseed.rbの内容を適用できるようです！
```powershell:PowerShell
flyctl ssh console
cd rails 
bundle exec rails db:seed
exit
```


# 経緯
管理者権限機能を実装する際に管理者ユーザーをseed.rbに初期レコードとして入れる手法を使っていたのですが、[Fly.io]( https://fly.io/ "Fly.io")の無料プランでリリースしようとすると、、、、、
まさかの本番環境のコンソールを開くことが出来ない事態。。。。。

という事で管理者権限ぽいのを環境変数を使って実装しよかなという次第です。

# 前提
`gem device`と`gem dotenv-rails`を導入済み

投稿用のコントローラーとして`posts_controller.rb`
投稿用のモデルとして`Postモデル`を使用しています。

# この記事での想定している状況
管理者ユーザーのみ投稿編集削除できる。
管理者以外のユーザーは各投稿の閲覧のみ。

# 実装
.envファイルの記述
コントローラーの記述
viewファイルの記述

## ①.envファイルの記述

```:.env
~省略~
ADMIN_EMAIL=管理者ユーザーのemailアドレス
例)ADMIN_EMAIL=adminuser@gmail.com
```
`ADMIN_EMAIL`という変数に管理者権限をもつemailを代入してます。

イコールの間にスペースを入れない方がエラーは起こりにくいです。
## ②コントローラーの記述
コントローラーの上部と下部に追記します。

※コントローラー下部は`private`直下に書くようにしましょう！

```diff_ruby:posts_controller.rb
class PostsController < ApplicationController
  before_action :authenticate_user! , except: [:show, :index]
  #追記１ここから
+ before_action :if_not_admin, except: [:show, :index]
  #追記１ここまで
  def index
    @posts = Post.all
  end
  def show
    @post = Post.find(params[:id])
  end
  def new
    @post = Post.new
  end
#~~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~~~
private
  #追記２ここから
+ def if_not_admin
+    redirect_to root_path unless current_user.email == ENV['ADMIN_EMAIL']
+ end
  #追記２ここまで
end
```
追記１（コントローラー上部）と追記２（コントローラー下部）の記述です。

.envファイルで宣言した変数は`ENV['環境変数']`で取得できます。

追記２で宣言した`def if_not_admin`は __「ログインしているメアドが管理者のメアドと一致しない時,rootで設定したpathに戻ってくる」__ というメソッドです。

追記１は追記２で定義した`def if_not_admin`メソッドがコントローラの各アクションが動く前に実行されるという記述です。

後部の`except: [:show, :index]`は`def if_not_admin`メソッドを適用しないアクションを指定しています。
今回の場合、管理者でないユーザーも投稿の確認が出来る状況を想定しているため投稿閲覧に関連するindex,showアクションを指定しています。

詳しくはこちらを

https://pikawaka.com/rails/before_action

## ③viewファイルの記述
上記コントローラーの記述でviewへのアクセスは制御出来ている状態ですが、__管理者以外には非表示にしたい記述がある場合（ページ遷移リンク等）は__ 以下の条件文で挟むことで非表示することができます。

```erb:viewファイル
<% if user_signed_in? && current_user.email == ENV['ADMIN_EMAIL'] %>  
    #投稿ページへのリンクなど非表示にしたい内容
<% end %>
```

## おまけ

[Fly.io]( https://fly.io/ "Fly.io")でリリースして本番環境で動かない！
となった場合は以下記事を試してみてください。

https://qiita.com/00000000/items/013ce7cbac014e49b3c4

## 参考記事
https://pikawaka.com/rails/before_action

https://pikawaka.com/rails/dotenv-rails
Nuxt.jsの@nuxtjs/google-analyticsをGA4に移行してみた

Nuxt.js（2系）のプロジェクトで[@nuxtjs/google-analytics](https://github.com/nuxt-community/google-analytics-module)のモジュールを使って既存のGoogleAnalyticsを利用していました。
この度GA4に移行したので手順をメモして起きます。

## モジュールの変更
今まで使用していた`@nuxtjs/google-analytics`は削除します。

```
yarn remove @nuxtjs/google-analytics
```
新たに`@nuxtjs/google-gtag`を追加します。

```
yarn add @nuxtjs/google-gtag
```
https://www.npmjs.com/package/@nuxtjs/google-gtag

## nuxt.config.jsの変更
モジュールの変更に伴い`nuxt.config.js`の設定を変更します。

```js
  buildModules: [
    // '@nuxtjs/google-analytics',　消去
    '@nuxtjs/google-gtag' // 追加
  ],
```

```js
  /* 追加　*/
  'google-gtag': {
    id: process.env.GOOGLE_ANALYTICS_ID,
    debug: true
  },
  /*
  古いアナリティクスの設定の為消去
  publicRuntimeConfig: {
    googleAnalytics: {
      id: process.env.GOOGLE_ANALYTICS_ID
    }
  },
 */
```
idは環境変数で指定していますが、直接指定しても問題ありません。
オプションの項目などはドキュメントで説明があります。
https://www.npmjs.com/package/@nuxtjs/google-gtag

## GA4で確認する

![nuxt-ga4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/7ebb1de5-bc31-fed8-8a4f-f83f58168ed8.png)

GA4にアクセスしてデータ収集が有効となれば上手く設定できています。
GCPによるデータ分析入門

# 対象読者
* データ分析実務未経験者
* 大規模なデータに対して、保存、加工、読み取りまでを高速かつ無料で行いたい人
* 登録だけはしたけどどのように使用すればよいのか分からない人

# 本稿で学べること
* BigQueryの基本的な使用方法

# 今回の大まかな流れ
* BigQueryを活用する流れは下記の通りです
1. Cloud Strageの利用
1. BigQueryの利用
1. Colabでの読み取り
* 1でデータの保存、2でデータの加工、3でデータの分析となってます

# ①Google Cloud Strageの利用
## 1. プロジェクトの作成
* 兎にも角にもまずはプロジェクトを作成しましょう
## 2. バケットの作成
* データの一番上のフォルダみたいなもんです
* 設定は色々ありますが全てデフォルトでOK
## 3. フォルダ・ファイルのアップロード
* 手持ちのデータをアップロードできます。

ここまででCloud　Strageの操作は終了。次はBigQueryです。

# ②BigQueryの利用
## 1. SQLワークスペースの展開
* BigQueryを起動すれば勝手に開かれているので大丈夫です。

## 2. データの追加
* エクスプローラの右隣りに点が縦三つのアイコンをクリックすると「データの追加」と表示されるのでクリック
* ソースはGoogle Cloud Strageを選択し、ファイルを選択すれば、後はデータセット名とテーブル名を書いてスキーマを自動にすれば終わり。（新規は名前を書けば勝手に作成してくれる）

## 3. データの加工
* 今作成したテーブルを選択すると操作可能
* プレビューでデータの中身を確認出来、クエリでSQL文によるデータの加工が可能
* 一度書いたクエリは保存できます。
* 以下は私が使った超基本クエリです（※文中では*を使ってますが、使用データ量が増えるので控えましょう）（また、実務においてはデータの削除や変更は確認をとって慎重に行うか、そもそもやめましょう）
```
# 特定の行の確認
SELECT * FROM `データセット名.テーブル名`
WHERE 条件式

# カラム内のデータの種類を確認
SELECT DISTINCT 列名 FROM `データセット名.テーブル名`

# データの更新
UPDATE `データセット名.テーブル名`
SET 列名 = 更新内容
WHERE 列名 = 更新対象

# 行の削除
DELETE FROM `データセット名.テーブル名`
WHERE 列名 = 削除対象

# 列の削除
ALTER TABlE `データセット名.テーブル名` DROP COLUMN 削除する列名
```

以上がBigQueryの基本操作です。更新内容やデータは勝手に保存されるので安心です。
最後にこの加工したデータをGoogle Colabで読み取ります。

# Colabでの読み取り
## 1. アクセス権限の設定
* まず一番最初にアクセス権限を許可しておかなければなりません
* 「ナビゲーションメニュー」のIAMと管理をクリックし、アクセス権の付与をクリックしてください
* そして、プリンシパルに自分のアカウント（設定済み）、ロールに「BigQuery 読み取りセッション ユーザー」を設定してください

## 2. Colabを立ち上げ
* 次はColab上にてノートブックを新規作成してください

## 3. データの読み込み
* 最後にデータをBigQueryから読み込みます。以下はコードです。
```
# ユーザー認証
from google.colab import auth
auth.authenticate_user()

# データの読み込み
from google.cloud import bigquery
client = bigquery.Client(project='プロジェクトID')
query = "SELECT * FROM データセット名.テーブル名"
query_job = client.query(query)
results = query_job.to_dataframe()

# csvファイル化
results.to_csv('house_price_train.csv', index=False)

# csvファイルの読み込み
df = pd.read_csv('house_price_train.csv')
```
* 最終的にはColab上にCSVファイルを作成し、それを読み取っています。

# おわりに
* 以上がGCPによるデータ分析入門の流れでした
* 正直、kaggle等のコンペレベルのデータサイズであれば、全てColabやJupyter notebookで事足ります
* 何ならBigQueryは列名で日本語が使えないので、BigQueryでは英語で書き、Colabでは日本語に直してコンペのテストデータに合わせるなど非常にめんどくさく、モデルを作った後に列名に気づいた日にはもうお終いです（一敗）
* それでも、SQLを使う経験を増やしたり、大規模なデータを素早くいじりたい人にはオススメです。
UpperCamelCase -> lowerCamelCase


gsubがブロック受けれるの今更ながらに知ったのでメモ

```ruby
list = ['AlphaBeta', 'FooBar']
# => ["AlphaBeta", "FooBar"]

list.map { |item| item.gsub(/^[A-Z]/) { |i| i.downcase } }
# => ["alphaBeta", "fooBar"]
```
約４ヶ月のインターンで高専生が学んだこと

# はじめに
この記事は約４ヶ月インターンシップに参加した高専生が学んだこと、思ったことをありのままに書き連ねる記事です。
技術的なこと以外をできるだけ書きたいと思います。
駄文です。
# インターンの内容
社内のサービスやシステムを開発・運用している部署にお邪魔した。
web系の技術全般を扱っており、要件定義なども行う。フルスタックエンジニアに近い働き方になる部署だと感じた。
最初の３ヶ月は研修期間という位置付けて要件定義からコーディングまでの0→1の開発を体験できた。
開発環境：React, JS, Ruby on Rails, Material UI
# 学び
学びとなったことを書いていきます。見出しでそんなこと知ってますってなる人は読まなくていいです。
Qitaにはもっと有益な記事がいっぱいあります。
## コーディングには原則がある
これは学生には必読の内容だと思います。

学生エンジニアの諸君！！コードの書き方には原則があるんだ！しかもいっぱい！！多い！！！！！

短い時間での個人開発を余儀なくされていたあなた！（学校の課題とかで）
この原則知ってるかどうかでドヤ顔できます！（知らんけど）

この原則たちはコードの読みやすさの担保だったり、今後別の人はデバックしやすくなるために存在しています。
まあ、詳しい話は参考記事を貼っておくのでそれを読んでください。

原則か怪しいですが「リーダブルコード」っていう本がめっちゃためになりました。
変数名の付け方であったり、if文使うのか三項演算子使うのか、みたいな。
「こう書けよ」っていうより、「こう書くテクニックもあるよ！こう書くとわかりやすくなるかもね！」って感じで紹介している本だと思って読むといいと思います。

https://zenn.dev/koki_tech/articles/361bb8f2278764

https://qiita.com/yokarikeri/items/cbdef66fca460253cc7f

## 報連相は大事
これめっちゃ大事です。
学生の間って教授とかが怖くて相談できなかったり、質問しにいっても一蹴されて質問しにいく気が失せること、あると思います。
でも、インターンってそんなの通用しないです。

短い期間で課題をクリアしないといけなかったり、アピールしないといけなかったりするインターンで質問しないのって損の方がめっちゃ多いです。
だって、先輩の方が絶対知識深いし、トラブルシューティングもやってきてます。
自分が1時間悩んで解決するより先輩に質問して１５分で解決する方が楽です。（自分で悩んだ方がためになるってのもわかりますが...）

インターンっていろんな形があってアピールの場にもなると思います。
限られた期間の中で成果を出すためにも質問・相談をするのは大事です。

あと、質問の仕方っての気をつけましょう。５W１Hほどじゃなくてもいいけど
「やりたいこと、試したこと、今の問題点・悩みポイント」は最低限必要だと思います。
コーディングエラー的な内容ならエラー文も送りましょう。（コーディングエラーは検索したら結構出てくるけど）

https://qiita.com/syuta5825/items/1a853ae76dc55d5556b2

## 英語を恐れない
英語って嫌いですよね。私も嫌いです。
学校の授業では「English is 何」って感じです。

でも、嫌いと恐れないって別だと思うんですよ。

特にプログラミングなんて日本語より英語で調べたほうが情報は出てくるし、エラー文をコピペしただけなら出てくる情報はほとんど英語です。
たまにStackOverFlowを翻訳してますって感じのサイトが出てきますが、広告多いし、読みにくいしでもうだめ。

じゃあ嫌いなのにどうやって読むのってことですよね。参考になるかわかりませんが私の読み方を書いておきます。
1. 調べたいことを検索欄に日本語を入れずに検索する。
エラー文ならそれをそのままコピペ。
1. それっぽい記事を開き右クリック→日本語に翻訳
1. ふーんってなるまで繰り返す

これだけです。そうです。文明に頼ってください。わかりにくい文章になるならDeepLもあります。いろんなツールに頼りましょう。
それでもわからないなら先輩に頼りましょう。

最初はふーんってなるまで時間かかると思います。慣れてくると自分がふーんってなるハードルが下がってきます。それまで頑張りましょう。

## メモ＆タスク管理大事
知識を蓄えておくのって無理ですよね。（ポケモンの名前はいつまでも覚えているのに）
じゃあどうすんのっていうと、**自分の見やすい形で残しておくこと** が大事です。

私は先輩にお薦めしてもらったNotionを使ってます。
使いやすいし、書き方の自由度高いし、なんか色々できるしで最高。

あとは就活控えている人はQitaに記事書いておくってのもいいかも。アピールポイントになるし。
大した内容書けないから書かないって人は考えを改めましょう。

**まず、前提としてあなたの記事は誰も読みませんし、参考にしません。**

まあ、そんなことないと思いますが、本当に学びたい人は公式リファレンス等を読むはずです。
これくらいの気持ちで書けば楽だよって話です。

https://biz-notion.northsand.co.jp/understand/6-12-notion

# 最後に
駄文を最後まで読んでくれた方ありがとうございます。
本当はもっと学んだことはありますが、長すぎても微妙なのでこれくらいにしたいと思います。

ここまで読んでくれたということは優しい方だと思うので最後に私の言葉にしてしまったらダメかもしれない気持ちを書きたいと思います。

**「学生」だったり「新人」っていう立場を利用できる間はとことん利用して甘い蜜啜れ！！
その間はいくら失敗しても怒られないから！！
Try＆Error繰り返そうぜ！！**

学生生活がもう少しで終わる...
[Android]java.lang.IllegalArgumentException: Unable to create converter for class com.jp...のエラーの解決方法


## エラー：java.lang.IllegalArgumentException: Unable to create converter for class com.jp...

解決：**.addConverterFactory(GsonConverterFactory.create())** がないとだめ上記エラーが出る

```
 val retrofit = Retrofit.Builder().baseUrl("http://~~~~")
                               .addConverterFactory(GsonConverterFactory.create())
                               .build()
```

```
implementation( "com.squareup.retrofit2:converter-gson:2.3.0")
```
これを入れると **GsonConverterFactory**がimportできるようになる
[Android][compose]api取得でとりあえずUseCaseまで実装できたから通信確認したい

## とりあえずUseCaseまでできたから通信確認したい
Retrofit2とgsonを使います

```
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation( "com.squareup.retrofit2:converter-gson:2.3.0")
```

```
//どこかのView,Screenに以下を設定

val retrofit = Retrofit.Builder()
                       .baseUrl("http://~~~~")　   //通信先
                       .addConverterFactory(GsonConverterFactory.create())
                       .build()
val apiClient = xxxApiClient(retrofit)
val dataSource = xxxDataSource(apiClient)
val repository = xxxRepositoryImpl(dataSource)
val useCase = GetxxxUseCase(repository)
val coroutine = rememberCoroutineScope()

//Viewのどこかのtextなりにclickable{}を設定し以下を書くとかする。別にclickableじゃなくてもよい
coroutine.launch {
    useCase.execute()
}
```

AppInpectionの　Network Inspectorで見ましょう
![スクリーンショット 2023-02-10 16.18.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731109/e6252921-2607-882c-0371-1c32f6ef9155.png)


該当箇所をタップするなりするとinspectorに折れ線グラフが出てくるので、範囲を選択して中身を見ましょう。
EC2にS3をマウントする

#EC2にS3をマウントする
## 1. S3にバケットを作成
## 2. IAMでユーザー作成
1. AWSコンソールからIAMサービスへ移動
2. サイドバーにある「ユーザー」を選択後、「ユーザーを作成」で作成画面へ移動
3. 以下入力し次へ
    許可のオプション：ポリシーを直接アタッチする
    許可ポリシー：AmazonS3FullAccess
4. 許可ポリシーでAmazonS3FullAccessを選択
5. ユーザーを作成をクリック
6. 作成したユーザーをクリックし、セイキュリティ認証情報をクリック
7. アクセスキーを作成をクリック
8. 「AWS コンピューティングサービスで実行されるアプリケーション」を選択し次へ
9. 作成を完了をクリック
10. 表示された、アクセスキー、シークレットキーをメモしておく
## 3. s3fsのインストール
1. EC2へSSH接続し、各種インストール
```
$ sudo su -
$ yum -y install git automake gcc-c++ fuse fuse-devel libcurl-devel libxml2-devel openssl-devel
$ wget https://github.com/s3fs-fuse/s3fs-fuse/archive/v1.78.tar.gz
$ tar xzvf v1.78.tar.gz
$ rm -f v1.78.tar.gz
$ cd s3fs-fuse-1.78/
$ ./autogen.sh
$ ./configure prefix=/usr
$ make
$ make install
$ vim /etc/passwd-s3fs
$ chmod 600 /etc/passwd-s3fs
以下を記載
バケット名:アクセスキー:シークレットキー
```
## 4. マウント用ディレクトリを作成
1. EC2へSSH接続し、任意の場所へディレクトリを作成
```
$ mkdir xxxxxxx←任意のディレクトリ名
$ chmod -R 777 xxxxxxx
```
## 5. S3へマウントする
```
$ s3fs バケット名 マウント先ディレクトリ -o url=https://s3.amazonaws.com,allow_other
```
Cannot debug widget extension in Xcode 14.1

Xcode 14.1はWidgetをデバッグできないらしい。

## 解決方法
1.Select app scheme and run on iOS device (don't stop)
2.Select widget scheme and run on iOS (don't stop)
3.So both the targets are running at the same time
4.Select widget scheme then Debug > Attach to Process > Select your widget target name On device / simulator add widget

## 参考
https://stackoverflow.com/a/74145087/6593486
Excelの選択肢入力

1. 選択肢を列挙する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112363/f68435da-621b-b3b7-c5ad-d8a0e1c41f1d.png)
1. 選択肢入力を行いたいセルを選択する (複数でも可、選択肢列挙シートと別シートでも可)
1. Excel上部の「データ」メニューの「データの入力規則」をクリック
1. 「設定」タブの「入力値の種類」で「リスト」を選ぶ
1. 「元の値」をクリックし、選択肢列挙部分のセルを選択する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112363/63dfe21a-ffca-7616-71f4-05ca043b9cdd.png)
1. 「OK」クリック
1. 選択肢入力ができるようになる
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112363/4f51ce42-7a10-57b6-b3d1-581649a78b10.png)
SharePointFrameworkの理解を深める04(DockerなしSPFx開発環境構築)


:::note warn
2022年2月に書いた記事を備忘録でアップしてます
SharePointFramework1.13を使ってます。
結論Docker上の開発環境だとうまくいかず
https://qiita.com/C_pnpc/items/0f731e3b3fa0e571ac2c
結局ローカルPCに環境構築して、やっとうまくいきました。(本記事)
:::

環境はwin11PCです。
手順はMSの記事といつもの及川さんの記事を参考にしてます。

今回手順がいつも以上に簡素です。。

# 1.node.jsインストール
>参考手順

https://docs.microsoft.com/ja-jp/sharepoint/dev/spfx/set-up-your-development-environment#trusting-the-self-signed-developer-certificate

https://nodejs.org/download/release/v14.15.5/
ここのnode-v14.15.5-x64.msiをダウンロードじ、実行

# 2.コマンドプロンプトを管理者で起動

# 3.gulpインストール
npm install gulp-cli --global
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/4176356a-c2c8-c583-a60c-0fd932766776.png)

# 4.インストール後の確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/3d301f54-2aef-3e4e-357f-1444ba5671f4.png)

# 5.yoインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/3d00559d-f8a0-9e2f-0414-edac92b557ea.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/652eba94-2faf-8037-14e1-1b4ec042b45e.png)

# 6.ジェネレーターインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/92b4b75b-1ed9-7a9c-00ad-a7adc4844d2d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/95b1d59e-5d6a-32c7-4f41-fb799d51b1be.png)

>ここから以下参考

https://docs.microsoft.com/ja-jp/sharepoint/dev/spfx/web-parts/get-started/build-a-hello-world-web-part

# 7.プロジェクトフォルダ作成、移動
cd C:\Workspaces\HelloWorld

# 8.プロジェクト作成
設定はほぼデフォルト
yo @microsoft/sharepoint

# 9.証明書の発行
以下黄色字のところで、認証のポップアップがでるので、OKをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/33b98559-bd23-4d0e-246a-7420e97ddc5b.png)

# 10.VSCodeを起動し、上部設定バーの「ファイル」＞「フォルダを開く」からプロジェクトフォルダを開く。

# 11.プロジェクトのホストされたワークベンチの URL を自身のSPOサイトのものに更新する
 ./config/serve.jsonと./vscode/launch.jsonのURLを修正
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/204f8670-bb15-b177-546d-cacbdba89419.png)

# 12.「ターミナル」＞「新しいターミナル」でターミナルを開く

# 13.gulpサーバーを起動する
gulp serve --nobrowser
→権限のエラーが発生
![pic1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/5d8c31be-d8f4-a3e8-edf6-6663d1fd6e81.png)


# 14.PowerShell の実行ポリシーを変更する
＞https://go.microsoft.com/fwlink/?LinkID=135170
Get-ExecutionPolicy -List
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Get-ExecutionPolicy -List

# 15.もう一度gulpサーバーを起動する
gulp serve
※gulp serve --nobrowserの場合は以下からブラウザ起動
(./vscode/launch.jsonに記載したURL)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/d92036e5-67bc-7943-df2e-9163b0f93681.png)

# 16.MS365アカウントの認証画面が表示されるので、SPOサイトにログインできるアカウントでログイン


# 17.ブラウザが起動し、なんやらかんやらでうまくいく
画像が残ってないですが、SPOサイトでうまくアプリ表示できましたTT

# さいごに
「SharePointFrameworkの理解を深める」シリーズいったんここまでです。
ありがとうございました。
ServerlessでのCloudFrontデプロイ、RegionalDomainNameにすると早くなった

## 概要
serverless.ymlにCloudFrontデプロイの記述をしてデプロイした際に、デプロイが中々終わらずにブラウザからアクセスが出来なかった。
翌日になって確認してみるとアクセス出来るようになっていて、社内の有識者に相談したところ解決策を教えてもらったので記録を残す。

## 結果
調べると、serverless.yml ⇒ CloudFrontのDistributionConfig ⇒ DomainNameのところを`RegionalDomainName`とすると、デプロイ実行から数分でアクセスできるようになった。
`DomainName`と書いてデプロイすると時間がかかるようだ。

```diff_yaml
-DomainName: !GetAtt AssetsBucket.DomainName
↓
+DomainName: !GetAtt AssetsBucket.RegionalDomainName
```

## 説明
`Regional`を付けると、立てようとしているリージョンの中からドメインネームを探すから早い、`Regional`を付けていない書き方だと全てのリージョンからそのドメインネームを探して処理をしようとするから時間がかかる、などがあるらしい。
`DomainName`の書き方⇒数時間
`RegionalDomainName`の書き方⇒数分

以上
（間違い等ありましたらご教示いただけますと幸いですm(__)m）
[Rails]アプリケーション作成、サーバー立ち上げる

## はじめに
Ruby on Railsで新規アプリケーションを作成して表示してみる


## Railsの雛形を作成する
- 新規で作成する際は↓
（アプリケーションの基本形が作成される）

```rb
username:~/environment $ rails new アプリケーション名
```
- アプリケーションを削除する際は↓
 (ファイルやフォルダを削除するコマンド)

```rb
username:~/environment $ rm -rf アプリケーション名
```

## サーバーを立ち上げる流れ

- 最初に自分のアプリケーションに移動する
 cdコマンドで移動↓

```rb
username:~/environment $ cd アプリケーション名
```
移動してパス表記が変わるのを確認↓
```rb
username:~/environment/アプリケーション名 $
```

- サーバーを立ち上げる
　　＄ rails　s　の 　"s"　は"server"の略↓

```rb
username:~/environment $ rails s
```

- config(設定)フォルダの中のenvironments(環境)フォルダに記述
　エラーメッセージの通りに、記述をコピーしてdevelopment.rbの中に貼り付けを行う

- サーバーを一旦停止してからサーバーを起動
 このような画面になれば成功！↓
　![rails.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600110/dd81d5c9-2179-48a3-050e-33bf2fdf56b5.png)


##### チーム開発等で他人と共同開発をする場合
- development.rbから先ほどエラー文からコピーしたやつではなくこちらを使う
　（これを使うとどんなホストからでもアクセス可能）↓
```rb 
(省略)
:
:
config.hosts.clear
end
```


## まとめ
新しいアプリケーションを作ろうとするときに、いつも調べてしまうのでアウトプットしました。
ありそうでなさそうで探せばある,論理回路を四則演算のみで考える

>テストでよくある,「回路の真理値表を作成せよ」の問題を,数式だけでできないかと考えたのでその結果を書きます。しかしどうにも先駆者がいそう\...

## 基本公式
~~~math
OR(a,b)=a+b-ab\\
AND(a,b)=ab\\
XOR(a,b)=(a-b)^2\\
NOT(a)=1-a
~~~
以上が論理回路を解くうえで基本となる,言うなれば公式です.
また,定理として
~~~math
(n\in\mathbb{N})で,\\
a^n=a,~~(1-a)^n=1-a\\
a(1-a)=0
~~~
も使う場面があるので覚えておくと役に立ちます.

## 例題
以下の問題は,基本情報技術者平成21年春期から引用しました.
[問題引用元](https://www.fe-siken.com/kakomon/21_haru/q24.html)

![2023-02-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2407478/064afc6c-68d0-2ed7-1042-72d9ce590ed8.png)

先ほどの式たちを使うと,(見やすさのため小文字にします)
~~~math
X=OR(AND(a,b),NOT(b))\\
=OR(ab,(1-b))\\
=ab+(1-b)-ab(1-b)\\
=1-b+ab^2\\
=1-b+ab\\
=1-b(1-a)
~~~
となるので,真理値表は以下の通りになる.
| A | B | X |
|:-:|:-:|:-:|
| 0 | 0 | 1 |
| 1 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 1 | 1 |

このような簡単な回路なら,「普通に真理値表描いた方が早くね?」と感じざるを得ないですが,もっと複雑な回路でも論理的に解くことが可能です.
使う機会があるかはわかりませんが...
AccessのVBAでレポートを部数指定で印刷

# やり方

```DoCmd.PrintOut``` の第五引数で部数指定で印刷可。

ただし ```DoCmd.PrintOut``` はフォームやデータシートを印刷する場合にも使える。
（使えてしまう）

なので直前にレポートを開いておく必要あり。

```vb:サンプルコード
Const REPORT_NAME As String = "テストレポート"

'レポート開く
DoCmd.OpenReport REPORT_NAME, acViewPreview

'3部印刷
DoCmd.PrintOut , , , , 3

'レポート閉じる
DoCmd.Close acReport, REPORT_NAME
```

# 参考サイトさん

https://tsware.jp/tips/tips_395.htm

https://learn.microsoft.com/ja-jp/office/vba/api/access.docmd.printout

# バージョン

Windows 10 Pro 22H2 OSビルド 19045.2546
Microsoft Access for Microsoft 365 MSO (バージョン 2212 ビルド 16.0.16026.20002) 32 ビット
WindowsをHDDからSSDに移行する際のエラーと対策

# はじめに
- **以下の記事は参考程度にして、自己責任で作業をしてください。**
- HDDからSSDに移行するとする。
## 1. 書き込みができる状態でシャットダウン
1. Windowsが起動した状態でSHIFTキーを押してシャットダウンする。（シャットダウンしていますという青い画面が出たらキーを放してよい）。この作業には時間がかかります。

## 2. Gparted Liveの起動
1. Gparted Liveの入ったUSBドライブを用意しているので、それを差して起動する。起動したらF2キーを連打し、UEFI(or bios)画面が開くようにする。
2. UEFI(or bios)画面が起動したら以下の設定をする
3. NVME SSDへ移行する場合はストレージのモードをRAIDからAHCIにする。
4. セキュアブートをオフにする。これをしないとGparted Liveが起動しない
5. bootシーケンス上でUSB上のOSを一番上に持って行ってApplyしてExit。
6. Gparted Live画面が出てGUIウィンドウがしばらくすると開く。
7. 上から3つ目のオプションを選ぶ (Large font and load to RAM)
    7. RAM上へのOSのロードが終わったらUSBを抜いてもよい
8. 次の画面3つにつき、エンターを押す
    1. OKを選択する画面が出たら、TabキーでOKを選択しENTERを押す。
9. しばらくするとGpartedの画面が開く

## 3. SSDのフォーマット
1. 以下の操作はGpartedで行う
2. SSDを選び、Create New Partition Tableでgptを選ぶ
    1. 古いPCでLegacy Biosしかサポートしていない場合はmsdosを選ぶ

## 4. パーティションの移行
1. HDDの容量＞SSDの容量なら、SSDの容量に収まるようにCドライブのパーティションを縮小する
4. HDDのすべてのパーティションを順番通りにSSDにコピー&ペーストする
    4. Microsoft Reserved Partitionはコピーできないのでフォーマットしていないパーティションを作製するだけで十分
5. 実行ボタンを押すと実際の書き込みが始まる
6. 終わったら各パーティションをコピー元と同じFLAGにする
    1. HDDがmsdosでSSDもmsdosの場合は同じFLAGにする
    2. HDDがmsdosでSSDがgptの場合は
        1. ブート用のパーティションを700MBのfat32でフォーマットし、ESPというラベルを付け、boot,espのFLAGをつける
        2. システムのパーティションのFLAGはmsftdataのままにする
        3. 100MBのntfsパーティションを作り、FLAGはmsftresにする
        4. 回復パーティションのFLAGはhidden,diagにする
    3. HDDがgptでSSDもgptの場合は同じFLAGにする
7. 終わったらシャットダウンする

## 5. ブート用のファイルの修正
1. このまま起動するとブルースクリーンになるため、ブート用のファイルを修正する
1. Ventoy上にWindows 10 install ISOを入れる。
2. Ventoy USBを指して起動して、F2キーを連打する
3. bootシーケンスではUSBを選択する
4. Devicesで使用するSATAデバイスが選べる場合はHDDのチェックを外す
    3. もし選べない場合はシャットダウンして放電してHDDを抜いた後、1から実行する
5. Exit
6. Ventoy USBを起動して、Windows１０を選んでエンターを押す
7. 言語を選んで次にを押す
8. 左下の「このコンピューターを修復する」を押す
9. トラブルシューティング＞コマンドプロンプトをおす
10. 以下のコマンドを実行
```dosbatch
diskpart
lis dis
sel dis [?] (SSDの容量と同じ番号を選ぶ)
lis vol
sel vol [?] (ブートパーティションの番号を選ぶ: ESPと書いてあることが多い)
assign letter K
sel vol [?] (システムパーティションの番号を選ぶ: OSと書いてあることが多い。容量が大きいはず)
assign letter C
exit
```
ドライブ名が使わている場合は、使われているもののドライブ名を変更し、再度試す。

11. 以下のコマンドを実行
- HDDがgptでSSDもgptの場合は以下のコマンドを実行
    - HDDがmsdosでSSDがgptの場合は`k:\efi\microsoft\boot`フォルダを作る
```
cd /d k:\efi\microsoft\boot
bcdboot C:\Windows /l ja-JP /s K: /f UEFI
bcdedit
```
- HDDがmsdosでSSDもmsdosの場合は以下のコマンドを実行
```
bootrec /fixmbr
cd /d k:\boot
bcdboot C:\Windows /l ja-JP /s K: /f BIOS
bcdedit
```
- エラーが出なかったら成功(エラーが出ても成功することがある)
12. exitし、USBを抜いた後起動してWindowsが正常に起動すれば成功
13. ブルースクリーンになった場合起動オプションからセーフモード(4番)で起動してみる
    13. 起動できたら再起動をする

## 6. HDDをデータ用のドライブにする
14. GpartedでHDDのパーティションを消し、一つの大きなNTFSパーティションを作る。データ用のパーティションとして使うことができる。
    14. これを行う場合はUEFI(or bios)上で先ほどのHDDの無効化を戻す。
Nuxt.js(Nuxt3)で tourguide-js（サイトツアーを行うライブラリ）を使う方法

# Nuxt.js(Nuxt3）でサイトツアー機能を利用する方法について

- 今回は以下の環境で作業を実施
    - Nuxt.jsバージョン：3.0.0
    - tourguide-jsバージョン：0.0.7

- セットアップ方法
    - npm i @sjmc11/tourguidejs

- コーディング例
    ```
    <template>
        <div data-tg-tour="hogehoge"></div>
    </template>

    <script setup>
    import "@sjmc11/tourguidejs/src/scss/tour.scss"
    import {TourGuideClient} from "@sjmc11/tourguidejs/src/Tour"
    
    onMounted(()=>{
      const tg = new TourGuideClient();
      tg.start()    
    })
    </script>
    ```

### 参考
- https://zenn.dev/yuta_enginner/articles/0051a0b9ec7484
- https://github.com/sjmc11/tourguide-js
Map.Entry interface

Entry interface is innner interface of Map interface
Entry is key + value .
```java
public class Outer {
    public static void main(String args[]) {
        Map<String,Integer> mp = new LinkedHashMap<>();
        Entry<String,Integer> e = entry("sato-a",100);
        Entry<String,Integer> e1 = entry("sato-b",101);
        Entry<String,Integer> e2 = entry("sato-c",102);
        mp = Map.ofEntries(e,e1,e2);
        Set<Entry<String,Integer>> s = mp.entrySet();
        mp.entrySet().forEach((Entry<String,Integer> x) -> System.out.println(x.getKey() + ":" + x.getValue()));
        System.out.println("--------------------");
        for(Entry<String,Integer> en:s) {
            System.out.println(en.getKey() + ":" + en.getValue());
        }
    }
}
```
```
sato-a:100
sato-b:101
sato-c:102
--------------------
sato-a:100
sato-b:101
sato-c:102
```
C#/VB.NET ExcelをPDFに変換する

ExcelとPDFは非常に実用的な文書フォーマットです。ExcelをPDFに変換する必要があったので、いくつかの製品を試した後、最後に[Free Spire.XLS for .NET](https://jp.e-iceblue.com/introduce/free-spire-excel-for-net.html)を選択しました。だから皆さんに方法を共有したいと思います。簡単なフォーマットの変換でも、アプリケーションの開発でも、お役に立てれば幸いです。次に、操作手順と関連コードを示します。
## Free Spire.XLS for .NETをインストールする
### 方法1：[NuGet](https://www.nuget.org/packages/FreeSpire.XLS)を介してFree Spire.XLS for .NETをインストールする
「ツール」>「NuGetパッケージマネージャ」>「パッケージマネージャコンソール」の順に選択し、次のコマンドを実行します。
PM> Install-Package FreeSpire.XLS
### 方法2：プログラムに手動でSpire.xls.dllファイルを導入する
[Free Spire.XLS for .NET](https://jp.e-iceblue.com/download/free-spire-excel-for-net.html)をローカルにダウンロードし、解凍してインストールします。インストールが完了したら、Visual Studioを開いて新しいプロジェクトを作成し、右側のソリューションエクスプローラで「参照」を右クリックし、「参照を追加」>「参照」を選択して、インストールパスの下のBINフォルダのdllファイルを見つけ、「OK」をクリックして、プログラムに参照を追加します。
## ExcelをPDFに変換する
* Workbook オブジェクトを作成します。
* Workbook.LoadFromFile() メソッドを使用してサンプル Excel ドキュメントをロードします。
* ConverterSetting クラスのプロパティを使用して、Excel から PDF への変換オプションを設定します。
* Workbook.SaveToFile() メソッドを使用して Excel ドキュメント全体を PDF に変換します。

C#:
```C#
using Spire.Xls;

namespace ConvertExcelToPDF
{
    class Program
    {
        static void Main(string[] args)
        {
            //Workbookインスタンスを作成する
            Workbook workbook = new Workbook();

            //サンプルExcel文書をロードする
            workbook.LoadFromFile("C: \\Users\\Administrator\\Desktop\\Sample.xlsx");

            //変換時にページに合うようにワークシートを設定する
            workbook.ConverterSetting.SheetFitToPage = true;

            //PDFに保存する
            workbook.SaveToFile("ExcelToPdf.pdf", FileFormat.PDF);
        }
    }
}
```
VB.NET
```vb
Imports Spire.Xls
 
Namespace ConvertExcelToPDF
    Class Program
        Shared  Sub Main(ByVal args() As String)
            'Workbookインスタンスを作成する
            Dim workbook As Workbook =  New Workbook() 
 
            'サンプルExcel文書をロードする
            workbook.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Sample.xlsx")
 
            '変換時にページに合うようにワークシートを設定する
            workbook.ConverterSetting.SheetFitToPage = True
 
            'PDFに保存する
            workbook.SaveToFile("ExcelToPdf.pdf", FileFormat.PDF)
        End Sub
    End Class
End Namespace
```
![2023-02-10_140541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/c00f2841-208b-ddd3-a89e-d4b69e024e36.png)
waifu2xを用いて、ディレクトリ内部の画像ファイルを自動で高画質化する

Date: 2023年2月10日

## 目次

1. waifu2xの紹介
2. waifu2xのインストール
3. シェルスクリプト

# waifu2x

　waifu2xは、画像を高画質化できるツールです。以下のリンクから、ブラウザ版が試せます。

[waifu2x](https://waifu2x.udp.jp/)

gitに、公開されています。

[GitHub - imxieyi/waifu2x-mac: Waifu2x-ios port to macOS, still in Core ML and Metal](https://github.com/imxieyi/waifu2x-mac)

# aifu2xのインストール

　私の環境はMacOSですので、brewを使ってインストールします。

```bash
brew install waifu2x
```

# シェルスクリプト

まとめて処理したい画像のあるディレクトリに移動します。

.shファイルを作成します。

```bash
cd /処理したい画像のあるディレクトリ/
touch Batch.sh
```

以下のコードをBatch.shにコピーします。

```bash
#!/bin/sh

dir_path=$(cd $(dirname $0);pwd)
dirs=`find $dir_path -name "*.png" -o -name "*.jpg"`
for dir in $dirs;
do
  n=$(basename $dir)
  echo $n | sed 's/\.[^\.]*$//'
  waifu2x --scale 2 --noise 4 -i $dir -o $(echo $n | sed 's/\.[^\.]*$//')_hq.png
done
```

このままでは、権限がなく、実行できません。chmodで、Batch.shの権限を変更します。

```bash
sudo chmod 744 Batch.sh
```

Batch.shを実行します。

```bash
./Batch.sh
```

「既存のファイル名 + _hq.png」という名前の画像ファイルが生成されます。

## 筆者の動作環境

- M1 MacBook Air
- MacOS 13.1 (22C65)
SharePointFrameworkの理解を深める02(構築続きとプロジェクトの作成)

:::note warn
2022年2月に書いた記事を備忘録でアップしてます
SharePointFramework1.13を使ってます。
結論Docker上の開発環境だとうまくいかず、、
https://qiita.com/C_pnpc/items/0f731e3b3fa0e571ac2c
私の場合、ローカルに構築しなおしてでうまくいきました。
:::

以下の記事の続きです

https://qiita.com/C_pnpc/items/efa99ab95543ce7a4bc3

本記事はこちらを真似して構築しています

>SharePoint Framework 開発入門 まとめ
https://sharepoint.orivers.jp/sharepoint-framework-dev
※2021年の情報を参考にしてましたが、2022年に更新されているようです。

前回構築時にすっこぬけてた下記記事の手順をおこないます。
>開発環境を構築するためにホストとなる PC で行う手順
https://sharepoint.orivers.jp/article/9954

## Dockerの設定
[Settings]メニューの[Shared Drives]タブがない。

>https://teratail.com/questions/266900
WSL と Docker Desktop が機能統合されています。
その状態であれば、Resoruces の項目で「SHARED DREIVES」そのものが出ません。そのまま docker run -v /c/xxx:/share ... などとすると、C ドライブをマウントできます。

表示されないみたいなので、スキップします

## Visual Studio Code Debugger for Chrome のインストール

## SharePointPnPPowerShellOnline のインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/80141800-8cf7-2064-e54d-d86d5a33047c.png)
はい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/c752ff48-549e-a9b9-2789-a57b476084f0.png)
すべて実行

# Docker コンテナの起動、停止確認
>https://sharepoint.orivers.jp/article/9965

PowerShellで下記実行
docker run -it --rm --name Sample -v C:\work:/usr/app/spfx -p 4321:4321 -p 5432:5432 -p 35729:35729 orivers/spfx:1.9.1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/70c3fedf-dc3d-85eb-d9e5-fed524a9f6d2.png)

数分かかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/eb987852-148f-70ca-7314-196133b44e23.png)

許可

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/f5b15cdb-663c-3e67-5bcc-b4b8b469189b.png)

無事起動できたみたい

# SharePoint Framework Web パーツ開発 その１：プロジェクトの作成
>参考
https://sharepoint.orivers.jp/article/10111

## 2. プロジェクトフォルダの作成
C:\Workspaces\LinkListWebPart

## VSCでプロジェクトフォルダをひらく
ファイル＞フォルダを開くで上記フォルダを選択

## Dockerコンテナを起動
ウェルカムページが出てくるので×で閉じる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/70188e2e-8108-b018-d048-c850c1b24625.png)

ctr@
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/b616dc1f-1b56-0033-a925-44d936a4fa8d.png)

ターミナルが出てくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/c1915938-f6aa-058b-ad9a-add58d92d2f9.png)

下記を実行
docker run -it --rm --name LinkListWebPart -v ${PWD}:/usr/app/spfx -p 4321:4321 -p 5432:5432 -p 35729:35729 orivers/spfx:1.9.1

orivers/spfx:1.9.1はDokerhubからダウンロードしてきたファイル名固定値

ポートがすでにつかわれている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/7044c5d5-253b-338f-15d8-01d5ac73a5b9.png)

さっきのPowerShellでテスト起動したコンソールがまだ残っていたのでexitで閉じる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1429640/90d94507-8958-6cbc-adbf-0a3cc512dffe.png)

まだエラーが残る
下記参考にdocker network prune実行。まだエラーが残るのでPC再起動
>https://teratail.com/questions/326510

きょうはここまで
Oracle Analytics Cloud：エンタープライズ・セマンティック・モデルとセルフサービス・データセット

はじめに
---
Oracle Analytics CloudはたまったデータをみるためのBIツールです。
たまったデータをみるときの手順は、
１.データが入っているデータソースへの接続を作成し、対象のデータ、たとえばデータベースの表を選んだりして、アクセスするための手筈をととのえる
２.手筈をととのえたデータをみる。表形式やピボット形式で集計したり、棒、円、折れ線グラフ、散布図などで、パッと見でどうなってるかわかりやすく加工する。
です。

OACでは、１．に対して２つのアプローチ、セルフサービス・データセットとエンタープライズ・セマンティック・モデルが利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/814a81c0-6b20-9545-5d99-7e30a8589c9b.png)

記事記載時のOAC ver：Jan 2023 Update

エンタープライズ・セマンティック・モデルとセルフサービス・データセット
---
##### セルフサービス・データセット
セルフサービス・データセットはその名のとおり、OACの利用ユーザーが自分で対象のデータをセットします。OACの利用ユーザーは、データセットを複数作成できます。
OACをつかって、てっとりばやく、簡単にやってみるのなら、セルフサービス・データセットがおすすめです。セルフサービス・データセットはData VisualizationのDataset Editorで作成、編集します。
<img width="400" alt="{a68253f4-9e2a-e749-876c-81feafc941b0}.tmp.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/a68253f4-9e2a-e749-876c-81feafc941b0.png"/>

##### エンタープライズ・セマンティック・モデル
エンタープライズ・セマンティック・モデルは、OACインスタンスに1つです。主に情報システム部門がエンタープライズ・セマンティック・モデルを構築します。サブジェクト領域を複数作成し、アクセスできるデータに統制をかけ、Data VisualizationやAnswersを利用するユーザーに公開します。
例えば、
・データベースに直接アクセスさせたくない、英語名の表、列名だとわからない。とOAC利用ユーザーに言われるといった場合
・複数部門での利用もしくは人数が数百を超える利用を想定している場合
・セキュリティの要件が想定される場合、行列のアクセス制御、このデータはA部門には見せていいけど、B部門には見せたくない場合
こういった場合は、エンタープライズ・セマンティック・モデルがおすすめです
エンタープライズ・セマンティック・モデルは、Model Administration Toolで作成、編集します。Model Administration ToolはOracle Analytics Client ToolsをPCにインストールすると利用できます。
<img width="400" alt="{fb07fec8-1eb4-a74e-7181-de5043a71ff6}.tmp.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/fb07fec8-1eb4-a74e-7181-de5043a71ff6.png"/>

PCにインストールしたModel Administration ToolからOACにクラウド接続し、セマンティック・モデルをModel Administration Toolに読み込みます。PC上で編集後に保存、OACに反映するためにModel Administration Toolから公開というメニューを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/aff59c0c-00e1-e22e-47ba-e11bfd600767.png)


OACのJan 2023 Update版では、セマンティック・モデラーという機能がプレビュー版として提供されています。Model Administration Toolの代わりにWeb UIのセマンティック・モデラーを利用して、エンタープライズ・セマンティック・モデルを作成、編集できます。
<img width="400" alt="{}.tmp.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/33f4d9e5-60ea-3e8b-0171-27c6951d87b9.png"/>

OACのサービスを作成するときにProfessionalかEnterpriseのEditionを選びますが、
Professional Editionは、セルフサービス・データセットをつかえます。Enteprise Editionは、エンタープライズ・セマンティック・モデルとセルフサービス・データセットの両方をつかえます。

以上
GIGAスクール端末でどこまで開発環境が整えられるか(windows編)

chromebook編は[こちら](https://qiita.com/harryp0tterK/items/8ff14cdb1218cd2c97a6)

## はじめに
chromebook編が好評だったので、windows編も書くことにしました。
GIGAスクール端末で使われているほとんどが、chromebook,windows,ipadですが、ipadに関してはアプリのインストールが自由にできないので（特に小学校）、chromebookとできることはほぼ同じだと思います。なので、ipadを使っている方はchromebook編をお読みください。
また、この記事で紹介する端末は、僕の学校で壊れたときの予備端末として使われているものなので、実際に他の学校で使われているのは、それと同等かそれ以下だと思います。参考程度に思ってください。

## 端末スペック
型番がわからないのですが、たぶん富士通だったと思います。
cpu:i3-7100u,RAM4GB,ROM:128GBだった気がする。

## 前提条件
・管理者権限がない→インストーラーがあるソフトは入れられない
・この端末のみ配布される→usbブートとかはだめです。rufusなどのソフトも管理者権限いるので。
外部の端末を使うものはこの記事では扱いません。
・たぶんWindows Enterprise(学校にあった端末はそうでした）

管理者権限がないとwindowsの意味がないぐらい何も出来ないです。今どきインストーラーなしで入れられるソフトは少ないので厳しいですね（Aviutlとかは入れられましたが、プログラミング関係ではないですね）。当然、WSLなども無理です。
windows Enterpriseなのも問題です。OSの更新がないせいで（うちの学校はそうです）、新しいバージョンの言語が使えない、つまりソフトが実行できないものがあります（YMM4などはそうでした）。

## おすすめツール
よくよく考えたらソフト（SDK含め）なしで実行できる言語は少ないです。そのなかでも多分できる物を選びました。

**コマンドプロンプト**
言う必要がないぐらい定番ですね。まずはこれからプログラミングを初めたという人はいるのではないでしょうか？
実行できるのはパッチファイルやC#ですかね。ただ、GUIソフトとかは作れないのでご注意を。

**Office**
Officeは結構な確率で最初から入っているのではないでしょうか。じゃないとwindowsの意味がな(ry
OfficeといったらVBAですよね。VBAは割と遊べるし、Officeだけでソフトも作れちゃうのでコマンドプロンプトよりはマシだと思いますよ。ただ、スプレッドシートとかで使えるGASのほうが実用性は高いと思います。
ただし、Officeが入っていること前提ですが。

## 終わりに
え、これで終わり？
そのとおりです。管理者権限がないとこんなにもできることが限られるんですね。ブラウザで出来なくてwindowsでできるのはこれぐらいしか思いつきませんでした。
ということは、コスト的にもいいのはchromebookってことになりますね。
また思いつけば追加していきます。

### 余談
biosロックがかかっていても大体のPCはマスターパスワードを使って解除できます（「メーカー名　biosロック　解除」で大体でてきます）。この記事の趣旨とは外れてしまうのでここでは書きませんが、もし、手元にブータブルメデイアをつくれる端末があれば、Ubuntuなどを入れて試してみては？
「フルスタック文化の組織について語り尽くす」

https://connpass.com/event/274809/
![event_qa_sre.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849032/72b97028-50c1-ae2c-6d30-39f5b4249e74.png)

### イベント概要
- 「いちエンジニアとしてはある程度1人前になったが、この後のキャリアが見えない、さらに活躍の 幅を広げたい」と考える人は多いのではないでしょうか。
- もちろん現実問題として、そうなる為には相当の努力も必要ですが、「どこで働くか」でも大きく変わっていきます。
- 今回は、業界も解決したい課題も全く異なる3 社（Voicy、レイヤード、Skillnote）が、共通して大 事にしている 「フルスタック」志向を大事にする文化をテーマに、重視していることや課題感などに ついて各責任ポジション同士で語り尽くします。

### イベントの対象者
- テーマに興味があるエンジニア、EM
- すぐに転職を考えているわけではないが、情報収集を始めている方
- 転職を検討している方 上記以外でもお気軽にご参加ください。

### ▼イベント詳細
- 会場：オンライン／Zoom
- 日時：2 月21 日(火) 19 時00 分〜20 時00 分
- 参加人数：50 人まで
- 参加費：無料

### ▼タイムテーブル 時間 内容
- 時間	内容
19:00~19:10	オープニング/会社紹介
19:10～19:45	＊現状の組織構成
＊ぶっちゃけ話～各社の課題
＊カルチャー面で自社の良い点、工夫している点
＊今後実現していきたい未来
19:45～20:00	視聴者からの質問回答
※終了時刻は変動する場合がございます ※アジェンダは変更になる可能性があります。

### ▼登壇者
- ①株式会社Skillnote VPoE　安藤大輔
経歴：東京理科大学大学院卒業後、独立系のSIer にて、公共事業系ネットワーク管理システム等の開 発に携わった後、アカデミック領域のベンチャー企業にて国産検索エンジンの研究サポート領域等の プロジェクトマネジメントを経験。その後自社サービスを展開する事業会社に入社し、CtoC モデル のEC サイト運営等に従事。さまざまな領域、役割の開発業務を経験した後、2018 年、製造業向けス キルマネジメントシステム「Skillnote」のリードエンジニアとしてSkillnote に参画。現在はVPoE として開発業務全般を管掌。

- ②株式会社レイヤード CTO　二階義元
経歴：大学卒業後2005 年にマイクロ・シー・エー・デー（現フューチャーアーキテクトに吸収合 併）入社、情報アーキテクチャ室室長代理として主力製品の開発、導入からサポートまで全工程を経 験。2017 年レイヤードに入社しWeb 問診Symview をリリース。現在はCTO として各種プロダク トの開発方針策定やエンジニア組織のグロースに注力。

- ③株式会社Voicy 技術部門責任者　山元 亮典
経歴：学生時代から複数の企業で、iOSアプリやサーバーサイド、ハードウェアの開発に従事。2017年ヤフー株式会社に入社し、サーバーサイドエンジニアとしてヤフー検索のバックエンドをフルスクラッチで開発。当時ハッカソンにて音声アプリの開発をしており、音声とテックのかけ合わせで可能性の広がりを感じたことから、2019年Voicyに入社。現在、エンジニアリングマネージャーとしてエンジニア組織とデータ組織全体を統括。

### ▼イベントで得られること
フルスタック組織の特徴
SRE、QASET など横断的な役割やフルスタックエンジニアになる為の思考やスキル

### ▼ソーシャル
発表内容はブログ・ツイッター等で発信OK です！

### ▼視聴方法
・前日にURL を共有します。
matplotlib の legend 位置のチートシート

![legend.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84885/61ef18a8-6a06-2d93-060c-eb92b1383b5c.png)

もうかれこれ人生の内１ヶ月ぐらいは「matplotlib legend」とググっている気がするので。
これで pandas でも seaborn でもイケる筈。

老婆心。
```python
import matplotlib.pyplot as plt
```
VSCodeでJupyter Notebook が動かない

著者は普段 VSCode で Jupyter Notebook を使っているのですが，ある日突然使えなくなったので，その時の解決法を残しておきます．

### エラー内容
Jupyter Notebook 上でプログラムを実行すると以下のようにエラーがはかれました．


```
出力が サイズ制限 を超えています。テキスト エディターで完全な出力データ を開く
カーネルを起動できませんでした。 

Jupyter server crashed. Unable to connect. 

Error code from Jupyter: 1

usage: jupyter.py [-h] [--version] [--config-dir] [--data-dir] [--runtime-dir]

                  [--paths] [--json] [--debug]

                  [subcommand]



Jupyter: Interactive Computing



positional arguments:

  subcommand     the subcommand to launch



options:
...


Jupyter command `jupyter-notebook` not found. 

詳細については、Jupyter [ログ] (command:jupyter.viewOutput) を参照してください。
```

### 解決方法
どうやら Python の Jupyter ライブラリと Notebook ライブラリが一緒に存在していたのが悪さをしていたようです．というのも，jupyter ライブラリには notebook を実行するサブコマンドがあるのですが，Notebook ライブラリが存在するときにはそのサブコマンドが使えなくなります．VSCode は jupyter から Jupyter Notebook を起動しているので notebook サブコマンドが使えなくてエラーになるようです．

著者は以下のように notebook ライブラリを消した後に jupyter ライブラリを更新したら VScode 上で Jupyter Notebook を動かせるようになりました．
```
pip uninstall notebook && pip install jupyter -U
```

~~ただ、[このリンク](https://tech-market.org/python-pip-uninstall-at-once/)を参考に環境を作り直すのが一番時間のためだなという...~~
eclipseのインストール（覚書）

eclipse（pleiades）及び、STSのインストール覚書です。

難しい内容ではないけど、ドがつく初心者なので「どうして私ここまで辿り着けたんだっけ？」と分からなくなること多しなので、記録として覚書しておこうと思います！

Macです。

Eclipseは英語版のみなので（私は英語が得意ではないので）、日本語化するために「Pleiades」というものを使います。

-Eclipseのインストール-

1.googleで「Pleiades」と検索
2.Versionは2019を選択
3.Mac 64bit/FullEdition/Javaを選択
4.ダウンロード完了したら、ファイルをダブルクリック

5.開発のためのWorkspaceフォルダーを作成しておく

6.Eclipseを開くと、どの場所で開発する？と聞かれるので、作成したWorkspaceを選択
（Eclipse開けない→アプリケーションフォルダで、Ctrl押しながらEclipseクリック、開く選択、警告は無視して開く）
これでEclipseは完了。

次に、フレームワーク使いたいのでSpringBootをインストールしていく。

ーJDKのインストールー
 1.googleで「JDK１.8ダウンロード」と検索
　　　 　→Java SE Development Kit-Downloads-Oracleを選択
 2.Java SE Development Kit 8uXXXのmacOS-x64.exe をクリックしてダウンロード
 3.Oracleアカウントなければ作成して、ログイン
 4.JDKがダウンロードできたらインストール開始(アイコンダブルクリック)
 5.ウィザード内は特に何も変更せずに「続ける」→「インストール」→「ソフトウェアをインストール」

ー開発場所の準備ー
 6.githubを開く→NewRepository→プロジェクト名つける→リポジトリのURLコピー
 7.コンソールにてworkspaceに移動（なければ作成）
 8.git clone --リポジトリのURL--   を実行しておく。

ーSTSのインストールー
 9.googleで「sts4 ダウンロード」と検索→「Tools - Spring」をクリック
10.OSのスペックを確認して対応するものを選択。
　　　 　Intel→4.x.x-MACOS X86_64
   M1→4.x.x-MACOS ARM_64
11.ダウンロードされたものをアプリケーションから開く
12.Worlspaceは先ほどgithubからクローンしたリポジトリを選択
13.起動完了！


ちなみに、STSは新しいものだとhtml作るのに少し不便だったのでプラグインを入れました。

https://marketplace.eclipse.org/content/eclipse-java-ee-developer-tools-0

ここのインストールボタン自体を、STSのスペースにドラッグ&ドロップ
↓
プラグイン本当に入れる？みたいなこと聞かれて、Yesにすると再起動開始
↓
templates右クリック→new→otherした時に、webが出てくるようになりました。
新しいUIでのAzure App ServiceでのAzure Active Directory認証

## はじめに
最近、Azure App ServiceにAzure Active Directoryを利用した簡易認証を適用する必要がったのでAzure Portalを開いたのですが、UIが変わりすぎてて混乱してしまったので、備忘録として残すことにしました。

## Azure Active Directoryの設定
1. Azureポータルにログインし、画面上部の検索フォームから「Azure Active Directory」を入力し、選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/e018df43-4ed2-368b-34c7-98397682fc1f.png)

1. Azure Active Directoryのメニューからで「アプリの登録」を選択後、「新規登録」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/dbf720f3-0696-4dc3-a7e0-76624774940a.png)

1. 以下を設定し、登録ボタンをクリックします。
    1. 名前：任意の名前
    1. サポートされているアカウントの種類：この組織ディレクトリに含まれるアカウント
    1. リダイレクトURL：WEBを選択し、https\://サーバー名/.auth/login/aad/callback
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/da4a1466-c053-e9a7-3aee-14e194930066.png)



1. 登録した以下の情報をメモ帳に保存しておきます。
    1. アプリケーション(クライアント)ID
    1. ディレクトリ (テナント) ID
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/e1f5fce2-3345-8ad0-0583-54dffec93e74.png)

1. 暗黙的な許可およびハイブリッドフローで「IDトークン」にチェックをつけて「保存」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/fc3f19cd-6270-066d-c83c-f3267a04b3af.png)


## App Serviceの認証設定
1. App Serviceのメニューから「認証」を選択後、「IDプロバイダーを追加」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/d6f79235-a7cc-1edc-7d1e-279a1495df5c.png)

1. 以下を設定し、追加ボタンをクリックします。
    1. IDプロバイダー：Microsoft
    1. アプリ登録の種類：既存アプリの登録の詳細を提供します
    1. クライアントID：メモしたアプリケーション(クライアント)ID
    1. 発行者のURL：https\://sts.windows.net/メモしたディレクトリ (テナント) ID/v2.0
    1. その他はデフォルト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/79ec55b3-4d54-a517-5200-6cccef6f6f12.png)
※ Active Directoryへのアクセスがある場合は、「このディレクトリにある既存のアプリの登録を選択する」で登録済みのアプリケーションを選択するのみでOKとなります。

## 稼働確認
認証をかけたページにアクセスするとログイン画面が表示され、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/530cc449-f489-18d2-78ee-c9add456518f.png)

ログイン後、無事デフォルトのページが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/d7e54333-7022-9a4d-762c-837c4259eaf4.png)

## まとめ
今回は無事、App ServiceにAzure Active Directory認証をかけることが出来ました。
次回は、OpenIDコネクトを利用したAzure AD B2Cも思い出しも含めて実施したいと思います。
C# 遅延実行ストリーミングと非ストリーミングの違いについて

こんにちは！新人エンジニアの近藤です。
記念すべき記事初投稿。わーーーー緊張緊張💦
初投稿なので少しだけ自己紹介。
一言でいうと私は**サッカー好きの新人へっぽこエンジニアです。**
w杯に興奮して寝れず、少し前までは寝不足気味でした。ただ今大会はいろいろなドラマがあり、ほんとにブラボーな大会でしたね！
ってことで余談はこの辺にして、今回は遅延実行と即時実行について自分なりに整理してみました！ってお話です。
以前に同じような記事が「出てるかもしれんぞマキ」「・・・」「出てないかも！！」

## はじめに
今回はC#についてお話します。
クエリ構文でwhere,selectとかorderbyその他もろもろありますよね。
今回はそんなクエリの実行形態の遅延実行について理解できなかったストリーミングと非ストリーミングの違いについて、実際に動かして理解できましたー！って話です。

### 遅延実行と即時実行
上記で上げていたクエリ構文はすべて遅延実行です。
遅延実行は実装した呼び出し位置では実行されないものです。後にforeach文などで実際にそのデータを使用するタイミングで実行されます。なので遅延実行です。

そしてその反対が即時実行です。ToArrayメソッドやToListメソッドなどがあげられます。
即時実行は呼び出された瞬間にそのクエリが実行されます。

**ストリーミングと非ストリーミング**
遅延実行にはストリーミング（例：Where,Select）と非ストリーミング（例：OrderBy）があります。といっても自分は違いがよく分かりませんでした。
なので・・・簡単なコードを書いて、実際に動かして違いを見てみました。

ちょうどW杯中だったのでベスト８の国データを用意しました。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3131319/6fc1dba5-421c-81aa-bb97-79b914f5c7dc.png)


そしてこのデータを下記のようにクエリ構文を書いて例外を発生させ、動きの違いを見てみました。


![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3131319/f499ed83-ae73-a1c0-1210-4c9c7bb63db9.png)





そしたら、ストリーミングの時でのコンソール画面はこんな感じ。例外に設定した"イングランド"の前までの要素はコンソール画面に表示されました。
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3131319/c8fe039f-d1b1-1eb6-064a-f87bff337fdd.png)


しかし、非ストリーミングはコンソール画面に何も表示されず

**なるほどなと**
ストリーミングは要素一つ一つをみていくので例外が発生する前までの要素の処理は実行される。
非ストリーミング要素をすべて洗ってから処理を実行するので、例外が発生した場合、すべての要素の処理は実行されていない。

**最後に**
最後まで読んでいただきありがとうございました。
今回は、実際の動作を確認しながら学習したことで、とても理解が深まりました。
引き続き少しでも、1mmでも気になったことは今回のように学習していこうと思います！
python zip(), set() の挙動を調べた

最近[LeetCode](https://leetcode.com/problemset/algorithms/)にハマっておりまして、その中で得た知見を備忘的に残していこうと思います。
# zip()の挙動

```main.py
strs = ["flower","flow","flight"]

for a in zip(strs):
  print(a)

# 出力 
# ('flower',)
# ('flow',)
# ('flight',)
```

zip(*strs)とした場合
```main.py
strs = ["flower","flow","flight"]

for a in zip(*strs):
  print(a)

# 出力 
# ('f', 'f', 'f')
# ('l', 'l', 'l')
# ('o', 'o', 'i')
# ('w', 'w', 'g')
```
このアスタリスク何？となった場合[「こちら」](https://qiita.com/LouiS0616/items/1bbe0a9bb93054f6c380)が参考になった。
ちなみにこのアスタリスクは**引数展開**



# set()の挙動

```main.py
sets1 = [1, 2, 3]
sets2 = [1, 2, 3, 1, 2, 3]
sets3 = [1, 2, 3, 1, 2, 3, 1, 2, 3]

s1 = set(sets1)
s2 = set(sets2)
s3 = set(sets3)

print(s1)
print(s2)
print(s3)

# 出力 
# {1, 2, 3}
# {1, 2, 3}
# {1, 2, 3}
```
set()は要素をまとめて、重複した要素は取り除いてくれるらしい。
参考にしたのは[「こちら」](https://uxmilk.jp/14834)
[Rails] Active Jobをロックしたい

# はじめに

[Active Job](https://railsguides.jp/active_job_basics.html) にてRailsバックグラウンドジョブを実行する際の、排他制御（ロック）に関するメモ

目的： **ジョブのキューイング自体をロックしたい**
（ジョブの処理をロックするだけではなく、そもそもEnqueしない）

https://qiita.com/tatsurou313/items/d3664f8dda05dcd12d56#active-job-%E3%81%AB%E5%87%A6%E7%90%86%E3%82%92%E8%A8%98%E8%BF%B0%E3%81%99%E3%82%8B

Active Job自体の使い方は↑こちらの記事を大いに参考にしています。
（ジョブ内での処理のロック方法は、こちらにも記載されています）

## 環境
Ruby on Rails （最近6.0系にアップデート）, MySQL, Resque
* scheduler が各ジョブを時間ごとに管理し
* Redis がジョブのキューを保持し
* Resque がキューをもとにジョブを管理・実行


# やりたいこと
そもそも Active Job でロックを導入する理由はなんでしょうか？

それは、**同じジョブがEnqueされすぎて詰まるのを避ける**ためです。

例えば、処理に30分かかるジョブがあったとします。にもかかわらず、
スケジューラーで15分ごとに非同期実行しようとしたらどうなるでしょうか。

``` schedule.rb
every 15.minutes do
  HogeHogeJob.peform_async; # 実際には処理に30分かかる
end
```

Redisは何も考えず、スケジューラーの伝えるままにジョブをキューに入れまくります。
結果、1つ目の `HogeHogeJob` が終わらないうちに２つ目が実行。。
どんどん積み上がり、最悪DBもデッドロックされ、処理が遅くなっていきます。

「いや、ちょうど良い時間を設定すればイイだけじゃん」と思われるかもしれませんが、
処理時間が読みきれないジョブなどを考えると、対策しておきたいですね。

# ジョブの処理をロック（with_advisory_lock）
https://qiita.com/tatsurou313/items/d3664f8dda05dcd12d56#%E3%82%B8%E3%83%A7%E3%83%96%E3%81%8C%E7%B5%82%E4%BA%86%E3%81%99%E3%82%8B%E3%81%BE%E3%81%A7%E3%83%AD%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B

こちらにも書かれている方法。処理をロックするのであれば、こちらで十分かと思います。
今回は[with_advisory_lock](https://github.com/ClosureTree/with_advisory_lock) Gemを使います。

Gemを追加した上で、ジョブの `perform` メソッドの処理をwith_advisory_lockでロックします。

```HogeHogeJob.rb
class HogeHogeJob < ApplicationJob
  queue_as :default

  def perform
    ActiveRecord::Base.with_advisory_lock("#なんかしらのロック名") do
      # 実際の処理
      # 〜〜〜
    end
  end
end
```

とすると、``#なんかしらのロック名`` で処理がロックされ、それが終わるまで
次の ``#なんかしらのロック名`` は実行されません。

with_advisory_lock はRails 6系もサポートしているのが嬉しい

### 次のジョブをキャンセルする
ちなみに with_advisory_lock は、ロック中にきた次のジョブは実行待ちとなり、キャンセルはされません。
次のジョブをドロップしたい場合は [Redlock](https://github.com/leandromoreira/redlock-rb) なんかを使うと良いです

# ジョブのキューイングをロックしたい
今回やりたいことはこちら。
上記の処理をロックする方法では、そもそも `HogeHogeJob` がキューイングされることはロックされません。

* scheduler
* → Redisにキュー
* → Resqueが実行（**ここで初めてロック**）

もし複数のジョブをカツカツで回している場合などでも、キューイング自体は止められません。


## activejob-locking
そこで今回は [activejob-locking](https://github.com/cfis/activejob-locking#options) というGemを使って、ジョブのキューイング自体をロックします。

activejob-locking もRails6系をサポートしてくれてます。

使い方は簡単。Gemを追加し、
```HogeHogeJob.rb
class HogeHogeJob < ApplicationJob
  include ActiveJob::Locking::Serialized
  queue_as :default

  def lock_key
    self.class.name
  end

  def perform
    # 実際の処理
    # 〜〜〜
  end
end
```

とすると、
activejob-lockingがクラス名でロック管理し、同じジョブがキューイングされることを防いでくれます。
この場合、１つ目のジョブが終わるのを待って、２つ目のジョブがキューされるようになります。

### 次のジョブをキャンセルする
上記の
```rb
  include ActiveJob::Locking::Serialized
```
では、2つ目のジョブは１つ目が終わるのを待ち、その後実行されます。

もし、ロック時には他のジョブがキャンセルされるようにしたい場合は、
```rb
  include ActiveJob::Locking::Unique
```
とすれば2つ目はエンキューされた後、1秒後にドロップされるようになります。
ちなみに1秒という時間は、オプションの [:lock_acquire_time](https://github.com/cfis/activejob-locking#lock_acquire_time) にて変更できます。


# その他参考
https://www.task-notes.com/entry/20170212/1486828146

https://scrapbox.io/yuta25/Rails_%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%AC%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%B3%E3%83%87%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3


初学者なりに書いてますので、表現のおかしい箇所などあればぜひご助言ください🙇
【React】【AWS】ECSを使ったデプロイでReactに環境変数を渡したい

## 実施したいこと
Reactに環境変数を渡したい

## 現状
ローカルで動作させるときは`.env`ファイルに環境変数を記載して、Reactで読み込んでいる

## やること
* 前提
  * ECSにデプロイしているので、dockerイメージを作る必要がある
  * dockerイメージを作るときはcodebuildを使用している
  * codebuildでイメージを作成するときは`buildspec.yml`を使用する 
  * `buildspec.yml`では`docker build`などのコマンドが含まれている

* すべきこと
  * docker buildする前に環境変数を渡す
  * 環境変数は`.env.production`に書き込んで、Reactで読み込むようにする

*  `buildspec.yml`を書く
```common-lisp:buildspec.yml
version: 0.2

phases:
  install:
    runtime-versions:
      docker: 20
    commands:
      - echo install step...
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      # 環境変数の設定
      - echo REACT_APP_API=$REACT_APP_API >> .env.production
.env.production
      # dockerfileの指定
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG_FRONTEND -f $DOCKERFILE_FRONTEND .
      - echo docker tag $IMAGE_REPO_NAME:$IMAGE_TAG_FRONTEND $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG_FRONTEND
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG_FRONTEND $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG_FRONTEND
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image...
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG_FRONTEND
      - printf '[{"name":"<container-definition>","imageUri":"%s"}]' $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG_FRONTEND > artifacts.json

artifacts:
  files: artifacts.json
```


`- echo REACT_APP_API=$REACT_APP_API >> .env.production`のところで、`code build`で設定した環境変数`REACT_APP_API`を`.env.production`に書き込んでいる

これをReactで読み込む
単純に
```typescript
console.log(process.env.REACT_APP_API);
```
とかで確認できる
Qiitaを初めて使う人なり

# Qiitaって何！?
### Wikipediaを見てみる
> Qiita（キータ）は、Qiita株式会社が運営するエンジニアに関する知識を記録・共有するためのエンジニアコミュニティサービスである[3]。2021年9月時点で70万人の会員がいる[4]。良い記事を「LGTM（Looks Good To Me）」で評価し(2022年8月25日に「いいね」に変更[5])、気になる記事を「ストック」できる
https://ja.wikipedia.org/wiki/Qiita

ということだ、要約すると、エンジニアやプログラミングの情報などを、記録したり、共有できるらしい。

### 私の活動内容を決めてみる
自分の悩みはなにか、次の2つのことが考えられる。
- プログラミングの知識を覚えてもすぐ忘れてしまう。
- コードなどが、混在するせいで正しいコードが分からない。

では、私が今後やっていくべきことはなんだろうか？

- 学習した知識をできるだけ、ここに書く
- 作ったプログラムをできるだけ紹介して、PVを稼ぐ
- 語彙力をもっと高めて、就活などで使えるような記事をかけるようになる
- もし自分が忘れたとしても、自分で見返してわかる
- 閲覧者が必要な情報を探せる

そんな記事を書いていこうと思う。

それでは、皆さんよろしくおねがいします！
HashSet , TreeSet class

Setは重複値を許容しない
HashSetは並び替えなし。以下の例では並び変わっているように見えるが、偶然
TreeSetは並び替えあり
```java
public class Outer {
    public static void main(String args[]) {
        Set<String> hs = new HashSet<>();
        hs.add("Z");
        hs.add("C");
        hs.add("V");
        hs.add("B");
        hs.add("A");
        hs.forEach(System.out::println);
        Supplier s = () -> {System.out.println("-----");return null;};
        s.get();
        Set<String> ts = new TreeSet<>();
        ts.add("Z");
        ts.add("D");
        ts.add("V");
        ts.add("Z");
        ts.add("A");
        ts.forEach(System.out::println);
    }
}
```
```
A
B
C
V
Z
-----
A
D
V
Z
```
LocalStorageの簡単な使用方法のサンプル

## 目的
備忘録を兼ねて。
LocalStorageに連想配列をJSONで保存／読み込み、保存のサンプル。
保存／取得にキーを指定する必要があるが、連想配列のキーと識別するため、本文中では当該キーをストレージキーと記述する。

## サンプルソース
### 保存
```javascript
let json_data={"キー1": "値1", "キー2": "値2", ...};
localStorage.setItem(ストレージキー, JSON.stringify(json_data));
```
### 取得
```javascript
let raw_data=localStorage.getItem(ストレージキー);
if(raw_data==null) return {}; //エラー処理: 当サンプルでは空の連想配列を返していますが、適宜修正してください
let json_data=JSON.parse(raw_data);
```

### ストレージキーで指定した情報の削除
```javascript
localStorage.removeItem(ストレージキー);
```

### LocalStorageの全削除
```javascript
localStorage.clear();
```