JavaScriptでN進数変換しようとしたら、不思議な振る舞いに出会った

追記

[0-9]\.[0-9]*

だと、少数点として扱われて

[0-9]\s+\.

だと、ドット演算子として扱われるからか


SyntaxErrorのところは、数字もしくは空白文字が来るべき箇所に、その他の文字が来たからエラー吐いてるのね。


あと

7['toString'](2)

これもあったな。

なにこれ

7.toString(2)   // SyntaxError
7 .toString(2)  // 111
7  .toString(2) // 111
7. toString(2)  // SyntaxError
7 . toString(2) // 111

var n = 7;
n.toString(2)   // 111

new Number(7).toSring(2) // 111
Number(7).toSring(2)     // 111

7..toString(2)  // 111
7 ..toString(2) // SyntaxError
7. .toString(2) // 111
7.. toString(2) // 111
7.0.toString(2) // 111

範囲選択内のリンクを開く

プログラムのリハビリ中。
一瞬、for文の書き方忘れて焦った。。

document.addEventListener('DOMContentLoaded', function() {
  document.body.addEventListener('mouseup', function() {
    var selection = window.getSelection();

    if (selection.rangeCount < 1) {
      return;
    }

    var anchorList = selection.getRangeAt(0).cloneContents().querySelectorAll('a');

    for (var i = 0, l = anchorList.length; i < l; i++) {
      window.open(anchorList[i].href);
    }
  }, false);
}, false);

諸君、私は奈々様が好きだ

諸君、私は奈々様が好きだ
諸君、私は奈々様が好きだ
諸君、私は奈々様が大好きだ


POWER GATEが好きだ
innocent starterが好きだ
ETERNAL BLAZEが好きだ
残光のガイアが好きだ
Silent Bibleが好きだ


新宿コマ劇場
さいたまスーパーアリーナ
日本武道館で
横浜アリーナで
西武ドームで


この地上に存在するありとあらゆる奈々様が大好きだ


PVが好きだ
「Astrogation」のPVでウィンクされた時など心がおどる


ラジオが好きだ
副ヘッドが罰ゲームを受けた時など胸がすくような気持ちだった


ライブが好きだ
深愛のアコースティックバージョンなど感動すらおぼえる


DISCOTHEQUEのイントロが流れた時などもうたまらない
ETERNAL BLAZEで会場がオレンジに染まるのは最高だ


以前はCDランキングで紹介時間短かったのに
特集が組まれた時など絶頂すら覚える


アンチに滅茶苦茶にされるのが好きだ
歌詞が厨二病だと言われるのはとてもとても悲しいものだ


ジャニーズファンの物量に押し潰されて殲滅されるのが好きだ
ジャニーズに1位を持ってかれるのは屈辱の極みだ


諸君 私は奈々様を 挑戦者である様な奈々様を望んでいる
諸君 私に付き従う奈々様好きの諸君 君たちは一体何を望んでいる?
更なる奈々様を望むか 
糞の様な奈々様を望むか?
歌唱力の限りを尽くし 番組企画の素人集団を下す 女神のようなのような奈々様を望むか?


奈々様!! 奈々様!! 奈々様!!


よろしい ならば奈々様だ


だが、オリコンで万年2位に耐え続けて来た我々には
ただの奈々様ではもはや足りない!!
大奈々様を!! 一心不乱の大奈々様を!!


我々はわずかに小数
ジャニーズファンに比べれば物の数ではない
だが諸君は一騎当千の団員だと私は信じている
ならば我らは諸君と私で総兵力100万と1人のFC集団となる
我らを忘却の彼方へと追いやり、過去の栄光にすがっている連中を叩きのめそう
髪の毛をつかんで引きずり下ろし 眼(まなこ)をあけて思い出させよう


連中にPHANTOM MINDSがオリコン・週間シングルチャートで週間1位を獲得したことを思い出させてやる
連中に紅白での深愛を思い出させてやる
奈々様には奴らの哲学では思いもよらないカレーがある事を思い出させてやる
1000人の団員の集団で 世界を七色で埋め尽くしてやる


目標 ロンドン


スマイルギャング作戦 状況を開始せよ


征くぞ 諸君

Vimana使ってみた、、い

Vim script manager「Vimana」が便利すぎる。
を見てインストールしてみました。

# git clone git://github.com/c9s/Vimana
# cd Vimana
# perl Makefile.PL
# make

で、makeファイルねーよと言われてしまった。
id:mattn さんからのアドバイスで、incディレクトリを消したら、Module::AutoInstallが無いと怒られてしまった。

id:TakiTake incディレクトリを消してperl Makefile.PLすると行けたりもします。

git cloneからやり直そうとしたら、現在(2010/02/04 12:10) github落ちてるみたい。


CPANからのインストールを試みるも失敗。
こっちも、makeファイル無いってエラーなのか?

# cpan Vimana
CPAN: Storable loaded ok (v2.21)
Going to read '/root/.cpan/Metadata'
  Database was generated on Wed, 03 Feb 2010 22:45:58 GMT
CPAN: YAML loaded ok (v0.71)
Going to read 120 yaml files from /root/.cpan/build/
CPAN: Time::HiRes loaded ok (v1.9719)
......DONE
Restored the state of 1 (in 5.8001 secs)
Running install for module 'Vimana'
Running make for C/CO/CORNELIUS/Vimana-2010.03419.tar.gz
Prepending /root/.cpan/build/App-Context-0.967-85imJq/blib/arch /root/.cpan/build/App-Context-0.967-85imJq/blib/lib to PERL5LIB for 'get'
  Has already been unwrapped into directory /root/.cpan/build/Vimana-2010.03419-cfAjBm
Prepending /root/.cpan/build/App-Context-0.967-85imJq/blib/arch /root/.cpan/build/App-Context-0.967-85imJq/blib/lib to PERL5LIB for 'make'
  Has already been made
Prepending /root/.cpan/build/App-Context-0.967-85imJq/blib/arch /root/.cpan/build/App-Context-0.967-85imJq/blib/lib to PERL5LIB for 'test'
Running make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'inc', 'blib/lib', 'blib/arch')" t/00-commands.t t/00-install.t t/00-load.t t/00-path.t t/00-update.t t/01-package.t t/01-record.t t/accessor.t t/installer-makefile-2.t t/installer-makefile-3.t t/installer-makefile.t
t/00-commands.t ........... ok
t/00-install.t ............ ok
t/00-load.t ............... 1/6 # Testing Vimana 2010.03419, Perl 5.010000, /usr/bin/perl
t/00-load.t ............... ok
t/00-path.t ............... ok
t/00-update.t ............. ok
t/01-package.t ............ 1/9 # basic
# directory detection
t/01-package.t ............ 6/9 # makefile
# metafile
t/01-package.t ............ ok
t/01-record.t ............. ok
t/accessor.t .............. ok
t/installer-makefile-2.t .. 1/2 make[1]: *** ターゲット `install' を make するルールがありません.  中止.

#   Failed test at t/installer-makefile-2.t line 22.
cannot remove path when cwd is /tmp/test for /tmp/test:  at t/installer-makefile-2.t line 24
# Looks like you failed 1 test of 2.
t/installer-makefile-2.t .. Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/2 subtests
t/installer-makefile-3.t .. 1/2 make[1]: *** ターゲット `install' を make するルールがありません.  中止.
cannot remove path when cwd is /tmp/test for /tmp/test:  at t/installer-makefile-3.t line 24
t/installer-makefile-3.t .. ok
t/installer-makefile.t .... 1/2 make[1]: *** ターゲット `install' を make するルールがありません.  中止.

#   Failed test at t/installer-makefile.t line 20.
cannot remove path when cwd is /tmp/test for /tmp/test:  at t/installer-makefile.t line 22
# Looks like you failed 1 test of 2.
t/installer-makefile.t .... Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/2 subtests

Test Summary Report
-------------------
t/installer-makefile-2.t (Wstat: 256 Tests: 2 Failed: 1)
  Failed test:  2
  Non-zero exit status: 1
t/installer-makefile.t  (Wstat: 256 Tests: 2 Failed: 1)
  Failed test:  2
  Non-zero exit status: 1
Files=11, Tests=70,  7 wallclock secs ( 0.23 usr  0.08 sys +  3.12 cusr  1.27 csys =  4.70 CPU)
Result: FAIL
Failed 2/11 test programs. 2/70 subtests failed.
make: *** [test_dynamic] エラー 1
  CORNELIUS/Vimana-2010.03419.tar.gz
  /usr/bin/make test -- NOT OK
//hint// to see the cpan-testers results for installing this module, try:
  reports CORNELIUS/Vimana-2010.03419.tar.gz
Running make install
  make test had returned bad status, won't install without force


インストール手前で停滞中です。
誰か原因分かりますか?

追記

足りないモジュールをインストールして、incディレクトリを削除したら

# perl Makefile.PL
include /root/repos/Vimana/inc/Module/Install.pm
include inc/Module/Install/Metadata.pm
include inc/Module/Install/Base.pm
include inc/Module/Install/Scripts.pm
include inc/Module/Install/Makefile.pm
include inc/Module/Install/Include.pm
include inc/Module/Install/AutoInstall.pm
include inc/Module/AutoInstall.pm
*** Module::AutoInstall version 1.03
*** Checking for Perl dependencies...
[Core Features]
- App::CLI       ...loaded. (0.08 >= 0.08)
- Archive::Any   ...loaded. (0.0932)
- DateTime       ...loaded. (0.53)
- Exporter::Lite ...loaded. (0.02)
- File::Path     ...loaded. (2.08 >= 2.07)
- File::Spec     ...loaded. (3.31)
- File::Type     ...loaded. (0.22)
- Getopt::Long   ...loaded. (2.38)
- LWP::Simple    ...loaded. (5.827)
- LWP::UserAgent ...loaded. (5.834)
- Test::More     ...loaded. (0.94)
- URI            ...loaded. (1.52 >= 1.37)
- YAML           ...loaded. (0.71)
- Digest::MD5    ...loaded. (2.39)
- JSON           ...loaded. (2.17)
*** Module::AutoInstall configuration finished.
Vim found:
----------
VIM - Vi IMproved 7.2 (2008 Aug 9, compiled Mar 27 2009 08:42:32)
適用済パッチ: 1-148
Modified by <bugzilla@redhat.com>
----------
include inc/Module/Install/WriteAll.pm
include inc/Module/Install/Win32.pm
include inc/Module/Install/Can.pm
include inc/Module/Install/Fetch.pm
Checking if your kit is complete...
Warning: the following files are missing in your kit:
        META.yml
Please inform the author.
Writing Makefile for Vimana
Writing META.yml

無事Makefileが作成されました。


makeも成功して、意気揚々とmake testしたら、

PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'inc', 'blib/lib', 'blib/arch')" t/00-commands.t t/00-install.t t/00-load.t t/00-path.t t/00-update.t t/01-package.t t/01-record.t t/accessor.t t/installer-makefile-2.t t/installer-makefile-3.t t/installer-makefile.t t/text.t
t/00-commands.t ........... ok
t/00-install.t ............ ok
t/00-load.t ............... 3/6 # Testing Vimana 2010.03419, Perl 5.010000, /usr/bin/perl
t/00-load.t ............... ok
t/00-path.t ............... ok
t/00-update.t ............. ok
t/01-package.t ............ 1/9 # basic
# directory detection
t/01-package.t ............ 6/9 # makefile
# metafile
t/01-package.t ............ ok
t/01-record.t ............. ok
t/accessor.t .............. ok
t/installer-makefile-2.t .. 1/2 make[1]: *** ターゲット `install' を make するルールがありません.  中止.

#   Failed test at t/installer-makefile-2.t line 22.
cannot remove path when cwd is /tmp/test for /tmp/test:  at t/installer-makefile-2.t line 24
# Looks like you failed 1 test of 2.
t/installer-makefile-2.t .. Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/2 subtests
t/installer-makefile-3.t .. 1/2 make[1]: *** ターゲット `install' を make するルールがありません.  中止.
cannot remove path when cwd is /tmp/test for /tmp/test:  at t/installer-makefile-3.t line 24
t/installer-makefile-3.t .. ok
t/installer-makefile.t .... 1/2 make[1]: *** ターゲット `install' を make するルールがありません.  中止.

#   Failed test at t/installer-makefile.t line 20.
cannot remove path when cwd is /tmp/test for /tmp/test:  at t/installer-makefile.t line 22
# Looks like you failed 1 test of 2.
t/installer-makefile.t .... Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/2 subtests
t/text.t .................. ok

Test Summary Report
-------------------
t/installer-makefile-2.t (Wstat: 256 Tests: 2 Failed: 1)
  Failed test:  2
  Non-zero exit status: 1
t/installer-makefile.t  (Wstat: 256 Tests: 2 Failed: 1)
  Failed test:  2
  Non-zero exit status: 1
Files=12, Tests=72,  9 wallclock secs ( 0.49 usr  0.00 sys +  4.49 cusr  1.28 csys =  6.26 CPU)
Result: FAIL
Failed 2/12 test programs. 2/72 subtests failed.
make: *** [test_dynamic] エラー 255

OTL

さらに追記

id:mattn さん製のブランチのソースコードをコンパイルすることで、無事Vimanaを利用できる所まで漕ぎ着けました。
mattn++

Symfonyで環境の違いを考慮した設定方法

symfonyのインストールディレクトリが違う

三項演算子なりswich文なりで、パスを動的に書き換える。
ヒットする可能性が高い順に調べることで、比較回数を減らすよう考慮すべし。

web/index.php
<?php
$path = is_file('/usr/local/share/pear/symfony/autoload/sfCoreAutoload.class.php')
  ? '/usr/local/share/pear/symfony/autoload/sfCoreAutoload.class.php'
  : '/usr/share/pear/symfony/autoload/sfCoreAutoload.class.php';

require_once $path;

sfCoreAutoload::register();

class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    // for compatibility / remove and enable only the plugins you want
    $this->enableAllPluginsExcept(array('sfPropelPlugin', 'sfCompat10Plugin'));
  }
}

cookieのパス

factories.ymlで設定可能ですが、factries.yml読み込み時にはRequestオブジェクトがまだ作成されていないので正規表現で動的に作成しました。正規表現は sfWebRequest.class.php の getRelativeUrlRoot メソッドから拝借。

apps/frontend/config/factories.yml
all:
  storage:
    class: sfSessionStorage
    param:
      session_name: symfony
      session_cookie_path: <?php echo preg_replace('#/[^/]+\.php5?$#', '', $_SERVER['SCRIPT_NAME']).'/' ?>

その他

databases.yml や .htaccess は変更なしで使えるようテスト環境、本番環境で揃えた方が楽。無理な場合は、バージョン管理やrsync対象から外す。その代わり、databases.yml.sample .htaccess.sample というファイルを用意しておき、リネーム(.sample削る)して環境に応じて編集するようにすれば1から記述する手間が多少減る。

.gitignore

Git用にこんな設定にしてます。

*.swp
cache/
data/
log/
config/databases.yml
web/.htaccess

init.sh

.gitignoreの対になるシェルスクリプトとしてこんなの作りました。

#!/bin/sh
mkdir -p cache data/fixtures data/sql log
chmod 777 cache log
cp config/databases.yml.sample config/databases.yml
cp web/.htaccess.sample web/.htaccess

git clone してきた後に

$ ./init.sh

することで、必要なディレクトリを生成します。

hoge.cssをhoge.css?20100110にするタスク作った

なぜクエリー文字列を付加するのか

せっかくCSSやJSを変更しても、ブラウザのキャッシュが残っていて変更が反映されない場合があります。そんなときによく使われるテクニックが、ファイル名の後ろにクエリー文字として更新時間を追加するというものです。こうすることで、ブラウザのキャッシュからではなく、更新後のファイルを読み込ませることが可能になります。

でも

変更するたびにview.ymlを書き換えるのはめんどくさい。ということでタスク化してみました。

使い方

$ symfony view:modified-time

このタスクを実行することで、タスクが自動的にview.ymlを探し出しCSSとJSファイル名の後ろに更新時間を付加します。あと、オプションとして、更新時間のフォーマットとYAMLファイルの出力形式を変更できます。

コード

<?php
/**
 * Add modified time to CSS and JS files
 *
 * For example
 * -  stylesheets: [common]
 * +  stylesheets: [common.css?20100105]
 */
class viewModifiedtimeTask extends sfBaseTask
{
  protected
    $format = '', // date format
    $ext    = ''; // file extension

  protected function configure()
  {
    $this->addOptions(array(
      new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED, 'The application name', 'frontend'),
      new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'The environment', 'dev'),
      new sfCommandOption('connection', null, sfCommandOption::PARAMETER_REQUIRED, 'The connection name', 'doctrine'),
      new sfCommandOption('format', null, sfCommandOption::PARAMETER_REQUIRED, 'The date format', 'Ymd'),
      new sfCommandOption('inline', null, sfCommandOption::PARAMETER_REQUIRED, 'The level where you switch to inline YAML', 2)
    ));

    $this->namespace        = 'view';
    $this->name             = 'modified-time';
    $this->briefDescription = 'Add modified time to CSS and JS files';
    $this->detailedDescription = <<<EOF
The [view:update-time|INFO] task does things.
Call it with:

  [php symfony view:modified-time|INFO]
EOF;
  }

  protected function execute($arguments = array(), $options = array())
  {
    $this->format = $options['format'];

    $files = sfFinder::type('file')->name('view.yml')->in('.');
    foreach ($files as $file)
    {
      $configuration = sfYaml::load($file);

      foreach ($configuration as $view_name => $c)
      {
        if (isset($c['stylesheets']))
        {
          $this->ext = 'css';
          $configuration[$view_name]['stylesheets'] = array_map(array($this, 'addModifiedTime'), $c['stylesheets']);
        }

        if (isset($c['javascripts']))
        {
          $this->ext = 'js';
          $configuration[$view_name]['javascripts'] = array_map(array($this, 'addModifiedTime'), $c['javascripts']);
        }
      }

      file_put_contents($file, sfYaml::dump($configuration, $options['inline']));
    }
  }

  protected function addModifiedTime($source)
  {
    if (false !== strpos($source, '*'))
    {
      return $source;
    }

    if (false !== $pos = strpos($source, '?'))
    {
      // remove query string
      $source = substr($source, 0, $pos);
    }

    if (false === strpos(basename($source), '.'))
    {
      // add file extension
      $source .= '.'.$this->ext;
    }

    $path = sprintf('%s/%s/%s', sfConfig::get('sf_web_dir'), $this->ext, preg_replace('/^-/', '', $source));
    $modified_time = date($this->format, filemtime($path));

    return $source.'?'.$modified_time;
  }
}

imagesファルダ下にあるfavicon.icoを参照させる方法

apacheのエラーログ見たら、File does not exist favicon.icoの嵐で参ったよ。
早速favicon.icoを作成して設置しました。

faviconを設置

通常は、

<link rel="shortcut icon" href="/favicon.ico" />

こんな記述なんですけれど、今回はimagesフォルダ下のfavicon.icoを参照させたかったので

<?php echo tag('link', array('rel' => 'shortcut icon', 'href' => _compute_public_path('favicon', 'images', 'ico', false))) . PHP_EOL ?>

動的生成に変更しました。


_compute_public_path関数は

  • symfony/helper/AssetHelper.php にあるのでデフォで読み込まれている
  • image_tagなどの生成時に使われている関数でもある
  • いろいろ応用ができそうな便利関数だと思う