MySQL WorkBenchでデータベースのモデルを作る

potproject.net Advent Calendar 201615日目の記事です。

今回はかなり珍しいけれど、データベースの話です。


うまいことE-R図が書ける書けるソフトウェアを探していて、
普段MySQLサーバーを操作するときに使用していたMySQL Workbenchに、
モデル作成機能があるとわかり、使ってみたらかなり使いやすく便利だったのでブログでの紹介です。

MySQL Workbenchは、MySQLに関する統合管理ソフトウェアです。Windows/Mac/Linuxのマルチプラットフォームかつ、無償です。
MySQLの開発元であるOracleが開発しています。

大体はデータベースを管理していろいろ情報を見たり、挿入したり削除したりがGUIで出来るのでそれだけでかなり便利なんですが、
モデル作成機能もついてるようです。
バージョンは6.3.8です。

ダイアグラムを立ち上げる

File -> New Model で、新しいモデルを作ります。
その後、 Add Diagram をクリックするともうE-R図の作成画面が出てきます。

基本的に、書くだけだったらそんなに難しくないです。左側のタブの真ん中あたりにあるのがテーブル追加ボタン。これでテーブルを追加。
左側にあるのはテンプレートです。ここをクリックすることで用意されたテンプレートを使用できます。
今回は一から作らず、このテンプレートを使って簡単にいきます。
userテーブル、categoryテーブルが出来ました。

テーブルを編集する

テーブルはダブルクリックすることで編集が出来ます。
テンプレートはカラムのデータ型が設定されてないようなので、編集して設定します。
主キーやデータ型などを付け加えるとこんな感じです。

関係(リレーション)を設定

E-R図なので、外部キーなどの関係を設定します。
編集状態で、 Foreign keys を選び、外部キーの名前、参照するテーブル、参照するカラムなどを設定。
今回はuser.usernameを参照するようにcategory.nameに外部キー制約を設定します。

このような感じになります。また、自動的に指定された表記法で関係が表されます。
初期状態だとIE (Information Engineering)記法となっています。自分は一番なじみのあるUML記法で表示するため、
Model -> Relationship Notation で、UMLを指定。記法が変えられるというのもかなり嬉しいポイントじゃないでしょうか。

SQLで出力

モデル機能も優秀ですが、MySQL Workbenchは作ったモデルをSQLで出力することが出来る機能があり、これが本当に使えます。
E-R図を見ながらSQLを組み立てていく時間が削減されるので、すごく便利。

File -> Export -> Forward Engineer SQL CREATE Script を選択。
途中何を出力するか聞かれるので、 Export MySQL Table Objects にチェック。
他にもViewやroleまで出力できるようです。すげー。

CREATE TABLE IF NOT EXISTS `mydb`.`user` (
  `username` VARCHAR(20) NOT NULL,
  `email` VARCHAR(255) NULL,
  `password` CHAR(64) NOT NULL,
  `create_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`username`));

CREATE TABLE IF NOT EXISTS `mydb`.`category` (
  `category_id` INT NOT NULL,
  `name` VARCHAR(20) NOT NULL,
  PRIMARY KEY (`category_id`),
  INDEX `name_idx` (`name` ASC),
  CONSTRAINT `name`
    FOREIGN KEY (`name`)
    REFERENCES `mydb`.`user` (`username`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION);

組みあがったSQL文がこれ。SQL文全く分からなくてもいけるわけですよ。
自分はこれくらいならSQLを書けないことはないですが、外部キーやインデックスなどまで含めて書くとなると、ちょっときつい。というかめんどくさい。
後はこれをSQLにインポートで完了ですよ。

データベースメインのひとでもかなり使えるのでは?自分は多すぎて全容把握できてないです。
欠点は、MySQL Workbenchがすぐクラッシュするくらいですね。本当に多いのよね。自動保存機能はあるらしいけれど。
まあ、なんでもそうですが、こういったソフトウェアは定期的に保存っすなあ。

GTX1060を買いました

potproject.net Advent Calendar 201614日目の記事です。

もはや普通のレビューである。


今年の冬にめちゃくちゃいろいろ買いそろえている感じ。

今度は、ついにグラボを買い換えに走りました。
ZOTAC GeForce GTX 1060 6GB Single Fanです。

この機種はファンが1つのみ、その分小さくてコンパクトというウリです。
でもやはり、ファンが1つだけという都合上、結構熱いです。
最近ハマっているtom clancy’s the Divisionでフル稼働にて70-76度というところで80度はギリギリ超えない。
でもこれでも問題ないレベルなんでしょうね。ファンは100%回っていませんし。
元々のGTX660と比べてもほとんど同じくらいでしたし。でも夏はちょっと厳しいのかも。
これでスペック不足を感じてくる日は何時になることやら。やっぱりVRに備えたというのもあるんで・・・

・・・VRもほしいんだけどなー値段がなー・・・

おまけでFire タブレット 8GBを買いました。最終日サイバーマンデーにて3500円。この値段なら損はしない。
お遊びで使ってみます。

最近のコーディングとか

potproject.net Advent Calendar 201613日目の記事です。

まだ半分か・・・。


最近のコーディングは、結局いろいろ使ってきたりしたのですが、v1.0になってそれなりに使えるようになり、
現在はv1.7まで上がりかなり安定してきたかなということで、Visual Studio Codeを使ってます。
略してVSCode。

Visual Studio Code – Code Editing. Redefined

多分、このブログを始めたより後にできたエディタじゃないですかね?それくらい新しいエディタだと思います。
Visual Studioは有名なIDEですが、別に互換性があるとかナンバリングじゃなく、全くの別物で、こちらはテキストエディタに近いです(デバッグ機能とかあるけど)
自分が一番気に入っているエディタといえば(今は)これなんで、布教活動でもしていきます。

1.Macでも使える

Visual StudioなのでMicrosoftが開発しています。でも公式サイトにもMac版が普通に提供され、使用できます。
と思ったのですが、つい最近Visual StudioもMac対応を出す予定でしたね。
でもこっちはオープンソースなので、開発当初からWindows/Mac/Linuxとマルチプラットフォーム対応で使いやすいです。
しかも一説によればWindowsよりMacの方が動作が軽いとか聞きます・・・。それもそれでどうなんだ。

2.同じ系統のエディタであるatom.ioやBracketsよりも軽い(体感)

atom.io,Brackets,VSCode
この3つはどれもWeb技術でデスクトップアプリケーションを作れるソフトウェアであるElectronを使って作成されたエディタなのですが、
全部使った中で体感的にVSCodeが一番軽いと思っています。
atomやBracketsは新規タブを開こうとするとかなり重いような印象。しっかり図ってませんが実際軽いと思います。
他にも同じように軽いというブログもありました。やはり一番後発だから、なんですかね?
electron系エディタ戦争終了のおしらせ。codeがイチオシ

3.基本はテキストエディタなのにデバッグ機能が備わっている

これが一番おすすめの理由でもあります。基本はテキストエディタで、ビルドなんかは出来ませんが、デバッグ機能だけはデフォルトで準備されています。
でも、最初から好きな言語がデバッグできるわけではなく、用途に合った拡張機能を入れる必要がありますが、
デバッグ機能が最初から想定されているおかげで、かなり見やすくデバッグが捗る。
拡張機能は色とりどりで、MicrosoftイチオシのC#やtypescriptはもちろん、一般的なc/c++、phpやjavascript(node.js)などのWebサーバ系ソフトウェアで使える言語も可能です。
コーディングに関して、デバッグ機能は必須です。php-debugをよく使ってます。

その他、最近のエディタには当たり前になってきているgit機能、わかりやすくシンプルですがあるとかなり便利な全ファイルの文字列検索など、
大型のIDEや特化したテキストエディタとは違う、これだけは揃えておきたい、という機能がちゃんと入っているエディタと思います。
まだ初版リリース(v0.1)から1年少しでもうバージョンがv1.7にまで増えているのを考えると、かなり活発にアップデートしているという点でも魅力だと思います。

以上、宣伝でした。

サーバー移管した話

potproject.net Advent Calendar 201612日目の記事です。

今日は手抜き。


ようやく、サーバの移管がほぼ完了したのでそれに関する簡単なTipsとメモです。
今回は10分くらいで書ける記事を目指しています。ついでに前の記事の宣伝です。たまには簡単に行きましょう。

20分くらいかかってしまった・・・

WordPress移行

基本的にはWordpressのデフォルト機能として備わっている インポート/エクスポート機能 で移行しました。やはりデフォルトなので一番わかりやすくかつ簡単だと思います。
デフォルト機能なのですが、プラグインが必要だったりします。
古いサーバから管理画面より「ツール」→「エクスポート」からxmlファイルとしてエクスポート、
新しいサーバでインポートで特殊でない大体の記事は問題なく動きます。
スキンやプラグインなどは反映されませんが、そこは数も少ないので手動でした。

Webサーバ構築

この部分は記事別にいろいろまとめています。おさらいです。
自分のサーバではnginx,node.js,sinatra(ruby)と3つほどWebサーバが稼働しています。
centos7+nginx+php-fpm+php7な新しい感じの環境を構築
nginxでRackアプリケーション(sinatra)を動かす

SSL(https)対応

このあたりも(ryです。
おかげさまでSSLオンリーのサイトになりました。
これからは個人サイトといえど必須だと私は思っています。自動更新も忘れずに。
Centos+nginxでLet’s encrypt(certbot)導入と自動更新まで
[nginx]Let’s EncryptでSSLのセキュリティをA+にするまで

Mysqlのダンプ取得

Mysqlのダンプはやはりphpmyadminからエクスポートするのが楽でいいですが、コマンドならmysqldump -u USERNAME -p DBNAME > OUTPUTですね。
取得したらmysql -u USERNAME -p DBNAME < OUTPUTでインポート。たまにデータベースを先に作成する必要があったりすることもあります。その場合は“create database DBNAME“`で作成。

古いサーバはまだ残っていて、放置してるとやはりお金が無駄に取れますので、早いところ解約しなきゃ・・・

Xiaomi Redmi note 3 proとMi band 2を買った話

potproject.net Advent Calendar 201611日目の記事です。

やべえあと1時間しかない何書こう


Xiaomi Redmi note 3 proを買いました。結構前に。

で、1.5カ月ほど使ってみてのレビューです。中華製品は最初にレビューしても、実際のところ1カ月で壊れたりするので、買ってすぐにレビューせず1カ月間寝かせてみました。

これが買ったとき当時のものです。よく言われるのですが箱が某アレに似ています。というかまんまです。

合わせて買ったものとして、横にあるのはXiaomi Mi band 2というヘルスロギングツール。まあ簡単に言うと時計兼万歩計兼ヘルスケア用品です。

gearbestさんでredmi note 3 proは140ドルくらい。Xiaomi Mi band 2は30ドルです。

Redmi note 3 proのスペックのコストパフォーマンスだけを見るとすごく高いです。

基本的なスペックはROM 16GB,RAM 2GB,SoCはSnapdragon 650、フロントとリアカメラ、あとは指紋認証。
Snapdragon 650はantutu 70000程度のレベルで、日本で3,4万で売ってるP9 Liteあたりよりも性能はいいです。
実際のところ、日本で売られている機種は太刀打ちできないレベルのスペックという魅力があります。スペック至上主義の私としては最高です。
まあ、耐久性とかはどうなるかわかりませんが、そこは国内7位にまで落ちてしまったけどXiaomiさんのブランドということで買いました。

Xiaomi好きなんですよね。コンセプトとかブランド感を醸し出しているのに、中華っぽいところとか。
この前出した炊飯器とかもちょっとほしいくらいです。おどり炊きの創案者が開発にかかってるとかで注目してます。
でも炊飯器なので日本のコンセントで大丈夫かな・・・と思わなくもないですが・・・

結局中国サイトから発送に関してはいろいろ言われていますが、自分に限ってはかなり早い段階で着きました。というより予定通りでした。

gearbestは現在、発送方法としておなじみの「日本郵便(Japan Post)」が選べるようになっています。 (Priority Line選択時

日本郵便の場合、発送は7-10日。しかも送料無料です。1週間で届きます。いい時代ですね・・・。

で、使いごごちですが、AndroidベースのMIUIという某PhoneっぽいカスタムUIが採用されています。実際、これも使ってみたかったということも買った理由です。
かなりよくできてると思います。でもAndroidっぽくないなあと思うのですが。
あとは、指紋認証。この値段帯で指紋認証までついてるというのは本当に驚き。iPhone 6Sを持ってますが、それと同じくらいレスポンスは早いしロック解除できるので使いやすいです。
2カ月が立とうとしてますが、基本アプリの検証機として買ったものなので、壊れる気配はないです。
まあ今まで中華的なパッドを使った経験からすると、大体は突然死なのでわかんないですのよね・・・。

Mi band 2はわりとスマートな時計としても使えます。でも一番役に立ってるかなーと思うのは公式アプリで測ってくれる睡眠時間のロギング。

これはかなりの精度で寝た時間を記録してくれます。一日7時間よく寝る自分にとっては嬉しい機能です。

つーか二度寝とかもちゃんと記録されるし、布団に入っているだけだと記録されないし、どうやって判定しているのかかなり気になります。
ほかにも通知機能だったりとfitbit某製品と同じレベルの機能は備わっています。
今ならセールでこちらは25ドルくらいで売ってるのを見かけます。こういうの欲しいと思ってた人は損はないでしょう。
Xiaomiのアカウント作らないといけないのがちょっとアレですが、それくらい。

最近はモニタも買ったし、グラボも買ったし、スマホも買ったし、社会人の財力で生活レベルがどんどん上がっていきます。

次はMacBookかな。

[JavaScript/ECMAScript2017]async/awaitとPromiseでjavascript直列/並列処理

potproject.net Advent Calendar 201610日目の記事です。

祝!10日連続更新!


ES8にあたるECMAScript2017では、await/asyncが実装されると聞いて。黙っちゃいられねえ。

まだES2017は策定中ですが、なんかEdgeでも動くようになったらしいし(設定は必要)、多分ほぼ確定。内定状態でしょう。

https://tc39.github.io/ecma262/

しかし、やはり標準では動かないので、このコードはbabelでトランスパイルしてnode.jsで動かしてます。ご了承ください。

await/async修飾子は、元々C#で使われていた非同期処理を同期的に記述できる仕組みです。

一時期C#を使っていてユニバーサル Windows プラットフォーム (UWP) アプリを作っていた時があり、

制約がありすぎて普通にWindows formsで作りてえと思いつつその時に使用しておりました。

基本的に使い方はC#もjavascriptも同じです。しかし、当然javascriptにはTask型なんてありませんので、Promiseがそれの代用になります。

つまりは、await/asyncを使うにはPromiseから習得する必要があります。

なので、ここではPromiseに関しても軽く記載しておきます。

Promiseに関しては、非同期の処理を上手く同期的に見せたり、並列処理が出来るメソッドです。

何が違うかというと、書き方が違います。await/asyncは非同期処理を同期的に行うため、結局直列の処理になりますが、Promiseは並列処理が可能です。

今回書くコードは、Promise.allでの並列処理とawait/asyncでの直列処理の比較です。

プログラム的には、1から指定された数まで全て足して出力するだけの処理です。

arr.reduceを使った非同期処理方法とfor文を使った同期処理方法で、それぞれ処理をして表示します。

一応速度も出力します。

//繰り返し回数
const execute_count=10000000;
(async ()=>{
  //await/asyncでの直列処理
  var startTime = new Date();
  var sumtest = await reduce_sum(execute_count);
  var normalsumtest=normal_sum(execute_count);
  var endTime = new Date();
  if(sumtest===normalsumtest){
    console.log("(await/async):" + (endTime - startTime) + "ms ans:"+sumtest);
  }

  //Promise.allでの並列処理
  var startTime2 = new Date();
  var sumexecute=await sum(execute_count);
  var endTime2 = new Date();
  console.log("(Promise.all):"+(endTime2 - startTime2)+ "ms ans:"+sumexecute);
})();

async function sum(num){
  return new Promise((resolve,reject)=>{
    Promise.all([normal_sum(num), reduce_sum(num)])
    .then(function(sum_result) { 
      if(sum_result[0]===sum_result[1]){
        resolve(sum_result[0]);
      }else{
        reject();
      }
    });

  });

}

function normal_sum(num){
  var arr=[];
  for(var i=1;i<=num;i++){
      arr.push(i);
  }
  var sum = 0;
  for(var x=0;x<arr.length;x++){
    sum+=arr[x];
  }
  return sum;

}

async function reduce_sum(sum){
    return new Promise((resolve,reject)=>{
      var arr=[];
      for(var i=1;i<=sum;i++){
        arr.push(i);
      }
      return resolve(arr.reduce(function(prev, current) {
        return prev+current;
      }));
    });
}

結果はこんな感じ。

(await/async):690ms ans:50000005000000

(Promise.all):786ms ans:50000005000000

並列の方が遅い。ほぼ変わらずです。なんで?って感じですが、多分これが正しいと思います。

javascriptはご存知の通りシングルスレッドなので、並列処理だからってスレッドを増やしたりできません。

シングルスレッドということは同時に別の処理をやることはできないので、だから結局のところ疑似並列処理なだけです。

むしろ並列にしたほうが割り込みが入るので、遅くなると思います。

実際トランスパイラしてるというのもあるし、await/async/Promiseの処理時間とかもあるので上の時間は多分あてになりません。

一番の問題は、コードの見やすさです。

await/asyncを使えばメインのコードにコールバックを一切入れることが無くなるため、見やすいんじゃないかなと思います。

自分は積極的にawait/asyncは使っていきたいです。もうコールバック地獄には入りたくない・・・。

[React Native]ネイティブモジュール(Swift)を使う[iOS編]

potproject.net Advent Calendar 20169日目の記事です。


react-nativeをとりあえずすぐ実機で動かしてみる

で、とりあえず実機で動くかの確認は取れました。
で、今回は、React Nativeとネイティブコードの連携をやってみたいと思います。

React NativeはiOSやAndroidを共通のJavascriptで書いてマルチプラットフォームでしかもネイティブに動くよ!というのがウリです。

しかし、当然ながら、SwiftやObjective-Cを使うようなものも必要になります。カメラとかプッシュ機能。

まあメジャーなものは用意されてる場合もあるんですが、マイナーなものは無かったりするので、

自分で作ってね!ってことでネイティブモジュールという機能で補完できるようになってます。

Cordovaを思い出す。しかしこっちは完全ネイティブなのだ。

このあたりを参考にしました。しかしまあやっぱり例によってSwift3.0なので結構コード変えてたりもします。
React NativeでNative機能をSwiftで書いて使うには

Native Modules

Objective-Cは全く分からないのでSwiftです。でもブリッジしなくてはならないので多少はObjective-Cは避けられないんだなあこれが。
原則、React NativeはネイティブモジュールにSwiftを使うように設計されていません。生成されたプロジェクトもObjective-C用で生成されます。

なので、使うにはObjective-CとSwiftを連携させる必要があります。

swiftでモジュールを作成

まずは、モジュールを作成します。ちなみにこれだけだとまだ動きません。
端末の時間を取得してAny(Dictionary)型でコールバックを返します。

どうやらReact Nativeのjavascriptにデータを受け渡す際は必ずcallbackなのかな。
ちなみにPromiseも使えます。

ReactNativeModule.swift

import Foundation

@objc(ReactNativeModule)
class ReactNativeModule: NSObject {

  @objc func callbackMethod(_ callback: RCTResponseSenderBlock) -> Void {
    // システムのカレンダーを取得
    let cal = Calendar.current
    // 現在時刻のDateComponentsを取り出す
    var dataComps = cal.dateComponents([.year, .month, .day, .hour, .minute], from: Date())
    let object = [
      "year":dataComps.year!,
      "month":dataComps.month!,
      "day":dataComps.day!
    ]
    callback([object])
  }
}

配列で返しても大丈夫なの?と思いでしょうが、ちゃんとReact Native側はjavascript Object型で受け取ってくれます。優秀です。  
callbackMethodの第一引数が無名関数がなっているのは、このあたりの問題から。認識してくれないのです。Swift3.0での変更点となります。
Got “is not a recognized Objective-C method” when bridging Swift to React-Native – stackoverflow

Objective-Cでエクスポートする

ReactNativeModuleBridge.m

#import "RCTBridgeModule.h"

@interface RCT_EXTERN_MODULE(ReactNativeModule, NSObject)

RCT_EXTERN_METHOD(callbackMethod:(RCTResponseSenderBlock)callback)
@end

実際はこのObjective-Cが読み込まれます。これが上で書いたSwiftコードの橋渡しになります。

Objective-Cの文法は相変わらず割と理解できていない。

testreactnative-Bridging-Header.h

#import "RCTBridgeModule.h"

RCTBridgeModule.hというObjective-CのコードをSwiftで読み込むために設置。
このあたりに関してはググるといっぱい出てくるため割愛。

React Native側のソースはこんな感じ。画面の更新もしたかったのだが、結構時間掛かりそうで・・・ただログ出すだけ。

index.ios.js

import React, { Component } from 'react';
import {
  NativeModules,
  AppRegistry,
  StyleSheet,
  Text,
  View
} from 'react-native';
var nm=NativeModules.ReactNativeModule;
nm.callbackMethod(function(res){
    console.log(res);
});

これでデバッグ画面からログが確認できました。

ちゃんと{"year":2016,"month":12,"day":9}と出てきます。Any型も受け渡せるのは楽でいいですねえ。

今回、タイトルが(iOS編)です。

これで気づいた人もいるかもですが、明日はネイティブモジュール(Java)を使う[Android編]をやります。多分。