OmniAICreator/Qiita-1.07M huggingface dataset:
【TidalCycles】when関数の使い方

# はじめに

公式ドキュメントのConditionsのページを見ると、`every`や`when`, `whenmod`などのサイクル数を指定してそのときのエフェクトなどを設定する関数の説明と、その具体例が載っています。

http://tidalcycles.org/docs/reference/conditions/

# when関数の基本的な使い方

他の関数についての説明はわかりやすかったものの、個人的にHaskellの知識が浅いこともあってwhen関数の例の理解に時間がかかったのでまとめておきます。

まずwhen関数の型定義は以下です。

```haskell
Type: when :: (Int -> Bool) -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a
```

この`(Int -> Bool)`部分は、`Int`を引数として`Bool`を返す関数を設定してあげればいいので、たとえば`>=2`などが使えます。ちなみにこの`Int`とは**サイクル数**のことを指しているので`>=2`と設定すると「サイクル数が2以上のとき」という意味になります。

具体的にはこんな感じにかけます。


```haskell
do
  resetCyclesTo (-0.05)
  d1 $ when (>=2) (|> speed 2) $ s "notes:2*2 house:5*3"
```

サイクル数が2以上になると、speedが2となるので音程が1オクターブあがるのがわかると思います。

ちなみに`resetCyclesTo`関数については以下の記事を参照してください。`resetCyclesTo (-0.05)`で「0サイクル目から再生」という意味になります。

https://qiita.com/s2hap/items/88ab4ebb45882f7b339d

# when関数のドキュメントでの具体例

公式ドキュメントでは以下の例が記載されています。これは、「サイクル数文字列に数字の4が含まれている場合、striate 4エフェクトを適用」する、という意味になるのですが、自分はなぜこの意味になるのかわかっていませんでした。(.showってなんだ？？となってました)

```haskell
d1 $ when ((elem '4').show) (striate 4) $ sound "hh hc"
```

結論からいうと`(elem '4').show`は合成関数で、引数x(Int)に対して、

```haskell
elem '4' (show x)
```

という意味になります。いま引数xはIntなので、これをshow関数によって文字列化した後、elem関数の処理が走るわけです。

ちなみになぜこんな記法になっているかというと、数学における合成関数の書き方が

```
f(g(x)) = f∘g(x)
```
のように`∘`でカッコを省略表現されるのと同じように、`∘`の代わりに`.`を使っている、といった感じなようです。

ためしに

```haskell
elem '4' (show 14)
```

などのようにしてTidalCycles上で実行してみるとコンソールにTrueが返ってくるはずです。

# エフェクトの合成

合成関数を使えばエフェクトも複数重ねられます。例えば

```haskell
d1
  $ every 4 (jux rev . fast 2 .(# speed 1.5))
  $ s "notes:2*2 house:5*3"
```

とすれば、4サイクルに1回`juc rev`, `fast 2`, `# speed 1.5`のエフェクトを同時に実行できます。
React 入門道場　~ファイル構成~

# 環境構築未実施の方

前回、Create React Appで作成したファイル構成について解説をしたいと思います。
環境を構築されていない方はこちらをご活用して下さい。

https://qiita.com/kinoshitaken123/items/323978fc9f70fc9218ea

# ファイル構成
![スクリーンショット 2021-08-21 1.19.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1572216/3553f97a-5a0c-4cac-cc75-a4b315f23b51.png)

# build
* 本番用ファイルが格納される
* npm run buildコマンドが生成される

__主にデプロイする際に関わってきます__

# public
* 静的ファイルが格納される
* HTMLファイルや画像ファイルを格納

# src
* 開発用ファイルが格納
* React コンポーネントのJSXファイル格納

***
簡単ではございますがファイル構成についてまとめて見ました。

>参考
https://www.youtube.com/watch?v=Ym4If5W9SS0&t=965s
正規表現の結合規則メモ

正規表現を書いているときに、選択子と量指定子の結合規則について混乱することがあるのでメモ。（用語が正確かはアヤシイ・・）

※括弧`()`を使うとマッチ結果の参照時に影響を与える恐れがあるので注意。

----
`aa|bb` は  
`a(a|b)b`
 ではなく、`(aa)|(bb)` 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/4f2dad43-0545-d8a9-dae2-7ecac49fa998.png)
----
`ab+` は 
`(ab)+`
 ではなく、 `a(b+)`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/c266b4e3-4a34-f0d4-a7ff-2d6af5ccb18b.png)
----
追記：
文字列を数式（和、積、指数）でとらえると覚えやすいかも。
`aa|bb`　・・・　$aa+bb$
`ab+`　・・・　$a\cdot b^n$

# 参考サイト
正規表現チェッカ https://regexper.com/
実行時間長いSOQLはBulk2.0を使う

###・要件
Salesforceのデータローダーでコマンドで出力するとき、SOQLの実行時間は120秒のがバナー制限があるので、長いSOQLはどうやって実行できますか
###・対応案
Dataloaderをやめて、別の案を考えられます。
例：Bulk API 2.0
※アマゾンのappFlowはできるかもしれない


###・実装案１　WorkBench
#####SOQLをPostする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/0e59dfcd-721c-7385-9108-706663b8d4dd.png)

#####ジョブ実行は完了しているかをチェックし、完了したら、結果をGetする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/72a7d910-bb1e-3b1f-e74a-4c3d4e2875e4.png)

###・実装案２　Curlでコマンド実行
#####Curlのインストール
https://qiita.com/kuni0219/items/91687b590a12d38cf383

#####Tokenを取得
下記の記事より、コネクタAPPを作成し、コンシューマーキーとSecretを取得し、Tokenを取得する
https://qiita.com/shinura/items/8f5782a251ca28d3167f

あとTokenを使って、Soqlを発行し、結果を取得する
※取得例

```
curl -X GET "https://gml2-gfuture-dev-ed.my.salesforce.com/services/data/v51.0/jobs/query/7502v00000a3Xd1AAE/results" -H "Authorization: Bearer 00D2v000001vTfF!ARcAQIRxrfrfPEx2AbtYWPSUxWIQD8DtxM3qMHG_w6mriywdjGAcKkjI9.H9vkglzqbHBsVUCtN1RZPHS5Zz_dMav56UwyF4" -H "Content-Type: application/json"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/48468252-fdb5-a549-4306-5281ed8bcf75.png)
Git 変更した差分を確認する

##１．git addする前の差分を確認する
変更したファイルをaddする前の差分を確認するにはgit diffコマンドを使用する

```
% git diff
```

ファイル名を指定すると指定したファイルの差分が表示される。

```
% git diff　test.html
```

##２．git add後の差分を確認する
ステージとリポジトリの差分を確認するにはオプションに--stagedを使用する

```
% git diff　--staged
```
orderByとwhereを併用時にエラー(cloud_firestore)

## orderByとwhereを併用時にエラー(cloud_firestore)
```dart

// 5日前の日付を設定
range = DateTime.now().subtract(Duration(days: 5));
snapshots = FirebaseFirestore.instance
.collection('books')
// 5日以内のデータ
.where('createdAt', isGreaterThanOrEqualTo: range)
.orderBy('score', descending: true)
```

複合インデックスで
createdAtをdescending, scoreをdescendingにしてもうまくいかなかった。

###解決策
```dart
range = DateTime.now().subtract(Duration(days: 5));
snapshots = FirebaseFirestore.instance
.collection('books')
// 5日以内のデータ
.where('createdAt', isGreaterThanOrEqualTo: range)
//追加
.orderBy('createdAt',descending: true)
.orderBy('score', descending: true)
```

なぜうまく行ったのかようわかりません(笑)
(参考): https://stackoverflow.com/questions/66829643/cloud-firestore-inequality-operator-exception-flutter
awscliの導入と認証キーの登録

# 概要
AWSで開発をするにあたりaws-cliというものがあるとのことで導入してみる

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

# install
brewでaws-cliをインストールする

```
$ brew install awscli

$ aws --version
aws-cli/2.2.31 Python/3.9.6 Darwin/20.5.0 source/x86_64 prompt/off
```

# 認証キーを導入する

過去の記事ではIAMユーザーの認証キーを記載したファイルを直打ちで作成したが、aws-cliのコマンドでも作成が可能とのことで作成する

https://qiita.com/kazato110tm/items/59d4a780d2262ab96aaa

```
$ aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

上記実行すると`~/.aws`配下に下記のファイルが作成される

```
$ cat ~/.aws/credentials
[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

$ cat ~/.aws/config
[default]
region = ap-northeast-1
output = json
```

これでterraformでの環境構築も引き続き問題なく行える

# aws-cliのコマンドを実行してみる

一例としてec2の一覧を出すコマンド
現状ec2は1つも起動していなかったためこのような結果に

```
$ aws ec2 describe-instances
{
    "Reservations": []
}
```

検証として東京リージョンでec2インスタンス(Name: test-server)を作成すると

```
aws ec2 describe-instances --query "Reservations[].Instances[].Tags[]"
[
    {
        "Key": "Name",
        "Value": "test-server"
    }
]
```

一覧取得ができた
ギルドマスター「この石板に手を置いてください。―――目の前に浮かび上がったそれがあなたのプログラミングスキルです。」

そんな便利なものがあれば技量の共通認識が可能ですが、無いので自己スキルを表現できるシミュレータっぽいものを作ってみた。

[https://beta.jpn.org/skill/](https://beta.jpn.org/skill/)

# コンセプト

- 学習したプログラミング言語の習熟度を表現できるもの
- プログラミング言語が増える一方なので全体を俯瞰できるもの
- ゲームなんかでキャラクターをどう育成するか考えるのは楽しかったりするので、シミュレータぽいもの

# 使用方法

- 自分が学習したプログラミング言語に該当する画像をクリックしてLv.1を獲得します
- 表示されたバーをクリックして習熟度を10段階で調整します
- ページ下部に生成されるURLを共有します

著者の場合、下のようなURLから参照できます。

https://beta.jpn.org/skill/?s=eJx9i2EKgGAIQ92c1P1P7OQDo370BJn6DBLChTtMafrymvKJ5Zw6G4bIvYBH8yddP4z3FRoh0wBa&p=eJwVyiEOgzAUh_ELPcG6Tew-gCIjISFY2seWoDAkoMBgECQIBDTLLvNvM8sR2v3MZ778GUZZnKQFXQIye2m0_k1f-36BO_ACtYJn8AD-0Dn2rd_EjR4eXcW_dLfHBtlA1ZCVA4A6KGU=
（我ながら何を目指しているのだろう。）

[カンストっぽく](https://beta.jpn.org/skill/?s=f&p=eJxlyjEOQFAQRdENzQZmP6iERCL6eY2WRjdqEolWYjX_bcAS5tNqTnFz-6You6puB1FVoV3ETUyfC3HQTmIjPBd51nl_v3z-TaMH_mAj3A==)させて遊んでみたり、どれを学習するか考えたりします。

# コメント

- ~~JSONをbase64変換しているだけなのでURLが長い（パス長の限界が来る）~~
- 字数制限がある場合は短縮URLサービスの利用が必須
- 数値に基準がないので、すべて自己判断です
- HP/SPバーが100%を超えて枠を突き抜けるのは仕様です
- 永久betaテスト

# 2021/8/24追記

![スクリーンショット 2021-08-24 124401.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561682/74309e34-1bdc-63b3-d374-664ac2477e23.png)

underflow「ギルマス！なんかトレンド入りしてるんですが！」
ギルドマスター「それだけのあなたにはスキルがあるということです。あなたならこのクエストもこなせるでしょう。」

～～～クエストが発生しました～～～
　機能を追加してアップデートせよ
～～～～～～～～～～～～～～～～～

# あとがき

自己プロフィール用に作ったものを簡単に紹介したつもりだったんですが、こんなにも沢山の方に見て頂けるとは思いもしませんでした。
プログラミングの世界は広く、日進月歩で進化しています。これは身に着けて置いて当たり前だと言われているようなスキルは、勉強しつつシミュレータにも追加して行きたいと思っています。

今のところ、プログラミングとって重要なフレームワークやライブラリは追加したいと考えています。
（C#,F#,VBの.NET、RubyのRails、JavaScriptのAngularやReact、Vueなど）
日曜プログラマー的に作ったものなので気長に見てもらえればと思います。

# 2021/9/5追記

C#,F#,VBの.NET、RubyのRails、JavaScriptのAngularやReact、Vueなどを追加しました。
また、更新情報を発信できるようにtwitterアカウント取りました→~~https://twitter.com/underflow_ss~~
（2024/8/18〜）https://x.com/hal3i50
あなたのデザインがダメな理由

本記事では、視覚認知科学に基づいて、ユーザーフレンドリーなデザインについて考えたいと思います。


### `追記：下書きを間違って公開してしまいました。途中から整合性が取れないですがご了承ください。`


# デザインは説明的でなければならない
まずはこのフォームをご覧ください。
どう感じますか？

|![before1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650663/7544a34c-d5a7-b88d-85b9-0c4372bff1b7.png)|
|:--|


次にこちらのフォームをご覧ください。
こちらはどう感じますか？


|![アセット 2-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650663/c30b2a7d-532c-a4f9-17bb-7d4813266e36.png)|
|:--|

後者は「見やすい」「わかりやすい」と感じたはずです。
反対に、前者はおそらく「見にくい」「わかりにくい」と感じたはずです。

**ではなぜ「見にくい」「わかりにくい」のでしょうか？** 
結論から言うと、このスライドは**「説明的でない」**からです。

**人は無意識に規則性を探します。**[^1]
順を追って説明します。

### バッジ・ボタンの色

|![before2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650663/48db2395-aacf-0f50-3569-72e24875ba8d.png)|
|:--|

このフォームを見た時に、
ユーザーは、「青色の四角形」に関して以下の様な説明を定義することを考えます。

`青色の四角形の説明`
**各記入欄のタイトルの文末にある「青色の四角形」は、「ユーザーに対する注意を促すバッジ」である**

しかしながら、
フォーム末尾にある送信ボタンは上記の定義に反することになり、
送信ボタンを**「説明できない」**ことになります。

**「ユーザーに対するアラートのバッジ」**と、
**「ユーザーがイベントをトリガーできるボタン」**は、
**機能**が全く異なるものなので、**説明（デザイン）**も変えましょう。

`緑色の四角形の説明`
**縦一列に並んだ「緑色の四角形」は、「ユーザーに対する注意を促すバッジ」である**

`青色の四角形の説明`
**「青色の四角形」は、「イベントトリガー」である**

### インデントが不規則

|![スクリーンショット 2021-08-21 22.21.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650663/12cbe082-aa8a-f713-fb7d-278f7d843a45.png)|
|:--|

「アプリの概要」では、文頭にインデントがあり、まずこの時点でユーザーは、

「見出し以下の文章はすべてインデントされる」

という規則を考えますが、すぐに次の行で棄却され、

「見出しの下の一文はインデントされる」

という定義を考えつきます。
しかしこれもまたすぐに「問題」という見出しのところで棄却されることになります。

「見出し以下の文章はインデントなしで始まる」

というシンプルな規則に統一しましょう。

### 良いスライド

規則を定義し、**説明的なデザイン**にすると以下の様になります。
ずいぶん見やすくなりませんか？

|![スクリーンショット 2021-08-21 22.55.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650663/84ec6474-251e-e73b-9e94-d62bfb24858c.png)
|:--|

以下が説明のリストです。

- 文書のタイトルは一番大きい
- 各見出しは2番目に大きい
- 見出し以下の本文はインデントなし
- 箇条書きは「・」
- 意味の単位ごとに改行
- 1単位の意味に関して箇条書きを用いて詳細を記述
- リンクは青文字
- 本文は見出しに関係

説明は長くなりすぎない様に気をつけてください。
長くなりすぎるとユーザーが規則を覚えられなくなります。

記事では省略しましたが、このドキュメントになるまでに、以下の修正を加えました。

- 文書タイトルを一番大きいサイズに変更
- 「問題」という見出しの大きさを他の見出しの大きさに揃える
- 「環境」と「問題」の間にあった改行を削除
- 複数の行を箇条書きに変更
- 複数の改行を削除
- リンク部のアンダーラインを削除
- 「アプリURL」「github」を「アプリの概要」に移動

気づけたでしょうか？

# おわりに

よく「シンプルなデザインを心がける」等のメソッドがインターネットに落ちていたりしますが、
**「説明的なデザイン」を心がけた結果「シンプル」になるものです。**[^2] [^3]

- なぜその色を使うのか
- なぜその記号を使うのか
- なぜそこにスペースを入れるのか
- なぜそこに罫線を入れるのか

などを意識しつつ、「説明」が膨大にならない様に気をつけ、普段のクリエイティブに活かしてみてください。


[^1]: [Binding Problem](https://en.wikipedia.org/wiki/Binding_problem)
[^2]: 参考記事：[デザイン提案に説得力を持たせる6つのステップ](https://baigie.me/sogitani/2015/08/design-presentation/)
[^3]: 参考記事：[結局のところ、UI/UXって何ですか？vol.2](https://www.td-media.net/interview/what-is-ui-ux-vol-2/)
【初心者向け】ローカル変数とグローバル変数


今回も初心者向けに分かりやすく書いていきたいと思います！！

#変数とは
数値や文字列などのデータを格納するための箱のようなもの。
この変数という箱にデータを入れておくことで、あとから必要な場所で格納したデータを利用することができます。

#ローカル変数とは
関数の中で宣言した変数で、決められた範囲内（原則その関数内）でしか参照することができません。

```php:php
<?php
function 関数名();
{
  $ローカル変数名 = 値;
  echo $ローカル変数名;
}
関数名();
?>
```

#グローバル変数とは
関数の外部で宣言した変数で、プログラムのどこからでも参照することができます。
グローバル変数を関数の中で使いたいときは、関数内に「global $変数名 ;」と記述して、グローバル変数を宣言しなければなりません。

```php:php
<?php
$グローバル変数名 = 値;
function 関数名()
{
  global $グローバル変数名;
  echo $グローバル変数名;
}
関数名();
?>
```

#おわりに
一般的にはローカル変数が使われており、グローバル変数は、プログラミング全体で使い、かつ、処理の中でも書き換えないような初期設定であったり、環境変数をあらかじめ設定しておきたいときなど、必要な場合にしか使われません。
AWS Transit Gateway とは

## 勉強前イメージ

VPCとVPNつなげる的なやつ

## 調査

### AWS Transit Gateway とは

中央ハブを介してVPCとオンプレのネットワークを接続するクラウドルーターの役割をします。
ネットワークが簡単になり、複雑なVPCの接続をしなくて良くなります。

### AWS Transit Gatewayのメリット

- 簡単に接続

クラウドルーターとして機能し、アーキテクチャを簡素化します。
グローバルアプリケーションを構築する場合リージョン間ピア接続を使用して
Transig Gatewayを接続できます。
また、トラフィックを複数のパスに負荷分散させることで帯域を広げることが出来ます。

- 可視性と制御の向上

AWS Transit Gateway network managerを使用すれば
VPCとエッジ接続を中央コンソールから監視できます。
問題を素早く特定し、イベントに対応するのに役立ちます。

- セキュリティの向上

VPCとAWS Transit Gateway間のトラフィックはパブリックインターネット上に公開されません。
リージョン間ピア接続は、単一場外店や帯域のボトルネック無しでトラフィックを暗号化します。

- 柔軟なマルチキャスト

AWS Transit Gateway マルチキャストサポートは
同じコンテンツを複数の送信先に配信します。
これによってオンプレのマルチキャストネットワークが不要になります。

- 統計やログ

AWS Transit GatewayではcloudwatchやVPCフローログで
VPC,VPN接続間での帯域の使用率やパケットフロー数など確認することが出来ます。


## 勉強後イメージ

AWSの特定のVPCとオンプレをVPN接続したり、
他のリージョンのVPCを接続したり、ハブ化することができるのか。。。
確かにAWS オンプレの構築にはべめっちゃ便利・・・

## 参考

- [AWS Transit Gateway](https://aws.amazon.com/jp/transit-gateway/?whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc)
- [AWS Transit Gateway にざっくり触れる【初心者](https://recipe.kc-cloud.jp/archives/16886)
停止しないbotの作り方

# 概要
botと言っても色々ありますが、今回は株式・仮想通貨の自動売買やギャンブルの自動投票などのbotを作っている人向けの話です。

やったことある人は分かると思いますが、こういったプログラムは、通信状況の悪化だったりページの遷移の遅延など、色々な理由でよく止まっちゃいます。
(公開APIを用いたものではなく、seleniumなどのスクレイピングツールを使用する場合は特に)

これが理由で損失が出ると悲しいので、なるだけ停止しないように対策をする必要があります。
ということで今回はpythonを用いて、停止しないbotを実装したいと思います。

# 方針と実装
方針としてはシンプルに、**一定時間ごとにbotが正常に動いているかどうかを監視する**というものです。
実装方法も簡単で、**botの起動プログラムを実行しているprocessのステータスを定期的に取得し、停止していれば再起動をかけるようにする**、という流れです。

ということで、早速スクリプトを書いてみます。`subprocess`というモジュールを使います。
前提として、botを起動するスクリプトはあるものとします(下のスクリプト中の`hoge_bot.py`)。

```python
import argparse
import pandas as pd
import time
import subprocess


def main(check_interval=150):
    """
    * 一定時間ごとにプロセスが動いているかどうかを確認するよ
    * 引数の`check_interval`で確認の間隔(秒)を指定できるよ(デフォルトは150秒)
    * `subprocess.Popen.poll()` で特定のプロセスのステータスコードを見れるよ.
      - None >> 実行中
      - 0 >> 正常に終了
      - 1 >> 一般的なエラーで終了
    """
    cmd = f'python hoge_bot.py' # botを起動するプログラムを実行するコマンド
    proc = subprocess.Popen(cmd, shell=True) # ここでbot実行のプロセスを立ち上げる
    iter_num = int(12 * 3600 / check_interval) # 12時間監視し続けるように繰返しの回数を設定
    for _ in range(iter_num):
        if proc.poll() is None:
            print('still working') # ちゃんと動作していれば何もしない
        else:
            proc.kill()
            proc = subprocess.Popen(cmd, shell=True) # 止まっていれば再起動する
            print('rebooted')
        time.sleep(check_interval)
    print('ended')


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-ci', '--check_interval', type=int, default=150)
    args = parser.parse_args()
    main(args.check_interval)

```

`subprocess.Popen`でプロセス自体をオブジェクトとして受け取れるのは面白いですよね。

というわけで、今回は停止しないbot (正確にいうと停止しても大丈夫なbot)の作り方を自分なりに考えてみました。
今後bot作成に挑戦する際には、ぜひ参考にしてもらえると嬉しいです。
Debian 11 にOpenJDK 17をインストール（OS標準）

# はじめに

Debian11にOpenJDKを標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

また[Debian7の事例](https://www.debian.org/News/2016/20160425.ja.html)のようにOSがEOLを迎えるまでは[Debian Javaチーム](https://java.debian.net/)が保守する可能性が高いと思われる。

// OpenJDKの保守状況は20210821時点では不明、というかGeneral Availabilityは来月の予定なので現時点ではいるのは17-ea (Early-Access)

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update;apt install -y openjdk-17-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "17-ea" 2021-09-14
OpenJDK Runtime Environment (build 17-ea+19-Debian-1)
OpenJDK 64-Bit Server VM (build 17-ea+19-Debian-1, mixed mode, sharing)
```
基本情報技術者試験勉強0821

本日の積み上げ結果
基本情報技術者試験勉強
平成23年春過去問
平成23年秋過去問
平成24年春過去問
間違えた問題の復習
AWSの本を読む

ファンクションポイント法　外部入出力や内部論理ファイル，照会，インタフェースなどの個数や特性などから開発規模を見積もる。

ドローソフト　図形や線などを部品として，始点，方向，長さの要素によって描画していく。また，これらの部品の変形や組合せで効率的に図形を描画していくことができる。

組込みシステムでリアルタイムOSが用いられる理由　期待される応答時間内にタスクや割込みを処理するための仕組みが提供される。

著作権法に照らして適法な行為　経済白書の記載内容を説明の材料として，出所を明示してWebページに転載する。

企画プロセス　システム化計画の立案。

データディクショナリ　DBMSが管理するデータ，利用者，プログラムに関する情報，及びそれらの間の関係を保持するデータの集合体。

BPMの目的　企業の業務プロセスの継続的な改善。

メモリインタリーブ　主記憶を複数の独立したグループに分けて，各グループに交互にアクセスすることによって，主記憶へのアクセスの高速化を図る。

RFIDタグの特徴　電磁波を用いて情報を非接触で読み取る。

情報システムの調達の際に作成されるRFI説明　システム化の目的や業務内容などを示し，ベンダに情報の提供を依頼すること。

XML 	利用者独自のタグを使って，文書の属性情報や論理構造を定義することができる。

アンチエイリアシング　液晶ディスプレイなどの表示装置において，傾いた直線を滑らかに表示する手法

UML 業務プロセスのモデリング表記法として用いられ，複数のモデル図法

フェールソフト　クラスタ構成のシステムにおいて，あるサーバが動作しなくなった場合でも，他のサーバでアプリケーションを引き継いで機能を提供する。

BCP 事業中断の原因とリスクを想定し，未然に回避又は被害を受けても速やかに回復できるように方針や行動手順を規定したもの。

リグレッションテスト　ソフトウェアのテストの種類のうち，ソフトウェア保守のために行った変更によって，影響を受けないはずの箇所に影響を及ぼしていないかどうかを確認する目的で行うもの。

プログラミングの信頼性の監査　プログラマは，プログラムの全てのロジックパスの中から，サンプリングで単体テスト項目を設定している。

MRP(Material Requirements Planning)システムを導入すると改善が期待できる場面　製造に必要な資材及びその必要量に関する情報が複雑で，発注量の算出を誤りやすく，生産に支障を来している。

実体関連ダイアグラム　エンタープライズアーキテクチャを構成する四つの体系のうち，データ体系を策定する場合の成果物。

RFIDの活用事例　微小な無線チップによる人又は物の識別及び管理

組込みシステムのプログラムを格納するメモリとして，マスクROMを使用するメリット　出荷後のプログラムの不正な書換えを防ぐことができる。

マーケティングミックスの説明　製品戦略，価格戦略，チャネル戦略，プロモーション戦略などを適切に組み合わせて，自社製品を効果的に販売していくこと。

静電容量方式タッチパネル　タッチパネルの表面に電界が形成され，タッチした部分の表面電荷の変化を捉えて位置を検出する。

ディレクトリトラバーサル攻撃　管理者が意図していないパスでサーバ内のファイルを指定することによって，本来は許されないファイルを不正に閲覧する。

情報戦略の立案時に，必ず整合性をとるべき対象　中長期の経営計画

ポリゴン　閉じた立体となる多面体を構成したり，2次曲面や自由曲面を近似するのに用いられたりする基本的な要素。

関係データベース管理システム(RDBMS)におけるビューに関する記述　ビューとは，名前を付けた導出表のことである。

マルチコアプロセッサ　消費電力を抑えながら，プロセッサ全体の処理性能を高められる。

DBMSにおけるログファイル　データベースの回復処理のため，データの更新前後の値を書き出してデータベースの更新記録を取ったものである。

CPUのプログラムレジスタ(プログラムカウンタ)の役割　命令を読み出すために，次の命令が格納されたアドレスを保持する。

Webサービスを利用するときのSOAPの役割　Webサービスの送受信プログラム間で， XML形式のメッセージを受け渡す。
Debian 11 にOpenJDK 11をインストール（OS標準）

# はじめに

Debian11にOpenJDKを標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

[Leadership of OpenJDK 8 and OpenJDK 11 Transitions to Red Hat](https://www.redhat.com/en/about/press-releases/leadership-openjdk-8-and-openjdk-11-transitions-red-hat) と [Red Hat Enterprise Linux Life Cycle - Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/errata)を考慮すると、RedHatによるOpenJDKの保守が続く限り、その上流のOpenJDK Project側の保守も続くと思われる。

また[Debian7の事例](https://www.debian.org/News/2016/20160425.ja.html)のようにOSがEOLを迎えるまでは[Debian Javaチーム](https://java.debian.net/)が保守する可能性が高いと思われる。

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update;apt install -y openjdk-11-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "11.0.12" 2021-07-20
OpenJDK Runtime Environment (build 11.0.12+7-post-Debian-2)
OpenJDK 64-Bit Server VM (build 11.0.12+7-post-Debian-2, mixed mode, sharing)
```
大量にメールを自動で送付する

メールを大量送付できます。
recaptchaが出たときは回避できないので、手動でチェックした後に実行してください。

```mail.py
from bs4 import BeautifulSoup
import urllib.request
import re
from time import sleep
from bs4 import BeautifulSoup
from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import csv
import time
import datetime

# URL関連
#ログインIDとパスワード
address = ""
password = ""

#クロームをヘッドレスモードにする
options = Options()
#options.add_argument('--headless')
#開くURL
url = "https://m.kuku.lu/"
#クロームドライバーの指定とオプション
driver = webdriver.Chrome(executable_path="C:\code\python\chromedriver.exe", chrome_options=options)
# ログインページを開く
for num in range(100):
    driver.get(url)
    sleep(5)

    # ログオン処理
    # ユーザー名入力
    driver.find_element_by_id("link_addMailAddrByAuto").click()
    #print(driver.current_url)
    sleep(5)
    driver.find_element_by_id("link_newaddr_newmail").click()
    sleep(5)
    driver.find_elements_by_class_name("noborderinput")[0].send_keys(address)
    driver.find_elements_by_class_name("noborderinput")[1].send_keys("メール件名")
    driver.find_element_by_xpath('//*[@id="area_sendbutton"]/div/input').click()
    sleep(1)
    driver.find_element_by_id("area-confirm-dialog-button-ok").click()
    try:
        wait = WebDriverWait(driver, 30)
        wait.until(EC.alert_is_present())
        alert = driver.switch_to.alert
        print(alert.text)
        alert.accept()
    except TimeoutException:
        print("アラートは発生しませんでした")
    except Exception as e:
        print(e)
```
WSL2でPython3がブロックされていた時の対処法（自分用）

# 問題
1. WSL2で`python3 get-pip.py`を走らせても反応がない
2. `sudo apt install python3-pip`で無事インストールさせるも、`pip3 install xxx`が動かない
2. `pip3 install xxx --verbose`をしても、同じく何のアウトプットもない

# 解決方法
Windows ファイアウォールを**一時的**に無効化してみたら、通常通り動いたのでどうやらWSL2上でのPython3がブロックされているみたい。とりあえず、`\\wsl$\Ubuntu\usr\bin`からPython3.8を見つけ、Windows ファイアウォールで許可するも結果は変わらず。

結局、WSL2のDNS設定を変えたら直った。

## 手順
### 1. `/etc/resolv.conf`の自動生成を無効化する

`/etc/wsl.conf`をsudoで開き（ない場合は作成）、以下に書き換える。

```
[network]
generateResolvConf = false
```
### 2. WSL2を再起動する

Powershellを開いて`wsl --shutdown`。

### 3. `/etc/resolv.conf`を書き換える
まず`sudo rm /etc/resolv.conf`で今あるソフトリンクを消す。

新しく`/etc/resolv.conf`を作成し、

```
nameserver x.x.x.x
```
に書き換える。`x.x.x.x`の部分は自分のWindowsのDNSサーバに置き換える。

探し方はPowershellで`ipconfig /all`と打ち、

```
DNS Servers . . . . . . . . . . . : xxx.xxx.xx.x
```
の様な行を見つける。

### 4. もう一度WSL2を再起動する

2.と同じ手順。

# 参考
https://github.com/microsoft/WSL/issues/4020
https://superuser.com/questions/1533291/how-do-i-change-the-dns-settings-for-wsl2
Power Automate Desktop (無償) のフローを共有する

# 前提
本来、Premium版を利用しないと共有すらも出来なくなってると思われる Desktop Flow です。
とはいえ、共有したいことがありますよね？ってことで、現時点(2021/8/21)で出来た方法を共有まで

# 概要
1. Desktop Flow編集中に、コピー＆ペースト
1. Power Automate で共有（ただ、バグっぽいので、そのうちMSが止めてくると予想されます）

# Desktop Flow編集中に、コピー＆ペースト
普通にコピペが出来ます。
![Copy＆Paste.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/2a4eed0a-66f8-a923-8dbb-87c4cbf635d7.gif)
コピー内容をテキストエディターで編集することも可能

```sql:Loop
LOOP LoopIndex FROM 0 TO 10 STEP 1
    Clipboard.SetText Text: LoopIndex
END
```
ただし・・
- タブ単位でしかコピーできない為、サブフローを作成しているとコピペが大変

とはいえ robin が分かれば、編集も可能

https://speakerdeck.com/asahi_k2/power-automate-desktopfalsenei-bu-yan-yu-robinnituite?slide=17

# Power Automate で共有
:::note warn
警告
恐らく抜け穴的な共有なので、今後使えなくなる可能性が高いので注意。
:::
1. Solutions を追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/b93794e1-0d6a-02d5-f3c6-b4f40e6de71d.png)
1. 追加したSolutionにて、Desktop Flow を追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/c5bc90a9-f456-79dd-e4ca-73711d6958f2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/d16b3f79-4633-7fba-4337-8aad1c7e1c93.png)
1. 追加した Desktop Flow の名前をClickして、Web上でのFlow の Edit 画面へいけば、あとはShare するだけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/5d0953df-b595-96c5-7100-d62643b5846e.png)

## 補足
共有後の注意点
- Desktop Flow一覧には表示されないので、ShareしたURLから開く必要あり
- Desktop Flowコンソールでもこのままでは表示されないので、以下実施必要あり
    - ShareしたURLからEditで、Desktop Flow Editor を起動し、別名保存
    - Desktop Flow コンソールを再起動（別名保存を検知出来ない）

:::note warn
警告
MyFlows -> Desktop Flows にて一覧に見られないので、この流れで見れること自体がバグと想定
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/bfd66dc6-a63d-3786-e1ba-e16874aa155c.png)

# あとがき
会社環境でどう共有するかってところが課題だったんですが・・機能制約も多いので Premium 使えるようにはやくしたい・・
【Github】リポジトリを別のOrganizationに移行する方法

#解決したいこと
GitHubのOrganizationを使用して開発していたが、Ownerが飛んでしまったがOwnerがその方しか設定されておらずリポジトリ等の設定がなにもできない状態になった。
その為、今後の更新は見られないように別のOrganizationを作り、リポジトリを移行したい。

##必要な情報
・移行元GitリポジトリURL
・移行先GitリポジトリURL（空のリポジトリを作成しておいてください）

##手順
以下のリポジトリを例に解説します。
移行元：https://github.com/移行元Organization名/移行元リポジトリ名
移行先：https://github.com/移行元Organization先/移行先リポジトリ名

###① 移行元リポジトリをローカルにミラークローンする
```
git clone --mirror https://github.com/移行元Organization名/移行元リポジトリ名
```
###② ①でクローンしたフォルダに移動する
```
cd 移行元リポジトリ名.git
```
###③　ミラークローンしたものを移行先GitリポジトリへPUSHする
```
git push --mirror https://github.com/移行元Organization先/移行先リポジトリ名
```

ローカルPCに持ってきたリポジトリを新リポジトリへPUSHします。
これで移動（コピー）が完了です。

##補足
移動が完了したら、ローカルにクローンしたファイルは削除して構いません。
（ファイルの物理削除でOKです。）
Debian 11 にNginx mainline最新版をインストール（公式repository）

# はじめに

公式repositoryを利用してDebian11にNginx mainline最新版をインストール
親記事：[Nginxの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/df4a0baaaad9c932ea30)
参考：[nginx: Linux packages](https://nginx.org/en/linux_packages.html#Debian)

## サポート

本手法で導入した場合、nginxの開発が停止するまでサポートされると思われる。
特定のバージョンを指定しなければ、mainline最新版が常に提供されると思われる。

## LOG

### レポジトリ登録

```shell-session
# apt update; apt install -y curl gnupg2 ca-certificates lsb-release debian-archive-keyring
# curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
# gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
gpg: keyblock resource '/root/.gnupg/pubring.kbx': No such file or directory
pub   rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
      573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid                      nginx signing key <signing-key@nginx.com>
# echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y nginx
... 略
```

### 各種確認

```shell-session
# which nginx
/usr/sbin/nginx

# nginx -v
nginx version: nginx/1.21.1

# apt show nginx
Package: nginx
Version: 1.21.1-1~bullseye
Priority: optional
Section: httpd
Maintainer: NGINX Packaging <nginx-packaging@f5.com>
Installed-Size: 3112 kB
Provides: httpd, nginx, nginx-r1.21.1
Depends: libc6 (>= 2.28), libcrypt1 (>= 1:4.1.0), libpcre3, libssl1.1 (>= 1.1.1), zlib1g (>= 1:1.1.4), lsb-base (>= 3.0-6), adduser
Conflicts: nginx-common, nginx-core
Replaces: nginx-common, nginx-core
Homepage: https://nginx.org
Download-Size: 879 kB
APT-Manual-Installed: yes
APT-Sources: http://nginx.org/packages/mainline/debian bullseye/nginx amd64 Packages
Description: high performance web server
 nginx [engine x] is an HTTP and reverse proxy server, as well as
 a mail proxy server.

N: There is 1 additional record. Please use the '-a' switch to see it
```
Debian 11 にNginx stable最新版をインストール（公式repository）

# はじめに

公式repositoryを利用してDebian11にNginx stable最新版をインストール
親記事：[Nginxの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/df4a0baaaad9c932ea30)
参考：[nginx: Linux packages](https://nginx.org/en/linux_packages.html#Debian)

## サポート

本手法で導入した場合、nginxの開発が停止するまでサポートされると思われる。
特定のバージョンを指定しなければ、stable最新版が常に提供されると思われる。

## LOG

### レポジトリ登録

```shell-session
# apt update; apt install -y curl gnupg2 ca-certificates lsb-release debian-archive-keyring
# curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
# gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
gpg: keyblock resource '/root/.gnupg/pubring.kbx': No such file or directory
pub   rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
      573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid                      nginx signing key <signing-key@nginx.com>
# echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y nginx
... 略
```

### 各種確認

```shell-session
# which nginx
/usr/sbin/nginx

# nginx -v
nginx version: nginx/1.20.1

# apt show nginx
Package: nginx
Version: 1.20.1-1~bullseye
Priority: optional
Section: httpd
Maintainer: NGINX Packaging <nginx-packaging@f5.com>
Installed-Size: 3098 kB
Provides: httpd, nginx, nginx-r1.20.1
Depends: libc6 (>= 2.28), libcrypt1 (>= 1:4.1.0), libpcre3, libssl1.1 (>= 1.1.1), zlib1g (>= 1:1.1.4), lsb-base (>= 3.0-6), adduser
Conflicts: nginx-common, nginx-core
Replaces: nginx-common, nginx-core
Homepage: https://nginx.org
Download-Size: 879 kB
APT-Manual-Installed: yes
APT-Sources: http://nginx.org/packages/debian bullseye/nginx amd64 Packages
Description: high performance web server
 nginx [engine x] is an HTTP and reverse proxy server, as well as
 a mail proxy server.

N: There is 1 additional record. Please use the '-a' switch to see it
```
Debian 11 にNginx 1.18 をインストール（OS標準）

# はじめに

Debian11にNginxを標準インストール
親記事：[Nginxの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/df4a0baaaad9c932ea30)

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y nginx
... 略
```

### 各種確認

```shell-session
# which nginx
/usr/sbin/nginx

# nginx -v
nginx version: nginx/1.18.0

# apt show nginx
Package: nginx
Version: 1.18.0-6.1
Priority: optional
Section: httpd
Maintainer: Debian Nginx Maintainers <pkg-nginx-maintainers@alioth-lists.debian.net>
Installed-Size: 104 kB
Depends: nginx-core (<< 1.18.0-6.1.1~) | nginx-full (<< 1.18.0-6.1.1~) | nginx-light (<< 1.18.0-6.1.1~) | nginx-extras (<< 1.18.0-6.1.1~), nginx-core (>= 1.18.0-6.1) | nginx-full (>= 1.18.0-6.1) | nginx-light (>= 1.18.0-6.1) | nginx-extras (>= 1.18.0-6.1)
Homepage: https://nginx.net
Tag: implemented-in::c, interface::daemon, network::server, network::service,
 protocol::http, role::program, use::proxying
Download-Size: 92.6 kB
APT-Manual-Installed: yes
APT-Sources: http://deb.debian.org/debian bullseye/main amd64 Packages
Description: small, powerful, scalable web/proxy server
```
数理計画（ひと休み①）

下記のツールで簡単だが数理モデルを作成してみた。
 ・EXCEL
 ・MATLAB
 ・LABVIEW
 ・python

下記はあくまでも私の主観です。
 
使用感としては、EXCELがわかりやすいが、大きな問題が解けない。
ただし、ゾルバを追加すれば可能でしょうが。

しかし実際に使用するとなると、プログラミング言語であるpythonが使用しやすい様に思った。

MATLABやLABVIEWなどは設計がしっかりしていないと大規模のモデルは難しいと感じた。

私の使用方法としては、labviewをメインとして、必要なときにpythonをフックするのがいいと思った。

まだ線形の簡単なモデルしか使っていないが、2次計画、非線形を使用するときはMATLABかな、もう少し使いやすければいいんだけど。
Debian 11 にPHP-FPM 7.4 をインストール（OS標準）

# はじめに

Debian11にPHP-FPMを標準インストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update -y;apt install -y php-fpm
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# which php-fpm7.4
/usr/sbin/php-fpm7.4

# php-fpm7.4 -v
PHP 7.4.21 (fpm-fcgi) (built: Jul  2 2021 03:59:48)
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.21, Copyright (c), by Zend Technologies

# apt show php-fpm
Package: php-fpm
Version: 2:7.4+76
Priority: optional
Section: php
Source: php-defaults (76)
Maintainer: Debian PHP Maintainers <team+pkg-php@tracker.debian.org>
Installed-Size: 13.3 kB
Depends: php7.4-fpm
Download-Size: 6424 B
APT-Manual-Installed: yes
APT-Sources: http://deb.debian.org/debian bullseye/main amd64 Packages
Description: server-side, HTML-embedded scripting language (FPM-CGI binary) (default)
```
Debian 11 にPHP 7.4 をインストール（OS標準）

# はじめに

Debian11にPHPを標準インストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update;apt install -y php
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 7.4.21 (cli) (built: Jul  2 2021 03:59:48) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.21, Copyright (c), by Zend Technologies

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc/php/7.4/cli
Loaded Configuration File => /etc/php/7.4/cli/php.ini

# apt show php
Package: php
Version: 2:7.4+76
Priority: optional
Section: php
Source: php-defaults (76)
Maintainer: Debian PHP Maintainers <team+pkg-php@tracker.debian.org>
Installed-Size: 13.3 kB
Depends: php7.4
Download-Size: 6340 B
APT-Manual-Installed: yes
APT-Sources: http://deb.debian.org/debian bullseye/main amd64 Packages
Description: server-side, HTML-embedded scripting language (default)
```
Debian 11 にMariaDB 10.5 をインストール（OS標準）

# はじめに

Debian11にMariaDB10.5をインストール
親記事：[MySQL, MariaDBの各種インストール方法とEOLまとめ \- Qiita](https://qiita.com/witchcraze/items/72291ee035437ec83273)

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y mariadb-server
... 略
```

### 各種確認

```shell-session
# service mariadb start
# mysql -u root -e'select version();'
+-------------------+
| version()         |
+-------------------+
| 10.5.11-MariaDB-1 |
+-------------------+
```
SQLiteをProductionで使えない！？チューニングしよう！SQLite3::BusyException: database is lockedが出た時の対処法

##　SQLiteはProductionで使えない？！

よくSQLiteは遊びだけということ言われますが、実は結構SQLiteだけで行けます。
少なくとも趣味で作るサイトだと、そもそもそんなにトラフィックも来ないですし。

今ちょっとしたRailsのジョブバックエンドのGemを作っていて（[Belated](https://rubygems.org/gems/belated)）, そしてこのGemはSQLiteで使えて、かつRedisなくても簡単に誰でも使えるようにしようとしています。

ですが、今簡単な負荷テストをやっていて、そこで
`ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked`
 というエラーが発生してしまいました。これはライトしている時にリードしようとしたからです。

しょうがない、PostgreSQLにするか・・・とも思ってしまいがちですが、実はSQLiteは同時にライトとリードを可能にするWALモードがあります。別ファイルに先にコミットされる内容を書いて、またそこからDBに入れることで、今までエラーになっている箇所でエラーは発生しなくなりました。

注意点として、起動時に毎回このWALモードにしないといけないことがあります。

```ruby
# config/initializers/sqlite.rb
# Rails 7だと以下はActiveRecord::Base.connection_db_config.adapterに変更してください
if ::ActiveRecord::Base.connection_config[:adapter] == 'sqlite3'
  if c = ::ActiveRecord::Base.connection
    # see http://www.sqlite.org/pragma.html for details

    # Setting of the "synchronous" flag, "NORMAL" means sync less often but still more than none
    c.execute 'PRAGMA main.synchronous=NORMAL;'

    # Journal mode for database, WAL=write-ahead log
    c.execute 'PRAGMA main.journal_mode=WAL;'
  end
end
```

これでパフォーマンスが全然違います！
エラーがでなくなり、処理できないリクエストはかなり減りました。

## 激安インスタンスで

Digital Oceanの一番安いインスタンスでサイトを運用していますので、できるだけ負荷少なくしたいです。
RubyのメモリーもMallocではなくJemallocをしようすることでかなり安定もしていて、全然余裕で月５ドルでRailsを走らせることができています。

ちなみにこのサイトです：
[wasurechatta.com](https://wasurechatta.com)

リマインダーが送れるサイトを今構築していて、ただほぼGemの更新の方しかまだやってなくてPV数ぐらいしか今表示されないです。

## 負荷テスト

PV数はもう80万PVまで行っていますが！
以下コマンドのおかげです：

    $ wrk -t14 -c400 -d10s https://wasurechatta.com

wrkはすごく便利に負荷テストができ、インストールも簡単です。`sudo apt install wrk`か`brew install wrk`ですぐインストールできて試せます！

このSQLiteのチューニングをやるまえは負荷テストの時にアクセスできなくなることも多かったですが、今だとアクセスできなくはなりますが、システムのリソースが足りないだけですので、大丈夫かと！

##　結論

SQLiteはRailsのメインブランチで使うとProductionでは使わない方がいいかもしれないよ！というワーニングも出るぐらいですが、ちょっとした遊びのRailsのプロジェクトをデプロイすることにはProduction環境でもいいかと思っています。そこまで人気もでないでしょうし、本当に複数インスタンスにスケールしないといけない時などに不便にはなりますが、遊び程度のプロジェクトでそうなれば逆にラッキーですので、またその時の楽しみでいいかと思っています。

もっとチューニングしたい方は以下のサイト見てみてください！
https://phiresky.github.io/blog/2020/sqlite-performance-tuning/
DatePickerで生年月日を入力できるようにする

# 前提条件
SDKバージョン：　30
Androidバージョン：　9.0

# この記事を書こうと思ったきっかけ
Android DatePickerで調べるとほぼ出てくるのがカレンダー形式のもので私は結構困りました。日付を選択する際は別にカレンダー形式でも問題ないと思うのですが、生年月日の選択の場合はスピナー、あるいはドラムロールと言われるタイプの形式の方が遥かに選択が楽です。
参考：[【ダメなUIについて】androidの生年月日の入力フォームで使ってはいけないUIデザイン
](https://satoriku.com/android-uidesign/)

# 作りたいもの
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906559/ff807016-df1b-455c-26a9-1b38745f08e3.gif" width=70%>

こんな感じで、EditTextをクリックしたら生年月日を選択するためのスピナーが表示され、ユーザーが選択すると、その結果がEditTextに反映されるというような流れです。

# DialogFragmentを作成
DatePickerDialogを実装するときにはDialogFragmentを作成した方がいいらしいです。
参考：[選択ツール](https://developer.android.com/guide/topics/ui/controls/pickers?hl=ja#ShowingTheDatePicker)

コードはこんな感じです。

```DatePickerFragment.kt
class DatePickerFragment : DialogFragment(), DatePickerDialog.OnDateSetListener {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val c = Calendar.getInstance()
        val year = c.get(Calendar.YEAR)
        val month = c.get(Calendar.MONTH)
        val day = c.get(Calendar.DAY_OF_MONTH)

        var dp = DatePickerDialog(
            requireContext(),
            android.R.style.Theme_Holo_Dialog,
            this,
            year,
            month,
            day
        )

        dp.datePicker.calendarViewShown = false
        return dp
    }

    override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
        val editTxtBirthday = activity?.findViewById<EditText>(R.id.edit_txt_birthday)
        editTxtBirthday?.setText(String.format("%d/%02d/%02d", year, month+1, dayOfMonth))
    }
}
```

ほぼ公式ドキュメント通りですが、しいて言うなら

```
dp.datePicker.calendarViewShown = false
```
を追加しています。
もしこれがないとスピナーとカレンダーの両方が表示されてしまうので、カレンダー形式の方を削除したいという意図です。

# EditTextをクリックした時の処理と連携させる

```activity_input_data.xml
<EditText
     android:id="@+id/edit_txt_birthday"
     android:layout_width="match_parent"
     android:layout_height="50dp"
     android:hint="生年月日"
     android:focusable="false"
     android:inputType="date"
     android:singleLine="true" />
```

```InputDataActivity.kt
// 生年月日を入力するeditTextをクリックしたときの処理
binding.editTxtBirthday.setOnClickListener {
     val datePicker = DatePicker(this)
     datePicker.calendarViewShown = false
     showDatePickerDialog(binding.editTxtBirthday)
}
```

# 他のやり方もあれば教えてください
これ実装してみると結構deprecatedまみれなので、他にいい実装方法があればぜひ教えていただきたい！
VSCodeでDenoのコードを書くとエラーが出る件

…についての対処法。

# An import path cannot end with a '.ts' extension. Consider importing \<file-path\> instead. ts(2691)

（または`Cannot find name 'Deno'. ts(2304)`）

https://github.com/denoland/vscode_deno/issues/66#issuecomment-884708660

### 原因

- VSCodeでは、デフォルトでNode.js向けの拡張機能が起動します。
- このエラーを回避するには、Deno向けの拡張機能をインストールした上で、設定から有効化しなければいけません。

### 回避策

1. [Deno向けの拡張機能をインストール](https://marketplace.visualstudio.com/items?itemName=denoland.vscode-deno)します。(バージョン3系が現在の最新です。)
1. `ctrl+shift+P`を押し、コマンドパレットを表示します。
1. **コマンドパレットから`Deno: Initialize Workspace Configuration`を選択して実行します**。
1. （エラーが消えない場合はVSCodeを再起動します。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/c013cefe-0fd1-565c-a88b-af1cf68c55ea.png)

3番目のコマンドパレットでの設定を忘れていることが多い気がします。

# Cannot redeclare block-scoped variable \<var-name\>. deno-ts(2451)

https://github.com/denoland/deno/issues/9593

### 原因

- Deno言語サーバーは内部的にTypeScriptの言語サーバーを使用しています。
- TypeScriptの言語サーバーは、ファイル中に`import`文や`export`文が無い場合、そのファイルをモジュールではなくスクリプトとして扱います。
- スクリプトモードでは、HTMLファイルからscriptタグで読むこむような形が想定されるため、ファイル間での変数名の重複がエラーとして報告されます。

### 回避策

1. エラーが出るファイルに対して`export {};`を追記します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/fe46dcb8-f2c1-9313-2687-dd79191ae0c5.png)

それでいいのかよ？って感じですが、これが一番単純で速い解決策のようです。

# A request has failed. See the output for more information.

日本語入力をしている時に、拡張機能がクラッシュすることがあります。

https://github.com/denoland/deno/issues/10891

https://github.com/denoland/vscode_deno/issues/492

内部で使用している、テキストの差分を取るライブラリにバグがあるようです。

https://github.com/dtolnay/dissimilar/issues/5

### 回避策

1. `ctrl+shift+P`を押し、コマンドパレットを表示します。
1. コマンドパレットから`Deno: Restart Language Server`を選択して実行します。
1. （エラーが消えない場合はVSCodeを再起動します。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/8e47980a-3de4-9496-22d5-a23dd9f3e01f.png)


# まとめ

VSCodeでDenoのコードを書いた時に発生するエラーと、その対策について紹介しました。
言語サーバーの挙動がおかしい場合は、下部のOUTPUTタブからDeno Language Serverを選択することでエラーメッセージが表示されるかもしれないので、試してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/5f9a32f9-f99c-f628-0e2d-df604acf622b.png)
数理計画（python①）

pythonで”EXCEL①”で記載したモデルで求解してみる。

```
【問題：条件】
　　一週間の製造計画について考えます。（土曜日から金曜日）
　　出荷は翌日朝から実施するため、前日に必要量を製造する。
　　翌週のために金曜日の貯蔵量を守る。

　　目的：製造量を最小化
　　説明変数：製造量
　　制約条件：
　　　・製造量　≦　一日の最大製造量
　　　・製造量　≧　一日の最小製造量
　　　・貯蔵量　≦　貯蔵できる最大量
　　　・貯蔵量　≧　翌日の出荷量
　　　・最終貯蔵量　≧　翌週のための貯蔵量

　　貯蔵量　＝　前日の貯蓄量＋製造量-出荷量
```

```sample.py
# coding: UTF-8
import sys

def GenPlan():
    try:
        Output = [0, 100, 150, 0, 300, 0, 400, 200]
        Before = 200
        After = 100
        MaxGen = 300
        MinGen = 0
        MAXHld = 500

        import pandas as pd

        index = [i for i in range(1,8,1)]

        #　最適計算
        import pulp

        problem = pulp.LpProblem('make_plan', pulp.LpMinimize) # 最小化

        # 変数
        X = pd.DataFrame(index=index)

        #製造量
        X['make'] = [pulp.LpVariable('make%d'%i, lowBound = MinGen, upBound = MaxGen,  cat="Integer")  for i in range(1,8,1)]
        X['hold'] = [pulp.LpVariable('hold%d'%i, lowBound = 0, upBound = MAXHld,  cat="Integer")  for i in range(1,8,1)]


        #目的関数
        problem +=  pulp.lpSum([X.loc[i,'make'] for i in range(1,8,1)])

        #等式制約
        problem += Before + X.loc[1,'make'] - Output[1] - X.loc[1,'hold'] == 0
        for i in range(2,8,1):
            problem += X.loc[i-1,'hold'] + X.loc[i,'make'] - Output[i] - X.loc[i,'hold'] == 0

        #不等式制約
        for i in range(1,7,1):
            problem += X.loc[i,'hold'] >= Output[i+1]
        problem += X.loc[7,'hold'] >= After


        status = problem.solve(pulp.PULP_CBC_CMD(msg = False))
        for i in range(1,7,1):
            print(int(X.loc[i,'hold'].value())  ,end=",")
        print(int(X.loc[7,'hold'].value()))
        for i in range(1,7,1):
            print(int(X.loc[i,'make'].value())  ,end=",")
        print(int(X.loc[7,'make'].value()))

    except:
        print(__name__)
# main
if __name__ == "__main__":
    GenPlan()

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314982/e8eedbb7-0932-d82f-7ac6-3cb55f248aac.png)

上側が貯蔵量、下側が製造量

EXCELの場合と最小値は同じですが、説明変数の値が異なることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314982/4bbe7282-79a1-c2a9-5dcd-ad3af5953fc0.png)
Laravelバージョン確認

:::note info
Laravelのバージョン確認をしたい。
:::

1 . ホームディレクトリからララベルディレクトリに移動。
2 . バージョン確認。

```ruby:コマンド
php artisan --version
```

```ruby:コマンド
php artisan -V
```
3 . 確認完了。

```ruby:コマンド
Laravel Framework 6.20.32
```
tftp サーバーを docker で起動する

# tftp サーバーを docker で起動する

## サーバー側

### 準備

docker のインストール

```
sudo apt install -y docker.io docker-compose
sudo usermod -a -G docker $USER
sudo reboot
```

firewall の許可

```
sudo apt install -y firewalld
sudo firewall-cmd --add-port=69/udp --permanent
sudo firewall-cmd --reload
```

公開するディレクトリ、ファイルの準備

```
mkdir tftp
echo test > tftp/a.txt
```

### tftp サーバー の docker container の起動

```
docker run -d -p 69:69/udp -v $(pwd)/tftp:/srv/tftp danrue/tftpd-hpa
```

##### (追記) `192.168.11.22:69:69/udp` は不要

当初参考にした https://hub.docker.com/r/pghalliday/tftp に `docker run -p 0.0.0.0:69:69/udp -v /var/tftpboot:/var/tftpboot -i -t pghalliday/tftp` とあったので、`192.168.11.22:69:69/udp` が必要と考えていたが、明示的に指定する必要はない。


tftp サービスを提供する IP アドレスを `192.168.11.22` とすると以下のように実行する。

```
docker run -d -p 192.168.11.22:69:69/udp -v $(pwd)/tftp:/srv/tftp danrue/tftpd-hpa
```

#### 参考

https://www.yokoweb.net/2019/10/15/ubuntu-server-tftpd-install/

https://hub.docker.com/r/danrue/tftpd-hpa

https://github.com/danrue/docker-tftpd-hpa

## エラー発生時の復旧

`192.168.11.22:69:69/udp` の `192.168.11.22` の部分を変えて再起動した場合、
以下のようなエラーが出ることがある。

```
$ docker run -d -p 192.168.11.22:69:69/udp -v $(pwd)/tftp:/srv/tftp danrue/tftpd-hpa
4c5630dac757afb8349b1d22cb5864d1244119078bef36a104ead78b59b15e86
docker: Error response from daemon: driver failed programming external connectivity on endpoint relaxed_wing (2ff0b8103b4a6c9937de2689f43bc7eda098df84269cd55b9a646b795a5e1c7a):  (iptables failed: iptables --wait -t nat -A DOCKER -p udp -d 192.168.11.22 --dport 69 -j DNAT --to-destination 172.17.0.2:69 ! -i docker0: iptables: No chain/target/match by that name.
 (exit status 1)).
```

docker サービスを再起動することにより復旧できる。

```
sudo systemctl restart docker
```

### 参考

https://stackoverflow.com/questions/33600154/docker-not-starting-could-not-delete-the-default-bridge-network-network-bridg/33604859#33604859


## クライアント側

### 準備

```
sudo apt install -y tftp-hpa
```

### 実行

```
$ tftp 192.168.11.22
tftp> get a.txt
tftp> quit
```

→ カレントディレクトリに `a.txt` が取得される。
～ 根付き木 ～ チートシート

#目次
**[実装](#実装)**
[深さ優先探索](#深さ優先探索)
[幅優先探索](#幅優先探索)

#はじめに

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

#実装


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

```python:tree.py
N = int(input())

child = [[] for i in range(N+1)] # 子ノードを格納する配列
parent = [0]*(N+1) # 親ノードを格納する配列
depth = [0]*(N+1) # ノードの深さを格納する配列

for i in range(N-1):
  A,B = map(int,input().split())
  child[A].append(B)
  child[B].append(A)
  
check = [1] # 根の番号
while True:
  if check == []:
    break
  now = check.pop(-1)
  for i in reversed(range(len(child[now]))):
    if depth[child[now][i]] == 0 and child[now][i] != 1:
      parent[child[now][i]] = now
      depth[child[now][i]] = depth[now] + 1
      check.append(child[now][i])
    else:
      child[now].pop(i)
```

詳しい人のコードをちゃんと調べたりとかはしてないので今後大きく書き替える可能性が高いですが、無いよりはマシなのでとりあえずページを作ってこのコード例を貼っています（他の人にはあまり見せられないコード）

#深さ優先探索

```python:tree.py
N = int(input())

child = [[] for i in range(N+1)] # 子ノードを格納する配列
parent = [0]*(N+1) # 親ノードを格納する配列
depth = [0]*(N+1) # ノードの深さを格納する配列

for i in range(N-1):
  A,B = map(int,input().split())
  child[A].append(B)
  child[B].append(A)
  
check = [1] # 根の番号
while True:
  if check == []:
    break
  now = check.pop(-1)
  for i in reversed(range(len(child[now]))):
    if depth[child[now][i]] == 0 and child[now][i] != 1:
      parent[child[now][i]] = now
      depth[child[now][i]] = depth[now] + 1
      check.append(child[now][i])
    else:
      child[now].pop(i)

passed = [0]*(N+1) # これまでに通過したノードの情報を格納する配列
next_child = [0]*(N+1) # 次に確認する子ノードの情報を格納する配列
now = 1
while True:
  #print(now)
  passed[now] = 1
  if now == 0:
    break
  if next_child[now] == len(child[now]):
    now = parent[now]
  else:
    next_child[now] += 1
    now = child[now][next_child[now]-1]
```

行き詰まったら親ノードに戻る必要がある場合の実装例

#幅優先探索

```python:tree.py
N = int(input())

child = [[] for i in range(N+1)] # 子ノードを格納する配列
parent = [0]*(N+1) # 親ノードを格納する配列
depth = [0]*(N+1) # ノードの深さを格納する配列

for i in range(N-1):
  A,B = map(int,input().split())
  child[A].append(B)
  child[B].append(A)
  
check = [1] # 根の番号
while True:
  if check == []:
    break
  now = check.pop(-1)
  for i in reversed(range(len(child[now]))):
    if depth[child[now][i]] == 0 and child[now][i] != 1:
      parent[child[now][i]] = now
      depth[child[now][i]] = depth[now] + 1
      check.append(child[now][i])
    else:
      child[now].pop(i)
```
[iOS] [Swift] クエリ文字列（URLパラメーター）の作成


## 辞書 → クエリ文字列（URLパラメーター）にコンバート

```swift
extension Dictionary where Key : StringProtocol, Value : StringProtocol {
    var queryString: String {
        var components = URLComponents()
        components.queryItems = self.map {
            URLQueryItem(name: $0 as! String, value: String(describing: $1))
        }
       return (components.url?.absoluteString)!
    }
}
```

## 使用法

```swift
let queryDic = ["key1": "value1", "key2": "value2"]
print(queryDic.queryString)
```