OmniAICreator/Qiita-1.07M huggingface dataset:
nestjsのモジュール定義を少し楽にする

AngularやNestJSのモジュール定義をする際、たくさんのクラスをインポートして、ProviderやImportに登録する場合があると思う。フォルダ構成次第だが、これを楽をする方法がある。

#フォルダ構成
一般的かは分からないが、コントローラ・エンティティ・サービスごとにフォルダを分け、それぞれの`index.ts`の中で同種のクラス定義をまとめてexportするフォルダ構成にしてみる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296170/eba49ece-f56d-682f-0ddb-9564fe45c6ba.png)

各フォルダの`index.ts`は以下のようになる。

```typescript:controllers/index.ts
export * from './location.controller';
export * from './item.controller';
```
#モジュール定義
上記のフォルダ構成の場合、`import * as Services from './services'`と書いただけで、`Services`は`ItemService`, `LocationService`というメンバに、それぞれのクラス定義=Function型が格納される(ソースは省略)。これを、`ToArray`関数により配列化すれば、モジュール定義に使用することができる。

対象のエンティティやサービスが増えても、コードを変える必要がなくなるので少し楽ができる。

また、エンティティの配列は後で使いたいので、モジュールの静的メンバとして持っておく。

```typescript:controllers/index.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

import * as Services from './services';
import * as Entities from './entities';
import * as Controllers from './controllers';

function ToArray( obj: Object ) {
    return Object.keys( obj ).map( key => obj[key] );
}

const EntityArray = ToArray( Entities );

@Module( {
    imports: [ TypeOrmModule.forFeature( EntityArray ) ],
    providers: ToArray( Services ),
    controllers: ToArray( Controllers ),
} )
export class InventryModule {
    static readonly Entities = EntityArray;
}
```
ToArrayの元ネタ: [Javascript, Converting an Object to an Array of Objects.](https://medium.com/chrisburgin/javascript-converting-an-object-to-an-array-94b030a1604c)

# データベースの定義に使う
NestJSのTypeOrmModuleでは、forRootにてデータベースで扱うエンティティを指定する必要がある。[ワイルドカード付きのファイルパスで指定することもできる]
(https://qiita.com/stm32p103/items/4cb0f352042cd856a12e)が、先ほど用意した`InventryModule.Entities`静的メンバを使えば以下のように書ける。これなら、ファイルを移動しても影響がないはず。

```typescript:app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { InventryModule } from './inventry';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
    imports: [ 
        TypeOrmModule.forRoot( {
            type: 'sqlite',
            database: 'db/sqlite.db',
            synchronize: true,
            entities: [ ...InventryModule.Entities ]
        } ), InventryModule
    ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
```
3Dモデルの影を別の影に差し替える

ブログからの転載です。https://raspberly.hateblo.jp/entry/2018/12/02/000000

この記事はUnity #2 Advent Calendar 2018 2日目の記事です。
今回はオブジェクトの影を差し替える方法を紹介します。

影を差し替えることによって、怪物が人間に擬態しているとか、あるモノが別のモノに変身しているといった演出ができちゃいます。


 
## 1. そもそも影はどうやってできているのか

基本的に、光(Directional Light等)があれば影は自動でできます。
![shadow01-2.gif](https://qiita-image-store.s3.amazonaws.com/0/309599/a72db225-0da3-2f0a-d411-3fd5da4d2f8e.gif)




3Dモデルを表示(レンダリング)するには〇〇Rendererみたいなものが必要です。
そのため、Cubeやキャラクターの3Dモデルには必ず何らかのRendererがくっついています。
![shadow02.png](https://qiita-image-store.s3.amazonaws.com/0/309599/e6a7b713-ff8c-9cbe-6462-81c5e9027f5a.png)

 

まずはCubeを見てみましょう。
Mesh rendererがくっついているのがわかります。
![shadow05.png](https://qiita-image-store.s3.amazonaws.com/0/309599/b9fefddb-634b-0a59-78fb-a93e54266a8c.png)
 



ではユニティちゃんはどうなっているのでしょうか。中を見てみましょう。
モデルの部分は「constume...」と「UTC_eye」と「UTC_hair」になります。
![shadow03.png](https://qiita-image-store.s3.amazonaws.com/0/309599/2741bfeb-7de2-4afb-3b49-23c6958e8f21.png)



Inspectorを見てみると、Skinned Mesh Renderがあるのがわかります。
![shadow04.png](https://qiita-image-store.s3.amazonaws.com/0/309599/c8cdb57a-12ba-d64c-9332-34e189cc64bc.png)



UnityChanの場合、メッシュが3つに分かれているのでRendererも3つあります。

 

 
## 2. 影のオンオフ

 Rendererが影を作ってくれていることがわかりました。
では影だけを消すことはできるんでしょうか？
実は簡単にできます。

 

各RendererにあるCast ShadowsをOffにするだけです。
![shadow06.gif](https://qiita-image-store.s3.amazonaws.com/0/309599/f19af0a8-5d61-f7c0-b008-582ed50a4f15.gif)

 

 
## 3. ニセモノの影

影のオンオフまでできました、この時点で感づいている方もいるかもしれませんが。
本体の影を消し、影用のオブジェクトを用意することで影の差し替えを行います。

 

今回は影用として、このAssetを用いました。
ホラーちゃんと名付けます。
https://assetstore.unity.com/packages/3d/characters/humanoids/true-horror-scarecrow-pbr-47871


このAssetをユニティちゃんの子オブジェクトにします。位置や角度も合わせておきましょう。
当然、二つのモデルが重なった状態で表示されますね。
![shadow07.png](https://qiita-image-store.s3.amazonaws.com/0/309599/156e772e-bece-a643-0d8f-1acef152b483.png)
![shadow08.png](https://qiita-image-store.s3.amazonaws.com/0/309599/c47782cf-3fd5-72cf-60d0-a9d69d3b6965.png)



 次にユニティちゃんの影を消していきます。
ユニティちゃんの中にある3つのRendererのCastShadowsをOffにします。
![shadow09.png](https://qiita-image-store.s3.amazonaws.com/0/309599/63e89692-3d5c-617d-b453-3836f6270127.png)
![shadow10.png](https://qiita-image-store.s3.amazonaws.com/0/309599/914ef8b8-734c-f462-347b-aecbd2c2aa2b.png)


 

するとUnityChanの影が消え、ホラーちゃんの影のみになります。
![shadow11.png](https://qiita-image-store.s3.amazonaws.com/0/309599/e1fc101e-71c1-4ee6-a83f-2f41df896567.png)


 

後はホラーちゃんの影のみ表示させれば完成です。
3Dモデルは表示させず、影のみ表示といったことができるのでしょうか？
実は簡単にできます。

Cast ShadowsをShadows Onlyにすることで、影のみレンダリングといったことができます。Unity便利すぎ
![shadow12.png](https://qiita-image-store.s3.amazonaws.com/0/309599/26c7faa4-981a-9129-43f4-76245bfd3202.png)


 

 

これで無事影の差し替え完了しました。
![shadow13.png](https://qiita-image-store.s3.amazonaws.com/0/309599/e369ba00-ad28-5b91-7564-79213068d30b.png)



 

 

「やあユニティちゃん・・・・・いや、誰だお前はユニティちゃんじゃないな！」
？？？「グググ・・・ヨク気ヅイタナ・・・」
![shadow14-2.gif](https://qiita-image-store.s3.amazonaws.com/0/309599/86954d88-ceaa-2768-edef-a64258a69fed.gif)


みたいな演出ができるかもしれませんね！

 

 

 
## まとめ

・影は初期設定でRendererが勝手にやってくれている。
・Rendererの設定を変えることで影のオンオフを切り替えることができる。
・本体の影を消し、影用のモデルを用意することで簡単に影を差し替えることができる。

明日はUnity #2 Advent Calendar 2018 3日目 Kan_Kikuchiさんです。
gitリポジトリ内に完全に別のgitリポジトリを作りたい

すんごい小ネタ。

[サブモジュール](https://qiita.com/aki_55p/items/ed3f1d77b3a7235c8bec)とか[--subdirectory-filter](https://qiita.com/yasano/items/f9248eb99850a872b0a8)とかは出てくるんだけど、ちゃうねん、単に完全に一切全く無関係の別のリポジトリが作りたいだけなんだよ。

という問題に何故か直球の答えが見つからなかったのでここに書いておく。
簡単すぎて常識だから逆に誰も書いてないのかもしれない。


# 手順

元々外側のリポジトリがあって、そこに別のリポジトリ`path/to/otherproject/`を作りたいとする。

## 外側のリポジトリ

まず外側のリポジトリから見えなくするために.gitignoreを書く。

```
/path/to/otherproject/
```

もし既に外側のリポジトリに入ってしまっているようなら、リポジトリから削除する。

```
git rm -r --cached path/to/otherproject
```

`--cached`を入れるとリポジトリから消すだけでファイルは残る。入れなければファイルごと削除。

## 内側のリポジトリ

単に`git init`するだけ。

```
cd path/to/otherproject
git init
```

その後はotherprojectディレクトリ内であればotherprojectのgitを見るし、ディレクトリ外では外側のリポジトリを使えるようになる。
めでたしめでたし。

# その他

`.gitignore`を書かなければ、外側のリポジトリが内側のリポジトリを自動的にサブモジュールとして扱ってくれるみたい。


# 感想

そもそもgitリポジトリ内に全く別のリポジトリを作るという運用を見直したほうがいいという意見には賛成。
Scalaではじめて知ったイディオム(途中)


Udemyのこのコースを見てて初めて知ったイディオムのまとめ。
 [Rock the JVM! Advanced Scala and Functional Programming](https://www.udemy.com/advanced-scala/)

コースは英語ですが、講師のダニエルさんの発音がはっきりしているのと、英語がわからくても、内容はコードと雰囲気で伝わってくるので、非常にわかりやすいです。

## シンタックスシュガー

### Infix generic types

型が2つのとき。

```scala
class Compose[A, B]
val compose: Int Compose String = ???

trait <[A,　B]
val lessThan: Love < Peace = ???
```

### Method nameing

```scala
class Teen {
  def `and then said`(message: String) = ???
}
val mike = new Teen
mike `and then said` "funny name!"
```

## パターンマッチ

### own patterns

```scala
  class Person(val name: String, val age: Int)

  object Person {
    // own patterns
    def unapply(person: Person): Option[(String, Int)] =
      if (person.age < 21) None
      else Some((person.name, person.age))

    def unapply(age: Int): Option[String] =
      Some(if (age < 21) "minor" else "major")
  }

  val bob = new Person("Bob", 25)
  val greeting = bob match {
    case Person(name, age) => s"Hi, my name is $name and I am $age yo."
  }

  println(greeting)


  val legalStatus = bob.age match {
    case Person(status) => s"My legal status is $status"
  }
  println(legalStatus)
```

### objectにマッチ式を切り出す。

もともとのコード。
`case`の各パターンマッチが複雑になると見づらい。

```scala
val n: Int = 45
val mathProperty = n match {
  case x if x < 10 && x > -10 => "single digit"
  case x if x % 2 == 0 => "an even number"
  case _ => "no property"
}

println(mathProperty)
```

パターンマッチの条件式を`object`にして外出しできる。

```scala
object even {
  def unapply(arg: Int): Option[Boolean] =
    if (arg % 2 ==0) Some(true)
    else None
}

object singleDigit {
  def unapply(arg: Int): Option[Boolean] =
    if (arg > -10 && arg < 10) Some(true)
    else None
}

val n: Int = 45
val mathProperty = n match {
  case singleDigit(_) => "single digit"
  case even(_) => "an even number"
  case _ => "no property"
}

println(mathProperty)
```

以下のようにも書ける。

```scala
object even {
  def unapply(arg: Int): Boolean = arg % 2 ==0
}

object singleDigit {
  def unapply(arg: Int): Boolean = arg > -10 && arg < 10
}

val n: Int = 45
val mathProperty = n match {
  case singleDigit() => "single digit"
  case even() => "an even number"
  case _ => "no property"
}

println(mathProperty)
```

### infix typeを使う

```scala
case class Or[A, B](a: A, b: B)

val either = Or(2, "two")
```

普通のパターンマッチ

```scala
val humanDescription = either match {
  case Or(number, string) => s"$number is written as $string"
}
```

`infix type`でパターンマッチすると自然な感じになる。

```scala
val humanDescription = either match {
  case number Or string => s"$number is written as $string"
}
```

### custom return type unapply

Wrapperを定義しておいて`isEmpty`と`get`メソッドをオーバーライドしてパターンマッチする方法。
仕組みが難しくてよくわからない..
あんまり使うことはなさそう。

```scala
case class Person(name: String, age: Int)

trait Wrapper[T] {
  def isEmpty: Boolean
  def get: T
}

object PersonWrapper {
  def unapply(person: Person): Wrapper[String] = new Wrapper[String] {
    override def isEmpty: Boolean = false
    override def get: String = person.name
  }
}

println(
  bob match {
    case PersonWrapper(name) => s"This person's name is $name"
    case _ => "An alien"
  }
)
```
Sourcetreeの Invalid username or password の対策

#Sourcetreeの Invalid username or password エラーの解決

##困った内容
新しい職場でSourcetreeのセッティングをしたがプルとフェッチができなかった

##調べて試したこと
- Gitバージョンアップ
- configの再設定設定
- ユーザーネームとパスワードの設定


**どれもうまくいかず…**



#自分はこれで直った↓

##１、Sourcetreeメニューの環境設定

![ソースツリー１.png](https://qiita-image-store.s3.amazonaws.com/0/199085/45a8452a-d557-7fcf-cd06-4b02e9e11ac3.png)



##２、高度な設定を選択

![ソースツリー２.png](https://qiita-image-store.s3.amazonaws.com/0/199085/11c737cc-83fe-dd3e-128c-7a75bfebb66e.png)


##３、バックログのホスト名・ユーザ名を削除。

![スクリーンショット 2018-12-02 0.29.47（2）.png](https://qiita-image-store.s3.amazonaws.com/0/199085/05dc3364-4412-1e36-7476-d8e3e3dfae2f.png)


##４、その後Sourcetree再起動

##５、再起動後にユーザ名とパスワード入力

##結果
**無事リモートからプルできるようになりました！**
Pythonで接続エラーなどのテスト用のダミーWebサーバを作る


SimpleHTTPRequestHandlerを使うと、現在のディレクトリ以下のファイルを返す簡易Webサーバが作れます。
`do_GET`をオーバーライドすることで、ふるまいを簡単に変更できます。
`do_POST`を定義すれば、POSTメソッドも模擬できます。


python2とpython3のどちらでも動く簡単な実装は以下のとおりです。

```dummy_server.py
try:
    # python3
    from http.server import HTTPServer, SimpleHTTPRequestHandler
except:
    # python2
    from SimpleHTTPServer import SimpleHTTPRequestHandler
    from BaseHTTPServer import HTTPServer


class RequestHandler(SimpleHTTPRequestHandler, object):
    def print_info(self):
        self.log_message("%s %s\n%s", self.command, self.path, self.headers)

    def do_GET(self):
        self.print_info()
        super(RequestHandler, self).do_GET()

    def do_POST(self):
        self.do_GET()


httpd = HTTPServer(("", 8000), RequestHandler)
httpd.serve_forever()

```

## ルーティング、コネクション切断、タイムアウトなど

様々なふるまいの変更を簡単にできます。

* ルーティング的なことをするには`self.path`を書き換えることでできます
* コネクションの切断・キャンセルを模擬するには途中でreturnするなどで
* 応答時間を長くする（タイムアウトのテストなど）にはsleepで待つなど

```dummy_server.py
    def do_GET(self):
        self.print_info()

        if self.path == "/test":
            self.path = "/dummy_server.py"
        elif self.path == "/test2":
            return
        else:
            from time import sleep
            sleep(5)

        super(RequestHandler, self).do_GET()
```

## 2回に1回エラー、はじめの2回はエラーなどの制御

リトライ実行で成功するパターンなどのテストにも使えます。

```dummy_server.py
from itertools import chain, repeat
from time import sleep

try:
    # python3
    from http.server import HTTPServer, SimpleHTTPRequestHandler
except:
    # python2
    from SimpleHTTPServer import SimpleHTTPRequestHandler
    from BaseHTTPServer import HTTPServer


def close():
    return True, None


def wait(time_seconds, path=None):
    def f():
        sleep(time_seconds)
        return False, path

    return f


def page(path):
    return wait(0, path)


path_map = {
    "/test": chain([close, wait(3, "/dummy_server.py"), None, page("/dummy_server.py")]),
    "/test2": (x for seq in repeat((close, page("/dummy_server.py"))) for x in seq),
    "/dummy_server.py": chain([close, close, wait(1)], repeat(None))
}


class RequestHandler(SimpleHTTPRequestHandler, object):
    def print_info(self):
        self.log_message("%s %s\n%s", self.command, self.path, self.headers)

    def do_GET(self):
        self.print_info()

        iterator = path_map.get(self.path)
        if iterator:
            f = next(iterator, None)
            if f:
                ret, path = f()
                if ret:
                    return
                if path:
                    self.path = path

        super(RequestHandler, self).do_GET()

    def do_POST(self):
        self.do_GET()


httpd = HTTPServer(("", 8000), RequestHandler)
httpd.serve_forever()

```
超初心者向け。ディープラーニングと機械学習の違い

## 狙い
　本記事はプログラミングを始めたばかりの初心者や、機械学習とか興味あるけどイメージすら湧かない、くらいの方を対象にディープラーニングと機械学習の大まかなイメージだけでも掴んでいただこうと思い書いた記事です。詳細というよりは、二つが似た者同士の親戚であるというイメージのみを伝えようといった内容です。


## 両者の共通点

大きく分けると「あらゆるパターン学習させる」と「学習済みのものを使う」二つのフェーズがあります。
その二つについて話します！（分類器を例に）

###　学習
まず学習させることで猫の特徴などを覚えさせ、猫の画像を見たら「これは猫だ！」と判別できるようにします。
他にも犬や猿などあらゆる動物の画像をサンプルとして与え、正しく分類できるようにします。

<img width="883" alt="3250d6969e40c64be0bf4e71dfdfde4b.png" src="https://qiita-image-store.s3.amazonaws.com/0/308284/843d670d-0117-f89d-b370-ef17505a32b8.png">

###　使用
こうして行われた学習後に適当な動物画像を与えるとその動物がなんなのかを９０％とかで正解できるようになる！っていうのが機械学習、ディープラーニングです。

## ディープラーニングと機械学習の違い

　両者の概要については上の画像のイメージです。
　では違いは一体なんなのか。
<img width="837" alt="60433bff0729b2fe1e035334d25427b4.png" src="https://qiita-image-store.s3.amazonaws.com/0/308284/540a91c2-862e-48e4-5847-d801e78d24a8.png">
　この部分が違います！~~ほとんど全部じゃんw~~
　できることは同じなのに、どんな具合に違うのだろう　といったことを雑くチェックしていきます。

　人間がその生き物を猫と判定するまでには、輪郭や鼻、耳などから判断すると思います。

###　じゃあ、機械はどうやって判断するの？

ここに機械学習とディープラーニングの違いがあります。

<img width="852" alt="11da552bbfd601434ffb474536de81a1.png" src="https://qiita-image-store.s3.amazonaws.com/0/308284/a496fe50-9589-9504-d845-aab6715c27d6.png">

<img width="832" alt="624752b44ab8249ab7b01eb3378b8060.png" src="https://qiita-image-store.s3.amazonaws.com/0/308284/866059d8-d0b3-68f5-a203-e730ab4f378a.png">

　この`ブラックボックスの大きさ`の違いが両者の違いなのです。

###　つまり？
　知っている人もいるかもしれないですが、機械学習は英語でマシーンラーニングといい、ディープラーニングはその仲間なのです。
　ディープラーニングをやりたいと思ったら機械学習から入っても遠回りではありません。

###　他に違いは？

　学習方法、適応範囲など様々な違いはあります。でもこの流行りの二つの言葉は親戚であることに変わりはありません。一つを学んで見たら、もう一つも理解できてきたりします。



## あとがき
　ディープラーニングを学ぶために必要な知識が多すぎたり、「ディープラーニングとは？」とか調べるとかなり難しい記事しか出てこなくて、初学者を遠ざけてる感があったので多少雑にでも解説するサイトも必要なのでは？と思いこの記事を投稿いたしました。
　入門、初心者向けでも結局文量が膨大になってしまうのがこの分野なので、噛み砕いて極力文量を減らせるように意識しました。
　もちろんしっかりと理解するためにはそれなりの時間、努力が必要であって最後まで理解させようと思って記事を書こうものなら既存のサイトと同じ長い文になるでしょう。そこに踏み込む前の軽いストレッチ的な役を担えればいいなと思います。→これが十分な説明を果たしているわけではないので興味を持っていただけた方はもっと調べて見てください！
今回の説明は分類器というものを例にしていて、他にも色々あります！
自宅のルーターのWAN側のパケットをモニタ出来るようにしてみた

# 概要

ISP業者が設置した自宅のインターネット接続のWAN側機器の調子が悪かった。
ISP業者がなかなか対応してくれないので、自分でWAN側のパケットや状況を調査して連絡したら、やっと直してくれた。

パケットを調査すると言っても、Raspberry Pi3 (以後RasPi3と略す)と昔使っていたノンインテリジェンスのL2スイッチを組み合わせた簡易システムだったので、ブロードキャストパケットしか見られなかった。

調査結果を伝えたらISP側が動いて修理は完了した。

しかし、今回のトラブルをきっかけにWAN側のパケットキャプチャに興味が沸き、かつブロードキャストだけじゃ物足りなくなったので、ミラーポートの付いたL2アンマネージプラススイッチ(<A HREF_@http://amzn.asia/d/64rEDJH@>NETGEAR GS105E-200JPS</A>)を買って、全パケットをモニタ出来るようにしてみた。

覚書的に設定の概要とtcpdumpのコマンドラインなどをここに控えておく。

# 接続
通常

(宅内LAN)--[ルータ]--[WAN側機器(VDSLモデム)]--(インターネット)

という構成でつなぐところ、

(宅内LAN)--[ルータ]--[ネットワークスイッチ]--[WAN側機器(VDSLモデム)]--(インターネット)
　  ↑-(WiFi)--[RasPi3]--(Ether)--↑

のようにつなぐ。

この時、RasPi3とネットワークスイッチは固定IPアドレスとし、DHCPを殺しておく。
これは、ISP側からDHCPアドレスは1つしか割り当てられないので、この２つの機器でDHCPが有効になっているとルータにアドレスが割り振られなくなってしまうからである。

# 固定アドレス指定
ネットワークスイッチは、あらかじめWeb経由のGUIで固定IPアドレスやDHCPアドレスを無効化するなどしておく,く、また、ミラーポートの設定を行い、RasPi3に接続するポートからモデム-WAN側機器の間の通信が見えるように設定しておく。

RasPi3(Raspbian stretch)ではファイル/etc/dhcpcd.confに以下の行を追加。
念のため一度再起動。

```
ipv4only
interface eth0
static ip_address=192.168.0.254/24
```

# tcpdumpコマンドライン例
以下、XX.XX.XX.XXはルータが取得したWAN側のアドレスとする。

- <H3> 全パケット</H3>

```
sudo tcpdump -i eth0
```

- <H3> ブロードキャスト</H3>

```
sudo tcpdump -i eth0 broadcast
```
WAN側のルータから、盛んにARPパケットが飛んできている様子が見えた。

- <H3> ルータを出入りする全パケット</H3>

```
sudo tcpdump -i eth0 host　XX.XX.XX.XX
```

- <H3> 外部へのTCP接続要求</H3>

```
sudo tcpdump -i eth0 src host XX.XX.XX.XX and '(tcp[tcpflags] & tcp-syn)' != 0
```


- <H3> ルータへのTCP接続要求</H3>

```
sudo tcpdump -i eth0 dst host XX.XX.XX.XX and '(tcp[tcpflags] & tcp-syn)' != 0
```
ポートスキャンされているのが分かる。

# 感想
 やっぱりL3スイッチにして、いろいろフィルタリングするようにしたらよかったかな....
Rails5で住所情報をもとにGoogleMapを表示する

# はじめに
GoogleMap用途などで、住所を属性に持つモデルに対して緯度・経度を登録する場合は`geocoder`でスムーズに情報取得ができます。
ですが、上記のように動的にGoogleMapを描画する場合、APIキーの取得が必要です。
下記手順に沿ってAPIキーを取得しましょう。

[APIの取得はこちらから（2018年12月現在）](https://developers.google.com/maps/documentation/javascript/get-api-key)

<img width="898" alt="スクリーンショット 2018-12-01 23.50.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/121435/64820a2f-22dd-b5f1-48d1-6435ba9deeab.png">

`GET STARTED`のボタンを押し、APIキーの取得を行います。
クレジットカードの登録を済ませる必要があるため、事前にカード情報を用意しておきましょう。

# gem 'geocoder' のインストール

```ruby:Gemfile
gem 'geocoder'
```
Gemfileに追記したら、 `bundle install` でGemをインストールします。


# テーブルに変更を加える

## カラムを追加
Storeモデルに住所(address), 緯度(latitude), 経度(longitude)を追加

```console
$ rails g migration AddColumnToStore address:string latitude:float longitude:float
```

# モデルに緯度と経度を算出する処理を記述
store.rb に以下のコードを記述する。

```ruby:store.rb
class Store < ApplicationRecord
 geocoded_by :address
 after_validation :geocode
 # これで、モデル登録時と住所(address)変更時にgeocoderにより、緯度・経度のデータが登録・更新される。
end
```

# 登録フォーム用にコントローラーを用意

```ruby:stores_controller.rb
class StoresController < ApplicationController
  def new
    @store = Store.new
  end

  def create
    @store = Store.new(store_params)
    if @store.save
      redirect_to root_path, notice: '作成しました'
    else
      render :new
    end
  end

  private

  def store_params
    params.require(:store).permit(:address, :latitude, :longitude)
  end
end
```

# フォームを追加する

```views/stores/new.html.slim
= form_with model: @store, local: true do |f|
  = f.label :address
  = f.text_field :address
  = f.submit '投稿する', data: { disable_with: '投稿中..' }
```

# 表示用のビューを記述


```ruby:views/stores/show.html.slim

#  中略
div id='map' style='height: 300px; width: 90%;'

= javascript_include_tag src="https://maps.googleapis.com/maps/api/js?v=3.exp&key=取得したAPI_KEY&callback=initMap", async: true, defer: true

javascript:
  function initMap() {
    var test ={ lat: #{@store.latitude}, lng: #{@store.longitude} };
    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 15,
      center: test
    });
    var transitLayer = new google.maps.TransitLayer();
    transitLayer.setMap(map);

    var contentString = "住所：#{@store.address} ";
    var infowindow = new google.maps.InfoWindow({
      content: contentString
    });

    var marker = new google.maps.Marker({
      position:test,
      map: map,
      title: contentString
    });

    marker.addListener('click', function() {
      infowindow.open(map, marker);
    });
  }
```

# 実際の表示

インフォウィンドウやマーカーは改良の余地がありそうなので、調査結果をさらに追記しようと思います。

<img width="710" alt="スクリーンショット 2018-12-02 0.05.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/121435/750335fb-bc7a-1edd-60d5-45a099240901.png">



# 参考
[Using Google Maps API (v3) with Rails (5.2)](https://medium.com/@pjbelo/using-google-maps-api-v3-with-rails-5-2-b066a4b2cf14)
特異値分解・LU分解・コレスキー分解

# はじめに
正方行列でない行列に対しても固有値のような性質を利用したい場合があります。そのときは特異値分解を行い、特異値を使用します。
他には、行列の計算量を減らすために、行列を分解する場合があります。

# 参考
- 高校数学の美しい物語『特異値分解の定義，性質，具体例』，https://mathtrain.jp/svd
- 東條遼平，『LU分解』，http://hooktail.org/computer/index.php?LU%CA%AC%B2%F2
- SAM猫，『非負値行列因子分解（NMF）によるレコメンドのちょっとした例』，http://smrmkt.hatenablog.jp/entry/2014/08/23/211555

# 手順
## 特異値分解
$A$を$(m,n)$行列とします。$U$は$AA^\dagger$の固有ベクトルを列に並べた$(m,m)$ユニタリ行列です。$V$は$A^\dagger A$の固有ベクトルを列に並べた$(n,n)$ユニタリ行列です。$\Sigma$は特異値を大きさ順に対角に並べた$(m,n)$行列です。

```math
A = U \Sigma V^\dagger
```

これらは`sp.linalg.svd`で求めることができます。
戻り値のUは左特異ベクトルを列にもつユニタリ行列、sは特異値、Vhは右特異ベクトルを行に持つユニタリ行列です。なのでVhは上の$V^\dagger$に相当します。

```python
from scipy import linalg

A = np.array([[3,6,1,8],
              [6,2,1,1],
              [7,8,2,2]])

U, s, Vh = sp.linalg.svd(A)
m, n = A.shape

S = sp.linalg.diagsvd(s,m,n)

print(U@S@Vh)

# array([[3., 6., 1., 8.],
#        [6., 2., 1., 1.],
#        [7., 8., 2., 2.]])
``` 

# LU分解
$A$を正方行列として、連立方程式$y = Ax$を解くことを考えます。$A$を下三角行列$L$と上三角行列$U$に$A = LU$と分解することで、連立方程式を解きやすくします。

数値計算では計算の安定性のために、行列の要素を並び替える置換行列$P$を用いて$A=PLU$とします。

```python
A = np.array([[6, 4, 1],
              [1, 8, -2],
              [3, 2, 0]])
b = np.array([7, 6, 8])

# 正方行列をPLU分解する
(LU,piv) = linalg.lu_factor(A)
P, L, U = linalg.lu(A)

# 解を求める
x = linalg.lu_solve((LU,piv),b)

print('解:',x)
print(P@L@U)

# 解: [ 4. -2. -9.]
```

## コレスキー分解
Aが正定値エルミート行列のときは、$A=LL^\dagger$と下三角行列$L$を用いて分解することで、さらに高速に計算できます。

```python
A = np.array([[6, 4, 1],
              [4, 8, 2],
              [1, 2, 1]])
b = np.array([7, 6, 8])

L = linalg.cholesky(A)

t = linalg.solve(L, b)
x = linalg.solve(L.T.conj(), t)

print(x)
# 解: [ 0.45955989 -0.42470278 16.08144135]
```

## 非負値行列因子分解
ある行列AをA≒WHと近似した時に、その近似後の行列W、Hの要素が全部正になるようなもので分解する手法です。

```python
from sklearn.decomposition import NMF

A = np.array([[1,1,1],
              [2,2,2],
              [3,3,3],
              [4,4,4]])

model = NMF(n_components=3, init='random', random_state=0)

W = model.fit_transform(A)
H = model.components_

W # 4行、n_components列の形になる。
# array([[0.08704015, 0.15523454, 0.74630123],
#       [0.88812181, 0.40340471, 0.01531961],
#       [0.48961523, 1.34083547, 0.        ],
#       [1.16745373, 1.07765565, 0.55878315]])

H # n_components行、3列の形になる。
# array([[1.46415955, 1.46434578, 1.465027  ],
#        [1.70285176, 1.70273674, 1.70231602],
#        [0.81509515, 0.81503439, 0.81481215]])

W@H
array([[1.0000886 , 1.00004161, 0.99986973],
       [1.99977738, 1.99989545, 2.00032733],
       [3.00011886, 3.00005582, 2.99982524],
       [3.99988777, 3.99994729, 4.00016501]])

```
Arrays.asList(T... a) は、なぜ add や remove ができないのか？

（この記事は [地平線に行く](http://d.hatena.ne.jp/chiheisen/20181205/1545666250) とのマルチポストです）

`Arrays.asList(T... a)` というメソッドについてググると、「このメソッドで返ってくる `List` は、`add` や `remove` ができないので注意しましょう」ということが良く書かれています。
でも、「なぜできないのか？」という点については書かれていないことが多いので、理由を説明します。

一言でまとめると<font color="red">「配列を `List` として扱えるように**ラップする**ためのものだから」</font>です。
（「変換するもの」ではないです）

## そもそも、どう使うもの？

配列を `List<T>` として扱いたいときに使います。

例えば、シャッフルするのに `Collections.shuffle​(List<?> list)` という引数に `List` を取るメソッドはあるのですが、引数に配列を取るメソッドがありません。
そういうときに、 `Collections.shuffle(Arrays.asList(a))` という風にラップすることで、引数に配列を渡せるようになります。

`Arrays.asList(T... a)` で返ってくるリストは元になった配列と連動しているので、この `List` の要素を書き換えれば配列の要素も書き換わります。

```java
String[] array = new String[] {
    "aaa", "bbb", "ccc", "ddd", "eee"
};

// 配列を List にラップしてシャッフルする
Collections.shuffle(Arrays.asList(array));

// 元の配列が、ちゃんとシャッフルされている
// => [ccc, eee, ddd, bbb, aaa]
System.out.println(Arrays.toString(array));
```

`Arrays.asList(T... a)` が返すリストクラスの実装を見てみると、配列をラップしているだけなのがよく分かると思います。 [^ArrayList]

[^ArrayList]: この `ArrayList` は `java.util.ArrayList` とは別のクラスです。

```java:Array.asList(T...)が返すリストの実装（抜粋）
private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, java.io.Serializable
{
    private final E[] a;

    ArrayList(E[] array) {
        a = Objects.requireNonNull(array);
    }

    @Override
    public int size() {
        return a.length;
    }

    @Override
    public E get(int index) {
        return a[index];
    }
```

## なぜ add や remove ができないのか？

もし `add` や `remove` を実装しようとすると、元になった配列の長さを変える必要があります。
しかし、Java では配列の長さを変えられません。

そのため、`set` や `get` のような配列の中身に対して操作するメソッドは実装されていますが、`add` や `remove` のような配列自体を変更する必要のあるメソッドは実装されていないのです。[^imp]

[^imp]: 正確には `List` インタフェースは `add` や `remove` を実装する必要があるので、メソッドはあるけど `UnsupportedOperationException` をスローするという処理になっています）

## まとめ

明日の Java アドベントカレンダー、担当は `null` さんです。
[誰か！書いて！！！](https://qiita.com/advent-calendar/2018/java)

**追記：**
 @opengl-8080 さんが書いてくださいました！
[Doma2 でログ出力を制御する - Qiita](https://qiita.com/opengl-8080/items/8769c6981c59e4e1abbd)
QEMU上でBitVisorの準パススルードライバーを動かす

以下の記事でQEMU上でBitVisorが動くことがわかります。
https://qiita.com/hdk_2/items/dab49edf80975f4cc7d0

この時は準パススルードライバーを何も入れていなかったのですが、入れるとどうなるか試してみましょう。今回はLinux KVMを有効にしたQEMUを使用し、UEFI(OVMF)を指定しています。

# Intel GbE NIC

設定:

```:defconfig
(省略)
                .tty_mac_address = {
                        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
                },
                .tty_syslog = {
                        .enable = 1,
                        .src_ipaddr = { 192, 168, 0, 64 },
                        .dst_ipaddr = { 192, 168, 0, 27 },
                },
                .driver = {
                        .pci = "driver=pro1000, tty=1",
                },
(省略)
```

とりあえず、Intel GbE NIC用のドライバーを指定して、syslogログ出力を有効にしてみます。IPアドレスはUDPのsyslogを受け付けるコンピューターのIPアドレスに変えてください。ログ出力の設定に関しては以下の記事をご覧ください。
https://qiita.com/hdk_2/items/2431710fcf257904fc8a

QEMUは適当に以下のようにして起動します。デフォルトでIntel GbE NICがNAT接続になっているので、ネットワーク関連のオプションはすべて省略しています。

```shell-session:
$ mkdir _
$ ln -s ../bitvisor.elf ../boot/uefi-loader/loadvmm.efi _
$ qemu-system-x86_64 -bios OVMF.fd -cpu host -enable-kvm -m 2048 -snapshot -hda fat:_
```

EFI Shellが起動したらloadvmmと打ち込んでBitVisorを起動します。

```shell-session:
Shell> loadvmm
```

![a.png](https://qiita-image-store.s3.amazonaws.com/0/103733/c52f195f-60bd-0a69-97a2-78a074d3590d.png)

起動しました。それではsyslogの内容を確認してみましょう。

```shell-session:
# tail -2 /var/log/messages
Dec  1 10:48:03 192.168.0.27 bitvisor: PCI: 6 devices found
Dec  1 10:48:03 192.168.0.27 bitvisor: Starting a virtual machine.
```

ちゃんとログが出ています。実機ではリンクアップに時間が掛かって最初のログが失われると思いますが、QEMU上ではそんなことはないので最初からきちんと残ります。

# ATA

設定:

```:defconfig
(省略)
                .keys_conf[0] = {
                        .guid =         STORAGE_GUID_NULL,
                        .type =         STORAGE_TYPE_ATA,
                        .host_id =      -1,
                        .device_id =    -1,
                        .lba_low =      0ULL,
                        .lba_high =     ~0ULL,
                        .crypto_name =  "aes-xts",
                        .keyindex =     0,
                        .keybits =      256,
                },
(省略)
                .driver = {
                       .pci = "driver=pro1000, tty=1, and, driver=ata",
                },
(省略)
```

とりあえず、ATAのドライバーを指定して、ディスク全体の暗号化を指定します。起動方法は同じですが、起動前にまずディスクの内容を確認しておきましょう。

```shell-session:
Shell> dblk fs0 -b
```

![a.png](https://qiita-image-store.s3.amazonaws.com/0/103733/1c13a5bd-99fc-61af-3ea9-228b280e11d8.png)

FATのヘッダーが見えると思います。次にBitVisorを起動してから、同様のコマンドを叩きます。

```shell-session:
Shell> loadvmm
(省略)
Shell> dblk fs0 -b
```

![a.png](https://qiita-image-store.s3.amazonaws.com/0/103733/6a875505-6c82-abbe-3d8a-be4e34059441.png)

FATのヘッダーだったところがぐちゃぐちゃに化けました。これは、暗号化されていないデータを、暗号化されているものとみなして復号したために、データが化けた様子を表しています。

# USB, AHCI, その他

皆さんでお試しください。
Node.jsでEPUB 3を作る

[HTML5+javascriptを使ってブラウザでEPUB３を作成する](https://qiita.com/99nyorituryo/items/68f4d67bfda5d8aab25d)で、ブラウザでEPUBを作るのはやってみたので、今度はNode.jsでEPUBを作っていきたいと思います。まぁ、もうできているのですが、まだバグなどはいっぱい残っているだろう。

github
https://github.com/kyukyunyorituryo/fxlepub3
npm
https://www.npmjs.com/package/fxlepub3


何をしているかというと、テンプレートエンジンのejsを使ってテンプレートを書き換えて、EPUBにパッケージ化している。
　画像のEPUBなので、画像を取り込んで、EPUBファイルに入れることもしている。
簡単な作りなので、テンプレートを除いて本体のコードが150行程度である。

```js

fs = require('fs');
ejs = require('ejs');
var JSZip = require("jszip");
var filetype = require('file-type');
var sizeOf = require('image-size');
const uuidv4 = require('uuid/v4');
var uuid4 = uuidv4()
var today = new Date();
var date = today.toISOString().slice(0,19)+"Z";
```
読み込んだパッケージも6つで、そんなに量が多くない。

* ejsはテンプレートエンジン。
* jszipはEPUB圧縮用である。archiverを使う人もいるけどなれてる方を使う。
* file-typeは画像の拡張子や形式を調べるのに使った。
* image-sizeは画像のサイズから、固定レイアウトの指定するサイズを読み取った。
* uuidは、前に使ってたuuid.jsと違っている部分があって、「urn:uuid:」があるかないかが違っていた。

フォルダー内の画像の読み込み、テンプレートファイルの読み込み、設定json形式の読み込み。

```js

var epub = require('fxlepub3'); 
 
var data={
"url":"C:/Users/user/Downloads/comic/testdata/",
"output":'C:/Users/user/Downloads/comic/fxlsample/out.epub',
"title": "タイトル",
"author1": "著者名1",
"author2": "著者名２",
"index": [
    ["cover.jpg", "表紙"],
    ["00001.jpg", "目次"],
    ["00005.jpg", "最終ページ"]
    ],
"page_direction": "rtl",
"panel_view": "horizontal-rl",
"cover_file": {},
"files": []
}
epub.gen(data)
```

npmでパッケージ化しているので、requireから読み出す。指定したフォルダーから画像を読み込んで、指定した場所にEPUBを出力する。

```ejs
<% for (let i in data.files) { -%>
		<item media-type="<%= data.files[i].type %>" id="<%= data.files[i].file_id %>" href="image/<%= data.files[i].file_id+"."+data.files[i].ext %>"/>
<% } -%>
```
テンプレートエンジンで繰り返し処理を追加するのにテンプレート内にfor文を書いている。本体よりもテンプレートファイルの方に処理が複雑になってしまった。
【極小ネタ】キャメルケース/スネークケース/チェーンケースの覚え方【変数の命名規則】

# はじめに
先日、後輩に「そうなんですね:exclamation:」と大変驚かれたのと、自分でもこういう覚え方をしているなぁと思ったので、変数の書き方の由来についてまとめてみます。

# キャメルケース
## 記法
複数の単語をひとくくりにしたときに、各要素の先頭を大文字にします。
例えば`camelCase`とか`goToBed`とか`NowOrNever`みたいな形になります。
一番先頭の文字を大文字にするか小文字にするか・・・はありますが、ひとまず「単語に切れ目で大文字にする」と思ってていいかと。

## 由来
大文字と小文字の具合がラクダのこぶに似ているから。
キャメル`camel`って英語で「ラクダ」って意味です。
![animal_rakuyda_030.png](https://qiita-image-store.s3.amazonaws.com/0/188980/7f83420a-0e5d-880b-c071-b6b3b5024adf.png)
素材元：[いらすとや](https://www.irasutoya.com)

## 使われどこ
JavaとかCとか、コンパイル言語でよく見かけるイメージです。

# スネークケース
## 記法
複数の単語をひとくくりにしたときに、各要素をアンダーバーでつなぎます。
例えば`snake_case`とか`hakuna_matata`みたいな形になります。

## 由来
地面を這っている蛇のように見えるから。
個人的には、蛇に見える・・・のかなぁ？と思ってますが。
![276014_040.png](https://qiita-image-store.s3.amazonaws.com/0/188980/a07c9ea3-6735-a704-ed78-ed52c7a32b44.png)
素材元：[イラストAC](https://www.ac-illust.com)

## 使われどこ
PHPやRubyとか、スクリプト言語でよく見かけるイメージです。
余談ですが、昔JavaからRubyに転向した時に、先輩から「キャメルケースだとJavaっぽいよね」って言われたことありました。

# チェーンケース
## 記法
複数の単語をひとくくりにしたときに、各要素をハイフンでつなぎます。
例えば、`chain-case`とか`do-your-best`みたいな形になります。

## 由来
鎖でつながってるみたいに見えるから。
言われるとなんとなくわかるかも・・・。
![1229100_025.png](https://qiita-image-store.s3.amazonaws.com/0/188980/336b7e1c-3fb0-6c13-c484-ea8b3a1079a6.png)
素材元：[イラストAC](https://www.ac-illust.com)

ちなみに、串焼きケバブにちなんで「ケバブケース」と言われることもあるそうです。

## 使いどこ
HTMLやCSSでよく使われてます。

# まとめ
迷ったら、ラクダと蛇と鎖を頭に思い浮かべましょう（笑
ネイピア数の実装 [C/C++]

#ネイピア数

今回はC99とC++14で動作するネイピア数eを計算するプログラムを作成する。

##関数e1の実装

###元の式

$\displaystyle e = \lim_{t \to 0} \left(1 + t \right )^\frac{1}{t}$

###近似式

$\displaystyle t = \frac{1}{2^{51}}$

$\displaystyle e = \left(1 + t \right )^\frac{1}{t}$

##関数e2の実装

###元の式

$\displaystyle e = \sum_{n \to 0}^{\infty} \left(\frac{1}{n!} \right )$

###近似式

$\displaystyle e = 2+\sum_{n \to 2}^{18} \left(\frac{1}{n!} \right )$

#ソースコード

```c:C99
#include <stdio.h>
#include <stdint.h>
#include <math.h>

typedef uint_fast64_t u64;

//lim t->0 (1+t)^(1/t)
static const double t = 1.0 / ((u64)1 << 51);
double e1() {
	return pow(1.0 + t, 1.0 / t);
}

//sigma n=0~18 (1/n!)
double e2() {
	double e = 2.0;
	u64 n;
	for (u64 i = (u64)2; i < (u64)18; ++i) {
		n = (u64)1;
		for (u64 j = (u64)2; j <= i; ++j) n *= j;
		e += (1.0 / n);
	}
	return e;
}
static const double e = e2();
static const double ee = 2.718281828459045;

int main() {
	printf("%.16f\n", e1());
	printf("%.16f\n", e2());
	printf("%.16f\n", e);
	printf("%.16f\n", ee);
	return 0;
}
```

```cpp:C++14
#include <cstdio>
#include <cstdint>
#include <cmath>

namespace math {

	using u64 = uint_fast64_t;

	//lim t->0 (1+t)^(1/t)
	constexpr double t{ 1.0 / ((u64)1 << 51) };
	double e1(const double t_ = t) {
		return std::pow(1.0 + t_, 1.0 / t_);
	}

	//sigma n=0~18 (1/n!)
	constexpr double e2() {
		double e{ 2.0 };
		u64 n{};
		for (u64 i = (u64)2; i < (u64)18; ++i) {
			n = (u64)1;
			for (u64 j = (u64)2; j <= i; ++j) n *= j;
			e += (1.0 / n);
		}
		return e;
	}
	constexpr double e{ e2() };
	constexpr double ee{ 2.718281828459045 };

}

int main() {
	std::printf("%.16f\n", math::e1());
	std::printf("%.16f\n", math::e2());
	std::printf("%.16f\n", math::e);
	std::printf("%.16f\n", math::ee);
	return 0;
}
```

```:実行結果
2.7182818284590446
2.7182818284590455
2.7182818284590455
2.7182818284590451
```

##ソースコードのライセンス

These codes are licensed under CC0.
[![CC0](https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg "CC0")](http://creativecommons.org/publicdomain/zero/1.0/deed.ja)

ソースコードは自由に使用してください。
「Webの歴史」を知る。

# このシリーズについて

Adventカレンダー「エンジニアのためのWebマーケティング」の1日目です。
毎日少しずつ、エンジニアが学んでおいたほうが良いマーケティングと技術を中心とした知識を書いていきます。自分自身も学びの身ですので、なにかおかしいところあれば、異論・ツッコミ大歓迎です。

骨太な文書は世の中にたくさんあるので、ここではサクッと読めるようにコンパクトに纏めていきます。

それでは参りましょう

# Webの歴史

1日目は、「Webの歴史を知る」です。
みなさんが普段使っているWebサイトですが、始まりはどんなものだったのか。解説していきます。

## ARPANETの誕生

世界初のネットワークと呼ばれているのは、ARPANETと呼ばれるものです。
（ **A**dvanced **R**esearch **P**rojects **A**gency **NET**work）
ARPANETは1969年頃から始まります。それまでは、通信といえば電話が主流でしたが、これは通信局を結ぶ回線を交換するスタイルで、誰かがその回線を使っていたら他の人は使えない仕組みでした。経路の共有ができなかったのです。

しかし、そこにパケット通信という手法を使いデータブロックを区切って転送する技術が生まれ、またTCP/IPの技術が誕生し、様々な拠点にいる人が共通のプロトコルで通信できるようになりました。

例えるなら、
専用の地下通路をたどってしか行き来できない（しかも誰かが使っていたら、自分は使えない）ような仕組みだったものが、郵便物のように色んな人のデータが一緒に共有の経路を使いながら目的地まで運ばれる手法ができたのです。

## ティム・バーナーズ＝リー

スイス・ジュネーヴの欧州原子核研究機構（CERN）にソフトウェア技術のコンサルタントとして在籍した、[ティム・バーナーズ＝リー](https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%A3%E3%83%A0%E3%83%BB%E3%83%90%E3%83%BC%E3%83%8A%E3%83%BC%E3%82%BA%EF%BC%9D%E3%83%AA%E3%83%BC)が[NEXTSTEP](https://ja.wikipedia.org/wiki/NEXTSTEP)というサーバー上で世界初のWebサーバであるhttpdと世界初のウェブブラウザでありHTMLエディタであるWorldWideWebを構築します。
このとき、1990年11月。ちなみに余談ですが、NEXTSTEPを作ったNeXT社は世に有名なスティーブ・ジョブズがApple退社後、1985年に立ち上げた会社です。

### 世界最初のWebサーバー 
![640px-First_Web_Server.jpg](https://qiita-image-store.s3.amazonaws.com/0/72413/36a02f54-9715-08da-b2e0-b32507356d04.jpeg)
（本体に「このマシンの電源を落とさないで！」というシールが張ってあります [Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%A3%E3%83%A0%E3%83%BB%E3%83%90%E3%83%BC%E3%83%8A%E3%83%BC%E3%82%BA%EF%BC%9D%E3%83%AA%E3%83%BC#/media/File:First_Web_Server.jpg)から転載）

## はじめは文書管理システム

World Wide Webは最初、文書の閲覧のために使われているのが主流でした。
生まれた経緯がアカデミックだったこともありますが、学術的な論文などを検索・閲覧するようなもので、通信速度も低いものでした。画像も表示されず、Javascriptでアニメーションなんてそんなものはない世界。ストイックな白と黒の文字がそこにありました。

## 現在のWebは・・・

とはいえ、もうそれは30年近く前の話。
今この世の中では以下のような目的、つまり様々な目的で使われています。

* 文書閲覧
* コミュニケーションツール
* ショッピングの手段
* マーケティングツール
* 仕事にも趣味にも

当初は1種類しかなかったブラウザも、たくさんの種類が誕生しました。
ブラウザのシェア率戦争についてここで述べたいのもあるのですが、Wikipediaの記事のほうが詳しく解説されているので、ぜひこれを参照してみてください。

[Wikipedia - ブラウザ戦争](https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E6%88%A6%E4%BA%89)


## どうでもいい話

ちなみにみなさんは、「Web」と聞くと何を思い浮かべますか？
自分は最近[PS4のスパイダーマンのゲーム](https://www.jp.playstation.com/games/marvels-spider-man/)をプレイしている関係から、スパイダーマンを連想します。

そう、蜘蛛が貼っているあの蜘蛛の巣は英語で「Web」。

四方八方に張り巡らされた情報の蜘蛛の巣が、今の我々の生活を支えています。

## おわりに

明日は、マーケティングの基礎となる「広告」についてです。
Surface Pro 6にVS Codeを入れてみた

最近は、Python, JavaScript(TypeScript)のエディタとしてVS Codeを使っています。
なんならターミナルで実行したいPythonスクリプトの実行も、VS Codeを使っています。

ということで、Surface ProにもVS Codeを入れるべく、入れてみました。
結論から言うと、特になんの苦労もなく、入りました。
(必要なディスク容量は200MB程度でしたので、ディスク容量が小さいSurfaceでも入るかと思います。)

[Visual Studio Code公式サイト](https://code.visualstudio.com/)

## スペック、バージョン等
* 端末：Surface Pro 6 SSD 128GB/メモリ8GB<br> (OS & バンドルされたOfficeインストールした状態で残り90GB程度の空きがある)
* OS：Windows 10 Home 
* VS Code: Ver. 1.29 (2018/12/1現在)

## バイナリのダウンロード
* [Visual Studio Codeのサイト](https://code.visualstudio.com/Download)からWindows用のSystem Installer 64bit版を選択します。(ユーザーローカルにインストールする場合はUser Installerを選択)
* ダウンロードしたインストーラーを実行して、特にこだわりがなければ、ウィザードに沿って、そのままインストールします。


インストール先や、拡張子の関連付けは好みですが、自分の場合は、いろんなファイルをVS Codeで開くことが多いので、コンテキストメニューに「Codeで開く」を追加する等のオプションを設定しています。


```:参考(インストール直前の確認)
インストール先:
      C:\Program Files\Microsoft VS Code

プログラムグループ:
      Visual Studio Code

追加タスク一覧:
      その他:
         エクスプローラーのファイル コンテキスト メニューに [Code で開く] アクションを追加する
         エクスプローラーのディレクトリ コンテキスト メニューに [Code で開く] アクションを追加する
         サポートされているファイルの種類のエディターとして、Code を登録する
         PATH への追加（再起動後に使用可能）

```

インストールは以上です。
VS Code上でのPythonなどの環境構築についても、近々メモを残しておきたいと思います。

## 追記：VS Codeを日本語表示に変更する方法
今回新規にインストールしたところ、表示言語が英語のみになっていて戸惑った。
ver 1.25から英語のみになっているとのこと。

参考サイト：[VS Codeで表示言語を変更するには](http://www.atmarkit.co.jp/ait/articles/1805/18/news032.html)

日本語表示に切り替えるためには、VS CodeのExtentionsでJapanese Language Pack for Visual Studio Codeを追加する必要があった。

![ja.png](https://qiita-image-store.s3.amazonaws.com/0/321544/7704c915-fe99-1604-c8d7-87a1c8f30d42.png)
NFCを考える。

#これは秋ロボのアドベントカレンダー2日目です。
なので2018年12月2日の記事です。

みなさん、お久しぶりです。
やましょうです。

#NFC のICについて
NFCのカード側ではなくリーダーというかライターというか
(簡単に言うとパソリ側ですね。）

まずMOUSERでNFC のICを探します。
NFCと入れるとPN532や、PN522ヒットします。600円～1200円と高価ですね。
STさんのCR95HF等もありますが、日本向けには打ってくれない模様です。

またスイッチサインエスさんでみても結構、高価ですね。
https://www.switch-science.com/catalog/list/8/

ところが、AMAZONでPN532を検索してみると、既にモジュールモジュールとなって
*800*円台からあります。
また安いPN522の奴なら*200*円台からあります。

この値段なら簡単に試す事ができます。
さて、あとはサンプルソースを探します。
決してビジネスで使えるレベルではありませんが、動作するかしないかくらいの
チェックはできますね。

#サンプルソフト
ライブラリーがここにあるようです
pn522
https://github.com/miguelbalboa/rfid

pn532
https://github.com/elechouse/PN532

これやってみると判るのですがNFCのIDの偽造は簡単にできます。
そのため、確実にIDのみでなく、中のデータで認証するシステムが必要になることがわかります。
詳しくはこのページにまとめらている様です。
https://qiita.com/YasuakiNakazawa/items/3109df682af2a7032f8d

ということで、NFCを考えるでした。

以上
やましょうでした。
RxSwiftで引数付きの関数を追加 (extension) する場合は気をつけるという話

## はじめに

[VALU Advent Calendar 2018](https://qiita.com/advent-calendar/2018/valu) の2日目です!
1日目のAndroidに続き，本日はiOS向けのエントリです。

RxSwift は便利ですが，extensionで引数付きの関数を利用する際には気をつけたい注意点があります。今回は RxSwift によって問題が発生しうるコードを例に，その解決策を紹介致します。

## 問題が発生しうるコード

```swift
extension Observable where E == Int {
    func add(_ value: Int) -> Observable<Int> {
        return map { $0 + value }
    }
}
```

以上は Observable の中身が Int であるものに対し，value を加えるという単純な `add()` 関数です。
一見通常の extension なのですが，以下の場合に実行してみるとそれが好ましくない挙動をすることが分かります。

```swift
let subject = PublishSubject<Int>()
var value = 10

_ = subject
    .add(value)
    .subscribe(onNext: { print($0) })

value = 5
subject.onNext(0) // 10
```

本来 5 で定義されて欲しい value が，10 と表示されてしまいます。

## どうすれば良いのか

遅延評価させれば良いのですが，Swift には遅延評価のための `lazy` は class および collection (Array) に対してのみ開放されており，利用できません。
Closure を利用することになります。
ただし，関数内の map に Closure を利用しているため，`@escaping` キーワードを利用する必要があり，呼び出しはクロージャにする必要があります。

```swift
extension Observable where E == Int {
    func add(_ value: @escaping () -> Int) -> Observable<Int> {
        return map { $0 + value() }
    }
}
```

```swift
_ = subject
    .add({ value })
    .subscribe(onNext: { print($0) })
```

## より良い方法

本題です。以上の方法で解決自体はできるのですが，やはり `add({ value })` の Closure が気になります。
Swift の値渡しと参照渡しのように，利用する側としては素朴な概念と一致する現在の値が渡って欲しいと考えます。そうしましょう。

**`@autoclosure`** キーワードを利用します。

```swift
extension Observable where E == Int {
    func add(_ value: @escaping @autoclosure () -> Int) -> Observable<Int> {
        return map { $0 + value() }
    }
}
```

```swift
let subject = PublishSubject<Int>()
var value = 10

_ = subject
    .add(value)
    .subscribe(onNext: { print($0) })

value = 5
subject.onNext(0) // 5
value = 20
subject.onNext(0) // 20
```

これにより，`add(value)` 関数内において，呼び出し側を変更することなく安全に記述することが可能となりました。

## 結語

今回は Rx の引数問題を `@autoclosure` を利用して解決してみました。

台無しにする結語を加えると，そもそも引数を固定にせず，`Single` 等を利用して都度取りにいくのが良いでしょう。
UseCase 等を利用していて設計上 疎結合となっているならば，自然とそうなる気がしています。

## References

- [Attributes - The swift programming language swift 4.2](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#)
- [YutoMizutani/OperantKit commit: 895b441](https://github.com/YutoMizutani/OperantKit/pull/201/commits/895b4412665e53897bacb5d15fd2a6595dc81aaa)
DockerでHHVM/Hackを始める

##　概要
この記事は[Hack and HHVM Advent Calendar 2018](https://qiita.com/advent-calendar/2018/hack-and-hhvm)の23日目の記事になります。

連日[@ytake](https://qiita.com/ytake)さんが、素晴らしい記事を上げてくれていますね。
今回はHHVMとHackについて興味がある自分が、Dockerで環境を作る話をしていこうと思います。
アドベントカレンダーの機会に入門していこうと思います。

## 環境構築
公式で[Docker環境構築の手順](https://docs.hhvm.com/hhvm/installation/docker)があるので、それを参考にやってみます。

```
$ docker pull hhvm/hhvm
$ docker run --tty --interactive hhvm/hhvm:latest /bin/bash -l
# hhvm --version
HipHop VM 3.28.3 (rel)
Compiler: 1538421562_619401197
Repo schema: f2bcece3956424d62c386558e0a8e48a1de8e0b1
```

次に`proxygen`で立ち上げてみます。
こちらも公式に手順があるので、その通りに進めていきます。

```:Dockerfile
FROM hhvm/hhvm-proxygen:latest

RUN rm -rf /var/www
ADD . /var/www

EXPOSE 80
```

```hack:index.hh
<?hh // strict
echo "Hello World";
```

```bash
docker build .
docker run -p 0.0.0.0:80:80 コンテナID
```

この状態でブラウザにアクセスすると、`Hello World`が表示されます。

![スクリーンショット 2018-12-19 15.53.12.png](https://qiita-image-store.s3.amazonaws.com/0/39671/ba622009-d5b5-7f5b-2f93-1b3ed03e756f.png)

## 最後に
とまあ、「公式ドキュメントをやっただじゃん」みたいなエントリーになりましたが、ここに辿り着くまでにも結構時間がかかったんですよね…。
HHVM/Hackに関しては、検索してもなかなかいい記事が見つからないですし、自分はDockerの知識もなく…。
HHVM/Hackに関しては、詰まったときは[公式ドキュメント](https://docs.hhvm.com/hhvm/)を読むのと、[@ytake](https://qiita.com/ytake)さんの投稿を見るのが良いです。

## おまけ
HackでもComposerを使って、ライブラリのインストールを行います。
自分のPCにHHVMとComposerを入れてしまっても良いですが、個人的に気になるので、Dockerでインストールします。

こちらは困っていた際に、導入方法に迷っていた際に[@ytake](https://qiita.com/ytake)さんから助けてもらい、導入することができました。
ありがとうございました！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">つ <a href="https://t.co/hsjLEcSLzM">https://t.co/hsjLEcSLzM</a><br>参考になるかわかりませんがどうぞ・・ docker配下</p>&mdash; Yuuki Takezawa@ytake (@ex_takezawa) <a href="https://twitter.com/ex_takezawa/status/1075083876639289344?ref_src=twsrc%5Etfw">2018年12月18日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Dockerfileを下記のように変更します。

```:Dockerfile
FROM hhvm/hhvm-proxygen:latest

RUN rm -rf /var/www \
 && cd '/' \
 && php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
 && php composer-setup.php \
 && php -r "unlink('composer-setup.php');" \
 && mv composer.phar /usr/local/bin/composer
ADD . /var/www

EXPOSE 80
```

これでOKです。
あとはコンテナをビルドし、sshで確認します。

```bash
$ docker build .
$ docker run --tty --interactive -v ホストディレクトリの絶対パス:/var/www/html コンテナID /bin/bash -l
# hhvm $(which composer)
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.8.0 2018-12-03 10:31:16
```
これでホストディレクトリに対して、Composerを使ったライブラリのインストールが出来るようになりました。

以上で終わります。
最後まで読んでいただきありがとうございました。

## 参考
* [HHVM公式ドキュメント](https://docs.hhvm.com/hhvm/)
* [Hack公式ドキュメント](https://docs.hhvm.com/hack/)
react360で作ったスライドショーアプリの解説

#このエントリーでは！
WerVRフレームワークのひとつである「React360」を使ってスライドショーアプリを作成したのでそのサンプルコードの公開とその簡単な解説をしたいと思います。

前日の23:00に書いてるので雑です。気が向いたら加筆します。

#作ったもの
![cap.png](https://qiita-image-store.s3.amazonaws.com/0/150996/3f7a394b-793b-c46a-f505-1d23cc9428e3.png)
こんな感じで、下に表示されている写真をコントローラーで選択すると、周囲の景色がその写真に切り替わるアプリを作りました。WebVRなので、当然インストールは不要で、ブラウザでURLにアクセスすればいいわけです。

動くところが面白いのですが、さすがにノートPCには負荷が大きく、動きをうまく撮ることができませんでした。。無念。。

#開発に使用した機器たち
##VR HMD
**[Oculus GO](https://www.oculus.com/go/)**
俺のVR生活はこいつのおかげで始まりました。
こいつに内蔵されたブラウザでデプロイ先のURLにアクセスすれば、WebVRとして使用できます。めっちゃ手軽
##PC
**Lenovo YOGA(ノートPC)**
それなりに性能がいいとはいえ、ノートPC単体で開発ができてしまうのがWebVRのいいところですね。ハイスペックマシンは必要ありません。表示確認もブラウザからできます（ちゃんとマウスでぐりぐり動かせるよ！）
##撮影機器
**[リコーTheta SC](https://theta360.com/ja/about/theta/sc.html)**
言わずと知れた360度写真撮影デバイスです。
とってもお手軽＆ハイクオリティな撮影が可能です。今回の360度写真はこいつで撮影しました。結婚式など、周りを見渡した映像を取りたい時などにも使えますね。

#とりあえずチュートリアル的なサイトたち
- <[React360公式サイト](https://facebook.github.io/react-360/)>
まずはここ。とにかく出回っている情報が少ないので、公式の内容は死ぬほど熟読した気がする。
- <[React360 GitHubリポジトリ](https://github.com/facebook/react-360)>
ここも要チェック。特にハマったときは、Issuesを確認して同じ苦労をしている人を探そう。いるから。
- <[React 360を覗く](https://qiita.com/shiruco/items/3e77babe80a373c71fd5)>
ここも全体感を知るためにはいい情報でした。ありがとうございました。

あとは適当に泣きながらググって情報を探すべし！！！！

#公開コード
https://github.com/dslerx/webvr_slideshow
ソース汚いですがご容赦を。。。ご指摘はどしどし受け付けます。

#動かし方
GitHubからCloneして、`npm install`してから`npm start`してください。そのあと`http://localhost:8081/index.html`に接続すると勝手に裏でビルドが走り、完了次第サイトが表示されるはずです（ちなみにビルドはめっちゃ時間かかりますので耐えてください）。

もし動かなかったらReact360をグローバルインストール(`npm install -g react-360-cli`)してください。

なお、著作権などに抵触するファイルは除いていて、写真はすべて同一の写真に差し替えてます。。

#コードの解説
しようと思ったのですが、辛くて断念。。。
基本的にはReact&Reduxの実装をしたことがある方ならば追っていけるはずです。React Nativeの考え方もだいぶ入っているので、そのあたりの情報も必要に応じて調べてみるといいと思います。

(2018/12/22追記)大事なことを書き忘れました。このコードは、公式のSlideShowアプリのサンプルコードを基に書いています。内容はだいぶ改変していますが、読み解きのご参考まで。
SATySFiで複数行コメントの簡単な実現方法について

CSS組版ではだいぶ辛い思いをしたので、新しい組版システムはないかと探してみたら、[SATySFi](https://github.com/gfngfn/SATySFi)を見つけたので、お試しで使ってみています。
本当にビギナーユーザーなので、何か間違っていたらご指摘ただけると嬉しいです。

# はじめに
## これは何？
私はプログラムをドキュメントがわりに読めないので、(できれば日本語の)ドキュメントなどないかと探してみると、[The SATySFi Book](https://gfngfn.booth.pm/items/1127224)を見つけたので、これを読みつつSATySFiを触ってみています。
読んでいくと、The SATySFi Bookの中に

```text
複数行のコメントアウトは現在は備わっていないが，明らかにあると便利なので近い将来追加するつもりでいる．
```
とあるので、じゃあそれを作ってみようと思い、簡単なのなら作れたのでそのご紹介をします。

## 前提
### 試してみた環境
- OS
    - macOS Mojave
        - 10.14.2
- SATySFi
    - 0.0.3

# 方法
ブロックコマンドで実現しました。

## 前提
そもそも複数行コメントアウトをする場合、ブロック単位など何かしら意味のある単位に対してかけるはずなので、中途半端な単位への対応は考えていません。
また、rootのブロックへのコメントアウトも必要がなさそうなので考えていません。

## 実装
プリアンブルに以下のブロックコマンドを追加：

```text
let-block +block-comment inside =
  '<>
in
```
## 使用方法
コメントアウトしたいブロックの上に、`+block-comment`を以下のようにかぶせる：

```text
'<
  +chapter{はじめての章}<
    +block-comment<
      +p{
        \SATySFi; でのはじめての段落の記述です．
        ここをコメントアウトします．
      }
    >
  >
>
```

ちゃんとコメントアウトされました:sunny:

# おわりに
何か違うような気もしますが、、これで私は満足です。
かなりギリギリですみません。寝てしまいました:sleeping:
それでは飛び入り参加させていただきありがとうございました！
Siv3Dでデバッグ用のテキスト表示をうまいことやる方法 

Siv3DではPlintln()でテキストの簡易表示ができます。
[テキストの簡易表示 1](https://github.com/Siv3D/Reference-JP/wiki/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E6%8F%8F%E3%81%8F#%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E7%B0%A1%E6%98%93%E8%A1%A8%E7%A4%BA-1)

この簡易表示はClearPrint()で削除するまで画面に残り続けますが、
ClearPrint()実行時には全ての簡易テキストが削除されます。

毎フレーム更新される情報を表示したい場合、

	# include <Siv3D.hpp>

	void Main()
	{
		while (System::Update())
		{
			ClearPrint();
			Plintln(hoge0);
			Plintln(hoge1);
			Plintln(hoge2);
		}
	}

と書くことで、スッキリと表示させることができます。


デバッグに必要な情報を表示する手段として、このPlintln()は便利な関数ですが、
毎フレーム更新したい情報とそうではない情報が混在するとき、困ったことになります。

ClearPrint()を使うと全ての簡易テキストが削除されてしまうため、
毎フレームClearPrint()を呼ぶと、1フレームしか簡易テキストが表示されなくなったりします。

	# include <Siv3D.hpp>

	void Main()
	{
		int a = 0;

		while (System::Update())
		{
			ClearPrint();
			Plintln(L"aaa");
			Plintln(L"111");

			if(a % 10 == 0){
				Plintln(L"bbb");
			}
			a++;
		}
	}

そこで、このようなクラスを作ります。

	#pragma once
	# include <Siv3D.hpp>

	class DebugPrint
	{
	private:
		std::unordered_map<String, String> m_VariableMap;
		std::unordered_map<String, int> m_UpdateFrameMap;

	public:
		DebugPrint(){
			m_VariableSetMap.clear();
			m_UpdateFrameMap.clear();
		}
		~DebugPrint();

		void SetVariable(String id, String variable) {
			m_VariableMap[id] = variable;
			m_UpdateFrameMap[id] = System::FrameCount();
		}
		void Draw() {
			ClearPrint();
			for (auto& v : m_VariableMap) {
				Println( m_UpdateFrameMap[v.first], L":", v.first, L":",  variable.second);
			}
		}
	};

以下のように使います。

	#include "DebugPrint.h"
	
	void Main()
	{
		DebugPrint dp;
		int a = 0;

		while (System::Update())
		{
			ClearPrint();
			dp.SetVariable(L"hoge0",L"aaa");
			dp.SetVariable(L"hoge1",Format(111));

			if(a % 10 == 0){
				dp.SetVariable(L"hoge2",L"bbb");
			}
			a++;
			
			dp.Draw();
		}
	}

以下のように表示されるはず。

	123:hoge0:aaa
	123:hoge1:111
	120:hoge2:bbb

Singletonを使えばソースコード上の好きなところで呼び出せます。
[シングルトンのベターな実装方法](https://qiita.com/kikuuuty/items/fcf5f7df2f0493c437dc)



	void Foo::Update(){
		
		DebugPrint& dp = singleton<DebugPrint>::get_instance();
		dp.SetVariable(L"Foo",L"Bar");
	}

うまく使って開発の役に立てましょう。