WHAT'S NEW?
Loading...
ラベル MySQL の投稿を表示しています。 すべての投稿を表示
ラベル MySQL の投稿を表示しています。 すべての投稿を表示

■Poderosaのインストール

Poderosa(ポデローサ)って知ってる?
俺かなり好き好んで使ってるターミナルソフトなんだよね。

昔はTeraTermとか使ってたけど、もうね、俺の中では古くて仕方がない。
だからPoderosa。

http://ja.poderosa.org/download/binary.html

いろいろ表示に不具合とか出ることもあるけど、トータル的に使い勝手がよいので、是非これを使ってゲストOSに接続して行きたい!!

というわけで、ダウンロードしてインストールしておいておくれ。

インストールしたら接続しよう。
特に何も設定しなければ、192.168.56.101とか192.168.56.102とかになってると思う。なってなかったら、直接VMにrootでログインして、

ifconfig p7p1

と入力しよう。表示されたinetの部分を確認だコンチキショー!!!



さて、それではPoderosaで接続できたら早速次に行ってみよう。

■Fedoraのセットアップ

さて、次はどうするかというと、おもむろにFedora18を起動だ!!!
ちなみに小学生の時に山室(やまむろ)っていうやつがいて、すごく乱暴者だったなぁ。


VMを起動するには、起動したいVMを選択した状態で、起動ボタン(画面の赤丸)をクリックするか、起動したいVMダブルクリック(赤四角)すればOK。

さて、早速起動だ。

はじめに

日本全国のWeb野郎!!!もちろん女もいるからWeb女!!
いいか、Webサーバってのはな、Linuxなんだよ!!!

Linuxが一番人気あるんだYO!!
MacのOS XのベースになってるBSDなんかウンコだ!!!
うんこぷりぷり!!!

そんなマニアックて(Linuxより堅牢で素晴らしい)OSなんか、シロウトには用がない!!


というわけで、Linuxで人気のあるUbuntuなんていう腐れミーハーなペラい(しかも元になったDebianはかなり素晴らしい出来栄えなので是非一度お試しあれ!)Linuxなんか使わないで、『え?ありえなくない?』って思っちゃうほどしつこくてクドくて濃い~~~OSである、Fedoraを使って、君のWindows上に小さなインターネット環境をまるごと作ってしまおうじゃないか!!


これならWindowsで開発しつつ、仮想のWebサーバが反応してくれるので、Wordpressだって動いちゃうし、BaserCMSだって動いちゃうわけよ。しかも、オフラインででもね!!!

これでノートPCで電車内で隣の人に嫌な顔されながらででも開発ができるってもんでがショ!!
ぶひ!!
■今度は本当にLAMPですぞ!

前回『LAMPだ!』と言いながらまるでLAMPに触れなかったのはなかなかおもしろかったし興味深かったと思う。何よりも楽しんでいただいて恐縮だYO!
ざまぁねぇっす!!

さて、本題。

とにかくいま直ぐにFedora17CUIを起動して、ログインしよう。
ログインは当然rootでおこなう。何しろユーザがrootしかいないからね。
ちなみにPoderosaなどの端末を使ってログインするとコピペができるから楽すぎて鼻血ブー且つオヤジブーだ。

というわけで、ユーもさっさとログインしちゃいなYO!

■LAMPだ!!

さて、今回はWindows7にインストールしたVirtualBoxで動かすFedora17で、LAMP環境を作るの巻だ!!
ただし細かい設定の説明とかは面倒臭いし、ググればノイズみたいなクソ記事が大量にヒットするとおもうので、そちらをぜひご覧あれ。

Fedoraだったら今まで100回は入れてる感じなんだけど、だいたい大きく分けると3つのフェーズに分かれる。
  • 初期設定(ネットワーク、便利アプリなどの設定)
  • LAMPの構築
  • 使用アプリのインストール
3はGUIでやる処理なので、今回は上の2つをやろうぜ。
そしてそれらの設定に先立って、VirtualBox側の設定をまず最初に野郎じゃないかこの野郎!

■特定の場所にあるファイルやフォルダを別の場所で世代別に同期する

例えばユーザがアップロードした画像などをファイルで保存している場合や、チャットのログをテキストファイルで管理しているような、ファイルベースのモデルだけど、それらのファイルをまるごと世代管理を意識したバックアップを取ってみたくなる衝動に駆られるっつーわけよ、少なくとも俺は。

というわけで、bashで簡単なバッチを作ってみたんで晒すよ。
rootで動かすのが前提なんで、結構単純明快。


あなたが必要になるパラメータは

  • 世代数
  • バックアップ先の所有者
  • バックアップ元
  • バックアップ先

の4つだ。

それぞれをスクリプト内に直接記述し、cronでroot権限で動かせばOK。

さて今回はバックエンドの構築ということで、前回インストールしたApache、php、MySQL、Postfix、BINDの設定を中心に説明したいと思う。

繰り返しになるが、あくまで俺が何度も試してみた結果でしかないので、これが正解というわけではないことを断っておく。

ただ、Linuxを基礎から覚えたい!Webの仕組みを1から網羅したい!という人だけではないとおもうし、必要に迫られてググってたどり着いた人も多いとおもうので、なるべくかいつまんで説明する予定だ。

ただしかいつまむと言ってもさすが俺のことだ。DNSの部分など、可能な限り、「AするとBになる」という因果関係だけで終わらせるのは避け(これは俺の大嫌いなパターン)「AするとBになるのはCだから」まで掘り下げて書こうと思っている。しかしくどくならないように、全体的にはさっぱりサラサラのサラサーティ且つ、ダウニー的爽やかさを醸し出せるように意識して書いたつもりだ(おい、怒るな!)。

ちなみにLinuxのホスト名をtorhamzedd.comとし、ドメインもtorhamzedd.comとするのを前提として説明する。

というわけで早速いってみよう。

実に7ヶ月ぶりにこのシリーズを再開することにした。
前回なにをやったのか、というと、率直にリンク先を見ていただければ良いと思う。
SQLでちゃんとしたランキングを作る【1/3】

つまりseletしてorderしてlimitするだけでは正しいランキングがでない、ということだ。

幸いにも識者の方から色々アドバイスをもらい、俺なりに試してみた結果を書いてみようと思う。

まず、識者、つまりDupont氏から引用してもらったSQLがこれだ。
select (select count(distinct b.sal) from emp b where b.sal <= a.sal) as rnk, a.sal from emp a
個人的にSQLは改行を入れて見やすくする主義なので、以下のように適宜変更してみる。
select
  (
    select
      count(distinct b.sal)
    from
      emp b
    where
      b.sal <= a.sal
  ) as rnk, a.sal
from
  emp a
コードというものは、改行やインデントで適切にフォーマットしておくべきだと思っている。

しかしSQLに関してはまだ拘りはないので、だいたいいつもフォーマットは違う。統一しておいたほうが良い場合と、統一しないでも良い場合があるのだが、SQLは俺にとってまだ後者の方だ。

SQLを使ってランキングを表示させるなんてことをやったことがある人もいるだろう。
たとえばメンバー(訪問者という意味でのユーザは2種類あって、登録ユーザをメンバー、非登録ユーザをビジターと呼んでいる)にポイント属性が設定されていて、そのポイントを毎日集計する、そしてその結果、上位から10件取り出せば、ランキングデータが1位までそろう、というものだ。

ちょっと待て!!
それたぶん、インチキ!!

MySQLであれば、
select * from histories
order by point desc
limit 10
と吐けば、pointが高い順に上から10件の結果を得ることはできるが、ただ10件取得するだけで、ランキングとして正しいかどうかは別問題だ。

というのも、同位の場合があるからだ。

ある2人のユーザが同ポイントだった場合、内部ではpointではなくidや登録日などの順で順位が変わってしまうということになる。正直これは不本意だ。

というわけで、いくつかパターンを考えてみる。以下は、3位が二人いる場合を例にとってみた。

順位シーケンシャル 順位スキップ
10件まで 1 2 3 3 4 5 6 7 8 9 1 2 3 3 5 6 7 8 9 10
10位まで 1 2 3 3 4 5 6 7 8 9 10 1 2 3 3 5 6 7 8 9 10

これだと、右下の「順位スキップ」+「10位まで」がよさそうだが、実はそうじゃない。
さらに以下は、3位が二人、8位が3人いる場合になる。

先日のSQLでクロス集計した際、助言をいただけて別の方法で解決した(Dupont氏に感謝)。

俺なりに何が違うのか考えてみた結果、
  • sum()とcount()で結果が違う
  • coalesce()関数とは
の2点に絞って調査してみた。

まず前回俺が書いたSQLは以下になる。
select name as '商品名',
 count(case when color='白' then 1 else null end) as '白',
 count(case when color='黒' then 1 else null end) as '黒',
 count(case when color='赤' then 1 else null end) as '赤',
 count(case when color='青' then 1 else null end) as '青',
 count(case when color='緑' then 1 else null end) as '緑',
 case
  when name='ビックリ弁当箱' then sum(field(name, 'ビックリ弁当箱'))
  when name='最果てグローブ' then sum(field(name, '最果てグローブ'))
  when name='無駄毛ロンガー' then sum(field(name, '無駄毛ロンガー'))
  else null
 end as '合計'
from history
group by name with rollup
そしてDupont氏の助言は以下。
SELECT COALESCE(`name`, '合計') AS `商品名`,
SUM(CASE WHEN `color`='白' THEN 1 ELSE 0 END) AS '白',
SUM(CASE WHEN `color`='黒' THEN 1 ELSE 0 END) AS '黒',
SUM(CASE WHEN `color`='赤' THEN 1 ELSE 0 END) AS '赤',
SUM(CASE WHEN `color`='青' THEN 1 ELSE 0 END) AS '青',
SUM(CASE WHEN `color`='緑' THEN 1 ELSE 0 END) AS '緑',
COUNT(*) AS `合計`
FROM `history`
GROUP BY `name` WITH ROLLUP;
※COALESCE()関数とWITH ROLLUPは条件が一緒になるように追記してる

大文字小文字は抜きにして、基本的にcount()がsum()になっている点と、小計がcase式か、count()か、という点が大きく違う。


たとえば
  • 最果てグローブ
  • 無駄毛ロンガー
  • ビックリ弁当箱
の3つの商品がそれぞれ
の色バージョンがあったとして、
それぞれどれだけ売れたのかを集計とかやってみる。

似たような作業が実務で発生し、SQL未熟者の俺としては、これはぜひ覚えたいと思い、いろいろ試行錯誤してみたら出来たので、備忘録がてらかいておく。

結果として、イメージされる表にするとこういう感じ。

商品名
ビックリ弁当箱11212
最果てグローブ22210
無駄毛ロンガー10212

都道府県別に男女数を出すような、こんな感じをイメージしてもよい。

都道府県
東京都 58
神奈川県 47
千葉県 031


さて、今回はCentOSにインスコ(インストール)されているパッケージなどをアップデートする予定だ。

基本的に、と言うよりむしろ現在では当然の如く、yumコマンドでパッケージをインストールする(ソースコンパイルやrpmを作ったりするのは一度やって置くべきだ)。

Yumex(Yum Extender)というGUIソフトを使うと、グラフィカルにインスコすることも出来るが、ここではあえてコマンドラインで入力する事にする。

まずはCentOSにログインしよう。前回OSのシャットダウンではなく、VMPlayerを直接閉じていれば、勝手にサスペンド状態になり、直前の状態から再開することが可能になる。これがVMPlayerの便利なところのひとつだ。


「仮想マシンの再生」をクリックすると、「仮想マシンの状態を復元しています...」となり、だいたい20秒前後で元の状態に戻る。こりゃ便利。