OmniAICreator/Qiita-1.07M huggingface dataset:
Spyder の IPython コンソールでは multiprocessing が正常に動作しない

気軽に並列処理を実装できる multiprocessing．Python スクリプトの開発に Spyder を使用している場合，IPython コンソールでは実行できないので注意．

- [python 3.x - No multiprocessing print outputs (Spyder) - Stack Overflow](https://stackoverflow.com/questions/48078722/no-multiprocessing-print-outputs-spyder)
- Spyder から実行したい場合は，リンク先の回答の通り「外部システムターミナルで実行されるように設定する．
    - `Run > Configuration per file > Execute in an external system terminal`

>![image.png](https://qiita-image-store.s3.amazonaws.com/0/68605/c32bfadb-0ad4-3c8b-122e-08f577cd8c2a.png)
>画像引用元: http://python4study.9isnine.com
herokuにバイナリファイルをデプロイする

---

[バイナリファイル実行用のbuildpack](https://github.com/uehr/heroku-buildpack-bin)を自作したので、それを利用してherokuにバイナリファイルをデプロイする方法を紹介します。Linuxのコンテナで動くバイナリなら何でもデプロイ出来そうです。

---
# 取り敢えず動かしたい
最低限のファイルを用意したリポジトリを作ったので、取り敢えずサンプルを動かしてみたい方は以下の手順でデプロイしてみてください。

```shell

# Get example app
git clone git://github.com/uehr/binary-heroku-example.git
cd binary-heroku-example

# Create a heroku app
heroku create --stack cedar --buildpack https://github.com/uehr/heroku-buildpack-bin.git

# Deploy to heroku
git push heroku master

# Open heroku app url
heroku open
```

成功すると[このように](https://binary-heroku-example.herokuapp.com)表示されます

---

# 実行するバイナリファイルを準備

```
.
└── binary
```


# Procfileを作成
用意したバイナリファイルへのパスをこのようにProcfileへ書き込みます

```:Procfile
web: ./binary
```

ディレクトリ構成

```
.
├── binary
└── Procfile
```

# git add/commit
```shell
git init
git add .
git commit -m "initial"
```

# herokuアプリ作成
buildpackを指定してherokuアプリを作成

```shell
heroku create --stack cedar --buildpack https://github.com/uehr/heroku-buildpack-bin.git
```
アプリ名を設定する場合

```shell
heroku create アプリ名 --stack cedar --buildpack https://github.com/uehr/heroku-buildpack-bin.git
```

# herokuにデプロイ
後はpushしてデプロイするだけです、無事動くことを祈りましょう...。

```shell
git push heroku master
```

# デバッグ
`heroku open`: herokuアプリのURLを開いて動作状況を確認
`heroku logs -t`: リアルタイムにherokuのログとバイナリファイルの標準出力を確認
リモートブランチを、異なる名前のローカルブランチにpull（merge）する方法

どうにもこうにも上手くpull出来ていなかったのがようやく解決した（？）と思われるのでまとめていく。

###ブランチの関係と問題点
自分は、複数のコードを同時に触ることが多々あるため、下の図のような関係でブランチを切っている。

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/252703/1bec10a5-bab1-84e9-f70f-e30cf82b23df.png)
※リモートのA…B…C…には、コード名やパラメータ名を入れている。

developmentで書き換えたコードを、リモートでは異なるブランチにpushし、それをmasterにmergeするというやり方をしている（nclは特に）

異なる端末で作業をした際、上手くpull出来ないことが多々あって困っていた…
特に、普段作業している研究室の端末の場合は、ほとんどgit pullで解決していたのだが、使用のmac book airでは上手くpull出来ない。

###対処法
上の図で、リモートのdevelop-Cをローカルのdevelopmentに反映させる場合

```:terminal
$ git checkout development
$ git merge remotes/origin/develop-C
```
とすれば上手くいった。が、mergeしてしまっているため、logを見返すことが必要になってくると、あまりよろしくないのかも。
というのと、複数のブランチで競合してる場合も…あまり深く考えずにやっているが、本当はもう少し考えてブランチを切って作業をする必要があるかも。
MarkLogicのトラブルシューティング基本方針メモ

概要
===
MarkLogicでトラブルが起きた時の対処方法を整理することにします。

背景
===
MarkLogicにしろ何にしろ、トラブルの問合せ先は現場から遠く、対応に時間がかかります。そこで本稿では現場レベルの保守要員が、障害発生時において集めて確認しなければいけない情報と、それに対応するヒントとなる情報を整理してきます。

ログの確認
===
MarkLogicに関連したログとしては、大きく以下のものが考えられます。必ず一定期間保存するようにしましょう。

| 出力内容 | 出力場所や方法 | 発見できたトラブルの例 |
|---|---|---|
| MarkLogicが出力するログ | /var/opt/MarkLogic/Logs | DB内での障害全般 |
| クライアントが出力するログ | APの仕様に依る | 通信エラー・認証エラー |
| リソース利用状況 | sarコマンドなど | リソースの逼迫 |
| OSが出力するログ | /var/log/messages | ディスクチェックの有無 |

最も重要なのは、MarkLogicが出力するErrorLogとAccessLogです。個人的にはDebugレベル以上は取得・Warningレベル以上での発報をお勧めします。その中にXDMPメッセージが出ている場合は、[公式サイト](https://docs.marklogic.com/guide/messages/XDMP-en)の一覧から対応方法を確認できます。デフォルトでは１週間保持されますが、日次で取得・退避しましょう。
次にクライアントのログやメッセージを確認しましょう。例えば、MarkLogic社が提供するバルクロードツール[Content Pump](http://docs.marklogic.com/guide/mlcp.pdf)は、実行時にロード成功数・失敗数を標準出力します。これを確保すればトラブルの概要の把握に役立ちます。
リソース利用状況はsarなどが有名ですね。取得間隔は1分以内が望ましいです。後述の通りMarkLogicからも似たような情報が取り出せます。
それ以外では、/var/log/messagesの以下の記述からファイルチェックが行われていないことを指摘されたことがあります。

```
Dec 11 01:11:16 xxxdb01_in kernel: EXT4-fs (sdf1): warning: maximal mount count reached, running e2fsck is recommended
Dec 12 01:01:34 xxxdb01_in kernel: EXT4-fs (sde1): warning: maximal mount count reached, running e2fsck is recommended
```

既知バグの確認
===
発生した事象は、既知のバグとして最新版では修正されている可能性があります。この[サイト](https://help.marklogic.com/Bugtrack/List)には、これまでのバグの一覧があります。起きている問題に関するログ内のエラー文言や関連しそうな英単語をCtrl-fで検索してみてください。
ちなみに、本稿を執筆した当時は最新バージョンが9.0-6.1でしたが、その直前の9.0-6と比べて36個のバグが修正されたと記述されていました。私見ですが、やはりメインバージョンで追加された新機能に関しての修正が目立つような気がします。
もし、ここでヒットするものがあれば、「バージョンアップ」で対応方針が固まるはずです。

ナレッジの検索
===
この[サイト](https://help.marklogic.com/Knowledgebase/List)には、ナレッジベースで色々と説明や対策が書かれています。例えば、「Handling XDMP-MODNOTFOUND and XDMP-NOPROGRAM errors」という[記事](https://help.marklogic.com/Knowledgebase/Article/View/160/0/handling-xdmp-modnotfound-and-xdmp-noprogram-errors)には、XDMP-MODNOTFOUNDやXDMP-NOPROGRAMが起きた時の説明が載っています。
必ずしも適用可能な対策が載っているわけではありませんが、状況の把握には役立ちそうです。また多くがエラー文言などからGoogle検索でヒットするのも便利です。

リソースの確認
===
sarを挙げていましたが、MarkLogic自身もポート8002番にアクセスするとExcel形式で出力を行うことができます。詳細はこの[ページ](https://docs.marklogic.com/guide/monitoring/history)を参考にしましょう。DB設定のうちGroupsの変更が必要です。デフォルトでは、最も細かい1分単位の情報は1週間で消されてしまうので早めに取得・退避するように心がけましょう。
ポート8002番にアクセスすれば、リソース利用状況をグラフで見ることもできます。

サポートダンプの取得と共有
===
MarkLogicの設定を確認する手段として、SupportDumpというファイルを出力することができます。出力方法はこの[ページ](https://help.marklogic.com/Knowledgebase/Article/View/13/15/creating-a-support-request)を参考にしましょう。ver8とver9でやや画面が変わっていますが、本稿を書いた時点ではこのページはどちらも網羅してくれています。

基本的に管理画面で見れる情報と同じものが書いているだけですが、遠隔地などでMarkLogicに直接触れることができないメンバに対して意見を求める場合には十分に使えるはずです。

雑感
===
運用中に何らかのトラブルが起きない製品はないと思います。ゆえに問題が起きた時の保守・運用のメンバの対応は重要です。プロジェクト管理する方々には、保守・運用メンバに対する一般的な運用管理の能力の確認だけでなく[MarkLogic無料研修](https://mlu.marklogic.com/registration/)の紹介など対応能力を上げておいていただくことをお勧めします。


------------------------------------------------------------------------
笑顔プロジェクトを チアプログラミングで！ オリジナルが強み！ 未来志向のペッパーロボとチア体操

https://www.youtube.com/watch?v=b46l7uqYDsQ&feature=youtu.be

ペッパーとともに体ストレス解消し笑顔になろう！
　被災地まではいけないけど被災地の関係者の皆様に元気を送りたい！

ちょっとの時間で体を動かして体や心の大きなストレスを少しでも解消させてあげたい！笑顔を取り戻してもらいたい！
　との思いから　被災地応援企画、笑顔プロジェクトを発足させました。
被災地の皆さんへ想いを寄せる皆さんもチア体操でチア（応援、元気、活気づける)って、体すこやかみ笑顔にしてみませんか?
　
  今回は、被災地のお子様にも遊んでいただけるように、チア文字(TAKE)だけでなく、チア動物シリーズで体を動かす＝　ワニさん、ゴリラさん、フラミンゴも入れてみました。　　フラミンゴさんは片足バランスができなくなっているのは、体の歪みや体幹が不足ということもあるので、フラミンゴで片足を上げて　1分　静止ポーズをするのは、大人にシニアに、オススメです。

🔴企画、チア体操指導
浅井直湖
日本に最初に「チアリーダー」というカタカナを作り.オープンデータにして広げた 日本初のチアリーダー
  俺たちひょうきん族のたけちゃんマンのテーマ曲、振り付け指導を担当
  出演はPISCEScheerleadersでした。
🔴制作支援
マッキー小澤
🔴制作協力
アトリエ秋葉原

（　追加＞プログラミングで、被災地への笑顔と、少しでも健やかなる体の健康を遊びながら自然に笑顔でしてもらおうを　作りました。
　　　　　　今回はペッパーチームで応援を企画して、
　　　　　　やっとできました。ペッパーの動作に注目　　
　　　　　　（内容については、今度載せる予定？？？、か直接お話しします。
　　　　というか、ここに来るまでで何日もかかり、大変で、息切れ　）

　そして、おなじように、動いて見て、動画撮った方がいたら　
　　他のロボットでも　違う分野のマイコン使ったりでも、
　動画や　説明入れて　ぜひおしらせください！！

　プログラミングも、エンジニアも　　新しい分野で繋がろう！！

ロボットと共存ぺッパーでプログラミングしてチアプログラミング★応援！
　チアプログラミング  創始者より
【MovableType】テンプレートタグで索引ページを作る

インデックステンプレートで索引ページを作るという、一瞬何が言いたいのか分からないかも知れないがそういう事。
「索引」で検索すると「インデックステンプレート」も検索にかかってググラビリティが低かった。
index.htmlはトップページであってインデックス（索引）じゃないよね、というのと似たような話かも知れない。

## 環境
Movable Type 7 r4208

## 構文

```html
<h2>記号</h2>
<ul>
<mt:Var name="before_alphabet" value="1">
<mt:Entries sort_by="title" sort_order="ascend">
  <mt:Var name="entry_title_first_letter_before" value="$entry_title_first_letter">
  <mt:SetVarBlock name="entry_title_first_letter"><$mt:EntryTitle trim_to="1"$></mt:SetVarBlock>
  <mt:If name="entry_title_first_letter" ge="A">
    <mt:Var name="before_alphabet" value="0">
  </mt:If>
  <mt:If name="before_alphabet" eq="0">
    <mt:If name="entry_title_first_letter" ne="$entry_title_first_letter_before">
      </ul>

      <h2><$mt:Var name="entry_title_first_letter"$></h2>
      <ul>
    </mt:If>
  </mt:If>
  <li><a href="<$mt:EntryPermaLink$>"><$mt:EntryTitle$></a></li>
</mt:Entries>
</ul>
```

## 出力
見やすいように整形している。

```html
<h2>記号</h2>
<ul>
   <li><a href="">:-2m</a></li>
</ul>
<h2>A</h2>
<ul>
   <li><a href="">AA</a></li>
   <li><a href="">AKB</a></li>
</ul>
<h2>N</h2>
<ul>
   <li><a href="">NMB</a></li>
</ul>
<h2>b</h2>
<ul>
   <li><a href="">bbb</a></li>
   <li><a href="">bbc</a></li>
</ul>
<h2>c</h2>
<ul>
   <li><a href="">ccc</a></li>
</ul>
<h2>ほ</h2>
<ul>
   <li><a href="">ほげ</a></li>
</ul>
<h2>ａ</h2>
<ul>
   <li><a href="">ａａａ</a></li>
</ul>
```

見ての通り、記号→大文字英語→小文字英語→日本語→全角英数字といった順になる（文字コードの順番）。
そのため、手間はかかるが索引用のカスタムフィールドを作って定形フォーマットを守って入力し、上記テンプレートタグの対象にするのが好ましい（特に漢字が多い場合）。
その場合は、カスタムフィールドを作成して`sort_by="title"`の部分を`sort_by="field:customfieldbasename"`（カスタムフィールドの「ベースネーム」に指定した名前）に書き換える。
また、`<$mt:EntryTitle trim_to="1"$>`の`EntryTitle`部分をカスタムフィールドの「テンプレートタグ」に指定した名前に書き換える。
Linuxのファイル詳細情報の表示について

#▼Linuxのファイル修正時刻について
最近Linuxのファイル時間について調べていたところ、３種類の時間があることが分かりました。
こちらも備忘録として、まとめます。

Linuxのファイルでは以下の３つの時間を持っているようです。
- ファイル最終アクセス日時
- ファイル最終修正日時
- ファイル最終状態変更日時

以下のように、`ls -l`で表示される時間は、「**ファイル最終修正日時**」です。

```shell
$ls -l
-rw-r--r--  1 shota  shota  0  4 15 22:54 iftest2.sh
-rw-r--r--  1 shota  shota  0  4 15 22:54 readtest.sh
```

他の2つはどうやって表示するのかは、それぞれ以下のようにオプションを付ければ良いです。

・ファイル最終アクセス日時
`ls -lu`

・ファイル最終状態変更日時
`ls -lc`
Ruby用PDF生成ライブラリ「Prawn」のセットアップ方法

## 「Prawn」とは？

Ruby用のPDF生成ライブラリです。
[YAMLによる履歴書作成スクリプト](https://github.com/kaityo256/yaml_cv)の動作に必要なのでインストールしました。

ちなみにインストールしないで `make_cv.rb` を実行すると以下のエラーが発生します。

```shell-session
$ ruby make_cv.rb
/Library/Ruby/Site/2.3.0/rubygems/core_ext/kernel_require.rb:59:in `require': cannot load such file -- prawn (LoadError)
  from /Library/Ruby/Site/2.3.0/rubygems/core_ext/kernel_require.rb:59:in `require'
  from make_cv.rb:3:in `<main>'
```

##  環境

- OS：macOS High Sierra 10.13.1
- Ruby：ruby 2.3.3p222 (2016-11-21 revision 56859) [universal.x86_64-darwin17]
- Gem：2.7.1

## セットアップ

Gemからインストールするだけです。

```shell-session
$ sudo gem install -n /usr/local/bin prawn
```

## 参考リンク

- [prawnpdf/prawn: Fast, Nimble PDF Writer for Ruby](https://github.com/prawnpdf/prawn)
- [PDF生成ライブラリ「Prawn」 - 名もないテクノ手](http://d.hatena.ne.jp/seuzo/20080819/1219134139)
Project ICKX公式サイトでの命名規則

## PHP上のクラス名、関数名、変数名など

| 対象                                              | スコープ                                      | 実例                                  | ケース名                                          |
|:--------------------------------------------------|:----------------------------------------------|:--------------------------------------|:--------------------------------------------------|
| class name <br> (クラス名)                        | グローバル<br>名前空間                        | class ClassName                       | アッパーキャメルケース <br> (UpperCamelCase)      |
| class method <br> (メソッド)                      | クラス定義                                    | public function classMethod()         | ロウアーキャメルケース <br> (lowerCamelCase)      |
| class property <br> (プロパティ)                  | クラス定義                                    | public $classPorpaty = null;          | ロウアーキャメルケース <br> (lowerCamelCase)      |
| class constant <br> (クラス定数)                  | クラス定義                                    | const CLASS_CONSTANT = '';            | アッパースネークケース <br> (UPPER_SNAKE_CASE)    |
| function <br> (関数)                              | グローバル<br>名前空間                        | function user_defined_function()      | ロウアースネークケース <br> (lower_snake_case)    |
| constant <br> (定数)                              | グローバル<br>名前空間<br>関数                | define('USER_DEFINED_CONSTANT', '');  | アッパースネークケース <br> (UPPER_SNAKE_CASE)    |
| constant <br> (定数)                              | グローバル<br>名前空間                        | const CONSTANT = '';                  | アッパースネークケース <br> (UPPER_SNAKE_CASE)    |
| object instance <br> (オブジェクトインスタンス)   | グローバル<br>名前空間<br>関数定義<br>関数    | $className = new ClassName();         | ロウアーキャメルケース <br> (lowerCamelCase)      |
| scale var <br> (スカラー値)                       | グローバル<br>名前空間<br>関数定義<br>関数    | $scale_var = '';                      | ロウアースネークケース <br> (lower_snake_case)    |

## データベース

| 対象                                  | 実例                                  | ケース名                                          |
|:--------------------------------------|:--------------------------------------|:--------------------------------------------------|
| database name <br> (データベース名)   | CREATE DATABASE database_name         | ロウアースネークケース <br> (lower_snake_case)    |
| table name <br> (テーブル名)          | CREATE TABLE table_name               | ロウアースネークケース <br> (lower_snake_case)    |
| column name <br> (カラム名)           | column_name VARCHAR(64),              | ロウアースネークケース <br> (lower_snake_case)    |
| index name <br> (インデックス名)      | CREATE INDEX index_name ON table_name | ロウアースネークケース <br> (lower_snake_case)    |
<Android>「android.view.InflateException」に関して

#今回の出来事
開発中にエミュレータ起動をしていたのだが、デバッグ作業しようとしたら、起動時に端末落ちが発生した。

エラー内容を確認したところ、

` android.view.InflateException: Binary XML file line #17: Error inflating class ImageButton`

が出ていた。初歩的なミスなのかもしれないと原因を探ってみた。

##原因
今回、Imagebuttonを実装していたのだが、srcとして格納していたImageの格納先フォルダを間違えていたようだった。


※元々の格納先　：　「drawable-v24」　　⇒　正しい格納先　：「**drawable**」


実行端末がAPI19だったので、起ったエラーであり、API24以下の環境下だったら、問題なかったらしい・・・

まだまだ慣れてないな・・・
scala Breezeでlogistic regressionを解く


# はじめに
[scalanlp/breeze: Breeze is a numerical processing library for Scala.](https://github.com/scalanlp/breeze)はScalaで数値解析を行うためのライブラリです。

勉強がてら[Logistic regression - Wikipedia](https://en.wikipedia.org/wiki/Logistic_regression)を解くコードをBreezeで書いてみます。

今回実装するアルゴリズムはWikipediaのLogistic regressionのページでIteratively reweighted leeast squares(IRLS)と呼ばれているアルゴリズムです。

# IRLS

推定したい$n+1$次元パラメータのベクタを$w^T = [\beta_0, \beta_1, ..., \beta_n]$、独立変数$x(i) = [1, x_1(i), ..., x_n(i)]^T$, ベルヌーイ分布の期待値$\mu(i) = \frac{1}{1 + e^{-w^Tx(i)}}$としたとき、以下の反復法でパラメータを推定することができます。


```math
w_{k+1} = (X^TS_kX)^{-1}X^T(S_kXw_k + y - \mu_k) \tag{1}
```

ここで、$S_k$は対角要素が$\mu_k(i)(1 - \mu_k(i))$の対角行列、$\mu_k = [\mu(1), \mu(2), ...]^T$期待値のベクタ、

```math
X = \begin{pmatrix}
1 & x_1(1) & ... & x_n(1) \\
1 & x_1(2) & ... & x_n(2) \\
\vdots & \vdots & & \vdots \\
\end{pmatrix}
```
は計画行列、 $y = [y(1), y(2), ...]$応答変数のベクタです。

上式の中で$i$は観測データのインデックスです。

# 実装

IDEAのWorksheet上でIRLSを実装してみたいと思います。

動作確認のためのデータはUCLAのコースから持ってきます。
https://stats.idre.ucla.edu/stat/data/binary.csv

ロジックのメインは$(1)$を実装している$step$関数と収束させるための$while$文です。$Pr$や$likelyhood$は発散回避用チェックに使用する確率・尤度を計算するための関数です。

```scala
import java.io.File
import breeze.linalg._

val file = new File("./data/binary.csv")
val mat = csvread(file, skipLines = 1)
val X = DenseMatrix.horzcat[DenseMatrix[Double], Double](DenseMatrix.ones[Double](mat(::, 1 to 3).rows, 1), mat(::, 1 to 3))
val y = mat(::, 0)

def u(w: DenseVector[Double]): DenseVector[Double] = X(*, ::).map(x =>  1/(1 + Math.exp(-(w dot x))))

def S(w: DenseVector[Double]) = diag(u(w).map(e => e * (1.0 - e)))

def step(Sk: DenseMatrix[Double], uk: DenseVector[Double], wk: DenseVector[Double]): DenseVector[Double] =
  inv(X.t * Sk * X) * X.t * (Sk * X * wk + y - uk)

def Pr(y: Int, x: DenseVector[Double], w: DenseVector[Double]) = {
  def h(x: DenseVector[Double], w: DenseVector[Double]) = 1/(1 + Math.exp(-(w dot x)))
  y match {
    case 0 =>
      1 - h(x, w)
    case 1 =>
      h(x, w)
  }
}
def likelyhood(w: DenseVector[Double]) = (0 until X.rows).map(i =>
  Pr(if(y(i) > 0.0) 1 else 0, X(i, ::).t, w)
).foldLeft(1.0)((s, p) => s * p)

// パラメータは適当な初期値で始める。
var w = DenseVector(0.0, 0.0, 0.0, 0.0)
var wNext = step(S(w), u(w), w)
val tolerance = 0.0001
var counter = 0

while(norm(w - wNext) > tolerance && counter < 100){
  w = wNext
  wNext = step(S(w), u(w), w)

  // 尤度が減少した場合はステップ幅を半分にする。
  while(likelyhood(w) > likelyhood(wNext)){
    wNext = w + ((w - wNext) /:/ 2.0)
  }

  counter += 1
}

s"counter = $counter, likelyhood(w) = ${likelyhood(w)}"
w

```

# 最後に

$step$関数の実装をみるとScalaの高い表現力を生かして数式のように直感的に書けて、Breeze素晴らしいですね。

# 参考リンク
- [Logistic regression - Wikipedia](https://en.wikipedia.org/wiki/Logistic_regression)
- [Categorical Regression Models](https://m-clark.github.io/docs/logregmodels.html#data)
- [Maximum Likelihood Estimation of Logistic
Regression Models: Theory and Implementation
](https://czep.net/stat/mlelr.pdf)
Bashの繰り返し処理を覚えるよ

# まえがき
本稿は、ボンクラな自分への戒めです(´・ω・｀)

# 繰り返し処理
こう書く。

```bash
#!/bin/bash

# for...in
for i in "aaa" "bbb" "ccc"
do
    echo ${i}
done
```

上記の場合、`aaa` `bbb` `ccc`はそれぞれ値であり、順次`$i`に格納されていく。


# 変数をつかった繰り返し処理

## 変数が文字列
変数に入った文字列を使って書くとこうなる。

```bash
#!/bin/bash

params="aaa bbb ccc"

# for...in
for i in ${params}
do
    echo ${i}
done
```

変数に入ったところで話はさっきのと同じ。
値`aaa`と`bbb`と`ccc`が順次処理される。


## 変数が配列
変数に入った配列を使って書くとこうなる。

```bash
#!/bin/bash

params=(aaa bbb ccc)

# for...in
for i in ${params[@]}
do
    echo ${i}
done
```

ちょっと変わった。

`${params[@]}`は、入っている値を文字列として連結した値を返す。
この際の区切文字は半角スペースっぽい。
それを順次取り出して`$i`に入れている様子。

つまり、**Bashの繰り返し処理は連結した文字列を処理するもの**で、
**配列をつかう場合は値を連結した文字列に変換してから処理**をしなければダメみたい。

繰り返し処理といえば配列な自分には、ピンと来るのに時間がかかりました(；´Д｀)


# なぜこんなことを？
まぁ、Bashを書きなれている人には当たり前のことだったのかもしれませんが、
**自分はドはまりしました**。。(/ω＼)

サーバーへのソース反映にJenkinsを使用しているんですが、ビルドシェルの流れは↓の感じ。

1. ビルドパラメータで値を複数受け取る
2. 通常のビルド処理実行
3. ビルド後、受け取ったビルドパラメータごとに適宜処理を実行

このジョブはそれなりの期間うごかしていましたが、特に問題も出さず、正常に動いていました。

・・・・そうなると欲が出ましてね。。。(；^ω^)
自分はローカル開発はVagrantで仮想環境をたててやっているんですが、3.と同じ処理をローカル環境でも実行したくなったわけです。

なので、ビルドシェルをコピペしてローカル用にシェルを作成したんですが、
まー動かず・・・・(ノД`)・゜・。
Bashを書くのは久しぶりな上、そもそも繰り返し処理が必要なほど複雑なものはほとんど書いたことが無いので、もう混乱しました。。。

混乱しつつ導き出したその理由が、本稿のとおりでございます。(´・ω・｀)

ビルドパラメータは「テキスト」でいれていたので、文字列だったんですね。。
で、ローカルにつくったシェルの方は、引数で受け取ったのを配列に入れてたんです・・・・orz

```bash:Jenkins
#!/bin/bash

# このbuild_paramsは連結済みの文字列
for build_param in ${build_params}
do
    echo "build_param is ${build_param}"
done
```

```bash:ローカルシェル
#!/bin/bash

build_params=("$@")

# このbuild_paramsはとーぜん配列
for build_param in ${build_params}
do
    echo "build_param is ${build_param}"
done
```

# あとがき
**ネットで観たのをただコピペして作らず、ちゃんと理解して作ろうね？！**

・・・・という自分への戒め。
ebitenでスマホのマルチタッチ座標を表示してみたの

# ebitenでマルチタッチ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/166225/6b242c51-82d6-a081-5488-692e3ef07b89.png)

[ebiten](https://github.com/hajimehoshi/ebiten)を使って制作中のゲームを、スマホアプリとしても動作するようにしようと企んでおります。そこで、タッチ操作の扱いを学ぶために「マルチタッチの座標を画面に表示するサンプル」を作ってスマホで動かしてみました:blush:

サンプルコードは、以下のリポジトリにあります。:octocat:

> kemokemo/ebiten-sketchbook:
> [Sketchbook to do various trials using the ebiten library - touch-point](https://github.com/kemokemo/ebiten-sketchbook/tree/master/touch-point)

# 使用環境

* go version go1.10.2 windows/amd64
* ebiten rev. [c39c211d1fe0744b3a2315a122f89c7074a54a49](https://github.com/hajimehoshi/ebiten/tree/c39c211d1fe0744b3a2315a122f89c7074a54a49)
* gomobile version +bf2d30a Sun Apr 29 17:04:17 2018
* Android NDK r16b

# 実装内容の説明

## タッチ位置情報を取得してみる

使用する`ebiten`側のメソッドを順にみてみましょう。
まず`TouchIDs`メソッドで`ID`の配列を取得します。

```input.go
// TouchIDs returns the current touch states.
//
// TouchIDs returns nil when there are no touches.
// TouchIDs always returns nil on desktops.
//
// TouchIDs is concurrent-safe.
func TouchIDs() []int {
	var ids []int
	for _, t := range ui.AdjustedTouches() {
		ids = append(ids, t.ID())
	}
	return ids
}
```

次に`TouchPosition`に先程取得した`ID`を渡して、`(x,y)`の位置情報を取得します。

```input.go
// TouchPosition returns the position for the touch of the specified ID.
//
// If the touch of the specified ID is not present, TouchPosition returns (0, 0).
//
// TouchPosition is cuncurrent-safe.
func TouchPosition(id int) (int, int) {
	for _, t := range ui.AdjustedTouches() {
		if t.ID() == id {
			return t.Position()
		}
	}
	return 0, 0
}
```

## 表示してみる

で、実際に位置情報を取得して画面に表示してみたのが以下の実装です。
取得した`[]int型`の`IDs`をソートしてから使います。`ID`は小さい数字からタッチした順になっています。

```main.go
func update(screen *ebiten.Image) error {
	message := "touching points:\n"
	IDs := ebiten.TouchIDs()
	sort.Slice(IDs, func(i, j int) bool {
		return IDs[i] < IDs[j]
	})
	for _, id := range IDs {
		x, y := ebiten.TouchPosition(id)
		message = fmt.Sprintf("%v x: %v, y: %v\n", message, x, y)
	}
	ebitenutil.DebugPrint(screen, message)
	return nil
}
```

次はタッチ位置情報とUI部品のあたり判定とかを実装すれば、画面操作ができそうですね！
どんどん筋トレしようと思います！ :muscle:
Splunkブラウザを日本語表示にする



####毎回忘れてしまうので、覚書に置いておきます。

【変更前】
http://XX.XX.XX.XX/en-US/app/launcher/home
↓
【変更後】
http://XX.XX.XX.XX/ja-JP/app/launcher/home

**変更**するだけ！
Railsのroutesにつけるmemberってやつ

#メンバールーティングとは
デフォルトで作成されるRESTfulなルーティングは7つ(resourcesで指定。index,new,show,create,update,edit,deleteの７つ)ですが、
7つでなければならないということはありません。

#「member」というURLの深堀りオプション

```rb
resources :users do
  member do
    get :followings
  end 
```
上記のように書くと、下記のように新たにルーティングが追加されます。


```
Prefix Verb            URI Pattern                     Controller#Action
followings_user GET    /users/:id/followings(.:format) users#followings
```

また、memberルーティングが1つだけしかないのであれば***:onオプション***を指定することで下記の用にブロックを省略できます。

```rb
resources :users do
    get :followings, on: :member
  end 
```

これらのURLにアクセスすると、usersコントローラのfollowingsアクションに行くようになります。

つまりは、
***memberメソッドを使うとユーザーidが含まれているURLを扱えるようになります***
なお、URLを指定するだけで、機能自体はModelやControllerによって実装されます。
Zenjectを導入する際に考えておくこと


Zenjectというよりは、DIコンテナを使用する設計パターンを導入する時に検討しなければならないこと全般に当てはまるかと思います。実際にプロジェクトでZenjectを使用し、盛大にアンチパターンを踏んでいたのでその戒めを込めて。

## Zenjectとは
Unityでの使用に特化したDIコンテナです
https://github.com/svermeulen/Zenject

## DI/DIコンテナって何？
自分が説明するよりググったほうが有益な情報が多いです。
https://ja.wikipedia.org/wiki/依存性の注入
[DI・DIコンテナ、ちゃんと理解出来てる・・？](https://qiita.com/ritukiii/items/de30b2d944109521298f)

## DIコンテナを使うと何が良いの？
まず、DI/DIコンテナを使うメリットについては山程記事があるので、調べてみましょう。
一つのメリットとしては、SOLIDの原則の一つでDの部分、
`DIP：The Dependency Inversion Principle 依存関係逆転の原則`を
守るための手助けをしてくれます。
クラスを生成する際に、そのクラスが依存するクラスのインスタンスを渡す手間を省いてくれるものです。

詳細に説明するよりも、これも沢山記事があるので読んであさってみると良いと思います。
(図とかコードとか書くのが面倒なだけ...)

## Zenject導入の前に
多人数のチームで導入するには、上記のことをチーム内で共有・勉強するようにしましょう。
なんとなく最近Zenjectっていうものが便利だから導入しようぜ！だと、
ほぼ100%の確率でDIコンテナを使用する際のアンチパターンを踏みます(**踏みました**)
Zenjectのことを調べるよりも、DIコンテナを使用する設計パターンをチーム内で共有されているというのが大事です。


よくやってしまうのが、動的にオブジェクトを生成する際、そのオブジェクトに`[Inject]`Attributeが有り、
そのオブジェクトを生成する際にサービスロケーターパターンに陥ることです。
サービスロケーターが本当にアンチパターンなのかは置いておいて、出来るだけ避けようとは言われています。

## [Inject]Attribut が設定されているオブジェクトを動的に生成する際には、Factoryを使うのがセオリー

ZenjectのFactoryのドキュメントでもしっかりと言及されています
https://github.com/svermeulen/Zenject/blob/master/Documentation/Factories.md#theory

> However, the above code is an example of an anti-pattern. This will work, and you can use the container to get access to all other classes in your app, however if you do this you will not really be taking advantage of the power of dependency injection. This is known, by the way, as Service Locator Pattern.

>ただし、上記のコードはアンチパターンの例です。これはうまく動作し、コンテナを使用してアプリケーションの他のすべてのクラスにアクセスできますが、これを行うと依存関係注入の力を実際に利用することはできません。これは、サービスロケータパターンとして知られています。


ただ、[Inject]属性を安易に使うと、Factoryで生成するオブジェクトの中でさらに、Factoryによって生成する必要があるオブジェクトが存在したりして、
Factory -> Factory -> Factoryのようなネストした構成になることもあります。
この場合は、依存関係自体がどっかおかしいので設計を見直したほうが良いです。

また、サービスロケーターはアンチパターンなのか？というのは置いておいて、
クリーンアーキテクチャや、DDD的な思想での多層設計となっている場合、とある層でのみサービスロケーターとするというのは、個人的には有りな気はしています。Factoryを作るよりも、その層内でDIコンテナを隠蔽してしまうほうがすっきりする場合もあるのでは？

## 何でもかんでもDIコンテナで依存関係の解決をしない
Zenjectは使い慣れると本当に便利です。そして色々なことが出来すぎます。
その上で気をつけないといけないのはDIコンテナの乱用です。
本当にその依存関係はDIコンテナを使用しなければならないのか？というのをじっくり考えたほうが良いかと思います。
Component同士で依存関係があり、且つシーン上に配置されているのであれば、`[SerializeField]` でポチッと参照を入れてあげるだけで済みますしね。

※ `[SerializeField]`や`public`フィールドで、オブジェクトの参照を突っ込むのは、`依存性の逆転` という意味で考えると非常に有効なようにも思えます。

ただし、`[SerializeField]` では設定できないインターフェースを`[Inject]`だと指定できるというのは、Zenjectの大きい利点でもあります。

脳死で、DIコンテナに突っ込むのではなく、その前に一呼吸置いて考えてみましょう

## 具象クラスをBindしない
`[Inject]` では基本的には インターフェースを指定しましょう。
インターフェースを実装した具象クラスそのもの渡すようでは、Singletonパターンと大差はないです。
インターフェースにすることで、テスト時にモッククラスと置き換えやすくなるのです。

ただ、プロトタイプの作成や、ゲームジャムとかで使うとかであれば有りだと思います。
使用方法を熟知しているのであればSingleton使うよりもサクッと依存関係の解決できますしね。

## [Inject] がたくさんあるクラスが出来たら...
クラス分割などを検討しましょう。 [Inject]Attributeが設定されているフィールドが山のように出てくると、
そのクラスは他のクラスに依存しすぎです。クラス分割などをしつつ設計を見直しましょう

## よくわかんないし、とりあえずZenject使ってみたいんだけど...
使ってみると良いじゃないかなと！
アンチパターンやダメな設計は踏んでみないことには実感がわかないものです。
Singleton絶対禁止などの縛りを入れてみて、どうやったらこれは解決できるのか？など手を動かしてみないことには身につかないですしね。
【swift】 1から100未満の素数の和をforを使わずに求める。

もともとBASICの世界から来たので関数型プログラミングには不慣れでしたが、最近 map, filter, reduce などの便利な機能を覚えたので頻用するようになりました。
以前、
[問題： 0から100未満の偶数の和を求めよ。](https://qiita.com/gawawa124/items/47e0fa19e8df8bdee930#_reference-e12c1f5ea2bb802587f9)
という投稿がありました。
本投稿では、「偶数」を「素数」に置き換えて
問題： 1から100未満の素数の和を求めよ。
という例題をforを使わずに解いてみました。(swift 4)

```swift
        let a = (2 ..< 100).filter{$0 % 2 != 0 || $0 == 2}.filter{$0 % 3 != 0 || $0 == 3}.filter{$0 % 5 != 0 || $0 == 5}.filter{$0 % 7 != 0 || $0 == 7}
        let b = a.reduce(0, +)
        print("\(a)の総和は\(b)")
```
print結果は、以下のようになります。
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]の総和は1060

う〜ん、なんかインチキくさいコードです。
1から1万未満とか1億未満の素数の和を求めようとするとお手上げです。
いつもQiitaの皆様の投稿には勉強させてもらっていますが、皆様からの改善案（厳しいツッコミ）が頂ければ幸甚です。
会社のLTイベントで「Alexa Skill 開発選手権」って言うLTを企画したので資料まとめ

#企画者プロフィール
部署：マーケティング、広報担当
触った事がある言語：Java、Python

普段は、マーケティング業務、デザインがメインで開発はしない。

#イベント概要

2ヶ月間の開発期間内でAlexa Skillを開発してLTする。

Amazon Echoを持っていない人は以下、テストツール等を使用可能。
「Echosim.io」
https://echosim.io/welcome

GoogleFormを全社にメールで送信し以下を記入してもらう。
【内容】
・各登壇者宛てに感想コメント


#参考資料
【Echosim.ioについて】
・https://developer.amazon.com/ja/blogs/alexa/post/183200a2-1668-4831-aa8f-69f676e07957/echosim-io
・https://dev.classmethod.jp/cloud/echosim-for-japanese/
ブラウザ上で動作するため、誰でも、どこからでもアクセスして Alexa スキルをテストすることができる。

【失敗しないAlexa開発者アカウントの作り方】
https://dev.classmethod.jp/voice-assistant/how-to-safety-create-alexa-developers-account/

【開発者アカウント作成時のハマりどころ】
https://developer.amazon.com/ja/blogs/alexa/post/9f852a38-3a44-48bd-b78f-22050269d7c7/hamaridokoro
sympyで「対数関数(log)」をやってみた

(参考)今度こそ分かる、対数関数(log関数)＞掛け算、割り算を多用するとき
https://qiita.com/gyu-don/items/ecd483fd94f446b576a3
(参考)Why does log(xy) = log(x)?+?log(y) not work in SymPy?
https://stackoverflow.com/questions/51595399/why-does-logxy-logx-logy-not-work-in-sympy
(参考)Powers and logarithms＞Logarithms
http://docs.sympy.org/0.7.1/modules/mpmath/functions/powers.html
(参考)wolframalpha＞log(x*y)
http://www.wolframalpha.com/input/?i=log(x*y)
Alternate form assuming x and y are positive:(google翻訳→xとyが正であると仮定した別の形式：)
Copyable Plaintext:log(x) + log(y)

```fullscript.py 
from sympy import *
var('a x y')
b = symbols("b",positive=True)
expr = log(x*y)
print(expr,"=",expr.expand(force=True))
expr = log(x/y)
print(expr,"=",expr.expand(force=True))
expr = log(x, b)
print(expr)
# log(x*y) = log(x) + log(y)
# log(x/y) = log(x) - log(y)
# log(x)/log(b)
```


－－－－－－－－－－－－－－
 【補足】(2018/08/01)
(参考)チュートリアルを読む 読書ノート v1.5dev ＞ exponentials-and-logarithms
https://showa-yojyo.github.io/notebook/python-sympy/tutorial.html#exponentials-and-logarithms

```fullscript.py 
from sympy import *
x = symbols('x', positive=True)
y = symbols('y', positive=True)
expr = log(x*y)
print(expr,"=",expand_log(expr))
expr = log(x/y)
print(expr,"=",expand_log(expr))
expr = log(x) + log(y)
print(expr,"=",logcombine(expr))
expr = log(x) - log(y)
print(expr,"=",logcombine(expr))
# log(x*y) = log(x) + log(y)
# log(x/y) = log(x) - log(y)
# log(x) + log(y) = log(x*y)
# log(x) - log(y) = log(x/y)
```
G Suiteにも、スヌーズ、ナッジ等新機能追加のニュース

米Google7月25日（現地時間）プレスリリース

G Suiteでも、Gmail同様に以下機能が使用できるようになった。
　スヌーズ:目覚ましアラームの、スヌーズと同様。受信したメールをスヌーズする事で、指定した日時にメールが受信されたかのようにメール表示を制御出来る
　ナッジ:AIが重要そう、至急返信が要りそうなメールか判定し、メール受信者に注意喚起してくれる
　オフラインアクセス:オフラインでも、メールにアクセス出来る。

スヌーズが個人的に気に入っている。

https://forest.watch.impress.co.jp/docs/news/1135128.html
個人学習メモ#11 時間指定、Monacaなどに関して

最初下記のようなコード見た時に何が何かわからなかったので、メモしておこうと思いました。


時間指定
-
1000*60*60*24

1秒ー1000ミリ秒
1分ー60秒
1時間ー60分
1日ー24時間

よって86400000＝1日となる。


1年指定

1000*60*60*24*365



cookieに関して
-
webサイトを訪問したときにwebサーバーがブラウザーに送信するメッセージまたは、データであり、ユーザーのインターネット閲覧習慣に関する情報をハードディスクに保存するもの。

cookieを使用するサイトを訪問するたびに、ユーザーのコンピュータから情報が送信され、サイトがユーザーのログイン情報を記憶することができる。


Monaca・InAppBrowserに関して
-

Monacaで開発するアプリは、Single Page Application(SPA)のため、HTMLの(a)を指定し、外部サイトに画面遷移をした場合、リンク先に戻るボタンが無いとアプリに戻ることができなくなる。

InAppBrowserはこの問題を解決できる。

InAppBrowserプラグインでは、起動させるブラウザーを選択できる。

_blank InAppBrowserを開く
_system システム標準のwebブラウザーを開く
_self　ホワイトリストに

プラグインが利用できるのは、devicereadyイベント発行後になる。

deviceready=Javascriptからネイティブ機能へアクセスが可能になった時に発生する。


イベントの発生順序について
-
１．DOMContentLoaded　HTMLのDOM要素を読み込んだ後、発生
２．loadレンダリングに必要なリソース
３．device ready Javascriptからネイティブ機能へアクセスが可能になった時に発生します。
４．ons.ready Onsen UIコンポーネントの読み込みが完了し、devicereadyイベントの後に発生します。

レンダリングとは・・・表示用のデータを元に、内容を整形して表示すること。（htmlのtableの表記を、ブラウザでは、わかりやすく表にしてくれるような感じ。）





ウェブアプリとネィティブアプリの違い
-

ウェブアプリ
定義が曖昧。
wiki,blogもウェブアプリと言っても良い。
[Google maps] [Gmail]動的、直感的に操作できる
ーアプリケーションっぽい。

ネイティブアプリ
Androidアプリ,IOSアプリ,windowsアプリなどなど

ビジネス上では、Androidアプリ、iOSアプリの２強

特定のプラットフォーム専用に開発されているので、
カメラ、コンパス、連絡先等が利用可能である。

プラットフォーム＝コンピュータにおいて、主にオペレーティングシステム(OS)やハードウェアといった基礎部分を指す。

オペレーティングシステム(OS)＝ コンピュータのオペレーション(操作、運用、運転)のために、ソフトウェアの中でも基本的、中核的位置づけのシステムソフトウェア。

include＝外部のhtmlやjsを読み込むことが出来る（安全上、同じドメインなどによる。）
Unity 初心者が Oculus Go で VR Samples を動かすまで

# 目的
* Oculus Go で VR Samples を動くようにする (ゆくゆくは自分でアプリを作れるように…)
  * VR Samples: Unity が提供している VR のサンプルコンテンツ

# これを書いている人の知識レベル
* Unity を全く触ったことが無い
* VR ゲームを少し遊んだことがある

# 開発環境や各種バージョン
* PC
  * Macbook Pro
      * macOS High Sierra 10.13.6
* Java
  * 8 Update 181
* android studio
  * 3.1.3
* Unity
  * 2018.2

# 環境構築
## Oculus
* Oculus Go の初期セットアップをする(ここでは割愛)
* ユーザ登録をする
  * 開発者サイトで「団体」を作成する
    * https://developer.oculus.com/
      * Manage

## 開発用端末
### インストール
* JDK をインストールする
  * http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
* android studio をインストールする
  * https://developer.android.com/studio/?hl=ja
* Unity をインストールする
  * https://store.unity.com/ja
      * Android Build Support にチェックを入れる

### 各種環境設定
* android studio を起動する
  * sdk が入る
* Unity を起動する
  * project を作成する
     * Template: 3D
     * その他: 適当
* Unity の設定をする
  * Unity -> Preferences -> External Tools -> Android
     * SDK: Browse を押すとよろしく設定してくれる
     * JDK: 同上
  * File -> Build Settings
     * Platform を Android に変更(Switch Platform)する
  * Switch Platform ボタン横の Player Settings
     * other settings -> identification
         * package name
             * 適宜変更する
         * Minimum API Level
             * Android 7.1 に変更する
    * XR Settings
      * Virtual Reality Supported にチェックを入れる
         * Virtual Reality SDKs に Oculus を選択する
* Asset の設定をする
  * Asset Store 窓で VR Samples を検索 / Download / Import する
  * Project 窓の Assets/VRSampleScenes/Scenes/MainMenu を Hierarchy 窓にドラッグする
* Oculus Go を開発者モードにする
  * Oculus アプリ -> 設定 -> 該当の Oculus Go 端末 -> その他の設定
     * 開発者モードをオンにする
* Oculus Go と PC を USB ケーブルで接続する
  * USB デバッグを許可しますか、と出るので、このパソコンからの USB デバッグを常に許可する、にチェックを入れて　OK を押す
* Unity でアプリケーションをビルドする
  * File -> Build & Run 

# 遊ぶ
* ライブラリ　-> 提供元不明　-> 作成したプロジェクト名
  * たのしい

# 今後の展望
* トリを飼っている気分になれるアプリを作りたい
ドライブの容量と空き領域を取得する

各ドライブの容量と空き領域を取得するサンプルです。

「[C#でドライブ毎のディスク容量と空き容量取得](https://qiita.com/akihiro-o/items/f300284dccc3c49b06d7)」と「[C#の匿名型について調べてみた](https://qiita.com/RyotaMurohoshi/items/ecda8257178ba39867eb)」、「[匿名型の入れ子や匿名型配列が作れる](https://qiita.com/RyotaMurohoshi/items/b0aae49b08b742cca437)」を参考にさせていただきました。

```c#
using System;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        static void Main()
        {
            foreach (var drive in System.IO.DriveInfo.GetDrives())
            {
                if (!drive.IsReady) continue;
                Console.WriteLine("{0} ({1}) 空き領域 {2}/{3}",
                    drive.VolumeLabel,
                    drive.RootDirectory.Name,
                    PrettyFormat(drive.TotalFreeSpace),
                    PrettyFormat(drive.TotalSize));
            }
        }

        private static string PrettyFormat(double value)
        {
            var data = new[]
            {
                new { max = 1024d,                    baseValue = 1d,                f = 1,   format = "{0:0} byte" },
                new { max = Math.Pow(1024, 1) * 10,   baseValue = Math.Pow(1024, 1), f = 100, format = "{0:0.00} KB" },
                new { max = Math.Pow(1024, 1) * 100,  baseValue = Math.Pow(1024, 1), f = 10,  format = "{0:0.0} KB" },
                new { max = Math.Pow(1024, 1) * 1000, baseValue = Math.Pow(1024, 1), f = 1,   format = "{0:0} KB" },
                new { max = Math.Pow(1024, 2) * 10,   baseValue = Math.Pow(1024, 2), f = 100, format = "{0:0.00} MB" },
                new { max = Math.Pow(1024, 2) * 100,  baseValue = Math.Pow(1024, 2), f = 10,  format = "{0:0.0} MB" },
                new { max = Math.Pow(1024, 2) * 1000, baseValue = Math.Pow(1024, 2), f = 1,   format = "{0:0} MB" },
                new { max = Math.Pow(1024, 3) * 10,   baseValue = Math.Pow(1024, 3), f = 100, format = "{0:0.00} GB" },
                new { max = Math.Pow(1024, 3) * 100,  baseValue = Math.Pow(1024, 3), f = 10,  format = "{0:0.0} GB" },
                new { max = Math.Pow(1024, 3) * 1000, baseValue = Math.Pow(1024, 3), f = 1,   format = "{0:0} GB" },
                new { max = Math.Pow(1024, 4) * 10,   baseValue = Math.Pow(1024, 4), f = 100, format = "{0:0.00} TB" },
                new { max = Math.Pow(1024, 4) * 100,  baseValue = Math.Pow(1024, 4), f = 10,  format = "{0:0.0} TB" },
                new { max = Math.Pow(1024, 4) * 1000, baseValue = Math.Pow(1024, 4), f = 1,   format = "{0:0} TB" },
                new { max = Math.Pow(1024, 5) * 10,   baseValue = Math.Pow(1024, 5), f = 100, format = "{0:0.00} PB" },
                new { max = Math.Pow(1024, 5) * 100,  baseValue = Math.Pow(1024, 5), f = 10,  format = "{0:0.0} PB" },
                new { max = Math.Pow(1024, 5) * 1000, baseValue = Math.Pow(1024, 5), f = 1,   format = "{0:0} PB" },
            };
            var datum = data.FirstOrDefault(_ => value < _.max);
            if (datum == null) return string.Format("{0:0.00} EB", value / Math.Pow(1024, 6));
            var v = Math.Floor(value / datum.baseValue * datum.f) / datum.f;
            return string.Format(datum.format, v);
        }
    }
}
```
再帰関数を使って階乗を求める関数を作る

### 再帰関数とは
ある関数が自分自身を呼び出す事。
または、そのような関数。

例えば、階乗を計算するように、同種の手続きをなんども呼び出すような処理をコンパクトに表現できる。

### 例えば
引数の数字の階乗を求める関数を例とします。
階乗とは、総積のこと。
例えば5なら、 5 * 4 * 3 * 2 * 1 =120

自然数nの階乗は
n * (n-1の階乗)
で求められるので、それを元にコードを書くと

```javascript

function factorial(n) {
  if(n != 0) {
    return n * factorial(n - 1);
  }
  return 1;
}
```

結果はこう

```javascript
console.log(factorial(5));
// 結果は120
```

factorial()の中で、factorial()を呼び出している。
ImageMagickで画像クイズを作る

# やったこと

複数の画像を並べて１枚の画像クイズを作った．

![monster01.png](https://qiita-image-store.s3.amazonaws.com/0/101570/38aff5be-4c44-8889-4799-9331a4205c4b.png)
![monster02.png](https://qiita-image-store.s3.amazonaws.com/0/101570/fdf30e9d-bc8c-02b7-54ae-16f94179a84b.png)
![monster03.png](https://qiita-image-store.s3.amazonaws.com/0/101570/6cf46751-c02a-0fb9-6e0e-838dd927e2bc.png)
![monster04.png](https://qiita-image-store.s3.amazonaws.com/0/101570/cbb93a79-af64-64c5-3a48-16cb7bccfacd.png)
![monster05.png](https://qiita-image-store.s3.amazonaws.com/0/101570/d5972e1b-680a-6cbf-4fcf-e8481a53f338.png)
![monster06.png](https://qiita-image-store.s3.amazonaws.com/0/101570/ce5fb0cf-5bb9-85b8-caa6-5e9ef445d085.png)
![monster07.png](https://qiita-image-store.s3.amazonaws.com/0/101570/4211cb99-9bc0-2c59-1901-7e48e443f304.png)
![monster08.png](https://qiita-image-store.s3.amazonaws.com/0/101570/db83143c-fb1a-bb01-a9c5-839826ec7bad.png)
![monster09.png](https://qiita-image-store.s3.amazonaws.com/0/101570/ad33b366-8f5c-660d-a768-9e55e30b0563.png)

→

![tiled.png](https://qiita-image-store.s3.amazonaws.com/0/101570/d83e203d-4e2c-bdbd-1a30-7983cd292ce2.png)

画像：いらすとや

# 実装

bash + ImageMagick

## convert -crop でトリミングする

```bash:crop.sh
# crop {source directory} {target directory}

WIDTH=126
HEIGHT=102
for FILEPATH in `ls $1/*`
do
convert ${FILEPATH} -gravity center -crop ${WIDTH}x${HEIGHT}+0+0 $2/`basename ${FILEPATH}`
done
```

## convert label でナンバリングする

```bash:rannotate.sh
# rannotate {source directory} {target directory}

BGCOLOR='#61B859'
COUNTER=1
for FILEPATH in `ls $1/* | sort -R`
do
convert ${FILEPATH} -background ${BGCOLOR} -pointsize 24 label:${COUNTER} +swap -gravity Center -append $2/`printf %02d $COUNTER`.${FILEPATH##*.}
COUNTER=$(( COUNTER + 1 ))
done
```

## montage -tile で並べる

```bash:tile.sh
# tile {source directory} {target file}

COLNUM=6
magick `ls $1/*` pnm:- | montage - -tile ${COLNUM}x -geometry +0+0 $2
```

## １連の処理をまとめる

```bash:tile+.sh
# tile+ {source directory} {target file}

DIR=`dirname $0`
mkdir /tmp/cropped
rm /tmp/cropped/*
${DIR}/crop.sh $1 /tmp/cropped
mkdir /tmp/annotated
rm /tmp/annotated/*
${DIR}/rannotate.sh /tmp/cropped /tmp/annotated
${DIR}/tile.sh /tmp/annotated ${2:-tiled.png}
```

crop.sh, rannotate.sh, tile.sh, tile+.sh を同ディレクトリに配置する．

# 学び

* `basename`と`dirname`．
* `montage`はデフォルトでラベルをつけるため`magick pnm:-`をかませて消去する．
* デフォルト変数`${VAR:-default}`．
Firestoreのデータをasync/await, mapで取り出したい

# 環境
- Cloud Functions
- TypeScript


# 課題
https://firebase.google.com/docs/firestore/query-data/get-data

Collectionの中のDocumentをまとめて取得したい場合、公式ドキュメントに沿って実装すると、

```typescript:index.ts
import * as functions from 'firebase-functions';
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

const db = admin.firestore();

export const getUserData = functions.https.onRequest((request, response) => {
  let data = [];
  db.collection('users').get().then(snapShot => {
    snapShot.forEach(doc => {
      data.push(doc.data());
    });
  }
  response.send({ data: data });
});
```

こんな感じになる。
これをasync/awaitとmapを使った実装に書き換えたい。

# thenをasync/awaitに
```typescript:index.ts
// 引数の前にasyncを付ける
export const getUserData = functions.https.onRequest(async (request, response) => {
  let data = [];
  const snapShot = await db.collection('users').get();
  snapShot.forEach(doc => {
    data.push(doc.data());
  })
  response.send({ data: data });
});
```

# forEachをmapに
最初、次のような実装をした。

```typescript:index.ts
export const getData = functions.https.onRequest(async (request, response) => {
  const snapShot = await db.collection('users').get();
  const data = snapShot.map(doc => {
    return doc.data();
  });
  response.send({ data: data });
});
```

が、APIを叩くとエラーが返ってくる。

```
Error: could not handle the request
```

ググったら解決策を発見。

https://stackoverflow.com/questions/46614055/map-items-of-collection-snapshot-in-firebase-firestore

要は `docs` プロパティを `map` してあげればいいらしい。

```typescript:index.ts
export const getData = functions.https.onRequest(async (request, response) => {
  const snapShot = await db.collection('users').get();
  // docsをmapする
  const data = snapShot.docs.map(doc => {
    return doc.data();
  });
  response.send({ data: data });
});
```

無事、やりたい実装に到達。
GraphQLの旅(8) Prismaにそのままリクエストを転送する(付録 OpenCRUDとは)

# prisma-bindingのforwardToを使う

GraphQLサーバのresolver中の各クエリに、`forwardTo`をそのまま代入する。
引数は、あとあとGraphQLServerの中の`context`の中で、Prismaを指すendpoint名。
（下記の例では`prisma`）

```typescript
import { GraphQLServer } from 'graphql-yoga'
import { Prisma, forwardTo } from 'prisma-binding'

const resolvers = <any> {
    Query: {
      user: forwardTo('prisma'),
      users: forwardTo('prisma')
    },
    Mutation: {
      createUser: forwardTo('prisma')
    }      
}

const server = new GraphQLServer({ 
    typeDefs: 'src/generated/app.graphql',
    resolvers,
    context: req => ({
      ...req,
      prisma: new Prisma({
        typeDefs: 'src/generated/prisma.graphql',
        endpoint: 'http://PRISMA_HOST',
      }),
    }),
 })
server.start({ port: 4010,}, ({port}) => console.log(`GraphQL server is running on http://localhost:${port}`))
```

注：すいません、typescriptなのに`<any>`で型指定を逃げています。

実行結果は以下の通り、ちゃんと`users`というクエリがそのままPrismaで参照できています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96277/68807bff-4c08-b6cf-d516-f491292d63b7.png)

もしクエリの引数や返り値を少し変形したい場合は、resolver内部を独自に実装しましょう。

[prisma-bindingを使った独自クエリの実装の仕方](https://qiita.com/Hiroyuki_OSAKI/items/12f9c5a063a5e56df61c)

# 付録：Prismaが提供するAPI、OpenCRUDとは
（実はここが一番大事かも）

OpenCRUDは、データ取得・更新に特化したGraphQL上のSDLです。
その意味を以下に記載します。

## 生のGraphQLの限界

GraphQLというのはAPIの形式です。クエリをjsonで送ってレスポンスもjsonで返す、という形式以外には、中身は何も規定していません。

そのため、功罪があります。

- いいところ：　自由にアプリでAPIの形式を決めてしまえるため、API開発者は楽です。
- 悪いところ：　サービスやアプリごとにいろいろAPIが変わるので、API利用者は学習コストが高くなることです。

よくあるトレードオフです。

## OpenCRUDの方針：GraphQL上に縛りを入れる

**OpenCRUDではターゲットを「データ取得・更新用API」** とかなり絞り込み、APIに縛りを入れ、API利用者を少し楽にすることを目的にしています。

データ取得・更新で思い出すのは、デファクトとしてSQLというクエリ言語があることですが、**OpenCRUDはGraphQL上でSQL文のプリミティブを実装した**といってもいいと思います。雰囲気はSQLとMongoDBのクエリを混ぜたような雰囲気です。
比較してみます。

|SQL|OpenCRUD on GraphQL|MongoDB|
|---|---|---|
|`select * from users`|`{ users {}}` |`db.users.find({})`|
|`where a = 'value'`|`where: { a: 'value' }`|`{ a: "value" }`|
|`where a in ('value1', 'value2')`|`where { a_in: ['value1', 'value2'] }`|`{ a: { $in: [ "value1", "value2" ] } }`|
|`where a not in ('value1', 'value2')`|`where { a_not_in: ['value1', 'value2'] }`|`{ a: { $nin: [ "value1", "value2" ] } }`|
|`where a = 'aval' AND b = 'bval'`|`where: {OR: [ { a: "aval" }, { b: "bval" }]}`|` { $or: [ { a: "aval" }, { b: "bval" } ] }`|

Web APIだとこれまではクエリの書き方の基準はRESTくらいで、RESTは縛りが強すぎて表現力が乏しかった。
GraphQLが自由度を増す仕掛けになったが自由度が高すぎるので、SQLレベルの書き方の基準を定義したOpenCRUDが出てきた。

SQLを使いこなす人からすると、いや別にSQLあるからいいんでない？と思うところなのですが、ここにある意味これまでとは違う世界観があります。
以下のような提案が[Prisma](https://www.prisma.io/features/bindings/)のページでは書かれています。

- フロント寄りのAPI（自由度の低いクエリ）からバックエンド寄りのAPI（自由度の高いクエリ）まで全部GraphQLでよいではないか
- バックエンド寄りはOpenCRUDに標準化する
- APIの間の関係性はBindingで定義する

## アプリ開発に必要なprisma-binding

ただ、まだ足りません。
JavaScriptのアプリを書く人にとってはクエリの結果を「意味のあるオブジェクト」にすることが大事で、そのためにORMが必要になってきて大体は自前で実装しなければいけない。
そこで、prisma-bindingは、GraphQLの型を使ってクエリの引数や返り値のオブジェクトの型定義を自動で作る。

役割分担は、クエリはOpenCRUD on GraphQL、その定義はprisma-bindingということになります。
RESTだと、クエリはRESTで定義はSwaggerという分担です。

最後は少し言葉が足りていないと思いますが、こういう世界観を作るのがprismaのすごいところだと思います。
ActiveStorageで取得した画像の向きをminimagickのauto_orientに調整してもらう

# 問題点

スマートフォンで撮影した写真をActiveStorageを利用して保存＆WEBサイト上に表示すると、90度向きが回転した状態で表示されてしまう。

# 解決方法

**minimagick**の`auto_orient`を利用して、画像の向きを自動で調整してもらう。

参考：[minimagick/minimagick: mini replacement for RMagick](https://github.com/minimagick/minimagick)

```ruby:Gemfile
gem 'mini_magick'
```

```erb:show.html.erb
<%# 修正前 %>
<%= image_tag @user.avatar %>

<%# 修正後 %>
<%= image_tag @user.avatar.variant(auto_orient: true) %>
```
APIGateway + Lambda(Node)の Expressで画像が表示されない時の対応

ApiGateway + LambdaのExpressで画像も配信したら表示されなかったのでその時の対応メモ

画像のヘッダを見るとcontent-typeがtext/jsonで配信で配信されていた。

https://github.com/awslabs/aws-serverless-express/issues/104
と同じ現象らしい

## aws-serverless-expressの記述変更
まずaws-serverless-expressの記述を書き換える。

```js
const server = awsServerlessExpress.createServer(app)
```
を

```js
const binaryMimeTypes = [
  'image/png',
  'image/x-icon'
];
const server = awsServerlessExpress.createServer(app, null, binaryMimeTypes)
```
に変更した。
今回、faviconとpngしか使っていなかったので該当2つしか記述していないがjpgなど必要に応じて追加する感じ。

この状態でもう一度アップするとヘッダが変化し
content-typeがimage/pngで配信されるようになったが、まだ画像は表示されず。
今度はデータがBase64にエンコーディングされている。

どうもAPIGateway側でもバイナリメディアタイプの設定が必要らしい。

## API Gatewayの設定

API Gatewayの設定のバイナリメディアタイプを追加してやる。

<img width="498" alt="スクリーンショット 2018-07-21 15.00.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/10489/0d1ec72d-9798-0b94-da00-85e7a42697e6.png">
を
<img width="589" alt="スクリーンショット 2018-07-21 13.35.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/10489/db4c642c-e63b-5915-f50b-8451bcae2e4c.png">
に変更してgzip圧縮もオンにした。変更後、設定変更ボタンを押して反映。
設定は保存されてるが変化なしでこの辺でハマりポイントになった。
この時点では設定が反映されないか反映に時間がかかるのか、もう一度ステージをデプロイすることで反映されるようになった。

これで画像が表示できるようになりました。

web画面でやる場合、手順と反映が明確出ないので余計な労力が要りますね。
Mixamoで作成したアニメーションでRootMotionを適用したい

Mixamoで作成したモーションをそのままUnityにインポートしても

![Screen Shot 2018-07-31 at 22.37.16.png](https://qiita-image-store.s3.amazonaws.com/0/132627/4921c9f6-6225-2f6a-84c8-6b0456998385.png)

こんな感じにRoot Transformの項目が見当たらない

Rig/Animation TypeをHumanoidに変更することで解決できた

![Screen Shot 2018-07-31 at 22.41.43.png](https://qiita-image-store.s3.amazonaws.com/0/132627/b8af6bce-fad9-982f-4078-812492a63db2.png)
PhpStormからDocker for Windowsを操作出来るようにする

# はじめに

PhpStormでDockerがサポートされているので、せっかくなので使ってみたかった。

## 環境

- Windows 10
- PhpStorm 2018.2
- Docker for Windows 18.06.0-ce-win72

## Docker for Windows側の設定変更

下記のチェックをONにしてTLS無しのTCPで接続を受け付けるようにする。

![2018-07-31_20h52_44.png](https://qiita-image-store.s3.amazonaws.com/0/165884/a4ad4703-acb5-af73-f306-28cb4e0e7c01.png)

## PhpStorm側の設定変更

![2018-07-31_22h08_41.png](https://qiita-image-store.s3.amazonaws.com/0/165884/3fe587b1-6a0e-28df-bfbe-8e8035f852a2.png)

## Dockerビューの表示

![2018-07-31_22h13_45.png](https://qiita-image-store.s3.amazonaws.com/0/165884/c0206c44-cc9d-af54-7fbb-3bf17b53625c.png)

下記のようにコンテナ/イメージの一覧やコンテナログ等が確認出来ます。
コンテナの開始/停止/削除やイメージからのコンテナ作成も出来ます。

![2018-07-31_22h16_12.png](https://qiita-image-store.s3.amazonaws.com/0/165884/9eb4f5b9-5ac2-a80b-4b1f-d7b827e4c528.png)
EasyBuggyでpentestいろいろ（環境構築編）

#この記事を読むと何がわかるか
virtualboxを使用したpentestの環境構築法
easybuggyをdeployする方法

#動機
最近俄にセキュリティに対する興味が湧いてきた．特に，Webアプリの脆弱性云々を悪用するタイプの話がとても好き．実際のやられWebアプリに対していろいろやってみることにした．

#やられWebアプリ
いろいろ試すためにあえて脆弱性を作ってあるWebアプリはやられWebアプリとか呼ばれてて，[Metasploitable](https://sourceforge.net/projects/metasploitable/)とか[bWAPP](http://www.itsecgames.com/)とかがあるようだ．
脆弱性を試すだけでなく，脆弱性を起こすようなコードも読んで理解したいとなると，そのアプリの言語も読めないといけない．僕はWebアプリフレームワークはdjangoとRoRしか触ったことがないので，djangoで作られた[easybuggy django](https://github.com/k-tamura/easybuggy4django)を使うことにした．

#easybuggy
[easybuggy](https://github.com/k-tamura/easybuggy/blob/master/README.jp.md)(@tamura__246さんら作)自体はjavaでかかれてて，いくつかの言語のクローンがある．詳しい説明はgithubにまとめてくれている．

#作った環境
virtualboxを使い仮想PCを2台作成した．やられPCは[ubuntu16.04](https://www.ubuntulinux.jp/)，やるPCは[kali](https://www.kali.org/)を使った．それぞれの仮想PCのネットワークを同じNATネットワークに所属されると相互に通信できるようになる．

![path4608.png](https://qiita-image-store.s3.amazonaws.com/0/132734/d8819edc-221f-3a29-c60a-f460c3b96614.png)

##手順
①それぞれVirtualBoxに仮想PCを構築する．
②設定をクリックし，ネットワークタブからNATネットワークを選ぶ．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132734/f7210e65-90e1-9873-2889-e7550c396b44.png)
もし，割り当てるNATネットワークの名前が選べないときは，VirtualBoxの環境設定からNATネットワークを作成する．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132734/8e3cfa10-ff2f-78e8-0fc0-7f70ff1be6df.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132734/d35989fc-b2e1-bf75-3826-00b1c9ba8ec7.png)



#easybuggyをdeploy
[この記事](https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-16-04)を読むのがはやい．
（詳細は需要があれば）

#うまく行ったか確認
ubuntuのIPアドレスをifconfigで確認する．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132734/b56249e5-e8d9-0dbe-b39a-eb0aa31023c0.png)

kaliから確認したIPにブラウザでアクセスする．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132734/ba7f2211-648d-bf8b-5a7c-630ed99ab3e3.png)

うまくいった！！

#まとめ
「他のサーバーで立ってるWebアプリに対していろいろする」という模擬環境ができた．次回からはいろいろなツールを使って脆弱性をつついて遊ぶ．
pythonでmariaDB(mysql)を操作する方法

###はじめに
タイトルの通りpythonでmariaDBを操作する方法についてまとめます。

###環境
CentOS7.4
python3.6.3
5.5.56-MariaDB(mysql)
※mariadbはmysqlの後継みたいなものと思ってください。基本的な使い方は変わりません。

###◆mariaDB(mysql)のインストール
以前にphpからDBを操作する方法についてまとめているのでDBサーバの構築については以下リンク先の"◆DBサーバの構築"参照してください。
また、この記事でもリンク先の記事で使うworldという名前のサンプルDBを使うので、併せてDBに取り込むようにしてください。
[https://qiita.com/johndoe1022/items/006ab3fc61b4e3d67f3d]

###◆pythonのインストール
pyenvをインストールするため、まずはgitからインストール。
```yum install -y git```

環境変数を設定
```git clone https://github.com/pyenv/pyenv.git ~/.pyenv```
```echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile```
```echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile```
```echo 'eval "$(pyenv init -)"' >> ~/.bash_profile```
```source ~/.bash_profile```

とりあえず必要そうなパッケージをインストール。
※ここはあんまり調べ切れていないので不要なものも混ざっているかもしれません。
```yum install -y zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel gcc```
インストールできるpythonのバージョンを確認。今回は3.6.3をインストール。
```pyenv install -l```
```pyenv install 3.6.3```

現在のpythoのバージョンを確認
```python --version```

インストールしたpythonのバージョンに切り替えた後、再度現在のバージョンを確認
```pyenv global 3.6.3```
```python --version```

mariaDB(mysql)に接続するためのドライバをインストール
```pip install PyMySQL```

もし以下のような文章が表示されたらpipコマンドをアップグレードしてください。
```
You are using pip version 9.0.1, however version 18.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
```

以下のコマンドでpipをアップグレードしたら、再度PyMySQKをpipでインストールしてください。
```pip install --upgrade pip```

/usr/local/に以下のpythonスクリプトを作成。
今回はvim /usr/local/sample01.pyで作成します。
<font color="Red">※passwordとホスト名は環境に合わせて変更してください!</font>

```python:sample01.py

import pymysql.cursors

def main():
    conn = pymysql.connect(
        user='root',
        passwd='password',#適宜自分で設定したパスワードに書き換えてください。
        host='192.168.0.1',#接続先DBのホスト名或いはIPに書き換えてください。
        db='world'
    )
    c = conn.cursor()

    # テーブルの作成
    sql = 'select * from city;'
    c.execute(sql)
    print('* cityテーブルの一覧を表示\n')
    for row in c.fetchall():
        print('No:', row[0], 'Content:', row[1])
main()

```

sample01.pyの権限を変更
```chmod 644 /usr/local/sample01.py```

作成したpythonスクリプトを実行
```python /usr/local/sample01.py```

以下のような感じでズラッと表示されたら成功です。

```
No: 1 Content: Kabul
No: 2 Content: Qandahar
No: 3 Content: Herat
No: 4 Content: Mazar-e-Sharif
No: 5 Content: Amsterdam
No: 6 Content: Rotterdam
No: 7 Content: Haag
No: 8 Content: Utrecht
No: 9 Content: Eindhoven
No: 10 Content: Tilburg
No: 11 Content: Groningen
No: 12 Content: Breda
No: 13 Content: Apeldoorn
No: 14 Content: Nijmegen
No: 15 Content: Enschede
No: 16 Content: Haarlem
No: 17 Content: Almere
```
to_hで配列の配列をハッシュに変換

```rb
 [["Kanagawa", "yokohama"],["Hokkaido", "sapporo"], ["Okinawa", "naha"]].to_h
=> {"Kanagawa"=>"yokohama", "Hokkaido"=>"sapporo", "Okinawa"=>"naha"}
```

## 参考
[[Ruby] each_with_objectもmapも使わずにto_hだけで配列をハッシュに変換する](https://techracho.bpsinc.jp/hachi8833/2016_11_30/29584/)