[MySQL]複数レコードを集約!!

タグ: | 投稿日: 投稿者:

あけましておめでとうございます。
takeです。

Web制作をしてる際、DBの複数レコードを1行に集約した結果を表示したい!!
って時がまれにあります。

View側でループし、複数レコードを1行に表示するように小細工してもいいのですが、
MySQLには「GROUP_CONCAT」という集約関数があります。

詳しくはここ

では、早速試してみましょう。

1.社員と部署の関係を持つテーブルを作成します。
20140108_01
作成した結果はこれ。
20140108_02
20140108_03
20140108_04

2.各テーブルにデータを設定します。
20140108_05

3.抽出した結果。
20140108_06

見てのとおり、john以外の人は複数の部署に所属しているので、複数レコード抽出されています。
この複数行の結果を、1行に集約する為に「GROUP_CONCAT」関数を使用します。

20140108_07

例にも示したとおり、「GROUP_CONCAT」内でorder by が使えます。
この他にも、group by 等も使えますので、かなり使い勝手はよいと思います。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

【復習】ルーティングの優先順位

あけましておめでとうございます。工藤です。

昨年からスッキリのど越しのスーパードライから、やや苦味のあるラガーへビールの好みが変わりました。

さて、ルーティングについてのお話です。

ルーティングの優先順位の決め方は「メトリック値の小さい方から」というのは誰しもが知るところかと思いますが、メトリック値が同じだった場合はどうなるの?

CIDRによるとプレフィックスの大きい順。つまりネットワークの小さい方が優先されます。

例)192.168.0.0/16のゲートウェイが192.168.100.1,192.168.1.0/24のゲートウェイが192.168.1.1だとすると、メトリック値が同じであれば192.168.1.0/24のルーティングが優先される。

サブネットの考え方を辿れば「そりゃそうだ」という事ですが、そんなネットワークの歴史に興味ねーし。

これらより、「デフォルトルートを変更したいけど、すでに設定されているデフォルトルートは書き換えたくない」といった要望を叶える事ができます。

0.0.0.0/1と128.0.0.0/1のルートを追加し、そのゲートウェイを変更したいIPに設定します。

具体的には下記のようになります。

0.0.0.0/0(default)     GW     1.1.1.1
0.0.0.0/1                   GW     2.2.2.2
128.0.0.0/1               GW     2.2.2.2

このようにすると実質的にデフォルトゲートウェイは「2.2.2.2」になります。

※規定されているルールですが、お使いのハードウェアが対応しているかはご自身でお確かめください。ちなみにwindowsやLinux、BSDは準拠しています。

今年もよろしくお願いします。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

extorage APIを公開しました!

タグ: , | 投稿日: 投稿者:

あけましておめでとうございます、ベッチです。

早速ですが、弊社のサービスであるextorageをご利用のお客様向けにAPIを公開致しました。

[extorage API] http://extorage.fairway.ne.jp/doc/

まだまだAPIとしては使いづらい部分もあるかと思いますが、是非ご利用ください。

今後ともextorageをよろしくお願いします。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

heartbeatで若干ハマる

タグ: | 投稿日: 投稿者:

こんにちは。工藤です。浅草界隈に生息しておりますが、仲見世はすっかり新年です。

CentOS 6でheartbeat3.0.5を使い、仮想IPとお決まりのDRBD、httpd、postgresql9.2をフェールオーバーさせようと試みた。

普通にharesourcesに

server01 \
IPaddr2::10.8.0.1/24/em1/10.8.0.255 \
MailTo::root::server01 \
drbddisk::r0 \
Filesystem::/dev/drbd0::/home \
postgresql-9.2 \
httpd

としてharesources2cib.pyを実行して、オラッと

# /etc/init.d/heartbeat start

したら、postgresqlまでは正常に動き出したが、httpdが上がったり落ちたりを繰り返している様子。

ググるとhttpd.confに”ExtendedStatus On”が無いなどの情報があり、一通りやってみたがどれも上手くいかない。

意を決してログを読むと

WARN: For LSB init script, no additional parameters are needed.

とあり、LSBでは余計なパラメータは不要との事。ocfでもない限りは<operation>はいらないっぽいので、cib.xmlから消して再読み込みさせてから再度オラッと

# /etc/init.d/heartbeat restart

したらhttpdも落ち着きました。プロセス監視が入っていませんが、取り急ぎ「動かす」事ができました。

最初からログを見れば良かったって話ですが、heartbeatのログはちょっと肌に合わないので…

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

[golang]マグマ大使よりステキなWebフレームワーク「Revel」

タグ: , | 投稿日: 投稿者:

norです。

今日はマグマ大使(Peeping Life バージョン)よりステキなWebフレームワーク

Revel

を紹介します。

Revel は Java/Scala 界隈で絶大な人気を誇る Play Framework を参考に開発されたWeb Application Framework です。

Play Frameworkのいいところどりをしつつ、golangの洗練された非同期処理機構によりコールバックという野蛮な押し込み強盗から身を守ることができます。

簡単にいいところを紹介しますと。

  • ソースコード変更自動検知による、ホットコードリロード
  • ノンブロッキング Web サーバ
  • フルスタック Web フレームワーク
  • ハイパフォーマンス
  • ステートレス
  • 非常に簡単な
  • golangで実装されている、golangで実装されている

という特徴をもっています。

特に、 Twisted や Tornado(Python)、EventMachine や Rev(Ruby)が好きな方、苦労したことがある方にはお勧めです。

golang でのノンブロッキングの実装の簡単さを経験すると、「君のサービス、サーバ何台で動かしてる? 僕ならきっと5分の1にできるよ(フフン」なんてブラックジャックも真っ青な勘違いをはじめてしまうほどアガります。

Erlang とか Huskell でごりごりサービス組み上げられちゃうような人も箸休めにどぞ。

※ nor は Erlang に片目をささげるほどの信者ですので、誤解のないよう

さて、golang への愛を語るのはこの程度にしまして、第1回ということで、今回は golang のセットアップから Revel で Web ページ表示までしてみたいと思います。

インストール

GOPATHの設定

mkdir ~/gocode
echo 'export GOPATH="$HOME/gocode"' &gt;&gt; ~/.zshenv
source ~/.zshenv

golang のインストール(マカー以外は知りません)

brew install go

Revel のインストール

go get github.com/robfig/revel

Revel のビルド。

go get github.com/robfig/revel/revel

$GOPATH/bin以下にコマンドがビルドされているので、PATHを通す。

echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.zshenv
source ~/.zshenv

Revel アプリケーションの作成

cd gocode
revel new my app
~
~ revel! http://robfig.github.com/revel
~
Your application is ready:
/Users/nor/gocode/src/myapp
You can run it with:
revel run myapp

Revel アプリケーションの実行

revel run myapp

http://localhost:9000 にアクセス
ss

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

git log表示のカスタマイズ

タグ: | 投稿日: 投稿者:

初めまして。kikuです。

プロジェクトのソースコード管理ツールはよくgitを使っています。

logコマンドをもっと見やすくカスタマイズしてみます。

下のコマンドは私がよく使用しているログコマンド

git log --graph --all --color --pretty='%x09%ad %x09%h %cn%x09%s %Cred%d'

上記コマンド解説

–-graph ツリー表示
–all  他ブランチ含む全てのログ表示
 –color  色
 –pretty  ログのフォーマット

また–prettyで見た目の変更や色々情報を追加しています。

%x09 タブ
%ad 日付
%h 短縮版ハッシュ
%s 件名
%Cred %Cred以降の色を赤色にする(%Cblue、%Cgreen等もある。リセットは%Creset)
%d branch名

上記以外にも色々なコマンドがあります。用途によって入れます。

–stat 各コミットで変更されたファイルの統計情報を表示する
–shortstat –stat コマンドのうち、変更/追加/削除 の行だけを表示する
–name-only コミット情報の後に変更されたファイルの一覧を表示する
–name-status 変更されたファイルと 追加/修正/削除 情報を表示する(–prettyで%ad使用時)

またprettyにも色々ありまして、私的に使えるのが[%cr]でこれは相対日付が出せます。
2週間前にコミットされていたら(2 weeks ago)のような表示になります。

表示の際は色指定を細かくやると見やすくてとてもいい感じです。

コマンドは長いですが最初のコマンドを更に改造したコマンドがこちら。

git log --graph --all --pretty='%x09%ad %x09%Cblue%h%Creset %C(yellow)%cn%Creset %s %Cred%d %Cgreen(%cr)'

是非お試し下さい。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

大阪の居酒屋ランチのバイキングルールをPythonで実装してみた

タグ: , | 投稿日: 投稿者:

こんにちはベッチです。

昨日出張で大阪に行ってきました。

大阪っぽい食事をしたかったのですが事前調査など全くしていなかった結果、大阪駅近くにある「新梅田食堂街」という所にある「梅田木曽路」という居酒屋ランチを食べる事にしました。

梅田木曽路

バイキング形式で550円でした。

安い。

ただし、安いバイキングという事で独自のルールが課せられます。

以下がそのルールです。

木曽路バイキングルール

いやー、ルールがやかましいですね!

でもコストパフォーマンス優れてる事考えれば特に気になりません。

ただし、ルール守らないとちょっとこわいおばちゃんに叱られます。

気になる方は是非行ってみて下さい。

という前置きはさておき、この梅田木曽路のバイキングルールをPythonで実装してみました。

module.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

MAX_COUNT = 1 # おかわりは1回まで

AMOUNT_SMALL = '少なめ'
AMOUNT_REGULAR = '普通'

FOOD_RICE = 'ごはん'
FOOD_MISO_SOUP = 'みそ汁'
FOOD_SIDE_DISH = 'おかず'
FOOD_FRUITS = 'フルーツ'
FOOD_OMELET = '玉子焼'

class Food:

	def __init__(self, name, amount, human):
		self._name = name # 名前(ごはん、みそ汁、おかず、フルーツ、玉子焼)
		self._count = 0 # おかわり回数
		self._amount = amount # 量
		self._first_amount = amount # 量
		self._human = human # 食べる人

	def get_name(self):
		return self._name
	def set_name(self, name):
		self._name = name
	def del_name(self):
		del self._name
	name = property(get_name, set_name, del_name)

	def get_count(self):
		return self._count
	def set_count(self, count):
		self._count = count
	def del_count(self):
		del self._count
	count = property(get_count, set_count, del_count)

	def get_amount(self):
		return self._amount
	def set_amount(self, amount):
		self._amount = amount
	def del_amount(self):
		del self._amount
	amount = property(get_amount, set_amount, del_amount)

	def get_first_amount(self):
		return self._first_amount
	def set_first_amount(self, first_amount):
		self._first_amount = first_amount
	def del_first_amount(self):
		del self._first_amount
	first_amount = property(get_first_amount, set_first_amount, del_first_amount)

	def get_human(self):
		return self._human
	def set_human(self, human):
		self._human = human
	def del_human(self):
		del self._human
	human = property(get_human, set_human, del_human)

class Human:

	def __init__(self, name):
		self._name = name # 名前
		self._lunch = []

	def get_name(self):
		return self._name
	def set_name(self, name):
		self._name = name
	def del_name(self):
		del self._name
	name = property(get_name, set_name, del_name)

	def get_lunch(self):
		return self._lunch
	def set_lunch(self, lunch):
		self._lunch = lunch
	def del_lunch(self):
		del self._lunch
	lunch = property(get_lunch, set_lunch, del_lunch)

	# 最初の準備をする
	def ready(self, name, amount):
		food = Food(name, amount, self)
		self.lunch.append(food)
		print name + 'を準備しました'
		return food

	# 食べる
	def eat(self, food):
		print food.name + 'を食べます'
		if food.human != self:
			print '[店員]自分のものは自分で食べなさいよ!'
			return

		if food.amount is None:
			print '[店員]' + food.name + '食べたければ自分で準備しなさいよ!'

		print food.name + 'を食べました'
		food.amount = None

	# おかわり
	def get_seconds(self, food, amount):
		food.count = food.count + 1
		print food.name + 'のおかわりをします'

		for my_food in self.lunch:
			if my_food.name is food.name:
				if my_food != food:
					print '[店員]器は最初に用意したものをつかってくれ!'
					return

		if food.name == FOOD_OMELET:
			print '[店員]' + food.name + 'はおかわりできないよ!'
			return

		if food.name == FOOD_SIDE_DISH:
			for my_food in self.lunch:
				if my_food.name == FOOD_RICE and my_food.first_amount == AMOUNT_SMALL:
					print '[店員]最初のごはんの量が少ないからおかずのおかわりはできないよ!'
					return

		if food.count > MAX_COUNT:
			print '[店員]' + food.name + 'のおかわりは既に一回してるだろ!'
			return

		if not food.amount is None:
			print '[店員]全部食べきってからじゃないとおかわりできないよ!'
			return

		food.amount = amount
		print food.name + 'のおかわりをしました'
		self.eat(food)

	# 帰る
	def go_back(self):
		for my_food in self.lunch:
			if not my_food.amount is None:
				print '[店員]' + my_food.name + 'がまだ残っているわよ!'
				return
		print 'ごちそうさまでした'

kisojiLunch.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

if __name__ == "__main__":

	import module

	betchi = module.Human('betchi')

	rice = betchi.ready(module.FOOD_RICE, module.AMOUNT_SMALL);
	miso_soup = betchi.ready(module.FOOD_MISO_SOUP, module.AMOUNT_REGULAR);
	side_dish = betchi.ready(module.FOOD_SIDE_DISH, module.AMOUNT_REGULAR);
	omelet = betchi.ready(module.FOOD_OMELET, module.AMOUNT_REGULAR);

	betchi.eat(rice)
	betchi.get_seconds(rice, module.AMOUNT_REGULAR)
	betchi.eat(miso_soup)
	betchi.eat(side_dish)
	betchi.get_seconds(side_dish, module.AMOUNT_REGULAR)

	betchi.eat(omelet)
	betchi.get_seconds(omelet, module.AMOUNT_REGULAR)

	betchi.go_back()

pythonが実行できる環境で「python kisojiLunch.py」ってやってもらえれば実行できます。

実行結果はこんな感じです。

ごはんを準備しました
みそ汁を準備しました
おかずを準備しました
玉子焼を準備しました
ごはんを食べます
ごはんを食べました
ごはんのおかわりをします
ごはんのおかわりをしました
ごはんを食べます
ごはんを食べました
みそ汁を食べます
みそ汁を食べました
おかずを食べます
おかずを食べました
おかずのおかわりをします
[店員]最初のごはんの量が少ないからおかずのおかわりはできないよ!
玉子焼を食べます
玉子焼を食べました
玉子焼のおかわりをします
[店員]玉子焼はおかわりできないよ!
ごちそうさまでした

みなさんもたまには身の回りのものを実装してみてはいかがでしょうか。

それでは良い週末を。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

jQuery検索機能付きプルダウンメニュー

タグ: | 投稿日: 投稿者:

はじめまして、モリです

入力項目でプルダウンメニューでリスト表示するときに便利なjQueryを紹介。

『chosen』というjQueryプラグイン
項目が多くなってくるとスクロールするのが大変ですよね、このプラグインを使用することで検索が出来るようになります。

chosen1

見た目はこんな感じ

chosen1

テキストのエリアに検索文字を入力するとドンドン絞られていきます。

chosen1

単一の選択だけではなく、複数のMultiSelectにも対応しています。

chosen1

使い方はClass属性に「chosen-select」を指定するだけ。

<select class="chosen-select" multiple="multiple" name="sample"><option value="">Optionを選択してください</option><option value="1">Option1</option><option value="2">Option2</option><option value="2">Option3</option><option value="2">Option4</option><option value="2">Option5</option>
</select>

ダウンロードはこちらからhttps://github.com/harvesthq/chosen/releases

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

日付取得で気をつけておきたい事

タグ: , | 投稿日: 投稿者:

はじめまして、ニタです。

早速ですが、PHPで「今から数日後」「今から数ヶ月後」の日付が欲しい場合、こんな書き方をすると思います。

// 今から2日後
date('Y-m-d H:i:s',strtotime(date('Y-m-d H:i:s',time()) . "+2 days"));

では、以下の条件ではどうでしょうか。


$date = "2012-8-31 00:00:00";
$res = date('Y-m-d H:i:s', strtotime($date . " + 6 month"));
print_r($res);

結果は「2013-03-03 00:00:00」となります。
ですが、8月31日の6ヶ月後なので、2月末日(2013-02-29)でないといけないと思います。

これはstrtotime()において、以下の様に判断しているからのようです。
・2012年8月31日の6ヶ月後は2013年2月31日

・2月31日は存在しない

・31日は28日から3日後。つまり3月3日

最初の時点で日付の正当性をチェックをすべきなのですが、間違ってますね。
なので、ここは多少面倒ですが日付の正当性チェックを挟むようにします。


$sdate = "2012-8-31 00:00:00";
// 年月日時分秒毎に分ける
$hour = date('H',strtotime($sdate));
$min = date('i',strtotime($sdate));
$sec = date('s',strtotime($sdate));
$mon = date('m',strtotime($sdate));
$day = date('d',strtotime($sdate));
$year = date('Y',strtotime($sdate));
// 6ヶ月後の月の1日
$ym = mktime($hour,$min,$sec,$mon + 6,1,$year);
$arrayYm = getdate($ym);
// 日を置き換えて日時の正当性チェック
if(checkdate($arrayYm['mon'],(int)$day,$arrayYm['year'])){
    // そのままの日付で日時取得
    $res = mktime($arrayYm['hours'],$arrayYm['minutes'],$arrayYm['seconds'],$arrayYm['mon'], $day, $arrayYm['year']);
}else{
    // 6ヶ月後の末日にして日時取得
    $res = mktime($arrayYm['hours'],$arrayYm['minutes'],$arrayYm['seconds'],$arrayYm['mon'], date('t', $ym),$arrayYm['year']);
}
print_r(date('Y-m-d H:i:s',$res));

こんな感じで日付の正当性チェックをしつつ日付取得を行うと、いいと思います。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

プレモルの宣伝でやってるエフェクトを真似してみた(その方式)

タグ: | 投稿日: 投稿者:

いかおです

映像関係のネタです

サントリープレミアムモルツのコマーシャルでやっているビールだけが黄金色に輝くエフェクトなんですが、やってみたいと思いました。

実はNFLの中継でピンクリボン期間に放映されたCF(?)で選手が身につけたピンク色のモノだけ発色しているのを見て実際にやってみようと考えたわけです。

先ず、ソースとしてUYVY422が入ってきて特定の色以外はモノにするので各画素のUとVは両方共”128″に塗り替えます(U,Y,Vそれぞれ8bit。1画素あたりは16bitね)。そういった画素データの書き換えで簡単にモノクロにはできるわけですね。そして、特定の色としてヒットした場合はそのまま加工せずにおいておけば、目的の効果が出きるはずですね。これなら数フレームの遅延でライブにも利用できます。

さて、特定の色の指定なのですが、前提がRGBではなくUYVY(CrYCbY)なので隣り合う2つの画素は2画素で1つの色です(キリ!)。ここで、uyvyからrgbを求めたところで色として判定に困るのでさらに変換して色相(Hue)を基準にして判定することにします。今回はここでおしまい。次回はそのHueの求め方から

※ちょっと赤色でやってみた

★元はこんな感じ

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook