OmniAICreator/Qiita-1.07M huggingface dataset:
Laravelで使えるテンプレートエンジン『BLOCS』を使ってみた！

エンジニア歴1年、Laravel使用歴半年程度の私が、HTMLと親和性の高いテンプレートエンジン『BLOCS』を使ってみたので、使用感をご紹介します。

<h2>ひよっこエンジニアにはBladeがややこしい！</h2>
Laravelを使っている方であれば、標準のテンプレートエンジンであるBladeを使っている方がほとんどかと思います。
経験豊富なエンジニアであれば、Bladeを不便なく使うことができるでしょう。しかし、ついこの間PHPに触れたばかりのひよっこエンジニアにとって、Bladeを使ってテンプレートを作成することは、PHPでプログラムを行うのと大差ない抵抗感を覚えることも多いのではないでしょうか。

例えば、コントローラーから受け取った```$name```という値をそのまま表示するだけであれば、Bladeで下記のように書けばよいだけです。
```html:example.blade.php
<p>Hello, {{$name}}.</p>
```
ここまでは、初心者でも簡単に理解できます。
しかし、```$name```がある時だけ表示したいなど、ifの条件がある時には下記のように書きます。
```html:example.blade.php
@if ($name != "")
  <p>Hello, {{$name}}.</p>
@else
  <p>Hello, Guest.</p>
@endif
```
このように、Bladeでifやforeachを使って値を動的に表示させる時、初心者であれば<b>「結局HTMLでもプログラミングするんかい」</b>という気持ちを抱いてしまうのではないでしょうか。

どんなテンプレートエンジンを使っていても、動的な表示をしたければ、ifやforeachの処理を使うことは避けられません。だとすれば、「プログラミング感」が極力少ないテンプレートエンジンの方が、ひよっこエンジニアにとっては抵抗なく利用できるのではないでしょうか。

<h2>プログラミング感の少ないBLOCSを使ってみる</h2>
BLOCSでは、「データ属性」というものを使って値を出力します。

先ほどの例と同じく、```$name```がある時だけ値を表示したい場合には、下記のように書くことができます。

```html:example.blocs.html
<p>Hello, <span data-val=$name>Guest</span>.</p>
```
ここで使用している```data-val```は「値が存在する場合に開始タグから終了タグまでの間を指定した値で置換する」というデータ属性です。
タグに属性を追加するだけでいいですし、値の存在による条件分けはグッと簡単になりました。

その他の代表的なデータ属性も簡単に紹介します。
```data-if```：条件を満たす時に表示する。
```data-loop```：配列を繰り返し処理する
```data-convert```：値を整形する形式を指定する。
```data-attribute```：値を置換するタグの属性を指定します。
これらは```data-val```と組み合わせて表示する値を制御することができます。

上記の例のようなタグ内に記述する方法をBLOCSでは「タグ記法」と呼びます。一方で、「コメント記法」という記述方法も存在します。

例えば、タグの属性の値を書き換えたい場合、```data-attribute```をコメント記法で利用します。
aタグで飛ばすリンク先を指定のURL```link```としたい場合、```href```属性を書き換える必要があります。
この場合、```data-attribute```を置換したい属性をもつタグの上にコメント記法で記載することで、```href```に指定の値を代入することができます。
```html:sample.blocs.html
<!-- data-attribute="href" data-val=$link -->
<a>リンク</a>
```
▼出力
```html
<a href="[$linkの中身]">リンク</a>
```

<h2>まとめ</h2>
「HTMLは書けるようになったけど、PHPはこれから・・・。」
「Laravelを使い始めたばかりで、Bladeの記述方法に慣れない。」
といった方に特にオススメです。
BLOCSを使いこなせるようになるまで多少の慣れは必要かもしれませんが、HTMLの構造をベースとして設計されていることによって、HTMLを崩さずに記述できるのが最大のメリットでしょう。
PHP初学者や、プログラムに苦手意識のある方でも親しみやすいのではないかと思います。

<h2>関連リンク</h2>
BLOCSの詳細や導入方法は下記サービスサイトにて確認できます。
<ul>
<li><a href="https://blocs.jp/" target="blank">サービスサイト</a></li>
<li><a href="https://github.com/blocs/blocs">GitHub</a></li>
<li><a href="https://packagist.org/packages/blocs/blocs">Packagist</a></li>
</ul>
【無課金】基本情報技術者試験の対策結果

# はじめに
　本記事は書籍購入や有料動画コンテンツを一切用いることなく、「基本情報技術者試験」の対策を行って合格した著者個人の体験記です。

※基本情報技術者試験の内容が2023年4月から大幅に変更されます。本記事は旧試験についての説明になりますので、参考程度にお読みください。

# 対象読者
+ 基本情報技術者試験を受験したいと考えながら、一歩が踏み出せない人
+ 未経験からエンジニア転職を目指している人

# 資格勉強にかけるお金がない（時間も）
　多くの会社では資格受験の受験料補助が福利厚生で備わっていることが多いですが、書籍購入費や有料動画コンテンツへの補助が十分ではない場合があります。
　プライベートな時間を消費して勉強しているにもかかわらず、少ない手取りから自己研鑽を強いられております。落ちたときのダメージが大きいので、より真剣に勉強するというモチベーションにはなりますが、資格取得へのハードルが高くなっていることは否めません。

　__お金をかけずに資格を取得したい（切実）__

# 【無課金】基本情報技術者試験対策
　本題の【無課金】で基本情報技術者試験の対策を行ったツールを紹介します。


### 午前試験・午後試験共通
__「基本情報技術者過去問道場」__ と __「【基本情報技術者試験YouTuber】すーさん」__ を使用しました。

https://www.fe-siken.com/fekakomon.php

https://www.youtube.com/@kihonzyouhou


### 基本的な勉強の流れ
1. YouTubeの動画を分野ごとに __「1.5 ~ 2.0」倍速__ で視聴する
1. インプットした分野の過去問を解く　__（2 ~ 3年分）__　
1. 間違えた問題は過去問道場の解説を見るか、Youtubeを再視聴する
1. 正答率が　__8割程度__　まで上がってきたら、別分野の解説動画をYoutubeで視聴する

　上記のサイクルを2カ月回し続けることで、【基本的なインプット】と試験の【出題傾向】を把握することができました。


##### 基本情報技術者過去問道場

　過去問道場に関しては、他の合格体験記でもあるように絶対に活用するべきWEBサイトです。`豊富な過去問が解説付きで、分野ごとにまとまっています。`しかも __無料__ で使用することができます。
　おおよそのインプットが完了したら、ひたすらに過去問題を回しましょう。特に午前試験は知識系を問われることが多く、問題数も多いため、どれだけ問題に当たったかが合否に直結する場合もあります。`過去の出題内容がそのまま試験に出る`こともあります。試験中に確実に解けた問題が多ければ多いほど、精神の安定につながり凡ミスも防ぐことができます。



##### 【基本情報技術者試験YouTuber】すーさん
　こちらのYoutubeチャンネルでは、`基本情報技術者試験の出題範囲の内容を分野ごとに動画で解説`してくれています。

　本チャンネルのいいところは
1. イラスト等を用いての __解説が非常にわかりやすい__
1. 1つの動画が10 ~ 20分程度にまとまっており、__隙間時間に視聴しやすい__　
1. __倍速__ で視聴しても解説の声が聞き取りやすい
1. __試験範囲をほとんど網羅している__

　全体的な動画のクオリティも高く、上記の4点は特に優れており、学習中のユーザーに優しい設計となっていると感じました。極まれに誤字脱字はありましたが学習中にストレスを感じることもなく、試験内容の大まかなインプットを行うには十分すぎました。

※基本情報技術者試験の内容は2023年4月から大幅に変更されますが、本Youtubeチャンネルに新形式の勉強法についての解説動画が上がっていました。参考にできると思います。


# 試験結果


### 無事に合格することができました。

　YouTube動画の視聴と過去問道場での問題演習の「インプット」と「アウトプット」が上手く嚙み合った結果であると思います。
　これでエンジニアとしての市民権を得られたのかなと思います。

# まとめ


### 【無課金でも基本情報技術者試験には合格できる】

　勉強方法は人それぞれで、必ずしもベストプラクティスがあるわけではないと思います。短期であったとしても __継続すること__ が何よりも大切なのではないかと思いました。継続するためには __第一歩__ が必要で、自分の場合はその一歩を躊躇する理由が __お金__ でした。

　自分の体験が参考になるかは分かりませんが、読者の __第一歩__ の助けになれればと思います。
　皆さん、頑張りましょう。自分も頑張ります。
【車輪の再発明】Enum.reduceを使ってSUM関数を再発明しよう

今日も無駄に再発明します

# ルール
・Enum.reduceも使ってもよい
・厳密さは求めない

# 実装

```Elixir
defmodule Hoge do
  def sum(val) do
    Enum.reduce(val, 0, fn x, acc -> acc + x end)
  end
end

1..10 |> Hoge.sum()
|> IO.inspect()
```

55を求めることができました

```Elixir
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] |> Hoge.sum()
|> IO.inspect()
```

同じく55を求めることができました

# 昨日の問題点

https://qiita.com/t-yamanashi/items/bb80aed85769e6e92599

1..10のような範囲で来た時の対策として
to_list関数を作ろうと考えたんだが…
ぱっと思いつかなった
気が向いたら本物のソースを見てみる

これだったら可能でも、車輪の再発明としては負けた気がする・・
```Elixir
for x <- 1..10, reduce: [] do
  acc -> acc ++ [x]
end
|> IO.inspect()
```

```結果
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```
【小ネタ】Lambda の Dockerイメージをコードから作成した話

# はじめに

[Releaseタグ作成からEKSへのデプロイを自動化した話](https://qiita.com/ijufumi/items/c8c54c2295baf04113b2) でやった内容のうち、 `Lambda` に焦点を当てた内容です。

載せているコードは一部だけなので、全体を見たい方は上記の記事から辿ってください。

# 環境

* `Kubernetes`: `1.24`
* `AWS CDK for Golang`: `v2.56.1`

# やったこと

## Lambda用のコードを準備

`lambda` ディレクトリに、必要なファイルを用意します。
`Dockerfile` のみ載せています。
他は、`Github` リポジトリを参照。

* `Dockerfile`

```Dockerfile
FROM public.ecr.aws/lambda/python:3.9

COPY . ${LAMBDA_TASK_ROOT}

COPY requirements.txt  .
RUN pip install --upgrade pip && pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}"

CMD [ "app.lambda_handler" ]
```

## `CDK` で `Docker` イメージの作成

`AssetImageCodeProps` でどの `OS` で動かすかの設定をし、 `DockerImageCode` でどのコードで `docker` イメージを作成するかを設定しています。

```go
current, _ := os.Getwd()
imageProps := &awslambda.AssetImageCodeProps{
    Platform: awsecrassets.Platform_LINUX_AMD64(),
}
props := &awslambda.DockerImageFunctionProps{
    Code: awslambda.DockerImageCode_FromImageAsset(
        jsii.String(path.Join(current, "../lambda")),
        imageProps,
    ),
    Environment: &map[string]*string{
        "CODEPIPELINE_NAME": jsii.String(config.Pipeline.Name),
        "BUCKET_NAME":       jsii.String(config.S3.BucketName),
        "ACCESS_TOKEN":      jsii.String(config.Github.AccessToken),
    },
    Timeout: awscdk.Duration_Seconds(jsii.Number(config.Lambda.TimeoutSec)),
    Role:    role,
}

lambdaFunction := awslambda.NewDockerImageFunction(scope, jsii.String("id-lambda"), props)
```

# 最後に

もし「この方法がより良いやり方だよ」ってのがありましたらコメント頂けると幸いです。
システム障害発生時の基本動作フローについて

# はじめに

なんかシステム、プログラムがうまく動かない、、といった際にどうしていったら良いですか？とか
デバッグがうまくいきませんとか言われることが時々ありますので書き残しておきます。

# やりかた

## 全体フロー

流れとしてはざっくり以下となります。

1. 事象、発生条件の整理
1. 影響範囲の確定、ステークホルダーへの連絡
1. ログの収集
1. 被疑コンポーネントの絞り込み
1. 原因分析
1. 対処
1. 解消確認

といった形が自分は多いかなと思います。

## 影響調査

1. 事象、発生条件の整理
1. 影響範囲の確定、ステークホルダーへの連絡
1. ログの収集

ここの部分を解説します。
最初にエラー発報（運用システム、ツールからの自動連携）にしろ、ユーザー問い合わせからの連絡にしろ、
- 今何がおきているのか
- だれが困っていてだれは困ってないのか

といったところを明確にしていきます。人伝ての連絡ではなく、エラーとなっているエビデンスやログも一緒に確認していったほうがよいです。特にユーザー問い合わせの場合、捉え方が曖昧だったりしますので、その際は、自身で操作して事象を再確認していったほうがよいと思います。

この時点で疑われる箇所含めた一通りのログの収集を実行しつつ、各コンポーネント単位にエラーが出ていないか監視系ツールなどのステータスを確認しましょう。（本番システムの場合）

テスト環境などの場合は、監視系を動かしていないこともあるので、環境に詳しい人に、「今日ってメンテ時間あったっけ？」とか聞いたりして情報を探りましょう。

影響確認では、業務データがどうなっているのかも確認が必要です。データがおかしくなっている場合には、後続業務がある場合、別のシステムや業務担当者にも迷惑がかかってしまうので、データの修正も並行で考えていきます。

## 切り分け

次に

4.被疑コンポーネントの絞り込み

をやっていきます。ここが本ページで一番言いたかったことになります。

システム、プログラムは様々なコンポーネントで形成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/7d40101e-02e4-d82e-0efa-d879ab3209b2.png)

事象から切り分けていきます。


* システムにはアクセスできるが特定機能だけが動作しない
 →プログラムバグ、不整合データの混入（バリデーション漏れ含む）、特定機能にて外部サービスが使われている場合はそのサービスが落ちているもしくは疎通できていない、など

* そのシステムの全機能動作しない
→ NW不通含むプラットフォーム系のHW障害（OS、ストレージなどなど）、メモリ溢れ・CPU100%張り付き（原因は業務アプリケーションの場合あり）など

* 特定のクライアントだけ動作しない
→ 特定クライアントの環境依存（OS差異、セキュリティパッチ、ブラウザ設定）など

基本的にはプラットフォーム系の障害の場合は、検知する仕組みがあると思いますのでそこを頼りに復旧させていきます。
上記をより詳細にしたようなシステム全体構成図があれば、その図を流用して、正常に動作している箇所は問題なしとして潰し込み、ちょっとわからないところは保留として調査継続するなど、消去法のような形で切り分けていきます。

プログラムバグやデータ不整合などの場合は、掘り下げるために、ログラムの中身の構造をイメージして調査検討していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/4bb25051-df3d-be9e-e339-f95e2f8f56d4.png)

上記はコンポーネント図のように記載されていますが、業務アプリケーション内ではパッケージ構成と思って見てください。
特定ケースでエラーになる場合は、通常の障害が起きていないケースと、今回障害が起きているケースで流れを見比べながら検討していきます。
その際にログも見比べられると、異常がどこで起きているのかを確認することが出来ます。

エラーログが出ている場合について、Javaであればスタックトレースが出ているケースが多いと思いますのでそこの根本例外を確認することでエラー原因が分かることがあります。
エラーログの見方などは基本動作事項になりますので、しっかり身につけましょう。

https://software.fujitsu.com/jp/manual/manualfiles/M090021/B1WN5041/06Z205/trbs19/trbs0208.htm

スタックトレースの見方は上記サイトを例にあげましたが、実際には動かしながら自分で学んだほうが良いかなと思います。


## 原因特定と対処

ログから被疑箇所がわかったら、原因の特定を行います。プログラムバグなのか、データが想定外なのか、などなどです。
原因が分かっても、その時点ではあくまで仮説です。対処してみて、それが解消されることが確認できたら、真に原因が分かったと言ったほうが硬いかなと思います。
対処についても、安易に対処方法を決定するのではなく、対処した結果他のところに悪影響がでる場合もありますので、レビューやテストはしっかり行いましょう。

テスト環境でしっかり確認するのが良いですね。


# まとめ

今回は起きてほしくない障害についての対応方法について観点に記載してみました。起きたものは仕方ない部分もありますので、冷静に迅速に分析、対処していきましょう。
バグや障害も多くの経験を積んでいくことで、前にも踏んだバグだということで即座に見極められたり出来てきますので、大きく成長できるチャンスだとも捉えられるかなと個人的には思います。
【個人開発】日用品を自動で購入してくれるアプリを作りました。

## はじめに
こんにちは@prg_mtと申します。
DIVE INTO CODEでエンジニア転職を目指し、4ヶ月間学習をして参りました。
今回はその集大成となるオリジナルアプリについての記事を書いてみます。

また、この記事について[動画](https://www.youtube.com/watch?v=Szne_NNL5eA)でまとめたものもありますので、よろしければご覧ください。
(動画内でamazonのアカウント情報のDBへの登録が暗号化されていないとありますが、現在は暗号化されておりますのでご安心ください。) 

## 開発したアプリについて
今回開発したアプリ名は<strong>「Stock Roller」</strong>です。
アプリ名の由来は「日用品のストックを継続的に回していく」という部分からです。
![スクリーンショット 2022-12-30 17.25.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2881858/1c1def99-9ef7-0890-93ac-9bd890573728.png)


【アプリURL】
~~https://stock-roller.work/~~ (公開停止しました。)
【Git Hub URL】
https://github.com/TomokiMatsubuchi/Stock-Rolling-App.git

### アプリ制作のきっかけ
![スクリーンショット 2022-12-30 17.06.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2881858/e42cb798-0ff2-be2d-57bf-5926329c4493.png)
突然ですが、帰宅して手を洗おうとした際にハンドソープがなかったなんて経験ありませんか？
私にはありました。
しかも仕事から疲れて帰ってきてようやく一息つけると思った時にこの状況です。
その際の心境は「明日でいいや。明日買いに行こう」でした。
しかし、翌日になって帰宅した時にまた買い忘れていたなんて経験もありました。


上記の経験からこういうことなんとかしたいなぁ〜なんて漠然と考えていました。

### アプリ作成のアイデア

私は前職で、小型スーパーの店長をやっていました。
スーパーやコンビニでは商品にもよりますが、多くの商品は売れたら自動的に売れた数量の発注が上がり、商品が入荷する仕組みになっています。
![スクリーンショット 2022-12-30 17.05.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2881858/5d61588d-fbf7-5d89-bef9-0448713f5694.png)
そこで、商品が売れることを消耗品の消費完了に置き換えることで、この仕組みを組み込んだアプリをなんとか開発できないかと考えました。

## 開発環境
- M1 MacBook air
- Ruby 3.0.1
- Ruby on Rails 6.0.6
- Postgresql 12
- JQuery
- Tailwind
- Flowbite
- Docker

## 主な機能

- LINEログイン
     OAuth認証によりLINEアカウントでログインしていただくことで簡単にアプリへのログインができるようになっています。
![btn_login_base copy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2881858/5498b5ca-deaa-0967-8cc2-437ebd8d1e21.png)

- LINEプッシュ通知
    登録された日用品の消費完了期限の1週間前から毎日12時にプッシュ通知でお知らせが入ります。
![LINE_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2881858/4dd0203e-f283-c7b8-3f51-abf5bf67863c.png)

- 自動購入機能
    登録された日用品の消費完了期限の1週間前になったらプログラムが自動でamazonより登録された商品を購入してくれます。
    また、購入についてのステータスをLINEプッシュ通知でお知らせしてくれます。
- お買い物メモ機能
    登録された日用品を消費完了期限の早い順に6件ずつ表示し、1度のお買い物で必要な日用品をまとめて購入できるようサポートしてくれます。
![スクリーンショット 2022-12-30 17.23.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2881858/408d6175-08d1-4d29-0e78-b95cc11883d4.png)



## 特に力を入れたポイント
Seleniumdriverを使用したウェブスクレイピングによる自動購入機能です。
Rubyを用いたスクレイピングの参考文献があまりなく、主に公式リファレンスを頼りに実装していきました。
また、サイトによってHTML要素の取得が難しい場合もあり、きちんと購入まで動かすのに時間がかかりました。

→[こちらの動画](https://www.youtube.com/watch?v=Szne_NNL5eA)の11分あたりから実際にスクレイピングでの動作デモを行なっています。

## 最後に
今回はアプリの大まかな概要をまとめてみました。
実装した機能についての記事を書いていこうと思いますので今度ともお付き合いくだされば幸いです。(~~連載企画にするかも...?~~　→　連載企画始めました!)

## 追記
### 連載企画
- [第1回　LINE機能についての記事をこちらにまとめてみました!](https://qiita.com/prg_mt/items/b3238ebfae1a3df67cab)
- [第２回 RubyonRailsにスクレイピング機能を持たせてみる。](https://qiita.com/prg_mt/items/5383d87fccdd7fc2cecf)
object-fitとは（画像のトリミング）

# はじめに
object-fitの使い方と効果についての備忘録です

# object-fitとは
画像のトリミングをCSSプロパティ「object-fit」で行うことができる。
画像の縦横比を保ちながらトリミングする事ができます。

```js:使用例(CSSサンプルコード)
object-fit:cover //中央でトリミング

.example img {
   width: 100%;
   height: 300px;
   object-fit: cover;
}
//縦横の画像比率を綺麗に保ちつつ、画像の中央でトリミングが可能
Unityで合成フォントを使う方法

# 概要
フォントでの表現の中には例えば英語と日本語で別のフォントを使う、合成フォントという考えかたがあります。
今回はUnityのTMPのFont Fallbackを使ってこれを実現する方法を紹介します。

https://blog.adobe.com/jp/publish/2020/11/26/cc-adobefonts-cv-compositefont-01

# やり方
UnityのTextMeshProにはFont FallbackというFontAssetに含まれていないフォントを別のFontAssetから取得する機能があります。
これを使うことで合成フォントが実現できます。

やり方は下記の手順になります。

**1.** Window/TextMeshPro/FontAssetCreatorから**英語のみ**のSDF Assetsを作成する[^1]
**2.** 同じく日本語のSDF Assetsを作成する[^2]
**3.** 英語のみのフォントのFallback Font Assetsに日本語のフォントを設定する。

日本語フォントの中でさらにカタカナとひらがな、漢字でフォントを分岐させたい場合はフォント作成時のCustomCharacterListから分岐させたい文字列を削除し、削除した文字列のみで別SDF Assetsを作成、最初に作成したSDF AssetsのFallback Font Assetsに追加登録することで三つ以上のフォントを混ぜて使うことが可能です。

# 参考
Font Fallbackについて

https://tsubakit1.hateblo.jp/entry/2019/02/02/060758

日本語フォントの作り方

https://taidanahibi.com/unity/text-mesh-pro/
[^1]: このときCustomCharacterListなどで日本語を含めて作成するとフォントデータにフォントがなくてもFont Fallbackが効かなくなります
[^2]: この時最適化するのであれば英語のみのフォントで使用している文列を削除する
Pythonを改めてちゃんと学ぶメモ #4

# はじめに

ここは、Pythonを改めて学んでいるメモを都度書き出していきます。
※ 筆者のバックグラウンドは#1をご覧ください。

1. https://qiita.com/hideh_hash_845/items/58241f0ce0283e457a87
1. https://qiita.com/hideh_hash_845/items/56c7a2c5594261f380b2
1. https://qiita.com/hideh_hash_845/items/b5e2264fc650c3e9d4b6
1. （ここ）
1. https://qiita.com/hideh_hash_845/items/7b4aeb514f9eb199e9c2

# 文法の気づき#4
## クラス
他のオブジェクト指向言語で学んでいればどうってことない
- 第一引数は「自分自身」(インスタンス自体が第一引数）
- 引数を設定したかったら第二引数以降に設定
- コンストラクタは `__init__`
~~~
class MyClass:
    def print_class(self):
        print ("hello, MyClass.")
    def print_class_with_param(self, str):
        print ("hello, MyClass, " + str + "!")

obj = MyClass()
obj.print_class()
# hello, MyClass.
obj.print_class_with_param("and Python")
# hello, MyClass, and Python!
~~~

## モジュール
- クラスを作って "MyClass.py" みたいに保存。呼び出し側は `import MyClass` で呼び出せる
- モジュールの先頭で何かを宣言する必要はなさそう（"package MyClass"みたいなの）
プロジェクトマネージャ試験合格【令和4年秋期】

令和4年秋期のプロジェクトマネージャ試験を受験して、合格しました。せっかくなので、誰かの役に立てばと思いやったことを残しておこうと思います。

# 背景
令和3年秋期の情報処理安全確保支援士試験に合格したときに午前Ⅰから受験していたので、せっかくなら2年間の午前Ⅰ免除期間を有効活用しようと思いました。
そのあと令和4年春期にネットワークスペシャリスト試験に合格したのと、これからPM系の仕事が増えそうだったので令和4年秋期はプロジェクトマネージャ試験を受けることにしました。
情報処理技術者試験で論述式を含む試験を受けるのは初めてです。

## 得点
![EE081961-3C00-4055-A2B0-9C73B6049D20.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581105/feac4e79-93a5-492d-c3dc-f475a0c771ae.jpeg)

感覚的に午後Ⅰまではなんとかなったんじゃないかな？と思っていたのですが、午後Ⅱまで通ったのは結構驚きがありました。
というのも時間ギリギリになって論述の設問3つ目を書き上げたので、終盤の論旨がかなり荒れてしまったかなと感じていたからです。

## 使った教材

[情報処理教科書 プロジェクトマネージャ 2022年版](https://amzn.asia/d/es43CxJ)
論述を含む高度区分試験を受験するのは初めてだったのと、テクニカル寄りでない試験としてなにを対策したら良いのかかなり迷ったので、王道の参考書を使いました。
このシリーズでNW、DB、SCあたりの参考書を見たことある方はわかると思うのですが、結構テイストが違います。覚えるべき知識に関してはあまり多くないですが、午後Ⅰはほぼ知識問題はなく記述回答が必要で、午後Ⅱは論述です。そのため対策の仕方もほかのテクニカル寄りの試験とは異なってくるので、参考書の中身も変わってくる感じです。

[プロジェクトマネージャ試験ドットコム](https://www.pm-siken.com/s/)
午前Ⅱ対策は安定のこのサイトです。NWとSCのときもこの姉妹サイトで午前対策してました。
過去問道場で過去6年分を繰り返しました。年1回実施の試験ですから過去問も量は少なく、あまり時間を割かなくても良いと感じたので、スキマ時間にぽちぽち解いた程度です。


また、午後試験の対策として独学だけだとなかなか雰囲気が掴めないなと感じたので、幸いなことに社内で開催されている研修に申込みました。正直この研修を受けていなかったらかなり厳しかったと思います。研修内容は、主に考え方を中心に解説する午後Ⅰの演習と、講義形式で論述のコツを解説されたのちに、実際に過去問の論述を行い添削してもらう午後Ⅱ対策がセットでした。
私はたまたま社内研修が用意されていたのでありがたかったですが、なかった場合は外部の研修に申し込むか、論述に特化した参考書を購入するつもりでいました。

## 勉強方法
### 4月
プロジェクトマネージャ試験の参考書を買う。ひと通り斜め読みし、いままで受験したSCやNWとの違いを確認する。

### 5〜7月
とりあえずは基礎知識からということで、午前Ⅰ対策を始める。分量が多くないので、スキマ時間に解く程度。なのであまりトータルとして勉強時間を割いていない状態が続く。午後試験に対して漠然としたまずさを感じ始める。

### 8〜9月
8月に午後対策に特化した社内研修を受講。論述試験の課題に取り組む。講師からはぜひ時間制限を意識したうえで論述に取り組んでもらいたいと言われるものの、まったくペース配分が掴めなかったため時間制限を意識せずにとにかく最後まで書き切ることを目標に書き上げる。
のちに返却された論述添削の採点はB評価だった。
結局、過去問使って論述をしたのはこの1回しかできず、あとは問題文の分析の仕方を研修資料からおさらいしたり、設問ごとに書いてみる程度しか出来ず。さすがに合格無理かもと諦めかける。

### 10月
試験当日まで論述対策がほとんど出来なかったため、逆にリラックスした状態で受験する。案の定午後Ⅱの論述でペース配分を誤り、設問3つ目の規定文字数をなんとか埋め終えたのは試験終了5分前あたりだったと記憶している。考えながら手を動かし続けるのがキツかったのかあまり覚えていない。

# まとめ
今回のMVPは間違いなく論述試験に特化した社内研修を受講できたことにあると思います。これは本当に恵まれてましたね。
プロジェクトマネージャ試験に対して最大の不安はPM経験が少ないことでしたが、試験である以上正解が存在するという考え方に気づけたのが大きかったです。これは研修受講しなければ独力で気づくのは難しかったです。
知識面と他者に要点を伝える力は今回の試験で素養を手に入れられたと思いますので、ほかの試験合格後と同様に、実務への還元を意識して頑張っていこうと思います。午前Ⅰ免除チャンスがあと2回なので、また何か受けようかな。
【tkinter】チェックボックスにチェックマークが表示されない時の対処法

## 前置き
Tkinterでチェックボックスの背景色(bg)を変更したらチェックマークの表示がされなくなった！
そんなトラブルの対処法を紹介していきます。

## 表示されない場合のコード
下記のコードで実行した場合、チェックボックスにチェックの表示がなくなります。
```Python:example.py
# ↑省略
bln = tk.BooleanVar()
bln.set(False)

chk = tk.Checkbutton(root, variable=bln, text="test", bg="#000000", fg="#ffffff")
chk.pack()
# ↓省略
```
## 原因
チェックマークの色を指定していないことが原因です。
つまり白いボックス内に白くチェックマークが表示されているため、何も表示されていないように見えるだけなのです。

## 対処法
「tk.Checkbutton」のオプションである「selectcolor」を使用します。
bgやfgと同じような記述で問題ありません。
```Python:exsample.py
bln = tk.BooleanVar()
bln.set(False)

# 括弧内の最後の様に色を指定してあげてください。
chk = tk.Checkbutton(root, variable=bln, text="test", bg="#000000", fg="#ffffff", selectcolor="#000000")
chk.pack()
```
【整理】Dockerがあると、誰にとって何が嬉しいのか。

# はじめに
上手い書き出しが見つからないが、はじめにを付けたかったので付けました。

# Dockerってなんですか。
コンテナ型の仮想化技術のことを指していて、1つの物理マシン上に複数の仮想環境を立ち上げることができます。
お手軽にアプリケーションの実行環境を整えられる技術と考えれば良いかもしれません。
実行環境を簡単に作成し、実行し、配布することができます。

## 比較対象
仮想化技術には、コンテナ型の他にホスト型、ハイパーバイザー型があります。
コンテナ型と比較するとハードウェアに負荷がかかるため、物理マシンの動作が遅くなります。

## それがあると誰に役立つのか
チーム開発で役に立ちます。
同じ環境で開発を行いたい場合、Dockerがあることで簡単に配布することができます。


## 参考文献
https://hnavi.co.jp/knowledge/blog/docker/
https://knowledge.sakura.ad.jp/13265/
vim ってすごい (行末の , のみを置換対象にする)

いつまで経っても vim 初心者なので、ちょっとした事にスゴイって感じてます。

rails の seeds.rb をコピって factory_bot に書き換えていた時に、やっぱ vim ってスゴイって感じました。

### 置換元
```
  bank_id: bank.id,
  credit_card_id: card.id,
  start_dt: Date.new(2014, 9, 1),
  end_dt: Date.new(9999, 12, 31),
```

### 置換結果
```
    bank_id { bank.id }
    credit_card_id { card.id }
    start_dt { Date.new(2014, 9, 1) }
    end_dt { Date.new(9999, 12, 31) }
```

のようにしたいのです。

``` : ``` は、行選択後 ``` s/:/ }/g ``` で置換出来ます。
問題は ``` , ```　です。 3 行目と 4 行目で Date メソッドのパラメータのセパレータとして使用されています。
``` s/,/ }/gc ``` として確認しながら置換する事も出来ますが、それだと間違って ``` Y ``` を押してしまう可能性が残ります。
置換したい ``` , ``` は行末の ``` , ``` だけです。そこで正規表現を使用して行末の ``` , ``` を対象にします。
``` s/,$/ }/g ```

vim ってすごいです。
初級SEの年間資格取得チャレンジ

もうすぐで2022年が終わりますね...:partly_sunny:
年々、一年過ぎるのが早く感じるアラサーSEです。

実は私、他業種からSEに転職したのですが、
現場で感じたことは
「**分からないことがわからない...**」です。

指示があればコーディングや設計はできるが、
なんとなくこなせているだけではないのか...？

なんて疑問が頭をよぎることが多かったので、
とりあえず、今できるだけ多くの知識と今までの経験の紐づけも兼ねて
年間最多資格取得に挑戦しました!!!

以下私が今年一年とった資格になります。
:apple:**Oracle MASTER Silver SQL**
:apple:**ORACLE MASTER Bronze DBA**
:apple:**AWS Certified Cloud Practitioner**
:apple:**Python 3 エンジニア認定基礎試験**
:apple:**Oracle Certified Java Programmer, Gold SE11**
 　　　　　　　　　　　　　　　　　　　　　　　　計**5**つ
（思ったより少なかった...:confused:）
一年間、モチベ保ちながら勉強し続けるのは大変でしたが、
その分、得たものも大きかったです！
以下、子細になります。

## Oracle MASTER Silver SQL
　　取得前:thinking:「左結合と右結合って何が違うんだ...使い分け方はどうすればいいんだ」
　　取得後:blush:「このSQLでは、設計書で求めているデータが取れていない気がする」
　　
　　この資格は本当に勉強してよかったと思う資格の一つです。
　　SQLってCRUDさえ押さえておけば何とかなる、と思っていたのですが、
　　その考えは甘いと現場で思い知りました。
　　SQLで出来ることは遥かに多く、理解しているしていないの問題ではなく、
　　知っているか知らないかの世界です。
　　SQLで出来ることを理解しておくことは、製造時大きなアドバンテージになります。
　　バグをSQLで潰せるように組み立てることができると知れたのも大きかったです。

## ORACLE MASTER Bronze DBA
　　取得前:thinking:「リスナーってなに？」
　　取得後:blush:「このエラーは、トンネル起動したら解決するだろうな」

　　DBサーバーってAPサーバーとどう違うのか？とサーバーについて何も知らなかった時期に
　　手始めに勉強した資格です。
　　DBAにはDBサーバの構築の方法やDBサーバとは何ぞや、ということが学べます。
　　『リスナーが見当たりません』とエラーが出たとき、どうすればエラーが解決するのか
　　私は最初わかりませんでした...:weary:
　　しかし、この問題ってDBサーバーの応答プロセスについて知っていたら即解決法に気づく
　　超簡単なエラーなんです。（いちいち先輩に尋ねる程度のことではありません。）
　　サーバーの構築や動き方を知ることで、発生しているエラーの原因を調べ、解決の糸口まで
　　持っていけるようになりました。
　　
## AWS Certified Cloud Practitioner
　　取得前:thinking:「ネットワーク系が全く分からない。分からないことが分からない...」
　　取得後:blush:「システムのネットワークで何が必要なのかぐらいはわかる」

　　最近人気の資格のAWSです。
　　先輩からおすすめされて勉強しました。
　　この資格で、システムが使用するネットワークのつながりの部分がふわっと把握できるように
　　なりました。あと、自分が苦手意識をもっている箇所がどこなのかが認識できました。
　　正直、この資格一つで、現場でこの業務が出来るようになった、ということはないです。
　　しかし、プロジェクトに対する視野は確実に広くなったので、PGとしてだけではなく
　　プロジェクト全体の動きを把握しながら動くことが製造とどうつながるのかを
　　考えて動けるようになりました。

## Python 3 エンジニア認定基礎試験
　　取得前:thinking:「Phythonの製造タスク振られたらどうしよう...」
　　取得後:blush:「コーディングは大丈夫」

　　これは、次のプロジェクトがPhython使うため、事前学習として取得しました。
　　ちなみにまだ異動してないのでPhython使用してません:grimacing:笑
　　ちなみに今まで、バックエンド言語はJavaとTypeScriptしか使ったことがないです。
　　Javaは型を固定する必要がありますが、Phythonは型定義は必要ないのが
　　新鮮でした。JavaからPhythonの方が習得は容易になる気がします...
　　これでいつPhython使った製造タスクを振られるのか、という不安から解放されました:innocent:

## Oracle Certified Java Programmer, Gold SE11
　　取得前:thinking:「タスク遂行に問題はない」
　　取得後:blush:「バグ数とステップ数が減らせた」

　　いわゆるJava Goldです。
　　これは今の製造工程でとても重宝しました。
　　なんといってもバグの発生数がめっちゃ減ります。ステップ数も減ります。
　　Silver持ってるからGoldは別に必要ないかな、と思っていましたが、
　　取得した方がよい資格だと感動しました。
　　Javaで出来ることは、自分が思っているより遥かに多いです。
　　おまけに、ふんわりとしか把握してなかったアノテーションやセキュリティについても
　　しっかりと体得することが出来ました。


------------------------------------------------

以外とネットで調べていると時間が経つのが早いですが、
頭のなかにある知識を引き出すのはもっと早いです。

ネットで調べると10分なんてあっという間です。
分からないことが5個出てきたら1時間なんて調べる時間で終わってしまいます。

私はSE経験歴がまだ浅いので、分からないことも多く
資格取得を通して、自分が知りたいことだけでなくその周辺の知識も体系的取得することが
必要だと感じました。
資格の勉強は効率よく知識をインプットできる方法だと思います。

なるだけ、自分で解決できることは自身で解決し、
現場を資格で習得した知識のアウトプットの場としても活用していきます！

これにて今年の私の資格取得チャレンジは終了になります。
みなさま、良い一年をお過ごしください！！
defer属性がついた<script>タグはHTML解析後、DOMContentLoaded前に実行される

https://developer.mozilla.org/ja/docs/Web/HTML/Element/script

- `<script defer scr="..."></script>`で、HTML解析後、`DOMContentLoaded`前に実行される
- 複数のJavaScriptファイルがある場合、HTMLに表れた順に実行。

クラシックスクリプトって何だよと思ったんですが、モジュールじゃない奴をそう呼んでるんですね。
Windowsネイティブの 最新（最終）版TensorFlow GPU環境をお手軽に構築 (TensorFlow 2.10)

## 1. 概要
以前、Windows 10、Anaconda環境でGPU対応のTensorFlow 2.1.0を構築したときは、conda install tensorflow-gpuで簡単に成功したが、今回（2022年12月）、現在のTensorFlowを同様に、condaでインストールしたところ、tensorflowが正常に起動しなかった。
依存関係等を色々調べて試行錯誤したが上手くいかず、立ち戻って、www.tensorflow.orgに行くと、（今は）簡単なStep-by-stepのインストール方法が記載してあり、これが一番、手っ取り早った。

[Install TensorFlow with pip (https://www.tensorflow.org/install/pip)](https://www.tensorflow.org/install/pip)

## 2. 環境
* GPU: GeForce RTX 2060
* GPUドライバー 462.75から527.56にアップデート
* Windows 11 Pro 22H2
* CPU: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz

## 3. 実際にやった手順
上記URLのWindows Nativeの手順を参考に以下を実施

0. システム要件、ソフトウェア要件の確認
   * 上記URLに記載のシステム要件、ソフトウェア要件を確認。

1. Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017, 2019, and 2022のインストール
   * ダウンロード先はURLのStep-by-step手順に記載されているので、ダウンロードして、exeを実行。

2. NVIDIVA　GPU driverのバージョンアップ（私のPCでは古いドライバだったため）
   * GEFORCE EXPERIENCEをバージョンアップしてから、GPU driverを更新。（GEFORCE EXPERIENCE 3.18.0.102では、エラーが出て、最新のドライバー527.56をインストールできなかった）
   * GEFORCE EXPERIENCEのバージョンアッは、旧版をアンインストールしなくても、最新版をダウンロードして、exeを実行することでできた。
   
3. Anacondaで新しいTensorFlowをインストールする環境を作成し、その環境に移動
   ```
   conda create --name tf210 python=3.9
   conda activate tf210
   ```


4. CUDA, cuDNNのインストール
   ```
   conda install -c conda-forge cudatoolkit=11.2 cudnn=8.1.0
   ```


5. TensorFlowのインストール
   * 先のURLのStep-by-step手順に書いてある通り、TensorFlowの正式リリースはPyPIのみなので、condaではなくて、pipでインストールすること。（pipは最新化する）
   * WindowsネイティブのTensorFlowのGPU対応は2.10までなので版数に注意。
   ```
   pip install --upgrade pip
   pip install "tensorflow<2.11"

   ```

6. インストールの確認
   * 先のURLに記載されている以下を実行しエラーが発生しないことと、以前作成したDLのモデルを実行してタスクマネージャでGPUが使われていることを確認。
   ```
   python3 -c "import tensorflow as tf; print(tf.reduce_sum(tf.random.normal([1000, 1000])))"

   python3 -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
   ```
2022年版、AtCoder に登録したら解くべき精選過去問 10 問の内1 問を Prolog で解いてみた！

# 2022年版、AtCoder に登録したら解くべき精選過去問 10 問の内1 問を Prolog で解いてみた！

## プロローグ

引用「@drken さんの記事 AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～ にて紹介されている過去問精選 10 問を、論理型プログラミング言語 Prolog で解いてみました。」

出典URL
[AtCoder に登録したら解くべき精選過去問 10 問を Prolog で解いてみた - Qiita](https://qiita.com/n4o847/items/2040067b5388481eae88)

という記事を見たので、自分も解いてみました。

### 注意点

解くべき精選過去問 10 問ですが、今回はその内の1 問を解きました！

引用「2019 年 2 月現在、Prolog は AtCoder の使用可能言語に含まれていません。
ファイル一つにまとまったインタプリタも見つからなかったので、提出によるテストはしておらず、サンプルケースをこちら側で試すだけとなっています。」

とありましたが、2022年 12月現在、Prolog(SWIPL)はAtCoderの使用言語に含まれています。

引用「動作確認には Try It Online の Prolog (SWI) を使用しています。」

僕も、SWIPLを使ってます。
ただし、Macアプリの
『SWI-Prolog.app』
を、使いました。

後は、AtCoderさんのコードテストも使いました…

※注意
以下から、
SWI-Prologのことを、SWIPLとする！

出典URL
[AtCoder に登録したら解くべき精選過去問 10 問を Prolog で解いてみた - Qiita](https://qiita.com/n4o847/items/2040067b5388481eae88)

#### 0.PracticeA - Welcome to AtCoder

問題は、こちらから。
[A - Welcome to AtCoder](https://atcoder.jp/contests/practice/tasks/practice_1)

引用「他の言語版でも言われている通り、大抵はじめにつまずくのは入出力です。」

これは、同意。

引用「Prolog はクエリを投げるとそれに対して返答があるというイメージがありますが、ググったり、ドキュメントを読んだりすると、read/1 や write/1 といった標準入出力用の述語も存在することがわかります。（Prolog の述語は引数の数によって異なる実装にできるので、述語名/引数の数 という書き方をするのが良いようです。）」

これには、同意しかねます…

[readln.pl -- Read line as list of tokens](https://www.swi-prolog.org/pldoc/doc/_SWI_/library/readln.pl#readln/1)

Prolog(SWIPL)には、readln/1
といった便利な標準入力用の述語？が存在します。

今回は、これを使いました。

僕が、書いたコードが以下です。
(ファイル名は、マークダウンの関係でこれにしました。)

```prolog:main.pl
main :-
  readln(A),readln(B),readln(C),nth0(0,B,B1),nth0(1,B,B2),Y is B1 + B2,Z is A+Y,nth0(0,C,S),write(Z),tab(1),writeln(S).
```

これを、AtCoderさんのコードテストに貼り付けると動きます！

※注意
一行目に、
「main :-」
が無いとエラーになり、動かないので注意！

(AtCoderさん、どうにかなりませんか？笑

実際に、ACしたリンクは以下です。

[提出 #37630222 - practice contest](https://atcoder.jp/contests/practice/submissions/37630222)

## エピローグ

引用「次回の AtCoder の言語アップデートで Prolog が追加される可能性が浮上してきています。もし Prolog が追加されれば色々な問題が Prolog で解かれるようになり、計算量やベストプラクティスなどの考察も栄えていくことでしょう。楽しみですね。」

2022年 12月現在、Prolog(SWIPL)はAtCoderの使用言語に含まれています！
これから、Prologコミュニティが盛り上がってくれると嬉しいのですが…

出典URL
[AtCoder に登録したら解くべき精選過去問 10 問を Prolog で解いてみた - Qiita](https://qiita.com/n4o847/items/2040067b5388481eae88)
APIキーを隠す  (GoogleMapsAPIを参考に)


GoogleCloudPlatformにてGoogleMapsAPIを利用する際にはAPIキーを取得し、アプリに反映させなければなりません。
その際に注意してほしいのが、APIキーはAPI提供事業者から、利用者個人またはプロジェクトに対して専用で割り当てられるものです。なので、APIキーを盗まれて不正に利用された場合、悪質なアカウントとして停止されたり、ユーザーの個人情報が盗まれたりする危険性が出てきます。APIキーはパスワードなどの認証情報と同じく、厳重に管理しなければなりません。

分かりやすく言うならば、
**APIキーを公開してる=裸で街を歩いてる状態**ということです。

<br>

GoogleMapsAPIを利用する記事はこちら
[Railsで地図 投稿 地名検索 一覧表示 GoogleMapsAPI(JavaScript) gemなし](https://qiita.com/kakeru0520sou1/items/9a39b3a122a8be5b9b65)
<br>
今回は、この記事でAPIキーを利用する際に、APIキーを非表示にする方法を記事にしました！！

# いざ実装！！
この記事では、

```ruby:post/new.rb
<script src="https://maps.googleapis.com/maps/api/js?key=YOURAPIKEY&callback=initMap" async defer></script>
```

と書いていますが、

```ruby:post/new.rb
<script src="https://maps.googleapis.com/maps/api/js?key=<%= ENV['GOOGLE_MAP_KEY'] %>&callback=initMap" async defer></script>
```

と書き直します。
<br>
次に```.env```というファイルをappと同じ階層で作成します。

```ruby:.env
GOOGLE_MAP_KEY=自分のAPIキーをここに書く！
```
<br>
<br>

次に、```.env```ファイルと同じ階層に```.gitignore```というファイルがあると思うので、

```ruby:.gitignore
/.env
```

と記述すればAPIキーが非公開にされます。これで安心ですね！！

他の箇所でも応用が効く技術なので皆さんも試してみてください。
無線LANコントロールプレーンの冗長化

# コントローラを管理する理由について

- 2~3台のコントローラであれば管理できるが、それ以上の台数になると管理が大変になる。具体的には、以下の理由がある
    - 電波環境を管理するため
    - APそれぞれの設定を管理するため
    - 冗長性を上げて、障害に対応するため
- AOS8では、コントローラを管理する方法として、以下の３つがある
    - MM-MD
    - MCM-MD
    - Standalone
    
![スクリーンショット 2022-09-29 12.26.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821468/3de340ef-ae5c-ba20-df96-788cf2dee65e.png)
        
# L2 Redundancy(MM/MCM冗長化方式)
        
ActiveになっているMMが障害で機能しなくなった時にStandbyになっているMCMに切り替わる。StandbyになってるMCMでコントローラの設定変更が可能。preemptでActiveに切り替えられる。
        
プリエンプト機能(preempt)とは、任意のルータをアクティブルータにする機能
![スクリーンショット 2022-09-29 12.33.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821468/0e8138b5-7d0a-e88e-327f-bc3b37c5f724.png)
        
# L3 Redundancy(MM/MM冗長化方式)
        
管理IPアドレスが同一セグメントである必要がないため、サイト間での冗長が可能になる。      
Primaryに障害が発生すると、Secondaryに切り替わって、Primaryが復旧するとPrimaryに切り替わる。
Secondary側では、設定変更ができず、Primaryでしかできない。
![スクリーンショット 2022-09-29 12.55.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821468/796671d3-226f-f7b7-e9c2-16b5b7674f13.png)
  
        
# L2&L3 Redundancy
        
この冗長をとることでMM1台の単一障害では、L2 RedundancyのVRRPにより切り替わり、サイト障害の際には、L3 RedundancyでSecondaryのMMに切り替えることが可能
![スクリーンショット 2022-09-29 13.00.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821468/e7efa5bc-4a8a-2c43-5872-8f7751deec6d.png)
FDMemTable(FireDAC)フィールド定義作成

別ブログに書いて "Delphi Advent Calendar 2016" の記事を一部書き直しQiitaに再投稿したものです。

# はじめに
FDMemTableのフィールド定義をIDE上で行う方法は、最近のDelphiでは、”データセットの割り当て..”機能を使うことで、TFDQueryなどから、取り込むことができるようになっていますが、古いもの（XE5以前は無い。XE6,XE7は未確認。XE8以降はあり）では、このメニューが出ません。
このため、フィールドを１つづつ手作業で追加するということになりちょっと面倒です。これをちょっと楽するためのテクニックです。

# 実際のテクニック
## FDMemTableを使った方法
最近のDelphiの方法
1)FDMemTableで必要なフィールドを取得できるクエリを書いたFDQueryを作成。
2)FDQueryをOpenし、フィールドエディタですべてのフィールを取り込む。
3)FDMemTable上で、右マウスボタンでメニューを表示。
4)"データセット割り当て"を選択。
5)上記、FDQueryを選択。
6)再度、FDMemTable上で、右マウスボタンでメニューを表示。
7)"フィールドエディタ"を選択
8)"フィールドエディタ"上で、右マウスボタンでメニューを表示。
9)"すべてのフィールドを追加"を選択
10)FDQueryのフィールド定義がコピーされる。
以上

## ClientDataSetを使った方法
古いものでは、4) の"データセット割り当て"が無く、”項目の設定”のみである。
ClientDataSetは、上記と同様の作業ができるので、こちらを使う。
プロパティの関連図けは
ClientDataSet1. ProviderName -> DataSetProvider1
DataSetProvider1.Dataset -> FDQuery1
1)上記プロパティ設定後、ClientDataSet1上で、右マウスボタンでメニューを表示。
2)”項目の設定”を選択。フィールドエディタが表示される。
3)"フィールドエディタ"上で、右マウスボタンでメニューを表示。
4)"すべてのフィールドを追加"を選択
5)FDQueryのフィールド定義がコピーされる。
6)dfmをエディタ表示する。
7)上記、ClientDataSet1のクラスを、TFDMemTableに変更。
8)エディタからフォーム表示へ
9)プロパティの相違でエラーメッセージが出るが無視。
10)保存で、ClientDataSet1のpas上のクラス定義の相違のメッセージが出るのでOKする。
以上

# あわりに
HTTPとFTP

# 概要
ファイル転送プロトコルとしてFTPがあるが、HTTPでもファイル転送が可能、、あれ？FTPは必要なのか、と疑問になったので少し調べた。  

# FTP(File Transfer Protocol)とは
ファイル転送プロトコル。  
開発の経緯としてRFC(技術仕様が書かれた文章)をオンライン参照するために作られたという歴史がある。

# HTTP(HyperText Transfer Protocol)とは
HyperText(文章と文章を関連付けする仕組み)を転送するプロトコル。

# FTPとHTTPの共通点
・Transfer Protocolの通り、ファイルを転送するプロトコルである。
・マルチプラットフォーム(OSに依存しない)
・サーバー/クライアント形式

# FTPとHTTPの相違点
・認証の有無(FTPの軽量版であるTFTPは認証がない)
・使用するポート数(FTPは制御とデータ用の20/21、HTTPは80のみ)

# FTPの優位性はあるのか
ここで本題になるが、個人的な意見として「**ほとんどの場合HTTPで事足りる**」。
昔は巨大なファイル転送はFTPが適しているというということで、窓の杜でもFTPによるダウンロードリンクがあったと記憶している。
しかし、現在はインストールファイルはおろか、OSのイメージファイル(.iso)ですらHTTPで転送されている。
[こちらのフォーラム](https://www.web-dev-qa-db-ja.com/ja/http/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E8%BB%A2%E9%80%81%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEhttp%E3%81%A8ftp%E3%81%AE%E6%AF%94%E8%BC%83/957943772/)でも、HTTPの方が高速とされている。
ただ、ネットワーク機器のCisco Catalystのisoファイルアップロードなどではまだまだ使われているそう
プロダクト開発でタスクの優先順位を付ける方法

プロダクト開発時に施策の優先度を決めるのは簡単ではありません。感覚的に決めてしまい十分な根拠を持てなかったり、他のメンバーが認識している優先順位と異なったり、結果的にその優先順位付けが正しかったのかわからなかったりと、悩みがつきません。
これをどのように解決すべきかを私なりに考えてみました。

# 問題
- プロダクト開発時にタスクの優先順位を正しく決めることは容易ではない
- 多くのチームは責任者が思いついたタスクの中から良さそうと思ったものに着手している
- タスク優先順位付けという、難度と影響度が高い意思決定について振返り改善するという機会を持たないという損失を多くのチームが被っている


# 課題の設定
- タスクの優先順位を決めるための有用なスコアリング手法を取り入れる
- 優先順位付けを振返り、精度をあげる運用手法を取り入れる

# 解決方法の検討
## タスクの優先順位を決めるための有用なスコアリング手法を選ぶ
- [こちらの記事](https://www.productplan.com/learn/product-management-frameworks/)にて、12の優先順位付けフレームワークが紹介されている
    1. Value vs. Complexity
    1. Benefit vs. Cost (Weighted Scoring)
    1. Kano
    1. Buy-a-Feature
    1. Opportunity Scoring
    1. Affinity Grouping
    1. Story Mapping
    1. Eisenhower Matrix
    1. ICE Scoring
    1. Impact Mapping
    1. MoSCoW Analysis
    1. RICE Scoring
- この中から優先度を定量化できて、かつ、適切な分解ができるものを選択する
    - 考え方の例
        - 1 Value vs. Complexity では2要素の分解なので少なすぎる。Valueについて因数分解が必要になる
        - 6 Affinity Grouping はスコアリング方法ではない
    - 今回設定した課題の解決には以下の2つが向いている
        - 9 ICE Scoring
            - 施策ごとにImpact、Confidence、Effortの3点を予測、スコアリングして比較する
        - 12 RICE Scoring
            - 施策ごとにReach、Impact、Confidence、Effortの4点を予測、スコアリングして比較する

## 優先順位付けを振返り、精度をあげられるような運用手法を取り入れる
- 上述の手法を用いてチームまたは責任者がスコアリングして記録する
    - なぜそのスコアにしたのかを書いておく
- 施策実施後に効果を検証する
- スコアリング時の予測と検証結果を突き合わせて、スコアリング時の予測へのフィードバックを記録する
- 次のスコアリング時にフィードバックを参考にしてスコアリングする


# 結論
- 以下の改善サイクルを回すことで、プロダクト開発での優先順位付けの精度を向上し続けることができる
    - プロダクト開発でのタスクの優先順位付けは、適切に要因を分解して予測を記録する
        - 適切に要因を分解して優先順位を付ける方法として、ICE Scoring、RICE Scoringが有用である
    - 施策実施後に計測結果と予測を比較して振り返ることで、結果と乖離した予測を認識する
    - 次の施策の効果予測の際に、蓄積した予実評価を活用することで精度をあげる


# 参考
- [The Ultimate Guide to Product Management Prioritization Frameworks](https://www.productplan.com/learn/product-management-frameworks/)
Docker で TypeScript のシェルから実行する確認環境を構築する

# はじめに
Dockerコンテナ上でコマンドラインからTypeScriptを実行確認するための環境構築＆実行するためのメモ残し。
２年ぶりくらいに１から環境作ると、全然動かなかったので調整。

# 修正
2023/01/04 パラメータの内容を整理
2025/05/21 新しいバージョン(dockerとTypeScript両方)のもので整理＆調整

# 環境
- Windows11 pro 
- wsl2(22.04.5 LTS (Focal Fossa))
- Dockerのバージョン
    - Docker version 27.5.1, build 9f9e405
    - docker-compose v2.32.4
※Docker Desktop ではありません
　を入れています

## フォルダ構成
```
[projectfolder]
 ├─ docker-compose.yml
 ├─ Dockerfile
 └─ .env
```

## ファイル構成をざっくりと
基本的に変更する可能性のある設定値は .env に記載する。
コマンドラインでプログラムは実行確認する。
流用すれば、Webのフレームワークも使える（docker-composeファイルにコマンドorスクリプト作成）。

## 各ファイル

```yaml:docker-compose.yml
services:
  app:
    image: ${PROJECT_NAME}:${IMAGE_VERSION}
    build:
      context: .
      args:
        UID: ${UID}
        GID: ${GID}
        USERNAME: ${USERNAME}
        GROUPNAME: ${GROUPNAME}
        WORKDIR: ${WORKDIR}
        NODE_IMAGE_TAG: ${NODE_IMAGE_TAG}
    tty: true
    environment:
        - TZ:${TIMEZONE}
    volumes:
      - .:${WORKDIR}
```

```Dockerfile:Dockerfile
# イメージ指定
ARG NODE_IMAGE_TAG
FROM node:$NODE_IMAGE_TAG

# パッケージ更新
RUN apt-get update

# パラメータ変数
ARG USERNAME
ARG GROUPNAME
ARG UID
ARG GID
ARG WORKDIR

# ユーザー情報変更
RUN groupmod -g $GID node
RUN groupmod -n $GROUPNAME node
RUN usermod -u $UID node
RUN usermod -l $USERNAME node

# すべてのファイルをnodeユーザーのものに
RUN mkdir -p $WORKDIR
RUN chown -R $GID:$UID $WORKDIR

# ユーザー切り替え
USER $USERNAME

# 作業ディレクトリ変更
WORKDIR $WORKDIR
```

```conf:.env 
# コンテナ内作業ディレクトリ
# ユーザー情報(UID, GIDはホストの環境に合わせて)
UID=1000
GID=1000
USERNAME=node
GROUPNAME=node

# コンテナ内作業ディレクトリ
WORKDIR=/usr/src/app/ts-test
# タイムゾーン
TIMEZONE=Asia/Tokyo

# Nodeの使用イメージタグ(aptが使えるもののみ)
NODE_IMAGE_TAG=22.15.1-bullseye

# リソース管理（イメージとタグ名）
PROJECT_NAME=ts-test
IMAGE_VERSION=1.0
```

## 起動
```shell
# コンテナ構築
docker compose up -d

# コンテナに入る（コンテナ名はdocker psなどで確認）
docker exec -ti {container_name} sh
# TypeScript実行に必要なものを導入する
npm install typescript ts-node
# tsconfig.json の作成
npx tsc --init
```

## 動作確認例
luxon の動作確認をしたいとき

- 確認用のプログラム
    ```typescript:test.ts
    import { DateTime } from "luxon";
    
    console.log(DateTime.local().toString());
    ```

- パッケージインストール
    ```shell
    npm install luxon @types/luxon
    ```

- 実行確認
    ```shell
    npx ts-node test.ts
    ```

※ファイルはプロジェクトファイル直下に置いている前提

# 補足
.envのUIDとUIDはidコマンドで確認
```
$ id
uid=1000(naozo) gid=1000(naozo) ...,999(docker)
```

# 最後に
細かいコード単位で確認＆実行できる環境は意外と便利なハズ。
DataSet 数値Fieldの書式設定

別のブログで書いた"Delphi / Appmethod Advent Calendar 2017"　投稿記事を一部書き直して、Qiitaに再投稿したものです。

# はじめに
DataSet系＋Data Controlsのコンポーネントの組み合わせで、開発しているプログラムで、数値の書式（３桁カンマ区切り）で苦労しているものがたまにあります。今回は、このあたりがTIntegerFieldのプロパティで対応できるのでその紹介と注意点を纏めます。

# 実装
数値の３桁カンマ区切りついては、TIntegerFieldでは、DisplayFormatプロパティを使用します。
'#,#' または '#,0' を設定します。

ただし、このままだと、編集時もカンマが入ってしまうので、
EditFormatプロパティを使用します。
'#' または '0' を設定します。

このように設定すると、カーソルがあるときは、カンマ無で、カーソルが離れると、カンマ編集された表示になります。

注意点としては、'#,#'＆'#' の組み合わせだと、値が0でも、表示がブランクになります。

# おわりに

今回は、数値の3桁区切りの簡単な対応として紹介していますが、DisplayFormat, EditFormat は、EditMaskと同じ書式設定が使えるようなので、
３桁区切り以外でもいろいろ書式設定ができるようです。
ClientSessionState vs ServerSessionState vs DatabaseSessionState

![export 22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/752a3a26-f127-54b8-c7c2-6bcc98bc154d.png)

https://bliki-ja.github.io/pofeaa/ClientSessionState/

https://bliki-ja.github.io/pofeaa/ServerSessionState/

https://bliki-ja.github.io/pofeaa/DatabaseSessionState/

「セッションステートパターン」をまとめて 3 つ紹介します。

HTTP というプロトコルはステートレスです。TCP ポートとの接続継続が保証される仕組みと異なり、クライアントとサーバーの間には持続的なコンテキストがありません。この特性のおかげで、サーバーのキャパシティを超えた HTML を配信できます。しかし、手続き的な操作が必要なアプリケーションとこの HTTP の特性は、あまり相性の良いものではありません。状態を保持するセッションを、アプリケーションの工夫で設ける必要があります。

Client Session State は、Web ブラウザ側の Cookie など、クライアント側に状態を保持するパターンです。Cookie のほか、クエリパラメータや HTML の hidden タグ、(PoEAA では紹介されていませんが現在では) JavaScript の変数や、その永続化先としてのローカルスロレージといったものに、コンテキストを持続させるための情報を保持します。

Client Session State の欠点は、状態変数が増えたときの通信量です。とくに Cookie は、毎回使うとは限らない情報を送ることになります。また、その 1 エントリの容量はたった 4KB しかありません。クエリパラメータや hidden タグは、連続するリクエストの途中でバトンリレーが途切れてしまうリスクがあります。すべての Client Session State に共通する問題は、虚偽のデータを捏造する余地があることです。

Server Session State は、状態変数の実体をサーバー側に持たせるパターンです。クライアントが持つ変数は、サーバーが持っているデータを特定するための ID だけになります。多くの Web アプリケーションフレームワークで、Server Session State の機能がサポートされています。

Server Session State があるからといって、Web アプリケーションがデスクトップアプリケーションのように、何でもできるようになるわけではありません。サーバーは全ユーザーの状態を一手に抱えることになります。あまりに大きなデータをセッションに入れると、サーバーのキャパシティを超えるおそれがあります。保存したはいいけれど、クライアントが ID を紛失したまま放置されたデータが、ディスクを圧迫してシステムが機能しなくなる問題が考えられます。

Server Session State の中でも、データを共用データベースに置くのが Database Session State パターンです。

HTTP でコンテンツを配信するサーバーのメリットは、ロードバランシングが簡単だということです。機能ごとに異なる物理サーバーに割り振ったり、同じ機能を持つ複数のサーバーにランダムにリクエストを割り振っても、クライアント側にサーバーが 1 台だけのときと同じように見せることができます。このようなスケーリングを意識した場合、各サーバーのメモリやローカルディスクにセッション情報を持たせると、接続の割り振りによってクライアントの状態がちぐはぐになってしまいます。

スケーリングを意識した Web アプリケーションは、セッションの保存先として、アプリケーションサーバーとは異なるデータベースを選択するのが一般的です。セッション情報にとって重要なのはユニーク ID だけなので、現在では Redis のような KVS に、データをシリアライズして格納する方式がよく選択されます。とはいえ、負荷が問題にならないうちは、RDB のテーブルを保存先にしても、十分に役目を果たしてくれるでしょう。

Server Session State を選択する場合は、スケーリングを見越して、ストレージを抽象化して、戦略をプラガブルにしておくのが適当です。逆に、全てを Client Session State とする Web API という選択肢も、現在では十分に考えられます。よほど重要な情報でないかぎりは、シングルページアプリケーションの JavaScript の変数で、十分に状態を管理できるからです。認証トークンの JWT 以外の情報は、必要なときだけ送るようブラウザ内アプリケーションを作ることができると、もっとも効率的で、HTTP のステートレスさとも相性の良いものにできる可能性があります。
[VSCode]シンボルの検索には"ctrl+F"じゃなくて●●を使うといいよって話

# 「シンボル」について
VSCodeでは、変数や関数、クラスなどなどをひとまとめに**シンボル**と呼びます。
今回の話はシンボルとして扱えるもの全般に応用できるので、覚えておいて損はないと思います。

通常、文字列の検索であれば`ctrl+F`で検索することが多いかと思われますが、これでは文字列などの値も同じように拾うため、目的のシンボルを探すのが少し面倒です。
そのため、VSCodeのショートカットの一つ「**ワークスペース内のシンボル検索**」を用いて、ちょっとだけスマートに検索することを目的とします。

# まずは有効にする
さっそく実践...といきたいところですが、どうやら当機能はデフォルトでは有効になっていないみたいです。便利なのに。
そのため、まずはショートカットキーを割り当てるところからやっていきます。

1.`ctrl+shift+P`でコマンド検索画面を開き、「shortcut」と入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/4370f751-0b17-a8fd-40ae-a7d8bda76c3d.png)
「基本設定：キーボードショートカットを開く」があればそれを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/f953a3ba-7085-9db3-50c0-c54233d0e985.png)

こんな感じの画面がでたらok。

2.上の検索窓に「symbol」と打ち込み検索。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/eba48be9-d6e0-7e31-ac47-6c3c2cf3c639.png)

「ワークスペース内のシンボルへ移動」というのが該当機能です。
クリックしてお好きなキー割り当てを試してみてください。当記事では`ctrl+T`として進めます。

# 実際にやってみた
今回はNode.jsのクローンリポジトリで試してみます。
適当に`node`と入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/82887756-4939-8044-7ded-ccf7339fbcd0.png)
おー。いろいろ出てきました。
試しに一番上のやつに飛んでみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/487eceee-e699-d01a-3671-cc0b1244dd9c.png)

しっかり飛べましたね。
ちなみに遷移前の画面には`ctrl+←`で戻ることができるようです。便利。

# おまけ
せっかくなので、シンボルの一覧も見てみます。

こちらは`ctrl+shift+O`でデフォルト登録されています。
また、ファイルを開いた状態でのみ機能するようなのでそこも注意。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/6024cdf9-4cf2-3dd3-5339-c7242366f0b8.png)

312件ヒットしました。
ちなみに、キーワードの頭に`:`をつけることでジャンル分けしてくれます。うれしい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/f4250ff9-abcb-b538-454a-5d41068d71c2.png)
一覧の行番号にTFDMemTable.RecNoプロパティ

これは別ブログに書いた "Delphi Advent Calendar 2018" の ２３ 日目の記事を一部書き直して、Qiitaに再投稿したものです。

# はじめに
伝票などの明細一覧で、行番号の表示は、行の追加や削除を考えるとちょっと面倒なところです。
ちょっと手抜きできないかと考えた方法を纏めたものです。

# 実装方法 
データセットのRecNoプロパティの利用しています。
とりあえず簡略化して、下記のような画面の明細画面とします。
テーブルのフィールドは、
    行番号: TIntegerField;
    品名: TWideStringField;
    数量: TIntegerField;
    金額: TIntegerField;
です。データセット名は、FDMemTable1とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33683/d3251be7-12f0-8bfd-44e4-b1130d08601b.png)

行番号フィールドのGetTextイベントに下記を追加します。

 Text := FDMemTable1.RecNo.ToString;

削除については、２行目削除すると下記のように、データセットの内容を操作せずリナンバーされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33683/1a0bf778-cef7-25e9-7d9b-cc7bb0bf18d2.png)

追加時は、
となり、行番号が-1となります。データセットに対して、Postをすれば下記のように行番号が設定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33683/d2da940e-dec5-9e6c-1ba0-b065246f4082.png)


実際に、データベースに登録する際は、当然行番号の振り直しは必要になります。

注意点は、RecNoプロパティは、データセットのデータに対し紐づけされているわけではないということです。
ソートや、フィルタをかけると、行番号が変わります。表示されてる行番号が、RecNoの値になっているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33683/1a8129a2-75eb-b3bc-fe6a-c57f00f1a95c.png)
（金額昇順）

RecNoプロパティは、他にも、Bookmark代わりに使えたりしています。



# おわりに
今回は、TFDMemTableで記述しましたが、RecNoプロパティは、TDataSetからあるので他のデータセットでも使えると思いますが、動きが確認できていないので、とりあえず、TFDMemTableとしています。
また今回の上記画面は、Delphi 10.2で動かしています。
モンハンライズの特殊納刀ボタン

# 特殊納刀
 **太刀使いの要の技**

しかし、前転回避や気刃斬りが暴発しやすい

「✖＋R1」を本当に**同時に**押さなくてはいけない

これがかなりシビアなのである。

ということで、今回はこの入力を1ボタンでできるようにします。

PC版のモンハンの話をします。

# キーボード入力
「R1」はマウスの戻るです。
「✖」はspaceです。

余談ですが、ずっとパッドを使っていましたが、意外とキーボードも悪くない気がしてきました。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/4f7b88fb-6b21-85f7-9bf9-39a6a81802a4.png)

設定画面を見ていたら、なんと特殊納刀専用のキーを設定することができるみたいです。
「CONTROLS」->「キーボード設定」で行けます。
とりあえず、「T」キーにセットしておきました。

パッドの方もできたらいいんですけど、難しそうです。

# Arduino Pro
あとは、Tキーを入力するだけです。
キーボード入力とコントローラ入力が行き来しますが、問題なさそうです。

CAPCOM最高やな！

作ったはいいんですが、ボタンをPS4コントローラのどこに配置するか問題が出てきました。


# 最終的な結論
JoyTokeyでPS4コントローラのホームボタンを「T」入力に変更してやるのが一番でした。

これで太刀が捗ります
というか、特殊納刀カウンターから特殊納刀できるの楽しすぎるし、1ボタンで暴発しないからストレスフリーすぎる！！！！
RedSpicaWS-8 Make Many Buri-Oden

## 問題

https://mojacoder.app/users/RedSpica/contests/RedSpica-Winter-Selection/tasks/8


## 方針

答えを二分探索しました。

答えがmidにできるかどうかを判定する方法は、次の通りです。

・まずどれか1つぶりおでんセットをとる

・必要なぶりの個数、おでんの個数をそれぞれ計算する。

・あらかじめ、max_oden_list[b]: ぶりがb個以上ほしいときに取れるおでんの量 になってるリストmax_oden_listを作っておく。

・max_oden_list[必要なぶりの個数]>=必要なおでんの個数 になってたらok

・ダメだったら、他のぶりおでんセットで同じチャレンジをする。

・全部ダメだったら、答えをmidにすることはできません。ざんねん。

## ACコード

```python
from bisect import bisect_left

N = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))

BO_list = [(a, b) for a, b in zip(A, B)]
BO_list.sort()

max_oden_list = [-1] * 200_001
for buri, oden in BO_list:
    max_oden_list[buri] = max(max_oden_list[buri], oden)

max_oden = -1
for i in range(200_000, -1, -1):
    max_oden = max(max_oden, max_oden_list[i])
    max_oden_list[i] = max_oden


def judge(m):
    for buri, oden in BO_list:
        need_buri, need_oden = m - buri, m - oden
        if max_oden_list[need_buri] >= need_oden:
            return True
    return False


left, right = 1, 200_000
while right - left >= 2:
    mid = (left + right) // 2
    if judge(mid):
        left = mid
    else:
        right = mid - 1
if judge(right):
    print(right)
else:
    print(left)
```
vue cliにモジュール/機能を追加する方法

# はじめに
　簡単に「この機能は後から追加することが出来る」とか言われても、コマンドがわからなければ追加が出来ない。調べても調べても簡単であろうコマンドが分からない。
　とかいう急がば回れを実行できなかった者が辿り着いた簡単な結論を書いておきます。

# コマンド

　VueCLIを特に何も機能を付けずにcreateします。
　例えばそこにTypescriptをインストールします。

```
vue add typescript
```

　すると、幾つかのオプションを選んで、Typescriptのインストールが完了します。
　**以上!**

# おまけ
　Vue のCLIをcreateするときに見ることが出来る機能一覧ですが、いちいち見るのがめんどくさいという人のための機能の一覧をスクショしたものを置いておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/00d4970a-bec7-080a-9260-8326b036b701.png)
RedSpicaWS-7 Load to cocoa

## 問題


https://mojacoder.app/users/RedSpica/contests/RedSpica-Winter-Selection/tasks/6



## 方針
スタート地点→商店→スパークリング黒ココアをゲット→スタート地点、の流れ。

world1: まだ商店に到達していない世界

world2: 商店には到達したけど、スパークリング黒ココアはゲットしていない世界

world3: 商店に到達してるし、スパークリング黒ココアもゲットしてる世界

の3つの世界を作って、商店のある地点はworld1→world2にいける長さ0の道を、スパークリング黒ココアのある地点はworld2→world3にいける長さ0の道を作る。

ダイクストラ法でがんばります。

world3の話をしてるときにworld1の辺の話をしたりしてるけど、計算量的に間に合うでしょって投げたらACだったのでokということで！！！！


## ACコード

```python
from heapq import heappop, heappush, heapify


# スタート位置s,頂点数n,各始点の[終点,コスト]
def dijkstra(s, n, lis):
    dist = [float('Inf')] * n
    dist[s] = 0
    que = [(0, s)]
    heapify(que)
    used = [False] * n
    while que:
        _, pos = heappop(que)
        if used[pos]:
            continue
        used[pos] = True
        for to, pcost in lis[pos]:
            cost = dist[pos] + pcost
            if dist[to] > cost:
                dist[to] = cost
                heappush(que, (cost, to))
    return dist


N, M = map(int, input().split())

# 0~N-1:中継点未到達, N~2N-1:中継点1到達済み, 2N~3N-1:中継点2到達済み
G = [[] for _ in range(N * 3)]
G[2 * N - 1].append((3 * N - 1, 0))
for _ in range(M):
    u, v, l = map(int, input().split())
    u, v = u - 1, v - 1
    G[u].append((v, l))
    G[v].append((u, l))
    G[u + N].append((v + N, l))
    G[v + N].append((u + N, l))
    G[u + N * 2].append((v + N * 2, l))
    G[v + N * 2].append((u + N * 2, l))
K = int(input())
P = [int(p) - 1 for p in input().split()]
for p in P:
    G[p].append((p + N, 0))

dist = dijkstra(0, N * 3, G)
print(dist[2 * N])
```
偏差値40がJava Goldに合格するまで~~

~~Java Goldに合格するまで

◆試験結果
・１回目　正解率：48%
・２回目　正解率：65%

◆経歴
・F欄を卒業後、新卒でIT企業に入社して現在（2023/1）で9年目のSE。
・1~3年目まではテスター。4年目から現在に至るまでJavaの開発者。

◆保有資格
・2016/11/12 「Java SE 7/8 Bronze」合格
・2018/2/25  「Java SE 8 Programmer I」合格
・2021/5/9   「Java SE 8 Programmer II」合格

◆勉強期間
・2020/8/4~2021/5/8
（9/中旬~12/中旬、1/初旬~2/下旬までは仕事が多忙で勉強を中止していたため、実質4カ月）

◆参考書
・紫本
・黒本

◆参考書の感想
・当初、紫本をメインに勉強を進めていました。というのも黒本の解説がわかりにくいのと、紫本の方が情報量が多い（個人的な感想）という理由で『黒本やらなくていいんじゃね？』ってなってました。※最終的な割合は黒本8の紫本2くらいになります。
実際に紫本を進めていく中で読んでいて理解できない箇所はほとんどありませんでした。1周終わったタイミングで黒本の章末問題を解いてみたら見事に撃沈しましたが…。
ある程度のインプットはできたなと思っていましたが、試験に酷似した問題が出題される黒本で結果が残せないのであれば意味がありません。ただインプットをしたおかげもあり、当初ほど黒本に対する苦手意識は消えており、スムーズに黒本を進めていくことができました。黒本の章末問題を1～10章まで一気に解いて全体の正答率が80%を超えるまで模擬試験は取っておいたのですが、いざ、80%を超えて模擬試験を受けてみると、これがまぁ2回目の撃沈ですね。正答率30%くらいだったと思います。何故か全く解けませんでした。というのも、章末問題で選択肢には存在するけど回答にはなっていないものについて一切理解や記憶をしていませんでした。（そりゃ解けなくて当然）
現状の弱い部分を把握できたのでそこについて再度勉強を開始し、もう十分だろうというところでWEBの模試を受けました。これが3度目の撃沈でした…。このときの理由として、問題（ソースコード）をしっかり読んでいないところにありました。例えばmax()の戻り値はOptional ※Tにも関わらず、代入先がStream<String>となっていてもコンパイルエラーであることに気が付かないとか。このように新しい問題を解く度、課題は見つかりましたが知識が増えるのが楽しく自然と勉強は苦ではありませんでした。
※Qiitaの記事上<>←を付けると何故か非表示になってしまうので外してます

◆受験の感想1回目
Oracleが実施している12月~5月までの再受験無料キャンペーンを使って応募していたので落ちてもいいくらいの気持ちで受けました。
感想としては『そこまで難しくないな？でもこれってどっちだっけ？』といった感じでした。
受かるように調整をしてきたわけではないので（←言い訳）、所々記憶が曖昧になっており、不安な選択が続きましたが、受験までに黒本の章末を5周、模擬試験をWEBと本で2回ずつ受けていたので、時間配分だけは完璧で最後に10分ほど見直しができるくらいの余裕がありました。予想通り落ちていましたが、『これならつぎいけるな』と謎の手応えを感じていました。

◆受験の感想2回目
万全を期すために日々溜め込んできた暗記ノートを何周もし、3日前から紫本、黒本で下記の章について再復習をしました。
・JavaストリームAPI
・入出力
・スレッドと並列処理
※自分で適当な問題を作成し、ノートに対象のメソッドを使った処理をノートが黒くなるまでひたすら続けて体に記憶させました。

上記の項目について、出題数も多く1回目であれば不安だらけな回答を続けていたと思いますが、自信を持って回答することができました。
（結果としては合格ラインギリギリだったのであまり声を大にして言えませんが…。）

◆取得してみて
私はSESをメインとした会社に所属しており、スキルシートに『自分Goldホルダーなんすよ』って記載したい思いで学習を進めていました。実際に記載した際には『来るとこまできたな』感がすごく、感無量でした。
ただ、決してGoldを保持していることが「実務でWEBシステム作れます」ということにはならないので、その部分については勝って兜の緒を締めよの精神で今後も学習を進めていく所存です。
（寧ろGold持ってることで周りからの期待が無駄に上がりそう…。）
何はともあれ難関？資格を取得できたことは自分の自信に繋がりますし、今後のモチベーションも格段にアップするため、現在勉強中の方は最後まで諦めずに挑戦してほしいと思います。
電子工作で作ったら面白そうなもの【随時更新】

# 対象読者
- 僕
- マイコン買ったけど、特にやりたいことが思いつかない方
# 一覧
:::note
- [ ] **郵便受けにものが入ってるか検知**
遠隔でライトつけられるようにすれば荷物の確認もできそう。重量とかで物が入ってきた時に検知とかもできそう。
- [ ] **スマホからエアコン操作**
  イメージとしてはSwitchBotに近い。エアコンをつけてからの時間の経過を測定して、つけっぱなしなら音声通知や自動で切るとかも出来そう。

- [ ] **ペット見守りカメラ**
  見守りカメラもいいけど加えて統計取ったりしたら楽しそう。何回、目の前を通ったかとかで活発度が分かるんじゃないかな。
- [x] **自動餌やり器**
ペットに餌あげたかって地味に忘れちゃうんですよね。時間带で量の調整とかもできると良い。ラックアンドピニオンを使った実装だと量の調整がキツそうなので、プロペラ回して穴に落とす感じで。見守りカメラとシナジー生めそう。

- [ ] **自動水やり器**
土が乾いたことを感知して、水やり自動化。ズボラな僕でも観葉植物デビューできちゃう。
- [ ] **スマートロック**
家の鍵閉め忘れた時に遠隔でロックできるの地味に便利な気がする。
- [ ] **低温調理器**
温度を一定に保つのが大事らしい。思ったより簡単そう。
- [ ] **盗聴器 / 監視カメラ**
一度作ってみたい。浪漫。
- [ ] **タブレットクリッカー**
ソシャゲの周回に使ったりしたい。
- [ ] **chatGPTとお喋り**
可愛いビジュアルを表示できたら激アツです。

:::

随時更新します。
コメント欄にもこんなの面白そうみたいなのあったら書き込んで欲しいです🙏

# 参考
https://qiita.com/inui_yui/items/6de23911cded9d4423dc

https://qiita.com/katsumin/items/517cd9fbe66e26d72fa7

https://qiita.com/mihotoyama/items/ad6fd2a788356be8d261

https://qiita.com/kmaepu/items/8df190fd9dac4780e5d2

https://qiita.com/ma38su/items/9f47d100e95b6991ab21

https://qiita.com/bigface00/items/d59ba7ccffce99ce259a

https://qiita.com/dainbe/items/9c21f82c245dacd72876

https://qiita.com/moritakuya/items/c60996398ab32851732f

https://qiita.com/coppercele/items/a46bb2437f9c73ffa061
wordpressが急にログインできなくなった話

# 経緯
研究室HPを自前サーバを用いて運用している。そいつは歴代研究室メンバーが管理している。

ある日、1ヶ月前まではログインできたwordpressにログインできなくなった。ログインしてもリダイレクトが発生し、ログインページに戻ってしまう。一応間違ったパスワードを入れるとちゃんと弾かれるので、どうしたものかと。

調べたところ、"cookieを一度削除すればよい"という記事がヒットしたのでそれをやるも失敗。

# 調査
サーバ内で異常がないかを見るため、サーバに直接アクセス。そこではwordpressもそうだが、phpmyadminにすらログインできない。
サーバのコンソールを開いて調べる。補完のためのtabキーを押したら「容量がいっぱいだから補完できないわ(意訳)」というメッセージが。
急に容量いっぱいになる???? 攻撃された?? と思いつつ、容量の大きいディレクトリはどれだと探したところ、一つだけ容量がバカでかいディレクトリがヒット。
中を見ると、そこには4年分のwordpressのバックアップデータが。月1でバックアップを取るプログラムが動いていたらしく、そいつのせいで容量がいっぱいになっていた。一番古いバックアップを消してから、wordpressにログインすると無事成功。phpmyadminもログインできました。
(あとでプログラムを見たところ、バックアップを取ってそれをNASにコピーするということを行なっていました。じゃあNASもいつかは...)

# 結論
**引き継ぎは大事**