OmniAICreator/Qiita-1.07M huggingface dataset:
【Git】ローカルにないリモートブランチを、ローカルに反映したい

# ローカルにないリモートブランチを、ローカルに反映したい

## 基本はこれでできるはず

例えばこんな状況で、`main` をローカルに持ってきたいとき

```
（branch -a オプションは、ローカルとリモートに存在するブランチを表示してくれます）
$ git branch -a
* develop
  remotes/origin/HEAD -> origin/develop
  remotes/origin/main
```
そんなときは、`git checkout -b [branch_name] origin/[branch_name]`で解決します

```
$ git checkout -b main origin/main
Branch 'main' set up to track remote branch 'main' from 'origin'.
Switched to a new branch 'main'

$ git branch 
* main
  develop
```

ちなみに`[branch_name]`をtypoするとただエラーになるだけで、間違った名前でブランチが作られることはありません

**ここからは、この通りに行かない場合についての対処法です**

## 【問題１】git branch -a に、あるはずのリモートブランチがない！

リモートのgit（githubやgitlabなど）には、`main` ブランチが存在しているのに
`git branch -a` で表示されないことがあります。

```
$ git branch -a
* develop
  remotes/origin/HEAD -> origin/develop
```


そんなときは、ブランチではなく`origin` のみを`fetch`すると
現在のブランチなどのoriginの状況が反映されます。

```
$ git fetch origin
* develop
remote: Enumerating objects: 463, done.
remote: Counting objects: 100% (463/463), done.
remote: Compressing objects: 100% (156/156), done.
remote: Total 463 (delta 311), reused 431 (delta 293), pack-reused 0
Receiving objects: 100% (463/463), 103.55 KiB | 623.00 KiB/s, done.
Resolving deltas: 100% (311/311), completed with 37 local objects.
From github-hoge:hoge/hoge-branch
 * [new branch]      main     -> main
```

しかし、これをしてもブランチが反映されないことがあります。

## 【問題２】git fetch origin したのにブランチが反映されない！

そんなときは、`.git` の設定ファイルがおかしい可能性があります

`.git/config`を開くとこんな感じになっていませんか⁇

```
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
[remote "origin"]
	url = git@github-hoge:hoge/hoge-branch.git
	fetch = +refs/heads/*:refs/remotes/origin/develop
[branch "develop"]
	remote = origin
	merge = refs/heads/develop
```

この`fetch`部分が、`develop` 以下になっているのが問題です

ワイルドカードに変更してあげれば、`fetch origin`でorigin配下を反映できるようになります

```
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
[remote "origin"]
	url = git@github-hoge:hoge/hoge-branch.git
	fetch = +refs/heads/*:refs/remotes/origin/*  ## developから変更
[branch "develop"]
	remote = origin
	merge = refs/heads/develop
```


以上です🙏
大体の場合は、`fetch origin`  までで実現できるはずです！
SORACOM BeamによるGCPとのMQTT通信のプラットフォームバージョン「201912」対応についての覚書

# 記事の概要

SORACOM Beamのプラットフォームバージョン「201912」へ対応するために、MQTTバージョンを3.1.1 に設定する方法を紹介します

# 背景

[EC21-JとSORACOM IoT SIMによりGoogle IoT CoreでMQTT接続を行うまでの全過程の記録](https://qiita.com/Kosuke_Matsui/items/2ad4ba5f281cbc77e32b)においてSORACOM Beamというサービスを用いて、セキュリティの面倒な設定なしでも安全にデータの送受信ができることを紹介しました。

そのSORACOM Beamではプラットフォームバージョン「201912」が推奨されており、旧バージョン「201509」は2021年11月でサポート終了します。

以前の記事では「201509」を使用していたので「201912」に変更したところ、MQTTのPublishができなくなってしまいました。
SORACOMのサポートに問い合わせたところ、MQTTバージョンを3.1.1 に設定しないといけないことを教えていただきました

# MQTTバージョン3.1.1設定方法

## AT+QMTCFG=“version”,\<client_idx\>[,\<vsn\>]
MQTTのプロトコルバージョンを設定します。
今回は\<client_idx\>を0に、\<vsn\>を4に設定します。

```
AT+QMTCFG="VERSION",0,4
```

## 設定順序

Soracom Beamに接続する前に、MQTTバージョンを変更します。

```
AT+QMTCFG="VERSION",0,4
AT+QMTOPEN=0,"beam.soracom.io",1883
```

この設定によりプラットフォームバージョン「201912」でもMQTT通信可能になりました
Goのvalidatorパッケージで、バリデーションをしつつ空白を許容する場合


1~2ヶ月くらい前からGoを書き始めてるのですが、
下記でハマったというか、  カスタムバリデーションを作ろうとしてしまったので、備忘録的に記載。
Goの[validator](https://pkg.go.dev/github.com/go-playground/validator)で、空白を許容しつつバリデーションをしたい場合、[omitempty](https://pkg.go.dev/github.com/go-playground/validator#hdr-Omit_Empty)タグを利用すれば良い。

## 例

```go
type testForm struct {
	code           string validate:"omitempty,len=6"`
}
```

## ハマった理由

[required](https://pkg.go.dev/github.com/go-playground/validator#hdr-Required)のバリデーションが存在するのに、なぜ他のバリデーションに関して空白を許容しないのかと混乱しつつ、omitemptyの存在に気がつけなかった。
[JavaScript] 概念の復習

#####CodeSandbox
Web上で利用するブラウザIDE、いわゆる統合開発環境で、利用出来る主な言語はjavascript(node.js)です。 統合開発環境という言葉に聞き覚えが無い方は、シンプルにeclipseやNetBeans(エディタ + 実行環境)の事を指していると思って頂いて差し支えありません。

vanilla・・・ライブラリー等を何も入れていないJavaScript

#仮想DOM
#####DOM
HTMLなどを解釈し、ツリー構造で表現したもの

#####仮想DOM
JavaScriptのオブジェクトで仮想的に作られたDOM

いきなりDOMを操作するのではなく、JS上で仮想DOMを操作し、
差分を出してから、実際にDOMに反映させます。

#npm / yarn等のパッケージマネージャーの意義
#####初期JavaScript
１つのJSファイルに全ての処理を記述していた
・処理が複雑になるにつれてコードがカオス化
・コードの再利用ができない

↓

#####少し改善したJavaScript
他のJSファイルを読み込んで使っていった
・コードの再利用、共通化はできるようになった
・読み込み順を意識しないとエラーが起きる
・何がどこから読み込まれているかが分からない

↓

#####モダンJavaScript
npm, yarn等のパッケージマネージャーを使用
・内部でNode.jsが動いている
・依存関係を勝手に解決してくれる
・import先が明示的に分かる
・世界中で公開されているパッケージをコマンド１つで利用可能
・チーム内での共有が簡単になった

#####npm
パッケージのレジストリ
#####package.json
設計書的な役割
#####package-lock.json / yarn.lock
依存関係、バージョンの解決
#####node_modules
・各モジュールの実態
・JSファイルなど、サイズが膨大
・GitHubにはあげない

#ECMAScript
・JavaScriptの標準規格
・毎年１回発表される
・ES2014 = ES5,　ES2015 = ES6
・ES20xxの呼び方を一般化しようという動き
・ES2015で多くの機能追加があり、近代JSの転換期と言える

#モジュールバンドラー
複数のJS（css/image）ファイルを１つにまとめるためのもの

経緯/概念
・jsは細かく分けて開発した方がいい
・再利用性も開発効率も上がる
・でも本番環境で分かれてる必要はない
・読み込み数も増えてパフォーマンス良くなさそう
・本番用にビルドするときに１つのファイルにまとめよう
・依存関係もいい感じにまとめてくれるようにしよう

#トランスパイラ
新しいJavaScriptの記法を古い記法に変換してくれる

経緯/概念
・ES2015で便利な便利な機能が増えた
・どんどん使おう
・でもまだ対応していないブラウザがたくさんある
・じゃあ、開発は新しい記法でやって実行時に古い記法に変換されるようにしよう

#SPA（Single Page Application）
HTMLは１つのみで、JavaScriptで画面を書き換える
モダンJavaScriptはSPAが基本

メリット
・ページ遷移毎のチラつきがなくなる
・表示速度のアップによるユーザー体験向上
・コンポーネント分割が容易になることでの開発効率アップ
1台のパソコンで複数のGitアカウントを切り替えて使う設定（SSH接続）

自分メモです('ω')

複数Gitアカウントを使い分けたい事情があり、パソコンに設定した時のメモになります。またパソコン変える時の備忘用に。

##設定前の困った状況と対応方針

httpsトークンでの認証だと、どうしても端末のメインブラウザのCredentialに引っ張られてしまい上手く行かない。（私の場合はEdgeのMicrosoftアカウントのサインインに引っ張られる）せめて使用するCredentialを選ばせてくれたら良いのに。

トークンアクセスを拒否しパスワードアクセス（Basic認証）したら、すぐにGitHubから「もうBasic認証使えなくなるから、早くトークンアクセスに切り替えてね」なんてメールが来ちゃいました('ω')

そこで、GitHubではトークンアクセス推奨なのは承知の上で、SSH接続を試してみました。実施したことは以下の通り。

- メインアカウント/サブアカウント用のSSH鍵の生成、GitHubへのSSH公開鍵登録
- /.ssh/configを作成・編集し、接続先に応じてユーザー名とSSH秘密鍵を使い分け
- アカウント切り替えのシェルを作成（リモートリポジトリ、user.name、user.emailを切り替え）

##リモートリポジトリのURL指定の違い

まず、GitHubのリモートURLはここから確認できます。
<img width="50%" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264253/758f1442-68d4-eca0-f0a8-6ab8a12c2714.png">

↓こんな感じです。ハイパーリンクになってしまうので、「～」入れてます。

- HTTPS URL：https～/github.com/`アカウント`/`リポジトリ名`
- SSH URL：git@～github.com:`アカウント`/`リポジトリ名`

##SSH接続用のSSH鍵生成と公開鍵登録

こちらは以下記事が分かり易くまとまっているので、これを参考に作業します。

https://qiita.com/shizuma/items/2b2f873a0034839e47ce

##SSH接続の使い分け
まずはSSHの接続使い分けからです。（/.ssh/config）
ポイントは、実際の接続先となる`HostName`は「github.com」で同一ですが、シェル内でホスト指定の使い分けができるよう、別名で登録してあげることです。名前は何でもOKです。

```console:/.ssh/config
Host github.com.main
  HostName github.com
  User usernameA
  Port 22
  IdentityFile ~/.ssh/id_rsa_main
  TCPKeepAlive yes
  IdentitiesOnly yes
Host github.com.sub
  HostName github.com
  User usernameB
  Port 22
  IdentityFile ~/.ssh/id_rsa_sub
  TCPKeepAlive yes
  IdentitiesOnly yes
```

##Gitアカウントを切り替えるシェルの作成

続いてはGitアカウントを切り替えるシェルです。（/.bashrc）
これで、git configの`user.name`と`user.email`、`remote.origin.url`を書き換えています。関数名は分かり易ければ何でも。

```bash:/.bashrc
function gitMain() {
  git config --global user.name "usernameA"
  git config --global user.email emailAddressA
  git remote remove origin
  git remote add origin git@github.com.main:usernameA/repository-name.git
  git config --list
}
function gitSub() {
  git config --global user.name "usernameB"
  git config --global user.email emailAddressB
  git remote remove origin
  git remote add origin git@github.com.sub:usernameB/repository-name.git
  git config --list
}
```

これで、`GitMain`と`GitSub`を打つたびに参照するリモートリポジトリの切り替えができるようになります。私は不安なので、必ず`git config --list`で変更された環境を確認するようにしていますが、ここは無くても問題ないです。

## 終わりに

毎回作業している環境を意識しながら、切り替えながらの作業になりますので、人によっては面倒かもしれません。私的にはむしろブラックボックスにしてしまうとすぐ忘れてしまいそうなので、これくらいでちょうど良いです。

もっと高度なやり方をされている例も色々ありそうですが・・、それはその内。
こちらの記事、大いに参考にさせて頂きました。

https://qiita.com/yampy/items/24638156abd383e08758
iOSで広告を実装すると、ミュージックアプリのBGMが止まってしまう場合の対処法

# 概要
広告を実装したアプリを使っていると、裏でミュージックアプリで流している音楽が止まる場合があります。
その対処法になります。

# 音楽が止まる理由
iOSでアプリが音声を発する場合、デフォルトでは`アプリが音声を発した場合に他の音声を中断する` となっています。
そのため、広告を実装したことにより、何かの拍子で広告側が音楽をコントロールしようとして、その結果ミュージックアプリが流す音楽が止まるといったことが考えられます。

# 音楽が止まる問題の対処
自分のアプリで音声再生を行ったとしても中断しないようにします。
一番簡単な方法は`Category`の変更です。

iOSには `AudioSession`というものがあり、アプリやOS間での音声のコントロールをしています。
AudioSessionには`Category`というものがあり、ここで`サイレントスイッチONで無音になるか`、`他の音声の中断をするか`、が決定されます。
このCategoryを、アプリが音声を発した場合に他の音声を中断しないように設定することでミュージックアプリの音声の中断を行わないようにします。

このCategoryのデフォルト値は `.soloAmbient ` となっており、他の音楽を中断するものになっています。

ですので、このカテゴリを音声を中断しないものに変更すればいいわけです。
以下、簡単な表になりますが、他の音声を中断しないものは `.ambient` になるので、Categoryを.ambientに変更します。

| AVAudioSession.Category	| サイレントスイッチONで無音になるか | 他の音声の中断をするか|
|:--|:--|:--|
|.ambient|	Yes|	No|
|.soloAmbient (Default)|	Yes|	Yes|
|.playback|	No|	Yes |
|.record|	No |	Yes|
|.playAndRecord|	No|	Yes|
|.multiRoute|	No|	Yes|


公式のカテゴリの一覧はこちらです。

https://developer.apple.com/library/archive/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/AudioSessionCategoriesandModes/AudioSessionCategoriesandModes.html#//apple_ref/doc/uid/TP40007875-CH10-SW1

# Categoryの変更
以下のコードでCategoryを変更すると、アプリの音声再生でミュージックアプリの音楽が中断するのを防げます。

```swift
        do {
            try AVAudioSession.sharedInstance().setCategory(.ambient)
            try AVAudioSession.sharedInstance().setActive(true, options: [])
        } catch {
        }
```
[Rails] pre-commitの導入に触れてみた

#はじめに
rubocopを扱う際に、pre-commitを導入すると便利だったので確認の意味も込めて情報を整理する。

#pre-commitとは
前提に、Gitには「特定のアクションが発生した時にカスタムスクリプトを叩く方法（フック）」がある。この方法は下記の2つのグループに分けられ、それぞれ実行するものである。

- クライアントサイドの場合
 - コミットの操作の際に実行
 - マージの操作の際に実行

- サーバーサイドの場合
 - プッシュされたコミットの受け取りの際に実行

pre-commitは複数あるフックの中の1つで、クライアントサイド側で設定するフックである。

#pre-commitの期待される動作
「コミットメッセージが入力される前に実行されるフック」である。

####主な目的は「何かしらのコードを検査する」ことにある。
  - 今からコミットされるスナップショットを検査する。
  - 忘れた操作がないか確認する。
  - テストが実行できるか確認する。

このフックがゼロでない値を返す時、コミットを中断させることもできる。

#導入方法
まずはシステム全体にインストール

```ターミナル
gem install pre-commit
```

Gemfileに記述

```Gemfile
  gem "pre-commit", require: false
```

#導入場所
フックは、`.git/hooks/`に格納されている。

`git init`で新しいリポジトリを初期化する時には、Gitに同梱されているスクリプトのサンプルがhooksディレクトリに格納される。

サンプルは全てシェルスクリプトで書かれており、一部parlも使われている。
どんなスクリプトでも実行可能かつ適切に命名されていれば問題なく動作する。RubyでもPythonでも記述可能。

フックスクリプトを使用する場合、ファイル名の末尾が`.sample`となっているのでリネームして外してしまう。

`.git/hooks/pre-commit`となっていれば、自動的に実行されるようになる。

#実装方法
今回はコミットした際にrubocopコマンドを自動実行させる。
rubocopの導入については省略

```ターミナル
bundle install

# 対象レポジトリにgit/hooks/pre-commitファイルを作成
bundle exec pre-commit install

#bundler経由でpre-commitを実行
git config pre-commit.ruby "bundle exec ruby"

#git commit 時にrubocop が呼び出される
git config pre-commit.checks "rubocop"
```
これでコミットする直前に`rubocop`コマンドが自動実行されるようになる。

コミットが中断された場合は、指摘された場所を修正すれば問題なくコミットされるはず。



##参考もと
[Gitフック](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)
[jish/pre-commit](https://github.com/jish/pre-commit)
[【Ruby on Rails】rubocop と pre-commit を利用して git commit 時にコーディングチェックを行う](https://techblog.kyamanak.com/entry/2018/06/19/221910#pre-commit-%E3%81%A8%E3%81%AF)
[Ruby] バイナリーリサーチの実装

#はじめに
大学2回生？3回生？ぶりに、ソリサーチの実装を行ったので、アウトプット兼ねてまとめます。

#バイナリーリサーチとは
バイナリーソートとは、二分探索アルゴリズムのことです。アルゴリズム自体、難しくないので「汚くていいから実装しろ！」と言われればぐにできるものですが、きれいに書こうと思うとなかなか悩みました。

まずは、アルゴリズム全体の流れを以下の画像で見てみます。

![スクリーンショット 2021-05-21 10.50.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1128031/68264888-fa9d-57ae-3c1f-00a9f1eb396a.png)

参考URL：https://www.codereading.com/algo_and_ds/algo/binary_search.html

任意の値が、配列の真ん中の値よりも小さいか大きいかを判断して、探索対象を狭めていくアルゴリズムです。
###具体的手順
1. 配列をソートする(ここでは昇順でソートされたとする)
2. 配列の中央にある要素を調べる
3. 探索
4. 中央の要素が目的の値ではなく、目的のデータが中央の値より大きい場合、中央より後半の部分を調べる
5. 中央の要素が目的の値ではなく、目的のデータが中央の値より小さい場合、中央より前半の部分を調べる
6. 2.に戻る

#実際のコード

以上を実際に実装してみます。

```sort.rb
def binary_search(array, target)
  left = 0
  right =  array.length - 1
  while left <= right
    center = (left + right) / 2
    if array[center] == target
      return center
    elsif array[center] < target
      left = center + 1
    else
      right = center - 1
    end
  end
  return -1 
end

array=[1,3,5,6,9,10,13,20,26,31]

puts "検索したい数字を入力してください"
target = gets.to_i


result = binary_search(array,target)

if result == -1
  puts "#{target}は配列内に存在しません"
else
  puts "#{target}は配列の#{result + 1}番目に存在します "
end
```

これでは長いので、肝心の関数部分にだけ着目します

```関数.rb
def binary_search(array, target)
  left = 0
  right =  array.length - 1
  while left <= right
    center = (left + right) / 2
    if array[center] == target
      return center
    elsif array[center] < target
      left = center + 1
    else
      right = center - 1
    end
  end
  return -1 
end
```

4〜13行目で「中央の要素の定義」を行なって、「検索したい値が中央の要素の左右どちらにあるか」を確かめながら検索を行っています。14行目のreturn -1は何も当てはまるものがないときに、最終的な返り値になります。
ポイントは、配列の方を加工するのではなく中央値として定義している部分を更新して行っているという点です。
仮に、いちいち不要となった部分の配列を削除して新しい配列を用意するようにすると、最終的に有無の判定はできてもどこにあったかが分からなくなります。（インデックスが変わるため）
だからこそ、元の配列を変更しないで、中央値の更新のみで探索をしているのです。

#おわりに
今回、学生ぶりにバイナリーソートを実装しました。
この他にも、順番を並び替えるバブルソートだったりと他のアルゴリズムにも触れてみようと思います！
[Tableau] ちょっとした整理にもTableauを使ってみると意外といい

# はじめに

最近、ようやくちゃんとTableauを勉強し始めました。
なんとなくわかってきた気はするのですが、機能がとても多くて相変わらず目が回りそうです。

その中で、人に見せる豪奢なVizを作るだけがTableauの利点じゃないな、と思い始めたので記事を書くことにします。

# Tableauの良いとこは、その簡単さに尽きる

触れてみるまでは漠然と「Tableauってなんか綺麗なグラフ描けるやつでしょ」と言うイメージでしたが、実際に勉強してみると、もちろん綺麗なグラフが描けてテンションも上がるのですが、それよりも「気軽に使えること」の方が重要だと思うようになりました。

どれくらい気軽かと言うと、ちょっと頭を整理したいときにパッと描いて、満足したらそのまま保存せずに消しちゃうくらい。

もう、メモ帳ですね。

## 実例： データの仕様を調べるとき

最近僕は生データからその仕様を把握する作業が多いのですが、これが結構骨の折れる時間です。
5分に1度は「なんでドキュメントまとまってないんだ…」と呟きながら進めていくのですが、そこにちょっと助け舟を出してくれるのがTableauです。

そのデータにはいろんなフラグがあるのですが、フラグ同士の関係性が明確じゃないんですね。

例えば10個のフラグがあって

* Aのフラグが立つ時はBのフラグも必ず立つ
* BとCのフラグは必ず一緒に立つ

みたいな関係性があるのです。

もう1度「なんでドキュメントまとまってないんだ…」と呟いて、この関係性を紐解きます。

## どうする？

みなさんなら、どうやって調べますか？

まず自分はとりあえずPythonにデータを打ち込んで、とりあえずフラグの集計をしました。
aとbのフラグが立ってるケースが何個あって…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513463/664550b6-8f7a-f705-7ce4-625345f1897f.png)

なるほどわからん。
なんでドキュメントまとまってないんだ。

## Tableauにつっこんでみる

そして思い至ります。
*Tableauに突っ込んだらいいんじゃないの？*

すでにPythonのDataFrameになっていたので、必要な部分だけcsvに吐き出してTableauに読み込ませます。

で、フラグをずらっとディメンションに並べ、メジャーにはレコード数を指定すると……
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513463/1ce1d30f-0e7e-e785-1441-442b4842c4f4.png)

わかりやすい！

Tableauが勝手にレコードのない組み合わせを弾いてくれているので、10個のフラグがあるけど実際には6パターンの組み合わせしかないことがわかりました。
しかも5個のフラグは使われてすらいない！

そして、フラグの3~5は必ずセットで指定されていて、フラグ2が1の時にしか立たないこともわかります。
フラグ1とフラグ2〜5は独立していそうですね。

これでスッキリです。

## そして最後に…？

確認したいことが確認できたので、もう、保存せずにバッサリとTableauを閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513463/0929df26-e710-b54f-0c84-f2869cd6a45f.png)
ここまでの作業時間、5分とかです。

# まとめ

Tableauのとにかく強力なのは、パッとデータ読んでパッとデータをドラッグ＆ドロップしたら、それでOKと言う気軽さです。
このハードルの低さは日々の業務効率をアップさせることうけあいです。

カラフルで美しくわかりやすいVizを作るだけがTableuのいいところではなさそう、と言うお話でした。
【Twitter】目障りなプロモーションを非表示にするブックマークレットver.2【広告ブロック】

```js
javascript:(()=>{const e=document.createElement("style");e.innerText='[data-testid="placementTracking"] article{display:none}',document.head.appendChild(e)})();
```

#はじめに
ブラウザ版Twitterを使っています。[前回自分が投稿した記事](https://qiita.com/c3091/items/7d225e2a89b38e61eb0e)のコードについて検証と改善を重ねた結果、より短くて効率のいいブックマークレットが完成しました。全く別物になっています。いい感じなので紹介します。

#コードと解説
上記コードは以下のコードを圧縮したものです。

```js
(
    () => {
// ---------

const s = document.createElement('style');
s.innerText = '[data-testid="placementTracking"] article{display:none}';
document.head.appendChild(s);

// ---------
    }
)();
```

ざっと次のような流れになっています。

1. style要素を作成。
2. ツイッターの広告プロモーションの記事（articleタグ）について、{display:none}というスタイルをあてる。該当する記事には、``data-testid="placementTracking"``というdata-属性が設定されていることから、対象となる要素を``[data-testid="placementTracking"] article``としている。
3. ＜style＞を、＜head＞の最後に追加。

``data-testid="placementTracking"``はHTMLを解読するとわかる部分。ただし2021年5月現在のものです。予告なく変更される可能性があるのでご注意ください。

#まとめ
data-属性とスタイルシートを用いた手法を採用しました。
このブックマークレットは、twitter.com以外へ移動するか、何らかの事情でリロードされるまで有効であるようです。

本日もありがとうございました。

#参考

https://developer.mozilla.org/ja/docs/Learn/HTML/Howto/Use_data_attributes
mampがらみ

*ディレクトリ文字化け webサーバー
https://itecbook.com/%E6%8A%80%E8%A1%93%E7%B3%BB%E3%81%9D%E3%81%AE%E4%BB%96/apache-%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E5%90%8D%E3%81%AE%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91/1372/

*phpで文字化け サーバー言語側
https://plaza.rakuten.co.jp/taro3chidayo/diary/202005090000/
[Webを支える技術] HTMLのIDとクラス

# HTML
## headタグ
```html
<head>
  <title></title>
  <link />
  <script></script>
  <meta />
<head>
```

headには文書のメタ情報を入れます。

- title: 文書のタイトルを入れます
- link: 他のリソースのリンクが入ります。
- script: JavaScriptなどのクライアントサイドで動かせるスクリプトを入れます。
- meta: 上記のものに当てはまらないメタ情報を入れます。

## body
```
<body>
  <h1></h1>
  <main></main>
  <article></article>
  <section>
    <h2></h2>
  </section>
</body>
```

htmlのbodyには文書構造が入ります。文書を書くときに使うのが`<></>`に囲まれたタグです。

### 属性
htmlの全ての要素にはid属性とclass属性がつけられます。

#### id属性
一つのhtml内で一意なIDです。特別なタグに付けたり、文書のジャンプ(URIフラグメント)に使えます。

```html:id
<h1 id="primaray">HTML</h1>
```

#### class
その要素がどのクラスに属するのかを記述できます。基本的にはCSSを当てたりjsで管理したりするときに使います。

```html:class
<div class="warp">
  <p>hello</p>
</div>
```
matlabでBLEを使う⑧Inkbird IBS-TH1 MINI 温湿度計

[Inkbird 温湿度計 ミニ Bluetooth 温度計 湿度計 温湿度センサー 交換式電池 温湿度レコーダー データロガー 温湿度記録 ( IBS-TH1 MINI )](https://www.amazon.co.jp/Inkbird-%E3%83%96%E3%83%AB%E3%83%BC%E3%83%88%E3%82%A5%E3%83%BC%E3%82%B9-%E6%B8%A9%E6%B9%BF%E5%BA%A6%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC-Android-IBS-TH1/dp/B07D74CQLJ/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=Inkbird+%E6%B8%A9%E6%B9%BF%E5%BA%A6%E8%A8%88+%E3%83%9F%E3%83%8B+Bluetooth+%E6%B8%A9%E5%BA%A6%E8%A8%88+%E6%B9%BF%E5%BA%A6%E8%A8%88+%E6%B8%A9%E6%B9%BF%E5%BA%A6%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC+%E4%BA%A4%E6%8F%9B%E5%BC%8F%E9%9B%BB%E6%B1%A0+%E6%B8%A9%E6%B9%BF%E5%BA%A6%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%80%E3%83%BC+%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%82%AC%E3%83%BC+%E6%B8%A9%E6%B9%BF%E5%BA%A6%E8%A8%98%E9%8C%B2+%28+IBS-TH1+MINI+%29&qid=1621548781&sr=8-1)
が安価に入手できます。ここでは、BLEで温度と湿度を読み取ります。
###まずは情報を見る
　オン・セミコンダクターのBLEであるRSL10 Bluetooth Low Enaergy Exploerを使って情報を見ます。
　スキャンすると見つけました。アドバタイジングしているデータから、アドレスとLocalNameがわかります。UUIDはF0FFだとも言っています。
![sps101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/bf2ccb83-731e-d90e-0c71-9ad5e1e534c9.png)

　Connectし、Discover Serviceをクリックして、Servicesタブを開きます。
　UUIDがFFF0付近を見ます。Realtime dataとmeasureのデータが、温湿度のデータらしいですね。
![sps102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/8ca8a7e8-8cab-ea7f-57b4-4828698aa29f.png)

　接続、切る、接続、切る、接続するを繰り返した結果、Realtime dataは変化が見られます。1回目は、何もしていない状態、2回目は、本体を手で握ったとき、3回目は、その手を放して放置したときです。

``Data:0x5709761B00B97A
Data:0x5709891D008AEA
Data:0xBE09981A008508
``

　measureのデータは変化がないです。

``0x10082C1E2EABD7C3000000000000000000000000
0x10082C1E2EABD7C3000000000000000000000000
0x10082C1E2EABD7C3000000000000000000000000
``

　Realtime dataをじっくりと観察します。温湿度センサは、過去の経験から、握ると湿度はすぐに反応しますが、温度変化は緩やかです。変化していないのは09です。2バイト目と最初の1バイトを入れ替えて10進に直すと、室温に近い数字です。百で割ると、23.91、23.91、24.94とそれっぽいです。
　だったら、次の3,4バイトが湿度であろうと想定すると、70.30%、75.61%、68.08%が湿度で、あたりのようですね。00の後の数値は推測ができませんでした。
　いつもこのようにうまく類推できるわけではありません。毎回全然異なる数値が送られてくる時もあります。もしかしたら暗号化されているデータなのかもしれません。
###プログラム

```matlab
clear
scan = blelist("Timeout", 30);

Inkbird_address = "10082C1E2EAB";

Bot_ServiceUUID            = "FFF0";
data_CharacteristicUUID    = "FFF2";

for i=1:10
    b = ble(Inkbird_address);
    c10 = characteristic(b, Bot_ServiceUUID, data_CharacteristicUUID);
    data = read(c10);
    humi = (data(4)*256+data(3)) / 100.0;
    temp = (data(2)*256+data(1)) / 100.0;
    fprintf(' temperature is %.2fC Humi is %.1f%% \n', temp, humi);
    clear b;
    pause(10);
end
```

　実行結果です。
![sps103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/ba607a25-ac78-6c8b-b082-76752fa2ebc8.png)
UI隙間アジェスター

解像度を変更したときにカメラとカメラの隙間から本来写らないハズのUIが写ってしまう状態を解消するためのスクリプトです。

たとえば

https://qiita.com/RYUMAGE/items/5ba0dcbed5707b546af9

のようなUIを設置するとorthographicなカメラだと解像度によっては画面外で待機中のUIが見えてしまいます。そこで手前にimageを配置して隠してしまおうというものです。

※このスクリプトは16：9を目安にしているので上下の隙間だけ埋めます


```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SpaceFitter : MonoBehaviour
{
    public Image ShutterUp;
    public Image ShutterBottom;

    public void AdjustShutter(float aspect_x, float aspect_y)
    {
        float target_aspect = aspect_x / aspect_y;
        float window_aspect = (float)Screen.width / (float)Screen.height;

        float scale_height = window_aspect / target_aspect;
        scale_height = Mathf.Floor(scale_height * 100) * 0.01f;

        float posyrate = aspect_y - (aspect_y - scale_height * aspect_y) * 0.5f - (scale_height >= 1.0f ? 0 : 1.0f);

        ShutterUp.transform.localPosition = Vector3.up * posyrate;
        ShutterBottom.transform.localPosition = Vector3.down * posyrate;
    }

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        AdjustShutter(1280, 720);
    }
}

```
【Scratch】定義ブロックで一文字ずつしゃべるプログラムを作ろう!

この記事では、定義ブロックで一文字ずつしゃべるプログラムを作っていきます。
この記事は、Scratch中級者向けです。
定義ブロックの基本的な機能は、<a href= "https://ja.scratch-wiki.info/wiki/%E5%AE%9A%E7%BE%A9_(%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF)" >Scratchwiki</a>を参照してください。

#一文字ずつしゃべるプログラム
RPGの文字表示のような、「テテテテ・・・」というプログラムを
「〇〇と言う」ブロックでスプライトに喋らせるようにします。
まず、変数を2つ作ります。(下の図参照)

![変数](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1525654/0669724e-5f50-3574-8e9c-1e74b9d8736d.png)

下のような定義も作ります。

![定義](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1525654/18a67852-553a-d514-1321-c744b0129151.png)

では、実際にプログラムを組んでみましょう。
![Screenshot 2021-05-21 09.24.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1525654/34a03ee5-8fe0-35ad-179b-4bc3ccebb1a3.png)
大事なのは、「(表示内容の長さ)回繰り返す」の中です。
一つだけ演算をたくさん使っているブロックがあります。
その役割を簡単に言うと、「表示内容」という変数を「あ」から「あい」に書き換えるというものです。そう考えてみると、以外に簡単に理解できます。
なお、1文字あたり何秒待つか・プログラム中で鳴らす音などは、自分の好みに合わせて決めてください。
#最後に
自分好みのものに作り変えて、プロジェクトに使ってみましょう!
【algorithm】再帰

#はじめに
今回は、再帰についてみていこうと思います。

#再帰
処理中に自分自身を呼び出すことを再起呼び出しと言います。
そのような関数を再帰関数という。
例えば、1からNまでの総和を求める関数は再帰を使って以下のように定義することができます。
注意点として、`sum(N: 10)`をはじめに呼びますが、はじめに値を返すのは`sum(N: 0)`です。そして、最後に`sum(N: 10)`が値を返します。

```swift
func sum(N num: Int) -> Int {
    if num == 0 { return 0 }
    return num + sum(N: num - 1)
}
let result = sum(N: 10)
print(result) // 55
```

#ユークリッドの互除法
ユークリッドの互除法とは、二つの整数m, nの最大公約数（GCD（m, n））を求めるアルゴリズムです。
mをnで割った時のあまりをrとすると、
`GCD（m, n） = GCD(n, r)`
が成立します。
再帰関数を用いることで数学で有名なユークリッドの互除法のアルゴリズムが記述できます。

```swift
func GCD(m: Int, n: Int) -> Int {
    if n == 0 {
        return m
    }
    return GCD(m: n, n: m % n)
}
let result = GCD(m: 30, n: 7)
print(result) // 1
```

#フィボナッチ数列
フィボナッチ数列のアルゴリズムは、再帰を二度用いることで作れます。

```swift
F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 (n = 2, 3, ...)
```
と定義されます。

```swift
func fibo(n: Int) -> Int {
    if n == 0 {
        return 0
    } else if n == 1 {
        return 1
    }
    return fibo(n: n - 1) + fibo(n: n - 2)
}

let result = fibo(n: 10)
print(result) // 55
```
今、作成したフィボナッチ数列のアルゴリズムの計算量は以下の通りです。

```swift
O((1+√5)^n/2)
```

この膨大な計算量を少なくする方法はあるにはあるのですが、少々難しくなってしまうので、応用編などで紹介したいと思います。


#おわりに
数学の漸化式ににている？？？
再帰をマスターすれば、面白いことできそうな予感がしますね！
QRつかわずにLineの自分のアカウントをばらまく方法

# 解決したかったこと

正直ここに書くか？っていわれたらうん、微妙って感じだったんだが…
まぁ、ある意味技術的なことだしいっかなってことで、Qiitaに書いとく。

Lineを登録してもらう側のホスピタリティ向上を考えました。
正直、Lineの友達登録これが面倒…

- QRコードの保存
- QRコードを写真から選択
- IDから検索して追加
- 電話番号から検索して追加

いやいや、それぐらいやれよ？

ちがうちがうそうじゃない…
ワンポチで自分のこと友達登録してもらえたら素敵じゃないですか！！！

はい、で、Lineさんから公式には告知されてないですけどその解決方法です。

# 実現方法

Line友達登録の招待メール用のURLを取得です。
このリンクをふむだけで、友達登録できる！やったね！

これ結構簡単で、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59111/32780057-dfaa-f76e-5511-78556f607ac3.jpeg" width="250px">

とか自分のQRを適当なQRコードリーダーで読んでそのURLをメモしておくだけ！
※Lineに付属のQRコードリーダーでは読まないでね…
 
たとえば、自分のQRだったら、https://line.me/ti/p/vyO1WnCnL7
メールの署名とかにいれておけば！はい、自分のアカウントの拡散完了！

```
*:..。o○☆○o。..:*゜*:..。o○☆○o。..:*゜*:..。o○☆○o。..:*゜*:..。
株式会社XXXX
XXXXXX部　XXXXXX課
Name： XX XX
E-mail : XXXXXX-XXXXXX@XXXXXX.com
Line： https://line.me/ti/p/vyO1WnCnL7

〒XXX-XXXX
XX府XX市XX区XX町X丁目X-XX　XXXXX XXビル XF
*:..。o○☆○o。..:*゜*:..。o○☆○o。..:*゜*:..。o○☆○o。..:*゜*:..。
```

あ、ちなみにこのQRやらURLもう無効にしてるんで、登録はできません。


# 拡散されて収集がつかなくなったら…

[QRコードの更新](https://weekly.ascii.jp/elem/000/002/635/2635363/)

このあたりの記事みて、QRコードの更新してみてくださいね！
Windows 10  ファイルの拡張子を表示する方法

#ファイルの拡張子を表示する方法

1.タスクバーから「エクスプローラー」アイコンをクリック
2.「表示」タブをクリック
3.「ファイル名拡張子」チェックボックスにチェックを付ける
originとは？

## 勉強前イメージ

ドメインのことだと思ってたけど、違うみたい。。

## 調査

### originとは

この場合はwebのoriginになります。

originとはURLのスキーム(プロトコル)、ホスト(ドメイン)、ポートによって定義されています。
スキーム(プロトコル)、ホスト(ドメイン)、ポート が同一であれば同じoriginということになります。

### スキーム？ホスト？どの部分のこと？

例として、以下を使用します。

```
https://www.hogehoge.co.jp/home/blog
```

- スキーム : https://
- ホスト : www.hogehoge.co.jp
- ポート : ↑のURLでは省略されているのですが、 `https://www.hogehoge.co.jp:443` の443のこと 

### originの例

#### 同一origin

- https://www.hogehoge.co.jp/home/blog と比較して
	- https://www.hogehoge.co.jp:443/home/blog
		- ポートは同一(元々省略されている)
	- https://www.hogehoge.co.jp/home/recruit
		- スキームとホストは同様なので、ファイル名などは変わっても同一origin

#### 異なるorigin

- https://www.hogehoge.co.jp/home/blog と比較して
	- http://www.hogehoge.co.jp/home/blog
		- https から httpに変わっているので、スキームが異なる
	- https://www.hugahuga.co.jp/home/blog
		- hogehoge.co.jp から hugahuga.co.jp に変わってるので、ホストが異なる
	- https://www.hogehoge.co.jp:8080/home/blog
		- 省略されているが、443 から 8080 に変わっているので、ポートが異なる

## 勉強後イメージ

originはドメインと同様ではなかったのか・・・・
一緒のものだと思ってたけど、http→httpsに変わってもoriginは異なるのか。

## 参考

- [Origin (オリジン)](https://developer.mozilla.org/ja/docs/Glossary/Origin)
- [重要！ まずは「オリジン」を理解しよう](https://www.atmarkit.co.jp/ait/articles/1311/26/news007.html)
PythonでPDFから画像を抽出するもっとも簡単な方法

PDFに含まれるすべての画像を抽出する方法です。Python3.6+。Windowsで動かしましたがLinux等でも可能だと思います。

# 01. 環境
pyMuPDFというライブラリを以下のコマンドで入れます:

```sh
pip install pymupdf
```

pyMuPDF は `import fitz` でインポートできるライブラリです。PDFだけでなくEPUBなども読めます。[公式ドキュメントはここ](https://pymupdf.readthedocs.io/en/latest/index.html) で [PyPIの統計情報] (https://pypi.org/project/PyMuPDF/) を見ると2021/May が最新更新でGithubでは900を超えるスターが付いてます。Python3.6+で動作します。私はWindows上で動かしています。

# 02. 基本となる考え方
いくつか知っておくべき項目を列挙します。

- **PDFに入っている画像形式は不定です**。どの形式の画像を入れるかはPDF作成者が決められます。jpgやpngが多いですが JPEG 2000(拡張子:jpx) が使われることもあります。
- **画像抽出と画像変換は違う**: 抽出した画像が意図しない形式の場合, 画像変換をする必要がありますが, 本スクリプトでは対応しません。画像変換は後述しますが ImageMagick を使えばコマンドライン1行で可能です。
- **画像はレンダリングされて表示されているかも？**: PDF文書上は１つの画像に見えても内部的には複数の画像を重ね合わせて１つの画像のように見せていることもあります。その場合はページをレンダリングしてからスクリーンショットをとる操作が必要です。06章にその方法を記載したので、以下の方法でうまくいかない場合は試してみてください。

# 03. スクリプト仕様と実装
`test123.pdf` を入力とします。入力ファイルと同じディレクトリに `test123/` というディレクトリを作りその中に `0012_1.jpg` などのような `ページ数_番号.拡張子` という名称の画像を抽出します。実装はこうです:

```py
import os, sys
import fitz
 
def main(fname):
    dstdir = os.path.splitext(fname)[0]
    os.makedirs(dstdir, exist_ok=True)
    with fitz.open(fname) as doc:
        for i, page in enumerate(doc):
            for j, img in enumerate(page.getImageList()):
                x = doc.extractImage(img[0])
                name = os.path.join(dstdir, f"{i:04}_{j:02}.{x['ext']}")
                with open(name, "wb") as ofh:
                    ofh.write(x['image'])

if __name__ == "__main__":
    main(sys.argv[1])
```

簡単に実装を説明します

- `fitz.open`でPDFのオブジェクトを得ますが、これはイテラブルで, イテレートするとページオブジェクトが得られます。
- ページオブジェクトの`getImageList()`で画像一覧＝タプルのリストが得られます。タプルの第一要素が画像IDとなるので、このIDをキーにして`extractImage()`で画像データを取得します。
- 画像データの`ext`属性が拡張子, `image`属性が画像データのバイト列です。

# 04. おまけ(画像変換)
ImageMagickと呼ばれるCLI画像操作ツールがあります。これはめちゃくちゃ有名ですので入れておいて損はありません。Windowsでもポチポチクリックするだけでパスを通してくれます。

私がPDFから抽出した画像はJPEG 2000形式（拡張子:jpx）でした。これをpngに変換するコマンドは以下です:

```
magick mogrify -format png *.jpx
```

# 05. その他
- 画像変換をPillowでやろうとしたのですがpipで入るPillowではjp2のコーデックが入っていませんでした。再コンパイルすれば使えるかもという記述があるのですがWindowsで使うので諦めました
- pymupdf は [MuPDFという製品](https://www.mupdf.com/)の python bindings です。あまりよく読んでないのですが、GPL系のライセンスです。ソースコードは公開されておりプルリクエスト等はできますが、レポジトリの変更はArtifexという会社の社員のみだそうです。
- ドキュメントを読んで理解したい人は [チュートリアル](https://pymupdf.readthedocs.io/en/latest/tutorial.html) と [画像抽出HOWOTO](https://pymupdf.readthedocs.io/en/latest/faq.html#how-to-extract-images-pdf-documents) を読めば十分だと思います。
- pymupdf 自体にも画像変換の機能が備わっています([ドキュメント](https://pymupdf.readthedocs.io/en/latest/faq.html#how-to-convert-images))。jpeg,png などは上述のように抽出し、JPEG 2000は変換による劣化を甘受しつつスクリプト内で変換するという選択肢もあります

# 06. それでも上手くいかない時
PDF文書では、埋め込まれた複数の画像を重ね合わせることで一つの画像として表示することがあります。その場合は、上述の方法では上手くいきません。Webページをレンダリングしてからスクリーンショットをとるように、PDF文書もいちどレンダリングしてからスクリーンショット相当のことをする必要があります。そのためのスクリプトを記載します:

```py
import os, sys
import fitz

def main(fname):
    dstdir = os.path.splitext(fname)[0]
    os.makedirs(dstdir, exist_ok=True)
    with fitz.open(fname) as doc:
        for page in doc:
            pix = page.get_pixmap()
            pix.save(os.path.join(dstdir,f"p{page.number:04}.png"))

if __name__ == "__main__":
    main(sys.argv[1])
```
MicrosoftのRPA - Power Automate Desktop 2021年5月アップデートについて

皆さんこんにちは、マイクロソフトの川端です。
2021年5月のPower Automate Desktopのアップデート情報を紹介していきます。

#1. はじめに
元の情報（英語）はこちらになります。
https://flow.microsoft.com/ja-jp/blog/power-automate-desktop-may-2021-update/

本内容はPower Automate Desktopのバージョン2.9.29.21133での動作内容となります。

本バージョンから、Power Automate Desktopの新規バージョンがリリースされた場合にはPower Automate Desktopの利用ユーザーに通知され、そのままアップグレードできるようになりました！

Power Automate Desktopを最初にインストールする場合はこちらから：https://flow.microsoft.com/ja-jp/desktop/

#2. Power Automate Desktopの2021年5月アップデート情報
###アップデート通知がPAD上でなされるように
繰り返しとなりますが、マイクロソフトダウンロードセンターから新しいバージョンが通知され、インストーラーが直接ダウンロードできるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/ed217243-9729-882f-56df-1487b94c4c44.png)


###ヘルプメニューから利用できる項目が増えています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/6f48b594-c4b6-80d7-9144-503a4bd018fe.png)
上から順に
####ドキュメント
公式のdocsへのリンクです。
https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/introduction
####学習
Learnへのリンクです。
https://docs.microsoft.com/ja-jp/learn/browse/?products=power-platform&terms=Power%20Automate%20Desktop
####コミュニティ（英語）
PAD Forum Boardへのリンクです。Microsoft製品チームも参加しておりますので、直接Q&Aに参加可能です。
https://powerusers.microsoft.com/t5/Power-Automate-Desktop/bd-p/MPADesktop
####ブログ（英語）
このQiitaブログポストの元情報ですが、Microsoft公式のブログページ（PADの製品アップデートが中心）へのリンクです。
https://flow.microsoft.com/ja-jp/blog/category/product-updates/

####トラブルシューティング
トラブルシューティング（2021/05/21時点プレビュー）に関するコンソール画面が追加され、プレミアム（有償）ユーザーの方のデスクトップ端末（マシン）設定を行うことができるようになりました。
Power Automate Desktopではクラウドデスクトップ型のRPAでデスクトップフローがすべてクラウド側へ保存、AAD認証からPower Platform上の環境へ接続するため、クラウド環境との接続（[接続要件])が必須となっています。
接続先を別に持たせているアカウントを複数お持ちでユーザー切り替えの必要があれば、画面上で以下のサービスカウントを変更し接続先アカウントを切り替え可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/08963a90-48a8-60e3-b15f-e1c1400f1940.png)

また、以前はPADプログラム内の関連ディレクトリまで辿って参照しなければいけなかったデスクトップフロー、コンピューターログのファイルが、こちらの画面からワンクリックでzipファイルとしてエクスポートされるようになりました。
デザイナー、コンソール、ネットワーク(UIFlowService) etc、様々なログが参照しやすくなりました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/ecfbddde-85ca-56ea-f239-53b5539404d5.png)

###タイムアウトのパラメーターが[新しい<ブラウザ名>を起動する」アクションで追加されました
Edge、Chrome、Firefoxのブラウザーのアクションでタイムアウトのパラメーターが設定できるように高度化されました。
以前はブラウザ起動時、対象画面コントロールが出てくるまでに立ち上がり時に初期エラーが出ているケースが報告されていましたが、最大のタイムアウト時間（wait time）を指定できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/f6602c52-1eab-4a34-0269-b234b5c7af74.png)

###多言語対応が完了（日本語へは最初のリリースから対応済み）
現在、画面上のUIは41言語へ既に対応されており、ドキュメントは23言語に翻訳されています。

#3. 最後に
何かコメントがありましたら[Power Automate Community]までぜひコメント、フィードバックください！

[Power Automate Community]:https://powerusers.microsoft.com/t5/Microsoft-Power-Automate/ct-p/MPACommunity
[接続要件]:https://docs.microsoft.com/ja-jp/power-automate/ip-address-configuration#required-services
ページ内の画像を一括ダウンロード

```bash
#!/bin/bash

exec 2> "log.txt"
cd `dirname $0`


# 引数チェック
if [ $# != 1 ]; then
    echo "第1引数を設定してください ( 複数画像を含む URL )"
    exit 1
fi
target_url=$1
target_html=`curl -Ls $target_url`


# 保存用ディレクトリ生成
target_class_id="...保存したい画像を含む ID 属性を設定..."
header_title=`echo $target_html | xmllint --html --xpath '//*[@id="${target_class_id}"][1]/h1' - | sed -E "s/<h1>(.+)<\/h1>/\1/"`
new_dir="$header_title"
mkdir "$new_dir"
cd "$new_dir"


# ダウンロード
curl -Ls $target_url \
    | xmllint --html --xpath '//img/@src' - \
    | xargs -n 1 \
    | cut -d= -f2 \
    | sed 's/^\/\//http?s:\/\//' \
    | grep -E "\.(png|jpg|jpeg)$" \
    > ./tmp.txt

image_urls=`cat ./tmp.txt`

for image_url in $image_urls
do
    filename=`echo $image_url | sed -E "s/(.+)\/([0-9]*\.)(jpg|png|jpeg)/\2\3/"`

    echo "Download: $image_url"
    curl -LO $image_url

    filesize=`wc -c ./$filename | awk '{print $1}'`
    echo "filesize: $filesize"

    sleep 0.2
done


rm ./tmp.txt
exit 0
```

#### curl
- `-L` オプション ( --location )
    - リダイレクト先にもリクエスト可能へ
- `-s` オプション ( --silent )
    - 以下の例のようなダウンロードの進捗状況を非表示
- `-O` オプション ( --remote-name )
    - ファイルとしてダウンロード
    - ファイル名は URL のうち最後のパスを使用して保存

```bash
# 例: `-s` オプション無し ver.
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  470k  100  470k    0     0  3828k      0 --:--:-- --:--:-- --:--:-- 3828k
```

## 参考 URL
https://qiita.com/takayukioda/items/edf371b3566bea64d046

https://qiita.com/rllllho/items/cb1187cec0fb17fc650a
@emotion/core は @jsx jsx を書かなくても使える、の続き

https://qiita.com/Statham/items/8cbf6d5057ccb6d8feb8

# 問題

emotion v11では上のようにはうまく動かない様子。

# 解決

1. `/** @jsx jsx */`の除去
1. `Property 'css' does not exist on type ...`エラーの除去

## `/** @jsx jsx */`

https://emotion.sh/docs/@emotion/babel-preset-css-prop

```:core->react
$ yarn remove @emotion/core
$ yarn add @emotion/react
$ yarn add -D @emotion/babel-preset-css-prop
```

```:.babelrc
{
  "presets": ["@emotion/babel-preset-css-prop"]
}
```

オプション等あるが、基本これだけ。


## `Property 'css' does not exist on type ...`

https://emotion.sh/docs/emotion-11#css-prop-types

```ts:.d.ts相当のファイル
/// <reference types="@emotion/react/types/css-prop" />
```

自分はnextjsを使っているので、`next-env.d.ts`に追加した。


# サンプル

```tsx
import { css } from "@emotion/react"
import React from "react"
interface Props {}

const test: React.FC<Props> = (props) => {
  return (
    <div
      css={css`
        p {
          background-color: blueviolet;
        }
        span {
          background-color: burlywood;
        }
      `}
    >
      <p>aaaaa</p>
      <span>bbbbb</span>
    </div>
  )
}
export default test
```

個人的には
`import { css } from "@emotion/react"`
をしたほうが圧倒的に便利。cssにインテリセンスが効く。 

![Screen Shot 2021-05-21 at 8.15.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/e07866e6-04db-6e7c-0b04-412279408409.png)
Rubyで1行で複数データを入力し、文字列から数値に変換、数値から文字列に変換する方法



```Ruby
line = gets.chomp.split
#文字列から数値に変換
a = line[0].to_i
b = line[1].to_i
P = a - b
Q = a * b
#数値から文字列に変換
puts P.to_s + " " + Q.to_s
```

Rubyでは
to_i　・・・文字列データから数値データに変換
to_s  ・・・数値データから文字列データに変換
になります。
外部キーについて

##外部キーとは
二つのテーブル間の列同士で設置するもの
親テーブルと子テーブルの間で整合性を取ることができるようにする
　→ **外部キー制約**

###外部キー制約
親テーブルのデータを変更、削除しようとした時、子テーブルでデータが使われている場合、エラーにしたり同時に変更、削除するという選択が行える

##外部キーのメリット・デメリット

**メリット**

* 関係が適切に設計されている場合、DBで不整合を引き起こすことが少なくなる
* DBサーバで制約チェックが行われるため、アプリケーション側でのチェックが不要
* 連鎖更新及び削除をすると、アプリケーションコードの単純化になる
* 適切に設計された外部キールールでは、テーブル間の関係記述に役立つ

**デメリット**

* キー関係を設計する上で、循環ルールや連鎖削除の不適切な組み合わせなどの深刻な問題が生じることがある
* データベースレベルでの余分なチェックによるパフォーマンスの低下


##まとめ
Rails の設計において、関連性のあるテーブルは外部キー制約を設けている。
調べてみてわかったことは、外部キー制約を設けることで、各テーブル同士での整合性が確保しやすくなるということだった。
私が設計しているものは非常に小規模で、また単独で制作しており、複雑化することは考えにくいため基本的には制約を設けていきたい。
規模が大きくなればなるほど、実際にコードを書く前にしっかりとした設計を考えておく必要があると感じた。
Catalina で Erlang OTP 24.0.1 と Elixir 1.12.0 を asdf でインストールする

JITを搭載した新しいErlangであるOTP24がリリースされました。しかし，リリース前後にあった `autoconf`のバージョンアップにともなって`OTP24.0`の `configure` プロセスに不具合が出てしまうというアクシデントに見舞われました。そこで，[この Issue](https://github.com/erlang/otp/issues/4821) が立ち上がり，解決を図ったOTP24.0.1がリリースされました。

この記事は，Erlang OTP24.0.1の `asdf` でのビルド方法について紹介するものです。現状ではまだ `asdf-erlang` と，それが使用している `kerl` が追従していないので，ビルドに若干の手間がかかります。

# 動作確認した環境

次の環境で動作確認しました。

* macOS Catalina (x86_64)

Big Surでは x86_64, ARM ともに通常のインストールで大丈夫でした。

Linux環境は，現在当方の環境がメンテナンス中のため，しばらく試すことができません。もし試した人がいたら，教えてください。

## 追記

2021.5.21 14:00

もしかすると，この記事に書いたことは少なくとも Big Sur では既に不要になっているようです。

引き続き確認を続けます。

2021.5.21 20:40

Catalina では通常のインストールだと依然としてエラーとなりました。
Big Surでは問題が表出しないということだと思います。

2021.5.21 20.45

手順2は無くてもよいかもしれません。環境によってもし問題が出たらこの対処をするという感じだと思います。

2021.5.22 14:22

タイトルにCatalinaと明記しました。

# 1. asdf が使用している kerl にパッチを当てる

`~/.asdf/plugins/erlang/kerl` に https://github.com/erlang/otp/issues/4821#issuecomment-840342780 が示しているパッチを当てます。

```
diff --git a/kerl b/kerl
index 6345138..53c12f3 100755
--- a/kerl
+++ b/kerl
@@ -791,8 +791,9 @@ _flags() {
     # We need to munge the LD and DED flags for clang 9/10 shipped with
     # High Sierra (macOS 10.13) and Mojave (macOS 10.14) and quite
     # probably for Catalina (macOS 10.15)
+    # disabled (originally for Darwin)
     case "$KERL_SYSTEM" in
-        Darwin)
+        Darwin-disabled)
             osver=$(uname -r)
             case "$osver" in
                 # TODO: Remove this in a future kerl release, probably
```

# 2. もし途中でエラーになるならば，DED_LDFLAGS つきで asdf を用いて Erlang OTP 24.0.1 をビルドする

もし上記パッチを当ててビルドしてもエラーになるようであれば，次のようにインストールします。

```
DED_LDFLAGS="-m64 -bundle -bundle_loader ~/.asdf/plugins/erlang/kerl-home/builds/asdf_24.0.1/otp_src_24.0.1/bin/x86_64-apple-darwin19.6.0/beam.smp" asdf install erlang 24.0.1
```

# Elixir 1.12.0 をインストールする

```
asdf install elixir 1.12.0-otp-24
```
find, find_by, where メソッドについて

#find, find_by, whereメソッドについて
こちらの3種のメソッドについて、あまり理解をしないまま使用していたためこちらに自分で調べたことをメモしておく。

##findメソッド
主キーに対応するオブジェクトを取り出す

```
clients = Client.find(10)
# id = 10 の Client を 見つける
```

```
clients = Client.find([1, 10])
# id = 1 と 10 の Client を 見つける
```

##find_byメソッド
与えられた条件にマッチするレコードのうち、最初のレコードだけを返す

```
clients = Client.find_by first_name: 'Lifo'
# => #<Client id: 1, first_name: "Lifo" >
# id: 2 に "Lifo" があっても返ってこない
```

```
clients = Client.find_by first_name: 'Jon'
# => nil
# データがないときは nil が返ってくる
```
####find_by!メソッド

```
clients = Client.find_by first_name: 'Jon'
# => ActiveRecord::RecordNotFound
# nil は返ってこない
```

##whereメソッド
返されるレコードを制限するための条件を指定

1. 文字列
1. 配列
1. ハッシュ


```
Client.where("orders_count = '2'")
# 文字列
# orders_count が 2 である Client を 探す
```

```
Client.where("orders_count = ? ", params[:order])
# 配列
# 条件で使用する数値が変動する場合に使用
```

```
Client.where(locked: true)
# ハッシュ
# locked の値が true である Client を 探す
```

##まとめ
find ... 主キーで検索する、配列を使用すれば複数の検索が可
find_by ... レコードからマッチするものを検索する、最初の一つだけが返ってくる
where ... レコードからマッチするものを検索する、マッチしたものが返ってくる
【ExcelVBA基礎】1章：変数

はじめに
この章ではExcelVBAで扱う変数について説明をします。
データを保持することはプログラミングの基本です。Excelにはもともとデータを保持するために「セル」が用意されており、マクロから直接「セル」を操作することも可能です。しかし、この章で説明する変数や、2章で説明する配列にデータを保持することで、「マクロの記録」で作成されたマクロよりも複雑な処理を、より素早く処理することが可能となります。

1、変数とは
変数とはデータを格納できる記憶域のことで、強いてExcelに例えるならセル1つに相当するようなものです。

```
Sub sample_variable()

    Dim i As Long
    Dim name As String

    i = 0
    name = "あなた"

    MsgBox name & "はまだ" & i & "さいです"

End Sub
'結果 : あなたはまだ0さいです

```

2、変数の宣言
変数は原則宣言してから利用するものです。

```
    Dim i As Long
    Dim name As String
```

i）変数のスコープ(可視範囲)を指定する
宣言のはじめはその変数のスコープを指定します。「Dim」は宣言された変数がそのプロシージャ（Sub～End SubやFunction～End Functionのひとかたまり）の中でのみ参照可能であることを指定しています。

ii）変数の名前を決める
 「i」や「name」の部分に変数名を指定します。

☆ExcelVBA変数命名規則
・英数字（全角半角）が使用可
・漢字・ひらがな・カタカナが使用可
・記号はアンダーバー(_)のみ使用可
・空白（スペース）は使えない
・先頭に、数字・アンダーバーは使えない
・使えない予約語がある「Dim」「if」等
・長さは半角で255文字まで

上記の通り漢字等日本語名や英数字全角名での変数も作成可能ですが、読みづらくなる(保守性が下がる)ので通常は使用しないことを推奨します。

iii）定型文言「As」
　上述の予約語です。特に意味はありません。

iv）型を指定する
　型指定を必ずしなければならない、わけではありませんが型を指定する方が、あとから読みやすいので型はなるべく指定しましょう。

```
    Dim i As Long
    '-2,147,483,648～2,147,483,647の整数
    
    Dim name As String
    '文字列 文字数制限はほぼないと考えて差し支えない
```

上記はどんなマクロにもだいたい共通して使う型です。

3、変数への代入

```
    i = 0
    name = "あなた"
```

 ExcelVBAで「=」は別の意味を持つこともありますが、ここでは″代入″を意味します。右の値を左の変数へ代入します。

4、変数の書き換え・再利用
 変数はマクロ実行中に何度でも書き換え・再利用が可能です。

```
Sub sample_variable_reusable()

    Dim j As Long
    Dim p As String
    
    j = 649
    p = "れはよ"
    
    MsgBox "か" & p & j & "といった"
    
    p = "れは4"
    
    MsgBox "か" & p & j & "といった"

End Sub
'結果 : かれはよ649といった
'結果 : かれは4649といった
```

2章：配列
https://qiita.com/daichi05w/items/006ed98fee433f58b93f

序章：まえがきと目次
https://qiita.com/daichi05w/items/002f311490dabaaf14d0
SIMフリーモバイルルーターでSORACOMを使う方法

# はじめに
知っている人には当たり前のことですが、知人に「そんな良い方法が！」と驚かれたので投稿してみます。

IoTを簡単に試してみる場合、[SORACOM](https://soracom.jp/)のサービスが非常に手軽で便利です。
SORACOMでは[特定用途の専用デバイス](https://soracom.jp/store/s_category/iot-device/)や、[SIMが差し込める開発用デバイス](https://soracom.jp/store/s_category/dev-board/)など様々なデバイスを提供しており、以下のような利用が一般的かと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/b0274484-5620-bb0b-adfd-fa57c326dd3c.png)

一方、SIMフリーのモバイルルーターにSORACOMのSIMを入れて使うこともできます。

通常、Raspberry PiやM5Stackのような開発機器には標準でWi-Fiが搭載されているので、[USBドングル](https://soracom.jp/store/s_category/usb-dongle/)や[専用の拡張モジュール](https://soracom.jp/store/5231/)を購入する前に手軽に試す[^1]ことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/76e393d2-14e6-952b-7a07-cbfc8e48bd27.png)

[^1]: デバイスとモバイルルーター間がWi-Fi接続となるため、安定性を重視する場合はUSBドングルや専用モジュールがオススメです。

# 設定方法
私の勤務する会社で使う[NECのAterm MR05LN](https://www.aterm.jp/product/atermstation/product/mobile/mr05ln/)はデュアルSIMに対応しているので、設定により通常使用する通信と切り替えが可能です。
以下ではMR05LNで通常の通信情報を生かしたまま、設定を追加する方法を紹介します。

## SIMの挿入
1. 本体の電源を切り、背面の蓋を外し、SIM2にSORACOMのSIMを挿入する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/128ece6d-b08a-f9a2-0382-9c6c7d6e39ae.png)

1. 蓋を閉め、電源を入れる。

## APN設定
1. ホーム画面で「設定」をタップし、「APN設定」「SIM2」をタップする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/79170c4b-0339-069e-df87-b1af040267e2.png)

1. APN設定画面で「新規追加」「手動追加」をタップする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/76cc984d-6d38-1501-2376-c1927c50efc3.png)

1. 任意のサービス名（ここでは「SORACOM」としています）、APN「soracom.io（plan-DUの場合、du.soracom.io[^2]」、ユーザー名・パスワード共に「sora」を入力し、認証方式「CHAP（PAPでも可）」を選択して「登録」をタップする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/4b9b33de-4537-a7e6-6618-35231235af3c.png)

[^2]: https://soracom.jp/start/

1. APN設定画面に「SORACOM」が追加されているのでそれをタップし、「選択」、ホームをタップする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/8e640950-c231-f5bd-ec35-9c466a3db0a7.png)

## SIM切り替え
1. ホーム画面で「設定」をタップし、「SIM切替」「SIM2固定」をタップし、確認メッセージで「はい」をタップする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/953be98b-391e-c025-da66-12b7323416a2.png)

1. 切り替え完了後、SIM2が選択された状態でLTE接続が確認できればSORACOMへの接続完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/f3ddb9e9-c93d-0f52-cd0d-27f442ec2fc3.png)

元の通信に戻す場合は1.の手順で「SIM1固定」にしてください。

# 使用
Raspberry PiやM5Stackなどの機器でSSIDと暗号化キーを接続すると、各種SORACOMサービスにデータ送信可能となります。
実際の使用例は今後紹介できればと思います。

# 補足
今回、モバイルルーターを使った方法を紹介しましたが、同様の方法でSIMフリーのスマートフォンのテザリング機能を使うこともできます。
ただ、スマートフォンはバックグラウンドで様々な通信（メール受信やアプリの更新確認など）をするので、個人的にはあまりお勧めしません。

# 注意事項
当たり前のことではありますが、SSIDと暗号化キーが漏れると大変なことになるので、情報の取り扱いにはご注意ください。
index について

# indexとは
本の索引のようなものである。
<dl>
<dt>特定の単語を検索するとき</dt>
<dd>1ページ目から　→ 時間がかかり、非効率的</dd>
<dd>索引から探す　→ 直接該当のページへ飛べるため、効率的</dd>
</dl>

## indexによるパフォーマンス改善の理由
1. アプリケーションのコードに影響を与えない<br>
　インデックスを使うかどうかはDBMSが判断する<br>
　　→ インデックスさえ作成しておけば良いため、アプリケーションプログラムに影響を与えない
2. テーブルのデータに影響を与えない<br>
　インデックスを作成することで<br>

* テーブルに格納するデータ
* テーブルの構造

　いずれも影響を受けない<br>
　　→ インデックスを作成するときに論理設計を修正するような手戻りを考えなくて良い
3. 性能効果が大きい<br>
　インデックスの性能はデータ量に対して線形よりも緩く、劣化しない

## indexのメリット・デメリット
(例) B-treeインデックス<br>
**メリット**

1. 平衡木の構造をしているため、探索を同じ計算量で行える
1. B-treeの木の高さは「平べったい」木であるため、データ量が増えても性能が劣化しにくい
1. データの挿入、更新、削除のいずれのコストも探索と同等である
1. B-treeではキー値をソートするため、等号に限らず不等号やBETWEENといった検索の条件に対しても高速化を可能とする
1. B-treeではソートをしてから構築するため、使用する際にはソート処理をスキップすることが可能（ソート処理はかなりコストが高い演算である）

**デメリット**

1. データ量が少ないとフルスキャンと処理時間が変わらない
1. インデックスが作成されている列値に変更があると、インデックス内に保持している値も更新しなければならない
1. テーブルのデータが更新されると長期的には構造が崩れて性能が劣化してしまうため、定期的なメンテナンスが必要

## まとめ
インデックスは検索をすることがあるデータに対してはかなりの性能を発揮することを知った。
しかし、便利な反面デメリットもあるためDB設計の際にはインデックスが必要かどうかまず考えてから作成することが大事である。
Rails再々再入門宣言

## 「Rails入門やれ」って言われてどれくらいたった？

Railsは始めよう、ググればなんとかなるっしょと始めたあなた。
チュートリアル通りにやってるのに
エラーエラーのオンパレード。

* どこのどのファイルをどういじれば良いか分からない！
* ググれば横文字だらけ。日本語でOK！
* Command not foundはもういい！先に進ませて！
* エラー画面で何か言われてる。怖い！
* エラー画面が赤い。怖い！

Railsって簡単にできるって言ってたじゃん！嘘つき！
とだってだって何だもん…

を言い訳を繰り返すのは今日から止めにしよう！いっしょに！

## やろうとしていること
Railsを使ってウェブアプリを作れるようになる。

勉強しつつなので解説はできませんが、
「初心者がつまづく部分を初心者がどう解決したか」
見れるのが最大の売りになるはず。

### 基本原則4つ
#### 疑問は全部しらべる
ググる！聞く！メモる！
#### 必要があれば言語や分野を問わず勉強する
そのまんま。何でもやるお。
#### 作りたいモノを作る
やりたいのはチュートリアルじゃない。
#### あるモノを最大限利用する
0⇒1じゃなくて1⇒10をやろう。
賢い先人がつくってくれた仕組みで新しい価値を作ろう。

#### 筆者のスキルセット（？）
* 黒い画面（ターミナル・コマンドプロンプト）に全く抵抗がない（唯一誇れるとこ。）
* Railsは本当に勉強し始めたばかり。MVCとかは単語レベルでなんとなく。
* ルーティングとかの設定はなんとなくでしか知らない。ググれば行けるはず。
* HTML・CSSはしってるよ。ほんとだよ！ちょっとだけね！書かないけどね！（←）
* 飽き性かつ猪突猛進。朝早起きして勉強を続けられる。

### いったん締め
長すぎる記事は好きじゃないので
日時・やったことで区切って1記事としてアップしていこうと思います。

ゴールは「Webアプリケーションを自分の頭で考えて作れるようになること」！

よろしくお願いいたします。
[Ruby]あなたはメソッドの再定義(alias_method)を理解しているか。

# alias_methodとは
alias_methodは、既存のメソッド名に新しいメソッド名を付けて再定義するメソッドのことです。
また、これによって古いメソッドを新しいメソッドの名前で呼び出すことを**アラウンドエイリアス**と言います。

```ruby
class String
# lengthメソッドは文字列の長さを測定する
'ABC abc'.length #=> 7

  # lengthメソッドからreal_lengthメソッドという名前でメソッドを再定義
  alias_method :real_length, :length

  # 元のlengthメソッドをオーバーライド
  def length
    real_length > 10 ? 'Long' : 'Short'
  end

# 元のlengthメソッドの動きが可能(アラウンドエイリアス)
'ABC abc'.real_length #=> 7

# オーバーライドした内容で処理される
'ABC abc'.length #=> "Short"
end
```

## aliasとalias_methodの違いとは
似た様なもので`alias`というものもありますが、これは`使い方等はほとんど変わらないですが、似て非なるもの`です。
下記の表がaliasとalias_methodの違いをまとめたものです。

### aliasとalias_method対比表

| 説明 | alias | alias_method |
|:-:|:-:|:-:|
| メソッド名に文字列が使える  | 不可能  | 可能  |
| グローバル変数に別名をつける  | 可能  | 不可能  |
| メソッドである  | No  | Yes  |
| キーワードである  | Yes  | No  |
| オーバーライド  | 不可能  | 可能  |

# まとめ
メソッドを再定義することで、元のメソッドを拡張しやすかったりするので、便利な機能ですね。
「別名をつける」と表現されることもありますが、自分的には「再定義する」といった表現の方が分かりやすいなと思いました。
突然、業務上必要に駆られたひとのための、Go言語入門 - おかわり

https://qiita.com/e99h2121/items/68ec25a343d81eaae2e3

を書いたものの...


## Go言語入門、おかわり

やりたいことはなんとなくできるようになったが、もう少しGo言語と仲良くなりたくなったので、続き。以下など参考。

https://qiita.com/suin/items/22662f43b6a6e8728798

https://engineering.mercari.com/blog/entry/goforbeginners/


### 改めて

https://xn--go-hh0g6u.com/doc/

Go プログラミング言語はオープンソースプロジェクトで，プログラマの生産性を上げます。

> Go は表現力豊かで，すっきりして簡潔，なおかつ効率的な言語です。 並行メカニズムにより，マルチコアでネットワークにつながれたマシンの最大性能を引き出すプログラムを容易に書くことができます。 革新的な型システムがあり，柔軟でモジュール化されたプログラム構成となります。 Go は素早く機械語にコンパイルされます。 ガベージコレクションの便利さもあり，実行時のリフレクションも可能です。 速く，静的型付け，コンパイル言語でありながら，動的型付け，インタープリタ言語のような感覚でプログラムできます。



### どういう系譜

https://www.levenez.com/lang/

どこだろう...

http://rigaux.org/language-study/diagram.html

ここに居た。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/33d122e8-a0cf-0974-db23-996e0c15f253.png)


### お気軽に試すなら

https://play.golang.org/

### 宣言パターン

https://qiita.com/tfrcm/items/e2a3d7ce7ab8868e37f7#%E5%AE%9A%E7%BE%A9%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

これだけある

```go
// 宣言した後、値を代入パターン
var msg string
msg = "hello world"

// 宣言と代入を一緒にするパターン

var msg string = "Hello World"

// 宣言と代入を一緒にするパターン (型省略可能)
var msg = "Hello Hello"

// 宣言と代入を一緒にするパターン (var省略)
msg := "Super Hello"

```

### 思想

https://ja.wikipedia.org/wiki/Go_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)

> 軽量スレッディングのための機能、Pythonのような動的型付け言語のようなプログラミングの容易性、などの特徴もある。
> ブロックの区切りに波括弧を使う記法はC言語他多くと同様である。

設計者たちは、新しい言語として、以下の特徴を持つものを構想していた

> JavaやC++のように、静的に型付けされ、巨大なシステムでもスケールする
> RubyやPythonなどの動的な言語のように生産性（英語版）が高く、リーダブルであり、過度なボイラープレートが必要ない[22]
> IDEが必須ではない。ただし、十分にサポートする
> ネットワークおよびマルチプロセッシングをサポートする


### deferってなんだ

https://tour.golang.org/flowcontrol/12

https://qiita.com/Ishidall/items/8dd663de5755a15e84f2

### panicってなんだ

https://golang.org/doc/effective_go#panic

https://qiita.com/nayuneko/items/9534858156dfd50b43fb


### プログラムを終了するときのお作法

https://budougumi0617.github.io/2021/06/30/which_termination_method_should_choose_on_go/

> https://golang.org/pkg/os/#Exit
https://golang.org/pkg/builtin/#panic
https://golang.org/pkg/runtime/#Goexit
https://sharpknock.com/posts/programming/golang-exit.html

### GoのGC

https://zenn.dev/koron/articles/b96cccfa82c0c1


### 議論が長年熱い

https://qiita.com/hirokidaichi/items/adccebb41f77eaa6132f

https://www.kbaba1001.com/entry/2021/09/17/073149

https://zenn.dev/nobonobo/articles/74808a8d5e6f1e

https://zenn.dev/nobonobo/articles/3f5310248567a1

https://zenn.dev/takehiro0740/articles/b5ef4fc26e9ba6


新たな視点。

https://zenn.dev/moutend/articles/2edaa5d11f5ef12b5cfa


### 絶妙な顔つきのこいつ何

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/aaa7f81a-84d2-ba53-b87d-83e666985bc9.png)

https://blog.golang.org/gopher

Gopher というらしい。

https://www.techscore.com/blog/2016/12/02/love-gopher/

https://2ttf.com/HCQ3PvcaQ4U

https://qiita.com/mattn/items/b7889e3c036b408ae8bd


愛でよう。以上
合わせて参考になればさいわいです。
SyntaxError: Non-ASCII character '\xe6' in file

SyntaxError: Non-ASCII character '\xe6' in file sample_001.py on line 2, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

日本語を扱うには、一番最初に文字エンコードの定義が必要

```py
# coding:utf-8
print("こんにちは")
```