OmniAICreator/Qiita-1.07M huggingface dataset:
プラハチャレンジに挑戦します（決意表明）

こんにちは、リッキーです。
未経験からエンジニアに転職して、9か月経ちました。ある程度仕事にも慣れてきて、技術の勉強をしようというモチベーションが薄れてきていました（転職前はめちゃくちゃ勉強していたのに...）
そんな中、プラハチャレンジという会員制の勉強グループを見つけました。
https://praha-challenge.com

参加するためには、事前試験と面談に合格する必要があるという、かなり質の高そうな勉強会です。しかも、複数人でコードをレビューしあったり、特定の話題について議論したりと（メンターのサポート付き）、一人ではできない密度の濃い勉強会になりそうです。
今のだらだらとした現状を打破するにはこれしかないと思い、試験を受けました。幸運なことに、試験に通過し、プラハチャレンジに第７期生として参加することになりました！！平日は１時間、土日は４時間の勉強で卒業までに１年ほどかかるらしいです。ちょうど１年後くらいに転職しようとも考えているので、来年の転職活動を成功させるためにも、頑張ります。

プラハチャレンジでどんなことを勉強するのか？
詳しくはHPに記載されていますが、フロントからバックエンド、インフラまでまんべんなくやる印象です。言語としてはTypeScriptがメインだと思います。私は業務でバックエンドエンジニアとして、PHPとLaravelで開発しているので、TypeScriptを書いた経験がほとんどありません。プラハチャレンジで、TypeScriptの書き方を実戦形式で習得して、力をつけていきたいです。

アウトプットの習慣を身につける
プラハチャレンジを通して学んだことは、このQiitaで発信していきたいと思います。最近、職場に後輩のような存在ができ、時折質問を受けます。しかしきちんと説明できないので、自分の能力の低さを痛感します。
後輩から相談を受けると、「こうやったら解決できるかな？」と解決案がいくつか浮かぶのですが、この方法試して、ダメだったらこっちの方法試してとぐちゃぐちゃな指示と説明しかできません。「ここは○○が原因だから、××という方法を試せばいいよ」と、明確な回答ができるようになりたいです。自分一人で勉強しているうちは、この能力は身につかないと思います。自分一人だととりあえず動けばいいと優先してしまうので、動いたらそれ以上考えることをやめてしまいます（そうでない人もたくさんいると思いますが）誰かと議論したり、文章にまとめたりすることで、プログラミングの知識について、深く理解したいです。

毎日更新は難しくても、なるべく多くの記事が書けるようにこれから頑張ります。
jqコマンド：日付変換による「strftime」「strptime」の使い分け

# きっかけ
jqコマンドで「unix時刻」から「jst時刻のYYYY-mm-dd HH:MM:SS」へ変換したときに、初めに「strptime」を利用したところ想定通りの結果が出力されず困ってしまいました。
よくよく調べたところ「strptime」ではなく、「strftime」を利用することで、想定通りの結果が出力されたので、記事にしてみました！

# strftime
* 欲しい情報を取得することができた（utcからjstへの変換により、「9 * 3600」を追加してます）
```bash
echo '{"date":"1565382027"}' | jq '.date | tonumber + 9 * 3600 | strftime("%Y-%m-%dT%H:%M:%S")'
"2019-08-10T05:20:27"
```

* 出力結果のダブルクォテーションを外したい場合は「オプション -r」を付与する
```bash
echo '{"date":"1565382027"}' | jq -r '.date | tonumber + 9 * 3600 | strftime("%Y-%m-%dT%H:%M:%S")'
2019-08-10T05:20:27
```

# strptime
* 配列形式で、それぞれ出力されてしまい、困ってしまいました泣
```bash
echo '{"date":"1565382027"}' | jq '.date | tonumber + 9 * 3600 | todate | strptime("%Y-%m-%dT%H:%M:%SZ")'
[
  2019,
  7,
  10,
  5,
  20,
  27,
  6,
  221
]
```

# さいごに
「strftime」「strptime」の違いが、「t」「p」の一文字違いなので、わかりづらいです（ ;  ; ）
InstructGPTの実装解説

## はじめに
[InstructGPT](https://arxiv.org/abs/2203.02155)は、GPTが人間にとって望ましい出力をするように試みた研究です。
そのためには、人間が対話形式のテキストデータを作ることが有効です（論文内のSFTモデル）。
また、PPOモデルはGPTが生成した文を評価する別のモデルを用意し、強化学習を行うことでさらなる性能を向上させています。
論文には実装がありませんが、ありがたいことに追実装を行っている方がいました。
これを参考にしながら論文でメインとなる目的関数について考えてみます。

https://github.com/lucidrains/PaLM-rlhf-pytorch/blob/a159310cf411308ba6120096e53e7a4bb02e51a1/palm_rlhf_pytorch/ppo.py

## 目的関数の説明
InstructGPTの論文にはこのような数式で説明されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614092/7c2d3bad-6587-f9b3-28e8-80bb1c73b5fa.png)

### 1項目
$r_\theta$ の項は報酬モデルのスコアを表します。
新しく学習するRLモデルについてランダムサンプリングでたくさん文を生成して、報酬モデルのスコアが高いものを学習データに追加するイメージです。
強化学習手法の REINFORCE が、報酬の大きな生成文を優先的に出すよう学習することに相当します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614092/55617bbf-0636-163e-e42f-1d8adadeb432.png)
$G_t$ は累積報酬和であり、InstructGPTでは報酬モデルの出力を固定値の報酬として扱っています。

実装では Advantage Actor-Critic を採用しています。
これは、報酬モデルとActor（RLモデル）とは別に、Criticという価値関数を導入する手法です。
実装においては、Criticモデルは、Actorモデルのdeepcopyをとった後、ヘッドにスカラーを出力するための線形層を加えています。
REINFORCEと比較したactor-criticの利点は、以下のようなものがあります。

* actor-criticは、方策勾配を求めるときに、状態価値関数をベースラインとして使うことで、方策の更新を安定させることができます。REINFORCEでは、ベースラインが定数であるため、方策の更新が大きく揺れやすいです。
* actor-criticは、状態価値関数を学習するcriticと方策を学習するactorを分けておくことで、それぞれに適したニューラルネットワークや学習率などを設定することができます。REINFORCEでは、方策関数だけを学習するため、ニューラルネットワークの設計やパラメータ調整が難しい場合があります。
* actor-criticは、非同期的に複数のエージェントが並列に学習することで、データ効率や探索性能を向上させることができます。A3C（Asynchronous Advantage Actor-Critic）はその一例です。REINFORCEでは、一つのエージェントしか使えないため、学習速度や汎化性能に限界があります。



### 2項目
SFTモデルと新しく学習させるRLモデルの生成文の間でKLダイバージェンスをとったものです。
人間ではなくモデルが評価しているため、報酬を高くするだけの崩壊した文が生成されてしまう恐れがあります。
そこで、生成する各トークンの語彙分布について、SFTモデルの語彙分布と近づけるようにすることで、崩壊した文が生成されないような工夫をしています。
このようにKL項を加えた強化学習手法をPPOとよびます。

### 3項目

報酬を高くするように学習を続けていると、GPT本来の性能（perplexityや各タスクにおけるFew-shot能力等）が薄れてします現象がありました。
そこで、通常のGPT学習の項を加えることで、精度の低下を防いでいます。
論文中ではPPO-ptxモデルとされています。

## 強化学習のロードマップ
強化学習のロードマップは下図でまとめられています。
価値ベースと方策ベースを組み合わせたActor-Criticに端を発してPPOにつながっていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614092/81c8e256-8b71-44c1-ae49-5dc99c226d59.png)

https://qiita.com/shionhonda/items/ec05aade07b5bea78081

GPT3にPPO学習を取り入れたchatGPTが人気ですが、これからも強化学習を取り入れた研究は増えていきそうです。
Dell Poweredge r350でOSのインストールができないときの対処法

# はじめに
DellのPowerEdgeにWindows Server 2019をインストールする必要があり、USBにisoファイルを入れたり、DVDメディアにisoファイルを入れたり試行錯誤したがなかなかうまくインストールができず（インストール画面に行かなかった）苦戦した。
最終的にOSをインストールすることができたため、私と同じ苦しみを味わう人が少しでも減ればよいなと思い、記録を残すことにした。

# 目次
##### 概要

[目標](#目標)
[目標達成のために試したこと](#目標達成のために試したこと)

##### 成功ルートの解説（リンク飛べるようにできなかったごめん）

1.DVDメディアの購入
2.DVDメディアへisoファイルを書き込む
3.PowerEdgeを起動してDVDドライブにDVDメディアを入れる
4.BIOSの起動画面でBoot Managerに入る
5.ブートファイルから起動する

# 目標
Poweredgeにwindows server 2019の評価版をインストールし、セットアップをすること。

# 目標達成のために試したこと
- USBにWindowsServer2019の評価版のisoファイルを入れて起動しようとした。
（無理だった）
- DVDにWindowsServer2019の評価版のisoファイルを入れて起動しようとした。
 （成功した）

# 成功ルートの解説

## 1.DVDメディアの購入
WindowsServer2019のisoファイルは5GBくらいなのだが、
DVDメディアを片面1層（4.7GB）しか持ち合わせておらず、まずは片面2層のDVDメディアを購入した。
DVDメディアの容量が足りないと当然ファイルを入れることができないためよく確認した方が良いと思われる。

## 2.DVDメディアへisoファイルを書き込む
書き込みたいisoファイルを右クリックし、「ディスクイメージの書き込み」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935940/1f767ade-bf68-8c6f-588d-d5b5cc714cbf.png)
「書き込み用ドライブ(D):」で書き込みたいDVDメディアを選択し、「書き込み(B)」を押す。
この時、「書き込み後のディスクの確認(V)」を選択しておくと書き込みが正常にできたかすぐに確認することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935940/aadc9d76-d6cd-c489-75cc-c0b5a2be3ed5.png)


## 3.PowerEdgeを起動してDVDドライブにDVDメディアを入れる
Poweredgeを起動していないとDVDドライブが開かないため、起動してからしか入れることができない。

## 4.BIOSの起動画面でBoot Managerに入る
dellロゴ画面で、「F11」を押し、「Boot Manager」に入る。

## 5.ブートファイルから起動する
「Boot Manager」で、
「One-shot UEFI Boot Menu」-「UEFI Boot Option Maintenance」-「Boot From File」を選択する。
「File Exploper」が表示されるので、isoファイルを書き込んだDVDメディアを選択する。
「＜efi＞」-「＜boot＞」-「bootx64.efi」を選択する。


※これは　WindowsServer2019の場合のため、他のisoファイルでは異なる可能性がある。他のOSでもブートファイルはあるはずなので、フォルダ内を探してみるとよいと思われる。

以上。選択したらOSのインストールが始まる。

# あとがき
DVDメディアやUSBが起動デバイスとして認識しなく、BIOSのBootの設定を何度も往復したが、メディア本体を起動デバイスとして認識させることは最後までできなかった。無限Boot failed編になって大変つらかった。あてずっぽうでいろいろ試して、ようやくこの方法でOSをインストールできた。
この記事で同じ苦しみを味わっている誰かを救えたらうれしい。
Auth0 Actionsを用いたカスタムロジック組み込み方法メモ

## Actionsとは

* ログインやユーザー登録前後など特定のユースケース(`Flow`)に独自定義したロジックを組み込むAuth0の機能
  * 例：ログイン時にユーザーのメールアドレス検証状態を確認する、など

## 設定方法

### カスタムロジックを定義する

1. ダッシュボード画面 -> `Actions` -> `Flows`を選択する。

2. 処理を加える`Flow`を選択する。

3. 処理を加えるフローを選択する。※今回は「`Login`」

4. `Add Action` -> `Custom` -> 「＋」を選択する。

5. `Build Custom`を選択する。

6. `Create Action`ウィンドウが開かれるため、`Name`（カスタムロジック名）を入力する。

   * `Trigger`  : `Login / Post Login`※変更なし
   * `Runtime` : `Node 16`変更なし

7. カスタムロジックを記述する。

   ※ログインユーザーがメールアドレス未検証の場合にブロックする例

   ```javascript
   exports.onExecutePostLogin = async (event,api) => {
       // メールアドレス未検証の場合はブロックする
       if (!event.user.email_verified){
           api.access.deny('Access Denied (Not Email Verified)')
       }
   }
   ```

   ※実装に必要なnode依存関係を追加したい場合は`Add Dependency`を選択し、対象のライブラリとそのバージョンを入力する。

   ※機微情報をコードに直接記述したくない場合は`Define Secret`を選択し、KeyとValueを入力する。`event.secrets.{Key名}`のように参照する。

8. `Save Draft` -> `Deploy`を選択する。

### Flow内にカスタムロジックを配置する

1. Loginフローに戻り、`Custom`を選択する。
2. 定義したカスタムロジックをフローの差し込みたい箇所にドラッグ&ドロップする。
3. `Apply`を押下する。



## 参考情報

* [Auth0 Actions](https://auth0.com/docs/customize/actions)
picoCTF Writeup picoGym Practice Challenges Enhance! (注意<spoiler>)

# Description
Download this image file and find the flag.
Download image file

ファイルをダウンロードしvscodeでhexエディタなりでスクリプトを見るとフラグが部分的に書いてある。
inkspaceをダウンロードする必要はなかった。
MVCとは簡単に解説

# MVCモデルのまとめ

# はじめに
私が学んできた言語の説明を簡単にわかりやすく書いていこうと思っております。
エンジニア未経験なので間違い等ありましたらご指摘いただけると幸いです。

# 目的

1.MVCの理解を深める
2.MVCの利点を理解する

# MVCモデルとは何か？

MVCとはmodel.view.controllerの略で、処理を三つの役割に分割して実装する手法。

### controller

ルーティングからリクエストを受け取って処理を行ったあと、クライアントにレスポンスを返します。
コントローラーは、MVCにおける橋渡しの役割も持っています。
レスポンスに必要となるデータがあれば、他の役割と連携してデータを取得したり受け渡しを行い、
レスポンを完成させます。

　　　　　　　　　　　　　※コントローラーの役割
PC →  ルーティング　→　　(トップページを表示する処理）
PC →  ルーティング　→　　(マイページを表示する役割)
PC →  ルーティング　→　　(新規投稿をする役割)

### view

viewは、レイアウトの部分になり※UIを表示するコンポーネント（ソフトウェア部品やシステムの構成要素）であり、データ入力フォームやグラフといったデザインやレイアウトに関わる部分を担当しています。

※UIとはユーザーインターフェイス（User Interface）の略称で、一般的にユーザー（利用者）と製品やサービスとのインターフェース（接点）すべてのことでレイアウトや使用されている画像はもちろん、文字のフォント、メニューやボタンの操作性などユーザーが目にするもの・操作するものすべてが含まれています。

### model


Railsの中でデータベースへのアクセスをはじめとする情報のやり取りに関する処理を担当しています。
モデルがあれば、データベースにあるテーブルをrailsで管理することができます。すなわち、テーブルごとに整理された情報はモデルに対応しています。
具体的な機能としてはアプリケーションデータや関数、データベースへのアクセス、データ管理などの機能を担当します。

# MVCの利点とは

MVCモデルは役割ごとに独立しているため、作業区分も明確化され開発効率が向上し、保守性も高められます。
もしUI部分で問題が生じたときには画面表示を担当するviewの部分に問題があると推察できます。
controller(入力に対する制御部分)、view(レイアウト、デザイン部分)、model(ビジネスロック部分)


![MVC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3201028/60649a43-5345-8ca9-eee9-ec87615c2e31.png)
【Android】ジャイロスコープを使用する

# はじめに
Androidでジャイロスコープを使用する方法について解説。
[公式のリファレンス](https://developer.android.com/guide/topics/sensors/sensors_motion?hl=ja)には、以下のように記述されている。
```
ジャイロスコープは、端末の x、y、z 軸周りの回転速度を rad/s で測定します。
```

https://developer.android.com/guide/topics/sensors/sensors_motion?hl=ja

# コード

* センサーイベントリスナー(`SensorEventListener`)インターフェースを継承。
* センサーマネージャー(`sensorManager`)を定義し、`onResume`時にリスナーを登録、`onPause`時にリスナーを解除する。
* `onSensorChanged`メソッド内でジャイロ検知を行う。

```MainActivity.kt
class MainActivity : AppCompatActivity(), SensorEventListener {
	/** ViewBinding */
	private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
	/** センサーマネージャー */
	private val sensorManager by lazy { getSystemService(SENSOR_SERVICE) as SensorManager }

	override fun onCreate(savedInstanceState: Bundle?) {
		super.onCreate(savedInstanceState)
		setContentView(binding.root)
	}

	override fun onResume() {
		super.onResume()

		val gyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE)
		if (gyroscope != null) sensorManager.registerListener(this, gyroscope, SensorManager.SENSOR_DELAY_NORMAL)
	}

	override fun onPause() {
		super.onPause()
		sensorManager.unregisterListener(this)
	}

	override fun onSensorChanged(event: SensorEvent) {
		if (event.sensor.type == Sensor.TYPE_GYROSCOPE) {
			val sensorX = event.values[0]
			val sensorY = event.values[1]
			val sensorZ = event.values[2]
			//TODO ここに処理を記載
		}
	}

	override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {}
}
```
【Laravel/PHP】テキスト中のURLをすべてリンクにする

## 環境
Laravel：8.65
PHP:7.4

## 本題
### やりたいこと
任意のテキストをフロントに出力する際に、文中のURLをすべてリンクにしたい

### 解決法
テキスト中のURLを検出し、aタグで囲う。
全部置き換えたいので、今回は`preg_replace`を使います。

1.URLっぽい文字列にマッチする正規表現を用意
```php
$urlRegex = '/https?:\/\/[^\s]+/';
```

2.preg_replaceを使って文字列を置換
```php
$linkedText = preg_replace($urlRegex, '<a href="$0" target="_blank" rel="noopener noreferrer">$0</a>', $text);
```
`$0`に、正規表現にマッチする文字列が入っているため、それをaタグで囲う様に置換する。
`target="_blank"`を書いておくことで、別タブで開くようにしています。

終了！！

これで、URLをリンクにすることが出来ました。
Property を Inspector に公開しつつ get だけ使いたい

Unity 2021.3.17f1 を使用しています。
(何も作らずに) Inspector へ公開する方法に少し手間取ったので、残します。
## 方法
```csharp
[field: SerializeField] public float hp { get; private set; }
```
SerializeField の先頭に field: を付け、set を private にする。

## Header もつけたい
```cs
[Header("ステータス")] // エラー！　できない！
[field: SerializeField] public float hp { get; private set; }
```
とすると、「属性 'Header' はこの宣言型では無効です。'フィールド' 宣言でのみ有効です。」とエラーが出ます
```cs
[field: SerializeField, Header("ステータス")] public float hp { get; private set; }
```
対策としては、上記のように SerializeField の後ろに繋げれば使えます。（少し気持ち悪いけど）
## 参照
https://papersloth.hatenablog.com/entry/2020/05/25/135813
https://qiita.com/RyotaMurohoshi/items/b64b36009ba652b21e2c
シェルスクリプトのdirname

# dirnameコマンドとは？

「dirname」は、ディレクトリ名とファイル名を含むパス名（/mydir/myfileなど）から、ディレクトリ部分だけを取得するコマンドです。

# パス名からディレクトリ部分を取得する
「dirname パス名」でパス付きのファイル名からディレクトリ名部分を取得します。例えば「dirname /dir1/file.txt」ならば「/dir1」、「dirname /dir1/dir2/file.txt」であれば「/dir1/dir2」となります。

dirnameは、正確には「パスの最後のスラッシュ（/記号）以降を取り除く」動作をします ※1。このため「dirname /usr/bin/」または「dirname /usr/bin」と指定して実行した場合の結果は「/usr」となります。

>※1 ただし、「dirname /」の結果は「/」となる。指定したパスがディレクトリ部分を含んでいない場合は「.」となる。

dirnameは例えば、whichコマンドで取得した外部コマンドのフルパスを加工する際に役立ちます。「dirname `which コマンド名`」のように指定することで、見つけたコマンドのディレクトリ名部分だけを取得できます。

# 参考
https://atmarkit.itmedia.co.jp/ait/articles/1801/26/news013.html
paiza Cランク獲得までのスキルアップ問題集

paiza Cランク獲得には、スキルアップ問題集の「Cランク獲得」を解いてみるとよいかもしれません。
模範解答が多い、Cランクレベルアップメニューを解いてみて、よくわからないところ、もっと手を動かしたいところを、各問題集にあたってみるのもよさそうです。

https://paiza.jp/works/mondai


# Cランク獲得問題集

### Cランクレベルアップメニュー
| メニュー | 対象者 | 内容 |
|:-:|:-:|:-:|
| Cランクレベルアップメニュー| Cランク獲得を目指す方。 | D〜Cランクの問題。標準入出力,文字列,forループ,ソート,辞書,シミュレーション|


### 標準入出力
| メニュー | 対象者 | 内容 |
|:-:|:-:|:-:|
| 標準入力メニュー  | 初学者の方におすすめのメニューです。  |  複数行・複数列での標準入力の受け取りなど、多くのスキルチェック問題の標準入力処理が書けるようになります。 |
| 標準出力メニュー| 初学者の方におすすめのメニューです。  | 多くのスキルチェック問題の標準出力処理が書けるようになります。たとえば、罫線入り九九の表の出力などを学べます。  | 

### 算術・代入演算
| メニュー | 対象者 | 内容 |
|:-:|:-:|:-:|
| 算術・代入演算メニュー  | 計算問題が苦手な方にオススメのメニューです。  | よく使う算術・代入演算子の意味を理解し、記述できるようになります  |

### 文字列
| メニュー | 対象者 | 内容 |
|:-:|:-:|:-:|
| 文字列処理メニュー  | 初学者でデータの型について学び始めたくらいの方におすすめのメニューです。  | 問題をクリアしていくことで文字列の検索・挿入・反転といった処理の習得を目指します。  |

### 条件分岐
| メニュー | 対象者 | 内容 |
|:-:|:-:|:-:|
| 条件分岐メニュー  | C, Dランクの方におすすめのメニューです。 | if文や論理式の扱い方などを身に付けることができます。|

### ループ
| メニュー | 対象者 | 内容 |
|:-:|:-:|:-:|
|ループメニュー1   | DランクやCランクの人にオススメのメニューです。 |簡単なループ処理であれば自分で考えて使えるようになります。   |
|ループメニュー2  | DランクやCランクの人にオススメのメニューです。 |少し複雑なループ処理でも考えて作れるようになります。  |
|二重ループメニュー   | D, Cランクの方におすすめのメニューです。 |多重ループを用いた全探索や二次元的な処理などの習得を目指します。  |

### 配列
| メニュー | 対象者 | 内容 |
|:-:|:-:|:-:|
| 配列メニュー  | D, Cランクの方におすすめのメニューです。 | 1次元配列の入出力・2次元配列の入出力・配列の検索などができるようになります。  |
| 配列活用メニュー  | 配列の基本的な処理ができるようになってきた方におすすめのメニューです。| 最大値・最小値の取り出しや、順序の入れ替えなどを覚えましょう。|

### データセット(動的配列・文字列・辞書・集合)
| メニュー | 対象者 | 内容 |
|:-:|:-:|:-:|
|データセット選択メニュー   | C, Bランクの方におすすめのメニューです。 | 問題を解くことで動的配列・文字列・辞書・集合などの取り扱いについて習得できます。  |

### 論理演算
| メニュー | 対象者 | 内容 |
|:-:|:-:|:-:|
|論理演算メニュー| CランクやBランクの人にオススメのメニューです。  |多くのスキルチェック問題の論理演算処理を書けるようになります。  |
シェルスクリプトのbasename

# basenameコマンドとは？
「basename」は、ディレクトリ名とファイル名を含むパス名（/mydir/myfileなど）から、ディレクトリ部分を除き、ファイル名だけを取得するコマンドです。

ファイル名の末尾の文字（拡張子など）を指定して取り除くこともできます。

basenameと対になるコマンドもあります。dirnameコマンドです。dirnameはパス名からディレクトリ部分だけを取得します。

# 参考サイト
https://atmarkit.itmedia.co.jp/ait/articles/1801/25/news025.html
シェルスクリプトで実行しているスクリプトのパスを取得する

シェルスクリプトを作成していると実行しているスクリプト自身の絶対パスを取得したくなる時がある。
そんな時は以下のようにするとよい 。
```
#!/bin/bash
SCRIPT_DIR=$(cd $(dirname $0) ; pwd)/
echo "${SCRIPT_DIR}"
```
# 説明
```
dirname $0
```
スクリプトのあるディレクトリの相対パスを取得する。
```
$(cd $(dirname $0)
```
スクリプトのあるディレクトリに移動する。
```
SCRIPT_DIR=$(cd $(dirname $0) ; pwd)
```
カレントディレクトリがスクリプトのディレクトリになるのでpwdでカレントディレクトリのパスを取得する。
コマンド置換はサブシェル環境で実行されるのでスクリプトディレクトリ取得後にカレントディレクトリは変更されない。

# 参考
https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution
BigQueryからGCSへのエクスポートとダウンロード

あちこち調べて回った備忘録になります。
一通りの権限は持っている前提で進めますので、BigQueryやGCSの権限については割愛します。動かなかったらだいたい権限。

# 大量のデータをダウンロードしたい

BigQueryのテーブルにあるデータをエクスポートしたいとき、いざエクスポートを実行しようとするとスプレッドシートやGCSにエクスポートなどの項目があります。（CSVでダウンロードしたいんだけど。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128052/6c2ba6ee-d13a-8ed8-a18b-ffaaabce88a9.png)

エディタで実行した結果を保存する場合はCSVなどの方法もありますが、サイズの上限があるので大量にデータを取得したい場合はいずれも足りません。かといって何度も取得するのは面倒くさい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128052/aaa654cd-7e28-2c20-272b-24017b8ec42a.png)


なので大量のデータをダウンロードしようと思った場合は、GCSにエクスポートした後にダウンロードが必要になるようです。

# GCSへのエクスポート
![スクリーンショット 2023-02-28 16.44.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128052/49f9c5fd-18f5-f447-5bdd-0cfce83fb6b1.png)

「GCSにエクスポート」を選択した後、上記の画面が表示されるのでロケーション、エクスポートの形式、圧縮の形式を選択します。
何気にトラップなのは、このロケーションにエクスポートするファイル名や拡張子を入力しなければエクスポートがうまくいかないところでしょうか。
エクスポートがうまくできてなくてもエラーも何も表示されなくてずっと待ってました。うまくいっている場合は結構すぐにデータが出来上がります。
あと、サイズを指定できないので、データ量が多いと大量にファイルがエクスポートされます。

CSVでGZIP圧縮を選択した場合はこのように記述します。
/ファイル名*.csv.gz

# Google Cloud SDKの導入
GCSからファイルをまとめてダウンロードをしようとすると、次のようなポップアップが開きます。
どうやらブラウザコンソールからは1ファイルずつしかダウンロードできないようです。

![スクリーンショット 2023-02-28 16.52.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128052/62205df5-5887-0d3b-e6e0-b295c65a86fa.png)

なのでメッセージにもあるようにgsutilコマンドを使用する必要があります。
そのためにはGoogle Cloud SDKをインストールします。

Macで順番に実行しています。

``` sh:ターミナル
% cd SDKをインストールしたいディレクトリ

% curl https://sdk.cloud.google.com | bash #実行するとgoogle-cloud-sdkというフォルダが作られます

% exec $SHELL -l #シェル再起動

% gcloud init

```
gcloud initのあとはGoogleにログインを求められたり、

Please enter numeric choice or text value (must exactly match list item):
プロジェクトを選択したり

Do you want to configure a default Compute Region and Zone? (Y/n)? 
タイムゾーンを選択したりします。

初期化が完了したら先程のダウンロードコマンドをコピペして実行すると、ようやくデータのダウンロードができます。


# 参考サイト

テーブルデータのエクスポート
https://cloud.google.com/bigquery/docs/exporting-data?hl=ja

Google Cloud SDKの導入
https://www.faq.idcf.jp/app/answers/detail/a_id/941/c/98
bashのset

bashのsetはシェルのオプションを設定するビルトインのコマンドとなっている。

インタラクティブシェルに関するオプションと、シェルスクリプトに関するオプションの両方をsetから操作する。前者はふつうにプロンプトで入力することが多く、後者はスクリプトの冒頭にかかれることが多い。

それぞれのオプションはアルファベット一文字からなるコードと、オプション名を表すアルファベット小文字数文字からなる短い名前を持っている。

例えば
```
set -eux
```

とやるとこれは次と同一
```
set -o errexit  # エラー時にスクリプトを終了する
set -o nounset  # 未定義の変数を参照したらエラー出して終了する
set -o xtrace   # 実行するコマンドを逐一表示する
```

# 参考サイト
https://tm23forest.com/contents/bash-set
#!/bin/bashについて

シェルスクリプトの1行目によく記載されている以下のようなものをシバン シェバング(Shebang)と呼びます。
実行するシェルスクリプトのインタプリタを指定しています。
シバンを以下のように記載することで、シェルスクリプトがbashを使用して実行されるようになります。
ついつい忘れがちな1行かもしれませんが、bashにしかない機能を使用したい場合に、この記載がないと意図したように動かない可能性があります。 
bashを用いたシェルスクリプトを作成する際には必ず書くようにしましょう。

# 参考サイト
https://tech-blog.rakus.co.jp/entry/20210525/shellscript
Glueジョブ（PySpark）によるETL処理時にデータソース元の件数が0件の場合のうまい対処法

# はじめに
ETL処理でデータソース元の更新件数が0件の場合を判定するときに、一般的に以下の処理を行うことがあるかと思います。
本記事で出てくる変数「dyf」はDynamicFrame形式、「df」はDataFrame形式を表してます。

```python
if dyf.count() > 0:
  ~~ データ加工処理 ~~
```
しかし、count()はとても高価な処理であるため、サーバーのスペック不足や処理時間が長くなってしまうことがあります。
そのため、他の方法で0件を判定するためのスクリプトを考えました。

# データソース元にレコードが存在するかどうかを確認する方法

①：head、lenを利用する方法
```python
df = dyf.toDF()
if len(df.head(1)) == 0: 
  ~~ データ加工処理 ~~
```
②：limitを利用する方法
```python
df = dyf.toDF()
if df.limit(1).count() > 0:
  ~~ データ加工処理 ~~
```

# さいごに
count()による高価な処理で苦戦されている方は試してみてください！！
ブラウザ上でフロントエンド開発(Node.js環境)ができるWebContainerを試す

# 概要
タイトル通りブラウザ上でフロントエンド開発(Node.js環境)ができるWebContainerを試してみる
- 参考記事
    - https://www.publickey1.jp/blog/23/webwebassemblynodejswebcontainerapihttpnodejs_cli.html
ブラウザのみでローカルマシンに Node.js などをインストールすることなく開発環境を用意することができる。

# サインアップ
個人利用で github の public リポジトリを使うのであれば無料で利用できる。
1. 以下サイトにアクセス
    - https://stackblitz.com/membership
1. PERSONAL-FREE の「SIGN IN GITHUB」を選択し、github アカウントと接続する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/905c9aef-5d8b-d70a-14a1-663841936723.png)

# プロジェクト作成
1. https://stackblitz.com/ に移動
1. 使用したいフレームワークをクリックする
1. テンプレートを元にプロジェクトが作られ、エディタが開き、サーバの起動も暫く待つと行われる。
1. Nuxt3 を選んだ場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/a8d5da62-8225-cd7d-d2ce-829cf4c36fec.png)

# ソースコード編集
1. vscode のようにファイルを開いて編集するとサーバに反映される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/6b30a620-4b9f-2e58-2f5d-4f63a76e153e.png)

# github に保存
1. エディタ左上の「Connect repository」を選択
1. github と接続し、既存のリポジトリにインポートするか新規で作成するかを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/18a83744-bfee-6c74-8966-15414f83bb65.png)
1. 新規作成したリポジトリ
    - https://github.com/Yoshihiro-Hirose/nuxt-starter-4nfslv

# 所感
- かなり簡単に開発環境を用意することができました
- ブラウザのみで OK なので、学生の教育用途などでも便利かもしれない。(Chromebookなどから)
- エンタープライズ用途で実用的に使えるかは要検証
- 似たようなコンセプトのサービスも他にあるので出来れば触ってみたい
    - Sandpack 2.0
    - 参考記事 https://www.publickey1.jp/blog/23/webnodejswebnextjsviteastrosandpack_20.html
【備忘録】文字列の中の変数展開について

## はじめに
変数展開について少し触らないと忘れてしまうので改めて記事に残しておく。
シングルクオートとダブルクオートの違いをもう忘れない。

## 変数展開とは
PHPにおける文字列の変数展開とは、文中における変数の値出力のこと。

## ダブルクオートを使った文字列展開
ダブルクオートを使うことによって、文字列の中で変数を展開することができる。
```
<?php
$name = "田中";
echo "私の名前は $name です";
```
![スクリーンショット 2022-04-12 9.26.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589286/d03268db-abd6-5201-a15b-b495170b6f44.png)

無事$nameが出力された。

## シングルクオートで囲むとどうなるか
先程ダブルクオートで囲ったように、シングルクオートで囲むとどうなるか。

```
<?php
$name = "田中";
echo '私の名前は $name です';
```

![スクリーンショット 2022-04-12 9.31.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589286/f639041c-e8bc-2a25-56b7-821822387ae4.png)

$nameがそのまま表示されてしまった。

シングルクオートによる記法では、変数がされず、
文字列中で変数展開をしたい場合はダブルクオートを使う必要がある。

二度と指摘されない。迷わない。
以上。
Batchとは・・・？

 # Batchとは・・・？
Batchとは英語が語源で日本語では「一束」という意味があります。つまり、一定量、もしくは一定期間のデータを集めて一括処理をするための処理方法のことです。汎用コンピュータの時代はある程度データ量が集まった段階で処理を実施していました。これが、現在ではBatch処理と呼ばれるもので一括処理とも呼ばれることがあります。

 # バッチ処理のメリット
 ## 場所や時間に囚われずにデータ処理が可能
バッチ処理は一定量のデータを集計して処理するという特性上、オペレーターがその場にいなくてもよいのです。そのため、タスクスケジューリングを行うことで、好きな日時にデータ処理をまとめて行うことができるのです。

 ## 大規模データを効率的に処理
大規模データを取り扱うときは基本的にまとめられたデータを一括処理することが進められます。その点、バッチ処理では一括処理をすることができるため、大規模データの取り扱いにはピッタリです。

 ## ヒューマンエラーを排除
大規模データを人間が取り扱うとき、必ずヒューマンエラーが起こります。そして、そのエラーが小さいものでも後々大きなエラーにつながることは多くあります。その点、バッチ処理ではヒューマンエラーをなくすことができます。

 # バッチ処理のデメリット
 ## リアルタイムに集計状況を確認できない
一括処理を得意とするため、バッチ処理ではリアルタイムでデータの集計状況などを確認することができません。そのため、随時確認をしなくてはいけない場合、リアルタイム処理を実行するのが一般的です。

 ## データ量増加により処理が遅延することがある
昨今ビッグデータの活用が基本になっています。そのため、データが日々蓄積して行きますが、バッチ処理ではこのデータに都度対応することで処理が遅延するといったトラブルが起こります。

 ## スクリプトやプログラムが複雑化しやすい
バッチ処理では大規模データを取り扱うためスクリプトやプログラムが複雑になる傾向があります。そして、この複雑なスクリプトやプログラムは次期にブラックボックス化しやすいことも問題です。

 # バッチ処理を行うべきタイミングは・・・？
バッチ処理の対象は即時性のないデータとなります。例えば、月末に一括で処理する経費精算や一定期間のデータを特定の日に集計・処理するようなデータはバッチ処理が有効です。

 # 参考資料

https://www.imkk.jp/blog/what-is-batch-processing.html
Django　モデル操作編

例えば`views.py`内部で、フォームは使用しないがDBにデータを追加したいとき
```python:views.py
[中略]
DB.objects.create(field_1 = data_1,
                   field_2 = data_2,
                   field_3 = data_3,)
```

postとDBが連携している場合の実装
```python:views.py
[中略]
postData = PostObject()
postData.field = data_1
[続く]
```

ORMメソッドは他にもいろいろあるため要チェック

随時追記
JAVA　基本文法[0] - 開発の流れ/プログラム構造と基礎知識

開発の流れ/プログラム構造と基礎知識

# JAVAの開発の流れ （３ステップ）
##### ①ソースコードの作成　【役：人】
JAVAの文法に倣ってコンピュータへの命令を記述する。
このような人が読める命令は「ソースコード（ソース）」という。
そしてこれを書き込んだファイルを「ソースファイル」という。拡張子は 「_.java_」 。
```Main.java
//例
public class Main {...}
```

##### ②　コンパイル　【役：コンパイラ　※ソフトウェア】
ソースコードをそのまま実行することは出来ない。
「コンパイル」という処理をすることで、「クラスファイル」に変換される。このファイルの拡張子は「_.class_」。
クラスファイルの中身は、コンピュータが実行しやすい「バイトコード（簡単にいうと１と０の羅列）」が記述されている。
＋α ソースコードの文法チェックの役割も果たしている。

##### ③　実行　【役：インタプリタ　※ソフトウェア】
ここまでの処理を行ってもまだ実行はされない。
インタプリタに、「バイトコードの変換」と「実行」を依頼する。
インタプリタは、内部に持っている「JVM」という仕組みを使って、バイトコードを解釈し「マシン語」に変換して、CPUに送る。
そして、「CPU」は命令を実行する。

#### ①〜③の流れを通してソースコードの指示通りに動作する！

＊自身のPCに開発環境を構築する際は、「コンパイラ」と「インタプリタ」をネットからDL/ISする必要がある。


# プログラム構造と基礎知識
##### プログラム構造
javaのソースコードには波括弧 _{}_ で囲まれた「ブロック」がある。
必ず、「クラスブロック」と「メソッドブロック」の二重構造になる。
```Main.java
public class Main {   
        //ここの中は、「クラスブロック」
}
//更に内側は↓
public class Main {
  public static void main(String[] args) {
        //ここの中は、「メソッドブロック」
  }
}
```
基本的に「コンピュータに対する指示・命令」を記述するのはメソッドブロック内となり、
それより外側はお決まりのパターンが多い。
とはいえ、毎回全く同じように書いていいという訳ではない。
「public class」の後ろには、「クラス名（当プログラムの名前）」を指定する。クラス名は、大文字のアルファベットで始めるのが一般的。

_★_　javaのソースファイルを保存するときのファイル名は「クラス名.java」にしなければならない。下記が例。
```Main.java
public class Main {...}
```
---
##### プログラムを書くコツ
_流れ_
１、どのようなプログラムを作りたいかを考える。
２、プログラムの名前を決める。＝クラス名が決まる。
３、「クラス名.java」という名前でファイルを作る
４、ソースコードの外側部分を記述
５、ソースコードの内側部分に命令を記述していく。

_正確に記述_
・英数字は基本「半角」。大文字小文字の違いも意識する。
・英字のオー（O）、数字のゼロ(0)を間違えない。英字のエル(L)と数字のイチ（１）を間違えない。
・セミコロン（；）とコロン（：）を間違えない。ピリオド（.）とカンマ(,)を間違えない。
・括弧の種類を間違えない。…（）丸括弧、{}波括弧、[]角括弧
・引用符の種類を間違えない。…'シングルクォーテーション、"ダブルクォーテーション
・特に２行目間違えずに！！
「public static void main(String[] args)」
読み方：パブリック・スタティック・ボイド・メイン。ストリング・カッコ・カッコ・エーアールジーエス

_上から下へではなく、「外から内へ」記述_
ブロックの閉じ忘れを防げる。{}
「ブロックを開いてすぐ閉じる→中身をかく」の手順で記述していこう！

_他者が見ても読みやすいコード_ 
・インデント（字下げ）
ブロックの開始と終了にインデントを入れ、カッコの対応とブロックの多重構造の見通しをよくする。
```Main.java
public class Main {
  public static void main(String[] args) {
    System.out.println("RPG: スッキリ魔王征伐");
    System.out.println("Ver.0.1 by 湊");
  }
}
```

・コメント
コメント機能を利用してソースコード内に解説文を記述することができる。
これは、コンパイル時と実行時には無視され人間が読むためのものです。日本語もOK。
```Comment.java
/*　←コメント本文の両サイドにコレをつける。「複数行でも可」→　*/

// ←コメント本文の前にコレをつければ、行末までコメント文になる。「単一行」
```
---
##### コンピュータに対する指示・命令文
コンピュータに対する指示・命令文は、mainメソッド(=メソッドブロック)に記述。
上から順に書き、そして処理される。
末尾にはセミコロン（；）をつける。

●文は３種類
①変数宣言の文
例）int version;
データを入れる箱を準備

②計算の文
例）version = 1 + 5;
計算をして、箱に入れる。

③命令実行の文
例）System.out.println("あいうえお");
Javaが用意している命令を呼び出す。


●プログラムの流れ
文を実行させる順番のことを「制御構造（制御フロー）」という。
代表的なものとして「順次」、「分岐」、「繰り返し」の３つがある。
これら３つの制御構造を組み合わせることで、どんなプログラムも作ることが出来る。

::: note warn
３つの制御構造
❶順次
上から順に文を実行する

❷分岐
条件によって違う文を実行する

❸繰り返し
条件が満たされるまで同じ文を繰り返す
:::
Google アナリティクスで自分のQiita記事をアクセス解析してみた

# はじめに
みなさん、こんにちは！自分の記事がどんな人に、どれくらい読まれてるか気になりますよね・・・
今回は自分のQiitaの記事がどんな人にどんな検索ルートでどれくらい表示されたのか調べるためにGoogle アナリティクスを使ってみます！
どんな記事が読まれやすいのか、どのような点を改善すべきなのか探ってみたいと思います。

# Google アナリティクスをQiitaに連携させる方法
Google アナリティクスで自分のQiitaの記事をアクセス解析するには、Google アナリティクスのアカウントを作って、トラッキングIDをQiitaに埋め込む必要があります。方法の詳細については下記にて丁寧に説明されています。Google アナリティクスを初めて使いましたが、サクッとできました！

https://qiita.com/Qiita/items/c7f704e3786df3aa7a11

# Googleアナリティクス　アクセス解析結果
①ユーザー・イベント数
2/25にgoogle アナリティクスアカウントを作ってから数日で、ユーザー18人、イベントが196もあり、結構多くの方に見て頂いたということが分かりました！純粋に嬉しい！！
![イベント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2874461/554ecf34-0e20-6138-bec2-282b11f28eae.png)

平均エンゲージメント時間（閲覧時間）が22秒と短いので、もっと記事の中身を充実させる必要がありますね。

②流入経路
Google アナリティクスではどのような検索経路で私の記事にたどり着いたのか知ることができます。
![セッション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2874461/39ea0d06-af77-f3f5-6611-b9f6cc5464d7.png)

Direct：ブックマーク、URL直接入力など参照元が判別できない流入
Organic Search：検索エンジンでの流入
Referral：外部サイトからのリンク
Unassigned：上記に当てはまらないもの

他にもリスティング広告、ディスプレイ広告、ＳＮＳ経由など詳しく流入経路を知ることができます！

③国別流入経路
どこの国からアクセスがあったのかもわかっちゃいます！
![国別.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2874461/581b57ea-5afc-bfc9-c324-e279e0c12781.png)

④記事別ビュー
これが一番うれしい機能。どの記事がどれくらいの時間読まれていたのか分かります。
「BERTで自殺ツイートを検出する試み」の記事が読まれているようですが、平均エンゲージメント時間が4秒と短く、すぐ閉じられちゃっています。全体的にサクッと読める記事にしようと心がけているので、エンゲージメント時間が短めなのかなとも思いますが、読者の皆様に有益な情報を届けられるように、もう少し中身も充実させたいと思います。
![記事別.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2874461/f3418f35-0910-1393-2950-71023d781b53.png)

今後は「いいね♥」を頂けることをコンバージョンとして設定し、いいねをもらうにはどんな施策が考えられるのか検討したいと思います。アクセス解析の目的はそこですが、ひとまずGoogleアナリティクスとQiita連携したら面白かったので、またアップデートしたいと思います。今後はGoogle data portalとも連携してダッシュボードも作ってみたいと思います。

読んで頂きありがとうございました！
【Docker】cronファイルの設定、ホスト側で行うかコンテナ内で行うか

cronファイルの設定をコンテナ内ではなく、ホスト側でファイルを持って行うことに対してのメリットが理解できておらず、自分なりに調べてみたのでその備忘録

## コンテナ内でcronファイルを編集する場合
コンテナ内でcronファイルを編集する場合は、コンテナに入りcronファイルを編集してcronデーモンの再起動し、設定を反映という手順を踏む。

## ホスト側でcronファイルを編集する場合
ホスト側でcronファイルを編集する場合は、crontabファイルを作成して、そこに設定を記述します。そして、Dockerfile内でホスト側のcrontabファイルの内容をコンテナ内のcronファイルにコピーすることで設定を反映させる。

## ホスト側でcronファイルを編集するメリット
これらを踏まえて、ホスト側でcronファイルを編集するメリットを出してみる。

* バージョン管理
* 再利用
* ビルドでの自動反映

### バージョン管理
crontabファイルをGitなどのバージョン管理などで、ホスト側で管理することでファイルの変更履歴や差分の確認を行うことができるようになる。
そして、Dockerfile内ではCOPYコマンドを使用して、ホスト側のcrontabファイルの内容をコンテナのcronファイルにビルド毎に反映させる（変更を反映というよりは、毎回新規にファイル作成）ので、ビルドすることでコンテナ内のcronファイルを直接変更した結果よりもホスト側のファイル内容が優先されます。そのため、意図しないコンテナ側での変更も即座に修正できる。

### 再利用
同じ記述のcronファイルなら、その他のコンテナでも再利用できそう。

### ビルドでの自動反映
前述で述べた、コンテナ内で編集する方法とホスト側で編集する方法のやり方の違い。
コンテナ内でcronを編集するとcronデーモンの再起動とビルドの両方を行う必要がでてくるが、ホスト側で編集を行うとビルドを行うことで、コンテナ内のcronファイルに設定が反映される。
Dockerfileの設定はホスト側のcrontabファイルのパスとコンテナ内のcronファイルのパスを記載してCOPYコマンドで記述する。UNIX/LINUXシステムに合わせて、改行の書式も変更した新しいcrontabファイルを作成。パーミッションの設定なども行い、コピー元のcrontabファイルを削除。ビルドでの自動反映が行える。

## さいごに
これらを踏まえるとホスト側で管理する方が圧倒的に良いですね。
個人的な備忘録で理解に間違いなどあるかもしれませんが、その際はお手柔らかにお願いします！！
その他もなにかメリットがあるのでしょうか。。？
【Rust】seedでコンソールログを出す方法

# はじめに
社内ハッカソンでRustを使ってWebサービスを開発していました。
seedを使って開発していたのですが、コンソールログを出す方法が調べてみた方法だとうまくいかずに困っていました。

# 結果
`log!()`を使うとだせた！
```rust
log!("hoge);
```

# 最後に
いろいろ小細工とかしてみましたが、こんな簡単でよかったなんて・・・
(ハッカソン12Hだったのに3Hぐらい持ってかれた・・・)
コンフリクトファイルの一括解決 片側に合わせる in Powershell

コンフリクトがたくさん発生したときに、mergeでもってくるブランチに合わせる場合。

```
git diff --name-only --diff-filter=U --relative | %{git checkout --theirs $_}
```
git diff でコンフリクトファイル一覧を出し、
%{ $_}でその出力を xargsライクに次のコマンドの入力としている。
Rancher Desktopの時刻ズレを修正する

devcontainer上で `az login` しようと思ったら。

> The command failed with an unexpected error. Here is the traceback:
> 0. The ID token is not yet valid. Make sure your computer's time and time zone are both correct.  Current epoch = 1677149361.

の表示が出て進めない。
時刻とタイムゾーンを確認しろとな？

## どこの時刻を確認する？

devcontainerは `Rancher Desktop` で動くコンテナとして起動しています。
Windowsなので、 `Rancher Desktop` 自体も仮想マシンとして起動しています。  
ターミナルから、`Rancher Desktop`のWSLを開いて確認。

```bash
$ date
Thu 23 Feb 2023 11:00:55 AM UTC
```

今は2/28、15:15。
だいぶ違いますな。

## ハードウェアの現在時刻を取得

```bash
$ hwclock
Tue Feb 28 06:29:23 2023  0.000000 seconds
```

ふむ、タイムゾーンはUTCっぽいですが、時刻は問題なし。

## hwclock で修正する

ハードウェア時刻はあっているので、そのままシステム時刻に反映すればOKです。

```bash
hwclock --hctosys
```

再確認

```bash
$ date
Tue Feb 28 06:34:17 UTC 2023
```

解決！
paiza レベルアップ問題集 定番アルゴリズムの習得をジャンルでまとめてみた

スキルアップ問題集のテーマに、定番アルゴリズムの習得がありますが、ジャンルごとにまとめてみました。

https://paiza.jp/works/mondai



# 定番アルゴリズムの習得

### 線形探索
| メニュー | 対象者 | 内容 |
|:-:|:-:|:-:|
| 線形探索メニュー　|線形探索がどういったものか分からない方にオススメのメニューです。|線形探索を複数回おこなって答えを得る手法を学習することができます| 
線形探索メニュー応用編  | 線形探索メニューを学習し終えた人にオススメのメニューです。  | 線形探索メニューよりも複雑な構造の問題や、より多くの実装を必要とする問題が解けるようになります。  |

### ハッシュ
| メニュー | 対象者 | 内容 |
|:-:|:-:|:-:|
| ハッシュメニュー|DランクやCランクの人にオススメのメニューです。   | シンプルなハッシュ関数・ハッシュテーブルの実装ができるようになります。  |

### 素数
| メニュー | 対象者 | 内容 |
|:-:|:-:|:-:|
| 素数メニュー  | 四則演算などの簡単な計算処理ができるようになった人におすすめのメニューです。  | 素数に関する簡単な数学的操作ができるようになります。|


### ユークリッドの互除法
| メニュー | 対象者 | 内容 |
|:-:|:-:|:-:|
| ユークリッドの互除法メニュー  | 繰り返し・条件分岐・四則演算の問題が解けるようになってきた人にオススメのメニューです。  | ユークリッドの互除法や、その派生・関連アルゴリズムの知識がつきます。  |
|ユークリッドの互除法メニュー応用編  | ユークリッドの互除法というアルゴリズムにまだ慣れていない方にオススメのメニューです。  | ユークリッドの互除法・拡張ユークリッドの互除法を使う問題を解けるようになります。  |

### リスト
| メニュー | 対象者 | 内容 |
|:-:|:-:|:-:|
| 連結リストメニュー| 標準入出力・配列・条件分岐を学習した人にオススメのメニューです。  |   少し複雑で長いプログラムを手順を考えながら実装できるようになります。|
| リストメニュー応用編  | 連結リストメニューでの学習を終えた方にオススメのメニューです。  | リスト構造を用いた高速化・実装の単純化ができるようになります。  |

### ソートアルゴリズム
| メニュー | 対象者 | 内容 |
|:-:|:-:|:-:|
| 素朴なソートアルゴリズムメニュー  | ソートを知らない方や、ソートの実装ができない方にオススメのメニューです。  | 挿入ソート、選択ソート、バブルソートの問題演習ができます。  |
| 効率的なソートアルゴリズムメニュー  | 素朴なソートアルゴリズムメニューの内容を理解している方にオススメのメニューです。  | シェルソート、マージソート、クイックソートの問題演習ができます。  |

### ソート
| メニュー| 対象者 | 内容 |
|:-:|:-:|:-:|
| ソートメニュー応用編| 配列・ループ処理・条件分岐といった言語の基礎的な部分ができる人にオススメのメニューです。  | paizaランクB, Aレベルのソートが必要な問題が解けるようになります。  |

### 二分探索
| メニュー | 対象者 | 内容 |
|:-:|:-:|:-:|
| 二分探索メニュー  | B, Cランクの方にオススメのメニューです。  |初歩的な二分探索の問題が解けるようになります。   |
| 二分探索メニュー応用編  | 問題文を読んで二分探索を適用できることに気づけるようになります。  | また、二分探索を応用した問題を解くことができるようになります。  |



### 累積和
| メニュー | 対象者 | 内容 |
|:-:|:-:|:-:|
| 累積和メニュー | 計算量について意識しはじめた方にオススメのメニューです。  | 普通に解けば大きな計算量になってしまう問題を、累積和を使って解決することができるようになります。  |
| 累積和メニュー応用編  | 累積和に触れたばかりの人や、まだ典型的アルゴリズムに慣れてない人にオススメのメニューです。  | 累積和の考え方を応用して様々な問題を解くことができるようになります。  |

### スタック・キュー/幅優先探索・深さ優先探索
| メニュー | 対象者 | 内容 |
|:-:|:-:|:-:|
| スタック・キューメニュー| DランクやCランクの人にオススメのメニューです。  | 基礎的な文法が理解できた後に・アルゴリズムについて学習する前に取り組んでみてください。  |
| スタック・キューメニュー応用編  | スタック・キューメニューを学習し終えた人にオススメのメニューです。  | スタック・キューを使う問題を解けるようになります。幅優先・深さ優先探索を学習する前に取り組んでおくと良いです。  |
| 幅優先探索・深さ優先探索メニュー  | 入力形式についての基本操作ができる人にオススメのメニューです。  | 入力の形式に合わせた、幅優先探索・深さ優先探索ができるようになります。  |


# 定番グラフアルゴリズムの習得
| メニュー| 対象者 | 内容 |
|:-:|:-:|:-:|
|グラフ構造の入力メニュー   | グラフの概念や知識を知らない人や難しいアルゴリズムを設計できない人にオススメのメニューです。  | グラフの入出力や隣接行列や隣接リストの実装ができるようになります。  |
| 木のメニュー| グラフや木についての知識や扱いに自信がない人にオススメのメニューです。  | プログラミングにおいて木を扱う際の基本的な操作がわかるようになります。  |
| グラフ・DFSメニュー  | グラフの概念はなんとなく知っているが、実際にプログラムで扱ったことがない人にオススメのメニューです。  |  DFSを理解し、連結成分の数の判定や木の判定に使用できるようになります。 |
|グリッド版ダイクストラ問題セット   | グリッド版ダイクストラ法を学びたい人向けです。  |グリッド上でダイクストラ法を活用して最短経路などを求める問題をまとめています。   |
| 巡回セールスマン問題メニュー| グラフ構造について理解している人にオススメのメニューです。  | ヒューリスティクスアルゴリズムの思想・実装の仕方がわかるようになります。  |
| ワーシャルフロイドメニュー| 最短路問題をどう解けばよいのかわからない方にオススメのメニューです。 | 最短路問題を解けるようになります。  |
python:DeeplAPIメモ

DeepLのpython用 APIを使用して単語帳Webアプリを作成した時の躓いた点

https://www.deepl.com/docs-api/translate-text/large-volumes/

上記によると、`sorce_string`は`EN`, `target_string`には`EN-US`, `EN-BR`を使用してくださいと書いてある。
【GAS無し】GoogleスプレッドシートでGoogleの祝日カレンダーから自動更新される祝日シートを作成する

# TL;DR
- Googleは日本の祝日カレンダーを公開しており、`API`から`ICS`形式で取得できる
- スプレッドシートでは基本的に`ICS`の正確なパースはできないが、`:`区切りの`CSV`として扱えば重要な値は抽出できる

サンプルシートは以下で公開しています。

https://docs.google.com/spreadsheets/d/1ErT3z6Z8FMsWTDpPIGmqPQppMj82KCAc5i56aWktusY

# 本文
記事執筆時点では`ICS`ファイルを直接インポートする機能も、カレンダーを`CSV`でエクスポートする方法も提供されていませんでした。
仮に提供されているならそちらを使うことをお勧めします。

また、自分は利用していませんが、`GAS`を用いればGoogleカレンダーをより高度に取り扱うことができるため、縛りが無ければそちらの利用をお勧めします。

## 処理対象と`ICS`形式について
まず、Googleの公開している日本の祝日カレンダーは、以下のエンドポイントから取得できます。

https://calendar.google.com/calendar/ical/ja.japanese%23holiday%40group.v.calendar.google.com/public/basic.ics

この中身の開始・終了部と1レコード分を抜粋したものが以下です（レコード前後の改行は見やすさのために加えたもので、実際には改行されていません）。

```:icsファイルから抜粋
BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:日本の祝日
X-WR-TIMEZONE:UTC
X-WR-CALDESC:日本の祝日と行事

BEGIN:VEVENT
DTSTART;VALUE=DATE:20240923
DTEND;VALUE=DATE:20240924
DTSTAMP:20230227T153753Z
UID:20240923_1phfmrt6k7jjcr1d5lbv7550uc@google.com
CLASS:PUBLIC
CREATED:20220927T105018Z
DESCRIPTION:祝日
LAST-MODIFIED:20220927T105018Z
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:秋分の日 振替休日
TRANSP:TRANSPARENT
END:VEVENT

END:VCALENDAR
```

パッと見訳が分からないかもしれませんが、ここからは以下のことが読み取れます。

- キーと値は`:`で分割されている
- レコードには開始・終了が定義されている（= フィルタリングしても元々のレコード順で抽出できる）

言い換えると、`:`区切りの`CSV`としてインポートし、キーに対応する必要な値だけ抽出できるということです。

## 実際に処理する
### `:`区切りの`CSV`としてのインポート
`:`区切りの`CSV`としてのインポートは、`=IMPORTDATA("https://calendar.google.com/calendar/ical/ja.japanese%23holiday%40group.v.calendar.google.com/public/basic.ics", ":")`で行えます。

結果は以下のような内容がずらっと並びます。

| | |
|-|-|
|BEGIN|VCALENDAR|
|PRODID|-//Google Inc//Google Calendar 70.9054//EN|
|VERSION|2|
|CALSCALE|GREGORIAN|
|METHOD|PUBLISH|
|...|...|

### 必要な値を抽出する
確認した所、`DTSTART;VALUE=DATE`キーに日付が、`SUMMARY`キーに祝日の名前が入るようでした。
サンプルシートではそれぞれ以下のように抽出を行っています。

| `DTSTART;VALUE=DATE` | `SUMMARY` |
|-|-|
|`=FILTER(B2:B1000, A2:A1000 = "DTSTART;VALUE=DATE")`| `=FILTER(B2:B1000, A2:A1000 = "SUMMARY")` |

結果は以下のようになります。
見て分かる通り日付順にはなっていませんが、ここまで抽出できれば後はどうとでもできるでしょう。

| `DTSTART;VALUE=DATE` | `SUMMARY` |
|-|-|
|20240923|秋分の日 振替休日|
|20240922|秋分の日|
|20230923|秋分の日|
|20240715|海の日|
|20230717|海の日|
|...|...|
値オブジェクト + 完全コンストラクタのススメ

# 値オブジェクトとは

ある値とそれに強く関係する操作をひとまとめにしてオブジェクトとする設計手法です。高い凝集度を実現することができ、最も簡単に始められるDDD(ドメイン駆動設計)のプラクティスの1つだと個人的には思っています。

例えば敵と戦うタイプのRPGでは各キャラクターにHP(ヒットポイント)が割り当てられています。この場合HP(値)とそれに強く関係する操作やロジックを1つのオブジェクトに詰め込みます。Goだとこんな感じに書けます。

```Go
package hitPoint

import "fmt"

type HitPoints struct {
    value int
}

func NewHitPoints(value int) *HitPoints {
    if value < 0 {
        panic("hit points must be non-negative")
    }
    return &HitPoints{value}
}

func (hp *HitPoints) Value() int {
    return hp.value
}

func (hp *HitPoints) Subtract(amount int) *HitPoints {
    newHP := hp.value - amount
    if newHP < 0 {
        newHP = 0
    }
    return NewHitPoints(newHP)
}

func (hp *HitPoints) Add(amount int) *HitPoints {
    newHP := hp.value + amount
    return NewHitPoints(newHP)
}

func (hp *HitPoints) String() string {
    return fmt.Sprintf("%d HP", hp.value)
}

```

一応以下のような問題点がこのコードにはあるのですが、ある値(HP)とそれに関係するバリデーションロジックや操作を一まとめにするイメージを掴んで頂くために瑣末な問題だとして目を瞑ることにします。

- コンストラクタでpanicではなくerrorを返すべき
- Valueメソッドの戻り値がイミュータブルになってない

そして値の操作では自分自身のオブジェクトを新たに作成して返すことで、常に生成された値がバリデーションを通過していることが保証されるので安心して値を使うことができます。

# 完全コンストラクタ

完全コンストラクタとは、コンストラクタにバリデーションロジックを実装し、それを通過した値のみ初期化させ、通過しない値は初期化させないようにする設計パターンです。地味ですが、こうすることで存在する値オブジェクトが全てバリデート済みであることが保証されます。不当な値はオブジェクトに初期化すらされないのでアプリ上から存在しなくなります。実は上記のコードの中で既に実践されていました。

```Go
func NewHitPoints(value int) *HitPoints {
    if value < 0 {
        panic("hit points must be non-negative")
    }
    return &HitPoints{value}
}
```

こうしておけばバリデーションロジックが増えた時もこのコンストラクタの中だけをいじれば良いので保守もしやすいです。

以上！
MySQLをコマンドラインから起動する

自分用メモです。

# コマンドプロンプト起動

`管理者権限`でコマンドプロンプトを起動したあと MySQL をインストールしたディレクトリの中の bin ディレクトリにある mysqld.exe を実行。
```
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983287/c10055e4-5bda-8533-ea4b-d2c1bbe6d346.png)
MySQL が起動しました。

実行すると、コマンドプロンプトは操作ができない状態となりますので、 MySQL に対する操作は別のコマンドプロンプトを起動して行ってください。

mysqlがあるファイルに移動して
```
mysql -u root -p
```
を実行。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983287/0897a316-010d-65f4-a7db-1c11ddb89f44.png)

`mysql>`がコマンドに現れたらMySQLと接続できている証拠。


https://www.javadrive.jp/mysql/install/index10.html

```
quit
```
でMySQL停止。
Django フォームからデータを取得編

# 目次
[1.HTTPリクエスト：GET](#1-HTTPリクエスト：GET)
[2.HTTPリクエスト：POST](#2-HTTPリクエスト：POST)
[3.DjangoでPOST(GET)を取得する方法](#3-DjangoでPOST(GET)を取得する方法)

#1. HTTPリクエスト：GET
- http://localhost/selfphp/selfphp/chap08/link2.php?keyword=%E3%82%AF%E3%82%A8%E3%83%AA%E6%83%85%E5%A0%B1%EF%BC%88&%%EF%BC%89
- →%からクエリ情報
- GETメソッドでクエリ情報を受け取るとき、"&"や”#”マルチバイト文字はクエリ情報に含めることができない
- URLにデータがアドレス欄に表示される
- ブラウザの環境によって送ることができるデータサイズが決定される


#2. HTTPリクエスト：POST
- POSTポストデータにはリクエストボディとして埋め込まれる
- 事実上無制限のデータを扱える。
- URLとは別のリクエストボディにデータが含まれるため、ブックマークできない


#3. DjangoでPOST(GET)を取得する方法
Djangoのrequest(httpリクエストのこと)引数から
```python:views.py
request.POST.get("key")
```

----
メモ
ラジオボタンからPOSTで値を得るとき、nameの内容がkey
html属性の`value`が`value`になる?
->html属性の`name`が`key`, `value`が`value`になる
font-face指定の罠

## 経緯
たまにものすごい表示のサイトに遭遇するようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400938/da053e92-4f49-8275-c6c9-ba689b50590c.png)

なんだこれはぁ…(恍惚)

## 環境
Windows10, Chrome
※その他の環境は関係ないのでどうでもいい

## 結論
サイト側フォント指定の問題
~~~
@font-face {
  font-family: "Noto Sans JP";
  font-style: normal;
  font-weight: 700;
  src: local(""), /* ←犯人はこいつ */
       url(/xxx/noto-sans-jp-v36-latin_japanese-700.woff2) format("woff2"),
       url(/xxx/noto-sans-jp-v36-latin_japanese-700.woff) format("woff");
  font-display: swap
}
~~~
これ

## 原因
色々切り分けた結果Firefoxでは問題ない
EdgeとChrome、別端末でも起きているのでChromiumが原因ぽい
開発者ツールで検証してみる

### 冒頭のサイトのfont-family指定
~~~
font-family: Noto Sans JP,-apple-system,BlinkMacSystemFont,Helvetica Neue,Helvetica,Hiragino Sans,Hiragino Kaku Gothic ProN,Arial,Yu Gothic Medium,Yu Gothic,YuGothic,Meiryo,sans-serif;
font-family: var(--default-font-family);
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400938/08f81179-d8a1-864e-c822-b6c8a6eee35f.png)
うーん

### Noto Sansの指定をローカル名称にしてみる
~~~
font-family: Noto Sans CJK JP,-apple-system,BlinkMacSystemFont,Helvetica Neue,Helvetica,Hiragino Sans,Hiragino Kaku Gothic ProN,Arial,Yu Gothic Medium,Yu Gothic,YuGothic,Meiryo,sans-serif;
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400938/c4376662-67d9-1ecd-6b6d-119f5198d0d9.png)
なるほど？

### じゃあフォールバック
~~~
font-family: Noto Sans JP,Noto Sans CJK JP, -apple-system,BlinkMacSystemFont,Helvetica Neue,Helvetica,Hiragino Sans,Hiragino Kaku Gothic ProN,Arial,Yu Gothic Medium,Yu Gothic,YuGothic,Meiryo,sans-serif;
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400938/1b4a7df6-87bf-159b-16d2-3f896167c81c.png)
は？

### 書体指定自体を疑い出して順番やらを入れ替えるも何かおかしい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400938/6b99cdfe-012e-77ff-d773-15defa28e6f8.png)
ん？<strong>正しい指定できてるタイミング</strong>じゃなく<strong>指定が崩れた時</strong>に正常に表示されてないか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400938/980a8e6f-7398-8ace-a1f8-f75cc508c65d.png)


あっ…

## まとめ
発生条件としては、
・Noto Sans JPの指定が入っていて(Webフォントで読み込み)
・ローカルのファイルがある場合はそちらを優先的に表示する指定が入っていて
・ローカルのフォント指定が空の場合
Chromiumでは全く別のフォントが表示される模様

~~~
@font-face {
  font-family: "Noto Sans JP";
  font-style: normal;
  font-weight: 400;
  src: local("Noto Sans CJK JP"),/* ←これがないと発生 */
       url(/public/assets/fonts/noto-sans-jp-v36-latin_japanese-regular.woff2) format("woff2"),
       url(/public/assets/fonts/noto-sans-jp-v36-latin_japanese-regular.woff) format("woff");
       font-display: swap
}

@font-face {
  font-family: "Noto Sans JP";
  font-style: normal;
  font-weight: 700;
  src: local("Noto Sans CJK JP"),/* ←これがないと発生 */
       url(/public/assets/fonts/noto-sans-jp-v36-latin_japanese-700.woff2) format("woff2"),
       url(/public/assets/fonts/noto-sans-jp-v36-latin_japanese-700.woff) format("woff");
       font-display: swap
}
~~~

開発者自身の環境だと問題ない場合もありそうだし
そもそもローカルにフォントが入っていない環境だと問題なく表示できるでしょうしで
開発者殺しの罠ですね。
[初心者]Ansibleの学習環境の構築1/3(Ansibleとは)

# はじめに
Ansibleの学習を始めて1か月ほど経ったので、これまでの学習内容の振り返りとアウトプットとして、Ansibleを使ったことがない人向けの記事を書きました。
この記事(全3回)を読んで「AWSまたはAzure環境に構築した仮想マシンにAnsibleをインストールし、実際にPlaybookを実行することができるようになる」ことを目標にしています。
1本目となる本記事ではAnsibleの概要についてまとめました。

第1回　Ansible概要(現在のページ)

第2回　学習環境構築

https://qiita.com/Yuya_Ikuta/items/c2f6432f67a366358b61

第3回　Ansible実践
作成中

# 目次
・IaCについて
・Ansibleとは
・学習環境を構築するにあたって
・(余談)Terraformとの違い

# IaCについて
サーバなどのインフラの構築をコードを用いて行う方法をIaC(Infrastructure as Code)といいます。
AnsibleもIaCを実現するためのツールの1つです。
IaCの概要については本記事では深堀りしませんが、IaCによって以下のようなメリットが得られます。
　・作業効率化・工数削減
　・人的ミスの削減
　・再利用性の向上　など
本記事でIaCについての詳しい説明は割愛しますが、
IaCを実現する上でIaCの必要性やメリット・デメリットについては理解しておきましょう。
下記に参考になるリンクを記載しています。

https://udemy.benesse.co.jp/development/system/iac.html

https://pfs.nifcloud.com/navi/tech/iac.htm

# Ansibleとは
> Ansible® は、プロビジョニング、構成管理、アプリケーションのデプロイメント、オーケストレーション、その他多くの IT プロセスを自動化する、オープンソースの IT 自動化ツールです。他の単純な管理ツールと違い、Ansible のユーザー (システム管理者、開発者、アーキテクトなど) は、ソフトウェアのインストール、日常的に行うタスクの自動化、インフラストラクチャのプロビジョニング、セキュリティとコンプライアンスの向上、システムへのパッチ適用、組織全体での自動化の共有に、Ansible の自動化を使用できます。

https://www.redhat.com/ja/technologies/management/ansible/what-is-ansible

### Ansibleの特徴
Ansibleの特徴として以下の3つが挙げられます。
　1.エージェントレス
　2.シンプルで可読性が高い
　3.冪等性(べきとうせい)がある

<dl>
<dd>1.エージェントレス</dd>
<dd>　Ansibleは管理対象へのエージェントのインストールが不要であるため、管理対象が多数ある場合でもセットアップの工数を削減でき、導入コストを低く抑えることができます。</dd>
</dl>

<dl>
<dd>2.シンプルで可読性が高い</dd>
<dd>　AnsibleはYAML形式でコードを記載します。そのため可読性が高く、他の構成管理ツール(PuppetやChef)に比べると学習コストが低いです。</dd>
</dl>

<dl>
<dd>3.冪等性(べきとうせい)がある</dd>
<dd>　冪等性とは、何度処理を実行しても同じ結果になるという性質です。Ansibleは処理を実行する前に、変更の必要があるかどうかを判断し、変更の必要がなければ処理をスキップする仕様があります。これによって処理の重複を防ぐことができます。</dd>
</dl>

# 学習環境を構築するにあたって
次回の記事で環境構築を行いますが、下記の2点については事前にご準備ください。
・AWSまたはAzureのアカウント(片方だけで問題ありません)
・teraterm(サーバへのSSH接続に使用します)

:::note warn
補足
Azureでの環境構築は記事作成中のためAWSのアカウントをご用意ください。(2023//2/21時点)
:::


# (余談)Terraformとの違い
有名なIaCツールの1つにTerraformがあります。TerraformとAnsibleは同じIaCツールですが、大きく違う点があります。そのため、AnsibleとTerraformをどちらも利用するということも可能です。

大きな違いとして、AnsibleとTerraformでは得意な領域が異なります。
具体的には、TerraformはVPCやEC2(VM)など、インフラリソースのプロビジョニングが得意です。
一方で、Ansibleは作成したEC2(VM)の中のOSやミドルの構築管理が得意です。

| 　　　　　　 |Ansible | Terraform |
|:-----------:|:------------:|:------------:|
| 開発元      | RedHat         | Hashi Corp    |
| インフラのプロビジョニング    | ○    | ◎      |
| OS・ミドルの構成管理      | ◎       |○      |
| 自動化言語      | YAML       |HCL      |
| プログラミングの型*     | 手続き型(命令型)       |    宣言型       |

※ 手続き型(命令型)と宣言型
手続き型(命令型)と宣言型の違いは、具体的な手順を記述するか、完成形の状態を記述するかです。
宣言型では、完成形の状態を記述することで、ツールが適切な手順を自動的に処理してくれます。一方、手続き型(命令型)では、完成形ではなく、具体的な手順を記述する必要があります。しかしその分複雑な条件分岐などを記述することができます。

片方のツールだけでも、インフラのプロビジョニングからOS・ミドルの構成管理を行うことは可能ですが、それぞれのツールの長所と短所を理解して、状況に合わせて適切なツールを使い分けることでIaCのメリットを最大限に発揮できます。


# さいごに
　今回は、Ansibleの概要について紹介しました。
　次回は実際にAnsibleの学習環境を構築をしていきます。

第2回→

https://qiita.com/Yuya_Ikuta/items/c2f6432f67a366358b61
Flutter🐬でビルド時にAuto increment する


Flutter のアプリビルド時に、自動で
* version number
* version code
の両方をAuto inclement したい。

と思ったので、共有します。

以下のコマンドを実行することでインクリメントできます。

```increment.sh
# Increment version
perl -i -pe 's/^(version:\s+\d+\.\d+\.\d+\+)(\d+)$/$1.($2+1)/e' pubspec.yaml
```

もっと言えば、シェルスクリプトで実行するとシンプルになります。
社会人1年目のタイピング練習

# はじめに
タイピング速度が2倍になれば作業にかかる時間は半分になります。
それほどタイピングは作業を効率化させるために欠かせない重要なスキルです。

今回は、私が新卒入社してから約1年間タイピング練習を行う中で、
効率的にタイピング速度を上げるために
意識していたこと・おすすめのタイピングサイトについて記事にまとめました。
これからタイピング練習したい方のご参考になれば幸いです。

# 1年間タイピング練習をした成果
以下は私が約1年間タイピング練習をした成果です。
最初に比べると打ったキーの数が2倍以上になり、ミスタイプも大幅に減らすことができました。
### 入社時(4月)

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748625/29544b64-3ea8-6b53-a696-ce5b7e8acbff.jpeg">

### 現在

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748625/e3752913-cb88-3324-07c6-c134f332a377.jpeg">

# タイピング練習をする上で意識したこと
ここからはタイピング練習を行う中で、
初心者の時に意識していたこと、スコアが伸び悩んでいた際に試したことについて紹介します。

<dl>
  <dt>■初心者の時(寿司打高級コースで1万円以下)</dt>
　<dt>　得意なキーと苦手なキーを可視化して、タイプミスを減らす</dt>
  <dd>人によってミスをしにくい得意なキーとミスをしやすい苦手なキーがあります。それを可視化し、意識して練習を行うことで効率的にタイプミスを減らすことができます。</dd>　
  <dt>　キーの場所を指に覚えさせる</dt>
  <dd>タッチタイピング(ブラインドタッチ)を効率的に身に着けるために意識していました。指をどこまで動かせばキーを押せるかを指に覚えさせることで、感覚的にタイピングができるようになり、キーボードを見なくてもタイピングができるようになります。これに関してはタイピング練習をしていれば自然と身に付きます。</dd>　
 <dt>　毎日練習する</dt>
  <dd>1日10分でも良いので毎日練習をすることが効率的なタイピング速度の向上につながります。ただタイピングをするのではなく、タイピング速度を向上させるために意識して練習することが重要です。</dd>

　<dt>■スコアが伸び悩んでいた時</dt>　　　
  <dt>　リズムに合わせてタイピングをする</dt>
  <dd>音楽のリズムに合わせて一定のリズムでタイピングをすることで、正確さ・スピードが上がりやすくなる気がします。
実際に私が寿司打でハイスコアを出した時は音楽を聴きながらしていたことが多いです。</dd>
　<dd></dd>
  <dt>　正確さを気にせずにとにかくスピードを上げる(おすすめ)</dt>
  <dd>「ドラゴンボールの悟空のように負荷をかけて修行することで限界を超える」というイメージです。具体的には自分が正確にタイピングできるタイピング速度の120%の速度でタイピングを行います。この練習中はタイプミスは大幅に増えると思いますが、この練習後にタイピングの速度を少し落としてみると、練習前よりも速度が上がり、かつ正確なタイピングができるようになります。</dd>
</dl>

# おすすめのタイピング練習サイト4選
1.寿司打　おすすめ度★★★
定番のタイピング練習サイトで、スコアが金額として表示されるため、自分の成長を視覚的に確認できます。
これが、モチベーションを維持するために役立ちました。

https://sushida.net/

2.typing-tube　おすすめ度★★★
YouTubeの動画を使って好きな曲を聴きながらタイピング練習ができます。時間を忘れるほど楽しいです。

https://typing-tube.net/

3.Popタイピング　おすすめ度★★
寿司打のポップコーン版です。制限時間が短い・タイプミスがスコアに大きく影響することが寿司打との違いです。
1回1分程で終わるため、手軽という面でおすすめです。

http://typingx0.net/pop/


4.タイピンガーZ　おすすめ度　★
育成したモンスターでオンライン対戦ができます。
人間が相手ということもあり、ある程度のタイピング速度がないと勝てないです。また、
・オンライン対戦をする前にモンスターの育成が必要(最高レベルにするまで30分程)
・対戦相手のタイピングが速すぎて一瞬で負けることがある
といった注意点があります。
始めるハードルは高いですが、ゲーム自体はとても面白いです。

https://typingerz.com/battlemenu

# さいごに
　人によって最適な練習方法は異なると思いますが、この記事がその参考になれば幸いです。
　最後まで読んでいただきありがとうございました。
paizaラーニング 解答【マップの扱い 1】マップの書き換え・1 マス Java編

## 問題URL
https://paiza.jp/works/mondai/b_rank_new_level_up_problems/b_rank_new_level_up_problems__get_one

もっと早いコードがあれば教えていただきたいです。

## コード(Java)
```
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int row = sc.nextInt();
        int column = sc.nextInt();
        char[][] testList = new char[row][column];

        for (int i=0;i < row; i++) {
            String textVal = sc.next();
            for (int j=0;j < column; j++) {
                testList[i][j] = textVal.charAt(j);
            }
        }
        
        int y = sc.nextInt();
        int x = sc.nextInt();
        
        if(testList[y][x] == '.') {
            testList[y][x] = '#';
        } else if(testList[y][x] == '#') {
            testList[y][x] = '.';
        }

        for (int i=0;i < row; i++) {
        System.out.println(testList[i]);
        }
    }
}
```
delhi university books

we provide study material to those enrolled in Delhi University or IGNOU, which is known for its superior quality at economical prices. Our resource books are written by experts from renowned colleges of Delhi University, IGNOU, and CBSE. 
Top Publications has been dedicated to providing quality material to students to help them succeed in their exams. With our commitment to excellence, we are sure to remain the No.1 choice for all CBSE exam-goers.
  https://www.top-publication.com/product-category/delhi-university/
SwiftでAnimation PNGを仕様から実装したのでメモだけ残す


先日からAPNGをApple標準関数で実装したり、Animation GIFを実装したりしましたが、結局APNGを仕様から実装しました。

https://qiita.com/mbotsu/items/99f21a0b244fbc048547

https://qiita.com/mbotsu/items/5b4b7bb2242d0a45da46

https://speakerdeck.com/mbotsu/swiftdeanimation-pngwoshi-yang-karazuo-cheng-sitemita

色々紆余曲折があり、libpngやffmpegも調べたのですが、少し手順を踏まないと組み込めないサードパーティライブラリであることや余分な実装が一緒に載ってくるのが好ましくなかったので仕方なく仕様から実装しました。

libpngはAPNGが投票数が少なく採用されなかった経緯がありパッチで提供されているのも興味深かったです。
結局iOSに導入しやすいOpenCV（公式にサポートしている）を使って実装しました。
詳しくは[資料](https://speakerdeck.com/mbotsu/swiftdeanimation-pngwoshi-yang-karazuo-cheng-sitemita)を参考ください。

OpenCVをSwiftで利用する場合、`Other Linker Flags`に`-all_load`を指定しないとMatToUIImageが使えなかったりしますが、MatToUIImageは自分で書くこともできますので`-all_load`がプロジェクトで利用しにくい場合や、後から使わない可能性がある場合は使わないのも選択肢です。
こういったパラメータが複数のリリースに向けたパッケージを追加した場合に問題起こすのはあるあるです。

しかしiOSではApple標準関数だけではAPNGの実装で困った方はいたと思うのですが、みんなどうしてたのでしょう。
結構長い期間その状態だったと思うのですが。
ニッチなのもあり情報が見当たらないですが独自に仕様から実装してたのですかね？

## Swift Animation PNG Example

https://gist.github.com/mbotsu/817c96b9a31901ec392fc8ba1389902a

それでは良い開発ライフを。