OmniAICreator/Qiita-1.07M huggingface dataset:
PlantUMLのクラス図からスケルトンコード生成

# 初めに
[PlantUML](http://plantuml.com/)で初めてクラス図を書いた。クラス図の素晴らしさに気付いた…

という事でクラス図からC#のスケルトンコードを生成してくれる機能が形になってきたので公開します。
Unityのエディタ拡張で作った機能になります。

※PlantUMLの書き方が自分基準のため、動作しない場合があります

# PlantUMLとは
テキストベースでUMLが作れるツールです。
↓こんなのができます。今回作った機能の大まかなクラス図です。
![Class@1-64.png](https://qiita-image-store.s3.amazonaws.com/0/161730/7186844e-a67f-dc47-48d4-b87aa40d6f24.png)


# 機能
## スクリプトファイルの作成
クラス図に書かれているクラス名とかのcsファイルを作ります。
対応しているのは
・class
・abstract class
・interface
・enum
です。
「class ~」とか書かれておらず、名前だけ出てきた場合はクラスとして扱われます。

## メンバの宣言
作成したファイルの中に書かれているメンバを宣言します。
+とか-もpublic、privateに変換します。
変数の場合は最後に「;」がなければ付けてくれます。
メソッドの場合は最後に「{}」を付けます。返り値も一応記述されます。
他はクラス図に書かれているものをそのまま宣言するので気を付けてください。

## 継承元のメソッド宣言
abstractなメソッドやinterface内のメソッドは継承したクラスにも宣言します。

## using宣言
使用している型を元に必要なusing宣言をしてくれます。
例）
「List<*>」を使用すると
↓
using System.Collections.Generic;
をスクリプトの最初に宣言します。

## 指定using宣言
enumを除くファイル全てに指定したusingの宣言をします。

# 使い方
## ウィンドウを開く
メニューバーの「UML/ConvertWindow」をクリックするとウィンドウが表示されます。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/161730/6b3ed02b-007b-f9db-2de9-5fcdd30317d6.png)
↓
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/161730/08cf9f44-7a4d-547f-22c7-8e0afcad7c67.png)


## 項目の説明
### ・対象クラス図
変換したいクラス図を指定して下さい。
TextAssetに対応した拡張子じゃないと駄目です。
きっとそのうち修正します。

### ・生成フォルダ
生成するスクリプトを入れるフォルダのパスです。

### ・矢印パターン
クラスとかに線を引くときの矢印のパターンです。正規表現です。
「(?:)」の中に書いて下さい。左パターン右パターン両方書かなくちゃいけません。
かなり面倒だから何とかならないか考え中です。
「{dir}」の部分は「@"(?:|right|left|up|down|r|l|u|d)"」に置き換わります。

設定しなくても動きますが「class ~~」といった宣言を行わない場合は生成されません。

最初から設定されている矢印は「<|--、--|>、<--、-->」の４パターンです。
使用している矢印のパターンを書きましょう。

### ・左継承矢印パターン
継承を指している矢印のパターンです。
継承処理が行われませんが設定しなくても動きます。

### ・右継承矢印パターン
継承を指している矢印のパターンです。
継承処理が行われませんが設定しなくても動きます。

### ・名前空間の非生成
チェックを入れるとネームスペースの宣言を行いません。

### ・メンバの非生成
チェックを入れるとメンバ宣言を行いません。

### ・宣言するusing
enumを除く全ファイルに宣言されるusing名を指定できます。

### ・オプション保存ボタン
今まで設定したオプションを保存できます。

### ・オプション読み込みボタン
保存したオプションを読み込めます。

### ・チェックボタン
ファイル作成は行わず、Debug.Logで生成内容を確認出来ます。
「----ファイルパス----」から「----end----」で囲まれているのが内容になります。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/161730/e7526ea9-627e-e962-0fc2-14aebd5a4123.png)

### ・生成開始ボタン
ファイル作成を開始します。
同名のファイルがあった場合は上書きされません。おそらく。
自己責任でお願いします。

# 実践
## スクリプトを使用したいUnityプロジェクトへ
https://github.com/Tanakancolle/Core
https://github.com/Tanakancolle/PlantProject
の二つのスクリプトを使用したいUnityプロジェクトの「Assets」フォルダ内に持ってきましょう。
git管理を行っているならサブモジュールとして持ってくるのが楽です。
※画像はSourceTreeでサブモジュールを追加する場合です
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/161730/5fbdf750-a83d-a54c-58ea-7fbb3c31b37a.png)
↓
![キャプチャ２.PNG](https://qiita-image-store.s3.amazonaws.com/0/161730/5555be8b-db39-62fc-04c6-658a7ef4f879.png)

## 実行前
実行前の画像です。対象クラス図は今回の機能のクラス図です。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/161730/0f5384ee-e9d1-3a68-95e2-28af7ef4a093.png)


## 実行後
実行後の画像です。Testフォルダ以下にスクリプトファイルが出来ます。
![キャプチャ２.PNG](https://qiita-image-store.s3.amazonaws.com/0/161730/b8de1a9a-d775-bb58-fa32-092ffe3d336c.png)

# Git
本体：https://github.com/Tanakancolle/PlantProject
依存：https://github.com/Tanakancolle/Core
初めてMac買った。

娘（２歳）のパソコンにするという体で MacBook Pro 買いました:laughing:

タッチバーは無いやつです。ヤマダ電機で安めのを適当に買ったので、スペック等はそんなにいいやつでは無いと思われます。プログラム書いて遊ぶなら困らないと店員さんは言っていたぐらいのやつです。

娘が寝るまではyoutube見せたり写真見せたりして、
今は僕が借りている体でMacで遊んでいます。

そんな中リテラシーが低すぎて困ったことメモです。
というか嬉しいので調子に乗ってMacで何か書きたいだけです。

# 初期設定画面の「進む」的なボタンでEnter押しても反応しない
何度押しても反応しない。
やけになって色々押したら、Spaceで反応した。ほう。


# トラックパッドでクリック
タップしても連続タップしても何も反応しない。長押しもダメ。
ぐぬぬと思ってチョット強く押したらグニュってなって反応した。ほう。
箱に入ってる説明ペラ見たら書いてあった。。。

# `BackSpace`が無い？？
わけではなく`Delete`がWindowsの`BackSpace`な動きをする。ほう。
むしろ右を消すKeyが無い。（のかな？）


# 「Mac」って打ちたいのに「Mあc」ってなって`F10`押したらミュートになった
やりたいことはそれじゃ無い:pensive:`fn`と一緒に押せばいいのね。
やだ。設定変えてやる。
こちらを参考にしました。
http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-use-function-key-as-default-in-mac-os.html

![image](https://qiita-image-store.s3.amazonaws.com/0/84259/ac29bb75-7a0f-46a2-c611-b8afd8f30901.png)

# トラックパッドで右クリックのやり方がわからない
ググったら２本指でクリック（グニュってなるやつ）だそう。ほう。
https://digitalfan.jp/14335
設定も変えられるそう。
![image](https://qiita-image-store.s3.amazonaws.com/0/84259/b6fdc010-9689-9d3c-c274-c6b7fa974736.png)

# Windowsの`Win+D`的なやつ
ググった。ただ`F11`（初期設定のままなら`fn+F11`）

# この記事書いててスクリーンショットの撮り方がわからない
ググった。`shift+command+4` → `space` → クリック でデスクトップにファイルができた。ほう。
参考
https://support.apple.com/ja-jp/HT201361

# `delete`でファイルが消せない
スクリーンショットのファイル消そうと思ったら消えない。。。
`command+delete`なのね。ほうほう。
http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-handle-file-with-mac-finder-keyboard-shortcut.html


---

まだ使い方はわかってないけど、起動も早いし、タッチパッドなんかいいし、気分もいい:laughing:
Riot.jsのLifecycle


http://riotjs.com/api/#events

ドキュメントに記載の通りだけどReactみたいにマウント時のイベントがいくつかあります。

書き方は`on`もしくは`one`で記載することができます。

```tag:todo.tag
<script>
this.on('mount', () => {

});
</script>
```

## before-mount

タグがマウントされる直前に一度だけ呼ばれます。
タグの初期化処理などはここで書くようになると思います。

## mount

タグがマウントされた直後に一度だけ呼ばれます。

## update

タグが更新される直前に呼ばれます。
これは値が更新される度に呼ばれることになります。
場合によりけりですが何度もupdateが呼び出されると不都合がでる場合があります。そういうときは`one`を使うことで呼び出しを
1度だけにすることができます。

```js:todo.tag
this.one('update', () => {
	
});
```

## updated

タグが更新された直後に呼ばれます。
`update`と同じように更新される度に呼ばれます。

## before-unmount

タグのマウントが解除される直前に呼ばれます。
後処理などはここで書くことができそうです。

## unmount

タグのマウントが解除された直後に呼ばれます。

## 入れ子のカスタムタグのマウント

基本的には親タグが読み込まれたときい子タグも同時にマウントされます。

```js:app.js
import 'app' from './app.tag'
import 'header' from './header.tag';
import 'todo' from './todo.tag';

riot.mount('app');
```

```tag:app.tag
<app>
	<header></header>
	<todo></todo>
</app>
```

予めimportで読み込んでおく必要はありますがこれで子タグのマウント処理も行うことは可能になってくると思います。
Apache2.4.37 + PHP7.3 on Windows10_64bit環境構築

# 概要
- 環境構築した備忘録です。
- まったくセキュリティを考慮していません。
- 2018/12/16時点での情報です。

## Download
- [Apache2.4.37](https://www.apachelounge.com/download/)
- [PHP7.3](http://windows.php.net/download/)
 - [古いVersion：PHP archives for Windows](https://windows.php.net/downloads/releases/archives/)

## Apache環境構築
### 1. zip解凍
- 例）C:/Dev/Apache24

### 2. 環境変数のpathに追加
- 例）C:/Dev/Apache24/bin

## PHP環境構築
### 1. zip解凍
- 例）C:/Dev/php

### 2. 環境変数のpathに追加
- 例）C:/Dev/php

### 3. php.ini-developmentをコピーしてphp.ini作成


## ApacheとPHPの連携設定
- httpd.confを編集(追記)

### phpモジュールおよび拡張コンフィグ読み込み
```php:httpd.conf
Define SRVROOT "C:/Dev/Apache24"
:
LoadModule php7_module C:/Dev/php/php7apache2_4.dll
:
# Configure php7_module
<IfModule php7_module>
Include conf/extra/httpd-php.conf
</IfModule>
```

### 拡張コンフィグ作成(httpd-php.conf)
```php:conf/extra/httpd-php.conf
AddHandler application/x-httpd-php .php
PHPIniDir "C:/Dev/php"
```

## PHPとMySQLの連携設定
- php.iniを編集(行頭の;消す)

```ini:php.ini
:
extension_dir = "ext"
:
extension=pdo_mysql
```

## 動作確認
- index.phpを作成

```php:index.php
<?php
phpinfo();
```
- C:/Dev/Apache24/htdocs/配下に保存
- Apache(C:/Dev/Apache24/bin/httpd.exe)を起動
- Webブラウザでアクセスしてphpの情報が表示されればOK。
(http://localhost/index.php)

　
>### index.phpを省略してアクセスしたい場合
(http://localhost/)

- DirectoryIndexにindex.phpを追加します。

```php:httpd.conf
<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>
```

 

* * *
- [MySQL5.7環境構築は過去記事へ](http://qiita.com/sireline/items/0c2d7d308d3c9722e48d)
MutationRecordを使用してdomの追加からclass変更までを監視する

データのロード時間の計測（ロード中表示用のDOMを監視）とか、Seleniumでテストするときにロードを待つとか使えそうな感じ。
人に聞かれたときにうまく答えられなかったので、次は答えられるように記載。

参考資料
[存在していないDOM要素を検知する方法](http://terabytesmemo.hatenablog.jp/entry/2016/01/28/165714)
https://developer.mozilla.org/ja/docs/Web/API/MutationObserver
[JavaScript初級者から中級者になろう - 十七章第一回　MutationObserver](http://uhyohyo.net/javascript/17_1.html)

```js
var observeTo = "foo";

var documentObserver = function() {
    var option = { childList: true, subtree: true, attributes:true };

    var observer = new MutationObserver(findClassListener);
    observer.observe(document.body, option);

    return observer;
};

var findClassListener = function(mutation) {

    mutation.forEach(function(m) {
        var nodes = m.addedNodes;
        var targetNode = m.target;
        for(i=0; i<nodes.length; i++) {
            if (nodes[i].classList.contains("foo")) {
                console.log("A " + observeTo + " class DOM is generated !");
            }
        }
        if(nodes.length == 0 && targetNode.classList.contains('change')){
            console.log("changed!!!");
        }
    });
};

documentObserver();
var rendered = document.createElement("div");
rendered.className += ' ' + "foo";
document.body.appendChild(rendered);
window.setTimeout(function(){
  console.log("timeout");
  var renderDiv = document.getElementsByClassName('foo')[0];
  renderDiv.className = 'change';
},1000);
```
UIWindow と Multitasking

`AppDelegate` でもともとこのよう

``` swift
self.window = UIWindow(frame: UIScreen.main.bounds)
```

iOS 9 から、Multitasking を活用に、 iPad では UIWindow の大きさが変化されるようになって、その理由で、 UIWindow を生成するときは frame の設定は必要ないになる。

今はこのようになって - 

``` swift
self.window = UIWindow()
```

iOS は自動的に UIWindow の大きさを適当に設定くれる。

## cf.

- [WWDC 15 - 205 - Getting Started with Multitasking on iPad in iOS 9](https://developer.apple.com/videos/play/wwdc2015/205/)
scalaでエコサーバーをつくったよ

弟子入り中につくったものをはてブに投稿したのでこちらにも書いてみます！

#エコーサーバーとは？

ブラウザ（クライアント）から送られてきたhttpリクエストに対して、httpレスポンスでリクエストの内容をそのまま返す！それがエコーサーバーです。

（通常はここでhtmlファイルや画像を返す）

なので、ブラウザに「GET / ~~」（←リクエスト文）みたいな文字列が表示されるのがゴールです。

#概要はこんなかんじ

1.使えるjavaのパッケージをインポート（下記のリンクあり）
2.サーバーソケットを生成
3.while文の中にコードを書いていってサーバーソケットはacceptし続けるようにする
4.入力ストリームを作成しhttpリクエストを読み込む
5.出力ストリームを作成しhttpリクエスト文を送り返す
6.ソケットを閉じる

#実装コード紹介

```scala:httpserver.
 import java.net.ServerSocket
 import java.net.Socket
 import java.io
 import java.io.InputStream
 import java.nio.charset.StandardCharsets
  
  object HTTPServer {
    def main(args: Array[String]): Unit = {
       println("Hello HTTP Server!Strat----->")
       //サーバーソケットを生成しポート番号をバインドする
       val serverSocket = new ServerSocket(8000)
       println("Serving HTTP on localhost port 8000 ...")
        while (true) {
          //サーバーソケットはacceptし続けて待機
          val socket = serverSocket.accept()

         //input--httpリクエストを読み込む
         val input = socket.getInputStream
         def readUntilEnd(is: InputStream, acc: List[Int] = Nil):String ={
           is.read :: acc match {
             case x if x.take(4) == List(10,13,10,13) => x.reverse.map(_.toChar).mkString //10,13は改行
             case x                                   => readUntilEnd(is, x)
           }
         }
   
         //output--httpリクエストを送り返す
         val output = socket.getOutputStream
         val CRLF = "\r\n"
         val responseBody = readUntilEnd(input)
         val responseBodySize = responseBody.length
         val responseText = "HTTP/1.1 200 OK" + CRLF +
                            "Content-Length: " + responseBodySize + CRLF +
                            "Content-Type: text/plain" + CRLF +
                            CRLF +
                            responseBody
         output.write(responseText.getBytes(StandardCharsets.UTF_8))
   
         //ソケットを閉じる
         input.close()
          output.close()
        }
      serverSocket.close()
      }
    }
  }
```

基本的にやりたいことをしてくれるメソッドをここから探し出せれば完成に近づくって感じでした。そしてこの通信の概念というか、ソケットの存在意義、しくみを理解していればコードも読み解けます。 

#input 入力ストリームについて

>text val input = socket.getInputStream

で入力ストリームを作成すると、 情報（httpリクエスト）がトンネルを通ってどんどんやってきます。

それを一文字ずつreadして、最終的にはString型でひとつの文字列として返すreadUntilEndメソッドをつくりました。

>text def readUntilEnd(is: InputStream, acc: List[Int] = Nil):String ={
           is.read :: acc match {
             case x if x.take(4) == List(10,13,10,13) => x.reverse.map(_.toChar).mkString //10,13は改行
             case x                                   => readUntilEnd(is, x)
           }
         }
   

ここのパターンマッチではなにをしているかというと、httpリクエスト文の最後で改行がふたつ送られてきたら、再帰をやめるような条件分岐になっています。

一文字ずつByte型でリストに入ってくるので最後にすべてひっくり返して（reverse)キャラにしmkStringでリストからひとつの文字列になるようにがっちゃんこします。

#output　出力ストリームについて

同じく出力ストリームを作成し、httpレスポンスの雛形に沿って情報を渡します。ヘッダはここにあるものが全部なくても必要なものだけあれば大丈夫です。

レスポンスボディに必要なものをひとつずつ変数にString型でいれておいて、responseTextでまとめて一気にByte型に変換しソケットにwriteメソッドを適用してあげればhttpレスポンスとして送られます！

最後にソケットを閉じておわり。 

かなり力づくな感じがしますがhttpサーバーってこんなことしてるんだなぁ。

すべてのものが魔法みたいに一瞬でパーンと操作されているわけじゃないことを改めて思います。笑
オブジェクトのインスタンス(または特異)メソッドを取得する[ ]と、特異メソッドを設定する[ ]= をシンボルに定義してみる。（読書メモ）

　前記事につづき、[プログラミング言語Ruby](https://www.oreilly.co.jp/books/9784873113944/) を読んでいる中で、覚えておきたいと思った、(ややトリッキーな)コードです。
　以下は、同著6.8 関数プログラミング　の節の最後に出てきたものに若干手を加えたもので、Symbolクラスに[],[]= 演算子を追加して、オブジェクトの特異メソッドを取得、設定するものです。（なお、実行はruby 2.2 で試しています。）

```ruby
class Symbol

  def [](o)
    o.method(self)
  end

  def []=(o,f)
    sym = self
    eigenclass = (class << o; self; end)
    eigenclass.instance_eval do
      define_method(sym, f)
    end
  end

end
```

こうしておいて

```ruby
str = '='

puts :*[str][10]
```
とすると、```'='``` が10個連続した文字列、

```
==========
``` 
が表示される
次に、```[]=```を使って、

```ruby
:*[str] = lambda {|n|
    ret = ''
    n.times {|i|
        ret += (self + (i < n-1 ? '|':''))
    }
    ret
}
```
としてから、再度

```ruby
puts :*[str][10]
```
とすると、10個の```'='```の間に、```'|'```が挿入されて、

```
=|=|=|=|=|=|=|=|=|=
```
が表示される。

さらに、上記のSymbol への```[]```に加えて、Methodクラスに数学的な意味での関数 f,gの合成
```
（f・g)(x) ≡ f(g(x))
```
に相当するアスタリスク演算子 ```*``` を以下のように定義する。

```ruby
class Method
  def *(f)
    if self.respond_to?(:arity) && self.arity  == 1
      lambda {|*args| self.call(f[*args])}
    else
      lambda {|*args| self.call(* f[*args])}
    end
  end
end
```

上記のSymbolとMethodを使うと

```ruby
(:*[2]*:+[3])[4]
````

は、「３を足してから2を掛ける」という関数に 4 を渡す、すなわち

```ruby
2 * (3 + 4)
```
と同じで、結果は ```14``` になる。

以上です。
Line Messaging API SDK for Java をJAX-RSから利用する


# はじめに
LINE BOTのトライアルの頃は、自分でJSONをマッピングし、JAX-RS Clientでリプライしたりしていました。
Line Messaging APIになり、Java向けのSDKが提供されているので、今回はこれを利用してみようと思います。

## 現時点ではSpring Bootから利用するのが便利
今回、JAX-RSからSDKを利用してみて、一番扱いにくさを感じたのが、イベントのマッピングです。
Spring Bootを利用した場合、この辺りが逆に一番楽に扱えるようになっています。
現時点では、Spring Bootのサポートの方が手厚い印象を持ちました。

# 実装してみる
何はともあれ実装してみます。
お手軽にテキストメッセージをオウム返しするだけのBOTを作成します。

## 環境
Windows 10 Pro 64bit
Java SE 8 Update 121 64bit
Line Messaging API SDK for Java 1.6.0

## Mavenの依存情報を設定する
SDKを利用する為、以下の依存情報をpom.xmlに追加します。

```xml:pom.xml
<dependency>
  <groupId>com.linecorp.bot</groupId>
  <artifactId>line-bot-servlet</artifactId>
  <version>1.6.0</version>
</dependency>
```

SDKは以下の構成になっており、それぞれ一つ上のモジュールに依存しています。

- line-bot-model
- line-bot-api-client
- line-bot-servlet
- line-bot-spring-boot

最後のは当然Spring Boot用なので、line-bot-servletを利用します。
line-bot-servletには、HttpServletRequestをインプットとしたJSONのパーサーが提供されています。

## HttpServletRequestからイベント情報を取得する

```java
public Response post(@Context HttpServletRequest request) {
        LineSignatureValidator validator = new LineSignatureValidator(channelSecret.getBytes());
        LineBotCallbackRequestParser parser = new LineBotCallbackRequestParser(validator);
        CallbackRequest callbackRequest = parser.handle(request);
        ...
```

@Contextを付けて引数としてHttpServletRequestを受け取ります。
LineSignatureValidatorは、API ReferenceのSignature validationに書いてある処理を行ってくれます。
LineBotCallbackRequestParserのコンストラクタに渡すことで、handle()実行時に署名検証が行われます。

## Eventオブジェクトの型からイベントの種類を判断する
パーサーが返すCallbackRequestから取得できるのはList&lt;Event&gt;です。
Eventはインターフェースで、それを実装する各イベントのクラスがあります。

- メッセージ受信 → MessageEvent
- フォローされた → FollowEvent

のような感じです。

これを判定する為のメソッドなどが無く、結局instanceofを使うしかなさそうです。
以下のように指定したイベントのみ返すメソッドを用意しました。

```java
private <T extends Event> List<T> filterEvents(List<Event> events, Class<T> clazz) {
    return events.stream().filter(t -> clazz.isAssignableFrom(t.getClass())).map(t -> clazz.cast(t)).collect(Collectors.toList());
}
```

Spring Bootの場合、@EventMappingを付与したメソッドを用意し、引数の型で各イベントとマッピングできるようです。

## APIを利用して返信する
TextMessageに返信したいメッセージを設定し、ReplyMessageに渡します。
LineMessagingServiceBuilderからLineMessagingServiceを生成し、ReplyMessageを渡して返信します。

```java
TextMessage textMessage = new TextMessage(messageContent.getText());
ReplyMessage replyMessage = new ReplyMessage(event.getReplyToken(), textMessage);
LineMessagingServiceBuilder
        .create(channelToken)
        .build()
        .replyMessage(replyMessage)
        .execute();
```

最後のexecute()はretrofit2.Callのメソッドで、Retrofit2というライブラリのクラスです。
あんまりSDK内部で利用しているライブラリは外に出さない方がいいのではないかと感じました。

# まとめ
SDKを利用すると、自分でJSONのマッピングする必要が無く、リプライなどもAPI化されていて便利になりました。

## 気になったこと
前述しましたが、以下の点ですね。

- Eventインターフェースから、イベントの種類を判別する手段が欲しい。
- Retrofit2のAPIがSDKを利用する側から見えている。SDKとして利用するライブラリの変更がしづらくなるのではないか。

## JAX-RSでも便利に使えるようになって欲しい
SDKはアップデートされ続けているようなので、今後に期待します。
Spring Bootの@EventMapping並みに便利な仕組みが提供されると嬉しいです。
UnityEngine.Timeクラスもどきでポーズメニュー実装

## やりたかったこと
ゲーム部分を**徐々に停止**させて、ポーズメニューを表示したかった。

## 諦めた方法
一般にゲーム部分の進行を止めてポーズメニューなどを表示したい場合、以下のどちらかが考えられる。
※以下の方法では要件を実現することができなかったため、今回は不採用。

* Time.timeScaleを使用する
* 更新処理（コルーチンが走る場合も含む）が走るコンポーネントをenable=falseする

### Time.timeScaleを使用する
メリット：徐々に動作をゆっくりにし、停止する動作を実現できる
デメリット：全てのオブジェクトの動作が停止する（UIのアニメーションは停止させたくない）  

### 更新処理（コルーチンが走る場合も含む）が走るコンポーネントをenable=falseする
メリット：一部のオブジェクト（ゲームの要素だけなど）を指定して停止させることができる
デメリット：動作させる、停止させるの二通りしかないので徐々に停止させることができない

## やったこと
ゲーム部分に適用するTime.timeScaleもどきを作成することで実装した。  

```csharp
public class Timer
{
	public float deltaTime { get; private set; }
	public float time { get; private set; }
	public float timeScale { get; set; }

	public float prevTime;

	public Timer ()
	{
		time = Time.unscaledTime;
		Update();
		timeScale = 1;
	}

	// LateUpdateなどで呼んでやる
	public void Update ()
	{
		deltaTime = ( Time.unscaledTime - prevTime ) * timeScale;
		time += deltaTime;
		prevTime = Time.unscaledTime;
	}
}
```

### Q&A 1. コルーチンにtimeScaleが適用されない

本来コルーチンでWaitForSecond等を使用した場合もtimeScaleの影響を受けるが、独自で用意したものになるので影響させることができないことに注意する必要がある。
WaitForSecondに独自クラスのdeltaTimeを掛けてあげることで解決できる。（あまりスマートではない）

```csharp
// どこかにインスタンスを保持していると仮定
// var myTimer = new Timer();

private IEnumerator インコにヘッドホンのもふもふかじられて辛い()
{
  // 行き場のない気持ちに悶え３秒停止する
  yield return new WaitForSecond(3.0f * myTimer.timeScale);
}
```

### Q&A 2. Update内のRandom.RangeによってtimeScale=0でも動いてしまう

これについては通常のTime.timeScaleを変更した場合にも起きる問題。
徐々に停止させている時にランダムの値も小さくなってよいならtimeScaleをかけることで解決できる。
だめなら以下のような形で解決することができる。
（動作効率が著しく悪いです。教えてエロい人！）

```csharp
// どこかにインスタンスを保持していると仮定
// var myTimer = new Timer();

private void Update ()
{
	// timeScaleが減少していくにつれて抽選の当選確率が下がる
	// timeScale=1のとき必ず当選する
	// timeScale=0のとき必ず落選する
	List<bool> lotTable = new List<bool>();
	for ( int i = 0; i < 100; i++ )
	{
		lotTable.Add( i < 100 * myTimer.timeScale );
	}

	// くじ引きして当選していたらランダム値を獲得する
	float result = 0f;
	if ( lotTable.OrderBy( i => Guid.NewGuid() ).ElementAt( 0 ) )
	{
		result = Random.Range(0, 1);
	}
}
```
プルリクエストとは

##プルリクエストをなんとなく理解したので
とりあえずメモ。

###で、プルリクエストとは
[こういうことだっ]
(http://www.backlog.jp/git-guide/pull-request/pull-request1_1.html)

##実際のコマンドと流れ
1.作業対象のソース(リモートリポジトリ)をローカルリポジトリにcloneもしくはpull

```
git clone リポジトリ名　ディレクトリ名
```

```
git pull リポジトリ名　ブランチ名
```

2.ローカルリポジトリでブランチを追加し、移動

```
git checkout -b ブランチ名
```

3.開発してadd&commit!

```
git add .
git commit -m "メッセージ"
```

4.ブランチのリモートリポジトリにpush!

```
git push リモートリポジトリ名　ブランチ名
```

5.プルリクエストを送る
[めちゃめちゃ丁寧な解説]
(http://www.backlog.jp/git-guide/pull-request/pull-request2_3.html)

6.マージする
[めちゃめちゃ丁寧再び]
(http://www.backlog.jp/git-guide/pull-request/pull-request2_5.html)

7.ローカルレポジトリでmasterに移動してpull

```
git checkout master
git pull リモートリポジトリ名　master
```

##コンフリクトが起きたら、、、？
1.Aさん(他人)のプルリクが通り、自分のプルリクが通らなかった場合を考える
new_branchというブランチ名で開発を進めていたとする

2.リモートリポジトリのmasterをローカルリポジトリのmasterにpull

```
git pull origin master
```

3.ローカルリポジトリでnew_branchにmasterをマージする

```
git checkout new_branch
git merge master
```

4.コンフリクトを確認し訂正する
->この後は上と一緒

[gitのコマンドはこっちでまとめてみた]
(http://qiita.com/kemako/items/3f8d80b4028621b4e58b)
APIテストツールのDHCで変数を扱う

### はじめに
[DHC](https://chrome.google.com/webstore/detail/dhc-restlet-client/aejoelaoggembcahagimdiliamlcdmfm
)はREST&HTTPなAPIをブラウザから簡単に実行できるChromeアプリケーションです。  

<img width="952" alt="スクリーンショット 2017-02-11 23.05.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/9628/15572133-eb37-2b08-0050-75d314a8b30a.png">

DHC自体の簡単な使い方は↓が参考になります。
[DHC REST Client - RESTのAPIを実行するならこのツール](http://blog.y-yuki.net/entry/2016/11/01/000000)

DHCでAPIを叩くときに開発と本番でエンドポイントをいちいち書き直したりするのは面倒ですよね、
そんなときは[Context Attributes](https://restlet.com/technical-resources/dhc/guide/perform-requests/context-attributes)という変数を扱える機能を使うと便利です。  

今回は開発サーバーを仮に`https://jsonplaceholder.typicode.com/` として、  
ローカルと開発でurlを変更する例を書いてみます。  

### コンテキストと変数を追加する  
DHCを起動後、CONTEXTSからコンテキストを追加できます。  
ここではlocalという名前のコンテキストを追加した後baseUrlという変数を追加しました。
<img width="355" alt="スクリーンショット 2017-02-11 23.09.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/9628/9c2c2d60-ad70-1d55-5d92-9d4c93fb84fd.png">

次にdevelopmentというコンテキストを追加して、
同様にbaseUrl変数を追加しますが、urlは開発用のアドレスに変更します。
<img width="420" alt="スクリーンショット 2017-02-11 23.11.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/9628/fcd0b6c3-cec4-31a3-cd95-6221be149622.png">

### リクエストの書き方  
リクエストを作成する時には、
{baseUrl}{version}/usersと{}の中は変数として扱われます。（この例だとversionもありますが、値が入っていないので無視されます。）画像は実際に`https://jsonplaceholder.typicode.com/users`に`GET`した結果です。

<img width="1215" alt="スクリーンショット 2017-02-11 23.08.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/9628/5040778c-4409-daef-c938-14bbcf8c32b4.png">

これでdevelopmentとlocalというコンテキストを切り替えるだけでリクエストに対するbaseUrlが切り替わるようになりました。これで開発/本番などbaseUrlが変わっても1つのリクエストを作成するだけで済みます。

### 乱数値  
ちなみに`{random()}`と書くとランダム値が入ります。
他にもビルトインの関数が色々使えるみたいです。
参考: [DHC built-in-methods](https://restlet.com/technical-resources/dhc/guide/perform-requests/expressions/built-in-methods)

上手く機能を活用して楽に開発していきたいですね！

### PostmanとHTTPie  
httpieは単にcurlの代替として、Postmanは機能が豊富っぽいので気になってます。  
[進化したPostmanでAPIをテストする](http://qiita.com/bisque33/items/0d00eff7b64c8223d5e2)
[curlを捨ててHttpieを使おう
](http://qiita.com/yuku_t/items/5df06d50c4c349cc0c1b)
[GAS] Google Apps ScriptでGoogleフォームの返信メールをカスタマイズする

デフォルトでも自動返信メールを設定できるが、
Fromもnobody@google.comでGoogle感丸出しなので
GASを使ってオリジナルの返信メールを送れるようにする

![image](https://qiita-image-store.s3.amazonaws.com/0/52847/def9a68e-f484-fc01-cba9-dff90216fe54.png)

エンドユーザー向けに使う場合などは、これだとおもてなし不足:(

## 手順

１. Emailアドレスを入力項目に含むGoogleフォームを作成

![image](https://qiita-image-store.s3.amazonaws.com/0/52847/acb18bbc-d96a-98f1-614d-6f70afb65adb.png)


２. Google Formのエディット画面のメニューから、**「スクリプトエディタ」**を選択し、
以下のスクリプトを書く

```js
function submitForm(e){
  // Eメールアドレスが何番目の項目か設定
  var EMAIL_INDEX = 0;

  var itemResponses = e && e.response && e.response.getItemResponses();
  
  if (!itemResponses) {
      Logger.log("faild get response");
      return false;
  }
    
  var email = itemResponses[EMAIL_INDEX] && itemResponses[EMAIL_INDEX].getResponse();
  if (!email) {
      Logger.log("faild get email");
      return false;
  }
  
  // タイトル
  var title = '自動返信テスト';
  
  // ここに本文を書く
  var content = [
    '自動返信のテスト',
    'だあああああああああああああああああああああああ',
    '',
    'よろしく',
    '＼(^o^)／',
  ].join('\n');
    
  GmailApp.sendEmail(email, title, content);
}
```

３. リソース > 現在のプロジェクトのトリガー から以下のようにフォーム送信時のトリガーを設定する

![image](https://qiita-image-store.s3.amazonaws.com/0/52847/f4bce0e9-ab96-9f75-91a9-7d7600803ebd.png)

あとはこのGoogleフォームからフォームに回答すると、以下のような感じでメールが送信される

![image](https://qiita-image-store.s3.amazonaws.com/0/52847/7125397e-b68f-96e3-44eb-3273a8432274.png)



## おまけ：Fromを変えたい

Fromがフォームを作成したGoogleアカウントになるので、これを別のアドレスにしたいという場合は、
sendEmailの第４引数にオプションとしてfromを指定できる。

```
GmailApp.sendEmail(email, title, content, {
  from: "hogehoge@hogehoge.com"
});
```

ただし、Gmailの設定でエイリアスに指定されているメールアドレスじゃないとエラーになるので、Gmail側の設定が必要。また、メールアドレスの確認フローがあるため、存在しないメールアドレスを指定することは不可能。
https://www.ka-net.org/blog/?p=4441
Grafanaで同じグラフを大量に作る (Repeating Rows and Panels)

# はじめに
Grafana 2.1 で追加された、同じグラフを大量に作る Repeating Rows and Panels のやり方が公式ドキュメントに無かったので、やり方を書いてみます。誰かの助けになれば。

## Repeating Rows and Panels とは？
公式サイトの [What’s new in Grafana v2.1](http://docs.grafana.org/guides/whats-new-in-v2-1/#repeating-rows-and-panels) にある通り、ほとんど同じグラフを大量に作るときに重宝する機能です。複数サーバのCPU使用率をまとめて見たりするときには必須だし、What's New で大々的に取り上げてるというのに、設定方法がドキュメントに書いてないんですよね。（簡単だから書くまでもない？）

![](http://docs.grafana.org/img/docs/v2/panel-row-repeat.gif)


# 設定方法
## 1.templateを設定

まずは、ギアアイコンから Templating をクリックし、
![templating_001.png](https://qiita-image-store.s3.amazonaws.com/0/59325/54597916-af06-6fa3-5b42-c793f0e797b8.png)

Templateを設定します。下図では hosts という名前で設定しています。
![templating_002.png](https://qiita-image-store.s3.amazonaws.com/0/59325/b6ff6e0b-7c8d-3741-740e-3f437b1dcb9d.png)
Graphiteをデータソースにしている場合は、Type を Query にして適切な Query を書けば host名一覧が取れるので、すげー便利です。InfluxDBをデータソースにしている場合は * が使えないので Type を Custom にして一個づつ定義します。

## 2. グラフをTemplating対応に設定する
普通にグラフを Edit していきます。まずは General タブ。
![templating_003.png](https://qiita-image-store.s3.amazonaws.com/0/59325/c0e34909-cc6a-04a0-ed00-2a1891c892d7.png)

Repeat Panel 欄に、「1.templateを設定」で定義した hosts を選択することで、全 host のグラフが出来上がります。
Min Span を6にしておくとグラフサイズが画面幅の半分になります。（意味的にMinじゃなくてMaxっぽい。。）
Title に $hosts と書いてある部分が Templating で変更される部分です。上図ではcpu使用率を複数ホスト分作っています。

次に Metrics タブを開きます。
![templating_004.png](https://qiita-image-store.s3.amazonaws.com/0/59325/aad1273c-635a-0315-0a01-398660c5e6ce.png)

描きたいグラフを定義します。$hosts の部分がTemplatingで変更される部分です。

# 終わり
これだけ！めちゃ簡単です。
VSCodeでGoをDebugする時に嵌った些細なこと

# VSCodeでGoをDebug


　Goで書くことがとても増えてきたので、VSCodeで開発ーと思い環境構築を始めました。
しかし簡単なコードを書きDebugも試してみようとした所Debugが始まらず…
とても…とてもしょうもない事に嵌ってしまったのでメモ書きです。

# 原因

　VSCodeを初めて立ち上げて、すぐにGoのコードを書いてしまったのが原因でした…
きちんと[フォルダを開く]なりしないと .vscode が作られず…

　Break Pointは貼れるのにDebuggerが起動しない方、そこに.vscodeはありますか！？

# さいごに

![debug.png](https://qiita-image-store.s3.amazonaws.com/0/105345/40dcbaa4-e28c-ec1a-3edd-ddb80677c941.png)

　VSCodeで開発しちゃうと…これはもう戻れませんね！
何故にずっとVimで書いていたのだろうか…猛省

# 参考記事

http://dev.classmethod.jp/go/visual-studio-code-golang-debug/
http://stackoverflow.com/questions/39058823/how-to-use-delve-debugger-in-visual-studio-code
エックスサーバーにssh接続する方法（ターミナル利用）


最近ターミナルにも慣れてきたのでssh接続を実行してみた。そのメモ。
##0.環境
- エックスサーバー
- Mac OS Sierra

##1.エックスサーバーでsshの設定
[こちら](https://www.xserver.ne.jp/manual/man_server_ssh.php)を参考に公開鍵認証用の鍵ペアを作成。秘密鍵（サーバー名.key 以下sample.key）をダウンロード。
パスフレーズは忘れずメモを。

##2.秘密鍵の設置
ダウンロードしたsample.keyを以下のコマンドで移動

```
#.sshディレクトリの作成
$ mkdir ~/.ssh
```
```
#ファイルの移動
$ mv ~/Downloads/sample.key ~/.ssh/
```

##3.秘密鍵のファイル名の変更
秘密鍵の名前を変更します。この時通常だとid_rsaとするのですが、
その他の秘密鍵もある場合は任意の名前を。今回はid_xserver_rsaで設定

```
#.sshに移動
$cd ~/.ssh/
```
```
#名前の変更
$mv sample.key id_xserver_rsa
```

##4.パーミッションの変更
.sshディレクトリと秘密鍵のパーミッションを変更。

```
$ chmod 700 ~/.ssh
```
```
$ chmod 600 ~/.ssh/id_xserver_rsa
```

##5.ログイン
以下コマンドでログインできます

```
$ ssh -l サーバーID -i 秘密鍵ファイル名(今回はid_xserver_rsa) サーバーID.xsrv.jp -p 10022
```
以下のようにパスフレーズを求められるのでエックスサーバーの公開鍵作成で使ったパスフレーズを入力しEnter。入力文字が表示されない場合が、そのまま入力してEnterで問題なし。

```
Enter passphrase for key 'id_sample_rsa': 
```


##6.ログインの簡略化
いちいち上記の長いコマンド打つのが大変なので、.sshにconfigファイルを作りログインを簡略化する

```
#configを作成してvimで開く(テキストエディタでも可）
$ vim ~/.ssh/config
```

以下のように記述

```.ssh/config

Host sample #任意のコマンド名
  HostName サーバーID.xsrv.jp
  Port 10022
  User サーバーID
  IdentityFile ~/.ssh/id_sample_rsa #秘密鍵のファイル名
  ServerAliveInterval 60 #sshの自動切断を防ぐために記述
```
これで以下コマンドでアクセスが可能

```
$ ssh sample
```

以上。

以下サイトを参考にしました。
[エックスサーバーにSSHで接続してみよう！](http://vdeep.net/xserver-ssh)
Swiftで「サクッと使える」通信ライブラリ【RapidFire】 


##はじめに

業務でのアプリ開発で通信が必要な場合は、AlamofireやAPIKitもしくはURLSessionをラップした自前のライブラリ的なものを使っているかと思います。

私も業務ではAlamofireかAPIKitを使っています。

これらのライブラリは、URLSessionの煩雑さや、不足している機能を補ってくれる素晴らしいライブラリだと思うのですが、 **プロトタイピング** や **勉強がてらに書くコード**（通信は必要だがメインではない）向けに、 **もっとカジュアルに使える** 通信ライブラリが欲しいなと思っていました。

今さら通信ライブラリっていうのも、いわゆる「車輪」な感じなのですが、「RetroFitのBulderみたく書けるとカッコいいかもしれない」とか「用途が違うので大御所とはかぶらない」という理由を見つけたので、思い切ってつくってみました。

##RapidFire

できたのが こちらの [RapidFire](https://github.com/keygx/RapidFire) です。

こんな風に使います。

```swift
RapidFire(.get, "https://httpbin.org/get")
    .setCompletionHandler({ (response: RapidFire.Response) in
        switch response.result {
        case .success:
            print("success: \(response.statusCode): \(response.toDictionary())")
        case .failure:
            print("error: \(response.statusCode): \(response.error)")
        }
    })
    .fire()
```

詳しくは [README](https://github.com/keygx/RapidFire/blob/master/README.md) を見ていただければと思いますが、メソッドチェーンでリクエストの設定を組み立てていきます。

対応している機能はこちらです。

- GET / POST / PUT / PATCH / DELETE
- URL / JSON Parameter Encoding
- multipart/form-data
- JSON to Array / JSON to Dictionary Helper Method

---

レスポンスは、URLSessionのData, URLResponse, Errorの他に、成功/失敗のEnumとステータスコードが返ってきます。

```swift
public enum Result {
    case success
    case failure
}

public var result:     Result
public var statusCode: Int?
public var data:       Data?
public var response:   URLResponse?
public var error:      Error?
```

また現状レスポンス形式としてはJSONが主流なので、

- JSON to Dictionary
- JSON to Array
- JSON to String

の変換用ヘルパーメソッドも用意してあります。

サンプルのように書けば、サクッとレスポンスの中身を確認できます。


## まとめ

Elegant（Alamofire）とも Type-safe（APIKit）とも 違いますが、 Easy to use な感じで、目論み通り「カジュアルに使える」ものができたと思っています。

プロトタイピングの他にもAPIマッシュアップが捗りそうでし、小難しいことを考えなくていい個人アプリの通信部分など、何かと活躍しそうなライブラリです。

また、久しぶりに素のURLSessionをさわって、その手間のかかり具合に改めてライブラリの有難みを感じた開発でした。


## リンク

- [RapidFire](https://github.com/keygx/RapidFire) : Easy to use networking library in Swift.

- [Alamofire](https://github.com/Alamofire/Alamofire) : Elegant HTTP Networking in Swift

- [APIKit](https://github.com/ishkawa/APIKit) : Type-safe networking abstraction layer that associates request type with response type.


## こぼれ話

開発途中に "Star" が付いて驚きました。Githubには上げていましが、ブランチは develop しかない状態だったので。
jsdoでconvnetjs その4

#概要
jsdoで、convnetjsでsin波の学習やってみた。

#写真
![jj.png](https://qiita-image-store.s3.amazonaws.com/0/18104/6f83b72e-1687-3fab-58f8-e61754637ce2.png)


#成果物

http://jsdo.it/ohisama1/G3LO
warningの善処例

#はじめに
Xcode 8.2で型の不整合を警告されました(8.2固有の話ではありませんが)。いずれも書式側の型の見直しで解決しました。

#Format specifies type 'long' but the argument has type 'int _Nullable'

##原因
書式がlong型を明示していますが、この引数はint _Nullable型なので、不整合になっています。その警告が出ています。

##善処例

```objc:before
[NSString stringWithFormat:@"Error code %ld", [transaction.error code]
```

```objc:after
[NSString stringWithFormat:@"Error code %zd", [transaction.error code]
```

#Values of type 'NSInteger' should not be used as format arguments; add an explicit cast to 'long' instead

##原因
'NSInteger'型の値は書式引数として使われるべきではないことが指摘されています。Xcodeがヒントとして、long型への明示的なキャストを加えるように示しています。
そもそも、long型の値にして表示する必要がなければ、むしろ書式自体を修正すべきですね。

##善処例

```objc:before
[NSString stringWithFormat:@"Error code %ld", error.code]
```

```objc:after_xcode
[NSString stringWithFormat:@"Error code %ld", (long)error.code]
```

```objc:after
[NSString stringWithFormat:@"Error code %zd", error.code]
```
ゲーム中に視点を切り替えてオブジェクトの状況を確認する

# ゲーム中に視点を切り替えてオブジェクトの状況を確認する

ゲームプレイ中にオブジェクトの状態をEditorで操作するように確認したい。

Play中にEjectをクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/99441a1e-7503-9754-0517-7553c7d3e7ab.png)

通常のエディタで編集している状態と同様にカメラを操作することが出来る
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/9413b9f1-543b-f591-fae6-e43801c866e8.png)

Possesをクリックすればゲームのカメラに戻る
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/ac76ffc7-548e-0b31-bac0-11fa42d13b65.png)

## 参照
再生とシミュレーション
https://docs.unrealengine.com/latest/JPN/GettingStarted/HowTo/PIE/index.html
omniauth-twitterとfacebookを入れるとエラーなる

oauth-twitterをいれたらエラーになった
```
rescue in block (2 levels) in require': There was an error while trying to load the gem 'omniauth-twitter'.
Gem Load Error is: private methodwarn' called for nil:NilClass
```
hashieのバージョンがいけないようなので3.4.4に下げると直った
ちょっと気になるコード集-良いコード書くきっかけを与えたい。2[C#リファクタリングサンプル]

#ちょっと気になるコード集
コードレビューしていた中で、気になるソースがあったので挙げてみる。たいしたことではないが、気になってしょうがない。

* Null許容型の使い方
 1. Nullチェック

  ```csharp  
            int? inputValue = null;

            // NG こんな実装方法は思いつかなかったので、少しだけすごいと思ってしまった。
            if (string.IsNullOrWhiteSpace(inputValue.ToString()))
            {
            }

            // OK プロパティを使う
            if (!inputValue.HasValue)
            {
            }

            // OK !Nullable.HasValueと等価なため、これでもよい。
            if (inputValue == null)
            {
            }

```
　
 2. Null許容型からの値取り出し。  
    
```csharp
            int? inputValue = 1;

            int value;
            if (inputValue.HasValue)
            {
                // NG 何でも文字列にすれば良いという考えは止めよう
                value = int.Parse(inputValue.ToString());
                // NG 無駄なキャスト1
                value = Convert.ToInt32((object)inputValue);
                // OK プロパティを使用
                value = inputValue.Value;
                // OK 無駄なキャストに見えるが、inputValue.Valueが呼ばれる。
                value = (int)inputValue;

            }


```

* Object型

1. キャスト

```csharp
            object objectValue = 1;
            int castValue;
            if (objectValue != null)
            {
                // NG 文字列にしてキャストするのは無駄が多い
                castValue = int.Parse(objectValue.ToString());
                // OK .Net Frameworkで用意された変換処理を使う
                castValue = Convert.ToInt32(objectValue);
                // OK 通常のキャスト
                castValue = (int)objectValue;
            }

```

##まとめ
文字列にすれば良いと考えている人が多い。
動作としては問題なくても、レビューする側は気になってしょうがない。

##サンプルコード(Java) 2017/3/24 追記
```java
        /** Nullチェック **/
        Integer inputValue = null;

        // NG javaでこのような書き方をする人はいないだろう。
        // ちなみに、C#のint?はNullable構造体のため、ToStringする前のNullチェックは不要だった。
        if (inputValue == null || inputValue.toString().length() == 0) {

        }

        // OK Javaの場合、nullで比較するのが正しい。
        if (inputValue == null) {

        }
        /** Null許容型 **/
        Integer inputValue = 1;

        int value;
        if (inputValue != null) {
            // NG 何でも文字列にすれば良いという考えは止めよう
            value = Integer.parseInt(inputValue.toString());
            // NG 無駄なキャスト
            value = (int) inputValue;
            // OK Integer.intValueが呼ばれる。
            value = inputValue;
            // OK
            value = inputValue.intValue();
        }

        /** Object型 **/
        Object objectValue = 1;
        int castValue;
        if (objectValue != null) {
            // NG 元の型が分かっている場合、文字列に変換する必要がない。
            castValue = Integer.parseInt(objectValue.toString());
            // OK 元の型へキャスト
            castValue = (int) objectValue;
        }
```

[前の記事(ややこしい条件分岐)](http://qiita.com/csharpisthebest/items/99af9136883f139ad70f)

[次の記事(流れるようなインターフェース)]
(http://qiita.com/csharpisthebest/items/403d40374acc70ef24e3)

[目次](http://qiita.com/csharpisthebest/items/57f27a33085f01211166)
ファイルを新しいフォルダに複写して、複写したファイルと比較するVBSｃipt

VBS Make New tempfolder Named by date and copy and compare file size and Delete File and folder
##
```CompareFileSizeTest.vbs
Option Explicit
'For VBA
'#If VBA7 Then 
'Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
'#Else
'    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'#End If

Dim fso: Set fso = CreateObject("Scripting.Filesystemobject")
Dim ofol
Dim strDocpath
Dim WSH: Set WSH = CreateObject("Wscript.Shell")
Dim objFIle, objFIles, objFilec
Dim i
Dim sfol
Dim objwshshell : Set objwshshell = CreateObject("WScript.Shell")
set objArgs = wscript.Arguments
For i = 0 To objArgs.Count -1
Set objFIle = FSO.GetFile(cstr(objArgs(i)))
Msgbox isJamed(objFIle.path)
Next
set FSO = Nothing
set WSH=nothing
wscript.Quit

Function isJamed(strFileFullpath)
Dim FSO: Set FSO = CreateObject("Scripting.Filesystemobject")
Dim oFol
Dim Ar:Ar=split("jse,accdb,vbs,htm,html,mdb,log,ps1,xsd,jww",",")
Dim hostPath
Dim WSH: Set WSH = CreateObject("Wscript.Shell")
Dim objFile, objFiles, objFileC
Dim i, cnt
Dim sFol, objArgs, bl
If FSO.fileexists(strFileFullpath) = False Then MsgBox "Err:File not Exists": Exit Function
for i=lbound(ar) to ubound(ar)
if Fso.GetExtensionName(strFileFullpath)=ar(i) then isInfocage=False :exit function
Next
sFol = Hour(Now) & Minute(Now) & Second(Now)
Set oFol = FSO.CreateFolder(WSH.ExpandEnvironmentStrings("%Userprofile%") & "\Documents\" & sFol)
cnt = 0
Do
If FSO.folderexists(oFol.Name) Then Exit Do
WScript.Sleep 100
If cnt > 20 Then Exit Do Else cnt = cnt + 1
Loop
Set objFile = FSO.getfile(strFileFullpath)
FSO.CopyFile objFile, oFol.Path & "\", True
cnt = 0
WScript.Sleep 500
Do
If FSO.fileexists(oFol.Path & "\" & objFile.Name) And FSO.getfile(strFileFullpath).Size > FSO.getfile(oFol.Path & "\" & objFile.Name).Size Then WScript.Sleep 1000 Else Exit Do
If cnt > 40 Then Exit Do Else cnt = cnt + 1
WScript.Sleep 100
Loop
Set objFileC = FSO.getfile(oFol.Path & "\" & objFile.Name)
'Return Result
Wscript.Sleep 1000 
If objFileC.Size = FSO.getfile(objFile).Size Then
  isJamed = True
ElseIf objFIleC.Size > FSO.getfile(objFile).Size Then
  isJamed = False
ElseIf objFIleC.Size < FSO.getfile(objFile).Size Then
  isJamed = False
End If
FSO.DeleteFile (oFol.Path & "\" & objFile.Name)
WScript.Sleep 100
cnt = 0
Do
If FSO.FileExists(oFol.Path & "\" & objFile.Name) = False Then Exit Do
If cnt > 10 Then Exit Do Else cnt = cnt + 1

WScript.Sleep 100
Loop
FSO.Deletefolder oFol.Path
Set FSO = Nothing
Set WSH = Nothing
Set objFile = Nothing
End Function
```
CUI環境でAndroid Emulatorを起動する

# やること

- Ubuntu Server(16.04.1 LTS)上で、Android API 21(Android 5.0)のemulatorを起動する

# 前提条件

- Android SDKをインストールしていること

# 手順

- ABIをインストールする

~~~sh
# ABI名を調べる
$ android list sdk --extended --no-ui --all | grep abi
...
id: 97 or "sys-img-armeabi-v7a-android-21"
id: 100 or "sys-img-armeabi-v7a-google_apis-21"

# ABIをインストールする
$ echo "y" | android update sdk -a --no-ui --filter sys-img-armeabi-v7a-android-21
~~~

- AVDを作る

~~~sh
$ echo n | android create avd --force --name emulator-android-21 --target android-21 -c 50M -s WXGA800 --abi armeabi-v7a
~~~

- エミュレータを実行する

~~~sh
$ emulator -avd emulator-android-21 -no-skin -no-audio -no-window
~~~

- adbで動作確認する

~~~sh
$ adb devices
List of devices attached
emulator-5554	offline

# device状態になるまで1分ぐらいかかる
$ adb devices
List of devices attached
emulator-5554	device

$ adb shell
root@generic:/ #
~~~

# 参考

- [no ABI error , when creating an Android virtual device](http://stackoverflow.com/questions/10019532/no-abi-error-when-creating-an-android-virtual-device)
- [CI用にヘッドレスなAndroidエミュレータを複数台立ち上げるシェルスクリプト](http://qiita.com/muran001/items/ffd56f8a7dd76e3968fb)
- [Control the Emulator from the Command Line](https://developer.android.com/studio/run/emulator-commandline.html)
パーセプトロンとは_大事なとこだけわかりやすく　-DeepLearning-

#本記事について

本記事では簡潔にパーセプトロンとは何か？という点に特化して書いていきます。
筆者は馬鹿なのでピンポイントで必要そうな情報だけまとめます。
短めです。2分位で読めちゃいます。



##パーセプトロンとは

パーセプトロンとは、アルゴリズム(方法、考え方)であり、
ニューラルネットワークやDeepLearningの起源となったアルゴリズムです。
なのでDeepLearningで何から勉強すればいいの？って人は間違いなくこの考え方から学ぶべきでしょう。


####▶起源
パーセプトロンは、1950年代から1960年代にかけて、Warren McCullochと Walter Pittsらの 先行研究に触発された Frank Rosenblattによって開発されたそうです。
ローゼンブラットさんだけ覚えておけば十分。

####▶どういうものか
パーセプトロンはある複数の信号を受け取り、1つの信号を出力します。
電流が導線を流れて電子を先に送り出すようなイメージ。
ただし、パーセプトロンの信号は１か０(流す/流さない)の値のみです。
例として、以下の画像を見てください。

![neuron1.png](https://qiita-image-store.s3.amazonaws.com/0/146681/6ffe7da1-aa32-bb3a-f15f-6c9cab0eccaa.png)


この画像では、3つの信号(x1,x2,x3)を入力として受け取り、yを結果として返すということを表しています。

wというのが重み(weight)を表しています。
※重みというのは電流で言うところの「抵抗」で、
　この重みが信号の流れにくさをコントロールする値になります。

図の○はニューロンとかノードと呼ばれており、次のニューロンに信号が送られる際にそれぞれに固有の重みが乗算されます(上図でw1x1、w2x2、w3x3となる)。
その送られてきた値の総和がある限界値を超えた場合にのみ1を出力します。
(w1x1＋w2x2＋w3x3)
これを「ニューロンが発火する」と呼びます。
この限界値のことをここではしきい値と呼び、θという記号で表すことにします。

以上のことを計算式で表すと以下のようになります。
(w1x1 + w2x2 ≦ θ) → 0
(w1x1 + w2x2 > θ) → 1
この出力結果が「y」となります。


これがパーセプトロンの動作原理であり、かなりとっつきやすい内容だったかと思います。
ただこの考え方から発展したものがDeepLearningやニューラルネットワークを理解する上では重要になっていて、閲覧者が勉強を進めていく際にも頻繁に出てくるかと思います。


次回はこの考え方を利用した論理回路とPythonへの実装を行っていきたいと思います。

参考文献：
・http://nnadl-ja.github.io/nnadl_site_ja/chap1.html
・ゼロから作るDeepLearning
.zsh*を~/.zsh.dみたいな名前のディレクトリに放り込んですっきりさせる小技

# 動機
ホームディレクトリがドットファイルの山であふれると何となく嫌だから、1ソフト1ディレクトリくらいになって欲しい。VCSで管理もしやすくなる。Emacsは最近 .emacs.d に全部放り込めるようになったので偉い。次はzsh、お前だ！

# 方法
というわけでman zshして最後のほうをみると、ZDOTDIRという変数を設定すると良いらしい。といっても、これをどうやって設定するのかという問題があって、~/.zshenvあたりに書くのだとすると目的が達成されない。どうしても、システムグローバルのrcファイルに書く必要がある。まあ、他にも方法はあるだろうけど、たぶんあまりすっきりとした方法にはならないと思う。

manpageによれば、rcファイルのうちで一番最初に読まれるのは /etc/zshenv (パスはビルド時のオプションによって異なる; Ubuntuだと /etc/zsh/zshenv) らしいので、 ここに次のような記述を追加しておく:

```shell-session
if [[ -d "$HOME"/.zsh.d ]]
then
	ZDOTDIR="$HOME"/.zsh.d
fi
```

あとは ~/.zsh.d を作ってそこにzsh関連のrcファイルを放り込めばよいというわけ。ひとつ注意しないといけないのは、ここに放り込むファイルも ~/.zsh.d/.zshrc みたいにドットが必要。ちょっとダサい。
わーい、すごーい

元ネタ
[わーい、すごーい](http://qiita.com/t_ishida/items/bae7e62950d81f427f13)
に触発されて書いた
[わーい、すごーい](http://qiita.com/simiraaaa/items/e56d74f40219d917fbf3)
のES6版


```js

class フレンズ {
  constructor() {
    this.message = '';
  }
  
  わーい() {
    this.message += 'わーい\n';
    return this;
  }
  
  すごーい() {
    this.message += 'すごーい\n';
    return this;
  }
  
  たのしー() {
    this.message += 'たのしー\n';
    return this;
  }
  
  フレンズ(skill) {
    this.message += `君は${skill}がとくいな、フレンズなんだね!!\n`;
    return this;
  }
  
  toString() {
    var message = this.message;
    this.message = '';
    return message;
  }
}

alert(new フレンズ()
  .わーい()
  .すごーい()
  .たのしー()
  .フレンズ('クソリプ'));

```

動作確認
http://runstant.com/simiraaaa/projects/wai_sugoi_ES6
わーい、すごーい

元ネタ
[わーい、すごーい](http://qiita.com/t_ishida/items/bae7e62950d81f427f13)
に触発されて


```js

function フレンズ() {
  this.message = '';
}

フレンズ.prototype = {
  わーい: function() {
    this.message += 'わーい\n';
    return this;
  },
  
  すごーい: function() {
    this.message += 'すごーい\n';
    return this;
  },
  
  たのしー: function() {
    this.message += 'たのしー\n';
    return this;
  },
  
  フレンズ: function(skill) {
    this.message += '君は' + skill + 'がとくいな、フレンズなんだね!!\n';
    return this;
  },
  
  toString: function() {
    var message = this.message;
    this.message = '';
    return message;
  },
};


alert(new フレンズ()
  .わーい()
  .すごーい()
  .たのしー()
  .フレンズ('クソリプ'));

```

動作確認
http://runstant.com/simiraaaa/projects/wai_sugoi_ES5
【しずおかアプリ部】活動ログ　第34回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/ee800648-fa25-1829-20c3-bad9c2055d35.jpeg)


##■タイトル##
第３４回


##■開催日##
２０１７年２月１１日（土）　１６：００～１８：００


##■参加者##
１３名


##■活動内容（概要）##
・最近の話題の技術ニュース、告知
・保坂プレゼン「Resas報告、企画相談」
・部員さんプレゼン「フリーCADソフトFusion360のチュートリアル」
・TEA BREAK

※部員さんプレゼンの「Gitでバージョン管理」と菅原プレゼンの「Dlibについて」は
　　時間の都合上、次回以降に延期となりました。

##■活動内容（詳細）##

【実演・プレゼン】

**・最近の話題の技術ニュース、告知**
・線画が自動でカラーイラストになるWebサービス[「PaintsChainer」](http://paintschainer.preferred.tech/)
・2/18に島田で行われる「Shizuoka.py(pythonの勉強会)」で部員さんが数学の歴史についてプレゼンをします。
・2/15に秋葉原で開催される[Japan VR Fest.](http://jvr-fest.com/2017/01/2894/)に出展します



<hr>

**・保坂プレゼン「Resas報告、企画相談」**

　　先月静岡市で開催された内閣府主催の「RESAS」を使ったハッカソンに参加してきた。
　　「RESAS（リーサス）」とは？
　　　・Regional Economy (and) Society Analyzing Systemの略
　　　・地方自治体による様々な取り組みを情報面・データ面から支援する「地域経済分析システム」
　　　・チームラボがそのデータを可視化できるシステムを開発
　　　・そのAPIを一般に公開して、有効に使ってもらうためのアイディアを集めるため、ハッカソン、アプリコンテストを開催

　　ハッカソンでの評価
　　　・地域のデータをゲームにするというアイディアが新しく好評だった
　　　・チームとしての進め方も評価された
　　　
　アプリコンテストに応募するので、詳細はまだ未掲載とさせていただきます。

![IMG_7600.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/d34ecd52-fd2a-cbdf-b0da-353d91a09073.jpeg)

<hr>


**・部員さんプレゼン「フリーCADソフトFusion360のチュートリアル」**

　　　前回紹介したフリーCADソフト「Fusion360」の使い方を日本語チュートリアルを見ながら進めました。
　　　ただ、チュートリアルだけでは足りない部分があるので、
　　　それを補う書籍やサイト、動画などの紹介もしました。

　　　　【本】
　　　　「 Fusion360 操作ガイド（カットシステム　三谷 大暁） 」
　　　　コメント：かなり丁寧。初心者でもわかりやすいと思う。（スーパーアドバンス編は難しい・・・）

　　　　【セミナー】
　　　　「スリプリ Autodesk Fusion 360 3DCAD セミナー 」
　　　　http://3d-printer-house.com/3dcad-campus/
　　　　コメント：上の本の内容がベース。お金はかかるが勉強時間を一気に短縮できる。（大人はお金で時間が買える・・・）

　　　　【ネット】
　　　　「 Fusion 360 のポータルサイト： Fusion360 BASE 」
　　　　http://fusion360.3dworks.co.jp/
　　　　コメント：運営元は上の本やセミナーをやっているところと一緒。

　　　　「かんたん 3D モデリング～ Fusion 360 はじめの一歩（ by 三谷 大暁）」
　　　　https://fabcross.jp/list/series/fusion360/
　　　　コメント：上の本を書いた人が連載中。

　　　　「 Fusion 360 の基本操作（ Autodesk HP ）」
　　　　http://www.autodesk.co.jp/products/fusion-360/learn-training-tutorials
　　　　コメント：公式チュートリアル。

　　　　「 MakersLove 」
　　　　http://makerslove.com/
　　　　コメント：無料の入門マニュアルがある。（中身見たことないけど・・・）


　　　今回の目標
　　　　・基本的な操作を覚える
　　　　・マグカップのベースとなる円柱の作成

　　　使用して見たの感想
　　　　・Blenderに比べてわかりやすい
　　　　・操作の履歴を追いやすい
　　など。
　　
　　無料で利用できるとは思えないくらいのクオリティ。

![IMG_7602.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/32975d37-e1cf-5f2b-bda3-c375562a6ef3.jpeg)

　　資料：[第34回_プレゼン資料(～Fusion360～).pdf](http://monolizm.com/sab/pdf/第34回_プレゼン資料(～Fusion360～).pdf)

　　[Fusio360の日本語チュートリアルはこちらから](http://www.myautodesk.jp/jeff/material.html)


<hr>

<hr>


**・TEA BREAK**
　　今回から「TEA BREAK」と称して、
　　コーヒーやお菓子を食べながら部員さん同士の交流を深める取り組みを始めました。
　　・ドローンの話題
　　・Unityの話題
　　・VRの話題
　など、各々が交流を深めていました。
APIサーバを立てるためのCORS設定決定版

タイトルは釣り、かつ、自分のための備忘録です。

マイクロサービスアーキテクチャでサービスを構築すると、APIサーバをサービスごとに立てるわけですが、
ブラウザ上のJSエンジンからAPIサーバを叩く時に避けて通れないのが、`Same-Origin Policy（同一生成元ポリシー）`による`CORS (Cross-Origin Resource Sharing)`制限です。

<img src="https://qiita-image-store.s3.amazonaws.com/0/145575/496a49a3-6762-2f6d-4557-6e7669d0aa11.jpeg" width="75%" />

これを回避するには、APIサーバ側で`Access-Control-*`ヘッダを適切に返す必要がありますが、どう設定するべきかの情報が意外と少ないので（自分的）これが決定版！　という設定を考えてみました。

# 結論
nginxの場合の設定例です。

```nginx
server {
    listen       80;
    server_name  site.localhost;

    charset utf-8;
    root /var/www/app/public;

    location / {
        # preflightに対するレスポンス指定
        if ($request_method = 'OPTIONS') {
            add_header Access-Control-Allow-Origin '*';
            add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE';
            add_header Access-Control-Allow-Headers 'Origin, Authorization, Accept, Content-Type';
            add_header Access-Control-Max-Age 3600;

            add_header Content-Type 'text/plain charset=UTF-8';
            add_header Content-Length 0;

            return 204;
         }

        try_files $uri /index.php?$query_string;
    }

    location ~ \.php$ {
        # alwaysオプションを付けて、常にヘッダが出力されるようにする
        add_header Access-Control-Allow-Origin '*' always;

        fastcgi_pass   localhost:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}
```

ブラウザ上のJSエンジンは、APIサーバ（別ドメイン）にリクエストを投げる前に`OPTIONS`メソッドによるアクセスを行います。
これは`Access-Control-*`情報を問い合わせるための`preflight`と呼ばれるアクセスです。

`if($request_method = 'OPTIONS'){ 〜 }`は、このpreflightに対するレスポンスを定義しています。
（レスポンスボディは特に無いので、`204: No Response`を返す。）

| ヘッダ | 値 |
|:-----------------------------|:------------------|
| Access-Control-Allow-Origin  | アクセスを許可するOriginのURL。"*"で指定なし。 |
| Access-Control-Allow-Methods | 使用可能なメソッド |
| Access-Control-Allow-Headers | 使用可能なリクエストヘッダ |
| Access-Control-Max-Age       | preflightの結果をキャッシュしても良い時間（秒） |


実際の本アクセスの場合も`Access-Control-Allow-Origin`ヘッダが無いと、JSエンジンがレスポンスをブロックしてしまいますので指定が必要です。

ただし、nginxの場合デフォルトでは（200系、300系の）特定レスポンスコード以外の場合はヘッダの追加をスキップしてしまうので（[参考](http://nginx.org/en/docs/http/ngx_http_headers_module.html)）、400系のエラーを返す場合に対応できるように`always`指定が必要になります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/145575/b1fe9078-35ff-518a-1811-41a6fe366070.jpeg" width="75%" />
自前のサーバーにGitリポジトリを作成してプッシュでサイト更新する

# 概要

FTPなどでのサイト更新から脱却したい人、デプロイ用の便利なツールとかを何故か使いたくない人向け。

## 最終的に実装したい機能

- 自分のサーバーにGitリモートリポジトリを作成しローカルから利用できる
- リモートリポジトリへプッシュするとmasterブランチの内容でサイトが更新される

## 前提条件
対象サーバーは、以下の作業が完了している前提。

- Apacheの導入（nginxでももちろんできるけど、記事中では設定例は示さない）
- ドメインの取得・設定

## ディレクトリ構成

```
var
 └www
   │
   ├git
   │ └プロジェクト名.git ←リモートリポジトリ ※1
   │
   └html
     └プロジェクト名 ←※1をクローンしたもの（Webに公開される
       └index.html etc...
```

# 実装

既にサーバーにgitを導入済みで、「サーバーへログイン→git pull」でサイト更新できる状態の人は、手順1−4を飛ばして、手順5だけでよい。

各作業は必要に応じてsudoで実行。

## 手順1:サーバーにgitをインストール

サーバーでgitコマンド使えない（インストールされていない）人のみ。

```bash:サーバー（CentOSの場合）
$ sudo yum -y install git
```

or

```bash:サーバー（Ubuntuの場合）
$ sudo apt-get install git
```

サーバー内でgitコマンドが使えるようになったことを確認する。

## 手順2:リモートリポジトリを作成
```bash:サーバー
# gitリポジトリを置くための「/var/www/git」ディレクトリを作成
$ cd /var/www
$ mkdir git

# 適当なリポジトリを作成
$ cd /var/www/git
$ mkdir プロジェクト名.git
$ cd プロジェクト名.git
$ git --bare init --shared
```
`/var/www/git/プロジェクト名.git`が完成

## 手順3:web公開用のディレクトリをgit cloneで作成
```bash:サーバー
$ cd /var/www/html
# 手順2で作ったリポジトリをクローンしてくる
$ git clone /var/www/git/プロジェクト名.git
```
`/var/www/html/プロジェクト名`が完成

## 手順4:Apacheを設定
webから「ドメイン名.com」でアクセスされたら「/var/www/html/プロジェクト名」を参照するようにする。

confファイルに設定を記述する。

```bash:サーバー（CentOSの場合）
$ sudo vi /etc/httpd/conf.d/hoge.conf
```

or

```bash:サーバー（Ubuntuの場合）
$ sudo vi /etc/apache2/sites-available/hoge.conf
```

以下を追記。

```apache:vhosts.conf
<VirtualHost *:80>
  ServerName ドメイン名.com
  ServerAlias ドメイン名.com
  DocumentRoot /var/www/html/プロジェクト名
</VirtualHost>
```

追記後、Apacheを再起動する。

## 手順5:フックを作成
gitフックとは、プッシュなどされた際に発火する処理。
（あらかじめ書いておいたスクリプトをプッシュ時に実行させたりできる）

今回は、プッシュされたら`/var/www/html/プロジェクト名`へcdしてgit pullするだけのスクリプトを作る。

```bash:サーバー
$ vi /var/www/git/プロジェクト名.git/hooks/post-receive
```

内容は以下。

```bash:/var/www/git/プロジェクト名.git/hooks/post-receive
#!/bin/sh
cd /var/www/html/プロジェクト名/
git --git-dir=.git pull
```

## 仕上げ:実行権限や書き込み権限を調整する

ここまでの工程で、ディレクトリの権限などについては特に触れなかった。
なのでこのままでは、例えば「sudoで作成したディレクトリはroot権限になるため、git pullできずにフックが失敗する」などの問題が起きるかもしれない。

それらを回避するために必要に応じて所有者やグループを変更する。

```bash:サーバー
$ sudo chown ユーザー名:グループ名 -R /var/www/git/プロジェクト名.git
$ sudo chown ユーザー名:グループ名 -R /var/www/html/プロジェクト名
```

ポイントは、プッシュするユーザーが、gitとhtml両方のディレクトへの書き込み権限を持っていること。

フックには実行権限をつけておく。

```bash:サーバー
$ sudo chmod +x /var/www/git/プロジェクト名.git/hooks/post-receive
```

## 確認:ローカルからリポジトリへプッシュしてみる

ローカルマシンからssh経由でリポジトリをクローンする。
（もちろん以下はSourceTreeとかでやってもよい）

```bash:ローカル
$ git clone ssh://ユーザー名@ドメイン名:/var/www/git/プロジェクト名.git
```

〜ファイルを追加したりしてコミットする（省略）〜

リモートリポジトリへプッシュ。

```bash:ローカル
$ git push origin master
```

ブラウザからプロジェクト名.comへアクセスし、内容が反映されているか確認する。