OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel】Laravel入門備忘録　php artisan serve実行時エラーについて

## 記事の目的

書籍「PHPフレームワーク Laravel入門 第２版」を学習する中で、おそらくまた同じ問題に引っ掛かるであろう部分をまとめた備忘録です。

## 困ったこと
アプリケーション作成後（laravel new 実行後）、php artisan serve 実行した際に下記エラーが発生。

```
PHP Warning:  require(C:\1_Project\laravelapp/vendor/autoload.php): Failed to open stream: No such file or directory in C:\1_Project\laravelapp\artisan on line 18
PHP Fatal error:  Uncaught Error: Failed opening required
```
## 環境
OS:windows10
Laravel:8.40

## 対処法
php.iniファイルを修正。コメントアウトされている部分を解除します。

【変更前】

```
;extension=fileinfo
```

【変更後】

```
extension=fileinfo
```

## 余談
php.iniを修正する前にcomposer install を実行してみると下記エラーが発生する。

```
No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - laravel/framework[v8.40.0, ..., 8.x-dev] require league/flysystem ^1.1 -> satisfiable by league/flysystem[1.1.0, ..., 1.x-dev].
    - league/flysystem[1.1.0, ..., 1.x-dev] require ext-fileinfo * -> it is missing from your system. Install or enable PHP's fileinfo extension.
    - Root composer.json requires laravel/framework ^8.40 -> satisfiable by laravel/framework[v8.40.0, ..., 8.x-dev].

To enable extensions, verify that they are enabled in your .ini files:
    - C:\Program Files (x86)\php-8.0.0-Win32-vs16-x64\php.ini
You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.

```

この辺の情報が大切。
PHPの拡張モジュールを有効化してほしい、的な意味です。

```
- league/flysystem[1.1.0, ..., 1.x-dev] require ext-fileinfo * -> it is missing from your system. Install or enable PHP's fileinfo extension.
```
```
To enable extensions, verify that they are enabled in your .ini files:
    - C:\Program Files (x86)\php-8.0.0-Win32-vs16-x64\php.ini
```
文字列の「テキストを抽出」アクション

#はじめに
Automation360でちょっと悩んだ箇所をメモで残すシリーズ。
文字列の「テキストを抽出」アクションです。

#使い方

"xxxABCwwwDEFzzz" という文字列があったとして、ABCの後ろの文字列を取り出す例です。
![before-after01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/9a724ead-0afd-cf33-187d-f52917b1db82.png)

「以前」にABCを指定するとABCの後から抽出します。"wwwDEFzzz"が返ってきます。

機能自体は難しくないのですが、「以前」「以降」がなじめません。
・「以前」⇒「抽出対象の前」
・「テキストの後に開始」⇒「このテキストの後から抽出開始」
と脳内変換しています。

なお、出現を２にすると２番目の出現箇所から後ろを抽出します。
"xxxABCwwwABCzzz" でABCの出現２だと、zzzを抽出。
Gitでコミットをまとめる

##概要

コミットした後にミスに気付いて修正、それが何回も続くことがある。
最初のコミットは修正部分だが、それより後は微修正。それで4コミットも5コミットも表示されると肩身が狭い。
コミットをまとめて履歴をきれいにしよう。


## ローカルの場合（SourceTreeを使う）

[参考](https://syslog.life/2020/07/19/git-sourcetree-%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88-%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B-%E3%82%B9%E3%82%AB%E3%83%83%E3%82%B7%E3%83%A5/)

3つまとめる場合には、最新のコミットから4つ目のコミットを選択状態にし、右クリックから「(4つ前のコミットハッシュ)の子を対話形式でリベース」を選択。
**一番上のコミットを選択し、「過去を含めて squash する」** をクリック、を `まとめるコミット数 - 1` 回繰り返す。
最後に「メッセージを編集」をクリックしてまとめたあとのメッセージを設定する。
上記リンク先では「メッセージを編集」を先にしているが、コミットメッセージに「(+2 squashed commits)」とか付くので、付かない方が良い場合には最後にしよう。
「OK」をクリックするとコミットがまとまります。

## リモートの場合(Gitコマンド）

すでにリモートにプッシュしたコミットの場合は、コマンドラインを使うのが良いようだ。

[参考](https://qiita.com/Esfahan/items/5e0eeafa6a01fa723435)

まとめたいコミットがあるブランチに移動して、

```
$ git rebase -i HEAD~3
```

上記のrebaseコマンドを使う。最後の「3」はまとめるコミット数。
（※3つのコミットが1つのコミットにまとまる、という意味。減るコミットは2つ。）
コミット一覧が表示されるので、一番上の行以外の「pick」を「s」（squashの略）に修正
「:wq!」で抜けると、次にメッセージの編集画面になる。
メッセージを編集してさらに「wq!」
最後に

```
$ git push origin +{ブランチ名}
```
ブランドイメージ調査・ブランド認知度調査

https://quest-research.co.jp/research/awareness-survey

ブランドイメージ調査・ブランド認知度調査とは、記事を引用すると「自社の商品・サービス、企業ブランドイメージが市場内でどのくらい浸透しているのかを、競合他社との比較や継続的な調査を行うことによって、客観的に把握することができる調査」だそうです！
この調査を実施すると、ブランド自体の認知度だけではなく、自社ブランドが市場においてどのような立ち位置にいるのかといった情報もわかるので、マーケティングをおこなっていくうえで、有効かもしれません！
遭遇したエラー集

#Rspec failure/error: user = factorybot.build(:user) keyerror: factory not registered: "user"の解決
###解決法
spec/models/factories/users.rbをspec/factories/users.rbにして解決
#no such file or directory @ rb_sysopen - public/user_images/1.jpgの解決
###解決法
publicにuser_imagesフォルダを作る。
#Mysql2::Error: Duplicate column name 'image_name'の解決
###解決策
migrationファイルを空にする=>rails db:migrate=>成功=>元の通りの記述をする=>rails db:migrate
#Gemfileがないエラー（間違えて消してしまったとき）+command+Zでも元に戻らないとき
```
$ bundle init
```
上記の実行でGemfileが作られる=>インストールしたいGemを記述する=>

```
$ bundle install
```
```  confing.fu
require_relative 'config/environment'
run Rails.application
Rails.application.load_server
```
=>終わり
# 本当にGemfileがないのか
```
$ find /-name Gemfile 
```
このコマンドでGemfileがどこにあるのか教えてくれる。
#参考記事
https://qiita.com/Takao_/items/5e563d5ea61d2829e497
https://teratail.com/questions/281935
https://qiita.com/yoshixj/items/6441ab2cd6bc367e607d
https://qiita.com/Yu-kiFujiwara/items/aa51db04e5ff64362bd2
https://qiita.com/chiaki-kjwr/items/118a5b3237c78d720582
https://qiita.com/r-wakatsuki/items/095d5d88d1288df6f9c6
Swift入門 ~ presentの画面遷移 ~

最初のViewControllerにIdentityのStoryboard ID に ViewControllerを追加　←　ぶっちゃけやらなくても問題ない

後々やることになるのでやっといても損はないかなといった感じ
![スクリーンショット 2021-08-10 15.51.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494487/f68b83c3-d511-4e6c-158a-8e638cf50bba.png)

二つ目のViewControllerにIdentityのStoryboard ID に SecondViewControllerを追加

![スクリーンショット 2021-08-10 15.52.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494487/484490e4-1366-88c8-ece5-b224f7111103.png)

遷移元のViewControllerにコードを書く

        let storyboard = UIStoryboard(name: "SecondViewController", bundle: nil)
        let nextVC = storyboard.instantiateViewController(withIdentifier: "SecondViewController")
        self.present(nextVC, animated: true, completion: nil)

以上です。

フルスクリーンにしたかったら

        nextVC.modalPresentationStyle = .fullScreen

こちらを追加すればオッケーです。

上記をボタンを配置したとことかに設置すればボタンをタップしたら処理が走るみたいな感じで使えます
PHP 正規表現を使って文字列を比較する

# 目的

- 正規表現を用いた文字列比較ができる関数`preg_match()`の使用方法をメモ的にまとめる

# 方法

- 下記のように記載することで正規表現を用いて文字列を比較する事ができる。

    ```php
    preg_match('/パターン文字列（正規表現を含む検索したい文字列）/', '比較対象文字列')；
    ```

- パターン文字列が比較対象にマッチした時はintの`1`を返す。
- パターン文字列が比較対象にマッチしなかった時はintの`0`を返す。
- エラーが発生した時は`false`を返す。
- 必ずfalseを返す訳ではなく「falseとして評価される値を返す」場合もある。
- 当該関数の戻り値を評価する時は`===演算子`を使用しないと行けないらしい。

# 参考文献

https://www.php.net/manual/ja/function.preg-match.php
JSで動画のアップロード前に尺を取得する

# やりたいこと
動画をアップロードする前に、フロント側で再生時間に上限を設けたい

# 完成形

```html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Video Duration Test</title>
</head>
<body>
<input id="video-input" type="file">
<video id="video" display="none" height=0 width=0 type="video/mp4"></video>

<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script>
$('#video').on('loadedmetadata', () => {
  const duration = $('#video')[0].duration
  console.log('duration =', duration, 'seconds')
  if (duration > 3600) {
      alert('Too long!')
  }
})

$('#video-input').change(e => {
  $('#video').attr('src', URL.createObjectURL(e.target.files[0]))
  // このタイミングでは取れない
  // console.log($('#video')[0].duration)
})
</script>
</body>
</html>
```

# 解説
- 動画の再生時間を取得するにはvideo要素のdurationを参照する
- 見えないvideo要素を用意しておき、inputで選択された動画をsrcに指定する
- srcを変更した直後にはdurationが取れないため、loadedmetadataイベントを待つ
集合と条件

# TL;DR

* 「集合」は「条件」を可視化したもの
* 「条件」とは、「変数を含む命題」

# 集合

**ある条件を満たすものの集まり**であり、二通りの記法がある

* 外延的記法 - 要素をすべて並べる
* 内包的記法 - 要素を満たす条件を指定する

## 外延的記法

```math
\{..., -4, -2, 0, 2, 4, 8, ... \}
```

```math
\{1,3,5,7\}
```

## 内包的記法

```math
\{2n\,|\,nは整数 \}
```

```math
\{2x-1 \,|\, xは整数かつ1\leqq x \leqq 4\}
```

$\hookrightarrow$ 内包的記法を使うことで、集合は「条件」を使って表すことができる。

# 条件

数学的における**条件**とは、「変数を含む**命題**」である

* 「変数」とは、任意の値を代入することができる文字のことである
* 「命題」とは、**真偽を問うことが出来る式や文章**のことである  
例として「富士山は日本一高い山である」は、真偽を問うことが出来るので命題であるが、「タモリは面白い」は真偽が曖昧なため命題ではない。

つまり「条件」とは、

**「文字が含まれ、値を代入することで真偽を問うことが出来る式や文章」**

であると言える。

例として、「$2x - 5 > 0$」は、値を代入することで真偽を問うこと出来るので命題となり、変数を含むので「条件」となる。

# ２つの条件の関係

## 仮定と結論

２つの条件p, qを使って、

**「pならばqである」**と表現できる命題を

```math
p \Rightarrow q
```

と表せる。

このときpを仮定、qを結論という。

## 十分条件と必要条件

「pならばqである」という命題において、

```math
p \Rightarrow q \,が真である
```

* pはqの**十分条件**
* qはpの**必要条件**

という。

またその逆「qならばpである」が同様に真であるならば、

```math
p \Leftrightarrow q \,が真である
```

と表わせ、pとqは**互いに必要十分条件**という。



# ２つの条件の関係と集合

集合を使うことで、条件が互いにどういう関係になっているのかを可視化することができる。

**全体集合**を$U$とし、集合の要素のうち、

```math
\left\{
\begin{array}{ll}
条件pを満たす集合をP \\
条件qを満たす集合をQ
\end{array}
\right.
```

とする。

* $p \Rightarrow q \,が真である \;\Leftrightarrow\; P \subset Q$  
* $p \Leftrightarrow q \,が真である \;\Leftrightarrow\; P = Q$  

が言える。


# Appendix

## 集合

### 要素の個数による集合の種類

* 有限集合 - 要素の個数が有限 
* 無限集合 - 要素の個数が無限  
全体集合は無限集合であることが多い (整数、実数、無理数)

### 2つの集合の包含関係

* ２つの集合AとBにおいて、AはBの**部分集合**  

```math
A \subset B
```

* 2つの集合AとBにおいて、要素が同一、AとBは**等しい**

```math
A = B
```

* ２つの集合AとBにおいて、AはBの部分集合であるが、等しくなければ、AはBの**真部分集合**  

```math
A \subsetneq B
```

### 全体集合・部分集合・補集合・空集合

![集合.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70065/7e7d80c1-6785-2dbe-88ef-53067a7b70c1.png)

#### 全体集合・部分集合

集合を考えるとき、ある集合 $\mathbb U$を固定し、その**要素**や**部分集合**を考える。
このとき、$\mathbb U$を**全体集合**という。

全体集合の例

* 素数について考えるとき、$\mathbb N$(自然数)を全体集合とする
* 有理数・無理数について考えるとき、$\mathbb R$(実数)を全体集合とする

$\hookrightarrow$ 全体集合は、無限集合であることが一般的


#### 補集合

全体集合**U**の部分集合**A**に対して、**A**に属さない全てのそうその集合を**Aの補集合**といい、以下のように表す。

```math
\mathbb A^c \;もしくは\; \overline{\mathbb A}
```


#### 空集合 

要素を持たない集合を**空集合** ($\emptyset$) といい、全ての集合の部分集合である。

全体集合を $\mathbb U$とすると、以下を満たす

* $\emptyset = \mathbb U$
* $\emptyset = \overline{\mathbb U}$
顧客満足度調査

https://quest-research.co.jp/research/customer-satisfaction-survey-cs-survey

顧客満足度調査とは、この記事の説明を引用すると「商品やサービスの購入者に対して、実際に利用してみて満足/不満足に思った点・期待とのギャップを聞き出すことで、商品自体やマーケティングプロセスの改善に役立てる調査手法」だそうです！
顧客満足度調査を定期的に実施することで、商品・サービスの改善点や顧客のニーズの把握に繋がるそうです！
Curlでレスポンス文字列をUnicodeからUTF-8に変える。


よく忘れるのでメモ。
レスポンスが以下のような文字列で帰ってこられても困る…。

```
\u30b7\u30b9\u30c6\u30e0\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\n\u7533\u3057\u8a33\u3054\u3056\u3044\u307e\u305b\u3093\u304c\u3001\u6642\u9593\u3092\u304a\u3044\u3066\u304b\u3089\u518d\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002
```

Perlが使える環境なら以下をつけてあげるといい感じになる、。
`perl  -Xpne 's/\\u([0-9a-fA-F]{4})/chr(hex($1))/eg'`

```
curl localhost:8080/api/path | perl -Xpne 's/\\u([0-9a-fA-F]{4})/chr(hex($1))/eg'
```


```
"システムエラーが発生しました。\n申し訳ございませんが、時間をおいてから再度お試しください。"
```

こんなメモでも、誰かの役に立てばいいなあ。
初学者がCloud9で作成したLaravelアプリをHerokuへデプロイ


【開発環境】
php7.2
Laravel 6
Cloud9

**Cloud9とGitHubを連携する**

●Cloud9上でリポジトリを作成
cd cms
git init
git add -A
git commit -m "first commit" 

●Github上にリモートリポジトリを作成
Githubのサイトから「New repository」をクリックして作成する。

●SSH認証
Cloud9からGithubにPushするためにSSH認証を行う。

１⃣以下のコマンドで公開鍵を作成
ssh-keygen -t rsa

２⃣以下のコマンドで公開鍵のid_rsa.pubファイルを呼び出しての内容をコピー（ssh-rsaから始まる部分を全てコピー）
less ~/.ssh/id_rsa.pub

３⃣Github→Setting→SSH Keysに張り付ける

●githubにpush
$　git push git@github.com:●●●●●●●●/●●●●●●.git master 

●今後のために登録（詳細不明）
git remote add origin git@github.com:●●●●●●●●/●●●●●●.git

**Cloud9とHerokuの連携・アプリ作成**

●Cloud9とHerokuの連携
source <(curl -sL https://cdn.learnenough.com/heroku_install)
heroku --version
heroku login --interactive


●Cloud9のターミナルからHerokuapp作成
heroku create <アプリ名>

●Procfileの作成（これをやらないと最後にHerokuにアクセスできない。）

echo "web: vendor/bin/heroku-php-apache2 public/" > Procfile

**MySQLの設定**

heroku addons:add cleardb
heroku config

CLEARDB_DATABASE_URLにあるHerokuの環境変数を確認

mysql:[USERNAME]:[PASSWORD]@[DB_HOST(＊＊＊.cleardb.com)]/[DATABASE]?reconnect=true

heroku config:set DB_CONNECTION=mysql DB_HOST=＊＊＊.cleardb.com(or net)   DB_PORT=3306    DB_DATABASE=＊＊＊　DB_USERNAME=＊＊＊  DB_PASSWORD=＊＊＊ -a <アプリ名>>

**Herokuにデプロイ**

git add .
git commit -m "first commit"
git push heroku master

APP_KEYを設定
heroku config:set APP_KEY=$(php artisan key:generate --show)
GitHubからBitbucketへGitのリポジトリを移管する

# GitHubからBitbucketへリポジトリを移動させる

**GitHubにあるリポジトリをBitbucketへ移動させる**機会があったのでその方法を残しておきます。

# 1.GitHubのリポジトリのURLをコピーしてくる

ちなみにprivateなリポジトリでも移管可能

# 2.Bitbucketの左メニューからリポジトリを選択して開く

![FireShot Capture 165 - Bitbucket - bitbucket.org.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85815/cfbe4c2a-e9c5-8de0-b3a0-b50df419b499.png)


# 3.「既存のコードをインポート」にあるそれぞれの項目を入力

![FireShot Capture 164 - 既存のコードをインポート — Bitbucket - bitbucket.org.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85815/52ba34ba-9137-7eaa-121c-3522bb0d8fe8.png)

# 4.Bitbucket上にリポジトリができてるか確認

できてたら完了

# おわり
- 過去には [GitHubからGitLabへGitのリポジトリを移動させる
](https://qiita.com/sola-msr/items/b0e744ddcde289ef6bb0) みたいなのも書いてます
VisualStudioCodeの設定

# VisualStudioCodeの設定
自分用に設定内容を記載。
（追加があったら随時更新予定）
<hr>

## 1.HTMLの雛形を呼び出し、雛形の言語をデフォルトで日本語にする
### 手順
1.VisualStadioCodeの設定（⌘+,）を開く。  
2.設定内の検索ボックスに"emmet Exclude languages"と入力。  
![vscode_emmet_lang.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662822/f1f8ca03-de66-976b-71ef-d6e8b4057195.png)  
3."emmet Exclude languages"内のsettings.jsonを編集。  
設定内の"emmet.variables"がデフォルトでは"en"になっているので"ja"に変更。  

```settings.json
	"emmet.variables": {
		"lang": "ja"
	}
```

##2.行スペースの可視化
1.VisualStadioCodeの設定（⌘+,）を開く。

2.設定内の検索ボックスに"Render Control Characters"と入力し、
チェックボックスにチェックを記入。
![vscode_Render  Control Characters.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662822/accd0dc6-3804-bbef-0936-0b5b91e9c445.png)

【"Render Control Characters"チェック後のコード】
![vscode_vscode_Render  Control Characters_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662822/628cb147-029c-89fa-33f3-9838363bb54f.png)

## 3.HTMLのフォーマッタ
### フォーマッタとは？
→VisualStadioCode内のソースコードを自動整形してくれるもの。

### 設定
1.VisualStadioCodeの設定（⌘+,）を開く。

2.設定内の検索ボックスに"HTML.format"と入力し、
チェックボックスにチェックを記入。
![vscode_HTML.format.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662822/dddaec90-1079-4fd2-15f6-5133fd22fbd6.png)

## 4.フォーマッタの補足
筆者は拡張機能で"Prettier"という拡張機能を使用しているが、
デフォルトで"Prettier"を使用する設定方法を記載しておく。

1.VisualStadioCodeを開き"shift+⌘+f"を入力し、
検索結果でVisualStadioCodeのsettings.jsonが出てくる。
![vscode_settingsjson.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662822/705cf5c1-27ad-4f9b-b4e6-015c58c551db.png)

2.settings.jsonをクリックし、コード内の"editor.defaultFormatter"を以下のように記述。

```settings.json
{
	"editor.renderControlCharacters": true,
	"editor.renderWhitespace": "all",
	"html.format.indentInnerHtml": true,
	"editor.defaultFormatter": "esbenp.prettier-vscode",
	"eslint.format.enable": true
}
```

※筆者の個人的な設定を丸々コピペしただけだが、"editor.defaultFormatter""editor.defaultFormatter"が"esbenp.prettier-vscode"に
なっていればデフォルトでのフォーマッタが"Prettier"になる。
##5. あとがき
今後も追記事項があれば随時更新。
【受験記】IoTシステム技術検定 中級 出題内容【2021-7-10】

#概要
2021/7/10「第10回 IoTシステム技術検定 中級」を受験しました。(8/10に合格通知)
公式テキストは第3版ですが、第2版しか持っていなかったので第2版で臨みました。
実際の勉強法と覚えている範囲で出題内容を記載しておきます。

#勉強法
1. 公式テキストにて、一通り読みながらノートにまとめる。
2. ノートを読み返して内容を思い出していく。
3. テキスト流し読み(1周)

公式テキスト買ったのが1ヶ月前、勉強始めたのが2週間前です。
1でしっかり時間を掛けたので、その段階でおおよそ頭に入っていました。
テキスト3周は読んだ方が良いなと思いつつ、謎の自信で諦め。

#試験当日
試験時間90分。
悩む問題(10問くらい)はスキップしながら、40分くらいで一通り解き終わりました。
その後20分掛けてスキップした問題をじっくり。
残りは暇だったので問題内容を記憶してました。
手応え的に90%は確実かなという印象でした。

#出題内容
###第1章
- IoT出現の背景
- IoT分野の動向
- アジャイル開発
- フィールド領域とインフラストラクチャ領域

###第2章
- IoTゲートウェイの役割(データの中継など)
- IoTゲートウェイの機能・基本構成(プロトコル変換、メッセージ変換など)
- サービスゲートウェイ(OSGi)
- クラウドサービスの形態(IaaS、PaaS、BaaS、SaaS)
- エッジコンピューティングによる効果
- IoTプラットフォームの機能
- データ収集の方式

###第3章
- 統計解析
- 予測(相関、回帰、決定木)
- 分類(主成分分析、クラスター分析)
- 機械学習
- 教師あり(ベイジアンモデル、SVM、ランダムフォレスト)
- 教師無し学習
- 強化学習
- 深層学習(CNN、RNN、オートエンコーダ、DQN)
- データの前処理
- 過学習
- ストリーミング処理
- NoSQL
- 時系列データの扱い
- 深層学習ライブラリ、フレームワーク(TensorFlow)
- IoTプラットフォーム(垂直型、水平型)

###4章
- 電波の特性(周波数と距離との関係)
- 免許不要の無線局
- 衝突回避、隠れ端末問題、晒し端末問題
- 3GとLTE
- 公衆網と閉域網
- セルラー系LPWA
- 5G
- ローカル5G
- プロトコル(MQTT、Websocket)
- IoTデバイスからIoTサーバへアップロードする際のデータ量計算問題
- 使用帯域の計算式
- IoTシステムのレイテンシー

###5章
- 組み込み型と独立型
- カットオフ周波数、オフセット
- IoTデバイスの基本構成
- 光センサ
- 加速度センサ
- ジャイロセンサ
- GPS
- 超音波センサー
- 磁気センサー
- 心電図
- 低消費電力化
- エナジーハーベスティング
- 画像センサーの原理、撮像素子、光電変換
- MEMS

###第6章
- メイカームーブメント
- データフォーマット(CSV、XML、JSON)
- IoTデバイスとノードの基本構成

###第7章
- セーフティとセキュリティ
- 機密性、完全性、可用性
- パスワードクラック(ブルートフォース)
- 認証、パスワード認証など
- デジタル署名
- IoTシステムのセキュリティ対策(耐タンパー性など)
- 個人情報とは
- 個人情報保護法
- サイバーセキュリティ基本法

###第8章
- IoTの契約形態
- CCライセンス

#その他
会社から報奨金20000円頂きました。
ありがたい。

#参考
https://cutnpaste.hatenablog.com/entry/2017/12/03/193809

https://qiita.com/yaboxi_/items/5eefc89f2f861f4011d0
Docker for Windowsは動作が重すぎて使い物にならないは嘘

# はじめに
Docker for Windows + WSL2 ＋ Ubuntuの組合わせができるようになり、Dockerを使ったローカル環境構築がとてもしやすくなりました。
しかし、誤った使い方をしていると、とても処理が重くなります。
動作確認のためLaravelの初期ページの表示体感速度で比較したところ、明らかな差がありました。
今回のこの記事では、どうやったら重くなり、逆にどうやったら快適な速度になるのかを記事にまとめたいと思います。

[2021.08.10 追記]
当記事で紹介した方法が使えなくなることがありました。間違った情報の配信を避けるため記事を一時削除しましたが、回避策が見つかりましたので改めて記事を表示させたいと思います。詳細についてはトラブルシューティングをご確認ください。

# 動作確認環境
- Windows10 Home
- wsl2
- Docker Desktop for Windows
- Ubuntu20.04 LTS
- Laravel8
- PhpStorm

※LaravelのコードをVolume（bind）を使ってコンテナとホストとで共有して開発作業することを想定しています。

# 遅いパターン
- その1
    - Windows側（CドライブやDドライブ）のデータをもとにコンテナを生成する  
※ファイルの実体がWindows側にあり、そのデータをコンテナと共有している状態
- その2
    - Ubuntuには、/mnt/c/hogehogeなどといった形でWindowsのデータが自動的にマウントされているので、このUbuntuにマウントされたデータをもとにコンテナを生成する  
※ファイルの実体がWindows側にあり、そのデータをコンテナと共有している状態

WSL2とWindowsとではファイルシステムが異なるため、それらを共通に扱おうとするとどうしても遅くなってしまいます。
Laravelでいうと、vendor以下をWindowsとコンテナとで共通に扱おうとすると、作業に支障が出るほどページ読み込み等の速度が落ちます。

vendor以下は共通化しないという方法で解決することもできましたが、さらに良い方法がありましたので以下に続きます。

# 速いパターン
ベストプラクティスのページにも書いてありました。
ファイルのマウント（bind-mount）時に最高のシステムパフォーマンスを得るためには、Windowsホストの内容ではなく、Linux上のファイルをバインド・マウントするほうがパフォーマンスがより優れるようです。

https://docs.docker.jp/docker-for-windows/wsl.html

具体的には、Ubuntuの「/home/{ユーザー名}」以下に直接Laravelのソースコードを配置します。
コンテナとの共有においてもこのLinux上のファイルをコンテナと共有します。

# IDEでのコード編集について
エクスプローラー等で「\\wsl$」と入力するとUbuntuのファイル群を確認することができるようになるので、そこからファイルを編集します。

# まとめ
Windowsでコード実装すると遅くなるので、Linux（Ubuntu）上でコード編集すると快適な速さになります。
LaravelのコードはCドライブやDドライブに配置せず、Ubuntuのhome以下に直接配置しましょう。

# トラブルシューティング
Windows側とUbuntu側に同じ内容のディレクトリを配置して、交互に内容をコンテナにマウントしていると、Dockerの不具合なのか、Volumeのマウント先が正しく認識しなくなるという問題が発生しました。

```
Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /run/desktop/mnt/host/wsl/docker-desktop-bind-mounts/ 以下略 
```

調べたところDockerの再起動で改善されるという記事を見かけましたので、下記方法で再起動を実行したところ無事に解消されることを確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1490767/38220dbe-1ac1-cdd2-616e-e96889e457eb.png)
※常駐ソフトのDockerアイコンを右クリックした時に表示されるメニューの「Restart Docker...」を実行する

# トラブルシューティング２
https://qiita.com/nagareboshi/items/24390b37c28b95922613

# 参考ページ
https://tech.griphone.co.jp/2020/08/13/docker-on-wls2-with-intellij/

https://qiita.com/nagareboshi/items/2042755619f978394efd

https://githubmemory.com/repo/docker/for-win/issues/11427
レーザー彫刻機２号機→レーザーカッター

#レーザー彫刻機改めレーザーカッター
40Wレーザーが中国からやっと届いたので色々あれこれしてましたが・・・

はまりました・・

組み立ったはいいけれども、どうもGコードの動きが変で苦労してました。

問題
１．マクロで簡単な往復運動をさせて動作確認
　　→　原点にもどらない（微妙にずれる）
２．Gコードでプログラムを組んで走らせる
　　→　原点には戻るが途中で止まることがある
３．ジョグ動作　特に問題なし
４．Gコードプログラムでたまにガクガクする

問題山積でした。

やったこと。
・Y軸が２レールなので、平行が出ていなくて微妙に引っかかるところがある。
　→　調整。調整。調整。　　　飽きるくらい調整
・grbl基板を見直したところ3.3Vが弱いのでは？と思い立ち外部に3.3V（１A）電源追加。
・そもそも12V電源が足りてるのか？　8.5A → 12A　変更

ここまでやっても改善しないので、grblの設定を徹底的に見直し。
・モーター電流設定を上下させて確認
・マイクロステップを32から16に下げて確認
・加速度の調整

えらい時間かけて、やっと当たりが出たのはモーター保持電流設定。

このマシンはYが2軸ある（ganged axis）ので、ドライバ設定ファイルで
X, Y, Y2と設定しているのですが、モーター電流設定は別設定ファイルDefaults.hで設定されています。
ここもX,Y,Y2としたところ、Z軸がないよ！とコンパイルエラーが出たのでX,Y,Zの設定のままにしていおいたのですが・・・
どうもそれがダメだったみたいです。
恐らくY2の電流設定がないので2軸目Yのモーター電流設定が変になってたと思われます。（想像）

なので、ドライバ設定ファイルに走行・保持両方の電流値を追加しました。
（Defaults.hの設定は無視される）

こうしました

```:TMC2209_4x.h
#define X_TRINAMIC_DRIVER       2209
#define X_STEP_PIN              GPIO_NUM_26
#define X_DIRECTION_PIN         GPIO_NUM_27
#define X_RSENSE                TMC2209_RSENSE_DEFAULT
#define X_DRIVER_ADDRESS        0
#define DEFAULT_X_MICROSTEPS    32
#define DEFAULT_X_CURRENT 1.2
#define DEFAULT_X_HOLD_CURRENT 0.8

#define Y_TRINAMIC_DRIVER       2209
#define Y_STEP_PIN              GPIO_NUM_33
#define Y_DIRECTION_PIN         GPIO_NUM_32
#define Y_RSENSE                TMC2209_RSENSE_DEFAULT
#define Y_DRIVER_ADDRESS        1
#define DEFAULT_Y_MICROSTEPS    32
#define DEFAULT_Y_CURRENT 1.2
#define DEFAULT_Y_HOLD_CURRENT 0.8

// #define Z_TRINAMIC_DRIVER       2209
// #define Z_STEP_PIN              GPIO_NUM_2
// #define Z_DIRECTION_PIN         GPIO_NUM_14
// #define Z_RSENSE                TMC2209_RSENSE_DEFAULT
// #define Z_DRIVER_ADDRESS        2
// #define DEFAULT_Z_MICROSTEPS    16

#define Y2_TRINAMIC_DRIVER       2209
#define Y2_STEP_PIN              GPIO_NUM_2
#define Y2_DIRECTION_PIN         GPIO_NUM_14
#define Y2_RSENSE                TMC2209_RSENSE_DEFAULT
#define Y2_DRIVER_ADDRESS        2
#define DEFAULT_Y2_MICROSTEPS    32
#define DEFAULT_Y2_CURRENT 1.2
#define DEFAULT_Y2_HOLD_CURRENT 0.8
```
もうちょっとでモーター交換まで考えていたのですが・・・
やっと思った通りに動くようになりました。

黒のアクリル板2mm厚ならば、2パスで切断が可能です。
よって、彫刻機改めカッターにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/17eb13fa-8f37-c428-ba9c-d50f64d9157a.png)

設定関係は後ほど。
CloudFront Functions でサブドメインをS3のフォルダ名にルーティングする

## やりたいこと

下記の図のように、CloudFrontにワイルドカードのドメインを設定して

1. サブドメイン名に応じてS3のフォルダ名にルーティングする
2. サブディレクトリのルートオブジェクトに `index.html` を指定する

というのをやってみたいと思います。

![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46847/36fcf2b6-8736-d51c-b173-12a58b57ea51.png)

## CloudFront Functionsについて

以前は、CloudFrontでリクエストによるルーティング処理を行おうとすると、Lambda@Edgeを使う必要がありましたが、 CloudFront FunctionsはLambda@Edgeよりもシンプルな処理に向いているのでこういったリクエストやレスポンスの操作を行うのに向いています。

CloudFront FunctionsとLambda@Edgeの違いや使い分けについてはクラスメソッドさんのブログがよくまとまっているのでこちらを参考にしてください。

https://dev.classmethod.jp/articles/amazon-cloudfront-functions-release/

## やってみる

まずはCloudFront Functionsでファンクションを作成します。

AWSコンソールのCloudFrontのページから、Functionsを選択して新規にFuctionを作成します。
 `Function code` の `Development` に既にサンプルのコードが入力されていますが、それを下記のようなコードに書き換えます。

![fig4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46847/2f5bacac-ef1f-a475-0c60-b832461291e8.png)


```javascript:コード例
function handler(event) {
    var request = event.request;
    var uri = request.uri;
    var host = request.headers.host.value;

    var prefix = host.split('.', 1)[0]
    if (uri.startsWith('/')) {
      request.uri = '/' + prefix + uri;
    } else {
      request.uri = '/' + prefix + '/' + uri;
    }

    if (uri.endsWith('/')) {
        request.uri += 'index.html';
    } else if (!uri.includes('.')) {
        request.uri += '/index.html';
    }

    return request;
}
```

コードを保存した後、`Test` タブに切り替えるとコードのテストが行えます。

![fig5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46847/97566a8f-fd98-25a8-c1d7-3c5f13e3eab9.png)

問題がなければ `Publish` タブから `Publish function` をクリックします。


Terraform を使って管理する場合は以下のようなコードになります。デフォルトの挙動はpublishまで行うので、既に本番運用しているコードを更新する場合など注意が必要です。

```terraform:main.tf
resource "aws_cloudfront_function" "this" {
  name    = "url-routing"
  runtime = "cloudfront-js-1.0"
  comment = "Managed by Terraform"
  publish = false
  code    = file("${path.module}/functions/index.js")

  lifecycle {
    create_before_destroy = true
  }
}
```

次に、CloudFunctionを作成します。
作成したファンクションを `Viewer request` に紐付けます

![fig7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46847/c8ef530e-f543-ebd1-3569-8637158b9f2f.png)

CNAME に `*.exmaple.com` のようにワイルドカードのドメインを指定します。

![fig8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46847/fd32bb12-e9ee-95d8-c3e9-8923fc63b066.png)

また、HTTPSによるリクエストを受け付ける場合は ワイルドカードに対応した証明書を設定します。

## まとめ

同様のことは Lambda@Edge を使ってもできるのですが、 CloudFront Functions を使った方が 1/6 ほど安価で、比較的簡単に導入することができます。
ただ、やはりランタイムがJavaScriptのみ、ライブラリ等も導入できないので複雑な処理は難しいかなという印象です。その場合は素直に Lamba@Edge を使った方がいいと思います。

他にも、CloudFront Functions のサンプルコードは AWS が以下の GitHub レポジトリに公開しているのでこれを参考にするといいと思います。

https://github.com/aws-samples/amazon-cloudfront-functions
[資格]SAP Activate認定試験をBASISエンジニアが取得してみた

# はじめに
SAP Activate認定(C_ACTIVATE13)というプロジェクトマネージャ向け認定をBASISエンジニアの私が取得しましたので、取得までの勉強方法等を共有します。

#前提

- 本記事はSAP BASISエンジニア向けです。SAP アプリケーション担当者やPMの方には当たり前のことも含みます。
- SAP用語を含みますが、SAP技術者に一般的と思われるものは説明を省略しています。
- 教材は英語のみです。
- 勉強方法はもっと簡単なものがあるかもしれません。
- 個人的な感想や主観で書いています。

#SAP Activateとは?
SAP S/4HANA実現化のためのプロジェクトマネージメント手法であるSAP Activateは次のものを含んでいます。

   - 導入方法
       - 新規導入: 新規にS/4HANAを導入
       - Conversion: S/4HANA以前のバージョンからバージョンアップ。S/4HANA化によるデータ構造の大幅な変更に伴い、コンバージョンと呼ばれる対応が必要
       - Landscape Transformation: 移行先のS/4HANA環境を新規、または、データが入っていないバージョンアップ済環境(Shell)を用意し、全てもしくは一部のデータを別途用意したS/４HANA環境にデータ移行する手法
   - 導入先
       - オンプレミス: 一般的なオンプレやSAP社が認定したクラウドでのIaaS利用
       - クラウド: SAP S/4HANA CloudといわれるSAP提供のクラウド
   - 手法:
       - SAP Best Practice: 複数のビジネスシナリオ実現するための一連のカスタマイズをSAP社が提供したものを利用し導入
       - Guided Configuration: S/4HANAのカスタマイズを支援するツール。S/4HANA Cloudとオンプレミス版で提供されるツールが異なる
       - One Methodology: プロジェクト実現化手法。この手法でWaterfallからアジャイル開発、オンプレミス導入からクラウド導入までをカバー

#使用した教材
SAP Pressから出版されている[SAP Activate Project Management Certification Guide](https://www.sap-press.com/sap-activate-project-management-certification-guide_5194/) を使用しました。残念ながら英語版しかないですが、例題が充実しており、読み進めていくと理解が進んでいきます。
![image](https://s3-eu-west-1.amazonaws.com/cover2.galileo-press.de/print/9781493220298_267_2d.png)

#勉強期間
土日の空き時間を使って週4時間ぐらいで3か月かかりました。
合計すると50時間ぐらいです。
前提知識がある方や英語が得意な方はもっと短期で行けるかと思います。

#勉強方法
私には初めての内容が多かったので、地道ですが次のように進めました。

- SAP Activate Project Management Certification Guideの一章分を読む
- 例題を解いて、不明な部分を見直す
- 出てきた内容を文書としてまとめてみる
- SAP Best Practiceなどガイドに出てきたツールは、対象サイトの確認や各種ブログを検索して、どんなものかを具体的に理解してみる
- scrum手法などの利用されている手法は、わかりやすい日本語のサイトを探して勉強してみる
- 章ごとに繰り返して、最後の演習問題まで進める
- 一通り勉強して認定試験を受けて、不合格なら不得意分野を見極める

#学んだこと(BASISエンジニアとして取得する意味)

BASISエンジニアとしても非常に有用な内容でした。S/4HANA実現化のプロジェクトマネージメントを担当する機会はないと思いますが、プロジェクトの全体像を理解することができそうです。

- コンサル等が提供する全体スケジュールの背景を勉強した知識に照らし合わせることができます。
- どのタイミングでBASIS側での環境準備が必要かを理解することで、アプリ側とのスケジュール調整のネタができます。
- 複数の移行手法について、アプリやPMとの話をすることができます。※SAP Activateで出てくる進め方や用語が違う場合には、ベンダ独自の手法を使っていたり、手法がカスタマイズされていることがわかり、注意が必要なことがわかります。

この辺り、かなり主観を含んだものなのですが、BASISエンジニアとしても取得する価値の高い認定で、チャレンジして損はありません。
【備忘録】Adobe CC 法人契約のグループ版と紐づいている個人アカウントが有償プランから無償プランに変更になったときの対応

2021年8月第一週のこと。
法人契約のグループ版で権限を付与されていたはずの有料サブスクリプションが個人アカウントで使えなくなりました。
大変困ったので、備忘録までにmemoを残します。

#【現象】

* 有償サブスクリプション（アプリ）がライセンス切れとなり使えなくなる。クラウドのストレージ上限も2GBに減っている
* 利用しているアカウントのプランが有償プランから「Creative Cloud 無償メンバーシップ」に変わっている
* グループ版アカウントの管理者の管理画面で該当アカウントで有償サブスクリプション利用の権限が与えられている


#【対応】

* Adobe Creative Cloud Desktopを起動
* Desktopにログインしているアカウントからログアウト
* 再度登録しているメールアドレスでログイン
* アカウント選択画面が表示される
* 法人用アカウントを選択してログイン（個人用プロフィールではログインしない）
* 有償サブスクリプションのアプリ等を起動し、各種機能が使えるかを確認する

![スクリーンショット-2021-08-10-113717.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212038/23f49ed3-896e-99f2-ba80-b66e7147abce.jpeg)


#【補足】

うっかり過去のデータを個人用プロフィールに紐づけてしまった際は
[Creative Cloud ライブラリおよびフォルダーで共同作業する](https://helpx.adobe.com/jp/creative-cloud/help/collaboration.html)
を参照しながら、法人アカウントにコツコツとデータを移動させるしか無さそうです(泣)
私的「人工知能」と一般的なAI用語との対応

# 「自己認識」と強化学習

[私的「人工知能」での「自己認識」](https://qiita.com/ttsukui/items/f2c7ad5c60bf4f81f48a#%E8%87%AA%E5%B7%B1%E3%81%A8%E5%A4%96%E7%95%8C%E3%82%92%E8%AA%8D%E8%AD%98%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8)は、

>そのものが持っている感覚能力と行為能力を使って、創造主（設計者等）が先天的に与えることなくその行動原理を見い出すこと

と仮定した。これは一般にいう「強化学習」の過程に類似しているように思われる。
https://www.slideshare.net/ShotaImai3/rlssdeepreinforcementlearning

| 強化学習 | 「自己認識」 |
|:---:|:---:|
| エージェント | 自己 |
| 環境 | 外界 |
| 観測 | 感覚 |
| 行動 | 行為 |
| 報酬 | ？？ |

強化学習では、「報酬」最大化を目標として「行動」を微調整し、それによる「環境」への作用の影響を「観測」して報酬を評価、といった過程を繰り返す。
しかしながら「自己認識」過程では、明確な「報酬」とその最大化というものを設定しにくい。というか定義上、行動原理を「先天的に与えることなく」としており、その部分では強化学習と異なる。

「自己認識」過程では、その報酬の設定を「自己」自身が行う機構が必要と考えられる（内発的報酬？）。
強化学習・深層強化学習では、内発的報酬の概念を用いたいくつかの手法が提案されている。
https://www.slideshare.net/ShotaImai3/rlssdeepreinforcementlearning, 100-116

# 「記号」について

[私的「人工知能」](https://qiita.com/ttsukui/items/f2c7ad5c60bf4f81f48a#%E7%A7%81%E7%9A%84%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%E3%81%AE%E5%AE%9A%E7%BE%A9)における用語を使うと、以下のように表現できる。

| 自己の感覚と行為により「経験」した特徴的なこと（知識）を、「他者」又は「後(未来)の自己」に向けて共有するために、「外界」に残すしるし |
|:---:|

「知識」を、単に「後の自己」のためにその内部に保存しておくことは「**記憶**」又は「**学習**」といえよう（**学習**とは、**記憶**をその後の自己の行為・行動に生かせるようになることまでを含む）。記号は内部保存でなく、外界に刻む知識、とした点が重要である。

記号とはつまり、「**他者**」に自己の経験を伝えることのできる**外部記憶**であり、これにより他者は実際に**経験しなくても学習**することができる仕組みをつくるものでもある。
人間が他の動物に比べ特徴的なのは、**「記号」による外部記憶により、個体の記憶能力を大きく超えて知識を蓄積でき、かつ将来的にも保存・共有できる**点にあると考えられる。

なお、記号は知識を表象している、と考えたとき、「後の自己」に向けた知識共有だけが目的であるなら、記号は「自己がそれを見て知識を思い出す」ことができればよい。しかし「他者」に向けた知識共有をしようとする場合、他者と「共通する感覚」を踏まえた記号で表象しなければならないはずである。**記号の起源は、記号を使用する者どうしの「身体的共通性」に依存する**ことは確かであろう。
AIにおけるいわゆる「[シンボルグラウンディング問題](https://ledge.ai/symbol_grounding_problem)」は、そのAI（コンピュータ）が人間の身体的特性（感覚と行為）と共通するものを持っていないことに根本的原因があるように思われる。
「初心者向け」GitHubでのブランチについて

#はじめに
マックPCを利用し、SSH接続をしている前提です。
SSH接続について知りたい方は[こちら](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)の記事がおすすめ

#ブランチの作成
まず、**cd**を使いpushしたいファイルまで移動しましょう。名前は任意で変えてください。
移動できたら以下のコードを実行していきます。

```
$git branch develop
```

こうすることで、developブランチを作成することができます。
実際に**git branch**で確認してみましょう

```
$git branch
 develop
*master  ←デフォルトで作成されているブランチ、mainになってる人もいるかも
```

という形になっていたら成功です。
(*は今いるブランチを表しています.)

#ブランチの移動
今はmasterブランチにいるので、ここからdevelopブランチに移動しましょう。

```
$git checkout develop
```

また、実際に**git branch**で確認してみましょう

```
 $git branch
*develop
 master
```

このように、developの左側に*がついていたら移動成功です。

#1発でブランチを作って移動する方法
ここまで2回コマンドを打ってブランチの作成と移動を行なってきましたが、１発でこれらを完了することもできます。

```
 $git choecout -b develop2
```

これでdevelop2というブランチを作成し移動することができます。
また、実際に**git branch**で確認してみましょう

```
 $git branch
  develop
　*develop2
  master
```

このようにdevelop2の左側に*がついていたら移動成功です。

#ブランチの削除
間違って作成してしまったブランチを削除しましょう。
今回はdevelop2ブランチを削除していきます。

```
$git branch -d develop2
```

また、git branchで確認してみてください。削除されていたら成功です。
基盤地図情報をパースするライブラリを作った話

# 概要
まぁタイトルの通りですがJPGIS形式で配布されている基盤地図情報をパースして
簡単に扱えるようにするライブラリを書きました。

基盤地図情報とは国土地理院が配信しているデータの一つで道や川などのデータが
JPGIS形式で収められています。

しかし、JPGIS形式を扱うのが僕にとって結構大変だったので
今回こんな感じのライブラリを作りました。

github=> https://github.com/inaridiy/jpgis-parser
npm=> https://www.npmjs.com/package/jpgis-parser

# 使い方
`npm i jpgis-parser`した後に

```js
const { Parser } = require("jpgis-parser");
const fs = require("fs");
const xml = fs.readFileSync("./FG-GML-513574-BldL-20210701-0001.xml", "utf8");
const obj = Parser.parse(xml);
console.dir(obj.BldL[0], { depth: null });
/* {
  fid: '48780-12450-s-16685',       
  orgGILvl: 2500,
  lfSpanFr: '2021-03-17',
  devDate: '2021-07-01',
  vis: undefined,
  type: '普通建物',
  name: undefined,
  loc: [
    [ 34.588021306, 135.502216889 ],
    [ 34.588032861, 135.502287667 ],
    [ 34.587958556, 135.50230175 ], 
    [ 34.587946972, 135.502222778 ],
    [ 34.588010028, 135.502214222 ],
    [ 34.588021306, 135.502216889 ] 
  ]
}*/
```

こんな感じでダウンロードしてきた基盤地図情報をparseメソッドで変換することができます また、複数の xml をまとめてパースし、一つのオブジェクトにまとめるparseManyメソッドもあります。 パースした後にどのようなデータになるかはconvertedの名前空間の型定義ファイルを読んでください

また、基本データのうちに近畿のデータに含まれているデータしかパースできません。 近畿地方以外をパースする場合はまれに一部データが出力されないです。

# 使用上の注意

国土地理院が発行する利用規約に従ってください   
また、バグとか普通にある可能性があります 
一度に大量のデータをパースするとメモリリークします 
最後にこのプログラムを利用した際に発生したいかなる不利益の責任はとりません
Eclipse便利な設定

いろんな環境でEclipseの設定しているときに、なんども調べるのが面倒になってきたので備忘録としてまとめることにしました。

#コンテンツアシスト（補完機能）
Java>Editor>Content Asist
確認する設定
Auto activation delay : 0
Auto activation triggers for Java : 
.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_

参考
https://ser1zw.hatenablog.com/entry/20110130/1296393620

#テンプレート（いわゆる辞書登録）
Java>Editor>Tempates
自分が便利だと思うショートカットを辞書登録できる機能です。
自分が使うテンプレートの設定

for


```
for (int ${index} = 0; ${index} < ${cursor}; ${index}++) {
	
}
```

sout (sysoutで同じの出るが、さらに短縮)

```
System.out.println(${word_selection}${});${cursor}
```

#フォントとそのサイズ
General>Appearance>Colors and Fonts
Basicの中にあるText Fontを編集すると、エディターのフォントとサイズを変えられる。
個人的に好きな設定
UDデジタル教科書体 NK-R 16pt

#テーマ
General>Appearance
主に白か黒の背景を選べます。
背景によってフォント色も変わります。
DevStyleだと色の細かい設定ができるみたいで、IntelliJっぽくすることもできます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223871/c35f64de-ede2-1907-a598-f81d8c415dd2.png)


#その他参考記事：よく使うショートカット
https://qiita.com/ynxx/items/7734dfb755bc83373d7c
pythonで、ファイル名の一部を一瞬で修正する。（間違ったファイル名を修正する！）

Pythonを業務で生かして、ラクをしようと言うプロジェクトを実行中です。

１．現状／問題点
月初に経理チームから送付されているpdfファイルなのですが、下記の様に「変」です。
”（ ”が、全角になってたりします。（半角と全角がごっちゃになっております。）
これを、Pythonで修正したい。（こんなの簡単だろうと思ったのですが、結構、ハマったので、共有しますね！）

```
C:\Users\user_xxx\Desktop\project>tree/F
フォルダー パスの一覧
ボリューム シリアル番号は 2E48-BBB4 です
C:.
│  rename_test.py
│  sample1.（1234）.pdf
│  sample2（2345）.pdf
│  sample3(4567）.pdf
```

ファイル名が「壊れている」と、御存じの様に色々な作業（例えば、Pythonのpywinzipモジュールを使って、pdfファイルを圧縮するとか）に支障が出ます。
従って、ファイル名を一瞬で修正します。

２．コード
<rename_test.py>

```py
import os
fileExt=r".pdf"
x=[_ for _ in os.listdir() if _.endswith(fileExt)]
print(x)
x1=[s.replace('.（','(') for s in x]
print(x1)

x2=[s.replace('（','(') for s in x1]
print(x2)

x3=[s.replace('）',')') for s in x2]
print(x3)

for j in range(len(x3)):
	os.rename(x[j],x3[j])
j=j+1
```

３．ポイント
Pythonの標準機能のreplaceを使います。

＞x1=[s.replace('.（','(') for s in x]

例えば、上は、リスト化されたxの要素を一つずつ(s)、拾っていくのだが、その際に、「.（」を「(」に書き換えろ！と言うコマンドです。（全角を半角に置換。）
因みに、「）」を「)」変換するのも一緒に（一行で）出来れば良いのですが、一つずつしかできない様です。
従って、一旦、リスト「X1」で一部だけ直した上で、リスト「X2」で更に修正。
最後は、リスト「X3」で更に修正と言う感じです。
従って、修正ポイントが10か所ならば、上みたいなコードを10個書く必要があります。（一つずつ修正するので。）

４．rename_test.py実行後
下記の様に、ファイル名が綺麗に修正されております。

```
C:\Users\user_xxx\Desktop\project>Tree/F
フォルダー パスの一覧             
ボリューム シリアル番号は 2E48-BBB4 です
C:.
│  rename_test.py
│  sample1(1234).pdf
│  sample2(2345).pdf
│  sample3(4567).pdf
```
ARM Template から Azure Functions を作成した際に Host Key が参照できない際の対処法

## この記事は何？
ARM Template から Azure Functions を作成した際、Host Key が参照できていない際に確認すべき項目を記述しています。

結論から言うと、環境変数 `AzureWebJobsStorage` を適切に設定できているか確認する必要があります。

## `AzureWebJobsStorage` とは

Docs から引用すると、以下の値を設定する環境変数です。

>Azure Functions ランタイムでは、このストレージ アカウント接続文字列は通常の操作に使用されます。 このストレージ アカウントの使用方法としては、キー管理、タイマー トリガー管理、Event Hubs チェックポイントなどがあります。 このストレージ アカウントは、blob、キュー、およびテーブルをサポートする汎用的なものである必要があります。

参考：[Azure Functions のアプリケーション設定のリファレンス | AzureWebJobsStorage](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-app-settings#azurewebjobsstorage)

要するに、キー管理を行っている Azure Storage アカウントを参照できていないため、 Azure Functions 側からホストキーを取得できていなかったのです。

## ARM Template で環境変数を設定

よって、 ARM Template で以下の要領で環境変数を設定します。

```json
・・・・略・・・・
                        {
                            "name": "AzureWebJobsStorage",
                            "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', parameters('storageAccountsName'), ';EndpointSuffix=', environment().suffixes.storage, ';AccountKey=', listKeys(resourceId('Microsoft.Storage/storageAccounts',parameters('storageAccountsName')), '2019-06-01').keys[0].value)]"
                        }
・・・・略・・・・
```

全ての ARM Template は、[こちら]()の GitHub に載せてあります。

## 参考

- [Azure Functions のアプリケーション設定のリファレンス](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-app-settings)
- [arm template deployed function app has no host keys and throws errors](https://github.com/Azure/Azure-Functions/issues/1080)
1つのローカルリポジトリで複数のリモートリポジトリを管理



## 現在のリモートリポジトリを確認

```
$ git remote -v                                                                                                                                                                       
origin  https://github.com/toshiki-nakamura/XXXXX.git (fetch)
origin  https://github.com/toshiki-nakamura/XXXXX.git (push) 
```

## リモートリポジトリの追加 
`git remote add <名前> <url>`

```
$ git remote add hoge https://github.com/toshiki-nakamura/hogehoge.git
$ git remote -v 
hoge https://github.com/toshiki-nakamura/hogehoge.git (fetch)
hoge https://github.com/toshiki-nakamura/hogehoge.git (push)
origin  https://github.com/toshiki-nakamura/XXXXX.git (fetch)
origin  https://github.com/toshiki-nakamura/XXXXX.git (push) 
```

## リモートリポジトリの削除
`git remote remove <名前>`

```
$ git remote remove hoge
$ git remote -v
origin  https://github.com/toshiki-nakamura/XXXXX.git (fetch)
origin  https://github.com/toshiki-nakamura/XXXXX.git (push) 
```
とりあえず構築 CentOS7 de Prometheus v2.28.1

## はじめに
ほぼ趣味で監視のOSSは色々と触りましたが最近はprometheusばかり触っています。
最初のハードルは高めですが慣れれば良い感じです。

そんなprometheusをとりあえず動かしてみるか。そんな人向けにとりあえず構築メモ。

Prometheusは複数のOSSを組み合わせて動かすので必要に応じて次のソフトウェアも必要です。
このメモはprometheus単体のとりあえずインストールする内容です。

・Promehetus　※監視
　　インストール：[とりあえず構築 CentOS7 de Prometheus v2.28.1](https://qiita.com/docomodake/items/ee0672166fd2c0d1eeba)
・Cortex or Thanos　※監視データ長期保存＠勉強中
・Grafana　※可視化
　　インストール：[とりあえず構築 CentOS7 de Grafana(＋nginx proxy）](https://qiita.com/docomodake/items/294d37d24f19b3ff064b)
・alertmanager　※通知
・exporter
 - node_exporter　※エージェント監視（パフォーマンス）
 - snmp_exporter　※SNMP監視
 - blackbox_exporter　※死活監視（ICMP・DNS・http）
 - vmware_exporter　※vSphere監視
（上記をよく使う。他は必要に応じて勉強中）

## 前提
・Intel CPU 64bit
・CentOS 7.9
・Prometheus v2.28.1

## OS 設定
・UTF-8を設定
localectl set-locale LANG=en_US.UTF-8

・設定ファイルの配置ディレクトリ作成
mkdir -p /opt/prometheus/etc/

・ソースの配置ディレクトリ作成
mkdir -p /opt/prometheus/src/

・監視データ保存場所のディレクトリ作成
mkdir -p /opt/prometheus/data

## Prometheusインストール

cd /opt/prometheus/src/
curl -O -L https://github.com/prometheus/prometheus/releases/download/v2.28.1/prometheus-2.28.1.linux-amd64.tar.gz
tar xvzf prometheus-2.28.1.linux-amd64.tar.gz
mv prometheus-2.28.1.linux-amd64 prometheus-server
sudo chown -R root:root prometheus-server

cp -p /opt/prometheus/src/prometheus-server/prometheus.yml /opt/prometheus/etc/prometheus.yml
ln -s /opt/prometheus/src/prometheus-server/promtool /usr/bin/promtool

vi /etc/systemd/system/prometheus-server.service

```/etc/systemd/system/prometheus-server.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network-online.target
[Service]
User=root
Restart=always
ExecStart=/opt/prometheus/src/prometheus-server/prometheus --config.file=/opt/prometheus/etc/prometheus.yml --web.enable-lifecycle --web.enable-admin-api --storage.tsdb.path=/opt/prometheus/data/ --storage.tsdb.retention=365d
[Install]
WantedBy=multi-user.target
```

* --storage.tsdb.retention=365d でとりあえず1年保存設定になっています。
* --storage.tsdb.path=/opt/prometheus/data/ で監視データの保存場所を指定しています。
* --web.enable-admin-api で管理用http apiを有効にしています。
* --web.enable-lifecycle でhttpでprometheusのリスタートをできるようにしています。

systemctl daemon-reload
systemctl start prometheus-server
systemctl status prometheus-server
systemctl enable prometheus-server

## インストール確認
ブラウザで http://[ip address]:9090/ にアクセスできればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636347/4e1591b6-129d-c0d7-c0dd-bfb5e57b4c34.png)
Swift CoreMLを使った画像認識アプリ

CoreMLとは
--
Appleが作成した機械学習のフレームワーク。２０１７年に発表されて、createMLで機械学習を自身で作成することもできる。
Pythonの主力なライブラリ６つをAppleの力によりCoreMLで使用できるようになっている。



モデルをXcodeのプロジェクトに入れる。
---
googleで```inceptionv3　swiｆｔ```でしらべたらmlmodelファイルを発見できると思うので、それをダウンロードしてXcodeのプロジェクトにドラッグアンドドロップをする


簡単な画像認識アプリ（カメラ、画像の用意）
---

```swift

class ViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate {
    @IBOutlet weak var imageView: UIImageView!
    let imagePicker = UIImagePickerController()
    
    override func viewDidLoad() {
        super.viewDidLoad()
       //delgateを宣言
        imagePicker.delegate = self
       //.cameraでも良い。privacy設定を忘れずにしておく
        imagePicker.sourceType = .photoLibrary
        //編集できるかどうか
        imagePicker.allowsEditing = false
        
        
    }

.
.
.
.
 //　画像を選んだ時点でdelegateに通知がいき発火する関数　　infoに画像情報が入ってくる。
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        //編集無しでUIImageに型キャストしつつｓtoryboardの画像に変換。
        if let image = info[.originalImage] as? UIImage {
            imageView.image = image
          //CIImageに変換
            guard let clImage = CIImage(image: image) else { return }
           //画像認識用の関数の引数に打ち込む。
            detect(image: clImage)
        }
      dismiss(animated: true, completion: nil)
    }

```

必要なものをimport（＋必要なものをｓtoryboardに追加。）
----

```swift
import UIKit
import CoreML
import Vision
.
.
.

//----------この間にいろいろある----------
@IBAction func cameraTapped(_ sender: UIBarButtonItem) {
        present(imagePicker, animated: true, completion: nil)
    }

```

CoreMLで画像認識
----


```swift
func detect(image:CIImage) {
       //modelをインスタンス化
        guard let model = try? VNCoreMLModel(for: Inceptionv3().model) else { fatalError("👿") }
      //Visionフレームワークからモデル解析始めるよリクエストを作成しする
        let request = VNCoreMLRequest(model: model) { request, error in
　　　　　　　　　　　　　　　　　　//結果が返ってくるので分類情報を入れるようの配列に変換して変数に入れる。
            guard let results = request.results as?
                    [VNClassificationObservation] else { return }
            print(results)

            if let firstResult = results.first {
                    self.navigationItem.title = firstResult.identifier            }
        }
　　　　　　　　　　　//実際にrequestを送る処理
        let handler = VNImageRequestHandler(ciImage: image)
        do {
　　　　　　　　　　　　　　　　　//実行
            try handler.perform([request])
        } catch let error as NSError {
            print(error)
        }
    }
```
【ReactNative】アプリ作成　使用ツール

ReactNativeでスマホアプリを作成しています

使用しているツールをまとめていきます
現在（20210831）製造途中ですので、随時更新していきます！

以下の技術、ツールを使用して製造中です
■使用言語：ReactNative
■コードの管理：AWS CodeCommit
■エディター：VScode
■デザイン：Figma
■チームでのコミニケーション：Slcak

詳細
■AWS CodeCommit
プライベート Git リポジトリをホストする、安全で高度にスケーラブルなマネージド型のソース管理サービス

■VScode
インデントを整理する拡張機能を使用しています

■Figma
Web系の知り合いに聞いたところ、Figmaは無料ツールで、デザイン案の作成には
十分な機能とのことで使用しました
使ってみれば使い方はわかりますし、私もこちらで十分かと思いました

■Slack
AWScodecommitを実行すると通知が来るように連携しています
[競プロ用]数列の総和をダブリングで算出する。

数列の総和をダブリングで算出する。
具体的な処理のイメージを湧かせるのが目的なのでコードは出てこない。

## ダブリングで総和を求める

例えば、次のような公比2の等比数列があったとする。
等比数列などでは公式により算出可能だがここではあえて利用しない。

```math
1 \quad 2 \quad 4 \quad 8 \quad ・・・
```

この数列のk項目(kはだいたい10^18とか膨大)を求める場合、ダブリングにより以下のようなテーブルを作成することで算出することができる。

例えば第5項目(=4回の公比を掛ける操作後時点)を求めるには以下。
表の縦軸は公比を掛ける回数(2^n)、横軸は掛けられる数である。
この辺は[昔の記事](https://qiita.com/Kept1994/items/ea91c057b0e552323da3)にまとめた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/8156978d-27e0-5b4b-6ac6-557ed7cbeebc.png)

では和を求める場合はどうするか？

```math
1 + 2 + 4 + 8 + ・・・
```

この場合、新たに和のダブリングテーブルを用意し、以下の容量で表を埋めていく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/4c589a06-ff83-4b93-207d-9eae1d713db8.png)

例えば第4項までの和を求める方法は以下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/030dd020-6a06-b8f8-9876-1e801bde246a.png)

これは何をしているかというと、

```
N項目までの和 = [1項目からN/2項目までの和] + [N/2+1項目からN項目までの和]
```

であることから、

初項を開始状態とした和のダブリングテーブルの2^1項目までの和とN/2+1項目を開始状態としたダブリングの2^1項目までの和の総和を求めている。

絵にすると以下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/d189f640-49a1-612b-5565-cd982c12dbcd.png)

そのため、一度、N/2+1項目の数を求めるために数列のダブリングテーブルを参照している。

では中途半端な項までの和を求めるにはどうするか？

例えば第5項までの和では以下のように表現できる。

```math
5 = 2^2 + 2^0
```
であることから、2^2項目までの総和を求め、まだ足していない第5項の数を数列のダブリングテーブルから算出する。
この第5項目を新たな初項として2^0項目までの数列と見なすことで、先ほど構築した和のダブリングテーブルを再利用することができ、その和が16と読み取れる。よって、`15 + 16`で算出できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/421705e3-1720-1d12-ea53-c28bd90b6deb.png)

```math
1 + 2 + 4 + 8 + 16 + 32 ・・・
```

同じく、第6項目までの和が知りたいのなら以下であることから、`15 + 48`で算出できる。

```math
5 = 2^2 + 2^1
```

この操作を繰り返すことで、膨大な第N項までの和を要求されても処理することができる。
等比数列などでは値が無限に大きくなるのでなんとも言えないが、modとった特殊な数列などでは出現する数(テーブルの横軸)に上限(Mとする)があるので、求めたい第N項までのテーブル構築にO(MlogN)。総和の算出にO(logN)。よってO(MlogN)で算出できる。

## 例題

https://atcoder.jp/contests/abc179/tasks/abc179_e

## 余談

ただ、modとった数列の場合どこかで同じ数字が出現するとそれ以降は同じ流れの繰り返しになる(鳩の巣)ので、周期性を使って1発で計算することもできるので、必要ないと言えば必要ない。
Lazypredictを使ってみた


* 製造業出身のデータサイエンティストがお送りする記事
* 今回はLazypredictを使ってみました。

## Lazypredictとは
Lazypredictは、AutoMLではないですが複数行のコードで数十のモデルを構築して比較する事が可能なライブラリーです。回帰問題と分類問題に使用する事ができます。
細かい内容は[Githubリポジトリ](https://github.com/shankarpandala/lazypredict)を参照して頂けますと幸いです。

## Lazypredictの実装
今回もUCI Machine Learning Repositoryで公開されているボストン住宅の価格データを用いて予測モデルを構築します。

最初にライブラリーをインストールしますが、pipで簡単にインストール可能です。

```php
pip install lazypredict
```

ここから、普通にライブラリーをインポートして行きます。

```php

# ライブラリーのインポート
import os

import pandas as pd
import numpy as np

import seaborn as sns
import matplotlib.pyplot as plt

%matplotlib inline

# ボストンの住宅価格データ
from sklearn.datasets import load_boston

# 前処理
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# Lazypredict Regressor
from lazypredict.Supervised import LazyRegressor
import lazypredict

# データセットの読込み
boston = load_boston()

# 説明変数の格納
df = pd.DataFrame(boston.data, columns = boston.feature_names)
# 目的変数の追加
df['MEDV'] = boston.target

# データの中身を確認
df.head()
```

![スクリーンショット 2020-11-09 20.33.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/2ffa1a41-98dd-2798-1f6d-8f3385bf5f75.png)

次にデータセットを分割します（train, valid, test）。

```php
# ランダムシード値
RANDOM_STATE = 10

# 学習データと評価データの割合
TEST_SIZE = 0.2

# 学習データと評価データを作成
x_train, x_test, y_train, y_test = train_test_split(
    df.iloc[:, 0 : df.shape[1] - 1],
    df.iloc[:, df.shape[1] - 1],
    test_size=TEST_SIZE,
    random_state=RANDOM_STATE,
)
```

次にモデルの学習を行います。

```php
# Lazy Predict（回帰）の設定と実行
reg = LazyRegressor(
    verbose=0,
    ignore_warnings=False,
    custom_metric=None,
    predictions=True,
    random_state=RANDOM_STATE,
)
models, predictions = reg.fit(x_train, x_test, y_train, y_test)
```

構築したモデルのtestデータに対する評価指標一覧はmodelsに格納されております。

```php
# 検証結果
models
```

一部だけをアップしますが、下記のようにDataFrame形式で格納されております。

![スクリーンショット 2021-08-10 13.07.20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/6e7cbbde-1221-5ee0-a56d-194310cb293c.jpeg)

各モデルの予測結果も簡単に確認することができます。

```php
# 予測値
predictions
```

![スクリーンショット 2021-08-10 13.09.19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/fa6a1f07-0dd3-962d-c36d-4aec63037df9.jpeg)

##さいごに
最後まで読んで頂き、ありがとうございました。
今回はLazypredictを使ってみました。
機能的には他のAutoMLライブラリーの方が良いですが、簡単に実装する上では数行で済むため良いなと思いました。

訂正要望がありましたら、ご連絡頂けますと幸いです。
いまさらawkを紹介

## はじめに
最近、某大手のジョブスケジュラーの出力CSVを整理するという雑務で、久々にshellScriptとawkでテキスト処理をおこなったので、今更ながら思いながらawkを便利さを語りたい。

## awkとは
awkとは、UnixやLinuxでデフォルトで入っていて、ファイル処理用のパターンマッチングに適したユーティリティプログラム。Shellもかけて、sedと組み合わせたら超便利。
行毎のテキストファイルを処理するの適していて、列の入れ替えや加工も余裕です。
GNUの拡張版でパターンマッチングに正規表現が使えるgawkもあります。

UNIX,LINUXで仕事してきたおじさんたちは、まぁ、使えるはず。しらんけど。

## awkの実行構文
awkは、1例であるが下記のような実行方法に実行を行う。

-- Scriptを直書き
awk [option] 'Script' input-files
-- Script-fileを指定(拡張子は、awk)
awk [option] -f script-file input-files

あとは、cat等の標準入力を使ったパターンもあるが割愛します。

## 入力データ
レコードとフィールドに分割され、レコードは行、フィールドは空白文字で区切られます。レコードとフィールドの区切り文字は  RS と FS で指定して変更できます。

下記のような空白文字区切りのtxtがあります.
前述がわかるように一例を記載します。

```
[qiita]
cat hoge.txt
あ い う え お
か きくけこ
たち つ て と

## $0 で行全体
[qiita]
awk '{print $0}' hoge.txt
あ い う え お
か きくけこ
たち つ て と

## $1 $3 でテキストの1列目と3列目を抽出し表示
[qiita]
awk '{print $1 $3}' hoge.txt
あう
か
たちて
```
## Scriptの記載方法
awkのScriptは、パターン(pattern)と処理手順(Procedure)に別れます。

pattern { procedure }

パターンは、省略ができ、省力すると全ての行が処理手順が適用されます

-- 正規表現が指定できます。

[例]
1.正規表現で[あ]から始まる行の1列目、2列目を表示

```
[qiita]
awk '/^あ/ { print $1 $2 }' hoge.txt
あい
```


2. 条件に合致した行を対象とする($1が[あ]の行だけ)

```
[qiita]
awk '$1 == "あ" {print $0 }' hoge.txt
あ い う え お
```

3. BEGIN, END は,、一番最初と一番最後に処理を実行します。

```
[qiita]
awk '
> BEGIN { print "BEGIN" }
> {print $0 }
> END{ print "END"}
> ' hoge.txt
BEGIN
あ い う え お
か きくけこ
たち つ て と
END
```

## まとめ
ちょっと長くなってきので終わりにします
まだまだ組み込み変数や演算子やら関数がありますが、awkに興味を持たれたら、
便利だと思うので一度使ってみてください。
【Flutter】Flutter create . 直後のFlutter runでBUILD FAILDEして心が折れそうな時

Flutter runでいきなりFailしたときの備忘録です。
GradleのVersion差異によるエラーって初心者泣かせだと思います。
ググってもJava実装でのエラーくらいしか出てきません。

環境

```
Emulator Android
Flutter 2.4.0-4.2.pre
```

実行コマンド

```shell:
$ flutter create . 
$ flutter run
```


```android/build.gradle
buildscript {
    ext.kotlin_version = '1.3.50'
    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
```

１回目のBuild

```shell:error.log
FAILURE: Build failed with an exception.

* Where:
Build file '/home/tamon/Workspace/flutter_test_android/android/app/build.gradle' line: 24

* What went wrong:
A problem occurred evaluating project ':app'.
> org/apache/http/client/HttpClient

```

2回目のBuild

```shell:error.log
FAILURE: Build failed with an exception.

* Where:
Build file '/home/tamon/work/dc-flutter/ivi/android/app/build.gradle' line: 24

* What went wrong:
A problem occurred evaluating project ':app'.
> Could not initialize class com.android.build.gradle.internal.crash.PluginCrashReporter
...
```

---
解決策
gradleのversionを下げるとbuild successできました。
gradleのversionがgradle pluginの求めるversionを満たしていなかったためのエラーでした。

参考: https://qiita.com/izuki_y/items/3c20cd1c655fc4fc6127




```diff:android/gradle/wrapper/gradle-wrapper.properties
- distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
+ distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
```
C言語　標準入力をインクルードする方法

ツイッターでみたのでやってみました。

```c
#include <stdio.h>

int main()
{
	printf("%s\n",
#include "/dev/stdin"
	);
	return (0);
}
```

## 標準入力を受け取ってコンパイル

```
echo '"aiueo"' > in
gcc test.c < in && ./a.out            
```

### 出力結果

```
aiueo
```

## 参考

https://twitter.com/Poita_/status/1198413809670598662