OmniAICreator/Qiita-1.07M huggingface dataset:
Firebase(FCM)を使ったボタン付リッチプッシュ送信方法

#FCMを使ってボタン付リッチプッシュ通知送信（ツール：Postman）
1. mutable_contentを「true」に設定
2. dataにアプリに送りたいタグを追加（私の場合はdata-url, data-typeを追加）、こちらに追加したバグ名でアプリからデータを取得
3. notificationのtitle,bodyには通知のタイトルと内容を記入
4. click_actionはアプリにボタンを追加したい場合、アプリで設定したカテゴリ名を記入する。
5. toには送りたい端末のトークンを記入

![スクリーンショット 2017-12-04 10.52.02.png](https://qiita-image-store.s3.amazonaws.com/0/108475/181f2a6d-b320-eebf-b342-701265bb33ac.png)

##アプリ側のカテゴリ実装方法(ボタン追加)
###Notification Service Extensionをプロジェクトに追加

![スクリーンショット 2017-12-04 10.59.33.png](https://qiita-image-store.s3.amazonaws.com/0/108475/1594ab30-9fba-eaa9-2881-cf7aafd9c899.png)


###NotificationService.swiftのdidReceive関数に以下のコード追加

```swift:NotificationService.swift
//プッシュ通知にボタンを追加
let yesAction = UNNotificationAction(identifier: "yes", title: "はい", options: [])
let noAction = UNNotificationAction(identifier: "no", title: "いいえ", options: [])
//以下のカテゴリidentifier名はプッシュ通知送信側のclick_actionに追加
let category = UNNotificationCategory(identifier: "btnCategory", actions: [yesAction, noAction], intentIdentifiers: [], options: [])
        UNUserNotificationCenter.current().setNotificationCategories([category])
```

###AppDeleagate.swiftにボタンイベント処理を追加

```swift:AppDeleagate.swift
extension AppDelegate : UNUserNotificationCenterDelegate {
    
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
    {
        if response.actionIdentifier == "yes" {
            let alert = UIAlertController(
                title: "YES",
                message: "YESをクリック",
                preferredStyle: .alert)
            let defaultAction: UIAlertAction = UIAlertAction(title: "OK", style: .default, handler:{
                (action: UIAlertAction!) -> Void in
            })
            
            alert.addAction(defaultAction)
            self.window?.rootViewController?.present(alert, animated: true, completion: nil)
        }
        if response.actionIdentifier == "no" {
            let alert = UIAlertController(
                title: "NO",
                message: "NOをクリック",
                preferredStyle: .alert)
            let defaultAction: UIAlertAction = UIAlertAction(title: "OK", style: .default, handler:{
                (action: UIAlertAction!) -> Void in
            })
            
            alert.addAction(defaultAction)
            self.window?.rootViewController?.present(alert, animated: true, completion: nil)
        }
        completionHandler()
        
    }
}
```
テキストフィールドでバリデーションに引っかかったときに文字色を赤くし、下線を引く

こんにちは :octocat:

こんな感じの↓テキストフィールドを作ってみました。

![image2.gif](https://qiita-image-store.s3.amazonaws.com/0/15144/8993b81e-1379-6386-4d03-9095db5cd87c.gif)

## コード

`UITextField` を継承したクラスに `isValid` を持たせる形でやってみました。

```swift
import UIKit

class FormTextField: UITextField {
    private var validatorLayer: CALayer!

    var isValid = true {
        didSet {
            validatorLayer.isHidden = isValid
            validatorLayer.frame = CGRect(x: 0, y: self.frame.height - 2, width: self.frame.width, height: 2)
            textColor = isValid ? .black : .red

        }
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        didInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        didInit()
    }

    private func didInit() {
        // バリデーション用の下線
        validatorLayer = CALayer()
        validatorLayer.backgroundColor = UIColor.red.cgColor
        validatorLayer.isHidden = true
        layer.addSublayer(validatorLayer)
    }

}
```

Storyboard でテキストフィールドを設定している場合はクラス名を `FormTextField` にしておくのを忘れずに！

これで

```swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var textField: FormTextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        textField.addTarget(self, action: #selector(handleTextField(_:)), for: .editingChanged)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func handleTextField(_ textField: FormTextField) {
        // バリデーション例として20文字以内であるかチェック
        guard let text = textField.text else { return }
        textField.isValid = text.characters.count < 20
    }

}
```

でOKです！

## サンプル

サンプルはこちらです！
https://github.com/keisei1092/FormFieldPractice
Raspberry Pi で mosquitto を使う

ラズベリーパイへの mosquitto のインストール

サーバー (Broker) のインストール

```bash
sudo apt install mosquitto
```

サーバーの起動は

```bash
sudo systemctl start mosquitto
```

![mosquitto_dec0401.png](https://qiita-image-store.s3.amazonaws.com/0/179446/b4ea512a-da38-e1db-f6bf-ca8ba837650b.png)


クライアントのインストール

```
sudo apt install mosquitto-clients
```

サーバーの起動後
リスナー(Subscribe)を動かす

```bash
mosquitto_sub -d -t orz
```

Publish を動かす

```bash
mosquitto_pub -d -t orz -m "こんにちは Dec/04/2017"
```

![mosquitto_dec0402.png](https://qiita-image-store.s3.amazonaws.com/0/179446/27d2e589-9c1e-98d0-5926-86bcf175185b.png)

Subscribe の画面にメッセージが現れます

![mosquitto_dec0403.png](https://qiita-image-store.s3.amazonaws.com/0/179446/7aa13f36-45d2-f9f9-5f89-52c86b83beae.png)

ネットワーク越しにテストする為に、
Arch Linux に　mosquitto をインストールして、Broker を動かします。
Arch Linux では、サーバーとクライアントが同時にインストールされます。

```bash
sudo pacman -S mosquitto
```

ラズベリーパイから、ホスト名、host_aa のプローカーにメッセージを送るには (Publish)

```bash
mosquitto_pub -d -t orz -m "こんにちは Dec/04/2017" -h host_aa
```

ラズベリーパイから、ホスト名、host_aa のプローカーから、メッセージを受け取るには (Subscribe)

```bash
mosquitto_sub -d -t orz -h host_aa
```

トピックを指定しての　Publish

```bash
mosquitto_pub -d -m "こんにちは Feb/09/2018" -h host_aa --topic topic_1
```

トピックを指定しての　Subscribe

```bash
mosquitto_sub -d --topic topic_1
```

```bash
mosquitto_sub -d -h host_aa --topic "ttt/test"
```

次のバージョンで動作を確認しました。

```text
$ uname -a
Linux rose 6.12.25+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.12.25-1+rpt1 (2025-04-30) aarch64 GNU/Linux

$ mosquitto -h
mosquitto version 2.0.11

mosquitto is an MQTT v5.0/v3.1.1/v3.1 broker.
```
❄️React.js how to call an API

<img width="289" alt="スクリーンショット 2017-12-04 13.14.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/209256/6b2c5467-c2a8-fc94-83d2-5d66d877deaa.png">

---

<img width="411" alt="スクリーンショット 2017-12-04 13.15.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/209256/aec7f89e-39b7-3846-1136-15b356745a76.png">

---

Create the new application called **wolf-of-react**
The **axios** is needed to call an API.

```
$ yarn create react-app wolf-of-react

$ yarn add axios
```

You can delete unnecessary parts like this. 



```public/index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="theme-color" content="#000000">
  <link rel="manifest" href="%PUBLIC_URL%/manifest.json">
  <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
  <title>React App</title>
</head>
<body>
  <div id="root"></div>
</body>
</html>
```

```src/App.js
import React, { Component } from 'react';
import './App.css';
import StockInfo from './components/StockInfo';
import { loadQuoteForStock, loadCompanyLogoForStock } from './api/iex';

class App extends Component {
  state = {
    symbol: 'F',
    quote: null
  }

  componentDidMount(){
    this.loadQuote()
  }

  loadQuote() {
    loadQuoteForStock(this.state.symbol)
    .then((quote)=> {
      console.log(quote)
      this.setState({quote: quote})
    })
    .catch((err)=> {console.log(err)})
  }

  handleSymbolChange =(event)=>{
    const target = event.target;
    const symbol = target.value;
    this.setState({symbol: symbol });
    console.log(event);
  }

  handleButtonClick = (event) => {
    console.log(event.target);
    this.loadQuote();
  }

  render() {
    return (
      <div className="App">
      <h1>Wolf of React</h1>
      <input
      value={this.state.symbol}
      placeholder="Enter symbol"
      onChange={this.handleSymbolChange}
      />
      <button onClick={ this.handleButtonClick }>Get Quote</button>
      <StockInfo {...this.state.quote}/>
      </div>
    )
  }
}

export default App;
```
Create the **components** folder in the **src** folder.
And create the **StockInfo.js** file in the **/src/components** folder.

```src/components/StockInfo.js
import React from 'react';

function StockInfo({
  symbol,
  companyName,
  primaryExchange,
  latestPrice,
  latestSource,
  week52High,
  week52Low
}){

  return(
    <div>
    <h2>{ symbol }: { companyName }</h2>
    <h3>{ latestPrice } ({ latestSource} )</h3>
    <dl>
    <dt>Week 52 High</dt>
    <dd>{ week52High }</dd>

    <dt>Week 52 Low</dt>
    <dd>{ week52Low }</dd>

    <dt>Exchange</dt>
    <dd>{ primaryExchange }</dd>
    </dl>
    </div>
  )
}

export default StockInfo;

```

Create the folder called **api** and the **iex.js** file in it.

```src/api/iex.js
import axios from 'axios';

const api = axios.create({
  baseURL: 'https://api.iextrading.com/1.0'
});

export function loadQuoteForStock(symbol){
  return api.get(`/stock/${symbol}/quote`)
  .then((res)=>{
    return  res.data
  });
}
```



```
$ yarn run start
```
iPhoneXの物理メモリ取得で異常な数値（マイナス値）が返ってきた話

# iPhoneXの物理メモリは、3GBらしい。ということは...
Unityのネイティブプラグインで一部、sysctlを用いてシステム情報を取得する箇所で物理メモリ（RAMが何GBなのか）を取得していた。

ここで、iPhoneXだけがマイナスの数値が返ってきていて、内容が面白かったのでちょっとまとめることに。

## 物理メモリの取得について
参考にしていた記事があって、[[iOS] メモリ情報を取得する件．](https://hirooka.pro/?p=3009)で紹介されているソースコードをちょっと変更して使っていた。

```objc
- (long)hw_phys_mem
{
    long ret = -1;
    long val = 0;
    long err = 0;
    size_t len = sizeof(val);
    long selection[2] = {CTL_HW, HW_PHYSMEM};
    err = sysctl(selection, 2, &val, &len, NULL, 0);
    if(err == 0){
        ret = val;
        return ret;
    }else{
        return ret;
    }
}
```


## Objective-Cでのlongについて
今までのiPhoneに搭載されていたRAMの最大値は、

- 2GBで**2,147,483,648byte**

ということで、32byteの型。
iPhoneXのRAMは、

- 3GBで**3,221,225,472byte**

だから、そこを想定して

- **int（-2,147,483,648byte ～ 2,147,483,647byte）**

ではなく、

- **long（-9,223,372,036,854,775,808byte ～ 9,223,372,036,854,775,807byte）**

にしていたはずだったのに...
ちゃんと調べていくと衝撃な事実がありました。

※ちなみに、メモリの取得は、例えば2GBがから2GBちょうどの数値は返ってこない仕様になっていて、1.96GBぐらいの数値が返ってくるようになっているです。


### Objective-Cでのlongはいつもと違う...！？
私は、iOSのネイティブ開発をやったことはなく、Unityのネイティブプラグイン開発やXamarinなどで間接的にでしかiOSのアプリ開発に関わっていませんでした。

いろいろ調べてみると、[Objective-Cのlongは一般的な64byteの型ではなく、32byteで使用されている](http://blog.katty.in/3145)と知りました。

なので、longにしたところでintと同じ...というね笑ｵｲ

## 解決方法
~~longではなく、[unsigned long longで定義すると符号なし64bit整数](http://d.hatena.ne.jp/tanaponchikidun/20120612/1339509661)で対応できたことが今回のオチになります。~~
[Apple公式のsysctlの説明](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/sysctl.3.html)を確認したところ、HW_PHYSMEMをHW_MEMSIZEに変える必要があり、アドバイスをいただき、符号なしを符号ありに戻しました。
また、integerと書かれているのでInt64_tにしました。

```objc
- (int64_t)hw_mem_size
{
    int64_t ret = -1;
    int64_t val = 0;
    long err = 0;
    size_t len = sizeof(val);
    long selection[2] = {CTL_HW, HW_MEMSIZE};
    err = sysctl(selection, 2, &val, &len, NULL, 0);
    if(err == 0){
        ret = val;
        return ret;
    }else{
        return ret;
    }
}
```

　
これでiPhoneXの物理メモリ（RAM）の数値が正常に取れました。
取れた数値は、**2,920,284,160byte**で2.72GB、約3GBということになっているっぽい。


### （余談） sysctlの返り値がintなのだが
[公式](https://developer.apple.com/library/content/releasenotes/General/iOS10APIDiffs/Swift/Darwin.html)と[記事](http://www.yosbits.com/opensonar/rest/man/freebsd/man/ja/man3/sysctl.3.html)で解説されているsysctlを確認すると、受け取っている型がint固定っぽかったので、sysctlの他でも端末情報を取得する手段を探していたところ、[NSProcessInfo](http://cocoaapi.hatenablog.com/entry/10010625/NSProcessInfo)でも物理メモリが取得できることがわかりました。

まぁ、今回は大きな改修なく、変数と返り値の型を変えてあげるだけでなんとかなったんでNSProcessInfoにはしなかった感じです。


## まとめ
今回は、**オーバーフロー**で型問題が原因でしたが、、、まさかlongが32byte判定とは思いもしませんでした笑汗

確認するとき、Objectvie-Cを書き換えてビルドして→iPhoneXにアプリ入れて→確認して→失敗したらやり直し...の繰り返し。やっぱしネイティブプラグインを作ったり直すときって結構ツライですよねぇ＾＾;
エンジニアタイプ別 QAテストでのおもてなし作法

# はじめに
はじめまして、[CYBIRDエンジニア Advent Calendar 2017](https://qiita.com/advent-calendar/2017/cybird) 7日目担当 品質管理部の@a-hirahiraです。
6日目は@cy-nana-obataさんのお話でした。
最近は若くて優秀な方が多く、自分が新卒だった頃とは大違いだな……と頭が下がります。

私は、CYBIRDには2017年1月に入社しました。
前職では、ウォーターフォール開発でのWebサービスのテストや、
アジャイル開発でのAndroid/iOSアプリのテストを行ってきました。
CYBIRDでは主に女性向け恋愛ゲームの新規タイトルのQAテストを担当しています。

# エンジニアのタイプ
さて、QAテスターは、エンジニアとコミュニケーションを取る機会が非常に多い職種です。
常に円滑なコミュニケーションを意識しなければならないと言っても過言ではありません。

とはいえ、エンジニアも様々なタイプの方がいます。
時にはコミュニケーションがうまくいかず、バグチケット上で喧嘩が勃発してしまうこともあるでしょう。
（私はやったことないです……多分！:stuck_out_tongue:）

そこで、数年に渡り色々なエンジニアと接してきた経験を生かし、
今回は「エンジニアのタイプ別 QAテストでの~~かわいがり~~おもてなし作法」を説明します。
この作法を身につけることでコミュニケーションに自信がないQAテスターの方も
~~エンジニアを手のひらの上で転がす~~スムーズなテスト進行を実現することができます。

## BTS(バグチケット)を最後まで読まないタイプ
エンジニアの中には一定数、バグレポートを最後まで~~読めない~~読まない人種が存在します。

エンジニア：「この再現手順ですが、別パターンの場合はどうだったんですか？」
テスター：「それバグチケットに書いてあるから！」
エンジニア：「△△の環境ではどうでした？」
テスター：「それもチケットに書いてあるから！」

というやり取りはQAテスターであれば一度は体験した事がある不毛なやり取りだと思います。
バグレポートは一通り読み終えてから質問してくるのが人としての道理だと考えられます。
しかし、悪いのは本当にエンジニアでしょうか？

「バグレポート」の書き方については長い間論争が絶えず、怪文書が生まれやすい代物です。
不具合を正確に伝えようと長文を書いてしまう人もいますが、
大体エンジニアは最初の一行目ぐらいしか読んでいないと思った方が賢明です。

あなたのバグレポートは「正確に・簡潔に・丁寧に」書かれていますか？
エンジニアの心をぐっと掴む文章を書く努力をしましょう。
(不具合の事実”のみ”を簡潔かつ正確に書くようにしましょう)

そして、バグレポートを最後まで読んでくれるかどうかは
日々の信頼の積み重ねなので、信頼を得られるようなバグレポートをコツコツと書いていくことが大切です。

## 実装・修正は早いが不具合が多いタイプ
重そうな不具合や実装を予想外の速さで終わらせてしまうタイプの人もいます。

しかし「おっ仕事が早い！」とエンジニアを心の中で褒めた直後に
『修正確認→デグレ→修正→確認→デグレ→修正』というループに陥ること、ありますよね。

不具合修正時は正確に影響範囲を確認し、丁寧に修正するのが人としての道理だと考えられます。
しかし、悪いのは本当にエンジニアでしょうか？

まず、地獄の修正確認ループから抜け出すために、
一度テスト側でボールを持ち、エンジニアの手を止めます。
そして改めて現象を見返し、再整理したうえで、エンジニアにフィードバックしてみましょう。

一度の修正で解決しない場合、バグレポートに情報が不足している可能性や、別の要因がデグレを誘発している可能性があります。
バグチケットが混乱しだしたら、一旦情報を整理してみることをおすすめします。
## 新卒一年目
昨今、若く優秀なエンジニアも増えてきましたが、のびのび開発できる学生時代とは違い、
企業が長年蓄積してきた「時間と予算の前に敗北したスパゲッティコード」を紐解くのはそれなりに大変かと思います。
新卒は覚えることも多く、基本的にテンパっていたりするので、
可能であれば、テスト側で工数に余裕を持っておきたいものです。
（なので、新卒エンジニアの開発担当箇所を事前に知っておきましょう）

経験が少ない方の実装箇所はひと癖あるバグが発生しがちなので、
テスト側としては、通常のテストに加え、普段なら問題ない部分もウォークスルーで確認しましょう。
また、仕様理解が浅い場合もあるので、
複雑な機能の場合はパターンを網羅するように丁寧に確認していくと効果的です。

テスト側でもフォローできるような体制にし、
不具合リリースというトラウマを作らない手助けをしてあげましょう。

## 仕様をきちんと把握して実装するタイプ
世の中には、要件定義を無視しオレオレ実装するエンジニアもいる中、
きちんと仕様把握をしてくれる神タイプのエンジニアも存在します。
一見問題ないタイプに思えますが、甘えてしまってはいけません。

仕様把握元の資料に仕様不備があった場合や、
単一機能に問題がなくても全体を俯瞰した時に仕様に齟齬があった場合、
実装時に拾いきれない時があります。

テストは全体を見て整えることができるフェーズなので、
単一機能のテストのみに集中せず、システム全体を見て「プロダクトがどういう状態であるべきか」を気にかけていきましょう。

# 最後に
いかがでしたでしょうか。
一緒に仕事をするエンジニアがどういうタイプなのかは、経験を積み重ねないとわからない部分もあります。
日々の言動に加え、バグの傾向を人別に見てみるのも有効です。
（※ただし、本人に突きつけ糾弾するものではありません）
プロダクトの品質向上はもちろん、テストチームの信頼を得るために、観察眼と解析力を磨いていきたいと思います。

明日の[CYBIRDエンジニア Advent Calendar 2017](https://qiita.com/advent-calendar/2017/cybird) 8日目は、@kkakizakiが担当します。
ありがとうございました。
SublimeTextでkotlinをgradleでビルドする

[テコテックAdventCalendar2017](https://qiita.com/advent-calendar/2017/tecotec)の8日目の記事です。

kotlinかわいいですね！
[先日バージョン1.2がリリース](https://blog.jetbrains.com/jp/2017/11/29/828)され、マルチプラットフォーム対応が強化されたようです。
ますますかわいくなりますね！
そんなkotlinを手軽に実行できる環境を作成してみました！

#環境
- Windows10
- Sublime Text 3

#準備
###1. AndroidStudio3.0 のインストール
[こちら](https://developer.android.com/studio/index.html)からダウンロードしてインストールします。
AndroidStudioは3.0からkotlinがデフォルトで入るようになったので、これをインストールするだけで一通りのツールが揃います。

###2. 環境変数Pathに以下のパスを設定
AndroidStudioをデフォルトの設定でインストールすると下記の場所に必要なツールがインストールされているはず。
カスタムした場合は適宜変更してください。
 - C:\Program Files\Android\Android Studio\plugins\Kotlin\kotlinc\bin
 - C:\Program Files\Android\Android Studio\gradle\gradle-4.1\bin
 - C:\Program Files\Android\Android Studio\jre\bin

###3. SublimeTextのビルド設定ファイルの作成
kotlinソースをビルドする設定ファイルを作成します。
作成する場所は「%homepath%\AppData\Roaming\Sublime Text 3\Packages\User」になります。
(SublimeTextのメニューから[基本設定]→[Packagesフォルダ]で開くフォルダの「User」フォルダ)
開いているファイルと同じ場所にあるbuild.gradleを読み込んで実行します。

```kotlin-gradle.sublime-build
{
    "file_regex": "^(...*?):([0-9]*):?([0-9]*)",
    "selector": "source.Kotlin",
    "shell_cmd": "gradle -Pmain=\"${file_name}\""
}
```

#ビルドの実行
サンプルプログラムをビルドして動かしてみましょう。
###1. サンプルプログラムの用意
適当なディレクトリに以下の内容のファイルを作成します。

```kotlin:hello.kt
fun main(args: Array<String>) {
    System.out.println("hello kotlin!")
}
```

###2. build.gradleを用意
サンプルプログラムと同じ場所に保存します。

```gradle:build.gradle
buildscript {
  ext.kotlin_version = '1.2.0'
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
  }
}

apply plugin: 'kotlin'
apply plugin: 'application'

repositories {
  mavenCentral()
}

dependencies {
  compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}

sourceSets {
  main.java.srcDirs += './'
}

defaultTasks 'run'

run {
  if (project.hasProperty('main')) {
    main(project.main.replace(".kt", "Kt").capitalize())
  }
}
```

###3. ビルド実行
hello.ktを表示して、[ツール]→[ビルド]を選択するか Ctrl+B でビルドできます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217389/91cc51c4-c2aa-06fa-078b-1d161ea7f8fa.png)


簡単ですね！
これでいつでもkotlinを愛でることができるようになりました！
IDEやコマンドラインで作業するのもいいですが、いつも使っているエディタで確認できるのは手軽でいいですね！
Rails　ルームパス設定

現在オリジナルwebアプリを作成しています。
ヘッダー部分に(Home画面・新規登録・ログイン)
フッター部分に(Contact・About us)を追加したいです。

いじっていると以下のエラーが表示されてしまいます。
ここからルームパスの設定を行うにはどうしたら良いでしょうか？
![スクリーンショット 2017-12-04 10.48.47.png](https://qiita-image-store.s3.amazonaws.com/0/220808/475d42cd-d23c-50cd-25b9-9c1384b7c5ff.png)
mysqlにも接続できるけどAccess denied for user 'root'@'localhost' (using password: YES)で怒られる

## アクセスしているポート番号が違うか確認してみよう
localhost:3000？ 3003かもしれないよ

## .env.developmentファイル（DBパスワード記載ファイル）
パスワードはちゃんと乗っているか調べてみよう


→これでrails sからlocalhost:3003で起動できました
【Swift】警告が出た状態でiOSアプリをリリースできるかどうか

# 警告が出た状態でiOSアプリをリリースできるかどうか

開発中のiOSアプリのリリース時期が迫ってきているのに、
Xcode上の
黄色い三角の警告がなかなか消せない…。
（Xcode左側に出てくるエラーメッセージです）

この状態でも、アプリをリリースできるのか確認しました。
（ちなみに初回リリースではなく、２回目以降のリリースの場合です）

# 結果

リリースできました！

もちろん警告は早めに消した方が良いと思いますが、
リリース可能でしたという報告でした。
（2017.11現在）

# ちなみに今回エラーで出ていた内容

例えば、
「Swift Conversion Group
Conversion to Swift 4 is available」
「Validate Project Settings
Update to recommended settings」
など…

（Xcode9.1使用）
Redshift spectrumとAthenaの違いまとめ

AWSは、S3をDatalakeの位置づけにしていますが、何らかのフロントエントがないと何もできません
AWSのサービスでぱっと思い浮かぶのが、AthenaとRedshift spectrumではないでしょうか
その2つのサービスを比較してみました

## Athena
- クラスタを必要としない(A)
- クエリサービス(B)
- Amazon Athena は table に partition を設定しないと、基本的に発行するクエリーは該当の S3 Bucket のフルスキャンになってしまいます(C)

## Redshift spectrum
- 構造化データに適している(A)
- 大規模データに対して、複数クラスタで動作するため、高速なレスポンスが期待できる(A)
- 非常に大規模な多数のテーブル間で多数の結合がある、高度に構造化されたデータに対してクエリを実行する必要がある場合は、Amazon Redshift をお勧めします(B)


[(A):Amazon Redshift Spectrum 10 のベストプラクティス](https://aws.amazon.com/jp/blogs/news/10-best-practices-for-amazon-redshift-spectrum/)
[(B):よくある質問](https://aws.amazon.com/jp/athena/faqs/)
[(C):現場で運用する視点から見た Amazon Athena](https://qiita.com/moaikids/items/e91b1bcb17458d865beb)

## 所感
Athenaは、ファイルに対するフロントエンド、grepのUI的な位置付け
Redshift spectrumは、テーブルの追加手段な位置付け
Goでよりメモリ効率の高いプログラムを書く

社内でも[Go](https://golang.org/)ではやってきている気がするので、今回はそれについて小ネタでも書きます。
最近はお仕事の新しい部分やツールでGoを書く機会が少しだけ増えているので、そこでした小手先のテクニックです。

## 必要なメモリ量が見積もれる場合は、キャパシティを設定する

ごくごく基本ではあるとは思うんですが、横着で `map[string]string{}` とか書いてしまう時がけっこうあるのでコードのリファクタリング時にけっこう大事です。
[公式言語仕様](https://golang.org/ref/spec#Making_slices_maps_and_channels) を見るとsliceとmapを `make` する時に初期キャパシティやサイズが指定できるので、必要サイズが見積もれる場合には極力指定しましょう。

サンプルにするとこんな感じです(`map` を `make` するときに第2引数を指定しています):

```go
package main

import "fmt"

type element struct {
  key, value string
}

func slice2map(ary []element) map[string]string {
  ret := make(map[string]string, len(ary))
  for _, v := range ary {
    ret[v.key] = v.value
  }
  return ret
}

func main() {
  ary := []element{
    element{key: "test", value: "test_value"},
    element{key: "test2", value: "test2_value"},
  }
  fmt.Println(slice2map(ary))
}
```

## オブジェクトを極力お外に出さない

実際にメモリプロファイラとかで計測してからなのですが、長期稼働するプログラムだとけっこう大事な気がします。

スタック上にオブジェクトを置ける言語だと基本なんですが、スクリプト言語さわっていると忘れがちです。
[公式のFAQ](https://golang.org/doc/faq#stack_or_heap)を読むと、外に参照が出なければ、極力スタック上に確保する旨があります。

なので、関数が少し長くなっても、一時オブジェクトになってしまう場合は関数を分割しない方がよさそうです。
ただ、初期化関数は長くなりがちでかつ一度確保してしまえば後はGCされるだけなのでこの限りではないです。
ループ内でメモリ確保する場合は注意といった程度でしょうか。

そして、おそらく外に参照が出るといったケースで見落としそうなのが、ポインタ渡しされた構造体などの参照を書き換えた場合などです。
短期的に寿命を迎える場合は、極力関数内で終えられるように設計を変えるのを検討した方がいいかと思います。

## 素の構造体渡しを極力減らす

引数や戻り値型に `*` を追加していくだけの簡単な変更です。

ただ、参照透過性の観点からは、正直あんまり好きではないのですが、ポインタなら一度確保してしまえばコピーが発生しないようです。
ここらへんは、あまり言語仕様に詳しくない上に恐らく実装依存な部分も多そうなのでもっと調査したいところです。

注意するべきなのは、ポインタ渡しなので渡した構造体を変更されるとバグを起こしやすくなります。
なので、一度確保したら極力変更しないことです。自分の足を撃ってはいけません。
C++やRustだとここらへんはよく考えられていて、 `const` 修飾子などで変更ができない参照渡しにできたりします。

## まとめ

Goでメモリチューニングをするといっても、結局GoなのでGCあったりなどの限界があって難しいので、更に省メモリ性能がほしい場合はRustやC++に書き換えるのを検討するべきかと思います。
（というか、実際に長期稼働するツールの省メモリ化などをしてみて、難しさをとても感じました。）
やはり、適材適所というのはいい言葉です。
Goのいいところは動的型付けなスクリプト言語からの手軽な移行なので、それ以上を求めるならやはり相応の言語でやるべきですね。
rspecでテスト環境以外の環境を想定したテストの書き方

```rb

def env_in_jp
 return '本番環境' if Rails.env.production?
end
```

```rb
describe '環境別に処理を変える' do
  it '本番環境' do
    allow(Rails).to receive(:env).and_return('production'.inquiry)
    expect(Rails.env.production?).to eq true
    expect(env_in_jp).to eq '本番環境'
  end

  it '開発環境' do
   allow(Rails).to receive(:env).and_return('development'.inquiry)
   expect(Rails.env.development?).to eq true
   expect(env_in_jp).to eq nil
  end
end
```
eslint-plugin-vue を作っている話

4日朝に [Vue.js #1](https://qiita.com/advent-calendar/2017/vue) アドベント カレンダーを見たら3日のぶんが空いていたので急遽書きました。

私は `.vue` ファイルを静的検証するための ESLint Plugin を開発しています。

- [eslint-plugin-vue](https://github.com/vuejs/eslint-plugin-vue)
- ( ESLint についてはこちら: [ESLint 最初の一歩](https://qiita.com/mysticatea/items/f523dab04a25f617c87d) )

このプラグインを使うと、`.vue`ファイルのテンプレート部分について、リアルタイムで構文エラーを検出したり、`v-bind` 等のディレクティブの使い方が間違っていたときに指摘してくれたりします。また、[公式の Vue.js スタイルガイド](https://jp.vuejs.org/v2/style-guide/index.html) に沿うように自動成形することもできます。

## 🏃 試してみる

`eslint-plugin-vue` を簡単に試してみるために、オンライン デモがあります (1度アクセスすれば、以後はオフラインでも使えます)。ここでコードを入力して、どのようなエラーが出るのか、どのように自動修正が働くのかを確認することができます。

- https://mysticatea.github.io/vue-eslint-demo/

> このオンライン デモ自体も、もちろん Vue.js で作られています 😉

## 💿 インストール

[npm](https://www.npmjs.com/) を利用してインストールします。

```bash
$ npm install --save-dev eslint eslint-plugin-vue
```

## 📖 使い方

> https://github.com/vuejs/eslint-plugin-vue#readme

他の ESLint Plugin と同様に、ESLint の設定ファイルを書いて使います。例えばこんな感じ。

```json:.eslintrc.json
{
    "extends": [
        "eslint:recommended",
        "plugin:vue/recommended"
    ],
    "rules": {
        "semi": "error",
        "indent": ["error", 2],
        "quotes": ["error", "single"]
    }
}
```

そして、Glob パターンで対象ファイルを指定します。

```bash
$ ./node_modules/.bin/eslint "src/**/*.{js,vue}"
```

### Visual Studio Code で使う

Visual Studio Code には [Vetur](https://marketplace.visualstudio.com/items?itemName=octref.vetur) という Vue.js のための優れた拡張機能があるので、利用している方も多いのではないでしょうか。
Visual Studio Code で、`.vue` ファイルに ESLint 静的検証を行うには、少し追加の設定が必要です。

1. [VSCode ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) 拡張機能をインストールする
2. ユーザー設定を開き、`.vue`ファイルで `VSCode ESLint` 拡張機能が動作するよう設定する

```json:settings.json
{
    "eslint.validate": [
        "javascript",
        {"autoFix": true, "language": "vue"}
    ]
}
```

## 🍻 貢献する

`eslint-plugin-vue` はまだまだ開発途上でして、一緒に開発してくれる仲間を募集しています。
[Issues](https://github.com/vuejs/eslint-plugin-vue/issues) を見て、実装できそうなルールを作って頂ければ嬉しいです。

以上。
delayed_jobとsidekiq/resque

# はじめに
[Advent Calendar](https://qiita.com/advent-calendar/2017/globis)4日目ということで技術情報を書きますが、今回はRailsにおける非同期処理のバックエンドで使うadapterについて簡単に記載します。([RailsのActive Jobについて](https://railsguides.jp/active_job_basics.html#%E3%82%B8%E3%83%A7%E3%83%96%E3%82%92%E3%82%AD%E3%83%A5%E3%83%BC%E3%81%AB%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B))

# 非同期処理とadapter
処理が重たくなる場合やメール送信を使う場合など非同期処理を使用しているかと思います。一旦処理を非同期処理実行用のキューに詰め込み、非同期処理の結果を後で通知することで、アクション時の処理が軽くなりエンドユーザにストレスを与えないようにします。
皆さんはdelayed_jobを使ったことがありますか？便利でしたよね？
今でも便利なのは変わらないのですが、よく使用されるadapter(有名なところ)としてはsidekiqやresqueという選択肢もあります。

# adapterの違い
sidekiqとresqueの違いは以下の記事で記載されていますのでご参照ください。
https://qiita.com/zaru/items/8385fdddbd1be25fe370

<img width="897" alt="スクリーンショット 2017-12-04 10.42.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/215131/9b487c66-8787-feb4-401d-7de70696fe1a.png">
https://github.com/mperham/sidekiq#performance

delayed_jobがsidekiq、resqueと違う大きな点はRedisを使用しない点になります。delayed_jobはActiveRecordを使用していてキュー管理用にテーブルを作成しています。
delayed_jobを使う場合、

* メリット・・・Redisを使用していない場合、インストールが不要。
* デメリット・・・Redisの方が早い。アクセスが多く非同期処理を多用する場合、遅延が発生する。

といった特徴があります。またworkerを増やしてもActiveRecord部分でテーブルロックをするのでボトルネックになることがあります。

```ruby:base.rb
def reserve(worker, max_run_time = Worker.max_run_time)
  # We get up to 5 jobs from the db. In case we cannot get exclusive access to a job we try the next.
  # this leads to a more even distribution of jobs across the worker processes
  find_available(worker.name, worker.read_ahead, max_run_time).detect do |job|
    job.lock_exclusively!(max_run_time, worker.name)
  end
end
```

```ruby
def lock_exclusively!(max_run_time, worker)
  now = self.class.db_time_now
  affected_rows = if locked_by != worker
    # We don't own this job so we will update the locked_by name and the locked_at
    self.class.update_all(["locked_at = ?, locked_by = ?", now, worker], ["id = ? and (locked_at is null or locked_at < ?) and (run_at <= ?)", id, (now - max_run_time.to_i), now])
  else
    # We already own this job, this may happen if the job queue crashes.
    # Simply resume and update the locked_at
    self.class.update_all(["locked_at = ?", now], ["id = ? and locked_by = ?", id, worker])
  end
  if affected_rows == 1
    self.locked_at = now
    self.locked_by = worker
    self.locked_at_will_change!
    self.locked_by_will_change!
    return true
  else
    return false
  end
end
```

# 所感
Redisを使用していたり、アクセスが多くなって来た場合は、sidekiq、resqueをadapterに使用する感じかなと思います。
delayed_jobを使うのはダメというわけではないですが、KVSであるRedisを使用しているadapterを選択した方が良いかなというのと、実行時はロックする処理が走るので多用するのは控えた方が良いかと思います。アクセス数が増えたり、規模が大きくなってくるとパフォーマンスを意識してRedisを使用する機会が増えると思いますので、delayed_jobを使用するなら小規模アプリケーションになるかなと考えています。

#補足
同じようなことがresqueのREADMEに書いてますね。。
Resque VS DelayedJob !!?
https://github.com/resque/resque#resque-vs-delayedjob
迷路


scipyの出番.

```py
#!/usr/bin/env python
#https://qiita.com/Nabetani/items/7baf181b4a1b7eacc79a
#http://nabetani.sakura.ne.jp/hena/orde20maze/
from scipy.sparse import *
t='01 23 34 45 06 17 39 5B 78 89 9A 6C 9F CD FG CI EK GM HN JK KL LM IO JP MS NT PQ QR ST PV RX SY UV VW YZ'
T=tuple(zip(*[[int(c,36) for c in e] for e in t.split()]))

import sys
while True:
	l=sys.stdin.readline()
	if not l: break
	line=[int(c,36) for c in l.strip()]
	a=list(map(int,csgraph.dijkstra(csr_matrix(([1]*len(T[0]),T),[36]*2),0,line[0])))
	print(a[line[1]])
	sys.stdout.flush()
```
のんびり座りたい strikes back


seqをハードコードしてるけどいいですよねきっと

```rb
#!/usr/bin/env ruby
#https://qiita.com/Nabetani/items/de5b9d3230603033ed74
#http://nabetani.sakura.ne.jp/hena/ordf07chairs/
STDOUT.sync=true
while gets
	a=$_.chomp
	chairs=Array.new(9)
	list={}
	a.chars{|e|
		if ('a'..'z').include?(e)
			chairs[list[e.upcase]]=nil
			list.delete(e.upcase)
		else
			seq=[0,8,1,7,2,6,3,5,4]
			seq.reverse! if e>='N'
			x=seq.map.with_index{|i,j|
				if chairs[i]
					[999,j,i]
				else
					[(chairs[(i-1)%9]?0:-1)+(chairs[(i+1)%9]?0:-1),j,i]
				end
			}.min
			chairs[x.last]=e
			list[e]=x.last
		end
	}
	puts chairs.map{|e|e ? e : '-'}*''
end
```
aliyuncli で ECS インスタンス情報取得

[aliyuncli](https://github.com/aliyun/aliyun-cli)を使ってECSインスタンスの情報を取得してみる。

```
aliyuncli ecs DescribeInstances | jq ".Instances.Instance[] | \
 {name: .InstanceName, region: .RegionId, family: .InstanceTypeFamily, \
  cpu: .Cpu, memory: .Memory, public_ip: .PublicIpAddress.IpAddress[0], \
  private_ip: .VpcAttributes.PrivateIpAddress.IpAddress[0] }"
```
実行結果

```
{
  "name": "ubuntu16.04",
  "region": "ap-northeast-1",
  "family": "ecs.n4",
  "cpu": 2,
  "memory": 4096,
  "public_ip": "47.74.4.203",
  "private_ip": "172.24.119.233"
}
{
  "name": "centos7",
  "region": "ap-northeast-1",
  "family": "ecs.n4",
  "cpu": 2,
  "memory": 4096,
  "public_ip": "47.74.36.146",
  "private_ip": "172.24.119.232"
}
```
Dockerレジストリにあるイメージのタグ一覧を表示する

## ステップ1. lstagsをインストールする

https://github.com/ivanilves/lstags/releases

## ステップ2. 実行する

```
lstags nginx
ANALYZE nginx
FETCHED nginx
-
<STATE>      <DIGEST>                                      <(local) ID>    <Created At>              <TAG>
ABSENT       sha256:7fbe0579e123f3d2b29c9159e9a80547f      n/a             2014-07-21T18:22:18       nginx:1.7.1
ABSENT       sha256:ee3c84e89dee65ed8899160f9f8da32fc      n/a             2014-09-27T10:05:24       nginx:1.7.5
ABSENT       sha256:351b7d7b57b14c48be921855aa282b74a      n/a             2014-10-24T08:25:26       nginx:1.7.6
ABSENT       sha256:e2b6a316056d26eb1b51f7a659adbd4fe      n/a             2014-12-02T14:08:14       nginx:1.7.7
ABSENT       sha256:2c390758c6a4660d93467ce5e70e8d08d      n/a             2014-12-03T07:24:28       nginx:1.7.8
ABSENT       sha256:e3456c851a152494c3e4ff5fcc26f2402      n/a             2015-01-28T03:43:46       nginx:1.7.9
ABSENT       sha256:6fe2d0cb24dcb158dbdbff2949933ff6b      n/a             2015-03-20T09:24:09       nginx:1.7.10
ABSENT       sha256:e2d8b178bf03f86c64993a7f2beb3e5db      n/a             2015-03-31T05:18:49       nginx:1.7.11
ABSENT       sha256:02537b932a849103ab21c75fac25c0de6      n/a             2015-04-22T14:47:34       nginx:1.7
ABSENT       sha256:4ac326b45524ed59ab7a4d48af24b72e5      n/a             2015-04-22T14:47:34       nginx:1.7.12
ABSENT       sha256:4157ed7179858886f21024583247a875b      n/a             2015-05-25T14:29:55       nginx:1.9.0
ABSENT       sha256:2f68b99bc0d6d25d0c56876b924ec2041      n/a             2015-06-14T01:24:46       nginx:1.9.1
ABSENT       sha256:7ffb2ccf2de82b0afeee46ae9d7542e96      n/a             2015-07-14T09:04:53       nginx:1.9.2
ABSENT       sha256:4b167dfe9ade31f156f8adbbd0ec4ce79      n/a             2015-07-18T09:20:49       nginx:1.9.3
ABSENT       sha256:de5db7aaa5b02492094b71e4db7d0b177      n/a             2015-09-10T08:19:26       nginx:1.9.4
```
JavaScriptで、変数の値がどれかに一致すればtrueになる式の書き方

## `===`と`||`を使ったオーソドックスな書き方

```js
const x = 'banana';
console.log(x === 'apple' || x === 'banana' || x === 'orange'); // => true
```

## ES2016の[`Array.prototype.includes()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes)を使った書き方

```js
const x = 'banana';
console.log(['apple', 'banana', 'orange'].includes(x)); // => true
```
nim入門

今回はマイナー言語nimについて扱おうと思います。~~ユーザーが少ないせいで、記事が少ないので書きました。~~
さて、nimという言語がどういうものだか知っている人はいますか？おそらく知らない人のほうが多いんじゃないでしょうか？nimは一言で言えばインタープリンタ型言語っぽくかけるコンパイラ型言語です。
簡単にそれを説明します
## main関数のいらないコンパイラ型言語
C++, Java, C#など、おそらく皆さんの知っているコンパイラ型言語のほとんどはmain関数を必要とするものが多いと思います。しかし、nimは多くのインタープリンタ型言語と同じでmain関数を必要としません。そのため個人的には書き方が多くのインタープリンタと似ていると個人的には思いました。
## installation
ubuntuなら
```
sudo apt-get install nim
```
OS Xなら
```
brew install nim
```
でインストールできます。

## hello world
``` hello_world.nim
echo "hello world"
```
これは簡単ですね。``` nim compile hello_world.nim```でコンパイルすることができます。
同時に実行もさせたい場合は```--run```というオプションをつけるだけです。

# int (整数）型
``` int.nim
import math

var x, y : int
x = 2
y = 3
echo x + y # 足し算
echo x - y # 引き算
echo x * y # 掛け算
echo x / y # 割り算
echo x div y # 割り算の商
echo x mod y # 割り算のあまり
echo x ^ y # べき乗
echo x and y # 論理和
echo x or y # 論理積
echo x xor y # 排他的論理和
echo (not x) # ビット反転
echo x shl y # 左シフト
echo x shr y # 右シフト
echo int("100") # 文字列から数値への変換
echo int("hello world"[0]) # ascii codeの取得
```

## 文字列型
```string.nim
import strutils
echo "hello world     ".strip() # 先頭と終わりの半角空白を取り除く
echo "hello world".len() # 文字列の長さ
echo "hello world".split(' ') # 文字列を空白で分割
echo(@["hello", "world"].join(" ")) # 文字列連結
echo "hello world"[0] # ｎ番目の文字
echo "hello world"[2..7] # 部分文字列
echo "hello world".repalce("hello", "hola") # 文字列置換
echo "$1 eats $2." % ["The cat", "fish"]
echo "hello " & "world" # 文字列連結
```

## Sequence(配列その２)
多分これって動的配列のことですかね

``` sequence.nim
import sequtils
var a : seq[int]
echo concat(@[3, 5, 7], @[9, 11, 13], @[15, 17, 19, 21]) 
# 配列の結合 可変長引数なので引数の数はいくつでもいい
echo(@[1, 2, 3].map(proc(x: int): int = 2 * x) 
# map関数も実装されている ここではすべての要素を２倍にしている
echo(@[1, 2, 3, 4, 5, 6, 7].filter(proc(x: int): bool = x mod 2 == 0) 
# 偶数だけを取り出すフィルター

```

## 関数（？）をつかったhello world
``` function.nim
proc hello_world() = echo "hello world" # ここでは返り値、引数ともにvoid
hello_world()

proc hello_world2(str : string) : string = str # 引数、返り値ともにstring
echo hello_world2("hello world")

proc hello_world3(a : string; b : string) = echo a & " " & b # 引数が２つで両方ともstring, 返り値がvoid
hello_world3("hello", "world")

proc hello_world4(a : string; b : string) =
     echo a
     echo " "
     echo b
     # 関数の終わりはインデントで管理
hellow_world4("hello", "world")

proc hello_world5() : string = 
      echo "hello"
      echo "world" 
      "hello world" # 最後に評価された式がそのまま返り値になる。
echo hello_world5() # hello worldと表示される
```
【Unity】Unity エディタのデザインを変更することができる「Zios Themes」紹介

![20171021162214.png](https://qiita-image-store.s3.amazonaws.com/0/39164/2f023fab-e797-4613-72d5-f1153079327d.png)

# 備考

この投稿は自分のブログの記事の転載になります
http://baba-s.hatenablog.com/entry/2017/10/23/093500

# はじめに

https://github.com/zios/unity-themes

Unity はデフォルトでは2種類のスキンしか選択できないですが、
上記の「Zios Themes」を Unity プロジェクトに追加することで
Unity エディタのデザインを変更できるようになります

# サンプル

![20171021162523.png](https://qiita-image-store.s3.amazonaws.com/0/39164/630c54b5-75c8-97c1-1697-497cedea20cc.png)

![20171021162538.png](https://qiita-image-store.s3.amazonaws.com/0/39164/1dea0357-fc92-c092-cee1-dbef97e95eca.png)

![20171021160339.png](https://qiita-image-store.s3.amazonaws.com/0/39164/b1f9ebd4-88ab-9a23-9823-d12c6e40b819.png)

![20171021160252.png](https://qiita-image-store.s3.amazonaws.com/0/39164/4ae6b109-2cc8-a3e9-9e70-15f93df4974c.png)

![20171021160305.png](https://qiita-image-store.s3.amazonaws.com/0/39164/a61cd54a-586a-1c6a-70d3-8c67b1abb530.png)

![20171021160314.png](https://qiita-image-store.s3.amazonaws.com/0/39164/64df72f4-3fce-a76a-6286-3efb902046c0.png)

![20171021162718.png](https://qiita-image-store.s3.amazonaws.com/0/39164/937206b9-5992-08b5-6c0a-328168cbe8c1.png)

![20171021160324.png](https://qiita-image-store.s3.amazonaws.com/0/39164/dc5da686-5111-808c-4b8d-1e86807ec7f6.png)

![20171021160331.png](https://qiita-image-store.s3.amazonaws.com/0/39164/a5546f18-d3cb-6b7b-2073-e041d9dc9cb9.png)

# 検証環境

- Unity 2017.1.1f1

# 導入方法

1. 下記の URL を開きます  
https://github.com/zios/unity-themes/releases
2. 使用している Unity のバージョンに合う .zip を選択します  
（ここでは「Zios.Themes.r573.Windows.560.zip」を使用していきます）
3. ダウンロードした「Zios.Themes.r573.Windows.560.zip」を展開します
4. 「@Themes」フォルダを、Unity プロジェクトの Assets フォルダ以下にコピーします

# 設定方法

1. Unity メニューの「Edit>Preferences...」を選択します  
　  
![20171021150859.png](https://qiita-image-store.s3.amazonaws.com/0/39164/5293b5da-dd22-3a26-ef72-51ec48990477.png)  
　  
2. 「Themes」を選択してプルダウンメニューからテーマを選択します  
　  
![20171021160726.png](https://qiita-image-store.s3.amazonaws.com/0/39164/e5af5003-b9ba-3b89-d6ae-2817c9dce2a9.png)  


# 設定の種類

色以外にも、アイコンやフォントも変更できます

![20171021161243.png](https://qiita-image-store.s3.amazonaws.com/0/39164/6d0b30c6-1d09-6c67-3a9c-4b3435bc9699.png)

![20171021161250.png](https://qiita-image-store.s3.amazonaws.com/0/39164/354307eb-e42a-fbd1-0381-6c6b1751f9bd.png)

![20171021161305.png](https://qiita-image-store.s3.amazonaws.com/0/39164/6c036e60-34cb-578e-0400-2bd0cdfbb83a.png)
スタンドアロン版なんて用意されていないんだから観念して Application Verifier を使うときは Windows SDK から入れなさいという話。

# Application Verifier とは
Application Verifier はメモリリークにつながる動作とか見つけたらそこでアプリケーションを停止させたりしてくれる素晴らしいツールである。
VisualStudio に標準で入っていたりしたこともありました。

## で、何があったし。
ApplicationVerifier のスタンドアローン探してたらこういうのがあった
[Windows SDK ツール:Application Verifier のご紹介](https://blogs.msdn.microsoft.com/japan_platform_sdkwindows_sdk_support_team_blog/2011/05/29/windows-sdk-application-verifier/)
で、中のリンクを辿ると
[ソフトウェア開発ライフサイクル内で Application Verifier を使用する](https://msdn.microsoft.com/ja-jp/library/aa480483.aspx)
みたいなページがあり、ダウンロード先が軒並み死んでたりして見つからないので、
[application verifier download](https://www.google.co.jp/search?ei=fJkkWsHaPMW40gTQ1KvoCw&q=application+verifier+download&oq=application+verifier+download) みたいな検索ワードで検索して
[Application Verifier](https://msdn.microsoft.com/ja-jp/library/dd371695(v=vs.85).aspx) みたいなページに行き当たって
[Microsoft Application Verifier ](https://www.microsoft.com/en-us/download/details.aspx?id=20028)（★１） からダウンロードしようとするのだが、よく見てほしい。
[Microsoft Visual Studio 2008 および .NET Framework 3.5 用](https://msdn.microsoft.com/en-us/library/ms220948.aspx)
のリンクは死んでいるのだ。
また、リンクの下には次の様な一文がある。

> 注: VS に同梱されている Application Verifier は古いバージョンです。できる限り、スタンドアロン パッケージを使用してください。このため、今後のバージョンの VS には AV が組み込まれなくなります。

で、★１のリンクよりダウンロードしたとしよう。
するとどうだろう。インストールして起動すると Application Verifier 4が起動する。
![application verifier 4 のウィンドウ画像](https://qiita-image-store.s3.amazonaws.com/0/32143/c831a06e-cb1c-868f-2e63-3e7b309a03ee.png)

##で、何が問題なの？
実はこのバージョン、WPFが初期状態で引っかかるのである。
具体的にはBasic-Lock を外せば問題ないのだが、そもそも初期状態でひっかかるのでいろいろと問題があるのである。
つまりバージョンが古いのである。

##で、どうすりゃえーの？
わかりにくいかもしれないが。最新の WindowsSDK入れれば入ってきます。
うちだと Application Verifier 10 が入っています。
![application verifier 10のウインドウ画像](https://qiita-image-store.s3.amazonaws.com/0/32143/ae121204-c23b-7fc0-cd74-44841147a718.png)
そもそも画面構成違うとか新しい機能があるとか、 アプリケーションを登録したら Basic-Input/Outputがなくなってるとかいろいろと違いはありますが、これならWPFも初期状態でひっからなくなっています。

##いや、その前にさ。
文章は最新のもの探そうって話ではある。最新の文章は現在(2017/12/04現在)では次のものが最新の文書である。
[Application Verifier](https://docs.microsoft.com/ja-jp/windows-hardware/drivers/debugger/application-verifier)
更新日は‎2017‎年‎05‎月‎23‎日……うん、新しい。
そこによると

> Application Verifier is not included in Debugging Tools for Windows. Application Verifier is included in the Windows Software Development Kit (SDK). You can find information about downloading and installing the Windows SDK here. After you install the Windows SDK, Appverif.exe and Appverif.chm will be in Windows\System32. To start Application Verifier, open a Command Prompt window and enter appverif.

つまり、 WindowsSDK に入ってるからそれ使えってことみたい。
まぁ、やり方が変わるのはよくあるけれど、その最新文書を探すのが面倒臭いことってよくあって（白目）
文献が古いときはは最新のも一緒に探したほうがいいです。
今現在だと docs.microsoft.com が最新の文書持ってるはずなので、一度は見たほうがいいです。

##で、何があったの？
原因不明のエラーを延々と追いかけてて、WPF初期サンプルでエラーになるってことに気づいて……うん。そういうことだ。（白目）

以上となります。なんか変なこと言ってたら指摘していただけると有難いです。
僕なりの開発環境2017 for macOS

<img src="https://qiita-image-store.s3.amazonaws.com/0/8292/ef5f6cbc-0702-1c98-580f-786429f835e5.gif">
このエントリーは[アラタナAdventカレンダー](https://qiita.com/advent-calendar/2017/aratana)５日目のエントリーです。

みなさま、はじめまして！
弊社サービスカゴラボのカスタマイズを担当しております、新卒2年目の蔭山と申します。
アドベントカレンダー・Qiita共に初投稿になりますが、宜しくお願いいたします。

前日は@aratana_ogawaさんの[東京から宮崎に移住したエンジニアが感じたことを語る](https://24h.aratana.jp/?p=26846)というエントリでした。

さて、アドベントカレンダーも5日目となりました。
社会人２年目となって、開発マシンをWindowsからmacOSへ~~わがままで~~変えてもらい、
（ほぼ）初めてのmacOSということもあり自分にとって使いやすい環境を構築するのにかなり苦労しました。。。

マシンを買い替えて頂いた際により多くの納品（目標：3.5倍納品!w）を命じられた僕が、
より開発を加速化するための環境を構築する際にこだわったポイントなどをつらつらと書いていきたいと思います。


※独断と偏見がかなり入っております。。。。ご注意ください。

#CLI編
やっぱりmacOSを使うなら黒い画面を使いこなさなきゃ☆
といった感じで使い始めました。
##Homebrew
とりあえずmac使うならまずは入れとけと同僚に言われました。www
大概のものはこれでインストールできます。
むしろ僕としてはこれがないと困ります。w
##node.js
最近のフロントエンドエンジニアのマストアイテム。
これがないと開発が進まないことも多々あります。w
業務外では一番お世話になっています。
##PHP
カゴラボ（EC-CUBE）はPHPで動いており、ちょっとしたPHPの挙動確認とかで使います。
（書いた後に気づきましたがmacOSに標準で搭載されていますね。。。w）
##Composer
PHPの依存性管理ツールですね。
僕はphpmd、phpcsなどを利用する際に使用しています。
##Git
名高いバージョン管理ツール。
僕はmacOSに変えてから、GUI（SourceTree）は使わずにCLIで使用するようになりました。
##dotfiles
黒い画面初心者ですので、やっぱり見た目から入ろうということで。w
公開されている下のdotfilesを使いました。
https://github.com/mathiasbynens/dotfiles
インストール手順がすごく簡単。
なおかつ無機質なターミナルに程よく装飾してくれるのが推しポイント。
##VirtualBox
カゴラボでの開発を進める際に使っています。
基本はLAPP環境です。
##docker
最近よく聞くやつですw
wordpressの開発を進める際に利用しています。
#GUI編
##ブラウザ（Safari・FireFox・GoogleChrome）
WEBに関わる業務ですので、むしろこれがないと困りますねw
ちなみにメインで使っているのはGoogleChromeです。
##PhpStorm
メインのIDE。これがなければソース書けないぐらい依存していますw
有料でいいお値段します。（気兼ねなく買って頂いている会社に感謝ですね！）
差分エディタとしてもかなり優秀で、macOSに変えてから愛用しています。
(Windowsの頃はWinMerge使っていました。あの子はすごい。w）
##Visual Studio Code
ちょろっとしたコードを書いたり、サーバーからlogを落として調査する際などに使用しています。
Windows時代から見慣れているメイリオフォントもGood!
(なぜか僕の端末だとAtomがフリーズすることが多々あるんですよね、、、なんでだろ。)
##Atom
Atomパッケージ「[tablr](https://atom.io/packages/tablr)」を入れて、主にCSVデータの閲覧時などに使用しています。
Windows時代にはCassava Editorを使っていました。
Cassava Editorみたいな使い心地のCSVエディターを探していたのですが、これが一番使いやすかったです。マカーの方にオヌヌメ。
##PhotoShop
弊社ではデザインデータをPhotoShopで管理しているため、必需品です。
Slackのカスタムアイコン作成時などにも使います。w
##Slack
みなさんご存知チャットサービス。
大量のカスタムアイコンを作ったり、くだらないBotを作ったりしています。
個人的にはどのSNSよりも依存度高めなチャットサービスですwww
##Spark
メーラーです。
同僚からのおすすめで使い始めました。
見た目が綺麗かつ直感的に操作できるのが素敵。
#最後に
長々と書いてしまいましたが、今年で整備できた（？）環境は以上になります。
来年にはもっとパワーアップできていることでしょう！
（´-`）.｡oO（来年はもっと開発環境について詳しく語れるといいなぁ。。。）

明日（6日目）の[アラタナAdventカレンダー](https://qiita.com/advent-calendar/2017/aratana)のエントリは@YasuhiroKimesawaさんのエントリーです！お楽しみに！
はじめてドメイン駆動設計をしてみて感じたこと

この記事は[CrowdWorks Advent Calendar 2017](https://qiita.com/advent-calendar/2017/crowdworks)の4日目の記事です。

## はじめに
今年CrowdWorksにエンジニアとして新卒入社した@kinakoboです。CrowdWorksでは10月から新たな試みとしてドメイン駆動設計（DDD）を実践しています。
DDDを実践するに至った経緯は、サービスの規模拡大に伴いアプリが肥大化し、技術的負債が増えてきたことで、機能追加をスピーディーに進めづらくなってきたからです。
今回実装しようとしている機能を今まで通りRuby on Railsを利用して実装することは可能ですが、変更に強い柔軟なサービスにするためにもDDD+Scalaで実装し始めています。

DDD未経験の状態から2ヶ月実践してみて、まだ道半ばですが感じたことを書きます。同じような課題感を持っている方の参考になれば幸いです。

## エヴァンス本に挫折したら･･･
DDDと言えば、入門するためにあの分厚い[エリック・エヴァンスのドメイン駆動設計](http://www.shoeisha.co.jp/book/detail/9784798121963)や[実践ドメイン駆動設計](http://www.shoeisha.co.jp/book/detail/9784798131610)を読む必要があるというイメージでしたが、自分は書いてあることのイメージが掴めず、すぐに挫折してしまいました。
思えば、あやふやな設計の知識しか持っていなかったので、まずは設計やDDDの全体像を把握しようということで、以下の書籍と記事を読みました。

- __[現場で役立つシステム設計の原則](http://gihyo.jp/book/2017/978-4-7741-9087-7)__
    - 設計の考え方や方法を知る
    - 書いてあることを実践すると、オブジェクト指向が身につく

- __[DDD超入門(後編) - Domain-Driven Designの適用Step](http://enterprisegeeks.hatenablog.com/entry/2016/07/25/081127)__
    - DDDの基本構成要素を知る

これらを読んでからだと、前述の本に書いてあることのイメージがつきやすくなり、読みやすくなったと感じました。

## ドメインモデルの設計は何度も変更・改善する
初期のモデル設計では、決まっていない仕様や見えていない業務知識が多く、完璧なドメインモデルを設計することはできないです。
業務知識が深まったり、今より適切な設計を見つけるたびにどんどんモデルを変えていく必要があるので、変更しやすいコードにしておくと積極的に変更することができて良いです。

変更しやすくするためには、静的型付け言語を使ってオブジェクト指向で書くことである程度担保されると思いました。
これは自分が今まで動的型付け言語であるRubyを書いていたので、今回静的型付け言語であるScalaで書いてみて、型があると単純なエラーの混入を防げるので、楽に安全に変更が行なえると思ったからです。
オブジェクト指向で書く理由は、そのままですがオブジェクト同士の依存関係を管理しないと変更が困難になってしまうからです。

## ドメインモデルの全体像を見渡す
ドメインモデルの設計が大きくなってくると、その時はよかれと思ってドメインモデルを追加していても、後々全体像を見ていると「あれ、ここ変だね」と気づくことが何度かありました。
全体像を見渡すためにも、ドメインモデルを図に起こしていると把握しやすいです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/105475/b09b765a-794d-f0df-b66a-615919329404.jpeg" width=50%>


都合によりモザイクをかけていますが、このようにホワイトボードシートに付箋とペンで雑に書いていました。これを見て修正に繋がった例としては、Entity同士の関連を作らず値をマッピングすれば済む箇所があった、ValueオブジェクトにできるものをEntityにしてしまっていた等がありました。
設計が進むに連れオブジェクトの数が増えてホワイトボードシートで管理しづらくなったため、今は[draw.io](https://www.draw.io/)にデジタル化しています。

## 開発者だけで進めない
DDDは本来、ドメインエキスパートと呼ばれる業務知識のエキスパートと開発者で行いますが、今回は業務仕様が決まっていない0からのスタートで、ドメインエキスパートは存在しませんでした。そのため、開発者が業務知識のエキスパートになっていく必要がありました。
しかし、開発者だけでDDDを進めていると、どうしてもユビキタス言語や業務フローが開発者の知識に寄っていき、利用者側での目線が薄れていました。

そのことに気づいたのは、デザイナーと連携して画面仕様を考えたときでした。デザイナーの気づきにより、開発者の間で使っていたユビキタス言語を利用者にとってもわかりやすい言葉に言い換えたり、画面遷移図を元に業務フローに改善の余地があることに気づけました。

ドメインエキスパート不在でDDDを行う場合は、デザイナーに限らず利用者目線で考える事に長けた人を巻き込んでおくべきだと思いました。

## 迷ったら先人の知恵を借りる
当たり前ですが、設計に迷ったらDDD経験者に聞いてみたり、類似サービスを参考にしてみるとヒントが得られたりします。
例えば、商品を購入できるサービスを作るときは [amazon](https://www.amazon.co.jp/) を参考にしてみると、注文時に注文明細が発行され、商品が出荷される直前に購入明細が発行されていて、それぞれどんな値を持っているのかといったことがわかります。

## 最後に
個人的にDDDはとっつきにくいイメージでしたが、やってみると意外とそんなことはなく、やればやるほど良い設計に近づいていくので、やりがいがあり楽しいです。
数年後に新たに加わった人が手を加えることになっても、仕様を把握しやすく変更しやすいサービスになっていることを目指し、今後もDDDを追求していきたいと思います。
まだまだ自分のDDDに対する理解は浅いものなので、また理解が深まったら記事にして発信したいと思います。
Prometheus のアラートを Sentry で管理する

Z Lab では様々なシステムの監視に [Prometheus](https://prometheus.io/) を使用しています。Prometheus からのアラート通知には [Alertmanager](https://github.com/prometheus/alertmanager) を使用していますが、障害対応などをしていくうちに、チーム内で以下のような不満が出てきました。

- アラートの履歴が時間が経つとで消えてしまい、何が起きていたのか分かりにくい
- どのアラートが多く発生しているかなどの集計がしにくい
- アラートの情報をもとに GitHub に Issue を簡単に作成したい

そこで、Alertmanager の機能についてもう少し詳しく調べてみたところ、そもそも Alertmanager はアラートの通知に特化した設計になっており、永続的にアラートの情報を管理する場合は、Webhook による通知機能を利用して別のシステムにアラート情報を転送して管理するのが良いことが分かりました。

新たにアラート情報を収集して管理するシステムを作ることも検討しましたが、あまりそこにコストをかけたくなかったため、以前から使ってみたいと思っていた [Sentry](https://sentry.io) に Prometheus のアラートを転送して管理してみることにしました。

## Sentry とは？

[Sentry](https://sentry.io) はモバイルアプリケーションのクラッシュや Rails などのエラーログといったイベントを収集して、閲覧や管理ができるサービスです。様々なプログラミング言語用にライブラリが提供されており、簡単にイベントの収集機能を組み込むことができます。

Sentry でアラートを管理することは、サービスの本来の用途に適していないように見えるかもしれませんが、以下のようなポイントが今回の要件にマッチしていたので、ひとまずやってみることにします。

- イベントを時系列で管理できる
- イベントに付与したタグで柔軟に集計ができる
- Issue Tracker との連携が充実しており、Issue の作成などができる
- ライブラリが充実しており、アラートを Sentry に転送する仕組みの実装が容易
- Sentry 自体が OSS で公開されており、オンプレミス環境での運用も可能

## alertmanager-sentry-gateway で Sentry にアラートを送信する

Alertmanager から Sentry にはアラートを転送する機能がなかったため、今回は Alertmanager から Webhook を受信して、その情報を Sentry に転送するための [alertmanager-sentry-gateway](https://github.com/summerwind/alertmanager-sentry-gateway) を実装しました。

alertmanager-sentry-gateway は GitHub の [Release ページ](https://github.com/summerwind/alertmanager-sentry-gateway/releases)からバイナリーをダウンロードして、以下のように起動します。起動には Sentry にイベントを送信するための [DSN](https://docs.sentry.io/quickstart/#about-the-dsn) が必要なので、事前に Sentry の画面上で取得しておきます。

```
$ sentry-gateway --dsn ${SENTRY_DSN}
```

Alertmanager 側には以下のように alertmanager-sentry-gateway に Webhook を送信するようにします。

```
receivers:
- name: infra-team
  webhook_configs:
  - url: http://${SENTRY_GATEWAY_HOST}:9096
    send_resolved: false
```

Alertmanager から Sentry へのアラートの転送がうまくいくと、以下のように Sentry のプロジェクトにアラート情報が Issue として登録されます。

<img width="1440" alt="Sentry Project" src="https://qiita-image-store.s3.amazonaws.com/0/44764/5f506bf3-3455-ce47-ea0e-ed4695ac1ad0.png">

Issue には同じアラートが時系列で紐付けられるので、後からいつアラートが発生したのかを確認できます。また Prometheus のラベルが Sentry の Tag として記録されるので、Tag で絞り込んだり集計したりすることもできます。

<img width="1440" alt="Sentry Issue" src="https://qiita-image-store.s3.amazonaws.com/0/44764/47145af0-23a4-039b-5cff-573055b4dc7f.png">

また、Sentry の Issue Tracker 連携機能を使えば、アラートから Issue を作成したり、既存の Issue にコメントを投稿できたりするので便利です。

<img width="1439" alt="Screen Shot 2017-12-03 at 11.37.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/44764/2bb76ef2-a73a-8c9a-fcc1-9891149dfda4.png">

## まとめ

Prometheus のアラートを Sentry に転送しておけば、Alertmanager で不満に感じていたアラートの管理が柔軟にできることが分かりました。Sentry には他にも Release を登録しておくことでバージョンごとのイベント管理ができるようなので、そのあたりの機能もうまく使い込んでアラートの管理をより効率化していきたいと思います。
サーバをCPIからクラウド環境へ移設するときに注意すべきこと

##概要
今回は、比較的依頼の多いCPIの共用レンタルサーバからクラウド環境のサーバに移設を行う際の制約や注意点について書いてみます。
対象とするのは、1台のサーバでWEB・DB・MAILを利用している小さなサイトや企業様向けのサーバです。
移設の作業としては

 - ドメインの移管
 - ネームサーバの変更
 - メールデータ
 - SSLサーバ証明書
 - サーバデータ移行

などが挙げられます。
それぞれについて、注意点を挙げてみます。

##ドメインの移管
元々他社でドメインを管理している場合は問題ありませんが、CPIでドメインを管理している場合には
CPIにドメイン管理部分のみ残すか、別のレジストラに移管するかどうか検討し、
残さない場合には、お名前.comやバリュードメインなど 別のレジストラに移管の手続きをします。

ドメインの移管に関する注意事項は以下です。 

 - **ドメイン移管には一般的に１〜２週間程度かかる** 
 - **Whois情報は最新にしておく**


他のレジストラに移管する場合、新レジストラのネームサーバを使用する事もできますが、
**ドメイン移管の手続きが終わらないとネームサーバも使えない**ことが多いので、
余裕を持って手続きを開始してください。

また、移管手続き前にはWhois情報が自身のものになっているか確認しておきます。
特にメールアドレスは、ドメイン移管に必要な承認メールが届きますので、必ず受信できるものにしてください。

CPIの管理画面から他社への移管手続き方法は、以下に記載されています。
>[CPI / 他社への移管手続き](https://www.cpi.ad.jp/archives/pdf/domain/manual_other_transfer.pdf)

続いて、移転先で移管申請をします。
お名前.comの場合、下記のページから移管の手続きができます。
>[お名前.com / レジストラ・トランスファー](https://www.onamae.com/service/d-transfer/)

移管の申請ができたら、トランスファー承認メールを受信・承認して、手続きを進めます。

##ネームサーバの変更
DNS サーバーレンタルを契約していない場合、ネームサーバを切り替える必要があります。
CPIの標準DNSを使用している場合、以下のことが問題となってきます。

- **標準DNSは書き換えられない。TTL値は固定**

肝心のサーバ移行の為にDNSレコードを変更する際、浸透時間が長くかかるのを避けるには、
**先にネームサーバを切り替える** 事をお勧めします。

ネームサーバの切り替え手順：
　① 新しいネームサーバを用意し、CPIのゾーンデータと同じ値を設定する
　② レジストラ（CPIまたは他のドメインの管理者）のドメイン設定を新ネームサーバに変更
　③ CPI側で設定されていたNSレコードのTTL値＋キャッシュ分待つ
　④ whoisで、新ネームサーバが正しく登録されたのを確認

以降は、DNSレコード変更手順：
　① レコード、MXレコードなど、変更のあるDNSレコードのTTL値は一時的に短め（300秒など）にしておく
　② ゾーンデータを移行先のサーバ情報に書き換える
　③ DNS伝播が安定したらTTL値を元に戻す

CPIのゾーンデータは、CPIにお問い合わせすれば教えてくれます。
>[CPIサポート／DNS ゾーン開示希望方法](https://www.cpi.ad.jp/support/faq/faq_dns/cpi_standard_dns/support-11.html)

##メール
もしもGMAILなどの外部メールサーバを利用している場合には、下記の部分の手続きが
必要ありませんので、読み飛ばしてください。

メールサーバの移行は一番気を遣う部分となります。サーバ切り替えに伴うドメインの
レコード情報更新に伴い、必ず一時的にCPIサーバと移行先サーバのどちらにメールが
届くかわからない時間帯が発生致します。

これは、ドメインのMXレコードに設定されているTTL値が大きく関わります。
CPIの標準DNSを使用している場合には、1日＋キャッシュの時間がこの時間帯となりますし、
あらかじめネームサーバの変更を行っている場合は、一時的にTTL値を短めに設定することで期間を短縮できます。

メールソフトを利用している場合には、今使っているCPIサーバの送受信アカウントとは別に移行先サーバ用のアカウントを登録して、どちらに届いても受信できるようにしておくのが良いと思います。

メール受信に関わる設定は、下記のような感じになります。
設定内容は、サーバ環境により異なりますので注意してください。

例）
■CPIアカウント

アカウント：test@XXXX.com
受信サーバ：XXX.secure.ne.jp
送信サーバ：XXX.secure.ne.jp


■移行先サーバ

アカウント：test@XXXX.com
受信サーバ：pop.XXX.com
送信サーバ：smtp.XXX.com

##SSLサーバ証明書

独自ドメインのSSLサーバ証明書を使用している場合、
有効期限の残ったSSLサーバ証明書を 移行先のサーバに設置するには、
証明書と中間証明書の情報を提供してもらえるか、サポートに問い合わせしましょう。
※プランによっては提供してもらえない可能性があります。

##サーバデータの移設
クラウドサーバと違う大きな特徴は**SSH接続でコマンド実行できない**ことでしょう。
※SSH接続に対応しているプランもあります。
SSH接続できないレンタルプランの場合、以下のような制約が発生します。

 - ファイルを移行するのにFTPでしか接続できない
 - DBデータへのアクセスはphpMyAdmin等、ブラウザからの操作に限られる

実際の移行方法については、WordPressの例を別記事：[「WordPressサーバをCPIからクラウド環境へ移設」](https://qiita.com/quickguard/items/2f189c8b09d724006fd9)に書きました。
注意点だけ要約すると以下の通りです。

 - ファイルはlftp コマンドで移行できるが、再同期の際、設定ファイルの上書きに注意
 - CPIはMySQLバージョン複数対応の場合有、それぞれに複数のDBが設置可能なので、DBを間違えないで
 - phpMyAdminでエクスポートするとき、全データエクスポートされないことがある