PR TIMESデザイナー&エンジニアブログ BREAK TIMES

PR TIMES Developer Blog(デザイナー&エンジニアによる開発者ブログ)

PR TIMES Developer Blog

当ブログは下記URLに移転しました。
https://developers.prtimes.jp/

IFTTTを利用してAlexaからSlackにタスクを送る方法

こんにちは。PR TIMESのエンジニアの吉です。

みなさんはAlexaについてご存知でしょうか。簡単に説明しますとAlexaはAmazon版siriです。siriはiphone,ipadから呼び出すことができますがAlexaはAmazon Echoから呼び出すことができます。

Amazon Echoはまだ日本では発売されていませんが、Amazon USAから購入できます。
http://www.amazon.com/Amazon-SK705DI-Echo/dp/B00X4WHP5E/ref=sr_1_1?ie=UTF8&qid=1456033135&sr=8-1&keywords=echo

AlexaではAmazon Prime Music/Spotify/pandoraなどから音楽を再生、Kindle Booksの読み上げAmazonから商品購入、タスク管理など様々なサービスを利用することができますが、日本では残念ながら使えるサービスが限られています。

でも安心してください!! IFTTTを使えば日本でも様々なサービスをAlexaに連携させることができます。
f:id:breaktimes:20160221161225p:plain


IFTTTにはAlexa関連レシピがたくさんありますので、日本でもAlexaを利用できます。一例として今回のブログではAlexaからslackにタスクを送る方法を紹介したいと思います。まず、IFTTTのユーザー登録をし、ログインしましょう。

ブラウザーヘッダーのユーザー名をクリックしてcreateを選択
f:id:breaktimes:20160221161526p:plain

thisをクリック
f:id:breaktimes:20160221161618p:plain

キーワード検索にalexaを入力し選択する
f:id:breaktimes:20160221161638p:plain

ConnectをクリックしAmazonアカウントを入力してAlexa認証を行う
f:id:breaktimes:20160221161658p:plain

Continew to the next stepをクリック
f:id:breaktimes:20160221161716p:plain

Choose a Trigger > Ask what's on your To Do Listを選択
f:id:breaktimes:20160221161738p:plain

Create Triggerをクリック
f:id:breaktimes:20160221161753p:plain

thatをクリック
f:id:breaktimes:20160221161808p:plain

Choose Action Channelのキーワード検索にslackを入力し選択する
f:id:breaktimes:20160221161823p:plain

ConnectをクリックしSlackの認証を行う
f:id:breaktimes:20160221161838p:plain

Continew to the next stepをクリック
f:id:breaktimes:20160221161857p:plain

Choose an Action > Post to channelを選択
f:id:breaktimes:20160221161910p:plain

タスクを表示したいSlackのチャンネルを選択しCreate Actionをクリック
f:id:breaktimes:20160221161923p:plain

Create Recipeをクリック
f:id:breaktimes:20160221161943p:plain

レシピ作成完了
f:id:breaktimes:20160221162013p:plain

わずか数分でAlexaとSlackの連携が完了しました。AlexaからタスクをSlackに通知してみましょう。

alexa put message on my to do list

いかがでしょうか。IFTTTという素晴らしいサービスを利用すればAlexaは日本でも十分活用できます。また、Alexaは自分でもプログラミングができます。エンジニアにとっては魅力的ですね。音声でサーバーを構築できるVoiceOps時代は来るかもしれませんよ!

次回はAlexa Skills Kitを利用してAlexaのプログラミング方法について紹介したいと思いますのでブログ読者登録よろしくお願いします!

FITC TOKYO 2016レポート

こんにちは、PR TIMESデザイナーの新井です。

先日、デザイン・アート・テクノロジーの分野で活躍しているクリエイターを招待してプレゼンテーションを行うFITC TOKYO 2016にスポンサーとして協賛させて頂きました。
f:id:breaktimes:20160222200327j:plain
イベントは2日間にわたって開催されましたが、今回の記事では1日目に参加したときのレポートをご紹介させていただきます。

FITCは、参加者にインスピレーションを与え、学ぶ場を提供し、課題を投げかける、デザインとテクノロジーに特化したカンファレンスやセミナーを世界中で開催しています。2002年より、トロントアムステルダム、東京、サンフランシスコ、シカゴ、ソウル、ニューヨーク、ロサンゼルスをはじめ世界の各都市で、志を同じくする専門家や学生を集めたイベントを開催しています。FITCのイベントは常に、インタラクティブ、テクニカル、デザイン、ビジネスに関連する最先端の話題を取り上げ、急速に変化し続ける業界で活動する参加者たちが最新の情報を得るために欠かせない、専門性の向上およびネットワーキングの機会を提供しています。FITCは独自で、または他のイベント団体と協力して、年間を通じて多数のイベントを開催しています。

公式サイト

完璧なWebデザイナー

いつも仕事で使用しているAdobeのプレゼン。AirbnbやUber、Kickstaterといったクリエイティブなサービスはどんどんでてきているが、webは型が決まってきてつまらないものになってきている。その原因の一つに色々なデバイスが登場し、それぞれに対応するのが大変になったということです。それを解決するためにレスポンシブデザインがうまれ、レスポンシブデザインをリアルタイムに実現するAdobe Museを使用すると、デザイナーがコンテンツをいかにうまく見せるかということをデバイス間を超えてクリエイティブに表現できるといった内容でした。プロダクト開発の背景からプロダクトのメリットまで一連の流れが素晴らしいプレゼンでした。デザインからHTML/ CSS/ JavaScriptも書き出せるそうなので試しに使ってみてはいかがでしょうか。

型を破る

ロスアンゼルスを拠点に広告、ポートレイト、映画、サメの写真を撮っているフォトグラファーのMichael Mullerのプレゼン。これまでの写真を年代順に紹介し、彼が撮りたい対象や仕事を実現するためにあらゆる手段を使って実現してきたことを紹介してくれました。広告写真で成功を収めた彼がどうしても撮りたかったのが、映画の宣伝ポスターの写真でした。そこで彼はたまたま赤信号で車を止めた時に、ストーム・トルーパーがタバコを吸っていたのでそれを写真におさめました。それから、チャイニーズシアター前などにいるパフォーマー達を撮影し始めたのです。その写真が映画会社の偉い人の目にとまり、マーベル関連の写真は彼がほとんど撮影するようになったそうです。

言い訳を言わずにやってみること

ハイクオリティな広告や映画のVFXで知られるThe MillでECDをやっているRama Allenによるプレゼンテーションは今話題のVRについてでした。Oculus RiftやLGなど各社からヘッドマウントディスプレイが発表され、2016年はVR元年になるといわれていますよね。Ramaはアートとテクノロジーを融合していかに観客に魔法をかけられるかということをThe Millの事例を元に紹介してくれました。
感情移入させること
独房の囚人の生活を体験できる“6X9: AN IMMERSIVE EXPERIENCE OF SOLITARY CONFINEMENT”では、観客を感情移入させるために光で1日の移り変わりを表現し、実際の独房で聞こえてくる音を録音して仕様しているそうです。音は視覚とタイミングを合わせると、視覚以上にVRの体験を作る上で重要になるそうです。
www.youtube.com

全身をつかう
https://j.gifs.com/yP68xn.gif
全身をつかって仮想現実をコントロールするというのは新しいことではありません。
ですが、360度の映像とモーションを組み合わせたものは新しい試みです。
LEXUSがホバーボードを開発しましたが、それを体験できるのはバルセロナにある公園だけです。
それをどこでもできるようにして欲しいという依頼があり、つくったのがこちらです。VRには人を不快にするVR酔いがあると言われています。フレームレートを何回も調整して酔いをおこさないようにしたそうです。これからゲームと映画の間のコンテンツがどんどんでてくるのだろうなと思いました。

どの人も安全なところを捨て去り、挑戦しているのが印象的でした。
後半戦はまた次回に

BREAK TIMES NITE 〜急成長サービスをつくっている人の考え方

こんにちは。
PR TIMESフロントエンジニアの山田です。

昨日、6回目となる「BREAK TIMES NITE 〜急成長サービスをつくっている人の考え方」を開催しました!
新オフィスに移転して1ヶ月、外部からのお客さまを招いてのイベントは初となります。
今回は株式会社トランスリミットの代表取締役 高場大樹さまをお招きして開催いたしました。

17:00
準備中開始です!
f:id:breaktimes:20160219195126j:plain

19:00
軽い懇親会からスタート。セッション前にみんなで交流して、場を暖めます。
f:id:breaktimes:20160219194950j:plain

19:40
まずはPR TIMESのことをお話させて頂きました。
Techを使ってプレスリリースを進化させているPR TIMESを説明。
f:id:breaktimes:20160219195316j:plain

19:50
トランスリミット高場さまの登壇です。
「Brain Wars」「Brain Dots」をヒットさせて来た考え方を熱く語って頂きました。
f:id:breaktimes:20160219195522j:plain



参加者のみなさま、ありがとうございました!
7回目に向けて準備を始めます!
次回もご期待ください。

chrome エクステンション 7選

フロントエンジニアの本間です。 

今回は業務スピードが上がる便利なGoogle Chrome拡張機能を紹介します。
エンジニアに限らず、色々な人が使える汎用的な物もご紹介します。
使えそうな物があれば幸いです。

まずはこれ 

1,
chrome.google.com

Webデザイナーの方は必須!ブラウズ上ならどこでもカラーコードを調べらます。操作も簡単、調べたいところでクリックするだけ


2,
chrome.google.com

先ほどのピクセル版です。どこでもピクセルが図れます。こちらの操作はドラックするのみ! 


3,
chrome.google.com

これは表示しているサイトのhtmlをチェックしてタグの過不足などを検出してくれます。初歩的なミスを指摘され、赤面する前に入れときましょう。 


4,
chrome.google.com

サイトのキャプチャを取ってくれます。全体、部分キャプチャ、簡単な図形や文字で注釈をつけられます。この手のキャプチャツールの中では一番使いやすいかなと思います。 


5,
chrome.google.com

英語のドキュメントを読む時の強い味方です。カーソルを乗せると単語の辞書を引いてくれます。さらにその場で発音もチェックできます。 


6,
chrome.google.com

Angular.jsの開発補助。scopeのwatch数を計測できるのでSPAを作る上で、必ずぶつかるメモリリーク問題の解決策を考える上で、数値の測定は欠かせません。 


7,
chrome.google.com

だいぶ前に話題になりました。音で周辺の人にURLを共有できます。可愛らしい音の中にURL情報が入っていると思うと、びっくりしますよね。使い道はともかくアイディアが素晴らしいです。



いかがだったでしょうか。
便利な物はガンガン使用して、リズム良く開発したいですね。 
JavaScriptで自作もできるので、自分の便利ツールを作成するのも面白いと思います。

古いPHPアプリケーションの環境刷新

エンジニアのアカイです。

今回は古い環境で動作している古いWebアプリケーションの対応ということで、
環境を可能な限り新しいものに入れ替える試みです。

古い環境は以下のようになっています。


この状況は、CentOS6の標準rpmをインストールした場合に選択されるものですが、
PHP7も正式にリリースされた今、この環境を使用し続けるのは抵抗があります。

想定している状況は以下の通りです

  • サーバ群をすべて新しい環境へ移行
  • OSは最新のものを使用
  • Apache/PHPはアプリケーションが動作する範囲で最新を選択
  • 上記環境へ移行するためのプログラム修正ができる環境構築

今回はこれらの作業ログになります。

対処すべき内容の確認

PHP公式にバージョン移行のガイドがあります。
関数は仕様変更や非推奨・廃止などがあると思いますので、確認は必須です。

5.3系以前から入れ替える場合、この内容を確認しただけで眩暈がします…

細かいコーディング部分の対応はできた環境で徐々に行うとして、
まず初めにある程度ページを閲覧できる状態にするところまでやりたいと思います。

環境構築

最初に、CentOS6で実行することを想定したchefレシピをそのままCentOS7で動かしてみました。

  * yum_package[php-devel] action install
    - install version 5.4.16-36.el7_1 of package php-devel

そのままではPHPは5.4になるようです(apacheは2.4系です)。

今回の場合は、少なくとも5.6系にはしたいので、phpenvを使用して最初から5.6系をインストールしてしまいます。

実際にはansibleを使用してインストールしましたが、
実行コマンドはおおむね以下のような感じです。

# git clone https://github.com/CHH/phpenv.git
# phpenv/bin/phpenv-install.sh
# cd ; mv .phpenv /usr/local/phpenv
# git clone https://github.com/CHH/php-build.git /usr/local/phpenv/plugins/php-build
# echo -e "export PHPENV_ROOT=/usr/local/phpenv'\nexport PATH=\$PHPENV_ROOT/bin:\$PATH\neval \"\$(phpenv init -)\"" > /etc/profile.d/phpenv.sh
# git clone https://github.com/garamon/phpenv-apache-version.git /usr/local/phpenv/plugins/phpenv-apache-version
# . /etc/profile
# phpenv install 5.6.18
# cp /etc/httpd/modules/libphp5.so /usr/local/phpenv/versions/5.6.18/
# phpenv apache-version 5.6.18

httpd起動は様々な設定を修正しないと動作しない状態でしたが、
なんとか起動・ページの表示を確認できました。


pearの対処について

古いPHPアプリケーションの移行において、これはかなり多い問題のように思います。

基本的には、可能であればすべての部分で廃止・差し替えが望ましいです。

使用せざるを得ない場合、種類が少ない場合でも、
PEARの基本クラス部分に修正が必要になるため、
逐一確認して修正していく必要があります。

また、インストールする場合、pearコマンド/composerが使用できますが、
今回の目的においては避けるべきです。

理由は、pearのライブラリはphp4系向けに作られたものもある状態なので、
パッケージ管理を使用してしまうと、非推奨コードを除去する際に各ツールの管理下にあるコードを変更することになってしまうからです。

現状使用しているものについてはリポジトリ管理下に含めて直接編集し、
追加でパッケージは使用しない方針がよいでしょう。


参考までに、pearをcomposerで管理する場合は以下のようにします。

$ composer config repositories.0 pear http://pear.php.net
$ composer require "pear-pear.php.net/Net_SMTP=*"
$ composer require "pear-pear.php.net/Net_UserAgent_Mobile=*"
$ composer require "pear-pear.php.net/Net_UserAgent_Detect=*"

細かい部分は未検証ですが、具体的な対処は例えば以下のように行いました。


PEAR.php

-function isError($data, $code = null)
+public static function isError($data, $code = null)

-function staticPushErrorHandling($mode, $options = null)
+public static function staticPushErrorHandling($mode, $options = null)

-function staticPopErrorHandling($mode, $options = null)
+public static function staticPopErrorHandling($mode, $options = null)


上記の修正でとりあえずStrictメッセージ等は除去できました。

これで、移行に向けてプログラム修正を行える環境を作成できました。


あまり役に立つ情報はありませんが、バージョンの古い環境はいつか限界を迎えますので、
時間と労力の許す限り、安心できる動作環境を構築する努力をしましょう。

簡単にビデオ通話アプリをつくれるSkyWayのご紹介☆*:.。. [WebRTC]

PR TIMES エンジニアのうさみです。
先日、開発していたアプリをお披露目した時のことです。

社内スタッフの声:
「このアプリにビデオ通話機能があるといいですね」
「・・・というより、無いと不便で困ります」

私:
「・・・(あと1日でビデオ通話機能の追加!?)」

元々の仕様としては、SlackのAPIを叩いて指定したSlackのチャンネルへ通知するというシンプルな機能だけだったのですが、急遽ビデオ通話機能を追加することになったのでした。こういうシチュエーション、よくありますよね・・・

ビデオ通話機能をもったアプリ開発の経験は無く、時間もありませんでした。また、社内でのみ利用するアプリでしたので、開発コストを掛けずに確実に動作させるために何かいい方法は無いかと調べている中で、NTTコミュニケーションズ様の「SkyWay」というサービスを知りました。

nttcom.github.io

以下のサイトには、NTTコミュニケーションズ様が「SkyWay」を開発された経緯や今後の展開について記載されています。(2015年8月時点)

IP電話の次に起こるパラダイムシフト "WebRTC"への挑戦
http://www.ntt.co.jp/journal/1508/files/jn201508036.pdf

国内製で且つ大手企業さまによるサービス提供、また、公式のサンプルや日本語のドキュメントもあるため、取り入れやすそうだと直感し、利用してみることにしました。何より無料で利用できるとのいうのはうれしいです (* ´ - ` *)

WebRTCを利用するのは初めてでしたので、そもそも「WebRTC」とは何かというところから・・・

WebRTC (Web Real-Time Communication)とはWorld Wide Web Consortium (W3C)が提唱するリアルタイムコミュニケーション用のAPIの定義で、プラグイン無しでウェブブラウザ間のボイスチャットビデオチャット、ファイル共有ができる。

引用元:WebRTC - Wikipedia


下記サイトではWebRTCについてまとめていらっしゃいます。

・WebRTC とはなんだったのか ← WebRTCの基本的なことはコチラ
https://gist.github.com/voluntas/67e5a26915751226fdcf

・WebRTC トラノマキ ← WebRTCの今後についてはコチラ
https://gist.github.com/voluntas/59a135343538c290e515

つまり、チャット機能やファイル共有機能、そしてビデオ通話機能を実装するために必要となるもの(面倒なところ)を提供してくれるサービスですね。サーバーを用意してバックエンド側を実装する必要がないので、クライアント側のアプリ開発に注力することができるのはいいですね。


どういうものか把握できましたので、いざ実装を・・・といきたいところですが、今回はご紹介までにさせていただき、実装方法については割愛させていただきます。

下記の公式のサイトとサンプルを見ていただくと実装にあたり丁寧に説明されていますのでご確認ください。

・SkyWay iOS/Android SDK ← SkyWayを利用するにあたっての事前準備についてはコチラ
https://nttcom.github.io/skyway/info-mobile.html

・SkyWay iOS SDK DOCS ← SkyWayを利用して開発している際に参考にするページはコチラ
https://nttcom.github.io/skyway/docs/#iOS

・SkyWay iOSサンプルアプリ ← チャット機能やビデオ通話機能を搭載したアプリのサンプルはコチラ
https://github.com/nttcom/SkyWay-iOS-Sample

公式のサイトの他に下記サイトも参考にさせていただきました。

qiita.com


実際に実装してみたところ、あっという間にビデオ通話アプリをつくることができました。1時間・・・いえ、30分もかからなかったでしょうか・・・まさに開発コストをかけずに実現することができました! ただ、実機での検証には十分に時間を費やす必要がありますね ( ´ - ` )

以上の参考にさせていただいたサイトやサンプルでは、端末を識別するのに利用するIDが動的なのですが、今回つくりたかったアプリは固定IDにする必要がありました。

次回は、固定IDによる実装方法をご紹介できればと思います☆*:.。.

複数サーバーでバッチを平行起動した時に便利すぎたSQLトランザクション

こんにちは、PR TIMESエンジニアの落合です!

みなさんも、普段バッチを作成する事があると思います。
1台のサーバーで、10分に1回などの実行に関しては、処理内容の事だけを考えてコーディングすればいいですが、
負荷分散や、バッチサーバーを冗長化する場合、複数台のサーバーで同時刻に実行したい場合もあると思います。
ただ、何も考慮せずに、複数台で起動してしまうと、重複した処理を実施してしまいます。
今回は、そういった時に、MySQLトランザクション機能を使って、簡単に解消出来た便利な機能を紹介させていただければと思います!

前提

サンプル用のテーブルは、以下のようになっている前提です。
データは、適当に10万件追加しました。

CREATE TABLE IF NOT EXISTS `site` (
  `id` int(13) NOT NULL AUTO_INCREMENT,
  `site_name` varchar(256) NOT NULL,
  `status` int(4) NOT NULL DEFAULT '0'
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='サイト情報';

プログラムに関しては、10万件のデータを1回のバッチで1000件ずつ処理を行い、5分置きに実行するようなバッチです。
今回は、サンプルなので、処理はせずに1件あたり1秒のスリープを実行しています。

$host = "localhost";
$user = "xxxxxxxx";
$pass = "xxxxxxxx";
$db = "develop";
$dsn = "mysql:dbname=$db;$host=$host;charset=utf8";

//まずは、DB接続
try{
    $pdo = new PDO ($dsn, $user, $pass);
} catch(PDOException $e) {
    var_dump("DB connected error!");
    exit();
}

// selectで1000件の情報を取得する。
$sql = "select * from site where status=0 Limit 2";
$res = $pdo->query($sql);

foreach($res as $v){
    // 取得したデータを、実行中のステータスに変更する。
    $sql = "UPDATE site SET status=1 where id=" . $v["id"];
    $res = $pdo->exec($sql);

    //実行処理内容が1秒かかるとします。
    sleep(1);

    // 取得したデータを、完了のステータスに変更する。
    $sql = "UPDATE site SET status=2 where id=" . $v["id"];
    $res = $pdo->exec($sql);
}
// 未実行件数を取得して、0件の場合は、ステータスを0に戻す。
$sql = "select count(*) as cnt from site where status=0";
$res = $pdo->query($sql);
$count_data = $res->fetch();
if($count_data["cnt"] == 0){
    $sql = "UPDATE site SET status=2 where id=" . $v["id"];
    $res = $pdo->exec($sql);
}

処理時間が同時刻に複数サーバーで実行した場合、ループ処理中に時間がかかると、最初に起動したバッチと、2台目に起動したバッチが、取得する内容が重複する為、このままだと分散処理が正常に行えない事象が発生してしまいます。

SQLトランザクションを使用して解消!

MySQLトランザクションには、4段階の分離レベルが存在しています。
ここで、全てを話してしまうと長くなってしまうので、割愛します。
以下のページに詳しく解説してありますので、ご参考にしてください!
MySQLのトランザクション分離レベル

さて、このトランザクションの挙動を応用して、解決したいと思います。
まず、アップデート自体を禁止する為の設定や、読み込み自体を拒否するような設定などがありますが、
今回はserializableに設定を行って、commitを実行しない限り、ロック中のレコードには、selectをしても返却されない状態にしたいと思います。

ロック用のテーブルを用意する

今回のSQLでは、該当するレコードをロックしてしまうので、処理実行中かを判断する為のテーブルを用意します。
そこに、レコードで実行プログラム名を追加していきます。

CREATE TABLE IF NOT EXISTS `cron_lock` (
  `id` int(13) NOT NULL AUTO_INCREMENT,
  `name` varchar(256) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='ロックテーブル';

ALTER TABLE `cron_lock` ADD PRIMARY KEY (`id`);

INSERT INTO `cron_lock` (`id`, `name`) VALUES(1, 'test.php');

それでは、ロックデーブルが完成したら、sshを2個立ち上げて、テストしてみます。

#プロセスAで実行
mysql> use develop
mysql> SET tx_isolation = SERIALIZABLE;
mysql> SET innodb_lock_wait_timeout=30;
mysql> START TRANSACTION;
mysql> select * from cron_lock where name='test.php' FOR UPDATE;
+----+----------+
| id | name     |
+----+----------+
|  1 | test.php |
+----+----------+
1 row in set (0.00 sec)

次に同じクエリを実行したら、レスポンスが返却されない事がわかると思います。

#プロセスBで実行
mysql> use develop
mysql> SET tx_isolation = SERIALIZABLE;
mysql> SET innodb_lock_wait_timeout=30;
mysql> START TRANSACTION;
mysql> select * from cron_lock where name='test.php' FOR UPDATE;
|
# ロックされているので返却を待っている状態です。

次に、プロセスAをcommitして、ロックを解除すると、プロセスBで順番待ちしているselectが実行されます。

#プロセスAで実行
mysql> COMMIT;

すると、プロセスBのSelectの結果が返却されると思います。

#プロセスBで実行
mysql> select * from cron_lock where name='test.php' FOR UPDATE;
+----+----------+
| id | name     |
+----+----------+
|  1 | test.php |
+----+----------+
1 row in set (20.91 sec)

結果は分かっていても、心の中では、オォォーって感動してしまいます。(笑)
さて、この挙動を応用して、複数同時起動しても実行待機してくれる仕組みをプログラムで作成していきたいと思います。

負荷分散対応バッチのプログラムについて

さて、先ほど作成したcron_logテーブルを用いて、プログラムにしていきたいと思います。

$db = "develop";
$dsn = "mysql:dbname=$db;$host=$host;charset=utf8";
//まずは、PDOでDB接続を行う。
try{
    $pdo = new PDO ($dsn, $user, $pass);
} catch(PDOException $e) {
    var_dump("DB connected error!");
    exit();
}

// cron_lockトランザクションを設定して、レコードをロックする。
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->query("SET innodb_lock_wait_timeout=30;");
$pdo->beginTransaction();
$sql = "select * from cron_lock where name='test.php' FOR UPDATE;";
$res = $pdo->query($sql);

// selectで1000件の情報を取得する。
$sql = "select * from site where status=0 Limit 2";
$res = $pdo->query($sql);
foreach($res as $v){
    // 取得したデータを、全件処理開始フラグを設定する。
    $sql = "UPDATE site SET status=1 where id=" . $v["id"];
    $array[] = $v;
}

// cron_lock解除
$pdo->commit();

foreach($array as $v){
    //実行処理内容が1秒かかるとします。
    sleep(1);

    // 取得したデータを、完了のステータスに変更する。
    $sql = "UPDATE site SET status=2 where id=" . $v["id"];
    $res = $pdo->exec($sql);
}

// 未実行件数を取得して、0件の場合は、ステータスを0に戻す。
$sql = "select count(*) as cnt from site where status=0";
$res = $pdo->query($sql);
$count_data = $res->fetch();
if($count_data["cnt"] == 0){
    $sql = "UPDATE site SET status=2 where id=" . $v["id"];
    $res = $pdo->exec($sql);
}

最後に

今回のコードは、あくまでも参考までのコードでしかありませんが、これらをクラス化しておき、
色んな多重起動するバッチに使用するのもいいかと思います。
設計時に、色々考え、考慮したのですが、毎分実行するようなプログラムで、処理が追いつかない時に、複数のプロセスで同時起動したい場合などにも使える機能だと思います。
実行時間短縮に、プロセスをForkして、並列処理を実行して、速度を担保したとしても、複数サーバーで実行出来ていれば、冗長化出来ているので、安心できます。

今回は、簡単だと思った事が、ちゃんと仕様として、考えたら、意外と難しかったというハマりについて向き合った結果、トランザクションの新たな使い方を発見したので、書かせていただきました。
これを機に、複数サーバーによる、バッチを同時起動する事で、サービスの事前処理などの速度改善に役立てたいと思っています。

リソース監視ツール:dstat

こんにちは、エンジニアの呉です。

今日はサーバーリソース監視についてお話ししたいと思います。Linuxではいろいろなコマンドがあります。例えばtop,uptime,vmstat,iotopなど、今回紹介したのはdstatコマンドです。

まずインストールしましょう。以下のコマンドで簡単にできます。

sudo yum -y install dstat

次dstatコンマンドを実行してみましょう

dstat

f:id:breaktimes:20160201000741p:plain

コマンドの書式

dstat [option/plugin] [更新時間] [ファイル]
✴︎[ ]省略可

デフォルトで1秒毎に以下の情報を更新されます。
  • total-cpu-usage :CPU
  • dsk/total :ディスク
  • net/total :ネットワーク
  • paging :ページング
  • system :システム
主なオプションは
dstat -h

f:id:breaktimes:20160201002926p:plain

プラグイン

データーベースなどの監視も行えます。dstatの場合はPythonスクリプトで書かれたプラグインで対応できます。
プラグインの場所は/usr/share/dstat/の配下にあります。以下のコマンドはプラグインのリストが表示できます。

dstat —list

サーバー監視は結構大変な仕事でした。いろんなツールを使って分析したほうがいいと思います。

「急成長サービスをつくっている人の考え方」- トランスリミット高場氏に登壇頂きます。

デザイナーの新井です。
PR TIMESでは、不定期で「BREAK TIMES NITE」という名前で外部講師を招いてセミナーをしています。6回目の今回は新オフィスでの初めての開催となります。
f:id:breaktimes:20160125125606j:plain
登壇講師にForbes誌の「日本の起業家ランキング2016ー凄いスタートアップ55選ー」や「注目のUnder30起業家10人」にも選出され、脳トレアプリ「Brain Wars」や「Brain Dots」と立て続けにグローバルな人気サービスをつくっているトランスリミットの高場大樹氏をお迎えして「急成長サービスをつくっている人の考え方」をテーマにお送りします。
アプリ開発のアイデアが生まれるまでのプロセスや、世界中の人を熱狂させるものづくりの秘密について、よいものを作るために意識していること、大切なこと、重要なこととは何かについて話していただきます。
エンジニアの方、起業を考えている方、お近くの方などみなさまのお越しをお待ちしております!
breaktimes.connpass.com

PR TIMESオフィス移転しました!

PR TIMESフロントエンジニアの山田です。

外苑前にオフィス移転してから1週間が経ちました。
エンジニアですが今回の移転プロジェクトにもメンバーとして関わっていましたので、ご紹介します。

まず以前のオフィスでは休憩スペースも小さく、他部署の方々とあまり交流する動線がない状態でした。そこで新オフィスでは広いカフェスペースやソファスペースを作り、集まれるような場にしています。
f:id:breaktimes:20160125200958j:plain

続きを読む