OmniAICreator/Qiita-1.07M huggingface dataset:
gcpのwordpressでhttps

gcpでwordpressをする場合、httpでしかできないのはちょっとなぁー
けど、けどhttpsってお金かかるんでしょうー？

いや、かからない方法があった（letsencrypt）！
そして、うまくいった！！！

記事を描こうかなと思ったけど、下記のサイトが非常に丁寧に書いてくれているので、
これを参考にすれば困っているみんなもうまくいくはず

https://www.onepagezen.com/free-ssl-certificate-wordpress-google-cloud-click-to-deploy/#step1


追記）2019/08/27
ただし、DNSなので外部ipが変わってしまいます。
それを抑止するために、以下も設定する必要があります。
これをしないと、度々グローバルIPとドメインを結びつけ直さないと行けなくなります。
https://qiita.com/Yuya_Nishizaki/items/6233288443518647ce19
Elmのアプリ内でコードをハイライト表示する

Elmでスライド資料を作ったりだとか、一緒に開発する人のためにスタイルガイドやユーティリティ関数の使い方のドキュメントを作るときなど、Elm製アプリの中でコードをハイライト表示したいことがあります。
この記事ではElm製アプリで便利にコードハイライトを行う方法を紹介します。
![highlight.jpg](https://qiita-image-store.s3.amazonaws.com/0/16345/eb991cd6-99a7-051a-86c8-e816f058c56e.jpeg)

## Highlight.js

JS でコードハイライトを行うライブラリと言えば [highlight.js](http://highlightjs.org/) などが有名ですが、[Getting Started](https://highlightjs.org/usage/) で触れられている [initHighlightingOnLoad](https://highlightjs.readthedocs.io/en/latest/api.html#inithighlightingonload) を呼ぶ方法ではうまくいきません。
この方法はページロード時に存在しているDOM要素の中からハイライトしたいコードを見つけるものですが、Elmアプリの場合はページロード時にはDOM要素がまだ生成されていないからです。

## 動的な要素のハイライト表示

highlight.js には [highlight(name, value, ignore_illegals, continuation)](https://highlightjs.readthedocs.io/en/latest/api.html#highlight-name-value-ignore-illegals-continuation) という関数が用意されており、動的に生成される要素をハイライト表示することができます。
ただ、ハイライトしたい要素を描画する度に逐一 port でこの関数を呼ぶのは手間がかかりすぎる気がします...

## elm-explorations/markdown

ここで、[elm-explorations/markdown](https://package.elm-lang.org/packages/elm-explorations/markdown/latest/) の登場です。
Elm作者であるEvanはズルいので、一般人には許されない内緒の方法で JS のコードを内部的に直接実行できる Elm ライブラリを作成して公開する権限を持っています。

elm-explorations/markdown はそんなズルいライブラリの1つで、内部的に highlight.js の `highlight` を使っています。
本来の用途としては Markdown のテキストを受け取って `Html.Html msg` に変換するものですが、

```elm
    myCode : Html msg
    myCode =
        Markdown.toHtml []
            """
    ```elm
    view =
        Atom.row
            [ basicBlock
            ]
    
    ```
            """
```

のようにすると、以下のようなDOMが作られます。

```html
<pre><code class="lang-elm"><span class="hljs-title">view</span> =
    <span class="hljs-type">Atom</span>.row
        [ basicBlock
        ]
</code></pre>
```

これをブラウザで表示すると、[ハイライトされて見える](https://arowm.github.io/elm-atomic-design-example/style-guide.html#align_horizontally)ようになります。

## elm-explorations/markdown 使用上の注意

実際に使用する際には、elm-explorations/markdown が highlight.js 自体を内包しているわけではないことに注意してください。
単に `windows.hljs.highlight()` といった形で、highlight.js の関数が `windows.hljs` として使える状態になっていることを想定しています。

そのため、highlight.js が提供する CSSファイルだけでなく、
たとえば以下のような方法で別途 highlight.js を読み込んでおく必要があります。

* HTMLのヘッダー要素で highlight.js を読み込む
* Elm内で highlight.js を読み込む ([公式パッケージサイトの例](https://github.com/elm/package.elm-lang.org/blob/e0b7aa4282038475612722ff7a57195866f8645b/backend/ServeFile.hs#L54))
* npm install した highlight.js を `require` したりして読み込んでおく ([例](https://github.com/arowM/elm-atomic-design-example/blob/master/src/js/style-guide.js))

また、`toHtml` 関数は文字列の Parsing を行っている関係ですこし重い処理になっています。
`Html.Lazy.lazy` などを活用することで、不必要な再評価が起きないように工夫してください。

より詳しい使い方については、elm-explorations/markdown を使ってスタイルガイドを作成している [elm-atomic-design-example](https://github.com/arowM/elm-atomic-design-example) などもご参照ください。

[さくらちゃんにご飯をあげる](https://www.amazon.co.jp/gp/registry/wishlist/20ZV2VC57615B/ref=nav_wishlist_lists_1)
[さくらちゃんをもっと見る](https://twitter.com/hashtag/%E3%81%95%E3%81%8F%E3%82%89%E3%81%A1%E3%82%83%E3%82%93%E6%97%A5%E8%A8%98?src=hash)
[他の記事を見る](https://qiita.com/arowM)
![D1wOpkJVYAYHWtk.jpeg](https://qiita-image-store.s3.amazonaws.com/0/16345/213fe74a-cd08-2ebe-22ed-ba6af27ff2fb.jpeg)
もののけ姫のモロは結局犬なのか！？YOLOv3を用いて検証してみた。


# ミッション
日本人なら誰もが一度は思うことであろう、この疑問。
**「もののけ姫に登場するモロは『神』なのか、はたまた『犬』なのか」**
今回の目的はそれを技術的観点から解き明かそうという壮大なるミッションとなります。

# 実験方法
今回の実験ではYOLOv3を利用しました。[前の記事](https://qiita.com/yokoponzoo/items/64137ef45208b12ce501)で長ったらしい環境構築やインストール作業をしていたのは全てこの謎を解き明かすためだったのです！ﾜﾝ

### 実験手順
1. 学習済みモデルの取得。[このページ](https://github.com/qqwweee/keras-yolo3/blob/master/model_data/coco_classes.txt)を見るとどうやら犬も認識できそうなので利用することに。
2. 入力画像の取得。ネットから6枚(意外と種類が少なかった)のモロが写っている画像を取得(ジブリさんお借りします)。
3. 学習済みモデルを利用し、6枚の画像を認識させる。
4. より多く認識されたものをモロの正体とする。（認識におけるルール）

### 認識におけるルール
* なににも認識されなかった場合、『神』とする。
* 認識の際に重複がある場合、より数値が高いものを採用する。これは以下のような例を指している。

<img width="366" alt="aaa.png" src="https://qiita-image-store.s3.amazonaws.com/0/318451/0b9ea572-6503-cebe-ad70-cf8e77683f43.png">

```
car 0.87
taxi 0.32
```

この場合carとして認識されたとする。


# 実験結果
### 各画像に対する出力結果
```:画像1に対するの出力
horse 0.77 (64, 49) (475, 257)
```

```:画像2に対するの出力
horse 0.36 (18, 13) (553, 352)
```

```:画像3に対するの出力
horse 0.37 (192, 30) (553, 352)
dog 0.96 (201, 7) (539, 339)
```

```:画像4に対するの出力
```

```:画像5に対するの出力
dog 0.92 (107, 12) (394, 268)
```

```:画像6に対するの出力
```

### 結果グラフ
<img width="195" alt="スクリーンショット 2019-03-21 17.42.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/318451/722e491a-9704-e238-a3fa-cfac2d748fe2.png">


# 結論
モロの正体は結局謎のままであり、馬の疑いまで浮上。しかも頻度的には馬。(YOLOv3調べ)
しかし諸説あることもたしかである。
開発者証明書要求(CSR)の作成〜Certificates(CER)の作成まで

## 開発者証明書要求(CSR)とは
名前の通り、Certificates(開発用証明書 or 配布用証明書)をAppleからもらうためのもの。
公開鍵と暗号鍵の鍵ペアを作成し、公開鍵をAppleに渡しておいて、それで暗号化された証明書をAppleからもらう。これはビルドするときにAppleに対して開発者元を明らかにしなければならないためである。
もらった証明書をキーチェーンに保存することで、そのMacで実機ビルドできるようになる。（キーチェーンには暗号鍵もセットで保存されている。暗号鍵をなくすとビルドできなくなる。ので要注意）

## 開発者証明書要求(CSR)の作成手順
1. キーチェーンアクセスを開き、以下画像のように「認証局に証明書を要求」をタップする。
<img width="570" alt="スクリーンショット 2019-03-20 21.03.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/261954/30e311c6-d099-4e5f-7df1-cb06ef807536.png">

1. メールアドレスに自身のメールアドレス、通称に開発中のアプリだと分かる名称をつける。そしてディスクに保存にチェックする。
通称はのちに作成される`p12ファイル`の名称となるので明確な命名をしておいた方が良い。
<img width="615" alt="スクリーンショット 2019-03-20 21.11.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/261954/1b684fa2-26d4-d83b-5063-049ddb590c45.png">

1. 「続ける」をタップしてCSRファイルをローカルの適当な場所に保存する。

## Certificates(CER)の作成手順

1. [Certificates作成ページ](https://developer.apple.com/account/ios/certificate/create)に遷移する
<img width="400" alt="スクリーンショット 2019-03-21 17.22.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/261954/042a2b98-7033-c172-fbe1-5e304752d7b0.png">

    Certificatesには、`開発用`と`配布用`の２種類があり、
    * iOS App Development：開発用。主に開発環境で実機ビルドするためのCertificatesを作成する 
場合コチラを選択する。
    * App Store and Ad Hoc：配布用。主にApp StoreにリリースするためのCertificatesを作成す 
る場合コチラを選択する。

    他にもPUSH通知を実現するための証明書などがあるがここでは説明しない。

    今回はApp Store and Ad Hocを選択し、画面下部にある「Continue」を押下する。

1. 開発者証明書要求(CSR)の作成を求められますが、これは先程作成したものを指しているので、画面下部の「Continue」を押下する。
<img width="400" alt="スクリーンショット 2019-03-21 17.22.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/261954/4243a804-29c8-1aeb-7dad-863091387976.png">

1. 「Choose File...」を押下し、先程作成したCSRを選択する。そして「Continue」を押下する。
<img width="400" alt="スクリーンショット 2019-03-21 17.22.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/261954/9f7c7267-3ca9-8317-a9da-412c2c8c58c5.png">

1. Certificates(CER)が作成されたので、Appleに対して開発者元を証明することができるようになりました。
<img width="400" alt="スクリーンショット 2019-03-21 17.22.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/261954/2aa26a22-65d1-336e-8986-8ba319b31152.png">

## キーチェーンにCertificatesを登録する
先程ダウンロードしたCertificatesをキーチェーンに登録しないと、実機ビルドできないため登録する。
登録方法は、Finderなどから先程ダウンロードしたCertificatesをダブルクリックするとキーチェーンに登録される。

## まとめ
これでProvisioningFileを構成する３つの要素のうちの一つである、Certificatesを作成することができました。

## 参考URL
https://i-app-tec.com/ios/apply-application.html
tensorflow，anacondaではimportできたのに，VScode(Jupyter)ではできないときのメモ

#問題
Ubuntu16.04でtensorflow-gpuをインストールした。
anacondaの仮想環境上ではimportできたのに，VScode(Jupyter)からはimportできない！！！！:frowning2:

#原因
Anaconda上でのPythonパスとJupyter上でのPythonパスが一致していないらしい。
超参考にしたサイト➡https://qiita.com/tk_01/items/9d3961e386714b67f732

#直し方
tensorflowをインストールした仮想環境をアクティベートして，

```ruby:仮想環境をアクティベート
$ source activate <環境名>
```
以下のコマンドを実行。


```ruby:Jupyterのkernelを作成
～(環境名)$ conda install notebook ipykernel
～(環境名)$ ipython kernel install --user --name <環境名> --display-name <jupyter上の表記を設定>
```

これでもう一度importしたらうまくいった！:laughing:
無線網（Wi-Fi）空中線(antenna)(96)移動対応

端末の基地局間の移動を、ローミング、ハンドオーバなどいろいろな呼び名で呼ばれることがある。

移動に対応した規約も、Mobile IP, SIPなど、いろいろな層で実現している。

それぞれの規約を直接用いない場合でも、実際にシステムを構築する場合には、移動対応の規約の設計を参考に、別の製品で実現することもある。

携帯電話の基地局間の移動の場合、鉄道・自動車などの移動手段上の各種網の場合など、歴史的に古いものから、新しい通信規約でどのように対応するかは、興味深い。

Wi-Fiのアクセスポイントでは、「ローミング機能」と呼んでいる。

２つ以上の無線LANルーターを同一SSIDでローミングさせてみた時の知見
https://qiita.com/mecaota/items/662790514b960ee7773b

 無線LANの電波が届かないときにオススメしたいローミング設定について
https://www.lanches.co.jp/blog/2479

Windows 無線LANのローミングの積極性
https://www.nedia.ne.jp/blog/tech/2016/06/07/7529

自動的にAirStation接続を切り替える（ローミング機能）
http://buffalo.jp/download/manual/html/air851/router/whrg54s/chapter119.html

 複数台の無線LANアクセスポイント(親機)によるネットワーク拡張 
http://www.aterm.jp/function/guide10/wireless_cmx/list/wds/1200/m02_m2.html

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Pythonで変数の型宣言をしなくて済む理由

<h1>Pythonで変数の型宣言をしなくて済む理由</h1>

C言語やjavaでは、変数を使うとき、必ず型宣言をしないといけません。
なので、Cやjavaを最初に学習したことのある人ほど、ここで疑問をもつと思います。

なぜ、Pythonでは型宣言をしなくて済むかというと、その理由は
<strong>Pythonの変数は、C言語でいうポインタと同じで、型情報や値を一つにまとめたオブジェクトのアドレスを示しているからです。</strong>
C言語のポインタは、アドレス変数でしたよね。

```
int *p
char *a
double *d
```

上に書いたアドレス変数p, a, dはすべて同じ大きさです。32bitのアドレスバスの場合は、これらすべて32bit変数です。そして、アドレス変数の型は、参照先のデータの大きさ(例えば、int型なら4byte、char型なら1byte)を示したものでした。

Pythonも上にあげたポインタと似てます。
しかし、Pythonの場合は、型宣言をしません。
例えば、

```
a=9
b=2
```

型宣言をせずに、上に書いたようなことをできます。
C言語の場合は

```
int *a=malloc(sizeof(int));
*a=9;
int *b=malloc(sizeof(int));
*b=2;
```

としないといけませんでした。
では、Pythonでは、参照先のデータ型はどこにいったの？と思われると思います。
結論をいうと、
<strong>型情報も値も一つのオブジェクトにまとめたからです。</strong>
そして、変数は、オブジェクトの先頭のアドレスだけを持っているのです。
オブジェクトというのは、関連のあるメソッドやフィールドを一つにまとめたものです。

C言語でvoid型へのポインタ(アドレス変数)ってあったと思います。
あれと同じです。Pythonの変数は、void型へのポインタと似てます。
C言語風に説明するならば、参照先に型情報も含めているということです。

void型へのポインタ(アドレス変数)は、参照先の型情報を宣言していないもので、Pythonの変数の宣言と似ています。

Pythonの変数宣言をC言語<strong>風</strong>に書くならば、

```
void *p;
*p=2;

void *a;
*a=3;
```
となります。
PowerQueryのログファイルから所要時間？を取ってみたけど不満足な話

今まで，ログファイルの頭とお尻の時刻を比較してましたが，それをPower Queryで読みに行ってみたという話です。
ですが，そもそもログファイルの頭とお尻を読むだけじゃ，トレース開始から終了までの時間でしかなく，実行部分の時間ではない，という感じがしたので，お蔵入りかなと。
挑戦する方の踏み台になればと思い，書き残します。

####コード実行前の準備
「トレースフォルダパス」という名前のパラメータを作り，トレースフォルダのパスを入れておいてください．Excelなら
「C:～\AppData\Local\Microsoft\Office\16.0\PowerQuery\Traces」
のような具合のはず。

####コード
対象とするファイルパス名を引数とした関数です。（下記コードではクエリ側で拡張子付けるようにしてます）
ログファイルの最初と最後の時刻差を返します。

```text:クエリ：所要時間とり
(拡張子抜きファイル名 as text)=>

let
    ソース = Csv.Document(File.Contents(トレースフォルダパス &"\"& 拡張子抜きファイル名 & ".log"),5,"",null,932),

    時刻取得関数=(行番号 as number)=>
    let    
        欲しい部分をリスト化 = Text.Split(ソース{行番号}[Column5],","),
        時刻文字列 = Text.BetweenDelimiters(欲しい部分をリスト化{0},"T",".")
    in
        Duration.FromText(時刻文字列),

    データ行数= List.Count(ソース[Column5])-1,
    所要時間= 時刻取得関数(データ行数)-時刻取得関数(0)

in
    所要時間
```

####試した環境
Windows7 64bit 
Excel（Office365）バージョン1902（32ビット）
PowerQueryのバージョン　2.66.5376.1622 32 ビット


####注意点
#####・トレースの仕方
　クエリオプション―診断―「トレースを有効にする」のチェックボックスで，ON/OFFを切り替えられる。
#####・ログファイル
　Excel：「EXCEL.～.log」
　※Power BI Desktopだと「PBIDesktop.～.log」で，フォルダも別。
Ruby Cloud Vision API クライアント ライブラリ v0.32.0 への移行

※本記事は2019年3月21日現在の情報です。

RubyでGoogle Cloud Vision を試そうと、GCP公式サイトのサンプルを実施すると、

```
undefined method `new' for Google::Cloud::Vision:Module (NoMethodError)
```

というエラーが発生した。

#### 参考にしたCloud Vision 公式サンプルコード

https://cloud.google.com/vision/docs/detecting-text?hl=ja#vision-text-detection-ruby

```ruby
# project_id = "Your Google Cloud project ID"
# image_path = "Path to local image file, eg. './image.png'"

require "google/cloud/vision"

vision = Google::Cloud::Vision.new project: project_id
image  = vision.image image_path

puts image.text
```

#### 原因

Ruby クライアントの v0.32 から後方互換性のない仕様変更が入っていた
https://cloud.google.com/vision/docs/ruby-client-migration
サンプルコードも上記サイト内で紹介されている

Google::Cloud::Vision::ImageAnnotator を使うようになった。

```ruby
image_annotator = Google::Cloud::Vision::ImageAnnotator.new

# The name of the image file to annotate
file_name = "./resources/cat.jpg"

response = image_annotator.text_detection(
  image: image_path,
  max_results: 1 # optional, defaults to 10
)

response.responses.each do |res|
  res.text_annotations.each do |text|
    puts text.description
  end
end
```

ちなみに、公式ドキュメントの英語ページの方はサンプルも最新の情報に更新されていた。
https://cloud.google.com/vision/docs/detecting-text?hl=en#vision-text-detection-ruby

GCP公式の日本語ドキュメントは更新が遅いことが過去にもあったので、なにか詰まったら英語ページを確認するのが吉。
Railsアプリケーション内にすでにあるlayouts/application.html.erbファイルとviews内の全てのerbファイルのhamlフォーマットへのコンバート

初投稿です。

今日学んだことを忘れないように、Qiitaでメモ...

Railsアプリケーションのviewファイルをすでに.erbで作成していて、
途中からhaml記述に変えたいと思った時に使えました。






`gem “haml-rails”,”~> 1.0”`

をgemfileに記入

ターミナル
`$ bundle install`





###Railsアプリケーションのレイアウトファイルのhaml記述のものの生成
app/views/layouts/application.html.erb
ターミナルで操作

```terminal
$ rails g haml:application_layout convert
```



### Rails アプリケーションのviewsフォルダ内のerbファイルのhaml記述のものの生成

app/views/layouts/〇〇.erb
ターミナルで操作

```
$ rails haml:erb2haml
```



参考画像
<img width="182" alt="skitch.png" src="https://qiita-image-store.s3.amazonaws.com/0/374908/1be5045d-2b82-3ed7-9705-123d44cd00d6.png">
Pythonのインスタンスメソッドのデフォルト引数に、インスタンス変数を渡したい

## 結論から言うと

渡せません。
回避策として、以下のように書くことになります。

* デフォルト引数に`None`等を与えたのち
* メソッド内で引数が`None`かどうかを判定し、Noneならインスタンス変数を引数に代入する


## やりたいこと

Pythonのインスタンスメソッドのパラメータのうち、「指定しなければインスタンス変数を使う」ような挙動をさせたい。
最初に考えて書いたのが以下のコード。

```python:instancemethod_fail.py
class MyClass:
    def __init__(self):
        self.var1 = "instance var"

    def some_method(self, param=self.var1):
        print(param)

MyClass().some_method()
```

これを実行しようとするとコケます。

```
$ python instancemethod_fail.py 
Traceback (most recent call last):
  File "instancemethod_fail.py", line 1, in <module>
    class MyClass:
  File "instancemethod_fail.py", line 5, in MyClass
    def some_method(self, param = self.var1):
NameError: name 'self' is not defined
```

## なぜうまく行かないのか

Pythonのメソッドのデフォルト引数はクラスを定義したタイミングで評価されるからです。

参考 : [4. その他の制御フローツール — Python 3.7.3rc1 ドキュメント](https://docs.python.org/ja/3/tutorial/controlflow.html#default-argument-values)
> 重要な警告: デフォルト値は 1 度だけしか評価されません。デフォルト値がリストや辞書のような変更可能なオブジェクトの時にはその影響がでます。

Python初学者が陥りやすい定番のハマりどころとして、Pythonの公式FAQにも以下のように記載されています。

[プログラミング FAQ — Python 3.7.3rc1 ドキュメント](https://docs.python.org/ja/3/faq/programming.html#why-are-default-values-shared-between-objects)
「なぜオブジェクト間でデフォルト値が共有されるのですか？」項より

> 関数の呼び出しによって、デフォルトの値に対する新しいオブジェクトが作られるのだと予想しがちです。実はそうなりません。デフォルト値は、関数が定義されたときに一度だけ生成されます。この例の辞書のように、そのオブジェクトが変更されたとき、その後の関数の呼び出しは変更後のオブジェクトを参照します。

「デフォルト値は関数定義のタイミングで１度だけ評価される」ため、その時点で定義されていない`self`を参照できなかったということですね。

## どう解決するのか

上記の続きとして、以下のように記載されています。

> 定義の時に、数、文字列、タプル、None など、イミュータブルなオブジェクトを使うと変更される危険がありません。辞書、リスト、クラスインスタンスなどのミュータブルなオブジェクトは混乱のもとです。
> 
> この性質から、ミュータブルなオブジェクトをデフォルト値として使わないプログラミング手法がいいです。代わりに、None をデフォルト値に使い、そのパラメタが None である時にだけ、関数の内部で新しいリスト/辞書/その他をつくるようにしてください。

これに則って書くとこうなります。

```python:instancemethod.py
class MyClass:
    def __init__(self):
        self.var1 = "instance var"

    def some_method(self, param=None):
        if param is None:
            param = self.var1
        print(param)

MyClass().some_method()
```

こうするとちゃんと動きます。

```
$ python instancemethod.py 
instance var
```

追記 : 

* 公開タイミングでいきなり「クラスメソッドとインスタンスメソッド間違える」という痛恨のミスをご指摘いただき修正しました。
Zbrush2019でMayaに近いペンタブレット&マウス操作をする

私はMayaでの操作が慣れているので、Zbrushでのワコムペンタブ、マウス操作がし辛いです。

なのでAutohotkeyを使ってZbrushのビュー上でMayaに近いマウス&ペンタブ操作ができるようにしました。
といっても専門家ではないので色々な方のものを利用したり参考にさせていただきました（多謝）
特に問題なくWIndows10環境の最新Zbrush2019で行えるようです(2019年3月時点)
前提としてWacomタブレットとなります。他のメーカーのものは所持していないのでわかりません。

Zbrushのビュー上で以下の操作を行えるようにしていきます。

●ペンタブ操作
　[Alt + ペンクリックドラッグ]　回転
　[Alt + ペンボタンドラッグ] or [ペンボタンドラッグ]　パン
　[右クリック]　メニュー表示

●マウス操作
　[Alt + 左ボタンドラッグ]　回転
　[Alt + 中ボタンドラッグ] or [中ボタンドラッグ]　パン
　[マウスホイール]　ズーム
　[右クリック]　メニュー表示

ペンタブのパン/ズーム機能を使用してのパン/ズーム操作もしたかったのですが、
うまくできませんでした。
敢えて失敗方法は書きませんが出来る方法をご存知の方いらっしゃったら教えてください…。


１：ペンタブレットの設定
　ペンタブレットは以下の条件が揃っていればおそらく大丈夫だと思います。
　　・Wacom製
　　・ペンのサイドに２つ以上ボタンがついている
　　・各ボタンに中クリックと右クリックを割り当てられる
　私のボタン設定は以下のようにしています。
　![キャプチャ111.PNG](https://qiita-image-store.s3.amazonaws.com/0/244431/e0eac1d1-c3aa-b5c7-e6f4-02d1cb6e1d38.png)
　「中ボタンクリック」、「右ボタンクリック」を割り当てるボタンの場所はお好みで大丈夫です。
　※ちなみに今回「マッピング切り替え」のボタンは使用しません。

２：Zbrushのブラグイン「MiddleButton」をインストール
　こちらの方の記事を参考にさせていただきました。
　https://yamato-tsukasa.hatenablog.jp/entry/2018/10/07/170022
　記事の内容の通りに行えば良い感じです。


３：「Autohotkey」をインストールする
　「AutohotKey」
　https://www.autohotkey.com/
　上記ページからインストーラをダウンロードしインストールします。


４：「Zbrush-Maya.ahk」ファイルを作成する
　適当な場所に以下のスクリプトをコピペした「Zbrush-Maya.ahk」ファイルを作成します。新規作成で.txtファイルを作って、ahkに変えれば良いと思います。
　適当に「Zbrush-Maya.ahk」としましたが、ファイル名は何にしても問題ないです。

```
#IfWinActive ahk_class ZBrush       ;ZBrushのウィンドウがアクティブの時のみ割り当てを行わせる
!LButton::Send, {RButton DownTemp}  ;altと左ボタンクリックを押している間、右ボタン押下し続ける
!LButton up::Send, {RButton Up}     ;altと左ボタンクリックが離れた時、右ボタンを離す
!MButton::Send, {MButton DownTemp}  ;altと中ボタンを押している間、中ボタン押下し続ける
!MButton up::Send, {MButton Up}     ;altと中ボタンが離れた時、中ボタンを離す
RButton::Send, {SPACE}　　　　　　　 ;右ボタンを押すとメニュー表示
#IfWinActive                        ;終了

```

５：「Autohotkey」で「Zbrush-Maya.ahk」を実行する
　これを行うとZBrushのウィンドウ内でだけ、指定したボタンの挙動が変わります。

これでzbrush内でmayaに近いペンタブとマウス操作ができるようになります。
127.0.0.1とlocalhostと0.0.0.0の違い

# それぞれの意味について

## 127.0.0.1
127.0.0.1はループバックアドレスの一つであり、同時に127.0.0.1に対応する仮想的なネットワーク・インターフェースを表します。
ループバックアドレスは自分自身を表す特別なIPアドレスのことです。
ループバックアドレスは同一ホスト内でしか通信を行いません。

## localhost
127.0.0.1を表すホスト名のことです。
127.0.0.1とほぼイコールなので当たり前ですが、こちらも同一ホスト内でしか通信を行いません。
何らかの開発用サーバを立ち上げた際に、ブラウザにlocalhost:8080といったアドレスを入力することがあるかと思いますが、それはこのlocalhostです。

## 0.0.0.0
前者2つとだいぶ異なり、すべてのネットワーク・インターフェースを表します。
ワイルドカードのようなもので、すべての通信を表します。
こちらは別ホストからでもアクセスすることが可能です。

# ちょっと試してみる
pythonでいくつか試してみます。

まず雰囲気作りのために簡単なコンテンツを用意します。

```shell
$ mkdir test && cd test
$ echo "<h1>Hello</h1>" >> index.html
```

次に以下のコマンドで開発用サーバを起動します。

```shell
$ python3 -m http.server 8000
```

この状態でブラウザでlocalhost:8000にアクセスすると、Helloの文字を見ることができます。

ところでpythonの開発用サーバの出力1行目を見てみましょう。

```shell
$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
```

```on 0.0.0.0 port 8000```という記述は、0.0.0.0の8000ポートに対して開発用サーバが起動していることを表します。
0.0.0.0はワイルドカードのようなものでした。
つまりこれは、すべてのネットワーク・インターフェースの8000ポートに対して、サーバが起動している状態です。
この状態ではネットワークが繋がってさえいれば、remoteからアクセスすることが可能です。

次に127.0.0.1を指定して開発用サーバを起動してみましょう。
--bindオプションを利用することで指定できます。

```shell
$ python3 -m http.server --bind 127.0.0.1 8000
Serving HTTP on 127.0.0.1 port 8000 (http://127.0.0.1:8000/) ...
```

127.0.0.1の8000ポートに対してサーバが起動している状態です。
この状態でも同一ホストでブラウザにlocalhost:8000を指定すればHelloが表示されます。
ただしlocalhostはループバックアドレスです.
なので、この状態では仮にネットワークが繋がっていてもremoteからアクセスすることができません。

最後にlocalhostを指定してみましょう。

```shell
$ python3 -m http.server --bind localhost 8000
Serving HTTP on 127.0.0.1 port 8000 (http://127.0.0.1:8000/) ...
```

1行目の出力が127.0.0.1を指定した場合と全く一緒です。
これはlocalhostが127.0.0.1のホスト名であるためです。

## bindとは
別ウィンドウを立ち上げて、例えば以下のコマンドを2回叩いてみます。

```shell
# わかりやすさのために0.0.0.0を明示
$ python3 -m http.server --bind 0.0.0.0 8000
```

するとあとから起動した方では以下のようなエラーになります。

```shell
OSError: [Errno 48] Address already in use
```

一方で例えば、以下2つであれば同時に走らせてもエラーにはなりません。
この状態でブラウザからlocalhost:8000にアクセスすると、bindにlocalhostを指定した方のコンソールにアクセスログが出力されます。

```shell
$ python3 -m http.server --bind localhost 8000
$ python3 -m http.server --bind 0.0.0.0 8000
```

1つめと2つめの違いは、IPとポートの組み合わせが一致しているかどうかです。
私は、マシンに8000ポートは一つしかない、と思っていたことがありました。
ただこれは誤りで、実際は一つのネットワーク・インターフェースにつき一つです。
このネットワーク・インターフェースには、127.0.0.1のような仮想的なものも含まれます。
そしてマシンは複数のネットワーク・インターフェースを持つことができ、複数のIPアドレスを持つことが出来ます。

bindオプションは、ネットワークインターフェース（に紐づくIP）とそのポートを指定することで、そのネットワーク・インターフェースを通ってきたアクセスのみを識別して処理を行うことができます。
localhostや0.0.0.0といったちょっと特別なIPを例に挙げましたが、もちろんマシンが持つローカルIPアドレスをbindに指定することもできます。

この仕組はpythonに限った話ではなく、一般的にbind addressと呼ばれます。

# 参考
https://stackoverflow.com/questions/20778771/what-is-the-difference-between-0-0-0-0-127-0-0-1-and-localhost
AWS CLIでModuleNotFoundError: No module named 'botocore.httpsession' のエラー

# 対応
AWS CLIを入れ直す。

# 手順

## そもそもPIPがおかしなことになっているのでそれを解決

```bash
python3 -c "import site; print(site.getsitepackages())"
> ['/Users/sot528/.pyenv/versions/3.6.1/lib/python3.6/site-packages']

cd '/Users/sot528/.pyenv/versions/3.6.1/lib/python3.6/site-packages'
find . -name METADATA | awk -F'[/]' '{print $2}' | xargs rm -fr
```

permissionエラーが出たら `mv` で `/tmp` とかにどかしておく。

## AWS CLI入れ直し

`python -m pip` はpipがそのまま叩くとエラーを吐くので付加している。

```bash
python -m pip uninstall awscli
python -m pip install awscli --user
aws --version

> aws-cli/1.16.128 Python/3.6.1 Darwin/18.2.0 botocore/1.12.1
```

というわけで問題は解決した。pip周りからちゃんとしなきゃだが、まあそのうち。

# エラー内容

```bash
ModuleNotFoundError: No module named 'botocore.httpsession'
```

pip:

```bash
Traceback (most recent call last):
  File "/bin/pip", line 7, in <module>
    from pip import main
ModuleNotFoundError: No module named 'pip'
```
gnu c++でDLLからの例外が catch できない

先ほど、g++でコンパイルしたC++プログラムで例外が発生したらtry-catchで捕まえることができずにabortしてしまったというわけのわからないことが起きてしまいました。
まるまる一日かけて原因らしきものがややわかってきたので、備忘録代わりに書いておきます。

# 発生環境
* Windows10
* MinGW-W64 (i686-8.1.0-win32-dwarf-rt_v6-rev0)
* gcc version 8.1.0 (i686-win32-dwarf-rev0)

# 発生現象
C++ プログラムで throw した例外が catch できずにプログラムが abort する。

# 発生条件
1. 32bit でコンパイルされており、かつ
1. プログラムが複数のモジュール(DLLまたはEXE)から構成されており、かつ
1. 例外の throw 側モジュールと catch 側モジュールが別々であり、
1. throw 側と catch 側のモジュールの少なくとも片方が -static オプション付きでリンクされている。

# 再現性
必ず再現する。

# 原因
-static オプションでリンクされているとモジュール間の例外の通知に支障があるのではないかと想像しているが、根本的な原因は不明。
32bit 版でしか再現しない原因も不明。

# サンプルプログラム
以下のファイル (Makefile×1, C++ソールファイル×2, インクルードファイルx1) をファイルに落としてから make して UncaughtException_exe.exe を実行してください。

```main.cpp
#include <iostream>
#include <exception>
#include "HelloClass.h"

extern "C" int main()
{
    HelloClass hello;
    try
    {
        hello.Hello();
    }
    catch (const std::exception& ex)
    {
        std::cout << "2:" << ex.what() << "\n";
    }
}
```

```HelloClass.h
#pragma once

#ifdef EXPORT_HELLOCLASS_DLL
#define __DLLEXPORT __declspec(dllexport)
#else
#define __DLLEXPORT __declspec(dllimport)
#endif

class __DLLEXPORT HelloClass
{
public:
    HelloClass();
    ~HelloClass();
    void Hello();
};
```

```HelloClass.cpp
#include <iostream>
#include <exception>
#include <stdexcept>
#include "HelloClass.h"

HelloClass::HelloClass()
{
}

HelloClass::~HelloClass()
{
}

void HelloClass::Hello()
{
    try
    {
        throw std::runtime_error("Hello, world.");
    }
    catch (const std::exception& ex)
    {
        std::cout << "1:" << ex.what() << "\n";
        throw;
    }
}
```

```Makefile.mk
# コマンド行の行頭のTABに注意
all: UncaughtException_dll.dll UncaughtException_exe.exe

UncaughtException_dll.dll : HelloClass.o Makefile
	g++ -o UncaughtException_dll.dll HelloClass.o -shared -static

HelloClass.o: HelloClass.cpp HelloClass.h Makefile
	g++ -c -o HelloClass.o HelloClass.cpp -DEXPORT_HELLOCLASS_DLL -O

UncaughtException_exe.exe : main.o UncaughtException_dll.dll Makefile
	g++ -o UncaughtException_exe.exe main.o UncaughtException_dll.dll -static

main.o: main.cpp Makefile
	g++ -c -o main.o main.cpp -O
```

実行すると以下のように例外が catch されずに abort します。

``` uncaught-exception.log
1:Hello, world.
terminate called after throwing an instance of 'std::runtime_error'
  what():  Hello, world.
```

Makefile中の -static オプションを2か所ともコメントアウトすると、以下のように例外が通知されるようになります。

```catght-exception.log
1:Hello, world.
2:Hello, world.
```

# 追記 (2019.03.21)
ちょっと調べてみたら、gcc は 32bit と 64bit で例外の実装方法が異なるみたいですね。その辺に原因があるのかも。

https://www.google.com/search?q=seh+vs+dwarf&sa=X&ved=0ahUKEwjInYbV45LhAhUITLwKHSq6AEEQ7xYIKigA&biw=1458&bih=870

これ以上調べても -static リンクオプションを外すよりましな対策が出てこないような気がするので、ここまでにしておきます。:sweat_smile:
さて、MinGW のランタイム DLL の配布可否について調べねば・・・
PythonでFizzBuzzいろいろ

###配列に結果を格納し、出力する方式を採用
動作確認は[こちらのサイト](https://www.jdoodle.com/)を使いました

```bash:こんな感じで出力されていればOK
['1', '2', 'Fizz', '4', 'Buzz', 'Fizz', '7', '8', 'Fizz', 'Buzz', '11', 'Fizz', '13', '14', 'FizzBuzz']
```

```python3:1.一般的なFizzBuzz
fizzbuzz = []

for i in range(1, 16):
    if i % 15 == 0:
        fizzbuzz.append('FizzBuzz')
    elif i % 3 == 0:
        fizzbuzz.append('Fizz')
    elif i % 5 == 0:
        fizzbuzz.append('Buzz')
    else:
        fizzbuzz.append(str(i))

print(fizzbuzz)
```

```python3:2.関数と化したFizzBuzz
fizzbuzz = []

def get_fizzbuzz(i):
    if i % 15 == 0:
        return 'FizzBuzz'
    elif i % 3 == 0:
        return 'Fizz'
    elif i % 5 == 0:
        return 'Buzz'
        
    return str(i)

for i in range(1, 16):
    fizzbuzz.append(get_fizzbuzz(i))

print(fizzbuzz)
```

```python3:3.ループ内で関数定義することも可能
fizzbuzz = []

for i in range(1, 16):
    # その場しのぎ的な？
    def get_fizzbuzz(i):
        if i % 15 == 0:
            return 'FizzBuzz'
        elif i % 3 == 0:
            return 'Fizz'
        elif i % 5 == 0:
            return 'Buzz'
        
        return str(i)

    fizzbuzz.append(get_fizzbuzz(i))

print(fizzbuzz)
```

```python3:4.ラムダ式と化したFizzBuzz
fizzbuzz = []

get_fizzbuzz = lambda i: 'FizzBuzz' if i % 15 == 0 else 'Fizz' if i % 3 == 0 else 'Buzz' if i % 5 == 0 else str(i)

for i in range(1, 16):
    # [3.]と同じように ラムダ式はここに書いてもOK
    # get_fizzbuzz = lambda i: 'FizzBuzz' if i % 15 == 0 else 'Fizz' if i % 3 == 0 else 'Buzz' if i % 5 == 0 else str(i)
    fizzbuzz.append(get_fizzbuzz(i))

print(fizzbuzz)
```

```python3:5.三項演算と化したFizzBuzz
fizzbuzz = []

for i in range(1, 16):
    fizzbuzz.append('FizzBuzz' if i % 15 == 0 else 'Fizz' if i % 3 == 0 else 'Buzz' if i % 5 == 0 else str(i))

print(fizzbuzz)
```

```python3:6.リスト内包表記と化したFizzBuzz
fizzbuzz = ['FizzBuzz' if i % 15 == 0 else 'Fizz' if i % 3 == 0 else 'Buzz' if i % 5 == 0 else str(i) for i in range(1, 16)]

print(fizzbuzz)
```

```python3:7.ワンライナーと化したFizzBuzz
print(['FizzBuzz' if i % 15 == 0 else 'Fizz' if i % 3 == 0 else 'Buzz' if i % 5 == 0 else str(i) for i in range(1, 16)])
```

###ラムダ式もリスト内包表記も結局は三項演算
```python3:この記法を覚えることが重要？
'FizzBuzz' if i % 15 == 0 else 'Fizz' if i % 3 == 0 else 'Buzz' if i % 5 == 0 else str(i)
```

```javascript:javascriptでこう書いているのと同じ
i % 15 === 0 ? 'FizzBuzz' : i % 3 === 0 ? 'Fizz' : i % 5 === 0 ? 'Buzz' : String(i)

// 参考：javascriptでワンライナー
console.log([...Array(15)].map((v, i) => (i => i % 15 === 0 ? 'FizzBuzz' : i % 3 === 0 ? 'Fizz' : i % 5 === 0 ? 'Buzz' : String(i))(i + 1)));
```
CS193p class note - 10 Multithreading and Autolayout

- Multithreading is mostly about "queues" in iOS. Functions (usually closures) are simply lined up in a queue. Then those functions are pulled off the queue and executed on an associated thread(s). Queues can be "serial"(one closure a time) or "concurrent"(multiple thread servicing it).

- Main queue: All UI activity MUST occur on this queue and this queue only. And, conversely, non-UI activity that is at all time consuming must NOT occur on that queue. We do this because we want our UI to be highly responsive. And also because we want things that happen in the UI to happen predictably (serially).

```swift
let mainQueue = DispatchQueue.main

let backgroundQueue = DispatchQueue.global(qos: DispatchQos)
DispatchQos.userInteractive // high priority, only do something short and quick, very rare to use
DispatchQos.userInitiated   // high priority, but may take a little bit of time
DispatchQos.background      // not directed initiated by user, so can run as slow as needed
DispatchQos.utility         // long-running background processes, low priority
```

- There are two primary ways of putting a closure onto a queue. 

```swift
// You can plop a closure onto a queue and keep running on the concurrent queue
queue.async { ... }

// or you can block the concurrent queue waiting until the closure finishes on that other queue.
queue.sync { ... }

// we almost always do the former
```

```swift
// we have weakSelf here is not because this closure causes a memory cycle
// it's because if the viewController is nil somehow, we don't want the closure the keep the pointer in the heap
// when doing multi-threading stuff, always be aware of timing issue
DispatchQueue.global(qos: .userInitiated).async { [weak self] in
    let urlContents = try? Data(contentsOf: url)
    DispatchQueue.main.async {
        if let imageData = urlContents, url == self?.imageURL {
            self?.image = UIImage(data: imageData)
        }
    }
}
```

- All iPhones in portrait are compact in width and regular in height
- iPhone Plus is also compact in width and regular in height in portrait. But in landscape, the iPhone Plus is only compact in height.
- iPad is always regular in both dimensions. But depending on the environment an MVC is in, it might be compact(e.g. split view master)
Raspbianの最新バージョン(2018-11-13)ではQtSixAは動作しない?

# 問題
毎年、ラジコンカーみたいなやつ(?)を製作していますが、
心機一転を兼ね、最新のRaspbian(2018-11-13)を導入しました。
いつも通り、kuroko Sin様の記事　https://qiita.com/KurokoSin/items/f0f2de392d52821e7fa6
を参考にインストールを進め、接続段階まで来ましたが何故か接続されませんでした。
最終手段として、Raspbianの旧バージョン(2018-06-27)をインストールしました。
旧バージョンにする事でしっかりと動作することを確認しました！
# 旧バージョンのイメージ
動作を確認したRaspbian (2018-06-27)のダウンロードリンク
https://downloads.raspberrypi.org/raspbian/images/raspbian-2018-06-29/2018-06-27-raspbian-stretch.zip
Raspbianの旧バージョンの一覧
https://downloads.raspberrypi.org/raspbian/images/
# まとめ
当たり前ですが、最新のバージョンにして必ず動くとは限らない事を改めて実感しました。
セキュリティ的な面も考えると最新バージョンにする事で安心感がありますが、上記の様な事を考えるとなんとも言えないです。
もし、最新のバージョンで動作した方はコメントにて教えていただければ幸いです。
# 追記
使用しているBluetoothアダプタは(ELECOM LBT-UAN05C2/N)です。
使用するアダプタによって結果が変わるかもしれません。
Androidバーチャルマシンでのストレージへのファイルの配置方法

# 概要
Androidバーチャルマシンのストレージにファイルを置く方法
忘れないうちにメモ書きを残しておきます

どの環境でも同じとはおもいますが、以下が環境情報です
Windows10 Pro
Android Studio Version3.2.2
AndroidアプリVersion9.0

# 手順

**１．バーチャルマシンを起動**
AndroidStudio からファイルを配置するバーチャルマシンを事前に起動した状態にする

**２．ストレージにファイル配置する**
AndroidStudio 右下にある「DevicefileExplorer」をクリック

storage>self>primaryフォルダ配下の任意のフォルダに配置
ファイルを配置する場合、親フォルダを右クリックし「Upload」で対象ファイルを指定する
※親フォルダを右クリックで「Directory」でディレクトリ作成も可能

**３．ストレージ配下のファイルを読み込む（実機マシンと同様）**

アプリにストレージ参照権限を与えておく
[参考]ストレージへの参照、更新権限の付与

AndroidManifestに以下権限を追加

```AndroidManifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
```

ストレージディレクトリのパスを取得しファイルを読み込み
[参考]ストレージルートディレクトリパス取得
File dir = Environment.getExternalStorageDirectory();
tmux設定をmacとlinuxで共存させる

ubuntuの開発環境を整えるにあたり、`.tmux.conf`をmacからコピーしてきたがmacでしか動かない設定がベタ打ちになっており、そもそも起動しなかったのでmac, linuxで共存できるように設定を更新した。

tmux起動して `[exited] 62;9;c` とか言い始めたらまず間違いなくこれ

`reattach-to-user-namespace` これを呼び出してるから


- - -

# 解決策

`.tmux.conf`は`if-shell`で制御構文が書けるのでmac, linuxでそれぞれの設定を書く。

## mac

~~~tmux.conf
if-shell "uname | grep -q Darwin"
~~~
## linux

厳密にはxselでclipboardが利用できるかどうか調べて実行する。

~~~tmux.conf
if-shell 'type xsel'
~~~

- - -

# 最終的にこうなった

~~~tmux.conf
# クリップボード共有を有効にする
# for mac
if-shell "uname | grep -q Darwin" \
  'set-option -g default-command "reattach-to-user-namespace -l zsh"'
if-shell "uname | grep -q Darwin" \
  'bind-key -T copy-mode-vi y send -X copy-pipe-and-cancel "reattach-to-user-namespace pbcopy"'

# for Linux
# tmuxのbufferとxのclipboardを連携させる
if-shell 'type xsel' \
  "bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xsel -ib'"
if-shell 'type xsel' \
  "bind-key -T copy-mode-vi Y send-keys -X copy-pipe 'xsel -ib'"
if-shell 'type xsel' \
  "bind ] run-shell \
    'xsel -ob | xargs -0 -I{} tmux set-buffer -- {} && tmux paste-buffer'"
~~~
Go + Firestore (サーバー側) でローカルエミュレーターを使ってテストする

## 要約

- Cloud Firestore のローカルエミュレーターは Go でも使える
- `gcloud beta emulators firestore start` した後に環境変数 `FIRESTORE_EMULATOR_HOST ` をセットするだけ


## きっかけ

Firebase の超便利なデータストアサービス [Cloud Firestore](https://firebase.google.com/docs/firestore/?hl=ja) 、ついにGAになって東京リージョンもきて最近熱いサービスです！

しかし、クラウド系のサービスはローカル開発やテストをしたいときにどうやってやるか悩みがちです。大抵次のどちらかになる印象です。

- ローカルで起動できるエミュレーターなどを使う
- テスト専用のクラウドリソースを作っておいて、毎回そこに接続する

## Cloud Firestore にはローカルエミュレーターがある

幸い Firestore にはローカルエミュレーターがあります。google-cloud-jpにわかりやすい記事があがっているので、こちらも参照するとよいでしょう。

[Firestore ローカルエミュレーターを試してみた。 – google-cloud-jp – Medium](https://medium.com/google-cloud-jp/firestore-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F-e435668c18d1)

## Node.js しか対応してない・・・？

しかし、公式ドキュメントを読んでみると…

https://firebase.google.com/docs/firestore/security/test-rules-emulator?hl=ja#before_you_run_the_emulator

>現在エミュレータをサポートしている唯一の SDK は Node.js SDK です。エミュレータとのやりとりを容易にするために、@firebase/testing モジュールを用意しました。

Node.js 以外のランタイムでは使えなさそうです。残念ですね。

## Go でもローカルエミュレーターが使える

自分は最初 Go をつかって Firestore をサーバー側から操作するプログラムを書いてたので、「Node.js しか使えないのか…残念だなぁ」と思いました。

しかし、Go のライブラリのドキュメントを読んでいると…

https://godoc.org/cloud.google.com/go/firestore

>This package supports the Cloud Firestore emulator, which is useful for testing and development. Environment variables are used to indicate that Firestore traffic should be directed to the emulator instead of the production Firestore service.

>To install and run the emulator and its environment variables, see the documentation at https://cloud.google.com/sdk/gcloud/reference/beta/emulators/firestore/. Once the emulator is running, set FIRESTORE_EMULATOR_HOST to the API endpoint.

**Node.js だけではなくて、Go でも使えるじゃん！！！！！**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/10713/874be873-c400-33b0-443a-046ce7c4edf7.png)

## 使い方

Go のドキュメントに書いてある通りです。 `gcloud beta emulators firestore start` で指定のポート番号でローカルエミュレーターを立ち上げできます。

```sh
$ gcloud beta emulators firestore start --host-port=localhost:8812

Executing: ../google-cloud-sdk/platform/cloud-firestore-emulator/cloud_firestore_emulator start --host=localhost --port=8812
[firestore] API endpoint: http://localhost:8812
[firestore] If you are using a library that supports the FIRESTORE_EMULATOR_HOST environment variable, run:
[firestore] 
[firestore]    export FIRESTORE_EMULATOR_HOST=localhost:8812
[firestore] 
[firestore] Dev App Server is now running.
[firestore] 

```

あとは、↑の出力にも書かれている通り、環境変数 `FIRESTORE_EMULATOR_HOST` にセットしてあげると、Go の Firestore ライブラリはエミュレーターの方につなぎにいくようになります。

```go
package main

import (
	"context"
	"cloud.google.com/go/firestore"
	"log"
)

func main() {
	ctx := context.Background()

	// firebase projectIDは適当でOK
	store, err := firestore.NewClient(ctx, "testing")
	if err != nil {
		log.Fatal(err)
	}
	doc, _, err := store.Collection("users").Add(ctx, map[string]interface{}{
		"name": "hello",
	});
	if err != nil {
		log.Fatal(err)
	}
	println(doc.ID)
}
```

これでテスト専用の Firestore を作らなくても、気軽にテストが実行できる環境ができました。便利ですね！ :smile:
ABC - 052 - A&B

#AtCoder ABC 052 A&B
[AtCoder - 052](https://atcoder.jp/contests/abc052)

##A問題

A*Bの長方形の面積と、C*Dの長方形の面積を比べて大きいほうを出力すればよい。
また、A*B==C*Dの場合はその面積を出力（どちらの長方形の面積でもよい）

```java
	int numA = nextInt();
	int numB = nextInt();
	int numC = nextInt();
	int numD = nextInt();

	out.println(numA * numB > numC * numD ? numA * numB : numC * numD);
```

##B問題

xの最大値を出力する。
xの値は下記操作によって変動する。
文字列Sを頭から走査して、一文字ずつ確認する。
※最終的なxの値ではなく、「xの値がmaxになった時の値」が必要
>文字列Sの中に'I'があればx++
>文字列Sの中に'D'があればx--

```java

		int numN = nextInt();
		char[] strS = next().toCharArray();

		int x = 0;
		int res = 0;
		for (int i = 0; i < strS.length; i++) {
			if (strS[i] == 'I') {
				x++;
			} else if (strS[i] == 'D') {
				x--;
			}
			//xの値が最大かどうかを調べる。
			res = Math.max(res, x);
		}

		out.println(res);
```
【初心者向け】ファイル操作の原理、およびファイルポインタの意味について

###Abstract
ファイル操作の原理とファイルポインタの意味について、まとめておこうと思う。

###ファイルの読み書きについての整理
まず、磁気記憶媒体からメモリへのファイルの読み込み、およびメモリへのファイルへの書き込みの原理について、以下の例を基に整理したいと思う。

想定：磁気記憶媒体に保存されたファイル『data.csv』を扱う。

ユーザーの指示：ファイル『data.csv』を追記モード(aモード)で開け

→メモリが、『data.csv』のファイルサイズ、50バイト、に相当する作業領域(領域Aとする)を確保する。
	領域Aの先頭アドレスの値を114514番とすると、そこから50個先の114563番までが領域Aに相当する。
	この114514番～114563番の50個のアドレス値をそれぞれ要素にもつ配列を生成し、
	それをユーザーにより宣言された変数 $data に代入。

→磁気記憶媒体に保存された『data.csv』がメモリの領域Aに読み込まれる。
	以下、ユーザーはポインタ変数 $data を介して領域Aに読み込まれた『data.csv』にアクセスし、
	様々なファイル操作を行うことになる。

### ファイルポインタとは
ファイル"ポインタ"というからには、ポインタの一種である
ファイルポインタとは何か、を説明すると、以下のようにいえる：


ファイルポインタとは、
ファイルの内容を読み込んだり、新しく何かを書き込んだりする際に、
読み込む部分を指定したり、新たに書き始める起点を指定したりするための指定子の役割を持つ変数である。部分の指定は、ファイルを読み込んだメモリ領域のアドレス値を使っておこなう。

上の『data.csv』の例では、ユーザーが何らかのファイル操作を命令すると、
データ全体（のアドレス値）が格納されているポインタ変数 $data の配列の中から、
操作の目的に沿ったある一つの要素を取り出し、それをファイルポインタとして、ファイルポインタ変数 $fp に格納する。

たとえば『data.csv』をfopenの追記モードで開くと、ファイルの最後尾から書き始めるために、
ポインタ変数 $dataの最後の要素である114563番が（fopenの戻り値として）取り出され、
それが$fpに格納される。そして、この状態で
fwrite($fp,"こんにちは");
を実行すると、114564番から先の領域に、データ『"こんにちは"』のデータサイズ分だけ新たなメモリ領域（領域Bとする）が確保され、
その領域Bにデータ『"こんにちは"』が格納され、
ポインタ変数 $data の配列には、領域Bのアドレス値が新たに要素に追加される。

###以上
Unityでオフセット値などを3Dカーソルで調整したい

# はじめに

UnityでGameObjectの配置場所をオフセットでずらしたい時にフィールドを用意しておくとInspectorから調整できます。しかしVector3を斜めにずらしたい時など、数値だけでは調整が難しい場合もあります。そんな時に[エディター拡張入門](https://anchan828.github.io/editor-manual/web/index.html)でGizmoとHandleを作る方法を見付けて、簡単なエディター拡張を作るとすごく便利でした。

# エディター拡張の作り方

以下のようなクラスがあり`offset`を3Dカーソルで調整したいとします。

```cs:Body.cs
using UnityEngine;

public class Body : MonoBehaviour
{
	/// <summary>
	/// 3Dカーソルを作りたいフィールド
	/// </summary>
	public Vector3 offset;
}

```

以下のようなエディター拡張を作ると3DカーソルとギズモをScene Viewに作ることができます。

```cs:BodyEditro.cs
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;

/// <summary>
/// 操作したいクラスをCustomEditorAttributeのtypeofで指定する
/// </summary>
[CustomEditor(typeof(Body))]
public class BodyEditor : Editor
{
	/// <summary>
	/// 3Dカーソルを作る
	/// </summary>
	private void OnSceneGUI()
	{
		var component = target as Body;
		var offset = component.offset;
		var transform = component.transform;
		offset = Handles.PositionHandle(transform.TransformPoint(offset), transform.rotation);
		component.offset = transform.InverseTransformPoint(offset);
	}

	/// <summary>
	/// ギズモを作る
	/// </summary>
	/// <param name="body"></param>
	/// <param name="gizmoType"></param>
	[DrawGizmo(GizmoType.NonSelected | GizmoType.Active)]
	private static void DrawEyeTargetGizmos(Body body, GizmoType gizmoType)
	{
		var transform = body.transform;
		Gizmos.color = Color.gray;
		Gizmos.DrawSphere(transform.TransformPoint(body.offset), 0.05f);
	}
}
#endif
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8995/fa3031ab-810f-d30c-8243-d77928cc50e0.png)


# 参考リンク

* [エディター拡張入門](https://anchan828.github.io/editor-manual/web/index.html)
    * [第16章　Gizmo（ギズモ）](https://anchan828.github.io/editor-manual/web/gizmo.html)
    * [第17章　Handle（ハンドル）](https://anchan828.github.io/editor-manual/web/handles.html)
Sigfox Shield for Arduinoの回線継続方法

#Sigfox Shield for Arduinoって？

スイッチサイエンス社より発売されている、Arduino用のSigfoxが利用できるシールド。
sigfoxの利点である、「超低電力」はArduino本体側がそこそこな電気食うために電池一つで◯ケ月みたいな使い方は出来ないけど、評価用にはもってこいの機器。
https://www.switch-science.com/catalog/3354/

本体価格に１年分の回線使用料がついている。

#いちねん が けいかしました
利用開始からいよいよ一年、回線利用期間が切れてしまったので回線の申請。

##sifox buyで回線の購入
https://buy.sigfox.com/
Activate my DevKit -> デバイスID,PACの入力。
<img src="https://qiita-image-store.s3.amazonaws.com/0/317488/27ab889d-a237-8a4e-02e4-4f882a8f8a1c.png" width=50%>
・・・できず。

KCCS様に確認したところ、Activate my DevKit（延長）ではなく、Buy Connectivity（新規回線）でやってTransferしてとのこと。

Buy Connectivityで購入完了。
backendで新規回線グループができていることを確認。

##回線移行
backendで回線移設しようとしたが、移設ボタン(transfer)がない。
<img src="https://qiita-image-store.s3.amazonaws.com/0/317488/552af490-5c28-b652-4dd9-fb72275b0c4e.png" width=50%>
どうも、device - new で移設する必要があるらしい。

しかし、device - newで必要なPAC情報は機器に元々あるものから、グループ登録が行われるたびに変わるらしい。
機器使用開始時点でグループが変わっているのでPACが変更となっている。
しかし、device  - informationで新しいPACの確認が行えない。

##デバイス登録
KCCS様に現在のPACを確認してもらい、ようやく新規デバイスの回線移行が完了。

devide - new 
移設先のグループ選択
Identifier (hex!)　　　　：00+デバイスID
Name 　　　　　　 　　　　：すきな名前
PAC 　　　　　　　　　　　：現在登録中のPAC（※KCCS様より聞いたもの）
End product certificate ：Where can I find the end product certificate?を選択、Register as a prototypeにチェック

30分ほどで自動的に回線移設が完了。

<img src="https://qiita-image-store.s3.amazonaws.com/0/317488/cb804ffc-3d12-5819-879a-88f3af13ace8.png" width=50%>
移設後の回線ではtransferボタンもあるし、PACも表示されている。

##もしかして、延長できる？
試しに、教えてもらったPACで回線延長しようとすると…
<img src="https://qiita-image-store.s3.amazonaws.com/0/317488/09fd9a0c-4919-21a7-00b5-61bfaa857ec7.png" width=50%>
とおった！

#まとめ
・Sigfox Shield for Arduinoでは登録後のPACが分からないので、KCCS様にPACを問い合わせる必要がある
・PACが分かった場合、新規回線（Buy Connectivity）で移設すると用途が広がる。
・楽したければ延長（Activate my DevKit）でもOK
SmartyでHTMLタグと改行コードをまとめて削除する方法

EC-CUBE2.12系でのこと。
商品詳細ページのコメント欄の情報をJSONデータに渡す時にHTMLや改行コードが混ざっていたので、Smartyのテンプレート側で削除して渡したい時に記述した内容のメモ。

```smarty
<!--{$arrProduct.main_comment|nl2br|strip:""|strip_tags:false|escape}-->
```

`$arrProduct.main_comment`がコメントの情報。
それをパイプでパラメータを渡して順番に前から処理。

1. `nl2br`で改行コードを`<br>`タグに変換
2. 空白・改行・タブを置換する`strip`修飾子で空白に置換
3. `strip_tags`でHTMMLタグを除去
4. `escape`でタグの無効化を念の為

これで削除できました ＼(^o^)／
DraperでAssociationする方法

# 概要
DraperでAssociationして、親モデルからDecorateされた子モデルを取得する時に少しハマったので、手順を残します。

# モデルの内容
BookとReviewが1対多の関係になっている。

```ruby
class Book < ApplicationRecord
  has_many :reviews
end

class Review < ApplicationRecord
  belongs_to :book
end
```

# やりたいこと
`book.reviews`でアクセスした時の`review.created_at`をフォーマットした状態にしたい。

- Decorateしていない状態だとこうなる。

```ruby
@book = Book.find(1)
@book.reviews.first.created_at
=> Sun, 10 Mar 2019 06:14:33 UTC +00:00
```

- Decorateしてフォーマットした時刻を出力したい。

```ruby
@book = Book.find(1).decorate
@book.reviews.first.created_at
=> "2019/03/10 06:14"
```

# やり方

- `BookDecorator`内で`ReviewsDecorator`をアソシエーションする。

```ruby
class BookDecorator < Draper::Decorator
  delegate_all
  decorates_associations :reviews
  # もし1対1の場合は以下のように設定する。
  decorates_association :review
end
```



- `ReviewDecorator`にデコレートする内容を書く。

```ruby
class ReviewDecorator < Draper::Decorator
  delegate_all

  def created_at
    return object.created_at.strftime("%Y/%m/%d %H:%M")
  end
end
```

# 結果
フォーマットされた出力結果が得れた。

```ruby
@book = Book.find(1).decorate
@book.reviews.first.created_at
=> "2019/03/10 06:14"
```
welcomeページ表示までの流れ

#処理の流れ

###1.エントリポイント
sampleapp/publicディレクトリにはindex.phpがあり、このファイルがLaravelの各処理への入り口です。
index.phpはクライアントからのリクエストを受け、Composerが生成したオートローダーの定義をロードします。
それから、bootstrap/app.phpスクリプトから、Laravelアプリケーションのインスタンスを取得します。
Laravel自身の最初のアクションは、アプリケーション／サービスコンテナのインスタンスを生成することです。

```php
///Laravelはじめ！役はOK!Googleだよ!
define('LARAVEL_START', microtime(true));

///Composerは、便利な自動生成されたクラスローダーを提供します。
///私たちのアプリケーション。利用するだけでいいのです。単純にそれを要求します
///私達が手動について心配する必要がないようにここに原稿に入りなさい
///後でクラスをロードする。リラックスするのは素晴らしい気分です。

require __DIR__.'/../vendor/autoload.php';

///私たちはPHPの開発を照らす必要があるので、明かりをつけましょう。
///これはフレームワークをブートストラップし、それを使用できるようにします。
///実行して送信できるように、このアプリケーションをロードします。
///応答はブラウザに戻ってきて、私たちのユーザーを喜ばせます。

$app = require_once __DIR__.'/../bootstrap/app.php';

/// アプリケーションを入手したら、着信要求を処理できます。
///カーネルを通じて、関連する応答をに返送します。
///クリエイティブを楽しむことができるクライアントのブラウザ
///そして私達がそれらのために準備したすばらしい適用。

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

$response->send();

$kernel->terminate($request, $response);

///随分とおしゃれな説明だなおい

```

---

###2.ルーティング

「○○○のURLにアクセスがあったらxxxの処理を呼び出す」と行った処理をまとめて置くところです。
ルーティングを定義するファイルは、routesディレクトリに入っています。

```php

Route::get('/',function(){
 return view('welcome');
})

///get関数は第１引数にURLを指定し、第２引数に関連づける処理を記述します。
///この場合、第１引数にトップページのURLが、第２引数には無名関数（クロージャ）が実行されます。
///クロージャ内には、「View」ヘルパ関数で「welcome」の名前のビューを呼び出す処理が記述されています。

Route::get('/sample', 'samplesController@index');

///get関数の第１引数にURLを指定し、第２引数にコントローラー名@アクション名を記述します。
///この場合、samplesControllerのindexアクションが実行されます。
```
---

###3.ビュー

「welcome.blade.php」はほとんどがHTMLで記述されたファイルですが、Laravelに標準で組み込まれているテンプレートエンジン [Blade]の構文です。{{・・・}}で囲むことや@で始めるif文などで書いた部分がPHPファイルに書き出され、HTMLとなりブラウザに表示されます。

```php

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
   <h1>{{ $sample }}はsampleだよ<h1>
  </body>
</html>
```

---
テストコードを書いてみよう




#テストコード

 LaravelにはPHPを代表するテストフレームワークの「PHPunit」が同梱されている他、ブラウザを使った自動操作が可能な「Laravel Dusk」など、開発者のテストを支援する機能が備わっている。

ここでは「PHPunit」の説明をします。

##準備
/homeにアクセスした際、「こんにちは」と表示されるviewファイルを作成してください。

---


#テストコードファイルを作成する。

```

$ php artisan make:test HomeTest

Test created successfully.

```


tests/FeatureディレクトリにHomeTest.phpが作成される。

#テストコードを書きましょう！

```php

<?php

namespace Test\Feature;

use Tests\TestCase;

class HomeTest extends TestCase
{
  public function testStatusCode()
  {
    $response = $this->get('/home');
    $response -> assertStatus(200);
  }

  public function testBody(){

    $response = $this->get('/home');

    $response-> assertSeeText("こんにちは");
  }
}
 ?>

```
こんな感じです。
TestCaseを継承して作成されます。

また、テストメソッドの名前は先頭に「Test」を付与します。

---

#今回実行するテスト内容は？

**testStatusCodeがステータスコード200を確認するメソッド**
  ※ステータスコード200とは、クライアントからのリクエストが受付に成功した時の番号です

**testBodyがレスポンスに文字列「こんにちは」を含むことを確認するメソッド**

です。

テストするviewファイル(blade.php)は

```html


<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    こんにちは！
  </body>
</html>

```


実行していきましょう！

コマンドは
**vendore/bin/phpunit**です。
引数に対象のテストクラスファイルを指定します。
指定しない場合はtestフォルダ以下の全てのテストファイルが実行されます。
用途によって使い分けましょう！

```
$ vendor/bin/phpunit tests/Feature/HomeTest.php
PHPUnit 6.5.14 by Sebastian Bergmann and contributors.

..                                                                  2 / 2 (100%)

Time: 90 ms, Memory: 12.00MB

OK (2 tests, 2 assertions)

```


最後に「OK(2 tests,2assertions)」と表示されれば、トップ画面のテストをクリアしています！

テスト結果はRedとGreenで分けられます。Greenであれば異常なし！ということですね。
Go言語の独特な文法集

Go言語の文法のうち、直感で分からなかったものをまとめておく。そのうち、増えていくかも。

# embedded struct

## 定義

```go
type <struct name> struct {
    <embedded struct name>
    <field>
    <field>
    ...
}
```

## 使い方

```go
type Person struct {
    age int
    name string
}
type Student struct {
    Person
    name string
    grade int
    class string
}

student := Student{Person{10, "alice"}, "bob", 4, "C"}

student.Person.age // => 10
student.age // => 10

student.Person.name // => alice
student.name // => bob
```

## 説明

Student structの中に、Person structが組み込まれて(embedded)いる。Compositパターンの一種らしい。

# type assertion

## 定義

```go
<casted instance> := <instance>.(<type name>)
<casted instance>, <is_success> := <instance>.(<type name>)
```

## 使い方

```go
type Dog interface {
    bark()
}
type PetDog struct {
    owner string
    bark()
}
func (PetDog dog) bark() {
    fmt.Printf("woof")
}
type GuidDog struct {
    trainer string
    bark()
}
func (GuidDog dog) bark() {
    fmt.Printf("Bow")
}

var d_pochi, d_hana Dog = PetDog{"alice"}, GuidDog{"bob"}

pd_pochi := d_pochi.(PetDog)
pd_pochi.bark()

// pd_hana := d_hana.(PetDog) // => panic
// pd_hana.bark()
	
if _, ok := d_hana.(PetDog); !ok {
	gd_hana := d_hana.(GuidDog)
	gd_hana.bark()
}
```

インスタンスの抽象型(インターフェース型)を具体型(インスタンス型)に変える。戻り値が一つの場合は、変換後のインスタンスが返される。また、型変換に失敗した時はpanicになる。戻り値が二つの場合は、一つ目に変換後のインスタンスが、二つ目に変換の成否が返される。変換に失敗した時は、一つ目にはnilが、二つ目にはfalseが返される。
Unity初心者やってみた3

前回：https://qiita.com/akagane99/items/cd1603ef4c3bddac86ed
次回：https://qiita.com/akagane99/items/0d01e4b21919278f5469
一覧：https://qiita.com/akagane99/items/2dd005511a8d50f5634d

### （前回の続き）

* Unity 5でコインプッシャーゲームを作ろう（前編） | Think IT（シンクイット）
  * https://thinkit.co.jp/story/2015/07/22/6223
* Unity 5でコインプッシャーゲームを作ろう（中編） | Think IT（シンクイット）
  * https://thinkit.co.jp/story/2015/08/05/6257

#### ここまでできた

* https://akagane99.github.io/WebGLGames/coin2/
  * ［スペース］キーでコイン落ちる。[←][→]キーでコイン落ちるところが動く
* https://akagane99.github.io/WebGLGames/coin3/
  * 壁付けた。バグで壁めりこむ

いままでの一覧
https://github.com/akagane99/WebGLGames/blob/gh-pages/README.md

### Unityエディターの日本語化

* メニューバーの Edit > Preference
  * Editor Langage:　Japanese

日本語化後
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109904/aa2a6622-0041-014a-adf5-908e341aa255.png)

#### 参考リンク

【Unity】Unityエディターを日本語化する方法（Unity2018.1） - テラシュールブログ
http://tsubakit1.hateblo.jp/entry/2018/05/07/222059

### デバッグ方法

プログラムに下記を記載する。
今回の例は`Update()`に記載した。

```
    void Update()
    {
        // 下記を追記
        Debug.Log("コンソールウィンドウにデバッグログが出力される");
    }
```

#### コンソールウィンドウ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109904/3963c885-587b-60f3-dda8-1c99e5444ae5.png)

#### 参考リンク

[Unity] デバッグログを出す方法 - Qiita
https://qiita.com/phi/items/ed015fb9d288f51f384b

Debug.Log - Unity スクリプトリファレンス
https://docs.unity3d.com/ja/current/ScriptReference/Debug.Log.html

### // 行動予定・行動結果

* 行動予定
    * 初めの本1冊買う
* 行動結果
    * 2.5時間（4時間/20時間）
Heroku上でScalikeJDBCからPostgreSQLを使う際のメモ

## やること

以下の設定をどこかに記述する

```scala
  Try {
    sys.env("DATABASE_URL")
  } match {
    case Success(dbUrl) => {
      val uri = new java.net.URI(dbUrl)
      val userName = uri.getUserInfo().split(":")(0)
      val password = uri.getUserInfo().split(":")(1)
      ConnectionPool.singleton(s"jdbc:postgresql://${uri.getHost}:${uri.getPort}${uri.getPath}", userName, password)
    }
    case _ =>
      ConnectionPool.singleton("jdbc:postgresql://localhost:5432/hoge", "user", "password")
  }
```

## 解説

Heroku から渡される `DATABASE_URL` のフォーマットは以下の様になっているが。これだとScalikeJDBCは受け付けてくれない。

```
postgres://<username>:<password>@<host>/<dbname>
```
なので上のコードを使って以下のフォーマットに変換してやる必要がある

```
jdbc:postgresql://<host>:<port>/<dbname>?sslmode=require&user=<username>&password=<password>
```

参照: https://devcenter.heroku.com/articles/heroku-postgresql#connecting-in-java