OmniAICreator/Qiita-1.07M huggingface dataset:
react-countupを利用し簡単なカウントを実装してみた

初心者用。とても簡単でした。
数字がカウントアップします。
## react-countup

react-countup をnpm install

    npm install react-countup

簡単なコードを記載
importにreact-countupを記載する


```react
import "./styles.css";
import React from 'react'
import Countup from 'react-countup'

export default function App() {
  return (
    <div className="App">
      <h1>
        <Countup end={20} duration={5}/>
      </h1>
    </div>
  );
}
```

durationをいれるとアニメーションでカウントアップされます。

結果↓
![countup.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901173/d17ded73-d630-eb7c-e2ed-74cf5fbc4052.gif)
値を渡した結果

これだと実用性が全くないので、値を渡したりしてみる

App.js

```react

import "./styles.css";
import { CountUpTest } from "./CountUpTest";

export default function App() {
  return (
    <div className="App">
      <h1>
        <CountUpTest num={20}></CountUpTest>
      </h1>![countup2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901173/ced48db9-2b7f-2bdd-e5b9-636c3438671f.gif)

    </div>
  );
}

```

CountUpTest.jsx

```react
import Countup from "react-countup";

export const CountUpTest = (props) => {
  const { num } = props;
  return (
    <div>
      <h1>
        <Countup end={num} duration={5} prefix="¥" decimals="2" />
      </h1>
    </div>
  );
};
```
結果

![countup2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901173/64e17679-a04e-4cdd-94e3-8049caba6b21.gif)

参考URLのuseCountUpを利用すると動かなかった。バグなのかな。

参考URL
https://www.youtube.com/watch?v=zttrshYjHHQ&ab_channel=Codevolution
AWSIOT: デバイスデータを S3 に送る

data/sample にパブリッシュされたデータを
sample-sep18 という S3 バケットに送ります。

次の4ステップになります。

1) S3 バケットの作成
>バケット名　sample-sep18

2) IAM でロールを作成
>ロール名　role_sep18

3) IAM でポリシーをロールにアタッチ
>S3 にアクセスできるポリシーをアタッチ

4) IOT でルールを作成
>ルール名　rule_sep18

##バケットの作成##

```bash
BUCKET="sample-sep18"
#
aws s3 mb s3://$BUCKET
```

##ロールを作成##

```bash
ROLL_NAME="role_sep18"
#
aws iam create-role --role-name $ROLL_NAME --assume-role-policy-document file://iot-role-trust.json
```

```json:iot-role-trust.json
{
  "Version":"2012-10-17",
  "Statement":[{
      "Effect": "Allow",
      "Principal": {
        "Service": "iot.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
  }]
}
```

##ポリシーをロールにアタッチ##

```bash
ROLE_NAME=sample_sep18
#
aws iam attach-role-policy --role-name $ROLE_NAME \
	--policy-arn "arn:aws:iam::aws:policy/AmazonS3FullAccess"
```

##IOT ルールを作成##

```bash
RULENAME="rule_sep18"
#
aws iot create-topic-rule --rule-name $RULENAME \
	--topic-rule-payload file://iot_s3.json

```

```json:iot_s3.json
{
  "sql": "SELECT * FROM 'data/sample'",
  "ruleDisabled": false,
  "awsIotSqlVersion": "2016-03-23",
  "actions": [
    {
      "s3": {
        "roleArn": "arn:aws:iam::123495704257:role/role_sep18",
        "bucketName": "sample-sep18",
        "key": "${topic()}/${timestamp()}"
      }
    }
  ]
}
```
Vulkan で DLL 解決しないと使用できない関数を使えるようにする手順

# 発端

Visual Studio 2019 環境で Vulkan のコードを書いている際に ```vkCmdSetPrimitiveTopologyEXT``` を使おうとしたら次のエラーが出ました。

```
LNK2019	未解決の外部シンボル vkCmdSetPrimitiveTopologyEXT が関数 "public: void __cdecl vk::DispatchLoaderStatic::vkCmdSetPrimitiveTopologyEXT(struct VkCommandBuffer_T *,enum VkPrimitiveTopology)const " (?vkCmdSetPrimitiveTopologyEXT@DispatchLoaderStatic@vk@@QEBAXPEAUVkCommandBuffer_T@@W4VkPrimitiveTopology@@@Z) で参照されました
```

どうやら Vulkan の一部関数は static リンクだけでは使えないようです。

これの解決方法を日本語で全て解説しているサイトが見当たらなかったので書いておきます。

# 公式情報

https://github.com/KhronosGroup/Vulkan-Hpp の ```Extensions / Per Device function pointers``` に記載されています。

# 解決方法

大きく３つの手順をこなす必要があります。

1. プリプロセッサを定義
1. DispatchLoaderDynamic のインスタンスを定義
1. 関数を解決する処理を追加

## 1. プリプロセッサを定義

```vulkan.hpp``` をインクルードする前に ```VULKAN_HPP_DISPATCH_LOADER_DYNAMIC``` を定義してください。

```cpp
// 例
#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1
#include <vulkan/vk_sdk_platform.h>
#include <vulkan/vulkan.hpp>
```

上記の例のようにコード上に書いても良いですし、VisualStudio のプロジェクトファイルで定義しても大丈夫です。

この対応をすることで、関数解決がリンク時ではなく実行時になるようです。

ちなみにこの対応をした状態でビルドするとリンク時に以下のエラーが出力されます。

```
エラー	LNK2001	外部シンボル "class vk::DispatchLoaderDynamic vk::defaultDispatchLoaderDynamic" (?defaultDispatchLoaderDynamic@vk@@3VDispatchLoaderDynamic@1@A) は未解決です
```

## 2. DispatchLoaderDynamic の実体を定義

先ほどのエラーを解決するために ::vk::defaultDispatchLoaderDynamic の実体を定義してあげる必要があります。

**どこかの cpp ファイル**に vulkan.hpp をインクルードした上で以下のコードを追加してください。

```cpp
// #define はつけないように注意！
VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE
```

これをすることで vulkan.hpp で extern 宣言されていた ::vk::defaultDispatchLoaderDynamic の実体が定義されます。

ヘッダファイルに定義すると多重定義になるため、必ず cpp ファイルで定義してください。 

でもこのコード、ちょっと何しているのかイメージしづらいですよね…？
```VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE``` の中身は以下のようになっています。

```cpp
#    define VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE                     \
      namespace VULKAN_HPP_NAMESPACE                                               \
      {                                                                            \
        VULKAN_HPP_STORAGE_API DispatchLoaderDynamic defaultDispatchLoaderDynamic; \
      }
```

ちなみにこの対応をした状態でビルドするとビルドには成功します。しかし、実行時に vulkan の関数を実行しようとすると null アクセスが発生してエラーになります。

## 3. 関数を解決する処理を追加

vulkan の関数に有効なポインタが代入されていくように処理を書きます。

まず、 vulkan の関数を実行する前に `vk::DynamicLoader` クラスのインスタンスを作成してください。これは全ての vulkan の関数の実行で必要なため、アプリケーションの終了時まで破棄しないことをオススメします。

そして、生成したローダーオブジェクトを使いつつ `vk::Instance` の作成に必要な関数を使用できるようにします。

```cpp
// 例
::vk::DynamicLoader loader;
VULKAN_HPP_DEFAULT_DISPATCHER.init(loader.getProcAddress<PFN_vkGetInstanceProcAddr>("vkGetInstanceProcAddr"));
```

次に、`::vk::createInstance` で `vk::Instance` を作成後、同様のコードを追加します。

```cpp
// 例
::vk::Instance instance;
::vk::createInstance(&info, nullptr, &instance);
VULKAN_HPP_DEFAULT_DISPATCHER.init(instance); // この処理を追加
```
この処理を追加することで `::vk::Device` の作成に必要な関数を使用できるようになります。

最後に、`::vk::Device` を作成後に同様のコードを追加します。

```cpp
// 例
::vk::Device device;
physicalDevice.createDevice(&info, nullptr, &device);
VULKAN_HPP_DEFAULT_DISPATCHER.init(device); // この処理を追加
```

これで Device に関わる全ての関数が使用できるようになります。

# おわり

お疲れ様でした！
Railsのroutesでネストさせる３つの方法

[1.はじめに](#1-はじめに)
[2.Railsのroutesにおける、namespace, scope, module](#2-内容い)
[3.まとめ](#3-内容ろ)


#1. はじめに
stack overflowで親切な人がネストの仕方を教えてくれたのでまとめます。
namespace以外でネストさせる方法を知らなかったので勉強になりました。
#2. Railsのroutesにおける、namespace, scope, module
**namespace**

```Ruby
Rails.application.routes.draw do
  namespace :admin do
    resources :movies
  end
end

```
URLを```admin/movies```に変更したい。
同じくファイル構成も```admin/moviesにしたい```
(よくaoiモードでやるやつ```api/v1/movies```)

**scope**

```Ruby
Rails.application.routes.draw do
   scope :admin do
    resources :movies
  end
end

```
同じくURLは変更したいが、ファイル構成は変更したくない

**module**

```Ruby
Rails.application.routes.draw do
  scope module: :admin do
    resources :movies
  end
end
```

URLは変えたくないけどm、ファイル構成を変えたい
#3. まとめ
namespaceしか知らなかったので、コントローラー変えるの大変だなぁって思っていたのですが、scopeを見つけてテンションが上がりました。教えてくださった方ありがとうございました。これからどんどん使っていきます。
icloudメモのバックアップを取る方法

# はじめに
<!-- 発端や概要を記載 -->
Apple製品のヘビーユーザーである私は多くのアイデアをApple標準メモアプリに記録しています。
万が一のためにこのメモデータをローカルに保存しておきたくなったので、方法を共有します。

※ 方法1はiCloudにメモの内容をバックアップしてある方向けの内容です。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [方法一覧](#Chapter1)
1. [方法1のやり方](#Chapter2)
1. [方法2のやり方（記事共有のみ）](#Chapter3)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 方法一覧
1. Apple にリクエストを送る
1. apple script/javascriptのコードを走らせる

調べたところ、2つの方法を見つけました。
中でも最も簡単そうだったのは、方法1なのでこの方法を採用しました。

<a id="#Chapter2"></a>
# 方法1: Appleにリクエストを送る方法
[Get a copy of the data associated with your Apple ID account](https://support.apple.com/en-us/HT208502)

この記事を読めば分かりますが、簡単に日本語でも解説します。
1. [Apple IDアカウントページ](https://appleid.apple.com/)にアクセス。
2. IDとパスワードを聞かれるので、アカウントにサインイン。（二段階認証が発生することも）
3. 「データとプライバシー」という項目から[データとプライバシーの管理](https://privacy.apple.com/)というリンクをクリック。
4. 再度サインイン。
5. 「データのコピーを取得」という項目の「データのコピーをリクエスト」をクリック。
6. メモを選択し、リクエストを完了する。

<a id="#Chapter3"></a>
# 方法2： Apple script or Javascriptのコードを走らせる
以下の記事を参考にコードを書けば出来そうです。（私の環境では記事のコードをそのまま実行すると文字化けや処理中のエラーが発生しました。）

- [How to backup Apple Notes on macOS, using Automator](https://ishouldgotosleep.com/how-to-backup-apple-notes-from-your-mac/)
- [Export From the Notes App Using a Script](https://www.youtube.com/watch?v=4eW-AaZ4V7U)

<a id="#reference"></a>
# 参考文献
- [Get a copy of the data associated with your Apple ID account](https://support.apple.com/en-us/HT208502)
- [How to backup Apple Notes on macOS, using Automator](https://ishouldgotosleep.com/how-to-backup-apple-notes-from-your-mac/)
- [Export From the Notes App Using a Script](https://www.youtube.com/watch?v=4eW-AaZ4V7U)
【JQuery】 datetimepicker で下限値が選べない件について

# datetimepicker　とは
JQueryのプラグイン
日付や時間を選択できたりする便利なやつ


[ここ](https://github.com/xdan/datetimepicker "https://github.com/xdan/datetimepicker")からとってきて使える

使い方等
ドキュメントは[こっち](https://xdsoft.net/jqplugins/datetimepicker/ "https://xdsoft.net/jqplugins/datetimepicker/")

# 問題
日付の下限を`minDate`で設定できる。
初回は選択可能だが、
ほかの日付選択後に下限値を選択しても
**見た目上選択可能なのに、テキストに反映されない**。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586281/f0ff48a2-55b3-6b9c-5a10-c0de673995d5.png)


コードはこんな感じで、`minDate`に対して現在日を設定している。

```javascript:
$(function () {
                $('#datetimepicker1').datetimepicker({
                    minDate: moment(),
                    showClear: false,
                    useCurrent: false,
                    format: 'YYYY年MM月DD日',          
                });
            });
```

# 解決
開発者ツールで`minDate`の値を見たら
20XX/XX/XX 12:12:11
時分秒まで入ってる。

なんかあやしいので、日付まで指定。

```javascript:
$(function () {
                $('#datetimepicker1').datetimepicker({
                    minDate: moment().format('YYYY-MM-DD'), 
                    showClear: false,
                    useCurrent: false,
                    format: 'YYYY年MM月DD日',          
                });
            });
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586281/339fd4a3-40e8-f744-b58f-61801a067fdd.png)


解決。

時間まで見てるっぽいですね。
DateTimePickerですからね。
原因わかれば、初歩的な。。
AWSクラウドプラクティショナー　３週間で合格

#はじめに
私のステータス？現状？は、以下の通りです。
完全未経験。
IT業界へ転職して半年。
普段の業務では、システムの運用をしています。ほとんどExcelの操作やメールを送ったり、打ち合わせをしているだけ。
インフラ・クラウドの実務経験は、全くありません。
保有資格：ITパスポート

試験を受けるきっかけ：クラウドサービスは、成長性と需要があると思ったから。クラウドエンジニアって響きがかっこいいし、いいな〜と単純に思いました。
まずは、よく耳にするAWSというクラウドサービスの基礎を身につけたいと思い、資格取得のため勉強を始めました。

#勉強時間
* 学習期間　8月24日〜9月11日　試験日：9月12日
* 平均学習時間
　　1日1〜2時間

#勉強方法
**１週間目**. 参考書を読んでクラウドの概念、AWSの各サービス（EC2、S3など）や料金体系について一通り基本的な知識をインプットしていきます。
参考書を読む順番としては、**「図解即戦力 Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書」→「AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー」**がいいと思います。

**２週間目**. udemyの「この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）」この講座で問題を解いていきます。
未経験者がこの問題を解くのは、かなり難しいと思います。
１つの問題文を読んで考え、答えを出すのに1〜2分以内を決めておきましょう。時間の無駄になってしまうので、効率よく！
そして、**AWSのサービスや専門用語、仕組みについてより深い理解ができるよう、解説をじっくり読む時間へ回しましょう**。


**３週間目**. 以降に紹介する模試では、模擬試験５回分が収録されているのですが、５回分全てを正答率95％以上かつ徹底的に解説を読んで不足している知識を補っていきます。
私は、それぞれ３〜４週くらいしました。


#参考書
使用した参考書は、以下の２冊です。

* [AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー](https://www.amazon.co.jp/gp/product/4797397403?%0Apf_rd_r=9BK726C3SZEDZ0K7MJB4&pf_rd_p=3d322af3-60ce-4778-b834-9b7ade73f617)
![スクリーンショット 2021-09-18 17.10.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692037/b152677f-0e81-1263-0d19-be3d87b7151f.png)

* [図解即戦力 Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書](https://www.amazon.co.jp/dp/4297108895/ref=cm_sw_em_r_mt_dp_ABRDA63M8AH0GW6A9GDQ)
![スクリーンショット 2021-09-18 17.10.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692037/d9c5e749-dac8-4b93-cec8-0733ec3a7de7.png)

#模試
模擬試験は、このサービスの中に収録されている５つの模擬試験を徹底的にやりました。
初見で解くのはかなり難しいですが、解説を読むことで非常に知識が定着し理解が深まります。

* [この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）](https://www.udemy.com/share/101SaA3@-XE3Z0aPajAjJwgBc1PWihi4Fzz-RXHZBcsd3StOhKIymgQxu6zSGGEev8fb1zMjmA==/)
![スクリーンショット 2021-09-18 17.02.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692037/e3d183f5-1bac-bbbf-b91f-855a3e2b70a4.png)

#反省点
インフラの知識（ストレージやネットワークなど）が不足していた。
参考書では、AWSにおけるサービスや仕組み、AWSの専門用語をITインフラの専門用語で解説しているので、その都度わからない単語について調べる必要があった。
そのため参考書を読み進めるのあたって、書かれている文章を英語から日本語へ翻訳しながら読んでいる感じがした。日本語で書かれているのに。
というか、実際に翻訳しながら読み進めていった。
アソシエイト取得に向けて、OSやネットワーク、ストレージなどのITインフラの勉強をしつつ、試験対策をする。



#最後に
この記事をご覧いただき、誠にありがとうございます。
同じように日々勉強に取り組んでいるエンジニアと繋がれたら、嬉しいです。
【Ruby】RubyでCSV形式のデータを読みこみや書きこみをしたい時

# 概要
Rubyでcsvファイルを読み込んで新たに書き出せるようにしたかった。
Gemを利用しても実装できるが、あえてRubyのみで実装した。

# 手順
## 1.テストデータの取得
テスト用に郵便番号データの「東京」のcsvファイルでテストします。

### ◇郵便番号データ
https://www.post.japanpost.jp/zipcode/download.html

## 2.使用するライブラリ
CSV形式ファイルを使うには、標準ライブラリcsvを利用するのが便利です。
◇csvライブラリ
https://docs.ruby-lang.org/ja/latest/library/csv.html

今回、使用する`13TOKYO.csv`はShift-JISでエンコードされているため、その後の処理で不都合があるかもしれないので、`Shift-JIS`から`UTF-8`に変更します。
◇kconvライブラリ
https://docs.ruby-lang.org/ja/latest/library/kconv.html

## csvファイルを読み込んで別のcsvファイルへ書き出すコード

```ruby
require 'csv'
require 'kconv'

row_o = Array.new
# 東京の郵便番号データを読み出し
# Shift-JISからUTF-8に変換しています。
# 配列に小笠原村が含まれる情報のみ抜き出しています。
open('13TOKYO.csv').each do |row|
  row = CSV.parse_line(Kconv::kconv(row, Kconv::UTF8, Kconv::SJIS))
  if row.include?('小笠原村')
    row_o << row.compact
  end
end

# output.csvに読み出した情報を書き出しています。
CSV.open('output.csv', 'w') do |write|
  row_o.each do |i|
    write << i
  end
end
```

## 書き出したCSV
![output_csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594740/0d34e612-9839-8581-8b84-041558309c39.png)

# まとめ
RailsのGemではなくRubyの標準ライブラリで実装できた。
`include?`の中を変数にすれば色々と対応できそう。
【Shopify】テーマの調査方法（Google拡張以外）

# 概要

Shopifyを利用しているサイトが、どのテーマをベースに作成されているのか調査したいときに、Google拡張の「Koala Inspector」を利用されている方が多いと思います。
[Koala Inspector](https://chrome.google.com/webstore/detail/koala-inspector-inspect-s/hjbfbllnfhppnhjdhhbmjabikmkfekgf)

多くのサイトではそれで判別できると思うのですが、カスタマイズが随所に施されている場合、判別ができないということが往々にして発生します。
その際に、自力でソースから判別する方法です。



# 手順
以下、実行ブラウザはChromeの前提です。他ブラウザは適宜読み替えてください。

1. 調査対象のページへ移動
1. 「F12」から開発者ツールを開く
1. Elementsタグでソースファイル内を**「ThemeName」**で検索
1. 「ThemeName」に設定している文字列 + shopify　で検索

※「ThemeName」に設定している文字列に、リネーム後のテーマ名が含まれていたりすることで、数種類設定されていることがありますが、ぽいのを検索してください。


# 注意点
**すべてのサイトに対してこの手法が有効ということではないです。**
サイトによっては、Shopify.ThemeのNameに設定されていたりと、作りによって異なります。
他ユーザと共有しているファイルのコピー

# はじめに
あるファイルを上書きコピーするときにエラーが表示され、少しハマったので書き残します。

# 発生した問題
ユーザAとユーザBが同サーバ上の共有ディレクトリに同じファイル名のファイルを上書きコピーする際にエラーとなりました。

ユーザA、ユーザBともに同じグループに所属しており、ファイル、ディレクトリのパーミッションは777となっているため、権限自体は問題なし。
※実際とは若干異なりますが説明を簡単にするために書き換えています。

![他ユーザと共有しているファイルのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/b8c487aa-a915-c236-1b6f-f5682414ab00.png)

# 原因
分かってしまえば単純な話で、一般ユーザは他ユーザが所有しているファイル等に対して上書きするとき、所有者の情報を書き換えられないことが原因でした。

以下、ユーザAが所有者のファイルに対してユーザBが上書きコピーした際のエラー。

```shell:userBのsharefileを/shareにコピーしたときのエラー
[userB@Server ~]$ cp -p /home/userB/sharefile /share/sharefile
cp: `/share/sharefile' のタイムスタンプを保存中: 許可されていない操作です
```

タイムスタンプと書かれていたため、変更日時が変えられないと思っていましたが、所有者、グループ等の情報もタイムスタンプに含まれるということに行きつくまでに時間を取られてしまいました・・・

尚、`-p`オプション無しでコピーした場合や、vi等でファイルを直接編集した場合は、所有者、グループ情報はコピーされないため、問題なく成功します。

ちなみに後から調べてみたところ、エラーは表示されますが、ファイルのコピー自体は行われているようです。

# WinSCPでのコピー
`Windows`でサーバへSCPする際などによく使われる`WinSCP`ですが、デフォルトでは`-p`オプションが有効となった設定となっているため、「**オプション**」→「**環境設定**」→「**転送**」から「**デフォルト**」プリセットの「**編集**」で「**タイムスタンプを保存する**」のチェックを外すか、「**パーミッションエラーを無視する**」のチェックを入れることで、今回のような場合でもエラーメッセージが表示されないようになります。

![capture_18092021_173802.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/ad9fe5fc-6a56-174d-4770-7268108edcc8.jpeg)

# おわりに
自分の過去の記憶では、同じ方法でもエラーが出なかったはず・・・と思い返し、ふと気になって以前よく使っていた`Solaris`の仮想マシンを用意して試してみたところ、`Solaris`ではエラー出力はされずにコピーされるようです。

以下`Solaris`の`cp`コマンドの`man`抜粋。

> **-p**
> 保持。cp ユーティリティーは、source_file の内容を複製するだけではなく、その  ACL、アクセス日時と更新日時、拡張属性、拡張システム属性、ファイルモード、および所有者 ID とグループ ID  を保持しようとします。
**cp がアクセス日時と更新日時、拡張属性、またはファイルモードを保持できない場合、cp はそれを失敗とは見なしません。**
**cp が所有者 ID  とグループ ID を保持できない場合、コピーは失敗しませんが、cp はメッセージを表示せずにターゲットのファイルモードから  S_ISUID  およびS_ISGID ビットをクリアします。**

使い慣れたコマンドでもマニュアルをしっかり読んで動作はきちんと覚えましょうというお話でした。
エクセルからパワポを自動作成するマクロ

「同じフォルダに保管されているエクセルファイルからパワポを作成するマクロ」

たなぴーさんの動画を参考に作成しました。
https://www.youtube.com/watch?v=ny-s9EgZva4&t=406s

フォルダ内
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2045560/b14e9c88-22e0-888c-7aa0-a3ad4a598705.png)
エクセルの各シート上のグラフを張り付け
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2045560/f01b8cc6-c8df-72b5-f6bc-9d154b06375b.png)


コード

```ruby:qiita.rb
Option Explicit

Sub mkPpt()

'PPT化したエクセルファイルを指定
Workbooks.Open ("C:\デスクトップ\VBA\パワポデータ貼り付け\パワポ作成.xlsx")

Dim myWs1 As Worksheet
Dim myWs2 As Worksheet
Dim myWs3 As Worksheet, numDate As Long

Set myWs1 = Worksheets("sheet1") 'sheet1をセット
Set myWs2 = Worksheets("sheet2") 'sheet2をセット
Set myWs3 = Worksheets("sheet3") 'sheet3をセット

numDate = myWs1.Cells(1, 10).Value

Dim ppApp As New PowerPoint.Application
Dim ppPrs As PowerPoint.Presentation

Set ppPrs = ppApp.Presentations.Open(ThisWorkbook.Path & "\パワポ.pptx")
Dim ppSld As PowerPoint.Slide 'スライドオブジェクト
Dim pic As PowerPoint.Shape

ppApp.Visible = True

'■■■■■■1ページ目■■■■■■

Set ppSld = ppPrs.Slides(1) '1ページ目のスライドをセット

ppSld.Shapes("ReportDate").TextFrame.TextRange.Text _
                = Format(numDate, "'yy/m/d(aaa)") & "報告"
ppSld.Shapes("TextBox1").TextFrame.TextRange.Text = myWs2.Cells(14, 4) & " " & myWs2.Cells(15, 4)
Range(myWs1.Cells(7, 2), myWs1.Cells(18, 8)).CopyPicture xlScreen, xlPicture 'グラフを画像としてコピー

Set pic = ppSld.Shapes.Paste.PlaceholderFormat.Parent

    pic.Name = "図1"
    pic.Top = 90
    pic.Left = 50
    pic.Width = 600
    pic.ZOrder msoSendToBack '最背面



'■■■■■■2ページ目■■■■■■

Set ppSld = ppPrs.Slides(2) '2ページ目のスライドをセット

ppSld.Shapes("ReportDate").TextFrame.TextRange.Text _
                        = Format(numDate, "'yy/m/d(aaa)") & "報告"
'ppSld.Shapes("TextBox1").TextFrame.TextRange.Text = myWs.Cells(14, 11) & " " & myWs.Cells(15, 11)
Range(myWs2.Cells(1, 6), myWs2.Cells(12, 12)).CopyPicture xlScreen, xlPicture 'グラフを画像としてコピー

Set pic = ppSld.Shapes.Paste.PlaceholderFormat.Parent

    pic.Name = "図1"
    pic.Top = 200
    pic.Left = 250
    pic.Width = 600
    pic.ZOrder msoSendToBack '最背面

'■■■■■■3ページ目■■■■■■

Set ppSld = ppPrs.Slides(3) '3ページ目のスライドをセット

ppSld.Shapes("ReportDate").TextFrame.TextRange.Text _
                        = Format(numDate, "'yy/m/d(aaa)") & "報告"
'ppSld.Shapes("TextBox1").TextFrame.TextRange.Text = myWs.Cells(14, 18) & " " & myWs.Cells(15, 18)
Range(myWs3.Cells(9, 2), myWs3.Cells(20, 8)).CopyPicture xlScreen, xlPicture 'グラフを画像としてコピー
Set pic = ppSld.Shapes.Paste.PlaceholderFormat.Parent

    pic.Name = "図1"
    pic.Top = 90
    pic.Left = 50
    pic.Width = 600
    pic.ZOrder msoSendToBack '最背面

'■■■■■■終了手続き■■■■■■

Application.DisplayAlerts = False
ppPrs.SaveAs ThisWorkbook.Path & "\パワポ_" & Format(numDate, "yyyymmdd") & ".pptx"
Application.DisplayAlerts = True

'ppApp.Quit

Workbooks("パワポ作成.xlsx").Close

MsgBox "スライドサイズ" & vbLf & "幅：" & ppPrs.PageSetup.SlideWidth _
& vbLf & "高さ：" & ppPrs.PageSetup.SlideHeight & vbLf & "です!", vbInformation

Application.CutCopyMode = False

End Sub
```
Git入門にオススメのUdemy講座5選。今さら聞けないことは動画で学習せよ

この記事では、gitの操作方法をイチから学べるUdemy講座を紹介します。
gitやgithubは最早開発現場では必須とも言える存在になっていますが、意外と知らないことも多いはずです。

- add,commit,push以外のコマンドを実はよく理解していない
- そもそもgitで集団開発をしたことがない
- githubで出来ることを一度体系的に学びたい

こういった思いを持つ方に参考になる評価の高い動画を厳選しました。




## Git： もう怖くないGit！チーム開発で必要なGitを完全マスター
おすすめ度：★★★★★
・[Git： もう怖くないGit！チーム開発で必要なGitを完全マスター](	https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Funscared_git%2F)
### この講座で学べる内容
・Gitの根幹をなしている概念の理解 (Gitのデータ構造から仕組みを理解する)
・Gitでのチーム開発の方法と一通りのコマンドの修得
・誤った変更を元に戻せる
・GitHubを用いたプルリクエスト・レビュー・マージの開発フロー
・ブランチの作成とコンフリクトの解消がスムーズにできる
## Git・GitHub入門:GitとGitHubを基礎から完全マスター【VSCode対応】
おすすめ度：★★★★
・[Git・GitHub入門:GitとGitHubを基礎から完全マスター【VSCode対応】](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2F2021gitgithubvscode%2F)
### この講座で学べる内容
・GitやGitHubの概要や使いどころ
・基本的な用語とGitの仕組み
・ブランチ・マージ・リベースなど応用的なGitの使用法
・GitHubでのチーム開発の基礎
・【発展編として】履歴の書き換え
## ちゃんと学ぶ、Git/GitHub・SourceTree講座（Win/Mac対応・コマンド対応）
おすすめ度：★★★
・[ちゃんと学ぶ、Git/GitHub・SourceTree講座（Win/Mac対応・コマンド対応）](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fgit-beginning%2F)
### この講座で学べる内容
・Gitを利用したバージョン管理が行えるようになる
・GitHubを利用して、ソフトウェア開発などでのチーム開発が行えるようになる
・GitFlowや GitHub Flowを利用したブランチの運用ルールを学ぶことができる
・コマンドラインでの操作方法
## Git & Github基礎講座
おすすめ度：★★★★★
・[Git & Github基礎講座](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fgit-github-a%2F)
### この講座で学べる内容
・バージョンコントロールシステムを活用できるようになる
・Git経由の無料ツールを活用できるようになる
・より効率的な開発環境を実現できる
・失敗を恐れず、挑戦的な開発がしやすくなる
・ほぼ一生ものの世界的スキルを獲得できる
・等々...
## はじめてのGitとGitHub、GitKraken入門【VSCode初期セットアップ含む】
おすすめ度：★★★★
・[はじめてのGitとGitHub、GitKraken入門【VSCode初期セットアップ含む】](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fgit-github-gitkraken%2F)
### この講座で学べる内容
・Gitの基本概念の理解
・GitHubでIssue（イシュー）管理する方法
・GitHubでコードレビューする方法
・GitHubでプロジェクト管理をする方法
・GitKrakenの使い方


## Udemy関連動画

・[Java初心者に超オススメ出来るUdemy動画講座7選まとめ。最速マスター特化](https://qiita.com/ykimura517/items/946193f715776db44770)
・[【Python】サーバーサイド初心者にオススメのUdemyのDjango動画講座5選](https://qiita.com/ykimura517/items/322fa40c6a4bac0bc111)
・[iPhoneアプリ作成入門に最適なUdemyのオススメSwift講座5選](https://qiita.com/ykimura517/items/55530f508dddb56ce20d)
・[【学習効果・高】ブロックチェーン入門に最適なUdemy講座おすすめ6選](https://qiita.com/ykimura517/items/4ed720420fbab536a628)
・[【web開発初心者】おすすめRuby on railsのUdemy講座まとめ。高コスパ講座を6つ厳選](https://qiita.com/ykimura517/items/569a7e17ac572fa91a3d)
・[PHP初心者に超オススメのUdemy講座6つを厳選！web入門者必見](https://qiita.com/ykimura517/items/b870276125dbab7f5b12)
CDS ViewからExcelに直接データをダウンロードする(ODataフィード)

#やること
ExcelのODataフィードを使用して、CDS Viewのデータをダウンロードする


#手順
##(事前準備)対象のCDS Viewについて
今回はSAP標準のSales Orderの情報(API_SALES_ORDER_SRV)を取得してみます。
詳細情報については[こちら](https://help.sap.com/viewer/19d48293097f4a2589433856b034dfa5/2020.002/en-US/00d244581efca007e10000000a441470.html)を。

T-CD:/IWFND/MAINT_SERVICE で確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22526/0f3e0b4a-99d8-04fa-f5c4-61c41152f1c9.png)

※もしも、CDS View作成からOData公開までを実施する場合は、以下の記事がとてもわかりやすいです。

https://qiita.com/tami/items/1f63f0d3c46e3a0255e8


##Excelでデータ取得
データ → データの取得 → その他のデータソースから → OData フィードから 
![スクリーンショット 2021-09-18 172446.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22526/69dfa81c-ab4b-be4d-abf0-6a2876f21057.png)

URL入力
![スクリーンショット 2021-09-18 172908.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22526/47b0b3b4-9d9b-60ba-1986-9a03c06dd025.png)

表示するデータを選択し、右下の読み込みボタンを押下
![スクリーンショット 2021-09-18 173244.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22526/b7ef0957-9a75-ca3f-28d6-ab1bb1b38ffd.png)

認証方法はいろいろあるかもですが、基本の場合はユーザとパスワードを設定
![スクリーンショット 2021-09-18 173843.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22526/83cbc6fa-eac3-c895-ed50-0a62ab584ffa.png)

これでデータが取り込まれます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22526/a01eeaac-56c5-2b2f-4bd8-3d0724b51153.png)

#雑感
これ、かなり便利ですよね。。。
うまく活用していきたいです。

#参考
[Download data from an OData Service into Excel Directly](https://blogs.sap.com/2017/08/10/download-data-from-an-odata-service-into-excel-directly/)
[Odataフィードについて](https://qiita.com/susumutanaka/items/2f5177a2346a3e6b6c7a)
Roundcubeでトラブル発生した場合にできる対応

AWSのEC2のマーケットプレイスでRoundcube by bitnamiというツールを入手しました。
WEBメールツールで非常に便利なのですが、接続不良などのトラブルを起こします。
こういったことの対処についてサポートしてくれそうなところがなくて困っているのですが
（AWSではマーケットプレイスのものはサポート外扱い）ようやく見つけました。

### サーバにまずはSSHでログイン

```
ssh -i *** bitnami@XX.XX.XX.XX
```

### 診断ツールを起動します。

```
$ sudo /opt/bitnami/bndiagnostic-tool
----------------------------------------------------------------------------
Welcome to the Bitnami Diagnostic tool.

----------------------------------------------------------------------------
Please read the following information carefully.

Press [Enter] to continue:
This tool collects system information and files from a Bitnami stack into a
diagnostic bundle file to be uploaded and reviewed by the Bitnami Team, for the
sole purpose of providing you support for any issue you may find.

The uploaded information will be automatically removed from our systems after 1
month. In case you have any doubt regarding our privacy policy please check:

https://www.vmware.com/help/privacy.html
Press [Enter] to continue:

Do you accept? [y/n]: y

||
The bndiagnostic tool has finished searching for errors and has found some
issues that might be related to yours. The output will be shown on the next
page:

Press [Enter] to continue:


===== Begin of bndiagnostic tool output =====


    ? Apache: Found possible issues
    ✓ Mariadb: No issues found
    ✓ Connectivity: No issues found
    ✓ Resources: No issues found
    ✓ Php: No issues found



[Apache]

Found recent error or warning messages in the Apache error log.
### 多分問題の箇所 ###
[Sat Sep 18 03:25:12.825188 2021] [authz_core:error] [pid 732:tid
eee] [client **ip_address**:54400] AH01630: client denied by server
configuration: /opt/bitnami/roundcube/config/aws.yml
 [Sat Sep 18 05:45:28.766500 2021] [authz_core:error] [pid 1532:tid
aaa] [client **ip_address**:58734] AH01630: client denied by server
configuration: /opt/bitnami/roundcube/config/getuser
 [Sat Sep 18 07:12:13.147052 2021] [authz_core:error] [pid 1533:tid
Press [Enter] to continue:
aaa] [client **ip_address**:42956] AH01630: client denied by server
configuration: /opt/bitnami/roundcube/config/getuser
###  ここまで ###

Please check the following guide to troubleshoot server issues:

https://docs.bitnami.com/general/apps/wordpress/troubleshooting/debug-erro
rs-apache/


===== End of bndiagnostic tool output =====


Press [Enter] to continue:
The diagnostic bundle was uploaded successfully to the Bitnami servers. Please copy the following code:

XXXXX-XXXX-XXXX-XXXX-XXXXX # これをコピーしておく

And paste it in your Bitnami Support ticket.
```

### bitnami のコミュニティに問い合わせる
https://community.bitnami.com/

投稿の際に診断ツールのコードを聞かれるので貼り付けること。

もちろん内容は英語で書かないといけないのですがそこはエンジニア必須スキルなので頑張りましょう。

以上です。
非同期通信時 POSTではなくGET呼び出しになる

#はじめに
非同期通信を使用して、○○.js.erbを呼び出して、javascriptの処理を実行させるため、以下のように処理を書いた。
postメソッドを指定したが、なぜかgetメソッドで呼び出されてしまい、○○.js.erbではなく○○.html.erbが呼び出された。

```erb:test.html.erb
<%= link_to "ボタン", hoge_path(1), id: "btn", method: :post, remote: true %>
```

#解決方法
以下をapplication.htmlのヘッダーへ追加

```
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
```

```erb:application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>hoge</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= stylesheet_link_tag 'https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> <!-- 追記 -->
  </head>
・
・
・
</html>
```

#まとめ
非同期通信を実現するために必要なライブラリを読み込む必要があるが
それを読み込む記述がapplication.html.erbから漏れていた。



#参考
https://qiita.com/yuukinakamura0925/items/d4c7ee7b705c934f0e4f

https://www.inodev.jp/entry/2019/12/03/234210
Red Hat OpenShift on IBM Cloudでプライベートネットワーク使用時にSysdig Agentのインストールが失敗する件の対応方法

# 事象

Red Hat OpenShift on IBM Cloud（ROKS）をプライベートオンリーなVPCにデプロイしたとき、手順に従ってSysdigエージェントをインストールするとPodの起動に失敗します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/d91fe89c-c6a1-2ca2-a510-5e68f9563034.png)

```
$ oc get pods -n ibm-observe | grep sysdig
NAME                 READY   STATUS              RESTARTS   AGE
sysdig-agent-48csw   0/1     ContainerCreating   0          73s
sysdig-agent-4lq47   0/1     ErrImagePull        0          73s
sysdig-agent-ld498   0/1     ImagePullBackOff    0          73s
```

# 原因

sysdig-agentのイメージを外部のquay.ioから取得しようとしているためです。プライベートオンリーでは外部と通信できないため、タイムアウトが発生しています。

```
$ oc describe pod sysdig-agent-4lq47 -n ibm-observe
（略）
Events:
  Type     Reason     Age                 From               Message
  ----     ------     ----                ----               -------
  Normal   Scheduled  110s                default-scheduler  Successfully assigned ibm-observe/sysdig-agent-4lq47 to 10.244.67.6
  Warning  Failed     49s                 kubelet            Failed to pull image "quay.io/sysdig/agent": rpc error: code = Unknown desc = error pinging docker registry quay.io: Get "https://quay.io/v2/": dial tcp 34.224.196.162:443: i/o timeout
  Warning  Failed     49s                 kubelet            Error: ErrImagePull
  Normal   BackOff    49s                 kubelet            Back-off pulling image "quay.io/sysdig/agent"
  Warning  Failed     49s                 kubelet            Error: ImagePullBackOff
  Normal   Pulling    34s (x2 over 109s)  kubelet            Pulling image "quay.io/sysdig/agent"
```

# 根本原因

残念ながらIBM Cloudが提供しているインストールスクリプトの不具合です。修正はリクエスト済です。

# 暫定対応

イメージを``icr.io/ext/sysdig/agent:latest``に手動で修正します。

```
$ oc patch daemonset/sysdig-agent -p '{"spec": {"template": {"spec": {"containers": [{"name": "sysdig-agent", "image": "icr.io/ext/sysdig/agent:latest"}]}}}}' -n ibm-observe
```

しばらく待つとRunningになります。

```
$ oc get pods -n ibm-observe | grep sysdig
sysdig-agent-9fz6q   1/1     Running   0          2m2s
sysdig-agent-fxnm6   1/1     Running   0          2m1s
sysdig-agent-v9pdh   1/1     Running   0          118s
```
Markdownでスクショ画像を貼り付ける　(VS Code)

githubや引き継ぎ書類などでmarkdownを利用している多くの方々が思っているであろう**スクリーンショットを貼り付けたい**と言う願望をあっさり叶えてくれる！！そんな機能がVSCodeにはある！！

# *Paste Image*
VSCodeの[拡張機能][pasteimg]である**Paste Image**を利用することであっさり実現できる。
使い方はいたってかんたん。

https://marketplace.visualstudio.com/items?itemName=mushan.vscode-paste-image

1. Installを行う
1. 使いたい画像をスクリーンショットする(windows: win+shift+S, Mac: Cmd+Shift+5)
1. MarkDown内の貼りたい場所でWindows: Ctrl+Alt+V Mac: Cmd+Alt+V
1. 設定したフォルダに画像が保存され、そのパスへの参照が挿入される
[pasteimg]:https://marketplace.visualstudio.com/items?itemName=mushan.vscode-paste-image

画像のファイル名は'タイムスタンプ.png'がデフォルトになる。

# おすすめ*Paste Image*の設定

デフォルトの設定では、MarkDownファイルがあるディレクトリにそのまま画像が保存されていく。これはあまりきれいとは言えないと個人的には感じている。そのため、保存先のディレクトリや保存時のファイル名などを変更していく。設定の変更の仕方を解説していく。まずはVSCode左下の歯車をクリックし設定を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493254/7774ee58-aaab-0ae3-dd36-e40cfb0eb5a0.png)

設定をひらいたあと右上にある下の画像の赤枠で囲んでいるアイコンをクリック。すると'setting.json'を開くことができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493254/f966b8b3-66ff-c747-2a5d-ee68016c066f.png)

その中に下記の設定を追加する。

```
//Markdownの設定
// デフォルトのファイル名の頭にmarkdown名をつける
"pasteImage.namePrefix": "${currentFileNameWithoutExt}_",
//保存したいディレクトリの設定。※"${currentFileDir}"はマークダウンファイルがあるディレクトリを指す
"pasteImage.path": "${currentFileDir}/img",
//pathの調整
"pasteImage.prefix":"./", 
// ペースト時にファイル名を尋ねる設定
"pasteImage.showFilePathConfirmInputBox":true,
"pasteImage.filePathConfirmInputBoxMode":"onlyName",
```

# 最後に

楽しいマークダウンライフを！！
rails+gem rinkuで改行ありの自動リンク

# この記事の概要

- rails
- rinku（ https://github.com/vmg/rinku ）


上記で改行ありで投稿されたテキストのリンク部分を自動でリンク化

# gemのinstall

```
gem 'rinku'
```

# 改行について

```
<%= raw Rinku.auto_link(safe_join(@plan.description.split("\n"),tag(:br)) %>
```

- scriptを含んでいたら嫌なのでhでエスケープ
- 自動エスケープ無しで出力したいのでraw。これがないと自動エスケープされてタグが見える形になる

```
safe_join(@plan.description.split("\n"),tag(:br)
```

上記にしているのは単純にsimple_formatだと連続改行が反映されないため

# 別タブで開くようにする

```
Rinku.auto_link(text, :all, 'target="_blank"')
```

上記で別タブで開くようになる。それぞれ下記の意味。

| 用語 | 意味 |
|:-:|:-:|
|  text |  変換したい文字列かhtml |
|  mode | :all,:urls,::email_adressを指定し、変換したいものを選択  |
STM32F3 SysTickについて

もともとは同僚から「マイコンなら標準のタイマーの一つはもっているはずだ」と言われたことから始まっています。調べて，自分の覚書としてまとめてみた。

動作確認のため，以下の環境を使いました。

- NUCLEO-F303K8 CPUはSTM32F303K8
- STM32CubeIDE 1.7.0 ( for mac )
- HALライブラリー


# 基本

- SysTickカウンターが回っている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/519f0108-ca74-af22-10b0-c6469ed8148f.png)

ここではSysTick - STCVR - CURRENT が， 周波数 **HCLK** でカウントダウンされる。

私のテストプロジェクトでは， HSI(8MHz) * 8 = HCLK(64MHz)となっている。

- カウンターが0になると，SysTick - STRVR - RELOAD 値に戻される。同時に割り込みが発生する。

上記では 0xf9ff(=63999)なので， (0xf9ff + 1) / 64MHz = **1msec ごとに割り込みが発生している。**

HALライブラリーを使う今回のプロジェクトでは， ```SysTick_Handler(void)``` がコールされる。実態は **stm32f3xx_it.c** に記載されている。

- ```HAL_Delay()``` はこれを使っている。また ```HAL_GetTick()``` は，これを使ってカウントして，起動後からの時間を msec で得ることができる。

- 現在の SysTick値を読むこともできる。

```cpp
printf("HAL_GetTick = %d.  ",HAL_GetTick());
printf("SysTick_VAL = %d.\r\n",SysTick->VAL);
```

# 割り込み周期を変えるとき

- ```SysTick->LOAD``` に直接代入しても良いし， ```HAL_SYSTICK_Config()``` を使っても良い。（後者は割り込みのセット等も行なっている）

```cpp
HAL_SYSTICK_Config(SystemCoreClock/2); // Systick interrupt to 1/2 sec 
```

当然 HAL_Delay() も影響を受けるので注意。

# 割り込んだ時のコードを追加したい時

main.c じゃなくて，まずは stm32f3xx_it.c に追記します。

```cpp:stm32f3xx_it.c
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  /* USER CODE BEGIN SysTick_IRQn 1 */  
  HAL_SYSTICK_Callback();// ここを追加
  /* USER CODE END SysTick_IRQn 1 */
}
```

んでmain.cに追記します。

```cpp:main.c
void HAL_SYSTICK_Callback() {
          HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);
}
```

```HAL_SYSTICK_Callback()``` をmain.cで再定義することになります。

参考

```cpp:stm32f3xx_hal_cortex.c
void HAL_SYSTICK_IRQHandler(void)
{
  HAL_SYSTICK_Callback();
}

/**                                                                                                 
  * @brief  SYSTICK callback.                                                                       
  * @retval None                                                                                    
  */
__weak void HAL_SYSTICK_Callback(void)
{
  /* NOTE : This function Should not be modified, when the callback is needed,                      
            the HAL_SYSTICK_Callback could be implemented in the user file                          
   */
}
```

参考 PIOのSTM32では， ```SysTick_Handler()``` は main.c に記載されているので，ちょっとわかりやすい。

```cpp:main.c
#include "stm32f3xx_hal.h"

void SysTick_Handler(void)
{
  HAL_IncTick();
  HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);
}

int main(void)
{
  HAL_Init();

  // init PB3

  __HAL_RCC_GPIOB_CLK_ENABLE();
  GPIO_InitTypeDef GPIO_InitStruct;
  GPIO_InitStruct.Pin = GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  HAL_SYSTICK_Config(SystemCoreClock/3 - 1); // call SysTick_Handler(void) every 1/3 seconds

  while (1)
  {
  }
}
```

参考URL

http://innomatic.blogspot.com/2017/12/a-simple-stm32-example-project.html
js canvas画像と図形を連射して表示されないときのオチ

![Screenshot from 2021-09-18 16-04-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1161923/555aade2-25df-fd85-f2fb-4995993dbb4b.png)
##要約
結論からいうと画像の読み込みは一瞬では終わらないのでonload後に描くよう意識しないとダメよってだけの話です。

##問題
画像を表示させてその裏側に円を付けたいと思った私がいます。画像はcanvasのdrawImage()で、円はcanvasのarc()で描きます。しかし、これを正直に書くだけでは<B>ループして連発する際</B>に上手く行かないんですね。これの解決策を備忘録で残します。

##問題のコード
```js
  const canvas=document.createElement("canvas");
    canvas.width = 600;
    canvas.id = "FieldCanvas";
    canvas.height = 400;
    const ctx = canvas.getContext("2d");
 document.getElementById("main").appendChild(canvas);
//ここまでキャンバスを用意するための前置き
  ctx.beginPath();   
    for(let yoko=0;yoko<10;yoko++){
          let img=new Image(15,15);
          img.src="./imgbox/magicCamp.svg";
          ctx.arc(yoko*15*2+15,15,15,0,2*Math.PI);
          ctx.fill();
          ctx.drawImage(img,yoko*15*2,0,30,30);
          }
   ctx.closePath();
```

###出力1 画像が描かれない
![Screenshot from 2021-09-18 16-05-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1161923/c813d980-094a-80fe-c62c-c336180e6685.png)


赤い魔法陣の画像も現れるはずなんだが、.arc()で描いた緑円しかない。drawImageは完全に忘れ去られているようだ。。

##解決方法
画像読み込みができてないのにfor文が次の描画に走ってしまうからdrawImageが無視されてしまっている模様。ならば.onloadイベントを用意すれば良いのでは？

```js
//描画部分のみ
 ctx.beginPath();   
 var img=new Image(15,15);
   for(let yoko=0;yoko<10;yoko++){
         img.src="./imgbox/magicCamp.svg";
         ctx.arc(yoko*15*2+15,15,15,0,2*Math.PI);
         ctx.fill();
           img.onload=()=>{
           ctx.drawImage(img,yoko*15*2,0,30,30);
           }
         }
   ctx.closePath();
```

ちなみにfor文の「let yoko」をvarで宣言すると円は正常に出るが、画像は全て最後のyoko座標で出るので、忘れるなよ私。。

###出力2　画像も一緒に載る
![Screenshot from 2021-09-18 16-04-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1161923/9606561c-7d3d-ac91-54c2-e5145e2fad30.png)

##もう少し安定的な策
画像の描画は「onload」完了後にする、でとりあえず解決なのだが、そこそこ複雑なコードで組んでみると再び表示が不安定になることがあった。当時はonloadの発火の後で円も含めて全ての描画をするように変更したら上手くいったが原因はよくわからない。この辺について、詳しくなったら追記したいと思う。

 ```js
//onload()の中に画像以外の描画処理もまとめる。こっちのほうがましか？
 for(let yoko=0;yoko<10;yoko++){
       var img=new Image();
        img.src="./imgbox/magicCamp.svg";
      	img.onload=()=>{
           ctx.fillStyle="#ff6";
           ctx.beginPath();
           ctx.arc(yoko*15*2+15,15,15,0,2*Math.PI);
           ctx.fill();
           ctx.closePath();    
           ctx.drawImage(img,yoko*15*2,0,30,30);
        }
 }
```
AzureとIoT (2) - Azure IoT Centralはどうですか？


# はじめに

「Azure IoT Hubと出会い」の記事で、クラウドとIoT、そしてエッジコンピュータについて触れました。読んでいない方は、先に下記リンクの記事を一読することをお勧めします。

https://qiita.com/motoJinC25/items/4b2315a01b70f4ee6a08

# クラウドとは何から始めれば良い？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/68298621-241a-fe0a-5df3-e0d053b14755.png)
[イメージ Azure Charts](https://azurecharts.com/overview)

上記は、クラウドコンピューティングのサービスを提供しているAzureクラウドのサービス概要です。アイコンの中の文字が小さくて読みにくいと思いますが、4K解像度でブラウザのズームを65%まで調整すれば全てのサービスが一つ画面で確認することができます。
各サービスがどのカテゴリーに属しているか、逆に各カテゴリーがどのサービスに属しているかを把握できますが、まず「SaaS、PaaS、IaaS」というクラウド用語を理解しておく必要があります。各サービスがどの分類にされているかによって、できることやできないことが明確に把握できます。

「SaaS、PaaS、IaaS」というクラウド用語は、いまさら人に聞けない用語の一つです。とはいえ、検索してみると山ほど情報が溢れていますので、説明は割愛し、関連イメージのみ貼り付けておきます。

![image](https://dachou.github.io/assets/20180928-cloud-service-models-20110226.png)
[イメージ Cloud Service Models (IaaS, PaaS, SaaS) Diagram](https://dachou.github.io/2018/09/28/cloud-service-models.html)

最近は「SaaS、PaaS、IaaS」の3つの分類だけでは足りなくなり、いろんな分類用語が出ていますが、とりあえず上記の用語をしっかり理解しておけば他の関連用語を理解することは難しくありません。

# IoTサービスの候補リスト

AzureクラウドでIoTの起点となるのが「[Azure IoT Hub](https://azure.microsoft.com/ja-jp/services/iot-hub/#overview)」です。Azure IoT Hubを使うことでIoTデバイスはもちろん、IoTエッジデバイスに対して様々なシナリオを実現できるサービスを提供しています。サービス分類ではPaaSに属しているため、どうしても開発コストが発生します。もっと手っ取り早くスタートできるIoTサービスとして、「[Azure IoT Central](https://azure.microsoft.com/ja-jp/services/iot-central/)」があります。サービス分類ではSaaSに属していますが、PaaSやIaasとしても使える汎用IoTサービスです。IoTデータを可視化したいとき、Azure IoT Hubだとクラウドまで上がったテレメトリーデータを可視化することはできず、他の可視化サービスを使わなければいけません。Azure IoT Centralだとある程度カスタマイズできる可視化機能が含まれています。
素早くシステムを立ち上げて動かしたいお客様には、まずAzure IoT Centralで構築して運用し、必要に応じてAzure IoT Hubに移行することを提案しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/e3af01ad-e5e2-075b-17a4-f481810a4ea8.png)

# まずは試してみてはいかがでしょうか？

どちらも無料で試すことができます！

Azure IoT HubはFreeプランが提供されています。下記のイメージのように価格設定で「F1」を選択して作成してください。ただし、クラウドと送受信できる量は1日8,000メッセージまでに制限されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/5e87e6e3-5831-a904-d8b0-c04b5ee078d3.png)

Azure IoT Centralは複数のFreeプランが提供されています。使用期間、デバイス数、メッセージ送受信量に差があるので、自身に適したものを選んでください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/e323f5d1-ac19-97ce-db8c-8f41674a88fe.png)

# 最後に

Azure IoT HubとAzure IoT CentralのどちらでもIoTを始められます。そしてエッジコンピューティング環境まで拡大することもできます。
「誰かに相談しながらやってみたい。」という方は、[弊社](https://www.microsoft.com/ja-jp/solution-providers/partnerdetails/%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%83%A2%E3%83%88%E3%82%B8%E3%83%B3%E3%83%BB%E3%83%89%E3%83%83%E3%83%88%E3%83%BB%E3%82%B3%E3%83%A0_d455cebe-7b67-4c3c-a751-1627e815f70a/d733420a-c81b-4edf-aef5-fa69bad24d52)や[Azureクラウドパートナー](https://www.microsoft.com/ja-jp/solution-providers/home)に相談するのが良いでしょう。Azureの使用量（費用）によっては[マイクロソフトのAzureクラウド営業](https://azure.microsoft.com/ja-jp/overview/contact-azure-sales)の方から直接サポートを受けることもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/1c0cb330-7345-603b-bd6f-84ad2a1b2694.png)

:::note info
この記事はエッジコンピューティングとクラウドコンピューティング環境を備えて皆さんにかかわっている環境でイノベーションができるようなヒントになる記事になることを願ってます。
:::
「”すぐ” このデータまとめて欲しい」に ”すぐ”に超簡単に応えられる Python の・・・（Sweetviz編）

### ～手元データの要約、視覚化を超簡単に実現して、探索的データ解析(EDA)しよう（Sweetviz編）～
![sweetviz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/31023cdc-8bb4-1bd0-960a-55142eadc220.png)


>[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/hima2b4/Auto_Profiling/blob/master/Auto_Sweetviz.ipynb)
※クリックでGoogle Colab起動。ランタイム実行、[ファイル選択] でcsvファイル指定


 
## はじめに
　
「おい、悪いが”すぐに”このデータまとめてくれ」
　
このくだりので始める、探索的データ分析(EDA)を支援してくれるプロファイリングライブラリの紹介は3回目を迎えました。

今回は **Sweetviz** というライブラリを紹介します。

このライブラリはとにかくシンプルで、速攻でレポートが出力されます。
EDAの初手としてよいのではないでしょうか。


## 実行条件など
>・**Google colab**で実行
・**ボストン住宅価格のデータセット**で実行
※手元データを読込んで実行する場合も記載していますので、簡単にできるはずです。
 
https://toukei-lab.com/google-colaboratory


### ボストン住宅価格のデータセットについて

以下サイト（Kaggle）の「Boston.csv」を使わせていただいた。
データ数：506, 項目数：14のデータセットで、住宅価格を示す「MEDV」という項目と、住宅価格に関連するであろう項目が「CRIM：犯罪率」「RM：部屋数」「B：町の黒人割合」「RAD：高速のアクセス性」・・・等、13項目で構成されたデータとなっています。

これだけ項目があると、データ傾向を掴むだけでも、なかなか骨が折れるだろうと想像できますね。

https://www.kaggle.com/puxama/bostoncsv

<details><summary>ボストン住宅価格データの項目と内容</summary><div>

>|項目|内容|
|:-----------|:------------------|
|CRIM|町ごとの一人当たり犯罪率|
|ZN|25,000平方フィート以上の住宅地の割合|
|INDUS|町ごとの非小売業の面積の割合|
|CHAS|チャールズ川のダミー変数（川に接している場合は1、そうでない場合は0）|
|NOX|窒素酸化物濃度（1,000万分の1）|
|RM|1住戸あたりの平均部屋数|
|AGE|1940年以前に建てられた持ち家の割合|
|DIS|ボストンの5つの雇用中心地までの距離の加重平均|
|RAD|高速道路(放射状)へのアクセス性を示す指標|
|TAX|10,000ドルあたりの固定資産税の税率|
|PTRATIO|町ごとの生徒数と教師数の比率|
|B|町ごとの黒人の割合|
|LSTAT|人口の下層階級の比率|
|MEDV|住宅価格の中央値（1000㌦単位）|

</div></details>


## プロファイリング（Sweetviz）してみよう！

**ライブラリのインストールおよびインポート**

```:ライブラリのインストールおよびインポート
pip install sweetviz
```
```
# 必要なライブラリーのインポート
import pandas as pd
import sweetviz as sv

```
```
# データセットの読込み
df = pd.read_csv("Boston.csv",index_col=0)
df.head()
```
```
#dfに対してSweetvizを適用
sweet_report = sv.analyze(df)
 
#結果をhtmlへ保存
sweet_report.show_html('sweetviz_report.html')
```


## 出力イメージ
Sweetvizは実行が完了すると、レポートをhtml形式で出力されます。
これをブラウザで読むと、閲覧・操作ができます。
プロファイルの結果はシンプルです。データ量が多くてもストレスなく実行できるでしょう。

画面上の [ASSOCIATION] ボタンをクリックすると、画面右に相関マトリクスが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/f3189e0f-ff9c-27dc-20c7-c9ed54fa7b36.png)

それぞれの変数をクリックすると、画面右にヒストグラムや他の変数との相関係数が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/524e09ff-6995-c1e0-141d-d1b1d1b90e6a.png)



## 関連記事

https://qiita.com/hima2b4/items/65129b3c3c4a1090afae

https://qiita.com/hima2b4/items/da29530c1f58c7211d44



## 参考サイト

https://hazimenoippo-hawaii.com/datascience-ml-eda-3rd/

https://qiita.com/DS27/items/17a5fb9155a768ff9528

https://towardsdatascience.com/powerful-eda-exploratory-data-analysis-in-just-two-lines-of-code-using-sweetviz-6c943d32f34
ABC163 C - management から学んだ

https://atcoder.jp/contests/abc163/tasks/abc163_c

![ABC163_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/d5e4ab19-ddad-d102-1bec-aa9d7264afb3.png)

続いてサンプル。

![ABC163_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/d8fb7ec7-140d-aebd-b004-afa1f3e3ae9b.png)
![ABC163_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/acee4ce6-3d69-ff51-0b9b-16cf5cccb315.png)
![ABC163_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/2d1b2070-4db3-4f79-ef1b-af483ac3d439.png)

社員番号の数だけ配列を用意してみるか。
Ai で call された社員番号のセルを 1 ずつインクリメントすれば良いのでは？

```management.py
N = int(input())
A = list(map(int,input().split()))
lis = [0]*(N+1)
 
for i in range(2,N+1):#計算量 ほぼ O(N)
    lis[A[i-2]] += 1
 
for i in range(1,len(lis)):#計算量 O(N)
    print(lis[i])

#計算量の合計 O(2N)。 間に合う
#131ms
```

***

再チャレンジ。
出来たけどおもろい記述があったのでパクってみました。

```abc163c.py
def solv():
    N = int(input())
    A = list(map(int,input().split()))
    memo = [0]*N
    for a in A:
        memo[a-1] += 1
    print("\n".join(map(str,memo)))#<=パクった
    #for ans in memo: #<=パクる前の記述
    #    print(ans)
solv()#111ms
```

各要素を文字に変換して
かつ、間に改行の記述を挟むことで
for を省略している。素晴らしい。
グローバルIPアドレスとプライベートIPアドレス

グローバルIPアドレスとプライベートIPアドレスの違いや、なぜ必要なのか？というところが分からなかったので、調べてまとめてみました。

～まずは、なぜ必要なのか？その理由について～

## IPアドレス枯渇問題
現在、IPアドレス（IPv4）は、インターネット上で割り当てられるIPアドレスの
数に限界がきており、IPv6の導入が進められています。
この、限界がきている状況をIPアドレス枯渇問題といいます。

**IPv4の容量**

![](https://i.imgur.com/2wIMRpQ.png)

**IPv6の容量**
![](https://i.imgur.com/g7xmWm7.png)




IPv6の容量は、実質無制限であり、この枯渇問題を回避することができます。

**しかし、もう1つ方法があります！**
それが、グローバルIPアドレスとプライベートIPアドレスです。

***

## グローバルIPアドレスとプライベートIPアドレスとは？
ネットワークごとにIPアドレスを渡して、IPアドレスを節約するのが目的。
- **グローバルIPアドレスとは**
⇒インターネットに接続するタイプ。
インターネットを利用する際に、割り振られるIPアドレスの事。

- **プライベートIPアドレス（ローカルIPアドレス）とは**
⇒インターネットに接続しないタイプ。（LAN内で使用）
家庭内のネットワークにあるパソコンなどに付与されているIPアドレスが、プライベートIPアドレス。**プライベートIPアドレスは、直接インターネットに接続することができません。**

そこで、NATという機能を使います！

***
## NATとは？？
プライベートIPアドレスをグローバルIPアドレスに変換する機能。プライベートIPアドレスは、インターネットに直接接続することができないので、NATを使って、プライベートIPアドレスをグローバルIPアドレスに変換して、インターネットに接続できるようにします。



### まとめ

IPアドレスの枯渇問題を回避する為に、IPアドレスの節約を目的としたのが、グローバルIPアドレスとプライベートIPアドレス。
それぞれの違いは、おおまかに、インターネットに接続するかしないかという事が分かった。
[sed]【一行野郎】「コメント『#』のみ」「空行」「スペースのみ」を取り除く


:::note info
コメント欄にて egrep コマンドでさらに要領良く実現する方法を教えていただきました.
ありがとうございました.
:::

## 概要

次の 3つを取り除いて表示するという頻出処理. 
頭の記憶領域が勿体無いので書き出しておく.

・コメントのみの行 (「#」以降はコメントとする)
・空白のみの行 (半角スペース、タブスペース)
・空行

```bash
$ sed -r -e '/^([[:space:]]*)#/d' -e '/^([[:space:]]*)$/d' <ファイル>
```


仕方なく純粋な実装行数のみを抽出する場合に使えるかも知れない.

以上.
ポート番号とTCP/UDPの理解

TCPとUDPについて深堀したので、いろいろなサイトとYouTube動画を参考に、まとめてみました。

参考記事
[ネットワークエンジニアとして](https://www.infraexpert.com/study/tcpip7.html)
[ポート番号とは？と代表的なポート番号まとめ
](https://eng-entrance.com/network-port)


| 目次 | 
| -------- | 
| ポート番号とは？ | 
| ポート番号の種類  |
|主なプロトコルとポート番号一覧 |
|「TCP」とは？ |
|-スリーウェイハンドシェイクとは？ |
|-「TCP」関連知識 |
|「UDP」とは？
|「TCP」と「UDP」の違いまとめ |

## ポート番号とは？

通信をする際、送信側にも受信側にもたくさんのアプリケーションが入っている為、
どのアプリケーションからどのアプリケーションまで送るかを特定するための番号。
16ビットの整数（0～65535）で定義されます。

#### ポート番号の種類
![](https://i.imgur.com/JBPCwGt.png)


#### 主なプロトコルとポート番号
![](https://i.imgur.com/c8cdN4A.png)

***

## 「TCP」「UDP」とは？仕組みと違いについて
TCP/UDPとは、OSI参照モデルのレイヤー4：**トランスポート層の代表的なプロトコル**です。
（OSI参照モデルについては、「[ファイアウォールの役割/OSI参照モデルまとめ](https://qiita.com/mika777/items/fb1a0ed5a3a5b00763f6)」を参照）
トランスポート層では、**どのように通信をするか**ということを決めていきます。
（通信方法、通信状態の確認方法、異常発生時の対処方法など）


TCP や UDP を使うことで、ある**1 台のサーバの 1 つの IP アドレスで、複数のサービス(http/dns/SMTP 等)を提供できる**ようになります。
また、この機能を「セッションの多重化」といいます。

TCPとUDPをそれぞれ深掘りしていきます。

***

## TCP(Transmission Control Protocol)とは〜信頼性を重視〜
- 信頼性の高い通信を実現するために使用されるプロトコルです。
- 信頼性を高めるために、送信元＆宛先双方で状況を確認し合いながら
通信を行います。**（コネクション型と言います）**
- 送信データは、セグメント（パケット）という単位に分割されます。

![](https://i.imgur.com/ChrHC2d.png)




### 合わせて覚えたい「スリーウェイハンドシェイク」

TCPは、通信する前、コネクション(接続)を確立する為に、必ず双方(送信元と宛先)で情報の確認のやりとりをします。これをスリーウェイハンドシェイクと言います。

**3つのステップ**
1. 送信側が受信側に、「SYN：1」でセグメント（パケット）を送信。（通信したいことを伝える）
2. 受信側が送信側に、「ACK：1、SYN：1」でセグメントを送り返す。（通信OKの意思と、受信側からも通信したいことを伝える）
3. 送信側が受信側に、「ACK：1」を送り返す。（送信側も通信OKの意思を伝える）
![](https://i.imgur.com/EHyr4eM.png)



## ～関連知識～

#### ◆制御ビット

| ビット名 | 意味 |
| -------- | --------- | 
| URG(Urgent) | 急ぎで処理すべきデータ |
| ACK(Acknowledgement) | 確認応答番号のフィールドが有効（データが正常に届いたかを表す） |
| PSH(PUSH) | 受信したデータを即時にアプリケーション層（上位）に渡す |
| RST(Reset) | コネクションを強制終了する。異常の検出。 |
| SYN(Synchronize) | コネクションの確立を要求 |
| FIN(Finish) | コネクションの終了を要求 |



#### ◆セッションとコネクションの違い
セッションは、通信の開始から終了までを管理する１つの単位のことで、コネクションは、セッションでデータ転送を行うための回線のこと。（道筋のようなもの）

#### ◆PDUとは
Protocol Data Unit(プロトコル・データ・ユニット)の略で、通信におけるデータ単位のこと

#### ◆データ単位：パケットについて
データを小分けにして送るという意味があるので、どの層のPDUなのか？に関わらず、データ単位をパケットと呼ぶことが多い。


***

## UDP(User Datagram Protocol)とは〜スピードを重視〜

- 信頼性を考慮せず、送信データの制御や管理といった概念が一切ないプロトコルです。
- 指定されたポート番号に、何も考えずにデータを送ります。**（コネクションレス型と言います。）**
- TCPとは扱うデータも異なり、データグラムという単位に分割されます。
- 処理の不可が小さい為、スピードが速いのが特徴です。IP電話や動画ストリーミングなど小さいデータの転送で活躍します。
![](https://i.imgur.com/ezxsnDL.png)


## TCPとUDPの違いまとめ
![](https://i.imgur.com/MiUaZK2.png)