OmniAICreator/Qiita-1.07M huggingface dataset:
tail -f を使ってリアルタイムのログを確認する

## tailコマンドでリアルタイムログを確認するまでの経緯
###  発生した問題
nginx.conf等諸々設定し、EC2インスタンスのIPv4DNSからアプリ画面へアクセス確認。
→ブラウザで`「応答時間が長すぎます。」`と警告が表示された。

### 問題の切り分け
発生した問題に対して以下の手順で調査を進めました。

1.sshは接続できるがhttpで接続できるか？
2.できないとして、どこまで来てるか？
3.EC2でアクセスがきているか確認する
→`netstat -ano | grep :80`　（Linuxのポート状況を確認に関しては以下の記事を参考に。）

https://www.linuxmaster.jp/linux_skill/2009/02/linux-4.html#chapter-1

→`/var/log/nginx/access.log`を確認　→ きていない。
4.まずAWS側に問題があることが一つ考えられる
→AWS側は修正するとして、EC2自体からローカルアクセスしたときにアクセスできるのか？
→`curl 127.0.0.1`叩いてローカルアクセスしてみる
→404で返ってくる → webサーバー（nginx）自体は正常に動いている。
5.アプリケーション側がおかしいかも？
→`/var/log/php-fpm/www-error.log`のログを確認　
→原因となるエラー出てた。
6.EC2コンソール画面からセキュリティルールのインバウンドルールを確認し、設定に不備があったので修正。その後、ローカルではなくブラウザからアクセス確認。
→最初に出た「応答時間が長すぎます。」は出なくなり、次は404エラーが発生。　
→とりあえずサーバは正常に動いた。しかし、何故404エラーが発生するのか？
7.ターミナルから`tail -f`でログファイルを開いた状態でブラウザアクセス
→404エラーの原因をリアルタイムで確認。 
→DBの設定ができてないことが判明！

```
[root@ip-??-??-??-?? php-fpm]# tail -f www-error.log

ERROR: SQLSTATE[HY000] [2002] Connection refused ・・・・
``` 

経緯はこんな感じです。
最後の箇所でブラウザからアクセスした時にリアルタイムでログを確認しました！

## まとめ
ターミナルから`tail -f`でログファイルを開いた状態にし、ブラウザからアクセスしてリアルタイムでログを確認。
デバック中はこんな感じでログを流しながら調査する方が分かりやすく、今後多く使っていくことになりそうなので記事にしてみました！
macOS の script コマンドにはウィンドウリサイズを認識しないバグがある

# はじめに
このバグがあるのは macOS (BSD) の場合のみ。GNU/Linux (Ubuntu など) ではこのバグは発生しなかった。



# `script` コマンドについて
UNIX には `script` というコマンドがインストールされている。これはターミナルの出力をファイルに出力して記録するものだ。

```shell:Shell
script
```

とするとサブシェルが起動する。ここから先は、ターミナルの出力が記録される。

```shell:Shell
exit
```

として `script` コマンドのサブシェルを抜けると、`script` コマンドを実行する前のカレントディレクトリに `typescript` というファイルが生成される。

このファイルの中に、`script` コマンド実行から終了までの間のターミナルの出力が記録されている[^1]。

[^1]: オプションなしだと `exit` してからファイルが生成される。また、すでに `typescript` というファイルが存在していた場合は、上書きされる。出力があったらすぐにファイルに出力するオプションや、上書きではなく追加するオプションもあるのだが、ここでは割愛する。詳しくは `man script` を参照のこと。

## メリット
ターミナルの出力をファイルに記録しておくメリットとしては以下が挙げられる。

* ターミナルの最大出力行数を超えて、ターミナル上からは消えてしまったログを見たいとき
* タブを閉じたあとのログを見たいとき
* 大量の出力の中に埋もれた特定のログをテキストエディタなどで検索したいとき

これらのメリットがあるため、個人的にはターミナルの出力は常に記録しておきたいのだが、macOS の `script` コマンドには **ウィンドウリサイズを認識しないというバグ** がある。



# 検証
## 正常系
まずは `script` コマンドを実行する前のウィンドウリサイズの挙動を確認する。

`tput` コマンド、または `stty` コマンドを使うとターミナルのウィンドウサイズを取得することができる。

| コマンド | 取得できる情報 |
| --- | --- |
| `tput cols` | 横幅 |
| `tput lines` | 縦幅 |
| `stty size` | 縦幅 横幅 |

```shell:Shell
stty size
41 178
```

そして、ターミナルのウィンドウサイズを変更して、もう一度同じコマンドを実行してみる。

```shell:Shell
stty size
32 134
```

ウィンドウサイズを少し小さくしてみたのだが、ちゃんと反映されている。



## `script` コマンド実行時
続いて、`script` コマンドを実行する。

```shell:Shell
script
```

そして、ウィンドウサイズを取得する。

```shell:Shell
stty size
32 134
```

この状態でウィンドウサイズを変更して、もう一度同じコマンドを実行してみる。

```shell:Shell
stty size
32 134
```

ウィンドウサイズを大きくしてみたのだが、数値が反映されていない。



# 問題点
`tput` コマンドや `stty` コマンドの数値が反映されないだけなら何の問題もないのだが、残念ながらいくつかの副作用がある。

たとえば `less` や `vim` や `man` などの、ページャーを起動するコマンドを実行すると、表示がバグる。

横幅と縦幅を正しく認識できていないので、折り返しを無効にしていても折り返しが発生したり (横幅)、縦にスクロールすると直前の表示が張り付いて表示がぐちゃぐちゃになったり (縦幅) する。

## GNU 実装はインストール不可
BSD 実装の `script` コマンドにバグがあるなら、GNU 実装のものを macOS にインストールすれば良いじゃないかと思うかもしれない。実際、筆者は GNU 実装の `ls` コマンドや `grep` コマンドを macOS にインストールして使っている。

しかし、残念ながら `script` コマンドに関しては GNU 実装のものを macOS にインストールすることができない。



# 解決策
## ターミナルのウィンドウリサイズに合わせてコマンドを実行する
`stty` コマンドで正しい横幅と縦幅を教えることで正常な挙動に戻すことができる。

```shell:Shell
stty rows <縦幅> cols <横幅>
```

しかし、ウィンドウリサイズをするたびに横幅と縦幅を調べて上記のコマンドを実行するのは面倒……。

## ウィンドウリサイズしない
昔はこれで対応していたときもあるが、やはりウィンドウサイズを途中で変更できないのは不便だった。

## iTerm2 の機能を使う
[iTerm2](https://iterm2.com) には `script` コマンドを使わずとも設定でターミナルの出力をファイルに記録する機能が実装されている。

`Profiles` -> `Session` -> `Miscellaneous` -> `Automatically log session input to files in` から保存先のパスを指定すると、そのディレクトリに出力ファイルを保存してくれる。

![](https://raw.githubusercontent.com/noraworld/developers-blog-media-ja/master/script-command-bug/Screen%20Shot%202022-03-22%20at%2023.05.05.png)

`Log plain text` にチェックを入れると、エスケープシーケンスなどを除外してくれる。エスケープシーケンスが入っていると見づらくなるので、チェックをつけておくことをおすすめする。

ただ、これはあくまで iTerm2 の話なので、別のターミナルアプリ (Terminal.app や VS Code のターミナル機能など) には適用されない。

筆者は最近、起動するアプリを減らすために VS Code のターミナルを使おうかなと思っているのだが、出力を記録できないので二の足を踏んでいる。

---

何か良い解決策はないものか。



# 参考
* [BSD script command prevents a terminal from recognizing its size. How can I fix this?](https://stackoverflow.com/questions/68554149/bsd-script-command-prevents-a-terminal-from-recognizing-its-size-how-can-i-fix)
* [Delete code related to recording](https://github.com/noraworld/dotfiles/commit/f2976bf95b57a3293385f9c194487deafb16ee53)
なぜ技術記事を書くのか

# はじめに
豊田工業高等専門学校 情報工学科 3年の加藤愛斗です。私は今まで技術記事をあまり書いてこなかったのですが、最近その考えを改めたので、その理由をざっくりとまとめておきます。


# 私が技術記事を書く理由
## 将来の自分のため 
### 卑しい心の時代の私 :boy:
私 「あーーエラー解決できん。まじわからん。」

数時間後...

私 「これで直ってくれ頼む！！」
私 「よっしゃーーー！！いけたーー！！！天才じゃん俺！これ解決できるの俺だけでしょ。自分だけの知識にして、みんなには内緒にして成長しちゃおっと。」

数カ月後...

私 「うわーこのエラーわからん」
私 「待てよ、どっかで見たことあるな？？」
私 「あ、数ヶ月前に解決したやつだ。どうやってやるんだっけ...???」

### この教訓から
エラー対処法を発信するのは、**同じ問題で詰まっている誰かを助ける**という目的もありますが、「情けは人の為ならず」という言葉が示すように、**将来の自分を助ける**ことにも繋がります！そのため、将来の自分に向けてラフに書けばいいと私は考えています。詳細な調査や、校閲などは必要ありません。（もちろん行うに越したことありません。他人のためにも将来の自分のためにもなります。） その簡単な知識共有が誰かの手助けとなるのです。

<details><summary>個人利益の追求に関しての私の考え</summary>

「**個人が自分の利益を追求する行動が、自分たちがまったく意図しないうちに、他の人にも利益をもたらすことがある**」というアダム・スミスの考え方がありますが、これはエンジニアとして生きていく上での話にもいえるのではないかと考えています。卑しい時代の私の「エラー対処法は自分だけの知識にしておこう」という考えは、小話にあったように最終的に自己利益につながっていません。そして、将来の自分のために記事としてまとめておこうという自己利益の追求をした結果として、同じ問題に詰まっている他の人にも利益をもたらす可能性につながっています。「世のため人のため」が出来ている人が美とされ、自己利益を求めている人は対照的に評価されますが、私は**自己利益を求めてるだけでも十分素晴らしいこと**だと思います。（私も自分のことで精一杯で人のための行動までは手が回りません笑）
</details>

## 文章構成能力 :memo:
エンジニアとして働いていく上で、物事をわかりやすく伝える能力は必要不可欠です。(Issueを立てるとき, PRを書くとき, etc) しかし現代は便利なチャットツールが生活に根付き、まとまった文章を書く機会というものは減っています。だからこそ、記事を書いたりして、**まとまった文章を書く能力を身につけることが必要**だと考えています。


## エンジニアの世界にいるからには :earth_asia:
我々の世界には、数多くの「**人のために行動できる人**」がいます。OSS開発者だったり、技術質問サイトで積極的に回答をしてくださる方や、自分の知見を技術記事にまとめてくれる方です。彼らを尊敬するのはもちろんですが、**自分も彼らのようになれるように**、エラー対処法や勉強して得た学びを技術サイトに投稿してみてください。
（初歩的なミスで詰まっていたのを共有するのは恥ずかしいという気持ちがあると思いますが、誰かが共有しないと永遠にその問題で時間を浪費する誰かが生まれてしまいます。また、自分の考えが正しいのかわからないどの不安もあると思いますが、投稿することによって誰かに指摘をされて誤りに気がつくことが出来たり、考えを深めることが出来たりすると私は考えます。← 「間違っててもいいから投稿して！」とは言っていません。間違えを恐れていたら何も始まらないということが言いたいです。誤った情報の発信の危険性は当然考慮すべきです。）


## 記事を書く時間 :hourglass_flowing_sand:
記事を書くのにはそれなりに時間を要します。私は効率主義で時間を無駄にしたくないため、記事なんて書いていられるかと思っていました。しかし、上記の前者2つのようなメリットを考えれば、**記事を書く時間が無駄というような発想が間違っている**ということに気が付きました。

# 最後に
雑ではありましたが、今私が考えていることはこのような感じです。是非、みなさんも技術記事をたくさん書いて、エンジニアの世界をより良くしていただければと思います！！
PS3がアメリカ空軍のスパコンに使われた話

https://nlab.itmedia.co.jp/games/articles/1012/07/news066.html

上記に記事を先輩に教えてもらって、読んでみたらアメリカ空軍がスーパーコンピュータにPS3を使ってた時があったらしいです。(もしかしたら今も使ってるかもしれませんが)

PS3はLinuxがOSみたいですね。
そしてこのPS3を使って暗号解読とかサイバー攻撃から守ったりするために使われているらしいですね

アルゴリズムの話を先輩としていたときの話でした
Dockerコンテナの中身を保持したまま，もう一度作成(run)しなおしたいとき

# はじめに
dockerでコンテナを作成するrunコマンドをうつとき，いろいろオプションをつけると思う．
しかし，dockerコンテナを作成して少し作業した後で，いくつかのオプションをつけていなかったせいで詰んでしまうということが起きた．

今までのデータを残したまま，もう一度コンテナを作成するための方法を今回まとめる．

# 対処法
対処法はコンテナをイメージ化し，そこからコンテナを作成するという方法だ．

コンテナをイメージ化する．
```
$ docker commit [name] リポジトリ名:TAG
```
[name]はコンテナ名，リポジトリ名とTAGは自分が分かりやすいように各自設定する．
これでコンテナの内容を保持したままのイメージを取得することができる．

その後は必要なオプションをつけてもう一度コンテナを作成する．
```
$ docker run -it --name [newname] リポジトリ名:TAG
```
コンテナを作成するときはリポジトリ名とTAGを指定する．

# おわりに
今回はdockerコンテナの中身を保持したまま，もう一度作成しなおしたいときの対処法をまとめた．
JavaScript で FormData 送信時、Content-Type を自分で書いてはいけない

旧記事名: (簡易メモ) JavaScript+FastAPI で FormData 送信時にハマったこと

# 問題

例えば、FastAPI に、

```py
# import 等は省略
@app.post("/post")
def route_post(key1: str = Form(...), key2: str = Form(...)):
  print(key1)
  print(key2)
  return
```

といったルートがあり、そこに JavaScript で以下のようにフォームデータを送信するとき、

```diff_javascript
var form = new FormData();
form.append("key1", "any_value1");
form.append("key2", "any_value2");

var xhr = new XMLHttpRequest();
xhr.open("POST", "/post");
- xhr.setRequestHeader("Content-Type", "multipart/form-data");
xhr.send(form);
```

といった感じに書くと思います。

ここで、`setRequestHeader("Content-Type", ...)`を入れてしまうと、`400`エラーが返されてしまいます。

```txt
INFO:     127.0.0.1:46198 - "POST /post HTTP/1.1" 400 Bad Request
```

# 解法

自力でリクエストヘッダを設定せず、自動にさせると正常に動きます。

# 原因

\[2023/01/21 追記\]

そもそも `multipart/form-data` というデータ型は、複数の種類のデータを結合して、1つにまとめたものです。

```txt:Header の一部
content-type: multipart/form-data; boundary=----WebKitFormBoundaryXfObUzJva7ymK2dx
```

```txt:body 全文
------WebKitFormBoundaryXfObUzJva7ymK2dx
Content-Disposition: form-data; name="key1"

any_value1
------WebKitFormBoundaryXfObUzJva7ymK2dx
Content-Disposition: form-data; name="key2"

any_value2
------WebKitFormBoundaryXfObUzJva7ymK2dx--
```

HTTP リクエストで送るとき、`Content-Type` ヘッダに `boundary` という項目が必須になります。`boundary` は、データの区切りを示す文字列であるため、必須の項目なのです。

手動で `setRequestHeader` を書いてしまうと、この `boundary` が消えてしまうので、400エラーが発生してしまう、というわけです。

ちなみに、MDN Web Docs に、ご丁寧にその警告がありました。ドキュメント読み、大事、ゼッタイ。

> 警告: FormData を使用して、`XMLHttpRequest` または `Fetch_API` を使用して、 `multipart/form-data` の Content-Type で POST リクエストを送信する場合 (Files や Blob をサーバーにアップロードする場合など)、リクエストの `Content-Type` ヘッダーを明示的に設定しないでください。そうすると、ブラウザーがリクエスト本文のフォームフィールドの区切りに使用する境界の表現で Content-Type ヘッダーを設定することができなくなります。

https://developer.mozilla.org/ja/docs/Web/API/FormData/Using_FormData_Objects

---

\[2022/3/23 追記\]
編集リクエスト頂き、ありがとうございました。
「メモ　タグを追加してみました by @Tetsu_Oikawa」

\[2023/01/21 追記\]
原因がちゃんと分かったので、簡易メモから昇進させました。
Rubyのメソッド名につく?（クエスチョンマーク）について

# はじめに
末尾に `?` がついているメソッドをよく見かけるけど、どういう役割なんだろう？と気になった


# そもそも `?` はどこで使われるているの？

>def xx?
この場合の「?」はメソッド名の一部分です。慣用的に、真偽値を返すタイプのメソッドを示すために使われます。

（引用: [Rubyリファレンス](https://docs.ruby-lang.org/ja/latest/doc/symref.html#q)）

https://docs.ruby-lang.org/ja/latest/doc/symref.html#q

つまり `?` まで含んだものがメソッド名になるということ

```ruby
def test?
  true
end

[1] pry(main)> test1?
=> true
```

# 例えばArrayクラスだと

https://docs.ruby-lang.org/ja/latest/class/Array.html

`include?` や `empty?` などのインスタンスメソッドがこれに相当する

# 末尾以外でも使える？

https://docs.ruby-lang.org/ja/latest/doc/spec=2flexical.html#identifier

[識別子](
https://ja.wikipedia.org/wiki/%E8%AD%98%E5%88%A5%E5%AD%90#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E8%AD%98%E5%88%A5%E5%AD%90)というわけではないみたいから、句中には入れられない

```ruby
[1] pry(main)> def test?1
SyntaxError: unexpected tINTEGER, expecting ';' or '\n'
def test?1
```

# じゃあ `?` をつけたら真偽値を返すようになるのか？

```ruby
def test2?
  p "test2"
end

[1] pry(main)> test2?
"test2"
=> "test2"
```
否、 `?` をつけたメソッドでも自動的に真偽値が返るわけではないみたい

https://stackoverflow.com/questions/10527997/should-a-method-ending-in-question-mark-return-only-a-boolean/10528014

# スタイルガイドでは

>The names of predicate methods (methods that return a boolean value) should end in a question mark (i.e. Array#empty?). Methods that don’t return a boolean, shouldn’t end in a question mark.
```ruby
# bad
def even(value)
end
# good
def even?(value)
end
```

>（日本語訳）述語メソッド（ブーリアン値を返すメソッド）の名前は、クエスチョンマークで終わるべきです（例：Array#empty? 真偽値を返さないメソッドは、クエスチョンマークで終わるべきではありません。

https://github.com/rubocop/ruby-style-guide#bool-methods-qmark

真偽値を返すメソッドを自作するときは、末尾に `?` をつけるようにしようぜ！ということみたい

# つまり
- 真偽値を返すメソッドは 末尾に `?` をつけるべし
- `?`をつけたところで、返り値が変わるわけではない


# 追記
コメントいただいた内容が勉強になったので追記します

Rubyでの「真偽値」は単にtrue/falseを表すものではなく、
真偽性を利用するための値として扱われるため、?のつくメソッドの返り値はtrue/falseには限られないようです。

https://qiita.com/scivola/items/fa59f05a31bb49b218d0

また?のつくメソッドを述語メソッドと呼ぶようです

>述語メソッド
predicate method
返り値を真偽値として用いるためのメソッド。メソッド名の末尾に ? を付ける習慣がある。

https://docs.ruby-lang.org/ja/latest/doc/glossary.html


# 参考記事URL

https://qiita.com/takahashim/items/ccfd489c9b26f15b7193

https://qiita.com/qpSHiNqp/items/7bcb0492c777a488ceba
FragmentContainerViewを使用した際の、ActivityでのNavigationComponentの書き方

# はじめに
今まで、フラグメントを使う際に`Activity`で、`fragment`を使用していたのですが、`FragmentContainerView`の方がFragmentに適したContainerの仕組みが提供されているらしくパフォーマンスが高いらしいと言うことを知ったので、`FragmentContainerView`を使い始めたのですが、その時に、`Activity`での`Navigation`の記述の仕方が少し変わっていて、そこで少しハマったのでその解決方法を残しておきます。

# 両者の違い

### fragmentを使用した場合

```Kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val navController = Navigation.findNavController(this, R.id.activity_main_nav_host_fragment)
        val bottomNavigationView = findViewById<BottomNavigationView>(R.id.activity_main_bottom_navigation_view)
        NavigationUI.setupWithNavController(bottomNavigationView, navController)
    }
```

`fragment`を使用した場合は、`findNavController`を用いて、`Activity`の`fragment`のidを取得しています。

### FragmentContainerViewを使用した場合

```Kotlin
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val navController = supportFragmentManager.findFragmentById(R.id.activity_main_nav_host)
        val bottomNavigationView = findViewById<BottomNavigationView>(R.id.activity_main_bottom_navigation_view)

        NavigationUI.setupWithNavController(bottomNavigationView, navController!!.findNavController())
    }
}
```

`FragmentContainerView`を使用した場合は、`findFragmentById`を用いて、`Activity`にあるidを取得しています。

微妙な違いなんですが、これができてないとエラーが起きてビルドできないので注意してください、、、、、、、
AWS CDK v1(TypeScript)でVPC作成時のAZを指定する

## 概要

AWS CDKでVPCと同時にサブネットを作成するとき、AZが自動で選択されてしまう
旧AZ(apne1-az3)[^1]ではできないことがいくつかあるため、AZを指定したい

[^1]: AZ名ではなくAZ IDで書いている。AZ IDについては[こちら](https://dev.classmethod.jp/articles/use-az-id-for-identify-az-crossing-over-account/)を参照 

https://blog.serverworks.co.jp/tech/2019/10/02/apne1-az3/

## 実行環境

```bash
:~ $ cdk version
1.148.0 (build 69a50f1)
```

## 解決方法

availabilityZones()を、指定したいAZ名を返すようにオーバーライドする

こんな感じ

```typescript
import * as cdk from '@aws-cdk/core'
import * as ec2 from '@aws-cdk/aws-ec2'

export class MyStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    new ec2.Vpc(this, 'VPC', {
      cidr: '10.0.0.0/16',
      subnetConfiguration: [
        {
          cidrMask: 24,
          name: 'subnet-test',
          subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
        },
      ]
    })
  }

  get availabilityZones(): string[] {
    return ['ap-northeast-1a', 'ap-northeast-1c'];
  }
}
```

https://docs.aws.amazon.com/cdk/api/v1/docs/aws-ec2-readme.html#control-over-availability-zones
rails 7系でjqueryが読み込めない問題

タイトルの通りです。rails7系からimportmapとやらを採用しているらいがいまいちわからなかったので緊急でとった対策を書きます。
# 開発環境
ruby 3.1.1
Rails 7.0.2.3

# できなかったこと
ドロップダウンメニューを作りたかったのですがrailsでimportmapとやらの仕組みがよくわからず、jqueryが読み込めなかった。
どうやらconfig/importmap.rbに読み込む際の名前と読込みたい内容（cdnやら）を記載してapp/javascript/application.jsで読み込めばいいらしいですがどうもうまくいきませんでした。
[ここ](https://www.bokukoko.info/entry/2022/02/15/153751)を参考にさせていただきました。

# 対策（緊急向け）
力技みたいな感じになりますが、以下のコードを追加したら読み込めます。笑
とりあえず先に進みたいって方向けです。

```ruby:view/layouts/application.html.erb
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
```

rails7系の記事は少ないので、importmapを用いて読み込むことができたらまた書こうと思います。
【C】初めてのC言語（2. 四則演算とフォーマット指定子）

# はじめに

[第1回の「Hello,world」](https://qiita.com/nkojima/items/518c1a4ec06861d74b3c)に続いて、C言語の基礎を学んだ結果をまとめてみました。


# 学習環境

* 今回は[paiza.io](https://paiza.io/ja/projects/new)のC言語のエディタを使いました。

# 四則演算

* 四則演算に使う記号はJavaやC#と同じです。
* データ型のキャストについてもJavaと同じでした。

```main.c
#include <stdio.h>
int main(void){
    int a = 2;
    int b = 3;
    
    int plus = a + b;
    int minus = a - b;
    int times = a * b;
    double divide = (double)a / b; // 結果を小数で得られるようにdouble型でcast
    
    return 0;
}
```


# フォーマットを指定した出力

* フォーマットを指定した出力には、データ型に応じた「出力フォーマット指定子」が必要となります。
 * 整数型：%d
 * 小数型（実数）：%f
 * 文字型（1文字）：%c
   * char型に対応したフォーマット。
 * 文字列型：%s
   * char型のポインター（`char*`）に対応したフォーマット。

```main.c
#include <stdio.h>
int main(void){
    int a = 2;
    int b = 3;
    
    printf("a = %d\n", a); // 整数型を出力する場合は「%d」
    printf("b = %d\n", b);
    
    int plus = a + b;
    int minus = a - b;
    int times = a * b;
    double divide = (double)a / b; // 結果を小数で得られるようにdouble型でcast
    
    printf("a + b = %d\n", plus);
    printf("a - b = %d\n", minus);
    printf("a * b = %d\n", times);
    printf("a / b = %f\n", divide); // 小数型を実数で出力する場合は「%f」
    return 0;
}
```

```text:出力結果
a = 2
b = 3
a + b = 5
a - b = -1
a * b = 6
a / b = 0.666667
```


# 参考URL

* [【C】初めてのC言語（1. Hello world）](https://qiita.com/nkojima/items/518c1a4ec06861d74b3c)
* [猫でもわかるプログラミングＣ言語編 - 第４章 書式指定など](http://www.kumei.ne.jp/c_lang/intro/no_04.htm)
* [猫でもわかるプログラミングＣ言語編 - 第５章 データ型など](http://www.kumei.ne.jp/c_lang/intro/no_05.htm)
* [フォーマット指定子一覧](https://www.k-cube.co.jp/wakaba/server/format.html)
Laravelとは？

## Laravelって何？
Laravelとは、PHPのフレームワークで、2011年にリリースされたもの。

### PHPとは？

PHPとはWebページを動的に生成できるサーバー再度のスプリクト言語。

### フレームワークとは？
フレームワークとは、アプリケーションフレームワークともいい、アプリケーション開発の土台となるソフトウエアのこと。
アプリケーションの枠組み、骨組み、構造部となるため、フレームワーク内に必要な機能を追加しながら開発を進める。

## Laravelの特徴
* 分業開発がしやすい
Laravelは「MVC」というアーキテクチャを採用している。
「MVC」とは、データベースとの連携を担う「Model」と、ブラウザへの表示を司る「View」、指示や指令を行う「Controller」の3つに分別し、機能ごとに開発を進める開発方法。
それぞれの機能別に独立しているため、システムやアプリを分業体制で開発ができるのが特徴。

* 学習コストが低い
シンプルなコードで記述できるため学習がしやすく、コーディングがしやすいのが特徴。
また、開発効率化を図ることができるのも特徴（簡単なコードなどは自動生成できる）

* プログラムの拡張性が高い
生成したコードのカスタマイズが容易。

* composerでパッケージ管理ができる
必要なパッケージやライブラリの管理を行うことができるcomposerで管理されている。

## LaravelはPHPの代表的なフレームワーク
PHPで開発を行う時はLaravelを活用することで効率的に作業を進めることができる。

## 公式サイト
[Laravel](http://laravel.jp/)
ブロックチェーンは不変ではありません

### 「ブロックチェーンは耐改竄性が高く、一度ブロックに取り込まれたら元に戻せない」

的なことを様々な記事で書かれています。

ブロックチェーン初学者である私はそれを鵜呑みにした結果ふと疑問が浮かびました。

### 「スマートコントラクトのstorageってブロックチェーンに永久に刻まれるのになんで更新できるの？？」

https://mirror.xyz/0x221E25Ad7373Fbaf33C7078B8666816586222A09/-7w5vNrn7od0HLdLGiK7-5_ZNAi3cdeuq-l4Jr02Pk4

storageについてこの記事で説明していますが、storageはブロックチェーン上に永久に保存される変数です。

ブロックチェーンは改竄できないという認識だったのでブロックチェーン上にあるstorageを更新できることに違和感を覚えていました。

しかし、この違和感の原因は「**ブロックチェーンは不変である**」という先入観にありました。

確かにブロックチェーンは不変ではありますが、その対象はブロックやトランザクションそれ自体です。

Bitcoinであれば取引金額を変えることはできません。これはトランザクションのデータになっているためです。

これがEthereumのスマートコントラクトになった場合はどうでしょうか？

よく言われているのは「コントラクトをデプロイすると永久に残り続けるので慎重に上げるべき」というような話です。

これは間違ってはいません。なぜならコントラクトの「**コード**」はトランザクションのデータになるので不変です。

しかし、スマートコントラクト内のstorageやmemoryの変数はトランザクションのデータというよりもすマートコントラクト内のデータなので変数として扱うことが可能です。

### 最後に

ここまで述べたようにブロックチェーンには不変である部分と不変ではない部分があることがわかりました。

この誤解はそもそもブロックチェーンの定義を曖昧にしていたことやそもそも明確に説明してある情報が少ないことも起因しているとも感じています。

これから自分でもどんどん発信していけるように頑張ります！

もし認識が間違っている箇所があれば教えていただきたいです。

**その訂正に情報の質の向上がかかっています！！！**
MVVM + Repository + Hilt + Retrofitで、Repositoryレイヤーからキャッシュを用いてAPIデータを取得する

# はじめに
先日Retrofitを、使ってデータを取得する処理を書いている時に、毎回毎回リモートサーバーからデータを取得するのは、通信量での負担がかかってしまいパフォーマンスが落ちてしまうという、レビューを受けてそれを解消するために、Repositoryレイヤーをうまく使って通信量の負担を減らす処理を教えていただいたので記録がてら書いておきます。

# やり方

```Kotlin
@Singleton
class MainRepository @Inject constructor(private val service: MainService) {
    private var cache: List<Demo>? = null
    
    suspend fun fetchDemo() = service.fetchDemo().body().also {
        cache = it
    }
    suspend fun getDemo() = cache ?: fetchDemo()
}
```

イメージとしては、`getDemo()`を呼び出して、その時に`cache`が`null`ならば`fetchDemo()`を呼び出して、`cache`が値を持っているならばそのまま返すという感じです。これにより、呼び出す時には`cache`からなのか`fetchDemo()`からなのかこちらは意識せずに、データを取得することができます。

もしリモートサーバーから最新の情報を取得する必要がある場合だけ`fetchDemo()`を呼び出してあげればOKですね！

# 同時呼び出しへの対策
上記の方法を使えば、毎回毎回リモートから取得する必要がなくなるので、だいぶ負担が減ると思います。
おまけで、2回以上同時に関数を呼ばれた際の対処法も載せておきます。

```Kotlin
@Singleton
class MainRepository @Inject constructor(private val service: MainService) {
    private var cache: List<Demo>? = null
    private val mutex = Mutex()
    
    suspend fun fetchDemo() = service.fetchDemo().body().also {
        cache = it
    }
    suspend fun getDemo() {
        mutex.withLock {
            cache ?: fetchDemo()
        }
    }
}
```

`Mutex`を使うことで、ブロック内を同時に一件のみ実行するようにすることができ、しっかり対策できました！

# 終わりに
少しづつでも、こういった細かいところまでしっかりコードが書けるようになりたいと思いました🧐
まだまだ自分のコードは改善できるところがたくさんあるはずなので、ちゃんと勉強していきます。
Google アナリティクス 4 はイベント中心の計測となった

memo.

## 結論
「セッション中心の計測」から「イベント中心の計測」へ変更されている。

## 理由
ウェブとアプリそれぞれ「自動的に収集されるイベント」「測定機能の強化」「推奨イベント」「カスタム イベント」と 4 つの分類となったため。

https://ayudante.jp/column/2020-11-24/11-00/

https://support.google.com/analytics/answer/9322688?hl=ja&ref_topic=9756175

## 具体的には

グローバルサイトタグのインストールのみで計測される。

https://qiita.com/DriftwoodJP/items/ba9c6c843c5862df670c


## 備考

`gtag('config', ...)` とは

```javascript
gtag('config', '<TARGET_ID>', {<additional_config_info>});
```

https://developers.google.com/tag-platform/gtagjs/reference?hl=ja#config

https://developers.google.com/tag-platform/gtagjs/configure?hl=ja

https://developers.google.com/analytics/devguides/collection/gtagjs/pages?hl=ja

config という名称だったので、なぜ毎回初期化しているのか分からなかった。
「実はgtag.jsでは、gtag('config')関数がページビューを送信しています。」とのことらしい。

https://blog.siteanatomy.com/gtag-js-migration/

「GA4 はデフォルトで History の変更を検知して自動的にページビューを送る機能が備わったため、特別な設定はいらない」

https://zenn.dev/magicmoment/articles/react-ga4-202109 

GoogleAnalytics の Cookie　は、ファーストパーティ Cookie であるとのこと。

https://www.nexal.co.jp/blogs/2061.html
イラストレーターで渦巻きの放射を作る方法

放射の模様を作る方法は色々紹介されていたが、それを渦巻きみたいにする方法が少なかった。

うねりツールを使えば良いとも書いてあったが、曲げ具合とかを調整したりすることが難しそうだったので色々いじっていたら自分なりの方法を見つけたのでメモ

直線を引く

線のタブでプロファイルを太さが変わっているものにする

![スクリーンショット 2022-03-22 21.53.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197731/ffef0567-8fff-6bdb-9311-5cf94b7685c1.png)


これをアピアランスのところのパスの変形>変形


![スクリーンショット 2022-03-22 21.55.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197731/0fae38b6-42d1-eae4-c145-349af84bfd35.png)


コピーを指定することと　コピー基準の場所を選択　角度も選ぶ
![スクリーンショット 2022-03-22 21.55.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197731/e198e644-04f2-39a4-ce79-31813b033395.png)


これで放射模様ができるこれに渦巻きのような効果を追加するには
コピー元の線パスなので、ハンドルを持って変形させればコピーたちも変形される

![スクリーンショット 2022-03-22 21.57.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197731/91357f97-92cf-8f2f-5d68-672a971a540d.png)

![スクリーンショット 2022-03-22 21.58.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197731/dc84260a-808a-a6e8-5880-0eb58db57ee5.png)

できた渦巻き放射がこんな感じ
春から大学生（情報・工学）の方へ～プログラミング入門3～（Java言語ってなあに？）

# 春から大学生（情報・工学）の方へ～プログラミング入門～（Java言語ってなあに？）

# 対象読者
この春から情報・工学系の大学生で以下の２記事を見ていただいた方
https://qiita.com/HaaSAtC/items/490d066bdbec8441a2f6
https://qiita.com/HaaSAtC/items/2687eef10dba08432a19

# Javaの「文法」を学習したい方はこちらへ
いろいろググった中で一番わかりやすくて体系的なサイトです
「オブジェクト指向」までの基礎文法を網羅
「一番かんたんなJava入門」
https://nobuo-create.net/category/java-beginner/

# Java言語とは？
これまで取り上げたC言語・C++言語と同様古めの言語。大学の授業でも取り扱う可能性が大いにあります。これまでのC言語・C++とはガラッと文法が変わります。
（↑のサイトを参照）
上から順番に「変数」や「関数」を書き並べていくものと異なります。（実はC++にもあるのですが）「オブジェクト指向」という新たな考え方が導入され、「クラス」単位での記述となるので、C言語で慣れてきた人にとっては初めは「？？？」だと思います。また、コンパイル（翻訳）後に生成されるファイルもJavaファイルと１対１対応ではありません。
（Javaファイルに書いた「クラス」の数だけ「クラスファイル」が生成されます）
（授業でも習うと思いますが、「オブジェクト指向」はプログラムを効率よく書くための技術です）
また、おそらく大学の授業では扱わないと思いますが、「Scala言語」、「Groovy言語」androidアプリの開発に用いられる「Kotlin言語」、Googleが開発した「Go言語」など派生言語を生み出してそれなりの人気を誇っています。
（近畿大学の授業では今年(2022年)からKotlinを扱うそうですが。いいなあ）
Javaはもともとはサン・マイクロシステムズという会社が開発し、現在はオラクルという会社が開発を引き継いでいます。そのため、授業でJavaの文法についてわからないことがあったらおそらくオラクルのホームページにある解説ページを読み解くことになるでしょう。
https://www.oracle.com/jp/java/technologies/documentation.html
また、C言語で言うgccコマンド(ターミナルにおいてC言語のプログラムを機械語に翻訳する)はjavacコマンドに、生成されたクラスファイル(C言語で言うexe,outファイル)はjavaコマンドで実行することになります。

# 環境構築～Java開発に必要なアプリのキット～
　Javaのプログラムをクラスファイルに変換して実行するには、JDK(Java Development Kit)というキットが必要です。オラクル社などが無料で提供していますが、無料版は2年おきにサポートが切れる仕様になったらしく定期的にアップデートする必要があります。おそらく大学の先生から何らかの指示があるでしょう。
　上記で、ターミナルにおいてJavaをjavacコマンドで変換するとクラスファイル（.class）になると言いましたが、実はScalaやGroovy、KotlinやGo言語も変換するとクラスファイルを生成します。これをJDKに含まれるJava Virtual Machine(JVM)をjavaコマンドによってターミナルで起動して、その中でクラスファイルを実行して結果を得るわけです。
　さて、そんなJDKですが、様々なインストール方法があります。
1, オラクルの公式ホームページからダウンロード・インストールする方法。
2, Red Hat版JDKをインストールする方法。
私はやったことがないのでご自分で調べてください。（Red Hat JDK インストールなど）
3, Eclipse Pleiades(IDE（なんでもセット）のEclipseに様々な便利機能が追加されたものです)でまとめてインストールする（様々なバージョンがあるのでJavaを含んでいるか確認の上インストールすること）
などなど、様々あります。（ほかにもあるかもしれない…）
また、JetBrains社製、Java系言語用のなんでもセット（IDE）IntelliJ IDEA（インテリジェイ・アイディア）はとても便利ですが、残念ながらJDKは含んでいません。別にインストールしてください。

(インストール手順を詳しく見てみよう)
おそらくJDK　インストールなどと検索すれば丁寧に解説されたサイトが出てくることと思いますが、何をやっているのかここでもサクッと解説します。
JDKやPleiadesは公式サイトからzipファイル（圧縮ファイル）でダウンロードし、JDKの場合 PC\\ローカルディスクC\\Program Files に、PleiadesはローカルディスクCに解凍（右クリックで展開）することと思います。ネットからとってきたプログラムをあなたのコンピューターに装備するわけです。
そのあとJDKでは環境変数に"Path"を設定すると思います。
これは何なのでしょうか
英語でPathとは「経路」という意味ですが、コンピューターではファイルの場所を示します。どういう「経路」を通ってたどっていったらそのファイルが見つかるのか、ということですね。JDKをパソコンにインストールしたわけですが、もともとJDKはあなたのパソコンにとって異分子です。一般のユーザーはプログラマー（ITエンジニア）ではないので、Javaの開発ソフトは必要がありません。なので、JDKを用いるという設定にはなっていません。そこで、OSにJDKが大切なアプリであることを教えてあげる必要があるわけです。Windows10なら左下の検索欄から「システム環境変数」と検索し、JDKの入っているフォルダーを「重要なフォルダ」として登録するわけです。これがインストールガイドに出てくる「JAVA_HOME」「Path」の意味です。

# 最後に
読んでいただいてありがとうございました。
まだまだ続きを書くつもりでいますのでよろしくお願いいたします。
内容については不十分な点、不正確な点があるかもしれませんが、それについては学習していくうちに正しい情報にたどり着くと思います。

次回

https://qiita.com/HaaSAtC/items/caf4998744044900e97f
Kotlin KoansでKotlin入門　第１６回：For loop

# はじめに
公式の問題集[「Kotlin Koans」](https://play.kotlinlang.org/koans/overview)を解きながらKotlinを学習します。

過去記事はこちら
- Introduction
  - [第０回：Kotlin Koansについて](https://qiita.com/kosuke1/items/41d192af63485bfc8cb8)
  - [第１回：Simple Functions](https://qiita.com/kosuke1/items/5862a3ece96082a62e67)
  - [第２回：Named arguments](https://qiita.com/kosuke1/items/2af11262852ee41b5da7)
  - [第３回：Default arguments](https://qiita.com/kosuke1/items/16cb8ac780df58dc8054)
  - [第４回：Triple-quoted strings](https://qiita.com/kosuke1/items/52cfeed2c49b0252d40e)
  - [第５回：String templates](https://qiita.com/kosuke1/items/0221bbbc5bc70847be6f)
  - [第６回：Nullable types](https://qiita.com/kosuke1/items/aa96e422c5313b6961bc)
  - [第７回：Nothing type](https://qiita.com/kosuke1/items/1ca0e48820d58c9dfe16)
  - [第８回：Lambdas](https://qiita.com/kosuke1/items/8de74f9491e003127f53)
- Classes
  - [第９回：Data classes](https://qiita.com/kosuke1/items/1be2de1b4406b8d914bf) 
  - [第１０回：Smart casts](https://qiita.com/kosuke1/items/50bdecaa0740eb0e1a17)
  - [第１１回：Sealed classes](https://qiita.com/kosuke1/items/71a4da02fe1e99da5d63)
  - [第１２回：Rename on import](https://qiita.com/kosuke1/items/f11465cc15a94e7589a3)
  - [第１３回：Extension functions](https://qiita.com/kosuke1/items/d4a1da00bc142c297221)
- Conventions
  - [第１４回：Comparison](https://qiita.com/kosuke1/items/e9486d044cae32167f36) 
  - [第１５回：Ranges](https://qiita.com/kosuke1/items/797f049ce5f33b1810c9)


# 問題
[For loop](https://play.kotlinlang.org/koans/Conventions/For%20loop/Task.kt)


DateRangeクラスに```Iterable<MyDate>```を実装して、反復処理できるようにします。DateUtil.kt で定義されている ```MyDate.followingDate()``` 関数を使用します。
次の日付を見つけるロジックを独自に実装する必要はありません。
オブジェクト式は、KotlinではJavaの無名クラスと同じような役割を担っています。

```Kotlin

```

修正前のコード
```Kotlin
class DateRange(val start: MyDate, val end: MyDate)

fun iterateOverDateRange(firstDate: MyDate, secondDate: MyDate, handler: (MyDate) -> Unit) {
    for (date in firstDate..secondDate) {
        handler(date)
    }
}
```


# 問題のポイント
Kotlinの[forループ](https://kotlinlang.org/docs/control-flow.html#for-loops)は、対応するイテレータメンバーや拡張関数があれば、どんなオブジェクトでも反復処理することができます。

# 解答例

```Kotlin
class DateRange(val start: MyDate, val end: MyDate):Iterable<MyDate> {
    override fun iterator(): Iterator<MyDate> {
        return object : Iterator<MyDate> {
            var current: MyDate = start

            override fun next(): MyDate {
                if (!hasNext()) throw NoSuchElementException()
                val result = current
                current = current.followingDate()
                return result
            }

            override fun hasNext(): Boolean = current <= end
        }
    }
}
    

fun iterateOverDateRange(firstDate: MyDate, secondDate: MyDate, handler: (MyDate) -> Unit) {
    for (date in firstDate..secondDate) {
        handler(date)
    }
}
```
UbuntuPCでキーボードレイアウトがUSから戻らなくて困った話

# 現象
表題の通り、UbuntuPC(20.04)のキーボード設定がUS配列から戻らなくなってしまった。
# やったこと
## mozc-ibusのキーボード設定の確認
1. 画面右上の「設定」からレイアウト変更  
2. /usr/share/ibus/component/mozc.xmlの編集  
3. 適当なエディタで設定ファイルを編集する。
```
$ sudo nano /usr/share/ibus/component/mozc.xml 
```
デフォルトだとlayoutタグが以下のようになっているので、defaultをjpに変更する。
```
<layout>default</layout>　#<layout>jp</layout>に変更	
```
結果→変化なし

## mozc-ibusの再インストール
```
$ sudo apt-get remove ibus-mozc
$ sudo apt-get install  ibus-mozc
```
結果→変化なし

## sudo dpkg-reconfigure keyboard-configuration
キーボードレイアウト設定のウィザードを開いて設定する。
```
$ sudo dpkg-reconfigure keyboard-configuration
Generic 105-key (Intel) PC > Japanese > Japanese > The default for the keyboard layout > No compose keyを順に選択
```
結果→変化なし

## Xorgの設定編集(解決)
Xorgのキーボードレイアウト設定を確認しようとしたところ、設定ファイル自体がなかったので、[Xorg でのキーボード設定](https://wiki.archlinux.jp/index.php/Xorg_%E3%81%A7%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A#.E3.82.AD.E3.83.BC.E3.83.9C.E3.83.BC.E3.83.89.E8.A8.AD.E5.AE.9A.E3.81.AE.E8.A1.A8.E7.A4.BA:title)を参考に、/etc/X11/xorg.conf.d/00-keyboard.confを作成・編集した。
```
$ sudo nano /etc/X11/xorg.conf.d/00-keyboard.conf
```
```/etc/X11/xorg.conf.d/00-keyboard.conf
Section "InputClass"
        Identifier "system-keyboard"
        MatchIsKeyboard "on"
        Option "XkbLayout" "jp,us"
        Option "XkbModel" "pc104"
        Option "XkbVariant" ",dvorak"
        Option "XkbOptions" "grp:alt_shift_toggle"
EndSection
```

この後、再起動するとキーボードレイアウトが日本語仕様に変更されていた。
新卒クラウドエンジニアの1年間を振り返ってみる③

# 昨日の記事の続きです
https://qiita.com/cakofei/items/5859f9ffafa18a1b2046

# 1、2月(覚醒期)
年が明けて2022年、ようやく覚醒期を迎えることが出来ました。

実を言うと2021年はプライベートの時間にJavaScriptやRubyなどのプログラミング言語の学習も並行でしていたのですが、なかなか継続的に続かず週に合計4~5時間がようやくという感じでした。結果として勉強は中途半端になりプログラミングスキルは身に付かず、クラウド知識も身に付くのが遅れてしまいました。

何故クラウドエンジニアなのにプログラミング言語の勉強をしていたかと言うと、自分もサービス開発をしたい思いがあったからです。

ですが時間は有限で、したいことを全部するにはあまりにも時間が足りません。
なので2022年の目標は「やるべきこと以上にやらないことを決断すること」としました。

そこで一旦プログラミング言語を学習するのは辞めて、1~2月はAWSの勉強だけに絞ることにしました。

その結果、以前とは比べ物にならないくらいAWSを理解し始め、少しずつですが自信が漲ってきました。

仕事にもどんどん勢いが出てきて、積極的にプロジェクトの改善案等を提案をするようになり、最終的にアカウント運用ルールや移行先の設計・構築もほとんど1人で完成させることが出来ました。

この2ヶ月ほどで色んな環境の設計・構築を行い、苦手だったネットワークの知識(エンドポイントやNATゲートウェイ、ドメイン周りや疎通確認など)やCI/CDも理解できるようになりました。

https://www.isoroot.jp/blog/4559/

そんなこんなで2月末に案件が一段落し、完了まで持って行けたことは大きな自信に繋がりました。

# 3月(現在)
現在は4月から参画する案件の学習をしており、以下のスキルに携われるので非常に楽しみにしています。
・GCP
・Docker、Kubernetes
・CI/CD
・Terraform

特にGCPを経験することで各クラウドサービスの比較が出来るようになり、より一層クラウドの理解が進むのではないかと思っています。

Terraformも少し前に勉強を始めてブログを書いたところ、すぐに案件で使えることになったので協力していて頂いた上司の方には感謝しきれません。

https://www.isoroot.jp/blog/4584/

また約半年間の内定者研修も無事に終えました。

下半期も業務やプライベートが大変だった中で後輩の教育を全う出来たことは嬉しく、彼らの入社を非常に楽しみにしています。

内定者研修では他の社員の方と研修の改善点を話し合ったり、積極的にサブリーダー的働きをしたりと「チームの為にできること」を常に考えましたし、後輩の教育という目的に対して自分がどのような行動をすればいいのかを学ぶことが出来ました。


# 1年間を振り返って
人間の成長曲線は直線ではないことは多くの人がご存知だと思います。
![20190717220435.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2320311/fdb94f44-926d-16eb-3995-11e5f64f3f0c.png)

ですがこの事実を知っていても、いざ自分がなかなか成長しないと不安と焦りでしんどくなります。それでも是非もがいて頂きたいです。

偉そうなことを言いつつ、僕自身エンジニア歴1年でこれから何度も壁にぶつかると思いますが、この一年の経験を糧に乗り越えていきたいです。

話は変わりますが、この一年はプライベートで勉強を頑張りつつもコロナに罹ったり、ポーカーにハマったり、仲の良い人と旅行に行ったりと結構充実していましたが、出来なかったことも多いです。

そこで社会人2年目で挑戦したいことを以下に記します。
・本格的な後輩の教育経験。教えることで自分の中で言語化できなかったことが理解できるようになるし、個人ではなくチームを強化する力を養える。
・アウトプットの量を増やす。1年目は主にブログの執筆にとどまったが、2年目からは外部で勉強会を主催で開き、AWSを中心にLTやハンズオンをしてみたい。
・案件を通じてDevOpsエンジニアのスキルを身につける(ポートフォリオ作成も出来ればいいなあ)。
・自分が将来的に何をやりたいか、何が幸せかを探す。

またこの一年で学んだことを以下に記します。
・プライベートでの勉強は業務に関することを最優先。業務にあまり関係ないことは多少勉強しても身につきにくい。
・勉強を頑張りつつも、プライベートの思い出作りも妥協しない。
・出来ることからチームメンバーに与えられるものがないか意識する。Giverになることでチームへの帰属意識が高まり、貢献している感覚がメンタルの安定をもたらす。

以上です、もし社会人1年目で大変なことがあったらこの記事を思い出していただけると幸いです。

# 2年目編

https://qiita.com/cakofei/items/626a8775a7b76925d217
【Python】SQLite3の使用方法

# SQLite3をPythonで操作する
現在Django、Flaskなどのフレームワークを使用せずに、
簡単なWebアプリケーション（Todo管理アプリ）を開発してます。
DBを何にするか（何が使用できるか）調査したところ、標準でSQLite３が
使用できるとのことなので、
Pythonのsqlite3を使用してPythonのコードでsqlite3を操作する方法を記載します。
（初投稿のため優しく見守れっていただけると嬉しいです）

## 参考ドキュメント
python公式ドキュメント

https://docs.python.org/ja/3/library/sqlite3.html

## Pythonバージョン
Pythonバージョンは以下で確認できる。
```
python -V
```
Python 3.8.0

## 基本的な記載方法
基本的には以下のように記載方法になる。
```python
import sqlite3
dbname = 'example.db'

conn = sqlite3.connect(dbname)
cur = conn.cursor()
cur.execute(sqlクエリ)
conn.commit()
conn.close()
```
```import sqlite3```でsqlite3をインポートする
```connect(dbname)```で使用するDBファイルに接続する（.dbファイルが存在しない場合、新規で作成される。）
```cursor()```でオブジェクト化しexecuteが実行できるようにする。
```execute(sqlクエリ)```でsqlクエリを実行できます。
DBに変更がある場合に、commitすることで更新できる。
```close()```でDBとの接続を閉じる

## テーブル作成
```python:create_table.py
import sqlite3
dbname = 'example.db'
conn = sqlite3.connect(dbname)
cur = conn.cursor()
cur.execute('CREATE TABLE examples(id INTEGER PRIMARY KEY AUTOINCREMENT, name STRING, price INTEGER)')
conn.close()
```
create文でテーブルを作成する
id INTEGER PRIMARY KEY　でidを指定しなくても値がn+1で作成される（最終が3の場合4が入る）
AUTOINCREMENTを入れると最終が3のデータを削除後、データを登録されると3ではなく、4が入る。

## データ登録
```python:innsert.py
import sqlite3
dbname = 'example.db'
conn = sqlite3.connect(dbname)
cur = conn.cursor()
cur.execute('INSERT INTO examples values(1, "りんご",100)')
 # コミットしないと反映されないため、登録、変更処理をした際はcommit()する
conn.commit()
conn.close()
```

## データ取得
```python:select.py
import sqlite3
dbname = 'example.db'
conn = sqlite3.connect(dbname)
cur = conn.cursor()
cur.execute('SELECT * FROM examples')
conn.close()
```

## データ更新
```python:update.py
import sqlite3
dbname = 'example.db'
conn = sqlite3.connect(dbname)
cur = conn.cursor()
cur.execute('UPDATE examples SET price = 260 WHERE id = "3"')
conn.commit()
conn.close()
```

## データ削除
```python:delete.py
import sqlite3
dbname = 'example.db'
conn = sqlite3.connect(dbname)
cur = conn.cursor()
cur.execute('DELETE FROM examples WHERE id = "2"')
conn.commit()
conn.close()
```
POSIXでデータベース管理システムが標準化の対象外と明記されている理由（考察）

## DBMS が対象外と明記されているのが不思議だった

POSIX ではデータベース管理システム (DBMS) のインターフェースが標準化の対象外であると明記されています。

https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap01.html

> The following areas are outside of the scope of POSIX.1-2017:
> 　
> - Graphics interfaces
> - Database management system interfaces
> - Record I/O considerations
> - Object or binary code portability
> - System configuration and resource availability

私はこれが明確に書かれていることが不思議でした。例えばオフィスソフトは言うまでもなく POSIX の対象外です。なぜなら POSIX は OS のインターフェースを定義したものであり、オフィスソフトは明らかに OS のインターフェースではないからです。当たり前すぎることなのでわざわざ POSIX の対象外であるとは書いていません。ならば同じ理由でデータベースも明らかに OS のインターフェースではないのだから書く必要がないのではないのか？なぜ自明なことをわざわざ書いているのか？というのが不思議だと思った理由です。

グラフィカルインターフェースに関しては OS の機能と呼べるものなので POSIX の対象外と書く必要はあるでしょう。オブジェクトやバイナリコードの移植性でないということも、バイナリの実行ファイルが別に OS で動くのか？と思ってしまうから書く必要があります。システム構成とリソースの可用性についても OS の機能なので対象外とするならば明記する必要があります。

しかしデータベース管理システムのインターフェースが明確に書かれている理由、そしてもう一つ Record I/O とは何なのか？というのがこれを読んだ時の私の感想でした。

## メインフレームではデータベースは OS の機能だった

別件で Unix 誕生よりも前の OS について調べている時にその理由に気づきました。知っている人にとっては当然のことなのでしょうが、メインフレームにはファイルというものがなく（簡易的な）データベースに相当する機能は OS の機能の一つだったのです。そして Record I/O もどうやらファイルの代わりに使われていたものであるようです（参考 [RECORD I/O](https://www.ibm.com/docs/ja/zos/2.2.0?topic=output-record-io)）。昔は OS の機能であるように思われていたのであれば、対象外と明記する理由はわかります。

これに気づけば後はメインフレームのファイルシステムについて調べれば私の知識欲は満たされます。

https://zenn.dev/koduki/articles/bc0e5acb3d6656

からざっくりと引用させていただきました。

> ファイル編成法
> レコードフォーマットとは別にファイル編成法というものがあります。かつては基本情報技術者試験に良く出てたんですが、最近はさすがに出ないかな？ 当時、何のことを言ってるのかさっぱり分からなくて困惑したのを今でも思い出します。何しろメインフレーム特有の概念なのでWindowsとかLinuxしか触ってないと分からない... そんなファイル編成法を紹介しましょう。

まあ、こういうことなんですよね。私の知らないメインフレーム特有の話につながってるので理解できなかったと。

> | 名称 | 概要 |
> | - | - |
> | 区分編成ファイル(PDS) | ファイルシステムのところで説明したけど乱暴に言えばフォルダ。この中に複数のデータセットを入れる事が出来る |
> | 順編成ファイル(PS) | レコードをシーケンシャルに読み書きする。ふつうのサーバでのファイルの感覚に最も近い |
> | 仮想記憶編成ファイル(VSAM) | キーアクセスおよびインデックスアクセスが出来る。実質DB |
>
> PDSはいったんフォルダとして理解して問題無いと思います。PSファイルは普通のファイルに最も近いですね。シーケンシャルに読み書きを行う。面白いのがVSAMで、これはKVSみたいな簡易のDBですね。インデックスキーでアクセスする事で高速なランダムアクセスを可能にしています。同じ 「ファイル」 くくりで見てると大きく誤解しがちだと思います。

かなり昔に私も勉強だけはしたはずなんですが名前だけ覚えても忘れますし知識としてつながりません。

## Unix 以降 DBMS はアプリケーションの領域になった

メインフレームを基準として考えると Unix では DBMSに近い機能は OS の機能から削除されました。つまりこれは OS の機能だけでデータ管理をするのが大変だということです。

メインフレームのデータセットと Unix 移行のファイルには以下のような違いがあります。

> もう一つ、大きな特徴としてはファイルの取り扱いです。ふつうのサーバのファイルシステムはファイルを単なるバイトストリームとして扱い、フォーマット等中に何が書いてあるかはアプリケーションの責任です。一方、メインフレームではファイル---データセットと呼ばれますが、をバイトストリームでは無くレコード単位(行単位)で取り扱います。つまりフォーマットの責務がOSにあります。
> 
> バイトストリーム方式の場合は、アプリで自由にフォーマットを決めれるのでフレキシブルな反面、対象のアプリケーションが分からなければ開くことが出来ません。一方で、OSが責務を持つレコード方式の場合はどのアプリで書いたファイルもOSの標準形式として読むことが出来ます。これはメリットデメリットがある話ですが業務アプリにはなかなか便利な特徴です。

ただのファイルでデータ管理をするには、特殊なファイルフォーマットにするしかありません。テキストファイルベースにしようと思っても検索速度を上げるためのインデックスファイルやランダムアクセスのための仕組みが必要になってくるでしょう。そうなるとアプリ（言語）毎に特殊なファイルフォーマットに対応しなければならないため、メインフレームのようにどのアプリで書いてもデータを扱うことができません。

そこで必要になるのが DBMS です。メインフレーム時代の OS に代わる役割をしているのが DBMS であり、DBMS へ問い合わせるだけでアプリ（言語）に依存することなくデータにアクセスすることができます。もし高度なデータ管理を必要とするのであれば DBMS を導入することは必須であると言えます。メインフレーム時代は OS の機能だけで出来たのでしょうが Unix 時代以降はそうではありません。
# JavaScriptで「世界時計」Webアプリケーションを作ってみた

私がプログラミングの勉強を始めて2年くらい経ちましたが、昔初めて作ったWebアプリケーションのファイルが残っていたので、これについて記事にしていこうと思います。
#### 「World Clock Maker」

今回紹介するものは、任意の国のアナログ時計とデジタル時計を一括表示するwebアプリケーションです。イメージは以下のような感じです。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1726209/6b6f7773-4e63-1240-14d5-867c230102e9.gif'>
Demoページは以下のリンクからどうぞ!
[「World Clock Maker」- Display World Date & Time ](http://kotabook.html.xdomain.jp)

#### 仕様
使い方はDemoページに記されていますが、ここにも簡単に記しておきます。

1. Addボタンを押してタイムゾーンを選択する。
2. 選択した後Addボタンをクリックすることで、その地域の日付、時刻を表示される。
3. 削除する場合はDelete Allボタンをクリックする。

これだけなので、シンプルな仕組みだと思います。

#### 作ったきっかけ

きっかけはiPhoneにある「世界時計」をデジタルとアナログ両方の形式で表されるものを作ろうと思ったことです。これのおかげで、JavaScriptのいい勉強になったのではないかと思います。

#### 作った時計の問題点

現状一つの問題があって、それは表示時刻が少しずつ遅延してしまうことです。
表示時刻の更新は1秒ごとにやっていますが、その際処理に若干時間がかかってしまいます。そのため、以下の図のようにわずかな遅延が積み重なってしまい正しい時間表示ができなくなっております。現在その解決策は検討できておりません。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1726209/4a1e9939-2388-35d0-c278-3f194c007b90.png)
#### コード
特にアップロードしませんが、ブラウザの「開発ツール」を開けば全て見れます。
JavaScript,HTML,CSSの3つを使って作っているためです。
興味のある方はそちらをどうぞ。
※初心者が作成したものなので、コードの汚さはご了承いただければと思います(笑)

#### 注意事項
Demoページで表示可能な時計の個数は無制限にしておりますが、あまりにも多く表示させるとPCのパフォーマンスに影響が出る場合がありますので、ご注意ください。

#### 参考
アナログ時計の作り方は、YouTubeの["Online Tutorials"](https://www.youtube.com/channel/UCbwXnUipZsLfUckBPsC7Jog)さんの[こちら](https://youtu.be/weZFfrjF-k4)の動画を参考にさせてもらいました。

以上となります。
【Ruby】Procオブジェクトの呼び出し

``` ruby
def foo(n)
  n ** n
end

foo = Proc.new { |n|
  n * 4
}

puts foo[2] * 2
```

この答えは ``16`` になる。
Procを呼び出すときには、[]もしくは.callで呼び出すことができるらしい。

そのため、この問題では``puts foo[2] * 2``としているため、
```
foo = Proc.new { |n|
  n * 4
}
```
この処理が走るということらしい。

ちなみに、``puts foo 2 * 2``であれば、
``` ruby
def foo(n)
  n ** n
end
```
この処理が走ることになるらしい。
あっているかわからないので、詳しい方コメントいただけたら嬉しいです。
バンドル・コンパイルについて

## はじめに
これまで、なんとなくにしてきたバンドル、コンパイルについて理解したいと思い記事を書きます。

## モジュール化
バンドルについて理解する前に、モジュールについて知る必要があります。
**モジュール**とは機能ごとに分割されたファイルのこと。
変数や関数が書かれたプログラムのことで、基本的には1ファイルのことをモジュールと呼びます。

元々JavaScriptはブラウザ上で動かすために生まれた言語のため、モジュール定義や読み込みがありませんでした。
モジュール化して開発を効率的にしたいよねーということで、誕生したのがCommonJSです。
## CommonJS (require構文）

```hogehoge.js
// エクスポート
module.exports = { hoge }

// インポート
const hoge = require('hoge')
```

JavaScriptの仕様を定めるプロジェクトであるCommonJSでサポートされている構文。
このCommonJSは、あくまでサーバーサイド上でのJavaScript仕様なので、ブラウザ上で動かすには、後述するwebpackなどで依存関係を解決する必要があります。


## ESmodules (import/export構文）
```hogehoge.js
// エクスポート
export const hoge = hogehoge

// インポート
import { hoge } from '.インポート先のパス'

```
ES2015(ES6)から言語仕様としてモジュールの仕組みが導入されました。
ただES2015に対応していないブラウザ（IEなど)で動かすには、
後述するBabelというコンパイルツールを使ってrequire構文に変換した後、webpackなどで依存関係を解決してあげる必要があります。

# バンドル
上記のようなモジュール化したファイルの依存関係を解決して１ファイルに変換することです。
このバンドルするためのツールで広く使われているのがwebpackです。

## webpack
webpackとはモジュールバンドラーツールです。
webpackを使うわなければ以下のように、記述が多くなりパフォーマンスの低下につながり、読み込む順番も気をつける必要があります。
```index.html
//バンドラーを使わない場合
<script src="a.js"></script>
<script src="b.js"></script>
<script src="c.js"></script>
・　　・　　・

//バンドラーを使う場合
<script src="bundle.js"></script>
```
<img width="600px" alt="webpackの図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1973408/add6f5ef-e362-4d44-fc58-9a15d3086fa1.png">

[webpack公式](https://webpack.js.org/)より参照
このように依存関係のあるjsファイル、cssファイル、アセットの依存関係を解消し１つのファイルにまとめます。

**Code Splitting**
webpackにはCode Splittingという機能があります。
バンドルによって１つにまとめられたファイルはサイズが大きくなることがあり、ローディングに時間がかかってしまいます。
これを解消するのがCode Splittingです
コードをchunkという単位で複数に分割して、非同期的にローディングするため最初のロード時間を短くできます。

# コンパイル
ES2015(ES6)ではモジュールの仕組みの導入以外にも
let,const,Promise,アロー関数,スプレッド構文など様々な仕様が追加されました。
しかしこれらの仕様に対応していないブラウザはまだまだあります。
そのため、ES2015を従来の環境でも動く古いJavaScriptに変換する必要があります。
この変換をコンパイルと言います。
## Babel
BabelはES2015で書かれたJavaScriptをES2015以前のJavaScriptに変換するコンパイラーです。

# 最後に
簡単にではありますが、バンドル・コンパイルについてまとめてみました。
まだまだ、勉強中なので間違っていることや補足があればコメントください！！！
部分和問題の3つのアプローチをPythonを用いて実装する

## 問題概要

n 個の正の整数 a[0],a[1],…,a[n−1] と正の整数 S が与えられる。これらの整数から何個かの整数を選んで総和が S になるようにすることが可能か判定せよ。可能ならば "Yes" と出力し、不可能ならば "No" と出力せよ。

【制約】・1≤n≤10・1≤a[i]≤1000・1≤S≤10000

【数値例】
1)　n=3　a=(7,5,3)　S=10　答え: Yes (7 と 3 を選べばよいです)

2)　n = 2　a=(9,7)　S=6　答え: No

問題概要はけんちょん様の[こちらの記事](https://qiita.com/drken/items/a5e6fe22863b7992efdb#%E5%95%8F%E9%A1%8C-3%E9%83%A8%E5%88%86%E5%92%8C%E5%95%8F%E9%A1%8C)から抜粋させていただいています

## iterative(反復的)なアプローチ

```python
from sys import stdin

N, S = map(int, stdin.readline().split())
*A, = map(int, stdin.readline().split())

for i in range(2**N):
    temp_sum = 0
    for j in range(N):
        if ((i >> j) & 1):
            temp_sum += A[j]
    if temp_sum == S:
        print("Yes")
        break
else:
    print("No")
```

n=3　a=(7,5,3)　S=10の時を具体例を考えてみます。
2**3 = 8 であるので、i は 0~7 の間で探索されます。

[全探索した際の表 (1)](https://www.notion.so/d5fb75c1bd0a4dbaafb6234f416dae9f)

ちなみに、以下の内側のfor文については、右シフト演算を繰り返し、右端の数が 1 であればその数を選ぶ、という操作をおこなっています。 

N = 3 であるので、j は 0~2 をループします。 
j が 0 の時、一番右の数をチェック、
j が 1 の時、真ん中の数をチェック、
j が 2 の時、一番左の数をチェックしています。

```python
for j in range(N):
     if ((i >> j) & 1):
         temp_sum += A[j]
```

## recursive(再帰的)なアプローチ

```python
from sys import stdin

N, S = map(int, stdin.readline().split())
*A, = map(int, stdin.readline().split())

flg = False

def dfs(position, temp_sum):
    global flg

    if position == N-1:
        if temp_sum == S or temp_sum+A[position] == S:
            flg = True
        return

    # 選ぶ場合
    dfs(position+1, temp_sum+A[position])
    # 選ばない場合
    dfs(position+1, temp_sum)

dfs(0, 0)

print("Yes" if flg else "No")
```

その数を「選ぶ」or「選ばない」を再帰的に繰り返していく解法です。
終了の条件として、postionがN-1,つまり、最後の数を選ぶかどうかに達した際に目標であるSに一致するかどうかを判定しています

## Dynamic Programming(動的計画法)によるアプローチ

```python
from sys import stdin

N, S = map(int, stdin.readline().split())
*A, = map(int, stdin.readline().split())

dp = [[True] + [False]*S for _ in range(N)]

for i in range(N):
    for j in range(S+1):
        if j >= A[i]:
            dp[i][j] = dp[i-1][j] or dp[i-1][j-A[i]]
        else:
            dp[i][j] = dp[i-1][j]

print("Yes" if dp[-1][-1] else "No")
```

n=3　a=(3, 5, 7)　S=10の時をdpの様子を以下に示します

```
  0    1     2     3    4     5     6     7     8     9     10
3 True False False True False False False False False False False
5 True False False True False True  False False True  False False
7 True False False True False True  False True  True  False True
```

- dp[0],つまり最初の行は a = (3) の選び方によってとりえる値をしめしています。
3を選ぶか、何も選ばないかの2択なので、0, 3のみが`True`となっています

- dp[1],つまり、真ん中の行では、a =(3, 5) の選び方によってとりえる値をしめしています。
3と5を選んだ場合の8,57のみを選んだ場合の5に`True`が追加されていることがわかります。

- dp[2], つまり、最後の行が、0 ~ 10 までで a = (3, 5, 7) の選び方によってとりえる値をしめしています。
ここの例では S = 3, 5, 7, 8, 10 がaの選び方によって取りえる値だということがわかります。


## 最後に
至らぬ点があれば気軽にご指摘お願いします。
一つの問題に対して、一つ解法を実装すると満足しがちですが、あえて複数の解法を考えることは、初心者の自分にとってはとても有効でした!
yarnをインストール

## 環境
Ubuntu20.4

## 手順
yarnの公式サイトを見ると、npmを使ってインストールする方法しか紹介されていないようです。
https://classic.yarnpkg.com/en/docs/install#windows-stable

yarnをインストールするだけの目的でnpmをインストールするのはちょっと・・・といった場合は、aptでインストールすることもできます。
ただし、aptを使った場合、Ubuntuの公式リポジトリから取ってくるのではなく、サードパーティーのリポジトリから取得してくることになります。
残念なことに、yarnの公式サイトにaptでインストールする手順は記載されていません。

#### インストール手順（参考サイト）
- https://yanor.net/wiki/?Node.js/yarn/yarn%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB+-+Ubuntu
- https://riyoo.biz/articles/yarn-install

yarnインストール用の公開鍵をインストールするところから始まります。公開鍵の一覧を表示して、現状を確認しておきます。
```
$apt-key list
```

aptがサードパーティーのサーバーにアクセスする時の認証で利用する、公開鍵を取得します。
```
$curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
OK
```

公開鍵の一覧を表示して、確かに、１件追加されていることを確認します。
```
$apt-key list
```

sources.list.d配下に、yarn.listを作成します。yarn.listはデフォルトでは存在していないため、新規で作成することになります。teeコマンドはファイルと標準出力の両方に書きだすコマンドです。まずは、yarn.listが確かに存在していないことを確認します。
```
$ls -la /etc/apt/sources.list.d
$echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
```

yarn.listが正しく作成されたことを確認します。
```
$ls -la /etc/apt/sources.list.d
$cat /etc/apt/sources.list.d/yarn.list
```

インストール準備ができたので、実際にインストールを行います。--no-install-recommendsオプションを付けると、必須でないパッケージのインストールを省くことができます。オプションをつけないでyarnをインストールすると、Node.jsも一緒にインストールされることになります。Node.jsはnvmでインストールしているので、aptではインストールしたくないといった場合は、オプションをつける必要があります。
```
$sudo apt update
$sudo apt install --no-install-recommends yarn
```

インストールされていることを確認します。
```
$which yarn
/usr/bin/yarn

$yarn --version
1.22.18
```
テーブルの再構築後に ORA-01502 エラー発生

## はじめに
処理遅延の対策としてテーブルの断片化が怪しいと目星を付け、テーブル解消化のために「ALTER TABLE MOVE」コマンドを実行したら、その後にエラーが発生したおはなし。

参考：表が断片化したときの対処方法 / 表の再編成方法
https://cosol.jp/knowledge/knowledge_post/d3_maintenance_table/

## エラー内容
```
ORA-01502: 索引'表領域名.インデックス名'またはそのパーティションが使用不可の状態です。
```

## 原因と対策
「ALTER TABLE MOVE」コマンドにてテーブルを再構築すると対象テーブルのインデックスが使用不可（UNUSABLE）になってしまうのです(^L^)

```sql:インデックス状態確認用SQL
SELECT INDEX_NAME, STATUS FROM USER_INDEXES
WHERE TABLE_NAME = 'テーブル名'
ORDER BY INDEX_NAME
```
私のケースではインデックスが使用不可の状態で該当テーブルへの登録（INSERT）が走り、PKが使用出来ず冒頭のエラーにつながってしまいました。
対策として該当のインデックスを再構築することで事なきを得ましたわん。

```sql:インデックス再構築SQL
ALTER INDEX インデックス名 REBUILD;
```
ビジネスとアカデミアに於ける評価基準の違いと先行研究レビューの位置付け

<h2>現状</h2>
2021年7月からイギリスの大学院でデータ・エンジニアリングの修士号を履修中です。
今月上旬、無事、修士論文の提出を終えました。未消化単元の受講を終え次第、職探しを始めようと考えています。論文を書く過程で教わったビジネスとアカデミアに於ける評価基準の違いと先行研究レビューの位置付けを紹介します。今後、社会人大学院への進学を検討している方の一助になれば幸いです。

<h2>ビジネスとアカデミアの異なる評価基準</h2>
そもそもビジネスとアカデミアでは評価基準が異なります。
<br>
例えるなら野球とサッカーくらい、ゲームのルールに違いがあります。
<br>
<br>
一般的にビジネスでは売上・利益・効率等、企業経営への貢献が重視されるのに対し、アカデミアでは過去の研究にはない新規性が求められます。
<br>
<br>
では新規的な研究や論文とは何でしょうか？
<br>
研究に新規性があるかどうかを判断する為に先行研究レビューが存在します。

<h2>先行研究レビューの位置付け</h2>
先行研究レビューとは、自分の研究テーマに関する過去の論文を読み(漁り)、整理・体系化する作業を指します。側から見ている限り、この作業は学生に人気のない、面倒な作業として認知されているようです。
<br>
<br>
先行研究レビューは「見て見て！僕・私、ちゃんと過去の論文読んだよ！」と言うアピール材料の為だけに存在するのではありません。本来の目的は、過去に出版された論文から、まだ研究がされていない領域や差分を探すことにあります。
<br>
<br>
この為、「僕・私、ちゃんと読みましたよ」アピールとなる要約に加え、過去論文を俯瞰的に眺め、共通点や相違点を洗い出す作業が必要になります。過去論文の比較・精査を経て始めて、研究・論文がアカデミアで評価に値する新規性を持つかどうかが判断されます。
<br>
<br>
研究・論文を審査する側の視点に立った場合、提出者の主張・論旨がどれくらいの量の過去研究に基づいているかを定量的に判断するバロメーターにもなります。

<h4>後書き</h4>
執筆後、コミュニティガイドラインを読み返し、Qiitaでアップする記事ではないかもと思い投稿を一度、見送りました。改めてググってみたところ、社会人大学院に関する記事も散見されたのでアップしました。
GoogleAppsScriptでWebアプリケーションを公開する

# 概要
Google Apps Script（以降、GASと呼ぶ）を用いて、Webアプリケーションを作成を行ったので、その手順を残す。
# 実際に作ってみよう
GASで新規プロジェクトを作成し、公開用にindex.htmlを作成する。
```
### index.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    GoogleAppsScriptでWebアプリケーションを公開する
  </body>
</html>
```
次にWebアプリケーションを作成するための機能を備えるためにdoGet()メソッドを作成します。
```
### コード.gs
function doGet() {
  var html = HtmlService.createTemplateFromFile('index');
  return html.evaluate().setXFrameOptionsMode(HtmlService.XFrameOptionsMode.DEFAULT);
}
```
ここでの `setXFrameOptionsMode`では、クリックジャッキング防止を制御するページのX-Frame-Optionsヘッダーの状態を設定するためのmodeを設定しています。

この後は、[公開]>[ウェブアプリケーションとして導入]を選択肢、デプロイ設定を行えば完了です。
![スクリーンショット 2022-03-22 20.47.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253785/d505a51c-c685-07ca-b7e1-ae23a74424a9.png)
![スクリーンショット 2022-03-22 20.47.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253785/bd9f32f2-c2d2-2759-7735-92a4aaae0b8e.png)

# 公開
 ![スクリーンショット 2022-03-22 20.53.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253785/68711896-6b0a-fddf-78fb-e194e68b3be8.png)

# まとめ
投稿したWebアプリケーションはつまらない内容になっていますが、この後、Googleカレンダーから会議室予約の状況を取得し、jsでいい感じに整えるなどしました。
GASを利用していることもありGoogleサービスとの親和性が高く、容易にカレンダーデータの取得ができ便利だと思います。

#参考
・[setXFrameOptionsMode](https://developers.google.com/apps-script/reference/html/x-frame-options-mode)
・[GASドキュメント：Web Apps](https://developers.google.com/apps-script/guides/web)
・[GASドキュメント：calendar-app](https://developers.google.com/apps-script/reference/calendar/calendar-app)