読者です 読者をやめる 読者になる 読者になる

株式会社クイックのWebサービス開発blog

HAPPYなエンジニア&デザイナーのブログです

Visual Studio Codeの導入

はじめまして。マークアップエンジニアのsatopiiです。

ここ数年間テキストエディタSublime Textでコーディングしていましたが、Visual Studio Code(以下VSCode)ってどんなエディタなのか気になったので環境を整えてみました。

(2016/12/19追記)

インストールした拡張機能

Visual Studio Marketplaceにリンクしています。

ユーザー設定

CSSCombを有効化するためユーザー設定に以下の内容を追記。

{
  // CSS, scssファイル保存時にCSSCombを実行
  "csscomb.formatOnSave": true,
  // CSSComb設定ファイルのパス指定
  "csscomb.preset": "/path/to/.csscomb.json"
}

CSSプロパティオーダー並び替えはこちらのcsscombを参考にしています。

キーボードショートカット

[
  // CSSComb
  {
    "key": "cmd+shift+c",
    "command": "csscomb.execute"
  },
  // Runner
  {
    "key": "cmd+shift+,",
    "command": "extension.runner.start",
    "when": "editorTextFocus"
  },
  {
    "key": "cmd+shift+.",
    "command": "extension.runner.stop"
  },
  // FontSize Shortcut
  // 拡大のデフォルト設定が`cmd+=`に設定されている。
  // Macの日本語キーボードで使えないので別のキーに変更。
  {
    "key": "cmd+u",
    "command": "fontshortcuts.increaseFontSize"
  },
  // join-linesの機能がver 1.8.0から追加されたので、
  // キーボードショートカットを編集(ctrlキー使いなら変更不要)

  {
    "key": "cmd+j",
    "command": "editor.action.joinLines",
    "when": "editorTextFocus && !editorReadonly"
  }
]

Runnerのショートカット設定はMac の Visual Studio Code で C/C++/C# を実行するを参考にしました。

VSCodeのここが好き

  • 日本語化されている!
  • もうターミナルいらない?
  • gitを活用しやすい・見やすい!

もうターミナルいらない?

例:gulpを実行する1

  1. cmd+shift+pでコマンドパレットを開き、taskと入力
  2. 「Tasks: Run Tasks」→「default」を選択するとgulpが実行される

f:id:aimstogeek:20161214143719j:plain

f:id:aimstogeek:20161214143726j:plain

f:id:aimstogeek:20161214143735j:plain

実行されました༼ԾɷԾ༽✧

Runner Extensionでシェルスクリプトも実行可能

shファイルを開いてRunnerのショートカットを使えばコマンドが実行されます。

例:gulpを実行する2

f:id:aimstogeek:20161214143741j:plain

cmd+shift+,(設定したショートカット)

f:id:aimstogeek:20161214143746j:plain

実行されました༼•̀ɷ•́༽✧

gitを活用しやすい・見やすい!

gitを覚えたてなので、コマンド怖い病から抜け出せていません。
SourceTreeは重たいし、できれば使いたくない…。
そんな私を支えてくれるGitバー。

  • 追加・修正・削除したファイルが一覧になって見やすい
  • 修正した箇所のDiff表示がステキ
  • ファイル名の横にreset()、add()アイコンがあり、修正前の状態に戻したりステージングに上げることができる
  • ステータスバーの左にmaster/ブランチ名が表示されていてわかりやすい、切り替えやすい

f:id:aimstogeek:20161214143751j:plain

f:id:aimstogeek:20161214143756j:plain
コミットメッセージ入力欄があるので、メッセージはそこへ!

f:id:aimstogeek:20161214143801j:plain
「…」アイコンをクリックすると、gitコマンドメニューが表示されます。

まだcommit, pull, pushくらいしか覚えていない私には、今のところこれで充分かな、と。

VSCodeでできたらいいな

  • マウスも使う派なので、選択したテキストをドラッグしたい!
  • 全角英数字(+指定した任意の文言)をハイライトする拡張ほしい!

後者の拡張(AlwaysHighlight)はSublime Textで重宝していたんですよね。
絶対必須ではないけれど、全角英数字以外にも全角記号やダミー文言をハイライトしておくと、原稿をチェックしやすくなるという…。

できたらいいなという点は一旦目を瞑り、しばらくVSCodeをメインに使ってコーディングしていこうと思います。

PHPでStrategyパターンを考えてみよう

甘い食べ物は好きですが、マカロンさんとはいい関係を築けていません。

11月中旬にチームにジョインしたフルーツパーラーと申します。
アプリケーションエンジニアをしています。

最近触った事や、気になる事、深掘りしたい事を書いていこうと思います。
記念すべき初回のテーマは!!!

ジャーーーン!!

デザインパターン

硬い。。。硬いですね。初回にしては。 いや、初回だから。ですね。

という事で、 先人の知恵を元に、いかにもありそうな実装に落として、理解を深めようと思います。

デザインパターン関連の書籍はJavaで書かれたサンプルが多く、PHPで書かれたサンプルソースはとても少ない印象です。 PHPデザインパターンを利用したコードをさくっと手元で試したい。という方に向けてコードを書いて行きます。 こういう風にかける、というアイディアもコメントで頂けますと幸いです。

デザインパターンとは

デザインパターンとは、GoFGang of Four)が提唱した23個のパターンを指します。 1995年に書かれた本(通称GoF本)は、言語自体が進化した今となっては古いという声もありますが、 設計や実装の知恵として非常に参考になると思います。

各パターンに名前が決まっている事から、 ○○パターンで実装を考えているという言葉だけで実装する処理をイメージ出来るメリットがあります。

以下 wikipediaデザインパターン」より引用

それぞれのパターンは、プログラマの間で何度も繰り返し考え出されてきた。

したがって、それは最善の解決策ではないかもしれないが、
その種の問題に対するトレードオフを考慮した、典型的な解決策ではある。

さらに、コストがかかるかもしれない問題解決を実際に行う前の先行調査として、
大変役に立つ。

パターンに名前が付いていることが重要である。
なぜなら、名前が付いていることで問題や解決策を記述したり、
会話の中で取り上げたりすることができるようになるからである。

今回試すパターン

今回はポリモーフィズムで処理を行うStrategyパターンで進めます。

※ソースはページ下部にすべて記載しています。

Strategy パターンとは

Strategyとは「戦略」を意味します。

書籍やネットでは、条件によって、XML/JSONで出力切り替え、またはXML/CSVのインポートという内容をよく見ます。 ちょっと違う方向で進め、こういうケースでStrategyパターンが利用出来るか?を実証していきます。

◯◯を□□する。という処理があった場合に、◯◯の部分をStrategyとして実装しておくことで、 ◯◯の切り替えを簡単に行えるようにします。

Strategy パターンのメリット

Strategyパターンでは、処理の分離を行う事で、新たな処理を追加しても、既存の処理に影響なく実装を行えます。

1つの処理内に複数の処理が存在しない事から、if/switchの条件分岐が少なくなり、コードの可読性が向上します。 複数の関数を動的に切り替える。という風に考えるとイメージしやすいです。

1つの送信処理の中で、メール送信、SMS送信(他社APIを利用)、Push通知送信が存在した場合に、 新たに何らかの送信処理を追加すると、条件分岐が増え、修正作業が難しくなる事は容易に想像がつきます。

今回の実装

例として、1ユーザに、メールを送信する、SMSを送信する、Push通知を送信するという流れです。

実際に送信する部分は省略していますが、validationをどこにいれるか、例外処理をどこに持つか。 という事を考えると楽しくなりますので、お時間があれば手元でいろいろ試して見て下さい。

登場クラスの役割

  • User

    • メール送信ユーザの情報を保持
  • MessageStrategy

    • 各送信種類の親クラス
  • MessageContext

    • 各送信種類を内部で保持し、クライアント側(クラス利用者)から呼び出される
    • Strategyパターンの肝となるクラス
  • ConcreteMailMessage

    • メール送信処理を行う
  • ConcreteSMSMessage

    • SMS送信処理を行う
  • ConcretePushNotificationMessage

    • Push通知送信を行う

処理の説明

// 送信対象のテストUserインスタンス
$user = new User('Pさん', 'test@example.com', '090xxxxyyyy');
  • 作成した$userをMail送信クラスに注入します
// Mail送信
$strategy = new ConcreteMailMessage($user);
  • 作成したMail送信処理を、コンテキストクラスに注入
// Contextクラスにstrategyクラスを注入
$contextMessage = new MessageContext($strategy);
  • 送信処理
// 送信処理 注入されたオブジェクトのsend()メソッドをcall
$contextMessage->send();
  • 出力
// mail->to(Pさん) と出力される

SMS / Push通知に切り替える場合は

  • SMSを送信したい場合は、SMSに切り替えるだけ
// SMS送信
$strategy = new ConcreteSMSMessage($user);
  • Push通知を送信したい場合は、Push通知に切り替えるだけ
// Push通知
$strategy = new ConcretePushNotificationMessage($user);

簡単に切り替えられます。

まとめ

シンプルな条件分岐なので冗長に見えるかもしれませんが、 簡単に切り替えられた事が分かると思います。

各処理が別々で機能していますので、追加で新しい種類の送信処理を実装しても 既存の送信処理に影響はありません。

補足説明

実は、直接具象クラス->send()を実行する事も出来ます。 しかし、メール、SMS、Push通知のすべてがsend()メソッドを持っているかどうかは 実際に内部を見るまでわかりません。

// コンテキストクラスを利用しなくてもsend()する事は出来るが。
// インスタンスがsend()メソッドを持っている保証はない。クラス内を見るまで判断出来ない
$strategy->send();
// mail->to(Pさん) と出力される

コンテキストクラス(MessageContext)のコンストラクタで タイプヒンティングを行いインターフェースを統一しています。 それによって、send()メソッドが保証されます。

まとめのまとめ

簡単に書きたいと思って説明を書き始めましたが、硬いですね。
うまくお伝え出来ない部分も多々ありますので、下にソース全文を貼ります。
お手元で遊んで見て下さい。

それでは〜!

  • 実際に試したい方は以下ソースをご利用下さい。
<?php

/**
 * 送信対象のUserクラス
 */
class User {
    private $name;
    private $mail;
    private $tel;

    /**
     * 仮に利用するpropertyを定義
     * User constructor.
     * @param $name
     * @param $mail
     * @param $tel
     */
    public function __construct($name, $mail, $tel) {
        $this->name = $name;
        $this->mail = $mail;
        $this->tel  = $tel;
    }

    /**
     * 仮に名前だけ出力するためにgetter設置
     * @return mixed
     */
    public function getName() {
        return $this->name;
    }

}

/**
 * 抽象クラス
 * Class MessageStrategy
 */
abstract class MessageStrategy {
    protected $user;
    public abstract function send();
    public abstract function __construct(User $user);
}

/**
 * コンテキストクラス
 * Class MessageContext
 */
class MessageContext {
    private $strategy;

    /**
     * MessageContext constructor.
     * @param MessageStrategy $message
     */
    public function __construct(MessageStrategy $message) {
        $this->strategy = $message;

    }

    public function send() {
        $this->strategy->send();
    }
}

/**
 * 具象クラス(Mail)
 * Class ConcreteMailMessage
 */
class ConcreteMailMessage extends MessageStrategy {
    public function __construct(User $user) {
        $this->user = $user;
        // mailに関する前処理
        // ...
    }

    public function send() {
        echo 'mail->to('. $this->user->getName(). ')'. PHP_EOL;
    }
}

/**
 * 具象クラス(SMS)
 * Class ConcreteSMSMessage
 */
class ConcreteSMSMessage extends MessageStrategy {
    public function __construct(User $user) {
        $this->user = $user;
        // smsに関する前処理
        // ...
    }

    public function send() {
        echo 'sms->to('. $this->user->getName(). ')'. PHP_EOL;
    }
}

/**
 * 具象クラス(PushNotification)
 * Class ConcretePushNotificationMessage
 */
class ConcretePushNotificationMessage extends MessageStrategy {
    public function __construct(User $user) {
        $this->user = $user;
        // Push通知に関する前処理
        // ...
    }

    public function send() {
        echo 'push->to('.$this->user->getName(). ')'. PHP_EOL;
    }
}

// ------------------------------
// 実際に利用するイメージです
// ------------------------------

// 送信対象のテストUserインスタンス
$user = new User('Pさん', 'test@example.com', '090xxxxyyyy');

// Mail送信
$strategy = new ConcreteMailMessage($user);

// $strategyにどのクラスを代入するかでMail / SMS / PushNotification とsend()の振る舞いを変える
// SMS送信
// $strategy = new ConcreteSMSMessage($user);

// Push通知
// $strategy = new ConcretePushNotificationMessage($user);

// Contextクラスにstrategyクラスを注入
$contextMessage = new MessageContext($strategy);

// 送信処理 注入されたオブジェクトのsend()メソッドをcall
$contextMessage->send();

// コンテキストクラスを利用しなくてもsend()する事は出来るが。
// インスタンスがsend()メソッドを持っている保証はない。クラス内を見るまで判断出来ない
$strategy->send();

// mail->to(Pさん) と出力される

Excel作業の効率化 ~ショートカットと操作~

はじめまして。エンジニア見習い中のdaikingです。

私はこれまで、レポート作成・データの分析などの仕事をしていました。当時Excelにどっぷり浸かっていたので、今回は効率良くExcelを使い倒すための小ワザをいくつか紹介したいと思います。
全部は紹介しきれないので、自分の周囲でもこれははずせないと意見が上がったものを抜粋します。

注意)Windowsのショートカットです

こんな方におすすめ

  • データ分析でExcelを効率良く使いたい方
  • レポート作成をExcelで楽に済ましたい方
  • ショートカット大好きな方

目次

1. ショートカット
2. 操作

ショートカット

  • 使用頻度"高"のショートカット

ショートカットキー 説明
Alt + A + M 重複削除
Alt + D + S 並び替え
Alt + D + P + F ピボット
Alt + W + F + F 枠固定
Alt + H + O + I 列幅最適化

ここで取り上げたものは10回/日レベルの使用頻度です。
オフィスのアクセスキーなのか、Altを打った後ツールバーのナビに従うかは好みで使い分けてます。

  • 頻度低いがイケてるショートカット

ショートカットキー 説明
Alt + O + H + R シート名変更
Alt + E + L シート削除
Alt + Shift + F1 シート追加
Ctrl + Shift + & 罫線
Ctrl + Shift + \("ろ"の部分) 罫線消す

シート・罫線などはマウスに頼りがちですが、慣れると間違いなく便利です。

操作

  • 方向キー使わずシート内をすばやく操作

ショートカットキー 説明
Ctrl + 方向キー 現在のセルより"大きく"(※1)移動する
PageUp/PageDown マウスホイールを使用せず、シート上部・下部に移動する
Ctrl + Home A1セルに移動する
※1. 現在のセルより、指定の方向に向かって空でないセルまで移動

  • オートフィルタ使用時の項目操作

ショートカットキー 説明
Alt + ↓ 選択肢をプルダウンで表示
Space 選択肢のチェックボックスのオン・オフ切り替え
PageUp/PageDown/Home/End 選択肢をジャンプして上下に移動
Esc 表示されたプルダウンを閉じる


最後に

以上で紹介したものは、 手に馴染むことが非常に重要だと思います。
毎回調べてたらマウスの方が早い!

私もプログラミングの勉強を始めた当初は、cd?ls??pwd???と頭が混乱していましたが、
徐々に考える前に手が動くようになってきました。


これからExcel操作と格闘していく方、過去に格闘したけどマウス派の方で、
これこれ!って思うものが少しでもあれば嬉しいです!

次回は、ここでご紹介したショートカットや操作を用いながら
実際に何かのアウトプットに向かっていくフローを紹介できればと思います!

64bit版Windowsに32bit版のAccess入れたらODBC設定がちょっと面倒だった話

こんにちは。sanamekoです。鍋の美味しい季節ですね。
きのこをたくさん入れるともっと美味しくなりますよね。

さて、本日は、タイトルどおり、「64bit版Windowsに32bit版のAccess入れたらODBC設定がちょっと面倒だった話」をしたいと思います。

前提条件

Accessで、ODBCを使って業務システムのDB(MySQL)に接続している
・使用しているPCは64bit版のWindows
・64bit版のAccess2013をインストール済
・64bit版のMySQLドライバをインストール済

なぜAccessを32bit版にしたいのか

理由としては、ズバリ『64bit版Accessは何かと不具合が多いため』です。不具合については割愛しますが、これが一番の理由でしょうか。
また、私以外のメンバーは32bit版のAccessを使っており(OSも32bit)、作成したAccessファイルを共有することも多いので、環境を揃えたほうが良いなと思いました。(←最初に気付くべきでしたね)

最初にやったこと

・64bit版Accessをアンインストール
・PC再起動後、32bit版をインストール

を行いました。
(正確には、Office系は全部32bitまたは64bitで揃えなきゃいけないので、
WordやExcelなども全部まるっとアンインストールしました。)

これで終わりでしょ~簡単簡単!と思っていましたが、違いました。

MySQLに接続できなくなった!

さっそくAccessでいつものようにデータ抽出をしようとクエリを実行しますが、エラーが出てしまいました。

どうやら、64bit版のWindowsには、64bit版と32bit版の両方のODBCドライバが存在しているようです。
今回、Accessを32bit版にしたことによって、ODBCドライバも32bit版のほうで設定し直す必要があります。

追加で対応したこと

MySQLのドライバも32bitに入れ替える必要があるので、まず次の作業をします。

・64bit版のMySQLドライバをアンインストールし、32bit版をインストールする

次に、32bit版のODBCドライバの設定を行います。
コントロールパネル > 管理ツール > データソース(ODBC)から確認できるのは、64bit版の設定だけなので、

・コマンドで、<%windir%\SysWOW64\odbcad32.exe>を実行し、32bit版のODBC設定画面を立ち上げる
ODBCを設定し直す

という方法を取ります。
これでようやく、AccessからMySQLに接続できるようになりました。

同じような境遇の方がいるか分かりませんが、参考になれば幸いです!

新人エンジニア研修の失敗談

はじめまして。新卒入社1年目のみっきーです。

初投稿は、クイックの新人エンジニア研修についてお送りしたいと思います。
研修項目は下記2点を抜粋してお送りしたいと思います。

お送りする研修項目はこちら

  1. LPIC-level1を取得する
  2. 図書管理システム

私の研修は失敗続きで、やっていけるのかなーと悩む日々でした。
ですが、失敗から学べることが多く、くじけてないで何がだめだったのか考えようと、すぐ切り替えられるようになりました。
これから、あるいは現在なにか失敗して悩んでいる方がいれば、ぜひ下記の失敗談を読んでください。
こんなに失敗してても頑張っているんだなと、前向きになる切っ掛けになれたら幸いです。

LPIC-level1を取得する

LPIC-level1とは、2つの試験に合格することで取得できるLinuxの資格です。
LPI-Japan公式サイト参照
http://www.lpi.or.jp/

まず結果からお伝えすると、101試験を3回、102試験を1回の計4回受験し取得することができました。

スコア

101試験:580/800点 102試験:700/800点。

各試験の勉強時間

101試験 約3ヶ月
102試験 約2週間

感想

勉強時間とテスト結果が比例しない結果になりました。
直接的な原因としては、下記の2点だと思います。

  • 101試験は、古いテキストを使用して学習を行っていたため
  • 102試験は、新しいテキストを使用して学習をおこなったため

(黒本以外、使用してはならないと、固定概念に囚われていたため古いテキストを使用していました。馬鹿すぎる。うぅ。)
また個人の感覚としては、101試験はコマンド自体を覚えるものだったので、実際にLinuxをいじりながら学ばないと、覚えづらい試験だったかなと思います。
逆に102試験はLinuxの概念などが出題される試験で、101試験でコマンドを覚えてから学習を始めたため、覚えやすかったかなと思います。
受験期間は、恥ずかしいのと自分の学習能力の低さと、社費もったいないなとグルグル考えていてテンションだだ下がりでした。

勉強方法
基本的には問題をひたすら解いて暗記ー>実際にコマンドを打ってみるを繰り返しました。

教科書は下記を使用しました。


※古い本は割愛
白本は1問1解形式の教科書で、非常に好みでした。
豆本は、章ごとにまるっと復習したいときに便利な教科書でした。

また、101試験に関してはping-tにお世話になりました。
ping-tはドリル形式の問題出題サイトで、試験に向けて自信付けに役立つと思います。
また、正答率が上がっていくのが、ゲーム感覚で楽しかったです!

業務で役立つものを開発する

目的

企画、開発、運用を通して、気づきを得る(たぶん)


概要

図書管理システム

図書の検索、貸出、返却、登録がブラウザでできる仕組み(図書館のシステムのようなもの)をPC/SP版で作成。

  • PC版では、表紙を一覧表示することで、図書を直感的に選ぶことができる仕組み
  • SP版では、貸出、返却、登録が、書籍のISBNコードをカメラで読み取るだけで、簡単に行える仕組み


失敗したこと(多数ありますが、クリティカルなものを抜粋)

  • スケジュール

バッファを取らずに作成し、リスケを繰り返す

  • テスト

テストリストを作成せずに、セルフテストや開発、修正を行ったため、最終テスト依頼時に、動かないトラブル発生

  • 技術調査

サーバ周りの知識が足りず、リリースができない

  • 手書きの設計書

ミーティング時見づらく、修正した箇所がわかりづらい

  • 誤操作によるデータ削除

頭の回っていないときに、GUIで変更作業をしていたら、誤ってデータを削除


失敗から学んだこと・改善できたこと

  • スケジュール作成方法

途中からスケジュールの管理ができるようになりました。
スケジュールの管理ができると仕事が捗っている気がして楽しかったです!
また、心身ともに負担が少ないので余裕が出て周りが少しは見れるようになった気がします。

  • テスト方法

テストリストを作成。
それをもとにセルフテストを行ったため、大きな問題なく、比較的スムーズにテストをクリアすることができました。
  

  • 設計書の作成方法

データで作成し、印刷して共有するよう変更しました。
結果、見やすく、変更しやすく、変更箇所がわかりやすい資料が作成できました。
自分も、共有相手も便利になりました。
以後こちらで行います。。。(最初からやれよって感じですね)

  • 誤操作によるデータ削除

データをいじるときは、手順を作成し、間違いが起きないか確認後を行うことにしました。
今のうちにGUIでポイポイいじって、恐怖体験ができてよかったです。

感想
上記以外にも研修を通して、失敗を経験することができました。
そこから多くのことを学ぶことができたと思います。
ですが、まだまだ気づけていないことがあるので、これからも振り返りを行いたいと思います。

現在の目標
日本語力が低く、OJTの方に文章の添削をしていただいています。
簡潔で伝わるビジネス文章を書けるよう日々訓練しております。
と、いうことで現在の目標は!
正しい日本語を使用できるようにする★
ですー!

駄文失礼しました。
ここまで読んでくださりありがとうございます。
これからも頑張ります。

Emacsで、JavaScriptとJSONのインデント幅をスペース2個にした

こんにちは。今月から、本格的にVimからEmacsに改宗した五所です。

Emacsよいですよ。変態的なキーバインドが慣れると気持ちよいです。

私が使っているHappy Hacking Keyboardとの相性もバツグンです。なにせAltキーを手のひらで押せますからね。

JSONのインデント

私の使っている環境(GNU Emacs 25.1.1 / Arch Linux)では、javascript-modeのデフォルトのインデントはスペース4個となっています。

私は、JavaScriptのインデントはスペース2個でずっとやってきましたので、違和感を感じました。

しかし、天下のEmacsがスペース4個って言っているならもしかしてそうなんじゃないか、と思ったので適当に有名どころを調べました。

MEAN Stack

https://github.com/linnovate/mean

スペース2個です。

package.json

https://github.com/linnovate/mean/blob/master/package.json

スペース2個です。

composer.json

https://github.com/laravel/laravel/blob/master/composer.json

なんとスペース4個です。

PHP界では、JavaScriptはスペース4個なんですね。

ということは、コーディングしている言語に合わせてよいということか。

結論

書いているのがRubyだったので、インデントは2個にしました。

下記のLispコードを~/.emacs.d/init.elに追加しました。

(add-hook 'js-mode-hook
          (lambda ()
            (make-local-variable 'js-indent-level)
            (setq js-indent-level 2)))

参考

http://stackoverflow.com/questions/17901900/how-can-i-set-a-tab-width-for-json-files

おまけ

.editorconfigも後で設定しないとだなー

MySQLをメモリ(tmpfs)にして、3倍速くした話

弊社ではXenServerを使用してますが、結構メモリが余ってる事に気付き
MySQLをメモリ上(tmpfs)に置いて爆速にしてやろう、と思いつきました。
インメモリよりオンメモリMySQLを実現させます。

雨はくせっ毛の敵、よって雨は敵。
matsBです。

HDDよりメモリの方が何をどう考えても速いのですが、メモリ特有の懸念点があります。
メモリ上に置くのでサーバ自体が再起動した時に、データが全て無くなるってところです。
リードレプリカなどで実践したほうが無難な運用になるかと思いますが、そんなのかんけーねー!
って方は、是非本番で試して下さい(๑•̀ㅂ•́)و✧

環境

CentOS 6.5
MySQL 5.6
メモリ 20GB

前提

rsyncをインストール
実データより、メモリが大きい
ここから下のコマンド類はrootで実行しています

下準備

メモリ(tmpfs)をマウント

$ mkdir /mnt/ramdisk/
$ mount -t tmpfs -o size=12G  tmpfs /mnt/ramdisk/

MySQL用のディレクトリを作成

$ mkdir /mnt/ramdisk/mysql
$ mkdir /mnt/ramdisk/tmp
$ chown mysql: /mnt/ramdisk/mysql
$ chown mysql: /mnt/ramdisk/tmp



MySQLの移動

MySQLをストップ

$ /etc/init.d/mysqld stop

MySQLの実データを移行

$ /usr/bin/rsync -avz --delete /var/lib/mysql/ /mnt/ramdisk/mysql/

MySQLのmy.cnfの書き換え

$ vim /etc/my.cnf
[mysqld]
datadir = /mnt/ramdisk/mysql    # データディレクトリをtmpfsに指定
tmpdir = /mnt/ramdisk/tmp     # tmpディレクトリをtmpfsに指定

MySQLをスタート

$ /etc/init.d/mysqld start


とりあえずこれでメモリ上でMySQLが動いて、SQL文を流してみると早さを実感できます。
ここから、再起動してもデータが消えないようにする作業をしていきます。


後処理

シャットダウン時にメモリ上からHDD上にデータを移行

$ vim /etc/rc.d/init.d/halt
/usr/bin/rsync -avz --delete /mnt/ramdisk/mysql/ /var/lib/mysql/

起動時にMySQLがメモリ上(tmpfs)で起動するように追記

$ vim /etc/rc.local
mount -t tmpfs -o size=12G  tmpfs /mnt/ramdisk/
mkdir /mnt/ramdisk/mysql
mkdir /mnt/ramdisk/tmp
chown mysql:mysql /mnt/ramdisk/mysql
chown mysql:mysql /mnt/ramdisk/tmp
/usr/bin/rsync -avz --delete /var/lib/mysql/ /mnt/ramdisk/mysql/
/etc/init.d/mysqld start1

これで、「shutdown -h now」や「reboot」コマンドでサーバを停止しても、シャットダウン時にHDDにデータが移動して起動時にメモリにデータが移動するようになります。




※1
rc.localでmysqldを起動させているのは、デフォルトのまま自動起動にするとrc.localよりもmysqldの方が早く起動します。
となると、メモリをマウントするに起動してしまうため必ず起動に失敗します。
rc.localの起動順をmysqldより前に変更してしまえばいいじゃん!って思いましたが、/etc/rc3.d/ 内でのrc.local起動順番は「S99local」となっており、最後に起動することを想定しています。

$ ls -l /etc/rc3.d/
~中略~
lrwxrwxrwx. 1 root root 16  421 16:58 2016 S64mysqld -> ../init.d/mysqld
lrwxrwxrwx 1 root root 11  319  2015 S99local -> ../rc.local

別の誰かがrc.localに書くときは起動の最後に動くことを想定するはずなので、起動順を変えずにrc.localでmysqldを起動させてます。