「Exit」を含む日記 RSS

はてなキーワード: Exitとは

2010-04-22

Redmine 0.9.3をTomcat 6で実行する方法

結構苦労したので健忘録として。。

環境は以下のとおり

JDK, Tomcat, JRubyインストール済み

MySQLインストール
yum install mysql-server
MySQLの起動
/etc/init.d/mysqld start
MySQLの設定

rootパスワードなどを設定する

mysql_secure_installation
Rubyモジュールインストール

RubyGemsモジュールインストールする

jruby -S gem install rails
jruby -S gem install warbler
jruby -S gem install activerecord-jdbc-adapter
jruby -S gem install activerecord-jdbcmysql-adapter
jruby -S gem install jdbc-mysql
MySQLRedmineデータベースを作成
mysql -u root -p
mysql> create database redmine character set utf8;
mysql> grant all privileges on redmine.* to 'redmine'@'localhost' identified by 'redmine';
mysql> exit

(ここでは、パスワードredmineしているが自由に)

RedmineDB設定

(任意の場所にRedmine解凍して、解凍先のディレクトリに移動した後)

cp config/database.yml.example config/database.yml
vi config/database.yml

database.yml

production:
  adapter: jdbcmysql
  database: redmine
  host: localhost
  username: redmine
  password: redmine
  encoding: utf8

#development:
#
#
#test:
#
#

後のwarbleでのエラーを防ぐため、developmentとtestコメントアウト

DBへのデータ投入
jruby -S rake generate_session_store
jruby -S rake db:migrate RAILS_ENV=production
jruby -S rake load_default_data RAILS_ENV=production
起動確認

script/serverで起動し、http://localhost:3000 にアクセスして正常に動作するか確認する

jruby script/server -e production
production.rbの修正

Tomcatで動かしたときにログ出力するための設定をする

vi config/environments/production.rb
config.logger = Logger.new(config.log_path)
config.logger.level = Logger::INFO
warblerの設定

warble.rbを生成

jruby -S warble config

warble.rbを修正

vi config/warble.rb
  config.dirs = %w(app config lib log vendor tmp extra files lang)
  config.gems = ["jdbc-mysql", "activerecord-jdbcmysql-adapter", "activerecord-jdbc-adapter"]
  config.gems["rails"] = "2.3.5"
  config.gems["rack"] = "1.0.1"
  config.webxml.rails.env = "production"

warファイルを作成

jruby -S warble

できたwarファイルTomcatに配置して、Tomcatを起動する

mv redmine-0.9.3.war /usr/local/tomcat/webapps/redmine.war
/usr/local/tomcat/bin/startup.sh

warblerのバグ(?)でwarに入らないファイルコピーして入れる

cp vendor/gems/rubytree-0.5.2/.specification /usr/local/tomcat/webapps/redmine/WEB-INF/vendor/gems/rubytree-0.5.2

http://localhost:8080/redmine/ にアクセスしてインストールできたか確認して完了!

2009-12-09

Dignitas

スイスには二つの自殺幇助団体が存在する。

ExitとDignitas、この二つである。Exitスイス人にしか手を貸さないがDignitasは外国人も受け入れるそうだ。

早期に人生を終わらせたいと思う人はDignitasにコンタクトをとってみるのはどうだろうか?

私もコンタクトをとろうとしてみたが、いかんせん、HPドイツ語で書かれていてどうすればいいのか分からない。

もし、このDignitasに関して詳細なことを知っている方が居れば一報頂きたいものである。

2009-11-01

ツールTips: chkdskシステム障害は治ることが多い。

XPOSシステムトラブルで起動しなくなったなどの場合、

修復コンソールのchkdskシステム障害は治ることが多い。

方法:

1/ DVDから起動するように、先にBIOSの設定を変えておく

2/ XPDVDから起動する

3/ Windows XP 回復コンソール モードに入る

4/ コマンドプロンプト入力モードになったら、

5/ OSの入っている方のドライブかどうか確認し(通常はCでそのまま)

6/ 違っていれば CDチェンジディレクトリ)でドライブを変える

    例→ cd C

7/ CHKDSKコマンドで、ディスクを修復する

    例→ CHKDSK

  Windowsに入っている場合は、

C:WINDOWS>chkdsk C: /R

※Rは修復コマンド

8/ 修復が終わったら、EXIT と入力して再起動

http://support.microsoft.com/kb/314058/ja

2009-10-29

http://anond.hatelabo.jp/20091029230507

while (1)

{

if (tairyoku == 0) break;

++shigoto;

--tairyoku;

}

exit(I_CAN_FLY_MY_FRIENDS);

2009-05-12

WHO旅行規制空港での検疫は意味がないって言ってるよ

もう過去の話題かもしれないけど、新型インフルエンザについて。

 

WHOウェブサイトを訳すよ。あんま時間がないから訳は流し読みつつ適当で。

http://www.who.int/csr/disease/swineflu/frequently_asked_questions/travel/en/index.htmlより

Is it safe to travel?

旅行は安全?

 

WHO is not recommending travel restrictions related to the outbreak of the influenza A(H1N1) virus. Today, global travel is commonplace and large numbers of people move around the world for business and leisure. Limiting travel and imposing travel restrictions would have very little effect on stopping the virus from spreading, but would be highly disruptive to the global community.

WHO新型インフルエンザウイルス流行関係した旅行規制を推奨しません。こんにちではグローバル旅行日本でいう「海外旅行」)はありふれており、多くの人間ビジネスあるいは余暇のために世界中旅行しています。旅行を制限したり、旅行規制を強化したりすることは、ウイルスが広まるのをストップするのに対して非常に小さな効果しか持ちえず、しかしグローバルコミュニティを混乱させるだけです。

 

Influenza A(H1N1) has already been confirmed in many parts of the world. The global response now focuses on minimizing the impact of the virus through the rapid identification of cases, and providing patients with appropriate medical care, rather than on stopping its spread internationally.

新型インフルエンザはすでに世界の多くの地域で確認されています。現在グローバルな対応が今フォーカスしているのは、患者の発生を早急にアイデンティファイすることを通じて、ウイルスインパクトを最小化することであり、患者に対して適切な医療ケアを与えることであり、ウイルスが国際的に広まることをストップすることではありません。

 

Although identifying signs and symptoms of influenza in travellers can help track the path of the outbreak, it will not reduce the spread of influenza, as the virus can be transmitted from person to person before the onset of symptoms.

旅行者におけるインフルエンザの兆候や症候をアイデンティファイすることは、流行の経路を追跡するのを助けるでしょうが、そんなことではインフルエンザの拡大は低減できません。というのも、ウイルスは症候が出る前に人から人に伝染ってしまうからです。

 

Scientific research based on mathematical modelling shows that restricting travel would be of limited or no benefit in stopping the spread of disease. Historical records of previous influenza pandemics, as well as experience with SARS, validate this.

数学的なモデリングに基づく科学リサーチによれば、病気の拡大をストップすることに関して、旅行の制限によって得られるベネフィットは限られたものかゼロです。過去インフルエンザパンデミック記録や、SARS経験も、このことをヴァリデート(検証・実証)しています。

 

------------------------------------------------------------------------------------

Does WHO recommend screenings at country entry and exit points to detect if ill people are travelling?

WHOは入国・出国の時点で病気人間旅行者の中にいるかどうかを検査するようなスクリーニングを推奨しますか?

 

No. We do not believe entry and exit screenings would work to reduce the spread of this disease. However country-level measures to respond to a public health risk are the decision of national authorities, under the International Health Regulations 2005.

ノー。 私たちは入国や出国の時点でのスクリーニングが、このインフルエンザの拡大を低減するのに役立つとは信じていません。しかし、国レベルでの公衆衛生リスクに対応する政策は、"International Health Regulations 2005"の下におけるその国家のオーソリティの決定事項です。

 

Countries that adopt measures that significantly interfere with international traffic (e.g. delaying an airplane passenger for more than 24 hours, or refusing country entry or departure to a traveller) must provide WHO with the public health reasoning and evidence for their actions. WHO will follow up with all of its Member countries on such matters.

国際的なトラフィックに対し著しく干渉するような政策(例えば、航空機の乗客を24時間以上遅らさせたり、旅行者の入国や出国を拒否したりするような施策)を採用する国は、公衆衛生上のリーズンと施策者の行為の(正当性の)証拠をWHOに提供しなくてはなりません。WHOはその加入国全てにおけるそのようなマターをフォローアップします。

 

Travellers should always be treated with dignity and respect for their human rights.

旅行者は常に彼らの人権に対する尊厳リスペクトを以って扱われるべきです。

 

------------------------------------------------------------------------------------

How can I protect myself from influenza A(H1N1) when I am travelling?

旅行するときに、私はどうやって自分の身を新型インフルエンザから守ればよいでしょうか?

 

People who are ill should delay travel plans. Returning travellers who become ill should contact their health care provider.

病気になっている人はその旅行を延期すべきです。帰国後に病気になった人は自分主治医コンタクトを取るべきです。

 

Travellers can protect themselves and others by following simple prevention practices that apply while travelling and in daily life.

旅行者たちが自分健康自分の周りの他人の健康を守るためにできることは、旅行中における、あるいは日常生活におけるシンプル感染予防法の実践に従うことです

2009-04-14

http://anond.hatelabo.jp/20080822142610

スーパーpre記法がアレなまま直ってないわけで。

姉妹サイト(?)ができていたわけで。

なにやらcookieを食べようとした形跡があるわけで。

#!/usr/local/bin/perl -w
use strict;
use warnings;

use Web::Scraper;
use URI;
use Perl6::Say;
use MIME::Type;
use HTTP::Cookies;
use LWP::UserAgent;
use Path::Class;
use Data::Dumper;sub p { print Data::Dumper::Dumper(@_) };

# cookie_jar


  

2008-10-18

real street angels から mechanize を使って動画を取ってきてEmacsで見てみるよ

せっかく書いたから匿名でのせてみるよ

使い方は

  • 動画を取ってきたいよ
    • config.yamlユーザとかを設定するよ
    • ids.txt に取ってきたいIDを書くよ
    • sangels.bat を実行するよ
  • Emacs動画を見たいよ
    • sangels.el を load するよ
    • M-x sangels だよ

必要なものを gem で取ってくるにはこうすればいいよ

  • gem install -r log4r
  • gem install -r -v 0.6 hpricot
  • gem install -r mechanize

長すぎてelispが消えたから続きがあるよ

sangels.bat - 起動用バッチファイル

@echo off
setlocal
set WD=%~dp0
cd /d %WD%

ruby get_movies.rb
ruby get_images.rb
ruby create_m3u.rb

ruby

config.yaml - 設定ファイル
user: ユーザID
password: パスワード
ids_file: ids.txt
done_file: ids_done.txt
movies_dir: movies

log4r_config:
  pre_config:
    global: INFO
  loggers:
    - name: app
      type: Log4r::Logger
      level: INFO
      outputters:
        - STDOUT
        - FILE
  outputters:
    - name: STDOUT
      type: Log4r::StdoutOutputter
      formatter:
        type: Log4r::PatternFormatter
        pattern: "%d [%l] %C - %M"
        date_pattern: "%H:%M:%S"
    - name: FILE
      type: Log4r::FileOutputter 
      filename: "#{LOGDIR}/sangels.log"
      formatter:
        type: Log4r::PatternFormatter
        pattern: "%d [%l] %C - %M"
        date_pattern: "%Y-%m-%d %H:%M:%S"
get_movies.rb
require 'fileutils'
require 'logger'
require 'mechanize'

BASEDIR = File.dirname($0)
require "#{BASEDIR}/util"
require "#{BASEDIR}/sangels"

$config = load_config(BASEDIR)
prepare_logger(BASEDIR)
$log = new_logger("get_movies")
WWW::Mechanize.log = new_logger("mechanize")
WGet.log = $log

class IDFile
  def initialize(file)
    @file = file
    unless File.exist?(@file)
      Fileutils.touch(@file)
    end
  end

  def ids(contains_comment = nil)
    File.open(@file) {|io|
      io.to_a.map {|x|
        x.chomp
      }.select {|x|
        if x.empty?
          nil
        elsif contains_comment
          true
        else
          not /^\s*\#/ =~ x
        end
      }
    }
  end

  def add(id)
    ids = ids(true)
    unless ids.any? {|x| x == id}
      write(ids + [id])
    end
  end

  def delete(id)
    ids = ids(true)
    if ids.any? {|x| x == id}
      write(ids - [id])
    end
  end

  def write(ids)
    File.open(@file, "w") {|io|
      ids.each {|x| io.puts x}
    }
  end
end


$log.info("BEGIN #{$0} ================")
exit_code = 0
begin
  ids_file = IDFile.new($config.ids_file)
  done_file = IDFile.new($config.done_file)
  movies_dir = $config.movies_dir
  wget = WGet.new

  sangels = SAngels.new
  sangels.login($config.user, $config.password)
  ids_file.ids.each {|id|
    begin
      movies = sangels.movies(id)
    rescue SAngels::Movies::InvalidMoviesError
      $log.warn("invalid movie id: #{id}")
      next
    end
    dir = File.expand_path(id, movies_dir)
    movies.each {|link|
      wget.retrieve(link.href, dir)
    }
    expected = movies.movie_links.map{|x| File.basename(x.href)}
    actual = Dir.glob("#{dir}/*").map {|x| File.basename(x)}
    if (expected - actual).empty?
      done_file.add(id)
      ids_file.delete(id)
    end
  }
rescue => e
  $log.error(e)
  exit_code = 1
end

$log.info("END #{$0} (#{exit_code}) ================")
exit exit_code
get_images.rb
require 'fileutils'
require 'logger'
require 'mechanize'
require 'ostruct'

BASEDIR = File.dirname($0)
require "#{BASEDIR}/util"
require "#{BASEDIR}/sangels"

$config = load_config(BASEDIR)
prepare_logger(BASEDIR)
$log = new_logger("get_images")
WWW::Mechanize.log = new_logger("mechanize")
WGet.log = $log

$log.info("BEGIN #{$0} ================")
exit_code = 0
begin
  movies_dir = $config.movies_dir
  sangels = SAngels.new
  sangels.login($config.user, $config.password)
  thumbnails = sangels.thumbnails

  Dir.glob("#{movies_dir}/*").each {|dir|
    next unless File.directory? dir
    id = File.basename(dir)

    url = thumbnails.url(id)
    unless url
      $log.warn("#{id} is not found")
      next
    end
    path = File.expand_path("00_thumbnail#{File.extname(url)}", dir)
    next if File.exist? path

    $log.info("retrieving #{url}")
    thumbnail = thumbnails.get_file(id)
    File.open(path, "wb") {|io| io.write(thumbnail)}
  }
rescue => e
  $log.error(e)
  exit_code = 1
end

$log.info("END #{$0} (#{exit_code}) ================")
exit exit_code
create_m3u.rb
BASEDIR = File.dirname($0)
require "#{BASEDIR}/util"

$config = load_config(BASEDIR)
movies_dir = $config.movies_dir
Dir.glob("#{movies_dir}/*") {|dir|
  next unless File.directory? dir
  name = File.basename(dir)
  files = Dir.glob("#{dir}/*.wmv").sort

  File.open("#{movies_dir}/#{name}.m3u", "w") {|io|
    files.each {|file|
      io.puts "#{name}/#{File.basename(file)}"
    }
  }

  File.open("#{dir}/00_movies.m3u", "w") {|io|
    files.each {|file|
      io.puts "#{File.basename(file)}"
    }
  }
}
sangels.rb
require 'mechanize'
require 'hpricot'

BASEDIR = File.dirname($0)
require "#{BASEDIR}/util"

class SAngels
  HOST = "real2.s-angels.com"
  LOGIN_URL = "http://#{HOST}/member/"
  INFO_URL = "http://#{HOST}/teigaku/item.php"
  THUMBNAILS_URL = "http://#{HOST}/teigaku/"
  THUMBNAIL_URL = "http://#{HOST}/images/default/thumb/"

  def initialize()
    @agent = WWW::Mechanize.new
  end

  def login(user, password)
    login_form = @agent.get(LOGIN_URL).forms.find {|form|
      form.fields.any? {|field| field.name == "frmLoginid"}
    }
    login_form.frmLoginid = user
    login_form.frmPw = password
    @agent.submit(login_form)
  end

  def movies(id, no_validate = nil)
    Movies.new(@agent, id, !no_validate)
  end

  def thumbnails
    Thumbnails.new(@agent)
  end

  class Thumbnails
    def initialize(agent)
      @agent = agent
      doc = Hpricot(@agent.get_file(THUMBNAILS_URL))
      elems = doc.search("div[@class=realthum]/a")
      @links = Hash(
        elems.map {|elem|
          href = elem["href"]
          id = $1 if /ID=(.+)/ =~ href
          url = elem.search("img")[0]["src"]
          [id, url]
        })
    end

    def get_file(id)
      @agent.get_file(url(id))
    end

    def url(id)
      @links[id]
    end

    def exist?(id)
      url(id)
    end
  end

  class Movies
    class InvalidMoviesError < StandardError
    end

    def initialize(agent, id, no_validate)
      @agent = agent
      @id = id
      if !no_validate &amp;&amp; !valid?
        raise InvalidMoviesError
      end
    end

    def info_page_url
      "#{INFO_URL}?ID=#{@id}"
    end

    def info_page
      @agent.get(info_page_url)
    end

    def movies_page
      @agent.click(info_page.links.find {|link| /P=10/ =~ link.href})
    end

    def movie_links
      movies_page.links.select {|link|
        /wmv$/ =~ link.href
      }.sort {|a, b|
        File.basename(a.href) <=> File.basename(b.href)
      }
    end

    def valid?
      info_page.uri.to_s == info_page_url
    end

    def each(&amp;block)
      orig_links = movie_links
      orig_links.each {|orig_link|
        link = movie_links.find {|l| File.basename(l.href) == File.basename(orig_link.href)}
        block.call(link)
      }
    end
  end
end
util.rb
require 'log4r'
require 'log4r/yamlconfigurator'
require 'singleton'
require 'fileutils'
require 'ostruct'

def Hash(a)
  Hash[*a.flatten]
end

def load_config(basedir)
  OpenStruct.new(File.open("#{basedir}/config.yaml") {|io| YAML.load(io)})
end

def new_logger(name)
  Log4r::Logger.new("app::#{name}")
end

def prepare_logger(basedir, logdir = nil)
  logdir ||= basedir
  Log4r::YamlConfigurator["LOGDIR"] = logdir
  Log4r::YamlConfigurator.load_yaml_file("#{basedir}/config.yaml")
end

class NullObject
  include Singleton
  def method_missing(message, *arg)
    NullObject.singleton
  end
end

class WGet
  class << self
    attr_accessor :log
    def initialize
      super
      @log = NullObject.singleton
    end
  end
  
  def log
    self.class.log
  end

  def retrieve(url, dir)
    FileUtils.mkdir_p(dir)
    file = File.expand_path(File.basename(url), dir)
    if File.exist?(file)
      log.info("already retrieved #{url}")
      return true
    end

    tmp = "#{file}.part"
    log.info("retrieving #{url}")
    ret = system("wget", "-c", "-O", tmp, url)
    if ret
      log.info("retrieving succeeded #{url}")
      File.rename(tmp, file)
    else
      if $? == 0x020000 # Ctrl-C
        exit($?)
      else
        log.error("retrieving failure #{url} (#{$?})")
      end
    end
    return ret
  end
end

2008-09-06

グラリバのいいところが見つからない

初めて増田を使ってみた。

大抵の方はタイトルを見てこのエントリに来ていただいていると思うので、グラディウスリバース(以下グラリバ)についての説明は割愛。

グラリバが配信されて当然速攻で落として、平日だと言うのに必死でプレイして、コンティニュー連打で何とかノーマルモード3周済ませた。

さあ、自分の表のブログとかmixi日記とかで良い感想をたくさん書いてグラリバを大いに盛りあげてやろう、と思ったのに・・・何故か手が進まない。

情報公開から配信、そしてプレイ中はあんなにいい気分だったのに、どうしてもグラリバの、他人に推したい点が思いつかないのだ。割と本気で困っている。

もちろん、移植ではない完全新作タイトルであるところとか、グラディウスとしてバランス良く仕上がっているとか、この内容で1000円というコストパフォーマンスの高さとか、MSXグラディウス2のビフォーストーリーが語られているとか、難易度EASY/VERY EASYが史上最高に簡単(でもNORMALの下がいきなり敵弾破壊可能、で「普通のEASY」がないのはどうかと思う。本来EASYに求められる「敵の攻撃パターンや弾の撃ち方を覚えましょう」って役目を放棄している気がする…)とか、良い点はたくさんあるんだけど、他の作品ではなくこのグラリバを他人に「YOUプレイしちゃいなYO!」って推す要素が見つからないのだ。

ご存知の通りグラリバは、ありとあらゆる要素を過去の作品から引っ張ってきている。曲しかり、ステージグラフィックしかり、敵キャラしかり。

Wikipediaなんかだと「随所に小ネタが??」みたいな書かれ方をしているけど、“小ネタ”でしかゲームが構成されていないと言っても過言ではない。

むろんこれは「グラVI」みたいなナンバリングタイトルメインストリーム)ではないし、WiiWareだし、言うなれば携帯アプリみたいなもんで、だからこういうセルフパロディというかミニゲーム的な内容でも全然ありだと思う。最初から「100%旧ネタを用いたセルフパロディ的作品です!」とアナウンスされているならこんなに変な気分にはならなかったと思っている。

グラリバみたいな「旧ネタ」を盛り込むことを重視した作品と言えば「外伝」が思いつくんだけど、旧ネタをそのまま、ではなくてちゃんと咀嚼してそこから新しいものを作り出しているじゃない。

例えば3面の結晶面。「グラII」3面が元ネタであるのは自明だけど、そこにレーザー屈折という新しい要素を加えてきた。

あと7面の火山面。ステージグラフィック伝統火山面そのままなんだけど、ここに「エピII」4面の重力要素を加えている。エピIIでは地形に引かれるというギミックだったけど外伝は地形までも巻き込んで画面方向に引かれるという凝った演出で。

でもグラリバのステージ元ネタをそのまま引っ張ってきていて全くひねられていないことにガッカリ、というか困惑させられている。骨面とかは本当にそのまま。骨面なら骨面をやりたい!と思ったときに、PCE版グラIじゃなくてグラリバを選ぶ気になるか?という話。

音楽に関してもそう。作曲者はいまやシューターならその名を知らない者は居ないと言ってもいいような人気コンポーザー並木学さん。僕もとくに並木さん本人のファンというわけではないけど、「バトルガレッガ」と「ケツイ」の曲は大好きでよく聴いてる。

そんな有名なコンポーザーをおそらくは高いギャラで雇って「新曲はいらないです。全曲過去作からのアレンジでお願いします」とは・・・僕ならとてもじゃないけど言えないw

だって、並木さんの曲が好きで、グラディウスの曲が好きだったら「並木さんの作るグラディウス」が聴きたいでしょ、常識的に考えて。

たとえば空中戦アレンジ曲、ステージ曲をオリジナル曲、とかに出来なかったのかなと。

あとアレンジもあまり「ひねりがないな」と言うのが正直な感想。例えばSFC版「グラIII」の奇数ボスの曲なんかは「Aircraft Carrier」のアレンジで、譜面だけで見ると全然変わっちゃっているんだけど、やっぱり聴けばちゃんと「ああ、ビッグコアの曲のアレンジだ!」って分かる。折角高名なコンポーザーを高い金で使うんだから、そのくらいやっていただかないと損じゃないか?と思うし。

あんまり音楽の話ばっかりしたくないんだけど、原曲とグラリバで曲が使われている場面にあまり整合性がないのも何だかなー、って気分になる。元ネタの曲を選定したのが並木さんなのかM2さんなのか分からないんだけど、曲だけ聴いて決めていたとしたら、ちょっとそれは元ネタに対する敬意が払われていないんじゃないか、と思ってしまう。

全5面のうちの2面でいきなり「LAST EXIT」が流れてくるのはやっぱり違和感があるし、最終面の曲がよりにもよってMSX沙羅曼蛇のバッドエンドの曲とか、縁起が悪すぎるw(伝統的に最終要塞の曲はもうちょっと明るい雰囲気が多いのでその点からも違和感がある…)

そして一番違和感があるのは、開発元もプレイヤー側も、「今回のグラ新作、旧ネタ満載で素晴らしい!」としか捉えてないこと。満載って言うか、ここまで来ると過積載だよ。

2chスレとか、ネット上では「グラV」とか新しいグラディウスはあまり受けがよくないように見えて(でもこれは本当に「見える」だけだと思う。反対派の声がでかすぎるだけで実際には「反対意見はないから出さない」人がサイレントマジョリティだ)、「旧作の曲はあんなに素晴らしかったのに」「旧作のステージはあんなに遊び甲斐があったのに」みたいな意見をよく目にするから、おそらくはそういうプレイヤーたちに文句を言われないようなつくりを考えたらああなってしまったんじゃないかな、とも思う。作曲者も、東野さんや古川さんを呼べないなら、文句が出ないような人だともう並木さんぐらいしかなかったのかなと。

確かに文句は出ていない、いまのところ。ゲーム単体として考えればグラリバは普通グラディウスだし面白い。でもあまりにも姿勢が安直過ぎる。「文句を出さない」事しか考えてなくて、「グラディウスの新作を作ってやろう」、ひいては「新しいゲームを作って売り出そう」ってことへの意欲が全く見えてこない。

僕もグラディウスが好きで、ここで言う「旧作」もほぼ全部プレイしたことがある。それゆえにグラリバで旧ネタがいっぱい使われていると知ったときは嬉しかった。MSXシリーズストーリーに則った作品だと知ったときは本当にエキサイトして、変な汁が出そうになった。…しかし、「旧ネタしかない」グラディウスを商用作品で出されてしまって正直なところ嫌な気分になっている。「あいつらは旧作だけ与えておけばおとなしいから」ってバカにされている気がする。

グラリバには「グラリバだから出来るなにか」がなくて、「次に続くなにか」もない。

だから残念ながら僕は、他人にこのゲームを勧める事が出来ない。

2008-03-15

[][]PythonからSWIG経由でVisual Studio 2005を使って困ったこと

以上のような組み合わせで出くわした困ったことと、その解決策をメモしておきます。

setup.py を実行するとエラーが表示された!

Python was built with Visual Studio 2003;

extensions must be built with a compiler than can generate compatible binaries.

Visual Studio 2003 was not found on this system. If you have Cygwin installed,

you can try compiling with MingW32, by passing "-c mingw32" to setup.py.

setup.pyに.iファイルとか.cppファイルを記述して実行すると、こんな感じのエラーメッセージが表示されました。うーん、困った!

http://labs.cybozu.co.jp/blog/mitsunari/2007/08/vc2005boostpython.html

上記のページを参考にして、"%Pythonインストールしたフォルダ%/Lib/distutils/msvcompiler.py"を以下のように修正してみたら解決できました。ありがとうありがとう

--- msvccompiler.py    2007-04-04 17:17:12.000000000 +0900
+++ 
@@ -126,7 +126,7 @@
         self.set_macro("FrameworkDir", net, "installroot")
         try:
             if version > 7.0:
-                self.set_macro("FrameworkSDKDir", net, "sdkinstallrootv1.1")
+                self.set_macro("FrameworkSDKDir", net, "sdkinstallrootv2.0")
             else:
                 self.set_macro("FrameworkSDKDir", net, "sdkinstallroot")
         except KeyError, exc: #
@@ -252,7 +252,10 @@

     def initialize(self):
         self.__paths = []
-        if os.environ.has_key("DISTUTILS_USE_SDK") and os.environ.has_key("MSSdk") and self.find_exe("cl.exe"):
+        if self.__version >= 7.1 or (
+            os.environ.has_key("DISTUTILS_USE_SDK") and
+            os.environ.has_key("MSSdk") and
+            self.find_exe("cl.exe")):
             # Assume that the SDK set up everything alright; don't try to be
             # smarter
             self.cc = "cl.exe"
@@ -288,10 +291,16 @@

         self.preprocess_options = None
         if self.__arch == "Intel":
-            self.compile_options = [ '/nologo', '/Ox', '/MD', '/W3', '/GX' ,
-                                     '/DNDEBUG']
-            self.compile_options_debug = ['/nologo', '/Od', '/MDd', '/W3', '/GX',
-                                          '/Z7', '/D_DEBUG']
+            if self.__version >= 7.1:
+                self.compile_options = [
+                    '/nologo', '/Ox', '/MD',  '/W3', '/EHsc', '/DNDEBUG']
+                self.compile_options_debug = [
+                    '/nologo', '/Od', '/MDd', '/W3', '/EHsc', '/Z7', '/D_DEBUG']
+            else:
+                self.compile_options = [
+                    '/nologo', '/Ox', '/MD',  '/W3', '/GX',  '/DNDEBUG']
+                self.compile_options_debug = [
+                    '/nologo', '/Od', '/MDd', '/W3', '/GX', '/Z7', '/D_DEBUG']
         else:
             # Win64

cl.exeが見つからないと言われた!

setup.pyを実行するとcl.exeが見つからないみたいなエラーが表示されました。これは、アレだ。「パス通せ!」ということですね。bashを起動するときのバッチファイル(たぶん"cygwin.bat"とか)で、以下のような行を入れてやれば解決しました。

call "%VS80COMNTOOLS%vsvars32.bat"

setup.pyを実行したときに"basetsd.h"が開けないと言われた!

d:\python25\include\pyconfig.h(189) : fatal error C1083: include ファイルを開けません。'basetsd.h': No such file or directory

error: command 'cl.exe' failed with exit status 2

setup.pyを実行すると、上のようなエラーが表示されました。

http://d.hatena.ne.jp/ousttrue/20070531/1180556273

上記のサイトを見るとインクルードパスが通っていない場所に"basetsd.h"があるのが原因なので、"cygwin.bat"にインクルードパスの設定をしておきました。

call "%VS80COMNTOOLS%vsvars32.bat"
set INCLUDE=C:\Program Files\Microsoft Platform SDK\Include;%INCLUDE%

setup.pyを実行したときのリンク時にエラーが発生した!

link: extra operand `/INCREMENTAL:NO'

詳しくは `link --help' を実行して下さい.

error: command 'link.exe' failed with exit status 1

これは、cygwinのほうのlink.exeが実行されてるのが原因でした。スマートな解決策ではありませんが、cygwinのほうのlink.exeをリネームして解決。パスの設定順序とかでどうにかできるといいんだけど、どうすればいいんかな。

MSVCR80.dllが見つからないと言われた!

MSVCR80.dllが見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションインストールし直すとこの問題は解決される場合があります。

SWIGが生成した.pyファイルをimportしたら、こんな感じのエラーダイアログが表示されたよ。うーん、困った!

http://d.hatena.ne.jp/moriyoshi/20070525

上記のページを参考にして、"%Pythonインストールしたフォルダ%/python.exe.manifest"として以下のようなファイルを新しく作ったら、解決できました。ありがとうありがとう

あとこれ、bashから実行したらエラーダイアログが表示されず、importするモジュールが見つからないみたいなエラーメッセージが出力されるだけだったよ。

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

2008-01-06

安倍首相の最大の弱点は“学歴”??教育改革は、学歴コンプレックスの現れ?

先ほど、すごいことを発見しました。それは、「政権長期政権かどうかは、首相学歴ズバリ、比例する傾向にある」ということです。この学歴問題を引き合いに出すのは「タブー」になっているのですが、歴代首相を論じる以上は首相出身大学について語らないわけには行かないのです。

歴代首相学歴をザッと調べてみました。

=======

吉田茂 東京帝国大学法科大学政治卒業

片山哲 東大法卒 弁護士

鳩山一郎 東大法卒

石橋湛山 早大文卒

岸信介 東大法卒 商工官僚

池田勇人 京大法卒 大蔵官僚

佐藤榮作 東大法卒 運輸官僚

田中角榮 中央工学校卒 会社社長(+一級建築士

三木武夫 明大法卒

福田赳夫 東大法卒 大蔵官僚

大平正芳 東京大卒 大蔵官僚

鈴木善幸 農林省水産講習所(現東京海洋大学)卒 漁協役員

中曾根康弘 東大法卒 内務官僚

竹下登 早大商卒 島根県議(+雄弁会早大高等学院出身)

宇野宗佑 神戸商大中退 滋賀県

海部俊樹 早大法卒 議員秘書

宮澤喜一 東大法卒 大蔵官僚

細川護熙 上智大法卒 熊本県知事

羽田孜 成城大経卒 会社員(+成城学園高等学校

村山富市 明大政経卒 大分県

橋本龍太郎 慶大法卒 会社

小渕恵三 早大院修 会社役員

森喜朗 早大商卒 新聞記者(+雄弁会

小泉純一郎 慶大経卒 議員秘書

安倍晋三 成蹊大法卒 会社員(+成蹊学園(小学校中学校高等学校))

http://ja.wikipedia.org/wiki/%E5%86%85%E9%96%A3%E7%B7%8F%E7%90%86%E5%A4%A7%E8%87%A3%E3%81%AE%E4%B8%80%E8%A6%A7

==========

これを見て分かることは非常に多い。まず気が付くのは、宮澤喜一首相を最後に東大出身の首相がいない、ということです。ここ数代は、慶応早大のたすきがけ的な形で続いています。

そして、一般的な「偏差値」が高い大学を出た政治家首相になると「長期政権」になるということです。これは、上の履歴書をみると明らかです。

調べるまでは、まさかそんなことは、と思っていましたが、「政治家における学歴差別」は歴然として存在するのです。これで、なぜ安倍首相が不人気なのか、信望がないのかがよく分かりました。偏差値の高い大学出身の首相は、まわりに似たような学歴政治家がたくさんいるワケです。そうすると「同窓会ネットワーク」の層が厚い。

同じ大学の仲間意識で皆が支え合うという意識があるわけです。これは、アメリカにおいても同様で、ブッシュ大統領はあれだけバカだと言われていますが、しっかりエスタブリッシュメント大学のイエール卒業し、しかも、エリートクラブ出身です。それを考えると、安倍首相は哀れなくらいに学歴が低い。いや、学歴が低いといよりは、彼の場合には「受験を経験していない」のです。

受験を経験していないということは、「忍耐力がない」「修羅場の経験がない」という風に一般的に判断されます。しかも、安倍首相小学校からのエスカレーターです。普通受験して成蹊大学に入っているわけではない。これは非常にマイナス点です。

日本では、東大受験に成功することが最高のステータスシンボルであり、東大は一時期までは総理大臣を供給する大学でした。アメリカジャパン・ハンドラーズの研究には「東大」の研究書もいくつもあるんです。東大官僚制度と政治家ネットワークを持つ。これが日本の最大のパワーだったわけです。

====

最も有名なのはチャルマーズ・ジョンソンが共著で加わっている以下の本。ハードカバー版しかない。表紙の「東大」という文字が笑えます。

An Empire of Schools: Japan's Universities and the Molding of a National Power Elite (Hardcover)

by Robert L. Cutts (Author), Chalmers Johnson (Introduction)

Table of Contents

Foreword

Preface

Ch. 1 If There Is a God, He Went to Todai

Ch. 2 First Principles: The Society

Ch. 3 First Principles: The Individual

Ch. 4 The Ivory Basement

Ch. 5 A Tale of Two Citizens

Ch. 6 The Leisure Class

Ch. 7 Who's on Top: The Women Elites

Ch. 8 Family: She's Got the Whole World in Her Hands

Ch. 9 Weapons

Ch. 10 Making It

Ch. 11 Fifty Ways to Lever the Governed

Ch. 12 Reform: No Exit

http://www.amazon.com/Empire-Schools-Universities-Molding-National/dp/1563248433/ref=sr_1_6/102-8054700-3864949?ie=UTF8&s=books&qid=1182385355&sr=8-6

====

同様に、早稲田大学は在野の精神早大雄弁会を結成し、これも政治家供給源になってきました。慶応大学もどうように政財界に太いパイプがある。小泉前首相と綿貫国民新党党首の共通項はともに慶応出身というところです。意外なところで接点があって、それが情報交換のきっかけになったりする。

慶大出身の綿貫氏

そこに行くと、大変失礼なのですが、成蹊大学出身の有力政治家というのはほとんどいません。政治家の仲間がいないということは、つながるネットワークが少ない、ということ。安倍首相ネットワークは「安晋会」のようないかがわしい人たちの集まった後援会組織だったり、父親の晋太郎の時代からのサポートスタッフです。

安倍晋太郎は、病気で早くに亡くなっており、これを継ぐ形で晋三が政治家になっています。安倍家には、東大出身の寛信という三菱商事中国支社のエリートビジネスマンもいましたが、なぜか彼ではなく、晋三に白羽の矢が立っている。

そうなると、何にも自分だけの基盤がないエスカレーター学歴の彼には、父の周辺の後援会に頼るしかなかった。そうなれば、晋三はいいなりです。広域ナントカ団だったり、地元土建業者だったりがまとわりついてくる。それをさばくのは側近たる秘書なのでしょう。

こうなると、なぜ東大出身の寛信氏が後継者にならなかったのかが気になります。順当に東大出の晋太郎が総理大臣になっていれば、晋三が後継者になることはなかったのではないか、と強く思います。しかも、晋三氏には「南カリフォルニア大学」在学時の学歴詐称疑惑で騒がれたこともあります。結局、卒業はしていないということだったようです。民主党代議士学歴詐称を追及している段階で噴出した問題でした。

====

安倍一族の“学歴”一覧

安倍寛(祖父)=東大

岸信介(祖父)=東大

佐藤市郎(大叔父)=海軍大学校主席

佐藤栄作東大

安倍晋太郎(父)=東大

安倍寛信(兄)=東大

岸信夫(弟)=慶応

====

上のリストに戻りますが、小学校卒業田中角栄内閣は、やはり短命政権でした。しかし、彼は安倍首相と違い、たたき上げで、一級建築士資格も持っていた。だから、それなりにポイントは高かったのだろうと思います。鈴木善幸首相もやっぱり短命政権宇野宗佑首相も、羽田孜首相も・・・・。みんな“ポイント”が低かった。

これを法則化して理解した上で他の首相をみていくと、細川護煕首相上智大学出身。細川政権は約一年しか続いていません。早大出身の海部政権は約三年続いています。この事実から、キリスト教大学である上智大学は、首相になる場合の「持ち点」が少し低い、ということになるでしょう。ちなみに政治家では野田聖子さんが上智出身です。村山首相明治大というのも微妙なところなのでしょう。

そこに行くと、面白いのは、故・三塚博さんと小渕優子さんです。三塚さんは、派閥の領袖も務めた大政治家です。彼は、東京獣医畜産専門学校(現日本大学生物資源科学部)を経て早稲田大学第一法学部学士入学し、1951年卒業。在学中は雄弁会に所属しています。わざわざ早稲田学士入学しています。これは雄弁会に入るためでしょう。雄弁会というのは、今は威光もかげってきましたが、それでも現内閣では山本金融大臣を初め出身者が多い。森元首相竹下首相雄弁会ネットワークです。三塚さんは学士入学で早稲田に入って持ち点を上げようとしたわけです。残念ながら、その努力は報われませんでしたが、閣僚にはなっています。

早稲田大学大学院公共経営研究科修了:小渕優子

同様に、早稲田大学社会人になった後に入学したケースとしては、元首相の娘さんである小渕優子さんの例があります。彼女の場合は大学院です。小渕さんは、羽田首相と同じ、成城大学出身です。この大学は意外に政治家が多い。しかし首相になったのは羽田さんだけです。しかも短命政権でした。

そこで小渕さんは、女性なので雄弁会には入れないのですが、早稲田大学政治家をやりながら入学するという「奇策」に打って出ました。これは凄い。さすがは政治家の娘です。政治感覚が鋭いなあと思います。成城大学では幾ら政治家として頑張っても総理大臣はなれない、と冷酷に判断したのでしょう。早稲田に入学したということは、早稲田出身の政治家ネットワークの末席に置いてもらえる可能性がある、ということです。それでもなかなか首相への道は厳しいでしょうが・・・・。なんだか応援したくなりますね。

そう考えると、小学校からのエスカレーター安倍晋三という人が首相になっていることは、国際的な一大スキャンダルである可能性が高いのです。安倍首相が国際的に影が薄いのも早稲田慶応ネットワークに入っていないからかもしれない。そう考えると、一応、外国政治家の経歴を調査する情報機関の間では、東大早稲田慶応の当たりの大学は評価されている、という見方も出来そうです。これが安倍さん慶応幼稚舎出身だったらもう少し違ったのかもしれないですね。

そのようにしながら、日本の政治家を出身大学別に持ち点でプロファイリングしていくのも面白いと思います。同じ慶応早稲田でも、政経学部か文学部か(例:石橋湛山)、第一部(昼間)か第二部(夜間)かで大きく違うのでしょう。私の出身は早稲田の一.五部と言われた社学出身なので、政治家的には微妙ポジションでしょう。

こういう当たり前のことは差別になるといってタブー視されていますが、やはり安倍政権坊ちゃん政権だったのです。周りに大学ネットワークがないから、変なおかしい団体が支援者として食っ付いてくるわけです。そう考えると、やはり安倍政権、長くないでしょう。

ここでどう考えるべきか判断に苦しむのは、ポスト安倍麻生太郎外相の扱いです。学習院大学政経学部政治学卒業とあります。その他、スタンフォードロンドン大学留学しているようですが学位があるかどうかは分かりません。学習院というのはどういう扱いになるか。彼は皇族の血が入っていると同時に、カトリック教徒です。クリスチャン政治家では、大平首相がいますが、これは短命政権に終わりました。(病気だったからかもしれないですが)学習院出身の首相はいないので、これが持ち点が高いのか、低いのかは分からない。ただ成蹊大学出の安倍首相よりは間違いなく麻生外相の方が持ち点は高いはずです。

そこへいくと、同じように微妙なのが東大出身の谷垣禎一財務大臣です。彼が首相になれば久々の東大出身総理となります。しかし、彼は消費税を上げたりして、短命政権になるでしょう。その後に、つまり消費税上げをやった後に、民主党政権が出来るかもしれない。

つまり、大蔵官僚が、自民党責任をおっかぶせて自分たちは民主党政権コントロールするという考え方です。官僚を統制しているのは一部にはアメリカです。今の官僚制度をコントロールできる角栄のような政治家がいないので、官僚制度も政治家同様、アメリカに目を向けて指示を仰いでいるんでしょうね。

そう考えると、安倍首相がやたらと左翼思想を批判したり、「美しい国」というようないかがわしいタイプ保守思想を喧伝したがるのも、東大学歴に対するコンプレックスなのかもしれないですね。安倍家、佐藤家には東大出身が多いですからね。東大といえば、左翼思想丸山真男、というわけです。「家庭の事情」で教育改革をやられては非常に困るわけですが・・・・。

まあ、政治家価値学歴だけで決まるというわけではないでしょうが、実際に統計的に結果が出てしまっているのは隠せませんね。

代々木ゼミ偏差値表をみながら、地元政治家プロファイルしてみてはいかがでしょうか?

http://www.yozemi.ac.jp/nyushi/nyushi.html#rank

2007-09-02

[][][Web::Scraper][API][JSON][JavaScript]Web::Scraperを使ってみたくてニフティクリップJSONを作ってみた

最近perl勉強してて、naoyaのはてなダイアリー - Web::ScraperWeb::Scraperを知り、試しにはてブのAPIを真似してニフティクリップコメントを吐くJSONを作った。

#!/usr/local/bin/perl -T
#
#
use strict;
use warnings;

use URI;
use Web::Scraper;
use JSON::XS;
use CGI;
use Encode;

my $q = new CGI;
print $q->header( -type=>'text/plain', -charset=>'UTF-8');

my $path_info = $q->path_info;
my $path = $path_info =~ m{^/?(nobracket/)?(http\w?)://?(.*)$}xms ? $2.'://'.$3
         :                                                          undef
         ;
exit if ! $path;
my $is_nobracket = 'true' if $1;

if ($q->query_string) {
    my $query_string = $q->query_string;
    $query_string =~ s/;/&amp;/g;
    $path = $path.'?'.$query_string
}

$path =~ s/%23/#/;

$path =~ s/([^\w ])/'%' . unpack('H2', $1)/eg;
$path =~ tr/ /+/;

my $entry_url = "http://clip.nifty.com/entry/?url=" . $path;

my $bookmarks = scraper {
    process 'h4>a', 'user' => 'TEXT';
    process 'li.dateAndTime', 'timestamp' => 'TEXT';
    process 'a.tagtag', 'tags[]' => sub {
        my $text = $_->as_text or return;
        my $left = decode_utf8('??~P');
        my $right = decode_utf8('??~Q');
        return $text =~ /$left (.*?) $right/xms;
    };
    process 'p.comment', 'comment' => 'TEXT';
    result 'user', 'timestamp', 'tags', 'comment';
};

my $niftyclip_entry_info = scraper {
    process 'div.clipTitle>h3>a', 'title' => 'TEXT';
    process 'div.clipTitle>p.url>a', 'url' => '@href';
    process 'div.comments>div.commentsDetails',
        'bookmarks[]' => $bookmarks;
    result 'title','url','bookmarks';
};

my $niftyclip = scraper {
    process 'div#content',
        'niftyclip_entry' => $niftyclip_entry_info;
    result 'niftyclip_entry';
}->scrape(URI->new($entry_url));

exit if ! ($niftyclip->{'url'});

$niftyclip->{'entry_url'} = $entry_url;
$niftyclip->{'count'} = @{$niftyclip->{'bookmarks'}};

my $json = JSON::XS->new->utf8->encode($niftyclip);

$json = '('. $json. ')' if ! $is_nobracket;
print $json;

取得方法は

http://monm.on.coocan.jp/niftyclip/json/entry/<取得したいURL

ってすればいい。「#」は「%23」にエスケープしないとダメ

ニフティクリップのトップならこんな感じ

作りながら「取得したいURLURLエンコードするのは面倒だな」って思い、はてブAPIみたいにpath_infoでアクセスできるようにしたわけだけど、その取得したいURLquery_stringが付いてた場合にどうやってやって良いかわからず結構悩んだ。

結局、path_info+'&'+query_stringってやることで無理やり作ったけど、普通どうやるもんなんだろ?cpanに何か良いモジュールがあったりするのかな。

それと、はてブに合わせて出力の際に()を付けるようにしたけど、これだとYahoo!Pipesで使えなかったから、

http://monm.on.coocan.jp/niftyclip/json/entry/nobracket/<取得したいURL

みたいに「nobracket」付きでアクセスした場合には()を付けないようにした。

コレ使うとニフティクリップとlivedoor クリプのコメント取ってくるAPIみたいなのが作れる。

RSSで取得する場合は

http://pipes.yahoo.com/pipes/pipe.run?_id=zECBJ_VY3BGtBw6B8ivLAg&_render=rss&URL=URLエンコードしたURL

で取得できるし、jsonで取得する場合は

http://pipes.yahoo.com/pipes/pipe.run?_id=zECBJ_VY3BGtBw6B8ivLAg&_render=json&URL=URLエンコードしたURL

ってなる。

こんな感じ

とりあえずサクッと作ってみたけど、わざわざページからJSON作ってるからちょっと重い。

デザインリニューアルされたら使えなくなるし。

その頃にはJSON吐いてくれるようになるんじゃないかなと期待はしてるけど。

参考URL:

http://d.hatena.ne.jp/naoya/20070509/1178686816

http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%C3%A5%AF%A5%DE%A1%BC%A5%AF%A5%A8%A5%F3%A5%C8%A5%EA%A1%BC%BE%F0%CA%F3%BC%E8%C6%C0API?kid=184075

2007-07-26

ニコニコ市場に潜む恐怖

こんばんは、しがないニコ厨です。

さてさて、EXIT TRANCE PRESENTS CODE SPEED アニメトランスBESTという商品が市場デイリーランキングで、

7/22(日) 5位

7/23(月) 3位

7/24(火) 1位

7/25(水) 1位

と推移していました。昨日からランキング自動化されましたね。

このアルバム、なぜ売れたかっていうとレビューにもあるように"組曲ニコニコ動画』"を真似たのかと見紛うほど、

曲目リストが被っているかららしいですね。 あれだけ中毒性のあるものだとCDで欲しくなりますもんね!

ぼくは、昨日はてブ経由でニコニコ動画で行われているオープンソース現象 組曲『ニコニコ動画』

を読んで、そこから見事にハマり、だいたいの動画を視聴しました。

歌ってみた系、素材系、元曲系などなど、ほとんどの動画で上記の商品が市場の上位に上がっていました。

まあ実際に売れているので、当たり前と言えば当たり前か。

でも、左上に来るのを4回くらい連続で見たときは、さすがに違和感を感じました。

今、ニコニコ市場プレミアムユーザーが商品の登録・削除を行うシステムになっています。(一般なので見たことない)

典型的なWEB2.0CGMですけれど、この商品を登録したユーザーって本当に消費者の「みんな」なんでしょうかね?

2007-05-10

こないだマシン語ーとか言ってた人ですが。

皆素直に繰り返しの構文で1から100まで回してんのね(違うのがあったら面白いかなと思った)。

さて、古臭いCPUを考慮してこんな感じのロジックを考えた。

これをニモニック言語に置き換えていくのは簡単だと思う。言語適当だけど読めるでしょ。

$c=1;
$c3=3;
$c5=5;
{
    $c3--;
    $c5--;
    if (($c3 && $c5)==0) {
        if ($c3 == 0) { print "Fizz"; $c3=3; }
        if ($c5 == 0) { print "Buzz"; $c5=5; }
        }
    else { print $c; }
    if (($c-100) == 0) { exit; }
    $c++;
} while(1)

何度も直していたら自分の能力に対する自信をなくしてきたorz 本職じゃなくてよかったぜ。

0判定にこだわっているのは、フラグが立つから(分かる人には分かる)。

どうでもいいけど、PHPperlを使っていると、どっちがelsifでどっちがelseifか忘れません?

http://anond.hatelabo.jp/20070508170219トラバ

2007-04-23

スパゲティコード

$input = 3;
include("next.php");
if($Result){
 print "成功";
}
exit;

PHPソース見てたら、こんなコードが出てきて憤死しそうになった。

文中で関数を呼ぶようにincludeされている事も衝撃だが、何よりそのinclude先とグローバル変数で通信していると言うすさまじさ。

当然、一定の条件でnext.phpは別のPHPファイルをincludeしている。

こんな見事なスパゲティコードはじめてみた。家に帰りたい。

2007-04-13

ASPファイル受信

'/** Requestオブジェクトから受信したデータを取り出します。
' * @return byte配列を格納した連想配列を返します。
' */
Function getRequestItem()

  If Request.TotalBytes <= 0 Then
    getRequestItem = Null
    Exit Function
  End If

  Dim data
  Dim separator
  Dim dataArray
  Dim buffer
  Dim filePath
  Dim fileName
  Dim ix
  Dim stringIndex
  Dim myCrLf
  Dim items
  Dim itemName

  myCrLf = convertAsc(vbCrLf)
  Set items = Server.CreateObject("Scripting.Dictionary")

  data = Request.BinaryRead(Request.TotalBytes)
  data = LeftB(data, UBound(data) - 3) & myCrLf

  separator = MidB(data, 1, InStrB(1, data, myCrLf) + 1)

  dataArray = SplitB(data, separator)

  For ix = 2 To UBound(dataArray) Step 1
   '1行読み込み
    buffer = MidB(dataArray(ix), 1, InStrB(1, dataArray(ix), myCrLf) - 1)

   'アイテム名の取得
    stringIndex = InStrB(1, buffer, convertAsc("name="))
    If stringIndex > 0 Then
      itemName = convertUnicode(MidB(buffer, stringIndex + 6, InStrB(stringIndex, buffer, ChrB(34)) - stringIndex))
     Else
      itemName = ""
    End If

   'ファイル名の取得
    stringIndex = InStrB(1, buffer, convertAsc("filename="))
    If stringIndex > 0 Then
      filePath = MidB(buffer, stringIndex + 10, InStrB(stringIndex, buffer, ChrB(34)) - stringIndex)
      fileName = RightB(filePath, LenB(filePath) - LastInStrB(0, filePath, convertAsc("\")))
     Else
      fileName = ""
    End If

   'データ部の取得、改行コードの切り捨て
    buffer = RightB(dataArray(ix), LenB(dataArray(ix)) - InStrB(1, dataArray(ix), myCrLf & myCrLf) - 3)
    buffer = LeftB(buffer, LenB(buffer) - 2)

    items.Item(itemName) = parseBytes(buffer)
  Next

  Set getRequestItem = items
  Set items = Nothing

End Function

'/** 文字列の最後尾から指定文字を検索します。
' * @param Start 検索する開始文字位置を指定します。
' * @param String1 検索対象の文字列を指定します。
' * @param String2 検索する文字列を指定します。
' */
Function LastInStrB(ByRef Start, ByRef String1, ByRef String2)

  Dim ix
  Dim lastIndex
  Dim searchLength

  searchLength = LenB(String2)
  lastIndex = LenB(String1) - searchLength + 1
  If Start > 0 And Start < lastIndex Then
    lastIndex = Start
  End If
  For ix = lastIndex To 1 Step -1
    If MidB(String1, ix, searchLength) = String2 Then
      LastInStrB = ix
      Exit Function
    End If
  Next

  LastInStrB = 0

End Function

'/** アスキー文字列に変換します。
' * @param String 対象の文字列を指定します。
' */
Function convertAsc(Byref String)

  Dim ix
  Dim ascii

  ascii = ""
  For ix = 1 To Len(String) Step 1
    ascii = ascii & ChrB(AscB(Mid(String, ix, 1)))
  Next

  convertAsc = ascii

End Function

'/** Unicode文字列に変換します。
' * @param AscString 対象のアスキー文字列を指定します。
' */
Function convertUnicode(Byref AscString)

  Dim ix
  Dim unicode

  unicode = ""
  For ix = 1 To LenB(AscString) Step 1
    unicode = unicode & Chr(AscB(MidB(AscString, ix, 1)))
  Next

  convertUnicode = unicode

End Function

'/** バイナリ対応版Split関数です。
' * @param String 対象の文字列を指定します。
' * @param Delimiter 区切り文字を指定します。
' */
Function SplitB(Byref String, Byref Delimiter)

  Dim ix
  Dim lastIndex
  Dim searchLength
  Dim start
  Dim datas()
  Dim dataIndex

  dataIndex = 1
  start = 1
  delimiterLength = LenB(Delimiter)
  lastIndex = LenB(String) - delimiterLength + 1

 '最初から1文字ずつ繰り返します。
  For ix = 1 To lastIndex Step 1
   'データを比較します。
    If MidB(String, ix, delimiterLength) = Delimiter Then
     'データを取り出せたら配列に格納します。
      ReDim Preserve datas(dataIndex)
      datas(dataIndex) = MidB(String, start, ix - start)
      dataIndex = dataIndex + 1
      start = ix + delimiterLength
    End If
  Next

  SplitB = datas

End Function

'/** Byte配列を返す関数です。
' * @param data 対象のデータを指定します。
' */
Function parseBytes(Byref data)

  Const adLongVarBinary = 205
  Dim recordset

  If LenB(data) <= 0 Then
    parseBytes = CByte(0)
    Exit Function
  End If

  Set recordset = Server.CreateObject("ADODB.Recordset")
  recordset.Fields.Append "UpLoadBinary", adLongVarBinary, LenB(data)
  recordset.Open
  recordset.AddNew
  recordset.Fields("UpLoadBinary").AppendChunk data
  recordset.Update

  parseBytes = recordset.Fields("UpLoadBinary").Value
  recordset.Close
  Set recordset = Nothing

End Function

2006-11-09

「MSGINA.DLLを読み込めませんでした。」

仕事場にノートパソコン(VersaPro.VY22X/RX-L)が持ち込まれる。使用OSはWindows XP Pro.

起動するとWindows XPロゴ表示の後「SHELL32が見つかりません。」と表示され、次に「ライブラリ SHLWAPI.DLL から見つかりませんでした。」と出て、最後にはメッセージ「ログオンユーザーインターフェイスDLL MSGINA.DLLを読み込めませんでした。システム管理者に問い合わせてDLLを置き換えるかまたは元のDLLを復元してください。」となる。[再起動]ボタン表示で唯一の選択肢が示される状況。リブートしてセーフモード起動を試すもログオン画面の手前で上記メッセージが表示され同じ状況に。

毎度の事ながら今回も「Windows回復コンソール」のお世話になって復旧を試みる。とりあえずWindowsXPCD-ROMからブートし、R[復旧]を選んで回復コンソール起動、C:\WINDOWS\SYSTEM32に入ってみると「dir shell32.dll」を実行しても「ファイルが見つかりません」という表示。そこで健康な別PCからのSHELL32.DLL移植を試みる。ついでにSHLWAPI.DLLとMSGINA.DLLも壊れている可能性が高いので一緒にコピーする事に決定。

方法としてはKNOPPIX5.0.1-CDから起動、/dev/hda1 が /media/hda1にオートマウントされているので、右クリック-プロパティのメニュー内で「Read Only」にチェックが入っているのを外し、別WindowsマシンFATフォーマットして上記3つのDLLを放り込んでおいた手持ちのUSBメモリ(128M)を差し込んで、/dev/sda1から/media/hda1にコピー(作業を簡便にしたいのと面倒くさいのでルートフォルダに)

KNOPPIXはログオフ-シャットダウンし、Windows XP CD-ROMに入れ替えて再び「Windows回復コンソール」にて以下を実行。

cd \windows\system32
ren msgina.dll msgina.bak
ren shlwapi.dll shlwapi.bak
cd \
copy SHELL32.DLL c:\windows\system32
copy MSGINA.DLL c:\windows\system32
copy SHLWAPI.DLL c:\windows\system32

EXIT

これで無事起動できれば御の字だったのだが。改善されたのは「SHELL32.DLL…」のエラーメッセージのみで後2つは相変わらず。ログオン画面へ移行せず再起動選択肢しか無い状態は変化なし。

いろいろ考えあぐねた末、「元々の正常起動時のバージョンと同一のDLLコピーしてやる事で解決した。具体的には、起動しなくなったPCは「Windows XP Pro. Service Pack 1」だった(!)ので、移植するDLLは最新の「SP2」でもWindows XP CD-ROMの中の「無印」でも駄目だという事だったようだ(無事にログオン画面が表示されてもその後フリーズ)。たまたま過去に作成していたWindowsXP-SP1統合インストールCD-Rを発掘し、そこからSHELL32.DLL、MSGINA.DLL、SHLWAPI.DLLを抽出、移植作業をやり直し再起動すると「何事も無かったかのように」ようこそ画面が表示されて元通りのデスクトップ画面を復活させる事ができた。

※追記:公式情報既出だったようだ。無駄に 時間を 浪費していた かもしれない。

Windows Update Web サイトから Windows XP の更新をインストールすると、エラー メッセージが表示される

ところでSTGは終わった。あとSTGは成長してないよね。

ログイン ユーザー登録
ようこそ ゲスト さん