OmniAICreator/Qiita-1.07M huggingface dataset:
【C++】数値の明示的な切り上げ/切り捨て/四捨五入

# static_cast
例えば以下のようなコードがあるとする。
```cpp
#include <iostream>

int main(void)
{
    float a = 2.9;
    
    std::cout << "a: " << static_cast<int>(a) << std::endl;
    
    return 0;
}
```
**結果**
```
a: 2
```

`2.9`が`int 2`にキャストされ、`0.9`の誤差が生じることになる。

それはまずいので**明示的**に 切り上げ/切り捨て/四捨五入 をC++標準ライブラリを用いて行う。

# std::ceil (切り上げ)
```cpp
#include <iostream>
#include <cmath>    // これが必要

int main(void)
{
    float a = 2.9;
    
    std::cout << "a: " << std::ceil(a) << std::endl;
    
    return 0;
}
```
**結果**
```
3
```
これで3に切り上げができたが、問題がある。
2.1を切り上げるとどうなるだろうか見てみよう。
```cpp
#include <iostream>
#include <cmath>    // これが必要

int main(void)
{
    float a = 2.1;
    
    std::cout << "a: " << std::ceil(a) << std::endl;
    
    return 0;
}
```
**結果**
```
3
```
また誤差が`0.9`ある。

# std::floor (負の方向に切り捨て)
```cpp
#include <iostream>
#include <cmath>    // これが必要

int main(void)
{
    float a = 2.1;
    
    std::cout << "a: " << std::floor(a) << std::endl;
    
    return 0;
}
```
**結果**
```
2
```
これで2に切り捨てができたが、**static_castと明確に違う点**がある。
それは、std::floorは常に負の方向に切り捨てを行う。
static_castは**常に0に向かって切り捨て**を行う。
**static_castの場合、**
```cpp
float a = 2.5;
float b = -2.5;
std::cout << "a: " << static_cast<int>(a) << std::endl;
std::cout << "b: " << static_cast<int>(b) << std::endl;
```
**結果**
```
a: 2
b: -2
```
となるが
**std::floorの場合、**
```cpp
float a = 2.5;
float b = -2.5;
std::cout << "a: " << std::floor(a) << std::endl;
std::cout << "b: " << std::floor(b) << std::endl;
```
**結果**
```
a: 2
b: -3
```

**常に負の方向に切り捨て**されることに注意して使う必要がある。

# std::trunc (0の方向に切り捨て)
実は常に0の方向に切り捨てを明示的に行える。
```cpp
#include <iostream>
#include <cmath>    // これが必要

int main(void)
{
    float a = 2.5;
    float b = -2.5;
    
    std::cout << "a: " << std::trunc(a) << std::endl;
    std::cout << "b: " << std::trunc(b) << std::endl;
    
    return 0;
}
```
**結果**
```
a: 2
b: -2
```
static_cast<int>との違いは後ほど。

# std::round (四捨五入)
いよいよ四捨五入です。
```cpp
#include <iostream>
#include <cmath>    // これが必要

int main(void)
{
    float a = 2.4;
    float b = 2.5;
    
    std::cout << "a: " << std::round(a) << std::endl;
    std::cout << "b: " << std::round(b) << std::endl;
    
    return 0;
}
```
**結果**
```
a: 2
b: 3
```
ぶっちゃけこいつが一番使うと思います。
`-2.4`を渡すと`-2`に、`-2.5`を渡すと`-3`が得られます。


# static_cast<int>と明確な違い

static_castはキャスト(型変換)を行っているので、float型からint型に変換されています。
しかし、上で説明した 切り上げ/切り捨て/四捨五入 は型変換を行っていません。
なのでいくら`float a = 2.5`を`std::round`で`3`にしようと`3.0`となっているだけです。
ここはしっかりと理解した上で使う必要があります。
【Windows】パッケージ管理ツール（Scoop）の紹介

## 前置き
Windows上で開発をする際に、何を入れたのか、なんのバージョンを入れたのかわからんくなることがあるので、`Scoop`というパッケージマネージャーを使って、管理してみました。

## Scoopとは何か？
Windows向けのCLI操作が可能なパッケージマネージャーです。
類似製品に、chocolatelyがありますが、scoopのほうが使い勝手はよさそう

## インストール

1. スタートボタンを右クリックを押下し、「ターミナル」を選択します
1. 以下のコマンドを転記

```powershell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
```

## 使い方

### アップデートする
```bash
scoop update # scoopそのものを更新する
scoop update {library} # libraryを更新する
scoop update * # すべてのパッケージを更新する
```

### パッケージを検索

```bash
scoop search python
```

### パッケージをインストール
```bash
scoop install {library}
```

### インストール済みのパッケージをリスト化
```bash
scoop list
```

### パッケージをアンインストール
```bash
scoop uninstall {library}
```

## まとめ

scoop listでインストールしたものがわかります。
また、使わなくなったらすぐ削除できるので、リソース削減にもなり、便利でした。
よかったらつかってみてください。
交換方式の交換制御パラメタとは

| 交換方式         | パケットサイズ           | 交換制御パラメタ                                        | 
| ---------------- | ------------------------ | ------------------------------------------------------- | 
| ATM交換方式      | ５３バイトの固定長データ | 仮想チャネル識別子（VCI）                               | 
| パケット交換方式 | 可変長                   | 論理チャネル番号（LCN）、論理チャネルグループ番号(LCGN) | 

交換制御パラメタの違いがわからない

### 交換制御パラメタとは？
>`接続相手(回線)を識別`するための情報。`複数の論理的な回線を設定`することで、物理的には一本の回線しかもたなくても、`多重通信`を行うことができる。

https://gihyo.jp/book/2023/978-4-297-13865-3

VCIやLCNやLCGNとは何か？
### VCI:Virtual Channel Identifier（仮想チャネル識別子）とは？
>VC（仮想チャネル）を`識別するための番号`です。ユーザは`通信ごとに端末間にVCコネクションを設定`し、ATMセルのやり取りを行う。なお、VPは`品質種別や経路が同じ複数のVC（仮想チャネル）を集めた`ものである。`各セルには対応するVPI/VCIが必ず設定`させる

https://www.ieice-hbkb.org/files/05/05gun_04hen_03.pdf

### VC（仮想チャネル）とは？
上の出典の資料の図を見ると光ファイバの中にVPという管のなかに仮想チャネルの線が３本通っていることがわかる

#### チャネルとは？
>どちらも意味は「`データの通り道`」
　結論から言うと，チャネルもチャンネルも語源は英単語のchannelで，意味も同じです。両者の違いは，発音だけです。channelの意味は，英和辞書のはじめの方には「海峡」や「水路」などと書かれています。また，「情報が流れる道筋」や「電信の通信路」などとも記載されています。つまり，チャンネルもチャネルも，意味は「データの通り道」というわけです。

https://xtech.nikkei.com/it/article/COLUMN/20060228/231030/#:~:text=%E3%81%A9%E3%81%A1%E3%82%89%E3%82%82%E6%84%8F%E5%91%B3,%E3%81%A8%E3%81%84%E3%81%86%E3%82%8F%E3%81%91%E3%81%A7%E3%81%99%E3%80%82

仮想チャネルとは仮想的伝送路のこと。
ATM交換方式は５３バイトに小分けしているので複数の伝送路持っているように見える。
伝送路を識別するものをVCIという。

### VP（仮想パス）とは？
>品質種別や経路が同じ複数のVC（仮想チャネル）を集めたもの

https://www.ieice-hbkb.org/files/05/05gun_04hen_03.pdf

行き先まで一緒なのだろうか？

### 論理チャネル番号（LCN）、論理チャネルグループ番号(LCGN)とは？
>論理チャネルグループ番号（LCGN)と論理チャネル番号（LCN)はバーチャルサーキットを識別するための識別子である。

https://www.ieice-hbkb.org/files/05/05gun_04hen_03.pdf

>論理チャネルを利用する際に使う識別番号の一つ。LCNと共に用いる。

https://www.wdic.org/w/WDIC/LCGN
>論理チャネルを利用する際に使う識別番号の一つ。LCGNと共に用いる。

https://www.wdic.org/w/WDIC/LCN

#### バーチャルサーキットとは
>発信端末は、網に対して発呼要求パケットCRを送信する。ネットワークは、網内の設定を行った後、着信端末に対して、着呼パケットINにより着呼を通知する。着信端末が着信を受け付けると、網に対して着呼受付パケットCAを返送する。CAパケットを受け取った網は、接続完了パケットCCを発信端末に送信し、バーチャルサーキットの設立を完了する。

https://www.ieice-hbkb.org/files/05/05gun_04hen_03.pdf

# 感想
パラメタの説明がほとんど同じ意味に思える

バーチャルチャンネルとバーチャルサーキットは同じ

https://e-words.jp/w/%E4%BB%AE%E6%83%B3%E5%9B%9E%E7%B7%9A.html
### どういう風に接続相手を識別するのか？
識別子を使う。
### 論理的な回線とは？
仮想チャネルの説明で理解できる。

### 一本で複数の論理的回線をするとはどういうことか？
仮想チャネルの説明で理解できる。
PLATEAUや点群データのアカデミックな利用について

# はじめに

10月26〜27日に京都大学宇治キャンパスで開かれた第33回地理空間情報システム学会学術研究発表大会に参加。PLATEAUや点群データのアカデミックな利用について注目して聴講しました。

## セッション：地域分析１

ProjectPLATEAUのデータを使った発表が1件ありました。

### 多様な地理空間情報を活用した京都市内の京町家分布の時空間的変容

立命館大学の学生さんの発表。「[京町家まちづくり調査](https://www.city.kyoto.lg.jp/tokei/page/0000087658.html)」に関して滅失の検証をゼンリンの建物データとPLATEAUの建物データを活用して行っていました。

## セッション：3次元データ

ProjectPLATEAUのデータを使った発表が2件ありました。

### 「PLATEAUを用いた過去の3D都市モデルの構築」

京都産業大学の先生の発表。過去の建物を米軍が1946年撮影した空中写真を活用して再現構築する研究。PLATEAU建物データに建築年の属性を付与して1946年時点で存在する建物を抽出し、別に用意した京都市明細図の建物データと比較して差分となる建物を抽出するといったことに利用していました。

### 「3D都市モデルを用いた歩行空間ネットワークデータ整備効率化の検討」

アジア航測さんの発表は2022年度のPLATEAUユースケース開発「[エリアマネジメント・ダッシュボードの構築](https://www.mlit.go.jp/plateau/use-case/uc22-028/)」に関連した報告。PLATEAUの道路データから歩行空間ネットワークデータを生成するもので、現在のCityGMLに含まれている属性では、幅員が活用できるものの、それ以外の属性が足りていないという話。

## セッション：GISの可能性

VIRTUAL SHIZUOKAの点群データを使った研究が1件ありました。

### 「近世絵画史料『公余探勝図巻』風景モチーフの写実性の検証」

東海大学の生成の研究「景観視点場推定表示システム」に点群データを組み合わせたもの。絵画に描かれた風景の視点の場所を割り出して点群データと重ね合わせていました。


#### 参考文献
- [近世絵画史料から見る景観視点場の推定表示システムの構築](https://www.gisa-japan.org/content/files/conferences/proceedings/2021cd/papers/C31-1-5.pdf)


## ポスター

沼津高専の学生さんが「オープンデータを用いた静岡県東部伊豆地域における土砂災害可能性マップの作成」という発表をしていました。VIRTUAL SHIZUOKAの点群データを活用していました。

# まとめ

企業や自治体などがPLATEAUや点群データを活用しようとするとワンパターン（失礼！）になりがちですが、アカデミックな分野では意外な活用法があって感心してしまいました。他にも活用事例が無いか探してみたいと思います。
【個人メモ】Ruby on Rails チュートリアル 第2章

Ruby on Railsチュートリアルで学んだ内容を個人的なメモとして簡単にまとめたものです

# 個人メモ
- scaffordコマンド
データモデルに関するコードを自動生成する
rails generate scaffold リソース名 データモデルの属性
- データベースのマイグレート
rails db:migrate
- RailsにおけるMVC
　1. ブラウザから送られたリクエストはRailsのルーティング機構によりControllerのアクションに割り当てられる
　2. アクションの実行により、ModelとDBでデータのやり取りが行われる
　3. Controllerは取得したデータをViewへ渡し、生成されたhtmlファイルをブラウザへ返す
- RESTとは
REpresentational State Transfer
データベースとHTTPの操作に対応したCRUD機能を作成することでアプリケーションを実現する
- ユーザー用のリクエストをUsersコントローラーのアクションに割り当てを行うコード
resources :users
- テーブル同士の関連付け（ユーザーは複数のポストをもっている）
has_many :microposts
belongs_to :user
OpenSSL3をRockyLinux8.9にインストール

## 背景
Gitlabを運用しているサーバで、Gitlabのバージョンアップ時に以下のメッセージを読んだため、Gitlabをバージョンアップする前にインストール手順を確認しておきたかった。<br>
Starting from version 17.7,
GitLab uses OpenSSL 3. This version of OpenSSL is a major release with notable
deprecations and changes to the default behavior of OpenSSL (for more details
see the OpenSSL 3 migration guide).
Some of the older versions of TLS and cipher suites for external integrations
may not be compatible with these changes. Therefore, it is crucial that you
assess the compatibility of your external integrations before upgrading to a
GitLab version that uses OpenSSL 3.
出典：https://gitlab.com/gitlab-org/omnibus-gitlab/-/blob/17.5.0+ce.0/doc/settings/ssl/openssl_3.md
## 環境
Rocky Linux8.9
GitLabはhttpで運用していて、sslは使用していない
テスト環境でまずはOpenSSL3のインストールを行ってみた
## 手順
```
$ sudo dnf upgrade openssl
$ openssl version
$ sudo dnf install epel-release
$ sudo dnf update
$ dnf search openssl　<= これでOpenSSL3があることがわかった
$ sudo dnf install openssl3 openssl3-libs
$ openssl version <=  これではOpenSSL1が表示される
OpenSSL 1.1.1k  FIPS 25 Mar 2021
$ openssl3 version　<= こちらでインストールできたことを確認
OpenSSL 3.2.2 4 Jun 2024 (Library: OpenSSL 3.2.2 4 Jun 2024)
```
## 補足
#### OpenSSL3と1
OpenSSL3はdnf installでインストールできますが、すでにインストールされている1.1.1が3.x.xになるのでなかった。（たとえが正しいのかわかりませんが）Python2とPython3の関係のように思えました。
#### 今後の確認
「Starting from version 17.7,GitLab uses OpenSSL 3.」とありますが、この記事を書いた時点での最新版は17.5.1です。
17.7にバージョンを上げたときに、OpenSSL3が必須となるのかは不明です。<br>
JSON gemのアップデートで「Wrong number of arguments (given 2, expected 1)」エラーを解決

### はじめに
Rubyを使用しているとき、以下のエラーに遭遇したことがあるかもしれません。

```
Wrong number of arguments (given 2, expected 1)
```

この記事では、エラーの原因とその解決方法について解説します。

### 症状
以下のようなエラーメッセージが表示されることがあります。

```
Wrong number of arguments (given 2, expected 1)
```

### 原因
このエラーは、`json` gemの特定のバージョンで、メソッドの引数の仕様が変更されたために発生します。Rubyや他のgemと互換性が取れなくなり、正しく動作しない場合があります。

### 解決方法
この問題を解決するには、`json` gemをアップデートして最新バージョンにすることです。

```bash
# json gemを最新バージョンにアップデート
bundle update json
```

または、`Gemfile`で明示的にバージョンを指定してから再インストールします。

```ruby
gem 'json', '~> 2.6'
```

その後、以下のコマンドを実行します。

```bash
bundle install
```

### まとめ
`Wrong number of arguments` エラーが発生した場合、`json` gemのバージョンを確認し、アップデートすることで解決できる可能性が高いです。このようなエラーに直面したら、gemの互換性を確認し、適切にアップデートしましょう。


この記事が、同じエラーに悩む開発者の参考になれば幸いです。もし役に立った場合は、いいねやストックをお願いします！
【Laravel】Debugbarを使用すると下部に空白が生まれる


https://github.com/barryvdh/laravel-debugbar

これ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/e675708e-608e-c93c-c855-c0dbb9a8d7e3.png)





## 直し方

調べてみると Debugbar が勝手に margin を追加してるみたい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/190ff4f9-969d-e200-2e05-f17cd8b50a20.png)


`app.blade.php` にて `body` タグにマージン0を埋め込もう

```diff_html:resources/views/app.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 inertia>{{ config('app.name', 'Laravel') }}</title>

          <!-- Fonts -->
          <link rel="preconnect" href="https://fonts.bunny.net">
          <link href="https://fonts.bunny.net/css?family=figtree:400,500,600&display=swap" rel="stylesheet" />

          <!-- Scripts -->
          @routes
          @vite(['resources/js/app.ts', "resources/js/Pages/{$page['component']}.vue"])
          @inertiaHead
      </head>
-     <body class="font-sans antialiased">
+     <body class="font-sans antialiased !m-0">
          @inertia
      </body>
  </html>
```




## 追加調査

https://github.com/barryvdh/laravel-debugbar/issues/1364

更に調査すると、このマージンは `php-debugbar` のもので、スクリプトで制御できるみたい

```diff_html:resources/views/app.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 inertia>{{ config('app.name', 'Laravel') }}</title>

          <!-- Fonts -->
          <link rel="preconnect" href="https://fonts.bunny.net">
          <link href="https://fonts.bunny.net/css?family=figtree:400,500,600&display=swap" rel="stylesheet" />

          <!-- Scripts -->
          @routes
          @vite(['resources/js/app.ts', "resources/js/Pages/{$page['component']}.vue"])
          @inertiaHead
      </head>
      <body class="font-sans antialiased">
          @inertia
          
+         @if (config('app.debug'))
+             <script>
+                 PhpDebugBar.DebugBar.prototype.recomputeBottomOffset = () => {};
+             </script>
+         @endif
      </body>
  </html>
```

こっちのほうが綺麗かも
CarrierWaveで「can't resolve image into URL」エラーと解決方法

### はじめに
CarrierWaveで画像を表示しようとしたとき、以下のようなエラーに直面することがあります。

```
can't resolve image into URL (undefined method `to_model' for #<CarrierWave::Uploader::Base>)
```

この記事では、なぜこのエラーが発生するのか、そしてその解決方法について説明します。

### 症状
これまでは、以下のように `.url` を省略して画像を表示できていたのが、

```erb
<%= image_tag @user.avatar %>
```

アップデート後に上記のコードでエラーが発生するようになりました。

### 原因
CarrierWaveのアップローダーオブジェクトが直接URL文字列を返さなくなり、`.url` を使ってURLを取得することが必須になったためです。この動作変更により、CarrierWaveのオブジェクトそのものを `image_tag` で渡すと、URLを解決できなくなりました。

### 解決方法
以下のように、`.url` メソッドを明示的に使うことで解決できます。

```erb
# 修正後のコード
<%= image_tag @user.avatar.url if @user.avatar.present? %>
```

`.present?` を追加することで、画像がない場合のエラーも回避します。

### まとめ
CarrierWaveのバージョンアップにより、`.url` の明示的な指定が必要になりました。この変更に対応してコードを修正し、画像を正しく表示しましょう。参考にした情報については以下をご参照ください。

### 参考リンク
[CarrierWave can't resolve image into URL error - Stack Overflow](https://stackoverflow.com/questions/53883893/carrierwave-cant-resolve-image-into-url-undefined-method-to-model)
ActiveRecordのスコープundifined methodになる問題　　WhereChain オブジェクトと ActiveRecord::Relation の違い




### 症状
以下のようなコードがあったとします。

```ruby
Column.published.order_latest.limit(3)
```

このコードで使用されている `scope` メソッドは、以下のように定義されています。

```ruby
scope :order_latest, -> { order(published_at: :desc, created_at: :desc) }
scope :published, -> (current_date = nil) {
  current_date ||= Util::DatetimeUtil.get_instance.get_current_date_time
  where { (is_published == true) & (published_at <= current_date) }
}
```

上記のコードを実行したときに、以下のようなエラーが発生します。

```
undefined method 'order_latest' for #<ActiveRecord::QueryMethods::WhereChain>
```

### 原因
このエラーの原因は、`published` スコープが `ActiveRecord::QueryMethods::WhereChain` オブジェクトを返しているためです。以下の点が問題を引き起こしています。

1. **`published` スコープで `where` をブロック形式で使用している**: `where` メソッドをブロック形式で使用すると、返り値が `ActiveRecord::QueryMethods::WhereChain` になります。
2. **`WhereChain` オブジェクトと `ActiveRecord::Relation` の違い**:
   - 通常の `where` メソッドは `ActiveRecord::Relation` を返します。これにより、`order` や `limit` などのメソッドをチェーンして使用できます。
   - 一方、`WhereChain` オブジェクトは、複雑な条件を組み立てるためのものです。このオブジェクト自体には `order` や `limit` といったメソッドは定義されていないため、`order_latest` を続けて呼び出すとエラーが発生します。

### 具体例
以下のようなコードでエラーが発生するのは、この `WhereChain` と `ActiveRecord::Relation` の違いに起因します。

```ruby
# これはエラーになる例
Column.published.order_latest
```

この場合、`published` が返すのは `WhereChain` なので、`order_latest` メソッドが見つからずエラーとなります。

### 解決方法
このエラーを解決するには、`published` スコープ内の `where` を標準の形式に修正し、`ActiveRecord::Relation` を返すようにします。

#### 修正後のコード
```ruby
scope :published, -> (current_date = nil) {
  current_date ||= Util::DatetimeUtil.get_instance.get_current_date_time
  where(is_published: true).where('published_at <= ?', current_date)
}
```

これにより、`published` スコープは `ActiveRecord::Relation` を返すようになります。これで、`published` スコープに続けて `order_latest` や `limit` などのメソッドをチェーンすることが可能になります。

#### 修正後の使用例
```ruby
# 期待通りに動作するようになる
Column.published.order_latest.limit(3)
```

### まとめ
- `where` メソッドをブロック形式で使用すると、`WhereChain` オブジェクトが返り、他のメソッドをチェーンできなくなります。
- `published` スコープを修正して `ActiveRecord::Relation` を返すようにすることで、`order_latest` などのチェーンが可能になります。

このような問題を避けるためには、`where` の書き方に注意し、標準的な形式を使用することが重要です。
【個人メモ】Ruby on Rails チュートリアル 第1章

Ruby on Railsチュートリアルで学んだ内容を個人的なメモとして簡単にまとめたものです

# 個人メモ
- Ruby on Railsチュートリアルにおける開発環境
  github codespacesのクラウドIDE
- バージョンの確認
  ruby --version
  rails -v
- rubyドキュメントをスキップする設定を.gemrcに追加
  echo "gem: --no-document" >> ~/.gemrc
- バージョンを指定しrailsをインストール
  gem install rails -v 7.0.4.3
- gemのバージョン指定方法
gem "capybara", ">= 3.26"
gem "puma", "~> 5.0"
>">= 3.26"という記法では最新のgemを探してインストール
"~> 5.0"という記法ではバージョン5.1などの新しいマイナーバージョンがあればインストールされるが、バージョン6.0のようなメジャーバージョンアップはインストールされない ~>の方が安全度が高い
- gemのインストール
bundle install
- サーバーの起動
rails server
PowerShell 基本操作[画面分割・タブ操作]

## 画面分割関連

| 操作 | できること |
|:-:|:-:|
| Shift + Alt + + | 画面を水平分割 |
| Shift + Alt + - | 画面を垂直分割 |
| Alt + ↑↓←→ | 分割したペイン間を移動 |
| Alt + Shift + ↑ | 上方向にサイズ調整 |
| Alt + Shift + ↓ | 下方向にサイズ調整 |
| Alt + Shift + ← | 左方向にサイズ調整 |
| Alt + Shift + → | 右方向にサイズ調整 |

## タブ操作

| 操作 | できること |
|:-:|:-:|
| Ctrl + Shift + T | 新しいタブを開く |
| Ctrl + Tab | 次のタブに切り替え |
| Ctrl + Shift + Tab | 前のタブに切り替え |
| Ctrl + W | 現在のタブ/ペインを閉じる |


## その他の操作

| 操作 | できること |
|:-:|:-:|
| Ctrl + L | 画面をクリア |
| Ctrl + R | コマンド履歴の検索 |
| Ctrl + C | 実行中のコマンドを中断 |
| Alt + Enter | フルスクリーン切り替え |
| Ctrl + Shift + C | テキストをコピー |
| Ctrl + Shift + V | テキストを貼り付け |
| Ctrl + ↑↓ | コマンド履歴をスクロール |
| Ctrl + Home/End | ウィンドウの最上部/最下部にスクロール |


Windowsのウィンドウ操作に関する主要なショートカットを分類してご説明します。

## マウスを使わない方法（キーボードショートカット）
| 操作 | できること |
|:-:|:-:|
| Alt + Space → S キー | サイズ変更モードに入る |
| → キー | 横に広げるモードに入る |
| → キー（連打） | 少しずつ右に広がる |
| Enter | 確定 |

## 基本的なウィンドウ操作
| 操作 | できること |
|:-:|:-:|
| Win + ↑ | ウィンドウを最大化 |
| Win + ↓ | ウィンドウを最小化/元のサイズに戻す |
| Win + ← | ウィンドウを左半分に配置 |
| Win + → | ウィンドウを右半分に配置 |
| Win + Home | アクティブウィンドウ以外を最小化 |

## ウィンドウのサイズ変更
| 操作 | できること |
|:-:|:-:|
| Win + Shift + ↑ | ウィンドウを垂直方向に最大化 |
| Win + Shift + ↓ | ウィンドウを垂直方向に最小化 |
| Win + Shift + ← | ウィンドウを左モニターに移動 |
| Win + Shift + → | ウィンドウを右モニターに移動 |

## 仮想デスクトップ
| 操作 | できること |
|:-:|:-:|
| Win + Tab | タスクビュー表示 |
| Win + Ctrl + D | 新しい仮想デスクトップを作成 |
| Win + Ctrl + ← | 左の仮想デスクトップに切り替え |
| Win + Ctrl + → | 右の仮想デスクトップに切り替え |
| Win + Ctrl + F4 | 現在の仮想デスクトップを閉じる |

## その他の便利な操作
| 操作 | できること |
|:-:|:-:|
| Win + M | すべてのウィンドウを最小化 |
| Win + Shift + M | 最小化したウィンドウを元に戻す |
| Win + D | デスクトップの表示/非表示を切り替え |
| Alt + Space | ウィンドウのシステムメニューを開く |
| Win + P | プロジェクターや外部ディスプレイの設定 |
勉強メモ3

### 情報システム戦略

・エンタープライズアーキテクスチャ:全体最適化の観点から各業務と情報を見直すための技法
→現在の姿:As-Isモデル
→あるべき理想の姿:To-Beモデル
→As-IsモデルとTo-Beモデルの差を分析:ギャップ分析

### ネットワーク技術
・SDN:ネットワークの構成や設定をソフトウェアで動的に変更して集中的に制御する
※OpenFlowを使用したSDNの説明:データ転送と経路制御の機能を論理的に分離しデータ転送に特化したネットワーク機器とソフトウェアによる経路制御の組み合わせで実現する

### 情報セキュリティ
・オープンリダイレクト:URLパラメータなどの入力情報をもとに、利用者を特定のWEBページに遷移させ、任意のページにリダイレクトできてしまう脆弱性

・フィッシング:実在する会社を装い電子メールを送信。偽のWEBサイトに誘導し公人情報をだまし取る

### システムの性能評価
・スループット:一定の時間内にシステムによって処理される仕事の量

・ターンアラウンドタイム：入力の開始から結果の出力作業が終了までに要する時間

・レスポンスタイム:処理依頼開始から端末に結果が出始めるまでの時間

### テスト手法
・単体テスト(ソフトウェアユニットテスト):プログラムを構成するモジュール単位に行うテスト

・ホワイトボックステストテスト手法
 →命令網羅:すべての処理を少なくても1回以上確認
 →分岐網羅:すべての分岐を少なくても1回以上確認
 →条件網羅:分岐先の真と偽の組み合わせ経路を少なくても1回以上確認
 →複数条件網羅:分岐先の真と偽の組み合わせ経路を全て確認

 ### システム活用促進
・デジタルディバイド:ITを利用する能力や機会の違いによって生じる社会的、経済的格差
Swiftのジェネリクス(型引数)について初心者向けの記事

# ジェネリクスについて

最初のうち苦労してたのを思い出して書こうと思いました。

## 目次

1. 用語の定義
2. 基本形
3. 実装例

## 用語の定義
ジェネリクスとは、型をパラメータ(引数)として受け取ることで汎用的なプログラムを記述するための機能

## 基本形

```swift
func 関数名<型引数>(引数名: 型引数) -> 戻り値の型 {
  呼び出し時の実行文
}
```

例えば

普通の引数だと

```swift
func add(a: Int, b: Int) -> Int {
    return a + b
}

let intSum = add(a: 5, b: 10) // Int型
let doubleSum = add(a: 5.5, b: 10.2) // エラー: 引数の型が一致しない
```

型が固定されていてこの場合`doubleSum`はエラーになる。

```swift
func add<T: Numeric>(a: T, b: T) -> T {
    return a + b
}

let intSum = add(a: 5, b: 10) // Int型
let doubleSum = add(a: 5.5, b: 10.2) // Double型
```

異なる型に対応可能(上の例だとInt型,Double型)

色々な型で使えるというのが最初に書いた「汎用的なプログラム」の理由です。

## 実装例

```swift
func fetch<T: Requestable>(
  _ request: T,
  // 成功時の処理
  success: @escaping ((T.Response) -> Void),
  // 失敗時の処理
  error: @escaping ((_ status: APIError.Status) -> Void)) {
    currentRequest = AF.request(request)
      .validate()
      .response { [weak self] response in
        // 略
        switch response.result {
          case .success:
          do {
            // デコード処理
          } catch {
            errorHandler(.clientError(category: .decodeError))
          }
          case .failure(let error):
            // エラーの処理
        }
  }
}
```

このようにAPIを呼び出す関数があるとします。

引数にTという型を指定しています。

例えば別のファイルや構造体などを設定して、`fetch()`メソッドを呼び出す時に引数に設定した型を渡せば実行できます。

例)
```swift
let req: LoginApiRequest = LoginApiRequest(userId: userId,
                                                                 password: password,
                                                                 instanceToken: instanceToken)
repository.api.fetch(req,
                    successHandler: { response in
                      handler(.success(response))
                    }, 
                    errorHandler: {
                      handler(.failure($0))
})
```
``` swift
// ログイン
    struct LoginApiRequest {
        // ログインAPIリクエストのメソッド・パス・ヘッダー・ボディを設定するコード
        
        let userId: String
        let password: String
        let instanceToken: String
        init(userId: String, password: String, instanceToken: String) {
            self.userId = userId
            self.password = password
            self.instanceToken = instanceToken
        }
    }
```

これにより、複数のAPI通信を`fetch()`関数だけで行うことができます。
Docker コマンド よく使う系

## はじめに
Docekrのよく使うコマンドになります。
ご活用ください。

## よく使うコマンド
```
# docker コンテナを起動する
$ docker-compose up -d

# docker コンテナを停止する
$ docker-compose down

# docker コンテナに接続する
$ docker-compose exec [コンテナ名] bash

# Dockerfile の変更を反映(再ビルド)してコンテナを再起動する
$ docker-compose build && docker-compose up -d

※ Dockerfileの変更は再ビルドを行わないと反映されません。

# docker イメージの一覧を表示する
$ docker images -a

# docker イメージを削除する
$ docker rmi [イメージID] [イメージID] ...

# 起動中の docker コンテナの一覧を表示する
$ docker ps -a

# トラブルシューティング：docker 起動時のログを調べる
$ docker-compose logs [コンテナ名]

# docker コンテナで、定義ファイルの設定より優先（command 定義を上書き）して、任意のコマンドを実行する
$ docker-compose run -w [コンテナ内の絶対パス] --rm [コンテナ名] [実行したいコマンド]

# docker コンテナごとのメモリなどのリソース使用状況を確認する
$ docker stats --no-stream

# コンテナを削除する
$ docker rm [コンテナID]

# 全てのコンテナを削除する
$ docker rm $(docker ps -a -q)

# コンテナプロセスを停止する
$ docker stop [コンテナID]

# 全てのコンテナプロセスを停止する
$ docker stop $(docker ps -a -q)

# 使用していないイメージ・コンテナをすべて消す
$ docker image prune -a

# インタラクティブモードで Docker コンテナを起動
$ docker container run -it

# 起動中のコンテナの詳細情報を確認する
$ docker container inspect [コンテナID]

# 起動中のコンテナに入る
$ docker exec -it [コンテナID] /bin/bash

# プロセスを停止したらコンテナを破棄するモードでコンテナを起動する
$ docker run --rm -p 80:80 [イメージID]

# サーバに出力されたログをリアルタイムで確認する。
$ docker-compose logs -ft
```
ZeroTrust叫ばれている状況で、そのVDIは安全ですか？

## VDIを情報漏洩の最終兵器の1つと思ってないですか？
ポエムです。

### 2つのVDI導入目的
1. リモートからアクセスし作業する仮想的な端末を、イントラネット等の安全と思われる場所に配置
2. リモートからアクセスし作業する仮想的な端末の安全性確保（セキュリティアップデート等の適用とリスクのあるアプリケーション等をインストールさせない）

あたりがVDIを安全だと思う主な理由ではないかと。

### 境界防御の内側が安全ならZeroTrustは流行っていない
目的のひとつめは、単なる境界防御のそのもの。境界防御の有効性を信じるか？信じないか？はひとそれぞれですが、信じている人が少なくなってきたので、ZeroTrustなんていう考え方がでてきているわけです。ZeroTrustが重要だと理解しているのに、境界防御の内側に配置するVDIでコントロールする端末は安全なのでしょうか？
### イントラネット内の安全な端末から情報漏洩発生していませんか？
BYODいまいち流行らない理由の1つに、IT部門のコントロール下にない端末の安全か確保されていない可能性があると思います。サポート切れしたOSやブラウザが使われたり、OSやアプリケーションのセキュリティ更新が実施されていない端末からのアクセスに不安があり、安全に管理された端末を使わせたいという意図は理解できます。
しかし、管理化の安全だと思われている端末からの情報漏洩がかなりの頻度から発生している状況からも、安全な端末を用意しても情報漏洩は防げないのです。
#### 安全な端末からの情報漏洩の主な2つの要因
ひとつめは標的型攻撃。
一般的なスパムメールのリンクを踏む（アクセスする）なんていうケースはかなり減ったと思いますが、巧妙にしくまれた標的型攻撃を防ぐのは不可能に近いと思います。航空会社社員を装った攻撃メールが旅行会社に送信され、その旅行会社の社員数名の端末やアカウントが乗っ取られ、情報漏洩に繋がったという過去の漏洩事件なんかを考えると、標的型攻撃を防ぐのはかなりキビしいと思います。

ふたつめは、現職者や退職者や、出入りのパートナー等からの漏洩。
IPAの少々古い資料([企業における営業秘密管理に関する実態調査2020](https://www.ipa.go.jp/security/reports/sme/about.html) ですがこの資料にもあるとおり、いまや、情報漏洩理由の50%以上は関係者です。故意なのか過失なのかはわかりませんが、関係者が原因ならば、端末の安全性は関係なく情報漏洩します。

## 標的型攻撃や関係者からの情報漏洩、VDIで防げますか？
自ずと答えは導きだせると思います。

## VDIのメリット
それでも、VDIは安全度が高いのでは？と思われる方もおられると思います。VDIの利点は、「**大量**の情報を一度に持ち出しにくくできる」点だと思います。個人情報をダンプして、USBメモリにコピーして持ち帰る、みたいなことはしにくくなるでしょう。これはVDIのメリットだと思います。
### 情報漏洩に少量情報の漏洩も大量情報も関係なく1件でも漏洩です
情報漏洩か？漏洩ではないか？[個人情報委員会](https://www.ppc.go.jp/news/kaiseihou_feature/roueitouhoukoku_gimuka/)が報告義務の漏洩事態の1つに「1,000人を超える漏えい等が発生した」事態という定義をいれているので、件数が大事と思われている場合もあるかと思いますが、1000件以下なら情報漏洩にあたらないわけではないのは当然ですよね。
つまりは、機密情報が表示されている画面のスマホで撮影しただけで、漏洩の可能性ありです。


---
みたいなことを考えていると、2倍端末が売れるVDIってベンダーが儲かるための仕組みなんのではないかと勘ぐってしまいます。

以上ポエムでした。
数値を Base64 に圧縮するアルゴリズム

数値を Base64 に圧縮するアルゴリズムを考えたため
紹介してみようと思います。

圧縮率 55% 程度と思われます。

先頭の 0 が消えるため
long 型の数値を保存したい場合など
先頭が 0 でない数値に
活用頂けると幸いです。

1byte 文字は 95 文字あるハズなので
Base95 にする事もできます。

そうすればより圧縮できますが
圧縮率 50% を少し切る程度のハズなので
どちらも大差ないハズです。

管理を簡単にするために
コンマを使いたくないなどの場合は
Base94 等に妥協する事になりますが
そういった修正を後々行うのは面倒なので
Base64 に抑えておくのが
結果的に楽だと思われます。

***

圧縮・展開するコード

```csharp:圧縮・展開するコード
public static string CompressNumberToBase64(string targetNumber)
{
    string thinking = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    System.Text.StringBuilder create = new();

    System.Numerics.BigInteger nowBigInteger = System.Numerics.BigInteger.Parse(targetNumber);
    System.Numerics.BigInteger bigInteger64 = new(64);
    System.Numerics.BigInteger outBigInteger;

    while (0 <= nowBigInteger.CompareTo(bigInteger64))
    {
        System.Numerics.BigInteger.DivRem(nowBigInteger, bigInteger64, out outBigInteger);
        create.Append(thinking[(int)outBigInteger]);
        nowBigInteger = System.Numerics.BigInteger.Divide(nowBigInteger, bigInteger64);
    }
    System.Numerics.BigInteger.DivRem(nowBigInteger, bigInteger64, out outBigInteger);
    create.Append(thinking[(int)outBigInteger]);

    return create.ToString();
}

public static string DecompressBase64ToNumber(string targetComperssNumber)
{
    string thinking = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    System.Numerics.BigInteger nowBigInteger = new(0);
    System.Numerics.BigInteger bigInteger64 = new(64);

    for (int i = targetComperssNumber.Length - 1; 0 <= i; i--)
    {
        nowBigInteger = System.Numerics.BigInteger.Multiply(nowBigInteger, bigInteger64);
        nowBigInteger = System.Numerics.BigInteger.Add(nowBigInteger, thinking.IndexOf("" + targetComperssNumber[i]));
    }

    return nowBigInteger.ToString();
}
```

コメント欄にて
改善できる点を指摘頂いたため
反映しています。

コメント感謝します。

このコードで 10000 桁の数値を圧縮すると
5537 文字に圧縮できています。
10 桁の数値も 6 文字に圧縮できています。

よって 55% 程度の圧縮率と思われます。

long 型の数値しか変換しないと
分かっているならば
BigInteger を long に書き換えた方が
確実に早いハズです。

チート対策の観点としては
暗号化と複合して実装する前提にはなりますが、
地味にチェックサムとは相性がいいかもしれません。

***

以上数値を 55% 程度の文字数に
圧縮するアルゴリズムを紹介しました。

圧縮率 55% というのは
10 の 10乗 が 10億 で
64 の 5乗 が 10億7000万 程度である事を考量すると
そんなものかと思います。

「より高速で動作する」「より圧縮率が高い」など
より優れたアルゴリズムを
知っている方がいらっしゃれば
是非コメント欄で教えて頂けると幸いです。

今回はここまで。
閲覧ありがとうございました。
知っときたい命名規則

### camelCase キャメルケース
`camelCase`
**JS**とか**PHP**

### PascalCase パスカルケース
`PascalCase`
**クラス名**とか


### snake_case スネークケース
`snake_case`
**Pythonの関数名**


### CONSTANT_CASE コンスタントケース
`CONSTANT_CASE`
**定数**


### kebab-case ケバブケース
`kebab-case`
**ファイル名**

## 個人的な命名規則
### ファイル名
`camelCase` キャメルケース

### 変数名
`camelCase` キャメルケース

### 定数
`CONSTANT_CASE` コンスタントケース

### 関数名
`snake_case` スネークケース

### プログラム関連ではないファイル
`kebab-case` ケバブケース
SIMロック解除手順

## 事業用電話番号を低コストで運用したい
povoはプライベートで運用しているので慣れているし、月額無料で電話番号がもらえるのでこれを事業用にすることにした。
基本的に仕事はメールやらで受けるので、電話は自宅で受ける程度でよく、持ち歩く必要はなかったため、昔使っていたdocomoのスマホSO-01Mを引っ張り出して、これを固定電話的に運用することにした。

## SIMロック解除が必要
povoはau系なので、SO-01MはdocomoだからSIMロック解除しないと使えない。
これが結構てこずった。ネット上にたくさん情報はあるのだが、キャリアをまたがる操作のせいか、なにやら手抜きというかテスト不足というか、同じような画面表示で同じような症状なのだけど、SIMロック解除できなかった。

:::note info 
SO-01Mの操作説明書にも最終ページに４行程度文章が書いてあるだけ。画面例もなく、実際のスマホ画面の文言とその文章も違うので、見ると余計混乱する。。。
:::

## まずはmydocomoから解除コード申請
これはネット上の情報通りすんなり行った。契約したスマホのdocomoアカウントでないアカウントでOKだった。下記はメールの抜粋

>メールの内容
＜お申込内容＞
ＳＩＭロック解除
機種：　Ｘｐｅｒｉａ　５　ＳＯ−０１Ｍセット＜Ｒ＞
製造番号：　XXXXXXXXXXXXXXX
解除コード：　1234567890123456
SIMロック解除をご希望される対象の電話機本体に他社のSIMカードを挿入し、上記の解除コードを入力することでSIMロックが解除されます。
詳細な操作手順は、以下のURLに掲載しております取扱説明書でご確認ください。

## いろいろやった結果
ネット上からはパチッとハマる情報が見つけられなかったせいか、序盤は全く手ごたえが無かった。

最終的に、ネット上の下記画面がSO-01Mの画面と最も近かった。異なるのは、
1.「ロック解除残り・・・」の行が無い点（「SIMネットワークの・・」の行だけ表示）。
2.「SIMネットワークの・・・」の文字がグレーアウト？暗くて非常に見づらい感じ。
　　→このせいで最初はどこに解除コードを打つ領域があるのかすら判別できなかった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916302/c12da734-59a5-ce1c-f55d-6effb2958478.png)

さらにネット上の情報は、この画面「ロック解除」を押せばOK的なものだったが、何回やっても解除されない（解除されました！みたいな文言が出てこなく、実際SIMで通信もできない）。
実際10回以上やったのにロックされた気配も無いため、これはバグ系の何かあるな、と思い直して、ネット上の手順を無視していろいろ試した。
結局、解除コード16桁をテキストボックスに入力（一度テキストボックスをタップするとキーボードが表示されるのでそれで入力）後、 **「ロック解除」は押さず、** 何もない領域をタップしたら、なぜかうまくいった。
→ロック解除しました！的な画面が表示されたがキャプチャ忘れた。
偶然何もない領域をタップした形だったので、正確にどこをタップしたかは定かではないが、「ロック解除」の左のほうだったと思う。

## 現在
当初の目論見通り、ほぼタダ（半年に１回300円程度払えばOK）で事業用の電話番号を運用可能になったのでめでたし！

※また同じ手順を実施することはなさそうだけど、結構時間かけて頑張ったので備忘録代わりに記事にしました。
【ネットワーク】URLとHTTPプロトコル

# はじめに
今回はURLとHTTPプロトコルについてまとめます。
URLはwebサイトを表示するためのあれ、HTTPはURLの先頭にくっ付いているあれ、、、程度の認識しかありませんでした。
下記の書籍で学習した内容をアウトプットしていきます。
＜参考書籍・参考サイト＞
ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識

# URLとは
#### :label:URLの構成
URLとはUniform Resource Locatorの略で、ドメイン名やプロトコル、ディレクトリ名などが書かれているネットワーク上のデータを指し示すための統一的な指標です。
URLはhttp:で始まるものという認識が強いですが、http:だけでなく、ftp:やfile:、mailto:から始まるものもあります。
それには理由があって、ブラウザにはwebサーバーにアクセスするためのクライアントとしての機能の他に、ファイルのアップロード・ダウンロードをするFTPのクライアント機能や、メールのクライアント機能なども持っています。
それら様々な機能の中で、どれを使ってデータにアクセスすれば良いかの判断材料が必要になります。
そこで、webサーバーへアクセスする時は、http:、FTPサーバーならftp:という具合に、様々なURLが用意されています。

URLの文頭には必ず、http:やftp:などのプロトコルが記載されます。その後の文字列はプロトコルによって書き方が異なります。
例えばhttp:であれば、http://ドメイン名.ファイルのパス名ですが、mailto:ならmailto://メールアドレスといった具合になります。

#### :label:URLは省略できる
URLは省略することができます。
例えばhttpプロトコルのURLの時、webサイトのドメイン名の後に、ファイルのパス名を書きますが、これは省略できます。
URLの末尾が/で終わっているものは、本当は後ろに文字列があるけど、/で省略して終わらせているものです。
例）http://www.testooue.com/

しかし、ファイル名を書かなければ、コンピュータがどのファイルにアクセスして良いか分かりません。
そこで、ファイル名を省略したときのために、あらかじめサーバー側にファイル名を設定しておきます。
設定はサーバーによって異なりますが、大半がindex.html、default.htmというファイル名を設定しておくようになっています。
設定しておくと、省略されていても設定しておいたファイルにアクセスするようになります。

# HTTPプロトコル
#### :label:HTTPプロトコルとは
HTTPプロトコルはクライアントがサーバーとやりとりするための、メッセージの内容や手順を定めたものです。
基本的な手順は、「どのファイル」に対して、「何を」したいかを記述します。
URLの総称をURI（Uniform Resource Identifier）と言います。http:などのプロトコル部分は正確にはURLではなく、URIになります。上記の「どのファイル」に相当するのがURIです。

「何を」に相当するものはメソッドと言います。
メソッドには様々な種類があり、メソッドによってサーバーに伝える要求が変わります。
以下が主要なメソッドです。

・GET：URIで指定した情報を取り出す
・POST：データを送信する
・PUT：URIで指定したファイルを置き換える
・DELETE：URIで指定したファイルを削除する

これらURIとメソッドを組み合わせ、webサーバーにリクエストメッセージとして送信します。
すると、webサーバーは、URIとメソッドを調べ、「何を」「どうするか」を判断して、要求に従って動作します。
クライアントからの要求に従って得たデータを、レスポンスメッセージに格納し、クライアントに送り返します。その後、ブラウザがメッセージの中からデータを取り出して画面に表示してHTTPの動作は終了です。

# まとめ
URLとHTTPプロトコルの関係、通信の流れについてまとめました。
クライアントがデータを要求し、サーバーがクライアントに送り返して、クライアントの画面に表示されるまでの流れです。
処理は一瞬ですが、裏では以下のように多くの工程を踏んでいるということが分かりました。

###### ＜通信の流れ＞
1.クライアントがブラウザを通して、webサーバーにデータを要求する
2.HTTPプロトコルで、URIとメソッドを組み合わせてリクエストメッセージを作成
3.webサーバーはリクエストメッセージのURIとメソッドを確認し、要求に沿ったデータを用意する
4.データをレスポンスメッセージに格納し、クライアントに送り返す
5.ブラウザがメッセージの中からデータを取り出して画面に表示する
VerticaのデータをPandasで処理し、Google スプレッドシートに自動で貼り付ける

### 前提
vertica-python, pandas, gspread, oauth2clientをインストールしておくこと。
Verticaの接続情報を正しく設定すること。
Google APIのサービスアカウントを作成し、JSONキーを取得すること。
スプレッドシートの名前を正しく設定し、サービスアカウントに編集権限を付与すること。

### Vertica とは
https://www.vertica.com/ja/

https://qiita.com/Siro_Labo_3099/items/f930557b958d22dbb0f7

https://www.vertica.com/aws/

### １．Verticaからデータを取得:
Pythonでvertica-pythonパッケージを使い、Verticaのデータベースからデータを取得する。

###２．Pandasでデータを処理:
取得したデータをPandas DataFrameに読み込み、必要な処理を行う。

### ３．Google APIの設定:
Google Developers Consoleでプロジェクトを作成し、Google Sheets APIを有効にする。サービスアカウントを作成してキーをダウンロードする。

### ４．gspreadを使ってスプレッドシートにアクセス:
gspreadパッケージとGoogle APIの認証情報を使って、PandasのデータをGoogle スプレッドシートに書き込む。

コードはこんな感じ
```py
import vertica_python
import pandas as pd
import gspread
from oauth2client.service_account import ServiceAccountCredentials

# Verticaデータベース接続情報
conn_info = {'host': 'VERTICA_HOST',
             'port': 5433,
             'user': 'USERNAME',
             'password': 'PASSWORD',
             'database': 'DBNAME'}

# SQLクエリ
query = "SELECT * FROM your_table"

# Verticaからデータ取得し、Pandas DataFrameへ読み込み
with vertica_python.connect(**conn_info) as connection:
    df = pd.read_sql(query, connection)

# Pandasでのデータ処理（任意）

# Google Sheets APIとサービスアカウントの認証
scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('your-google-creds.json', scope)
client = gspread.authorize(creds)

# スプレッドシートを開く
sheet = client.open('your_spreadsheet_name').sheet1

# DataFrameからスプレッドシートへデータを書き込む関数
def df_to_sheet(df, sheet, clear=True):
    if clear:
        sheet.clear()
    cells = gspread.utils.dataframe_to_cells(df)
    sheet.update_cells(cells)

# 実行
df_to_sheet(df, sheet)
```

自動実行する場合、Linuxならcron、Windowsならタスクスケジューラを設定する。

ここではcronでの実行例を示す（毎事0分に実行）
```
0 * * * * /usr/bin/python3 /path/to/your_script.py
```

### 注意点
・大量のデータを扱う場合、Google Sheets APIのレートリミットに注意。APIの呼び出し回数の制限を超える可能性があるので、リアルタイムとかはあまりおすすめしない。（上の記載例で現状エラーは出ていないが）
【Python 入門】import 文の書き方 総まとめ

Pythonでプログラムを書く際、避けては通れないimport文。
本記事では、基本的な使い方から実践的なテクニックまで、分かりやすく解説します。

## import 文とは

Pythonでは import 文を使用することで、他のファイル内に記載されている module にアクセスできるようになります。
より詳しい説明は[公式ドキュメント](https://docs.python.org/ja/3/tutorial/modules.html)を参照してください。
この記述にいくつかパターンがあり、理解しておくことが大切です。

## VSCodeで簡単に書く方法

元も子もない説明になりますが、Visual Studio Code を使用している場合は、拡張機能の Python を入れて、import が書けていない参照の波線にマウスを合わせて「クイックフィックス」で追記しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769407/68954d8a-8b12-8e0c-4938-3951e5ecd5b5.png)

これなら覚えなくても書けますね。

## 記述パターン

改めて、記述のパターンを下記に示します。

```python
# パターン1: モジュール全体をインポート
import module_name

# パターン2: モジュールに別名をつけてインポート
import module_name as alias_name

# パターン3: モジュールから特定の要素をインポート
from module_name import function_name, class_name

# パターン4: モジュールから全ての要素をインポート（非推奨）
from module_name import *
```

### 1. モジュール全体をインポート

最も基本的な方法です。モジュール内の要素にアクセスする際は、モジュール名を前置する必要があります。

```python
import math
result = math.sqrt(16)  # → 4.0
```

### 2. モジュールに別名をつけてインポート

長いモジュール名を短く省略したい場合や、名前の衝突を避けたい場合に使用します。

```python
import numpy as np
array = np.array([1, 2, 3])
```

※ numpy は別途インストールが必要な場合があります

### 3. モジュールから特定の要素をインポート

モジュールの特定の関数やクラスのみを使用する場合に適しています。

```python
from datetime import datetime, timedelta

# 現在の日時を取得
current_time = datetime.now()
print(f"現在時刻: {current_time}")  # 例: 現在時刻: 2024-10-28 15:30:45.123456

# 1日後を計算
tomorrow = current_time + timedelta(days=1)
print(f"1日後: {tomorrow}") 
```

### 4. モジュールから全ての要素をインポート

名前空間が汚染される可能性があるため、通常は推奨されません。

```python
from math import *  # 非推奨
result = sqrt(16)   # math.を省略できるが、どこから来た関数か分かりにくい
```

## よく使われる標準ライブラリのインポート例

```python
# 日時操作
from datetime import datetime, timedelta

# ファイルパス操作
import os
from pathlib import Path

# 正規表現
import re

# JSONデータの処理
import json

# ランダム値の生成
import random
```

## プロジェクト内の自作モジュールのインポート

プロジェクト構成が以下のような場合を考えます。
```
my_project/
├── main.py
└── utils/
    └── helper.py
```

main.pyからhelper.pyをインポートする方法は下記です。

```python
from utils.helper import UsefulClass
```

## スタイルガイドに基づくインポートの記述

Pythonの公式スタイルガイド（[PEP 8](https://peps.python.org/pep-0008/#imports)）では、インポート文の記述について以下のように定めています：

1. インポートは個別の行に記述する
2. インポートは以下の順序で記述し、各グループ間に空行を入れる
   - 標準ライブラリ
   - サードパーティライブラリ
   - ローカルアプリケーションやライブラリのインポート
3. インポートはファイルの先頭に配置する（モジュールのコメントや docstring の後）
4. ワイルドカードインポート（`from <module> import *`）は避ける

```python
# 標準ライブラリ
import os
from datetime import datetime

# サードパーティライブラリ
import numpy as np

# ローカルアプリケーション
from utils.helper import UsefulClass
```
【p5.js】60fps越えは無理っぽい


## 起

個人でクソゲーを作っていたときに、fpsの制御を`setInterval`か`requestAnimationFrame`のどちらで行うべきか少し悩んで、結局`requestAnimationFrame`を使った。

それからしばらくして、p5.jsはどうしてるのか気になったため調べてみた。

## 承

drawでgrepしたら即見つかった。

`requestAnimationFrame`を使っているようだ。

https://github.com/processing/p5.js/blob/711869bff14ed2d9d2b5ccc087204ff217b5dc13/src/core/main.js#L549

`requestAnimationFrame`は大抵60fpsのため、それ以上のfpsは独自実装しない限り実現できないだろう。
フレームワークの辛いところさんやね。

## 結

ほとんどの場合は`requestAnimationFrame`で全然問題ないが、
例えば3倍速モードが欲しいみたいになってくると`setInterval`でfpsを管理したほうが楽なときもある。

まあ、知れてよかった。（小並感）
New Relicのユーザータイプを理解しよう！

New Relicにログインして活用する**ユーザーの権限は所属するグループのロールによって制限**することができますが、**そもそもユーザーが利用できる機能はユーザータイプに紐づいています**。

**ユーザータイプの詳細や最新情報は公式ガイドを参照ください。**

**↓↓↓ 公式ガイドはこちら**

https://docs.newrelic.com/docs/accounts/accounts-billing/new-relic-one-user-management/user-type/

また、**アカウント構成**や**ユーザー管理の基本**については、別の記事で記載しているので参照ください。

https://qiita.com/T_OMORI/items/508777b51d1ba36e6d41

https://qiita.com/T_OMORI/items/4ee7b85a0427843f6d4a


# ユーザータイプは3種類
New Relicのユーザータイプは現在３種類があります。

- Basic：ほぼDashboardでの利用が想定されるユーザー
- Core：Basicに加えてCodeStream、Errors Inbox、Logsを利用できるユーザー
- Full platform：基本的にすべての機能を利用できるユーザー

## Basicユーザー
基本的にダッシュボードでの利用が想定されるユーザーで、無料で追加できます。
**プレビルドの画面で詳細分析をすることはできない**ので、定期報告に関連するダッシュボードを作成して、そのダッシュボードを**報告先の役員等が確認する目的でBasicユーザーを使用**することが多い印象です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/5aa93f17-f27e-5a99-1313-a5586236b0ad.png)


## Coreユーザー
基本的にIDEの拡張機能である**CodeStreamを利用することが想定されたユーザー**です。
有償ユーザーで、Basicユーザーが可能なことももちろん可能となっています。

CodeStreamは、**VSCodeやIntelliJなどに拡張機能としてインストール**してNew Relicにログインすることで、**IDEで上でエラー調査/ログ検索/パフォーマンス分析**をすることができます。

ただ、New Relicの**プレビルドの画面で詳細分析をすることはできないため、利用を進めると少し物足りなく感じることがあるため、基本的にはFull Platformユーザーをおすすめしています**。

https://docs.newrelic.com/docs/codestream/start-here/what-is-codestream/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/54ad459c-a4a1-33ce-191b-8f2db685abd6.png)


## Full Platformユーザー
**基本的にすべての機能を利用できる**ユーザーです。
例えばAPM、Browse、Mobileなどの**プレビルドの分析画面で詳細分析**を実施することが可能です。**スタックを横断した調査**もやりやすくなります。
基本的に開発/運用にかかわらず**エンジニアの方はFull PlatformユーザーだとNew Relicを活用しやすい**と思います。

### 例）分散トレーシングの画面でパフォーマンス分析
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/657d43dc-8091-eec8-adbb-d4cc9d9543c5.png)

### 例）Core Web Vitalsの画面を利用するなど
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/c6ddc1dd-1621-96c1-59aa-2532caa2832c.png)

### 例）カスタマーユーザージャーニー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/b663d137-bbe3-25e9-b6b0-2d56dfaeec81.png)



# ユーザータイプの確認と変更
ブラウザでNew Relicにログインして、**左下のユーザーアイコンからAdministration > User Managemnet**に移動して、ユーザーをクリックすることで**Update User画面が表示**されます。こちらの画面でユーザータイプの確認と変更が可能です。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/accc4304-7f68-b989-e476-83506b966151.png">

ユーザータイプは利用料金に関わってくるので、**詳細は担当営業にご確認ください**。
また、**ユーザータイプの詳細や最新情報は公式ガイドを参照ください。**

**↓↓↓ 公式ガイドはこちら**

https://docs.newrelic.com/docs/accounts/accounts-billing/new-relic-one-user-management/user-type/

# その他

New Relicでは、**新しい機能やその活用方法**について、QiitaやXで発信しています！
**無料でアカウント作成**も可能なのでぜひお試しください！

:::note info
New Relic株式会社の[X(旧Twitter)](https://x.com/NewRelicJapan) や [Qiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::
リクエストスペックが推奨されるのか？

## TLTR;
**コントローラースペック**: コントローラー内部の特定のロジックと実装を検証し、ユーザー体験とは多少距離があります。
**リクエストスペック**: HTTPリクエストからレスポンスまで全体のユーザーフローを検証し、実際のユーザー体験を反映します。

## なぜリクエストスペックが推奨されるのか？
Railsでリクエストスペックが推奨される理由を理解するために、まずRailsのリクエスト処理の流れを見てみましょう。

### ステップ 1: HTTPリクエストの受信
ユーザーがブラウザでURLを入力すると、HTTPリクエストがウェブサーバー(Puma, Unicornなど)に届きます。

### ステップ 2: Rackミドルウェアの処理
HTTPリクエストを受け取ると、Rackがこれを標準化し、セキュリティ、ログ記録、キャッシング、セッション管理などの定義されたRackミドルウェアを順次実行します。

### ステップ 3: ルーター処理
Rackミドルウェアを通過したリクエストは、Railsルーターに渡され、適切なコントローラーとアクションが決定されます。

### ステップ 4: コントローラーアクションの実行
ルーターがURLとメソッド(GET, POSTなど)に応じてリクエストを処理するコントローラーとアクションを特定すると、Railsはそのコントローラーアクションにリクエストを渡します。

### ステップ 5: コントローラーロジックの処理
コントローラーはアクションを通じてリクエストデータを受け取り、必要な処理を行い、結果をビューに渡して最終的なレスポンスを生成します。

### ステップ 6: 実際のHTTPレスポンスの返却
コントローラーで生成されたレスポンスは再びRackを通じてウェブサーバーに戻り、最終的にユーザーに届けられます。

この流れは、ユーザーが実際にサービスを使用する際のステップを構成しています。したがって、テストも実際のユーザー体験に近い環境で行うことが効果的です。

コントローラーテストは上記のステップのうち4~5のみに焦点を当て、コントローラー自体を検証するため、ユーザーが体験する流れの一部だけをテストします。対してリクエストテストはすべてのステップを含み、ユーザー体験の全体を検証するため、よりユーザー視点に適したテストと言えます。

[DHHがRails Issueに残したコメント](https://github.com/rails/rails/issues/18950)によれば、

「コントローラーで設定されるインスタンス変数をテストするのは良くないアイデアです。テストが知るべきことを大幅に超えてしまいます。クッキーやHTTPコード、ビューの見た目、データベースへの影響などをテストするのは良いですが、コントローラーの内部動作をテストするのは良くありません」 – DHH

DHHの意見では、テストはコントローラーの内部ではなく、実際のユーザー体験に焦点を当てるべきだとしています。コントローラーテストは内部構造の依存性が高く、テンプレートファイル名の変更などでテストが破綻しやすくなります。

そのため、Rails 5以降ではRailsチームやRSpecチームもリクエストテストを推奨しています。

## 結論
コントローラーテストとリクエストテストの違いは、検証範囲とユーザー体験にどれだけ近いかが中心です。コントローラーテストはコントローラー内部ロジックに重点を置き、特定のインスタンス変数やレンダリング動作に依存しやすく、ユーザー視点とは直接関係がありません。一方、リクエストテストはHTTPリクエストからレスポンスまでの全体を検証し、より現実的で信頼性の高いテストを提供します。

結論として、コントローラーテストは実装に集中し、リクエストテストはユーザー観点で全体のリクエストフローを検証するという点が大きな違いです。

## 参考資料
- [RSpec 3.5 has been released! - RSpec](https://rspec.info/blog/2016/07/rspec-3-5-has-been-released/)
- [Deprecate assigns() and assert_template in controller testing - DHH](https://github.com/rails/rails/issues/18950)
Vitest でデフォルトの exclude ルールをベースに Project のルールを設定する。


## はじめに

- Vitest を導入した Project で Vitest に参照してほしくない path が出てきた
  - 今回はテストカバレッジの集計から除外したかった
- デフォルトの設定を維持しつつ設定を追加したい場合以下のように設定すれば良い

## default 設定を維持したまま除外する

`coverageConfigDefaults` を import し、 `Other exclude config here ...` と記載している場所に設定を追加すれば良い。

```diff_typescript:vite.config.ts
  import { defineConfig } from "vite";
+ import { coverageConfigDefaults } from "vitest/config";

  export default defineConfig({
    test: {
      exclude: [
+       ...coverageConfigDefaults.exclude,
        // Other exclude config here ...
      ]
    },
  });

```

## Ref

https://vitest.dev/config/#coverage-exclude
【AWS】AWS-SOA合格体験記

## 受験前の取得済み資格
・LPIC Level2
・AWS-SAA
・Java-Silver

## 使用した書籍やサイト
・CloudTech　資格会員：３か月分4980円（Web問題集）

https://kws-cloud-tech.com/


・公式サンプル問題集（10問＋デモ操作問題1問）

https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sysops-associate/AWS-Certified-SysOps-Administrator-Associate_Sample-Questions.pdf

・AWS Skill Builder内のサンプル問題（20問）

https://explore.skillbuilder.aws/learn/course/external/view/elearning/12555/aws-certified-sysops-administrator-associate-official-practice-question-set-soa-c02-japanese


## 受験までの期間
・約１か月（１日：約２時間の勉強ペース）

## 試験までの流れ
１．CloudTechのAWS資格演習対策講座のSOA-C02を10問単位でひとまず一周してみる。
　（1周目は、問題を間違えて当たり前の精神で臨む！）

２．引き続き、CloudTechの演習問題を複数周して、平均９割の回答率まで上げる。
　（自分は、３～４周かかりました。）

３．peasonVUEで受験予約

４．AWS公式及びAWS Skill Builderのサンプル問題を解いてみる。
　（自分は、AWS公式:8/10、AWS Skill Builder:16/20でした。）

５．試験

## 受験してみての感想
　AWS-SOAを受験する前にAWS-SAA合格しといた方がいいと感じました。（AWS-SOAの方が、より深い知識を問われるため。）
　
 また、今回はCloudTechのWeb問題集を使用し、試験対策を行いましたが、実際に試験で問われる問題も類似した内容のものが多数あり、CloudTechのおかげで合格できたと感じました。
　
 今回のAWS-SOAの試験では、デモ操作はありませんでしたが、事前にテスト問題の内容をAWSコンソールを使用して実際に操作をやってみることをオススメします。
 （手を動かすことによる理解度がまるで違います！）
 
 是非、受験を考えている方の参考にしていただけると幸いです。
Notion上で簡単に図を書く方法【mermaid】

# はじめに

Notionを使っていると、「簡単な図を使って説明したいけど、パワポで作るほどじゃないんだよな～。」ってことがたびたび起きるかと思います。

そんな時はコードブロックでmermaid記法を使うことで解決できるかもしれません。

# mermaid記法の使い方

## 使い方の流れ

- 「```」でコードブロックを呼び出す
- 左上のプルダウンから、言語を”mermaid”に選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916360/df97af86-51b6-870f-1194-1d11536147d3.png)
- コードを打ち込む
- コードに応じた図が表示される



## サンプルコード

```
graph LR
  Mermaid -- hoge --> Diagram
```

上記のサンプルコードを打ち込むと、以下のような簡単な状態遷移図が表示されたと思います。また、左上のプルダウンから表示方法を変更すると、図のみの表示なども行えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916360/571317be-b377-03d6-2c51-598024330da6.png)

## 基本的な記法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916360/0cfe1537-9492-31e1-39ae-e89eae4978e7.png)

基本的には状態遷移の式を一つずつ連ねていくような構文になっています。

```
graph LR
```

「LR」としている部分を「TD」にすると縦長の図になったり、「graph」としている部分を変更すると状態遷移図以外のグラフがかけたりします。

```
B -- arrow --> C
```

矢印の補足説明なども行えます。

```
hoge{D} --> B
hoge --> C
```

ノードに対して変数のように名前を与えることもできます。
このコードだと、Dという表示をしているノードに対してhogeという命名をすることで、
次の行でもhogeという名前で呼び出すことが可能になっています。

また、囲む記号を()や[]にすることでノードの形を変更することも可能です。

# mermaidチートシート

## ダイアグラム

- `graph` or `flowchart`：フローチャート
    - `TB` or `TD`：上から下
    - `BT`：下から上
    - `LR`：左から右
    - `RL`：右から左
- `sequenceDiagram`：シーケンス図
- `classDiagram` ：クラス図
- `gantt` ：ガントチャート
- `stateDiagram` ：状態図
- `pie` ：パイチャート

## ノードの形

- `A[ ]`：長方形
- `A{ }`：ひし形
- `A( )`：角丸長方形
- `A([ ])`：楕円
- `A(( ))`：円

## 矢印の種類
- `-->` 矢印
- `==>` 太矢印
- `-.->` 点線矢印
- `<-->` 両矢印
- `--o` 丸矢印
- `--x` バツ矢印

# 使い方の提案

- データ構造の図示
- 組織図の図示

# まとめ

今回説明した文法で基本的な図は書けて、自動でそこそこキレイな図を出してくれるので、課内や部内で使う分には問題がないかと思われます。
ここのチートシートで書いた以外にもいろんな文法があるので、mermaidについて勉強するとより整った図が描けるようになるかと思います。

## 参考サイト

https://biz-notion.northsand.co.jp/partners-notion-blog/pnb0025

https://zenn.dev/fm_radio/articles/5ee416119bfa69

https://kashika.biz/flowchart-5/

https://qiita.com/hirokiwa/items/8170fd9111f302faeb23
LambdaからRDSにアクセスができない理由

初めまして！CREとしてエンジニアをやってますkazuです🦌
業務では、社内システム自動化プロジェクトに携わってましてその中でLambdaから RDSへのアクセスがなぜできないのかという疑問が湧いてきたので、それぞれの役割と関係性について調べました。

# そもそも、LambdaからRDSに接続することになったワケ

本プロジェクトは、要件定義から開発まで一貫して担当しているプロジェクトであり、これまで社内において手動でやっていたのものを自動化する事が目的です。最終的にはLambdaからRDSにアクセスをし、本番DBの値を更新する事でその結果をSlackに通知する事を目指しています。

正直なところAWSに関する知識は乏しく、「Lambdaを呼び出して実行すれば、本番DBを更新できるだろう」と考えていました。

しかし、インフラ構成図をもとにフィードバックを受ける中で、LambdaからRDSへのアクセスが簡単ではないことを知り、その理由について疑問が湧いてきたので調べることにしました。

# なぜ、LambdaからRDSへ接続ができないのか

- ```RDSの作成場所がVPC内であること``` 
- ```VPCに接続するには、同じVPCのプライベートサブネット空間にLambdaを配置する必要がある```

## RDSの作成場所がVPC内であること

Auroraなどの RDSは、基本的にVPC内のプライベートサブネットに配置されます。これは、セキュリティ面を考慮して、外部から直接アクセスできないようにするためです。パブリックネットワークに露出させないことで、外部からの不正アクセスリスクを低減し、安全性を確保しています。これにより、データベースを社内や関連システムからのみアクセス可能な状態に保つ事ができます。

## VPCに接続するには、同じVPCのプライベートサブネット空間にLambdaを配置する必要がある

 VPC内のプライベートサブネットにある RDSに接続するためには、Lambdaも同じVPCのプライベートサブネット内に配置する必要があります。Lambdaの配置場所は、パブリックサブネットとプライベートサブネットのどちらかを選択する事が可能ですが、RDSとの接続を前提とする場合は、プライベートサブネット内にLambdaを置きます。

# Lambdaがインターネットと接続できない

ここで、一つ問題があります。Lambdaをプライベートサブネット内に配置することで、RDSへのアクセスは可能になりましたが、インターネットとの接続ができません。

プライベートサブネット内にあるLambdaが外部のAPIやインターネットリソースにアクセスする必要がある場合、以下のような方法を使ってインターネット接続を実現する事ができます。

## NATゲートウェイを使う

 NAT（Network Address Translation）ゲートウェイは、プライベートサブネット内のリソースがインターネットに接続できるようにするAWSのサービスです。 NATゲートウェイをパブリックサブネットに配置し、プライベートサブネット内のLambdaからインターネットにリクエストを送ると、そのリクエストはNATゲートウェイを通じてインターネットに出ていきます。これにより、プライベートサブネット内にあるLambdaが安全に外部通信を行えるようになります。

 NATゲートウェイは一方向の通信を許可する仕組みであり、インターネットからの直接アクセスはできないため、セキュリティを保ちつつインターネット接続する事が可能になりました。
paizaラーニング問題集「【計算 2】疑似乱数」を解いてみた

https://paiza.jp/works/mondai/b_rank_new_level_up_problems/b_rank_new_level_up_problems__similar_randamize

▼考え方

題意の通りコーディングしました。

▼コード
```py
########## 処理0(準備) インプット,変数定義 ###########

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

# X_total: 疑似乱数の計算式のうちXの数列部分を格納する変数
X_total = 0

########## 処理1 疑似乱数の計算と出力 ###########

for i in range(1,N+1):
    X_total += X**i
    print(X_total%M)
```
paizaラーニング問題集「【計算 1】マンハッタン距離」を解いてみた

https://paiza.jp/works/mondai/b_rank_new_level_up_problems/b_rank_new_level_up_problems__taxi_distance

▼考え方

題意の通りコーディングしました。

▼コード
```py
########## 処理0(準備) モジュールインポート,インプット,リスト定義 ###########

import math

P_x,P_y = map(int,input().split())

N = int(input())

d: ユークリッド距離,マンハッタン距離,地点の番号を格納するリスト
d = []

########## 処理1 ユークリッド距離,マンハッタン距離の計算 ###########

for i in range(N):
    
    x,y = map(int,input().split())
    
    d.append([math.sqrt((x - P_x)**2 + (y - P_y)**2),abs(x - P_x) + abs(y - P_y),i+1])

########## 処理2 地点Pからの距離が近い3地点の番号を出力する ###########

for i in range(2):

    # d_sorted: リストdを、ユークリッド距離あるいはマンハッタン距離でソートしたリスト
    d_sorted = sorted(d, key=lambda x:(x[i],x[2]))
    
    for j in range(3):
        print(d_sorted[j][2])
```