OmniAICreator/Qiita-1.07M huggingface dataset:
Chromeのハードウェアアクセラレーションの不具合がいつの間にか直ってた話

# はじめに

この記事は「[リアズ Advent Calendar 2021](https://adventar.org/calendars/6346)」の22日目の記事です。

皆さんご無沙汰しています。リアズフロントエンジニアのよしだです。
昨年の記事からもう丸々1年が経過してしまいました。
昨年に続き、今回もこの１年の中で印象に残った事をお話ししようかなと思います。

# 問題の発生
・弊社では現在、声に主体を置いたライブチャットとして「[萌えチャット]
(https://reas.jp/service/moechat/)」
と言うサービスを展開しています。
昨年12月末のフラッシュサービスの終了に伴い、本サービスもHTML配信に対応するように変更を行いました。しかし、サービスをHTML版に切り替えて間も無く、とある問題が発生しました。
会員側で表示される映像が真っ白の表示になり何も表示されなかったのです。
写真は当時を再現したイメージですが、このような状況になってしまいました。

![スクリーンショット 2021-12-22 15.58.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/946964/2651da2b-c2ed-7e7b-0a8f-c72389c0921f.png)

原因を探るとどうやらChromeの機能にあるハードウェアアクセラレーション(以下HWA)をONにした場合に発生する現象だと言うことが判明しました。一旦お客様にはHWAをONにしないように通知しました。

# ハードウェアアクセラレーションとは
CPUで処理をしている映像や画像の描写処理を、GPUに担当してもらい処理をしてもらうと言うシステムになります。
[ハードウェアアクセラレーション](https://www.weblio.jp/content/%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A2%E3%82%AF%E3%82%BB%E3%83%A9%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3#:~:text=%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AB%E3%81%8A%E3%81%84%E3%81%A6%E3%80%81%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2,%E5%A4%A7%E3%81%8D%E3%81%84%E3%80%81%E3%81%AA%E3%81%A9%E3%81%A8%E3%81%84%E3%81%A3%E3%81%9F%E5%95%8F%E9%A1%8C%E3%81%8C)
CPUにかかってた負荷が軽減されるので一見いい機能に見えます。しかし、ハードウェアアクセラレーションについて検索すると「GPU未搭載のパソコンでHWAをオンにすると不具合が起きる」と言う記事も見受けられました。ところが、不具合が起きるとだけ書かれていて具体的な原因まで記載された記事はありませんでした。
そこで本件に関してとある仮説が浮かびました。それは、
『CPU内臓グラフィックを持つパソコンでHWAを実行した場合、内臓グラフィックに負荷がかかるので余計にCPUの処理が重くなってしまうのではないか』と言うものです。

# 原因の調査
・HWAが原因であることは判明しました。
そこでハードウェアアクセラレーションをONの状態とOFFの状態とでPCのパフォーマンスに変化はないかチェックをしてみました。

■調査に用いた機器
調査用PC : MacBook Pro (13-inch, 2019, Two Thunderbolt 3 ports
→CPU : Intel Core i5-8257U
→GPU : Intel Iris Plus Graphics 645

■調査内容
・HWAをONの状態とOFFの状態それぞれで萌えチャットの配信を30分間行なう

■調査結果
・HWAOFF → 平均CPU使用率20%、GPU使用率10%位
![スクリーンショット 2021-12-22 14.51.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/946964/c21cb2c9-661a-8194-e17d-a06600cc7887.png)

・HWAON → 平均CPU使用率20%、GPU使用率10%位
![スクリーンショット 2021-12-22 16.17.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/946964/a5c9fa3d-050a-035a-b3fe-160593282c0e.png)

……、あれ？何故かHWAをONにしても問題なく配信ができてしまっている。
今年の10月位まではHWAをONにすると上記のような真っ白い表示になったのですが。。。
結局2021年12月現在ではHWAをONにしても配信が真っ白な表示になることなく正常に配信できているみたいでした。

[Chromeのリリースノート](https://support.google.com/chrome/a/answer/7679408#94OS&zippy=%2Cchrome%2Cchrome-os)も見てみましたが、特にHWAの不具合修正の記事は見当たりませんでした。

# 終わりに
なぜHWAが絡んでていたのか分からずじまいでしたが個人的に調査のアプローチは良かったように思いました。
Chromeの機能の問題なのでフロントエンド側でどうすることもできないこともあると思いますが、まずは不具合の原因を突き止めることが大事なのだなと思いました。
【TryHackMe】Advent of Cyber3 (2021)を続けてみた Day20

# Welcome to Advent of Cyber 2021
クリスマスまでの25日間、毎日基本的な知識を学び、初心者向けの新しいセキュリティ演習を行うことで、サイバーセキュリティを始めることができます。

https://tryhackme.com/room/adventofcyber3

# day20
このタスクでは、次のことを学習します。

- ファイル拡張子に関係なくファイルのファイルタイプを識別する方法
- ファイル内の文字列を見つける方法
- ファイルのハッシュを計算する方法
- VirusTotalを使用して疑わしいファイルの予備分析を実行する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/5f8e1c88-d7ab-bb92-e598-3f8de6eaf6b2.png)
初期分析

ファイルのファイルタイプをチェックするために使用されます。
`file <filename>`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/b7cf88bc-0ba1-3f93-794d-99d68d2f035e.png)

ファイルに関する詳細情報を収集
`strings <filename>`
文字列コマンドの出力はターミナルウィンドウには少し長すぎたため、McSkidyは出力をファイルに保存しました。これは、出力をファイルにリダイレクトすることで実行できます。
`strings <filename> > strings_output.txt`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/a90fa5c8-4580-c68a-a36d-64e4bb8b6136.png)

`md5sum`とVirusTotalを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/1572f1e9-4733-0385-bcfe-3c9ce0933370.png)


このファイルとその使用目的の詳細については以下リンクを確認してください。
https://www.eicar.org/?page_id=3950

# Answer
Open the terminal and navigate to the file on the desktop named 'testfile'. Using the 'strings' command, check the strings in the file. There is only a single line of output to the 'strings' command. What is the output?
<font color="White">X5O!P%@ AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*</font>
Check the file type of 'testfile' using the 'file' command. What is the file type?
<font color="White">EICAR virus test files</font>
Calculate the file's hash and search for it on VirusTotal. When was the file first seen in the wild?
<font color="White">2005-10-17 22:03:48</font>
On VirusTotal's detection tab, what is the classification assigned to the file by Microsoft?
<font color="White">Virus:DOS/EICAR_Test_File</font>
Go to this link to learn more about this file and what it is used for. What were the first two names of this file?
<font color="White">ducklin.htm or ducklin-html.htm</font>
The file has 68 characters in the start known as the known string. It can be appended with whitespace characters upto a limited number of characters. What is the maximum number of total characters that can be in the file?
<font color="White">128</font>
laravel8 で vue3 を インストール

laravelをインストールが完了していることが条件

参考
https://www.softel.co.jp/blogs/tech/archives/6490
https://qiita.com/howaito01/items/3195b5b11184661cedd2

# nodejs と npm をインスコ

n ってのでバージョン管理をすると良いらしい

```

dnf install nodejs npm
npm install -g n
n stable

#古いの消す
dnf remove nodejs npm

#再度ログイン
exec $SHELL -l
node -v

```


`最新版になってるね！`




# 依存関係をインスコ


```

npm install
npm install vue@next --save-dev
npm install vue-router@4

```





#webpackの編集
vim webpack.mix.js


```

mix.js('resources/js/app.js', 'public/js').vue() //ここ
    .postCss('resources/css/app.css', 'public/css', [
        //
    ]);


```






# vueファイルを新規作成


```

mkdir resources/js/components/
vim resources/js/components/Top.vue

```


```Top.vue

<template>
    <div>Hello Vue3</div>
</template>

```




# app.js を編集

```

vim resources/js/app.js

```


```resources/js/app.js

require('./bootstrap');

import Top from './components/Top.vue';

import { createApp } from 'vue';
import { createRouter, createWebHistory } from 'vue-router';

const routes = [
    {
        path: "/",
        component: Top
    }
];

const router = createRouter({
    routes, // short for `routes: routes`
    history: createWebHistory(),
})

const app = createApp({
    components: {
        Top
    }
});

app.use(router);
app.mount('#app');





```

# ルートを編集

```
vim routes/web.php

```


```routes/web.php

Route::get('/{any?}', function () {
    return view('welcome');
})->where('any', '^(?!api\/)[\/\w\.-]*');


```


#laravelのファイルを編集

```

vim resources/views/welcome.blade.php

```



```welcome.blade.php

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Laravel</title>
        <script src="{{ asset('js/app.js') }}" defer="defer"></script>
    </head>
    <body>
        <div id="app">
            <router-view></router-view>
        </div>
    </body>
</html>

```

`ok`
スキップマッチングを使用して Auto Scaling グループを更新する

# はじめに

DX技術本部の `yu-yama` です。

https://aws.amazon.com/jp/about-aws/whats-new/2021/08/amazon-ec2-auto-scaling-enhances-instance-refresh-configuration-checks-launch-template-validation-amazon-eventbridge-notifications/

の記事の

> **インスタンスに目的の設定が既に存在する場合、そのインスタンスの置換をインスタンス更新で回避できるようになりました。**この機能を使用すると、目的の設定に一致する設定のインスタンスをスキップすることによって、迅速なロールフォワードやロールバックが可能になります。この追加のインスタンス更新コントロールは、インスタンス更新が失敗した場合や完了前にキャンセルされた場合に ASG を更新する際に便利です。この機能は、EC2 起動テンプレートを使用して目的のインスタンス構成設定を定義します。

の部分の解説をします。

## これまでは

以下の構成で運用していて
![20211222_awsqiita.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/4624a4d8-4784-7330-ab2c-3c28bf18b076.png)

インスタンスをv1からv2にバージョンアップする際に失敗した場合
![20211222_awsqiita.drawio (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/499177ed-4641-5b33-7135-098e73c783c2.png)

全ての更新をやり直す必要があった
![20211222_awsqiita.drawio (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/30801aac-36c4-7bde-c93d-b5b8f78e2cd1.png)

## 今回の更新によって

失敗したもののみインスタンスの更新を行うことができるように！
![20211222_awsqiita.drawio (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/97a0ddea-792f-e900-1af1-176424a5b4a4.png)

## 具体的なやり方(起動テンプレートのデフォルトバージョンへの移行)

現時点(2021/12/22)ではまだAWS SDK、AWS CLI しか対応してない模様です。マネコン未対応。

https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/asg-instance-refresh-skip-matching.html

上記参考に config を用意して

```config.yaml
{
    "AutoScalingGroupName": "yu-yama-asg",
    "DesiredConfiguration": {
      "LaunchTemplate": {
          "LaunchTemplateId": "{起動テンプレートのID}",
          "Version": "$Default"
       },
       "MixedInstancesPolicy": {
          "LaunchTemplate": {
               "Overrides": [
                       {"InstanceType": "t1.micro"}
               ]
          }
       }
    },
    "Preferences": {
        "InstanceWarmup": 400,
        "MinHealthyPercentage": 50,
        "SkipMatching": true
    }
}
```

のように config.yamlに `"SkipMatching": true` を記載して、コマンドを実行すると、

```bash
$ aws autoscaling start-instance-refresh --cli-input-json file://config.json
```

起動テンプレートのデフォルトバージョンを既に使用しているインスタンスに対しては更新がスキップされます。

### 注意

実行にはaws-cli v2.4.7 を使用しました

```bash
$ aws --version
aws-cli/2.4.7 Python/3.8.8 Linux/5.10.75-79.358.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off
```

# 最後に

全てをやり直しすることなくインスタンスの更新が出来る地味にうれしいアップデートですね。
こちらの記事が誰かの役に立てば幸いです。
[py2rb] Iterable

# はじめに
移植やってます。
# Iterable (Python)
```python
pH_list = pH if isinstance(pH, Iterable) else [pH,]
```
> __iter__() メソッドを提供するクラスの ABC です。

まず`ABC`クラスが分かっていないのですが、

> (反復可能オブジェクト) 要素を一度に 1 つずつ返せるオブジェクトです。 反復可能オブジェクトの例には、(list, str, tuple といった) 全てのシーケンス型や、 dict や ファイルオブジェクト といった幾つかの非シーケンス型、 あるいは Sequence 意味論を実装した __iter__() メソッドか __getitem__() メソッドを持つ任意のクラスのインスタンスが含まれます。

~~ますます分かりませんが、~~ここでは`pH`がFloat型もしくはFloat型を要素に持つリストですので、それで行きたいと思います。

https://docs.python.org/ja/3.7/library/collections.abc.html#collections.abc.Iterable
# どうする？ (Ruby)
```ruby
pH_list = pH.instance_of?(Array) ? pH : [pH,]
```
# メモ
+ Python の Iterable を学習した
+ 道のりは遠そう
[py2rb] isupper isalpha

# はじめに
移植やってます
# isupper isalpha (Python)
```python
if sequence.isupper() and sequence.isalpha():
```
この場合、文字列`sequence`が英字で大文字ですね。

https://docs.python.org/ja/3.7/library/stdtypes.html#str.isalpha

https://docs.python.org/ja/3.7/library/stdtypes.html#str.isupper

**[追記]**
コメント欄に、興味深い話があります。
# Regexp (Ruby)
```ruby
sequence = 'ABCDEF'
puts sequence =~ /^[A-Z]+$/
sequence = 'abcdef'
puts sequence =~ /^[A-Z]+$/
sequence = 'ABC123'
puts sequence =~ /^[A-Z]+$/
sequence = 'ABCdef'
puts sequence =~ /^[A-Z]+$/
sequence = 'ABCD-F'
puts sequence =~ /^[A-Z]+$/

```
正規表現ですよね。
`\A...\z`って書いたほうが良いそうです。

https://qiita.com/scivola/items/0bcb1d1c99c67a4be9fd
# メモ
+ Python の isupper isalpha を学習した
+ 道のりは遠そう
【多分暫定対応】M1 macのDocker上のRails 7でTailwind CSS 3を使う

Rails 7では、`--css tailwind`オプションをつけると[tailwindcss-rails](https://github.com/rails/tailwindcss-rails)を通じて、Tailwind CSS 3が使えるようになります。

しかし、[ややこしい経緯]()によりARM Linuxの上では使えないので、npmからTailwind CSS 3をインストールして使う必要があります。

まずは、`npm install tailwindcss`をしてインストールします。

そして`Rakefile`の最後に下記のように書き加えてください。

```
# use Tailwind CSS 3 on npm
original_verbose = $VERBOSE
$VERBOSE = nil # suppress warnings
TAILWIND_COMPILE_COMMAND = "#{Pathname.new(__dir__).to_s}/node_modules/.bin/tailwindcss -i #{Rails.root.join("app/assets/stylesheets/application.tailwind.css")} -o #{Rails.root.join("app/assets/builds/tailwind.css")} -c #{Rails.root.join("config/tailwind.config.js")}"
$VERBOSE = original_verbose

```

これをしない場合には下記のようなエラーが出ます。

```
ERROR: tailwindcss-rails does not support the aarch64-linux platform
Please install tailwindcss following instructions at https://tailwindcss.com/docs/installation
```
ローグライクのダンジョンを自動生成する

# はじめに
この記事は[東京高専プロコンゼミ① Advent Calendar 2021](https://adventar.org/calendars/6568) 20日目(!?)の記事です
その②はこちら: https://adventar.org/calendars/6569

執筆時点で既にハワイ標準時ですら遅刻の大遅刻をやらかしてます、すみません...:bow:

今回はネタが本当になくてずっと悩んでいたのですが、ようやくローグライクのダンジョン生成というネタを思いついたので今回はこれについて書いていきます。

# ローグライクとは
ローグライクはゲームジャンルの1つで、特徴としては
　　- グリッドで区切られたマップ
　　- ダンジョンはランダム生成
　　- ダンジョンごとにプレイヤーのステータスがリセットされる
などが挙げられます。
主に風来のシレンシリーズやポケモン不思議のダンジョンシリーズが有名でプレイしたことのある方も多いのかなと思います。

# ダンジョン生成アルゴリズム
今回はダンジョンの自動生成をしたいので、生成アルゴリズムを考える必要があります。
少し調べてみたところ、RoguelikeDevコミュニティというローグライクの開発について議論をし合うコミュニティがあり、そこが[生成アルゴリズムの一覧](https://github.com/marukrap/RoguelikeDevResources)をまとめて公開しているのでこれを参考にしました。（RoguelikeDevコミュニティの皆さん、ありがとうございました）

一覧には様々なアルゴリズムが記載させているのですが、今回は最も基本的なBasic BSP Dungeon Generation(以下BSP)を使用することにします。

BSPは簡単に説明すると、あるエリアを何度か分割して、分割したエリアそれぞれに部屋を生成した後それらを道でつなげていくという手法です。
この部屋を生成したあとに道でつなげる手法を実装する上で問題になってくるのが、孤立した部屋と、道と部屋の衝突ですが、BSPはこれらの問題を簡単な実装で解決することができます。

以下では図を使って詳しく説明して行きたいと思います。
今回の例ではあるエリアを3回分割(8個部屋が生成される)することを考えます。

まずは，あるエリアを3回分割します。分割する際に縦割りにするか横割りにするかは自由です。また、分割したエリアにはわかりやすいように「親+AorB」の名前をつけています。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547432/6af422b4-d9b0-a57d-abac-ded2b698c0fc.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547432/eb978722-208b-bbd1-50a7-50f0478eccba.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547432/822b46db-10d2-e81f-4ff1-1bba221e2f41.png)

分割が終わったら、それぞれのエリアに収まるよう部屋を生成します。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547432/ac7a5ab6-b24e-a32a-9b28-7c1e05e7d537.png)

最後に直近の親が同じ部屋を道でつなげていきます。これによって、必ず全ての部屋を繋げることができます。
また、エリアに複数の部屋がある場合には、一番境界線に近いもの同士を選ぶことで必ず他の部屋と衝突することなくつなぐことができます。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547432/4d4661f9-7ab9-d31d-1f76-e4b518168b8e.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547432/c7daafd1-2bdd-a201-6820-41dd9f1bb5d7.png)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547432/259a1db6-9903-6156-55e2-30c425651306.png)

完成したダンジョンはこんな感じです。詳しい説明は[wiki](http://www.roguebasin.com/index.php?title=Basic_BSP_Dungeon_generation)にあるので、こちらも合わせて参考にしてください。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547432/52994b43-a913-274a-3212-79f1343b8948.png)

# 実装
pythonで実装したものがこちらです。

https://github.com/fazerog02/Roguelike/blob/master/main.py

# 終わりに
小学生の頃、ポケモン不思議のダンジョンが大好きでめっちゃ遊んでいましたが、今になってダンジョンの生成方法を知るとまた別の面白さが見えて来て、執筆中に買い直してやりたい気分になりました。
今回は単純なBSPを紹介しましたが、他にも面白い生成アルゴリズムがあるので興味がある方はぜひ調べてみてください。

最後になりましたが、ここまで拙い文章に付き合っていただきありがとうございました。
【CSS】table のヘッダー行と列を固定する

最近は IE11 対応もめっきりなくなり、`position: sticky;` が自由に利用できるようになりました。

そこで利用したいのが、 `table` の `th` の `position: sticky;` 。

罫線がある表組みだとちょっとやっかいだったので、テンプレートを作成してみました。

## 共通CSS

表組みの見栄えに関する共通設定。

```scss:scss
.tableWrapper {
  width: 100%;
  max-width: 1019px;
  margin: 0 auto;
  overflow: auto;
  border: 1px solid #ccc;
}
table {
  width: 100%;
  table-layout: fixed;
  border-spacing: 0;
  border-collapse: separate;
}
th,
td {
  width: 100px;
  padding: 0.5em 1em;
  text-align: center;
}
th {
  background-color: #eee;
}
thead {
  th {
    border-bottom: 1px solid #ccc;
    &:not(:last-child) {
      border-right: 1px solid #ccc;
    }
  }
}
tbody {
  th,
  td {
    &:not(:last-child) {
      border-right: 1px solid #ccc;
    }
  }
  tr {
    &:not(:last-child) {
      th,
      td {
        border-bottom: 1px solid #ccc;
      }
    }
  }
}
```

## 垂直固定

```html:html
<div class="tableWrapper">
  <table>
    <thead>
      <tr>
        <th scope="col">1</th>
        <th scope="col">2</th>
        <th scope="col">3</th>
        <th scope="col">4</th>
        <th scope="col">5</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>1-1</td>
        <td>1-2</td>
        <td>1-3</td>
        <td>1-4</td>
        <td>1-5</td>
      </tr>
      <!-- 以下省略 -->
    </tbody>
  </table>
</div>
```

```scss:scss
.tableWrapper {
  height: 270px;
}
thead {
  th {
    position: sticky;
    top: 0;
  }
}
```

## 水平固定

```html:html
<div class="tableWrapper">
  <table>
    <tbody>
      <tr>
        <th scope="row">1</th>
        <td>1-1</td>
        <td>1-2</td>
        <td>1-3</td>
        <td>1-4</td>
        <td>1-5</td>
      </tr>
      <!-- 以下省略 -->
    </tbody>
  </table>
</div>
```

```scss:scss
tbody {
  th {
    position: sticky;
    left: 0;
  }
}
```

## 垂直・水平固定

```html:html
<div class="tableWrapper">
  <table>
    <thead>
      <tr>
        <th></th>
        <th scope="col">1</th>
        <th scope="col">2</th>
        <th scope="col">3</th>
        <th scope="col">4</th>
        <th scope="col">5</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <th scope="row">1</th>
        <td>1-1</td>
        <td>1-2</td>
        <td>1-3</td>
        <td>1-4</td>
        <td>1-5</td>
      </tr>
      <!-- 以下省略 -->
    </tbody>
  </table>
</div>
```

```scss:scss
.tableWrapper {
  height: 270px;
}
thead {
  th {
    position: sticky;
    top: 0;
    z-index: 1;
    &:first-child {
      left: 0;
      z-index: 2;
    }
  }
}
tbody {
  th {
    position: sticky;
    left: 0;
    z-index: 1;
  }
}
```

## DEMO

<p class="codepen" data-height="500" data-default-tab="result" data-slug-hash="MWEvJeV" data-user="taqumo" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/taqumo/pen/MWEvJeV">
  Table Sticky Header</a> by Takuya Mori (<a href="https://codepen.io/taqumo">@taqumo</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
SQLコマンド基本

## はじめに

SQLを学びながらboostnoteにまとめていた記事をリファクタリングした。
SQL叩く時はこれを参考にしている


**ポイント**
元の表がどういうもので、新しくどのような表を作りたいのかイメージする

## 基本
```SQL
SELECT  カラム名
FROM テーブル名
WHERE 条件
```

**重複なし**

```sql
SELECT DISTINCT カラム名
```

## 条件

**条件が複数**

```sql
WHERE 条件1 AND 条件2
```

**どちらかの条件が当てはまったら**

```sql
WHERE 条件 1 OR 条件2

-- role = "パイロット" OR role = "作戦部長"    同じカラムの場合INでまとめる
WHERE role IN ('パイロット', '作戦部長')

-- まとめて否定もできる
WHERE role NOT IN ('パイロット', '作戦部長')
```

**指定した範囲内に条件に当てはまったら**

```sql
WHERE kawaii BETWEEN 6 AND 8
```

**あいまい検索**

```sql
WHERE name LIKE "プリン%"  -- プリンから始まる
WHERE name LIKE "%プリン"  -- プリンで終わる
WHERE name LIKE "%プリン%" -- プリンが含まれる
```

**空のレコード**

```sql
WHERE role IS NULL;

--空じゃないレコード
WHERE role IS NOT NULL;
```

**表示件数を制限**

```sql
LIMIT 2; --2件だけ表示

LIMIT 10 OFFSET 10 -- 21件目から10件取得


```

## 並び替え

```sql
ORDER BY 基準のカラム名 並べ方
-- 昇順 ASC
-- 降順 DESC
```

```sql
SELECT *
FROM eva
ORDER BY kawaii ASC
```

## グループ化
ポイントは
軸になるカラムは全てORDER BYで指定する

処理が行われる順番を意識する

```sql
GROUP BY 基準のカラム
-- 指定したカラムに存在する値ごとにまとめる
-- 指定できるのはSELECTで指定したカラムか集計関数
```

## テーブル結合
テーブル間で共通するデータを軸に結合させる
処理が行われる順番を意識する

```sql
-- テーブルを結合してからSELECTしている
-- 結合した新しいテーブルから何を取得するかをSELECTに記載
SELECT martians.name, histories.planet
FROM martians AS m
INNER JOIN histories AS h
ON m.id = h.martians_id;


-- 結合先のデータが欠損していても削除せずNULLで出力する (結合元のデータが全て残る)
LEFT OUTER JOIN
```

```sql
SELECT martians.name, histories.planet
FROM martians
JOIN histories
ON martians.id = histories.martians_id;
```

## CASE式

分析用の分娩単位で集計したい時に集計関数(SUM)とGROUP BY句と一緒に使うことで大活躍
条件に応じて集計したい時はCASE式

```sql
SELECT CASE WHEN 条件 THEN 値 --この条件の時はこの値
       WHEN 条件 THEN 値 --この条件の時はこの値
       ELSE 値 END --どれにも該当しなかったらこの値　終わり
       -- SELECTするカラムが他にもある場合はENDの後に ,カラム名で追加 
FROM テーブル名
```
例

```sql
SELECT 
CASE WHEN pref_name = IN ('京都', '大阪') THEN "関西"
WHEN pref_name = IN ('福岡', '佐賀') THEN "九州"
ELSE NULL 
END AS district, -- pref_nameのカラム名をdistrictに変更
SUM(population) -- populationを集計する
FROM population
GROUP BY -- SELECTと全く同じCASE式を書く
CASE WHEN pref_name = IN ('京都', '大阪') THEN "関西"
WHEN pref_name = IN ('福岡', '佐賀') THEN "九州"
ELSE NULL 
END
```

## サブクエリ
クエリ叩いた結果に対してクエリ叩く
実際に実行されているSQL文を書いてみるとイメージできる

```sql
--　サブクエリから実行される
SELECT *
FROM items
WHERE price >= (
SELECT AVG(price)
FROM items
)
```

```sql
SELECT * 
FROM items AS i1
WHERE price >= 
(
SELECT AVG(price)
FROM items AS i2
WHERE i1.category = i2.categrory 
-- 上の１文で合致した方の平均価格で比べることができる
-- 相関サブクエリ
GROUP BY category
);

```

## 参考
[Progate](https://prog-8.com/dashboard)
[Youtube](https://www.youtube.com/watch?v=v-Mb2voyTbc)
[SQLの環境構築で参考にしたサイト](https://style.potepan.com/articles/19020.html)
FortiClient VPN再インストール方法(Mac)

# はじめに
利用しているFortiClient VPNのBisur対応時にアップデートで手こずったのでまとめとして記録しました。

# FortiClient VPNのアップデート時にエラーが出る問題
FortiClientの6.xのバージョンだとBigsurに対応していなかったため、IPsecで接続しようすると接続エラーが発生していました。
https://www.reddit.com/r/fortinet/comments/ksw04w/forticlient_642_compatibility_with_macos_big_sur/

こちらの問題は7.xのバージョンから解消されたようでアップデートしようとしました。
ところが、なぜかMacだと最新のものをインストールしようとするとNo updates found エラーが発生してできませんでした。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471468/bd7b7442-0e30-22da-90d5-894c64c52a97.png)

# FortiClient VPNの再インストール
アップデートができないなら再インストールするしかありません。

せっかく登録したVPN先を再設定するのは手間などでバックアップを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471468/c4fa3847-1284-f8a7-69aa-02ce0e4afe65.png)

下記のサイトから最新ものを再インストールします。
https://www.fortinet.com/support/product-downloads

# バックアップconfからリストア

再インストールしてリストアしようとしたところ、"error importing configuration file" と表示されできませんでした。。。
（地味にリストアする際に右上の鍵マークを解除するのも忘れないよう気をつけてください。）

フルディスクアクセスから許可が必要らしく、私の環境だとfctservctl2,FortiClientAgent,FortiClientこの3つがあったので全て許可しました。
https://docs.fortinet.com/document/forticlient/7.0.2/macos-release-notes/223986/special-notices

上記の設定をした結果無事にリストアができました！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471468/50cc4d09-5750-0d05-f61b-341b03fc2e39.png)

# おわり
ちょっと再インストールしてリストアするだけの予定でしたが、思ったよりも詰まる箇所が多かったのでまとめました。
MacのFortiClient VPNで困っている方がいましたら助けになると幸いです。
PythonでAPMトレーサーを試してみる

OCIのAPM(アプリケーション・パフォーマンス・モニタリング)には、OpenTracingに対応した分散トレーシングの機能が含まれています。JavaのMavenプロジェクトやHelidonには、[APM Javaトレーサー](https://docs.oracle.com/ja-jp/iaas/application-performance-monitoring/doc/configure-apm-tracer.html)が用意されていますが、Pythonの場合はpy_zipkinを使用することで同様にトレースデータをAPMに送信することが可能です。
ここでは、APMの分散トレーシングがどのように使えるのかという点を、実際にPythonのアプリケーションで試してみます。

##APMに必要なユーザーと権限
今回は、設定にアカウント管理者ユーザーを用しているので省略しますが、一般ユーザーの場合は[ドキュメントに](https://docs.oracle.com/ja-jp/iaas/application-performance-monitoring/doc/perform-oracle-cloud-infrastructure-prerequisite-tasks.html)従ってポリシーを付与します

## APMドメインの作成
- 監視及び管理 -> アプリケーション・パフォーマンス・モニタリング -> 管理からAPMドメインの作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/d031d976-0cb1-abc7-a7d4-2eb1094a1ba4.png)

- 名前とコンパートメントを選択し作成。無償枠を利用する場合は、Always Freeにチェックを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/c839177d-0353-6aac-3f9c-457893e3ae8e.png)

- 作成後、エンドポイントとパブリックのデータ・キーは後で必要になるのでコピーしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/8ddcd464-3468-2b28-266f-d822c6b79895.png)

## 実行環境の準備
Pythonの実行できる環境を用意し、以下のパッケージをインストール (例としてOCIに新しいVMインスタンスを作成後から設定を開始)

```
sudo yum install python3-devel
sudo pip3 install requests
sudo pip3 install py_zipkin

#サンプルコードをダウンロード
wget https://raw.githubusercontent.com/western24/apm4python/main/apmweather.py
```
このサンプルコードは気象庁のAPIにアクセスし天気予報のデータを取得して表示する単純なアプリケーションです。コード内には、トレースデータをAPMに送信するコード(zipkin_span)を組み込んであります


サンプルコード内の8行目、赤字の部分を上記でコピーしたAPMエンドポイントとパブリックキーに置き換えます
requests.post('https://<font color="red">APM Endpoint</font>/20200101/observations/public-span?dataFormat=zipkin&dataFormatVersion=2&dataKey=<font color="red">Publid Key</font>',

例)
requests.post('https://aaaacxxxxxxx.apm-agt.us-ashburn-1.oci.oraclecloud.com/20200101/observations/public-span?dataFormat=zipkin&dataFormatVersion=2&dataKey=P2HVLPEYDQ3R3366OBCIUFOM42Z4xxxx',

```
#アプリケーションの実行　※130000は東京を示すコード
$ python3 apmweather.py 130000
2021-12-22T11:00:00+09:00 東京地方 晴れ　夜　くもり
```
正しく実行できれば上記のようにエラーメッセージなしで、東京の天気予報の情報を表示します

##APMでトレースデータを確認する
- APM->トレース・エクスプローラーをクリックすると、Weather SampleAPMという名前のアプリケーションのトレース結果が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/780cfe34-00e7-e081-c231-9934d948268a.png)

- このアプリケーションは以下のように3つのSpanで構成されており、実際にAPIにアクセスし情報を表示する処理を行っているのは2番目のAccess Weather APIというSPAN名です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/0cc4d1e0-83f8-7707-1f13-ef98bfd30388.png)

本アプリケーションは、PythonでのAPMトレースの使い方が分かるようにシンプルな記述に努めました。
コード内のzipkin_spanは、ファンクション部にwith文を付けて実装することにより、そのファンクションをSPANとして定義します。SPANごとにその処理の実行時間が記録されるので、マイクロサービスのようなAPIを組み合わせて使用するようなアプリケーションなどの性能監視や問題個所の特定に役立つと思います。

ちょっと分りづらいですが[こちら](https://docs.oracle.com/en/cloud/paas/application-performance-monitoring/apmpy/#before_you_begin)にもObject StorageとKafkaを使ったサンプルがありますので、ご参考に
Linux権限を8進数へ変換


プログラミングスクール卒業生です。
スケジュールがとてもハードで理解が浅いままになっている部分があります。
少しでも理解を深めたいと思い、この投稿を始めました。
第3回目は「Linux権限を8進数へ変換」についてです。
間違っている部分があれば指摘していただけると助かります。よろしくお願いいたします。




##権限の8進数表現
ここまで、パーミッションは「r」、「w」、「x」で表すと説明してきましたが、場合によっては3桁(755や600等)の8進数の数字で表すことがあります。8進数とは0~7までの数字の組み合わせのことです。

ひとまず、理屈は抜きにして

r(read)は、、、4
w(write)は、、、2
x(execute)は、、、1

と暗記してしまいましょう。

では例として、「764」の場合はどうなるでしょう？

答えは、、rwxrw-r--となります。

わかりましたでしょうか？

##7の場合

１つ目の数字は所有者の権限を表しています。この場合は「7」が所有者になります。

最初に暗記した３つの数字を全部足すと「７」　になるのがわかりますでしょうか？

「７」と言う数字はこの場合においては読み込み、編集、実行全ての権限を持っていることを表しています。

##6の場合
次の2つ目の数字はグループユーザーの権限を表しています。この場合は「６」がグループユーザーになります。

最初に暗記した数字のうち、どれを足せば「６」になるでしょうか？

正解は、r(read)の4とw(write)の2ですね。

と言うことは、グループユーザーには読み込みと編集の権限があって実行の権限だけないと言うことになります。

##4の場合
次の３つ目の数字はその他ユーザーの権限を表しています。この場合は「４」がその他ユーザーになります。

では、先ほどのように最初に暗記した数字のうちどれを足せば「４」になるでしょうか？

正解は、r(read)だけで「４」になるので、その他ユーザーには読み込みの権限のみが与えられていると言うことになります。

##その他のパターン
「３」→ -wx
「1」→ --x

の様見なります。
ありえないパターンかと思いますが、変換の理解を優先するため一応記載してみました。

##最後に
どうでしたでしょうか？なぜrが４、wが２、xが１なのかは、変換の理解を優先するためあえて省きました。
皆さんのlinux権限の８進数変換の理解の手助けになれば幸いです。

お疲れ様でした。
実行中しか押せないボタン

「このスプライトが押されたとき」というイベントで動く処理を、緑の旗が押されて実行中の時だけに制限したい時があると思います。そのような時は、タイマーを使うと実現できます。ただし、この機能を実現すると、プログラムの中で通常のタイマーの利用ができなくなりますので、注意してください。

考え方としては、プログラムが実行されているときはタイマーを常に０にリセットする処理を動かし続けておきます。プログラムが停止されていると、タイマーだけが増えるのでそれで実行中かどうかを判定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75307/d439cc4f-6152-925e-d499-2d077f67c934.png)

この機能を含めて、今回のアドベントカレンダーで紹介したノウハウを利用した、まとまった大きさのプログラムで作られたゲームを紹介します。クラウド変数を使ってハイスコアが保存されるので、ぜひ遊んでみてください。

サンプルプログラム
https://scratch.mit.edu/projects/620034975

![スクリーンショット](https://cdn2.scratch.mit.edu/get_image/project/620034975_480x320.png)
コスパ抜群！VSCode ショートカットキー３選！

:::note alert
コスパ抜群は言いすぎました
:::

# 初めに
私事ですが、プログラマーとして働き始めて１年。
初めてメカニカルキーボードを購入しました。
~~今まではメンブレンで、職場で虐げられていました。~~
メカニカルの打鍵感とメンブレンにはない高級感から
使いこなせるようになりたい！という気持ちが湧き上がり
まずはVSCodeのショートカットを使いこなそう！と思いました。

ですが、調べてみたところかなりたくさんあって困っちゃいました。
なので自分と同じような人のためにまずはこれだけ覚えたら作業効率上がった！というショートカットキーを紹介します。

:::note warn
記事の対象
windowsのPCを使っていてショートカットキー使わない人
:::

# CTRL + ENTER
一番使ってます。
カーソルの下に行を追加してくれます。

自分は以前、行の途中で下に行を追加したいとき、以前は行の１番後ろまで行ってからenterを押して改行していました。
それがいらなくなったので楽です。
（↓ショートカットキーを使わない操作、使う操作のgifです。）
![ctrl+ent.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650889/1afc20fa-d770-b0ba-a3e2-2150ee7bc86c.gif)

またCTRL + SHIFT + ENTER で上に行を追加できます。

# CTRL + D
カーソルがある単語を選択できます。
マウスを使うといらないスペースも選択しちゃったりしてたので便利だなあと思いました。
（↓ショートカットキーを使わない操作、使う操作のgifです。）
![crl+d.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650889/4b3e7def-12c2-5a6c-b2fc-e24cdac53853.gif)

# CTRL + 2
作業スペースを分割できます。分割している場合は移動できます。
自分は作業スペースを２分割して２つのファイルを開いて作業することが多いのでよく使っています。
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650889/bbf525dd-8cb4-0f8f-c8ed-397e05690f07.gif)


# 上の3つの組み合わせ
左側のファイルから CTRL + 2 を使って右のファイルに移動します。
CTRL + D を使って単語を選択します。
CTRL + 1 で左のファイルにもどって
CTRL + ENTER で改行して
CTRL + V で貼り付けています。
![ctrl+2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650889/3ee2f5b4-7753-2ff7-9743-35dc6bac76fb.gif)

# おわり
3つ覚えるだけでもちょっとカッコよくファイルを編集できます。
普段マウスを使ってやっていたことだったので結構楽になったなと思いました。
最初からたくさんのショートカットキーを覚えても自分の普段の作業で使わないようなものだったら意味がないので、普段よくやる作業、動作があったらそれがショートカットキーを使ってできないか調べてみるといいと思います。

他にもこんな便利なショートカットキーがあるよーという方はコメントで優しく教えてください。
業務に活かせるVimテクニック

# はじめに
2021年度ニフティ新入社員兼Vimmerの@penpenpenです！
普段からNeoVimを愛用しており、社内でVimを布教しています。
本記事では、開発で使っていて便利だと思ったコマンドを紹介します。

# Tips
それでは行きます！
## 任意の長さの文字列を作成する
ノーマルモードで以下のようなコマンドを打ちます。
``(文字数)i(入力したい文字)``
すると, インサートモードに入るので、そのままescでノーマルモードに移行すると所望の文字列が得られます。
例えば以下の画像では、64文字のxが入力されています。
![決めた長さの文字列を作成する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270960/badd1bc4-0381-b199-8da5-81e9fee1f06d.gif)

単語を繰り返すことも可能です。
![vimを繰り返すだけの画像![Kapture 2021-12-22 at 16.55.32.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270960/0a7f8485-29ba-e3e8-0ac7-e809ac34d480.gif)
](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270960/4ee73671-9ab0-421a-cb44-03a0e496da39.gif)

## 行頭、行末に同じ文字列を挿入する
### 行頭に特定の文字を入れる
矩形選択のビジュアルモードで行を選択し、Iを打ち、インサートモードに入ります。その後挿入したい文字列を入力しノーマルモードに戻ると行頭に文字列が挿入されます。
![行頭に特定の文字列を入力する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270960/9a2c71e1-c3eb-893c-c2b4-579fd44daadf.gif)
なお、単にコメントを入れたい場合は、[tomtom/tcomment_vim](https://github.com/tomtom/tcomment_vim)などのプラグインを使うと便利です。

### 行末に特定の文字を入れる
行末の場合は、行頭でIを打つところをAと打てば良いです。
![行末に文字列を入れる](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270960/42fb4545-b27a-1203-42a8-d14fc63fa6a9.gif)
Cなどの行末に;を入れないといけない言語で、入れ忘れを一括で直したい時などに便利です。

## 連番を作る
まずは連番を作りたい分だけヤンク&ペーストで1を入力します。
次に、矩形選択で数字を選択し、g\<C-a\>を打つと、連番が得られます。
選択する範囲は連番の最初の数字の次の数字からスタートすることに注意してください。
![Kapture 2021-12-22 at 17.02.17.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270960/a65816d0-4f64-4eef-8e48-4a369ddc7788.gif)
これまでのテクニックを組み合わせると、手軽にリストを作れます。
![Kapture 2021-12-22 at 22.39.52.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270960/5550aaac-fd0a-f399-0d91-d61a4db4c205.gif)


## 特定の文字列を含む行を削除する
ノーマルモードで以下のようなコマンドを打ちます。
``:g/hogehoge/d``
これにより、hogehogeを含む行を削除することができます。
コメントや、行を削除したいときにその行に特定の文字列が含まれているときに一掃できるので便利です。
![行削除](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270960/155c690e-4c9a-c586-57ba-ed493d3c4223.gif)


## バッファ上でコマンドを実行する
sortや昨日の@h_okawa0303さんが紹介された[jq](https://qiita.com/h_okawa0303/items/32f9580e1de6802eb776)といったlinuxコマンドもVim上で実行しテキストの整形ができます。
では、試しに[『「jqめちゃくちゃ便利じゃん😂」と感動することが多いので使い方を調べた』のソート](https://qiita.com/h_okawa0303/items/32f9580e1de6802eb776#%E3%82%BD%E3%83%BC%E3%83%88)を実行してみましょう。あらかじめusers.jsonをペーストしているものとして話を進めます。

ビジュアルモードでコマンドに入力したい文字列を選択し、``!(linuxコマンド)``を入れると、実行結果に置き換えてくれます。
![Kapture 2021-12-22 at 21.56.24.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270960/459e9a63-dfea-77c1-be8a-7cf1679e13c2.gif)
![Kapture 2021-12-22 at 22.02.06.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270960/832fb6a7-fc06-722c-7414-147aea536f4f.gif)
手軽にjsonを整形したり、バッファ上の文字列をソートするときに便利です。

## 重複している行を削除
ノーマルモードで:sort uと打つと重複行を削除できます。
![重複している行を削除](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270960/322b85c7-371d-645a-b437-3485aeaf2713.gif)
辞書順にソートされてしまいますが、どういう値が入っているか簡単に眺めたいときなどに便利です。

# おわり
本記事でのVimのテクニックで何か参考になる部分があれば幸いです。

本日は弊社のiOSアプリ、マイニフティがリリースされました！
https://csoption.nifty.com/myapp/
もし＠nifty接続サービスを使われていましたら、ぜひお試しください。
AWSアカウントを作成する時に考えたこと

---
##背景
AWSの利用を開始する時にAWSアカウントを作成すると思いますが、その時、このアカウントって誰が使うの？どの環境用？と考えた事はありませんか？何も考えずにAWSアカウントを作成していくと、後々、大変な事になります。そうならないためにも、しっかり整理された複数のAWSアカウントを作成する際に、考えた事をつらつら書いていこうと思います。

##AWSアカウントの特徴を考える
まず、AWSアカウントって何でしょう？AWSアカウントその物の特徴を考えてみました。

- セキュリティにおける境界の単位
    - 他のアカウントとのセキュリティの境界の役割を果たす（他のAWSアカウントの構成は見えないしアクセスできない）
- AWS環境における分割単位
    - アカウント単位でAWSのさまざまなリソースを管理する
- AWS課金における分割単位
    - AWSのサービスの利用における課金はAWSアカウントに対して行われる

##検討観点からメリデメを考える
AWSアカウントを、どのシステム単位、組織単位で利用するか？環境（本番/ステージング/開発）ごとに分けるか？等々を「管理」、「課金」、「組織」、「運用」の観点から考えてみました。

| 検討観点|AWSアカウントを分割する理由 |メリット|デメリット|
|:-----------------|:------------------|:------------------|:------------------|
| 管理  　|セキュリティ及び管理上の理由から開発環境、テスト環境、本番環境でアカウントを分割したい |・本番環境の管理コンソールを分離できる<br>・本番環境と非本番環境を管理するメンバーの明確な権限の分離<br>・環境間におけるセキュリティ対策の分離が可能|・複数アカウントにまたがり管理を行う必要がある<br>・複数アカウントにまたがる監査情報取得等の効率化が必要|
| 課金  　|課金に関する可視性、責任、及びアカウントごとのコントロールを行いたい|・分離したアカウント毎に明確な課金管理を行うことができる<br>・複数の部門やシステム単位に対し、シンプルな課金運用が実現できる|・各アカウントの課金レポートに対するアクセス管理や、レポートを集約する場合にはconsolidationを必要とする<br>・利用料のボリュームディスカウントのためにはconsolidationと配賦の合意が必要になる|
| 組織  　|リソースの操作権限を特定のシステム（組織単位）に委譲し、その中でより自由にAWSプラットフォームを活用したい |・システム（組織単位）毎に異なる課金管理と共にサポートすることができ、システム（組織単位）での管理を容易に行うことができる<br>・統制や課金が異なる専用アカウントを用いる個々の顧客に対してサービスを提供しやすい|・共通機能のような、アカウントをまたいで利用できる機能を重複して持つことへの考慮・対応が必要となる|
| 運用  　|構成変更時の影響範囲を小さくし、自身固有の環境を利用したい|・変更による影響範囲を縮小する事ができる。例）開発環境の障害が本番環境に及ばない<br>・AWSアカウントのリソース上限にかかる可能性を緩和できる|・複数アカウントを管理するため重複設定・操作の増加等、運用ボリュームが増加する<br>・監査やセキュリティ対応といった運用にクロスアカウントでのアクセス権限が必要となる<br>・オンプレミスとAWSおよびAWSアカウント間のネットワーク接続の複雑性・コストが増す|

##まとめ
AWSアカウントはAWSを利用する際に一番大きな論理区画となるものです。後々の構成変更は容易ではなく、慎重に検討したいものです。
[SQLite] 日付の扱い方

# 日付の扱い方
SQLiteには、他のデータベースに存在する**DATE**型や**DATETIME**型のようなストレージクラスは存在しない。そのため、SQLiteでは日付を**TEXT**型、**REAL**型、**INTEGER**型として扱う必要がある。各型における値は以下となる。
■ **TEXT**
　ISO8601形式の文字列で保持する。("YYYY-MM-DD HH：MM：SS.SSS")
■ **REAL**
　ユリウス日数として保持する。
　紀元前4714年11月24日のグリニッジの正午からの日数。
■ **INTEGER**
　Unix時間として保持する。
　1970-01-01 00：00：00UTCからの秒数。

上記のように日付や時刻を扱える型はないが、日付や時刻を取得する```date()```、```time()```、```datetime()```などの関数はある。
例えば、現在の日時を取得する場合は以下のように書ける。

```sql
datetime('now', 'localtime');
```

これで```YYYY-MM-DD HH：MM：SS```の形式で現在日時が取得できる。
ここで、```localtime```を付けないと**UTC**時刻になってしまう。**UTC**とは協定世界時のことであり、日本標準時とは9時間の時差がある。
つまり日本標準時に直すには、**UTC**時刻から```+9 hours```する必要がある。

# 参考
[https://www.sqlite.org/datatype3.html](https://www.sqlite.org/datatype3.html)
IBM Cloud の Load Balancer for VPC の料金見積方法をわかりやすく説明します

# はじめに
IBM Cloud の Load Balancer for VPC （ロード・バランサー）の料金見積方法について説明します。IBM Cloudの料金見積は、[コスト見積ツール](https://www.ibm.com/jp-ja/cloud/cloud-calculator)を使って計算することができます。Load Balancer for VPC は、IBM Cloudにログインすることなく見積ることが可能です。別の方法として、[VPC料金ポータル](https://www.ibm.com/cloud/vpc/pricing)に単価が公開されていますので、この単価を用いて計算することもできます。

＊Load Balancer for VPC の詳しい説明については、[資料](https://cloud.ibm.com/docs/vpc?topic=vpc-nlb-vs-elb&interface=ui&locale=ja)をご参照ください。
＊IBM Cloud の各サービスや単価は変更される可能性がありますので、記事作成日時点でありますことご了承ください。

# 1. Load Balancer for VPC の 課金要素
課金要素は下記の3つです。従量課金なので使用時間と処理データ量に応じて使った分だけ課金されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864295/67d89b68-374a-852a-7066-3dc6002dbe2c.png)

＊ネットワーク・ロード・バランサーとアプリケーション・ロード・バランサーの2種類がありますが、課金の考え方は同じです。サービス使用時間と処理データ量の単価が異なりますのでご注意ください。

######サービス使用時間（単位：時間）
ロード・バランサーのひと月あたりの稼働時間です。月によって日数が異なりますので、概算見積の際には、1年の平均として 24時間 × 365日 / 12ヵ月 = 730時間 で計算するとよいかと思います。金額の上振れを防ぐ場合は、最大日数の月に合わせて 24時間 × 31日 = 744時間 で計算することをおすすめします。
######処理データ量（単位：GB）
ロード・バランサーで処理されるデータ量です。InとOutの両方のデータ量の合計です。
######Floating IP（浮動IP）
Public通信（インターネット接続）がある場合のみ必要です。1つのロード・バランサーにつき、1個のFloating IPを見積ります。
＊Floating IPの説明については、[資料](https://cloud.ibm.com/docs/vpc?topic=vpc-about-networking-for-vpc#external-connectivity)をご参照ください。

# 2.  コスト見積ツールを使って見積ってみる
下記の前提で見積例を説明します。
【アプリケーション・ロード・バランサー】
・リージョン：東京リージョン
・サービス使用時間：730 時間
・処理データ量：1000 GB
・Public通信あり（ インターネット接続 ） 

1. [IBM Cloudカタログ](https://cloud.ibm.com/catalog)を開きます。
2. Load balancer for VPCを選択します。
3. アプリケーション・ロード・バランサーを選択します。
4. 『見積もりに追加』（英語表記：Add to estimate）ボタンを押して前提の数値を入力します。
5. 『コストの計算』（英語表記：Calculate cost）ボタンを押すと、下記画面のとおり料金見積結果が表示されます。__月額 $30.44__　（※2021/12/22時点）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864295/e9bae0e5-f07d-29ba-d956-faf63d8c9062.png)

# 3.  単価を元に自分で計算して見積ってみる
VPCの単価は[VPC料金ポータル](https://www.ibm.com/cloud/vpc/pricing)で公開されています。この単価を用いて計算することで料金を見積ることができます。カタログを開くことなく簡易的に見積ることができますが、適宜、料金ポータルにて最新価格を確認ください。

######VPC料金ポータルの見方
リンク：https://www.ibm.com/cloud/vpc/pricing 
＊ネットワーク・ロード・バランサーの単価は①で”Network”を選択ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864295/177fdad8-2ea3-218c-f6e9-6358af8e9367.png)

#####計算例
【単価】（※2021/12/22時点）
● Instance hours price（サービス使用時間）：USD 0.028 / hour 
● Data processed price（処理データ量）：USD 0.009 / GB 
● Floating IP：USD 1.00 （1個あたりの単価）

【前提】
前述のコスト見積ツールと同じ前提とします。

【計算】
（ サービス使用時間 ）＋ （ 処理データ量 ）＋（ Floating IP ）
 USD 0.028 × 730時間 ＋ USD 0.009 × 1000 GB ＋ USD 1.00 = USD 30.44 　__月額 $30.44__

# 4. Public通信ありのロード・バランサーの場合はOutbound料金も忘れないように見積ってください
ロード・バランサーの課金要素ではありませんが、Public通信におけるIBM Cloud から外向きのOutbound通信は課金されますので、料金の見積を忘れないようにお願いします。

######VPC料金ポータルの見方
リンク：https://www.ibm.com/cloud/vpc/pricing 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864295/ec190067-00f3-c329-9c82-8b9469adaa20.png)

#####計算例
【単価】（※2021/12/22時点）
● Internet data transfer：USD 0.098 / GB  

【計算】
Outboundデータ転送量が1000 GB / 月の場合は、下記の計算式となります。
（5GBまでは無料ですが、無料枠は考慮しないで計算しています。）

 USD 0.098 × 1000GB = USD 98 　__月額 $98__
JavaScriptにおける、同期・非同期通信の違い

# 同期・非同期通信の違い
**・３行で要約します**

```
同期通信では、受け取ったHTMLを表示させるため、ブラウザではページ全体を再読み込みします。
Ajaxを用いた非同期通信のレスポンスでは、JSON形式のデータそのものを返しています。
データそのものを受け取って、ページの一部分のみを更新するため、ブラウザでページ全体を再読み込みしなくてよい
```

## レスポンスで返される内容が違う

同期通信のレスポンスでは、ビューファイル（index.html.erb）をもとに生成された<font color="Red">HTML</font>を返していました。
受け取ったHTMLを表示させるため、ブラウザではページ全体を再読み込みします。

非同期通信のレスポンスでは、<font color="Red">JSON形式</font>のデータ（ページの一部分）を返しています。

## 操作性が違う
非同期通信を実装することで<font color="Red">よりよい応答性、操作性</font>を実現できる
データの読み込みなどの待ち時間の短縮
「他の人はこちらも検索」をublock originでブロックする(備忘)

## 問題
- Chrome + Googleで何かを検索していると、検索結果の下に「他の人はこちらも検索」というアコーディオンメニューが表示され、  
  しかも他の検索結果がスライドしてしまいミスクリックを引き起こすことがあります。  
<img width="768" alt="Search for.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125923/a52389ec-759b-be5f-b7fb-0d46ee9c219c.png">

## 既知の解決策とその問題
- 「他の人はこちらも検索」を無効化するためのChromeアドオンとして [No search for](https://chrome.google.com/webstore/detail/no-search-for/gfilnngoaebchcnkmppbnijaakeccdjc?hl=ja) が配布されていましたが、最終更新日は2018年2月18日となっており、現在の仕様では「他の人はこちらも検索」を非表示にすることができなくなってしまいました。

## 解決案
- [ublock origin](https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm?hl=ja) のワイルドカード機能を用いてブロックします。
    - ublock origin → ダッシュボードを開く(歯車マーク) → Myフィルター のタブを開き、```www.google.com##[id^="eob_"]```を追加して保存します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125923/fff011fa-6e8a-f970-d2e0-0a1f58de7053.png)
    - 以降、検索結果に「他の人はこちらも検索」が表示されなくなります。

## おわりに(STUB)
- その他の解決策がありましたらコメントにてお知らせください。
【Rails】references型について

##references型とは
references型は新しく作成するテーブルのカラムに、作成済みのテーブルを指定する場合に使う。
>既存のテーブルを参照するので、reference（参照という意味）。

##references使用法
referencesは``rails g model``で、モデルとマイグレーションファイルを生成する時のカラムの型を指定するときに使う。``モデル名(小文字):references``の形で指定。

```
コマンド例：　（userテーブルと紐付けたい、postテーブルを作成）
rails g model post name:string body:string user:references
```

上記のコマンドを実行すると、
**①** reference型を指定したカラム名は テーブル名_id となる。
（user:reference であれば、 user_id というカラムが生成される）

**②** referencesを指定したことで、生成されたモデルファイルに``belongs_to :user``が追加される。

```
class Post < ApplicationRecord
  belongs_to :user
end
```
**belongs_toとは**
belongs_toとは他のテーブルとの関係性を示すもので、自分のテーブルが指定したテーブルの下に紐づいている（属している）ことを示す。

モデルの中で ``belongs_to :モデル名(単数形)``として指定される。

親となるテーブルには、下に複数のテーブルが紐づくことを示すために、``has_many :モデル名(複数形)``を記述。

referencesを使えば、belongs_toは自動で記述されるが、**has_manyはつかないので、自分で記述する必要がある。**


**③** マイグレーションファイルにも特別な記述が入る。

```
#この一文が追加される。
t.references :テーブル名, null: false, foreign_key: true
```

``t.references``
カラムが他のテーブルを参照していることを示す。

``null: false``
NULL値、つまり空欄を許可しないという指定。

``foreign_key: true``
外部キーであることを示している。


```
マイグレーション例：

class CreatePosts < ActiveRecord::Migration[6.1]
  def change
    create_table :posts do |t|
      t.references :user, null: false, foreign_key: true
      t.string :name
      t.string :body

      t.timestamps
    end
  end
end
```

**foreign_key（外部キー）とは**
外部キーとは指定したカラムの自由な記述を許可せず、指定したカラムの値のみしか使えないようにする制限のこと。

指定するには、マイグレーションファイルで、対象のカラムのオプションとして、foreign_key: true を追記。

***

``rails db:migrate``をいつも最後に実行するのを忘れてしまうので、忘れないこと。

##参考記事
[【Rails】references型とは何か？わかりやすく解説。外部キー(foreign_key)とは？belongs_toやhas_manyの意味と実例](https://prograshi.com/framework/rails/references_and_foreign-key/)
Kubernetes the hard wayする ~2.CA、秘密鍵、及び証明書作成編~

# はじめに
本記事は「[Kubernetes the hard wayする ~1.Compute Resources展開編~
](https://qiita.com/uS_aito/items/3764cfa71f1284a52dde)」の続きです。CKA取得を目指し、Kubernetes the hardwayに取り組んだ際、各章で何をやっているのかをメモしたものを投稿していきます。
本記事では元ドキュメントの「Provisioning a CA and Generating TLS Certificates
」の部分をやっていきます。元ドキュメント及びコマンド等は以下のURLを参照のこと。
https://github.com/kelseyhightower/kubernetes-the-hard-way/blob/master/docs/04-certificate-authority.md

# CA作成
今回作成するKubernetesクラスタで使用するCA証明書と秘密鍵を作成する。この証明書はこのクラスタ上でのみ真正性が確認できれば良いため、インターネット上で使用される証明書と異なり、どこかの証明機関から署名を受ける必要はない。

:::note info
今回作成するCA証明書をはじめ、Kubernetes the hardway上で作成する証明書と秘密鍵はcfssl及びcfssljsonを使用して作成する。cfsslはopensslで証明書などを作成する操作をjsonで宣言的に行うことができるツールで、cfssljsonはcfsslの出力をpemなどの一般的な証明書や秘密鍵用のファイルフォーマットに変換するためのツールである。
:::

まずCAを作成するための設定ファイル(`ca-config.json`)を作成する。このファイルはCA証明書の有効期間などの情報を含んでいる。次に、CA証明書のCSR作成用の設定ファイル(`ca-csr.json`)を作成する。このファイルでは証明書を使用するユーザの組織や所在国を設定する。外部に公開される証明書ではないので、日本在住でも元ドキュメント通りに設定して構わない。
次に、作成した設定ファイルを使用して秘密鍵と公開鍵の作成、及び証明書の作成を行う。`cfssl gencert`コマンドで秘密鍵と公開鍵の作成、CSR要求の作成、及び証明書の発行まで一気に行える。その結果を`cfssljson`コマンドでpemファイルに変換する。
一通りの操作を終えると`ca-key.pem`ファイルと`ca.pem`ファイルが作成される。`ca-key.pem`ファイルにはCA用の秘密鍵が、`ca.pem`ファイルにはCA用の証明書が保存されている。

# クライアント用証明書と各コンポーネント用証明書の作成
クライアント用の証明書と、Kubernetesの各コンポーネント用証明書を作成する。Kubernetesでは各コンポーネント及びユーザはクライアント証明書で認証するため、これらの証明書は先ほど作成したCA証明書で署名されている必要がある。
はじめにクライアント用証明書を作成する。このクライアントとは、`kubelet`コマンドでクラスタを操作する際に使用する`admin`ユーザのことを指す。まず`admin`ユーザ用のCSR作成用の設定ファイル(`admin-csr.json`)を作成し、秘密鍵と証明書を作成する。この時、`cfssl`コマンドにCAの証明書と秘密鍵を渡し、`admin`ユーザ用の証明書に署名している。

次に、各ワーカーノードのkubelet用の証明書を作成する。今回作成するKubernetesクラスタではNodeの認証に`Node Authorizer`という認証モードを使用する。`Node Authorizer`で各ノードを認証するため、各証明書のCNに`system:node:<instance-name>`を指定する必要がある。

その後、`kube-controller-manager`、`kube-proxy`、`kube-scheduler`の証明書を作成する。これらは概ね同じ手順で作成される。CSR要求のCNだけ異なり、`system:<component-name>`になっている。

次に、`kube-apiserver`用の証明書を作成する。この時、ホスト名としてapiserverのクラスタ内でのDNS名、LB用Public IP、各コントロールプレーン用VMのIP、及び`10.32.0.1`を設定する。この`10.32.0.1`というアドレスは`kubernetes`clusterIP serviceのアドレスで、clusterIP用に予約されたアドレスレンジの中の、一番最初のアドレスが使用される。

:::note info
clusterIP用に予約されるアドレスレンジは、コントロールプレーン作成時にkube-apiserverバイナリの--service-cluster-ip-rangeというオプションで指定する。
:::

最後に、Service Account用の証明書を作成する。この証明書はSAが認証用に使うトークンを署名するために、`kube-controll-manager`が使用する。

# 作成した証明書の配布
各ワーカーノードにルート証明書(`ca.pem`)と各workerノード用の証明書(`worker-X.pem`)と秘密鍵(`worker-X-key.pem`)を配布する。
次に、各コントロールプレーンノードにルート証明書(`ca.pem`)と秘密鍵(`ca-key.pem`)、`kube-apiserver`用の証明書(`kubernetes.pem`)と秘密鍵(`kubernetes-key.pem`)、Service Account用証明書(`service-account.pem`)と秘密鍵(`service-account-key.pem`)を配布する。
その他の証明書は`kubeconfig`ファイルを作成するために使用するため、配布しない。

# まとめ
Kubernetesクラスタ全体で使用されるCA証明書及び秘密鍵と、この秘密鍵で署名されるユーザ用証明書及び各コンポーネント用証明書を作成し、一部を各ノードに配布した。配布しなかった証明書は、今後`kubeconfig`ファイルを作成するために使用する。
SSMSインストール パッケージ無限読込編

# はじめに
どうも、ATLのヴィリアスです。

ローカル環境にデータベースを構築しようと思い、SSMSをインストールしていたら
一向に**パッケージ読み込みが終わらなくなる**問題が発生しました。

「調べれば先例ぐらいあるやろ」と思って検索しても日本語の記事がヒットせず、
解決に時間がかかってしまいました。(英語で調べたら即ヒットしました)

そのため、今後私と同じような問題が発生した人のために、ささやかですが記事を書きます。

**※無限読込"編"となっていますが、シリーズものではないです。単発記事！です！**
**※免責事項(必ず、ご一読ください)**
　　本記事の情報により生じた、いかなる損害や損失についても、当社は一切の責任を負いかねます。
　　また、誤情報が入り込んだり、情報が古くなったりすることもありますので、
　　必ずしも正確性を保証するものではありません。ご了承ください。

# 環境
| 製品名 | バージョン |
|:--|:--|
| [SQL Server](https://www.microsoft.com/ja-jp/sql-server/sql-server-downloads?rtc=1)  | 15.0.2000.5 |
| [SQL Server Management Studio (SSMS)](https://docs.microsoft.com/ja-jp/sql/ssms/sql-server-management-studio-ssms?view=sql-server-ver15) | 18.10 |

# 問題
SSMSセットアップ (**SSMS-Setup-JPN.exe**とか) を実行すると、
いきなり次のような画面になり、**パッケージ無限読込編が始まります。**
![パッケージ読込中.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124150/ae8865ff-4895-72c5-693e-c5724b562ccf.png)
中央の進捗バーはあたかも「パッケージ読み込んでるんで、ちょっと待ってね～」と言わんばかりに
動きまくりですが、**待てども待てども読み込みは完了しません**。(1時間待ちました)

また、ウィンドウを閉じようとしても**キャンセルボタンが反応しないので、
タスクマネージャーからタスクを終了させる必要があります**。

## 補足: 本来は…
ちなみに本来は、まず最初に次のような画面がでます。
![本来の最初のインストール画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124150/835c8f4a-e187-f1fd-425f-9e21c978193a.png)
下のインストールボタンを押すと、先ほどのパッケージ読込画面になり、
SSMS関連コンポーネントがどんどんインストールされていきます。

# 解決策
以下、問題解決した際の手順です。

1. ローカルの**Tempフォルダー (`C:\Users\<ユーザー名>\AppData\Local\Temp`) を空にする**。 ※AppDataは隠しフォルダー
1. レジストリエディターにて、<br>`HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SQL Server Management Studio`を削除する。<br>(管理者権限付きコマンドプロンプトから削除しても良い) **※レジストリをいじるので注意**
1. SSMSセットアップを**管理者権限付きで実行**する。
1. 無事にSSMSがインストールされる。

※私の場合、**PCを再起動**しても何の効果もありませんでしたが、
色々やる前にまず再起動してみると良いかもですね。

## 補足: レジストリキー削除コマンド

```
reg DELETE “HKLM\SOFTWARE\WOW6432Node\Microsoft\Microsoft SQL Server Management Studio” /reg:32
```

#考察: なぜ発生したのか？
過去に「**SSMSのインストール中、タスクを落としてしまったから**」だと思われます。

SSMSセットアップを実行した後、
「インストール先の設定画面が表示されるのではなく、**いきなりパッケージ読込画面になる**」
といった挙動から推測するに、以前パッケージ読込中にPCのシャットダウンや再起動によって
**タスクが不完全に中断されてしまった**のでしょう。

そして、中断された場所から再開しようとした結果、無限読込編が始まってしまったのだと思います。

#おわりに
とりあえず、これで私は無事にSSMSをインストールできました。

何かググるときは日本語だけでなく、**英語でもググる**ようにしましょう。
高確率でお目当てのものがヒットします。

それではまた、次の記事で。

# 参考にしたもの
- [Installing SSMS 18 won't go past "Loading Packages" phase - Msdn forums](https://social.msdn.microsoft.com/Forums/sqlserver/en-US/88eac0f2-f97f-4e44-bb98-f8341dfe3bce/installing-ssms-18-wont-go-past-quotloading-packagesquot-phase?forum=vssetup)
- [Re-solve how to install SSMS - Stack Overflow](https://stackoverflow.com/questions/61674475/re-solve-how-to-install-ssms)
ABC81メモ

# ABC81 メモ
## [A - Placing Marbles](https://atcoder.jp/contests/abc081/tasks/abc081_a)

s1,s2,s3がそれぞれ1であれば1を足す、0であれば何もしない、ので、各文字を数字として足していく。

```python:81A.py
s = input()

ans = 0
for i in range(3):
    ans += int(s[i])

print(ans)
```

## [B - Shift only](https://atcoder.jp/contests/abc081/tasks/abc081_b)

数列の各要素のうち、2で割り切れる回数が最小のものの、その回数が答えとなるので、各要素を2で割り切れなくなるまで割り続け、その回数が最小のものを答えとする。<br>
計算量は$O(N\log(\max(A_i)))$より、今回の制約では十分間に合う。

```python:81B.py
N = int(input())
Alst = list(map(int, input().split()))

ans = float('inf')
for i in range(N):
    A = Alst[i]
    cnt = 0
    while A%2 == 0:
        A //= 2
        cnt += 1

    ans = min(ans, cnt)

print(ans)
```

## [C - Not so Diverse](https://atcoder.jp/contests/abc081/tasks/arc086_a)

書き換える個数を少なくしたいので、個数が多い数字は変えない方が良い。そのため、各数字の個数をカウントして、個数が多い方から$K$種類だけそのままにしておく。それ以外の数字を、数が多い数字に変更すれば良い。<br>
よって、個数が多い方から$K$種類の数字の個数の合計を$N$から引けば良い。<br>
計算量は$O(N)$。

```python:81C.py
N, M = map(int, input().split())

lst = []
N, K = map(int, input().split())
Alst = list(map(int, input().split()))

lst = [0]*(N+1)

for i in range(N):
    lst[Alst[i]] += 1

lst.sort(reverse=True)

ans = N - sum(lst[:K])
print(ans)
```


## [D - Non-decreasing](https://atcoder.jp/contests/abc081/tasks/arc086_b)

最初は、隣接する項の間で大小関係を比較して、操作を行えば良いと考えた。大小関係が逆の場合、両方とも非負なら右の項に左を足す、両方とも負ならば左の項に右の項を足す、そうでなければ絶対値の小さい方に絶対値の大きい方を二回足す、といった方法を考えた。この場合、左から順に操作をした場合、左の項を変化させた場合に条件を満たさなくなる場合がある。<br>
全ての項が非負、または全ての項が負の場合であれば、変化する項が一方向であるので、いかにして全ての項の符号を合わせるかを考えた。このとき、絶対値が最も大きいものが正であれば、それぞれの項に足してあげれば、正にできる。逆に、絶対値が最も大きいものが負であれば、それぞれの項に足してあげれば、負にできる。<br>
符号を揃えた後は、上の操作を行うことで、解くことができる。


```python:81D.py
N = int(input())
alst = list(map(int, input().split()))

ans = []
M = -float('inf')
m = float('inf')
a_M = 0
a_m = 0

for i in range(N):
    if M < alst[i]:
        a_M = i
        M = alst[i]

    if m > alst[i]:
        a_m = i
        m = alst[i]


if M + m >= 0:
    for i in range(N):
        if i != a_M:
            ans.append([a_M, i])
            alst[i] += M

    for i in range(N-1):
        a_i = alst[i]
        a_j = alst[i+1]

        if a_i > a_j:
            alst[i+1] += a_i
            ans.append([i, i+1])

else:
    for i in range(N):
        if i != a_m:
            ans.append([a_m, i])
            alst[i] += m

    for i in range(N-1, 0, -1):
        a_i = alst[i-1]
        a_j = alst[i]

        if a_i > a_j:
            alst[i-1] += a_j
            ans.append([i, i-1]) 

print(len(ans))
for x, y in ans:
    print(x+1, y+1)
```
nginx に laravel 8 を インストール

1.フォルダへ移動
2.twikon.clubフォルダを自動で新規作成
3.その中にlaravelをインスコ


```

cd /var/www/html/
composer create-project laravel/laravel twikon.club


```


# アクセス権を設定し、リネーム

```

chmod 0755 twikon.club
cd twikon.club

//リネーム
mv server.php index.php

//ログ書き出せないってエラーが出るので
chmod -R 777 storage

```

たったこれだけでOK。
arsitanっていうビルトインサーバーは使わないので
server.phpをindex.phpに変更。

nginxの設定

```

server {
    server_name twikon.club;


location / {
       root  /var/www/html/twikon.club/public;
       index index.php index.html index.htm;
# get や post の値が取得できない場合はここで調整
#       try_files $uri $uri/ /index.php$query_string;
       try_files $uri $uri/ /index.php$is_args$args;
}


location ~ \.php$ {

       fastcgi_pass   unix:/var/run/php-fpm/www.sock;
       fastcgi_index  index.php;
# fastcti_param の フォルダ名を変更するの忘れずに
       fastcgi_param  SCRIPT_FILENAME /var/www/html/twikon.club$fastcgi_script_name;
       include        fastcgi_params;
 }


//SSLの設定とか
}

```


`OK`