OmniAICreator/Qiita-1.07M huggingface dataset:
STM32L010と内部ADCと温度センサーMCP9701でソフトウェアシリアルに出力する。


x MCP9701-E/TO 販売コード 103199

温度を表示

x Mbedのリビジョンは、125

目的
STM32L010(STM32L010F4P6)には、内部温度センサーがついていないので
秋月で売っている安価なMCP9701(約25円)を使って温度を
ソフトウェアシリアルに出力する。

構成
MCP9701-E/TO I-03199
STM32L010F4P6 I-15689



```c++

//温度

#include "mbed.h"

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

//アナログ入力の設定
AnalogIn adc_vbat(A3); //PA_4
//AnalogIn adc_vbat(A0); //767

//Serial pc(USBTX, USBRX); // tx, rx
//Serial pc(SERIAL_TX, SERIAL_RX); //767
//Serial pc(PA_2, PA_3); //010
//Serial pc(PA_9, PA_10); //010

#define UART_DELAY 96 //  1/9600

//仮想シリアルの出力ポート
//DigitalOut TX(PA_9);
DigitalOut TX(PA_2);

char ch_hex_a_b[5];
char *ch_hex_a(int l_num)
{
    int a,b,c;

    b=DVI10(l_num);
    c=l_num-(b*10);
    l_num=b;
    a=DVI10(l_num);
    b=l_num-(a*10);

    ch_hex_a_b[0] = '0' + a;
    ch_hex_a_b[1] = '0' + b;
    ch_hex_a_b[2] = '0' + c;
    ch_hex_a_b[3] = 0;

    return(ch_hex_a_b);
} //ch_hex_a

//仮想シリアルへの一文字出力 9600bps
int pc_putc(char ch) {
        
    TX=1;
    TX=0;//START
    wait_us(UART_DELAY);

    for(int ii=0;ii<8;ii++){
        TX=(ch>>ii)&1;
        wait_us(UART_DELAY);
    }; //for

    TX=1;//Stop
    wait_us(UART_DELAY);
             
    return(0);
    
} //pc_putc

//文字列の表示
int pc_printf(char *str1) {

    int ii = 0; //ループカウンター
    while(str1[ii]!=0){
            
        //一文字出力
        pc_putc(str1[ii]);ii++;
                        
    } //while

    //戻り値
    return(0);
}

int main() {

    //ポートをhiにする 初期化
    TX=1;

    int s;  //ADCの値
    int ii; //温度　小数点以上
    
    //無限ループ
    while(1) {
    
        //adcの読み込み 0から4096
        s = (adc_vbat.read_u16()>>4);
    
//        pc.printf("\r\n -S=%d",s); //767

        //電圧を温度に変換 ex 20.0 -> 200 温度の十倍を出力
        s=((s-496)*27081)>>16;

        //小数点以上と小数点以下を分ける
        ii=DVI10(s);  // 10の桁
        s =(s-(ii*10)); //  1の桁
        
//        pc.printf("\t t=%d %d",ii,s); //767
//        pc.printf("\r\n"); //767 リターン
    
        //温度の小数点以上の表示
        pc_printf(  ch_hex_a(ii)  );
        
        //温度の小数点以下の表示
        ch_hex_a( s*10 );
        ch_hex_a_b[0] = '.';
      //ch_hex_a_b[1] = '0' + s;
        ch_hex_a_b[2] = 'C';      
        pc_printf(  ch_hex_a_b  );
        
        //リターン
        pc_printf(  "\r\n"  );

        //1秒の待ち
        wait_ms(1000);
        
    } //while

} //main

//容量削減
void error(const char* format, ...){}



```
ARFoundation キャラクターを動かす（CharacterController使用）

キャラクターを配置し、CharacterControllerをつける
![96D73364-3880-44A5-83A3-8B428EF2DD4B.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/f00738a4-5084-4400-a193-f95eff44d7f0.jpeg)

MovingCharacter.csを作成する
![06D2F0E1-B9CC-49C5-8F1F-196C582E804D_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/7dba839c-1c6e-2db7-5f4c-c8424f479f0a.jpeg)

下記スクリプトを記述

```C#:MovingCharacter
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MovingCharacter : MonoBehaviour
{
    private CharacterController m_CharacterController;
    private QuerySDMecanimController m_MecanimController;
    private float walkSpeed = 0.2f;
 
    void Start()
    {
        m_CharacterController = GetComponent<CharacterController>();
        m_MecanimController = GetComponent<QuerySDMecanimController>();
    }

    void Update()
    {
        //キャラクターの前方を移動方向とする
        Vector3 moveDirection = transform.forward * walkSpeed * Time.deltaTime;

        //移動した先を basePoint として平面があるか判定する
        Vector3 basePoint = m_CharacterController.center + moveDirection;

        //Ratcast を行う距離
        RaycastHit hitInfo;
        float distance = m_CharacterController.height;

        //キャラクターの下方向に Raycast を行い、平面があるかを確認する
        if (Physics.Raycast (basePoint, -transform.up, out hitInfo, distance))
        {
            //平面があれば、前方への移動+等速落下
            moveDirection += -transform.up * 0.98f * Time.deltaTime;
            m_CharacterController.Move(moveDirection);
            //歩行モーションに変更
            m_MecanimController.ChangeAnimation(
                QuerySDMecanimController.QueryChanSDAnimationType.NORMAL_WALK
                );
        }
        else
        {
            //平面がなければ、等速落下のみ
            moveDirection = -transform.up * 0.98f * Time.deltaTime;
            m_CharacterController.Move(moveDirection);
            //待機モーションに変更
            m_MecanimController.ChangeAnimation(
                QuerySDMecanimController.QueryChanSDAnimationType.NORMAL_IDLE
                );
            //方向転換
            transform.Rotate(new Vector3(0, 60, 0) * Time.deltaTime);
        }
    }
}
```

キャラクターにMovingCharacter.csをつける
![4F71A786-6DD3-40D4-85B7-F025A3E6067D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/3127aad8-bdaa-31b5-ab78-6f4e0c4814f7.jpeg)

キャラクターをプレハブにする。　AR Session OriginのRaycast.csにキャラクタープレハブをアタッチする
![5D2EB2D1-0FD4-41E7-A56E-2938A6B1E7AB.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/b1db1375-a198-85e9-3a59-d531135911d8.jpeg)
pillowを使って文字列を改行しながら画像へ挿入する

## 1. 本記事について
pillowを使って画像に文字を挿入するときに、四角形のスペースに上手く収まる
フォントサイズの計算＋改行を良い塩梅でやってくれるコードです。

※実行結果イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/4a054d56-de76-dad0-3974-3635700e68da.png)

## 2. コード
```python:insert_text_to_image.py
# coding:utf-8

from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw
import math

# 吹き出しのサイズ
canbas_height = 130
canbas_width = 350
# 吹き出しの余白
margin = 50
# 文字の挿入位置
height = 203
width = 47
# 行間
space_between_lines = 3
# フォント情報
font_color = (22, 22, 22)
font_path = "/hoge/hoge.ttf"
# 元画像ファイルのパス
base_image_path = "/hoge/base.png"
# 挿入するテキスト
base_text ="おはようございます"
# 保存する画像ファイルのパス
save_image_path = "/hoge/result.png"


# フォントサイズ計算
def culculate_text_size(text):
    text_length = len(text)
    canbas_area_size = (canbas_height - margin)*(canbas_width - margin)
    font_size = math.floor(math.sqrt(canbas_area_size / text_length))

    return font_size

# 改行する単位でテキストをリスト化
def split_text(text, font_size):
    text_length = len(text)
    text_in_one_line = canbas_width // font_size
    text_list = [text[i: i + text_in_one_line] for i in range(0, len(text), text_in_one_line)]

    return text_list

# 画像の指定位置にテキスト追加
def add_text_to_image(img, text, font_size, height):
    position = (width, height)
    font = ImageFont.truetype(font_path, font_size)
    draw = ImageDraw.Draw(img)

    draw.text(position, text, font_color, font=font)

    return img

# テキストのリストを画像に挿入
def insert_split_texts(image, split_text, font_size, height):
    for texts in split_text:
        img = add_text_to_image(image, texts, font_size, height)
        height += (font_size)

    return img

def main():
    base_image = Image.open(base_image_path).copy()
    font_size = culculate_text_size(base_text)
    insert_text = split_text(base_text, font_size)
    img = insert_split_texts(base_image, insert_text, font_size, height)
    img.save(save_image_path)

if __name__ == "__main__":
    main()

```
未経験からwebエンジニアになって一年近く経って感じたこと３点

##１点目　個人で開発するのと仕事で開発するとでは全然違う
こんなの言われないでも分かるわ！と言われてしまいそうな１点目ですが、全然違います。
何が違うのかと言えば大まかにいうと責任感だと思います。個人開発の範囲内だと生活がかかってるモチベでやってる人は限りなく０に近いと思っていて、そういった意識で出来なければサービスの質は下がっていきます。その点、仕事となれば妥協は許されないので決められたスケジュール感で比重を設けてできる限りの高パフォーマンスを残すために尽力します。
練習と試合とでは経験値が全然違うのと似ていますね。私サッカーやっていたのでサッカーで例えると、いくらボールタッチやリフティング、シュート練習をしても試合で結果を残せるとは限りません。ただ、練習をしないと試合では、いつも以上の結果は出ません。余談ですが、アジア歴代最高選手と呼び声が高い孫興民選手は、幼少期の頃から中学校までは基礎トレーニングを徹底して一切試合をしなかったみたいですね。ひたすら基礎力をつけていって見える世界もあるんだなと思います。

##２点目　技術力も大事だがサービスを考えることはもっと重要
当たり前ですが、なんのために開発をしているかって問われたらサービスがより良くなるために開発をしています。もっと言えばつくったものが使われていき愛されるサービスになっていくことがゴールです。この意識をしなければ技術力に偏ってしまって肝心なところが抜け落ちてしまう可能性が出てきてしまいます。メガドライブみたいな感じになっちゃいます。凄いなーと感じるが誰も使わないようなサービスは進化の一歩になるかもしれないが誰かが使うを想定した開発をしない限りでは、誰も使ってくれないと思います。サッカーで例えると、ケルロンという選手がいまして、その選手は「アシカドリブル」と呼ばれる頭でリフティングしてドリブルすることが特徴な選手でした。凄さがあり、良い選手ではありましたがワールドクラスの選手になったかと言われるとなってないかなと思います。独特な個性、質が高くても時代にそぐわないと活きないのがサービスだと思ってます。

##３点目　フロントエンドはめっちゃ大事
私はバックエンド専門寄りの仕事をしていますが、フロントエンドめっちゃ得意だったら捗るなということが多々あります。バックエンドも少なからずはフロントに触れる人もいると思いますのでバックエンド疎かになってしまったら本末転倒ですが「俺はバックエンド専門だから関係ねーし」とならずにデザインやUIに興味を持つことは大事だと感じました。サッカーで例えると、全ポジション経験しといた方が、相手の嫌なところが分かるよって部分に似ているかもしれませんね。バックがDFでフロントがFWだったらFWの仕事を知っとけばDFの時に役立ちます。ただ忘れて欲しくないのは、まずはどっちかに焦点を定めて一定レベルを満たさないと試合には出れません。試合に出れないで他のポジションの練習していたらどんどん遠回りしていきますよね。近道近道といっていき、自分が絶対に必要だと思ったら手を出してみてばいいのではないでしょうか。人の話を聞いて、自分に問いて、多数ある選択肢の中からより良い答えを導き出すことは難しいことですが一日の中で何回も行っていることなので自分に自信を持ちましょう。
連想配列で使うforeach

連想配列を利用することで繰り返し表示することができる。

<pre>
<?php
// $fruits = ['りんご','ぶどう','レモン'];
// 果物の名前は曜日のように順番がある値ではない
// 連想配列がその問題を解消する
$fruits = [
    'apple' => 'りんご',
    'grape' => 'ぶどう',
    'lemon' => 'レモン',
    'tomato' => 'トマト',
    'peach' => 'もも'
];

$fruits = [
    'apple' => 'りんご',
    'grape' => 'ぶどう',
    'lemon' => 'レモン',
    'tomato' => 'トマト',
    'peach' => 'もも'
];
//りんご、ぶどうetcの右側の日本語だけを取り出す
foreach($fruits as $val){
    print($val . "\n");
}

//インデックスごと取り出すときは
foreach($fruits as $english => $japanese){
    print($english .  ':' . $japanese . "\n");
}
//"$english"と"$japanese"の部分は、様々な値に変更することが可能。
//例えば、"$val"や"item_name"など変更するものによる
?>
</pre>
MacBook Proでトリプルディスプレイ環境にするために知っておきたかったこと


**なるべくシンプルな配線で**トリプルディスプレイ環境を構築した時に、思ったよりケーブル周りで悩んだので、記録としてまとめておきたいと思います。
OSや使っている端末によって差があるみたいなので、自分の環境にあったものを探してください。

お金がある人はthunderboldのドックを買えば大体解決します(３万円前後)

## 知っておきたかったこと
- **ハブでUSB Type-Cは増やせない**<br>
1つのUSB Type-C端子から2つのUSB Type-Cに分岐させることは難しいです<br>
給電用、データ用などに分岐することはできます<br> 
詳しい理由は[こちら](https://jp.quora.com/USB-Type-C%E3%81%8B%E3%82%89%E5%A4%9A%E6%95%B0%E3%81%AEUSB-Type-C%E3%81%AB%E3%81%A4%E3%81%AA%E3%81%90%E3%83%8F%E3%83%96%E3%81%8C%E7%84%A1%E3%81%84%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%97%E3%82%87)
- **ハブでは1つのUSB Type-C端子から複数のモニタに拡張出力はできない**
    - ミラーリングや同じ画面を拡張ならできます
    - 高価なドックだとできるものもあります
- **いい感じのハブはそれだけで電気を食う**
    - 電源が弱いものだと急速充電できなかったりするので、注意してください
    - ものによっては電源を繋いでいないと使えないものもあるみたいです
- **Thunderbolt 3とUSB Type-Cは違う**
    - Thunderbolt 3は通信の規格の1つ、USB Type-Cはコネクタの規格の1つです
    - Thunderboltだとできないみたいなこともあるので、MacBookユーザーは要確認

## 筆者の環境
- MacBook Pro (13-inch, 2019, Four Thunderbolt 3 ports)
- [BenQ アイケアモニター GW2480T](https://www.amazon.co.jp/gp/product/B07T2YLSCX/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1)
- LGのモニタ 21.5インチ
- [有線キーボード](https://dygma.com/products/dygma-raise)
- Magic Trackpad 2
- アプリ開発でandroid端末やiPhone端末を繋ぐことがしばしば

モニタやキーボードを1つずつ繋いでもいいのですが、アプリ開発時に接続口が足りなくなる問題が発生していました。
また、在宅勤務のため、自分のPCと会社用のPCの切り替えがとても面倒でした（会社のPCもMacBook Proです）。

## 最終的に買ったもの
https://www.amazon.co.jp/gp/product/B07KJWYQJW/

>データ転送、microSD＆SDカードスロット、4K 30Hz HDMIポートを搭載し、PD対応によるフルスピード充電が可能なUSB-Cハブ(商品の説明より引用)

1つの端末に以下のポートが接続可能です。

- USB 3.0*2
- USB C*2
- microSD
- SD
- HDMI

### 選んだ理由 
- 価格がそこそこ(5,999円)
- hdmi、給電、usb接続が1つのハブでできる
- 安定のAnker

理想は1つのケーブルで完了させることでしたが、諦めて以下のような構成になりました。

```
MacBook Pro
├ anker（Type-C）
|  ├ LGのモニタ（HDMI）
|  ├ 有線キーボード（USB 3.0）
|  └ 電源（Type-C）
|
└ BenQモニタ（Type-C）
```

## 他に候補にあがったものとダメだった理由
以下の製品はどれもいいなと思ったのですが、自分の端末や環境に合わなかったため断念しました。
### Anker PowerExpand 8-in-1 USB-C PD
https://www.amazon.co.jp/dp/B0874J3Y9T/ref=emc_b_5_t

- HDMI接続口は2つあるが、macは拡張できない
- イーサネットはいらない

### Satechi アルミニウム Type-C デュアル マルチメディア アダプター
https://www.amazon.co.jp/Satechi-%E3%83%9E%E3%83%AB%E3%83%81%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2-%E3%82%AE%E3%82%AC%E3%83%93%E3%83%83%E3%83%88%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%8D%E3%83%83%E3%83%88-%E3%82%AB%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%80%E3%83%BC-MacBook/dp/B07RD8CG3W

- 結局2つのポートを使用する
- ケーブルの長さが短いためハブが浮く（PCスタンドを使っているため）
- 値段が高い

### Satechi Type-C アルミニウム Proハブ

https://www.amazon.co.jp/Satechi-Macbook-15%E3%82%A4%E3%83%B3%E3%83%81%E5%AF%BE%E5%BF%9C-Thunderbolt-3-0%E3%83%9D%E3%83%BC%E3%83%88%C3%972/dp/B06XRVX3XM

- Type-Cで映像出力ができない
- ケーブルをたくさんつけると、重さでmac側の接続口が傷みそう
- ケーブルをつけていない状態は一番スタイリッシュだが、ケーブルをつけた時に端末周りにケーブルがごちゃつきそう
CloudWatchEvents+lambda+boto3でサーバー代を節約する

#目的→サーバー代の節約

http://myhero2.s3-website-us-west-2.amazonaws.com
Angularのチュートリアルを参考に作成したポートフォリオです。
バックエンドでSpringBoot(EC2)とKeyCloak(FARGATE)とMySQLが動いています。
特にFARGATEは個人で運用する分にはサーバ代が高い為、
CloudWatchEvents+lambdaで決まった時間にタスクをストップさせる構成を実装します。


#lambdaの作成と設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/98c2a448-de5b-6d34-f0a6-90dfcb0cfef7.png)

AWS Lambdaのコンソール画面より関数の作成をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/136e4532-7d0d-8d2c-9f05-185edee7021b.png)

1.lambda関数名を設定します。

2.今回はpythonのAWSSDK(boto3)を使用する為、「Python 3.8」を選択します。

3.関数の作成をクリックします。

これで関数は作成できましたが、デフォルトの実行ロールではECSのサービスの設定をアップデートさせることができません。以下の手順を参考にデフォルトのロールに権限を付与します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/fe34b8ef-997e-5002-2658-f97a35624086.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/0925ef9a-f8f6-a72e-45c6-200a73d3d9b7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/e220831f-9693-70e5-c882-97268babac30.png)


FullAccessのポリシーをアタッチしてしまうのはセキリティ上、ベストプラクティスではない場合がありますが、今回は個人のアカウントなのでFullAccessのポリシーをアタッチします。

#lambdaのソースコード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/54265bb9-f0b7-105f-ee51-8cf2bdfec988.png)


```python:example.py
def lambda_handler(event, context):
   
     #desiredcountを0にする
     client = boto3.client('ecs')
     response = client.update_service(
     cluster='myk',
     service='ecs-kck-myk',
     desiredCount=0,
     )

     #停止するために必要なtaskArnを取得
     response = client.list_tasks(
     cluster='myk',
     launchType='FARGATE'
     )
     
     taskArns=response["taskArns"]
     
     #タスクを停止
     for task in taskArns:
      response = client.stop_task(
      cluster='myk',
      task=task,
      )
```

desiredCountを0にすることでECSのサービス内のタスクをストップさせた時、自動でタスクが開始されるのを防ぎます。今回は特にサービスなどを指定せずにクラスター内のtaskArnを全て取得して、クラスター内の全てのタスクを停止させています。




#CloudWatchEventsでルールを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/8e1b9323-ce29-49d0-3f05-2e42e919a65e.png)


AWSコンソールよりCloudWatchEventsの画面を開き、ルールの作成をクリックします。



#CloudWatchEventsの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/78190f88-70bd-62bc-bbdc-11497d3e9a43.png)

1.スケジュールをクリック

2.Cron式をクリックしてlambdaを実行したい時間を入力
今回は平日の18:00にlambdaを実行させたい為、
0 3 ? * TUE-SAT *
と入力します。GMTとJSTの９時間の時差を考慮することに注意します。
Cron式についてはこちらに詳しく書いてあります。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html

3.ターゲットの選択より実行したいlambda関数を選択します。

4.設定の詳細をクリックします。後はルールの名前を決めてルールを作成します。

CloudWatchEvents側での設定は以上です。

これで、指定された時間にlambda関数が実行されます。

今回は決まった時間にタスクを停止させる構成を実装をしましたが、同様にしてタスクを開始させる構成を実装することで、決まった時間のみにポートフォリオを公開することができ、サーバー代を節約できます！
weblogic14cのデプロイエラーについて

試す

【beans.xmlをWEB-INFに作る】
https://oray5b4scxdkttslnbc7ma23zi-adv7ofecxzh2qqi-stackoverflow-com.translate.goog/questions/52866188/javax-faces-facesexception-unable-to-find-cdi-beanmanager

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
    http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
    version="2.0" bean-discovery-mode="annotated">
</beans>


【pom.xmlを編集する】
https://qiita.com/ponsuke0531/items/074b459f5d5b7c69282c

C:\Oracle\Middleware\Oracle_Home\wlserver\plugins\maven\com\oracle\weblogic\xmlbeans\2.6.0
xmlbeans-2.6.0.pom
さくらインターネットのサーバーでAWSのSESからメールを送信する設定

## 本文について

自分でやっているサイトにSESを導入して新規登録ユーザーにメールが届くシステムの導入をするため、やったAWSのSESの設定方法を記載しておきます。（備忘録程度に）

難しくはないので、未経験でポートフォリオを作成している方にも導入をおすすめします。

## AWSの設定

まずは、AWSのサービス一覧から「Amazon Simple Email Service（以下、SES）」を選択し、SESのホームへ
そして、サイドメニューから「Domains」をクリック

![スクリーンショット 2021-05-09 23.53.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454305/45e58876-e403-66dc-d1a8-cbc32c122fc2.png)

Domainsの画面から「Verify a New Domain」を選択

![スクリーンショット 2021-05-09 23.56.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454305/483d5af7-d77c-96d1-9976-78771632dbc1.png)

ドメインの登録をするため、表示されるモーダルの「Domain」に使用するドメインの入力と、「Generate KDIM Settings」にチェックをして「Verify This Domain」」をクリック

![スクリーンショット 2021-05-09 23.59.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454305/4bfe40b4-651e-ea6f-5f70-f10a04d1622d.png)

そしたら、ドメインのゾーン設定に必要な内容が表示される

![スクリーンショット 2021-05-10 0.04.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454305/6a372896-6c5f-cd70-1d64-9e34692ebfca.png)


## さくらインターネットの設定

ゾーンの設定をするため、会員メニューのドメインから「管理ドメインとネームサーバの一覧」を選択し、登録したドメインの「ゾーン編集」のボタンをクリック

![スクリーンショット 2021-05-10 0.21.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454305/42e459b9-007d-50c5-a7a4-9c5d3a395ceb.png)

黒色のところが登録された内容

先ほど表示された内容を全て登録を行う
![スクリーンショット 2021-05-10 0.26.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454305/42cbc0f7-4e81-d459-0eef-0445671e3fdc.png)


## AWSでの確認

設定が完了してから数時間は下記のような状態です。
![スクリーンショット 2021-05-10 0.34.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454305/01daa70a-e8f3-216b-eb95-fe2721024e58.png)

数時間後には、ドメインの検証が完了して下記のようになっていれば設定の完了になります。
![スクリーンショット 2021-05-10 0.35.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454305/414c423b-a60a-10d4-7f07-a5c7647d00ac.png)


次回は、メールアドレスの設定とCakephp4でメール送信までの方法を投稿しようと思います。
→<a href="https://qiita.com/Nash-BETA/items/ea97fd9c4c81ea5c2c50">こちらに投稿しました。</a>
コの業界を目指す大学生へ(前編)

<h2>思えば四半世紀</h2>
「コの業界」と書かれて、<a href="http://www.pro.or.jp/~fuji/">この方</a>をすぐに思い出せる人がQiitaにどれだけいらっしゃるか、もうそれくらいこの業界いるのかとこの記事を書くときにちょっぴり感慨にふけっていました。

<h2>就職活動</h2>
この記事を書こうと思ったのは、知人のご息女が大学3年になり、来年は就職活動となるのでIT業界はどうなのかということを聞かれたことがきっかけです。自分が禄を食む業界に、若い世代が入ってきたいと希望されるのは嬉しい限りではありますが、果たして業界の特徴や他の業界との違いを正確に伝えることができるのか？その棚卸しをしようかというのが動機となります。

筆者はコの業界以外には
・建設業(いわゆる土方)
・建築業(大工)
・飲食業
・外資系保険業
・メーカーの営業
・出版業
といささか脈絡のない業界を渡り歩いておりまして、他業種についても多少なりとも知っていることもあって、比較もできるだろうとは思っております。

プログラムを書くときのような、事前に設計をするのではなく、思ったままに書き連ねていこうと思います。ここは違う、こんなこともあるよというのがありましたらご指摘いただけますと幸いです。

<h2>技術は進歩すれども・・・</h2>
筆者がIT業界に入ったのは1995年で、Windows95やLinuxが世に出た頃です。その頃と比べてみると、ハードウェアもOSも言語も何もかも飛躍的に進歩をしています。しかし、業界の中身はそれらの進歩と比べると変わっていないと思う次第です。せいぜい、<b>定年が35歳でなくなった</b>くらいですかね。さすがに今はそんな事言われないですが、当時転職を考えていた筆者に35歳までしか働けない業界に将来はあるのかと真顔で言っている人は確かにいました。

<h2>IT業界の特徴</h2>
それでは長所も短所も含めコの業界の特徴として筆者が思ったことを書いていきます。
<h3>男女平等◎</h3>
今まで経験した業界と比べると、IT業界は男女平等に働ける職場だと思います。女子だからと言って不当に不利に扱われたりすることは、私の所属していた企業、取引していた企業ではありませんでした。ただ、納期直前やトラブル対応の缶詰作業にも男女平等は適用されます。女子だから早く帰ってもいいというのもありません。徹夜仕事がいいのか悪いのかについては別の話になります。男女平等については、建築、建築業、あるいは飲食業の方が遅れています。そういう意味では勧められる業界ということになります。
<h3>セクハラ・パワハラ、不適切な男女関係◎</h3>
皆無であるとはいいませんし、あってはならないものではありますが、比較的この手の問題は少ないと言えます。これが一番多いのは飲食業でしたね。
<h3>労働時間 ×</h3>
だいぶ改善されたとは思いますが、それでもまだ長いです。ただ、長時間労働といってもいろいろで、リリース直前やトラブル対応でエンドレスでやらされるマイナスなこともありますし、逆にプログラム書き始めたらノリノリで気がついたら朝になっていたというプラスのこともあります。いずれにしても、残業ゼロの月ということはまずありません。なので、仕事はそこそこで、プライベートを最大限に充実させたいという人はあまり向かないと思います。

--追記--
Web系では残業がないところもあるようですね。これは業界というより扱い分野ということになりますでしょうか。Web系はこれからも将来性を見込めるのでいいのですが、残業の有無を選択のキーとするのはどうなのかな・・・とは思います。

<h3>教育体制 ×</h3>
一部大手を除けばこれも業界全体でみれば充実しているとは言えません。大きな理由としては
・人が足りない
・実力差が大きい(後述)
があります。教育、研修として教えるのではなくさっさと現場に入れてやりながら教えるというのが特徴です。ですので、新卒者といえども全く知識ゼロというのはキツイかなと思われます。また、自分から積極的に知識を吸収していこうとする人でないと、これもまたキツイかと思います。
<h3>実力主義 ◎</h3>
IT業界は男女差もなく、また実力主義でもあります。実力(とは抽象的な表現ですが)があれば、やりたいことができます。そのためには自ら積極的に学ぶ必要があります。積極的に学んでそれができるようになれば、IT業界は必ずやらせてもらえます。なぜなら人がいないから。もちろん、多くの人が取り組んでいるものに関しては競争が起こります。そうなると実務経験が少ないと振り落とされることがありますが、未来永劫チャンスが回ってこないということはありません。
<h3>外的要因から受ける影響◎</h3>
今はコロナ禍で、緊急事態宣言が頻繁に出されます。飲食業は営業自粛、休業要請などで塗炭の苦しみを味あわされています。飲食業以外でも、外出自粛などで通常通り業務ができない業種も多いです。しかし、IT業界はコロナの影響はほとんど受けていないでしょう。もともとずっとテレワークだった人も多いですし、そうでなかったとしてもテレワークとの親和性も高いので、通勤自粛となってもスムーズに移行できました。他の業界ですと、長引くテレワークで鬱々と過ごしている人も多いのですが、IT業界に関してはこのままずっとテレワークを続けたいという人も多いです。通勤をしなくていいというのは時間も体力も節約できて、本当にありがたいものです。また、通勤しなければならない会社だと、例えば子供ができたら、小さい間は育休などを考えなければいけないですが、テレワークができるなら、育休を取らずとも時短で対応することもできます。休んでしまうとブランクができますが、それも避けられます。

(続く)
Swift5.4リリース

#この記事はなに
Swift.orgのブログに投稿された[Swift5.4のリリース](https://swift.org/blog/swift-5-4-released/)について、個人的に興味深い部分を読んでみました。

#アップデート情報
Swift5.4に含まれる新しい言語機能

- 関数、添え字、イニシャライザが複数の可変パラメータをサポート（SE-0284）
- 暗黙的なメンバー構文の拡張（SE-0287）
- リザルトビルダー（SE-0289）
- ローカル関数が、オーバーロードをサポート
- ローカル変数のプロパティラッパー

新しい並列実行モデルでは、識別子として`await`を修飾せずに使用した場合に、コンパイラは警告と修正を行うようになりました。これらの識別子は、SE-0296の一部としてSwiftの将来のバージョンにおいて、`await`キーワードとして解釈されます。

#ランタイム性能とコードサイズの改善
Swift5.4では、以前の搜索結果をキャッシュするハッシュテーブルの実装が高速化されたおかげで、実行時のプロトコル適合性チェックが大幅に高速化されました。特に、一般的な実行時の`as?`と`as!`のキャスト操作が高速化されています。

さらに、連続した配列の変更は、冗長な一意性チェックを回避します。

````Swift:
func foo(_ a: inout [Int]) {
  a[0] = 1    // 必須のcopy-on-writeチェックが発生するところ
  a[1] = 2    // ここで、余計なCoWチェックは行わない
}
````

他にも、さまざまなパフォーマンスが改善されました。

- 文字列の補間が、より積極的に定数化
- 特に関数の`inout`引数や`while`ループにおいて、`retain`/`release`の呼び出しを削減
- 標準ライブラリのジェネリックなメタデータがコンパイル時に特殊化され、ダーティメモリの使用量が減り、パフォーマンスを向上


#コードの補間
大きな関数のボディにおいて、コード補完のパフォーマンスはより速くなりました。
swift-package-managerリポジトリ内の一例では、そのファイルで繰り返される呼び出しは、Swift5.4の`self.`のコード補完時間が、Swift5.3と比較して20mから5ms、4倍も速くなっています。

コード補完は、「エラーを含む式」や「文脈が不足している曖昧な式」でも、より信頼できるようになりました。
例を示します。

````Swift:
func test(a: Int, b: String) -> Int { ... }
func test(a: Int, b: Int) -> String { ... }
func test(a: (Int, Int) -> Int) -> Int { ... }
````

上記のコードに対するコード補完は、以下のように動作するようになりました。

- `test( ... ).prefix(3)`の後にコード補完を呼び出すと、`String`のメンバーを示唆します。
- `test(a: 2)`の後にコード補完を実行すると、`Int`およびString`のメンバーを示唆します。
- 次のブロックで`$0.`の後にコード補完を実行すると、`Int:test { $0. }`のメンバーを示唆します。

#型チェッカー
Swift5.4では、`a + b + (2 * c)`のような「連結された式」に対する型チェックのパフォーマンスが向上しています。
次のような例を考えてみます。

````Swift:
struct S { var s: String? }

func test(_ a: [S]) {
   _ = a.reduce("") {
     ($0 + "," + ($1.s ?? "")) + ($1.s ?? "") + ($1.s ?? "")
   }
}
````

これまで、このコードの型チェックはタイムアウトになっていましたが、100ミリ秒以内に完了するようになりました。

さらに、他のリテラル式を含む配列リテラルをネストした場合のパフォーマンスも向上しました。
例えば、以下のような無効なコードに対して、以前はコンパイラが「複雑すぎて時間内に解決できない」というメッセージを表示していました。

````Swift:
enum E {
  case first
  case second
  case third
}

let dictionary = [
  .first:  [0, 1, 2, 3, 4, 5, 6, 7],
  .second: [8, 9, 10, 11, 12, 13, 14, 15],
  .third:  [16, 17, 18, 19, 20, 21, 22, 23],
]
````

Swift5.4では、このコードが無効であると診断され、正確なエラーメッセージを表示するようになりました。

````
error: reference to member 'first' cannot be resolved without a contextual type
.first : [ 0, 1, 2, 3, 4, 5, 6, 7],
 ^
````
````
error: reference to member 'second' cannot be resolved without a contextual type
 .second : [ 8, 9, 10, 11, 12, 13, 14, 15],
 ^
````
````
error: reference to member 'third' cannot be resolved without a contextual type
 .third : [16, 17, 18, 19, 20, 21, 22, 23],
 ^
````

型チェッカーは、無効なステートメント（無効な`return`ステートメントなど）、無効な宣言の参照、パターンマッチのエラーなど、リザルトビルダーの診断機能が向上しました。
例えば、以下のようなものです。

````Swift:
import SwiftUI

struct ContentView: View {
  @State private var condition = false

  var body: some View {
    Group {
      if condition {
        Text("Hello, World!")
          .frame(width: 300)
      } else {
        return Text("Hello, World!")
      }
    }
  }
}
````

このコードの場合、型チェッカーは次のようなエラーと同時に、リザルトビルダーを適用するために`return`を削除する修正案も報告します。

````
error: cannot use explicit 'return' statement in the body of result builder 'SceneBuilder'
 return Text("Hello, World!")
 ^
````
Ubuntu20.04 でのネットワーク 複数IP設定

##Ubuntu20.04 で、1つのLANに複数のIPを設定した時の作業メモ

#####私の初期状態では､以下のファイルを編集

~~~
$sudo vi /etc/netplan/00-installer-config.yaml
~~~



#####以下の様な記述で､上手くいきました。

~~~
# This is the network config written by 'subiquity'
network:
  ethernets:
    eth0:
      addresses: [192.168.0.3/24, 172.16.1.1/24]
      gateway4: 192.168.0.254
      nameservers:
        addresses: [8.8.8.8, 10.10.10.10, 20.20.20.20]
        search:
        - token.co.jp
  version: 2
~~~
address:" "←ここに半角が必要？


#####以下のコマンドで、設定を反映

~~~
$sudo netplan apply
~~~
[Swift5] User Defined Runtime Attributesを使用して、Storyboardからプロパティの初期値を設定してみた

#はじめに
UIを設定するプロパティの初期値をStoryboardから設定してみたので、備忘録としてその手順を記します。

#環境
[Xcode] Version 12.4
[Swift] Version 5.3.2

#実装手順
Storyboardの[`Identity Inspector`]タブの`User Defined Runtime Attributes`に「`+`」を押して設定するだけです。
「Key Path」にプロパティ名を、「Type」には今回はColorを、「Value」には設定したい色を入れます。
<img width="300" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667697/97d31187-3a70-b211-b8f4-8534e1647d2c.png">
但し、コードでプロパティを定義するときに、`@objc dynamic`をつける必要があります。
Objective-CのクラスやメソッドをSwiftでも使えるようにするためのキーワードのようです。

```Swift:FirstViewController
import UIKit

final class FirstViewController: UIViewController {
    
    @IBOutlet private weak var centerLabel: UILabel!
    //ラベルの背景色を設定する変数に対して、StoryboardからColorを設定する
    @objc
    dynamic var labelBackgroundColor = UIColor(red: 0.1, green: 0.2, blue: 0.6, alpha: 1.0)

    override func viewDidLoad() {
        super.viewDidLoad()
        //ラベルの背景色を設定したColorにする
        centerLabel.backgroundColor = labelBackgroundColor
   
    }
}
```
今のところ、Colorを含めて11種類 (Boolean, Number, String, Localized String, Point, Rect, Range, Color, Image, Nil)のTypeを指定できるので、色々試してみたいと思います。

#参考文献
この記事は以下の情報を参考にしました。
- [dynamic var を理解するための極意 - swift](https://off.tokyo/blog/dynamic-var-%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E6%A5%B5%E6%84%8F-swift/)
- [Swift4でUser Defined Runtime Attributesがうまく効かないところがあった](https://qiita.com/ngo275/items/25132d5471d949fb9c41)
【Java 】サイコロを作成せよ

```java
class Saicoro {
	public static void main(String[] args) {
		double rand = Math.random() * 6 + 1;
    System.out.println("サイコロの目は" + (int)rand + "です");
  }
}
```


コンパイル&実行コマンド↓

% 【java saicoro.java】
2021年5月版 GCP入門 ～プロジェクト編～

#0 目次
[1.前回のあらすじ](#1-前回のあらすじ)
[2.プロジェクトってなんぞ](#2-プロジェクトってなんぞ)
[3.作らないといけないなら作ろう](#3-作らないといけないなら作ろう)
[4.作ったけどこれからどうするの](#4-作ったけどこれからどうするの)
[5.次回予定](#5-次回予定)
[6.参考](#6-参考)

#1 前回のあらすじ
GCPに登録した。以上。
https://qiita.com/kekouhei/items/10835701ba42476e4a12
の続きです。GCPのアカウントを持っていない方はこちらの記事を参考にご登録お願いします。

はじめましての方ははじめまして、けこです。
今回はプロジェクトって何？というとこ。学習に役立つリソースについて紹介します。

#2 プロジェクトってなんぞ
登録したてほやほやアカウントでGCPのホーム画面に行くと、プロジェクトを作れ！と言われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123137/1623dff4-2ed4-a71b-9111-3a6cfc1b0a3d.png)

プロジェクトってなんぞや？となります。私はなりました。

Google Cloudのドキュメントによると
>Google Cloud プロジェクトは、API の管理、課金の有効化、共同編集者の追加と削除、Google Cloud リソースに対する権限の管理など、すべての Google Cloud サービスの作成、有効化、使用の基礎となります。
https://cloud.google.com/resource-manager/docs/creating-managing-projects?hl=ja&visit_id=637561666035528891-980323937&rd=1

プロジェクトにはGCPのどのサービスを使うか、いくら課金されるかといった情報が記録されています。GCPを利用するためにはプロジェクトを作る必要があります。1サービス1プロジェクトで使うこともnサービス1プロジェクトで作ることもできますが、1対1にしておくのが無難でしょう。

プロジェクトは作るのはただです。

#3 作らないといけないなら作ろう
プロジェクトを作らないと利用を開始できないなら、作るしかありません。
”プロジェクトを作成”ボタンを押しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123137/8a5d3206-8d08-f05e-c599-9a6801588a3e.png)

このような画面になると思います。プロジェクト名は一意なので他人が使ったものは使えません。早いもの勝ちです。
これから作るサービスの名前でもいいし、思いつかなければMy Projectのままで構いません。変更できないことだけ注意してください。

#4 作ったけどこれからどうするの
少し待ってこのような画面がでてくれば完了です。おめでとうございます。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123137/0f57236a-fe1b-196b-5130-181474dbee65.png)

プロジェクト名/ID/番号についてはどこかに控えておきましょう。もしgoogleに問い合わせをする機会があれば必要になる可能性があります。

軽くこの画面についても説明しておきましょう。

赤枠、黄色枠、青枠のところに注目してください。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123137/162139d8-c030-9b52-66f0-57403ca29664.png)

赤枠の部分にはサイドバーがあります。GCPの推しているサービスやプロジェクトの設定といろいろなことができますが、とりあえずは無視しましょう。
黄色枠のところにはプロジェクト名が記されています。ここでプロジェクトを切り替えることができます。
青枠にはこのプロジェクトの情報が書かれています。後々使用しているAPIやリクエスト数が書かれます。見覚えのないAPIが登録されていたり、APIのリクエスト数が異常に跳ね上がっている場合は何かが起きています。Googleに問い合わせをしましょう。

ここからどうすればいいか、まずはGCPで何をしたいかについてもう一度考えてみましょう。
VMを使いたいなら Compute Engine
機械学習なら Vision API
楽してWebアプリを作りたいなら App Engine, Firebase

というふうに、ここから先は作りたいものに応じたAPIを利用していくことになります。

#5 次回予定
ここまで説明しておいて終わり、なんてことはありません。
次回はGCPのAPIについて理解するために、Compute Engineを使ったLinux VMを作る方法について解説します。

最後までお付き合いいただきありがとうございました。

#6 参考
- https://cloud.google.com/docs/overview?hl=ja Google Cloudの概要
- https://cloud.google.com/resource-manager/docs/creating-managing-projects?hl=ja&visit_id=637561666035528891-980323937&rd=1 プロジェクトの作成と管理
Cookieとローカルストレージ(Local Storage)の違いを言えますか

||Cookie|LocalStorage|SessionStorage|
|-|-|-|-|
|容量|4 KB|5-10 MB(ブラウザ依存)|5 MB|
|影響範囲|全タブ|全タブ|作業中のタブ|
|有効期限|アプリケーション側で設定した値|なし(アプリーション側で削除する必要がある)|タブを閉じるまで|
|サーバー送信のタイミング|リクエスト毎|任意のタイミング|任意のタイミング|
|保存場所|ブラウザおよびサーバー|ブラウザのみ|ブラウザのみ|

一言で言えば、Cookieがサーバーサイド、LocalStorageがクライアントサイドってことですかね。


### 参考

https://dev.to/pragativerma18/cookies-vs-local-storage-534m
Pythonをつかって明日行く場所の下調べ！

## はじめに
自分のPCのファイルを整理していたら、３年くらい前にPythonで書いたものをいっぱい見つけたので、何をしていたのかを思い出しながら記事にできそうなものから記事にしておこうと思いました。本記事で紹介するプログラムは、ネットでどこか行く予定の場所(特定の地名)を調べていた時、その場所の地図や天気を知りたくなった時に使うこと想定しています。地名や住所をドラッグしてクリップボードにコピーし本プログラムを動かすことで、その場所の地図がgoogle Mapのサイトで、天気がYahoo天気のサイトで自動的に表示されます。

## 環境
* Python3.9.0
  使用ライブラリ: sys，webbrowser，pyperclip，urllib.parse

* MacOS 11.2.3/Windows10

## コード
非常に短くて簡単なコードです。本コードではクリップボードの前にコマンドライン引数を確認しています。quote関数により取得した文字列をURLにと連結できる形に整えます。url_weatherとurl_mapに代入されたアドレスをwebbrowser.openに入力するとブラウザが開きます。googleマップとYahoo天気のページが開きます。url_weatherやurl_mapに任意のURLを代入することでカスタマイズすることができます。

```python
#coding:utf-8
import sys, webbrowser, pyperclip, urllib.parse

"""コマンドラインかクリップボードから場所を取得して検索"""

"""コマンドラインから場所を取得"""
if len(sys.argv) > 1:
    address = ''.join(sys.argv[1:])

else:
    """クリップボードから場所を取得"""
    address = pyperclip.paste()

url_weather = 'https://weather.yahoo.co.jp/weather/search/?p=' + urllib.parse.quote(address)
url_map = 'https://www.google.com/maps/place/' + urllib.parse.quote(address)

webbrowser.open(url_map)
webbrowser.open(url_weather)

```

## 動作例

クリップボードに「宮古島」をコピーし本プログラムを起動するとsafariにgoogleマップで宮古島を表示するタブとYahoo天気で宮古島の天気を表示されるタブの2つが自動で現れます。

## カスタマイズ例

* クリップボードから取得する文字列を「翻訳したい英文」にし、リクエスト先をDeepLのURLにする。

## まとめ
Pythonによる自動化は本当に便利だし、思いついた自動化のアイデアを形にできた時は達成感で満たされるので初心者にも非常におすすめです。
標準出力と、クリップボードコピーを同時に行う

# なぜ？

標準出力とファイル出力を同時にする方法もあるが、いちいちファイル出力したくない...

# コマンド

```ps
PS> $store=$null; <command> | Tee-Object -Variable store; $store | Set-Clipboard
```

`<command>` に実行したいコマンドを入力し、実行してください。
また、Powershellの場合、パイプで渡すと文字化けが発生しますので、上記コマンドを実行する前に以下コマンドを実行する必要があります。

```ps
$OutputEncoding = [Console]::OutputEncoding
```

# 処理の内容

- クリップボードの中身を格納する変数(`$store`)を用意します。
    - `$store=$null;`
- 実行したいコマンドをパイプし、`Tee-Object` コマンドの `-Variable` オプションを使って、変数に実行結果を格納するようにします。
    - `<command> | Tee-Object -Variable store;`
- 実行結果を格納した変数を `Set-Clipboard` コマンドを使って、クリップボードにコピーします。
    - `$store | Set-Clipboard`

# 参考

- [Microsoft Docs: PowerShell - Tee-Object](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/tee-object?view=powershell-7.1)
- [Microsoft Docs: PowerShell - Set-Clipboard](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/set-clipboard?view=powershell-7.1)
- [Powershell で文字コードを変更する(clip.exe へのリダイレクトもね)](https://www.vwnet.jp/Windows/PowerShell/CharCode.htm)
FirebaseにPythonからアクセスする（ファイル保存編）

<h4>1.はじめに</h4>
Googleの<a href ="https://firebase.google.com/">Firebase</a>をデータベースとして使い、さまざまなアプリからアクセスできるようにされているケースも多いと思います。ここでは、FirebaseにPythonからアクセスし、ファイルをデータベース上に保存する基本的な方法について紹介をします。なお、ここでは、セキュリティが緩い形になっているので、本番環境では必ず公式ドキュメントの<a href = "https://firebase.google.com/docs/rules/basics?authuser=0#cloud-storage_4">セキュリティルール</a>をしっかり読んでいただき、誰でもデータベースにアクセスができるような状態にならないように注意しましょう。こうした話も含めて、毎回のことですが自己責任でお願いします。

<h4>2.全体の流れと準備</h4>
・Firebaseのアカウント作成
・プロジェクトの作成
・ウェブアプリの作成
・Storageの作成
は終わっていることを前提にします。

あらかじめ、歯車のアイコンの「プロジェクトを設定」をクリックして、作成したウェブアプリを選択。SDKの設定と構成のところのスクリプトから、APIアクセスに必要な以下の情報を取得しておきます。

```
firebaseConfig = {
    apiKey: "XXXX",
    authDomain: "XXXX",
    projectId: "XXXX",
    storageBucket: "XXXX",
    messagingSenderId: "XXXX",
    appId: "XXXX"
  };
```


また、Storageアイコンをクリックして、Storage　→ Rules　を選択し、ルールを以下の通りに編集します。デフォルトでは、allo read, writeの後に、if request.auth != null　が入っていますが、これを消しています。セキュリティに影響する部分なので、あくまで開発時の対応と考えてください。
しつこいですが、本番環境にするためには、<a href ="https://firebase.google.com/docs/rules/basics?authuser=0#cloud-storage_4">基本的なセキュリティルール</a>`に沿って設定をする必要があります。このセキュリティ設定ができていないことで情報漏洩（漏洩というか、意図せぬ公開）が発生してしまいます。

```
rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}
```
<h4>3. Pythonコード</h4>
Firebaseにアクセスするためのコードを書いていきます。ここでは、モジュールPyrebaseを使っています。公式ドキュメントは<a href = "https://github.com/thisbejim/Pyrebase">こちら</a>です。
ここで注意したいのが、firebaseConfigの設定になります。Firebaseのプロジェクトの設定「SDK の設定と構成」の情報を入れるのですが、そのままのコピペではエラーが出てしまいますので、次の２点を修正しておきます。
①Keyに””がついていないので、それぞれに””をつける作業が必要
②databaseURLをダミーで構いませんので、設定しておくことが必要（""でOKです。）

```python:storage_access.py
import pyrebase

firebaseConfig = {
    "apiKey": "XXXX",
    "authDomain": "XXXX",
    "databaseURL": "",
    "projectId": "XXXX",
    "storageBucket": "XXXX",
    "messagingSenderId": "XXXX",
    "appId": "XXXX"
  }

firebase = pyrebase.initialize_app(firebaseConfig)

#保存したいファイルのパスを指定します。Google Colabでマウントしたドライブに保存したファイル
#なら、以下のような例になります。
path = '/content/drive/MyDrive/XXXX.jpg'

storage = firebase.storage()

#データベースに保存するファイルをファイル名をつけてアップします。
storage.child('image/01.jpg').put(path)  

#アップしたファイルをダウンロードします。
storage.child("image/01.jpg").download("down.jpg")

#アップしたファイルをダウンロードするためのURLを取得して表示します。
image_url = storage.child('image/01.jpg').get_url(token=None)  
print(image_url)
```


<h4>4.今後の発展に向けた課題</h4>
おそらくFirebaseの利用シーンとしては、IphoneやAndroidアプリ、ウェブアプリなどマルチなフロントエンドから一元的なFirebase上のデータベース にアクセスするケースが想定されると思います。
英語のサイトですが、<a href = "https://dev.to/mdrhmn/django-firebase-cloud-storage-331p">Django+Firebaseの組み合わせて使用する場合の解説</a>を見つけました。こうしたものも参考にしながら、Firebaseを使いこなしていただければと思います。くどいようですが、データベースのセキュリティの問題はくれぐれもお気をつけください。
びんぼうでいいのにbootloaderを転送しよう


## びんぼうでいいの(Arduino)にbootloaderを転送しよう

### びんぼうでいいのとは

> 「びんぼうでいいの」はaitendoから販売されているArduino開発ボードです。
> https://www.aitendo.com/product/10793
> これに生の何もプログラムされていないAVR MCU(atmega328)を載せて使います。
> 使えるMCUは
> atmega328-PUかatmega328P-PUのどちらかです。
> atmega328P-PUの方が色々設定が楽でトラブルが少ないと思います。

### びんぼうでいいの開発環境

> 開発環境はArduino IDEが使えます。
> びんぼうでいいのはArduino UNO互換ボードです。
> Arduino IDEで指定するボードはArduino UNOです。

### ブートローダの転送

> bootloaderがあればプログラム転送がUSBケーブルだけで行えるようになります。
> ArduinoIDEを使ってbootloadを転送します。
> 
> atmega328-PUを使う場合はboard.txtにパッチが必要です。
> pあり
> uno.build.mcu=atmega328p
> pなし
> uno.build.mcu=atmega328
> uno.build.mcuの値はCPUに合わせる必要があります。

> 追加ハードウェアでブートローダの書き込み装置が別途必要です
> これはUSBaspを使います。
> USBaspを使えばCPUを引っこ抜いたりブレッドボードを別途用意したりする必要がなくなります。
> USBaspはamazonやaliexpressなどで売ってる数百円のものがそのまま使えます。
> USBaspのWindows10用のドライバーのインストールはzadig-2.5.exeを使います。
> USBaspをPCに刺しUSBaspの6pinケーブルをびんぼうでいいの上にあるUSBASP端子(10P)に刺します。

![IMG_1608.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399473/e1e53dc6-3b37-d07a-b722-3e63974679b9.jpeg)


> arduino IDEでボードをarduino UNOを選んで書き込み装置にUSBaspを選択し
> 「ブートローダを書き込む」
> で作業終了です。

### ビルド環境

> arduino IDEでatmega328-PU(Pなし)でスケッチをビルドするときは
> uno.build.mcu=atmega328p
> に元に戻してから行います。
> これはCPUの型番違いによるエラーがでるためです。
> PCと「びんぼうでいいの」をUSBケーブルでつないでCH340ドライバーをインストールしシリアル通信できるようにします。
> arduino IDEでスケッチを書いて「マイコンボードに書き込む」でスケッチをビルドし転送します。

### 動作テスト

> (Lちか)で行います
> 通常のarduino同様にarduino IDEでコンパイルしCOMポートでスケッチを転送します。

```C

void setup() {
  pinMode(13,OUTPUT);
}

void loop() {
  digitalWrite(13,HIGH);
  delay(1000);
  digitalWrite(13,LOW);
  delay(1000);
}

```

### その他

> board.txtで開発に使うマイコン環境が決まります。
> コンパイルオプションもplatform.txtを書き換えれば自由に変更できそうです。
> board.txtとplatform.txtの差し替えでスケッチから実行されるavrdudeコマンドのオプションも変えられそうです。
> arduino IDE本体をWindowsAppsフォルダから出してセキュリティガバガバで使うと楽だと思いました。
JDLA_E資格の深層学習「学習率最適化」

#1. 学習率最適化とは

NNの最適な重みを学習していくには以下の式を使った。ここで、学習率$\epsilon$を最適な値にしていないと、学習が上手く出来ない。

~~~math
w^{t+1} = w^t - \epsilon \nabla E\\

※\epsilon :学習率
~~~

![学習率最適化.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/87bd3e0d-0884-cc4b-4c96-4e3209b2e0a3.png)


この学習率の最適値を求める為の手法がおもに４つある。

1. モメンタム
1. Adagrad
1. RMSProp
1. Adam

#2. モメンタム

勾配降下法では、今回の重みと今回の結果誤差を使って、次回の重みを求めていた。ここに、前回の重みを計算に加えたものが、モメンタムと呼ばれる手法になる。momentumは、運動量、いきおいという意味があり、他の手法に比べて、最初は遅いが、加速度的に最適値へ近づいていき、他の手法よりも早く大域的最適解へたどり着きやすい。
勾配降下法のようにジグザグ運転ではなく、移動平均的に滑らかな動きをする。しかし、最適解に近づいてから、なかなかそこで止まらないという習性がある。

~~~math
V_{t} = \mu V_{t-1} - \epsilon \nabla E\\
w^{t+1} = w^t + V_{t}\\

※ V_{t-1} :前回の学習の時の重み\\
※\mu ：慣性\\
※\epsilon :学習率
~~~

#3. Adagrad

Adagrad は、それまでの学習の内容$h_t$を覚えておいて、それを学習に反映する。初期値の$\theta$は、適当。Adagrad は、勾配がなだらかな場合に、最適地に近づきやすい。しかし、大域的最適解にたどり着きにくい。また、鞍点（鞍部）にいる場合に、そこからなかなか抜け出せない。

~~~math
h_0 = \theta \\
h_t = h_{t-1} + (\nabla E)^2 \\
w_{t+1} = w_t -\epsilon \frac{1}{\sqrt{h_t} + \theta} \nabla E \\
~~~


#4. RMSProp

Adagradの鞍点問題を解決したものが、RMSProp。大域的最適解になりやすい。

~~~math
h_0 = \theta \\
h_t = \alpha h_{t-1} + (1-\alpha)(\nabla E)^2 \\
w_{t+1} = w_t -\epsilon \frac{1}{\sqrt{h_t} + \theta} \nabla E \\
~~~


#5. Adam

４つのOptimizerのなかで最もよい手法。モメンタムとRMSPropの良いところの合作アルゴリズム。
鞍点（勾配のない場所）を抜けて、早く大域的最適解へ収束する。

https://github.com/Jaewan-Yun/optimizer-visualization
【AWS】S3の概要(特徴とデータの保存形式)

#プログラミング勉強日記
2021年5月29日

#AWSのストレージサービスについて
　AWSでは3つの形式のストレージサービスがある。

　<b>ブロックストレージ</b>：EBSとインスタンスストアがブロックタイプのストレージ。EC2インスタンスにアタッチして(一緒になって)使っていくストレージ。ブロック形式でデータを保存し、高速・広帯域幅。
　<b>オブジェクトストレージ</b>：S3やGlacierがオブジェクトタイプのストレージ。安価で高い耐久性を持つオンラインストレージで、オブジェクト形式でデータを保存する。デフォルトでは複数AZに冗長化されている。
　<b>ファイルストレージ</b>：EFSがファイルタイプのストレージ。複数のEC2インスタンスから同時にアタッチ可能な共有ストレージサービスで、ファイル形式でデータを保存する。

#S3とは
　Simple Storage Serviceの頭文字3つをとってS3と呼ばれる。AWSで簡単にストレージを使う場合に最適。ユーザがデータを容量制限なく保存可能なマネージド型で提供されるオブジェクト型のストレージ。(マネージド型なので、ユーザ側で冗長性を考えなくていい)

##特徴

- 高い耐久性
- 安価なストレージ(容量単価：月額1GB / 約2.5円 )
- スケーラブルで安定した性能(複数AZでAWS側で冗長化しているので、可用性・耐久性が高く安定して安全に使える)
- 転送中や保存時にデータを暗号化できる

##データの保存形式
　バケットとオブジェクトの2つの形式でデータを保存する。バケットは、大きなフォルダ構成になっていて、名前はグローバルでユニーク。(その中にユーザでフォルダを作ることもできる。) その中に格納するデータがオブジェクトという単位で格納される。それぞれのオブジェクトごとにURLが付与されていて、インターネット上からURLにアクセスすることができる。
　データサイズは0KBから5TBまで保存可能。
画面に表示される要素の個数の検証方法[RSpec, Capybara]

いつもお世話になっている以下のページに要素の検証方法についての記載がなかったので、ここに記録しておこうと思います。
( いつも本当にお世話になっています！！ )

https://qiita.com/jnchito/items/607f956263c38a5fec24

## 結論

```ruby:rspec/*/**_spec.rb
expect(page.all("input.btn__works").count).to eq 2
```

```ruby:app/views/**/*.html.erb
<ul class="user--works__types">
  <li>
    <%= form_tag(url_for(action: 'my_works'), remote: true) do %>
      <%= submit_tag "作品一覧", class: "btn__works" %>
    <% end %>
  </li>
  <li>
    <%= form_tag(url_for(action: 'favorites'), remote: true) do %>
      <%= submit_tag "お気に入り", class: "btn__works user--works__now" %>
    <% end %>
  </li>
</ul>
```

## 余談

このコードには2という数値をハードコーディングしている問題点が残ります。
また、参考記事にもこの記載が乗っていないということは、実際にはよくないテスト方法なのかもしれません。

ただこのコードを書いてみて感じたことは、`count`という配列を引数にとるメソッドを利用している事から、「rspecではhtmlを要素を配列してまとめることで捉えている」、という学び(仮説?)を得ました。
学習不足で正しくはないかもしれませんが、イメージとしてはそのような使い方を予想しました。
初心者の非同期処理の覚え方

##初めに
「非同期、Promiseベース何それ？」みたいなところから非同期処理を理解していくのは本当に大変です。
私が最初から知りたかった事だけをまとめてみます。
**注意：基本的な考え方としてはどの言語でも共通している部分はあるかと思いますが、ここではReactでアプリを作成している事を前提としています。**

##同期処理と非同期処理
JavaScriptは普通にプログラムを書くと上から順番に処理されていきます。これを同期処理と言い、途中で時間の掛かる処理を書くとその処理が終了するまでストップしてしまいます。
例えば、サーバーと通信をして何かしらのデータを取得するような処理を書くと、結果を得られるまで処理がストップしてしまうわけです。
そこで登場するのが**非同期処理**という技術で、時間の掛かる処理を実行してもすぐに次の処理に移行することができます。そして、他の処理を実行している間に結果を取得したら、そのまま続きの処理を始められるのです。

>参照　[Promiseによる非同期処理](https://www.sejuku.net/blog/98530)

##問題点
いろんな書き方、用語が多すぎ問題。
これまでの歴史や流れを知っているエンジニアにとっては難しくはなくとも、変遷を知らない初学者にとってはここがもっとも辛い点の一つだと思います。
非同期処理を学習する上で、分からない部分をググってみると、、、

- Promise
- fetch/then
- resolve
- result
- async/await
- axios
- try/catch

どれを使ってどう書けばいいの？て感じです。
私はここで大分悩みました。

##解決策
全てを覚えるのではなくまずは一つ、慣れるまでは自分の書きやすい非同期処理の形を持つ事が良いのではないかと考えました。
そこで私は以下の３つをベースとして使用することにしました。

- async/await
- axios
- try/catch

細かい理由は色々ありますが、理由はともかく「この形に持っていくと非同期処理ができるんだな」的なパターンを覚える事が優先です。あとは慣れです。

###async/await
asyncは、これから非同期処理を行いますよ宣言
awaitは、asyncを使った非同期処理関数の中の処理に対して、ある処理が終わるまで待ってもらいたい部分で宣言する

###axios
こちらは外部のライブラリとなりますが、無くても非同期処理は書けるようです。ただHTTP通信の際に送受信したいデータに対してわざわざJsonの処理を施さなくて済むのでコードも短くなり楽チンというメリットがあります。
>参考記事 
[【リソース取得APIの比較】fetchとaxiosの4つの相違点](https://zenn.dev/syu/articles/9840082d1a6633)

###try/catch構文
シンプルで分かりやすい構文。

- 非同期通信の際に行いたい処理(tryしたい処理)をtry{}の中に記述
- 処理に失敗したらcatch{}の中でコンソールや画面にエラーを表示させる書き方です。


---
それでは、これらを使用してお天気情報を取得してみます。
緯度と軽度を引数で受け取ったと仮定して、その地域の天気情報を取得します。

```React:example.ts
import axios from 'axios';

export const fetchWeatherData = async (lat: number, lng: number) => {
  try {
    const APIkey = process.env.REACT_APP_OPEN_WEATHER_MAP_API;
    const res = await axios.get(
    //今回はOpenWeatherMapのOne Call APIを使用する//
    `http://api.openweathermap.org/data/2.5/onecall?lat=${lat}&lon=${lng}&units=metric&lang=ja&exclude=minutely&APPID=${APIkey}`
    );
    //上でawait宣言しているのでその処理が終わってからこの次の処理が始まる//
    const weatherInfo: any = res.data;
    return weatherInfo;
  } catch (err) {
    console.log(err);
  }
};
```
これでweatherInfo内に、特定の地域の天気情報を取得する事ができました。
ここで取得したデータをもとに、それぞれのコンポーネント内で必要なデータをビューに反映させる流れとなっています。


##最後に
ここではweatherInfoの型がanyなどを使ったやっつけコードになっていますが、ひとまず今回は自分が学習した事の備忘録として書かせていただきました。
間違いなどがございましたら、ご指摘願います。
linux 任意のサイズのファイルを作成する方法 個人メモ

# 目的

- 任意のサイズのファイルをlinuxコマンドで作成する方法をメモ的にまとめる

# 方法

- 1MBのtextファイル「1mb.txt」を作成する時は下記を実行する

    ```terminal
    $ dd if=/dev/zero of=1mb.txt bs=1000000 count=1
    ```

- 実行後、カレントディレクトリを確認したところ正常に1MBのtextファイルが作成されていた。

    ![WorkspaceController_php_—_todos.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d7499511-d641-da04-4b24-ad3ab8c4ec38.png)
Seleniumで全画面スクリーンショット(Python)

# はじめに

調べていてちょっとハマったのでここに書き残しておくことに。

# 調査報告

大別して2種類の方法を目にした。

1. スクロールしながらスクショしていき、最後にPillowライブラリで結合する。([参考](https://stackoverflow.com/questions/41721734/take-screenshot-of-full-page-with-selenium-python-with-chromedriver))
1. ウィンドウサイズを拡大して1枚のスクショに収める。([参考](https://qiita.com/yasunori/items/e7d18dd917870ce3676d))

基本的には2番目の方法でいいと思われるが、あまりに領域が広い場合メモリが足りなくなるおそれがあるため、その場合は1番目の方法を採用すればいいと思われる。

# 結論

基本的には以下の関数を用いる。(2番目の方法)

```python
def fullpage_screenshot(driver, file):
    w = driver.execute_script("return document.body.parentNode.scrollWidth")
    h = driver.execute_script("return document.body.parentNode.scrollHeight")
    driver.set_window_size(w, h)
    driver.save_screenshot(file)
```

---

領域が広い場合は以下の関数を用いるべきかもしれない。(1番目の方法, コピペ)

```python
from PIL import Image
import time

def fullpage_screenshot(driver, file):
    print("Starting chrome full page screenshot workaround ...")

    total_width = driver.execute_script("return document.body.offsetWidth")
    total_height = driver.execute_script("return document.body.parentNode.scrollHeight")
    viewport_width = driver.execute_script("return document.body.clientWidth")
    viewport_height = driver.execute_script("return window.innerHeight")
    print("Total: ({0}, {1}), Viewport: ({2},{3})".format(total_width, total_height,viewport_width,viewport_height))
    rectangles = []

    i = 0
    while i < total_height:
        ii = 0
        top_height = i + viewport_height

        if top_height > total_height:
            top_height = total_height

        while ii < total_width:
            top_width = ii + viewport_width

            if top_width > total_width:
                top_width = total_width

            print("Appending rectangle ({0},{1},{2},{3})".format(ii, i, top_width, top_height))
            rectangles.append((ii, i, top_width,top_height))

            ii = ii + viewport_width

        i = i + viewport_height

    stitched_image = Image.new('RGB', (total_width, total_height))
    previous = None
    part = 0

    for rectangle in rectangles:
        if not previous is None:
            driver.execute_script("window.scrollTo({0}, {1})".format(rectangle[0], rectangle[1]))
            print("Scrolled To ({0},{1})".format(rectangle[0], rectangle[1]))
            time.sleep(0.2)

        file_name = "part_{0}.png".format(part)
        print("Capturing {0} ...".format(file_name))

        driver.get_screenshot_as_file(file_name)
        screenshot = Image.open(file_name)

        if rectangle[1] + viewport_height > total_height:
            offset = (rectangle[0], total_height - viewport_height)
        else:
            offset = (rectangle[0], rectangle[1])

        print("Adding to stitched image with offset ({0}, {1})".format(offset[0],offset[1]))
        stitched_image.paste(screenshot, offset)

        del screenshot
        os.remove(file_name)
        part = part + 1
        previous = rectangle

    stitched_image.save(file)
    print("Finishing chrome full page screenshot workaround...")
    return True
```
変数を代入する　

# 問題１
メソッド外で定義された3つの整数を、それぞれ仮引数a,b,cとしてnumメソッド内で使用する。
・第一引数と第二引数は足し算をし、変数abに代入。
・第三引数が3以下の場合は変数abを第三引数の値で割り、結果を出力する。
・第三引数が4以上の場合は変数abを第三引数の値で掛け、結果を出力する。

※ 前述のとおり、値は整数の場合のみを想定します。したがって、小数点の場合を考える必要はありません。

```html.rb
def num = (a,b,c)
 ab = a + b
 if c <= 3 
  puts ab / c
else
 if c >= 4
  puts ab * c
 end
end
```
# 解説
ab = a + bで第一引数aと第二引数bを足し合わせています。
そして、第三引数cが3以下なのか否かをc <= 3として比較し、trueの場合は変数abをcで割る処理をしています。

第三引数cが4以上の場合はc <= 3がfalseの場合であると一意に決まるため、elseの場合は変数abにcをかける処理をしています。
【初心者でもわかる】+で作る、開閉ボタンの作り方（2パターン）

#どうも7noteです。開閉ボタンの+マークに使うアニメーションパターンを2つ

クリックやタップで「+ボタンを押すと開閉するボックス」を作る際に使える+ボタンのアニメーションを作成します。

![sample01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/9a054b59-2ad5-8d78-0f34-a19a7ff07657.gif)
![sample02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/2691b91f-e677-b180-3702-468dae56d1d3.gif)


まずは原型となる+ボタンをCSSで作成していきます。

## ソース

まずは今回のベースとなる基本形の+マークを作成します。

```index.html
<div class="btn"></div>
```

```style.css
.btn {
  width: 20px;
  height: 20px;
  position: relative;
}
.btn::before {
  content: '';
  width: 100%;
  height: 2px;
  display: inline-block;
  background: #000;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  transition: .5s;
}
.btn::after {
  content: '';
  width: 2px;
  height: 100%;
  display: inline-block;
  background: #000;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  transition: .5s;
}
```

```script.js
$(function(){
  $(".btn").on("click", function(){
    $(this).toggleClass("open");
  });
});
```


### 「回転してマイナスになる」

![sample01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/9a054b59-2ad5-8d78-0f34-a19a7ff07657.gif)


```style.css
/* 以下を追記 */
.btn.open::after {
  transform: translate(-50%, -50%) rotate(90deg);
}
```





### 「回転して✕になる」

![sample02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/2691b91f-e677-b180-3702-468dae56d1d3.gif)


```style.css
.btn.open::before,
.btn.open::after {
	transform: translate(-50%, -50%) rotate(45deg);
}
```


## まとめ

開閉させるボタンはWEBサイトではよく使うので、コピペで使えるように記事にまとめました。
他のパターンも少しずつ増やしていければと思います。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
MathJax のきれいなフォントで行列計算したい

# やってみた

![2021-05-29_22h15_45.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/60685617-65b0-153d-6031-2d13bf9684cd.gif)

S3 に置いた。

https://matrix-calculation.s3-ap-northeast-1.amazonaws.com/index.html

コードはこちら。

https://github.com/quryu-1/matrix-calculation
Python3の除算について

Python3による徐算にて整数値で商が欲しかった際のメモ。
切り捨て徐算を利用すれば取得できる。

```division.py
print(10 / 3) # 3.3333333333333335
print(10 // 3) # 3
```

> / (除算: division) および // (切り捨て除算: floor division) は、引数同士の商を与えます。数値引数はまず共通の型に変換されます。整数の除算結果は浮動小数点になりますが、整数の切り捨て除算結果は整数になります; この場合、結果は数学的な除算に 'floor' 関数 を適用したものになります。ゼロによる除算を行うと ZeroDivisionError 例外を送出します。

https://docs.python.org/ja/3/reference/expressions.html#binary-arithmetic-operations

### 丸め方

> 結果の型は整数型とは限りませんが、結果の値は整数です。結果は常に負の無限大の方向に丸められます: 1//2 は 0 、 (-1)//2 は -1 、 1//(-2) は -1 、そして (-1)//(-2) は 0 です。

```division.py
print(1 // 2) # 除算結果0.5のため0 (0 < 1)
print((-1) // 2) # 除算結果-0.5のため-1 (-1 < 0)
print(1 // (-2) # 除算結果-0.5のため-1 (-1 < 0)
print((-1) // (-2) # 除算結果0.5のため0 (0 < 1)
```

https://docs.python.org/ja/3/library/stdtypes.html#numeric-types-int-float-complex