OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon マシンイメージ（AMI）

# AMIとインスタンス
Amazonマシンイメージ（AMI）とは
ソフトウェア構成を記録したテンプレート。
インスタンス（仮想サーバー）を作るための金型のようなもの
一度金型を作れば、同じ設定のサーバーを複数作ることができる。
サーバー１つずつに「サーバーOSを入れて、Apacheを入れて、ソフトウェアを入れて、それぞれに全てに設定して」と繰り返すのは大変。AMIがあれば、短時間で同じサーバーを作れる。
※AMIとOS
AMIはサーバーのディスクが丸ごと入っている
AMIからインスタンスを作成すると、全てがコピーされる。
どんなAMIにも必ずOSは入っている。
# 提供されるOSのイメージ
AMIはAWS公式のものだけでない。
OSやソフトウェアのコミュニティ、企業が作ったAMIも提供されている。
AMIによっては利用に別途料金がかかることがある。

**主なAMI**
|AMI|内容|
|-|-|
|Amazon Linux|Amazonが提供するRed Hat LinuxベースのLinux|
|Cent OS|CentOS Linux|
|Red Hat Enterprise Linux|Red hat Linux|
|Deabian GNU/Linux|Deabian Linux|
|Ubuntu Server|Ubuntu Linux|
|SUSE Linux Enterprise Server|SUSE Linux|
|Microsoft Windows Server|Windows Server|
|LAMP certified by Bitnami|LinuxとApache、MySQL、PHPサーバー|
|Tomcat Certifide by Bitnami|Javaサーブレットを動かすTomcatサーバー|
|WordPress powered by AMIMOTO|ブログシステムのWordPress|
|Movable Type|ブログシステムであるMovable Type|
|NGINX Open Source Cerfitied by Bitnami|WebサーバーであるNginxサーバー|
|Redmine Certfied by Bitnami|進捗管理ツールであるRedmineサーバー|
|NextCloud Powered by IVCISA|ファイル共有ツールであるNextCloudサーバー|
|SFTP Gateway|暗号化FTPサーバー|
# AWIの料金
AMIによっては無償と有償がある。
Microsoftが提供しているWindows Serverのように元々有償のソフトウェアは、AMIも有償
# AMIを自作する
AMIは自作することもでき、同じ構成のサーバーを複製したり、構成のバックアップに使用したりするのみ便利。
作成したAMIは**マーケットプレイス**という場所で配布できる。
＜AMIの作成方法＞
EC2インスタンスから作成する。
ベースとなるインスタンスに自分好みとなるように必要なソフトや設定をした後、
AMIとして書き出す。
## マーケットプレイス
マーケットプレイスとはAWSにてAMIを配布できる場所
有償無償に問わず、現在数千ものAMIが公開されている。
使われていない権限セットを探したい


あったぁって思ったけど、逆でした。

[権限セットに割り当てられていないユーザーを検索する](https://help.salesforce.com/s/articleView?id=000341510&type=1)

元の質問
[get all permission sets that are empty or unassigned](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000J6qnLSAR)

リレーションシップ名が分からんかったなぁ。

Please use Assignments. The below query works:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0c473c7a-deb0-fef9-34cc-83b471b7b82d.png)


```
Select Id, (Select Id, PermissionSetId, AssigneeId, 
Assignee.FirstName, Assignee.LastName, 
SystemModstamp From Assignments) 
From PermissionSet p
```

[SOQL - PermissionAssignmentSet](https://salesforce.stackexchange.com/questions/113004/soql-permissionassignmentset?rq=1)
【js】スマホアドレスバーを除いたvhを取得する

スマホのアドレスバーが邪魔で要素と重なる、という時に使用できます。

# 画面サイズが変わる毎にvhを取得しcss変数に格納

## js
```js

/**
 * 画面サイズが変わるたびvh取得
 */
function setHeight() {
  let vh = window.innerHeight * 0.01;
  document.documentElement.style.setProperty('--vh', `${vh}px`);
}
setHeight();
//ブラウザのサイズが変更された時・画面の向きを変えた時にvh再計算
window.addEventListener('resize', setHeight);

```

# css
```css

.fv {
  min-height: 100vh; /* カスタムプロパティ未対応ブラウザ用のフォールバック */
  min-height: calc(var(--vh, 1vh) * 100);
}

```

参考：
https://web-dev.tech/front-end/javascript/setting-100vh-with-css-js/ ,
https://coliss.com/articles/build-websites/operation/css/css-cover-the-entire-height-of-the-screen.html
暗号化技術とディジタル署名

パケットは中継機から中継機へと目的の場所までバケツリレーされるその時パケットに入っている情報が人に見られてはいけない情報の場合隠さなくてはならない。
その時のために```暗号化技術```や```ディジタル署名```がある。

# 盗聴・改ざん・なりすましの危険
第三者に見られてしまうと危険がある。その具体例を紹介する。

## 盗聴
データを盗られることはない。
しかし
```データの中身```を見られてしまう。

## 改ざん
```データの中を勝手に書き換えられてしまう```。
それが送信されてしまう。

## なりすまし
```第三者が別人になりすまし```、データの送受信ができてしまう。

## 関連記事
https://qiita.com/masatom86650860/items/ddae74432f24917bbef2

# 暗号化と復号
通信するときに覗き見されてしまうのでインターネット全体を一度見直すことはできない。
大きくなってしまったからだ。

なのでデータを除き見られても大丈夫なようわからないようにすれば良くなる。
データの中身を第三者にはわからない形へと変換してしまうことを```暗号化```という。
また
元の形へと変換することを```復号```という。

# 盗聴を防ぐ暗号化（共通鍵暗号方式)
暗号化の状態から復号するために用いるものを```鍵```という。
また逆の状態にするのも鍵が必要だ。

送り手(暗号化する側）と受け手（復号する側）が同じ鍵を用いる方式を```共通鍵暗号方式```という。
その鍵を知られると意味がなくなるので秘密にする必要がある。
これを```秘密暗号方式```と呼ばれる。

## 気づき
どのように鍵を渡すのだろうか？

# 盗聴を防ぐ暗号化（公開鍵暗号方式）
不特定多数の人が鍵を使っているとその分だけ秘密鍵が必要になってくる。
そうすると管理が難しい。
そこで考えられたのが```公開鍵暗号方式```だ。
これは広く一般にばら撒く鍵を```公開鍵```という。
送信者側がその公開鍵で```暗号化して受信者側が持っている秘密鍵で復号```して安全に通信することができる。

共通暗号化方式に比べて、公開鍵暗号方式は```暗号化や復号に大変時間がかかる```ので、２つを使い分けることが一般的だ。
出典 https://udemy.benesse.co.jp/development/blockchain/public-key-cryptography.html

# 改ざんを防ぐディジタル署名
* 例えば、Aさんという送信者からデータを受信できても、そのデータが```本当にAさんから受信できたのかを確認```することが出来ませんし、下図のように、```伝送経路上でデータが改ざんされている可能性```もあります。そこで、送信者が本当に```Aであり、データの改ざんがないことを確認```するためにデジタル署名を使用します。

    デジタル署名とは、送信されてきたデータが```間違いなく本人のもの```であるのかを証明するのための技術。デジタル署名はデータの送信者を証明できるので、```データの改ざんが行われていない```ことを確認できます。デジタル署名は公開鍵暗号を応用した技術でもあり、デジタル署名の仕組みのなかで公開鍵と秘密鍵も登場します。ハッシュも使用しています。デジタル署名を実現できる方式にはRSAやDSAなどがあります。

    出典　https://www.infraexpert.com/study/security5.html#:~:text=%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E3%81%A8%E3%81%AF%E3%80%81%E9%80%81%E4%BF%A1,%E9%8D%B5%E3%82%82%20%E7%99%BB%E5%A0%B4%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

* 送信者は、相手方（受信者）に送信しようとする```文書データについて、ハッシュ関数を用いてハッシュ値を算出```します。
出典 https://biz.moneyforward.com/contract/basic/799/

* 本文を```ハッシュ化```という手法で短い要約データ（```メッセージダイジェスト```)を作成して暗号化することでディジタル署名とする。

* ２つ上の出典元の図がわかりやすいです。

## 気づき
文書と文書を基にしたハッシュの２つを分けて相手に送信するのか。
相手は文書をハッシュ化した値と公開鍵で開いたハッシュ値が同じであれば送信元と内容が正しいことがわかるのか。

# なりすましを防ぐ認証局（CA）
しかし元の公開鍵と秘密鍵がニセモノだったらセキュリティの意味がなくなる。
なので公開鍵が本人ものだと証明することが必要になってくる。

その第三者機関が```認定局(CA: Certificate Authority)```という。

### 認定局の保証する流れ
* 認定局に公開鍵を```登録```する
* 認定局に登録した鍵によって```身分を保証```する

このように公開鍵暗号技術を用いて通信の安全性を保証する仕組みを
```公開鍵基盤（PKI:Public Key Infrasturcture)```という。
Discord.py 2.0 がリリースされたようです

> やったー！

どうもbeatbox4108です。
今日の日本時間12:50分、discord.pyのdiscordサーバーにてバージョン2.0のリリースが発表されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672153/5caa5d48-c1da-5548-a6ba-a71059a85eef.png)

一応discordの全文を翻訳して掲載します。
- - -
> v2 が PyPI でリリースされました!
> ## お詫び
> まず、このリリースを出すのに時間がかかったことをお詫びしたいと思います。残念なことに、IRL で慌ただしく忙しくなってしまったのです。v2をもっと早くリリースするつもりだったのですが（7月頃、あるいはそれ以前かもしれません）、改築や仕事、そして全体的に忙しい生活関連の事柄に巻き込まれたのです。それに加えて、他の参加者も自分のことで忙しかったり、新しい仕事を見つけたり、ただ単に仕事が忙しかったりしました。
> 
> それでも、このリリースを気に入っていただけることを願っています。
>
> ## 新しい機能
>
> v2 では v1.7.3 から多くのことが追加されました。1700 のコミットで 500 以上の追加と 800 以上の変更がありましたが、ここでは主な追加を簡単にまとめています。
> 
> - ボタン、選択メニュー、モーダルなどのインタラクション 
>   - これらは全て `discord.ui` 名前空間の下にあります
> - スラッシュコマンドとコンテキストメニューの完全なサポート 
>   - これらは全て `discord.app_commands` の下にあります 
> - ゲートウェイAPI v10 への更新（v7 からのアップグレード）。
> - スレッドとフォーラムチャンネルのサポート 
> - ギルドのイベントスケジュール、AutoMod、ウェルカムスクリーンのサポート
> - スタンプのサポート 
> - スタートアップと解析の両方での全体的なパフォーマンスの大幅な向上。 
>   - さらなるスピードアップのために、`discord.py`でない、`discord.py[speed]`をインストールできます。
> - 正確なスケジュールを持つための、`ext.task`のタイムパラメータ
> - `ext.commands`フレームワークの改良
>   - 特殊な`discord.attachment`コンバータ 
>   - ユーザーフレンドリーなフラグのための`FlagConverter`
>   - 値が範囲内にあることを確認するための`Range` 
>   - `extras`キーワード引数とコマンドに追加情報を格納するための属性
>   - `typing.Literal` と `typing.Annotated` サポート
>   - デフォルトの署名を指定し、`commands.param`で詳細を確認できる
> - テキストコマンドを簡単にテキストコマンドとスラッシュコマンドの両方にするためのハイブリッドコマンドフレームワーク
>   - これはトップレベルの `command()` デコレーターを `hybrid_command()` に、 `group()` デコレーターを `hybrid_group()` に置き換えるだけで良いです
>   - もう少し詳しい情報は、これらのオリジナルのアナウンスをここで確認してください:https://discord.com/channels/336642139381301249/381965829857738772/965731673717223495
>
> ## 破壊的変更
>
> 今回のリリースはメジャーバージョンアップであるため、いくつかの変更点があります。特筆すべきは、必要な Python のバージョンが 3.5 > から 3.8 に引き上げられたことです。しかし、このリリースには、多くのマイナーおよびメジャーな変更点があります。移行を支援するため> に、移行ガイドがこちらで作成されました: https://discordpy.readthedocs.io/en/stable/migrating.html
> 
> 移行に際して助けが必要な場合は、ヘルプフォーラムに "Migrating" というタグを付けて投稿してください。
>
> ## 寄付
> 
> このプロジェクトを財政的に支援するために、寄付のリンクが欲しいという要望がありました。寄付をしたい人のために、私は寄付を集めるためのオープン・コレクティブを開設しました。https://opencollective.com/discordpy で見ることができます。もちろん、寄付をする必要はありませんし、寄付をすることによるメリットもありません。あくまでも、このプロジェクトをサポートしたい方のみ、ご協力をお願いします。

- - -
### 移行ガイド

https://discordpy.readthedocs.io/en/stable/migrating.html

### オリジナルのアナウンス

https://discord.com/channels/336642139381301249/381965829857738772/965731673717223495

### オープン・コレクティブ

https://opencollective.com/discordpy
- - -
これからはdiscord.py2.0を利用する場合でも次のような従来の方法を利用できます。

```bash
$ pip install discord
```

ってことで今回はここまでです。
~~内容が今回薄かったような気もするけど... まあいいかw~~
ってことで次回もお楽しみに！
【初心者向け】 Next.js 公式チュートリアル 学習記録1 

# はじめに
Next.jsはReactと何が違うのか、Next.jsの特徴、
公式チュートリアルで学んだことを自分用のメモとして簡単にまとめます。


# ReactとNext.jsの大きな違い
ReactはCSR（Client Side Rendering）、SPA(Single Page  Application)が特徴。
初期に必要なページをすべてロードするため読み込みが遅い。
ブラウザ側でhtmlのレンダリングを行う。ブラウザの負荷が大きい

Next.jsはSSR(Server Side Rendering )
サーバー側でレンダリングを行う。
サーバーのほうがスペックが高いため、レンダリングが早い。

以下の参考記事に詳しく記載されている
[結局ReactとNext.jsのどちらで開発を進めればいいの？](https://qiita.com/hiroki-yama-1118/items/b3388c5dcb155e2e367d)

# Next.jsの利点
Next.jsを使うことで、ReactでしなければいけなかったWebPackとかBabelのめんどくさい設定を省ける
Code Splitingのような読み込むページ量の最適化設定が不要
Reactで必要だったパフォーマンス、SEOのためのPre-renderの設定が不要
レンダリングのタイミング(SGやSSR,CSR)を選択できる
サーバーサイドの実装(APIなど)もできる

プレレンダリング…事前にレンダリングしてhtmlを作成すること

# Next.jsのチュートリアルで学んだこと

## Navigate Between Pages
pageはpageディレクトリ内に配置する。
ファイル名がルート(経路となる)、つまりファイルへのパスがURLになる。

例
pages/index.js → /
pages/example/example-page.js → /example/example-page

ページ遷移にはLinkコンポーネントを用いる。

LinkコンポーネントはClient-Side Navigationを可能にする。
Client-Side NavigationはJavaScriptによってページを切り替える仕組み。
クライアント側で変更した状態を保ったままページ遷移することができる。
ユーザーが入力した情報を保持できるので開発者にとても便利な機能。
ページの再読み込みが発生しないので、ページ遷移がはやい。

Code Splitingで、Pre featchされるときLinkコンポーネントに紐づいたものも読み込まれる。


## Assets, Metadata, and CSS
### Assets
画像などの静的データは、トップのpublicディレクトリに配置する。
画像を用いるときはImageコンポーネントを用いる。
画像サイズの変更と最適化を自動でやってくれるので便利。

※静的アセットとは
アセットとは資産という意味。静的アセットで画像ファイルなどを表す。

### Metadata
Next.jsではhtmlの\<head>タグの変わりに\<Head>コンポーネントを用いることによって、
pageごとにメタデータを設定できる。SEOに強くなる。
例 ページごとにtitleを設定する
Scriptコンポーネントを用いることで、Third-party JavaScriptを追加できる。
サードパーティ スクリプトの読み込みを簡易化できる。


メタデータとは…データの説明データ

### CSS Styling
CSSを設定では以下の様々な方法をとれる。
1. CSSモジュール
2. css 、 .scss fileをインポートするSaas
3. Tailwind CSSのようなPostCSS libraries
4. styled-jsx, styled-components、emotionのようなCSS-in-JSライブラリ

* CSS Modules
Reactのコンポーネントにcssファイルをインポートできる。
CSS ファイル名の末尾は .module.css.
cssモジュールにクラスを定義じて使用するファイルでインポートする。

* Layout Component
最上位にcomponentディレクトリを作成。
その中にLayoutコンポーネント(すべてのページで共通のデザインを定義する)を作成する。

CSS モジュールの機能では、一意のクラス名が自動的に生成されるため、
同じファイル内でかぶってなければ、クラス名の衝突を心配する必要がない。

* Global Styles
すべてのページでロードしたいcssを定義する
グローバルなcssファイルをロードするには、
pageディレクトリに_app.jsを作成する。

Appコンポーネントはすべてのページに共通する最上位のコンポーネントであり、
グローバルcssはAppコンポーネントでのみインポートできる。
_app.jsには全ページで共通させるファイルを読み込ませる、処理を実行させる、
共通のレイアウトを組み込んだりする。


参考記事
[Next.js　チュートリアル](https://nextjs.org/)
[【日本一わかりやすいNext.js入門】#1 講座の概要](https://www.youtube.com/watch?v=F77RUjHZEAc)
【Rails】gemのkaminariと配列を併用する場合について

## はじめに
ページネーションを実装する時にkaminariを使用することが多いと思います。
しかし、その前に取得したレコードを操作して配列になっていたりすると、そのまま`.page(params[:page])`を適用させることはできません。
このようなケースが個人開発であったのですが、応用的な使い方を知らず少々つまずいたので、今回記事に残しておくことにしました。

## やりたいこと
- Itemモデル全体をシャッフルして表示する
- 表示は、ページネーション対応で1ページに5個までにする
- kaminariのインストールは[こちら](https://qiita.com/you8/items/df68aaee3010e282d1ae)が参考になります

## 開発環境
Ruby 3.1.2
Rails 6.1.6

## 実装
そもそもページネーションを適用しないのであれば、shuffleメソッドを使用するだけで完了します。
```ruby:items_controller.rb
...

def index
  @items = Item.all.shuffle
end

...
```
ここで、`Item.all.shuffle`後ろに`.page(params[:page])`を加えれば良いのではないかと思いますが、これをすると`NoMethodError`をはかれてしまいます。

なぜかというと、クラスの違いによるものです。
`Item.all`と　`Item.all.shuffle`のクラスをコンソールで見てみましょう。
```:ターミナル（rails c）
> Item.all.class
=> Item::ActiveRecord_Relation

> Item.all.shuffle.class
=> Array
```
このように、`shuffle`メソッドを使用すると、クラスがArray（配列）になってしまうのです。そして、`.page(params[:page])`は、配列には使用することができないため、エラーが発生してしまっていました。


では、これを解決する方法は何なのかというと、kaminari側で配列にも対応できるメソッドを用意してくれています。
それは、`paginate_array`メソッドです。（[GitHubのリンク](https://github.com/kaminari/kaminari#paginating-a-generic-array-object)を示しておきます。）
```ruby:items_controller.rb
...

def index
  @items = Kaminari.paginate_array(Item.all.shuffle).page(params[:page]).per(5)
end

...
```
`Kaminari.paginate_array(Item.all.shuffle)`を前につけるだけで、配列にも対応できるようになりました。
余談ですが、viewファイルに`<%= paginate インスタンス変数 %>`を記述するのを忘れないようにしてくださいね。
## さいごに
まさかkaminari側でこのような場合にも対応できるようにしてくれているなんて、驚きました…
どなたかのお役に立てれば幸いです。
(新)【SpringBoot】Spring Security を用いてDBにアクセスして認証を行う

Spring Securityの設定方法についての備忘です。

前回、5.7以前の書き方で記事を書きましたが、5.7以降の書き方に変更したので、変更箇所を執筆します。
前回の記事は[**こちら**](https://qiita.com/MMK3/items/108f08620bf8c69376d2)

## Configクラスの修正
#### ✓ ポイント
- ``WebSecurityConfigurerAdapter`` を継承せずに ``SecurityFilterChain`` をBean定義して設定の記述を行う


~~~java:SecurityConfig.java
package com.example.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.security.servlet.PathRequest;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

import com.example.authentication.CustomUserDetailsService;

@EnableWebSecurity
public class SecurityConfig {  // WebSecurityConfigurerAdapterは継承しない

    // SecurityFilterChainをBean定義する
    @Bean
	public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
		
        // config(HttpSecurity http)のオーバーライドしたメソッド内でやっていたことと同じ

        // 以下ログインに関する設定。書き方は以前と同様
		http.formLogin(login -> login
				.loginProcessingUrl("/login").permitAll() //ログインのURL
				.loginPage("/login").permitAll()
				.usernameParameter("name")
				.passwordParameter("password")
				.failureUrl("/login?failed")
				.defaultSuccessUrl("/item/list")
				
            // 以下ログアウトに関する設定。書き方は以前と同様
			).logout(logout -> logout 
				.logoutUrl("/logout").permitAll()
				.logoutSuccessUrl("/login")
				.invalidateHttpSession(true)
				.deleteCookies("JSESSIONID")
			
            // URLごとの認可設定を下記で行う。書き方は以前と同様
			).authorizeHttpRequests(authz -> authz
	            .mvcMatchers("/login/**", "/user/**", "/rest/**", "/img/**", "/css/**", "/js/**").permitAll()
	            .anyRequest().authenticated()
	        );
			
		
        // Bean登録
		return http.build();
	}
	
    // PasswordEncoderもBean登録する。これが無いと、PasswordEncoderがありませんというエラーがでる。
	@Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }
	
}
~~~

## 終わりに
SpringSecurityについて検索すると、``WebSecurityConfigurerAdapter`` を継承した以前の書き方ばかり出てくるので、この記事が誰かの一助になれば幸いです。間違っている部分もあるかと思いますので、その際はご指摘頂ければと思います。

## 参考文献
[Spring Security 5.7でセキュリティ設定の書き方が大幅に変わる件](https://qiita.com/suke_masa/items/908805dd45df08ba28d8)
[Configure HTTP Security without extending WebSecurityConfigurerAdapter](https://github.com/spring-projects/spring-security/issues/8804)
[最新の5.7で学ぶ！初めてのひとのためのSpring Security](https://www.docswell.com/s/MasatoshiTada/KGVY9K-spring-security-intro)
MSIのサウンドユーティリティ,Nahimic serviceがExcelの動作に影響している

# 結論
MSIマザーボードのサウンドユーティリティ，Nahimic ServiceがExcelと干渉．
サービスマネージャ(services.msc)からNahimic Serviceの自動起動を停止で解決．
BIOSの更新などで自動起動が再度有効になることがある．

# Excelがあまりにも遅い
起動・終了に数分単位でかかる．
空のブックでカーソルの移動をするのに数秒かかる．
アドインにも心当たりはなく，再インストールなども効果なし．
Officeのその他のソフトウェアは問題なく利用できる．
Excelだけが遅い．

Qiitaにもすでにエントリがある．
https://qiita.com/Takeshi_Shimoda/items/3248e79a7801351bd861
自分用の覚書として残しておく．
初心者向け Pythonプログラミング基礎 #2

# 目的
プログラム言語の一つであるPythonの使い方の基礎を学ぶ．
今回は文字列の扱いについて．

また，特に指定がない場合下記のようにプログラムの実行結果を示す．

```
>>>この部分は実行結果を表示
```

# 数値と文字列

Pythonでは数値と文字列は別のものとして，認識される．
数値の場合，四則演算など数値同士の演算ができるのに対して，
文字列は連結することのみ可能．

```.py
a = 123 #数値の123
b = '123' #文字列の123

c = 1
d = '1'

a + c
>>> 124

b + d
>>> '1231'
```

数値は数値同士の演算，文字列は文字列同士の演算でなければ，エラーが発生する．数値と文字列は関数を使用することで，変換できる．

```.py
a = 123 #数値の123
b = '123' #文字列の123

str(a) #数値を文字列に変換
>>> '123'

int(b) #文字列をint型に変換
>>> 123

float(b) #文字列を単精度小数点に変換
>>> 123.0
```

# 文字列の演算

文字列は+記号をつかうことで，連結することができる．
*記号をつかうことで，同じ文字列を繰り返すことができる．

```.py
a = 'あいうえお'
b = 'かきくけこ'

a + b
>>> 'あいうえおかきくけこ'

a*3
>>> 'あいうえおあいうえおあいうえお'
```

# 文字列の大文字化と小文字化

文字列はupper()とlower()メソッドを使うことで大文字化，小文字化ができる．

```.py
a = 'Train'

a.upper() #大文字化
>>> 'TRAIN'

a.lower() #小文字化
>>> 'train'
```

# 文字列内の検索

find()メソッドを使うことで，文字列中の文字がどこにあるか検索できる．
一番左側の文字を0番目として，最初に発見した位置を表示する．

```.py
a = 'あいうえおかきくけこ'

a.find('かき') #「かき」がどこにあるか検索
>>> 5

#特定の文字列が含まれるかどうか
'かき' in a #含まれる場合
>>> True

'さし' in a #含まれない場合
>>> False

b = 'あえいうえおあお'

b.count('あ') #「あ」が何回あるか数える
>>> 2
```

# 文字列の配列の連結

配列に入っている文字列はjoin()メソッドを使うことで，すべて連結できる．

```.py
a = ['home', 'hoge', 'data', 'fuga.csv']

'/'.join()
>>> 'home/hoge/data/fuga.csv'
```

# 文字列の置換

replace()メソッドで特定の部分を置換することができる．

```.py
a = 'あいうえお'

a.replace('う', 'く') # 「う」を「く」に置換
>>> 'あいくえお'
```

# 文字列の部分取得

配列のように場所をしていすることで，文字列の特定の部分を取得できる．

```.py
a = 'あいうえお'

a[0] #1文字目
>>> 'あ'

a[3] #4文字目
>>> 'え'

a[-1] #末尾から1文字目
>>> 'お'

a[-3] #末尾から3文字目
>>> 'う'

a[1:3] #2文字目から3文字目まで
>>> 'いう'

a[::2] #1文字おきに取得
>>> 'あうお'
```

# 空白文字の処理

空白文字を処理するためのメソッドが用意されている．
それぞれのメソッドには特定の文字を指定することも可能であり，その場合は，指定した文字列が処理される．

```.py
a = '  あいう\nえお  '

a.strip() #両端の空白を削除
>>> 'あいう\nえお'

a.lstrip() #左側の空白を削除
>>> 'あいう\nえお  '

a.rstrip() #右側の空白を削除
>>> '  あいう\nえお'

a.split() #空白文字(改行など)で分割
>>> ['あいう', 'えお']
```
「関数グラフソフトGRAPES」の簡易マニュアルを作ってみたい。

「関数グラフソフトGRAPES 7.80」
インストール方法

https://tomodak.com/grapes/



# 簡易マニュアルⅠ
まずは、点を結ぶ方法です。
P41より　＜本体 + マニュアル + サンプル 最新版です。(2022.05.28)

起動後
①データパネルの「点を結ぶ」　左クリックする。
②グラフの中に左クリックを繰り返す。
　A,B,Cと線が発生します。
➂データパネルの「ファイル(F)」を左クリックする。
　「プロジェクトの初期化」を左クリックする。
　線も文字も消えます。

~~スクリーンショットは省略。実行してみて下さい。~~
P41より。
つづく。(ここまでできました。)

# 索引
(勉強中)

く
グラフウィンドウ

け
現在のパラメータ値

こ
コントロールパレット

さ
残像設定

す
図形名

れ
連結図形
連結図形パネル

# 感想
・「点を結ぶ」楽しい。
・スクリプトで「点を結ぶ」方法を教えて下さい。

(20220819)

https://qiita.com/mrrclb48z/items/6f8f94ae2d90e1dfc2f3
AWS Solution Architect Associate認定資格の受験メモ

### はじめに
AWS Solution Architect Associateの認定資格の受験を受けて見ましたので、その準備方法について共有します。

### 私のスキル背景
私はCloud技術関連の素人ではありません。一応Cloud Infrastructure Specialistです。
IBM Cloudを普段良く利用していて、VPC、Classic Infra、コンテナ基盤（Kubernetes、OpenShift）、DBサービスなどの構築経験があります。
ただAWS関連でLambdaでAlexaスキルの開発をやったことがあるぐらいです。

### 私が受けた試験
SAA-C02という試験です。
※2022年８月３０日からSAA-C03という試験しか受けれなくなるとのことですが、試験の詳細に変更がないと公式ページにありましたので、少しは参考になるかと思います。

### 準備期間
１ヶ月未満の準備時間でした。（7月20日〜8月18日）

### 準備方法

* **研修を受けました。（7月20日〜7月22日）** → **対象のサービスがなにかの把握**
 有料の研修でありますので、とても優しく説明していただきました。
 ただ、Cloud関連でそこまで経験のない方向けの研修でしたので、基本AWS以外のCloud利用経験がある方であれば、受けなくても良いかもしれません。


* **本を利用して勉強（8月1日〜8月14日）**　→　**対象のサービスにどんな機能があるかを把握**
基本これがメインだった気がします。
AWSの勉強用本がたくさんあるため、ここで詳細は紹介しません。
１日１時間程度の勉強時間でしたので、全部読むに少し時間がかかりました。

* **公式サイトの模擬試験を受けました。(8月15日)** →　**試験の難易度の把握**
無料で受けれるもので、基本本番と同じくらいの難易度のものです。残念ながら２０問しかなくて、勉強になるかというと、そうでもないきがしますので、難易度を把握するためのものだと認識したほうが良い気がします。

* **Udemyの問題集をやってみました。(8月17日)**　→　**受験勉強**
[【2022年版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/)

  こんなものの存在に早く気付けばよかったのに、本番前日の夕方に存在を気づきました。
時間がなかったので、【基本問題の模擬試験①（「これだけでOK！～講座の模擬試験③と一部重複あり）】と【高難易度の模擬試験②】のみやってみました。
 とても勉強になりますので、これが一番オススメです。
* **電車で前日Udemyで間違った問題を復習**　→　**自分がよく間違える部分を振り返る**
前日のUdemyの問題集で間違っていた部分を再度振り返る。
※これは事前にやるべきです。もうこのタイミングはしょうがないからやるだけで、もっとUdemyの問題集の勉強がしたかったです。

### 本番
センターで試験を受けましたが、センターでPCを用意していただき、その上で受験するイメージです。
受験が完了し、アンケートの入力まで終わったら結果が表示されます。
**無事に受かりました！**
詳細まで表示されなく、AWSからメールが来るようです。

### 反省点
* もっと他の方の経験談を見るべきでした。色んな勉強方法がありますので、とても参考になります。
* 体系的な知識の習得には本が良いですが、サービスの詳細について公式のドキュメントを読むべきです。
* かなり急いでやっていましたので、今回の知識が身につけたかが疑問になりますので、身につけるには時間をかけるべきです。

### まとめと感想

* １ヶ月未満の準備時間で受かるということは本試験が簡単であるとのことではなく、私がそもそもCloudインフラストラクチャのスペシャリストであるからだと思います。自慢ではなく、他のCloudで十分に時間をかけて勉強したからであると伝えたかったです。
* AWSのSAAを学んだからもう設計ができるかというと、私はそう思いません。より細かいサービスの機能レベルの勉強すべきだと思います。ただ本試験は少なくともProfessionalを受ける前の良い踏み台だと思います。
* AWSはとてもサービスが充実しているCloudベンダーだと思いますので、より深く勉強するのがとてもいい選択肢だと思います。
仮想サーバーの作成と料金

# インスタンス作成の例
**インスタンスの設定値例**
|項目|設定値の例|
|-|-|
|AMI|Amazon Linux 2|
|インスタンスタイプ|t2.micro|
|リージョン|東京|
|インスタンス数|１|
|購入オプション|なし|
|ネットワーク|デフォルトのVPC|
|サブネット|優先順位なし|
|配置グローブ|なし|
|IAMロール|なし|
|シャットダウン動作|停止|
|削除保護の有効化|なし|
|モニタリング|なし|
|テナンシー|共有・共有ハードウェアインスタンスの実行|
|T2/T3無制限|なし|
|ストレージの容量と種類|8GBの汎用SSD|
|タグ|キーはName,値はサーバーなどの名称|
|セキュリティグループ|SSH（ポート22）、HTTP（ポート80）、HTTPS（ポート443）など|

※T2/T3無制限とは
インスタンスタイプがT2またはT3の場合に限り、表示される選択肢。
負荷がかかった時のバースト（一時的に高いパフォーマンスを出す機能）を無制限にすることが可能。ただし、その分コストがかかるので、常時サーバーに負荷がかかるときは高コストになる。
# インスタンスの料金
料金 = **インスタンスの使用料** + **EBSの料金** + **通信料金** + **その他のオプション**
## インスタンスの使用料(稼働している時間×単価)
インスタンスが稼働している秒単位で課金される。
停止している時間はかからない。
単価は高性能であるほど高い
# EBS（ストレージ）の料金（容量×単価）
インスタンスで利用するEBSの料金。
確保した容量単位の課金となり、ストレージの性能(SSD,HDD)によって単位が変わる。インスタンスと異なり、停止してる時間も課金される。
# 通信料金（アウトバウンドの通信料金）
インスタンスとの通信料金。
インターネットからインスタンスに向けた方向（インバウンド）の通信費は無料で、
インスタンスからインターネットに向けた通信（アウトバウンド）のみ料金がかかる
料金はリージョンによって異なる。
# その他のオプション
Elastic IPサービスなどのオプションを使うときなどに料金がかかる。
# 余談
## AWS加入から１年間の特典
* t2.microを750時間分/月の範囲を無償（おおよそ１台１ヶ月分）
* EBSを30GBまで無償
* 通信料金15GBまで無償
## EC2の不得意なこと
選択の幅が広いことで魅力的なEC2ですが、
単純なサーバー１台で構成されているあまり変化のないシステムであれば、AWSの良さが生かせないので利用するメリットがない。
**EC2は自分でまめに管理することが前提なので、作りっぱなしのシステムには向かない**
【Swift】iOSバージョンを取得する方法

# はじめに
ユーザーエージェントを偽造する際にユーザーの端末のiOSバージョンの情報を使ったので取得方法を備忘録として載せておきます。

# 方法
```swift
let iosVersion = UIDevice.current.systemVersion

print(iosVersion)
```

# おわり
意外と使わない機能なので全然知りませんでした笑
JavaScript チート・オブジェクトの要素数とオブジェクトの配列の要素数を求める

- [あるWebサービスの開発メモ・目次ページに戻る](https://qiita.com/ishi32/items/152a1ecf7eeee7a8fb57)
- [あるWebサービスの開発メモ・JavaScript チートに戻る](https://qiita.com/ishi32/items/aa1db70e2176652dc97f)

### オブジェクトの要素数は .length から取得できない

```
obj1 = {name: "mop", age:"15"};
console.log(obj1.length);
```

よく書いてしまうコードなのですが undefined がログに出力されます

(連想配列の)オブジェクトには .length というプロパティは無いんですね

### オブジェクトの要素数は ``` Object.keys(obj).length ``` から取得する

```
console.log(Object.keys(obj1).length);
```

2 がログに出力されます。

Object.keys() メソッドは、引数に指定されたオブジェクトのキーの配列 (この例では ``` ['name', 'age'] ```) を返してくれます。この配列の .length プロパティが、オブジェクトの要素数を示しています

.length プロパティは更新可能ですが、メタプログラミング以外で更新することはまずないと思います。.length は、より小さい値で更新すれば後方の配列要素が失われますし、大きい値で更新すれば、後方に空の要素が加わります。

### オブジェクトの配列の要素数は .length から取得できる

```
obj1 = {name: "mop", age:"15"};
obj2 = {name: "mike", age: "58"};
obj3 = {name: "hana", age: "51"};
objs = [obj1, obj2, obj3]
console.log(objs.length)
```

objs は配列なので .length を参照すれば、その要素数 3 がログ出力されます

### ``` Object.keys(objs).length ``` からも取得できるのでは？

```
console.log(Object.keys(objs).length)
```

3 がログ出力されます

``` Object.keys(objs) ``` からは ``` ['0', '1', '2'] ``` の配列が返ってくるので、この配列の .length プロパティは 3 を示しています

このアプローチも一見正しいように見えていますが、配列 (ここでは objs) の .length プロパティを参照するのが正しいアプローチだと思っています。
Azure Functions (Node.JS) からの http リクエスト (GET|POST) で async/await を適用する 

# Azure Functions (Node.JS) で fetch が使えない?

Rest API に GET|POST したいので、fetch を使おうとしたら動かない? ということで調べたら、Node.JS(v16) では module として利用できないので NG と．．．。

https://docs.microsoft.com/en-us/answers/questions/740430/can39t-get-node-fetch-to-work-my-first-azure-funct.html

# 公式ドキュメント: Azure Functions の JavaScript 開発者向けガイド を見てみる

公式ドキュメントである [Azure Functions の JavaScript 開発者向けガイド](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-reference-node?tabs=v2-v3-v4-export%2Cv2-v3-v4-done%2Cv2%2Cv2-log-custom-telemetry%2Cv2-accessing-request-and-response%2Cwindows-setting-the-node-version#considerations-for-javascript-functions) には、JavaScript Function に関する考慮事項 として **async と await を使用する** と記載されています([参照](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-reference-node?tabs=v2-v3-v4-export%2Cv2-v3-v4-done%2Cv2%2Cv2-log-custom-telemetry%2Cv2-accessing-request-and-response%2Cwindows-setting-the-node-version#use-async-and-await))。

推奨方法として、[util.promisify](https://nodejs.org/api/util.html#util_util_promisify_original) を使う方法が掲載されています。

# request と util を使って書く 【結論】

ドキュメントのサンプルに則り、util モジュールを使って非同期に (かつ try&catch で例外処理を組み込んで) 書いてみます。[request と util を使って動いた！](https://stackoverflow.com/questions/69181644/return-body-in-azure-function)という情報を踏襲して、書いてみた&動いたものがこちら。

```index.js
const util = require ('util');
const request  = require ('request');
const requestPromise = util.promisify(request);

//http trigger function
module.exports = async function (context) {

try
{
    var response = await requestPromise(
        {  
            method: 'POST',
            url: 'https://example.com/postapi', //目的のURLに変更
            headers: {
                    'Content-Type': 'application/json'
                    //必要なヘッダーを適時追加
                },
            body: JSON.stringify({ "id":"xxxxx", "name":"annie" }) //お好みのフォーマットで
        }
    );
    context.res = {
        status: 200,
        body: response.body
    };   
}
catch
{
    //例外処理を記載。例えば:
    context.res = {
        status: 400,
        body: 'Http POST request error!'
    };   
}
```

# 実際の利用例

https://github.com/ayako/CogServicesLanguageSamples/blob/main/samples/JavaScript/Sentiment/TextAnalyticsFunc202207/TextAnalyticsFunc_RestAPI/index.js

https://github.com/ayako/CogServicesLanguageSamples/blob/main/samples/JavaScript/Translate/TranslatorFunc202208/TranslatorFunc/index.js


# 今回試した環境

- OS: Windows 11
- Node.js: 16.13.2
- Visual Studio Code 1.70.2
    - Azure Functions for Visual Studio Code 1.7.4
- Azure Function 4.x
Githubの歴史コミットのユーザ名とメールアドレスを変更する方法

## 環境

+ Window 10
+ Git Bash



## 確認

まずは歴史記録を確認します  
間違ったのは`wrongName`と`wrongMail@example.com`です

```bash
git log --pretty=full

commit 000111000111000111000 (HEAD -> master, origin/master)
Author: wrongName <wrongMail@example.com>
Commit: wrongName <wrongMail@example.com>
```

### 

## 変更方法（ローカル）

正しいユーザー名を設定します

```bash
newName=correctName
```

正しいメールアドレスを設定します

```bash
newEmail=correctMail@example.com
```

ローカルのGit情報を変更します

```bash
git filter-branch -f --env-filter "GIT_AUTHOR_NAME='$newName'; GIT_AUTHOR_EMAIL='$newEmail'; GIT_COMMITTER_NAME='$newName'; GIT_COMMITTER_EMAIL='$newEmail';" HEAD
```

歴史記録を再確認して、正しいユーザー名とメールアドレスになりました

```bash
git log --pretty=full

commit 000111000111000111000 (HEAD -> master, origin/master)
Author: correctName <correctMail@example.com>
Commit: correctName <correctMail@example.com>
```



## 変更方法（GitHub）

ローカルで修正した情報をGithubに強制的にpushします

```bash
git push -f
```
エンジニア未経験が実務で活躍、または、爆速で成長するための能力とその能力の高め方を調べてみた１（能力は計６個）

# 動機
自分が実務未経験なので、プログラミングを勉強するなら、実務で活躍できるスキルを身につけたいと思い、そして、<b>その能力を高められたら、実務に入ったとき、よいスタートダッシュがきれる</b>のでは？と思い、調べてみました。
そして共有した方が良いと思い、記事にしました。
今回の記事では、論理的思考力とプログラミング力の高めかたを記事にしています。

# 結論
爆速で成長するために必要な能力とは、
１、問題解決力
２、論理的思考力
３、プログラミング能力
４、技術知識（サーバー、ネットワーク、セキュリティ、OS）
５、読解力
６、逆算力
の６つです。


# 論理的思考力を高める方法
１、すべての事柄に疑問を持つ。
　→事柄に対して、なんで？を繰り返す。
２、相手が理解できるような言葉を使う。
  →語彙力を増やすために、読書が有効。
３、書く。
論理的な展開は、文字にした方が整理できる。
４、分類する（MECE）。
論理的思考を高めるには、物事の分類・整理が大切。
分類がはっきりすると、全体の構造が見えてくる。
注意点は、モレや重複なく、分類すること（MECE）。
５、意識してニュース（新聞、ネットニュース）を読む。
ジャンルは何でもいいので、記事に書かれていることを、事実と事実に至った理由、原因、記者の意見や解釈に分ける。
つまり、<b>論理展開を意識してニュースを読む</b>。

# プログラミング力を高める方法
１、コードをたくさん書く。
２、参考書をたくさん読む。
３、情報発信を行う。
４、コードをしっかり読む。　
<b>コードを読む＞コードを書く</b>
５．<b>人に説明する</b>

# 感想
上記は当たり前のことかもしれないけど、その当たり前の、６個の能力の高め方の方法を各１個ずつでもいいから、毎日続けると、かなりの能力がつくかもしれないと思った。


# 続き
[エンジニア未経験が実務で活躍、または、爆速で成長するための能力とその能力の高め方を調べてみた２](https://qiita.com/niceboad2525/items/510d8bda4815a442d862)


# 参考文献
エンジニアを育成したい！人材育成の6つ問題点と方法あわせて紹介
https://www.yume-tec.co.jp/column/training/4116
論理的思考力を鍛える7つの方法
https://sales-ship.com/?p=429
駆け出しエンジニアが爆速で成長するには
https://qiita.com/Tita_boc16/items/d89628013b119124fc2c#%E6%8A%80%E8%A1%93%E5%8A%9B%E3%82%A2%E3%83%83%E3%83%97%E3%81%AE%E7%82%BA%E3%81%AB%E3%82%84%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8
優秀なエンジニアとは？共通する3つの特徴と採用のために必要なこと
https://www.wantedly.com/hiringeek/recruit/engineer_excellent/
ITエンジニアに必要なスキルとは？おすすめ資格も紹介
https://career.levtech.jp/guide/knowhow/article/171/
git push前にユニットテストを自動実行させる

# 背景
テスト実行せずpushしてmaster(main)ブランチにエラーが混じるケースがあった

# 対処
huskyを導入し、push前にユニットテストを実行させる
https://github.com/typicode/husky

# 実装
huskyのインストール
※npmの場合

```
npm install husky -D
```

hookファイル作成
```
npx husky add .husky/pre-push "npm test"
```

ちなみにcommit時に実行させたい場合は `pre-commit` に記述
```
npx husky add .husky/pre-commit "npm test"
```

# .gitファイルとpackage.jsonが同一ファイルにない場合
こんなディレクトリ構成の場合
```
root/
|--.git/
|--web/
|  └──...
└──client/
   |--...
   |--package.json
   └──...
```

`.git can't be found`というエラーが出る。

対処として、まずは`package.json`内のhuskyを呼び出すscriptにディレクトリ移動を含める

```json
"scripts": {
  "prepare": "cd .. && husky install client/.husky"
}
```

hookファイル内でもディレクトリ移動を指定する。
```
npx husky add .husky/pre-push "cd client && npm test"
```

# 結果
git pushコマンドを打つと、自動でユニットテストが走るようになりました。

# 参考
https://qiita.com/les-r-pan/items/c03f12bc1693983daa70
npm i ~　のエラー解決

# npm i ~　のエラー解決
create-react-appで新しいreactappを作る際material-uiとfirebaseのインストール時のエラー解決方法をまとめてみました。
##  エラー内容
![スクリーンショット 2022-08-18 9.09.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605940/7176c0ea-086a-fb60-1eb3-ad2ddbc96186.png)

### reactのバージョンを18から17へ
とりあえずググってみたらmaterial-uiがReactバージョンの18に対応していない模様。
`package.json`のreactとreact-domを書き換えます。
~~~package.json
"react": "^17.0.2"
"react-dom": "^17.0.2"
~~~
npmを再インストールします。
~~~
npm install
~~~
これで行けると思ったのですが、なぜかエラーになりました。
### npmのバージョンを変える
npmのバージョンはnodeのバージョンに対応して自動的に切り替わっているようなので変更してみました。
~~~
npm install -g npm@6.14.2
~~~
npmバージョンの確認
~~~
npm -v
~~~
自分の場合はこれでfairebaseとmaterial-uiはインストールできましたが、正解なのかはわかりません,,,
初学者なのでなぜエラーになったのか全くわかりませんでしたがメモ代わりに書きました。
【VSCode】任意の拡張子を別拡張子と関連付けする（例.htmlを.phpとして扱う）

メモとして残します。


# ■やり方

files.associationsプロパティに追加する。

```User/settings.json
"files.associations": {
    "*.html": "php",
    "*.hamlc": "haml"
}

```

以上
kintone-rest-api-client メモ

kintone-rest-api-clientを利用する際の個人的な備忘録です。
コード例は、ブラウザのデベロッパーツールで動作を確認するためのものです。

* 予めkintone-rest-api-clientをCDNで読み込むこと。

# kintone-rest-api-client

https://www.npmjs.com/package/@kintone/rest-api-client

# Record

## getRecords

https://github.com/kintone/js-sdk/blob/master/packages/rest-api-client/docs/record.md#getRecords

### Returns

* records:[]Object An array of objects, including field types and field values within the matching records.
* totalCount: String or null


```
var client = new KintoneRestAPIClient();
var APP_ID = kintone.app.getId();
var query = <query>;
var params = {
      app: APP_ID,
      query: query
    };
var response = await client.record.getRecords(params);
console.log(response);
```

```
{
  records: [
    {},
    {},
・・・
  ],
  totalCount: null
}

```


## getAllRecordsWithCursor


https://github.com/kintone/js-sdk/blob/master/packages/rest-api-client/docs/record.md#getallrecordswithcursor


### Returns

>An array of objects, including field types and field values within the matching records.


```
var client = new KintoneRestAPIClient();
var APP_ID = kintone.app.getId();
var params = {
      app: APP_ID,
    };
var response = await client.record.getAllRecordsWithCursor(params);
console.log(response);
```

```
[
    {
        "レコード番号": {
            "type": "RECORD_NUMBER",
            "value": "20"
        },
        "会社名": {
            "type": "SINGLE_LINE_TEXT",
            "value": "金都運総研"
        },
        "$id": {
            "type": "__ID__",
            "value": "20"
        }
    },
    {
        "レコード番号": {
            "type": "RECORD_NUMBER",
            "value": "19"
        },
        "会社名": {
            "type": "SINGLE_LINE_TEXT",
            "value": "林田商会"
        },
        "$id": {
            "type": "__ID__",
            "value": "19"
        }
    }
]
```
メール送信テストに使えるMailTrap

Webシステム開発でメール送信機能は必須と言っていいくらいに作り込むのですがいつも困るのがメール送信テスト。
誤って誰かに送ってしまうと怖いし、かといってテストしないわけにもいかないし。

最近、メール送信用のサンドボックスサービスを見つけたのでこれは使える！と思って早速開発サーバに組み込みました。

https://mailtrap.io/

# 概要
要はメール送信サーバとしてMailTrapを指定すれば、誰に送るメールだろうとこのサーバで止めてしまい、自分だけがメール内容を見られるというもの。

利用開始もとても簡単で、私の場合はGmailアカウント連携してサインアップしたらすぐに利用開始できました。

# 使い方
今回はLaravelで作っているWebアプリに組み込みたかったので、[Sandbox]→[Inboxes]とクリックして、Integrationの欄で「Laravel7+」を選択。

![スクリーンショット 2022-08-18 14.20.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926542/cca7b88e-06e4-42c3-6d96-90e0e6879528.png)

設定すべき内容が出てくるので、この内容をサーバ上の.envファイルに貼り付けて実際にメール送信テストを行いました。
そうするとすぐにInboxesにメールが届くので内容を確認できます（便利！！）

ただ、今回もLaravelでよくある.envのキャッシュ問題にずいぶん悩まされました。

https://qiita.com/kawax/items/ea881a6c18b8d4e94d83

# まとめ
ずっとフレームワークベースの開発をしてきましたが、そろそろフレームワークという概念も古いものになりつつありますね。。。
フレームワーク自体のメンテナンスや学習コスト、フロントエンドとバックエンドの密結合に悩まされ始めています。

そろそろ本格的にマイクロサービスアーキテクチャに切り替えつつ、CI/CDも導入しないと。
LFS で巨大なファイルを管理しているリポジトリを別のリポジトリに移動する方法

```
# 古いリポジトリからcloneし、LFSのファイルを全て取得
$ git clone --mirror git@github.com:hoge/old.git
$ cd old && git lfs fetch --all

# 新しいリポジトリにpush
$ git push --mirror git@github.com:hoge/new.git
# LFSのファイルを全てアップデート
$ git lfs push --all git@github.com:hoge/new.git
```
MySQLでパスワード忘れてとにかく入りたい時

備忘録。

# 環境

macOS Monterey 12.2.1
MySQL Ver 8.0.30 for macos12.4 on x86_64 (Homebrew)

# MySQLパスワード無しで入れるようにする

MySQLの設定ファイル`my.conf`を開く

```
$ sudo vi /etc/my.cnf

[mysqld]
skip-grant-tables
skip-networking
```

skip-grant-tablesで認証をOFFに、skip-networkingで外部(リモート)からの接続を禁止

```bash
$ mysql -u root 
```

で入る

# パスワードを変更する

```bash
mysql> SET PASSWORD = "*****";
```

パスワードを変更するクエリ。

```
$ mysql -u root -p
```
でパスワードを聞かれれば成功

# ごみ処理

さっき変更した`my.cnf`を消すか、コメントアウトする。
私はもう一度いつかやりそうなのでコメントアウトしておく。

```
$ sudo vi /etc/my.cnf

[mysqld]
# skip-grant-tables
# skip-networking
```

# 参考文献
- https://blog.katsubemakito.net/mysql/root-password-forget
- https://www.sejuku.net/blog/83286
Animate.css (CSSアニメーション)

## 公式ページ

https://animate.style/

## 使い方

```html
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css"/>

<h1 class="animate__animated animate__bounce">もじ</h1>
```

```html:書式
<h1 class="animate__animated animate__命令">もじ</h1>
```
仮想サーバーを使うまで

# EC2の操作
本来、サーバーの管理者には**サーバーの設置**、**サーバーのハードウェアや周辺環境を整えたりする**物理的作業と、**サーバーOSにログインして操作する**ソフトウェア的な作業がある。
## 物理的作業
クラウドでない場合は、現地に行って直接ケーブルを繋いで作業するが、
**EC2ではマネジメントコンソールで作業を行う**。
## ソフトウェア的な作業
非クラウド環境でもEC2でも**SSHでリモート**（インターネット経由）でログインして作業する
※SSHとは、サーバーを遠隔操作するプロトコル。
# EC2サービスの機能
**EC2の主要な機能**
|項目|内容|
|-|-|
|インスタンス|AWSクラウドに作る仮想サーバーのこと。EC2ではAMIから何度でも同じ構成のサーバーを作成できる。作成したサーバーをインスタンスと呼ぶ|
|AMI|仮想イメージのこと。インスタンスを作成する元となる金型のようなもの。OSのみが入っているものもあれば、ソフトウェアが入っているタイプまで様々なAMIがある|
|キーペア|インスタンスを接続するときに、認証のために使用する鍵|
|EBS|AWSクラウド内で使用できるストレージ。インスタンスのストレージとして使用される|
|セキュリティグループ|仮想的なファイアーウォール。|
|Elastic IP|静的（固定の）なIPv4アドレス|
# EC2を使用する流れ
1. AWSにログイン
リージョンを選択し、マネジメントコンソールを開く。EC2ダッシュボードを開く

1. EC2インスタンスを作る
AMIを選択する。
インスタンスタイプを選択
ネットワークやIPアドレスを割り当てる
ストレージを追加する
セキュリティグループを追加
キーペアの選択

1. EC2に接続する
SSHでEC2に接続

1. ソフトウェアのインストールや設定を行う
ソフトウェアのインストール・設置
# インスタンスの設定項目
|項目|内容|
|-|-|
|AMI|EC2インスタンスの仮想イメージであり、ソフトウェアの構成を記録したテンプレート。使用するOS、ソフトウェアなど、どのようなインスタンスにしたいかを決めたおき、それに該当するAMIを選ぶ。|
|インスタンスタイプ|EC2インスタンスのマシンスペック。CPU、メモリ、マシンのタイプを決める|
|リージョン|サーバーを設置する地域。世界的な冗長性を考えるときは海外に作成する|
|ネットワーク|EC2インスタンスを配置するネットワーク。AWSのVPC（AWSアカウント専用の仮想ネットワーク）から選択する。VPCがなければ、作るかデフォルトのVPCを使う|
|サブネット|設置するネットワークの範囲。VPC内のどのサブネットに置くかを選択する。サブネットを選ぶことで、アベイラビリティゾーンと呼ばれる配置場所とどの範囲にプライベートIPが振られるかが決まる|
|IAMロール|インスタンスのアクセス権限ポリシーを設定する。他のサービスにアクセスしたいときに、割り当てる必要がある。|
|ストレージの容量と範囲|サーバーマシンのストレージ。OSがインストールされる場所。基本的にEBSを選択し、利用するディスク容量とストレージの種類を選ぶ。|
|タグ（インスタンスの名称）|インスタンスに任意のタグを付けられる|
|セキュリティグループ|プロトコルごとにポートもしくはIPアドレスもしくはその両方をフィルタリングを設定する|

# 余談
## プライベートIPアドレスとNAT
EC2のインスタンスに振られるのは**プライベートIPアドレス**。
**NAT**により、グローバルIPアドレスに変換される。
リージョンごとに１つずつ用意されている「デフォルトのVPC」ではあらかじめNATが設定されていて、グローバルIPアドレスも割り当てられる。
macos + python +「￥n」を用いてうまく改行できない事象

# 事象
windows側からソースコードをそのままmacにコピーして実行したら、文字列に「￥n」があるのに出力には改行がありませんでした。

あれ、と思って「os.linesep」を「￥n」に入れ替えてから予想通り出力されましたが、少し気になって色々調査しました。

# 原因
以下のリンクが参考になりました。
windowsと異なり、macでは「￥」（円マーク）と「\」（バックスラッシュ）が別の文字と扱われるとのことです。

[円サイン(￥) とバックスラッシュ (＼)：追記](https://memo.koumei2.com/%E5%86%86%E3%82%B5%E3%82%A4%E3%83%B3%EF%BF%A5-%E3%81%A8%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5/)

# 解決策・回避策
上記の「os.linesep」を改行文字のところに入れることも可能ですが、最も簡単な方法は「⌥」（オプションキー）＋「￥」（円マークキー）の組み合わせで「\」（バックスラッシュ）を入力することでしょう。
Gitのコミットメッセージに!を含めると「zsh: event not found:」のようなエラーが出る場合の対処法

gitでコミットメッセージを書くときに「zsh: event not found:〜」というようなエラーが出ることがありました。

これは特殊文字が含まれているためで、今回の場合は!が含まれていました。

git commit -m "letに\\!を付与"

のように、バックスラッシュを前に含めると、エスケープされて!が使えました。

なにかの参考にどうぞ。
anime.js で さらに かっこいい サイト を 作る [アニメーション]


最近、こんなのを見つけました。

https://animejs.com/

anime.jsというのはhtmlの要素にアニメーションを付ける軽量なjavascriptのファイルです。
では今回はこのanime.jsを使いこなしていきましょう。

```html:html
<html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <!-- 要素 -->
        <!-- 以下はanime.js -->
        <script src='https://codepen.io/juliangarnier/pen/REyzrR/75efae7724dbc3c055e918057fc4aca5.js'></script><script  src="./script.js"></script>
    </body>
</html>
```

```javascript:javascript
anime({ //アニメを実行
    // ここにふるまい,対象の要素を入力しよう
});
```

<details><summary>anime関数の引数</summary>

# anime関数の引数

### targets

どの要素を対象にするか。

### translateX

anime実行時、右にどんくらい動かすか

### translateY

anime実行時、下にどんくらい動かすか

### rotate

anime実行時、何度回転するか

### loop

繰り返すか

### duration

アニメーションの時間(ミリ秒)

### delay

開始までの時間(ミリ秒)

### endDelay

終了した後の時間(ミリ秒)

### elasticity

弾性

### easing

イージング(動きの加減速)

</details>

# サンプル

### クリックしたら1秒後右下に移動

<p class="codepen" data-height="500" data-default-tab="html,result" data-slug-hash="YzadQVG" data-user="caleb7023" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/caleb7023/pen/YzadQVG">
  Untitled</a> by caleb7023 (<a href="https://codepen.io/caleb7023">@caleb7023</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

https://animejs.com/documentation/
NCMBでユーザー退会時にユーザー関連データを削除するには（Unity SDK編）

iOSアプリではユーザー退会時にユーザーデータを削除する要件があります（2022年06月30日より）。プライバシーに配慮した要件ですが、アプリ開発者にとっては追加の対応が求められます。

ニフクラ mobile backend（以下NCMB）を使っている場合、ユーザーの退会処理（物理削除）は簡単に行えます。しかし、ユーザーに関連したデータはどう削除したら良いでしょうか。

今回はUnity SDKを使った関連データ削除方法を解説します。

## ユーザーデータの削除

ユーザーデータを削除するのは簡単です。必ずログインした状態で行う必要があります。

```csharp
NCMBUser user = NCMBUser.CurrentUser;
await user.DeleteTaskAsync();
```

ただ、注意して欲しいのは `ユーザーデータの削除は関連データをすべて削除してから` にして欲しいということです。ユーザー関連データを削除できる権限がユーザー自身に紐付いている場合、データを削除すると削除権限がなくなる可能性があります。

## 関連データの検索

### ポインターの場合

大抵の場合、NCMBのポインター機能を使ってユーザーデータを紐付けているかと思います。そこで、データストアを検索して、そのユーザーに関連したデータだけを取得します。今回は例として、ユーザープロフィール `UserProfile` クラスにあるデータを検索する例を紹介します。

```csharp
var query : NCMBQuery<NCMBObject> = NCMBQuery.getQuery(className: "UserProfile");
query.where(field: "user", equalTo: new Dictionary<string, string>(){
	{"__type": "Pointer"},
	{"className": "user"},
	{"objectId": user.objectId},
});
List<NCMBObject> objList = await query.FindTaskAsync();
foreach (NCMBObject obj in objList) {
	await obj.DeleteTaskAsync();
}
```

ポイントは、ポインターを使っているカラムの検索です。 `equalTo('user', user)` のようにしたくなりますが、これでは検索ができませんので注意してください。ポインターの形に合わせて検索を行うことで、該当ユーザーのデータだけを取得できます。後はすべて削除すれば良いでしょう。

### リレーションの場合

関連データをポインターではなく、リレーションで保存している場合もあるかと思います。その場合は次のようになります。

```csharp
NCMBRelation<NCMBObject> relation = user.GetRelation<NCMBObject>("UserProfile");
NCMBQuery<NCMBObject> query = relation.GetQuery();
// 関連データの検索
List<NCMBObject> objList = await query.FindTaskAsync();
foreach (NCMBObject obj in objList) {
	await obj.DeleteTaskAsync();
}
```

### 注意点

UserProfileクラスに入っているデータの編集権限がユーザーにある場合のみ、削除可能です。権限がないと削除はできませんので注意してください。

## デバイストークンの削除

iOSアプリの場合、プッシュ通知を送信する際にデバイストークンを取得しているかも知れません。その場合、このデバイストークンも削除対象になります。

実装としては次のようになります。

```csharp
NCMBInstallation installation = NCMBInstallation.getCurrentInstallation();
await installation.DeleteTaskAsync();
```

## ログアウトを行う

ユーザーデータを削除した後には忘れずにログアウトを行ってください。

```csharp
try {
    NCMBUser.LogOutAsync ();
} catch (NCMBException e) {
    UnityEngine.Debug.Log ("エラー: " + e.ErrorMessage);
}
```

これでログアウト状態になり、ユーザーデータがすべてなくなった状態になります。

## まとめ

今回は物理削除の例を紹介しました。論理削除の場合は別なやり方になるかと思いますので注意してください。

[ドキュメント : 開発者向けドキュメント | ニフクラ mobile backend](https://mbaas.nifcloud.com/doc/current/index.html#/Unity)
UnityのScripting Symbols の設定の仕方 (バッチモードを考慮)

## 先に結論
全部 csc.rsp で定義するのが良さそう。

## Scripting Symbols とは？
Scripting Symbolsと書いたが普段はDefineって呼んでる。

条件付きコンパイルや[Conditional属性](https://docs.microsoft.com/ja-jp/previous-versions/visualstudio/visual-studio-2008/4xssyw96(v=vs.90)?redirectedfrom=MSDN)を使うために必要


```.cs
// DEBUGが定義されている時にしか実行されない。
#if DEBUG
    Console.WriteLine("Debug version");
#endif
```

[C# プリプロセッサディレクティブ](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/preprocessor-directives)

主に以下のような場合に使われる。

- Debug.Logを本番では実行しないようにする
- DebugMenuを本番以外でのみ使えるようにする
- configを環境によって使い分ける

要するに環境変数のようなもの

## Unityでの Scriptiong Symbols の設定の仕方

一般的には Scripting Define Symbols が使われることが多いと思われる。

![ScriptDefines.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/f4517c60-4e37-0aed-80e7-ed7941070adc.png)

Version 2021.3

[Custom Scripting Symbols](https://docs.unity3d.com/Manual/CustomScriptingSymbols.html)

PlayerSettings開いて入力するだけなので楽ではある。

ただし、上記のURLにも書いてあるが、Scripting Define Symbols では手が届きにくいことがある。

それが、バッチビルドを行う時。

> Setting scripting symbols in batch mode
you should not use Editor scripts to set scripting symbols within a batch mode CI server because the scripts will not be recompiled, so they will not be applied.

エディター スクリプトを使用してバッチ モード CI サーバー内でスクリプト シンボルを設定しないでください。スクリプトは再コンパイルされず、適用されません。

でその対策としてさらにその下に`csc.rsp`をAssets直下に作って
中に`-define:UNITY_DEBUG `って書いたらUNITY_DEBUGというScripting Symbolsが定義されると書かれている。

また、

> Note: If you want to modify only global scripting symbols, add them to the Scripting Define Symbols in the Editor via the Player Settings
 window (as described above), because this covers all the compilers. If you choose the .rsp files instead, you need to provide one file for every compiler Unity uses.

と、
Scipting Define Symbols と .rspは併用してねと書かれている。
が、個人的には一箇所に集約できたほうがわかりやすいと思うので、.rspのみを推したい。
なお、Scripting Define Symbols と.rspを両方ある場合には、その両方が使用される。どちらかが上書きはされなかった。

## 具体的な使用方法

```Assets/csc.rsp
-define:DEV

```

ローカルで使うdefineをcsc.rspでつっこんでおく。

```config/define/prod.rsp
-define:PROD

```

別環境で使う.rspファイルを用意しておく

```Makefile
.PHONY: set-define
set-define:
	cp ./config/define/prod.rsp ./Assets/csc.rsp
```

CIビルド時にcsc.rspを上書きする。

なお、上の例ではファイル直指定しているが、複数環境ある場合は環境変数によってコピーをわけたほうがよい。
ubuntu20.04(LTS)から22.04(LTS)にしたら起動しなくなった話

# ubuntu20.04(LTS)から22.04(LTS)にアップグレードしたら起動しなくなった話

## 現象
- ある程度起動は進んでいる様子
- 真っ黒な画面になり、ログイン画面が出ない
- ディスプレイが定期的にちらつく、何かの起動に失敗してリトライしている？
- [Ctl][Alt][F2]〜[F6] で、CUI画面に切り替えができない

## 起動しているのか？
- 他のマシンからsshでログインを試みる -> OK
- 他のマシンからファイル共有(samba) -> OK

## GUI以外は正常に起動しているようだ
- ディスブレイマネージャーは起動しているか？
```
$ sudo systemctl status gdm3 
```
で、確認したところ、これが起動していないことが判明
```
$ sudo systemctl start gdm3 
```
起動のタイミングが合わないせいか、これだけではすぐには反応しないようです
```
$ sudo systemctl restart gdm3 
```
を数回でログイン画面が出ました。やったね。

でも、再起動の度に、他のマシンからログインして`gdm3`を起動しないとログインできないとかありえないよね！

## `gdm3`のリセット
```
$ sudo dpkg-reconfigure gdm3
```

`gdm3`にするか`Lightdm` にするかの二択を迫られるので`gdm3`にして再起動したら、普通にログイン画面が出ました。
【一応、これで解決】

---
---

## ディスプレイマネージャーは起動しているけど・・・って場合

https://qiita.com/R1ngNebula/items/a35af01868b590ac7e89

https://falconblog.org/ubuntu18-04-lts-login-display/

大概はこれらの処置で対応できるみたい。
あるいは、これらの試行後に前述の処置をしたからうまく言ったのかも？
Seeed Studio XIAO ESP32C3をさっそく試してみた

Seeed社のXIAOシリーズにESP32C3のタイプが販売されたので、[スイッチサイエンス](https://www.switch-science.com/catalog/8348/)より購入してさっそく動かしてみました。

※秋月電子通商でも入荷した様です。
[Ｓｅｅｅｄ　Ｓｔｕｄｉｏ　ＸＩＡＯ　ＥＳＰ３２Ｃ３](https://akizukidenshi.com/catalog/g/gM-17454/)

パッケージには、本体（技適マーク付き）とアンテナが付属しています。
他のXIAOシリーズと同様に小型で親指サイズです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/0ceea1ed-112e-af69-db27-bd568da51e2b.png)

裏には、JTAGデバッグ用とバッテリーを接続するためのPADがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/e20589a7-d760-7f6f-2254-2fe8d5d2ff89.png)


USB Type-CケーブルでPCに接続すると仮想シリアルポートとして認識されます。

# Arduino IDEの設定

Arduino IDEで使うのは簡単です。[オフィシャル](https://wiki.seeedstudio.com/XIAO_ESP32C3_Getting_Started/)にもセットアップが書いてありますが、一応手順は以下のとおりです。

1.Arduino IDEのファイル⇒環境設定⇒追加のボードマネージャのURLに以下を追記
`https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/2ad0a385-7395-e0c2-b3ac-ef7b4d7ae2ca.png)

2.ツール⇒ボード⇒ボードマネージャで「esp32」を検索し、esp32をインストール（もしくは最新にアップデート）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/3732bc74-017d-25fc-03c1-db25d4c28d19.png)

3.ツール⇒ボード⇒ESP32 Arduino⇒XIAO_ESP32C3を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/63c58b07-2cff-641f-6008-f9c92aedd71b.png)

4.XIAO ESP32C3をPCに接続し、ツール⇒シリアルポートで、シリアルポートを選択

# 動かしてみる

さてLチカ！と思ったらXIAO ESP32C3上にはLEDが実装されていません。
基板上のLEDはバッテリーチャージ確認用のLEDです。

なので、一旦ボード単体で確認できるWi-Fiスキャンをスケッチを試してみます。
[Raspberry Pi Pico WとM5 ATOM Liteの性能比較](https://qiita.com/jksoft/items/86d61e85320733da70cc)で、行った内容と同じことをやってみます。
ちなみにXIAO ESP32C3のスペックは以下のとおりです。

| 項目 | XIAO ESP32C3 |
| --- | --- |
| CPUクロック | 160MHz |
| CPUコア数 | 1 |
| RAM | 400KB |
| FLASH | 4MB |
| GPIO | 11 |
| その他I/F | ボタンx1<br>リセットボタンx1<br>バッテリーチャージ確認用LED |
| 価格 | 946円 |

スケッチは、[以前の記事](https://qiita.com/jksoft/items/86d61e85320733da70cc)と全く同様のスケッチで試しました。

Wi-Fiを動かすのでアンテナを取り付けました。
このアンテナのコネクタは、そんな耐久性が高くないと思うので、何回もつけたり外したりはしないほうが良いと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/72cc29c3-0b9b-11af-06ca-9590902fb07b.png)


# 動かした結果
特に問題なく動きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/da23ef64-9a68-58ff-ecd9-c6510e6571b4.png)

ちなみに以前のと合わせて消費電流は以下のようになってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/f5477f6c-0abb-0694-ce3f-0ab78a1009c3.png)

だいたい予想通りで、Raspberry Pi Pico Wよりは多く、M5ATOM Liteよりは少ないという感じです。

# 最後に
Seeed Studio XIAO ESP32C3はXIAOシリーズということで、XIAOシリーズ用の拡張ボードが使用できます。

* [Seeed Studio XIAO 拡張ボード](https://www.switch-science.com/catalog/6854/)
* [Seeed Studio XIAO Groveシールド](https://www.switch-science.com/catalog/6687/)

ピンヘッダさえハンダ付けしてしまえば、拡張ボードで、Groveモジュールを繋げて手軽に実験ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/a1bc2571-9053-d94c-928d-53be615e6e42.png)
小型でバッテリー駆動もやりやすいと思うので、そういったものを作る際には活用できそうですね。
【初心者が教える超入門】Pythonによるデータサイエンス②（合計値・代表値の算出）

# はじめに
こんにちは！
技術・プログラミング初心者のTim（てぃむ）です。
自身で学び始めて分かったこと・習得したこと等を初心者ならではの視点でお伝えできればなという思いで発信しております！
記事をご一読いただいた上で、意見/指摘/アドバイス等々いただけるととても嬉しいです！
よろしくお願いいたします。

# 本題
前回は「[要素数、ユニーク数の確認](https://qiita.com/Tim_Beginner/items/a64a7e506842c2648e88)」を行いました。
第2弾の今回は、データ集計を行う際に必要な「合計値・代表値の算出」について書いていこうと思います！
また、随時投稿していきますのでフォロー等していただけるとありがたいです。


# 合計値の算出
## df["カラム名"].sum()
```python
import pandas as pd

#csvファイルの読み込み。test.csvの箇所には各自のcsvファイル名を記入。
df = pd.read_csv('test.csv')

#df["カラム名"].sum()
print("生徒数の合計値", df["生徒数"].sum())
```
出力例
```python
生徒数の合計値 167
```


# 平均値の算出
## df["カラム名"].mean()
```python
import pandas as pd

#csvファイルの読み込み。test.csvの箇所には各自のcsvファイル名を記入。
df = pd.read_csv('test.csv')

#df["カラム名"].mean()
print("数学テストの点数の平均値", df["数学テストの点数"].mean())
```
出力例
```python
数学テストの点数の平均値 64
```


# 中央値の算出
## df["カラム名"].median()
ユニーク数とは、特定の列に含まれる要素の「種類」の数を表します。
```python
import pandas as pd

#csvファイルの読み込み。test.csvの箇所には各自のcsvファイル名を記入。
df = pd.read_csv('test.csv')

#df["カラム名"].median()
print("数学テストの点数の中央値", df["数学テストの点数"].median())
```
出力例
```python
数学テストの点数の中央値 58
```


# 最頻値の算出
## df["カラム名"].mode()[0]
```python
import pandas as pd

#csvファイルの読み込み。test.csvの箇所には各自のcsvファイル名を記入。
df = pd.read_csv('test.csv')

#df["カラム名"].mode()[0]
print("数学テストの点数の最頻値", df["数学テストの点数"].mode()[0])
```
出力例
```python
数学テストの点数の最頻値 56
```


# 特定の列のヒストグラムの描写
## df["カラム名"].hist()
## plt.show()
平均値・中央値・最頻値の中から、どの値を代表値として扱うかを考える際に、ヒストグラムを描写し可視化することで、代表値を選定するための一つの手段にすることができます。
```python
import pandas as pd
import matplotlib.pyplot as plt

#csvファイルの読み込み。test.csvの箇所には各自のcsvファイル名を記入。
df = pd.read_csv('test.csv')

#平均値、中央値、最頻値の確認
print("数学テストの点数の平均値", df["数学テストの点数"].mean())
print("数学テストの点数の中央値", df["数学テストの点数"].median())
print("数学テストの点数の最頻値", df["数学テストの点数"].mode()[0])

#ヒストグラムの描写
df["数学テストの点数"].hist()
plt.show()
```
出力例
```python
数学テストの点数の平均値 64
数学テストの点数の中央値 58
数学テストの点数の最頻値 56
```
![スクリーンショット 2022-08-18 11.59.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782271/d0551071-9b27-2072-bf50-4f5b5159adda.png)
(※画像はイメージ図です。）


# 参考情報
私自身、学習していく中で似たような意味を持っているように感じる「列名」と「カラム名」の違いについて気になったので、こちらに参考記事を掲載しておきます。
[カラム名とは](https://wa3.i-3-i.info/word18541.html "カラム名とは")