404 motivation not found | t_ishidaのブログ

CAT | プログラミング

8月/11

10

create_functionのアレ

PHP5.2以下のPHPを使ってアレしてる人なんか、なんだかんだでcreate_function でアレしたりしてアレするでしょう?

でも、これって調子こいてJavaScriptやLISPのノリや、Perl のサブルーチンのリファレンスのつもりで使ってるとアレしちゃうんですよ。そもそもそこまで便利じゃないので、そのノリで使えないっていうのはアレしちゃってください。で、create_functionをよくアレしてる人は、以下のコード実行してみてください。

for ( $i = 0; $i < 1000000; $i++ ){
  hoge ('$x', 'return $x;' );
}
function hoge ( $x, $y ) { return create_function ( $x, $y ); }

スコープぬけようがcreate_functionした関数は破棄しないし、同じコードだろうが問答無用で新しい関数定義するという男らしい仕様でアレしているので使用可能メモリを一瞬でオーバーして男らしく散り際をわきまえてアレしちゃうんですね。でも、そんなアホみたいな回数をcreate_functionするような場所で回さないもんへへーんとかアレしてる方、

// バッチコントローラの階層
for ( $i = 0; $i < 10; $i++ ) {
  // モデルの階層
  for ( $j = 0; $j < 100; $j++ ) {
    // そのモデルの下請けモデルの階層
    for ( $k = 0; $k < 1000; $k++ ){
      hoge ('$x', 'return $x;' );
    }
  }
}
function hoge ( $x, $y ) { return create_function ( $x, $y ); }

これ位の計算量は普通に有り得るでしょう。うげーやべぇって思ってアレしました? 思ってないなら思った方が良いです。どう考えても思えないなら、ここでは先に進まなくてアレしちゃうので思ってください。

で、こうしてみることにしました。

function create_function_ex ( $args, $code )  {
  return LambdaFactory::create ( $args, $code );
}
class LambdaFactory {
   private static $_Cache = array ();
   public function create ( $args, $code )  {
     if ( !self::$_Cache[$args . "\x0b" . $code]  ) self::$_Cache[$args."\x0b". $code] = create_function ( $args, $code );
     return self::$_Cache[$args . "\x0b" . $code];
   }
}

です。
じゃあ、これと同じファイルに

for ( $i = 0; $i < 10000000; $i++ ){
   $fnc = create_function_ex ( '$x', 'print "$x\n";' );
   $fnc ( $i );
}

を追記して実行してみてください。
PHPさん、ここでは男らしく踏ん張ってくださいましたね。
これで安心してcreate_function 多用した可読性の低いコードを
ハッピーに書けますね!

※勿論、5.3以降のPHPなら create_function なんか使わずに。 function ( $x ) { return $x; } というようにしましょう。

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

No tags

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

件名についてですが、諸般の事情により
happy_ryoに全権委譲してhappy_ryoのプロジェクトになりました。

まず居ないと思いますが、これについて興味があって訪れていた方は、
happy_ryoのアナウンスを待ってください。

それに伴い、このページからは固定ページを無くしました。
happy_ryoについてはググれば出てくると思います。

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

No tags

8月/10

11

PHPの比較のアレ

この結果ってどうなると思います?

<?php
print '*' ==  0 ? 'true' : 'false' . "\n";

実はtrueですね、
数値 0 と文字列を比較すると、trueが返ってくるっぽいです。

こうするか

<?php
print '*' ===  0 ? 'true' : 'false' . "\n";

こうしましょう

<?php
print '*' ===  0 . '' ? 'true' : 'false' . "\n";
Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

No tags

7月/10

28

備忘録:PHP配列同士の比較

件名の通り。
まさかの

print  (
  array( 1, 2, 3 ) == array( 1, 2, 3 )
  ? 'OK' : 'NG'
    ) . "\n"; // OK
print  (
  array( 1, 2, 3 ) == array( 1, 2, 'ほげ'  )
  ? 'OK' : 'NG'
  ) . "\n"; // NG

print  (
  array( 1, 2, 3,
    array( 1, 2, 3 ,
      array( 1,
        array( 2,
          array( 3, 4
  ))))) ==
  array( 1, 2, 3,
    array( 1, 2, 3 ,
      array( 1,
        array( 2,
          array( 3, 4
  )))))
  ? 'OK' : 'NG'
  ) . "\n";            // OK

print  (
  array( 1, 2, 3,
    array( 1, 2, 3 ,
      array( 1,
        array( 2,
          array( 3, 4
   ))))) ==
   array( 1, 2, 3,
     array( 1, 2, 3 ,
       array( 1,
         array( 2,
           array( 3, 4,
             array( 5
   ))))))
   ? 'OK' : 'NG'
  ). "\n";            // NG

知らなかった僕もアホなのだけど、
これはさすがにアホかと。

print ( var_export( array( 1, 2 ), true ) == var_export( array( 1, 2 ), true )  ?  'OK' : 'NG' ) . "\n";

とかやってたよヽ(゜▽、゜)ノ

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

No tags

ピーチクを vi っぽく見る user.jsです。
ピーチクのタイムラインをキーボード操作で遡るためのuser.jsです。中の人にuser.jsページを作ろうよーと言っても対応してくれないのでこちらで公開します。当たり前ですがOperaのuser.js向けに作っているものなのでOperaで動作させる事を目的としています。でも、多分以下の環境でも動くと思います。思うだけなので、動くかどうかは分かりません。

  • Firefoxのグリモン
  • chromeのextension
  • IEのTrixie(ヘッダコメントに適当なnamespace切らないとダメかもね)
// ==UserScript==
// @name           [ptic] viっぽいの
// @description    viっぽく見るuser.js
// @include        http://ptic.jp/u/tl*
// @author         t_ishida
// ==/UserScript==
(function( w, $ ) {
  var vi_like = {
    'COLOR'        : 'rgb(240, 150, 240)',
    'messageBlock' : null,
    'pageID'       : null,
    'currentIndex'   : 0,

    //
    // j: scrollDOWN
    //
    '74' : function scrollDown(){
      if( !this.canScrollDown() ) return;
      this.clearFocus()
      this.currentIndex++;
      w.scrollTo( 0, this.getLT()[1] - 50 );
      this.setFocus();
      if( !this.canScrollDown() ) this.pageMore();
    },

    //
    // K: scrollUP
    //
    '75' : function (){
      if(this.currentIndex < 1 ) return;
      this.clearFocus();
      this.currentIndex--;
      w.scrollTo( 0, this.getLT()[1] - 50 );
      this.setFocus();
    },

    //
    // R: reply
    //
    '82': function(){
      var a = this.current().getElementsByTagName('a');
      for( var i = 0, l = a.length; i < l; i++ )
        if( a[i].href.match( /javascript:reply/ ) )
          location.href = a[i].href;
    },

    //
    // T: RT
    //
    '84': function(){
      var a = this.current().getElementsByTagName('a');
      for( var i = 0, l = a.length; i < l; i++ )
        if( a[i].href.match( /javascript:retweet/ ) )
          location.href = a[i].href;
    },

    //
    // メッセージブロックを収集
    //
    'getMessageBlock' :  function (){
      var result = [];
      if( !this.pageID ) return ;
      var buf = $( this.pageID ).getElementsByTagName( 'li' );
      for( var i = 0, l = buf.length; i < l; i++ ) result.push( buf[i] );
      buf = $( this.pageID + '_more'  ).getElementsByTagName( 'li' );
      for( var i = 0, l = buf.length; i < l; i++ ) result.push( buf[i] );
      this.messageBlock = result;
      return result;
    },

    //
    // エレメントの絶対位置の取得
    //
    'getLT' : function () {
      var element = this.current();
      var valueT = 0, valueL = 0;
      do {
        valueT += element.offsetTop  || 0;
        valueL += element.offsetLeft || 0;
        element = element.offsetParent;
      } while (element);
      return [valueL, valueT];
    },

    //
    // 現在のインデックスに該当するオブジェクトを返却する
    //
    'current' : function(){
      return this.messageBlock[this.currentIndex];
    },

    //
    // フォーカスをクリアする
    //
    'clearFocus' : function(){
      this.current().style.backgroundColor = '';
    },

    //
    // フォーカスをセットする
    //
    'setFocus' : function(){
      this.current().style.backgroundColor = this.COLOR;
    },

    //
    // 次ページを足す
    //
    'pageMore' : function(){
      if  ( w.tweet_json_more ) w.tweet_json_more( this.pageID );
      else                      location.href = 'javascript:tweet_json_more("' + this.pageID + '");';
    },

    'canScrollDown' : function(){
      return ( this.messageBlock.length > ( this.currentIndex + 1 ) );
    },
    ///
    /// new
    ///
    'initialize' : function(){
      if( !location.href.match( /ch=(.+)(?:&|$)/ ) ) return;
      var self = this;
      self.pageID = RegExp.$1;
      self.getMessageBlock();
      self.setFocus();
      (function ( target, type, listener ){
        if( target.addEventListener ) target.addEventListener( type, listener, false );
        else                          target.attachEvent( 'on' + type, function() {listener.call( target, w.event ); });
      })(
        document.all ? document.body : w, 'keydown', function( e ){
          if( document.activeElement.tagName.match( /(?:text|select|input)/i ) ) return;
          if( !e ) e = event;
          if( self[e.keyCode] ){
            self.getMessageBlock();
            self[e.keyCode]();
          }
        });

      (function ( target, type, listener ){
        if( target.addEventListener ) target.addEventListener( type, listener, false );
        else                          target.attachEvent( 'on' + type, function() {listener.call( target, w.event ); });
      })(
        document.all ? document.body : w, 'scroll', function( e ){
          if( document.activeElement.tagName.match( /(?:text|select|input)/i ) ) return;
          if( !e ) e = event;
          /*
          var top = w.scrollHeight - w.innerHeight - w.pageYOffset;
          alert( top );
          if( top - 50 > this.getLT()[1] ){
            alert( 'hogehoge' );
            this['74']();
          }
          else if( top - 50 <  this.getLT()[1] ){
            this['75']();
          }
          */
        });

    }
  };
  vi_like.initialize();
})( this.unsafeWindow || window, function(id) { return document.getElementById( id ); } );
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