OmniAICreator/Qiita-1.07M huggingface dataset:
就活(転職)軸と人生における軸はわけて考える方が良いと思う

#はじめに
私はプログラミング未経験から転職活動を行い、自社開発企業に入社することが決まりました。

その際転職軸を考える際に、自己分析を行いましたが、人生で本当に行いたいことは寝ることやアニメを観ることでした笑

しかし、そのようなことは決して面接では言えません。

本気で自己分析を行っている方の多くは感じられた経験だと思います。
なので困惑してしまいます。

ただその軸も本当の軸、人生における軸です。

なので仕事をする上での考えるべき就活(転職)軸というには視点を変えて、別個で考える必要があると思っています。

#就活(転職)軸は仕事でしたいことで絞る
仕事でしたいことと、人生でしたいことをわけて考えると、就活(転職)軸見出しやすいと思います。

私は「人の役に立てるエンジニアリングをすること」を就活(転職)軸としていましたが、これも嘘偽りのない私の軸でした。

自分に正直になって仕事でしたいことで絞って就活(転職)軸を考えると、思考が整理されるかと思います。

以上です。
Rspec System Specでconfirmダイアログのテスト記述方法

#はじめに
system spec でテストをするとき、confirmのダイアログのテスト方法が分からなかった記述方法をまとめます。

<img width="400" alt="スクリーンショット 2021-02-27 11.08.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/f95ba418-2aae-53ea-febd-29d17a4b81b7.png">


#到達点
以下の1点を達成する
・confirmのダイアログのテストの記述方法を理解する

##流れ
① confirmのダイアログのテスト

#① confirmのダイアログのテスト
投稿記事を削除するとき、ダイアログが表示され、okをクリックすると削除されるかテストを記述します。
結論から言うと、
` expect(page.accept_confirm).to eq "本当に削除しますか？"`
という記述をするとよいです。

```rb:spec/systems/posts_spec.rb
it "削除ボタンを押すと、削除されること" do
  find(".alarm").click    *投稿削除ボタンをクリック
  expect do
    expect(page.accept_confirm).to eq "本当に削除しますか？"
    expect(page).to have_content "test_titleを削除しました"  *flashメッセージ
  end.to change(Post, :count).by(-1)
  is_expected.not_to have_content post.title   *記事一覧に削除した投稿がないことを確認
end
```
#参考記事
[使えるRSpec入門・その4「どんなブラウザ操作も自由自在！逆引きCapybara大辞典」](https://qiita.com/jnchito/items/607f956263c38a5fec24)
レビューで大量の指摘をして大きな手戻りを発生させた原因はレビューアの私にあった

# はじめに

私は十年近く前、レビューで大量の指摘を登録することが何度かありました。
当然、大量の指摘修正をしてもらうという行為は、手戻りであり、それだけプロジェクトの進捗を遅らせることになりました。

とても恥ずかしい話ですが、当時の私は、__レビューで大量の指摘で手戻る原因が、レビューイにあると思い込んでいました__(本当にごめんなさい)。
しかし、今、振り返ってみると、__手戻りの原因はレビューアである私にあった__と思います。
そのような恥ずかしい自分の行動を戒めるために、__どれだけ当時の自分が残念だったのかを紹介__します。
要するに反省文のようなものです。

# 今回対象とするレビューの前提条件

今回紹介するレビューは、以下の条件を満たすものでした。

- レビュー対象の成果物は、以下のいずれか。
  - 外部仕様書
  - 設計書
  - テスト仕様書
  - ソースコード
- __レビューイは、レビュー対象成果物を作成した経験が浅い__(数回の経験)。
- レビューアは、レビュー対象成果物を作成した経験が十分にある。
- レビューアは、自分がその成果物をレビューする役割であることを事前に知っている。
- __1時間くらいのレビューで20件以上の指摘が検出__された。

# レビューでどんな指摘をしたか

大量のレビュー指摘を登録する時は、以下のような指摘がいくつか散見されました。

- 以前のレビュー時に指摘した内容と同じ観点での指摘。
- 成果物を作成する前に方針を説明済みであるが、その方針通りに作られていないという指摘。
- この成果物の目的をちゃんと理解しているのかな？と思えるような指摘。
- 「なぜこのように作ったのか？」と質問すると「なんとなく」と回答される箇所の指摘。
- レビュー後に、指摘を修正してもらった後の確認時の差し戻し(例：指摘した箇所のみ修正し、類似の問題を横展開して修正できていない)。

__こういう指摘ばかりではありませんでしたが、レビューアからしたら「基本的なことができていない」と思えるような指摘があった__という意味です。


# 私が残念だったポイント

当時の私は、上記のような指摘があるのは「レビューイに原因がある」と思い込んでいました。
しかし、__経験の浅い状態では、そもそもどういう考え方でどういうことに気をつけて成果物を作るのか、1度説明されたくらいでは、分からなくて当然__だと思います。
当時の私は__「1度説明したからできるはず」という傲慢な考え方__だったと思います。
経験が浅いうちは、どのように考えて成果物を作るのか、__経験者の考え方を聞きながら体験しないと、なかなか実践できない__と思います。
だから、レビューアからしたら「基本的なことができていない」ということでも、__経験が浅いうちは「頭がテンパって落ち着いて考えられない」ため、基本的な見落としやミスが多発するのは仕方がない__と思います。

当時の私は「だったらレビューイから、事前に相談するなりすれば良いじゃないか」と言うかもしれませんが、それは難しいと思います。
経験が浅いうちは、とにかく自分で作ることにいっぱいいっぱいで、自分の考えが足りていないという自覚もないので、相談する必要性を当人が感じていない(ことが多い)と思います。
だから、経験のあるレビューア側が事前にフォローすることが必要だと思います。

それと、__心理学の面から言えば、レビューで「基本的なことができていない」という駄目出しばかりの指摘をするのは良くなかった__です。
__そんなことされたら、誰だって嫌__だと思います。
[有名な心理学の実験](https://studyhacker.net/enhancing-effect)で__「できていないことを叱咤する」より「できたところを称賛する」方が効果が高い__と言われているのに、その反対のことをやっていました。
__駄目出しばかりでは、やる気が低下して、その後の生産性も下がると思います__。


# どうすれば良かったのか

今の私であれば、こういう前提のレビューイに対して、自分がレビューアであれば、まずペアプログラミングを実施します。
__ペアプログラミングで、その成果物をどのように考えて作るのかを体験してもらって、その考え方をしっかり理解してもらいます__。
(対象成果物がソースコードでも外部仕様書でも、同じようにペアプログラミングで考え方を理解してもらいます)

__そうすれば、上に挙げた指摘の多くは事前に除去できる__と思います。

当時の私は「ペアプログラミングをする時間なんてない」とか言うかもしれませんが、「レビューの時間＋修正確認で何度も差し戻す時間」と「ペアプログラミングにかかる時間」は、そんなに変わらないと思います。
忙しいなら、__最初の1時間だけでも一緒にやれば、それだけでも効果はある__と思います。

何より、一度ペアプログラミングで考え方をしっかり学んでもらった方が、その後の生産性は間違いなく上がると思います。
(当時の私はそれをしなかったため、その後も多数のレビュー指摘を繰り返していました)

__ペアプログラミングでメンバーが成長するというのは、おそらく世界共通の認識__だと思います。
参考までに、以下の記事には、私のチームで感じたメンバーの成長点をまとめています。
[ペアプロ・モブプロでメンバーが驚くほど成長した話](https://qiita.com/kojimadev/items/5d0e03f3367eddc4fa67)

また、心理学の面でも、ペアプログラミングなら、たくさん指摘して駄目出しすることもないので、レビューイのやる気は下がりません。
むしろ、__ペアプログラミングの大きなメリットは「楽しい」こと__ですし、ペアプログラミングなら__称賛するチャンスがたくさん__あるので、やる気を上げる方向の効果があると思います。

# まとめ
当時の自分がどれだけ残念だったのかを紹介しました。
今後も、問題の原因が自分にあるのではないかという視点で、考えていこうと思います。

ちなみに私は、普段はエンジニアリングマネージャーとして、チームの皆で楽しく開発する施策を色々実施しています。詳しくは以下を参照ください。
[1年以上かけて生産性倍増＋成長し続けるチームになった施策を全部公開](https://qiita.com/kojimadev/items/4b28f801863cf4e8f0da)

Twitterでも開発に役立つ情報を発信しています → [@kojimadev](https://twitter.com/kojimadev)
Twitterで「エクセルは印刷するまで信じるな」がバズってるらしい

# はじめに
Twitterで「エクセルは印刷するまで信じるな」という投稿がバズってるらしいです。
※↓Twitterの読み込みに数秒かかるみたいです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">新社会人の皆さまへ <a href="https://t.co/qWBxW0GpwA">pic.twitter.com/qWBxW0GpwA</a></p>&mdash; 明治 乳子@療養中 (@maijchichico) <a href="https://twitter.com/maijchichico/status/1380478504702107650?ref_src=twsrc%5Etfw">April 9, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


印刷してみたら文字が枠外に出ていたり、プレビューに罫線が出てこなかったり。
何度Excelの印刷プレビューに泣かせれてきたか・・・。
バズるくらいなのでみんな泣かされてきたんでしょう。

この話になると

**「Excelは表計算ソフト。文書作成ソフトじゃない。」**
**「このペーパレスの時代に印刷するな！」**

と言われそうですが現状色々な現場で文書作成ソフトとして使われてしまってますよね。
紙に印刷してのミーティングもまだまだあります。

# じゃあ何を信じるか
100%これが最善策！というわけではないかもしれませんが、
現状Excelを信じられない大多数の人が行っている方法が

**一度PDF化してから印刷する**

だと思います。つまりExcelは信じないけど**ExcelのPDF保存機能は信じる**ということです。
Excelの標準機能で出来ますし手軽です。

少なくともExcelの印刷プレビューよりは印刷時とのズレがないです。

手順としては言わずもがなですが

`Excelの［ファイル］タブの［名前を付けて保存］を選択、［名前を付けて保存］ダイアログの「ファイルの種類」のプルダウンリストで「PDF（*.pdf）」を選択して保存。`


## Excel
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203022/94524312-18b5-478b-5695-bf29e3565396.png)

## PDF
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203022/f0b2cdb2-3aca-cf6d-6ae3-231d0869c072.png)

やっぱり結構ズレる。
PDF出力して確認したことでズレの確認が出来ました。

Excelの印刷問題は誰もが通った道だと思います。Qiitaが新人プログラマ応援イベント中なのでこれが新人プログラマさんの役に立ったら嬉しいです。

※**「このペーパレスの時代に印刷するな！」**以外で他に良い方法があったら是非教えてください！

以上です。
Android最新リリースをFirebase App Distributionにアップロードしようとすると、`Downgrade to this release` となる

## 状況
これまでのリリース

```
1. 0.2.9(1)
2. 0.2.9(2)
3. 0.2.9(3)
4. 0.2.9(4)
```

行いたいリリースバージョン ->
`0.3.0(1)`

## Issue
FADに `0.3.0(1)` をアップロードした時、
`Download` ボタンではなく、 `Downgrade to this release` というボタンが表示される。

そして、このDowngrade を行ってしまうと、ログイン情報などが消えてしまうという状況が発生した。

## 解決法
Build number (ex.(1)) は、リセットしてはいけないみたい。

リリースbuildを、 `0.3.0(5)` にすると解決。
つぶやきLDAP

# LDAP(Lightweight Directory Access Protocol) とは？

* 情報を一元管理し情報提供を行う「**ディレクトリサービス**」を提供するサーバへアクセスする際に使うプロトコルです。

# LDAPのキーワード

## LDAP識別名(DN:Distributed Name)

* LDAPによりディレクトリサービスにアクセスする際に、その対象を指定する手段です。
* 複数の**LDAP相対識別名(RDN)** をカンマで区切って並べたものです。

~~~ py
  cn=poodle, cn=Dog, dc=sample, dc=com
  # ドメイン「sample.com」のコンテナ「Dog」に配置したデータ「poodle」を示すDN。
  # 因みにcnは "Common-Name", dcは "Domain-Component" のことです。
~~~

## LDAP認証・LDAP連携

* Apacheなどのグループウェアサーバで、LDAP連携の設定をしておくと**グループウェアサーバ側にアカウント情報を入力しなくとも、LDAPに登録されたアカウント情報をもとに自動でアカウント作成できる**機能です。

設定例：

~~~ java
// sample-serverの設定を表示
# show running-config sample-server LDAP 
aaa-server LDAP protocol ldap
aaa-server LDAP (dmz) host 192.168.10.50
  ldap-base-dn dc=example,dc=com
  ldap-scope subtree
  ldap-naming-attribute sAMAccountName
  ldap-login-password *****
  ldap-login-dn cn=Administrator,cn=Users,dc=example,dc=com
  server-type microsoft
  ldap-attribute-map CSC

// LDAP Attribute Map の設定
# show running-config ldap attribute-map CSC
map-name memberOf Group-Policy
map-value memberOf CN=CSCO_VPN,OU=ENGINEERING,DC=example,DC=com GroupPolicy-CSC

// Connection Profile と Group Policy の設定
# show running-config tunnel-group TunnelGroup-CSC
tunnel-group TunnelGroup-CSC type remote-access
tunnel-group TunnelGroup-CSC general-attributes
authentication-server-group LDAP
~~~

# 参考

* https://tech-lab.sios.jp/archives/20661
* https://www.infraexpert.com/study/security19.html
* https://community.cisco.com/t5/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3-%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/asa-active-directory-ldap-%E9%80%A3%E6%90%BA%E3%81%AE%E8%A8%AD%E5%AE%9A%E4%BE%8B/ta-p/3292292
【javascript】配列のシャッフル2

前回の記事でsortが微妙だったのでreduceで書いてみた。

#コード

```javascript:
//要素の入れ替え関数
const swap = (a,i,j) => ( [a[i], a[j]] = [a[j], a[i]], a );
//reduceの内部処理
const reducer = (p,_,i,$,m=p.length-i) => swap(p, m-1, Math.floor(Math.random() * m));
//本体
const shuffleArray = arr => arr.reduce(reducer, arr.slice());

console.log(shuffleArray( [...Array(15).keys()]) );
```

色んなものを犠牲にした。

#一つにまとめた（追記）

```javascript:
const shuffleArray = arr => 
	arr.reduce((p,_,i,$,m=p.length-i,r=Math.floor(Math.random()*m--)) => 
		([p[m], p[r]] = [p[r], p[m]], p ), arr.slice());

console.log(shuffleArray( [...Array(15).keys()]) );
```
Node.js: kolorist でConsole.log に色を付ける

[10 Trending projects on GitHub for web developers - 9th April 2021](https://dev.to/iainfreestone/10-trending-projects-on-github-for-web-developers-9th-april-2021-1968) にて紹介されていたものをお試しした記録。

https://github.com/marvinhagemeister/kolorist

## 導入
`npm install --save-dev kolorist`

## お試し
```kolorist_test.js
import { red, cyan, blue, yellow, white, magenta, green, bgYellow, bgWhite, bold } from 'kolorist';

console.log(red(`Error: カラリストで色付きエラー ${cyan('kolorist_test.js')}.`));

console.log(blue('あお'));

console.log(magenta('マゼンタ'));

console.log(yellow('イエロー'));

console.log(green(bold('グリーン')));

console.log(bgYellow(white('背景イエロー')));

console.log(bgWhite(red('背景白')));



```

`node kolorist_test.mjs` でお試し。



## 出力結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/cab3f24d-3858-e31c-d26c-ea84b43601bc.png)


## 余談

本論と全く関係ないが mjs というものは何なのかは以下。

https://blog.jxck.io/entries/2017-08-15/universal-mjs-ecosystem.html
HTTPを理解する(curl,Postman編)

# curl, Postman, HTTPを理解する
・実行項目
curlコマンドで特定の記事を更新してください
curlコマンドで特定の記事を削除してください
postmanで特定の記事を更新してください
postmanで特定の記事を削除してください
<br>
<br>
<br>

### 1.curlコマンドで特定の記事を更新
以下ターミナル部分のコマンドをたたくと
[![Image from Gyazo](https://i.gyazo.com/fc1f473f344ea684d724cf6a421cffa1.gif)](https://gyazo.com/fc1f473f344ea684d724cf6a421cffa1)
以下
Title`hoge`Content `huga`のように更新されました！
[![Image from Gyazo](https://i.gyazo.com/709728a5661bed6dd33f795a10bcc685.png)](https://gyazo.com/709728a5661bed6dd33f795a10bcc685)

### 2.curlコマンドで特定の記事を削除
以下ターミナル部分のコマンドをたたくと
[![Image from Gyazo](https://i.gyazo.com/d8abc00e2fa1d77e9ab1e6077a53a101.gif)](https://gyazo.com/d8abc00e2fa1d77e9ab1e6077a53a101)
Title`hoge`Content `huga`は削除されました！
[![Image from Gyazo](https://i.gyazo.com/6477f229b0606783d1a403dc7c8e4c58.png)](https://gyazo.com/6477f229b0606783d1a403dc7c8e4c58)

### 3.postmanで特定の記事を更新
postmanを使い以下のように更新のリクエストを送信する
[![Image from Gyazo](https://i.gyazo.com/e5de55e3f9c88a0e355207d43cfe3bbf.png)](https://gyazo.com/e5de55e3f9c88a0e355207d43cfe3bbf)
Title`i am changeman`Content `i am updateman`に更新されました！
[![Image from Gyazo](https://i.gyazo.com/152140f7872bbeda2e1dfb781aa43a0e.png)](https://gyazo.com/152140f7872bbeda2e1dfb781aa43a0e)

### 4.postmanで特定の記事を削除
postmanを使い以下のように削除のリクエストを送信する
[![Image from Gyazo](https://i.gyazo.com/026c8b6bc9696a0e9a71bd1b8ed6077e.png)](https://gyazo.com/026c8b6bc9696a0e9a71bd1b8ed6077e)
Title`i am changeman`Content `i am updateman`は削除されました！
[![Image from Gyazo](https://i.gyazo.com/0cad29fa66f7ba0892451f4966afad10.png)](https://gyazo.com/0cad29fa66f7ba0892451f4966afad10)


### まとめ
今回の実行項目を通して理解しなければいけないことは、リクエストを送ることができればツールはなんだっていいんだよ！ということ。
一般ユーザーが理解しやすく、使いやすく感覚的に使用（リクエストを送る）するにはブラウザというインタフェースを作ってあげる必要がある。
Attention関連。Additive attentionとDot-product (multiplicative) attentionの比較。

#概要

Additive attention　と、Dot-product (multiplicative) attention　の比較の仕方がわからなかったので、記事にする。

以下のAttention is all you needの論文を参考にする。

https://arxiv.org/abs/1706.03762

Attention Is All You Need

Vaswani, Ashish, et al. "Attention is all you need." arXiv preprint arXiv:1706.03762 (2017).

#比較

論文引用

>The two most commonly used attention functions are additive attention [2], and dot-product (multiplicative) attention. 

まず、最も、一般的に使われるものとして、

* additive attention
* dot-product (multiplicative) attention

の2つを上げている。

次に比較としては、

>この2つは理論的な複雑さは似ていますが、dot-product attentionは、高度に最適化された行列乗算コードを用いて実装できるため、実際にはより高速で、実際にはより高速です。

と述べている。
dot-product (multiplicative) attentionは、additive attentionと比べて、

* 2つは理論的な複雑さは似ています
* 高度に最適化された行列乗算コードを用いて実装できる（ため↓)
 *  実際にはより高速
 *  より省スペース

と整理されている。
とりあえず、後続の、『dkの小さな値では2つのメカニズムは同様の性能を示しますが・・・』の観点は、ここでは、省略します。
⇒　ポイントとしては、<font color="orange">**逆に、上記以外の差に言及していない**</font>ことに注目したいと思います。


#詳しくない人（ワタシとか）の立場から、少し、わかりづらいことは

additive attentionのフィードフォワードネットワークの部分のパラメータをどう決めるの？、いつ学習するの、的なことが頭に浮かぶが、
そういう話ではないのでしょう、
何も、そういう話を書かれていないので。。。


#参考になりそうな論文

以下の論文

https://arxiv.org/pdf/1508.04025v5.pdf

Effective Approaches to Attention-based Neural Machine Translation

Luong, Minh-Thang, Hieu Pham, and Christopher D. Manning. "Effective approaches to attention-based neural machine translation." arXiv preprint arXiv:1508.04025 (2015).


では、このあたりのものが、
dot, general, concatという形で羅列されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/d4ab53cb-1633-ca50-38d6-6086fef00b9a.png)


⇒　何と何をどういう観点で比較するのかが、なんでもありすぎで、難しい世界だなーーと思いました。

#まとめ
特にありません。
この記事は、高々、違和感？が共有できるかな程度の期待で書いた記事です。

# 関連記事（本人）

[自己注意Self-Attention の解説でわかりやすいと思った記事N選　(N＝13）](https://qiita.com/enoughspacefor/items/c9810d1065741a7f461c)
超低予算でRaspberry Pi 3/4をハードウェアシンセサイザー化する

総予算1万円以下でRaspberry Piをシンセサイザーにする。

## 用意するもの ##
[Raspberry Pi 3](https://amzn.to/2OFz2kL) - 3,990円
[ブレッドボード](https://amzn.to/3wK2OG1) - 332円
[PCM5102基板](https://amzn.to/324EPTZ) - 1,050円
[OLED基板](https://amzn.to/3d4OMXL) - 550円
[5pin DINソケット](https://akizukidenshi.com/catalog/g/gC-09565/) - 60円
[フォトカプラー PC900V](https://wakamatsu.co.jp/biz/products/list.php?category_id=1903&pageno=2) - 213円
[ジャンプワイヤキット](https://amzn.to/324GuZJ) - 1,055円
[ジャンパワイヤ オス-メス](https://amzn.to/3mA9MsE) - 633円
[電子工作部品セット](https://amzn.to/3tdKMdk) - 1,980円
(使うのは抵抗 220Ω x2、ダイオード 1N4148 x1、セラミックコンデンサ 0.1μF x1)

**総額 9,863円** (納期重視国内調達の場合。Ali Expressで揃えればもっと安くなる)

## 製作 ##
ブレッドボードに部品を載せる。上記の部品はこの写真に載っているものと多少違うかもしれないが、細かいことは気にしない。接続に関しては下記の通り。

### PCM5102基板 ###
VCC - 5V
GND - GND
LCK - GPIO19
DIN - GPIO21
BCK - GPIO18

### OLED基板 ##
VCC - 5V
GND - GND
SCL - GPIO3 (SCK)
SDA - GPIO2 (SDA)

### MIDI IN回路 ###
VCC - 3.3V (←5Vではないので注意！)
DATA - GPIO15 (UART RX)

回路としては下記なのだが、[AMEIのサイト](http://amei.or.jp/midistandardcommittee/Recommended_Practice/ca33-j.pdf)にあるMIDI INの回路の「2番ピンは0.1μFのコンデンサを介してGNDに接続する」をしないとオーディオ回路が正常に動作しなかった。

![Qiita](http://www.strellis.com/images/fpga2/midi_if.gif "midi_if.gif")

実際の回路は写真のような感じ。この例ではフォトカプラーにH11L1、OLED基板は128x64のタイプを使っている。
![IMG_8874.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/7b819b28-55e1-5312-96da-8836f5f2c949.jpeg)

![IMG_8875.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/cbb34e91-a7ff-0d7e-1679-5b4e50464dcc.jpeg)


## ソフトウェア動作確認 ##
https://github.com/dwhinham/mt32-pi

MT32-piを使ってしまおう。基本はSDカードにコピーするだけ。mt32-pi.cfgを下記のようにエディット（変更部分のみ）。

```mt32-pi.cfg
# mt32:      Use mt32emu (Munt) for Roland MT-32 emulation
# soundfont: Use FluidSynth for SoundFont synthesis
default_synth = soundfont

# Set audio rendering chunk size (samples).
# Values: 2-2048 (256*)
chunk_size = 64

# Select an initialization sequence for the DAC.
# pcm51xx: for DACs based on PCM5121 or similar (e.g. PCM5141, PCM5242)
i2c_dac_init = pcm51xx

# Select LCD driver.
# ssd1306_i2c:  Small I2C-based OLED graphical display (usually 0.96")
type = ssd1306_i2c
```

## 課題 ##
ブレッドボードによっては上記の通り組んでもオーディオがブリブリのノイズだらけになってしまうことがあった。また、同じブレッドボードでも、オーディオ基板を置く位置によって正常に鳴ったり鳴らなかったりしたこともあった。この辺、グランドをしっかり取るとか対策が必要なのかもしれないが、なにぶん当方ハードウェアに関しては知識ゼロなので解決できないままです。
ESP32、LineBot、Herokuで照明をスマート化してみた（紹介編）

##はじめに
今回は照明のON/OFFをLINEで遠隔操作できる「M-SwitcherBot」（通称：おわすれさん）を制作しました。
照明を付けっぱなしで家を出てしまった、消したかどうか忘れてしまった、といった人が一定数いることが分かったため、それを解消しようとして制作したのが動機になります。

##使用イメージ

![668a1456-82c3-4617-a125-5bf03d541b5e_page-0001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682477/4f9e0bc2-373f-494f-085d-8c50bbe6233b.jpeg)
![668a1456-82c3-4617-a125-5bf03d541b5e_page-0002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682477/6e997082-2106-4445-8e7f-ba0034f4c5b4.jpeg)
![668a1456-82c3-4617-a125-5bf03d541b5e_page-0003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682477/8ad501f7-4495-0577-874f-cbacc3b6cd32.jpeg)


##開発環境
言語：python,c++
wsl2
docker
heroku
linebot
arudiuno
esp32-wroom-32
人感センサ
サーボモータ

##仕様
![プレゼンテーション1_page-0001 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682477/c3c8471c-5523-6729-c496-88f075cef9e6.jpeg)

１．人感センサが玄関を通過する人を感知し、herokuにセンサ情報を送信。
２．herokuはセンサ情報を確認すると、LINEに確認メッセージを送信する。
３．確認メッセージでON/OFFいずれかを選択し、herokuに選択情報を送信。
４．herokuは選択情報を処理し、サーボモータに指示を送信。
５．サーボモータは受け取った命令に従い動作し、照明スイッチを操作する。

##デモ
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682477/d15849e4-579f-8ccd-0459-3ee4c36afb0b.gif)
人感センサが正常に反応するかのデモです。
センサの前で手を振ると、LINEにメッセージが送られていることが分かりますね！

![Videotogif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682477/513cea6e-3373-16a0-b53c-e4ba5cead037.gif)
LINEから照明OFFにできるか、ONにできるかの確認のデモです。
ちゃんと照明が操作されていますね！

##工夫したところ
- 日本で普及しているLINEを取り入れたこと　⇒　LINEさえ入っていれば専用のアプリ等を新たにスマホに入れなくて良いため、導入が容易！
- herokuを使用している　⇒　HTTP通信が行える場所ならどこからでも操作可能！
- 音声に反応するアレクサと差別化がされている　⇒　外からでも操作できる点を踏まえればアレクサより便利！
- サーボモータを設置すれば何でもスマート化できる　⇒　非スマート家電がある家庭も使える。
　

##苦戦したところ
- 未経験の技術が多数（LINEBOT,arudiuno）　⇒　学びながら開発
- ESP32×LINEBOTしている参考記事が圧倒的に少なかったこと　⇒　プロトタイプを逐一制作しながら試行錯誤
- dockerを使い慣れていなかったため、ローカルとのギャップに苦戦　⇒　2週間は環境構築に費やした
- 時間が限られていたため、クリスマスと正月がなかったこと　⇒　毎日10時間開発（楽しかったから苦じゃないかったけど）
- dockerコンテナがある日忽然と姿を消したこと　⇒　PC再起動したら戻ったけど、完成間近だったので発狂しそうになった（バックアップは大事）

##おわりに
企画段階から念入りに行ったため、実用的な作品が作れたと感じております。また、こうして記事を執筆できたこと大変うれしく思っております。後々、制作編の記事も書けたらと思います。
Next.jsのLinkコンポーネントにpassHref属性を付与するのはどんな時なのか調べてみた

Next.jsを用いてクライアントサイドで画面遷移を行う場合、Linkコンポーネントを使用します。LinkコンポーネントはデフォルトでpropsとしてpassHref属性を受け取ることができるのですが、これはいったいどんな場面で使用するんだろう？と思って調べてみました。

# 使用技術

- React
- Next.js
- styled-components

# 結論

Linkコンポーネントの子供がaタグをラップするカスタムコンポーネントの場合にLinkコンポーネントに**「passHref」**を付与する

[Next.js | 日本語ドキュメント](https://nextjs-ja-translation-docs.vercel.app/docs/api-reference/next/link#%E5%AD%90%E3%81%8C-a-%E3%82%BF%E3%82%B0%E3%82%92%E3%83%A9%E3%83%83%E3%83%97%E3%81%99%E3%82%8B%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E5%A0%B4%E5%90%88)に書いてありました。
公式ドキュメントやっぱり神！

# そもそも、passHrefとは何か？

- Linkコンポーネントがデフォルトで受け取ることができるpropsのうちのひとつ
- passHrefは子供にhrefプロパティを強制送信する
- デフォルト値は「false」

# passHrefを付与しない場合

「passHref」を付与しないと、aタグにhref属性が付与されない。aタグにhref属性が付与されないと、検索エンジンにリンクとみなされないのでSEOに悪影響を及ぼす可能性がある。だから書き方的によろしくない。



### サンプルコード

```tsx
import Link from 'next/link';
import styled from 'styled-components';

// これは、<a>タグをラップするカスタムコンポーネントを作成します
const RedLink = styled.a`
  color: red;
`;

const NavLink = () => {
  return (
    <Link href="/posts">
      <RedLink>投稿リストページへ遷移します</RedLink>
    </Link>
  );
};

export default NavLink;
```

### 実際の画面

![passHref.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508390/81da023a-2d25-efea-dce0-52fc3f62044b.png)

# passHrefを付与したらどうなるか

Linkの子であるaタグをラップしたカスタムコンポーネントにhref属性が付与されるようになります。

### サンプルコード

```tsx
<Link href="/posts" passHref>
  <RedLink>投稿リストページへ遷移します</RedLink>
</Link>
```

### 実際の画面

![linkpassHref.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508390/31d13d99-230f-1f9c-e118-b26a55ef3835.png)

Next.jsの公式ドキュメントに記載されている内容ですし、理由も明白なため、CSS in JSライブラリとしてstyled-componentsを使用している場合は、必ずpassHref属性を付与するようにした方が良さそう

# 参考文献

[Next.js | 日本語ドキュメント](https://nextjs-ja-translation-docs.vercel.app/docs/api-reference/next/link#%E5%AD%90%E3%81%8C-a-%E3%82%BF%E3%82%B0%E3%82%92%E3%83%A9%E3%83%83%E3%83%97%E3%81%99%E3%82%8B%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E5%A0%B4%E5%90%88)
[Next.js | 公式ドキュメント](https://nextjs.org/docs/api-reference/next/link#if-the-child-is-a-custom-component-that-wraps-an-a-tag)
shellscriptのselect文

shellscriptのselect文を勉強したので、まとめます。
#書式
```select_ex.sh
select 変数名 in 値...
do
  処理...
done
```
*終了するときはbreakを入れるか、Ctrl+D(EOF送信)を使う。

実行されるとユーザから```値```に応じた数値の入力を受け付ける。

```
1)値1
2)値2
...
```
ここで入力された数値が変数に格納される。

#例
```select.sh
select var in a b c d exit
do
    if [ $var = 'exit' ];
    then
       break
    fi
    echo $var
done
#入力受付
# 1) a
# 2) b 
# 3) c
# 4) d
# 5) exit
```

実行すると入力を受け付けて、5(exit)ならばbreakそれ以外ならば変数の値を表示。
ただ、1~5以外、空白を入力されるとエラーが出る。
そのため、if文のzオプションを使う。

```select.sh
select var in a b c d exit
do
  if [ -z $var ];
  then
    echo 'this is unavailable'
  else
    if [ $var = 'exit' ];
    then
       break
    fi
    echo $var
  fi
done
```
これで1~5以外の数値の場合、unavailableと表示する。
select文では1~5以外、つまり選択肢にない値が入力された場合は変数にはnullを格納している。

**間違えがありましたらご指摘ください。**
Garadleで外部ライブラリを使用しているJavaの実行ファイルを出力する

## 概要
Javaのプログラムをjarなどのファイルにして実行する際に、外部のライブラリを使用したコードが含まれているものに対応したい時があります。その際には必要なjarを用意してクラスパスに設定する必要があるのですが、手動で設定していくのは少し面倒です。Gradleには外部ライブラリを含めて実行形式のファイルを出力する機能があるので、今回紹介します。

## 対応方法
* [Gradle使い方メモ](https://qiita.com/opengl-8080/items/4c1aa85b4737bd362d9e#%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%85%A8%E9%83%A8-zip-%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B)の記事にある通り、`distZip`を実行すると依存の外部ライブラリjarを含めて、ファイルを出力してくれます。また実行スクリプトも出力してくれるので、起動するときはこれを使えば良さそうです。

## 実行結果
[こちら](https://github.com/someone7140/java/blob/master/ddd-output/ddd-output.zip)に私の方で作成した`ddd-output`というJavaのアプリケーションでの`distZip`の実行結果を配置しているので、中身を紹介します。

### 【binのファイル】
Linux（Mac）用のシェルとWindows用のbatファイルが出力されています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32098/d7341899-a071-8174-297a-47203b33a9fb.png" width=450 />

シェルの中身を見ると、クラスパスに外部ライブラリのjarを含めたファイルがclasspathに設定されているのが分かります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32098/84669697-b4e1-b30e-20a6-07e5cad77e73.png" width=650 height=650 />

### 【libのファイル】
こちらに今回作成したアプリケーションのjar（ddd-output.jar）と、使用している外部ライブラリのjarが出力されています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32098/29325e64-b2b7-c87f-5e06-5e0abf67720b.png" width=450 />
【Swift】RxSwift勉強してみたPart7

#はじめに
[前回](https://qiita.com/REON/items/8fd68bb59c0e6dbdbc3f)
今回はOptionalな値が流れるストリームに対してさまざまなことをできるようにする拡張ライブラリーであるRxOptionalをみていこうかと思います。

#RxOptional

###filterNil()
nilをはじいてくれるオペレーター

```swift
Observable<String?>
    .of("100", nil, "200")
    .filterNil() //Observable<String?> -> Observable<String>
    .subscribe { print($0) }
//100
//200
```

###replaceNilWith()
nilを置き換えることができるオペレーター

```swift
Observable<String?>
    .of("100", nil, "200")
    .replaceNilWith("300")
    .subscribe { print($0) }
//100
//300
//200
```

###errorOnNil()
nilが検出されたときにエラーをながすオペレーター

```swift
Observable<String?>
    .of("100", nil, "200")
    .errorOnNil()
    .subscribe { print($0) }
//100
//Found nil while trying to unwrap type<Optional<String>>
```

###filterEmpty()
空の配列や辞書をはじいてくれるオペレーター

```swift
Observable<[String]>
    .of(["1"], [], ["2", "3"])
    .filterEmpty()
    .subscribe { print($0) }
//["1"]
//["2", "3"]
```

#おわりに
[次回](https://qiita.com/REON/items/8ded3fcc1151d5776da8)
RxSwiftって拡張ライブラリーたくさんありますね！
Fakerを使って６文字で英数混合のランダムパスワードを作る

ある課題に取り組んでいて、ググって探して当て突き止めた情報を自分なりに深堀りしてみました。よろしければお付き合いください。
deviseを使ってログイン・ログアウト・新規登録を完了して次の課題である「単体テスト」をやっています。

気づき
-
password  { Faker::Internet.password(min_length: 8) }
は
min_length: 最低文字数
max_length: 最大文字数
mix_case: false,　　　大文字を混ぜる・混ぜない
special_characters: 　特殊記号入れる・入れない

これくらいしか設定できない。

Fakerで６文字で英数混合パスワードを設定するには
Faker::Internet.password使用しないと気づくところから始まります。

検索結果
-
ネットで検索して自分の今の知識で理解できる情報は以下です。役に立てれば嬉しいです。
####Faker::Lorem.characters(min_alpha: 1, min_numric: 1)

>https://endoakak.hatenablog.com/entry/2020/08/04/200000

検索目的
-
Fakerで単体テストコードで英数混在の６文字以上のパスワードをつくる。
＊Fakerとはテストに使うダミーデータを用意するGem

ここで問題になってくるのが

```r:factories/users.rb
password                { Faker::Internet.password(min_length: 8) }
```
Fakerはメールアドレス、パスワード、URL、スラッグ、IPアドレスなどをインターネット関連としてダミーデータを作成してくれるのですが、６文字の中に数値もしくは、アフファベットのいずれかだけで生成される可能性が非常に高いというリスクがあることです。

Faker::Internet.password(min_length: 8)は諦めて方向転換
＊（参考）min_lengthは最低文字数を指定

他に

|指定         |     指定内容  　|
|:-----------|------------:|
|special_characters: true　　|特殊文字を含む
|special_characters: false　|特殊文字含まない
|mix_case: true　　　　　　　　|大文字含む
|mix_case: false　　　　　　　|大文字含まない

の設定ができます。

解決策１
-
参考サイト
>https://github.com/faker-ruby/faker/blob/master/doc/default/lorem.md

Faker::Lorem.characters(min_alpha: 1, min_numric: 1)活躍するのがこれ
基本形（charactersというのは「文字」の意味）

####Faker::Lorem.characters(number: 10) #=> "ang9cbhoa8"

|指定         |     指定内容  　|
|:-----------|------------:|
|number: 10 |ランダムな文字１０文字を生成|


####Faker::Lorem.characters(number: 10, min_alpha: 4) #=> "ang9cbhoa8"

|指定         |指定内容  　|
|:-----------|------------:|
|number: 10 |ランダムな文字１０文字を生成
|min_alpha: 4|１０文字の中に最低４文字以上はアフファベットを含める

####Faker::Lorem.characters(number: 10, min_alpha: 4, min_numeric: 1) #=> "ang9cbhoa8"

|指定         |指定内容  　|
|:-----------|------------:|
|number: 10 |ランダムな文字１０文字を生成
|min_alpha: 4 |１０文字の中に最低４文字以上はアフファベットを含める
|min_numeric: 1|１０文字の中に最低１文字以上数値を含める

```r:factories/users.r
回答例
password    { Faker::Lorem.characters(number: 6, min_alpha: 1, min_numeric: 1) }
```

解決策２（以下参考サイト）
-

参考サイト
>https://github.com/faker-ruby/faker/blob/master/doc/default/alphanumeric.md

指定方法は違いますが、にています。
####Faker::Alphanumeric.alphanumeric(number: 10) #=> "3yfq2phxtb"
####Faker::Alphanumeric.alphanumeric(number: 10, min_alpha: 3) #=> "3yfq2phxtb"
####Faker::Alphanumeric.alphanumeric(number: 10, min_alpha: 3, min_numeric: 3) #=> "3yfq2phx8b"

＊設定の説明は解決策１と同じなので割愛

ご参考までに
EC-CUBE4のサーバー引っ越し

自分のための忘備録です。
***

##①ファイルを固める

まずsshでサーバーに入って、EC-CUBEファイルを丸ごとtarで固めます。
varディレクトリ内のキャッシュファイル、ログファイル、セッションのファイルはエラーの原因になるので削除した方がいいそうです。

```
ssh ユーザー名@ドメイン
tar zcvfp eccube.tar.gz --exclude public_html/eccube/var/cache/ --exclude public_html/eccube/var/log/ --exclude public_html/eccube/var/sessions/  public_html/eccube
```

tarのオプション

```
tar
z gzの圧縮・解凍（cと組み合わせで圧縮、xと組み合わせで解凍）
x アーカイブの展開
v 中身の表示
p アーカイブされたときのパーミッションを再現
-f アーカイブファイル名の指定（省略時は/dev/rmt0）
-C チェンジディレクトリする
```

##②.tar.gzファイルのダウンロード
sshから出て、.tar.gzファイルをデスクトップにダウンロードします。

```
exit
scp ユーザ名@ホスト名:/home/user/public_html/eccube.tar.gz ~/Desktop/
```


##③アップロード、展開
引っ越し先のサーバーにアップロードしてsshで入り、展開します。

```
scp ~/Desktop/eccube.tar.gz ユーザ名@引っ越し先のホスト名:/home/user/public_html/
ssh ユーザー名@ドメイン
cd public_html
tar zxvfp eccube.tar.gz
```

必要があれば展開後ファイルを移動する

```
//一つ上に移動
mv * ../
//もし隠しファイルがあればそれも移動
mv .[^\.]* ../

```


##④設定ファイルを書き換える
EC-CUBE4の場合、設定情報は .envファイルか .htaccessらしいです。
これは.envファイルの例

```
DATABASE_URL=mysql://username:password@host/database
・
・
DATABASE_SERVER_VERSION=5.7.27```
・
・
MAILER_URL=sendmail://localhost
・
・
ECCUBE_COOKIE_PATH=/
```



##⑤引っ越し先のサーバーにデータベースをコピーする。
phpMyAdminで元サーバーからエクスポート、引っ越し先サーバーでインポートする。

終わり。

***
ちょっと関係ないんですが、eccubeがおかしくなりました。
php7.3じゃないとおかしくなるみたいです。

https://support.ec-cube.net/hc/ja/articles/900003243366-%E7%AE%A1%E7%90%86%E7%94%BB%E9%9D%A2%E3%82%84%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AE%E8%A1%A8%E7%A4%BA%E3%81%8C%E3%81%8A%E3%81%8B%E3%81%97%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F

php.cgiを使ってなんとかしました。

https://www.wisesips.com/service/staff_column/196.html



***
参考しました
https://qiita.com/seiyaan/items/0708ebb6e24f2863adb2
https://techmemo.biz/ec-cube/eccube4-server-migration/
📙React + TypeScript + Firebaseで認証付きの簡単な掲示板を作ろう


## はじめに
つぶやきしかできないWebアプリを作りました。ReactでWebサービスを作りたい人はこのチュートリアルを読み進め、足りない機能を作ってみると良いでしょう。
![Screen Shot 2021-04-11 at 16.43.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83242/7371c9ff-1563-aae6-640b-1791ee5391ba.png)


Demo: https://single-board-3c001.web.app/
Code: https://github.com/shuent/single-board
### Webアプリの機能
- ログイン
    - Googleアカウントかメールアドレスで認証。
- つぶやき一覧
- コメント投稿
    - 認証したユーザーのみ投稿できる

### 使用する技術・ライブラリなど
- React
    - Hooks
        - useReducer
    - ContextAPI
- TypeScript
- Create React App
- React Router 
- Firebase
    - Auth
    - Firestore
    - Hosting
- Chakra UI

### 実装
ブログに移動しました。

https://shuent.github.io/blog/first-react-app-single-board/
Appiumでのテストで機械学習を使ってみた（GradCAM）

#Appiumでのテストで機械学習を使ってみた（GradCAM）

##はじめに
[前々回](https://qiita.com/K-029/items/730223b3efd332eab068)で自動テストにCNNを使ったが、私が従事しているトラディショナルな組み込み現場ではあまり受けは良くない。業務に利用するには何らかのエビデンスを示す必要がでてくる（他ではこんな事問題にならない?）。
今回、TensorFlowでCNNを利用したのだから**tf-keras-vis**でGradCAMを利用すれば上への業務報告や、改善に役に立つのではないかとうことで前々回の題材でGradCAM(Gradient-weighted Class Activation Mapping)を利用してみた。

## 準備
- 環境 
Windows 10
Python 3.7
tensorflow 2.3.0
tf-keras-vis  0.5.5

- tf-keras-vis インストール
　[本家 tf-keras-vis](https://pypi.org/project/tf-keras-vis/)。
```
$ pip install tf-keras-vis tensorflow
```
## GradCAMを取得してみる
題材は[前々回](https://qiita.com/K-029/items/730223b3efd332eab068)と同じワードパット。
ワードパット上に何か記述して3パターンに分けて学習させます。
前々回の記事では **'1','2','None'**の3カテゴリー としましたが、今回はカテゴリー名は**'1'(0), 'None'(1), 'o'(2)**　とし、カテゴリー**’o’**の画像のGradCamを取得して見ます。
loss関数、model_modifierについてはこちらも[本家のexample](https://github.com/keisen/tf-keras-vis/blob/master/examples/attentions.ipynb)を読んでください。

```python:CategoryOGradAM.py
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
import tensorflow as tf 
from tf_keras_vis.gradcam import Gradcam
from tf_keras_vis.utils import normalize

# loss functionの設定
def loss(output):
    #[イメージIndex][カテゴリーIndex]
    return (output[0][2])

# Define modifier to replace a softmax function of the last layer to a linear function.
def model_modifier(m):
   m.layers[-1].activation = tf.keras.activations.linear
   return m
    
if __name__ == '__main__':
    #モデルの読み込み.
    model =  tf.keras.models.load_model('Category_simple.h5')
    #カテゴリー o のイメージの読み込み.
    ImageFile = "add_View_0_0.png"
    Image = tf.keras.preprocessing.image.load_img(ImageFile,target_size=(150,150))
 
   #読み込み画像の表示.
    fig = plt.figure()
    ax1 = fig.add_subplot(1, 2, 1)
    ax1.imshow(Image)
    plt.imshow(Image)
    #Image change to arry.
    input_arr = tf.keras.preprocessing.image.img_to_array(Image)
    input_arr = np.array([input_arr])
 
   #確認のため分類結果を表示.
    predictions = model.predict(input_arr)
    print("Category : Label{'1': 0, 'None': 1, 'o': 2}")
    print(predictions) #Output >> [[0. 0. 1.]]
 
    # Create Gradcam object
    gradcam = Gradcam(model, model_modifier, clone=False)

    # GradCAMの結果からヒートマップを作成.
    cam = gradcam(loss, input_arr)
    cam = normalize(cam)
    ax2 = fig.add_subplot(1, 2, 2)
    for i in range(len(cam)):
        heatmap = np.uint8(cm.jet(cam[i])[..., :3] * 255)
        ax2.imshow(Image)
        ax2.imshow(heatmap, cmap='jet', alpha=0.5)
    #結果表示.
    fig.show()
```
##結果
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489806/8704146e-80e2-dc7f-c2a6-8169ef7a8e1e.png)


これでテストランナーのCNNが何をしているか説明できればいろいろ(上への言い訳)役立つのではないでしょうか。
最初はいつもお世話になっているQiitaへの何かしらのお返しのつもりで書き始めましたが、5回になってしまいました。
テストサンプルをバラバラと載せた記事になってしまいましたが日常業務のヒントになれば幸いです。
PyAutoGUIを使おうとしてpyscreeze.PyScreezeException: The Pillow package is required to use this function.とエラーになる

## 環境

- Windows 10 Home
- Python 3.9.1
- pip 21.0.1
- PyAutoGUI 0.9.52

## 結論

```
pip install Pillow
```

でPillowをインストールする。

### 既にインストールされている場合

バージョンが古いことでも同様のエラーになる場合があるそうなので、その場合は

```
pip install Pillow --upgrade
```

でPillowのバージョンを上げて試してみる。

[python - pyautogui, screenshot function doesn't recognize installed Pillow module - Stack Overflow](https://stackoverflow.com/questions/50782056/pyautogui-screenshot-function-doesnt-recognize-installed-pillow-module)
【コピペ用】画像の比率を１：１に切り取るCSS

画像ファイルに比率を１：１にしたいと思ったことありませんか？

少なくとも１度は思うこと。

今回はそんな悩みをコピペするだけで解決できる方法をお教えします。

コピペの量も全く多くないので、是非ストックして必要な時にコピペしてください。

この記事を書くにあたってYoutuberのトラハックさんの以下の動画を参考にさせて頂きました。

・[Cloud Storageに画像をアップ&プレビュー&削除【日本一わかりやすいReact-Redux講座 実践編#5】](https://www.youtube.com/watch?v=CDW_yryn1Rc&t=1734s)

本当にトラハックさんの動画は分かりやすい！

ぜひ皆さんもご覧ください！！！

#対象のHTMLタグを用意#

``img``タグの親要素に``div``タグを用意し、以下のようなクラス名を付けて下さい。

```html
    <div className="p-media__thumb">
      <img alt="1:1に切り取る" src="" />
    </div>
```

#CSSをコピペ#

後は以下のCSSをコピペするだけ。

```css
.p-media__thumb {
    position: relative;
    overflow: hidden;
    width: 100%
}

.p-media__thumb::before {
    content: "";
    display: block;
    padding-top: 100%;
}

.p-media__thumb > img {
    position: absolute;
    object-fit: cover;
    object-position: center;
    top: 0;
    left: 0;
    width: 100%;
    height: auto;
}
```

これで画像が1:1に切り分けられます。

楽チン！

Thunk you for reading
Re:Zero2Wから始めるHomeAssistant生活 その③


<h1>前回のあらすじ</h1>
Xiaomi機器との連携はできるようになったと思います。

IFTTTとかいろいろ残念になったのでびふぉーからあふたーに切り替えました。

　
びふぉー
![flow.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261961/ba9570e6-aee5-3b34-21b5-4b66d6c30b41.jpeg)
あふたー
![sonogo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261961/8fa775a8-8aee-d516-0b76-e0ee34f59c81.jpeg)
みたいな感じで使ってます。

私みたいな素人が書くよりもすでに詳しい導入方法あるので、ここ見てください。

https://qiita.com/odetarou/items/4407d06d030c83180364

必要なことは全て載ってます。

時間あるときにLINEやSLACKへの投稿とか使ってる小技書くかも。
要望なさそうだけどなっ。

やっつけ更新。
20220923に作成。
【ハマり】ApplePush通知証明書の更新

## この記事を書く理由
この前、実務で「iOSのpush通知証明書の更新をやっておいて」と無茶振りされました。
iOSの開発等をほとんどやった事がなかった + 手順書等が存在しなかった為、0から調べて手順をまとめてみました。
色々とハマったので僕と同じような方の参考になれば嬉しいです！
※iOS Developer等のページのUIはコロコロ変わるようなので、微妙にUIの文言等が変わってくるかも知れません。　また今回僕がハマった箇所を記載するので、他の人に当てはまらない箇所もあるかと思います。

**前提**
Amazon SNSを利用したプッシュ通知を利用しているアプリケーションのpush通知証明書の更新です。
プッシュ通知を確認するところまで書いていきます。


##やっていく！

**大まかな流れ **
`①証明書の要求ファイル(CSRファイル)を作成 。`
`②余分な証明書の削除` ← ※この項目はほとんどの方が必要ないかと思います。
`③Developer Center でCSRを利用して、証明書を作成。`
`④作成した証明書からp12ファイルを書き出す。 `
`⑤p12ファイルをAWS SNSで使用するように設定。`
`⑥プッシュ通知が送信されることの確認 。`

上記流れでやっていきます。


####①証明書の要求ファイル(CSRファイル)を作成 。
・CSRファイルの作成 ・MacPCのキーチェーンアクセスを開く
 ・[キーチェーンアクセス」→「証明書アシスタント」→「認証局に証明書を要求」をクリック。 
・「ユーザーのメールアドレス(Apple Developerのもの)」を入力。（「通称」は任意のもの(秘密鍵の名前になります。)、「CAのメールアドレス」は空欄でOK）
 ・「要求の処理」は「ディスクに保存」を選択し「鍵ペア情報を設定」にチェック。「続ける」をクリック。 
・保存先の選択が出るので任意の場所を選択し「保存」をクリック。 
・「鍵ペア情報」画面を確認して「続ける」をクリック。 ・「設定結果」画面が出るので「完了」をクリック。

####②余分な証明書をの削除。
・証明書は2つまでしか作成できない為、有効期限が切れている方の証明書を削徐する。 (※証明書が2つある場合のみ。※有効期限が切れていない方を削除するとプッシュ通知が飛ばなくなるので注意。)
 ・Developer Centerで[Certificates]の有効期限が切れている方の証明書をクリック。 
・Removeボタンをクリック ・確認モーダルが出るので、再度Removeボタンをクリック。 
※今回ハマったところは、なぜか同じ有効期限の証明書があり、どちらを削除すべきか迷った。→　AWS SNSに設定されている証明書の有効期限の日付 + 時間と証明書の日付 + 時間を見比べて、使用していない方を削除した。

####③Developer Center でCSRを利用して、証明書を作成。
・①で作成したCSRファイルを利用して証明書の作成 ・「Certificates」をクリックし、「Certificates」の隣にある「+」をクリック。 
・「Create a New Certificate」で「Apple Push Notification service SSL (Sandbox & Production)」にチェックをいれ、右上の方の「Continue」をクリック。
 ・AppleIDが聞かれるので、該当するIDを選択。(※1つしか選択できないはず。)
 ・「Choose File」をクリックして、1) で作成した「CSRファイル」を選択し、「Continue」をクリック。

####④作成した証明書からp12ファイルを書き出す。
・p12ファイの作成 ・③で作成したAPNs用証明書(.cer) の「Download」をクリックして「aps.cer」をローカル保存 
・「aps.cer」をダブルクリックして、MaPCキーチェーンアクセスを開く。
 ・Apple Push Serviceの証明書がキーチェーンアクセスに登録されるので、証明書を右クリックして「・・・を書き出す」から [p12]ファイルを選択 
※キーチェーンの「すべての項目」ではp12が選択できないので、「自分の証明書」から表示 　
※パスワード空はNG
 ・任意の名前を付けて任意の場所に保存（※日本語名NG）

####⑤p12ファイルをAWS SNSで使用するように設定。
・AWS SNSに④で作成したp12ファイルを設定 ・AWS SNSから[アプリケーション]を開き、[Mobile] → [プッシュ通知]を開く。 
・[プラットフォームアプリケーション] → 使用しているプラットフォームアプリケーションを選択。 
・[編集]をクリック。 
・編集画面にて、[サンドボックスでの開発に使用されます]にチェック。 (おそらくテスト環境で使用する場合にチェックする。)[プッシュ証明書タイプ]「iOS」を選択。[証明書]で④で作成したp12ファイルを選択。 
・証明書とプライベートキーそれぞれに文字列が入力されたのを確認して、[変更の保存]をクリック。 
・証明書の有効期限が更新されていることを確認する。

####⑥プッシュ通知が送信されることの確認 。
・[プラットフォームアプリケーション] → 使用しているプラットフォームアプリケーションを選択。 
・エンドポイントの検索フォームにテスト用のプッシュ通知を送信したいデバイスのデバイストークンを入力。
・検索したエンドポイントを選択して、[メッセージの発行]をクリック。 
・[配信プロトコルごとにカスタムペイロード]を選択して、[メッセージの発行]をクリック。 
・選択したデバイスにプッシュ通知が送信される事を確認する。

以上で僕の環境では無事にpush通知が送信されて、本番環境でも問題なく動作しました！

指摘等ありましたら、何でもお願い致します！
dockerのalpine linux にpythonを入れる


### dockerのalpine linux にpythonを入れたいとき。

```shell
apk add make automake gcc g++ subversion python3
```

python3で実行できるようになる。

apkとは
Alpine Linux のパッケージシステム
APK(Alpine Package Keeperの略)です。

apk add: インストール
apk del: アンインストール
apk list: 一覧表示
UnityとGitHubActionsを使って自動ビルドする【複数プラットフォーム同時ビルド】

# はじめに

最終的に仕上がったものは以下のリポジトリで公開してあります。
分からないことがあったときは参考にしてみてください。

https://github.com/mackysoft/Unity-GitHubActions-Build-Example

# 手順

## 下準備

適当なUnityプロジェクトのリポジトリを用意します。


## 1. ULFファイルを入手する

GitHub Actions上でUnityライセンスをアクティベートするためのULFファイルを入手します。

この手順に関しては別の記事として書かせてもらいました。（GUIのみで簡単にできます）

https://qiita.com/makihiro_dev/items/61f004e5481cef54b5a7


## 2. ULFファイルをSecretsに登録する

1. プロジェクトリポジトリの`Settings > Secrets`メニューを選択する。
2. `New repository secret`ボタンをクリックする。
3. Nameに`"UNITY_LICENSE"`と入力し、ValueにULFファイルの中身をコピペする。
4. `Add secret`ボタンをクリックする。

これでULFファイルの中身は非公開のまま、環境変数として扱うことができます。


## 3. GitHub Actions上でビルドするためのYAMLを記述する

リポジトリの`.github/workflows/`フォルダ下に`build.yaml`を作成し、以下のように記述します。

```yaml:build.yaml
name: Build

on:
  pull_request: {}
  push: { branches: [main] }

jobs:
  build:
    name: ${{ matrix.targetPlatform }}
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        targetPlatform:
          - StandaloneOSX # Build a macOS standalone (Intel 64-bit).
          - StandaloneWindows # Build a Windows standalone.
          - StandaloneWindows64 # Build a Windows 64-bit standalone.
          - StandaloneLinux64 # Build a Linux 64-bit standalone.
          - iOS # Build an iOS player.
          - Android # Build an Android .apk standalone app.
          - WebGL # WebGL.

    steps:
      # Checkout
      - name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
          lfs: true

      # Cache
      - name: Cache
        uses: actions/cache@v2
        with:
          path: Library
          key: Library-${{ matrix.targetPlatform }}
          restore-keys: Library-

      # Build
      - name: Build
        uses: game-ci/unity-builder@v2
        env:
          UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
        with:
          targetPlatform: ${{ matrix.targetPlatform }}

      # Upload Build
      - name: Upload Build
        uses: actions/upload-artifact@v2
        with:
          name: Build-${{ matrix.targetPlatform }}
          path: build/${{ matrix.targetPlatform }}
```

> [targetPlatformの一覧](https://docs.unity3d.com/ScriptReference/BuildTarget.html)

# 4. 実際にビルドしてみる

1. リポジトリにPushまたはPull Requestを行い、プロジェクトをビルドするワークフローを実行する。
2. ワークフローが完了するまで待つ 

以下のように✔マークが表示されていれば成功です。

![BuildResult](https://user-images.githubusercontent.com/13536348/114309797-70967000-9b23-11eb-9f02-bf50925c825b.jpg)

右上のArtifactsから、ビルドされた成果物をダウンロードできます。


# さいごに

最終的に仕上がったリポジトリです。詰まったときは参考にしてみてください。

https://github.com/mackysoft/Unity-GitHubActions-Build-Example

CIは初めてであまり詳しくないので、間違えているところがあれば教えてもらえると幸いです。


# 参考

- [Github Actions で UnityPackage をビルドしたら快適だった話](https://qiita.com/TakenokoTech/items/4b22e9f1c14570306bb2)
- [GameCI - Builder](https://game.ci/docs/github/builder)
jenv+caskでJDKのバージョン管理(Mac)

# 何をしたか
MacのローカルでJavaのバージョン管理

# 本題
## 手順概要
・homebrew-caskでJDKをインストール
・jenv を使ってバージョンの切り替え

## レッツトライ
### caskでJDKのインストール
・cask = homebrewの拡張機能
・/usr/libexec/java_homeでインストールのJDKを確認できる(すごい)

```shell:手順ログ
# -----------setup-------------
# tap：公式以外のリポジトリを追加
$ brew tap caskroom/versions
# 引数なしでtapしたもの確認できる
$ brew tap

# -----------cask--------------
# リストを見て適宜インストール
$ brew search java
$ brew cask install java
# Java8が見当たらない。↓ぐぐった結果コレでOK
$ brew cask install adoptopenjdk8
# 確認
$ /usr/libexec/java_home -V
```

### jenvで複数バージョン管理
jenv = pyenvのJava版。しらなかった・・・

```shell:手順ログ
# -----------setup-------------
# jenvインストール
$ brew install jenv
# .bash_profileにパスを通す
export JENV_ROOT="$HOME/.jenv"
if [ -d "${JENV_ROOT}" ]; then
  export PATH="$JENV_ROOT/bin:$PATH"
  eval "$(jenv init -)"
fi

# .jenvフォルダを作らないとaddできない
$ mkdir ~/.jenv
$ mkdir ~/.jenv/versions
$ source ~/.bash_profile

# -----------jenv-------------
# 確認。はじめはsystemのみ
$ jenv versions
# 追加したいバージョンをadd
$ jenv add $(/usr/libexec/java_home -v 1.8) 
$ jenv add $(/usr/libexec/java_home -v 11)
$ jenv add $(/usr/libexec/java_home -v 12) 
# 操作はpyenvと同じかんじ
$ jenv global 1.8
$ jenv local 12
```

## 参考
MacでJDKのバージョンを切り替える
https://qiita.com/mas0061/items/2fe9333f045800d00b5c
/usr/libexec/java_home がいい子すぎる件
https://qiita.com/obr_y/items/5bf16d22bb2d9c0781f5
jEnvのセットアップ&操作方法(Mac)
https://qiita.com/uhooi/items/9a6747084bcfd4df07a6
homebrew-caskでJava8をインストールする
https://qiita.com/d_forest/items/290bb05bb929e5d74647
perl メモ

# リダイレクト
```pl

#!/usr/bin/perl -w

#use CGI qw(:standard);
#use CGI qw(:standard -nph);

use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser);

#print CGI::redirect('http://yahoo.com/');

my $query = CGI->new();
#$query->nph(1);
print $query->redirect(-uri=>'http://yahoo.co.jp', -nph=>0, -status=>303);
#print $query->header(-charset=>'UTF-8');
#print $query->header(-location => 'http://yahoo.com/mizu');
アプリのセーブデータを引き継ぐ

(完全に自分用メモです)

#TL;DR
- 大体のゲームのセーブデータは `adb backup` / `adb restore` で引き継げます
- ただちょっと怖い方法でもある(ような気がします)

#確認したアプリ(現時点ではゲームしかないです)
|アプリ名|パッケージ名|
|:-:|:-:|
|Phigros|com.PigeonGames.Phigros|
|DanceRail3|com.dancerail3.soragame|

#必要なもの
- 古いAndroid端末
- 新しいAndroid端末
- PC(adbが動けば何でもいい、何なら実機でもいい)

#具体的な手順
1. 古い端末とPCを接続する
1. PC側で`adb backup <該当するアプリのパッケージ名> -f <適当なファイル名>`を実行する
1. PCに接続されている端末を新しい端末に付け替える
1. PC側で`adb restore <適当なファイル名>` を実行する

仕組みは古い端末のバックアップを新しい端末にリストアするだけです

# 例
## Phigrosの場合
```shell
$ adb backup com.PigeonGames.Phigros -f phigros_bak.ab
$ # ここで差し替えてね
$ adb restore phigros_bak.ab
```

## Dance Rail 3の場合
```shell
$ adb backup com.dancerail3.soragame -f dr3_bak.ab
$ # ここで差し替えてね
$ adb restore dr3_bak.ab
```


# おわり
短いけどこれで終わります
ありがとうございました！
wgetでhttps接続できない場合の対処法

環境はUbuntu20.04を想定.

wgetでhttps接続できない場合は以下のように

```bash
sudo apt install ca-certificates
```

入力することでCA証明書がインストールでき, https通信が行えるようになる.
基本的にはaptコマンドでwgetのインストールを行う際はca-certificatesも推奨パッケージとしてインストールされる.
トースターがすごい

# トースターって知ってますか？
こういうやつです．
![cooking_toaster.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295812/6cc46a07-9cd3-e9af-cb6d-be0ec26e7dc3.png)
こういうトースターをポップアップトースターというらしい．

#　よく考えると
こいつってすごくない？
パンしか焼けない形してるくせに調理家電としてはかなり上位を長年キープいるイメージ
他にもっと色々焼ける機械があるのにも関わらず，家電量販店の一画を占拠している．

よく知らないものをけなすのもよくないので，トースターについて調べてみよう．

# ポップアップトースターのこまごま
( 以降wikipedia情報です)
> 電気トースターが現れる以前、トーストは焼き網に挟んで暖炉の火などでローストして調理されていた。(中略)20世紀初頭に多くの電気トースターが普及する素地となった。

なるほど，今のような電気を使ったトースターになったのは20世紀初頭らしい．さらに読み進めると意外な事実が目に留まった

> 電気トースターの発明者は、トーマス・エジソンである。

発明王とは知っていたが，まさかトースターまで作っていたとは...
日本でのトースターはどうかというと，なかなか不穏なことが書いてある．

> 歴史が古く、世界的には非常に一般的な調理家電であるが、日本においてはオーブントースターの普及に伴い1980年代には生産が中止され、一時は市場から完全に姿を消した。2000年代以降はアジア諸国で生産された製品が安価に輸入されるようになったが、地域や世代によっては、このタイプのトースターにあまり馴染みのない人もいる。

言われると，日本人はいろんな機能を持った機械を好むイメージがある．やはりパンをトーストするだけでは耐えきれなかったのだろうか...

# 悪いとこばかりじゃないぞトースター
よく調べるとトースターの良いところも見えてきた．

* 焼けるのが早い

普通のトースターよりも焼けるのが早いらしい．
やはり専用器具は強い

* 小型

オーブントースターなどはどうしても機械が大きくなってしまう
それに比べトースターは小型で済むので場所をとらない

* おしゃれ

小型であまり「機械感」がないからか，おしゃれな見た目のものが多いイメージがある．
しかも，トースターのある家...なんか良くないですか？
朝ごはんはトーストに目玉焼きやハム，サラダまでついてそう(勝手な想像)

# まとめ
パンをトーストするための専用機械であるトースター．
必要十分な機能だけを搭載し欲張らないその姿勢．
さすが長年愛されてきた家電です，好きになってきました．
物事はを多面的にみてそのモノの良さに目を向けることができると，豊かな人間になれるかもしれませんね！
AWS認定ソリューションアーキテクト -アソシエイトに合格した話

#### AWS認定ソリューションアーキテクト -アソシエイト(AWS SAA)

AWSの登竜門的ポジションのこの資格。

先月、3月8日に基本情報を受け終わってから12日後の3月20にAWS SAAを受験しました。勉強時間的には仕事終わった後とかにやってたので、せいぜい50時間くらいでしたかね。

#### 筆者のスペック

・入社1年目(受験当時)

・理系大学院卒

・AWSの業務経験ほぼ0

・せいぜいEC2にApacheいれてきゃっきゃうふふしてただけ

・基本情報で合格点は取れるレベル

#### 結果

点数

![AWS SAA1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1128288/7a3305bb-e9c1-29ea-0ddb-cf6a29012ffe.png)


細かい分野の結果

![AWS SAA2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1128288/b9277d0e-7422-4c0d-2d91-0a1132143fd5.png)


&nbsp;とりわけよくもなく、ややギリギリといったところです。

#### 勉強教材

参考書的なものはこちら
[(模擬問題付き)改訂新版 徹底攻略 AWS認定 ソリューションアーキテクト − アソシエイト教科書[SAA-C02]対応](https://www.amazon.co.jp/%E6%A8%A1%E6%93%AC%E5%95%8F%E9%A1%8C%E4%BB%98%E3%81%8D-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8-SAA-C02/dp/4295010650/ref=sr_1_1_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=VD7GL1MPU03Y&dchild=1&keywords=aws&qid=1618152851&sprefix=AWS%2Caps%2C255&sr=8-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEzUExQOERYOVRWRlBEJmVuY3J5cHRlZElkPUEwMjcxNjc3MjEyNDMwVEhYQUJITiZlbmNyeXB0ZWRBZElkPUFLOVJPMFlHMDNWSjcmd2lkZ2V0TmFtZT1zcF9hdGYmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl)

通称黒本、ざっと流し読みした程度です。

こちらについている問題は、本試験とは全然レベルがちがうのでぶっちゃけ

やらなくてもいいです。

問題集はこちらのサイトを利用

<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Faws.koiwaclub.com%2F" title="AWS WEB問題集で学習しよう" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe>
<cite class="hatena-citation"><a href="https://aws.koiwaclub.com/">aws.koiwaclub.com</a></cite>

有料プランを利用しないと全問題は解けませんが

こちらのSAA問題の#80以降を繰り返せば十分です。

本番の問題レベルとほぼ変わらないのでオヌヌメ。

#### 受験の注意

注意事項は以下の2点

・受験当日の本人確認書類は2種類必要(免許証+クレジットカード等)

・問題文が機械翻訳っぽいので適宜英語に切り替えたほうがいい

####
paizaのスキルチェック攻略(Cランク, python)

## 今回やること
paizaのプログラミング問題を解く上で頻出となるロジックをまとめました。
これでCランクは大体いけるはず。言語はpythonです。

## 標準入力から半角スペース区切りで変数に代入
コンソールに半角区切りで値を入力することで、変数a,b,cに代入されます。

```python
a,b,c = input().split()
```
なお、半角スペース以外で区切りたい場合はsplitメソッドの引数に指定する

```python
# 以下の例だと入力値を"+"で区切って入力することができる。
a,b,c = input().split("+")
```

## 任意の文字列を切り出す
開始インデックスと終了インデックスをコロン(:)でつなげて指定することで、文字列を切り出せる
以下の例では、hogeにはtの1文字目と2文字目が入り、fugaにはtの3文字目以降が全て入る

```python
t = input()
hoge = t[0:2]
fuga = t[3:]
print(hoge)
print(fuga)

# 実行結果(入力値 abcdefg)
# ab
# defg
```

## 特定の文字列の出現回数を数える
以下の例では入力された文字列のなかに"<"が何文字含まれているかカウントしています。

```python
hoge = input()
answer = 0
# count関数で変数hogeに<が何文字含まれているか数える
answer += hoge.count("<")
print(answer)

# 実行結果(入力値 a<<b<c<d<e<f)
# 6
```

## 複数の変数を数値で入力したい場合
以下のようにして、input().split()で取得したstr型リストの要素をにint型に変換します。

```python
a,b = (int(x) for x in input().split())
print(a+b)
# 実行結果(入力値 "1 3")
# 4
```

## mapを用いた処理
map関数は引数に map(処理内容,繰り返し処理ができるもの)　という引数を取る。
下記の処理では半角スペース区切りで入力した値をstr型からint型に変換している。

```python
arr = map(int,input().split(" "))
print(arr)

# 実行結果(入力値 "1 2 3 4 5")
# [1, 2, 3, 4, 5]
```

## 配列に数値を代入
map関数は引数に map(処理内容,繰り返し処理ができるもの)　という引数を取る。
下記の処理では入力を半角スペースで区切る→int型に変換→cという配列を作っている

```python
arr = list(map(int,input().split(" ")))
print(arr)

# 実行結果(入力値 "1 2 3 4 5")
# [1, 2, 3, 4, 5]
```
公式PHPライブラリでStripe決済を試してみる

こんにちは。
めちゃくちゃ簡単に決済システムが構築できてしまうStripe。APIが豊富で、凝りたければいくらでも作り込めるのが魅力です（終わりなき旅になってしまいますが……）。

とりあえず触りだけ触ってきました。

## ライブラリのインストール

https://github.com/stripe/stripe-php
PHP用ライブラリはここにあります。適当にダウンロードしてインストール。

## お試し用コード
```
  //Stripe API
  $stripe = new MyStripeApi();
  $stripe->sub = $sub;

  $stripe_response = $stripe->getSubs();
```

`$sub`には、Stripeで管理されている定期支払い(いわゆるサブスク)IDが入っているという前提です。次回詳しく説明します。

```
<?php
/*
Author: toyohama
Version: 0.1.3
*/

require_once(dirname(__FILE__) . '/'. 'stripe-php/init.php');

class MyStripeApi {

  public $sub = '';
  public function __construct() {
    \Stripe\Stripe::setApiKey("sk_test_xxxxxx.................");
  }
  public function getSubs(){
    if ( strlen( $this->sub ) <= 0 ) { return "ng"; }
    $StripeSubscription = \Stripe\Subscription::retrieve($this->sub);
    return $StripeSubscription;
  }
  public function doCancel(){
    if ( strlen( $this->sub ) <= 0 ) { return "ng"; }
    $StripeSubscription = \Stripe\Subscription::retrieve($this->sub);
    $StripeSubscription->cancel();
    return $StripeSubscription;
  }
}
```
`stripe-php`以下にまるっと置いてある前提です。
`setApiKey`に、Stripe側で作っておいたシークレットキーをセットします。ベタ書きしていますが、本当はきちんとどっかで管理すべきです、当然ですが。
`\Stripe\Subscription::retrieve`で、現在の定期支払いの状態を取得できます。[公式のこのあたり](https://stripe.com/docs/api/subscriptions/object#subscription_object-id)を見てもらうとわかりますが、めっちゃたくさん返ってきます。

上記の`doCancel()`の中でやっていますが、この状態で`cancel()`を呼ぶと、その定期支払いをキャンセル（終了）できるようです。あっけなさすぎて逆に不安になるレベル……。なんらかの形で結果が取得できるとは思います(調べきれていない)。

```
$stripe = new \Stripe\StripeClient(
  'sk_test_4eC39HqLyjWDarjtT1zdp7dc'
);
$stripe->subscriptions->cancel(
  'sub_AgOem0qdyCowxn',
  []
);
```

公式に掲載されていたキャンセル処理がこちら。こっちのほうがすっきりしてますね。
他にも、updateやall、createといった操作ができるみたいです。お手軽すぎる。

## まとめ

本当にさわりだけですが、自分のサイトやブログに自力でカスタマイズした決済機能をつけたい、というようなときに一番扱いやすいのではないでしょうか。