OmniAICreator/Qiita-1.07M huggingface dataset:
Emmet Cheat Sheet（Visual Studio Code + デフォルト設定 編）

## これはなに？
Visual Studio Code はとても素敵なエディタです。
そんな素敵なエディタで、こちらもまたとても素敵なEmmet入力を使うためのチートシートです。

### Emmetって？
簡単に言えばHTMLのコーディングを効率よく行えるための便利機能・ショートカット・予測変換みたいなものです。 いろいろなエディタで広く採用されている入力方式なので覚えておけばつぶしがききます。 オレオレ効率化よりはよいと思います。

### なぜデフォルト設定？
エイリアスなど自分用に作ってのチューニングもよいですが、インストールしてすぐそのままで使えるのはメリットです。まずは守破離の守です。
> 個人的な思いとしても...マイクロソフトさん凄い会社です。その会社が「この設定をデフォルトでいくぞ！」と言っている設定なので極力尊重。 出てきた料理になんでもかんでもすぐに調味料かけるよりは、まずは一口そのままで十分に料理人の意図をくみ取ってみて、調味料はそれからにしたい。

ということで以下本題のチートシートです。

## Emmet チートシート

### **基本操作**
Visual Studio Codeで``.html`` ``.css`` ``.hbs`` などHTML系のファイルを開く。
HTMLのタグ名などをいれていくと途中で候補がでてくるのでEnterまたはTABで決定する。
基本的にはただそれだけ。
候補が複数出てくる場合には上下で選択可能です。

### **htmlのテンプレートを作る**

```html
html:5[Enter]
```
``ht``　くらいまで入力すると ``html`` ``html:5`` ``html:xml`` あたりの候補がでてくるので ``html:5`` を選んで Enter すると以下のようなテンプレートに展開されます。

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
```
この展開された状態でさらにTABをおすと普段書き換えるであろういくつかの項目にカーソルがジャンプしていきます。言葉ではわかりづらいですがやってみればわかります。

### **imgとかdivとかの普通のタグを簡単に書く**

```html
img[Enter]
```

が、

```html
<img src="" alt="">
```

のように展開されます。``div``なら``<div></div>``だったり``a``が``<a href=""></a>``だったり。ほとんどどんなタグでもいい感じに展開されます。

### **タグを入れ子にしたり複数個展開する**

```html
div*2[Enter]
```

であれば div × 2 で、

```html
<div></div>
<div></div>
```

になります。
入れ子にしたければ、

```html
div>div[Enter]
```

とすれば

```html
<div>
    <div></div>
</div>
```

になります。
もちろんさまざま組み合わせることも可能で、

```html
ul>li*3[Enter]
```

とすれば、

```html
<ul>
    <li></li>
    <li></li>
    <li></li>
</ul>
```
になります。カッコでくくって範囲をまとめるような書き方もできます。

### **タグにクラスや属性をつけて展開する**

```html
div#myid
```

は # で属性がついて、

```html
<div id="myid"></div>
```

です。
次にクラスは . でつけられるので、

```html
div.myclass
```

が

```html
<div class="myclass"></div>
```

になります。もちろん ``div.myclass#myid`` は ``<div class="myclass" id="myid"></div>`` のように、組み合わせも可能です。
この辺りは cssセレクタ の書き方に違いのでなんとなく書いてみたらなんとなくできます。

### **すでにある文字列をタグでかこむ**
```吾輩は猫である``` を ```<p>吾輩は猫である</p>``` にしたいケースです。
残念ながら... その機能自体はあるもののデフォルトの設定でショートカットがありません。
やるとしたら、``Ctrl + P`` → ``> Emmet Wrap with`` くらいまで入力すると候補（Emmet: Wrap with Abbreviation）がでてくるので ``Enter`` さらにどのタグで囲むか聞いてくるので ``p`` をいれて ``Enter`` です。

ちょっと複雑ですがなれたら、``Ctrl + p`` → ``> Em[Enter]`` → ``p[Enter]`` くらいのことなのでさくっと書けます。

かわりにこういうやりかたもあります。

```html
p{吾輩は猫である}
```

と書いて展開すると ``p`` で囲まれます。
これも手が慣れてしまえば、 ``p{`` → ``[End]``で文末 → ``}[Enter]`` という感じでさくっといけます。

### **操作 Tips. 候補を出すショートカット**

例えば ``d`` ``i`` ``v`` と入力していけば候補が徐々に出てきますので必要に応じて [Enter] などいれてくれたらよいです。
ただ ``div`` とコピペで入力したり、いっかいBacksapceで候補を消したりした場合、改めて候補をだすためには ``Ctrl + Space`` を入力してください。候補があたらめて出てきます。

## Emmetの公式的なドキュメント

おそらくこの辺りが公式なのだと思います。

https://docs.emmet.io/
https://code.visualstudio.com/docs/editor/emmet

---

よい Visual Studio Code ＆ Emmet ライフを！！
ざっくりとgem 'acts as follower'の導入手順

# はじめに
本記事は著者のプログラミング知識を整理し、「半年後の自分が見返しても理解できる記事」を目的に書かれています。また、著者と同じくプログラミング初学者の方を少しでも手助けれきると幸いです。

また、著者はプログラミングを学び始めてからまだ日が浅く、間違った情報、間違った認識を掲載している可能性があります。そういった箇所を発見された方は編集リスクエスト等でご連絡くださいませ。

ではいきます。

# 環境
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin16]
Rails 5.1.4

※使用するgemは「acts as follower」
https://github.com/tcocca/acts_as_follower

※フォロー機能をもたせる下記Userモデルはgem 'devise'を用いて作成しました。

```app/models/user.rb
class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end
```


# acts as followerを選んだ理由
・Qiitaにて既にgemを導入されている方が多数いらっしゃり情報量が豊富
・gemの導入後はall_followingやfollwersといったメソッドにより容易にフォロー関連のレコードを取得できる

# 導入手順
※アプリケーションの土台とUserモデルの作成は割愛させて頂きます。
## gemを導入する
今回、私はRails5を使用しているためGemfileに下記を追記します。

```ruby
source "https://rubygems.org"

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end
  ...
  gem "acts_as_follower", github: "tcocca/acts_as_follower", branch: "master"
  ...

```
Rails4以前だとGemfilへの記述が異なります。公式のGitHubを参照しましょう。

Gemfileへの記述が終わったらbundleを実行しましょう。

```
$ bundle update
$ bundle install
```
無事に完了したらジェネレータを走らせてFollowモデルを作成します。

```
$ rails generate acts_as_follower
```
下記のようなFollowモデルとマイグレーションファイルが自動生成されればOKです。

```app/models/follow.rb
class Follow < ActiveRecord::Base

  extend ActsAsFollower::FollowerLib
  extend ActsAsFollower::FollowScopes

  belongs_to :followable, polymorphic: true
  belongs_to :follower,   polymorphic: true

  def block!
    self.update_attribute(:blocked, true)
  end
end
```

```db/migrate/(timestamps)_acts_as_follower_migration.rb
class ActsAsFollowerMigration < ActiveRecord::Migration[4.2]
  def self.up
    create_table :follows, force: true do |t|
      t.references :followable, polymorphic: true, null: false
      t.references :follower,   polymorphic: true, null: false
      t.boolean :blocked, default: false, null: false
      t.timestamps
    end

    add_index :follows, ["follower_id", "follower_type"],     name: "fk_follows"
    add_index :follows, ["followable_id", "followable_type"], name: "fk_followables"
  end

  def self.down
    drop_table :follows
  end
end
```
マイグレーションの実行も忘れずに行いましょう。

```
$ rake db:migrate
```

## Userモデルに「フォローする機能」を持たせる
```app/models/user.rb
class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  acts_as_follower
end
```
こちらを追記することで他のUserモデルは他のモデルをフォローすることができるようになります。公式ではUserモデルがBookモデルをフォローするような実装になっていますが・・・同じモデル同士でフォローし合う場合でも実装方法は変わりません。
## Userモデルに「フォローされる機能」を持たせる
```app/models/user.rb
class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  acts_as_follower
  acts_as_followable
end
```
これでOKです。Userモデルにはフォローしたりされたりする機能が追加されました。
Unite file_mruで最近開いたファイルを表示する

## 必要なもの

https://github.com/Shougo/unite.vim
https://github.com/Shougo/neomru.vim

neomruだけでいけるのかどうかは未検証です。

## `:Unite file_mru`

![vim_mru.gif](https://qiita-image-store.s3.amazonaws.com/0/20045/2f702cc8-e4ef-924b-9dea-022055da2c03.gif)


## `:Unite file_mru -no-quit`

![vim_mru2.gif](https://qiita-image-store.s3.amazonaws.com/0/20045/1ccec3b4-3939-91da-deb2-375f66b814fe.gif)

## キーマップ設定

```vim
nnoremap [unite] <Nop>
nmap <Space>u [unite]
"mru list
nnoremap <silent> [unite]m :<C-u>Unite file_mru<CR>
```

![vim_mru3.gif](https://qiita-image-store.s3.amazonaws.com/0/20045/468a49f2-7dfc-c1b1-a822-2119048781f7.gif)
FileMaker 本番への移行　スピードアップ

ステージング環境から本番環境へ（効率的に？）リリースする方法です。（分離モデルを利用しています）
絶対にミスれない。ミスりたくない。作業手順の備忘録として。
（もっと良い方法があるよという方、いらっしゃればぜひ教えてください！）



#１、本番のData用ファイル（データベースが保存されているもの）にテーブル作成
	テーブル・レコードの定義をインポートします。

#２、もう一方のファイルをサーバーにアップロード
	アップ先のフォルダを間違わないようにしましょう。

#３、動作確認
	スクリプト、レイアウト内のフィールドオブジェクトなど、データが欠落している場合もあります。

#４、完成
	サーバースケジュールも確認を忘れずに。


本当に簡単に書いてます。すみません！
（もっと良い方法があるよという方、いらっしゃればぜひ教えてください！）
railsで投稿後にSNSシェアページへ遷移させる

# やりたいこと

投稿後にSNSでシェアしてねと投稿が完了しましたという表示をするページに遷移させたい

具体的な仕様

* 投稿完了画面でシェアボタンを実装したい
* シェアするページは各投稿詳細ページ
* 投稿詳細ページはposts/idのURLで各idがurlに入っている

# 実装方法

* urlにidを入れ、paramsで受け渡しをする
* urlにid入れてうつと誰でも遷移できるが別に投稿完了画面に個人情報は無いのでそれはよしとする

## 投稿完了画面のview作成

view（html.erb）を作成。既にcontrollerがあるならコマンド打つ必要無し。

## routesに下記を記入

```ruby:routes.rb
get "posts/:id/done" => "posts#done"
```
別に投稿完了ページにページ固有のコンテンツは無いがidを渡すためにurlにidを入れる。

## controllerにdoneを作成

```ruby:posts_controller.rb
  def done
    @post_id = params[:id]
  end
```
## viewに変数を

```ruby:done.html.erb
<div class="row">
  <a href="http://twitter.com/share?url=url/posts/<%= @post_id %>">
  <button type="button" class="btn btn-primary btn-lg btn-block col-xs-12">Twitterでシェア</button>
</div><!--row-->
<div class="row done_tohome">
  <a href="/posts/<%= @post_id %>">
  <button type="button" class="btn btn-secondary btn-lg btn-block col-xs-12">投稿詳細ページに戻る</button>
  </a>
</div><!--row-->
```
Enumeratorは分割してもフレーム遅延しない

　yield return YieldInstructionが1フレーム遅延するので（[前記事](https://qiita.com/kema8351/items/0c80483d828d101b0693)）、yield return IEnumeratorはフレーム遅延するのか気になりました。結果は遅延なし。以下確認コードと結果。Unity2017.2 0p4 Windows版のEditorによるテストです。

```C#:CalledEnumeratorTest.cs
using System.Collections;
using UnityEngine;

public class CalledEnumeratorTest : MonoBehaviour
{
    IEnumerator Start()
    {
        Log("Start");
        yield return BeCalled();
    }

    IEnumerator BeCalled()
    {
        Log("BeCalled");
        yield return null;
        Log("BeCalledAfterOneFrame");
    }

    void Log(string message)
    {
        Debug.Log(Time.time.ToString("n5") + " :" + message);
    }
}
```
```:結果
0.00000 :Start
0.00000 :BeCalled
0.02000 :BeCalledAfterOneFrame
```
 メンテナンスや可読性のために肥大化したIEnumeratorは分割しても大丈夫そうです。
UnityのWaitUntilは使わない

#代わりはWhile
　代わりにWhileを使います。WaitUntilを使うと条件式が最初から真でも1フレーム消費してしまうようです。以下確認コードと結果。Unity2017.2 0p4 Windows版のEditorによるテストです。

```C#:WaitUntilTest.cs
using System.Collections;
using UnityEngine;

public class WaitUntilTest : MonoBehaviour
{
    [SerializeField]
    bool whileContinue = false;

    void Start()
    {
        Log("Start");
        StartCoroutine(TestWaitUntil());
        StartCoroutine(TestWaitForSeconds());
        StartCoroutine(TestWhile());
    }

    IEnumerator TestWaitUntil()
    {
        Log("TestWaitUntil");
        yield return new WaitUntil(() => true);
        Log("TestWaitUntilAfterBlock");
    }

    IEnumerator TestWaitForSeconds()
    {
        Log("TestWaitForSeconds");
        yield return new WaitForSeconds(0f);
        Log("TestWaitForSecondsAfterBlock");
    }

    IEnumerator TestWhile()
    {
        Log("TestWhile");
        while(whileContinue)
            yield return null;
        Log("TestWhileAfterBlock");
    }

    void Log(string message)
    {
        Debug.Log(Time.time.ToString("n5") + " :" + message);
    }
}
```

```:結果
0.00000 :Start
0.00000 :TestWaitUntil
0.00000 :TestWaitForSeconds
0.00000 :TestWhile
0.00000 :TestWhileAfterBlock
0.02000 :TestWaitUntilAfterBlock
0.02000 :TestWaitForSecondsAfterBlock
```

　個人的にはWaitUntilが好きです。「ここで他の処理を待っています」というのが明示できるからです。ただパフォーマンスに関わるとなれば仕方ありません。たかが1フレーム、されど1フレーム。見逃すと入力連打によるバグに繋がったりします。
　ついでにWaitForSecondsも調べました。同様に1フレーム消費してしまうようです。どうやらYieldInstructionには同じ性質がありそうです。
Djangoで手短にログイン処理

# Djangoで手短にログイン処理

djangoにはログイン、ログアウト、パスワード管理のためのビューがあらかじめ備わっています。ただしテンプレートは用意されていないので、自分で用意する必要があります。

[公式ドキュメント](https://docs.djangoproject.com/en/2.0/topics/auth/default/#using-the-views)や[こちらの記事](https://qiita.com/maueki/items/d28fd2a170d42e745376)で紹介されています

本記事では**なるべく手数をかけずにログイン処理をつくるシンプルな手順**をまとめます

urls.pyに下記を追記します。

```py:projectname/urls.py
...
from django.urls import include
...

urlpatterns = [
    ...,
    path('accounts/', include('django.contrib.auth.urls')),
]
```

テンプレートを入れるためのアプリフォルダを用意します。アプリの名前はなんでもいい(whatever)ですが、テンプレートの入るフォルダは`registration`にします

```sh
mkdir -p whatever/templates/registration
```

ディレクトリ構成は下記になります

```
projectname
  whatever
    templates
      registration
```

registrationにlogin.htmlをつくります

```html:whatever/templates/registration/login.html
<!doctype html>
<html lang="ja">
<head>
  <meta charset="utf-8">
</head>
<body>
  <form action="{% url 'login' %}" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="login" />
    <input type="hidden" name="next" value="{{ next }}" />
</form>
</body>
</html>
```

アプリを登録します

```py:projectname/settings.py
INSTALLED_APPS = [
     'django.contrib.admin',
     'django.contrib.auth', # <- 登録されているか確認してください
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'whatever', # <- アプリ名を追記
 ]
```

## テスト

`python manage.py runserver`でテストサーバーを起動し、`http://localhost:8000/accounts/login/?next=/`にアクセスします。`?next=`以下はログイン後に移動させたいパスです

<img width="492" alt="Screen Shot 2018-02-16 at 8.03.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/79562/49f75522-0334-b451-037c-20b7901d1be9.png">

## まとめ

たったこれだけでログイン処理がつくれる、Djangoすごい！
Kerasを使って簡単にできる話者識別 - 準備 -

画像アップロードできなくなったから一時的に投稿（一回でも投稿してないとアップロードできなくなるらしい）
随時編集していく


マイクからの音声を学習させて誰が話した音声なのか識別をやってみようという話です．
画像認識に興味を持ち，その延長線上で何かできないかなって思いやってみました．
アプローチとかに関しては問題ありありのありだと思いますがそこら辺は目を瞑っていきたいと思います･･･
何回かに分けて投稿していこうと考えています．
## やりたいこと
- マイクからの音声を画像に変換，学習させてリアルタイムに誰が話しているかを識別する
- ライブラリを使って出来るだけ分かりやすく，専門知識がなくてもできるものにする

## この記事の内容
- どんな流れでやっていくか
- 環境どういうの使っていくか

## アプローチ

大体の流れはこんな感じ．
###__1. マイクからの音声をサウンドスペクトログラムに変換__
マイクからの音声データをサウンドスペクトログラムという周波数，時間，信号強度の3次元グラフに変換する．
![1.png](https://qiita-image-store.s3.amazonaws.com/0/237765/80583d75-848b-8bbb-3dac-1587fd7c3ac1.png)

###__2. 精度を良くするために画像に前処理__
そのままCNNに突っ込んでもいいんだけど，なるべく汎化性能を良くしたいので変換した画像に対して前処理を行う．
ここで音声に対して前処理を行わないで変換した画像に対して行っているのはマイクからの音声データをそのままサウンドスペクトログラムへ変換してしまったため（手抜き）
![2.png](https://qiita-image-store.s3.amazonaws.com/0/237765/ab2ece5b-f8ce-793d-6545-00dad931d699.png)

###__3. 学習モデルを作成して評価__
サウンドスペクトログラムからCNNのモデルを作成，そのモデルを使って誰が話しているのかを識別する．
![3.png](https://qiita-image-store.s3.amazonaws.com/0/237765/57ddb1b6-43d6-a6c1-157d-7d2410bea514.png)
今から始めるKinect v1.8 + Visual Studio 2017 開発環境構築


# はじめに
2017年の暮れ頃から、バーチャルYoutuberというフレーズがネットを賑わすようになった。
友人からも、バーチャルYoutuber四天王の5人(\*1)を紹介されたこともあり、とりあえず「バーチャルのじゃロリ狐娘youtuberおじさん(参考\*2)」を見たりしていた。

そんな中、職場の人からバーチャルYoutuberが動画作成に Kinect を使用するのだと、
(実際には少し違うかも知れないが)そんな話を耳にした私は家にある **Xbox360 Kinect センサー**を掘り出し、PCに繋いだのだった。

# 環境
開発環境の構成は以下となります。

## ハードウェア
* Windowsマシン
* Xbox360 Kinect センサー
* Xbox360 Kinect USB ACアダプタ(PC接続用)

## ソフトウェア
* Windows 10 Pro
* Visual Studio Community 2017 
* Kinect for Windows SDK v1.8 
* Kinect for Windows Developer Toolkit v1.8

# 準備
インストーラはそれぞれが数百MBの容量なので、先に全てダウンロードを始めてしまいます。

1. Visual Studio Community 2017 
https://www.visualstudio.com/ja/downloads/

2. Kinect for Windows SDK v1.8 
https://www.microsoft.com/en-us/download/details.aspx?id=40278

3. Kinect for Windows Developer Toolkit v1.8
https://www.microsoft.com/en-us/download/details.aspx?id=40276

# インストール
インストールを始めます。

まず、Visual Studio Community 2017 をインストールします。
インストール時にどのパッケージを入れるのか尋ねられますが、今回はC#がビルドできれば良いので、.Net デスクトップ開発を選択します。
![vs_install.png](https://qiita-image-store.s3.amazonaws.com/0/124578/ddbc08e6-0ad9-fb53-6354-dc27eda03165.png)

インストール先等はデフォルトのままVisual Studioをインストールします。

その後、Kinect SDK と Developer Toolkit も順次インストールします。
特筆することもないので、インストールの詳細は割愛します。

# Kinect の接続
開発環境が整ったら Kinect を接続します。
接続するとデバイスマネージャーに Kinect のデバイスがこのように表示されるようです。
![device.png](https://qiita-image-store.s3.amazonaws.com/0/124578/c18ce288-b870-b16c-f41b-d2e5f73375f6.png)

# サンプルコードのコンパイル
スタートメニューから **Kinect for Windows Developer Toolkit** を起動します。

起動後 "Samples: C#" から、"Color Basics-WPF" の "Install" を選択します。
![sample_dl.png](https://qiita-image-store.s3.amazonaws.com/0/124578/2aab697f-aa76-74e6-bdaf-573a5b940e68.png)
　※サンプルコードの保存先を聞かれるので適当にデスクトップに保存します。

保存したフォルダから、ソリューションファイル ColorBasics-WPF.sln を起動します。
![open_solution.png](https://qiita-image-store.s3.amazonaws.com/0/124578/007124c1-acd3-aa4e-8c3a-4e564a48459c.png)


ソリューションを開けたら、実行ボタンを押してプログラムを起動します。
![build.png](https://qiita-image-store.s3.amazonaws.com/0/124578/8b0f2851-5790-bf05-0929-51e40cdd2f3f.png)

# 結果
Kinect のカメラ情報を表示するプログラムを実行できました。

　　　　　＼!! Fox !!／
![kinect_test.png](https://qiita-image-store.s3.amazonaws.com/0/124578/df7d1f42-3ed6-4168-ed08-eb174170dacc.png)
　　　　
# おわりに
元々は Kinect+MMD(参考\*3, \*4) を触ってみようと思って引っ張り出してみたのですが、Kinectプログラミングも出来るらしいので、とりあえず開発環境だけでも構築してみました。

環境構築に四苦八苦するものと想像していましたが、意外と躓くことなく導入できたので驚きました(小並感)

# 参考
1. バーチャルYouTuberとは (バーチャルユーチューバーとは) [単語記事] - ニコニコ大百科
http://dic.nicovideo.jp/a/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AByoutuber

2. けもみみおーこく国営放送
https://www.youtube.com/channel/UCt8tmsv8kL9Nc1sxvCo9j4Q

3. Kinect v1をWindows10で使う方法+MMDで使う方法。
https://wpteq.org/windows/windows10-manual/post-22791/

4. kinectでMMDを動かしてみた | のんびりと生きたい
http://yoneyannet.com/kinect%E3%81%A7mmd%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/
UnityのUNETにおけるローカルLAN対戦の為のNetworkDiscovery

## 概要
細かい挙動までは書きませんが、UNETを調べるとLAN対戦をするとき

- サーバIP決め打ち+NetworkManagerのみ使用
- NetworkDiscoveryでサーバを探してNetworkManagerを使う
-  UNET Matching でサーバやクライアントを探してNetworkManagerを使う

の3パターンがあります。今回は真ん中の事を書きます。

あと、マジな話をするとNetworkManagerもNetworkDiscoveryも殆どのケースで継承したカスタム版を作ります。Unity標準のままで使う事は無いです。そうしないと管理できない事多過ぎです…

## NetworkDiscoveryの中身
NetworkDiscoveryのサーバ側は、自分の所在(IPアドレス)をLAN内にブロードキャストパケットを流すことで宣伝して回る
NetworkDiscoveryのクライアント側は、NetworkDiscoveryのサーバが流しているブロードキャストパケットを受け取った時に専用の関数を呼ぶ

という機能だけを持っている、と覚えておきましょう。
それ以外の実際のサーバ立ち上げや、クライアント接続などは全てNetworkManager側でやります。

## NetworkDiscoveryのサーバ側でプログラマが書くべきこと
NetworkManager側のStartHost()を最初に呼んでおきます。(純粋なサーバークライアントモデルの場合はStartServer()です）
その後にNetworkDiscovery内で
Initialize()して
StartAsServer()を呼びます。そうするとNetworkDiscoveryは自動に定期的に（デフォルトで1秒ごとに）ブロードキャストパケットを流します。

### 定期実行の停止
ゲームを始めます。対戦相手を締め切りました。ゲーム終わるまで追加のプレイヤーは受け付けないようにしたいです。みたいな場合は
StopBroadcast()してあげましょう。そして再びクライアント側を受け付けるときはStartBroadcast()を呼びます。


## NetworkDiscoveryのクライアント側でプログラマが書くべきこと
サーバ側と異なり、NetworkManagerのStartClient(NetworkManager.singleton.StartClient();  )は **いきなり呼ばないようにします**
なぜなら、この時点ではサーバのIPアドレスが分かっていないからです。

NetworkDiscovery内で
Initialize()して
StartAsClient()を呼びます。
そうすると、このクライアント側はNetworkDiscoveryのサーバが流しているブロードキャストパケットを受け取れるようになります。
受け取り先の関数は

```cs
public override void OnReceivedBroadcast(string fromAddress, string data)

```
です。

上に挙げた関数の中で、引数として受け取ったfromAdress(サーバのローカルIPアドレス)を **接続先であるNetworkManagerのnetworkAdress(NetworkManagerのクライアントが接続する先のサーバアドレス)にセットしてから** 、NetworkManager.singleton.StartClient(); を呼びます。

よろしいでしょうか。
以下、NetworkDiscoveryの継承先で書くサンプルコードです。自動でサーバに再接続もしてくれます。
(CustomNetworkDiscovery : NetworkDiscovery)

```cs

        /// <summary>
        /// NetworkDiscoveryのクライアント側がサーバの信号を受信したときに呼ばれる
        /// この関数は 本クラス内のどこかでStartAsClient()を呼ばないと機能しないし、サーバ側で呼ばれることは無い 
        /// 初期設定だと、クライアント上で約1秒間隔でこの関数が呼ばれる
        /// </summary>
        /// <param name="fromAddress">NetworkDiscoveryで見つけたサーバ側のIPアドレス</param>
        /// <param name="data"></param>
        public override void OnReceivedBroadcast(string fromAddress, string data)
        {
            //NetworkManagerのnetworkAddress(つまり、サーバのアドレス)に見つけたアドレスを入れる
            NetworkManager.singleton.networkAddress = fromAddress;
            //既にこのクライアントのNetworkManagerがサーバに接続済みなら何もしない。しかしクライアント側が切断して再接続の時はうまいことreturnせずにスルーして再接続する
            if (NetworkManager.singleton.IsClientConnected()==true)
            {
                return;
            }
            
            Debug.LogFormat("OnReceivedBroadcast; fromAddress: {0}, data: {1}", fromAddress, data);
            //NetworkManagerのクライアントが繋げる先のサーバアドレスを上で指定しているので、NetworkManagerのクライアントを開始できる
            NetworkManager.singleton.StartClient();
        }
```

## 余談、勝手にサーバになるやつ
最初に起動した人がサーバになる、という仕組みを作りたくなったら、
最初にNetworkDiscoveryのクライアントとして起動して、数秒待ってもサーバが見つからなければサーバとして振る舞う、って書くと良いです。
（この時にNetworkTransportのShutdownとか書いたほうが良いと思うよ！）
kintone プラグイン設定の移行メモ

ブラウザーの開発ツールを使ってプラグイン設定を移行する方法をメモしておきます。
kintone アプリをテンプレートから作成したり、他のアプリを流用した場合、プラグイン設定は引き継がれず未設定となります。
プラグイン設定内容が多いと、マニュアルで再設定するのは面倒だしミスしやすいので、簡単に設定内容を移行できる手順を考えてみました。

# プラグイン設定内容の取得
流用元のアプリで、プラグイン設定画面を開き、設定内容を読み込んだところで止めます。

新条件書式プラグインの例

```.js
    var CONF = kintone.plugin.app.getConfig(PLUGIN_ID);
    var TEXT_ROW_NUM;
    var DATE_ROW_NUM;

    if (!CONF.hasOwnProperty('line_number')) {
```

<img width="787" alt="2018-02-16_02h28_37.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/7f8729c9-62ee-ab37-1fe2-a2a34cc75229.png">


# プラグイン設定内容の保存

コンソール画面で、ローカルストレージにプラグイン設定内容を保存します。
変数名は、プラグインによって異なります。

```js
localStorage.setItem('key1',JSON.stringify(CONF));
```

JavaScript の実行を再開します。


# プラグイン設定内容の複写

移行先アプリのプラグイン設定画面を開き、設定内容を読み込んだところで止めます。
プラグイン設定内容の取得時と同じところです。

<img width="787" alt="2018-02-16_02h28_37.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/7f8729c9-62ee-ab37-1fe2-a2a34cc75229.png">

コンソール画面で、プラグイン設定内容をローカルストレージから読み込みます。
変数名は、プラグインによって異なります。

```js
CONF=JSON.parse(localStorage.getItem('key1'));
```

JavaScript の実行を再開します。

# プラグイン設定内容を確認

プラグイン設定画面で、内容を確認します。

<img width="880" alt="2018-02-16_02h47_25.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/191ae3fa-b90a-4089-e1ad-0014b4610926.png">


# ローカルストレージの削除

使用したローカルストレージを削除します。

```js
localStorage.removeItem('key1');
```

# 注意事項

プラグインによっては、本手順で移行できない場合もあります。
Capistrano 3でデプロイ先サーバのログインシェルがcshとかtcshだと色々エラーになってしまう件

# 背景
Capistrano3でデプロイしようと思って色々やってたら、よく分からないエラーで落ちた。ログを調べたところ、どうやらデプロイ先サーバのログインシェルがtcshであることが原因っぽい。Capistrano側の設定かなにかでどうにかしたい。

# 結論
**無理。**

# 詳細
Stack Overflowに質問があり、下の方にそれっぽい回答があった。
https://stackoverflow.com/questions/21809480/capistrano-3-to-set-bash-shell-on-server-instead-csh
この方法を試そうと思ったが、よくよく考えるとデフォルトタスクの中身を全て書き換えるということになり、到底現実的ではなかった。

また、Githubのissueがあがっていた。
https://github.com/capistrano/capistrano/issues/1870
色々コメントがあるが、要約すると「(t)cshの文法は全然スタンダードじゃないし、Capistrano3はsh系のスクリプトでしか動作保証しまへん」とのこと。残念。

SSHKitのソースコードを読んでも明らかに(ba)sh前提で書かれているようなので、やれることはなさそう。

# 解決策
**全サーバのログインシェルをbashにする**

# 余談
Capistrano 3が(t)cshだと動かないという事実はどこにも書いていなかったのですが、先ほどのissueの中で「ドキュメントに書いとけや」的な要望があったからでしょうか、公式ドキュメントに**一応**記載されました。
http://capistranorb.com/documentation/upgrading/
↑の最下部

# 最後に
古いサーバ等でデフォルトのログインシェルがcsh系になっており、何らかの理由でログインシェルを変更できない場合は諦めて他のツールを使うしかない状況です。別にいいんですけど。あるいはCapistrano2系であれば動くっぽいですが未確認です。もし何かいいやり方があれば教えてください。
スプラトゥーン2用iOSアプリ「めがほん」で利用しているライブラリ 

# めがほんとは

スプラトゥーン2で利用する、各ステージごとの細かな名称を決め情報共有を円滑にするためのiOSアプリケーションです。
AppStoreで公開しているので是非お使いください。
[スプラトゥーン2報告共有iOSアプリ「めがほん」](https://t.co/l42fXzG6ZD)

以下、Twitterでの機能紹介ツイートです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">リリース前に公開した動画をモーメントでまとめていく予定ですので<br>進化の歴史を楽しんでください👏<br> <a href="https://t.co/I7gPnwCzbH">https://t.co/I7gPnwCzbH</a></p>&mdash; めがほん (@megaphone_spl) <a href="https://twitter.com/megaphone_spl/status/897817108607770624?ref_src=twsrc%5Etfw">2017年8月16日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## [RealmSwift](https://github.com/realm/realm-cocoa)

ステージへの追加情報永続化のために使用

## [Alamofire](https://github.com/Alamofire/Alamofire)

ステージデータ取得のため使用

## [AlamofireImage](https://github.com/Alamofire/AlamofireImage)

ステージ画像取得のため使用
現状の機能だとAlamofireでも事足りるが役割を明確に分けるため利用

## [GestureRecognizerClosures](https://github.com/marcbaldwin/GestureRecognizerClosures)

タップ、ピンチなどのジェスチャ登録を簡易化するために使用

個人的には一番実装が楽になったと感じさせるライブラリでした。
UIGestureRecognizerでタップイベント時に何らかの処理をしようとすると

```swift

func setupUIRecognizer() {
	let tap = UITapGestureRecognizer(target: self, action: #selector(viewTapped))
 	self.view.addGestureRecognizer(tap)	
}

func viewTapped(recog: UITapGestureRecognizer) {
    print("タップされました")
}

```

Viewごとにselectorが必要となり煩雑です。
GestureRecognizerClosuresで実装すると

```swift

func setupUIRecognizer() {
	self.view.onTap { recog in
        print("タップされました")
    }
}

```
すごくスッキリしました。クロージャを利用しているためタップ時の処理が一塊りになってて見通しもよいと思います。

## [GoogleMobileAds](https://github.com/googleads/googleads-mobile-ios-examples)

アプリ内広告を表示するために使用

## [Cartography](https://github.com/robb/Cartography)

コードでのレイアウト変更を簡易化するために使用

## [SwiftyAttributes](https://github.com/eddiekaiger/SwiftyAttributes)

文字装飾を簡易化するために使用

## [FDTake](https://github.com/fulldecent/FDTake)

ライブラリから写真を選択するために使用

## [NVActivityIndicatorView](https://github.com/ninjaprox/NVActivityIndicatorView)

通信中のインジケータ表示のために使用
crowi-plus の Markdown 記法をカスタマイズする

# 注意
この記事でやろうとしていることは crowi-plus 自体の管理画面で設定を変更することで実現できるかもしれません。本記事に yuki-takei 氏がコメントをつけてくれているので、そちらを先にご確認いただくことをおすすめします。

# はじめに
crowi-plus の Markdown 記法をカスタマイズしたかった。というのも、スペース２つ打ちで改行するのがめんどいから。「これが Markdown のルールだから」と言われてもしらん。めんどいもんはめんどい。もっと言うと、非エンジニアに使ってもらう目的で使いたいので、一般的でないルールを押し付けたくない。

# crowi-plus 内の Markdown パーサ＆コンパイラ
内部的には markdown-it を使っている模様(crowi-plus@2.4.0-RC 時点)。`/resource/js/util/GrowiRenderer.js`  を見ると、Markdown　の前処理 (Preprocess) を定義して追加できそうだったのでやってみた。

# 前処理のカスタマイズ手順
/resource/js/util/Preprocessor に MyMarkdownFixer.js ファイルを新規作成する。ここには以下のようなコードを書く。

```
export default class MyMarkdownFixer {
  process(markdown) {
    // カスタマイズ例。普通に文章書いて改行するだけで<br>を挿入する
    var x = markdown
      .replace(/(?!^#{1,}[\s]+.*)\n/g, '<br>\n');
    return x;
  }
}
```

これを /resource/js/util/GrowiRenderer.js にインポートする。GrowiRenderer.js に以下のコードを追加。

```
import MyMarkdownFixer from './PreProcessor/MyMarkdownFixer';
```

次に GrowiRenderer クラスのコンストラクタ内で MyMarkdownFixer を使用するよう、コードを変更する。

```
this.preProcessors = this.originRenderer.preProcessors || [
  new Linker(crowi),
  new CsvToTable(crowi),
  new XssFilter(crowi),
  new MyMarkdownFixer(crowi), // <---- これを新規追加！
];
```

あとは crowi-plus をリビルドして再起動するだけ。かんたん！

追記：もっと真っ当なやりかたがあるのでは。知ってたら教えてください
Installing enebular-runtime-agent real quick. (Using Docker)

In this post, we will learn how to install enebular-runtime-agent on mac etc etc real quick. Takes 5 min of your time and 15 min of your computer time.

**Prereqs:** Downloading AWS IoT thing certificates for enebular-runtime-agent (https://qiita.com/BSatyaKishore/items/bf168cb2c7c759e751f2)

**STEP 1:**
Install docker.
Mac Users, use this link. https://docs.docker.com/docker-for-mac/install/

**STEP 2:**

- Create a folder. And add Certificates which you download from the AWS console in a certs folder. Download the root-CA.cert of amazon and add to this folder. Now, in the folder you created, create a new file called `Dockerfile`. Add the below lines of code in that file.

```
FROM satyakishore/enebularagent

COPY ./certs/ /enebular-runtime-agent/ports/awsiot/example/certs/
COPY ./config.json /enebular-runtime-agent/ports/awsiot/example/

CMD cd /enebular-runtime-agent/ports/awsiot/example/ && DEBUG=info npm run start
```

- Next create a config.json file add contents like this. Replace the <<Test>> with the thing name you created. Forgot? No worries, you can get it from the certificates folder. Replace the host address from see step MISC below.

```
{
  "host": "a3********qn69.iot.ap-northeast-1.amazonaws.com",
  "port": 8883,
  "clientId": "<<Test>>",
  "thingName": "<<Test>>",
  "caCert": "./certs/root-CA.crt",
  "clientCert": "./certs/<<Test>>.cert.pem",
  "privateKey": "./certs/<<Test>>.private.key",
  "topic": "aws/things/<<Test>>/shadow/update"
}
```

- Open terminal in this folder and run

`docker build -t enebularagentv2 .`

- Running the agent

`docker run --privileged -it enebularagentv2`

- You should see something like 
`internal: aws-iot: Connected to AWS IoT`

**Checks:**
Folder Structure should be something similar to
<img width="617" alt="Screen Shot 2018-02-16 at 1.40.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/222933/e9ee83d0-b106-c265-41c4-99aca3f5c96a.png">

**STEP MISC:**

1. Open **Manage > Things** on AWS console. <img width="1439" alt="Screen Shot 2018-02-16 at 1.31.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/222933/053c96af-0bb4-f09b-c91b-b76e0e8d2eef.png">
2. Click on your thing name. **Test** in this case. You should see something similar to this. Click on **Interact** in the left panel. <img width="804" alt="Screen Shot 2018-02-16 at 1.32.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/222933/b3d1f23f-3b83-2c2c-74da-fab571a67de9.png">
3. You should see something similar to this. Copy the highlighted code. That is the **host**. <img width="803" alt="Screen Shot 2018-02-16 at 1.33.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/222933/9112fe58-52fa-336f-7dd9-37cc3e60d1a6.png">
Downloading AWS IoT thing certificates for enebular-runtime-agent

1. Open AWS IoT. <img width="1061" alt="Screen Shot 2018-02-16 at 0.56.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/222933/d5f0aa54-04da-90ca-f0a0-c4ca3cb701d8.png">
2. It opens a console like this. <img width="1439" alt="Screen Shot 2018-02-16 at 0.57.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/222933/d71b7123-74a8-c405-dfb1-a21bbc05cc05.png"> 
3. Click on **Onboard** in the left panel. Then **Get Started**. <img width="1438" alt="Screen Shot 2018-02-16 at 0.58.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/222933/81e1b885-029c-4ac3-e7a9-d6e2ae9ef2f8.png">
4. It opens a page like this. Click **Get Started** in the blue. <img width="1439" alt="Screen Shot 2018-02-16 at 0.58.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/222933/b6868942-bc54-b3a9-fb79-c1d8fbe9a740.png">
5. Add a thing name. **Test** in this case. <img width="830" alt="Screen Shot 2018-02-16 at 0.59.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/222933/df5d8da0-2af7-b1ee-b164-0266e632da38.png">
6. Choose **Linux/OSX** as OS and **Node.js** as IoT Device SDK and click **Next** <img width="904" alt="Screen Shot 2018-02-16 at 0.59.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/222933/8fb86d6e-a7e3-a6a7-1fb5-b3cc6917c3ba.png">
7. Download the certificates kit by clicking on **blue Linux/OSX** button. And then required files will be downloaded in the zip format. Then click on **Next Step**. <img width="1433" alt="Screen Shot 2018-02-16 at 0.59.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/222933/d2e0487d-d66b-80f9-9973-7cabf41b0a35.png">
8. Click on **Done**. <img width="825" alt="Screen Shot 2018-02-16 at 1.00.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/222933/220c6c1b-cf99-5d4e-befe-36630f5d147a.png">
9. Unzipping the folder, you should see something similar to the below image. <img width="479" alt="Screen Shot 2018-02-16 at 1.13.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/222933/56ba54a3-66a3-b546-5c50-0394e759ee87.png">
10. **Congratulations your certificates are downloaded.**
Firefox で、アクティブなタブの幅を広くする方法

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

![Firefox](https://qiita-image-store.s3.amazonaws.com/0/205989/7c489e08-694a-edeb-daf3-7cdc6ec52f6d.png)
タブをいくつも開いていると幅が狭くなってしまい、タブのタイトルが読めなくなることがよくあります。
そういうときに、アクティブなタブだけ幅が広くなっていると読めるのになるなーと思ったので、ハックしてみました。

## 設定方法

1. スタイルシートによるカスタマイズを有効化
    1. `about:config` を開く
    1. `toolkit.legacyUserProfileCustomizations.stylesheets` を `true` に設定
1. スタイルシートを作成
    1. `about:support` を開く[^1]
    2. プロファイルフォルダーの「フォルダーを開く」をクリック
    3. 新規に `chrome` フォルダを作成
    4. `chrome` フォルダの中に、`userChrome.css`を作成
    5. `userChrome.css`に以下の設定を記載
6. Firefox を再起動

```css
.tabbrowser-tab[visuallyselected="true"]:not([pinned]) {
    min-width: 225px !important;
}
```

これで、アクティブなタブだけ幅が広くなります。
もとに戻すときは、`userChrome.css` を削除するだけでOK。
[^1]: ロケーションバー（URLの入力欄）に `about:support` と入力して Enter を押下

## ホバー時にも幅を広げる設定

非アクティブなタブにマウスカーソルをあてたときにも、タブの幅が広くなるようにもできます。
使いにくく感じるときもありますので、お好みでどうぞ。
![Firefox.gif](https://qiita-image-store.s3.amazonaws.com/0/205989/721d2e26-aa93-f7d0-44ea-ab75fa1550ca.gif)

1. `userChrome.css`に以下を追記

```css
.tabbrowser-tab:not([visuallyselected="true"]):not([pinned]):hover {
    min-width: 225px !important;
}
```

## 注意事項

Firefox のバージョンアップなどで動きがおかしくなったり、バグったりする可能性があります。
そのときは、`userChrome.css`を削除してください。
データベースの3層抽象化について

# この記事は

データベースが外部アプリケーションに対して、また内部物理ファイルに対してどのようにデータを持っているのか、改めて復習したかったのでそのメモである。
自分の解釈が間違っていたらゴメンナサイ。

# そもそもスキーマとは何か

データ構造、形式、関連、整合性制約を記述したものである。

RDBで言えばリレーション/アソシエーション設計にあたる。
単一のリレーション内における型定義や制約定義はもちろんのこと、データベース全体を通して各リレーションをどう管理していくかという設計まで含まれる。

外部レベル・概念レベル・内部レベルの3階層による概念モデルはANSI/SPARCによって提案されたもので、一般的にANSI/SPARCモデルと呼ばれる。

この3階層モデルには色々と派生があるようだが、今回自分があたったソースに則ると下記のように定義される。

 - 外部スキーマ

概念スキーマで定義された論理データから必要なデータを取り出したもの。RDBで言えばビューに相当する。

 - 概念スキーマ

DB上の論理データ。DBに保持するデータの要素およびデータ同士の関係を定義する。RDBで言えばリレーションに相当する。

 - 内部スキーマ

概念スキーマで定義された論理データをどのようにDBMS内部に格納するかを定義する。RDBで言えば「BTreeを用いる」とか「インターナルIDのハンドリング」とか「実際に吐き出すデータ形式」とかに（多分）相当する。

# データの独立性

3階層モデルによって何がうれしいかというと、各レベル間でのデータ独立性を担保できることである。

外部スキーマ/概念スキーマの分離は「論理データ独立性」を担保してくれる。
外部スキーマはアプリケーションから見るとインターフェースにあたるので、その実装はカプセル化できる。インターフェースに則ることで、実世界の変化による概念スキーマの変更を自由に行うことができる。これが「論理データ独立性」である。
「論理データ独立性」によって、インデキシングによるパフォーマンスチューニングやリレーションの再定義が可能になったりする。

概念スキーマ/内部スキーマ分離は「物理データ独立性」を担保してくれる。
概念スキーマに変更加えなければ、具体的にデータベース内部で行われる物理ファイル編成やデータアクセスの方式は自由に変更することができる。これが「物理データ独立性」である。
「物理データ独立性」によって、（あまりいい例が思いつかないが）オンプレで持っていたデータストアをクラウド化するといった変更も可能となる。吐き出すデータ形式とかも変更できたりする気がする。データベース自体のバージョンアップなどが可能となるためには、不可欠な独立性である。

# まとめ

内部スキーマに関しての理解が浅いことがわかったので、そっちを掘っていかんと。
pd.DataFrame: df.to_csv()で保存した複素数データをdf.read_csv()で読み込む方法

解決に数時間かかったのでメモします。

# 問題点
端的にいうと、
1. complex型でpd.DataFrameを作成
2. df.to_csv()でcsv保存
3. df.read_csv()でcsv読み込み
4. 型を調べるとobject型になってる
5. 色々頑張ったがうまくcomplex型に戻せない
といった感じ、詳細は以下のissueを参照。
https://github.com/pandas-dev/pandas/issues/9379

# 解決策
以下のissueでいい感じの解答。(上記issueの解答から飛べた)
https://stackoverflow.com/questions/16659818/how-to-read-complex-numbers-from-file-with-numpy

```read_df_complex.py
import pandas as pd

df = pd.read_csv('data.csv')
df = df.apply(lambda col: col.apply(lambda val: complex(val.strip('()'))))
```

# まとめ
pandasは複素数型に弱いらしい。あまり需要がないのかな。

# 余談
マークダウン記法いいね。
JavaScriptのプロトタイプチェーン（継承）について

JavaScriptのプロトタイプチェーンについて、いまいちよく分かっていなかったのですが
以下の２つを読んで、
どうやってプロトタイプチェーンを作るのかと、
プロトタイプチェーンがあるときのプロパティ解決の考え方が分かりました。

- [JavaScript] そんな継承はイヤだ - クラス定義 - オブジェクト作成
https://qiita.com/LightSpeedC/items/d307d809ecf2710bd957

- クラスの落とし穴3 - 継承
https://qiita.com/cocottejs/items/e75f751c7aa8a7361aab


結局のところ
MyDog < Dog < Animal < Object
のようなプロトタイプチェーンを作りたいときは以下のようにすればいいようですね。

#### サンプルコード
```javascript:MyDog.js
function Animal() {

}

function Dog() {

}

Dog.prototype = Object.create(Animal.prototype, {
    constructor: {
        value: Dog,
        enumerable: false
    }
});

function MyDog() {

}

MyDog.prototype = Object.create(Dog.prototype, {
    constructor: {
        value: MyDog,
        enumerable: false
    }
});
```

#### 動作確認

```javascript
var myDog = new MyDog();
console.log(myDog.constructor); // MyDog
console.log(Object.getPrototypeOf(myDog)); // MyDog

console.log(
    Object.getPrototypeOf(
        Object.getPrototypeOf(myDog))); // Dog

console.log(
    Object.getPrototypeOf(
        Object.getPrototypeOf(
            Object.getPrototypeOf(myDog)))); // Animal

console.log(
    Object.getPrototypeOf(
        Object.getPrototypeOf(
            Object.getPrototypeOf(
                Object.getPrototypeOf(myDog))))); // Object

console.log(myDog instanceof MyDog); // true
console.log(myDog instanceof Dog); // true
console.log(myDog instanceof Animal); // true
console.log(myDog instanceof Object); // true
```

上記から分かるように多重継承はできないようですね。
また、es6のclass継承では同じような処理をしているようですね。
続き　[JavaScriptのプロトタイプチェーン（継承）について　ES6のclass](https://qiita.com/maron8676/items/50e91b9f7d26c6f52926)
docker-composeで同じサービス名のサービスを複数起動する

# 概要

ローカル環境を`docker-compose`で管理していると、
同じサービス名を使いたくなることがあるが、
実は同じサービス名でもコンテナ名が競合していなければ問題ない。

# バージョン

```bash
# OS
$ uname -a
Linux centos7 3.10.0-693.11.6.el7.x86_64 #1 SMP Thu Jan 4 01:06:37 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

# Docker
$ docker -v
Docker version 17.12.0-ce, build c97c6d6

# docker-compose
$ docker-compose -v
docker-compose version 1.18.0, build 8dd22a9
```

# 構成

```bash
$ tree ./
./
├── test1
│   └── docker-compose.yml
└── test2
    └── docker-compose.yml
```

```yaml:test1/docker-compose.yml
version: '3'
services:
  test:
    container_name: test1
    image: busybox:latest
    command: tail -f /dev/null
```

```yaml:test2/docker-compose.yml
version: '3'
services:
  test:
    container_name: test2
    image: busybox:latest
    command: tail -f /dev/null
```

# 実行

```bash
# test1起動
$ cd test1
test1 $ docker-compose up -d
Creating network "test1_default" with the default driver
Creating test1 ... done

# test2起動
test1 $ cd ../test2
test2 $ docker-compose up -d
Creating network "test2_default" with the default driver
Creating test2 ... done

# 確認
test2 $ docker ps
CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS               NAMES
81469bf02855        busybox:latest      "tail -f /dev/null"   2 seconds ago       Up 1 second                             test2
615019dcbd0c        busybox:latest      "tail -f /dev/null"   9 seconds ago       Up 8 seconds                            test1
```
grepコマンド

ターミナルからgrepコマンドで検索を行った際、ヒット前後の行も出力したい場合

```
grep '検索したい文字列' [ファイルパス]
```

| オプション | 備考 |
|:-----------|------------:|
| -A       | マッチした行の後も指定した行数を出力する。| 
| -B     | マッチした行の前も指定した行数を出力する。| 

```
grep '検索したい文字列' -A 3 -B 2 //-> ヒットした行＋前2行＋後3行の表示
```


```
mysqlbinlog --no-defaults binlogfile | grep -A 2 -B 3 'hogehoge'
```
知ってるとちょっと便利なSiv3Dの基本的な機能

Siv3Dであれこれしてると、私はよく使っているのに身内のプログラマが知らなかった、みたいなのがすごく単純な機能でもしょっちゅう出てくるのでざっとメモ的に書いておきます。

## RectとRectF

Siv3DのリファレンスだとほとんどRectなので気づかない可能性があるんですが(もしかしたら全部Rectかも？)、RectFという小数が使えるdouble型のRectもちゃんとあります。

似たようなものとしてPoint型とVec2型があります。これも小数か整数かの違いしかないです。

Point型にもSize型とか色々亜種があったりするんですが、Visual Studioでカーソルを合わせると出てくるヒントみたいなやつ（インテリセンス）で
using s3d::Size = s3d::Point;
みたいに表示されるやつは全部同じものです。

C++のなんかめっちゃ難しい機能みたいに捉えられてるテンプレートに興味がある人は、このあたりのOpenSiv3Dのヘッダファイルを読んでみると勉強になるんじゃないでしょうか？私はこれでテンプレートをかなり理解できましたのでおすすめの教材(?)です。

## Vec2.asPoint()

先述の通りVec2型とPoint型はほぼintかdoubleかの違いしかないんですが、Vec2にはキャスト用の関数があるので必要な場面では使っていきましょう。

# Rect型(RectF型)の便利なメンバ

※変数名は気にしないで

```C++
Rect rect(100, 100, 10, 10);

Point hoge = rect.tl;//左上の座標　rect.posでも同じ数値
//Siv3Dだとプロパティなのでtlだが、
//OpenSiv3Dだと普通の関数なのでrect.tl()になることに注意

Point fuga = rect.tr;//右上

bl//左下

br//右下


Line piyo = rect.top;//長方形の上辺
/*私はrect.top.intersect()みたいな形で
衝突判定を取るときに良く使う気がする*/

Line aaaa = rect.right;//右の辺

left//左

bottom//下

Point c = rect.center;//長方形の中心の座標

```
それから
* rect.stretched
* rect.scaled  

この2つは色々引数があるのと、説明するより実際に使ってみた方が分かりやすいので動かしてみてください。文字通り、長方形を大きくしたりするやつです。


## Vec2.normalized()

ベクトルのSin、Cosの値が取れます

```C++
Vec2 v(10, 5);

Vec2 n = v.normalized();

//使用例がぱっと思いつかなかったので三角関数の公式でも……
double d = (n.x * n.x) + (n.y * n.y);//d = 1
```

私は最初から極座標的に管理してしまうのでぱっと思いつかないのですが、実装方法や順番によってはVec2::rotateと組み合わせたりしてこれを使い、そのまま移動速度を掛け算して元の座標に加算するといい感じに移動してくれる状況があるかもしれないですね

---

### おまけ
以下はOpenSiv3Dから実装された機能です。

## Array.shuffle
```C++
Array<int> hoge;
//hogeをシャッフルした新しい配列を作る
auto piyo = hoge.shuffled();

//hoge自体をシャッフルする
hoge.shuffle();
```

これは便利。例えば[トランプ描画機能と組み合わせて使う](https://qiita.com/para7/items/fe16e75fca7ae4e974e6)(ダイマ)などが考えられますね。

なんかまだ書き忘れてるような気がするのでそのうち追記するかもしれません。
TypeScript で型安全に Slack の Incoming Webhook を扱う

Slack の Incoming Webhook のラッパーライブラリはいくつかありますが、型定義がなかったり、あっても any になってしまっていて、型のサポートを受けることができません。

[Slackのドキュメント](https://api.slack.com/incoming-webhooks) は見にくいし、ドキュメントを見にいくのも面倒なので __型定義がそのままドキュメントになる__ ような npm ライブラリを作ってみました。

## [starhoshi/typed\-slack](https://github.com/starhoshi/typed-slack)

![vscode\.gif \(898×298\)](https://raw.githubusercontent.com/starhoshi/typed-slack/master/assets/vscode.gif)

VSCode の補完のサポートを受けながら開発できます。
パラメータの説明もドキュメントコメントに書いてあるので、それを見ながら何を使うか判断していけます。


## Installation

```
npm install typed-slack
```

## Usage

import して new して send するだけです。 return は Promise です。

```ts
import * as Slack from 'typed-slack'

let slack = new Slack.IncomingWebhook('https://hooks.slack.com/services/.......')
slack.send({ text: 'text' }).then(e => {
  console.log('success')
}).catch(e => {
  console.error(e)
})
```

### オプションを使う

[typed\-slack\.d\.ts](https://github.com/starhoshi/typed-slack/blob/master/out/typed-slack.d.ts) に型定義があります。これを見ながら or 補完を頼りにオプションを書いていけます。

```ts
const options = <Slack.IncomingWebhookOptions>{
  text: '@star__hoshi Hi!',
  channel: 'debug',
  icon_emoji: ':smile:',
  link_names: 1,
  attachments: [
    {
      color: Slack.Color.Danger,
      fields: [
        {
          title: 'Priority',
          value: 'High',
          short: false
        }
      ],
      image_url: 'http://my-website.com/path/to/image.jpg',
      ts: 123456789
    }
  ]
}
await slack.send(options)
```

## おわり

TypeScript で Incoming Webhook 使う人は使ってみてください :pray:

[starhoshi/typed\-slack: Type\-safe slack client for TypeScript\.](https://github.com/starhoshi/typed-slack)
０からさくらVPSでPostgresSQLサーバを構築

# 目標

## さくらVPSでCentOS7の環境でPostgresSQLをインストールし外部接続できるようにする

※PostgresSQLは好きなバージョンを入れる。バージョンにあわせてパスの数字を変えること。

以下のサイトでPostgresSQLのバージョンのURLをコピーしてコマンドに入力する
https://yum.postgresql.org/repopackages.php

![Postgres.png](https://qiita-image-store.s3.amazonaws.com/0/230829/bf0e7dbe-0548-7564-850c-6ad3a5024d46.png)

```sh:PostgresSQLダウンロード（URLは上記のサイトから取得）
sudo yum -y install https://download.postgresql.org/pub/repos/yum/9.4/redhat/rhel-7-x86_64/pgdg-centos94-9.4-3.noarch.rpm
```

```sh:PostgresSQL周りのツールをインストール
sudo yum -y groupinstall "PostgreSQL Database Server 9.4 PGDG"
```

```sh:PostgresSQLの初期化
/usr/pgsql-9.4/bin/postgresql94-setup initdb

Initializing database ... OK
```

```sh:PostgresSQLの起動
sudo systemctl start postgresql-9.4.service
```

```sh:PostgresSQLの起動（システム　起動時）
sudo systemctl start postgresql-9.4.service
```

```sh:PostgresSQLのユーザパスワード設定
sudo passwd postgres

Changing password for user postgres.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
```

```sh:実行ユーザをpostgresに変える
su - postgres
```

```sh:PostgresSQLの実行画面に移動
bash-4.2$ psql
could not change directory to "/root": Permission denied
psql (9.4.16)
Type "help" for help
```

```sh:PostgresSQLのユーザのパスワード変更とバージョン確認
postgres=# \password
Enter new password:
Enter it again:

postgres=# SELECT version();
                                                    version
--------------------------------------------------------------------------------
--------------------------------
 PostgreSQL 9.4.16 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.8.5 2015
0623 (Red Hat 4.8.5-16), 64-bit
(1 row)

#PostgresSQL終了
postgres=# \q
```

```sh:PostgresSQLの外部接続のため設定変更
vi /var/lib/pgsql/9.4/data/postgresql.conf

#追加箇所
listen_addresses = '*'
#listen_addresses = 'localhost'         # what IP address(es) to listen on;
```

```sh:PostgresSQLの外部接続のため設定変更(解放)
vi /var/lib/pgsql/9.4/data/postgresql.conf

# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
#追加箇所
host all all 0.0.0.0/0 md5
```

```sh:PostgresSQLを再機動：読み込み直し
sudo systemctl restart postgresql-9.4.service
```

```sh:ポート番号を開ける＆ファイアーウォール再機動
sudo firewall-cmd  --permanent --add-port=5432/tcp
sudo firewall-cmd --reload
```

```sh:開いてるポート確認
firewall-cmd --list-all
```

外部との接続確認：A5M2というツールを使用しゲストPCからの外部接続に問題ないこと確認

![Postgres2.png](https://qiita-image-store.s3.amazonaws.com/0/230829/8825a149-d61e-7626-cf26-26ef022d25ad.png)
:first-child、:last-childが効かない！！問題について


## :first-child、:last-childとは
CSSの擬似クラスの一つです。
ある要素内で最初、もしくは最後に現れる子要素を対象にスタイルを適用します。
いくつか同じ要素や同じクラスのがタグが入っていて、何番目のタグだけに他と異なるスタイルを当てたい時に
使います。


ただ時折、なぜかスタイルが当たらない！！という事態に陥ります。

## 原因
:first-childの定義の勘違いが主な原因です。
最初に現れる子要素、という指定は、指定したプロパティの中で最初に現れるこ要素ということではなく、**全てのタグを含めた初めに現れる子要素**という意味です。
どうゆうことかというと。

```html
<div>
  <h1>title</h1>
  <p>mozi</p>
  <p>mozi</p>  
  <p>mozi</p>
  <p>mozi</p>
</div>
```

<img width="600" alt="スクリーンショット 2018-02-16 0.06.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/237008/41ba8d50-4de8-b48a-9208-99c8b406684e.png">
このコードの一つ目のpタグにスタイルを当てたいと設定します。この場合…

```css
div p:first-child {
  color:red;
}
```
<img width="600" alt="スクリーンショット 2018-02-16 0.06.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/237008/41ba8d50-4de8-b48a-9208-99c8b406684e.png">

としても、スタイルが当たりません。
ここでのfirst-childとはh1のことになるので、pのfirst-childなんていないよと見なされてしまうからです。
なので、この場合

```css
div p:first-of-type {
  color:red;
}
```


<img width="401" alt="スクリーンショット 2018-02-16 0.06.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/237008/d2bf9a4e-e5aa-41c1-3020-67f882fbdb65.png">

とするとお目当てのセレクタにプロパティが当たります。

## 結論
:first-child、:last-childは全てのタグを含めた初め、終わりに現れる子要素という指定方法。
VSCodeの拡張機能を修復目的で再インストールする時に気をつけた方がいいこと

備忘録も兼ねて。

結論をざっくり言うと、
**拡張機能をアンインストールしても .vscode/extensions/ に残ってたりするので繰り返しても正常に機能しない場合はちゃんとそこにある該当フォルダも消してから再インストールしてみよう**
ということです。

以下余談です。

---

# まれに拡張機能がおかしくなる

VSCode、まれに拡張機能がおかしくなったりします（主に本体や拡張機能のアップデートのタイミングあたり）
筆者が経験した例として、**インストールした拡張機能が依存しているnpmパッケージが足りていないがために拡張機能が起動できない**というものがありました。
VSCodeの開発者ツールを開いてみると `Can not find module` などの文字が…

# 拡張機能の再インストール

とりあえずかんたんにどうにかするために拡張機能の再インストールを試みます。
拡張機能の一覧から選んで`アンインストール`をポチるとアインストールされて再起動などする流れになります。

# 再インストール。しかし

再起動などして再インストールを行います。
ここで妙に早くインストールが終わる事が多いので人によっては怪しんだことがあるかもしれませんが…
実はこの時、拡張機能は実際には消えていません。
windowsなんかだと `<ユーザー名>/.vscode/extensions` あたりに行くとわかりますがしっかり残ってます。

アンインストールを行うと、 `.obsolete` ファイルが `extensions` フォルダに現れます。
そこにはアンインストールした拡張機能のリストが載っています。

この状態で改めて再インストールをすると、`.obsolete`がいなくなるだけな上元の拡張機能には特に変化が起こりません（※）。
そのため、おかしくなった拡張機能を入れ直す目的で行っても全然思った通りにいきません。

# 結局

vscode上でのコマンドで古い拡張機能をディスクから削除するようなコマンドが見つけられなかったので（どこかにあるのかもしれませんが…）
筆者はextensionsの中の該当拡張機能フォルダをまるごと削除し、再インストールを行うことで事なきを得ました。

---

※ `npm update` くらいやってくれないもんかと思ったんですがどうもやってるように見えませんでした（しっかり検証したわけではないですが）
JavaScript 3桁毎のカンマ表示

#Javascript 数値をカンマ区切りにする

```html:javascirpt

var number = 123456789;
console.log(number.toLocaleString());// -> 123,456,789

```
[MDN マニュアル](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/toLocaleString)
ソースインストールのApacheにmod_wsgiいれたい

Webプログラマーではないんですが、前からなんか色々と作りたいものがあるときに便利そうなのでWebフレームワークを入れたかったのですが、重いのはちょっとなぁ。。と思ってました。

自宅サーバーはなんかあったらpython で書いていて、PHPは入ってないので、

- Pythonで軽くかけるWebフレームワーク
- そんなにインストールがめんどくない

というWebフレームワークで Bottleというのがあったので入れてみることにしました。

---

#Apache が動いてる環境で mod_wsgi いれたいだけ

自宅サーバーはすでにApacheが動いてるので、それに載せたい、ので「Apache bottle」で検索するとすぐ出てくるし、シンプル Webフレームワークというだけ記事も短く簡単そうに見えます。

一例：
[Python（bottle）をApacheで動かす](https://re-engines.com/2017/05/22/python%EF%BC%88bottle%EF%BC%89%E3%82%92apache%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99/)

ただ、大体の記事は。。CentOSは標準でApacheが入ってて、それを参照するようなていで書かれていますが。。mod_wsgi というたった一つのインストールではまります。

なぜかというと。。

***＿人人人人人人人人人人人人人人人人人人＿***
***＞　うちのApacheはソースインストール　＜***
***￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣***

#ソースインストールのApacheと基本インストールのApacheの差

Apacheは一番使われているWebサーバーなんですが、それ故更新も多く、公開リポジトリからソースを拾ってきて最新版をインストールする事が多くて、OSに基本インストールされているものをそのままつかっているのは稀な気がします（普通は上書きインストールしてるのか？とも思いますが）

基本、ソースインストールと基本インストールは参照パスが違います。

参考：[Apacheの設定ファイル httpd.confの場所](https://qiita.com/s2maeda/items/21d9458e44f86597d1ae)


#差分を埋めながらインストール、設定する

###1. .so ファイルのリンクを張って参照できるようにする。

``` bash
cd /usr/local/apache2/modules/
mod_wsgi.so -> /etc/httpd/modules/mod_wsgi.so
```
###2. httpd.conf はインストール先のファイルをいじる

いじるファイルは /etc/httpd/conf/httpd.conf じゃなくて、

```bash
vi /usr/local/apache2/conf/httpd.conf
```
です。

追加する内容は一緒ですが
```
LoadModule wsgi_module modules/mod_wsgi.so
WSGIScriptAlias /wsgi /usr/local/apache2/htdocs/adapter.wsgi
```
と、モジュールのロード場所も気を付けます。

※余談
WSGIScriptAlias のコマンドは詳細はないんですが、 「WSGIScriptAlias [web時アドレス] [実ファイルパス] 」っていう内容らしいですが、あんま詳細書いてあるところない。。


###3.ファイルは htdocs に置く

よくサンプルでは

/var/www/html/adapter.wsgi

というファイルを作れってあるんですが、ソースインストールの場合は /usr/local/apache2/htdocs　がデフォルトの参照場所になってる事が多いので

× /var/www/html/adapter.wsgi → ○ /usr/local/apache2/htdocs/adapter.wsgi

に置くと参照できます。

###4. アドレスは<span>http</span>//なんか.com/[web時アドレス]にアクセス

これもなんかほかのブログでは「ふつうにつながりますけど」みたいな体で書かれているんですが、WSGIScriptAlias の第一引数がURLの後ろにつくのがお決まりらしいです。

#だから Apache が動いてる環境で mod_wsgi いれたいだけなんだ

なんかいろいろと駆け足に「こうやればできますわぁ（どやぁ」って記事が多いのですが、個人的には一個一個引数の意味があるドキュメントみたいな説明が欲しいですね。。本でも一冊買えよって話なのかもしれないですが、、気軽にインストールとは。。
Rubyでlsをする方法

<h2>Rubyでlsをする方法</h2>
<p>
Dir.glob("*") によってterminalの「ls]と同じ挙動をします。
</p>

```irb:irb

Dir.glob("*")
=> 現在のディレクトリのファイル名の配列 
```

<h2>解説</h2>
<p>Rubyでファイルシステムを扱うためのクラスにはDirがあります。<br>

terminalの cd に相当するDir.chdir, pwdに相当するDir.pwdなどは存在しますが、
lsに相当するメソッドはありません。<br><br>

なので代わりに特定のファイルを検索するDir.globを使用します。
Dir.globに任意のファイルにマッチする"*"を渡すことですべてのファイルの一覧が取得できます。<br><br>
</p>


<table>
 <caption>参考:TerminalのコマンドとRubyのメソッドの対応表</captaion>
 <thead>
   <tr>
    <th>terminal</th>
    <th>ruby</th>    
   </tr>
 </thead>
 <tbody>
   <tr>
     <td>pwd</td>
     <td>Dir.pwd</td>
   </tr>
   <tr>
     <td>cd</td>
     <td>Dir.chdir</td>
   </tr>
   <tr>
     <td>ls</td>
     <td>Dir.glob("*")</td>
   </tr>
 </tbody>
</table>

<h2>おまけ</h2>

Dirクラスに他にどんなメソッドがあるかをしりたければ、以下のコマンドで素早く把握できます。

```irb:irb
Dir.methods - Object.methods
```