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

シェルスクリプトで偶数, 奇数判定

cronで10分毎に動いているシェルスクリプトで、

  • 0, 20, 40分台はAの処理を
  • 10, 30, 50分台はBの処理を

的なことをしたくて書いたスクリプトです。

minute=`date '+%M'`

if test `expr $minute / 10 % 2` -eq 0 ; then
  A
else
  B
fi

動いてるけど、
シェルスクリプトとかまともに書いたことないので、
コレが最善かどうかはわからない。

apacheを再起動

サーバとかあまり触らないからすぐ忘れる。

sudo /etc/init.d/httpd restart

PHPで文字列を反転させる

来週の新卒研修コードレビューのテーマらしい。
ぱっと思いついた方法だけ載せてとく。

<?php

//strrevは使わない

$str = 'Hello. Nice to meet you.';

echo str_reverse($str);
echo str_reverse2($str);

function str_reverse($str) {
    $_str = '';

    for ($i = 1;$i <= strlen($str);$i++) $_str .= substr($str, $i * -1, 1);

    return $_str;
}

function str_reverse2($str) {
    $_str = '';

    for ($i = strlen($str) - 1;$i >= 0;$i--) $_str .= $str[$i];

    echo $_str;
}

swapでやる方法。

<?php

$str = 'Hello. Nice to meet you.';
echo str_reverse3($str);

function str_reverse3($str) {
    $forword  = 0;
    $backword = strlen($str) - 1;

    while ($forword < $backword) {
        list($str[$forword], $str[$backword]) = array($str[$backword], $str[$forword]);
        $forword++;
        $backword--;
    }

    return $str;
}

for, foreach, while などのループをつかわない

<?php

$str = 'Hello. Nice to meet you.';
echo str_reverse4($str);

function str_reverse4($str, $re_str = '') {
    if (strlen($str) === 0) return $re_str;

    $rest_str = substr($str, 0, -1);
    $re_str  .= substr($str, -1);

    return str_reverse4($rest_str, $re_str);
}

MySQLの CREATE TABLE ... LIKE ...

同じカラムで別テーブルをつくるときには CREATE TABLE to_table LIKE from_table; が便利。
ただし、データはコピーされないことに注意。

CREATE TABLE hoge_0 (
    id int(10) unsigned NOT NULL auto_increment,
    PRIMARY KEY (id)
);

CREATE TABLE hoge_1 LIKE hoge_0;

SHOW CREATE TABLE hoge_1;
| hoge_1 | CREATE TABLE `hoge_1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |

「CyberX 技術勉強会 #1 スマートフォン版のソーシャルアプリが出来るまで」に参加しました

諸事情により、作業ができないので昨日行った勉強会について。

CyberX主催の勉強会に参加しました。

こちらのブログで@satullyさんがまとめているので詳細は書きませんけど。。。
http://www.kirishikistudios.com/?p=182

CyberX の「星空バータウン」もSmartPhone版を作っているらしいです。
3月末〜プロジェクトが動いているそうで、3ヶ月くらいはかかってるとのこと。

FeaturePhone版のコードをベースに、再利用できるものは再利用して、新しく作り変える部分は最小限に抑えているそう。
ユーザデータも共通で利用して、FeaturePhoneでもSmartPhoneでもどちらでも同じように遊べるんだよー。
それにそうしたほうがゲーム内イベントなども共通で行えるので便利だよー。
らしいです。

とはいっても、やはり新しく作りかえてる部分は多いようで、
SmartPhoneならではのタップやスワイプといった操作や、画面遷移の違いなど、
UserInterfaceの部分は結構つくりかえたそうです。

例えば、FeaturePhoneでよく見る【 着せ替えるアイテムを選択 → 確認 → 着せ替え完了 】
のような3ページの遷移も、SmartPhone版では1ページで実現するためにcontrollerを変更する必要アリとのこと。

なるほどねという感じします。

あーお昼がきたので、このへんで。

PHPのrange

array(1000, 900, 800, 700, 600, 500, 400, 300, 200, 100);
みたいに-100刻みの配列をつくりたくてなにか良い方法はないかと考えた。

そこでよく使っているPHPのrange関数でできるのかなーと思ってdocをみてみた。
※値が増加するパターンでしか使ったことなかった。・・・と思う。
するとこんな記載が。

Description
  array range  ( mixed $low  , mixed $high  [, number $step = 1  ] )
Return Values
  Returns an array of elements from low to high, inclusive. If low > high, the sequence will be from high to low. 

どうやら引数の$low>$highの場合は今回やりたいことができそうだ。
ということでやってみた。

$hoge = range(1000, 100, -100);
var_dump($hoge);

array
  0 => int 1000
  1 => int 900
  2 => int 800
  3 => int 700
  4 => int 600
  5 => int 500
  6 => int 400
  7 => int 300
  8 => int 200
  9 => int 100

引数の名前が気持ち悪いけど、とりあえずできたのでよかった。
※fucntion range($from, $to, $step) の方が個人的にはわかりやすいなと思う。

MySQLで日別集計

日別でデータが何件あるか?とか出す場面が最近よくある。
そんなときのSQL

CREATE TABLE `histories` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `user_id` int(10) NOT NULL,
  `created` datetime NOT NULL,
  `updated` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into histories values (null, 1, '2011-05-01 00:00:00', '2011-05-01 00:00:00');
insert into histories values (null, 1, '2011-05-01 00:00:00', '2011-05-01 00:00:00');
insert into histories values (null, 1, '2011-05-02 00:00:00', '2011-05-02 00:00:00');
insert into histories values (null, 1, '2011-05-02 00:00:00', '2011-05-02 00:00:00');
insert into histories values (null, 1, '2011-05-03 00:00:00', '2011-05-03 00:00:00');

select date(created) as date, count(*) from histories group by date;
-- select substring(created, 1,10) as date, count(*) from histories group by date;

+------------+----------+
| date       | count(*) |
+------------+----------+
| 2011-05-01 |        2 |
| 2011-05-02 |        2 |
| 2011-05-03 |        1 |
+------------+----------+