OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】RawImageのTextureをPNGにエンコードする方法

uGUIでおなじみRawImageから取り出したTextureをPNGにエンコードする方法の備忘録です。

## TextureをTexture2Dに変換してPNGにエンコード

RawImageからtextureプロパティでTextureを取得できます。

```cs
var texture = _rawImage.texture;
```
しかし、EncodeToPNGメソッドはTexture2Dクラスにしか実装されていないので**TextureからTexture2Dへの変換**を試みます。[^1]


## RenderTextureに変換後Texture2Dへ

単純なキャストでは変換できません。

```cs
var tex = (Texture2D)texture;
```
以下のエラーが出ます。

```
InvalidCastException: Specified cast is not valid.
```

[^1]: Textureクラスを直接PNGにエンコード出来ればよいのですが、、、


先人の方々はRenderTextureを一枚噛ませて変換しているようなので、それに従います。

```cs
var tex = _rawImage.texture;
var sw = tex.width;
var sh = tex.height;
var result = new Texture2D(sw, sh, TextureFormat.RGBA32, false);
var currentRT = RenderTexture.active;
var rt = new RenderTexture(sw, sh, 32);

// RawImageのTextureをRenderTextureにコピー
Graphics.Blit(tex, rt);
RenderTexture.active = rt;

// RenderTextureのピクセル情報をTexture2Dにコピー
result.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0);
result.Apply();
RenderTexture.active = currentRT;

// PNGにエンコード完了
var bytes = result.EncodeToPNG();
```

無事にTextureからPNGのバイト配列に変換できるました。



## 余談

フォーラムでも同様の議論がされていました。

https://answers.unity.com/questions/1470513/convert-texture-to-texture2d.html

以下のやり方が提案されていましたが、僕の環境では動きませんでした。

```cs
public static Texture2D ToTexture2D(Texture texture)
{
    return Texture2D.CreateExternalTexture(
        texture.width,
        texture.height,
        TextureFormat.RGB24,
        false, false,
        texture.GetNativeTexturePtr());
}
```

UnityEditor上でしか試していないけどエラーが出ました。

```
Unable to retrieve image reference
```

## 環境

- Unity2019.4.4f1


## 参考

- https://baba-s.hatenablog.com/entry/2018/02/26/210100
日本人のための SwiftFormat【概要編】

## SwiftFormatとは？

SwiftFormat は MacOS または Linux で Swift コードを再フォーマットするためにコマンドラインツールです。

## なぜ使うのか？

プロジェクトをチームで行う際にコーディングスタイルを統一することで、コードの見やすさや・追いやす
さが向上しますが、これらを認識のあっていないチームで行うとコードのフォーマットの違いを指摘・修正
を手動でオペレーションすることにコストがかかります。これらの作業を SwiftFormat で自動化するこ
とで開発者はコードの動作に集中できるようになります。

## どうやって使うのか？

現在は下記の4通りの方法があるみたいです。

1. コマンドラインツールとして手動で実行するか他のツールチェインの一部として使用する

2. Source Editor Extension として Xcode の [Editor] > [SwiftFormat] メニューから呼び出す

3. Xcode プロジェクトのビルドフェーズ(Run Script?)として、`Cmd-R` or `Cmd-B`を押すたびに
実行されるようにする

4. Git のプリコミットフックとして、チェックインする前に変更したファイルで実行するようにする


【実装編】では `3.`の RunScript での実装 + CocoaPods での導入を検討しているのでそれらについて少し触れます。


### Xcode ビルドフェーズで導入する

今回はチームで共有する際に最もシンプルで簡単な `Xcode ビルドフェーズ` で導入したいと思います。もし他の方法で実現したい場合は [公式のレポジトリ](https://github.com/nicklockwood/SwiftFormat) を確認してください。

※ このスクリプトを追加すると、作業中のソースファイルが上書きされます。
スクリプトをメインターゲットではなくテストターゲットに追加すると、ユニットテストを実行する時にのみ
呼び出され、アプリをビルドするたびに呼び出されないようにすることができるようになるみたいです。

または、通常のビルドの一部として [lintモード](https://github.com/nicklockwood/SwiftFormat#linting)
で SwiftFormat を実行し、手動でフォーマットパスを実行するか、頻度の低いビルドターゲット(テストなど)
の一部として実行することを検討した方がいいみたいです。


- SwiftFormat Lint モード
    - SwiftFormat はリンターではなくフォーマッターとして設計されているため、どこが問題なのかを伝えるのではなくて、コードを実際に修正するように設計されている。実際にコードを変更することが望ましくない状況でコードがフォーマットされていることを確認したい時の場合に `lint`モードが役立つ
    - SiwftFormat をリンターとして実行する時に、`--lint` コマンドラインオプションを使用できる

### CocoaPods での導入

1. SwiftFormat CLI を Podfile に追加する

次の行を Podfile に追加して `pod install` で SwiftFormat のバイナリをプロジェクトディレク
トリに追加する。下記の実行によってビルド済みのコマンドラインアプリのみがインストールされて、SwiftFormat
の Framework のソースコードはインストールされなくなります。

```.podfile
  pod 'SwiftFormat/CLI'
```

2. アプリのターゲットにビルドフェーズを追加する

  1. ファイルリストでプロジェクトをクリックし、`TARGETS`を選択して、`Build Phases`タプをクリック
  する。
  2. 新しい `Run Script` を作り下記のコードをペーストする。

   ```
   "${PODS_ROOT}/SwiftFormat/CommandLineTool/swiftformat" "$SRCROOT"
   ```



## SwiftFormat の設定

SwiftFormat の設定は下記の２つに分かれています。

- Options
  - オプションはルールの動作を制御する設定
- Rules
  - ルールはコードに変更を適用する SwiftFormat ライブラリの関数

### Options

SwiftFormat で使用可能なオプションは、`--options` コマンドライン引数を設定して実行すると確認
することができます。(各オプションのデフォルト値は、ここに表示される)

オプションを追加する方法は下記の２つ。

- `--[option_nam] [value]` のようにコマンドライン引数に追加する。
- `.swiftformat`ファイルを作成してプロジェクトディレクトリに配置する。
   - https://github.com/nicklockwood/SwiftFormat#config-file


特定のオプションが複数のルールに影響を与える場合がある。`--ruleinfo [rule_name]`のようにコマンド
を使用して影響するオプションの詳細を確認するか、[Rules.md](https://github.com/nicklockwood/SwiftFormat/blob/master/Rules.md)を参照して確認する必要もありそうです。

### Rules

SwiftFormat には50を超えるルールが含まれていて、新しいルールが随時追加されています。それらの
使用方法については [Rules.md](https://github.com/nicklockwood/SwiftFormat/blob/master/Rules.md)
を参照してください。次回はこの一覧に関する記事を書きたいと思います。                         


**参照**

- https://github.com/nicklockwood/SwiftFormat
【Python】データサイエンス100本ノック（構造化データ加工編） 020 解説

##Youtube
[動画解説](https://youtu.be/ql3yHmorK1k)もしています。

##問題
P-020: レシート明細データフレーム（df_receipt）に対し、1件あたりの売上金額（amount）が高い順にランクを付与し、先頭10件を抽出せよ。項目は顧客ID（customer_id）、売上金額（amount）、付与したランクを表示させること。なお、売上金額（amount）が等しい場合でも別順位を付与すること。

##解答
```:コード
df_amount_rank = pd.concat([df_receipt[['customer_id', 'amount']] \
,df_receipt['amount'].rank(method='first', ascending=False)], axis=1)

df_amount_rank.columns = ['customer_id', 'amount', 'amount_ranking']

df_amount_rank.sort_values('amount_ranking', ascending=True).head(10)
```

##出力
|  | customer_id | amount | amount_ranking |
|--:|:--|--:|--:|
| 1202 | CS011415000006 | 10925 | 1 |
| 62317 | ZZ000000000000 | 6800 | 2 |
| 54095 | CS028605000002 | 5780 | 3 |
| 4632 | CS015515000034 | 5480 | 4 |
| 10320 | ZZ000000000000 | 5480 | 5 |
| 72747 | ZZ000000000000 | 5480 | 6 |
| 28304 | ZZ000000000000 | 5440 | 7 |
| 97294 | CS021515000089 | 5440 | 8 |
| 596 | CS015515000083 | 5280 | 9 |
| 11275 | CS017414000114 | 5280 | 10 |

##解説
・PandasのDataFrame/Seriesにて、ランク列を新たに作成し、列を連結して、データを順位付けする方法です。
・数字情報をランキング形式で見たい時に使用します。
・**'concat('<列名A>','<列名B>','<列名C>')'は、指定した列を連結する関数**です。'axis=1'は、列を連結することを指します。（※'axis=0'は行方向、'axis=1'は列方向を指します）
・**'rank(method(average/min/max/first),'ascending=True/False')'は、指定した列のランキングを表示する関数**です。
・**averageは平均値、minは低い方に揃える、maxは高い方に揃える、firstは出てきた順にランクを付与します。**
・今回の場合、amount のランキングを rank で表示し、指定された列と連結するために concat を使用しています。
・**'columns('<列名A>','<列名B>','<列名C>')'は、列名を再指定する関数**です。
・P-017,018で使用した sort_values を用いて、ランキング順に並び直して表示しています。  

※rankの参考記事は[こちら](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.rank.html)です
Ansibleで同じディクショナリーに属する変数をset_factで複数回上書きしても、反映されるのは一番最後の上書きだけだった

# 概要

たまにCI/CDでやりたくなるAnsibleのvars上書き芸。

こんな感じの優先順位で上書きされますよね。(下に行くほど優先順位が高い)

```
command line values (eg “-u user”)
role defaults [1]
inventory file or script group vars [2]
inventory group_vars/all [3]
playbook group_vars/all [3]
inventory group_vars/* [3]
playbook group_vars/* [3]
inventory file or script host vars [2]
inventory host_vars/* [3]
playbook host_vars/* [3]
host facts / cached set_facts [4]
play vars
play vars_prompt
play vars_files
role vars (defined in role/vars/main.yml)
block vars (only for tasks in block)
task vars (only for the task)
include_vars
set_facts / registered vars
role (and include_role) params
include params
extra vars (always win precedence)
```

参考: [Using Variables — Ansible Documentation](https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#ansible-variable-precedence)

<br><br>

例えば… `ansible.cfg` で `hash_behaviour=merge` としておけば…

`roles/hoge_role/defaults/main.yml` とかで下記みたいに変数を定義して…

```yml
dict:
  a: "aaa"
  b: "bbb"
  c: "ccc"
```

`hosts/host_group_a/group_vars/all.yml` で下記のように定義すれば。

```yml
dict:
  a: "override"
```

こんな結果が得られます。

```yml
dict:
  a: "override"
  b: "bbb"
  c: "ccc"
```

このノリで `set_fact` を触ったらハマった。


# やりたかったこと

`roles/hoge_role/defaults/main.yml` とかで下記みたいに変数を定義。

```yml
dict:
  a: "aaa"
  b: "bbb"
  c: "ccc"
```

`hosts/host_group_a/group_vars/all.yml` で下記のように定義した上で…

```yml
dict:
  a: "override"
```

更に `b` と `c` についても上書きする。この上書きは特定の `--extra-vars` で指定した変数から値を持ってくる。
なおかつこれらの変数は指定されないこともある…

などというトリッキーなことをしたいとする。


# ハマった方法

```yaml
- name: "Load B"
  set_fact:
    dict:
      b: "{{ B }}"
  when: B is defined

- name: "Load C"
  set_fact:
    dict:
      c: "{{ C }}"
  when: C is defined
```

とかってして、 `--extra-vars "B=hoge"` とか `--extra-vars "C=fuga"` とか `--extra-vars "B=hoge C=fuga"` としたかった。

で、 `--extra-vars "B=hoge C=fuga"`  の時にうまく行かない。こんな感じになるわけですね。

```yml
dict:
  a: "override"
  b: "bbb"
  c: "fuga"
```

本当に必要としていた結果はこれですよね。

```yml
dict:
  a: "override"
  b: "hoge"
  c: "fuga"
```

どうやら、set_factのmargeには癖があるらしい。


# どうするのが良いんだろうね

こんな感じ？釈然としない。

```yaml
- name: "Load B"
  set_fact:
    dict:
      b: "{{ B }}"
  when:
    - B is defined
    - not C is defined

- name: "Load C"
  set_fact:
    dict:
      c: "{{ C }}"
  when:
    - not B is defined
    - C is defined

- name: "Load B and C"
  set_fact:
    dict:
      b: "{{ B }}"
      c: "{{ C }}"
  when:
    - B is defined
    - C is defined
```

## 追記: 寄せられたもう少しスマートな方法

@hiroyuki_onodera さんよりコメント頂いた方法。

```yaml
- name: Load B,C
  set_fact:
    dict:
      b: "{{ B|default(omit) }}"
      c: "{{ C|default(omit) }}"
```

なるほど。 `default` フィルターってのがあるんですね。こちょこちょいじらない場合はこれがスマートそう。

[フィルター — Ansible Documentation](https://docs.ansible.com/ansible/2.9_ja/user_guide/playbooks_filters.html#omitting-undefined-variables)


# まとめ

あんまりトリッキーなことはやめておきましょう。
ドキュメント流し読みしかしてないけど、どこかにこの挙動って書いてあったっけ…？
gem sitemap_generator で priority, lastmod, changefreq を記載しない方法

# 概要
[sitemap_generator](https://github.com/kjvarga/sitemap_generator) ではデフォルトでは priority, lastmod, changefreq にデフォルト値が記載されます。
これらの項目を出力したくないときもあるのでその方法を共有します。

# 方法
priority, lastmod, changefreq に nil を渡すと出力されなくなります。


```ruby
add '/home', priority: nil, lastmod: nil, changefreq: nil
```
toJSONを用いて、JSONデータの返り値を制御する

##JSONデータの返り値を制御する
例）petというJSONデータの場合

```javascript

const pet = {
   name: 'Doggy'
}

console.log(JSON.stringify(pet))
```
↓
{'name':'Doggy'}
というJSONデータが返ってくる。

★返り値となるJSONデータを、toJSONを使って制御することができる

```javascript
const pet = {
   name: 'Doggy'
}

pet.toJSON = function(){
  return {}
}

console.log(JSON.stringify(pet))

```
↓
{}
というJSONデータが返ってくる。

つまり
<h6>toJSONで上書きされた値が、pet定数のJSONデータとして認識される</h6>


##データベースのセキュリティ向上に利用

```javascript
//mongooseを利用して、データベース型を設定
const mongoose = require('mongoose')
const userSchema = new mongoose.Schema({
    name: {
      type: String,  //データ型の設定
      required: true,
      trim: true
  },
  password:{
      type: String,
      required: true,
  },
  tokens: [{
    token: {
      type: String,
      require: true
    }
  }],
 })

//toJSONを用いて、外からuserObjectにアクセスした時に、返すメソッドと返さないメソッドを決める
userSchema.methods.toJSON = function(){
  const user = this
  const userObject = user.toObject()

  delete userObject.password
  delete userObject.tokens
 

  return userObject
}
```
↓
これで、userObjectは、toJSONで指定されている、passwordとtoken以外のデータを返すようになる。
sudo apache2ctl configtestでエラーが発生する件とその解決方法

###開発環境
VMware Workstation 15 Player
ubuntu-ja-20.04-desktop-amd64.iso
#Apache2の導入
```
１．リポジトリ更新
$ sudo apt update

２．インストール
$ sudo apt install apache2

３．apacheの稼動を確認、IPアドレスを取得
$ sudo apache2ctl configtest
```
#発生したエラー
3つ目のコマンドを実行した際に、

```
AH00558: apache2: Could not reliably determine the 
server's fully qualified domain name, using 127.0.1.1. Set 
the 'ServerName' directive globally to suppress this message
```

のエラーメッセージが表示された。
###原因
どうやらデフォルト状態では、自分で設定したホスト名は、Apach2の設定ファイルに定義されていないことから発生している原因らしい・・・
#解決方法
ホスト名を書いたviエディターを作成してあげることで解決！

```
ホスト名の確認
$ hostname
ubuntu （←人によって違うかも）

カレントディレクトリに移動
$ cd /etc/apache2/conf-available/

新規ファイルの作成
$ sudo touch fqdn.conf

viエディターの起動
$ sudo vi fqdn.conf

書き込み
ServerName ubuntu　（←先ほどのhostnameコマンドで出てきた名前）

設定を有効化
$ sudo a2enconf fqdn

再度読み込み
$ sudo service apache2 restart
```
viエディターの扱いはちょっと変わってるので普段使わない人は調べることをお勧めします。
#解決
上記解決方法を実行後再度Apacheの稼働を確認するためコマンドを入力

```
$ sudo apache2ctl configtest
Syntax OK
```
このように表示されれば大丈夫そう
#参考
問題の原因と解決方法
https://help.ubuntu.com/community/ApacheMySQLPHP#Troubleshooting_Apache

viエディターの利用方法
https://prev.net-newbie.com/linux/commands/vi.html
クラウドの実務未経験でもAWS SAAに1.5ヶ月で合格した話

AWSのSAAの合格体験記です。
これから取ろうとしている人の参考になればいいなと思い、記事投稿します。

# 取ろうと思ったきっかけ
## 新しい技術に触れてみたかったから
オンプレでやってたことがポチポチやるだけで実装できちゃうなんて、近未来的で楽しくないですか？

## 自身のスキルアップのため
クラウドに触れたこともないエンジニアであることに危機感を感じました。
「じゃあクラウド使う現場に行けばいいじゃん」って思われるかもしれませんが、そういったところへ行くには大概**クラウド技術の実務経験が必要です。**
クラウドを使う業務に携わるためには、クラウド技術の業務経験が必須級なのです。鶏が先か、卵が先か。みたいな話ですね。。。
このジレンマを破るために武器として、資格を取得しておくという選択肢は、アリなんじゃないかと思います。
世の中には資格否定派の方もいらっしゃると思いますが、持っていないよりマシじゃないでしょうか？
また、インフラ界隈は資格肯定派が多いようにも感じます。
## ~~流行ってるから~~
上記は半分冗談ですが半分本気です。
使われていない技術をいくら一生懸命勉強したところで、価値に繋がりにくいと思います。

# 受験当時の私について
- インフラエンジニア歴2年(オンプレ。設計経験無、構築経験少。)
- 23歳
- LPICレベル1持ってる

といった感じで、あまり技術力は高くない方だと思います。
凡人でも取れる！って皆様の自信に繋がればいいなと思います。

# 取得に向けてやったこと
## 計画
まずは計画を立てましょう。2ヶ月以内に取るぞ！でも何でもいいので。期日を決めておかないとズルズル引き伸ばしやすいですし、長引くと最初の方に覚えたことはどんどん忘れていきます。
目安としては1〜2ヶ月くらいでいいんじゃないでしょうか。
私は一ヶ月を目標にしました。

## 勉強
計画を立てたらそれに間に合うように勉強しました。

まずはとりあえず本を買って勉強しました。
[この１冊で合格！　AWS認定ソリューションアーキテクト - アソシエイト テキスト&問題集](https://www.amazon.co.jp/dp/B07VFFX6V1/ref=cm_sw_r_tw_apa_tVwkFb03WP7CG)
本は自分が読みやすければどれでもいいんじゃないかと思います。
また、本だけだとインプットだけになってしまい、定着しずらいため、qiitaにアウトプットしました。
ここで気をつけたことは、「記事のクオリティは気にしない」という点です。
自分のメモ書きレベルの物を公開するのはどうしても恥ずかしいため、完成度を上げようと考えてしまいがちですが、ここで投稿する意味は**自分がどこまで理解できているかを把握する**(理解が0%なのか80%なのか100%なのか、自分で文字起こししているうちに気づくことができる)
という点が一番大切なため、完璧じゃなくていいのでどんどん投稿しました。

しかし、本だけだとアップデートに追いついていない場合が多いので、その後、問題集をやってひたすら頭に叩き込むといいと思います。私は[Udemyの教材](https://www.udemy.com/share/101rfMAEMfdVtSRHkF/)を使いました。

また、わからないことがあったらAWSの公式ドキュメントを読み込みました。実際に使えるものはハンズオンでやってみたりもしました。
模擬試験は個人的にはオススメしません。解説などがないため、どこでどう間違ったか、分かりづらいです。金銭的余裕がある人は本番の感覚がつかめるので受けてみるのもありかもしれません。

# どうなったか
2月頭から学習し、3月中旬にて無事合格できました。
点数は788でした。720で合格なので、まああまり余裕はなかったですが合格です。
一応、すべての分野で「十分な知識を有する」の評価でした。

# 所感
周りではAWSは難しい難しい言われていたので、うわぁ、、、って思ってましたが、実際に勉強したり触ってみると、意外とそんなことありませんでした。先入観で入ると損します。

また、受けてみて、いろんな技術に触れていくうちにどんどん学習意欲が湧き出てきました。この後、Dockerを使ってEC2にアプリをデプロイしたりなどいろいろな技術に実際に触れていきました。
今はまだ技術力が未熟でも、磨いて、つよつよエンジニアになりたいと思いました。
そのための第一歩として大きく踏み出せたんじゃないでしょうか。

# 余談:なんでAzureやGCPじゃないの？
一番シェアが高いから選びました。
プログラミングでよく言われる「1つ目の言語を習得した後の、2つ目の言語の習得は早い」と同じ理論です。
AzureやGCPも、名前は違うだけでAWSとほぼ同じサービスってのがたくさんあります。であれば、qiitaなどでも一番参考文献の多いAWSから取得するのがスムーズだと思います。

~~また、今の会社で資格手当出してくれるのが上記の中でAWSだけだったからってのもあります。~~


以上となります。ご質問、ご指摘等ありましたらコメントいただけると幸いです。
一瞬で正確にファイル検索を行う方法_改

**高性能なHDD内の検索ソフトを探している人**
Windowsのファイラーであるエクスプローラーの右上の検索機能って
使えないなぁと思う方はこちらを参考にして下さい。

## 本記事の内容
* おすすめソフト「Everything」について
* 特徴
* 追加メリット
* インストールについて

## おすすめソフト「Everything」について
私がおすすめする「Everything」はインデックス型の検索ソフトです。
速度・精度ともにエクスプローラーの検索機能であるwindows searchとは段違いの性能です。
別途インストールする必要があるため、ファイラーとしては切り離して使用する必要がありますが、
自分のHDD内にある全てのファイルの中から指定された言葉のファイルを超高速で検索することが
可能になります。

## 特徴
windows searchでの検索がどの程度の時間がかかるかはそのPCにより大幅に左右されてしまい、
場合によっては検索終了するまでに数分かかってしまうなんてこともあるかと思いますが、
Everythingでの検索を行う場合はほぼ1秒のラグもなく検索が終了します。
これに加えてwindows searchの何故か検索できない事象もEverythingでは今の所
確認していませんので、その点においても優秀です。

## 追加メリット
更に便利ポイントとしてEverythingはネットワーク上の共有フォルダであっても
自分のHDDとほぼ変わらぬスピードで検索をすることが可能です。
指定方法は下記の通り「ツール」→「オプション」のメニューから赤丸で示したように
検索したいフォルダを指定するだけ。
windows searchで検索していたら数分どころで終わらないこともEverythingなら一瞬です。

![参考画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675167/3b148e14-7565-708c-d741-cd2be750c943.png)

## インストールについて
ダウンロードは下記から可能です。インストール時に特別初期設定を変更する必要ありません。
https://forest.watch.impress.co.jp/library/software/everything/
21行のシンプルなvimプラグイン管理

Vim標準のパッケージマネージャを使いやすくするスニペットです。

## 特長

* コマンド`:PackGet`を実行すると、GitHub上のプラグインをインストールできます。
  * 実行例: `:PackGet 'tpope/vim-surround'`
  * `.vimrc`に`PackGet 'tpope/vim-surround'`のように書いておけば、起動時にプラグインを自動インストールしてくれます。
* パッケージ管理プラグインを導入する手間がありません。
  * dotfilesにvimの設定を書きやすくなります。

## スニペット

```vim:.vimrc
function! InstallGithubPlugin(id, kind)
    let l:idary = split(a:id, '/')
    let l:local = split(&rtp, ',')[0] . '/pack/github/' . a:kind . '/' . l:idary[1]
    if !isdirectory(l:local)
        call mkdir(l:local, 'p')
        silent exec ':!git clone --depth 1 https://github.com/' . a:id . '.git ' . l:local
        packloadall!
        redraw!
    endif
endfunction
function! UpdatePlugins()
    for d in split(glob(split(&rtp, ',')[0] . '/pack/github/*/*'), '\n')
        silent exec ':!git --git-dir=' . d . '/.git reset --hard HEAD'
        silent exec ':!git --git-dir=' . d . '/.git pull'
    endfor
    packloadall!
    redraw!
endfunction
command! -nargs=1 PackGet     call InstallGithubPlugin(<args>, 'start')
command! -nargs=1 PackGetLazy call InstallGithubPlugin(<args>, 'opt')
command! -nargs=0 PackPullAll call UpdatePlugins()
```

## 注

* GitHub上にあるプラグインのみ対応しています。
* Gitのブランチやコミットは指定できません。
* インストール後に操作が必要なプラグインは、手動でしないといけません。
  * たとえば`junegunn/fzf.vim`の場合、インストール後に `fzf#install()`を手動で実行する必要あり。
* Ubuntu, Windowsで動作確認してます。

## その他の機能

* コマンド`:PackPullAll`を実行すると、インストール済みのパッケージを最新にします。
* プラグインの遅延読み込みは、コマンド`:PackGetLazy`でできます。
  * 例えば goファイルを開いたときに`fatih/vim-go`を読み込みたい時など

## 例

```vim:.vimrc
" 起動時に読み込むプラグインは、以下のように一行で書けます。
PackGet 'tpope/vim-repeat'
PackGet 'tpope/vim-surround'

" 遅延読み込みするプラグインは、以下のように必要に応じて設定してください。
PackGetLazy 'fatih/vim-go'
augroup au_PackGetLazy_go
  autocmd!
  autocmd FileType go packadd vim-go
augroup END
```
【PHP・laravel】クエリパラメータを送る時まとめ(getとrequest) 

初歩的なことですが、調べてもなかなか出てこなかったため、記録します。
#HTMLからPHP側に送る

```sample1.laravel.php
<a harf="http://ここがURL?suji=1">送信</a>
```

```sample2.laravel.php
<a harf="http://ここがURL?moji='文字'">送信</a>
```

php側

```index.php
$get1 = $_GET['suji'];//1
$get2 = $_GET['moji'];//'文字'
```

#PHP内のやり取り(関数から関数)
####数値や文字を送るとき

```index.php
function a(){
  redirect('/b?suji=1');
}

function b(){
  $request1 = $_REQUEST['suji']//1
}
```

```index.php
function a(){
  redirect("/b?moji='文字'");
}

function b(){
  $request2 = $_REQUEST['moji']//文字
}
```

####変数を送るとき

```index.php
function a(){
  $count = 2;
  redirect('/b?count='.$count);
}

function b(){
  $request3 = $_REQUEST['count']//2
}
```
Pythonプログラミング：Qiita記事のタグからWordCloudを描画してみた

# はじめに

前回の記事([Windows10のPCに分析環境（Python3＋JupyterLab）を作ってみた](https://qiita.com/Blaster36/items/3b1879a72b54619cb669))で、分析環境はとりあえず整備完了。
待ちに待った、Pythonプログラミングを開始！

今回はWordCloudを描画します。WordCloud自体は[こちら](https://qiita.com/str32/items/4539e417a9cb333abd52)を参照のこと。

最終的に、以下のようなモノを作ります。
![trends_of_qiita_wordcloud_shortver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685193/95e5196d-847d-c7c3-9105-416b74c3c592.png)


## 本稿で紹介すること

- Qiita APIからの記事情報の取得
- WordCloudの描画

[Qiita API v2ドキュメント](https://qiita.com/api/v2/docs)
[WordCloud for Python documentation](https://amueller.github.io/word_cloud/index.html)

## 本稿で紹介しないこと

- Pythonライブラリの使い方
  - requests
  - json
  - wordcloud
  - pathlib

# サンプルコード

Code量も多くないので、全体のCodeを紹介。
ポイントは2つ。

##### 1. GETリクエストを実行する際、アクセストークンを指定
[Qiita API v2ドキュメント](https://qiita.com/api/v2/docs)に以下の記載があるように、アクセストークンを取得し、Codeに埋め込むのがベター。
>利用制限
認証している状態ではユーザごとに1時間に1000回まで、認証していない状態ではIPアドレスごとに1時間に60回までリクエストを受け付けます。

##### 2. イメージを描画する際、日本語対応フォントを指定
[WordCloud for Python documentation](https://amueller.github.io/word_cloud/index.html)に以下の記載があるように、自然言語処理で日本語を扱うため、日本語対応フォントを（適宜インストールして）指定するのがベター。
>font_path：string
Font path to the font that will be used (OTF or TTF). Defaults to DroidSansMono path on a Linux machine. If you are on another OS or don’t have this font, you need to adjust this path.

```python:analyzeQiita_WordCloud
import requests
import json

url = 'https://qiita.com/api/v2/items?per_page=100&page='
headers = {'Authorization': 'Bearer ${YOUR ACCESS-TOKEN}'}

tags = []
for i in range(5):
    print('=====')
    print('Downloading ... ' + url + str(i+1))
    print('-----')
    #response = requests.get(url + str(i+1))
    response = requests.get(url + str(i+1), headers=headers)

    for article in json.loads(response.text):
        print(article['title'])
        tags.extend([tag['name'].lower() for tag in article['tags']])
    print('=====')

from wordcloud import WordCloud
from pathlib import Path

result_dir_path = Path('..').joinpath('result')

#分割テキストからwordcloudを生成・フォント指定
wc = WordCloud(font_path=r"C:\WINDOWS\Fonts\YuGothR.ttc", background_color='white', colormap='bone', width=800, height=600)
wc.generate(" ".join(tags))
wc.to_file(result_dir_path.joinpath('trends_of_qiita_wordcloud_shortver.png'))
```
![trends_of_qiita_wordcloud_shortver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685193/95e5196d-847d-c7c3-9105-416b74c3c592.png)

Pythonと（色は薄いが）JavaScriptのタグを付与した記事が多い模様。

# まとめ
Qiita記事のタグを使って、WordCloudを描画する方法を紹介。
RuboCop Airbnbを導入してみた

## Rubocop とは
RubocopはRuby(Rails)で書かれたコードがコーディング規約に遵守されているか
チェックしてくれる静的コード解析ツール

## RuboCop Airbnb とは
airbnbの開発で使用されたRubocopの設定

## 導入
Gemfileのdevelopmentグループに以下のgemを追加してください。

```ruby:Gemfile
group :development do
  gem 'rubocop-airbnb'
```
ターミナルでbundle installを実行してください。

## 設定
アプリケーションフォルダの直下に.rubocop.ymlと.rubocop_airbnb.ymlファイルを作成してください。

```yml:.rubocop.yml
inherit_from:
  - .rubocop_airbnb.yml
#ここにはrubocopで検証したくないファイルやフォルダを指定
AllCops:
  Exclude:
      - 'db/**/*'
      - 'bin/*'
      - 'config/environments/*'
      - 'config/application.rb'
      - 'config/initializers/*'
      - 'config/spring.rb'
      - 'lib/tasks/*'
      - 'vendor/**/*'
```

```yml:.rubocop_airbnb.yml
require:
  - rubocop-airbnb
```

## 実行
ターミナルで以下のコマンドを実行

```
bundle exec rubocop --require rubocop-airbnb
```

## 自動修正
実行コマンドに -a/--auto-correct のオプションをつけると違反箇所を自動修正してくれる。

```
bundle exec rubocop --require rubocop-airbnb -a
```

※ 全ての違反箇所を修正してくれる訳ではないです。
自動修正が安全でない場合、対象から除外されます。

> For some offenses, it is not possible to implement automatic correction.
If a cop or its auto-correct is annotated as "not safe", it will be omitted when using .

## 参考サイト
[GitHub rubocop-airbnb](https://github.com/airbnb/ruby/tree/master/rubocop-airbnb)
[RuboCop//Docs](https://docs.rubocop.org/rubocop/usage/auto_correct.html)
[rubocop−airbnbを使うにあたって](https://qiita.com/harukikaneko/items/3a1b27cfd3ccb896b18c)
SourceTree が MacBook Pro を暴走させた


突然 Mac の CPU 使用率が上がって 100% 近くになった。

アクティブモニターの全てもプロセスを見たら、securityd というプロセルが専有していた。

SourceTree で新しい Backlog スペースの Git から Clone を使用としたときに、なにか KeyChain との連携が失敗したっぽい。

まず、ローカルで init した git レポジトリに、今まで一度もつなげていなかった Backlog  remote git を追加して fetch / push しようとしても、うまくできず。

Terminal から git fetch したら解決。新しい Backlog スペースの fingerprint の許可が　 SourceTree からできなかったよう。

しかし、CPU の暴走は止まらず、MacBook Pro を再起動してもダメだった。。

仕方がないので、アクティビティモニターより securityd のプロセスを強制終了。

KeyChain より SourceTreeLogin プロセスが KeyChain にアクセスしたがっているから許可するか？というダイアログが出た。一度、パスワードを入れて許可した。

そうすると CPU の暴走が続いたので、今度はプロセスの強制終了後に、パスワードいれずにキャンセル。

CPU の占有率が下がる。

SourceTree も問題なく起動し、利用できるみたい。

おそらく、SourceTree のバグなのかな？
PyTorchの画像処理モデルの層を簡単に理解する方法

私は、TensorFlowを割とよく使っていますが、PyTorch最近やってみたいと思って勉強し始めました。新しいライブラリを身に着けようとするとまずはわかりやすい事例の解釈から始めるのが基本だと思います。深層学習の場合は、やっぱり簡単な畳み込みネットワークから始めるのがいいと思います。PyTorchのTutorialページでLeNetというモデルの実装があるのでそれを使ってみて勉強を始めました。(https://pytorch.org/tutorials/beginner/blitz/neural_networks_tutorial.html#sphx-glr-beginner-blitz-neural-networks-tutorial-py)

ただ、途中で各層はどのようにデータを処理しているや出力の形などを確認したくなるので単純にセットアップして回すだけでなんかもの足りないですね。天才開発者だったらnn.Conv2の設定をみて32x32がどのように処理されるの頭の中でイメージできるかもしれませんが、僕は天才じゃないのでどうしても中間の形を見たくなります。

他のもっと効率いい方法はあるかもしれませんが、僕はこの方法で確認しています。説明のためPyTorchのnn.Conv2d層を使います。まず、ipythonを開きます。そして必要なライブラリをインポートします。

```python
import torch # PyTorchをインポート
import torch.nn as nn # conv2dが存在する
```

その後は、nn.Conv2dを定義します。このconv2dの設定は、上記話したLeNetの最初の層です。

```python
# 入力は1つのチャネル、出力は6つのチャネル、カーネルは3x3
conv1 = nn.Conv2d(1, 6, 3)
```

そうして想定している入力のダミーデータを作成します。LeNetの入力は 32x32 なのでそのディメンションで作成します。後は、黒白の画像なはずなのでチャネルは一つだけです。

```Python
# 1つの画像 (batch_size = 1), １つのチャネル、32x32のイメージ
x = torch.randn(1, 1, 32, 32)
```

層を定義してダミーデータを作成しましたので、後はにデータを層に渡すだけです。

```Python
x = conv1(x)
```

Conv2dドキュメンテーションにあるShapeの出力サイズ (Hout, Wout) の関数はこれです。(https://pytorch.org/docs/master/generated/torch.nn.Conv2d.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686250/640ea5c4-13fe-5d67-8b50-5ef7aa929656.png)

少し複雑に見えるかもしれませんが、HinとWinは入力する際の縦と横のサイズです (32x32)。今回はPaddingを使ってないので 0 です。ドキュメンテーションで確認するとdilationとstrideを設定しないと 1 になります。Kernelサイズは上記のConv2dを設定した時に 3x3 にしましたので kernel_size[0] と kernel_size[1] はどちらも 3 です。

全部関数にいればこうなります： 

H = ((32 + 0 - 1 x (3 - 1) - 1) / 1) + 1 = ((32 - 3) / 1) + 1 = 30
W = ((32 + 0 - 1 x (3 - 1) - 1) / 1) + 1 = ((32 - 3) / 1) + 1 = 30

この計算によると私たちが想定している出力の形は (1, 6, 30, 30) です。30, 30 は先計算した HoutとWoutです。6はConv2で設定した出力チャネル数です。そして、一つのイメージしか入力してないので、出力も一つだけです。

出力の形Shapeプロパティーを呼ぶと確認できます。確かに上記の計算は正解でした。

```python
x.shape # (1, 6, 30, 30)
```

この方法は、Conv2dに限られてなくて基本的にどの層でも試せます。例えばLeNetでConv2dの後にくるmax_pool2dの出力も同じように確認できます。各層で何が起こっているか確認したい時に役に立ちます。
bcryptでプレーンテキストをハッシュ化させる

##ハッシュ化のメリット
・パスワードなどをデータベースに保存する時、プレーンテキストのまま保存すると脆弱性に繋がる。

・ハッシュ化したメッセージダイジェストから、元のメッセージを復元することは困難
→「インクリプション」…元のメッセージをとっておいて、それをハッシュ化したら同じハッシュ値になるかチェックすることで、同一性を確認する仕組み

##bcryptパッケージ
[bcrypt](https://www.npmjs.com/package/bcrypt)というnpmパッケージを利用すると、プレーンテキストをハッシュ化することができる。

<h6>・bcryptパッケージの使い方</h6>

```javascript
const bcrypt = require('bcryptjs')

const myFunction = async() => {
const password = "password1234"

const hadhedPassword = await bcrypt.hash(password, 8) //第一引数：ハッシュ化したい値、第二引数：roundをかける回数。公式推奨は８回

console.log(password) //元のパスワードを表示
console.log(hassedPassword)　//ハッシュ化されたパスワードを表示

//元のパスワードとハッシュ化されたパスワードを比較し、同じものであるか確認

const isMarch = await bcrypt.compare('password', hashedPassword)

}

myFunction()

```

##値をハッシュ化させてからデータベースに組み込む

●Middlewareを利用してMongooseの振る舞い方をカスタマイズできる


[Mongoose公式ドキュメント](https://mongoosejs.com/docs/middleware.html#order)
「Middleware > Save/Validate」の項目
<img width="906" alt="スクリーンショット 2020-08-04 22.35.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595580/47feee00-7fff-9ecd-c034-75506d4e8036.png">

・validateする前、または後にイベントを設定できる。
・saveする前、または後にイベントを設定できる。

→save()する前に、データベースに保存したい値をハッシュ化させることができる。

●例）
データベースに格納する前にpasswordをハッシュ化

```javascript
const mongoose = require('mongoose')
const bcrypt = require('bcryptjs') 

const userSchema = new mongoose.Schema({
    name: {
      type: String,  //データ型の設定
      required: true,
      trim: true
  },
  password:{
      type: String,
      required: true,
      }
  })

//middlewareを記述。saveする前にプレーンテキストをハッシュする
userSchema.pre('save', async function(next){ //アローファンクションは使わない。このbindingは大事な役割を果たすものだから
  const user = this

  console.log('Middleware is working')//ミドルウェアが動いているか確認するためのテストコード

  if(user.isModified('password')){　//ハッシュ化されていないパスワードがある時
    user.password = await bcrypt.hash(user.password, 8)
  }//ここで値がハッシュされる

  next()
})

```
dockerでspringbootを動かす。

java８が使えるコンテナを起動

```
docker run --net host -it --rm openjdk:8 bash
```
https://hub.docker.com/_/openjdk?tab=description&page=1&name=8-

gradleをinstall

```
$ curl -s "https://get.sdkman.io" | bash
$ source "~/.sdkman/bin/sdkman-init.sh"
```
https://qiita.com/uhooi/items/c9caa9a9ed6c934a789b

ソースコードをinstall

```
git clone https://github.com/spring-guides/gs-spring-boot-docker.git
```

https://spring.pleiades.io/guides/gs/spring-boot-docker/#initial

ビルドして実行

```
cd gs-spring-boot-docker/initial
./gradlew build && java -jar build/libs/gs-spring-boot-docker-0.1.0.jar
```

https://spring.pleiades.io/guides/gs/spring-boot-docker/#initial
API GatewayのマッピングテンプレートでBodyのJSONを書き換える

API GatewayにPOST/PUTされてきたJSONのBody(`$input`)を、マッピングテンプレートで中身を少しだけ書き換えてバックエンドへProxyしたい時：

```
#set($body = $input.path('$'))
#set($body.url = "https://example.tld/thingy/$body.id")
$input.json('$')
```

これだけで`url`属性が`#set`で指定したURLに置き換わった状態のJSON文字列が生成される。

`#set`での属性置き換え後、最後にJSON文字列化する部分が`$body.json('$')`では **ない** 点に注意。`.json('$')`は`$input`にしか定義されていない。

すべて参照渡しでまぁJavaScriptみたいなもんだよと言われれば、この使い方も、そんな気もしなくもないが、それにしても、

**わかりにくすぎない！？**

たったこれだけのことをするのに1日潰れてしまった……。

ref:

* https://stackoverflow.com/questions/47692542/adding-a-key-value-pair-to-an-object-in-vtl-for-api-gateway
* https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html
【Git】Are you sure you want to continue connecting (yes/no/[fingerprint])?

GitHubでssh方式でファイルを作成した時のエラー

```The authenticity of host 'github.com (52.192.72.89)' can't be established.```

```Are you sure you want to continue connecting (yes/no/[fingerprint])?```

要するに既存でこのホスト？はないから信憑性がないよって
このまま接続を続けても大丈夫ですか？

とのことでした。

わからずEnter押しててこのループから抜け出せず...

エラーの英語は部分部分でもしっかり読んでいこうと思います。

ちなみにこのエラーが出ないようにすることもできるらしいですが、いったんそこは飛ばします。
存在量化がやっとわかった

# はじめに

存在量化の記事はたくさんあって既に二番煎じとなっていますが、
ようやく存在量化がわかったのでメモとして残しておきます。 [^1] 

間違った知識があると思うので、その時は訂正お願いします

[^1]: https://qiita.com/sparklingbaby/items/fa80df035cff85eb0960
      
      https://kazu-yamamoto.hatenablog.jp/entry/20080828/1219888005

     https://ja.wikibooks.org/wiki/Haskell/存在量化された型

## optparse-applicative

Haskellでcli toolを作る場合まずはこれを使う事が多いと思います。

`optparse-applicative` で`sub command`を作成する時は

```haskell

data Command
  = Add AddOptions
  | Commit CommitOptions
  ...
```
のようなdataを定義します。


続いて実行関数を定義します。

```haskell

run :: Command -> IO()
run (Add a) = ... 
run (Commit c) = ...
```

これで全然問題ないのですが、`sub command`が多くなってくるとコマンドをモジュールで管理したくなります。

## 型クラスで定義する

`run`は共通の振る舞いをするので、型クラスを定義します。

```haskell
class Runner a where
  run :: a -> IO()
```

次に、対応するdataと`instance`を定義します。

```haskell

newtype AddRunner = AddRunner AddOption

instance Runner AddRunner where
  run (AddRunner a) = ...

newtype CommitRunner = CommitRunner AddOption

instance Runner CommitRunner where
  run (CommitRunner a) = ...
```

## 対応するdataで変換する

ここで代数的データ構造から対応する`data`に変換したいのですがここで問題が発生します。

```haskell

converter :: Runner r => Command -> r 
converter (Add a) = AddRunner a -- コンパイルエラー
　...
```

のように書きたいのですが、コンパイルエラーとなってしまいます。

## ExistentialQuantification

これを解決するのが、`ExistentialQuantification`拡張です。

`Runner`クラスを内包するWrapRunnerを新たに定義します。

```haskell
{-# LANGUAGE ExistentialQuantification #-}

data WrapRunner = forall a . Runner a => WrapRunner a
```

`WrapRunner`は代数的データ構造から変換かけることができます。

```Haskell 
converter :: Cmd -> WrapRunner
converter (Add a) = WrapRunner $ AddRunner a
converter (Commit c) = WrapRunner $ CommitRunner c
```

さらに`Runner`のinstanceにもできます

```haskell
instance Runner WrapRunner where
  run (WrapRunner wr) = run wr
```

これでようやくデータの振る舞いを型で定義する事ができました。

## GADTs

`GADTs`で定義されているとします

```haskell

data GCmd a where
  GAdd :: AddOption -> GCmd String
  GCommit :: CommitOption -> GCmd ()

run :: GCmd a -> IO a

```
その時対応する型クラスは以下のようになると思います

```haskell
{-# LANGUAGE TypeFamilies #-}

class Runner a where
  type RType a
  run :: a -> IO (RType a)

instance Runner AddRunner where
  type RType AddRunner = String
  run (AddRunner a) = ...

instance Runner CommitRunner where
  type RType CommitRunner = ()
  run (CommitRunner c) = ...
```

これに対応するWrapデータをするには
type RType a に対応するデータを定義すればできます

```haskell
data WrapRType = forall a . WrapRType a

instance Runner WrapRunner where 
  type RType WrapRunner = WrapType 
  run (WrapRunner wr) = WrapType <$> run wr

```

## 最後に

型クラスを使っての動的解析の仕方がわかったあまりに記事にしましたが、これが正しいやり方であったり、ベストプラクティスであるかは正直分かりません。

ただ今回のおかげで存在量化の理解が進みました。次は`DataKinds`等を使いこなせるようにしたいです
フォーマット[書式]指定子の使い方。(%s, %d, %iなど)

#フォーマット指定子の使い方(%s, %d, %iなど)

フォーマット指定しとは％と特定のアルファベットからなる記述方式。

C言語、JS、PHP、Pythonなど様々な言語で使われている。

巷では色々な呼び名がある様子。
フォーマット指定子、書式指定子、書式化文字列、書式化演算子など、、

##主要なフォーマット指定子

| フォーマット指定子 | 意味 |
|:--|:--|
| %s  | 文字列  |
| %d  | 10進数  |
| %i  | 整数  |
| %f  | 浮動小数点 |
| %j  | JSON  |


##フォーマット指定子の使い方
▼jsの例
console.log('new: %s, old: %s',newValue, oldValue)
iPhoneアプリの中に接触確認アプリへのリンクを置いたら審査で却下された件

COVID-19に関するアプリは、政府組織、健康に特化した民間公益団体等社会に認められた組織からの提出しか認めないことを、アップルは述べています[（参照）](https://developer.apple.com/jp/news/?id=03142020a)。

>このような期待値を満たすために、データソースが信頼できるものであるか、また政府組織、健康に特化した民間公益団体、健康問題に関して資格や実績のある会社組織などの社会に認められた組織によって提供されているAppであるかを注意深く評価します。COVID-19に関するAppは、これらの組織からのみ提出が可能です。COVID-19をテーマとしたエンターテイメントやゲームといったAppは許可されません。

個人がCOVID-19に関するアプリをリリースすることはできません。

では、厚生労働省が公式に出している「新型コロナウイルス接触確認アプリCOCOA」のAPPストアのページへのリンクを自前のアプリの中に配置するのはどうでしょうか。

やってみましたが、結論から言うと、これも駄目なようです。
以下がその経緯です。

##### 審査提出１回目

アプリの中に置いたリンクの様子
<img width="398" alt="スクリーンショット_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101774/849e3175-d092-e7aa-fcf6-21fac36b763c.png">
ポチるとAPPストアのCOCOAのページが開きます。

審査に提出したところ、却下されました。
却下の理由は次のとおり。

>Guideline 1.1 - Safety - Objectionable Content
>
>We found that your app includes content or concepts that some users may find upsetting, offensive, or otherwise objectionable.   Specifically, your app’s metadata or binary include inappropriate references to the COVID-19 pandemic. 

その日本語訳（グーグル翻訳）

> ガイドライン1.1-安全性-不快なコンテンツ
>
> アプリには、一部のユーザーが動揺、不快、またはその他の不快感を感じるコンテンツまたは概念が含まれていることがわかりました。 具体的には、アプリのメタデータまたはバイナリに、COVID-19パンデミックへの不適切な参照が含まれています。

また、COVID-19に関連しない、ガイドラインに沿ったアプリを歓迎しますともありました。

##### 審査提出２回目

１回目が”不適切な参照"ということですが、表現がざっくり過ぎて紛らわしかったのかもしれないと思い、表現を変えて再度提出しました。
それがこちら
<img width="388" alt="スクリーンショット_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101774/8a9126d1-65cf-1060-c72c-bd5e80dee340.png">
しかし、これも全く同じ理由で却下されました。
ということで、COVID-19関連については、リンクを置くことも駄目のようです。

##### 審査提出３回目

リンクを削除して提出したら審査通りました。


##### 審査等にかかった時間

|            |提出から審査開始|審査開始から結果発表|
|:-----------|:-----------:|:---------------:|
|審査提出１回目|29時間44分|33分|
|審査提出２回目|55時間34分|1時間59分|
|審査提出３回目|3時間50分|9分|

２回目の審査時間が長いですが、内容を吟味していたのでしょうか？
もしそうなら、やりようによっては審査を通せる可能性もあるのかな？
git@github.com: Permission denied (publickey) が出た時の解消法

新しいリポジトリを作成し、git pushしようとしたら以下のエラーが出てきて、pushがうまくいかなかった。

```
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

前にも見たことがあったけど、どうやって対処しようかググってたが、結構対処法が散らばっていたので、備忘録としてまとめておく。
よく見かけたのは
http://tusukuru.hatenablog.com/entry/2018/08/29/021651
のような感じで、ssh-keygenを行ってid_rsaを作成するものだが、今回は他のアカウントも持っていたので、別名で公開鍵・秘密鍵を作成したかった。

## 1. .ssh/configの修正

`vim ~/.ssh/config`

```
# 元々あったやつ
Host github.com
  HostName github.com
  IdentityFile ~/.ssh/id_rsa
  User git

# 今追記したやつ
host github-hogehoge
  hostname github.com
  IdentityFile ~/.ssh/id_rsa_github_private
  User hogehoge
```
[ここ](https://qiita.com/hatorijobs/items/92d8df363020a7f6d9fb)にも書いてありますが、この`hogehoge`がgithubのアカウント名となります。
`id_rsa_github_private`は作成する秘密鍵のファイル名となります.名前はなんでも大丈夫です。

## 2. 鍵の作成

```
ssh-keygen -t rsa -C hoge@example.com -f id_rsa_github_private
```
`hoge@example.com`にはgithubで使用しているメールアドレスを入力します。

パスワードを入れるかenterを押すなりして進めます。
`id_rsa_github_private`がカレントディレクトリにあると思うので、~/.ssh/の方に移動しておきます。

```
mv id_rsa_github_private* ~/.ssh/
```
これで~/.ssh/配下に必要なものが揃いました。

```
% ls ~/.ssh/
config				id_rsa.pub			id_rsa_github_private.pub
id_rsa				id_rsa_github_private		known_hosts
```

## 3. githubの方に公開鍵を設定
https://github.com/settings/profile
のSSH keys に new ssh keyから新しい鍵を登録します。
keyの中に`~/.ssh/id_rsa_github_private.pub`の内容をコピペします。

以下のコマンドを実行すると接続確認が取れます。

```
% ssh -T git@github-hogehoge
Hi hogehoge! You've successfully authenticated, but GitHub does not provide shell access.
```

## 4. git pushをする
今回はgit pushをしようとしたときにエラーが出ていました。cloneの場合は[ここ](https://qiita.com/hatorijobs/items/92d8df363020a7f6d9fb) を参考にすると良いかと思います。
pushする際にremote addをする必要がありますが、そのときに

`git remote set-url origin git://git@github.com:hogehoge/repository.git`
となっていますが、これではなく、

```
git remote set-url origin git://git@github-hogehoge:hogehoge/repository.git
```
となります。(repositoryのところは作成したリポジトリ名となります)

これで、`git push origin master` をするとうまくpushされました :tada:
zshのコマンド

<h1>初めて投稿します。zshのコマンドがわかりません。</h1>
<sub>今日はzshのMacbook Pro OS Catlinaで、Angularをインストールしてみました。</sub>
<p>結論からターミナルに使うコマンドがCPUから拒否されました。</p>
<p>試してみたコマンドは以下のものです。</p>
<p>ls→cd file name→%→npm install→command not found</p>→ 
<p>commnad not foundわかりません。</p>なので、npm i-g→sudo npm i-g
<p>とインストールを試みてみます。</p>
「E: ロック /var/lib/dpkg/lock-frontend が取得できませんでした - open (11: リソースが一時的に利用できません)」というエラーの対処法

aptコマンドが以下のようなエラーで停止することがある。

```
a@ubuntu:~$ sudo apt upgrade
E: ロック /var/lib/dpkg/lock-frontend が取得できませんでした - open (11: リソースが一時的に利用できません)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
```

他のプロセスが使っていると思われる（another process is using it）。特にパッケージマネージャがバックグラウンドで実行されているものと思う。上記のlock-frontendというファイルを開いているプロセスをlsofコマンドで探す。

```
a@ubuntu:~$ sudo lsof /var/lib/dpkg/lock-frontend
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
unattende 3056 root    5uW  REG    8,1        0 804581 /var/lib/dpkg/lock-frontend
```

psコマンドでプロセスを探す。

```
a@ubuntu:~$ ps aux | grep apt
root       3023  0.0  0.0   4624   780 ?        Ss   21:54   0:00 /bin/sh /usr/lib/apt/apt.systemd.daily install
root       3027  0.0  0.0   4624  1728 ?        S    21:54   0:00 /bin/sh /usr/lib/apt/apt.systemd.daily lock_is_held install
root       5732 72.0  2.5 175480 102204 ?       RN   21:55   0:00 /usr/bin/python3 /usr/lib/update-notifier/apt-check --human-readable
a          5740  0.0  0.0  15448  1052 pts/0    S+   21:55   0:00 grep --color=auto -i apt
```

今回の場合は、3分ほど待ったらこのプロセスが停止して apt コマンドが使えるようになった。
それでも上手くいかない場合は再起動を試し、さらに以下のlinuxuprising.comにある方法をとると良いと思う。

# 参考ページ
- [Ubuntu Community Help Wiki - Troubleshooting](https://help.ubuntu.com/community/Troubleshooting#Software_Management) @ubuntu.com
- [Ubuntu Community Help Wiki - Package Manager Troubleshooting Procedure](https://help.ubuntu.com/community/PackageManagerTroubleshootingProcedure) @ubuntu.com
- [How To Fix "Could not get lock /var/lib/dpkg/lock - open (11 Resource temporarily unavailable)" Errors](https://www.linuxuprising.com/2018/07/how-to-fix-could-not-get-lock.html) @linuxuprising.com
SQL*Plus終了時のトランザクションを制御する（Oracle Database 19c)

SQL\*Plus を終了する際に実行中のトランザクションを制御する方法について記述しています。

# SQL\*Plus の設定
COMMIT 文や ROLLBACK 文を実行する以外に、SQL\*Plus にはトランザクションの制御を行う設定がいくつかあります。

## 自動コミット
AUTOCOMMIT システム変数を ON に変更すると、INSERT/DELETE/UPDATE 文が正常に実行されると直ちにコミットされます。デフォルト値は OFF です。

## 終了時のコミット
SQL\*Plus 終了時に実行中のトランザクションをコミットするかロールバックを行うかを設定するシステム変数があります。EXITCOMMIT システム変数を OFF に設定すると、SQL\*Plus 終了時にロールバックが実行されます。デフォルトは ON で、SQL\*Plus 終了時に自動的にトランザクションがコミットされます。

```
SQL> SHOW EXITCOMMIT
exitcommit ON
SQL> SHOW AUTOCOMMIT
autocommit OFF
SQL>
```

# EXIT コマンドの指定
SQL\*Plus を終了する際には EXIT コマンドを実行します。EXIT コマンドに COMMIT または ROLLBACK を指定すると、システム変数 EXITCOMMIT の値を上書きできます。指定しない場合にはシステム変数 EXITCOMMIT の値に従います。

```
SQL> EXIT COMMIT
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.8.0.0.0との接続が切断されました。
$
```

# エラー発生時の設定
SQL\*Plus 内でエラーが発生した時に自動的的に SQL\*Plus を終了する場合は WHENEVER SQLERROR コマンドまたは WHENEVER OSERROR コマンドに EXIT 句を指定します。
EXIT 句に更に COMMIT または ROLLBACK 句を指定しない場合、システム変数 EXITCOMMIT の値が使われます。下記の例では SQL 文のエラーが発生した場合には SQL\*Plus を終了し、実行中のトランザクションは強制的にロールバックします。

```SQL: エラー発生時の挙動
SQL> WHENEVER SQLERROR EXIT ROLLBACK;
SQL> INSERT INTO data1 VALUES (0, 'SUCCESS');

1 row created.

SQL> INSERT INTO data1 VALUES (0, 'FAIL');
INSERT INTO data1 VALUES (0, 'FAIL')
*
ERROR at line 1:
ORA-00001: unique constraint (SYS.PK_DATA1) violated


Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.8.0.0.0
$ echo $?
0
```
【Blender】 Modelingワークスペース×トランスフォーム軸の罠･･･？

# 動作環境
本記事の動作環境は以下の通りです。
 
| 項目             |               環境 |
|:-----------------|:------------------|
| OS               |         Windows 10 | 
| Blender          |               2.82 |

# 本題
Modelingワークスペースのトップ(ヘッダともいう)にはトランスフォーム軸の設定が2箇所ある。



キズモ(表示カーソル)は左の設定が効いていて、Gキーなどのショートカットは右の方の設定のが反映される。
画像は作成中のモデルであるのはあしからず。![軸設定_edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/8ffeada9-3c1c-228c-8e9b-a1f45785714b.png)

![軸設定2_edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/cc567bac-08fb-0240-f213-4289866e1631.png)

嵌ったので備忘録
右の軸設定がビューポートの設定になっていて、ショートカットで使用したときにBlenderのファイルが壊れたのかと思ってだいぶ焦った。
今後、軸が変になったと思ったら疑ってみよう。
【自分用メモ】本番環境への更新[heroku] 


###ハードウェア環境

cloud9
ファイルの変更、application.rbを変更した場合



変更のあったすべてのファイルをステージングします

```
$ git add .
```

ステージングしたファイルをコミットします。

```
$ git commit -m "Update application"
```

以下コマンドでherokuをアップデート（時間掛かります）

```
$ git push heroku master
```
無事　heroku　が更新できました。

###参考記事

@kosugetakashi様の以下記事を参考にさせていただき自分の環境でも動作を確認させていただきました。
https://qiita.com/kosugetakashi/items/35069c9e3ef8220ed1d2
【初心者でもわかる】インライン要素の近くに謎の空白（スペース）ができる原因

# どうも7noteです。よく見ると半角スペースみたいなのが入ってる現象を解説

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

https://naruweb.com/coding/inline_space/
Blobって

#### Blobって
[Blob - MDN Web Docs - Mozilla](https://developer.mozilla.org/ja/docs/Web/API/Blob)
Blob オブジェクトはファイルに似たオブジェクトで、immutable な生データです。データを表す blob は必ずしも JavaScript ネイティブなフォーマットではありません。File インターフェイスは Blob を基礎にしており

[Blob](https://ja.javascript.info/blob)

ArrayBuffer とビューは ECMA 規格、JavaScript の一部です。

ブラウザには、さらに File API に記載されている高水準のオブジェクトがあります。特に Blob です。

Blob はオプションの文字列 type (通常は MIMEタイプ) と blobParts – 一連の他の Blob オブジェクト、文字列や BufferSources から構成されます。


コンストラクタの構文は次の通りです:

```js

new Blob(blobParts, options);
```
blobParts は Blob/BufferSource/String の値の配列です
options オプションのオブジェクト:
type – blob タイプ, 通常は例えば image/png のような MIME タイプです,
endings – blob が現在の OS の改行(\r\n or \n)に対応するように行末を変換するかどうかを意味します。デフォルトでは "transparent" (何もしません)ですが、 "native" (変換する)にすることもできます。


- Blob を base64 にする
URL.createObjectURL の代替は blob を base64 エンコードされた文字列に変換する方法です。

- Image を blob にする
画像、画像の一部、あるいはページのスクリーンショットの blob を作成することもできます。どこかにアップロードするときに便利です。

画像操作は <canvas> 要素を通して行われます:

canvas.drawImage を使って、canvas 上で画像(または一部)を書きます。
blob を作成し、完了時に callback を実行する canvas メソッド .toBlob(callback, format, quality) を呼び出します。

- Blob から ArrayBuffer へ
Blob コンストラクタは、BufferSource を含め、ほぼ何からでも blob を作成することができます。

しかし、低レベルの処理を実行する必要がある場合、FileReader を使って、最も低レベルである ArrayBuffer を取得することもできます。:
レコードのアクティビティ（履歴）を残す

# きっかけ
CMDBのとあるフィールドを間違ってクリアしてしまい、元に戻してほしいという依頼が来たが、
対象テーブルは履歴が取られていないので、何が入っていたか分からなかったという話。

参考にしたドキュメント
https://docs.servicenow.com/bundle/newyork-platform-administration/page/administer/security/task/t_EnableAuditingForATable.html

## プラットフォーム
NewYork

# 変更手順
1.　フォームレイアウトにActivitiesを追加
2.　テーブルの監査（Audit）を有効化
3.　アクティビティに表示させるフィールドを設定

## 1.　フォームレイアウトにActivitiesを追加

フォームレイアウトのスラッシュバケットからActivities(filtered）を探して追加
![スクリーンショット 2020-08-04 20.44.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/d8ae2bea-8b6d-03cb-2705-c7ef46ae14f0.png)

フォームレイアウトについては公式ドキュメント参照
https://docs.servicenow.com/bundle/newyork-platform-administration/page/administer/form-administration/concept/configure-form-layout.html#configure-form-layout

今回、cmdb_ci_comm テーブルのアクティビティを追加しました。
レイアウトを保存すると「監査オンにしましたよ」とメッセージが表示されます。
![スクリーンショット 2020-08-04 21.02.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/c1828e8e-998e-0c20-ef8e-bfaad86c4017.png)

## 2.　テーブルの監査（Audit）を有効化
別のインスタンスではこれだけでは監査が有効にならなかったので、手動で有効化にしました。
System Definition > Dictionry から対象テーブルでフィルタ（例ではcmdb_ci_comm)
Column nameが空のレコードの[Audit]の値を**true**に更新しました。
![スクリーンショット 2020-08-04 21.14.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/3e845142-76da-2546-41aa-642e11f7f49e.png)


試しに[Asset Tag]と[Name]を更新してみましたがActivitiesに出てきませんね。
![スクリーンショット 2020-08-04 21.08.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/54b53ecc-90a4-7532-27c5-55ed798a323f.png)

## 3.　アクティビティに表示させるフィールドを設定
Filter Activityの設定を追加して保存すると表示されるようになりました。
![スクリーンショット 2020-08-04 21.16.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/cfc2e1af-9c80-a57f-8cd7-d08ddb7e7259.png)

変更後アクティビティがこちら
![スクリーンショット 2020-08-04 21.19.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/067d7cc0-41c5-06f7-a9b7-4498b56f079f.png)


アクティビティフィルタの設定は公式ドキュメント参照
https://docs.servicenow.com/bundle/newyork-platform-user-interface/page/administer/form-administration/task/configure-activity-filters.html
【jQurey】ページ読み込みで、画像ランダム表示

ページを読み込みで、画像をランダム表示させるものを作ったので、備忘録として記載します。

htmlは下記通り。

```html
<div class="js-random">
  <p data-group="bnr1" data-num="1"><a href="/"><img src="/img/banner_g1_b1.png" alt=""></a></p>
  <p data-group="bnr1" data-num="2"><a href="/"><img src="/img/banner_g1_b2.png" alt=""></a></p>
  <p data-group="bnr1" data-num="3"><a href="/"><img src="/img/banner_g1_b3.png" alt=""></a></p>
  <p data-group="bnr1" data-num="4"><a href="/"><img src="/img/banner_g1_b4.png" alt=""></a></p>
</div>

<div class="js-random">
  <p data-group="bnr2" data-num="1"><a href="/"><img src="/img/banner_g2_b1.png" alt=""></a></p>
  <p data-group="bnr2" data-num="2"><a href="/"><img src="/img/banner_g2_b2.png" alt=""></a></p>
  <p data-group="bnr2" data-num="3"><a href="/"><img src="/img/banner_g2_b3.png" alt=""></a></p>
  <p data-group="bnr2" data-num="4"><a href="/"><img src="/img/banner_g2_b4.png" alt=""></a></p>
</div>
```

仕様としては下記の通り。

* `data-group=""` が同じもののうちで、一つをランダム表示。

* `is-active` がつくことで、cssで `display: block;` に。
（初期表示は `display: none:` で。）


* 同じ`data-group=""`で、`data-num=""` が幾つあるのか数え、ランダムで一つを決定。

* `js-randam` の塊はいくつあっても動作すること。

```js
$(function () {
  var bnr_group = $('.js-random').length;
  var data_group = '';
  var data_group_num_exist = '';
  var group_value = '';

  //js-random がページ内にいくつあるか。無ければ-1が返る。
  if (bnr_group > 0) {
    for (var i = 1; i <= bnr_group; i++) {

      //js-randam の塊を上から順に見ていく。
      //その js-randam の塊の中の、一番上の子要素に、どんな data-group の値があるか。
      group_value = $('.js-random').eq(i - 1).children().eq(0).data('group');
      data_group = '[data-group="' + group_value + '"]';

      //一致する data-group="●●" がいくつあるか。
      //つまり、data-num="●●" が連番幾つまで用意されいるのか。
      data_group_num_exist = $(data_group).length;
      groupRandomBnr(data_group, data_group_num_exist);
    }
  }


  function groupRandomBnr(group, group_num) {
    //ランダムで、data-num="●●"を指定。
    var max_num = group_num + 1;
    //最低1から最大●●の中でランダム数値を生成。
    var random_num = Math.floor(Math.random() * (max_num - 1)) + 1;
    var data_num = '[data-num="' + random_num + '"]';

    //指定の data-group="●●"、指定の data-num="●●" を持つ要素タグに is-active をつける。
    $(group + data_num).addClass('is-active');
  }
});
```

##■参照
ランダム数値の生成については以下参照。
https://lab.syncer.jp/Web/JavaScript/Snippet/15/
【個人メモ】超初心者的動的計画法～フィボナッチ数列～

# 初めに
静的な最適化で問題を解いていたが，扱うデータサイズが大きくなると計算が不可能になるので，動的計画法を導入したい．そのための勉強がてら．MATLABでやります．
# 動的計画法について
動的計画法については，他のサイトやQiita，書籍等で勉強し，まあ考え方は何となくわかったのだが，実装しようと思うとなかなか難しいと感じた．そのため，例題を解きながら習得しようというわけ．

# フィボナッチ数列の実装
今回は最も簡単なところで，フィボナッチ数列の実装をしようと思う．

## フィボナッチ数列の復習
高校の数学B？あたりで勉強したフィボナッチ数列．
(0),1,1,2,3,5,8,13,21,34,...
というやつ．
漸化式で書くと，

```math
F_0=0\\
F_1=1\\
F_{n+2}=F_n+F_{n+1}(n\geq0)\\
```
となる．1個前と2個前の和．

## 素直に実装
フィボナッチ数列の漸化式に従って素直に実装すると以下の通り．

```matlab:fibonacci_1.m
function fib = fibonacci_1(n)
if n <= 1
    fib = n;
else
    fib = fibonacci_1(n-2)+fibonacci_1(n-1);
end
end
```

とりあえず実装はできた．
後述するが，入力するnが大きくなると計算時間が爆発する．

## 動的計画法で解く
### トップダウン（メモ化）
上記の素直な方法では，n番目を計算するためにn-1番目とn-2番目を計算する必要があり，そのn-1のためにn-2とn-3，n-2のためにn-3とn-4を計算して，...といった具合になるため，計算量が$2^n$の計算が必要になる．
そこで，トップダウン的な手法では，メモ化を用いて計算量を削減する．メモ化とは，結果を保持しておくことで，再計算を防ぐ手法のこと．ここでは，
MATLABには[メモ化のための関数](https://jp.mathworks.com/help/matlab/ref/memoize.html)(公式様のドキュメンテーション)がある．
この関数を使いつつ実装したのが以下．

```matlab:fibonacci_2.m
function fib = fibonacci_2(n)
memoizedFcn = memoize(@fibonacci_2);
if n <= 1
    fib = n;
else
    fib = memoizedFcn(n-2)+memoizedFcn(n-1);
end
end
```

ググってもらうと他の言語でのフィボナッチ数列の実装例がたくさん出てくるが，このmemoize関数を使うとそれらに比べスマートにできる感じがする．まぁ，それらはわかりやすさのためにメモ化機能を使わないで実装しているだけだろうが．

### ボトムアップ
最初の手法では，求めたいn番目の数値からnの小さい方へ向かって計算していくために計算量が多くなってしまう．
逆に，ボトムアップ的な手法では，1番目から順にn番目まで計算することで，余分な計算を回避する．手計算しようとしたら，自然とこの方法を取るだろうから，割と当たり前のような感じもするが．
実装上は，単純で，ループを用いて，1番目から順にn番目まで計算していくというもの．

```matlab:fibonacci_3.m
function fib = fibonacci_3(n)
if n <= 2
    fib = 1;
else
    fib1=1;
    fib2=1;
    for i=1:n-2
        fib3=fib1+fib2;
        fib1=fib2;
        fib2=fib3;
    end
    fib=fib3;
end
end
```

# パフォーマンス比較
動的計画法によってどの程度計算時間を短縮できたか比較してみる．

```matlab
n=40;

tic
fibonacci_1(n);
elapsed_time_1 = toc

clearAllMemoizedCaches
tic
fibonacci_2(n);
elapsed_time_2 = toc

tic
fibonacci_3(n);
elapsed_time_3 = toc

```

n=40としたときの結果が以下．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647345/dfe7ca8a-03b1-5e51-be7c-0e1a9f696c12.png)

1つ目の手法に比べ，それぞれ500分の1，2600分の1以下と，大幅に短縮された．

# 〆
wikiにも[フィボナッチ数列](https://ja.wikipedia.org/wiki/%E5%8B%95%E7%9A%84%E8%A8%88%E7%94%BB%E6%B3%95#%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0%E5%88%97)の例は書いてありました．こちらを参考にして書いてます．
まあMATLABで実装したらってことで許してクレメンス...
今回は，トップダウンとボトムアップの手法の感じが掴めた感じ．
次回に続く...かも．