404 motivation not found | t_ishidaのブログ

CAT | Perl

SVNクライアントのラッパーが使っているうちに大きくなりましたので、晒します。使い方はソース読んでください。

正直、ここまで大きくなるなら、pm にしてhelpとコマンドをセットと略式コマンドに対応出来たほうが良かったんじゃないかって思ってます。

#!/usr/bin/perl
use File::Basename;
use strict;

## 環境設定
sub say { print @_ , "\n" }
my $SVN   = 'svn';
my %HOSTS = (
  host1  => {
    host       => 'http://svn-server.domain/path/to/repostiry',
    local_dir  => '/local/working/copy/dir/home',
    server_host => 'user@domain.com',
    server_key  =>  "/path/to/server-key/id_rsa",
    server_dir  => '/path/to/dir',
    default    => 1,
  },
  host2 => {
    host       => 'http://svn-server.domain/path/to/repostiry',
    local_dir  => '/local/working/copy/dir/home',
    server_host => 'user@domain.com',
    server_key  =>  "/path/to/server-key/id_rsa",
    server_dir  => '/path/to/dir',
    default    => 0,
  },
);

my $SVN_ENV    = {};
## ここからロジック

our %COMMANDS =  (
  ##
  ## 対象リポジトリのブランチのリストを表示
  ##
  ls        => sub {
    `$SVN list '$SVN_ENV->{host}/branches'`
  },

  ##
  ## 対象ブランチのベースリビジョンを取得
  ##
  base_rev  => sub {
    `$SVN log '$SVN_ENV->{host}/branches/$_[0]' --stop-on-copy --quiet`
  },

  ##
  ## update
  ##
  update       => sub {
    if ( $_[0] ) { `$SVN update $SVN_ENV->{local_dir}/branches/$_[0]` }
    else         { `$SVN update` }
  },

  ##
  ##  ブランチの削除
  ##
  del       => sub {
    `$SVN del -m 'del $_[0]' $SVN_ENV->{host}/branches/$_[0]`
  },

  ##
  ##  ブランチの移動
  ##
  mv        => sub {
    `$SVN mv -m 'mv $_[0]' '$SVN_ENV->{host}/branches/$_[0]' '$SVN_ENV->{host}/branches/$_[1]'`
  },

  ##
  ##  ブランチを作成してチェックアウトしてくる
  ##
  create => sub {
    my $branch_name = shift;
    if ( `$SVN log $SVN_ENV->{host}/branches/$branch_name 2>&1` =~ /not +found/ ){
      print 'creating branch ' . $branch_name . '.....' . "\n";
      print `$SVN cp -m 'make $branch_name' $SVN_ENV->{host}/trunk $SVN_ENV->{host}/branches/$branch_name`;
    }

    if ( !-d "$SVN_ENV->{local_dir}/branches/$branch_name" ) {
      print 'checking out branch ' . $branch_name . '.....' . "\n";
      print `$SVN co $SVN_ENV->{host}/branches/$branch_name $SVN_ENV->{local_dir}/branches/$branch_name` ;
    } else {
      print 'updating branch ' . $branch_name . '.....' . "\n";
      print `$SVN update $SVN_ENV->{local_dir}/branches/$branch_name`;
    }

    if (  !-f "$SVN_ENV->{local_dir}/branches/$branch_name/.aurc" ) {
      print 'making dot_aurc_copy ' . $branch_name . '.....' . "\n";
      my $TMPL = "$SVN_ENV->{server_host}\n" .
      "$SVN_ENV->{server_key}\n".
      "$SVN_ENV->{server_dir}\n";
      my $path = "$SVN_ENV->{local_dir}/branches/$branch_name";
      $path =~ s#(?:/$)##;
      if ( $path ) { -d $path or die 'ディレクトリが無いような気がしますよ' . $path; }
      else       { $path = '.' }
      open F, '> ' . $path . '/.aurc'; print F $TMPL; close F;
      print $path . 'に.aurcを作りました'. "\n";
    }
    'created';
  },

  ##
  ## mergeコマンド(対象の作業ディレクトリで実行してください)
  ##
  merge => sub {
    our %COMMANDS;
    my ( $path, $dry_run ) = @_;
    my $rev = undef;
    print $COMMANDS{update}->() . "\n";
    $path or die 'パスの指定がありません' ;
    my $stat = `$SVN stat $SVN_ENV->{local_dir}/branches/$path`;
    if ( $stat ) {
      my @adds    = map { /(\S+)$/ } grep { /^\?/ } split /\n/, $stat;
      my @changes = map { /(\S+)$/ } grep { /^m/i } split /\n/, $stat;
      say 'コミット漏れ、追加漏れあったけどどうする? 追加漏れ:' .@adds . ' コミット漏れ:' . @changes . ' [y/n]';
      my $answer = <STDIN>;
      chomp $answer;
      say;
      if ( $answer ne 'n' ){
        say `$SVN update $SVN_ENV->{local_dir}/branches/$path`;
        for ( @adds ) {
          say '追加する?[y/n]:' . $_ ;
          my $answer = <STDIN>;
          chomp $answer;
          say;
          say `$SVN add $_` if $answer ne 'n';
        }
        say `$SVN ci -m 'prepared for merging by svn_branch.pl' $SVN_ENV->{local_dir}/branches/$path`;
      }
    }
    my @log =  map  { /(\d+)/ } grep { /\S/ }
      split /^\s*-+$/m, $COMMANDS{base_rev}->( $path );
    $rev = pop @log or die 'ブランチ間違ってない?';
    my $MERGE_COMMAND = "$SVN merge -x -w ";
    $dry_run and $MERGE_COMMAND .= ' --dry-run ';
    `$MERGE_COMMAND -r $rev:HEAD $SVN_ENV->{host}/branches/$path`;
  },

  ##
  ## ひとつ前のリビジョンに戻す
  ##
  rollback => sub {
    if ( $_[0] ) { `$SVN merge -x -w -r HEAD:PREV $SVN_ENV->{host}/branches/$_[0]` }
    else         { `$SVN merge -x -w -r HEAD:PREV` }
  },
);

## パラメータ処理(一個目はいつでもコマンド)
my $cmd    = shift @ARGV;
$COMMANDS{$cmd} or die '指定のコマンド無いっす';

## 対象ホストの解析とか
my %params = @ARGV;
if ( $params{-h} && $HOSTS{$params{-h}} ) {
  $SVN_ENV    = $HOSTS{$params{-h}};
}
else {
  my ( $key ) = grep { $HOSTS{$_}->{default} } keys %HOSTS;
  $SVN_ENV = $HOSTS{$key};
}
/^-/ and delete $params{$_} for keys %params;

## 実行
say $COMMANDS{$cmd}->( %params );
Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

No tags

5月/11

30

[誰得]svnクライアントのラッパ

また、svnクライアントのラッパ。
ブランチ操作に特化したもの。
ブランチ作ってチェックアウトしてくる奴とか、
マージする奴とかと統合したい。

#!/usr/bin/perl

## 環境設定
sub say { print @_ , "\n" }
my $SVN   = 'svn';
my %HOSTS = (
  user  => {
    host    => 'http://hoge.fuga',
    default => 1,
  },
  admin => {
    host    => 'http://hoge.fuga',
    default => 0,
  },
);

## ここからロジック
my $HOST = '';
my %COMMANDS =  (
  ls        => sub {
    `$SVN list '$HOST/branches'`
  },
  base_rev  => sub {
    `$SVN log '$HOST/branches/$_[0]' --stop-on-copy --quiet`
  },
  del       => sub {
    `$SVN del -m 'del $_[0]' '$HOST/branches/$_[0]'`
  },
  mv        => sub {
    `$SVN mv -m 'mv $_[0]' '$HOST/branches/$_[0]' '$HOST/branches/$_[1]'`
  }
);

## パラメータ処理(一個目はいつでもコマンド)
my $cmd    = shift @ARGV;
$COMMANDS{$cmd} or die '指定のコマンド無いっす';

## 対象ホストの解析とか
my %params = @ARGV;
if ( $params{-h} && $HOSTS{$params{-h}} ) {
  $HOST = $HOSTS{$params{-h}}->{host};
}
else {
  ( $HOST ) =
    map { $HOSTS{$_}->{host} }
      grep { $HOSTS{$_}->{default} }
        keys %HOSTS;
}
/^-/ and delete $params{$_} for keys %params;

## 実行
say $COMMANDS{$cmd}->( %params );

1;
Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

No tags

よくあるtrunkをブランチに切るパターンを自動化。
さらに前に紹介したdot_aurc_copy.plもついでにキック。
ディスク勿体無いけど、switchは経験上危険なので問答無用でチェックアウト。

#!/usr/bin/perl -w
use File::Basename;

my $ROOT
   = '[svnのリポジトリのパス]';
my $LOCAL_ROOT
   = '[ローカルのパス]';
my $SVN
   = 'svn';
my $DOT_AURC_COPY
   =  dirname ( $0 ) . '/dot_aurc_copy.pl';

my $branch_name = shift ( @ARGV )
  or die 'ブランチ名が無い';

if ( `$SVN log $ROOT/branches/$branch_name 2>&1` =~ /not +found/ ){
  print 'creating branch ' . $branch_name . '.....' . "\n";
  print `$SVN cp -m 'make $branch_name' $ROOT/trunk $ROOT/branches/$branch_name`;
}

if ( !-d "$LOCAL_ROOT/branches/$branch_name" ) {
  print 'checking out branch ' . $branch_name . '.....' . "\n";
  print `$SVN co $ROOT/branches/$branch_name $LOCAL_ROOT/branches/$branch_name` ;
} else {
  print 'updating branch ' . $branch_name . '.....' . "\n";
  print `$SVN update $LOCAL_ROOT/branches/$branch_name`;
}

if (  !-f "$LOCAL_ROOT/branches/$branch_name/.aurc" ) {
  print 'making dot_aurc_copy ' . $branch_name . '.....' . "\n";
  print `perl $DOT_AURC_COPY branches/$branch_name`;
}
Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

No tags

NetBeansが遅くてどうにもならないので、
svnのよくあるブランチのBASEからマージする作業を自動化してみた。
これでvimdiffへの繋ぎ込みとか出来るようになれば、
大体大丈夫になるが。

#!/usr/bin/perl

##
## 環境設定
##
my $ROOT
  = 'http://svn-server.domain/path/to/branches';
my $SVN
   = 'svn';
my $LOG_COMMAND
   = "$SVN log --stop-on-copy --quiet";
my $MERGE_COMMAND
  = "$SVN merge ";

## 未実装
my $DIFF_COMMAND
   = "$SVN diff diff-cmd svndiff";

##
## ロジック
##
my ( $path, $dry_run ) = @ARGV;
$path or die 'ブランチ名の指定がありません' ;
my @log =
   map {  ($_) = $_ =~ /(\d+)/; }
     grep { $_=~/\S/ }
       split /^\s*-+$/m, `$LOG_COMMAND ${ROOT}/${path}`;

my $rev = pop @log;
$dry_run and $MERGE_COMMAND .= ' --dry-run ';
$MERGE_COMMAND .= "-r ${rev}:HEAD ${ROOT}/${path}";
print `$MERGE_COMMAND`;
Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

No tags

11月/10

26

SFTPのなんか

能書き

取り急ぎ作ってみた。ローカルで編集したファイルをSFTPでリモートの目的のディレクトリにアップロードするためのスクリプト。
テキストエディタの保存に引っ掛けて使うイメージ

使い方

以下みたいな適当な感じで

  • プロジェクトルートに”.aurc”というファイルを作る( .aurcのレイアウトはまた後で)
  • 以下のスクリプトを適当なファイルに保存する(ex:~/auto_upload.pl)
  • perl ~/auto_upload.pl “上げたいファイルのパス”
  • ファイルが適当にSFTPでアップされる

vimの場合

.vimrcに以下のように記述してwrで保存する

cmap wr w<Bar>!perl ~/auto_upload.pl "%:p"

保存した時に適当に実行される。
上がったかどうかを適当に目視確認してエンターを叩かないとダメ。

.aurcのレイアウト

1行目:user_name@hostname
2行目:/path/to/identity_file
3行目:リモートホストでのプロジェクトルート

ソース

適当に直してください

諸々

  • 自分しか使うイメージが無かったのでクイックハック的なあんま考えてないソースなので汎用的に使う時には直す必要がある
  • Mac + vim + 一回以上パスワードが保存されている環境またはidentity_file だけでパスワードが無い環境しか想定されていないのでパスワードとか必要であれば直す必要がある
  • FTPとか他のプロトコルとか使うのであれば直す必要がある

今のところ僕自身はこれで困らない感じですが、万が一使ってみようと思っている人が居て何か要望あればコメントとかに書いてくれると嬉しいです。※やれるかどうかはともかくとして

#/usr/bin/perl
use strict;
my ( $target_file ) = @ARGV;

## 設定ファイルの検索
my $tmp         = $target_file;
my $host        = '';
my $identity    = '';
my $local_root  = '';
my $remote_root = '';
while ( $tmp =~ s#/[^/]+$## ){
  opendir DIR, $tmp;
  while ( my $fn = readdir ( DIR ) ){
    $fn eq '.aurc' or next;
    $local_root = $tmp;
    open F, $tmp . '/' . $fn;
    ( $host, $identity, $remote_root ) = <F>;
    chomp $host;
    chomp $identity;
    chomp $remote_root;
    last;
  }
  close DIR;
  $remote_root and last;
}
$remote_root or die '設定ファルなくね?';

## リモートのパスを算出
my $remote_file = $target_file;
$remote_file =~ s#$local_root##e;
$remote_root =~ s#/$##;
$remote_file =~ s#^/##;
$remote_file = $remote_root . '/' .$remote_file;

## SFTPコマンド
my $cmd = 'sftp ';
$identity and $cmd .= ' -oIdentityFile="' . $identity . '" ';
$cmd .= $host;
open  SFTP, '| ' . $cmd;
print SFTP 'put "' . $target_file . '" "' . $remote_file . '"' . "\n";
print SFTP "quit\n";
close SFTP;
Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

No tags

フレームワーク(笑)のSave系アクションの自動ジェネレート機能を付加した。ってか、create_entites.phpはどうすんだよって感じだね。あっちに統合したら開発のイニシャルコストが減らせるんだが、PHPに書き直すの面倒くさいな。真面目な話、これで吐き出たソースをそのまま使ってはいけません。validate周りとか、これじゃ駄目じゃないので、無いよりは有った方が書きやすいよね?のレベルのものです。改修加えることが前提です。HTMLのエスケープは出力時にやるべきだと考えてる人なので、ここではやってません。

#!/usr/bin/perl -w
use Data::Dumper;
sub say{ print "$_[0]\n" }

my @tbls = ();
my $cur  = undef;
my ( $fn, $sep ) = @ARGV;
$fn || die('ファイルの指定無いよ');
$sep = $sep || "\t";
open my $f, $fn;

while( <$f> ){
  ##空行は無視
  /(?:^\s+$|^\))/
    and next;

  ## create table 行
  /create +table +([^\( ]+)/i
    and push @tbls, $cur
      and $cur = { nm => $1, flds => [], pk => [], idx => [] }
        and next;

  ## 主キーの行
  /primary +key\((.+?)\)/i
    and push @{$cur->{pk}}, $1
      and next;

  ## インデックス定義の行
  /INDEX +([^\(]+)\((.+?)\)/
    and push @{$cur->{idx}}, { nm => $1, fld_nm => $2 }
      and next;

  my %fld = ();
  @fld{ 'dum','nm','dat_type'} = split( / +/ ) and
    delete $fld{'dum'};

  if ( /\((\d+)\)/ ) {
    $fld{dat_type} = ~s/\((\d+)\)//;
    $fld{dat_len}  = $1;
  }

  $fld{NULL}     = $_ =~ /NOT NULL/i ? 'NOT NULL' : 'NULL';
  push @{$cur->{flds}}, \%fld;
}
push @tbls,  $cur;
close $f;
shift @tbls;
say( '----------------------区切り文字-----------------------' );

for( @tbls ){
  say( 'テーブル名' . $sep .  $_->{nm} );
  say( 'フィールド名' . $sep . 'データ型' . $sep . "備考");
  foreach my $fld( @{$_->{flds}} ){
    say( join $sep, ( $fld->{nm}, $fld->{dat_type} ) );
  }
  say();
  say( '主キー' );
  foreach my $pk( @{$_->{pk}} ){
    say( $pk );
  }
  say();
  say( 'インデックス' );
  say( 'インデックス名' . $sep . '対象フィールド' );
  foreach my $idx( @{$_->{idx}} ){
    say( $idx->{nm} . $sep . $idx->{fld_nm} );
  }
  say();
  say();
}

for( @tbls ){
  my $str = '';
  my $ret = { valid =>[], save =>[] };
  foreach my $fld( @{$_->{flds}} ){
    ##valid
    $fld->{NULL} =~ /NOT/i and
    push @{$ret->{valid}} , 'if( !$this->REQUEST["' . $fld->{nm} . '"] ) $err[] = \'' . $fld->{nm} . 'は必須です。\';';

    $fld->{dat_type} =~ /(date|time)/i and
    push @{$ret->{valid}} ,'if( !preg_match( "#(\d{4})/(\d{1,2})/(\d{1,2})#", $this->REQUEST["' . $fld->{nm}  . '"], $tmp ) || !checkdate( $tmp[2], $tmp[3], $tmp[1] ) ) $err[] =\'' . $fld->{nm} . 'はYYYY/MM/DDで正しく入力して下さい\';';

    $fld->{dat_len} and
    push @{$ret->{valid}} ,'if( strlen( $this->REQUEST["' . $fld->{nm}  . '"] ) > ' . $fld->{dat_len} . ') $err[] =\''. $fld->{nm} . 'の文字列が長すぎます。' . $fld->{dat_len} . 'バイト以内で入力して下さい。\';';
    ##save
    push @{$ret->{save}} , '$row->' . $fld->{nm} . ' = $this->REQUEST["' . $fld->{nm}. '"];';
  }

  $str  = "require_once 'ActionBase.php';\n";
  $str .= "require_once '$_->{nm}.php';\n";
  $str .= "class Save$_->{nm} extends ActionBase {\n";
  $str .= "  public function validate(){\n";
  $str .= "    \$err = array();\n";
  $str .= join( "\n", map{ '    ' . $_; } @{$ret->{valid}} ) . "\n";
  $str .= '    if( count( $err ) ) $this->Data["msg"] = join( "\n" , $err ); ' . "\n";
  $str .= '    return !count($err);' . "\n";
  $str .= "  } \n\n";
  $str .= "  public function doService(){\n";
  $str .= '    $row = new ' . $_->{nm} . '();' . "\n";
  $str .= '    $row->search( $this->REQUEST["id"] );' . "\n";
  $str .= join( "\n", map{ '    ' . $_; } @{$ret->{save}} ) .  "\n";
  $str .= '    $row->save();' . "\n";
  $str .= "  }\n";
  $str .= "}\n";
  say( $str );
}
Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

No tags

#!/usr/bin/perl
use strict;
sub say{ print "$_[0]n" }

my @tbls = ();
my $cur  = undef;
my ( $fn, $sep ) = @ARGV;
$fn || die('ファイルの指定無いよ');
$sep = $sep || "t";
open my $f, $fn;
while( <$f> ){
/(?:^s+$|^))/ and next;
/create +table +([^( ]+)/i and push @tbls, $cur and $cur = { nm => $1, flds => [], pk => [], idx => [] } and next;
/primary +key((.+?))/i    and push @{$cur->{pk}}, $1 and next;
/INDEX +([^(]+)((.+?))/  and push @{$cur->{idx}}, { nm => $1, fld_nm => $2 } and next;
my %fld = ();
@fld{ 'dum','nm','dat_type'} = split( / +/ );
delete $fld{'dum'};
push @{$cur->{flds}}, %fld;
}
push @tbls, $cur;
close $f;
shift @tbls;
for( @tbls ){
say( 'table name' );
say( $_->{nm} );

say( 'columns' );
foreach my $fld( @{$_->{flds}} ){
say( join $sep, ( $fld->{nm}, $fld->{dat_type} ) );
}

say( 'primary_key' );
foreach my $pk( @{$_->{pk}} ){
say( $pk );
}

say( 'index' );
foreach my $idx( @{$_->{idx}} ){
say( $idx->{nm} . $sep . $idx->{fld_nm} );
}
say('');
}

多分、もっと短くなると思う

Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

No tags

能書き

GREEの勉強会に行ってきました。

今回のテーマはMobaSIFでした。

http://labs.gree.jp/Top/Study/20080708/Report.html

http://labs.gree.jp/Top/Study/20080708.html

↑の下の方にスライドのPDFがある

携帯のWebってあんまり知らなかったのですが、最近、自分の所属している会社でも携帯Web進出を考えているようで、渡りに船と言う感じで参加してきました。事前知識としてあったのは・・・

・携帯ではクッキー使えないかも知れないがユニークなIDがある、取得の仕方は携帯キャリア毎にバラバラである。

・携帯は、表示して良いデータ量が限られている。

・なんにせよ絵文字はウザい

位のもので、フレームワークを使えば、この辺りを楽にしてくれるんじゃないかな?的な期待を持って臨んだ次第です。

講師

DeNAの川崎さん

講義の内容

フレームワークの勉強会と言うよりは、フレームワークの紹介と言った内容でした。事前知識が少なかったので、このライトな内容はむしろ歓迎でした。講義の内容の要点としては

  • 前置きとして最近の携帯電話Webは楽である。
    • 昔よりはキャリア毎の仕様に統一性が生まれてきた事
    • 制限がどんどん少なくなっていっている
    • 昔の端末なんか切り捨てたって、1%程度しか得しないから切り捨てちゃえば良いよ。
  • 成り立ち
    • モバオクとか、モバゲーとかをスクラッチから起こした時に、共通で使っていた処理をまとめてフレームワーク化したもの
  • 構成
    • 専用アクション?(認証や絵文字の変換をした後に)
    • 専用テンプレートエンジン(XS製でT2の20倍速い)
    • 携帯の面倒くさそうな処理を吸収してくれる事前処理をまとめたディスパッチャ
  • 特徴
    • モバイルに特化している
    • XSが含まれている
    • 依存CPANモジュールが少ないので導入が容易
      • DBI位しか使ってないらしい
      • 携帯用の絵文字とかも事前に変換してくれたり、携帯用のヘッダとかの解析しているのでCGI.pmすら使っていない可能性もある
    • 動作環境に縛りを入れる事で余計な処理を入れる必要がなかったところ
    • バッチやデーモンの処理も環境設定を共有してイキナリ書ける
  • 実運用しているものとの違い
    • DOCOMOのゴニョゴニョした何かが違うらしい
    • メール送信周りはセキュリティ的にやばいから外した
  • 問題点と課題
    • DBアクセスが頻発すると、そこで律速になっちゃうから、テンプレートエンジンをいくら早くしても駄目じゃね?
    • システムが巨大化しちゃってフレームワーク直すと影響でかすぎるっす
    • 自由すぐるのでコード品質のばらつきに弱い
    • 内部がSJIS

Q & A

Q.非同期処理を走らせるトリガってなんすか?

A.CGIからバッチキック用の関数を走らせると、指定されたディレクトリにファイルを書きだして、ファイルの書き出しを監視しているデーモンが、バッチにファイルを転送するところから始まる

Q.リリースとかの自動化とかはフレームワークでなんかしてあげてるの?

A.してないっす。手順書ベースでやってる

Q.イチイ君から出た質問、内容書き留めるの忘れた

Q.フレームワークで直したいところ

A.SJISやめたいっす(TT)

雑感

正直な感想としてはスクラッチからシステムを起こすならともかく、運用中のシステムの携帯対応のために無理にMobaSIFに移行しなくても良いかも・・・・。と言うところです。おそらくはディスパッチャになっている部分を、どうにか移植すれば、あまり悩むところは無さそうです。これは、懇親会の中で聞いた話なのですが、

PCのWebユーザーに比べて、携帯のWebユーザーは10倍居る。
が、携帯のデータ転送量は少ないからApacheに対する負荷は圧倒的に少ない、
代わりに、アクセスの度にDBに対するアクセスが発生する事を考えれば、
Webサーバー1台に対して、DBは2台必要な計算だと考えるべき。

と言うのと

PCのWeb屋さん的にはクッキーが使えないからって、端末ユニークのIDをセッションIDに振りたがりそうだが、携帯Webのヘビーユーザー程無駄にセキュリティ意識が高く、端末ユニークIDを送信しない設定にしていたりする。なので、getのパラメータとかでセッションIDを引きずりまわすのが定石

等と、携帯Web固有の定石的なものが、ちょくちょく有りそうな気がします。これは単にMobaSIFを使ったりして、携帯の面倒くさそうな部分を自動化するだけではなく、着手するよりも前に、もっと携帯Web屋さんと仲良くして情報交換をしていって、地盤を固めてからの方が良いかも知れないと、思ったりしました。

追記

携帯サイトの場合マークアップ用の定石あるようですね。

http://dspt.blog59.fc2.com/blog-entry-39.html

なんだ、割と敷居高いじゃん\(^o^)/

Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

No tags

爆発しろに反応するようになりました。

bombtterの作者に断りとかは入れていませんが、良いですよね?

Wassrで「山手線爆発しろ」、とか言っても「爆発しました」とか来ないのが寂しかったから、kyubotterに反応させるようにしました。単語別の集計サイトは作ってません。(形態素の記録と係り言葉の解析結果の記録はしているので、そのうち作るかも)

http://wassr.jp/user/kyubotter

Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

No tags

6月/08

27

なんちゃって魔王

id:hrkt0115311のやっているメルマガのなんちゃって魔王をPerlに移植してみた。

http://archive.mag2.com/0000267290/index.html

%cmd = (
'1' => { 'name' => 'たたかう', 'act'  => sub{ print '戦えなかった。' } } ,
'2' => { 'name' => '逃げる'  , 'act'  => sub{ print '逃げられなかった。' } } ,
'3' => { 'name' => '防御'    , 'act'  => sub{ print '防御できなかった。' } } ,
'6' => { 'name' => '終わる'  , 'act'  => sub{ print '終わった。' and exit(0) } } ,
);
print( "どうする?n" . join( "n", map{ "$_:$cmd{$_}{name}" } grep{ $cmd{$_}{name} } sort keys %cmd ) . "n" ) and $_ = <STDIN> and chomp $_ and ( $cmd{$_} ? $cmd{$_}{act}->() : print "そうはいかないn" ) while 1;
Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

No tags

Older posts >>

Find it!

Theme Design by devolux.org

Tag Cloud