OmniAICreator/Qiita-1.07M huggingface dataset:
サーバーのいろは

この記事は、[ConoHa Advent Calendar2017](https://qiita.com/advent-calendar/2017/conoha)の6日目の記事です。

はじめまして、5日目担当の[misato8310](https://qiita.com/misato8310)さんからバトン頂きました、6日目担当[@susumu_taka](https://twitter.com/susumu_taka)です。


# さて弱った
ConoHa VPSに関するノウハウやレビュー、活用方法などを紹介していこう！というAdvent Calendarですが

今回はネタが無い！

厳密に言えば、忙しくてネタが準備出来てないと言うのが正解でして・・・
適当に書いてお茶を濁すのもイヤなので、最近の思う事をちらりと。

# 知識は常識？
少し前、こんな内容をつぶやいた事がある

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">サーバー知識を持たない「web制作業者」が多い<br><br>レンサバでないとHP、WPが作れない<br>サーバー（HP、WP）が重い原因が特定出来ない<br>基本的用語（httpdやSFTPなど）を知らない　等々<br><br>ホスティング業者が想像する以上に、残念ながら現場のレベルは低い</p>&mdash; Susumu Takagi (@susumu_taka) <a href="https://twitter.com/susumu_taka/status/885276163735568385?ref_src=twsrc%5Etfw">2017年7月12日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Q.「現場のレベルは低い」どれぐらい？　
A.これぐらい・・・
　・Wordpressは知っているがMySqlは知らない（というかWordPressがDB使ってる事を知らない）
　・FTPで接続出来ないサーバーは触れない
　・SSLて何？
　・SEO指南をしてるが、アクセス過多時の対応方法を知らない

　etc・・・

一番の問題は基本的用語を知らない事で、確かにレンサバならば、知識が無くてもWordPressぐらいは立ち上げられる。
ホスティング業者の「努力の結晶」で操作が簡単になってますからね
ところが、「基本的用語」は簡単にはならないので、例えば「SSLが簡単に導入出来ます！　お手軽に安全なサイト運営ができますよ！」と歌っても、SSLを知らないweb制作業者には何の事か分からない。

何の事か分からないので、個人情報をガッツリ入力させる「問合せフォーム」が合ってもSSL対応をしない。

こういうweb制作業者が想像以上に多いという悲しい現実がある。


# どんぐりの背比べ
実は現場でもう一つ感じる事がある、これは去年あたりから感じるようになった。

「ギータカさん（Takagiのあだ名）、どこのサーバー使えば良いのか基準がワケわからんよ・・・！」

この質問が全てを語ってまして・・・

特にVPSでのスペック争いが激しく、いよいよ頭打ちになって来た感じがする。
メジャーなVPSホスティングサービスのスペック表だけを見比べてみると、実は大差ない（どれを選んでも同じ様にも見える）。
私がConoHaを使い始めた時は「SSD」という最大の特徴があったケド、今ではSSDは当たり前になってしまっているので、確かに「サーバーを選ぶ基準が難しい」と言われるのは良く分かる。

こうなると、管理コンソールの分かりやすさとかの「付加価値」で選ぶことになるが、**ConoHaに関しては飛び抜けている感**がある

**ココがすごいよ！このはさん！！**
　1.ConoHa Mobileでのアラート管理
　　サーバーモニタリング通知がズバ抜けて便利！

　2.ConoHaブロックチェーン
　　これは是非とも抑えたい！　　
　　
　3.キャラ勝ち！
　　CDデビューもしちゃうし！

でも、「キャラクター」で選ぶのも意外と正解かもしれないですね、
個人的には、このはちゃんでWebインフラ入門系の本を出して欲しいですねぇ、これも「付加価値」の１つですね


ちなみに、Takagiの場合「冗長性（Redundancy）」という観点から比べるとConoHa一択になる。
**運用清楚可愛いは正義！**　これ、毎回必ず書くなぁ。。。。


# さいごに
レンサバを使うにしても、VPSを使うにしても、最低限の基礎用語は知識として持っておくべきだと思います。
興味があれば、自分で構築出来るように触ってみる事もオススメします。
サーバーが触れると「違った楽しさ」が必ず味わえると思います。

そういう事を伝えていくのも「エバンジェリスト」て肩書ついてるTakagiの仕事じゃないの？
と言われると、全くもってその通りなので・・・

最近では、「レンタル、VPSサーバーて何？」と聞かれると、「薄い本」の一説を見せて説明しています。

「薄い本」とは[ConoHaの薄い本電子版Vol.0 「クラウド？VPS？ConoHa がわかるはじめの一歩」 を公開しました！](http://conoha.mikumo.com/blog/5093/)で紹介されている[「ConoHaの薄い本」電子版シリーズ、Vol.0](http://conoha.mikumo.com/wp-content/uploads/2015/03/00_ConoHa.pdf)の事です。

この「薄い本」のホスティングサービスの説明が「難しすぎず、簡単すぎず」の絶妙なバランスで書かれてます。
※一部内容には、このは先生の進化により、古くなっている部分があります

ホスティングサービスを知りたい方、まずはここから入ってみるのも良いでしょう
Excel VBAでブック起動時に コマンドライン引数で指示を与えたい。

自作のブックの起動時にコマンドライン引数を与えたいことが数年前にありました。
C++で作成したexeからブックを起動したいときの話なわけですが、これが意外とできそうでできないっていうお話です。
普通にC++の発想でいくと、GetCommandLineW APIでコマンドライン引数をとればおしまいな気がしますよね？
それがなかなか。

では、まず、GetCommandLineWでコマンドライン引数をとってみます。
***以下のコードは ThisWorkBookに記入してください。***
このコードは、ブックが起動されると、コマンドライン引数をA1セルに代入します。

```
Private Declare PtrSafe Function GetCommandLineW Lib "kernel32" () As LongPtr
Private Declare PtrSafe Function lstrlenW Lib "kernel32" (ByVal lpString As LongPtr) As Long
Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
   (ByVal Destination As LongPtr, ByVal Source As LongPtr, ByVal Length As LongPtr)

Private Sub Workbook_Open()

    Dim lpCommandLine As LongPtr
    Dim nLen As Long
    Dim sCommandLine As String
    lpCommandLine = GetCommandLineW
    nLen = lstrlenW(lpCommandLine)
    sCommandLine = Space(nLen)
    CopyMemory StrPtr(sCommandLine), lpCommandLine, nLen * 2
    
    Sheet1.Range("A1") = sCommandLine
End Sub
```
では、これを C:\Temp\Book1.xls として保存して、まずは、Explorerからダブルクリックしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/215956/a3561370-f2c4-f562-8c61-fa8392eba23f.png)

なるほど、 Explorerから起動すると、 Explorerが Excelを 起動して、DDE通信というものを使って、Excelをリモコン操作して、Book1.xlsを開かせることになるので、こういうコマンドライン引数になります。

初歩的な実験として、GetCommandLineによりコマンドラインが取れるということは、いったんこれで確認できました。

やりたいのは、別のexeからコマンドライン引数指定で、自作ブックを起動したいということなので、 Explorerに頼ってはいられません。

たとえば、われわれは Book1.xls に abc という文字を渡したいとしましょう。
次のコマンドプロンプトへの入力はうまくいくでしょうか？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/215956/a56bf1d6-583c-b752-e519-14cb67bf2752.png)

下記の通り、うまくいきません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/215956/9eb01c85-6297-7100-738d-990cb32a5110.png)

では、Excel.exe のフルパスをつけてみましょう。　これはうまくいくでしょうか？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215956/67c75d5d-7082-f624-499e-0c1992d7c46c.png)

A1セルに ABC が 見事に入りました。　しかし、なんということでしょうか！？
Excelは ABC.xls を開こうしているではありませんか！
1つめのファイル名のあとの文字列は Excelは無視するかと思ったら、甘くて、複数ファイルの指定だと認識するのですね。
これは困ります。　毎回、こんなメッセージがでるんじゃたまりません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/215956/38cb81f4-2db3-cc37-2b1c-3c2a413479c1.png)

で、当時さんざん調べて、わかったやり方は次の通りです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215956/c36ebdbc-4bfa-aad7-d9af-fcb3f07c28f8.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/215956/0c3a6a5c-aaaf-1620-1920-dffbdaf53df0.png)

/e は 新規ブックをつくらないでExcelを起動するオプションです。
それに、:をつけると、そこの文字列が無視されます。
ただし、空白を含めることができません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/215956/255560dd-46d3-6857-42ab-76ce4a47a9c9.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/215956/0050d91e-3096-2cfd-9cac-bb4d2757a4bf.png)

いったん、C++で作ったexeなどの呼び出し側で 渡したい文字列を 16進数文字列化あるいはBase64文字列化等して渡し、VBA側で再変換するという逃げ道が考えられますが、この/e:の動作自体も、将来のExcelのバージョンでどうなるかわかったものでないので、私は怖くてこのやりかたは使えなくて、当時、諦めました。
リストの中から、条件にマッチした最初のアイテムが何番目かを返すやつ

Kotlin で、「リストの中から、条件にマッチした最初のアイテムが何番目かを知りたい」のだけど、既定のコレクションクラスにはそんな機能はないみたいだったので、作ってみた。

## 拡張メソッド

```kotlin
inline fun <T> Iterable<T>.firstIndexOrNull(predicate: (T) -> Boolean): Int? {
    return this.mapIndexed { index, item -> Pair(index, item) }
            .firstOrNull() { predicate(it.second) }
            ?.first
}
```

``.mapIndexed`` でインデックス付きの要素に変換して、ヒットしたらそのインデックスを返してるだけですね。

## 使い方

```kotlin
val arr = arrayListOf("a", "b", "c")

arr.firstIndexOrNull { it == "b"} // -> 1
arr.firstIndexOrNull { it == "z"} // -> null
```

ヒットしなかったら ``-1`` というのは悪手だと思う。 nullable があるのだから使おう。
エンジニアになって初めに出会った壁の話

#はじめに
この記事は、エンジニアの知識がほとんどなく業界に入った自分が、純粋な気持ちで感じたことを淡々と書き連ね、自分なりに腑に落ちた解釈をまとめたものです。

~~(恐らく、4月にエンジニアになったから方々は少なからず感る部分だと思ってます)~~

#ざっくり中の人
学部は情報課だったけどプログラムはすごい見せてもらってた系、
大学の授業でも単位のために受けていたので、
コマンドプロンプトがGUIの操作をコマンドでできるように
しただけという概念すら知らなかった。

映像とか作っていて何となく画面見ながら動くものを作っていた。
モノ創りだけは好きというモチベーションを抱えエンジニアとなり今。

##何で書こうと思ったか
・こういう人もいるんだよ〜っていうことを知ってもらいたい
・自分自身が初心を忘れないための議事録もかねて

##業界に入って最初に出会った壁
まず、最初に出会っためっちゃロジックを求められる壁です。
今まで、自分のやってきた映像制作なんかは
「なんかここの動き気持ち悪いからちょっと早くしよ〜」
「ここでそのシーンだと何となく流れおかしくない??」
という、「ロジック」の「ロ」の字もない、感覚で伝えて自分も他人の修正作業を眺めながら「いいね!」という感じでした。
しかし、エンジニアとしての働き方で求められるのは「効率とロジック」なのでなかなか、今まで感覚で動いてきた人からするとすごく、伝えるのが難しいです。

エンジニアになってあるあるとしては、
「なんかここの修正加えてしまうとダメな気がする。。。何がダメか分からないけど...」というケースが多々あります。^^;


##なぜ色々なもの名称が付いているのか
これは今でも頭を抱えます。多すぎです。
この名称が多くなってしまうのは、しょうがないのです。データを送ったり、受け取ったり、格納したり取り出したり、
システムはこういうモノを組み合わせてできているので、その組み合わせの数だけ言葉を作るとそうなってしまうのです。
でも、こういう専門用語は社会の授業見たく初めにすべて暗記するのではなく
実際、いろんな技術を触りながらコードを書いていくのが一番覚えやすいと思います。

自然と覚えるようになるので、ここは焦る必要ないと思います!
一生懸命伝えようとして伝わらないのは辛いよね。うんうん(白目)

##その他色々
多分、エンジニアになってすぐはターミナルとか言語の違いとか色々分からないことが多すぎて何から手をつけたいいのか分からなくなるし、周りと比較して焦ってパンクするなどなど
初めのことはなんでも悩むけど、とりあえず意識することは

**「俺に苦手なものなどはない!!無敵マン!」**

もう。この気持ちを忘れて何でも「苦手」と思ってしまうとそこから先は沼です。
その沼からはなかなか抜け出せなくなります。(学生の頃を思い出すとどれだけそれで苦手意識が付いて棒に振ったか..)

「苦手」と「出来ない」は全然違って、だいたいエンジニアの始めたたての時は「知らないから出来ない」なのでやったら案外できるパターンが多いので、自分がやらずに周り言っている苦手意識に流されて、
「自分も苦手かも」と思ってしまうのはめっちゃもったいないです!~~(JSとかJSとかJSとか)~~

##最後に
色々書きましたが、結局こういう壁は慣れるもので、それが当たり前になっていくので大きい障害にはならないとおもうのですが、
そういう「壁」の存在すらあることを忘れて、自分が教える立場になってしまうと、頭ごなしになってしまったり教えてしまったり、人のモチベを下げてしまう要因になるのかと思ったので、そういう視点もあるよということで参考になったらいいな〜と思いました。

すごい、何言ってんだ感ある感じの
曖昧な表現が多いのは許してくださいm(_ _)m
今の現場で使っているReactの仲間たちを紹介する

# この記事は
現在、自分の職場ではPHPベースのウェブサービスをReactjsにリプレイスしています。
そんな中、React以外の様々なライブラリを導入したので、紹介したいと思います。

# なぜそう思ったか
Reactは非常に柔軟なライブラリで、1つのウェブサービスを開発する際に、様々な他のライブラリと組み合わせて実装することが一般的なようです。
自分たちがどんな技術を採用したのか共有することで、これから導入しようとしている人たちの参考になればと思います。

## アプリ構築
- [create-react-app](https://github.com/facebookincubator/create-react-app)
    - コマンド一発でReactアプリに必要なものをインストールしてくれる。
    - インストール後は`npm start`だけでReactアプリが立ち上がります。驚愕。

## デザインフレームワーク
- [material-ui](http://www.material-ui.com/#/)
    - 美しいデザインのパーツを簡単に作れるライブラリです。
    - SVGアイコン等もそろっているので、デザインが苦手でもさくっときれいなアプリが作れます。

## 状態管理
- [redux](https://redux.js.org/)
- [react-redux](https://github.com/reactjs/react-redux)
    - React+Reduxの組み合わせが最も有名だったので。
    - 実際に開発してみると、Reduxが必要とは限らないケースもあることが分かりました。
    - 自分の現場では、無理にReduxに状態管理させるのではなく、デザインの実装に必要な簡単なものは、Reactコンポーネントでstateを管理しています。

## ルーティング
- [react-router](https://github.com/ReactTraining/react-router)
    - Reactだけではルーティングしてくれないので、専用のライブラリをインストールする必要があります。
    - 自分の現場では、WEBサーバの設定を変更できないという制約があったため`HashRouter`を採用しましたが、`BrouserRouter`を利用することが推奨されています。

## サーバサイドレンダリング
- 使用していません。

## API通信
- [redux-thunk](https://github.com/gaearon/redux-thunk)
    - React+ReduxではWEB APIをどこで呼ぶかは自由です。
    - Reduxの公式で解説されていたredux-thunkを使っています。

## コーディング規約
- [eslint](https://eslint.org/)
    - airbnbの規約を採用しています。
    - [Airbnb React/JSX Style Guide](https://github.com/airbnb/javascript/tree/master/react)

## テスト
- [jest](https://facebook.github.io/jest/)
    - create-react-appに最初から梱包されています。

## モック
- [json-server](https://github.com/typicode/json-server)
    - ReactではAPIからデータを取得して、アプリを開発することが多いと思います。
    - 開発の際に、APIのモックを簡単に立ててくれます。

## デプロイ
- [jenkins](https://jenkins.io/)
- [capistrano](https://github.com/capistrano/capistrano)
- npm scripts
    - jenkins + capistranoは既存のシステムから変えずにそのまま利用しています。
    - ビルドに必要な前準備等はnpm scriptsを使って書いています。

----

次回は、これらのライブラリの詳細について書いていきたいと思います。
WSLでJupyter NootbookからVisual Basicを実行する

# はじめに
これは、[Visual Basic Advent Calendar 2017](https://qiita.com/advent-calendar/2017/vb)の7日目の記事となります。

前回、「[Windows Subsystem for Linuxでの .NET Core を使用したVisual Basic のHello World アプリケーションの構築](https://qiita.com/yaju/items/ce0cbb79f27110d96afe)」を書きました。

Visual Basicアプリを編集するエディタとして vi を使いましたが、Windowsに慣れているせいでとっつきにくいです。かといって、WSLはあくまでサブシステムであり、GUIを構築してまで使わなくもいいやと思っています。

人工知能ブームでTensorFlowを使った際に「Jupyter Notebook」を使って、ブラウザ上でPythonを実装しました。
Jupyter Notebookは、Python以外の一般のテキストを編集したり保存することが可能です。ということは、Visual Basicアプリを編集するエディタとしても使えるということです。
更にWSLのJupyter Notebook上でTerminalも開けますから、ブラウザからVisual Basicアプリを実行することもできます。

# 環境作成
WSL上にAnacondaをインストールします。
インストールについては、次のサイトを参考にpyenvのインストールから行いました。
[Bash on Ubuntu on WindowsでJupyter NotebookからTensorflowを実行する](https://qiita.com/dd511805/items/23891da61559405fd5f6)

## pyenvのインストール
WSLにはデフォルトでもpythonが入っていますが、Anacondaを
使いたかったので、pyenvをインストールしました。

```bash
$ sudo aptitude install git
$ git clone https://github.com/yyuu/pyenv ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
```
## Anacondaのインストール
pyenvのインストールが終わったら、次のコマンドを実行してAnacondaの最新のバージョンを探します。

```bash
$ pyenv install --list
```

この記事を書いた時点では3-5.0.1が最新だったので、3-5.0.1をインストールしてデフォルトの設定にしました。インストールは30分以上放置。

```bash
$ pyenv install anaconda3-5.0.1
$ pyenv global anaconda3-5.0.1
$ pyenv rehash
```

# jupyterの実行
Anacondaをインストールすれば、jupyterはインストールされます。

```bash
$ jupyter notebook

JupyterLab v0.27.0
Known labextensions:

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=958935352ca737add97459f395235b7e6c45f822ab96ef61
```
ブラウザ上で上記で示された長いクエリ付きのURLを入力します。
次からはクエリ部分は不要でもいいようです。

```bash
http://localhost:8888/
```

# Visual Basicアプリの編集
myAppVBフォルダを選択します。Program.vb にチェックを付けて、Editボタンをクリックします。

![jupyter_file.png](https://qiita-image-store.s3.amazonaws.com/0/14053/179e7ce4-066c-cb02-af08-72c423b61356.png)


編集画面になります。メニューのLanguageからVB.NETを選択すればシンタックスハイライトされてコードが表示されます。

メッセージを変更して、メニューのFileからSaveをクリックします。
![jupyter_edit.png](https://qiita-image-store.s3.amazonaws.com/0/14053/a8eaf695-5c81-e453-ad24-8edd6db60681.png)


# Visual Basicアプリの実行
NewメニューからTerminalをクリックします。
※Windows版のJupyterにはTerminalは出てきません。

![jupyter_file2.png](https://qiita-image-store.s3.amazonaws.com/0/14053/dadfc4a8-afdf-573f-a5a6-f942c08fecd8.png)


ターミナル画面から次のコマンドを実行します。
すると、変更したメッセージが出力されます。

```bash
$ cd myAppVB
$ dotnet run

Hello World Test! VB.NET on .NET Core!
```

![jupyter_terminal.png](https://qiita-image-store.s3.amazonaws.com/0/14053/aaa767b2-2df5-505f-d5ab-526dcf10f556.png)


# 最後に
本格的なものにはとても使えませんが、手軽に試したいならブラウザ上で編集と実行が出来るようになったわけです。

Jupyter NoteBookにて、PythonのようにC#を即時実行するプロジェクトを見つけました。VB.NETは頑張れば作れるってことでしょう。

Interactive C# Notebook
https://github.com/zabirauf/icsharp
[phina.js] 要素をスクロールできるようにするアクセサリを作ってみた


phina.jsのアドベントカレンダー2017の7日目です。
6日目の記事を読んで、自分でちゃんと実装してみたいと思いやってみました。

[phina.jsでブラウザ風タッチスクロール - Qiita(6日目の記事)](https://qiita.com/Keith_K/items/98cc2f42a190111f8a23)

クラス自体は実装してたら、結構長くなってしまったので、コードは[gist](https://gist.github.com/simiraaaa/8c0d6bf92cc4b0d4ddedac7ab7a7b72b)においてあります。


phina.jsを読み込んだ後にこのURLを読み込むことで使うことができます。
https://rawgit.com/simiraaaa/8c0d6bf92cc4b0d4ddedac7ab7a7b72b/raw/039176929aec2838cc0fc7b303b8dac77512e51e/Scrollable.js

`<script src="https://rawgit.com/simiraaaa/8c0d6bf92cc4b0d4ddedac7ab7a7b72b/raw/039176929aec2838cc0fc7b303b8dac77512e51e/Scrollable.js"></script>`

## Scrollableの使い方

スクロールできるようにするアクセサリのクラス名はScrollableです。
Accessoryを継承しています。
Element系のクラスにattachして使います。

## 最小サンプル

`Scrollable().attachTo(this);`
シーンのinit内でこの1行だけでシーンの要素全てがスクロールされるようになります。

[[phina.js] 要素をスクロールできるようにするアクセサリ最小サンプル | Runstant](https://runstant.com/simiraaaa/projects/c9da76ab)

## 枠の外を描画しないようにする

### enableClip()

枠の外を描画しないようにします。
[enableClipサンプル
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60690/598e87f1-8397-0024-53fe-96ab89cdac26.png)
](https://runstant.com/simiraaaa/projects/c08ca4cb)

### disableClip()

枠の外を描画するようにします。

## friction, setFriction (摩擦)
最小0,最大1で摩擦を設定できます。

## lock(), unlock()

lock()でスクロールできなくします。
unlock()でスクロールできるようになります。

## 最大スクロール位置の設定

### minX, minY, maxX, maxY

- minX = スクロールできるx軸の最小値
- minY = スクロールできるy軸の最小値
- maxX = スクロールできるx軸の最大値
- maxY = スクロールできるy軸の最大値

### setMinPosition(minX, minY)

minX, minYを設定できます

### setMaxPosition(maxX, maxY)

maxX, maxYを設定できます

## スクロールの方法

`scrollType`にスクロール方法を設定することができます。
デフォルトは`'normal'`です。

`setScrollType(type)`でも設定できます。

### 横スクロール固定

`scrollType`に`'x'`をセットします

### 縦スクロール固定

`scrollType`に`'y'`をセットします


### 縦横スクロール

`scrollType`に`'normal'`をセットします。
スクロールの量が大きい方だけがスクロールします。


### フリック(自由スクロール)

`scrollType`に`'flick'`をセットします。
動かした方向に動きます。


## よくある使い方

普通にありそうな感じのサンプル

[よくある使い方サンプル | Runstant
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60690/eb2edfae-821d-fc05-d692-bdef9207e653.png)](https://runstant.com/simiraaaa/projects/0296dfc3)

## ごちゃまぜサンプル

[ごちゃまぜサンプル | Runstant](https://runstant.com/simiraaaa/projects/4390abfa)

## あとがき

実装してから気づいたことは、minとmaxのプラス・マイナスがイメージと逆になっているということです。
座標的には確かにyがマイナスになるほど上にスクロールしていますが、スクロールの最大値というとイメージ的には逆なので、setMaxPositionとsetMinPositionはプラスマイナス反転させたほうが良いのだろうかというのが悩みどころですね。
バッチの変数をPowershellコマンドレットに渡す方法

この記事は[PowerShell Advent Calendar 2017]("https://qiita.com/advent-calendar/2017/powershell")の25日目です。

---
ある時バッチからPowershellコマンドレットを実行しようとした際、バッチの変数をコマンドに入れる必要性が出てきました。
そこで対処した処理方法の備忘録です。
PS1を実行する方針でも良いですがExecutionPolicyを変更できない環境とか、スクリプトを一つにしたいという制約を受ける環境の方には有効かと思います。

## ユースケース
例えば、以下のような処理をする場合が考えられます。

1. バッチ内の処理で一次処理ファイルを生成する。
> バッチで何らかのコマンド実行結果をテキストファイル(ファイル名をバッチの変数で指定)に出力

1. Powershellコマンドで、一次処理ファイルを指定して二次処理を行う。
> テキストファイルをPowershellで読み込み次の処理を実行


## バッチの内容と説明
いきなりですが、バッチの中身です。
バッチの中に記述のコメントがユースケースで説明したような処理を説明しています。

```bat:call-pscmdlet.bat
@ECHO OFF
SETLOCAL

CD %~DP0

REM ---
REM 実行時間をTIMESTAMP変数に格納。一桁で空白となる数値は0埋め。
REM ---
SET TIMESTAMP=%DATE:/=%-%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
SET TIMESTAMP=%TIMESTAMP: =0%

REM ---
REM 実行時間を一次処理用ファイル名と最終処理結果用ファイル名として命名
REM ---
SET TEMPNAME=%TIMESTAMP%_%COMPUTERNAME%.txt
SET FILENAME=%TIMESTAMP%_%COMPUTERNAME%.csv

REM ---
REM ★★ここがポイント★★
REM 実行したいPowershellコマンドレットを生成し、PSCMDLET変数にダブルクォーテーション付きで格納
REM 処理内容:一次処理用ファイル(内容は後述)を読み込み→プロパティ情報から必要情報をフィルタして最終処理結果用ファイルにCSV出力
REM ---
SET PSCMDLET="Get-Content .\%TEMPNAME% | Get-ChildItem | Select-Object FullName,Length,CreationTIme,LastAccessTime,LastWriteTime,VersionInfo | Export-Csv -Encoding ASCII -Path .\%FILENAME%"

REM ---
REM [一次処理]
REM CドライブのEXEファイルだけを一次処理用ファイルにフルパスで書き出し
REM ---
DIR /S /B C: | FIND ".exe" >> %TEMPNAME%

REM ---
REM [最終処理]
REM PSCMDLET変数がPowershellコマンドレットとして実行される
REM ---
POWERSHELL -C %PSCMDLET%

REM ---
REM 一次処理用ファイルは不要なため、削除
REM ---
DEL %TEMPNAME%

ENDLOCAL
```

### あとがき
---
当初、最終処理のコマンドレット部に直接バッチの変数を入れていました。しかし意図した動作とならず、思いあぐねて上記対処方法を考えつきました。
お困りの方にとって、本Postが一助になれば幸いです。

なお上記のサンプルスクリプトは、Windows Server 2012 R2 / Powershell 4.0 の環境で動作確認をしています。
使用しているコマンドは一般的なものなので、Windows 7以降であればそのまま実行できるかと思います。
Ubuntu に Go をインストール (公式サイトからバイナリダウンロード)

Windows Subsystem for Linux 上の Ubuntu に Go をインストールする方法。 https://golang.org/dl/ からバイナリをダウンロードして、/opt 下に展開する。

ドキュメントは https://golang.org/doc/install にある。 ドキュメントでは /usr/local/go 下にパッケージを展開するということになっていて、FHS 的には非推奨な感じなので (ですよね？)、/opt 下にインストールすることにした。

```
cd /opt
sudo wget https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz
sudo tar -C /opt -xzf go1.9.2.linux-amd64.tar.gz
```

あとは /etc/profile に下記の内容を追加。

```
export GOROOT=/opt/go
export PATH=$PATH:$GOROOT/bin
```

こんな感じ。

# 参考

* FHS の話 :
    * [FHS によるディレクトリの規格化](http://www.itmedia.co.jp/help/howto/linux/0007master/14/04.html)
    * [FHS Referenced Specifications](http://refspecs.linuxfoundation.org/fhs.shtml)
Emacs フレーム(Frame) のサイズ設定関連の整理

# 環境

- OS: Windows 7
- Emacs: GNU Emacs 25.3.1 (i686-w64-mingw32)

# はじめに

- フレームのサイズ指定は表示文字数(表示行数、表示桁数)が基本だが、
  モニタサイズは画素数で表す。
- モニタサイズに合わせて、フレームサイズを指定する場合、フォントの画素数を基準に文字数を算出するか
  画素数で指定する関数を利用する。
 
# モニタの画素数、解像度を調べる

- x-display-pixel-height
- x-display-pixel-width
- display-pixel-height
- dispaly-pixel-width

調べた環境では 'x-' 有り、無しの違いは不明
マルチモニタ環境での解像度は合計値になるため、そのままでは利用できない。

# フォントサイズを得る 
- frame-char-height: 一行の画素数
- frame-char-width : フレームのデフォルトフォントの標準フォント幅の画素数

# set-frame-* を利用したフレームサイズの設定

## 文字数指定

```
(set-frame-size (selected-frame) 80 25)
```

## 画素数指定

(setq frame-resize-pixelwise t) を設定するかオプション指定する

```
(set-frame-size (selected-frame) 1024 600 nil t)
; (set-frame-position (selected-frame) 0 0)
```
# initial-frame-alist, default-frame-alistによるフレームサイズの設定(画素数指定は未確認) 

## 文字数指定

```
(setq default-frame-alist
  '(
    (width . 80)
    (height . 25)
   ))
```

## 画素数指定

```
(setq default-frame-alist
  '(
    (width . (text-pixels . 1024))
    (height . (text-pixels . 600))
   ))
```

# モニタ毎に解像度を調べる

(display-monitor-attributes-list)

```
(display-monitor-attributes-list)
(((geometry 0 0 1680 1050) (workarea 0 0 1680 1020) (mm-size 593 370) (name . "\\\\.\\DISPLAY1") (frames #<frame emacs@hostname 05428d80>)) 
 ((geometry 1680 150 1600 900) (workarea 1680 150 1600 900) (mm-size 564 318) (name . "\\\\.\\DISPLAY2") (frames)))
```
※ frames に frame 情報が含まれている方の geometory 情報を取り出せばモニタに合わせたフレームサイズに設定できそうだけれど、綺麗なやり方が思いつかない。

```
(setq my:current-workarea (loop for x in (display-monitor-attributes-list)
      when (> (length (assoc 'frames x)) 1) return (assoc 'workarea x)))
```

# その他

- emacs のマニュアルにおける display は X Window System における display なので
  表示装置はモニタと表現する。マニュアルにある Multiple Display はマルチモニタとは異なる。
- 自分の環境では、リファレンスマニュアルにある 'frame-monitor-attributes は
  describe-symbol で出てこない。
UNREAL FEST EAST 2017 personal report

#はじめに
2017.8.8に行われたUnreal Fest 2017に参加した私的なメモです。
できるだけ検証して記述していきますが、不適切な部分などがあればご指摘ねがいます。

筆者のUE経験は年もございませんが、Unrealが初めてCD-ROMでリリースされた頃、洋ゲーとして購入しエディターもあるんだーと思い、Windows98?で不安定ながら四角い箱と箱を繋げたレベルを作成し実行して成功して、保存していないでWindowsが異常終了とかして楽しんでいました。

#公演時のUE4とUnityのバージョン
UE4.16.xx?([UE4.17 Preview版は2017.7.17youtubeでアナウンスされている](https://youtu.be/UwVoYfgP6ZY))
Unity2017.2?

UE4では、実写との合成ができるComposureコンポジットプラグイン、Unityでは、4日後くらいにUnity 2017.2.0がリリースされTimeline(UE4のsequenserと同等の機能)が正規版としてリリースされ、Unity 2017.1.系でできなかったUnityのC#を呼べるように改良されました。

#参加した講演の簡易メモ
[UNREAL FEST EAST 2017 公演内容詳細](https://unrealevent.eventcloudmix.com/)

####**a.VR ZONE SHINJUKU 極限度胸試しハネチャリ**
THE UNREAL WAYを主体に作成
**１週間規模でプロトタイプ作成**
SAGA系の映像会社とコラボで別ディレクトリにそれぞれの素材を置くルールでイテレーションした

プロトのライトは、デカールでライトのテクスチャにする定番で対応

短期間のプロトタイプ作成で、成功や課題が早い段階でわかるという知見を得た

####**b.The Latest About and Future of Unreal**
[UE4.17,18で追加される機能公式動画](https://youtu.be/Q-GZ_dqaihg)
UE4.17,18で追加される機能の一通りの説明だが、従来のオクルージョン実装やアンビエントオクルージョンマルチバウンスなど、ゲームエンジン側の画像処理の知識がカナリ無いとついていけない内容だった。横の人は寝落ちしてた


####**c.Developing High Performance Games for Android**
世の中に出ているモバイル端末は、７０％ARMプロセッサだが、５～７ｗ程度の入力でPS3程度のパフォーマンスを要求されている

タイルベースレンダラーで、パネルへ出力が基本

big little coreでCPU Gavernorが温度を見ていて切り替えるというアーキテクト

（ラフネスをMAXでスペキュラーがおちる）謎の暗号

Androidアプリ開発の目安
３０FPS
１／４～１／２のメモリ使用量

圧縮テクスチャ
ASTC,ETC2,ETC1(+Luminanceアルファ用）がおすすめ

現時点でのGoogle,NDIVIAのUE4Editorおすすめ設定
描画API全てチェック
OpenGL2, 3, Valkan
ARM32,64で８％アップだがサイズ肥大の問題あり

Goole Play Storeでは、Multiple APKの設定で自動的にユーザーへ最適化される仕組みがあります

UE4の描画設定

r.ScreenPercentage 1.0で720P

（UIの解像度もあがりそうなので、考慮）

コマンドを使い動的パフォーマンスチューニング r.MaxFPSなど

デモ用APPの技術公演
モバイル端末は、タッチイベントでクロックを変動させている為、長時間タッチイベントが無い場合のチップス

最後にValkanは、ゲーム用にチューニングさせているので、対応端末がサポートの場合、是非。

####**d.Rez Infiniteはいかにして生まれたか - 我々が目指すシナスタジア(共感覚)表現の未来**
シナスタジア共感覚
Rezは8K対応しているのでモニター持っている人は8Kって…
トランスバイブレーター（音にあわせて振動する振動スーツ）の信号は出ているので自作も可能
パーティクルさくせカスケードからナイアガラへ プログラマーの助けなしでできる。The human raceの車タイヤスピンとこうかくみたいなの システム -> エミッター -> モジュール #ue4fes


####**e.ドラゴンクエストXIへの道 ～The "L"oad To DragonQuestXI～**
堀井さんは100%じゃなくて大体やりたい事、実装らしい。#ue4fes
インクレディビルドはテクスチャもやってくれるみたい。#ue4fes
BP書くとuobject数、増えるあったなー。#ue4fes バージョンアップでc++化オプションを使う。
Update component on ? ガーベージコレクションが重い。あったなー。#ue4fes PerformanceReachabilityAnalsisを解析しにそー
Ue4は1asset1file. EDL 昇順キャシャー？で改善。ランダムでシークするとパフォーマンスダウン -fileopen log  でパッケージ #ue4fes
DQ11ロードストルームレベルらしい。パラゴンでは問題が出てなく内製が問題？ #ue4fes

####**堀井さんとゆるゆる話す『ドラゴンクエストXI 』の製作秘話**
サテライト会場で視聴
前のセッションかもだが初代ドラクエの頃から、普段使われる言葉、いまの形態素解析的なことを入らないからされていたらしい。
Nintendo Switchはポチで、出来ないには笑った。ホントそうデバイスが違うからテスト直しとか上の人はよく考えて。

ただただ、ためになる幸せな時間でした。

#講演内容の動作検証

#最後に
ちょっとずつ読むドメイン駆動設計 第三部 より深い洞察へ向かうリファクタリング 第十ニ章 デザインパターンをモデルに関係づける 

ここで、デザインパターンとは何かとかどんなパターンがあるかという話しは置いておいて・・・

# デザインパターンをモデルに適用する
デザインパターンは、オブジェクト指向技術を技術的に使用する上で、さまざまなコンテキストで頻繁に直面する問題を解決してきたものです。なので、デザインパターンのカタログでは**技術的な用語で**紹介されています。

このデザインパターンをドメイン駆動設計で適用する上で注意する点は、**パターンの考え方が本当にドメインの概念に合うかどうか**というところです。
このことはこの章で何度も言われているところですね。

例では、ストラテジーパターンとコンポジットパターンが挙げられています。
ストラテジーパターンをドメイン駆動設計に当てはまる際には、

> デザインパターンとしてのストラテジーに対する従来の見方は、さまざまなアルゴリズムを置き換える能力に焦点をあわせているが、ドメインパターンとして使う場合には、プロセスや、ポリシーのルールに代表されるような概念を表現する能力に焦点を合わせている。

# デザインパターンとオブジェクト指向とドメイン駆動設計

オブジェクト指向技術と合わせて広まったデザインパターンですが、デザインパターンが理解できれば、エンジニアとしてレベルが上った、保守性の高いソースコードが書ける！というのはちょっと誤解がありそうです。

複雑なドメインに対して、ドメインの概念に合わせることを考えずに複雑なデザインパターンを適用すれば、結局ソースコードが複雑になるだけですよね。

やはり、ドメイン駆動設計を理解して、ドメインの概念に合った場合にのみ、デザインパターンを選択することが大事ですね。

それから、Gofのデザインパターンカタログを全て使えないとだめですか？という質問をときどき受けることがあるのですが(質問されるほどレベル高くないだろというツッコミは置いておいて・・・)、ドメインの概念にはなかなか合わないようなパターンもあるので、無理やり全部理解しようとするよりは、ドメイン駆動設計を理解しに行った上で、概念的に適用できるパターンはないかなとカタログをパラパラめくるような使い方をする方がいいかもしれませんと答えています。

実際、ドメイン駆動設計本でもフライウェイトパターンはドメインモデルにおいては、一致するものがないと言っています。(値オブジェクトに対して適用した例は５章で紹介されてますね。ただ、エンティティで使用できるものではないので、ドメインの概念と一致しているとは言い難いということです。)

インタプリタパターンも、今のところ例が思いつかないと言っていますね。
[vue.js] コンポーネントのpropsにもっとちゃんと型をつけたい

## TL, DR
コンポーネントのpropsにより厳格な型を指定するためのライブラリ [vue-strict-prop](https://github.com/wonderful-panda/vue-strict-prop) をつくりました。
意見などもらえると喜びます。

## 問題
Vue 2.5からTypeScript向けの型定義が大きく改善され、コンポーネントのpropsの型もコンポーネントオプションを元に推論してくれるようになりました。

例えばこんな感じ

```ts
export default Vue.extend({
  name: "ExampleComponent",
  template: "...",
  props: {
    // titleの型はstringとみなされる
    title: String,

    // itemsの型はany[]とみなされる
    items: { type: Array, required: true },

    // filterの型は (...args: any[]) => any とみなされる
    filter: { type: Function, required: true },

    // directionの型はstringとみなされる
    direction: {
      type: String,
      default: "horizontal",
      validator: v => v === "horizontal" || v === "vertical"
    }
  }
});
```

しかし、この推論結果について、以下のような点が気になります。

* `title` には `required` も `default` も指定されていないので、値が入らないケースがある。  
  つまり、本当は `string` ではなくて `string | undefined` になってほしい
* `items` は配列だけど、できれば要素の型も指定したい
* `filter` は関数だけど、正確なシグネチャ(例えば (value: string) => boolean とか)を指定したい
* `direction` は、`string` ではなく `"horizontal" | "vertical"` になってほしい

## [vue-strict-prop](https://github.com/wonderful-panda/vue-strict-prop)

これを改善するべく、`vue-strict-prop` というちょっとしたライブラリを作りました。
これを使うと、上のコードは下のようになります。

```ts
import p from "vue-strict-prop"

export default Vue.extend({
  name: "ExampleComponent",
  template: "...",
  props: {
    // titleの型はstring | undefinedとみなされる
    title: p(String).optional,
    // itemsの型はstring[]とみなされる
    items: p.ofArray<string>().required,
    // filterの型は (value: string) => boolean とみなされる
    filter: p.ofFunction<(value: string) => boolean>().required,
    // directionの型は"horizontal" | "vertical"とみなされる
    direction: p.ofStringLiterals("horizontal", "vertical").default("horizontal")
  }
});
```

### 使い方

基本のパターン。型を指定した後、`optional`、`required`、`default`のどれかを指定します。
`optional`、`required`、`default` のどれかで終わるのは、以下すべてのパターンで共通

```ts
import p from "vue-strict-props";

p(TYPE).optional        // { type: TYPE }
p(TYPE).required        // { type: TYPE, required: true }
p(TYPE).default(VALUE)  // { type: TYPE, default: VALUE }
```

validator を指定したい場合はこう

```ts
p(String).validator(v => v.length < 3).required
```

複数の型を指定するパターン。今のところ指定できるのは５つまで

```ts
p(TYPE1, TYPE2).optional
```

ArrayやFunctionなどに詳細な型をつけるために、それぞれメソッドが用意されています。

```ts
p.ofArray<string>().required
// Array ではなく ReadonlyArrayを使う場合はofRoArrayで
p.ofRoArray<string>().required
p.ofFunction<() => void>().required
p.ofObject<{ foo: string }>().required
// 型が"foo" | "bar"になるだけでなく、`value in ("foo", "bar")` 相当のvalidatorも登録される
p.ofStringLiterals("foo", "bar").required
```

型指定なしも

```ts
p.ofAny().required
```

`or` を使った条件の結合
６つ以上の型を指定したい場合(ないと思うけど)も `or` を使います

```ts
p(String).or.ofFunction<() => string>().required
p(TYPE1, TYPE2, TYPE3, TYPE4, TYPE5).or(TYPE6, TYPE7).required
```
社内で技術系ランチミートアップを始めた

この投稿は[mohikanz Advent Calendar 2017](https://adventar.org/calendars/2578)の7日目の記事です。
mohikanzについては、[@inductor](https://qiita.com/inductor)さんが書いた[1日目の記事](https://mohikanz.kibe.la/shared/entries/540aafc1-72b5-42a9-ba33-f49986faa22e)をご参照ください。

昨日は[@inductor](https://qiita.com/inductor)さんの[Kibela(情報共有ツール)が技術コミュニティ向けに無償化されたので導入した話](https://qiita.com/inductor/items/8005baa3fc502179ef90)でした。

## はじめに
2か月ほど前から、社内で昼休みに昼食を食べながらの勉強会を始めました。
社内ではTech Meetupと呼んでいます。
毎週1回で、今のところ8回開催されています。

今回は、このTech Meetupを始めた背景からやってみて分かったことまで、つらつらと書いていこうと思います。
今後、何かしら勉強会を始めたい人の参考になることがあれば幸いです。

## 目的
この会を始めた目的はいくつかあります。

- 社内メンバの持つ技術をプロジェクトを越えて展開する。
- 誰がどんな技術を持っているかをお互いに知る。
- 気軽にアウトプットする場を作る。

他にもありますが、主なものはこんなところです。

## 背景
今の会社に入っておよそ2年になりますが、社内の技術伝達に課題を感じていました。
ある人が持っている技術や知見が他の人に共有されないケースが多いのです。
最近になって社内用のWiki(Backlogのプロジェクト)やSlackチームが作られ、改善されつつはあるのですが、十分とは言えません。
せっかく同じオフィスにいるのだから、もっと効率の良い対面という伝達方法を取ろうという意図もあります。

技術の共有以外では、(特に若手社員の)アウトプットする機会の少なさも感じていました。
もちろん、社外の勉強会に行き発表するような人もいます。
ですが、多くの人にとっては、それが高いハードルを感じてしまうようです。
そこで手軽に発表できる場を作りたいという思いがありました。

また、既に社内でEnglish Meetupというランチタイムの英会話勉強会が開催されていて、これが直接的な切っ掛けとなりました(私も運営側の1人)。
この形式を~~パクって~~参考に、技術版のMeetupとして開催したのがこのTech Meetupです。


## 内容
### 方針
基本的に緩い雰囲気でやりたかったこともあり、昼の休み時間を使っています。
(人が話してる前でパクパク昼食を摂ってたりするくらいには緩いです)
形式も特に定めずに、希望があればできるだけ汲み取り、その方式でやるようにしています。

### スケジュール
毎週火曜日の昼休みに50分間を充てています。
会社の昼休み60分あるので、10分は昼食を準備する時間として取ってあります。

### 参加者
昼休みなので当然ですが、完全に自由参加です。
毎回4～8人くらいが参加しています。

### 流れ
前述の通り、形式は定めてないのですが、希望者がLTをやることがほとんどです。
概ね2人がLTをして、それをネタに雑談する感じです。
(本来のLTと違い20～30分くらいかかったりするので、Lightning TalkじゃなくてLong Talkの略だという説もあります)

過去、LTで取り上げたネタをいくつか取り上げると、こんな感じです。

- Gulpによるフロントエンドアセット管理
- プログラムの動きを低レベルから理解する
- 新しい言語を学ぶこと
- Rを使った統計処理
- AWS re:Inventまとめ

各人が持ってる知識だったり、そのときに興味がある内容だったりするので、特に一貫性はありません。

## 成果
### 良かった点
- 誰が何を知っているかを知ることができた
    - 普段アンテナが向いていない知識のエントリーポイントにもなります
    - この分野ならこの人に聞けばいい、という知識も共有されました
- 若手も含めて、多くの人がアウトプットする場面として使えた
    - 特に1、2年目の人が積極的に使ってくれてるのは主催側としては嬉しい限りです
    - あ、ベテラン勢の発表ももちろん歓迎してます(私信)

### 課題
- 時間が短いので系統的な知識を得るのには向かない
    - 予想していたことですが、この場だけで体系的な知識として共有するのは厳しいです
- 自由参加なので、参加するメンバーがある程度固定される

## 今後
特に今後の課題だと思っているのは、参加層の拡大です。
実のところ、始めたばかりの自由参加勉強会に来るような人は元々積極性を持っている人でもあります。

一方で、本当にこの場を提供したい対象は、積極性が低い層でもあります。
その層を巻き込めるようにしたいですが、この手の勉強会は楽しんで参加してこそです。
ことわざにもあるように、馬を水辺に連れていくことはできるが、水を飲ませることはできないのです。
緩く存在をアピールし、参加したいと思ったときにいつでも参加できる場として存続させていければと考えています。

まだ始めてから2ヶ月、8回しか開かれていない若い勉強会です。
地道に続けていった先、状況がどう変わるのか、経過を観察していくつもりです。
Elmに入門してみた

Elmアドベントカレンダー７日目の記事です。

６日目は [@miyamo_madoka](https://qiita.com/miyamo_madoka) さんの [Style Elementsに対する感想を書くので気になったら使うといいと思う](https://qiita.com/miyamo_madoka/items/4f4642933fc077f2c303) でした。

この記事は関数型初心者がElmに入門してみて感じたとこを書いた感想文です。

# どうやってElmを知ったか
とりあえず僕がどうやってElmにたどり着いたかを先に書きます。

|月|できごと |
|---|---|
|2月|[某人](https://qiita.com/ababup1192) から関数型を推される|
|2月|書店で [関数型プログラミングの基礎 JavaScriptを使って学ぶ](https://www.amazon.co.jp/%E9%96%A2%E6%95%B0%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E5%9F%BA%E7%A4%8E-JavaScript%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%AD%A6%E3%81%B6-%E7%AB%8B%E5%B7%9D%E5%AF%9F%E7%90%86/dp/4865940596/ref=sr_1_1?ie=UTF8&qid=1512517614&sr=8-1&keywords=%E9%96%A2%E6%95%B0%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0+javascript)を見つけて買ってみる|
|8月|なんとか読み終えて [すごいH本](https://www.amazon.co.jp/%E3%81%99%E3%81%94%E3%81%84Haskell%E3%81%9F%E3%81%AE%E3%81%97%E3%81%8F%E5%AD%A6%E3%81%BC%E3%81%86-Miran-Lipova%C4%8Da/dp/4274068854/ref=sr_1_1?ie=UTF8&qid=1512520145&sr=8-1&keywords=%E3%81%99%E3%81%94%E3%81%84H%E6%9C%AC) を買う|
|9月|[某人](https://qiita.com/ababup1192) にElmを推されてやってみる|

っという感じです。
すべて今年起こったことなので関数型に触れて１年経ってない関数型１年生です。

# Elmをどうやって勉強したか

## Elm Tutorialをやってみる
とりあえずElm Tutorialを一通りやってみました。
文法やアーキテクチャの部分は [Try Elm](http://elm-lang.org/try) で試しながら遊んでました。
Haskellを少しだけかじったことがあったので文法的なところはすんなり入ってきた気がします。
アーキテクチャの部分はこの時点ではいまいちパッとしない感じでした。

## アプリを作ってみる
やらなきゃ分からんので思いついたアプリを作ってみました。
最初にポーカーを管理するアプリを作ってみようとしたが最初にしては重すぎる内容で完成せず。
次に [ライフゲーム](https://github.com/uzimaru0000/HexLifeGame) を作ってみました。[こちらの記事](https://qiita.com/miyamo_madoka/items/2cad5473010292982303) を参考に作ってみました。
なんとか完成できたのですが近傍をチェックするときに全部のセルをチェックしてるので少し重いです・・・今後の改善点・・・
その後、暇つぶしで [ライツアウトゲーム](https://github.com/uzimaru0000/Elm-LightOut) を作ってみました。暇つぶしでコードがかけるレベルになったかなって思います。

やっぱり実際に何か作ってみないとアーキテクチャの部分は実感できない気がしました。いろいろ作ってようやくだんだん分かってきた感じです。

# 入門してみた感想
チュートリアルもあってThe Elm Architectureも雰囲気はつかみやすくアプリを作ってみる段階に入るのが簡単だと思います。
文法自体も特別難しいところはなく、結果がWebアプリとして目に見えるのでモチベーションも落ちづらく関数型の入りとしてもいいのかなと思いました（今度友達に推してみる予定）

# 最後に
簡単ですがこれで終わりたいと思います。
まだまだElmは勉強中なので頑張りたいです。
CloudGarage DAPとAWS Cloud9で無料開発環境



CloudGarageでAdvent Calendarを書くにあたって何を書こうか考えてたら、re:Inventでちょうど良さそうなサービスがローンチされたので試してみた。

## AWS Cloud9
ちょうど良さそうサービスとは[AWS Cloud9](https://aws.amazon.com/jp/cloud9/)。
Cloud9というWeb IDEサービスをAWSが買収して1年程度経つがとうとうAWSに統合された。
まだ今までの環境も使える。使えるが普通に行くとAWS Cloud9に飛ばされるので直接[ログインページ](https://c9.io/login)にアクセスする必要がある。
ちなみに最近開発環境としてCloud9をよく使っていたので、ログイン方法がわからなくなったのは秘密だ。

料金体系を調べるとどうもAWS Cloud9の利用料金は無料らしい。
動作環境にEC2を使うとその分課金される、が自前のサーバを動作環境にすることができる。
その場合は無料らしい。

CloudGarageのリリースパーティでLTをした際にDev Assist Program(DAP)で貰ったインスタンスもあるし、AWS Cloud9と合わせて無料の開発環境を構築することにする。(よし、タイトル回収完了)

## 環境構築
### 前準備
さて、まずは前準備。
AWS Cloud9で使用するユーザを作成する。
色々インストールとかするのでsudo権限が必要。
なお、AWS Cloud9が色々インストールする際にパスワード入力が一々求められて面倒なので、パスワードなしでsudoできるようにしておくと便利。
なので```/etc/sudoers.d/```に以下のようなファイルをおいて置くといいだろう。名前はなんでもいい。

```
# ここではユーザ名をcloud9としている
cloud9 ALL=NOPASSWD: ALL
```

AWS Cloud9ではPython 2.7とNode.js  0.6.16以降が必要。
(Pythonは2.7以降ではなく2.7が必要)

Pythonはバージョン固定とか面倒そう(実際は知らない。標準で入っていたりするし勝手にアップデートされても面倒とかそんな感じ)なので、anyenvを使ってPythonとNode.jsをインストールした。

anyenvの使い方は[この記事](https://dev.classmethod.jp/tool/tool-anyenv/)を見ればいいと思う(面倒なので書かない)。

### AWS Cloud9のページへ
AWS Cloud9は実はまだ提供リージョンに制限がある。

- 米国東部(バージニア北部)
- 米国東部(オハイオ)
- 米国西部(オレゴン)
- EU(アイルランド)
- アジアパシフィック(シンガポール)

の5リージョンでしか提供されていないので好きな場所を選んで欲しい。
最初にアクセスすると以下のようなページが表示されるので"Create Environment"をクリックする
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/31478/15e4a7f9-e0df-a8d1-0cf8-61579576353d.png)


### 環境名と備考の設定
環境名を指定する。
備考は何かあれば書けばいい。
とりあえず何を書いていいかわからいので放置。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/31478/083d8347-3397-b904-be6f-81eb5d8aa7bc.png)



### 環境設定
とりあえずEC2を使うことになっているので、これを"Connect and run in remote server (SSH)"に変更する。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/31478/8a840e56-31bb-6773-2749-1dfa5f9d3802.png)


すると、SSH接続の設定フォームが表示されるので自分の環境に合わせて入力する。
AWSが接続するための公開鍵が生成されているので、```~/.ssh/authorized_keys```に追記する。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/31478/460dc893-ab90-9b30-e7df-bde4b63d4803.png)


設定が終わったら、右下の"Next Step"をクリック。
接続テストが行われて問題がなければ、この設定でいいか確認を受けるので右下の"Create environment"をクリック。
するとWeb IDEの画面に遷移しようとする。

### Cloud9のインストール
遷移しようと別のページに飛ぶがまだ使用はできない。
モーダルウィンドウに"AWS Cloud9 installer"が表示される。
基本的に"Next"を押し続ければ問題はない。
最低限のものでよければ"Cloud9 IDE"と"c9.ide.find"(チェックを外せないもの)をインストールするといいだろう。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/31478/a68a955c-3ff9-ab93-39a1-0619fae62929.png)


完了するとこんな画面になるので、あとはサンプルとか見ながらいろいろやってみるといいと思う。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/31478/1ea587a7-43a3-2288-e0e2-b4a7c7cccabf.png)


## まとめ
これでDAPとAWS Cloud9による無料開発環境の構築ができたと思う。
いやCloudGarageというよりもAWS Cloud9の記事じゃねーかと感じる人もいると思うが異論は受け付けない。
CloudGarageで動かしているからいいのだ。そうじゃなければ一体何を書けというのだ。マジでネタがなかったんだ。

ということで本記事はここまでだ。
明日は[@FoxBoxsnet](https://adventar.org/users/14943)さんです。よろしくお願いいたします。
情報処理技術者試験に向けて【応用情報技術者編】

# はじめに
HAL東京高度情報処理学科３年のminakawaです。
前回の「[情報処理技術者試験に向けて【基本情報技術者編】](https://qiita.com/minakawa-daiki/items/d8b6ae545d78bdfae8d7)」に続いて今回は**応用技術者試験**にフォーカスを当てて記事を書きたいと思います。

# 応用情報技術者試験について
応用情報技術者の対象者像は以下の通りです。

> 高度IT人材となるために必要な応用的知識・技能をもち、高度IT人材としての方向性を確立した者

応用的知識・技能と書かれている通り、基本情報技術者試験よりも踏み込んだ問題が出題されます。
特に基本情報技術者試験との大きな違いは、午後問題が**記述式**になることです。
記述式に慣れていない人はなかなか難しいと感じると思います。
H28の実績は96,947名の応募に対して合格率は21.0％となっています。

## 試験時間・出題形式・出題数（解答数）
||午前|午後|
|:-:|:-:|:-:|
|試験時間|9:30～12:00(150分)|13:00～15:30(150分)|
|出題形式|多肢選択式（四肢択一）|記述式|
|出題数|80問|11問|
|回答数|80問|5問|

午前午後ともに60点以上で合格です。

自分の主観ですが、午前は基本情報技術者試験の勉強をしっかりと行っていれば、合格ラインまで達することはそこまで難しくないでしょう。
しかし午後は記述式で１問あたりにかけられる時間が30分となっており、人によっては時間がギリギリになると思います。実際私は時間が足りないと感じました。時間配分も試験にとってとても重要な要素なので意識しておくと良いでしょう。

# 筆者の勉強期間と点数
基本情報技術者試験取得から半年で合格に持って行ったため、勉強期間は５ヶ月ほどです。
午後は複数ある分野から選択して解く方式でしたが、自分はどの分野でも合格できるように勉強していました。
その方が解きやすい問題を見極めやすいと思ったからです。
受験回はH28春で、点数は午前が「83.75点」午後が「68.00点」でした。
午後に選択した問は「情報セキュリティ」、「プログラミング」、「システムアーキテクチャ」、「ネットワーク」、「組込みシステム開発」です。

# 勉強方法
とにかく参考書を読んで、問題を解きまくることです。早めのうちに午前問題を完成させて、午後問題にどれだけ時間をかけられるかがキモになってくると思います。
私ははじめの２ヶ月ほど参考書を読み、それに加えて１ヶ月ほど午前問題を解いた後、残りの期間ずっと午後問題を勉強していました。
それに加えて重要なことは、**基本情報技術者試験**の知識がしっかりと定着しているかどうかです。
ここのベースがしっかりしてないと難しく感じ、逆にしっかりとしていると応用知識に関する知識の定着がスムーズに行え、記述の仕方の部分に多くの時間を割くことができます。

とは言っても、人によっては記述式に慣れるのに相当時間がかかると思います。初めは自分も１割２割しか点数が取れてなかったので、どれだけ根気強く継続して勉強できるかが鍵です。頑張りましょう。

## 使用した参考書・問題集と期間
応用情報技術者試験で使用した参考書と期間は以下の通りです。
※期間はかすかな記憶をたどり書いたものなのであくまで参考程度で。

- **キタミ式イラストIT塾 応用情報技術者**  
基本的な知識はこの本で学びました。イラスト付きで分かりやすです。（期間：1か月目～2か月目）
- **徹底攻略 応用情報技術者教科書**  
もう少し違う視点から学びたかったのでもう一冊参考書を学びました。（期間：2か月目～3か月目）
- **要点早わかり 応用情報技術者 ポケット攻略本 (情報処理技術者試験)**  
すきま時間でずっと読んでました。（期間：1か月目～5か月目）
- **応用情報技術者過去問道場**  
午前問題はここの問題すべてを解き、定着させました。（期間：2か月目～4か月目）
- **iTEC - 応用情報技術者 午後問題の重点対策 (午後問題対策シリーズ)**  
午後問題専用の問題集。非常に濃密でした。（期間：4か月目～5か月目）

# 今、応用情報技術者試験を振り返ってみて
かなり時間を費やして勉強していました。とにかく一発で合格しようと思っていたため、どの分野にも毛嫌いせず取り組んでいました。
そのため意識は６０点合格ではなく１００点合格を目指していました。（実際の点数はギリギリでしたが笑）
また、基本情報技術者の知識がしっかりと身についていたこともあり、知識面ではそんなに苦労はしなかったのですが、やはり記述に慣れるまでに時間がかかった印象でした。
これから応用情報技術者試験を受ける人の手助けになれば良いと思います。

# おわりに
応用情報技術者は取得するのに苦労する資格ですが、勉強を一生懸命して取得する価値のある資格だと感じています。
今では主流で使われてない技術の問題ももちろん出ますがそれも含めて応用情報技術者試験の勉強は良い経験になると思います。
ITに関する幅広い知識を得たいと考えている人は是非挑戦してみましょう。
Ionic/Angularを拡張するWebコンポーネントmobiscroll

#まえがき
この記事は [Ionic Advent Calendar](https://qiita.com/advent-calendar/2017/ionic) の7日目の記事です。

株式会社ブライト・ヴィーの飯田友一です。

弊社は介護・医療・子育て支援といった地域共生社会の実現に向け、様々なICTサポートを行っています。
Webシステムやタブレットアプリ・スマートフォンアプリなどを構築していますが、
アプリクライアントは「オールIonic」で構築しています。

過去にはBackbone/Angular1での実装や、Aureliaの試行などを経て、今後はIonicと心中する勢いで使い込んでいます！

#Ionicが標準で提供するUIはありがたい
UIデザイナーが確保できないチームにとって、
ださくなりがちなデザインを、美しくサポートしてくれるIonicのインターフェイスは非常にありがたいものです。

標準で用意されているインターフェイスは多岐にわたります
http://ionicframework.com/docs/components/

<img width="902" alt="Ionic UI" src="https://qiita-image-store.s3.amazonaws.com/0/34871/ccb94858-0eb3-61ba-ab69-50f786e07130.png">

Card
http://ionicframework.com/docs/components/#select

Select
http://ionicframework.com/docs/components/#select

#とはいえ、もう少しいろんなUIがほしい → Mobiscrollの出番

MobiscrollはIonicには備わっていない様々なUIをコンポーネントとして拡張してくれています。

![スクリーンショット 2017-12-07 1.07.30.png](https://qiita-image-store.s3.amazonaws.com/0/34871/4eb593f9-0bc1-c1e2-cafa-457fb99f5bd7.png)

用意されている全てのUIはこちらにサンプルを含め紹介されています。
https://mobiscroll.com/ionic#kitchensink

「Ionicに足りないコンポーネントを補完してるよ！」とのアピールもありながら！
![スクリーンショット 2017-12-07 0.45.19.png](https://qiita-image-store.s3.amazonaws.com/0/34871/60fb512f-1a65-03c3-46df-e00ec7057bca.png)


#Mobiscrollの操作感を実機で試してみたい

Mobiscrollの操作感を試してみたい場合、
自前でモックを作らずともIonicデベロッパーおなじみのIonic Viewで試すことができます。

■App Store / Google Play
https://itunes.apple.com/us/app/ionic-view-test-share-ionic-apps/id1271789931
https://play.google.com/store/apps/details?id=com.ionicframework.view

Enter Codeへ
>09372c58 

を入力することで、mobiscroll公式が用意しているモックアプリを試すことができます。

![スクリーンショット 2017-12-07 1.13.49.png](https://qiita-image-store.s3.amazonaws.com/0/34871/b44ad14f-b978-0920-3512-5b7629c5aa18.png)

#既存Ionicプロジェクトへの適用について
インストールは非常に簡単です。

``` 
$ npm install -g @mobiscroll/cli

$ mobiscroll config ionic
```
以上で終了です。

HTMLコードもシンプルです。
`mbsc-date`などのアトリビュートをつけるだけでMobiscrollのコンポーネントを利用することができます。

```html
<ion-content>
    <ion-item>
        <ion-label>Birthday</ion-label>
        <ion-input [(ngModel)]="myBirthday" mbsc-date></ion-input>
    </ion-item>
</ion-content>
```

https://docs.mobiscroll.com/angular/with-ionic


#Mobiscrollは有償
いい事づくしのMobiscrollですが、有償になります。

ライセンス未購入で使っていると、`Trial`と書かれた透かしがコンポーネントに表示されます（確かTrialだったと・・）。

少し値がはりますが、これらコンポーネントを自作するコストを考えると、
十分検討に値するコンポーネント集ではないかなぁと思います。

弊社が提供するアプリケーションには、mobiscrollなしでは成立しないほど恩恵をうけておりますｗ

ライセンスを購入すると、モジュールをダウンロードする専用ページへアクセスすることができ、
そちらからダウンロードしたモジュールを、所定のディレクトリへ配置することで、
Trialの文字透かしが消えるようになります。

`追記（2017/12/16）`

久しぶりに新規アプリで試してみましたが、支払いをしていないサンプルだと、
こんな風なfont-iconが差し込まれてしまうケースもあるようです。

<img width="334" alt="スクリーンショット 2017-12-16 12.17.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/34871/eb2daab9-de75-864a-d4b0-5270a824e254.png">



>The products can be downloaded from https://download.mobiscroll.com
>After downloading all you have to do is exchange the trial files with the licensed version.
Goのリバースプロキシーでレスポンスを書き換える

フューチャーアーキテクトアドベントカレンダーの5日目の[
サーバーサイドレンダリングの代替としてPrerenderを試してみた](https://qiita.com/shibukawa/items/e0f7cb6a3eb024689ad6)の最後で、「**Go実装について** 長くなったので説明は省略します。だれかがGoアドベントカレンダーを落としたら書くかも？」と書いていたら、早速落とす人がいたらしいので、ハイジャックします。

リバースプロキシーはnet/http/httputilパッケージの [ReverseProxy](https://golang.org/pkg/net/http/httputil/#ReverseProxy)を使えば簡単につくれますよ、という説明はよく見かけるのですが、レスポンスを書き換える方法はまとまった情報がなかったので紹介します。

# リクエストを書き換える

[go言語でリバースプロキシ](https://kido0617.github.io/go/2016-08-10-reverse-proxy/)というブログのエントリーにある通りです。

向き先を書き換える、Directorというフック関数を設定してあげることで、向き先を変えられます。なお、このエントリーにあるように、この関数の中でrequestを書き換えることでドメインごと入れ替えたりとかもできますし、試してはないですが、当然ヘッダーを足すとかもできるでしょう。

```go
	director := func(request *http.Request) {
		request.URL.Scheme = "http"
		request.URL.Host = ":9001"
	}
	rp := &httputil.ReverseProxy{Director: director}
	server := http.Server{
		Addr:    ":9000",
		Handler: rp,
	}
```

# レスポンスを書き換える

レスポンスを書き換えるフック関数も用意されています。``ModifyResponse``というフィールドにこの関数を設定します。

```go
modifier := func(res *http.Response) error {
	// 別途用意したheadless chromeの出力を分析したDOMのソース
	// を元に、goqueryを使ってレスポンスを書き換えたstring型のhtmlという
	// 変数を用意しています
	document, err := goquery.NewDocumentFromReader(res.Body)
	if err != nil {
		return err
	}
	:
	document.Find("head").AppendHtml(result.OGP)
	body := document.Find(route.BodySelector)
	body.SetHtml("")
	body.AppendHtml(result.InnerHTML)
	html, err := document.Html()
	if err != nil {
		return err
	}
	// ここからが汎用的なところで、この文字列を``io.ReadCloser``にして
	// res.Bodyを差し替えます
	b := []byte(html)
	res.Body = ioutil.NopCloser(bytes.NewReader(b))
	res.Header.Set("Content-Length", strconv.Itoa(len(b)))
	return nil
}

rp := &httputil.ReverseProxy{
	Director: director,
	ModifyResponse: modifier,
}
```

~~``[]byte``にしてから``bytes.NewReader``で初期化していたのは、``strings.NewReader``で良かった予感。
なお、内容を書き換える場合、``Content-Length``をわざわざ書き換えて上げる必要はありません。``Body``だけ置き換えればあとはhttputilパッケージが勝手にやってくれます。~~

追記: やっぱりContent-Length書き換え必要っぽい

-----

追記：github.com/elazarl/goproxyというのもあるらしい

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">GoでReverse Proxy、ぼくは <a href="https://t.co/Eit8Q803Te">https://t.co/Eit8Q803Te</a> ってやつを使って書いてます。もう4年くらい運用してる</p>&mdash; ( &#11;             ​‌‍‎‏　null) (@yuroyoro) <a href="https://twitter.com/yuroyoro/status/938453019657510912?ref_src=twsrc%5Etfw">December 6, 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
リストから和のリストを得る（累積和）

#はじめに
数値計算をしていると、積分のために総和を取ることはよくある。たとえば、物理でメッシュごとの電場のデータからポテンシャルを求めるには、総和を取ってメッシュ幅をかける。

リストAがあるとして、総和を取るだけなら```sum(A)```とすればよい。だが「リストAのi番目までの和からなるリスト」を得るにはどのようにすればよいだろうか。

今回はいくつか思いつく方法を試して実行時間を計測してみた。

##1.for文
多分これが一番すぐに思いつくと思う。

```python:
res[0] = mydata[0]
for i in range(len(mydata)-1):
    res[i+1] = res[i] + mydata[i+1]
```
##2.リスト内包表記
ちょっと~~調子に乗った~~Pythonの哲学を考えた人は「for文は使いたくない」と思うだろう。for文の回避に使う典型的なものといえばリスト内包表記だ。

```Python:
res = [sum(mydata[:i+1]) for i in range(len(mydata))]
```
ただし、少し考えてみればすぐわかるが、これは一番悪手になる。なぜなら<b>絶対的な計算量が増えるからだ</b>。i番目の要素を計算するたびにそこまでの足し算を行うので$\frac{1}{2}n(n+1)$回の足し算を行うことになってしまう。for文なら$n$回だ。mapとlambdaで処理するのも同じだ。

##3.再帰
for文を避ける方法はもう一つ、再帰を使うという方法がある。

```python
import sys
sys.setrecursionlimit(len(mydata)+10)
    
def step(myres,mymydata,i):
    if i == len(mymydata)-1:
        pass
    else:
        myres[i+1] = myres[i] + mymydata[i+1] 
        step(myres,mymydata,i+1)

step(res,mydata,0)
```
Pythonには無限ループに陥らないようにするため再帰の上限回数が定められており、デフォルトでは100回くらいで止まってしまう。そのため```sys.setrecursionlimit()```で上限回数を設定している。

確かにfor文は回避できたが、明らかにコードが複雑になる。

##4.NumPy.cumsum()
お察しかもしれないが、NumPyにはcumsumという関数がある。調べてから知ったのだが扱っているような演算を累積和というらしい。

```python
import numpy
res = numpy.cumsum(mydata)
```

#計測結果
以上を踏まえ、実行時間を計測してみた。
![DQX-dz0UMAASolz.jpg](https://qiita-image-store.s3.amazonaws.com/0/107045/ba03a928-be17-466b-13ef-72e54ec5ec52.jpeg)

###結果：NumPy.cumsum()の圧勝。Numpy.cumsumを使いましょう。

#計測に使ったコード
下記のgistまで。
https://gist.github.com/Bluepost59/85ce18cdfde26c31018ce018488ae07d
You Are Not Expected To Understand This

```
/*
 * You are not expected to understand this.
 */
```

> （直訳）君がこのコードを理解することは期待しない。

かつて[UNIX v6](https://ja.wikipedia.org/wiki/Version_6_Unix)ソースコードに存在した、[Dennis Ritchie](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%8B%E3%82%B9%E3%83%BB%E3%83%AA%E3%83%83%E3%83%81%E3%83%BC)氏の手による（不穏な香りのする）コメント。

不遜なニュアンスから広く知られるようになったためか、後に同氏による説明記事 "[Odd Comments and Strange Doings in Unix](https://www.bell-labs.com/usr/dmr/www/odd.html)" が公開されている。

- Wikipedia: [Lions' Commentary on UNIX 6th Edition, with Source Code](https://en.wikipedia.org/wiki/Lions%27_Commentary_on_UNIX_6th_Edition,_with_Source_Code)
- [私は如何にして心配するのを止めてUNIXカーネルを愛するようになったか](http://www.tom-yam.or.jp/2238/)
階層化された JSON を再帰的に読み込む

JSON は使いやすいフォーマットですが、近年何でも JSON フォーマットで表すため、階層化されて複雑な JSON データにでくわすことがあります。例えばこのような感じ。

```json
{
  "title" : "name",
  "map" : {
    "mtitle1" : "mval1",
    "mtitle2" : "mval2"
  },
  "mid title" : "mvalue",
  "array" : [
    {"atitle1": "aval1", "atitle2": "aval2"},
    {"btitle1": "bval1", "btitle2": "bval2"}
  ],
  "end title" : "evalue"
}
```

このように、連想配列や通常の配列が混在していると、読み込むにはひと手間かかります。そこで、再帰的に一気に読み込みたいと思い、下記のようなコードを作成。

```js
function plotres(response, prefix) {
  for (var key in response){
    if (typeof response[key] == "object") {
      if(Array.isArray(response[key])) {
        // 配列の場合は forEach で要素ごとにに再帰呼び出し
        response[key].forEach(function(item){
          plotres(item, prefix+" "+key) ;
        });
      } else {
        // 連想配列はそのまま再帰呼び出し
        plotres(response[key], prefix+" "+key) ;
      }  
    } else {
      // 配列や連想配列でなければキーの値を表示
      console.log(prefix+" "+key+": "+response[key]);
    }
  }
}
```

階層化されるごとに、その前の key をスペースで表示するようにしています。下記が実行結果。

```
> plotres(res, "")
 title: name
 map mtitle1: mval1
 map mtitle2: mval2
 mid title: mvalue
 array atitle1: aval1
 array atitle2: aval2
 array btitle1: bval1
 array btitle2: bval2
 end title: evalue
```

うまく再帰的に読み込むことができました。
Tips:  ReactNativeのアプリを 複数の端末のシミュレータで同時に確認しながら開発する(iOS)

※とても短い記事です

### 問題意識
iPad等、6:4の画面で崩れているとiosはリジェクトされるし、Androidも崩れる。
でも、ファイルを分けたり、いちいち条件分岐もできるだけ避けたい。
いい感じになるように両方実装したいが確認が面倒
　↓
一度に2画面で見れないか。。

### やってみた
`react-native run-ios`で一つ起動
xcodeから違う機種で一つ起動

　↓　

できた
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206623/cdd71b88-23a2-198b-782a-4e0aa0325f32.png)

両方hot reloadしておくと一気に見れる。

シミュレータが起動して、アプリがinstallできればいいだけなのでメモリとCPUが許せばもっとたくさん(iPhoneXもみたいですし)立ち上げられるかも。

### 失敗
react-native run-ios --simulator="iPad Air2"
だと、すでに起動してるシミュレータがある場合新しくは起動しないよう
Dockerを使ったD言語のワンライナービルド

# はじめに

シェル芸はロマンです。
Dockerを使ってワンライナーで環境を汚さずにD言語のプロジェクトをビルドする方法を紹介します。

# TL;DR

[d-mansay](https://github.com/simdnyan/d-mansay) で試します。

```shell-session
$ ls -1a
.
..
.dub
.git
.gitignore
README.md
dub.json
dub.selections.json
source
```

```shell-session
$ docker run --rm -v $PWD:/src -w /src dlanguage/dmd:latest dub -- ワンライナーだよ
Fetching east_asian_width 1.0.0 (getting selected version)...
Performing "debug" build using dmd for x86_64.
east_asian_width 1.0.0: building configuration "library"...
d-mansay ~master: building configuration "say"...
Linking...
Running ./d-mansay ワンライナーだよ
 __________________
< ワンライナーだよ >
 ------------------
    \    _   _
     \  (_) (_)
       /______ \
       \\(O(O \/
        | | | |
        | |_| |
       /______/
         <   >
        (_) (_)
```

```shell-session
$ ls -1a
.
..
.dub
.git
.gitignore
README.md
d-mansay
dub.json
dub.selections.json
source
$ ./d-mansay Ubuntuだよ
 ____________
< Ubuntuだよ >
 ------------
    \    _   _
     \  (_) (_)
       /______ \
       \\(O(O \/
        | | | |
        | |_| |
       /______/
         <   >
        (_) (_)

```

バイナリが出力されます。
ビルドに使ったコンテナと同じアーキテクチャであればそのまま実行できます。

# 注意点

* 出力されるバイナリのパーミッションはコンテナのユーザーに依存します。
* 依存関係がないプロジェクト前提です。[dmanbot](https://github.com/simdnyan/dmanbot)は以下のようにビルドできません。

```
$ docker run --rm -it -v `pwd`:/src -w /src dlanguage/dmd:latest dub build
Fetching dyaml 0.6.3 (getting selected version)...
Fetching tinyendian 0.1.2 (getting selected version)...
Fetching twitter4d 0.0.70 (getting selected version)...
Fetching mysql-d 0.3.3 (getting selected version)...
Fetching dunit 1.0.12 (getting selected version)...
Performing "debug" build using dmd for x86_64.
tinyendian 0.1.2: building configuration "library"...
dyaml 0.6.3: building configuration "library"...
mysql-d 0.3.3: building configuration "mysql-d"...
twitter4d 0.0.70: building configuration "library"...
dmanbot ~master: building configuration "application"...
Linking...
/usr/bin/ld: cannot find -lmysqlclient
/usr/bin/ld: cannot find -lcurl
collect2: error: ld returned 1 exit status
Error: linker exited with status 1
dmd failed with exit code 1.
```

# おまけ

宗教上の理由等でGoをインストールしていない環境でも、`go get`を使ってバイナリを取得できます。

```shell-session
$ docker run --rm -v ~/bin:/go/bin golang:1.9.2-stretch go get github.com/adamryman/gophersay
$ gophersay
 ------------------------
Don't panic.
 ------------------------
   \
    \
     \   ,_---~~~~~----._
  _,,_,*^____      _____``*g*\"*,
 / __/ /'     ^.  /      \ ^@q   f
[  @f | @))    |  | @))   l  0 _/
 \`/   \~____ / __ \_____/    \
  |           _l__l_           I
  }          [______]           I
  ]            | | |            |
  ]             ~ ~             |
  |                            |
   |                           |

```