OmniAICreator/Qiita-1.07M huggingface dataset:
ArcticFoxアプデ後、MPAndroidChartを導入時にbuild.gradle(Project)のallprojectsでエラー + その解決法

ほかにも記事あると思いますが、個人的な備忘録として。
##ことの発端
課題でMPAndroidChartをつかったアプリを作成するため、
新規プロジェクトを立ち上げ、ライブラリの導入→Sync Nowしたら、無事エラー・・・

```
 Build was configured to prefer settings repositories over project repositories but 
 repository 'maven' was added by build file 'build.gradle'
```
もともと設定されていたものが、
build.gradleの追記で優先順位が変わってエラー　になった（という解釈）。


追記したのは下記のコード。　従来はこれでうまくいっていた。

```build.gradle(Project)
allprojects {
    repositories {
        google()
        jcenter()
        maven {
            url "https://jitpack.io"
        }
    }
}
```
##解決策
gradle関係のファイルを覗いてたら、setting.gradleにこんな記述が、

```setting.gradle
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
    }
}
```

もともと、build.gradle(Project)に記述されていたallprojectが、
Arctic Foxのアップデートでデフォルトの設定になっていたっぽい。
てなわけで、この中に追記しとく。

```setting.gradle
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
        // 追記
        maven {
            url "https://jitpack.io" 
        }
    }
}
```
これ書いてSync Now!!

同じような症状の人もいた。
https://stackoverflow.com/questions/66475730/in-android-studio-arctic-fox-canary-8-the-app-level-build-gradle-does-not-gener
[Ruby] AtCoder過去問 B - Nice Shopping 

##はじめに
AtCoder過去問B問題をRubyで解いてみました。
よろしくお願いします。

問題はこちらから確認してください↓

https://atcoder.jp/contests/hitachi2020/tasks/hitachi2020_b

##B - Nice Shopping 
はじめに入力を受け取ります。
今回は少し面倒でした。

```ruby
a, b, m = gets.split.map(&:to_i)
a_ary = gets.split.map(&:to_i)
b_ary = gets.split.map(&:to_i)
m_ary = []
m.times do |i|
  m_ary << gets.split.map(&:to_i)
end
```

割引券の配列m_aryの中は配列の中に配列を入れています。m_aryの中のそれぞれの配列が割引券一枚の条件を示しています。

割引券を使わずとも一番安い組み合わせが存在する可能性がありますので、price_aryという配列を作って代入しておきます。

```ruby
a, b, m = gets.split.map(&:to_i)
a_ary = gets.split.map(&:to_i)
b_ary = gets.split.map(&:to_i)
m_ary = []
m.times do |i|
  m_ary << gets.split.map(&:to_i)
end

price_ary = [a_ary.min + b_ary.min]
```

割引券を使った場合の金額もこのprice_aryに入れていきます。
割引券の使った時の金額は例えば1枚目(配列m_aryの先頭)であれば下記のように表せます。

```ruby
a_ary[m_ary[0][0]-1] + b_ary[m_ary[0][1]-1] - m_ary[0][2]
```

2枚目(m_aryの2番目も配列)の場合は

```ruby
a_ary[m_ary[1][0]-1] + b_ary[m_ary[1][1]-1] - m_ary[1][2]
```

これを利用してtimesメソッドで処理を行います。
割引券の数だけ繰り返すようにして、出来上がった金額はprice_aryに入れていきます。
そして最後にminメソッドでprice_aryの中の一番小さい要素を出力したら完成です。

```ruby
a, b, m = gets.split.map(&:to_i)
a_ary = gets.split.map(&:to_i)
b_ary = gets.split.map(&:to_i)
m_ary = []
m.times do |i|
  m_ary << gets.split.map(&:to_i)
end

price_ary = [a_ary.min + b_ary.min]
m_ary.length.times do |i|
 price_ary << a_ary[m_ary[i][0]-1] + b_ary[m_ary[i][1]-1] - m_ary[i][2]
end

puts price_ary.min
```
シニアエンジニアがOracle Master Bronze DBA 2019を取ってきた

※今流行りの駆け出しエンジニアではありません

元・DB管理者です。
↓こういうのが日常茶飯事でした。

https://qiita.com/cress_cc/items/d7797dc54cbb89d9a7e8

アカウントロックされると上からも下からも怒られるんで嫌なんですよね。

あとは以下のようなこともやってましたね。

* ユーザー作成・削除（離任者ユーザーの削除忘れがあるとめっちゃ怒られる）
* デッドロックで固まったセッションの強制終了
* 表領域が一杯になっちゃたときの対応（実は表領域ではなくディスクが一杯だったという罠）
* 理由は忘れたけどリスナーの再起動

なんで今までOracle Masterを取らなかったかというと、従来の試験（12c）はSQL基礎IとDBA（120分×2）の２科目を受けるのが非常にダルかったからです。
が、2020年1月から新制度が始まっていて、Bronze DBAは２科目だったのが１科目となり受験しやすくなりました。また、Silver DBAは前提条件が無くなり１科目で認定となったり、Gold DBAも~~クッソ高い~~研修の受講が不要となったりしています。

https://www.oracle.com/jp/education/index-172250-ja.html

学習方法は黒本を読んで問題を解いただけ。何の参考にもなりませんね。

休日を挟んだので、練習問題と模擬試験を３周くらい解いてざっくり15時間くらい。期間だと４日。本当はインストールと設定くらいは実物でやってみようと思いましたが時間が足りませんでした。Silver DBAを受けるときには流石にやっておいた方がいいとおもいます。

https://www.amazon.co.jp/dp/B08DXH6YBJ/ref=cm_sw_r_tw_dp_2EE2X1EEV2SN29MEDK61

とりあえずDB管理者やっている人はこれくらい取っておいた方がいいと思います。得体の知れないものを管理させられるのは感心しません。

以上、何の参考にもならないポエムでした。
Container Engine for Kubernetes (OKE)でLoadBalancerサービスの設定方法を確認する

# はじめに
KubernetesのLoadBalancerサービスは、クラウドプロバイダーのロードバランサーサービスを利用するのが一般的です。
Kubernetesのマニュアルにはクラウドプロバイダーごとの注意事項などが書かれているのですが、Oracle Cloud Infrastructure（OCI）の項目がありません。

https://kubernetes.io/ja/docs/concepts/services-networking/service/#loadbalancer

OCIのマニュアルには書かれています。

https://docs.oracle.com/ja-jp/iaas/Content/ContEng/Tasks/contengcreatingloadbalancer.htm

そこで、今回はOCIのKubernetesサービス（OKE）でLoadBalancerサービスを確認します。

# Podの作成
まずはLoadBalancerのエンドポイントになるPodを作成します。
OCIのマニュアルにはマニフェストのサンプルがありますが、LoadBalancerがちゃんと作られることを確認するだけですので、コマンドで簡単に作りたいと思います。

```
$ kubectl run nginx --image=nginx
pod/nginx created
$ kubectl get pod -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE          NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          28m   10.244.1.5   10.0.10.181   <none>           <none>
```


# LoadBalancerの作成
これもコマンドで簡単に作りたいと思います。

```
$ kubectl expose pod nginx --port=80 --target-port=80 --name=nginx-lb --type=LoadBalancer
service/nginx-lb exposed
$ kubectl get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP        32h
nginx-lb     LoadBalancer   10.96.230.198   <pending>     80:30537/TCP   13s
```

作った直後はEXTERNAL-IPが**pending**になっています。1, 2分経つとEXTERNAL-IPが割り振られています。

```
$ kubectl get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1       <none>           443/TCP        32h
nginx-lb     LoadBalancer   10.96.230.198   129.146.209.97   80:30537/TCP   54s
```

LoadBalancerのエンドポイントにPodのIPアドレス```10.244.1.5```が設定されていることを確認します。

```
$ kubectl describe svc nginx-lb
Name:                     nginx-lb
Namespace:                default
Labels:                   run=nginx
Annotations:              <none>
Selector:                 run=nginx
Type:                     LoadBalancer
IP:                       10.96.230.198
LoadBalancer Ingress:     129.146.209.97
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30537/TCP
Endpoints:                10.244.1.5:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type    Reason                Age   From                Message
  ----    ------                ----  ----                -------
  Normal  EnsuringLoadBalancer  73s   service-controller  Ensuring load balancer
  Normal  EnsuredLoadBalancer   29s   service-controller  Ensured load balancer
```
OCIのコンソールでも確認します。
![LB.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/05e0aefe-d4f0-b911-8ca3-63d1f3271b31.png)

ロードバランサがデプロイされていますね。

# 疎通確認

LoadBalancerのIPアドレスにアクセスして疎通を確認します。

```
$ curl 129.146.209.97 |grep nginx!
<title>Welcome to nginx!</title>
<h1>Welcome to nginx!</h1>
```

# 削除
削除の動作も確認します。

```
$ kubectl delete svc nginx-lb
service "nginx-lb" deleted
```

OCIのコンソールで確認します。

![LB-del.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/bd5d543b-6fc0-722d-fbdd-dbb400e68248.png)

削除済みのアイテムが残らなかったので信ぴょう性が怪しい画像ですが、``` kubectl delete```コマンドでOCIのロードバランサリソースも削除されました。
今更ながらPrettierをVScodeに導入してみた

#はじめに
個人で開発していてなんかコード汚いなーって思ったら、コードフォーマッターのprettierを導入していませんでした。
せっかくなのでprettierのInstallの方法をここに記そうと思います。

#Prettierとは
コードフォーマッター（ソースコードを整形してくれるツール）のこと。読み方はプリティア。

以下のような様々な形式にサポートしている。

・JavaScript
・JSX
・Flow
・TypeScript
・JSON
・HTML
・Vue
・Angular
・Ember / Handlebars
・CSS
・Less
・SCSS
・styled-components 💅
・styled-jsx
・GraphQL
・Markdown
・YAML

#何故コードフォーマッタを利用するのか（コードを整形するのか）

・ソースコードの品質を保つため（コードのスタイルの一貫性を保つため）
・コードレビュー時に、設計や命名などの重要な箇所に集中するため（コードのスタイルの指摘に時間を割くのを防ぐため）
・複数のメンバーが各自の整形ルールを適用し、更新する度に余計な差分が発生することを防ぐため
・ソースコードを綺麗にするための労力（スタイル定義の議論や時間）を費やさなくて済むため
・ツールに任せられることはツールに任せてしまった方が今後楽になるため


#Prettier のインストール

```
npm install prettier@2.3.0 --save-dev
```
#Prettier の実行
app.jsに対してprettierコマンドを実行する。ファイルを上書きするために--writeオプションをつける。

```
prettier app.js --write
```

こちらのコマンドを実行するとすべてのファイルが整形されてしまいます。
一部のファイルを除外するには``.prettierignore``ファイルを作成し除外したいファイル、フォルダを列挙します。

```igorpro:prettierignore
package.json
package-lock.json
testEslint/
testProject/
testTslint/
testWorkspaceFolder/
```

#終わりに
いかがだったでしょうか。
pritterはすごく便利なのでぜひ利用してみてください！

#参考サイト

https://prettier.io/docs/en/ignore.html

https://qiita.com/soarflat/items/06377f3b96964964a65d
Django RestFrameWorkの継承関係まとめ(APIView, GenericAPIView, Mixin...)

DRFにおいて、APIViewを継承した場合、GenericAPIViewを継承した場合、またはRetrieveUpdateDestroyAPIViewを継承した場合など、APIの書き方はいろいろありまして、間違いやすいかな～と思っています。(少なくとも私はそうですが)

それで、まとめてみようの気持ちで本記事を書きました。

では！


# APIView
例えばModelsにはBook classがあります。
全てのデータをDBから取り出すのAPIを実装します。
(views.pyとurls.pyのみ載せますね。)

- views.py

```python
class BooksView(APIView):
    def get(self,request):
        response_msg = {'status': 100, 'msg': '成功'}
        books=Book.objects.all()
        book_ser=BookSerializer(books,many=True)
        response_msg['data']=book_ser.data
        return Response(response_msg)
```

- urls.py

```python
path('books/', views.BooksView.as_view()),
```

これで、一番基本的な書き方が終了です。

# GenericAPIView
そもそも、GenericAPIViewを継承する原因はなんでしょう？

そう！コードを重複しているから！

APIViewを継承した場合、getのみはええだけど、post、putなども同じコードを書くので、効率は悪いです。

ですので、GenericAPIViewはAPIViewの進化版と理解してもいいです！

ここまで話したらもうわかると思いますが、GenericAPIViewはAPIViewを継承しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729963/2b077753-aa1f-11d5-4b99-0506ad09ba76.png)

コード：

```python
class BooksView(GenericAPIView):
    queryset = Book.objects
    serializer_class = BookSerializer
    
    def get(self,request):
　　　　#単一のデータを取り出す場合は`self.get_object()`を使えば良い。
        book_list=self.get_queryset()
        book_ser=self.get_serializer(book_list,many=True)

        return Response(book_ser.data)
```
重複した部分はかなり少なくなりましたよね！

今回はソースコードの解説は行わないですが、次回で解説しようかなと思っています！


# 再進化! GenericAPIView + ListModelMixin

最進化というのは、コードをもっと簡潔で終わらせるのことです。

先にコードを載せます、

コード：

```python
class BookView(GenericAPIView, ListModelMixin, CreateModelMixin):            
    queryset=Book.objects
    serializer_class = BookSerializer

    def get(self,request):
        return self.list(request)

    def post(self,request):
        return self.create(request)
```

getやpostをそのままreturnしたらオッケーのことです。もちろん、ListModelMixin,CreateModelMixin以外、後3つがあります、最後でまたまとめておきます。

また、
`GenericAPIView + ListModelMixin + CreateModelMixin　= ListCreateAPIView`

ま、左側を継承しても、右側を継承しても同じの結果のことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729963/13e16c93-052c-565e-4041-67d91a5cdaec.png)


# 継承関係まとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729963/4638f6d7-5cd2-3203-fdcd-22e888f2128a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729963/645ac1db-f110-6ed7-c937-dca10c9a6197.png)

```python
    CreateAPIView,
    ListAPIView,
    UpdateAPIView,
    RetrieveAPIView,
    DestroyAPIView,
    ListCreateAPIView,
    RetrieveUpdateDestroyAPIView,
    RetrieveDestroyAPIView,
    RetrieveUpdateAPIView
```

```python
     ListModelMixin,
     CreateModelMixin,
     UpdateModelMixin,
     DestroyModelMixin,
     RetrieveModelMixin
```
【PHP】array_unique関数で配列の重複したデータを削除

#array_unique関数#
array_unique関数を使うことで、配列の重複したデータを削除することが出来ます。

```array_unique.php
 $fruits = ['apple','lemon','strawberry','apple','orange','strawberry','lemomn'];
 $result = array_unique($fruits);
 var_dump($result);
```

```result
array(5) { 
[0]=> 
string(5) "apple" 
[1]=> 
string(5) "lemon" 
[2]=> 
string(10) "strawberry" 
[4]=> 
string(6) "orange" 
[6]=> 
string(6) "lemomn" 
}
```

このように重複している値を削除することが出来ました！
CodePipeline上のアクション有無をCloudFormationパラメータの値によって変更

# やりたいこと(今回の具体例)
CloudFormationで構築しているCodePipelineワークフローがあります。
このワークフローのデプロイステージは「ChangeSet生成」と「ChangeSet実行」アクションを実行をしています。

これに対して「EnableManualApproval」という名前のパラメータがTrueのときだけ「手動承認(Approval)」アクションを挟みたいです。


## EnableManualApprovalにFalseを指定したとき
![CodePipeline_-_AWS_Developer_Tools.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/e10e220c-9237-89b4-b0c7-f4c5326a6e92.png)


## EnableManualApprovalにTrueを指定したとき
![CodePipeline_-_AWS_Developer_Tools.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/07480e0d-cd0c-74c1-f12a-f2d1eb118236.png)



# やりかた

CodePipeline上のアクションのアクションは「リソース」ではなく「AWS::CodePipeline::Pipeline」というリソースのプロパティ階層の中で定義するので、Conditionkによって生成有無を分けることはできません。このために別々のPipeline定義を書くのはメンテナンスがしんどすぎます。

ググると[Stack Overflow](https://stackoverflow.com/questions/41752007/conditionally-create-codepipeline-actions-based-on-cloudformation-conditions)に求めていた回答がありました。

[IF関数](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if) を使い、条件一致する場合は「手動承認アクションの定義」を返し、条件一致しない場合おいうは[AWS::NoValue](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html#cfn-pseudo-param-novalue)を返せば実現できそうです。

以下のように書けばいい。

```
- !If 
  -   条件
  -   手動承認アクション定義
  -   AWS::NoValue
```

「AWS::NoValue」使っている人からすれば「そらそうやで」という話ですが、初めて使いました :relaxed:

# 今回の対応差分

![パイプラインでデプロイ前の手動承認の有無を指定するパラメータ_EnableManualApproval_を追加](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/4fb6fa64-6939-4505-4e80-81095f7cbfc0.png)

 - ① EnableManualApprovalパラメータの定義
 - ② IFで使いたいので EnableManualApprovalConditionsを定義
 - ③ EnableManualApprovalConditionsが成立するときに Approvalアクションの定義を返す様に記載

意図した通りCloudFormationのパラメータ「EnableManualApproval」に「True」を指定した場合のみApprovalが挟まるようになりました。

# 蛇足: Approvalの通知について

[パイプラインの進行状況はAWS ChatbotでSlackに流している](https://aws.amazon.com/jp/blogs/news/receive-aws-developer-tools-notifications-over-slack-using-aws-chatbot/)のでこの設定だけでもApprovalに気付けるのですが、表示が地味なのでお知らせ用のSNSを紐付けようかなと思います。

![Slack](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/04bbf9b3-19a8-ed77-3a90-cd16d618002d.png)
laravel 419エラー

https://qiita.com/ma7ma7pipipi/items/4778c1d7152d3dd06608
をまずは使ってみること



laravelでvue.jsを使っていて
localstorageからデータを読み取って自動ログインするようにしているが、
なぜか

419エラーが頻発してログアウトしちゃう。

csrfが悪さしてるみたい。

その場合の対象方法。

36行目らへんの以下の行をコメントアウトすればOK

```app/Http/Kernel.php

    protected $middlewareGroups = [
        'web' => [
//            \App\Http\Middleware\VerifyCsrfToken::class,
        ],
    ];

```

以上
MSB8040「このプロジェクトには Spectre で緩和されたライブラリが必要です」の対応

# MSB8040「このプロジェクトには Spectre で緩和されたライブラリが必要です」の対策
新しいPCにVisual Studioをインストールし、いざプロジェクトビルドすると発生するこのエラー。
Microsoftのページ見れば書いてあることですが、ググると「Spectre軽減策を無効にする」ばかりヒットするので、そうではない方法を備忘録としてqiitaにも記録しておきます。

URL　https://docs.microsoft.com/ja-jp/visualstudio/msbuild/errors/msb8040?f1url=%3FappId%3DDev16IDEF1%26l%3DJA-JP%26k%3Dk(MSB8040)%26rd%3Dtrue&view=vs-2019

## 本記事を書いた環境
- Visual Studio 2019 Community
- WDK for Windows 10 バージョン 2004
- [Windowsドライバサンプルコード「Toaster」プロジェクト](https://github.com/microsoft/Windows-driver-samples)


## エラーの内容
Visual StudioでC++の既存プロジェクトなどをビルドすると以下のようなビルドエラーメッセージ発生。
MSB8040「このプロジェクトには Spectre で緩和されたライブラリが必要です」

## Spectre で緩和されたライブラリのインストール方法
Visual Studioで以下の操作をします。
1.ツールメニューから「ツールと機能を取得」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372725/08770b48-752b-3a4c-a835-7760a5882360.png)

2.「個別のコンポーネント」で検索ウィンドウにspectreと入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372725/f1b8e7e5-586e-6b0c-6450-9320ebe9cef1.png)

3.開発対象に合わせてSpectre軽減ライブラリをチェックし、インストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372725/4edb4524-7978-69a5-b6a5-7b23ded44f87.png)
今回はWindowsドライバプロジェクトをMSVC v142でビルドするため、対象となるSpectre軽減ライブラリ（最新）を選択しました。

インストール中、Visual Studioを終了させる必要がありました。

## 最後に
結局は最初に張ったMSDNのURLを見れば乗っている話ですが、てっとり早く対策できるよう文章を減らし画像中心にしておきました。
お役に立てば幸いです。
[AWS基礎④] リージョンとアベイラビリティーゾーンとは（可用性を高める・冗長化）

<h2>初めに</h2>
今回はリージョンとアベイラリティゾーン（AZ)について学びました。
なんで設定するのかわかってなかったのですが、
「可用性」を高めることができる　ということがわかりました。

<h2>リージョンとは</h2>

リージョン＝領域
<img width="400" alt="スクリーンショット 2021-09-17 21.28.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/421f1145-e52f-a07f-6402-9b499cbdae7b.png">

<h6>リージョンとリージョンは完全に別れているので、<br>
あるリージョンで障害が発生しても他のリージョンには影響がありません。</h6>
↓
障害が発生した時、リージョンを切り替えるようにすれば、
「可用性」が上がります！:relaxed:

<h3>リージョンはどこでも良いのか</h3>
<h6>応答時間を早くしたいなら...</h6>
日本でサービスを展開する場合、リージョンは日本にした方がサーバーの
応答時間は早くなるそうです！

<h6>最新サービスをいち早く利用したいなら...</h6>
まずはアメリカのリージョンからサービス提供が始まり、
徐々に他に広まっていくという感じのようで、リージョン限定サービスがあるようです。

<h2>アベイラビリティゾーンとは</h2>
１つのリージョンは複数のアベイラリティゾーンから構成されています。
<h6>リージョンとは違い、互いに接続しています。</h6>
アジアパシフィック（東京）は、"ap-northeast-1a"、"ap-northeast-1c"、"ap-northeast-1d"
の3つのアベイラビリティーゾーンから構成されています。


<img width="300" alt="スクリーンショット 2021-09-17 21.36.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/191605c1-d39f-67ea-7184-37e3caf22152.png">
<strong>「お皿がリージョンで、スパイスがAZ」 というイメージです。</strong>

どのリージョンにもAZは２つ以上存在しますが、
何故かというと　やはり<strong>可用性</strong>です。
１個がダメになっても、他で動かせるようにしています。

<h2>冗長化:システムの稼働を止めない</h2>
![スクリーンショット 2021-09-18 10.32.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/216e48d3-63b5-2fd7-4279-8e10916d409c.png)

このように複数のAZにサーバーを設置しておき、
待機状態にしておけば、障害が発生してもすぐに切り替えることができます。

<h6>障害が起こっても稼働を継続できるように<br>
予備を準備しておくことを、
「冗長化」といいます。</h6>

<h2>終わりに</h2>
前回のセキュリティ対策についてもそうですが、
AWSって色々なことを考えて作られてるんだな...と思いました。
「なんでこんなのやるんだろう・・・」っていうものにも、ちゃんと意味があるんですね。

ちなみに前回の記事

https://qiita.com/ki_87/items/95e348afe4701f113f72

<h2>参考になるサイト</h2>

https://business.ntt-east.co.jp/content/cloudsolution/column-54.html
PythonのSympyを使って中国剰余定理(CRT)を解く

### 中国剰余定理（CRT:Chinese remainder theorem）とは

[中国の剰余定理 (Wikipedia)](https://ja.wikipedia.org/wiki/%E4%B8%AD%E5%9B%BD%E3%81%AE%E5%89%B0%E4%BD%99%E5%AE%9A%E7%90%86)によると以下のような定理のことです。

```math
\begin{align}
&k個の整数m_1,m_2,...,m_kが互いに素ならば、\\
&任意に与えられる整数 a_1,a_2,...,a_kに対して\\
&x\equiv a_1 \pmod{m_1}\\
&x\equiv a_2 \pmod{m_2}\\
&  ...\\
&x\equiv a_k \pmod{m_k}\\
&を満たす整数 x が m_1*m_2*...*m_kを法として一意的に存在する。
\end{align}
```

これだけだと分かりづらいので例題を見てみましょう。

#### 例題 1．7で割った余りが5かつ、11で割った余りが2となる整数を求めよ。
合同式で書くと以下の式で$x$を求めることになります。

```math
\begin{align}
&\large x\equiv 5 \pmod{7} \\
&\large x\equiv 2 \pmod{11} \\
\end{align}
```

これを[sympyのcrt](https://docs.sympy.org/latest/modules/ntheory.html)を使って解いていきます。と言っても非常に簡単で$m_k$と$a_k$のリストをそれぞれ作って渡すだけです。

```python
import sympy.ntheory.modular 
m = [7,11]
a = [5,2]
(x, y) = sympy.ntheory.modular.crt(m,a) 
print(f"x = {x}, y = {y}, x%7 = {x%7}, x%11 ={x%11}")

## x = 68, y = 77, x%7 = 5, x%11 =2
```
$\large x=68$が$7*11=77$を法とする解となります。検算でも正しい余りになってます。

#### 例題２．法が合成数のケース

$n=77$のとき以下の式を満たす$x$をすべて求めよ。ただし$0<x<n$とする。

> $\large x^3\equiv 1 \ (mod\ n)$

中国剰余定理を逆に考えると、$n=77=7*11$なので、素数$7$と$11$の二つの式に分解できます。

> $\large x_1^3\equiv 1\ (mod\ 7)\ \ ...(1)$
> $\large x_2^3\equiv 1\  (mod\ 11)\ \ ...(2)$
> $\large x = x_1x_2$

各々を以下のプログラムで求めると

```python
pl = [7,11]
fmod = [[i for i in range(1,p) if (i**3) % p == 1] for p in pl]
print(fmod)

# [[1, 2, 4], [1]]
```
**mod 7の答えは[1, 2, 4]、mod 11は[1]**　となるので以下の3つのケースで中国剰余定理を計算すればよいことになります。これらをsympyのcrtに渡すと**答えは(1, 23, 67)**　となります。

|(m1,a1)|(m2,a2)|
|:---:|:--:|
|(7,1)|(11,1)|
|(7,2)|(11,1)|
|(7,4)|(11,1)|

```Python
import itertools
for fmp in itertools.product(*fmod):
  (x,y) = sympy.ntheory.modular.crt(pl, fmp)  
  print(x)

# 1
# 23
# 67
```

（開発環境：Google Colab）
Ansible Playbook で task の結果が changed の時だけ別の task を実行する

:::note
以下の記事の通りでも実現できますが、世間的には notify handlers を使うのが一般的なようです
:::
それだけなんですが、日本語の記事を見つけられなかったので書いておきます
たぶんどこかにあるんでしょうが、```changed_when:```とか```shell:``` の話に埋もれて発見できず…
## 具体例
タイムゾーンを Asia/Tokyo に合わせ、タイムゾーンの変更があった時だけ crond を再起動する

```yaml:
- hosts: xxxx
  user: xxxx
  become: yes
  tasks:
    - timezone:
        name: Asia/Tokyo
      register: set_timezone
    - when: set_timezone.changed
      systemd:
        state: restarted
        name: cron
```
タイムゾーンが元から Asia/Tokyo の場合は cron の再起動はスキップされます
register で task の実行結果情報を受け取るところがミソです
register については[他の方の記事](https://qiita.com/szk3/items/29e827f90a543c764a5e)をどーぞ
【SwiftUI】AVAudioPlayerを使用して音楽を再生 

#概要
SwiftUIにて音(mp3)を鳴らす

#流れ
① : 音(MP3ファイル)を用意する
② : 音をXCodeに追加する
③ : Swiftファイル(SoundPlayer.swift)を作成 → 音の読み込みを行う
④ : ContentView.swiftにコードを追加
⑤ : 実行


#② : 音をXCodeに追加する
用意した音を「Assets.xcassets」へドラッグ&ドロップ
![スクリーンショット 2021-09-17 21.27.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/423ca52d-f698-7b37-a68c-514292f7d07a.png)


#③ : Swiftファイル(SoundPlayer.swift)を作成 → 音の読み込みを行う

1.  フォルダ一覧にて右クリック
2.  「NewFile」を選択
3.  「Swift File」を選択
※ 「SwiftUI View」ではない
4.  名前を決めて保存
5.  コードを追加

![スクリーンショット 2021-09-17 21.31.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/ea568bb8-91e7-3e1e-5317-9da1320fb483.png)

![スクリーンショット 2021-09-17 21.32.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/94fb70bb-b39f-3cc9-2088-e1aa18dd4d04.png)


```SoundPlayer.swift
import UIKit
import AVFoundation

class SoundPlayer: NSObject {
    
    let music_data=NSDataAsset(name: "music")!.data   // 音源の指定
    var music_player:AVAudioPlayer!
    
    // 音楽を再生
    func musicPlayer(){
        
        do{
            music_player=try AVAudioPlayer(data:music_data)   // 音楽を指定
            music_player.play()   // 音楽再生
        }catch{
            print("エラー発生.音を流せません")
        }
        
    }

    // 音楽を停止
    func stopAllMusic (){
        music_player?.stop()
    }
}

```


#④ : ContentView.swiftにコードを追加

```ContentView.swift
import SwiftUI

struct ContentView: View {
    
    let musicplayer = SoundPlayer()   // インスタンス化
    var body: some View {
        
        // ボタン
        Button(action:{

            // 音を再生
            musicplayer.musicPlayer()
            
        }){

            // ボタンのデザイン
            Text("MUSIC")
                .padding(60)
                .background(Color.red)
                .foregroundColor(Color.white)
                .cornerRadius(40)
        }
        
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

```

#⑤ : 実行

ボタンを押すと音が鳴ることを確認
AtCoderログ：0115 - ABC 116 B

# 問題

https://atcoder.jp/contests/abc116/tasks/abc116_b

## 問題文
> 数列 $a=\\{a_1,a_2,a_3, \ldots \\}$ は、以下のようにして定まります。
> ・初項 $s$ は入力で与えられる。
> ・関数 $f(n)$ を以下のように定める: $n$ が偶数なら $f(n)=n/2$、$n$ が奇数なら $f(n)=3n+1$。
> ・$i=1$ のとき $a_i=s$、$i>1$ のとき $a_i=f(a_{i−1})$ である。
> このとき、次の条件を満たす最小の整数 $m$ を求めてください。
> ・$a_m=a_n~(m>n)$ を満たす整数 $n$ が存在する。

## 制約
> ・$1 \le s \le 100$
> ・入力はすべて整数である。
> ・$a$ のすべての要素、および条件を満たす最小の $m$ は $1000000$ 以下となることが保証される。

## 収録されている問題セット
- [AtCoder Problems Boot camp for beginners Easy 100](https://kenkoooo.com/atcoder/#/training/Boot%20camp%20for%20Beginners/1) [#020]

# 回答
## 回答1 (AC)
数式が多いため難しく見えますが，要は数列を計算し、はじめて同じ値になるようなインデックスの値 $m$ を求めれば良いです。コードは以下のようになりました。今回は $m \le 1000000$ であることがわかっているので、数列に登場したかどうかを配列でチェックしています。

```C++:abc116b-1.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  int s;
  cin >> s;

  int counter = 1;
  vector<bool> c(1000001,false);
  c.at(s) = true;
  while ( true ) {
    if ( s%2==0 ) {
      s = s/2;
    } else {
      s = 3*s+1;
    }
    counter += 1;
    if ( c.at(s)==true ) {
      break;
    } else {
      c.at(s) = true;
    }
  }
  cout << counter << endl;
}
```

なお、設問が使用した関数 $f(n)$ に対し、どのような初期値 $s$ を入力しても数列の値が最終的には 1 になる (より正確には 4→2→1→4→... というループになる)ことが予想されています ([Collatz 予想(または角谷予想)](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E3%81%AE%E5%95%8F%E9%A1%8C))。つまり、従って、このループ以外では数列に同じ値が登場しないことがわかります (同じ値が登場したらそこでループしてしまい、4→2→1のループにならないため)。

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc116/tasks/abc116_b/editorial) → [ユーザ解説](https://blog.hamayanhamayan.com/entry/2019/01/20/234113)
計算した値を set 型変数に保持していました。

## [AtCoder の解説](https://atcoder.jp/contests/abc116/tasks/abc116_b/editorial) → [コンテスト全体の解説](https://img.atcoder.jp/abc116/editorial.pdf)
回答1と同じ方針でした。

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0114 - ABC 094 B](https://qiita.com/RoadLynton/items/184d563cdab62008feae)
- 次の記事 → [AtCoderログ：0116 - ABC 149 C](https://qiita.com/RoadLynton/items/c2f951cf72e63610373d)
Error: Failed to get existing workspaces: containers.Client#ListBlobs: Failure responding to request: StatusCode=404 の解決策

## 概要
terraform のstateをローカルからazure上に設定しようとしました。
その際のterraform init で起きたこのエラー。
あまり調べても解決策にすんなり出会えなかったのでここに解決策を備忘録として残しておきます。


## 解決策

以下のコマンドでした。

```
terraform init -reconfigure
```

ちなみにこのgit issue に書いてありました。

https://github.com/hashicorp/terraform-provider-azurerm/issues/7220


以上。


@kenmaro
Next.js+tailwindcssにgoogleFont読み込ませる！

googleFontをtailwindで使用する為の設定の仕方を紹介します。
こちら課題の一環でLGMTを一定数取らないといけない試験でぜひLGMTを押していただけるとありがたいです。


### googlefontでフォントを選択して@importの方でコピーする！
![googlefont.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/124ea38f-1528-fb31-2480-39b018412703.png)



### styles/globals.scssに読み込む

```sass
@tailwind base;
@tailwind components;
@tailwind utilities;
//読み込む
@import url('https://fonts.googleapis.com/css2?family=Lato:wght@700&family=Noto+Sans+JP:wght@500&display=swap');
```


### tailwind.config.jsに読み込む

```js
module.exports = {
    theme: {
        extend: {
            fontFamily: {
                roboto: ["Roboto"],
            },
        },
    },
}

```

![スクリーンショット 2021-09-17 21.02.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/cf30cbb7-8b90-13cb-fb88-ad23ca0bbe24.png)


### 使用する。
font-roboto
font-(設定したやつ)で使える


```html

<div className="font-roboto">
テキスト
</div>
```
Docker ubuntu コンテナ内に AWS CLI をインストールする

# 背景
ubuntu コンテナ内で AWS CLI v2 をインストールする際にハマりました。今後のためにメモとして残しておきます。

# インストール

以下のコマンドを順に実行します。

```
sudo apt-get update
sudo apt-get install ca-certificates
sudo apt-get install curl
sudo apt-get install unzip
sudo curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
sudo unzip awscliv2.zip
sudo ./aws/install -i /usr/local/aws-cli -b /usr/bin
```

または Dockerfile に以下を記述し、イメージのビルド時にインストールします。

```Dockerfile:Dockerfile
RUN sudo apt-get update && sudo apt-get install -y \
    ca-certificates \
    curl \
    unzip \
 && sudo curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \
 && sudo unzip awscliv2.zip \
 && sudo ./aws/install -i /usr/local/aws-cli -b /usr/bin
```

# 参考記事

https://qiita.com/shimacpyon/items/1af6d1ed69f6ad54c73c

https://docs.docker.jp/engine/articles/dockerfile_best-practice.html
GitHubにpushできなくなった ~トークン生成で解決~

#はじめに
久しぶりにローカルからGitHubにpushしたらエラーが吐かれた。
その際の解決方法について今回まとめることにしました。

#エラー
```git:ターミナル
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: Authentication failed for 'https://github.com/リポジトリ名.git/'
```

エラー文を見ると、2021年8月13日にパスワード認証が廃止されたと記載されていた。
言われてみれば、1ヶ月前くらいにGitHubにアクセスするにパスワード認証が変更あったなと思い出した:sweat:

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

#要員
__2021年8月13日からパスワード認証が廃止____

今まではローカルでGitHubにアクセスするにパスワード認証を使用しておりましたが、脆弱性防止のために個人アクセストークン認証に変更。

<従来>
・GitHub ユーザー名
・GitHub メールアドレス
・GitHub パスワード

<従来>
・GitHub ユーザー名
・GitHub メールアドレス
・GitHub 個人アクセストークン

#GitHubの個人アクセストークン作成方法

1.下記に個人アクセストークンを生成する手順が記載に沿って進めてください。

https://docs.github.com/ja/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token

1.個人アクセストークンが生成後、トークンをコピーする。

__※セキュリティ上の理由から、ページから移動した後は、トークンを再表示できないので注意する。__

![スクリーンショット 2021-09-17 21.06.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1572216/4acba746-63bf-a77e-06dc-ed2a2ba07080.png)

#GitHubとローカルの連携

ユーザー名登録

```git:ターミナル
＄　git config --global user.name GitHubに登録のユーザー名
```

メールアドレス登録

```
ターミナル
＄ git config --global user.email GitHubに登録のメールアドレス
```

GitHubにプッシュ

```git:ターミナル
＄　git push origin main
```

__パスワード入力が求められるので、先ほど控えた個人アクセストークンを入力__


![スクリーンショット 2021-09-17 21.06.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1572216/4acba746-63bf-a77e-06dc-ed2a2ba07080.png)

無事、プッシュ達成！

エラー文に記載してあったので今回はすんなりと解決できてよかったです！！！
【Git】あるPRから1部(中間)のコミットをmainに反映させたい

すでにStagingにmerge済みコミットの中から、中間のコミットだけを即座にmainブランチにmergeさせたい場合があった。中間のコミットを1つだけプッシュするには、 `git cherry-pick` で行うことができる。

## 結論

まずmainに移って、ローカルmainとリモートmainの差異をなくす

```
$ git checkout main
$ git pull origin main

# ローカルブランチをリモートの状態に戻したい場合
$ git branch | grep '*'
* main
$ git reset --hard origin/main
```

全く新しいブランチを、新規で切る

```
$ git checkout -b new-branch master
```

mainに反映させたいコミットのハッシュで `cherry-pick`

```
$ git cherry-pick コミットのハッシュ
```

`new-branch` にpush

```
$ git push origin new-branch
```

=> GitHubのUIから、`main <= new-branch` のPRを作ってmainに向けて新しいPRを作成する

=> mainにmerge

## 説明

```
A - B - C [main]
         \
          D - E - F [feature]
mainから新しいブランチを作成

$ git checkout -b new-branch main

          [new-branch]
A - B - C [main]
         \
          D - E - F [feature]
（Cを指す新しいブランチラベルが作成された以外は何も変更されていないことに注意）

次に、Eをチェリーピックする。これにより、EがCの上に新しいコミットとしてコピーされる。競合が発生する可能性があるため通常どおり解決する。

$ git cherry-pick E

          E1 [new-branch]
         / 
A - B - C [main]
         \
          D - E - F [feature]

```

これでプッシュできnew-branch、E1のみがPRに含まれる。

https://qiita.com/muran001/items/dea2bbbaea1260098051
https://www.webdevqa.jp.net/ja/git/%E7%89%B9%E5%AE%9A%E3%81%AE%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%82%92%E3%80%8C%E3%83%97%E3%83%AB%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%80%8D%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/1056172386/
https://www.atlassian.com/ja/git/tutorials/cherry-pick#:~:text=git%20cherry%2Dpick%20%E3%81%AF%E5%A4%89%E6%9B%B4,%E5%A0%B4%E6%89%80%E3%81%AB%E4%BB%98%E3%81%91%E6%9B%BF%E3%81%88%E3%82%89%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82
https://www.sejuku.net/blog/71544
composer 系コマンドで実行中の詳細を出力する方法

# 目的

- 時間のかかる`$ composer install`や`$ composer require`コマンドで詳細情報をターミナル上に出力する方法をまとめる

# 方法

- composer系のコマンドに`-vvv`のオプションをつけて実行する。

# 例

- `$ composer install`のときの例を下記に記載する。

    ```terminal
    $ composer install パッケージ名　-vvv
    ```

# `-vvv`とは

- composerコマンドのヘルプを下記に記載する。

    ```
    $ composer -h
    Usage:
      help [options] [--] [<command_name>]
    
    Arguments:
      command                        The command to execute
      command_name                   The command name [default: "help"]
    
    Options:
          --xml                      To output help as XML
          --format=FORMAT            The output format (txt, xml, json, or md) [default: "txt"]
          --raw                      To output raw command help
      -h, --help                     Display this help message
      -q, --quiet                    Do not output any message
      -V, --version                  Display this application version
          --ansi                     Force ANSI output
          --no-ansi                  Disable ANSI output
      -n, --no-interaction           Do not ask any interactive question
          --profile                  Display timing and memory usage information
          --no-plugins               Whether to disable plugins.
      -d, --working-dir=WORKING-DIR  If specified, use the given directory as working directory.
          --no-cache                 Prevent use of the cache
      -v|vv|vvv, --verbose           Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
    
    Help:
      The help command displays help for a given command:
      
        php /usr/local/bin/composer help list
      
      You can also output the help in other formats by using the --format option:
      
        php /usr/local/bin/composer help --format=xml list
      
      To display the list of available commands, please use the list command.
    ```

- 下記にご注目いただきたい。

    ```
    -v|vv|vvv, --verbose           Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
    ```

- 日本語訳すると下記の様になる。

    ```
    -v | vv | vvv、-verboseメッセージの詳細度を上げます。1は通常の出力用、2はより詳細な出力用、3はデバッグ用です。
    ```

- ようは`-v`で通常の出力、`-vv`で少し詳しい出力、`-vvv`ですべての情報を出力みたいなニュアンスでOK
Amazon Athena: キー値にピリオドを含む場合のjson_extract

# 概要

- Amazon Athenaのクエリーで `json_extract` 関数を利用する場面
- ソースとなる情報はJSONのためjson_extract()関数を使用して目的の値を取得しようと考えました
- 一部JSONのキー値に `.` （ピリオド）を含むケースがありました
- 目的のキーはJSONPathで指示しますが、キー値をそのまま指示しても期待通りの動作をさせられず困りました
- その回避方法を記録します。ただし、条件付きであり、ベストな解決方法でないかもしれません

# json_extract 関数について

書式はおよそ下記のようになります

```
json_extract(<入力JSON文字列>, <取得するJSONPath文字列>)
```

正確にはドキュメント [^athenajson] 参照なのですが、`JSONPath-like expression` と記載があり、JSONPath風の記述、ということかと思います。


# 実施した内容

具体的に状況を示します

想定するソースjsonは下記のようにキー値に `.` を含みます
キー値 `key.name` を指定し、`your-name` が取得できることが期待する動作です

```json:ソースとなるjson
{"key.name": "your-name"}
```

## なにも考えずAthenaで実行したqueryと結果

```sql
SELECT json_extract('{"key.name": "your-name"}','$.key.name') AS key_name

key_name
------
null
```

既に記述した通り、 `$.key.name` は、下記のような構造の場合のPathを示しますので、指示が間違っています

```json
{"key": {"name": "your-name"}}
```

念の為確認してみました。

```sql
SELECT json_extract('{"key": {"name": "your-name"}}','$.key.name') AS key_name

key_name
------
"your-name"
```

## JSONPathを少し調べて試したqueryと結果

そもそも、JSONPath[^jsonpath]について良く知らなかったので少し検索したところ、`$.['key.name']` のような記述が適しているようです

```sql
SELECT json_extract('{"key.name": "your-name"}','$.[''key.name'']') AS key_name

INVALID_FUNCTION_ARGUMENT: Invalid JSON path: '$.['key.name']'
```

エラーになってしまいました。JSONPathとして正しく解釈されないようです。
Athenaで利用しているJSONPath（のサブセット？）では実装されていないということかもしれません。

## 暫定対応（一応の解決）

入力JSON文字列のキーを書き換えてしまう方法です。

```sql
SELECT json_extract(
    replace('{"key.name": "your-name"}', '"key.name"', '"key_name"') /* "key.name" -> "key_name" と置換 */
  ,'$.key_name') AS key_name  /* JSONPathも key_nameとする */

key_name
------
"your-name"
```

同じキー値や、値部分にマッチしてしまった場合はすべて書き換えてしまうことになりますので、危険です。
入力値の仕様上問題なければ、という条件付きになりますが、一応の解決となりそうです。


[^athenajson]: https://docs.aws.amazon.com/ja_jp/athena/latest/ug/querying-JSON.html
[^jsonpath]: https://github.com/json-path/JsonPath
RTSPストリーミング v4l2rtspserverのビルドエラーと実行時エラーの回避方法


#どんな人が必要とする情報か
+ v4l2rtspserverをgitからcloneしてmake中にlive555関連のlinkエラーが出て、直し方が分からない人。但し、記載の方法で直るとは限らない。あくまでも一例として。
+ この対応方法はイマイチかも、と思ってます。こっちのほうが簡単やでぇというのがありましたら、コメント等で ご教授いただければ幸いです。

#使用した開発環境＆実行環境

+ Raspberry Pi 4
+ Raspberry Pi Imager v.1.6.2 で標準的なOSを64GBのSDカードに書き込んだ
+ ラズパイ用フレキカメラv2.1


# 開発用opensslのインストール
```
$ sudo apt-get install libssl-dev
```

# live555のインストール

Additional info on 2021/10/5
`sudo apt-get install liblivemedia-dev`

It would be OK instead of downloading tar.gz and build to use lib and .h files of liveMedia.


## ダウンロード
http://www.live555.com/liveMedia/public/
から、最新のアーカイブをダウンロード。
私の評価時は live.2021.08.24.tar.gz = live555-latest.tar.gz でした。
## ビルド
http://www.live555.com/liveMedia/#config-unix
に記載の手順でビルドする。
↑のサイトに
> Some people (in particular, FreeBSD users) have reported that the GNU version of "make" - often called "gmake" - works better than their default, pre-installed version of "make". (In particular, you should try using "gmake" if you encounter linking problems with the "ar" command.)

…と書かれてるので、もしかしたら、以下の手順ではmakeよりもgmakeのほうがいいのかも。。。

genMakefilesコマンドのオプションは自分の環境に合わせて選ぶ。linuxで実行したが、armlinuxのほうが良かった?説?

```
$ tar -zxvf live.2021.08.24.tar.gz
$ cd live
$ ./genMakefiles linux
$ make
$ sudo make install
```
# v4l2rtspserverのビルドと実行
## linkエラーが出るまでの手順

```
$ sudo apt-get install cmake
$ sudo apt-get install subversion
$ cd ~/git
$ mkdir mpromonet
# cd mpromonet
$ git clone https://github.com/mpromonet/v4l2rtspserver.git
$ cd v4l2rtspserver
$ cmake .
$ make
```

この最後のmake中にlive555のモジュールが見つからない(undefined reference to ...)のリンクエラーが複数モジュールに対して表示される

## linkエラーを回避する手順

+ v4l2rtspserverインストールフォルダ以下の CMakeFiles/v4l2rtspserver.dir/link.txt　を以下のように修正(コマンドライン文字列を短くし、ライブラリファイルの指定順を変更してる)

修正前 (環境によってディレクトリ名は変わる)

```
/usr/bin/c++    -L /usr/local/lib/openssl -rdynamic CMakeFiles/v4l2rtspserver.dir/main.cpp.o  -o v4l2rtspserver  -llog4cpp /usr/local/lib/libliveMedia.a /usr/local/lib/libUsageEnvironment.a /usr/local/lib/libBasicUsageEnvironment.a /usr/local/lib/libgroupsock.a liblibv4l2rtspserver.a libv4l2wrapper.a -pthread 
```

修正後(テキストエディタなどで修正)

```
/usr/bin/c++ -L. -L/usr/local/lib -L/usr/local/openssl/3_1_0dev/lib -rdynamic CMakeFiles/v4l2rtspserver.dir/main.cpp.o -o v4l2rtspserver -pthread -llog4cpp -llibv4l2rtspserver -lv4l2wrapper -lssl -lcrypto -lliveMedia -lBasicUsageEnvironment -lgroupsock -lUsageEnvironment
```

再度 `make` 実行でリンクが通る。

## 実行エラーが出るまでの手順(人によっては出ないかも)
```
$ sudo v4l2rtspserver
v4l2rtspserver: error while loading shared libraries: libssl.so.3: cannot open shared object file: No such file or directory
```

## 実行エラーを回避する手順

+ /etc/ld.so.conf.d/に以下のファイルを置く

```openssl.conf
# openssl configuration
/usr/local/openssl/3_1_0dev/lib
```

以下コマンドを実行

```
$ sudo ldconfig
```

再度実行

```
$ sudo v4l2rtspserver
```

それらしい実行状況表示があり、Win10PCのVLC Media Playerでストりーみいんぐ再生を見ることができた。

# 参考URL

https://dev.classmethod.jp/articles/raspberry-pi-rtsp-server/

https://qiita.com/n-yamanaka/items/8b6da9da9595c76e2448#v4l2rtspserver

https://github.com/mpromonet/libv4l2cpp

https://www.debugcn.com/en/article/60671731.html
Svelte で promise が解決されたかどうかを追跡してフラグとして扱う方法

ググって良く出てくるのは loading フラグを用意する方法です
https://stackoverflow.com/questions/58837243/svelte-how-to-display-something-only-when-a-promise-is-not-pending

```js
let resolved = false

promise.then(() => resolved = true)
```

---

promise そのものを watch して、状態に書き起こすサンプルを作りました
https://svelte.dev/repl/1b0ce0cf34c04694b7098bafa8225a55?version=3.42.6

```js
$: promiseResolved = createPromiseResolved(promise)
```

フラグの状態変更をコンポーネント内に書かなくて済んだり、 promise の結果を動的に追ってくれるので便利です。

---

上記実装のため参考にした記事はこちらです。
https://stackoverflow.com/questions/30564053/how-can-i-synchronously-determine-a-javascript-promises-state/35820220#35820220

今後 top-level-await が svelte で実装されるとまた変わってくるかもしれません。
DB:beginTransaction();ってなに?


直接DBにアクセス（保存）する記述。コントローラーに書く。


```
DB:beginTransaction();
try　{
　　//略
  DB::commit();
  return ...
}　catch　(Exception $e)　{
  //略
  DB::rollback();
  return ...
}
```
DB:commitって何？
migrationのコミット？ロールバックはもともとはここから来ていたのですかね

###DB:beginTeansaction();


直訳するとDB：取引開始
なのでここからDB接続しますということ

###DB:commit();


DBへ内容を反映させる
当たり前ですが、コードは上から順番に読み込まれるので
この記述が呼ばれるとDBへ反映される。


###DB:rollback();

DBへの処理は行われずなかったことに
##END
GitHub CodeSpaces Beta版を申し込んでみた

![Github](https://goodpatch.com/blog/wp-content/uploads/2013/12/octocat.png)


# 背景

最近GitHubの進化がすごいです。GitHub上でVSCodeが動くようになりました。

https://www.itmedia.co.jp/news/articles/2108/12/news145.html

しかしそれだけにとどまらず、コンピュータリソースもGitHubは提供しているようです。
もしブラウザからコンピュータを扱えれば、PCがなくてもタブレット・スマホから開発を行うことができ、通勤途中の電車内開発ができたりする、なんて夢が膨らみます（笑）。
個人利用は無料なので、早速試してみました。

# サインアップ
以下のリンクからアクセスします。

https://github.co.jp/features/codespaces

２ステップくらいで簡単に申し込みが終わりました。
申し込み後は以下の画面が出てきました。

![スクリーンショット 2021-09-17 19.23.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258554/29f6f912-f596-7233-7d05-e30c1f1221a1.png)

承認が出たら記事を追加します。

# 何ができるの？
GitHubにVSCode機能とCodeSpaces機能が追加されることにより

+ わざわざレポジトリをcloneすることなく編集&デバックが可能。
+ わざわざPCを開かなくてもデバッグが可能。
+ プログラミング初心者が環境設定が不要で、すぐにコーディングに取り組める。

などなど、非常に便利に使えそうです。


# 対応ブラウザ
現在、対応ブラウザは以下の4つとのことです。

+ Chrome
+ Edge
+ FireFox
+ Safari

メジャーなブラウザは対応されているみたいです。
Mac民としてはSafariまで対応されているのは心強いです！


# 公式ドキュメント

https://docs.github.com/en/codespaces/getting-started/quickstart
【初心者向け】サイトマップの作り方

#はじめに
HPやアプリを制作するにあたって、まずはサイトマップやワイヤーフレームを作ることになると思います。
私は、Excelやパワポを使って作成しました。
それでは、サイトマップとは何か、どうやって作るのか見ていきましょう。

#サイトマップについて
サイトマップとは、トップページからどのようにページ遷移するかをツリー状にして分かりやすく表示させたものです。
その名のとおり、サイトの地図（構成図）になります。

#サイトマップを作るメリット
・サイトの全体像を把握しやすくなる。
・ページの漏れがなくなる。
・ユーザーがページを探しやすくなる。
・チームで作成する場合に、認識を共有しやすくなる。

#サイトマップの作り方
1) 思いつく限りの作りたいページ、必要なページをすべて書き出す。
2) 同じようなサイトからほかにも必要なページがないか探す。
3) カテゴリー分けを行う。
4) ツリー状に整理する。
※　3)や4)の中で、不必要なページが出てきたら削除する。

#おわりに
ツリー状で作らなくても、いろいろな図で表現できると思うので、好きな形でやってみてください。
クライアントにとって分かりやすい形で作ることができればそれで良いかと思います。
【Gスプレッドシート】診断系ツールを作ったときの関数作例（列のカウント判定、最も大きな数が入ったセルのラベル取得）

備忘録的なメモです。

GフォームとGスプレッドシートの関数を使って、
複数の回答からパターン判定をするシートを作成したいときの関数作例です。
ただのメモなので分かりづらいかもしれません。

【完成イメージ】
![40c041c7-b17f-4ae4-839f-71491eb6c876.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389595/d14e9a16-5698-efec-4444-8d759ff343f7.png)

【概要】
Gフォームで回答を収集。
質問とパターンを紐付けて、最も多いパターンを診断結果として判定する。

【仕様】
１：集計列（B列~D列）
A列～D列でcountifs関数で「はい」を数える。

=countifs($H$1:$CI$1,$B$1,H3:CI3,"はい")

わからないなどの曖昧な表現を参考値にする場合は、
Arrayformura関数を使って日本語を指数表現に置き換えると可能と思います。


２：１行目は判定に使うためのパターン表として使用
質問⇔パターンの関連表として１行めを使用

３：タイプ判定
A列～D列で最も回答が多かった物を判定とする
=index($B$1:$E$1,1,match(MAX(B3:E3),B3:E3,0))
※帰ってくる配列の結果（B~Dの１行目,最も数が大きいセルの列）
※判定結果は関数式のためオートフィルによる追加編集が必要

Googleフォームを利用した簡易診断ツールとして使えるかなと思います。

少し苦労して作ったので、がんばったご褒美にQiitaに投稿しておきます。
誰かの参考になれば幸いです。
Terraform とは

Terraform の概要について調べてみる。
#Terraform とは？
インフラの構成をコードで宣言できる、IaC(Infrastructure as Code)を実現するツール。
インフラ開発がシンプルかつ高速になる。
AWS, Azure, Google Cloud Platform などに対応。
.tf ファイルと　HCL (HashiCorp Configuration Language) により実装。

#基本的なコマンド
terraform の操作を行うための基本的なコマンド。
###terraform init
ワークスペースを初期化するコマンド、 terraform を実行するのに初期化は必須。
.tf で使用しているプラグインのダウンロードなども走る。

```
% terraform init
Initializing modules...

Initializing the backend...

Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.

Initializing provider plugins...
......
```

###terraform plan
コードを実行すると何が起こるか、リソースがどのように変更されるかを terraform が教えてくれる。

```
% terraform plan
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
.......
Plan: 1 to add, 0 to change, 0 to destroy.
```

###terraform apply
書いたコードを実際のインフラに適応する。
改めて plan の結果が表示された後、確認が表示される。

```
% terraform apply
......
Plan: 0 to add, 2 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes
......
```

#構成要素
terraform　を構成する基本的なブロック。

###resource
EC2 インスタンスのようなリソースの定義を行う。

```
resource "aws_security_group" "ec2" {
   ......
}
```

###variable
変数を定義する。
以下の例ではデフォルト値を設定している、 terraform 実行時に上書きしない場合はこの値が使われる。

```
variable "region"    { default = "ap-northeast-1" }
```

###locals
ローカル変数を定義できる。
variable と異なりコマンド実行時に上書きできない変数。

```
locals {
    cf_zone_id = "cfzoneid"
    site_origin_id = "siteoriginid"
}
```

###output
出力値を定義できる。
値は apply 時にターミナルで確認したり別のモジュールから取得したりできる。

```
output "region" {
    value = var.region
}
```

###data
外部データを参照できる。
以下の例では　Amazon Linux 2 の AMI リストを参照している。

```
data "aws_ami" "recent_amazon_linux_2" {
   ......
}
```

###provider
Terrraform は AWS 以外にも GCO, Azure などに対応しているがその違いを吸収するのがプロバイダ。

```
provider "aws" {
    region = "us-east-1"
    alias  = "virginia"
}
```



#参考資料
https://www.lac.co.jp/lacwatch/service/20200903_002270.html

https://reboooot.net/post/what-is-terraform/

https://booth.pm/ja/items/1318735
【勉強記録】用語の覚え書き

#目次
- 開発手法
- AWS
- SQL
- Ruby
- Linux
- セキュリティ
- その他

気になった用語を羅列しています。
随時追記予定です。

## 開発手法
### ウォーターフォール
要件定義→基本設計→詳細設計→実装→テスト
といった流れに沿って一方通行で開発を進めていく。
日程感やリソースの配分といったプロジェクトの管理のしやすさが特徴。
一方、要件定義漏れなどによりさかのぼる場合のコストがとても高い。

### アジャイル
システムを小さく作り、徐々に機能を追加していく開発手法。
全ての仕様を備えた完品を作ってから引き渡すウォーターフォールモデルとは対比して語られやすい。
柔軟な対応が可能であることが一番の特徴。スマホアプリなどの開発に向く。
反対にスケジュール感が曖昧になったり方向性がぶれるなど管理面が課題。

## AWS
### EC2
クラウドサーバの構築・運用を行えるサービスのこと。
EC2インスタンスとはEC2で立ち上げたサーバを指す。

### EBS
EC2インスタンスに紐づくストレージサービス。
安定的で耐久性の高い仕組み、使いたいときに使いたいだけ使えるという柔軟性が特徴。

### RDS(Relational Database Service)
AWSが提供するデータベースサービスのこと。EBSと同様、その堅牢さ、拡張性・柔軟性に特徴がある。
RDBは(Relational Database)なので注意。

### EIP
IPアドレスを固定するための仕組み。

### ロードバランサー
高いアクセス負荷に対応するための仕組み。一つのサーバーで集中的に受け持つのではなく、複数のサーバーに振り分けて負荷分散させる。

## SQL（特徴）
### MySQL
- オープンソース（無償利用可能）
- 対応OSが多い
- AWSのデフォルトのRDB

### PostgreSQL
- オープンソース（無償利用可能）
- 商用並みの機能
- CPUの並列処理可能（高速化）
- 他ソフトウェアとの連携（拡張性あり）
- サポートサービスがある(?)

### Oracle Detabase
- 高い堅牢性
- DBへの同時アクセス性能
- 拡張性の高さ
- 高価
- MySQL、PostgreSQLと比較して複雑な処理が可能

## Ruby
### Ruby on Rails
DRY:同じことを繰り返さない
CoC:設定より規約
MVCアーキテクチャー
Rubyのフレームワークとしては圧倒的なシェアを誇る。

### Sinatra
MVCアーキテクチャーを利用しない。柔軟性の高さが特徴

## Linux
### Linuxカーネル
狭義のLinux、LinuxOSの中でも中核部分を指す。具体的には下記2つの役割を持つ。
>・アプリケーションからの要求に応えること。
>・ハードウェアからの応答をアプリケーションに伝えること。

スペシャリスト。シェルから受けた指示を超速でこなして値を返す。

### シェル
Railsでいうコントローラーのイメージ。リクエストを受けて、カーネルに渡す、返ってきたものを出力させる。
オペレーター、取次役のようなイメージ。
代表的なシェルにsh,bash,zshなど

### ターミナル（ターミナルエミュレータ）
黒い画面。役割は入出力のインターフェース。
その中でシェルが働いて実行、処理を行う。

### Linuxディストリビューション
広義のLinux。基本的なコマンド、アプリケーションを含んだもの。

### CentOS
Red Hat系のLinuxディストリビューション。特徴は、
1.無償
2.有償であるRedHatのクローン。高品質。
3.企業のサーバによく取り入れられている。

### Ubuntu
Debian系のLinuxディストリビューション。特徴は
1.無償
2.とにかく使いやすい
3.日本語翻訳チームがある

### ディレクトリ
| 名称 | 意味 |
|:-:|:-:|
| ルートディレクトリ  |  ディレクトリの大元 |
|ホームディレクトリ  |  ログイン時の場所 |
|カレントディレクトリ  | 現在位置 |


## セキュリティ
### SQLインジェクション
ウェブサイトの脆弱性を突いてSQLを実行、結果としてデータの改ざんや抜き取りが行われる。

### CFRS（クロスサイトリクエストフォージェリ）
ウェブサイトにログインした状態で罠を踏むと、その権限内で行える操作により悪用される。
例えばECサイトなら閲覧者が大量に商品を購入させられてしまう、SNSなら身に覚えのない投稿が行われるといった被害が考えられる。

## その他
### 環境変数
OSが持つ環境変数と、各ユーザが持つ環境変数に分かれる。
変数はあくまで変数なので、PC名などの情報を入れる箱であることには変わりない。
どこでも使える環境変数か、ある環境下でしか使えない環境変数かというイメージ。

### RPA
人間が行う処理をそのままコンピュータになぞらせることで実現する省力化の仕組み。

### リファクタリング
コーディングにおいて、ふるまいを変えずに内部処理を変えること。
文章を推敲して色々な言い方を試すイメージ。
誰が扱っても分かりやすい簡潔なコードとすることを目的とする。

### ガベージコレクション
一時的に使っていた変数などの記録（ゴミ=ガベージ）が残り続けてメモリ使用率が上がっていくのを防ぐ仕組み。具体的にはファイルを走査し、いらないメモリを解放する。
ただし、処理としては重たいため、この仕組みを使わずに"オブジェクトを使いまわす"ことで圧迫を防ぐ方法もある。
[参照](https://qiita.com/bkzen/items/d84312246061778ee870)

### ディレクション
管理という意味ではマネジメントと同義。ディレクションの方がより狭い範囲での管理。
>ディレクション
…現場の業務進行、日程調整などの管理（メンバーの指導なども含む）
マネジメント
…数字の管理など、経営的観点における管理

## 参考
https://next-sfa.jp/journal/skill/direction/
https://www.kagoya.jp/howto/it-glossary/security/sql-injection/
https://qiita.com/uguis410/items/17ec1e447e9716bfdca7
https://qiita.com/jeyei/items/2c385e4e0488a5fa2591
【Python】importが必要なPythonをAWS Lambda へ移行してみた　EventBridge編

#昨日の記事からの続きとなります。
https://qiita.com/hirockio2206/items/9129b5d541452c958bf8

https://qiita.com/hirockio2206/items/4f3d57ae8291bad31004

◆事前準備編◆
　1.macOSのデスクトップにtempフォルダを作る
　2.tempフォルダにccxtをpip3でインストールする
　3.既に作ったpythonプログラムを lambda_function.py へリネームしてtempフォルダに入れる
　4.lambda_function.py の先頭に指定プログラムを追記する
　5.ターミナルでzipでまとめる

◆Lambda編◆
　6.AWSへログインし、5をアップロードする

◆EventBridge編◆
　7.EventBridge (CloudWatch Events)に定期実行ルールを登録する

####今回は7の説明をします。

#手順
####7.EventBridge (CloudWatch Events)に定期実行ルールを登録する
7-1.AWSのマネジメントコンソールヘログインします。
https://aws.amazon.com/jp/console/

7-2.上部の検索バーに　Lambda　と入力します。Lambda　をクリックします。
7-3.手順6で作成した関数をクリックします。
7-4.[＋トリガーを追加] をクリックします。
![スクリーンショット 2021-09-17 17.40.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/19131512-75f9-6d4e-ba3b-0193056a533c.png)
7-5.[トリガの設定] で　[ EventBridge ]と入力します。
![スクリーンショット 2021-09-17 17.41.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/913315dd-99fa-51d7-79f6-1532ffa171fd.png)
7-6.[新規ルールの作成] を選択し、ルール名に任意の名前を入力します。(例：everyday_1H)
スケジュール式にcron形式で実行タイミングを記載します。
今回は1H毎に毎日Pythonを実行して欲しいので、以下のように書きます。


```
cron(0 * ? * * *)
```

最後に[追加]をクリックすると完成です。
![スクリーンショット 2021-09-17 17.54.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/7097be19-d1fc-147b-0736-839f4664b8d5.png)

####cronの書き方
以下に公式の記載がありますが、英語なのでよくわからんって人向けにサンプルを記載します。

https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html

|Minutes 分|Hours 時間|Day of month 何日|Month 月|Day of week 曜日|Year  年|Meaning  意味|
|---|---|---|---|---|---|---|
|0  |10  |*  |*  |?  |*  |毎日AM10時に実行  |
|15  |12  |*  |*  |?  |*  |毎日PM12:15に実行  |
|0  |18  |?  |*  |MON-FRI  |*  |毎週月〜金PM6時に実行  |
|0  |8  |1  |*  |?  |*  |毎月1日AM8時に実行  |
|0/15  |*  |*  |*  |?  |*  |15分毎に実行  |
|0/5  |8-17  |?  |*  |MON-FRI  |*  |毎週月〜金AM8時〜PM5時55分まで5分毎に実行  |

#最後に
いかがでしたでしょうか。定期実行されましたでしょうか。
cronの書き方はくせがあるので、上記を見て理解して頂ければと思います。

PythonをAWSへ移行するまでを３つの記事で解説しました。
今日から私のオンプレmacOSはクラウドリフトされ、本番機からPython開発機となりました。
ご参考になれば幸いです。
freenomのドメイン延長方法

# 無料ドメインfreenom
無料のドメイン(.tk/.cfなど)を発行できるサイト
https://www.freenom.com/

## ドメインの追加方法
サインインしたら
Servicesから「Register a New Domain」を選択。
名前を入力して空いてればFreeと出る
国ドメインの候補は以下の通り
.tk/.ml/.ga/.cf/.gq

空いてれば「Get it Now」をクリックする。
しばらくすると「Selected」と変わるので
「Checkout」をクリックする。

ドメインとIPアドレスを紐付したら完了。

## 期限の延長方法
Servicesから「Renew Domains」を選択。
有効期限の14日以内でないと延長できないらしい。
「Renew Thid Domain」をクリック

延長する期間を選べるので「12 Monthes @ FREE」を選んで「Order Now」をクリック。

https://xblood.hatenablog.com/entry/2017/12/31/232441