OmniAICreator/Qiita-1.07M huggingface dataset:
Excel VBA User Function Exist Worksheet /Sheet 指定された名前のワークシートがあるか判定する関数

#Sheet か Worksheetか
Sheetの中にWorksheetは含まれます。
このためSheetにするとWorksheetに含まれないシートがあればTrueになります。
このため広くSheetsで判定する関数とWorksheetのみで判定する関数を2つ作りました。
グラフ、Excel5.0ダイアログシートなどがある場合はこちらを使います。

#複数のワークブックを開いているときにActiveではないWorkBookを指定できる
Sheet/Worksheetの有無を判定するのは多くの場合複数のブックを開いています。
このため、複数のブックのうちどのブックかを選択して判定するようにしました。
グラフ等を使わない場合は、WorkSheetExistsだけでいいと思います。

#使用するところ
たとえば複数のブックを開いてワークシートを複写したとき、複写が完了しているかを判定できます。
普通は複数のWorkBookを開いている前提なんてしていないですからね。

##豆知識
Workbookを1つしか開いていないときはThisWorkbookでもActiveWorkBookでも同じ結果になります。

#コード

```visualbasic

Function WorkSheetExists(objWorkbook As Excel.Workbook, strWorksheetName As String) As Boolean
'For Excel VBA
' Dim bl as boolean
' bl = WorkSheetExists(ThisWorkbook, "Sheet20")
' 指定されたWorkBookに指定された名前のWorksheet が存在するか
Dim wss As Worksheets, shs As Sheets
Dim ws As Excel.Worksheet
Dim bl As Boolean: bl = False
On Error GoTo Err_Handle
Set wss = objWorkbook.Worksheets
For Each ws In wss
If ws.Name = strWorksheetName Then bl = True: Exit For
Next
WorksheetExists = bl
Exit Function
Err_Handle:
If Err.Number <> 0 Then Debug.Print "WorksheetExists error occur. " & Err.Number, Err.Description: Err.Clear
WorksheetExists = False
End Function

Function ExcelSheetExists(objWorkbook As Excel.Workbook, strWorksheetName As String) As Boolean
'For Excel VBA
' Dim bl as boolean
' bl = ExcelSheetExists(ThisWorkbook, "Sheet20")
' 指定されたWorkBookに指定された名前のSheet が存在するか
Dim wb As Excel.Workbook
Dim wss As Worksheets, shs As Sheets
Dim ws
Dim bl As Boolean: bl = False
On Error GoTo Err_Handle
Set wb = objWorkbook
'Set wss = wb.Worksheets
Set shs = wb.Sheets
For Each ws In shs
If ws.Name = strWorksheetName Then bl = True: Exit For
Next
WorksheetExists = bl
Exit Function
Err_Handle:
If Err.Number <> 0 Then Debug.Print "WorksheetExists error occur. " & Err.Number, Err.Description: Err.Clear
WorksheetExists = False
End Function
```
Homebrewインストール for macOS

# Homebrewとは？
macOS上のパッケージ管理システム。
※参考 https://qiita.com/omega999/items/6f65217b81ad3fffe7e6


# 環境
macOS HighSierra 10.13.6

# インストール
公式サイトにアクセス。
https://brew.sh/index_ja.html

公式サイトに載っているコマンドをコピペして、ターミナルに貼り付けて実行。

```Bash
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

（〜中略〜）

==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
  https://docs.brew.sh/Analytics

==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations
==> Next steps:
- Run `brew help` to get started
- Further documentation: 
    https://docs.brew.sh

```
※Xcodeが入っていなければ、一緒にインストールされる。


インストール後、バージョン確認。

```bash
$ brew -v
Homebrew 1.9.2
Homebrew/homebrew-core (git revision 4d7d; last commit 2019-01-19)
```
sbt 1.2.0以降にアップグレードしたらlibrary eviction warningが頻繁に出るようになってしまった場合の対処法

# 現象

[SBTのversion conflict\(s\)解消方法まとめ \- Qiita](https://qiita.com/noko_k/items/6321c79b46dc27138571)
に書かれた方法などでライブラリの衝突(conflict)を解決していたのに、sbtのバージョンを1.2.0以降に上げたら次のwarningが頻繁に出るようになってしまった。

```
[warn] There may be incompatibilities among your library dependencies; run 'evicted' to see detailed eviction warnings.
```

# 原因

sbt 1.2.0で導入された`warnEvictionSummary`という機能の実装が少しまずいのが原因。
warnを出すべきでないバージョン衝突[^1]までwarningを出してしまっている。

[^1]: 明文化された記述が残念ながら見つけられないものの、ドキュメント内の間接的な記述およびコード実装から察するにsbtは扱うライブラリがセマンティックバージョニングに沿っていることを期待した上で、セマンティックバージョニングに沿っているなら互換性が破壊されないはずのマイナーバージョン、マイナーマイナーバージョンのバージョンconflictは特に警告を出さずにより新しい方のバージョンを取得している。

* [Inconsistent log level of eviction warning summary · Issue \#287 · sbt/librarymanagement](https://github.com/sbt/librarymanagement/issues/287)
* [\[Fix \#287\] Eviction warning summary shows only binary incompatible by bigwheel · Pull Request \#288 · sbt/librarymanagement](https://github.com/sbt/librarymanagement/pull/288)

# 解決策

[^2]: メタプロジェクトのupdateでも警告が出ている場合は project/build.sbt にも書くこと

上記の修正が含まれたバージョンのsbtが出るまでは以下を build.sbt[^2] に書くことでwarningを抑制できる。

```scala
evictionWarningOptions in update := EvictionWarningOptions.default.withWarnEvictionSummary(false)
```

これでeviction warning summaryがでなくなるんじゃないかと心配かもしれないが、
https://github.com/sbt/librarymanagement/blob/v1.2.4/core/src/main/scala/sbt/librarymanagement/EvictionWarning.scala#L317
の実装上eviction summaryが有効だろうが無効だろうがbinary compatibilityがない危険なconflictはどちらにしろwarningが出るので安心していい。

逆に上の修正が入ったあとのバージョンのsbtでは本当にeviction summaryがでなくなってしまうので、この設定は必ず取り除くこと。
dockerでwordpress環境を構築するためのdocker-compose.yml

local環境でwordpressの作業をするためにdockerで環境構築しました。
そのためにdocker-compose.ymlで設定したのでその内容と説明を書きます。

## 構成

```
Docker version 18.09.0

├── docker
│   └── docker-compose.yml
└── src
```

srcディレクトリにwordpressをinstallします

## docker-compose.yml

まずはソースから

```
version: '3'
volumes:
  hoge_wp_data: {}
services:
  db:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    ports:
      - "3306:3306"
    volumes:
      - hoge_wp_data:/var/lib/mysql
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: "yes"
      MYSQL_DATABASE: "wordpress"
      MYSQL_USER: "wp_user"
      MYSQL_PASSWORD: "wp_pass"
  wordpress:
    image: wordpress:latest
    ports:
      - "9000:80"
    depends_on:
      - db
    environment:
      WORDPRESS_DB_HOST: "db:3306"
      WORDPRESS_DB_NAME: "wordpress"
      WORDPRESS_DB_USER: "wp_user"
      WORDPRESS_DB_PASSWORD: "wp_pass"
    volumes:
      - ./../src:/var/www/html
  ```

## 設定について

### dockerの起動

- ```-d```はバックグラウンドでdocker起動

``` terminal
$ docker-compose up -d 
```

### volumesについて

- [ホストディレクトリのパス]:[コンテナのパス]
- どちらかで作業すると片方でも同期する

```
./../src:/var/www/html
```

### hoge_wp_data: {}

- データを永続化したいからmysqlに設定
初期設定をする必要なし


### mysqlが書き込まれる場所

- コンテナで書き込まれる
- 「phpMyAdmin on docker」でGUIを構築
- 「[Sequal Pro](https://www.sequelpro.com/)」でGUIを構築。「webstorm」で設定できる

### depends_onとlinksの違い

#### depends_on

- サービスの依存関係を指定
- 依存関係の順番を指定

```
// web を開始する前にdbとredisを実行
services:
  web:
    build: .
    depends_on:
      - db
      - redis
```      

#### links

- コンテナへのリンク(IPアドレス)をサービス名またはエイリアス名で指定できる

```
links:
 - db
 - db:database
 - redis
```

#### environment

- 各imageの公式サイトに設定方法が記載されている

### フロントエンド開発環境

- assetsにjs、sassの作業場を作る
- compileしたものを```src/wp-content/themes/hoge/```にoutputさせる

```
├── assets
├── docker
└── src
```

``` terminal:assetsの中身(例)
├── package.json
├── src
│   ├── js
│   │   ├── app.js
│   └── sass
│       ├── _base.scss
│       ├── _extend.scss
│       ├── _layout.scss
│       ├── _mixin.scss
│       ├── _modules.scss
│       ├── _responsive.scss
│       ├── _state.scss
│       ├── _variable.scss
│       └── style.scss
├── webpack.config.js
└── yarn.lock
```

### その他

dockerのimage```word-move```を使って本番サーバーにつなげて```push```、```pull```させるのがベストプラクティス。
その際、databaseは本番とlocalで分ける。

## 参考

- [mysql - Docker Hub](https://hub.docker.com/_/mysql)
- [wordpress - Docker Hub](https://hub.docker.com/_/wordpress/)
readlineがupdateされたことによりbyebugがエラーを出す

# libreadlineが見つからない
rubyファイルを実行しようとしたら以下のエラーが出た。

```terminal
Sorry, you can't use byebug without Readline. To solve this, you need to
     rebuild Ruby with Readline support. If using Ubuntu, try `sudo apt-get
     install libreadline-dev` and then reinstall your Ruby.
(略)
libreadline.so.7: cannot open shared object file: No such file or directory
```
`libreadline`が見つからないらしい。
`pakku -Q readline`でreadlineがインストールされているかを確認する。
readline 8.0が入っているのが確認できた。
archをupdateした直後だったため`readline`がアップデートされたかを確認する。

- archリポジトリの更新
 - https://www.archlinux.org/packages/?name=readline
- readlineの更新
 - http://git.savannah.gnu.org/cgit/readline.git?h=devel

readlineが7から8に更新されていた。
エラーメッセージの`libreadline.so.7`は7を探している感じがあるので、バージョンが上がったことが原因ぽい。

# 解決方法
byebugのissueに`readline`が7にアップデートされたときの同様の現象が報告されている。
https://github.com/deivid-rodriguez/byebug/issues/307
rubyをビルドしなおすと正しいバージョンを認識するみたいなのでやってみる。
`rbenv install -f 2.6.0`
再度同じファイルを実行するとエラーはでなくなった。


# 環境
Arch linux(antergos)
Ruby v2.6.0(by rbenv v1.1.1-39-g59785f6)
[readline](https://www.archlinux.org/packages/core/x86_64/readline/) v8.0.0-1 ([original from GNU](https://tiswww.cwru.edu/php/chet/readline/rltop.html))
Google Cloud Platform nginx 踏み台サーバー 〇分クッキング

# Google Cloud Platform (GCP) で、nginx リバースプロキシ VM インスタンス（踏み台サーバー）を素早く〇分で作ります。

## 材料
* バックエンド Web サーバ インスタンス (GCP) 外部IPアドレス抜き
* 必要なら、お好みでドメイン１個

## 作り方

### Marketplace で nginx を選ぶ
Marketplace で nginx を検索し、今回は「タイプ：仮想マシン」を選択します。
![NGINX_2019-01-19_12h36_04.png](https://qiita-image-store.s3.amazonaws.com/0/237667/e80b3211-854c-af8b-e4b2-24eb2538287e.png)

右側に料金が表示されるので、選択した設定が問題ないか確認してください。

### Marketplace から nginx VM インスタンス作成
nginx の VM インスタンスを作成します。マシンタイプ設定はお好みでどうぞ。
ここで接続元 IP アドレスを指定すれば、絞ることができます。
![marketplace.png](https://qiita-image-store.s3.amazonaws.com/0/237667/0552dc25-55f4-8e31-7e02-bae6fdb705df.png)


### nginx のリバースプロキシ設定
nginx サーバに SSH 接続し、設定ファイルを作ります。ファイル名は「\*\*\*\*\*.conf」とします。\*\*\*\*\*はお好みでどうぞ。

```BASH:BASH
sudo vi /etc/nginx/conf.d/rp-aquiq.conf

server {
    server_name {nginx の 外部 IP アドレス};
    
    # リクエストヘッダ(バックエンド WEB サーバに接続元IPアドレスを出力するため)
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # バッファなど設定はお好みで

    location / {
        proxy_pass http://{バックエンド WEB サーバ 内部 IP アドレス};
    }
}
```

* nginx の外部アドレスの部分をホスト名にする場合は、DNS サーバの設定（Aレコード)に、nginx インスタンスの外部 IP アドレスを登録します。

### nginx の設定を読み込み
作成した nginx の設定ファイルを読み込むため、nginx をリロードします。

```BASH:BASH
aquiq@nginx-1-vm:~$ sudo service nginx reload
```

### WEB ブラウザから接続して完成
WEB ブラウザから nginx の IP アドレス（または URL）に接続すると、バックエンド WEB サーバのページが表示されます。

## バックエンド WEB サーバのアクセスログ設定（＋〇分）
バックエンド WEB サーバのアクセスログに接続元 IP アドレスが出力されるように、バックエンド WEB サーバ側を修正しましょう。


## 不要サービスの停止・削除（＋〇分）
GCP のMarkecplace から nginx (タイプ：仮想マシン）を作成すると、MySQL が稼働しているので、不要なら削除しましょう。（状況に応じてサービス停止）

```
sudo apt remove mysql-server
sudo apt remove mysql-com*
sudo apt remove mysql-apt*
sudo apt remove php7.0-mysql*
```

## HTTPS対応（＋〇〇分）
セキュリティ的に http が嫌な場合は、https にしましょう。
以下のサイトを参考にどうぞ。

* [NGINX SSL Termination](http://mogile.web.fc2.com/nginx/admin-guide/nginx-ssl-termination.html)

無料 SSL 証明書は以下のサイトを参考にどうぞ。

* [Let’s Encrypt](https://letsencrypt.org/)

その他 nginx の詳細設定は、以下のリンクをご参照ください。

* [NGINX 日本語訳](http://mogile.web.fc2.com/nginx/)

# 参考

[NGINX リバースプロキシ | NGINX 日本語訳 - FC2](http://mogile.web.fc2.com/nginx/admin-guide/reverse-proxy.html)
Ruby on Railsを使ったWebサービス開発時のSEO対策メモ

開発しているWebサービスに対して実施したSEO対策を忘れないうちにメモします。
記載内容は開発してるWebサービスがRailsだったためRailsやGemの設定方法が主になります。

# サイトマップの生成
サイトマップは検索エンジンに高度なクロールをさせるために生成して設置したほうが良いです。

* ファイルサイズ、URL数について
  * ファイルサイズ上限
      * 50MB（52,428,800バイト） ※非圧縮状態時
  * 掲載可能なURL数
      * 50,000件以下
  * [参考サイト：Google、Bingと共同でサイトマップのファイルサイズ上限を10MBから50MBに拡大](https://www.suzukikenichi.com/blog/google-updated-sitemaps-protocol-with-bing/)
* 設定項目について
  * URLとlastmodを重要らしく、priorityは利用していないらしいです。
  * lastmodは正確なら使う。全てのlastmodがサイトマップ更新日時の場合は使われないかも。
    * [参考サイト：Googleは、サイトマップのpriorityを無視する。lastmodは正確なら利用する。](https://www.suzukikenichi.com/blog/google-ignores-priority-but-uses-lastmod-in-sitemaps/)

* 利用Gem
  * [sitemap_generator](https://github.com/kjvarga/sitemap_generator)

* サイトマップの生成と送信

| コマンド | 用途 | 
|:----|----:|
| rake sitemap:refresh | sitemapの生成と通知(Google, Bing) |
| rake sitemap:refresh:no_ping | サイトマップの生成だけ(通知はしない) |

# パンくず
ユーザーがサイトを巡回させやすくすることによりユーザビリティ向上の目的もありますが、クローラーが巡回させやすくすることによる内部SEO対策にもなるらしいです。

* 利用Gem
  * [gretel](https://github.com/lassebunk/gretel)

# meta tagの設定
## meta title・descriptionを設定する
検索エンジンやブラウザへWebページの情報を伝えるために設定する。

* 利用Gem
  * [meta_tags](https://github.com/kpumuk/meta-tags)

* デフォルト値の設定
  * ヘルパーのメソッドからハッシュを受け取って設定する。

``` app/views/layouts/application.html.slim
html
  head
    = render partial: 'layouts/meta_tags'
```

``` app/views/layouts/_meta_tags.html.slim
= display_meta_tags default_meta_tags
```

* meta tagの変更
  * ページ毎にmeta tagを変更したい場合はviewで変更する。変更項目が多い場合はデフォルト値の変更と同様にヘルパーのメソッドからハッシュを受け取ることも出来る。

``` index.html.slim
- set_meta_tags modify_item_meta_tags
```

## rel=”next”とrel=”prev”の設定
複数ページにまたがるコンテンツに対して、検索エンジンへどのページを優先的に検索結果に表示させれば良いか教えるために設定する。

* [参考サイト：複数ページにまたがる記事やコンテンツをお持ちの方へ。rel=”next” と rel=”prev” を使用したページネーションのご紹介](https://webmaster-ja.googleblog.com/2011/12/relnext-relprev.html)

* 設定について
  * [kaminari](https://github.com/kaminari/kaminari) の [rel_next_prev_link_tags](https://github.com/kaminari/kaminari#the-rel_next_prev_link_tags-helper-method)メソッドを使うと簡単に設定できる

``` app/views/layouts/application.html.slim
html
  head
    = yield :rel_next_prev
```

``` index.html.slim
- content_for :rel_next_prev do
   = rel_next_prev_link_tags @items
```
そういえばTeratermなくてもWSLでsshできるじゃんって話

新しいPCを設定したら、Linuxサーバーにつなぐために何となくTeraterm入れてました。
もう完全に惰性。思考停止でTeraterm。
ある日ふと気づきました。
そうじゃん。TeratermでSSHしかしないなら、WSLでsshで十分じゃん。
Windows10になってからubuntu入れないなんて絶対ないし。

というわけで、ubuntuでsshするようになって幸せ。
PaizaCloudで検証環境を簡単に構築する方法

#1.はじめに

個人でアプリの動作検証や学習のためにサーバを使用したいときがある。
そんな時には、 [PaizaCloud](https://paiza.cloud/ja/) を使用することで簡単に環境（サーバ）を用意することができる。
今回は、[PaizaCloud](https://paiza.cloud/ja/) で環境を用意する手順を紹介する。
※なお、用意できるのはLinuxサーバのみ

#2.事前に必要な準備
以下の準備を事前にお願いします。

1. Paizaのアカウント作成
2. インターネットの環境
3. デバイスの準備（PC(※推奨)、タブレットなど）

#3.手順
##1.PaizaCloudにアクセス
以下のURLにアクセスします。
https://paiza.cloud/ja/

##2.ログイン
赤枠のログインを押下し、自分のPaizaアカウントでログインする。
<img width="658" alt="ScreenShot 5.png" src="https://qiita-image-store.s3.amazonaws.com/0/33479/48be75af-4115-7e83-2c01-2614be679852.png">

ログインが完了すると、以下の画面に自動的に遷移する。
<img width="1439" alt="ScreenShot 6.png" src="https://qiita-image-store.s3.amazonaws.com/0/33479/1a347ab6-05bd-181b-2488-21b1ca9b2660.png">


##3.サーバを作成
赤枠の新規サーバを押下する。

<img width="1439" alt="ScreenShot 6.png" src="https://qiita-image-store.s3.amazonaws.com/0/33479/11152925-0a30-4548-ef70-72faa6fbc164.png">

利用したいサービスを選択する。

<img width="905" alt="ScreenShot 7.png" src="https://qiita-image-store.s3.amazonaws.com/0/33479/b3fbe2c6-5933-b4e3-5070-76a31ce3f009.png">

サービスの選択が完了したら、新規サーバ作成を押下する。
自動的に画面が遷移し、作成したサーバのコンソール画面が表示される。

<img width="904" alt="ScreenShot 9.png" src="https://qiita-image-store.s3.amazonaws.com/0/33479/c1a48724-530f-b9eb-f557-69bf7a292a63.png">


#4.その他
PaizaCloudは基本的に無料で使用することができる。
但し、有料版では更に自由度の高い利用が出来るので、用途に応じて使い分けてください。
iPhoneのSafariをワイヤレスデバッグする方法



実はSafari Technology Previewでワイヤレスで DeveloperToolが開けるようになっているとのこと。

https://stackoverflow.com/a/50505122/3276863

1. Safari Technology Previewをインストール
2. Develop → "Your mobile Device Name" → Connect via Network in the menu

※ ただしケーブル繋いだ状態じゃないとワイヤレス接続開始できませんでした
※ ワイヤレスデバッグだとラグがありました。快適さだとUSB接続のほうが良いです。
promptで格納されるデータの扱い方

## 基本

`prompt`によって格納される値はstring型。

```js
let value = prompt(); // なにか文字列を入れて「OK」を押す
console.log(typeof value === "string"); // -> 'true'
```

何も入れずに「OK」を押した場合も、string型の空欄として格納される。

```js
let value = prompt(); // 何も入れずに「OK」を押す
console.log(value === ""); // -> 'true'
```

一方で、「キャンセル」ボタンまたはESCキーによってキャンセルされた場合はnullが入る。

```js
let value = prompt(); // 「キャンセル」を押す
console.log(value === null); // -> 'true'
```

## 数値として扱う場合

数値として扱いたい場合は、文字列をいったん数値に変換する必要がある。
変換は`+`(binary plus)を先頭につけるだけでいい。

```js
let value = prompt(); // 数字を入力
let num = +value;
console.log(typeof num === "number"); // -> true

// 次のように、一行にまとめたほうがわかりやすいだろう
let value = +prompt();
```

しかし上記のようにすると、「空白が入力された場合」や「キャンセルされた場合」に0に変換されてしまう。
これは「空白文字やnullは数値に変換すると０になる」というJavaScriptの仕様。

そのため、もし空白やキャンセルの場合の挙動を変更したい場合は、あらかじめ分岐を作成する必要がある。

```js
let value = prompt(); // 数字や空白を入力したり、キャンセルしたり
if (value === null) {
  console.log("value is null");
} else if (value === "") {
  console.log("value is empty");
} else {
  console.log(+value);
}
```

## NaNの対応

もし数値に変換できない文字列を変換した場合、JavaScriptはNaN(Not a Number)を返却する。
（上記のソースに"hoge"などを入れると確認ができる。）

そのため最後に変換した数値がNaNでないことを確かめるために`isFinite`を利用する。
このメソッドは、与えられた数値が有限値であるかを確かめるメソッドで、NaNに対してはfalseを返却する。

```js
let value = prompt(); // 数字や空白を入力したり、キャンセルしたり、数値以外の文字列を入れたり
if (value === null) {
  console.log("value is null");
} else if (value === "") {
  console.log("value is empty");
} else if (!isFinite(value)) { // valueはメソッド内で数値に自動変換される
  console.log("value is not a number");
} else {
  console.log(+value);
}
```

## 結論

promptが実務で使われることは考えづらいが、テストなどで利用する場合は上記の例などに注意しよう。
Rspecでユーザーのログインをテストするときにハマったこと

# uninitialized constant Devise::Test (NameError)




# NoMethodError: undefined method `env' for nil:NilClass

コンソールで下記のようなエラーが吐かれた。

```ruby:console
Failure/Error: @request.env["devise.mapping"] = Devise.mappings[:staff]
NoMethodError:
  undefined method `env' for nil:NilClass
```

ググってみると同じようなエラーに対して回答が寄せられていたので、そちらを参考に。
https://code.i-harness.com/ja/q/1a054b1


```ruby:rails_helper.rb
RSpec.configure do |config|
  # 中略
  config.include Devise::Test::ControllerHelpers, type: :controller
end
```

deviseのバージョンが4.1.1以降だとヘルパーの記述が変更されるらしい。
https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-(and-RSpec)
webサーバをどうしよう(Flask/Django)

# FlaskとDjango
以前は、最短のキーワードを調べていた為、それぞれに深掘りせずに目標達成のために調べ物を進めてたが、進めるたびに出てくる単語がDjangoだった。
※主にサーバ周りの調べ物をしたときだが

今後の運用などを考えたときに、途中で変更するぐらいなら、最初から検討材料を持っておき進めたほうがよいと思った

# Python系フレームワーク

## 過去の資料
Python系のFrameworkと言うところで調べるといろいろ出てくる
https://qiita.com/Morio/items/8db3c9b3ba7f2c71ef27
こちらは4つのFrameworkについてまとまっていたのでこちらをベースに検討

## [Flask(フラスコ)](http://flask.pocoo.org/)
**＜特徴＞**

- 軽量フレームワークの中で人気がある
- 小規模から中規模のシステムをカバーできる
- いくつかファイルを作ることで簡単にサーバを構築できる

## [Django(ジャンゴ)](https://www.djangoproject.com/)
**＜特徴＞**

- Python系のWebサーバで最も人気がある
- 中規模以上のシステムをカバーできる
- URLディスパッチャー、O/Rマッパー、テンプレートエンジンなど機能が充実
- コマンドで必要なファイルを生成できる

## [bottle(ボトル)](https://bottlepy.org/docs/dev/#)
**＜特徴＞**

- Python系で最も軽量なフレームワーク
- 公式ページを見てもわかる通り、特に特徴も書くほども無いほどシンプル(良い意味で)

## [Tornado(トルネード)](https://www.tornadoweb.org/en/stable/#)
**＜特徴＞**

- Facebookから生まれたオープンソースフレームワーク
- リアルタイム通信のWebSocketも可能
- 他のフレームワークの中で高速に動作する

# まとめ
最初に書いた比較サイトもありましたが、それなりに調べていったところ、
https://hackernoon.com/django-too-big-flask-too-small-tornado-just-right-d5d002586bbc?gi=5cebe96248ec
というのを発見。そして、それを日本語訳しているサイトもあった
https://qiita.com/Nimimal/items/4aee5a5d20388d0b4f63

この中で説明されているTornadeの主な特徴

- WebSocketに対応している
- 非同期の実装が備わっている
- Webアプリケーションフレームワークのパフォーマンスとして「django < flask < tornado」である

うーん、実に興味深い。
こちのサイトにも書いてある通り、今後は注目していこう。

**(2019/1/26追記)**

## [Responder(レスポンダー)](https://python-responder.org/en/latest/index.html)
**＜特徴＞**

- 2018年10月に公開されてから、本日まででGithubのStarが2600以上
- 作者がpipenvも作ってる
- WebSocketにも対応
- TemplateEngineが最初から組み込まれているので、Importがシンプル
- Background Taskもあり、呼び出して裏で処理を実行する!!ってこともできちゃう
コンパイラエラー C2872 あいまいなシンボルです。

コンパイラエラー C2872 あいまいなシンボルです。

コンパイルエラーが解消出来ません。
ご教授下さい。

■コンパイルエラー内容
error C2872: 'MarketplaceWebServiceProducts' : あいまいなシンボルです

■やりたいこと
AmazonのAPI「Marketplace Web Service API (MWS)」のHello world

以下ページの右上 オレンジ色の「Download」ボタンから入手できる
「MWSProducts_2011-10-01_v2017-03-22.dll」の使用
https://developer.amazonservices.jp/doc/products/products/v20111001/cSharp.html

■DLLの使用
Visual Studioの対象プロジェクトのプロパティから、
上記DLLの参照を追加しました

■コーディング
using namespace MarketplaceWebServiceProducts;//←ここはコンパイルOK
using namespace MarketplaceWebServiceProducts::Mock;//←★ここで上記コンパイルエラー

■ご質問
上位の「MarketplaceWebServiceProducts」が正常なのに、
下位の「Mock」を付けるとあいまいなシンボルになるのはなぜでしょうか。
解決策をご教授ください。（可能であれば実装をご提供ください）

■環境
Visual Studio
.Net 4.0
C++/Cli
【swift】連続タップで反応するUIButtonの作り方

#背景
あるB2Bアプリを作成中に、アプリユーザの方(企業側)がお客様にアプリを操作してもらう際に、お客様が勝手にアプリをログアウトしないように、ログアウトボタンを隠しボタンかつ3回連続タップで反応するようにしてほしいとの依頼を受け、作成しました。3回連続タップなので、タップとタップに間が空いてしまった場合は、再度3回連続でタップしないといけないようにしています。Timerを使用しました。

#ソースコード
```swift:ViewController.swift
import UIKit

class TopViewController: UIViewController {
    
    var logoutTapCount = 0  // ボタンをタップした回数をカウント
    var countResetTimer: Timer!  // ボタンタップから次のボタンタップまでの時間を測る
   
    override func viewDidLoad() {
        super.viewDidLoad()
     }
    
    
    /// 隠しログアウトボタンタップ時 
    /// 隠ボタンなので、storyboard上でbackground colorをclearにしています
    /// - Parameter sender: 隠しログアウトボタン
    @IBAction func tapLogoutButton(_ sender: Any) {
        logoutTapCount += 1 // ボタンを押すとカウントをあげる
        if logoutTapCount == 3 { // カウントが3のときログアウトできる
	    logout() // ログアウトするための関数。今回は記載していません。           
        }

	// ボタンを押した後にタップとタップに5秒以上空いた際にタップカウントをリセットする
        countResetTimer = Timer.scheduledTimer(
            timeInterval: 5,
            target: self,
            selector: #selector(self.countReset),
            userInfo: nil,
            repeats: true)
    }
    
    func countReset() {
        logoutTapCount = 0
    }   
}
```

# 最後に
Timer関数便利ですね。こちらでポーリング機能を作成したりもしています。
連続タップのUIButtonを作成するいい方法があればご教示いただけると嬉しいです。
iOSで角丸影付きグラデーションのボタンをつくるには？

## はじめに
ごきげんよー( ∴ )/ 
ところでみなさんボタンは好きですか？ 私は押したくなるボタンのデザインが好きです。
iOSでUIButtonを[Dribbbleにあるようなイマドキなデザイン](https://dribbble.com/search?q=button)にするためにはどうするんだろうと思ったのでつくってみました。オープンソースもあります👍

## できたもの
[![Tap here](https://qiita-image-store.s3.amazonaws.com/0/203147/23afc4b8-0563-c953-f755-abe1480cc524.png)](https://github.com/trueSuperior/DSFloatingButton)

めっちゃ押したい😂

## つくりかた
### Playgroundで動作確認
Playground上で外観を確認しつつコードを書いていきます

```swift
//: Playground - noun: a place where people can play
import UIKit
import PlaygroundSupport

let viewSize = CGSize(width: 200, height: 200)
let view = UIView(frame: CGRect(origin: CGPoint.zero, size: viewSize))
view.backgroundColor = UIColor.white

// ボタンのコードをここに追加していきます

let preview = view
```
PlaygroundでUIのプレビュー機能あるのご存知ですか？
知っててもあまり使わない人が多いと思いますが😅

ボタンを追加して確認するための親ビューをつくりました。
`import PlaygroundSupport`を忘れずに

### ボタンを作ります
```swift
let button = UIButton(type: .system)
button.frame = CGRect(x: 25, y: 75, width: 150, height: 50)
button.setTitle("Tap here!", for: .normal)
button.setTitleColor(UIColor.white, for: .normal)

view.addSubview(button)
```

### ボタンの外観
```swift
// 角丸で親しみやすく
button.layer.cornerRadius = button.bounds.midY
// 押せそうにみえる影
button.layer.shadowColor = UIColor.startColor.cgColor
button.layer.shadowOffset = CGSize(width: 0, height: 3)
button.layer.shadowOpacity = 0.7
button.layer.shadowRadius = 10
// グラデーションで強めのアピール (リサイズ非対応！）
let gradientLayer = CAGradientLayer()
gradientLayer.frame = button.bounds
gradientLayer.cornerRadius = button.bounds.midY
gradientLayer.colors = [UIColor.startColor.cgColor, UIColor.endColor.cgColor]
gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1, y: 1)

button.layer.insertSublayer(gradientLayer, at: 0)
```
優れたボタンデザインの効果を生み出すため、角丸で影付きでグラデーションを設定しています。

> ☝️ グラデーションレイヤーはこのままだとボタンがリサイズしたときにサイズを追従してくれないので注意が必要です。解決方法は後述してあるオープンソースを参照してください。

<img width="100%" alt="スクリーンショット 2019-01-19 15.24.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/203147/6dee5d0d-e835-9768-9116-530c95842cee.png">
こんな感じになってます↑

### 使用した色
```swift
extension UIColor {
    static let startColor = #colorLiteral(red: 0, green: 0.4784313725, blue: 1, alpha: 1)
    static let endColor = #colorLiteral(red: 0.2852321628, green: 0.938419044, blue: 0.9285692306, alpha: 1)
}
```
ついでにグラデーションに設定した色はこちらです。color literalで定義済みのものからテキトーに選びました。

## オープンソースはじめました
### DSFloatingButton
[![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/203147/89313ce4-bf74-368a-2130-924fcc755ca4.gif)](https://github.com/trueSuperior/DSFloatingButton)

いま作ったような感じのボタンを簡単に作れるようにオープンソース化してあります。ボタンだけのミニマムなライブラリなのですが、ストーリーボードでグラデーションの配色やシャドウのかかり具合を確認しつつイケてるボタンがつくれるようになってたりしますのでよければぜひ使ってみてください！

以下の特徴があります。
- IBで外観の設定ができる
- かわいいタップアニメーション付き
- グラデーションレイヤーのリサイズに対応


[![Get it](https://qiita-image-store.s3.amazonaws.com/0/203147/2986a11e-accc-980e-45f4-be71c5dc1e8c.png)](https://github.com/trueSuperior/DSFloatingButton)

ボタンごときにライブラリ導入するまでもないんだよなぁ、という方でもファイルをコピペすればいいのでお好きに使ってどうぞ😋
## おわりに
はじめてオープンソースつくったのでなんか反応あると嬉しかったりします。
lambdaからRDSにアクセスするときに注意すること

# RDSの設定はKMSでEncryptして書く

Key Management Service (KMS) からEncrypt用のKeyを作成する (Consoleでできるので詳細割愛)


# KMSのAccess権をLambdaのRoleに与える

KMSをLambdaが操作できるように、KMSを使ってDecryptできるPolicyを作成し、LambdaにつけるRoleに付与する

```json:allow-lambda-to-decrypt-policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "kms:Decrypt",
            "Resource": "arn:aws:kms:<region>:<user_id>:key/<key_id>
        }
    ]
}
```



# LambdaはRDSと同じVPCを指定する

LambdaにVPCが指定されると、NATを設定しない限り、Internetへ出れなくなるので、RDSがLambdaのVPCの外にあると、指定したRDSのEndpointからresolveした先はPublicのIpとなりInternet経由で接続しようとするので、特に理由がない場合は、同じVPCにして、内部ネットワークでのアクセスにする。

別のVPCである必要がある場合は、Peer Connectionを貼って、RDSに内部IPでアクセスで切るかと思ったが、うまくいかなかったので、なにか設定が必要かも。(特に調べてない)

# LambdaにVPCAccessの権限をRoleに与える

VPCを設定すると、LambdaにVPCの権限が必要になる。

AWS managed `AWSLambdaVPCAccessExecutionRole` という名前のPolicyがあるので、これをLambdaのRoleに付与する(policyのくせに名前がRoleというなんとも分かりづらいもの)

内容は以下:

```json:AWSLambdaVPCAccessExecutionRole
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}
```

# Lambdaの設定

Credentialsを環境変数に書き、作成したKMSを指定。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/7059/86d5541c-850c-38fa-64cf-dba18f1521b8.png)

Encryptボタンを押すと、Encryptされる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7059/c04ed178-f195-8daf-db5a-66f5c2d9e82c.png)


右側の `Code` をクリックするとLambdaの中でどう使えばいいのかが出てくる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7059/ffc4b0b8-a136-e706-d463-700746c18760.png)

これで、Lambda関数のConsole上で直接パスワードなどが見れなくなった。

# まとめ


1. KMSの作成
2. Lambdaのロールには、VPCアクセス、KMS権限の付与をする
3. Credentialsは環境変数にEncryptされたものを入れる
4. Credentialsを実際に使用する部分は、Lambdaの関数内でKMSを使ってDecryptして使用する
Please ensure you have network conncection. Error detail: HTTPSConnectionPool

## az login Error
### 対処 export ADAL_PYTHON_SSL_NO_VERIFY=1
### export AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=1
### 参考 http://innerdot.com/general/peeking-in-on-azure-cli-traffic
### https://github.com/Azure/azure-cli/issues/6221
H264 live stream encode and decode on self-build Image streaming server (C#) and Android app(Xamarin.Forms)

Because H264 live streaming code using C# and Xamarin.Forms(and Xamarin.Android) is not found on the Internet.
I list my source files as example or sample code :-)


sorry, I don't explain about my codes.
please read these under one's own power :-)

- encoding with OpenH264(used OpenH264Lib.NET on Windows)
 - https://github.com/ryogrid/RemoteDesktopOneWindowForNovelGrame/blob/f1a95cfece72544eff7156060d227c4fd762a3e0/OpenH264Lib/AVI/ExtractedH264Encoder.cs
 - https://github.com/ryogrid/RemoteDesktopOneWindowForNovelGrame/blob/f1a95cfece72544eff7156060d227c4fd762a3e0/RemoteDesktop.Server.XamaOk/MainApplicationContext.cs#L367
- decoding with MediaCodec class of Xamarin.Android and render it with Skia (Xamarin.Forms and Xamarin.Android)
    - https://github.com/ryogrid/RemoteDesktopOneWindowForNovelGrame/blob/f1a95cfece72544eff7156060d227c4fd762a3e0/RemoteDesktop.Client.Android/RemoteDesktop.Client.Android.Android/PlatformVideoDecoderAndroid.cs#L137
    - https://github.com/ryogrid/RemoteDesktopOneWindowForNovelGrame/blob/f1a95cfece72544eff7156060d227c4fd762a3e0/RemoteDesktop.Client.Android/RemoteDesktop.Client.Android/PlatformVideoDecoder.cs
    - https://github.com/ryogrid/RemoteDesktopOneWindowForNovelGrame/blob/f1a95cfece72544eff7156060d227c4fd762a3e0/RemoteDesktop.Android.Core/Utils.cs#L181
    - https://github.com/ryogrid/RemoteDesktopOneWindowForNovelGrame/blob/f1a95cfece72544eff7156060d227c4fd762a3e0/RemoteDesktop.Client.Android/RemoteDesktop.Client.Android/MainPage.xaml.cs#L113


#Running Android app video capture
<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Video capture of my Android app (the app render screen capture of remote PC on 1FPS) <a href="https://t.co/AT4TRgCj4t">pic.twitter.com/AT4TRgCj4t</a></p>&mdash; ryo_grid@UZOMUZOを宜しく (@ryo_grid) <a href="https://twitter.com/ryo_grid/status/1086521165101723648?ref_src=twsrc%5Etfw">2019年1月19日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
画面キャプチャソフトGreenshotでファイルのパスをクリップボードにコピーする方法

# Skitchが終了して早4年

2015年までのスクリーンショット撮影ソフトといえばEvernote社の[Skitch](https://evernote.com/intl/jp/products/skitch) でしたが、2015年に提供が終了しました。もうすっかり昔話ですね。

# 代替キャプチャソフトScreenpressoとその問題

さてSkitch無き後使っていたのが、某有名ブロガーが紹介していた[screenpresso](http://ja.screenpresso.com/)でした。
指定領域のキャプチャや注釈の記入はもちろん、ソフトを問わないページの全体キャプチャなどさもすればSkitchよりも優秀なソフトでした。

気にする点としては

* free版ではキリ番毎に購入のダイアログが出る
* 時々動作が重くなりアプリの再起動が必要になる。

このあたりが気にはなりましたが、機能を考えれば些細な問題でした。
が、しかし。一点大きな問題が有りました。

* ネットワーク接続が無い環境ではFree版はキャプチャができない。

503エラーが発生していたのでScreenpressoの問題である可能性もあるのですが、ScreenpressonのFree版ではどうやらキャプチャ毎にScreenpressoのサーバーと通信しているらしく、ネットワーク接続が無いと、一切のキャプチャができなくなってしまうのでした。

# 本命Greenshot

そこで再度のキャプチャソフト選定を行い、切り替えたのが[Greenshot](http://getgreenshot.org/)でした。
Greenshotはオープンソースで開発されており、指定領域のキャプチャ、注釈などの機能を持ち、指定フォルダへの自動保存などScreenpressoと同等の作業ができるソフトです。
一部矢印や短径などは、シャドウなどが無く、硬派な見た目ですが、そこが気にならなければ十分なソフトです。

## 保存したパスをクリップボードに保存したい

Screenpressoにあって、Greenshotに無い機能の中で、唯一ほしかったのが、この機能です。利用シーンとしては以下のような形です。

1. キャプチャを取る
2. キャプションをつける
3. パスをコピーして
4. Redmineなどにアップする

この流れを実現したい。そしてGreenshotならそれが簡単にできるのです。

## External command Plugin を利用してバッチを実行する。

Greenshotのプラグインも開発して実現するには、ちゃんとした環境を整える必要がありそこから要件を実現するのは中々難しい。
しかし、標準のプラグインとして用意されている`External command Plugin` を使用すれば、適当なバッチファイルを呼び出して、現在開いているファイルのパスをコピーすることなんて造作もないのでした。

### バッチファイルの中身

引数をクリップボードにわたすだけのシンプルな内容

```argtoclip.bat
@echo off
echo %1 | clip
```

### Greenshotの設定

1. 設定を開く

![20190119155118-20190119155112-Screenpresso.png - Greenshot イメージ エディター.png](https://qiita-image-store.s3.amazonaws.com/0/89777/d167cee9-100e-0a02-22b7-e0ab2cffb072.png)
2. プラグインで`External command Plugin` を選択
![20190119155225-設定.png](https://qiita-image-store.s3.amazonaws.com/0/89777/1e914316-504f-dc14-009e-60cff6ccf121.png)
3. Newをクリックし、以下の様に設定を入れる
![20190119155335-Configure command.png](https://qiita-image-store.s3.amazonaws.com/0/89777/ae6488db-8d99-b452-1c6d-bd968293687b.png)
4. ファイルメニュー内にCopyPathが追加されるので、これをクリックしクリップボードにパスが入ることを確認する。
![20190119155411-20190119155118-20190119155112-Screenpresso.png - Greenshot イメージ エディター.png - Gree.png](https://qiita-image-store.s3.amazonaws.com/0/89777/a9abde0f-d790-966a-20f1-aff94cebbb8d.png)

以上です。完璧

# Greenshotもっと流行れ

Greenshotの情報はWindowsのみ対応のソフトということもあるためか、あまり日本語圏にありません。
ただ、日常的にスクリーンショットを撮る、特にマニュアルをバリバリ作る戦闘員社内SEなんかにはおすすめのソフトです。
paintへ貼付けで頑張っているあなたに、ぜひおすすめです。
Docker Toolboxでmkdirしようとしたらpermission deniedエラー

#背景
新しくノートPCを購入し、それと同時にdocker入門しました。
Win10(Home)のためDocker Toolboxをインストール。
問題なく起動し、いろいろ試す中でmkdirを使用するとpermission deniedエラーが。

#解決(？)
・権限がないということで、Docker Quickstart Terminalを「管理者として実行」
→しかし、起動できません。

・そこでVirtualBoxが原因かなと思い、VirtualBoxを確認。
→起動されていたDefaultというLinuxマシンを停止。

・再度Docker Quickstart Terminalを「管理者として実行」
→起動できました！
→そのままmkdirも問題なく実行できました。

#次の問題が
次は「管理者として実行」でなく、普通に起動すると

```
Starting "default"...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
Error setting up host only network on machine start: C:\Program Files\Oracle\VirtualBox\VBoxManage.exe modifyvm default --nic2 hostonly --nictype2 82540EM --nicpromisc2 deny --hostonlyadapter2 VirtualBox Host-Only Ethernet Adapter #2 --cableconnected2 on failed:
VBoxManage.exe: error: Code E_FAIL (0x80004005) - Unspecified error (extended info not available)
VBoxManage.exe: error: Context: "LockMachine(a->session, LockType_Write)" at line 525 of file VBoxManageModifyVM.cpp
Looks like something went wrong in step ´Checking status on default´...
```
とエラーが。
再度VirtualBoxを確認してもdefaultは電源オフのままでした。
とりあえずmkdir等のコマンドは使えるようになりましたがエラーが気になる、、、
この辺の知識が浅すぎるので勉強していくうちに気づいたら追記します。
Let's encrypt の証明書を無停止で更新する

Let's encryptの証明書の有効期限が90日という衝撃の事実を最近知ったので、今回はその更新方法をまとめておきます。

# 更新方法

以下のコマンドでOKです。これで、サーバ内で有効期限が近いドメインの証明書が全て更新されます。

なお、私はwget経由でcertbotを取ってきたので以下のようなコマンドになってます。

```bash
./certbot-auto renew
```

certbotがコマンドとして使える場合は以下のようにしてもなるはずです。

```bash
sudo certbot renew
```

これをすればnginxを特に停止させずに更新できました。簡単ですね。

# 更新した証明書の有効期限を確認する

`./certbot-auto certificates`で証明書の有効期限が確認できます。

```bash
$ ./certbot-auto certificates
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: xxxxxxxxxx.work
    Domains: xxxxxxxxxx.work
    Expiry Date: 2019-03-01 09:48:21+00:00 (VALID: 41 days)
    Certificate Path: /etc/letsencrypt/live/xxxxxxxxxx.work/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/xxxxxxxxxx.work/privkey.pem
```

ちなみに、Let's encryptの更新期限が残り20日になると以下のようなメールが届くみたいですね。

```
Hello,

Your certificate (or certificates) for the names listed below will expire in 19 days (on 01 Feb 19 23:57 +0000). Please make sure to renew your certificate before then, or visitors to your website will encounter errors.

We recommend renewing certificates automatically when they have a third of their
total lifetime left. For Let's Encrypt's current 90-day certificates, that means
renewing 30 days before expiration. See
https://letsencrypt.org/docs/integration-guide/ for details.

xxxxxxxxxx.work
```

# 自動更新ではないので注意

自動更新するためにはWebrootプラグインとかが必要みたいですが、私はnginx導入時にそれを導入していなかったので今後も手動で更新していこうと思っています。

もし無停止でWebrootプラグインを導入できて、自動更新できるようなものを知っていればぜひ教えてください。

# 参考

- [無料のSSL証明書Let’s Encryptを設定・更新・自動更新する方法(CentOS7, Apache2.4対応）](https://programmingnavi.com/105/#i-6)
Qiitaアカウント作成方法、記事の書き方、投稿手順

Qiitaはじめました。
自分も情報発信したいなと思い始めたのですが、書き方が分からなくて色々と調べました。
投稿の練習として書いていますが、私と同じように初投稿される方の参考になれば幸いです。

# アカウント作成
GitHub連携でアカウントを作成しました。
Twitter, Googleアカウントとの連携も可能です。

# ガイドライン
[良い記事を書くためのガイドライン](https://help.qiita.com/ja/articles/qiita-article-guideline)
Qiita公式のガイドラインを最初に読みました。
タイトルの付け方やルール等が書いてあるので、まずはガイドラインを読みましょう。

# 早速投稿してみる
PCから投稿しました。
## 入力画面
右上の投稿するボタンを押すと、こんな画面が開きます。
<img width="1031" alt="02.入力ウィンドウ.png" src="https://qiita-image-store.s3.amazonaws.com/0/345798/bd61161f-5e0e-4d09-71dd-9ff6bebe9a0c.png">

最低限、これだけ知っていれば困らないと思います。

- 左欄に本文を入力すると、右欄にプレビューが表示される
- Markdownの書き方がわからなくなったら「?」(ハテナ)を押す
- 右下のボタンから、投稿と下書き保存ができる
- 画像マークを押すと画像の挿入が出来る

##  Markdown記法
QiitaではMarkdown記法で投稿します。
GitHubでREADMEを書いたことのある方は違和感なく書けると思います。
書き方が分からなくなったら本文の上の「?」(ハテナ)を押しましょう。

詳しいことを知りたい場合は、Qiita公式のチートシートを参考にしましょう。
[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)

#### 他の方の書き方を参考にする
他の方の投稿のMarkdownを見ることも出来ます。
![03.Markdownで本文を見る.png](https://qiita-image-store.s3.amazonaws.com/0/345798/6979bff6-8689-4d0a-044e-2ecb42a0be58.png)


#### コードの書き方
バッククォート3つで囲います。

> \`\`\` main.c
> \#include <stdio.h>
> int main(void){
> &nbsp;&nbsp;&nbsp;&nbsp;printf("Hello, World!!¥n");
> &nbsp;&nbsp;&nbsp;&nbsp;return(0);
> }
>\`\`\`

``` main.c
#include <stdio.h>
int main(void){
    printf("Hello, World!!¥n");
    return(0);
}
```

#### その他のトラブルシューティング
- バッククォートを文字列として扱う場合はバックスラッシュ'\'を使う
- 半角スペースをどうしても入れたいときは\&nbsp;を使う
- 画像の挿入で"Bad Request"と出たら少し待ってからリトライする

## 参考にさせていただいた投稿
@riocamposさん、@sugaryoさん、ありがとうございます。

[Qiitaに投稿する記事の書き方に望むこと](https://qiita.com/riocampos/items/43b8c47e14d63dc6f6a4)
[Qiitaのはじめかた。](https://qiita.com/sugaryo/items/c0ff0e396daed75fa19b)

## いざ投稿
「Qiitaに投稿」ボタンを押すと、Twitterと紐づけるか聞かれました。
Qiitaに投稿したことをツイートしたいと思っていたので、紐づけることにしました。
<img width="603" alt="04.Twitterと紐づけてTwitterと共有する.png" src="https://qiita-image-store.s3.amazonaws.com/0/345798/d79abade-2e01-2e54-576e-fcdf5c676239.png">

が、失敗しました。
連携が上手くいっていなかったようで、Qiitaに投稿してもTwitterにツイートされていませんでした。
記事を投稿する前に、アカウント設定でTwitter連携を設定しておくのが無難なようです。

# 最後に
アカウント作成から投稿するまでに、2時間くらいかかってしまいましたが、慣れればもっとスムーズに書けるようになると思います。
他の方の投稿を参考にさせていただいて、**情報を残すことの重要性とありがたみ**を改めて感じました。
VirtualBoxにUbuntu(64-bit)が表示されない時の解決方法

# はじめに
Oracle VirtualBox にUbuntu 64bitをインストールしたいのだが、設定－一般－基本の中にあるバージョンのプルダウン中に、Ubuntu(64-bit)が表示されない事象の解決方法について。

因みに、Ubuntu(32-bit)は表示されます。プルダウンに表示される他のOSも、全て32bitで、64bitは一切表示がされません。

# 環境
・Windows10 64bit
・ヒューレットパッカードのノートPC intel COREi5
・VirtualBox6.0

# 解決方法
1 BIOSの画面を表示させる。電源を入れて、PF10を押す。
2 BIOSの画面が表示されるので、左右矢印キーを押して、System ConfigurationタグのVirtualization technology項目を探す。
3 Disabledになっている筈なので、Enableに変更する。
4 ExitタグのExit Saving Changes項目を選択する。つまり、保存して終了する。
5 Ubuntu(64-bit)が表示されるようになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94029/02b6c58b-94ea-df71-9bc8-5a90dc974ac6.png)
ゼロから作るDeep Learning② 3章 自分用まとめ

**word2vec**
本来はプログラムやツール類をさす言葉だが、文脈によってはニューラルネットワークモデル（CBOWモデルとskip-gramモデル）を指す場合もある。

## カウントベース
**学習するデータ**
コーパスの全体の統計データから１回の学習で単語の分散表現を得る
**学習速度**
現実的には、コーパスで扱う語彙数が巨大になり（例えば、英語だと100万以上）、SVDは$O(n^3)$の計算コストがかかるので、スーパーコンピュータでも太刀打ちない。
**更新作業（新しい単語を追加する）**
ゼロから計算を行う
**性質**
単語の類似性がエンコードされる
**単語の類似性に関する定量評価**
推論ベースと優劣つけがたい

## 推論ベース

**学習するデータ**
コーパスの一部を何度も見ながら学習する
**学習速度**
カウントベースより早い
**更新作業（新しい単語を追加する）**
これまで学習した重みを初期値として、新しい単語のみ再学習できる
**性質**
単語の類似性 + 単語間のパターン（king-man + woman = queen）がエンコードされる
**単語の類似性に関する定量評価**
カウントベースと優劣つけがたい

###推論ベースの手法
**CBOW - Continuous bag-of-words**
周囲の複数ある単語（コンテキスト）から中央の単語（ターゲット）を推測する)。精度は劣っているが、求める損失は常に１つなのでskip-gramより高速。

**skip-gram**
中央の単語（コンテキスト）から周囲の複数ある単語（ターゲット）を推測する。精度は優れているが、コンテキストの数だけ損失を求める必要があるため、計算コストが高くなる。

比較

手法|速度|分散表現の精度|
---|---|---
CBOW|better|worse
skip-gram|worse|better

## おまけ

#### logの性質

```math
\log{xy} = \log{x} + \log{y}
```

証明

```math
\log_2{xy} = \log_2{x} + \log_2{y}　\\
\log_2{x} = a \\
\log_2{y} = b \\
x = 2^a \\
y = 2^b \\
xy = 2^{(a+b)} \\
\log_2{xy} = a + b = \log_2{x} + \log_2{y}
```
Mac(Mojave)のphpenvでPHPがインストールできない時のメモ

MacのphpenvでPHPをインストールしようとしたところで

```
configure: error: Cannot find libz 
```

と表示され、それが解決できずにハマったので解決した時のメモ。
phpenvのインストール方法は多数紹介されているの省略します。


まずは、以下のコマンドをターミナル上で叩き、xcode-selectをインストールします。

```
sudo xcode-select --install
```

次に、以下のコマンドをターミナル上で叩き、macOS SDK headerをインストールします。

```
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
```

これで解決するはず。
xcode-selectにMojave用のmacOS SDK headerが入っていないのが原因とのこと。
２日もハマってしまった・・・。

# 参考
以下の記事で解決しました。ありがとうございます！
https://qiita.com/zreactor/items/c3fd04417e0d61af0afe
UnityでListや配列を使ったときのメモリ使用量

ゲームのマスターデータ(変化しないアイテムや敵のパラメータのテーブル)をゲーム中に保持していると、マスターデータのレコード数が増えるとランタイムでのメモリ使用量が気になってくる。
特にレコードに配列やリストをもたせた場合、オーバーヘッドが無視できないので配列やリストのメモリ量を測ってみる。

Unity 2018.2.8fのエディタ上で実行してプロファイラーを使って計測した。.NetのバージョンやAndroid、iPhone、IL2CPP環境では結果が異なるかもしれない。

## 配列のメモリ使用量

```c#
// 40byte
int[] array = new int[0];
```

```c#
// 44byte
int[] array = new int[1];
```
おそらく配列のオーバーヘッドは40byteでn個のint型配列なら(n * 4 + 40)byteのメモリが確保される。

## Listのメモリ使用量

```c#
// 32byte
List<int> list = new List<int>();
// 56byte(int[4])
list.Add(0);
```
Listは内部で配列を持っているので最初に`Add`されたときにデフォルトサイズ4で配列が生成される。
4よりもさらに要素が増えた場合は倍のサイズの配列が確保される。

```c#
// 76byte
List<int> list = new List<int>(1);
```
キャパシティを指定した場合は、そのサイズで配列が生成される。

## まとめ

```c#
class Record
{
    public int[] param = new int[3];
}
// 82.1KB
Record[] array = new Record[1000];
for (int i = 0; i < array.Length; i++)
{
    array[i] = new Record();
}
```
上記のようなレコードを1000個生成しようとした場合、配列のオーバーヘッドだけで40*1000byteとなり、かなりのメモリが消費されてしまうので以下のようにバラバラのメンバーにして保持したほうがメモリ効率はよくなる。

```c#
class Record2
{
    public int param0;
    public int param1;
    public int param2;
}
// 35.2KB
Record2[] array = new Record2[1000];
for (int i = 0; i < array.Length; i++)
{
    array[i] = new Record();
}
```

Listを使う場合はキャパシティを設定するほうがメモリ効率がいい。

```c#
// 78.2KB
Record2[] array = new Record2[10000];
// 78.2KB
List<Record2> list = new List<Record2>(10000);
```
レコードを入れるコンテナをリストにするか配列にするかは、リストにキャパシティを指定しているならそこまでメモリに差はない。

## 参考
https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs
VSCodeとWSLで作業してcommitしてもgithubに草が生えなくて困った

``.gitconfig``の``user.email``関連でgithubに草が生えない系の話で、最高にしょうもないことにハマったのでメモ


# 草が生えない

* VSCcodeとWSLで作業して、VSCodeから``push``してもgithubに草が生えなかった

# git config --global user.email

* WSL上で``git config --global user.email [myaddress]``でemailを設定

* VSCodeで``push``

* まだ草が生えない

# 原因

* Windows側の``.gitconfig``とWSL側の``.gitconfig``は別ファイル
    * win:`‪C:\Users\[ユーザー]\.gitconfig`
    * wsl:``C:\Users\[ユーザ]\AppData\Local\``のずっと奥
        * 人によるので、探したいならここでファイル名検索すれば見つかる

* VSCodeが参照してる``.gitconfig``はWindows側の``.gitconfig``

* WSLから``git config --global user.email [myaddress]``しても、設定が入るのはWSL側の``.gitconfig``

* **ちゃんとWindows側の``.gitconfig``編集するか、powerShellから``git config``しろ**


# どうしてこうなったのか

* PCを買い換えてからはずっとVSCodeでWSLを使って作業していて、powerShellで``git config --global user.email [myaddress]``してなかった

* だから`‪C:\Users\[ユーザー]\.gitconfig`は何も設定入ってなかった

# おわり

* 言われてみればそりゃそうだって話でした
Unityでゲームオブジェクトがカメラに見えるかどうかを判断する方法

VRアプリの開発でパネルが画面に見えないときユーザーに提示を表示する機能を実装してるので、その辺の話検索してみた。その覚え書きです。

## `Camera.WorldToViewportPoint`で計算する方法
[`Camera.WorldToViewportPoint`](https://docs.unity3d.com/ScriptReference/Camera.WorldToViewportPoint.html)で点の位置がカメラのビューポートに納めてるかどうかを計算する方法。

```C#
public bool IsVisibleByCamera() {
    Vector3 viewPos = Camera.main.WorldToViewportPoint(transform.position);
    // viewPosのx座標とy座標が0以上1以下かつzが0以上だったらみえる
    if (viewPos.x >= 0 && viewPos.x <=1 &&
        viewPos.y >= 0 && viewPos.y <=1 && viewPos.z >=0) {
        Debug.Log("Visible by camera");
        return true;
    }
    else {
        Debug.Log("Invisible by camera");
        return false;
    }
}
```

この方法では、オブジェクトの中心しか計算していないので、例えばパネルの境界が見えても見えないと判断されてしまう問題があるので、今度の場合は不適切だと思う。

## [`GeometryUtility.TestPlanesAABB`](https://docs.unity3d.com/ScriptReference/GeometryUtility.TestPlanesAABB.html)と[`GeometryUtility.CalculateFrustumPlanes`](https://docs.unity3d.com/ScriptReference/GeometryUtility.CalculateFrustumPlanes.html)
[Unity Community Wiki](http://wiki.unity3d.com/index.php?title=IsVisibleFrom)によるものなんですが、以下のようにカメラの拡張メソッドを書くと

```C#:CameraExtensions.cs
public static class CameraExtensions {
    public static bool IsVisibleObject(this UnityEngine.Camera @this, Renderer renderer) {
        return GeometryUtility.TestPlanesAABB(GeometryUtility.CalculateFrustumPlanes(@this), renderer.bounds);
    }
}
```

このようにメソッドを呼び出したら判断できるはず。

```C#
public bool IsVisibleByCamera() {
    return Camera.main.IsVisibleObject(GetComponent<Renderer>());
}
```

ところが、今度はuGUIのimageがカメラの視野に入っているかを検証したいですが、どうやら`CanvasRenderer`は`Renderer`を継承していないため、MissingComponentExceptionが発生してしまう。今回はオブジェクトに`SpriteRenderer`をつけることで解決したが、あんまりいい方法とは思えない。もし記事を読んでいただいた方が何かアドバイスあればコメントをいただけると嬉しいです。

## まとめ
1. `Camera.WorldToViewportPoint`は点がカメラのビューポートに入ってるかどうかを判断できる。
2. `GeometryUtility.TestPlanesAABB`でオブジェクトにつけているレンダラーの境界がすべてカメラのビューポートに入ってるかどうかを判断する
3. `CanvasRenderer`は`SpriteRenderer`や`MeshRenderer`などと異なって、`Renderer`に継承していない。
SikuliX 1.1.4 設定ファイル(INIファイル)の日本語入りPATHを利用する

エンコード関連でしくじる。目論見道理。
取り急ぎ以下で様子見

# コードの目的
RPAでエクセルから中身を取り出して値をどこかに放り投げる為に取り出し元のエクセルの場所を自由に定義できるようにする。
Windows利用想定なので設定ファイルはSHIFT_JISで編集される。メモ帳で編集を想定。

# 実装
```setting.ini
#RPA設定
[Target]
Path = C:\RPA\RPAプロジェクト.xlsx
SheetName = Sheet1
```

```python:使いたい場所
import ConfigParser
config = ConfigParser.SafeConfigParser()
config.read(sys.argv[0] + '/setting.ini')
filePath = os.path.abspath(unicode(config.get('Target', 'Path'), 'shift-jis').encode('utf-8'))
sheetName = unicode(config.get('Target', 'SheetName'), 'shift-jis').encode('utf-8')

#まだこれ以下は未確定。
#import xlrd
#book = xlrd.open_workbook(filePath)
#sheet = book.sheet_by_name(sheetName)
#cellData = sheet.cell_value(0, 0)
```
config.get('Target', 'Path') →　これの結果はSHIFT_JISなのでutf-8に変換して内部で保管する。
絶対PATHなのに変換する意味ないように見えてちょっとした誤記的なものがあってもPATHとして成形してくれることも期待している。

一つ一つ丁寧に職人の仕事によって設定項目をエンコードするのがダサいポイント。
ラッピングしてとりあえずエンコードをさせてしまうのがいいかもだね。
でもきっともっといい方法あるだろうと・・・いったところで今日はお開き。
GithubでUsernameとPasswordを省略

# 何がしたいか

なるべく安全に楽したい。

* usernameを省略できるようにする
* passwordを一定期間だけ省略できるようにする

## usernameを省略できるようにする
`git clone`のときに `<username>@`を追加する

```
git clone https://<username>@github.com/<username>/<repository name>.git
```

`clone`済みの場合は`.git/config`を同じように修正する

```
[remote "origin"]
        url = https://<username>@github.com/<username>/<repository name>.git
```

## passwordを一定期間だけ省略できるようにする

[Caching your GitHub password in Git](https://help.github.com/articles/caching-your-github-password-in-git)をやる。
Linuxの場合を下記に記載。

```bash
git config --global credential.helper cache
# or 
# git config --global credential.helper 'cache --timeout=3600'
```

自分の場合は`--timeout=10800`にして3時間ほど再入力しなくても良くなるようにしている。

## 背景

Gitは業務で使っているからコマンドはなんとなくわかるのだけど、Githubは使ったことがなかった。
業務ではGerritとSSHの組み合わせを使っているはず。だけど、普段から気にしているわけでもないし、初期設定なんて1回しかやらないだろうから、今更感はあるがまとめておいた。
ちょっとしたwebスクレイピングをするスニペット

ちょっとしたサンプルデータを作るために、ちょっとしたスクレイピングした時のメモ


https://www.eigo-love.jp/english-word-list-business/
chromeのコンソールで以下叩く

```js
var forEach = Array.prototype.forEach;

words = []
function pushWord(el){
	word = el.outerText
	if (word !== '英単語') {
		words.push(word)
	}
}

elements = document.getElementsByClassName("column-1")
forEach.call(elements, pushWord)

words.join(',')
```

カンマ区切りの（だいたい英語の）テキストが手に入る。

```csv
"business,campaign,company,cost,deal,department,discount,information,job,leader,meeting,member,offer,office,order,plan,practice,price,raise,record,role,sale,service,share,account,bill,bonus,capital,career,cash,cent,challenge,charge,coin,debt,dollar,economy,estimate,fair,fee,firm,fund,goods,income,interview,labor,leadership,network,notice,penny,post,profit,project,salary,schedule,task,trade,value,wage,yen,agency,agent,announcement,appointment,background,budget,commercial,contract,credit,equipment,expense,guarantee,incentive,instruction,load,management,membership,payment,permission,progress,proposal,receipt,recommendation,regulation,signature,source,suggestion,survey,undertaking,venture,achievement,advertisement,asset,bid,boom,commerce,commission,construction,consumption,cooperation,corporation,currency,deflation,demonstration,deposit,developer,dime,discharge,distribution,dividend,earnings,employment,enterprise,establishment,euro,export,finance,headquarters,import,inflation,inquiry,investment,lease,loan,margin,monopoly,mortgage,negotiation,outlet,personnel,pool,presentation,privilege,procedure,promotion,property,proposition,recession,reduction,registration,representation,retail,retirement,revenue,reward,scope,supervision,supply,turnover,accomplishment,accounting,advertiser,agenda,alliance,allowance,assignment,assurance,banking,bond,builder,cancellation,counseling,dealing,deficit,disapproval,dismissal,distributor,feedback,innovation,invoice,marketing,marketplace,memorandum,motivation,overhead,overtime,partnership,policy,questionnaire,rental,retailer,seminar,shipment,specialty,sponsor,supplier,transaction,wholesale,broker,contractor,discourse,equity,estimation,expenditure,fishery,freight,inventory,layoff,merchandise,merger,planning,query,quota,renewal,resignation,resume,shareholder,subsidiary,supervisor,takeover,tariff,trademark,treasurer,vacancy,vendor,voucher,warranty,workplace,auditor,automation,backlog,bestseller,billboard,boardroom,bookkeeping,businessperson,buyout,conglomerate,consignment,consortium,consultancy,consulting,contraction,cutback,deadlock,dealership,deduction,default,designation,downsizing,e-commerce,flextime,franchise,logistics,niche,orientation,outlay,paperwork,paycheck,payday,payroll,paystub,premium,pricing,procurement,relocation,remuneration,restructuring,self-employment,specification,start-up,stockholder,syndicate,tally,turnaround,validity,valuation,videoconference,workflow,workforce,workload,workweek"
```

日本語絶対入れたくないマンは、`word`に正規表現チェックしたり、lengthとバイト数比べたりする。
今回は`英単語`しかなかったのでそれだけ弾けば良い。
MacのVSCodeでConsolasを使いたい

## MACでコード書いているとConsolasが恋しくなる。。。

こんな gist があった

* https://gist.github.com/avalonalex/8125197

シンプルやねぇ。
元ネタのほう > http://blog.ikato.com/post/15675823000/how-to-install-consolas-font-on-mac-os-x
元ネタと、Gist投稿者、Consolas製作者に祈りと感謝を捧げます。

Gistのほうのコードは少し古くなってるのでちょいと修正します

```
# Thanks to this post
# http://blog.ikato.com/post/15675823000/how-to-install-consolas-font-on-mac-os-x
# and post of Gist too
# https://gist.github.com/avalonalex/8125197
# Thanks maintenance by Gist users

$ brew install cabextract

$ cd ~/Downloads
$ mkdir consolas
$ cd consolas
$ curl -LO https://sourceforge.net/projects/mscorefonts2/files/cabs/PowerPointViewer.exe
$ cabextract PowerPointViewer.exe
$ cabextract ppviewer.cab
$ open CONSOLA*.TTF
```

PowerPointVoewer.exe のDL用のURLが変わってるだけ。
最後の行でフォントファイルを開いているのでインストールすれば完了。。。

## VSCodeで使いたいんだが

1. ということで VSCode 開いて
2. 設定画面開いて
3. font で検索して
4. Consolas を設定の一番最初に追加すれば完了

## Atom Keymap を入れてるせいでデフォルトのショートカットがわからないとか。。。

しょうが無ですやん。
もともとAtom使ってたし。
いまさら消せないですやん。。。