OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】WEBスクレイピングした結果をエクセルに出力してみた

## 概要
pythonでWEBスクレイピングした結果をエクセルに出力する処理を作ってみました。

## 前提条件
Pythonが既にインストールされていること。
「openpyxl」がインストールされていること。
（<a href="https://qiita.com/tamago_pinoko/items/dc28c13fb0713d0f57b5">【Python】エクセルの入力内容の読み込みと書き出しをしてみた</a>の続編です。）

## requestsとbeautifulsoup4の導入
コンソールを開いて下記のコマンドを実行して「requests」と「beautifulsoup4」をインストールする。
```
pip install requests
pip install beautifulsoup4
```

## WEBスクレイピングの実装
作成したWEBスクレイピングのプログラムは下記になります。

```py
import requests
from bs4 import BeautifulSoup
import openpyxl

#最初の情報を取ったかのフラグ
kaisyaflg = 0
zyuusyaflg = 0

# 「テスト用.xlsx」を開く
wb = openpyxl.load_workbook('./テスト用.xlsx')

# 開くシートを指定
sheet = wb['シート1']

#2行、1列目のセルに入力されている内容を読み込む
value = sheet.cell(row=2, column=1).value

url = value

html = requests.get(url)
soup = BeautifulSoup(html.content, "html.parser")

# すべてのddタグを検索して、その文字列を表示する
for element in soup.find_all("dd"):
    #「株式会社」が含まれていたら出力
    if '株式会社' in element.text:
        if(kaisyaflg == 0):
            print(element.text.strip())
            kaisyaflg = 1
            #2列、2行目のセルに会社名を書き込む
            sheet.cell(row=2, column=2).value = element.text.strip()
            
    #「〒」が含まれていたら出力
    elif '〒' in element.text:
        if(zyuusyaflg ==  0):
            #「〒」の文字が左から何番目に出現するかを出力（0が最初）
            a = element.text.find('〒')
            
            #2行、3列目のセルに郵便番号を書き込む
            sheet.cell(row=2, column=3).value = element.text[a+1:a+9].strip()
            #「〒」の文字が出た所の次から8番目まで取得
            print(element.text[a+1:a+9].strip())

            #2行、4列目のセルに住所を書き込む
            sheet.cell(row=2, column=4).value = element.text[a+10:].strip()
            #「〒」の文字が出た所の9番目以降を取得
            print(element.text[a+10:].strip())

            zyuusyaflg = 1

# 「テスト用.xlsx」に書き込んだ内容を保存する
wb.save('./テスト用.xlsx')

# 「テスト用.xlsx」を閉じる
wb.close()

```
■処理内容
エクセルの処理については前回の記事で説明したので割愛します。
エクセルの2行、1列目に記載しているURLのHTML内容を下記で取得してきています。
`html = requests.get(url)`

取得したHTMLの内容を下記でデータの抽出をするための要素に格納します。
`soup = BeautifulSoup(html.content, "html.parser")`

`<dd>`タグのものを１つだけでなくすべて取得するために下記FOR文でHTMLの行数分検索して対象の行を取得しています。
`for element in soup.find_all("dd"):`

`<dd>`タグで「株式会社」または「〒」が含まれていたら取得するようにif文で制御してます。
実行テストで使用したQiitaはグループ会社の情報も含まれていたため、本社の情報だけ取得するために
`kaisyaflg`と`zyuusyaflg `のフラグを用意してます。
また、取得項目に改行が含まれていたため、取得した文字列に`strip()`を追加して改行コードを削除しています。

## 実行結果
実行前のエクセルは下記になります。
■エクセル
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056482/83a2f7aa-6c3f-5818-35fd-18c67949c628.png)

実行した結果は以下のようになります。
■コンソール結果
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056482/fd56ada6-33b9-5c14-e18b-6a1afb17ef22.png)

■エクセル
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056482/2cf786e5-29f8-494e-5841-a5853e164bcd.png)
Linux コマンドラインの編集に慣れよう！覚えるべきショートカット集～

## はじめに

みなさんは、linuxをコマンド操作する場合に、ショートカットキーを使用していますか？例えば、文字の削除は、「Backspaceキー」（もしくは 「Deleteキー」）、 カーソルの移動は、「カーソルキー」を使用している方が非常に多いと思います。
もちろんそれでも良いですが、ショートカットを使いこなせば、作業の効率化にも繋がります。そして**女性社員から「カッコいい！」なんて思われるかも**しれません！(・・・ない。)

いきなり本記事で紹介する全てを身につけるのは難しいと思いますが、日々使っていくことで徐々に慣れていきましょう！

---

## ショートカットキー一覧

### カーソルの移動

| キーの操作 | 説明 |備考（参考）|
|:-----------|:------------|:------------|
| Ctrl + A  | カーソルを行の先頭に移動 |Aは、Ahead（前方へ(に)、先へ（に））の意味
| Ctrl + E  | カーソルを行の最後に移動 |Eは、End（終わり、最後）の意味
| Ctrl + B  | カーソルをひとつ前（左側）に移動 |Bは、Backward(後方(へ)の、戻りの、後ろへの)の意味|
| Ctrl + F  | カーソルをひとつ後ろ（右側）に移動 |Fは、前方へ、先へ(進んで)の意味|
| Esc + B or Alt + B | カーソルを1単語左に移動 |
| Esc + F or Alt + F | カーソルを1単語右に移動 |



### 文字の削除

| キーの操作 | 説明 |備考（参考）|
|:-----------|:------------|:------------|
| Ctrl + H 　| カーソルの前（左側）の文字を削除 |
| Ctrl + D   | カーソルの位置にある文字を削除  |
| Ctrl + K   | カーソルの位置から行の最後までの文字を削除 |
| Ctrl + U   | カーソルの位置から行の先頭までの文字を削除 |
| Ctrl + W   | カーソルの位置から直前の１単語を削除 |
| Ctrl + Y   | 直前に削除した文字の貼り付け | Ctrl + W, Ctrl + U, Ctrl + K　等で削除した文字の貼り付け
| Esc + D or Alt + D | カーソル位置から単語の終わりまで削除 |


### 停止および中断

| キーの操作 | 説明 |備考（参考）|
|:-----------|:------------|:------------|
| Ctrl + C   | 実行中の処理の停止 |
| Ctrl + Z   | 実行中の処理を中断 |
| Ctrl + L　 | 現在の画面表示をクリア |


### 履歴

| キーの操作 | 説明 |備考（参考）|
|:-----------|:------------|:------------|
| Ctrl + P  | 1つ前の履歴を表示
| Ctrl + N	| 1つ後ろの履歴を表示



## さいごに

いかがでしたか？自分もついついカーソルキーで無駄な動きをしてしまうことがあるので、しっかり身につけていきたいと思います！
オススメの覚え方等や是非ぜひコメント等いただければ！と思います。
【UIKit】指定した色と違う色がNavigationBarに表示される

# はじめに
UIKitは学び始めたばかりなので間違っていたり、もっと良い方法がある可能性があります。
そのような場合はコメントか編集リクエストを送ってください。

# やろうとしている事
こちらの画像をナビゲーションバーに表示して、
画像の背景と同じ色をナビゲーションバーに表示したい。
![logo-background-color.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/75c64834-258f-d210-2a21-9b16ed8a5622.png)

# 作業
まず、画像の背景のRGBを調べます。
![スクリーンショット 2022-07-09 18.35.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/46430dab-41d5-f19f-7b24-b03944e79999.png)

`rgb(85,197,0)`でした。
このRGBをナビゲーションバーに設定します
```swift
import UIKit

class NavigationViewController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationBar.barTintColor = UIColor(red: 85/255, green: 197/255, blue: 0/255, alpha: 1.0)
    }
}
```
続いて、ナビゲーションバーに画像を配置します。
```swift
import UIKit

class TabBarViewController: UITabBarController {
    var qiita: UIImageView = {
        let view = UIImageView(image: UIImage(named: "logo-background-color"))
        view.translatesAutoresizingMaskIntoConstraints = false
        view.contentMode = .scaleAspectFit
        return view
    }()
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.titleView = qiita
    }
}
```

これで完成です
ビルドしてみましょう
![Simulator Screen Shot - iPhone 12 - 2022-07-09 at 18.39.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/b6f7f496-bbcb-0cb6-7467-7e3b1fc2eff6.png)

あれ？なんで？
もしかしたらRBGサイトがおかしかったのかもしれません。
ビルド後のスクショでRGBを見てみましょう

![スクリーンショット 2022-07-09 18.43.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/f6a53191-d864-b369-7d77-a172759948f2.png)

ナビゲーションバーの色は`rgb(110,206,32)`だそうです。
これおかしいのサイトじゃなくてナビゲーションバーじゃない？
もしかして`UIColor(red:, green:, blue:, alpha:)`がバグってる？

しかし、ナビゲーションバー以外では正常に表示されます。

じゃあナビゲーションバーがおかしいじゃんという事になります。

# 原因は？
![Simulator Screen Shot - iPhone 12 - 2022-07-09 at 18.48.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/33b4fee0-fb09-696a-0774-4a83de691d1a.png)
これは推測ですが、
上の画像のようにナビゲーションバーにはデフォルトでグレーっぽい色がついています。
これの上に色を乗せているので指定した色と違う色が表示されているのではないでしょうか。

# 解決方法
```diff_swift
import UIKit

class NavigationViewController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()

-       navigationBar.barTintColor = UIColor(red: 85/255, green: 197/255, blue: 0/255, alpha: 1.0)

+       let appearance = UINavigationBarAppearance()
+       appearance.backgroundColor = UIColor(red: 85/255, green: 197/255, blue: 0/255, alpha: 1.0)
+       UINavigationBar.appearance().standardAppearance = appearance
+       UINavigationBar.appearance().compactAppearance = appearance
+       UINavigationBar.appearance().scrollEdgeAppearance = appearance

    }
}
```
![Simulator Screen Shot - iPhone 12 - 2022-07-09 at 18.55.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1f14be0e-2347-9abf-3a58-bf5b45c6dd5a.png)
このようになりました。
完璧ですね

# おわり
これはバグなのか、仕様なのか
もしかしたらナビゲーションバーの色の変え方が適切ではない可能性？？
【JavaScript】RGB HSV 相互変換 1ステートメント版

以前 [JavaScript / PHP：RGB HSV HSL 相互変換](https://qiita.com/akebi_mh/items/3377666c26071a4284ee) で書いた`hsv2rgb`、`rgb2hsv`をそれぞれ1文で記述してみたものです。

## hsv2rgb ##

引数
h: 0以上360未満の浮動小数点数,
s: 0～1の浮動小数点数,
v: 0～1の浮動小数点数

戻り値
r,g,b各値(0～255)の配列

## rgb2hsv ##

引数
r,g,b 各0～255

戻り値
h,s,vの配列

### script ###

```js:color_convert.js
'use strict';
const
hsv2rgb=(h,s,v)=>[5,3,1].map(n=>Math.round((v-Math.max(0,Math.min(1,2-Math.abs(2-(h/60+n)%6)))*s*v)*255)),
rgb2hsv=(r,g,b,a,i,v,d,s)=>[(s=(v=Math.max(...a=[+r,+g,+b,+r,+g]))&&(d=v-Math.min(...a))/v)&&(((a[(i=a.indexOf(v))+1]-a[i+2])/d+i*2+6)%6)*60,s,v/255];
```

#### example ####

```txt:
  hsv2rgb(150, 0.8, 1); // [51, 255, 153]
  rgb2hsv(240, 100, 255); // [294.1935483870967, 0.6078431372549019, 1]

  hsv2rgb( ...rgb2hsv(255, 200, 95) ); // [255, 200, 95]
  rgb2hsv( ...hsv2rgb(76, 1, 1) ); // [76, 1, 1]

  // 演算の精度や丸め処理などの影響もあり、完全な可逆とはならない場合もあります。
  rgb2hsv( ...hsv2rgb(320, 0.5, 0.9) ); // [320.34782608695656, 0.5, 0.9019607843137255]
```


#### [動作確認デモ](https://akebi.jp/temp/color_convert_2207/) ####

#### 関連ページ ####
[JavaScript / PHP： RGB HSV HSL 相互変換](https://qiita.com/akebi_mh/items/3377666c26071a4284ee)
[input要素に対して使用可能なカラーピッカーUI](https://qiita.com/akebi_mh/items/3fba059989b460eb997d)
【#25 エンジニア転職学習】DB入門　MySQLのView / Join

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

DBの入門をざっくり学習していきます。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。


https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
本日はMySQLのviewとjoinを学習しました。

* **view / join　←Topics!!**

# view / join
#### view
データを格納せずに必要な行・列を表示できる。
また、削除しても元のテーブルに影響をあたえない点がメリットです。
「どの行に対応しているか」「何の値を入れたらいいか」わからない場合はviewの更新はできません。
#### join
1つのテーブルの列だけではデータが足りない時に、他のテーブルから列を持ってくる操作。
指定したテーブルのうち、「どちらかは全行表示・もう一方は値があれば表示したい」ときは外部結合（OuterJoin）を使用する。


使用している教材はこちら↓


https://www.amazon.co.jp/%E3%81%8A%E3%81%86%E3%81%A1%E3%81%A7%E5%AD%A6%E3%81%B9%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93-%E3%83%9F%E3%83%83%E3%82%AF-ebook/dp/B00TTRZFDC/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1657112653&sr=8-1


# おわりに
最後までお読みいただきありがとうございました。
アドバイス・応援コメント等いただけますと幸いです。
styled-componentsで隣接セレクタを使用する

オブジェクトとオブジェクトの間に margin を挿入する際[^1]などに有用な**隣接セレクタ**（`foo + bar`）を styled-components で使用したい場合のメモ

- `Child.toString()` は適当なクラス名を返すため、 Wrapper に変数展開して指定する

```react
const Child = styled.li`...`;
const Wrapper = styled.ul`
  ${Child} + ${Child} {
    margin-top: 10px;
  }
`;
return (
  <Wrapper>
    {list.map((child) => <Child>{child}</Child>)};
  </Wrapper>
);
```

[^1]: 近年であれば `display: flex;` と gap を組み合わせた方がベストプラクティスな気もしますが……
【ECS】LaravelからElasticCacheに接続しようとしたら「Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP?」というエラーが出た【AWS】

## 前提情報
- PHP7.4
- Laravel 6.x
- ECS/Fargate

## エラーの原因と詳細
ローカル環境にあるredisコンテナには接続できたので、次にAWS上でElascitCacheの動作確認をするため、ECS/Fargate環境へデプロイしたら`Unable to find the socket transport “ssl” – did you forget to enable it when you configured PHP?`というエラーが発生してElasticCacheへ接続できない状況でした。

Redisクライアント(phpredis)から外部(ElasticCache)へ接続するときに、PHPのOpenSSLモジュールが有効になっていないのが原因っぽい。(Redisに限らず、外部へHTTPS接続する際にはOpenSSLモジュールを有効にしないといけないようです)

というか、そもそも[LaravelのドキュメントにOpenSSLは必須だよ](https://laravel.com/docs/9.x/deployment#server-requirements)って書いてあったのでそもそも最初から有効にされているべきものでしたね。。(リンクは9.xですが、6.xでも同じ)

## 解決方法
アプリケーションを動かしているイメージのDockerfileに`libssl-dev`と`openssl`パッケージを追加し、OpenSSLを有効にする。

```Dockerfile
FROM php:7.4-fpm

…(省略)

RUN apt-get update \
  && apt-get install -y \
  zlib1g-dev \
…(省略)
  vim \
+  libssl-dev \
+  openssl \
```

Docker環境においてPHPの拡張モジュールを有効にするとき、よく `docker-php-ext-install pdo_mysql`などと書くが、OpenSSLに関してはこのように書かなくても有効になるようです。
このあたりに関してなにか補足などありましたらコメント頂けるとうれしいです!!

## 参考サイト
https://oki2a24.com/2018/10/09/enable-openssl-in-docker-php-apache/
スタートガイド通りにCloud Functions for Firebaseを本番環境にデプロイできなかった

## はじめに
以下に沿ってCloud Functions for Firebaseをデプロイしようとしたが、いくつかエラーにひっかかったので、エラー内容と解決策を提示しておきます

https://firebase.google.com/docs/functions/get-started?hl=ja#deploy-functions-to-a-production-environment


## 1. プランが対応していない
### エラー

> Error: Your project hogehoge must be on the Blaze (pay-as-you-go) plan to complete this command. Required API cloudbuild.googleapis.com can't be enabled until the upgrade is complete. To upgrade, visit the following URL:
> https://console.firebase.google.com/project/hogehoge/usage/details

### 解決策
表示されたURLへアクセスして、Blazeプランへ変更します。
プランに関しては、以下をご参考ください。

https://firebase.google.com/pricing?hl=ja



## 2. Artifact Registry APIが有効ではない
### エラー

> https://cloudfunctions.googleapis.com/v1/projects/hogehoge/locations/us-central1/functions/helloWorld {"error":{"code":403,"message":"Cloud Functions uses Artifact Registry to store function docker images. Artifact Registry API is not enabled in your project. To enable the API, visit https://console.developers.google.com/apis/api/artifactregistry.googleapis.com/overview?project=hogehoge or use the gcloud command 'gcloud services enable artifactregistry.googleapis.com' then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.","status":"PERMISSION_DENIED"}}


### 解決策
> Cloud Functions uses Artifact Registry to store function docker images. Artifact Registry API is not enabled in your project.

とあるように、Artifact Registry APIを有効にする必要があります。提示されたURLをもとにArtifact Registry APIの管理画面に遷移して、有効にします。今回の場合は以下が提示されたURLにあたります↓

`https://console.cloud.google.com/artifacts/docker/hogehoge/us-central1/gcf-artifacts`

Artifact Registry APIに関しては以下のURLをご参考ください

https://cloud.google.com/artifact-registry/docs/overview?hl=ja

## 3. 権限がない 
### エラー
ブラウザでリクエストを飛ばすと

```
Error: Forbidden
Your client does not have permission to get URL /api from this server.
```

### 解決策
デフォルト設定では、起動元の認証が必要な場合があります。未認証の呼び出しを許可するために以下の手順で設定を行います。

https://cloud.google.com/functions/docs/securing/managing-access-iam#allowing_unauthenticated_http_function_invocation

## 終わりに
Cloud Functionsのエラー文は、次どうする、がとても分かり易かったです。
この観点は、アプリ開発者として参考にしていきます。
また、今までFirebase Hostingしか自分ではやってこなかったので、また一つできることが増えてよかったです。個人の開発だったとしても、Cloud Functions for Firebaseは簡単にデプロイできるので、試しやすいなと思いました。
次回は、Node.jsでエンドポイントを作成したいと思います。
デザインの概念についてまとめてみた初級編

# 記事の目的について
webページやアプリの画面デザインを作るにあたり、デザインに関する知識や用語を全然理解していないので、
そのあたりをまとめて、後で見やすいようにしていくのが目的です。
既に同じことをしている記事があるかもしれませんが、自分で作ると覚えが良い（と思う）ので、
学習もかねてやっていく。

最終的にはもう少しまとめていくが、まずはどんどんやってどんどん吐き出す形でやっていく。

## WEBデザインとは
・ウェブサイト全体の設計
・視覚的な要素を作成するグラフィックデザイン
・WEBサイト・アプリ等のUI設計
上記を総合して指す。

## デザインの要素
* レイアウト（全体レイアウト、コンテンツレイアウト）
* タイポグラフィ・フォント
* 配色

## 全体レイアウト
### 1カラム
１つのコンテンツに集中させる場合に有効
使用用途：ランディングページ、コーポレートサイト、ブランドサイト、キャンペーンサイトなど

### 2カラム
サイドバーにカテゴリーや関連ページなどを配置し、ユーザが関心のあるコンテンツに迷わずアクセスできるデザイン。
使用用途：ECサイト、ブログなど

### 3カラム
1度にたくさんのコンテンツを見せる場合に有効。
情報量や商品量の多さをアピールし、ワクワク感を増幅させる。
使用用途：ECサイト
例：yahoo

### グリッドレイアウト
コンテンツを一覧で多く表示させるが整っている印象を与えさせる。煩雑さがでず、クリエイティブなページを作れる。
写真とかデザイン系を一覧で表示させてるサイトでよく見かける。
例：Pinterest

## コンテンツレイアウト
レイアウトの基本原則。下記を基本は意識する。
* 近接
要素同士を近づけ、まとまった情報として見せる。
逆に異なる要素は空白で余白を作る。

* 整列
関連する要素の位置を揃える。

* 反復
同じ要素のデザインルールを繰り返す。
フォントや配置などを同じ要素でばらけさせないこと。
やりすぎると単調になるので注意

* 対比
要素同士を明確に差をつける。伝えたい情報を特に強調する。
参考にした動画内の例が分かりやすい。https://youtu.be/zuRMrEeS7_8?t=532

## タイポグラフィ・フォント

### タイポグラフィ
文字の書体・大きさ・配置の仕方

### フォント
同一書体の一揃い。書体データそのもの。
Webデザインの場合、一般的に本文のフォントはゴジック体（サンセリフ体）が使われる。
（昔の環境だと明朝体では解像度の問題で綺麗に表示されないことがあったらしく、その名残？）
* メイリオ
windowsに入っている標準フォント（ちなみに私は資料作成では全てこれを使っていた。）
* 游ゴシック
windows,mac共通
* ヒラギノ角ゴ
macに入っている標準フォント

## 配色
ベースカラー70%
アクセントカラー5%
メインカラー25%

### ベースカラーの選び方
余白や背景に使用されることが多く、メインカラーの妨げにならないカラー選定が必要。
一般的には白や薄いグレーなどが多い。

### メインカラーの選び方
ブランドカラーとなる色や、ターゲットユーザが好む色など。
色の意味や印象を把握しながら選定。

### アクセントカラーの選び方
メインカラーのみだと単調になるため、メリハリをつけるために目立つ色を使用。
特に目立たせたいお問合せや強調したい要素に使用する。

### 色相・彩度・明度
フルカラー・・・約1677万色
色の調整は色相・彩度・明度を調整するということ。
色相：色合い。色の方向性。赤や青など。
彩度：鮮やかさ。高いほどビビットカラーやビタミンカラーと言う。
明度：明るさ。

### 配色に困ったら？
緑：穏やか
青：知的
などなど、色ごとの意味や印象から決めるのが良い。
参考ページ：https://iro-color.com/


# 追記
デザイン系の記事なのに、文字だけは分かりづらい。。。次回以降は工夫します。

## 参考にした記事や動画
参考にさせていただきました。ありがとうございます。
https://www.youtube.com/watch?v=zuRMrEeS7_8
powershellから「リンク先」におけるオプションを指定する方法

.ps1ファイルのショートカットを作成し、「リンク先」に
```sh
powershell -ExecutionPolicy ByPass
```
などと書き込むことで実行ファイル化している方は多いと思います。

ps1ファイルから別のps1ファイル及びそのショートカットを作成して、リンク先を編集する操作を行ったのですが、情報が少なかったため共有します。

https://stackoverflow.com/questions/31815286/creating-quoted-path-for-shortcut-with-arguments-in-powershell

上記参考です。

```sh
$Shortcut.TargetPath = "powershell"
$Shortcut.Arguments = "-ExecutionPolicy ByPass C:(以下ps1ファイルのpath)"
```

などとすることでオプションを指定することができます。
npm install実施時、npm ERR! code EJSONPARSEを始めとするエラーが発生


npm install laravel-mix --save-devを実行時に下記のようなエラーが発生。

```linux:表示されたエラーメッセージ
npm ERR! code EJSONPARSE
npm ERR! path c:\xampp_new\xampp80\htdocs\laravel\manual/package.json
npm ERR! JSON.parse Unexpected token "/" (0x2F) in JSON at position 48 while parsing near "...scripts\": {\n        // \"dev\": \"vite\",\n  ..."
npm ERR! JSON.parse Failed to parse JSON data.
npm ERR! JSON.parse Note: package.json must be actual JSON, not just JavaScript.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\watan\AppData\Local\npm-cache\_logs\2022-07-08T12_10_14_519Z-debug-0.log
```

package.jsonファイルを編集した際のコメントアウトが残っていたのが原因だった模様。

```json:package.json(エラー発生時)
   "scripts": {
        // 削除
        // "dev": "vite",
        // "build": "vite build"
    },
```



```json:package.json(修正後)
    "scripts": {},
```

色々調べたところ、jsonファイルにわずかな違いがあるだけでエラーが出るらしいです。
要らない記述があった場合に、コメントアウトすれば万事解決するわけじゃないんですね。
AttributeSetクラスで他クラスのコンポーネントを連動する。

C++もGamePlayAbilitySystemも初心者なので自分用のメモ。
自分、敵、味方など複数のキャラクターでHP等の汎用ステータスを作るならステータスはActorComponentクラスで作成してエディタ内でいじれたほうがゲームバランスの検証がしやすいと思うので、AttributeSetとステータス系のComponentを併用できないか考えてみました。
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671215/3be34c53-7c52-1755-890e-f049292abd48.png)
# AbilitySystemComponentについて
https://okawari-hakumai.hatenablog.com/entry/2018/07/22/165242 (おかわりはくまいのアンリアルなメモ)
https://wvigler.hatenablog.com/entry/2021/05/10/095459 (第15回ぷちコン「たぬ吉の大冒険」振り返りその1)
これについては優秀な記事がたくさんありますので導入は省きます。上記の記事をご参照ください。
## コンポーネントを追加する
今回はStatusComponentというアクターコンポーネントを作成しました。これを実装したいクラスへ追加します。このクラスにUAbilitySystemComponentクラスとUAttributeSetクラスも追加しています。
CharacterBase.h
![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671215/ffa7a8ab-dd07-a0a8-d122-74eca605c872.png)
CharacterBase.cpp
![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671215/d7630140-de2a-59a2-80b8-8fdc032ab740.png)
## Attributeのステータスを初期化する
AttributeSetクラスで実装したEnergyという変数を、コンポーネントの変数でSetする。
![aaaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671215/60611d91-dd0b-ac0f-b846-6f201b0d6b29.png)
これでAttributeの値＝コンポーネントの値になりました。
## AttributeSetクラスで他クラスのコンポーネントを参照する
自作したAttributeSetクラスに自作コンポーネントであるStatusComponent.hをincludeします。
PostGameplayEffectExecuteの定義の中でコンポーネントの変数も変更されるようにします。
![aaaaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671215/2d497f54-9c18-b210-76ed-0c6f1bcad9c4.png)
これでGamePlayEffectでAttributeSetのEnergyを変化させると、CharacterBaseクラスに追加されているStatusComponentのEnergy変数も同時に変化するようになりました。

自分用のメモなので、もしかしたら間違っているかもしれません。もし詳しい方がいらっしゃったら回答お願いします。
何も分からないが頑張って参院選の結果をTwitterから予測しようとする　#0. 準備の準備 

# １. 背景
データ分析関連について、周りの進みが早すぎてなにも分からなくなってしまった昨今でしたが、何かないかと探していた時に、
そうだ参議院選挙がある！と気づき、**ユーザーのTwitterへの投稿から参議院選挙のある程度の情勢を予測できるんじゃないか？！と思い**
思い立ったが吉日でやってみようと思った次第です。（一文の量）

しかしいつも大作を作り上げようとして途中で挫折して放置するのが僕の常なので、
今回はめちゃくちゃ細切れにあげていけば続くんじゃないかという期待も込めて
めちゃくちゃ細切れにあげていく所存です。


# ２. 現実
とはいえ、現実はいつも世の中の厳しさを教えてくれます。

[ツイッターは選挙結果の予測指標にならず＝調査](https://jp.reuters.com/article/usa-election-twitter-idJPKCN0VQ0V1) by ロイター通信
[Twitterから選挙結果を予想できない、その理由は?](https://news.mynavi.jp/techplus/article/20120604-twitter/)

など、Twitterから選挙結果は予測できないぞ！とやる気満々の僕の心をへし折ろうとしてくる記事もたくさんありました。

ですがさすが東大の松尾先生、以下の論文がパブリッシュされています。（約10年前だけど）
[2013年参議院議員選挙におけるTwitterを用いた当選者予測](https://www.ieice.org/publications/ken/summary.php?contribution_id=KJ00009762666)

**僕はまだこの論文を読んではいませんが**、出来なくはないんだろうという淡い期待をもとに取り掛かることにします。


# ３. 分析ステップ
楽観的に考えて、現状以下の分析ステップを踏めば~~完璧に~~予測できると考えてます。


**1.　Twitter APIを活用して、選挙当日までの選挙に関するツイートを取得**

**2.　取得したツイートをMeCabで形態素解析して、各政党ごとにWordCloudでの関連単語図式化や単語感情極性対応表によるポジネガ分析を実施**

**3.　（今回は）実際の選挙結果と予測結果を照らし合わせて人力ニューラルネットで精度改善**


# ４. 現時点の課題
とはいえ、現時点で考えられる問題点もたくさんあるので、対応策も必要になります。

- 一部の同一ユーザーが大量にツイートしていた場合、実際の投票結果とギャップが生まれる（Twitterユーザーに絞っている時点で偏っていることは一旦置いておいて笑）
- 一つのツイートに複数の政党名が載っていた場合、どちらの政党に対する意見なのかが不明
- 単純にやるとRTも大量にデータとして取得してしまう

など、
分析を重ねる中で適宜改善しなければなりません。。。乞うご期待。

# ５. その他
本記事との関連は薄いですが、以下の記事でニューラルネットワークの理論について気合入れて書いているので、もしよければ是非ご参照下さい！

①[初心者の初心者による初心者のためのニューラルネットワーク#1〜理論：順伝播編〜](https://qiita.com/sakigakeman/items/55f4cc1c50f8236ac7a6)
②[初心者の初心者による初心者のためのニューラルネットワーク#2〜理論：誤差計算編〜](https://qiita.com/sakigakeman/items/44af9ffde0550e52495e)
③[初心者の初心者による初心者のためのニューラルネットワーク#3〜理論：逆伝播編〜](https://qiita.com/sakigakeman/items/3fc463d8a9613c13c00a)
④[初心者の初心者による初心者のためのニューラルネットワーク#4〜理論：パラメータ更新編〜](https://qiita.com/sakigakeman/items/d84c52d4597b3d9c56a5)
M5Paper: Light Sleep の使い方

![IMG_20220710_203540.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/ea4eafae-ece4-b0eb-c427-14e625a4e7ac.jpeg)


プログラム

```ino:light_sleep.ino
// ---------------------------------------------------------------
//	light_sleep.ino
//
//					Jul/10/2022
// ---------------------------------------------------------------
#include <M5EPD.h>

M5EPD_Canvas canvas_home(&M5.EPD);

int count = 0;
// ---------------------------------------------------------------
void setup()
{
	M5.begin();
	M5.TP.SetRotation(90);
	M5.EPD.SetRotation(90);

	M5.EPD.Clear(true);

	Serial.println("*** setup *** aaa");

	canvas_home.createCanvas(540,960);
	canvas_home.setTextSize(5);

	int ypos[]= {30,110,190,270,350,430,510};
	int xx = 50;
	
	canvas_home.drawString("Light", xx, ypos[0]);
	canvas_home.drawString("Sleep", xx, ypos[1]); 
	canvas_home.pushCanvas(0,0,UPDATE_MODE_A2);
	delay(2000);

	canvas_home.drawString("Good Afternoon", xx, ypos[2]);
	canvas_home.drawString("Good Evening", xx, ypos[3]);
	canvas_home.drawString("Good Night", xx, ypos[4]);
	canvas_home.drawString("Jul/10/2022", xx, ypos[5]);
	canvas_home.drawString("PM 20:21", xx, ypos[6]);
	canvas_home.pushCanvas(0,0,UPDATE_MODE_A2);

	delay(1000);

	Serial.println("*** setup *** ccc ***");
	delay(1000);

	Serial.println("*** setup *** end");
}

// ---------------------------------------------------------------
void loop()
{
	Serial.println("*** loop *** aaa ***");
	Serial.flush();  // Serialをflushさせておく

	char buf[30];
	sprintf(buf, " %d ",count);
	const int xpos = 270;
	const int ypos = 630;
	
	canvas_home.setTextSize(5);
	canvas_home.setTextDatum(TC_DATUM);
	canvas_home.drawString(buf, xpos, ypos);
	canvas_home.drawString(" Sleeping ", xpos, 800);
	canvas_home.pushCanvas(0,0,UPDATE_MODE_A2);

	esp_sleep_enable_ext0_wakeup(GPIO_NUM_38, LOW);
	Serial.println("Going to sleep now");
	Serial.flush();

	esp_light_sleep_start();

	canvas_home.drawString(" Working ", xpos, 800);
	canvas_home.pushCanvas(0,0,UPDATE_MODE_A2);
	Serial.println("*** loop *** ccc");
	Serial.printf("count = %d\r\n", count);

	count++;
	delay(2000);
}

// ---------------------------------------------------------------
```

Arduino IDE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/3563a3bc-cb4f-be38-11f8-b21345c4e13d.png)
【Pug】どう書くんだっけ？ってなる書き方いろいろ

Pug を書いていると、たま～に「どう書くんだっけ？」ってなる時があります。

せっかく時間をかけて解決しても、たまにしか直面しないのですぐ忘れてしまいます。

というわけで、「どう書くんだっけ？」ってなる書き方をまとめてみました！


## 変数に代入した文字列をエスケープさせない

文字列内に `<br>` を入れる時に悩みました。

文字列をエスケープさせたくない場合は `!=` や `!{}` を利用します。

```pug:Pug
- const text = 'やさいマシ、<br>ニンニクマシ、<br>アブラマシマシで！'
p!= text
p !{text}
```

```html:HTML（コンパイル結果）
<p>やさいマシ、<br>ニンニクマシ、<br>アブラマシマシで！</p>
<p>やさいマシ、<br>ニンニクマシ、<br>アブラマシマシで！</p>

```

## HTML 内のコメントに変数を含める

SSI でインクルードする HTML ファイルのパスを動的にしたい時に悩みました。

```pug:Pug
- const category = 'hoge'
!= `<!--#include virtual="/assets/inc/${category}/header.html"-->`
```

```html:HTML（コンパイル結果）
<!--#include virtual="/assets/inc/hoge/header.html"-->
```

## data 属性に配列、オブジェクトを設定する

JavaScript で利用するデータを HTML の `data` 属性に設定する時に悩みました。

属性名と属性値の間の `=` を `!=` にします。

:::note warn
`data` 属性に配列、オブジェクトを設定する場合は、以下に注意します。

* `data` 属性の値をシングルクォーテーション `'` で囲む
* 配列、オブジェクトの値の文字列はダブルクォーテーション `"` で囲む
:::

```pug:Pug
p(data-obj!=["hoge","fuga","piyo"]) data属性に配列を設定
p(data-obj!={"key": "value"}) data属性にオブジェクトを設定
```

```html:HTML（コンパイル結果）
<p data-obj='["hoge","fuga","piyo"]'>data属性に配列を設定</p>
<p data-obj='{"key":"value"}'>data属性にオブジェクトを設定</p>
```

## PHP を出力する

Wordpress のタグを埋め込む時に悩みました。

### 一行の場合

テキストを表示させるのと同じように PHP を書きます。

```pug:Pug
h1 <?php the_title(); ?>
```

```html:HTML（コンパイル結果）
<h1><?php the_title(); ?></h1>
```

### 複数行の場合

#### ドット（.）を使う

ドット `.` の後に改行とインデントを挿入すると、そのまま出力してくれます。

```pug:Pug
.
  <?php if (have_posts()): ?>
    <?php while (have_posts()): the_post(); ?>
      <!-- 繰り返し処理 -->
    <?php endwhile; ?>
  <?php else: ?>
    <!-- 投稿データが取得できない場合の処理 -->
  <?php endif; ?>
```

```html:HTML（コンパイル結果）
<?php if (have_posts()): ?>
  <?php while (have_posts()): the_post(); ?>
    <!-- 繰り返し処理 -->
  <?php endwhile; ?>
<?php else: ?>
  <!-- 投稿データが取得できない場合の処理 -->
<?php endif; ?>
```

#### パイプライン（|）を使う

パイプラインと半角スペース `| ` の後に PHP を記述します。

```pug:Pug
| <?php if (have_posts()): ?>
|   <?php while (have_posts()): the_post(); ?>
|     <!-- 繰り返し処理 -->
|   <?php endwhile; ?>
| <?php else: ?>
|   <!-- 投稿データが取得できない場合の処理 -->
| <?php endif; ?>
```

```html:HTML（コンパイル結果）
<?php if (have_posts()): ?>
  <?php while (have_posts()): the_post(); ?>
    <!-- 繰り返し処理 -->
  <?php endwhile; ?>
<?php else: ?>
  <!-- 投稿データが取得できない場合の処理 -->
<?php endif; ?>
```

#### Pug の include を使う

PHP を別ファイルに書いておき、Pug の include機能を使って読み込ませます。

```php:loop.php
<?php if (have_posts()): ?>
  <?php while (have_posts()): the_post(); ?>
    <!-- 繰り返し処理 -->
  <?php endwhile; ?>
<?php else: ?>
  <!-- 投稿データが取得できない場合の処理 -->
<?php endif; ?>
```

```pug:Pug
include loop.php
```

```html:HTML（コンパイル結果）
<?php if (have_posts()): ?>
  <?php while (have_posts()): the_post(); ?>
    <!-- 繰り返し処理 -->
  <?php endwhile; ?>
<?php else: ?>
  <!-- 投稿データが取得できない場合の処理 -->
<?php endif; ?>
```

### 属性値に PHP を使う

属性名と属性値の間の `=` を `!=` にします。

```pug:Pug
p: a(href!="<?php the_permalink(); ?>") リンクテキスト
```

```html:HTML（コンパイル結果）
<p><a href="<?php the_permalink(); ?>">リンクテキスト</a></p>
```
【SwiftUI】ViewController でSwiftUIを使う方法

# ViewController内でSwiftUIで構成したViewを使う
ViewController内でSwiftUIのViewを使用したい場合は、以下のように、SwiftUIのViewをUIHostingControllerでラップして使用できるようになります。

```swift
import SwiftUI

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        // UIHostingViewControllerでSwiftUIのViewをラップする
        let vc: UIHostingController = UIHostingController(rootView: SampleView())
        // UIHostingViewControllerを子要素に追加
        self.addChild(vc)
        // UIHostingViewControllerのViewを追加
        self.view.addSubview(vc.view)
        // ViewControllerに処理が終了したことを伝える
        vc.didMove(toParent: self)
    }
}

struct SampleView : View {
    var body: some View {
        Text("SampleView")
    }
}

```
GithubのマークダウンについてのTips【ショートカットキー・リンク・画像貼り付け】

# 概要
GithubでIssue作成する時ってマークダウン使ってますか？ 視覚的に整理できて便利ですよね。
ささやかですがIssue作成を効率化させるショートカットやURLリンクなどの小ネタを紹介します。

### 目次
- [ショートカット編](#ショートカット編)
- [テキストURLリンク編](#テキストurlリンク編)
- [画像貼り付け時の注意編](#画像貼り付け時の注意編)

# ショートカット編
マークダウンは手で入力することもできますし、GUIのボタンでもできますし、ショートカットキーもあります。
## ショートカットキー早見表
|キー|説明|書式|
|--|--|--|
|Command + b|**太文字**|\*\*test**|
|Command + i|_イタリック体_|\_test_|
|Command + Shift + .|引用符|> test|
|Command + e|コード挿入|\`test`|
|Command + k|テキストリンク|\[test_text](test_url)|
|Command + shift + 8|リスト|- test|
|Command + shift + 7|番号リスト|1. test|
|Command + shift + l|チェックボックス|- [ ] test|

※ Windows OSは「Ctrl」キー

## ショートカットキーが力を発揮する時
「ぶっちゃけ手打ちの方が早くね？」と思うかもしれませんが、これらが力を発揮するのは**既に入力済みの文章**に対してでしょうね。

![画面収録_2022-07-10_19_01_17_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434874/ca1404ff-f6b7-0c3a-8897-f08f69695600.gif)


このように大量のリストを作りたい時なんかに非常に役立つと思います。

# テキストURLリンク編
上記でテキストURLリンクのショートカットを紹介しましたが、もう一つ方法があります。御覧ください。
![画面収録_2022-07-10_19_07_57_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434874/7ec1c8f4-6b7e-e297-fcdb-726640c24833.gif)

恐ろしく速いリンク作成。オレでなきゃ見逃しちゃうね。
方法もシンプルで
1. **URLを予めコピー**
2. **テキストをドラッグで選択**
3. **Command + v** (windowsはctrl + v)

これだけです！出番は少ないかもしれませんが、大量の参照元リンクを貼り付ける際に有効だと思います。

# 画像貼り付け時の注意編
最後は効率化ではなく「気をつけましょ」という話です。
ほとんどの方は知っているかもしれませんが、Githubは画像をドラッグ・アンド・ドロップで貼り付けることができます。
この時に注意することが一つ。「**画像用のテキストが挿入される位置**」に注目してください。
![画面収録_2022-07-10_20_12_50_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434874/87523a70-3461-111b-f38f-01d2940bb94f.gif)

勘違いしやすいのですが、**画像が挿入される位置**は「画像をドロップする**直前のマウスカーソルの位置**」になります（依然はテキストカーソルだったと思うんですが……）。
そのため、場所が悪いと↑のgif動画のように文字の途中に挿入されますので気をつけましょう。

# 終わりに
一つ一つは些細なことですが覚えると結構時短になるかと思います。
他にもいいのあったらぜひコメントで教えて下さい！

### 参考
https://docs.github.com/ja/get-started/using-github/keyboard-shortcuts
SwiftUIでTextに変数が埋め込んである場合のローカライズ

## 前提
- SwiftUIのローカライズの仕組みを理解していること
- Localizable.stringsは定義済みであること。

## 実装方法
変数部分を%@で置き換えると、変数が埋め込んであってもローカライズできます。

``` Localizable.strings
"current launguage: %@" = "現在の言語: %@";
```


``` HogeView.swift
Text("current language: \(currentLanguage)")
```
Raspberry Pi CM4のeMMCの書き込み速度を改善する

# Raspberry Pi CM4のeMMC書き込み速度

Raspberry Pi CM4のeMMCはI/Oボードを使ってUSBで書き換えるのが普通です。

Ubuntuで書き換える手順と、書き込み速度を早くする方法をいろいろ試したのでその忘備録です。
環境はUbuntu 20.04です。

## eMMCの書き換え
1. ツールのインストール
まず、rpibootをインストールします。
以下からソースコードを取得し、ドキュメントに従ってビルドします。
https://github.com/raspberrypi/usbboot

2. I/Oボードの設定
I/OボードにCM4を接続し、J2の”Fit Jumper to disable eMMC boot”と書かれたピンをジャンパでショートさせます。
ショートさせたら電源を接続します。

3. USBで接続
PCとI/Oボードをケーブルで接続します。I/Oボード側はmicroBの端子に接続します。

4. rpibootの実行
接続したら以下のコマンドを実行します。
~~~
sudo rpiboot
~~~

これでBoot CodeがUSB経由でBCM2710に送り込まれ、USB Mass Storageデバイスとして認識されます。

この状態で書き込んでみると速度が2-5MByte/secくらいしか速度が出ません。
理由を調べてみると、デフォルトで使われるBoot Codeが500MHz駆動のVPU上で動作していることが原因のようです。

## 速度を改善する
以下の方法で書き込み速度が改善しました。

1. githubからクローンしたディレクトリ直下にあるmass-storage-gadgetに移動する。
2. 以下のコマンドを実行する。
~~~
sudo ../rpiboot -d .
~~~
この方法で実行すると書き込み速度が12MByte/secまで改善します。
こちらのディレクトリにあるBoot CodeはLinux Kernelとinitramfsで動作し、CPUのコア上で処理を行うので書き込み速度が速くなるとのこと。

この対応でかなり改善しました。もう少し早くなってほしいですが、、、

こちらのフォーラムの書き込みでは、Ethenet経由であればもっと早くなるとのことですが、ちょっとイメージを作っている余裕がないのでまた今度確認したいと思います。

https://forums.raspberrypi.com/viewtopic.php?t=307347
このまえauで障害があったらしいけど、VoLTEってなに？

## はじめに
先日電話をかけようとしたらどうにも電話がつながらない。というよりかけることができない。
調べてみるとauで通信障害発生中。（最近よくあるなぁ、、、）
そして後日ぼちぼち調べてみると概要はこんな感じらしい。

①,ルーターを新しい物へ交換
②,VoLTE交換機で問題発生
③,切り戻し作業（元に戻す作業）
④,VoLTE交換機に通信が集中し輻輳が発生（負荷増加は②のせい）
⑤,④の結果問題はデータベースの不一致へ、、、
※輻輳とはアクセス集中のこと

ん〜なるほど。
ほんで<b>VoLTE</b>ってなんですの？


## VoLTEとは
VoLTEとは<b>Voice over LTE</b>の略称です。

なにをしてくれるものかというと、LTEネットワーク上で通話をさせてくれるというもの。

元々音声通信は別のネットワーク（3G回線）を使用していたが、VoLTEが出てきたことでLTEネットワークで通話も完結できるようになったのですね。

ちなみにVoLTEでは音声通信もデータ通信と同様にパケット化してやり取りをする仕組みらしい。


## VoLTEを使うとなにが良いの？
ますは<b>通話中にバックグラウンドで高速通信ができる</b>点が挙げられます。
これはLTE回線を使用しているため、LTEで接続したまま通話も可能なため実現できるメリットであり、なにげに重要な要素といえる。（電話しながら同時に調べ物や経路案内を使用するなどあるため）


次に<b>呼び出し時間の短縮</b>が挙げられる。
これは3G回線使用していた時は通話の待機時間（ダイヤルしてから繋がるまでの最低必要時間）が5~8秒だったのに対して、VoLTEでは2~4秒で繋がるというもの。

たかだか2~３秒の違いと侮るなかれ。
SEOに関わるCore Web Vitals(Googleの指標)では読み込み時間が2.5秒を超えると要改善の評価となる。
上記はWebページの指標ではあるが、まぁ現代のクライアントにとって2~3秒の余分な待機はストレスとなるということだ。


そして最後に<b>対応周波数増大による音質向上</B>である。
3G時代の対応周波数が300~3400Hzなのに対して、VoLTEでは50~7000Hzと大幅な周波数に対応しているらしい。
音楽好きな人はご存知かもだが、対応周波数の幅が広がると低音から高音まで綺麗に音を再現してくれるため高音質となる。

ちなみに電話の声が本当の声と違うように聞こえる要因の一つに上記周波数の問題が関係しているらしい。


## おわりに

今回のauの通信障害、復旧まで結局丸一日以上かかっていたのかな？
問題発生から切り戻し判断まで15分ほどで決断してるのは早く感じるけど、それでもこんな大事なるってこわいなぁ〜
コード

     
Sub login()

  Dim objIE As InternetExplorer 'IEオブジェクトを準備
  Set objIE = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトを作成してセット

  objIE.Visible = True 'IEを表示

  Dim strUrl As String '次ページのURL
  strUrl = ""

  objIE.navigate strUrl 'IEでURLを開く

  Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE '読み込み待ち

      DoEvents

  Loop


  Dim strUsername As String
  strUsername = Worksheets("ログイン情報").Range("C3").Value

  Dim strPassword As String
  strPassword = Worksheets("ログイン情報").Range("C4").Value

  Dim htmlDoc As HTMLDocument 'HTMLドキュメントオブジェクトを準備
  Set htmlDoc = objIE.document 'objIEで読み込まれているHTMLドキュメントをセット

  htmlDoc.getElementsByName("username")(0).Value = strUsername 'name="username"にユーザー名を入力
  htmlDoc.getElementsByName("password")(0).Value = strPassword  'name="password"にパスワードを入力
  htmlDoc.getElementById("submit").Click  'フォームの内容を送信



End Sub
3大クラウドのIoTサービスに接続してみた

AWS / Azure / GCP のIoTサービスへの接続比較です。
[個人ブログ](https://twelve.tk/connect-to-3cloud-cert-issued-byown-ca/)には設定方法を画面キャプチャをつけて詳細に説明してますので興味がありましたらご参照ください。

# AWS IoT Core

* クライアントIDは任意の文字列
* 証明書発行機能がある
* 純粋なMQTTブローカーに一番近い印象

| 項目 | 値 |
| --- | --- |
| プロトコル | mqtts |
| ホスト名 | AWS IoTの設定画面で表示されるエンドポイント |
| ポート番号 | 8883 |
| クライアントID | 任意の文字 |
| ユーザー名 | 未指定 |
| パスワード | 未指定 |
| CAファイル | [Amazon Root CA 1](https://www.amazontrust.com/repository/AmazonRootCA1.pem)を保存したファイル |
| クライアント証明書 | デバイス証明書 |
| プライベートキー | プライベートキー |

* Publish
    任意のトピック名に対してPublishが可能です。（一部AWSの予約トピックあり）

* Subscribe
    任意のトピック名に対してSubscribeが可能です。（一部AWSの予約トピックあり）

詳細はこちらの個人ブログも参照ください。

https://twelve.tk/connect-to-3cloud-cert-issued-byown-ca/

# Azure IoT Hub

* 証明書を使った認証だけでなく、接続文字列を使った接続なども提供
* デバイス証明書を事前にクラウド側へ登録する必要がない
* ユーザー名が必要

| 項目 | 値 |
| --- | --- |
| プロトコル | mqtts |
| ホスト名 | {IoT Hub名}.azure-devices.net |
| ポート番号 | 8883 |
| クライアントID | {デバイスID} |
| ユーザー名 | {IoT Hub名}.azure-devices.net/{デバイスID} |
| パスワード | 未指定 |
| CAファイル | [Baltimore CyberTrust Root](https://cacerts.digicert.com/BaltimoreCyberTrustRoot.crt.pem)を保存したファイル |
| クライアント証明書 | デバイス証明書 |
| プライベートキー | プライベートキー |

* Publish
    以下のトピック名に対してPublishが可能です。

    ```
    /devices/{デバイスID}/messages/events/
    ```
* Subscribe
    以下のトピック名に対してSubscribeが可能です。

    ```
    /devices/{デバイス名}/commands/#
    ```
    ```
    /devices/{デバイスID}/messages/devicebound/#
    ```
    Azureの管理画面からデバイスへのメッセージでテスト送信が可能です。

詳細はこちらの個人ブログも参照ください。

https://twelve.tk/connect-to-3cloud-cert-issued-byown-ca/

# Google Cloud IoT Core

* 接続エンドポイントがアカウントによらず単一
* パスワードにJWTが必要（パスワードを指定するためにユーザー名も指定）
* ルートCAの登録は任意

| 項目 | 値 |
| --- | --- |
| プロトコル | mqtts |
| ホスト名 | mqtt.googleapis.com |
| ポート番号 | 8883 |
| クライアントID | projects/{GCPのプロジェクトID}/locations/{リージョン}/registries/{レジストリ名}/devices/{デバイス名} |
| ユーザー名 | unused |
| パスワード | [こちら](https://cloud.google.com/iot/docs/how-tos/credentials/jwts?hl=ja)の方法で生成したJWT |
| CAファイル | [Google ルート CA 認証パッケージ](https://pki.goog/roots.pem)を保存したファイル |
| クライアント証明書 | デバイス証明書 |
| プライベートキー | プライベートキー |

* Publish
    以下のトピック名に対してPublishが可能です。

    ```
    /devices/{デバイス名}/events
    ```

* Subscribe
    以下のトピック名に対してSubscribeが可能です。

    ```
    /devices/{デバイス名}/commands/#
    ```
    ```
    /devices/{デバイス名}/config
    ```
    GCPの管理画面から構成を編集、コマンドを送信でテスト送信が可能です。

詳細はこちらの個人ブログも参照ください。

https://twelve.tk/connect-to-3cloud-cert-issued-byown-ca/
mod_auth_openidcを使ったAzureAD認証でセッションを共有する方法


## 構成
- Apacheコンテナ2台 + redisコンテナ1台
- 静的ファイルをホスティング
- それぞれ、OpenIDConnectで認証して、どちらかで認証をかけたら片方は認証済として扱う。ということをしたい

## 設定例
### Apache設定ファイル
- `OIDCCacheType redis`をつけるのがミソ

```httpd.conf
OIDCProviderMetadataURL https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/.well-known/openid-configuration
OIDCClientID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
OIDCClientSecret xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
OIDCScope "openid email profile"
OIDCRedirectURI https://test-oidc-redis.vamdemic.xyz/document2/redirect/
OIDCDefaultLoggedOutURL https://test-oidc-redis.vamdemic.xyz/
OIDCDefaultURL https://test-oidc-redis.vamdemic.xyz/
OIDCCryptoPassphrase password
OIDCSessionInactivityTimeout 7200
OIDCCacheShmEntrySizeMax 32768
OIDCAuthRequestParams prompt=select_account
OIDCResponseType code
OIDCPassClaimsAs both
OIDCXForwardedHeaders X-Forwarded-Host X-Forwarded-Proto X-Forwarded-Port
OIDCCacheType redis # キャッシュタイプをRedisへ変更
OIDCRedisCacheServer redis # redisサーバのホスト名やIPを指定。:でポート指定

<LocationMatch "/document2/"> # document1/は1系、これは2系
   AuthType openid-connect
   Require valid-user
   LogLevel notice
   OIDCUnAuthAction auth
</LocationMatch>

<VirtualHost *:80>
ServerName _
DirectoryIndex index.html
AddDefaultCharset UTF-8
DocumentRoot /var/www/html/
<Directory "/var/www/html/">
  Require all granted
</Directory>
</VirtualHost>
```

### AzureAD側の設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/9dcfddaf-ab80-995f-2bae-47d59db9b54d.png)


### セッション状態
- redisに入っているのがわかる
```
127.0.0.1:6379> KEYS *
1) "s:e_njZDHSOXoJwJdT-_UvMaHkE4r3EpuYjvUbXEgNiLc"
2) "n:VGnVMbQBF7Gu9DcSrkNgOtYBDtrLmtmlh7E9wnumQgg"
3) "j:g0FXAbhwWi1z_3JWFzQ1WM5ARi4bocs0uFnmJ8mMUkQ"
4) "p:fT4ahjL96j49gJX2D6yFABWLBN6rD8Iy9jKZTENUVQE"
5) "s:UFzyRkOBds4j9wFq7pdY5NCxu8ajKorJLFvgKAQjYfI"
6) "s:XZMtFpqJX6mRvVqpOBfuqZyviUOgjMT0Xj4Fmt0uNw8"
127.0.0.1:6379>
```


### 参考
https://heartbeats.jp/hbblog/2017/08/mod-auth-openidc.html
https://github.com/zmartzone/mod_auth_openidc
DockerコンテナにRaspberryPicoSDKをインストールしてサンプルプログラムをビルドする

# やりたいこと

RaspberryPi4上のDockerコンテナにRaspberryPiOSをインストールして、
RaspberryPiPicoの開発環境を整える。

RaspberryPi4のDockerコンテナにRaspberryPiOSをインストールする手順は以下。

https://qiita.com/ryot0/items/3b40a0e5f227d97b7d3b


# 手順

### RaspberryPicoSDKをインストールするためのコンテナを準備する

```shell
docker create -it --name picobuild01 raspios:0.0.1 /bin/bash
docker start picobuild01
docker exec -it picobuild01 /bin/bash
```


### RaspberryPiPicoSDKのためのツールチェインをインストールする

アタッチしたコンテナで以下を実行

```shell
apt update
apt install git
apt install cmake
apt install libnewlib-arm-none-eabi
apt install build-essential
apt install gcc-arm-none-eabi
apt upgrade
```


### ホストOSとの共有用のディレクトリを作っておく

アタッチしたコンテナで以下を実行

```shell
mkdir /data
mkdir /data/app
mkdir /data/share
```


### 一旦コンテナをimageとして保存しておく

```shell
docker stop picobuild01
docker commit picobuild01 raspios_picobuild:0.0.1
docker rm picobuild01
```


### 保存したimageからコンテナを作成してアタッチ

```shell
docker create -it --name picobuild01 -v /data/app/main/pico:/data/app -v /data/share/main:/data/share raspios_picobuild:0.0.1 /bin/bash
docker start picobuild01
docker exec -it --user=pi picobuild01 /bin/bash
```


### pico-sdkとpico-examplesをインストール（pico-exampleは任意）

アタッチしたコンテナから以下を実行。

```shell
cd /data/app/root
git clone -b master https://github.com/raspberrypi/pico-sdk.git
cd pico-sdk
git submodule update --init
cd /data/app/root
git clone -b master https://github.com/raspberrypi/pico-examples.git
```


### サンプルプログラムを作ってビルドする

https://qiita.com/ryot0/items/df9d3b920d42735af9bd


### *.uf2がビルド結果のファイル

```
cp /data/app/root/sample-blink/build/main.uf2 /data/app/share/root
```
AWSクラウドプラクティショナーを受けた【合格】

## AWSクラウドプラクティショナーとは
AWS認定資格で、AWSの基礎知識やスキルを認定する資格です。
資格難易度的には一番下で、IPAで例えるとITパスポートに該当するらしい。

## 受験結果
**800点弱**で合格 
合格ラインは1000点満点で700点以上
全65問、分野毎に点数の比重が違うのかな？

## 勉強期間
2週間で1日1~2時間くらい。
仕事が終わり次第、そのままUdemyで勉強。

## 勉強方法
Udemyの講座と問題集

最初の1週目は下記の講座を受講しました。
**【2022年版】これだけでOK! AWS認定クラウドプラクティショナー試験突破講座（豊富な試験問題290問付き）**
AWS自体は経験もあったので、1.5倍速で受講してハンズオンも全部スキップ

2週目は模擬試験を解いてました。
**【2022年版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）**
これの基礎①と②、応用①を100点になるまで勉強。
このサービスがなにに使われるか、なにができるか、くらいの理解までで良い。

会社がUdemyビジネスを提供していたので、それでタダで受講できた。


## AWS業務経験
1年強くらいで、全部運用で齧った程度（今はもう全部忘れた）
EC2 / RDS / lambda / S3 / Route53 / ELB / ElasticTranscoder

## 感想
想定より難しかった、ITパスポートやFE午前よりは難しい。
危険物の丙種と乙四の間くらいの難易度、徹夜で暗記すればワンチャンあるレベル。
知らないサービスの問題でも、選択肢から知っているサービスを消去法で消してけばなんとかなる。
全くわからない問題もあったが7割取れればいいので問題ない。

この資格に1万円の価値はあるのか……？
次はSAAを受ける予定。
SpringでH2データベースを使う[Maven]

# 1.はじめに
Springを勉強するにあたってH2dbで~~遊ぶ~~ことになると思うのですが、H2dbの設定方法をわかりやすく解説します。

# 2.設定方法
まず、[Spring Initializr](https://start.spring.io/)で依存関係を設定します。
とりあえず、H2, JDBC, Webの3つで問題ないです。
バージョンはSpring boot2.7.1, Java 11 としておきます。
![スクリーンショット (42).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615563/84ecb339-8deb-c354-8552-7b31fe589a4e.png)

次にH2dbの接続情報をapplication.propertiesに書きます。以下はSpring Data JPAの設定も含まれていますが、JDBCのみの場合は上の2つだけで問題ないです。
```sql:application.properties
spring.datasource.url=jdbc:h2:mem:testdb;NON_KEYWORDS=USER
spring.h2.console.enabled=true

spring.data.jpa.repositories.bootstrap-mode=default
spring.jpa.defer-datasource-initialization=true
spring.jpa.show-sql=true
```
user idやuser passを書くこともできますが、なくても問題ないので省略します。
最後に、テーブルを作成します。resorces直下にdata.sqlを作成します。
![スクリーンショット (44).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615563/51ca8998-e7d6-2dc2-8793-4e9acf21483a.png)
data.sqlにSQLを書いていきます。
```sql:data.sql
CREATE TABLE person (
	id char(10) NOT NULL,
	name char(100) NOT NULL,
	location char(100) NOT NULL,
	birth_date char(100) NOT NULL,
	primary key(id)
);


INSERT INTO person (id, name, location, birth_date )
VALUES('1',  '山田', '北海道', '20220101');

INSERT INTO PERSON (ID, NAME, LOCATION, BIRTH_DATE )
VALUES('2',  '田中', '東京', '20220202');

INSERT INTO PERSON (ID, NAME, LOCATION, BIRTH_DATE )
VALUES('3',  '佐藤', '沖縄', '20220303');
```
これで設定は終わりです。

# 3.実行してみる
Spring Bootを起動させて、[H2コンソール](http://localhost:8080/h2-console)をブラウザで開きます。
![スクリーンショット (45).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615563/2a63ad28-bef5-fd74-57fc-d52e860ffa0a.png)
この画面になったらConnectを押します。(※ログインできないときはapplication.propertiesのURLとH2コンソールURLが違う可能性があります)
ログインができたらテキストボックスのSQLを実行ができれば成功です。
![スクリーンショット (46).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615563/4f71f798-2a57-7811-1fd3-db5661bd0000.png)

# 4.最後に
H2dbはSpringで~~遊ぶ~~勉強するにはちょうどいいですよね。H2dbの設定方法がわかりにくい記事ばかりだったので書いておきました。
RaspberryPiPico SDKを使って小さいサンプルプログラムをビルドする

# やりたいこと

RaspberryPiPicoSDKを使って小さいサンプルプログラムを組んでビルドする。


# 手順

### PICO_SDK_PATH環境変数を定義

```shell
export PICO_SDK_PATH=/data/app/root/pico-sdk
```


### ディレクトリを作成

```shell
mkdir /data/app/root/sample-blink
mkdir /data/app/root/sample-blink/src
mkdir /data/app/root/sample-blink/build
```


### LEDをチカチカさせるソースを作成する

```C:src/main.c
#include "pico/stdlib.h"

int main() {
    // GPIOの初期化
    gpio_init(PICO_DEFAULT_LED_PIN);
    // 入出力の設定
    gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
    while (true) {
        // HIGHを出力
        gpio_put(PICO_DEFAULT_LED_PIN, 1);
        sleep_ms(250);
        // LOWを出力
        gpio_put(PICO_DEFAULT_LED_PIN, 0);
        sleep_ms(250);
    }
}
```


### CMake用のビルドファイルを作成する

```shell:src/CMakeLists.txt
# CMakeのバージョン
cmake_minimum_required(VERSION 3.12)

# SDKパス/pico_sdk_init()の定義のパス
set(PICO_SDK_PATH $ENV{PICO_SDK_PATH})
set(PICO_SDK_INIT_CMAKE_FILE ${PICO_SDK_PATH}/pico_sdk_init.cmake)

# PICO SDKのCMakeを読み込み
include(${PICO_SDK_INIT_CMAKE_FILE})

# プロジェクト名
project(sample_blink CXX C ASM)

# C Compilerのバージョン
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

# PICO SDK CMakeの初期化
pico_sdk_init()

# コンパイルターゲット
add_executable(main
        main.c
        )

# リンクターゲット
target_link_libraries(main pico_stdlib)

# 出力ファイル
pico_add_extra_outputs(main)
```

ポイントは、pico_sdk_initの呼び出しとpico_add_extra_outputsの呼び出し。


### ビルド

```shell
cd build
cmake ../src
make -j4
```

出来上がったmain.uf2が最終ビルド結果のファイル。これをPicoにデプロイすれば動く。
AtCoder Beginner Contest 258 参戦記

# AtCoder Beginner Contest 258 参戦記

気づいた時点で21時10分になっていて unrated になった.

## [ABC258A - Last Two Digits](https://atcoder.jp/contests/abc258/tasks/abc258_a)

書くだけ.

```python
K = int(input())

x = 21 * 60 + K
print('%02d:%02d' % (x // 60, x % 60))
```

## [ABC258B - Number Box](https://atcoder.jp/contests/abc258/tasks/abc258_b)

書くだけ. 流石に実装がアレすぎるとは思う.

```python
N = int(input())
A = [list(map(int, input())) for _ in range(N)]

result = 0
for y in range(N):
    for x in range(N):
        t = 0
        for i in range(N):
            t = t * 10 + A[(y - i + N) % N][x]
        result = max(result, t)

        t = 0
        for i in range(N):
            t = t * 10 + A[(y - i + N) % N][(x + i) % N]
        result = max(result, t)

        t = 0
        for i in range(N):
            t = t * 10 + A[y][(x + i) % N]
        result = max(result, t)

        t = 0
        for i in range(N):
            t = t * 10 + A[(y + i) % N][(x + i) % N]
        result = max(result, t)

        t = 0
        for i in range(N):
            t = t * 10 + A[(y + i) % N][x]
        result = max(result, t)

        t = 0
        for i in range(N):
            t = t * 10 + A[(y + i) % N][(x - i + N) % N]
        result = max(result, t)

        t = 0
        for i in range(N):
            t = t * 10 + A[y][(x - i + N) % N]
        result = max(result, t)

        t = 0
        for i in range(N):
            t = t * 10 + A[(y - i + N) % N][(x - i + N) % N]
        result = max(result, t)
print(result)
```

## [ABC258C - Rotation](https://atcoder.jp/contests/abc258/tasks/abc258_c)

開始位置が変わっているだけとみなせば良い.

```python
from sys import stdin

readline = stdin.readline

N, Q = map(int, readline().split())
S = readline()[:-1]

i = 0
result = []
for _ in range(Q):
    t, x = map(int, readline().split())
    if t == 1:
        i -= x
    elif t == 2:
        result.append(S[(i + x - 1) % len(S)])
print(*result, sep='\n')
```

## [ABC258D - Trophy](https://atcoder.jp/contests/abc258/tasks/abc258_d)

WA4. どこかの面まで進めて、ストーリースキップしてクリアしまくるのが最短. どの面がいいかはわからないけど、全て試すのが $O(N)$ で実装できるので問題なし. クリアしたあとのステージを無視しなくてボロボロ.

```python
from sys import stdin

readline = stdin.readline

result = 10 ** 20
t = 0
N, X = map(int, readline().split())
for i in range(min(X, N)):
    A, B = map(int, readline().split())
    result = min(result, t + A + B * (X - i))
    t += A + B
print(result)
```
[AWS] Step FunctionsのoutputPath、resultPath、resultSelectorを使いこなす

# はじめに

AWS Step Functions の各タスクへの入力は、inputPathでJSON pathを指定することで、雑多な入力から必要な項目だけを拾うことができます。

出力側にはoutputPath、resultPath、resultSelectorというものがありますが、どうにも動作がわからなかったので調べてみようと思い立ちました。

と、勢い込んでみたものの、AWS Console に[Data flow simulator](https://console.aws.amazon.com/states/home?#/simulator) というよいものがありました。この記事読むより、シミュレーターで試してみたほうがよいです。

でも、めげずに書いてみます。

# 動作を確認した環境

## Lambda

入力と出力を確かめたいだけなので、値を返すだけのLambdaを作りました。これをStep Functionsの中で呼び出してみます。

```ts:
export const sampleLambdaHandler = async (event: unknown) => {
  console.log(event);
  return { event, bonsoir: "lambda" };
};
```

## Step Functions

Step Functions はCDKで作りました。最初にPassタスクで、JSONを渡すようにしています。

```ts:
const parameters = {
  hello: "world",
  array: ["1", "2", "3", "4", "5"],
};
const definition = new Pass(this, "pass json", { parameters })
.next( /* Lambda 呼び出し */ );

const stateMachine = new StateMachine(this, "sample", {
  definition,
});
```

渡しているJSONだけを抜き出すとこんなんです。

```json
{
  hello: "world",
  array: ["1", "2", "3", "4", "5"],
}
```

# 試したこと

色々指定して試してみます。

## 何も指定しない場合

```ts
new LambdaInvoke(this, "lambda 1", {
    lambdaFunction,
})
```

### 出力

戻り値が `Payload` キーに格納されました。他にも色々出力されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59475/b950e9c5-11d1-a71f-79ba-1c184be058a1.png)



## outputPath を指定した場合

```ts
new LambdaInvoke(this, "lambda 1", {
    lambdaFunction,
    outputPath: "$.Payload",
})
```

### 出力

`Payload` キーの内容だけが出力されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59475/cbf3b73b-a503-275e-cdca-da4aeedd2ac6.png)


## resultPath を指定した場合

```ts
new LambdaInvoke(this, "lambda 1", {
    lambdaFunction,
    resultPath: "$.MyResult"
})
```

### 出力

もともとの出力に、`MyResult` キーが追加されました。
`MyResult` キーの値は、もともとの出力です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59475/95d5e7ca-46cc-bad8-8daf-8893da60ce94.png)


JSONで書くとこんな感じです。

`{A: original}`
↓
`{A: original, MyResult: {A: original}}`

## resultSelector を指定した場合

```ts
new LambdaInvoke(this, "lambda 1", {
    lambdaFunction,
    resultSelector: {
      "hello.$": "$.Payload.bonsoir",
      "bonsoir.$": "$.Payload.event.hello",
    },
})
```

### 出力

指定したキーに、指定した値が出力されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59475/6df53804-c417-32b7-6652-888647f3c9a6.png)

# まとめ

outputPath、resultPath、resultSelector の役割がわかりました。

そしてやっぱり [Data flow simulator](https://console.aws.amazon.com/states/home?#/simulator) 使うほうが理解が早そう。
名前変更

# 一括でディレクトリ，ファイルの名前変換をする方法　

## 一括ファイル名の改造　（第一引数は拡張子，第二引数は先頭に追加したい文字列）

2重のprint文で引数を足しています．

```~/.bashrc
function rename(){
aaa=$1
bbb=$2
echo "ls -v  $aaa   | awk '{printf \"mv  %s  $bbb%s\\n\", \$0,  \$0 }' | sh " | sh
}
```

使い方

```:bash
user$ls -l
a.png
b.png
c.png
user$rename( "*png" "img_" )
user$ls -l
img_a.png
img_b.png
img_c.png



```

## 連番をつける場合　(引数はなくてよい．)
```~/.bashrc
function numrename(){
aaa=$1
echo " ls -d1 * | awk '{print \$1, \$1}' | awk '{gsub(\"folder\", \"dir\", \$2); printf \"mv %s  %02d_%s\n\" ,\$1, NR, \$2}' | sh " | sh
}


```