OmniAICreator/Qiita-1.07M huggingface dataset:
Databricksランタイムのサポートライフサイクル

[Databricks runtime support lifecycle \| Databricks on AWS](https://docs.databricks.com/release-notes/runtime/databricks-runtime-ver.html) [2021/10/19時点]の翻訳です。

> [Databricksクイックスタートガイド](https://qiita.com/taka_yayoi/items/125231c126a602693610)のコンテンツです。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

DatabricksではランタイムをBetaとGAバージョンでリリースします。Databricksでは、ランタイムバージョンが以下の場合でない場合にはGAバージョンを6ヶ月サポートします。

- Long Term Support (LTS)バージョン。LTSバージョンは6ヶ月おきにリリースされ、2年間サポートされます。
- Databricks Lightランタイム。Lightバージョンはリリース後12ヶ月、あるいは次のDatabricks Lightのリリース後2ヶ月サポートされます。期限は早い方が適用されます。

サポートされなくなったランタイムバージョンのワークロードは実行し続けることは可能ですが、Databricksによるサポート、修正を受けることはできません。

詳細に関しては、以下の表を参照ください。

# Databricksランタイムバージョンに対するサポートのライフサイクル

| フェーズ | 保証 |
|:--|:--|
|ベータ   |サポートのSLAは適用されません。詳細は[Databricks Runtime preview releases](https://docs.databricks.com/release-notes/release-types.html#runtime-releases)をご覧ください。   |
|フルサポート   |主要な安定性、セキュリティに関する修正がバックポート(新バージョンから旧バージョンへの移植)されます。<br><br>Databricksが6ヶ月おきにリリースし、2年間サポートする**Long** **Term** **Support** (LTS)バージョンを除いて、Databricksランタイムバージョンに対するフルサポートは6ヶ月継続します。   |
|エンドオブサポート(EOS)   |バージョンはサポートされません。<ul><li>これらのバージョンで実行されるワークロードはDatabricksのサポート受けることができません。<li>Databricksは修正をバックポートしません。</ul>サポートされるリリースは、エンドオブサポートの日付とともに[Supported releases](https://docs.databricks.com/release-notes/runtime/releases.html#supported-releases)で公開されています。<br><br>サポートされないリリースは[Unsupported releases](https://docs.databricks.com/release-notes/runtime/releases.html#unsupported-releases)で公開されています。   |
|エンドオブライフ(EOL)   |Databricksにおいては、サポート終了後は事前通知なしに任意のタイミングでAPIからリリースバージョンを完全に削除する権利を有します。   |

# Databricks Lightランタイムバージョンに対するサポートのライフサイクル

| フェーズ | 保証 |
|:--|:--|
|ベータ   |サポートのSLAは適用されません。詳細は[Databricks Runtime preview releases](https://docs.databricks.com/release-notes/release-types.html#runtime-releases)をご覧ください。   |
|フルサポート   |主要な安定性、セキュリティに関する修正がバックポート(新バージョンから旧バージョンへの移植)されます。<br><br>フルサポートはリリース後12ヶ月、あるいは次のDatabricks Lightのリリース後2ヶ月サポートされます。期限は早い方が適用されます。   |
|エンドオブサポート(EOS)   |バージョンはサポートされません。<ul><li>これらのバージョンで実行されるワークロードはDatabricksのサポート受けることができません。<li>Databricksは修正をバックポートしません。</ul>エンドオブサポートはリリース後12ヶ月、あるいは次のDatabricks Lightのリリース後2ヶ月となります。期限は早い方が適用されます。  |
|エンドオブライフ(EOL)   |Databricksにおいては、サポート終了後は事前通知なしに任意のタイミングでAPIからリリースバージョンを完全に削除する権利を有します。   |

:::note info
**注意**
[Databricks integrations](https://docs.databricks.com/integrations/index.html)で示されているものを含め、サードパーティによって提供される製品、サービスはこのポリシーではカバーされません。
:::

REST API呼び出しにおけるDatabricksランタイムバージョンの文字列の構成方法に関しては、[Runtime version strings](https://docs.databricks.com/dev-tools/api/index.html#programmatic-version)をご覧ください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
[Oracle] 全テーブルのデータを削除する/データ件数を確認する [オラクル]

## やりたいこと
全てのテーブルデータを削除したい。
全てのテーブルのデータ件数を確認したい。

上記のように「全てのテーブルに〇〇したい」という操作を簡単に行う方法を紹介します。


## テーブル(表)のデータを削除するSQL
OracleのSQLでデータを削除する方法は「DELETE」と「TRUNCATE」の2種類があります。
操作を取り消す必要がない場合は「TRUNCATE」が圧倒的に高速なのでおすすめです。
ただし取り消す（ROLLBACK）ことはできないので注意が必要です。

```sql
-- 特定テーブルのデータを全て削除する（ROLLBACK不可）
TRUNCATE TABLE ＜テーブル名＞;
```

```sql
-- 特定テーブルのデータを全て削除する（ROLLBACK可）
DELETE FROM ＜テーブル名＞;
```


## 全てのテーブルのデータを削除する方法
特定テーブルのデータを削除する方法は紹介しました。
全てのテーブルのデータを削除するためには、テーブルの数だけ「TRUNCATE」を実行する必要があります。
「TRUNCATE」文を用意することができれば削除は簡単です。ここでは全てのテーブルに対して「TRUNCATE」文を簡単に用意する方法を紹介します。

```sql
SELECT 'TRUNCATE TABLE '||table_name||';' FROM user_tables ORDER BY table_name;
```

このSQLを実行すると、対象のDBユーザの全てのテーブルに対する「TRUNCATE」文が表示されます。
あとは、コピー＆ペーストでファイルに保存したり直接実行することで、データの削除が行えます。
RubyでSOLID原則1: 単一責任原則

# 初めに
良い設計の指針としてSOLID原則があります。
ただ多くの書籍で例としてあげられるのはjavaのコードだったりします。javaだとInterfaceを明示的に定義できるので例としてわかりやすいからかなと思います。そこで個人的な復習も兼ねて、普段から利用しているRubyでSOLID原則を説明していきます。

# 単一責任原則
単一責任原則は、よく以下のように説明されます。

`1つのクラスは1つだけの責任を持たなければならない`
`クラスを変更する理由はたったひとつである`

なるほどーとは思いますが、いまいちピンときません。
懺悔すると、「クラスっていろんなメソッドあるんだから、それぞれに違った責任あるだろ」、「クラスが変更される理由って色々あるだろ」って思ってました。
そこで、かの名著『Clean Architecture』を参照すると、
> モジュールはたったひとつのアクターに対して責務を負うべきである。

と書かれています。アクターとはアプリケーションを利用するユーザや外部のシステムです。
言い換えれば、複数のアクターの仕様変更によってそのクラスが変更されるとき、そのクラスは単一責任原則に反しています。
と言っても分かりにくいので例を見てみます。

# 単一責任を破っている例
単一責任原則を説明されるときによく使用される例として、給与計算をとりあげます。
給与計算のメソッドとして`calculate_payment`があります。さて、給与は労働時間*1000で定義されます。労働時間は1時間以下の四捨五入で計算されます。

```ruby
class Engineer
  def calculate_payment
    working_hours * 1000
  end

  def working_hours
    (endTime - startTime).round
  end
end
```

労務部は、システムから`calculate_payment`を見てエンジニアの給与を支払います。一方、技術部ではエンジニアの工数を管理するために`working_hours`を利用しています。
ある時、技術部で工数の計算を四捨五入ではなく、1時間以下も正確に把握したいという要望が上がりました。
そこで、`working_hours`の`round`を消します。しかし、その修正をしたエンジニアは給与計算でも同じメソッドを利用していることを知りませんでした...
こうして、バグに気づくまで間違った給与を払い続けることになってしまいます。

# 解決策
なぜ問題が起こったかといえば、もちろん単一責任原則を破っていたからです。
単一責任原則とは、
> モジュールはたったひとつのアクターに対して責務を負うべきである。

でした。ここでのモジュールは、文脈によってクラスやメソッド、関数と言い換えることができます。
では先ほどの例を見てみましょう。まず、`working_hours`メソッドは単一責任原則を守っていません。なぜなら、労務部と技術部の二つのアクターによって利用されているからです。各アクター固有の仕様変更によって`working_hours`メソッドは変更されます。

## メソッドの分離
この問題の最も簡単な解決策は、`working_hours`メソッドをそれぞれのアクター用に分けることです。例えば、`payment_working_hours`と`man_hours`に分けておくことです（たとえコードが重複するとしても)。すると、技術部が工数の計算方法を変更したとしても労務部でバグが出ません。これで少なくとも、メソッド単位での単一責任になりました。
しかし、クラス単位で見ると単一責任原則を守れていません。そもそも単一責任を守れないメソッドを作ってしまった原因はこのクラスの責任範囲が大きすぎることにあります。

## クラスを分ける
この`Engineer`クラスは労務部と技術部の二つのアクターから利用されるので、単一責任原則を破っています。なぜ単一責任を破ってしまうかというと、`Engineer`は非常に大きな主語なので、複雑かつ大きな責務を負いがちな命名だからです。

どうのようにクラス設計すればよかったのでしょうか。クラスの分け方は様々考えられますが、例えば`EngineerPayment`クラスと`EngineerManHours`クラスに分けることも考えられれます。予めクラスを分けておけば、そもそも`working_hours`メソッドをそれぞれが使ってしまうことはありません。
このように単一責任なクラスを意識して設計しておくと、前述のようなバグを未然に防ぐことができます。

# Railsではどうするの?
おまけ程度にRailsについて。
さて、Rubyを利用してる多くの現場では、フレームワークとしてRailsを採用しているんじゃないかと思います。Railsでは、DBのスキーマ構造がそのままモデルクラスへと反映されます。そのため、前述したような主語の大きなクラスが容易に作られます。

例えば、DBに`engineers table`があれば当然`Engineer`クラスが作られます。`Engineer`クラスがあればその中で`working_hours`のようなメソッドが作られやすくなります。規模が大きくなれば、Engineerクラスは巨大で複雑なロジックを多数抱えるFatModelとなります。
これは、Railsのようなスピーディな開発を提供するフレームワークのデメリットです。もちろん、Railsにはそれを補ってあまりあるメリットがあるため、多くの企業で利用され続けています。

## 対策
RailsでFatなモデルが作られることは、ある程度仕方のないことです。しかし、できる限り対策はしておきたいものです。手のつけられないほどFatになったモデルをリファクタリングするのは、かなりの気合と時間を要します。

まず、第一にメソッドレベルの単一責任原則は必ず守ることが大切です。なので、`working_hours`メソッドをそれぞれのアクターで利用してはいけません。必ず、別メソッドにしましょう。安易な共通化ほど危険な物はありません。

次の対策として、ActiveRecordに依存しないプレーンなrubyクラスを作成します。`Engineer`クラスはどうしても責任を複数負いがちなクラスです。そんな時は各責任ごとにプレーンなrubyクラスを定義すると良いでしょう。

と言いつつ、リファクタリングが困難になるほどFatなモデルになることは稀で大体その前にサービス終了します()
2022/3/7主にITとかセキュリティの記事

サイバー攻撃25倍に増加　ウクライナ侵攻からリスク高まる(3/4)
https://news.tv-asahi.co.jp/news_economy/articles/000246803.html

セキュリティを強化した企業や政府機関向け新型AndroidスマホをブラジルのSikurが発表(3/5)
https://jp.techcrunch.com/2022/03/05/2022-03-03-sikur-one/

サイバー攻撃｢ロシア｣が本気を出すとどうなるか今のところ積極的な攻撃は見られないが…(3/4)
https://toyokeizai.net/articles/-/536076?display=b

音響タグを魚に取り付けて位置を追跡——Raspberry Pi制御の自律型無人船「Fish Otter」(3/4)
https://fabcross.jp/news/2022/20220304_fishotter.html

イーサリアムの主要サービス、特定地域のユーザーをブロック | coindesk JAPAN | コインデスク・ジャパン(3/4)
https://www.coindeskjapan.com/142218/

サービスメッシュは「OSS」と「サポート付き」のどちらを選ぶべきか？(3/4)
https://techtarget.itmedia.co.jp/tt/spv/2203/04/news01.html

NFTマーケットプレイスのオープンシー、制裁対応でイラン人ユーザーをブロックか(3/4)
https://jp.cointelegraph.com/news/opensea-updates-banned-countries-list-sparking-decentralization-debate

事務用パソコンがウイルス感染　那須南病院(3/5)
https://www.shimotsuke.co.jp/articles/-/561455

ロシア、ＦＢへのアクセスをブロックすると発表(3/5)
https://www.cnn.co.jp/tech/35184476.html

一般的ロシア人は仮想通貨が「ライフライン」－コインベースＣＥＯ(3/4)
https://www.bloomberg.co.jp/news/articles/2022-03-04/R87QGAT0AFB401

ネットワークの脅威だ！　スパイウェアって何？　それは「PC（パソコン）の中でユーザの個人情報を盗んで、別の場所に送ってしまうプログラム」です！(3/4)
https://mbp-japan.com/tokyo/itlaboj/column/5106165/

GitHub、ロシアからのアクセス遮断を拒否(3/4)
https://www.zaikei.co.jp/article/20220304/662814.html

子どものスマートフォンはセキュリティ対策が不十分(3/5)
https://forbesjapan.com/articles/detail/46187

Teams会議は録音できる! 共有・ダウンロード方法なども紹介(3/4)
https://news.mynavi.jp/article/20220304-2259285/

【Tips】Apple製品同士で簡単に写真などのやりとりができる「AirDrop」機能の使い方(3/4)
https://iphone-mania.jp/manual/kihon-437699/

？マーク羅列のメール、埼玉・朝霞市職員から届く…ウイルス添付、危険なリンクある可能性　市が接続を遮断(3/4)
https://www.saitama-np.co.jp/news/2022/03/04/10.html

ソフトウェア開発をベトナムで行う方法～必要となる契約・労働法・法規制・ライセンスの知識とは？～(3/16開催)
https://www.nishimura.com/ja/seminars/85883.html
技術者ができるウクライナ支援 - ひまわりをサイトに書こう

![uk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149448/38cde16b-4cac-aca2-2cb3-668442973925.png)

## この、過去最悪のパンデミックから立ち上がりましょう。
🌻ぐだぐだ政治的なことをあたしが言ってもいいのですが、今回は書くことだけに専念します。

## なぜ、ひまわり？
🌻ウクライナの国花ではありますが、ずっとサイトに貼り付けていても普通にかわいいかと思います。

## HTMLで普通に書く

```
&#x1f33b;
```
```
<title>&#x1f33b;site name</title>
```

## CSSのリストアイコンにする

```
body {
	font-size: 16px;
}

li {
	list-style-type:none;
}

li:before {
	font-size: 18px;
	content:"\1f33b";
}
```

ちょっと文字サイズを大きめにしておいたほうがよさそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149448/a505c652-968d-f392-2ec9-20b26d9b7ed6.png)

## さいごに
とても簡単すぎる記事ではありますが、みなさまが立ち上がっていただけることで、世界平和につながると思います。
【Vue.js】画像を圧縮、リサイズ、リネームしてダウンロードする

# 使用したライブラリ
browser-image-compression

https://github.com/Donaldcwl/browser-image-compression

file-saver

https://www.npmjs.com/package/file-saver

ここでは上記の2つのライブラリを使用する。

# ライブラリのインストール
npmもしくはyarnでインストール。
```
npm install browser-image-compression
or
yarn add browser-image-compression
```

```
npm install file-saver
or
yarn add file-saver
```

# 画像圧縮・リサイズ・リネーム・ダウンロードの流れ

1. フォームでの画像の選択時、画像をscriptで受け取る
2. 受け取った画像を圧縮・リサイズ・リネームする
3. 自動で画像をダウンロードする

```vuejs:ImageResize.vue (template部分)
<template>
  <div>
    <p>画像名を入れてください</p>
    <input type="text" v-model="imageName" />
    <input
      type="file"
      accept="image/*"
      label="写真"
      ref="preview"
      @change="handleImageUpload()"
    />
  </div>
</template>
```

```vuejs:ImageResize.vue (script部分)
<script>
import imageCompression from 'browser-image-compression'
import { saveAs } from "file-saver"

export default {
data() {
  return {
    imageName: "", 
  }
},
methods: {
  handleImageUpload() {
    const imageFile = this.$refs.preview.files[0];

    const options = {
      maxSizeMB: 1, // 圧縮サイズの最大値を指定
      maxWidthOrHeight: 400, // 画像の縦横を指定 (比率で縮小)
      useWebWorker: true
    }
    imageCompression(imageFile, options)
      .then((compressedFile) => {
        saveAs(compressedFile, this.imageName); // 画像のダウンロード
      })
      .catch((error) => {
        console.log(error.message);
      });
    }
  }
}
</script>
```
今までは画像加工ツールを使用して1枚1枚加工していたのですが、
これで簡単に画像の圧縮、リサイズ、リネームができるようになりました！
Laravel  __( )は何を表してる？

# __( ) の意味が知りたい

Authのbladeテンプレートにそれはあった。

```html
  <li class="nav-item">
     <a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a>
  </li>
```
 " __('Login') " この記述の意味を知りたい

## ヘルパ関数の一つらしい
 __（アンダーバー 2つ）はヘルパ関数の一つ

### ヘルパ関数とは
通常「ヘルパ」と呼び、PHPとは別にLaravelが用意した関数で、自作も可能らしい

https://readouble.com/laravel/8.x/ja/helpers.html

## __() は何をする関数か
>__関数は、指定した翻訳文字列か翻訳キーをローカリゼーションファイルを使用し、翻訳します。 
>(Laravel 日本語ドキュメントより引用)

config\app.php の Locale で指定されている言語ファイルを参照し、そこから翻訳文字列を読み込み出力する関数みたいです。

### 翻訳文字列の取得

例えば「{{ __('messages.hello') }}」の場合、日本語ならresources/lang/ja/messages.phpを参照、
```php:resources/lang/ja/messages.php
'hello' => 'こんにちは'
```
と書いていれば、「こんにちは」が出力されると言った感じです。
ファイル名 **.** 翻訳文字列


### 翻訳文字列がキーになっている場合

別のパターンで「{{ __('hello') }}」の場合は、resources/lang/ja.jsonを参照、
```json:resources/lang/ja.json
{
    "hello" : "こんにちは"
}
```
と書いていれば、「こんにちは」が出力されます。
翻訳文字列をキーにして使用する翻訳ファイルは、JSONファイルとしてresources/langに用意する必要があります。 

# まとめ
他にも、単数形と複数形の文字列を区別して指定することもできるらしいです。
詳細はドキュメントを見てください。

https://readouble.com/laravel/8.x/ja/localization.html#retrieving-translation-strings
Unity DOTSの環境構築が大変すぎた

Unity DOTSの環境構築で苦労したので、プロジェクトのセットアップ方法をメモします。

※DOTSは記事執筆時点でUnity2020を推奨しています(コメント参照)

# 最終的な環境
| Package | Version |
|:-|:-|
| Unity | 2021.2.14f1 |
| com.unity.collections | 0.15.0-preview.21 |
| com.unity.entities | 0.17.0-preview.42 |
| com.unity.render-pipelines.universal | 12.1.5 |
| com.unity.rendering.hybrid | 0.11.0-preview.44 |

# Entitiesのインストール
PackageManagerからパッケージ名を指定してcom.unity.entitiesをインストールすると、なぜかcom.unity.collectionsの最新版がインストールされるため、事前にmanifest.jsonにcom.unity.collectionsの0.15.0-preview.21を追記しておきます。
ついでにcom.unity.entitiesもここで追加しましょう。

# Hybrid Rendererのインストール
Unity2022.1ではUnityEngine.Rendering名前空間の中身が変わっているようなので、Unity2021.2を使いましょう。
Package Managerからパッケージ名を指定してインストールしましょう。
【React】manifest.jsonについて

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## manifest.jsonについて

Reactアプリケーションをcreate-react-appで作成するとpublicフォルダにmanifest.jsonというファイルが存在します。
このmanifest.jsonを編集することでスマートフォン等で「ホーム画面に追加」した際のアイコンやUI等に関する設定をすることができます。

初期状態は以下のようになっています。

```sample-pwa/public/manifest.json
{
  "short_name": "React App",
  "name": "Create React App Sample",
  "icons": [
    {
      "src": "favicon.ico",
      "sizes": "64x64 32x32 24x24 16x16",
      "type": "image/x-icon"
    },
    {
      "src": "logo192.png",
      "type": "image/png",
      "sizes": "192x192"
    },
    {
      "src": "logo512.png",
      "type": "image/png",
      "sizes": "512x512"
    }
  ],
  "start_url": ".",
  "display": "standalone",
  "theme_color": "#000000",
  "background_color": "#ffffff"
}

```

### 主要なプロパティについて
#### `short_name`および`name`
アプリケーションの名前を設定します。
`short_name`はホーム画面、ランチャー等やアプリケーション名が表示されるスペースが狭い場合に表示されます。

#### `icons`
アイコンを設定します。
`src`,`type`,`sizes`を設定する必要があります。
アイコンはホーム画面、アプリランチャー、タスクスイッチャー、スプラッシュ画面などで使用されます。
スプラッシュ画面は後述のdisplayにfullscreenかstandaloneを指定する必要があります。

#### `start_url`
ホーム画面に追加したアイコンをタップしてアプリケーションを起動した際に最初に表示する画面を指定します。
何も設定していない場合には、ユーザーが「ホーム画面に追加」した際に表示していた画面が表示されるようです。
`/?utm_source=pwa`を追加することでGoogle Analyticsでアプリの起動頻度を追跡することができます。

#### `background_color`
スプラッシュ画面の背景色を指定します。

#### `display`
ホーム画面から起動した際のUIを指定します。
`fullscreen`,`standalone`,`minimal-ui`,`browser`のいずれかを設定します。
`standalone`はネイティブアプリケーションのような表示、`browser`はブラウザで表示した際と同じUIとなります。
前述の通り、スプラッシュ画面は`fullscreen`か`standalone`を指定する必要があります。

#### `orientation`
表示する画面を指定し、固定することができます。
`landscape`（横向き）か`portrait`（縦向き）を指定します。

#### `scope`
スコープを設定します。
スコープ外のページにはdisplayを`standalone`に設定していても以下のようなツールバーが表示されるようになります。
![IMG_8A85C8417A23-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/52e5face-9d92-30fc-dbe3-fddef002934f.jpeg)

#### `theme_color`
ツールバーとタスクスイッチャーの色を設定します。

#### `description`
アプリケーションの説明を追加することができます。

### 設定できているかの確認方法
manifest.jsonに記述して想定通り設定できているかどうか確認するには、スマートフォン等で実際に「ホーム画面に追加」してみて確認する他にPCではディベロッパーツールの「アプリケーション」で設定の状況やエラー等を確認することができます。
![スクリーンショット 2022-03-07 0.56.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/de8ebfb8-1b7c-e54d-e7dd-30a32ab652f8.png)
UnityでC++プラグイン・iOSプラグインを使用する

# 概要
UnityでC++を呼び出し、さらにOSの機能を使用するためにSwiftを使用する方法について調べたので備忘録として残します。
また、SwiftからC++のコールバックを呼び出すための方法についても調べました。

# 前提
- macOS Big Sur バージョン11.6.2
- Xcode バージョン13.2.1
- Unity 2019.4.19

# 内容/手順
C++ Static LibraryとiOS Native Pluginを作成し、Unityに組み込んで使用できることを目指します。
UnityでiOS Native Pluginを使用する方法については以下の記事を参考にさせていただきました。
https://qiita.com/fuziki/items/955c2b35514bcfc37969


## 1. SwiftのFrameworkを作成する
Swift Package Managerを使用し、Frameworkを作成する。

①typeにlibrary、nameにSwiftPluginを指定しパッケージを初期化する。
```
swift package init --type=library --name=SwiftPlugin
```
②パッケージの作成後、Package.swiftを開く。
```
open Package.swift
```

③Swiftで関数を作成する
c++のコールバックを登録する関数を作成します。
```swift
public typealias Callback = @convention(c) (UnsafePointer<CChar>?) -> Void
cppCallback: Callback? = nil

@_cdecl("registCppCallback")
public registCppCallback(_ callback: @escape Callback) {
    cppCallback = callback
}
```
次に、コールバックを呼び出す関数を作成します。
```swift
@_cdecl("cppCallbackFromSwift")
public func cppCallbackFromSwift() {
    let str = "Swift Message."
    cppCallback!(str)
}
```

ここでは@_cdeclを使用し、Cの関数として定義します。
これによってC++から直接呼び出すことができるようになります。

④Frameworkをビルドする
xcodeprojを作成します。
```
swift package generate-xcodeproj --skip-extra-files
```
次に、xcodebuild を使って出力した xcodeproj から framework を作成します。
CONFIGURATION_BUILD_DIR に指定したディレクトリに、.framework 作成されます。
```
xcodebuild -project SwiftPlugin.xcodeproj -scheme SwiftPlugin-Package -configuration Release -sdk iphoneos CONFIGURATION_BUILD_DIR=.
```
指定したディレクトリにSwiftPlugin.frameworkが作成されていれば成功です。


## 2. C++ Static Libraryを作成する
Swiftと連携するためのC++の処理を作成します。
③C++で関数を作成する
```c++:.hpp
#ifdef __cplusplus
extern "C" {
#endif
    void registCppCallback(void (*fun)(const char*));
    void cppCallbackFromSwift();

    void registCallback();
    void PrintMessage();
#ifdef __cplusplus
}
#endif
```
```c++:.cpp
void printFunc(const char* str) {
    std::cout << str << std::endl;
}

void registCallback() {
    registCppCallback(printFunc);
}
void PrintMessage(){
    cppCallbackFromSwift();
}
#endif
```
②Static Libraryをビルドする
Static Libraryのビルドを行い、.aファイルを作成します。

## 3. C#の処理を作成する
C#からC++を呼び出すための処理を作成します。
```c#
[DllImport("__Internal")]
private static extern void registCallback();

[DllImport("__Internal")]
private static extern void PrintMessage();

void Start()
{
    registCallback();
}

void Update()
{
    // 呼び出し
    PrintMessage();
}
```
## 4. Unityでビルドを行う
Unityに前述で作成した.aとSwiftPlugin.frameworkをPlugins/iOS/に追加し、ビルドを行います。
この時、SwiftPlugin.framework の Inspector で、Add To Embedded Binaries を有効にします。これにより、ビルドしたときに Framework が自動で Embed され ます。

## 5. Xcodeでのビルド・実行確認
出力されたxcodeprojectをXcodeでビルドし、実機確認を行います。
無事C++コールバックが呼ばれていたら成功です。
【HTTP】ステータスコード【エラー番号】

## エラーページの種類
HTTPは処理の成功不成功などを示す3桁の番号がついている。それを「**ステータスコード**」という。
百の位は「1~5」で正常に終了したかどうか、十の位と一の位は、詳細な情報を示す。
エラーと定義されているのは400番台と500番台。エラーページを設定するには、この番号で表示されるものと定義する。
### ステータスコードの百の位の意味
|百の位|意味|
|---|---|
|100番台|処理継続中|
|200番台|処理に成功|
|300番台|リダイレクト、別のURLに移動|
|400番台|リクエストに問題があるエラー|
|500番台|サーバーの処理に問題があるエラー|
### エラーの場合
|番号|意味||
|---|---|---|
|400|Bad Request|リクエストが不正|
|401|Unauthorized|認証が必要|
|402|Payment Required|支払いが必要|
|403|Forbidden|禁止操作、アクセス権がないなど|
|404|Not Found|ページが見つからない|
|405|Method Not Allowed|指定された操作が禁止されている|
|500|Internal Server Error|内部サーバーエラー、プログラムの実行に失敗したなど|
|501|Not Implemented|その機能は実装されていない|
|502|Bad Gateway|プロキシサーバなどが正しくない|
|503|Service Unavailable|サービスを提供不可。負荷が高くなりすぎていて接続拒否したなど|
将来の当たり前？クラウド？AWSを学ぶべき理由！

## はじめに

私は2022年3月にAWS認定の全11資格を取得することができました。最初のクラウドプラクティショナー資格を取得したのは約1年半前になります。

つまり約1年半でAWSの全資格を取得することができました。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1493529/0221e338-3335-84eb-64cf-742e222048a1.png)


AWS資格と聞いて、「クラウドなんてさわったことがないよ」「最新のことにはついてはいけないよ」という方も多いと思いますが、クラウドプラクティショナーレベルであれば、クラウドの基礎的な概念も多いので、AWSを使っていない方もITの基礎知識として習得することをオススメします。

## なぜ、AWSを学習する必要があるのか

AWS認定を取得する以前になぜ、AWSを学ぶ必要がるか理解していないとなかなか学習のモチベーションは上がらないものです。

そこでまずはじめにAWSを学ぶべき理由を紹介します。

#### クラウドサービスの重要性 

まずAWS以前にクラウドを学ぶべき理由を紹介します

**クラウドサービスとは**
>クラウドサービスは、従来は利用者が手元のコンピュータで利用していたデータやソフトウェアを、ネットワーク経由で、サービスとして利用者に提供するものです。利用者側が最低限の環境（パーソナルコンピュータや携帯情報端末などのクライアント、その上で動くWebブラウザ、インターネット接続環境など）を用意することで、どの端末からでも、さまざまなサービスを利用することができます。
[クラウドサービスとは？ - 総務省](URL "https://www.soumu.go.jp/main_sosiki/joho_tsusin/security/basic/service/13.html")

#### ①クラウド導入により利用者の負担が抑えられる

従来はオンプレミスによって企業はITリソースを管理していましたが、現在、オンプレから脱却（または一部脱却）して
クラウドサービスを利用することが増えてきています。
クラウドサービスを利用することで、利用者はITリソースを管理するための負担を減らすことができ、必要な開発に注力することができます。

また、従来のオンプレミスでは必要なリソースを予め決める必要があり、容量拡張や廃棄にも多くのリソースをさかなければなりませんでした。そのリソース負担もAWSを利用することで柔軟に対応することできます。

**クラウドサービスを利用による負担減**
・コスト（費用）抑えることができる
・運用の負担を抑えることができる
・どこでも自由自在に使えることができる

#### ②クラウドの市場規模・成長性

クラウドサービスといっても何十年も前からできていたものではなく、ここ数年で大きく成長してサービスになります。
しかし、その成長性は著しいものになります。特に新型コロナウイルスにより国内・海外を問わず、クラウドサービスの重要性は一層、高まりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1493529/0f506f35-3ffc-826a-7a64-5fc131c021d2.png)


[国内プライベートクラウド市場、2021年の市場規模は前年比35.8％増の1兆2216億円～IDC Japan調査](URL "https://cloud.watch.impress.co.jp/docs/news/1359333.html#:~:text=%E8%AA%BF%E6%9F%BB%E3%83%BB%E4%BA%88%E6%B8%AC-,%E5%9B%BD%E5%86%85%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E5%B8%82%E5%A0%B4%E3%80%812021%E5%B9%B4%E3%81%AE%E5%B8%82%E5%A0%B4%E8%A6%8F%E6%A8%A1%E3%81%AF,%E5%86%86%EF%BD%9EIDC%20Japan%E8%AA%BF%E6%9F%BB&text=IDC%20Japan%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%81%AF,%E3%81%AA%E3%82%8B%E3%81%A8%E4%BA%88%E6%B8%AC%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82")

このようについ数年前であれば、クラウドなんて勉強しなくても大丈夫という状況でしたが、今となっては、サービスとして当たり前になりつつ技術になります。

そのため、決して新しいこと、知らなくてもよいことではなく、「知っていて当たり前の知識」になりつつあります。

#### AWSを学ぶべき理由 

#### ①市場における圧倒的シェア

まず、クラウド全体の市場規模ですが、Canalys調査会社によると2021年第1四半期における市場規模は41.8ビリオンドル（418億ドル、1ドル110円換算で約4兆6000億円）であったようです。

その中でもシェアトップのAWSは35％成長でシェア32％。2位のMicrosoft Azureは50％成長でシェア19％。3位はGoogle Cloudで、56％成長のシェア7％。この上位3社だけでシェアの合計は58％、約6割となります。
クラウドの市場シェアは上位数社が占めている中でもAWSの市場シェアは圧倒的です。

なので、特に初心者がまずクラウドを学ぶのであればAWSを学ぶのが一番、手っ取り早い手段になるかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1493529/333ee5bf-5d31-6229-e120-9983331821c9.png)
[Canalys](URL "https://canalys.com/newsroom/global-cloud-market-Q121")

#### ②AWSサービスの学習のしやすさ

個人的な主観も入ってしまいますが、日本国内でクラウドを学ぶのであれば、AWSは圧倒的に学びやすいものだと思っています。圧倒的なシェアに裏付けされるように企業のサポートだけではなく、個人向けの学習環境（Udemyや参考書）も他のクラウドサービスよりも充実しています。

仮に一番、最初にとりかかるであろうクラウドプラクティショナーの資格を取得する際もAWSであれば様々な学習コンテンツがあるので、比較的すんなりと学習を進めることができます。

反対に市場規模の小さいサービスであると日本語の解説書がまだ整っていないことが多く、英語の解説書を読むことを迫れれてしまいます。（もちろん、英語でよければ問題なし）

以上のようにクラウドサービスは今後のITの成長にはなくてはならないサービスかつAWSはその中でも圧倒的なサービスであるので、まずはAWSから学ぶことをオススメします。
Media Queries レスポンシブが効かない

# レスポンシブが効かない時の対応



そろそろレスポンシブ対応もしないと！
と思った時に全然効かなかったお話。



### 効かない要因その①
headタグの中に"viewport"を書き忘れている。
```html:index.html
<head>
　　　　<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
```
ちゃんといますね。。。




### 効かない要因その②
記載の仕方が間違っている、もしくは詳細度が弱い



一般的な記法
@media screen and(min/max-width: 〇〇px){  適用したいスタイル }　
```sass:style.scss
@media screen and(max-width: 1200px){
  header{
    display: none;
  }
}
```
上記のコードなら1200px以下になるとヘッダーが消えますよ。という意味。
ちなみに私のheaderは存在し続けていましたが。。

詳細度が弱い可能性がある時は、header等ネストしていないタグを指定して確認すると
分かりやすい。




ちなみに詳細度が弱い場合は同じようにネストして書くか、元のスタイルにメディアクエリ自体を個別に設定してしまうという方法もあるらしい。


例：
```sass:style.scss

.lesson-wrapper {
	//略
	h2 {
		//略
	}
	.lessons {
		.lesson {
			float: left;
			width: 25%;
			//レスポンシブ対応の為、新しく追加したメディアクエリ
			@media only screen and (max-width:1000px) {
				width: 50%;
				margin-bottom: 50px;
			}
		}
	}
}

```


### 効かない要因その③
Wacth Sassが動いていない。←これ


超初歩的なミスでしたｳｩｯ･･･(´;ω;`)


コードはいつもVS CODEを使って書いていて、sassを適用させる為に
WatchSassを入れていたんだけど、ワークスペースを再起動した時に、
起動させるの忘れてた。。。


こんな事に1時間近く費やして悲しかったので、
記事にしてみました。
animateItemPlacementは追加と削除のアニメーションは提供されていないという話


Jetpack Compose 1.1.0にanimateItemPlacementというmodifierが追加されて、LazyColumn/Rowのアイテムアニメーションが追加されました。
これにより、リストの位置が変更されたときに自動でアニメーションが効くようになりました。

https://twitter.com/and_kulikov/status/1455537108777582605?s=20&t=lhn3okSy9oJYV5KU_L8UGg

まだExperimentalAPIですが、いい感じに動作しています。現状は単純にmodifierに指定するだけで使うことができるのでとてもかんたんです。

```kotlin
items(uiState.cards, key = { it.id }) {
    Column(modifier = Modifier.animateItemPlacement()) {
      // Copose...
    }
}
```

itemsの要素にanimateItemPlacementをつけて上げる感じです。
また、itemsのkey指定は必須のようです。このkeyのdiffを取って動作するものと思われます。

Swipe to refreshするたびに要素がシャッフルするサンプルでの挙動はこんな感じ。
`animateItemPlacement()` の引数にはanimateionを指定することができるようなので動きのカスタマイズもできそうです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166629/24557991-4693-8428-4d9d-4706a82b8c1e.gif" width="320px" />

ですが、先程のツイートのスレッドに記載があったのですが、残念ながらアイテムの追加と削除にはアニメーションは機能しないようです🤔

https://twitter.com/and_kulikov/status/1455537110816075786?s=20&t=WQ8lY5PvUus_G_9E5lrdqg

> これでは、挿入/削除のアニメーションは提供されないことに注意してください。公式のガイダンスが提供される予定ですが、AnimatedVisibilityですでに可能になっているはずです。リストからアイテムを実際に削除する代わりに、アイテムを非表示としてマークし、LazyColumnアイテムとして渡し続けます (Google翻訳)

ためしに、先程のサンプルを使ってカードをタップしたら要素が削除されるように実装してみました。
また、Swipe to refreshをした際にもとのデータを再取得するので追加の動きも確認できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166629/6d9fa03c-42df-f937-79bd-822547bd73e4.gif" width="320px" />

なんとなくいい感じに動いているように見えますが、追加と削除に対してはアニメーションがかかっていません。
位置の変更に対しては `animateItemPlacement` でアニメーションがかかっているため詰めるようなアニメーションや、追加の際の位置変更のアニメーションはかかっています。

先程のツイートにもあるように、追加と削除にもアニメーションを書けたい場合は、既存の `AnimatedVisibility` を使って対応することができます。

```kotlin
items(uiState.cards, key = { it.id }) {
    AnimatedVisibility(
        modifier = Modifier.animateItemPlacement(),
        visible = it.isVisible,
        enter = fadeIn(),
        exit = fadeOut(),
    ) {
        Column {
          // compose...
        }
    }
}
```

Itemsの直下の要素をまるごとAnimatedVisibilityで囲ってあげて、アイテムのVisibleでアニメーションをします。
注意点として、 `animateItemPlacement()` は直下の要素につけるので、AnimatedVisibilityのmodifierにつけてあげないとうまく動作しませんでした。

実際に動かしてみるとこのような感じで、削除時にfadeoutがかかるようになりました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166629/88363615-5ea4-e412-42ca-5268487f6e79.gif" width="320px" />

このやり方に対して、件のツイートでもやりとりがあったのですが、追加/削除に対してVisibleでもってアニメーションを書けなければならないという点がなかなか面倒だなと感じました。
AnimatedVisibilityはVisibleにしかアニメーションがかからないため、すでに要素がある状態、あるいは保持している状態からの変化でしかアニメーションがかかりません。
つまり、事前に要素をすべて持っている必要があります。また、削除のときも同様に、Visibleの変化をするためにデータから削除することはできません。

その点に対してツイートでパフォーマンス的にもよくないのでは？という指摘がされていたのですが、それに対する回答は、「アニメーションが済んだら削除するのをおすすめするよ」でした。ロジック部分のコードが増えそうですし、なかなか難解なコードになりそうでそれはやりたくないなと思ってしまいました😅 笑

### おわりに

まだJetpack ComposeもStableは1.1.0ですし、そもそも1.0.0では変更にすらアニメーションがかからなかったところからとても便利になりました。
`animateItemPlacement()` もExperimentalAPIですし、フィードバック次第では追加と削除にも対応されるのかも？とも思いました。

現状のAPIでやろうとすると、今回のようにAnimatedVisibilityも併用してやる感じかなというまとめでした。
Rails6 で jQuery / Bootstrap5 を導入しモーダル等を作成する

# Ruby on Rails 6 での Bootstrapの導入
かなり詰まって困ったところがあったので忘れないようにメモ。

# Rails アプリの作成
  
Railsで通常通りアプリを作成し、作成したディレクトリへ移動する。
```コマンドプロンプト
$ rails new bs-test
───── 作成後 ─────
$ cd bs-test
```
  
# jQuery / Bootstrap の導入

yarn addでjQueryとBootstrapとpopper.jsを導入する。

```
$ yarn add jquery bootstrap popper.js
```
  
@popperjs/coreの導入

  
```
$ yarn add @popperjs/core
```
  
必要な記述を済ませる。

```javascript: bs-test / config / webpack / environment.js
const webpack = require('webpack')
environment.plugins.prepend(
  'Provide',
  new webpack.ProvidePlugin({
    $: 'jquery',
    jQuery: 'jquery',
    Popper: 'popper.js'
  })
)
```
上記のコードを
```javascript: bs-test / config / webpack / environment.js
module.exports = environment
```
の真上に記述する。

bs-test / app / javascript の中に " stylesheets " という名前でディレクトリを作成し、その中に " application.scss " を作成、下記のコードをその中に記述する。

```scss: bs-test / app / javascript / stylesheets / application.scss
@import '~bootstrap/scss/bootstrap';
```

bs-test / app / javascript / packs の中にある application.js に下記のコードを記述

```javascript: bs-test / app / javascript / packs / application.js
window.jQuery = window.$ = require('jquery')

import 'bootstrap';
import '../stylesheets/application';
```

  jQueryの部分とbootstrapの部分の順番を入れ替えると正常に動かないことがあるので注意。
  
あとはapplication.html.erbのヘッドタグ内に下記の記述を加えれば導入完了
```html: bs-test / app / views / layouts / application.html.erb
<%= stylesheet_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
```
  
# 導入確認

適当にページを作る。
```
$ rails g controller home index
```

ルーティングの設定をする。コントローラの作成時に自動で生成されるものを削除し、root to: "home#index"を追加。
```ruby:bs-test / config / routes.rb
Rails.application.routes.draw do
  root to: "home#index"
end
```

Bootstrap の公式ページよりモーダルのコードをコピペする。
https://getbootstrap.jp/docs/5.0/components/modal/

```html: bs-test / app / views / home / index.html.erb
<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p>

<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal">
  Launch demo modal
</button>

<!-- Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        ...
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>
```
※ Bootstrap のバージョンが5.0より古いと ( 当たり前だが ) 動作しない。もし、コピペしているにも関わらず表示されない (エラーも表示されない) / scriptタグの中身はちゃんと動いているがモーダル等は表示されない などであればBootstrapのバージョンを間違えている可能性がある。


## 参考にさせて頂いた記事
https://qiita.com/kazutosato/items/d47b7705ee545de4cb1a

https://qiita.com/miisha/items/4da037fe8581147b5619
AWS Security Hubコントロールを全リージョンで無効化する

AWS Security Hubでいくつかのコントロールを全リージョンで無効化する方法です。AWS CLIを使います。

全リージョンと言いつつ、以下は東京以外のリージョンでいくつかのコントロールを無効化する例です。[^1]

```bash
account_id=$(aws sts get-caller-identity --query Account --output text)

controls="
aws-foundational-security-best-practices/v/1.0.0/Config.1
aws-foundational-security-best-practices/v/1.0.0/IAM.1
aws-foundational-security-best-practices/v/1.0.0/IAM.2
aws-foundational-security-best-practices/v/1.0.0/IAM.3
aws-foundational-security-best-practices/v/1.0.0/IAM.4
aws-foundational-security-best-practices/v/1.0.0/IAM.5
aws-foundational-security-best-practices/v/1.0.0/IAM.6
aws-foundational-security-best-practices/v/1.0.0/IAM.7
aws-foundational-security-best-practices/v/1.0.0/IAM.8
aws-foundational-security-best-practices/v/1.0.0/IAM.21
aws-foundational-security-best-practices/v/1.0.0/KMS.1
aws-foundational-security-best-practices/v/1.0.0/KMS.2
aws-foundational-security-best-practices/v/1.0.0/S3.1
aws-foundational-security-best-practices/v/1.0.0/CloudTrail.1
aws-foundational-security-best-practices/v/1.0.0/CloudTrail.2
aws-foundational-security-best-practices/v/1.0.0/CloudTrail.4
aws-foundational-security-best-practices/v/1.0.0/CloudTrail.5
"

regions="eu-north-1 ap-south-1 eu-west-3 eu-west-2 eu-west-1 ap-northeast-3 ap-northeast-2 sa-east-1 ca-central-1 ap-southeast-1 ap-southeast-2 eu-central-1 us-east-1 us-east-2 us-west-1 us-west-2"

for region in $regions
do
    for control in $controls
    do
        arn="arn:aws:securityhub:$region:$account_id:control/$control"
        echo "$arn"
        aws --region $region securityhub update-standards-control --standards-control-arn "$arn" --control-status DISABLED --disabled-reason "ここに理由"
        sleep 0.3 # APIスロットリング対策
    done
done
```

全リージョンとするには、 `regions` を以下のようにします。

```bash
regions=$(aws ec2 describe-regions --query Regions[].RegionName --output text)
```

[^1]: 自分用にこの例を載せておきたかった。
【SQLデータサイエンス100本ノック環境構築（環境構築時のトラブル解消）

## はじめに
### 筆者について
私は、下記の記事をもとにSQLを1か月前ほどから勉強し始めたガチ初心者です。
https://qiita.com/Ryo-Nakano/items/8961c956babaf0976b4a


### この記事で書くこと
データサイエンス100本ノック挑戦にあたっての環境構築に関して書きます。
特に躓いた「テーブルにデータがありません(~~~ does not exist)という旨のエラー」時の対応について書きます。

### この記事で書かないこと
データサイエンティスト100本ノックの解き方
環境構築に必要なソフトウェア（Docker等のインストール方法）
*既に巷で書き尽くされているので。

## 躓いたこと（本題）
### 発生したエラーの概要
ガイドに沿ってDockerやSQLのインストールは完了し、
早速一問目から始めようとしたところ、「receipt」なんてテーブル（リレーション）は無いと返され、
悪銭苦闘しました。

### エラー発生時の状況詳細
・Dockerはインストール完了。
・「dss-postgres」と「dss-notebook」はそれぞれRUNNINGと表示されている状況。
・Jupyter-Labは問題無く起動し、SQLのコード自体は使える状況。
・何故かテーブル「Customer」だけは認識されており、SQLで操作可能な状況。
・qsqlでテーブル一覧を確認すると「Customer」だけが表示される。
・スキーマは「public」だけが表示されている。

### 解決方法（結論）
「～100knocks-preprocess\docker\db\init」にある、
「2_create_table.sh」と「3_load.sql」に記載のコードをそれぞれjupter-lab上で実行し、
テーブルを読み込み。

実行時の詳細な手順は以下の通り
1. 「2_create_table.sh」をメモ帳で開き、テーブルを作成（create)するコードを実行
2. 「3_load.sql」を同じくメモ帳で開き、1で作成したテーブルに対応するcsv読み込みのコードを実行
3. これをcustomer、category、receipt、product、store、geocodeとそれぞれcreate&loadを実行

読み込んだ際のコードイメージはこちら（例：categoryを読み込んだ時のもの）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683620/4c880e86-d824-24a9-6d6e-dd716b43d57c.png)

テーブル読み込み完了後、無事にテーブルを操作できるようになり、第1問の回答をできるようになりました。
めでたしめでたし。
恐らくこれは正攻法じゃないでしょうが、「ＳＱＬを操作できればそれでいい」と私は思い込むことにしました。


### 参考にしたURL
https://www.cresco.co.jp/blog/entry/14446/
「(後述)「はじめに」のセル実行したときにエラーが出た・・・」の部分　大変助かりました。
ただ素人の私には「CLIコンソール上でpsqlを使い直接実行します。」の意味を理解できず、Jupyter上で実行する苦肉の策でいきました・・・

http://peiyorin.cocolog-nifty.com/blog/2011/04/postgresql-a4b6.html
https://kumachan.biz/2017/01/27_1927/4668/
上記2つは類似の記事で、恐らく今回自分がひっかかったエラーの原因はここで記載されたものだと思います。
あたりをつけるのに大変助かりました。ただ、結局スキーマが何なのか未だにピンとは来てませんが・・・・
Go のレジスタベース ABI はいくつまで引数をサポートしているのか？

Go 1.17 で導入されたレジスタベースの関数呼び出し規約 (以下、レジスタベース ABI) は多くのケースでパフォーマンス向上をもたらしていますが、利用可能なレジスタ数には制約があるはずなので引数や戻り値がいくつまでならレジスタベース ABI の恩恵を受けられるのか調べました。

なお、この記事は Go コンパイラの内部ドキュメントをもとに作成しました。
内部ドキュメントではレジスタベース ABI の詳細や根拠について説明されています。

https://github.com/golang/go/blob/master/src/cmd/compile/abi-internal.md

※ 特に明記されていない限り 2022 年 3 月 27 日時点の情報になります。

## 短い結論

引数や戻り値の個数に関係なく対応アーキテクチャであればレジスタベース ABI の恩恵を受けられます。

とはいえ整数レジスタ 9 個、浮動小数点レジスタ 12 個に収まる範囲にした方がよさそうです。
(引数や戻り値がいくつレジスタを使用するのかは型によって異なります)

## 利用可能なレジスタ数

利用可能なレジスタ数は CPU アーキテクチャによって異なりますが OS による違いはありません。
また、すべての CPU アーキテクチャに対応しているわけでもありません。

| CPU アーキテクチャ | 整数 | 浮動小数点 | サポートバージョン |
| ------------------ | ---- | ---------- | ------------------ |
| amd64              | 9    | 15         | 1.17               |
| arm64              | 16   | 16         | 1.18               |
| ppc64, ppc64le     | 12   | 12         | 1.18               |
| riscv64            | 16   | 16         | 1.19 (予定)        |

amd64 で利用可能な整数レジスタの数が少ないように見えますが Kubernetes のコードをもとにした事前調査 [^1] では 9 個でも十分な効果があるようです。

[^1]: https://github.com/golang/go/blob/master/src/cmd/compile/abi-internal.md#appendix-register-usage-analysis

## レジスタの割り当て

引数や戻り値が単純な整数や浮動小数点としてあつかえない場合、次のようなルールでレジスタが割り当てられます。

- 構造体
  - 構造体の場合は各フィールドに対して再帰的にレジスタの割り当てを試みます。
- 文字列 (`string`)
  - 文字列の場合はバイト列のポインタと長さを示す 2 つの整数レジスタが割り当てられます。
- インターフェース (`interface`)
  - インターフェースの場合は 2 つの整数レジスタが割り当てられます。
- スライス
  - スライスの場合はポインタと長さ、キャパシティを示す 3 つの整数レジスタが割り当てられます。
- 配列
  - 固定長配列は長さによって処理が異なります。
    - 0: 何もしない。
    - 1: 再帰的にレジスタの割り当てを試みます。
    - 2 以上: インデックスアクセスが必要なのでレジスタへの割り当てを行わず、スタックを使用します。
- ポインタ、マップ、チャンネル、関数
  - これらは 1 つの整数レジスタが割り当てられます。

レジスタは引数と戻り値で共有されており引数で使用されたレジスタが戻り値でも使用されます。
逆に複数の値を 1 個のレジスタに格納 (パック) してやり取りすることはありません。

レジスタの数が不足しており前述のルールで割り当てられない場合はスタックが使用されます。
逆に言うと引数がいくつであっても利用可能なレジスタ数の範囲でレジスタベース ABI の恩恵を受けられることになります。

## コンパイラでの定義

利用可能なレジスタの定義は SSA コンパイラ用のコードジェネレータで定義されています。

amd64 の場合は次のコードで定義された `ParamIntRegNames` と `ParamFloatRegNames` が利用可能なレジスタの名前です。

https://github.com/golang/go/blob/master/src/cmd/compile/internal/ssa/gen/AMD64Ops.go

上記の定義をもとに生成されたのが次のコードにある `paramIntRegAMD64` と `paramFloatRegAMD64` で `registersAMD64` と対応しています。

https://github.com/golang/go/blob/master/src/cmd/compile/internal/ssa/opGen.go

また、利用可能なレジスタの数は次のコードで定数 `IntArgRegs` と `FloatArgRegs` として定義されています。

https://github.com/golang/go/blob/master/src/internal/abi/abi_amd64.go
Nuxt.jsにて表示する画像を圧縮してパフォーマンスを向上する方法

## 概要
今回はポートフォリオ作成した際にフロントのパフォーマンス改善した方法の一つを紹介します。
結論から言うと、`@aceforth/nuxt-optimized-images`というライブラリを追加し、表示する画像を圧縮することで
パフォーマンス改善を行います。

## 環境
|/|バーション|
|:--:|:--:|
|nuxt|2.15.8|

## 導入方法
まずは先程のライブラリをインストールします。

```
yarn add @aceforth/nuxt-optimized-images
```
**注意点として上記ライブラリをインストールするだけでは画像は圧縮されません。**
圧縮したい拡張子によって追加でインストールが必要です。
今回は`jpeg`、`png`を圧縮すると仮定して下記のライブラリを追加します。

```
yarn add imagemin-mozjpeg@9.0.0 imagemin-pngquant
```
`imagemin-mozjpeg`の最新パージョンの`10.0.0`はバグがあるようで`9.0.0`を指定しています。
詳しくは以前の記事を参照してください。

https://qiita.com/soicchi/items/569482fcc2fe2fa68a3f

たったこれだけで表示される`jpeg`と`png`の拡張子を持った画像は圧縮されます。

## さらなる圧縮方法
`webp`に変換することでさらに容量を小さくすることもできます。
`webp`とは`jpeg`などと同様な拡張子です。

### Step 1 ライブラリの導入
先程のライブラリに追加して下記を追加します。

```
yarn add webp-loader
```
このライブラリは`?webp`がついている画像URLをwebp形式に自動変換してくれます。

### Step 2 画像表示用のタグを用意
下記の用に`template`にタグを記載します。

```vue
<template>
  <picture>
    <source
      srcSet="画像のURL?webp"
      type="image/webp"
    >
    <img
      src="画像のURL"
    >
  </picture>
</template>
```
上記のようにすると`webp`の拡張子画像で表示されます。
詳しい仕様等は下記ドキュメントを参照してください。

https://github.com/juliomrqz/nuxt-optimized-images

## まとめ
ポートフォリオを作り終わってブラウザのパフォーマンスをLighthouse等で確認したときにパフォーマンスが**30**になっていて、
上記の圧縮を実行したら**80**までとりあえず上げることができました。
アプリの作成には最適化も考えながら構築しないといけないことですね。
SwaggerとかOpenAPI周りの用語が何を指すのか迷子になったので一旦整理

## 調べたきっかけ

よくあるイマドキ(?)のAPI仕様書の見え方として、↓下記の二つがありますよね。
現職では前者を「Swagger」と呼んでいますが、いや前職で後者みたいな緑ヘッダのやつのことも「Swagger」って呼んでたな...とふと疑問に思いました。

そこでSwaggerとOpenAPI周りの用語を調べてみて、何が何を指しているのかを自分なりにまとめてみたので、紹介させて下さい。

### 3カラムHTMLファイルのやつ
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3238363333392f31616436663137662d353864352d666164632d616462632d6664333537653465653238632e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552268/b3cfe286-090f-734b-34e8-99939a64fd04.png)

### 緑ヘッダのやつ(Swagger-UI)
![スクリーンショット 2022-03-06 21.40.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552268/24364715-45d8-2030-b11d-aefa9015d97b.png)

## Swagger/OpenAPIとはそれぞれ何か

|用語|意味|
| --| -- |
|Swagger|RESTful APIの仕様文書化を助けてくれるオープンソースのツール群 <br>またはRestful APIの仕様をymlまたはjsonで記述する書き方のこと|
|OpenAPI|Restful APIの仕様をymlまたはjsonで記述する書き方のこと|

[Wikipedia](https://en.wikipedia.org/wiki/OpenAPI_Specification)だと「機械可読インターフェースファイルの仕様」とか書かれてて意味わからんので多少は自分なりに噛み砕いて書いてます。

## 歴史的な話

この歴史が呼び方をワケわからんくしている

* 2010年、Wordnik社（オンライン辞書会社)がSwagger仕様の開発開始
* 2015年、SmartBear社がWordnik社からSwagger使用を取得（買収的な？）
* 同年、SmartBears社はOpenAPIイニシアチブと呼ばれる組織を作ると宣言
* **2016年、Swagger仕様はOpenAPI仕様に名前が変更される**

引用元はこちら

https://en.wikipedia.org/wiki/OpenAPI_Specification

## 「書き方」っていうけど具体的にはどんなん？

ymlファイルの頭が`openapi: 3.0.1`で始まるか`swagger: 3.0.0`で始まるかで変わる。
細かい仕様の違いは略

## 冒頭の2つの見え方は何が違う？

### 緑ヘッダのやつ
緑ヘッダのやつはSwagger-UIというライブラリを使って出力されます。
Swagger-UIはnodejsを用いてサーバ上でHTMLで出力されます。

**サーバ上で見えるので社内で使う分には(IP制限などかけて)便利ですが、そのまま社外にAPI仕様書として提供するのは少し難しいかもしれません。**

### 3カラムHTMLファイルのやつ

ymlファイルを元にRedocというライブラリを使って出力されます。

**HTMLファイルとして使えるので、お客さんに渡したり、対外的にも使いやすいのがメリットかと思います。**
Rust 言語仕様05 構造体

今回は構造体についてアウトプットしていこうと思います。

構造体の理解には、所有権や参照、借用もポイントになってきます。
結構どこにでも必要なメモリ管理の知識ですので、しっかり押さえておくと後の学習にも役立つかと思います。

### まずはコード

```rust
struct User {
    email: String,
    username: String,
    sign_in_count: u64, //整数型
    active: bool,
}

struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn create(width: u32, height: u32) -> Self { // ※1
        Self { width, height }
    }
    fn area(&self) { // ※2
        println!("{}", self.width * self.height);
    }
}

let mut user1 = User {
    email: String::from("someone@g.com"),
    username: String::from("somone123"),
    active: true,
    sign_in_count: 1,
};
user1.email = String::from("someone123@g.com");

println!("{:#?}", user1);

// 以下出力結果
 User {
    email: "someone123@g.com",
    username: "somone123",
    sign_in_count: 1,
    active: true,
}

let rect = Rectangle::create(20, 20); // ※1
println!("{:#?}", rect);
rect.area(); // implで構築し使用する
println!("{:#?}", rect); // 参照しているのでエラーにはならない ※2

```

以前にもすこし投稿内容にありました。が`struct`や`impl`とゆう単語が出ています。
`struct`はイメージが湧きますので省きますが、`impl`の方は少々難しく感じますが、内容に関数を構造を利用した状態で構築することができます。
Rails メール送信でLoadError (cannot load such file -- net/smtp)の対処法

RailsのMailerで問い合わせ機能を実装していたところ、
このようなエラーが表示された。
[![Image from Gyazo](https://i.gyazo.com/2d12875dffa1f3def0044caaa247ac87.png)](https://gyazo.com/2d12875dffa1f3def0044caaa247ac87)

メールの送信先はGmailを使用している。
問い合わせの確認画面で送信ボタンを押すとエラーが表示された。

### 原因
config/environments/development.rbに設定している
メーラー情報のpasswordを以前作成したアプリのものをそのまま使っていたからだった。

### 対処法
Googleアカウントの管理画面より、
左にあるセキュリティを選択
[![Image from Gyazo](https://i.gyazo.com/1862b48b3f3a83fd646227712a35259d.png)](https://gyazo.com/1862b48b3f3a83fd646227712a35259d)

下の方にあるGoogleへのログインのアプリパスワードから新しいアプリのパスワードを新規作成
[![Image from Gyazo](https://i.gyazo.com/6e921f064f521e8784e6116151939155.png)](https://gyazo.com/6e921f064f521e8784e6116151939155)

config/environments/development.rbでpasswordを新規作成したパスワードに差し替えれば完了
IDP起点のシングルログアウトの実装方式

独立したIdentity Providerを立ててクロスドメインでのシングルサインオン実施している構成における、IDP起点のシングルサインアウト（IDPから直接ログアウトもしくは1つのService Providerからログアウトした際に、他のService Providerをログアウト状態にする機能）の実装方式について考える。OpenID ConnectやSAML 2.0などの仕様（ドラフト含む）では、様々なアプローチが採られているが、全体感を捉えるために表形式での整理をした。

![idp-initiated-logout.svg](https://gist.githubusercontent.com/unhurried/9ae0db89ac8838a5333072fa88aafc0a/raw/31936a942d2a0c53a76a93cb36c509e58b766014/idp-initiated-logout.svg)
LaravelのViewに共通変数でAuthの情報をセットする

# 概要
ログイン後のContollerで毎回AuthのチェックをしてDB取得してwithの変数にいれるのが大変なのでググってコピペで入れたら失敗して修正した件。

AppServiceProviderでは処理の順でAuthのcheck()が効かないので、callback式に書いておくと、あとで処理してくれる。

もっと簡潔な方法はありそう。

# 環境
php:8.1
Laravel:8.8

# コード
```php:AppServiceProvider

    // ここに書く
    public function boot(UrlGenerator $url){

        // viewのcallback処理追加
        view()->composer('*', function ($view) {

            // ログインしていれば
            if(\Auth::guard('admin')->check()) {

　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　// ログインユーザの情報を常にセット
                $admin_user = AdminUser::where('id',\Auth::guard('admin')->id())->first();
                view()->share('admin_user', $admin_user);
            }
        });


    }
```

# 参考
https://stackoverflow.com/questions/37372357/laravel-how-to-get-current-user-in-appserviceprovider
オブジェクトを簡単に保存する。

# 初めに

SwiftのCodableプロトコルのように手軽にオブジェクトを保存できるようなライブラリを目指し、C#の共有プロジェクトを作りました。
[こちら](https://github.com/HotariTobu/Encodable)からクローンかダウンロードしてプロジェクトに追加してください。

# 使い方

対象のモデルクラスに`ICodable`を実装してメソッドを呼ぶだけです。

``` C#
class Model : ICodable
{
    private bool _SomeProperty;
    public bool SomeProperty { get => _SomeProperty; set => _SomeProperty = value; }
}
```

``` C#
// モデルを作る
Model model = new Model();
model.SomeProperty = true;

// 保存する
Uri uri = new Uri(Path.GetFullPath("file.binary"));
await model.SaveAsync(uri);
```

``` C#
// 読み込む
Uri uri = new Uri(Path.GetFullPath("file.binary"));
Model model = await uri.LoadAsync<Model>();
```
【Github Actions】リリースタグでCrystal言語のツールをビルドし、Checkinstallで作成したdebをリリースページに追加する

Crystal言語でコマンドラインツールを作りたいと考えている。

Crystal言語の使い方は人それぞれだが、Githubのトレンドを見ると、Webアプリケーションを作っている人が多い。Crsytal言語がRuby言語と深い繋がりを持っているためだろうか。RustはCargoのように便利なビルド兼パッケージマネージャーを用意しているが、Crystalにはない。Makefile を使うのが一般的である。

ソースからビルド。これはツールの配布の観点からみると制約が大きい。Crystal言語ユーザー以外にツールを配布することが難しくなる。Crystal言語は、PythonやPerlとは違い、予めインストールされていることが全く期待できない。Crystal言語のツールを使うためにCrystal言語をインストール。これはつらい。だからビルドしたバイナリを直接配布したい。

単純な方法として、`deb` での配布を試みる。

* Github Actionsを使う
* v0.0.0 など、リリース用のタグがプッシュされたときに発火する
* deb は Checkinstll という古典的なツールでお手軽作成
* リリースページにファイルを自動でアップロードする

https://github.com/bio-crystal/bam-filter/blob/main/.github/workflows/build.yml

```yaml
name: build

on:
  push:
    tags:
      - "v*.*.*"

jobs:
  release:
    name: Release
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ 'ubuntu-20.04' ]
    steps:
      - uses: actions/checkout@v2
      - uses: crystal-lang/install-crystal@v1
      - run: sudo apt -qy install libhts-dev checkinstall
      - run: shards install --pkgname=bam-filter --version
      - run: make
      - run: sudo checkinstall --pkgname=bam-filter
                               --pkgversion=$(echo ${{ github.ref }} | sed -e "s#refs/tags/v##g")
                               --maintainer=2xijok@gmail.com
                               --requires=libhts-dev,libevent-dev,libgc-dev,libc6-dev
                               --nodoc -y
      - uses: softprops/action-gh-release@v1
        with:
          files: "bam-filter*.deb"
```

普段ならいろいろリポジトリを見てお手本を探すのだが、Crystal言語のリポジトリは少ないので自分で書いてみた。

* `--pkgversion=$(echo ${{ github.ref }} | sed -e "s#refs/tags/v##g")` は、タグからバージョンナンバーを抽出している。
* `--maintainer=2xijok@gmail.com` みたいなのも、ちゃんと設定しておいた方が良い。
* `--requires=libhts-dev,libevent-dev,libgc-dev,libc6-dev` 依存に関しては、Dockerで素のUbuntuとかに試しにインストールしてみて、足りなかったら `ldd` を見ながら追加するという感じにした。ちなみに、`puts 0` をビルドして `ldd` すると、次のようになる。

```
	linux-vdso.so.1 (0x00007ffc683a7000)
	libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f181a706000)
	libevent-2.1.so.7 => /lib/x86_64-linux-gnu/libevent-2.1.so.7 (0x00007f181a6b0000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f181a696000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f181a46e000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f181a91f000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f181a469000)
```

* 要するに、libgc, libgc, libc6 は、いつも確実に追加が必要になるやつだと思う。多分。

この記事は以上です。

決して完備された例だとは思わないけれども、誰かが記事を書いておかないと、知見が集まらないと思うので公開します。もっとこうすればいいんじゃない？と思った人はコメント欄で教えてください。プルリクエストも歓迎します。
【Rails】+=、合計の表示方法

`ちなみにこの記事はプログラミング初心者の私が初めて書いた記事です。
エンジニアとしての記事の書き方もわからない人間が初めて残したもので
なぜか思い入れが深いので残しています。`

:frowning2:合計金額を表示させたい。

まず@totalを０と定義しておこう。
![スクリーンショット 2022-03-06 22.20.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/b21561db-0ed2-7941-b683-77a8437ef5cf.png)

![スクリーンショット 2022-03-06 22.23.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/84d91607-0acb-1112-5c62-8fa2a73ef990.png)
モデルにsubtotalを定義する。
税込価格と数量をかけて算出する。

![スクリーンショット 2022-03-06 22.19.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/1c21b776-3880-7908-cd41-8b333b01b98b.png)
次にcart_itemsのeach文を作る。
ここで上記のように@totalにcart_itemのsubtotalを繰り返し足していくような計算になる。
いろいろな種類のcartの中のアイテムを一種類ずつ取り出し足していくことになる。

![スクリーンショット 2022-03-06 22.27.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/fc6a6ac5-908a-dca5-7894-c5241062fa90.png)
最後はこのようにeach文でいろいろ詰め込んだ@totalを表示させるだけ。
![スクリーンショット 2022-03-06 22.29.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/971f2245-c119-9fea-008d-bba43e3fbe35.png)
ちなみに足し算の省略形もあり,
これも同じ意味となる。
参考にしてね！
[Go][AtCoder] bufio.NewScannerの標準入力でハマったこと　最大サイズ

## 概要

最近Golangを書くことが多くなりました。普段はWeb開発ばかりやってますがそれ以外にも前から競プロに興味がありました。
なのでせっかくなのでGolangで始めてみようかなと思い立った矢先、いきなり問題にハマったのです。

ただ学びにもなったので備忘録としてこの記事を書いています。


## ハマってしまった問題

僕がハマってしまった問題は下記です。

問題としては入力文字列を昇順にソートして出力するだけのものでシンプルなものです。

https://atcoder.jp/contests/abc242/tasks/abc242_b

僕の提出回答は下記でした。

一見ACになりそうなのですが、結果としてはWAでした。

やっていることとしては間違っておらずでして、

受け取った文字列からstring型のsliceを作成して1語ずつ格納します。

その後, `sort.Strings([]string)`を使ってsliceを昇順にソートします。

最後は`strings.Join`を用いて文字列を作成して出力で完了です。

でも何が原因でWAになってしまうか分からず、結局時間内にACにすることができませんでした。


```go:WAだったコード
package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
	"sort"
)

func main() {
	
	sc := bufio.NewScanner(os.Stdin)
	
	sc.Scan()
	inputs := strings.Split(sc.Text(), "")

	sort.Strings(inputs)

	a := strings.Join(inputs, "")
	fmt.Printf("%s",a)
}
```


## 原因

ACにできなかった原因は`scanner`のbuffer sizeにありました。

bufio.NewScannerで作成されるバッファですが、defaultとして4094バイト割り当てられており、最大は`MaxScanTokenSize = 64 * 1024`とあるとおり64KBです。

参考
https://cs.opensource.google/go/go/+/refs/tags/go1.17.8:src/bufio/scan.go;l=76-84


今回ハマったAtCoderの問題では最大文字列長が2 x 10^5 です。入力される文字は英小文字のみのため1文字1B、最大2x10^5 B=200KB必要となります。

このことから、僕がWAになってしまったのは、64 x 10^3を超える文字列長の文字のテストケースに落ちてしまったのだと考えられます。


## ACできたコード

コンテスト後に再度トライしたコードが下記になります。
最大buffer sizeを200KBに設定してみました。
無事ACできました。

コード長、実行時間、実行速度は下図のようでした。
![スクリーンショット 2022-03-06 22.18.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335866/3b856570-1e2f-a910-f4af-616153d6a128.png)


```go:ACになったコード
package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
	"sort"
)

func main() {
	
	sc := bufio.NewScanner(os.Stdin)
	// buffer作成
	buf := make([]byte, 4096)
	// scannerに最大2*10^5Bでbuffer登録
	sc.Buffer(buf, 2000000)
	sc.Scan()
	inputs := strings.Split(sc.Text(), "")

	sort.Strings(inputs)

	a := strings.Join(inputs, "")
	fmt.Printf("%s",a)
}
```


### 別解(fmt.Scan)

fmt.Scanの場合はbuffer sizeなど気にせずACでした。
ただbufio.NewScannerのときよりパフォーマンスは悪かった。
![スクリーンショット 2022-03-06 22.20.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335866/945b0752-b51e-7049-53fd-6d38d12cbda3.png)


```go:fmt.Scanを用いたコード
package main

import (
	"fmt"
	"strings"
	"sort"
)

func main() {
	
	// 1行目
	var s string
	fmt.Scan(&s)
	inputs := strings.Split(s, "")

	sort.Strings(inputs)

	a := strings.Join(inputs, "")
	fmt.Printf("%s",a)
}
```

## まとめ

今回の問題からもちろん競プロとして最大値の境界値テストケースに対する考慮など気をつける点が学べましたが、

言語の仕様を理解すること、そして自分が携わっているWebシステムにおいても想定される最大入力値に対して自システムもバグをおこさず正常に動くことが担保できるかなど
普段の意識改革にもなりました。

今後も競プロを趣味程度に頑張りつつ、学んだことは普段の仕事にも還元していきたいと思います。
サイトリニューアル（ディレクトリマップ自動作成）

## 現状把握として
ディレクトリマップをつくる必要があるらしい
テンプレートをダウンロードして、自力で作ろうとしたけど面倒すぎ、飽きそう。

## だれか代わりにつくってくれーー
あった。最高やん。

https://mogyura.com/