OmniAICreator/Qiita-1.07M huggingface dataset:
アニメーションやインタラクションのWWDCセッション

# はじめに

この記事は、[Swift愛好会 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/love_swift) 14日目の記事です。

アプリ開発には様々な知識が必要で、情報の入手方法も多くあります。

その中で、アニメーションやインタラクションの実装については、

- UIKit/CoreAnimation等、Appleのフレームワークを使用することになる
- フレームワークの使い方自体はObjective-C/Swiftでほぼ同じなので、Objective-C時代の情報も有用

などの理由から、（古いものも含め）WWDCのセッションを追っていくのが正確かつ効率的だと思います。

（対して、アーキテクチャ設計などは、

- Apple公式より、エンジニアコミュニティ内の議論の方が進んでいる（例えば、Appleは未だにMVCですね）
- Swiftになって考え方が大きく変わった

などの理由から、WWDCの動画だけでなく、カンファレンスでのプレゼン動画やブログ記事などを読む方が、より洗練された実践的な知識が手に入ります。例えば[Realm Academy](https://academy.realm.io/section/apple/)などがあります。）

そこで、WWDCのセッションの中から、アニメーションやインタラクションに関するセッションを抽出してまとめます。


# どうやって抽出したか

1. 題名に "User Interface" / "Interaction" / "Animation" など含まれているものを探す。
2. それらの中で参考に挙げられているセッションを芋づる式に探る。（各セッションの資料の最後に "Related Sessions"というページがあります。）

新しい方の動画から見ていくと、よく参照されている過去の動画等が分かり、面白いです。

# 補足資料
英語のリスニングに自信のない方は、ASCIIwwdcというサイトにスクリプトが載っているので、これを読むのもよいでしょう。
http://asciiwwdc.com/

# アニメーション・インタラクションに関するセッション

### 2017
- [Advanced Animations with UIKit](https://developer.apple.com/videos/play/wwdc2017/230/)
- [Modern User Interaction on iOS](https://developer.apple.com/videos/play/wwdc2017/219/)

### 2016
- [Advances in UIKit Animations and Transitions](https://developer.apple.com/videos/play/wwdc2016/216/)

### 2015
- [What's New in UIKit Dynamics and Visual Effects](https://developer.apple.com/videos/play/wwdc2015/229/)

#### 2014
- [Building Interruptible and Responsive Interactions](https://developer.apple.com/videos/play/wwdc2014/236/)
- [Creating Custom iOS User Interfaces](https://developer.apple.com/videos/play/wwdc2014/221/)
- [Advanced Graphics and Animations for iOS Apps](https://developer.apple.com/videos/play/wwdc2014/419/)
- [Advanced Scrollviews and Touch Handling Techniques](https://developer.apple.com/videos/play/wwdc2014/235/)

#### 2013

- [Custom Transitions Using View Controllers](https://developer.apple.com/videos/play/wwdc2013/218/)
- [Advanced Techniques with UIKit Dynamics](https://developer.apple.com/videos/play/wwdc2013/221/)
- [Getting Started with UIKit Dynamics](https://developer.apple.com/videos/play/wwdc2013/206/)

#### 2012
- [Building Advanced Gesture Recognizers](https://developer.apple.com/videos/play/wwdc2012/233/)

#### 2011
この年は基礎的な資料が豊富でよいです。

- [Understanding UIKit Rendering](https://developer.apple.com/videos/play/wwdc2011/121/)
    - frame / bounds / transform等の基礎の理解によいです
    - 座標系・影や角丸のパフォーマンスなど
- [Core Animation Essentials](https://developer.apple.com/videos/play/wwdc2011/421/)
- [Practical Drawing for iOS Developers](https://developer.apple.com/videos/play/wwdc2011/129/)


# おわりに

短いですが、読んでいただいた皆さんの参考になればうれしいです。

swift愛好会では、今年は2回発表しました。また、俺コンというイベントで、swift愛好会の選抜枠で発表しました。

- 「新規アプリの設計」を設計する [資料](https://speakerdeck.com/yoching/xin-gui-apurifalseshe-ji-woshe-ji-suru) [動画](https://crash.academy/class/171) at 俺コン Vol.1/Day.1 (17/10/2) 
- 手動DIでのアプリアーキテクチャ例 [資料](https://speakerdeck.com/yoching/app-architecture-by-manual-di)  at Swift愛好会 vol23 (17/9/20)
- 川で例えずに理解するObservable [資料](https://speakerdeck.com/yoching/chuan-deli-ezunili-jie-suruobservable) at Swift愛好会 vol16 (17/2/14)

愛好会は、気軽に発表しやすい雰囲気がなによりだと思います。
お世話になりました！また来年もよろしくお願いいたします。
PythonでGitBucketのIssueをExcel出力する（Excel出力編）

## 1. はじめに

[前回の記事](https://qiita.com/5zm/items/57d7abca8e0d447e326d) ではGitBucketのWeb APIを利用してIssueを取得し、Jsonファイルとして保存する方法について説明しました。今回は[xlsxwriter](https://xlsxwriter.readthedocs.io/index.html)というライブラリを利用して、保存したJsonファイルのデータからExcelファイルを出力する方法について説明します。

## 2. xlsxwriterのインストール

xlsxwriterのインストールはpipで簡単に行うことができます。

```
pip install xlsxwriter
```

ソースコードは[GitHub](https://github.com/jmcnamara/XlsxWriter)  に公開されています。
ソースコードからビルドしたい方はリポジトリをcloneした後、`python setup.py install`コマンドでインストールしてください。

## 3. ソースコード

```python:excelApps.py
# -*- coding: utf-8 -*-
import os
import json
import xlsxwriter

# report excel file contains json file data
def report_excel_from_json(fileName):
    # oepn and load json file
    # ★ポイント0
    f = open(fileName, 'r')
    jsonData = json.load(f)
    
    # ★ポイント1
    workbook = xlsxwriter.Workbook(fileName + '.xlsx')
    # ★ポイント2
    worksheet = workbook.add_worksheet('issues')

    rowNum = 0
    # ★ポイント3
    worksheet.write(rowNum, 0, unicode('issue番号', 'utf-8'))
    worksheet.write(rowNum, 1, unicode('ステータス', 'utf-8'))
    worksheet.write(rowNum, 2, unicode('作成日時', 'utf-8'))
    worksheet.write(rowNum, 3, unicode('更新日時', 'utf-8'))
    worksheet.write(rowNum, 4, unicode('URL', 'utf-8'))
    worksheet.write(rowNum, 5, unicode('タイトル', 'utf-8'))
    worksheet.write(rowNum, 6, unicode('本文', 'utf-8'))
    rowNum+=1
    
    for row in jsonData:
        worksheet.write(rowNum, 0, row['number'])
        worksheet.write(rowNum, 1, row['state'])
        worksheet.write(rowNum, 2, row['created_at'])
        worksheet.write(rowNum, 3, row['updated_at'])
        worksheet.write(rowNum, 4, row['html_url'])
        worksheet.write(rowNum, 5, unicode(row['title'].encode('utf-8'), 'utf-8'))
        worksheet.write(rowNum, 6, unicode(row['body'].encode('utf-8'), 'utf-8'))
        rowNum+=1
    
    # ★ポイント4
    workbook.close()

if __name__=='__main__':
    fileName = os.getenv("JSON_FILE")
    report_excel_from_json(fileName)
```

**★ポイント0**

Excelに設定する入力データを用意します。サンプルではJsonファイルに格納されたデータを利用することにします。
ここは要件に応じて準備してください。

**★ポイント1**

最初に`xlsxwriter.Workbook()`でExcelのワークブックのインスタンスを生成します。
引数には作成するExcelファイルのファイル名を指定します。

**★ポイント2**

次にworkbookの`add_worksheet()`でワークシートを作成します。
引数にはシート名を指定します。指定しない場合は`Sheet1`(添え字は1からの連番)のようなシート名で作成されます。
サンプルでは「issues」という名前でシートを作成しました。

**★ポイント3**

セルにデータを設定するにはworksheetの`write()`を利用します。
文字化け対策としてマルチバイト文字はutf-8としました。

* 第１引数　：　0から始まる行番号
* 第２引数　：　0から始まる列番号
* 第３引数　：　書き込むデータ

なおxlsxwriterには`write_datetime()`や`write_url()`などのデータ型に応じた専用のメソッドも用意されています。詳細については[公式ガイドライン](https://xlsxwriter.readthedocs.io/worksheet.html) を参照ください。

**★ポイント4**

最後にworkbookをクローズしてデータをファイルに書き込みます。

## 4. さいごに

今回はxlsxwriterを利用してPythonでExcelファイルを出力する方法について説明しました。

JavaでExcelファイルを扱う場合は[Apache POI](https://poi.apache.org/) をよく利用しますが、xlsxwriterの利用方法はApache POIと似たような感じでした。Apache POIを利用したことがある方には使いやすいライブラリかと思います。

今回はxlsxwriterでゼロからExcelファイルを作成しました。Excelで帳票を作成する場合、事前にテンプレートとなるExcelファイルを用意してデータを流し込む使い方もあるかと思います。機会があればテンプレートファイルを利用したExcel帳票の作成についても記事にできればと思います。
Elastic Beanstalkの設定と冪等性

Elastic Beanstalkを自分の思うように拡張していく上では、`.ebextensions`を調整することが欠かせませんが、書き方を間違えれば正常に動作しない、あるいは反映効率が低下する、というような問題を生じることがあります。

# .ebextensionsという黒魔術

Elastic BeanstalkはAWSのEC2で動いていますが、`.ebextensions`というかたちで設定ファイルを書けば、EC2で可能なことをなんでもできるようになります。逆を返せば、不適切な設定をしてしまうと環境がめちゃくちゃになる、ということです。

# 重要になる「冪等性」

こういった環境構築系のツールに共通する話ですが、Elastic Beanstalkは2回目以降の反映の際にもEC2はそのまま流用します。そのため、

* 最初の環境構築…ベースになるEC2の上にアプリケーションごとの設定を実行して反映させていく
* 2回目以降…すでにある環境に対して、設定をさらに反映していく

という違いがあります。`.ebextensions`を書く場合には、どちらで実行しても問題なく実行されるような、冪等性が要求されます。

## 特に気にしなくていい例

```yaml:02-yum.config
packages:
  yum:
    git: []
```

パッケージマネージャでインストールを行う場合、パッケージマネージャそのものが冪等性を保ってくれる（2回インストールしても2回目は何もしないだけになる）ので、特に考慮の必要はありません。データベースのシードなども、メカニズムの時点で冪等なものを使えばいいでしょう。

```yml:01-time.config
commands:
  01-cp-zoneinfo:
    command: cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

上記はタイムゾーン設定のために入れてありますが、ファイルコピーでの上書きを複数回行っても、（少々無駄ではありますが）実行される内容に問題はないので、そのまま毎回実行させています。

## 要注意な場合

設定ファイルを書き換えるような場合、複数回実行するとうまく動かなくなります。「すでに書き換わっているかどうかチェックする」「実行済みのフラグをどこかに記録しておく」などの方法で、複数回の実行を回避するようにしましょう。

```yml:97-redis.config
commands:
  create_post_dir:
    command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
    ignoreErrors: true
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/97_conf_redis.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      if grep -E '^unix' /etc/redis.conf >/dev/null; then
        exit
      fi
      sudo sed -i -e 's/^save /#save /g' /etc/redis.conf
      sudo sed -i -e 's/^# unix.*$ //g' /etc/redis.conf
      echo 'unixsocket /tmp/redis.sock' | sudo tee -a /etc/redis.conf >/dev/null
      echo 'unixsocketperm 777' | sudo tee -a /etc/redis.conf >/dev/null
      sudo chkconfig redis on
      sudo service redis restart
```

ここでは、RedisのUnixソケットを入れて、保存を無効化するように`/etc/redis.conf`を書き換えていますが[^1]、`if`ですでに書き換わっている場合には脱出しています。

## 気にしなくても動くけど

「リモートからファイルをダウンロードして配置する」ようなものを動かす場合、そのまま何回やっても冪等性という観点では問題ありません。ただ、巨大なファイルで毎回ダウンロードを行えば、回線や時間といったリソースの無駄ですので、「すでにダウンロード済みの場合は処理を飛ばす」ような措置をしておくと、効率化できます。

# アップデート時の注意

`.ebextensions`を書き換えてアップデートしていくと、古いサーバには前の設定が残ったままとなります。そのため、あるだけで設定すると必要なものが抜けていてうまく動かない、という危険もありますので、ときどきは環境全体を再構築して問題がないか確認しておいたほうがいいかもしれません。


[^1]: なお、この環境は1インスタンスで動かしているので、EB管理のEC2の内部にRedisを立てています。
仕事で英語を使えるように

#はじめに
この記事は[プログラマのための英語・外国語 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/lingo)に向けて書いたものです。

#自己紹介
自分はサーバーサイドエンジニアを長年やってます。今の職場では、英語話者が多く、日本語を母国語としない人がいるところでは英語を使用する必要があります。

#技術者の英語獲得
##ググる
自分が持ってる知識では解決できない事があると検索しまくります。英語マニュアルがあれば御の字、[QAサイト](https://stackoverflow.com/)でも恐れずに突き進みます。これで(仕事に必要な)読解力は得られます。

##自動翻訳
英語で書く必要がある場合、素直に[翻訳サイト](https://translate.google.com/)を頼ります。自分が言いたい事をそのまま入力しても正しい表現にならないので、入力する文章をコンピュータが分かりやすいものにします。入出力パターンから英語表現方法が分かってきます。

##自動添削
自分は[自動添削サイト](https://www.grammarly.com/)を使ってます。簡単な文法ミスを防ぐとともに、文法に気をつけるようになります。

##同僚に添削してもらう
英語ができる人がいない場合の方が、自分側の学習効果が高くなります。その人に説明してわかる英語表現を模索する事で、より分かりやすい表現方法が身につきます。

##話す
英語話者と話す必要があれば話しましょう。仕事上で必要であれば、相手は真剣に理解しようと思ってるはずです。不恰好でも良いので、「伝わった」という成功体験を積んでいきます。モチベになります。

##続ける
業務でもいいので、毎日少しでも英語に触れるようにします。英語へのやる気があっても、長続きしないと意味がないので、気張らず、着実に続ける事が肝要だと思っています。

#終わりに
仕事で必要な英語力は、日々の仕事で使っていくことで得られます。というか、英語が必須であればやるしか無いのです... orz

なんのひねりも無くなってしまいましたが、一緒に頑張りましょう。
LaravelとElastic Beanstalkでサクッとスタブサーバを作る

# 概要

とにかく大至急スタブAPIサーバが必要でした。

Laravelのルーティング設定だったらすぐできるな
↓
サーバどうしよう。PHP７のサーバが手元にない
↓
Elastic Beastalkでできるかな

# Laravelの準備

Laravelのプロジェクトを新規に作成。

```:Laravelプロジェクトを作成
composer create-project --prefer-dist laravel/laravel stub-server --no-secure-http
```

モックなのでルーティングだけ書いて済ませます。

```php:routes/api.php
Route::get('test', function () {
    $res = <<< END
{
  "token": "token"
}
END;
    return response($res)
        ->withHeaders([
            'Content-Type' => 'application/json',
        ]);
});
```

アプリ側はこれだけです。
リクエストパラメータのバリデーションや、ステータス200以外も返したい場合はこれだと対応できないので、コントローラに書く必要があります。

# zipでまとめる

Beanstalkにデプロイするにはいくつか方法がありますが、今回はzipファイルにして管理コンソールからアップします。

```console:zipファイル作成
$ cd stub-server
$ zip ../laravel.zip -r * .[^.]*
```

# Elastic Beanstalkの設定

管理コンソールのBeanstalkの画面で **新しいアプリケーションの作成** をクリックします。
アプリケーション名を入力して **作成** ボタンをクリック

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/20940/af52fe77-c310-c5e9-1c27-1fcfa72d857f.jpeg)

以下のような画面に遷移するので **今すぐ作成しましょう** をクリック

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/20940/862dd935-c472-d2d7-20e0-f28d7b350db4.jpeg)

開いたウィンドウの **ウェブサーバー環境** を選択して **選択** をクリック
 
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/20940/d8720630-ccf7-880d-a332-b4f149654d1f.jpeg)

URLを決めて **使用可能かチェック** をクリックします。使用可能なら下記のようになります。

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/20940/b9ec7ead-e10f-c387-b828-4ecac494d68d.jpeg)

プラットフォームに **PHP** 、アプリケーションコードに **コードのアップロード** を選択し **アップロード** ボタンをクリックします。

![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/20940/7193d100-6037-3312-bcd2-7217aed26509.jpeg)

先ほど作成したZIPファイルを選択し **アップロード** します。

![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/20940/1dd46e7b-9494-a941-5236-8765ae0cb9fe.jpeg)

作成が始まります。

![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/20940/43536e77-6711-4572-b0c8-857283716f59.jpeg)

5分ほどで作成完了します。 ※現在アプリは削除済みです

![8.jpg](https://qiita-image-store.s3.amazonaws.com/0/20940/23ad4f67-c551-3cca-b1b1-ee88509b43e0.jpeg)

ただ、このままではアクセスしても403エラーになるので、最後にドキュメントルートの設定を行います。

![9.jpg](https://qiita-image-store.s3.amazonaws.com/0/20940/60f155fc-e481-d53e-519e-5bb013a894f9.jpeg)

![10.jpg](https://qiita-image-store.s3.amazonaws.com/0/20940/778cd0da-edaf-58dc-f0ed-47d8cd1dd42b.jpeg)

設定後、自動的に環境に反映されるのを待って `ドメイン/api/XXXXXXXXX` にアクセスすると、、、

![11.jpg](https://qiita-image-store.s3.amazonaws.com/0/20940/4c568cfb-2b56-0079-89de-f74e493b2075.jpeg)

表示されました😃

今回はここまでですが、HTTPS化したいですね。
[備忘録]Linuxコマンド [scpコマンド]

業務でscpコマンドを使ったので備忘録代わりに残しておこうと思います。

##scpコマンドとは
調べてみると
>「scp」コマンドは「Secure Copy」の略で、sshを使用してリモートホストとローカルホスト間の通信を暗号化したうえで、ファイルをコピー送信するコマンドである。

と書いてあります。画像ファイルなどをローカルから本番環境に上げる際などに効果を発揮するコマンドですね。

##使い方
自分の場合はローカル環境からリモート環境(本番環境)にファイルを送信する際に使いました。

####ローカル→リモートにファイルを送信したい場合
```
$ scp コピーするローカルのファイルパス ユーザ-の名前@リモートのホスト名:保存したいパス
```

ローカル→リモートだけでなく、リモート→ローカルにファイルを送信することもできます。

####リモート→ローカルにファイルを送信したい場合

```
$ scp ユーザの名前@リモートのホスト名:コピーするリモートのファイル ローカルのコピー先
```
要は

```
$scp[コピー元][コピー先]
```
ということになります。

##気をつけること
7分くらい嵌ってしまった事として、画像のパスを間違えるというミスをしてしまいました。
パスは相対パス(自分の現在のフォルダからのパス)です。

##引用
https://eng-entrance.com/linux-ssh-scp
https://qiita.com/katsukii/items/225cd3de6d3d06a9abcb
hyper-pokemonにアジョットを追加する

![Screenshot_20171207_230228.png](https://qiita-image-store.s3.amazonaws.com/0/181016/3edee821-30c9-808f-2ddb-284ee61e4099.png)

これを
![Screenshot_20171207_230318.png](https://qiita-image-store.s3.amazonaws.com/0/181016/0f4f6dff-d2a0-42ce-40ff-98f5321a7114.png)
こうする

## 準備
まず[hyper-pokemon](https://github.com/klauscfhq/hyper-pokemon)をforkしてcloneした。clone場所は`$HOME/.hyper_plugins/local/hyper-pokemon`。その後、リポジトリに移動し、`yarn`を実行。
その後`.hyper.js`に、以下のように記述。

```js:.hyper.js
  // in development, you can create a directory under
  // `~/.hyper_plugins/local/` and include it here
  // to load it and avoid it being `npm install`ed
  localPlugins: ["hyper-pokemon"],
```
さらに、pluginsから"hyper-pokemon"を削除する。

このhyper-pokemonが、`$HOME/.hyper_plugins/node_modules`にあるという前提になっているので、symlinkを張る。

```shell-session
$ cd ~/.hyper_plugins/node_modules
$ ln -s ../local/hyper-pokemon/ hyper-pokemon
```
これで、`local/hyper-pokemon`内で開発できるようになった。以下では特に断わらない限りカレントディレクトリを`local/hyper-pokemon`とする。

## アジョットの背景画像の準備
背景画像は1920x1080pxなので、1920x1080pxの画像をInkscapeで制作する。
![アジョットの背景](https://raw.githubusercontent.com/KimotoYanke/hyper-pokemon/master/backgrounds/adgeot.png)
Pixabayで見つけた成人男性の裸のベクタ画像と、Wikipediaで見つけたアジのスケッチを組み合わせてクソコラを作った。

## アジョットの背景画像の設定
pokemon.ymlに、adgeotを追加

```diff:pokemon.yml
     tertiary: '#BA5F79'
     unibody: '#F4C6D3'

+  # Fanmade Pokemon
+  adgeot:
+    primary: '#515151'
+    secondary: '#BF6B34'
+    tertiary: '#DEAA87'
+    unibody: '#172F5C'
+
 ##
 # Default values
 ##
```
こちらの環境では、unibodyが背景(つまりウィンドウ枠)、secondaryが文字の色で、tertiaryが強調する文字の色。primaryは知らん。
tertiaryがアジョットの肌の色、secondaryがその影の色である。気色悪さを出したかったのでsecondaryを肌の色にしようかと思ったが、そうなるとtertiaryが強調文字が見にくいという逆転が起きたのでこのようにした。基本的に背景画像から色を取ったが、それだと見にくかったので色々調整した。

## アジョットのアイコンGIFの準備
ポケットモンスターVIPのWikiで見つかった画像を適当に弄って、以下のような64*64pxの画像をまず作った。
![adgeot0](https://raw.githubusercontent.com/KimotoYanke/hyper-pokemon/adgeot/media/adgeot1.png)

これをGIMPで開き、GIF動画に変換する。まず1つ目の画像をずらして2つ目の画像を作る(この画像は1pxしかずれていないので分かりづらいが)。
![adgeot2](https://raw.githubusercontent.com/KimotoYanke/hyper-pokemon/adgeot/media/adgeot2.png)

これらをGIMPでレイヤーとして開き、`adgeot.gif`でエクスポートする。するとGIF画像としてエクスポートする際に設定画面が出るので、「アニメーションとしてエクスポート」をONに、「指定しない場合のディレイ」を340ミリ秒に、「指定しない場合のフレーム処理」を「レイヤー毎に1フレーム(置換)」にそれぞれ設定する。
![adgeot-gif](https://raw.githubusercontent.com/KimotoYanke/hyper-pokemon/adgeot/pokecursors/adgeot.gif)

これを`pokecursors`ディレクトリに突っ込んだ

## 完成
![Screenshot_20171207_230318.png](https://qiita-image-store.s3.amazonaws.com/0/181016/0f4f6dff-d2a0-42ce-40ff-98f5321a7114.png)

## 反省点
- 背景色をもうちょっと淡くするべきだった
    - でも大海感も出したかった
- あきらめないでSVGでアジを描くべきだった
- 大百科によるとアジョットの綴りはAjotだったが、全部Adgeotで書いてしまった
- なぜ私はポケモンをやったことがないのにこんな記事を書いたのか

## まとめ
オリポケをhyper-pokemonに追加するには、

- 背景
- 64x64のGIFアイコン
- 文字配色

を作ればできる。
ClojureをAndroid StudioでビルドしてAndroidで動かす

# 概要

ClojureのGradle用のプラグインとして、[gradle-clojure](https://github.com/gradle-clojure/gradle-clojure)というものが存在する。私はそのgradle-clojureをベースにAndroidのビルド用の機能を作成しており、本記事ではその紹介を行う。
現状はバージョン0.1くらいの完成度なので実用段階ではないが、試してフィードバックをいただけると嬉しい。

# Clojure on Androidの現状と問題点

実は既に、[Clojure on Android](http://clojure-android.info/)というプロジェクトが数年前から存在し、AndroidでClojureを使う場合は、Clojure on Androidプロジェクトの成果物を使うのが定番となっている(React Native + clojurescriptを使う方法もあるが、ここでは言及しない)。

Clojure on Androidでは、leiningen + lein-droidプラグインを使ってビルドを行う仕組みなのだが、現状以下の問題点がある。

- Androidのビルドシステムの機能をlein-droidで独自に実装し直しているので、Androidビルドシステムの変化に追従するのにコストがかかる。
- 開発が止まっている。
  (しかも、最新のlein-droidは[このパッチ](https://github.com/ne-sachirou/lein-droid/commit/ae46a35e50eafd42395b9ece6d2e2f72105b0864)を当てないとビルドができない。)
- Androidの標準ビルドシステムはGradleなので、整合性が悪い。

そこで、gradle-clojureにAndroid用のビルド機能を追加することにした。

# Android Studioでビルドできるサンプルアプリ

gradle-clojureの[Android対応](https://github.com/anolivetree/gradle-clojure/tree/android-support)と、そのAndroid対応版でビルドできる[サンプルプロジェクト](https://github.com/anolivetree/gradle-clojure-android-sample)を用意した。

```
$ git clone https://github.com/anolivetree/gradle-clojure-android-sample.git
```
サンプルプロジェクトをビルドし実行すると、以下のような表示になる(はず)。

![clojure-android.png](https://qiita-image-store.s3.amazonaws.com/0/91308/7f7eb3f7-ecbc-2b1d-9647-d3fc44db62f0.png)

アプリを起動すると、http://www.yahoo.co.jp から(Clojureのライブラリである)http-kitを使ってデータを取得し、TextViewに表示する。上部のGETボタンを押すと、Logcatに"hello"と教示される。

もしClassNotFoundExceptionでActivityの起動ができない場合は、

- targetSdkVersionを下げる
- ^によるtype hintを付けまくる

と、解決するかもしれない。

## nREPL

サンプルアプリにはnREPLを組み込んでいて、アプリの起動後数秒でnREPLが接続可能となる。nREPLを起動するためのソースは、[neko](https://github.com/clojure-android/neko)のソースを借用している。

nREPLに接続するには、
```
$ adb forward tcp:9999 tcp:9999
```
としたのち、lein replで9999ポートに接続すると、REPLが動く。

```
$ lein repl :connect 9999
Connecting to nREPL at 127.0.0.1:9999
REPL-y 0.3.7, nREPL 0.2.10
Clojure 1.7.0
Dalvik 0.9
FileNotFoundException Could not locate clojure/java/javadoc__init.class or clojure/java/javadoc.clj on classpath.  clojure.lang.RT.load (RT.java:462)
#object[clojure.lang.Namespace 0xd6f2923 "user"]
Error loading namespace; falling back to user
nil
user=> (+ 1 2)
3
user=> 
```

nREPLは軽い動作確認しかしていないので、もしかしたらちゃんと動かないかもしれない。

# 今後の課題とTODO

たくさんある。

## Clojureのバージョンが古い

Clojure on Androidプロジェクトで、素のClojureに[Android対応を行ったClojure](https://github.com/clojure-android/clojure)を提供しているが、バージョンが1.7.0と古い。Android用の変更を反映した1.8(もしくは1.9)を用意したい。

## クラスの動的なロードが遅い

クラスの動的なロード時に

1. ClojureのコンパイラがJava bytecodeを作成
2. dxでDalvik bytecodeに変換し、ロード

としているためなのだが、非常に遅い。将来的には直接Dalvikのbytecodeを出力したい。

## JavaからClojureで作成したクラスの呼び出しができない

現状は先に.javaをコンパイルし、次に.cljのコンパイルを行っている。
そのため、ClojureからJavaの呼び出しは可能だが、逆はできない。

## library project, test projectの対応

試していないが、きっと動かないと思う。

## 未使用ファイルもすべてAOTということはできない。

lein-droidにある、:aot :all-with-unused相当のことはできない。
コンピュータで扱える最小の数（マシンイプシロン）

##マシンイプシロンとは
マシン（計算機）イプシロンとは、浮動小数点数において、「1より大きい最小の数」と1との差のことである。
[Wikipedia](https://ja.wikipedia.org/wiki/計算機イプシロン)

つまり、コンピュータ（計算機）で扱える数の最小の数のことを指します。
コンピュータ・アーキテクチャ、OS、言語などによりこの値はまちまちです。

##マシンイプシロンが与える影響
ごく小さな数を含む浮動小数点数を利用した数値計算などで誤差が表出します。
非常にループの多い、つまり、浮動小数点数を扱った計算において誤差が溜まりやすい処理を行うと、数値計算によってえられる値の精度に影響を及ぼします。

##どうやってマシンイプシロンを導出するのか？
マシンイプシロンを求める方法は単純です。
変数（浮動小数点数）を永遠と１/２してゆくのです。
ループのたびに０と比較をしてゆくと、ある瞬間、コンピュータが１/２を繰り返した数と、０との差が認識できなくなり、コンピュータは変数＝０と認識します。
つまり、そのループの一段前の変数が「コンピュータで扱える浮動小数点数」＝マシンイプシロンとなります。

##実際にやってみた
今回利用した環境は以下のとおりです。

| PC | Macbook Air 2015 Early |
|:-----------|------------:|
| OS | OSX 10.13.2 | 
| 言語      | Python　3.6.3 | 

###ソース

```machineepsilon.py
inum = 1.0
tmpnum = 0.0
renum = 0.0

while inum != 0.0:
    inum = inum/2.0
    renum = tmpnum
    tmpnum = inum

print("{0:09.8E}".format(renum))
```
###結果

```result
4.94065646E-324
```
##おわりに
結果として「4.94065646E-324」というとても小さな値が得られました。
つまり、上記環境でのマシンイプシロンは「4.94065646E-324」ということになります。
因みに、以前筆者がWindows環境やLinux環境でも同様の実験をしたのですが、
Widnows環境（VisualStudio C言語）約20桁（E-20）
Linux環境（gcc　C言語）約70桁（E-70）
Unix環境（gcc C言語）約80桁（E-80）
Mac環境 (xcode　C言語)　約110桁（E-110）

（このMacの精度を目の当たりにして私は愕然としMacを購入を決めたのは無理もない。）

今回はPythonで実験を行ったが、その桁数はE-324であり、上記環境の遥かに高い精度で浮動小数点数を扱えるといえる。Pythonで扱う浮動小数点の変数は可変長なのだろうか・・・？（調査を行って後日加筆修正予定）

###2017/12/17 編集
友人から「PythonにはもともともマシンイプシロンのDefine値が設定されている」という指摘をうけ、後続の検証をすすめる。
[参考サイト](https://docs.python.jp/3/library/sys.html)
sys.float_infoに「epsilon」に「1と、その次の表現可能なfloat値の差」と説明がある。
早速実装をし、本件の値と差異がないか検証する。

```machineepsilon_v2.py
import sys
inum = 1.0
tmpnum = 0.0
renum = 0.0

while inum != 0.0:
    inum = inum/2.0
    renum = tmpnum
    tmpnum = inum

print("本件　　　　　　{0:09.8E}".format(renum))
print("ｓｙｓパラメータ{0:09.8E}".format(sys.float_info.epsilon))
```

###結果

```result
本件　　　　　4.94065646E-324
ｓｙｓパラメータ　2.22044605E-16
```
上記結果の値に大きな差が見られた。数値計算などを行う場合は本件で扱う値を利用したほうがより誤差の少ない数値計算ができると思われる。
【初心者必見】条件式を思い通りに書く3つの基本的なこと

あー、条件式書きたくなってきたなー！
うわっ！ちょうど式書くとこあるやん！書いてみよっと！ぽちっとな！(某芸人風)

と書き始めたはいいけれども、なんかよくわからん式ができました〜ってなっちゃう人に読んでもらいたい記事となっております。

##優先順位

優先順位を意識していないと、思っているものとは違う結果が返ってきて
うーんうーんと首をひねることになります。

たとえば以下の式

```
$a = $b || $c;
```
\$b か \$c のどちらかが *true* であれば $a に *true* を代入する、という式です。
**(決して\$b か \$c の値を代入するというわけではないですよ！)**

値を代入するんだ！(\*^◯^\*) と勘違いしなければ特に難しくないものです。

では、以下の式はどうでしょうか？

```
$a = $b or $c;
```
感覚としては同じ「\$b か \$c のどちらかが *true* であれば $a に *true* を代入する」です。

何が違うんでしょうか？~~とりま~~とりあえず試してみましょう。

```
$a = false || true;
var_dump($a);      // (bool)true

$a = false or true;
var_dump($a);      // (bool)false
```

違うんかーい！
となったあなた、これには理由があるんです。

###ここで差がつく！
上の例に出てきた `=` と `||` と `or` ですが、
どれも計算される**優先順位**が違うのです。

この３つの強さは
`||` > `=` > `or` となっています。

つまり
`$a = false || true;` は 、
1. `false || true` が処理され *true* となる
2. `$a = true` となり、結果 *true* が返される

となりますが、

`$a = false or true;` は、
1. `$a = false` が処理され *false* となる
2. `false or true` が処理され *true* となる(けれども `=` が処理された後なので変数には入らない)
3. `$a = false` となっているので、結果 *false* が返される

ということなのです。奥が深いですね〜。

他の優先順位はどうなっているの？？って興味が出た人は、
[PHPマニュアル：演算子の優先順位](http://php.net/manual/ja/language.operators.precedence.php)を見ましょう！

##結合方向
↑のリンク先を見てきた方は、
「結合ってなだろ？？~~ちょっとやらｓ~~:thinking::thinking::thinking:」
ってきっとなったことでしょう。きっとなったことでしょう！！

この結合が意味を成すのは複数使った演算子の**優先順位が同じ**ときです。
優先順位が違う場合には考慮されません。

優先順位が同じものが複数存在している時にどちらを先に演算するか決める、といえばわかりやすいでしょうか。

```
$b = $c = $d = 5;  // = の結合は「右」なので $d = 5 から計算される
$a = $b + $c - $d; // + - の結合は「左」なので $b + $c から計算され、 $a = 5 になる
```

また、「結合しない」というものもあったかと思いますが、いまいちピンとこないと思います。
これも、「一緒に計算することはできない」等と置き換えて読むといいかもです。

例えば

```
if (30 < $a < 100) {}
```
こうやりたかった人はいると思うのですけれども(というか自分がしたかった)
`<` は「結合しない」グループに属しているので、
`30 < $a` の後に`$a < 100` を処理するということはできないのです。

なのでみんな
`30 < $a || $a < 100` 等とするわけなのです。

###ここで差がつく！
結合方向を理解していれば、今まで別々に書いていたあんな式やこんな式なども
うまくまとめることができます。

- 優先順位が同じで結合方向が〜
  - 「右」：右から計算していく
  - 「左」：左から計算していく
  - 「結合しない」：一緒には計算できない


```php:どちらも同じ
$a = 5;
$a += 3;
$b = $a;

$a = 5;
$b = $a+= 3;
```

```php:どちらも同じ
$a = 1;
$b = 1;
$c = 1;

$a = $b = $c = 1;
```
~~(夢が広がるほどではないですけど)~~
(多用しすぎると逆にみにくくなるので注意)

##無理に否定しない

たとえば、 『りんごとみかん、どちらかを持っているか』という式を書くと
```
if ($apple === true || $orange === true){}
```
となります。
で、これを否定する式を書くということになったときに、安直に書くと
```
if (!($apple === true || $orange === true)){}
```
って書いちゃう人、結構いると思います。(というか自分がs略)

でもこれ、ややこしくないですか？
僕は頭がフットーしそうになります。

「『りんごかみかんのどちらかを持っている』じゃないやつが *true* になるから……
えっとつまり……どゆこと？？」
って考えちゃいます。

上の式に限って言えば、
**「りんごかみかんのどちらかを持っている」**のは *false*
つまり、
**「りんごとみかんのどちらも持っていない」**のであれば *true*
と読み替えることができます。

ということは、

```
if (!($apple === true || $orange === true)){}

if ($apple !== true && $orange !== true) {}

```
と書くことができます。
気づきましたか？『君の名は。』ばりに色々入れ替わっていますね。

###ここで差がつく！！
このように真⇔偽、論理積⇔論理和を入れ替えることを**『ド・モルガンの法則』**と呼びます。(ちょっと説明が乱暴だけど)

```php:ド・モルガンの法則
not(a or b or c) ⇔ (not a) and (not b) and (not c)
not(a and b and c) ⇔ (not a) or (not b) or (not c)
```

僕がリア充かイケメンか金持ちのどれか、ではない場合、
リア充でもない、イケメンでもない、金持ちでもないってことだよ！！！


##ということで
- 優先順位
- 結合方向
- ド・モルガンの法則

の3つを紹介しました。
まだまだ他にも改善する方法はたくさんあるのですが、
初心者のうちは、この3つを覚えておくだけでも見違えるようになることでしょう。

めっちゃきれいな式できた〜:relaxed:ってなるように頑張りましょう！
a-blog cmsのエントリーの分けかたについて（WordPressと比較して）

a-blog cmsはWordPressではプラグインで実装するような機能がほとんど揃っている多機能なCMSですが、その根幹となるエントリー分類の方法はとてもシンプルです。「子ブログで分けるか、カテゴリーで分けるか」そのふたつしかありません。シンプルだからこそ、応用が効いて何にでも使え、カスタマイズが簡単で、後からの変更にも強いです。「固定ページ」「投稿」「カスタム投稿タイプ（階層性あり／なし）」「カテゴリー」などいろいろあるWordPressの分類方法と、どう違っているのか、見ていきます。

## WordPressには「固定ページ」と「投稿」の区別があるが、a-blog cmsにはない
WordPressには「固定ページ」と「投稿」の区別があり、それぞれ次のような特徴を持っています。

### 固定ページ
- 階層性（親子関係）がある
- 管理画面の「順序」順に並ぶ

### 投稿
- カテゴリーによって分類される
- 日付が新しい順に並ぶ
- アーカイブを持つ

「固定ページ」と「投稿」の区別がないa-blog cms では、これらの違いはどう実現されているのでしょうか。a-blog cmsを新規インストールすると登録されているデフォルトのコンテンツを例に見ていきます。

![カスタムサイズ – 1.png](https://qiita-image-store.s3.amazonaws.com/0/78591/a6b85c2b-b974-84e8-b345-6274c90fc6e3.png)

青色で示したのがカテゴリー、黄色で示したのがエントリーです。WordPressでこれと同じような構成でサイトを作る場合には、「お知らせ」を「投稿」扱い、「会社概要」と「お問い合わせ」を固定ページ扱い、「採用情報」と「物件情報」をカスタム投稿タイプ（階層性なし）扱いにするのが普通です。

WordPressでは固定ページ扱いにするところの「会社概要」は、a-blog cmsでは「会社概要」カテゴリーの中の親ページ的な役割をする「会社概要」エントリーの、ファイル名を空欄にすれば良いだけ[^1]です。カテゴリーの中でエントリーは基本並列ですが、その中にファイル名が空欄のエントリーがあればそれが親ページ的な役割になり、/{カテゴリーコード}/のURL（ここでは/company/）でそのエントリーが表示されます。表示に使用されるテンプレートは当然エントリー用のテンプレート（entry.html）です。

カテゴリーの中にファイル名が空欄のエントリーがない、「お知らせ」「お問い合わせ」「採用情報」「物件情報」では、/{カテゴリーコード}/のURLで表示されるのは一覧ページ用のテンプレート（index.html）です。

- WordPressからの移行でURLを変えたくない、という場合
- 「交通アクセス」エントリーの子ページ的な役割のエントリーが将来的に必要になりそうだ、という場合

「会社概要（company）」カテゴリーの子カテゴリーとして「交通アクセス（access）」カテゴリーを作成し、「交通アクセス」エントリーの属するカテゴリーを「交通アクセス（access）」に変更して、ファイル名を空欄にすれば、

- 「会社概要」エントリーのURLは/company/
- 「交通アクセス」エントリーのURLは/company/access/

にすることができます。

## WordPressではカテゴリーは複数選べるが、a-blog cmsではひとつしか選べない
このように、a-blog cmsはエントリー自体は階層性を持たず、カテゴリーの階層、つまりディレクトリ構造がそのまま親子関係[^2]になります。a-blog cmsではエントリーのカテゴリーがひとつしか選べないことがこれを可能にしています。WordPressにおいてもカテゴリーにはもちろん階層性がありますが、複数選択が可能なので、カテゴリーの階層性は投稿の階層性とは関係はなく、そのため、投稿に階層性を持たせるには固定ページという別の考え方が必要なのです。

![カスタムサイズ – 2.png](https://qiita-image-store.s3.amazonaws.com/0/78591/89835451-4461-10ea-1a65-726ed82bc0b2.png)

## パーマリンクとテンプレート階層
カテゴリーをひとつしか選べないことにはたくさんのメリットがあります。a-blog cmsにおいては、カテゴリーの親子関係はそのままディレクトリの構造であり、パーマリンクとも一致し、テンプレートの構造とも一致しています。WordPressではこれらはすべて別の概念であり、特にパーマリンクには複数の選択肢があり、カスタム投稿タイプを駆使するようなサイトでは、条件分岐も一筋縄ではいきません。「外観 > メニュー」の階層性はまた別の概念であり、パンくずリストの構造も複雑です。
複数選択が必要な場合にはタグという機能が別にあるので、カテゴリーがひとつしか選べないことはとても合理的[^3]です。

## WordPressの「マルチブログ」とa-blog cmsの「子ブログ」の違い
a-blog cmsには「カテゴリー」の他に「子ブログ」という分け方があります。ブログによってユーザーを分けたり、子ブログだけをシークレットブログにすることもできます。WordPressのマルチブログはブログを並列に扱うだけであり、複数インストールすることに比べてあまりメリットを感じないので使ったことがないのですが、階層性のあるa-blog cmsの「子ブログ」には、たくさんの便利な使い方があるようです。このあたりもまた、勉強したら書いていきたいと思います。

[^1]: a-blog cmsでは各エントリーの編集画面に「ファイル名」（WordPressでいうところのスラッグ）を入力するフィールドがあります。エントリーの新規作成時にはデフォルトで「entry-{エントリーID}.html」が入力されていて、必要に応じて変更することができます。とても便利。

[^2]: 子ページまでだけで、URLをWordPress風にしなくてよければカテゴリーの階層性とエントリーの階層性は関係なく、親ページ的役割のエントリーのファイル名を空にするだけで良いです。

[^3]: WordPressでは固定ページやカスタム投稿タイプの特定のページに他のカスタム投稿タイプのインデックス（アーカイブ）を載せたい、というようなカスタマイズの要望があとから出てくることは多いですが、そうなるとメニューも含めてかなり構成を整えてチェックするのに工数がかかってしまいます。a-blog cmsの場合には、それらはすべて、子ブログとカテゴリーの階層性だけで考えることができ、拡張性も高いです。
肯定的先読みで「ある文字列を含むn字以上」の正規表現

#正規表現の考え方
【半角英数字4文字以上のIDをご入力ください。数字だけのIDは不可。】
上記のケースを正規表現でどうすればよいか？
正規表現を考える場合、条件を細分化することが重要である。
今回のケースでは、半角英数字、繰り返しのパターン、文字列を含むの3つに分ける。

##半角英数字
半角英数字を正規表現で書く場合、
[a-z]：半角英字（小文字）
[A-Z]：半角英字（大文字）
[0-9]：半角数字
上記の組み合わせで表現できる。

```js 
/[a-zA-Z0-9]/ // 半角英数字
```

ちなみに正規表現には`\w`というメタ文字がある。これは`[a-zA-Z0-9_]`（半角英数字とアンダースコア）を意味する。

##繰り返しのパターン
n回以上の繰り返し：{n,}
{n,}は直前の要素をn回以上繰り返す。

```js 
/[a-z]{4,}/ // 4文字以上の半角英字（小文字）を含む
```
先の半角英数字と組み合わせることで、4文字以上の半角英数字を表現できる。

```js 
/[a-zA-Z0-9]{4,}/ // 4文字以上の半角英数字
```
しかし、上記の組み合わせだけでは`'0123'`のような文字列でもマッチするため、
【数字だけのIDは不可】に対応できていない。

```js 
console.log(/[a-zA-Z0-9]{4,}/.test('0123'); // 結果：true
```
そこで肯定的先読みを利用することで対応できる。

##文字列を含む
###肯定的先読み
x(?=y)はxの後にyがあること意味する。

```js 
console.log(/j(?=avascript)/.exec('javascript')); // 結果：['j']
console.log(/j(?=avascript)/.exec('jquery')); // 結果：null
```

肯定的先読みを用いて『0文字以上のあらゆる文字の後に半角英数字がある』と書けば、
『半角英数字を含む』という正規表現にすることができる。
0文字以上のあらゆる文字は正規表現で`.*`と書くので、

```js 
/(?=.*[a-zA-Z])/ // 半角英数字を含む
```
よって、【数字だけのIDは不可】に下記の正規表現で対応できる。

```js 
console.log(/(?=.*[a-zA-Z])[a-zA-Z0-9]{4,}/.test('0123'); // 結果：false
```
あとは、文字列の位置を指定するアンカーで`^`（文字列の先頭）、`$`（文字列の末尾）囲めば完成！

```js 
/^(?=.*[a-zA-Z])[a-zA-Z0-9]{4,}$/ // 4文字以上の半角英数字（数字だけは不可）
```
##まとめ
今回は、肯定的先読みを用いた正規表現を紹介しました。マッチさせたいパターンを細分化することで複雑な正規表現を比較的容易にすることができます。
デザインパターン(2)：Builder

#Builderとは
複数のインスタンス間にて共通の処理が必要な場合、その処理を隠蔽することで
同じ処理でも内部処理を異なるものにすることができる実装のこと。　
ここではmainLanguageというフィールドを持つ、Peopleクラスを元に日本人と米国人を作る。

##手順①
複数のインスタンス間にて共通の処理を定義するインタフェースを作成する。(=Builderクラス)

```java:Builder.java
public interface Builder {
	void createMainLanguage(); //主言語をセット
	People getResult(); //Peopleインスタンスを返却する
}
```
```java:People.java
public class People {
    //主語
	private String mainLanguage;

	public String getMainLanguage() {
		return mainLanguage;
	}

	public void setMainLanguage(String mainLanguage) {
		this.mainLanguage = mainLanguage;
	}
	
	void hello() {
		System.out.println("こんにちは。主言語は" + mainLanguage);
	}
}
```

##手順②
定義したインタフェースの実装を持ったクラスを作成する。（=ConcreteBuilderクラス）
**生成するインスタンスの種類が増えるときは、このクラスを生成して増やす**

```java:JapaneseBuilder.java
//日本人Builder
public class JapaneseBuilder implements Builder {
	private People people;
	
	public JapaneseBuilder() {
		this.people = new People();
	}

	@Override
	public void createMainLanguage() {
		people.setMainLanguage("Japanese"); //Japanenseが主言語
	}

	@Override
	public People getResult() {
		return this.people;
	}
}
```
```java:AmericanBuilder.java
//米国人Builder
public class AmericanBuilder implements Builder {
	private People people;
	
	public AmericanBuilder() {
		this.people = new People();
	}

	@Override
	public void createMainLanguage() {
		people.setMainLanguage("English"); //Englishが主言語
	}

	@Override
	public People getResult() {
		return this.people;
	}
}
```

##手順③
実際のインスタンス生成を担うクラスを作成する。（=Directorクラス）
**※必ずインタフェースをコンストラクタの引数に持たせること**
DirectorにBuilderを渡すことにより、ConcreteBuilderクラスに依存しない作りになる。
つまりDirectorは実際のクラスである、ConcreteBuilderが何なのかを意識しない。

```java:Director.java
public class Director {
	private Builder builder;
	
	public Director(Builder builder) {
		this.builder = builder;
	}
	
	public People construct() {
		builder.createMainLanguage();
		return builder.getResult();
	}
}
```

##呼び出し方
①Builderインタフェースを型に持つ、builderインスタンスを生成する。
実際の処理は生成時のConcreteBuilderに依存する。
②builderインスタンスを引数として、Directorインスタンスを生成する。

```java:Main.java
public class Main {
	public static void main(String[] args) {
		if (args[0].equals("Japanese")) {
			// 日本人ビルダを生成
			Builder builder = new JapaneseBuilder();
			// DirectorはBulderインタフェースを渡しているだけなので、Builderの内部実装までは知らない。
			Director director = new Director(builder);
			People people = director.construct();
			people.hello();
		} else if (args[0].equals("English")) {
			Builder builder = new AmericanBuilder();
			Director director = new Director(builder);
			People people = director.construct();
			people.hello();
		} else {
			throw new IllegalArgumentException();
		}
	}
}
```

*ちなみにインタフェースではなく、抽象クラスを使用してBuilderパターンを実現してるのもあったけど*
*どっちがいいんだろ・・・よくわからん。。。*
CppCheckをgit pre-commitで使ってみた

「[グレンジ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/grenge)」13日目を担当の"ito_shin_2017"です

##cppcheckとは

C/C++用の静的解析ツールです。メモリリーク、アロケーション(確保と解放)のミスマッチ、バッファオーバーラン、さらに多くのチェックを行います。目標は、0%の誤認識としています。
[ここ](https://ja.osdn.net/projects/sfnet_cppcheck/)から引用

cppcheck（公式）
http://cppcheck.sourceforge.net/

## cppcheckのプラグインなど一覧（公式サイトから引用）

```
Clients and plugins

Cppcheck is integrated with many popular development tools. For instance:

CLion - Cppcheck plugin
Code::Blocks - integrated
CodeDX (software assurance tool) - integrated
CodeLite - integrated
CppDepend 5 - integrated
Eclipse - Cppcheclipse
KDevelop - integrated since v5.1
gedit - gedit plugin
Hudson - Cppcheck Plugin
Jenkins - Cppcheck Plugin
Mercurial (Linux) - pre-commit hook - Check for new errors on commit (requires interactive terminal)
Tortoise SVN - Adding a pre-commit hook script
Git (Linux) - pre-commit hook - Check for errors in files going into commit (requires interactive terminal)
Visual Studio - Visual Studio plugin
QtCreator - Qt Project Tool (qpt)
```

"Git (Linux) - pre-commit hook - Check for errors in files"が便利そうなので試しに使ってみる

（git pre-commitの説明は[コチラ](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)）

## コマンドインストール

```
brew install cppcheck
```

## ファイルを設置

https://github.com/danmar/cppcheck/blob/master/tools/git-pre-commit-cppcheck

↑のファイルをpre-commitにリネームして
".git/hooks/"に設置（※実行権限付与してください）

## 指摘してくれる項目の重要度タイプについて
"cppcheck --errorlist"でそれぞれの指摘内容の重要度タイプ（SeverityType）が確認できます
今回のpre-commitのケースでは、errorにあたるものが含まれている場合だけcommitが弾かれるようにはなっています

・error
メモリリークなどの重大で、確実なエラーを示します
例）明らかな配列外参照
・warning
深刻なランタイムエラーを引き起こす危険なコーディングスタイルに使用されます
コンストラクタでメンバ変数の初期化忘れなど
・style
一般的なコードクリーンアップの推奨事項に使用されます。これらを修正してもバグは修正されませんが、コードの保守が容易になります。たとえば、冗長コード、到達不能コードなど
・performance
エラーではありませんが、修正すると、コードのパフォーマンスが向上するかも
・portability
異なるプラットフォームとビット数（32/64ビット）でコードが適切に移植できないことを示しています。コードが異なるプラットフォームとビット数でコンパイルされる場合、これらの警告は修正する必要があります
・information
コードに対するエラーなどではなく、cppcheck実行に関する情報。インクルードファイルをcppcheckが見つけられない場合など

## おすすめカスタマイズ

デフォルトのままだと重要度タイプがerrorのものしか教えてくれないので、pre-commitでcppcheckコマンドを実行する際のオプションに"--enable=all"を追加することをおすすめします。これで、使用されていない変数があった場合などの警告などもcommit時にしてくれます。

```
cppcheck --error-exitcode=1 $changed_files
```

## 試したコード

```main.cpp
void hoge() {
  return;
}

int main() {
  int a[1];
  a[2] = 3;
  return 0;
}
```

これをcommitしようとすると・・・

```
Checking main.cpp ...
[main.cpp:7]: (error) Array 'a[1]' accessed at index 2, which is out of bounds.
[main.cpp:7]: (style) Variable 'a' is assigned a value that is never used.
[main.cpp:1]: (style) The function 'hoge' is never used.
```

と表示がされ、errorが含まれている場合はcommitが弾かれるようになります

実際にチェックしてくれる項目は"cppcheck --doc"で確認することが出来ます

## さいごに

読んでくださった方ありがとうございます。
cppcheckを実際のプロジェクトではまだ使っていないので、個人でとりあえず試してみようと思います。
こんなところにいらすとやさん

#はじめに
この記事は[いらすとや Advent Calendar 2017](https://adventar.org/calendars/2356)の 12/11 に向けて書いたものです。

#こんなところに
新宿を歩いていたら、見たことのあるいらすとが...
祝リトルナース100才おめでとうございます。

うーん、ツイッターとフェースブックでしかシェアできないんですね。
http://jp.rohto.com/mentholatum/100th/celebrities/10/
【MarkLogic Server】XQueryチューニングメモ～物理メモリ増設時の注意

はじめに
===
チューニングの一策として、メモリの増量というスケールアップが考えられます。これによりMarkLogicではRange Indexを用いたプログラミングによる解決などに踏み込む余地ができる訳です。一方で巨大なデータ処理の際に発生するExpand Tree Cache エラーなどはパラメータを変えないと解決しないようです。ver9を前提にそれらについてまとめておきます。

DBパラメータ
===
いずれも管理者画面(ポート8001番)から、Configure→Groups→DefaultでConfigureタブの中にあります。下記のようにインストール時にはメモリに比例してパラメータが設定されるので、増設時にも対応が必要になります。[こちら](https://help.marklogic.com/Knowledgebase/Article/View/420/0/group-level-cache-settings-based-on-ram "こちら")も参考になります。

| パラメータ | インストール時の設定値(メモリ増設時の指標) |
|---|---|
| list cache size | メモリの1/8倍 |
| compressed tree cache size | メモリの1/16倍 |
| expanded tree cache size | メモリの1/8倍 |
| triple cache size | メモリの1/16倍 |
| triple value cache size | メモリの1/8倍 |

スワップ領域とLinux Huge Page
===
もう一点、OSがLinuxだった場合のスワップ領域の設定についても確認しましょう。[こちら](https://docs.marklogic.com/guide/installation/intro "こちら")のサイトが参考になります。

| 対象 | 推奨値 | 
|---|---|
| スワップ領域 | (Linux Huge Pageを除いた)メモリと同値または32GBのいずれか小さい方 |
| Linux Huge Page | メモリの3/8倍 |

Red Hat Linuxを前提として、以下のように例が挙げられています。
(例)メモリ48GB、Linux Huge Pageを設定する場合、
Linux Huge Page = 48 * 3/8 = 18GB
スワップ領域 = 48 - 18 = 30GB < 32GB

おわりに
===
今回は、メモリの増設時のパラメータ変更についてまとめました。折角メモリを追加しても、これらのパラメータを変えなければ効果は出ません。是非お気を付け下さい。


```math
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
```

------------------------------------------------------------------------

**免責事項**

​​​​​$\textsmall{当ユーザ会は本文書及びその内容に関して、いかなる保証もするものではありません。}$
​​​​​$\textsmall{万一、本文書の内容に誤りがあった場合でも当ユーザ会は一切責任を負いかねます。}$
​​​​​$\textsmall{また、本文書に記載されている事項は予告なしに変更または削除されることがありますので、予めご了承ください。}$
画面に何も表示されなくなったときにすること Ubuntu16.04

# ログインしたあと画面が真っ黒なまま動かない

止まってるのかと思ったらパネル類が描画されてない．．．

- 右クリックするとディレクトリの作成が出来る
- `Ctrl + Alt + T` は効かない
- 他には特に何もできない

ターミナルが呼び出せないという絶望的状況になり，なんとか復帰したので備忘録．

結論から言うと，**unity関係のパッケージをremoveしてた**みたい．

# unityって何

Ubuntu 16.04で標準装備されてるGUIです．
あなたが普段触ってる左のパネルとか上のバーとかを支えてるパッケージです．
これがなくなるとそりゃGUIは使えなくなるよねえ．

でも，背景とか右クリックとかは生きてて不思議．


# 仮想ターミナルを使って作業する

ターミナルのショートカットが効かないので，仮想ターミナルを利用します．


Ubuntuは `Ctrl + Alt + F1~F6` で仮想ターミナル(CLI)が利用出来ます．
ちなみに， `Ctrl + Alt + F7` で通常のGUIに戻ってこれます．

適当な仮想ターミナルでloginして，

`sudo apt-get install unity`

をしたあと，再起動するといつものubuntuの画面が戻ってきました．


# 後記


python3を入れ直そうと思って`apt remove python2.7`とかして`apt autoremove`したら全部もってかれたみたい．
PepperのYoutubeアプリを起動させない方法

#背景

ソフトバンクのCSRで近くの学校にPepperが届きました。
たまにお手伝いに行くのですが、プリインストールされているYoutubeアプリを消したいと先生に言われました。

Pepperとの会話よりタブレットを触ってYoutubeばかり見たりしてしまうそうです。通信容量も気になるしいいことはないんだけど、アプリを削除してもまたダウンロードされてしまうんだそうです。

#解決策
一言で言うと、アプリのディレクトリは残したまま中のデータを削除する。

#手順
1,Pepperにsshで接続

`ssh nao@<IPアドレス>`
Pepper内の/home/naoという場所に接続されます。
(macはhttp://pepper.ohwada.jp/archives/260 を参考
winはhttp://systrabot.com/?p=1468 を参考)

2,Youtubeアプリのディレクトリに移動

`$ cd ~/.local/share/PackageManager/apps/sbr_7cd1aed6-aa7f-41a0-ae57-51787c052921_ytp`

~/.local/share/PackageManager/apps/がいろんなアプリが入っている場所
sbr_7cd1aed6-aa7f-41a0-ae57-51787c052921_ytpがYoutubeアプリの名前でした（私の環境では）


3,中のデータを削除する
中身を見てみるとbehavior_1,html,icon.png,manifest.xml,sbrytpcommon.py,sbrytpcommon.pycといったディレクトリとファイルがあります。

sbrytpcommon.py,sbrytpcommon.pycの2つのファイルを削除します。

`rm sbrytpcommon.py`
`rm sbrytpcommon.pyc `


これで、タブレットからYoutubeアイコンを触ってもアプリが起動されなくなりました。

#復元方法
choregrapheのロボアプリ一覧からYoutubeアプリを右クリック削除します。
<img width="386" alt="スクリーンショット 2017-12-11 21.10.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/222559/ef6c26a4-941a-021a-8c90-99116d85ecbd.png">


その後、設定アプリを立ち上げると再度インストールが始まります。

#課題
学校の先生がこれをできるかという点
GAEでHello Worldプロジェクトを作成する

件名の通りです。google app engineで"Hello World"プロジェクトを作成してデプロイする手順をまとめました。

- OS：Windows10 pro
- 開発環境 : Eclipse 4.7 Oxygen
- 開発言語 : Java 7


#（１）Google Cloud Platform の利用登録
「[ゼロから始める Google App Engine の使い方（2017年）](https://blog.apar.jp/web/6912/)」を参考に作業する。

- Google Cloud Platform トップページの「無料トライアル」をクリックし、Googleアカウントでログイン。
- 「日本」を選択して「同意して続行」
- 次の画面で「住所」「名前」「電話番号」「クレジットカード番号」（これらの項目は必須です）を入力し、「無料トライアルを開始」

#（２）Google App Engine の下準備
「[ゼロから始める Google App Engine の使い方（2017年）](https://blog.apar.jp/web/6912/)」を参考に作業する。

- プロジェクトを作成」で「HelloWorld」プロジェクトを作成。
- コンソール左上の「≡」メニューから「App Engine」を選択。
- 「言語」はJavaを選択。
- リージョンは「asia-northeast1」（東京）を選択して「Next」。

#（３）Google Cloud SDK のインストール
- 「[Windows 用のクイックスタート | Cloud SDK のドキュメント](https://cloud.google.com/sdk/docs/quickstart-windows)」ページから、インストーラをダウンロード。
- インストーラを起動して、インストール。と思ったら途中で失敗。ググってみたら、
「[Windows版Google Cloud SDKのインストールに失敗する](http://qiita.com/amama-nagigi/items/f617960fa341a6040010)」がヒットしたので、サイトを参照したら、全角がパスに含まれているとダメとのことで、半角ユーザ名で試したら出来た。（まあ、そうね。）
- 「[Windows 用のクイックスタート | Cloud SDK のドキュメント](https://cloud.google.com/sdk/docs/quickstart-windows)」ページを参考に「gcloud init」コマンドを実行。
- SDKをインストールしたいディレクトリに移動して、以下のコマンドを実行。

```
   $ curl https://sdk.cloud.google.com | bash
```

#（４）EclipseでHello World
- 「[Google App Engine 環境構築(Windows+Eclipse+Java)](http://krr.blog.shinobi.jp/gae/google%20app%20engine%20%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89-win)」を参考。
- Eclipseの「ウィンドウ」 －「設定」を選択、表示されたウィンドウの左メニューにおいて「Java - コンパイラー」を選択し、「コンパイラー準拠レベル」を1.7に変更。
- ツールバーの「g」ボタンを押して、「新規Webアプリケーション・プロジェクト」をクリック。出現したダイアログにプロジェクト名（HelloWorld）、パッケージ名を入力し、「Use GWT」のチェックを外してから「完了」。
- 作成されたプロジェクトを右クリックして、ポップアップメニューから「プロパティ」を選択する。表示された画面にて「プロジェクト・ファセット」を選択し、Javaのバージョンを1.7に変更する。
- 同様に、「Google - Appエンジン」を選択し、アプリケーションIDを入力する。このIDは、（２）でGAE上に作成したプロジェクトのID。
- 「実行－Webアプリケーション」で実行する。
- コンソールビューに「Dev App Server is now running」と表示されれば成功。
- ブラウザで、[http://localhost:8888/](http://localhost:8888/) にアクセスすればプログラムが実行される。
- アプリケーションの終了は、コンソールビューで「終了」後、「終了したすべての起動を除去」ボタンを押下する。

#（５）Google App Engine上で公開する
- Eclipseのステータスバー（画面下）にあるボタンをクリックして、Googleにログインする。ログイン中に「Google Plugin for Eclipseが次の許可をリクエストしています」というメッセージが表示されるので、問題ないことを確認して「許可」ボタンを押下する。成功するとステータスボタンのアイコンが色付になる。
- プロジェクトを選択し、メニューから「App エンジンへデプロイ」を選択する。表示される画面で「配置」ボタンを押下すると、アップロードが開始される。アップロードに成功するとwebブラウザが自動起動し、プロジェクトが開かれる。
二刀流エンジニアは可能か

# 二刀流と三拍子の違い
大谷さんがエンゼルスに入団しました。彼はアメリカでも二刀流を目指していくということで彼のブレない目標はエンジニアである私も見習いたいです。

彼の二刀流の特徴はピッチャーとバッターです。つまり、**投げること**と**打つこと**の両方が一流であること。ただ、野球には他にに**守る**と**走る**が存在します。
打って、守れて、走れる選手は三刀流ではなく、**走攻守三拍子揃った**選手と呼ばれます。
**三刀流ではなく、三拍子**です。これはとても大事なことだと思います。
(三拍子とは能楽で、大鼓、太鼓、小鼓の拍子がぴったりと取れたことを意味し、必要な３つの要素が揃っていることの例え。)

# 真の二刀流とは
二刀流とはどちらかが完全にできなくなったとしても、同じようにお金をもらえることとていぎできるのではないでしょうか。
そう書くと、守備固め要員は守備しかできないけどお金もらえているから、それも刀の一つじゃないか？と感じるかもしれませんが、あれも守備とは他に「人徳」とか「監督とのコネ」とかそういう三拍子が揃ってお金をもらえていると考えられます。拍子と刀の違いの理解はとても大事なのです。
そろそろ、本題に入ります。

# エンジニアにとっての二刀流を探す
それでは思いつく組み合わせでそれが二刀流か否かをコメントしていきたいと思います。

## プログラミング言語を2つ？
これは今時当たり前です。１つしか言語を書けないような人はあまり見たことがありません。
## 課長とエンジニア?
これはいわゆるプレイングマネージャーというものですね。**どっちもおろそかになるパターンで大谷さんを一番見習ってほしいエセ二刀流の筆頭です**。
## プログラマーとPM？
PMだけど当該プロジェクトが長くて、メンバーのコーディングにちょっかいかける人よくいますよね。意味のある指摘ならいいんですけど、表面的なものに終わることがほとんどです。**PMはPMだけに集中することがプロジェクトにとってもっとも効果的です**。
## 工程を２つ以上できる？
２０００年以前はパンチャーとかテスターとか専門職があったようですが、工程を２個ぐらい完璧にできても、**ブラック企業での使いっ走りになる可能性が高い**です。
## アプリとインフラ？
**今のクラウド時代において、こんな線引きしている人すでにいないですよね**。オンプレまんせーの時代にはこれが一つのブルーオーシャンであったことは否めませんが、それでも二刀流とは言えないですね。**現在ではフルスタックエンジニアと呼ばれる新概念が登場しており、この分けもすでに過去のものになりました**。
## リーダーとプログラマー？
リーダーというもっとも曖昧な役職とプログラマーの兼務ですが、**これはスクラムが登場している現代においては少し厄介です。チームの自己組織化を妨げ、上意下達の文化を蔓延らせます**。リーダーというものがプロジェクトにおいて価値のないものになってきているのが現代ではないでしょうか。

## お客様を２つ?
これは二刀流色が濃いですね。但し、SEあるあるですが０.5人月ずつもらっている場合は二刀流とは言えません。**両方から1.0人月ずつもらって初めて二刀流**です。さらにいうと、**０.5人月ずつもらう人は実際のところはその８割ぐらいしか生産性を出せませんから、本人は忙しそうですが実際には煙たがられることが多い**でしょう。

## 会社を２つ？
最近流行りの副業や兼業ですね。エンジニアにとって２つの会社に雇われるメリットはデメリットを上回ることがないのでやめておきましょう。**エンジニアは主となるパソコンが２台以上になると生産性があっという間に下がります**。

## バイトと掛け持ち?
これは**二刀流といっても差し支えないのですが、本業のエンジニアで稼げるようになりましょう**。

## エンジニアとコンサル?
一般的にコンサルにエンジニアはいませんので、この二刀流は**日本では数名のトップエンジニアを除き成り立ちません**。

## ウォーターフォールとアジャイル?
これはPMなのか、なんんなのかすでにわからなくなっていますが、実を言うとこれは水と油のような関係です。これは二刀流の匂いが少ししています。

## 営業とエンジニア？
良いエンジニアはコミュニケーションが得意です。つまり、営業も自然とできます。営業というのは専門職以外にそれでお金を稼ぐことはできませんので、両方できても二刀流とは言えません。**もちろん、自分で仕事を取ってくるエンジニアは自然と高給になります**が、二刀流かというとそうではないです。
## 人事とエンジニア?
これは**完全に会社に騙されています**。どっちかに寄せてもらいましょう。
## 趣味と仕事？##
ご自由にしてください。但し、趣味が仕事に良い影響を与えるのは自明ですのでどんどん頑張りましょう。しかし、**どんだけ頑張っても二刀流と評価されることはありません。単に多趣味なだけです**。
## SOEとSOR?
ただのバズワードですね。ごめんなさい。
## モード1とモード２(バイモーダル)
バイモーダルとはガートナー社が提唱し、今年IT業界でも流行語を狙える位置にある考えです。
そして、**これは個人の二刀流というよりも組織を二刀流にする力があると私は考えます**。

# まとめ
普通に暮らしているエンジニアが二刀流というユニークスキルを身に付けることはできないと思います。誰もがキリトになることはできません。バイモーダルをチームとして推し進め、二刀流組織を作っていくこと、そして一本だけの宝刀をもつエンジニアがわんさか活躍している組織。それが普通のエンジニアに取って理想ではないかと思います。

大谷さん、エンゼルスで二刀流頑張れー。

彼の高校生時代の目標曼荼羅は有名な話ですが、天才二刀流の思考を理解するのに以下の書籍はマストなので、彼が好きなエンジニアは是非読んでみてください。
[大谷翔平 二刀流](http://amzn.to/2Av0ycg)
[不可能を可能にする 大谷翔平120の思考](http://amzn.to/2AtkFI3)
[別冊カドカワ【総力特集】大谷翔平 (カドカワムック)](http://amzn.to/2AusUUg)
Goでドメイン駆動設計のモデルを書く

ホワイトプラスのエンジニアの@yamakiiです。
この記事は[WHITEPLUS Advent Calendar 2017 ](https://qiita.com/advent-calendar/2017/whiteplus)15日目になります。

普段はPHPでドメイン駆動設計(DDD)をしているのですが、勉強の意味も兼ねて今回はGoでDDDのモデルを書いてみました。

題材は最近t_wadaさんの新訳がでて話題の[テスト駆動開発](https://www.amazon.co.jp/dp/B077D2L69C/)の第一章になります。

DDDでモデルを作る際のポイントは実際に業務で利用されている言葉でモデルを進めていくことです。これをGo言語の「型」をうまく使いながら実践できればと思っています。

第一章の内容を全て網羅すると長くなってしまいますので、「通貨の交換をする」機能に絞ってモデリングしてみます。

役者としては
- 通貨を表すCurrency
- お金を表すMoney
- 交換レートのRate
- お金同士の交換を司るBank
でモデリングしてみます。

まず最初に「Currency」型と「Money」型を作っていきます。

```go
// 通貨
type Currency string

// 例としてドルとユーロ
const (
	USD = Currency("USD")
	EUR = Currency("EUR")
)

// 通貨からMoneyを生成する
func (c Currency) New(a int) Money {
	return Money{a, c}
}

// お金
type Money struct {
	amount   int
	currency Currency
}

// 5ドルのお金はこうなる
five := USD.New(5)
```

ここでは通貨(Currency)を定義して、そこからMoneyを生成するというシナリオを書いています。

次に「Rate」型と「Bank」型を作っていきます。
Bankはお金の交換を司ると言いましたが、ここでは次の機能を作ってみます。
- 交換レートの追加
- 交換レートの参照

```go
// 交換レート
type Rate int

// 通貨のペア(交換の方向も持つ)
type pair struct {
	from Currency
	to   Currency
}

// 銀行（通貨のペア毎に交換レートを持つ）
type Bank struct {
	rates map[pair]Rate
}

// 交換レートの追加
func (b *Bank) AddRate(from Currency, to Currency, rate Rate) {
	b.rates[pair{from, to}] = rate
}

// 交換レートの参照
func (b Bank) Rate(from Currency, to Currency) Rate {
	if rate, ok := b.rates[pair{from, to}]; ok {
		return rate
	}
	return Rate(1)
}

// Bankの生成
func NewBank() Bank {
	return &Bank{map[pair]Rate{}}
}
```

ここではRateの管理のキーとしてpair型を利用しています。
これをmapのキーとすることで、交換レートの参照はスッキリとしたコードになっています。

いよいよ通貨の交換です。
- 交換率の参照はBank
- 通貨交換はMoney

とそれぞれに機能を分けて実装してみます。

```go
// Bankの交換は交換率を取得し、Moneyへ委譲
func (b Bank) Reduce(m Money, to Currency) Money {
	rate := b.Rate(m.currency, to)
	return m.Reduce(rate)
}

// Moneyは指定されたRateに応じて必要なMoneyを算出
func (m Money) Reduce(rate Rate) Money {
	m.amount = m.amount / int(rate)
	m.currency = to
	return m
}
```

最終的な利用イメージはこんな感じになります。

```test.go
func TestReduceMoneyDifferentCurrency(t *testing.T) {
	bank := NewBank()

	// 交換レート追加(EUR : USD = 1 : 2)
	bank.AddRate(EUR, USD, Rate(2))

	// 2ユーロをドルに通貨交換
	actual := bank.Reduce(EUR.New(2), USD)

	// 1ドルになるはず
	if expected := USD.New(1); expected != actual {
		t.Fatalf("Expected %#v Got %#v", expected, actual)
	}
}
```

ざっと書いてみましたが、こんなツッコミが出るかもしれません。
- pairとrateをあわせてExchangeRate(交換レート)とすべき
- pairはドメインの言葉じゃないので、そのままの意味のkeyにしては？

他にもいろいろあると思いますが、こんな感じで話をしながらモデルを洗練していくとよいかなと思います。

今回Go言語で実践した感想ですが、Goの型はクラスに比べると簡単に宣言できるので、気持ちよくモデリングすることができました。
特にvalue objectのパターンを多用する場合には利用し易いという印象を持ちました。

---

ホワイトプラスではエンジニアを募集しています
ホワイトプラスでは、[web×リアル領域で「新しい日常を創りたい」エンジニアWanted!!](https://www.wantedly.com/projects/169974)しております。
[Mac]よく使うショートカット

## Mac

|機能|ショートカットキー|
|---|---|
|デスクトップ表示|Command + F3|
|スクリーンショット（画面全体）|Command + Shift + 3|
|スクリーンショット（範囲選択）|Command + Shift + 4|
|スクリーンショット（画面選択）|Command + Shift + 4 + Space|
|全画面/全画面解除|Command + Control + F|

## Chrome

|機能|ショートカットキー|
|---|---|
|進む|Command + [|
|戻る|Command + ]|
|更新|Command + R|
|1画面分スクロール（下へ）|Space|
|1画面分スクロール（上へ）|Shift + Space|
|新しいタブ|Command + T|
|タブを閉じる|Command + W|
|タブ選択（次へ）|Control + Tab|
|タブ選択（前へ）|Control + Shift + Tab|
|閉じたタブを開き直す|Command + Shift + T|
|新しいウィンドウ|Command + N|
|新しいウィンドウ（シークレット）|Command + Shift + N|
|ディベロッパーツール |Command + Option + I |
|インスペクタモード|Command + Shift + C|
|Chromeを終了する|Command + W|

## PyCharm

|機能|ショートカットキー|
|---|---|
|Quick Definition|Option + Space   もしくは   Command + Y|
|Quick Documentation|Control + J|

## iTerm2
|機能|ショートカットキー|
|---|---|
|画面分割（横）|Command + D|
|画面分割（縦）|Command + Shift + D|
|新しい画面|Command + N|
|全画面/全画面解除|Command + Enter|
Herokuにgitbookをデプロイする

Herokuにgitbookをデプロイするまでをかんたんにまとめました。

■環境情報
OS:Windows10

■事前準備
gitがインストールされていること
heroku cliがインストールされていること

#(1)ディレクトリの作成
任意のディレクトリを作成します。ここでは、「gitbook」とします。

```
C:\>mkdir c:\gitbook
C:\gitbook>cd c:\gitbook
```

#(2)npm initを実行
npm initを実行します。
質問はすべてEnterで回答し、package.jsonを作成します。

```
C:\gitbook>npm init
```

#(3)expressをインストール
expressをインストールします。package.jsonにexpressが追加されます。

```
C:\gitbook>npm install express --save
```

#(4)gitbook cli をインストール
gitbook cliをインストールします。gitbook cliはHeroku上に展開するとメモリ不足になるようなので、package.jsonには保存しません。

```
C:\gitbook>npm install -g gitbook
```

#(5)gitbookを構築
gitbookを構築します。README.mdとSUMMARY.md、_Bookディレクトリが作成されます。

```
C:\gitbook>gitbook init
C:\gitbook>gitbook build
```

#(6)index.jsを作成
index.jsを作成します。次の内容を入力して保存します。

```index.js
var express = require('express');
var app = express();
app.use(express.static(__dirname + '/_book'));

app.listen(process.env.PORT || 3000);
```

#(7)Procfileを作成
Procfileを作成します。次の内容を入力して保存します。

```
web: node index.js
```

#(8).gitignoreを作成
.gitignoreを作成します。以下の内容を入力して保存します。

```
node_modules/
```

#(9)Herokuにログイン
herokuにログインします。

```
C:\gitbook>heroku login
# IDとPWを入力します
```

#(10)heroku createを実行
heroku create します。

```
C:\gitbook>heroku create demo
```

#(11)Herokuにpush
git リポジトリを作成して、Herokuにpushします。

```
C:\gitbook>git init

C:\gitbook>git add .

C:\gitbook>git commit -m "demo"

C:\gitbook>git push heroku master
```
次のエラーが発生する場合は、.gitディレクトリのconfigを修正します。

```
fatal: 'demo' does not appear to be a git repository
fatal: Could not read from remote repository.
```

configは次のように修正します。

```ini
[core]
	repositoryformatversion = 0
	filemode = false
	bare = false
	logallrefupdates = true
	symlinks = false
	ignorecase = true
	hideDotFiles = dotGitOnly
[remote "heroku"]
	url = https://git.heroku.com/demo.git
	fetch = +refs/heads/*:refs/remotes/heroku/*
```

#(12)ブラウザで確認
ブラウザでアプリケーションを開きます。

```
C:\gitbook>heroku open
```

次のように表示されます。（例 https://demo.herokuapp.com/）

![heroku-gitbook.png](https://qiita-image-store.s3.amazonaws.com/0/215729/5ae37818-00fe-4237-449e-4c22423259b0.png)
EC-CUBEでフロント画面テンプレートを追加

EC-CUBEでオリジナルのテンプレートを作成する必要があったので、手順をメモする。
DBはmysqlを接続している。

# デフォルトテンプレートをコピーする

```.sh
$ cp -r app/template/default/ app/template/[テンプレートコード]/
$ cp -r src/Eccube/Resource/template/default/* app/template/[テンプレートコード]/
```

`[テンプレートコード]`は新たに追加するテンプレートを表す適当なコードに置き換える。

# テンプレートをDBに登録する

DBサーバーでmysqlクライアントを起動。
phpmyadminを使用する場合は省略。

```
$ mysql -u [DB_USER] -p
Enter password: [PASSWORD]

mysql > use [DB_NAME];
```

テンプレートを追加登録するため、以下のコマンドを実行。

```.sh
mysql > INSERT INTO `dtb_template` (`device_type_id`, `template_code`, `template_name`, `create_date`, `update_date`) VALUES ('10', '[テンプレートコード]', '[テンプレート名]', NOW(), NOW());
```

## device_type_id

device_type_id|用途
---|---
10|PC用テンプレート、レスポンシブデザイン
1|モバイル専用
2|スマホ専用

## template_code, template_name

`template_code`は先程作成したディレクトリ名に合わせる。
`template_name`は任意の文字列。2バイト文字でも可。

# 確認

管理画面で`オーナーズストア->テンプレート->テンプレート一覧`から新しいテンプレートが追加されていることを確認できる。
ここから新しいテンプレートを選択すると開発をスタートできる。