OmniAICreator/Qiita-1.07M huggingface dataset:
Docker on EC-CUBE4

最近EC-CUBE4を触ることになり、環境構築をDockerで行ったので、その知見をメモします.
MAMPではやりたくないですよね、なんとなく.

## 環境

||バージョン|
|---|---|
|MySQL|5.7.20|
|PHP|7.1|
|EC-CUBE|4.0.1|


## 成果物
https://github.com/pepoipod/docker-on-ec-cube

## Dockerfile
こちら参考にさせていただきました。ありがとうございます。
https://qiita.com/izayoi256/items/5278b8bd78c0b3d16111

リモートデバッグなど考慮していないため、設定ファイルやentrypoint.shは省いています.

```dockerfile:Dockerfile
FROM php:7.1-apache

RUN set -x \
    # 高速化のためaptリポジトリを変更
    && sed -i.bak -e "s%http://deb.debian.org/debian%http://ftp.riken.jp/pub/Linux/debian/debian%g" /etc/apt/sources.list \
    && apt-get update \
    && apt-get install -y --no-install-recommends \
        sudo \
        git \
        libxml2-dev \
        unzip \
        wget \
        zlib1g-dev \
        iproute \
        libsqlite3-dev \
        libpq-dev \
        libicu-dev \
        gnupg2 \
    && wget -qO- https://deb.nodesource.com/setup_10.x | bash - \
    && apt-get install -y --no-install-recommends \
        nodejs \
    && docker-php-ext-install \
        intl \
        mbstring \
        pdo \
        pdo_sqlite \
        pdo_mysql \
        pdo_pgsql \
        mysqli \
        soap \
        xml \
        zip \
    && pecl install xdebug \
    && pecl install apcu \
    && docker-php-ext-enable \
        xdebug \
        apcu \
        opcache \
    && a2enmod rewrite \
    && apt-get clean \
    && rm -rf /tmp/*

RUN curl -sS https://getcomposer.org/installer \
    |  php -- \
        --filename=composer \
        --install-dir=/usr/local/bin \
    # composerの高速化
    && COMPOSER_ALLOW_SUPERUSER=1 composer global require --optimize-autoloader "hirak/prestissimo" \
    && chown www-data /var/www \
    && chmod g+s /var/www/html

CMD ["apache2-foreground"]
```

## docker-compose.yml
あまり特殊なことはしていません.
強いて言うならばDB作成用のシェルスクリプトをDBのコンテナにコピーしていることでしょうか。
MYSQLのパスワードは今回のために僕がキーボードを適当に打って作ったものなので、あまり気にしないでください。
みなさんも適当にキーボードを打って書き換えるといいかと思われます。

```yaml:docker-compose.yml
version: '3.7'

services:
  db:
    image: mysql:5.7.20
    container_name: ec_cube_test_db
    environment:
      MYSQL_ROOT_PASSWORD: nqanfqafjw
    volumes:
      - ./create_db.sh:/create_db.sh
      - ec-cube-test-db-data:/var/lib/mysql
    ports:
      - '3333:3306'
  app:
    build: .
    image: iwamoto/kec-cube-test-app:local
    container_name: ec_cube_test_app
    volumes:
      - ./eccube:/var/www/html
    ports:
      - '8080:80'
    stdin_open: true
    tty: true
    depends_on:
      - db

volumes:
  ec-cube-test-db-data:
    driver: local
```

## DBの作成
makeのタスクに `create_db` というものを用意し、 その中でコピーされた `create_db.sh` を実行しています.
実行すると、 `eccube` という名前のDBが作成されます.

ワンライナーでDBを作成したかったので、パスワードを環境変数から参照しようとしたのですが、以下のように書いてしまうと、環境変数がホスト側で評価された状態でコンテナに渡されてしまうので、うまくいきません。

```makefile:Makefile
# 間違った例.
create_db:
	docker exec -it ec_cube_test_db mysql -u root -p${MYSQL_ROOT_PASSWORD} -e "CREATE DATABASE eccube /*\!40100 DEFAULT CHARACTER SET utf8 */;"
```

環境変数をコマンドに含めたい場合は `docker exec` でやらず、一度bashで中に入るか、シェルスクリプト内に記述してそれを実行させるように変更するかの二択かと思われます.


## おわりに
最近出たバージョンということもあり、あまり情報が出回ってないですね。
EC-CUBE4の情報を欲している人は多いと思うので、みなさんどしどし書いていきましょう.
AWS ubuntu server install xwindow(ubuntu desktop) and xrdp

1,AWS EC2 Ubuntu を作成する
過程略

2,aptを更新する
sudo apt-get update

3,ubuntu-desktop をインストールする
sudo apt-get install ubuntu-desktop

4,パスワードを設定する
sudo passwd ubuntu
自分のパスワードを入力してください

5,xrdp をインストールする
sudo apt install -y xrdp

6,new_cursorsを無効にする
sudo sed -e 's/^new_cursors=true/new_cursors=false/g' -i /etc/xrdp/xrdp.ini
sudo systemctl restart xrdp

7,~/.xsessionrcを作成する
vim ~/.xsessionrc
開いたファイルに下記の内容を追加する
$ D=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop
$ cat <<EOF > ~/.xsessionrc
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_DATA_DIRS=${D}
export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
EOF
保存して閉じる

8,Authentication Requiredダイアログを無効にする
$ cat <<EOF | sudo tee /etc/polkit-1/localauthority/50-local.d/xrdp-color-manager.pkla
[Netowrkmanager]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device
ResultAny=no
ResultInactive=no
ResultActive=yes
EOF
$ sudo systemctl restart polkit

9,windowsのリモートデスクトップで接続できるようになった
scrapyでstart_urlsやrulesにコマンドライン引数を渡す

# はじめに
この記事は[MicroAd Advent Calendar 2018](https://qiita.com/advent-calendar/2018/microad)の13日目の記事です。
自分が自然言語処理を行うためのデータを集めようとクローリング&スクレイピングしていた時にめっちゃ詰まった部分があったので、その解決Tipsをまとめようと思います。
# scrapyを使ってみて
自分はついこの前までscrapyはおろかクローリングもスクレイピングも全く知らないという状態で一から使い始めたのですが、とても便利でした。

* 全体的にPython初心者でも書きやすい
* settingsを追加すれば意図通り上手く動作してくれる
* Spiderのクラスを書き換えれば色々なページに対応可能なのが楽で良い

などが率直な意見です。
# こんな使い方がしてみたい！
scrapyを使っていると、こんなことを思いました。
**CrawlSpiderに渡すstart_urlsとかrulesにコマンドライン引数を渡せないかな...**
そのために色々と検索して試行錯誤した結果、以下のような解決策が見つかりました。

* start_urlsはSpiderのクラスで\__init__中に設定してやれば良い
* rulesは\__init__中に設定してやったのち、以下のコードを付け加える


```python
self._compile_rules()
```

この一文を忘れると設定したrulesが反映されません！

# 実際に試してみよう
クローラーとして以下のようなコードを書いてみます。
今回は[弊社のエンジニアブログ](https://developers.microad.co.jp)を使用します。
[インフラカテゴリ](https://developers.microad.co.jp/archive/category/インフラ)の4記事中、[IoTの記事](https://developers.microad.co.jp/entry/2018/06/21/201740)だけの抽出を目指します。
なお、scrapyのほかにbeautifulsoup4とreadabilityも併用しました。

```python:microad.py
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.crawler import CrawlerProcess
from bs4 import BeautifulSoup
from readability.readability import Document

from microad.items import MicroadItem

class MicroadCrawlSpider(CrawlSpider):
    name = 'microad_crawl'
    allowed_domains = ['developers.microad.co.jp']

    '''
        クローラーの初期化
    '''
    def __init__(self, *args, **kwargs):
        super(MicroadCrawlSpider, self).__init__(*args, **kwargs)
        # start_urlsを設定
        self.start_urls = ['https://developers.microad.co.jp/archive/category/'+self.search_word]
        # クローラーのリンクの辿り方を設定
        self.rules = (
            Rule(LinkExtractor(allow=r'/entry/'+self.year_month_day), follow=True, callback = 'parse_texts'),
        )
        # 上記で設定した項目をコンパイル
        self._compile_rules()
    
    '''
        本文を取り出すメソッド
    '''
    def parse_texts(self, response):
        item = MicroadItem()
        document = Document(response.text)

        item['text'] = BeautifulSoup(document.summary(), "lxml").get_text()

        yield item
```

これを以下のコマンドで実行します。

```bash
$ scrapy crawl microad_crawl -a search_word='インフラ' -a year_month_day='2018/06/21'
```

すると、以下のような結果が得られました。

```
{'text': '\n'
         'こんにちは。マイクロアドでインフラエンジニアとして勤務している伊東です。\n'
         '今日はインフラエンジニア視点で導入してみた社内 IoT、間接的な業務効率改善の話をいろいろ脱線しながらユルくご紹介したいと思います。\n'
         ...
         （中略）
         ...
         '心配していた電池も８ヶ月程度は持ちそうです。これなら運用負荷も許容範囲でしょう。さて次はなにをつくろうか\n'
         '※電波送受信に関わる部品はすべて Mono Wireless 純正品を組み合わせており電波法上問題はありません。\n'
         '\xa0\n'
         '\n'
         '\n'}
```

他の記事も表示されません。
**大成功です！！！**
あとは邪魔な改行コードなどを除けば処理ができますね。

# まとめ
今回はscrapyのTipsをご紹介しました。
この記事では1つのページだけを抽出しましたが、例えば検索キーワードをコマンドラインからrulesに設定するなどの工夫をしたらもっと使い方が広がりそうです。
ぜひ試してみてください！
Signposts と Instruments でパフォーマンスを計測する：入門編

iOS アプリのパフォーマンスチューニングにおいて、Signposts を使用する方法について書きます。コード中に仕込んだ最も簡単なマーカーを Instruments で表示させるところまでを、初心者でも分かるように順を追って説明していきます。

#Signposts とは
パフォーマンスを計測するためのマーカーで、Xcode 10 で導入されました。パフォーマンスを調査したいコード中にマーカーを入れて、プロファイリングすることにより、その計測結果を Instruments 上にグラフィカルに表示することができます。
自分の気になるところをフォーカスして解析できるので、パフォーマンスチューニングが捗るはかどると思います。

#確認事項

Xcode 10 で導入されたものなので、iOS 12 以上でないと動きません。
<img width="439" alt="Instruments_step0.png" src="https://qiita-image-store.s3.amazonaws.com/0/214356/6c32a023-8a62-6319-556b-a19c7da62fea.png">


#マーカーの使い方


```swift
import os.signpost
```
まずは、`os.signpost` をインポートします。

```swift
let bootLog = OSLog(subsystem: "com.example.your-app", category: "BootOperations")
```

それから、計測したい箇所で、ログのハンドルを取得します。 `subsystem` にはアプリの Bundle ID などを適当に指定し、`category` はこのログのグループ名を自由に考えて指定します。ここでは、起動時のパフォーマンスを計測するとして、`BootOperations` と指定しています。

```swift
os_signpost(.begin, log: bootLog, name: "fetch something")
fetchSomething()
os_signpost(.end, log: bootLog, name: "fetch something")
```

最後に、作成したログのインスタンスを使いながら、計測したい箇所を `os_signpost()` の `.begin` と `.end` で囲みます。ここでは、 `fetchSomething()` の時間を測り、 `fetch something` として表示するように設定しました。


#計測方法
コードの準備が整ったら、実際に計測してみます。Instruments の Time Profiler を使う手順とほとんど同じなので、Time Profiler を使ったことがない人は、まず下記を参照して下さい。初めての人でも分かりやすくまとまっています。

Instruments Time Profiler の使い方
https://qiita.com/okamotoke/items/daac6645fc44daadf1dd

signpost を使うには、まず、Instruments を Time Profiler を選択して起動させます。
![Instruments_step2.png](https://qiita-image-store.s3.amazonaws.com/0/214356/b5ab7f88-25ea-194d-2c2e-3bbbda0df90c.png)
起動させたら、右上の「＋」ボタンをクリックし、「Filter」のところで「sign」と入力すると、「os_signpost」が絞り込まれて表示されます。
![Instruments_step3.png](https://qiita-image-store.s3.amazonaws.com/0/214356/bbb174fb-c46a-a77a-9d58-a19b6305d499.png)
この「os_signpost」をダブルクリックして追加します。
![Instruments_step4.png](https://qiita-image-store.s3.amazonaws.com/0/214356/f4d037f2-d072-dae3-fc37-323500284b61.png)
これで準備完了です。赤丸ボタンを押して計測をスタートし、マーカーを仕込んだコードが実行されたら、ストップしてみましょう。
![Instruments_step5.png](https://qiita-image-store.s3.amazonaws.com/0/214356/44cf19db-36d3-c91c-8ab7-27f545afb698.png)
無事に `BootOperations` グループの中で `fetch something` の実行時間が記録され、グラフィカルに表示することができました。

#まとめ
Signposts の簡単なマーカーをコード中に仕込み、Instruments で表示させる方法を説明しました。Signposts ではさらにいろいろなことができるので、興味ある方は下記をご覧下さい。

Signposts と Instruments でパフォーマンスを計測する：基礎編
https://qiita.com/hsawada/items/1358ebc9aa1a82ac4f12

#参考文献
Measuring Performance Using Logging
https://developer.apple.com/videos/play/wwdc2018/405

Xcode Time Profiler の使い方
https://qiita.com/okamotoke/items/daac6645fc44daadf1dd
Python+uWSGI+Dockerで環境に応じてuwsgiプロセス/スレッド数を動的変更する

# はじめに
![image.png](https://qiita-image-store.s3.amazonaws.com/0/119359/77937d3c-3d9d-0884-8ee0-0bb458b48725.png)

PythonのWEBサーバを使ってる方には馴染みのuWSGIですが、Python+uWSGI+Docker環境を使っていると、マシンやコンテナスペックを変更したくなってくる場面があり、uWSGIの設定値も動的変更したくなりますよね。
ここでは現在本番稼働をしているPython+uWSGI+Docker環境で使用しているプロセス/スレッド数の動的変更方法を記載します。

# 動作環境
1. Django 3.0
2. uwsgi 2.0.17
3. Docker Image(python:3.6.5-alpine3.6)

# uWSGIの特徴
uWSGIの特徴として以下の特徴がありました。

1. uWSGIの設定値は.iniファイルで流し込むことができる
2. uWSGIの.iniファイルには環境変数を流し込むことができる

この特徴を使って.iniファイルを変更します。

# 前準備
app.iniには以下の内容で設定ファイルを記述します。

```app.ini
~ 一部抜粋 ~
# threads数=CPU数, processes数=CPUコア数
# 環境変数UWSGI_XXXXと連動
processes=%(processes)
threads=%(threads)

```

ミソは`%(XXXXX)`ですね。
これは環境変数の`UWSGI_XXXXX`と連動するようになっており、`UWSGI_TEST`の環境変数を.ini内では`%(test)`で呼び出すことができます。
この準備ができればあとはDocker起動時にCPU数、CPUコア数を取得するだけです。

# Docker起動時にCPU数、コア数を取得する
Docker起動時に必ず実行されるようdocker-entrypointなどにCPU数、コア数を取得する処理を記載しておきましょう。

```docker-entrypoint.sh
#!/bin/sh
#CPU / コア数を取得する
CPU=`grep physical.id /proc/cpuinfo | sort -u | wc -l`
CORE=`grep cpu.cores /proc/cpuinfo | sort -u | wc -l`

#uwsgiのプロセス数、スレッド数を設定(要パラメータチューニング)
export UWSGI_THREADS=`expr ${CPU}　\* 1`
export UWSGI_PROCESSES=`expr ${CORE}　\* 2`

uwsgi --ini ./app.ini
```

パフォーマンスチューニングについてはこちらをご参照ください。
https://qiita.com/fujimisakari/items/bc00d598e3219d382f60

# さいごに
uWSGIの仕組みをうまく使ってDockerコンテナ起動毎に変更できました。
Docker環境で使う際はぜひご検討ください。
JavaScriptのソース内で環境依存の値を切り替える

## はじめに
Reactのアプリケーションの開発の際、環境ごとに値を切り替える必要があったので、その時採用した方法をまとめたものです。

## 方法
いくつか方法はありますが、今回は以下の方法を採用しました。

- 環境毎に切り替える値をまとめたファイルを各環境毎に作成する
- webpackでビルドする際に、環境変数からどの環境向けのビルドかを取得して、読み込むファイルを切り替える

切り替える方法はwebpackの[arias](https://webpack.js.org/configuration/resolve/#resolve-alias)機能を利用しています。

## 動作環境
$ npm --version
6.4.1
$ node --version
v10.13.0

使用したライブラリのバージョン
React: 16.6.1
webpack: 4.25.1

## Node.jsでの環境変数
Node.jsでは環境変数は[process.env](https://nodejs.org/dist/latest-v10.x/docs/api/process.html#process_process_env)で使用できます。


## 実装例
ここではAPIサーバのURLを例にしています。
ディレクトリ構造は以下のようになっています。

```
example
   ├─index.html
   ├─package.json
   ├─webpack.config.js
   │
   └─src
       ├─index.js
       │
       └─config
           ├─development.js
           └─staging.js
```

### 設定ファイル
開発環境向け

```javascript:development.js
export default {
    API_URL: 'http://development.example.com'
};
```

ステージング環境向け

```javascript:staging.js
export default {
    API_URL: 'http://staging.example.com'
};
```

設定ファイルを読み込む側。動作確認のために読み込んだ値を表示するだけの単純なコンポーネントにしています。

```javascript:index.js
import React from 'react';
import { render } from 'react-dom';
import config from 'AppConfig';

const App = () => (
  <div>
    <p>URL: {config.API_URL}</p>
  </div>
);

render(
  <App />,
  document.getElementById('app'),
);

```

```html:index.html
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>example</title>
</head>
<body>
<div id="app"></div>
</body>
</html>
```


### webpack

webpackの設定ファイル内で環境変数(今回はNODE_ENV)を読み込んでいます。
aliasの設定で、AppConfigのパスを環境変数を用いて指定しています。

```javascript:webpack.config.js
const path = require('path');
const webpack = require('webpack');
const environment = process.env.NODE_ENV || 'development';

module.exports = {

  // 中略

  resolve: {
    extensions: ['.js', '.jsx'],
    alias: {
      AppConfig: path.join(__dirname, `/src/config/${environment}.js`)
    }
  },

  // 中略

}

```

## ビルド
webpackでビルドします。

```javascript:package.json
  "scripts": {
    "build": "webpack --progress --colors --mode production"
  },
```

ビルド実行時に、環境変数NODE_ENVで環境を指定すればOKです。
開発環境用ビルド
`NODE_ENV=development npm run build`

ステージング環境用ビルド
`NODE_ENV=staging npm run build`

## 実行結果
開発環境
![dev-url.JPG](https://qiita-image-store.s3.amazonaws.com/0/306956/e92c9cbb-da55-a1ec-b94a-63af47938500.jpeg)

ステージング環境
![staging-url.JPG](https://qiita-image-store.s3.amazonaws.com/0/306956/53811674-a96d-2cee-7679-174b0e77b484.jpeg)


## まとめ
簡単に切り替えることができました。
この方法では、環境毎に切り替える値が多くなっても、環境毎に一つのファイルに集約できるのでわかりやすいです。
その反面、環境毎にファイルを用意する必要があるので、環境が増える場合はファイルのか扱いが煩雑になりそうです。
また、このファイルは全てgitなどのバージョン管理に含める必要があります。
そのため、APIのアクセスキーなど外部に公開できない情報を扱う場合は別の方法を採用する必要があります。
Groovy-IoT + kikori と enebular-editor を使って、お手軽IoT体験

# 何ができるの？
PCにGroovy-IoTを経由して接続した実物のセンサ(Grove-system)を用いて enebular-editorによるフロー作成。動作確認やテストがPC上で出来たら、それをGroovy-IoTを装備した実機(ラズパイ, GW)にenebularでデプロイしてIoTデバイスとして使う。
![Groovy-IoT_deployment.png](https://qiita-image-store.s3.amazonaws.com/0/156757/8099faa2-77af-7cc6-aec8-53a6560bd11d.png)

# 何がすごいの？
PCやMacで実センサで開発したフローをなんの変更もなく実機にデプロイ出来る。今までは各I/O-I/Fには専用のノードを用意していたが、WebServer形式のドライバで吸収することによりHTTP-Request(標準ノード)でセンサやアクチュエータの制御ができる。

# 準備するもの
- ハードウェア
 - PC (Win or Mac)
 - RaspberryPi (Zero以外)
 - [Groovy-IoT](http://www.omiya-giken.com/?page_id=2262) x 2 (PC用, RasPi用)
 - 各種センサ (BME280 etc.)

- ソフトウェア
 - [Kikori (WebSensorServer SW)](https://gitlab.com/myst3m/kikori)
 - [enebular-agent](https://github.com/enebular/enebular-runtime-agent/releases)
 - [enebular-editor](https://docs.enebular.com/en/enebulareditor/)

- その他
 - enebular account
 - AWS-IoT account

# セットアップ
![Groovy-IoT_host.png](https://qiita-image-store.s3.amazonaws.com/0/156757/2205361d-5218-6c0a-5fc2-65e5543d8238.png)

- PC
 - Groovy-IoT をUSB端子に接続し各種センサやアクチュエータをGrove端子に接続する
 - JDK10+ インストール
 - kikori インストール
 - enebular-editor インストール

![Groovy-IoT_target.png](https://qiita-image-store.s3.amazonaws.com/0/156757/4f00efea-7d37-6de9-5cca-cc061e64722e.png) 

- ターゲット(ラズパイ、各種GW)
 - Groovy-IoT をUSB端子に接続し各種センサやアクチュエータをGrove端子に接続する
 - JDK10+ インストール
 - [kikori](http://www.omiya-giken.com/?page_id=2545) インストール
 - [enebular-agent](https://github.com/enebular/enebular-runtime-agent/blob/master/README.ja.md) インストール

- その他
 - enebular-account 設定
 - AWS-IoT thing 設定

# kikori
- [kikoriでサポートしているセンサ(一部)](http://www.omiya-giken.com/?page_id=2551)
- kikori アーキテクチャ
![Groovy-IoT_kikori_arch.png](https://qiita-image-store.s3.amazonaws.com/0/156757/eb347373-b7ef-3400-ffa2-429e0e19cc19.png)

- WebSensorServerの仕組み
![Groovy-IoT_wss.png](https://qiita-image-store.s3.amazonaws.com/0/156757/93793d79-93f2-862a-d762-098a18731e38.png)

# 参考URL
- [Groovy-IoT](http://www.omiya-giken.com/?page_id=2262)
- [kikori](http://www.omiya-giken.com/?page_id=2545)
Google Bigtableでのキー設計の指針について

こんにちは、PLAIDでSREをやっている @tarr1124 です。この記事は、自分の所属しているPLAIDのアドベントカレンダーの記事になります。
https://qiita.com/advent-calendar/2018/plaid

KARTEでは、クライアントのサイトから、ユーザーの行動をeventという形でデータを送信してもらっています。
そのevent一つ一つに対して、解析処理をし、ユーザーのこれまでのeventから解析されたデータにマージされて、その結果を元に適切なresponseを返すようになっています。

このeventや解析されたデータは様々なデータベースに格納されますが、今回は、その中からBigTableに焦点を当てて、KARTEのデータ特性からどのようにBigtableのキーを設計すれば良いのかを書きます。

# そもそもBigtableってなに
![image.png](https://qiita-image-store.s3.amazonaws.com/0/36604/da469186-4be1-2dd2-9384-801f40099490.png)
https://cloud.google.com/bigtable/docs/overview


Bigtableは下記のような特徴をもったKVSです。

* 大量のデータを保持できる（node数を増やすことで線形にデータ容量が増える）
* 大量のアクセスをさばくことができる（node数を増やすことで線形に処理能力が伸びる）
* 列指向であるので、一つのkeyに大量のcloumnを持たせることができる。（それらを特定のcolumnのみでfilterして取り出すことも可能）

このように、nodeを増やせば増やすほど、BigTableでは大量のデータを扱えるように、大量のリクエストをさばけるようになります。
しかし、そのためには、うまくリクエストやデータが分散されるように、キーを設計する必要があります。

# どのようにキーを設計すれば良いのか
BigTableのデータは以下の特徴で扱えます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/36604/35870fa8-2707-d403-d288-9e8c2fa48f42.png)
https://cloud.google.com/bigtable/docs/overview

* keyの辞書順にソートされた状態で格納される。
* keyをrange指定で複数のrowで取得できる
* 一つのnodeにread/writeが集中しないように分散させたほうが良い。
* そのkeyが何を表しているのか、人間があとから追えるようにする必要がある。（key visualizerというツールでパフォーマンスを追うときに必要です）

つまり、どのようにデータを利用したいのか、read/writeのどちら側に寄せるのか、などを考慮した上でkeyを設計する必要があります。

# KARTEのキー設計
KARTEがBigTableに格納しているデータは大きく2種類あります。
それぞれのデータ特性にあったキーの設計を紹介します。

## 解析済みuserデータ
* eventを解析した結果をmergeしていくデータ
* userごとに持っている。
* eventが来るたびにread/writeが走る。
* 管理画面からユーザーの詳細を見るときなどにreadが走る。

このような特徴のデータのkeyを設計してみます。
まず、userごとのkey-valueなので、`user_id`をkeyにするのはどうでしょうか？

`{user_id}`

この状態だと、user_idに偏りがあったときに特定のnodeに負荷が集中してしまって、BigTableのパフォーマンスが落ちてしまいます。
それでは、hashにするとどうでしょう。

`{user_idのhash値}`

こうすれば、user_idによる偏りは防げますが、あとから問題が起こったときに人が追いづらいですね。
特にBigTableでは、Googleが提供しているkey visualizerというツールをつかって、keyに偏りがないか、パフォーマンスを確認することがあります。
その際に、keyがhash値などだと、何が原因でパフォーマンスが悪いのか追いづらいため、Googleも推奨していません。

そこで、KARTEでは、user_idから作るhash値をprefixにつける設計にしています。

`{user_idのhash値}_{user_id}`

これで、BigTable内で適切に負荷が分散されます。これは、keyがデータとして独立していて、他のデータと関連していないためにできる設計です。

## eventデータ
* すべてのユーザーから送られたeventが格納されているデータ
* 管理画面からユーザーごとにeventのhistoryを見たいときに使われる。
* eventの詳細を見たいときに使われる。

eventデータは、上記のような特徴を持っており、これはupdateがなく、読み込みがメインとなる時系列データです。
また、このデータはユーザーごとで読み込んで使われるため、ユーザーのデータがBigTable内でまとまっている必要があります。
一方で、新しいuserなどのほうが書き込みが多いという特徴もありそうです。よって、userのデータ自体はnodeで分散させる必要があります。

そこで、KARTEでは下記のようにBigTableのkeyを設計しています。

`{user_idからのhash値}_{user_id}_{timestampを反転したもの}`

この設計であれば、下記のように、Bigtableと我々のKARTEの要望、両方に適したものになります。

* hash値をprefixにつけているので、user_idの偏りによって、特定のnodeにリクエストが集中することがない
* `user_idのhash値`と`user_id`を prefixとして持っているので、辞書順に並んだ際に、一人のuserのrowをまとめてとってくることができる
* `user_id`自体もkeyに含まれているので、問題が起こった際に人間が追いやすい
* `timestampを反転したもの`をpostfixとして持っているので、新しいrowが先にくるようにソートされる

---

このような形でBigtableのキーを設計することで、read/writeのパフォーマンスに加えて、node数を抑えることができ、コスト面にも効果がでます。
Bigtableを使う際に参考にしてみてください。
ScrapBoxの素晴らしいUI/UX。編集・投稿アクションがないのが、こんなに心地良いなんて。

- 画像では分かりにくいがScrapBoxには投稿・編集アクションが存在しない。
- 使い始めから分かってはいたけど、使い込むにつれて、この重要さがぐんぐんとユーザー経験に響いてくる。
- ちょっとした編集も簡単だし、大掛かりな編集も簡単。
- どこで編集を始めても良いし、どこで編集を追えても良い。
- 下書きも要らないし、自動保存機能がサーブを終えるタイミングを待つ必要もない。
- 本当に新世代のUI/UXすぎてすごい感じがする。
- サービス設計者や、それを実現した開発者を心の底から称えたい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/e9206c93-3bd8-cee6-66f3-a591611e71a2.png)

[yumainaura scrapbox - Google Search](https://www.google.co.jp/search?q=yumainaura+scrapbox&oq=yumainaura+scrapbox&aqs=chrome..69i57j69i60l3.5196j1j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Kubernetes 1.13: Urgent Upgrade Notes

## はじめに

このエントリは、[Kubernetes 1.13 の CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.13.md#v1120) から Urgent Upgrade Notes についてまとめています。翻訳に合わせて補足を追記しています。その他の内容は次のリンク先を参照してください。

- Kubernetes 1.13: Urgent Upgrade Notes
- [Kubernetes 1.13: 既知の問題 (Known Issues) と 廃止予定の機能 (Deprecations)](https://qiita.com/yuanying/items/1dcac3ef3085700dd99b)
- [Kubernetes 1.13: 主な変更点 (Major Themes)](https://qiita.com/shmurata/items/9f02ac6bf62cebdd51bb)
- [Kubernetes 1.13: 新機能 (New features)](https://qiita.com/shmurata/items/a7d5652ed929675b6e28)

## Kubernetes 1.13: Urgent Upgrade Notes

Kubernetes 1.13 へのアップグレード前に、以下について心に留めておいてください。:

- kube-apiserver

  - 非推奨となっていた `etcd2`　ストレージバックエンドは削除されました。`--storage-backend=etcd2` を利用している kube-apiserver をアップグレードする前に etcd v2 のデータは v3 ストレージバックエンドに **移行されていなければならず**、kube-apiserver の呼び出しも `--storage-backend=etcd3` を使うように変更してください。移行手順については、etcdのセットアップに使用したインストール手順を参照してください。アップグレード前の etcd のバックアップはいつでも良い方法ですが、etcd2 から etcd3 への移行は逆戻りできないため、移行前のバックアップは必須でしょう。
  - 非推奨となっていた `--etcd-quorum-read` のフラグは削除されました。etcd の quorum read は常に　etcd のデータを取得する際に有効化されます。`--etcd-quorum-read` のフラグを kube-apiserver の呼び出しから削除してください。

- kube-controller-manager

  - 非推奨となっていた `--insecure-experimental-approve-all-kubelet-csrs-for-group` フラグが削除されました。
  - The deprecated `--insecure-experimental-approve-all-kubelet-csrs-for-group` flag has been removed.

- kubelet

  - 非推奨となっていた `--google-json-key` フラグが削除されました。アップグレード前に `--google-json-key` フラグを kubelet の呼び出しから削除してください。([#69354](https://github.com/kubernetes/kubernetes/pull/69354), [@yujuhong](https://github.com/yujuhong))
  - DaemonSet の Pod は　スケジューラによってスケジューリングされるようになりましたが、この機能は kubelet のバージョンがが 1.11 以上である必要があります。kube-controller-manager を 1.13 にアップグレードする前にクラスター内の全ての kubelet のバージョンを 1.11 以上にしてください。
  - アルファバージョンである　`CSINodeInfo` CRD のスキーマが `spec` と `status` フィールドに分割され、`status.available` と `status.volumePluginMechanism` が追加されました。以前のアルファバージョンのスキーマを利用していた場合はそれを削除し、新しいスキーマの CRD を再作成してください。 ([#70515](https://github.com/kubernetes/kubernetes/pull/70515), [@davidz627](https://github.com/davidz627))

- kube-scheduler
    - kube-scheduler は `componentconfig/v1alpha1` の設定ファイルのサポートを削除しました。1.13 へのアップグレード前に kube-scheduler の設定についてはコマンドラインフラグを利用するか、`kubescheduler.config.k8s.io/v1alpha1` の設定ファイルを利用してください。

- kubectl

  - 非推奨となっていた `run-container` コマンドが削除されました。代わりに `kubectl run` を利用してください。([#70728](https://github.com/kubernetes/kubernetes/pull/70728), [@Pingan2017](https://github.com/Pingan2017))

- client-go
    - client-go は bootstrap (k8s.io/client-go/tools/bootstrap) に関連したコードを今後リリースに含めることはありません。それらのコードに対する参照は全て壊れるため、全ての参照を k8s.io/bootstrap に変更してください。([#67356](https://github.com/kubernetes/kubernetes/pull/67356), [@yliaog](https://github.com/yliaog))

- その他
    - Kubernetes は GCE の同じ名前の Zonal PDと Regional PD を区別することはできません。この問題のワークアラウンドとしてはユニークな名前で PD を作成するようにしてください。動的に作成された PD に関してはこの問題は発生しません。 ([#70716](https://github.com/kubernetes/kubernetes/pull/70716), [@msau42](https://github.com/msau42))
vimの公式リファレンスの便利なTipsたち

[Vim Advent Calendar 2018 その2](https://qiita.com/advent-calendar/2018/vim2) 18日目の記事です。

こんにちわ
自分は普段vimに関するTipsや情報を記事から得る事がほとんどで、
マニュアルをあまり読んできませんでした。

マニュアルを読まない癖がついてしまっていますが、
記事などでは得られない情報があるので、最近はなるべくマニュアルを読むようにしています。

vimにはvim-jpの方々が翻訳してくださった[マニュアル](https://vim-jp.org/vimdoc-ja/)があり、vimの機能について細かく紹介されています。
今回の記事はそのマニュアルからこれは便利だなと思う機能を紹介していきます。

各項目はリンクになっているので、詳細を知りたい方はリンク先を参照してください。

# [セッション](https://vim-jp.org/vimdoc-ja/usr_21.html#21.4)
vimには現在の作業状態をセッションとして保存・復元する機能があります。
開いているファイルや分割ウィンドウなどがそのままファイルに出力して、ファイルを読み込むことで復元できます。

~~これがあれば、tmuxの代用できそうですね。~~
そんなことはなかった…

**[追記]**
先日sessionについて[こちらの記事](https://qiita.com/gorilla0513/items/838138004f86b66d5668)でも触れたので、合わせて読むことをおすすめします。

![vim-session.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/0e58bded-134c-2570-0d5d-c9c390676c83.gif)

## セッション保存
```vimscript
:mksession vimbook.vim
```

## セッション復元
sourceコマンドでファイルを読み込むか

```vimscript
:source vimbook.vim
```

もしくは起動時にファイルを指定するかで復元可能。

```shell
vim -S vimbook.vim
```

他に色々細かいオプションがありますので気になった方はマニュアルへ。

# [ネットワーク上のファイルを編集する](https://vim-jp.org/vimdoc-ja/usr_23.html#23.2)
vimは`gf`でカーソル上にあるファイルを開くことができるが、実はネットワーク上にあるファイルをダウンロードして編集することもできます。

対応しているプロトコルは以下の様です。

```
ftp://          ftp を使う
rcp://          rcp を使う
scp://          scp を使う
http://         wget を使う (読込専用)
```

![gf-vim.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/9983c6af-1f53-6b7b-68e4-b209889d7691.gif)

httpプロトコルでは外部でwgetを実行しているのはgifから確認できますね。
使用する時は外部コマンドが必要なので、ご注意ください。

# [履歴からファイルを開く](https://vim-jp.org/vimdoc-ja/starting.html#:oldfiles)
`:oldfiles`or`:ol`でファイルの履歴一覧を確認できます。
ただ、これだけでは一覧の確認しかできないので、`:browse ol`で番号を選択してファイルを開くことができます。

![oldfiles.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/afbcde92-429d-2a36-75ce-e3fa9e2777a9.gif)

# [複数のファイルを変更する](https://vim-jp.org/vimdoc-ja/usr_26.html#26.3)
sedコマンドを使用して複数のファイルを一括で変更することが多いと思いますが、
vimでも同じことができます。

vimでは`:args`でファイルを開き、`:argdo`でバッファを含むファイル達に対して、
一括でコマンドを実行してファイルを保存することができます。

```vimscript
:args *.c
:argdo %s/\<x_cnt\>/x_counter/ge | update
```

ただ、バッファのファイル全部対象となるため、対象外のファイルが入っていないことを確認しておいたほうが良いと思います。

# [他のTips](https://vim-jp.org/vimdoc-ja/tips.html)
マニュアルにTipsがいくつか紹介されています。
例えば[複数のファイル名をリネーム](https://vim-jp.org/vimdoc-ja/tips.html#rename-files)する方法です。

自分自身ドキュメントを読んでいてvimを理解し、使いこなしていく上でかなり大事なドキュメントだなと思いました。
では良きvimライフをー
懇親会でもっと広まってほしいパックマンルール

# 懇親会でもっと広まってほしいパックマンルール
## TL;DR
懇親会で誰かと話すときは、新しく他の人が入ってこれるようにスペースを空けておいてあげると他の人も話に入ってきやすいよ。
## まえふり
皆さんは最近勉強会など行っていますか？
勉強会といえば懇親会が付き物だと思います。私が先週行った某所の勉強会でももちろんありました。
懇親会のときにあの人と話したいんだけど、他の人が話しててスペースが無くて上手く入れないなんてことが有ると思います。私もこないだありました。
そんなことを思っていたある日、パックマンルールなるものを耳にして良いなと思ったので紹介したいと思います。
## ほんだい
懇親会で誰かと話すときは新しい人が会話に入って来れるように、一人分のスペースを空けて話しましょうよってルールがパックマンルールです
![無題のプレゼンテーション.png](https://qiita-image-store.s3.amazonaws.com/0/113187/b8cac109-8412-af6e-f250-8d4ce055efe2.png)
このルールがもっと広まっていろんな懇親会でも使ってもらえると良いなと思いました。
イベント主催者の方はぜひ検討してみてください。
Clovaスキル申請やってみて

## Clovaスキル作成してみた
Alexaに続きClovaスキル公開も経験したので、経験談をまとめます！
初心者なのでツッコミどころは多々あるかもしれませんが・・・皆様のスキル開発のきっかけになればと思います。
スキル開発はツールや書き方が異なるだけで、基本的な部分は一緒なので、
ぜひ色々なスマスピスキル開発にチャレンジしてみようと思っていただければと思います。

## きっかけ
- Alexaのスキル開発をやってみて、Clovaでもスキル開発をしてみたいと思ったためチャレンジ
- Clovaを2つ持っているので活用したい。。。
- Clova可愛い。。。。

## Alexaと違って困った点
AlexaとClovaでそれぞれ同じ内容のスキルを作成してみました。
そこで感じたのは、Clovaは揺らぎに対して厳しい。。。。ということでした。
スロットに追加した言葉の同義語にゆらぎの文言も足さなければ、
なかなか申請が通りませんでした。
その揺らぎを確認するのにシミュレータでは確認できないので、
実機で色々な発話をひたすら試すしかない感じでした。。。。
あまりスロット数が多いものは大変ですね。。。

## 今回公開されたスキル　「やきにくラブ」
![47575108_568261500288138_8472649905708466176_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/215684/19c09db2-3a2d-d64a-0696-66ffea0fd9f6.jpeg)
- お肉の豆知識と部位を教えてくれるスキルです。
- 部位をスロットとして登録しているので、すごい数。。。（6~70個はあった気がします）
→指摘としてあったのは「ハラミ」という文言に対して、「腹身、はらみ」だけでなく、
　「絡み、孕み」なども同義語に追加しなきゃだめ、というようなリジェクトを食らいました。。。

## 結論、感じたこと
- Clovaスキルの開発は実機があった方がやりやすいかも
 →もちろん実機がなきゃ開発できないということはないのですが、実機がないと不便に感じることはありました。
- スロットの追加はCSVでの追加もできたので、その点は楽だなぁと思いました。
- そしてなによりClova、可愛いので何か色々喋らせたいなという創作意欲が湧くところが一番の魅力かなと思います！


アウトプット、大切だなと感じました。
先月から何回かLT登壇させていただいているのですが、
やっぱり自分の話を聞いてもらえるって楽しいと思います。
また、楽しんで聞いてもらえるにはどうすれば良いか考える良い機会であるため、
弊社の経営理念にもある「楽しむ」ということを体現できているように思います。
皆様も内容はともかく、「まずアウトプットしてみること」をおすすめします！
jupyterthemesで狂ったフォントをデフォルトに戻す

# 概要
Jupyter notebookのテーマを変えようとjupyterthemesに手を出したが気に入らず
結局デフォルトに戻そうと`jt -r`を実行するも、フォントだけは元に戻らず困ったのでメモ

# Jupyter notebookのテーマをデフォルトに戻す
```
jt -r
jt -dfonts
```

これでデフォルトのJupyter notebookテーマに戻ります。

# 脚注
本記事は2018年12月11日に書かれたものです。
jupyterthemes自体、css絡みのバグが報告されているようなので、しばらくは使わないかなぁ。
Laravel5.5でAWS SES からGmail経由にメール送信変更

# 環境

* Amazon Linux
* PHP 7
* Laravel 5.5
* メールはSESで送信設定済み

# .envを変更

.env現状

     MAIL_DRIVER=ses
     SES_KEY=hogehoge
     SES_SECRET=hogehogehoge

以下のように変更

     MAIL_DRIVER=smtp
     MAIL_HOST=smtp.gmail.com
     MAIL_PORT=465
     MAIL_USERNAME=hoge@gmail.com
     MAIL_PASSWORD=pass
     MAIL_ENCRYPTION=ssl
     MAIL_FROM_ADDRESS=hoge@gmail.com
     MAIL_FROM_NAME=hoge

# SPFに登録
次になりすまし防止のため、SPFでメールの送信者を承認するです。
設定はこちらになります。
https://support.google.com/a/answer/33786?hl=ja

これだけ。
すでに記述しているメール等は全てgmail経由で送られるようになります。
【iOS】画像トリミングをサクッとライブラリで実現

# はじめに
こんにちは、@kaoryuuu です。
AdventCalendar2018 LIFULLその2の8日目の投稿になります。
この記事は元々ぼっち向けインスタライクな日記アプリを作ろうと思った際に実装した内容になります。


# 概要
画像の加工を行う際にトリミングや画像の回転などは欠かせない機能の一つです。
今回はこちらのライブラリを使ってお手軽に実装していきます。

> https://github.com/TimOliver/TOCropViewController


#  作るもの
![CropViewController](https://d3sw39zdfkajdx.cloudfront.net/art_img/8b637f2a-4240-403d-93c5-f4f1225abea7png)

-----




### **1.Pod**

```Podfile
pod 'CropViewController'
```

-----

### **2.import✋**
```UIViewController.swift
import CropViewController
```

-----

### **3.Call☎️**
画像をセットしてpresentしてあげるだけ！あとはDelegateに任せましょう

```UIViewController.swift
let cropViewController = CropViewController(image: UIImage)
cropViewController.delegate = self
present(cropViewController, animated: true, completion: nil)
```

-----

### **4.Delegate🤖**
Delegateがいくつか用意されているのでお好みで使いたいものを使いましょう。
↓のは最低限実装に使いそうなもの

```UIViewController.swift
extension UIViewController: CropViewControllerDelegate {

    func cropViewController(_ cropViewController: CropViewController, didCropToImage image: UIImage, withRect cropRect: CGRect, angle: Int) {
	    //加工した画像が取得できる
    }
    
    func cropViewController(_ cropViewController: CropViewController, didFinishCancelled cancelled: Bool) {
	    // キャンセル時
        cropViewController.dismiss(animated: true, completion: nil)
    }
}
```

#  完成
![demo](https://d3sw39zdfkajdx.cloudfront.net/art_img/39a3376d-a0c3-407e-825c-9b033b4a7765gif)
mrubyで人感センサー

4日目の@mikawanさんの記事に触発されて、かなり以前サトー電気で買ってあった人感センサーを使ってみました。

使わなくなった古い無線ルーターの[Broadcom BCM4712というSOCを使ったモジュールでmruby](https://qiita.com/yamori813/items/062e3b9969b6a59402a1)を動かしてThingSpeakにポストするようにしてみました。

![人感.png](https://qiita-image-store.s3.amazonaws.com/0/104066/90f43793-c794-2667-373a-173375b8ec6e.png)

```ruby
#
# yabm mruby script
#
# thingspeak channel update 
#

APIKEY = "naisyo"

def delay(yabm, val) 
  start = yabm.count() 
  while yabm.count() < start + val do
  end
end

begin

# ip address setting

yabm = YABM.new

yabm.netstartdhcp

ntpaddr = "10.0.1.18"

yabm.sntp(ntpaddr)

ip = yabm.getaddress

yabm.print ip

interval = 0

last = yabm.gpiogetdat & 0x01

while 1 do
  yabm.print "."
  delay(yabm, 1000)
  if interval == 0 && last != yabm.gpiogetdat & 0x01
    yabm.print "*" 
    res = SimpleHttp.new("https", "api.thingspeak.com", 443).get("/update?api_key=" + APIKEY + "&field1=1", {'User-Agent' => "test-agent"})
    interval = 1
  end
  if interval != 0
    interval = interval + 1
  end
  if interval == 60
    last = yabm.gpiogetdat & 0x01
    interval = 0
  end
end

rescue => e
  yabm.print e.to_s
end
```

蟹さんとこのBCM/mipsをまとめて、Yet Another Bare Metal(YABM)と呼ぶ事にしました。

httpsでBearSSLを使っているのですが、証明書の有効期間を確認するためにある程度正確な時間が必要なので[おうちの中のntpサーバ](https://qiita.com/yamori813/items/55ec4ed00f22fc36b9d1)に接続して時間を取得しています。

センサーの出力をルーターのボタンに接続してあります。それをGPIOで拾っています。ボタンはプルアップされて0ビット目になります。使っていませんが、裏のボタンが2ビット目でLEDが3,4ビット目になります。

このセンサーモジュールの仕様は[アクティブセルさんのページ](http://www.activecell.jp/kyoumi/jintai.htm)が参考になります。

センサーの電源はルーターから分けてもらっているのですが、ルーター電圧が3.3Vだったのでセンサーのレギュレーターを外して、直結にしました。

スイッチはヒートガンではがしたのですが、暖め方が足りずパターンをはがしてしまいました。スイッチを使えるように取ろうとしたのが失敗だったかもしれません。かろうじてプルアップの抵抗のところで接続しています。

![IMGP0032.JPG](https://qiita-image-store.s3.amazonaws.com/0/104066/6063384e-7446-c147-f2a8-343b5d92bbd1.jpeg)

このモジュールは上のカバーを外してから、全面のパネルを外すと分解できます。ネジを使わないはめ込みでプラスチックの爪が折れやすいです。

スクリプトを起動するとこんな感じで出力されます。

![スクリーンショット（2018-12-11 13.24.06）.png](https://qiita-image-store.s3.amazonaws.com/0/104066/db039883-7616-5681-5561-97fecb716a46.png)

ThingSpeakにはこのようにデータが入りました。

![スクリーンショット（2018-12-11 13.24.34）.png](https://qiita-image-store.s3.amazonaws.com/0/104066/6f757af8-3510-b461-0b10-f3917d5a2891.png)

このルーターはHardOffに108円でたくさん転がっていて、気軽にIoTができて楽しいと思います。

[プリコンパイルしたVMバイナリ用意してみました。](https://qiita.com/yamori813/items/876f07d4de448ec33cac)
そもそもsetter/getterはなぜ必要なのか

setter/getter使いますよね。。

ふとsetter/getterがなぜ必要なのかを
・setter/getterは何なのか
・setter/getterの嫌なところ
・なぜ必要なのか
・何故存在しているのか
の順で説明しようと思います。

# Setter/Getterとは何なのか
セッター/ゲッターってなんですかー？

.....

<b>セットするやつ</b>

<b>ゲットするやつ</b>

これくらいの理解度で大丈夫ですw

例：昨日、今日、明日の日付をセット/ゲットして出力する

```java


Date date = new Date();

private Date yesterdayDate; //昨日の日付
private Date currentDate;   //今日の日付
private Date tomorrowDate;  //明日の日付

//setter：今日の日付
public void setCurrentDate(Date currentDay) {
    this.currentDay = currentDay;
}

//getter：今日の日付
public Date getCurrentDate() {
    return currentDay;
}

//以下省略...
//setter：昨日の日付
//getter：昨日の日付
//setter：明日の日付
//getter：明日の日付

public static void main(String[] args) throws Exception {
        //今日を設定
        calendar.setTime(date);
        setCurrentDate(calendar.getTime());

        //昨日を設定
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        setYesterdayDate(calendar.getTime());

        //明日を設定
        calendar.add(Calendar.DAY_OF_MONTH, 1);
        setTomorrowDate(calendar.getTime());
        
        //昨日を表示
        System.out.println("昨日の日付：" + getYesterdayDate());
        //今日を表示
        System.out.println("今日の日付：" + getCurrentDate());
        //明日を表示
        System.out.println("明日の日付：" + getTomorrowDate());
}
```

こんな感じ。

setXXXXX, getXXXXXですね。

サンプルではクラス内で変数を設定して呼び出しているのでメソッドもprivateで問題ないですが、

<b>privateで変数を設定</b> して、
<b>setter,getterはpublic</b> で作成します。

# setter/getterの嫌なところ
<b>1.それだけでコードが増える</b>
setter:3行
getter:3行

はいこれだけで6行です。なるべくならごちゃごちゃ書きたくないのに6行...

<b>2.管理が面倒</b>
1と同じ理由ですが、コードが長くなればそれだけ管理が面倒になります。
セット、ゲットだけですがメソッドが2つ追加されます。それだけなのに。

<b>3.そもそもの動きは内部で行っている</b>

```java
setCurrentDate(calendar.getTime());
```
このメソッド自体が今日の日付をセットしている訳ではありません。
メソッドの中の

    this.currentDay = currentDay;

これがやってます。



getterなら

    return currentDay;

で、日付をreturnしてくれるために取得できます。

<br>

つまり、今日の日付自体は

<b>=で変数を渡す </b>
<b>returnで変数を返す</b>

で設定している訳です。では。。

#なぜ必要なのか

<b>=で変数を渡す </b>
<b>returnで変数を返す</b>

でやっているんなら、setter/getterは不要なはず。
日付は全て

    //set
    this.currentDay = currentDay;
    //get
    currentDay;

これでいいはず。。ではなぜ必要なのか。

<b>1.変数を守るため</b>

<b>private</b>で変数を作成し、セット/ゲットするのは<b>public</b>です。
なので、それ以外で<b>セット/ゲットすることはできない</b>です。

・上記=でのセットを禁止にして、setterのみでセット
・直接取得するのを禁止にして、getterのみでゲット
することで変数の値をセット/ゲットするのを制限します。

<b>2.どこでセット/ゲットしているのかを明確にするため</b>

1と同じ理由です。
setter/getterを使用することでセット/ゲットしている場所が明確になります。
また、getしている場所で落ちた場合は、それ以前でセットしていないのが明確になります。

とはいえ、setter/getter不要論は定期的に盛り上がったり盛り上がらなかったりしますw

では。。

#何故存在しているのか

setXXX
getXXX

内部の構造を見なくても、
これだけで<b>何をしているのかがわかる</b>からです。

setCurrentDate　　　//今日の日付をセット
getYesterdayDate　　//昨日の日付をゲット
setOneMonthAgo　　//1ヶ月前の日付をセット
getOneYearDate 　　    //1年後の日付をゲット

こんな感じ。

#まとめ

ここまでずらずれ書きましたが、
<b>慣例で存在している部分も一部ある</b>　と個人的に思ってます。

とにかく、コードが増えるのがすごく嫌。。


がしかし！
kotlinなんかはsetter/getterを内包しています。

```kotlin
val currentDate :Date; //今日の日付
```

はい。これで終わりw

varの内部構造としてsetter/getterを持っている、と言っておきましょうか。。
ちなみに、valの時はgetterのみ作られます。


最近はsetter/getterをわざわざ書かなくて良くなってるんですね。
ありがたや〜ありがたや！

# 参考
https://qiita.com/katolisa/items/6cfd1a2a87058678d646

http://d.hatena.ne.jp/Nagise/20141010/1412930502

https://qiita.com/SYABU555/items/7cc5909c119ec9ab0288
ゲームエフェクト Houdiniを使って私がやりたいこと（Houdini歴１年未満）

#はじめに
ゲームエフェクトでは、様々なモデルやテクスチャーを作成する必要があります。
最近では、テクスチャー制作にプロシージャルなツールとしてSubstance Designerを使うようになりました。
Substance Designerを使うことで開発効率とクオリティーアップを実現できたと感じています。
今までMayaや3dsmaxなどで作成していたエフェクト用のモデルを、プロシージャルなツールとしてHoudiniで作成できるようにならないか！と意気込んでHoudiniの学習を始めました。

#Houdiniでやりたいこと
・剣の軌跡などのモデル作成
・竜巻などのツイストモデル作成
・衝撃波の円柱のリングモデル作成
・氷や岩などのモデル作成
・自由な軌跡のトレールモデル作成
・リアル調、セル調の爆発の連番テクスチャー作成
・リアル調、セル調の煙の連番テクスチャー作成
・リアル調、セル調の炎の連番テクスチャー作成
・リアル調、セル調の水の連番テクスチャー作成
・リアル調、セル調の雷の連番テクスチャー作成

#Houdiniを学んで分かってきたこと
・炎や煙のシミュレーションがとてもリアル
・衝突、破壊のシミュレーションを外部にエクスポートして、ゲームエンジンに持っていけるらしい
・セル調にもシェーダーやライティングを上手く調整すると絵作りできそう
・VEX、Wrangleノードのコントロールが大事
・プロシージャルの作成フローには、繰り返しの慣れが必要

#Houdiniを学ぶときに必要な事
・ノードを繰り返し使うことで自分のものにしていく
・毎日5分でも触ってみる
・やりたいことの目的を明確に

#やってきたこと
###Houdiniを使用してスノードームをモデリング
　→アプリ：癒しのスノードーム　　（宣伝です！）
　　Android
　　https://play.google.com/store/apps/details?id=jp.ktkkumamoto.SnowDome

　　iOS
　　https://itunes.apple.com/us/app/snowdome-%E7%99%92%E3%81%97%E3%81%AE%E3%82%B9%E3%83%8E%E3%83%BC%E3%83%89%E3%83%BC%E3%83%A0/id1446155058?l=ja&ls=1&mt=8


###簡単なモデリングとUV展開までのチュートリアルを作成
　→http://ktk-kumamoto.hatenablog.com/entry/2018/11/30/204007


###Houdini ビジュアルエフェクトの教科書
　→https://amzn.to/2zQ8MJS
　　とにかく説明が丁寧でとても素晴らしい本でした。
　　まだ半分ぐらいまで読み進めている最中ですが、繰り返し読み返して覚えていきたい内容が詰まっています。


###Udemy : Vehicle Modeling in Houdini 16.5 - SciFi Dropship 
　→https://www.udemy.com/vehicle-modeling-in-houdini-16-scifi-dropship/
　→こちらは、宇宙船をモデリングするチュートリアルです。
　　まさかの無料でとても丁寧な解説で手を動かしながら少しずつプロシージャルモデリングを習得していけます。

# おわりに
最後まで読んでいただいてありがとうございます。
ゲームエフェクト向けにHoudiniのモデリングなどの効率的な使い方などをいつかまとめとして紹介したいと鋭意勉強中です。
どうぞよろしくお願い致します。
技術(者)を支えるネコ - にゃーんbotを作った

この記事は『[Slack Advent Calendar 2018](https://qiita.com/advent-calendar/2018/slack)』の11日目の記事です。

# 概要

技術(者)を支えるネコということで「にゃーん」と発言すると、すかさず猫画像を返してくれるbotを作ってみました。

<img width="464" alt="スクリーンショット 2018-12-11 13.26.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/102294/9a0281c9-8f00-63cd-bf31-c574b0eb52af.png">

# 背景

日々過ごしていて「にゃーん」って発言する機会多いと思うんですが、slackで「にゃーん」って言ってもなんの反応なしに虚しく流れていくのを見つめるのは辛いと思ったので作りました。
(ちなみにこのbotを知人のslackで運用しているのですが、割と利用率が高くて嬉しいです)

# 実装

Slack側はOutgoing webhookを利用して、バックエンドはAWSのAPI Gateway+Lambdaで作ってます。
(**Outgoing webhookはdeprecatedになる予定**だそうなので、近々Slack Appを使った実装に直したいと思っています)

猫画像は [TheCatApi.com](https://thecatapi.com/) で提供されているApiを利用しています。
静止画よりも動画のほうが嬉しさあると考えたので今回はgifで取ってくるようにしてます。

## Lambda ソース

```js:lambda
const https = require('https');

const API_URL = "https://api.thecatapi.com/v1/images/search?format=json&mime_types=gif";

exports.handler = (event, context, callback) => {
    https.get(API_URL, (res) => {
        res.setEncoding('utf8');
        res.on('data', (str) => {
            const data = JSON.parse(str);
            callback(null, {
                username: "cat",
                text: data[0].url
            });
        });
    });
};
```

# まとめ

こんなふうにAPI Gateway+Lambdaを利用すれば比較的簡単に作れて、コストもほとんどかけずにslack botを運用できるのでおすすめです。
もちろん、Cloud FunctionsやAzure Functionsといった他のFaaSでも簡単に実現できそうです。

以上、全力で技術者を支えるにゃーんbotの雑な紹介でした。
明日は、takahyonさんの「LINEのメッセージをSlackに転送するBotをAWSで作成してみる。」です！
なのぼ～ど＆Unityを繋げる

# はじめに
そういう授業があったんですよ。大学で。
趣味とか業務だったら普通にArduino使えばいいと思うんですけど。
ググってもこのふたつを組み合わせた記事は見つけられなくて、ちゃんと出来るのかいまいち不安だったのでやってみたレポです。

# 開発環境
- 私：Unityは使うけどマイコンとかさっぱりな大学生
- PC:Corei5,メモリ８GB
- OS:Windows10
- Unity：2017.3.1
- なのぼ～ど
- Arduino IDE

# 動機

## なのぼ～どとは？
Scratchで使えるマイコンボードです。標準ではスライダー、照度センサー、音センサーが付いていて、回路を組めば様々なセンサーで拡張できます。
基本的には、Scratchで制御します。あとはProcessingでも環境を整えれ比較的簡単に使えます。

でも折角なら３Dで豪華にしたい。だからUnity使いたい。
或いは、Unityのコントローラを自作したい。だからマイコンボード使いたい。
どうしよう。

するとなんと都合がいいことにこれが**Aruduino互換**なんですね。

## Aruduinoとは？
マイコンボードです。色々出来ます。なのぼ～どは、これをScratch向けにいい感じに変更したものです。
簡単に言えば、Aruduinoを改造したのがなのぼ～ど。基本は一緒なわけです。
なので、なのぼ～どはArduinoだと思って扱うことが出来ます。
ArduinoはUnityとつなげることができます。

つまり、うまく組み合わせればつながるはず！

# 実際にやってみる
**先人の知恵オンリーでできました。**
## 事前準備
Arduinoを扱うためには[Arduino IDE]("https://www.arduino.cc/en/Main/Software")が必要です。
あらかじめインストールしておいてください。

## なのぼ～ど側
先人の知恵：[なのかー/なのぼーどをArduinoとしてプログラミング]("littlewing http://littlewing.hatenablog.com/entry/2015/10/03/211020")
ただ、どうも挙動が不安定なようで、割と頻繁にコンパイルエラーされます。
そんなときはめげずに再チャレンジしましょう。３回に１回くらいコンパイルできるしなのぼ～どに焼けます。

## Unity側
先人の知恵：[【Unity/Arduino】UnityとArduinoを連携してみた - ソースに絡まるエスカルゴ ]("http://rikoubou.hatenablog.com/entry/2018/01/16/175113")
記事内で使っているのは照度センサーですが、他のセンサーにももちろん応用可能。私は音センサーでやりました。

# まとめ
**あれっ！？意外と簡単にできる！**
というわけで同じような授業を受けている方、Unityで豪華なものを作りましょう。
フロントエンドフレームワークと PWA

本記事は、[PWA Advent Calendar 2018](https://qiita.com/advent-calendar/2018/pwa) の 11 日目の記事となります。

## 前提

本記事では、PWA を構成する要素のうち、**「オフライン/キャッシュ動作」「WebPush」を実現する Service Worker を主要なフロントエンドフレームワーク、及びその CLI ツールなどと統合した形で使うための方法**をまとめていきます。

対象とするのは以下のフレームワークとします。

- React
- Vue.js
- Angular

## React

[create-react-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) で Workbox を使った Service Worker が利用できます。

オプトイン方式での提供になるので、利用する場合は `src/index.js` を下記を参考に修正してください。

> **Making a Progressive Web App**
> 
> The production build has all the tools necessary to generate a first-class Progressive Web App, but the offline/cache-first behavior is opt-in only. By default, the build process will generate a service worker file, but it will not be registered, so it will not take control of your production web app.
>
> In order to opt-in to the offline-first behavior, developers should look for the following in their src/index.js file:
> 
```js
// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: http://bit.ly/CRA-PWA
serviceWorker.unregister();
```
>
> As the comment states, switching serviceWorker.unregister() to serviceWorker.register() will opt you in to using the service worker.

ただし、`generateSW` モードで実現できるリソースキャッシュ程度ならともかく、`injectManifest` モードで細かい挙動の調整をしたい場合や WebPush を取り扱いたい場合、Webpack の config ファイルをイジェクトして自分で調整する必要があります。手間。

## Vue.js

[Vue CLI 3.0](https://cli.vuejs.org/guide/creating-a-project.html#vue-create) でプロジェクト作成時に導入可能なプラグインの一つに、「PWA」が存在します。

React 同様 Workbox を使った Service Worker の提供になりますが、Vue CLI 3.0 は `vue.config.js` ファイルを作成することで Webpack の config ファイルを直接触ることなくプラグインなどの挙動を調整可能なので、React よりは WebPush の導入が楽ちんです。

また、Vue CLI 3.0 のプラグインシステムを使って提供されているので、既存プロジェクトへも下記のコマンド一発叩くだけで追加できます。

```bash
vue add @vue/pwa
```

実際の設定項目はこちらを参考にどうぞ。
[@vue/cli-plugin-pwa](https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa)

## Angular

一番対応が手厚いです。

Vue.js のように新規プロジェクト立ち上げ時の設定項目にこそないですが、下記のコマンド一発でキャッシュ動作を実現する Service Worker が導入されます。

```bash
$ ng add @angular/pwa
```

また、`@angular/ng-service-worker.SwPush` を使うことで、Angular がイベント処理などに採用している、Observable Stream を介して WebPush のメッセージや通知の開封を処理することができます。

[本アドベントカレンダーでも SwPush についての解説記事が上がっているので、](https://qiita.com/studioTeaTwo/items/579e9bfa1b6e362c4a6c)詳細はそちらでどうぞ。

## まとめ

主要フロントエンドフレームワークで PWA を実現したい場合、以下で追加可能

- React (react-create-app)
    - 新規プロジェクト立ち上げ後、`src.index.js` の編集
- Vue (Vue CLI 3.0)
    - `vue create` で新規プロジェクト立ち上げ時に機能選択で `PWA` を追加する
    - 既存プロジェクトへは `vue add @vue/pwa` で追加できる
- Angular (ng-cli)
    - 新規プロジェクト立ち上げ後、`ng add @angular/pwa`
    - 既存プロジェクトへも同様のコマンドで追加できる
CircleCI2.0でgolang+depのテストを回す

とりあえず下のような設定ファイルを使ってます

```yaml
version: 2
jobs:
  build:
    docker:
      - image: circleci/golang:1.9
    working_directory: /go/src/github.com/IzumiSy/yourlibrary
    steps:
      - checkout
      - run:
          name: ensure
          command: |
            if [ ! -d vendor ]; then
              if ! type dep >/dev/null 2>&1; then
                go get github.com/golang/dep/cmd/dep
              fi
              dep ensure
            fi
      - run:
          name: test
          command: go test -v
```
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)を解消した話

## はじめに
pythonのシステム作成中にこんなエラーが

```py
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
```

エラーはエラーだけど、なんか簡単にできそうな気はする。

## 確認
![Screenshot from 2018-12-11 15-06-51.png](https://qiita-image-store.s3.amazonaws.com/0/218398/0513360d-8c70-91f5-42d6-a2f008bf669f.png)

知ってた!!

## 参考記事
まぁ、最初は他の人がどうやって対処したから調べますか。
今回見たのは、[UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)](https://stackoverflow.com/questions/21393758/unicodedecodeerror-ascii-codec-cant-decode-byte-0xe5-in-position-0-ordinal)
もはや参考というか、答え。

だけど、回答にあるコードをどこ書けば良いのかわからない。
そこでもう一度検索結果を見よう。
それで見つかったのがコレ。
[pythonのデフォルトエンコーディングをutf-8に変更する](https://qiita.com/puriketu99/items/55e04332881d7b679b00)

この2記事を参考に進めていきましょうかね。

##解決
### 設定フォルダ探し
まずは、デフォルトエンコーディングのファイルを見つけよう。
![Screenshot from 2018-12-11 13-01-37.png](https://qiita-image-store.s3.amazonaws.com/0/218398/f30e8b0f-c024-844f-fd0c-6504248846d1.png)

見つかりましたね。

この中の`sitecustomize.py`を編集すれば良いのか。

### コード記入

```
$ cd /usr/local/lib/python2.7/site-packages/
``` 
![Screenshot from 2018-12-11 13-14-38.png](https://qiita-image-store.s3.amazonaws.com/0/218398/19534691-5dc5-6916-a921-d1eac927c9d8.png)

**ねぇじゃん!!**

じゃあ、新しく作りますか

```sitecustomize.py
import sys
sys.setdefaultencoding("utf-8")
```

ま、こんなもんですかね。
SNSアイコン・ロゴのガイドラインをざくっとまとめてみた

## はじめに
当方受託魔族なのですが、クライアントからの要件で「SNSシェアをしたい」という要件が結構あります。
その度に各ソーシャルメディアの公式ガイドラインを調べて確認して等が結構手間だったので、
自分用のメモとしてここの記事に1つにまとめようと思い、公式のガイドラインと一緒に
基本的なルールと禁止事項を記述していきます。

webコンテンツを制作する際のお役に立てたら幸いです。

## 書くこと・書かないこと
### 書くこと
* ロゴ・アイコンを使用する際の基本的なルール
* 禁止されていること

### 書かないこと
* 各社が提供しているAPI取得に関すること

## Twitter
https://about.twitter.com/content/dam/about-twitter/company/brand-resources/en_us/Twitter_Brand_Guidelines_JP.pdf

### 基本的なルール
* 提供されているアイコンをダウンロードして使用すること。
* ロゴは白または青で作ること。
* 画像に鳥のロゴを被せる場合はアイコンの色は「白」にすること。
* 白・青以外の色は許可しない。
* 囲みを付ける場合は、丸、正方形、角丸正方形のいずれかを使用すること。

### 禁止事項
* 複数の色を使用すること
  * オレンジ色にしてしまう等
* アイコンの変形
  * 羽を増やす
  * アイコンにデザインを追加する
  * 変形・引き伸ばしなど
* テキストと組み合わせての表示
  * Twitterロゴ + 見出し等

## Facebook
https://ja.facebookbrand.com/assets/%E3%80%8Cf%E3%80%8D%E3%83%AD%E3%82%B4/

### 基本的なルール
* 提供されているアイコンをダウンロードして使用すること。
* 「f」のロゴを使用すること。
* 白や薄い色の背景に青いボックスという組み合わせもしくは、青や濃い色の背景に白いボックスという組み合わせのいずれかにすること。

### 禁止事項
* ロゴの改変
  * アニメーションをつける
  * 色の変更
  * サイズ
  * 形の変形等

## Instagram
https://en.instagram-brand.com/guidelines/general
https://find-model.jp/insta-lab/instagram-logo/

### 基本的なルール
* 提供されているアイコンをダウンロードして使用すること。
* 30×30pxcel以上のサイズにすること。
* アイコンの周りはロゴの最低限半分サイズの余白を上下左右に取ること。

### 禁止事項
* ロゴ・アイコンの改変
  * 形を変形させること。
  * 任意の色に変更すること。
  * ロゴにテキストを勝手に加えること。

## LINE
https://line.me/ja/logo

### 基本的なルール
* 提供されているロゴ・アイコンをダウンロードして使用すること。
* LINEブランドロゴは、コーポレートロゴとアプリアイコンがあるので用途によって使い分けること。
* アプリアイコンは4種類用意されているので、用途によって使い分けること。
  * 色はフルカラーを推奨しているが、用意されているものであれば使い分けることが可能。

### 禁止事項
* ロゴ・アイコンの改変
  * ダウンロードしたロゴ・アイコンデータにデザイン・色の改変・変形を加えること

## YouTube
https://www.youtube.com/intl/ja/yt/about/brand-resources/#logos-icons-colors

### 基本的なルール
* 提供されているアイコンをダウンロードして使用すること。
* 高さ24dpより小さくしないこと。
* 余白はアイコンの幅の半分を確保しておくこと。
* YouTubeカラーを使用すること。
  * 赤・白・黒に近いグレー

### 禁止事項
* アイコンの改変
  * 「You Tube」の間の半角をトルツメすること。
  * 色を変更すること。
  * 追加でデザインを加えること。
  * ロゴを変形させること。

## Pinterest
https://business.pinterest.com/ja/pinterest-brand-guidelines

## まとめ
* 基本的には各社が用意してくれているアイコン・ロゴ使用するのが良さそう。
  * それが一番安全。
* 色・サイズ・形の改変は認められていない。
* 公式のガイドラインが最新で安全だから公式のガイドラインにまずは目を通しましょう。
* 余白のルール・「これ以下の大きさはNG」等割と細かく記載されているので、使用する前に一読しておいたほうが良さそう。

上記のガイドラインに注意して、安全・安心のコンテンツを作っていきましょう🙌
MySQL接続でのエラー CommunicationsException: Communications link failure

HTTP通信を用いてAndroidアプリからサーバのMySQLへの接続を試みたところ以下のエラーが発生しました。

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

別のPC端末からデータベースへのアクセスと、データベースがあるIPアドレスへAndroid側からpingが通っていることは確認済みです。

回答お願いします。
以下ソースです。




    //接続
    public String connect() {
    　　Connection con;	　　　//接続オブジェクト
        String test = "OK";
        try{
            String URL = "jdbc:mysql://'宛先IP'/'database名'";
            String USERNAME = "user";
            String PASSWORD = "password";

            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(URL,USERNAME,PASSWORD);
        }
        catch (Exception e){
            test = ""+e;
            //Toast toast = Toast.makeText(activity,"ERROR!"+e,Toast.LENGTH_LONG);
        }
        return test;
    }

    //接続のクローズ
    public void close(){
        con.close();
    }