OmniAICreator/Qiita-1.07M huggingface dataset:
さくらレンタルサーバー内でのプラン変更

さくらレンタルサーバーでビジネスプランを契約していたのですが、利用状況に見合っていなかったのでスタンダードプランに変更しました。
WordPressサイトのためか若干面倒だったので手順を残しておきます。

# 参考にしたサイト
* 公式が出している手順
https://help.sakura.ad.jp/206209321/
WordPress向けというわけではないのでこれだけだとつまづきます

* WordPressをドメイン変更なしで、新サーバーに移転した手順の覚え書き
https://coliss.com/articles/blog/wordpress/how-to-wordpress-server-migration.html

# さくらレンタルサーバーで変更したいプランを新規契約
https://www.sakura.ne.jp/

# 旧サーバーのWordPressサイトのデータをバックアップ
全てのデータをFTPでローカルに落としておくと安心です。

# 旧サーバーのデータベース（phpMyAdmin）をエクスポート
さくらレンタルサーバーのコントロールパネルからデータベースにログイン
以下の項目にチェックを入れておくと良さそうですが、他のサイトを参照した方が良いかもしれません。

* DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT を追加
* AUTO_INCREMENT 値を追加する
* 完全な INSERT 文を作成する
* 長い INSERT 文を作成する

# 新サーバーのデータベースにインポート
* サイズが小さい場合
新サーバーのphpMyAdminにログインし、インポート

* サイズが大きくインポートに失敗する場合
sshで新サーバーに接続
`ssh <ユーザー名@ユーザー名.sakura.ne.jp>`
MySQLを起動
`mysql -u <ユーザー名> -h <データベースアドレス> -p`
データベースを選択
`use <データベース名>`
インポートする
`source <エクスポートしたsqlファイルのパス>`

# 新サーバーでWordPressをインストール
WordPressのインストールの際にはインポートしたデータベース情報を反映する

バックアップしたWordPressデータをそのままFTPでアップロードしたいところですが、バックアップデータをアップロードしてしまうと旧サーバーと新サーバーのMySQL等のバージョン違い？により正常に読み込みができなくなってしまいます。
※原因はよく分かりません。。

# 新サーバーにバックアップしておいた旧サーバーのデータをアップロードする
アップロードするデータ

* 使用しているテーマ（ `themes/<テーマ名>` ）
* プラグイン（ `plugins` ）
* uploads

wp-config.php にデータベースの情報が正しく反映されているかを確認しておく。

# ドメイン設定をする前に表示確認をしておく
ここはあまり自信がないのですが、初期ドメインにアクセスすると転送されてドメインが変わり旧サーバーが表示されてしまいます。
新サーバーのphpMyAdminにログイン
↓
テーブルを選択
↓
<接頭辞>options をクリック
↓
siteurl の編集をクリック
↓
https://<ドメイン名>/<WordPressディレクトリ>
を以下のように変更する
https://<新サーバーの初期ドメイン>/<WordPressディレクトリ>
↓
home も同じようにドメイン名を初期ドメインに変更する

ブラウザで初期ドメインにアクセスし、正しく表示されていれば siteurl と home は元に戻しておく。

# メールアドレスの移動～ドメインの移動
冒頭の公式が出している手順を参考に反映する。
SSLを設定している場合は、ドメインを削除する前に先にSSLの設定を削除する必要があります。

旧サーバーのドメインを削除するとすぐにドメインからアクセスができなくなります。
公式が出している手順には念押しで、ドメインの再設定は2時間後に行うように記載してあります。

ただ、私のときは30分くらいで旧サーバーとドメインのつながりが切れた（ように思えた）ので、その時点で新サーバーにドメインの再設定をしました。
記憶が定かではないですが、削除した直後にドメインにアクセスをするとさくらインターネットの初期画面になり、20分後くらい再度見たときには契約しているドメインの初期画面に変わっていました。
新サーバーでのドメイン再設定後は更に20分くらいで新サーバーにもドメインが反映されました。
SSLはLet's Encrypt!を使用しているのですが、めちゃくちゃ時間がかかり結局4時間後に反映されました。

アナリティクスを確認しても、一時サイトにはアクセスができない状態がありましたが影響は出ていませんでした。
Python　npのreshapeを直感で覚える


## 背景
npのreshapeがなんとなくわからなかった。
しかしコードを書いてみると、何となくわかったので直感で勉強したい人用に共有したいと思いました。

##サンプルコード


```python:np_reshape_.py

#1行12列
list_1 = [10.0, 14.0, 23.0, 27.0, 37.0, 58.0, 81.0, 82.0, 135.0, 169.0, 344.0, 319.0]
print(list_1)
#[10.0, 14.0, 23.0, 27.0, 37.0, 58.0, 81.0, 82.0, 135.0, 169.0, 344.0, 319.0]

#3行4列
list_2 = np.array(list_1).reshape(3, 4)
print(list_2)
"""
[[ 10.  14.  23.  27.]
 [ 37.  58.  81.  82.]
 [135. 169. 344. 319.]]
"""

#6行2列
list_3 = np.array(list_1).reshape(6, 2)
print(list_3)
"""
[[ 10.  14.]
 [ 23.  27.]
 [ 37.  58.]
 [ 81.  82.]
 [135. 169.]
 [344. 319.]]
"""

#6行2列　2列にすると座標系
list_4 = np.array(list_1).reshape(-1, 2)
print(list_4)
"""
[[ 10.  14.]
 [ 23.  27.]
 [ 37.  58.]
 [ 81.  82.]
 [135. 169.]
 [344. 319.]]
"""

#6行2列
list_5 = np.array(list_1).reshape(6, -1)
print(list_5)
"""
[[ 10.  14.]
 [ 23.  27.]
 [ 37.  58.]
 [ 81.  82.]
 [135. 169.]
 [344. 319.]]
"""
```


## 反省
npのreshapeの-1の使い方が直感的にわかった。
再利用可能ブロックにしたショートコードがhas_shortcodeで判定できていなかった話

WordPressで記事内に特定のショートコードが入っているかを判定する関数がhas_shortcode。

```php
if ( has_shortcode( $content, 'shortcode' ) ) {
    // $content内にショートコード[shortcode]が入っているときにtrueになる
}
```
という感じで使うんだけど、どうも入っているショートコードが判定できていない。<b>しかも本番環境だけ。</b>
テスト環境では同じショートコードで意図通りの挙動になっていたので頭をひねるばかり。

##本番環境とテスト環境での $post->post_content の内容の違い
記事自体の内容をよくよく見直していると、テスト環境ではショートコードを記事に直に書いていたが、本番環境では作業効率化のためにショートコードをGutenbergの再利用可能ブロックとして登録していた。

has_shortcodeに渡していた内容が $post->post_content。この内容を見てみると、ショートコードを直に書いていた場合はショートコードがそのまま入っている状態＝意図した内容がきちんと渡されていたが、再利用可能ブロック化した場合にここに入っているのが<b>&lt;!-- wp:block なんちゃら〜〜〜 /--&gt;</b>という形式のGutenbergのブロック要素。$post->post_contentの段階ではブロック要素が展開されてない、ってことだった。

##ブロック要素だけ展開する
ではこのブロック要素を展開するにはどうしたらいいのか。the_contentまでいってしまうとショートコードまで展開されてしまうので、その前段階のブロック要素のみを展開する方法はないだろうか。ヒントは wp-includes/default-filters.php に記載されていた。

```php:wp-includes/default-filters.php
add_filter( 'the_content', 'do_blocks', 9 );
```
名前的にドンピシャだしリファレンスみてもそのとおり。
https://developer.wordpress.org/reference/functions/do_blocks/

なのでhas_shortcodeにわたす$contentをこんな感じにして解決。

```php
$content = do_blocks( $post->post_content );
```

今 has_shortcode を検索すると、 has_shortcode に渡す代表的なものに \$post->post_contentって挙げられてるけど、 $post->post_content ではGutenbergのブロック要素が展開されていないから注意しようね、って話だったとさ。
中スクロールで右側のpaddingが入らない問題の対応

#はじめに
中スクロールを実装する際に時々以下のような右側のpaddingが入らない時の対応について紹介します。

![スクリーンショット 2019-12-03 11.38.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187768/09649f20-13c7-51c3-989a-1491253fd54a.png)

# 解決方法
結論を言うと、親要素も `inline-block` にしたらpaddingが入るようになりました。

# 原因
デフォルトのblock要素の横幅は親要素の幅一杯が限界で、ただ横を突き抜けてしまっているだけでした。
突き抜けちゃっているので、右側のpaddingの設定が効いていないように見えます。
（試しにoverflow: hiddenとかしたら途切れるのが分かると思います）
![スクリーンショット 2019-12-03 11.42.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187768/d79f0ad8-0236-bf74-417c-c737a71d06bd.png)

inline-blockにすると親の幅関係なく子要素で作られた幅だけ伸びてくれるので、paddingもキチンと一番後ろのところで効くようになります。
![スクリーンショット 2019-12-03 11.43.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187768/bd62132c-ef88-b249-3c24-d35abb775b37.png)

（ちなみこれが分からない時は擬似要素を入れて対応してました・・・）

# まとめ
とりあえずinline-blockで横に並べる場合は親要素もinline-blockにしましょう！と言うことでした。
サンプルコードは以下に置きますので参考にして貰えますと幸いです。

<p class="codepen" data-height="414" data-theme-id="default" data-default-tab="result" data-user="wintyo" data-slug-hash="RwNwqWJ" style="height: 414px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="横に並べる">
  <span>See the Pen <a href="https://codepen.io/wintyo/pen/RwNwqWJ">
  横に並べる</a> by wintyo (<a href="https://codepen.io/wintyo">@wintyo</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
[Shopify] API 更新 12/02/2019

Shopify API更新 12/02/2019
https://developers.shopify.com/changelog/new-liquid-global-object-and-property

Liquid global object and propertyが追加されたようです、すでにすべてのショップに反映済みとのことです。

# request.page_type

リクエストしたページタイプが返ってきます。

下記一覧

- 404
- article
- blog
- cart
- collection
- list-collections
- customers/account
- customers/activate_account
- customers/addresses
- customers/login
- customers/order
- customers/register
- customers/reset_password
- gift_card
- index
- page
- password
- product
- search

詳細はこちらを参照ください
https://help.shopify.com/en/themes/liquid/objects/request#request-page_type

# routes
各ページで設定しているURLが取得できます。

- routes.root_url
- routes.account_url
- routes.account_login_url
- routes.account_logout_url
- routes.account_recover_url
- routes.account_register_url
- routes.account_addresses_url
- routes.collections_url
- routes.all_products_collection_url
- routes.search_url
- routes.cart_url
- routes.cart_add_url
- routes.cart_change_url
- routes.cart_clear_url

詳細はこちらを参照ください
https://help.shopify.com/en/themes/liquid/objects/routes

# product.options_by_name

商品のオプション名で直接アクセスすることができます。

## Liquid

```html
<label>
  Color
  <select>
    {% for color_option in product.options_by_name['Color'].values %}
      <option>{{ color_option }}</option>
    {% endfor %}
  </select>
</label>
```

## Html(アウトプット）

```html
<label>
  Color
  <select>
    <option>Red</option>
    <option>Green</option>
  </select>
</label>
```

詳細はこちらを参照
https://help.shopify.com/en/themes/liquid/objects/product#product-options_by_name


# allow_false

null or empty の値に対してfalseをセットすることができます。

```html
{{ settings.flag | default: true, allow_false: true }}
```

```html
<!-- If settings.flag is false -->
false
```
WebAPIの設計で気をつけたいバージョン管理のハナシ

## はじめに

WebAPIは、上手く使えばWebサービスを連携させることができるので非常に便利ですが、いざその設計をするとなると、UIを備えたWebアプリケーションとは違う観点が必要になります。
今回は、WebAPIの設計をするにあたってよく議論になる（かもしれない）バージョン管理の考え方について書いていこうと思います。

なお、WebAPIとはなんぞや？とか、RESTの原則が、とかいう話は一切出てきません。


## バージョン管理とは

URLに `/v1/users` とか付いてるやつ、よく見ますよね。

状況によっては「バージョン管理なんて無い方が良い」とか「永遠のv1」とかもあり得るかも知れませんが、拡張のためにあった方が良い場面も多いです。

### なぜバージョン管理が必要か？

基本的に一度リリースしたWebAPIは、その中身を変更しようとするとそのAPIを使っているシステム（APIユーザ）にも影響が出てしまうため、不具合を除けば変更しないことが望ましいです。
ただそうは言っても、不具合だったり機能拡張だったり大人の事情だったり、改修を加えたいということが発生するかもしれません。

このときに、その改修内容が、 **【後方互換性があるかどうか】** というのを、WebAPI開発では気にする必要があります。

「後方互換性」を簡単に言い換えると、現行のWebAPIを使っているAPIユーザが、自分のプログラムを変更することなくその変更を受け入れられるか、ということになります。

例えば、リクエスト形式・レスポンス形式に全く変更がない場合は、APIユーザはそのまま自分のプログラムを使い続けても問題ありませんね。
リクエストに一つパラメータが追加された、くらいでもおそらく大丈夫なことが多いでしょう。

しかし、レスポンスの形式が大きく変わってしまったり、今まで存在していたパラメータがなくなってしまう場合、リクエストに必須のパラメータが増える場合などは、APIユーザのプログラム側も変更してもらわないといけなくなります。

この場合は、バージョンを `v1` → `v2` などに変更することで、既存機能は残してそのまま使い続けてもらいつつ、APIユーザに対して変更内容を周知した上で、プログラムを変更して移行してもらうことが必要になります。

特に、APIユーザが自分たちのチームの管轄外である（リリースタイミングが制御できない）場合は、バージョン管理は必須と言えるでしょう。
有名所のWebAPIでも、URLにバージョン管理の文字列が付いているところが多いですね。


### バージョン情報はどうやってつける？

バージョン情報の表現方法は、だいたい以下の4つのいずれかになることが多そうです。

1. `2019-12-04` のような日付形式
2. `v1.2.3` のようなセマンティックバージョニング形式
3. `v1.2` のようなメジャーバージョン.マイナーバージョンの形式
4. `v1` のようなメジャーバージョンだけの形式

※ セマンティックバージョニングとは・・・ https://semver.org/lang/ja/

APIの規模や改修頻度にもよりますが、大体の場合は3か4で事足りるのではないでしょうか。
ただし、どんなときにバージョン変更を行うかはあらかじめ決めておく必要があります。
また、やたらにバージョンを増やしてしまうと、その分管理コストも増えてしまうのでオススメはしません。


### バージョン管理の単位は？

ここは悩みどころだと思います。
本来であれば、 `v1` にすべての機能が網羅されており、 `v2` にバージョン変更しても同じようにすべての機能が網羅されている、という形の方がすっきりしているように見えますが、この形だと、一部の機能だけ後方互換性のない変更を行いたいにもかかわらず、すべての機能に対してバージョン変更が必要になってしまいます。

そこで、機能（エンドポイント）ごとにバージョン管理を行う、という形を取ることがあります。
または、メジャーバージョンはAPI全体に関わる変更（認証方式の変更やレスポンス対応形式の変更など）、マイナーバージョンは機能ごとにアップデートしていく、という形も考えられます。

例えば、以下の2つのエンドポイントがあるような状況で、

`/v1.0/users`
`/v1.0/companies`

users側にのみ変更があった場合は、

`/v1.1/users`
`/v1.0/companies`

のようにバージョン管理をしていく形になります。

すべての場合でこれがベストだとは思いませんが、何か改修がある時は各エンドポイント単位で行われることが多いと思いますので、バージョン管理もそれに即した形式にするのがやりやすいかなと感じています。

もちろん、あらかじめルールを決めた上でAPIユーザに周知しておく必要はあります。


余談ですが、ココらへんのバージョン管理を踏まえたクラス設計は、設計者の腕の見せどころですね...！



## もっと詳しくは
Web API: The Good Parts
https://www.oreilly.co.jp/books/9784873116860/

API設計に関わることになった、という方は、是非これを一読することをオススメします。

本記事のバージョン管理の話ももちろん書かれていますし、設計として抑えておくべきことや考え方も含めて、網羅的・実践的に書かれていて非常に読みやすいと思います。
（宣伝ではないですw）


## あとがき
機会があれば他のハナシについて書くことがあるようなないような。
Redmineのチケットの内容にテンプレを挿入するブックマークレット

Redmineでチケットを起票するとき、いそがしかったりするとつい雑なことを書いてしまい、
後から「コレ何がしたいんだっけ・・・」というゴミが溜まってしまったりします。

そんな事態を避けるためにも、「最低でもコレは書いておく」というルールをチーム内で設定しておくのが理想です。
とはいえ個人任せだと徹底されないので、ここはひとつブックマークレット化しておいて、テンプレをワンクリックで挿入できるようにしましょう。

## ブックマークレットの中身

``` js
javascript: (function () {
		document.getElementById("issue_description").value = document.getElementById("issue_description").value +
				"\n\nh2. 目的\n\n\nh2. やること\n\n\nh2. 完了条件\n\n\nh2. その他"
})();
```

## 使用例

ブックマークレットをクリックすると、

![Redmine-ticket.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46492/34bf01db-e059-18c6-023d-5a982dc41223.png)

こんな感じで、説明のところにテンプレが挿入されます。

あとは挿入された項目に従って中身を埋めていけば、最低限の情報が担保されます。

テンプレの中身を変えたいときには、ブックマークレットの

> "\n\nh2. 目的\n\n\nh2. やること\n\n\nh2. 完了条件\n\n\nh2. その他"




## 参考

ブラウザへのブックマークレット登録方法などは以下参考にしてみてください。

[ブックマークレットを覚えて、決まったブラウザ操作をラクにしていこう - ひびテク](https://yoshikiito.net/blog/archives/1623/)
OpenChain Japan WG「役割ごとの教育資料」SWGのご紹介

株式会社日立製作所 岩田吉隆

#はじめに
今回は、OpenChain Japan WG「役割ごとの教育資料」SWGについて紹介します。

#活動概要
###メンバ

ソニー、オリンパス、日立（リーダ）

###活動状況

- F2F会議での検討、作業（現在まで９回開催）
- Japan WG会議での報告（第７回～第11回）
- Planning SWG他での共通教育資料案のレビュー
- GitHubでの検討資料公開

#####[検討資料](https://github.com/OpenChain-Project/Onboarding-JWG/tree/master/CaseStudy/Training)
#####[資料案](https://github.com/OpenChain-Project/Onboarding-JWG/tree/master/Education_Material/Training/chapters)

#OSSのコンプライアンスにかかる教育の状況
先ず、コンプライアンスにかかる教育の状況について議論しました。

a. OpenChain設立前から、OSSに関する教育を実施している会社もある。
b. これから、教育を実施する会社は、どういう教育内容、対象者からスタートすべきか、検討が必要。
c. 会社毎のビジネス形態により、 OSSに関わる必要なビジネスフローは異なる。
d. OSSに関わる上で、役割ごとに本当に必要最小限な教育観点は異なっている。
e. Curriculum※ を全て教育内容に盛り込むと、分量が多すぎる。
f. Specification※, Curriculumとの整合性も考慮が必要。

 (※：SpecificationはOpenChainの一連の要件を定義している仕様書、CurriculumはOpenChainのSpecificationを下支えするトレーニング教材)

#進め方の方針
コンプライアンスにかかる教育の状況を踏まえ、進め方の方針について検討しました。

a. 既に各社実施されている教育の体系、対象者、形態(講演会、集合研修、e-learning、資料閲覧、他)、タイミング、英語版有無を、可能な範囲で事例として提示。
b. a.に関して、各教育がビジネスフロー上で、どの対象者をカバーしているかを明示。
c. 各教育の目次、章/節の概要程度まで、可能な範囲で提示。
d. a, b, cの事例を元に、下記を整理する。
　　①最初にsmall startするための必要最小限の項目は？
　　②役割ごとに、教育資料として必要な項目は？共通項目、役割ごとの独自項目は？
　　③ライセンス関連で必要な項目は？
　　④SPDXの活用方法は？
　　⑤役割ごとの共通教育資料の案を作成

#４社の事例の分析
先ずステップ１として、４社の事例の分析からスタートしました。  
a. 各社のOSSに関する教育の例を収集

|No.|会社|事例数|
|:--:|:--:|:--:|
|1|製品ベンダー1|9|
|2|製品ベンダー2|5|
|3|製品ベンダー3|1|
|4|製品ベンダー4|2|

b.下記の分析観点について、分析、報告
　　i. OSSに関する教育のニーズ
　　ii. OpenChainのSpecificationに準拠する。
　　iii. Curriculumの過不足を考慮
　　iv. 役割ごとの教育の検討 (４社のケーススタディ) 
　　　　⇒　GitHubへアップ

#４社の事例からの提案と検討
次にステップ２として、４社の事例の分析結果を基に、共通教育資料の案の作成を行っています。
a. ４社の事例の分析結果を元に、共通教育資料の検討を実施
　　i. Specificationを満たすためにコンプライアンスプログラムの記載は必須
　　ii. Curriculumの過不足を配慮
　　iii. リーフレットで使用されている語彙、表現を考慮
　　iv. 各社の一般向け基礎教育の共通内容を考慮

b. 製品ベンダーのソフトウェア開発者向け共通教育資料のコンプライアンスプログラム・バージョンの案の提案を行う。a.のi.～ⅲ.は必須項目とし、ⅳ.の共通内容を重点的に、ⅳ.の一部内容は概略的に、説明する方向で詳細化を図る。OSSを使用して製品を開発するために、製品ベンダーのソフトウェア開発者向けというターゲットを設定した。

c. 役割ごとの分担と責任の明確化の例示
　　Specification上での役割の必須要件の例示を行う。

d. 案作成の検討を通して、下記章立てにて作成中

  - OSS概説
  - 知的財産権
  - OSSライセンス
  - OSSコンプライアンスプログラム
  - OSS導入時の検討
  - OSSレビュー
  - OSS配布
  - まとめ
  - 問い合わせ先
  - 参考文献・団体

e. d.の各章毎に、GitHub上でJapan WG内のレビューを行う。

#おわりに
以上、OpenChain Japan WG「役割ごとの教育資料」SWGについて簡単に紹介しました。更に、教育資料の事例の拡充や、共通教育資料案の紹介とレビューを行う予定です。皆様の参加をお待ちしています。
AppCenterのリリース情報は簡単に取れる。そう、Bitriseならばね。

## 事の経緯
ちょっと前にSlackにAppCenterのURLを貼るために、リリース情報を取得するスクリプトを書いた。

↓ これが件のスクリプトである。
AppCenterに最後にデプロイしたリリース情報を取得する。
https://qiita.com/satoshi-baba-0823/items/8c7802d95727bee870fd

正直こんなことのためにスクリプトを書くのは面倒だ。
何とかならないのかと、インテグレーションのソースを読んでいたところ...(https://github.com/fileformat/bitrise-step-appcenter-app-release))

## あった！
[こちらがソースである。](https://github.com/fileformat/bitrise-step-appcenter-app-release/blob/master/step.sh)

```
| STATUSCODE=$(curl -X GET \ |
|:--|:--|:--|
|  | --header "Accept: application/json" \ |
|  | --header "X-API-Token: ${appcenter_api_token}" \ |
|  | --silent --show-error \ |
|  | --output /dev/stderr --write-out "%{http_code}" \ |
|  | https://api.appcenter.ms/v0.1/apps/${appcenter_org}/${appcenter_name}/releases/${RELEASE_ID} | \ |
|  | 2> "${TMPFILE}") |
|  |
| if [ "${STATUSCODE}" -ne "200" ] |
| then |
|  | echo_fail "API call failed with ${STATUSCODE}: $(cat ${TMPFILE})" |
| fi |
| DOWNLOAD_URL=$(cat "${TMPFILE}" | jq .download_url --raw-output) |
|  |
| echo_details "result is ${STATUSCODE}: $(cat ${TMPFILE})" |
| echo_details "APPCENTER_DOWNLOAD_URL is ${DOWNLOAD_URL}" |
| envman add --key APPCENTER_DOWNLOAD_URL --value "${DOWNLOAD_URL}" |
```

お分かりいただけたであろうか...？

環境変数に登録されてるぅ！！
＿人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人＿
＞　envman add --key APPCENTER_DOWNLOAD_URL --value "${DOWNLOAD_URL}"　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣

この`APPCENTER_DOWNLOAD_URL `でAppCenterにアクセスできるぞ！
ありがたや〜！！
PHP  の json_encode($hoge, JSON_FORCE_OBJECT) の JSON_FORCE_OBJECT ってなんだっけ

## json_encode() とは
https://www.php.net/manual/ja/function.json-encode.php

```php
json_encode ( mixed $value [, int $options = 0 [, int $depth = 512 ]] ) : string
```

**`$value`  をJSONにして返します。** 
で、その第二引数の `JSON_FORCE_OBJECT` ってなんだっけ？と思ったのでメモ。
（そのほかのオプションもまた出会ったら追記していくかも）

## そもそも第二引数（ `$options` ）って何？ 

`JSON_FORCE_OBJECT` などのビットマスク。（どうやって出力するか、的な？）
そのほかの各定数の意味については [JSON 定数のページ](https://www.php.net/manual/ja/json.constants.php) に記載あり。

### で、　`JSON_FORCE_OBJECT` の意味

配列をオブジェクトとして返してくれる。

> **JSON_FORCE_OBJECT (integer)**
> 非連想配列を使用した場合に、配列ではなくオブジェクトを出力します。 出力を受け取る側がオブジェクトを期待しており、配列が空っぽである場合などに特に便利です。 この定数は PHP 5.3.0 以降で使用可能です。

## ついでに他のパラメータについて

### `$value`
エンコードする値。エンコードしたい配列とかをここに。

### `$depth`
最大の深さ。正の数でないといけない。
（階層の深さってことかな？）

## 関連・参考
https://qiita.com/shosho/items/34d0e9cc68c376a0a972
FileMakerでのキャンセル処理の実装

FileMakerでの開発業務をしているとお客様からキャンセル機能が欲しいとご要望いただくことが多く、
レイアウトオプションの「レコードの変更を自動的に保存する」の話をさせていただくがイマイチ収まりが悪いことが多い。

UI上の考慮だとかについて今回は割愛し、キャンセル機能の実装についてのみ、ざっくりと

# 前提ファイル
- FileMaker Pro Advanced 18 (古いバージョンでもまぁ動きます)

# 実装
## テーブル構造
![スクリーンショット 2019-12-03 10.58.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94403/edfbfabc-573b-b123-27f3-870b0c63f7b1.png)

肝になるのはフィールド「#Flag」だけで、初期値として「0」が格納される様に設定してあります。
*余談ですけどシステム用のフィールドの頭に記号を付ける時「#」を使うのはマイナーなんですかね*

## 画面
![スクリーンショット 2019-12-03 10.57.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94403/8a7082b0-2ba8-b918-6539-58e565d4377c.png)

## 挙動
![スクリーンショット 2019-12-03 10.57.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94403/b3309aee-2702-71c6-a2ae-729f11aad1fd.png)

![スクリーンショット 2019-12-03 10.57.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94403/856d719b-fbf4-08f9-52bb-a435c8772070.png)

## スクリプト
![スクリーンショット 2019-12-03 10.58.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94403/65b8c979-d59d-cd2d-03b1-88147d8f44c7.png)
![スクリーンショット 2019-12-03 10.58.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94403/a27b0428-330a-8399-3a88-f191d3a89939.png)
![スクリーンショット 2019-12-03 10.58.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94403/02c10195-4545-8e10-ec63-73278ce07195.png)

## スクリプトの動きについて
スクリプトの挙動としては「Layout: OnSavingRecordEvent」でフィールド「#Flag」の値をチェックし
OKボタンが押されるまでは、レイアウトの保存イベントを中止させることで、レコード復帰で戻せる状態をキープしている。
Get(レイアウトテーブル名)を使用しているのは、フラグとなるフィールドを用意してあげれば他のレイアウトでの使い回しが容易なため。

### 余談
Get(変更されたフィールド)などで、イベントのタイミングをもうちょっと制御したり
UIを作り込むためのフィールドを追加した際に、少し面倒になる。
フィールド名に記号を追加しておいてGet(変更されたフィールド)で取得した際に、
PatternCountでフィルターして例外処理を組んであげれば良いかと。

### 願望
レイアウト上のフィールド情報をJSON形式で取得したい。
**レイアウト上にフィールド.プロパティ名でデータを表示したい。**
極論レイアウトをオブジェクトとして書き換えたいんだけどそこまでするならFileMakerでやる必要とは、、、、
削除がうまくいかずエラーが出る。。。 ❏Rails❏

#ツイートを削除しようとしたら、こんなエラーが出た。

###`ActiveRecord::StatementInvalid in TweetsController#destroy`

###`Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails`

![ダウンロード (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529651/dd687747-ab75-1bfc-90cb-2c93a909ed4c.png)

僕はただツイートを削除したいだけなのに。。。

<br>
#なぜエラーがでたのか

####【結論】
`tweetsテーブル`と`commentsテーブル`で外部キー制約を結んでいたため。

<br>
【commentsテーブル】
<img width="249" alt="21b53daebb42568420a0e4d42c965cf9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529651/f8c524c8-233d-9760-1cb4-5cfe8ff29a75.png">

外部キーとして、`tweet_id`があるのがわかります。

コメントは必ず何かしらのツイートに結びつきます。
`勝手にツイートを削除すると、迷子のコメントが現れます！`
これがエラーの正体です。

<br>
#解決策
`dependent: :destroy`を追記。
ツイートを削除すると同時に、そのツイートに結びついたコメントも削除します。

```ruby:app/models/tweet.rb
class Tweet < ApplicationRecord
  has_many :comments, dependent: :destroy
end
```

<br>
参考
>https://qiita.com/kemako/items/e98174b9747e0b2c75a6

<br>
ではまた！
削除ボタンを押したら、確認ダイアログを出そう。 ❏Rails❏

#`data: { confirm: "削除しますか？" }`を追記

```ruby:xxx.html.haml
= link_to "削除", path, method: :delete, data: { confirm: "削除しますか？" }
```

最後に加えればOK！
めっちゃ簡単に確認ダイアログが作成できた！嬉しい！！

<br>
ではまた！
CC0ライセンスの空白PDFファイル

# はじめに

ライセンス的に問題のない「空白PDFファイル」が欲しかったのですが、すぐに見つからなかったので作りました。リポジトリはこちらです。

https://github.com/kaityo256/blank_pdf

# 空白PDFが欲しい

あるPDFファイルと別のPDFを`pdftk`で結合することを考えます。この時、二つ目のPDFを、いわゆる「奇数ページ起こし」にしたいことがあります。つまり、１つ目のファイル(A)が奇数ページ(例えば3ページ)で終わっており、二つ目のファイル(B)が偶数ページ(例えば4ページ)ある時、そのまま結合して両面印刷すると

```txt
A1,A2 | A3,B1 | B2, B3| B4
```

みたいになって読みづらくなります。これを、空白を一枚挟んで

```txt
A1,A2 | A3,空白 | B1, B2| B3, B4
```

としたくなりますね。もし空白のPDF`blank.pdf`があれば、`pdftk`を使って

```sh
pdftk A.pdf blank.pdf B.pdf cat output output.pdf
```

でおしまいです。というわけで、PDF`blank.pdf`が欲しいわけですが・・・、空白のPDFってどうやって作るんだ？

で、[ググって見る](https://www.google.com/search?q=%E7%A9%BA%E7%99%BD+pdf)と、Rubyを使う方法も出てくるんですが、オンラインツール使う方法とか、Adobe Acrobatを使う方法とかが多い感じです。英語でググっても、なんかツールを使えみたいなのが多くて、うーん、という感じ。

たまに「白紙PDFをどうぞ」的なサイトもあるのですが、ライセンスが不明なのと、ダウンロードしてみると、ファイルに余計な情報が入っていたりして微妙だったりします。

というわけで、[こちら](http://kujiraiken.sit.ac.jp/blog/2013/10/blanksheet-pdf/)でも紹介されている、Ruby + Prawnで空白PDFを生成することにします[^1]。

[^1]: 最初、このページ見て「RubyとlibHaruを使っている」ところまで見て、自分でPrawnで書いてから、後で見返してみたら「追記」にPrawnを使う方法が書いてあることに気が付きました。

# Ruby + Prawnで空白PDF

といっても、コードはこれだけ。

```rb:blank_pdf.rb
require "prawn"

doc = Prawn::Document.new(page_size: "A4")
doc.render_file "blank.pdf"
```

できあがるPDFも

```ps
%PDF-1.3
%????
1 0 obj
<< /Creator <feff0050007200610077006e>
/Producer <feff0050007200610077006e>
>>
endobj
2 0 obj
<< /Type /Catalog
/Pages 3 0 R
>>
endobj
3 0 obj
<< /Type /Pages
/Count 1
/Kids [5 0 R]
>>
endobj
4 0 obj
<< /Length 4
>>
stream
q
Q

endstream
endobj
5 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [0 0 595.28 841.89]
/CropBox [0 0 595.28 841.89]
/BleedBox [0 0 595.28 841.89]
/TrimBox [0 0 595.28 841.89]
/ArtBox [0 0 595.28 841.89]
/Contents 4 0 R
/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
>>
>>
endobj
xref
0 6
0000000000 65535 f 
0000000015 00000 n 
0000000109 00000 n 
0000000158 00000 n 
0000000215 00000 n 
0000000268 00000 n 
trailer
<< /Size 6
/Root 2 0 R
/Info 1 0 R
>>
startxref
540
%%EOF
```

と最低限で、余計な情報が入っていなくていい感じです。ちなみに二行目の「????」は、このファイルがバイナリであることを知らせるための非ASCIIデータです。一応このファイルをCC0ライセンスで[リポジトリに置いておく](https://github.com/kaityo256/blank_pdf/raw/master/blank.pdf)ので、必要な人はダウンロードして使ってください。

# まとめ

なんか空白PDFが必要な人が、その都度スクリプトその他で作ってる気がしてアレな気がしますね。`pdftk`に白紙PDFを生成する機能があると一番幸せな気がしますが、作ってプルリクするのがいいのかな。
redirect_backで直前のページにバック！ ❏Rails❏

現在ツイート詳細ページ（show.html.haml）でコメントができます。
![alt](https://gyazo.com/f989bfdb4eb8bbfc22f29d03612d2cc3.gif)

ツイートにコメントをしたらコメントする前の状態に戻るようにします。
`redirect_back(fallback_location: アクション名)`で直前のページに戻すことができます。

```ruby:app/controllers/comments_controller.rb
def create
  tweet = Tweet.find(params[:tweet_id])
  @comment = tweet.comments.build(comment_params)
  if @comment.save
    redirect_back(fallback_location: tweet_path(tweet))
  else
    flash[:danger] = "テキストを入力してください"
    redirect_back(fallback_location: tweet_path(tweet))
  end
end
```

`tweet_path`はshowアクションの`prefix`です。

以上！

<br>
参考
>https://railsguides.jp/layouts_and_rendering.html

<br>
ではまた！
意識が低い雰囲気エンジニアのやり方

<img width="1280" alt="Advent Calnder.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540555/6a37e675-8d19-7b45-60d3-a4a2b58ec642.png">

# 自己紹介

bosyuで意識低い系雰囲気エンジニアをしています。
なので難しい理屈とかそういうのは分からないでエンジニアやっています。
守備範囲も適当です。iOSだったり、バックエンドだったり、フロントやったり……

そんな適当でどんな感じでやってんのっていう話をします。

# Webviewアプリからフルネイティブへの移行

まったくiOSエンジニアがいない所からの依頼です。今年一番大きいお仕事でした。
最初はコンサル的な感じでお願いをされていたのですが、せっかくなのでコードも書きたいなと思い開発もさせて頂くことに。

メンバーは全員業務委託で、週1〜2日の稼働、自分を含めて2人でやる事になりました。
もう1人の方はAndroid開発者でiOS開発未経験です。

## まずやったこと

アーキテクチャを決め、ベースになるコードや画面の作り方を一通り作ってしまうことです。

### アーキテクチャ

これは本当に沢山あります。
MVC, MVP, MVVM, VIPER, CleanArchitectureなどなど……
エンジニアの好みや慣れ親しんだものがそれぞれあると思います。

ウチは雰囲気でエンジニアをやっているので難しいことは何一つ分かりません。
なので正直どれでもいいです。どれでも作れますしどれ選んでもある程度は汚くなるし、どれでやってもメリデメあります。
設計とかに完璧は存在しないのです（betterとかはあると思う）

ウチが今までの経験上、iOS開発で大事にしていることは雑に言うと

- ViewControllerをデブにしない
- データの流れを複雑にしない
- レイヤー作ったらあちこち参照しない

ということです。
これ守れれば大体なんとかなるかなぁと。

んでこれを突き詰めていったのがCleanArchitectureかなぁと感じてはいるので、これをベースにしました。

しかしCleanArchitectureのデメリットととして多くの人がご存知かと思いますが、コストがかかりすぎるということです。
あと分からない人がとっつきにくいとか色々ありますね。

ましてやスピード重視の初期の段階でこれを採用するのはどうかと思います（思います）

でもCleanArchitectureって世の中の記事とか見ると結構皆さんそれぞれで自由にやってるんですね、個人的な見解ですが。
だからガチガチに抽象化して固める必要なんかなくて、適当に緩くしちゃえばいいのかなぁって思うわけです。
メンバー少人数だし、エンジニア間で認識が取れてれば問題はないはず（勿論後々人が沢山来たときのことはある程度考える）

というわけでゆるふわCleanArchitectureにしました。

### なにがゆるふわなのか

- Data層でDIしなかったり
- Domain層のモデル作ったり作らなかったり
- ViewにRouterっぽいの持たせなかったり
- DIも自前で簡単なもので済ませたり（作ったのはウチではない）

まぁその時その時で必要になればやればいいのかなぁと。
ってか上のやつそんなにCleanArchitecture関係なかった……

### なんとなく守るべきルールを決める

iOSの開発独特の雰囲気ルールを決めました。

- 1画面1Storyboard
    - もちろんこれも厳しくではなく、ContainerViewやChildViewController使う時は別に良い
- さっきのアーキテクチャで下のレイヤーが上のレイヤーを参照したらダメ
- ColorAssets利用しましょう → New
    - 初めて使ったけどこれは便利でした
- CocoaPodsは禁止でCarthageオンリー
    - 意地
- RxをViewでは闇雲に利用しない様にする
    - 今までやってて人による理解度の差があったり、逆にコード長くなってない？というところがあったりして、無秩序になりやすいなぁと感じていたので。便利なんですけどね

# どんな感じだったか

## 初期

Alamofire使ったAPI Clientとか、view/presenter/usecase/repository/datastore 作って簡単な画面作ってゆるふわアーキテクチャの認識合わせを行います。

もう1人のエンジニアの方はウチよりかなり若くて凄く頭が良いので、バンバン意見をくれて本当に助かりました。
またこのゆるふわで適当なウチに凄く理解を示してくれて感謝です。

流石にView周りで知らないと無理、という様なところだけは指摘しましたが、それ以外は自走してくれました。

また中盤に入る前に知り合いの優秀なiOSエンジニアをさらに召喚しました。
この方もこの雰囲気エンジニアに理解ある方で本当に助けられました。

## 中期

この時にはすでに手法は固まっていたので、みんなでバリバリ開発する感じです。
API Client作って、Repository作って、Usecase作って、ViewController+StoryboardとPresenter作って、最後つなげる。

まがりなりにもCleanArchitectureなのでレイヤーはある程度分かれて、メンバーのコードがぶつかり合う事もなく平和に進みます。

デザイナーさんがiOS経験がほぼなく、色々紆余曲折ありましたが、段々と形になってきます。

## 後期

今ここです。
利用する外部サービスの変更などヤバいっていうのがちらほらありましたが、最小限の形でリリースまで行けそうです。

アドベントカレンダーが終わる頃にはリリース出来てるといいなぁ、という感じです。

# まとめ

- ちゃんとしている人に怒られそうなエンジニアなのに、なんとかやっていけてます
- 優秀な人はこんな適当なエンジニアにも合わせられるので凄い
- 優秀なメンバー最高
- つまりは運良く良いメンバーに恵まれているだけで生きていけてる！？
- こんなエンジニアがいたっていいじゃない
WordpressでjQueryを読み込む

◉functions.phpへの記述

```php
<?php
function my_enqueue_script() {
    wp_enqueue_script( 'script-js', get_template_directory_uri() . '/script.js');
}
add_action( 'wp_enqueue_scripts', 'my_enqueue_script' );
?>
<?php
add_filter( 'show_admin_bar', '__return_false' );
?>
```

◉header.php（もしくはindex.php）への記述 ※```</head>```の直前に記述する。

```php
<?php wp_head(); ?>
	</head>
```
Outsystemsの「Associate Web Developer」認定試験を再受験した感想

# 自己紹介
前職で金融系システムの開発と保守業務に約二年間半を経験しました。現在ランスタッド IT本部に所属し、主にOutSystemsでの開発業務に携わっております。Outsystems初心者ですので、マスターできるように頑張っています。
#はじめに
この記事はRandstad Advent Calendar 2019 の 4 日目の記事です。今年の11月に、二回目のOutsystems「Associate Web Developer」認定試験を受験しました。今回は合格点が取れると思いましたが、実際受験した後に、合格できるかかなり不安がありました(結果はギリギリ合格できました)。これから試験に参加する人に少しでも参考になれると幸いなことであると考え、二回目の記事を書きました。

# Outsystemsと認定試験の紹介
- Outsystemsとは
- Outsystemsの認定試験の種類
- 「Associate Web Developer」認定試験について

上記の内容について過去に書いた記事を参考にしてください。
https://qiita.com/zhihan7889816/items/cf05dc6c0c57c7e945d9

# 認定試験の準備としては
  私は去年、12月にBluememe社が主催した「OutSystems Webアプリ開発ブートキャンプ」に参加しました。今回「Associate Web Developer」認定試験を受験する前に、ブートキャンプでの練習プロジェクトを三回実施しました。一回目の試験より余裕がありましたが、試験を受けた感想は、練習では気づけない問題も少なくはありませんでした。

今回は、既に基礎があり、更にここでも気づいた方がよいポイントをリストしたので、参考にしてください。

- Server ActionをFunctionとして利用する場合の特徴
- Screen Action と Preparationの実行順番
- ExpressionにHtmlを入れるか（入れることと入れないこととか）

上記は練習プロジェクトを実施した中で、あまり気づかないところをピックアップしました（あくまでも参考です）。このように色々試して、Outsystemsの仕組みを理解した上で、試験に向けて準備した方がいいかなと思います。

#終わりに
初心者が「Associate Web Developer」認定試験に向けてどうやって準備した方がよいか分からない方がいると思います。オンライン資料の熟読と練習プロジェクトの繰り返しの実施が勿論重要ですが、普段の練習や開発中で意識しないところにこの記事を参考にし、試験準備の役に立てば幸いです。
WordPress自作テーマでナビを表示させる

◆メニューを表示させる（header.phpへ記述）
<?php
 $args = array(
 'menu_class' => 'nav navbar-nav',
 'container' => false,
 );
 wp_nav_menu($args);
 ?>

◆管理画面の外観のサブメニューに”メニュー”を表示させる（functions.phpへ記述）
<?php
function menu_setup() {  
  register_nav_menus( array(
    'global' => 'グローバルメニュー',
    'side'   => 'サイドメニュー',
    'footer' => 'フッターメニュー',
  ) );
}
add_action( 'after_setup_theme', 'menu_setup' );
?>
WordPress本文を表示させる

◆single.phpで投稿された記事を表示させる。
```
<?php get_header(); ?>
　<h1><?php the_title(); ?></h1>
　<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
　<?php the_content(); ?>
　<?php endwhile; endif; ?>
</div>
<?php get_footer();?>
```
◆Single.phpが表示されない・・・
　設定→パーマリンク設定→カスタム構造で
/%postname% に設定する

◆記事の数の上限を指定する。　page=表示したい数
<?php query_posts('posts_per_page=10'); ?>

◆日付の表示の仕方
<?php echo get_the_date('Y.m.d'); ?>
y,m,dの記述の仕方により、表示の仕方が異なる。
[詳細](https://www.php.net/manual/ja/function.date.php)
【VBA】accessイベント更新前処理・更新後処理・変更時の違いをまとめる

#初めに
accessのイベント
・更新前処理
・更新後処理
・変更時
のイベントについてまとめる
個人メモ用です。
## 更新前処理イベント
読んで字のごとく更新前のイベント
■何が更新前なのか？

「テキストボックス全体の入力・変更が完了したら」

イベントが始まる。

■使いどころ
入力された情報が正しいのか確認するとき。

## 更新後処理イベント
読んで字のごとく更新後のイベント

■使いどころ
入力された情報
例えば名前コードが入力された際に
その名前コードに紐づく名前を表示させるとかそういう際に使えう

## 変更時イベント
これのイベントの発生のきっかけは上記とは違い
テキストボックス内部で起こる。

「あした」を「明日」と変換した際などにイベントが発生する。

厳密な入力チェックなどを行う際などに使えるかも。

## 追加
プログラムでコントロールに対して
何かしらのデータを入れた際には上記イベントは発生しない。
ユーザー側から発生する。

以上。
PHP Invalid argument supplied for foreach() .. errorの対処法

#Invalid argument supplied for foreach() ..のエラーの簡単な対処法について

エラーの原因は
「Invalid argument supplied for foreach() ：foreachに使えない変数を使っていることなので

foreach()に合わせて、変数を修正すれば大丈夫です。

ちなみにforeach()が使える引数の説明は

<b>「foreach は、配列を反復処理するための便利な方法です。 foreach が使えるのは`配列`と`オブジェクト`だけであり、 別のデータ型や初期化前の変数に対して使うとエラーになります。 この構造には二種類の構文があります。」</b>(<a href="https://www.php.net/manual/ja/control-structures.foreach.php">foreachの使用方法</a>)

と明記されているので、`配列`か`オブジェクト`のどちらかに合わせてあげればオッケーです。

```
foreach((array)$data as $value){
  ...
}
```
の様に変数の直前に "(array)"を付けて、変数を強制的に配列にしてあげれば大丈夫です。
これが一番シンプルな気がします。

以上
Raspberry Pi 3B/3B+/4Bの機種判別（Raspbian Buster）

# Raspberry Pi 3B/3B+の機種判別（Raspbian Buster）

ぱっと、インターネットを調べたところ誰も書いていなかったので記述。（RaspberryPi公式フォーラムのQAにはRaspberryPi2シリーズの出力例載っていたが、3は載っていなかった。。。）

SBC（シングルボードコンピュータ）愛好家であれば、Raspberry Pi3Bと3B+が混在環境を自宅に持っている！！という方も意外と多いのではないかと思います（？？？）

## この機種判別が何の役に立つか？
1. Wi-Fi設定の使い分けなどに使えるかも。（3Bだと2.4GHz、3B+だと5GHzに自動接続するようにするなど。）
2. `~/.bashrc`の`PS1=`に追加して誤操作防止に役立てる。
3. その他、きっと何かあるはず。きっと。

## 判別方法
`/proc/device-tree/model`にモデル名が記述されています。3B+はモデル名に「Plus」が入る点、Revが「1.3」になっている点が異なります。

### Raspberry Pi 3B
```bash
$ cat /proc/device-tree/model 
Raspberry Pi 3 Model B Rev 1.2
```

### Raspberry Pi 3B+
```bash
$ cat /proc/device-tree/model
Raspberry Pi 3 Model B Plus Rev 1.3
```

### Raspberry Pi 4B
```bash
$ cat /proc/device-tree/model
Raspberry Pi 4 Model B Rev 1.2
```

### 正規表現
3B+に引っ掛けるとするとこんな感じ。

```
^Raspberry Pi 3 Model B Plus Rev \d+(?:\.\d+)?$
```
CakePHP2で特定のディレクトリにあるテストを全部実行する

全テストを実行させると時間かかりすぎるので、特定のディレクトリにあるテストだけ、全部実行したいってことがあったのでその方法のメモ。

実行したいテストのディレクトリに移動して下記を実行

```
$ ls | xargs -I@ cake test @
```

再帰的にディレクトリ下のテストを全部実行したいなら下記

```
$ find . -name "*Test.php" | xargs -I@ cake test @
```
ハンバーガーメニューのon/off

ボタンを2種類作り、オンでactiveというクラスをglobalnavクラスに与え、表示させる。
offの場合はactiveというクラスを取り除き、また、”.removeAttr(’style’)”で今回書き足したCSSを削除し、元の状態に戻る。

html

```html
	<button id="open" type="button" name="name" class="menu">≡</button>
	<button id="close" type="button" name="name" class="menu">×</button>
```

javascript

```js
    jQuery(document).ready(function(){
      $('#open').on('click',function(){
		$('.globalnav').addClass('active');
		 
       $('.globalnav').css('display','block').animate({right:'200px'},300);
		$('#close').css('display','block').css('display','block');
		$('#open').css('display','block').css('display','none')

	   $('#close').on('click',function(){
		$('.globalnav').css('display','none');
		$('.globalnav').removeClass('active');
		$('#close').css('display','block').css('display','none');
		$('#open').css('display','block').css('display','block');
		$('.menu*').removeAttr('style');
		$('.globalnav*').removeAttr('style');
	 });
	 });
    });
```
Python　テキスト読み込み　複数行と一行の場合

## 背景
YOLOv3のコードでPythonを勉強したとき、メモとして記録しておきたかった。
各内容ができ次第、アップします。

## テキスト読み込み
今回扱うのはテキスト内容は複数行の場合と一行の場合である。

## サンプルテキスト：複数行
```txt:coco_classes.txt
person
bicycle
car
motorbike
aeroplane
```

## サンプルコード：複数行

```python:readlines_.py
import os
classes_path = 'model_data/coco_classes.txt'
#ホームディレクトリに変更
classes_path = os.path.expanduser(classes_path)
with open(classes_path) as f:
#テキストを文字列＋改行として、１つのリストにする
    class_names = f.readlines()

# テキスト内のn行目の値をcに入れて、改行を削除
for c in class_names:
    c = c.strip()
    print(c)
```



## サンプルテキスト：一行
```txt:tiny_yolo_anchors.txt
10,14,  23,27,  37,58,  81,82,  135,169,  344,319
```

## サンプルコード：一行

```python:readline_.py
import os
anchors_path= 'model_data/tiny_yolo_anchors.txt'
#ホームディレクトリに変更
anchors_path= os.path.expanduser(classes_path)
with open(anchors_path) as f:
#テキストを文字列＋改行として、１つのリストにする
    anchors_path= f.readline()

# テキスト内の','で区切った値のn番目の値をxに入れて、float型に変更
for x in anchors.split(','):
    x = float(x)
    print(x)

#上記の処理に付随
anchors = [float(x) for x in anchors.split(',')]
```

##さらに文字列で遊んでみた
```python:play_with_anchors_value.py
import os
import numpy as np
anchors_path= 'model_data/tiny_yolo_anchors.txt'
with open(anchors_path) as f:
    anchors_path= f.readline()

print(anchors_path)
#10,14,  23,27,  37,58,  81,82,  135,169,  344,319

anchors = [float(x) for x in anchors.split(',')]
print(anchors_path)
#[10.0, 14.0, 23.0, 27.0, 37.0, 58.0, 81.0, 82.0, 135.0, 169.0, 344.0, 319.0]

anchors = np.array(anchors).reshape(-1, 2)#座標の２列に整える、-1は補正扱い
print(anchors_path)
"""
[[ 10.  14.]
 [ 23.  27.]
 [ 37.  58.]
 [ 81.  82.]
 [135. 169.]
 [344. 319.]]
"""

```


## 反省
コード解読は勉強になる（かもしれない）。
Office 2019オフラインインストール用batファイル(64ビット版のみ)

ボリュームライセンスでOffice Standard 2019を購入し、オフラインでインストールを行う方法です。
インストールは、64ビット版を対象としています。
[Office 2019オフラインインストール用batファイル(32ビット版/64ビット版の両方)](https://qiita.com/ssCARO/items/d64ed50c27207587c1fb)
[Office 2019オフラインインストール用batファイル(32ビット版のみ)](https://qiita.com/ssCARO/items/8425795990f3bed6d674)

# インストールファイルのダウンロード
VLSCからOffice Standard 2019のダウンロードでOffice 2019 Deployment Toolのexeをダウンロードする。

ダウンロードしたexeを実行し、展開先に適当なフォルダ(`C:\Office2019`)を指定する。
展開先のフォルダにはsetup.exeとサンプルのxmlがある。

展開先のフォルダに次のファイルを作成する。

```configuration-x64.xml
<Configuration>
    <Add SourcePath="C:\Office2019\Download_x64" OfficeClientEdition="64" Channel="PerpetualVL2019">
        <Product ID="Standard2019Volume">
            <Language ID="ja-jp" />
        </Product>
    </Add>
</Configuration>
```
コマンドプロンプトを実行し、`setup.exe`がある展開先のフォルダに移動して次のコマンドを実行する。
64ビット版のダウンロードが始まる。
ダウンロード中の進捗メータは表示されないので、コマンドが終わるまで待つ。

```:コマンドプロンプト
setup /download configuration-x64.xml
```
これで次のフォルダにインストールに必要なファイルがダウンロードされている。
- C:\Office2019\Download_x64

# インストーラーファイルの作成
次の2つのファイルを作成する。(シフトJISで作成)

```configuration-template.xml
<Configuration>
    <Add SourcePath="$SourcePath$" OfficeClientEdition="$OfficeClientEdition$" Channel="PerpetualVL2019">
        <Product ID="Standard2019Volume">
            <Language ID="ja-jp" />
        </Product>
    </Add>
</Configuration>
```

```Office_Setup.bat
rem Office 2019 のオフラインインストールを実行します。
rem DVDメディアにオフラインデータを書き込んでいることを想定しています。
@echo off
cls

echo.
echo 64ビット版 Office のインストールを行います。
echo.

rem 構成ファイルのテンプレートのパス
set TemplatePath=%~dp0configuration-template.xml
rem Tempフォルダに出力した構成ファイルののパス
set ConfigurationPath=%temp%\configuration.xml

rem 64ビット版を選択
set SourcePath=%~dp0Download_x64
set OfficeClientEdition=64

rem 既に構成ファイルがあれば削除
if exist %ConfigurationPath% del %ConfigurationPath%
rem テンプレートを読み込みパラメータを置き換えて
rem Tempフォルダに構成ファイルを出力する。
setlocal enabledelayedexpansion
for /f "delims=" %%a in (%TemplatePath%) do (
    set line0=%%a
    set line1=!line0:$SourcePath$=%SourcePath%!
    set line2=!line1:$OfficeClientEdition$=%OfficeClientEdition%!
    echo !line2!>>%ConfigurationPath%
)
endlocal

rem setup.exeを実行
start %~dp0setup.exe /configure %ConfigurationPath%
```
作成した2つのファイルとダウンロードしたインストール用データをDVDメディア等に書き込む。
- Download_x64
- Office_Setup.bat
- configuration-template.xml
- setup.exe

# オフラインインストールの実行
DVDメディア等に書き込んだ`Office_Setup.bat`を実行するだけ。
CSS要素の指定の仕方

x y{ ... }　　※xとyに半角スペースありxで指定した要素の中のy
xy{ ... }　 　※xとyに半角スペースなしxかつyの要素
x,y{ ... }　　※xとyにカンマありxおよびyの要素
x>y{ ... }　　※xとyに>ありxの要素直下にあるyの要素
JavaScript 基礎　

#実装する上での基礎知識

#####書き方は２通りある

①プラウザ上で検証から直接入力
②HTMLファイル内からスクリプトコードで囲んで呼び出す

```index.html
<body>
  <script>
  //javascriptの記述
　</script>
</body>
```
cssドロップダウンの表示・非表示

◆ドロップダウンリスト
クラス名
:hover でオンマウスを指定

/*メインメニュー*/
ul.globalnav a{
	color: white; /*メインメニューのデフォルトの色*/
	font-size: 0.8em;
	padding-top: 20px;
}
.globalnav li:hover > a{
	color: red; /*メインメニューをオンマウスした時に変わる色*/
}
/*サブメニュー*/
/*サブメニューのスタイル*/
ul.globalnav ul{ 
	list-style-type: none;
	background-color: blue; /*ドロップダウンしたときの背景の色*/
	display: none;　/*非表示*/
	margin:0px;
	padding:10px;
	position: absolute;
	z-index: 30;
}
/*サブメニューに出てくる文字の色*/
li.submenu a {
	color: white;
}
/*オンマウスした時に出るサブメニュー（リスト）*/
ul.globalnav li:hover ul{
	display: block;
	z-index: 30;
}
/*サブメニューのメニューにオンマウスした時の色*/
.submenu li:hover > a{
	color: yellow;
}
MacのAndroid StudioをCheck For UpdatesしたらStudio does not have write access toなんちゃらとなる人へ

# ずっと悩んでた
MacのAndroid StudioでCheck For Updatesしたら

**Studio does not have write access to /private/var/folders/XXXXXXXX**

みたいなのが表示されてUpdateできない事象に悩まされていました。
[こちらの記事](https://qiita.com/kskomori/items/f6f1e1d06837bdc088cf) を参考にchmodしてみましたが解決していませんでした。
仕方がないので、毎度新バージョンを別にインストールしてやり過ごしていました。
# 解決
[参考](https://stackoverflow.com/questions/44213677/android-studio-3-0-preview-studio-does-not-have-write-access)

こちらによると、Macのセキュリティによってランダムなパスが使われているので、Finderで固定パス（例えば/Applications）に移動すればいいよとのこと。
と言うわけでアプリケーションフォルダに移動したらUpdate出来るようになりました。

# 最後に
ダンロードしたフォルダでアプリを起動するのやめよう。
PHPのCountableインタフェースで配列以外をcountする

この記事は「[GameWith Advent Calendar 2019](https://qiita.com/advent-calendar/2019/gamewith)」の3日目の記事です。

## 概要
PHPの`count()`は、配列の個数を数えるときによく使う関数です。ただ実は配列以外も数えることができます。
それがタイトルにも書いた、「[Countableインタフェース](https://www.php.net/manual/ja/class.countable.php)」です。このインタフェースを実装したオブジェクトも`count()`することができます。意外と情報が少なそうだったのでまとめてみました。

## 使い方
`Countable`を実装したクラスに対して、`count()`メソッドを定義します。

```php
class MyCountable implements Countable
{
    private $num = 255;

    public function count()
    {
        return $this->num;
    }
}
```

`Countable`を実装したオブジェクトは次のように`count()`関数で数えることが可能で、結果は自分で定義した`count()`の結果を返すことができます。

```php
$counter = new MyCountable();
var_dump(count($counter));  // int(255)
```

## count可能かのチェック
`count()`可能かのチェックは、PHP7.3以降の場合は「[is_countable](https://www.php.net/manual/ja/function.is-countable.php)」で、配列に加えて`Countable`のオブジェクトもチェックすることができます。

```php
$counter = new MyCountable();
if (is_countable($counter)) {
    var_dump(count($counter));  // int(255)
}
```

PHP7.3未満の場合は少し手間ですが、`is_array()`と`instanceof`を併用してチェックするのが良いと思います。

```php
$counter = new MyCountable();
if (is_array($counter) || $counter instanceof Countable) {
    var_dump(count($counter));  // int(255)
}
```

## 注意点
次のように`int`以外の値を返すようにした場合、実行はできますが`int`にキャストされた結果が返ってきます。

```php

class MyCountable implements Countable
{
    private $num = 'test';

    public function count()
    {
        return $this->num;
    }
}

$counter = new MyCountable();
var_dump(count($counter));  // int(0)
```

## まとめ
`Countable`インタフェースはPHP5からありましたが、私も最近まで存在を知らず`is_countable()`関数の追加で初めて知り、今回紹介をしてみました。
もし「こんな風に使うと`Countable`は便利」ってのがあったら、ぜひ教えてください！
文字の装飾

◆文字のぼかし

text-shadow: 1px 2px 3px red;
　　　　　　　　横　縦　ぼかし　色

◆文字の境界線
stroke: #000000;　/*境界線の色*/
stroke-width: 3;　/*境界性の太さ*/
stroke-opacity: 0.5;　/*境界線の透明度*/
stroke-linecap: round;　/*線の端の表示の仕方（他にbutt/square）*/
stroke-linejoin: round;　/*線の頂点部分の表示の仕方（他にmiter/bevel）*/
GDAL windows visual C++ (2017) 環境の構築

GDALをvisual C++(2017)　windows10 x64で使うための環境構築です。

#ダウンロード
gdal
　http://download.osgeo.org/gdal/CURRENT/
　から、
　gdal302.zip
　をダウンロードして解凍

PROJ
　以下を参考にインストール
　https://proj.org/install.html#windows
　　インストーラをダウンロードしてインストールします

-----
#コンパイル
コマンドプロンプトから
`cd gdal302\gdal-3.0.2\
generate_vcxproj 15.0 64 gdal_vs2017`

を実行、次に

`nmake -f makefile.vc MSVC_VER=1910   PROJ_INCLUDE="-I C:\XXXX\OSGeo4W64\include"  PROJ_LIBRARY="C:\XXXX\OSGeo4W64\lib\proj_6_2.lib" WIN64=1`

　XXXXはPROJをインストールした場所

##### はまりポイント


1. PROJ_INCLUDEとPROJ_LIBRARYをつけないと通りませんでした
1. win64=1をつけないとリンカーエラーになります
1. PROJ_INCLUDEはディレクトリ指定で-Iが必要なのに PROJ_LIBRARYは直接ファイルを指定するのがポイント

#実行（テスト）
sqlite3.dllが必要でした。
　https://www.sqlite.org/download.html
　からsqlite-dll-win64-x64-3300100.zipをダウンロードします


テスト用サンプルは以下にあります。
　https://gdal.org/tutorials/raster_api_tut.html#
画像に文字を乗せる

画像に文字を乗せるには、画像のクラスのpositionを”relative”にする。
文字のクラスのpositionを"absolute"にし、位置を指定する。

.visual {
  position: relative;
  }

.visual p {
  position: absolute;
  width: 50%;
  transform: translate(-50%,-50%);　/*縦と横の文字のズレを修正
  top: 45%; /*画像のtopからの位置
  left: 50%; /*画像の左からの位置（右からにするには-50％とする）
  /*文字の装飾を指定する*/
  }
【Heroku】WindowsでHerokuを使ってPythonアプリをデプロイするメモ【Python】

#Herokuで無料でアプリを公開したい！
そんなときに見直すメモです。

#Herokuに登録・インストール
いつものメールアドレスとパスワードで登録します。
その次にここでHeroku CLIをインストール【https://devcenter.heroku.com/articles/heroku-cli#download-and-install 】
Windowsの64ビットをダウンロードして、実行するとインストーラーが開くので、そのままインストールする。

ここまで出来たら、ターミナルを開いて

```
heroku login
```
で、エンターキーを押す
すると、ウィンドウが開くので、『LOGIN』ボタンを押す。

それが完了したら、
```heroku create <アプリケーション名>```
今回は、testappxxx01として作ります。※ほかの人と被らない名前にしてください。

```
heroku create testappxxx01
```

そしたら、リモートで接続します。
```heroku git:remote -a <アプリケーション名>```
作業用ディレクトリに移動し、

```
git init
heroku git:remote -a testappxxx01
```

次に設定ファイルの```runtime.txt```と```requirements.txt```を作成する

```text:runtime.txt
python-3.7.3
```

```text:requirements.txt
Flask==1.0.2
```

ここまで出来たら、今度はソースコードを書きます。

```python:main.py
from flask import Flask
import os

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, Heroku"

if __name__ == "__main__":
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)
```

そして、アプリを起動するProcfileファイルを作成します。
ファイル保存の際には拡張子を付けず、Procfileと先頭のPを大文字にして保存してください

```text:Procfile
web: python main.py
```
ここまで出来たらあともう一歩！！
ディレクトリの構成は、

```
├── 作業ディレクトリ
    ├── main.py
    ├── runtime.txt
    ├── requirements.txt
 　 └── Procfile
```

あとは、魔法の4コマンドを打つだけです。

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

#デプロイの確認
```https://testappxxx01.herokuapp.com/ ```
つまり、https://アプリ名.herokuapp.com/　で確認できます。
お疲れ様でした。
AndroidStudioのProject Viewで、パッケージをまとめずに全階層表示する

#環境
Android Studio 3.5

#連結されたパッケージ表示
プロジェクト内にファイルやパッケージを追加する時、AndroidStudioのProject Viewから直接追加している人も多いかと思います。
この時、設定によっては以下のようにパッケージが連結されて表示されています。

![スクリーンショット 2019-12-03 9.51.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235269/a9434c05-44e8-d8c8-3aa5-7dcf2df5761a.png)

model直下にrequestしかないため、個別に表示する必要がないと判断されていますね。

#パッケージを全階層表示
これだと、modelの下に`response`というpackageを追加したい時に少し面倒です。
そんな時はこのようにして全ての階層を表示させましょう。

Projectから
![スクリーンショット 2019-12-03 9.51.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235269/01880d98-d500-840a-9469-4af4528e4fdc.png)


メニューを開いて、`Compact Middle Packages` のチェックを外す
![スクリーンショット 2019-12-03 10.02.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235269/a15748d9-2805-954b-a55d-51779696149e.png)

階層ごとに表示されるようになりました
![スクリーンショット 2019-12-03 10.04.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235269/3c70a9e9-64a5-4954-07f3-4e1d081057d7.png)
【Mac】Eclipse.app は壊れている？


EclipseをApplicationsから起動しようとしたら、
「Eclipse.app は壊れているため開けません。ゴミ箱に入れる必要があります。」
というエラーメッセージが表示され、起動することができなくなってしまった場合、

次のコマンドで拡張ファイル属性(Extended Attributes;EA)を除去することで起動可能。

```shell-session
xattr -d com.apple.quarantine Eclipse.app/
```

なお、拡張ファイル属性(Extended Attributes;EA)は次のコマンドを実行することで確認可能。

```shell-session
xattr Eclipse.app/
```


###※一番簡単な方法は、Ctrlキーを押しながらクリック！！
htmlでファイルを指定する

一つ上の階層を指定するには　”../”　を使う。

・1つ上の階層にある画像ファイルを指定
“../画像名.png”

※上に上がる毎に　../../

・一つ上の階層の別フォルダの中にあるファイルを指定

”../フォルダ名/画像名.png”
テスト自動化(E2Eテスト)の導入と運用

初めまして。
モチベーションクラウドシリーズのアドベントカレンダー3日目を担当する坂本です。

テスト自動化を担当していますので、テスト自動化の一つである**E2Eテスト**について話したいと思います。
今回は、社内外でよく質問されることをピックアップします。
技術的なことは、他の記事を参考してもらったほうがいいので、
ここでは、**E2Eテスト**の導入と運用についてQA形式で説明させていただきます！

# 自動化に向いているテストはなに？
　**リグレッションテスト**です。
　自動テストの役割は**「いつも通り動作している」**ことを確認することです。
　逆に向いていないテストは、新機能に対するテストです。
　新機能及び改修された部品のテストは、
　**「インシデントが発生すること」**を前提にテストします。
　そのようなテストは、むしろ、**手動テスト**の方が向いています。　

# どこから自動化すればいい？
　ビジネスへの影響度が高く、仕様変更頻度があまりないところから自動化するのが理想的です。

ビジネスシナリオ毎に優先度を数値化するのであれば、
個人的な見解が大分はいっっていますが、各要素ごとにレベル分け、以下のような式で考えています。

　`ビジネスリスク + 影響範囲 + 使用頻度 - 仕様変更頻度 - 回避策有無`
 
- ビジネスリスク
 - 生命の危機 ＞ 売上・信用の損失 ＞ 機会の損失 ＞ 時間の浪費
- 影響範囲
 - 対象ユーザ数・利用ブラウザ
- 使用頻度
 - プレビュー数・日次・週次・月次・年次
- 仕様変更頻度
 - 枯れている仕様か・改善が求められている機能か
- 回避策有無
 - 機能が使えない状態でも目的の作業ができるか

# テスト自動化した機能が改修された場合どうするの？
　まず、手動テストで改修された機能が仕様通りか確認します。
　そのあとにテストスクリプトをそのまま実行し、
　エラーになった部分が想定通りか確認後、新しい仕様に合わせて
　テストスクリプトを変更します。

# テスト自動化ってどうやって進めるの？
　じつは手動テストと流れはあまり変わらないです。

|自動テスト|手動テスト|
|:--------:|:-------:|
|テスト計画|テスト計画|
|↓|↓|
|スクリプト作成|テスト設計|
|↓|↓|
|スクリプトレビュー|設計レビュー|
|↓|↓|
|テストデータ準備|テストデータ準備|
|↓|↓|
|テスト実行|テスト実行|
|↓|↓|
|テスト結果報告|テスト結果報告|

こう並べると自動も手動の初期コストかわらないように見えますが、
自動は繰り返し実行できるテストデータを準備する必要があるため、
テストデータの検討が手動テストよりシビアある事と、
テスト実行を安定化させる作業があるので、その分工数がかかります。

# テスト実行方法ってどんなのがあるの？

- フルテスト実行
　主にリリース直前(手動テスト完了後)で行うテストで、
　**「問題が発生しない」**ことを前提に行います。
　全てのテストケースを実行します。
  テストケースが増えると、全て実行するのに5時間とかかかる場合があります。
　その場合は夜間実行や、並列テストで実行します。

- ビルド＆テスト(部分実行)
　開発者が修正する度に実行します。
　**「問題が発生する」**ことを前提に行います。
　スプリントコードディングの為にもテスト実行時間は３０分以内になるように
　ある程度、仕様を網羅できるテストケースに絞ります。

- 並列テスト
　テストケースの総テスト時間が増えた時に検討します。
　テストを実行するノード(端末)を増やし、テストケースを分散することで、
　テスト実行にかかる所要時間を短縮する方法です。

- 本番環境テスト
　本番環境に対してのテストです。
　インフラ起因の障害を検知するための正常動作確認(負荷確認)や、
　サードパティのシステムの影響を受けやすい場合に行います。

# テスト自動化でやるUIテストは何をするの？
　1. 操作が期待通り動くこと
　2. レイアウトが崩れていないこと
　3. 重要な値の表示に誤りがないこと
　4. 入力したデータが正しく保存されたこと
　5. 過去のインシデントが再発していないこと
　上記以外のテストを実施したい場合、UIテストよりAPIテストや、JUNITの関数テストの方が適切です。
　
# 最後に
どうでしょうか、これでテスト自動化に対して、少しでも理解を深めていただけたなら幸いです。
テスト自動化は、人では困難テストも難なくこなして、開発者に平穏・安定を与える唯一のツールなので、どんどん使ってみてください！
Adsenseから報酬を受ける手続きを行う

#概要

報酬が8000円を超えるとAdsenseから受け取り手続きの連絡が来る。
その手順をメモとして残しておく。
初回の住所確認にはかなり時間を要するが、支払い手続きは数日で完了する。

#手続き

##前置き

基本的には公式のヘルプセンターの案内通りになる。
https://support.google.com/adsense/answer/1709858?hl=ja

私の場合、「税務情報を提供」、「本人確認をする」はなかった。
「お支払い方法を選択する」についても銀行口座一択だったはず。


##通知が来る

![報酬受け取りの通知.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310578/9610a320-62a5-4fe1-d7e5-38de63e43195.png)

通知が来るので、これが来たら堂々とトロフィーを受け取るように手続きしよう:wink:
操作ボタンを押下する。

##手続き開始

![報酬の受け取り手続き1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310578/521bd5fe-ad7b-5187-55d7-a8230c406a9c.png)

更新ボタンをクリック。

![報酬の受け取り手続き2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310578/b44c2e64-2ba3-753f-87a6-faa4a00cbff7.png)

お支払方法を追加をクリック。

![口座登録.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310578/f94b2ca6-8591-30e3-42d8-f15f8736a019.png)

ちょっと迷ったのが銀行口座の名義。
キャッシュカード見るとローマ字表記でカタカナでもないので迷う。
結果としては姓 名の順で入力したら問題なかった。

後述するが時間はそんなにかからないため、メインのお支払い方法に設定はチェックが付いたままの方がいいはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310578/e3ba0ecd-2577-d4d9-226a-96f852947c4d.png)

![銀行口座の確認待ち.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310578/1d17c474-371d-4e93-8848-17fab3b62504.png)


Adsenseに登録しているメールにメインの支払い変更と、「2～3 営業日以内に Google から銀行口座に少額の入金（テスト デポジット）がありますので、その金額を Google AdSense に入力してください。」と来るので、テストデポジットがあったらすぐ登録してしまおう。

デポジットの入金があったらお支払を選んで、今すぐ確認ボタンをクリックする。

![デポジット入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310578/ed4fb612-872a-321f-72d5-cc3755aa3b22.png)

そしてダイアログにデポジットの金額を正確に選んで確認ボタンをクリック。

正しい金額を選択していれば確認完了:relaxed:

![口座確認完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310578/a86c1c40-a95c-e53f-c601-916d9f797588.png)

速攻で振り込まれて完了。

## まとめ

まとめるようなことではないが、時系列で並べておく。
土曜日の手続きだったためこれだけの時間を要したが、銀行が営業している平日なら更に時間はかからないと思われる。

11/30(土) 銀行口座設定まで完了
12/02(月) 銀行口座にデポジットの入金あり（ほどなくして確認処理実施）
12/02(月) Googleから銀行確認完了のメール
12/02(月) Googleから振込完了のメール
12/03(火) 口座に振り込まれたことを確認

ちなみに、私は身に覚えがないが、11/29より広告配信の制限（ペナルティ）をうけており、その中でも支払いの手続きは問題なく行えたことを付け加えておく:sweat_smile:
（手続することで悪いことをしたと認めたと誤解されるのが怖かったが没収よりまし:joy:）
BANされると報酬は没収のはずなので、早めに手続きしておくことをお勧めします。
プラットフォーマーが黒だといえば、一方的に黒認定されて終了してしまうのでね:persevere:
Microsoft Word でルビを一括非表示・表示

条件
ルビのフォントサイズが決まったポイント数であること
単にフォントサイズでサーチして文字色を白にしたり黒にしたりするだけです。

ルビのついた文書があります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f0e9298b-0a95-78c8-6fd3-78b8d087bcfc.png)
これをルビを一括で非表示にしたり表示したりしてみます。

Alt+F9でフィールドコード表示にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/72834f71-0391-fcdb-91e2-716d6c40f337.png)


ルビの部分が8ptで作成した文書なので、それを一括で文字色白に変更します

Ctrl+Hで検索置換ダイアログを表示します。

念のために
「検索する文字列」で「書式の削除」
「検索後の文字列」で「書式の削除」
をしておきます
「検索する文字列」で「書式」-「フォント」-「サイズ」を10.5、
「検索後の文字列」で「書式」-「フォント」-「フォントの色」で白を選び、
てとして、「すべて置換」とします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/b4848692-1744-6cbd-53b9-2615f5024416.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/0656af32-282d-8755-5ba0-dae164497348.png)
非表示にできました。

これで、
「検索する文字列」で「書式」-「フォント」-「サイズ」を10.5、
「検索後の文字列」で「書式」-「フォント」-「フォントの色」で黒を選ぶと表示されます。

色を変えることも簡単です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/fb904543-054a-e809-b2c9-0b4071465d9d.png)

これは赤にした例。

おまけ
青空文庫からコピペするとルビが大きくなったのでまとめて小さくしようとしたのですが・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/8b14cbf9-97c2-ee4c-0cb4-f7b4b16eaece.png)

いろいろやりましたがうまくいきませんでした。
Wordは大変です・・・