OmniAICreator/Qiita-1.07M huggingface dataset:
使用したクーポンコードを指定したエンドポイントにポストバックする

広告の成果計測等のために、使用されたクーポンコード等の情報を含めて計測システムのエンドポイントへポストバックする必要がある際の成果通知の仕方です。

今回はHttpURLConnectionを利用しました。

# security configの設定とmanifestの設定
設定するポストバック先のURLがhttps://〜であればこの設定は不要です。
Android 9(Pie)では暗号化されていない通信はできない、つまりhttp://ではじまるURLへの通信はデフォルトでは不可能です。
※設定するURLがhttps://で始まればこの手順は必要ありません。
## security config設定

app/xmlディレクトリに以下のファイルを作成します。

```network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">XXXX.net</domain>
    </domain-config>
</network-security-config>
```

指定したドメインに暗号化されていない通信(http://)を許可(cleartextTrafficPremittedをtrue)しています。
## manifestの設定
その後AndroidManifestのapplicationタグの属性部分に

```
android:networkSecurityConfig="@xml/network_security_config
```

を追加します。
(例)

```AndroidManifest.xml
<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:networkSecurityConfig="@xml/network_security_config">
```

# ポストバック
ポストバックを発生させたいイベント等が発生したときに以下のメソッドを実行します。
クーポンコード等、イベント毎に変わる可能性があるユーザ入力値は引数として受け取る設定をしています。

```Activity.java
public void postBack(final String cp){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    URL url = new URL("https:/XXXX.net?coupon="+cp);
                    HttpURLConnection con = (HttpURLConnection)url.openConnection();
                    String str = InputStreamToString(con.getInputStream());
                    Log.d("HTTP",str);
                }catch(Exception e){
                    System.out.println(e);
                }
            }
        }).start();
    }

    static String InputStreamToString(InputStream is) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
        String line;
        while( (line=br.readLine()) != null ){
            sb.append(line);
        }
        br.close();
        return sb.toString();
    }
```

### 参考
[HttpURLConnection (Java Platform SE 8)](https://docs.oracle.com/javase/jp/8/docs/api/java/net/HttpURLConnection.html)
【Github】プルリクエストを出した後に ドラフトに変更する

# はじめに

間違えて普通のプルリクエストをだしたときに、（当時のバージョンでは）プルリクエストからドラフトに変更できないよって記事をみて焦ったので。。

[GitHub公式ページ（日本語）はこちら>>](https://docs.github.com/ja/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests/changing-the-stage-of-a-pull-request)

# 本題

まず、プルリクエストをだしました。
Openになっていて、マージもできる状態なので普通のプルリクエストですね。。
あれ。。。右の方に。。。。

![2020-11-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534703/e34ecabd-60a1-fa27-f933-b8b5ad1ed4fb.png)

ありました。まだ途中かい？ドラフトにするか！みたいなことが書いてありますね。
Convert to draft をクリックしました。

![2020-11-13 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534703/ec372083-e5f0-c082-306d-d8d93a252215.png)


Convert to draft をクリック

![2020-11-13 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534703/1ebf2057-7119-5457-fe71-321e51ceae6b.png)

よかったです。Draftになってます。

# おまけ

おまけというほどでもないですが。。。
draft <=> open は何度でもできるようです。

![2020-11-13 (2)-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534703/a450fbc5-a39c-962f-388c-d46a07995dea.png)


![2020-11-13 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534703/31fee146-9b25-9a11-ec6a-4262f93e11f7.png)
ハッシュ・配列の新規追加方法

#はじめに
　最近はRailsフレームワークを使っているので、ついつい忘れていた学習初期の内容を改めてまとめておく。

##ハッシュに新たにバリューとキーを追加する

```ruby
hash = {}

hash[:name] = "やました" #ハッシュにないキーは新たに追加
hash[:name] = "かねむら" #すでにあるキーはバリューが更新される

puts hash[:name] #出力するときは、角括弧にシンボルでキー名
hash = {name: "かねむら"} #最終的なハッシュはこういう状態
```
 
##配列

```ruby
arrays = []
hash = {name: "かねむら"}

arrays << hash #配列にハッシュの形のまま追加する
puts arrays[0][:name]
#=>"かねむら"
puts arrays
#=>{:name=>"かねむら"}
```

##最後に
　Railsを使っていると中でハッシュを使っているんだろうなぁと思うことはあったが、Rubyでの扱いを完全に忘れていた。
周辺機器をRaspberryPiに一度も接続しません

#0.今回やること

RaspberryPiをサーバーとして使う場合など
一度も周辺機器を接続せずに設定をしたい時があるかと思います。
そんな時にこの記事が役に立ちます。

#1.準備

まず、ラズパイで使えるOSをダウンロードして
SDカードに書き込んでください。
このやり方は調べれば多くの記事が出てくるので今回は割愛します。

#2.SSHを有効にする

エクスプローラを起動してOSを書き込んだSDカードを素直に開いてください。

開いたら適当な場所を右クリックし新規作成でテキストファイルを作成してくだい。

そしたらファイル名を『ssh』にします。

※拡張子「.txt」は要りません。
　もしファイル名を変更する際に「.txt」が表示されていない場合は[ここのサイト](https://www.pc-koubou.jp/magazine/36291)を参考にして
　拡張子が表示されるように設定してください。

#3.Wi-Fiを設定する

サーバー用途で使う場合、LANで接続する場合が多いと思いますが
Wi-Fiも設定できるので記載しておきす。

エクスプローラーを起動してOSを書き込んだSDカードを素直に開いてください。

開いたら適当な場所を右クリックし新規作成でテキストファイルを作成してください。

そしたらファイル名を『wpa_supplicant.conf.txt』にします。

作成したファイルをメモ帳など開いて記入例を参考に設定してください。

これはSSIDが「wi-fi0000」パスワードが「abcd1234」の場合の記入例です。

```wpa_supplicant.conf.txt

country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="wi-fi0000"
    psk="abcd1234"
}

```

保存してください。

保存したテキストファイルを右クリックしてファイル名から「.txt」を消して拡張子を『.conf』になるようにしてください。


#4.RaspberryPiにSSHで接続

SDカードをRaspberryPiに挿して起動してください。

SSHを接続するパソコン（クライアント）のコマンドプロントを開き、いつも通りにSSHで接続し完了です。
Rubyのirb(interactive ruby)を実行する方法


## irb とは？

irb は interactive ruby の略です。
ruby の式を標準入力から簡単に入力/実行するためのツールです。
by 公式

## irb で出来ること

ターミナルから irb というコマンドを使うと、ターミナル上で ruby を一行ずつ実行することができます。
簡単に ruby を試したいときには非常に有力なツールです。

いちいちファイルを作成する必要もないので、ちょっとした ruby コマンドを実行したいときには非常に便利です。

## irb のインストール

gem で簡単にインストールできます。

```
$ gem install irb
Fetching irb-1.2.7.gem
Fetching io-console-0.5.6.gem
Fetching reline-0.1.8.gem
Building native extensions. This could take a while...
Successfully installed io-console-0.5.6
Successfully installed reline-0.1.8
Successfully installed irb-1.2.7
Parsing documentation for io-console-0.5.6
Installing ri documentation for io-console-0.5.6
Parsing documentation for reline-0.1.8
Installing ri documentation for reline-0.1.8
Parsing documentation for irb-1.2.7
Installing ri documentation for irb-1.2.7
Done installing documentation for io-console, reline, irb after 2 seconds
3 gems installed
```

## irb を試してみる

インストールした後は irb と入力するだけです。

```
$ irb
irb(main):001:0>
```

例えば puts コマンドを使って Hello, world と表示させてみましょう。

```
irb(main):001:0> puts "Hello, world!"
Hello, world!
=> nil
irb(main):002:0>
```

簡単ですね。ruby ファイルを作って ruby コマンドから ruby を実行するよりも楽に試せます。

## irb を終了させるとき

exit と入力した Enter を押すと通常のターミナルに戻ります。

```
irb(main):001:0> exit
$
```
【初心者でもわかる】文章の最初や最後に、文字や記号を入れる方法（New とか おすすめ！とか）

# どうも7noteです。疑似要素を使って、文章の最初や最後に一括で文字を入れる方法。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/addmark/
Win10-HomeでDockerしたらVirtualBoxが挙動不審になった件

# Windows10-Home にて Docker と VirtualBox を共存させるために Hyper-V を無効化しました。

ここに経過と手順を残します。

---
## 要点

・Docker を使うと Hyper-V が有効になり VirtualBox が正常に動かなくなる（ことがある）

・Win10-Home であっても Hyper-V は使える。
---- ただし「Windowsの機能」からは設定変更できない
---- コマンドラインから設定できる

・本来は VirtualBox の 6 以降は Hyper-V と共存できるというはなしもある。

・（Hyper-Vの切り替えはBIOS/UEFIには無いみたい）

---

## 環境
Win10-Home
VirtualBox 6.1

※Win10 上には Linuxシェル(WSL2)導入済み
紛らわしいですがVirtualBoxとWindows Subsystem for Linux (たぶんWSL2です) 
両方使ってる環境


他のバージョンは割愛

---

## 症状と経過

VirtualBoxでUbuntu20.04を使ってました。

その後、新たにホストOS側（つまりWin10のほう）に Docker を導入しました。

→　VirtualBox 上の Ubuntu20.04 の挙動がおかしくなる。
　（端末でmakeとか操作するとOSが落ちるとかそんなん。詳しくはwasureta）


「そういえば『Docker いれると Hyper-V が有効化される』と聞いた覚えが......」

とにかくHyper-Vを無効化　→　VirtualBoxのUbuntu20.04は再び安定しましたとさ。


---

## 注意事項

「Win10-Home では Hyper-V は使えない（？）」という誤情報（？）が見つかります。

おそらく WSL との兼ね合いから Win10-Home でも Hyper-V が使えるように　後から変わったのだと思います。
（※WSLを有効化したからHyper-Vが使えるようになったという可能性もある。）

ただし、2020年10月現在、GUI からは Hyper-V の設定できませんでした。

↓ Windows10 Professional の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469875/3791d520-4b0f-6d50-b57d-4808c50cd762.png)

↑ このように Win10-Pro では Hyper-V チェックボックスが出現しますが、 Win10-Home では出現しないようです。

したがってコマンドラインから設定する必要がある。

---

## Hyper-V を off るコマンド


```:PowerShell(管理者実行)
bcdedit /set hypervisorlaunchtype off
```

再起動

---

## UEFI に Hyper-V 設定欄なかったっけ
昔はBIOSとかUEFIで有効/無効を切り替えてた気がする。勘違いでしょうか。
【SystemVerilog】designでbindを使ってみよう

# はじめに

皆さん、SystemVerilog使ってますか？

VerilogからVerilog2001、SystemVerilogと言語仕様は色々と拡張されて使いやすくなってきています。
しかしながらLRMを読んだだけでは実際にどう使えばお得なのか分からないものも多いですよね。

そこで今回はbindを合成に使って得をしてみようという試みです。


# サンプルコード

FPGAのトップモジュールとしてtopがあったとします。

```verilog:top.sv
module top (
	input  logic        CLK        , // 
	input  logic        RESET      , // 
	input  logic [7:0]  X          , // 
	input  logic [7:0]  Y          , // 
	output logic [8:0]  Q          , // 
	output logic [7:0]  DEBUG        // 
);
	add u_add (
		.CLK   (CLK   ) ,
		.RESET (RESET ) ,
		.A     (X     ) ,
		.B     (Y     ) ,
		.Q     (Q     )
	);
endmodule
```
DEBUG端子はその名の通りデバッグ用です。動作確認用のLEDだったり、オシロ・ロジアナ等で見れるようにピンヘッダに出したりしますね。

Quartusで合成後、RTL Viewerで確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148552/0d307f61-e296-50eb-a4aa-129f703ff110.png)

デバッグ用の回路をbindで実装してみましょう。
bindはモジュールを追加するイメージになります。
追加するデバッグ用の記述をtop_debugというモジュールで記述しました。

```verilog:debug.sv
module top_debug (
	input  logic        CLK        , // 
	input  logic        RESET      , // 
	input  logic [8:0]  Q_IN       , // 
	output logic        PTY_ODD      // 
);

	logic r_pty_odd;
	
	always_ff @(posedge CLK or posedge RESET) begin
		if(RESET)begin
			r_pty_odd <= '0;
		end else begin
			r_pty_odd <= ^Q_IN;
		end
	end
	assign PTY_ODD = r_pty_odd;
endmodule

bind top
	top_debug u_debug (
		.CLK     (CLK      ),
		.RESET   (RESET    ),
		.Q_IN    (Q        ),
		.PTY_ODD (DEBUG[0] )
	);
```

topモジュールにtop_debugモジュールをu_debugという名前でインスタンスします。
信号名などはtopモジュール内の信号が使用できます。
bind記述はmoduleブロックの外側でも記述が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148552/4c08b5bf-ef3b-1263-d77f-8d115736cefa.png)

ちゃんと追加されました！
top.svには一切手を加えておらずプロジェクトにdebug.svを追加しただけでデバッグ用回路が追加できました。

# 問題点

動くには動きますが…という話。

## 回路の追加しかできない

bindで変更や削除はできません。これで一番困るのは、bindで生成した信号出力を繋ぐ先のポートがあらかじめ必要という点です。
本来想定された使い方とは異なるため仕方ありませんが、なかなか厳しい制約です。せめてポートの追加が出来れば…
ドットによる下位階層の参照はVivadoなら可能ですがQuartusではダメ。

## ツールが限られる

「bindを合成で？できらぁ！」と言ったものの、実際はなんでもいけるわけではないのでした。

|ツール      　　　　　　|バージョン|合成|備考|
|:---------------------|:-----|:-:|:--|
|Quartus Prime Standard | 18.1 | × | bind記述がsyntax errorとなる|
|Quartus Prime Pro      | 19.2 | 〇 | 今回試したのはこちら |
|Vivado                 | 2018.3.1 | × | bind記述は合成の対象外となる |

Quartus Prime Standardは合成エンジンが完全に未対応でした。バージョンが新しければいけるかもしれませんが、望みは薄そう。
Prime ProはStratix10などの特定デバイス用のため使用シーンは限られてくる。
Vivadoは合成自体通るので認識はしているものの、そのうえで検証用記述とみなしてか全無視。オプション等で何かできるかもしれませんが、こちらも望み薄か。

microsemiとLatticeは試していませんが、ダメそう(syntax error)な予感がしますね。
もし試した方がいらっしゃったらコメントしていただけると有難いです。

# 結論

「できらぁ！」というか、「できるだけだぁ！」が正解ですね。
たまたま Quartus Prime Pro 19.2 で出来たので調子に乗って記事を書いたものの、他のバージョンを試したらこのざまです。

bindを使ったことがある人は恐らくほぼ全員が検証目的でしょう。
具体的に言えば「アサーション記述やファンクションカバレッジ記述をモジュールにくっつける」ですよね。

bindを合成で使用するのは人類にはまだ早すぎるようです。
rbenvを用いて任意バージョンのRubyの環境構築を行う方法


この記事では rbenv を用いて任意のバージョンの Ruby 環境を構築する方法を紹介します。

## rbenv とは？

rbenv **とはバージョンの異なる ruby をまとめて管理するツール**のことです。

rbenv を利用することで異なるバージョンの ruby を一元管理することができ、
さらに任意のバージョンにいつでも切り替えられるようになるため
任意のバージョンで Ruby を使うことができます。

例えば自己学習を進めているときに、例えばある教材では ruby 2.5.2 を使うといっているのに
別な教材では ruby 2.7.0 を使うように指示が出ていると、バージョン間の差異によりエラーが発生して詰まることがあります。

rbenv を使うことで、いつでも好きなバージョンを使うことが出来るので
少なくともバージョン間の差異によるエラーは抑制することができます。

## rbenv のセットアップ

それでは実際に rbenv をセットアップしていきましょう。

### rbenv をインストール

rbenv は HomeBrew でインストールできます。
以下のコマンドを叩きましょう。

```
$ brew install rbenv
```

### rbenv の初期設定

rbenv のインストールが終わったら初期設定を行うため rbenv init を入力します。

```
$ rbenv init
```

入力し Enter を押すと以下のように指示が表示されるので、指示に従っていきます。
ここでは ~/.bash_profile に eval ~ という行を追加するようにいっています。

```
$ rbenv init
# Load rbenv automatically by appending
# the following to ~/.bash_profile:

eval "$(rbenv init -)"
```

vi コマンドで .bash_profile を開き、末尾に eval ~ を追加しましょう。
※vim などの操作に慣れていない場合は、隠しファイルとはなりますが直接 .bash_profile を編集してもよいです。

```
$ vi ~/.bash_profile
```

保存し終わったら一度ターミナルを終了し、再度ターミナルを開きます。
これで rbenv をどこからでも使えるようになりました。

### rbenv のテスト

その後、rbenv がちゃんと機能しているかをチェックするために以下のコマンドを実行します。
(rbenv の公式サイトに紹介されています）)

```
$ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash
Checking for `rbenv' in PATH: /usr/local/bin/rbenv
Checking for rbenv shims in PATH: OK
Checking `rbenv install' support: /usr/local/bin/rbenv-install (ruby-build 20170523)
Counting installed Ruby versions: none
  There aren't any Ruby versions installed under `~/.rbenv/versions'.
  You can install Ruby versions like so: rbenv install 2.2.4
Checking RubyGems settings: OK
Auditing installed plugins: OK
```

上記の例のように、すべて OK と表示されていれば rbenv の準備は完了です。

## Ruby のセットアップ

rbenv で Ruby のバージョン管理をできるようになったので、Ruby をインストールしていきます。

### rbenv で Ruby をインストール

rbenv install xxxx を入力して Ruby をインストールします。
今回は執筆時点で最新安定バージョンである ruby 2.7.0 をインストールします。

```
$ rbenv install 2.7.0
```

### インストールされている Ruby の一覧を確認

インストール済みのバージョンを確認するには rbenv version を入力します。

```
$ rbenv versions
  system
* 2.5.1 (set by /Users/xxxxxx/.rbenv/version)
  2.6.3
  2.7.0
```

- がついているバージョンが、現在つかっている ruby のバージョンです。
  つまり 2.7.0 はインストールされただけであり、まだ切り替わっていないことを表しています。
  ※上記の例は既に rbenv で他のバージョンをインストールしている時のものです

### バージョンの切り替え

インストールした 2.7.0 に切り替えるためには rbenv global コマンドを使います。

```
$ rbenv global 2.7.0
```

ruby -v を入力し、どの Ruby バージョンを使っているかを確認しましょう。

```
$ ruby -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-darwin19]
```

2.7.0 と表示されているので、無事に ruby 2.7.0 をインストールし、環境を構築することができました。
現場で使えるQPS制御(Rate Limit) 1秒間にn回の実行に制限する

1秒間に10回実行したい場合の例

https://godoc.org/golang.org/x/time/rate を使う

```
func main() {
	limiter := rate.NewLimiter(rate.Limit(10), 1)
	ctx := context.Background()

	for i := 0; i < 1000; i++ {
		if err := limiter.Wait(ctx); err != nil {
			fmt.Println(err)
		}
		fmt.Println(i)
	}
}
```

https://play.golang.org/p/ByAz9VCkGFk

# 参考

https://qiita.com/lufia/items/29bf1aeb0a0fe69d16f0
https://blog.lufia.org/entry/2016/08/28/000000
【A-Frame】イベントをトリガーにしてanimationをスタートさせる【startEvents / emit】

# やること
WebVRを簡単に実装する **A-Frame** を使った開発で、
animationのスタートに **トリガー** を持たせたいときの方法をまとめます。

# 実装
## 0. a-sceneを用意
ベースの部分はA-FrameのIntroductionをご参照ください。
https://aframe.io/docs/1.0.0/introduction/

## 1. animationさせたいオブジェクトを用意
```index.html
<a-scene vr-mode-ui="enabled: false">
  <a-sky color="skyblue"></a-sky>
  <a-box
    id="box"
    position="0 0 -5"
    color="white"
    animation="property: rotation; from: 0 0 0; to: 0 360 360; dur: 3000; loop: true; easing: linear;"
  ></a-box>
  <a-entity camera></a-entity>
</a-scene>
```

今回は白いboxを用意して、これを回転させるanimationを付けます。

![スクリーンショット 2020-11-13 19.36.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306452/9f1330fb-069b-9cb8-92f4-ab407c58a24a.png)

## 2. animationにstartEventsを追加

animationプロパティの中に`startEvents`を追加します。

```index.html
animation="property: rotation; from: 0 0 0; to: 0 360 360; dur: 3000; loop: true; easing: linear; startEvents: btnPush"
```

一番後ろの `startEvents: btnPush` の部分ですね。
イベント名（うしろ部分）は任意のもので大丈夫ですが、今回はボタンpushをトリガーとするため「btnPush」とします。

ちなみにこのstartEventsを入れるとanimationが勝手に再生されなくなります。

## 3. トリガーを用意
今回はボタンUIを押した時にanimationをスタートさせるようにするため、ボタンを用意します。

![スクリーンショット 2020-11-13 19.38.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306452/853eb96d-225e-587d-be96-6176c9f2aa44.png)

body内に🍰のボタンを用意しました。


```index.html
<button id="btn" class="btn">🍰</button>
```

併せてJS側でボタンのクリックイベントを用意します。

```index.js
const btn = document.getElementById("btn");
btn.addEventListener("click", () => {
  console.log("click!");
});
```

## 4. JSでイベントを記述
以下のようにanimationのついたオブジェクトに対して、`.emit("イベント名")`とすることで
任意のタイミングでanimationをスタートさせることができます。

```index.js
const box = document.getElementById("box");
const btn = document.getElementById("btn");
btn.addEventListener("click", () => {
  box.emit("btnPush");
});
```

`box.emit("btnPush");`の部分です。

これでボタンを押した時にboxのanimationをスタートすることができました。

![giphy.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306452/ff7b3580-37e6-af3d-cd8f-d9f2c176c673.gif)


あと一時停止するイベント `pauseEvents` もあるようなのでまた気が向いたらその辺も追記します。

# ドキュメント
A-Frame - animation
https://aframe.io/docs/1.0.0/components/animation.html#sidebar

# 動作環境
PC chrome
A-Frame v1.0.4

# 余談
A-Frameの古いバージョンでは `startsEvents` ではなく `begin` という名称でした。
最新のバージョンでbeginが動かない！
古いバージョンでstartsEventsが動かない！
というときは名称を変えるかバージョンを変えるかしてお試しください。
CIFilterのblurぼかしで画像を小さく縮ませない方法

##画像が縮む問題
CIFilterのCIGaussianBlurでCIImageをぼかすと、画像がShrinkしてしまう。

**[画像]　左：オリジナル　右：ぼかし**
![オリジナル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/263ae927-fb0d-b8b9-f6b7-7c0c46f07738.png)　![チヂミ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/29b7f0a0-4676-bd21-b22a-099cc33b6292.png)



```swift
let blurredImage = CIFilter(name: "CIGaussianBlur", parameters: [kCIInputImageKey:originalCIImage,
                                                                 kCIInputRadiusKey:50])?.outputImage?
```

CGImageを操作したり、AccelerateやMetalPerformanceShader、OpenCVのフィルターを使うと元と同じサイズのぼかし画像が得られるけれど、メモリ使用が大きい。
CoreImageのなかで完結すると、何枚ぼかしても数MBしかメモリを使わない。

##方法

```swift
let cropSize = CGRect(x: 0, y: 0, width: originalCIImage.extent.width * 0.999, height: originalCIImage.extent.height * 0.999)
let blured = CIFilter(name: "CIGaussianBlur", parameters: [kCIInputImageKey:originalCIImage,
                                                           kCIInputRadiusKey:50])?.outputImage?.cropped(to: cropSize).resize(as: originalCIImage.extent.size)
```
**[画像]調整結果**
![調整.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/e2809262-a813-9a10-f825-f382cf1e782a.png)

Cropすると画像サイズに合わせてくれます。

リサイズメソッドはこちら↓

```swift
extension CIImage {
    func resize(as size: CGSize) -> CIImage {
        let selfSize = extent.size
        let transform = CGAffineTransform(scaleX: size.width / selfSize.width, y: size.height / selfSize.height)
        return transformed(by: transform)
    }
}
```

🐣
****
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
Array.from


###HTMLCollectionで配列系メソッドは使えないらしい

最近JSに触れる機会があるので、備忘録がてら。

```
const fields = document.getElementsByClassName(
    'elements'
  );
```

上記のように、**getElementsByClassName**で取得できるHTMLCollectionは、配列系のメソッドを利用できないらしい。


そのため、**Array from**を使って配列に変換
elements = Array.from(elements)

###サンプル
配列系のメソッド今回の場合はforEachを使った実例。


```
const fields = document.getElementsByClassName(
    'elements'
  );
Array.from(elements).forEach((element) => {
    const teikies = field.getElementsByClassName(
      '
    );
    Array.from(teikies).forEach((teiki) => {
      link.addEventListener('click', () => {
        const inputs = field.getElementsByTagName('input');
        Array.from(inputs).forEach((input) => {
          const type = input.getAttribute('type');
          const masked = 'icoca';
          const unmasked = 'suica';
          if (type === 'password') {
            input.setAttribute('type', 'text');
            field.classList.remove(icoca);
            field.classList.add(suica);
          } else {
            input.setAttribute('type', 'password');
            field.classList.remove(suica);
            field.classList.add(icoca);
          }
        });
      });
    });
  });
```
[Rails][ActiveStorage] 特定のuserがavatarを持っているかどうか調べる


あるuserがavatarを持っていない場合、 `user.avatar` にアクセスしようとすると例外が発生する。これを防ぐには `user.avatar.attached?` として事前にファイルが添付されているか調べるようにする。

```rb
class User < ApplicationRecord
  has_one_attached :avatar
end

user = User.last
user.avatar.attached?
=> false

# 添付がないのにアクセスしようとすると例外が発生
user.avatar.url
=> Module::DelegationError: url delegated to attachment, but attachment is nil

# 以下のようにすることで回避できる
user.avatar.url if user.avatar.attached?
=> nil
```

メモ：このコミットで例外が発生しないように対応されるよう
https://github.com/rails/rails/commit/f002be148e1377709ed28b8e80c5db76ee2fa410

追記：v6.1.0.rc1に上記コミットが入っていることを確認

```rb
user = User.last
user.avatar.attached?
=> false

# Rails 6.1.0.rc1 では例外発生しないように対応済み
user.avatar.url
=> nil
```

### 参考URL
Railsガイド
https://railsguides.jp/active_storage_overview.html
ACFカラーピッカーでカスタム投稿カテゴリの背景色を管理画面から変える

## やりたいこと
Wordpressのカスタム投稿記事に表示するカテゴリタグの背景色を
管理画面から設定できるようにする。

##方法
プラグイン『Advanced Custom Field』のカラーピッカーを使用します。

### 1. フィールドタイプ「カラーピッカー」を選択

![スクリーンショット 2020-11-13 19.49.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287877/02a56bf6-fab8-e182-8d03-121bfc25c083.png)

### 2. 管理画面から色を選択
![スクリーンショット 2020-11-13 19.59.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287877/6ec604c4-4bcb-5675-850d-a97737e43d06.png)



### 3. 出力したい箇所に以下を記載
タクソノミー：blog_taxonomy

```php:shingle-blog.php
<?php if (has_term('','blog_taxonomy')): ?>
  <ul class="p-blogpage__article__tags">
    <?php
      $cats = get_the_terms($post->ID,'blog_taxonomy');
      foreach ( $cats as $cat ){
        $cat_link = get_category_link($cat->term_id); //注意：cat_idじゃない
        $cat_name = $cat->name;
        $cat_id = $cat->term_id;
        $cat_color = 'category_'.$cat_id;
        $back_color = get_field('ca_color',$cat_color);
    ?>

    <li class="p-blogpage__article__tag">
      <a href="<?php echo $cat_link; ?>" style="background-color:<?php echo $back_color; ?>; ?>"><?php echo $cat_name; ?></a>
    </li>

    <?php } ?>
  </ul>
<?php endif; ?>
```
Macのdockのfinderでハイライト表示 するべ

スタックをハイライト表示
 
スタックの表示形式をグリッドにしたとき選択中の項目をハイライト

defaults write com.apple.dock mouse-over-hilite-stack -bool true

戻す

defaults delete com.apple.dock mouse-over-hilite-stack


![スクリーンショット 2020-11-13 19.53.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316916/04ce5e8a-304c-d711-3af2-1afb161d8e19.png)

マークダウン読もうと思った
redux-observableのEpicのエラーハンドリングでactionを返す

# 普通に書こうとすると失敗する

[catchError](https://rxjs-dev.firebaseapp.com/api/operators/catchError)オペレータを使い、[of](https://www.learnrxjs.io/learn-rxjs/operators/creation/of)でくくったActionを返します

```typescript:サンプルコード(失敗します)
const sampleEpic = action$ =>
  action$.pipe(
    filter(sampleAction.match),
    tap(() => {
      throw new Error('oops!'); // エラー発生
    }),
    catchError(error =>
      of(errorHandlingAction(error.message)) // Actionを返す
    )
  );
```

しかし、一回catchErrorをしたのを最後に、このEpicは死んでしまいました:cry:

しばらくハマったのですが、redux-observableのcatchErrorでactionを返すと、rootEpicがそのEpicの購読をやめてしまうようです:thinking:

# 解決策

[issue](https://github.com/redux-observable/redux-observable/issues/591)に解決策がありました。

```typescript
catchError((error, caught) => merge(
	of({ type: 'EPIC_FAILURE', error }),
	caught,
)),
```

なるほど、一緒にcaughtもすればいいんですね:hugging:

```typescript:サンプルコード(修正版)
const sampleEpic = action$ =>
  action$.pipe(
    filter(sampleAction.match),
    tap(() => {
      throw new Error('oops!'); // エラー発生
    }),
    catchError((error, caught) =>
      merge(of(errorHandlingAction(error.message)), caught) // caughtする!
    )
  );
```
USBポートに何か刺した状態でPCを起動するとBitlockerのPIN入力画面が出ない

同じ事象に出くわしている方の参考になれば幸いです。

# 前提
* PCはHP Spectre x360 13
* OSはWindows10(Pro)
* Bitlockerでディスク暗号化
* PC起動時はPIN入力で解除

# 起きたこと
* USBポートになにも刺さない状態でPCを起動するとBitlockerのPIN入力画面（青い画面）が正常起動
* USBポートになにかを刺した状態でPCを起動するとBitlockerのPIN入力画面（青い画面）が表示されず真っ暗なまま（ただし電源は付いているようでバックライドはうっすら点いていた）
* BitlockerのPIN入力後はUSBに何を刺しても問題なく動作する
* 毎回USBポートに刺さっているものを抜いてからPCを起動しないといけないのでツライ

# 解決策
* BIOS上の「Boot Option」で「Legacy Support」が「Disabled」になっていたのを「Enabled」にしたところ、USBポートに何かを刺している状態でPCを起動してもBitlockerのPIN入力画面が表示されるようになった。
* なぜかは不明。Bootの順序が変わるから？　どうもUEFIだとダメのようだ。
* ちなみに、「Legacy Support」を「Enabled」にすると、直後のPC起動時にBitlockerのPIN入力後に回復キーの入力を求められた。あの超長いやつ。まさか毎回起動時に聞かれるのでは…と戦々恐々としたが、そんなことは無かった。よかった。。。
Firestoreから特定のフィールドの値を取得する最も簡単な方法（Angular）

#はじめに
[Firebase Firestoreから特定のフィールドの値を取得する（Angularfire）](https://qiita.com/kokogento/items/cd1c5e7f24ecb27c36a2)
:point_up:こちらの記事で書いてあるように、特定のフィールドの値を取得するのにかなり苦戦した経験がある。。。

**しかし、何故か今回はすんなりと、しかもスマートなコードでできました:joy:**
なんで前はこんなに苦労したんだろう？？？（わかる人、教えてください・・）

#実現したい事
![https06.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/07154253-2bb1-f1d4-78cd-0923327651ff.jpeg)

こんな感じでFirestoreにデータが入ってたとして、欲しいデータは**userのフィールドである`isLocked`の値！**

こいつを取得するにはどうすればいいか？

#環境
[Angularfire](https://github.com/angular/angularfire)がプロジェクトに入っていること

#フィールドの値を取得
※必要最小限のコードです

```typescript
import { AngularFireAuth } from '@angular/fire/auth';
import { AngularFirestore } from '@angular/fire/firestore';

export class SettingsPage implements OnInit {

isLocked;

constructor(
    private afAuth: AngularFireAuth,
    private db: AngularFirestore,
  ) {}

 ngOnInit() {
    this.afAuth.auth.onAuthStateChanged((user) => {
      if (user != null) {
    const userRef = this.db.collection('users').doc(user.uid);
    userRef.get().subscribe(docSnapshot => {
       // get('isLocked')でフィールド名を指定
      const locked: boolean = docSnapshot.get('isLocked');
      console.log('ロックされていますか？ ' + locked);
      this.isLocked = locked;
    });
      }
    });
  }

}
```

これで`users/uid/`の中にある`isLocked`という値（ここではtrueかfalse）を取得できました！
ピアソンVUEのオンライン試験受けたらPC操作できなくなった

# はじめに
本当はこれが合格体験記になる予定だったんですが、落ちたので今回のオンライン試験で発生した事象と受験した感想について書いておきます。
もし今後ピアソンVUEのオンライン試験受ける方がいればご注意ください。

※もしこれが普通の動作ということであればご指摘ください。この記事は削除します。

この記事は衝動で書いているので、Qiitaの規約違反で消されるかも
一応同じ内容を以下にも書いておきます。
https://www.capybara-engineer.com/entry/2020/11/13/185513

# 経緯
つい今日(というか今さっき)オンラインでAWSの試験を受験してきました。

元々オフラインとオンラインで迷ってたんですけど、コロナの感染者が増えているようですし、安全のためにはオンラインが良いかなーと思って、オンラインで試験を申し込みました。

試験までは事前に自宅での受験場所をセッティングするためにものを動かしたり、個人の証明書を準備したりと色々あったんですが、受験自体は問題なくできました

<h3>＜＜＜受験自体は＞＞＞</h3>

# 何が起こったか
簡単に言うと試験終了後にPCが真っ白の画面になって何もできない状態になりました。

↓こんな感じ(タスクマネージャーが開けるのは後から気づいた)↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/e45d0287-c235-3d39-ef9a-a7702c504d85.png)

多分試験が終了した後に普通に終わっていれば何も問題はなかったのかもしれませんが、今回は英語で「ピアソンVUEのアンケートに答えませんか(多分そんな感じ)」みたいなポップアップが出てきて、それぐらいならいいかと回答してピアソンVUEのアプリに戻ってきたら真っ白の画面で何もできなくなってました。

(多分途中で一度Edgeが立ち上がったのがダメだったんじゃないかなー)

* 具体的な手順

```
①ピアソンVUEの専用ソフトで試験開始
②試験終了・試験結果表示
③「ピアソンVUEのアンケートに回答しますか」ポップアップが出たので"はい"を選択
④Edgeが立ち上がってアンケートに回答・回答後Edgeが終了
⑤ピアソンVUEの専用ソフトがフリーズまたは正常に終了にされず、パソコンの画面制御が奪われたままなのかずっと真っ白な画面を表示し続けている
```

# どうしたか
幸い後からCtrl+Alt+Delが実行できることに気づいたので、そこからPCをシャットダウンして起動しなおすと元のデスクトップ画面が表示されていました。

ホントはPC本体の電源ボタンを長押しして電源を切って再起動しようとしたんですが、何故かそれでは電源が切れず。。

一応その事象を認識してすぐにカスタマーセンターに問い合わせたのですが、技術的な事象かつ個人PCでの発生だったので、内部で確認しないと何とも...という回答しかもらえませんでした。

タイミング的にちょうど金曜ということで、遅くとも来週の頭の回答になるとも言われていたので、解決して助かりました。。
 
 
# それはそれとしてオンライン試験はどうだったか
完全に上記の内容がメインになってしまったんですが、オンライン試験を受けてみての感想もちょろりと。

やっぱり自宅で受験できるというのは移動時間もかからないし、人と会うこともないので安心といえば安心でした。

ただやってみるとわかるんですが、自分はPCのカメラでやっていたのもあり、体を動かしてカメラに顔が全部映ってなかったり、無意識に手を口に当てていたりすると規約違反として監督者から細かくチャットが飛んできます。

それで集中が途切れたりするので、オンラインで受験することのメリットとデメリットを考えるとデメリットが勝つかなーというのが正直な感想でした。

ちゃんと感染予防がされている前提でオフラインで受験したほうがそこまで監視は厳しくないし、PC不具合はちゃんと向こうの責任で見てもらえるので、次は安全を確保したところでオフライン受験しようと思いました。

# 終わりに
不正を防止するためとはいえ、PCの制御がアプリに奪われてしまうのは怖いなと思いました。(具体的に内部でどんな制御しているかわかりませんが)
【Active Record】ヒアドキュメントを活用して条件付LEFT JOINを行う

## テーブル
### notes
|  id  |  title | body |
| ---- | ---- | ---- |
|  1  |  おはよう  | おはおはおはおは |
|  2  |  こんにちは  | こんこんこんこん |
|  3  |  こんばんは  | こんこんこんこん |

### likes
|  id  |  note_id | user_id |
| ---- | ---- | ---- |
|  1  | 1 | 1 |
|  2  | 2 | 2 |
|  3  | 2 | 2 |
|  4  | 3 | 3 |

## やりたいこと
「notesの全レコードと、noetsに結合したlikesレコード(user_id = 1)の情報を取得」


## 結論
``` sample.rb
# user.id = 1
user = User.find_by(email: "test@gmail.com")
Note.joins(
      <<~SQL
        LEFT OUTER JOIN `likes` ON `likes`.`note_id` = `notes`.`id`\
        AND `likes`.`user_id` = #{user.id}
      SQL
     )
```

## 取得結果
|  id  |  title | body | id | note_id | user_id |
| ---- | ---- | ---- | ---- | ---- | ---- |
|  1  |  おはよう  | おはおはおはおは | 1 | 1 | 1 |
|  2  |  こんにちは  | こんこんこんこん |
|  3  |  こんばんは  | こんこんこんこん |
【Rails】collection_selectでCSSが適用されない時は、classを指定できてるか確認しよう

## はじめに
- オリジナルアプリ開発で発見したことについて、定着と備忘のためにまとめていきます。

## 結論

- CSS書けてるはずなのに変化がないときは、以下を確認してみよう
    - class名が間違っていないか
    - 記述したことが開発ツール上でも表示されているか
- `collection_select`のoptionとHTML属性には `{}` を付けよう

## 経緯


### やりたいこと

- `collection_select`で作ったセレクトボックスのスタイリングをしたい

### 作成したコード(誤り)

```erb
#erbファイル
<div class="search-field">
  <%= f.label :occupation_id, "職種", class:"search-label" %>
  <%= f.collection_select(:occupation_id, Occupation.all, :id, :name, selected: @search_params[:occupation_id], include_blank: "選択しない", class:"search-occupation") %>
</div>
```
検索フォームの一部で`occupation`モデルから選択出来るようにしています。
`collection_select`の具体的な使い方はガイド内をご確認下さい → [Railsドキュメント](https://railsdoc.com/page/collection_select)

オプションで下記のものを指定しています。
・ `selected:` → 遷移後に`@search_params`の値が選択されるようにしています
・ `include_blank:` → 初期状態(選択していない状態)の値を指定しています

次の箇所で問題が発生しました。
3行目の`class:search-occupation`に対して下記のCSS記述しましたが、適用されませんでした。

```scss
#scssファイル
.search-occupation {
    width: 100%;
    padding: 8px 8px 5px;
    outline: none;
}
```
開発ツールで確認すると、`class:"search-occupation"`が指定できていないことが分かりました。（画像3行目）

![スクリーンショット 2020-11-13 18.08.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708469/a2f50e59-28b5-b293-f061-30586ff6a915.png)

HTMLでclassが指定できていないため、CSSが無効になっている訳ということですね。
対応には下記の記事を参考にさせて頂きました。
[ActionView::Helpers::FormOptionsHelper](https://api.rubyonrails.org/v5.2.3/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-collection_select)
[【Rails】完全理解 formでセレクトボックスをつくるselectの使い方](https://310nae.com/rails-selectbox/)
[railsでf.selectにclassを設定する](https://qiita.com/nakanoyoshiki/items/e87a6238f8febbeb208a)


## 今回の対応
`collection_select`について調べていく中で、どうやら**`option`と`HTML属性`には`{}`が必要**と分かりました。(上述のコードのうち、引数の`:name`より後ろの部分)
また、今回のように**`option`が2つある場合は、同じ`{}`内に記述する**必要があります。

- OK `{ selected: 〇〇, include_blank: 〇〇}`
- NG `{ selected: 〇〇}`, `{include_blank: 〇〇}` → `ArgumentError`でした


### 修正したコード

3行目を修正しています

```erb
<div class="search-field">
  <%= f.label :occupation_id, "職種", class:"search-label" %>
  <%= f.collection_select(:occupation_id, Occupation.all, :id, :name, {selected: @search_params[:occupation_id], include_blank: "選択しない"}, {class:"search-occupation"}) %>
</div>
```


## おわりに

- 引数が多いhelperのため、まずは落ち着いてルールを確認したことでスムーズに解決出来ました。
- また、大元の検索機能は[こちらの記事](https://qiita.com/shin1rok/items/779e581e9d12a92310c3)を参考にさせて頂きました。
- 初学者ゆえ、記事内に誤りがあるかもしれません。ご指摘等ありましたら、お手数ですがコメントを頂けると幸いです。
[Rails]データベースのデータ型種類について勉強してみた！

#はじめに
データベースのデータ型ってメッチャ種類があって、ややこしいですよね。
当方、まだまだプログラミング駆け出しの身なので、
**「えっ、この場合はどれを使えばいいの？」**
ってなることが非常に多く、その度にGoogle検索をするのですが、丁度良い解説に巡り会えなかったので、アウトプットも兼ねて記事を書きます！
よろしくお願いします。
#データ型種類一覧
| データ型 | 種類 |
|:-----------|:------------|
|   integer     |  整数型(4バイト)      |
|    bigint  |  整数型(8バイト)    |
|   decimal     |  固定長整数型（精度の高い小数）       |
|    float     | 数値（浮動小数点数）         |
|   string    |  文字列(1 〜 255文字)     |
| text    | 長い文字列(1 〜 4,294,967,296文字)   | 
| date    | 日付(1000-01-01 〜 9999-12-31)| 
|   datetime  |日付と時刻(1000-01-01 00:00:00.000000 〜 9999-12-31 23:59:59.999999) | 
| time    | 時刻 (-838:59:59 〜 838:59:59)   | 
| timestamp    |タイムスタンプ ('1970-01-01 00:00:01' UTC ~ '2038-01-19 03:14:07' UTC)| 
| binary    | バイナリ文字列型   | 
| boolean    |   真偽   | 
|primary_key	|プライマリーキー(主キー)|

本当は全てに対して解説をするべきですが、個人的に気になった部分のみ取り上げてます！
載っていない項目に関しては、ご自身でググってみてください。

#integerとbigintってどう違うの?
**integer**：整数型(4バイト) 
**bigint**：整数型(8バイト) 

いきなり最初からよく分かりませんね。
どうやら、昔は整数型といえばintegerのみだったのですが、大規模なSNSサイト等になると、会員数だけでもかなりの数になってしまい、integerでは対応できなくなってしまったのが背景にあるようです。

そこで、Rails5.1からidカラムがbigintに変更になるようになりました。
新規でアプリケーションを作成する際は、特段問題が発生しないのですが、既存のアプリでintegerを使用していた場合、システム補修時にエラーが発生することがあるようです。

#textとstringってどういう風に使い分けるの？
一般的な分類方法では、以下のように使用されるのが多いです。

**string**(1 〜 255文字)
・名前
・住所
・パスワード
**text**(1 〜 4,294,967,296文字)
・コメント
・投稿文

作成するサイトによって事情は様々だと思いますので、あくまで一例ということで。

#timestampとdatetimeって何が違うの？
**timestamp**：タイムスタンプ ('1970-01-01 00:00:01' UTC ~ '2038-01-19 03:14:07' UTC)
**datetime**：日付と時刻(1000-01-01 00:00:00.000000 〜 9999-12-31 23:59:59.999999)

皆様はご存知でしょうか、**2038年問題**を！
よく見れば気付く方もいると思いますが、timestampは現状、2038年までしか対応していないのです...
なぜこうなったのかは分かりませんが、日時を記録する時には、`datetime`を使うという方向性にシフトしているようです。
2038年は世界が荒れそうですね。

#binaryとは何のこと？
そもそも「バイナリ」とはコンピュータ用語で、データが「0」と「1」で表現されているデータ形式です。
Railsでは、「テキストではない情報でデータが書かれているファイル」という認識になるかもしれません。

バイナリファイルの主なものとしては、
・ 音声ファイル
・ 画像ファイル
・ 圧縮ファイル
などがあります。
バイナリデータは、人間が読み取れる文字で記載してあるわけではありません。
そのため、テキストエディタではバイナリデータを開くこともできません。
使いどころがよく分かりませんね。

#booleanとは？
これもよく分からない概念ですよね。
一般的には、真(true)と偽(false)のような2つの状態を表すデータ型を表します。

#おわりに
データ型だけには、かなりの種類があるんだな、ということを再認識。
こうやって自分でまとめてみないと、なかなか知り得なかったこともあって、非常に勉強になりました。
リモートサーバー上のDocker ContainerにVSCodeで入る

#0. まとめ
[1. 秘密鍵と公開鍵の作成及び配置](#1-秘密鍵と公開鍵の作成及び配置)
[2. Dockerのインストール](#2-dockerのインストール)
[3. VSCodeでの設定](#3-vscodeでの設定)
[4. サーバー上でコンテナを建てる](#4-サーバー上でコンテナを建てる)
[5. コンテナにアクセス](#5-コンテナにアクセス)

#1. 秘密鍵と公開鍵の作成及び配置
##1-1. 秘密鍵と公開鍵の作成
##
```bash:local_host
$ cd ~/.ssh
$ ssh-keygen -t rsa -f keyname
```
`keyname`は好きな名前を入力する。
`Enter file in which to save the key (/home/username/.ssh/keyname)`と聞かれるので、そのままEnterを押せば、()の中のパスに保存される。
`Enter passphrase (empty for no passphrase)`でpassphraseを入力する(しなくても可)

##1-2. 公開鍵の配置及び設定
先ほど作成した公開鍵の内容をサーバー側に保存する。
`~/.ssh/authorized_keys`にkeyname.pubの中身を追記しましょう。

```bash:remote_server
# ログイン
ssh hoge_user@hogehoge.hoge.com

# フォルダとファイルを作る(既に存在している場合は実行しなくても可)
mkdir .ssh
touch .ssh/authorized_keys

# 権限の設定。個々を間違えると、公開鍵認証でログイン出来ないので注意
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

# authorized_keysへ公開鍵の内容を追記。ほかの方法でも可
cat ~/.ssh/id_rsa.pub | ssh hoge_user@hogehoge.hoge.com 'cat >> .ssh/authorized_keys'
```

##1-3. configの設定
``~/.ssh/config``に以下を追記

```text:~/.ssh/config
Host xxx
	HostName xxx.xxx.xxx.xxx
	User username
	IdentityFile ~/.ssh/keyname
```

##1-4. ssh-agentの設定
以下に従い、ssh-agentを設定しましょう
https://code.visualstudio.com/docs/containers/ssh#_set-up-ssh-tunneling

#2. Dockerのインストール
ローカルに[Docker Desktop](https://www.docker.com/products/docker-desktop)をインストールしましょう。windows10の人はWSL2もインストールしましょう。

#3. VSCodeでの設定
VSCodeに拡張機能の[Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)と[Docker](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker)をインストール後、setting.jsonに以下を追記。

```json:setting.json
"docker.host":"ssh://your-remote-user@your-remote-machine-fqdn-or-ip-here"
```
``your-remote-user``にはsshのユーザ名を、``your-remote-machine-fqdn-or-ip-here``にはサーバーのipアドレス等を入力する。

#4. サーバー上でコンテナを建てる
サーバー上で```docker run```しましょう

#5. コンテナにアクセス
VSCode画面左のDockerマークをクリックし、自分のコンテナに`Attach Visual Studio Code`しましょう

# 参照
https://code.visualstudio.com/docs/remote/containers-advanced#_developing-inside-a-container-on-a-remote-docker-host
https://qiita.com/sakanashi/items/542ae428d9de9c7c59dc#%E3%82%84%E3%82%8A%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8
https://nekodeki.com/ssh-config%E3%81%A8ssh-agent%E3%81%A7ssh%E6%8E%A5%E7%B6%9A%E3%82%92%E7%B0%A1%E5%8D%98%E3%81%AB%E3%81%99%E3%82%8B/#ssh-agent-2
https://qiita.com/ir-yk/items/af8550fea92b5c5f7fca
コマンドでWordpressのsiteurlを変更する

##経緯

とあるサイトの改修をするため、DockerでWordpress環境を構築しlocalhost:8000 で立ち上げたもののCSSが反映されず、`siteurl`を変更する必要がありました。
リポジトリのREADMEには「sequelpro」を使って変更する手順が記載されていたのですが、「sequelpro、接続できない問題！」が発生しまして。。。（ググって見た所どうやら認証方式が変わったとか)
なのでsequelproを使わず、コマンドからDockerに接続し`siteurl`を変更することに。
普段この辺りを触る機会がめったにないので備忘録として残したいと思います！


##Dockerへ接続

```
sudo docker ps
```
コマンドを実行するとコンテナIDが表示されるので、`docker-compose.yml`に記載されている、対象DBのコンテナIDを確認します。
そして下記コマンドを実行し、

```
sudo docker exec -it {コンテナID} /bin/bash
```

`root@コンテナID:/#`
のようなプロンプトが表示されていれば接続成功！です。


##DBへ接続
`docker-compose.yml`に記載されている、`MYSQL_USER:`と`MYSQL_DATABASE:`を確認し以下コマンドを実行。

```
mysql -u {データベースユーザ名} -p {データベース名}
```
そうしたら、`{データベースのパスワード}`の入力を求められるので`MYSQL_PASSWORD:`に記載されているパスワードを入力します。


##設定の確認
下記コマンドを実行すれば、現在設定されている`seiteurl`と`home`の2つを確認することができます。
`siteurl`のみは`,"home"`を省いてください。(逆も同じ)

```
select * from wp_options where option_name in ("siteurl","home");
```

##設定の変更
現状の設定が確認できれば、設定を変更していきます。

```
update wp_options 
  set option_value="{正しいURL}"
 where option_name in ("siteurl");
```
`seiteurl`と`home`両方変更する場合は、最後の記述を,`where option_name in ("siteurl","home");`としてください。

##設定の確認
最後に、きちんと変更できているか確認して終了になります。

```
select * from wp_options where option_name in ("siteurl");
```

表示された`siteurl`が更新したものになっていればOKです！
そしてサイトのTOP画面や管理画面に戻ってきちんと表示されていることを確認してください。

###接続から抜ける
コマンドで`exit`と打ってDBとdockerそれぞれの接続から抜けてください。



以上、突如発生する困った・・・！！:fearful:の対処方法でした！


####参照
[MySQL: Sequel ProでMySQLに接続できない時
](https://pqtomblog.com/2018/09/20/connecting_mysql_by_sequelpro/)
[WordPressの一般設定でサイトURLを誤って変更した時の戻し方](https://www.taka-output-blog.com/restore-wordpress-siteurl/#toc14)
Homebrewをプロキシ設定をつけてインストールする方法

Homebrewをインストールする方法は[公式サイト](https://brew.sh/index_ja)で公開されています。
現時点では、以下のコマンドを実行するよう記載されています。
>/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

しかし、プロキシ設定が必要な場合、以下のエラーが発生してしまいインストールできません。

>curl: (7) Failed to connect to github.com port 443: Operation timed out

## Homebrewをプロキシ設定をつけてインストールする方法

以下のコマンドを実行しましょう。

>/bin/bash -c "$(curl -x http://myproxy.jp:8080/ -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
朗報！　R 4.0.3からはcmdやPowerShellでRを起動しても文字化けしない

最近R 4.0.3をインストールし、試しにPowerShellからRtermを起動してみたところ、いままでずっと直らなかった日本語表示の文字化けが直っていました。

![Ps-R2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/d9087d54-6791-2414-3e9b-54732e487199.png)
※　自分の環境ではRtermまでパスを通してあります。

確認したところ、今回のアップデートで文字化けが直されたそうです。

> BUG FIXES (Windows)
> （中略）
> Rterm now correctly displays multi-byte-coded characters representable in the current native encoding (at least on Windows 10 they were sometimes omitted, PR#17632).
（後略）

> 　　*[R News: CHANGES IN R 4.0.3](https://cran.r-project.org/bin/windows/base/NEWS.R-4.0.3.html)　より*

詳細な説明は[Bug 17632 - In Windows shell, Korean characters are not displayed at all.](https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17632)で見ることができます（が自分はエンコードの知識が乏しくちゃんと理解できてません。すみません）。

ただし日本語の入力については、きちんと認識するものの入力時の表示が文字化けしたままでした。PowerShell等で作業するなら日本語のパス名や列名はまだ避けた方がいいかもしれません。

![Ps-R4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/f2d0c565-ee5d-2bb6-6403-eb9d4cd53bd1.png)


長らく日本語環境で存在した、WindowsのシェルからRが使いにくいという問題が解決したことで、Rを使う際のインターフェースの選択肢が広がったように思います。

以上報告でした。
cp（copy）コマンドで複数ファイルを一括でコピーする方法

cpコマンドで引数を複数とっているパターンがあったので処理内容の確認。

macは`cp`、windowsは`copy`

`$cp A B C D E ./F`が何をしているかを理解する。


##引数の数による処理の違い

(1) 引数一つの場合
ファイルをファイル名を指定してコピー

・`cp [元のファイル名] [コピー後のファイル名]`

```
cp [-R [-H | -L | -P]] [-fi | -n] [-apvXc] source_file target_file
```


(2)引数が複数の場合
複数のファイルをディレクトリに移動する。
一番末尾がディレクトリのパスになる。

・`cp [コピーするファイル名１]　[コピーするファイル名２]... [ディレクトリ名]`


```
cp [-R [-H | -L | -P]] [-fi | -n] [-apvXc] source_file ... target_directory
```


<br>
**▼エラー事例**

ディレクトリが存在しない場合はコピーエラーとなる。

```:エラー
cp: ./cat.jpg and cat.jpg are identical (not copied).
```


<br>
##実例
以下の処理は、ファイルA,B,C,D,EをディレクトリFにコピーしている操作となる。

```
$cp A B C D E ./F
```


**▼実際の処理例**

```
//現在のディレクトリ
$ ls
cat.jpg		cat2.png	cat3.png	test

//testディレクトリに３つの画像をコピー
$ cp cat.png cat2.png cat3.png ./test

//testの中身を確認
$ ls test
cat.jpg		cat2.png	cat3.png
```
Python でクラスオブジェクトをJSON形式にする・戻す

Pythonで，自分で定義したクラスのオブジェクトを Json 形式にする (encode) 方法とJson形式から戻す (decode) 方法のメモ．
参考にしたページ: 
* [Pythonのjsonモジュールドキュメント](https://docs.python.org/3/library/json.html)
* [How to use custom Python JSON serializers and deserializers to automatically roundtrip complex types](https://gist.github.com/simonw/7000493)

## 例

こんなクラスを例にする．

```python
import json
from datetime import date

class MyA:
    def __init__(self, i=0, d=date.today()):
        self.i = i   # int型
        self.d = d   # date型
```

## Jsonデータ

まず始めに，オブジェクトをどのような形式でJsonデータにするのかを定めなくてはならない．MyA オブジェクトは，`'i'`と`'d'`をキーとした object にするのが自然に思える．また，date型のデータは，手っ取り早く toordinal メソッドで整数にしてしまおう．この考え方だと，たとえば

```python
a = MyA(i=100, d=date(year=2345, month=6, day=12))
```

という a は，`{"i": 100, "d": 856291}` というJsonデータに変換することになる．

この方式は，状況によっては，少し良くない．Json データを見た時に，これが MyA クラスのオブジェクトであることが直ちにはわからないので，デコードが簡単にいかない．そこで，定義を修正して，`'_type'` というキーにクラス名を格納し，値は`'value'`というキーに格納することにする．この方式だと，Jsonデータは次のようになる:

```json
{ "_type": "MyA", 
  "value": {"i": 100, 
            "d": { "_type": "date",
                   "value": 856291}}}
```

MyA オブジェクトだけではなく，date オブジェクトについても `_type` を使っているところに注意．以下，この方式を例に，エンコードとデコードを行ってみる．

## エンコード

Python の json ライブラリの dump や dumps コマンドは，cls という引数をとる．ここに，自分で定義したエンコーダを指定することができる．JSONEncoder というのが普通使われるクラスなので，これをベースとして自分のエンコーダを作る．実際に必要なことは，default というメソッドの再定義である．

```python
class MyEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, date):
            return {'_type': 'date', 'value': o.toordinal()}
        if isinstance(o, MyA):
            return {'_type': 'MyA', 'value': o.__dict__}           # (*)
        return json.JSONEncoder.default(self, o)
```

ご覧のように，各クラスが直接見ているところだけ書けばよい．MyA オブジェクトを処理する (*) のところを見ると，`_type` と `value` をキーにする辞書を作っている．`value` の値として，例えば上の a ならば，`{"i": 100, "d": date(year=2345, month=6, day=12)}` という辞書を設定している．つまり，再帰処理はライブラリがよしなに行ってくれるのである．

次のように実行できる．

```python
    a = MyA(100, date(year=2345, month=6, day=12))
    js = json.dumps(a, cls=MyEncoder)
    print(js)
```

実行結果:

```
{"_type": "MyA", "value": {"i": 100, "d": {"_type": "date", "value": 856291}}}
```

## デコード

こちらも，JSONDecoderというクラスをベースにデコーダを作る．今度は，親クラスであるJSONDecoderのオブジェクトが作成される際に，object_hook という変数に渡す関数の中で，必要なデコードが行われるように書く．以下のような具合である:

```python
class MyDecoder(json.JSONDecoder):
    def __init__(self, *args, **kwargs):
        json.JSONDecoder.__init__(self, object_hook=self.object_hook,
                                  *args, **kwargs)

    def object_hook(self, o):
        if '_type' not in o:
            return o
        type = o['_type']
        if type == 'date':
            return date.fromordinal(o['value'])
        elif type == 'MyA':
            return MyA(**o['value'])
```

object_hook の o としては，エンコードの時に作成したもの (MyEncoder::default の返り値) が渡ってくる．上の例だと，MyA オブジェクトや date オブジェクトについては `'_type'` だの `'value'` だのをキーに持つ辞書が来る．それを適切なクラスのオブジェクトに作り替えるようにコードを書けば良い．

エンコードの時の実行に引き続いてやってみる:

```python
    b = json.loads(js, cls=MyDecoder)
    print(b.i, b.d)
```

実行結果:

```
100 2345-06-12
```
Railsのフラッシュを他のコンテンツを動かさずにフェードアウトさせる

#概要
Railsにてエラー等が発生した時、フラッシュを使用し、ページ上部にメッセージを表示させ方法はよく行うことだと思います。
基本的にページを再読み込みするか、別のページへ移動するかしない限り、フラッシュは上部に表示されたままです。
この表示をページを変えなくてもフェードアウトするようプログラムする。

#方向性
基本的なflashの設定を行いviewに配置する。class属性を指定し、javascriptでタイマー設定をし、新たなclassを追加し、cssを読み込ませます。

ちなみにjQueryにfadeout()というメソッドがあり、そちらを使うこともできる（記述も簡単である）。
しかし、フェードアウトした後、表示されていたflashの範囲分、ページが上部に急激に上がるため、ユーザー側の立場を考えると困ると考えました。（例:クリックしようとした瞬間、または記事を読んでいる時ページが急激に動く等。）
勉強の意味も込めて、違った方法でフェードアウトさせてみました。

#事前準備
controllerでのflashの設定、javascriptの設定等は行われている前提とします。

#1.該当項目にclass属性を設定
```html:~html.erb
<body>
  <% if flash.notice %>
    <p class="fadeoutTarget"><%= flash.notice %></p>
  <% end %>
</body>
```
flash.noticeを囲うpタグにclass属性で"fadeoutTarget"と設定します。もちろん名前は任意で設定可能です。

#2.javascriptの設定

```javascript:app/assets/javascripts/script.js
$(document).on(turbolinks:load, function() {
  /* fadeoutTargetというclassを持った要素を選択 */
  const fadeoutElement = document.querySelector(".fadeoutTarget");
  /* 一定時間経過したらfadeoutというclassを追加する */
  function flashFadeout() {
    setTimeout(function() {
      fadeoutElement.classList.add("fadeout");
    }, 5000);
  }
  /* fadeoutTargetという要素を持ったdocumentがあれば実行 */
  if (fadeoutElement != null) {
    window.onload = flashFadeout();
  }
```
.querySelector()で任意のclass属性を持った要素を選択します。
この場合、pタグ内のflashの要素を取り出すように設定しています。
setTimeout()で一定時間後、関数を実行するというプログラムになります。
数字の箇所は任意で設定できます。
最後のif文はなくても動くのですが、処理上はfadeoutElementがない時（flash:noticeがない時）、"fadeoutElementがないですよ!"というエラーが出てしまうため、このようにif文で囲っております。

#3.cssの設定
```css:app/assets/stylesheets/application.scss
p.fadeoutTarget.fadeout {
  opacity: 0;
  transition: 1s;
}
```
前項のjavascriptが機能した時、cssが適用されフェードアウトされます。
厳密にはその場で透明になるため、フェードアウト後ページが急激に動いたりすることはありません。

#まとめ
要素をフェードアウトさせる方法はたくさんありますので、その都度必要な方法で処理していけるようにしていきたいです。
今回の場合、ページの急激なスクロール移動はありませんが、上部にflash分の余白ができてしまうため、少し見栄えが悪いかもしれません。

個人的には、納得した形で収まったと考えております。またjavascriptの勉強にもなり良い機会でした。
PHP　復習２関数とformの受け取り

[PHP復習](https://qiita.com/aliceroot0678/items/f421e5bcef4bb30ab716)の続き
ちょっとだけ

#関数
自分で作るやつと組み込み関数がある
組み込み関数は調べたら色々出てくるので割愛。（組み込み関数忘れてた:sweat_smile:）
`rand(a,b)`とかあったよ！これは数字a〜bの間の整数をランダムにかえしてくれるよ！
##関数の作り方
`function 関数名(){処理} `
##関数の呼び出し
関数名();

#formの受け取り
```html
 <form method="post" action="送信先">
        <input type="text" name="キー名">
</form>
```

```php:受け取るphp側

echo $_POST[キー名];
```

`$_POST`の中身は連想配列になっている。
キー名：name、値：実際にフォームに入力した値(value)
となるようになっている。
なので、nameの中身は受け取るときにわかりやすいものにしとくとよい。
キー名は''で囲むのを忘れない
セマフォは湯水

#セマフォとは
セマフォというのは狭い空間でがーっと処理する機構です。
C++で言うと、排他ロックした関数の中で4行位の処理を瞬間的に行う如くの事です。
認識はその中で暴れるように活動し収束を見ます。

#セマフォと自然の危ない関係
セマフォは人間が集中という形で湯水のように使っています。
しかし、型式が古くてリソースリークを結構起こしています。
自然にはそれをトラップして逆探知するスキルがある程度まで色々密結合してます。
最近、生活していたらセマフォをいじる機会があって、霊界の作者様が修正をかけたという話がありました。
元々、１、２、３、で立ててあったのが80程度まではいるようになり、パパっと書いたので処理速度も早まったそうです。

#問題
問題はただ一つです。便利なのです。この機構。
でも、リソースリークだけはちょっといただけないので、話の中にC++のクラス機構の話を盛り込んで、格ある人が観測するだけで落ちるように弄ってみました。
ただそのリソースリークだけがダメなのです。何においてもですが。。。

#コード
```C++:Code.cpp
#include <iostream>
#include <mutex>
#include <type_traits>
#include <future>

//maybe this is Semaphore.

struct SemaphoreData {
protected:
	std::mutex M;
};

template<class F>
class Semaphore :public SemaphoreData{

public:

	Semaphore() = delete;
	Semaphore(F In) :Fun(In) {}
/** /
	bool Lock() {
		M.lock();
		return true;
	}
	bool UnLock() {
		M.unlock();
		return true;
	}
/**/
	template<class... As>
	auto operator() (const As&... In) {
		std::lock_guard<std::mutex> S{ M };
		return Fun(In...);
	}

protected:
	F Fun;
};

template<class F>
Semaphore<F> MakeSemaphore(F In) {
	return Semaphore<F>(In);
}

int main() {
	int i = 0;
	auto S = MakeSemaphore([&]()->bool {std::cout << i++ << std::endl; return true; });

	for (std::size_t X = 0; X < 1024; X++) {
		std::async(std::launch::async, [&]() {	auto S = MakeSemaphore([&]()->bool {std::cout << i++ << std::endl; return true; }); S(); });
	}
	return 0;

}
```
#終わりに
昔は、まだ色々動いていて終わりを見る人があまりいませんでした。
なので、セマフォもまた、終わりを知らない人間が書いたのです。
神様ですら、終わりを見た人はいなかったかもしれません。
なので、デストラクタという概念は発明なのです。
かしこ。
AWS の API Gateway (HTTP API) 経由で Lambda に繋いで POST データを処理するメモ

取り急ぎ忘れないようにめもめも。

* POSTパラメータは `event['body']` に入っている。
* API Gateway の設定で `isBase64Encoded` が有効であると、Base64エンコードされる

APIに投げるときにJSONエンコードしたものを渡すと、Base64デコード後にJSONが取れる。
その際は、リクエストクエリのパースではなく、JSONのパース処理を行う。

```python
import json
import base64
import urllib.parse

def lambda_handler(event, context):

    # POSTパラメータがBASE64でエンコードされているのでデコードする
    decoded_body = base64.b64decode(event['body']).decode()
    # POSTパラメータをdict型に変換
    post_params = urllib.parse.parse_qs(decoded_body)

    result = {}
    result['message'] = 'lambdaからのレスポンス'

    # POSTされたデータを参照 (配列になっているので注意)
    result['name'] = post_params['name'][0]
    result['email'] = post_params['email'][0]

    return {
        'statusCode': 200,
        'body': json.dumps(result)
    }
```
VBA初心者でいろいろやってみたときのメモ

### 別ブックからのシートコピー
全シートコピーではなく、シートの一部分コピーを実施。

複数人の勤務表を集計するために最終はピボットテーブルで集計したかったため。
全シートコピーしてしまうと、いらないヘッダーまでついてきてしまうため。

```vb
'別ファイルのシートをコピー
Sub SheetCopy(FileName As String)
    'コピー元
    Dim WorkBase As Workbook
    'コピー先
    Dim WorkCopy As Workbook

    'コピー先のブック名をセット
    Set WorkCopy = ActiveWorkbook

    Application.DisplayAlerts = False

    'コピー元ファイルを読み取り専用で開く
    Workbooks.Open FileName:=FileName, ReadOnly:=True, UpdateLinks:=0

    '開いたコピー元をセット
    Set WorkBase = Workbooks.Open(FileName)

    'コピー元シート名の「勤務表」セルI13:O列の範囲をコピー
    Dim baseLowRow As Long
    baseLowRow = WorkBase.Worksheets("勤務表").Cells(Rows.Count, 11).End(xlUp).Row
    WorkBase.Worksheets("勤務表").Range("I13:O" & baseLowRow).Copy

    'コピー先シート名「データ」B2から貼り付け
    Dim beforeCopyLowRow As Long
    beforeCopyLowRow = WorkCopy.Worksheets("データ").Cells(Rows.Count, 2).End(xlUp).Row
    WorkCopy.Worksheets("データ").Range("B" & beforeCopyLowRow + 1).PasteSpecial xlPasteFormulasAndNumberFormats

    'コピーを解除
    Application.CutCopyMode = False

    '名前欄をコピー
    WorkBase.Worksheets("勤務表").Range("AA6:AA6").Copy

    '明細に名前を貼り付け
    Dim afterCopyLowRow As Long
    afterCopyLowRow = WorkCopy.Worksheets("データ").Cells(Rows.Count, 2).End(xlUp).Row
    WorkCopy.Worksheets("データ").Range("A" & beforeCopyLowRow + 1 & ":A" & afterCopyLowRow).PasteSpecial xlPasteFormulasAndNumberFormats

    'コピー元のファイルを閉じる
    WorkBase.Close False

    Application.DisplayAlerts = True
End Sub
```

### 不要データ削除
工数が0時間の行はピボットで集計した際に不要な列として表示されていたため、0時間の行は削除する。

```vb
'不要データ削除
Sub DeleteUnnecessaryData()
    Dim lowRow As Long
    Dim i As Long

    lowRow = Cells(Rows.Count, 2).End(xlUp).Row

    Application.ScreenUpdating = False

    'E列が空白か0であれば、削除
    For i = lowRow To 2 Step -1
        If VarType(Cells(i, 5)) = vbEmpty Or Cells(i, 5) = 0 Then
            Range(i & ":" & i).Delete
        End If
    Next i

    Application.ScreenUpdating = True
End Sub
```