OSDN Git Service

t#: master
authoryasushiito <yas@pen-chan.jp>
Fri, 22 Feb 2013 10:30:40 +0000 (19:30 +0900)
committeryasushiito <yas@pen-chan.jp>
Fri, 22 Feb 2013 10:30:40 +0000 (19:30 +0900)
162 files changed:
.gitignore [new file with mode: 0644]
README [new file with mode: 0644]
Rakefile [new file with mode: 0644]
app/controllers/application.rb [new file with mode: 0644]
app/controllers/hateda_controller.rb [new file with mode: 0644]
app/controllers/letter_controller.rb [new file with mode: 0644]
app/controllers/section_controller.rb [new file with mode: 0644]
app/controllers/thema_controller.rb [new file with mode: 0644]
app/controllers/words_controller.rb [new file with mode: 0644]
app/helpers/application_helper.rb [new file with mode: 0644]
app/helpers/hateda_helper.rb [new file with mode: 0644]
app/helpers/letter_helper.rb [new file with mode: 0644]
app/helpers/section_helper.rb [new file with mode: 0644]
app/helpers/thema_helper.rb [new file with mode: 0644]
app/helpers/words_helper.rb [new file with mode: 0644]
app/models/hateda_index.rb [new file with mode: 0644]
app/models/hateda_letter.rb [new file with mode: 0644]
app/models/hateda_section.rb [new file with mode: 0644]
app/models/hateda_thema.rb [new file with mode: 0644]
app/models/hateda_word.rb [new file with mode: 0644]
app/models/letter.rb [new file with mode: 0644]
app/models/section.rb [new file with mode: 0644]
app/models/section_letter.rb [new file with mode: 0644]
app/models/section_word.rb [new file with mode: 0644]
app/models/source.rb [new file with mode: 0644]
app/models/thema.rb [new file with mode: 0644]
app/models/thema_section.rb [new file with mode: 0644]
app/models/word.rb [new file with mode: 0644]
app/views/hateda/_letter_filter.rhtml [new file with mode: 0644]
app/views/hateda/_letter_show.rhtml [new file with mode: 0644]
app/views/hateda/_section_filter.rhtml [new file with mode: 0644]
app/views/hateda/_section_show.rhtml [new file with mode: 0644]
app/views/hateda/_thema_filter.rhtml [new file with mode: 0644]
app/views/hateda/_thema_show.rhtml [new file with mode: 0644]
app/views/hateda/_word_filter.rhtml [new file with mode: 0644]
app/views/hateda/_word_show.rhtml [new file with mode: 0644]
app/views/hateda/index.rhtml [new file with mode: 0644]
app/views/hateda/letter_list.rhtml [new file with mode: 0644]
app/views/hateda/section_list.rhtml [new file with mode: 0644]
app/views/hateda/thema_list.rhtml [new file with mode: 0644]
app/views/hateda/word_list.rhtml [new file with mode: 0644]
app/views/layouts/default.rhtml [new file with mode: 0644]
app/views/letter/_list_navi.rhtml [new file with mode: 0644]
app/views/letter/edit.rhtml [new file with mode: 0644]
app/views/letter/list.rhtml [new file with mode: 0644]
app/views/letter/show.rhtml [new file with mode: 0644]
app/views/section/_navi.rhtml [new file with mode: 0644]
app/views/section/edit.rhtml [new file with mode: 0644]
app/views/section/index.rhtml [new file with mode: 0644]
app/views/section/list.rhtml [new file with mode: 0644]
app/views/section/show.rhtml [new file with mode: 0644]
app/views/section/tiny.rhtml [new file with mode: 0644]
app/views/thema/edit.rhtml [new file with mode: 0644]
app/views/thema/list.rhtml [new file with mode: 0644]
app/views/thema/show.rhtml [new file with mode: 0644]
app/views/words/_form.rhtml [new file with mode: 0644]
app/views/words/_list_navi.rhtml [new file with mode: 0644]
app/views/words/edit.rhtml [new file with mode: 0644]
app/views/words/list.rhtml [new file with mode: 0644]
app/views/words/new.rhtml [new file with mode: 0644]
app/views/words/show.rhtml [new file with mode: 0644]
config/boot.rb [new file with mode: 0644]
config/database.yml.org [new file with mode: 0644]
config/environment.rb [new file with mode: 0644]
config/environments/development.rb [new file with mode: 0644]
config/environments/production.rb [new file with mode: 0644]
config/environments/test.rb [new file with mode: 0644]
config/routes.rb [new file with mode: 0644]
db/lao.sql [new file with mode: 0644]
db/migrate/001_create_letters.rb [new file with mode: 0644]
db/migrate/002_create_sources.rb [new file with mode: 0644]
db/migrate/003_create_words.rb [new file with mode: 0644]
db/migrate/004_create_sections.rb [new file with mode: 0644]
db/migrate/005_create_section_letters.rb [new file with mode: 0644]
db/migrate/006_create_section_words.rb [new file with mode: 0644]
db/migrate/007_create_themas.rb [new file with mode: 0644]
db/migrate/008_create_thema_sections.rb [new file with mode: 0644]
db/migrate/009_create_hateda_sections.rb [new file with mode: 0644]
db/migrate/010_create_hateda_letters.rb [new file with mode: 0644]
db/migrate/011_create_hateda_words.rb [new file with mode: 0644]
db/migrate/012_create_hateda_themas.rb [new file with mode: 0644]
db/migrate/013_create_hateda_indices.rb [new file with mode: 0644]
doc/README_FOR_APP [new file with mode: 0644]
lib/atomutil.rb [new file with mode: 0644]
lib/hateda_letter.rhtml [new file with mode: 0644]
lib/hateda_letter_index.rhtml [new file with mode: 0644]
lib/hateda_section.rhtml [new file with mode: 0644]
lib/hateda_section_index.rhtml [new file with mode: 0644]
lib/hateda_thema.rhtml [new file with mode: 0644]
lib/hateda_thema_index.rhtml [new file with mode: 0644]
lib/hateda_word.rhtml [new file with mode: 0644]
lib/hateda_word_index.rhtml [new file with mode: 0644]
lib/hatena.rb [new file with mode: 0644]
public/.htaccess [new file with mode: 0644]
public/404.html [new file with mode: 0644]
public/500.html [new file with mode: 0644]
public/dispatch.cgi [new file with mode: 0644]
public/dispatch.fcgi [new file with mode: 0644]
public/dispatch.rb [new file with mode: 0644]
public/favicon.ico [new file with mode: 0644]
public/images/rails.png [new file with mode: 0644]
public/javascripts/application.js [new file with mode: 0644]
public/javascripts/controls.js [new file with mode: 0644]
public/javascripts/dragdrop.js [new file with mode: 0644]
public/javascripts/effects.js [new file with mode: 0644]
public/javascripts/prototype.js [new file with mode: 0644]
public/robots.txt [new file with mode: 0644]
public/stylesheets/default.css [new file with mode: 0644]
public/stylesheets/hateda.css [new file with mode: 0644]
public/stylesheets/letter.css [new file with mode: 0644]
public/stylesheets/scaffold.css [new file with mode: 0644]
public/stylesheets/section.css [new file with mode: 0644]
public/stylesheets/thema.css [new file with mode: 0644]
public/stylesheets/words.css [new file with mode: 0644]
script/about [new file with mode: 0644]
script/breakpointer [new file with mode: 0644]
script/console [new file with mode: 0644]
script/destroy [new file with mode: 0644]
script/generate [new file with mode: 0644]
script/performance/benchmarker [new file with mode: 0644]
script/performance/profiler [new file with mode: 0644]
script/plugin [new file with mode: 0644]
script/process/inspector [new file with mode: 0644]
script/process/reaper [new file with mode: 0644]
script/process/spawner [new file with mode: 0644]
script/runner [new file with mode: 0644]
script/server [new file with mode: 0644]
test/fixtures/hateda_indices.yml [new file with mode: 0644]
test/fixtures/hateda_letters.yml [new file with mode: 0644]
test/fixtures/hateda_sections.yml [new file with mode: 0644]
test/fixtures/hateda_themas.yml [new file with mode: 0644]
test/fixtures/hateda_words.yml [new file with mode: 0644]
test/fixtures/hatedas.yml [new file with mode: 0644]
test/fixtures/letters.yml [new file with mode: 0644]
test/fixtures/section_letters.yml [new file with mode: 0644]
test/fixtures/section_words.yml [new file with mode: 0644]
test/fixtures/sections.yml [new file with mode: 0644]
test/fixtures/sources.yml [new file with mode: 0644]
test/fixtures/thema_sections.yml [new file with mode: 0644]
test/fixtures/themas.yml [new file with mode: 0644]
test/fixtures/words.yml [new file with mode: 0644]
test/functional/hateda_controller_test.rb [new file with mode: 0644]
test/functional/letter_controller_test.rb [new file with mode: 0644]
test/functional/section_controller_test.rb [new file with mode: 0644]
test/functional/source_controller_test.rb [new file with mode: 0644]
test/functional/thema_controller_test.rb [new file with mode: 0644]
test/functional/words_controller_test.rb [new file with mode: 0644]
test/test_helper.rb [new file with mode: 0644]
test/unit/hateda_index_test.rb [new file with mode: 0644]
test/unit/hateda_letter_test.rb [new file with mode: 0644]
test/unit/hateda_section_test.rb [new file with mode: 0644]
test/unit/hateda_test.rb [new file with mode: 0644]
test/unit/hateda_thema_test.rb [new file with mode: 0644]
test/unit/hateda_word_test.rb [new file with mode: 0644]
test/unit/letter_test.rb [new file with mode: 0644]
test/unit/section_letter_test.rb [new file with mode: 0644]
test/unit/section_test.rb [new file with mode: 0644]
test/unit/section_word_test.rb [new file with mode: 0644]
test/unit/source_test.rb [new file with mode: 0644]
test/unit/thema_section_test.rb [new file with mode: 0644]
test/unit/thema_test.rb [new file with mode: 0644]
test/unit/word_test.rb [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..e483b09
--- /dev/null
@@ -0,0 +1,5 @@
+db/*.sqlite3
+db/schema.rb
+log/*.log
+tmp/
+public/image/*
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..7cd111f
--- /dev/null
+++ b/README
@@ -0,0 +1,211 @@
+== Welcome to Rails
+
+Rails is a web-application and persistence framework that includes everything
+needed to create database-backed web-applications according to the
+Model-View-Control pattern of separation. This pattern splits the view (also
+called the presentation) into "dumb" templates that are primarily responsible
+for inserting pre-built data in between HTML tags. The model contains the
+"smart" domain objects (such as Account, Product, Person, Post) that holds all
+the business logic and knows how to persist themselves to a database. The
+controller handles the incoming requests (such as Save New Account, Update
+Product, Show Post) by manipulating the model and directing data to the view.
+
+In Rails, the model is handled by what's called an object-relational mapping
+layer entitled Active Record. This layer allows you to present the data from
+database rows as objects and embellish these data objects with business logic
+methods. You can read more about Active Record in
+link:files/vendor/rails/activerecord/README.html.
+
+The controller and view are handled by the Action Pack, which handles both
+layers by its two parts: Action View and Action Controller. These two layers
+are bundled in a single package due to their heavy interdependence. This is
+unlike the relationship between the Active Record and Action Pack that is much
+more separate. Each of these packages can be used independently outside of
+Rails.  You can read more about Action Pack in
+link:files/vendor/rails/actionpack/README.html.
+
+
+== Getting started
+
+1. At the command prompt, start a new rails application using the rails command
+   and your application name. Ex: rails myapp
+   (If you've downloaded rails in a complete tgz or zip, this step is already done)
+2. Change directory into myapp and start the web server: <tt>script/server</tt> (run with --help for options)
+3. Go to http://localhost:3000/ and get "Welcome aboard: You’re riding the Rails!"
+4. Follow the guidelines to start developing your application
+
+
+== Web Servers
+
+By default, Rails will try to use Mongrel and lighttpd if they are installed, otherwise
+Rails will use the WEBrick, the webserver that ships with Ruby. When you run script/server,
+Rails will check if Mongrel exists, then lighttpd and finally fall back to WEBrick. This ensures
+that you can always get up and running quickly.
+
+Mongrel is a Ruby-based webserver with a C-component (which requires compilation) that is
+suitable for development and deployment of Rails applications. If you have Ruby Gems installed,
+getting up and running with mongrel is as easy as: <tt>gem install mongrel</tt>.
+More info at: http://mongrel.rubyforge.org
+
+If Mongrel is not installed, Rails will look for lighttpd. It's considerably faster than
+Mongrel and WEBrick and also suited for production use, but requires additional
+installation and currently only works well on OS X/Unix (Windows users are encouraged
+to start with Mongrel). We recommend version 1.4.11 and higher. You can download it from
+http://www.lighttpd.net.
+
+And finally, if neither Mongrel or lighttpd are installed, Rails will use the built-in Ruby
+web server, WEBrick. WEBrick is a small Ruby web server suitable for development, but not
+for production.
+
+But of course its also possible to run Rails on any platform that supports FCGI.
+Apache, LiteSpeed, IIS are just a few. For more information on FCGI,
+please visit: http://wiki.rubyonrails.com/rails/pages/FastCGI
+
+
+== Debugging Rails
+
+Sometimes your application goes wrong.  Fortunately there are a lot of tools that
+will help you debug it and get it back on the rails.
+
+First area to check is the application log files.  Have "tail -f" commands running
+on the server.log and development.log. Rails will automatically display debugging
+and runtime information to these files. Debugging info will also be shown in the
+browser on requests from 127.0.0.1.
+
+You can also log your own messages directly into the log file from your code using
+the Ruby logger class from inside your controllers. Example:
+
+  class WeblogController < ActionController::Base
+    def destroy
+      @weblog = Weblog.find(params[:id])
+      @weblog.destroy
+      logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!")
+    end
+  end
+
+The result will be a message in your log file along the lines of:
+
+  Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1
+
+More information on how to use the logger is at http://www.ruby-doc.org/core/
+
+Also, Ruby documentation can be found at http://www.ruby-lang.org/ including:
+
+* The Learning Ruby (Pickaxe) Book: http://www.ruby-doc.org/docs/ProgrammingRuby/
+* Learn to Program: http://pine.fm/LearnToProgram/  (a beginners guide)
+
+These two online (and free) books will bring you up to speed on the Ruby language
+and also on programming in general.
+
+
+== Breakpoints
+
+Breakpoint support is available through the script/breakpointer client. This
+means that you can break out of execution at any point in the code, investigate
+and change the model, AND then resume execution! Example:
+
+  class WeblogController < ActionController::Base
+    def index
+      @posts = Post.find(:all)
+      breakpoint "Breaking out from the list"
+    end
+  end
+
+So the controller will accept the action, run the first line, then present you
+with a IRB prompt in the breakpointer window. Here you can do things like:
+
+Executing breakpoint "Breaking out from the list" at .../webrick_server.rb:16 in 'breakpoint'
+
+  >> @posts.inspect
+  => "[#<Post:0x14a6be8 @attributes={\"title\"=>nil, \"body\"=>nil, \"id\"=>\"1\"}>,
+       #<Post:0x14a6620 @attributes={\"title\"=>\"Rails you know!\", \"body\"=>\"Only ten..\", \"id\"=>\"2\"}>]"
+  >> @posts.first.title = "hello from a breakpoint"
+  => "hello from a breakpoint"
+
+...and even better is that you can examine how your runtime objects actually work:
+
+  >> f = @posts.first
+  => #<Post:0x13630c4 @attributes={"title"=>nil, "body"=>nil, "id"=>"1"}>
+  >> f.
+  Display all 152 possibilities? (y or n)
+
+Finally, when you're ready to resume execution, you press CTRL-D
+
+
+== Console
+
+You can interact with the domain model by starting the console through <tt>script/console</tt>.
+Here you'll have all parts of the application configured, just like it is when the
+application is running. You can inspect domain models, change values, and save to the
+database. Starting the script without arguments will launch it in the development environment.
+Passing an argument will specify a different environment, like <tt>script/console production</tt>.
+
+To reload your controllers and models after launching the console run <tt>reload!</tt>
+
+To reload your controllers and models after launching the console run <tt>reload!</tt>
+
+
+
+== Description of contents
+
+app
+  Holds all the code that's specific to this particular application.
+
+app/controllers
+  Holds controllers that should be named like weblogs_controller.rb for
+  automated URL mapping. All controllers should descend from ApplicationController
+  which itself descends from ActionController::Base.
+
+app/models
+  Holds models that should be named like post.rb.
+  Most models will descend from ActiveRecord::Base.
+
+app/views
+  Holds the template files for the view that should be named like
+  weblogs/index.rhtml for the WeblogsController#index action. All views use eRuby
+  syntax.
+
+app/views/layouts
+  Holds the template files for layouts to be used with views. This models the common
+  header/footer method of wrapping views. In your views, define a layout using the
+  <tt>layout :default</tt> and create a file named default.rhtml. Inside default.rhtml,
+  call <% yield %> to render the view using this layout.
+
+app/helpers
+  Holds view helpers that should be named like weblogs_helper.rb. These are generated
+  for you automatically when using script/generate for controllers. Helpers can be used to
+  wrap functionality for your views into methods.
+
+config
+  Configuration files for the Rails environment, the routing map, the database, and other dependencies.
+
+components
+  Self-contained mini-applications that can bundle together controllers, models, and views.
+
+db
+  Contains the database schema in schema.rb.  db/migrate contains all
+  the sequence of Migrations for your schema.
+
+doc
+  This directory is where your application documentation will be stored when generated
+  using <tt>rake doc:app</tt>
+
+lib
+  Application specific libraries. Basically, any kind of custom code that doesn't
+  belong under controllers, models, or helpers. This directory is in the load path.
+
+public
+  The directory available for the web server. Contains subdirectories for images, stylesheets,
+  and javascripts. Also contains the dispatchers and the default HTML files. This should be
+  set as the DOCUMENT_ROOT of your web server.
+
+script
+  Helper scripts for automation and generation.
+
+test
+  Unit and functional tests along with fixtures. When using the script/generate scripts, template
+  test files will be generated for you and placed in this directory.
+
+vendor
+  External libraries that the application depends on. Also includes the plugins subdirectory.
+  This directory is in the load path.
diff --git a/Rakefile b/Rakefile
new file mode 100644 (file)
index 0000000..3bb0e85
--- /dev/null
+++ b/Rakefile
@@ -0,0 +1,10 @@
+# Add your own tasks in files placed in lib/tasks ending in .rake,
+# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
+
+require(File.join(File.dirname(__FILE__), 'config', 'boot'))
+
+require 'rake'
+require 'rake/testtask'
+require 'rake/rdoctask'
+
+require 'tasks/rails'
diff --git a/app/controllers/application.rb b/app/controllers/application.rb
new file mode 100644 (file)
index 0000000..4c64619
--- /dev/null
@@ -0,0 +1,14 @@
+# Filters added to this controller apply to all controllers in the application.
+# Likewise, all the methods added will be available for all controllers.
+
+class ApplicationController < ActionController::Base
+  # Pick a unique cookie name to distinguish our session data from others'
+  session :session_key => '_lao_session_id'
+  before_filter :login_from_cookie
+  
+  def login_from_cookie
+    @user = cookies[:un]
+    @pass = cookies[:pass]
+  end
+  
+end
diff --git a/app/controllers/hateda_controller.rb b/app/controllers/hateda_controller.rb
new file mode 100644 (file)
index 0000000..c83bff8
--- /dev/null
@@ -0,0 +1,204 @@
+# はてなダイアリ
+class HatedaController < ApplicationController
+  layout 'default'
+  
+  private
+  
+  def get_index
+    @sections = Section.find(:all, :include => [:hateda_section], 
+      :conditions => ['hateda_sections.name is null or hateda_sections.upload_at < sections.update_at'],
+      :order => 'sections.num'
+    )
+  end
+  
+  public
+  
+  def index
+    get_index
+  end
+  
+  verify :method => :post, 
+    :only => [ 
+      :login, :logout, :create_index, 
+      :upload_section_index, :sync_section_index, :remove_section_all, :remove_section_index, 
+      :upload_word_index, :sync_word_index, :remove_word_all, :remove_word_index, 
+      :upload_letter_index, :sync_letter_index, :remove_letter_all, :remove_letter_index, 
+      :upload_thema_index, :sync_thema_index, :remove_thema_all, :remove_thema_index, 
+      :upload_sections, :upload_modified_sections, 
+      :upload_words, :upload_modified_words, 
+      :upload_letters, :upload_modified_letters, 
+      :upload_themas, :upload_modified_themas, 
+      :destroy 
+    ],
+    :redirect_to => {:controller => '/section', :action => :index }
+  
+  def login
+    cookies[:un] = params[:hatena_id]
+    cookies[:pass] = params[:hatena_password]
+    redirect_to :controller => '/section', :action => :index
+  end
+  
+  def logout
+    cookies.delete :un
+    cookies.delete :pass
+    reset_session
+    redirect_to :controller => '/section', :action => :index
+  end
+  
+  def create_index
+    HatedaIndex.init
+    flash[:result] = '生成しました'
+    render :action => :index
+  end
+  
+  def upload_section_index
+    HatedaIndex.upload_section_index @user, @pass
+    get_index
+    render :action => :index
+  end
+  
+  def remove_section_index
+    HatedaIndex.remove_section_index @user, @pass
+    get_index
+    render :action => :index
+  end
+  
+  def remove_section_all
+    HatedaSection.remove_all @user, @pass
+    get_index
+    render :action => :index
+  end
+  
+  def sync_section_index
+    HatedaIndex.sync_section_index @user, @pass
+    get_index
+    render :action => :index
+  end
+  
+  def upload_word_index
+    HatedaIndex.upload_word_index @user, @pass
+    get_index
+    render :action => :index
+  end
+  
+  def remove_word_index
+    HatedaIndex.remove_word_index @user, @pass
+    get_index
+    render :action => :index
+  end
+  
+  def remove_word_all
+    HatedaWord.remove_all @user, @pass
+    get_index
+    render :action => :index
+  end
+  
+  def sync_word_index
+    HatedaIndex.sync_word_index @user, @pass
+    get_index
+    render :action => :index
+  end
+  
+  def upload_letter_index
+    HatedaIndex.upload_letter_index @user, @pass
+    get_index
+    render :action => :index
+  end
+  
+  def remove_letter_index
+    HatedaIndex.remove_letter_index @user, @pass
+    get_index
+    render :action => :index
+  end
+  
+  def remove_letter_all
+    HatedaLetter.remove_all @user, @pass
+    get_index
+    render :action => :index
+  end
+  
+  def sync_letter_index
+    HatedaIndex.sync_letter_index @user, @pass
+    get_index
+    render :action => :index
+  end
+  
+  def upload_thema_index
+    HatedaIndex.upload_thema_index @user, @pass
+    get_index
+    render :action => :index
+  end
+  
+  def remove_thema_index
+    HatedaThema.remove_thema_index @user, @pass
+    get_index
+    render :action => :index
+  end
+  
+  def remove_thema_all
+    HatedaThema.remove_all @user, @pass
+    get_index
+    render :action => :index
+  end
+  
+  def sync_thema_index
+    HatedaIndex.sync_thema_index @user, @pass
+    get_index
+    render :action => :index
+  end
+  
+  def upload_sections
+    htn = Hatena.new(@user, @pass)
+    params[:checks].each do |num|
+      section = Section.find(:first, :include => 'hateda_sections', :conditions => ['sections.num = ?', num])
+      HatedaSection.upload htn, section.hateda_section
+    end
+    get_index
+    render :action => :index
+  end
+  
+  def upload_modified_sections
+    HatedaSection.upload_modified @user, @pass
+    get_index
+    render :action => :index
+  end
+  
+  def destroy
+    un = params[:hatena_id]
+    pass = params[:hatena_password]
+    HatedaSection.destroy_all un, pass
+    get_index
+    render :action => :index
+  end
+  
+  def upload_words
+    htn = Hatena.new(@user, @pass)
+    params[:checks].each do |wid|
+      word = Word.find(wid, :include => 'hateda_word')
+      HatedaWord.upload htn, word.hateda_word
+    end
+    get_index
+    render :action => :index
+  end
+  
+  def upload_letters
+    htn = Hatena.new(@user, @pass)
+    params[:checks].each do |lid|
+      letter = Letter.find(lid, :include => 'hateda_letter')
+      HatedaLetter.upload htn, letter.hateda_letter
+    end
+    get_index
+    render :action => :index
+  end
+  
+  def upload_themas
+    htn = Hatena.new(@user, @pass)
+    params[:checks].each do |tid|
+      thema = Thema.find(tid, :include => 'hateda_thema')
+      HatedaThema.upload htn, thema.hateda_thema
+    end
+    get_index
+    render :action => :index
+  end
+  
+end
diff --git a/app/controllers/letter_controller.rb b/app/controllers/letter_controller.rb
new file mode 100644 (file)
index 0000000..1b962ae
--- /dev/null
@@ -0,0 +1,114 @@
+# 文字
+class LetterController < ApplicationController
+  layout 'default'
+  
+  private
+  
+  def get_show
+    @letter = Letter.find params[:id]
+    @section_count = SectionLetter.count(:conditions => ['letter_id = ?', @letter.id]).to_i
+    @section_sum = SectionLetter.sum(:count, :conditions => ['letter_id = ?', @letter.id]).to_i
+    @sections = Section.find(:all, :include => :section_letters, 
+      :conditions => ['section_letters.letter_id = ?', @letter.id]
+    )
+  end
+  
+  public
+  
+  def index
+    redirect_to :action => :list
+  end
+  
+  def list
+    @page = params[:page].to_i
+    @page = 1 if @page < 1
+    @search = params[:search]
+    @filter = params[:filter].to_s.to_i
+    if @filter == 1
+      @letters = Letter.find(:all, :include => 'hateda_letter', 
+        :conditions => ['hateda_letters.upload_at is null or letters.update_at > hateda_letters.upload_at'] 
+      )
+    else
+      cond = if @search
+        ['letter = ?', @search]
+      else
+        nil
+      end
+      @paginate, @letters = paginate(:letters, :conditions => cond, 
+        :order => 'count desc', :per_page => 20
+      )
+    end
+    if @user
+      render :template => '/hateda/letter_list'
+    else
+    end
+  end
+  
+  def show
+    get_show
+  end
+  
+  verify :method => :post, :only => [ :destroy, :create, :update, :upload_letter, :remove_letter ],
+         :redirect_to => { :action => :list }
+  
+  def edit
+    @letter = Letter.find params[:id]
+    @section_count = SectionLetter.count(:conditions => ['letter_id = ?', @letter.id]).to_i
+    @section_sum = SectionLetter.sum(:count, :conditions => ['letter_id = ?', @letter.id]).to_i
+    @sections = Section.find(:all, :include => :section_letters, 
+      :conditions => ['section_letters.letter_id = ?', @letter.id]
+    )
+    @letter.detail = @letter.edit_detail
+  end
+  
+  def update
+    @letter = Letter.find(params[:id])
+    if @letter.update_attributes(params[:letter])
+      get_show
+      render :action => 'show', :id => @letter.id
+    else
+      render :action => 'edit'
+    end
+  end
+  
+  def upload_letter
+    @letter = Letter.find params[:id]
+    HatedaLetter.upload_one @user, @pass, @letter.id
+    get_show
+    render :action => :show, :id => @letter.id
+  end
+  
+  def remove_letter
+    htn = Hatena.new(@user, @pass)
+    @letter = Letter.find params[:id]
+    HatedaLetter.remove_one htn, @letter.id
+    get_show
+    render :action => :show, :id => @letter.id
+  end
+  
+  #インポート実行
+  def import
+    e = nil
+    if (f = params[:browse][:file]).respond_to?(:read)
+      if f.size > 2.megabytes
+        e = 'ファイルサイズが2MBを超えています'
+      else
+        Letter.import(f.read)
+      end
+    else
+      e = 'ファイルを受け取れませんでした'
+    end
+    if e
+      flash[:error] = 'インポートできませんでした'
+      flash[:txt_error] = e
+      redirect_to :controller => '/section', :action => :index
+    else
+      redirect_to :controller => '/section', :action => :index
+    end
+  end
+  
+  def export
+    send_data(Letter.export, :filename => "letter.txt")
+  end
+  
+end
diff --git a/app/controllers/section_controller.rb b/app/controllers/section_controller.rb
new file mode 100644 (file)
index 0000000..0d53f2f
--- /dev/null
@@ -0,0 +1,161 @@
+# 各章
+class SectionController < ApplicationController
+  layout 'default'
+  
+  private
+  
+  def get_show
+    @section = Section.find params[:id]
+    @letter_count = SectionLetter.count(:conditions => ['section_id = ?', @section.id]).to_i
+    @letter_sum = SectionLetter.sum(:count, :conditions => ['section_id = ?', @section.id]).to_i
+    @word_count = SectionWord.count(:conditions => ['section_id = ?', @section.id]).to_i
+    @word_sum = SectionWord.sum(:count, :conditions => ['section_id = ?', @section.id]).to_i
+#    @letters = Letter.find(:all, :include => :section_letters, 
+#      :conditions => ['section_letters.section_id = ?', @section.id]
+#    )
+    @sec_letters = SectionLetter.find(:all, :include => :letter, 
+      :conditions => ['section_letters.section_id = ?', @section.id]
+    )
+    @sec_words = SectionWord.find(:all, :include => :word, 
+      :conditions => ['section_words.section_id = ?', @section.id]
+    )
+    @sec_themas = ThemaSection.find(:all, :include => :thema, 
+      :conditions => ['thema_sections.section_id = ?', @section.id]
+    )
+    @themas = Thema.find(:all).map {|i| [i.caption, i.id] }
+    @hint_letters = SectionLetter.find(:all, :include => :letter, 
+      :conditions => ['section_letters.section_id = ? and section_letters.chk = 1', @section.id]
+    )
+    @hint_words = SectionWord.find(:all, :include => :word, 
+      :conditions => ['section_words.section_id = ? and section_words.chk = 1 ', @section.id]
+    )
+  end
+  
+  public
+  
+  def index
+    @letter_count = Letter.count
+    @letter_sum = Letter.sum :count
+    @word_count = Word.count
+    @word_sum = Word.sum :count
+  end
+  
+  def list
+    @filter = params[:filter].to_s.to_i
+    @sections = if @filter == 1
+      Section.find(:all, :include => 'hateda_section', 
+        :conditions => ['hateda_sections.upload_at is null or sections.update_at > hateda_sections.upload_at'], 
+        :order => 'num'
+      )
+    else
+      Section.find :all, :order => 'num'
+    end
+    if @user
+      render :template => '/hateda/section_list'
+    else
+    end
+  end
+  
+  def show
+    get_show
+  end
+  
+  def tiny
+    @sections = Section.find :all, :order => 'num'
+  end
+  
+  verify :method => :post, :only => [ :update, :letter_checks, :word_checks, :upload_section, :remove_section, :import ],
+         :redirect_to => { :action => :list }
+  
+  def edit
+    @section = Section.find params[:id]
+    @section.source = @section.edit_source
+    @section.japanese = @section.edit_japanese
+    @section.myself = @section.edit_myself
+    @section.note = @section.edit_note
+  end
+  
+  def update
+    @section = Section.find(params[:id])
+    @section.upd(params[:section])
+    get_show
+    render :action => :show, :id => @section.id
+  end
+  
+  def letter_checks
+    @section = Section.find params[:id]
+    @sec_letters = SectionLetter.find(:all, :conditions => ['section_id = ?', @section.id])
+    @sec_letters.each do |sl|
+      sl.chk = if params[sl.id.to_s]
+        1
+      else
+        0
+      end
+      sl.save!
+    end
+    redirect_to :action => :show, :id => @section.id
+  end
+  
+  def word_checks
+    @section = Section.find params[:id]
+    @sec_words = SectionWord.find(:all, :conditions => ['section_id = ?', @section.id])
+    @sec_words.each do |sw|
+      sw.chk = if params[sw.id.to_s]
+        1
+      else
+        0
+      end
+      sw.save!
+    end
+    redirect_to :action => :show, :id => @section.id
+  end
+  
+  def link_thema
+    @section = Section.find params[:id]
+    tid = params[:thema_section][:thema_id]
+    ThemaSection.link tid, @section.id
+    redirect_to :action => :show, :id => @section.id
+  end
+  
+  def upload_section
+    @section = Section.find params[:id]
+    HatedaSection.upload_one @user, @pass, @section.id
+    get_show
+    render :action => :show, :id => @section.id
+  end
+  
+  def remove_section
+    htn = Hatena.new(@user, @pass)
+    @section = Section.find params[:id]
+    HatedaSection.remove_one htn, @section.id
+    get_show
+    render :action => :show, :id => @section.id
+  end
+  
+  #インポート実行
+  def import
+    e = nil
+    if (f = params[:browse][:file]).respond_to?(:read)
+      if f.size > 2.megabytes
+        e = 'ファイルサイズが2MBを超えています'
+      else
+        Section.import(f.read)
+      end
+    else
+      e = 'ファイルを受け取れませんでした'
+    end
+    if e
+      flash[:error] = 'インポートできませんでした'
+      flash[:txt_error] = e
+      render :action => :index
+    else
+      render :action => :index
+    end
+  end
+  
+  def export
+    send_data(Section.export, :filename => "sections.txt")
+  end
+  
+end
diff --git a/app/controllers/thema_controller.rb b/app/controllers/thema_controller.rb
new file mode 100644 (file)
index 0000000..11561b0
--- /dev/null
@@ -0,0 +1,125 @@
+# テーマ
+class ThemaController < ApplicationController
+  layout 'default'
+  
+  private
+  
+  def get_show
+    @thema = Thema.find params[:id]
+    @sections = Section.find(:all, :include => {:thema_sections => :section}, 
+      :conditions => ['thema_sections.thema_id = ?', @thema.id], :order => 'sections.num'
+    )
+  end
+  
+  public
+  
+  def list
+    @filter = params[:filter].to_s.to_i
+    @themas = if @filter == 1
+      Thema.find(:all, :include => 'hateda_thema', 
+        :conditions => ['hateda_themas.upload_at is null or themas.update_at > hateda_themas.upload_at'] 
+      )
+    else
+      Thema.find(:all, :include => :thema_sections)
+    end
+    if @user
+      render :template => '/hateda/thema_list'
+    else
+    end
+  end
+  
+  def show
+    get_show
+  end
+  
+  verify :method => :post, :only => [ :unlink_thema, :create, :update, :upload_thema, :remove_thema, :import ],
+         :redirect_to => { :action => :list }
+  
+  def unlink_thema
+    @thema = Thema.find params[:id]
+    ThemaSection.find(:all, :conditions => ['thema_id = ?', @thema.id]).each do |ts|
+      sid = params[ts.section_id.to_s]
+      if sid
+        ThemaSection.unlink @thema.id, ts.section_id
+      end
+    end
+    redirect_to :action => :show, :id => @thema.id
+  end
+  
+  def create
+    @thema = Thema.new(params[:thema])
+    if @thema.make(params[:id])
+      flash[:notice] = '登録しました'
+      redirect_to :action => :edit, :id => @thema.id
+    else
+      render :action => 'new'
+    end
+  end
+  
+  def edit
+    @thema = Thema.find params[:id]
+    @thema.detail = @thema.edit_detail
+    @sections = Section.find(:all, :include => {:thema_sections => :section}, 
+      :conditions => ['thema_sections.thema_id = ?', @thema.id], :order => 'sections.num'
+    )
+  end
+  
+  def update
+    @thema = Thema.find(params[:id])
+    if @thema.upd(params[:thema])
+      get_show
+      render :action => :show, :id => @thema.id
+    else
+      @sections = Section.find(:all, :include => :thema_sections, 
+        :conditions => ['thema_sections.thema_id = ?', @thema.id]
+      )
+      render :action => :edit, :id => @thema.id
+    end
+  end
+  
+  def destroy
+    Thema.find(params[:id]).destroy
+    redirect_to :action => 'list'
+  end
+  
+  def upload_thema
+    @thema = Thema.find params[:id]
+    HatedaThema.upload_one( @user, @pass, @thema.id)
+    get_show
+    render :action => :show, :id => @thema.id
+  end
+  
+  def remove_thema
+    htn = Hatena.new(@user, @pass)
+    @thema = Thema.find params[:id]
+    HatedaThema.remove_one htn, @thema.id
+    get_show
+    render :action => :show, :id => @thema.id
+  end
+  
+  #インポート実行
+  def import
+    e = nil
+    if (f = params[:browse][:file]).respond_to?(:read)
+      if f.size > 2.megabytes
+        e = 'ファイルサイズが2MBを超えています'
+      else
+        Thema.import(f.read)
+      end
+    else
+      e = 'ファイルを受け取れませんでした'
+    end
+    if e
+      flash[:error] = 'インポートできませんでした'
+      flash[:txt_error] = e
+      redirect_to :controller => '/section', :action => :index
+    else
+      redirect_to :controller => '/section', :action => :index
+    end
+  end
+  
+  def export
+    send_data(Thema.export, :filename => "thema.txt")
+  end
+  
+end
diff --git a/app/controllers/words_controller.rb b/app/controllers/words_controller.rb
new file mode 100644 (file)
index 0000000..33a9dee
--- /dev/null
@@ -0,0 +1,136 @@
+# 熟語
+class WordsController < ApplicationController
+  layout 'default'
+  
+  private
+  
+  def get_show
+    @word = Word.find params[:id]
+    @section_count = SectionWord.count(:conditions => ['word_id = ?', @word.id]).to_i
+    @section_sum = SectionWord.sum(:count, :conditions => ['word_id = ?', @word.id]).to_i
+    @sections = Section.find(:all, :include => :section_words, 
+      :conditions => ['section_words.word_id = ?', @word.id]
+    )
+  end
+  
+  public
+  
+  def index
+    list
+    render :action => 'list'
+  end
+
+  # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
+  verify :method => :post, :only => [ :destroy, :create, :update, :upload_word, :remove_word ],
+         :redirect_to => { :action => :list }
+
+  def list
+    @page = params[:page].to_i
+    @page = 1 if @page < 1
+    @search = params[:search]
+    @filter = params[:filter].to_s.to_i
+    if @filter == 1
+      @words = Word.find(:all, :include => 'hateda_word', 
+        :conditions => ['hateda_words.upload_at is null or words.update_at > hateda_words.upload_at'] 
+      )
+    else
+      cond = if @search
+        ['letter = ?', @search]
+      else
+        nil
+      end
+      @paginate, @words = paginate(:words, :conditions => cond, 
+        :order => 'count desc', :per_page => 20
+      )
+    end
+    if @user
+      render :template => '/hateda/word_list'
+    else
+    end
+  end
+  
+  def show
+    get_show
+  end
+  
+  def new
+    @word = Word.new
+  end
+  
+  def create
+    @word = Word.new(params[:word])
+    if @word.save!
+      @word.parse
+      flash[:notice] = '登録しました'
+      redirect_to :action => :edit, :id => @word.id
+    else
+      render :action => 'new'
+    end
+  end
+  
+  def edit
+    @word = Word.find params[:id]
+    @section_count = SectionWord.count(:conditions => ['word_id = ?', @word.id]).to_i
+    @section_sum = SectionWord.sum(:count, :conditions => ['word_id = ?', @word.id]).to_i
+    @sections = Section.find(:all, :include => :section_words, 
+      :conditions => ['section_words.word_id = ?', @word.id]
+    )
+    @word.detail = @word.edit_detail
+  end
+  
+  def update
+    @word = Word.find(params[:id])
+    if @word.update_attributes(params[:word])
+      get_show
+      render :action => 'show', :id => @word.id
+    else
+      render :action => 'edit'
+    end
+  end
+  
+  def destroy
+    Word.find(params[:id]).destroy
+    redirect_to :action => 'list'
+  end
+  
+  def upload_word
+    @word = Word.find params[:id]
+    HatedaWord.upload_one @user, @pass, @word.id
+    get_show
+    render :action => :show, :id => @word.id
+  end
+  
+  def remove_word
+    htn = Hatena.new(@user, @pass)
+    @word = Word.find params[:id]
+    HatedaWord.remove_one htn, @word.id
+    get_show
+    render :action => :show, :id => @word.id
+  end
+  
+  #インポート実行
+  def import
+    e = nil
+    if (f = params[:browse][:file]).respond_to?(:read)
+      if f.size > 2.megabytes
+        e = 'ファイルサイズが2MBを超えています'
+      else
+        Word.import(f.read)
+      end
+    else
+      e = 'ファイルを受け取れませんでした'
+    end
+    if e
+      flash[:error] = 'インポートできませんでした'
+      flash[:txt_error] = e
+      redirect_to :controller => '/section', :action => :index
+    else
+      redirect_to :controller => '/section', :action => :index
+    end
+  end
+  
+  def export
+    send_data(Word.export, :filename => "word.txt")
+  end
+  
+end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
new file mode 100644 (file)
index 0000000..025254e
--- /dev/null
@@ -0,0 +1,94 @@
+# 全般ヘルパー
+module ApplicationHelper
+  def enruby(str)
+    str.gsub(/\(.+?\:.+?\)/) {|s|
+      s =~ /\((.+?)\:(.+?)\)/
+      "<ruby>#{$1}<rp>(</rp><rt>#{$2}</rt><rp>)</rp></ruby>"
+    }
+  end
+  
+  def noruby(str)
+    str.gsub(/\(.+?\:.+?\)/) {|s|
+      s =~ /\((.+?)\:(.+?)\)/
+      $1
+    }
+  end
+  
+  def hrb(str)
+    enruby(h(str))
+  end
+  
+  def srb(str)
+    enruby(simple_format(str))
+  end
+  
+  def enlink(str, htn = nil)
+    str.gsub(/\{.+?\:.+?\}/) {|m|
+      m =~ /\{(.+?)\:(.+?)\}/
+      case $1.downcase
+      when 's'
+        res = if s = Section.find_num($2)
+          if htn
+            htn.to_link s.hateda_section.name, s.caption
+          else
+            link_to(h(s.caption), :controller => '/section', :action => :show, :id => s.id)
+          end
+        else
+          $2
+        end
+      when 'l'
+        res = if l = Letter.find_letter($2)
+          desc = if $1 == 'L'
+            "(#{l.desc})"
+          else
+            ''
+          end
+          res = if htn
+            htn.to_link l.hateda_letter.name, l.letter
+          else
+            link_to(h(l.letter), :controller => '/letter', :action => :show, :id => l.id)
+          end
+          res + desc
+        else
+          $2
+        end
+      when 'w'
+        res = if w = Word.find_letter($2)
+          desc = if $1 == 'W'
+            "(#{w.desc})"
+          else
+            ''
+          end
+          res = if htn
+            htn.to_link w.hateda_word.name, w.letter
+          else
+            link_to(h(w.letter), :controller => '/words', :action => :show, :id => w.id)
+          end
+          res + desc
+        else
+          $2
+        end
+      when 't'
+        res = if t = Thema.find($2)
+          if htn
+            htn.to_link t.hateda_thema.name, t.caption
+          else
+            link_to(h(t.caption), :controller => '/thema', :action => :show, :id => t.id)
+          end
+        else
+          $2
+        end
+      end
+      res
+    }
+  end
+  
+  def ennote(str)
+    str.gsub(/\*.+?\:.+?\*/m) {|m|
+      m =~ /\*(.+?)\:(.+?)\*/m
+      res = "<div>#{$1}</div><div class=\"hint-phrase\">#{$2}</div>"
+      res
+    }
+  end
+  
+end
diff --git a/app/helpers/hateda_helper.rb b/app/helpers/hateda_helper.rb
new file mode 100644 (file)
index 0000000..3ec5925
--- /dev/null
@@ -0,0 +1,2 @@
+module HatedaHelper
+end
diff --git a/app/helpers/letter_helper.rb b/app/helpers/letter_helper.rb
new file mode 100644 (file)
index 0000000..a36feec
--- /dev/null
@@ -0,0 +1,2 @@
+module LetterHelper
+end
diff --git a/app/helpers/section_helper.rb b/app/helpers/section_helper.rb
new file mode 100644 (file)
index 0000000..5439400
--- /dev/null
@@ -0,0 +1,2 @@
+module SectionHelper
+end
diff --git a/app/helpers/thema_helper.rb b/app/helpers/thema_helper.rb
new file mode 100644 (file)
index 0000000..89e8fa7
--- /dev/null
@@ -0,0 +1,2 @@
+module ThemaHelper
+end
diff --git a/app/helpers/words_helper.rb b/app/helpers/words_helper.rb
new file mode 100644 (file)
index 0000000..a402dcb
--- /dev/null
@@ -0,0 +1,2 @@
+module WordsHelper
+end
diff --git a/app/models/hateda_index.rb b/app/models/hateda_index.rb
new file mode 100644 (file)
index 0000000..5eecff0
--- /dev/null
@@ -0,0 +1,268 @@
+# はてなダイアリに突っ込む。
+require 'erb'
+class HatedaIndex < ActiveRecord::Base
+  include ActionView::Helpers::TextHelper
+  include ActionView::Helpers::TagHelper
+  include ApplicationHelper
+  
+  def self.init
+    HatedaIndex.create! :keyname => 'section', :basedate => '2010/9/1' 
+    HatedaIndex.create! :keyname => 'thema', :basedate => '2010/1/1' 
+    HatedaIndex.create! :keyname => 'word', :basedate => '2010/9/1' 
+    HatedaIndex.create! :keyname => 'letter', :basedate => '2007/1/1' 
+  end
+  
+  def self.section
+    HatedaIndex.find(:first, :conditions => ['keyname = ?', 'section'])
+  end
+  
+  def self.thema
+    HatedaIndex.find(:first, :conditions => ['keyname = ?', 'thema'])
+  end
+  
+  def self.word
+    HatedaIndex.find(:first, :conditions => ['keyname = ?', 'word'])
+  end
+  
+  def self.letter
+    HatedaIndex.find(:first, :conditions => ['keyname = ?', 'letter'])
+  end
+  
+  def modify
+    self.upload_at = Time.now if self.name
+  end
+  
+  def upload_time
+    if self.upload_at
+      self.upload_at.strftime('%Y/%m/%d %H:%M:%S')
+    else
+      nil
+    end
+  end
+  
+  def section_title(htn)
+    "[道徳経]章目次"
+  end
+  
+  def section_content(htn)
+    sections = Section.find(:all, :include => [:hateda_section])
+    ERB.new(open(RAILS_ROOT + '/lib/hateda_section_index.rhtml').read.untaint, nil, '-').result(binding)
+  end
+  
+  def thema_title(htn)
+    "[道徳経]テーマ目次"
+  end
+  
+  def thema_content(htn)
+    themas = Thema.find(:all, :include => [:hateda_thema])
+    ERB.new(open(RAILS_ROOT + '/lib/hateda_thema_index.rhtml').read.untaint, nil, '-').result(binding)
+  end
+  
+  def word_title(htn)
+    "[道徳経]熟語目次"
+  end
+  
+  def word_content(htn)
+    words = Word.find(:all, :include => [:hateda_word])
+    ERB.new(open(RAILS_ROOT + '/lib/hateda_word_index.rhtml').read.untaint, nil, '-').result(binding)
+  end
+  
+  def letter_title(htn)
+    "[道徳経]文字目次"
+  end
+  
+  def letter_content(htn)
+    letters = Letter.find(:all, :include => [:hateda_letter])
+    ERB.new(open(RAILS_ROOT + '/lib/hateda_letter_index.rhtml').read.untaint, nil, '-').result(binding)
+  end
+  
+  def self.upload_section_index(un, pass)
+    htn = Hatena.new(un, pass)
+    idx = HatedaIndex.section
+    if idx.name.to_s.empty?
+      entry = Atom::Entry.new(
+        :updated => idx.basedate, 
+        :title => idx.section_title(htn), 
+        :content => idx.section_content(htn)
+      )
+      idx.name = htn.create(entry)
+    else
+      entry = htn.entry(idx.name)
+      entry.title = idx.section_title(htn)
+      entry.content = idx.section_content(htn)
+      htn.update(idx.name, entry)
+    end
+    idx.save!
+  end
+  
+  def self.remove_section_index(un, pass)
+    htn = Hatena.new(un, pass)
+    idx = HatedaIndex.section
+    htn.destroy(idx.name)
+    idx.name = nil
+    idx.upload_at = nil
+    idx.save!
+  end
+  
+  def self.sync_section_index(un, pass)
+    htn = Hatena.new(un, pass)
+    idx = HatedaIndex.section
+    if idx.name.to_s.empty?
+    else
+      entry = htn.entry(idx.name)
+      HatedaIndex.transaction do
+        entry.content.body.scan( /\[#{Regexp.escape(htn.url_without_eid)}([\w\/]*):title\=(.*)\]/).each do |row|
+          if section = Section.find_cap(row[1])
+            unless row[0].to_s.empty?
+              section.hateda_section.name = row[0]
+              section.hateda_section.save!
+            end
+          end
+        end
+      end
+    end
+  end
+  
+  def self.upload_word_index(un, pass)
+    htn = Hatena.new(un, pass)
+    idx = HatedaIndex.word
+    if idx.name.to_s.empty?
+      entry = Atom::Entry.new(
+        :updated => idx.basedate, 
+        :title => idx.word_title(htn), 
+        :content => idx.word_content(htn)
+      )
+      idx.name = htn.create(entry)
+    else
+      entry = htn.entry(idx.name)
+      entry.title = idx.word_title(htn)
+      entry.content = idx.word_content(htn)
+      htn.update(idx.name, entry)
+    end
+    idx.save!
+  end
+  
+  def self.remove_word_index(un, pass)
+    htn = Hatena.new(un, pass)
+    idx = HatedaIndex.word
+    htn.destroy(idx.name)
+    idx.name = nil
+    idx.upload_at = nil
+    idx.save!
+  end
+  
+  def self.sync_word_index(un, pass)
+    htn = Hatena.new(un, pass)
+    idx = HatedaIndex.word
+    if idx.name.to_s.empty?
+    else
+      entry = htn.entry(idx.name)
+      HatedaIndex.transaction do
+        entry.content.body.scan( /\[#{Regexp.escape(htn.url_without_eid)}([\w\/]*):title\=(.*)\]/).each do |row|
+          if word = Word.find_letter(row[1])
+            unless row[0].to_s.empty?
+              word.hateda_word.name = row[0]
+              word.hateda_word.save!
+            end
+          end
+        end
+      end
+    end
+  end
+  
+  def self.upload_letter_index(un, pass)
+    htn = Hatena.new(un, pass)
+    idx = HatedaIndex.letter
+    if idx.name.to_s.empty?
+      entry = Atom::Entry.new(
+        :updated => idx.basedate, 
+        :title => idx.letter_title(htn), 
+        :content => idx.letter_content(htn)
+      )
+      idx.name = htn.create(entry)
+    else
+      entry = htn.entry(idx.name)
+      entry.title = idx.letter_title(htn)
+      entry.content = idx.letter_content(htn)
+      htn.update(idx.name, entry)
+    end
+    idx.save!
+  end
+  
+  def self.remove_letter_index(un, pass)
+    htn = Hatena.new(un, pass)
+    idx = HatedaIndex.letter
+    htn.destroy(idx.name)
+    idx.name = nil
+    idx.upload_at = nil
+    idx.save!
+  end
+  
+  def self.sync_letter_index(un, pass)
+    htn = Hatena.new(un, pass)
+    idx = HatedaIndex.letter
+    if idx.name.to_s.empty?
+    else
+      entry = htn.entry(idx.name)
+      HatedaIndex.transaction do
+        entry.content.body.scan( /\[#{Regexp.escape(htn.url_without_eid)}([\w\/]*):title\=(.*)\]/).each do |row|
+          if letter = Letter.find_letter(row[1])
+            unless row[0].to_s.empty?
+              letter.hateda_letter.name = row[0]
+              letter.hateda_letter.save!
+            end
+          end
+        end
+      end
+    end
+  end
+  
+  def self.upload_thema_index(un, pass)
+    htn = Hatena.new(un, pass)
+    idx = HatedaIndex.thema
+    if idx.name.to_s.empty?
+      entry = Atom::Entry.new(
+        :updated => idx.basedate, 
+        :title => idx.thema_title(htn), 
+        :content => idx.thema_content(htn)
+      )
+      idx.name = htn.create(entry)
+    else
+      entry = htn.entry(idx.name)
+      entry.title = idx.thema_title(htn)
+      entry.content = idx.thema_content(htn)
+      htn.update(idx.name, entry)
+    end
+    idx.save!
+  end
+  
+  def self.remove_thema_index(un, pass)
+    htn = Hatena.new(un, pass)
+    idx = HatedaIndex.thema
+    htn.destroy(idx.name)
+    idx.name = nil
+    idx.upload_at = nil
+    idx.save!
+  end
+  
+  def self.sync_thema_index(un, pass)
+    htn = Hatena.new(un, pass)
+    idx = HatedaIndex.thema
+    if idx.name.to_s.empty?
+    else
+      entry = htn.entry(idx.name)
+      HatedaIndex.transaction do
+        entry.content.body.scan( /\[#{Regexp.escape(htn.url_without_eid)}([\w\/]*):title\=(.*)\]/).each do |row|
+          if thema = Thema.find_cap(row[1])
+            unless row[0].to_s.empty?
+              thema.hateda_thema.name = row[0]
+              thema.hateda_thema.save!
+            end
+          end
+        end
+      end
+    end
+  end
+  
+end
\ No newline at end of file
diff --git a/app/models/hateda_letter.rb b/app/models/hateda_letter.rb
new file mode 100644 (file)
index 0000000..a5a7e33
--- /dev/null
@@ -0,0 +1,95 @@
+# はてなダイアリに突っ込む。
+require 'erb'
+class HatedaLetter < ActiveRecord::Base
+  include ActionView::Helpers::TextHelper
+  include ActionView::Helpers::TagHelper
+  include ApplicationHelper
+  belongs_to :letter
+  
+  before_save :modify
+  
+  def modify
+    self.upload_at = Time.now
+  end
+  
+  def upload_time
+    if self.upload_at
+      self.upload_at.strftime('%Y/%m/%d %H:%M:%S')
+    else
+      nil
+    end
+  end
+  
+  def title(htn)
+    "[老子][道徳経][文字]#{self.letter.letter}"
+  end
+  
+  def content(htn)
+    letter = self.letter
+    sections = Section.find(:all, :include => :section_letters, 
+      :conditions => ['section_letters.letter_id = ?', letter.id]
+    )
+    section_count = SectionLetter.count(:conditions => ['letter_id = ?', letter.id]).to_i
+    section_sum = SectionLetter.sum(:count, :conditions => ['letter_id = ?', letter.id]).to_i
+    ERB.new(open(RAILS_ROOT + '/lib/hateda_letter.rhtml').read.untaint, nil, '-').result(binding)
+  end
+  
+  def self.upload(htn, hl)
+    if hl.name.to_s.empty?
+      entry = Atom::Entry.new(
+        :updated => Time.parse('2006/2/1') + (hl.letter.id - 1).day, 
+        :title => hl.title(htn), 
+        :content => hl.content(htn)
+      )
+      hl.name = htn.create(entry)
+    else
+      entry = htn.entry(hl.name)
+      entry.title = hl.title(htn)
+      entry.content = hl.content(htn)
+      htn.update(hl.name, entry)
+    end
+    hl.save!
+    sleep 3
+  end
+  
+  def self.remove(htn, hl)
+    begin
+      htn.destroy(hl.name)
+    end
+    hl.name = nil
+    hl.upload_at = nil
+    hl.save!
+  end
+  
+  def self.upload_one(un, pass, letter_id)
+    htn = Hatena.new(un, pass)
+    letter = Letter.find(letter_id)
+    self.upload(htn, letter.hateda_letter)
+  end
+  
+  def self.upload_modified(un, pass)
+    htn = Hatena.new(un, pass)
+    letters = Letter.find(:all, :include => [:hateda_letter], 
+      :conditions => ['hateda_letters.name is null or hateda_letters.upload_at < letters.update_at']
+    )
+    letters.each do |letter|
+      self.upload(htn, letter.hateda_letter)
+    end
+  end
+  
+  def self.remove_one(htn, letter_id)
+    letter = Letter.find(letter_id)
+    self.remove(htn, letter.hateda_letter)
+  end
+  
+  def self.remove_all(un, pass)
+    htn = Hatena.new(un, pass)
+    letters = Letter.find(:all, :include => [:hateda_letter], 
+      :conditions => ['hateda_letters.name is not null']
+    )
+    letters.each do |letter|
+      self.remove(htn, letter.hateda_letter)
+    end
+  end
+  
+end
diff --git a/app/models/hateda_section.rb b/app/models/hateda_section.rb
new file mode 100644 (file)
index 0000000..263a982
--- /dev/null
@@ -0,0 +1,110 @@
+# はてなダイアリに突っ込む。
+require 'erb'
+class HatedaSection < ActiveRecord::Base
+  include ActionView::Helpers::TextHelper
+  include ActionView::Helpers::TagHelper
+  include ApplicationHelper
+  
+  belongs_to :section
+  
+  before_save :modify
+  
+  def modify
+    self.upload_at = Time.now if self.name
+  end
+  
+  def upload_time
+    if self.upload_at
+      self.upload_at.strftime('%Y/%m/%d %H:%M:%S')
+    else
+      nil
+    end
+  end
+  
+  def title(htn)
+    "[老子][道徳経]#{self.section.caption} #{noruby(self.section.desc)}"
+  end
+  
+  def content(htn)
+    themas = Thema.find(:all, :include => :thema_sections, 
+      :conditions => ['thema_sections.section_id = ?', section.id]
+    )
+    letter_count = SectionLetter.count(:conditions => ['section_id = ?', section.id]).to_i
+    letter_sum = SectionLetter.sum(:count, :conditions => ['section_id = ?', section.id]).to_i
+    word_count = SectionWord.count(:conditions => ['section_id = ?', section.id]).to_i
+    word_sum = SectionWord.sum(:count, :conditions => ['section_id = ?', section.id]).to_i
+    sec_words = SectionWord.find(:all, :include => :word, 
+      :conditions => ['section_words.section_id = ?', section.id]
+    )
+    sec_letters = SectionLetter.find(:all, :include => :letter, 
+      :conditions => ['section_letters.section_id = ?', section.id]
+    )
+    hint_letters = SectionLetter.find(:all, :include => :letter, 
+      :conditions => ['section_letters.section_id = ? and section_letters.chk = 1', section.id]
+    )
+    hint_words = SectionWord.find(:all, :include => :word, 
+      :conditions => ['section_words.section_id = ? and section_words.chk = 1 ', section.id]
+    )
+    ERB.new(open(RAILS_ROOT + '/lib/hateda_section.rhtml').read.untaint, nil, '-').result(binding)
+  end
+  
+  def self.upload(htn, hs)
+    if hs.name.to_s.empty?
+      entry = Atom::Entry.new(
+        :updated => Time.parse('2010/10/1') + (hs.section.num - 1).day, 
+        :title => hs.title(htn), 
+        :content => hs.content(htn)
+      )
+      hs.name = htn.create(entry)
+    else
+      entry = htn.entry(hs.name)
+      entry.title = hs.title(htn)
+      entry.content = hs.content(htn)
+      htn.update(hs.name, entry)
+    end
+    hs.save!
+    sleep 3
+  end
+  
+  def self.remove(htn, hs)
+    begin
+      htn.destroy(hs.name)
+    end
+    hs.name = nil
+    hs.upload_at = nil
+    hs.save!
+  end
+  
+  def self.upload_one(un, pass, section_id)
+    htn = Hatena.new(un, pass)
+    section = Section.find(section_id)
+    self.upload(htn, section.hateda_section)
+  end
+  
+  def self.upload_modified(un, pass)
+    htn = Hatena.new(un, pass)
+    sections = Section.find(:all, :include => [:hateda_section], 
+      :conditions => ['hateda_sections.name is null or hateda_sections.upload_at < sections.update_at'],
+      :order => 'sections.num'
+    )
+    sections.each do |section|
+      self.upload(htn, section.hateda_section)
+    end
+  end
+  
+  def self.remove_one(htn, section_id)
+    section = Section.find(section_id)
+    self.remove(htn, section.hateda_section)
+  end
+  
+  def self.remove_all(un, pass)
+    htn = Hatena.new(un, pass)
+    sections = Section.find(:all, :include => [:hateda_section], 
+      :conditions => ['hateda_sections.name is not null']
+    )
+    sections.each do |section|
+      self.remove(htn, section.hateda_section)
+    end
+  end
+  
+end
diff --git a/app/models/hateda_thema.rb b/app/models/hateda_thema.rb
new file mode 100644 (file)
index 0000000..f0ee130
--- /dev/null
@@ -0,0 +1,92 @@
+# はてなダイアリに突っ込む。
+require 'erb'
+class HatedaThema < ActiveRecord::Base
+  include ActionView::Helpers::TextHelper
+  include ActionView::Helpers::TagHelper
+  include ApplicationHelper
+  belongs_to :thema
+  
+  before_save :modify
+  
+  def modify
+    self.upload_at = Time.now if self.name
+  end
+  
+  def upload_time
+    if self.upload_at
+      self.upload_at.strftime('%Y/%m/%d %H:%M:%S')
+    else
+      nil
+    end
+  end
+  
+  def title(htn)
+    "[道徳経][テーマ]#{self.thema.caption}"
+  end
+  
+  def content(htn)
+    sections = Section.find(:all, :include => :thema_sections, 
+      :conditions => ['thema_sections.thema_id = ?', self.thema.id]
+    )
+    ERB.new(open(RAILS_ROOT + '/lib/hateda_thema.rhtml').read.untaint, nil, '-').result(binding)
+  end
+  
+  def self.upload(htn, ht)
+    if ht.name.to_s.empty?
+      entry = Atom::Entry.new(
+        :updated => Time.parse('2010/1/10') + (ht.thema.id - 1).day, 
+        :title => ht.title(htn), 
+        :content => ht.content(htn)
+      )
+      ht.name = htn.create(entry)
+    else
+      entry = htn.entry(ht.name)
+      entry.title = ht.title(htn)
+      entry.content = ht.content(htn)
+      htn.update(ht.name, entry)
+    end
+    ht.save!
+    sleep 3
+  end
+  
+  def self.remove(htn, ht)
+    begin
+      htn.destroy(ht.name)
+    end
+    ht.name = nil
+    ht.upload_at = nil
+    ht.save!
+  end
+  
+  def self.upload_one(un, pass, thema_id)
+    htn = Hatena.new(un, pass)
+    thema = Thema.find(thema_id)
+    self.upload(htn, thema.hateda_thema)
+  end
+  
+  def self.upload_modified(un, pass)
+    htn = Hatena.new(un, pass)
+    themas = Thema.find(:all, :include => [:hateda_thema], 
+      :conditions => ['hateda_themas.name is null or hateda_themas.upload_at < themas.update_at']
+    )
+    themas.each do |thema|
+      self.upload(htn, thema.hateda_thema)
+    end
+  end
+  
+  def self.remove_one(htn, thema_id)
+    thema = Thema.find(thema_id)
+    self.remove(htn, thema.hateda_thema)
+  end
+  
+  def self.remove_all(un, pass)
+    htn = Hatena.new(un, pass)
+    themas = Thema.find(:all, :include => [:hateda_thema], 
+      :conditions => ['hateda_themas.name is not null']
+    )
+    themas.each do |thema|
+      self.remove(htn, thema.hateda_thema)
+    end
+  end
+  
+end
diff --git a/app/models/hateda_word.rb b/app/models/hateda_word.rb
new file mode 100644 (file)
index 0000000..9d148b3
--- /dev/null
@@ -0,0 +1,95 @@
+# はてなダイアリに突っ込む。
+require 'erb'
+class HatedaWord < ActiveRecord::Base
+  include ActionView::Helpers::TextHelper
+  include ActionView::Helpers::TagHelper
+  include ApplicationHelper
+  belongs_to :word
+  
+  before_save :modify
+  
+  def modify
+    self.upload_at = Time.now
+  end
+  
+  def upload_time
+    if self.upload_at
+      self.upload_at.strftime('%Y/%m/%d %H:%M:%S')
+    else
+      nil
+    end
+  end
+  
+  def title(htn)
+    "[老子][道徳経][熟語]#{self.word.letter}"
+  end
+  
+  def content(htn)
+    word = self.word
+    sections = Section.find(:all, :include => :section_words, 
+      :conditions => ['section_words.word_id = ?', word.id]
+    )
+    section_count = SectionWord.count(:conditions => ['word_id = ?', word.id]).to_i
+    section_sum = SectionWord.sum(:count, :conditions => ['word_id = ?', word.id]).to_i
+    ERB.new(open(RAILS_ROOT + '/lib/hateda_word.rhtml').read.untaint, nil, '-').result(binding)
+  end
+  
+  def self.upload(htn, hw)
+    if hw.name.to_s.empty?
+      entry = Atom::Entry.new(
+        :updated => Time.parse('2009/2/1') + (hw.word.id - 1).day, 
+        :title => hw.title(htn), 
+        :content => hw.content(htn)
+      )
+      hw.name = htn.create(entry)
+    else
+      entry = htn.entry(hw.name)
+      entry.title = hw.title(htn)
+      entry.content = hw.content(htn)
+      htn.update(hw.name, entry)
+    end
+    hw.save!
+    sleep 3
+  end
+  
+  def self.remove(htn, hw)
+    begin
+      htn.destroy(hw.name)
+    end
+    hw.name = nil
+    hw.upload_at = nil
+    hw.save!
+  end
+  
+  def self.upload_one(un, pass, word_id)
+    htn = Hatena.new(un, pass)
+    word = Word.find(word_id)
+    self.upload(htn, word.hateda_word)
+  end
+  
+  def self.upload_modified(un, pass)
+    htn = Hatena.new(un, pass)
+    words = Word.find(:all, :include => [:hateda_word], 
+      :conditions => ['hateda_words.name is null or hateda_words.upload_at < words.update_at']
+    )
+    words.each do |word|
+      self.upload(htn, word.hateda_word)
+    end
+  end
+  
+  def self.remove_one(htn, word_id)
+    word = Word.find(word_id)
+    self.remove(htn, word.hateda_word)
+  end
+  
+  def self.remove_all(un, pass)
+    htn = Hatena.new(un, pass)
+    words = Word.find(:all, :include => [:hateda_word], 
+      :conditions => ['hateda_words.name is not null']
+    )
+    words.each do |word|
+      self.remove(htn, word.hateda_word)
+    end
+  end
+  
+end
diff --git a/app/models/letter.rb b/app/models/letter.rb
new file mode 100644 (file)
index 0000000..892777b
--- /dev/null
@@ -0,0 +1,132 @@
+# 文字
+class Letter < ActiveRecord::Base
+  has_many :section_letters
+  has_one :hateda_letter
+  
+  before_save :modify
+  after_create :created
+  after_destroy :destroied
+  
+  def self.import(data)
+    Section.transaction do
+      data.to_s.gsub(/\r/, '').split(/\n/).each do |l|
+        columns = l.split(/\t/)
+        letter = Letter.find :first, :conditions => ['letter = ?', columns[0]]
+        if letter 
+          letter.yomi = columns[1] unless columns[1].to_s.empty?
+          letter.detail = columns[2] unless columns[2].to_s.empty?
+          letter.update_at = columns[3] unless columns[3].to_s.empty?
+          letter.save!
+        else
+          letter = Letter.new :letter => columns[0], :yomi => columns[1], :detail => columns[2], :update_at => columns[3]
+          letter.save!
+        end
+        hl = HatedaLetter.find :first, :conditions => ['letter_id = ?', letter.id]
+        hl.name = columns[4] unless columns[4].to_s.empty?
+        hl.upload_at = columns[5] unless columns[5].to_s.empty?
+        letter.parse
+      end
+    end
+  end
+  
+  def self.export
+    letters = Letter.find(:all, :order => 'count desc').map { |letter|
+      letter.letter.to_s + "\t" + letter.yomi.to_s + "\t" + letter.detail.to_s + "\t" + 
+        letter.update_at.to_s + "\t" + letter.hateda_letter.name.to_s + "\t" + letter.hateda_letter.upload_at.to_s
+    }.join("\n")
+    letters
+  end
+  
+  def self.parse
+    Letter.find(:all).each do |letter|
+      letter.parse
+    end
+    SectionLetter.delete_all 'count = 0'
+  end
+  
+  def parse
+    Section.transaction do
+      self.count = 0
+      SectionLetter.update_all "count = 0", ["letter_id = ?", self.id]
+      Section.find(:all, :conditions => ['source like ?', "%#{self.letter}%"]).each do |section|
+        sz = section.source.scan(/#{Regexp.escape(self.letter)}/).size
+        sl = SectionLetter.find :first, :conditions => ['section_id = ? and letter_id = ?', section.id, self.id] 
+        if sl
+          if sz == 0
+            SectionLetter.destroy sl.id
+          else
+            sl.count += sz
+            sl.save!
+          end
+        else
+          if sz == 0
+          else
+            sl = SectionLetter.new(:letter_id => self.id, :section_id => section.id, :count => sz)
+            sl.save!
+          end
+        end
+        self.count += sz
+      end
+      if self.count == 0
+        Letter.destroy self.id
+      else
+        self.save!
+      end
+    end
+  end
+  
+  def self.find_letter l
+    Letter.find :first, :conditions => ['letter = ?', l]
+  end
+  
+  def modify?
+    if self.update_at and self.hateda_letter.upload_at
+      self.update_at > self.hateda_letter.upload_at
+    else
+      true
+    end
+  end
+  
+  def update_time
+    if self.update_at
+      self.update_at.strftime('%Y/%m/%d %H:%M:%S')
+    else
+      nil
+    end
+  end
+  
+  def modify
+    self.yomi = self.yomi.to_s.gsub(/\r/, '').gsub(/\n/, '/')
+    self.detail = self.detail.to_s.gsub(/\r/, '').gsub(/\n/, '/')
+    self.update_at = Time.now
+  end
+  
+  def created
+    unless self.hateda_letter
+      hl = HatedaLetter.new(:letter_id => self.id)
+      hl.save!
+    end
+  end
+  
+  def destroied
+    SectionLetter.delete_all ['letter_id = ?', self.id]
+    HatedaLetter.delete_all ['letter_id = ?', self.id]
+  end
+  
+  def disp_yomi
+    self.yomi.to_s.gsub('/', "\n")
+  end
+  
+  def edit_detail
+    self.detail.to_s.gsub('/', "\n")
+  end
+  
+  def disp_detail
+    self.edit_detail.gsub('[', '').gsub(']', '')
+  end
+  
+  def desc
+    self.edit_detail.scan(/\[.+?\]/m).join('...').gsub('[', '').gsub(']', '')
+  end
+  
+end
diff --git a/app/models/section.rb b/app/models/section.rb
new file mode 100644 (file)
index 0000000..c2c3db2
--- /dev/null
@@ -0,0 +1,171 @@
+# 章生成
+class Section < ActiveRecord::Base
+  has_many :section_letters
+  has_many :section_words
+  has_many :thema_sections
+  has_one :hateda_section
+  
+  before_save :modify
+  after_create :created
+  
+  def self.import(source)
+    Section.transaction do
+      source.each_line do |l|
+        columns = l.gsub(/\r/, '').gsub(/\n/, '').split(/\t/)
+        s = Section.find :first, :conditions => ['num = ?', columns[0]]
+        if s
+          s.caption = columns[1]
+          s.source = columns[2]
+          s.japanese = columns[3]
+          s.trans = columns[4]
+          s.english = columns[5]
+          s.myself = columns[6]
+          s.etc = columns[7]
+          s.note = columns[8]
+          s.update_at = columns[9]
+          s.save!
+        else
+          s = Section.new(
+            :num => columns[0], :caption => columns[1], :source => columns[2],
+            :japanese => columns[3], :trans => columns[4], :english => columns[5], 
+            :myself => columns[6], 
+            :etc => columns[7], :note => columns[8], :update_at => columns[9]
+          )
+          s.save!
+        end
+        hs = HatedaSection.find :first, :conditions => ['section_id = ?', s.id]
+        hs.name = columns[10] unless columns[10].to_s.empty?
+        hs.upload_at = columns[11] unless columns[11].to_s.empty?
+        s.parse
+      end
+      Section.edit_source 
+    end
+  end
+  
+  def self.export
+    sections = Section.find(:all, :order => 'num').map { |section|
+      section.num.to_s + "\t" + section.caption.to_s + "\t" + section.source.to_s + "\t" + 
+        section.japanese.to_s + "\t" + section.trans.to_s + "\t" + section.english.to_s + "\t" + 
+        section.myself.to_s + "\t" + section.etc.to_s + "\t" + section.note.to_s + "\t" + 
+        section.update_at.to_s + "\t" + section.hateda_section.name.to_s + "\t" + section.hateda_section.upload_at.to_s
+    }.join("\n")
+    sections
+  end
+  
+  def self.edit_source
+    Section.transaction do
+      SectionLetter.update_all "count = 0"
+      Letter.update_all "count = 0"
+      SectionWord.update_all "count = 0"
+      Word.update_all "count = 0"
+      Letter.parse
+      Word.parse
+    end
+  end
+  
+  def upd prm
+    Section.transaction do
+      os = self.disp_source
+      self.source = prm[:source]
+      self.japanese = prm[:japanese]
+      self.myself = prm[:myself]
+      self.note = prm[:note]
+      self.etc = prm[:etc]
+      self.trans = prm[:trans]
+      self.save!
+      Section.edit_source unless self.disp_source == os
+    end
+  end
+  
+  def parse
+    source.gsub(/\s/, '').gsub(/\//, '').gsub(/\[/, '').gsub(/\]/, '').gsub(/。/, '').gsub(/、/, '').to_s.each_char do |c|
+p c
+      l = Letter.find :first, :conditions => ['letter = ?', c]
+      if l
+      else
+        l = Letter.new(:letter => c, :count => 0)
+        l.save!
+      end
+    end
+  end
+  
+  def self.find_num num
+    Section.find :first, :conditions => ['num = ?', num]
+  end
+  
+  def self.find_cap cap
+    Section.find :first, :conditions => ['caption = ?', cap]
+  end
+  
+  def modify?
+    if self.update_at and self.hateda_section.upload_at
+      self.update_at > self.hateda_section.upload_at
+    else
+      true
+    end
+  end
+  
+  def update_time
+    if self.update_at
+      self.update_at.strftime('%Y/%m/%d %H:%M:%S')
+    else
+      nil
+    end
+  end
+  
+  def intro
+    self.edit_source.scan(/\[.+?\]/m).join('...').gsub('[', '').gsub(']', '')
+  end
+  
+  def desc
+    self.edit_japanese.scan(/\[.+?\]/m).join('...').gsub('[', '').gsub(']', '')
+  end
+  
+  def modify
+    self.source = self.source.to_s.gsub(/\r/, '').gsub(/\n/, '/').gsub(/\s/, '')
+    self.japanese = self.japanese.to_s.gsub(/\r/, '').gsub(/\n/, '/').gsub(/\s/, '')
+    self.myself = self.myself.to_s.gsub(/\r/, '').gsub(/\n/, '/').gsub(/\s/, '')
+    self.note = self.note.to_s.gsub(/\r/, '').gsub(/\n/, '/').gsub(/\s/, '')
+    self.update_at = Time.now
+  end
+  
+  def created
+    unless self.hateda_section
+      hs = HatedaSection.new(:section_id => self.id)
+      hs.save!
+    end
+  end
+  
+  def edit_source
+    self.source.to_s.gsub('/', "\n")
+  end
+  
+  def disp_source
+    self.edit_source.gsub('[', '').gsub(']', '')
+  end
+  
+  def edit_japanese
+    self.japanese.to_s.gsub('/', "\n")
+  end
+  
+  def disp_japanese
+    self.edit_japanese.gsub('[', '').gsub(']', '')
+  end
+  
+  def edit_myself
+    self.myself.to_s.gsub('/', "\n")
+  end
+  
+  def disp_myself
+    self.edit_myself
+  end
+  
+  def edit_note
+    self.note.to_s.gsub('/', "\n")
+  end
+  
+  def disp_note
+    self.edit_note
+  end
+  
+end
diff --git a/app/models/section_letter.rb b/app/models/section_letter.rb
new file mode 100644 (file)
index 0000000..671fc20
--- /dev/null
@@ -0,0 +1,9 @@
+class SectionLetter < ActiveRecord::Base
+  belongs_to :section
+  belongs_to :letter
+  
+  def bchk
+    chk != 0
+  end
+  
+end
diff --git a/app/models/section_word.rb b/app/models/section_word.rb
new file mode 100644 (file)
index 0000000..05e2128
--- /dev/null
@@ -0,0 +1,9 @@
+class SectionWord < ActiveRecord::Base
+  belongs_to :section
+  belongs_to :word
+  
+  def bchk
+    chk != 0
+  end
+  
+end
diff --git a/app/models/source.rb b/app/models/source.rb
new file mode 100644 (file)
index 0000000..12221de
--- /dev/null
@@ -0,0 +1,2 @@
+class Source < ActiveRecord::Base
+end
diff --git a/app/models/thema.rb b/app/models/thema.rb
new file mode 100644 (file)
index 0000000..b44fe96
--- /dev/null
@@ -0,0 +1,115 @@
+class Thema < ActiveRecord::Base
+  has_many :thema_sections
+  has_one :hateda_thema
+  
+  before_save :modify
+  after_create :created
+  
+  def self.import(data)
+    Thema.transaction do
+      data.to_s.gsub(/\r/, '').split(/\n/).each do |l|
+        columns = l.split(/\t/)
+        thema = Thema.find columns[0]
+        if thema 
+          thema.caption = columns[1] unless columns[1].to_s.empty?
+          thema.detail = columns[2] unless columns[2].to_s.empty?
+          thema.update_at = columns[3] unless columns[3].to_s.empty?
+          thema.save!
+        else
+          thema = Thema.new :caption => columns[1], :detail => columns[2]
+          thema.save!
+        end
+        ht = HatedaThema.find :first, :conditions => ['thema_id = ?', thema.id]
+        ht.name = columns[4] unless columns[4].to_s.empty?
+        ht.upload_at = columns[5] unless columns[5].to_s.empty?
+        unless columns[6].to_s.empty?
+          columns[6].split(/\// ).each do |num|
+            section = Section.find_num num
+            thema.make section.id
+          end
+        end
+      end
+    end
+  end
+  
+  def self.export
+    themas = Thema.find(:all).map { |thema|
+      thema.id.to_s + "\t" + thema.caption.to_s + "\t" + thema.detail.to_s + "\t" + thema.update_at.to_s + "\t" + 
+        thema.hateda_thema.name.to_s + "\t" + thema.hateda_thema.upload_at.to_s + "\t" + 
+        thema.thema_sections.map {|ts| ts.section.num }.join("/")
+    }.join("\n")
+    themas
+  end
+  
+  def self.find_cap cap
+    Thema.find :first, :conditions => ['caption = ?', cap]
+  end
+  
+  def modify?
+    if self.update_at and self.hateda_thema.upload_at
+      self.update_at > self.hateda_thema.upload_at
+    else
+      true
+    end
+  end
+  
+  def update_time
+    if self.update_at
+      self.update_at.strftime('%Y/%m/%d %H:%M:%S')
+    else
+      nil
+    end
+  end
+  
+  def upd(th)
+    res = nil
+    begin
+      Thema.transaction do
+        self.caption = th[:caption]
+        self.detail = th[:detail]
+        self.save!
+        res = true
+      end
+    rescue
+    end
+    res
+  end
+  
+  def make(section_id)
+    res = nil
+    begin
+      Thema.transaction do
+        self.save!
+        ThemaSection.create!(:thema_id => self.id, :section_id => section_id)
+        res = true
+      end
+    rescue
+    end
+    res
+  end
+  
+  def modify
+    self.detail = self.detail.to_s.gsub(/\r/, '').gsub(/\n/, '/')
+    self.update_at = Time.now
+  end
+  
+  def edit_detail
+    self.detail.to_s.gsub('/', "\n")
+  end
+  
+  def disp_detail
+    self.edit_detail.gsub('[', '').gsub(']', '')
+  end
+  
+  def desc
+    self.edit_detail.scan(/\[.+?\]/m).join('...').gsub('[', '').gsub(']', '')
+  end
+  
+  def created
+    unless self.hateda_thema
+      ht = HatedaThema.new(:thema_id => self.id)
+      ht.save!
+    end
+  end
+  
+end
diff --git a/app/models/thema_section.rb b/app/models/thema_section.rb
new file mode 100644 (file)
index 0000000..1701c9c
--- /dev/null
@@ -0,0 +1,19 @@
+class ThemaSection < ActiveRecord::Base
+  belongs_to :thema
+  belongs_to :section
+  
+  def self.link(tid, sid)
+    ts = ThemaSection.find(:first, :conditions => ['section_id = ? and thema_id = ?', sid, tid])
+    unless ts
+      ThemaSection.create!(:thema_id => tid, :section_id => sid)
+    end
+  end
+  
+  def self.unlink(tid, sid)
+    ts = ThemaSection.find(:first, :conditions => ['section_id = ? and thema_id = ?', sid, tid])
+    if ts
+      ts.destroy
+    end
+  end
+  
+end
diff --git a/app/models/word.rb b/app/models/word.rb
new file mode 100644 (file)
index 0000000..e68e3d6
--- /dev/null
@@ -0,0 +1,140 @@
+# 熟語
+class Word < ActiveRecord::Base
+  has_many :section_words
+  has_one :hateda_word
+  
+  before_save :modify
+  after_create :created
+  after_destroy :destroied
+  
+  def self.import(data)
+    Section.transaction do
+      data.to_s.gsub(/\r/, '').split(/\n/).each do |l|
+        columns = l.split(/\t/)
+        word = Word.find :first, :conditions => ['letter = ?', columns[0]]
+        if word 
+          word.yomi = columns[1] unless columns[1].to_s.empty?
+          word.detail = columns[2] unless columns[2].to_s.empty?
+          word.update_at = columns[3] unless columns[3].to_s.empty?
+          word.save!
+        else
+          word = Word.new :letter => columns[0], :yomi => columns[1], :detail => columns[2], :update_at => columns[3]
+          word.save!
+        end
+        hw = HatedaWord.find :first, :conditions => ['word_id = ?', word.id]
+        hw.name = columns[4] unless columns[4].to_s.empty?
+        hw.upload_at = columns[5] unless columns[5].to_s.empty?
+        word.parse
+      end
+    end
+  end
+  
+  def self.export
+    words = Word.find(:all, :order => 'count desc').map { |word|
+      word.letter.to_s + "\t" + word.yomi.to_s + "\t" + word.detail.to_s + "\t" + 
+        word.update_at.to_s + "\t" + word.hateda_word.name.to_s + "\t" + word.hateda_word.upload_at.to_s
+    }.join("\n")
+    words
+  end
+  
+  def self.parse
+    Word.find(:all).each do |word|
+      word.parse
+    end
+    SectionWord.delete_all 'count = 0'
+  end
+  
+  def parse
+    Section.transaction do
+      self.count = 0
+      SectionWord.update_all "count = 0", ["word_id = ?", self.id]
+      Section.find(:all, :conditions => ['source like ?', "%#{self.letter}%"]).each do |section|
+        sz = section.source.scan(/#{self.letter}/).size
+        sw = SectionWord.find :first, :conditions => ['section_id = ? and word_id = ?', section.id, self.id] 
+        if sw
+          if sz == 0
+            SectionWord.destroy sw.id
+          else
+            sw.count += sz
+            sw.save!
+          end
+        else
+          if sz == 0
+          else
+            sw = SectionWord.new(:word_id => self.id, :section_id => section.id, :count => sz)
+            sw.save!
+          end
+        end
+        self.count += sz
+      end
+      if self.count == 0
+        Word.destroy self.id
+      else
+        self.save!
+      end
+    end
+  end
+  
+  def self.find_letter l
+    Word.find :first, :conditions => ['letter = ?', l]
+  end
+  
+  def modify?
+    if self.update_at and self.hateda_word.upload_at
+      self.update_at > self.hateda_word.upload_at
+    else
+      true
+    end
+  end
+  
+  def update_time
+    if self.update_at
+      self.update_at.strftime('%Y/%m/%d %H:%M:%S')
+    else
+      nil
+    end
+  end
+  
+  def destroy
+    Word.transaction do
+      SectionWord.delete_all ["word_id = ?", self.id]
+      HatedaWord.delete_all ["word_id = ?", self.id]
+      super
+    end
+  end
+  
+  def modify
+    self.yomi = self.yomi.to_s.gsub(/\r/, '').gsub(/\n/, '/')
+    self.detail = self.detail.to_s.gsub(/\r/, '').gsub(/\n/, '/')
+    self.update_at = Time.now
+  end
+  
+  def created
+    unless self.hateda_word
+      hw = HatedaWord.new(:word_id => self.id)
+      hw.save!
+    end
+  end
+  
+  def destroied
+    SectionWord.delete_all ['word_id = ?', self.id]
+    HatedaWord.delete_all ['word_id = ?', self.id]
+  end
+  
+  def disp_yomi
+    self.yomi.to_s.gsub('/', "\n")
+  end
+  
+  def edit_detail
+    self.detail.to_s.gsub('/', "\n")
+  end
+  
+  def disp_detail
+    self.edit_detail.gsub('[', '').gsub(']', '')
+  end
+  
+  def desc
+    self.edit_detail.scan(/\[.+?\]/m).join('...').gsub('[', '').gsub(']', '')
+  end
+  
+end
diff --git a/app/views/hateda/_letter_filter.rhtml b/app/views/hateda/_letter_filter.rhtml
new file mode 100644 (file)
index 0000000..a72754c
--- /dev/null
@@ -0,0 +1,11 @@
+<!-- 文字リストの絞り込み -->
+<% if @filter == 0 -%>
+  <% form_tag({:controller => '/letter', :action => :list, :filter => 1}) do -%>
+    *すべての文字を表示中*><%= submit_tag 'アップロードが必要な文字だけを表示する' %>
+  <% end -%>
+<% else -%>
+  <% form_tag({:controller => '/letter', :action => :list}) do -%>
+    *アップロードが必要な文字だけを表示中*><%= submit_tag 'すべての文字を表示する' %>
+  <% end -%>
+<% end -%>
+<!-- /文字リストの絞り込み -->
diff --git a/app/views/hateda/_letter_show.rhtml b/app/views/hateda/_letter_show.rhtml
new file mode 100644 (file)
index 0000000..4fda00f
--- /dev/null
@@ -0,0 +1,21 @@
+<!-- 文字単体表示のはてダ -->
+<h2>はてなダイアリー</h2>
+<% if @letter.hateda_letter.upload_at -%>
+  <div>
+    アップロード時刻:
+    <%= @letter.hateda_letter.upload_time -%>
+  </div>
+  <div>
+    エントリID:
+    <%= @letter.hateda_letter.name -%>
+  </div>
+<% else -%>
+  まだアップロードされていません
+<% end -%>
+<% form_tag({:controller => '/letter', :action => :upload_letter, :id => @letter.id}) do -%>
+  <%= submit_tag 'アップロードする' %>
+<% end -%>
+<% form_tag(:controller => '/letter', :action => :remove_letter, :id => @letter.id) do -%>
+  <%= submit_tag '記事を取り消す' %>
+<% end -%>
+<!-- 文字単体表示のはてダ -->
diff --git a/app/views/hateda/_section_filter.rhtml b/app/views/hateda/_section_filter.rhtml
new file mode 100644 (file)
index 0000000..22d94d9
--- /dev/null
@@ -0,0 +1,11 @@
+<!-- 章リストの絞り込み -->
+<% if @filter == 0 -%>
+  <% form_tag({:controller => '/section', :action => :list, :filter => 1}) do -%>
+    <%= submit_tag 'アップロードが必要な章だけを表示する' %>
+  <% end -%>
+<% else -%>
+  <% form_tag({:controller => '/section', :action => :list}) do -%>
+    <%= submit_tag 'すべての章を表示する' %>
+  <% end -%>
+<% end -%>
+<!-- /章リストの絞り込み -->
diff --git a/app/views/hateda/_section_show.rhtml b/app/views/hateda/_section_show.rhtml
new file mode 100644 (file)
index 0000000..4adeed7
--- /dev/null
@@ -0,0 +1,21 @@
+<!-- 章単体表示のはてダ -->
+<h2>はてなダイアリー</h2>
+<% if @section.hateda_section.upload_at -%>
+  <div>
+    アップロード時刻:
+    <%= @section.hateda_section.upload_time -%>
+  </div>
+  <div>
+    エントリID:
+    <%= @section.hateda_section.name -%>
+  </div>
+<% else -%>
+  まだアップロードされていません
+<% end -%>
+<% form_tag({:controller => '/section', :action => :upload_section, :id => @section.id}) do -%>
+  <%= submit_tag 'アップロードする' %>
+<% end -%>
+<% form_tag(:controller => '/section', :action => :remove_section, :id => @section.id) do -%>
+  <%= submit_tag '記事を取り消す' %>
+<% end -%>
+<!-- 章単体表示のはてダ -->
diff --git a/app/views/hateda/_thema_filter.rhtml b/app/views/hateda/_thema_filter.rhtml
new file mode 100644 (file)
index 0000000..bcd7d41
--- /dev/null
@@ -0,0 +1,11 @@
+<!-- テーマリストの絞り込み -->
+<% if @filter == 0 -%>
+  <% form_tag({:controller => '/thema', :action => :list, :filter => 1}) do -%>
+    <%= submit_tag 'アップロードが必要なテーマだけを表示する' %>
+  <% end -%>
+<% else -%>
+  <% form_tag({:controller => '/thema', :action => :list}) do -%>
+    <%= submit_tag 'すべてのテーマを表示する' %>
+  <% end -%>
+<% end -%>
+<!-- /テーマリストの絞り込み -->
diff --git a/app/views/hateda/_thema_show.rhtml b/app/views/hateda/_thema_show.rhtml
new file mode 100644 (file)
index 0000000..6775ec3
--- /dev/null
@@ -0,0 +1,21 @@
+<!-- テーマ単体表示のはてダ -->
+<h2>はてなダイアリー</h2>
+<% if @thema.hateda_thema.upload_at -%>
+  <div>
+    アップロード時刻:
+    <%= @thema.hateda_thema.upload_time -%>
+  </div>
+  <div>
+    エントリID:
+    <%= @thema.hateda_thema.name -%>
+  </div>
+<% else -%>
+  まだアップロードされていません
+<% end -%>
+<% form_tag({:controller => '/thema', :action => :upload_thema, :id => @thema.id}) do -%>
+  <%= submit_tag 'アップロードする' %>
+<% end -%>
+<% form_tag(:controller => '/thema', :action => :remove_thema, :id => @thema.id) do -%>
+  <%= submit_tag '記事を取り消す' %>
+<% end -%>
+<!-- テーマ単体表示のはてダ -->
diff --git a/app/views/hateda/_word_filter.rhtml b/app/views/hateda/_word_filter.rhtml
new file mode 100644 (file)
index 0000000..54a0c9a
--- /dev/null
@@ -0,0 +1,11 @@
+<!-- 熟語リストの絞り込み -->
+<% if @filter == 0 -%>
+  <% form_tag({:controller => '/words', :action => :list, :filter => 1}) do -%>
+    *すべての熟語を表示中*><%= submit_tag 'アップロードが必要な熟語だけを表示する' %>
+  <% end -%>
+<% else -%>
+  <% form_tag({:controller => '/words', :action => :list}) do -%>
+    *アップロードが必要な熟語だけを表示中*><%= submit_tag 'すべての熟語を表示する' %>
+  <% end -%>
+<% end -%>
+<!-- /熟語リストの絞り込み -->
diff --git a/app/views/hateda/_word_show.rhtml b/app/views/hateda/_word_show.rhtml
new file mode 100644 (file)
index 0000000..5f57d31
--- /dev/null
@@ -0,0 +1,21 @@
+<!-- 熟語単体表示のはてダ -->
+<h2>はてなダイアリー</h2>
+<% if @word.hateda_word.upload_at -%>
+  <div>
+    アップロード時刻:
+    <%= @word.hateda_word.upload_time -%>
+  </div>
+  <div>
+    エントリID:
+    <%= @word.hateda_word.name -%>
+  </div>
+<% else -%>
+  まだアップロードされていません
+<% end -%>
+<% form_tag({:controller => '/words', :action => :upload_word, :id => @word.id}) do -%>
+  <%= submit_tag 'アップロードする' %>
+<% end -%>
+<% form_tag(:controller => '/words', :action => :remove_word, :id => @word.id) do -%>
+  <%= submit_tag '記事を取り消す' %>
+<% end -%>
+<!-- 熟語単体表示のはてダ -->
diff --git a/app/views/hateda/index.rhtml b/app/views/hateda/index.rhtml
new file mode 100644 (file)
index 0000000..7b6af0e
--- /dev/null
@@ -0,0 +1,65 @@
+<!-- はてダアップロード -->
+<div class="result"><%= flash[:result] %></div>
+<% if HatedaIndex.section -%>
+<h1>章</h1>
+  <% form_tag({:controller => '/hateda', :action => :upload_section_index}) do -%>
+    <%= submit_tag 'はてなダイアリーに章目次をアップロードする' %>
+  <% end -%>
+  <% form_tag({:controller => '/hateda', :action => :remove_section_index}) do -%>
+    <%= submit_tag 'はてなダイアリーに投稿された章目次を取り消す' %>
+  <% end -%>
+  <% form_tag({:controller => '/hateda', :action => :remove_section_all}) do -%>
+    <%= submit_tag 'はてなダイアリーに投稿されたすべての章を取り消す' %>
+  <% end -%>
+  ※dbが壊れて記事を制御できなくなったときの復旧手段
+  <% form_tag({:controller => '/hateda', :action => :sync_section_index}) do -%>
+    <%= submit_tag 'はてなダイアリーの目次から章のエントリIDを復旧する' %>
+  <% end -%>
+<h1>文字</h1>
+  <% form_tag({:controller => '/hateda', :action => :upload_letter_index}) do -%>
+    <%= submit_tag 'はてなダイアリーに文字目次をアップロードする' %>
+  <% end -%>
+  <% form_tag({:controller => '/hateda', :action => :remove_letter_index}) do -%>
+    <%= submit_tag 'はてなダイアリーに投稿された文字目次を取り消す' %>
+  <% end -%>
+  <% form_tag({:controller => '/hateda', :action => :remove_letter_all}) do -%>
+    <%= submit_tag 'はてなダイアリーに投稿されたすべての文字を取り消す' %>
+  <% end -%>
+  ※dbが壊れて記事を制御できなくなったときの復旧手段
+  <% form_tag({:controller => '/hateda', :action => :sync_letter_index}) do -%>
+    <%= submit_tag 'はてなダイアリーの目次から文字のエントリIDを復旧する' %>
+  <% end -%>
+<h1>熟語</h1>
+  <% form_tag({:controller => '/hateda', :action => :upload_word_index}) do -%>
+    <%= submit_tag 'はてなダイアリーに熟語目次をアップロードする' %>
+  <% end -%>
+  <% form_tag({:controller => '/hateda', :action => :remove_word_index}) do -%>
+    <%= submit_tag 'はてなダイアリーに投稿された熟語目次を取り消す' %>
+  <% end -%>
+  <% form_tag({:controller => '/hateda', :action => :remove_word_all}) do -%>
+    <%= submit_tag 'はてなダイアリーに投稿されたすべての熟語を取り消す' %>
+  <% end -%>
+  ※dbが壊れて記事を制御できなくなったときの復旧手段
+  <% form_tag({:controller => '/hateda', :action => :sync_word_index}) do -%>
+    <%= submit_tag 'はてなダイアリーの目次から熟語のエントリIDを復旧する' %>
+  <% end -%>
+<h1>テーマ</h1>
+  <% form_tag({:controller => '/hateda', :action => :upload_thema_index}) do -%>
+    <%= submit_tag 'はてなダイアリーにテーマ目次をアップロードする' %>
+  <% end -%>
+  <% form_tag({:controller => '/hateda', :action => :remove_thema_index}) do -%>
+    <%= submit_tag 'はてなダイアリーに投稿されたテーマ目次を取り消す' %>
+  <% end -%>
+  <% form_tag({:controller => '/hateda', :action => :remove_thema_all}) do -%>
+    <%= submit_tag 'はてなダイアリーに投稿されたすべてのテーマを取り消す' %>
+  <% end -%>
+  ※dbが壊れて記事を制御できなくなったときの復旧手段
+  <% form_tag({:controller => '/hateda', :action => :sync_thema_index}) do -%>
+    <%= submit_tag 'はてなダイアリーの目次からテーマのエントリIDを復旧する' %>
+  <% end -%>
+<% else -%>
+  <% form_tag({:controller => '/hateda', :action => :create_index}) do -%>
+    <%= submit_tag '目次基礎情報を生成する' %>
+  <% end -%>
+<% end -%>
+<!-- はてダアップロード -->
diff --git a/app/views/hateda/letter_list.rhtml b/app/views/hateda/letter_list.rhtml
new file mode 100644 (file)
index 0000000..ffabc41
--- /dev/null
@@ -0,0 +1,39 @@
+<!-- 文字リスト -->
+<%= render :partial => '/hateda/letter_filter' %>
+<h2>文字 一覧</h2>
+<%= render :partial => 'list_navi', 
+  :locals => {:items => @letters, :paginate => @paginate, :page => @page, 
+    :per_page => 20, :per_paginate => 9
+  } 
+-%>
+<% form_tag :controller => '/hateda', :action => :upload_letters do -%>
+  <%= submit_tag "チェックされたものをアップロードする" %>
+  <table class="letters">
+  <th>文字</th><th>読み</th><th>概要</th><th>数</th>
+  <tbody>
+  <% @letters.each do |letter| -%>
+    <tr>
+      <td>
+        <%= check_box_tag('checks[]', letter.id, letter.modify?) %>
+      </td>
+      <td><%= link_to(h(letter.letter), :controller => '/letter', :action => :show, :id => letter.id) %></td>
+      <td><%= h(letter.yomi) %></td>
+      <td><%= enlink(letter.desc) %></td>
+      <td><%= h letter.count %></td>
+      <td>
+        <%= h letter.update_time %>に更新
+        <%= h letter.hateda_letter.upload_time %>に投稿
+      </td>
+    </tr>
+  <% end -%>
+  </tbody>
+  </table>
+  <%= submit_tag "チェックされたものをアップロードする" %>
+<% end -%>
+<%= render :partial => 'list_navi', 
+  :locals => {:items => @letters, :paginate => @paginate, :page => @page, 
+    :per_page => 20, :per_paginate => 9
+  } 
+-%>
+<%= render :partial => '/hateda/letter_filter' %>
+<!-- /文字リスト -->
diff --git a/app/views/hateda/section_list.rhtml b/app/views/hateda/section_list.rhtml
new file mode 100644 (file)
index 0000000..4075206
--- /dev/null
@@ -0,0 +1,32 @@
+<!-- 概要リスト -->
+<%= render :partial => '/hateda/section_filter', :layout => false %>
+<h2>道徳経 一覧</h2>
+<% form_tag :controller => '/hateda', :action => :upload_sections do -%>
+  <%= submit_tag "チェックされたものをアップロードする" %>
+  <table class="sections">
+  <% @sections.each do |s| -%>
+    <tr class="section">
+      <td>
+        <%= check_box_tag('checks[]', s.num, s.modify?) %>
+      </td>
+      <td><%= link_to(h(s.caption), :controller => '/section', :action => :show, :id => s.id) %></td>
+      <td>
+        <div><%= hrb s.desc %></div>
+        <% s.thema_sections.each do |ts| -%>
+          <div>
+            <%= link_to(h(ts.thema.caption), :controller => '/thema', :action => :show, :id => ts.thema.id) -%>
+          </div>
+        <% end -%>
+        <div><%= h s.intro %></div>
+        <div>
+          <%= h s.update_time %>に更新
+          <%= h s.hateda_section.upload_time %>に投稿
+        </div>
+      </td>
+    </tr>
+  <% end -%>
+  </table>
+  <%= submit_tag "チェックされたものをアップロードする" %>
+<% end -%>
+<%= render :partial => '/hateda/section_filter', :layout => false %>
+<!-- /概要リスト -->
diff --git a/app/views/hateda/thema_list.rhtml b/app/views/hateda/thema_list.rhtml
new file mode 100644 (file)
index 0000000..af624f3
--- /dev/null
@@ -0,0 +1,34 @@
+<!-- テーマリスト -->
+<%= render :partial => '/hateda/thema_filter' %>
+<h2>テーマ 一覧</h2>
+<% form_tag :controller => '/hateda', :action => :upload_themas do -%>
+  <%= submit_tag "チェックされたものをアップロードする" %>
+  <table class="themas">
+  <% @themas.each do |thema| -%>
+    <tr class="thema">
+      <td>
+        <%= check_box_tag('checks[]', thema.id, thema.modify?) %>
+      </td>
+      <td>
+        <%= link_to(h(thema.caption), :controller => '/thema', :action => :show, :id => thema.id) %>
+      </td>
+      <td><%= enlink(thema.desc) %></td>
+      <td>
+        <% Section.find(:all, :include => :thema_sections, 
+          :conditions => ['thema_sections.thema_id = ?', thema.id], 
+          :order => 'sections.num'
+        ).each do |section| %>
+          <%= link_to(h(section.caption), :controller => '/section', :action => :show, :id => section.id) %>
+        <% end -%>
+        <div>
+          <%= h thema.update_time %>に更新
+          <%= h thema.hateda_thema.upload_time %>に投稿
+        </div>
+      </td>
+    </tr>
+  <% end -%>
+  </table>
+  <%= submit_tag "チェックされたものをアップロードする" %>
+<% end -%>
+<%= render :partial => '/hateda/thema_filter' %>
+<!-- /テーマリスト -->
diff --git a/app/views/hateda/word_list.rhtml b/app/views/hateda/word_list.rhtml
new file mode 100644 (file)
index 0000000..9c70f29
--- /dev/null
@@ -0,0 +1,43 @@
+<!-- 熟語リスト -->
+<%= render :partial => '/hateda/word_filter' %>
+<h2>熟語 一覧</h2>
+<% if @paginate -%>
+<%= render :partial => 'list_navi', 
+  :locals => {:items => @words, :paginate => @paginate, :page => @page, 
+    :per_page => 20, :per_paginate => 9
+  } 
+-%>
+<% end -%>
+<% form_tag :controller => '/hateda', :action => :upload_words do -%>
+  <%= submit_tag "チェックされたものをアップロードする" %>
+  <table class="words">
+  <th>熟語</th><th>読み</th><th>概要</th><th>数</th>
+  <tbody>
+  <% @words.each do |word| -%>
+    <tr>
+      <td>
+        <%= check_box_tag('checks[]', word.id, word.modify?) %>
+      </td>
+      <td><%= link_to(h(word.letter), :controller => '/words', :action => :show, :id => word.id) %></td>
+      <td><%= h(word.yomi) %></td>
+      <td><%= enlink(word.desc) %></td>
+      <td><%= word.count %></td>
+      <td>
+        <%= h word.update_time %>に更新
+        <%= h word.hateda_word.upload_time %>に投稿
+      </td>
+    </tr>
+  <% end -%>
+  </tbody>
+  </table>
+  <%= submit_tag "チェックされたものをアップロードする" %>
+<% end -%>
+<% if @paginate -%>
+<%= render :partial => 'list_navi', 
+  :locals => {:items => @words, :paginate => @paginate, :page => @page, 
+    :per_page => 20, :per_paginate => 9
+  } 
+-%>
+<% end -%>
+<%= render :partial => '/hateda/word_filter' %>
+<!-- /熟語リスト -->
diff --git a/app/views/layouts/default.rhtml b/app/views/layouts/default.rhtml
new file mode 100644 (file)
index 0000000..a33f96f
--- /dev/null
@@ -0,0 +1,40 @@
+<html>
+<head>
+  <!-- 老子道徳経 -->
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+  <title>lao</title>
+  <%= stylesheet_link_tag 'default' %>
+  <%= stylesheet_link_tag params[:controller].to_s.gsub('/', '') %>
+</head>
+<body>
+  <div class="main">
+    <h2>
+      <%= link_to('トップへ', :controller => '/') %>
+      <%= link_to('章一覧', :controller => '/section', :action => :list) %>
+      <%= link_to('文字一覧', :controller => '/letter', :action => :list) %>
+      <%= link_to('熟語一覧', :controller => '/words', :action => :list) %>
+      <%= link_to('テーマ一覧', :controller => '/thema', :action => :list) %>
+    </h2>
+    <%= @content_for_layout %>
+  </div>
+  <% if @user == nil or @pass = nil -%>
+    <% form_tag({:controller => '/hateda', :action => :login}) do -%>
+      はてなID<%= text_field_tag 'hatena_id', '', :size => 13 %>
+      はてなパスワード<%= password_field_tag 'hatena_password', '', :size => 13 %>
+      <%= submit_tag 'login' %>
+    <% end -%>
+  <% else -%>
+    <% form_tag({:controller => '/hateda', :action => :logout}) do -%>
+      <%= @user %>
+      <%= submit_tag 'logout' %>
+    <% end -%>
+  <% end -%>
+    <h2>
+      <%= link_to('トップへ', :controller => '/') %>
+      <%= link_to('章一覧', :controller => '/section', :action => :list) %>
+      <%= link_to('文字一覧', :controller => '/letter', :action => :list) %>
+      <%= link_to('熟語一覧', :controller => '/words', :action => :list) %>
+      <%= link_to('テーマ一覧', :controller => '/thema', :action => :list) %>
+    </h2>
+</body>
+</html>
diff --git a/app/views/letter/_list_navi.rhtml b/app/views/letter/_list_navi.rhtml
new file mode 100644 (file)
index 0000000..d6bb755
--- /dev/null
@@ -0,0 +1,40 @@
+<!-- リストのページ移動 -->
+<div class="paginator">
+  <% form_tag({:controller => '/letter', :action => :list}) do -%>
+  <%= paginate.item_count -%> 件中 <%= (page-1)*per_page+1 -%> 件目から <%= items.size -%> 件を表示 
+  <% if paginate.page_count > 1 -%>
+    <%= 
+      link_to(h("<<前の#{per_page}件"), 
+        :controller => '/letter', :action => :list, :page => page-1
+      ) if page > 1
+    -%>
+    <% pg = 
+      if page <= (per_paginate-1)/2
+        1
+      elsif page > paginate.page_count - (per_paginate - 1)/2
+        paginate.page_count - per_paginate+1
+      else
+        page - (per_paginate - 1)/2
+      end
+    -%>
+    <% per_paginate.times do -%>
+      <% if paginate.has_page_number?(pg) -%>
+        <%= 
+          link_to_unless(pg == page, pg, 
+            :controller => '/letter', :action => :list, :page => pg
+          )
+         -%>
+      <%  end -%>
+      <% pg += 1 -%>
+    <% end -%>
+    <%= 
+      link_to(h("次の#{per_page}件>>"), 
+        :controller => '/letter', :action => :list, :page => page+1
+      ) if page < paginate.page_count
+    -%>
+  <% end -%>
+    <%= text_field_tag(:search, @search, :size => 8) %>
+    <%= submit_tag '検索' %>
+  <% end -%>
+</div>
+<!-- /リストのページ移動 -->
diff --git a/app/views/letter/edit.rhtml b/app/views/letter/edit.rhtml
new file mode 100644 (file)
index 0000000..31db764
--- /dev/null
@@ -0,0 +1,27 @@
+<!-- 単体表示 -->
+<h2><%= link_to(h(@letter.letter), :controller => '/letter', :action => :show, :id => @letter.id) %></h2>
+<span><%= h(@section_count) %></span>/<span><%= h(@section_sum) %></span>回
+<div class="show">
+  <% form_tag :action => 'update', :id => @letter.id do %>
+    <%= error_messages_for 'letter' %>
+    <h2>読み</h2>
+    <div class="yomi">
+      <%= text_field(:letter, :yomi, :size => 20) %>
+    </div>
+    <h2>解説</h2>
+    <div class="content">
+      <%= text_area(:letter, :detail) %>
+    </div>
+    <%= submit_tag '更新' %>
+  <% end %>
+  <h2>登場する章</h2>
+  <div class="section-list">
+    <% @sections.each do |section| -%>
+      <span><%= link_to(h(section.caption), :controller => '/section', :action => :show, :id => section.id) %></span>
+    <% end -%>
+  </div>
+  <div>
+    <%= link_to(h('文字一覧へ'), :controller => '/letter', :action => :list) %>
+  </div>
+</div>
+<!-- /単体表示 -->
diff --git a/app/views/letter/list.rhtml b/app/views/letter/list.rhtml
new file mode 100644 (file)
index 0000000..a07a88b
--- /dev/null
@@ -0,0 +1,26 @@
+<!-- 文字リスト -->
+<h2>文字 一覧</h2>
+<%= render :partial => 'list_navi', 
+  :locals => {:items => @letters, :paginate => @paginate, :page => @page, 
+    :per_page => 20, :per_paginate => 9
+  } 
+-%>
+<table class="letters">
+<th>文字</th><th>読み</th><th>概要</th><th>数</th>
+<tbody>
+<% @letters.each do |letter| -%>
+  <tr>
+    <td><%= link_to(h(letter.letter), :controller => '/letter', :action => :show, :id => letter.id) %></td>
+    <td><%= h(letter.yomi) %></td>
+    <td><%= enlink(letter.desc) %></td>
+    <td><%= h letter.count %></td>
+  </tr>
+<% end -%>
+</tbody>
+</table>
+<%= render :partial => 'list_navi', 
+  :locals => {:items => @letters, :paginate => @paginate, :page => @page, 
+    :per_page => 20, :per_paginate => 9
+  } 
+-%>
+<!-- /文字リスト -->
diff --git a/app/views/letter/show.rhtml b/app/views/letter/show.rhtml
new file mode 100644 (file)
index 0000000..0363a36
--- /dev/null
@@ -0,0 +1,34 @@
+<!-- 単体表示 -->
+<h1><%= link_to(h(@letter.letter), :controller => '/letter', :action => :show, :id => @letter.id) %></h1>
+<div class="show">
+  <h2>文字</h2>
+  <div class="letter">
+    <%= h(@letter.letter) %>
+  </div>
+  <h2>読み</h2>
+  <div class="yomi">
+    <%= simple_format(@letter.disp_yomi) %>
+  </div>
+  <h2>解説</h2>
+  <div class="content">
+    <%= simple_format(enlink(@letter.disp_detail)) %>
+  </div>
+  <%= link_to('編集ページへ', :controller => '/letter', :action => :edit, :id => @letter.id) %>
+  <% if @user -%>
+    <%= render :partial => '/hateda/letter_show' %>
+  <% end -%>
+  <h2>登場する章</h2>
+  <div class="section-list">
+    <div><%= h(@section_count) %>個の章に出現、総登場回数<%= h(@section_sum) %>回。</div>
+    <% @sections.each do |section| -%>
+      <span><%= link_to(h(section.caption), :controller => '/section', :action => :show, :id => section.id) %></span>
+    <% end -%>
+  </div>
+  <h2>もっと詳しく</h2>
+  <div class="more">
+    <p><%= content_tag(:a, h(@letter.letter+'をGoogle検索'), :href => "http://www.google.co.jp/search?hl=ja&q=#{CGI.escape(@letter.letter)}&lr=lang_ja") %></p>
+    <p><%= content_tag(:a, h(@letter.letter+'をコトバンクで検索'), :href => "http://kotobank.jp/word/#{CGI.escape(@letter.letter)}") %></p>
+    <p><%= content_tag(:a, h(@letter.letter+'をweblioで検索'), :href => "http://www.weblio.jp/content/#{CGI.escape(@letter.letter)}") %></p>
+  </div>
+</div>
+<!-- /単体表示 -->
diff --git a/app/views/section/_navi.rhtml b/app/views/section/_navi.rhtml
new file mode 100644 (file)
index 0000000..48f21a4
--- /dev/null
@@ -0,0 +1,20 @@
+<!-- 単体表示のページ移動 -->
+<div class="paginator">
+  <% if item.num > 1 -%>
+    <%= 
+      link_to(h("<<前の章"), 
+        :controller => '/section', :action => :show, :id => Section.find_num(item.num - 1).id
+      )
+    -%>
+  <% end -%>
+  <%= link_to(h(item.caption), :controller => '/section', :action => :show, :id => item.id) -%>
+  (<%= hrb item.desc -%>)
+  <% if item.num < Section.count.to_i -%>
+    <%= 
+      link_to(h("次の章>>"), 
+        :controller => '/section', :action => :show, :id => Section.find_num(item.num + 1).id
+      )
+    -%>
+  <% end -%>
+</div>
+<!-- /単体表示のページ移動 -->
diff --git a/app/views/section/edit.rhtml b/app/views/section/edit.rhtml
new file mode 100644 (file)
index 0000000..a810223
--- /dev/null
@@ -0,0 +1,48 @@
+<!-- 章編集 -->
+<h2>
+  <%= render :partial => 'navi', 
+    :locals => {:item => @section} 
+  -%>
+</h2>
+<% form_tag :action => 'update', :id => @section.id do %>
+<%= error_messages_for 'section' %>
+<%= submit_tag '更新' %>
+  <table>
+  <tr>
+  <td>
+    <h3>原文</h3>
+    <div class="source">
+      <%= text_area(:section, :source, {:rows => 6, :cols => 60}) %>
+    </div>
+    <h3>読み下し文</h3>
+    <div class="japanese">
+      <%= text_area(:section, :japanese, {:rows => 8, :cols => 60}) %>
+    </div>
+    <h3>解釈</h3>
+    <div class="myself">
+      <%= text_area(:section, :myself, {:rows => 8, :cols => 60}) %>
+    </div>
+    <h3>超解釈</h3>
+    <div class="etc">
+      <%= text_field(:section, :etc, :size => 60) %>
+    </div>
+    <h3>参考解釈</h3>
+    <div class="trans">
+      <%= text_area(:section, :trans, {:rows => 8, :cols => 60}) %>
+    </div>
+    <h3>参考英訳</h3>
+    <div class="english">
+      <%= text_area(:section, :english, {:rows => 8, :cols => 60}) %>
+    </div>
+  </td>
+  <td>
+    <h3>備考</h3>
+    <div class="note">
+      <%= text_area(:section, :note, {:rows => 20, :cols => 25}) %>
+    </div>
+  </td>
+  </tr>
+  </table>
+  <%= submit_tag '更新' %>
+<% end %>
+<!-- /章編集 -->
diff --git a/app/views/section/index.rhtml b/app/views/section/index.rhtml
new file mode 100644 (file)
index 0000000..7c11cf0
--- /dev/null
@@ -0,0 +1,75 @@
+<!-- トップページ -->
+  <table class="block">
+    <tr>
+      <td>
+        <p class="menu"><%= link_to(h('章一覧'), :controller => '/section', :action => :list) %></p>
+      </td>
+      <td>
+        <%= h flash[:error] %>
+        <% form_tag({:controller => '/section', :action => :import}, {:multipart => true}) do %>
+          <p>ソースファイルを選択してください。</p>
+          <div><%= file_field(:browse, :file, :size => 20) %></div>
+          <div><%= submit_tag 'インポート' %></div>
+        <% end %>
+        <p class="export"><%= link_to(h('エクスポート'), :controller => '/section', :action => :export) %></p>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <p class="menu"><%= link_to(h('文字一覧'), :controller => '/letter', :action => :list) %></p>
+        <div>文字種類数<%= h(@letter_count) %></div>
+        <div>文字総数<%= h(@letter_sum) %></div>
+      </td>
+      <td>
+        <%= h flash[:error] %>
+        <% form_tag({:controller => '/letter', :action => :import}, {:multipart => true}) do %>
+          <p>ソースファイルを選択してください。</p>
+          <div><%= file_field(:browse, :file, :size => 20) %></div>
+          <div><%= submit_tag 'インポート' %></div>
+        <% end %>
+        <p class="export"><%= link_to(h('エクスポート'), :controller => '/letter', :action => :export) %></p>
+        
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <p class="menu"><%= link_to(h('熟語一覧'), :controller => '/words', :action => :list) %></p>
+        <div>熟語種類数<%= h(@word_count) %></div>
+        <div>熟語総数<%= h(@word_sum) %></div>
+      </td>
+      <td>
+        <%= h flash[:error] %>
+        <% form_tag({:controller => '/words', :action => :import}, {:multipart => true}) do %>
+          <p>ソースファイルを選択してください。</p>
+          <div><%= file_field(:browse, :file, :size => 20) %></div>
+          <div><%= submit_tag 'インポート' %></div>
+        <% end %>
+        <p class="export"><%= link_to(h('エクスポート'), :controller => '/words', :action => :export) %></p>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <p class="menu"><%= link_to(h('テーマ一覧'), :controller => '/thema', :action => :list) %></p>
+      </td>
+      <td>
+        <%= h flash[:error] %>
+        <% form_tag({:controller => '/thema', :action => :import}, {:multipart => true}) do %>
+          <p>ソースファイルを選択してください。</p>
+          <div><%= file_field(:browse, :file, :size => 20) %></div>
+          <div><%= submit_tag 'インポート' %></div>
+        <% end %>
+        <p class="export"><%= link_to(h('エクスポート'), :controller => '/thema', :action => :export) %></p>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <p class="menu"><%= link_to(h('ざっくり一覧'), :controller => '/section', :action => :tiny) %></p>
+      </td>
+      <td>
+      </td>
+    </tr>
+  </table>
+  <% if @user %>
+    <%= link_to(h('はてなダイアリー'), :controller => '/hateda', :action => :index) %>
+  <% end %>
+<!-- /トップページ -->
diff --git a/app/views/section/list.rhtml b/app/views/section/list.rhtml
new file mode 100644 (file)
index 0000000..0df42f6
--- /dev/null
@@ -0,0 +1,19 @@
+<!-- 概要リスト -->
+<h2>道徳経 一覧</h2>
+<table class="sections">
+<% @sections.each do |s| -%>
+  <tr class="section">
+    <td><%= link_to(h(s.caption), :controller => '/section', :action => :show, :id => s.id) %></td>
+    <td>
+      <div><%= hrb(s.desc) %></div>
+      <% s.thema_sections.each do |ts| -%>
+        <div>
+          <%= link_to(h(ts.thema.caption), :controller => '/thema', :action => :show, :id => ts.thema.id) -%>
+        </div>
+      <% end -%>
+      <div><%= h s.intro %></div>
+    </td>
+  </tr>
+<% end -%>
+</table>
+<!-- /概要リスト -->
diff --git a/app/views/section/show.rhtml b/app/views/section/show.rhtml
new file mode 100644 (file)
index 0000000..7970241
--- /dev/null
@@ -0,0 +1,160 @@
+<!-- 章単体表示 -->
+<h2>
+  <%= render :partial => 'navi', 
+    :locals => {:item => @section} 
+  -%>
+</h2>
+<table>
+<tr>
+<td width="80%">
+  <div class="show">
+    <div>
+      <%= link_to(h('編集へ'), :action => :edit, :id => @section.id) %>
+    </div>
+    <h3>原文</h3>
+    <div class="source">
+      <%= simple_format(@section.disp_source) %>
+    </div>
+    <h3>読み下し文</h3>
+    <div class="japanese">
+      <%= srb(@section.disp_japanese) %>
+    </div>
+    <h3>解釈</h3>
+    <div class="myself">
+      <%= simple_format(@section.disp_myself) %>
+    </div>
+    <h3>備考</h3>
+    <div class="note">
+      <%= simple_format(ennote(enlink(@section.disp_note))) %>
+    </div>
+    <h3>超解釈</h3>
+    <div class="etc">
+      <%= h(@section.etc) %>
+    </div>
+    <h3>テーマ</h3>
+    <div class="thema-list">
+      <% @sec_themas.each do |st| -%>
+        <span>
+          <%= link_to(h(st.thema.caption), 
+            :controller => '/thema', :action => :show, :id => st.thema.id
+          ) %>
+        </span>
+      <% end -%>
+      <% form_tag :controller => '/section', :action => :link_thema, :id => @section.id do -%>
+        <%= select 'thema_section', 'thema_id', @themas %>
+        <%= submit_tag "この章と関連付ける" %>
+      <% end -%>
+      <% form_tag :controller => '/thema', :action => 'create', :id => @section.id do -%>
+        <%= text_field 'thema', 'caption', :size => 40 %>
+        <%= submit_tag "テーマを新規登録" %>
+      <% end -%>
+    </div>
+    <h3>ヒント</h3>
+    <div class="hint">
+      <% @hint_letters.each do |hl| -%>
+        <div>
+          <%= link_to(h(hl.letter.letter), 
+            :controller => '/letter', :action => :show, :id => hl.letter.id
+          ) %>
+          (<%= h(hl.letter.yomi) %>)
+        </div>
+        <div class="hint-letter">
+          <%= simple_format(enlink(hl.letter.disp_detail)) %>
+        </div>
+      <% end -%>
+      <% @hint_words.each do |hw| -%>
+        <div>
+          <%= link_to(h(hw.word.letter), 
+            :controller => '/words', :action => :show, :id => hw.word.id
+          ) %>
+          (<%= h(hw.word.yomi) %>)
+        </div>
+        <div class="hint-word">
+          <%= simple_format(enlink(hw.word.disp_detail)) %>
+        </div>
+      <% end -%>
+    </div>
+    <div class="edit">
+      <%= link_to(h('編集へ'), :action => :edit, :id => @section.id) %>
+    </div>
+    <% if @user -%>
+      <%= render :partial => '/hateda/section_show' %>
+    <% end -%>
+    <h3>参考解釈</h3>
+    <div class="trans">
+      <%= h(@section.trans) %>
+    </div>
+    <h3>参考英訳</h3>
+    <div class="english">
+      <%= h(@section.english) %>
+    </div>
+  </div>
+</td>
+<td width="10%">
+  <h3>熟語登録</h3>
+  <% form_tag :controller => '/words', :action => 'create' do -%>
+    <%= text_field 'word', 'letter', :size => 8 %>
+    <%= submit_tag "登録" %>
+  <% end -%>
+  <h3>出現熟語</h3>
+  <div>
+    <%= h(@word_count) %>種/
+    <%= h(@word_sum) %>語
+  </div>
+  <% form_tag :controller => '/section', :action => :word_checks, :id => @section.id do -%>
+    <% if @sec_words.empty? -%>
+    <% else -%>
+      <%= submit_tag "更新" %>
+      <div class="word-list">
+        <% @sec_words.each do |sw| -%>
+          <div>
+          <span>
+            <%= link_to(h(sw.word.letter), 
+              {:controller => '/words', :action => :show, :id => sw.word.id}, 
+              {:class => (sw.chk == 0 ? 'unchecked' : 'checked')}
+            ) %>
+          </span>
+          <span><%= check_box_tag(sw.id, '1', sw.bchk) %></span>
+          </div>
+        <% end -%>
+      </div>
+      <%= submit_tag "更新" %>
+    <% end -%>
+  <% end -%>
+</td>
+<td>
+  <h3>出現文字</h3>
+  <div>
+    <%= h(@letter_count) %>種/
+    <%= h(@letter_sum) %>語
+  </div>
+  <% form_tag :controller => '/section', :action => :letter_checks, :id => @section.id do -%>
+    <% if @sec_letters.empty? -%>
+    <% else -%>
+      <%= submit_tag "更新" %>
+      <div class="letter-list">
+        <% @sec_letters.each do |sl| -%>
+          <div>
+          <span>
+            <%= link_to(h(sl.letter.letter), 
+              {:controller => '/letter', :action => :show, :id => sl.letter.id}, 
+              {:class => (sl.chk == 0 ? 'unchecked' : 'checked')}
+            ) %>
+          </span>
+          <span><%= check_box_tag(sl.id, '1', sl.bchk) %></span>
+          </div>
+        <% end -%>
+      </div>
+      <%= submit_tag "更新" %>
+    <% end -%>
+  <% end -%>
+</td>
+</tr>
+</table>
+<h2>
+  <%= render :partial => 'navi', 
+    :locals => {:item => @section} 
+  -%>
+</h2>
+<!-- /章単体表示 -->
diff --git a/app/views/section/tiny.rhtml b/app/views/section/tiny.rhtml
new file mode 100644 (file)
index 0000000..f0d1b86
--- /dev/null
@@ -0,0 +1,11 @@
+<!-- ざっくりリスト -->
+<h2>ざっくり 一覧</h2>
+<table class="sections">
+<% @sections.each do |s| -%>
+  <tr class="section">
+    <td><%= link_to(h(s.caption), :controller => '/section', :action => :show, :id => s.id) %></td>
+    <td><%= h s.etc %></td>
+  </tr>
+<% end -%>
+</table>
+<!-- /ざっくりリスト -->
diff --git a/app/views/thema/edit.rhtml b/app/views/thema/edit.rhtml
new file mode 100644 (file)
index 0000000..ef12a53
--- /dev/null
@@ -0,0 +1,50 @@
+<!-- テーマ編集 -->
+<h2><%= link_to(h(@thema.caption), :controller => '/thema', :action => :show, :id => @thema.id) %></h2>
+<span><%= h(flash[:notice]) %></span>
+<table>
+<tr>
+<td width="80%">
+  <div class="show">
+    <% form_tag :action => 'update', :id => @thema.id do %>
+      <%= error_messages_for 'thema' %>
+      <h2>テーマ</h2>
+      <div class="caption">
+        <%= text_field(:thema, :caption, :size => 30) %>
+      </div>
+      <h2>解説</h2>
+      <div class="content">
+        <%= text_area(:thema, :detail) %>
+      </div>
+      <%= submit_tag '内容を更新する' %>
+    <% end %>
+  </div>
+  <% form_tag :action => :destroy, :id => @thema.id do %>
+    <%= submit_tag 'このテーマを削除する' %>
+  <% end %>
+</td>
+<td>
+  <h2>関連する章</h2>
+  <div class="section-list">
+    <% form_tag :controller => '/thema', :action => :unlink_thema, :id => @thema.id do -%>
+      <% if @sections.empty? -%>
+      <% else -%>
+        <%= submit_tag "関連をはずす" %>
+        <% @sections.each do |section| -%>
+          <div>
+            <span>
+              <%= link_to(h(section.caption), :controller => '/section', :action => :show, :id => section.id) %>
+            </span>
+            <span><%= check_box_tag(section.id, '1') %></span>
+          </div>
+        <% end -%>
+        <%= submit_tag "関連をはずす" %>
+      <% end -%>
+    <% end -%>
+  </div>
+</td>
+</tr>
+</table>
+<div>
+  <%= link_to(h('テーマ一覧へ'), :controller => '/thema', :action => :list) %>
+</div>
+<!-- /テーマ編集 -->
diff --git a/app/views/thema/list.rhtml b/app/views/thema/list.rhtml
new file mode 100644 (file)
index 0000000..20f5e98
--- /dev/null
@@ -0,0 +1,21 @@
+<!-- テーマリスト -->
+<h2>テーマ 一覧</h2>
+<table class="themas">
+<% @themas.each do |thema| -%>
+  <tr class="thema">
+    <td width="25%">
+      <%= link_to(h(thema.caption), :controller => '/thema', :action => :show, :id => thema.id) %>
+    </td>
+    <td><%= enlink(thema.desc) %></td>
+    <td>
+      <% Section.find(:all, :include => :thema_sections, 
+        :conditions => ['thema_sections.thema_id = ?', thema.id], 
+        :order => 'sections.num'
+      ).each do |section| %>
+        <%= link_to(h(section.caption), :controller => '/section', :action => :show, :id => section.id) %>
+      <% end -%>
+    </td>
+  </tr>
+<% end -%>
+</table>
+<!-- /テーマリスト -->
diff --git a/app/views/thema/show.rhtml b/app/views/thema/show.rhtml
new file mode 100644 (file)
index 0000000..c3eb39d
--- /dev/null
@@ -0,0 +1,30 @@
+<!-- テーマ単体表示 -->
+<h2><%= link_to(h(@thema.caption), :controller => '/thema', :action => :show, :id => @thema.id) %></h2>
+<table>
+<tr>
+<td width="80%">
+  <div class="show">
+    <h2>テーマ</h2>
+    <div class="caption">
+      <%= h(@thema.caption) %>
+    </div>
+    <h2>解説</h2>
+    <div class="content">
+      <%= simple_format(enlink(@thema.disp_detail)) %>
+    </div>
+    <%= link_to('編集ページへ', :controller => '/thema', :action => :edit, :id => @thema.id) %>
+  </div>
+    <% if @user -%>
+      <%= render :partial => '/hateda/thema_show' %>
+    <% end -%>
+</td>
+<td>
+  <div class="section-list">
+    <% @sections.each do |section| -%>
+      <div><%= link_to(h(section.caption), :controller => '/section', :action => :show, :id => section.id) %></div>
+    <% end -%>
+  </div>
+</td>
+</tr>
+</table>
+<!-- /テーマ単体表示 -->
diff --git a/app/views/words/_form.rhtml b/app/views/words/_form.rhtml
new file mode 100644 (file)
index 0000000..6d9a411
--- /dev/null
@@ -0,0 +1,10 @@
+<%= error_messages_for 'word' %>
+
+<!--[form:word]-->
+<p><label for="word_letter">Letter</label><br/>
+<%= text_field 'word', 'letter'  %></p>
+
+<p><label for="word_detail">Detail</label><br/>
+<%= text_area 'word', 'detail'  %></p>
+<!--[eoform:word]-->
+
diff --git a/app/views/words/_list_navi.rhtml b/app/views/words/_list_navi.rhtml
new file mode 100644 (file)
index 0000000..8d12c39
--- /dev/null
@@ -0,0 +1,40 @@
+<!-- リストのページ移動 -->
+<div class="paginator">
+  <% form_tag({:controller => '/words', :action => :list}) do -%>
+  <%= paginate.item_count -%> 件中 <%= (page-1)*per_page+1 -%> 件目から <%= items.size -%> 件を表示 
+  <% if paginate.page_count > 1 -%>
+    <%= 
+      link_to(h("<<前の#{per_page}件"), 
+        :controller => '/words', :action => :list, :page => page-1
+      ) if page > 1
+    -%>
+    <% pg = 
+      if page <= (per_paginate-1)/2
+        1
+      elsif page > paginate.page_count - (per_paginate - 1)/2
+        paginate.page_count - per_paginate+1
+      else
+        page - (per_paginate - 1)/2
+      end
+    -%>
+    <% per_paginate.times do -%>
+      <% if paginate.has_page_number?(pg) -%>
+        <%= 
+          link_to_unless(pg == page, pg, 
+            :controller => '/words', :action => :list, :page => pg
+          )
+         -%>
+      <%  end -%>
+      <% pg += 1 -%>
+    <% end -%>
+    <%= 
+      link_to(h("次の#{per_page}件>>"), 
+        :controller => '/words', :action => :list, :page => page+1
+      ) if page < paginate.page_count
+    -%>
+  <% end -%>
+    <%= text_field_tag(:search, @search, :size => 8) %>
+    <%= submit_tag '検索' %>
+  <% end -%>
+</div>
+<!-- /リストのページ移動 -->
diff --git a/app/views/words/edit.rhtml b/app/views/words/edit.rhtml
new file mode 100644 (file)
index 0000000..77cc3b7
--- /dev/null
@@ -0,0 +1,30 @@
+<!-- 単体表示 -->
+<h2><%= link_to(h(@word.letter), :controller => '/words', :action => :show, :id => @word.id) %></h2>
+<span><%= h(@section_count) %></span>/<span><%= h(@section_sum) %></span>回
+<div class="show">
+  <% form_tag :action => 'update', :id => @word.id do %>
+    <%= error_messages_for 'word' %>
+    <h2>読み</h2>
+    <div class="yomi">
+      <%= text_field(:word, :yomi, :size => 20) %>
+    </div>
+    <h2>解説</h2>
+    <div class="content">
+      <%= text_area(:word, :detail) %>
+    </div>
+    <%= submit_tag '更新' %>
+  <% end %>
+  <h2>登場する章</h2>
+  <div class="section-list">
+    <% @sections.each do |section| -%>
+      <span><%= link_to(h(section.caption), :controller => '/section', :action => :show, :id => section.id) %></span>
+    <% end -%>
+  </div>
+  <% form_tag :action => :destroy, :id => @word.id do %>
+    <%= submit_tag '削除する' %>
+  <% end %>
+  <div>
+    <%= link_to(h('熟語一覧へ'), :controller => '/word', :action => :list) %>
+  </div>
+</div>
+<!-- /単体表示 -->
diff --git a/app/views/words/list.rhtml b/app/views/words/list.rhtml
new file mode 100644 (file)
index 0000000..9276c7b
--- /dev/null
@@ -0,0 +1,26 @@
+<!-- 熟語リスト -->
+<h2>熟語 一覧</h2>
+<%= render :partial => 'list_navi', 
+  :locals => {:items => @words, :paginate => @paginate, :page => @page, 
+    :per_page => 20, :per_paginate => 9
+  } 
+-%>
+<table class="words">
+<th>熟語</th><th>読み</th><th>概要</th><th>数</th>
+<tbody>
+<% @words.each do |word| %>
+  <tr>
+    <td><%= link_to(h(word.letter), :controller => '/words', :action => :show, :id => word.id) %></td>
+    <td><%= h(word.yomi) %></td>
+    <td><%= enlink(word.desc) %></td>
+    <td><%= word.count %></td>
+  </tr>
+<% end %>
+</tbody>
+</table>
+<%= render :partial => 'list_navi', 
+  :locals => {:items => @words, :paginate => @paginate, :page => @page, 
+    :per_page => 20, :per_paginate => 9
+  } 
+-%>
+<!-- /熟語リスト -->
diff --git a/app/views/words/new.rhtml b/app/views/words/new.rhtml
new file mode 100644 (file)
index 0000000..8e9d3b8
--- /dev/null
@@ -0,0 +1,8 @@
+<h1>New word</h1>
+
+<% form_tag :action => 'create' do %>
+  <%= render :partial => 'form' %>
+  <%= submit_tag "Create" %>
+<% end %>
+
+<%= link_to 'Back', :action => 'list' %>
diff --git a/app/views/words/show.rhtml b/app/views/words/show.rhtml
new file mode 100644 (file)
index 0000000..53a7fc5
--- /dev/null
@@ -0,0 +1,34 @@
+<!-- 単体表示 -->
+<h1><%= link_to(h(@word.letter), :controller => '/words', :action => :show, :id => @word.id) %></h1>
+<div class="show">
+  <h2>熟語</h2>
+  <div class="letter">
+    <%= h(@word.letter) %>
+  </div>
+  <h2>読み</h2>
+  <div class="yomi">
+    <%= h(@word.disp_yomi) %>
+  </div>
+  <h2>解説</h2>
+  <div class="content">
+    <%= simple_format(enlink(@word.disp_detail)) %>
+  </div>
+  <%= link_to('編集ページへ', :controller => '/words', :action => :edit, :id => @word.id) %>
+  <% if @user -%>
+    <%= render :partial => '/hateda/word_show' %>
+  <% end -%>
+  <h2>登場する章</h2>
+  <div class="section-list">
+    <div><%= h(@section_count) %>個の章に出現、総登場回数<%= h(@section_sum) %>回。</div>
+    <% @sections.each do |section| -%>
+      <span><%= link_to(h(section.caption), :controller => '/section', :action => :show, :id => section.id) %></span>
+    <% end -%>
+  </div>
+  <h2>もっと詳しく</h2>
+  <div class="more">
+    <p><%= content_tag(:a, h(@word.letter+'をGoogle検索'), :href => "http://www.google.co.jp/search?hl=ja&q=#{CGI.escape(@word.letter)}&lr=lang_ja") %></p>
+    <p><%= content_tag(:a, h(@word.letter+'をコトバンクで検索'), :href => "http://kotobank.jp/word/#{CGI.escape(@word.letter)}") %></p>
+    <p><%= content_tag(:a, h(@word.letter+'をweblioで検索'), :href => "http://www.weblio.jp/content/#{CGI.escape(@word.letter)}") %></p>
+  </div>
+</div>
+<!-- /単体表示 -->
diff --git a/config/boot.rb b/config/boot.rb
new file mode 100644 (file)
index 0000000..0f034f0
--- /dev/null
@@ -0,0 +1,39 @@
+# Don't change this file. Configuration is done in config/environment.rb and config/environments/*.rb
+
+RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
+
+unless defined?(Rails::Initializer)
+  if File.directory?("#{RAILS_ROOT}/vendor/rails")
+    require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
+  else
+    require 'rubygems'
+
+    rails_gem_version =
+      if defined? RAILS_GEM_VERSION
+        RAILS_GEM_VERSION
+      else
+        File.read("#{File.dirname(__FILE__)}/environment.rb") =~ /^[^#]*RAILS_GEM_VERSION\s+=\s+'([\d.]+)'/
+        $1
+      end
+
+    if rails_gem_version
+      rails_gem = Gem.cache.search('rails', "=#{rails_gem_version}.0").sort_by { |g| g.version.version }.last
+
+      if rails_gem
+        gem "rails", "=#{rails_gem.version.version}"
+        require rails_gem.full_gem_path + '/lib/initializer'
+      else
+        STDERR.puts %(Cannot find gem for Rails =#{rails_gem_version}.0:
+    Install the missing gem with 'gem install -v=#{rails_gem_version} rails', or
+    change environment.rb to define RAILS_GEM_VERSION with your desired version.
+  )
+        exit 1
+      end
+    else
+      gem "rails"
+      require 'initializer'
+    end
+  end
+
+  Rails::Initializer.run(:set_load_path)
+end
diff --git a/config/database.yml.org b/config/database.yml.org
new file mode 100644 (file)
index 0000000..b117544
--- /dev/null
@@ -0,0 +1,39 @@
+# MySQL (default setup).  Versions 4.1 and 5.0 are recommended.
+#
+# Install the MySQL driver:
+#   gem install mysql
+# On MacOS X:
+#   gem install mysql -- --include=/usr/local/lib
+# On Windows:
+#   gem install mysql
+#       Choose the win32 build.
+#       Install MySQL and put its /bin directory on your path.
+#
+# And be sure to use new-style password hashing:
+#   http://dev.mysql.com/doc/refman/5.0/en/old-client.html
+development:
+  adapter: mysql
+  database: lao_development
+  username: 
+  password:
+  host: localhost
+  encoding: utf8
+
+# Warning: The database defined as 'test' will be erased and
+# re-generated from your development database when you run 'rake'.
+# Do not set this db to the same as development or production.
+test:
+  adapter: mysql
+  database: lao_test
+  username: 
+  password:
+  host: localhost
+  encoding: utf8
+
+production:
+  adapter: mysql
+  database: lao_production
+  username: 
+  password: 
+  host: localhost
+  encoding: utf8
diff --git a/config/environment.rb b/config/environment.rb
new file mode 100644 (file)
index 0000000..ab75a0f
--- /dev/null
@@ -0,0 +1,60 @@
+# Be sure to restart your web server when you modify this file.
+
+# Uncomment below to force Rails into production mode when
+# you don't control web/app server and can't set it the proper way
+# ENV['RAILS_ENV'] ||= 'production'
+
+# Specifies gem version of Rails to use when vendor/rails is not present
+RAILS_GEM_VERSION = '1.2.6' unless defined? RAILS_GEM_VERSION
+
+# Bootstrap the Rails environment, frameworks, and default configuration
+require File.join(File.dirname(__FILE__), 'boot')
+
+Rails::Initializer.run do |config|
+  # Settings in config/environments/* take precedence over those specified here
+
+  # Skip frameworks you're not going to use (only works if using vendor/rails)
+  # config.frameworks -= [ :action_web_service, :action_mailer ]
+
+  # Only load the plugins named here, by default all plugins in vendor/plugins are loaded
+  # config.plugins = %W( exception_notification ssl_requirement )
+
+  # Add additional load paths for your own custom dirs
+  # config.load_paths += %W( #{RAILS_ROOT}/extras )
+
+  # Force all environments to use the same logger level
+  # (by default production uses :info, the others :debug)
+  # config.log_level = :debug
+
+  # Use the database for sessions instead of the file system
+  # (create the session table with 'rake db:sessions:create')
+  # config.action_controller.session_store = :active_record_store
+
+  # Use SQL instead of Active Record's schema dumper when creating the test database.
+  # This is necessary if your schema can't be completely dumped by the schema dumper,
+  # like if you have constraints or database-specific column types
+  # config.active_record.schema_format = :sql
+
+  # Activate observers that should always be running
+  # config.active_record.observers = :cacher, :garbage_collector
+
+  # Make Active Record use UTC-base instead of local time
+  # config.active_record.default_timezone = :utc
+
+  # Add new inflection rules using the following format
+  # (all these examples are active by default):
+  # Inflector.inflections do |inflect|
+  #   inflect.plural /^(ox)$/i, '\1en'
+  #   inflect.singular /^(ox)en/i, '\1'
+  #   inflect.irregular 'person', 'people'
+  #   inflect.uncountable %w( fish sheep )
+  # end
+
+  # See Rails::Configuration for more options
+end
+
+# Add new mime types for use in respond_to blocks:
+# Mime::Type.register "text/richtext", :rtf
+# Mime::Type.register "application/x-mobile", :mobile
+
+# Include your application configuration below
diff --git a/config/environments/development.rb b/config/environments/development.rb
new file mode 100644 (file)
index 0000000..0589aa9
--- /dev/null
@@ -0,0 +1,21 @@
+# Settings specified here will take precedence over those in config/environment.rb
+
+# In the development environment your application's code is reloaded on
+# every request.  This slows down response time but is perfect for development
+# since you don't have to restart the webserver when you make code changes.
+config.cache_classes = false
+
+# Log error messages when you accidentally call methods on nil.
+config.whiny_nils = true
+
+# Enable the breakpoint server that script/breakpointer connects to
+config.breakpoint_server = true
+
+# Show full error reports and disable caching
+config.action_controller.consider_all_requests_local = true
+config.action_controller.perform_caching             = false
+config.action_view.cache_template_extensions         = false
+config.action_view.debug_rjs                         = true
+
+# Don't care if the mailer can't send
+config.action_mailer.raise_delivery_errors = false
diff --git a/config/environments/production.rb b/config/environments/production.rb
new file mode 100644 (file)
index 0000000..cb295b8
--- /dev/null
@@ -0,0 +1,18 @@
+# Settings specified here will take precedence over those in config/environment.rb
+
+# The production environment is meant for finished, "live" apps.
+# Code is not reloaded between requests
+config.cache_classes = true
+
+# Use a different logger for distributed setups
+# config.logger = SyslogLogger.new
+
+# Full error reports are disabled and caching is turned on
+config.action_controller.consider_all_requests_local = false
+config.action_controller.perform_caching             = true
+
+# Enable serving of images, stylesheets, and javascripts from an asset server
+# config.action_controller.asset_host                  = "http://assets.example.com"
+
+# Disable delivery errors, bad email addresses will be ignored
+# config.action_mailer.raise_delivery_errors = false
diff --git a/config/environments/test.rb b/config/environments/test.rb
new file mode 100644 (file)
index 0000000..f0689b9
--- /dev/null
@@ -0,0 +1,19 @@
+# Settings specified here will take precedence over those in config/environment.rb
+
+# The test environment is used exclusively to run your application's
+# test suite.  You never need to work with it otherwise.  Remember that
+# your test database is "scratch space" for the test suite and is wiped
+# and recreated between test runs.  Don't rely on the data there!
+config.cache_classes = true
+
+# Log error messages when you accidentally call methods on nil.
+config.whiny_nils = true
+
+# Show full error reports and disable caching
+config.action_controller.consider_all_requests_local = true
+config.action_controller.perform_caching             = false
+
+# Tell ActionMailer not to deliver emails to the real world.
+# The :test delivery method accumulates sent emails in the
+# ActionMailer::Base.deliveries array.
+config.action_mailer.delivery_method = :test
\ No newline at end of file
diff --git a/config/routes.rb b/config/routes.rb
new file mode 100644 (file)
index 0000000..d43526d
--- /dev/null
@@ -0,0 +1,23 @@
+ActionController::Routing::Routes.draw do |map|
+  # The priority is based upon order of creation: first created -> highest priority.
+  
+  # Sample of regular route:
+  # map.connect 'products/:id', :controller => 'catalog', :action => 'view'
+  # Keep in mind you can assign values other than :controller and :action
+
+  # Sample of named route:
+  # map.purchase 'products/:id/purchase', :controller => 'catalog', :action => 'purchase'
+  # This route can be invoked with purchase_url(:id => product.id)
+
+  # You can have the root of your site routed by hooking up '' 
+  # -- just remember to delete public/index.html.
+  map.connect '', :controller => "section"
+
+  # Allow downloading Web Service WSDL as a file with an extension
+  # instead of a file named 'wsdl'
+  map.connect ':controller/service.wsdl', :action => 'wsdl'
+
+  # Install the default route as the lowest priority.
+  map.connect ':controller/:action/:id.:format'
+  map.connect ':controller/:action/:id'
+end
diff --git a/db/lao.sql b/db/lao.sql
new file mode 100644 (file)
index 0000000..77e8890
--- /dev/null
@@ -0,0 +1,371 @@
+-- MySQL dump 10.10\r
+--\r
+-- Host: localhost    Database: lao_development\r
+-- ------------------------------------------------------\r
+-- Server version      5.0.27-community\r
+\r
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\r
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;\r
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;\r
+/*!40101 SET NAMES utf8 */;\r
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;\r
+/*!40103 SET TIME_ZONE='+00:00' */;\r
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;\r
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;\r
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;\r
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;\r
+\r
+--\r
+-- Table structure for table `hateda_indices`\r
+--\r
+\r
+DROP TABLE IF EXISTS `hateda_indices`;\r
+CREATE TABLE `hateda_indices` (\r
+  `id` int(11) NOT NULL auto_increment,\r
+  `keyname` varchar(30) NOT NULL,\r
+  `name` varchar(30) default NULL,\r
+  `basedate` datetime NOT NULL,\r
+  `upload_at` datetime default NULL,\r
+  PRIMARY KEY  (`id`),\r
+  UNIQUE KEY `index_hateda_indices_on_keyname` (`keyname`)\r
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\r
+\r
+--\r
+-- Dumping data for table `hateda_indices`\r
+--\r
+\r
+LOCK TABLES `hateda_indices` WRITE;\r
+/*!40000 ALTER TABLE `hateda_indices` DISABLE KEYS */;\r
+INSERT INTO `hateda_indices` VALUES (1,'section','1306828663','2010-09-01 00:00:00',NULL),(2,'thema',NULL,'2010-01-01 00:00:00',NULL),(3,'word',NULL,'2010-09-01 00:00:00',NULL),(4,'letter',NULL,'2007-01-01 00:00:00',NULL);\r
+/*!40000 ALTER TABLE `hateda_indices` ENABLE KEYS */;\r
+UNLOCK TABLES;\r
+\r
+--\r
+-- Table structure for table `hateda_letters`\r
+--\r
+\r
+DROP TABLE IF EXISTS `hateda_letters`;\r
+CREATE TABLE `hateda_letters` (\r
+  `id` int(11) NOT NULL auto_increment,\r
+  `letter_id` int(11) NOT NULL default '0',\r
+  `name` varchar(30) default NULL,\r
+  `upload_at` datetime default NULL,\r
+  PRIMARY KEY  (`id`),\r
+  UNIQUE KEY `index_hateda_letters_on_letter_id` (`letter_id`)\r
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\r
+\r
+--\r
+-- Dumping data for table `hateda_letters`\r
+--\r
+\r
+LOCK TABLES `hateda_letters` WRITE;\r
+/*!40000 ALTER TABLE `hateda_letters` DISABLE KEYS */;\r
+INSERT INTO `hateda_letters` VALUES (1,1,'20060201/1138719600','2011-09-28 18:14:24'),(2,2,'20060202/1138806000','2011-09-28 18:14:32'),(3,3,'20060203/1138892400','2011-09-28 18:14:37'),(4,4,'20060204/1138978800','2011-09-28 18:14:44'),(5,5,'20060205/1139065200','2011-09-28 18:14:50'),(6,6,'20060206/1139151600','2011-09-28 18:14:56'),(7,7,'20060207/1139238000','2011-09-28 18:15:14'),(8,8,'20060208/1139324400','2011-09-28 18:15:19'),(9,9,'20060209/1139410800','2011-09-28 18:15:36'),(10,10,'20060210/1139497200','2011-09-28 18:15:40'),(11,11,'20060211/1139583600','2011-09-28 18:15:48'),(12,12,'20060212/1139670000','2011-09-28 18:15:53'),(13,13,'20060213/1139756400','2011-09-28 18:15:59'),(14,14,'20060214/1139842800','2011-09-28 18:16:03'),(15,15,'20060215/1139929200','2011-09-28 18:16:13'),(16,16,'20060216/1140015600','2011-09-28 18:16:18'),(17,17,'20060217/1140102000','2011-09-28 18:16:28'),(18,18,'20060218/1140188400','2011-09-28 18:16:32'),(19,19,'20060219/1140274800','2011-09-28 18:16:51'),(20,20,'20060220/1140361200','2011-09-28 18:16:55'),(21,21,'20060221/1140447600','2011-09-28 18:16:58'),(22,22,'20060222/1140534000','2011-09-28 18:17:03'),(23,23,'20060223/1140620400','2011-09-28 18:17:06'),(24,24,'20060224/1140706800','2011-09-28 18:17:16'),(25,25,'20060225/1140793200','2011-09-28 18:17:26'),(26,26,'20060226/1140879600','2011-09-28 18:17:30'),(27,27,'20060227/1140966000','2011-09-28 18:17:44'),(28,28,'20060228/1141052400','2011-09-28 18:17:47'),(29,29,'20060301/1141138800','2011-09-28 18:17:55'),(30,30,'20060302/1141225200','2011-09-28 18:18:02'),(31,31,'20060303/1141311600','2011-09-28 18:18:09'),(32,32,'20060304/1141398000','2011-09-28 18:18:14'),(33,33,'20060305/1141484400','2011-09-28 18:18:18'),(34,34,'20060306/1141570800','2011-09-28 18:18:28'),(35,35,'20060307/1141657200','2011-09-28 18:18:32'),(36,36,'20060308/1141743600','2011-09-28 18:18:44'),(37,37,'20060309/1141830000','2011-09-28 18:18:48'),(38,38,'20060310/1141916400','2011-09-28 18:19:01'),(39,39,'20060311/1142002800','2011-09-28 18:19:10'),(40,40,'20060312/1142089200','2011-09-28 18:19:14'),(41,41,'20060313/1142175600','2011-09-28 18:19:18'),(42,42,'20060314/1142262000','2011-09-28 18:19:24'),(43,43,'20060315/1142348400','2011-09-28 18:19:38'),(44,44,'20060316/1142434800','2011-09-28 18:19:43'),(45,45,'20060317/1142521200','2011-09-28 18:19:53'),(46,46,'20060318/1142607600','2011-09-28 18:19:59'),(47,47,'20060319/1142694000','2011-09-28 18:20:04'),(48,48,'20060320/1142780400','2011-09-28 18:20:11'),(49,49,'20060321/1142866800','2011-09-28 18:20:17'),(50,50,'20060322/1142953200','2011-09-28 18:20:20'),(52,52,'20060324/1143126000','2011-09-28 18:20:24'),(53,53,'20060325/1143212400','2011-09-28 18:20:28'),(54,54,'20060326/1143298800','2011-09-28 18:20:32'),(55,55,'20060327/1143385200','2011-09-28 18:20:36'),(56,56,'20060328/1143471600','2011-09-28 18:20:41'),(57,57,'20060329/1143558000','2011-09-28 18:20:47'),(58,58,'20060330/1143644400','2011-09-28 18:20:52'),(59,59,'20060331/1143730800','2011-09-28 18:20:57'),(60,60,'20060401/1143817200','2011-09-28 18:21:10'),(61,61,'20060402/1143903600','2011-09-28 18:21:18'),(62,62,'20060403/1143990000','2011-09-28 18:21:31'),(63,63,'20060404/1144076400','2011-09-28 18:21:36'),(64,64,'20060405/1144162800','2011-09-28 18:21:40'),(65,65,'20060406/1144249200','2011-09-28 18:21:45'),(66,66,'20060407/1144335600','2011-09-28 18:21:52'),(67,67,'20060408/1144422000','2011-09-28 18:21:59'),(68,68,'20060409/1144508400','2011-09-28 18:22:03'),(69,69,'20060410/1144594800','2011-09-28 18:22:08'),(70,70,'20060411/1144681200','2011-09-28 18:22:12'),(71,71,'20060412/1144767600','2011-09-28 18:22:17'),(72,72,'20060413/1144854000','2011-09-28 18:22:22'),(73,73,'20060414/1144940400','2011-09-28 18:22:26'),(74,74,'20060415/1145026800','2011-09-28 18:22:31'),(75,75,'20060416/1145113200','2011-09-28 18:22:41'),(76,76,'20060417/1145199600','2011-09-28 18:22:45'),(77,77,'20060418/1145286000','2011-09-28 18:22:49'),(78,78,'20060419/1145372400','2011-09-28 18:22:53'),(79,79,'20060420/1145458800','2011-09-28 18:23:02'),(80,80,'20060421/1145545200','2011-09-28 18:23:08'),(81,81,'20060422/1145631600','2011-09-28 18:23:12'),(82,82,'20060423/1145718000','2011-09-28 18:23:17'),(83,83,'20060424/1145804400','2011-09-28 18:23:25'),(84,84,'20060425/1145890800','2011-09-28 18:23:29'),(85,85,'20060426/1145977200','2011-09-28 18:23:40'),(86,86,'20060427/1146063600','2011-09-28 18:23:45'),(87,87,'20060428/1146150000','2011-09-28 18:23:49'),(88,88,'20060429/1146236400','2011-09-28 18:23:55'),(89,89,'20060430/1146322800','2011-09-28 18:23:59'),(90,90,'20060501/1146409200','2011-09-28 18:24:07'),(91,91,'20060502/1146495600','2011-09-28 18:24:12'),(92,92,'20060503/1146582000','2011-09-28 18:24:19'),(93,93,'20060504/1146668400','2011-09-28 18:24:23'),(94,94,'20060505/1146754800','2011-09-28 18:24:30'),(95,95,'20060506/1146841200','2011-09-28 18:24:34'),(96,96,'20060507/1146927600','2011-09-28 18:24:38'),(97,97,'20060508/1147014000','2011-09-28 18:24:43'),(98,98,'20060509/1147100400','2011-09-28 18:24:48'),(99,99,'20060510/1147186800','2011-09-28 18:24:54'),(100,100,'20060511/1147273200','2011-09-28 18:24:58'),(101,101,'20060512/1147359600','2011-09-28 18:25:02'),(102,102,'20060513/1147446000','2011-09-28 18:25:08'),(103,103,'20060514/1147532400','2011-09-28 18:25:12'),(104,104,'20060515/1147618800','2011-09-28 18:25:20'),(105,105,'20060516/1147705200','2011-09-28 18:25:28'),(106,106,'20060517/1147791600','2011-09-28 18:25:32'),(107,107,'20060518/1147878000','2011-09-28 18:25:35'),(108,108,'20060519/1147964400','2011-09-28 18:25:40'),(109,109,'20060520/1148050800','2011-09-28 18:25:44'),(110,110,'20060521/1148137200','2011-09-28 18:25:48'),(111,111,'20060522/1148223600','2011-09-28 18:25:52'),(112,112,'20060523/1148310000','2011-09-28 18:25:56'),(113,113,'20060524/1148396400','2011-09-28 18:25:59'),(114,114,'20060525/1148482800','2011-09-28 18:26:03'),(115,115,'20060526/1148569200','2011-09-28 18:26:07'),(116,116,'20060527/1148655600','2011-09-28 18:26:12'),(117,117,'20060528/1148742000','2011-09-28 18:26:16'),(118,118,'20060529/1148828400','2011-09-28 18:26:20'),(119,119,'20060530/1148914800','2011-09-28 18:26:36'),(120,120,'20060531/1149001200','2011-09-28 18:26:40'),(121,121,'20060601/1149087600','2011-09-28 18:26:44'),(122,122,'20060602/1149174000','2011-09-28 18:26:49'),(123,123,'20060603/1149260400','2011-09-28 18:26:52'),(124,124,'20060604/1149346800','2011-09-28 18:26:56'),(125,125,'20060605/1149433200','2011-09-28 18:27:00'),(126,126,'20060606/1149519600','2011-09-28 18:27:06'),(127,127,'20060607/1149606000','2011-09-28 18:27:10'),(128,128,'20060608/1149692400','2011-09-28 18:27:14'),(129,129,'20060609/1149778800','2011-09-28 18:27:17'),(130,130,'20060610/1149865200','2011-09-28 18:27:21'),(131,131,'20060611/1149951600','2011-09-28 18:27:25'),(132,132,'20060612/1150038000','2011-09-28 18:27:28'),(133,133,'20060613/1150124400','2011-09-28 18:27:33'),(134,134,'20060614/1150210800','2011-09-28 18:27:36'),(135,135,'20060615/1150297200','2011-09-28 18:27:41'),(136,136,'20060616/1150383600','2011-09-28 18:27:45'),(137,137,'20060617/1150470000','2011-09-28 18:27:49'),(138,138,'20060618/1150556400','2011-09-28 18:27:54'),(139,139,'20060619/1150642800','2011-09-28 18:27:58'),(140,140,'20060620/1150729200','2011-09-28 18:28:02'),(141,141,'20060621/1150815600','2011-09-28 18:28:06'),(142,142,'20060622/1150902000','2011-09-28 18:28:11'),(143,143,'20060623/1150988400','2011-09-28 18:28:15'),(144,144,'20060624/1151074800','2011-09-28 18:28:19'),(145,145,'20060625/1151161200','2011-09-28 18:28:24'),(146,146,'20060626/1151247600','2011-09-28 18:28:28'),(147,147,'20060627/1151334000','2011-09-28 18:28:32'),(148,148,'20060628/1151420400','2011-09-28 18:28:43'),(149,149,'20060629/1151506800','2011-09-28 18:28:47'),(150,150,'20060630/1151593200','2011-09-28 18:28:56'),(151,151,'20060701/1151679600','2011-09-28 18:29:02'),(152,152,'20060702/1151766000','2011-09-28 18:29:05'),(153,153,'20060703/1151852400','2011-09-28 18:29:10'),(154,154,'20060704/1151938800','2011-09-28 18:29:13'),(155,155,'20060705/1152025200','2011-09-28 18:29:19'),(156,156,'20060706/1152111600','2011-09-28 18:29:23'),(157,157,'20060707/1152198000','2011-09-28 18:29:30'),(158,158,'20060708/1152284400','2011-09-28 18:29:36'),(159,159,'20060709/1152370800','2011-09-28 18:29:40'),(160,160,'20060710/1152457200','2011-09-28 18:29:46'),(163,163,'20060713/1152716400','2011-09-28 18:29:50'),(164,164,'20060714/1152802800','2011-09-28 18:29:57'),(165,165,'20060715/1152889200','2011-09-28 18:30:02'),(166,166,'20060716/1152975600','2011-09-28 18:30:07'),(167,167,'20060717/1153062000','2011-09-28 18:30:11'),(168,168,'20060718/1153148400','2011-09-28 18:30:15'),(169,169,'20060719/1153234800','2011-09-28 18:30:18'),(170,170,'20060720/1153321200','2011-09-28 18:30:22'),(171,171,'20060721/1153407600','2011-09-28 18:30:26'),(172,172,'20060722/1153494000','2011-09-28 18:30:34'),(173,173,'20060723/1153580400','2011-09-28 18:30:38'),(174,174,'20060724/1153666800','2011-09-28 18:30:42'),(175,175,'20060725/1153753200','2011-09-28 18:30:46'),(176,176,'20060726/1153839600','2011-09-28 18:30:49'),(177,177,'20060727/1153926000','2011-09-28 18:30:58'),(178,178,'20060728/1154012400','2011-09-28 18:31:02'),(179,179,'20060729/1154098800','2011-09-28 18:31:06'),(180,180,'20060730/1154185200','2011-09-28 18:31:10'),(181,181,'20060731/1154271600','2011-09-28 18:31:13'),(182,182,'20060801/1154358000','2011-09-28 18:31:17'),(183,183,'20060802/1154444400','2011-09-28 18:31:21'),(184,184,'20060803/1154530800','2011-09-28 18:31:25'),(185,185,'20060804/1154617200','2011-09-28 18:31:29'),(186,186,'20060805/1154703600','2011-09-28 18:31:34'),(187,187,'20060806/1154790000','2011-09-28 18:31:38'),(188,188,'20060807/1154876400','2011-09-28 18:31:42'),(189,189,'20060808/1154962800','2011-09-28 18:31:47'),(190,190,'20060809/1155049200','2011-09-28 18:31:51'),(191,191,'20060810/1155135600','2011-09-28 18:31:54'),(192,192,'20060811/1155222000','2011-09-28 18:31:58'),(193,193,'20060812/1155308400','2011-09-28 18:32:03'),(194,194,'20060813/1155394800','2011-09-28 18:32:08'),(195,195,'20060814/1155481200','2011-09-28 18:32:12'),(196,196,'20060815/1155567600','2011-09-28 18:32:16'),(197,197,'20060816/1155654000','2011-09-28 18:32:19'),(198,198,'20060817/1155740400','2011-09-28 18:32:23'),(199,199,'20060818/1155826800','2011-09-28 18:32:27'),(200,200,'20060819/1155913200','2011-09-28 18:32:31'),(202,202,'20060821/1156086000','2011-09-28 18:32:34'),(203,203,'20060822/1156172400','2011-09-28 18:32:38'),(204,204,'20060823/1156258800','2011-09-28 18:32:42'),(205,205,'20060824/1156345200','2011-09-28 18:32:46'),(206,206,'20060825/1156431600','2011-09-28 18:32:50'),(207,207,'20060826/1156518000','2011-09-28 18:32:54'),(208,208,'20060827/1156604400','2011-09-28 18:32:58'),(209,209,'20060828/1156690800','2011-09-28 18:33:02'),(210,210,'20060829/1156777200','2011-09-28 18:33:06'),(211,211,'20060830/1156863600','2011-09-28 18:33:14'),(212,212,'20060831/1156950000','2011-09-28 18:33:20'),(213,213,'20060901/1157036400','2011-09-28 18:33:24'),(214,214,'20060902/1157122800','2011-09-28 18:33:28'),(215,215,'20060903/1157209200','2011-09-28 18:33:32'),(216,216,'20060904/1157295600','2011-09-28 18:33:36'),(217,217,'20060905/1157382000','2011-09-28 18:33:39'),(218,218,'20060906/1157468400','2011-09-28 18:33:46'),(219,219,'20060907/1157554800','2011-09-28 18:33:50'),(220,220,'20060908/1157641200','2011-09-28 18:33:54'),(221,221,'20060909/1157727600','2011-09-28 18:33:58'),(222,222,'20060910/1157814000','2011-09-28 18:34:02'),(223,223,'20060911/1157900400','2011-09-28 18:34:06'),(224,224,'20060912/1157986800','2011-09-28 18:34:10'),(225,225,'20060913/1158073200','2011-09-28 18:34:14'),(226,226,'20060914/1158159600','2011-09-28 18:34:17'),(227,227,'20060915/1158246000','2011-09-28 18:34:21'),(228,228,'20060916/1158332400','2011-09-28 18:34:24'),(229,229,'20060917/1158418800','2011-09-28 18:34:31'),(230,230,'20060918/1158505200','2011-09-28 18:34:35'),(231,231,'20060919/1158591600','2011-09-28 18:34:38'),(232,232,'20060920/1158678000','2011-09-28 18:34:42'),(233,233,'20060921/1158764400','2011-09-28 18:34:47'),(234,234,'20060922/1158850800','2011-09-28 18:34:50'),(235,235,'20060923/1158937200','2011-09-28 18:34:54'),(236,236,'20060924/1159023600','2011-09-28 18:34:58'),(237,237,'20060925/1159110000','2011-09-28 18:35:02'),(238,238,'20060926/1159196400','2011-09-28 18:35:05'),(239,239,'20060927/1159282800','2011-09-28 18:35:09'),(240,240,'20060928/1159369200','2011-09-28 18:35:13'),(241,241,'20060929/1159455600','2011-09-28 18:35:17'),(242,242,'20060930/1159542000','2011-09-28 18:35:21'),(243,243,'20061001/1159628400','2011-09-28 18:35:24'),(244,244,'20061002/1159714800','2011-09-28 18:35:28'),(245,245,'20061003/1159801200','2011-09-28 18:35:32'),(246,246,'20061004/1159887600','2011-09-28 18:35:36'),(247,247,'20061005/1159974000','2011-09-28 18:35:40'),(248,248,'20061006/1160060400','2011-09-28 18:35:46'),(249,249,'20061007/1160146800','2011-09-28 18:35:50'),(250,250,'20061008/1160233200','2011-09-28 18:35:54'),(251,251,'20061009/1160319600','2011-09-28 18:35:58'),(252,252,'20061010/1160406000','2011-09-28 18:36:03'),(253,253,'20061011/1160492400','2011-09-28 18:36:06'),(254,254,'20061012/1160578800','2011-09-28 18:36:12'),(255,255,'20061013/1160665200','2011-09-28 18:36:18'),(256,256,'20061014/1160751600','2011-09-28 18:36:22'),(257,257,'20061015/1160838000','2011-09-28 18:36:26'),(258,258,'20061016/1160924400','2011-09-28 18:36:30'),(259,259,'20061017/1161010800','2011-09-28 18:36:34'),(260,260,'20061018/1161097200','2011-09-28 18:36:38'),(261,261,'20061019/1161183600','2011-09-28 18:36:43'),(262,262,'20061020/1161270000','2011-09-28 18:36:47'),(263,263,'20061021/1161356400','2011-09-28 18:36:51'),(264,264,'20061022/1161442800','2011-09-28 18:36:55'),(265,265,'20061023/1161529200','2011-09-28 18:36:59'),(266,266,'20061024/1161615600','2011-09-28 18:37:02'),(267,267,'20061025/1161702000','2011-09-28 18:37:06'),(268,268,'20061026/1161788400','2011-09-28 18:37:11'),(269,269,'20061027/1161874800','2011-09-28 18:37:15'),(270,270,'20061028/1161961200','2011-09-28 18:37:19'),(271,271,'20061029/1162047600','2011-09-28 18:37:22'),(272,272,'20061030/1162134000','2011-09-28 18:37:26'),(273,273,'20061031/1162220400','2011-09-28 18:37:30'),(274,274,'20061101/1162306800','2011-09-28 18:37:34'),(275,275,'20061102/1162393200','2011-09-28 18:37:38'),(276,276,'20061103/1162479600','2011-09-28 18:37:42'),(277,277,'20061104/1162566000','2011-09-28 18:37:46'),(278,278,'20061105/1162652400','2011-09-28 18:37:50'),(279,279,'20061106/1162738800','2011-09-28 18:37:53'),(280,280,'20061107/1162825200','2011-09-28 18:37:57'),(281,281,'20061108/1162911600','2011-09-28 18:38:03'),(282,282,'20061109/1162998000','2011-09-28 18:38:07'),(283,283,'20061110/1163084400','2011-09-28 18:38:10'),(284,284,'20061111/1163170800','2011-09-28 18:38:14'),(285,285,'20061112/1163257200','2011-09-28 18:38:17'),(286,286,'20061113/1163343600','2011-09-28 18:38:21'),(287,287,'20061114/1163430000','2011-09-28 18:38:26'),(288,288,'20061115/1163516400','2011-09-28 18:38:30'),(289,289,'20061116/1163602800','2011-09-28 18:38:34'),(290,290,'20061117/1163689200','2011-09-28 18:38:37'),(291,291,'20061118/1163775600','2011-09-28 18:38:42'),(292,292,'20061119/1163862000','2011-09-28 18:38:45'),(293,293,'20061120/1163948400','2011-09-28 18:38:49'),(294,294,'20061121/1164034800','2011-09-28 18:38:57'),(295,295,'20061122/1164121200','2011-09-28 18:39:01'),(296,296,'20061123/1164207600','2011-09-28 18:39:05'),(297,297,'20061124/1164294000','2011-09-28 18:39:09'),(298,298,'20061125/1164380400','2011-09-28 18:39:13'),(299,299,'20061126/1164466800','2011-09-28 18:39:17'),(300,300,'20061127/1164553200','2011-09-28 18:39:21'),(301,301,'20061128/1164639600','2011-09-28 18:39:25'),(302,302,'20061129/1164726000','2011-09-28 18:39:29'),(303,303,'20061130/1164812400','2011-09-28 18:39:33'),(304,304,'20061201/1164898800','2011-09-28 18:39:37'),(305,305,'20061202/1164985200','2011-09-28 18:39:41'),(306,306,'20061203/1165071600','2011-09-28 18:39:44'),(307,307,'20061204/1165158000','2011-09-28 18:39:49'),(308,308,'20061205/1165244400','2011-09-28 18:39:56'),(309,309,'20061206/1165330800','2011-09-28 18:40:00'),(310,310,'20061207/1165417200','2011-09-28 18:40:04'),(311,311,'20061208/1165503600','2011-09-28 18:40:08'),(312,312,'20061209/1165590000','2011-09-28 18:40:12'),(313,313,'20061210/1165676400','2011-09-28 18:40:15'),(314,314,'20061211/1165762800','2011-09-28 18:40:19'),(315,315,'20061212/1165849200','2011-09-28 18:40:26'),(316,316,'20061213/1165935600','2011-09-28 18:40:30'),(317,317,'20061214/1166022000','2011-09-28 18:40:35'),(318,318,'20061215/1166108400','2011-09-28 18:40:42'),(319,319,'20061216/1166194800','2011-09-28 18:40:46'),(320,320,'20061217/1166281200','2011-09-28 18:40:54'),(321,321,'20061218/1166367600','2011-09-28 18:40:58'),(322,322,'20061219/1166454000','2011-09-28 18:41:02'),(323,323,'20061220/1166540400','2011-09-28 18:41:05'),(324,324,'20061221/1166626800','2011-09-28 18:41:09'),(325,325,'20061222/1166713200','2011-09-28 18:41:14'),(326,326,'20061223/1166799600','2011-09-28 18:41:18'),(327,327,'20061224/1166886000','2011-09-28 18:41:23'),(328,328,'20061225/1166972400','2011-09-28 18:41:28'),(329,329,'20061226/1167058800','2011-09-28 18:41:35'),(330,330,'20061227/1167145200','2011-09-28 18:41:42'),(331,331,'20061228/1167231600','2011-09-28 18:41:47'),(332,332,'20061229/1167318000','2011-09-28 18:41:52'),(333,333,'20061230/1167404400','2011-09-28 18:41:55'),(334,334,'20061231/1167490800','2011-09-28 18:41:59'),(335,335,'20070101/1167577200','2011-09-28 18:42:03'),(336,336,'20070102/1167663600','2011-09-28 18:42:06'),(337,337,'20070103/1167750000','2011-09-28 18:42:11'),(338,338,'20070104/1167836400','2011-09-28 18:42:15'),(339,339,'20070105/1167922800','2011-09-28 18:42:19'),(340,340,'20070106/1168009200','2011-09-28 18:42:24'),(341,341,'20070107/1168095600','2011-09-28 18:42:27'),(342,342,'20070108/1168182000','2011-09-28 18:42:31'),(343,343,'20070109/1168268400','2011-09-28 18:42:35'),(344,344,'20070110/1168354800','2011-09-28 18:42:38'),(345,345,'20070111/1168441200','2011-09-28 18:42:42'),(346,346,'20070112/1168527600','2011-09-28 18:42:46'),(347,347,'20070113/1168614000','2011-09-28 18:42:50'),(348,348,'20070114/1168700400','2011-09-28 18:42:54'),(349,349,'20070115/1168786800','2011-09-28 18:42:58'),(350,350,'20070116/1168873200','2011-09-28 18:43:02'),(351,351,'20070117/1168959600','2011-09-28 18:43:06'),(352,352,'20070118/1169046000','2011-09-28 18:43:09'),(353,353,'20070119/1169132400','2011-09-28 18:43:13'),(354,354,'20070120/1169218800','2011-09-28 18:43:17'),(355,355,'20070121/1169305200','2011-09-28 18:43:20'),(356,356,'20070122/1169391600','2011-09-28 18:43:24'),(357,357,'20070123/1169478000','2011-09-28 18:43:27'),(358,358,'20070124/1169564400','2011-09-28 18:43:31'),(359,359,'20070125/1169650800','2011-09-28 18:43:35'),(360,360,'20070126/1169737200','2011-09-28 18:43:39'),(361,361,'20070127/1169823600','2011-09-28 18:43:42'),(362,362,'20070128/1169910000','2011-09-28 18:43:46'),(363,363,'20070129/1169996400','2011-09-28 18:43:49'),(364,364,'20070130/1170082800','2011-09-28 18:43:53'),(365,365,'20070131/1170169200','2011-09-28 18:43:56'),(366,366,'20070201/1170255600','2011-09-28 18:44:00'),(367,367,'20070202/1170342000','2011-09-28 18:44:07'),(368,368,'20070203/1170428400','2011-09-28 18:44:11'),(369,369,'20070204/1170514800','2011-09-28 18:44:14'),(370,370,'20070205/1170601200','2011-09-28 18:44:18'),(371,371,'20070206/1170687600','2011-09-28 18:44:22'),(372,372,'20070207/1170774000','2011-09-28 18:44:25'),(373,373,'20070208/1170860400','2011-09-28 18:44:29'),(374,374,'20070209/1170946800','2011-09-28 18:44:33'),(375,375,'20070210/1171033200','2011-09-28 18:44:36'),(376,376,'20070211/1171119600','2011-09-28 18:44:40'),(377,377,'20070212/1171206000','2011-09-28 18:44:44'),(378,378,'20070213/1171292400','2011-09-28 18:44:47'),(380,380,'20070215/1171465200','2011-09-28 18:44:51'),(381,381,'20070216/1171551600','2011-09-28 18:44:55'),(382,382,'20070217/1171638000','2011-09-28 18:44:58'),(383,383,'20070218/1171724400','2011-09-28 18:45:03'),(384,384,'20070219/1171810800','2011-09-28 18:45:08'),(385,385,'20070220/1171897200','2011-09-28 18:45:12'),(386,386,'20070221/1171983600','2011-09-28 18:45:16'),(387,387,'20070222/1172070000','2011-09-28 18:45:19'),(389,389,'20070224/1172242800','2011-09-28 18:45:23'),(390,390,'20070225/1172329200','2011-09-28 18:45:27'),(391,391,'20070226/1172415600','2011-09-28 18:45:31'),(392,392,'20070227/1172502000','2011-09-28 18:45:36'),(393,393,'20070228/1172588400','2011-09-28 18:45:39'),(394,394,'20070301/1172674800','2011-09-28 18:45:43'),(395,395,'20070302/1172761200','2011-09-28 18:45:46'),(396,396,'20070303/1172847600','2011-09-28 18:45:50'),(397,397,'20070304/1172934000','2011-09-28 18:45:53'),(398,398,'20070305/1173020400','2011-09-28 18:45:57'),(399,399,'20070306/1173106800','2011-09-28 18:46:01'),(400,400,'20070307/1173193200','2011-09-28 18:46:09'),(401,401,'20070308/1173279600','2011-09-28 18:46:13'),(402,402,'20070309/1173366000','2011-09-28 18:46:16'),(403,403,'20070310/1173452400','2011-09-28 18:46:20'),(404,404,'20070311/1173538800','2011-09-28 18:46:24'),(405,405,'20070312/1173625200','2011-09-28 18:46:27'),(406,406,'20070313/1173711600','2011-09-28 18:46:31'),(407,407,'20070314/1173798000','2011-09-28 18:46:34'),(408,408,'20070315/1173884400','2011-09-28 18:46:38'),(409,409,'20070316/1173970800','2011-09-28 18:46:42'),(410,410,'20070317/1174057200','2011-09-28 18:46:48'),(411,411,'20070318/1174143600','2011-09-28 18:46:52'),(412,412,'20070319/1174230000','2011-09-28 18:46:56'),(413,413,'20070320/1174316400','2011-09-28 18:47:00'),(414,414,'20070321/1174402800','2011-09-28 18:47:03'),(415,415,'20070322/1174489200','2011-09-28 18:47:07'),(416,416,'20070323/1174575600','2011-09-28 18:47:10'),(417,417,'20070324/1174662000','2011-09-28 18:47:14'),(418,418,'20070325/1174748400','2011-09-28 18:47:18'),(419,419,'20070326/1174834800','2011-09-28 18:47:22'),(420,420,'20070327/1174921200','2011-09-28 18:47:26'),(421,421,'20070328/1175007600','2011-09-28 18:47:30'),(422,422,'20070329/1175094000','2011-09-28 18:47:33'),(423,423,'20070330/1175180400','2011-09-28 18:47:37'),(424,424,'20070331/1175266800','2011-09-28 18:47:40'),(425,425,'20070401/1175353200','2011-09-28 18:47:44'),(426,426,'20070402/1175439600','2011-09-28 18:47:48'),(427,427,'20070403/1175526000','2011-09-28 18:47:51'),(428,428,'20070404/1175612400','2011-09-28 18:47:55'),(429,429,'20070405/1175698800','2011-09-28 18:47:58'),(430,430,'20070406/1175785200','2011-09-28 18:48:02'),(431,431,'20070407/1175871600','2011-09-28 18:48:06'),(432,432,'20070408/1175958000','2011-09-28 18:48:10'),(433,433,'20070409/1176044400','2011-09-28 18:48:13'),(434,434,'20070410/1176130800','2011-09-28 18:48:20'),(435,435,'20070411/1176217200','2011-09-28 18:48:24'),(436,436,'20070412/1176303600','2011-09-28 18:48:28'),(437,437,'20070413/1176390000','2011-09-28 18:48:32'),(438,438,'20070414/1176476400','2011-09-28 18:48:35'),(439,439,'20070415/1176562800','2011-09-28 18:48:42'),(440,440,'20070416/1176649200','2011-09-28 18:48:47'),(441,441,'20070417/1176735600','2011-09-28 18:48:50'),(442,442,'20070418/1176822000','2011-09-28 18:48:54'),(443,443,'20070419/1176908400','2011-09-28 18:48:58'),(444,444,'20070420/1176994800','2011-09-28 18:49:01'),(445,445,'20070421/1177081200','2011-09-28 18:49:05'),(446,446,'20070422/1177167600','2011-09-28 18:49:09'),(447,447,'20070423/1177254000','2011-09-28 18:49:13'),(448,448,'20070424/1177340400','2011-09-28 18:49:16'),(449,449,'20070425/1177426800','2011-09-28 18:49:20'),(450,450,'20070426/1177513200','2011-09-28 18:49:26'),(451,451,'20070427/1177599600','2011-09-28 18:49:30'),(452,452,'20070428/1177686000','2011-09-28 18:49:34'),(453,453,'20070429/1177772400','2011-09-28 18:49:37'),(454,454,'20070430/1177858800','2011-09-28 18:49:41'),(455,455,'20070501/1177945200','2011-09-28 18:49:45'),(456,456,'20070502/1178031600','2011-09-28 18:49:54'),(457,457,'20070503/1178118000','2011-09-28 18:49:57'),(458,458,'20070504/1178204400','2011-09-28 18:50:01'),(459,459,'20070505/1178290800','2011-09-28 18:50:05'),(460,460,'20070506/1178377200','2011-09-28 18:50:08'),(461,461,'20070507/1178463600','2011-09-28 18:50:13'),(462,462,'20070508/1178550000','2011-09-28 18:50:17'),(463,463,'20070509/1178636400','2011-09-28 18:50:20'),(464,464,'20070510/1178722800','2011-09-28 18:50:24'),(465,465,'20070511/1178809200','2011-09-28 18:50:31'),(466,466,'20070512/1178895600','2011-09-28 18:50:35'),(467,467,'20070513/1178982000','2011-09-28 18:50:39'),(468,468,'20070514/1179068400','2011-09-28 18:50:46'),(469,469,'20070515/1179154800','2011-09-28 18:50:50'),(470,470,'20070516/1179241200','2011-09-28 18:50:54'),(471,471,'20070517/1179327600','2011-09-28 18:50:58'),(472,472,'20070518/1179414000','2011-09-28 18:51:02'),(473,473,'20070519/1179500400','2011-09-28 18:51:06'),(474,474,'20070520/1179586800','2011-09-28 18:51:09'),(475,475,'20070521/1179673200','2011-09-28 18:51:13'),(476,476,'20070522/1179759600','2011-09-28 18:51:16'),(477,477,'20070523/1179846000','2011-09-28 18:51:20'),(478,478,'20070524/1179932400','2011-09-28 18:51:28'),(479,479,'20070525/1180018800','2011-09-28 18:51:32'),(480,480,'20070526/1180105200','2011-09-28 18:51:40'),(481,481,'20070527/1180191600','2011-09-28 18:51:44'),(482,482,'20070528/1180278000','2011-09-28 18:51:48'),(483,483,'20070529/1180364400','2011-09-28 18:51:51'),(484,484,'20070530/1180450800','2011-09-28 18:51:59'),(485,485,'20070531/1180537200','2011-09-28 18:52:03'),(486,486,'20070601/1180623600','2011-09-28 18:52:09'),(487,487,'20070602/1180710000','2011-09-28 18:52:13'),(488,488,'20070603/1180796400','2011-09-28 18:52:17'),(489,489,'20070604/1180882800','2011-09-28 18:52:21'),(490,490,'20070605/1180969200','2011-09-28 18:52:24'),(492,492,'20070607/1181142000','2011-09-28 18:52:31'),(493,493,'20070608/1181228400','2011-09-28 18:52:35'),(494,494,'20070609/1181314800','2011-09-28 18:52:39'),(495,495,'20070610/1181401200','2011-09-28 18:52:43'),(496,496,'20070611/1181487600','2011-09-28 18:52:46'),(497,497,'20070612/1181574000','2011-09-28 18:52:50'),(498,498,'20070613/1181660400','2011-09-28 18:52:53'),(499,499,'20070614/1181746800','2011-09-28 18:52:57'),(500,500,'20070615/1181833200','2011-09-28 18:53:01'),(502,502,'20070617/1182006000','2011-09-28 18:53:06'),(503,503,'20070618/1182092400','2011-09-28 18:53:11'),(504,504,'20070619/1182178800','2011-09-28 18:53:14'),(505,505,'20070620/1182265200','2011-09-28 18:53:18'),(507,507,'20070622/1182438000','2011-09-28 18:53:21'),(508,508,'20070623/1182524400','2011-09-28 18:53:25'),(509,509,'20070624/1182610800','2011-09-28 18:53:29'),(510,510,'20070625/1182697200','2011-09-28 18:53:32'),(511,511,'20070626/1182783600','2011-09-28 18:53:36'),(512,512,'20070627/1182870000','2011-09-28 18:53:40'),(513,513,'20070628/1182956400','2011-09-28 18:53:44'),(514,514,'20070629/1183042800','2011-09-28 18:53:48'),(515,515,'20070630/1183129200','2011-09-28 18:53:51'),(516,516,'20070701/1183215600','2011-09-28 18:53:55'),(517,517,'20070702/1183302000','2011-09-28 18:53:59'),(518,518,'20070703/1183388400','2011-09-28 18:54:02'),(519,519,'20070704/1183474800','2011-09-28 18:54:06'),(520,520,'20070705/1183561200','2011-09-28 18:54:10'),(521,521,'20070706/1183647600','2011-09-28 18:54:14'),(522,522,'20070707/1183734000','2011-09-28 18:54:18'),(523,523,'20070708/1183820400','2011-09-28 18:54:24'),(524,524,'20070709/1183906800','2011-09-28 18:54:28'),(525,525,'20070710/1183993200','2011-09-28 18:54:31'),(526,526,'20070711/1184079600','2011-09-28 18:54:35'),(527,527,'20070712/1184166000','2011-09-28 18:54:38'),(528,528,'20070713/1184252400','2011-09-28 18:54:42'),(529,529,'20070714/1184338800','2011-09-28 18:54:45'),(530,530,'20070715/1184425200','2011-09-28 18:54:49'),(531,531,'20070716/1184511600','2011-09-28 18:54:55'),(532,532,'20070717/1184598000','2011-09-28 18:54:59'),(533,533,'20070718/1184684400','2011-09-28 18:55:02'),(534,534,'20070719/1184770800','2011-09-28 18:55:06'),(535,535,'20070720/1184857200','2011-09-28 18:55:10'),(536,536,'20070721/1184943600','2011-09-28 18:55:14'),(537,537,'20070722/1185030000','2011-09-28 18:55:18'),(538,538,'20070723/1185116400','2011-09-28 18:55:21'),(539,539,'20070724/1185202800','2011-09-28 18:55:25'),(540,540,'20070725/1185289200','2011-09-28 18:55:30'),(541,541,'20070726/1185375600','2011-09-28 18:55:34'),(542,542,'20070727/1185462000','2011-09-28 18:55:38'),(543,543,'20070728/1185548400','2011-09-28 18:55:42'),(544,544,'20070729/1185634800','2011-09-28 18:55:46'),(545,545,'20070730/1185721200','2011-09-28 18:55:49'),(546,546,'20070731/1185807600','2011-09-28 18:55:53'),(547,547,'20070801/1185894000','2011-09-28 18:55:57'),(548,548,'20070802/1185980400','2011-09-28 18:56:01'),(549,549,'20070803/1186066800','2011-09-28 18:56:05'),(550,550,'20070804/1186153200','2011-09-28 18:56:09'),(551,551,'20070805/1186239600','2011-09-28 18:56:13'),(552,552,'20070806/1186326000','2011-09-28 18:56:16'),(553,553,'20070807/1186412400','2011-09-28 18:56:20'),(554,554,'20070808/1186498800','2011-09-28 18:56:26'),(555,555,'20070809/1186585200','2011-09-28 18:56:30'),(556,556,'20070810/1186671600','2011-09-28 18:56:34'),(557,557,'20070811/1186758000','2011-09-28 18:56:37'),(558,558,'20070812/1186844400','2011-09-28 18:56:41'),(559,559,'20070813/1186930800','2011-09-28 18:56:44'),(560,560,'20070814/1187017200','2011-09-28 18:56:48'),(561,561,'20070815/1187103600','2011-09-28 18:56:52'),(562,562,'20070816/1187190000','2011-09-28 18:56:56'),(563,563,'20070817/1187276400','2011-09-28 18:56:59'),(564,564,'20070818/1187362800','2011-09-28 18:57:03'),(565,565,'20070819/1187449200','2011-09-28 18:57:06'),(566,566,'20070820/1187535600','2011-09-28 18:57:10'),(567,567,'20070821/1187622000','2011-09-28 18:57:14'),(568,568,'20070822/1187708400','2011-09-28 18:57:17'),(569,569,'20070823/1187794800','2011-09-28 18:57:21'),(570,570,'20070824/1187881200','2011-09-28 18:57:25'),(571,571,'20070825/1187967600','2011-09-28 18:57:28'),(572,572,'20070826/1188054000','2011-09-28 18:57:32'),(573,573,'20070827/1188140400','2011-09-28 18:57:36'),(574,574,'20070828/1188226800','2011-09-28 18:57:39'),(575,575,'20070829/1188313200','2011-09-28 18:57:43'),(576,576,'20070830/1188399600','2011-09-28 18:57:46'),(577,577,'20070831/1188486000','2011-09-28 18:57:50'),(578,578,'20070901/1188572400','2011-09-28 18:57:53'),(579,579,'20070902/1188658800','2011-09-28 18:57:57'),(580,580,'20070903/1188745200','2011-09-28 18:58:01'),(581,581,'20070904/1188831600','2011-09-28 18:58:05'),(582,582,'20070905/1188918000','2011-09-28 18:58:08'),(583,583,'20070906/1189004400','2011-09-28 18:58:12'),(585,585,'20070908/1189177200','2011-09-28 18:58:16'),(586,586,'20070909/1189263600','2011-09-28 18:58:19'),(587,587,'20070910/1189350000','2011-09-28 18:58:23'),(588,588,'20070911/1189436400','2011-09-28 18:58:26'),(589,589,'20070912/1189522800','2011-09-28 18:58:30'),(590,590,'20070913/1189609200','2011-09-28 18:58:33'),(591,591,'20070914/1189695600','2011-09-28 18:58:37'),(592,592,'20070915/1189782000','2011-09-28 18:58:41'),(593,593,'20070916/1189868400','2011-09-28 18:58:45'),(594,594,'20070917/1189954800','2011-09-28 18:58:48'),(595,595,'20070918/1190041200','2011-09-28 18:58:52'),(596,596,'20070919/1190127600','2011-09-28 18:58:56'),(597,597,'20070920/1190214000','2011-09-28 18:59:02'),(598,598,'20070921/1190300400','2011-09-28 18:59:06'),(599,599,'20070922/1190386800','2011-09-28 18:59:10'),(600,600,'20070923/1190473200','2011-09-28 18:59:13'),(601,601,'20070924/1190559600','2011-09-28 18:59:17'),(602,602,'20070925/1190646000','2011-09-28 18:59:22'),(603,603,'20070926/1190732400','2011-09-28 18:59:25'),(604,604,'20070927/1190818800','2011-09-28 18:59:29'),(605,605,'20070928/1190905200','2011-09-28 18:59:33'),(606,606,'20070929/1190991600','2011-09-28 18:59:37'),(607,607,'20070930/1191078000','2011-09-28 18:59:40'),(608,608,'20071001/1191164400','2011-09-28 18:59:44'),(609,609,'20071002/1191250800','2011-09-28 18:59:47'),(610,610,'20071003/1191337200','2011-09-28 18:59:51'),(611,611,'20071004/1191423600','2011-09-28 18:59:54'),(612,612,'20071005/1191510000','2011-09-28 19:00:01'),(613,613,'20071006/1191596400','2011-09-28 19:00:04'),(614,614,'20071007/1191682800','2011-09-28 19:00:08'),(615,615,'20071008/1191769200','2011-09-28 19:00:15'),(616,616,'20071009/1191855600','2011-09-28 19:36:39'),(617,617,'20071010/1191942000','2011-09-28 19:36:47'),(618,618,'20071011/1192028400','2011-09-28 19:36:52'),(619,619,'20071012/1192114800','2011-09-28 19:37:01'),(620,620,'20071013/1192201200','2011-09-28 19:37:04'),(621,621,'20071014/1192287600','2011-09-28 19:37:08'),(622,622,'20071015/1192374000','2011-09-28 19:37:14'),(623,623,'20071016/1192460400','2011-09-28 19:37:23'),(624,624,'20071017/1192546800','2011-09-28 19:37:27'),(625,625,'20071018/1192633200','2011-09-28 19:37:31'),(626,626,'20071019/1192719600','2011-09-28 19:37:34'),(627,627,'20071020/1192806000','2011-09-28 19:37:39'),(628,628,'20071021/1192892400','2011-09-28 19:37:42'),(629,629,'20071022/1192978800','2011-09-28 19:37:51'),(630,630,'20071023/1193065200','2011-09-28 19:37:55'),(631,631,'20071024/1193151600','2011-09-28 19:37:59'),(632,632,'20071025/1193238000','2011-09-28 19:38:03'),(633,633,'20071026/1193324400','2011-09-28 19:38:08'),(634,634,'20071027/1193410800','2011-09-28 19:38:13'),(635,635,'20071028/1193497200','2011-09-28 19:38:17'),(636,636,'20071029/1193583600','2011-09-28 19:38:22'),(637,637,'20071030/1193670000','2011-09-28 19:38:27'),(638,638,'20071031/1193756400','2011-09-28 19:38:32'),(639,639,'20071101/1193842800','2011-09-28 19:38:35'),(640,640,'20071102/1193929200','2011-09-28 19:38:39'),(641,641,'20071103/1194015600','2011-09-28 19:38:43'),(642,642,'20071104/1194102000','2011-09-28 19:38:47'),(643,643,'20071105/1194188400','2011-09-28 19:38:50'),(644,644,'20071106/1194274800','2011-09-28 19:38:53'),(645,645,'20071107/1194361200','2011-09-28 19:38:57'),(646,646,'20071108/1194447600','2011-09-28 19:39:02'),(647,647,'20071109/1194534000','2011-09-28 19:39:06'),(648,648,'20071110/1194620400','2011-09-28 19:39:09'),(649,649,'20071111/1194706800','2011-09-28 19:39:13'),(650,650,'20071112/1194793200','2011-09-28 19:39:18'),(651,651,'20071113/1194879600','2011-09-28 19:39:22'),(652,652,'20071114/1194966000','2011-09-28 19:39:26'),(653,653,'20071115/1195052400','2011-09-28 19:39:30'),(654,654,'20071116/1195138800','2011-09-28 19:39:34'),(655,655,'20071117/1195225200','2011-09-28 19:39:40'),(656,656,'20071118/1195311600','2011-09-28 19:39:45'),(657,657,'20071119/1195398000','2011-09-28 19:39:49'),(658,658,'20071120/1195484400','2011-09-28 19:39:53'),(659,659,'20071121/1195570800','2011-09-28 19:39:57'),(660,660,'20071122/1195657200','2011-09-28 19:40:02'),(661,661,'20071123/1195743600','2011-09-28 19:40:06'),(662,662,'20071124/1195830000','2011-09-28 19:40:10'),(663,663,'20071125/1195916400','2011-09-28 19:40:14'),(664,664,'20071126/1196002800','2011-09-28 19:40:18'),(665,665,'20071127/1196089200','2011-09-28 19:40:22'),(666,666,'20071128/1196175600','2011-09-28 19:40:26'),(667,667,'20071129/1196262000','2011-09-28 19:40:30'),(668,668,'20071130/1196348400','2011-09-28 19:40:34'),(669,669,'20071201/1196434800','2011-09-28 19:40:42'),(670,670,'20071202/1196521200','2011-09-28 19:40:45'),(671,671,'20071203/1196607600','2011-09-28 19:40:49'),(672,672,'20071204/1196694000','2011-09-28 19:40:53'),(673,673,'20071205/1196780400','2011-09-28 19:41:00'),(674,674,'20071206/1196866800','2011-09-28 19:41:08'),(675,675,'20071207/1196953200','2011-09-28 19:41:12'),(676,676,'20071208/1197039600','2011-09-28 19:41:16'),(677,677,'20071209/1197126000','2011-09-28 19:41:21'),(678,678,'20071210/1197212400','2011-09-28 19:41:25'),(679,679,'20071211/1197298800','2011-09-28 19:41:29'),(680,680,'20071212/1197385200','2011-09-28 19:41:33'),(681,681,'20071213/1197471600','2011-09-28 19:41:36'),(682,682,'20071214/1197558000','2011-09-28 19:41:40'),(683,683,'20071215/1197644400','2011-09-28 19:41:44'),(684,684,'20071216/1197730800','2011-09-28 19:41:48'),(685,685,'20071217/1197817200','2011-09-28 19:41:52'),(686,686,'20071218/1197903600','2011-09-28 19:41:56'),(687,687,'20071219/1197990000','2011-09-28 19:42:03'),(688,688,'20071220/1198076400','2011-09-28 19:42:06'),(689,689,'20071221/1198162800','2011-09-28 19:42:11'),(690,690,'20071222/1198249200','2011-09-28 19:42:15'),(691,691,'20071223/1198335600','2011-09-28 19:42:18'),(693,693,'20071225/1198508400','2011-09-28 19:42:23'),(694,694,'20071226/1198594800','2011-09-28 19:42:26'),(695,695,'20071227/1198681200','2011-09-28 19:42:30'),(696,696,'20071228/1198767600','2011-09-28 19:42:33'),(697,697,'20071229/1198854000','2011-09-28 19:42:37'),(698,698,'20071230/1198940400','2011-09-28 19:42:41'),(699,699,'20071231/1199026800','2011-09-28 19:42:45'),(700,700,'20080101/1199113200','2011-09-28 19:42:48'),(701,701,'20080102/1199199600','2011-09-28 19:42:52'),(702,702,'20080103/1199286000','2011-09-28 19:42:56'),(703,703,'20080104/1199372400','2011-09-28 19:43:00'),(704,704,'20080105/1199458800','2011-09-28 19:43:06'),(705,705,'20080106/1199545200','2011-09-28 19:43:10'),(706,706,'20080107/1199631600','2011-09-28 19:43:13'),(707,707,'20080108/1199718000','2011-09-28 19:43:17'),(708,708,'20080109/1199804400','2011-09-28 19:43:21'),(709,709,'20080110/1199890800','2011-09-28 19:43:24'),(710,710,'20080111/1199977200','2011-09-28 19:43:28'),(711,711,'20080112/1200063600','2011-09-28 19:43:32'),(712,712,'20080113/1200150000','2011-09-28 19:43:35'),(713,713,'20080114/1200236400','2011-09-28 19:43:39'),(714,714,'20080115/1200322800','2011-09-28 19:43:43'),(715,715,'20080116/1200409200','2011-09-28 19:43:47'),(716,716,'20080117/1200495600','2011-09-28 19:43:51'),(717,717,'20080118/1200582000','2011-09-28 19:43:54'),(718,718,'20080119/1200668400','2011-09-28 19:43:58'),(719,719,'20080120/1200754800','2011-09-28 19:44:02'),(720,720,'20080121/1200841200','2011-09-28 19:44:05'),(721,721,'20080122/1200927600','2011-09-28 19:44:09'),(722,722,'20080123/1201014000','2011-09-28 19:44:13'),(723,723,'20080124/1201100400','2011-09-28 19:44:16'),(724,724,'20080125/1201186800','2011-09-28 19:44:20'),(725,725,'20080126/1201273200','2011-09-28 19:44:24'),(726,726,'20080127/1201359600','2011-09-28 19:44:28'),(727,727,'20080128/1201446000','2011-09-28 19:44:32'),(728,728,'20080129/1201532400','2011-09-28 19:44:37'),(729,729,'20080130/1201618800','2011-09-28 19:44:41'),(730,730,'20080131/1201705200','2011-09-28 19:44:45'),(731,731,'20080201/1201791600','2011-09-28 19:44:49'),(732,732,'20080202/1201878000','2011-09-28 19:44:53'),(733,733,'20080203/1201964400','2011-09-28 19:44:56'),(734,734,'20080204/1202050800','2011-09-28 19:45:01'),(735,735,'20080205/1202137200','2011-09-28 19:45:05'),(736,736,'20080206/1202223600','2011-09-28 19:45:09'),(737,737,'20080207/1202310000','2011-09-28 19:45:13'),(738,738,'20080208/1202396400','2011-09-28 19:45:16'),(739,739,'20080209/1202482800','2011-09-28 19:45:20'),(740,740,'20080210/1202569200','2011-09-28 19:45:24'),(741,741,'20080211/1202655600','2011-09-28 19:45:28'),(742,742,'20080212/1202742000','2011-09-28 19:45:32'),(743,743,'20080213/1202828400','2011-09-28 19:45:39'),(744,744,'20080214/1202914800','2011-09-28 19:45:42'),(745,745,'20080215/1203001200','2011-09-28 19:45:47'),(746,746,'20080216/1203087600','2011-09-28 19:45:50'),(747,747,'20080217/1203174000','2011-09-28 19:45:54'),(748,748,'20080218/1203260400','2011-09-28 19:45:58'),(749,749,'20080219/1203346800','2011-09-28 19:46:02'),(750,750,'20080220/1203433200','2011-09-28 19:46:05'),(751,751,'20080221/1203519600','2011-09-28 19:46:09'),(752,752,'20080222/1203606000','2011-09-28 19:46:13'),(753,753,'20080223/1203692400','2011-09-28 19:46:16'),(754,754,'20080224/1203778800','2011-09-28 19:46:21'),(755,755,'20080225/1203865200','2011-09-28 19:46:25'),(756,756,'20080226/1203951600','2011-09-28 19:46:28'),(757,757,'20080227/1204038000','2011-09-28 19:46:32'),(758,758,'20080228/1204124400','2011-09-28 19:46:36'),(759,759,'20080229/1204210800','2011-09-28 19:46:39'),(760,760,'20080301/1204297200','2011-09-28 19:46:43'),(761,761,'20080302/1204383600','2011-09-28 19:46:47'),(762,762,'20080303/1204470000','2011-09-28 19:46:51'),(763,763,'20080304/1204556400','2011-09-28 19:46:54'),(764,764,'20080305/1204642800','2011-09-28 19:46:58'),(765,765,'20080306/1204729200','2011-09-28 19:47:03'),(766,766,'20080307/1204815600','2011-09-28 19:47:08'),(767,767,'20080308/1204902000','2011-09-28 19:47:14'),(768,768,'20080309/1204988400','2011-09-28 19:47:20'),(769,769,'20080310/1205074800','2011-09-28 19:47:24'),(770,770,'20080311/1205161200','2011-09-28 19:47:28'),(771,771,'20080312/1205247600','2011-09-28 19:47:32'),(772,772,'20080313/1205334000','2011-09-28 19:47:37'),(773,773,'20080314/1205420400','2011-09-28 19:47:41'),(774,774,'20080315/1205506800','2011-09-28 19:47:46'),(775,775,'20080316/1205593200','2011-09-28 19:47:50'),(776,776,'20080317/1205679600','2011-09-28 19:47:54'),(777,777,'20080318/1205766000','2011-09-28 19:47:58'),(778,778,'20080319/1205852400','2011-09-28 19:48:02'),(779,779,'20080320/1205938800','2011-09-28 19:48:06'),(780,780,'20080321/1206025200','2011-09-28 19:48:10'),(781,781,'20080322/1206111600','2011-09-28 19:48:13'),(782,782,'20080323/1206198000','2011-09-28 19:48:17'),(784,784,'20080325/1206370800','2011-09-28 19:48:20'),(785,785,'20080326/1206457200','2011-09-28 19:48:24'),(786,786,'20080327/1206543600','2011-09-28 19:48:28'),(787,787,'20080328/1206630000','2011-09-28 19:48:31'),(788,788,'20080329/1206716400','2011-09-28 19:48:35'),(789,789,'20080330/1206802800','2011-09-28 19:48:39'),(790,790,'20080331/1206889200','2011-09-28 19:48:43'),(791,791,'20080401/1206975600','2011-09-28 19:48:48'),(792,792,'20080402/1207062000','2011-09-28 19:48:51'),(793,793,'20080403/1207148400','2011-09-28 19:48:55'),(794,794,'20080404/1207234800','2011-09-28 19:48:58'),(795,795,'20080405/1207321200','2011-09-28 19:49:04'),(796,796,'20080406/1207407600','2011-09-28 19:49:09'),(797,797,'20080407/1207494000','2011-09-28 19:49:12'),(798,798,'20080408/1207580400','2011-09-28 19:49:18'),(799,799,'20080409/1207666800','2011-09-28 19:49:22'),(800,800,'20080410/1207753200','2011-09-28 19:49:26'),(801,801,'20080411/1207839600','2011-09-28 19:49:29'),(802,802,'20080412/1207926000','2011-09-28 19:49:37'),(803,803,'20080413/1208012400','2011-09-28 19:49:41'),(804,804,'20080414/1208098800','2011-09-28 19:49:44'),(805,805,'20080415/1208185200','2011-09-28 19:49:49'),(806,806,'20080416/1208271600','2011-09-28 19:49:53'),(807,807,'20080417/1208358000','2011-09-28 19:50:01'),(808,808,'20080418/1208444400','2011-09-28 19:50:04'),(809,809,'20080419/1208530800','2011-09-28 19:50:11'),(810,810,'20080420/1208617200','2011-09-28 19:50:14'),(811,811,'20080421/1208703600','2011-09-28 19:50:18'),(812,812,'20080422/1208790000','2011-09-28 19:50:22'),(813,813,'20080423/1208876400','2011-09-28 19:50:25'),(814,814,'20080424/1208962800','2011-09-28 19:50:29'),(815,815,'20080425/1209049200','2011-09-28 19:50:33'),(816,816,'20080426/1209135600','2011-09-28 19:50:37'),(817,817,'20080427/1209222000','2011-09-28 19:50:41'),(818,818,'20080428/1209308400','2011-09-28 19:50:48'),(819,819,'20080429/1209394800','2011-09-28 19:50:53'),(820,820,'20080430/1209481200','2011-09-28 19:50:57'),(821,821,'20080501/1209567600','2011-09-28 19:51:01'),(822,822,'20080502/1209654000','2011-09-28 19:51:04'),(823,823,'20080503/1209740400','2011-09-28 19:51:08');\r
+/*!40000 ALTER TABLE `hateda_letters` ENABLE KEYS */;\r
+UNLOCK TABLES;\r
+\r
+--\r
+-- Table structure for table `hateda_sections`\r
+--\r
+\r
+DROP TABLE IF EXISTS `hateda_sections`;\r
+CREATE TABLE `hateda_sections` (\r
+  `id` int(11) NOT NULL auto_increment,\r
+  `section_id` int(11) NOT NULL default '0',\r
+  `name` varchar(30) default NULL,\r
+  `upload_at` datetime default NULL,\r
+  PRIMARY KEY  (`id`),\r
+  UNIQUE KEY `index_hateda_sections_on_section_id` (`section_id`)\r
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\r
+\r
+--\r
+-- Dumping data for table `hateda_sections`\r
+--\r
+\r
+LOCK TABLES `hateda_sections` WRITE;\r
+/*!40000 ALTER TABLE `hateda_sections` DISABLE KEYS */;\r
+INSERT INTO `hateda_sections` VALUES (1,1,'20101001/1285858800','2013-02-12 10:58:51'),(2,2,'20101002/1285945200','2013-02-12 11:12:32'),(3,3,'20101003/1286031600','2013-02-12 11:13:42'),(4,4,'20101004/1286118000','2013-02-12 11:14:08'),(5,5,'20101005/1286204400','2013-02-12 11:14:35'),(6,6,'20101006/1286290800','2013-02-12 11:44:45'),(7,7,'20101007/1286377200','2013-02-12 11:45:04'),(8,8,'20101008/1286463600','2013-02-12 11:45:29'),(9,9,'20101009/1286550000','2013-02-12 11:45:48'),(10,10,'20101010/1286636400','2013-02-12 11:46:10'),(11,11,'20101011/1286722800','2013-02-13 11:39:27'),(12,12,'20101012/1286809200','2013-02-12 11:47:50'),(13,13,'20101013/1286895600','2013-02-12 11:48:22'),(14,14,'20101014/1286982000','2013-02-12 11:48:58'),(15,15,'20101015/1287068400','2013-02-12 11:49:48'),(16,16,'20101016/1287154800','2013-02-12 11:50:10'),(17,17,'20101017/1287241200','2013-02-12 11:50:30'),(18,18,'20101018/1287327600','2013-02-12 11:50:53'),(19,19,'20101019/1287414000','2013-02-12 11:51:16'),(20,20,'20101020/1287500400','2013-02-12 11:52:02'),(21,21,'20101021/1287586800','2013-02-13 10:31:46'),(22,22,'20101022/1287673200','2013-02-13 10:32:07'),(23,23,'20101023/1287759600','2013-02-13 10:32:27'),(24,24,'20101024/1287846000','2013-02-13 10:32:48'),(25,25,'20101025/1287932400','2013-02-13 10:33:17'),(26,26,'20101026/1288018800','2013-02-13 10:33:35'),(27,27,'20101027/1288105200','2013-02-13 10:34:00'),(28,28,'20101028/1288191600','2013-02-13 10:34:22'),(29,29,'20101029/1288278000','2013-02-13 10:36:37'),(30,30,'20101030/1288364400','2013-02-13 10:37:03'),(31,31,'20101031/1288450800','2013-02-13 10:46:13'),(32,32,'20101101/1288537200','2013-02-13 10:46:34'),(33,33,'20101102/1288623600','2013-02-13 10:47:08'),(34,34,'20101103/1288710000','2013-02-13 10:47:33'),(35,35,'20101104/1288796400','2013-02-13 10:47:51'),(36,36,'20101105/1288882800','2013-02-13 10:48:08'),(37,37,'20101106/1288969200','2013-02-13 10:48:27'),(38,38,'20101107/1289055600','2013-02-13 10:49:02'),(39,39,'20101108/1289142000','2013-02-13 10:49:30'),(40,40,'20101109/1289228400','2013-02-13 10:49:48'),(41,41,'20101110/1289314800','2013-02-13 11:16:04'),(42,42,'20101111/1289401200','2013-02-13 11:16:25'),(43,43,'20101112/1289487600','2013-02-13 11:16:42'),(44,44,'20101113/1289574000','2013-02-13 11:16:57'),(45,45,'20101114/1289660400','2013-02-13 11:17:24'),(46,46,'20101115/1289746800','2013-02-13 11:17:45'),(47,47,'20101116/1289833200','2013-02-13 11:18:01'),(48,48,'20101117/1289919600','2013-02-13 11:18:18'),(49,49,'20101118/1290006000','2013-02-13 11:18:35'),(50,50,'20101119/1290092400','2013-02-13 11:18:56'),(51,51,'20101120/1290178800','2013-02-13 11:22:20'),(52,52,'20101121/1290265200','2013-02-13 11:22:44'),(53,53,'20101122/1290351600','2013-02-13 11:23:02'),(54,54,'20101123/1290438000','2013-02-13 11:23:31'),(55,55,'20101124/1290524400','2013-02-13 11:23:59'),(56,56,'20101125/1290610800','2013-02-13 11:24:27'),(57,57,'20101126/1290697200','2013-02-13 11:24:49'),(58,58,'20101127/1290783600','2013-02-13 11:25:11'),(59,59,'20101128/1290870000','2013-02-13 11:25:29'),(60,60,'20101129/1290956400','2013-02-13 11:25:49'),(61,61,'20101130/1291042800','2013-02-13 11:30:31'),(62,62,'20101201/1291129200','2013-02-13 11:30:48'),(63,63,'20101202/1291215600','2013-02-13 11:31:13'),(64,64,'20101203/1291302000','2013-02-13 11:31:50'),(65,65,'20101204/1291388400','2013-02-13 11:32:35'),(66,66,'20101205/1291474800','2013-02-13 11:32:50'),(67,67,'20101206/1291561200','2013-02-13 11:33:11'),(68,68,'20101207/1291647600','2013-02-13 11:34:26'),(69,69,'20101208/1291734000','2013-02-13 11:34:57'),(70,70,'20101209/1291820400','2013-02-13 11:35:15'),(71,71,'20101210/1291906800','2013-02-13 11:35:34'),(72,72,'20101211/1291993200','2013-02-13 11:35:50'),(73,73,'20101212/1292079600','2013-02-13 11:36:08'),(74,74,'20101213/1292166000','2013-02-13 11:36:27'),(75,75,'20101214/1292252400','2013-02-13 11:36:44'),(76,76,'20101215/1292338800','2013-02-13 11:37:00'),(77,77,'20101216/1292425200','2013-02-13 11:37:18'),(78,78,'20101217/1292511600','2013-02-13 11:37:34'),(79,79,'20101218/1292598000','2013-02-13 11:37:51'),(80,80,'20101219/1292684400','2013-02-13 11:38:09'),(81,81,'20101220/1292770800','2013-02-13 11:38:38');\r
+/*!40000 ALTER TABLE `hateda_sections` ENABLE KEYS */;\r
+UNLOCK TABLES;\r
+\r
+--\r
+-- Table structure for table `hateda_themas`\r
+--\r
+\r
+DROP TABLE IF EXISTS `hateda_themas`;\r
+CREATE TABLE `hateda_themas` (\r
+  `id` int(11) NOT NULL auto_increment,\r
+  `thema_id` int(11) NOT NULL default '0',\r
+  `name` varchar(30) default NULL,\r
+  `upload_at` datetime default NULL,\r
+  PRIMARY KEY  (`id`),\r
+  UNIQUE KEY `index_hateda_themas_on_thema_id` (`thema_id`)\r
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\r
+\r
+--\r
+-- Dumping data for table `hateda_themas`\r
+--\r
+\r
+LOCK TABLES `hateda_themas` WRITE;\r
+/*!40000 ALTER TABLE `hateda_themas` DISABLE KEYS */;\r
+INSERT INTO `hateda_themas` VALUES (1,1,'20100110/1263049200','2012-01-07 07:48:38'),(2,2,NULL,'2011-05-18 11:51:26'),(3,3,'20100112/1263222000','2012-01-07 07:48:43'),(4,4,'20100113/1263308400','2012-01-07 07:48:48'),(5,5,'20100114/1263394800','2012-01-07 07:48:57'),(6,6,NULL,'2011-05-18 11:51:27'),(7,7,'20100116/1263567600','2012-01-07 07:49:07'),(8,8,'20100117/1263654000','2012-01-07 07:49:13'),(9,9,'20100118/1263740400','2012-01-07 07:49:17'),(10,10,'20100119/1263826800','2013-02-12 10:49:46'),(11,11,'20100120/1263913200','2012-01-07 07:49:41'),(12,12,'20100121/1263999600','2012-01-07 07:49:55'),(13,13,'20100122/1264086000','2012-01-07 07:49:59'),(14,14,'20100123/1264172400','2012-01-07 07:50:04'),(15,15,'20100124/1264258800','2012-01-07 07:50:14'),(16,16,NULL,NULL),(17,17,'20100126/1264431600','2012-01-07 07:50:18'),(18,18,'20100127/1264518000','2012-01-07 07:50:23'),(19,19,'20100128/1264604400','2012-01-07 07:50:28'),(20,20,'20100129/1264690800','2012-01-07 07:50:34'),(21,21,'20100130/1264777200','2012-01-07 07:50:39');\r
+/*!40000 ALTER TABLE `hateda_themas` ENABLE KEYS */;\r
+UNLOCK TABLES;\r
+\r
+--\r
+-- Table structure for table `hateda_words`\r
+--\r
+\r
+DROP TABLE IF EXISTS `hateda_words`;\r
+CREATE TABLE `hateda_words` (\r
+  `id` int(11) NOT NULL auto_increment,\r
+  `word_id` int(11) NOT NULL default '0',\r
+  `name` varchar(30) default NULL,\r
+  `upload_at` datetime default NULL,\r
+  PRIMARY KEY  (`id`),\r
+  UNIQUE KEY `index_hateda_words_on_word_id` (`word_id`)\r
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\r
+\r
+--\r
+-- Dumping data for table `hateda_words`\r
+--\r
+\r
+LOCK TABLES `hateda_words` WRITE;\r
+/*!40000 ALTER TABLE `hateda_words` DISABLE KEYS */;\r
+INSERT INTO `hateda_words` VALUES (1,1,'20090201/1233414000','2011-09-28 19:52:37'),(2,2,'20090202/1233500400','2011-09-28 19:52:43'),(3,3,'20090203/1233586800','2011-09-28 19:52:50'),(4,4,'20090204/1233673200','2011-09-28 19:53:01'),(5,5,'20090205/1233759600','2011-09-28 19:53:09'),(6,6,'20090206/1233846000','2011-09-28 19:53:14'),(7,7,'20090207/1233932400','2011-09-28 19:53:25'),(8,8,'20090208/1234018800','2011-09-28 19:53:29'),(9,9,'20090209/1234105200','2011-09-28 19:53:33'),(10,10,'20090210/1234191600','2011-09-28 19:53:38'),(11,11,'20090211/1234278000','2011-09-28 19:53:42'),(12,12,'20090212/1234364400','2011-09-28 19:53:46'),(13,13,'20090213/1234450800','2011-09-28 19:53:51'),(14,14,'20090214/1234537200','2011-09-28 19:53:56'),(15,15,'20090215/1234623600','2011-09-28 19:54:00'),(16,16,'20090216/1234710000','2011-09-28 19:54:04'),(17,17,NULL,'2011-05-18 11:51:10'),(18,18,'20090218/1234882800','2011-09-28 19:54:09'),(19,19,'20090219/1234969200','2011-09-28 19:54:15'),(20,20,'20090220/1235055600','2011-09-28 19:54:19'),(21,21,'20090221/1235142000','2011-09-28 19:54:23'),(22,22,'20090222/1235228400','2011-09-28 19:54:27'),(23,23,'20090223/1235314800','2011-09-28 19:54:31'),(24,24,'20090224/1235401200','2011-09-28 19:54:40'),(25,25,NULL,'2011-05-18 11:51:10'),(26,26,'20090226/1235574000','2011-09-28 19:54:45'),(27,27,'20090227/1235660400','2011-09-28 19:54:50'),(28,28,'20090228/1235746800','2011-09-28 19:54:56'),(29,29,'20090301/1235833200','2011-09-28 19:55:00'),(30,30,'20090302/1235919600','2011-09-28 19:55:04'),(31,31,'20090303/1236006000','2011-09-28 19:55:08'),(32,32,NULL,'2011-05-18 11:51:11'),(33,33,NULL,'2011-05-18 11:51:11'),(34,34,'20090306/1236265200','2011-09-28 19:55:13'),(35,35,'20090307/1236351600','2011-09-28 19:55:17'),(36,36,'20090308/1236438000','2011-09-28 19:55:21'),(37,37,'20090309/1236524400','2011-09-28 19:55:26'),(38,38,'20090310/1236610800','2011-09-28 19:55:29'),(39,39,'20090311/1236697200','2011-09-28 19:55:34'),(40,40,'20090312/1236783600','2011-09-28 19:55:40'),(41,41,'20090313/1236870000','2011-09-28 19:55:44'),(42,42,'20090314/1236956400','2011-09-28 19:55:48'),(43,43,'20090315/1237042800','2011-09-28 19:55:53'),(44,44,'20090316/1237129200','2011-09-28 19:55:59'),(45,45,'20090317/1237215600','2011-09-28 19:56:04'),(46,46,'20090318/1237302000','2011-09-28 19:56:08'),(47,47,'20090319/1237388400','2011-09-28 19:56:13'),(48,48,'20090320/1237474800','2011-09-28 19:56:17'),(49,49,'20090321/1237561200','2011-09-28 19:56:23'),(50,50,'20090322/1237647600','2011-09-28 19:56:28'),(51,51,'20090323/1237734000','2011-09-28 19:56:32'),(52,52,'20090324/1237820400','2011-09-28 19:56:36'),(53,53,'20090325/1237906800','2011-09-28 19:56:41'),(55,55,'20090327/1238079600','2011-09-28 19:56:45'),(56,56,'20090328/1238166000','2011-09-28 19:56:49'),(57,57,'20090329/1238252400','2011-09-28 19:56:54'),(58,58,'20090330/1238338800','2011-09-28 19:56:58'),(59,59,NULL,'2011-05-18 11:51:12'),(60,60,'20090401/1238511600','2011-09-28 19:57:02'),(61,61,'20090402/1238598000','2011-09-28 19:57:07'),(62,62,'20090403/1238684400','2011-09-28 19:57:11'),(63,63,'20090404/1238770800','2011-09-28 19:57:16'),(64,64,'20090405/1238857200','2011-09-28 19:57:20'),(65,65,'20090406/1238943600','2011-09-28 19:57:25'),(66,66,NULL,'2011-05-18 11:51:12'),(67,67,'20090408/1239116400','2011-09-28 19:57:30'),(68,68,'20090409/1239202800','2011-09-28 19:57:34'),(69,69,'20090410/1239289200','2011-09-28 19:57:37'),(70,70,'20090411/1239375600','2011-09-28 19:57:42'),(71,71,'20090412/1239462000','2011-09-28 19:57:46'),(72,72,'20090413/1239548400','2011-09-28 19:57:50'),(73,73,'20090414/1239634800','2011-09-28 19:58:00'),(74,74,'20090415/1239721200','2011-09-28 19:58:04'),(75,75,'20090416/1239807600','2011-09-28 19:58:08'),(76,76,'20090417/1239894000','2011-09-28 19:58:12'),(77,77,'20090418/1239980400','2011-09-28 19:58:16'),(78,78,'20090419/1240066800','2011-09-28 19:58:20'),(79,79,'20090420/1240153200','2011-09-28 19:58:24'),(80,80,'20090421/1240239600','2011-09-28 19:58:28'),(81,81,'20090422/1240326000','2011-09-28 19:58:32'),(82,82,'20090423/1240412400','2011-09-28 19:58:36'),(83,83,'20090424/1240498800','2011-09-28 19:58:40'),(84,84,'20090425/1240585200','2011-09-28 19:58:44'),(85,85,'20090426/1240671600','2011-09-28 19:58:48'),(86,86,'20090427/1240758000','2011-09-28 19:58:53'),(87,87,'20090428/1240844400','2011-09-28 19:58:57'),(88,88,'20090429/1240930800','2011-09-28 19:59:01'),(89,89,'20090430/1241017200','2011-09-28 19:59:05'),(90,90,'20090501/1241103600','2011-09-28 19:59:15'),(91,91,'20090502/1241190000','2011-09-28 19:59:21'),(92,92,'20090503/1241276400','2011-09-28 19:59:31'),(93,93,'20090504/1241362800','2011-09-28 19:59:35'),(94,94,'20090505/1241449200','2011-09-28 19:59:39'),(95,95,'20090506/1241535600','2011-09-28 19:59:44'),(96,96,'20090507/1241622000','2011-09-28 19:59:48'),(100,100,'20090511/1241967600','2011-09-28 19:59:52'),(101,101,'20090512/1242054000','2011-09-28 19:59:57'),(102,102,'20090513/1242140400','2011-09-28 20:00:01'),(103,103,NULL,'2011-05-18 11:51:13'),(104,104,'20090515/1242313200','2011-09-28 20:00:05'),(105,105,'20090516/1242399600','2011-09-28 20:00:09'),(106,106,'20090517/1242486000','2011-09-28 20:00:13'),(107,107,'20090518/1242572400','2011-09-28 20:00:28'),(108,108,'20090519/1242658800','2011-09-28 20:00:32'),(109,109,'20090520/1242745200','2011-09-28 20:00:36'),(110,110,'20090521/1242831600','2011-09-28 20:00:41'),(111,111,'20090522/1242918000','2011-09-28 20:00:46'),(112,112,'20090523/1243004400','2011-09-28 20:00:53'),(113,113,'20090524/1243090800','2011-09-28 20:00:57'),(114,114,'20090525/1243177200','2011-09-28 20:01:02'),(115,115,'20090526/1243263600','2011-09-28 20:01:08'),(116,116,'20090527/1243350000','2011-09-28 20:01:13'),(117,117,'20090528/1243436400','2011-09-28 20:01:18'),(118,118,'20090529/1243522800','2011-09-28 20:01:22'),(119,119,'20090530/1243609200','2011-09-28 20:01:27'),(120,120,'20090531/1243695600','2011-09-28 20:01:31'),(121,121,'20090601/1243782000','2011-09-28 20:01:35'),(122,122,'20090602/1243868400','2011-09-28 20:01:39'),(123,123,'20090603/1243954800','2011-09-28 20:01:44'),(124,124,'20090604/1244041200','2011-09-28 20:01:48'),(125,125,'20090605/1244127600','2011-09-28 20:01:52'),(126,126,'20090606/1244214000','2011-09-28 20:01:56'),(127,127,'20090607/1244300400','2011-09-28 20:02:00'),(128,128,'20090608/1244386800','2011-09-28 20:02:04'),(129,129,'20090609/1244473200','2011-09-28 20:02:08'),(130,130,'20090610/1244559600','2011-09-28 20:02:12'),(131,131,'20090611/1244646000','2011-09-28 20:02:16'),(132,132,'20090612/1244732400','2011-09-28 20:02:24'),(133,133,'20090613/1244818800','2011-09-28 20:02:32'),(135,135,'20090615/1244991600','2011-09-28 20:02:36'),(136,136,'20090616/1245078000','2011-09-28 20:02:41'),(137,137,'20090617/1245164400','2011-09-28 20:02:45'),(138,138,'20090618/1245250800','2011-09-28 20:02:49'),(139,139,'20090619/1245337200','2011-09-28 20:02:54'),(140,140,'20090620/1245423600','2011-09-28 20:02:59'),(141,141,'20090621/1245510000','2011-09-28 20:03:03'),(142,142,'20090622/1245596400','2011-09-28 20:03:07'),(143,143,'20090623/1245682800','2011-09-28 20:03:11'),(145,145,NULL,'2011-05-18 11:51:14'),(146,146,'20090626/1245942000','2011-09-28 20:03:17'),(147,147,'20090627/1246028400','2011-09-28 20:03:21'),(148,148,'20090628/1246114800','2011-09-28 20:03:28'),(149,149,'20090629/1246201200','2011-09-28 20:03:32'),(150,150,'20090630/1246287600','2011-09-28 20:03:39'),(151,151,'20090701/1246374000','2011-09-28 20:03:43'),(152,152,'20090702/1246460400','2011-09-28 20:03:50'),(153,153,'20090703/1246546800','2011-09-28 20:03:54'),(154,154,'20090704/1246633200','2011-09-28 20:03:58'),(155,155,'20090705/1246719600','2011-09-28 20:04:02'),(156,156,'20090706/1246806000','2011-09-28 20:04:07'),(157,157,'20090707/1246892400','2011-09-28 20:04:11'),(158,158,'20090708/1246978800','2011-09-28 20:04:14'),(159,159,'20090709/1247065200','2011-09-28 20:04:22'),(160,160,'20090710/1247151600','2011-09-28 20:04:26'),(161,161,'20090711/1247238000','2011-09-28 20:04:29'),(162,162,'20090712/1247324400','2011-09-28 20:04:33'),(163,163,'20090713/1247410800','2011-09-28 20:04:38'),(164,164,'20090714/1247497200','2011-09-28 20:04:43'),(165,165,'20090715/1247583600','2011-09-28 20:04:49'),(166,166,'20090716/1247670000','2011-09-28 20:04:53'),(167,167,'20090717/1247756400','2011-09-28 20:04:57'),(168,168,'20090718/1247842800','2011-09-28 20:05:01'),(169,169,'20090719/1247929200','2011-09-28 20:05:04'),(170,170,'20090720/1248015600','2011-09-28 20:05:09'),(171,171,'20090721/1248102000','2011-09-28 20:05:13'),(172,172,'20090722/1248188400','2011-09-28 20:05:17'),(173,173,'20090723/1248274800','2011-09-28 20:05:21'),(174,174,'20090724/1248361200','2011-09-28 20:05:28'),(175,175,NULL,'2011-05-18 11:51:15'),(176,176,'20090726/1248534000','2011-09-28 20:05:32'),(177,177,'20090727/1248620400','2011-09-28 20:05:41'),(178,178,'20090728/1248706800','2011-09-28 20:05:45'),(179,179,'20090729/1248793200','2011-09-28 20:05:50'),(180,180,'20090730/1248879600','2011-09-28 20:05:54'),(181,181,NULL,'2011-05-18 11:51:15'),(182,182,NULL,'2011-05-18 11:51:15'),(183,183,'20090802/1249138800','2011-09-28 20:05:58'),(184,184,'20090803/1249225200','2011-09-28 20:06:02'),(185,185,'20090804/1249311600','2011-09-28 20:06:06'),(186,186,'20090805/1249398000','2011-09-28 20:06:11'),(187,187,'20090806/1249484400','2011-09-28 20:06:15'),(188,188,'20090807/1249570800','2011-09-28 20:06:19'),(189,189,'20090808/1249657200','2011-09-28 20:06:24'),(190,190,'20090809/1249743600','2011-09-28 20:06:29'),(191,191,'20090810/1249830000','2011-09-28 20:06:34'),(192,192,'20090811/1249916400','2011-09-28 20:06:39'),(193,193,'20090812/1250002800','2011-09-28 20:06:44'),(194,194,'20090813/1250089200','2011-09-28 20:06:48'),(195,195,'20090814/1250175600','2011-09-28 20:06:52'),(196,196,'20090815/1250262000','2011-09-28 20:06:56'),(197,197,'20090816/1250348400','2011-09-28 20:07:00'),(198,198,'20090817/1250434800','2011-09-28 20:07:03'),(199,199,'20090818/1250521200','2011-09-28 20:07:07'),(200,200,'20090819/1250607600','2011-09-28 20:07:11'),(201,201,'20090820/1250694000','2011-09-28 20:07:15'),(202,202,'20090821/1250780400','2011-09-28 20:07:20'),(203,203,'20090822/1250866800','2011-09-28 20:07:24'),(204,204,'20090823/1250953200','2011-09-28 20:07:28'),(205,205,'20090824/1251039600','2011-09-28 20:07:32'),(206,206,'20090825/1251126000','2011-09-28 20:07:36'),(207,207,'20090826/1251212400','2011-09-28 20:07:40'),(208,208,'20090827/1251298800','2011-09-28 20:07:44'),(209,209,'20090828/1251385200','2011-09-28 20:07:48'),(210,210,'20090829/1251471600','2011-09-28 20:07:53'),(211,211,'20090830/1251558000','2011-09-28 20:07:57'),(212,212,'20090831/1251644400','2011-09-28 20:08:01'),(213,213,'20090901/1251730800','2011-09-28 20:08:05'),(214,214,'20090902/1251817200','2011-09-28 20:08:11'),(215,215,'20090903/1251903600','2011-09-28 20:08:15'),(216,216,'20090904/1251990000','2011-09-28 20:08:19'),(217,217,'20090905/1252076400','2011-09-28 20:08:23'),(218,218,'20090906/1252162800','2011-09-28 20:08:28'),(219,219,'20090907/1252249200','2011-09-28 20:08:32'),(220,220,'20090908/1252335600','2011-09-28 20:08:36'),(221,221,'20090909/1252422000','2011-09-28 20:08:45'),(222,222,'20090910/1252508400','2011-09-28 20:08:49'),(223,223,'20090911/1252594800','2011-09-28 20:08:52'),(224,224,'20090912/1252681200','2011-09-28 20:08:57'),(225,225,'20090913/1252767600','2011-09-28 20:09:01'),(226,226,'20090914/1252854000','2011-09-28 20:09:04'),(227,227,'20090915/1252940400','2011-09-28 20:09:09'),(228,228,'20090916/1253026800','2011-09-28 20:09:20'),(229,229,'20090917/1253113200','2011-09-28 20:09:25'),(230,230,'20090918/1253199600','2011-09-28 20:09:29'),(231,231,'20090919/1253286000','2011-09-28 20:09:33'),(232,232,'20090920/1253372400','2011-09-28 20:09:37'),(233,233,'20090921/1253458800','2011-09-28 20:09:44'),(234,234,'20090922/1253545200','2011-09-28 20:09:48'),(235,235,'20090923/1253631600','2011-09-28 20:09:54'),(236,236,'20090924/1253718000','2011-09-28 20:09:58'),(237,237,NULL,'2011-07-14 17:20:23'),(238,238,'20090926/1253890800','2011-09-28 20:10:02'),(239,239,'20090927/1253977200','2011-09-28 20:10:09'),(240,240,'20090928/1254063600','2011-09-28 20:10:13'),(241,241,'20090929/1254150000','2011-09-28 20:10:17');\r
+/*!40000 ALTER TABLE `hateda_words` ENABLE KEYS */;\r
+UNLOCK TABLES;\r
+\r
+--\r
+-- Table structure for table `letters`\r
+--\r
+\r
+DROP TABLE IF EXISTS `letters`;\r
+CREATE TABLE `letters` (\r
+  `id` int(11) NOT NULL auto_increment,\r
+  `letter` varchar(4) NOT NULL,\r
+  `count` int(11) NOT NULL default '1',\r
+  `yomi` text NOT NULL,\r
+  `detail` text,\r
+  `update_at` datetime default NULL,\r
+  PRIMARY KEY  (`id`),\r
+  UNIQUE KEY `index_letters_on_letter` (`letter`),\r
+  KEY `index_letters_on_count` (`count`)\r
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\r
+\r
+--\r
+-- Dumping data for table `letters`\r
+--\r
+\r
+LOCK TABLES `letters` WRITE;\r
+/*!40000 ALTER TABLE `letters` DISABLE KEYS */;\r
+INSERT INTO `letters` VALUES (1,'道',76,'みち','[目に見えない超自然的な何か。]道路のことではない。//実体がなく見ることも触ることもできないが、この世のすべてを作り出した。//創造主という意味ではキリスト教の神に似ているか。神は人間にわかりやすいよう、イエスという人間の姿を借りて人を導いたんだとか。/道も一神教で置き換えるとわかりやすいのかもしれない。//→{t:1}','2012-01-07 07:40:13'),(2,'可',35,'べ-き','[~するべき。]','2012-01-07 07:40:14'),(3,'非',11,'あら-ず','~にあらず。~ではない。{l:不}や{l:弗}と意味は同じ。','2012-01-07 07:40:14'),(4,'常',30,'つね','[いつも。]/→{t:12}','2012-01-07 07:40:14'),(5,'名',25,'な','[名前。]/目に見えたり触れたり、五感でとらえられて、固有名詞や形容詞であらわせるもの。','2012-01-07 07:40:15'),(6,'無',101,'','','2012-01-07 07:40:16'),(7,'天',92,'てん','[宇宙。]/この当時、太陽は地と空の間を浮遊していると考えられていたので、現代人が言う天よりはスケールが大きいと思っていい。','2012-01-07 07:40:17'),(8,'地',18,'ち','[大地。]','2012-01-07 07:40:17'),(9,'之',252,'','','2012-01-07 07:40:18'),(10,'始',7,'シ','[はじめ。始まり。]','2012-01-07 07:40:19'),(11,'有',82,'','','2012-01-07 07:40:20'),(12,'萬',21,'バン|まん','[万の旧字。]','2012-01-07 07:40:20'),(13,'物',36,'もの','[物体。生物や人も含む。]','2012-01-07 07:40:21'),(14,'母',7,'はは','物を生み出す力を持った偉大な存在。//ちなみに{l:ちち}は一度しか出てこない。','2012-01-07 07:40:21'),(15,'故',63,'ゆえ|もと','[理由。~ゆえに。]/[もと。もとから。]','2012-01-07 07:40:23'),(16,'欲',27,'','','2012-01-07 07:40:23'),(17,'以',163,'もって','[理由を表す言葉。そういう理由で~]/','2012-01-07 07:40:24'),(18,'觀',9,'み-る/かん','観の旧字。','2012-01-07 07:40:24'),(19,'其',143,'そ-の|そ-れ','[その~。それは~]','2012-01-07 07:40:25'),(20,'妙',4,'みょう','本質。/絶妙で絶対的な本質といったところか。/→{t:12}','2012-01-07 07:40:25'),(21,'徼',1,'きょう','辺境。境い目。/中心部分から遠く離れて、間違っていないが見当違いなところ。','2012-01-07 07:40:25'),(22,'此',16,'こ-れ|こ-の','[指示語。これ、この。]/これという意味では「{l:是}れ」もある。','2012-01-07 07:40:26'),(23,'兩',5,'りょう','両の旧字。/ふたつの意味。','2012-01-07 07:40:26'),(24,'者',93,'もの','[人物。物の意味で使われることもある。]','2012-01-07 07:40:27'),(25,'同',11,'','','2012-01-07 07:40:27'),(26,'出',7,'','','2012-01-07 07:40:27'),(27,'而',121,'しかして','[~して、そして。]/前の言葉をさらに接ぐときの言葉。~して、そして、~して、さらに、といった具合につなぐ。老子の場合、前の言葉を否定する使い方を多用するので、~なるも、~でありながらも、のように「も」で読んだほうがつながりやすいので、そう読むことにした章もある。','2012-01-07 07:40:29'),(28,'異',2,'','','2012-01-07 07:40:29'),(29,'謂',35,'い-う','[言葉を口に出す。]/{l:言}との違いは?','2012-01-07 07:40:29'),(30,'玄',12,'げん','[神秘的な。奥深い。]/光の加減で赤にも黒にも見える深い色。/色が変化して見える不思議さから、神秘的・奥深いといった意味合いを持つようになった。','2012-01-07 07:40:29'),(31,'又',2,'','','2012-01-07 07:40:30'),(32,'衆',9,'','','2012-01-07 07:40:30'),(33,'門',5,'もん','[出入り口。]/目鼻口耳の穴。女性器。心への出入口として頭脳も含む。','2012-01-07 07:40:30'),(34,'下',82,'','','2012-01-07 07:40:31'),(35,'皆',8,'','','2012-01-07 07:40:31'),(36,'知',60,'チ','[知ること。]/→{t:18}','2012-01-07 07:40:32'),(37,'美',9,'','','2012-01-07 07:40:32'),(38,'爲',108,'な-す|た-る','為の旧字。/[実践する。やり終える。]/象を使役して土木建築を完成させる様子が文字になったもの。','2012-01-07 07:40:33'),(39,'斯',2,'これ','[この。これ。]','2012-01-07 07:40:33'),(40,'惡',7,'にく-む|あく','[嫌う。悪の旧字。]/字源は霊安室。死体を置く場所だから嫌われる。','2012-01-07 07:40:34'),(41,'已',9,'のみ|や-む','[~だけ。]/[やめる。終わる。「やむを得ず」のやむ。]','2012-01-07 07:40:34'),(42,'善',52,'ゼン|よ-い','[良い。]/能くと善くは大きな違いはないっぽい。善くは属性の良し悪しか。','2012-01-07 07:40:35'),(43,'不',247,'','','2012-01-07 07:40:37'),(44,'相',14,'','','2012-01-07 07:40:37'),(45,'生',38,'','','2012-01-07 07:40:37'),(46,'難',13,'','','2012-01-07 07:40:38'),(47,'易',11,'','','2012-01-07 07:40:38'),(48,'成',18,'','','2012-01-07 07:40:38'),(49,'長',16,'','','2012-01-07 07:40:38'),(50,'短',1,'','','2012-01-07 07:40:39'),(52,'高',4,'','','2012-01-07 07:40:39'),(53,'傾',1,'','','2012-01-07 07:40:39'),(54,'音',3,'','','2012-01-07 07:40:39'),(55,'聲',3,'こえ','[声のこと。]/肉声に限らず、自然の物音や声にならない声も含む。','2012-01-07 07:40:39'),(56,'和',8,'','','2012-01-07 07:40:39'),(57,'前',3,'','','2012-01-07 07:40:39'),(58,'後',11,'','','2012-01-07 07:40:39'),(59,'隨',3,'したが-う','[従う。位置的に後ろに着いて歩く。]','2012-01-07 07:40:39'),(60,'是',72,'こ-れ|こ-こ','[指示語。これ、ここ。]/「{l:此}れ」もある。','2012-01-07 07:40:41'),(61,'聖',33,'セイ','[神の声を聞く人。]/つま先立ちして耳を澄まして神の声を聞く人。','2012-01-07 07:40:42'),(62,'人',85,'','','2012-01-07 07:40:43'),(63,'處',13,'お-る','[処の旧字。]','2012-01-07 07:40:43'),(64,'事',22,'こと/つか-うる','[事件。]/[従事すること。]','2012-01-07 07:40:43'),(65,'行',20,'','','2012-01-07 07:40:44'),(66,'言',22,'ゲン|い-う','[言う。]/ただしゃべるだけでなく、神に誓って宣言するくらいの勢いがあったらしい。','2012-01-07 07:40:45'),(67,'教',5,'','','2012-01-07 07:40:45'),(68,'作',7,'おこ-る','[起きる。発生する。]','2012-01-07 07:40:45'),(69,'焉',7,'えん','[意味なし。]文末にあるときは、読まない。/[ここに。]','2012-01-07 07:40:45'),(70,'辭',2,'ジ|ことば','[辞の旧字。言葉。]','2012-01-07 07:40:45'),(71,'恃',5,'','','2012-01-07 07:40:45'),(72,'功',7,'','','2012-01-07 07:40:45'),(73,'居',11,'','','2012-01-07 07:40:46'),(74,'夫',30,'そ-れ','それ。その。英語でいうit。','2012-01-07 07:40:46'),(75,'唯',19,'ただ','[たったひとつをひたすらに。]','2012-01-07 07:40:46'),(76,'去',10,'','','2012-01-07 07:40:47'),(77,'尚',4,'しょう/たっと-ぶ/なお','尊敬する。厚遇する。','2012-01-07 07:40:47'),(78,'賢',3,'けん','[かしこい。]/[賢者。]','2012-01-07 07:40:47'),(79,'使',11,'し','[~させる。(命令形)]AをしてB(せ) しむ(使む) 。/[使う。]','2012-01-07 07:40:48'),(80,'民',33,'たみ','国民。','2012-01-07 07:40:48'),(81,'爭',10,'そう/あらそ-う','[競争。勝負ごと。]','2012-01-07 07:40:48'),(82,'貴',22,'とおと-ぶ','[尊重する。貴重なものとして丁重に扱う。]','2012-01-07 07:40:49'),(83,'得',32,'','','2012-01-07 07:40:50'),(84,'貨',5,'','','2012-01-07 07:40:50'),(85,'盜',1,'','','2012-01-07 07:40:50'),(86,'見',14,'み-る|あらわ-す','[目で見ること。]超常現象が見えるのは視る。/[現す。見えるようにする。]/見ると見せるが同じ文字だから、判断が難しい。','2012-01-07 07:40:51'),(87,'心',10,'','','2012-01-07 07:40:51'),(88,'亂',4,'ラン','[乱の旧字。乱れる。]','2012-01-07 07:40:51'),(89,'治',13,'ち','[政治。]/[統治。]/老子の意見では何もしないで民を愚かにして治める。/→{t:5}','2012-01-07 07:40:52'),(90,'虚',5,'きょ|むな-しい','からっぽ。','2012-01-07 07:40:53'),(91,'實',2,'み','実の旧字。果物の実。これまでの成果が結実する最終段階。/いっぱいにする。','2012-01-07 07:40:53'),(92,'腹',2,'はら','心。心根。肝っ玉。','2012-01-07 07:40:53'),(93,'弱',10,'','','2012-01-07 07:40:53'),(94,'志',3,'こころざし','向上心。目標。/{s:33}では、肯定的な意味で使われているので、必ずしも否定されるものではないらしい。','2012-01-07 07:40:53'),(95,'強',21,'つよ-い|しい-る','[力が強いこと。]/[無理をする。無理強いする。]','2012-01-07 07:40:54'),(96,'骨',2,'ほね','骨。骨格。体の芯。','2012-01-07 07:40:54'),(97,'敢',11,'','','2012-01-07 07:40:55'),(98,'也',11,'なり','[意味はない。~なり。]','2012-01-07 07:40:55'),(99,'則',32,'すなわ-ち|のっと-る','[つまり。したがって。]/[決まり事などに従うこと。]','2012-01-07 07:40:57'),(100,'冲',2,'チュウ','[{l:沖}と同じか。]','2012-01-07 07:40:57'),(101,'用',21,'','','2012-01-07 07:40:58'),(102,'或',18,'ある|あるいは','[ある人。ある物。]/[あるいは。もしくは]','2012-01-07 07:40:58'),(103,'盈',8,'エイ|み-ちる','[みちる。みたす。]','2012-01-07 07:40:58'),(104,'淵',3,'えん|ふち','水が深く静かに貯まっている場所。その様子。','2012-01-07 07:40:59'),(105,'兮',27,'','[置き字。]意味はなく、調子を整え、前の言葉を強める字。','2012-01-07 07:40:59'),(106,'似',5,'','','2012-01-07 07:40:59'),(107,'宗',2,'そう','[先祖。]/物事が始まったルーツ。/[主張。]/話したいことのテーマ。','2012-01-07 07:40:59'),(108,'挫',2,'くじ-く','[くじける。]/折れ曲がって壊れる。','2012-01-07 07:41:00'),(109,'鋭',3,'エイ','[するどい。よく切れる。]/[勘が良い。才能がある。]','2012-01-07 07:41:00'),(110,'解',3,'カイ|と-く','[バラバラにする。]/[問題などをときほぐす。]','2012-01-07 07:41:01'),(111,'紛',2,'フン','[入り乱れてわからなくなる。]','2012-01-07 07:41:01'),(112,'光',4,'','','2012-01-07 07:41:01'),(113,'塵',2,'ちり','[小さなゴミ。]','2012-01-07 07:41:01'),(114,'湛',1,'たん','[水がどっしりと湛(たた)えられている様子。]','2012-01-07 07:41:01'),(115,'存',4,'','','2012-01-07 07:41:01'),(116,'吾',22,'わ-れ','[私。老子のこと。]','2012-01-07 07:41:02'),(117,'誰',1,'','','2012-01-07 07:41:02'),(118,'子',8,'','','2012-01-07 07:41:02'),(119,'象',5,'しょう','[形。]','2012-01-07 07:41:02'),(120,'帝',1,'てい','[天帝。宇宙を支配する絶対的な存在。]/天帝からのメッセージを受ける資格(能力)を持つ者を皇帝という。よって、皇帝は天帝と人類の中間管理職。','2012-01-07 07:41:02'),(121,'先',8,'','','2012-01-07 07:41:04'),(122,'仁',8,'ジン','[思いやり。あるいは、まごころ。]/儒教ではもっとも大切にされる。人間には仁さえあれば良いが、それを続けるには義が必要とされる。/字形は座った人の尻の下に2枚の敷物がある様子。身体が冷えないよう、自分の敷物を貸す気持ちかな。','2012-01-07 07:41:04'),(123,'芻',2,'','','2012-01-07 07:41:04'),(124,'狗',2,'','','2012-01-07 07:41:04'),(125,'百',7,'','','2012-01-07 07:41:04'),(126,'姓',4,'','','2012-01-07 07:41:04'),(127,'間',2,'','','2012-01-07 07:41:04'),(128,'猶',6,'なお|ゆう','[あたかも~のようだ。]/[まだまだ。]/[余裕があるゆったりとした様子。]','2012-01-07 07:41:05'),(129,'槖',1,'','','2012-01-07 07:41:05'),(130,'籥',1,'','','2012-01-07 07:41:06'),(131,'乎',11,'こ|か','[日本語では特に意味はない。]/「~か!」くらいのビックリマーク的な意味。','2012-01-07 07:41:06'),(132,'屈',1,'クツ','[曲がる。かがむ。]/[くじける。]','2012-01-07 07:41:07'),(133,'動',5,'','','2012-01-07 07:41:13'),(134,'愈',3,'いよいよ','[より一層。]','2012-01-07 07:41:13'),(135,'多',14,'','','2012-01-07 07:41:14'),(136,'數',3,'かぞ-える','数の旧字。/[数える。計算する。]/[あまたに。数多く。]','2012-01-07 07:41:15'),(137,'窮',2,'きわ-まる','[行き詰まる。どうにもならなくなる。]','2012-01-07 07:41:16'),(138,'如',10,'','','2012-01-07 07:41:16'),(139,'守',11,'','','2012-01-07 07:41:18'),(140,'中',7,'ちゅう','[中央。真ん中。]/','2012-01-07 07:41:21'),(141,'谷',10,'たに','[川のこと。]/中国ではたびたび川の流れが変わるので空っぽの谷でも川と同じ扱いなのかな。','2012-01-07 07:41:22'),(142,'神',8,'かみ','[福を与える霊。]/鬼神といって災いをなす鬼とセットで語られる。','2012-01-07 07:41:26'),(143,'死',18,'','','2012-01-07 07:41:26'),(144,'牝',5,'ひん','[めす。雌。]','2012-01-07 07:41:26'),(145,'根',5,'ね|こん','[植物の根。]/[根本。基礎。]/[始まり。ルーツ。]','2012-01-07 07:41:26'),(146,'綿',2,'','','2012-01-07 07:41:26'),(147,'若',45,'ごと-し|も-し','[まるで~のようだ。]/[もし~ならば。]','2012-01-07 07:41:26'),(148,'勤',3,'きん','[尽くす。]/[労(つか)れる。]/','2012-01-07 07:41:27'),(149,'久',10,'','','2012-01-07 07:41:27'),(150,'所',27,'','','2012-01-07 07:41:28'),(151,'能',32,'よ-く','[じょうずに。]/「善く」との違いはあまりないっぽい。','2012-01-07 07:41:29'),(152,'且',5,'かつ|まさに','[さらに、その上に。]/[まさに~せんとす。]','2012-01-07 07:41:29'),(153,'自',33,'','','2012-01-07 07:41:30'),(154,'身',23,'','','2012-01-07 07:41:30'),(155,'外',1,'','','2012-01-07 07:41:30'),(156,'私',3,'','','2012-01-07 07:41:30'),(157,'耶',3,'','','2012-01-07 07:41:30'),(158,'上',20,'','','2012-01-07 07:41:31'),(159,'水',3,'みず','[水。]/もっとも道に近い声質を持つ見習うべき存在。/→{t:8}','2012-01-07 07:41:31'),(160,'利',10,'','','2012-01-07 07:41:31'),(163,'幾',4,'ちか-い','[近い。]「幾●」で、「●に近い」から、「ほとんど●」とも読める。','2012-01-07 07:41:31'),(164,'於',48,'おいて','[~(場所)において。]/[に。日本語では「に」と送り仮名を振るだけで意味はない。]','2012-01-07 07:41:32'),(165,'與',15,'よ','与の旧字。/[与える。]/[仲間になる。くみする。]/[~と。英語でいうand]','2012-01-07 07:41:32'),(166,'信',15,'','','2012-01-07 07:41:33'),(167,'正',7,'セイ','[正しいこと。正義。]/老子にとって正義とは何もしないこと。/→{t:3}','2012-01-07 07:41:33'),(168,'時',1,'','','2012-01-07 07:41:34'),(169,'尤',1,'とが-める|もっと-も','[過ちを責められる。咎めると同じ。]/[優れている。最も。]','2012-01-07 07:41:35'),(170,'持',3,'','','2012-01-07 07:41:36'),(171,'揣',1,'きた-える','[端の字でしょう。]','2012-01-07 07:41:36'),(172,'保',4,'','','2012-01-07 07:41:36'),(173,'金',1,'','','2012-01-07 07:41:36'),(174,'玉',3,'','','2012-01-07 07:41:37'),(175,'滿',1,'','','2012-01-07 07:41:37'),(176,'堂',1,'','','2012-01-07 07:41:37'),(177,'莫',20,'な-い','[否定。なし。ない。]/{l:無}とは違うか?','2012-01-07 07:41:38'),(178,'富',3,'','','2012-01-07 07:41:38'),(179,'驕',2,'おご-る','[尊大にふるまう。態度が大きい。]','2012-01-07 07:41:38'),(180,'遺',3,'のこ-す','[残す。]/[すてる。]','2012-01-07 07:41:38'),(181,'咎',2,'とが-める','[過失。過ち。]','2012-01-07 07:41:38'),(182,'遂',2,'','','2012-01-07 07:41:38'),(183,'退',3,'','','2012-01-07 07:41:38'),(184,'載',1,'','','2012-01-07 07:41:38'),(185,'營',1,'エイ','営の旧字。/[いとなむ。活動する。]/宮殿の前のかがり火で、これが灯っている間は政務中だったから営むという意味になったようだ。','2012-01-07 07:41:38'),(186,'魄',1,'ハク','[日本で言う魂。]/中国では魂魄といって、どちらも日本でいう魂のこと。厳密には魂と魄は少し違うらしい。/詳しくは調べられなかったが、魂は陽の気を持つ魂と、陰の気を持つ魄が一体となったもののようだ。人体が死ぬと魂は天国に行ってしまうが、魄は地上に永遠に残るようだ。{l:鬼}などの悪霊の類は魄なのかも。','2012-01-07 07:41:38'),(187,'抱',6,'','','2012-01-07 07:41:39'),(188,'一',16,'いち','[数字の一。有の数字でもっとも少ない数。]/宇宙の始まりである道が産んだもの。秩序的には徳にあたるものではないか。→{t:15}','2012-01-07 07:41:39'),(189,'離',3,'','','2012-01-07 07:41:39'),(190,'專',1,'もっぱ-ら','専の旧字。/[一つにする。]/袋に入れて手でこねて叩いて団子にする。団の旧字は團で中に專が入っている。','2012-01-07 07:41:39'),(191,'氣',3,'キ','気の旧字。/[精神から放たれる力。気力。元気。]','2012-01-07 07:41:39'),(192,'致',5,'','','2012-01-07 07:41:39'),(193,'柔',11,'','','2012-01-07 07:41:40'),(194,'嬰',3,'','','2012-01-07 07:41:40'),(195,'兒',3,'','','2012-01-07 07:41:40'),(196,'滌',1,'デキ','[水洗いすること。]','2012-01-07 07:41:40'),(197,'除',2,'ジョ','[払う。のける。]/魔除けの杭を打って除霊する儀式。','2012-01-07 07:41:40'),(198,'覽',1,'らん','[鑑(かがみ)の借字。]','2012-01-07 07:41:41'),(199,'疵',1,'し','疵(きず)。人体などにつく傷ではなく、欠点や過失のこと。','2012-01-07 07:41:41'),(200,'愛',6,'','','2012-01-07 07:41:41'),(202,'開',3,'','','2012-01-07 07:41:41'),(203,'闔',1,'コウ','[とびら。扉。]/[戸を閉じる。]','2012-01-07 07:41:41'),(204,'雌',2,'し','牝(めす)。牝と違いはあるのか?','2012-01-07 07:41:41'),(205,'明',12,'めい','[頭で考えることを超えた絶対的な視野。]/→{t:18}','2012-01-07 07:41:41'),(206,'白',3,'しろ|ハク','[清廉潔白。正義。]','2012-01-07 07:41:41'),(207,'四',3,'','','2012-01-07 07:41:41'),(208,'達',1,'','','2012-01-07 07:41:41'),(209,'畜',4,'','','2012-01-07 07:41:41'),(210,'宰',2,'','','2012-01-07 07:41:41'),(211,'徳',44,'トク','[人の奥ゆかしい心や行い。]/→{t:15}','2012-01-07 07:41:42'),(212,'三',11,'さん','[数字の二の次に大きい数。]/徳が生み出した天地のこと。','2012-01-07 07:41:42'),(213,'十',4,'','','2012-01-07 07:41:43'),(214,'輻',1,'フク|や','[自転車の車輪にあるようなスポーク。]','2012-01-07 07:41:43'),(215,'共',1,'','','2012-01-07 07:41:43'),(216,'轂',1,'こしき','[車輪の部品で車軸を通すための穴の開いた輪。]/車輪は、この轂と外輪を{l:輻}でつなぐことで完成する。もちろん、轂に穴があいてなければ車軸を通せないから車輪として用をなさない。','2012-01-07 07:41:43'),(217,'當',3,'あ-たる','[当の旧字。]','2012-01-07 07:41:43'),(218,'車',1,'','','2012-01-07 07:41:43'),(219,'挺',1,'テイ','[延ばすですかね。]','2012-01-07 07:41:43'),(220,'埴',1,'つち','[粘土。]','2012-01-07 07:41:43'),(221,'器',13,'キ|うつわ','[道具。]/[器量。能力。]','2012-01-07 07:41:43'),(222,'鑿',1,'のみ','[木や石を削るための大工道具。]/ノミで削って穴を開けること。','2012-01-07 07:41:43'),(223,'戸',2,'','','2012-01-07 07:41:44'),(224,'牖',2,'まど','[窓のこと。]','2012-01-07 07:41:44'),(225,'室',2,'','','2012-01-07 07:41:44'),(226,'五',3,'','','2012-01-07 07:41:44'),(227,'色',1,'','','2012-01-07 07:41:44'),(228,'令',8,'し-む|れい','[させる。]令A(名詞)B(動詞)のとき、AをしてBしむ。AにBさせる。/[命令。]','2012-01-07 07:41:45'),(229,'目',3,'','','2012-01-07 07:41:45'),(230,'盲',1,'','','2012-01-07 07:41:45'),(231,'耳',2,'','','2012-01-07 07:41:45'),(232,'聾',1,'','','2012-01-07 07:41:45'),(233,'味',4,'','','2012-01-07 07:41:45'),(234,'口',1,'','','2012-01-07 07:41:46'),(235,'爽',1,'','','2012-01-07 07:41:46'),(236,'馳',2,'','','2012-01-07 07:41:48'),(237,'騁',2,'','','2012-01-07 07:41:49'),(238,'田',2,'','','2012-01-07 07:41:52'),(239,'獵',1,'','','2012-01-07 07:41:54'),(240,'發',1,'','','2012-01-07 07:41:54'),(241,'狂',1,'','','2012-01-07 07:41:54'),(242,'妨',1,'','','2012-01-07 07:41:54'),(243,'彼',3,'','','2012-01-07 07:41:56'),(244,'取',12,'','','2012-01-07 07:42:01'),(245,'寵',4,'チョウ','[かわいがられること。寵愛。]','2012-01-07 07:42:01'),(246,'辱',7,'ジョク','[面子や立場を失うこと。それで恥ずかしい思いをすること。]','2012-01-07 07:42:01'),(247,'驚',5,'','','2012-01-07 07:42:01'),(248,'大',60,'だい','[大きい。偉大。]/→{t:12}','2012-01-07 07:42:02'),(249,'患',4,'','','2012-01-07 07:42:02'),(250,'何',14,'','','2012-01-07 07:42:02'),(251,'失',17,'シツ','[うしなう。あやまる。]','2012-01-07 07:42:03'),(252,'及',4,'','','2012-01-07 07:42:04'),(253,'寄',1,'','','2012-01-07 07:42:04'),(254,'託',1,'','','2012-01-07 07:42:04'),(255,'視',3,'みる','[見る。]/示偏が付いている通り、元は心霊現象を見る力。眼に見えないものを見るんだろう。','2012-01-07 07:42:04'),(256,'曰',22,'い-う','[言う。いわく。]/助詞として、[ここに。]','2012-01-07 07:42:04'),(257,'夷',3,'イ','[たいら。凹凸がない様子。]','2012-01-07 07:42:04'),(258,'聽',2,'き-く','[聴く。]/聞こえてくるのではなく、意識して耳を澄まして聞こうとする。','2012-01-07 07:42:04'),(259,'聞',7,'','','2012-01-07 07:42:04'),(260,'希',6,'キ|まれ','[少ない。わずか。]/→{t:12}','2012-01-07 07:42:05'),(261,'摶',1,'ハク','[文字通りに読めば殴るの意。]/縛なのかも。','2012-01-07 07:42:05'),(262,'微',4,'び','[わずか。とても小さいもの。]/{s:14}では、掻き取ろうとしてもすくえないほど小さいものとしている。','2012-01-07 07:42:05'),(263,'詰',1,'キツ','[詰め込む。突き詰める。]','2012-01-07 07:42:05'),(264,'混',3,'','','2012-01-07 07:42:05'),(265,'皦',1,'キョウ|しろ-い','[玉などが白く光る。]','2012-01-07 07:42:05'),(266,'昧',1,'くら-い','[暗い。はっきりしない。]','2012-01-07 07:42:05'),(267,'繩',4,'ジョウ|なわ','[縄のこと。]','2012-01-07 07:42:05'),(268,'復',15,'','','2012-01-07 07:42:05'),(269,'歸',11,'キ','[帰の旧字。帰る。]/→{t:4}','2012-01-07 07:42:05'),(270,'状',3,'ジョウ','[かたち。]/[状態。]','2012-01-07 07:42:05'),(271,'惚',4,'コツ','[ぼける。]','2012-01-07 07:42:05'),(272,'恍',4,'コウ','[ほのかに。ぼんやり。]/[うっとり。]','2012-01-07 07:42:05'),(273,'迎',1,'','','2012-01-07 07:42:06'),(274,'首',2,'','','2012-01-07 07:42:06'),(275,'執',8,'シツ|と-る','[行う。実施する。執行する。]','2012-01-07 07:42:06'),(276,'古',8,'いにしえ','[太古の時代。その叡智。]','2012-01-07 07:42:06'),(277,'御',1,'ギョ','[制御する。]/[防御する。]','2012-01-07 07:42:06'),(278,'今',3,'','','2012-01-07 07:42:06'),(279,'紀',1,'','','2012-01-07 07:42:07'),(280,'士',5,'シ','[侍というより名士。]','2012-01-07 07:42:07'),(281,'通',1,'','','2012-01-07 07:42:07'),(282,'深',3,'','','2012-01-07 07:42:07'),(283,'識',3,'','','2012-01-07 07:42:07'),(284,'容',5,'ヨウ|いれる','[姿。容姿。]/[入れ物。容器。]','2012-01-07 07:42:07'),(285,'冬',1,'','','2012-01-07 07:42:07'),(286,'渉',1,'','','2012-01-07 07:42:07'),(287,'川',2,'','','2012-01-07 07:42:07'),(288,'畏',8,'おそ-れる','[おじけづく。怖がる。]/[かしこまる。]','2012-01-07 07:42:08'),(289,'隣',1,'','','2012-01-07 07:42:08'),(290,'儼',1,'ゲン','[厳のこと。おごそか。いかめしい。]','2012-01-07 07:42:08'),(291,'客',3,'','','2012-01-07 07:42:08'),(292,'渙',1,'カン','[氷が融けていく様子。]','2012-01-07 07:42:08'),(293,'冰',1,'こおり','[氷と同じ。]','2012-01-07 07:42:08'),(294,'將',23,'しょう|まさ-に|は-た','将の旧字。/[大将。将校。]/[{w:將欲}でまさに~。]/[ひょっとすると。]','2012-01-07 07:42:08'),(295,'釋',1,'シャク','[釈と同じ字。とける。すてる。]','2012-01-07 07:42:08'),(296,'敦',1,'トン','[重々しい様子。]','2012-01-07 07:42:09'),(297,'樸',8,'ぼく','[丸太。]/切り倒して枝打ちしただけの材木。/→{t:14}','2012-01-07 07:42:09'),(298,'曠',1,'コウ','[広々して何もない。]','2012-01-07 07:42:09'),(299,'濁',2,'','','2012-01-07 07:42:09'),(300,'孰',10,'たれ','[誰?どちら?の疑問形。]','2012-01-07 07:42:09'),(301,'靜',10,'せい','[静の旧字。]','2012-01-07 07:42:09'),(302,'徐',2,'ジョ','[魔除けの杭を道に打って除霊する儀式。]/','2012-01-07 07:42:09'),(303,'清',4,'','','2012-01-07 07:42:09'),(304,'安',5,'','','2012-01-07 07:42:09'),(305,'蔽',1,'おお-う','[かぶせる。覆い隠す。]','2012-01-07 07:42:09'),(306,'新',2,'','','2012-01-07 07:42:09'),(307,'極',6,'キョク','[頂点まで到達すること。極めること。]/[やりすぎ。]/→{t:12}','2012-01-07 07:42:09'),(308,'篤',1,'','','2012-01-07 07:42:10'),(309,'竝',1,'','','2012-01-07 07:42:10'),(310,'芸',2,'','','2012-01-07 07:42:10'),(311,'各',2,'','','2012-01-07 07:42:10'),(312,'命',3,'','','2012-01-07 07:42:10'),(313,'妄',1,'モウ','[でたらめ。無茶苦茶。]','2012-01-07 07:42:10'),(314,'凶',3,'','','2012-01-07 07:42:10'),(315,'乃',12,'すなわち','[{l:即}ち。{l:則}ち。]/~のという意味があるのは日本固有で、「{l:之}」とは別物らしい。','2012-01-07 07:42:10'),(316,'公',4,'こう','[地位の一つ。]/諸{l:侯}と呼ばれる独立国家の首長の中でも位が一つ高い{l:侯}を{l:公}といった。国連の常任理事国の拒否権みたいに特別な資格があった。','2012-01-07 07:42:10'),(317,'王',13,'おう','[王様。天下のリーダー。]/周王。本来、王は{l:帝}が命じて位につけるのだが、力こそ正義の戦国時代にはどうだったろうか。','2012-01-07 07:42:11'),(318,'沒',1,'','','2012-01-07 07:42:11'),(319,'殆',5,'あやう-い','[危ない。]','2012-01-07 07:42:11'),(320,'太',2,'','','2012-01-07 07:42:11'),(321,'次',3,'','','2012-01-07 07:42:11'),(322,'親',5,'シン','[親しい。仲が良い。仲良くする。]','2012-01-07 07:42:11'),(323,'譽',3,'ほ-める','[誉める。]','2012-01-07 07:42:11'),(324,'侮',1,'あなど-る','[馬鹿にする。見下す。]','2012-01-07 07:42:11'),(325,'足',19,'','','2012-01-07 07:42:11'),(326,'悠',1,'ユウ','[ゆったりとした様子。]','2012-01-07 07:42:11'),(327,'我',19,'われ','[わたし。{l:吾}との違いはないように思う。]','2012-01-07 07:42:11'),(328,'然',12,'','','2012-01-07 07:42:12'),(329,'廢',3,'すた-れる','[忘れ去られて打ち捨てられること。]/次第に滅んでいくこと。','2012-01-07 07:42:12'),(330,'義',5,'ギ','[正しい行い。正義。]/仁の心を持った者なら見捨てはできない人助け。','2012-01-07 07:42:12'),(331,'智',8,'ち','[抜きん出て優れた知恵。]{w:智慧}。/→{t:18}','2012-01-07 07:42:12'),(332,'慧',2,'','','2012-01-07 07:42:12'),(333,'僞',1,'','','2012-01-07 07:42:12'),(334,'六',1,'','','2012-01-07 07:42:12'),(335,'孝',2,'','','2012-01-07 07:42:12'),(336,'慈',7,'ジ','[いつくしみ。情け深い。恵み深い。]','2012-01-07 07:42:13'),(337,'國',28,'くに','[国の旧字。]','2012-01-07 07:42:13'),(338,'家',5,'','','2012-01-07 07:42:14'),(339,'昏',4,'コン','[暗い。頭が悪い。]/[乱れる。]','2012-01-07 07:42:14'),(340,'貞',2,'テイ','[占い。]/貞卜といって、占い師は王の命で占いをする。王はその結果から神の声を聴いて政治の判断をする。','2012-01-07 07:42:14'),(341,'臣',3,'','','2012-01-07 07:42:14'),(342,'絶',4,'','','2012-01-07 07:42:14'),(343,'棄',6,'','','2012-01-07 07:42:14'),(344,'倍',1,'','','2012-01-07 07:42:14'),(345,'巧',2,'','','2012-01-07 07:42:14'),(346,'盗',3,'ぬす-む','[人のものを奪う。]/誓約を破ること。主人との主従関係を結ぶ誓約を破ること。反逆したり勝手に辞めて亡命すると盗人といわれる。','2012-01-07 07:42:14'),(347,'賊',3,'ゾク','[強盗。]/同盟関係の盟約を破ること。','2012-01-07 07:42:14'),(348,'為',4,'','','2012-01-07 07:42:14'),(349,'文',2,'','','2012-01-07 07:42:14'),(350,'屬',1,'','','2012-01-07 07:42:15'),(351,'素',1,'そ','[ありのままの姿。]','2012-01-07 07:42:15'),(352,'少',4,'','','2012-01-07 07:42:15'),(353,'寡',5,'カ|すく-ない','[少ない。少ししか持っていない。]/[やもめ。未亡人。]','2012-01-07 07:42:15'),(354,'学',1,'','','2012-01-07 07:42:15'),(355,'憂',1,'','','2012-01-07 07:42:15'),(356,'阿',1,'','','2012-01-07 07:42:15'),(357,'荒',1,'','','2012-01-07 07:42:15'),(358,'未',7,'','','2012-01-07 07:42:15'),(359,'央',1,'','','2012-01-07 07:42:15'),(360,'哉',7,'や','[あまり意味はない。~だなぁ。]','2012-01-07 07:42:15'),(361,'熈',2,'キ','[喜ぶ。楽しむ。]','2012-01-07 07:42:15'),(362,'享',1,'うけ-る|すす-める','[もてなしを受ける。]/いけにえのある祭りで肉料理をすすめあって、それを享受する。','2012-01-07 07:42:16'),(363,'牢',1,'','','2012-01-07 07:42:16'),(364,'春',1,'','','2012-01-07 07:42:16'),(365,'登',1,'','','2012-01-07 07:42:16'),(366,'臺',2,'だい','[台の旧字。高楼。]','2012-01-07 07:42:16'),(367,'獨',7,'どく','[独の旧字。]','2012-01-07 07:42:16'),(368,'泊',1,'','','2012-01-07 07:42:16'),(369,'兆',2,'','','2012-01-07 07:42:16'),(370,'孩',2,'ガイ','[赤ちゃん。]','2012-01-07 07:42:17'),(371,'儡',2,'ルイ','[疲れて壊れる。]','2012-01-07 07:42:17'),(372,'餘',9,'ヨ|あま-り','[余の旧字。余らせること。]','2012-01-07 07:42:17'),(373,'愚',3,'','','2012-01-07 07:42:17'),(374,'沌',2,'トン','[くらい。おろか。]','2012-01-07 07:42:18'),(375,'俗',3,'','','2012-01-07 07:42:18'),(376,'昭',2,'ショウ','[はっきりと明るい。]','2012-01-07 07:42:18'),(377,'察',4,'サツ','[良く知っていること。察しが良いこと。]','2012-01-07 07:42:18'),(378,'悶',4,'モン','[苦しみ、もだえる。]','2012-01-07 07:42:18'),(380,'澹',1,'タン','[たゆたう。水の上や風の中でゆらゆら動く。]','2012-01-07 07:42:19'),(381,'海',3,'','','2012-01-07 07:42:19'),(382,'飂',1,'リュウ','[強い風が吹く。]','2012-01-07 07:42:19'),(383,'止',5,'','','2012-01-07 07:42:23'),(384,'頑',1,'','','2012-01-07 07:42:25'),(385,'鄙',1,'ヒ|ひな','[ひなびる。街から離れた辺鄙な場所。]/[田舎くさい。]','2012-01-07 07:42:25'),(386,'食',5,'','','2012-01-07 07:42:27'),(387,'孔',1,'コウ','[穴のこと。]/一回しか使われていない。','2012-01-07 07:42:30'),(389,'従',1,'','','2012-01-07 07:42:30'),(390,'窈',1,'ヨウ','[暗い。]','2012-01-07 07:42:30'),(391,'冥',1,'メイ','[暗い。]','2012-01-07 07:42:31'),(392,'精',3,'せい','[生物などの根本。]','2012-01-07 07:42:34'),(393,'甚',9,'ジン|はなは-だ','[非常に。ものすごく。]/[やりすぎ。過剰。]','2012-01-07 07:42:35'),(394,'眞',3,'シン','[混じり気がないこと。]','2012-01-07 07:42:35'),(395,'閲',1,'エツ','[調べるために見る。閲覧する。]','2012-01-07 07:42:36'),(396,'甫',2,'','','2012-01-07 07:42:36'),(397,'曲',2,'','','2012-01-07 07:42:36'),(398,'全',4,'まっとう','[全(まっと)うする。]/[最後に行き着くところ。最終的には。]','2012-01-07 07:42:36'),(399,'枉',1,'オウ|ま-がる','[曲がる。]','2012-01-07 07:42:36'),(400,'直',3,'','','2012-01-07 07:42:36'),(401,'窪',1,'','','2012-01-07 07:42:36'),(402,'敝',1,'やぶ-れる','[破れる。]','2012-01-07 07:42:36'),(403,'惑',1,'','','2012-01-07 07:42:36'),(404,'式',5,'シキ','[手本。]/→{t:12}','2012-01-07 07:42:36'),(405,'彰',3,'あきら-か','[明るくはっきりと表れる。]','2012-01-07 07:42:36'),(406,'伐',3,'ほこ-る','[手柄を立てる。]','2012-01-07 07:42:36'),(407,'矜',3,'ほこ-る','[自負する。]','2012-01-07 07:42:36'),(408,'豈',1,'あに','[けっして。けっして~でない。]','2012-01-07 07:42:37'),(409,'誠',1,'','','2012-01-07 07:42:37'),(410,'飄',1,'ひょう','[つむじかぜ。]','2012-01-07 07:42:37'),(411,'風',1,'','','2012-01-07 07:42:37'),(412,'終',10,'','','2012-01-07 07:42:37'),(413,'朝',2,'','','2012-01-07 07:42:37'),(414,'驟',1,'にわか','[にわかに]','2012-01-07 07:42:37'),(415,'雨',1,'','','2012-01-07 07:42:37'),(416,'日',6,'','','2012-01-07 07:42:37'),(417,'況',1,'きょう','[いわんや。]/[まして]','2012-01-07 07:42:37'),(418,'從',2,'','','2012-01-07 07:42:38'),(419,'亦',13,'また','[又(また)と同じ意味。~もまた。]','2012-01-07 07:42:38'),(420,'樂',8,'','','2012-01-07 07:42:38'),(421,'跂',1,'','','2012-01-07 07:42:38'),(422,'立',3,'','','2012-01-07 07:42:38'),(423,'跨',1,'','','2012-01-07 07:42:38'),(424,'贅',1,'','','2012-01-07 07:42:38'),(425,'寂',1,'じゃく','[ひっそりと静まりかえっている状態。]','2012-01-07 07:42:38'),(426,'寥',1,'りょう','[空虚でもの寂しい状態。]','2012-01-07 07:42:38'),(427,'改',1,'','','2012-01-07 07:42:38'),(428,'周',1,'','','2012-01-07 07:42:38'),(429,'字',1,'','','2012-01-07 07:42:38'),(430,'逝',2,'い-く','[往く。行く。]/逝去的な意味合いはあとからついたもので、往くと差はないらしい。','2012-01-07 07:42:38'),(431,'遠',5,'とお-い','[かなり離れた場所。]/→{t:12}','2012-01-07 07:42:38'),(432,'反',4,'','','2012-01-07 07:42:39'),(433,'域',1,'','','2012-01-07 07:42:39'),(434,'法',5,'ホウ|のっと-る','[法律。従うべき決まり。]/[法則。]','2012-01-07 07:42:39'),(435,'重',6,'おも-い|かさ-ねる','[どっしり重い。]/[積み重ねる。]/肯定的にも否定的にも使われる。','2012-01-07 07:42:39'),(436,'輕',8,'けい','[軽の旧字。]','2012-01-07 07:42:39'),(437,'躁',3,'ソウ','[そわそわする。]','2012-01-07 07:42:39'),(438,'君',5,'クン','[支配者。]/[従事するべき主人。]','2012-01-07 07:42:39'),(439,'輜',1,'','','2012-01-07 07:42:39'),(440,'雖',6,'いえど-も','[たとえ~だとしても。]/[~ではあるがしかし。]','2012-01-07 07:42:40'),(441,'榮',2,'','','2012-01-07 07:42:40'),(442,'燕',1,'','','2012-01-07 07:42:40'),(443,'超',1,'','','2012-01-07 07:42:40'),(444,'奈',2,'','','2012-01-07 07:42:40'),(445,'乘',1,'','','2012-01-07 07:42:40'),(446,'主',6,'','','2012-01-07 07:42:40'),(447,'轍',1,'','','2012-01-07 07:42:40'),(448,'迹',1,'','','2012-01-07 07:42:40'),(449,'瑕',1,'きず','[物につくきず。]玉にキズの瑕。/欠点。/','2012-01-07 07:42:41'),(450,'謫',1,'たく','[過ち。]とがめる。','2012-01-07 07:42:41'),(451,'籌',1,'','','2012-01-07 07:42:41'),(452,'策',1,'サク','[作戦。]/[札。メモ書きするための板。]','2012-01-07 07:42:41'),(453,'閉',2,'','','2012-01-07 07:42:41'),(454,'關',1,'かん','[かんぬき。]/門が開かないようにするための棒。','2012-01-07 07:42:41'),(455,'鍵',1,'けん','[鍵。]/扉に打ち付けられた金具で、ここにかんぬきを通すことで鍵になる。','2012-01-07 07:42:41'),(456,'結',2,'','','2012-01-07 07:42:41'),(457,'約',1,'','','2012-01-07 07:42:41'),(458,'救',4,'','','2012-01-07 07:42:41'),(459,'襲',1,'シュウ|つ-ぐ','[受け継ぐ。踏襲。]','2012-01-07 07:42:41'),(460,'師',3,'シ','[先生。師匠。]/[軍隊。将軍。]/もとは兵団の大将。千人規模の兵団、師団。軍師がいるから、先生の意味もできた。','2012-01-07 07:42:41'),(461,'資',2,'シ','[増やすための元手。資質。]','2012-01-07 07:42:41'),(462,'迷',2,'','','2012-01-07 07:42:41'),(463,'要',1,'','','2012-01-07 07:42:41'),(464,'雄',1,'','','2012-01-07 07:42:41'),(465,'谿',2,'けい','[細い谷。]','2012-01-07 07:42:41'),(466,'黒',1,'くろ|コク','[{l:白}の反対。胸を張って潔白とは言えないもの。]','2012-01-07 07:42:41'),(467,'忒',1,'たが-う','[違う。食い違いを見せる。]','2012-01-07 07:42:41'),(468,'散',2,'サン','[こま切れにする。]/[飛び散る。]','2012-01-07 07:42:42'),(469,'官',1,'カン','[役人。庶民をまとめるリーダー。]','2012-01-07 07:42:42'),(470,'制',2,'セイ','[材木を枝打ちする。]/切り倒した木をナタで枝打ちして丸太にすること。','2012-01-07 07:42:42'),(471,'割',2,'さ-く','[裂く。丸太をナタなどで縦に割る。]','2012-01-07 07:42:42'),(472,'敗',5,'','','2012-01-07 07:42:42'),(473,'呴',1,'ク','[ホッと軽く息を出す。]','2012-01-07 07:42:42'),(474,'吹',1,'','','2012-01-07 07:42:42'),(475,'羸',1,'ルイ','[弱い。疲れる。]','2012-01-07 07:42:42'),(476,'隳',1,'くず-れる','[崩れる。壊れる。]','2012-01-07 07:42:42'),(477,'奢',1,'シャ|おご-る','[贅沢をする。]','2012-01-07 07:42:42'),(478,'泰',1,'タイ','[安全。]/おおらかすぎて遠慮のない贅沢をするという意味もある。','2012-01-07 07:42:42'),(479,'佐',1,'たす-ける','[たすける。補佐する。]','2012-01-07 07:42:42'),(480,'兵',12,'','','2012-01-07 07:42:42'),(481,'好',3,'','','2012-01-07 07:42:43'),(482,'還',1,'','','2012-01-07 07:42:43'),(483,'処',2,'','','2012-01-07 07:42:43'),(484,'刑',1,'','','2012-01-07 07:42:43'),(485,'蕀',1,'キョク','[トゲのある植物。いばら。]','2012-01-07 07:42:43'),(486,'軍',4,'','','2012-01-07 07:42:43'),(487,'必',14,'','','2012-01-07 07:42:43'),(488,'年',1,'','','2012-01-07 07:42:44'),(489,'果',6,'は-たす','[目標にたどり着く。]','2012-01-07 07:42:44'),(490,'勿',4,'なかれ','[~してはいけない。]','2012-01-07 07:42:44'),(492,'壮',2,'','','2012-01-07 07:42:44'),(493,'老',3,'','','2012-01-07 07:42:44'),(494,'早',4,'','','2012-01-07 07:42:44'),(495,'祥',4,'ショウ','[めでたいこと。その兆し。]','2012-01-07 07:42:45'),(496,'左',5,'','','2012-01-07 07:42:45'),(497,'右',4,'','','2012-01-07 07:42:45'),(498,'恬',1,'','','2012-01-07 07:42:45'),(499,'淡',2,'','','2012-01-07 07:42:46'),(500,'勝',16,'','','2012-01-07 07:42:46'),(502,'殺',9,'','','2012-01-07 07:42:46'),(503,'矣',11,'','[意味はない。読まない。]','2012-01-07 07:42:46'),(504,'吉',1,'','','2012-01-07 07:42:47'),(505,'偏',1,'','','2012-01-07 07:42:47'),(507,'喪',3,'','','2012-01-07 07:42:47'),(508,'禮',5,'レイ','[礼の旧字。礼儀。]/主に葬式の段取り。','2012-01-07 07:42:47'),(509,'哀',2,'','','2012-01-07 07:42:48'),(510,'悲',1,'','','2012-01-07 07:42:48'),(511,'泣',1,'','','2012-01-07 07:42:48'),(512,'戦',1,'','','2012-01-07 07:42:48'),(513,'小',10,'ショウ','[ちいさい。]/目に見えないほど小さい。/→{t:12}','2012-01-07 07:42:48'),(514,'侯',5,'こう','[諸侯。地方のリーダー。]/自治権が認められた独立国家なので、州知事に近い。周王は自分の血統を諸侯につけた。/','2012-01-07 07:42:49'),(515,'賓',1,'','','2012-01-07 07:42:49'),(516,'合',3,'','','2012-01-07 07:42:49'),(517,'降',1,'','','2012-01-07 07:42:50'),(518,'甘',2,'','','2012-01-07 07:42:51'),(519,'露',1,'','','2012-01-07 07:42:52'),(520,'均',1,'ひと-しい','[同じで差がない。]','2012-01-07 07:42:52'),(521,'既',6,'き','[すでに。]/[尽きる。]','2012-01-07 07:42:54'),(522,'譬',1,'たと-えば','[たとえる。別の言い方をする。]','2012-01-07 07:42:54'),(523,'在',2,'','','2012-01-07 07:42:57'),(524,'江',2,'こう','[長江。]/江は長江で、{l:河}は黄河。/楚の出身とされる老子は長江のほうが親しみがあったのか、河の字は老子には出てこない。','2012-01-07 07:42:57'),(525,'力',2,'','','2012-01-07 07:42:58'),(526,'亡',4,'ボウ','[死ぬこと。]','2012-01-07 07:42:58'),(527,'壽',1,'ことぶき|ひさしい','[めでたいこと。命が続いて長寿なこと。]','2012-01-07 07:42:58'),(528,'氾',1,'はん','[水がこぼれあふれている様子。]','2012-01-07 07:42:58'),(529,'養',2,'','','2012-01-07 07:42:59'),(530,'往',3,'','','2012-01-07 07:42:59'),(531,'害',5,'','','2012-01-07 07:42:59'),(532,'平',1,'','','2012-01-07 07:42:59'),(533,'餌',1,'じ','[食事。]','2012-01-07 07:42:59'),(534,'過',4,'','','2012-01-07 07:43:00'),(535,'歙',3,'す-う|きゅう','[息を吸う。]/[息を吸って身体を縮ませる。]','2012-01-07 07:43:00'),(536,'固',8,'','','2012-01-07 07:43:00'),(537,'張',2,'','','2012-01-07 07:43:00'),(538,'興',1,'おこ-す','[起きる。始まる。流行る。]','2012-01-07 07:43:00'),(539,'奪',1,'','','2012-01-07 07:43:00'),(540,'剛',2,'','','2012-01-07 07:43:00'),(541,'魚',1,'','','2012-01-07 07:43:00'),(542,'脱',2,'','','2012-01-07 07:43:00'),(543,'示',1,'ジ','[見せる。]/示は神様関連の文字だから、神霊的なものを見せる。','2012-01-07 07:43:00'),(544,'化',3,'か-す','[変化する。]','2012-01-07 07:43:00'),(545,'鎮',1,'','','2012-01-07 07:43:00'),(546,'定',1,'','','2012-01-07 07:43:01'),(547,'應',2,'','','2012-01-07 07:43:01'),(548,'攘',2,'じょう|はらう','[払いのける。]','2012-01-07 07:43:01'),(549,'臂',2,'ひ|ひじ','[腕。]/腕が六本ある阿修羅は三面六臂とか言われる。','2012-01-07 07:43:01'),(550,'扔',2,'じょう','[投げる。捨てる。]','2012-01-07 07:43:01'),(551,'忠',1,'','','2012-01-07 07:43:02'),(552,'薄',2,'うす-い','[厚みがない。うすっぺらい。]/安定感がない場所。','2012-01-07 07:43:02'),(553,'華',2,'ハナ','[華やかなこと。]/見かけは美しいが未熟な段階。','2012-01-07 07:43:04'),(554,'丈',1,'','','2012-01-07 07:43:04'),(555,'厚',5,'あつ-い','[中心部。立場が頑丈で安全なところ。]','2012-01-07 07:43:04'),(556,'昔',1,'','','2012-01-07 07:43:04'),(557,'寧',2,'ネイ','[やすらかで安定していること。]','2012-01-07 07:43:04'),(558,'靈',2,'レイ','[霊のこと。神妙な霊力。]','2012-01-07 07:43:04'),(559,'恐',6,'','','2012-01-07 07:43:04'),(560,'裂',1,'','','2012-01-07 07:43:04'),(561,'歇',1,'カツ|つ-きる','[やめる。つきる。]','2012-01-07 07:43:04'),(562,'竭',1,'ケツ|つ-きる','[つきる。つくす。]','2012-01-07 07:43:04'),(563,'滅',1,'','','2012-01-07 07:43:05'),(564,'蹶',1,'つまず-く','[つまづく。倒れる。]','2012-01-07 07:43:05'),(565,'賤',3,'','','2012-01-07 07:43:05'),(566,'本',2,'','','2012-01-07 07:43:08'),(567,'基',1,'','','2012-01-07 07:43:11'),(568,'孤',2,'コ','[孤独。孤立。]/[孤児。みなしご。]','2012-01-07 07:43:11'),(569,'穀',2,'コク','[穀物。]','2012-01-07 07:43:12'),(570,'琭',2,'ロク','[たま。玉。]','2012-01-07 07:43:13'),(571,'落',2,'','','2012-01-07 07:43:13'),(572,'石',1,'','','2012-01-07 07:43:13'),(573,'笑',2,'','','2012-01-07 07:43:13'),(574,'建',3,'','','2012-01-07 07:43:13'),(575,'眛',1,'くら-い','[暗い。]','2012-01-07 07:43:13'),(576,'進',3,'','','2012-01-07 07:43:13'),(577,'纇',1,'ライ','[糸をより合わせて太くした糸。]','2012-01-07 07:43:13'),(578,'廣',3,'','','2012-01-07 07:43:13'),(579,'偸',1,'ぬすむ','[盗む。]/','2012-01-07 07:43:14'),(580,'質',1,'','','2012-01-07 07:43:14'),(581,'渝',1,'かわる','[かわる。]/','2012-01-07 07:43:14'),(582,'方',2,'','','2012-01-07 07:43:15'),(583,'隅',1,'グウ','[すみっこ。四角形の角。]','2012-01-07 07:43:15'),(585,'形',3,'','','2012-01-07 07:43:16'),(586,'隱',1,'','','2012-01-07 07:43:16'),(587,'貸',1,'','','2012-01-07 07:43:16'),(588,'二',3,'に','[数字の一の次に大きい数。]/道が生み出した徳のこと。','2012-01-07 07:43:16'),(589,'負',1,'','','2012-01-07 07:43:17'),(590,'陰',1,'イン','[暗いもの。ネガティブなもの。]','2012-01-07 07:43:17'),(591,'陽',1,'ヨウ','[明るいもの。ポジティブなもの。]','2012-01-07 07:43:17'),(592,'稱',1,'ショウ','[称の旧字。自称。]','2012-01-07 07:43:17'),(593,'損',8,'','','2012-01-07 07:43:18'),(594,'益',6,'','','2012-01-07 07:43:18'),(595,'梁',1,'','','2012-01-07 07:43:18'),(596,'父',1,'','','2012-01-07 07:43:19'),(597,'至',8,'','','2012-01-07 07:43:22'),(598,'堅',4,'','','2012-01-07 07:43:23'),(599,'入',4,'','','2012-01-07 07:43:23'),(600,'病',9,'へい','[欠点。具合が悪い。]/このころ病気は「疾」と書かれた。疾病で病気で具合が悪いという意味。そこから病が病気の意味となった。','2012-01-07 07:43:24'),(601,'費',1,'','','2012-01-07 07:43:24'),(602,'藏',1,'','','2012-01-07 07:43:24'),(603,'缺',3,'ケツ','[欠のこと。欠ける。]','2012-01-07 07:43:24'),(604,'弊',1,'ヘイ|やぶ-れる','[壊れる。疲れる。]/[具合が悪い。]','2012-01-07 07:43:24'),(605,'沖',1,'チュウ','[水が深く静かに溜まっている。]','2012-01-07 07:43:24'),(606,'詘',1,'クツ','[つまる。引っかかる。]','2012-01-07 07:43:24'),(607,'拙',1,'セツ','[へた。上手でない。拙い。]','2012-01-07 07:43:24'),(608,'辯',3,'べん','[弁のこと。弁舌。弁論。]/裁判のときの弁論が語源で、言い訳の意味だったようだ。','2012-01-07 07:43:24'),(609,'訥',1,'トツ','[どもる。つっかえながら話す。]','2012-01-07 07:43:24'),(610,'寒',1,'','','2012-01-07 07:43:24'),(611,'熱',1,'','','2012-01-07 07:43:24'),(612,'却',1,'しりぞ-ける','[引っ込める。取り下げる。]','2012-01-07 07:43:25'),(613,'走',1,'','','2012-01-07 07:43:25'),(614,'馬',3,'','','2012-01-07 07:43:25'),(615,'糞',1,'フン','[動物の排泄物。]','2012-01-07 07:43:25'),(616,'戎',1,'えびす','[北方の騎馬民族。]','2012-01-07 07:43:25'),(617,'郊',1,'コウ','[街の外。]/中国の街は城壁に囲まれた内側を国とするから、郊といえば実行支配的な地域であり、国境付近となる。','2012-01-07 07:43:25'),(618,'罪',2,'ザイ','[犯罪。]','2012-01-07 07:43:25'),(619,'禍',4,'','','2012-01-07 07:43:25'),(620,'闚',1,'うかが-う','[覗いて見る。]','2012-01-07 07:43:25'),(621,'彌',3,'いよいよ','[弥の旧字。いよいよ。ますます。]','2012-01-07 07:43:26'),(622,'學',3,'ガク','[学ぶ。勉強する。]','2012-01-07 07:43:26'),(623,'渾',1,'コン','[濁る。混じる。]/[全力。渾身の力。]','2012-01-07 07:43:26'),(624,'注',1,'','','2012-01-07 07:43:26'),(625,'徒',4,'ト','[人たち。似たような仲間たち。]','2012-01-07 07:43:26'),(626,'蓋',1,'','','2012-01-07 07:43:26'),(627,'攝',1,'セツ','[摂の旧字。とる。摂取する。]','2012-01-07 07:43:26'),(628,'陸',1,'','','2012-01-07 07:43:26'),(629,'遇',1,'','','2012-01-07 07:43:26'),(630,'兕',2,'じ','[サイに似た一本角の大型四脚獣。]/古代中国には象は棲んでいたが、サイまでいたのか?','2012-01-07 07:43:26'),(631,'虎',2,'','','2012-01-07 07:43:26'),(632,'被',2,'ヒ|こうむ-る','[受ける。かぶる。]','2012-01-07 07:43:26'),(633,'甲',2,'','','2012-01-07 07:43:26'),(634,'投',1,'トウ','[叩きつける。]','2012-01-07 07:43:27'),(635,'角',1,'','','2012-01-07 07:43:27'),(636,'措',1,'ソ','[置くとだいたい同じ。]','2012-01-07 07:43:27'),(637,'爪',1,'','','2012-01-07 07:43:27'),(638,'刃',1,'','','2012-01-07 07:43:27'),(639,'尊',3,'','','2012-01-07 07:43:27'),(640,'育',1,'','','2012-01-07 07:43:27'),(641,'亭',1,'','','2012-01-07 07:43:27'),(642,'毒',1,'','','2012-01-07 07:43:27'),(643,'覆',1,'','','2012-01-07 07:43:27'),(644,'没',1,'','','2012-01-07 07:43:27'),(645,'塞',2,'サイ|ふさ-ぐ','[閉じる。ふさぐ。]','2012-01-07 07:43:27'),(646,'兌',3,'エツ','[穴という意味はないらしい。困った。]/諸説では、兌は頭についている穴のことらしい。つまり、目鼻口耳のこと。門は心への入り口となる脳の思考のこと。','2012-01-07 07:43:27'),(647,'閇',1,'と-じる','[閉と同じ。]/中の才が反転して下になってるだけ。','2012-01-07 07:43:27'),(648,'濟',1,'サイ','[済と同じ。済ませる。]','2012-01-07 07:43:28'),(649,'殃',1,'オウ|わざわい','[災いのこと。]','2012-01-07 07:43:28'),(650,'習',1,'','','2012-01-07 07:43:28'),(651,'介',1,'','','2012-01-07 07:43:28'),(652,'施',1,'シ','[実施する。]/軍を別の場所に移すこと。そこから行動に移すことが実施することになったか?','2012-01-07 07:43:28'),(653,'徑',1,'ケイ','[径の旧字。こみち。けもの道。]/近いけれど険しくて歩きづらい道。','2012-01-07 07:43:28'),(654,'蕪',1,'あ-れる','[雑草が生い茂って荒れること。]','2012-01-07 07:43:28'),(655,'倉',1,'','','2012-01-07 07:43:28'),(656,'服',4,'フク','[衣服。]/[屈服。服従。]/[服務。服役。]','2012-01-07 07:43:28'),(657,'綵',1,'サイ','[あやぎぬ。綺麗な布。]','2012-01-07 07:43:28'),(658,'帶',1,'おび','[腰に巻く帯。そこに道具を通して持ち歩く。]','2012-01-07 07:43:28'),(659,'劔',1,'','','2012-01-07 07:43:28'),(660,'厭',5,'いや','[いやがる。いやになる。飽きる。]/[おさえる。]壓が圧の旧字。圧えるに通じる。','2012-01-07 07:43:29'),(661,'飮',1,'','','2012-01-07 07:43:29'),(662,'財',1,'','','2012-01-07 07:43:29'),(663,'夸',1,'カ','[大袈裟に言う。]/[褒めて持ち上げる。]','2012-01-07 07:43:29'),(664,'抜',1,'','','2012-01-07 07:43:29'),(665,'孫',1,'','','2012-01-07 07:43:29'),(666,'祭',1,'','','2012-01-07 07:43:30'),(667,'祀',1,'','','2012-01-07 07:43:30'),(668,'輟',1,'や-める','[止める。止まる。]','2012-01-07 07:43:30'),(669,'修',5,'','','2012-01-07 07:43:30'),(670,'郷',3,'','','2012-01-07 07:43:30'),(671,'豐',1,'','','2012-01-07 07:43:30'),(672,'普',1,'','','2012-01-07 07:43:30'),(673,'含',1,'','','2012-01-07 07:43:30'),(674,'比',1,'','','2012-01-07 07:43:30'),(675,'赤',1,'','','2012-01-07 07:43:30'),(676,'蜂',1,'','','2012-01-07 07:43:30'),(677,'蠆',1,'タイ','[さそりの仲間。毒のある虫。]','2012-01-07 07:43:31'),(678,'虺',1,'まむし','[毒蛇。]','2012-01-07 07:43:31'),(679,'蛇',1,'','','2012-01-07 07:43:31'),(680,'螫',1,'さ-す','[虫が針で刺す。]/赦って字がついてるってことは、赤く後が残るほどの毒を刺し込むのかな。','2012-01-07 07:43:31'),(681,'猛',1,'','','2012-01-07 07:43:31'),(682,'獣',1,'','','2012-01-07 07:43:31'),(683,'據',1,'よ-る','拠の旧字。/[足がかりとする。]','2012-01-07 07:43:31'),(684,'攫',1,'','','2012-01-07 07:43:31'),(685,'鳥',1,'','','2012-01-07 07:43:31'),(686,'搏',1,'う-つ','[撃つに近いか。]/{l:摶}と似てるなと思ったらほとんど同じらしい。','2012-01-07 07:43:31'),(687,'筋',1,'','','2012-01-07 07:43:31'),(688,'握',1,'','','2012-01-07 07:43:31'),(689,'牡',2,'','','2012-01-07 07:43:31'),(690,'號',1,'ごう','[ガオーっていう咆哮。]','2012-01-07 07:43:31'),(691,'嗄',1,'か-れる','[声がかれる。]','2012-01-07 07:43:31'),(693,'疎',1,'','','2012-01-07 07:43:31'),(694,'奇',3,'キ','[突飛なこと。奇抜なこと。]/[反社会的行為。]','2012-01-07 07:43:32'),(695,'忌',1,'','','2012-01-07 07:43:32'),(696,'諱',1,'','','2012-01-07 07:43:32'),(697,'貧',1,'','','2012-01-07 07:43:32'),(698,'滋',3,'ジ|ますます','[ますます。]/[生い茂って育つ。]','2012-01-07 07:43:32'),(699,'邪',2,'ジャ','[よこしま。悪いこと。]/今でいう「善悪」の悪。今の悪は「憎む」','2012-01-07 07:43:32'),(700,'起',2,'','','2012-01-07 07:43:32'),(701,'云',2,'い-う','[言うと同じ意味。]/聖人がかつて言ったことを引用しているので、「言う」でも「謂う」でもない字を使ったのだろう。','2012-01-07 07:43:32'),(702,'政',2,'','','2012-01-07 07:43:33'),(703,'淳',2,'ジュン','[情に厚く、素直。]','2012-01-07 07:43:33'),(704,'福',3,'','','2012-01-07 07:43:33'),(705,'倚',1,'','','2012-01-07 07:43:33'),(706,'伏',1,'','','2012-01-07 07:43:33'),(707,'妖',1,'','','2012-01-07 07:43:33'),(708,'廉',1,'レン','[いさぎよく私欲がない。清廉。]','2012-01-07 07:43:33'),(709,'劌',1,'そこな-う','[トゲトゲしく刺す。]','2012-01-07 07:43:33'),(710,'肆',1,'みせ|つら-ねる','[店。]/[長く連ねる。]','2012-01-07 07:43:33'),(711,'耀',1,'かがや-く','[光り輝く。]','2012-01-07 07:43:33'),(712,'嗇',2,'しょく','[けち。倹約。]/倹約は金銭面だけでなく、時間や体力も節約すること。できるだけ何もしないで、必要なことだけを最も効率良く片付けること。','2012-01-07 07:43:33'),(713,'積',3,'','','2012-01-07 07:43:33'),(714,'克',2,'','','2012-01-07 07:43:33'),(715,'柢',1,'てい','[根っこ。根底というが、根柢。]','2012-01-07 07:43:33'),(716,'烹',1,'','','2012-01-07 07:43:33'),(717,'鮮',1,'','','2012-01-07 07:43:34'),(718,'莅',1,'のぞ-む','[位と同じ。位に就く。]','2012-01-07 07:43:34'),(719,'鬼',2,'おに','[災いをなす霊。]/日本の鬼とは違う。/鬼神と言って神とセットで語られる。','2012-01-07 07:43:35'),(720,'傷',5,'','','2012-01-07 07:43:36'),(721,'交',2,'','','2012-01-07 07:43:36'),(722,'流',1,'','','2012-01-07 07:43:36'),(723,'兼',1,'','','2012-01-07 07:43:37'),(724,'宜',1,'','','2012-01-07 07:43:37'),(725,'奥',1,'オウ','[上座のような奥にいる大物。]','2012-01-07 07:43:37'),(726,'寳',2,'たから','[宝の旧字。]','2012-01-07 07:43:37'),(727,'市',1,'うる|かう','[取引すること。]/売るとする本と買うとする本がある。市場で物々交換するような感じだろうか。','2012-01-07 07:43:37'),(728,'加',1,'','','2012-01-07 07:43:37'),(729,'置',1,'','','2012-01-07 07:43:38'),(730,'拱',1,'','','2012-01-07 07:43:38'),(731,'璧',1,'','','2012-01-07 07:43:38'),(732,'駟',1,'','','2012-01-07 07:43:38'),(733,'坐',1,'','','2012-01-07 07:43:38'),(734,'求',2,'','','2012-01-07 07:43:39'),(735,'免',2,'','','2012-01-07 07:43:39'),(736,'報',1,'','','2012-01-07 07:43:39'),(737,'怨',3,'','','2012-01-07 07:43:39'),(738,'圖',1,'はか-る','[図の旧字。図る。]','2012-01-07 07:43:39'),(739,'細',3,'','','2012-01-07 07:43:39'),(740,'諾',1,'ダク','[肯定する返事をする。]','2012-01-07 07:43:39'),(741,'謀',2,'','','2012-01-07 07:43:39'),(742,'脆',2,'','','2012-01-07 07:43:39'),(743,'破',1,'','','2012-01-07 07:43:39'),(744,'木',3,'','','2012-01-07 07:43:39'),(745,'毫',1,'','','2012-01-07 07:43:39'),(746,'末',1,'','','2012-01-07 07:43:40'),(747,'九',1,'','','2012-01-07 07:43:40'),(748,'層',1,'','','2012-01-07 07:43:40'),(749,'累',1,'','','2012-01-07 07:43:40'),(750,'土',1,'','','2012-01-07 07:43:40'),(751,'千',1,'','','2012-01-07 07:43:40'),(752,'里',1,'','','2012-01-07 07:43:40'),(753,'愼',1,'つつし-む','[慎の旧字。慎む。慎重にする。]','2012-01-07 07:43:40'),(754,'輔',1,'','','2012-01-07 07:43:40'),(755,'稽',2,'ケイ','[考える。]/[とどまる。]','2012-01-07 07:43:40'),(756,'順',1,'','','2012-01-07 07:43:40'),(757,'推',1,'お-す','[後押しする。]','2012-01-07 07:43:40'),(758,'肖',3,'しょう','[似る。]','2012-01-07 07:43:40'),(759,'寶',1,'たから','[宝の旧字。]','2012-01-07 07:43:40'),(760,'儉',3,'ケン','[倹の旧字。倹約すること。]','2012-01-07 07:43:40'),(761,'勇',4,'ユウ','[勇ましい。勇気がある。]','2012-01-07 07:43:40'),(762,'舎',3,'す-てる','[捨てる。捨の借字。]','2012-01-07 07:43:40'),(763,'戰',2,'','','2012-01-07 07:43:41'),(764,'衞',1,'','','2012-01-07 07:43:41'),(765,'武',1,'','','2012-01-07 07:43:41'),(766,'怒',1,'','','2012-01-07 07:43:41'),(767,'敵',4,'','','2012-01-07 07:43:41'),(768,'配',1,'はい','[配る。気配り。]/[引き合わせる。巡りあわせ。]','2012-01-07 07:43:41'),(769,'寸',1,'','','2012-01-07 07:43:41'),(770,'尺',1,'','','2012-01-07 07:43:41'),(771,'抗',1,'コウ','[当てる。あらがう。立ち向かう。]','2012-01-07 07:43:41'),(772,'褐',1,'カツ','[目の粗い粗末な服。]','2012-01-07 07:43:41'),(773,'懷',1,'','','2012-01-07 07:43:41'),(774,'威',2,'い','[人を怖がらせる力。威圧する力。]','2012-01-07 07:43:41'),(775,'狎',1,'あなど-る','[なれなれしくする。なれあう。あなどる。]','2012-01-07 07:43:41'),(776,'活',1,'','','2012-01-07 07:43:41'),(777,'召',1,'','','2012-01-07 07:43:42'),(778,'來',2,'','','2012-01-07 07:43:42'),(779,'繟',1,'セン','[ゆったりとしていること。]','2012-01-07 07:43:42'),(780,'網',1,'','','2012-01-07 07:43:42'),(781,'恢',2,'カイ','[ひろい。大きい。]','2012-01-07 07:43:42'),(782,'疏',1,'そ','[粗い。まばら。]','2012-01-07 07:43:42'),(784,'懼',1,'おそ-れる','[恐れる。]','2012-01-07 07:43:42'),(785,'司',4,'つかさどる','[公的な立場の仕事を受け持つ。]','2012-01-07 07:43:42'),(786,'代',3,'','','2012-01-07 07:43:42'),(787,'匠',2,'','','2012-01-07 07:43:42'),(788,'斲',2,'き-る','[切る。]','2012-01-07 07:43:42'),(789,'手',1,'','','2012-01-07 07:43:43'),(790,'飢',2,'う-える','[貧困からくる飢餓。]','2012-01-07 07:43:43'),(791,'税',1,'ぜい','[税金。]もちろん、当時は金でなく農産物や兵役。','2012-01-07 07:43:43'),(792,'草',1,'','','2012-01-07 07:43:43'),(793,'枯',1,'','','2012-01-07 07:43:43'),(794,'槁',1,'コウ','[枯れること。]','2012-01-07 07:43:43'),(795,'折',1,'','','2012-01-07 07:43:43'),(796,'弓',1,'','','2012-01-07 07:43:43'),(797,'抑',1,'','','2012-01-07 07:43:43'),(798,'擧',1,'','','2012-01-07 07:43:43'),(799,'補',2,'','','2012-01-07 07:43:43'),(800,'奉',2,'ほう-じる','[ささげる。献上する。]','2012-01-07 07:43:43'),(801,'攻',1,'','','2012-01-07 07:43:43'),(802,'受',2,'','','2012-01-07 07:43:43'),(803,'垢',1,'あか','[要らなくなった汚いもの。]','2012-01-07 07:43:43'),(804,'社',1,'','','2012-01-07 07:43:43'),(805,'稷',1,'ショク','[きび。黍。中国北部の主食。]','2012-01-07 07:43:44'),(806,'契',2,'ケイ','[約束。]','2012-01-07 07:43:44'),(807,'責',1,'','','2012-01-07 07:43:44'),(808,'徹',1,'てつ','[無理な厳しいことを貫き通すこと。]','2012-01-07 07:43:44'),(809,'什',1,'','','2012-01-07 07:43:44'),(810,'伯',1,'','','2012-01-07 07:43:44'),(811,'徙',1,'','','2012-01-07 07:43:44'),(812,'舟',1,'','','2012-01-07 07:43:44'),(813,'轝',1,'ヨ','[こし。輿。車。]','2012-01-07 07:43:44'),(814,'乗',1,'','','2012-01-07 07:43:44'),(815,'陳',1,'つらね-る','[展開する。]/たぶん、陣に通じている。','2012-01-07 07:43:45'),(816,'鄰',1,'','','2012-01-07 07:43:45'),(817,'望',1,'','','2012-01-07 07:43:45'),(818,'雞',1,'ケイ','[にわとり。鶏と同じ。]','2012-01-07 07:43:45'),(819,'犬',1,'','','2012-01-07 07:43:45'),(820,'博',2,'','','2012-01-07 07:43:45'),(821,'己',2,'','','2012-01-07 07:43:45'),(822,'培',1,'つちか-う','[養う。築き上げる。]','2012-01-07 07:43:45'),(823,'豫',1,'','','2012-01-07 07:43:45');\r
+/*!40000 ALTER TABLE `letters` ENABLE KEYS */;\r
+UNLOCK TABLES;\r
+\r
+--\r
+-- Table structure for table `schema_info`\r
+--\r
+\r
+DROP TABLE IF EXISTS `schema_info`;\r
+CREATE TABLE `schema_info` (\r
+  `version` int(11) default NULL\r
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\r
+\r
+--\r
+-- Dumping data for table `schema_info`\r
+--\r
+\r
+LOCK TABLES `schema_info` WRITE;\r
+/*!40000 ALTER TABLE `schema_info` DISABLE KEYS */;\r
+INSERT INTO `schema_info` VALUES (13);\r
+/*!40000 ALTER TABLE `schema_info` ENABLE KEYS */;\r
+UNLOCK TABLES;\r
+\r
+--\r
+-- Table structure for table `section_letters`\r
+--\r
+\r
+DROP TABLE IF EXISTS `section_letters`;\r
+CREATE TABLE `section_letters` (\r
+  `id` int(11) NOT NULL auto_increment,\r
+  `section_id` int(11) NOT NULL default '1',\r
+  `letter_id` int(11) NOT NULL default '1',\r
+  `count` int(11) NOT NULL default '1',\r
+  `chk` int(11) NOT NULL default '0',\r
+  PRIMARY KEY  (`id`),\r
+  KEY `index_section_letters_on_section_id` (`section_id`),\r
+  KEY `index_section_letters_on_letter_id` (`letter_id`)\r
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\r
+\r
+--\r
+-- Dumping data for table `section_letters`\r
+--\r
+\r
+LOCK TABLES `section_letters` WRITE;\r
+/*!40000 ALTER TABLE `section_letters` DISABLE KEYS */;\r
+INSERT INTO `section_letters` VALUES (1,1,1,3,1),(2,4,1,1,0),(3,8,1,1,0),(4,9,1,1,0),(5,14,1,2,0),(6,15,1,1,0),(7,16,1,2,0),(8,18,1,1,0),(9,21,1,2,0),(10,23,1,5,0),(11,24,1,2,0),(12,25,1,4,0),(13,30,1,3,0),(14,31,1,1,0),(15,32,1,2,0),(16,34,1,1,0),(17,35,1,1,0),(18,37,1,1,0),(19,38,1,2,0),(20,40,1,2,0),(21,41,1,9,0),(22,42,1,1,0),(23,46,1,2,0),(24,47,1,1,0),(25,48,1,1,0),(26,51,1,4,0),(27,53,1,3,0),(28,55,1,2,0),(29,59,1,1,0),(30,60,1,1,0),(31,62,1,3,0),(32,65,1,1,0),(33,67,1,1,0),(34,73,1,1,0),(35,77,1,4,0),(36,79,1,1,0),(37,81,1,2,0),(38,1,2,2,0),(39,3,2,1,0),(40,9,2,1,0),(41,13,2,2,0),(42,14,2,2,0),(43,15,2,2,0),(44,20,2,1,0),(45,25,2,1,0),(46,27,2,2,0),(47,29,2,1,0),(48,31,2,1,0),(49,34,2,3,0),(50,35,2,1,0),(51,36,2,2,0),(52,44,2,1,0),(53,46,2,1,0),(54,56,2,6,0),(55,59,2,2,0),(56,62,2,2,0),(57,79,2,1,0),(58,1,3,3,0),(59,7,3,1,0),(60,31,3,1,0),(61,39,3,2,0),(62,53,3,1,0),(63,60,3,2,0),(64,65,3,1,0),(65,1,4,4,0),(66,3,4,1,0),(67,16,4,4,1),(68,27,4,2,0),(69,28,4,3,0),(70,32,4,1,0),(71,34,4,1,0),(72,37,4,1,0),(73,46,4,1,0),(74,48,4,1,0),(75,49,4,1,0),(76,51,4,1,0),(77,52,4,1,0),(78,55,4,2,0),(79,61,4,1,0),(80,64,4,1,0),(81,65,4,1,0),(82,74,4,2,0),(83,79,4,1,0),(84,1,5,6,1),(85,9,5,1,0),(86,14,5,4,0),(87,21,5,1,1),(88,25,5,2,0),(89,32,5,3,0),(90,34,5,3,0),(91,37,5,2,0),(92,41,5,1,0),(93,44,5,1,0),(94,47,5,1,0),(95,1,6,2,0),(96,2,6,2,0),(97,3,6,4,0),(98,7,6,1,0),(99,8,6,1,0),(100,10,6,4,0),(101,11,6,4,0),(102,13,6,1,0),(103,14,6,3,0),(104,19,6,1,0),(105,20,6,3,0),(106,24,6,1,0),(107,27,6,6,0),(108,28,6,1,0),(109,32,6,1,0),(110,34,6,1,0),(111,35,6,1,0),(112,37,6,5,0),(113,38,6,4,0),(114,39,6,7,0),(115,40,6,1,0),(116,41,6,3,0),(117,43,6,4,0),(118,46,6,1,0),(119,48,6,4,0),(120,49,6,1,0),(121,50,6,4,0),(122,52,6,1,0),(123,57,6,4,0),(124,58,6,1,0),(125,59,6,2,0),(126,63,6,4,0),(127,64,6,5,0),(128,69,6,4,0),(129,70,6,1,0),(130,72,6,2,0),(131,75,6,1,0),(132,78,6,1,0),(133,79,6,2,0),(134,80,6,2,0),(135,1,7,1,1),(136,2,7,1,0),(137,5,7,2,0),(138,6,7,1,0),(139,7,7,2,0),(140,9,7,1,0),(141,10,7,1,0),(142,13,7,4,0),(143,16,7,2,0),(144,22,7,2,0),(145,23,7,2,0),(146,25,7,5,0),(147,26,7,1,0),(148,28,7,6,0),(149,29,7,2,0),(150,30,7,1,0),(151,31,7,1,0),(152,32,7,3,0),(153,35,7,1,0),(154,37,7,1,0),(155,39,7,3,1),(156,40,7,1,0),(157,43,7,3,0),(158,45,7,1,0),(159,46,7,2,0),(160,47,7,2,0),(161,48,7,2,0),(162,49,7,2,0),(163,52,7,2,0),(164,54,7,4,0),(165,56,7,1,0),(166,57,7,2,0),(167,60,7,1,0),(168,61,7,2,0),(169,62,7,2,0),(170,63,7,2,0),(171,66,7,2,0),(172,67,7,4,0),(173,68,7,1,0),(174,70,7,1,0),(175,73,7,3,0),(176,77,7,3,0),(177,78,7,3,0),(178,79,7,1,0),(179,81,7,1,0),(180,1,8,1,0),(181,5,8,2,0),(182,6,8,1,0),(183,7,8,2,0),(184,8,8,1,0),(185,23,8,2,0),(186,25,8,4,0),(187,32,8,1,0),(188,39,8,2,1),(189,50,8,2,0),(190,1,9,5,0),(191,2,9,4,0),(192,3,9,2,0),(193,4,9,4,0),(194,5,9,1,0),(195,6,9,2,0),(196,8,9,1,0),(197,9,9,4,0),(198,10,9,2,0),(199,11,9,5,0),(200,12,9,1,0),(201,13,9,2,0),(202,14,9,9,0),(203,15,9,5,0),(204,17,9,4,0),(205,20,9,5,0),(206,21,9,3,0),(207,22,9,3,0),(208,23,9,3,0),(209,24,9,1,0),(210,25,9,2,0),(211,26,9,1,0),(212,27,9,2,0),(213,28,9,1,0),(214,29,9,3,0),(215,30,9,2,0),(216,31,9,10,0),(217,32,9,4,0),(218,34,9,2,0),(219,35,9,4,0),(220,36,9,9,0),(221,37,9,4,0),(222,38,9,10,0),(223,39,9,2,0),(224,40,9,2,0),(225,41,9,3,0),(226,42,9,5,0),(227,43,9,6,0),(228,46,9,1,0),(229,48,9,1,0),(230,49,9,5,0),(231,50,9,5,0),(232,51,9,15,0),(233,54,9,5,0),(234,55,9,5,0),(235,58,9,3,0),(236,59,9,3,0),(237,61,9,2,0),(238,62,9,6,0),(239,63,9,1,0),(240,64,9,12,0),(241,65,9,5,0),(242,66,9,4,0),(243,67,9,3,0),(244,68,9,4,0),(245,73,9,3,0),(246,74,9,2,0),(247,75,9,6,0),(248,76,9,4,0),(249,77,9,7,0),(250,78,9,5,0),(251,80,9,5,0),(252,81,9,2,0),(253,1,10,1,0),(254,14,10,1,0),(255,32,10,1,0),(256,38,10,1,0),(257,52,10,1,1),(258,64,10,2,0),(259,1,11,2,0),(260,2,11,2,0),(261,10,11,1,0),(262,11,11,4,0),(263,13,11,3,0),(264,14,11,1,0),(265,17,11,2,0),(266,18,11,4,0),(267,19,11,2,0),(268,20,11,2,0),(269,21,11,4,0),(270,22,11,1,0),(271,23,11,1,0),(272,24,11,1,0),(273,25,11,2,0),(274,26,11,1,0),(275,30,11,1,0),(276,31,11,1,0),(277,32,11,2,0),(278,33,11,2,0),(279,34,11,1,0),(280,38,11,3,0),(281,40,11,2,0),(282,41,11,1,0),(283,43,11,2,0),(284,46,11,1,0),(285,50,11,3,0),(286,51,11,1,0),(287,52,11,1,0),(288,53,11,2,0),(289,57,11,1,0),(290,59,11,2,0),(291,62,11,3,0),(292,64,11,1,0),(293,67,11,1,0),(294,69,11,1,0),(295,70,11,2,0),(296,74,11,2,0),(297,75,11,1,0),(298,77,11,5,0),(299,79,11,2,0),(300,80,11,3,0),(301,81,11,1,0),(302,1,12,1,0),(303,2,12,1,0),(304,4,12,1,0),(305,5,12,1,0),(306,8,12,1,0),(307,16,12,1,0),(308,26,12,1,0),(309,32,12,1,0),(310,34,12,3,0),(311,37,12,1,0),(312,39,12,2,0),(313,40,12,1,0),(314,42,12,2,0),(315,51,12,1,0),(316,62,12,1,0),(317,64,12,1,0),(318,76,12,1,0),(319,1,13,1,0),(320,2,13,1,0),(321,4,13,1,0),(322,5,13,1,0),(323,8,13,1,0),(324,14,13,2,0),(325,16,13,2,0),(326,21,13,2,0),(327,24,13,1,0),(328,25,13,1,0),(329,27,13,2,0),(330,29,13,1,0),(331,30,13,1,0),(332,31,13,1,0),(333,32,13,1,0),(334,34,13,3,0),(335,37,13,1,0),(336,39,13,2,0),(337,40,13,1,0),(338,42,13,3,0),(339,51,13,2,0),(340,55,13,1,0),(341,62,13,1,0),(342,64,13,1,0),(343,65,13,1,0),(344,76,13,1,0),(345,1,14,1,0),(346,20,14,1,0),(347,25,14,1,0),(348,52,14,3,0),(349,59,14,1,0),(350,1,15,1,0),(351,2,15,1,0),(352,7,15,2,0),(353,8,15,2,0),(354,11,15,1,0),(355,12,15,1,0),(356,13,15,1,0),(357,14,15,1,1),(358,15,15,2,0),(359,19,15,1,0),(360,22,15,5,0),(361,23,15,1,0),(362,24,15,1,0),(363,25,15,1,0),(364,27,15,3,0),(365,28,15,1,0),(366,29,15,1,0),(367,31,15,1,0),(368,34,15,1,0),(369,38,15,2,0),(370,39,15,2,0),(371,41,15,1,0),(372,42,15,1,0),(373,44,15,1,0),(374,46,15,1,0),(375,50,15,2,0),(376,51,15,1,0),(377,54,15,1,0),(378,56,15,2,0),(379,57,15,1,0),(380,60,15,1,0),(381,61,15,2,0),(382,62,15,2,0),(383,63,15,2,0),(384,64,15,2,0),(385,65,15,1,0),(386,66,15,2,0),(387,67,15,4,0),(388,69,15,1,0),(389,72,15,1,0),(390,73,15,1,0),(391,76,15,1,0),(392,1,16,2,0),(393,3,16,2,0),(394,15,16,1,0),(395,19,16,1,0),(396,29,16,1,0),(397,34,16,1,0),(398,36,16,4,0),(399,37,16,3,0),(400,39,16,1,0),(401,46,16,2,0),(402,57,16,1,0),(403,61,16,3,0),(404,64,16,2,0),(405,66,16,2,0),(406,77,16,1,0),(407,1,17,2,0),(408,2,17,2,0),(409,3,17,1,0),(410,5,17,2,0),(411,7,17,4,0),(412,11,17,4,0),(413,12,17,1,0),(414,13,17,3,0),(415,14,17,1,0),(416,15,17,2,0),(417,16,17,1,0),(418,19,17,1,0),(419,20,17,1,0),(420,21,17,3,0),(421,22,17,1,0),(422,25,17,1,0),(423,26,17,2,0),(424,27,17,1,0),(425,29,17,1,0),(426,30,17,3,0),(427,31,17,4,0),(428,32,17,2,0),(429,34,17,1,0),(430,36,17,1,0),(431,37,17,2,0),(432,38,17,7,0),(433,39,17,16,0),(434,41,17,1,0),(435,42,17,3,0),(436,43,17,1,0),(437,44,17,1,0),(438,46,17,1,0),(439,47,17,1,0),(440,48,17,3,0),(441,49,17,1,0),(442,50,17,2,0),(443,51,17,1,0),(444,52,17,1,0),(445,54,17,8,0),(446,57,17,5,0),(447,58,17,1,0),(448,59,17,2,0),(449,60,17,1,0),(450,61,17,5,0),(451,62,17,6,0),(452,63,17,3,0),(453,64,17,3,0),(454,65,17,5,0),(455,66,17,8,0),(456,67,17,3,0),(457,70,17,2,0),(458,71,17,3,0),(459,72,17,2,0),(460,73,17,1,0),(461,74,17,1,0),(462,75,17,7,0),(463,76,17,1,0),(464,77,17,3,0),(465,78,17,3,0),(466,79,17,2,0),(467,81,17,2,0),(468,1,18,2,0),(469,16,18,1,0),(470,26,18,1,0),(471,54,18,5,0),(472,1,19,2,0),(473,3,19,4,0),(474,4,19,4,0),(475,5,19,1,0),(476,7,19,5,0),(477,9,19,2,0),(478,11,19,3,0),(479,14,19,4,0),(480,15,19,5,0),(481,16,19,1,0),(482,17,19,4,0),(483,20,19,3,0),(484,21,19,6,0),(485,24,19,1,0),(486,25,19,2,0),(487,27,19,2,0),(488,28,19,6,0),(489,30,19,1,0),(490,33,19,1,0),(491,34,19,2,0),(492,35,19,1,0),(493,38,19,4,0),(494,39,19,1,0),(495,42,19,1,0),(496,45,19,2,0),(497,47,19,2,0),(498,48,19,1,0),(499,49,19,2,0),(500,50,19,5,0),(501,52,19,10,0),(502,54,19,5,0),(503,56,19,6,0),(504,57,19,1,0),(505,58,19,7,0),(506,59,19,2,0),(507,60,19,4,0),(508,61,19,1,0),(509,63,19,3,0),(510,64,19,4,0),(511,65,19,1,0),(512,66,19,2,0),(513,67,19,1,0),(514,71,19,1,0),(515,72,19,2,0),(516,73,19,1,0),(517,74,19,1,0),(518,75,19,3,0),(519,76,19,2,0),(520,77,19,2,0),(521,78,19,1,0),(522,80,19,4,0),(523,1,20,2,1),(524,15,20,1,0),(525,27,20,1,0),(526,1,21,1,1),(527,1,22,1,0),(528,12,22,1,0),(529,14,22,1,0),(530,15,22,1,0),(531,19,22,1,0),(532,21,22,1,0),(533,23,22,1,0),(534,38,22,1,0),(535,39,22,1,0),(536,54,22,1,0),(537,57,22,1,0),(538,62,22,2,0),(539,65,22,1,0),(540,72,22,1,0),(541,73,22,1,0),(542,1,23,1,0),(543,60,23,1,0),(544,61,23,1,0),(545,65,23,1,0),(546,73,23,1,0),(547,1,24,1,0),(548,3,24,1,0),(549,7,24,1,0),(550,13,24,1,0),(551,14,24,1,0),(552,15,24,2,0),(553,19,24,1,0),(554,22,24,1,0),(555,23,24,8,0),(556,24,24,7,0),(557,27,24,2,0),(558,29,24,2,0),(559,30,24,2,0),(560,31,24,5,0),(561,33,24,8,0),(562,38,24,2,0),(563,39,24,1,0),(564,40,24,2,0),(565,42,24,1,0),(566,49,24,4,0),(567,50,24,1,0),(568,54,24,2,0),(569,56,24,2,0),(570,61,24,3,0),(571,62,24,2,0),(572,64,24,2,0),(573,65,24,2,0),(574,66,24,1,0),(575,68,24,4,0),(576,69,24,1,0),(577,70,24,2,0),(578,73,24,1,0),(579,74,24,4,0),(580,75,24,1,0),(581,76,24,2,0),(582,77,24,5,0),(583,78,24,1,0),(584,81,24,4,0),(585,1,25,2,0),(586,4,25,1,0),(587,23,25,6,0),(588,56,25,2,0),(589,1,26,1,0),(590,5,26,1,0),(591,18,26,1,0),(592,35,26,1,0),(593,47,26,2,0),(594,50,26,1,0),(595,1,27,1,0),(596,2,27,4,0),(597,4,27,1,0),(598,5,27,2,0),(599,7,27,2,0),(600,8,27,1,0),(601,9,27,3,0),(602,10,27,3,0),(603,14,27,1,0),(604,17,27,1,0),(605,20,27,3,0),(606,22,27,1,0),(607,23,27,1,0),(608,25,27,3,0),(609,26,27,1,0),(610,27,27,2,0),(611,29,27,1,0),(612,30,27,6,0),(613,31,27,3,0),(614,32,27,1,0),(615,33,27,1,0),(616,34,27,4,0),(617,35,27,1,0),(618,37,27,2,0),(619,38,27,12,0),(620,41,27,1,0),(621,42,27,4,0),(622,47,27,3,0),(623,48,27,1,0),(624,51,27,5,0),(625,53,27,1,0),(626,55,27,3,0),(627,56,27,6,0),(628,57,27,5,0),(629,58,27,4,0),(630,61,27,1,0),(631,64,27,2,0),(632,66,27,3,0),(633,67,27,1,0),(634,69,27,2,0),(635,70,27,1,0),(636,73,27,5,0),(637,74,27,2,0),(638,77,27,3,0),(639,78,27,1,0),(640,79,27,1,0),(641,80,27,3,0),(642,81,27,2,0),(643,1,28,1,0),(644,20,28,1,0),(645,1,29,1,0),(646,6,29,2,0),(647,10,29,1,0),(648,13,29,3,0),(649,14,29,3,0),(650,16,29,1,0),(651,17,29,1,0),(652,22,29,1,0),(653,27,29,2,0),(654,30,29,1,0),(655,36,29,1,0),(656,39,29,1,0),(657,51,29,1,0),(658,52,29,1,0),(659,53,29,1,0),(660,55,29,1,0),(661,56,29,1,0),(662,59,29,3,0),(663,65,29,1,0),(664,67,29,1,0),(665,68,29,3,0),(666,69,29,1,0),(667,74,29,1,0),(668,78,29,2,0),(669,1,30,3,1),(670,6,30,2,0),(671,10,30,2,0),(672,15,30,1,0),(673,51,30,1,0),(674,56,30,1,0),(675,65,30,2,0),(676,1,31,1,0),(677,48,31,1,0),(678,1,32,1,0),(679,8,32,1,0),(680,20,32,3,0),(681,21,32,2,0),(682,31,32,1,0),(683,64,32,1,0),(684,1,33,1,1),(685,6,33,1,1),(686,10,33,1,0),(687,52,33,1,1),(688,56,33,1,0),(689,2,34,2,0),(690,13,34,5,0),(691,14,34,1,0),(692,17,34,1,0),(693,22,34,2,0),(694,25,34,1,0),(695,26,34,1,0),(696,28,34,6,0),(697,29,34,2,0),(698,30,34,1,0),(699,31,34,1,0),(700,32,34,2,0),(701,35,34,1,0),(702,37,34,1,0),(703,38,34,2,0),(704,39,34,2,0),(705,40,34,1,0),(706,41,34,1,0),(707,43,34,3,0),(708,45,34,1,0),(709,46,34,2,0),(710,47,34,1,0),(711,48,34,2,0),(712,49,34,2,0),(713,52,34,2,0),(714,54,34,4,0),(715,56,34,1,0),(716,57,34,2,0),(717,60,34,1,0),(718,61,34,9,0),(719,62,34,1,0),(720,63,34,2,0),(721,64,34,1,0),(722,66,34,4,0),(723,67,34,3,0),(724,68,34,1,0),(725,70,34,1,0),(726,76,34,1,0),(727,77,34,2,0),(728,78,34,3,0),(729,2,35,2,0),(730,17,35,1,0),(731,20,35,2,0),(732,49,35,2,0),(733,67,35,1,0),(734,2,36,2,0),(735,3,36,2,0),(736,4,36,1,0),(737,10,36,2,0),(738,14,36,1,0),(739,16,36,3,0),(740,17,36,1,0),(741,21,36,1,0),(742,25,36,1,0),(743,28,36,3,0),(744,32,36,2,0),(745,33,36,3,1),(746,43,36,1,0),(747,44,36,2,0),(748,46,36,2,0),(749,47,36,3,0),(750,52,36,3,0),(751,53,36,1,0),(752,54,36,1,0),(753,55,36,3,0),(754,56,36,2,0),(755,57,36,1,0),(756,58,36,1,0),(757,59,36,2,0),(758,65,36,2,0),(759,70,36,5,0),(760,71,36,4,0),(761,72,36,1,0),(762,73,36,1,0),(763,78,36,1,0),(764,81,36,2,0),(765,2,37,2,0),(766,31,37,2,0),(767,62,37,2,0),(768,80,37,1,0),(769,81,37,2,0),(770,2,38,4,0),(771,3,38,4,0),(772,5,38,2,0),(773,10,38,2,0),(774,11,38,4,0),(775,12,38,2,0),(776,13,38,5,0),(777,14,38,1,0),(778,15,38,2,0),(779,22,38,1,0),(780,23,38,1,0),(781,25,38,2,0),(782,26,38,2,0),(783,28,38,8,0),(784,29,38,3,0),(785,31,38,1,0),(786,34,38,3,0),(787,37,38,1,0),(788,38,38,9,0),(789,39,38,4,0),(790,41,38,1,0),(791,42,38,3,0),(792,43,38,2,0),(793,45,38,1,0),(794,47,38,1,0),(795,48,38,5,0),(796,49,38,1,0),(797,51,38,1,0),(798,52,38,1,0),(799,56,38,1,0),(800,57,38,1,0),(801,58,38,2,0),(802,61,38,2,0),(803,62,38,1,0),(804,63,38,4,0),(805,64,38,4,0),(806,65,38,1,0),(807,66,38,2,0),(808,67,38,2,0),(809,68,38,2,0),(810,69,38,2,0),(811,74,38,1,0),(812,75,38,2,0),(813,77,38,1,0),(814,79,38,1,0),(815,81,38,2,0),(816,2,39,2,1),(817,2,40,1,1),(818,20,40,1,0),(819,24,40,1,0),(820,42,40,1,0),(821,73,40,1,0),(822,2,41,2,1),(823,9,41,1,1),(824,29,41,1,0),(825,30,41,3,0),(826,31,41,1,0),(827,55,41,1,0),(828,2,42,3,0),(829,8,42,9,0),(830,15,42,1,0),(831,20,42,1,0),(832,27,42,11,0),(833,30,42,1,0),(834,41,42,1,0),(835,49,42,5,0),(836,50,42,1,0),(837,54,42,2,0),(838,58,42,1,0),(839,62,42,3,0),(840,65,42,1,0),(841,66,42,1,0),(842,68,42,4,0),(843,73,42,3,0),(844,79,42,2,0),(845,81,42,2,0),(846,2,43,8,0),(847,3,43,8,0),(848,4,43,2,0),(849,5,43,4,0),(850,6,43,2,0),(851,7,43,1,0),(852,8,43,2,0),(853,9,43,2,0),(854,10,43,3,0),(855,12,43,1,0),(856,14,43,9,0),(857,15,43,5,0),(858,16,43,2,0),(859,17,43,2,0),(860,18,43,1,0),(861,19,43,1,0),(862,20,43,2,0),(863,22,43,5,0),(864,23,43,5,0),(865,24,43,6,0),(866,25,43,3,0),(867,26,43,1,0),(868,27,43,7,0),(869,28,43,3,0),(870,29,43,2,0),(871,30,43,5,0),(872,31,43,6,0),(873,32,43,2,0),(874,33,43,2,0),(875,34,43,5,0),(876,35,43,4,0),(877,36,43,2,0),(878,37,43,2,0),(879,38,43,4,0),(880,39,43,2,0),(881,41,43,3,0),(882,42,43,2,0),(883,43,43,1,0),(884,44,43,2,0),(885,45,43,2,0),(886,46,43,1,0),(887,47,43,5,0),(888,48,43,2,0),(889,49,43,2,0),(890,50,43,2,0),(891,51,43,4,0),(892,52,43,3,0),(893,54,43,3,0),(894,55,43,6,0),(895,56,43,8,0),(896,58,43,4,0),(897,59,43,2,0),(898,60,43,6,0),(899,61,43,2,0),(900,62,43,4,0),(901,63,43,1,0),(902,64,43,4,0),(903,65,43,1,0),(904,66,43,4,0),(905,67,43,4,0),(906,68,43,4,0),(907,69,43,2,0),(908,70,43,1,0),(909,71,43,5,0),(910,72,43,5,0),(911,73,43,5,0),(912,74,43,2,0),(913,76,43,1,0),(914,77,43,7,0),(915,78,43,2,0),(916,79,43,1,0),(917,80,43,3,0),(918,81,43,9,0),(919,2,44,6,0),(920,20,44,2,0),(921,32,44,1,0),(922,60,44,1,0),(923,69,44,1,0),(924,80,44,3,0),(925,2,45,2,0),(926,7,45,2,0),(927,10,45,2,0),(928,15,45,1,0),(929,25,45,1,0),(930,30,45,1,0),(931,34,45,1,0),(932,39,45,2,0),(933,40,45,2,0),(934,42,45,4,0),(935,46,45,1,0),(936,50,45,6,0),(937,51,45,3,0),(938,55,45,1,0),(939,59,45,1,0),(940,64,45,1,0),(941,72,45,1,0),(942,75,45,3,0),(943,76,45,3,0),(944,2,46,1,0),(945,3,46,1,0),(946,12,46,1,0),(947,63,46,5,0),(948,64,46,1,0),(949,65,46,1,0),(950,73,46,1,0),(951,75,46,2,0),(952,2,47,1,0),(953,63,47,3,0),(954,64,47,4,0),(955,70,47,2,0),(956,78,47,1,0),(957,2,48,2,0),(958,7,48,1,0),(959,9,48,1,0),(960,15,48,1,0),(961,17,48,1,0),(962,25,48,1,0),(963,34,48,2,0),(964,41,48,2,0),(965,45,48,1,0),(966,47,48,1,0),(967,51,48,1,0),(968,63,48,1,0),(969,64,48,1,0),(970,67,48,1,0),(971,77,48,1,0),(972,2,49,1,0),(973,7,49,3,0),(974,9,49,1,0),(975,10,49,1,0),(976,22,49,1,0),(977,24,49,1,0),(978,28,49,1,0),(979,44,49,1,0),(980,51,49,2,0),(981,54,49,1,0),(982,59,49,2,0),(983,67,49,1,0),(984,2,50,1,0),(986,2,52,1,0),(987,39,52,2,0),(988,77,52,1,0),(989,2,53,1,0),(990,2,54,1,0),(991,12,54,1,0),(992,41,54,1,0),(993,2,55,1,0),(994,41,55,1,1),(995,80,55,1,0),(996,2,56,1,0),(997,4,56,1,0),(998,18,56,1,0),(999,42,56,1,0),(1000,55,56,2,0),(1001,56,56,1,0),(1002,79,56,1,0),(1003,2,57,1,0),(1004,38,57,1,0),(1005,66,57,1,0),(1006,2,58,1,0),(1007,7,58,1,0),(1008,14,58,1,0),(1009,30,58,1,0),(1010,38,58,4,0),(1011,65,58,1,0),(1012,66,58,1,0),(1013,67,58,1,0),(1014,2,59,1,0),(1015,14,59,1,0),(1016,29,59,1,0),(1017,2,60,2,0),(1018,3,60,1,0),(1019,6,60,2,0),(1020,7,60,1,0),(1021,10,60,1,0),(1022,12,60,1,0),(1023,13,60,1,0),(1024,14,60,3,0),(1025,16,60,1,0),(1026,21,60,1,0),(1027,22,60,2,0),(1028,24,60,1,0),(1029,26,60,1,0),(1030,27,60,3,0),(1031,29,60,1,0),(1032,30,60,1,0),(1033,31,60,1,0),(1034,34,60,1,0),(1035,36,60,1,0),(1036,38,60,3,0),(1037,39,60,1,0),(1038,43,60,1,0),(1039,44,60,1,0),(1040,47,60,1,0),(1041,51,60,2,0),(1042,52,60,1,0),(1043,53,60,2,0),(1044,56,60,1,0),(1045,58,60,1,0),(1046,59,60,2,0),(1047,63,60,2,0),(1048,64,60,2,0),(1049,65,60,1,0),(1050,66,60,3,0),(1051,68,60,3,0),(1052,69,60,1,0),(1053,70,60,2,0),(1054,71,60,2,0),(1055,72,60,2,0),(1056,73,60,1,0),(1057,74,60,1,0),(1058,75,60,4,0),(1059,76,60,1,0),(1060,77,60,1,0),(1061,78,60,3,0),(1062,79,60,1,0),(1063,2,61,1,0),(1064,3,61,1,0),(1065,5,61,1,0),(1066,7,61,1,0),(1067,12,61,1,0),(1068,19,61,1,1),(1069,22,61,1,0),(1070,26,61,1,0),(1071,27,61,1,0),(1072,28,61,1,0),(1073,29,61,1,0),(1074,34,61,1,0),(1075,47,61,1,0),(1076,49,61,3,0),(1077,57,61,1,0),(1078,58,61,1,0),(1079,60,61,1,0),(1080,63,61,2,0),(1081,64,61,2,0),(1082,66,61,1,0),(1083,70,61,1,0),(1084,71,61,1,0),(1085,72,61,1,0),(1086,73,61,1,0),(1087,77,61,1,0),(1088,78,61,1,0),(1089,79,61,1,0),(1090,81,61,2,0),(1091,2,62,1,0),(1092,3,62,1,0),(1093,5,62,1,0),(1094,7,62,1,0),(1095,8,62,1,0),(1096,12,62,6,0),(1097,20,62,8,0),(1098,22,62,1,0),(1099,23,62,1,0),(1100,25,62,1,0),(1101,26,62,1,0),(1102,27,62,7,0),(1103,28,62,1,0),(1104,29,62,1,0),(1105,30,62,1,0),(1106,31,62,3,0),(1107,33,62,2,0),(1108,34,62,1,0),(1109,36,62,1,0),(1110,42,62,2,0),(1111,47,62,1,0),(1112,49,62,3,0),(1113,50,62,1,0),(1114,57,62,2,0),(1115,58,62,2,0),(1116,59,62,1,0),(1117,60,62,4,0),(1118,61,62,2,0),(1119,62,62,4,0),(1120,63,62,2,0),(1121,64,62,3,0),(1122,66,62,1,0),(1123,68,62,2,0),(1124,70,62,1,0),(1125,71,62,1,0),(1126,72,62,1,0),(1127,73,62,1,0),(1128,76,62,1,0),(1129,77,62,2,0),(1130,78,62,1,0),(1131,79,62,3,0),(1132,81,62,4,0),(1133,2,63,1,0),(1134,8,63,1,0),(1135,24,63,1,0),(1136,26,63,1,0),(1137,38,63,2,0),(1138,66,63,2,0),(1139,77,63,1,0),(1140,2,64,1,0),(1141,8,64,1,0),(1142,17,64,1,0),(1143,23,64,1,0),(1144,30,64,1,0),(1145,31,64,2,0),(1146,48,64,2,0),(1147,52,64,1,1),(1148,57,64,3,0),(1149,59,64,1,1),(1150,61,64,1,0),(1151,63,64,4,0),(1152,64,64,2,0),(1153,70,64,1,1),(1154,2,65,1,0),(1155,12,65,1,0),(1156,24,65,2,0),(1157,25,65,1,0),(1158,26,65,1,0),(1159,27,65,1,0),(1160,29,65,1,0),(1161,33,65,1,0),(1162,41,65,1,0),(1163,47,65,1,0),(1164,50,65,1,0),(1165,53,65,1,0),(1166,62,65,1,0),(1167,64,65,1,0),(1168,69,65,2,0),(1169,70,65,2,0),(1170,78,65,1,0),(1171,2,66,1,0),(1172,5,66,1,0),(1173,8,66,1,0),(1174,17,66,1,0),(1175,22,66,1,0),(1176,23,66,1,0),(1177,27,66,1,0),(1178,31,66,1,0),(1179,35,66,1,0),(1180,41,66,1,0),(1181,43,66,1,0),(1182,56,66,2,0),(1183,62,66,1,0),(1184,66,66,1,0),(1185,69,66,1,0),(1186,70,66,2,0),(1187,73,66,1,0),(1188,78,66,1,0),(1189,81,66,2,0),(1190,2,67,1,0),(1191,42,67,3,0),(1192,43,67,1,0),(1193,2,68,1,1),(1194,16,68,2,0),(1195,37,68,1,0),(1196,55,68,1,0),(1197,63,68,2,0),(1198,2,69,1,0),(1199,17,69,1,0),(1200,23,69,2,0),(1201,25,69,1,0),(1202,30,69,1,1),(1203,60,69,1,0),(1204,2,70,1,1),(1205,34,70,1,1),(1206,2,71,1,0),(1207,10,71,1,0),(1208,34,71,1,0),(1209,51,71,1,0),(1210,77,71,1,0),(1211,2,72,1,0),(1212,9,72,1,0),(1213,17,72,1,0),(1214,22,72,1,0),(1215,24,72,1,0),(1216,34,72,1,0),(1217,77,72,1,0),(1218,2,73,2,0),(1219,8,73,1,0),(1220,25,73,1,0),(1221,31,73,3,0),(1222,38,73,2,0),(1223,72,73,1,0),(1224,80,73,1,0),(1225,2,74,1,0),(1226,3,74,1,0),(1227,8,74,1,0),(1228,15,74,2,0),(1229,16,74,1,0),(1231,22,74,1,0),(1232,31,74,2,0),(1233,32,74,1,0),(1234,37,74,1,0),(1235,38,74,2,0),(1236,41,74,1,0),(1237,50,74,2,0),(1238,51,74,1,0),(1239,59,74,1,0),(1240,60,74,1,0),(1241,61,74,1,0),(1242,63,74,1,0),(1243,67,74,3,0),(1244,70,74,1,0),(1245,71,74,1,0),(1246,72,74,1,0),(1247,74,74,2,0),(1248,75,74,1,0),(1249,2,75,1,0),(1250,8,75,1,0),(1251,15,75,2,0),(1252,20,75,1,0),(1253,41,75,1,0),(1254,42,75,1,0),(1255,53,75,1,0),(1256,59,75,1,0),(1257,67,75,1,0),(1258,70,75,1,0),(1259,71,75,1,0),(1260,72,75,1,0),(1261,75,75,1,0),(1262,77,75,1,0),(1263,2,76,1,0),(1264,12,76,1,0),(1265,20,76,2,0),(1266,21,76,1,0),(1267,29,76,3,0),(1268,38,76,1,0),(1269,72,76,1,0),(1270,3,77,1,0),(1271,23,77,1,0),(1272,31,77,2,0),(1273,3,78,1,0),(1274,75,78,1,0),(1275,77,78,1,0),(1276,3,79,5,1),(1277,53,79,1,1),(1278,55,79,1,0),(1279,74,79,1,0),(1280,80,79,3,0),(1281,3,80,3,0),(1282,10,80,1,0),(1283,19,80,2,0),(1284,32,80,1,0),(1285,53,80,1,0),(1286,57,80,6,0),(1287,58,80,2,0),(1288,64,80,1,0),(1289,65,80,2,0),(1290,66,80,4,0),(1291,72,80,1,0),(1292,74,80,2,0),(1293,75,80,3,0),(1294,80,80,4,0),(1295,3,81,1,0),(1296,66,81,2,0),(1297,68,81,1,0),(1298,73,81,1,0),(1299,81,81,1,0),(1300,3,82,1,0),(1301,9,82,1,0),(1302,13,82,3,0),(1303,17,82,1,0),(1304,20,82,1,0),(1305,27,82,1,0),(1306,31,82,2,0),(1307,39,82,2,0),(1308,51,82,2,0),(1309,56,82,2,0),(1310,62,82,2,0),(1311,64,82,1,0),(1312,70,82,1,0),(1313,72,82,1,0),(1314,75,82,1,0),(1315,3,83,1,0),(1316,12,83,1,0),(1317,13,83,1,0),(1318,14,83,1,0),(1319,22,83,1,0),(1320,23,83,3,0),(1321,29,83,1,0),(1322,30,83,1,0),(1323,31,83,2,0),(1324,39,83,7,0),(1325,42,83,1,0),(1326,44,83,1,0),(1327,46,83,1,0),(1328,56,83,6,0),(1329,61,83,1,0),(1330,62,83,1,0),(1331,64,83,1,0),(1332,74,83,1,0),(1333,3,84,1,0),(1334,12,84,1,0),(1335,44,84,1,0),(1336,53,84,1,0),(1337,64,84,1,0),(1338,3,85,1,0),(1339,3,86,1,1),(1340,14,86,3,0),(1341,19,86,1,1),(1342,22,86,1,0),(1343,24,86,1,1),(1344,29,86,1,0),(1345,35,86,1,0),(1346,47,86,2,0),(1347,52,86,1,0),(1348,72,86,1,0),(1349,77,86,1,0),(1350,3,87,2,0),(1351,8,87,1,0),(1352,12,87,1,0),(1353,20,87,1,0),(1354,49,87,4,0),(1355,55,87,1,0),(1356,3,88,1,0),(1357,18,88,1,0),(1358,38,88,1,0),(1359,64,88,1,0),(1360,3,89,2,1),(1361,8,89,1,0),(1362,10,89,1,0),(1363,57,89,1,0),(1364,59,89,1,0),(1365,60,89,1,0),(1366,64,89,1,0),(1367,65,89,3,0),(1368,75,89,2,0),(1369,3,90,1,1),(1370,5,90,1,0),(1371,16,90,1,1),(1372,22,90,1,0),(1373,53,90,1,0),(1374,3,91,1,1),(1375,38,91,1,1),(1376,3,92,1,1),(1377,12,92,1,1),(1378,3,93,1,0),(1379,36,93,2,0),(1380,40,93,1,0),(1381,55,93,1,0),(1382,76,93,3,0),(1383,78,93,2,0),(1384,3,94,1,1),(1385,31,94,1,1),(1386,33,94,1,1),(1387,3,95,1,0),(1388,15,95,1,0),(1389,25,95,1,0),(1390,29,95,1,0),(1391,30,95,3,0),(1392,33,95,2,0),(1393,36,95,2,0),(1394,42,95,1,0),(1395,52,95,1,0),(1396,55,95,1,0),(1397,76,95,5,0),(1398,78,95,2,0),(1399,3,96,1,1),(1400,55,96,1,0),(1401,3,97,1,0),(1402,30,97,1,0),(1403,32,97,1,0),(1404,64,97,1,0),(1405,67,97,2,0),(1406,69,97,2,0),(1407,73,97,2,0),(1408,74,97,1,0),(1409,3,98,1,0),(1410,20,98,1,0),(1411,24,98,1,0),(1412,29,98,1,0),(1413,39,98,1,0),(1414,55,98,2,0),(1415,76,98,4,0),(1416,3,99,1,0),(1417,22,99,7,0),(1418,26,99,2,0),(1419,28,99,2,0),(1420,30,99,1,0),(1421,31,99,3,0),(1422,38,99,1,0),(1423,55,99,1,0),(1424,59,99,2,0),(1425,61,99,2,0),(1426,64,99,1,0),(1427,67,99,2,0),(1428,70,99,1,0),(1429,72,99,1,0),(1430,73,99,2,0),(1431,76,99,2,0),(1432,77,99,1,0),(1433,4,100,1,1),(1434,42,100,1,0),(1435,4,101,1,0),(1436,6,101,1,0),(1437,11,101,4,0),(1438,28,101,1,0),(1439,31,101,2,0),(1440,35,101,1,0),(1441,40,101,1,0),(1442,45,101,2,0),(1443,52,101,1,0),(1444,57,101,1,0),(1445,68,101,2,0),(1446,69,101,1,0),(1447,80,101,2,0),(1448,4,102,2,0),(1449,24,102,1,0),(1450,29,102,8,1),(1451,31,102,1,0),(1452,42,102,2,0),(1453,61,102,2,0),(1454,73,102,2,0),(1455,4,103,1,0),(1456,9,103,1,1),(1457,15,103,2,0),(1458,22,103,1,0),(1459,39,103,2,0),(1460,45,103,1,0),(1461,4,104,1,1),(1462,8,104,1,1),(1463,36,104,1,1),(1464,4,105,2,0),(1465,15,105,7,0),(1466,17,105,1,0),(1467,20,105,6,0),(1468,21,105,6,0),(1469,25,105,2,0),(1470,34,105,1,0),(1471,58,105,2,0),(1472,4,106,2,0),(1473,20,106,1,0),(1474,67,106,2,0),(1475,4,107,1,1),(1476,70,107,1,1),(1477,4,108,1,0),(1478,56,108,1,1),(1479,4,109,1,0),(1480,9,109,1,0),(1481,56,109,1,1),(1482,4,110,1,0),(1483,27,110,1,0),(1484,56,110,1,1),(1485,4,111,1,0),(1486,56,111,1,1),(1487,4,112,1,0),(1488,52,112,1,0),(1489,56,112,1,0),(1490,58,112,1,0),(1491,4,113,1,0),(1492,56,113,1,1),(1493,4,114,1,1),(1494,4,115,1,0),(1495,6,115,1,0),(1496,7,115,1,0),(1497,41,115,1,0),(1498,4,116,1,1),(1499,13,116,4,1),(1500,16,116,1,0),(1501,21,116,1,0),(1502,25,116,1,0),(1503,29,116,1,0),(1504,37,116,1,0),(1505,42,116,1,0),(1506,43,116,1,0),(1507,49,116,4,0),(1508,54,116,1,0),(1509,57,116,1,0),(1510,69,116,2,0),(1511,70,116,1,0),(1512,74,116,1,0),(1513,4,117,1,0),(1514,4,118,1,0),(1515,31,118,2,0),(1516,52,118,2,0),(1517,54,118,1,0),(1518,55,118,1,0),(1519,62,118,1,0),(1520,4,119,1,1),(1521,14,119,1,0),(1522,21,119,1,1),(1523,35,119,1,0),(1524,41,119,1,0),(1525,4,120,1,1),(1526,4,121,1,0),(1527,7,121,1,0),(1528,25,121,1,0),(1529,62,121,1,0),(1530,66,121,1,0),(1531,67,121,3,0),(1532,5,122,2,0),(1533,8,122,1,0),(1534,18,122,1,1),(1535,19,122,1,1),(1536,38,122,3,1),(1537,5,123,2,0),(1538,5,124,2,0),(1539,5,125,1,0),(1540,17,125,1,0),(1541,19,125,1,0),(1542,49,125,2,0),(1543,66,125,2,0),(1544,5,126,1,0),(1545,17,126,1,0),(1546,49,126,2,0),(1547,5,127,1,0),(1548,43,127,1,0),(1549,5,128,1,1),(1550,15,128,1,1),(1551,32,128,1,0),(1552,63,128,1,0),(1553,73,128,1,0),(1554,77,128,1,0),(1555,5,129,1,0),(1556,5,130,1,0),(1557,5,131,1,0),(1558,10,131,6,0),(1559,23,131,1,0),(1560,35,131,1,0),(1561,39,131,1,0),(1562,77,131,1,0),(1563,5,132,1,1),(1564,5,133,1,0),(1565,8,133,1,0),(1566,15,133,1,0),(1567,40,133,1,0),(1568,50,133,1,0),(1569,5,134,1,1),(1570,81,134,2,1),(1571,5,135,1,0),(1572,22,135,1,0),(1573,44,135,2,0),(1574,57,135,4,0),(1575,63,135,3,0),(1576,65,135,1,0),(1577,75,135,1,0),(1578,81,135,1,0),(1579,5,136,1,1),(1580,27,136,1,0),(1581,39,136,1,0),(1582,5,137,1,0),(1583,45,137,1,1),(1584,5,138,1,0),(1585,9,138,1,0),(1586,20,138,3,0),(1587,39,138,2,0),(1588,62,138,1,0),(1589,64,138,1,0),(1590,5,139,1,0),(1591,9,139,1,0),(1592,16,139,1,0),(1593,28,139,3,0),(1594,32,139,1,0),(1595,37,139,1,0),(1596,52,139,2,0),(1597,67,139,1,0),(1598,5,140,1,1),(1599,21,140,4,0),(1600,25,140,1,0),(1601,41,140,1,0),(1602,6,141,1,1),(1603,15,141,1,0),(1604,28,141,2,0),(1605,32,141,1,0),(1606,39,141,2,1),(1607,41,141,1,0),(1608,66,141,2,0),(1609,6,142,1,0),(1610,29,142,1,0),(1611,39,142,2,1),(1612,60,142,4,1),(1613,6,143,1,0),(1614,33,143,1,0),(1615,42,143,1,0),(1616,50,143,4,0),(1617,67,143,1,0),(1618,74,143,3,0),(1619,75,143,2,0),(1620,76,143,3,0),(1621,80,143,2,0),(1622,6,144,2,0),(1623,55,144,1,0),(1624,61,144,2,0),(1625,6,145,1,1),(1626,16,145,2,0),(1627,26,145,1,0),(1628,59,145,1,0),(1629,6,146,2,0),(1630,6,147,1,0),(1631,8,147,1,0),(1632,13,147,9,0),(1633,15,147,7,0),(1634,20,147,5,0),(1635,32,147,1,0),(1636,37,147,1,1),(1637,41,147,10,0),(1638,45,147,5,0),(1639,59,147,1,0),(1640,60,147,1,0),(1641,67,147,1,1),(1642,74,147,1,0),(1643,78,147,1,0),(1644,6,148,1,1),(1645,41,148,1,0),(1646,52,148,1,1),(1647,7,149,2,0),(1648,16,149,1,0),(1649,23,149,1,0),(1650,33,149,1,0),(1651,44,149,1,0),(1652,58,149,1,0),(1653,59,149,2,0),(1654,67,149,1,0),(1655,7,150,1,0),(1656,8,150,1,0),(1657,13,150,1,0),(1658,19,150,1,0),(1659,20,150,2,0),(1660,22,150,1,0),(1661,30,150,1,0),(1662,32,150,1,0),(1663,33,150,1,0),(1664,42,150,2,0),(1665,50,150,3,0),(1666,58,150,2,0),(1667,61,150,1,0),(1668,62,150,2,0),(1669,64,150,1,0),(1670,66,150,1,0),(1671,72,150,2,0),(1672,73,150,1,0),(1673,80,150,2,0),(1674,7,151,3,0),(1675,8,151,1,0),(1676,9,151,1,0),(1677,10,151,6,0),(1678,14,151,1,0),(1679,15,151,3,0),(1680,22,151,1,0),(1681,23,151,1,0),(1682,32,151,1,0),(1683,34,151,1,0),(1684,37,151,1,0),(1685,63,151,1,0),(1686,66,151,3,0),(1687,67,151,3,0),(1688,70,151,2,0),(1689,77,151,1,0),(1690,78,151,2,0),(1691,7,152,1,1),(1692,41,152,1,0),(1693,67,152,3,1),(1694,7,153,1,0),(1695,9,153,1,0),(1696,17,153,1,0),(1697,21,153,1,0),(1698,22,153,4,0),(1699,23,153,1,0),(1700,24,153,4,0),(1701,25,153,1,0),(1702,32,153,2,0),(1703,33,153,2,0),(1704,34,153,1,0),(1705,37,153,2,0),(1706,39,153,1,0),(1707,51,153,1,0),(1708,57,153,4,0),(1709,64,153,1,0),(1710,72,153,4,0),(1711,73,153,1,0),(1712,7,154,4,0),(1713,9,154,1,0),(1714,13,154,6,0),(1715,16,154,1,0),(1716,26,154,1,0),(1717,44,154,2,0),(1718,52,154,4,0),(1719,54,154,3,0),(1720,66,154,1,0),(1721,7,155,1,0),(1722,7,156,2,0),(1723,19,156,1,0),(1724,7,157,1,0),(1725,39,157,1,0),(1726,62,157,1,0),(1727,8,158,1,0),(1728,13,158,1,0),(1729,14,158,1,0),(1730,17,158,1,0),(1731,31,158,2,0),(1732,38,158,5,0),(1733,41,158,2,0),(1734,66,158,2,0),(1735,71,158,1,0),(1736,75,158,3,0),(1737,76,158,1,0),(1738,8,159,2,1),(1739,78,159,1,0),(1740,8,160,1,0),(1741,11,160,1,0),(1742,19,160,2,0),(1743,36,160,1,0),(1744,53,160,1,0),(1745,56,160,1,0),(1746,57,160,1,0),(1747,73,160,1,0),(1748,81,160,1,0),(1753,8,163,1,1),(1754,20,163,1,0),(1755,64,163,1,0),(1756,69,163,1,0),(1757,8,164,1,0),(1758,14,164,1,0),(1759,20,164,1,0),(1760,23,164,8,0),(1761,24,164,1,0),(1762,28,164,3,0),(1763,31,164,1,0),(1764,34,164,1,0),(1765,36,164,1,0),(1766,40,164,2,1),(1767,46,164,4,0),(1768,48,164,1,0),(1769,53,164,1,0),(1770,54,164,5,0),(1771,55,164,1,0),(1772,63,164,4,0),(1773,64,164,6,0),(1774,69,164,1,0),(1775,73,164,2,0),(1776,75,164,1,0),(1777,78,164,1,0),(1778,79,164,1,0),(1779,8,165,1,1),(1781,20,165,2,0),(1782,22,165,1,1),(1783,32,165,1,0),(1784,35,165,1,0),(1785,36,165,1,0),(1786,44,165,3,1),(1787,65,165,1,0),(1788,66,165,1,1),(1789,68,165,1,1),(1790,79,165,1,0),(1791,81,165,1,1),(1792,8,166,1,0),(1793,17,166,2,0),(1794,21,166,1,0),(1795,23,166,2,0),(1796,38,166,1,0),(1797,49,166,5,0),(1798,63,166,1,0),(1799,81,166,2,0),(1800,8,167,1,0),(1801,45,167,1,0),(1802,57,167,2,0),(1803,58,167,2,0),(1804,78,167,1,0),(1805,8,168,1,0),(1806,8,169,1,1),(1807,9,170,1,0),(1808,64,170,1,0),(1809,67,170,1,0),(1810,9,171,1,1),(1811,9,172,1,0),(1812,15,172,1,0),(1813,62,172,1,0),(1814,67,172,1,0),(1815,9,173,1,0),(1816,9,174,1,0),(1817,39,174,1,0),(1818,70,174,1,0),(1819,9,175,1,0),(1820,9,176,1,0),(1821,9,177,1,0),(1822,22,177,1,0),(1823,32,177,1,0),(1824,38,177,1,0),(1825,46,177,3,0),(1826,51,177,2,0),(1827,59,177,3,0),(1828,66,177,1,0),(1829,69,177,1,0),(1830,70,177,2,0),(1831,78,177,4,0),(1832,9,178,1,0),(1833,33,178,1,0),(1834,57,178,1,0),(1835,9,179,1,1),(1836,30,179,1,0),(1837,9,180,1,0),(1838,20,180,1,0),(1839,52,180,1,0),(1840,9,181,1,1),(1841,46,181,1,1),(1842,9,182,1,0),(1843,17,182,1,0),(1844,9,183,1,0),(1845,41,183,1,0),(1846,69,183,1,0),(1847,10,184,1,0),(1849,10,185,1,1),(1850,10,186,1,1),(1851,10,187,1,0),(1852,19,187,1,0),(1853,22,187,1,0),(1854,42,187,1,0),(1855,54,187,1,0),(1856,64,187,1,0),(1857,10,188,1,1),(1858,11,188,1,0),(1859,14,188,1,0),(1860,22,188,1,1),(1861,25,188,1,0),(1862,39,188,8,1),(1863,42,188,2,1),(1864,67,188,1,0),(1865,10,189,1,0),(1866,26,189,1,0),(1867,28,189,1,0),(1868,10,190,1,1),(1869,10,191,1,1),(1870,42,191,1,0),(1871,55,191,1,0),(1872,10,192,1,0),(1873,14,192,1,0),(1874,16,192,1,0),(1875,39,192,2,0),(1876,10,193,1,0),(1877,36,193,1,0),(1878,43,193,1,0),(1879,52,193,1,0),(1880,55,193,1,0),(1881,76,193,4,0),(1882,78,193,2,0),(1883,10,194,1,0),(1884,20,194,1,0),(1885,28,194,1,0),(1886,10,195,1,0),(1887,20,195,1,0),(1888,28,195,1,0),(1889,10,196,1,0),(1890,10,197,1,0),(1891,53,197,1,0),(1892,10,198,1,0),(1893,10,199,1,1),(1894,10,200,1,0),(1895,13,200,1,0),(1896,27,200,1,0),(1897,34,200,1,0),(1898,44,200,1,0),(1899,72,200,1,0),(1901,10,202,1,0),(1902,27,202,1,0),(1903,52,202,1,0),(1904,10,203,1,0),(1905,10,204,1,0),(1906,28,204,1,0),(1907,10,205,1,0),(1908,16,205,1,1),(1909,22,205,1,0),(1910,24,205,1,1),(1911,27,205,1,0),(1912,33,205,1,1),(1913,36,205,1,0),(1914,41,205,1,0),(1915,52,205,2,1),(1916,55,205,1,0),(1917,65,205,1,0),(1918,10,206,1,0),(1919,28,206,1,1),(1920,41,206,1,0),(1921,10,207,1,0),(1922,15,207,1,0),(1923,25,207,1,0),(1924,10,208,1,0),(1925,10,209,1,0),(1926,51,209,2,0),(1927,61,209,1,0),(1928,10,210,1,0),(1929,51,210,1,0),(1930,10,211,1,0),(1931,21,211,1,0),(1932,23,211,4,0),(1933,28,211,3,0),(1934,38,211,10,0),(1935,41,211,3,0),(1936,49,211,2,0),(1937,51,211,5,0),(1938,54,211,5,0),(1939,55,211,1,0),(1940,59,211,2,0),(1941,60,211,1,0),(1942,63,211,1,0),(1943,65,211,2,0),(1944,68,211,1,0),(1945,79,211,2,0),(1946,11,212,1,0),(1947,14,212,1,0),(1948,19,212,1,0),(1949,42,212,2,1),(1950,50,212,3,0),(1951,62,212,1,0),(1952,67,212,2,0),(1953,11,213,1,0),(1954,50,213,3,0),(1955,11,214,1,1),(1956,11,215,1,0),(1957,11,216,1,1),(1958,11,217,3,1),(1959,11,218,1,0),(1960,11,219,1,1),(1961,11,220,1,1),(1962,11,221,2,0),(1963,28,221,1,0),(1964,29,221,1,0),(1965,31,221,3,1),(1966,36,221,1,0),(1967,41,221,1,0),(1968,51,221,1,0),(1969,57,221,1,0),(1970,67,221,1,0),(1971,80,221,1,0),(1972,11,222,1,1),(1973,11,223,1,0),(1974,47,223,1,0),(1975,11,224,1,1),(1976,47,224,1,1),(1977,11,225,2,0),(1978,12,226,3,0),(1979,12,227,1,0),(1980,12,228,5,1),(1981,19,228,1,1),(1982,32,228,1,0),(1983,57,228,1,0),(1984,12,229,2,0),(1985,49,229,1,0),(1986,12,230,1,0),(1987,12,231,1,0),(1988,49,231,1,0),(1989,12,232,1,0),(1990,12,233,1,0),(1991,35,233,1,0),(1992,63,233,2,0),(1993,12,234,1,0),(1994,12,235,1,0),(1995,12,236,1,0),(1996,43,236,1,0),(1997,12,237,1,0),(1998,43,237,1,0),(1999,12,238,1,0),(2000,53,238,1,0),(2001,12,239,1,0),(2002,12,240,1,0),(2003,12,241,1,0),(2004,12,242,1,0),(2005,12,243,1,0),(2006,38,243,1,0),(2007,72,243,1,0),(2008,12,244,1,0),(2009,29,244,1,0),(2010,30,244,1,0),(2011,38,244,1,0),(2012,48,244,2,0),(2013,57,244,1,0),(2014,61,244,4,0),(2015,72,244,1,0),(2016,13,245,4,1),(2017,13,246,4,1),(2018,28,246,1,0),(2019,41,246,1,0),(2020,44,246,1,0),(2021,13,247,5,0),(2022,13,248,3,0),(2023,18,248,2,0),(2024,25,248,7,1),(2025,27,248,1,0),(2026,28,248,1,0),(2027,30,248,1,0),(2028,34,248,4,1),(2029,35,248,2,0),(2030,38,248,1,0),(2031,41,248,6,0),(2032,44,248,1,0),(2033,45,248,5,0),(2034,46,248,3,0),(2035,53,248,2,0),(2036,60,248,1,0),(2037,61,248,6,0),(2038,63,248,5,0),(2039,65,248,1,0),(2040,67,248,2,0),(2041,69,248,1,0),(2042,72,248,1,0),(2043,74,248,2,0),(2044,76,248,1,0),(2045,79,248,1,0),(2046,13,249,4,0),(2047,13,250,3,0),(2048,20,250,2,0),(2049,21,250,1,0),(2050,26,250,1,0),(2051,50,250,2,0),(2052,54,250,1,0),(2053,57,250,1,0),(2054,62,250,2,0),(2055,74,250,1,0),(2056,13,251,1,0),(2057,23,251,4,0),(2058,26,251,2,0),(2059,29,251,1,0),(2060,33,251,1,0),(2061,38,251,5,0),(2062,64,251,2,0),(2063,73,251,1,0),(2064,13,252,1,0),(2065,21,252,1,0),(2066,43,252,1,0),(2067,48,252,1,0),(2068,13,253,1,0),(2069,13,254,1,0),(2070,14,255,1,1),(2071,35,255,1,0),(2072,59,255,1,0),(2073,14,256,3,0),(2074,16,256,3,0),(2075,24,256,1,0),(2076,25,256,5,1),(2077,52,256,2,0),(2078,55,256,4,0),(2079,62,256,1,0),(2080,67,256,3,0),(2081,14,257,1,1),(2082,41,257,1,1),(2083,53,257,1,1),(2084,14,258,1,1),(2085,35,258,1,0),(2086,14,259,1,0),(2087,35,259,1,0),(2088,41,259,3,0),(2089,50,259,1,0),(2090,80,259,1,0),(2091,14,260,1,1),(2092,23,260,1,0),(2093,41,260,1,0),(2094,43,260,1,1),(2095,70,260,1,0),(2096,74,260,1,0),(2097,14,261,1,1),(2098,14,262,1,1),(2099,15,262,1,0),(2100,36,262,1,0),(2101,64,262,1,0),(2102,14,263,1,1),(2103,14,264,1,0),(2104,15,264,1,0),(2105,25,264,1,0),(2106,14,265,1,1),(2107,14,266,1,1),(2108,14,267,2,0),(2109,27,267,1,0),(2110,80,267,1,0),(2111,14,268,1,0),(2112,16,268,3,0),(2113,19,268,1,0),(2114,28,268,3,0),(2115,52,268,3,0),(2116,58,268,2,0),(2117,64,268,1,0),(2118,80,268,1,0),(2119,14,269,1,0),(2120,16,269,2,0),(2121,20,269,1,0),(2122,22,269,1,0),(2123,28,269,3,0),(2124,34,269,1,1),(2125,52,269,1,0),(2126,60,269,1,0),(2127,14,270,2,0),(2128,21,270,1,0),(2129,14,271,1,0),(2130,21,271,3,1),(2131,14,272,1,0),(2132,21,272,3,1),(2133,14,273,1,0),(2134,14,274,1,0),(2135,38,274,1,0),(2136,14,275,1,0),(2137,29,275,1,0),(2138,35,275,1,0),(2139,64,275,2,0),(2140,69,275,1,1),(2141,74,275,1,0),(2142,79,275,1,0),(2143,14,276,2,0),(2144,15,276,1,0),(2145,21,276,1,0),(2146,22,276,1,0),(2147,62,276,1,0),(2148,65,276,1,0),(2149,14,277,1,0),(2150,14,278,1,0),(2151,21,278,1,0),(2152,67,278,1,0),(2153,14,279,1,0),(2154,15,280,1,0),(2155,41,280,3,1),(2156,68,280,1,0),(2157,15,281,1,0),(2158,15,282,1,0),(2159,59,282,1,0),(2160,65,282,1,0),(2161,15,283,2,0),(2162,38,283,1,0),(2163,15,284,1,0),(2164,16,284,2,0),(2165,21,284,1,0),(2166,50,284,1,0),(2167,15,285,1,0),(2168,15,286,1,0),(2169,15,287,1,0),(2170,32,287,1,0),(2171,15,288,1,0),(2172,17,288,1,1),(2173,20,288,2,0),(2174,53,288,1,1),(2175,72,288,1,1),(2176,74,288,2,0),(2177,15,289,1,0),(2178,15,290,1,1),(2179,15,291,1,0),(2180,35,291,1,0),(2181,69,291,1,0),(2182,15,292,1,1),(2183,15,293,1,0),(2184,15,294,1,0),(2185,29,294,1,0),(2186,32,294,2,0),(2187,36,294,4,0),(2188,37,294,4,0),(2189,39,294,6,0),(2190,42,294,1,0),(2191,65,294,1,0),(2192,67,294,1,0),(2193,15,295,1,1),(2194,15,296,1,1),(2195,15,297,1,1),(2196,19,297,1,1),(2197,28,297,2,1),(2198,32,297,1,1),(2199,37,297,2,1),(2200,57,297,1,0),(2201,15,298,1,1),(2202,15,299,2,0),(2203,15,300,2,0),(2204,23,300,1,0),(2205,44,300,3,1),(2206,58,300,1,0),(2207,73,300,1,0),(2208,74,300,1,0),(2209,77,300,1,0),(2210,15,301,1,0),(2211,16,301,2,0),(2212,26,301,1,1),(2213,37,301,1,0),(2214,45,301,2,1),(2215,57,301,1,0),(2216,61,301,2,0),(2217,15,302,2,0),(2218,15,303,1,0),(2219,39,303,2,0),(2220,45,303,1,0),(2221,15,304,1,0),(2222,35,304,1,0),(2223,64,304,1,0),(2224,79,304,1,0),(2225,80,304,1,0),(2226,15,305,1,1),(2227,15,306,1,0),(2228,22,306,1,0),(2229,16,307,1,1),(2230,28,307,1,0),(2231,58,307,1,1),(2232,59,307,2,1),(2233,68,307,1,1),(2234,16,308,1,0),(2235,16,309,1,0),(2236,16,310,2,0),(2237,16,311,1,0),(2238,61,311,1,0),(2239,16,312,2,0),(2240,51,312,1,1),(2241,16,313,1,0),(2242,16,314,1,0),(2243,30,314,1,0),(2244,31,314,1,0),(2245,16,315,5,0),(2246,28,315,1,0),(2247,54,315,5,0),(2248,65,315,1,0),(2249,16,316,2,0),(2250,42,316,1,0),(2251,62,316,1,0),(2252,16,317,2,0),(2253,25,317,2,0),(2254,32,317,1,0),(2255,37,317,1,0),(2256,39,317,3,0),(2257,42,317,1,0),(2258,66,317,2,0),(2259,78,317,1,0),(2260,16,318,1,0),(2261,16,319,1,0),(2262,25,319,1,0),(2263,32,319,1,0),(2264,44,319,1,1),(2265,52,319,1,0),(2266,17,320,1,0),(2267,20,320,1,0),(2269,17,321,3,0),(2270,17,322,1,0),(2271,18,322,1,0),(2272,44,322,1,0),(2273,56,322,1,0),(2274,79,322,1,0),(2275,17,323,1,1),(2276,39,323,2,1),(2277,17,324,1,1),(2278,17,325,1,0),(2279,19,325,1,0),(2280,23,325,1,0),(2281,28,325,1,0),(2282,33,325,1,0),(2283,35,325,2,0),(2284,41,325,2,0),(2285,44,325,1,0),(2286,46,325,4,0),(2287,48,325,1,0),(2288,64,325,1,0),(2289,77,325,3,0),(2290,17,326,1,1),(2291,17,327,1,0),(2292,20,327,7,0),(2293,42,327,1,0),(2294,53,327,1,0),(2295,57,327,4,0),(2296,67,327,2,0),(2297,70,327,3,0),(2298,17,328,1,0),(2299,23,328,1,0),(2300,25,328,1,0),(2301,26,328,1,0),(2302,51,328,1,0),(2303,53,328,1,0),(2304,54,328,1,0),(2305,57,328,1,0),(2306,64,328,1,0),(2307,65,328,1,0),(2308,73,328,1,0),(2309,77,328,1,0),(2310,18,329,1,0),(2311,36,329,1,1),(2312,39,329,1,1),(2313,18,330,1,1),(2314,19,330,1,0),(2315,38,330,3,1),(2316,18,331,1,0),(2317,19,331,1,0),(2318,27,331,1,1),(2319,33,331,1,1),(2320,57,331,1,0),(2321,65,331,3,0),(2322,18,332,1,0),(2323,57,332,1,0),(2324,18,333,1,0),(2325,18,334,1,0),(2326,18,335,1,0),(2327,19,335,1,0),(2328,18,336,1,0),(2329,19,336,1,0),(2330,67,336,5,1),(2331,18,337,1,0),(2332,36,337,1,0),(2333,54,337,3,0),(2334,57,337,2,0),(2335,59,337,2,0),(2336,60,337,1,0),(2337,61,337,9,0),(2338,65,337,4,0),(2339,78,337,2,0),(2340,80,337,2,0),(2341,18,338,1,0),(2342,54,338,3,0),(2343,57,338,1,0),(2344,18,339,1,0),(2345,20,339,2,1),(2346,57,339,1,0),(2347,18,340,1,0),(2348,39,340,1,1),(2349,18,341,1,0),(2350,26,341,1,0),(2351,32,341,1,0),(2352,19,342,3,0),(2353,20,342,1,0),(2354,19,343,3,0),(2355,27,343,2,0),(2356,62,343,1,0),(2357,19,344,1,0),(2358,19,345,1,0),(2359,45,345,1,0),(2360,19,346,1,0),(2361,53,346,1,0),(2362,57,346,1,0),(2363,19,347,1,0),(2364,57,347,1,0),(2365,65,347,1,0),(2366,19,348,1,0),(2367,21,348,1,0),(2369,37,348,1,0),(2370,49,348,1,0),(2371,19,349,1,0),(2372,53,349,1,0),(2373,19,350,1,0),(2374,19,351,1,1),(2375,19,352,1,0),(2376,22,352,1,0),(2377,47,352,1,0),(2378,63,352,1,0),(2379,19,353,1,0),(2380,39,353,1,1),(2381,42,353,1,1),(2382,63,353,1,0),(2383,80,353,1,0),(2385,20,354,1,0),(2387,20,355,1,0),(2388,20,356,1,0),(2389,20,357,1,0),(2390,20,358,3,0),(2391,55,358,1,0),(2392,64,358,3,0),(2393,20,359,1,0),(2394,20,360,2,0),(2395,21,360,1,0),(2396,22,360,1,0),(2397,53,360,1,0),(2398,54,360,1,0),(2399,57,360,1,0),(2400,20,361,2,1),(2401,20,362,1,1),(2402,20,363,1,0),(2403,20,364,1,0),(2404,20,365,1,0),(2405,20,366,1,1),(2406,64,366,1,0),(2407,20,367,6,0),(2408,25,367,1,0),(2409,20,368,1,0),(2410,20,369,1,0),(2411,64,369,1,0),(2412,20,370,1,1),(2413,49,370,1,1),(2414,20,371,2,1),(2415,20,372,1,0),(2416,24,372,1,0),(2417,53,372,1,0),(2418,54,372,1,0),(2419,77,372,4,1),(2420,79,372,1,0),(2421,20,373,1,0),(2422,38,373,1,0),(2423,65,373,1,0),(2424,20,374,2,1),(2425,20,375,2,0),(2426,80,375,1,0),(2427,20,376,2,1),(2428,20,377,2,0),(2429,58,377,2,0),(2430,20,378,2,0),(2431,58,378,2,0),(2433,20,380,1,1),(2434,20,381,1,0),(2435,32,381,1,0),(2436,66,381,1,0),(2437,20,382,1,1),(2438,20,383,1,0),(2439,32,383,2,0),(2440,35,383,1,0),(2441,44,383,1,0),(2442,20,384,1,0),(2443,20,385,1,1),(2444,20,386,1,0),(2445,24,386,1,0),(2446,53,386,1,0),(2447,75,386,1,0),(2448,80,386,1,0),(2449,21,387,1,0),(2452,21,389,1,0),(2453,21,390,1,1),(2454,21,391,1,1),(2455,21,392,2,1),(2456,55,392,1,0),(2457,21,393,1,0),(2458,29,393,1,1),(2459,44,393,1,0),(2460,53,393,4,0),(2461,70,393,2,0),(2462,21,394,1,1),(2463,41,394,1,0),(2464,54,394,1,0),(2465,21,395,1,1),(2466,21,396,2,0),(2467,22,397,2,0),(2468,22,398,3,1),(2469,55,398,1,0),(2470,22,399,1,1),(2471,22,400,1,0),(2472,45,400,1,0),(2473,58,400,1,0),(2474,22,401,1,0),(2475,22,402,1,1),(2476,22,403,1,0),(2477,22,404,1,1),(2478,28,404,2,1),(2479,65,404,2,0),(2480,22,405,1,1),(2481,24,405,1,0),(2482,57,405,1,0),(2483,22,406,1,0),(2484,24,406,1,1),(2485,30,406,1,1),(2486,22,407,1,1),(2487,24,407,1,1),(2488,22,408,1,1),(2489,22,409,1,0),(2490,23,410,1,0),(2491,23,411,1,0),(2492,23,412,2,0),(2493,26,412,1,0),(2494,34,412,1,0),(2495,52,412,2,0),(2496,55,412,1,0),(2497,63,412,2,0),(2498,64,412,1,0),(2499,23,413,1,0),(2500,53,413,1,0),(2501,23,414,1,0),(2502,23,415,1,0),(2503,23,416,1,0),(2504,26,416,1,0),(2505,48,416,2,0),(2506,55,416,1,0),(2507,58,416,1,0),(2508,23,417,1,0),(2509,23,418,1,0),(2510,64,418,1,0),(2511,23,419,3,0),(2512,25,419,1,0),(2513,32,419,2,0),(2514,37,419,1,0),(2515,42,419,1,0),(2516,49,419,2,0),(2517,50,419,1,0),(2518,60,419,1,0),(2519,65,419,1,0),(2520,23,420,3,0),(2521,66,420,1,0),(2522,80,420,1,0),(2523,24,421,1,0),(2524,24,422,1,0),(2525,25,422,1,0),(2526,62,422,1,0),(2527,24,423,1,0),(2528,24,424,1,0),(2529,25,425,1,1),(2530,25,426,1,1),(2531,25,427,1,0),(2532,25,428,1,0),(2533,25,429,1,0),(2534,25,430,2,1),(2535,25,431,2,1),(2536,47,431,1,0),(2537,65,431,1,0),(2538,80,431,1,0),(2539,25,432,1,1),(2540,40,432,1,0),(2541,65,432,1,1),(2542,78,432,1,0),(2543,25,433,1,0),(2544,25,434,4,1),(2545,57,434,1,0),(2547,26,435,2,1),(2548,59,435,2,0),(2549,66,435,1,0),(2550,80,435,1,0),(2551,26,436,3,1),(2552,63,436,1,0),(2553,69,436,2,0),(2554,75,436,2,0),(2555,26,437,2,1),(2556,45,437,1,1),(2557,26,438,2,0),(2558,31,438,2,0),(2559,70,438,1,1),(2560,26,439,1,0),(2561,26,440,1,1),(2562,27,440,1,1),(2563,32,440,1,0),(2564,62,440,1,0),(2565,80,440,2,0),(2566,26,441,1,0),(2567,28,441,1,0),(2568,26,442,1,0),(2569,26,443,1,0),(2570,26,444,1,0),(2571,26,445,1,0),(2572,26,446,1,0),(2573,30,446,1,0),(2574,34,446,2,0),(2575,69,446,1,0),(2576,78,446,1,0),(2577,27,447,1,0),(2578,27,448,1,0),(2579,27,449,1,0),(2580,27,450,1,0),(2581,27,451,1,0),(2582,27,452,1,0),(2583,27,453,1,0),(2584,56,453,1,0),(2585,27,454,1,0),(2586,27,455,1,0),(2587,27,456,1,0),(2588,80,456,1,0),(2589,27,457,1,0),(2590,27,458,2,0),(2591,52,458,1,0),(2592,67,458,1,0),(2593,27,459,1,0),(2594,27,460,2,1),(2595,30,460,1,0),(2596,27,461,2,1),(2597,27,462,1,0),(2598,58,462,1,0),(2599,27,463,1,0),(2600,28,464,1,0),(2601,28,465,2,1),(2602,28,466,1,1),(2603,28,467,1,1),(2604,28,468,1,1),(2605,64,468,1,0),(2606,28,469,1,1),(2607,28,470,1,1),(2608,32,470,1,1),(2609,28,471,1,1),(2610,58,471,1,0),(2611,29,472,1,0),(2612,64,472,4,0),(2613,29,473,1,1),(2614,29,474,1,0),(2615,29,475,1,1),(2616,29,476,1,1),(2617,29,477,1,1),(2618,29,478,1,1),(2619,30,479,1,1),(2620,30,480,1,0),(2621,31,480,3,0),(2622,50,480,2,0),(2623,57,480,1,0),(2624,69,480,3,0),(2625,76,480,1,0),(2626,80,480,1,0),(2627,30,481,1,0),(2628,53,481,1,0),(2629,57,481,1,0),(2630,30,482,1,0),(2633,76,483,2,0),(2634,30,484,1,0),(2635,30,485,1,0),(2636,30,486,1,0),(2637,31,486,2,0),(2638,50,486,1,0),(2639,30,487,1,0),(2640,36,487,4,0),(2641,44,487,2,0),(2642,63,487,4,0),(2643,66,487,2,0),(2644,79,487,1,0),(2645,30,488,1,0),(2646,30,489,6,1),(2647,30,490,4,1),(2649,30,492,1,0),(2650,30,493,1,0),(2651,55,493,1,0),(2652,80,493,1,0),(2653,30,494,1,0),(2654,55,494,1,0),(2655,59,494,2,0),(2656,31,495,2,0),(2657,55,495,1,0),(2658,78,495,1,0),(2659,31,496,3,0),(2660,34,496,1,0),(2661,79,496,1,0),(2662,31,497,3,0),(2663,34,497,1,0),(2664,31,498,1,0),(2665,31,499,1,0),(2666,35,499,1,0),(2667,31,500,2,0),(2668,33,500,2,0),(2669,36,500,1,0),(2670,45,500,2,0),(2671,61,500,1,0),(2672,67,500,1,0),(2673,68,500,1,0),(2674,69,500,1,0),(2675,73,500,1,0),(2676,76,500,1,0),(2677,78,500,3,0),(2680,31,502,3,0),(2681,73,502,1,0),(2682,74,502,5,0),(2683,31,503,1,0),(2684,63,503,1,0),(2685,65,503,3,0),(2686,67,503,3,0),(2687,69,503,1,0),(2688,72,503,1,0),(2689,74,503,1,0),(2690,31,504,1,0),(2691,31,505,1,0),(2693,31,507,2,0),(2694,69,507,1,0),(2695,31,508,2,0),(2696,38,508,3,1),(2697,31,509,1,0),(2698,69,509,1,0),(2699,31,510,1,0),(2700,31,511,1,0),(2701,31,512,1,0),(2702,32,513,1,1),(2703,34,513,1,1),(2704,52,513,1,0),(2705,60,513,1,0),(2706,61,513,4,0),(2707,63,513,1,0),(2708,80,513,1,0),(2709,32,514,1,0),(2710,37,514,1,0),(2711,39,514,3,0),(2712,32,515,1,0),(2713,32,516,1,0),(2714,55,516,1,0),(2715,64,516,1,0),(2716,32,517,1,0),(2717,32,518,1,0),(2718,80,518,1,0),(2719,32,519,1,0),(2720,32,520,1,1),(2721,32,521,1,0),(2722,35,521,1,1),(2723,52,521,2,0),(2724,81,521,2,0),(2725,32,522,1,1),(2726,32,523,1,0),(2727,49,523,1,0),(2728,32,524,1,0),(2729,66,524,1,0),(2730,33,525,1,0),(2731,68,525,1,0),(2732,33,526,1,1),(2733,41,526,1,0),(2734,44,526,2,0),(2735,33,527,1,1),(2736,34,528,1,1),(2737,34,529,1,0),(2738,51,529,1,0),(2739,35,530,2,0),(2740,80,530,1,0),(2741,35,531,1,0),(2742,56,531,1,0),(2743,66,531,1,0),(2744,73,531,1,0),(2745,81,531,1,0),(2746,35,532,1,0),(2747,35,533,1,1),(2748,35,534,1,0),(2749,61,534,2,0),(2750,64,534,1,0),(2751,36,535,1,1),(2752,49,535,2,0),(2753,36,536,4,0),(2754,55,536,1,0),(2755,58,536,1,0),(2756,59,536,1,0),(2757,67,536,1,0),(2758,36,537,1,0),(2759,77,537,1,0),(2760,36,538,1,1),(2761,36,539,1,0),(2762,36,540,1,0),(2763,78,540,1,0),(2764,36,541,1,0),(2765,36,542,1,0),(2766,54,542,1,0),(2767,36,543,1,1),(2768,37,544,2,1),(2769,57,544,1,0),(2770,37,545,1,0),(2771,37,546,1,0),(2772,38,547,1,0),(2773,73,547,1,0),(2774,38,548,1,0),(2775,69,548,1,1),(2776,38,549,1,0),(2777,69,549,1,1),(2778,38,550,1,0),(2779,69,550,1,1),(2780,38,551,1,0),(2781,38,552,2,1),(2782,38,553,2,1),(2783,38,554,1,0),(2784,38,555,1,1),(2785,44,555,1,1),(2786,50,555,1,0),(2787,55,555,1,0),(2788,75,555,1,1),(2789,39,556,1,0),(2790,39,557,2,1),(2791,39,558,2,1),(2792,39,559,6,0),(2793,39,560,1,0),(2794,39,561,1,1),(2795,39,562,1,1),(2796,39,563,1,0),(2797,39,564,1,1),(2798,39,565,2,0),(2799,56,565,1,0),(2800,39,566,2,0),(2801,39,567,1,0),(2802,39,568,1,1),(2803,42,568,1,1),(2804,39,569,1,1),(2805,42,569,1,0),(2806,39,570,2,0),(2807,39,571,2,0),(2808,39,572,1,0),(2809,41,573,2,0),(2810,41,574,2,0),(2811,54,574,1,0),(2812,41,575,1,1),(2813,41,576,1,0),(2814,62,576,1,0),(2815,69,576,1,0),(2816,41,577,1,1),(2817,41,578,1,0),(2818,67,578,2,0),(2819,41,579,1,1),(2820,41,580,1,0),(2821,41,581,1,1),(2822,41,582,1,0),(2823,58,582,1,0),(2824,41,583,1,1),(2826,41,585,1,0),(2827,51,585,1,0),(2828,41,586,1,0),(2829,41,587,1,0),(2830,42,588,2,1),(2831,67,588,1,0),(2832,42,589,1,0),(2833,42,590,1,1),(2834,42,591,1,1),(2835,42,592,1,1),(2836,42,593,2,0),(2837,48,593,3,0),(2838,77,593,3,0),(2839,42,594,2,0),(2840,43,594,2,0),(2841,48,594,1,0),(2842,55,594,1,0),(2843,42,595,1,0),(2844,42,596,1,0),(2845,43,597,2,0),(2846,48,597,1,0),(2847,55,597,2,0),(2848,65,597,1,0),(2849,72,597,1,0),(2850,80,597,1,0),(2851,43,598,1,0),(2852,76,598,2,0),(2853,78,598,1,0),(2854,43,599,1,0),(2855,50,599,2,0),(2856,61,599,1,0),(2857,44,600,1,0),(2858,71,600,8,1),(2859,44,601,1,0),(2860,44,602,1,0),(2861,45,603,1,1),(2862,58,603,2,0),(2863,45,604,1,1),(2864,45,605,1,1),(2865,45,606,1,1),(2866,45,607,1,1),(2867,45,608,1,0),(2868,81,608,2,1),(2869,45,609,1,1),(2870,45,610,1,0),(2871,45,611,1,0),(2872,46,612,1,1),(2873,46,613,1,0),(2874,46,614,2,0),(2875,62,614,1,0),(2876,46,615,1,1),(2877,46,616,1,0),(2878,46,617,1,1),(2879,46,618,1,1),(2880,62,618,1,0),(2881,46,619,1,0),(2882,58,619,2,0),(2883,69,619,1,0),(2884,47,620,1,1),(2885,47,621,2,1),(2886,57,621,1,1),(2887,48,622,1,1),(2888,64,622,2,0),(2889,49,623,1,1),(2890,49,624,1,0),(2891,50,625,2,1),(2892,76,625,2,0),(2893,50,626,1,0),(2894,50,627,1,1),(2895,50,628,1,0),(2896,50,629,1,0),(2897,50,630,2,1),(2898,50,631,2,0),(2899,50,632,1,0),(2900,70,632,1,1),(2901,50,633,1,0),(2902,80,633,1,0),(2903,50,634,1,1),(2904,50,635,1,0),(2905,50,636,1,1),(2906,50,637,1,0),(2907,50,638,1,0),(2908,51,639,2,0),(2909,62,639,1,0),(2910,51,640,1,0),(2911,51,641,1,1),(2912,51,642,1,1),(2913,51,643,1,0),(2914,52,644,1,0),(2915,52,645,1,1),(2916,56,645,1,1),(2917,52,646,2,1),(2918,56,646,1,1),(2919,52,647,1,1),(2920,52,648,1,1),(2921,52,649,1,1),(2922,52,650,1,0),(2923,53,651,1,0),(2924,53,652,1,1),(2925,53,653,1,1),(2926,53,654,1,1),(2927,53,655,1,0),(2928,53,656,1,0),(2929,59,656,2,0),(2930,80,656,1,0),(2931,53,657,1,1),(2932,53,658,1,1),(2933,53,659,1,0),(2934,53,660,1,1),(2935,66,660,1,0),(2936,72,660,3,1),(2937,53,661,1,0),(2938,53,662,1,0),(2939,53,663,1,0),(2940,54,664,1,0),(2941,54,665,1,0),(2942,54,666,1,0),(2943,54,667,1,0),(2944,54,668,1,1),(2945,54,669,5,0),(2946,54,670,3,0),(2947,54,671,1,0),(2948,54,672,1,0),(2949,55,673,1,0),(2950,55,674,1,0),(2951,55,675,1,0),(2952,55,676,1,0),(2953,55,677,1,0),(2954,55,678,1,0),(2955,55,679,1,0),(2956,55,680,1,1),(2957,55,681,1,0),(2958,55,682,1,0),(2959,55,683,1,1),(2960,55,684,1,0),(2961,55,685,1,0),(2962,55,686,1,1),(2963,55,687,1,0),(2964,55,688,1,0),(2965,55,689,1,0),(2966,61,689,1,0),(2967,55,690,1,1),(2968,55,691,1,1),(2970,56,693,1,0),(2971,57,694,1,0),(2972,58,694,1,0),(2973,74,694,1,1),(2974,57,695,1,0),(2975,57,696,1,0),(2976,57,697,1,0),(2977,57,698,3,1),(2978,57,699,1,1),(2979,58,699,1,0),(2980,57,700,1,0),(2981,64,700,1,0),(2982,57,701,1,0),(2983,78,701,1,1),(2984,58,702,2,0),(2985,58,703,2,0),(2986,58,704,2,0),(2987,65,704,1,0),(2988,58,705,1,0),(2989,58,706,1,0),(2990,58,707,1,0),(2991,58,708,1,1),(2992,58,709,1,1),(2993,58,710,1,1),(2994,58,711,1,1),(2995,59,712,2,1),(2996,59,713,2,0),(2997,81,713,1,0),(2998,59,714,2,0),(2999,59,715,1,1),(3000,60,716,1,0),(3001,60,717,1,0),(3002,60,718,1,1),(3003,60,719,2,1),(3004,60,720,4,0),(3005,74,720,1,0),(3006,60,721,1,0),(3007,61,721,1,0),(3008,61,722,1,0),(3009,61,723,1,0),(3010,61,724,1,0),(3011,62,725,1,1),(3012,62,726,1,0),(3013,69,726,1,1),(3014,62,727,1,1),(3015,62,728,1,0),(3017,62,729,1,0),(3018,62,730,1,0),(3019,62,731,1,0),(3020,62,732,1,0),(3021,62,733,1,0),(3022,62,734,1,0),(3023,75,734,1,0),(3024,62,735,1,0),(3025,63,736,1,0),(3026,63,737,1,0),(3027,79,737,2,0),(3028,63,738,1,1),(3029,63,739,2,0),(3030,67,739,1,0),(3031,63,740,1,1),(3032,64,741,1,0),(3033,73,741,1,0),(3034,64,742,1,0),(3035,76,742,1,0),(3036,64,743,1,0),(3037,64,744,1,0),(3038,76,744,2,0),(3039,64,745,1,0),(3040,64,746,1,0),(3041,64,747,1,0),(3042,64,748,1,0),(3043,64,749,1,0),(3044,64,750,1,0),(3045,64,751,1,0),(3046,64,752,1,0),(3047,64,753,1,0),(3048,64,754,1,0),(3049,65,755,2,0),(3050,65,756,1,0),(3051,66,757,1,1),(3052,67,758,3,1),(3053,67,759,1,1),(3054,67,760,3,1),(3055,67,761,2,1),(3056,73,761,2,1),(3057,67,762,3,1),(3058,67,763,1,0),(3059,68,763,1,0),(3060,67,764,1,0),(3061,68,765,1,0),(3062,68,766,1,0),(3063,68,767,1,0),(3064,69,767,3,0),(3065,68,768,1,0),(3066,69,769,1,0),(3067,69,770,1,0),(3068,69,771,1,1),(3069,70,772,1,1),(3070,70,773,1,0),(3071,72,774,2,1),(3072,72,775,1,1),(3073,73,776,1,0),(3074,73,777,1,0),(3075,73,778,1,0),(3076,80,778,1,0),(3077,73,779,1,1),(3078,73,780,1,0),(3079,73,781,2,1),(3080,73,782,1,1),(3082,74,784,1,0),(3083,74,785,2,0),(3084,79,785,2,1),(3085,74,786,3,0),(3086,74,787,2,0),(3087,74,788,2,1),(3088,74,789,1,0),(3089,75,790,2,1),(3090,75,791,1,1),(3091,76,792,1,0),(3092,76,793,1,0),(3093,76,794,1,0),(3094,76,795,1,0),(3095,77,796,1,0),(3096,77,797,1,0),(3097,77,798,1,0),(3098,77,799,2,0),(3099,77,800,2,1),(3100,78,801,1,0),(3101,78,802,2,0),(3102,78,803,1,1),(3103,78,804,1,0),(3104,78,805,1,0),(3105,79,806,2,1),(3106,79,807,1,0),(3107,79,808,1,1),(3108,80,809,1,0),(3109,80,810,1,0),(3110,80,811,1,0),(3111,80,812,1,0),(3112,80,813,1,1),(3113,80,814,1,0),(3114,80,815,1,1),(3115,80,816,1,0),(3116,80,817,1,0),(3117,80,818,1,1),(3118,80,819,1,0),(3119,81,820,2,0),(3120,81,821,2,0),(3121,8,40,1,0),(3122,31,40,1,0),(3123,10,337,1,0),(3124,2,585,1,0),(3125,21,43,1,0),(3126,29,19,1,0),(3127,30,63,1,0),(3128,31,63,3,0),(3129,21,75,3,0),(3130,22,75,1,0),(3131,27,101,1,0),(3132,31,294,2,0),(3134,31,420,2,0),(3135,29,822,1,1),(3136,59,7,1,0),(3137,48,11,1,0),(3138,68,276,1,1),(3139,35,420,1,0),(3140,74,444,1,0),(3141,55,492,1,0),(3142,30,407,1,0),(3143,41,735,1,0),(3144,8,81,2,0),(3145,22,81,2,0),(3146,69,138,1,0),(3148,15,823,1,0);\r
+/*!40000 ALTER TABLE `section_letters` ENABLE KEYS */;\r
+UNLOCK TABLES;\r
+\r
+--\r
+-- Table structure for table `section_words`\r
+--\r
+\r
+DROP TABLE IF EXISTS `section_words`;\r
+CREATE TABLE `section_words` (\r
+  `id` int(11) NOT NULL auto_increment,\r
+  `section_id` int(11) NOT NULL default '1',\r
+  `word_id` int(11) NOT NULL default '1',\r
+  `count` int(11) NOT NULL default '1',\r
+  `chk` int(11) NOT NULL default '0',\r
+  PRIMARY KEY  (`id`),\r
+  KEY `index_section_words_on_section_id` (`section_id`),\r
+  KEY `index_section_words_on_word_id` (`word_id`)\r
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\r
+\r
+--\r
+-- Dumping data for table `section_words`\r
+--\r
+\r
+LOCK TABLES `section_words` WRITE;\r
+/*!40000 ALTER TABLE `section_words` DISABLE KEYS */;\r
+INSERT INTO `section_words` VALUES (1,2,1,1,0),(2,13,1,4,0),(3,22,1,2,0),(4,25,1,1,0),(5,26,1,1,0),(6,28,1,6,0),(7,29,1,2,0),(8,30,1,1,0),(9,31,1,1,0),(10,32,1,2,0),(11,35,1,1,0),(12,37,1,1,0),(13,39,1,1,0),(14,40,1,1,0),(15,43,1,3,0),(16,45,1,1,0),(17,46,1,2,0),(18,47,1,1,0),(19,48,1,2,0),(20,49,1,2,0),(21,52,1,2,0),(22,54,1,4,0),(23,56,1,1,0),(24,57,1,2,0),(25,60,1,1,0),(26,61,1,2,0),(27,62,1,1,0),(28,63,1,2,0),(29,66,1,2,0),(30,67,1,3,0),(31,70,1,1,0),(32,77,1,1,0),(33,78,1,3,0),(34,2,2,2,0),(35,3,2,1,0),(36,7,2,1,0),(37,12,2,1,0),(38,22,2,1,0),(39,26,2,1,0),(40,27,2,1,0),(41,29,2,1,0),(42,34,2,1,0),(43,38,2,3,0),(44,39,2,1,0),(45,43,2,1,0),(46,47,2,1,0),(47,51,2,1,0),(48,58,2,1,0),(49,63,2,2,0),(50,64,2,2,0),(51,66,2,3,0),(52,70,2,2,0),(53,71,2,2,0),(54,72,2,2,0),(55,73,2,1,0),(56,75,2,3,0),(57,76,2,1,0),(58,77,2,1,0),(59,78,2,1,0),(60,79,2,1,0),(61,2,3,1,0),(62,3,3,1,0),(63,5,3,1,0),(64,7,3,1,0),(65,12,3,1,0),(66,22,3,1,0),(67,26,3,1,0),(68,27,3,1,0),(69,28,3,1,0),(70,29,3,1,0),(71,34,3,1,0),(72,47,3,1,0),(73,49,3,3,0),(74,57,3,1,0),(75,58,3,1,0),(76,60,3,1,0),(77,63,3,2,0),(78,64,3,2,0),(79,66,3,1,0),(80,70,3,1,0),(81,71,3,1,0),(82,72,3,1,0),(83,73,3,1,0),(84,77,3,1,0),(85,78,3,1,0),(86,79,3,1,0),(87,81,3,2,0),(88,6,4,2,0),(89,10,4,1,0),(90,13,4,1,0),(91,14,4,3,0),(92,16,4,1,0),(93,27,4,2,0),(94,30,4,1,0),(95,36,4,1,0),(96,51,4,1,0),(97,52,4,1,0),(98,53,4,1,0),(99,56,4,1,0),(100,59,4,2,0),(101,65,4,1,0),(102,68,4,3,0),(103,69,4,1,0),(104,74,4,1,0),(105,78,4,2,0),(106,1,5,1,0),(107,2,5,1,0),(108,4,5,1,0),(109,5,5,1,0),(110,8,5,1,0),(111,16,5,1,0),(112,32,5,1,0),(113,34,5,3,0),(114,37,5,1,0),(115,39,5,2,0),(116,40,5,1,0),(117,42,5,2,0),(118,51,5,1,0),(119,62,5,1,0),(120,64,5,1,0),(121,76,5,1,0),(122,15,6,1,0),(123,23,6,3,0),(124,24,6,1,0),(125,31,6,1,0),(126,62,6,2,0),(127,65,6,1,0),(128,77,6,1,0),(129,1,7,1,1),(130,5,7,2,1),(131,6,7,1,0),(132,7,7,1,0),(133,23,7,2,1),(134,25,7,1,0),(135,32,7,1,0),(136,27,8,4,0),(137,62,8,2,0),(138,79,8,1,0),(139,60,9,1,0),(140,61,9,5,0),(141,61,10,4,0),(142,80,10,1,0),(143,1,11,1,0),(144,3,11,1,0),(145,34,11,1,0),(146,37,11,1,0),(147,57,11,1,0),(148,36,12,1,1),(149,76,12,3,0),(150,78,12,1,0),(151,32,13,1,1),(152,37,13,1,1),(153,39,13,3,0),(154,17,14,1,1),(155,23,14,1,1),(156,25,14,1,0),(157,51,14,1,1),(158,64,14,1,0),(159,14,15,1,1),(160,28,15,3,1),(161,52,15,1,1),(162,9,16,1,0),(163,73,16,1,0),(164,77,16,2,0),(165,81,16,1,0),(171,8,18,1,0),(172,20,18,3,0),(173,64,18,1,0),(174,48,19,1,1),(175,57,19,2,1),(176,63,19,1,1),(177,33,20,1,0),(178,44,20,1,0),(179,46,20,2,0),(180,30,21,2,1),(181,55,21,2,0),(182,30,22,1,0),(183,49,22,2,0),(184,81,22,1,0),(185,18,23,1,0),(186,34,23,1,0),(187,53,23,2,0),(188,10,24,1,1),(189,51,24,1,1),(190,65,24,2,1),(195,5,26,1,1),(196,17,26,1,1),(197,49,26,2,1),(198,76,27,2,0),(199,78,27,1,0),(200,27,28,2,0),(201,62,28,1,0),(202,38,29,2,0),(203,41,29,1,0),(204,31,30,2,1),(205,78,30,1,1),(206,24,31,1,0),(207,31,31,1,0),(208,77,31,1,0),(215,10,34,1,1),(216,20,34,1,0),(217,28,34,1,1),(218,47,35,1,0),(219,79,35,1,0),(220,38,36,1,0),(221,79,36,1,0),(222,38,37,1,0),(223,79,37,1,0),(224,77,38,1,0),(225,81,38,1,0),(226,74,39,2,1),(227,74,40,2,1),(228,67,41,2,1),(229,35,42,1,0),(230,63,42,1,0),(231,62,43,1,0),(232,81,43,1,1),(233,59,44,2,1),(234,20,45,1,0),(235,58,45,1,1),(236,19,46,1,0),(237,57,46,1,0),(238,36,47,1,1),(239,57,47,1,1),(240,32,48,1,1),(241,66,48,1,1),(242,50,49,1,1),(243,80,49,1,1),(244,12,50,1,1),(245,43,50,1,1),(246,39,51,1,1),(247,42,51,1,1),(248,35,52,1,1),(249,41,52,1,0),(250,40,53,1,0),(251,76,53,1,0),(254,31,55,2,1),(255,31,56,2,0),(256,23,57,2,0),(257,23,58,2,0),(260,21,60,2,1),(261,18,61,1,0),(262,57,61,1,0),(263,18,62,1,1),(264,19,62,1,1),(265,18,63,1,1),(266,57,63,1,1),(267,16,64,2,1),(268,14,65,2,0),(271,6,67,2,1),(272,5,68,2,1),(273,81,69,1,1),(274,80,70,1,0),(275,80,71,1,0),(276,80,72,1,1),(277,80,73,1,1),(278,79,74,1,1),(279,79,75,1,1),(280,79,76,1,0),(281,78,77,1,1),(282,76,78,1,1),(283,76,79,1,0),(284,73,80,1,1),(285,73,81,1,1),(286,72,82,1,1),(287,65,83,1,1),(288,64,84,1,1),(289,64,85,1,1),(290,64,86,1,1),(291,63,87,1,0),(292,63,88,1,0),(293,62,89,1,0),(294,62,90,1,1),(295,62,91,1,1),(296,60,92,1,1),(297,59,93,1,1),(298,58,94,1,1),(299,58,95,1,1),(300,58,96,1,1),(304,57,100,1,0),(305,57,101,1,0),(306,56,102,1,1),(308,55,104,1,1),(309,55,105,1,0),(310,55,106,1,1),(311,55,107,1,0),(312,54,108,1,0),(313,53,109,1,1),(314,53,110,1,1),(315,53,111,1,0),(316,53,112,1,1),(317,52,113,1,1),(318,36,114,1,1),(319,36,115,1,1),(320,34,116,1,1),(321,32,117,1,1),(322,50,118,1,0),(323,50,119,1,0),(324,50,120,1,0),(325,49,121,1,1),(326,49,122,1,0),(327,46,123,1,1),(328,46,124,1,1),(329,42,125,1,1),(330,42,126,1,0),(331,42,127,1,1),(332,41,128,1,0),(333,41,129,1,0),(334,41,130,1,0),(335,41,131,1,0),(336,41,132,1,0),(337,41,133,1,0),(339,41,135,1,0),(340,41,136,1,0),(341,41,137,1,0),(342,41,138,1,0),(343,40,139,1,1),(344,39,140,1,1),(345,39,141,1,1),(346,38,142,1,1),(347,38,143,1,1),(350,31,146,1,0),(351,30,147,1,1),(352,29,148,1,1),(353,28,149,1,1),(354,27,150,1,1),(355,27,151,1,1),(356,27,152,1,1),(357,27,153,1,1),(358,27,154,1,1),(359,27,155,1,1),(360,27,156,1,1),(361,26,157,1,1),(362,26,158,1,1),(363,26,159,1,1),(364,26,160,1,1),(365,26,161,1,1),(366,23,162,1,1),(367,23,163,1,1),(368,18,164,1,1),(369,18,165,1,1),(370,18,166,1,1),(371,17,167,1,1),(372,15,168,1,0),(373,15,169,1,0),(374,14,170,1,1),(375,14,171,1,1),(376,14,172,1,1),(377,14,173,1,1),(378,14,174,1,1),(380,10,176,1,1),(381,10,177,1,1),(382,10,178,1,1),(383,10,179,1,1),(384,10,180,1,1),(387,6,183,1,1),(388,6,184,1,1),(389,5,185,1,1),(390,1,186,1,1),(391,3,187,1,1),(392,3,188,1,0),(393,10,188,2,0),(394,70,188,1,0),(395,2,189,1,0),(396,3,189,1,0),(398,38,189,1,0),(399,43,189,2,0),(400,48,189,2,1),(401,57,189,1,0),(402,63,189,1,1),(403,64,189,1,0),(404,1,190,1,0),(405,1,191,1,0),(406,61,191,1,0),(407,65,191,1,0),(408,73,191,1,0),(409,2,192,1,1),(410,43,192,1,1),(411,56,192,1,0),(412,73,192,1,0),(413,5,193,1,1),(414,3,194,1,1),(415,33,194,1,0),(416,56,194,1,0),(417,81,194,1,0),(418,10,195,1,1),(419,10,196,1,0),(420,12,197,1,1),(421,13,198,3,1),(422,16,199,1,1),(423,2,200,1,1),(424,21,201,1,1),(425,22,202,1,0),(426,23,203,1,1),(427,23,204,1,0),(428,64,204,1,0),(429,24,205,1,1),(430,24,206,1,1),(431,18,207,1,1),(432,24,208,1,0),(433,29,208,1,0),(434,31,208,1,0),(435,42,208,1,0),(436,26,209,1,1),(437,28,210,1,0),(438,29,211,1,1),(439,36,211,4,1),(440,65,212,2,1),(441,7,213,1,0),(442,13,213,1,0),(443,32,213,1,0),(444,62,213,1,0),(445,66,213,1,1),(446,32,214,1,1),(447,35,215,1,1),(448,35,216,1,1),(449,39,217,1,1),(450,43,218,1,1),(451,43,219,1,1),(452,44,220,1,1),(453,59,220,1,0),(454,45,221,1,0),(455,45,222,1,1),(456,45,223,1,0),(457,45,224,1,1),(458,53,225,1,1),(459,53,226,1,0),(460,31,227,1,0),(461,31,228,1,0),(462,31,229,1,1),(463,31,230,1,0),(464,31,231,2,1),(465,15,232,1,0),(466,37,232,1,0),(467,39,232,1,0),(468,64,232,1,0),(469,77,232,1,0),(470,80,233,1,0),(471,74,209,1,1),(472,9,234,1,1),(474,3,235,1,0),(475,66,235,1,0),(476,68,235,1,1),(477,73,235,1,0),(478,81,235,1,0),(479,29,236,1,0),(480,30,236,1,0),(481,31,236,1,0),(485,57,238,1,1),(486,20,96,1,0),(487,20,239,1,0),(488,20,240,1,0),(489,20,241,1,0),(490,8,235,2,0),(491,22,235,1,0);\r
+/*!40000 ALTER TABLE `section_words` ENABLE KEYS */;\r
+UNLOCK TABLES;\r
+\r
+--\r
+-- Table structure for table `sections`\r
+--\r
+\r
+DROP TABLE IF EXISTS `sections`;\r
+CREATE TABLE `sections` (\r
+  `id` int(11) NOT NULL auto_increment,\r
+  `num` int(11) NOT NULL default '1',\r
+  `caption` text,\r
+  `source` text,\r
+  `japanese` text,\r
+  `trans` text,\r
+  `english` text,\r
+  `myself` text,\r
+  `etc` text,\r
+  `note` text,\r
+  `update_at` datetime default NULL,\r
+  PRIMARY KEY  (`id`),\r
+  UNIQUE KEY `index_sections_on_num` (`num`)\r
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\r
+\r
+--\r
+-- Dumping data for table `sections`\r
+--\r
+\r
+LOCK TABLES `sections` WRITE;\r
+/*!40000 ALTER TABLE `sections` DISABLE KEYS */;\r
+INSERT INTO `sections` VALUES (1,1,'第一章','[道可道非常道。]名可名非非常名。無名天地之始。有名萬物之母。/故常無欲以觀其妙。常有欲以觀其徼。/此兩者。同出而異名。/同謂之玄。玄之又玄。衆妙之門。','[(道:みち)の(道:みち)とす(可:べ)きは(常:つね)の(道:みち)に(非:あら)ず。](名:な)の(名:な)とす(可:べ)きは(常:つね)の(名:な)に(非:あら)ず。(名:な)、(無:な)きは(天地:てんち)の(始:はじ)め。(名:な)、(有:あ)るは(万物:ばんぶつ)の(母:はは)。/(故:ゆえ)に、(常:つね)に(欲:よく)(無:な)きを(以:もっ)て(其:そ)の(妙:みょう)を(観:み)、(常:つね)に(欲:よく)(有:あ)りを(以:もっ)て(其:そ)の(徼:きょう)を(観:み)る。/(此:こ)の(両者:りょうしゃ)は、(同:おな)じきに(出:い)でて(而:しかし)も(名:な)を(異:こと)にす。/(同:おな)じき(之:これ)を(玄:げん)と(謂:い)う。(玄:げん)の(又:また)(玄:げん)は(衆妙:しゅうみょう)の(門:もん)なり。',NULL,NULL,'「道はこういうものだ」という道は必ずしも道ではない。/「名はこういうものだ」という名は必ずしも名ではない。/物事は名がないところから始まり、名がついたところから様々なものが生まれる。//だから、無理に見ようと思わなければ本質が見える。しかし、無理に見ようとすると本質から外れた上辺だけを見てしまう。//どちらも同じ「見えた」であるが、実態は異なる。違いがあるのに同じになるのは不思議なことだが、この不思議を解明できればあらゆる本質の入り口が見えてくる。',NULL,'のっけから難しい内容。無理して理解しようとしないほうがいい。あえて道から行きたいなら{t:1}を見る。章ごとに読みたいなら{s:81}から逆に読んだ方が親しみやすい。//この章をどうしてもさっくり理解したいなら「これから道について書くけど、道を完全に伝えきるのは難しい。だから読んだだけでわかったつもりにならないで熟読して自分のものにしてね」程度に考えるといい。//解釈文はまだまだ表現が固くてなじみにくいので、少し砕いたのが下。//道は目に見えないから全容を正確に伝えられない。それを言葉にしても正確な道を表現できない。/なにごとも目に見えないところから始まる。どんな物も「始まり」という目に見える何かが起こって、そこから生まれるのだ。そして、一度見えてしまえば類似品が無限に発生する。だから、語りつくしたところで結論は出ない。/だから、なんとかして見てやろうとすると「始まり」しか見えず、それで「見えた」と納得して終わってしまう。目に見えない道の本質を体得するには、見ようとしないで見るしかない。そうやって「見えた」ものも上辺だけを見たものも同じ「見えた」になってしまう。表面上の「見えた」だけでなく、もっと奥まで見ればあらゆることの本質が見える。//少しわかっただろうか。物作りや人付き合いなどに応用するなら、これくらい抽象的な方が味わいがあるが、初めての人が理解するにはもう少し砕く必要があるかもしれない。//心は見えないが、心使いは見える。思いは見えないが、思いやりは見える。/どちらもやさしく見えるが、下心のあるなしは見抜けない。/相手の言葉や行動で判断すると上辺を見てしまうこともある。/本当の心は見えないから言動に惑わされず、心の奥の奥を感じるのだ。それでやっと相手の気持ちが見えてくる。/','2011-10-03 17:27:11'),(2,2,'第二章','[天下、皆知美之爲美、斯惡已。]皆知善之爲善、斯不善已。/故有無相生、難易相成、長短相形、高下相傾、音聲相和、前後相隨。/是以聖人、處無爲之事、行不言之教。/萬物作焉而不辭、生而不有、爲而不恃、功成而不居。/夫唯不居。是以不去。','(天下:てんか)、(皆:みな)(美:び)の(美:び)(爲:た)るを(知:し)るも、(斯:こ)れ(悪:あく)(已:のみ)。[(皆:みな)(善:ぜん)の(善:ぜん)(爲:た)るを(知:し)るも、(斯:こ)れ(不善:ふぜん)(已:のみ)。]/(故:ゆえ)に(有無:うむ)(相:あ)い(生:しょう)じ、(難易:なんい)(相:あ)い(成:な)り、(長短:ちょうたん)(相:あ)い(形:かたち)し、(高下:こうげ)(相:あ)い(傾:かたむ)き、/(音声:おんせい)(相:あ)い(和:わ)し、(前後:ぜんご)(相:あ)い(随:したが)う。/(是:これ)を(以:もっ)て(聖人:せいじん)は、(為:な)すの(事:こと)(無:な)きに(処:お)り、(不言:ふげん)の(教:おし)えを(行:おこ)なう。/(万物:ばんぶつ)(焉:ここ)に(作:おこ)るも(辞:ことば)せず、(生:しょう)ずるも(有:ゆう)せず、(為:な)すも(恃:たの)まず、(功:こう)(成:な)るも(居:お)らず。/(夫:そ)れ(唯:ただ)(居:お)らず、(是:これ)を(以:もっ)て(去:さ)らず。',NULL,NULL,'みんなが「美しいとは何か」を知っているが、それは醜いものを切り落とすことについて知っているだけだ。/みんなが「良いことは何か」をしっているが、それは良くないことを知っているだけだ。//有るから無いことがわかり、難事があるから簡単があり、短い者と比べるから長い方が決まり、傾きがあるから高い低いがわかり、メロディーはコーラスと合わさってハーモニーになり、差があることで前と後ろが生まれる。//だから、聖人は比較して差別することがないようにして、黙ったままひっそりと教える。/そうやって様々な成果を誕生させても何も言わない。生んでも成果有りとせず、達成しても見返りも求めず、周囲が成功したと認めても居座ったりしない。/ただ居座らないだけで、忘れ去られなくなるのだ。',NULL,'相対評価について書かれた章。//聖人は相対評価をしない。なぜなら聖人の器量は大き過ぎるからだ。凡人が識別する差異など聖人にとってわずかな差でしかない。だから聖人には善人も悪人も同じなのだ。これは{s:20}、{s:27}、{s:49}にも見られ、愚民政策につながっていく。//比較とは相対である。二つの物があり、互いを比べることで勝負がつく。/たとえば、美の対極には醜がある。誉め言葉として「かわいいね」と言ってしまうと、相手を良く評価できるが、他の誰かがかわいくないことになってしまう。それは「〇〇さんと比べて」という言葉が省略されているからだ。//言葉はいつも頼りなく、相対評価はあいまいで危険なものなのだ。/しかし、老子はここでは相対評価を悪いとは言っていない。ただ、対極があると言っているに過ぎない。数値上の変化で一喜一憂するなと言うことだろう。/また、老子には相対となったときに悪い方に回って打開を狙う考え方が見える。成長段階では相対を上手に見極めて利用し、成功したら相対をなくすと考えて良いのではないか。//ここでは聖人の処世術として、無為と不言を紹介している。つまり、成功した後の話である。/無為とは比較で人の優劣をつけないことだ。無為を続ければ大きな成果が出るが、最後まで黙っていて、仕事が済んだら去ってしまう。だから、勘の悪い人には何もしていないように見え、ピンときた人には何も言わないのに教育が完成する。これが不言だ。//無為不言がなぜ成果につながるかは{s:8}の水を知ると良い。なぜ去るかは{s:9}を見ると良い。//*斯:この章しか出てこない。それ、これは其か此が使われるので、ちょっと気になる。*//*惡:ここでは醜いという意味で使われる。*//*夫唯不居:もちろん、成功の座。ただ居なくなればいいってもんじゃない。*','2011-10-03 17:27:19'),(3,3,'第三章','[不尚賢、使民不爭。]不貴難得之貨、使民不爲盜。不見可欲、使心不亂。/是以聖人之治、虚其心、實其腹、弱其志、強其骨。/常使民無知無欲、使夫知者不敢爲也。/爲無爲、則無不治。','(賢:けん)を(尚:たっと)ばざれば、(民:たみ)をして(争:あらそ)わざ(使:し)む。(得:え)(難:がた)きの(貨:か)を(貴:たっと)ばざれば、(民:たみ)をして(盗:ぬす)みを(為:な)さざ(使:し)む。(欲:ほっ)す(可:べ)きを(見:しめ)さざれば、(民:たみ)の(心:こころ)をして(乱:みだ)れざら(使:し)む。/(是:こ)れを(以:もっ)て(聖人:せいじん)の(治:ち)は、(其:そ)の(心:こころ)を(虚:むな)しくして、(其:そ)の(腹:はら)を(実:み)たし、(其:そ)の(志:こころざし)を(弱:よわ)くして、(其:そ)の(骨:ほね)を(強:つよ)くす。(常:つね)に[(民:たみ)をして(無知:むち)(無欲:むよく)なら(使:し)め、(夫:そ)の(知者:ちしゃ)をして(敢:あ)えて(為:な)さざら(使:し)む。]/(無為:むい)を(為:な)せば、(則:すなわ)ち(治:おさ)まらざる(無:な)し。',NULL,NULL,'知識人を尊敬して厚遇するようなことをしなければ、人々に競争をやめさせることができる。希少な宝を価値あるものとして特別に扱うことをしなければ、人々に窃盗をやめさせることができる。羨望を湧き起こすような理想像を示さなければ、人々が心を乱さないようにさせることができる。//だから聖人が人を治めるとき、心を空っぽにして腹いっぱい喰わせてやり、向上心を弱めて身体を鍛えてやる。/いつも人々の物欲知識欲をなくさせ、あの知識人たちが何もできないようにする。//なにもしないようにすれば、治まらないこともないだろう。',NULL,'聖人の統治法。それは愚民政策。なぜそうなるかは{s:2}にある通り、比較しないからだ。//「下の者は上の者を必ず真似る。だから、リーダーはすべての人の手本となり、能力だけでなく人格も優れた人でなければならない。」//これが世間がリーダーに求める条件だろう。/しかし、これを目指して良くなろうとすると争いが起きる。競争で差がつけば優劣がついて敗者が排除されるからだ。/人はその差を埋めるために悪事を働き、差を詰められないよう叩き伏せる。/だから、向上心をなるべく抑え、身体だけ強くする。//おそらく、ほとんどの人が納得できないだろう。愚民政策が必要な理由はおいおい明かされていくので、まずは「こんなもん」としておくのがいいと思う。//ちょっと蛇足になるが、老子は{s:80}にある通り、小国寡民を理想としている。それは国民全員が顔を覚えられる程のちょっと大きな家庭を国家としたかったのではないか。//個人的には老子の教えは母性にあると考えているので、聖人の考え方に疑問がある話は、子どもを想う母になったつもりで考えれば、大抵納得いくものに仕上がる。/母親にとっての幸せは子供の出世より健康であろう。幼いうちから知識を詰め込むのも悪くはないが、それで病弱に育ってしまえば本末転倒ではなかろうか。//*不尚賢、使民不爭。:王が賢者を高待遇で招くと、みなが賢者を目指して熾烈なまでの競争を始める。ここで「勝つための嘘」が発生し、混乱する(→{t:18})。*//*不貴難得之貨、使民不爲盜。:王が宝をありがたがると、みなが宝を目指して熾烈なまでの競争を始める。ここで「手に入れるための悪事」が発生し、混乱する。*//*不見可欲、使心不亂。:王がこういう立派な人になりなさいと手本を見せると、持って生まれた素朴さを潰してでも理想像に近づこうとして心をおかしくさせてしまう。*//*使夫知者不敢爲也:あの知者というのは儒家だろう。学ぶことに情熱を注ぐ代表格は儒家だから。あらゆる智謀を駆使して民を啓蒙しようとするので、意地でも成果を挙げさせないつもりなのだろう。*','2011-10-03 17:27:24'),(4,4,'第四章','[道冲而用之或不盈。]淵兮似萬物之宗。/挫其鋭、解其紛、和其光、同其塵。/湛兮似或存。吾不知誰之子、象帝之先。','[(道:みち)は(冲:むな)しくして、(之:これ)を(用:もち)うれば(或:ある)いは(盈:み)たず。](淵:えん)として(万物:ばんぶつ)の(宗:そう)たるに(似:に)たり。/(其:その)(鋭:えい)を(挫:くじ)き、(其:その)(紛:ふん)を(解:と)き、(其:その)(光:ひかり)を(和:やわ)らげ、(其:その)(塵:ちり)に(同:おな)じくす。/(湛:たん)として(存:そん)する(或:ある)に(似:に)たり。/(吾:われ)、(誰:だれ)の(子:こ)なるかを(知:し)らず、(帝:てい)の(先:さき)に(象:に)たり。',NULL,NULL,'道とは巨大な器で、中の水を汲みだそうとしても使いきれないだろう。淵のように深々と入り混じっていて、万物の根源のようだ。そして、たっぷりと溜まっているようだ。/私にはそれがどこから生まれたかはわからないが、宇宙より先に存在したのだろう。',NULL,'難解な章。その難解さは中段にある「挫其鋭、解其紛、和其光、同其塵。」の句。これがどう解釈しても前後がつながらない。これと同じフレーズが{s:56}にもあり、これを錯簡とすることで意味がつながってくる。そこで今回はここを読まない方針で進めた。//章の内容は道の姿について。道は目に見えないので抽象的な表現となっている。大ざっぱにいえば巨大な器で中には液体が入っているらしい。そして、それは宇宙誕生の前から存在したと。/まぁSFみたいな想像上の話なので、そういうもんだと思っておけばいいだろう。//*道冲而用之或不盈:「或不盈」は「ほぼ間違いなく満杯だろうが、もしかしたら減ってることもあるかもしれない」くらいだろうか。なぜ使っても一杯なのか。想像を超えるスケールだから人類が使う程度じゃ減ったうちに入らないと考えてもいいし、{s:6}の川のように新たに流れてくるからと考えても良い。{s:45}にも「大盈若沖、其用不窮。」と似た表現がある。*//*淵兮似萬物之宗:{s:25}で「有物混成、先天地生。」とある。淵はただの崖っぷちではなく、中身が混沌と入り混じっているのだろう。*//*湛兮似或存:冲として空洞ではあるが、からっぽではない。湛という字で液体が入っているとしている。*//*吾不知誰之子:自分が誰の子か知らないわけではない。略されている「それ」を補う。もちろん「それ」とは道のこと。つまり、道を生んだのが何者なのかは私にはわからないの意味となる。*//*象帝之先:天地の創造者である天帝より先にその現象があった。*/','2011-10-03 17:27:28'),(5,5,'第五章','[天地不仁、以萬物爲芻狗。]聖人不仁、以百姓爲芻狗。/天地之間、其猶槖籥乎。虚而不屈、動而愈出。/多言數窮、不如守中。','(天地:てんち)は(仁:じん)ならず、(万物:ばんぶつ)を(以:もっ)て(芻狗:すうく)と(為:な)す。(聖人:せいじん)は(仁:じん)ならず、(百姓:ひゃくせい)を(以:もっ)て(芻狗:すうく)と(為:な)す。/(天地:てんち)の(間:かん)、(其:それ)(猶:なお)、(槖籥:たくやく)のごとき(乎:か)。(虚:むな)しくとも(屈:くっ)せず、(動:うご)きて(愈々:いよいよ)(出:い)ず。/[(多言:たごん)は(數:しばしば)(窮:きゅう)す。(中:ちゅう)を(守:まも)るに(如:し)かず。]',NULL,NULL,'自然は勝手気ままに命を産むが、用が済めばすべての生物を平等に殺す。聖人もまた、人を分け隔てなく愛するが去っていく者には心を置かない。/社会はふいご似ているか。ふいごはからっぽだから充満していて、動かせば風が出る。/軽率な言葉はしばしば誰かを追い詰める。心をからっぽにして偏重しないように心がけるに越したことはない。',NULL,'聖人は不仁という主張が引っ掛かって先に進めない章。/自然に仁がなく容赦もないのはわかる。だが、聖人がなぜ、不仁なのか。/老子は孔子を代表する儒家の主張をことごとく否定しているが、意外と仁は否定してない。//{s:38}によれば「仁」とは「為すけど成したとしない」こととある。聖人はもちろん「為さないで為す」わけだから違う。/つまり、聖人は民に対して表向きは何の温情もなく平等だということだ。だから結論の言葉を少なくして中立を守ることになる。//*天地不仁、以萬物爲芻狗。:祭りのお供えは祭りの間は大切にされるが、終わるとためらいなく捨てられる。同じように、物は壊れ、人は老いて死ぬ。そこに同情はない。*//*聖人不仁、以百姓爲芻狗。:聖人も同じように、民が生きている間は大切にするが、死んだらそれまでとして特別な扱いはしない。善人だろうが功労者だろうが肩入れはしない。「来るもの拒まず、去る者追わず」といったところか。*//*天地之間、其猶槖籥乎。:天地之間とは大気中のこと。これをふいごにたとえている。*//*虚而不屈、動而愈出。:大気が満ちた空っぽな状態。空は柱がないのに落ちてこない。ふいごで言うなら屈してこない。もし空が動き出して落ちてきたら、人はこの世から押し出されてしまう。だから、空虚であることが、充満していて最大限の可能性を持っている状態。聖人も同じで動けば止まることなく人が出ていく。*//*多言數窮、不如守中。:聖人がものを言うと、人が出て行ってしまう。民にとっては聖人の動きは死につながる。だから、息を吸い込んだ状態を最上とする。しゃべりすぎずに、胸に中空を保つことがよい。/{s:2}には多言に対する「行不言之教」がある。{s:16}では「悠兮其貴言」と言葉を慎むよう教えている。/スポーツでは息を吐くと同時に体を動かす事が基本。息を吸うときには力は入らない。何かをするときは事前に息を吸っておく。*//ということで、聖人が何もしないのは力がありすぎるからだ。意味があって虚ろな心を保っていることをふいごでたとえている。つまり、民を思えば動くなということだ。これは立派な人の強い影響力が何を引き起こすかわからない怖さを持っているためである。よく似た話が{s:49}にもある。/','2011-10-03 17:27:30'),(6,6,'第六章','[谷神不死、是謂玄牝。]/玄牝之門、是謂天地根。綿綿若存、用之不勤。','[(谷神:こくしん)は(死:し)せず]、(是:これ)を(玄牝:げんぴん)と(謂:い)う。/(玄牝:げんぴん)の(門:もん)、(是:これ)を(天地:てんち)の(根:ね)と(謂:い)う。/(綿綿:めんめん)として(存:そん)するが(若:ごと)く、(之:これ)を(用:もち)いて(勤:つ)きず。',NULL,NULL,'川の神様は死ぬことなく活動を続ける。これを女性の神秘的なはたらきという。/この神秘的な女性のはたらきを生み出す門こそが、天と地のルーツだ。/ほそぼそとした流れだが、どれだけ汲み出しても尽きることはない。',NULL,'これだけ読むとわけがわからない。ただファンタジックな世界観だけでしかない。詳しいことは{t:8}にあるが、初めて読む人は「谷は偉大だ」とだけ覚えておいて飛ばすのがいいかもしれない。//この章が言いたいことは、女が子供を生んできたからこそ、命のリレーが続いてきたこと。//玄牝は不思議な女性の力。女性器を谷に重ねて、出産と考えていいのではないか。//彼方に見える山脈の頂上と空の境目が天地の根。谷神である玄牝の門は河の源流といったところか。そこから水が流れてくる水は天地がなくならないかぎり尽きることはない。//老子は母性を大切にしていて、谷を母性のシンボルとして表現しているようだ。ちなみに孔子は山を愛した。','2011-10-03 17:27:32'),(7,7,'第七章','[天長地久。]天地所以能長且久者、[以其不自生、故能長生。]/是以聖人、後其身而身先、外其身而身存。非以其無私耶、故能成其私。','(天:てん)は(長:なが)く(地:ち)は(久:ひさ)し。(天地:てんち)の(能:よ)く(長:なが)く(且:かつ)(久:ひさ)しき(所以:ゆえん)の(者:もの)は、(其:そ)の(自:みずか)ら(生:しょう)ぜざるを(以:もっ)て、(故:ゆえ)に(能:よ)く(長生:ながい)きす。/(是:これ)を(以:もっ)て(聖人:せいじん)は、[(其:そ)の(身:み)を(後:あと)にするも(身:み)は(先:さき)んじ、(其:そ)の(身:み)を(外:そと)にするも(身:み)は(存:そん)ずる。]/(其:そ)の(無私:むし)なるを(以:もっ)て(非:あら)ず(耶:や)、(故:ゆえ)に(能:よ)く(其:そ)の(私:し)を(成:な)す。',NULL,NULL,'自然現象がいつまでも力を失わないのは、保身を考えないからだ。//だから聖人は、一歩退くことで却って先に行くことができ、自分のことなどどうでもいいかのように人を優先することで却って存在感が出る。それは自分のことを考えないからではなかろうか。それでこそ、自分というものが生きてくるのだ。',NULL,'地球の寿命がどうこうという話ではない。自然が永劫に続くのは我欲がないから。もし、自然が水を惜しんで雨を降らせるのを止めれば、たちまち河は枯れ海は干上がるに違いない。{s:39}なんかはそんな話なのではないか。//聖人が偉大な理由は自然と同じように損得勘定で動かないからだ。人に尽くすその姿は{s:81}に出てくる。//この章の目的は{s:2}で出てきた相対的な考えを極論してみること。無いことで有ることがわかり、有ることで無くなることを導いた。そこから無くしてしまった方が存在感が出ることを訴えている。//*後其身而身先:同じような戒めが{s:66}にも出てくる。{s:67}では先に出るなと禁止している。/一歩引いたところから自分を客観視することで自己批判すると考えても結論は変わらない。そちらの方が現代に馴染むだろう。*//*外其身而身存:自分を外に出しても存在はなくならない。度外視するといった感じか。/組織の構成員が部外者の視点で自己批判すると考えてもよい。*//*非以其無私耶、故能成其私。:自分をなくした方が自分らしさが出る。そういうケースを身の回りから探してもいいかも。主語は聖人。聖人は万人を平等に愛して人に尽くすのが好きだったから聖人として名前が残った。*','2011-10-03 17:27:33'),(8,8,'第八章','[上善若水。水善利萬物而不爭。]處衆人之所惡。故幾於道。/居善地、心善淵、與善仁、言善信、正善治、事善能、動善時。/夫唯不爭、故無尤。','[(上善:じょうぜん)は(水:みず)の(若:ごと)し。](水:みず)は(善:よ)く(万物:ばんぶつ)を(利:り)しても(争:あらそ)わず。/(衆人:しゅうじん)の(悪:にく)む(所:ところ)に(処:お)る。(故:ゆえ)に(道:みち)に(幾:ちか)し。/(居:きょ)には(地:ち)を(善:よ)しとし、(心:こころ)には(淵:えん)なるを(善:よ)しとし、(与:まじわり)には(仁:じん)を(善:よ)しとし、(言:ことば)には(信:まこと)を(善:よ)しとし、(正:せい)には(治:ち)を(善:よ)しとし、(事:こと)には(能:のう)を(善:よ)しとし、(動:うご)くには(時:とき)を(善:よ)しとす。/(夫:そ)れ(唯:ただ)(争:あらそ)わず、(故:ゆえ)に(尤:とが)め(無:な)し。',NULL,NULL,'最高に良いものは水のようにはたらく。水はあらゆるものに利益を与えながらも不平を言わない。やがては、みなが嫌うような泥や沼に溜っていく。これこそが道に近い在り方だ。//住居は地面に造るのがよく、心は淵の水のように深く底が見えないのがよく、人とは真心を持って接するのがよく、話は誠実にするのがよく、政治は何もしないで治まるのがよく、問題には柔軟に取り組むのがよく、動くには最適な時期を選ぶのがよい。//ただ争わないだけで、間違わない。',NULL,'尊敬される生き方を水にたとえている。//全員に利益を与えながらも不平を言わない。利用され汚れながら人が嫌う仕事をする。/たとえば、管理職は現場がなめらかに動くように雑用をこなす。母親業も雑用の塊だが、文句も言わず子供に利益を与える。//水は何も言わないが、水の性質に教えられることは多い。{s:2}の不言の教えとはこのことだ。/道の表現はどれも難しいものばかりなので、この章が一番わかりやすい。慣れない内はこの章を頼りにするといいだろう。//*居善地:水は山を避けて低い所に向かうので、高い宮殿ではなく地上に住む。/古代中国の北部は乾燥地帯で木材が少なく建築材がなかったから竪穴式住居だったらしいが、まさか地中に住めとは言ってないだろうね?*//*心善淵:{s:15}にある通り、透き通ってはおらず、むしろ濁っているんだろう。{s:36}では魚は濁った淵に隠れるから良い。何を考えているのかうかがいしれないことが理想。*//*正善治:正は正義ではなく政治だろう。{s:57}は「以正治國」で始まる。そこから見れば正義にしろ政治にせよ「無為・無知・無欲で治める」の意味となるだろう。*//*事善能:事を事えるとして「仕えるなら能力があるのが良い」とすると、老子らしくない。{s:59}の嗇のように仕事の効率としても良いが、水のたとえにはふさわしくない。{s:78}の水のように能く勝つ柔軟さで事に当たるのが落ち着きはよさそうか。*//*動善時:動くという能動的な態度はめずらしい。時節を誤らずに動けるのは賢者の証ではあるが、水が時で動くだろうか。暑くなったら湯気になるとかか。ちょっと根拠に欠けないか。高低差が出来た瞬間に間違いなく動くと考えるのが一番落ち着くので、絶えず公平さに気を配る意識を言っているのだろう。*/','2011-10-03 17:27:35'),(9,9,'第九章','[持而盈之、不如其已。揣而鋭之、不可長保。]金玉滿堂、莫之能守。富貴而驕、自遺其咎。/功成名遂身退、天之道。','(持:じ)して(之:これ)を(盈:み)たすは、(其:そ)の(已:や)むに(如:し)かず。/[(揣:きた)えて(之:これ)を(鋭:するど)くするは、(長:なが)く(保:も)つ(可:べ)からず。]/(金玉:きんぎょく)(堂:どう)に(満:み)つるは、(之:これ)を(能:よ)く(守:まも)ること(莫:な)し。/(富貴:ふうき)にして(驕:おご)るは、(自:おのず)から(其:そ)の(咎:とが)を(遺:のこ)す。/(功:こう)(成:な)り(名:な)(遂:と)げて(身:み)(退:しりぞ)くは、(天:てん)の(道:みち)なり。',NULL,NULL,'持っているのにさらに得ようとするのは、破滅してるようなものだ。/研いであるものを鋭くしようとすれば、長持ちしない。/蔵を金品でいっぱいにしても、維持できない。/金持ちになってさらに驕るのは、自分で罪の元を作ることになる。//成功して名誉を得たら身を引くのが自然の流れである。',NULL,'引き際を説いた章。引退することだけが仕事を完成させる最後の一歩。これを忘れると老子には腑に落ちない章がたくさんできてしまう。//世の中の失敗は、成功に味をしめてやりすぎて起きる。','2011-10-03 17:27:38'),(10,10,'第十章','[載營魄抱一、能無離乎。]專氣致柔、能嬰兒乎。滌除玄覽、能無疵乎。/愛民治國、能無知乎。天門開闔、能爲雌乎。明白四達、能無知乎。/生之畜之、生而不有、爲而不恃、長而不宰。是謂玄徳。','(営魄:えいはく)を(載:の)せ、(一:いち)を(抱:いだ)きて、(能:よ)く(離:はな)れること(無:な)からん(乎:か)。/(気:き)を(専:もっぱ)らにし、(柔:じゅう)を(致:いた)して、(能:よ)く(嬰児:えいじ)たらん(乎:か)。/(玄覧:げんらん)を(滌除:できじょ)して、(能:よ)く(疵:し)(無:な)からん(乎:か)。/(民:たみ)を(愛:あい)し(国:くに)を(治:おさ)めて、(能:よ)く(知:し)られること(無:な)からん(乎:か)。/(天門:てんもん)(開闔:かいこう)して、(能:よ)く(雌:し)(為:た)らん(乎:か)。/(明白:めいはく)(四達:したつ)して、(能:よ)く(知:し)ること(無:な)からん(乎:か)。/(之:これ)を(生:しょう)じ(之:これ)を(蓄:やしな)い、[(生:しょう)ずるも(有:ゆう)とせず、(為:な)すも(恃:たの)まず、(長:ちょう)ずるも(宰:さい)たらず。]/(是:これ)を(玄徳:げんとく)と(謂:い)う。',NULL,NULL,'活動する魂を陰に集中して体に乗せて一つにして、しっかり離さないでいられるか。/生気を柔らかくなるまで練り込んで、赤ちゃんのようにいられるか。/神秘の鏡を磨いて、過ちがないようにしていられるか。/民を愛して国を治めながらも、知られないでいられるか。/頭を空っぽに開放して、雌のように受け身でいられるか。/隅々まで深く知り得ながらも、なにも知らないようにしていられるか。//これに取り組み、大きく育て、できるようになってもまだまだ未熟だと気を引き締め、成功しても見返りをもとめず、リーダーなのに仕切らないでいる。これを奥深い徳という。',NULL,'道を目指す者が自身をチェックするための章。玄徳の習得が目的。//大抵の経典は「ああしろ、こうしろ、あれダメ、これダメ」なんだが、老子にはあんまりそういうのはない。悪い例があっても「良くないね、ひどいね」ってところで終わる。それで済まないのは、せいぜい{s:30}くらい。/この章も「しないでいられるか」って、とにかく無為。そして、相手任せ。やるべきことは赤ちゃんになるくらいか。//で、玄徳って何じゃいって話だが、道の一段下に徳があって、玄徳はかなり道に近いところの徳である。詳しくは{t:15}に任せるが、簡単に言えば「徳」は強い者が弱者の味方をすれば備わるもの。徳があれば慕われて人が集まってくるが、そこで王様ヅラしないで愛してやれば玄徳が備わる。ここまで行けば道とほぼ同じといったところか。//この章の構成は三段。//前段では自分の心のあり方を説いている。心技体の統一、呼吸の調和、自己批判の徹底。//中段では人との関係の持ち方を説いている。人を愛して、意見をよく受け入れて、民のための政治をする。//後段では、これに精進しろと説いている。//*載營魄抱一、能無離乎。:魄を肉体で抱いて一つにする。なぜ陰の気を帯びる魄に重きを置くかといえば{s:28}にあるような弱者への味方的な発想だろう。*//*專氣致柔、能嬰兒乎。:気をよく練ってひとまとめにし、つきたての餅のような柔らかさで割れたり飛び散らないようする。そうやって{s:55}にあるような、あかちゃんのようになる。弱い人ほど徳が高い。*//*滌除玄覽、能無疵乎。:神秘の鏡は自分のありのままを映すんだろう。心が見えるのかも。これを磨いて自分を観察して、過ちを犯していないことを確認しながら生きていけるか。早い話が自省しろ。*//*愛民治國、能無知乎。:知らないというより知られないの方が良い。日頃の骨折りを見せないで民を愛せるか。*//*天門開闔、能爲雌乎。:先入観を持たないで人の意見を受け入れることができるか。*//*明白四達、能無知乎。:なんでも知っているけど知らないふりができるか。気が効く人が大切な相手と付き合うと、ついあれこれ指図したり、世話を焼きたくなるもの。それをグッとこらえて人に任せて自分は何もしないでいろと言う。簡単なようで難しい。*//*生之畜之:これらの課題に挑戦して徳を育てる。*//*生而不有:心に徳を生み出しても自分の成果があったとしない。{s:38}には「上徳不徳。是以有徳。」とあり、このことだと思われる。これができれば徳の恵みを受けられるんだろう。ここから先のフレーズは{s:51}にも出てくる。*//*爲而不恃:徳が備われば大抵の難事は解決するが、それをアテに自己の利益を企てない。*//*長而不宰:気前良く問題解決すれば人が集まってくるが指図する立場に上がらない。{s:34}のように小であっても無欲な道のように生きる。*/','2011-10-03 17:27:48'),(11,11,'第十一章','[三十輻共一轂。當其無、有車之用。]/挺埴以爲器。當其無、有器之用。/鑿戸牖以爲室。當其無、有室之用。/故有之以爲利、無之以爲用。','(三十:さんじゅう)の(輻:ふく)、(一:ひと)つの(轂:こしき)を(共:とも)にす。(其:そ)の(無:む)に(当:あた)って、(車:くるま)の(用:よう)(有:あ)り。/(埴:つち)を(挺:こね)て(以:もっ)て(器:うつわ)を(為:つく)る。(其:そ)の(無:む)に(当:あた)って、(器:うつわ)の(用:よう)(有:あ)り。/(戸牖:こゆう)を(鑿:うが)ちて(室:へや)を(為:つく)る。(其:そ)の(無:む)に(当:あた)って(室:へや)の(用:よう)(有:あ)り。/(故:ゆえ)に[(有:ゆう)の(以:もっ)て(利:り)を(為:な)すは、(無:む)を(以:もっ)て(用:よう)を(為:な)せばなり。]',NULL,NULL,'三十本のスポークがホイールと一つになる。そのホイールに空洞があって車軸を通せるから、タイヤとして機能する。/粘土をこねて器を作るときは、へこませて空間を作るから器として機能する。/戸を打ちつけて壁をつくるから、空間ができて部屋として使える。//だから、有用で利益が出るものは、役に立たないところがあってこそ生まれる。',NULL,'無駄があることで意味を成す話は老子に多い。/{s:45}には完成品は欠陥があるように見えるなどとある。//物作りをする人にとっては考え甲斐のある章ではないか。//*鑿戸牖以爲室:戸や窓を作るためにノミで削るのは日本人の常識ではおかしい。中国人の表現には違和感あることも少なくないから、これもその一つと言えなくもないが、意外と土壁だったのかもしれないね。*/','2011-10-03 17:27:50'),(12,12,'第十二章','[五色令人目盲。五音令人耳聾。]五味令人口爽。/馳騁田獵、令人心發狂。難得之貨、令人行妨。/是以聖人、爲腹不爲目。故去彼取此。','[(五色:ごしき)は(人:ひと)の(目:め)をして(盲:もう)なら(令:し)む。](五音:ごいん)は(人:ひと)の(耳:みみ)をして(聾:ろう)なら(令:し)む。/(五味:ごみ)は(人:ひと)の(口:くち)をして(爽:たが)わ(令:し)む。(馳騁:ちてい)(畋猟:でんりょう)は(人:ひと)の(心:こころ)をして(狂:きょう)を(発:はっ)せ(令:し)むる。/(得難:えがた)きの(貨:か)は、(人:ひと)の(行:おこな)いを(妨:さまた)げ(令:し)む。/(是:これ)を(以:も)って(聖人:せいじん)は、(腹:はら)を(為:な)して(目:め)を(為:な)さず。(故:ゆえ)に(彼:あ)れを(去:す)てて(此:こ)れを(取:と)る。',NULL,NULL,'あふれかえるほどの色は人の目を潰す。あちこちからの音は人の耳を聞こえなくする。たくさんの味は人の味覚を麻痺させる。/乗馬や狩りは人の心をおかしくさせる。高価な金品は人の正しい行いを妨げる。/だから、聖人は心の充足を考え、うわべの楽しみに目を奪われない。よって、あれではなく、これを取る。',NULL,'贅沢に夢中になって人の心を忘れた王侯貴族を批判しているんだろう。ただ、日常生活に置き換えても実感できる例もあるので、共感はしやすい。{s:35}では、感覚による刺激は際限がなく、正しい道は味がないとある。//*五:おそらく日本でいう八みたいに「たくさん」の意味だろう。*//*五色令人目盲:選択肢が多すぎると選べないことは往々にあり、それは色がないのと変わらないと言いたいのだろう。それと同時にあでやかな色に包まれて民の生活を見なくなった王族を批判している。五行説の色だろうか。赤・青・黄・白・黒*//*五音令人耳聾:あちこちから音が聞こえるとうるさくて聞き取れない。それと同時に貴族が音楽に夢中になって、肝心な民の声が聞こえていないことへの批判。中国音楽で五音とは音階のことで、宮・商・角・徴・羽をいうらしい。*//*五味令人口爽:おいしいものを出鱈目に混ぜ合わせてもおいしくない。それと同時に音楽同様、美食にふける有力者たちへの批判。味覚で言えば酸・苦・甘・辛・鹹。*//*馳騁田獵、令人心發狂。:狩りは娯楽を兼ねた戦争の予行練習。兵を動員することに慣れると獲物と人の区別がつかなくなって軽い気持ちで戦争を始めてしまう。ましてや、威勢を張るために大金をかけてこれを行うならば、狂っているのと大差ない。*//*爲腹不爲目:目はもちろん上辺のこと。腹は中身のこと。*/','2011-10-03 17:27:52'),(13,13,'第十三章','[寵辱若驚。貴大患若身。]/何謂寵辱若驚。寵爲上、辱爲下。得之若驚、失之若驚。是謂寵辱若驚。/何謂貴大患若身。吾所以有大患者、爲吾有身。及吾無身、吾有何患。/故貴以身爲天下、若可寄天下。愛以身爲天下、若可託天下。','(寵辱:ちょうじょく)、(驚:おどろ)くが(若:ごと)し。(大患:たいかん)を(貴:たっと)ぶこと(身:み)の(若:ごと)し。/(何:なに)をか(寵辱:ちょうじょく)(驚:おどろ)くが(若:ごと)しと(謂:い)う。(寵:ちょう)を(上:じょう)と(爲:な)し、(辱:じょく)を(下:げ)と(爲:な)す。/(之:これ)を(得:え)ては(驚:おどろ)くが(若:ごと)く、(之:これ)を(失:うしな)いては(驚:おどろ)くが(若:ごと)し。(是:これ)を(寵辱:ちょうじょく)(驚:おどろ)くが(若:ごと)しと(謂:い)う。/(何:なに)をか(大患:たいかん)を(貴:たっと)ぶこと(身:み)の(若:ごと)と(謂:い)う。/[(吾:わ)れ(大患:たいかん)ある(所以:ゆえん)の(者:もの)は、(吾:わ)が(身:み)(有:あ)るが(爲:ため)なり。](吾:わ)が(身:み)(無:な)きに(及:およ)びては、(吾:わ)れ(何:なん)の(患:うれい)か(有:あ)らん。/(故:ゆえ)に(身:み)を(以:もっ)て(天下:てんか)を(為:おさ)むるより(貴:たっと)ぶものは、(若:すなわ)ち(天下:てんか)を(寄:よ)す(可:べ)し。/(身:み)を(以:も)って(天下:てんか)を(為:おさ)むるより(愛:め)ずるものは、(若:すなわ)ち(天下:てんか)を(託:たく)す(可:べ)し。',NULL,NULL,'寵辱、驚くが若し。大患を貴ぶこと身の若し。/寵辱、驚くが若しとは、どういうことか。出世を良いこととして、更迭を悪いこととする。思いもかけない出世をすればびっくりするし、突然更迭されればびっくりする。これを出世しても更迭されてもびっくりすると言う。/大患を貴ぶこと身の若しとは、どういうことか。自分にふりかかってくる問題が深刻である原因は、自分の身体があるからだ。もし、自分に身体がなければ、なんの悩みがあるだろう。/だから、天下を自分の身体のように大事にするなら、天下人の座を手繰り寄せてもよく、天下を自分の身体のように愛せるなら、天下を任せてもよい。',NULL,'難解すぎて自信なし。名誉と身体の一致について考える章。//出世しても転落してもびっくりするのは、地位と身体が一つになっているからで、身体がなければ痛みがないように、地位と身体を分けて生きれば名声に惑わされず生きていける。そこで、身体と天下を一体と考え、わが身をかわいがるかのように天下をかわいがることができれば天下を任せられる。自分の身体を傷つける人はいないように、天下を傷つけることがないからだ。//この章は{s:7}や{s:81}とセットで語られる話だろう。これらの話のように自分を後回しにするのはいいとしよう。/しかし、それが名誉のためで心に嘘をつきながらやるのはマズイ。また、好きでやってるからといって自分が死んでしまっては意味がない。/心と体が一致して人に尽くせる人だけが天下を託せる相手だと言いたいのだろう。/現代でも、成功して天才と呼ばれるような人は趣味と実益が一体と化した人であるケースが多い。/逆のケースで、溢れるほどの才能が反社会的な方に向いてしまった人。これはおそらく狂人と呼ばれることになる。//こんな立派な生き方をしなくとも、出世や失脚を自分の身体と切り離してマイペースで生きる道もあるのだが、ここでは言及されていない。','2011-10-03 17:27:54'),(14,14,'第十四章','[視之不見、名曰夷。聽之不聞、名曰希。]摶之不得、名曰微。/此三者、不可致詰。故混而爲一。/其上不皦、其下不昧。繩繩不可名、復歸於無物。/是謂無状之状、無物之象。是謂惚恍。迎之不見其首、隨之不見其後。/執古之道、以御今之有、能知古始。是謂道紀。','(之:これ)を(視:み)れども(見:み)えず、(名:な)づけて(夷:い)と(曰:い)う。(之:これ)を(聴:き)けども(聞:き)こえず、(名:な)づけて(希:き)と(曰:い)う。(之:これ)を(摶:とら)うるも(得:え)ず。(名:な)づけて(微:び)と(曰:い)う。/(此:こ)の(三:みっ)つの(者:もの)は(詰:きつ)を(致:いた)す(可:べ)からず。(故:もと)より(混:ま)じりて(一:いち)を(為:な)す。/(其:そ)の(上:うえ)は(皦:あきら)かならず、(其:そ)の(下:した)は(昧:くら)からず。(繩繩:じょうじょう)にして(名:な)づける(可:べ)からず、(無物:むぶつ)に(復歸:ふっき)す。/(是:これ)を(無状:むじょう)の(状:じょう)、(無物:むぶつ)の(象:しょう)と(謂:い)い、(是:これ)を(惚恍:こっこう)と(謂:い)う。/(之:これ)を(迎:むか)えども(其:そ)の(首:こうべ)を(見:み)ず、(之:これ)に(随:したが)えども(其:そ)の(後:しりえ)を(見:み)ず。/[(古:いにしえ)の(道:みち)を(執:と)りて、(以:もっ)て(今:いま)の(有:ゆう)を(御:ぎょ)すれば、(能:よ)く(古始:こし)を(知:し)る。](是:これ)を(道紀:どうき)と(謂:い)う。',NULL,NULL,'見ようとしても見えない、聴こうとしても聞こえない、取ろうとしても取れない。/これらは突き詰めてはいけない。最初から混ざり合って一つになっているからだ。//上だからといって明るくなく、下だからといって暗くない。ぐちゃぐちゃしていて表現しようがなく、物のようには対処できないんだという結論にまた帰っていく。//これを状態のない状態、物にはならない形と言い、ぼんやりと明るい状態とも言える。/これを見てやろうと正面にまわっても顔は見えず、背後にまわっても後ろ姿は見えない。//太古の時代の道を執り行うことで現代の有事を制御すれば、太古の時代がどうやって始まったかを知ることができる。これを道のしるしという。',NULL,'恍惚と呼ばれる五感でとらえられない複雑な事象に対して向き合うときの考え方を書いた章。/難しい章なので先にフレーズごとの注釈を。//*視之不見、名曰夷。:夷は平らという意味だが、たいらなものが見えないとはいかに。/平らに見えるのは思い込みではないか。もっと拡大すれば凹凸が見えるのに、早合点で見えてないと結論を出してしまうことが「見えない」だと解釈してみる。{s:41}には「夷道は纇のように凹凸がある」と言っているから本当に平らなわけではないようだ。*//*聽之不聞、名曰希。:{s:23}では自然は希言、{s:41}では大音は希聲。耳で聞こえる音ではないのだろう。*//*摶之不得、名曰微。:摶は殴るという意味だが、これじゃ通りが悪い。爪でひっかくとか、かきむしるくらいか。熊手でさらっても隙間から洩れるほど小さい。爪でそぎ取っても爪の間にすら残らないほど小さい。*//*不可致詰:上記のとおり、うわべだけ感覚的に捉えてもわかりっこないから考えを深めても無駄だ。*//*其上不皦、其下不昧。:天が明るく地中が暗いという常識が通用しない様子。話全体を社会とすると、上昇のきっかけがあったとしても将来が明るいとは限らず、転落しているように見えても暗いとは限らないといったところか。*//*復歸於無物:ぐちゃぐちゃに見えるものを言葉にすると、人によって表現の仕方がまるで違ってくる。意見が割れると正しい名前が付けられない。だから、一つの個体としては見れなくなって、「混ざって一つだね」という結論に落ち着く。*//*恍惚:形容もできず、実感もできない、ぼんやりした何か。前と後ろの多面でみても正体が見えない。*//*執古之道、御今之有:古之道と今之有で対になってるので、昔で今をどうこうするってことだろう。素直に有は起きていること、有事とした。また、御は防御ではなく制御とした。*//*能知古始:昔のやり方に戻せば今の問題が解決されて昔と同じに戻る。そうなれば、どんなふうに社会ができあがっていったかを理解できる。*//*是謂道紀:道の歴史みたいな感じ。記とくれば文章で残すが、紀であれば{w:結繩}のように縄結びで残すんではないか。*//恍惚をたとえるなら、社会・人間関係・心といったところか。/これらは複雑に絡まってるから、都合よく一部の現象を取り出すことはできない。だから、目や耳や手で得た目前の情報だけを突き詰めてはいけないということ。//老子はこの恍惚に対してどう向き合えと言ってはいないが、結論としては道紀を最後に持ってきている。つまり、ずっと昔まで遡って絡まった糸をほぐすようにしていけば、わかってくると。//単純に見える社会問題も調べてみると複雑な歴史的経緯があったりするもの。人の好き嫌いもこれまでの人生が決めているようなもの。それを一気に解決しようとするとできないわけなんですな。','2011-10-03 17:28:07'),(15,15,'第十五章','[古之善爲士者、微妙玄通、深不可識。]夫唯不可識、故強爲之容。/豫兮若冬渉川。猶兮若畏四隣。/儼兮其若客。渙兮其若冰之將釋。/敦兮其若樸。曠兮其若谷。混兮其若濁。/孰能濁以靜之徐清。孰能安以動之徐生。/保此道者、不欲盈。夫唯不盈、故能蔽不新成。','(古:いにしえ)の(善:よ)く(士:し)(爲:た)る(者:もの)は、(微妙:びみょう)(玄通:げんつう)、(深:ふか)くして(識:し)る(可:べ)からず。/(夫:そ)れ(唯:た)だ(識:し)る(可:べ)からず、(故:ゆえ)に(強:し)いてこれが(容:よう)を(爲:な)す。//(豫:よ)として(冬:ふゆ)の(川:かわ)を(渉:わた)るが(若:ごと)し。(猶:ゆう)として(四隣:しりん)を(畏:おそ)るるが(若:ごと)し。/(儼:げん)として(其:そ)れ(客:きゃく)の(若:ごと)し。(渙:かん)として(其:そ)れ(氷:おこり)の(将:まさ)に(釈:と)けんとするが(若:ごと)し。(敦:とん)として(其:そ)れ(樸:ぼく)の(若:ごと)し。/(曠:こう)として(其:そ)れ(谷:たに)の(若:ごと)し。(混:こん)として(其:そ)れ(濁:にご)れるが(若:ごと)し。/(孰:た)れか(能:よ)く(濁:にご)りて(以:も)ってこれを(静:しず)かにして(徐:おもむろ)に(清:きよらか)からん。/(孰:た)れか(能:よ)く(安:やす)んじて(以:も)ってこれを(動:うご)かして(徐:おもむろ)に(生:しょう)ぜん。//(此:こ)の(道:みち)を(保:たも)つ(者:もの)は、(盈:み)つることを(欲:ほっ)せず。(夫:そ)れ(唯:た)だ(盈:み)たず、(故:ゆえ)に[(能:よ)く(敝:やぶ)れて(而:しか)して(新:あら)たに(成:な)る。]',NULL,NULL,'大昔の傑物はわずかな本質にも奥深く通じており、その深さは計り知れないほどだった。それをただ上辺だけで知ることはできないから、なんとかして彼らの本性を表現してみよう。//ぐずぐずすること、冬の冷たい流れを渡るのをためらうかのよう。びくびくすること、周囲を過剰に恐れているかのよう。/大仰そうなこと、客が訪問するときのよう。まったりしていること、氷がとけはじめるときのよう。重厚なること、まだ削られていない樸のよう。/度量のひろさ、渓谷のよう、底の見えない暗さ、濁流のようである。/こんな得体の知れない濁った心を静かに澄みきらせてハッキリさせるように誰れができようか。/こんな鈍重で安定した心を動かして生き生きさせるように誰れができようか。//このように道を心がける者は、積極的なことを望まない。ただ完全であろうとしないから、何度も挫折しているのに新しいことを始められる。',NULL,'聖人、あるいはそれに匹敵するような偉人がどんな人だったか。/「なんとかして言葉にしてみよう」と前置きがあるところを見ると、当時の人らでも理解に苦しむ表現なんだろう。現代人の我々がわけわかんなくてもしかたがない。/ということでギブアップ状態。//結局のところ、わけがわからない人だが悪い人ではなく無理をしないだけってことっぽい。そういうどっちつかずのグズだから、失敗も失敗に見えず、何度も挑戦ができると解釈した。//*豫兮若冬渉川。猶兮若畏四隣。:豫は與となってる本が多いが後の文と合わせて猶予とする説を採用しておいた。決断できないタイプなわけだ。*//*儼兮其若客。渙兮其若冰之將釋。敦兮其若樸。:この三つをセットにしていいものか。人付き合いで見える人間像と考えてここで区切った。厳しいようで人当たりが良いようで、正体はわからないが篤実で素朴なことは確かなわけだ。*//*曠兮其若谷。混兮其若濁。:広い谷に濁流が流れ込んでいるかのように底が知れない。*//*孰能濁以靜之徐清。:何を考えているのかわからない上にグズだからハッキリ決断させることができない。喜ばせて懐柔させることができないし、嫌がらせで追い払うこともできない。好き嫌いがはっきりしてこそ対応できる。*//*孰能安以動之徐生。:決断できないグズには仕事をさせられない。仕事をしようともしない。*//*保此道者、不欲盈。:完璧を追い求めない。*//*夫唯不盈、故能蔽不新成:{s:22}に「敝則新」とある。敝と蔽は同じで、この章も蔽をやぶれるとしてしまうと矛盾が出る。悩ましいところだが、不と而の字形が似ているために写し間違えたのだという説に右にならえして、原文はそのままで解釈時に変えることにした。/積極的にものごとに取り組むと完全になる以外には挫折しかない。完全になれば新しい物にはなれないので周囲からは自由の利かない完成品か負け犬としてしか見られない。最終目標を宣言しないで逃げ道を用意してから消極的に取り組むことで何にでもなれるようにしておく。*/','2011-10-03 17:28:12'),(16,16,'第十六章','[致虚極、守靜篤、萬物竝作、吾以觀復。]夫物芸芸、各歸其根。/歸根曰靜、是謂復命。復命曰常、知常曰明。不知常、妄作凶。/知常容。容乃公、公乃王、王乃天、天乃道、道乃久。沒身不殆。','(虚:きょ)に(到:いた)ること(極:きわ)まり、(静:せい)を(守:まも)ること(篤:あつ)ければ、[(萬物:ばんぶつ)(並:なら)び(作:おこ)るも、(吾:わ)れは(以:もっ)て(復:かえ)るを(観:み)る。](夫:そ)の(芸芸:うんうん)たる(物:もの)、(各々:おのおの)(其:そ)の(根:こん)に(帰:き)す。/(根:こん)に(帰:かえ)るを(静:せい)と(曰:い)い、(是:これ)を(命:めい)に(復:かえ)ると(謂:い)う。(命:めい)に(復:かえ)るを(常:じょう)と(曰:い)い、(常:じょう)を(知:し)るを(明:めい)と(曰:い)い、(常:じょう)を(知:し)らざれば、(妄:もう)(作:おこ)して(凶:きょう)なり。/(常:じょう)を(知:し)れば(容:よう)なり。(容:よう)は(乃:すなわ)ち(公:こう)なり、(公:こう)は(乃:すなわ)ち(王:おう)なり、(王:おう)は(乃:すなわ)ち(天:てん)なり、(天:てん)は(乃:すなわ)ち(道:みち)なり、(道:みち)は(乃:すなわ)ち(久:ひさ)し。(身:み)を(没:お)うるまで(殆:あや)うからず。',NULL,NULL,'まったく何もしないで静かにしていると、植物が生い茂り、元の姿に還っていくのが見える。どれだけ青々と生長しても、やがては種に帰る。/種に帰ることを静と言い、これを命に還るという。命の循環を常と言い、常を知っていることを明知と言う。常を知らないとでたらめを始めて悪いことがおきる。/常を知れば容でいられる。容は容器であり公共で共有でき、天下のための共有財産と言えば王であり、王は天につながっており、天は道につながり、道は不滅である。生涯に危険はないだろう。',NULL,'時節に逆らわず生きていくことの大切さを書いた章。解釈が原文の文字から逸脱しているが、わかりやすさを取って植物でたとえた。//忙しい毎日から離れて田舎で暮らしてのんびりすれば四季の変化がいやでもわかる。勉強に明け暮れるより、ボーっとしていた方が大切なことに気付いたりするものだ。{s:47}もそんな話だ。//それで、季節とともに植物が姿を変えていき、世代は必ず交代するものだとわかる。人間だってこの自然の循環に組み込まれ、逃げることはできない。/それでいながら人間はいつまでも若くありたいと望み、得た力を失った末の代替わりを拒否してしまう。社会の混乱はそういった欲から始まる。自分の老いを受け入れられることこそ、明知といえるのだろう。//最後の段は現代を生きる我々にはわかりにくい。この手の連想ゲーム的ロジックは{s:25}や{s:39}にもある。おそらく世界には序列があって、その最高位である道に辿りつくためには、一つずつステップアップせねばならないということだろう。それにしても容→公→王はわかりにくい。公が臣下の位の最高位であることと「おおやけ」の二つの意味を合わせていることは想像つくのだが。//*夫物芸芸、各歸其根。:どんな生物でも若いうちは元気で勢いがあるが、やがて根本的なところに帰る。「根」は死んで土に帰るとしても悪くはない。ここでは子供を作って人生の始まりに帰ることにしておいた。*//*歸根曰靜、是謂復命。:死んで土に帰るとするなら魂が天に帰るという意味になるだろう。「静」のイメージからは死のほうが近いか。子供も生まれる前の種の段階では「静」だろうから植物にたとえて種としておいた。*//*復命曰常、知常曰明。:復命は必ずやってくる日常的で当たり前のこと。根と静の意味がどちらであっても「当たり前の運命を受け入れることが賢い」となる。*//*沒身不殆:常を知れば危険はない。*/','2011-10-03 17:28:32'),(17,17,'第十七章','[太上下知有之。其次親而譽之。]其次畏之。其次侮之。/信不足、焉有不信。/悠兮其貴言、功成事遂、百姓皆謂我自然。','(太上:だいじょう)は(下:しも)(之:これ)(有:あ)るを(知:し)るのみ。(其:そ)の(次:つぎ)は(親:した)しみて(之:これ)を(誉:ほ)む。(其:そ)の(次:つぎ)は(之:これ)を(畏:おそ)る。(其:そ)の(次:つぎ)は(之:これ)を(侮:あなど)る。/[(信:しん)(足:た)らざれば、(信:しん)ざらざれる(有:あ)り。]/(悠:ゆう)として(其:そ)の(言:げん)を(貴:おも)くすれば、(功:こう)は(成:な)り(事:こと)は(遂:と)げられて、(百姓:ひゃくせい)の(皆:みな)、(我:われ)らは(自:おのず)から(然:しか)りと(謂:い)わん。',NULL,NULL,'最高の指導者は、皆が存在を知っているものの具体的な成果は何も知らない。次に良い指導者は愛されて自慢される。その次は威厳があり怖がられる。その次は馬鹿にされる。/信用しないなら信頼はしてもらえない。/ゆったりと構えてうるさいことを言わなければ、かってに事業は成し遂げられる。そのとき人々はこう言うだろう。「俺たちだけでやっていけます」と。',NULL,'トップリーダーのあり方について。//テキパキと厳しく緊張感のある職場を作るリーダーと優しく褒めて伸び伸びとした職場を作るリーダー。どちらも社会では一定の支持を得るリーダー像である。/しかし、老子はその上に何もしないリーダーを置いた。それは当然無為の発想から来ている。//*太上下知有之:{s:63}では、大きな功績を挙げないリーダー像がある。{s:10}には、日頃の努力を見せないで愛する姿が。*//*信不足、焉有不信。:似たようなフレーズが{s:23}にある。*//*其貴言:貴は希少価値が高いから少ないの意味。このような使い方は{s:70}にも見られる。*//*功成事遂:{s:9}では「功成名遂身退」とある。*//*我自然:一般的には「ひとりでにできてた」とか「俺達が自分でやったんだ」という解釈が多いか。しかし、「太上下知有之」なので、最後には不要にされてしまうのが老子の美学なのではないか。「俺たちだけでやっていけます」「だから、もう助けはいりません」。それで名前だけの君主となるか、「事遂、身退」になるんだろう。*/','2011-10-03 17:28:35'),(18,18,'第十八章','[大道廢、有仁義。]智慧出、有大僞。六親不和、有孝慈。國家昏亂、有貞臣。','[(大道:たいどう)(廃:すた)れて(仁義:じんぎ)(有:あ)り。](智慧:ちえ)(出:い)でて(大偽:たいぎ)(有:あ)り。/(六親:ろくしん)(和:わ)せずして(孝慈:こうじ)(有:あ)り。(国家:こっか)(昏乱:こんらん)して(貞臣:ていしん)(有:あ)り。',NULL,NULL,'道が廃れるところには仁義がある。/知恵が出るところには嘘がある。/不仲な家には親孝行がある。/混乱した国には忠臣がいる。',NULL,'儒教を批判した章。//老子は向上心を煽る儒家を作中で繰り返し批判している。中でもこの章は短いフレーズで敵を次々と切り伏せていく気持よさがある。覚え易いので、ついつい口に出てしまうが、この章は問題提起で終わっており続きは{s:19}にある。また、その本質は{s:38}にあり、これらをしっかりと理解しておかないと危うい章である。//この章を安易に訳してしまうと「聖人たる周文王が道で王朝を築いた治世では仁義を振りかざす者はいなかった。道をおろそかにする者が出てきて乱れ出して以来、仁義がありがたがられるようになった。だから、仁義はあるべきじゃない。」となってしまって「ケータイができて以来、学力が下がった。ケータイなんて作るな。」という老人のたわごとにしか聞こえない。/まぁ老子は懐古主義者みたいだから、そういうだろうけどね。論理的には簡単に論破されそうな部類なんで、余程の自信がない限りは口にしない方がいいかもね。差し出がましい人に腹を立てたときに心の中で毒づくにはいいかも。//*大道廢、有仁義。:道という根本がないのに仁義があっても、基礎のない上に家を建てるようなもの。*//*智慧出、有大僞。:本来、知恵は人を助けるためにあるものなのに、実際には謀略に使われ、嘘ばかりになった。さらに、その嘘を見抜くために知恵者が求められ、知恵はことごとく騙すためにつかわれる。*//*六親不和、有孝慈。:当時の乱世は兄弟喧嘩・親子喧嘩が当たり前。諸侯の多くは元をたどれば初代周王である文王の子供たち。言ってみれば骨肉の争い。/当時の情勢では家族と言えど安心できない。弟が疑われないように兄に孝慈を尽くすと、弟の評判が上がってしまう。兄はそれが面白くなく誅殺しようとする。たまらず防戦するとやっぱり謀反となる。魔女狩りのようなもので、どちらにしても命はないので、殺し合いが始まる。/そんな世の中では孝慈の意味がないのだが、それでも仮りそめの孝慈を行う。*//*國家昏亂、有貞臣。:貞臣は忠臣のこと。諸侯に孝慈の心がないんだから、家臣に忠義があるわけない。/そんな時代だからこそ、当たり前の忠義を見せただけで評価される。*/','2011-10-03 17:28:37'),(19,19,'第十九章','[絶聖棄智、民利百倍。]絶仁棄義、民復孝慈。絶巧棄利、盗賊無有。/此三者、以為文不足。故令有所屬。/見素抱樸、少私寡欲。','(聖:せい)を(絶:た)ち(智:ち)を(棄:す)てれば、(民:たみ)の(利:り)は(百倍:ひゃくばい)す。(仁:じん)を(絶:た)ち(義:ぎ)を(棄:す)てれば、(民:たみ)は(孝慈:こうじ)に(復:かえ)る。(巧:こう)を(絶:た)ち(利:り)を(棄:す)てれば、(盗賊:とうぞく)(有:あ)ること(無:な)し。/(此:こ)の(三者:さんしゃ)を(以:も)っても(文:ぶん)(足:た)らずと(為:な)す。(故:ゆえ)に(属:ぞく)する(所:ところ)(有:あ)ら(令:し)めん。/[(素:そ)を(見:あら)わし、(樸:ぼく)を(抱:いだ)き、](私:し)を(少:すく)なくし(欲:よく)を(寡:すく)なくせよ。',NULL,NULL,'聖人と呼ばれるような立場にいることを辞めて、智に頼らない政治をすれば、民衆の利益は百倍になる。仁義を指導しなければ、民衆は孝行の心をを取り戻す。効率を上げろ、利益を出せと言わなければ、盗みやサボリはなくなる。//これだけではまだ説明不足だから、従うべき所を教えよう。/飾らない姿で、素朴な気持ちで、控えめにして、欲張らない。',NULL,'{s:18}に続く儒教批判。/仁義と孝慈があるから、世の中が乱れる。そこから立ち直る方法は、質素かつ素朴に生きること。//初見で違和感を覚えるのは「絶聖」。特筆せざるを得ないだろう。老子で「聖人」以外の「聖」が出てくるのはここだけ。聖人を絶するなんて、何かの間違いじゃないかとも思うが、そう書いてあるなら従うよりない。//{w:聖人}という存在は老子固有のものではなく、儒教も聖人の教えを引用して指導した。墨子も聖人の統治に習うよう主張したように、誰もが知っていて話の引き合いに出す偉人が聖人だ。/いずれの聖人も同じ人を指しているが、視点によっては彼らの功績の褒めたたえ方が違う。だから、儒教に出てくる聖人の教えを捨てろと解釈してみた。//*絶聖棄智、民利百倍。:聖人とは民を指導するべき立場ではない。聖人とおだてられて上からモノを言うようではいけない。ましてや民の利益が十倍にもなるような効率的な生き方を指導し、知恵をつけるようであってはいけない。聖人なら十倍で満足してはならず、無知でもって百倍を目指さねばならない。/まぁこんな感じに儒教の聖人を批判していると考えてみた。*//*絶仁棄義、民復孝慈。:ここで言う仁義がどんなものかはイメージできていない。{s:38}では、上仁・上義ともに「これを為して」とあるから、指導力や影響力を発揮することを警戒しているのか。早い話が押し付けられるから反発される。*//*絶巧棄利、盗賊無有。:{s:3}の得難きの貨と同じ理屈。*//*見素抱樸、少私寡欲。:人が心がけることを最もシンプルに言ったのが、このフレーズかもしれない。/本当の聖人が教えることはこっちだと言いたいのだろう。もちろん聖人もこれを守るんだから、智を捨てる。*/','2011-10-03 17:28:39'),(20,20,'第二十章','[絶学無憂。]/唯之與阿、相去幾何。善之與惡、相去何若。/人之所畏、不可不畏、荒兮其未央哉。/衆人熈熈、如享太牢、如春登臺。/我獨泊兮其未兆。如嬰兒之未孩、儡儡兮若無所歸。/衆人皆有餘、而我獨若遺。我愚人之心也哉、沌沌兮。/俗人昭昭、我獨昏昏、俗人察察、我獨悶悶。/澹兮其若海、飂兮若無止。/衆人皆有以、而我獨頑似鄙。我獨異於人、而貴食母。','(学:がく)を(絶:た)てば(憂:うれ)い(無:な)し。/(唯:い)と(阿:あ)と(相:あい)(去:さ)ること(幾何:いくばく)か。(善:ぜん)と(悪:あく)と(相:あい)(去:さ)ること(何若:いかん)ぞ。/(人:ひと)の(畏:おそ)るる(所:ところ)、(畏:おそ)れざる(可:べ)かざるも、(荒:こう)として(其:それ)(未:いま)だ(央:おう)ざる(哉:かな)。//(衆人:しゅうじん)は(煕煕:きき)として(太牢:たいろう)を(享:うけ)るが(如:ごと)く、(春:はる)に(台:うてな)に(登:のぼ)るが(如:ごと)し。/(我:われ)は(独:ひと)り(泊:はく)として(其:それ)(未:いま)だ(兆:きざ)さず。/(嬰児:えいじ)の(未:いま)だ(孩:わら)わざるが(如:ごと)し、(累々:るいるい)として(帰:き)する(所:ところ)(無:な)きが(若:ごと)し。//(衆人:しゅうじん)は(皆:みな)(余:あま)り(有:あ)るに、(而:しか)るに(我:われ)は(独:ひと)り(遺:うしな)えるが(若:ごと)し。/(我:われ)は(愚人:ぐじん)の(心:こころ)なる(哉:かな)、(沌沌:とんとん)たり。/(俗人:ぞくじん)は(昭昭:しょうしょう)たり、(我:われ)は(独:ひと)り(昏昏:こんこん)たり。/(俗人:ぞくじん)は(察察:さつさつ)たり、(我:われ)は(独:ひと)り(悶悶:もんもん)たり。/(澹:たん)として(其:それ)(海:うみ)の(若:ごと)く、(飂:りゅう)として(止:と)まる(無:な)きが(若:ごと)し。/(衆人:しゅうじん)は(皆:みな)(以:もち)うる(有:あ)り、(而:しか)るに(我:われ)は(独:ひと)り(頑:かたくな)にして(鄙:ひ)に(似:に)たり。/[(我:われ)は(独:ひと)り(人:ひと)に(異:こと)なり、(而:しか)して(母:はは)に(食:やしな)わるるを(貴:たっと)ぶ。]',NULL,NULL,'学ぶことをやめれば不安がなくなる。/「もしもし」と話しかけるのを「おいコラ」と言ったところで大きな違いがあるだろうか。行儀の良い態度と醜悪な態度に何か違いがあるだろうか。/人が畏れて避けることは私も避けないわけにはいかないが、このように広い大地ではまだ中心には届かぬよ。//世間の人のうれしそうに生きること、まるで祭りのごちそうにありつけたよう、まるで春の展望台に登って花見をしているよう。/私はボケっとしているから独りだけそんな兆しもなく、笑うことを知らない赤子のよう、ボロボロに疲れ果てて帰る家もない浮浪者のよう。//世間の人はみんな貯えがあるのに、私独り貯えをどこかへ置いてきたようだ。なんと私は愚か者か、その心はあまりにも暗い。/あいつらは賢いよ、私が独りだけバカなんだ。/あいつらはしっかりしてるよ、私が独りだけグズなんだ。私の人生など海のように浮いたり沈んだり、強い風に煽られたかのように止まることなく転がり続ける。//世間の人はみんな私以上に恵まれているのに、私は独りだけ頑固にに田舎くさい。/そんな私が独りだけ決定的に人と違うのは、母からの恵みを受けて生きることを大切にしているところだ。',NULL,'道を行くばかりに損が続いて報われない自分を慰める章。//*絶学無憂:学とは主に礼儀を学ぶことで、今風に言えば「常識を知ること」くらいか。*//*唯之與阿、相去幾何。:「相去」は両者を遠くから見て比べること。少しくらいの違いは遠くから見てしまえば差はない。/だから、ちっぽけな礼など学ばなくてよい。*//*善之與惡、相去何若。:善悪も聖人から見れば差はない。それは聖人の価値基準がけた外れに大きいから。凡人の価値基準はお金に換算すれば10円くらいのもの。全財産が10円程度なら、行儀を良くするだけで1円貰えるならありがたいだろう。しかし、その土俵では聖人は億万長者。1円ごときでぶれることはない。*//*人之所畏、不可不畏。:人が畏れることってなんだろう?/これまでの流れで言えば、常識を破って場の空気を壊すことだろうか。*//*荒兮其未央哉:荒は見渡す限りの荒野。央は尽のことで、未央だとキリがないとなるようだ。まぁ広い観点の中央を探すのは難しいようなニュアンスか。/人を評価する基準はたくさんありすぎて、どれを取ったら良いかわからない。優劣をつけるにもキリがない。採用試験でも膨大な費用を投じて多角的な評価をしたわりには期待通りにはいかなかったりする。*//*衆人熈熈、如享太牢、如春登臺。:ここからは他人と自分の違いを対比することでみじめさを強調している。他の章には見られない情緒豊かな表現がより感動を与える。*//*如嬰兒之未孩、儡儡兮若無所歸。:赤ちゃんって笑わなかったけ?笑う力もないほど疲れきって生活が追い詰められている様子かな。*//*衆人皆有餘、而我獨若遺。:遺は残すという意味。人と自分の対比なので貯蓄があることに対して「残す」のはおかしい。貯蓄するべきものを他人のもとに残してなくしたという意味だろう。「ごとし」だから完全になくしたわけではなく、恩や義理みたいなものが残っていると考えていいか。*//*俗人察察、我獨悶悶。:察察と悶悶の対比は{s:58}にもある。*//*澹兮其若海、飂兮若無止。:ここは自分の人生の儚さを嘆いているのだろう。澹を湛につなげて「海のようにどっしりしている」と肯定すると前後の句と合わないように感じる。*//*衆人皆有以、而我獨頑似鄙。:人は洗練された効率的な都会的生活をしている。自分は古臭い不便な生活で田舎者みたいな生活だ。*//*我獨異於人、而貴食母。:お母さんを食べちゃったわけではない。お母さんに食べさせてもらってると聞けばニートっぽい。「母」を大地として収穫物をいただく感謝の気持ちと解釈したが、「母」を道、「食」をやしなうとして道を育てていくんだという決意としてもおさまりは良い。*/','2011-10-03 17:28:42'),(21,21,'第二十一章','[孔徳之容、唯道是従。]道之為物、唯恍唯惚。/惚兮恍兮、其中有象。恍兮惚兮、其中有物。/窈兮冥兮、其中有精。其精甚眞、其中有信。/自古及今、其名不去。以閲衆甫。/吾何以知衆甫之状哉、以此。','[(孔徳:こうとく)の(容:すがた)、(唯:ただ)(道:みち)に(是:これ)(従:したが)う。](道:みち)の(物:もの)(為:た)る、(唯:ただ)(恍:こう)、(唯:ただ)(惚:こつ)。/(惚:こつ)たり(恍:こう)たり、(其:そ)の(中:なか)に(象:しょう)(有:あ)り。(恍:こう)たり(惚:こつ)たり、(其:そ)の(中:なか)に(物:もの)(有:あ)り。/(窈:よう)たり(冥:めい)たり、(其:そ)の(中:なか)に(精:せい)(有:あ)り。(其:そ)の(精:せい)(甚:はなは)だ(真:しん)、(真:しん)の(中:なか)に(信:しん)(有:あ)り。/(今:いま)より(古:いにしえ)に(及:およ)ぶまで、(其:そ)の(名:な)は(去:さ)らず。(以:もっ)て(衆甫:しゅうほ)を(閲:み)る。/(吾:わ)れ(何:なに)を(以:もっ)て(衆甫:しゅうほ)の(状:じょう)を(知:し)る(哉:や)、(此:こ)れを(以:もっ)てなり。','',NULL,'広大なる徳には形があるが、これは道に従っているだけだ。/道は物として形をあらわすとしても、おぼろげでとらえようがない。/とらえようがないが、その中には眼に見える形がある。/とらえようがないが、その中には物が見える。/奥深くて暗いが、その中には核心がある。/その核心は混じり気のない本質で、その中には真実がある。/昔から今に至るまで、その形状は変わらない。/それが物事の始まりだ。',NULL,'よくわからない。「孔徳之容」の時点でバンザイ。//話の大筋としては、道の表面はぼんやりしているが中心に迫るにつれてはっきりしてきて最後には核心が見えるといったところか。核心・本質などは適当に読んだ。語彙力が豊富ならより良い文字が使えるんだろうけど。//これ以上先は各自が読みとくしかないだろう。この注釈はアテにならない。//*孔徳之容、唯道是従。:容には容姿と容器の意味があるが、どちらでも良い。徳を備える人の容姿が道に従っているとしてもいいし、道や徳を谷のような容器でたとえたとしても良い。/孔徳は広い徳と同じだと考えてよいか。{s:41}には{w:廣徳}が出てきて、上徳と合わせて谷にたとえられている。しかし、徳を使った熟語が廣徳・玄徳・建徳など複数用意されている中でわざわざ孔徳と使うからには穴の意味が含まれていると考えて良いだろう。道の力を透過させるために穴が空いているのだろうか。*//*道之為物、唯恍唯惚。:道に姿はないから何とか表現してみると言っている。眩しくて表面はぼんやりとしか見えない。*//*惚兮恍兮、其中有象。:表面がぼんやりしているのは、普遍的な核心に対して無数の噂や憶測が取り巻いているから。/ここから先は{s:42}と{s:51}の万物の生成秩序と関係があるかもしれない。このレベルは万物まで派生した最先端の部分。*//*恍兮惚兮、其中有物。:万物をかき分けていくと実態が見えてくる。しかし、ぼんやりしているだけで、必ず中身はある。{s:51}で言うなら三の部分。たとえば、万物が千羽鶴状態なら、三というのは色や大きさは違えども形は同じであることに気付いて一羽に絞って着目した状態。*//*窈兮冥兮、其中有精。:まばゆい光の中をくぐり抜けると今度は真っ暗な中に入る。話は上辺から核心に迫る。{s:51}で言うなら二の部分。千羽鶴のたとえなら折り方。*//*其精甚眞、其中有信。:核心から本質に迫る。{s:51}で言うなら一の部分。折り鶴で留まらず、折り紙へと辿り着く。一は徳と同じと考えられるので信も徳なんだろう。徳とは信じることだと{s:49}には書いてある。逆から考えれば精が充満するほど一を練り込めば二が生まれることになる。*//*自古及今、其名不去。以閲衆甫。:道という個体が不滅とするより、道の作用が不滅で万物にはすべて道が備わっていると考えた方が去り難い。衆甫と言って衆が着く意味もわかってくる。衆甫はものごとの始まりという意味だが、道こそが無から有を生み出し、徳が有を一として捉えて万へと養っていくわけだ。だから、「始まり」から発展させるこの章は、やはり徳について書いた章なんだろう。*/','2013-02-20 14:06:22'),(22,22,'第二十二章','[曲則全、枉則直。]窪則盈、敝則新、少則得、多則惑。/是以聖人、抱一爲天下式。/不自見故明。不自是故彰。不自伐故有功。不自矜故長。/夫唯不爭、故天下莫能與之爭。/古之所謂、曲則全者、豈虚言哉。誠全而歸之。','[(曲:ま)がれば(則:すなわ)ち(全:まった)く、(枉:かが)めば(則:すなわ)ち(直:なお)し。]/(窪:くぼ)めば(則:すなわ)ち(盈:み)ち、(敝:やぶ)るれば(則:すなわ)ち(新:あら)たに、(少:すく)なければ(則:すなわ)ち(得:え)られ、(多:おお)ければ(則:すなわ)ち(惑:まど)う。/(是:これ)を(以:もっ)て(聖人:せいじん)は、(一:いち)を(抱:いだ)きて(天下:てんか)の(式:のり)と(為:な)る。/(自:みずか)ら(見:あら)わさざるが(故:ゆえ)に(明:あき)らか。(自:みずか)ら(是:ぜ)とせざるが(故:ゆえ)に(彰:あら)わる。/(自:みずか)ら(伐:ほこ)らざるが(故:ゆえ)に(功:こう)(有:あ)り。(自:みずか)ら(矜:ほこ)らざるが(故:ゆえ)に(長:ちょう)ず。/(夫:そ)れ(唯:ただ)(争:あらそ)わざるが(故:ゆえ)に(天下:てんか)に(能:よ)く(之:これ)と(争:あらそ)う(莫:な)し。/(古:いにしえ)の(所謂:いわゆる)、(曲:ま)がれば(則:すなわち)ち(全:まった)しとは、(豈:あ)に(虚言:きょげん)ならん(哉:や)。(誠:まこと)に(全:まった)くして(之:これ)に(帰:き)す。',NULL,NULL,'曲がっていることで天寿を全うできる。曲がることはまっすぐだ。窪みは貯めることができる。破れると新しくなる。少ししか持ってない人はわずかでも得たと感じ、たくさん持ってる人は得ることがあっても勘定に悩む。//だから、聖人は道徳という最低限のものだけをしっかり抱えることで人類の手本となる。//目立とうとしないから注目される。自己主張しないから受け入れられる。自分で功績をあげないから功績があり、自慢しないから一目置かれる。/ただ争わないだけで敵うものがいなくなる。//昔の人は「曲がっているものは生き残る」といったが、けっしてでたらめではない。結局のところ生きることだけなんだよ。',NULL,'負けるが勝ち。逃げるが勝ち。逆転の発想。//回り道をして目立つ功績を立てなければ長生きできる。//もっとも、この話は向上心のある人たちに言わせれば「何かを否定することで達成できることはない」んだろうが、命を失うよりはマシではなかろうか。//*曲則全:荘子には曲がった木の話が出てくる。曲がり過ぎて材木にできないから切り倒されなかったという。役に立たないゆえの利点で生き残った話。*//*枉則直:尺取り虫は身体は曲げているが、その成果は直進している。膝を曲げずにジャンプは難しい。/純粋な生き方をしたいなら曲がらなければならないこともある。*//*窪則盈:窪んだ曲面があるから貯めることができる。逆転の発想の定番。{s:11}では器の用。/損した方が貯まる。*//*敝則新:{s:15}では、「能蔽不新成」とある。思わずここと通じていると早とちりしがちであるが、よく見ると敝と蔽で字が違う。ややこしいことに「能敝不新成」とする人もあり、真意ははっきりしない。ただ、この章では文字通りに解釈して良いと思う。/服が破れて新調するんじゃ棄てない老子らしくないしな。/曲がった生き物である蛇は、皮が破れて脱皮すると新しくなる。喧嘩も修復できれば新たな関係が結べる。*//*少則得:{s:77}で天道が弓に似て低いものを上げる作用。*//*抱一爲天下式:抱一は{s:10}にも出る。一は{s:39}のように基礎でもある。*//*不自見故明。不自是故彰。不自伐故有功。不自矜故長。:{s:24}にほとんど同じフレーズがある。こちらはいい例。あちらは悪い例。*//*故天下莫能與之爭。:與にも争う的な意味があるっぽいが?ライバルとして競争するのかな?*//*誠全而歸之:結論としては生き延びることだけに収束する。*/','2011-10-03 17:28:55'),(23,23,'第二十三章','[希言自然。飄風不終朝、驟雨不終日。]/孰爲此者、天地。天地尚不能久、而況於人乎。/故從事於道者、道者同於道、徳者同於徳、失者同於失。/同於道者、道亦樂得之、同於徳者、徳亦樂得之、同於失者、失亦樂得之。/信不足焉、有不信焉。','[(希言:きげん)は(自然:しぜん)なり。]/(飄風:ひょうふう)は(朝:あした)を(終:お)えず、(驟雨:しゅうう)は(日:ひ)を(終:お)えず。/(孰:た)れか(此:こ)れを(爲:な)す(者:もの)ぞ。(天地:てんち)なり。(天地:てんち)すら(尚:なお)(久:ひさ)しきこと(能:あた)わず、(而:しか)るを(況:いわ)んや(人:ひと)に(於:お)いてを(乎:や)。/(故:ゆえ)に(道:みち)に(従事:じゅうじ)する(者:もの)は、(道者:みちのもの)は(道:みち)に(同:おな)じくし、(徳者:とくのもの)は(徳:とく)に(同:おな)じくし、(失者:しつのもの)は(失:しつ)に(同:おな)じくす。/(道:みち)に(同:おな)じくする(者:もの)は、(道:みち)も(亦:また)(之:これ)を(得:う)るを(楽:たの)しむ。(徳:とく)に(同:おな)じく(者:もの)は、(徳:とく)も(亦:また)(之:これ)を(得:う)るを(楽:たの)しむ。(失:しつ)に(同:おな)じくする(者:もの)は、(失:しつ)も(亦:また)(之:これ)を(得:う)るを(楽:たの)しむ。/(信:しん)(足:た)らざれば、(不信:ふしん)(有:あ)り。',NULL,NULL,'自然はガミガミ言わない。びゅうびゅう風が吹いてもせいぜい一晩だし、ザアザア雨が降っても夜には止む。/このような気象の変化を決定しているのは自然だが、その自然ですら長いことワーワー言えない。ましてや、人間がそんなにできるものか。/だから、道を行く者は道に近づいていき、徳を行くものは徳に近づき、あやまりを行く者はあやまりに近づいていく。/道に近づいて行けば道の方から迎え入れられ、徳に近づいて行けば徳の方から迎え入れられ、あやまりに近づいて行けばあやまりの方から迎え入れられる。/信じることができなければ信じてもらえないのだ。',NULL,'言うことを聞かない相手の指導について。//人を信じていないから啓蒙し、教導しようとする。しかし、熱心な指導、注意、啓蒙にも限度がある。/指導しても完全に言うことを聞かせられないとしたら諦めるか。しかし、諦めるとは相手の才能を信用できなくて突き放した状態ではなかろうか。/では、根気よく指導すればどうか。それは毎日雨にぬれるようなもので、そんなことされては生物は生きてはいけない。最初は親身な指導もやがてはいじめへと変化して死ぬまで特訓するようになるだろう。過剰にうるさいのは人を失うやり方だ。//だから、自然はうるさく言わない。気まぐれに風雨を叩きつけることもあるが、その後は好天も訪れる。/人の上に立つ者は雨を降らせてもいいが、ほどほどにして温めてやるもんだ。それが人を信じるということだ。人を信じて自分の意思で道を行くように変化するのを待てば、やがては降らせた雨が恵みとなって育つきっかけとなるんだろう。自然のようにモノ言わぬ形で試練を与えるのが老子流なのだろう。//ちと気になるのが中段か。一神教的考えかなと思う。/異教徒を改宗させようとしないのは先進的ではあるが、破滅に向かう人をだまって見過ごすのはどうだろう。宗教戦争の勃発を思えばそれでいいのかな。/いやいや、聖人は見捨てたりしない。失う者は不善の者として助けるんだろう。とはいえ、この章を読むだけでは不気味だなぁ。//*徳者同於徳:「從事於徳道」が前に省略されているものとした。失者同於失についても同じ。失は過失的な意味で間違った方向に行くものとした。*//*信不足焉、有不信焉。:{s:17}に似たフレーズがある。*','2011-10-03 17:29:02'),(24,24,'第二十四章','[跂者不立。跨者不行。]/自見者不明。自是者不彰。自伐者無功。自矜者不長。/其於道也、曰餘食贅行。物或惡之、故有道者不處。','[(跂:つまだ)つ(者:もの)は(立:た)たず。](跨:また)ぐ(者:もの)は(行:ゆ)かず。(自:みずか)ら(見:あらわ)す(者:もの)は(明:あき)らかならず。(自:みずか)ら(是:ぜ)とする(者:もの)は(彰:あきら)かならず。(自:みずか)ら(伐:ほこ)る(者:もの)は(功:こう)(無:な)し。(自:みずか)ら(矜:ほこ)る(者:もの)は(長:ちょう)たらず。/(其:そ)れ(道:みち)に(於:お)ける(也:や)、(余食:よしょく)(贅行:ぜいこう)と(曰:い)う。/(物:もの)(或:ある)いは(之:これ)を(悪:にく)むが(故:ゆえ)に(有道:ゆうどう)の(者:もの)は(処:お)らず。',NULL,NULL,'つま先立ちは長くは続かない。大股歩きは長くは続かない。/見せびらかせば見てもらえない。自己主張が過ぎれば聞いてもらえない。でしゃばりは認めてもらえない。自慢する人は尊敬してもらえない。//それを道では「食べ過ぎの贅沢」と言う。物はこういうことを嫌うかもしれないから、道を行く人はそういうところにはいかないのだ。',NULL,'やり過ぎると失敗することの戒めを日常の経験でたとえて教える話。//見栄っぱり、自己中、でしゃばり、自慢が多い。これらは今でも間違いなく嫌われる。/心ある者は大きく見せることで人より上に行こうとしないもんだ。失敗する人の例は今でも通じる。//と、まぁ表向きはこんな解釈なんだが、老子的には人より上手く行ってる人が成功した余剰を自分の利益として、さらに上を行こうとすることを戒めているっぽい。//*跂者不立。跨者不行。:背伸びすれば少し高いところを見ることができるが、いつかは我慢がきかなくなって元に戻ってしまう。欲張って大股で歩けばたくさん歩けるようだが、長時間に渡ると疲れが出て足が止まってしまい、結局は普通に歩いたほうが多く進めることになる。/老子的には「つま先歩きはバランスを崩して倒れてしまう。」「跨がれた人が怒って足を掴んでくるから歩けなくなる。」とした方がそれらしい。ここではわかりやすさを取って現代風の解釈とした。*//*自見者不明。自是者不彰。自伐者無功。自矜者不長。:{s:22}に似たフレーズがある。あちらは回り道をして成功する例。こちらは一直線に成功を狙って失敗する例。*//*曰餘食贅行:食べきれなくて余らすほどの食事をするような贅沢とした方が共感はある。/老子的には余ったものを食べ尽くしてしまうこと。{s:54}では、家が徳を修めれば余るとある。ここでの「餘」は道の専門用語っぽいので、裕福な家が背伸びするのを戒めてると考えてみる。/{s:53}では「厭飮食、財貨有餘。」と言って、これを非道としている。*//*物或惡之。故有道者不處。:物の気持ちはわからないので断定はしてないのかな。憎む物もあるかもしれないとか。/裕福な家が出した余りを自分らで食べるのなら悪いことをしているわけではない。しかし、せっかくの余りを世のために使わないのは良くもない。道を考慮するなら念のため避けておくべき。そういう意味での「あるいは」。/{s:31}に同じフレーズがある。*/','2011-10-03 17:29:08'),(25,25,'第二十五章','[有物混成、先天地生。]/寂兮寥兮、獨立而不改、周行而不殆。可以爲天下母。/吾不知其名。字之曰道。/強爲之名曰大。大曰逝、逝曰遠、遠曰反。/故道大、天大、地大、王亦大。域中有四大。而王居其一焉。/人法地、地法天、天法道、道法自然。','(物:もの)(有:あ)り(混成:こんせい)し、(天地:てんち)に(先:さき)んじて(生:しょう)ず。/(寂:じゃく)たり、(寥:りょう)たり、(独立:どくりつ)して(改:かわ)らず、(周行:しゅうこう)して(殆:あや)うからず。(以:もっ)て(天下:てんか)の(母:はは)と(成:な)す(可:べ)し。//[(吾:われ)(其:その)(名:な)を(知:し)らず。これに(字:あざな)して(道:みち)と(曰:い)う。]/(強:し)いて(之:これ)が(名:な)を(爲:な)して(大:だい)と(曰:い)う。/(大:だい)なれば(曰:ここ)に(逝:い)く、(逝:い)けば(曰:ここ)に(遠:とお)く、(遠:とお)ければ(曰:ここ)に(反:かえ)る。/(故:ゆえ)に(道:みち)は(大:だい)、(天:てん)も(大:だい)、(地:ち)も(大:だい)、(王:おう)も(亦:ま)た(大:だい)なり。//(域中:いきちゅう)に(四大:しだい)(有:あ)り。(而:しか)して(王:おう)は(其:その)(一:いち)に(居:お)る。/(人:ひと)は(地:ち)に(法:のっと)り、(地:ち)は(天:てん)に(法:のっと)り、(天:てん)は(道:みち)に(法:のっと)り、(道:みち)は(自然:しぜん)に(法:のっと)る。',NULL,NULL,'天地が生まれるより昔、混沌としたものがあった。/静かでひっそりとしていて、確固として存在して変化せず、激しく動きまわっても壊れることはない。宇宙はこれから生まれたんだろう。//私にはそれを上手に形容することはできないが、「道」とよぶことにする。/道をあえて形容するなら「大」だろうか。/大は行くことであり、行くとは遠くまで行くことであり、遠くまで行ったなら帰ってくる。/だから、道は大きい、天も大きい、地も大きい、そして王も大きい。これらが世界にある四つの大きい存在だ。そして、王はその中の一番格下だ。/だから、人は地に従い、地は天に従い、天は道に従い、道は誰にも従わずとも自分で立っている。',NULL,'道から世界が生まれた話。//*獨立而不改:一つの物体であるが、永遠の命を持って生まれ変わることがない。変化しないといっても表面はガスや液体のように対流しているような気がするし、一つの物体というより法則や仕組みのように思う。*//*周行而不殆:同じ円周上を等速で周っているからぶつかる心配はない。不殆は通常とどまらずと読むが、壊れる心配はないという意味ではあやうからずと同じ。*//*可以爲天下母:天地より先にあったのだから天地を生んだ母となる。しかし、天地の話をしているのに天下とはいかに。*//*大曰逝、逝曰遠、遠曰反。:大ならば行くと考えるより、遠くに行って帰ってくるものを大というのだと/考えた方がなじみやすい。/なぜ帰ってくるのかは「{t:4}」にまとめた。*//*故道大、天大、地大、王亦大。:大地は大きいが、天は地を覆っているのだから、もっと大きい。道はその天地を作ったのだから、もっと大きい。ただ、大きいだけでは前の文とつながらないので、行って帰る動きがなければならない。//太陽は必ず西に沈むが翌朝には東に帰る。星座も季節によって変わるが、翌年にはまた帰ってくる。だから、遠くに行って帰る。/大地は植物を結実させて休んだ後、発芽して帰ってくる。これは{s:16}に見られる。/王は大きな成果を残したあと、平民の下に帰っていくことでさらに偉大になる。これは{s:64}などに見られる。/よって大である。*//*域中有四大、而王居其一焉。:世界で偉大な四者がこれら。王はその基本。*//*人法地、地法天、天法道、道法自然。:地に従うのは王ではなく人。人間に序列はないが自然界にはある。*//この章の文字使いは難解で引っかかるものがある。黙示録ではないが、道の姿を描いたようでいて社会の安定を願った文とも取れる。つまり、周王室の復権である(な、なんだってー!)。/周は寂しくて空っぽだが、独立した王室である。他の家に王朝を取って改わられることはなく、周はどこまで行っても終わらない。だから、安心して国の母とすべし。中華には四つの大国があるが、周王はその中では一番だと。まぁ与太話だね。春秋時代に四つも大国があったっけか?/','2011-10-03 17:29:09'),(26,26,'第二十六章','[重爲輕根、靜爲躁君。]/是以聖人、終日行不離輜重。雖有榮觀、燕處超然。/奈何萬乘之主、而以身輕天下。/輕則失臣、躁則失君。','[(重:じゅう)は(軽:けい)の(根:こん)(爲:た)り、(静:せい)は(躁:そう)の(君:くん)(爲:た)り。]/(是:これ)を(以:もっ)て(聖人:せいじん)は、(終日:しゅうじつ)(行:ゆ)けども(輜重:しちょう)を(離:はな)れず。(栄観:えいかん)(有:あ)りと(雖:いえど)も、(燕処:えんしょ)して(超然:ちょうぜん)たり。/(奈何:いかんぞ)(万乗:ばんじょう)の(主:あるじ)にして、(而:しか)して(身:み)を(以:もっ)て(天下:てんか)より(軽:かろ)んぜん。/(軽:けい)なれば(則:すなわ)ち(臣:しん)を(失:うしな)い、(躁:そう)なれば(則:すなわ)ち(君:くん)を(失:うしな)う。',NULL,NULL,'重いものは軽いものの根本で、静かなものは騒がしいものを押さえている。//だから、聖人は一日中旅をしても油断して馬車を離れない。大成功したとしても冷静でいる。/ましてや、百万の兵を持つ国王がどうして軽々しく振る舞えるか。//軽ければ根本を失い、うわつけば破滅する。',NULL,'リーダーは慎重であれと教える章。結論から言いたいことは想像できるが、所々ちぐはぐで直感的とは言えない。//まず第一フレーズで違和感がある。一が集まって多となるのだから、軽い物が集まって重くなるという流れが自然なのに、重が軽の基本と言う。その後も、なぜ聖人が輜重から離れないか理由がないし、燕處超然とか漠然とした表現でごまかされる。人によって解釈が揺れそうだ。//軽重の良し悪しは論語にもあって、あちらでも軽さをやめ、重くあれと言っている。//*重爲輕根:老子特有の逆転の発想で冒頭からびっくりさせる戦術以外に思いつかない。*//*靜爲躁君:そわそわした連中を統括して静かにさせることができるのがリーダー。だから、静は躁に勝る。/{s:45}には「靜勝熱」とあるが、関連は薄いように思う。*//*終日行不離輜重:輜重と軽重がダジャレのように引っかかってる。こういう遊び心は老子に多い。軽率と慎重から心を離すことがないとも取れる。通常、輜重隊というのは一番安全な中軍から後軍のあたりにいると思われるが、そこから離れないのが慎重。/行軍つながりで言えば、輜重は食糧確保の暗喩だろう。次の句の「榮觀」が出世なら、一日かけた盛大な軍事パレードを見ても常に農民の生活から心を離すなということだ。*//*雖有榮觀、燕處超然:出世しても平然と変りないこと。/王が行軍するときは、仮に前線の兵たちが眼前の絶景にざわめいたとしても、軽率に眺めに行かないこと。*//*而以身輕天下:軽率に動くとはどういうことかを自分自身で天下に知らしめることか。景色を眺めに行って流矢に当たって死んだ話とか、あってもおかしくはない。*//*輕則失臣、躁則失君:そのまま読めば、「王が軽率なら戦争に負けて臣下を死なせてしまい、家臣が粗忽なら王を横死させる。」くらいか。/まぁここは君臣の違いを意識する必要はない。*/','2011-10-03 17:29:14'),(27,27,'第二十七章','[善行無轍迹。善言無瑕謫。]善數不用籌策。/善閉無關鍵、而不可開。善結無繩約、而不可解。/是以聖人、常善救人、故無棄人。常善救物、故無棄物。是謂襲明。/故善人者、不善人之師、不善人者、善人之資。/不貴其師、不愛其資、雖智大迷。是謂要妙。','(善:よ)く(行:い)く(者:もの)は(轍迹:てっせき)(無:な)し。(善:よ)く(言:い)う(者:もの)は(瑕謫:かたく)(無:な)し。(善:よ)く(数:かぞ)える(者:もの)は(籌策:ちゅうさく)を(用:もち)いず。(善:よ)く(閉:と)ざす(者:もの)は(關鍵:かんけん)(無:な)くしても(開:ひら)く(可:べ)からず。(善:よ)く(結:むす)ぶ(者:もの)は(繩約:じょうやく)(無:な)くしても(解:と)く(可:べ)からず。/(是:これ)を(以:もっ)て(聖人:せいじん)は、(常:つね)に(善:よ)く(人:ひと)を(救:すく)うが(故:ゆえ)に(人:ひと)を(棄:す)つること(無:な)し。(常:つね)に(善:よ)く(物:もの)を(救:すく)うが(故:ゆえ)に(物:もの)を(棄:す)つること(無:な)し。(是:これ)を(襲明:しゅうめい)と(謂:い)う。/(故:ゆえ)に[(善人:ぜんにん)の(者:もの)は(不善人:ふぜんにん)の(師:し)。(不善人:ふぜんにん)の(者:もの)は(善人:ぜんにん)の(資:し)。]/(其:そ)の(師:し)を(貴:とおと)ばず、(其:そ)の(資:し)を(愛:あい)さざれば、(智:ち)ありと(雖:いえど)も(大:おお)いに(迷:まよ)う。(是:これ)を(要妙:ようみょう)と(謂:い)う。',NULL,NULL,'善良な通行人は道を傷めないで走行する。慎重に言葉を選ぶ人はあやふやな言葉で嘘やデマを生まない。計算の達人はソロバンに頼らずとも暗算できる。防犯の達人は鍵に頼らないでも開けられないような巧妙な戸締りをする。うまく結ぶ人は縄を縛らないのにほどけない。//このように、聖人は人を上手に助けるから、人を失敗させない。余計な物は使わないから捨てる物が少ない。これを明るい知識を受け継ぐという。//だから、善人は悪人の手本であり、悪人も善人になる見込みがある。/善人の良さを尊敬せず、悪人の未熟さを愛さなければ、知恵があっても道に迷うだろう。これが本質の要だ。',NULL,'善悪の対立を聖人がどう対処するかを書いた章。//善人と悪人が善悪で別れて喧嘩するのではなく、お互いに足りない部分を補い合いなさいという話だと考えていい。/善人は悪人を嫌って善人とばかり付き合うから、悪人の行動パターンがわからない。だから、悪人に裏をかかれる。/善人は悪人を拒絶するより、受け入れて観察した方が防犯スキルは高まる。同時に、悪人が善人になるチャンスも発生するなら、なお良いこと。/物は使いようなのであきらめちゃダメ。捨てる前に考えよう。//*善行無轍迹:わだちを作って道を破壊しない。達人ともなれば荷車を使わないで移動することすらある。道具を必要としないんだから捨てる物がないのは当然。/*//*善言無瑕謫:語弊のある言い方はしないと考えてもいいが、それがどうして人を救うのやら。勘違いを生むような、あやふやな発言はしないということか。*//*善數不用籌策:計算を楽にする棒。/ソロバンとしたが、{l:策}は木の札だから、聖徳太子が手に持ってるアレみたいに墨でメモするようなものだと思っている。これをカンペとしているか、筆算の下書きにしているんだろう。計算のたびに削りカスがでないのだから、捨てるものがなくなる。/ここまでは善人の良い部分。*//*善閉無關鍵、而不可開。:悪人の行動を観察して、物に頼らない戸締りをする。盗みに入らなければ犯罪者もでないから、人を棄てない。/ここからは悪人を棄てない部分。*//*善結無繩約、而不可解。:犯罪者が出たとしても、脱走防止に縄で縛りあげたりしない。しかも、それで逃げられることがないから罪が重なって追放や死刑もない。*//*不貴其師、不愛其資:長所を見習い、短所は許容しながら克服を待つ。*//*雖智大迷。是謂要妙。:短所を欠点と切り捨てればうまくいかない。欠点のない人はなかなかいないのだから。*//一般人はこのようにストレートに読んでもいいが、道を意識して読むとさらに深みがある。そうであれば{s:62}とセットで読むか。/聖人とは善人と悪人を区別しないで橋渡しをする人なんである。//*善行無轍迹:「無為にして為すとすることなし」的な「悟られずに助ける」意味。{s:62}と対応させるなら美行と同じだろう。*//*善言無瑕謫:{s:62}にある「美言」と同じっぽい。言葉には表と裏があるから裏に取られないためにもしゃべるなというのが老子の考えだが。/「轍迹なし」つまり「無為」だから裏の言葉がないのかな。実は不言の教えのことなのかも。*//*善數不用籌策:「善人には打算がない」の意味か。*//*善閉無關鍵、而不可開。:かんぬき無しで閉じられるのは口。目も閉じれるか。*//*善結無繩約、而不可解。:無為・不言・無事・不見などで人を強い絆で結ぶ。*//*不貴其師、不愛其資:{s:62}では善人は優しい言葉をかけるかわりに尊敬をもらってもよいと言ってるようだ。*/','2011-10-03 17:29:17'),(28,28,'第二十八章','[知其雄、守其雌、爲天下谿。]爲天下谿、常徳不離、復歸於嬰兒。/知其白、守其黒、爲天下式。爲天下式、常徳不忒、復歸於無極。/知其榮、守其辱、爲天下谷。爲天下谷、常徳乃足、復歸於樸。/樸散、則爲器。聖人用之、則爲官長。故大制不割。','(其:そ)の(雄:ゆう)を(知:し)りて、(其:そ)の(雌:し)を(守:まも)れば、(天下:てんか)の(谿:けい)と(為:な)る。(天下:てんか)の(谿:けい)と(為:な)れば、(常:つね)の(徳:とく)は(離:はな)れず、(嬰児:えいじ)に(復帰:ふっき)す。/(其:そ)の(白:しろ)を(知:し)りて、(其:そ)の(黒:くろ)を(守:まも)れば、(天下:てんか)の(式:しき)と(為:な)る。(天下:てんか)の(式:しき)と(為:な)れば、(常:つね)の(徳:とく)は(忒:たが)わず、(無極:むきょく)に(復帰:ふっき)す。/(其:そ)の(栄:えい)を(知:し)りて、(其:そ)の(辱:じょく)を(守:まも)れば、(天下:てんか)の(谷:たに)と(為:な)る。(天下:てんか)の(谷:たに)と(為:な)れば、(常:つね)の(徳:とく)は(乃:すなわ)ち(足:た)り、(樸:ぼく)に(復帰:ふっき)す。/[(樸:ぼく)は(散:さん)ずれば、(則:すなわ)ち(器:うつわ)と(爲:な)す。](聖人:せいじん)は(之:これ)を(用:もち)いて、(則:すなわ)ち(官:かん)の(長:ちょう)と(爲:な)す。[(故:ゆえ)に(大制:たいせい)して(割:さ)かず。]',NULL,NULL,'男らしさを知り、女らしさを守れば、天下の谷となる。天下の谷となれば、徳が離れることはなく、赤子に還る。/正義を理解しながらも悪の言い分も聞いてやれば、天下の手本となる。天下の手本となれば、徳が干渉することなく、中立な状態に還る。/出世の意味を知りながら低い身分に留まることで、天下の谷となる。天下の谷となれば、徳はいつも満ち足りて丸太のような純朴な存在になっていく。//丸太を割ると道具ができる。聖人はそれを起用する。つまり、純朴で役割を得た人を役人の上役にする。だから、丸太を大きく枝打ちするのはいいが、割かない方がいい。',NULL,'聖人までの成長過程と人の起用方法について書いた章。//この章を読む限りでは人の成長には三段階ある。/第一段階はじゅうぶんに強くなること。{s:55}のように手のかかる赤ちゃんのごとく世話をしてもらって強くなる。じゅうぶんに強くなるまでは赤子であることを忘れないで受け身でいる。/そうやって強くなれば第二段階。強い者が弱い者の気持ちを理解して弱者を基準にする。これで強弱どちらも敵に回らず{s:59}のように極端がなくなって国のトップとなれる。/その栄誉があってなお低い身分でいる。{s:34}の道のような生き方ができれば樸となって完成する。//起用するなら樸を使う。酸いも甘いも噛み分けて、欲を無くした人のことである。正しいことを学び続ければ幸せになれると信じてる人らには決して任せない。/最後まで樸であった人が聖人であり、国の創始者なのだろう。//*知其雄、守其雌、爲天下谿。:男らしさのシンボルといえば股間の突起物。女の証とは谷間ですな。山と山の間に谷ができる。この谷の底には必ず水が流れているもので、老子は谷を大切な器と見ていたわけだ。この溜まった水がおそらく徳なんだろう。この発想は{s:67}にも見られる。なお、ここでは女の谷間だけが素晴らしいとは言っていない。男の都合はわきまえていて、なおかつ女らしいのが良いと。*//*知其白、守其黒、爲天下式。:じゅうぶんな正義を実践しながらも、悪の立場から弁明してやれば、社会のバランスが取れて極端な格差がなくなるって話だね。白黒は経済的な強弱や性格的な明暗でも違和感なく置き換えられる。*//*知其榮、守其辱、爲天下谷。:水のように低いところに流れていけば純朴な人になれる。これが道に近い生き方で、徳が足りて玄徳に達したことになる。*//*樸散、則爲器。:丸太を切り分ければ様々な道具を生み出すことができる。道具となれば「名」ができる。同様に純朴な人を切り分ければ人材となる。人材となれば「役割」ができる。*//*聖人用之、則爲官長。:役割を持った人を起用する。私欲に走らない純朴な人なら役人が最適。*//*故大制不割:余分な枝を打ち払うのはいいが、切り分けてはいけない。役割があるというのは得手不得手があるがゆえに適職が決まってしまうということ。*/','2011-10-03 17:29:29'),(29,29,'第二十九章','[將欲取天下而爲之、吾見其不得已。]/天下神器。不可爲也。爲者敗之、執者失之。/故物或行或隨、或呴或吹、或強或羸、或培或隳。/是以聖人、去甚、去奢、去泰。','(将:まさ)に(天下:てんか)を(取:と)らんと(欲:ほっ)して(之:これ)を(爲:な)せば、(吾:われ)(其:その)(得:え)ざるを(見:み)る(已:のみ)。/[(天下:てんか)は(神器:じんぎ)なり。(爲:な)す(可:べ)からず。](爲:な)す(者:もの)は(之:これ)を(敗:やぶ)り、(執:と)る(者:もの)は(之:これ)を(失:うしな)う。/(故:ゆえ)に(物:もの)(或:ある)いは(行:ゆ)き(或:ある)いは(随:したが)い、(或:ある)いは(呴:く)し(或:ある)いは(吹:ふ)き、(或:ある)いは(強:つよ)く(或:ある)いは(羸:よわ)く、(或:ある)いは(培:つちか)い(或:ある)いは(隳:おと)す。/(是:これ)を(以:もっ)て(聖人:せいじん)は、(甚:じん)を(去:さ)り、(奢:しゃ)を(去:さ)り、(泰:たい)を(去:さ)る。',NULL,NULL,'いよいよ天下を取ろうとして「何とかしてやろう」とする者がいるが、私にはそれが失敗するのが見える。//天下は神の器だから、「何とかしてやろう」としてはいけない。やってやろうと気持ちを強くするほど反発されて敗けてしまう。たとえそれで取れたとしても思いどおりに操ろうとして失ってしまう。/それはこういうことだ。ある者が率先すれば、他方が率いられる側になる。片方がハァーと息をかけて温めれば、もう一方がフーっと息を吹きつけて冷ます。強化するものがあれば、弱体化するものがある。養うものがあれば、壊すものもいる。//だから、聖人は派手なことはせず、強気にならず、強い気持ちを避けるのだ。',NULL,'政治力学を書いた章。//社会はいろんな人がいて成り立っている。自分の能力や価値観を基準にしてしまうと、そこから外れた人が敵に回ってしまって制御不能となる。//天下取りを目指すときは前に出ない。出世や強さは相対的なものだから、誰かが上に行けば他の誰かが下になってしまう。/気持ちが強い人ほど他人を叩きつけるがごとく下落させてしまう。それで恨みを買って引き倒されてしまう。これは何も日本だけのことでもあるまい。//一方、思い通りに天下を取れた者は「自分なら天下を思い通りに操れる」と勘違いして上から命令してしまう。すると王の価値観に合わない者が離反してしまう。//だから、聖人は前に出ようとしないし、支配もしない。//とはいえ、ここでは「それで天下は取れるのだ」なんて言ってはいない。逆を行っても取れる保障はないからこそ、天下は神器なのだね。//*爲者敗之、執者失之。:{s:64}に同じフレーズがある。*//*或行或隨:主従関係。引っ張っていくのが好きな人もいれば大人しく着いていくのが良い人もいる。*//*或呴或吹:弱く息を吐く者と強く息を吐く者。息の力は心や体の強さとリンクしている。*//*或強或羸:将来性。若さで成長著しい者と加齢で衰えていく者。*//*或培或隳:面倒見が良く育てる者と突き放してダメにしてしまう者。*//*去甚、去奢、去泰。:自分を強く出さない。*/','2011-10-03 17:29:33'),(30,30,'第三十章','[以道佐人主者、不以兵強天下。]/其事好還、師之所處、刑蕀生焉。大軍之後、必有凶年。/善者果而已。不敢以取強。/果而勿矜。果而勿伐。果而勿驕。果而不得已、果而勿強。/物壮則老。是謂不道、不道早已。','(道:みち)を(以:もっ)て(人主:じんしゅ)を(佐:たす)くる(者:もの)は、(兵:へい)を(以:もっ)て(天下:てんか)に(強:し)いず。/(其:そ)の(事:こと)は(還:かえ)るを(好:この)む。(師:し)の(処:お)る(所:ところ)、(刑蕀:けいきょく)(焉:ここ)に(生:しょう)じる。(大軍:たいぐん)の(後:あと)は(必:かなら)ず(凶年:きょうねん)(有:あ)り。/[(善者:ぜんしゃ)は(果:はた)す(已:のみ)。(以:もっ)て(敢:あ)えて(強:し)いるを(取:と)らず。](果:はた)して(矜:ほこ)ること(勿:な)かれ。(果:はた)して(伐:ほこ)ること(勿:な)かれ。(果:はた)して(驕:おご)ること(勿:な)かれ。(果:はた)して(已:やむ)を(得:え)ずとし、(果:はた)して(強:し)いること(勿:な)かれ。/(物:もの)は(壮:さか)んなれば(則:すなわ)ち(老:お)ゆ。(是:これ)を(不道:ふどう)と(謂:い)う。(不道:ふどう)は(早:はや)く(已:やむ)。',NULL,NULL,'道に従って主人を補佐する者は軍事力にモノを言わせた天下取りを指南しない。/そういう行為は必ず自分に返ってくる。軍隊の駐屯地にはいばらが生え、大軍で戦争を敢行すれば、必ず凶作となる。//正しい補佐官は目的を果たすだけでよいとして、無理強いしてそれ以上を収奪しない。/戦果を上げたことを武勇伝としてはいけない。戦果を上げても手柄としてはいけない。戦果を上げても傲慢になってはいけない。戦果を上げても仕方なかったとして、理不尽な振る舞いをしてはいけない。//強く活動するものはすぐに弱くなる。これを不道といって、不道でいると早く衰える。',NULL,'補佐官の心得。武力に頼って戦争で領地を奪うことを戒めている。//道を行く者は何物にもならないんだから補佐官の心得などいらないはずだが?道で補佐したい人のために敢えて用意したのだろうか。//要所は「果而勿矜、果而勿伐、果而勿驕、果而不得已、果而勿強。」の部分で、「勿」という字を使って明確に禁止しているのはこの章だけ。/補佐官が王をたぶらかして戦争をおこすことはあってはいけない。ましてや、それを手柄として出世するようなことなど、道者としてあるまじきことだ。//武力による補佐は国を早く弱らせる。それで出世しても調子に乗れば妬まれて失脚する。//*人主:主人としたが、万民の主たる王のことだろう。*//*師之所處、刑蕀生焉。:軍隊が駐屯していると農作業ができないから、やがては荒れ地でも育ついばらのような不毛な植物だけが生えてくる。刑蕀をいばらとしたが、蕀という植物はなく、どんな植物かわからない。いばらは「棘」なので。刑の意味も不明。荊でもわからん。*//*大軍之後、必有凶年。:戦争があると農民が兵役にとられるだけでなく、怪我をして農業に支障が出る。凶作になるのは当然。*//*善者果而已:「善者は果たして止む」として「結果が出たらすぐに止めるのだ」しまうと不道と同じになるのでおかしい。限定の意味で「のみ」とした。*//*不敢以取強:敢えて強いないなら、その気になれば蹂躙できる力を持っているのか。*//*物壮則老。是謂不道、不道早已。:{s:55}に同じフレーズがある。あちらは生じる者の力を説き、こちらは強い者の脆さを説いている。*/','2011-10-03 17:29:35'),(31,31,'第三十一章','[夫兵者不祥之器。物或惡之。]故有道者不處。/君子居則貴左、用兵則貴右。/兵者不祥之器、非君子之器。不得已而用之、恬淡爲上。/勝而不美。而美之者、是樂殺人。夫樂殺人者、則不可以得志於天下矣。/吉事尚左、凶事尚右。偏將軍居左、上將軍居右、言以喪禮處之。/殺人之衆、以哀悲泣之、戦勝以喪禮處之。','(夫:そ)れ(兵:へい)の(者:もの)は(不祥:ふしょう)の(器:うつわ)。(物:もの)(或:ある)いは(之:これ)を(悪:にく)む。(故:ゆえ)に(有道:ゆうどう)の(者:もの)は(処:お)らず。/(君子:くんし)(居:お)らば(則:すなわ)ち(左:ひだり)を(貴:とおと)び、(兵:へい)を(用:もち)うれば(則:すなわ)ち(右:みぎ)を(貴:とおと)ぶ。/[(兵:へい)の(者:もの)は(不祥:ふしょう)の(器:うつわ)にして、(君子:くんし)の(器:うつわ)に(非:あら)ず。](已:や)むを(得:え)ずして(之:これ)を(用:もち)うるなれば、(恬淡:ていたん)を(上:じょう)と(為:な)すべし。/(勝:か)ちても(美:び)ならず。(而:しか)るに(之:これ)を(美:び)とする(者:もの)は、(是:これ)(人:ひと)を(殺:ころ)すを(楽:たの)しむなり。(夫:そ)れ(人:ひと)を(殺:ころ)すを(楽:たの)しむ(者:もの)は、(即:すなわ)ち(以:もっ)て(志:こころざし)を(天下:てんか)に(得:う)る(可:べ)べからず。/(吉事:きちじ)は(左:ひだり)を(尚:たっと)び、(凶事:きょうじ)は(右:みぎ)を(尚:たっと)ぶ。(偏将軍:へんしょうぐん)は(左:ひだり)に(居:お)り、(上将軍:じょうしょうぐん)は(右:みぎ)に(居:お)る。(喪礼:もれい)を(以:もっ)て(之:これ)に(処:お)るを(言:い)うなり。/(人:ひと)を(殺:ころ)すこと(之:の)(衆:おお)きには、(悲哀:ひあい)を(以:もっ)て(之:これ)を(泣:な)き、(戦:たたか)い(勝:か)つに(喪礼:もれい)を(以:もっ)て(之:これ)に(処:お)る。',NULL,NULL,'軍隊は不吉な道具だ。物はこれを嫌うかもしれない。だから、道を修めた者はそういう場所にいない。/補佐官は左側を上座とするが、将軍は右側を上座とするのがならわしだ。//軍隊は災いの組織であって、補佐官のための組織ではないので、やむを得ずこれを使うなら、最低限にあっさりと使うのがよい。/勝ったとしても誇らしくはない。これを誇れば殺人を楽しんだことになる。こういう連中は人の上に立ってはいけない。//祝賀の祭りでは左が上座で、葬式などの催事には右が上座となる。戦争では、副将軍が左の下座に着き、主将軍が右の上座に着くのだから、葬式の作法と同じ着席の仕方だ。だから、戦争の時は喪に服すときと同じ姿勢で取り仕切るのが良い。/特にたくさんの犠牲者がでるような戦いでは、勝ったとしても、嘆き悲しみ涙をもって終わりの儀式とする。',NULL,'礼を尊ぶ儒教を批判する老子が礼を題材にした話。礼はなじみが薄いのですぐにはぴんとこないかも。日本の官職でも左が上位で右が下位だし、右翼が攻撃的で左翼が平和的な言葉として一般にも知られているからわからないわけではないけれど。//礼では人が集まるときの席順が非常に重要な意味を持つ。当時の礼では政治家は王の左手に並び、軍人は右手にならんだ。それで政治家は左を上座としたのだろう。逆に将軍は右が上座だった。その礼にならうと、葬式が右を上座とするのだから、同じく右を上座とする軍隊を使うときのマナーは不幸のときと同じでなければならない。葬式があることを喜ぶのはおかしい。死んだとしても最善を尽くして仕方なくといった話でなければ無慈悲だ。乱暴に命を扱う人が天下取りをめざしちゃいけない。//「やむを得ない状況なら軍隊を使ってよい。」それが老子の考え方のようだ。ただし、最小限にとどめるのが条件。大きな災いを避けるためなら小さな災いを否定しない。また、大きな戦争が避けられないときは悲しむものが勝つとも言っている。/それが本当かどうかはわからんが、そうであって欲しいとは思う。//*物或惡之:老子には物或という表現は何度か登場するが、しっくりくる解釈がない。一般では「物つねに」と読むらしいが、或という字にそういう意味はない。「常に」は必ずという絶対的な意味になるが、「或いは」だと絶対ではなく他の答えがあるかもしれないという意味になり正反対だ。納得できてないので、今のところ「物の中には兵を好む物もあるが、嫌う物もあるかもしれない。万物すべての気持ちを知ることはできないから、嫌う物の方が多いとしておいたほうがよい」としている。武器自身は戦いを好むはんだから間違いはなさそうだ。*//*殺人之衆:人殺しの衆として、「殺しあいをしなければならない兵たち」を悲しむとしたほうが良いか?*/','2011-10-03 17:29:38'),(32,32,'第三十二章','[道常無名。樸雖小、天下不敢臣。]/侯王若能守之、萬物將自賓。/天地相合、以降甘露、民莫之令而自均。/始制有名。名亦既有、夫亦將知止。/知止所以不殆。譬道之在天下、猶川谷之與江海。','(道:みち)は(常:つね)に(無名:むめい)。[(樸:ぼく)(小:しょう)なりと(雖:いえど)も、(天下:てんか)(敢:あ)えて(臣:しん)とせず。]/(侯王:こうおう)(若:も)し(能:よ)く(之:これ)を(守:まも)れば、(万物:ばんぶつ)(将:まさ)に(自:おのず)から(賓:ひん)せんとす。/(天地:てんち)は(相:あ)い(合:がっ)して、(以:もっ)て(甘露:かんろ)を(降:くだ)し、(民:たみ)は(之:これ)に(令:れい)すること(莫:な)くして(自:おのず)から(均:ひと)し。/(始:はじ)めて(制:せい)して(名:な)(有:あ)り。(名:な)も(亦:また)(既:すで)に(有:あ)れば、(夫:そ)れ(亦:また)(将:まさ)に(止:いた)るを(知:し)らんとす。/(止:いた)るを(知:し)るは(殆:とど)まらざる(所以:ゆえん)なり。(譬:たと)えば(道:みち)の(天下:てんか)に(在:あ)るは、(猶:なお)(川谷:せんこく)の(江海:こうかい)に(与:くみ)するがごとし。',NULL,NULL,'道は目に見えないので名前を残さない。取るに足りない存在だから誰もが慕うが、それを独り占めしようとはしない。//支配者がそこを心得れば、すべてのものが価値ある存在になるだろう。/天と地が協力して恵みの雨を降らせ、庶民は何も命令せずとも自分から分け合って平等になる。//木材は加工が始まると名前が付く。すでに似たような加工品があれば、もっと利便な存在になろうと改善が始まり、際限なく競争が続く。//ほどほどで止めることを知っていることは危険がないことである。道で天下を治めることは、たとえるなら、水が川となって合流して海に注いでいくようなものだ。',NULL,'樸の扱いが難しい章。複数の意味で読めるのでさらに難しい。{s:37}と合わせて読む。//樸を{s:37}に出てくる「無名之樸」と同じように「無名樸」として、「道はつねに無名の樸」する解釈もあるが、樸は無欲な人の姿なので道が樸なのはおかしい。{s:37}の出だしが「道常無為」となっているので「道常無名。」としたほうが安心感がある。よって、ここでは「樸雖小」とした。//となると今度は「小」の解釈が難しくなる。「いえども」のつながりが悪くなるからだ。これを{s:34}でいう「小」として乗り切ることにした。/つまり最初の一文は「樸として無欲であれば小となる。そうすれば天下万物が慕って帰属してくるが、これを臣としなければ大である。これが道の者の行いが無名な理由である」としたわけだ。//「始制有名」のくだりも難解。宗教っぽく解釈するなら、人の苦しみはわずかな違いから生じる区別だという話か。人より役に立つことをアピールするために差別化を図るうちに自分がわからなくなる。//結論で川が海に従うたとえを出しているのは、低くて小さい者が大というわけだ。//*侯王若能守之、萬物將自賓。:諸侯に樸であれと戒めている。他人と比べなくなれば劣等感から解放されて自分に自信を持てるようになる…というのは宗教っぽいか?*//*始制有名。名亦既有、夫亦將知止。:制するとは、樸でいえば枝を払って材木として使えるようにすること。手を加えるほど道具に近づいていき名前がつく。同じ名前の道具があれば、より手を加えて新製品を生み出す。この作用はキリがない。{s:28}でも何者かになりたくて散じてしまった者から「使われの身」にされてしまうとある。//裏の意味では制覇して名前が上がること。天下は俺のものだと宣言することで所有が始まる。既に所有者がいるなら争いが終わることはないだろう。王を名乗る者が現れれば、続々と王が出る。それで民は誰に従えばいいのか、わからなくなる。*//*知止所以不殆:止を「やめる」として、ほどほどで止めるとしてもいいが、人のあるべき理想の姿に至る場所を知ることとした方が後の文とのつながりが良い。{s:44}では「知止不殆」とあるが、こちらは「やめる」だろう。*//*譬道之在天下、猶川谷之與江海。:理想的な止まる場所を海にたとえている。低いところへと流れ、やがては大海と同一になる。人は小さく低くなることで大海となる。*/','2011-10-03 17:29:43'),(33,33,'第三十三章','[知人者智。自知者明。]/勝人者有力。自勝者強。/知足者富。強行者有志。/不失其所者久。死而不亡者壽。','(人:ひと)を(知:し)る(者:もの)は(智:ち)なり。[(自:みずか)らを(知:し)る(者:もの)は(明:めい)なり。]/(人:ひと)に(勝:か)つ(者:もの)は(力:ちから)(有:あ)り。(自:みずか)ら(勝:か)つ(者:もの)は(強:つよ)し。/(足:た)るを(知:し)る(者:もの)は(富:と)む。(強:つと)めて(行:おこな)う(者:もの)は(志:こころざし)(有:あ)り。/(其:そ)の(所:ところ)を(失:うしな)わざる(者:もの)は(久:ひさ)し。(死:し)して(而:しかし)も(亡:ほろ)びざる(者:もの)は(寿:ひさ)し。',NULL,NULL,'人をしっかり観察できる人は知恵がある。自分をしっかり観察できる人は覚醒した知恵がある。/力がある者は人に勝つが、自分に勝つ者こそが強者だ。//ほどほどの満足を知っていれば豊かに暮らせる。そこを真剣に実践できれば志が生まれる。/その志を失わないものは長生きし、死んでも滅びないほどの存在になるだろう。',NULL,'前半だけ見ればトップアスリートの世界だが、後半を読むと「ほどほど」の大切さを訴える章のようだ。//人を観察して対策を練って戦えば勝つ。これができる人は有能ではあるが、競争に勝って喜んでいるようでは、まだまだだ。前人未到の頂点に達してしまえば競争相手がいなくなってしまう。そこから伸びるには自分と闘うよりない。絶対的な王者に寄ってくる誘惑を断ち切り、あれこれ求めないことが己に勝つことだ。//己に勝てば戦う必要はなくなる。現状に満足できれば後は自分との勝負だ。これをがんばるのが志だ。//*知足者富:ここまで、凡、明。凡、明。と来てるのに、明の句。しかも、次の句が凡っぽいので初見では明、凡。明らかに違和感があるところ。*//*強行者有志:有志なんて老子は嫌いそうだが、ここでは好意に解釈していいらしい。ましてや強いて行うようでは続かないはずだが。志を持って強行すべきことはこれだと強調したかったのだろうか。今のところそう解釈するよりない。*//*死而不亡者壽:死んでも滅びないなんて老子らしくないが、子を産んで世代交代することには肯定的だし、{s:54}のように先祖を祀ることにも積極的だから、名前が継がれるという意味での不滅だろう。*/','2011-10-03 17:29:45'),(34,34,'第三十四章','[大道氾兮、其可左右。]/萬物恃之而生而不辭。功成不名有。愛養萬物而不爲主。/常無欲、可名於小。萬物歸之而不爲主、可名爲大。/是以聖人、終不自大、故能成其大。','(大道:たいどう)は(氾:はん)として、(其:そ)れ(左右:さゆう)す(可:べ)し。/(万物:ばんぶつ)(之:これ)を(恃:たの)みて(生:しょう)ずれども(辞:ことば)せず。(功:こう)(成:な)りて(名:な)(有:あ)りとせず。(万物:ばんぶつ)を(愛養:あいよう)すれども(主:あるじ)と(為:な)さず。/(常:つね)に(無欲:むよく)なれば、(小:しょう)と(名:な)づく(可:べ)し。(万物:ばんぶつ)(之:これ)に(帰:き)すれども(主:あるじ)と(為:な)さざれば、(名:な)づけて(大:だい)と(為:な)す(可:べ)し。/(是:これ)を(以:もっ)て(聖人:せいじん)は、(終:つい)に[(自:みずか)ら(大:だい)とせざるが(故:ゆえ)に(能:よ)く(其:そ)の(大:だい)を(成:な)す。]',NULL,NULL,'大いなる道はこぼれ溢れて右へ左へと拡がっていく。/すべての物は道を頼りにして命を得、育んでもらうが、何もいわないので、成果が結実しても助けに気づかない。それでいて、あらゆる物を愛して育て、支配しようとはしない。//このように常に無欲であれば小と呼んでよい。すべての物が小に帰順するが、それでもなお支配しようとしなければ大と呼んでよい。//だから、聖人は最後まで大きくならない。よって何よりも大きくなるのである。',NULL,'道の見返りを求めぬ愛を実践した聖人の話。//土にたとえるとわかりやすいのかな。植物は土から生まれて実を残すが、枯れて土に還るって感じ。//道を聖人の生き方と交差させる大切な章なので、テーマを見ながら読まないとわかりにくいかも。先入観に気を付けて合わせて読むのがいいか。//*大道氾兮、其可左右。:道には氾濫した川のような勢いがあるのかな。*//*萬物恃之而生而不辭。功成不名有。:{s:38}でいう無為にして為すとすることなし。誰にも気付かれないようにサポートする。*//*愛養萬物而不爲主。:道の作用は強くなったら弱いところへ返っていく。立派になったら立派さを減らしていく。だから、主にはならない。*//*常無欲、可名於小。:無欲とは先ほどの「萬物恃之而生而不辭。功成不名有。」のこと。これができる者を「小」と名付けた。{s:32}では、道のように無名の小さな樸となった者が天下を臣としないことで社会は安定するとある。*//*萬物歸之而不爲主、可名爲大。:先ほどの「愛養萬物而不爲主」のこと。面倒をみてやれば慕ってついてくるが、支配しないでいられる者を「大」と名付けた。*//*終不自大、故能成其大。:{s:63}に「終不爲大。故能成其大。」とある。*/','2011-10-03 17:29:47'),(35,35,'第三十五章','[執大象、天下往、往而不害、安平大。]/樂與餌、過客止。/道之出言、淡乎其無味。/視之不足見、聽之不足聞、用之不可既。','(大象:たいしょう)を(執:と)りて、(天下:てんか)を(往:ゆ)けば、(往:ゆ)きても(害:がい)あらず。(安:あん)、(平:へい)、(大:たい)なり。/(楽:がく)と(餌:じ)とは(過客:かきゃく)も(止:とど)まる。/[(道:みち)の(言:げん)に(出:い)だすは、(淡乎:たんこ)として(其:そ)れ(味:あじ)わい(無:な)し。]/(之:これ)を(視:み)るも(見:み)るに(足:た)らず、これを(聴:き)くも(聞:き)くに(足:た)らず。これを(用:もち)うるも(既:つく)す(可:べ)からず。',NULL,NULL,'世界を飛び回るとき、大きな視点を持っていれば、そうそう危険はないだろう。/音楽や見世物、ご馳走を前にすると通り過ぎようとしている旅人すら足を止めてしまう。//道をあえて言葉にするとしたならば、びっくりするほど淡白で味気ない。/見ても見た気にならず、聞いても聞き足りない。しかし、役に立つことに際限はない。',NULL,'刺激への対応。//そもそも、{s:47}では「外に出ないで知る」とあるんだから、出る必要もないんだが。どうしても出なければならない人への心構えだろうか。//刺激的な誘惑は道とは対極にある。行くあてのある旅人すら滞在してまう。しかし、はじめから覚悟があれば誘惑をかわせる。//*執大象:大きな象を引き連れて旅すれば安心…ではあるまい。しかし、そう読まれることを考えて書いてるだろう。ここをどう解釈するかで序盤の展開は変わってきそうだ。/{s:41}に「大象無形」とある。*//*安平大:安心・平坦・太平くらいか。*//*淡乎其無味:{s:63}では、道を行く聖人は味気ない毎日を過ごすから偉大な成果を成し遂げると言っている。*//*視之不足見:{s:14}には「視之不見、名曰夷。」とあるが、この章との関連性は薄い。*//*聽之不足聞:{s:14}には「聽之不聞、名曰希。」とあるが、この章との関連性は薄い。*//*用之不可既:{s:6}には「用之不勤」とある。{s:34}では「大道氾兮」とあるので、あふれてくるのだろう。道の教えは何にでも応用できるし、いくら使っても減らないのだから、誘惑に負けそうになったら何度でも反芻すればいいといったところか。*/','2011-10-03 17:29:49'),(36,36,'第三十六章','[將欲歙之、必固張之。]將欲弱之、必固強之。/將欲廢之、必固興之。將欲奪之、必固與之。/是謂微明。柔弱勝剛強。/魚不可脱於淵、國之利器、不可以示人。','(将:まさ)に(之:これ)を(歙:ちぢ)めんと(欲:ほっ)すれば、(必:かなら)ず(固:しばら)く(之:これ)を(張:は)れ。(将:まさ)に(之:これ)を(弱:よわ)くせんと(欲:ほっ)すれば、(必:かなら)ず(固:しばら)く(之:これ)を(強:つよ)くせよ。(将:まさ)に(之:これ)を(廃:はい)せんと(欲:ほっ)すれば、(必:かなら)ず(固:しばら)く(之:これ)を(興:おこ)せ。(将:まさ)に(之:これ)を(奪:うば)わんと(欲:ほっ)すれば、(必:かなら)ず(固:しばら)く(之:これ)を(与:あた)えよ。/(是:これ)を(微明:びめい)と(謂:い)う。[(柔弱:じゅうじゃく)は(剛強:ごうきょう)に(勝:か)つ。]/(魚:さかな)は(淵:ふち)より(脱:だっ)す(可:べ)からず、(国:くに)の(利器:りき)は(以:もっ)て(人:ひと)に(示:しめ)す(可:べ)からず。',NULL,NULL,'萎縮させようとするなら増長させるがいい。弱めるなら強めるがいい。壊したいなら作らせ、奪いたいなら与えよ。//これを微明という。柔らかいものは堅いものに勝つ。/魚が池の底に潜むように、奥の手は見せないことだ。',NULL,'柔よく剛を制す。北風と太陽。押してだめなら引いてみよ。勝てそうもない相手は意外な手で倒す。//ちょっと老子らしくない意外な章だが、この章の意外性が老子を軽く見る人のハートを掴んだりするかと思うと「なるほどな」と思う。//*微明:{l:明}は自分を知ることだから、相手を見てどうこうするってやり方は素直な明ではないんだろう。*','2011-10-03 17:29:51'),(37,37,'第三十七章','[道常無為、而無不爲。]侯王若能守之、萬物將自化。/化而欲作、吾將鎮之以無名之樸。/無名之樸、夫亦將無欲。不欲以靜、天下將自定。','(道:みち)は(常:つね)に(為:な)すこと(無:な)きにして、(而:しか)も(為:な)さざるは(無:な)し。(侯王:こうおう)(若:も)し(能:よ)く(之:これ)を(守:まも)らば、(万物:ばんぶつ)(将:まさ)に(自:おのず)から(化:か)せんとす。/(化:か)して(作:おこ)らんと(欲:ほっ)すれば、(吾:われ)(将:まさ)に(之:これ)を(鎮:しず)むるに(無名:むめい)の(樸:ぼく)を(以:もっ)てせんとす。/[(無名:むめい)の(樸:ぼく)は、(夫:そ)れ(亦:ま)た(将:まさ)に(無欲:むよく)ならんとす。](欲:ほっ)せずして(以:もっ)て(静:しず)かならば、(天下:てんか)(将:まさ)に(自:おのず)から(定:さだ)まらんとす。',NULL,NULL,'道はなにもしないが、できないことはない。王が道をしっかり守るなら、みんなは自分から変わっていくだろう。/しかし、道に向かおうと欲を出すなら、私は無名の撲で、はやる気持ちを鎮めよう。/無名の撲、それはまたの名を「無欲であろうとする」だ。欲を消し静かになれば、天下は自然と安定するだろう。',NULL,'道に習って何もしなければ勝手に平和になるという教え。{s:57}と合わせて読むと良い。//*道常無為、而無不爲。:たとえば{s:8}の水のように意識的にはたらかなくても生物をはぐくむ。{s:38}でいう「上徳無爲、而無以爲。」と同じ。*//*侯王若能守之、萬物將自化:化けるを変化とした。道に向かいたいとする心の変化。{s:32}に「侯王若能守之、萬物將自賓」とある。「自化」は{s:57}にもある。*//*化而欲作:道に欲は禁物だから道へ行こうと欲を出すのはNG。「作」は{s:28}でいう「割」と同じ。変化の方向が道具となって便利に使われようとすること。*//*無名之樸、夫亦將無欲。:道以外の無欲。*/','2011-10-03 17:29:53'),(38,38,'第三十八章','[上徳不徳。是以有徳。]下徳不失徳。是以無徳。/上徳無爲、而無以爲。下徳爲之、而有以爲。/上仁爲之、而無以爲。上義爲之、而有以爲。上禮爲之、而莫之應、則攘臂而扔之。/故失道而後徳。失徳而後仁。失仁而後義。失義而後禮。/夫禮者、忠信之薄、而亂之首。前識者、道之華、而愚之始。/是以大丈夫、處其厚、不居其薄。處其實、不居其華。故去彼取此。','(上徳:じょうとく)は(徳:とく)とせず。(是:これ)を(以:もっ)て(徳:とく)(有:あ)り。(下徳:げとく)は(徳:とく)を(失:うしな)わざらんとす。(是:これ)を(以:もっ)て(徳:とく)(無:な)し。/(上徳:じょうとく)は(為:な)すこと(無:な)きにして、(而:しか)して(以:もっ)て(為:な)すとすること(無:な)し。(下徳:げとく)は(之:これ)を(為:な)して、(而:しか)して(以:もっ)て(為:な)すこと(有:あ)りとする。/(上仁:じょうじん)は(之:これ)を(為:な)して、(而:しか)して(以:もっ)て(為:な)すこと(無:な)し。(上義:じょうぎ)は(之:これ)を(為:な)して、(而:しか)して(以:もっ)て(為:な)すとする(有:あ)り。/(上礼:じょうれい)は(之:これ)を(為:な)して、(而:しか)して(之:これ)に(応:おう)ずる(莫:な)し。(則:すなわ)ち(臂:うで)を(攘:はら)って(而:しか)して(之:これ)を(扔:ひ)く。//(故:ゆえ)に(道:みち)を(失:うしな)いて、(而:しか)して(後:のち)に(徳:とく)あり。(徳:とく)を(失:うしな)いて、(而:しか)して(後:のち)に(仁:じん)あり。(仁:じん)を(失:うしな)いて、(而:しか)して(後:のち)に(義:ぎ)あり。(義:ぎ)を(失:うしな)いて、(而:しか)して(後:のち)に(礼:れい)あり。/(夫:そ)の(礼:れい)なる(者:もの)は、(忠信:ちゅうしん)の(薄:うす)きにして、(而:しか)して(乱:らん)の(首:はじめ)なり。(前識:ぜんしき)なる(者:もの)は、(道:みち)の(華:はな)にして、(而:しか)して(愚:ぐ)の(始:はじ)めなり。//(是:ここ)を(以:もっ)って(大丈夫:だいじょうぶ)は、[(其:そ)の(厚:あつ)きに(処:お)りて、(其:そ)の(薄:うす)きに(居:お)らず。(其:そ)の(実:み)に(処:お)りて、(其:そ)の(華:はな)に(居:お)らず。](故:ゆえ)に(彼:あれ)を(去:さ)りて(此:これ)を(取:と)る。',NULL,NULL,'良い徳とは私に徳はないとすることだ。こういう人こそ徳がある。低い徳とは徳を失わないよう必死に繕うことだ。こういう人には徳がない。/良い徳とは何もしないで成功し、それを自分の仕業ではなかったことにする。低い徳はあれこれやって成功し、それを見せびらかして名を上げる。/良い思いやりとは、行動して見返りを求めない。良い義とは、あれこれやって成功して、その成果を示す。良い礼は行動しても誰も応えてくれないから袖を引っ張り指図する。//だから、道が失われた後に徳が目立ち、徳が失われると思いやりが大切にされ、思いやりがなくなると正義が見直され、正義がなくなると礼にうるさくなる。/あの礼儀ばかりが先を行く奴らは忠義もなく信用もするに足らず、混乱の頭となって引っ張っていく。聞きかじって覚えた知識を振り回すあいつらは道の華やかな部分だけを見て愚かなことを始める。//しかし、偉大な人は道徳の中心にいて離れたところにいない。つまり、実を大切にして外見にとらわれない。だから、仁義礼をやめて道徳を取る。',NULL,'真の徳を備えた人と偽の徳でごまかしている人との違いを通じて徳とは何かを説いた読みごたえのある話。{s:18}と合わせて読む。//ざっと見て気が付くのは、下徳と上義が同じ表現ってことか。となれば、下手な徳より誠実な仁の方が評価は高いということになるが、失われる順番は道→徳→仁→義→礼なので引っかかる。というのも、この章に道の説明はなく、代わりに上徳を無為無欲として道と同じかと思わせるように書いてあるからだ。つまり、上徳(道)→下徳→仁→義→礼となる可能性もある。下徳と道を除外していいなら、上徳→上仁→上義→上礼なのだが。下徳が上仁より優れている理由が今ひとつ見つからないので下徳を除外するよりない。//*上徳不徳。是以有徳。:徳が備わるとは何もかも捨てること。だから、徳すらも捨てるつもりだから「徳がない」とするのは当然。*//*下徳不失徳。是以無徳。:得ようとすることが徳のない行為。失わないように蓄える人に徳はない。*//*上徳無爲、而無以爲。:道と同じ無為で無欲だから、玄徳とも言えるだろう。副作用のない作用なのでもっとも良い。*//*下徳爲之、而有以爲。:人に誉められたり一目置いて欲しくて善行をする。偽善も善とは言うが、下心があっての行動なので程度の低い徳となる。*//*上仁爲之、而無以爲。:見返りを求めない心意気や、良し。しかし、好意が目に見えると恩を感じてしまって、無意識でも上下関係ができてしまう。直接作用しない方が良い。*//*上義爲之、而有以爲。:正義とは悪者を倒して「これが正義だ」と力を見せつけることで認められる。悪にされた方は当然傷つく。争いが入る分、仁より劣る。*//*上禮爲之、而莫之應、則攘臂而扔之。:小中学校で礼儀を叩きこまれた経験のある身にであれば、ありありとイメージできるんではなかろうか。/言ってきかせて、やらないから叩いて、できるまで何度もやらせるのが礼というものだったんだろう。*//*失道而後徳。失徳而後仁。失仁而後義。失義而後禮。:{s:18}で訴えられてること。*//*前識者、道之華、而愚之始。:「愚」って何だ?聖人は人を治めるには愚かにすると{s:3}と{s:65}で言っているが、後で「華におらず」と言っているからには、その愚かとは違いそうだ。/道之華というのは、道を歩んで大成功したところ。その華やかな場所から身を引くことが道の本質なのに、そこがわかってない人らが前識者。*//*處其實、不居其華。:「実」は本質であり、目標としていた「結果」。花はあくまで途中経過だから、そこにとどまるべきではない。*/','2011-10-03 17:29:56'),(39,39,'第三十九章','[昔之得一者。/天得一以清、地得一以寧、]神得一以靈、/谷得一以盈、萬物得一以生、侯王得一以爲天下貞。/其致之、一也。/天無以清將恐裂。地無以寧將恐廢。神無以靈將恐歇。/谷無以盈將恐竭。萬物無以生將恐滅。侯王無以貴高將恐蹶。/故貴以賤爲本、高以下爲基。/是以侯王自謂孤寡不穀。此非以賤爲本耶。非乎。/故致數譽無譽。不欲琭琭如玉、落落如石。','(昔:はじめ)の(一:いち)を(得:え)たる(者:もの)。/(天:てん)は(一:いち)を(得:え)て(以:もっ)て(清:きよ)く、(地:ち)は(一:いち)を(得:え)て(以:もっ)て(寧:やす)く、(神:かみ)は(一:いち)を(得:え)て(以:もっ)て(霊:れい)に、(谷:たに)は(一:いち)を(得:え)て(以:もっ)て(盈:み)ち、(万物:ばんぶつ)は(一:いち)を(得:え)て(以:もっ)て(生:しょう)じ、(侯王:こうおう)は(一:いち)を(得:え)て(以:もっ)て(天下:てんか)を(貞:と)う(為:な)り。//(其:そ)れ(之:これ)を(致:いた)すは、(一:いち)なれば(也:なり)。/(天:てん)(以:もっ)て(清:きよ)きこと(無:な)ければ(将:は)た(恐:おそ)らくは(裂:さ)けん。(地:ち)(以:もっ)て(寧:やす)きこと(無:な)ければ(将:は)た(恐:おそ)らくは(廃:くず)れん。(神:かみ)(以:もっ)て(霊:れい)なること(無:な)ければ(将:は)た(恐:おそ)らくは(歇:や)まん。(谷:たに)(以:もっ)て(盈:み)つること(無:な)ければ(将:は)た(恐:おそ)らくは(竭:つ)きん。(万物:ばんぶつ)(以:もっ)て(生:しょう)ずること(無:な)ければ(将:は)た(恐:おそ)らくは(滅:ほろ)びん。(侯王:こうおう)(以:もっ)て(貴高:きこう)なること(無:な)ければ(将:は)た(恐:おそ)らくは(蹶:たお)れん。/(故:ゆえ)に[(貴:とおと)きは(賤:いやし)きを(以:もっ)て(本:もと)と(為:な)し、(高:たか)きは(下:ひく)きを(以:もっ)て(基:もとい)と(為:な)す。]//(是:これ)を(以:もっ)て(侯王:こうおう)は(自:みずか)らを(孤:こ)・(寡:か)・(不穀:ふこく)と(謂:い)う。(此:こ)れ(賤:いやし)きを(以:もっ)て(本:もと)と(為:な)すに(非:あら)ず(耶:や)。(非:あら)ざる(乎:か)。/(故:ゆえ)に(誉:よ)を(数:かぞ)うるを(致:いた)せば(誉:ほまれ)(無:な)し。(琭琭:ろくろく)として(玉:たま)の(如:ごと)きを(欲:ほっ)せず、(落落:らくらく)として(石:いし)の(如:ごと)し。',NULL,NULL,'昔、一を得た者の話をしよう。/天が一を得て清らかに、地は一を得て安定し、神は一を得て神妙に、谷は一を得て満たされ、物は一を得て生じ、王は一を得て天下の行く末を占う仕事を任されるようになった。//そこに至ったのは一があったからだ。/天が清らかさをなくしてしまえば、ひょっとすると空が裂けてしまうかもしれない。地が安定感をなくしてしまえば、ひょっとすると地面が崩れてしまうかもしれない。神が神妙さをなくしてしまえば、ひょっとすると世界は枯れてしまうかもしれない。谷が貯める力をなくしてしまえば、ひょっとすると干上がってしまうかもしれない。物が生まれることをやめてなければしまえば、ひょっとすると滅びてしまうかもしれない。王が高貴さをなくしてしまえば、ひょっとすると王朝は倒れるかもしれない。/だから、高貴さは賎しさを根本とし、高い身分は低い身分を基本とする。//だから、王は自分をみなしご・やもめ・穀潰しなどと自称する。これが「賎しさこそ基本である」ことの証明でなければ何と言おう。そこに間違いはない。/だから、名誉を数えたりしてしまうようでは名誉はない。名誉とはキラキラとした珠にはなろうとせず、ゴロゴロとした石ころのようでいることだ。',NULL,'天地創造の話を交えながら「なにごとも小さなことから始まるから基本を忘れるな」と教える話。//しかしながら、一を粗末にするなとは言ってない。王は一を元に天下を得たが、王が頓挫するきっかけは一を軽んじたためではなく、高貴さをなくしたためだと言う。天地にいたっては、異変が起きれば一に向かって減少していくわけではなく、いきなり裂けるとか言ってるし。/だからこそ、「ひょっとすると~かもしれない」などと控えめな表現なのかもしれない。//世の中の完成した物は突然にして崩壊してしまうから、あながち間違ってないのかな。少し引っかかりのある解釈ではある。//*昔之得一者:{s:57}では「道生一、一生二、二生三、三生萬物。」と世界の始まりを説いている。*//*谷得一以盈:谷というより川と言った方がわかりやすい。*//*天下貞:貞は占い。貞卜といって、占い師は王の命で占いをする。王はその結果から神の声を聴いて政治の判断をする。*//*天無以清將恐裂:空に青くない部分があったら、裂けて向こうが見えてると思っても不思議はない。*//*地無以寧將恐廢:地面を支える土台がぐらつけば、どこまでも落ちていくと考えても不思議はない。*//*神無以靈將恐歇:神様が霊力を失ったら、作物が実らなくなると考えても不思議はない。*//*萬物無以生將恐滅:生物が生殖活動をやめれば、絶滅するのは当然。*//*侯王無以貴高將恐蹶:貴高って何だ?石のようでいて貴高になれるのか?*//*侯王自謂孤寡不穀:皇帝は自分を「朕」と自称するが、王や諸侯にも自称があった。王子にも自称があって、皇太子が「子」であることを除けば次男三男が「余(余りもの)」や「我(犠牲)」っぽいから、当時の支配階級は人から忌まれるような自称を持ったのだろう。/孤は孤児。寡は配偶者を亡くした者で、今で言う独居老人。不穀は働けないもので、今で言う障害者。当時のような悲惨な社会であっても、福祉制度はあったようで、その対象者は孤寡不穀であったようだ。/上の話の信憑性はともかく、随分昔からへりくだった自称をしていたことには間違いない。*/','2011-10-03 17:30:12'),(40,40,'第四十章','[反者道之動。弱者道之用。]/天下萬物生於有、有生於無。','[(反者:はんじゃ)は(道:みち)の(動:どう)なり。](弱:じゃく)は(道:みち)の(用:よう)なり。/(天下:てんか)(万物:ばんぶつ)は(有:ゆう)より(生:しょう)じ、(有:ゆう)は(無:む)より(生:しょう)ず。',NULL,NULL,'道の動きは無に帰っていくものである。弱いものは道に使ってもらって助けられるものである。//世の中には様々な物があるが、これらすべてがそこに有るからには「生まれた」のであるが、それは何も無いところから生まれるから有るのである。',NULL,'世の中は突き詰めて考えれば「ある」と「ない」しかない。それが「動き」を持って変化するなら、「有る」は「無い」になる以外になく、「無い」は必ず「有る」となる。{s:41}にある通り、道が無から有を生み出す力を備えているならば、やはり有を無にする力も備えているのだろう。/道が無から生み出した有(一)を徳が養って二、三、万へと増やす。徳が{s:21}のように道に従うなら、やはり三から二、二から一へと減っていき、無になるだろう。だから弱は道に助けられ、強は道に減らされるのである。/','2011-10-03 17:30:16'),(41,41,'第四十一章','[上士聞道、勤而行之。中士聞道、若存若亡。]下士聞道、大笑之。/不笑不足以爲道。故建言有之。/明道若眛、進道若退、夷道若纇。/上徳若谷、大白若辱、廣徳若不足、建徳若偸。質眞若渝。/大方無隅、大器免成、大音希聲、大象無形。/道隱無名。夫唯道、善貸且成。','(上士:じょうし)は(道:みち)を(聞:き)けば、(勤:つと)めて(之:これ)を(行:おこ)なう。(中士:ちゅうし)は(道:みち)を(聞:き)けば、(存:あ)るが(若:ごと)く(亡:な)きが(若:ごと)し。(下士:かし)は(道:みち)を(聞:き)けば、(大:おお)いに(之:これ)を(笑:わら)う。/(笑:わら)わざるは、(以:もっ)て(道:みち)を(為:な)すに(足:た)らず。(故:ゆえ)に(建言:けんげん)に(之:これ)(有:あ)り。/(明道:めいどう)は(昧:くら)きが(若:ごと)く、(進道:しんどう)は(退:しりぞ)くが(若:ごと)く、(夷道:いどう)は(纇:らい)なるが(若:ごと)し。/(上徳:じょうとく)は(谷:たに)の(若:ごと)く、(大白:たいはく)は(辱:じょく)なるが(若:ごと)く、(広徳:こうとく)は(足:た)らざるが(若:ごと)く、(建徳:けんとく)は(偸:おこたる)が(若:ごと)く、(質真:しつしん)は(渝:かわ)るが(若:ごと)し。/(大方:たいほう)は(隅:ぐう)(無:な)し、(大器:たいき)は(免成:めんせい)し、(大音:たいおん)は(声:こえ)(希:わずか)、(大象:たいしょう)は(形:かたち)(無:な)しと。/[(道:みち)は(隠:かく)れて(名:な)(無:な)し。](夫:そ)れ(唯:た)だ(道:みち)は、(善:よ)く(貸:か)し(且:か)つ(善:よ)く(成:な)す。',NULL,NULL,'勘の良い人が道の話を聞けば、積極的にそれを実践してみる。普通の人が聞けば、わかってはくれるけど実践しない。くだらない人が聞けば、大笑いする。笑わないだけでは道を行くには不足だから、補足しよう。//道を理解するとはボンクラみたいになることで、道を進むとは後戻りするようで、安全で平らな道とは面倒な無駄道のようだ。/高い徳とは低く見えて、潔白とは汚く見えて、広い徳とは何もかも飲み込むようで、しっかりした徳とは怠けてるようで、固い心とは変わるようだ。/大きすぎる四角形は隅が見えない。大きすぎる器は完成することがない。大きすぎる音は聞こえない。大きすぎる物は形が見えない。//道はとらえどころがなくて人間には見えない。しかし、道はいろいろ助けてくれて成功させてくれる。',NULL,'世界は複雑だから道理に合わない事象にたびたび遭遇する。道は{s:40}のように助けたり返したりして矛盾を抱えている。だから、世間の常識で道の話を聞くと笑われる。しかし、道を正しく理解して上がった後には一度下がって回り道すれば、道は大抵うまく運んでくれる。//*中士聞道、若存若亡。:理解してても実践しないなら理解してないのと同じ。素直に「気分しだいでやったりやらなかったりする」でもいいか。*//*不笑不足以爲道:中士は笑わなかったが、それでも道を歩んでるわけではない。*//*故建言有之。:以後は道の様子の説明が続くが、どれも常識とは真逆で笑われる理由がわかる。*//*明道若眛:知識を積んで賢くなることが、道を体得する近道ではない。むしろ、無教養ほど道に近い。*//*進道若退:善行を積んで名声を得ることが、道を体得する近道ではない。むしろ、手柄を譲って後戻りするほど道に近い。*//*夷道若纇:人生のレールを順調に歩むことが、道を体得する近道ではない。むしろ、何度も困難を乗り越えていくほど道に近い。/纇はより合わせた糸。ねじりを入れてらせん状にすると丈夫にはなるが、元の長さより短くなる。同じ長さの糸なら纇の方が無駄が多い。{s:53}には「大道甚夷、而民好徑。」とあって、つづら折りの分、寄り道が多いと言っている。*//*上徳若谷:立派な人はへりくだっている。頭を下げた隙間が谷のような器となる。*//*大白若辱:正直に生きることは出世をあきらめることと同じ。潔白でいると貧乏になってみすぼらしい姿となる。/白と辱は{s:28}にも出てくる。*//*廣徳若不足:徳の広い人は貧しい人に気前良く与えるものだが、ここでは何も持たず全てが欠乏した状態であると言う。上徳が深い谷なら廣徳は広い谷。/{s:21}には孔徳があり廣徳と同じだろうか。*//*建徳若偸:偸は盗むの意味だが、ダラダラとサボってしぶとく生き延びると解釈。徳は厳しい鍛錬で備わるものではなく、人目を盗んで休むことで基礎体力がつく。こうやって養生しながら長生きすることで寄り道したロスを経験に変えるのだ。*//*質眞若渝:眞は{s:21}でいう「其精甚眞」と同じものだろう。渝は変わるという意味。ものごとの本質など常に不変であると思いたいが、変わらないものはないと言う主張だ。とりあえず質眞を固い心としておいたが。*//*大方無隅:{s:58}では聖人の「方」は割けないとある。*//*大器免成:長らく「大器晩成」として四字熟語として伝わってきた。近年の発見で晩ではなく免だとわかってきた。晩だと老後に完成するイメージだが、免なら完成しないですむ意味となる。/老子は随所で完全体にならないよう言ってるし、前後の句も否定する構成。だから、免のほうがフィット感がはるかに高い。/もう免として、完成することがないとしていいよね。それはもちろん成長し続けるという意味で。*//*大音希聲:{s:23}でいう「希言自然」。*//*大象無形:{s:35}では「執大象」*//*道隱無名:小さいものが目に見えないのは当然だが、大き過ぎても全容がわからない。だから意外なところから道を見つけることができる。/{s:32}では「道は常に無名」。*//*善貸且成:道は蔭から力を貸してくれるし、成功もさせてくれる。世間の常識にとらわれず、下がったり回り道をしていれば。*/','2011-10-03 17:30:17'),(42,42,'第四十二章','[道生一、一生二、二生三、三生萬物。]/萬物負陰而抱陽、冲氣以爲和。/人之所惡、唯孤寡不穀。而王公以爲稱。故物或損之而益、或益之而損。/人之所教、我亦教之。強梁者不得其死。吾將以爲教父。','[(道:みち)は(一:いち)を(生:しょう)じ、(一:いち)は(二:に)を(生:しょう)じ、](二:に)は(三:さん)を(生:しょう)じ、[(三:さん)は(万物:ばんぶつ)を(生:しょう)じる。]/(万物:ばんぶつ)は(陰:いん)を(負:お)いて(陽:よう)を(抱:いだ)き、(沖気:ちゅうき)を(以:もっ)て(和:わ)を(為:な)す。/(人:ひと)の(悪:にく)む(所:ところ)は、(唯:ただ)、(孤:こ)、(寡:か)、(不穀:ふこく)なるも(王:おう)(公:こう)は(以:もっ)て(称:しょう)と(為:な)す。(故:ゆえ)に(物:もの)(或:ある)いは(之:これ)を(損:そん)して(益:ま)し、(或:ある)いは(之:これ)を(益:ま)して(損:そん)ず。/(人:ひと)の(教:おし)うる(所:ところ)、(我:われ)も(亦:また)(之:これ)を(教:おし)えん。(強梁者:きょうりょうしゃ)は(其:そ)の(死:し)を(得:え)ず。(吾:われ)(将:まさ)に(以:もっ)て(教:おし)えの(父:ちち)と(為:な)さんとす。',NULL,NULL,'道は一を生み、一は二を生み、二は三を生み、三はあらゆるものを創りだす。/すべての存在には陰と陽が付随し、中心にからっぽの部分があってバランスを保っている。//人は孤独や孤立、ひもじさを嫌うが、支配者は自分を孤独者、孤立者、穀潰しなどと自称する。それは、ある物が価値を減らすと価値を増す物があり、価値が増える物があると損する物が出るから、敢えて自分のことを損で惨めな存在としているのだ。/人から聞いた良いことを私も教えよう。武力を自慢する者は天寿を全うできない。これを大切な教えとしておこう。',NULL,'万物が生成される秩序を描いた章。{s:51}、{s:40}、{s:21}あたりが関係あるか。//道が一を生む。一より下は無よりなく、つまりは道が無から一を生む。/{s:40}によると無から有が生まれ、有から万物が生まれる。この章は有である一から万物誕生までの話をしているのだろう。//{s:51}によれば道が生んだものを養うのが徳だから、一から二を生むのは徳だろう。/二から三を生むのが物のようだが、面を作るには三点必要で、形を作るには三次元必要だから、二が三になることで物として形が生まれるのだろう。/何かを作るためには三が必要で、三があれば何でもできる。こうやって万物たる器が成る。つまり、万物は常に三から構成されており、それら三は上中下、ここで言えば陰陽沖気にわかれることになる。/以上のことから、人間社会も三で構成されており、それは上中下で区別されていると言ってよい。ここで或る者が上にいけば別の誰かが下がることになり、或る者が損すれば他の誰かが得することになる。だから、上の人が下に行くことで下を押し上げるのは理にかなっていると言える。/','2011-10-03 17:30:21'),(43,43,'第四十三章','[天下之至柔、馳騁天下之至堅。]無有入無間。/吾是以知、無爲之有益。/不言之教、無爲之益、天下希及之。','(天下:てんか)の(至柔:しじゅう)は、(天下:てんか)の(至堅:しけん)を(馳騁:ちてい)す。[(無:む)(有:あ)るは(間:あいだ)(無:な)きに(入:はい)る。]/(吾:われ)(是:これ)を(以:もっ)て(無為:むい)の(益:えき)(有:あ)るを(知:し)る。/(不言:ふげん)の(教:おし)え、(無為:むい)の(益:えき)、(天下:てんか)(之:これ)に(及:およ)ぶもの(希:まれ)なり。',NULL,NULL,'世界で一番柔らかいものは、世界で一番堅いものを思いどおりにできる。見えないほど細いものは隙間のないような場所にも入り込む。//私はこの発想から、何もしないことがうまくいくのだという結論にたどりついた。/言葉でうるさく教えないやり方は先ほどの無為の益であり、これに敵うものは世界に滅多にない。',NULL,'至柔は{s:78}にある水のこと。水は柔軟だからどこへでも染み込む。無の有用性は{s:11}と合わせて読む。無と有の関係は{s:40}を読む。//難しい章ではないので注釈することもないから、荘子に出てくる庖人(料理人)の話でもしておくか。/当時の料理人の仕事には牛の解体も含まれていた。牛の骨は太いので、力自慢が肉厚の包丁で切断するというような大仕事だった。力任せに切るために度々刃こぼれを起こす。それに負けないように包丁は次第に頑丈になっていく。/ところが丁という人の包丁は全く逆で、刃は薄く切っ先は尖っていた。その細い先端を間接のわずかな隙間に差し込んでゆっくり動かすことで小さな力でも骨や筋を切り離すことができたのだ。丁の発想は刃を厚く大きくするほど隙間に入れにくくなり仕事が難しくなるというものだった。/この庖人の丁から包丁という言葉が生まれた。//*天下之至柔:柔らかさの頂点まで至った物。*//*馳騁天下之至堅:堅さの頂点まで至った物。馬のように人間より大きく力のある生き物を乗り回すのが馳騁。自分より堅くて強い相手を操縦するのが柔らかさ。*//*不言之教:言葉を発しない水からも教えられることはあるから注意深く観察せよとしてもいいが、ここは柔軟な対応についての話なので教え諭さないことの方が良い。*/','2011-10-03 17:30:24'),(44,44,'第四十四章','[名與身孰親。身與貨孰多。]得與亡孰病。/是故甚愛必大費。多藏必厚亡。/知足不辱、知止不殆、可以長久。','(名:な)と(身:み)とは(孰:いずれ)か(親:した)しき。(身:み)と(貨:か)とは(孰:いずれ)か(多:た)なる。(得:とく)と(亡:ぼう)とは(孰:いずれ)か(病:へい)なる。/(是:これ)(故:ゆえ)に[(甚:はなは)だ(愛:あい)すれば(必:かなら)ず(大:おお)いに(費:つい)え]、(多:おお)く(蔵:ぞう)すれば(必:かなら)ず(厚:あつ)く(亡:うしな)う。/(足:た)るを(知:し)れば(辱:はずか)しめられず、(止:とど)まるを(知:し)れば(殆:あや)うからず、(以:もっ)て(長久:ちょうきゅう)なる(可:べ)し。',NULL,NULL,'名誉と命はどっちが大切か。お金と命はどっちが大切か。手に入れることとなくすこと、どちらが具合が悪いか。//大事にし過ぎると苦労が絶えず、蓄えすぎると失いやすい。//ほどほどで満足出来れば失望しないで済む。ほどほどでやめておくことを知っていれば危険を避けられる。こうやれば長い間、うまくやっていけるのだ。',NULL,'人が生きていく上で必要なものは何かを考える。//老子的な考えでは身体を大切にしてお金は貯めないという話に行きやすいが、はたしてそうだろうか。身体を大事にするのも度が過ぎれば良くない。大事にし過ぎて失敗する話もある。結論が「ほどほど」だけに、安直には考えない方がよさそうだ。//*知足不辱:{s:46}には満足を知らないが故に罪を作る例がある。*//*知止不殆:{s:32}には「知止所以不殆」とある。*/','2011-10-03 17:30:26'),(45,45,'第四十五章','[大成若缺、其用不弊。]大盈若沖、其用不窮。大直若詘、大巧若拙、大辯若訥。/躁勝寒、靜勝熱。清靜爲天下正。','(大成:たいせい)は(欠:か)くるが(若:ごと)くにして、(其:そ)の(用:よう)(弊:やぶ)れず。(大盈:たいえい)は(沖:むな)しきが(若:ごと)くにして、(其:そ)の(用:よう)(窮:きわ)まらず。/(大直:たいちょく)は(詘:くっ)するが(若:ごと)く、(大巧:たいこう)は(拙:せつ)なるが(若:ごと)く、[(大弁:たいべん)は(訥:とつ)なるが(若:ごと)し。]/(躁:そう)は(寒:さむ)きに(勝:か)ち、(静:せい)は(熱:あつ)きに(勝:か)つ。(清静:せいせい)は(天下:てんか)の(正:せい)たり。',NULL,NULL,'完成しているものは未完成に見えるが、機能は万全だ。本当に充満しているものは空っぽに見えるが、汲み出して足りなくなることはない。完全に真っ直ぐなものは曲がっているし、本当に達者なものはへたくそにみえる。口が立つものはしゃべらない。//そわそわと動けば寒さはしのげるが、じっとしていれば暑さをしのげる。清らかで静かな者が天下を導くのだ。',NULL,'柔軟な発想を鍛える章。難しく解釈せずに考えてみればいい。//*大成若缺、其用不弊。:欠陥があって完成するもの。{s:11}が近いか。たとえば車のハンドルは遊びがあって完成する。これがないと安定して走れず使い物にならない。*//*大盈若沖、其用不窮。:{s:6}に見られる。ストックではなくフロー。貯めて終わりではなく補充ができるようにしておく。自販機は売れて空いた場所に補充できるから、ただの箱なのに商品がなくなることはない。{s:5}のふいごでも良い。からっぽだから満ちている。*//*大直若詘:{s:22}に見られる。しゃくとり虫は曲がることでまっすぐ進む。{s:53}のような回り道をする正直者でも良い。*//*大巧若拙:お笑い芸人はヘタクソな振りをして笑わせる。教育番組ではわからないふりをしたり、わざと間違えて考えるきっかけを与える。*//*大辯若訥:話し上手は自分が言いたいことばかりをしゃべらない。むしろ、それを控えて上手に相槌を打ち、会話を弾ませる。調停では相手の言い分を聞いた方が落とし所を見つけやすい。*//*躁勝寒、靜勝熱。清靜爲天下正。:静かで清らかな者が正しいのは、この世が混沌として騒がしいから。/しかし、聖人の政治はぼんやりしていて悪の立場を弁護するので清いのが正しいのは老子らしくない。*/','2011-10-03 17:30:27'),(46,46,'第四十六章','[天下有道、却走馬以糞、]天下無道、戎馬生於郊。/罪莫大於可欲、禍莫大於不知足、咎莫大於欲得。/故知足之足、常足。','(天下:てんか)に(道:みち)(有:あ)れば、(走馬:そうば)を(却:しりぞ)けて(以:もっ)て(糞:ふん)させ、(天下:てんか)に(道:みち)(無:な)ければ、(戎馬:じゅうば)(郊:こう)に(生:しょう)ず。//(可欲:かよく)より(大:だい)なる(罪:つみ)は(莫:な)く、[(足:た)るを(知:し)らざるより(大:だい)なる(禍:わざわい)は(莫:な)く]、(得:え)んと(欲:ほっ)するより(大:だい)なる(咎:とが)は(莫:な)し。//(故:ゆえ)に(足:た)るを(知:し)るの(足:た)るは、(常:つね)に(足:た)るなり。',NULL,NULL,'天下が道で治められているなら、伝令の早馬は農耕馬として使われるようになるだろう。天下が道で治められていないなら、農耕馬は戦車の馬として国境付近で飼育されるようになるだろう。//欲望を見せびらかして他人を煽ることより大きい罪はなく、満足を知らないことより大きな災いはなく、欲しがることより大きな過ちはない。//だから、足りているという気持ちが足りていることで、毎日を充実させるのである。',NULL,'心の充足について。//同じ道具であっても、人によって使い方が違う。「養うために使うこと」と「奪い合いに使うこと」である。/そこで悪い使い方を三つ挙げた。/欲望にはキリがないが、足りたと思うだけで案外足りてしまうものだ。いい使い方ができないまでも悪い使い方をしないくらいは心がけておくべきだろう。//*天下有道、却走馬以糞:馬を上手に使う例。*//*天下無道、戎馬生於郊:悪く使うと奪うために利用される。*//*罪莫大於可欲:もっとも悪いことは欲しい物を何でも手に入れる姿を見せて手本となること。他人を煽ることは欲望を連鎖的に増幅させる。戦犯でも煽る罪は重い。罪だから処罰の対象となりうる。*//*咎莫大於欲得:次が手に入れてやろうと欲を出すこと。何としてでも欲しいと思うといずれは過ちを犯してしまう。優先順位的にはこちらが高いので二番目の句と入れ替えた。*//*禍莫大於不知足:第二句であるが、最後に持ってきた。満足さえ知っていれば欲は出ないのだから、ここに注意すべき。たとえ合法であろうと手に入るものを何でも手に入れる習慣があると気付かぬ間に不幸がやってくる。*/','2011-10-03 17:30:29'),(47,47,'第四十七章','[不出戸、知天下、不闚牖、見天道。]/其出彌遠、其知彌少。/是以聖人、不行而知、不見而名、不爲而成。','(戸:こ)を(出:い)でずして、(天下:てんか)を(知:し)り、(牖:まど)を(闚:うかが)わずして、(天道:てんどう)を(見:み)る。/(其:そ)の[(出:い)ずること(弥:いよいよ)[(遠:とお)ければ、(其:そ)の(知:し)ること(弥:いよいよ)(少:すくな)し。]/(是:これ)を(以:もっ)て(聖人:せいじん)は、(行:い)かずして(知:し)り、(見:み)ずして(名:な)づけ、(為:な)さずして(成:な)す。',NULL,NULL,'家から出ないで天下を知る。窓から外を見ないで天の道を見る。/遠くまで出かけてしまうとわかることは減ってしまう。/だから、賢者は出かけずに知り、見ないで理解し、何もしないで成し遂げる。',NULL,'真理とは日常のありふれた中に潜んでいる。聖人が凡人に混じって生活しているように、道も日常にある。それは例えば{s:16}のような自然のうつろいなどだ。それをわざわざ遠くまで出かけると、珍しさに目を奪われて{s:35}の過客のようになってしまう。//賢いとは当たり前のことを当たり前として受容できることだ。だとすると、「為さずして成す」とは死ぬことかもしれないね。何もしないで死を受け入れる姿を美しく感じるのは、簡単なようで難しいからではなかろうか。//*不見而名:名は何らかの表現をする。見て触って、それがどんなものなのか、名前をつけて言い表す。*/','2011-10-03 17:30:31'),(48,48,'第四十八章','[爲學日益、爲道日損。]損之又損、以至於無爲。無爲而無不爲。/取天下、常以無事。及其有事、不足以取天下。','[(学:がく)を(為:な)せば(日々:ひにひ)に(益:ま)し、(道:みち)を(為:な)せば(日々:ひにひ)に(損:そん)ず。](之:これ)を(損:そん)じて(又:また)(損:そん)じ、(以:もっ)て(無為:むい)に(至:いた)る。(無為:むい)にして(而:しか)も(為:な)さざるは(無:な)し。//(天下:てんか)を(取:と)るは、(常:つね)に(事:こと)(無:な)きを(以:もっ)てす。(其:そ)の(事:こと)(有:あ)るに(及:およ)んでは、(以:もっ)て(天下:てんか)を(取:と)る(足:た)らざる。',NULL,NULL,'勉強すれば成果が上がる。道を行けば損をする。損して損して最後には何もできなくなる。だが、なにもしないことで何も成し遂げないわけではない。//天下を取るには必ず事をおこさないことだ。事に及ぼうとするようでは、まだまだ天下を取る力などない。',NULL,'向上心を持って修練を行い、誰よりも知識を積み重ねた者が人々を教え導き、尊敬されるべき王として天下を支配する。//ごく当たり前のように思えるが、老子はそれではダメだと言う。//たとえ修練で天下を取ったとしても、自分が積極的に介入しなければ支配者の地位を維持できないようでは、力が衰えた時に地位を他者に奪われてしまう。/真の天下人とは何もしなくても周囲から盛り立てられて王位に就く者なのだ。天下は努力を積み重ねて取るものではなく、当たり前のように、取るべくして取るものだ。努力して取ってるようでは、まだまだ二流なんである。/真に天下を取る者は、自分が損してでも他人に利益を与えるような行いで、周囲をおだてあげ、他人を上手に動かして自分では何もしないものだと教えている。//よく名選手だからといって名監督になれるわけではないと言われるが、この章でも学ぶ力と教える力は違うことを言っているのであろう。//学問とは自分のためにする利己的なものだ。学んで常に得するのは自分である。その利益は学者本人が手放さない限り世の中に還元されることはない。それを人の為に使ってこそ天下は近づく。学ぶだけでは意味がない。学んだものをどれだけ人に還元できるか。その利他があってこそ天下は寄ってくるのだ。/このような解釈では愚民政策と矛盾してしまうが、案外ここでは学ぶことを禁じてはいない。現実的な処世術としては、学んでも損をすればいいんではないか。','2012-01-07 07:40:09'),(49,49,'第四十九章','[聖人無常心、以百姓心爲心。]/善者吾善之、不善者吾亦善之。徳善。/信者吾信之、不信者吾亦信之。徳信。/聖人在天下、歙歙為天下、渾其心。百姓皆注其耳目、聖人皆孩之。','(聖人:せいじん)は(常:つね)に(心:こころ)(無:な)く、(百姓:ひゃくせい)の(心:こころ)を(以:もっ)て(心:こころ)と(為:な)す。//(善:ぜん)なる(者:もの)は(吾:われ)(之:これ)を(善:よ)しとし、(不善:ふぜん)なる(者:もの)も(吾:われ)(亦:また)(之:これ)を(善:よ)しとする。(徳:とく)は(善:ぜん)なり。/(信:しん)なる(者:もの)は(吾:われ)(之:これ)を(信:しん)じ、(不信:ふしん)なる(者:もの)も(吾:われ)(亦:また)(之:これ)を(信:しん)ず。(徳:とく)は(信:しん)なり。//(聖人:せいじん)が(天下:てんか)に(在:あ)るや、(歙歙:きゅうきゅう)として(天下:てんか)の(為:ため)にし、(其:その)(心:こころ)を(渾:こん)ず。/[(百姓:ひゃくせい)は(皆:みな)(其:そ)の(耳目:じもく)を(注:そそ)ぐも、(聖人:せいじん)は(皆:みな)(之:これ)を(孩:がい)とす。]',NULL,NULL,'聖人は自分のことは考えず、民の心こそが自分の心だとする。//善人がいれば、私は彼を善人としよう。悪人がいれば、私は彼もまた善人としよう。どっちも善人とするのが徳だろう。/正直者がいれば、私は彼を正直としよう。嘘つきがいれば、私は彼もまた正直としよう。どっちも信じるのが徳だろう。//聖人が天下を治めるなら、天下のために心を砕いて、民の心をまぜ合わせていくのだ。/民は聖人の動きに固唾を飲むが、聖人は民を無垢な赤ちゃんのよう扱う。',NULL,'{s:27}を読んでから読むといい。聖人は悪人も善人になる資質があるとして、それを愛して伸ばすから見捨てることはない。だから、意見の食い違う者を善悪で分けたりしない。また{s:28}も前提としている。聖人は善悪を知りつくした上で悪の味方をしてやると言っている。それを具体的にどうやればいいの?ってのがこの章だ。//「ただ人のために心配して心を砕く。」//それだけ。それじゃあ何もしないのと同じじゃないかって話だけど、その通りなんじゃないかな。人を信じて無為を行う。正反対の主張をする者同士を急激に和解させたりせず、ゆっくりと価値観を混ぜ合わせていく。民が何とかしてくれと目で訴えるが、ただかわいがってあげるだけとする。こういう話は{s:79}にある。//ずいぶん都合のいい政治だなぁという印象だろうか。悪人を善人と同じ扱いにしたら善人が損じゃん。まぁこれは他人だからそう思うのであって、家族であれば罰を与えるだろうか。お母さんにとっては、どっちもかわいい子なんだから、単純な罰で終わりにはしないだろう。聖人にとっては、民は皆自分の子供なんだから、お母さんと同じやり方で民をまとめるんだろう。//*歙歙為天下、渾其心。:「渾其心」を聖人自身の心を濁らせて見えないようにするとなれば{s:5}の中を守る話としてつながる。/前文の例が善悪の対立だから、それらを混ぜる方がかっこいいから、そちらを取った。*/','2011-10-03 17:30:33'),(50,50,'第五十章','[出生、入死。/生之徒十有三、]死之徒十有三。人之生、動之死地亦十有三。/夫何故。以其生生之厚。/蓋聞、善攝生者、陸行不遇兕虎、入軍不被甲兵。/兕無所投其角、虎無所措其爪、兵無所容其刃。/夫何故。以其無死地。','(出:い)ずれば(生:せい)、(入:はい)れば(死:し)。/(生:せい)の(徒:と)、(十:じゅう)に(三:さん)(有:あ)り、(死:し)の(徒:と)、(十:じゅう)に(三:さん)(有:あ)り。(人:ひと)の(生:い)くるや、[(動:うご)きて(死地:しち)に(之:ゆ)くもの(亦:また)(十:じゅう)に(三:さん)(有:あ)り。]/(夫:そ)れ(何:なん)の(故:ゆえ)ぞ。(其:その)(生:せい)を(生:せい)とするの(厚:あつ)きを(以:もっ)てなり。/(蓋:けだ)し(聞:き)く、「(善:よ)く(生:せい)を(摂:せっ)する(者:もの)は、(陸:りく)を(行:い)きて(兕虎:じこ)に(遇:あ)わず、(軍:ぐん)に(入:い)りて(甲兵:こうへい)を(被:こうむ)らず」と。/(兕:じ)も(其:その)(角:つの)を(投:とう)ずる(所:ところ)(無:な)く、(虎:とら)も(其:その)(爪:つめ)を(措:お)く(所:ところ)(無:な)く、(兵:へい)も(其:その)(刃:は)を(容:い)るる(所:ところ)(無:な)し。/(夫:そ)れ(何:なん)の(故:ゆえ)ぞ。(其:その)(死地:しち)(無:な)きを(以:もっ)てなり。',NULL,NULL,'生まれるときは出てきて、死ぬときは帰っていく。/人が十人いれば、三人が天寿を全うし、三人は早死してしまう。また、三人は決められた天寿があるなのに、活動しすぎて自滅してしまう。/それはなぜか。生きようとする気持ちが強いからである。//聞いた話では、長生きする人は旅しても猛獣に会わず、戦争に行っても強い兵に遭わない。/サイと遭遇したとても、角を突き刺されることもなく、虎と遭遇したとても、爪に引っかかれることもなく、兵と遭遇したとても、刃物で突き刺されることもない。/それはなぜか。彼は死ぬ運命を持ってないからである。',NULL,'老子流の運命論か。/老子は天命は存在するが、自分がどちらなのかは死んでみないとわからないと言いたそうだ。ただ、天は、どっちかというと親切なので、欲張って動きまわらなければ、大抵はうまくいくとも言いたいようだ。もっとも、天命などと言えば、天から与えられた使命みたいな感じで、これを信じてしまうと、使命感に燃えて死にに行ってしまうが。//{s:40}によれば、命というものは道が無から有にすることで生まれる。また、有から無にすることで死んでしまう。/生死は道が決めるものだ。道には無か有、ゼロかイチしかないので、人間の努力でイチをいくら増やしても道には関係ない。いきなりゼロにしちゃって終わらせちゃう。/それがわからない人は生き延びようと無闇に動いて死んでしまう。猛獣に出会っても死なない人がいるんだから、そんなに身構えなくても心配ない。//一応、こういう解釈にしておいたが、案外ズルい理屈だね。生死の境い目なんて完全な結果論。しかも、十人中九人しか書いてなく、例外を一人用意してあるので、なんでも言い訳できちゃう。/','2011-10-03 17:30:36'),(51,51,'第五十一章','[道生之、徳畜之、物形之、器成之。]/是以萬物、莫不尊道而貴徳。/道之尊、徳之貴、夫莫之命、而常自然。/故道生之、徳畜之。長之育之、亭之毒之、養之覆之。/生而不有、爲而不恃、長而不宰、是謂玄徳。','(道:みち)、(之:これ)を(生:しょう)じ、(徳:とく)、(之:これ)を(蓄:やしな)い、(物:もの)、(之:これ)を(形:かたち)づくり、(器:き)、(之:これ)を(成:な)す。/(是:これ)を(以:もっ)て(万物:ばんぶつ)、(道:みち)を(尊:たっと)びて(徳:とく)を(貴:たっと)ばざるは(莫:な)し。/[(道:みち)の(尊:とおと)きと(徳:とく)の(貴:とおと)きは]、(夫:そ)れ(之:これ)を[(命:めい)ずる(莫:な)くして、(常:つね)に(自:おのず)ずから(然:しか)り。]/(故:ゆえ)に(道:みち)、(之:これ)を(生:しょう)じ、(徳:とく)、(之:これ)を(蓄:やしな)う。(之:これ)を(長:ちょう)じて(之:これ)を(育:そだ)て、(之:これ)を(亭:かた)め(之:これ)を(毒:あつ)くし、(之:これ)を(蓄:やしな)い(之:これ)を(覆:おお)う。/(生:しょう)ずるも(有:ゆう)とせず、(為:な)すも(恃:たの)まず、(長:ちょう)ずるも(宰:さい)たらず、(是:これ)を(玄徳:げんとく)と(謂:い)う。',NULL,NULL,'道が「これ」を生み出し、徳が「それ」を取りまとめ、「それ」が形を持って物となり、そうやって道具が完成する。//だから、あらゆる物が「道だけを尊敬して徳は貴ばない」などとするはずがない。/道は尊敬され、徳も貴ばれる。それは誰に命令されずとも、いつも当たり前のようにはたらくからだ。//つまり、道は自然と「これ」を生み、徳は自然と「それ」を取りまとめるのだ。/「それ」を伸ばし、「それ」を育て、「それ」を結束させ、「それ」を熟成させ、「それ」を増殖させ、「それ」を一杯にする。/それでいて創りだしても手柄ありとせず、結果を出しても恩をあてにせず、才能があっても上下関係を作らない。これが玄徳と言うものだ。',NULL,'モノが生まれる経緯を書いた章っぽい。どうやって生まれるかは{s:42}が参考になるか。//あらゆるものが道と徳によって自然に発生するので、両者ともに貴ばなければならない。//悩みどころは徳のカバー範囲。道は生むだけ。蓄うところから器を為すまでを徳が行うように考えているが、この文章からはハッキリ読み取れない。//*道生之、徳畜之、物形之、器成之。:{s:42}にある「道生一、一生二、二生三、三生萬物。」と同じ流れだろう。/道は無から一を生み、徳は一を増やすことになる。*//*莫不尊道而貴徳:{s:10}などで「一を抱く」と言っているが、道さえあれば良いというわけではないらしい。*//*道之尊、徳之貴、夫莫之命、而常自然。:誰の命令も受けないで自発的に活動するが、その自発に自我はなく、まったく無意識かつ平等にはたらく。/器を成すとは道具を作ることとも一致し、ものの発生は発明の過程と同じと言える。偉大な発明をする人は誰かに命令されて仕事をしたのではなく、それが楽しくてやりたいからやっただけであることが多い。/発明でたとえるなら、道は一瞬のひらめき、徳は仲間を募ってやってもらうこと。*//*故道生之、徳畜之。:ここらへん、どこで文と段落を切るかで微妙に意味が変わってくるので悩みどころ。/生むのは道の仕事、そこから育てるのはすべて徳の仕事としておいた。*//*長之育之、亭之毒之、養之覆之。:亭に固めるの意味はないので写した。毒も意味はわからないものの、腐りかけの発酵状態のイメージか。覆うのは{s:34}の氾として溢れかえるほど増えるのか、覆い隠すのか。*//*生而不有、爲而不恃、長而不宰、是謂玄徳。:{s:10}に同じ句がある。錯簡ではないかと噂されるが、そのまま解釈した。{s:10}には「生之畜之」があり、こちらにはない。違いが気になるが、よく見るともっと前に「故道生之、徳畜之。」とあるから、玄徳についてはここからをひとまとめとすべきか。となれば、徳が蓄から覆うまで発展させてるように読めるっぽい。*/','2011-10-03 17:30:39'),(52,52,'第五十二章','[天下有始、以爲天下母。]/既知其母、復知其子。既知其子、復守其母、没身不殆。/塞其兌、閇其門、終身不勤。開其兌、濟其事、終身不救。/見小曰明、守柔曰強。用其光、復歸其明、無遺身殃。是謂習常。','(天下:てんか)に(始:はじめ)(有:あ)り、(以:もっ)て(天下:てんか)の(母:はは)(為:た)り。/(既:すで)に(其:そ)の(母:はは)を(知:し)り、(復:ま)た(其:そ)の(子:こ)を(知:し)る。(既:すで)に(其:そ)の(子:こ)を(知:し)りて、(復:ま)た(其:そ)の(母:はは)を(守:まも)れば、(身:み)を(没:ぼっ)するまで(殆:あや)うからず。/(其:そ)の(兌:あな)を(塞:ふさ)ぎ、(其:そ)の(門:もん)を(閉:と)じれば、(身:み)を(終:お)うるまで(勤:つか)れず。(其:そ)の(兌:あな)を(開:ひら)き、(其:そ)の(事:こと)を(済:な)せば、(身:み)を(終:お)うるまで(救:すく)われず。/(小:しょう)を(見:み)るを(明:めい)と(曰:い)い、(柔:じゅう)を(守:まも)るを(強:きょう)と(曰:い)う。[(其:そ)の(光:ひかり)を(用:もちい)て、(其:そ)の(明:めい)に(復帰:ふっき)すれば、(身:み)に(殃:わざわい)を(遺:のこ)すこと(無:な)し。](是:こ)れを(習常:しゅうじょう)と(謂:い)う。',NULL,NULL,'この世はすべて始まりがあって有となるのだから、すべての事象には母がある。/その母を既に知っており、また、その子も知っている。その子も既に知っており、またその母を守るところに返れば、最後まで失敗はない。//余計なことを見たり聞いたりせず、あれこれと難しいことを考えなければ、一生くたびれることはないだろう。見て聞いて、大きなことをやってやろうとするならば、一生救われないだろう。//当たり前の法則を見つけるのが明知で、それに逆らわず柔軟に過ごすことが強さだ。当たり前に助けられ、当たり前に助ければ、その身を不幸が襲うことはないだろう。こうやって生きることを常に心がけるのだ。',NULL,'主語がはっきりしないので難しい章。//老子得意の無→有→無、陰→陽→陰、弱→強→弱、小→大→小、暗→明→暗、子→母→子、あるいは種→実→種の組み立てであろう。これを知っていれば危険はない。//母子の関係は世代交代で、身を人体ではなく家だと考えるのが手っ取り早い。//この章はあまり難しいことは考えずに柔軟に受け入れた方が光明が見えるかもね。//*天下有始、以爲天下母。:天地じゃなくて天下なの?天下より前に天地の始めがあるはずだが?/天地であれば{s:25}に道が天地を生んだとあるから母とは道のことだといえる。しかし、天下だと人間社会のことで、狭い意味では国を意味する。となると、国の母とは{s:59}にあるような、国祖となる。当時の国の母は文王で、その子は武王で、それは当時では子どもでも知ってることなわけだが、それで「危うからず」はおかしい。/老子流の遊び心と考えてもいいが、{s:51}では道が一を生み、{s:40}では無から有が生じるとあり、万物すべてがそうであることから、天地が道から生まれた話と限定せず、あらゆるものに母があることにした。*//*既知其母、復知其子。既知其子、復守其母:彼女が既に母だと知っているのなら、子がいることはわかっている。その子に子がいることを知っているのなら、その子も母になったことがわかる。/母を種、子を果実として植物で考えるともっとわかりやすい。生んだ子の中には既に母が入っている。/一般的な解釈通り、母を道としてもよいが、その場合、子とは何か。これは独自の解釈であるが、徳も道が生んだものと考えているので、子とは徳のことではないかと推測している。道徳を守れば危うからず。*//*見小曰明、守柔曰強。用其光、復歸其明:世の中の動きが無→有→無の繰り返しってことさえわかっていれば好きに解釈していいんでないか。/「明」は{s:16}でいう明だろう。{s:16}では盛んなものが生まれる前の姿に返ることを常といって、常を知るのが明と言っているので、母子の話とはマッチする。「小」は目に見えない微小なことだが、当たり前すぎて見落としがちなこととしておいた。{s:34}の常に無欲としても悪くはないが、子と小だから馴染みでは負ける。/柔軟に生きるのが強いか、柔弱な子を守るのが強いか。当たり前には老いて死ぬことも含まれるので、前者としておいた。/しかし、光ってなんだろう。どうやって用いるんだ?明が放つ光っぽいが、その明に復帰するんだから、母が放つ光であり、道の助けのことだろうか。弱いところにいて光を使うのなら、{s:40}の「弱者の用」が思い出される。/世の中の動きが暗→明→暗なら、明が暗を照らし、暗は明の助けで明に復帰する。母は子を当たり前に助け、子は当たり前に母となって子を助ける。どうだろう。*//*無遺身殃。是謂習常。:ここも身を家とした方がわかりやすい。*/','2011-10-03 17:30:43'),(53,53,'第五十三章','[使我介然有知、行於大道、唯施是畏。]大道甚夷、而民好徑。/朝甚除、田甚蕪、倉甚虚。服文綵、帶利劔、厭飮食、財貨有餘。/是謂盗夸。非道哉。','(我:われ)をして(介然:かいぜん)として(知:し)ること(有:あ)らしむ。(大道:たいどう)を(行:い)くに、(唯:ただ)(施:うつ)る、(是:これ)(畏:おそ)る。/[(大道:たいどう)は(甚:はなは)だ(夷:たいら)なれども、(民:たみ)は(径:こみち)を(好:この)む。]/(朝:ちょう)(甚:はなは)だ(除:ととの)えば、(田:た)(甚:はなは)だ(蕪:あ)れ、(倉:くら)(甚:はなは)だ(虚:むな)し。(文綵:ぶんさい)を(服:ふく)し、(利剣:りけん)を(帯:お)び、(飲食:いんしょく)に(厭:あ)き、(財貨:ざいか)に(余:あま)り(有:あ)り。(是:これ)を(盗夸:とうか)と(謂:い)う。(非道:ひどう)なる(哉:かな)。',NULL,NULL,'孤立してしまった私が人とは違う場所から世間を見て知ったことがある。大いなる道を行くときに気移りしてしまう。ただ、これだけが怖い。正道は平坦であるのに、世間の人はわざわざけもの道を通りたがる。//王朝をないがしろにして勝手に兵を動員するから、田畑は荒れ、食料庫はからっぽになる。そのくせ、きらびやかな服を着て、立派な刀を腰に帯び、飽きるほど飲み食いして、有り余る金品を溜め込んでいる。//これを盗人の親玉と言うのだ。なんと道から外れたことか。',NULL,'人の心の弱さを指摘する趣き深い章。//小市民たるもの、自分が正解だという自信があっても一人だと不安なものだ。ましてや他人が集団で別の道をいけば釣られて心変わりするかもしれない。//ところで、批判の対象は前半が民なのに、後半は貴族なんである。これは貴族の前で披露して「そうだ、そうだ近頃の民はけしからん」と同意を取らせ、後半でギャフンと言わせるトリックだろう。老子に言わせれば、王以外はみんな民なのかもしれない。//*使我介然有知:大道を歩いていたら、気がついたときには自分一人だった。振り返ると大勢の人が集まって何かをしている。それで自分が強い意志を持って道を歩いていることと、人々の誤りを知った。*//*行於大道、唯施是畏。:一人は心細い。道を行く時、人々の誘いに負けて気が変わってしまうことだけを警戒している。/施は現代ではほどこすという意味だが、それでは通りづらいか。一般的には「ななめ」と読み下すようで、邪道に行ってしまうことを意味するようだ。/ここでは気移りと読んだが、その真意は「有効な行いを実施してしまう」こととしたい。*//*大道甚夷、而民好徑。:大道は山道のようにつづら折りで遠回りだが、なだらかで歩きやすい。それなのに人々は近いからと言って、けもの道を通ろうとする。{s:41}には「夷道若纇」とある。こちらは平らな道をらせん状にたとえている。*//*朝甚除、田甚蕪、倉甚虚。:周王朝をないがしろにして、田畑を荒らし、納税をサボって蔵を空にする。まったく民といったら狡猾な連中だ。そう読める。しかし、後の文を読むと批判は民ではなく、諸侯だとわかる。周王朝をないがしろにしているのは諸侯で、内政も朝貢もしないで勝手に争って国財を食いつぶしている。/普遍的には「除」を除霊の儀式と読んで、王朝が過剰なほど綺麗になる様子とする。礼や儀式だけが立派になって、宮殿も建って道が掃き清められているのに、大切な庶民がいない。圧政の中ではありがちな構図である。現代の我々はそう解釈した方がありがたみがあるが、元は諸侯批判だろう。*//*服文綵、帶利劔:これらが許されるのは上層階級だけ。*//*是謂盗夸。非道哉。:盗夸はただの盗人ではなく、その親玉を言うようだ。*','2011-10-03 17:30:59'),(54,54,'第五十四章','[善建者不抜、善抱者不脱。]子孫以祭祀不輟。/修之於身、其徳乃眞。修之於家、其徳乃餘。修之於郷、其徳乃長。/修之於國、其徳乃豐。修之於天下、其徳乃普。/故以身觀身、以家觀家、以郷觀郷、以國觀國、以天下觀天下。/吾何以知天下然哉。以此。','(善:よ)く(建:た)つる(者:もの)は(抜:ぬ)けず、(善:よ)く(抱:いだ)く(者:もの)は(脱:ぬ)けず。(子孫:しそん)(以:もっ)て(祭祀:さいし)して(輟:や)まず。/(之:これ)を(身:み)に(修:おさ)むれば、(其:その)(徳:とく)(乃:すなわ)ち(真:しん)なり。(之:これ)を(家:いえ)に(修:おさ)むれば、(其:その)(徳:とく)(乃:すなわ)ち(余:あま)る。(之:これ)を(郷:ごう)に(修:おさ)むれば、(其:その)(徳:とく)(乃:すなわ)ち(長:ひさ)し。(之:これ)を(国:くに)に(修:おさ)むれば、(其:その)(徳:とく)(乃:すなわ)ち(豊:ゆた)かなり。(之:これ)を(天下:てんか)に(修:おさ)むれば、(其:その)(徳:とく)(乃:すなわ)ち(普:あまね)し。/(故:ゆえ)に[(身:み)を(以:もっ)て(身:み)を(観:み)、(家:いえ)を(以:もっ)て(家:いえ)を(観:み)、](郷:ごう)を(以:もっ)て(郷:ごう)を(観:み)、(国:くに)を(以:もっ)て(国:くに)を(観:み)、[(天下:てんか)を(以:もっ)て(天下:てんか)を(観:み)る。]/(吾:われ)(何:なに)を(以:もっ)て(天下:てんか)の(然:しか)るを(知:し)る(哉:や)。(此:こ)れを(以:もっ)てなり。',NULL,NULL,'しっかりと建ってるものは頑丈で、しっかりと抱えていれば落とさない。それができれば子孫は脈々と続いて、先祖である我々を祭ってくれるだろう。/これを個人が身につければ、彼の徳は充実した結晶となる。家族が身につければ、徳に余りがでる。村が身につければ、徳は長続きする。国が身につければ、徳は豊かになる。天下が身につければ、徳は世界中に広がる。/だから、人は自分を大切にし、家族は家全体の幸せを大切にし、村人は村全体の幸せを大切にし、国民は国全体の幸せを大切にし、天下人は天下全体の幸せを大切にする。/私がどうやって天下の自然な治まり方を知っているのは、これによってである。',NULL,'身を修めるといえば、儒教で四書と呼ばれるものの一つ「大学」だろうか。あちらでは、自分を修めた者が家を治め、家をしっかり治めた者が郷を治め、郷を治めた者が国を治めるべきだと言っている。だから、天下を牽引する者は誰よりも秀でた能力と人格を持っている必要がある。これは家を治める器量はあるが郷を治める器量を持たない人は郷を治める力を持った人には従わねばならず、郷を治めても国を治める力がなければ国を治める器の人材には従わねばならないという序列を作ることを意味する。それで人を導いて助けるためには勉学に励んで一段でも高いレベルに到達せねばならんから努力しろとなるわけだ。//老子は個人がしっかりしていれば国は自然に治まると考えたようだ。その「しっかり」は基礎工事を頑丈にして余分な物を持たないことだ。つまり、シンプルに生きること。修身すべき徳とは、儒教が提唱するような厳しい鍛錬や深い学問は必要ないということだ。理想的な家族とは、このような質素な個人の集まりである。この家族は常に家族全体の幸せを考えて、相談しながら生きる。そうなれば余りが出る。こういった余剰を集めていけば、国は豊かになる。だから、個人が人間としての基礎を押さえておけば、秀でた能力も階級による序列も必要ないのである。//この視点で言えば、孔子と老子の違いはトップダウンとボトムアップの違いということだ。これをどちらが勝るかで優劣をつけることは誰にもできないだろう。序列がないと言えば聞こえはいいが、世の中には一人で生きられない人がいる以上、身を持ち崩す人・没落を食い止められない家はあるからだ。助け合いをしていけば、どうしても頼む側と頼まれる側が生まれる。それがそのまま序列になってしまうからだ。まぁそんな難しいことを考えてもしょうがないので、器の小さい自分などは「身をもって身を見て」おけばいいか。//ところで、現代でも政治家に家族不和の問題が取り沙汰されると政治能力の不足を問われるが、儒教の影響があったりするのだろうか。//*善建者不抜:建物が抜けるとはおもしろい発想。脱げると韻を合わせたか。柱なら抜けるなのかな。*//*善抱者不脱:あれこれと抱いては落としてしまう。簡単だが大切なものを選ぶ。脱げないというからには、身にまとっているのかな。*//*子孫以祭祀不輟:自分が死んでも子孫は忘れず、墓参りを欠かさない。*//*修之於身、其徳乃眞。:「これ」とは「善建者不抜」「善抱者不脱」のこと。一言でいえば道。真は{s:21}や{s:41}に出てくる真と同じだろう。ものの中心にある堅く充実した何かが充満して溢れているっぽい。この章では徳のパワーが厚く集まって滲みでてくるイメージ。*/','2011-10-03 17:31:00'),(55,55,'第五十五章','[含徳之厚、比於赤子。/蜂蠆虺蛇不螫、]猛獣不據、攫鳥不搏。/骨弱筋柔而握固。未知牝牡之合而全作、精之至也。/終日號而不嗄、和之至也。/知和曰常、知常曰明。益生曰祥、心使氣曰強。/物壮則老、謂之不道。不道早已。','[(徳:とく)を(含:ふく)むことの(厚:あつ)きは、(赤子:せきし)に(比:ひ)す。]/(蜂蠆虺蛇:ほうたいきだ)も(螫:さ)さず、(猛獣:もうじゅう)も(拠:おそ)わず、(攫鳥:かくちょう)も(搏:う)たず。/(骨:ほね)は(弱:よわ)く(筋:すじ)は(柔:やわら)かくても(握:にぎ)りは(固:かた)し。(未:いま)だ(牝牡:ひんぼ)の(合:ごう)を(知:し)らずも(全:まった)くな(作:つく)りは、(精:せい)の(至:いた)り(也:なり)。/(終日:しゅうじつ)(号:さけ)びても(嗄:か)れざるは、(和:わ)の(至:いた)り(也:なり)。/(和:わ)を(知:し)るを(常:じょう)と(曰:い)い、(常:じょう)を(知:し)るを(明:めい)と(曰:い)う。(生:せい)を(益:ま)すを(祥:しょう)と(曰:い)い、(心:こころ)、(気:き)を(使:つか)うを(強:きょう)と(曰:い)う。/(物:もの)は(壮:さか)んなれば(則:すなわ)ち(老:お)ゆ。(是:これ)を(不道:ふどう)と(謂:い)う。(不道:ふどう)は(早:はや)く(已:や)む。',NULL,NULL,'徳が厚い人をたとえるなら、赤子だろう。/毒虫は刺さず、猛獣は襲ってこず、猛禽にも攫われない。/身体は発達していなくても、指はしっかり握れる。まだ性交を知らないながらも機能は万全だ。それらは、両親の精力の結果である。/昼夜問わず泣き叫んでも声が枯れないのは、両親の献身の結果である。/両親が赤子を献身的に世話することを知るのを常といい、これが当たり前に繰り返されることを知るのが明らかな知恵だ。生命を増やすことをめでたいことと言って、ここに心を使う気配りのある人を強いと言う。//人は強くなるほど頑固になる。これを不道と言って早死の要因だ。',NULL,'徳を備えるとはどんなことかを書いた章。 //まぁ何とも違和感がある章ですな。文字の置き方も不規則で美しさに欠けるし。/弱い赤ちゃんが強いことを説明したいのだろうけど、さすがに猛獣に襲われない理屈がわからん。普通に襲われますから。いくら喩え話でも無理がある。//最終的には赤子が襲われないのではなく、そもそもそんな危険な場所には置かれないのだと解釈した。/役に立たないどころかうるさいだけの赤ん坊が、なぜか大切にされて世話を受ける。放ってはおけない愛らしさ、これこそが徳なんである。/その愛を受けるためには、誰よりも弱い姿でひたすら純真に泣くことが必要。泣くのって簡単に思えるが、人には意地があるから、たとえ窮地に陥っても簡単には泣けないんだよね。仮に泣くことを覚えたとしても、こういった人は打算で泣くようになってしまう。素直に泣くことも徳のうちなんだ。//このような涙を見て助けたいと思うのは当たり前のこと。この助け合いを和と言う。特に親が子を愛する行為はずっと繰り返されてきた。この当たり前のことが理解できていることを明知という。これは{s:16}に出てくる命のリレーとも一致する。こういう小さな幸せが続くように心配りする人こそが本物の強者といえる。//なんか強引に辻褄を合わせた割には含蓄の深い話になったぞ。/勢いに乗ってもうちょい補足すると{s:28}に赤子の徳がある。赤子は世話をしてもらって知識を吸収しながら成長する。大人だって赤子のように至らなさを自覚して従順にしていれば急成長できるということだ。勉強はデキの悪い子ほど面倒みてもらえるし、従順さがない子は伸びにくい。だから、柔らかく弱くなれと言っている。//*蜂蠆虺蛇不螫:想像できる限りの危険な虫。*//*猛獣不據:據は拠で日本人にはピンと来ない。{s:50}でも、虎が爪でひっかくことを「措」と表現しているし、まず手を乗せてから引っ掻くイメージなんだろう。これはそういうもんだと受け流すよりない。*//*攫鳥不搏:こちらは猛禽が引っ掻く様。飛びすがりながら爪でひっさらって行くイメージ。*//*骨弱筋柔而握固:赤ちゃんの指の握りが固いのはわかる。徳を修めた者は弱虫に見えるが、抱いたものは話さない。それは{s:10}や{s:22}で抱いた「一」などのことだろう。*//*未知牝牡之合而全作、精之至也。:全は男性器、作は興ると同じで勃起を指す。/赤ちゃんが勃起するわけないが、性交を知らないけれど可能性は秘めているという意味には取れる。つまり、機能的な不全はない。そして、精力は充満している。/ここでは独自に解釈。精之至は和之至とあわせて両親の精としておいた。赤ん坊は精の行き着いた果てなんだから間違いではあるまい。*//*終日號而不嗄。和之至也。:赤ん坊は数時間おきに泣く。適度な休みと運動が調和していれば声は枯れないと考えても良い。そうは言っても放置されれば衰弱するしかないわけで、ここでは助けがあるからだとした。*//*知和曰常、知常曰明。:{s:16}では「復命曰常、知常曰明。」とある。*//*益生曰祥、心使氣曰強。:心で人を動かすと取れないこともない。{s:68}で人の力を利用することを言っているので禁止されるべきことではない。泣き落としで動かせる人を強いとできるが、それだと益生曰祥と噛み合わないか。*//*物壮則老、謂之不道。不道早已。:{s:30}にも同じフレーズがある。赤子の生命力を善とすると加齢が悪となる。それは老子らしくない。ここでは年齢ではなく柔軟さとしておいたが、ない方がよかったな。*/','2011-10-03 17:31:05'),(56,56,'第五十六章','[知者不言、言者不知。]/塞其兌、閉其門。挫其鋭、解其紛、和其光、同其塵、是謂玄同。/故不可得而親、不可得而疎。/不可得而利、不可得而害。/不可得而貴、不可得而賤。/故爲天下貴。','(知:し)る(者:もの)は(言:い)わず、(言:い)う(者:もの)は(知:し)らず。/[(其:その)(兌:たい)を(塞:ふさ)ぎ、(其:その)(門:もん)を(閉:と)じ、](其:その)(鋭:えい)を(挫:くじ)き、(其:その)(紛:ふん)を(解:と)き、(其:その)(光:ひかり)を(和:わ)し、[(其:その)(塵:ちり)に(同:おな)じくす。](是:これ)を(玄同:げんどう)と(謂:い)う。/(故:ゆえ)に(得:え)て(親:した)しむ(可:べ)からず、(得:え)て(疎:うと)んず(可:べ)からず。(得:え)て(利:り)する(可:べ)からず。(得:え)て(害:がい)する(可:べ)からず。(得:え)て(貴:たっと)くす(可:べ)からず。(得:え)て(賤:いや)しくす(可:べ)からず。/(故:ゆえ)に(天下:てんか)の(貴:たっと)きものと(為:な)る。',NULL,NULL,'知ってる人ほど黙ってる。知らない人ほどしゃべりたがる。//見たり聞いたりする穴をふさいで、べらべらしゃべる口を閉じる。鋭さをなくして、しがらみから解放される。輝かしさを抑えて、百凡と同じに生きる。これが究極の同化だ。//この技を身につけた人は、そばに置いて仲良くできないし、遠くにやって嫌うこともできない。/仲良くなって利用することもできないし、邪魔になったからといって招き寄せて殺害することもできない。/先生として尊敬を与えることもできないし、罪人として賤しめてやることもできない。//こんな人がいたなら、天下の貴人と認めてもいいのではないか。',NULL,'主語がないで何を言っているのか、さっぱりつかめない章。まぁどうとでも解釈してくださいってことか。//木を隠すなら森に隠せと言うように玄人も人の間に隠れれば安全だという話とした。//実際の所、人なんて権力者の手にかかれば人などどうにでもできてしまうものだ。得になりそうなら近づいて利用するし、損になりそうなら罪人に仕立て上げられる。優れた達人ほど興味を引きやすく被害に会いやすい。そこで身を隠す術である。//身を隠すといえば透明人間。透明人間のすごさは誰からも存在を認識できないところにある。だから「我こそは透明人間でござい!」などと自慢しない。そこに透明人間がいるとわかれば何らかの手段で捕獲できるのだから。知ってれば言わないとは、そういうことだ。//とはいえ、人間は寂しがり屋。誰かに認めて欲しい気持ちが勝って、隠れ続けることなど到底できない。これができるなら、確かに貴人といえるだろう。これに似た話は{s:70}にもあって、あちらでも貴人としている。//今回は隠れる技の紹介だったからか、聖人は出てこない。ただ隠れるだけが聖人ではないからか?/道の動きは無に返る。聖人は{s:2}や{s:9}のように身を退いて{s:5}のように中を守る。聖人は無に返って天下を取ることに成功したら、最後には中を守るために手を打つことになる。手っ取り早いのは人々に忘れられることだ。もしかしたら、この玄同がそれで、ここに聖人がでないのはすでに名を捨てたからかも。//*知者不言、言者不知。:よく見る言い回し。{s:81}では「知者不博、博者不知。」とある。*//*塞其兌、閉其門。:{s:52}に同じフレーズがある。{s:10}では「天門開闔」とあり、必ずしも門のすべてを閉じるわけじゃなさそうだ。*//*挫其鋭、解其紛、和其光、同其塵:{s:4}に同じフレーズがある。/頭脳明晰だと何かと頼られたり利用される。だから、無能でいることで複雑になった人間関係を断ち切る。/魅力を発揮しないことでクズのように誰からも顧みられない存在となる。/ここでは「姿を隠す」に主眼をおいたので、こういう解釈とした。*//*故爲天下貴:{s:62}にも同じフレーズが出る。*','2011-10-03 17:31:08'),(57,57,'第五十七章','[以正治國、以奇用兵、以無事取天下。]/吾何以知其然哉。以此。/天下多忌諱、而民彌貧、民多利器、國家滋昏、/人多智慧、邪事滋起、法令滋彰、盗賊多有。/故聖人云。/我無爲而民自化、我好靜而民自正、我無事而民自富、我無欲而民自樸。','(正:せい)を(以:もっ)て(国:くに)を(治:おさ)め、(奇:き)を(以:もっ)て(兵:へい)を(用:もち)い、(事:こと)(無:な)きを(以:もっ)て(天下:てんか)を(取:と)る。/(吾:われ)(何:なに)を(以:もっ)て(其:その)(然:しか)るを(知:し)る(哉:や)、(此:こ)れを(以:もっ)てなり。//(夫:そ)れ(天下:てんか)に(忌諱:きき)(多:おお)くして、(民:たみ)(弥々:いよいよ)(貧:まずし)く、(民:たみ)に(利器:りき)(多:おお)くして、(国家:こっか)(滋々:ますます)(昏:み)だれ、(民:たみ)に(智慧:ちえ)(多:おお)くして(邪事:じゃじ)(滋々:ますます)(起:お)こり、(法令:ほうれい)(滋々:ますます)(彰:あきら)かにして、(盗賊:とうぞく)(多:おお)く(有:あ)り。//(故:ゆえ)に(聖人:せいじん)は(云:い)う。/[(我:われ)(為:な)すこと(無:な)きにして(民:たみ)(自:おのず)から(化:か)し、](我:われ)(静:せい)を(好:この)みて(民:たみ)(自:おのず)から(正:ただ)しく、(我:われ)(事:こと)(無:な)きにして(民:たみ)(自:おのず)から(富:と)み、[(我:われ)(欲:よく)(無:な)きにして(民:たみ)(自:おのず)から(樸:ぼく)なり]と。',NULL,NULL,'正しさで国を治める。意外さで兵を用いる。事を起こさないで天下を取る。/私がなぜ、それが自然なやり方だと知ったか。こうである。//世の中が嫌なことばかりだと、人々はどんどん貧しくなる。人々が便利な道具をたくさん持つと、国はますます混乱してしまう。人々が知恵を付けすぎると、悪だくみが次々と起こる。法律がきっちりと制定されると、約束やぶりが多くなる。//だから、聖人は言う。/私は何もしないけれど、人々は自分の力で変化し、私は静かにしているけど、人々は自分の力で正しくあろうとし、私は何も事を起こさないけれど、人々は自分の力で豊かになり、私は何も望まないけど、人々は自分の力で素朴になる。',NULL,'政治について。//*以正治國:{s:8}では「正善治」とある。じゃあ、正しさとは何かと言うと、この章と{s:45}から、「何もしないで静かにしていること」だと言える。*//*以奇用兵:積極的に兵法について語っているのはここだけ。正面からぶつかることは避けて奇襲せよといったところか。しかし、奇襲の成功率は高くない。/徳を備えた者は赤ちゃんのように弱いので、まともに勝負すれば必ず負ける。{s:68}みたいに人の力を使って{s:55}のように助けてもらえと言ってるんでないか。*//*以無事取天下:天下取りのために大きな事業を興さない。計画的・戦略的なやり方はうまくいかない。{s:29}あたりが、それ。*//*天下多忌諱、而民彌貧:人々が忌み嫌うこと。ここでは戦争だろう。たびたび戦争が起これば葬式ばかりで貧しくなる。こういった「有事」がないのが「無事」。*//*民多利器、國家滋昏:「利器」は便利な道具だが、こういう道具はすぐさま戦争に使われる。ダイナマイトがいい例。/戦争が起きると勝つために新兵器開発が奨励されて民は勉強を始める。*//*人多智慧、邪事滋起:今でいう「悪」は「邪」の字で表したから、邪事とは悪事のこと。/兵器開発でつけた知恵が悪い方に働いて、敵を倒すためのはずだった兵器を内部抗争に利用してしまう。*//*法令滋彰、盗賊多有:内部抗争を食い止めるために法律ができるが、争いは収まらない。{s:18}でいうような騙し合いが始まり、細かい法律ができる。すると争いは地下に潜り法律の及ばない範囲で騙し合い足の引っ張り合いが起きる。*//*故聖人云:以下は聖人の言葉で冒頭の主張を補強している。*//*我無爲而民自化:{s:37}にも、無為なら、自ずから化すとある。*//*我好靜而民自正:{s:45}でも、「清靜爲天下正」とある。*//*我無事而民自富:戦争を起こさないから豊かになる。*/','2011-10-03 17:31:11'),(58,58,'第五十八章','[其政悶悶、其民淳淳。]其政察察、其民缺缺。/禍兮福之所倚、福兮禍之所伏。/孰知其極。其無正邪。正復爲奇、善復爲妖。/人之迷、其日固久。/是以聖人、方而不割。廉而不劌。直而不肆、光而不耀。','(其:その)(政:せい)(悶悶:もんもん)たれば、(其:その)(民:たみ)は(淳淳:じゅんじゅん)たり。/(其:その)(政:せい)(察察:さつさつ)たれば、(其:その)(民:たみ)は(缺缺:けつけつ)たり。/[(禍:わざわい)は(福:ふく)の(倚:よ)る(所:ところ)、(福:ふく)は(禍:わざわい)いの(伏:ふ)す(所:ところ)。]/(孰:た)れか(其:その)(極:きょく)を(知:し)らん。(其:それ)(正:せい)(邪:じゃ)(無:な)きか。/(正:せい)は(復:ま)た(奇:き)と(為:な)り、(善:ぜん)は(復:ま)た(妖:よう)と(為:な)る。(人:ひと)の(迷:まよ)えるや、(其:その)(日:じつ)(固:もと)より(久:ひさ)し。/(是:ここ)を(以:もっ)て(聖人:せいじん)は、(方:ほう)なるも(割:さ)かず、(廉:れん)なる(劌:そこな)わず、(直:ちょく)なるも(肆:の)びず、(光:ひかり)あるも(耀:かがや)かず。',NULL,NULL,'政治が苦しんで悩みぬいているなら、民は決めたことに素直に従ってくれる。政治が抜け目なく行き届いているなら、民はなにごとにも不足がちで苦しむことになる。//悪いところには幸運がやってくるし、幸せなところには不幸が潜んでいる。/だれか、その折り返し点を知っているだろうか。そこには善も悪もない。正義のつもりが悪になっていたり、よかれと思ってやったことが仇となったりする。人はそれでずいぶん長いこと悩んできた。//だから、聖人は何でもできるが誰にも使われず、潔癖さで相手を傷つけず、実直さで人を押しのけず、光るものを持ちながらも輝きを見せないのだ。',NULL,'複雑な世の中は一本調子ではいかないことを書いた章。//一度はうまくいったやり方もある時期になぜかうまくいかなくなることがある。以前は正義だったやり方もある時期に悪になることもある。しかし、それが何時反転するかは誰にも予測できない。また、反転までに所要する時間は善悪の差が大きいほど勢いがついて早くなる。だから、善悪に大きな差をつけず、どっちつかずな状態をキープして衝撃を避けようというのが老子の考え方だ。/よって、聖人は正義を振りかざさない。最初は人のためになって喜ばれたことも、いつしか当たり前になって邪魔にされてしまうものだ。人に頼まれてやっていたことで悪人にされてはかなわない。良いことだからといって精一杯やってしまっては、かえって混乱を起こす元だ。//*其政悶悶、其民淳淳。其政察察、其民缺缺。:{s:57}で利器や知恵の政治を否定したところを受け継いでいる。*//*孰知其極:頂点とはそれより上がないこと。だから、極の先は下がるのみ。*//*其無正邪。正復爲奇、善復爲妖。:正の極を過ぎて下れば邪へ向かう。邪も極を過ぎれば正へ向かう。常に正邪は繰り返されるから、正しい場所はない。*//*方而不割:聖人は使い勝手の良い四角形だが、{s:28}や{s:32}の樸のように割かない。有能ではあるが、表だって人に便利に使われることはない。/政治で言えば、時代のニーズに合った画期的な制度は採用しない。*//*廉而不劌:潔癖な人の前では軽微な悪も邪悪となってプライドを傷つける。/政治で言えば、法律で明確な線引きをすれば当落線上で明暗が分かれてしまう。*//*直而不肆:善を行うことを邪魔する者はいない。やりたい放題だが、安売りはしない。/政治で言えば、誰からも批判が出来ない事情を含んだ制度に肩入れしない。*/','2011-10-03 17:31:15'),(59,59,'第五十九章','[治人事天、莫若嗇。]夫唯嗇、是謂早服。/早服、謂之重積徳。重積徳、則無不克。/無不克、則莫知其極。莫知其極、可以有國。/有國之母、可以長久。是謂深根固柢、長生久視之道。','[(人:ひと)を(治:おさ)め(天:てん)に(事:つか)うるは、(嗇:しょく)に(若:し)くは(莫:な)し。](夫:そ)れ(唯:ただ)(嗇:しょく)、(是:これ)を(早:はや)く(服:ふく)すと(謂:い)う。//(早:はや)く(服:ふく)するは、(之:これ)を(重:かさ)ねて(徳:とく)を(積:つ)むと謂う。(重:かさ)ねて(徳:とく)を(積:つ)めば、(則:すなわ)ち(克:か)たざる(無:な)し。/(克:か)たざる(無:な)ければ、(則:すなわ)ち(其:その)(極:きょく)を(知:し)る(莫:な)し。(其:その)(極:きょく)を(知:し)る(莫:な)ければ、(以:もっ)て(国:くに)を(有:たも)つべし。//(国:くに)を(有:たも)つの(母:はは)は、(以:もっ)て(長久:ちょうきゅう)なる(可:べ)し。(是:これ)を、(根:こん)を(深:ふか)くし(柢:てい)を(固:かた)くし、(長生久視:ちょうせいきゅうし)の(道:みち)と(謂:い)う。',NULL,NULL,'人をまとめて天に従うなら、倹約に勝るものはない。ただ倹約して、早く本来の仕事に向かう。//早く道を行えば、効果的に徳を積み重ねられるということだ。徳を積み重ねれば、乗り越えられない障害はない。/乗り越えられない障害がないと自信がつけば、極端なことをしないですむ。極端でなければ安定した国を興せるだろう。//国が興きる理屈は普遍である。これを「広く深くしっかりと根を張ること」と言って、これこそが、永い治世と長い歴史を見る道なのだ。',NULL,'わかりやすい成果を挙げるよりも目立たないところを疎かにせず着実に足もとから固めることの大切さを教える。//嗇は「ものおしみ」という意味だが、倹約とした。これは金銭面だけに限定したケチでなく、時間や体力も節約することを言う。倹約は{s:67}に出てくる「三つの宝」で二番目に大切にするもの。//贅沢をしたいから道に従う時期を先延ばしにするのはありがち。しかし、さっさと諦めて道に入れば国が勃興するほどの地力がつく。/これは不変の法則だから、安心して専念すればよい。//*夫唯嗇、是謂早服。:早服はさっさとあきらめて屈服すること。軍隊式のトレーニングでは、最下位にはペナルティがある。罰を受けたくないから精一杯競争するが、本当のケチは、さっさと負けてお互いの力を残す。誰でも罰は嫌いだが、負けたくないプライドがそうさせない。*//*早服、謂之重積徳。:徳を厚く備えたのが赤子。意地を張らずに弱さを認める。*//*重積徳、則無不克。無不克、則莫知其極。:{s:28}は、雌雄・栄辱を共に知って徳を備えて極がなければ樸となり、聖人となる話。/赤子という話であれば意地を張って勝負に出ることがないので負けない。不争の徳と同じ。*//*莫知其極、可以有國。:誰とも敵対しなければ人をまとめることができる。これが国の作り方の基本である。*//*有國之母、可以長久。:母というのは道のように万物を生み出す力。国の作り方は今も昔もこれからも変わることはない。*//*深根固柢:目に見えないところで根回しして戦わないで人を集めるのが物事の基本。*//*長生久視之道:こうやって王になれば大切にされ、長生きできるが、死んでからも先祖供養の祭りで子孫らを天国から見ることができる。/「有國之母」の永続性をもう一度繰り返していると考えてもよいか。*/','2011-10-03 17:31:17'),(60,60,'第六十章','[治大國、若烹小鮮。]/以道莅天下、其鬼不神。/非其鬼不神、其神不傷人。非其神不傷人、聖人亦不傷人。/夫兩不相傷。故徳交歸焉。','[(大国:たいこく)を(治:おさ)むるは、(小鮮:しょうせん)を(烹:に)るが(若:ごと)し。]/(道:みち)を(以:もっ)て(天下:てんか)に(莅:のぞ)めば、(其:その)(鬼:き)、(神:しん)ならず。/(其:その)(鬼:き)、(神:しん)ならざるに(非:あら)ず、(其:その)(神:しん)、(人:ひと)を(傷:そこな)わず。(其:その)(神:しん)、(人:ひと)を(傷:そこな)わざるに(非:あら)ず、(聖人:せいじん)も(亦:また)(人:ひと)を(傷:そこな)わず。/(夫:そ)の(両:ふた)つ(相:あい)(傷:そこな)わず。(故:ゆえ)に(徳:とく)(交:こも)ごも(帰:き)す。',NULL,NULL,'大国を治めるには小魚を煮るようにいじり回さないことだ。/道のように無為につとめた政治をすれば、鬼神は神通力を失うのだ。//厳密に言えば、鬼神から神通力が消えるのではない、神が人類に害をなさないのだ。さらに厳密に言えば、神が人類に害をなさないのではない、聖人もまた人類に害をなさないのだ。//鬼神と聖人はどちらも災いをなさないから、徳が交わるのだ。',NULL,'まったく理屈がわからん。ただでさえ難解な老子の論法で当時の民俗信仰が題材にされていては素人には理解不能。//言いたいことは「煮魚は身を崩さないようにひっくり返さないで調理するように、大国の政治はむやみに介入しない方が良い」ってことらしい。//鬼神についても謎が多い。日本人からはなかなか正体が掴みづらいが、鬼と神は鬼神とセットにされてて同格っぽい。鬼は悪霊のことで祟りで人に危害を加える。神はそのまま神のことで政治や人の行いが悪いと天災を起こして人に危害を加える。日本の場合、厄病神みたいに悪さをするのも神だが、中国では鬼として扱われるのかな。いずれにしても人に危害を与える恐るべき存在。//それらを前提に想像力を働かせたいところだが、それと聖人と無介入な政治とどう関係するのか。//鬼神は人にとって恐ろしい存在ではあるが、鬼神に次いで恐ろしいのは人を超越した大国の王。だから、人が鬼神を恐れて供物を絶やさないように民は王を恐れて顔色を窺って寄進する。そこへの対処が無為だということか。//道を得た聖人の政治は民に干渉しない「無為」である。そんな政治に鬼神も感化され、神の民たる人類に干渉しなくなってくる。すると鬼神と聖人どちらも人に危害を加えなくなるから、みなが譲り合って仲良くなる。//だから、大国を治める主はむやみに民に干渉してはいけないのだ。//こんな感じで聖人は鬼神までも上手に手なずけられる話となった。もしかしたら、道の位は神より上だから、道を得た聖人は神より上と言いたいのかも。/','2011-10-03 17:31:20'),(61,61,'第六十一章','[大國者下流。天下之交、天下之牝。]牝常以靜勝牡。以靜爲下。/故大國以下小國、則取小國。小國以下大國、則取大國。/故或下以取、或下而取。大國不過欲兼畜人、小國不過欲入事人。/夫兩者、各得其所欲、大者宜爲下。','[(大国:たいこく)の(者:もの)は(下流:かりゅう)なり。](天下:てんか)の(交:こう)なり、(天下:てんか)の(牝:ひん)なり。(牝:ひん)は(常:つね)に(静:せい)を(以:もっ)て(牡:ぼ)に(勝:か)つ。(静:せい)を(以:もっ)て(下:くだ)るを(為:な)すなり。/(故:ゆえ)に(大国:たいこく)(以:もっ)て(小国:しょうこく)に(下:くだ)れば、(則:すなわ)ち(小国:しょうこく)を(取:と)り、(小国:しょうこく)(以:もっ)て(大国:たいこく)に(下:くだ)れば、(則:すなわ)ち(大国:たいこく)を(取:と)る。/(故:ゆえ)に(或:ある)いは(下:くだ)りて(取:と)り、(或:ある)いは(下:くだ)りて(而:しか)して(取:と)る。(大国:たいこく)は(兼:か)ねて(人:ひと)を(畜:やしな)わんと(欲:ほっ)するに(過:す)ぎず、(小国:しょうこく)は(入:い)りて(人:ひと)に(事:つか)えんと(欲:ほっ)するに(過:す)ぎず。/(夫:そ)れ(両者:りょうしゃ)、(各:おの)おの(其:その)(欲:ほっ)する(所:ところ)を(得:え)んとすれば、(大:だい)なる(者:もの)(宜:よろ)しく(下:くだ)ることを(為:な)すべし。',NULL,NULL,'国同士の付き合いでは川下に回る方が大国だ。天下の合流点であり、天下を引き受けるものだ。女は静かさでは常に男に勝つ。そして、静かに下がって行動する。//だから、大国は小国にへりくだることで、小国を取る。また、小国は大国の下に回ることで、大国の支援を得ることができる。/つまり、一方はへりくだることで国ごと取り、一方は配下になることで庇護を得る。大国は迎え入れて相手を養うだけでよい。小国は入っていって相手を助けるだけでよい。/それだけでどちらも必要なものが手に入る。大物こそ、へりくだった態度で挨拶するとよい。',NULL,'エッチな話?下で仰向けに寝転がってるだけで男に勝つとか。いつも負けっぱなしな人にはギクリとする解釈になったりして。//冗談はさておき。まぁ男女の交わりで考えてもいいんだけど、生活態度でもいいんではないか。女のほうがおしとやかで亭主より一歩引いたところにいて、よく世話をする。男は外で動きまわって働く。/男は女を養うだけであり、女は嫁に入って家を支えるだけである。そして、男は女の家に頭を下げに行く。//もっとも、付き合いってのは、信頼関係がすべてだから、どこかでボタンを掛け違うと何もかもが上手くいかないだろうけどね。不信に陥った両者にこんな提案は少しお人好しすぎると思う。国同士の付き合いならなおさら。/しかし、拮抗状態の膠着を打破できるのは頭を下げるのが一番早く、大物ほどそれを許せる度量を持ち得やすい。面倒見の良い者が頭を下げるんだから、慕われないわけがない。//*大國者下流:{s:66}では、海は一番低い場所にあるから、川の王者だとある。*//*牝常以靜勝牡:{s:26}では、「靜爲躁君」とあり、{s:45}では、「靜勝熱」とある。*//*故或下以取、或下而取。:お互い下ることで、取ることもあれば、取られるところもある。*/','2011-10-03 17:31:23'),(62,62,'第六十二章','[道者萬物之奥。善人之寳。不善人之所保。]/美言可以市尊、美行可以加人。人之不善、何棄之有。/故立天子、置三公。雖有拱璧以先駟馬、不如坐進此道。/古之所以貴此道者何。不曰求以得、有罪以免耶。/故爲天下貴。','[(道:みち)なる(者:もの)は(万物:ばんぶつ)の(奥:おう)。(善人:ぜんにん)の(宝:たから)。](不善人:ふぜんにん)の(保:やす)んずる(所:ところ)。/(美言:びげん)は(以:もっ)て(尊:そん)を(市:か)う(可:べ)く、(美行:びこう)は(以:もっ)て(人:ひと)に(加:くわ)うべし。(人:ひと)の(不善:ふぜん)なるも、(何:なん)の(棄:す)つることか(之:これ)(有:あ)らん。/(故:ゆえ)に(天子:てんし)を(立:た)て、(三公:さんこう)を(置:お)くに、(拱璧:こうへき)(以:もっ)て(駟馬:しば)に(先:さき)んずる(有:あ)りと(雖:いえ)ども、(坐:ざ)して(此:この)(道:みち)を(進:すす)むに(如:しか)ず。/(古:いにえ)えの(此:この)(道:みち)を(貴:たっと)ぶ(所以:ゆえん)の(者:もの)は、(何:なん)そ。(求:もと)むれば(以:もっ)て(得:え)られ、(罪:つみ)(有:あ)るも(以:もっ)て(免:まぬが)れると(曰:いわ)ず(耶:や)。/(故:ゆえ)に(天下:てんか)の(貴:たっと)きものと(為:な)る。',NULL,NULL,'道を行く者はあらゆる物の根本を極めており、善人が尊敬する存在であり、悪人が頼る庇護者である。/善人には感動的な言葉をかけて尊敬してやり、悪人には素晴らしい行いをしてあげて仲間になってもらう。人が軽薄なことをしたとして、どうして罪人とできようか。//だから、天子の即位式では三公の貴人を任命する儀式があるが、豪奢な馬車の前にかかえるほど大きな宝石を担いで行進するような立派な式ごときでは、座って道を行うことには敵わない。//太古から道を貴いものとするのはどんな人だったか。救いを求めればそれを得られ、罪を犯しても救ってくれる者ではなかったか。/だから道の者は天下の貴人なのである。',NULL,'道を極めた聖人は人の善悪の価値観を超越しているから誰よりも貴いことを書いた章。//これまた難解なであるが、聖人の価値観は{s:20}のように善と悪に差はないと考えた。また、{s:27}のように善人が悪人を愛してやれば善人になるのだから見捨ててはいけないとも言い、善人は尊敬されて悪人は愛されるのが良好な関係だとしておいた。//*道者萬物之奥:「奥」とは何か。道は宇宙を生んだ存在であり、この世で最も古い存在。だから、道に近づくことは歴史を遡って原始に近づくこと。万物の最も古い姿を得た者は全人類のもっとも奥にいることになる。*//*善人之寳。不善人之所保。:尊敬されるべき善人の中でも最も善なる聖人は善人の理想。聖人は{s:27}のように人を善悪で分けないから悪人とっても頼れる存在。*//*美言可以市尊:「美言」は{s:81}でいう「信頼できない美辞麗句」とするか、文字通りの「美しい言葉」とするか悩むところ。/市は取引といったところだから、「市尊」は「美言」と「尊」を交換するとなる。/その取引を「お世辞を売って尊敬を買う」とするなら、出世の足掛かりとして褒め合いをすることとなる。「心を打つ言葉で尊敬を得る」なら、優しさを与えて改心させることとなる。/聖人はその取引で悪人を救うんだと考えれば、{s:27}の悪人を愛することと似ている分、後者が強いと判断できそうだが、もう少し考えたい。この章は善と悪を対立させてるので、善人には美言、悪人には美行と言う構成なんじゃないか。となれば、悪人の不始末を押し付けられる善人を感動的な言葉で慰撫してやって苦しみをやわらげると解釈できるのではないか。*//*美行可以加人:「美行」も上に同じく「形式だけの行い」ではなく、文字通りの「美しい行い」とした。/「加人」は仲間を募って人を与党を加えていくこと。/つまり、「善行で仲間を集めること」となる。/もう一つの解釈であれば「力を得るために騙す同然に仲間を集める」となるが、この案は取り下げた。*//*人之不善、何棄之有。:「棄」は見捨てるとしたほうがわかりやすいか。ニュアンスとしては、罪人として追放するとした方が近いかも。*//*故立天子、置三公。:三公と呼ばれそうな役職はいくつかあるが、いずれも臣下では最高の位。貴人としておけば間違いはない。*//*雖有拱璧以先駟馬:璧は美しい石。拱は抱えるほどの大きさ。御影石とか大理石のようなイメージか。即位祝いに各国の王が贈呈するものらしい。*//*不如坐進此道:馬車にふんぞり返って座って我が物顔で道を進むわけではない。*//*不曰求以得、有罪以免耶。:誰をも救う意味だが、悪人だけに力を絞って救うよりは善人と悪人どちらも救うことにしたい。よって、善人が苦しみから解放されるような求めを受け止めながらも、悪人を処罰しないような姿となる。*//*故爲天下貴:誰も傷つけないから貴いということだろう。*/','2011-10-03 17:31:26'),(63,63,'第六十三章','[爲無爲、事無事、味無味。]大小多少、報怨以徳。/圖難於其易、爲大於其細。/天下難事、必作於易、天下大事、必作於細。/是以聖人、終不爲大。故能成其大。/夫輕諾必寡信、多易必多難。是以聖人猶難之。故終無難矣。','(無為:むい)を(為:な)し、(無事:ぶじ)を(事:こと)とし、(無味:むみ)を(味:あじ)わう。(小:しょう)を(大:だい)とし(少:しょう)を(多:た)とし、(怨:うら)みに(報:むく)いるに(徳:とく)を(以:もっ)てす。/(難:むずか)しきを(其:その)(易:やす)きに(図:はか)り、(大:だい)を(其:その)(細:ちいさ)きに(為:な)す。/(天下:てんか)の(難事:なんじ)は(必:かなら)ず(易:やす)きより(起:お)こり、(天下:てんか)の(大事:だいじ)は(必:かなら)ず(細:ちいさ)きより(作:お)こる。/(是:これ)を(以:もっ)て(聖人:せいじん)は、(終:つい)に(大:だい)を(為:な)さず。(故:ゆえ)に(能:よ)く(其:その)(大:だい)を(為:な)す。/(夫:そ)れ、[(軽:かる)く(諾:だく)すれば(必:かなら)ず(信:しん)(寡:すく)なく、(易:やす)きを(多:おお)きとすれば(必:かなら)ず(難:むずか)しきこと(多:おお)し。]/(是:これ)を(以:もっ)て(聖人:せいじん)は(猶:なお)(之:これ)を(難:むずか)しとす。(故:ゆえ)に(終:つい)に(難:むずか)しきこと(無:な)し。',NULL,NULL,'何もしないでいられるように努め、無事であることを仕事とし、味気ない毎日を味わう。小さいものを大きくし、少ないものには多くを与え、恨まれれば施しを与えて慰める。/難しい問題は未然の発見で簡単なうちに処理し、大きな問題は細分化して考える。大難題や大事件は必ず些細なところから発生する。//だから聖人は最後まで偉大な仕事をしない。だから、大きいことができるのだ。/安請け合いしたことは信頼に足るほどの成功率がなく、簡単だと思ったものは意外に難しいものだ。聖人はまだまだ難しいと考えるから、最後まで無難に仕上げるのだ。',NULL,'仕事論にも通じるので、共感を覚える人も多いだろう。上司の机にでも貼り付けてやるといい。しかし、よく読むと、この章はプロジェクトリーダーではなく、トップマネジメントのためのものだ。//平凡な毎日は退屈でうんざりしがちだ。しかし、それは、当たり前にあるものではない。様々な幸運の上に成り立っており、無くなってはじめて大切だと気付くものなのだ。平凡を持続させることほど難しいことはない。それなのに人間は、刺激を求めて大きな手柄を立てたがる。小さなリスクを無視して動くから大事件が発生し、それを押さえて手柄にしてしまう。//聖人の仕事は平凡でありつづけることだ。平穏無事な毎日を送るために、眼に見えない小さな仕事をこなし、面白くもない生活を堪能しながら、微かな雑味を感じ取って対応する。すべては未然に処理される。大事件も起きないから手柄を立てる機会もない。平凡すぎてなにひとつ功績がなく、誰も偉大だと気づかない。それでこそ偉大な成果を打ち立てたことになり、居なくなってはじめて人々は彼の偉大さを知る。それが聖人のあり方だ。//*爲無爲、事無事、味無味。:必要最低限の仕事ですむような仕事にするための工夫をする。トップが暇なのは異常事態が起きていない証拠なので、仕事がないことに感謝し、仕事が発生しないように目を光らす。{s:35}にも道を行くのは無味とある。*//*大小多少、報怨以徳。:全体的な文脈から見れば「小さい・少ないを軽く見ないで大きい・多いと考えよ」なのだが、それだと「報怨以徳」だけが孤立して浮いちゃうんだよね。だから、{s:77}のような作用で不満をなくすことが無味な毎日の始まりをもたらすものとした。/「報怨以徳」はことわざにもなっている。一方、孔子は「以直報怨」と言っている。/ところで、老子の「徳」とは弱くて情けないこと。嫉妬されたら惨めに泣いて怨みをかわすのが老子の対処法なのかも。*//*終不爲大。故能成其大。:簡単な問題ばかりをクリアしても功績にはならない。しかし、名誉にとらわれず、問題を未然に処理するような地味な仕事を持続することで大きな結果を残せる。{s:34}にも「終不自大、故能成其大。」とある。*/','2011-10-03 17:31:33'),(64,64,'第六十四章','[其安易持、其未兆易謀、其脆易破、]其微易散。爲之於未有、治之於未亂。/合抱之木、生於毫末、九層之臺、起於累土、千里之行、始於足下。爲者敗之、執者失之。/是以聖人、無爲、故無敗。無執、故無失。民之從事、常於幾成而敗之。愼終如始、則無敗事。/是以聖人欲不欲、不貴難得之貨。學不學、復衆人之所過。以輔萬物之自然、而不敢爲。','(其:その)(安:やす)きは(持:も)ち(易:やす)く、(其:その)(未:いま)だ(兆:きざ)さざるは(謀:はか)り(易:やす)く、(其:その)(脆:もろ)きは(破:やぶ)り(易:やす)く、(其:その)(微:わずか)なるは(散:ち)り(易:やす)し。(之:これ)を(未:いま)だ(有:あ)るに(為:な)し、(之:これ)を(未:いま)だ(乱:みだ)るるに(治:おさ)む。/(合抱:ごうほう)の(木:き)は、(毫末:ごうまつ)より(生:しょう)じ、(九層:きゅうそう)の(台:だい)は、(累土:るいど)より(起:お)こり、(千里:せんり)の(行:こう)は、(足下:そっか)より(始:はじ)まる。(為:な)す(者:もの)は(之:これ)を(敗:やぶ)り、(執:と)る(者:もの)は(之:これ)を(失:うしな)う。/(是:これ)を(以:もっ)て(聖人:せいじん)は、(為:な)すこと(無:な)きが(故:ゆえ)に(敗:やぶ)るること(無:な)し。(執:と)ること(無:な)きが(故:ゆえ)に失うこと(無:な)し。(民:たみ)の(従事:じゅうじ)、(常:つね)に(幾:ほとんど)(成:な)るに(之:これ)に(敗:やぶ)るる。[(終:おわ)りを(慎:つつ)しむこと(始:はじ)めの(如:ごと)くなれば、(則:すなわち)(敗:やぶ)るる(事:こと)(無:な)し。]/(是:これ)を(以:もっ)て(聖人:せいじん)は(欲:ほっ)さざるを(欲:ほっ)し、(得:え)(難:がた)きの(貨:か)を(貴:たっと)ばず。(学:まな)ばざるを(学:まな)び、(衆人:しゅうじん)の(過:す)ぐる(所:ところ)に(復:かえ)る。(以:もっ)て(万物:ばんぶつ)の(自:おのず)から(然:しか)るところを(輔:たす)けて、(敢:あ)えて(為:な)さず。',NULL,NULL,'安定したうちは維持しやすく、兆候も見えないうちなら対処しやすく、基礎が固まる前には壊れやすく、わずかなものは消えてなくなりやすい。有為に発展する前に処置し、混乱が起きる前に手当しておく。//周囲が何mもあるような大木も、生まれたときには毛先ほどのか弱さで、何層もの段を積み重ねた立派な展望台も、積み上げ始めは一つの土嚢しかなく、千里の旅も足下の第一歩から始まる。やってしまうと失敗し、制御しようとしても失敗する。//そこで聖人は、やらないことで失敗を避け、制御しようとしないことで失敗を免れる。世間の指導者が民の支配に当たるとき、ほとんど達成しているにもかかわらず失敗する。最後の詰めこそ始まりの時のように慎ましやかにしていれば失敗することはないのだが。//だから、聖人は欲を持たないことを求め、希少な宝を貴重とせず、学ばないで済む方法を学び、大衆が通り過ぎた質素な暮らしに戻って行く。そして、あらゆる物が自律的に活動できるように助けながら、それでいて何もしないのだ。',NULL,'良いことを言っているようだが案外ちぐはぐ。//一段目は{s:63}の続きとしてトラブルは未然に防ぐよう進言してるが、次の段では小さいことから大きなことができるとしている。トラブル対策であれば、大木になる前に潰せという意味合いになる。字面では小さな積み重ねで大事業がなるような感じだが。/しかし、次の段では聖人は無為を行うと言っているから、小さなことを行って大きなことを為すなら、これまた話がおかしくなる。小さくとも動けば有為ではないか。/さらに終わりは始めと同じようにしろと言っているから、無為のくせに始めが存在するという納得いかない展開になってしまっている。//一般的な解釈は、小さいうちは潰れやすいが大きいことは小さいことの積み重ねでできているので終わりに近づいた時も小さくて潰れやすかったときと同じように慎重にやれ、というもの。/誰にも異論のない良い話。しかし、積み重ねって老子らしくない。//そこで、一段目は心の安定の脆さ、二段目は心の暴走、三段目は対処としての無為、結論は無為無欲、としてみた。//王者は天下取りに成功するが、最初は謙虚で小さく生きていたのに慢心してしまう。やることがなくなって小さな欲を出してしまう。次第に欲が止まらなくなって大きな動揺を起こしてしまう。/天下を取るだけではまだ道の中途とし、最後には庶民に戻ることで完成とする。ハングリーだった駆け出し時代を忘れずに立ち戻る。これが平凡な王者がついつい忘れる最後の一歩だろう。//かえって違和感が出てしまったか。まぁ一つくらい乱暴な解釈をする人がいても悪くあるまい。//*其安易持、其未兆易謀、其脆易破、其微易散。爲之於未有、治之於未亂。:心が安定して動き出す前であれば落ち着けることができる。一度動いてしまうと抑えられない。*//*合抱之木、生於毫末、九層之臺、起於累土、千里之行、始於足下。:わずかであっても心が揺らいでしまうと、やがては大きな揺れへと発展する。/大木で宮殿を建てさせ、巨大な展望台を作らせ、千里の行軍を命じるのは安定した王の座を得た者が始めてしまう愚行の代表例。*//*爲者敗之、執者失之。:やろうとすると心が動いて失敗する。やらせようとしても失敗する。大規模土木工事や外征をやったり、やらせたりすれば失敗する。{s:29}に同じフレーズがある。*//*愼終如始、則無敗事。:詰めの一歩こそ難しい。「功成、名遂、身退」終わりの一歩が踏めるか。*//*欲不欲、不貴難得之貨、學不學:なんでもできる人にとって最も難しいことは何もしないこと。/できるが故に難しいことに挑戦してしまう。/学ぶ必要がなくなれば学ばないほうが良い。腕のいいハッカーはプログラムを組まなくて済むプログラムを組むことに余念がない。*//*復衆人之所過:発展して富を得た庶民よりも質素な暮らしにもどる。/文明的に通り過ぎてしまった、原始的で古臭い生活に返っていく。*//*輔萬物之自然、而不敢爲。:あらゆる物には自律的な力があるので、それがうまく働くように助けてやるだけで、自分が手を下さなくても勝手にやる。子育ては、何から何まで世話を焼くより、できることは子供にやらせてあげたほうが良い。病気も必要なところだけ医学で助けて、あとは患者の回復力に任せたほうが良い。民が独力で生きていけるように見守る。*/','2011-10-03 17:31:46'),(65,65,'第六十五章','[古之善爲道者、非以明民、將以愚之。]民之難治、以其智多。/故以智治國、國之賊。不以智治國、國之福。/知此兩者、亦稽式。常知稽式、是謂玄徳。/玄徳深矣、遠矣。與物反矣、然後乃至大順。','(古:いにしえ)の(善:よ)く(道:みち)を(為:な)す(者:もの)は、(以:もっ)て(民:たみ)を(明:あき)らかにするに(非:あら)ず。(将:まさ)に(以:もっ)て(之:これ)を(愚:おろ)かにせんとす。(民:たみ)の(治:おさ)め(難:がた)きは、(其:その)(智:ち)(多:おお)きを(以:もっ)てなり。/(故:ゆえ)に(智:ち)を(以:もっ)て(国:くに)を(治:おさ)むるは、(国:くに)の(賊:ぞく)。(智:ち)を(以:もっ)て(国:くに)を(治:おさ)めざるは(国:くに)の(福:ふく)なり。/(此:この)(両者:りょうしゃ)を(知:し)るは、(亦:また)(稽式:けいしき)なり。(常:つね)に(稽式:けいしき)を(知:し)る、(是:これ)を(玄徳:げんとく)と(謂:い)う。/[(玄徳:げんとく)は(深:ふか)し、(遠:とお)し。(物:もの)と(与:とも)に(反:かえ)る。](然:しか)る(後:のち)(乃:すなわ)ち(大順:たいじゅん)に(至:いた)る。',NULL,NULL,'太古の聖人は、民を教育せず愚かにして国を治めた。今、民を治めるのが困難なのは、民に知恵がつきすぎたからだ。/つまり、知識で国を治めようとする者らは国にとって害悪であり、知識を使わずに国を治めようとする者こそが国に幸福をもたらすのだ。//この両者を知ることは国民の良い手本とはなんたるかを考えることである。これを実践し続けることを玄徳という。/玄徳は深いのである。遠いのである。物とともに返るのである。その手順が実施された後には、大いなる順序が巡ってくるのである。',NULL,'どう見ても愚民政策。そうすべき理屈はこうらしい。//昔の偉大な指導者は誠実だった。民はそれを手本として皆誠実に生きたから上手に治まった。つまり、賢く生きるより「愚か」といわれるほど誠実に生きたほうが支配しやすい。しかし、多くの支配者は狡賢く支配してしいる。民はそれを手本として狡く生きる。よって支配しづらい。だから、賢さを与えるより誠実さを与えた方が幸せになれる。//現実的かどうかを置いておけば、論法としてはオーソドックスかな。愚民政策としては{s:3}。愚民のモデルが{t:14}であることは間違いない。知恵で治めることの是非は{t:18}にまとめた。//老子のわからないところは、ここでただ智をやめろと言わないで、両方知っておけと言ってるところ。{s:28}にもあるように、式とは、一方に偏らず、両方知った上で害のないほうにいることのようだ。これを民が手本として真似するんだから、愚民といいながらも案外賢くて、それでいて愚かなふりをしているのかもしれない。そもそも{s:3}で愚明政策を支持した理由は{s:2}で比較が差別をもたらすからだったはず。皆が賢くなるのは難しいが、愚かな方向で統一することは不可能ではない。ただ、裏切り者が出たら終わりで、短期的には裏切った方が得だから簡単には成立しないだろうけど。//*玄徳深矣、遠矣。與物反矣:{s:25}と補いあっていると考えていい。/道の動きは循環するから、道に近い玄徳も循環すると考えてよい。/道が無→有→無と循環すれば必ず有、つまり物が生まれるのだから、遠くまで行った後、一巡して帰ってこれば物が残っているんだろう。明→愚→明→愚を繰り返しているうちに物が溜まって豊かになるんかなぁ。*//*然後乃至大順:大順は振り出しに戻る感じでいいのかな。十進数が9の次に0に戻るみたいに。繰り上がりが「物とともに」なのかな。*/','2011-10-03 17:31:51'),(66,66,'第六十六章','[江海所以能爲百谷王者、以其善下之]、故能爲百谷王。/是以欲上民、必以言下之、欲先民、必以身後之。/是以聖人、處上而民不重、處前而民不害。/是以天下樂推而不厭。以其不爭、故天下莫能與之爭。','(江海:こうかい)の(能:よ)く(百谷:ひゃっこく)の(王:おう)(為:た)る(所以:ゆえん)の(者:もの)は、(其:その)(善:よ)く(之:これ)に(下:くだ)るを(以:もっ)て、(故:ゆえ)に(能:よ)く(百谷:ひゃっこく)の(王:おう)(為:た)り。/(是:これ)を(以:もっ)て(民:たみ)の(上:かみ)たらんと(欲:ほっ)すれば、(必:かなら)ず(言:げん)を(以:もっ)て(之:これ)に(下:くだ)り、[(民:たみ)の(先:さき)たらんと(欲:ほっ)すれば、(必:かなら)ず(身:み)を(以:もっ)て(之:これ)に(後:おく)る。]/(是:これ)を(以:もっ)て(聖人:せいじん)は、(上:かみ)に(処:お)るも(民:たみ)は(重:おも)しとせず、(前:まえ)に(処:お)るも(民:たみ)は(害:がい)とせず。/(是:これ)を(以:もっ)て(天下:てんか)は(推:お)すことを(楽:たの)しんで(厭:いと)わず。(其:その)(争:あわそ)わざるを(以:もっ)て、(故:ゆえ)に(天下:てんか)(能:よ)く(之:これ)と(争:あわそ)う(莫:な)し。',NULL,NULL,'長江や海が河川の王である理由は十分に低いところにあるからだ。だからこそ河川は合流してくるのだ。//よって、民に尊敬されたいのなら、命令するときには必ずへりくだった言葉を使い、民を先導したいなら、必ず後ろに回るのだ。/だから、聖人は民の上にいても重荷にならず、民の前にいても邪魔にされない。//こうすれば天下万民は喜んで支持して嫌うことがない。誰とも競争しなければ、争ってくる相手はいないのだ。',NULL,'谷の教えの集大成。//水が低いところに流れる物理法則を使って、人がへりくだった者のところに集まることを証明している。/それほど難しい話ではないし、他の章に重複した話も多いので特筆すべきことはない。/強いて言えば、不言の聖人が「言をもって下って」いるところか。//*處上而民不重:{s:72}には重さで厭と言われる支配者の例が出てくる。*//*欲先民、必以身後之。:後ろにいくことで先に出る話は{s:7}と{s:66}にある。*//*不爭:不争の徳。争う相手は民じゃない。*','2011-10-03 17:31:54'),(67,67,'第六十七章','[天下皆謂、我道大似不肖。/夫唯大、]故似不肖。若肖、久矣其細矣夫。/我有三寶、持而保之。/一曰、慈。二曰、儉。三曰、不敢爲天下先。/慈故能勇、儉故能廣、不敢爲天下先、故能成器長。/今舎慈且勇、舎儉且廣、舎後且先、死矣。/夫慈、以戰則勝、以守則固。天將救之、以慈衞之。','(天下:てんか)(皆:みな)(我:わが)(道:みち)を(大:だい)なるも(不肖:ふしょう)に(似:に)たりと(謂:い)う。/(夫:そ)れ(唯:ただ)(大:だい)なるが(故:ゆえ)に(不肖:ふしょう)に(似:に)たり。(若:も)し(肖:しょう)ならば、(久:ひさ)しいかな(其:その)(細:さい)なるや。/[(我:われ)に(三宝:さんぽう)(有:あ)り、](持:じ)して(之:これ)を(保:たも)つ。/[(一:いち)に(曰:いわ)く(慈:じ)、(二:に)に(曰:いわ)く(倹:けん)、(三:さん)に(曰:いわ)く(敢:あ)えて(天下:てんか)の(先:さき)と(為:な)らず。]/(慈:じ)なるが(故:ゆえ)に(能:よ)く(勇:ゆう)、(倹:けん)なるが(故:ゆえ)に(能:よ)く(広:ひろ)く、(敢:あ)えて(天下:てんか)の(先:さき)と(為:な)らざるが(故:ゆえ)に(能:よ)く(器:うつわ)の(長:ちょう)を(成:な)す。/(今:いま)、(慈:じ)を(舎:す)てて(且:まさ)に(勇:ゆう)ならんとし、(倹:けん)を(舎:す)てて(且:まさ)に(広:ひろ)からんとし、(後:あと)なるを(舎:す)てて(且:まさ)に(先:さき)ならんとすれば、(死:し)せん。/(夫:そ)れ(慈:じ)は、(以:もっ)て(戦:たたか)えば(則:すなわ)ち(勝:か)ち、(以:もっ)て(守:まも)れば(則:すなわ)ち(固:かた)し、(天:てん)(将:まさ)に(之:これ)を(救:すく)わんとし、(慈:じ)を(以:もっ)て(之:これ)を(衛:まも)る。',NULL,NULL,'世間の人は私が信じて実践している道を「偉大なようで馬鹿馬鹿しい」という。/それは偉大すぎるから馬鹿に見えるだけだ。もし偉大に見えるようなら、なんとまぁ長いことちっぽけなままでいることになるか。//私には大切に継続している三つの宝がある。/一つは慈しみ。二つは倹約。三つはでしゃばって人の先頭には立たない。/慈しみがあるから勇気が出て、倹約してるから広く施せ、先頭に立たないから大きな器になれるのだ。/今、慈しみを捨て勇気をだし、倹約をやめて広い心を発揮し、後ろにいることをやめて先頭に出れば、死ぬだけだ。//慈しみ。それを持って戦えば勝ち、守れば負けない。天はそういう人を救おうとし、慈しみをもって守ってくれる。',NULL,'生きる上で守るべき心は何かを教える章。//上段はそれほど重要ではないので、ひっかかるところがあるが、この解釈で固定した。/老子が「遠大なようで何も言ってない」などと評されることは現代でも相変わらずあるので、予防線としては効果があったといえる。/こういった批判は、それを信じる人も同様に受けるのだから、老子自身が言い訳しているというよりは仲間を守っているのではないか。そう考えると一人称が吾でなく我なのは腑に落ちる。/また、大きすぎてわからない話は荘子に多い。こっちは本当に極端だ。//さて、本題の三宝。三宝といえば仏教の「仏法僧」。キリスト教で三つといえば「父と子と精霊」か。さて、道教である老子の三宝は谷で形容している。//谷は凹んで見えるが、天地を逆にすれば険しい谷ほど切っ先は鋭い。そして、先である谷底には水が流れる。もちろん、ここでいう先は世間一般で言う後ろにあたる。/切り立った谷ほど水を蓄えられ、深く掘った井戸ほど水が出る。その水で慈しむわけだ。このたとえは{s:28}にも出ており、慈とは徳とほぼ同じだと思われる。/谷が深さをなくして平らになれば水は枯れる。水がなければ皆死ぬ。/女が男の真似をして谷を埋めちゃったら間違い無く子供は生まれない。子孫は絶えて死ぬ。/蓄え無しで施せば借金が嵩んで死ぬ…なんて言わなくても説明可能なほど良くたとえられている。//簡単にまとめれば、貧乏生活に耐えながら余った力を人に施すのが良いといったところか。//*我道大似不肖:不肖という言葉がこの時代から「出来そこない」の意味を持っていたのかな。そのまま受け取ることにしたけど、似てるようで似てないとしてもいいかも。*//*夫唯大、故似不肖。:老子にとって大とは{s:41}のように視界に収まり切らないほど大きいこと。/{s:34}のように一生小さいままでいるから大になるのである。*//*若肖、久矣其細矣夫。:大きく見えることを確認できるようなら間違ったものを見ている。/そんなちっぽけなものを大きいと考えていたら永遠に小さなものをありがたがって過ごすことになる。*//*一曰、慈。:儒教でいう仁にあたるものだろう。谷底を流れる水にあたる。*//*二曰、儉。:{s:59}でいう{l:嗇}。「険しい」に通じており、谷の深さにあたる。*//*三曰、不敢爲天下先:後ろにいくことで先に出る話は{s:7}と{s:66}にある。谷底にあたる。*//*慈故能勇:勇は{s:73}でいうような、無駄な争いを自重する勇気。本当に追い詰められるまで戦いを避けることで、いざという勝負で力が出る。水が湧くのと勇がつながっている。*//*儉故能廣:倹約しているから広く施せる。廣は体積が大きいこと。切り立った深い谷ほど貯水量が多い。*//*能成器長:低いところにいる人ほど器が大きく成長する。*//*以戰則勝:{s:31}や{s:69}でいう哀しみをもって戦えば勝つこと。*//*天將救之:{s:79}では、常に善人の味方だとある。谷というたとえを持ち出せば、天がもたらす慈しみの雨は真っ先に谷を救う。{s:77}でいう天のはたらきもこれだろう。ここの天は{w:天道}であって、{s:3}でいうような天地不仁とは違うと思われる。*','2011-10-03 17:31:57'),(68,68,'第六十八章','[善爲士者不武。善戰者不怒。]善勝敵者不與。善用人者爲之下。/是謂不爭之徳、是謂用人之力、是謂配天、古之極。','(善:よ)く(士:し)(為:た)る(者:もの)は(武:ぶ)ならず。[(善:よ)く(戦:たたか)う(者:もの)は(怒:いか)らず。](善:よ)く(敵:てき)に(勝:か)つ(者:もの)は(与:あらそ)わず。[(善:よ)く(人:ひと)を(用:もち)うる(者:もの)は(之:これ)が(下:した)と(為:な)る。]/(是:これ)を(不争:ふそう)の(徳:とく)と(謂:い)い、(是:これ)を(人:ひと)の(力:ちから)を(用:もち)うと(謂:い)い、(是:これ)を(天:てん)の(配:はい)と(謂:い)い、(古:いにしえ)の(極:きょく)。',NULL,NULL,'優れた名士は武力で物事を解決しない。優れた戦士は怒りに身を任せて戦わない。上手に勝ちを収める者は競争しない。上手に人を使う人はへりくだってお願いする。/これが争わない徳であり、人の力を使うことであり、これこそが、太古の昔に極められた天の巡りあわせだ。',NULL,'人と張り合って力を使いつくすよりも、相手の力を上手に使った方がうまくいくことは間違いない。それをやると{s:61}となる。現代でもライバル会社を含めた他社と提携して製品開発することがもてはやされてますな。//こういう工夫が老子で批判される小ざかしい知恵でなければいいのだが。','2011-10-03 17:32:03'),(69,69,'第六十九章','[用兵有言、吾不敢爲主而爲客、]不敢進寸而退尺。/是謂行無行、攘無臂、扔無敵、執無兵。/禍莫大於輕敵、輕敵幾喪吾寳。故抗兵相如、哀者勝矣。','(用兵:ようへい)に(言:げん)あり、「(吾:われ)(敢:あ)えて(主:しゅ)と(為:な)らずして(客:きゃく)と(為:な)り、(敢:あ)えて(寸:すん)を(進:すす)まずして(尺:しゃく)を(退:ひ)く」と。/(是:これ)を(無行:むぎょう)を(行:い)き、(無臂:むひ)を(攘:ふる)い、(無敵:むてき)を(扔:つ)き、(無兵:むへい)を(執:と)ると(謂:い)う。/[(禍:わざわい)は(敵:てき)を(軽:かろ)んずるより(大:だい)なるは(莫:な)し。](敵:てき)を(軽:かろ)んずれば(幾:ほとんど)(吾:わが)(宝:たから)を(喪:うしな)う。/(故:ゆえ)に(兵:へい)を(抗:あ)げて(相:あい)(如:し)くときは、(哀:かな)しむ(者:もの)(勝:か)つ。',NULL,NULL,'戦術書にはこうある。「戦争の首謀者になるな。被害者になれ。兵は進めず引いて引き込め。」//これこそが兵を使わない指揮という。行動することもなく、力で押し返すこともなく、力で引き倒すこともない。//戦争では敵を軽く見ることほど不味い作戦はない。敵を軽く見れば、ほとんどの宝を失う。だから、互角の兵を挙げて対抗する場合、慈愛のある方が勝つ。',NULL,'作戦の中身がよくわからんが、世論を味方につけるといったところだろうか。//悪いことをしていないのに侵略すれば世論が許さない。世論ごときが何の力をもってるんだよと現代人は思いがちだが、メンツを重んじた時代ということもあって世論は今よりも大きな影響力を持っていたと思われる。/最後まで和平の道を探ったが相手が攻撃を止めなかったからやむなく応戦したという形を取れば世間は間違いなく侵略と見る。これなら、たとえ戦争で負けても同情があるから再興のチャンスがもらえる。//だから、互角の戦力で勝ち目はあっても世論を失うような戦い方をするな。//*禍莫大於輕敵、輕敵幾喪吾寳。:「吾寳」は{s:67}の三宝だろうか。それでも意味はきれいにつながる。*//*故抗兵相如、哀者勝矣。:抗兵相加となった本が多いが、加と如を写し間違えたのだとか。ここはその説にならって如に変えた。/哀しみの気持ちを持って戦うのは{s:31}にもある。*/','2011-10-03 17:32:17'),(70,70,'第七十章','[吾言甚易知、甚易行。]天下莫能知、莫能行。/言有宗、事有君。夫唯無知、是以不我知。/知我者希、則我者貴。是以聖人、被褐而懷玉。','(吾:わが)(言:げん)は(甚:はなは)だ(知:し)り(易:やす)く、(甚:はなは)だ(行:おこな)い(易:やす)し。(天下:てんか)(能:よ)く(知:し)ること(莫:な)く、(能:よ)く(行:おこな)うこと(莫:な)し。/(言:げん)に(宗:そう)あり、(事:つか)うるに(君:くん)(有:あ)り。(夫:そ)れ(唯:ただ)(知:し)られること(無:な)し、(是:これ)を(以:もっ)て(我:われ)を(知:し)らず。/(我:われ)を(知:し)る(者:もの)は(希:まれ)なれば、(則:すなわ)ち(我:われ)(貴:たっと)し。/(是:これ)を(以:もっ)て[(聖人:せいじん)は、(褐:かつ)を(被:き)て(玉:ぎょく)を(懐:いだ)く。]',NULL,NULL,'私の提案は、誰でも簡単に覚えられ、しかも、すぐ実行できる。しかし、知っている人はいないし、やってる人もいない。//私の提案にはきちんとした主旨はあるし、従うべき相手もいる。それはただ知られないこと。だから、私は知られないのだ。//私を知っている人がほとんどいないのは、私が知られないでいることに優れているからだ。だから、聖人はボロ布を着ているが心には宝を持っているのだ。',NULL,'老子のかくれんぼ。難しい章なので思い切った解釈をした方が面白かろう。敢えて蛮勇を奮ってみた。//俺の教えは簡単なことなのに誰もできない。このスットコどっこい共め!とか怒ってるわけではない。/無知とは知らないだけでなく知られないことでもある。そのへんは{s:10}の「愛民治國、能無知乎。」だろうか。/誰も知らないってことは、それだけ隠れるのが上手いってこと。ボロ布をまとった冴えなさそうな男たちの中から、宝を抱いた者を見つけてみよ。この考えは{s:56}の和光同塵にも見られる。//この章は老子自身がそう言いたいのではなく、「道」を行く者が自分自身に言い聞かせるためのものだろう。誰も自分を評価してくれなくて辛いときに読むものだ。誰も認めてくれないほど正しいのだから、乗り越える力も湧くというもの。//ツッコミどころとしては、「知られてない」って言ってる割には俺あんたのこと知ってるよってこと。こうなると、「無知」(他人に興味がない)だから「不我知」(知名度などどうでもいい)','2011-10-03 17:32:19'),(71,71,'第七十一章','[知不知上。不知知病。]夫唯病病、是以不病。/聖人不病、以其病病。是以不病。','[(知:し)りて(知:し)らずとするは(上:じょう)。(知:し)らずして(知:し)るとするは(病:へい)。](夫:そ)れ(唯:ただ)(病:へい)を(病:へい)とするは、(是:これ)を(以:もっ)て(病:へい)ならず。/(聖人:せいじん)の(病:へい)ならざるは、(其:その)(病:へい)を(病:へい)とするを(以:もっ)てなり。(是:これ)を(以:もっ)て(病:へい)ならず。',NULL,NULL,'知っていることを知らないとするのはよろしい。知らないことを知っていると言う人は具合が悪い。ただ、具合が悪い人も、具合の悪さを自覚できれば、快復に向かうだろう。//聖人に不具合がないのは、知らないことを知らないと言えるからだ。だから、欠点がない。',NULL,'禅問答みたいでわけがわからん。Hey!Hey!Foo!Hey!ってどこのラップだよ。//「病=知らないことを知っているということ」として数学的に展開すると意味がまるで通じない。病を欠点とすることでやっと見えてくる。/素直に「知らないことは知らないと言いましょう」じゃダメなんかいな。聖人の完全さを教えてるから欠点に言い換える必要があるんだろうね。//「能ある鷹は爪を隠す」とか、「知ったかぶりするな」とか、「欠点を自覚するのは難しい」なんて今の時代にも使われる説教なので、話の筋はまぁわかる。実社会でも応用の効く話であろう。//孔子は「知ってることを知ってるとし、知らないことを知らないとせよ」と言った。孔子はその言葉通り「知ってる」と判断することに対してとても慎重だった。わずかでも不確定要素があればわからないと答え、憶測で物を言うことはなかった。それだけでも素晴らしいが、老子は「それでも知らないとせよ」とさらに慎重だったわけだ。/そのエッセンスは{s:1}や{s:14}にあり、具体例が{s:63}だろう。/こんな生き方は、実利主義的な墨子あたりに言わせれば「良い策があっても黙っているなら、それは知らないのと同じだ」と反論するだろうか。/','2011-10-03 17:32:21'),(72,72,'第七十二章','[民不畏威、則大威至矣。]/無狎其所居、無厭其所生。夫唯不厭、是以不厭。/是以聖人、自知不自見、自愛不自貴。故去彼取此。','(民:たみ)が(威:い)を(畏:おそ)れざれば、(則:すなわ)ち(大威:たいい)に(至:いた)らん。/(其:その)(居:お)る(所:ところ)を(狎:あなど)ること(無:な)かれ、[(其:その)の(生:しょう)ずる(所:ところ)を(厭:おさ)えること(無:な)かれ。](夫:そ)れ(唯:ただ)(厭:おさ)えず、(是:これ)を(以:もっ)て(厭:いや)がられず。/(是:これ)を(以:もっ)て(聖人:せいじん)は、(自:みずか)らを(知:し)りて(自:みずか)らを(見:あらわ)さず、(自:みずか)らを(愛:あい)して(自:みずか)らを(貴:たっと)ばず。(故:ゆえ)に(彼:あれ)を(去:さ)りて(此:これ)を(取:と)る。',NULL,NULL,'民が支配者の威を畏れなくなれば、大乱が起きるだろう。//民の生活を軽く考えることをやめ、民の生活を押さえつけるのをやめなさい。ただ押さえつけないだけで、民は従うことを厭わなくなる。//だから、聖人は自分の行いに間違いがないかを知ることはあっても、自分を知ってもらおうと見せびらかしたりせず、自分をしっかり愛することはあっても、尊敬されようとはしない。だから、威を捨て、道を取るのである。',NULL,'威で民を抑えこむことの難しさを教える章だと思われる。//威とは、支配者が持つ権力や兵力のこと。大威とは、民の命がけの反乱。なぜ、民が死を恐れないかは{s:75}にある通り、飢餓だろう。しかし、この章だけでは、説明不足に感じる。なぜ抑えると反発するのか、真意を汲み取れていない。//「其所居」の主語は民だろう。彼らが細々と暮らす生活をバカにして、子育てできないほどに生活を圧迫するのはやめること。それだけで嫌がられない。厭がられないと言えば、{s:66}にあるが、重いだけの上は排除されて終わりなわけね。//だから、聖人は威張らない。まともに自分を愛する人は、わざわざ民の顰蹙を買ってまで威張らないだろう。','2011-10-03 17:32:23'),(73,73,'第七十三章','[勇於敢則殺、勇於不敢則活。]此兩者或利、或害。/天之所惡、孰知其故。是以聖人猶難之。/天之道不爭而善勝、不言而善應、不召而自來、繟然而善謀。/天網恢恢、疏而不失。','(敢:あ)えてするに(勇:ゆう)なれば(則:すなわ)ち(殺:さつ)、(敢:あ)えてせざるに(勇:ゆう)なれば(則:すなわ)ち(活:かつ)。(此:こ)の(両者:りょうしゃ)は(或:ある)いは(利:り)し、(或:ある)いは(害:がい)す。/(天:てん)の(悪:にく)む(所:ところ)、(孰:た)れか(其:その)(故:ゆえ)を(知:し)らん。(是:これ)を(以:もっ)て(聖人:せいじん)すら(猶:なお)(之:これ)を(難:かた)しとす。/(天:てん)の(道:みち)は(争:あらそ)わずして(善:よ)く(勝:か)ち、(言:い)わずして(善:よ)く(応:おう)じ、(召:め)さずして(自:おのず)から(来:き)、(繟然:せんぜん)として(善:よ)く(謀:はか)る。/[(天網:てんもう)(恢恢:かいかい)、(疏:そ)にして(失:うしな)わず。]',NULL,NULL,'名誉のように命がかかっていない争いで勇気をふるえば、名は守れても誰かが命を落とすことになる。その勇気を勝負を避ける方向にふるえば、面子が潰れる代わりにお互い命を拾う。どちらも得をしたり損をする。//天が何かを嫌うとしても、誰がその理由を知っているだろうか。これは聖人すらわからない。//自然のはたらきは、争わないでも上手に勝ち、黙っていてもしっかり応え、時期が来ればあちらからやって来て、のんびりしていても話しがまとまる。/自然の網は大きいから目が粗いけれども、うまくいくようにできているのだ。',NULL,'{s:74}とセットで命の扱いについて書いた章。//いまいち文章がつながってない。聖人すら難しいなら、どう結論づけるのか。下段の結論では、何もしないでも上手くいくと言っているのだから、敢えてしないのが良いに決まってるじゃないか。それとも、聖人すら争いを避けて逃げる勇気を持つことが難しいのだろうか。「是以聖人猶難之」のフレーズは{s:63}にも出現し、錯簡ではないかという噂もあるが、それでも、天の憎むところは唐突に思う。/ちなみに、悪むという表現は頻出するが、いずれも「物」と「人」が悪むといって、天が何かを悪むことはないらしい。また、天の道も頻出するが、バランスを取って助けてくれると言っているだけで、何かを嫌ったり罰を与えることはないらしい。//泣き言はここらで終わりにしておいて、{s:74}を読む。どうやら天の仕事とは生殺与奪のようだ。「天の憎むところ」は天が死を与えることを決断する理由だろう。誰がどんな理由で死ぬか、それは確かに聖人でもわからない。命の終わりは天が決めることだから、人がどれだけ謀って争っても決定的にとどめを刺すことはできない。どれだけ憎くて殺したくてもだ。死というのは争って与えられるものではないが、何もしなくてもやってくるものである。//「天網恢恢、疏而不失。」のフレーズは「天網恢々疎にして漏らさず」ということわざになっている。「悪人は絶対つかまる」の意味なんだが、この文脈では本物の悪ならほっといても捕まるし、捕まらないなら何らかの善性があるって感じだろうか。/','2011-10-03 17:32:27'),(74,74,'第七十四章','[民不畏死、奈何以死懼之。]/若使民常畏死、而爲奇者、吾得執而殺之、孰敢。常有司殺者殺。/夫代司殺者殺、是謂代大匠斲。夫代大匠斲者、希有不傷其手矣。','(民:たみ)、(死:し)を(畏:おそ)れざれば、(奈何:いか)んぞ(死:し)を(以:もっ)て(之:これ)を(懼:おそ)れしめん。/(若:も)し(民:たみ)をして(常:つね)に(死:し)を(畏:おそ)れ(使:し)めて、(而:しか)も(奇:き)を(為:な)す(者:もの)、(吾:われ)(執:と)らえて(之:これ)を(殺:ころ)すを(得:え)るも、(孰:た)れか(敢:あ)えてせん。/(常:つね)に(司殺者:しさつしゃ)(有:あ)りて(殺:ころ)す。/(夫:そ)れ(司殺者:しさつしゃ)に(代:か)わりて(殺:ころ)す、(是:これ)を(大匠:だいしょう)に(代:か)わりて(斲:き)ると(謂:い)う。(夫:そ)れ[(大匠:だいしょう)に(代:か)わりて(斲:き)る(者:もの)は、(其:その)(手:て)を(傷:きず)つけざること(有:あ)るは(希:まれ)なり。]',NULL,NULL,'国民が死ぬことを畏れなくなったとしたら、どうやって死刑で脅せるだろうか。//仮に国民に死刑を畏れさせることができたとして、それでもなお反社会的行為を起こしたとしたら、そこで、私に彼らを捕らえて殺す権力があったとして、殺したりはしない。人は死ぬべき状況がくれば手を下さずとも天が殺すのだ。//人間が天罰といって誅することは、木彫りの達人の真似をして刃物を振り回すようなものだ。素人が刃物を持てば、たいていは自分が怪我をするものだ。',NULL,'死刑の是非について。命の与奪は人が扱うべき範囲を超えているから、死は天に与えさせよと言っている。//国民が命がけでやる反社会的行為で想像するのは一揆だが、この時代にはまだ民がお上に楯突くなんて発想はなかったはず。/おそらくは強盗で死刑とか、殺人で家族も連座の死刑のように犯した罪より重い罰が課せられたのではないかと想像している。特に連座は罪もないのに殺されるわけだから、権力者といえどそれを命じれば殺人と変りない。/当時は支配者が好きに刑を裁量できた。しかし、権力の座とは難しいもので、地位がある限りは好き勝手できるが、そこから滑り落ちてしまうと、新しい権力者に好き勝手されてしまう。いたずらに死刑を使うと、やがては自分の身に返ってくることになる。罪人を殺さないのは自分のためでもある。{s:13}でいうなら、足がもつれて転んだからといって足を切り落とす人がいないように、悪さをしたからといって殺してはならないわけだ。//老子はこの世に悪人はいないと考えていて、悪さが出るときは悪人なり事情があるとしている。そのへんは{s:49}にある。また、指導法については{s:27}にある。これが上手く行くかどうかは別として、命が尽きるまで更生のチャンスを与えるなんて現代的な発想とは言える。/','2011-10-03 17:32:29'),(75,75,'第七十五章','[民之飢、以其上食税之多。是以飢。]/民之難治、以其上之有爲。是以難治。/民之輕死、以其上求生之厚。是以輕死。/夫唯無以生爲者、是賢於貴生。','[(民:たみ)の(飢:う)うるは、(其:その)(上:かみ)の(税:ぜい)を(食:は)むことの(多:おお)きを(以:もっ)てなり。](是:これ)を(以:もっ)て(飢:う)う。/(民:たみ)の(治:おさ)め(難:がた)きは、(其:その)(上:かみ)の(為:な)すこと(有:あ)るを(以:もっ)てなり。(是:これ)を(以:もっ)て(治:おさ)め(難:がた)し。/(民:たみ)の(死:し)を(軽:かろ)んずるは、(其:その)(上:かみ)の(生:せい)を(求:もと)むることの(厚:あつ)きを(以:もっ)てなり。(是:これ)を(以:もっ)て(死:し)を(軽:かろ)んず。/(夫:そ)れ(唯:ただ)(生:せい)を(以:もっ)て(為:な)すこと(無:な)き(者:もの)は、(是:これ)(生:せい)を(貴:たっと)ぶより(賢:まさ)る。',NULL,NULL,'国民が飢餓になるのは、お上が重い税をかけるからだ。これが飢餓の実態だ。/国民が素直に納税しないのは、お上が何かと理屈をつけて税の負担をかけるからだ。これが脱税の実態だ。/国民があっけなく死んでしまうのは、お上が自己保身を強く求めるからだ。これが国民が簡単に死ぬ原因だ。//今生きているならそれでいいやと何もしないでいられる人は、命の大切さを最もよく知っている賢者だ。',NULL,'諸問題をすべて政府の責任にしてしまうのは、何かタチの悪い左翼っぽい。//しかし、理屈はわかる。/お上が仕事をすると様々な税制度が設けられる。税といってもお金を収めるだけではなく、兵役などの労働負担もある。それで、百姓は本業の農業ができないばかりか、わずかな収穫さえ税で取られてしまう。民にもメリットがあるからこそ、納税の気持ちが起きるのであって、不必要に徴収されれば誰だって脱税したくなる。/よって、飢餓に発展するという流れだが、軽く死ぬ原因は戦争にもあるだろう。王を守るために戦って死ぬのである。//対処法として、「むやみに生きようとしないこと」だと提案している。これは贅沢をしたり、高貴な身分を維持するのに必死にならないということ。/もちろん、「防備しなければ国が滅ぶじゃないか」というだろうが、そんな時には{s:61}だろう。信じないものは信じてもらえない。そんな論法、現代ですら笑われるだろうけど。/','2011-10-03 17:32:32'),(76,76,'第七十六章','[人之生也柔弱、其死也堅強。]/萬物草木之生也柔脆、其死也枯槁。/故堅強者死之徒、柔弱者生之徒。/是以兵強則不勝、木強則折。強大処下。柔弱処上。','[(人:ひと)の(生:う)まるる(也:や)(柔弱:じゅうじゃく)、(其:その)(死:し)する(也:や)(堅強:けんきょう)なり。]/(万物:ばんぶつ)(草木:くさき)の(生:う)まるる(也:や)(柔脆:じゅうぜい)、(其:その)(死:し)する(也:や)(枯槁:ここう)なり。/(故:ゆえ)に(堅強:けんきょう)なる(者:もの)は(死:し)の(徒:と)にして、(柔弱:じゅうじゃく)なる(者:もの)は(生:せい)の(徒:と)なり。/(是:これ)を(以:もっ)て(兵:へい)は(強:つよ)ければ(則:すなわ)ち(勝:か)たず、(木:き)は(強:つよ)ければ(則:すなわ)ち(折:お)るる。(強大:きょうだい)なる(者:もの)は(下:しも)に(処:お)り、(柔弱:じゅうじゃく)なる(者:もの)は(上:うえ)に(処:お)る。',NULL,NULL,'人の身体は生まれた頃は柔らかくて力が弱く、老死に近づく頃には固くて強い。//どんな植物でも若木は柔らかくて潰れやすいが、死ぬ間際は枯れて節くれ立つ。/つまり、堅くて強い者は死に近く、柔らかくて弱い者は生に近い。//だから、兵を増強しても勝てない。強い木はたわめれば必ず折れる。強さと兵力を頼るのは下策とし、力を控えめにして柔軟に対処するのが上策とする。',NULL,'兵法論ですな。理屈としてはわかりやすい。//若葉は曲げても折れないし、赤ん坊も簡単にヒビは入るが骨折はしない。/堅ければ強いけれど、それを上回る力が加わってしまえば、その時は折れてしまう。/兵を増強すると、今度はその維持費がかかってきて、いずれは破綻してしまう。//*強大処下。柔弱処上。:{s:61}では、川の流れにたとえて大国は下、小国は上としている。*','2011-10-03 17:32:37'),(77,77,'第七十七章','[天之道其猶張弓乎。]高者抑之、下者擧之。有餘者損之、不足者補之。/天之道損有餘而補不足。人之道則不然、損不足以奉有餘。/孰能有餘以奉天下。唯有道者。/是以聖人、爲而不恃、功成而不處、其不欲見賢。','[(天:てん)の(道:みち)は(其:そ)れ(猶:なお)(弓:ゆみ)を(張:は)るがごとき(乎:か)。]/(高:たか)き(者:もの)は(之:これ)を(抑:おさ)え、(下:ひく)き(者:もの)は(之:これ)を(挙:あ)ぐ。(余:あま)り(有:あ)る(者:もの)は(之:これ)を(損:へら)し、(足:た)らざる(者:もの)は(之:これ)を(補:おぎな)う。/(天:てん)の(道:みち)は(余:あま)り(有:あ)るを(損:へら)して(足:た)らざるを(補:おぎな)う。(人:ひと)の(道:みち)は(則:すなわ)ち(然:しか)らず、(足:た)らざるを(損:へら)して(以:もっ)て(余:あま)り(有:あ)るに(奉:ほう)ず。/(孰:た)れか(能:よ)く(余:あま)り(有:あ)るを(以:もっ)て(天下:てんか)に(奉:ほう)ぜん。(唯:ただ)(有道:ゆうどう)の(者:もの)のみ。/(是:これ)を(以:もっ)て(聖人:せいじん)は、(為:な)して(恃:たの)まず、(功:こう)(成:な)りて(処:お)らず、(其:そ)の(賢:けん)を(見:しめ)すを(欲:ほっ)せず。',NULL,NULL,'自然のはたらきは、弓を天に向かって引いた様子に似ている。頂点ほど下に戻ろうとする力が強く、底辺ほど上に上がろうとする。余分に持っている者が損することで、足りていない者に補われるのが自然だ。//自然は持てる者が持てない者を助けるのに、人間社会はそうなっていない。足りないものが損をして、余っている者に上納される。//余っている物を天下に分配できる者がいるだろうか。いるとすれば道を行く者だけだ。//だから、聖人は分配しても見返りは求めず、成功しても目立つ場所にはおらず、名声が高まることを望まない。',NULL,'天の道について。特に注意するところはないだろう。{s:81}と合わせて読めばいいか。//*是以聖人、爲而不恃、功成而不處、其不欲見賢。:余りを分け与えるにもひっそりと行う。*','2011-10-03 17:32:54'),(78,78,'第七十八章','[天下莫柔弱於水。而攻堅強者、]莫之能勝。以其無以易之。/弱之勝強、柔之勝剛、天下莫不知、莫能行。/是以聖人云。/受國之垢、是謂社稷主、受國不祥、是謂天下王。/正言若反。','(天下:てんか)の(水:みず)より(柔弱:じゅうじゃく)なるは(莫:な)し、しかれども(堅強:けんきょう)の(者:もの)を(攻:せ)むるに、(之:これ)に(能:よ)く(勝:まさ)る(莫:な)し。(其:そ)の(以:もっ)て(之:これ)を(易:か)うるもの(無:な)きを(以:もっ)てなり。/(弱:じゃく)の(強:きょう)に(勝:か)ち、(柔:じゅう)の(剛:ごう)に(勝:か)つは、(天下:てんか)(知:し)らざる(莫:な)くも、(能:よ)く(行:おこな)う(莫:な)し。/(是:これ)を(以:もっ)て(聖人:せいじん)は(云:い)う。/(国:くに)の(垢:あか)を(受:う)く、(是:これ)を(社稷:しゃしょく)の(主:ぬし)と(謂:い)い、(国:くに)の(不祥:ふしょう)を(受:う)く、(是:これ)を(天下:てんか)の(王:おう)と(謂:い)う、と。/[(正言:せいげん)は(反:はん)するが(若:ごと)し。]',NULL,NULL,'この世に水より柔らかく弱い物はない。しかし、堅くて強いものを攻めさせて水に勝てるものはなく、水の代わりが務まるものもない。//弱いものが強いものに勝ち、柔らかいものが堅いものを倒す。それは誰もが知っていることなのに、その考えを実践できる人は滅多にいない。//だから、聖人はこう言った。/「国の不始末を引き受けることができてこそ、国家安康祈願の祭事を主催でき、国の不幸を引き受けてこそ、国の王となれる。」/柔が剛に勝つように、正しい言葉には反対の作用がある。',NULL,'水は世界で最も弱い物質であると同時に強い物質でもある。強くあるためには弱くなくてはいけない。世界で最も強い国王でありたいのなら、水と同じように弱い立場で汚いものを引き受けなければならない。/','2011-10-03 17:32:57'),(79,79,'第七十九章','[和大怨必有餘怨。]安可以爲善。/是以聖人、執左契而不責於人。有徳司契、無徳司徹。/天道無親、常與善人。','[(大怨:たいえん)を(和:わ)すれば(必:かなら)ず(余怨:よえん)(有:あ)り。](安:いず)くんぞ(以:もっ)て(善:ぜん)と(為:な)す(可:べ)けんや。/(是:これ)を(以:もっ)て(聖人:せいじん)は(左契:さけい)を(執:と)りて(人:ひと)を(責:せ)めず。(徳:とく)(有:あ)るは(契:けい)を(司:つかさど)り、(徳:とく)(無:な)きは(徹:てつ)を(司:つかさど)る。/(天道:てんどう)は(親:しん)(無:な)し、(常:つね)に(善人:ぜんにん)に(与:くみ)す。',NULL,NULL,'深い恨みを和解させても必ず小さな怨みは残るものだ。こんな和解で良しとしてよいだろうか。//だから、聖人は契約書を用意するが、それを持っているだけで行使はしない。徳ある者は約束を取り交わすことだけを任務とするが、徳ない者は無理な約束でもそれを果たすまで厳しく貫き通す。//自然は公平だから、いつも善人の味方である。',NULL,'当時の契約はどんなんだったろうか。商取引で考えると違和感あるかな。おそらく戦争の講和なんだろう。//国民同士が戦争で殺し合い憎み合ってる国があったとしよう。もし、一方が他方を併呑したとして、それを講和の成立だけで終わったことにできるだろうか。講和とは敗者が賠償させられ、属国としての重い貢ぎ物を要求されることなのだ。それを無理やり果たさせれば燻った怨みが再燃するだけだ。//{s:49}が聖人の具体的な進め方だろう。民の心を和解させるために「何もしないで心を痛めるだけ」とある。ゆっくりと時間をかけて自然に修復させるのだ。','2011-10-03 17:33:01'),(80,80,'第八十章','[小國寡民。/使有什伯之器而不用。]使民重死而不遠徙。/雖有舟轝、無所乗之、雖有甲兵、無所陳之。/使民復結繩而用之、甘其食、美其服、安其居、樂其俗。/鄰國相望、雞犬之聲相聞、民至老死不相往來。','[(小国:しょうこく)(寡民:かみん)。]/(什伯:じゅうひゃく)の(器:き)(有:あ)るも(用:もち)いざら(使:し)む。(民:たみ)をして(死:し)を(重:おも)んじて(遠:とお)く(徙:うつ)らざら(使:し)む。/(舟轝:しゅうよ)(有:あ)りと(雖:いえど)も、(之:これ)に(乗:の)る(所:ところ)(無:な)く、(甲兵:こうへい)(有:あ)りと(雖:いえど)も、(之:これ)を(陳:つらぬ)る(所:ところ)(無:な)し。/(民:たみ)をして(復:ま)た(縄:なわ)を(結:むす)びて(之:これ)を(用:もち)い、(其:その)(食:しょく)を(甘:あま)しとし、(其:その)(服:ふく)を(美:うつく)しとし、(其:その)(居:きょ)に(安:やす)んじ、(其:その)(俗:ぞく)を(楽:たの)しま(使:し)む。/(隣国:りんごく)(相:あい)(望:のぞ)み、(雞犬:けいけん)の(声:こえ)(相:あい)(聞:き)こゆるも、(民:たみ)は(老死:ろうし)に(至:いた)るまで(相:あい)(往来:おうらい)せず。',NULL,NULL,'人口の少ない小さな国。//十人に一人、百人に一人の逸材がいても要人として取り立てたりしない。民の死という重い事実を目の前にしても土地を捨てて移住しない。船や車があっても乗る必要もなく、精強な兵がいても活躍する機会はない。/人に歴史を伝える縄結びをさせることはあるけれど、平凡な食事を味わって食べ、ありきたりな服で満足し、住んでる家を都とし、くだらないことを楽しむ。/隣の国は見えるところにあり、鶏や犬の鳴き声が聞こえるが、国境を超えて狩りに行ったりうるさいと苦情を訴えに行くこともない。',NULL,'ユートピアですな。一般的には、これが老子の理想の国家とされている。まぁしかし、これを良いとも悪いとも言ってはいないので、ひとつの考え方を書いただけかもしれない。//*使有什伯之器而不用:「什伯之器」を「たくさんの便利な道具」とする読み方もある。どちらであっても、何かに依存することはない意味では同じ。小さい国なら百人長は大臣クラスだろう。*//*使民重死而不遠徙:当時には、国難から逃れられないときに、市民をまるごと引き連れて、国を捨てて移住する例もあった。*//*使民復結繩而用之:文字がない時代は縄の結び目の形を文字がわりにして歴史を記した。文字は知恵の象徴みたいなもんだから否定したいものの、歴史を重んじる老子は縄むすびまでは否定できなかったか。「ケータイなんて小賢しいものはいらん、昔はよかった」って老人が愚痴るけど、老子が「文字なんていらん」と言わんばかりなのは興味深い。*//*民至老死不相往來。:{s:61}では、小国は大国に仕えて交わるとある。あちらが現実的政策でこちらが理想だろうか。*/','2011-10-03 17:33:11'),(81,81,'第八十一章','[信言不美、美言不信。]/善者不辯、辯者不善。知者不博、博者不知。/聖人不積、既以爲人己愈有、既以與人己愈多。/天之道、利而不害。聖人之道、爲而不爭。','[(信言:しんげん)は(美:び)ならず、(美言:びげん)は(信:しん)ならず。]/(善:ぜん)なる(者:もの)は(弁:べん)ぜず、(弁:べん)ずる(者:もの)は(善:ぜん)ならず。(知:し)る(者:もの)は(博:ひろ)からず、(博:ひろ)き(者:もの)は(知:し)らず。/(聖人:せいじん)は(積:つ)まず、(既:ことごと)くを(以:もっ)て(人:ひと)の(為:ため)にして(己:おのれ)(愈:いよいよ)(有:あ)り、(既:ことごと)くを(以:もっ)て(人:ひと)に(与:あた)えて(己:おのれ)(愈:いよいよ)(多:おお)し。/(天:てん)の(道:みち)は、(利:り)して(害:がい)せず。(聖人:せいじん)の(道:みち)は、(為:な)して(争:あらそ)わず。',NULL,NULL,'確信をついた正論は受け入れがたい。受け取りやすい優しい言葉は誠実な内容ではない。//正直者は言葉で取り繕ったりしない。言い訳する人は善人とは言えない。本当の知者は何でも知ろうとはしない。あれこれ知ろうとする人はわかってない。//聖人は蓄積したりしないで、すべての時間を人のために使う。それで、ますます自分らしさが発揮され、何もかも人に与えてしまうと、ついには多くなっている。//自然のはたらきは利益を与えるが害は与えない。同じように、聖人の行いもまた、争いで蹴落さずとも、じゅうぶんに成し遂げることができるのだ。',NULL,'しめくくりは聖人を目指して生きる者の気概をまとめた章。/これまで何度も無為を訴えてきたが、結局無為とは人のために生きることだった。無関心を装って世捨て人のように生きるのではなかったのだ。//解釈では幅をもたせるために直訳したが、言いたいことは次の二点だろう。/「善人ならやらなくていい理由を探して言い訳しないで不言実行しろ」/「覚えるべき大切なことなど数えるほどしかないんだから学問や礼儀などで遊んでないで人のために生きろ」//聖人は自分の利益を積む暇があったら、人のために尽くして、それを喜びとし、楽しく世話を焼いている間に不思議と名声を得てしまうのだ。/これなら争いを巻き起こして人を不幸にすることはない。//ということで、案外厳しい章である。人のために生きるのはイヤって人は聖人の資格なく、人のために生きても結果として減らしてしまう人は聖人にはなれないわけである。いやはや、信言は美ならず、でござるよ。/','2011-10-03 17:33:22');\r
+/*!40000 ALTER TABLE `sections` ENABLE KEYS */;\r
+UNLOCK TABLES;\r
+\r
+--\r
+-- Table structure for table `sources`\r
+--\r
+\r
+DROP TABLE IF EXISTS `sources`;\r
+CREATE TABLE `sources` (\r
+  `id` int(11) NOT NULL auto_increment,\r
+  PRIMARY KEY  (`id`)\r
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\r
+\r
+--\r
+-- Dumping data for table `sources`\r
+--\r
+\r
+LOCK TABLES `sources` WRITE;\r
+/*!40000 ALTER TABLE `sources` DISABLE KEYS */;\r
+/*!40000 ALTER TABLE `sources` ENABLE KEYS */;\r
+UNLOCK TABLES;\r
+\r
+--\r
+-- Table structure for table `thema_sections`\r
+--\r
+\r
+DROP TABLE IF EXISTS `thema_sections`;\r
+CREATE TABLE `thema_sections` (\r
+  `id` int(11) NOT NULL auto_increment,\r
+  `thema_id` int(11) NOT NULL default '1',\r
+  `section_id` int(11) NOT NULL default '1',\r
+  `count` int(11) NOT NULL default '1',\r
+  PRIMARY KEY  (`id`),\r
+  KEY `index_thema_sections_on_section_id` (`section_id`),\r
+  KEY `index_thema_sections_on_thema_id` (`thema_id`)\r
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\r
+\r
+--\r
+-- Dumping data for table `thema_sections`\r
+--\r
+\r
+LOCK TABLES `thema_sections` WRITE;\r
+/*!40000 ALTER TABLE `thema_sections` DISABLE KEYS */;\r
+INSERT INTO `thema_sections` VALUES (5,3,2,1),(6,3,3,1),(8,1,1,1),(11,5,3,1),(12,10,2,1),(13,1,4,1),(14,5,5,1),(16,8,6,1),(17,10,7,1),(18,10,8,1),(19,8,8,1),(20,7,5,1),(21,10,9,1),(22,4,9,1),(23,10,10,1),(24,11,11,1),(25,10,12,1),(26,9,12,1),(28,10,13,1),(29,5,13,1),(30,1,14,1),(31,4,14,1),(32,10,15,1),(33,10,16,1),(34,4,16,1),(35,5,17,1),(37,5,19,1),(38,10,19,1),(39,1,21,1),(40,10,22,1),(41,11,22,1),(44,10,24,1),(45,9,24,1),(46,1,25,1),(47,4,25,1),(48,10,25,1),(49,5,26,1),(50,9,26,1),(51,10,27,1),(52,11,27,1),(53,5,28,1),(55,8,28,1),(56,10,29,1),(57,9,29,1),(58,10,30,1),(59,9,30,1),(60,13,30,1),(61,7,30,1),(62,14,28,1),(63,14,15,1),(64,14,19,1),(66,13,31,1),(67,5,32,1),(68,14,32,1),(69,8,32,1),(70,10,33,1),(71,1,34,1),(72,4,34,1),(73,10,34,1),(74,10,35,1),(75,10,36,1),(76,11,36,1),(77,3,37,1),(78,5,37,1),(79,14,37,1),(80,15,38,1),(82,10,38,1),(84,5,39,1),(85,10,39,1),(86,4,40,1),(87,1,40,1),(88,1,41,1),(89,15,41,1),(90,1,42,1),(91,5,42,1),(92,10,42,1),(93,9,42,1),(94,10,43,1),(95,11,43,1),(96,10,44,1),(97,9,44,1),(98,11,45,1),(99,10,46,1),(100,5,46,1),(101,10,47,1),(102,3,48,1),(103,10,48,1),(105,5,49,1),(106,9,50,1),(107,15,51,1),(108,10,52,1),(109,10,53,1),(110,9,53,1),(111,15,54,1),(112,7,55,1),(114,5,57,1),(115,14,57,1),(116,5,58,1),(117,7,58,1),(118,10,59,1),(119,7,59,1),(120,5,60,1),(121,5,61,1),(122,10,63,1),(123,5,63,1),(124,10,64,1),(126,3,64,1),(127,5,65,1),(129,9,65,1),(130,15,65,1),(131,4,65,1),(132,8,66,1),(133,5,66,1),(134,10,67,1),(135,13,67,1),(136,10,68,1),(137,13,69,1),(138,10,70,1),(139,10,71,1),(140,5,72,1),(141,10,81,1),(143,5,80,1),(144,10,79,1),(145,5,78,1),(146,11,78,1),(148,10,77,1),(149,7,77,1),(150,10,76,1),(151,11,76,1),(152,5,75,1),(153,9,75,1),(154,5,74,1),(155,9,74,1),(156,9,73,1),(157,10,73,1),(159,17,23,1),(161,18,33,1),(162,15,10,1),(163,18,24,1),(164,13,3,1),(165,13,66,1),(166,13,68,1),(167,13,73,1),(168,13,81,1),(169,13,8,1),(170,13,22,1),(171,4,2,1),(172,3,5,1),(173,9,9,1),(174,5,10,1),(175,3,10,1),(176,18,3,1),(177,18,16,1),(178,17,17,1),(179,17,10,1),(181,3,19,1),(182,17,19,1),(183,19,20,1),(184,15,21,1),(186,10,26,1),(187,17,27,1),(188,18,27,1),(189,7,28,1),(190,20,29,1),(191,20,30,1),(192,20,31,1),(193,17,32,1),(194,9,35,1),(195,20,36,1),(196,17,37,1),(197,9,38,1),(198,3,38,1),(199,11,41,1),(200,19,41,1),(201,3,43,1),(202,7,44,1),(203,7,46,1),(204,9,46,1),(205,18,47,1),(206,3,47,1),(207,20,48,1),(208,17,49,1),(209,3,49,1),(210,1,51,1),(211,18,52,1),(212,4,52,1),(214,15,52,1),(215,19,53,1),(216,15,55,1),(217,18,55,1),(218,18,56,1),(219,10,56,1),(220,20,57,1),(221,9,57,1),(222,18,57,1),(223,3,57,1),(224,17,57,1),(225,10,58,1),(226,20,59,1),(227,15,59,1),(228,15,60,1),(229,8,61,1),(230,3,63,1),(231,9,63,1),(233,9,64,1),(234,4,64,1),(235,20,64,1),(236,18,65,1),(237,8,67,1),(238,9,67,1),(239,19,67,1),(240,20,68,1),(241,8,68,1),(242,20,67,1),(243,20,69,1),(244,9,69,1),(245,11,69,1),(246,3,70,1),(247,19,70,1),(248,18,71,1),(249,9,72,1),(252,3,75,1),(253,18,75,1),(254,7,76,1),(255,9,76,1),(256,9,77,1),(258,5,79,1),(259,18,81,1),(261,17,79,1),(262,8,78,1),(263,7,9,1),(264,7,42,1),(265,15,28,1),(266,15,49,1),(267,15,63,1),(269,15,79,1),(270,15,23,1),(271,10,62,1),(272,17,62,1),(273,5,62,1),(274,5,27,1),(276,19,18,1),(277,18,22,1),(278,1,1,1),(279,1,4,1),(280,1,14,1),(281,1,21,1),(282,1,25,1),(283,1,34,1),(284,1,40,1),(285,1,41,1),(286,1,42,1),(287,1,51,1),(288,3,2,1),(289,3,3,1),(290,3,37,1),(291,3,48,1),(292,3,64,1),(293,3,5,1),(294,3,10,1),(295,3,19,1),(296,3,38,1),(297,3,43,1),(298,3,47,1),(299,3,49,1),(300,3,57,1),(301,3,63,1),(302,3,70,1),(303,3,75,1),(304,4,9,1),(305,4,14,1),(306,4,16,1),(307,4,25,1),(308,4,34,1),(309,4,40,1),(310,4,65,1),(311,4,2,1),(312,4,52,1),(313,4,64,1),(314,5,3,1),(315,5,5,1),(316,5,13,1),(317,5,17,1),(318,5,19,1),(319,5,26,1),(320,5,28,1),(321,5,32,1),(322,5,37,1),(323,5,39,1),(324,5,42,1),(325,5,46,1),(326,5,49,1),(327,5,57,1),(328,5,58,1),(329,5,60,1),(330,5,61,1),(331,5,63,1),(332,5,65,1),(333,5,66,1),(334,5,72,1),(335,5,80,1),(336,5,78,1),(337,5,75,1),(338,5,74,1),(339,5,10,1),(340,5,79,1),(341,5,62,1),(342,5,27,1),(343,7,5,1),(344,7,30,1),(345,7,55,1),(346,7,58,1),(347,7,59,1),(348,7,77,1),(349,7,28,1),(350,7,44,1),(351,7,46,1),(352,7,76,1),(353,7,9,1),(354,7,42,1),(355,8,6,1),(356,8,8,1),(357,8,28,1),(358,8,32,1),(359,8,66,1),(360,8,61,1),(361,8,67,1),(362,8,68,1),(363,8,78,1),(364,9,12,1),(365,9,24,1),(366,9,26,1),(367,9,29,1),(368,9,30,1),(369,9,42,1),(370,9,44,1),(371,9,50,1),(372,9,53,1),(373,9,65,1),(374,9,75,1),(375,9,74,1),(376,9,73,1),(377,9,9,1),(378,9,35,1),(379,9,38,1),(380,9,46,1),(381,9,57,1),(382,9,63,1),(383,9,64,1),(384,9,67,1),(385,9,69,1),(386,9,72,1),(387,9,76,1),(388,9,77,1),(389,10,2,1),(390,10,7,1),(391,10,8,1),(392,10,9,1),(393,10,10,1),(394,10,12,1),(395,10,13,1),(396,10,15,1),(397,10,16,1),(398,10,19,1),(399,10,22,1),(400,10,24,1),(401,10,25,1),(402,10,27,1),(403,10,29,1),(404,10,30,1),(405,10,33,1),(406,10,34,1),(407,10,35,1),(408,10,36,1),(409,10,38,1),(410,10,39,1),(411,10,42,1),(412,10,43,1),(413,10,44,1),(414,10,46,1),(415,10,47,1),(416,10,48,1),(417,10,52,1),(418,10,53,1),(419,10,59,1),(420,10,63,1),(421,10,64,1),(422,10,67,1),(423,10,68,1),(424,10,70,1),(425,10,71,1),(426,10,81,1),(427,10,79,1),(428,10,77,1),(429,10,76,1),(430,10,73,1),(431,10,26,1),(432,10,56,1),(433,10,58,1),(434,10,62,1),(435,11,11,1),(436,11,22,1),(437,11,27,1),(438,11,36,1),(439,11,43,1),(440,11,45,1),(441,11,78,1),(442,11,76,1),(443,11,41,1),(444,11,69,1),(445,13,30,1),(446,13,31,1),(447,13,67,1),(448,13,69,1),(449,13,3,1),(450,13,66,1),(451,13,68,1),(452,13,73,1),(453,13,81,1),(454,13,8,1),(455,13,22,1),(456,14,28,1),(457,14,15,1),(458,14,19,1),(459,14,32,1),(460,14,37,1),(461,14,57,1),(462,15,38,1),(463,15,41,1),(464,15,51,1),(465,15,54,1),(466,15,65,1),(467,15,10,1),(468,15,21,1),(469,15,52,1),(470,15,55,1),(471,15,59,1),(472,15,60,1),(473,15,28,1),(474,15,49,1),(475,15,63,1),(476,15,79,1),(477,15,23,1),(478,17,23,1),(479,17,17,1),(480,17,10,1),(481,17,19,1),(482,17,27,1),(483,17,32,1),(484,17,37,1),(485,17,49,1),(486,17,57,1),(487,17,79,1),(488,17,62,1),(489,18,33,1),(490,18,24,1),(491,18,3,1),(492,18,16,1),(493,18,27,1),(494,18,47,1),(495,18,52,1),(496,18,55,1),(497,18,56,1),(498,18,57,1),(499,18,65,1),(500,18,71,1),(501,18,75,1),(502,18,81,1),(503,19,20,1),(504,19,41,1),(505,19,53,1),(506,19,67,1),(507,19,70,1),(508,19,18,1),(509,20,29,1),(510,20,30,1),(511,20,31,1),(512,20,36,1),(513,20,48,1),(514,20,57,1),(515,20,59,1),(516,20,64,1),(517,20,68,1),(518,20,67,1),(519,20,69,1);\r
+/*!40000 ALTER TABLE `thema_sections` ENABLE KEYS */;\r
+UNLOCK TABLES;\r
+\r
+--\r
+-- Table structure for table `themas`\r
+--\r
+\r
+DROP TABLE IF EXISTS `themas`;\r
+CREATE TABLE `themas` (\r
+  `id` int(11) NOT NULL auto_increment,\r
+  `caption` text,\r
+  `detail` text,\r
+  `update_at` datetime default NULL,\r
+  PRIMARY KEY  (`id`)\r
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\r
+\r
+--\r
+-- Dumping data for table `themas`\r
+--\r
+\r
+LOCK TABLES `themas` WRITE;\r
+/*!40000 ALTER TABLE `themas` DISABLE KEYS */;\r
+INSERT INTO `themas` VALUES (1,'道の神秘','道に関する章はどれも難解でとっつきにくい。目に見えない物を説明する難しさを理解させるためにわざと難解な文章にしているのかもしれない。そこで道の姿を描いたと思われる神秘的な章をピックアップし、総合的に判断するための手掛かりを用意しておいた。これらの章は人によって解釈が大きく揺れるであろうから、下のまとめは非常時の参考程度にとどめてもらって、直接各章を当たって吟味して欲しいところである。//道がどこから来たか。それは{s:4}と{s:25}にある。//==========/天地が生まれるより昔、混沌としたものがあった。私にはそれがどこから生まれたかはわからないが、宇宙が生まれるより前から存在した。宇宙はこれから生まれたんだろう。昔から今に至るまで、それは存在している。私にはその存在を上手に形容することはできないが、「道」とよぶことにする。/==========//ということで、正体不明の原始を道と言うらしい。では、それはどんな姿か。{s:4}と{s:21}と{s:25}にある。//==========/道をあえて形容するなら「大」だろうか。/静かでひっそりとしていて、確固として存在して変化せず、激しく動きまわっても壊れることはない。/道は形をつくるが、おぼろげでとらえようがない。とらえようがないが、その中には眼に見える何かがある。とらえようがないが、その中には物の形が見える。奥深くて暗いが、その中には心がある。その心は本質で、その中には真実がある。/道は巨大な器で、中の水を汲みだそうとしても使いきれない。淵のように深々と入り混じっていて、万物の根源のようだ。そして、たっぷりと溜まっているようだ。/==========//表現に少しぶれがあるか。無理して一本化すればこんな感じか。/「巨大な液状の球で、激しく対流しながら回転、あるいは円運動している。表面は霧状になっていて奥は見えない。」/これだと雲に覆われた惑星っぽいが、何か違う気がする。ということで、人が理解可能な道とはいい加減なものなのである。そこで{s:1}となる。//==========/「道はこうあるべきだ」という道は必ずしも道ではない。「名はこうあるべきだ」という名は必ずしも名ではない。/だから、無理に見ようと思わなければ本質が見える。しかし、無理に見ようとすると本質から外れた上辺だけを見てしまう。/==========//だから、このまとめが到底「道」を表せているとはいえない。また、よくわからないものへの対応を{s:14}のように言っている。//==========/見ようとしても見えない、聴こうとしても聞こえない、取ろうとしても取れない。/これらは突き詰めてはいけない。最初から混ざり合って一つになっているからだ。/上だからといって明るくなく、下だからといって暗くない。ぐちゃぐちゃしていて表現しようがなく、物のようには対処できないんだという結論にまた帰っていく。/これを状態のない状態、物にはならない形と言い、ぼんやりと明るい状態とも言える。/これを見てやろうと正面にまわっても顔は見えず、背後にまわっても後ろ姿は見えない。/==========//道が世界に何をもたらしたか。それは{s:1}と{s:42}と{s:51}にある。//==========/名がないところから物事は始まり、名がついたところから様々なものが生まれる。/道は一を生み、一は二を生み、二は三を生み、三は万物を創りだす。万物には陰と陽が付随し、中心にからっぽの部分があってバランスを保っている。/道が「これ」を生み出し、徳が「それ」を取りまとめ、「それ」が形を持って物となり、そうやって道具が完成する。/それは誰に命令されずとも、いつも自分の意志で当たり前のようにはたらく。つまり、道は自然と「これ」を生み、徳は自然と「それ」を取りまとめるのだ。/==========//道は万物の生成に関わったようだ。道がきっかけを作り、徳が発展させたようでもある。また、何かの意志や命令があって生成したわけではなく、無意識に自然に発生させたようだ。//道はどんな作用を持ってるか。それは{s:25}、{s:34}、{s:40}、{s:41}、{s:42}、{s:51}を見れば良いだろうか。//==========/無から有が生まれ、有が万物を産む。/道のはたらきは弱者を助ける。道の力はこぼれ溢れるように右へ左へと拡がっていく。/道の動きは無に返る。大は行くことであり、行くとは遠くまで行くことであり、遠くまで行ったなら帰ってくる。/道は隠れたところから作用するから人間には見えない。しかし、道はいろいろ助けてくれて成功させてくれる。だから、すべての物は道を頼りにして命を得、育んでもらう。しかし、何もいわないので、成功しても有名にならない。それでいて、あらゆる物を愛して育て、支配しようとはしない。/道は誰にも従わずとも自分で立っている。/==========//ということで、道は弱者を助けるが、強者を弱める作用があるようだ。人には姿を見せないで、無→有→無を無意識に繰り返すのが道だ。弱める力は{t:4}でまとめた。//道を見て人がするべきことは何か。それこそが老子が訴えたいことなので全体を通じて読んでもらえばいいが、神秘を基準にピックアップされた中から見るなら、{s:25}と{s:41}と{s:51}にある。//==========/道を理解するとはボンクラになることで、道を進むとは後戻りすることで、安全で平らな道とは面倒な無駄道だ。/「道だけを尊敬して徳は貴ばない」などとするはずがない。道は尊敬され、徳も貴ばれる。/だから、人は地に従い、地は天に従い、天は道に従う。/==========//これじゃ、わからんね。/総合的にまとめるとこんな感じだ。//道には、無→有→無を繰り返すはたらきがある。この力は道から自然に湧き出てくるもので、誰からの命令も何らかの意図も含まない({t:3})。/道から生まれた万物も、陰・陽・中でバランスされており、陰と陽が中を中心に激しく交代していると考えられる。/人間も人間社会も万物の一員だから、同じ動きをしている。つまり、陰気と陽気、成功と失敗を繰り返し、弱者と強者の立場が中間層を軸にして革命で入れ替わる。よって、中間にいれば変化から逃れられ({t:7})、弱であれば強となり({t:15})、強であれば弱に転ずる({t:9})。これは弱であるときは不安がる必要なく、強であるときこそ意識して弱に向かう必要がある({t:4}、{t:8})ということだ。とはいえ、弱から強に転ずるには工夫が必要だから、{t:11}も意識する。//その考えを自己修養に応用したのが{t:10}であり、社会の統治に応用したのが{t:5}である。/','2012-01-07 07:46:28'),(3,'無為のこころ','老子には「無為」がいたるところに出てくる。その無為は本当に何もしないように見えることもあるし、ものすごく頑張って行動しているようにも見える。ちょっと読んだだけでは到底「無為」を理解できそうにない。そこで、無為とは何なのかを自分なりにまとめてみた。ついでながら無知や不言などの行動を控える心得についてもまとめてみた。//最初は言及部分をピックアップして箇条書きにしていけば見えてくると考えたが、思ったほどうまくは行かなかったので文章でまとめた。下書きとなる箇条書き部分は末尾に添付した。//なぜ無為なのかと言えば、道が無為だから見習っている。それは{s:8}で道に近いとされる水を見て知り得たことだ。{s:78}では水の性質から弱さが強さを引き出すことを見つけ、{s:76}では水の柔らかさが堅さを超越することを教わった。{s:43}では水の柔らかさから狭いところにも入り込むことを教わった。水は{s:34}では水が万物を育んでも支配しないことを教わった。水は何も求めず、知恵もつかわず、意志ももたない。「無欲」「無知」そして「無為」。水だけでなく土も「無為」なことは{s:16}からわかる。このように物を言わぬ自然から「不言」を学ぶ。だから聖人は最後まで水のように生きるのだ。自然と同じように「無為」で教える。だから聖人は無為なのだ。//確かに水は無為だが、それでいて命を生み育む恵みを「為す」。無為であることで大きなことが為せるのだ。だから、聖人は{s:48}のように損を続けて無為となり、無為から無事を為して天下を取る。/{s:37}では、道は無為なのに為すのだから、王侯が無欲なら天下は勝手に安定すると言っている。つまり、無為は天下を取ることだけでなく、天下を安定させることもできるのだ。/ただし、無為なのに為しては矛盾が起きるので、{s:38}では徳者は無為で成功するが自分の仕業ではなかったことにするのだと言っている。//では、天下を取る具体策は何か。{s:57}か。聖人は戦争を避け、兵器開発をせず、謀略家を起用せず、法律も厳しくしない。このように無事だから天下が取れる。/そして、{s:63}のように「無為」「無事」「無味」に努める。無為とは知られないように為すことであり、無事とは事件を起こさないことであり、無味は平凡で退屈な日々に感謝して生きることである。これが聖人が道から得たやり方だ。/そして、{s:64}が締めくくりとなる。聖人は無為無執だから失敗しない。それを最後まで気を抜かないで続けるから「無敗」なのだ。天下取りについての詳しい話は{t:20}を読んでもらうとするが、無為から見た天下取りはこんな具合である。//さあ、天下を取ったら統治だ。{s:57}では天下をとった後、無為を為せば民は安定方向に変化するとある。聖人の無事の影響を受け民が満足できるようになり、聖人のが無欲に教えられ民が素朴になる。それで天下が太平となる。もし為してしまえば{s:75}のように民が苦しむ統治となるので、無為に生きるのは賢いのだ。//太平とはトラブルが起きないことである。トラブルが起きた時の責任の所在はトップにあるのだから、太平時のリスク対策は重要だ。聖人の太平政治は{s:63}にある。無為とは自分の仕事がなくなるように暇を努めることであり、無事とは事件を未然に防いで起こさせないことであり、無味とは目立った事件もなく平凡な日々が続くことを当たり前なものにすることである。{s:64}の通り、これを気を抜かないで続け、最後には自然へと帰って行き、庶民に混じっていく({s:70})から、破られることのない長期的な支配を続けられるのだ。//これが聖人の心構えとしての統治法だが、民の統治は愚民政策である。なぜ愚民政策が良いかというと、無為だからである。その無為の真意は{s:2}にある。聖人は小さな差異を見つけ出して区別や差別をしないのだ。だから、{s:3}では民に差別区別を気付かせないように無知を徹底させる。なぜなら、民は差があるとそれを埋めようと争い始めるからだ。だから、聖人は善や賢を褒めないようにして民を無欲にする。{s:49}のように無心を心がけて好き嫌いをせず、善悪で差別をしない。また、{s:5}のように、多くものを言うと器がしぼんで民に危害が及ぶことを懸念して、不仁を努めてひいきをしない。そういう聖人の無為によって民が安定する。それをまた{s:2}に戻って不言の教えを行うこととする。聖人は比較しても幸せにはならないことを民に黙って教えるのだ。{s:10}でも、民に努力を気取られない無知と民の善行悪行を見て見ぬふりをする無知があり、ここにも無為にして為す思想がある。//統治の詳しい話は{t:5}にあるが、無為から見た統治はこんな具合だ。//「無為」を簡単にまとめると、他人のために何かをするが、直接はたらきかけずに遠回しに成果を上げて、誰がやったのかをわからないようにすることのようだ。//{s:2}/・「無為」聖人は小さな差異を見つけ出して区別や差別をしない/・「不言」聖人は比較しても幸せにはならないことを民に黙って教える//{s:3}/・「無知」聖人は民に差別区別を気付かせない/・「無欲」民は差を埋めようと争い始めるから/・「無為」聖人は善や賢を褒めないから民が安定する//{s:5}/・「不仁」聖人はひいきをしない/・「不言」聖人が多く言うと器がしぼんで民に危害が及ぶ//{s:10}/・「無知」聖人は民に努力を気取られない/・「無知」聖人は民の善行悪行を見て見ぬふりをする//{s:19}//{s:37}/・「無為」道は無為なのに為す/・「無欲」王侯が無欲なら天下は勝手に安定する//{s:38}/・「無為」徳者は無為で成功するが自分の仕業ではなかったことにする//{s:43}/・「無有」無有は狭いところに入れる/・「無為」無為は有益である/・「不言」うるさく教えないやり方は有益である//{s:47}//{s:48}/・「無為」人は損が続くと無為となる/・「無為」無為な人は無為なのに為す/・「無事」無事な人は天下が取れる//{s:49}/・「無心」聖人は好き嫌いがないから善悪で差別をしない//{s:57}/・「無事」聖人は無事(戦争を避け兵器開発をせず謀略家を起用せず法律も厳しくしない)だから天下が取れる/・「無為」聖人が無為なら民が安定方向に変化する/・「無事」聖人が無事なら民が満足できるようになる/・「無欲」聖人が無欲なら民が素朴になる//{s:63}/・「無為」聖人は自分の仕事をなくして暇にする/・「無事」聖人はトラブルを未然に防いで事件を起こさせない/・「無味」聖人は平凡を当たり前なものにする//{s:64}/・「無為」聖人は無為だから負けない/・「無執」聖人は無執だから失わない/・「無敗」聖人は最後まで気を抜かないから負けない//{s:70}/・「無知」聖人は有能さを知られないよう努める//{s:75}/・「無為」無為に生きるのは賢い/','2012-01-07 07:46:30'),(4,'無への回帰','老子を読み進めていると「帰」「反」「復」などと言った文字が何度か出てくる。どうやら道は必ず返る動作を起こすようだ。人もまた道に従うならば返るのが自然だろう。ここでは返ることに触れた章の要点をまとめた。//・成功したら長居しないで去る({s:2})/・成功したら退くのが天の道({s:9})/・名付けようのない物は物ではないところに返る({s:14})/・盛んに伸びている物は根に帰り命に返る({s:16})/・道は大だから遠くに行って返ってくる({s:25})/・物は無欲な小さい人のところに結集してくる({s:34})/・道の動きは返る({s:40})/・道徳を知り小に復帰すれば安泰({s:52})/・無為で原始に帰って自然と生きる({s:64})/・玄徳は物と返った後順番通りになる({s:65})//この中で{s:14}だけは本テーマとは関係ないようだが、あとはだいたい同じようなことを言っているとしていいだろう。//まずは{s:25}と{s:40}。道の動きを円運動としたもの。円の周囲を進むことを考えるとき、開始点から対極の位置までいけば、その後は進むほどスタートに戻ることになる。だから遠くまで行けば返る。{s:40}は{s:25}の補強。//{s:16}では、道を植物にたとえて返る動きを説明している。植物は生い茂って実が成った後は種に返る。//{s:34}では、聖人の生き方で返る動きを説明している。人は無欲な小さい人を慕って返ってくる。その結果、{s:65}のように治安が回復して順番が戻る。だから、{s:52}のように小さく生きて、{s:64}のように返って平和にしようという流れだ。//よって、{s:2}や{s:9}のように成功したら引退するのが自然なんである。//そこで{s:25}に話しが戻る。道のように「返ってくる大」とは、円運動する天体、緑を循環させる大地、歴史を循環させる聖人なんである。これらが世界を代表する無への回帰者なのだね。//余談だが、{s:32}の「小」は{s:34}の「大」になる前の「小」なのだ。','2012-01-07 07:46:31'),(5,'聖人の統治','聖人は上手に天下をまとめる人である。では、どうやってまとめるのか。老子に出てくる統治関連の話題をざっと集めてみたが、少々一貫性がない。解釈に悩むが、聖人を目指す人の生き方には二種類あると考えてみた。詳しくは{t:7}の最後の方に道と徳の違いとして書いたが、統治面で言うならば帝道と王道みたいなものではないか。/そこで、聖人の統治法を二つにわけてまとめてみた。//聖人見習いレベルの国王の段階では次のようにする。//知恵に頼らない{s:19}/仁義を押し付けない{s:19}/技巧を凝らして利益を追求しない{s:19}/素直に素朴に欲張らないで生きる{s:19}/みんなが慕ってついてきても主人とならない{s:32}/素朴に生きて、できるだけ何もしない{s:37}/成果を数えない{s:39}/平凡な姿で生きる{s:39}/頑固な乱暴者にならない{s:42}/へりくだる{s:42}/欲しがる姿を見せない{s:46}/欲しがらない{s:46}/現状に満足する{s:46}/へりくだる{s:61}/小国は頭を下げて仕えて守ってもらう{s:61}/大国は頭を下げて仲間になってもらう{s:61}/へりくだる{s:66}/後ろに回る{s:66}/争わない{s:66}/押してもらう{s:66}/生きてるだけで満足する{s:75}/強欲に生きようとはしない{s:75}//{t:20}と共通する部分もあるか。//こっから聖人レベル//聖人による民の統治法は「無知無欲」にする愚民政策。それは{s:65}と{s:3}にはっきりと書かれている。//・頭を空っぽにしてバカ正直にする{s:65}/・心を空っぽにして腹を一杯にする{s:3}/・向上心をなくして身体を強くする{s:3}//一度老子を理解した人なら、これだけあれば政治思想を充分に示せていることがわかるが、やはり言葉が足りない。/それを実現するためにはどうするかを書く必要があるだろう。大筋では聖人がバカなふりをして人をバカに染めていくのだ。//・賢い人を優遇しない{s:3}/・高価な物をありがたがらない{s:3}/・理想的な姿を知らせない{s:3}/・無知無欲な姿を見せる{s:3}/・知恵の政治と無知の政治を知る{s:65}/・強いのに敢えて弱い者を守る{s:28}/・正しいのに敢えて悪い者を守る{s:28}/・高貴なのに敢えて賎しい扱いを受ける{s:28}//民は愚かにするが自分は賢くあるという狡猾な政治が{s:65}に垣間見えるが、他の章と合わせれば自分も愚かになってバカ正直に生きる手本となるのだと考えているのがわかる。良いモノを知ってしまうと差がついて、そこから負の感情が生まれてしまうものだ。善悪は優劣を言い換えただけで、優が譲ってやれば悪はいなくなるのだ。//・善人は悪人の手本になれる{s:27}/・悪人は善人になれる{s:27}/・善悪をはっきりさせない{s:49}/・善人は尊敬してもらえる{s:62}/・悪人は庇ってもらえる{s:62}/・悪いことをしても罰しない{s:74}//だから、バカになって弱い者に合わせてやる。老子にはそういった平等思想がある。つまり、ものごとを階級で分けて秩序を作るよりも平等にして落ち着けた方が治まると考えたようだ。//・公平になるよう調節する{s:63}/・公平に愛してゆっくり混ぜる{s:49}/・無理な和解はしない{s:79}/・無理な約束は催促しない{s:79}//だから、聖人は民との付き合いでは無為・無事・無欲の放任主義になるようだ。民の自立心を促して自治させる。これを続けると聖人に感化されて民に変化が起きる。//・抜け目ない政治は避ける{s:58}/・よくわからないもやもやした政治をする{s:58}/・特に大国は政策をいじりまわさない{s:60}/・民を信じて任せる{s:17}/・うるさい口出しはしない{s:17}/・民の話をよく聞く{s:10}/・民の行動を見ながら黙って見守る{s:10}/・自分から無為になろうと変わっていく{s:57}/・自分から正しい道に進んでいく{s:57}/・自分から豊かな生き方を覚えていく{s:57}/・自分から無欲で素朴になっていく{s:57}//その結果、民からはこんな支配者に見えて、民は自立を自覚する。//・存在を知っているものの具体的な成果は何も知らない{s:17}//これが{s:63}の「無為」である。しかしながら、けっして愚鈍ではない。その真意はこうである。//・平凡から危機を嗅ぎとる{s:63}/・トラブルは未然に防ぐ{s:63}/・問題を安易には考えない{s:63}/・民を愛して骨を折っても苦労は見せない{s:10}//こんな聖人の自己統治法はこうである。//・自分の行動に間違いないか自己批判する{s:10}/・自分に間違いがないかチェックする{s:72}/・心を空っぽにする{s:5}/・動かない{s:5}/・軽率な行動は慎む{s:26}/・しゃべりすぎない{s:5}/・中立でいる{s:5}/・安全な場所にいる{s:26}/・補給を優先する{s:26}/・自慢しない{s:72}/・自分を愛する{s:72}/・天下を自分の身のように愛して大切にする{s:13}/・国の不幸や不始末を引き受ける{s:78}/・尊敬してもらおうとは考えない{s:72}//影響力の強さを自覚していれば動き回ることが民の負担になることくらいはわかる。できるだけ無気力無関心を装いながらも、肝心なところではこっそりと遠回しに働きかけて手柄はすべて他人に譲るわけだ。//これが聖人の姿である。//ちなみに老子の理想とする国家が{s:80}にある。聖人の政治ではないので上記のまとめには組み込まなかったが、参考までに取り上げておきたい。//・小さくて人が少ない/・有能な人を起用しない/・便利な道具を使わない/・民を危険に晒さない/・質素に','2012-01-07 07:46:32'),(7,'極と中','中庸。極端を避けて中くらいを維持する。//この「中庸の良さ」は古今東西を問わずさまざまな賢者が「最も良く最も難しい」と言及してきた。上昇志向の厚い孔子であっても最後には中庸が最も良いと言った。老子もそこは同意見だったようだ。老子ほど極端な物の考え方をする人もなかなかいないと思うが、極端がどんなものかを知った方が理解しやすいといったところだろう。//そこで「極端」と「ほどほど」について書いた章をまとめてみた。//まずは、{s:9}。ここでは、やり過ぎると失敗する例を日常生活の中から出すことでわかりやすく教えている。さらに、成功したら後腐れなく辞めてしまうことを勧めている。大抵の人は成功に味をしめると失敗するまで辞められない。失敗してやっと極端だったことに気付く。/ほどほどの難しさを教えるにはこれで充分だろう。極端がなぜいけないかといえば、取り返しがつかないほどの失敗をするからだ。極端を行って失敗する人の例は{t:9}でも見ておけばいいだろう。//{s:30}も極端で失敗する例だ。軍事力に偏った国家運営。相手に服従の意志を取り付けるだけで済まさず、貢物を要求して威張る。こちらは戦争で大勢の人を巻き込む分、より悪質だ。ここでは、「盛んであれば老いる」と国を人の生涯にたとえて教えている。//{s:44}は{s:9}の続きであると考えて良いか。たくさん持ちすぎると維持に手間がかかりすぎて多くを失う。だから、「知足」。つまり、ほどほどで満足するのが良いとしている。この「知足」こそが老子流の「中庸」表現だろう。//「知足」は{s:46}にも出ており、何でも手に入れようとするのは単なる失敗では済まされず、罪であると言っている。//逆に不足していることで成功する例もある。{s:76}は{s:30}のように軍事力に頼る国を老人にたとえて戒めているが、それと同時に生まれたての柔らかな赤ん坊は生命力が豊かであると言っている。//{s:55}も{s:76}と同じ理屈で、赤ん坊のように裸で無垢な姿であれば将来が安心で、立派になると老いがくるとしている。//だから、{s:77}のように多い者から減らして少ない者に移すのが自然な道だと言う。これが道の持つ力「{t:4}」である。//極端な強気に出てはいけないことはわかった。弱いほうが将来性豊かであることもわかった。では、リーダーは実際どうすればいいのか。極端と中立のシンプルな説明は{s:42}にある。中が成立するには「陽」と「陰」の両者の他に三人目となる「中」がいなければならない。この沖気と陰陽がそろってバランスを保てる。//{s:28}では、善悪の両方を熟知しておいて、そこから悪の弁護をしていく。それでやっと善でも悪でもないほどほどのバランスが取れるとしている。//{s:59}では、勝てないことがないだけの力がつけば極端なことをする必要がないとしている。国はそれでやっと維持できるとしている。//{s:58}では、極端なことをすると、正義であったものが悪に変わり、悪であったものが正義となる反転作用が起きるとある。その反転ポイントは誰にもわからないので、はっきりとはしない方が良いのだとしている。これは{s:49}も同じような話で老子なりの政治感覚であろう。//{s:5}では、言葉を少なくして中立を守れと直接的に戒めている。ぼんやりと広い心で濁しておくのが良い理由は上記でわかるだろう。//全体を通してみると「中立にいてバランスを取れ」と「低いところに回ることで将来の飛躍としろ」の二種類の主張があって揺れている。老子の考えは前者なんだろうが、善悪の二元論で話しが進むと後者に行ってしまうようだ。//これには何か決定的な違いがあるのか。どうも「徳」が成長段階の生き方で「道」が達成後の生き方っぽい。/成長段階では徳を行う。強くなるごとに減らして弱めて道に助けてもらいながら強くなる。このサイクルを回して器を大きくしていく。/成長によって天下が取れたら人が集まってきてしまうので中立を心がける。だから、低いところに意識を置くのはいいが、ステップアップのために下るようでは、まだまだなのかもしれない。/','2012-01-07 07:46:35'),(8,'谷-低いところへ','道の姿は水を貯めた容器にたとえられる。よって、水の特性を知り、水を貯める秘訣を知ることが道への近道となる。低いところへ流れるのが水の特性の一つであるから、自ずと川や海がたとえで出ることになる。そこで水が流れる章をまとめてみた。//水が低いところへ流れることの良さを描いたのが{s:8}だ。ここでは、はっきりと「道に近い」と言っている。そこで水とは、ただ流れるだけではなく、あらゆる生物に公平に利益を与え、自分が汚されながらも不平や見返りを求めないからこそ道なのだとしている。//{s:32}道で天下を治めるのは、水が川へと流れてやがては海へ注ぐように自然に低いところへ行くものだ。支配者はもっとも低いところに居ることが自然だ。//{s:61}大国は川で言えば下流。高い場所にある川は支流。川は最後には低い大河へと交わっていく。大国は下流のようにじっと交わってくるのを待って受け入れればよい。//{s:66}海がどんな大河より大きいのは、何よりも低いところにあるからだ。同じように道を極めた王は民よりも低いところにいるべきだ。//{s:67}では、人生をより良く過ごすための三つの信念を谷にたとえている。谷底を流れる水が生物を慈しむように、人もまた慈しみを第一に考えてつつましく生きるのだ。もし、谷が深さをなくせば、水は枯れて生物は死ぬ。同じように、人が優しさを忘れてでしゃばるようなら、人は枯れて死んでしまう。//{s:28}では、単純に低いところに行けばいいのではなく、一度は高いところに行っておいて、敢えて低いところに居ることで、誰より深い谷となれると言っている。//{s:6}は水は流れていくものなのに枯れない川の不思議さを女が子を産んで家を存続させていく生命力にたとえている。//総合的なまとめは{s:6}にあると考えられる。人類を支えているの女性の谷の力と言っても過言ではない。//{s:68}上手に人を使う人は低いところへへりくだる。/','2012-01-07 07:46:35'),(9,'失敗する人','良くない手本として失敗する人の例がたくさん出てくるのでピックアップしてみた。たいていは「強いのに欲張ってさらなる高みを目指してしまう」ことと「余計な競争に勝つために悪知恵を働かせる」ことに収束するので、まとめはしない。各章を直接見てもらおう。','2012-01-07 07:46:36'),(10,'聖人の心得','やってはいけないこと//{l:衿}:{s:22}で不自矜故長。{s:24}で自矜者不長。{s:30}で果而勿衿。//{l:伐}:{s:22}で不自伐故有功。{s:24}で自伐者無功。{s:30}で果而勿伐。//{l:驕}:{s:30}で果而勿驕。//{l:彰}:{s:22}で不自是故彰。{s:24}で自是者不彰。///うまくいった時に気を付けること//{w:不辭}能書きを垂れることの禁止:{s:2}で作焉而不辭。{s:34}で生而不辭//{w:不有}見せつけることの禁止:{s:2}、{s:10}、{s:51}で生而不有。//{w:不恃}見返りをあてにすることの禁止:{s:2}、{s:10}、{s:51}、{s:77}、{s:34}で爲而不恃。//{w:不宰}仕切ることの禁止:{s:10}、{s:51}で長而不宰。{s:34}で愛養萬物而不爲主。//{w:功成}:{s:2}で功成而不居。{s:9}で功成名遂身退。{s:34}で功成不名有。{s:77}で功成而不處。//ふだん気を付けること//{w:生之畜之}:{s:10}//見/愛/處//自/後','2013-02-06 10:34:25'),(11,'逆転の発想','老子の面白さは逆転の発想にあるだろう。善悪の価値観を逆転させると意外な発見がある。この驚きが老子の魅力の一つであることは間違いない。この発想の転換は、特に創作活動をする人にとって大きなヒントとなる。そこで、老子的転換術をまとめてみたので、次のものを身の回りから発見してみよう。//・穴があるからこそ役に立つ道具がある{s:11}/・へこんでいるからこそ役に立つ道具がある{s:11}/・曲がっているように見えて真っ直ぐなものがある{s:22}/・壊れるからこそ新しくなるものがある{s:22}/・少ないからこそ得られるものがある{s:22}/・道を傷つけずに車を走らせる方法{s:27}/・複雑な計算を暗算で済ます方法{s:27}/・鍵以外の手段で泥棒を追い払う方法{s:27}/・手錠をかけないでも逃げられない方法{s:27}/・大きくなりすぎてしぼんでしまったもの{s:36}/・強くしすぎて弱くなったもの{s:36}/・作り過ぎて廃れたもの{s:36}/・貰いすぎて奪われたもの{s:36}/・堅いより柔らかい方が有利なもの{s:43}/・太いより細い方が有利なもの{s:43}/・強いからこそ死ぬもの{s:76}/・弱いからこそ生き残ったもの{s:76}/・弱い者が強い者に勝つ{s:78}/・柔らかい者が堅い者に勝つ{s:78}/・欠陥があることで完成しているもの{s:45}/・空っぽに見えるのに充満しているもの{s:45}/・ヘタクソに見えるのに上手なもの{s:45}/・話さないのに話しが上手い人{s:45}/・寒ければ動き暑ければ静かにする{s:45}//これらに限らず物事を両面から考えることを習慣にしておけば視野は拡がり困った時に打開できる発想力が身に付くはずだ。','2012-01-07 07:46:38'),(12,'専門用語','老子には独自の世界観があり、それを説明するために、たくさんの造語・専門用語がある。大抵は是謂や、是所謂で語られるが、各章に散らばっていたり、微妙に言い回しが違ったりと、初見では全容を掴みづらい。そこで、それらをここに集めてみた。//名//{l:一}:{s:10}と{s:22}では、一を抱けと命令している。その一とは何か。{s:42}では、道が生んだものが一。{s:39}では、王侯は一を得たから天下の行く末を問うことができるようになったとある。{s:25}では、王は四大の中の一つか。それぞれの関連性は薄いようだ。/{l:徳}:→{t:15}//{w:玄徳}:→{t:15}//{l:常}:「いつも」という意味以外に用語として使われることもある。{s:16}では、命に復ることを常とし、{s:55}では、和を知ることを常としている。その後、どちらも常を知るのが明としている。また、{s:52}では、{w:習常}と出てきて、これを常を習うとするか、常に習うとするかで解釈が別れそうだが、これはおそらく後者だろう。//{l:明}:→{t:18}//{l:智}:→{t:18}//{l:大}:{s:25}では、{l:道}を適当な一文字にするなら大とあって、大であれば{l:逝}き、逝けば{l:遠}いとしてる。{s:34}では、いつも無欲なものを{l:小}、万物の帰る場所なのに主とならないものを大としている。また、{s:35}では、安平大とある。これは太の意味だろう。//{l:小}:{s:34}では、いつも無欲なものを{l:小}としている。{s:52}では、小を見るを{l:明}といっているが、この小を無欲としても意味は通りづらいので、ここは小さいとすべきだろう。{s:32}では、撲は小といえども~とあるが、素朴で無欲となれば意味が通る。うがち過ぎだろうか。//{l:反}:/遠//{l:復帰。}キーは{s:28}。優劣両方を極めて、劣を忘れなければ、初心に帰れる。/優劣入り交じれば、{s:14}のような捕らえ所のない存在になる。/似た言葉で{l:反}もある。//{l:妙}:{s:1}では、無欲でいれば見えてくるものとし、{s:27}では、善人を見習いながら、悪人もいつかは善人になれると信じて愛することが、妙の要としている。//{l:樸}:→{t:14}//{l:希};{s:14}では、聴こうとしても聞こえない音。{s:23}では、自然は希言。{s:41}では、大音は声希。//眞://{l:極}:/{l:静}/{l:式}:手本。キーは{s:28}。清濁飲み込んで一方をひいきしないことで手本となる。それは道だけやってれば実現できると{s:22}にあり、{s:65}では、手本となるにはどうすればよいのかを考える。ずる賢く治めるがいいか、バカ正直がいいか。','2012-01-07 07:46:39'),(13,'道者が争うとき-不争の徳','不争という言葉は七つの章に登場する。つまり、争いを避けることは老子の教えの中でも重要な位置を占める。そこで、なぜ争ってはいけないのか、そのメリットとデメリットをまとめた。その結果、道者は必ずしも不戦を貫く平和主義者ではなく、戦うときもあることがわかった。その条件についてもまとめた。/なお、争いとは狭い意味では戦争であるが、広い意味では競争となる。//争うことのデメリット/・戦争は凶作を呼ぶ//争わないことのメリット/・民が大人しく従う/・間違わない/・逆らってくる相手がいなくなる/・民が喜んで支えてくれる/・相手の力を上手に利用できる//争いを許せる条件//争いを許容していると思われる章は以下である。/{s:30}・{s:31}・{s:67}・{s:69}/これをまとめると、/・積極的にはしない/・避けられないときに仕方なくやる/・必要最小限で行う/・犠牲者を哀しむ気持ちを持つ/・慈愛を持つ/・目的を果たしたらそこで止める/・相手を軽く見ない/・戦功を手柄にしない/・戦功を自慢しない/・勝利に酔いしれない/・傲慢にならない//こうやってまとめてみると、すごくわかる。ただ、争うメリットと争わないメリットについては書かれていないので、論としては不公平な感じはする。{s:73}のように判断が難しいのかな。/','2012-01-07 07:46:39'),(14,'無名の樸','{l:樸}という字は六回登場する。特に無名の樸として、とらえどころのない存在として描かれる。//まず、{l:樸}は文字としては「切り倒したばかりの木の丸太」の意味を持つ。「名」は固有名詞を付けて違いを認識できるようになったものであるから、「無名」とは「何とも呼びようのない状態」となる。//つまり、「無名の樸」とは、そのままでは何の役にも立たない素材でありながら、一度手を加えればあらゆる木工品へと変化できる無限の可能性を秘めた存在でもある。これは、何とも名付けようのない「道」があらゆる物を生み出したように、無名の樸も万物の母となりうることを意味する。//となると、人は無名の樸のように何一つ手を加えない姿であることで、道に近いものを得られるということになる。大雑把な意味では「素朴」くらいだろうか。//「無名の樸」が直接出てくるのは{s:37}。ここでは、無名の樸を無欲な状態としている。人には本来「無名の樸」が備わっており、高貴な人が素朴であれば人は自然と変化する。しかし、貴人に気に入られるために「無名の樸」になろうとするのは欲となる。欲が出た人には、「無名の樸」で抑えようと言っている。/{s:57}では、「我」が無欲ならば民は樸となると言っている。どちらも手本として見せてもよい無欲さのことを言うのだろう。//{s:28}では、栄誉を知りながら恥ずかしいとされる身分でいれば、樸になれるとある。つまり、初めから無能なわけではなく、敢えて無能なのだ。/さらに、樸は切ったり割ったりすれば道具になるが、聖人は道具になった人材を役人にして働かせると言っている。だから、樸になったら切ったり割ったりするなと戒めている。欲を出せば道具へと変化し、道具になれば可能性は頭打ちとなる。聖人への道はバカなふりをするレースでありながら、その最高バカが役人の人事権を持つ。老子らしい、おかしな話だ。//{s:19}では、樸を抱けと命令しているので、率先して取り組むべきものなのだろう。//{s:32}は少し複雑で、{l:小}の意味を知るために{s:34}とセットで読まねばならない。/{s:34}によると、小とは無欲。つまり、樸である。樸と同じような小であれば、万物が集まってくる。そこで指図しなければ偉大となる。/その解釈で{s:32}を読めば、諸侯が樸として命令しなければ安定するという話になる。//{s:15}の樸はあまり無名の樸とは深い関係はなさそうだが、無能さの補強ではないかと思われる。/','2012-01-07 07:46:39'),(15,'徳について','道徳経の名が示す通り、徳は道に続いて重要な概念だ。特に関連する章をピックアップして徳の姿をさぐってみた。/徳とは一般的には人の奥ゆかしい心や行いをいう。これらの徳は徳者のふるまいを例にあげれば、日常で見ていることもあってすぐに理解できるはず。//一般的な徳とはこういうことだ。//・徳が備わっているのに徳はないと控える{s:38}/・さりげない働きかけで助けて知らぬふりをする{s:38}/・怨まれたら仕返しするのではなく優しくする{s:63}/・約束を取り交わしたら相手を信じて黙って待つ{s:79}/・悪人にも善意はあると信じてやる{s:49}//徳がないとはこういうことだ。//・徳を失うまいと気にかける{s:38}/・見えるように親切にふるまう{s:38}/・約束は約束だと取り立てる{s:79}//では、老子的な徳って何だ?//・道が産んだものを養う{s:51}/・命令も意識もなく自然にはたらく{s:51}//玄徳って何だ?//・道が生んだものを自然に発展させる{s:51}/・発展させた相手に指図しない{s:51}/・人を発展させて指図しない{s:10}/・深く遠く返った後順序が戻る作用がある{s:65}//玄徳の話は少しややこしいか。徳にも上中下のランクがあり、上徳の上に玄徳があり、そのすぐ上には道があると想像している。徳の真髄は道とほとんど同じだと考えたのだ。/なぜなら、{s:42}には万物が道から発生した様子が描かれているが、この「無→一→二→三」の工程は{s:51}の「道→徳→物→器」と対応しており、この序列に従えば、徳の奥(古い時代)にあるのが道だからだ。/だから、徳は道から生まれて一を二にする存在と考えて違和感はない(徳は道から生まれたとは老子のどこにも書いてないが)。/人間は万物の一員「三」であるが、物であることを意識できれば「二」が見えて、徳を備えれば「一」が見えて、道を得れば「無」が見える。この数字で言えば、玄徳は無に近い一、0.2とかそれくらいだろう。/だから、玄徳については{t:1}を見るのが正解だろう。//徳を何かにたとえるなら。//・赤ちゃんのような不思議な力がある{s:55}/・高い徳とは谷のようにへこんだ器{s:41}/・広い徳は広い谷のよう{s:41}/・しっかしした徳は怠けている{s:41}/・孔の形をしている{s:21}//どうすれば徳が身につくか。//・強く正しく立派になれるのに敢えて弱く悪く賎しい立場でいる{s:28}/・基礎をしっかり固める{s:54}//徳を身につけるとどうなるか。//・余剰が出て国が豊かになる{s:54}/・無敵の力が備わって国を興せる{s:59}/・鬼神とも上手くやっていける{s:60}//いつ頃始めるべきか。//・なるべく早く始める{s:59}//徳が身についているかチェックせよ。//・精神を安定させて柔らかく対応する{s:10}/・自分をしっかり見て自己批判する{s:10}/・自分の苦労を他人に知られないようにする{s:10}/・人の話をよく聞く{s:10}/・なんでも知っていながら知らないふりをして見守る{s:10}//これができていて、なおかつ人に指図しなければ玄徳といえよう。//玄徳政治はどんな様子か。//・知恵を働かせる統治を知る{s:65}/・知恵に頼らない統治の違いを知る{s:65}/・後者が優れていることを知る{s:65}/・常に知恵を使わないよう意識する{s:65}//つまり、愚民政策となる。愚民政策が何かは{t:5}にある。なぜ愚民政策かは{t:7}にある。/','2012-01-07 07:46:40'),(17,'人を信じる','老子は性善説と言われる。愚民政策を提唱するような人が性善説なのかと引っかかるところはあるが、要所で「信じる」「信じないと信じられない」と言っているのだから、人を信じることを是とすることに間違いはない。念のため箇条書きでまとめてみた。//・支配者が無欲であれば見習う/・教育をやめて法律もなくせば正しい心が勝手に育つ/・民の純真な気持ちを信じて素朴になるのを待つ/・民を信じて指図せずに自分らでやらせる/・民の力を信じて辛抱強く成長を待つ/・素行の悪い民も信じて愛せば善人となる/・信じてくれない人も信じるのが徳/・民同士で分け合うようになる/・民を信じない者は民からも信じられない//といったところか。確かに民が支配者の徳に着いてきてくれることを信じていなければ通用しない統治法である。/','2012-01-07 07:46:41'),(18,'明-浅はかな智慧と絶対的な智慧','老子は随所で{w:無知}であれと言っている。では、本当に何も知らないでいいのかといえば、そうでもない。一体、何を知るべきで、何を知るべきでないのか。//まず、知るとは何か。{s:33}に、「人を知るのが智」とある。これを第一の足がかりとする。智、つまりは「他人を観察することで利害を見つけ出し、欲を刺激することで人を操ろうとする、そこで活用される知識のこと」。これを持ってはいけないものと言うのだろう。他の章でも{l:智}という文字はおおむね否定されている。{s:18}では、他国を騙すための策謀を出すために活用されているとして、これを否定。{s:19}では、身分の差、貧富の差を産む元として、これを否定。{s:57}では、人々が知恵を付けると、狡賢く立ち回る者が出て、それを真似たり嫉妬したりと悪いことが起きると主張。{s:65}では、{s:57}の理由から、政治に知恵を持ち込まないことが肝要だとしている。//では、知るべきはなにか。{s:33}に、「自分を知ることが明」とある。この{l:明}という文字も随所に出てくるが、こちらはおおむね肯定的な文脈で使われる。{s:16}では命が循環することを{l:常}といって、これを知ることとしている。{s:52}では、小を見ることとし、{s:55}では、調和を知ることを常といって、常を知ることとしている。このように{l:明}とは、知っておくべき絶対的な智慧として取り上げられているが、章ごとに揺れがあって一貫していない。また、単に感覚的な「明るい」の意味で使っていたり、「民を明るくしないで愚かにする」と否定したり、もっとも解釈が難しい文字。自分がいつか老いて死ぬことを受け入れていることを言うのだろう。/','2012-01-07 07:46:41'),(19,'悲しくなったとき-道者のつよがり','人は誰でも気持ちが揺れ動く。時には悲しい方向に。特に道を行くことは常に損をすることである。報われない人生に嫌気がさしても不思議ではない。そんな道者たちのために、自分の気持ちを慰める話しも用意されている。悲しくなったら、それらを読んで元気を出すといいだろう。//{s:20}は老子の中では最も異質な章。誰でも突然の展開にびっくりするだろう。しかし、その詩的な美しさは際立っていると言える。理解者がいなくて辛い人には最大級の癒しかもしれない。しみじみと自分を卑下する気持ちで読み、最後の「我獨異於人、而貴食母。」だけはきっぱりと読んで気持ちに整理をつけるといいだろう。//要領が悪いと笑われたときは、{s:41}で笑い返せばいいだろう。//かつての仲間たちが出世して出遅れちゃったときは{s:53}だ。挫折や失敗も乗り越えられるぞ。特に不正な手段で昇った相手には圧倒的に有利な気持ちになるぞ。//実利主義者に「考えが甘いからそうなるんだ」と貧乏暮らしを馬鹿にされた。そんな時は{s:67}だ。反論せずに心のなかで自分に言い聞かせればいい。//社会から評価されずに不遇な貧困生活を送っているなら{s:70}だ。見出されない辛さは隠れているんだとすりかえて飲み込め。//','2012-01-07 07:46:42'),(20,'道者の天下取り','聖人とは天下をよく治める人である。かつて、道を極めた聖人が天下を治めたのなら、道を行くことは天下を取ることを意味する。道は無為だと言ってみたところで、結局は天下が転がり込んでくるわけだから、どうやって天下を取るかも書いてあるはずだ。そこで、天下を取るための行いと攻撃方法に言及したものをまとめてみた。//・天下は取ろうとすると失敗する{s:29}/・天下は何もしないで取るものだ{s:48}/・何かするようでは天下は取れない{s:48}/・なぜなら人は追えば逃げるから{s:29}/・だから人の先に出ないで後にいて{s:67}/・争わないでへりくだり{s:68}/・いつも損する役に回って{s:48}/・派手なことは避けて強気にならない{s:29}/・こうやって力を借してもらう{s:68}//・兵力で強引に決めると不幸になる{s:30}/・講和できれば終わりにする{s:30}/・それ以上にやり過ぎると疲れが出て破綻する{s:30}/・だから節約する{s:67}/・しかも早めに節約を始める{s:59}/・すると極端なことをしなって国ができる{s:59}//・こちらから積極的には戦わない{s:69}/・嫌な相手は増長させて自滅させる{s:36}/・それでも避けられないときは最低限度にあっさりと戦う{s:31}/・ただしけっして相手を軽く見ない{s:69}/・秘密兵器は最後まで隠して{s:36}/・相手をおびき出す{s:69}/・意外な作戦で一気に勝負をつける{s:57}/・力が拮抗したときは悲しんだ方が勝つ{s:69}/・だから戦争は哀しみの気持ちで臨む{s:31}/・勝って喜ぶ者に天下を狙う資格はない{s:31}/・慈しみを持てば攻めても守っても強い{s:67}//・政治は正しいやり方で治める{s:57}/・正しいとは知恵や道具や法律に頼らない{s:57}/・こうやって何もしないで治める{s:57}/・天下を取ったら引き際を定めて{s:64}/・知恵がなくても生きていける国にする{s:64}//これらの他にも{t:5}の王道を歩む生き方が天下取りのノウハウを含んでいる。','2012-01-07 07:46:42'),(21,'モノづくりのヒント','{s:2}萬物作焉而不辭、生而不有、爲而不恃、功成而不居。 /仕事を始めても何も言わず、根回しが終わっても成果有りとせず、達成しても見返りも求めず、周囲が成功したと認めても居座ったりしない。','2012-01-07 07:46:42');\r
+/*!40000 ALTER TABLE `themas` ENABLE KEYS */;\r
+UNLOCK TABLES;\r
+\r
+--\r
+-- Table structure for table `words`\r
+--\r
+\r
+DROP TABLE IF EXISTS `words`;\r
+CREATE TABLE `words` (\r
+  `id` int(11) NOT NULL auto_increment,\r
+  `letter` varchar(20) NOT NULL,\r
+  `count` int(11) NOT NULL default '1',\r
+  `yomi` text NOT NULL,\r
+  `detail` text,\r
+  `update_at` datetime default NULL,\r
+  PRIMARY KEY  (`id`),\r
+  UNIQUE KEY `index_words_on_letter` (`letter`),\r
+  KEY `index_words_on_count` (`count`)\r
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\r
+\r
+--\r
+-- Dumping data for table `words`\r
+--\r
+\r
+LOCK TABLES `words` WRITE;\r
+/*!40000 ALTER TABLE `words` DISABLE KEYS */;\r
+INSERT INTO `words` VALUES (1,'天下',61,'てんか','[人間社会のこと。]/{w:天地}とこれば、物理的な世界のこと。/→{t:20}','2012-01-07 07:43:47'),(2,'是以',39,'これをもって','[こういうことだから。]/前の文章を結論付けるときの言葉。','2012-01-07 07:43:48'),(3,'聖人',32,'せいじん','[偉大な人。理想的な人。]/特に古代中国に王朝を築いた堯・舜や夏の禹王、殷の湯王、周の文王などをいう。/→{t:5}/→{t:10}','2012-01-07 07:43:48'),(4,'是謂',26,'これ、いわゆる','[これを一言でいうなら。]/前の文章を短くわかりやすいフレーズで言いかえるときの言葉。','2012-01-07 07:43:49'),(5,'萬物',20,'ばんぶつ','[あらゆる物。生物も含む。]','2012-01-07 07:43:49'),(6,'道者',10,'みちのもの','[道を実践する人たち。]/→{t:20}','2012-01-07 07:43:50'),(7,'天地',9,'てんち','[自然や自然現象、世界全体のこと。]/天は空(大気圏)だけでなく宇宙も含むので、違和感はあるかもしれないが、宇宙とした方が意味が近い。/{w:天下}といえば人間社会。','2012-01-07 07:43:50'),(8,'善人',7,'ぜんにん','[正直で誠実な人。]','2012-01-07 07:43:50'),(9,'大國',6,'たいこく','[人口の多い国。]','2012-01-07 07:43:50'),(10,'小國',5,'しょうこく','[人口の少ない国。]','2012-01-07 07:43:50'),(11,'無欲',5,'むよく','[欲望がないこと。]/先入観や思い込みのない状態。/何とかしてやろう、うまいことできるはず、などと考えながら向きあう状態。/{w:不欲}と表現されることも。//{w:無爲}を怠ると比べ合いが始まり知恵が出る。{w:無知}でなくなると欲が出て失敗する。→{t:9}','2012-01-07 07:43:51'),(12,'柔弱',5,'にゅうじゃく','[しなやかで容易に形状を変えられるもの。]/{s:76}では水に、{s:78}では若芽にたとえられている。','2012-01-07 07:43:51'),(13,'侯王',5,'こうおう','[{l:王}と{l:侯}]','2012-01-07 07:43:51'),(14,'自然',5,'しぜん','[何も手を加えないありのままの状態。]/誰からの命令も受けず、欲を持った意識から動かないで、自律的に活動する。','2012-01-07 07:43:51'),(15,'復歸',5,'ふっき','[復帰。もとあった姿に帰ること。]/→{t:12}','2012-01-07 07:43:51'),(16,'天之道',5,'てんのみち','[→{w:天道}]','2012-01-07 07:43:51'),(18,'衆人',5,'しゅうじん','[あらゆる人々。]','2012-01-07 07:43:51'),(19,'無事',4,'ぶじ','[仕事をしないこと。]/何事も問題がおきないことのようにも思えるが、文脈からはそういう意味で使ってない。','2012-01-07 07:43:52'),(20,'知足',4,'たるをしる','[ほどほどのところで満足する。]/日本で知足といえば、吾唯足知だろうか。/→{t:7}','2012-01-07 07:43:52'),(21,'不道',4,'ふどう','[道から外れたこと。{w:無道}]/逆は{w:有道}','2012-01-07 07:43:52'),(22,'善者',4,'ぜんのもの','[正直者。]','2012-01-07 07:43:52'),(23,'大道',4,'たいどう','[{l:道}のこと。]/→{t:1}','2012-01-07 07:43:52'),(24,'玄徳',4,'げんとく','[深い徳。→{t:15}]','2012-01-07 07:43:52'),(26,'百姓',4,'ひゃくせい','[国民のこと。]/農民のことではなく、百の姓(かばね)。古代中国では従事する仕事によって姓が決まった。百以上あるたくさんの職能民だから、百姓は国民。','2012-01-07 07:43:53'),(27,'堅強',3,'けんきょう','[頑丈で強いこと。]/しかし、結局は柔らかい物に負けてしまう。','2012-01-07 07:43:53'),(28,'不善人',3,'ふぜんにん','[善人ではない人。]/悪人とは言ってない。老子は悪人はいないと考えたのだろう。/悪という字は現代の悪の意味を持っていなかった。悪は邪で著された。','2012-01-07 07:43:53'),(29,'上徳',3,'じょうとく','[すぐれた徳。]/→{t:15}','2012-01-07 07:43:53'),(30,'不祥',3,'ふしょう','[{w:鬼神}がなす災い。不吉。]/吉兆には祥のほかに瑞などがある。','2012-01-07 07:43:53'),(31,'有道者',3,'ゆうどうのもの','[道を修めた者。]感覚的には{w:聖人}に近いか。/他に{w:道者}があるが、こちらは実践している者か。','2012-01-07 07:43:53'),(34,'嬰兒',3,'えいじ','[嬰児。赤ちゃん。]','2012-01-07 07:43:54'),(35,'天道',2,'てんのみち','[自然の法則。]/{w:天之道}と表現されている章もある。/天も道から生まれたので道に従っている。','2012-01-07 07:43:54'),(36,'無徳',2,'むとく','[{l:徳}がないこと。]/→{t:15}','2012-01-07 07:43:54'),(37,'有徳',2,'ゆうとく','徳のある人。/[→{w:徳者}]','2012-01-07 07:43:54'),(38,'人之道',2,'ひとのみち','[世間の人達がやること。]','2012-01-07 07:43:54'),(39,'大匠',2,'たいしょう','[熟練工。物づくりの匠。]','2012-01-07 07:43:55'),(40,'司殺者',2,'しさつしゃ','[処刑人。死刑執行人。]','2012-01-07 07:43:55'),(41,'不肖',2,'ふしょう','[似てないこと。]/[親に似ないで愚かなこと。]/','2012-01-07 07:43:55'),(42,'無味',2,'むみ','[味がないこと。]','2012-01-07 07:43:55'),(43,'美言',2,'びげん','[耳触りの良い言葉。美辞麗句。]/[心を洗うような感動的な言葉。]','2012-01-07 07:43:56'),(44,'早服',2,'そうふく','[早めに仕事に移る。]','2012-01-07 07:43:56'),(45,'察察',2,'さつさつ','[何でもお見通しで隙がないこと。]','2012-01-07 07:43:56'),(46,'盗賊',2,'とうぞく','[窃盗団。ならず者。]','2012-01-07 07:43:56'),(47,'利器',2,'りき','[便利な道具。]','2012-01-07 07:43:56'),(48,'江海',2,'こうかい','[長江と海。]','2012-01-07 07:43:56'),(49,'甲兵',2,'こうへい','[鎧(よろい)兜(かぶと)を着けた兵士。]/大将を守るための重装の精鋭。','2012-01-07 07:43:56'),(50,'馳騁',2,'ちてい','[馬にまたがって走りまわること。]','2012-01-07 07:43:56'),(51,'不穀',2,'ふこく','[穀潰し。働けない者。]/[殻だけで中味のない穀物。出来損ない。]','2012-01-07 07:43:57'),(52,'大象',2,'たいしょう','[大きな形。]/→{l:象}','2012-01-07 07:43:57'),(53,'弱者',2,'じゃくのもの','[弱い者。社会的弱者。]/道の力に助けられて強くなる。/→{t:7}','2012-01-07 07:43:57'),(55,'君子',2,'くんし','[王に仕える立派な人。]/聖人君子といえば、聖人は偉大な指導者で、君子は偉大な補佐官のイメージ。/{w:聖人}は27の章に登場するが、{w:君子}は{s:31}にしか出てこない。','2012-01-07 07:43:57'),(56,'兵者',2,'へいのもの','[兵隊。軍隊。広い意味では兵器。]','2012-01-07 07:43:57'),(57,'失者',2,'しつのもの','[破滅に向かう人。]/特に上手に生きているつもりで、却って間違って進む人。/','2012-01-07 07:43:57'),(58,'徳者',2,'とくのもの','[{l:徳}を心がける人。]/→{t:15}','2012-01-07 07:43:57'),(60,'衆甫',2,'しゅうほ','[ものごとの始まり。]/甫は始と同じらしい。衆は集合なので、様々な始まりという意味になりそうだ。','2012-01-07 07:43:57'),(61,'國家',2,'こっか','[国家。]/ただ、この頃に現代でいう国家の意味があったか。国と家家くらいかも。','2012-01-07 07:43:57'),(62,'孝慈',2,'こうじ','[親孝行と家族愛。]/{s:18}では、{w:大道}が廃れて家族がバラバラになったから「大切にせよ」と強制されるようになったと言っている。/その答えとして、{s:19}では{w:仁義}をやめれば自然と孝慈の心が戻ってくると言っている。','2012-01-07 07:43:57'),(63,'智慧',2,'ちえ','[知恵におなじ。]/仏教用語としては、絶対的な認識として受け入れられている。知恵は人間が努力して知識化したもの。智慧は差別区別から比較判断しない仏様視点の認識。ただ、老子で使われる智慧は、いずれも否定的に扱われるので、人間の小賢しい知恵と考えた方がいいようだ。/→{t:18}','2012-01-07 07:43:57'),(64,'復命',2,'ふくめい','[世代交代すること。]嫌でも年老いて、若い者に譲らなければならない日がくること。/{l:常}と言い換えられる。/→{t:4}','2012-01-07 07:43:57'),(65,'無物',2,'むぶつ','[形を持たないもの。]','2012-01-07 07:43:58'),(67,'玄牝',2,'げんぴん','[{L:玄}と{L:牝}]/さらに{l:門}で玄牝の門。これは女性器を指す。女性だけに備えられている出産能力の神秘性を現している。','2012-01-07 07:43:58'),(68,'芻狗',2,'すうく','[祭りで使われる藁でできた犬の人形。]/祭りの間は大切に供えられるが、終わるやいなや捨てられる。','2012-01-07 07:43:58'),(69,'信言',1,'しんげん','[相手のことを考えた本音。]','2012-01-07 07:43:58'),(70,'雞犬',1,'けいけん','[にわとりや犬などの家畜。]','2012-01-07 07:43:58'),(71,'舟轝',1,'しゅうよ','[船や車。]/→{l:舟}→{l:轝}','2012-01-07 07:43:58'),(72,'什伯',1,'じゅうはく','[十百。]','2012-01-07 07:43:58'),(73,'寡民',1,'かみん','[人が少ない。]','2012-01-07 07:43:58'),(74,'左契',1,'さけい','[契約書。]/当時の契約書は木製で、割符のように合わせることで真贋を見定めた。左側が正で債権者が持ち、右側の副を債務者が持ったようだ。','2012-01-07 07:43:58'),(75,'餘怨',1,'よえん','余った怨み。[赦し切れない小さな怨み。]','2012-01-07 07:43:58'),(76,'大怨',1,'たいえん','[大きな怨み。]','2012-01-07 07:43:58'),(77,'社稷',1,'しゃしょく','[土地の神に穀物を奉納する祭事。]/国家の最高権力者がこれを執り仕切ったので、社禝そのものが王朝と同じ意味となっていった。','2012-01-07 07:43:58'),(78,'枯槁',1,'ここう','[枯れること。{l:槁}も枯れるの意。]','2012-01-07 07:43:58'),(79,'柔脆',1,'じゅうぜい','[弱くて壊れやすい。]','2012-01-07 07:43:58'),(80,'繟然',1,'せんぜん','[自然にゆったりとしている。]','2012-01-07 07:43:58'),(81,'天網恢恢',1,'てんもうかいかい','[天が張り巡らせた網はとてつもなく大きい。]','2012-01-07 07:43:58'),(82,'大威',1,'たいい','[大きな威力。]/無視できないほどの民衆の反抗。','2012-01-07 07:43:58'),(83,'大順',1,'たいじゅん','[この世が生まれるに至った偉大な序列。]/→{t:1}/→{t:3}','2012-01-07 07:43:59'),(84,'累土',1,'るいど','[重ねた土。]/たぶん、土嚢みたいなものの単位。','2012-01-07 07:43:59'),(85,'毫末',1,'ごうまつ','[か細い毛先。]','2012-01-07 07:43:59'),(86,'合抱之木',1,'ごうほうのき','[何人もの人が向い合わなければ抱けないほどの幹の大木。]','2012-01-07 07:43:59'),(87,'大事',1,'だいじ','[大事件。]','2012-01-07 07:43:59'),(88,'難事',1,'なんじ','[解決の難しい案件。]','2012-01-07 07:43:59'),(89,'美行',1,'びこう','[我欲を果たすための上辺だけの良い行い。]/[人を救うための素晴らしい行い。]','2012-01-07 07:43:59'),(90,'駟馬',1,'しば','[四頭立ての馬車。]/たぶん、戦車みたいなのじゃなく、飾りを凝らした実用性の低い立派なもの。','2012-01-07 07:43:59'),(91,'拱璧',1,'こうへき','[抱えるほど大きな玉璧。]','2012-01-07 07:44:00'),(92,'小鮮',1,'しょうせん','[小魚。]','2012-01-07 07:44:00'),(93,'深根固柢',1,'しんこんこてい','[物事を基本からしっかりと固めること。]/老子を出典として四字熟語になっている。','2012-01-07 07:44:01'),(94,'缺缺',1,'けつけつ','[足りないものだらけで苦しいこと。]','2012-01-07 07:44:01'),(95,'淳淳',1,'じゅんじゅん','[素直に従うこと。]','2012-01-07 07:44:01'),(96,'悶悶',2,'もんもん','[悩みぬいて苦しむこと。]','2012-01-07 07:44:01'),(100,'法令',1,'ほうれい','[法律と命令。]','2012-01-07 07:44:01'),(101,'邪事',1,'じゃじ','[悪事。]/昔は善の反対は悪ではなく邪だった。','2012-01-07 07:44:02'),(102,'玄同',1,'げんどう','この章を原典として熟語になってる。/[才能を隠して世間に紛れ込む。]','2012-01-07 07:44:02'),(104,'攫鳥',1,'かくちょう','[鋭い鈎爪を持つ鳥。猛禽。]','2012-01-07 07:44:02'),(105,'猛獣',1,'もうじゅう','[牙を持つ凶暴な動物。]','2012-01-07 07:44:02'),(106,'蜂蠆虺蛇',1,'ほうたいきだ','[前から順番に、蜂・さそり・まむし・へび。]/危険生物のこと。','2012-01-07 07:44:02'),(107,'赤子',1,'せきし','[赤ちゃん。]','2012-01-07 07:44:02'),(108,'祭祀',1,'さいし','[先祖を祭る儀式。]','2012-01-07 07:44:02'),(109,'利劔',1,'りけん','[よく切れる剣。]','2012-01-07 07:44:02'),(110,'文綵',1,'ぶんさい','[模様が入った美しい服。]','2012-01-07 07:44:02'),(111,'非道',1,'ひどう','[{l:道}から外れた行為。]/{w:不道}と同じ。/→{t:1}','2012-01-07 07:44:03'),(112,'盗夸',1,'とうか','[盗賊行為をおおっぴらに見せてそそのかす。]','2012-01-07 07:44:03'),(113,'習常',1,'しゅうじょう','[常習のことと思われる。]/習慣のように常日頃心がけて行うこと。','2012-01-07 07:44:03'),(114,'剛強',1,'ごうきょう','[堅くて力強いもの。]','2012-01-07 07:44:03'),(115,'微明',1,'びめい','[わずかに明らか。ちょっと賢い。]/→{t:18}','2012-01-07 07:44:03'),(116,'愛養',1,'あいよう','[愛して養う。]','2012-01-07 07:44:03'),(117,'川谷',1,'せんこく','[川と谷。]/どちらも同じ意味。黄河などの大河は時代によって大きく流れが変わるので、水があってもなくても大差はない。/→{t:8}','2012-01-07 07:44:03'),(118,'入軍',1,'にゅうぐん','[兵役に就く。]','2012-01-07 07:44:03'),(119,'兕虎',1,'じこ','[サイや虎などの危険な猛獣。]','2012-01-07 07:44:03'),(120,'陸行',1,'りくこう','[徒歩や馬車での旅。]/船旅である{w:舟行}とは別けたんだろう。','2012-01-07 07:44:03'),(121,'歙歙',1,'きゅうきゅう','[背中を丸めて押し殺したように静かに呼吸する。]','2012-01-07 07:44:03'),(122,'不善者',1,'ふぜんのもの','','2012-01-07 07:44:03'),(123,'戎馬',1,'じゅうば','[戦車をひくなど、戦争で使う馬。]','2012-01-07 07:44:03'),(124,'走馬',1,'そうば','[伝令などに使う早馬。]','2012-01-07 07:44:03'),(125,'強梁者',1,'きょうりょうしゃ','[頑固者。]/[武勇を鼻にかける乱暴者。]/柱より梁が立派な家はバランスが悪くて屋根が落ちてくるそうだ。','2012-01-07 07:44:03'),(126,'王公',1,'おうこう','[{l:王}と{l:公}。]/{l:公}と{l:侯}は微妙に格が違う。','2012-01-07 07:44:03'),(127,'冲氣',1,'ちゅうき','[陰と陽が描く円の内側にある空洞部。]/地球が太陽を中心に円運動するように、陰と陽の点が中心部と向きあって円を描く。その円の内側が沖気と考える。/→{t:7}','2012-01-07 07:44:03'),(128,'大音',1,'たいおん','','2012-01-07 07:44:04'),(129,'大器',1,'たいき','','2012-01-07 07:44:04'),(130,'大方',1,'たいほう','','2012-01-07 07:44:04'),(131,'質眞',1,'しつしん','','2012-01-07 07:44:04'),(132,'建徳',1,'けんとく','','2012-01-07 07:44:04'),(133,'廣徳',1,'こうとく','','2012-01-07 07:44:04'),(135,'夷道',1,'いどう','','2012-01-07 07:44:04'),(136,'進道',1,'しんどう','','2012-01-07 07:44:04'),(137,'明道',1,'みょうどう','','2012-01-07 07:44:04'),(138,'建言',1,'けんげん','','2012-01-07 07:44:04'),(139,'反者',1,'かえるもの','[弱へ返る者。]/→{t:4}','2012-01-07 07:44:04'),(140,'落落',1,'らくらく','[石の様子。]/ゴロゴロくらいか。','2012-01-07 07:44:04'),(141,'琭琭',1,'ろくろく','[{l:琭}は珠のこと。その様子。]/コロコロあるいはキラキラくらいか。','2012-01-07 07:44:04'),(142,'攘臂',1,'じょうひ','[腕を払う。]/[腕まくりする。]','2012-01-07 07:44:05'),(143,'大丈夫',1,'だいじょうぶ','[立派な男子。]','2012-01-07 07:44:05'),(146,'恬淡',1,'ていたん','[あっさりとした様子。]','2012-01-07 07:44:05'),(147,'刑蕀',1,'けいきょく','[いばら。]','2012-01-07 07:44:05'),(148,'神器',1,'じんぎ','[人が触れることのできない、神様の所有物。]','2012-01-07 07:44:05'),(149,'無極',1,'むきょく','[行き過ぎない、ほどほどの状態。]/→{t:7}','2012-01-07 07:44:05'),(150,'要妙',1,'ようみょう','[{l:妙}の中でももっとも肝心な部分。]','2012-01-07 07:44:05'),(151,'襲明',1,'しゅうめい','[{l:明}を{l:襲}ぐ。絶対的な知識を受け継げ、応用したもの。]/→{t:18}','2012-01-07 07:44:05'),(152,'繩約',1,'じょうやく','[縄の締め付け。締め上げること。]','2012-01-07 07:44:05'),(153,'關鍵',1,'かんけん','[{L:關}と{L:鍵}]','2012-01-07 07:44:05'),(154,'籌策',1,'ちゅうさく','[計算棒。]/計算が簡単にできる棒。','2012-01-07 07:44:05'),(155,'瑕謫',1,'かたく','[{L:瑕}{L:謫}]','2012-01-07 07:44:06'),(156,'轍迹',1,'てっせき','[わだち。]/馬車が通るときに車輪が作る溝。','2012-01-07 07:44:06'),(157,'萬乘',1,'ばんじょう','[一万両の戦車。]/乗は戦車を数える単位。/戦車とは四頭立ての馬車に隊長と副官と御者が乗り、まわりを護衛の歩兵が固めたもの。一乗が兵員何名を指すかは時代によって違うが、同時の部隊は三十名程度だったようだ。つまり一万両の戦車なら三十万の戦力となるが、細かい数字はどうでもいい。','2012-01-07 07:44:06'),(158,'超然',1,'ちょうぜん','[平然として動じない様子。]','2012-01-07 07:44:06'),(159,'燕處',1,'えんしょ','[燕が巣を作るような場所。]','2012-01-07 07:44:06'),(160,'榮觀',1,'えいかん','[すばらしい眺め。]/栄光の舞台に乗ったときに見える景色。','2012-01-07 07:44:07'),(161,'輜重',1,'しちょう','[荷馬車。]/食料を積んだ馬車の部隊。','2012-01-07 07:44:07'),(162,'驟雨',1,'しゅうう','[にわか雨。]','2012-01-07 07:44:07'),(163,'飄風',1,'ひょうふう','[つむじ風。]','2012-01-07 07:44:07'),(164,'貞臣',1,'ていしん','[忠臣。主君のために命がけで働く臣下。]/{l:貞}とは元来、国家運営の基本方針を王が占いで神様から聞き出す行為だから、僭越な臣下かもしれない。','2012-01-07 07:44:07'),(165,'昏亂',1,'こんらん','[混乱とほぼ同じ。]','2012-01-07 07:44:07'),(166,'仁義',1,'じんぎ','[儒教が重要とする徳目の上位二つ。]/五常といって「仁、義、礼、智、信」の順に大事にされた。','2012-01-07 07:44:07'),(167,'太上',1,'たいじょう','[最高にすばらしい。]/大上と書いても良い。上より大きいこと。','2012-01-07 07:44:07'),(168,'玄通',1,'げんつう','[深く通じていること。]','2012-01-07 07:44:07'),(169,'微妙',1,'びみょう','[わずかな妙。]/小さなできごとの本質。','2012-01-07 07:44:07'),(170,'道紀',1,'どうき','[道のしるし。]/紀は記と同じようなものじゃないか。歴史をたぐっていけるように記述したもの。またはそれをたどっていくことと考えている。/','2012-01-07 07:44:08'),(171,'古始',1,'こし','[物事の根源的な始まり。]','2012-01-07 07:44:08'),(172,'惚恍',1,'こつこう','[ぼんやりして、捕らえ所のない様子。恍惚状態。]/','2012-01-07 07:44:08'),(173,'繩繩',1,'じょうじょう','[ぐちゃぐちゃした様子。]/たぶん、たくさんの縄が絡まりあって、わけわかんなくなった様子。','2012-01-07 07:44:08'),(174,'無状',1,'むじょう','[状態がない。形にならない。]','2012-01-07 07:44:08'),(176,'明白',1,'めいはく','[正しいことが何かを熟知していること。]/白、つまり、正義や潔白に対する絶対的なセンス。{l:明}らかな{l:白}。/→{t:18}','2012-01-07 07:44:08'),(177,'開闔',1,'かいこう','[扉を開くこと。]/開閉という説もある。','2012-01-07 07:44:08'),(178,'天門',1,'てんもん','[頭部にある門。]/字面からいえば目鼻耳口なんだろうが、老子はこれらに頼ることは否定してるんで、脳を柔らかくせよという意味ではないか。','2012-01-07 07:44:08'),(179,'滌除',1,'できじょ','[洗い清める。]','2012-01-07 07:44:08'),(180,'營魄',1,'えいはく','[活動する魂。]/営がよくわからない。動く物っぽいが…。あるいは営門?/営門なら、魂魄の内側に精神があって、そこに入るための門前に魄が燃えてるのかな?/魂魄は陰陽に別れているので、魂には今で言う交感神経と副交感神経みたいな作用のことを言うのかもしれない。この切り替わりを営としているのだろうか。わからないので、こっちの活動としておいた。','2012-01-07 07:44:08'),(183,'綿綿',1,'めんめん','[ほそぼそとした様子]','2012-01-07 07:44:08'),(184,'谷神',1,'こくしん','[谷のありさまを神格化したもの。]/世間一般では天地人と言われるものが、{s:39}で天・地・神・谷・萬物・侯王の順に出てくる。天地神谷に寿命はないけど、万物侯王にはあるって話に見えなくもない。/→{t:8}','2012-01-07 07:44:08'),(185,'槖籥',1,'たくやく','[ふいご。製鉄で使われる送風機。]/中は空洞になっていて、レバーを押し引きすることで空気が入ったり出たりする。/当時はやっと鉄器が普及しだしたころだった。','2012-01-07 07:44:08'),(186,'衆妙',1,'しゅうみょう','[天地万物の深遠な道理。]/衆=たくさんの/妙=本質/といったところで、普遍的な真理の意味かな。','2012-01-07 07:44:10'),(187,'尚賢',1,'しょうけん','[知者を尊敬すること。]/墨子には尚賢という章がある。','2012-01-07 07:44:10'),(188,'無知',4,'むち','[何も知らないでいること。]/無用な悩みや不安のない理想的な状態。/比べて差があることを知ることから不安が始まる。//→{t:18}','2012-01-07 07:44:10'),(189,'無爲',10,'むい','[何もしないこと。]/本当に何もしないわけではなく、一見しただけでは理解出来ない行為をして、黙っていること。//→{t:3}','2012-01-07 07:44:11'),(190,'有欲',1,'ゆうよく','[欲がある状態。]/何かしてやろう、見つけてやろうと考えながら向きあう状態。','2012-01-07 07:44:11'),(191,'兩者',4,'りょうしゃ','[両者。どちらの者も]','2012-01-07 07:44:11'),(192,'不言',4,'ふげん','[余計なことを言わないこと。]/鳴く鳥は撃たれるから言うなといった意味合いは薄い。良かれと思って教えたり、お説教するなどのお節介、自分を良く見せるために粉飾したり、気に入られるためにおべっかを使ったりといった無駄口を否定している。//対立する言葉に{w:多言}がある。また、無言は一度も出てこない。','2012-01-07 07:44:11'),(193,'多言',1,'たごん','[おしゃべり。言い過ぎること。]/気に入られるために心とは違うことを言ってしまうこと。/対する言葉に{w:不言}や{w:無言}がある。','2012-01-07 07:44:11'),(194,'知者',4,'ちしゃ','[知識人。]/[道理をよく知っている人。]/→{t:18}','2012-01-07 07:44:11'),(195,'玄覽',1,'げんらん','{L:玄}{L:覽}/[自分の心を写し出す神秘的な鏡。]','2012-01-07 07:44:11'),(196,'四達',1,'したつ','[東西南北、四隅まで到達すること。]','2012-01-07 07:44:11'),(197,'田獵',1,'でんろう','[狩り。]/当時の狩りは王侯貴族のステータス的なもので、国の主はこぞって夢中になった。','2012-01-07 07:44:11'),(198,'大患',3,'たいかん','[深刻な問題。]','2012-01-07 07:44:11'),(199,'芸芸',1,'うんうん','[植物がさかんに生い茂っている様子。]/芸は旧字では「藝」で「勢」に通じているんだとか。だから、芸は草がぐんぐん伸びる様子に近いんだろう。','2012-01-07 07:44:12'),(200,'音聲',1,'おんせい','[音と声。]/楽器が奏でる曲と歌声と読んでもいいけど、厳密には違うらしい。というのも、それだと調和の意味が通じないからだ。/だから、メロディの旋律とバックコーラスが一致することで調和するとしておいた。','2012-01-07 07:44:12'),(201,'孔徳',1,'こうとく','[広徳と同じらしい。]/孔子の徳ではないはず。/→{t:15}','2012-01-07 07:44:12'),(202,'所謂',1,'いわゆる','[世間一般で言うところの。]','2012-01-07 07:44:12'),(203,'希言',1,'きげん','[言葉が少ない。くどくど言わない。]','2012-01-07 07:44:12'),(204,'從事',2,'じゅうじ','[従事する。従って仕事をする。]','2012-01-07 07:44:12'),(205,'餘食',1,'よしょく','[余るほどの食事を並べること。]','2012-01-07 07:44:12'),(206,'贅行',1,'ぜいこう','[贅沢をすること。]','2012-01-07 07:44:12'),(207,'六親',1,'ろくしん','[父母兄弟妻子のこと。]','2012-01-07 07:44:12'),(208,'物或',4,'ものあるいは','[ある物は○、またある物は×。]/物は者を含む。/[物はもしかしたら~]','2012-01-07 07:44:12'),(209,'奈何',2,'いかんぞ','[どうして~であろうか。]','2012-01-07 07:44:13'),(210,'大制',1,'たいせい','[大まかに{l:制}すること。]/山で切り倒した木を材木にする下ごしらえ。/→{t:14}','2012-01-07 07:44:13'),(211,'將欲',5,'まさにほっする','[これから~をしようとするならば。]','2012-01-07 07:44:13'),(212,'稽式',2,'けいしき','[手本となるにはどうすればよいのかを考える。]','2012-01-07 07:44:13'),(213,'所以',5,'ゆえん','[ゆえに。理由。]','2012-01-07 07:44:13'),(214,'甘露',1,'かんろ','[天下泰平になると天が降らせるという言い伝えのある甘い液体。]','2012-01-07 07:44:13'),(215,'淡乎',1,'たんこ','[びっくりするほどあっさりしている。]','2012-01-07 07:44:13'),(216,'過客',1,'かきゃく','[通りすがりの旅人。]','2012-01-07 07:44:13'),(217,'貴高',1,'きこう','[高貴。気高くたっといこと。]','2012-01-07 07:44:13'),(218,'至柔',1,'シジュウ','[柔らかいもの。]/柔らかいまでに至ったもの。','2012-01-07 07:44:14'),(219,'至堅',1,'シケン','[堅いもの。]/堅さで頂点にまで至ったもの。','2012-01-07 07:44:14'),(220,'長久',2,'チョウキュウ','[長続きする。]/命が長く続き、名前が語り継がれる期間も長い。','2012-01-07 07:44:14'),(221,'大成',1,'たいせい','[充分に完成されたもの。]','2012-01-07 07:44:14'),(222,'大盈',1,'たいえい','[本当に目いっぱい溜まったもの。]','2012-01-07 07:44:14'),(223,'大直',1,'たいちょく','[完全に真っ直ぐなもの。]','2012-01-07 07:44:14'),(224,'大辯',1,'たいべん','[大弁舌家。話しがうまく相手を上手に言いくるめる人。]','2012-01-07 07:44:14'),(225,'介然',1,'かいぜん','[人とは違う隔てられた場所から人々を見る。]','2012-01-07 07:44:14'),(226,'財貨',1,'ザイカ','[金品。]','2012-01-07 07:44:14'),(227,'吉事',1,'きちじ','[めでたい出来事。]','2012-01-07 07:44:14'),(228,'凶事',1,'きょうじ','[不幸な出来事。]','2012-01-07 07:44:14'),(229,'偏將軍',1,'へんしょうぐん','[副将軍。]','2012-01-07 07:44:14'),(230,'上將軍',1,'じょうしょうぐん','[大将。総司令官。]','2012-01-07 07:44:14'),(231,'喪禮',2,'もれい','[喪礼。葬式で執り行なわれる礼儀作法。]','2012-01-07 07:44:14'),(232,'不欲',5,'ほっせず','[欲しがろうとしないこと。]/{w:無欲}という言い方もあるが、不欲のほうが努力して抑えてるように感じる。','2012-01-07 07:44:15'),(233,'結繩',1,'ケツジョウ','[縄結び。]/文字がない時代は縄の結び目の形を文字がわりにして歴史を記した。','2012-01-07 07:44:15'),(234,'富貴',1,'ふうき','[富があり地位も高いこと。]','2012-01-07 07:44:15'),(235,'不爭',8,'あらそわず','[競争しないこと。]/→{t:13}','2012-01-07 07:44:15'),(236,'不得已',3,'やむをえず','[やむをえない。しょうがない。]','2012-01-07 07:44:16'),(238,'忌諱',1,'キキ','[いやがること。人が嫌うようなこと。]','2012-01-07 07:44:17'),(239,'太牢',1,'タイロウ','[いけにえを捧げる儀式。]/[ごちそう。]/元は儀式を言ったが、式の後でいけにえの肉料理がふるまわれたことから、ごちそうの意味になった。','2012-01-07 07:44:17'),(240,'幾何',1,'いくばく','[数や量がどれくらいか。]','2012-01-07 07:44:17'),(241,'何若',1,'いかん','[どうだろうか。いかがなものか。]','2012-01-07 07:44:18');\r
+/*!40000 ALTER TABLE `words` ENABLE KEYS */;\r
+UNLOCK TABLES;\r
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;\r
+\r
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;\r
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;\r
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;\r
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\r
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\r
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;\r
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;\r
+\r
+-- Dump completed on 2013-02-21  2:26:22\r
diff --git a/db/migrate/001_create_letters.rb b/db/migrate/001_create_letters.rb
new file mode 100644 (file)
index 0000000..e08d641
--- /dev/null
@@ -0,0 +1,17 @@
+class CreateLetters < ActiveRecord::Migration
+  def self.up
+    create_table :letters do |t|
+      t.column :letter, :string,   :limit => 4, :null => false
+      t.column :count, :integer, :default => 1, :null => false
+      t.column :yomi, :text, :null => false
+      t.column :detail, :text
+      t.column :update_at, :datetime
+    end
+    add_index :letters, [:letter], :unique => true
+    add_index :letters, [:count]
+  end
+
+  def self.down
+    drop_table :letters
+  end
+end
diff --git a/db/migrate/002_create_sources.rb b/db/migrate/002_create_sources.rb
new file mode 100644 (file)
index 0000000..781d2be
--- /dev/null
@@ -0,0 +1,10 @@
+class CreateSources < ActiveRecord::Migration
+  def self.up
+    create_table :sources do |t|
+    end
+  end
+
+  def self.down
+    drop_table :sources
+  end
+end
diff --git a/db/migrate/003_create_words.rb b/db/migrate/003_create_words.rb
new file mode 100644 (file)
index 0000000..ca3c1ca
--- /dev/null
@@ -0,0 +1,17 @@
+class CreateWords < ActiveRecord::Migration
+  def self.up
+    create_table :words do |t|
+      t.column :letter, :string,   :limit => 20, :null => false
+      t.column :count, :integer, :default => 1, :null => false
+      t.column :yomi, :text, :null => false
+      t.column :detail, :text
+      t.column :update_at, :datetime
+    end
+    add_index :words, [:letter], :unique => true
+    add_index :words, [:count]
+  end
+
+  def self.down
+    drop_table :words
+  end
+end
diff --git a/db/migrate/004_create_sections.rb b/db/migrate/004_create_sections.rb
new file mode 100644 (file)
index 0000000..ed5875d
--- /dev/null
@@ -0,0 +1,21 @@
+class CreateSections < ActiveRecord::Migration
+  def self.up
+    create_table :sections do |t|
+      t.column :num, :integer, :default => 1, :null => false
+      t.column :caption, :text
+      t.column :source, :text
+      t.column :japanese, :text
+      t.column :trans, :text
+      t.column :english, :text
+      t.column :myself, :text
+      t.column :etc, :text
+      t.column :note, :text
+      t.column :update_at, :datetime
+    end
+    add_index :sections, [:num], :unique => true
+  end
+
+  def self.down
+    drop_table :sections
+  end
+end
diff --git a/db/migrate/005_create_section_letters.rb b/db/migrate/005_create_section_letters.rb
new file mode 100644 (file)
index 0000000..88b5d13
--- /dev/null
@@ -0,0 +1,16 @@
+class CreateSectionLetters < ActiveRecord::Migration
+  def self.up
+    create_table :section_letters do |t|
+      t.column :section_id, :integer, :default => 1, :null => false
+      t.column :letter_id, :integer, :default => 1, :null => false
+      t.column :count, :integer, :default => 1, :null => false
+      t.column :chk, :integer, :default => 0, :null => false
+   end
+    add_index :section_letters, [:section_id]
+    add_index :section_letters, [:letter_id]
+  end
+
+  def self.down
+    drop_table :section_letters
+  end
+end
diff --git a/db/migrate/006_create_section_words.rb b/db/migrate/006_create_section_words.rb
new file mode 100644 (file)
index 0000000..889bd43
--- /dev/null
@@ -0,0 +1,16 @@
+class CreateSectionWords < ActiveRecord::Migration
+  def self.up
+    create_table :section_words do |t|
+      t.column :section_id, :integer, :default => 1, :null => false
+      t.column :word_id, :integer, :default => 1, :null => false
+      t.column :count, :integer, :default => 1, :null => false
+      t.column :chk, :integer, :default => 0, :null => false
+    end
+    add_index :section_words, [:section_id]
+    add_index :section_words, [:word_id]
+  end
+
+  def self.down
+    drop_table :section_words
+  end
+end
diff --git a/db/migrate/007_create_themas.rb b/db/migrate/007_create_themas.rb
new file mode 100644 (file)
index 0000000..a1a9ed7
--- /dev/null
@@ -0,0 +1,13 @@
+class CreateThemas < ActiveRecord::Migration
+  def self.up
+    create_table :themas do |t|
+      t.column :caption, :text
+      t.column :detail, :text
+      t.column :update_at, :datetime
+    end
+  end
+
+  def self.down
+    drop_table :themas
+  end
+end
diff --git a/db/migrate/008_create_thema_sections.rb b/db/migrate/008_create_thema_sections.rb
new file mode 100644 (file)
index 0000000..a5fa529
--- /dev/null
@@ -0,0 +1,15 @@
+class CreateThemaSections < ActiveRecord::Migration
+  def self.up
+    create_table :thema_sections do |t|
+      t.column :thema_id, :integer, :default => 1, :null => false
+      t.column :section_id, :integer, :default => 1, :null => false
+      t.column :count, :integer, :default => 1, :null => false
+   end
+    add_index :thema_sections, [:section_id]
+    add_index :thema_sections, [:thema_id]
+  end
+
+  def self.down
+    drop_table :thema_sections
+  end
+end
diff --git a/db/migrate/009_create_hateda_sections.rb b/db/migrate/009_create_hateda_sections.rb
new file mode 100644 (file)
index 0000000..ba71f61
--- /dev/null
@@ -0,0 +1,14 @@
+class CreateHatedaSections < ActiveRecord::Migration
+  def self.up
+    create_table :hateda_sections do |t|
+      t.column :section_id, :integer, :default => 0, :null => false
+      t.column :name, :string, :limit => 30
+      t.column :upload_at, :datetime
+    end
+    add_index :hateda_sections, [:section_id], :unique => true
+  end
+
+  def self.down
+    drop_table :hateda_sections
+  end
+end
diff --git a/db/migrate/010_create_hateda_letters.rb b/db/migrate/010_create_hateda_letters.rb
new file mode 100644 (file)
index 0000000..1ee0f94
--- /dev/null
@@ -0,0 +1,14 @@
+class CreateHatedaLetters < ActiveRecord::Migration
+  def self.up
+    create_table :hateda_letters do |t|
+      t.column :letter_id, :integer, :default => 0, :null => false
+      t.column :name, :string, :limit => 30
+      t.column :upload_at, :datetime
+    end
+    add_index :hateda_letters, [:letter_id], :unique => true
+  end
+
+  def self.down
+    drop_table :hateda_letters
+  end
+end
diff --git a/db/migrate/011_create_hateda_words.rb b/db/migrate/011_create_hateda_words.rb
new file mode 100644 (file)
index 0000000..82ad5aa
--- /dev/null
@@ -0,0 +1,14 @@
+class CreateHatedaWords < ActiveRecord::Migration
+  def self.up
+    create_table :hateda_words do |t|
+      t.column :word_id, :integer, :default => 0, :null => false
+      t.column :name, :string, :limit => 30
+      t.column :upload_at, :datetime
+    end
+    add_index :hateda_words, [:word_id], :unique => true
+  end
+
+  def self.down
+    drop_table :hateda_words
+  end
+end
diff --git a/db/migrate/012_create_hateda_themas.rb b/db/migrate/012_create_hateda_themas.rb
new file mode 100644 (file)
index 0000000..225dbf1
--- /dev/null
@@ -0,0 +1,14 @@
+class CreateHatedaThemas < ActiveRecord::Migration
+  def self.up
+    create_table :hateda_themas do |t|
+      t.column :thema_id, :integer, :default => 0, :null => false
+      t.column :name, :string, :limit => 30
+      t.column :upload_at, :datetime
+    end
+    add_index :hateda_themas, [:thema_id], :unique => true
+  end
+
+  def self.down
+    drop_table :hateda_themas
+  end
+end
diff --git a/db/migrate/013_create_hateda_indices.rb b/db/migrate/013_create_hateda_indices.rb
new file mode 100644 (file)
index 0000000..cc486e5
--- /dev/null
@@ -0,0 +1,15 @@
+class CreateHatedaIndices < ActiveRecord::Migration
+  def self.up
+    create_table :hateda_indices do |t|
+      t.column :keyname, :string, :limit => 30, :null => false
+      t.column :name, :string, :limit => 30
+      t.column :basedate, :datetime, :null => false
+      t.column :upload_at, :datetime
+    end
+    add_index :hateda_indices, [:keyname], :unique => true
+  end
+
+  def self.down
+    drop_table :hateda_indices
+  end
+end
diff --git a/doc/README_FOR_APP b/doc/README_FOR_APP
new file mode 100644 (file)
index 0000000..ac6c149
--- /dev/null
@@ -0,0 +1,2 @@
+Use this README file to introduce your application and point to useful places in the API for learning more.
+Run "rake appdoc" to generate API documentation for your models and controllers.
\ No newline at end of file
diff --git a/lib/atomutil.rb b/lib/atomutil.rb
new file mode 100644 (file)
index 0000000..d6c2506
--- /dev/null
@@ -0,0 +1,1732 @@
+#--
+# Copyright (C) 2007 Lyo Kato, <lyo.kato _at_ gmail.com>.
+#
+# Permission is hereby granted, free of charge, to any person obtaining 
+# a copy of this software and associated documentation files (the 
+# "Software"), to deal in the Software without restriction, including 
+# without limitation the rights to use, copy, modify, merge, publish, 
+# distribute, sublicense, and/or sell copies of the Software, and to 
+# permit persons to whom the Software is furnished to do so, subject to 
+# the following conditions: 
+#
+# The above copyright notice and this permission notice shall be 
+# included in all copies or substantial portions of the Software. 
+# 
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+#
+# This package allows you to handle AtomPub and Atom Syndication Format easily.
+# This is just a porting for Perl's great libraries, XML::Atom, XML::Atom::Service,
+# XML::Atom::Ext::Threading, and Atompub
+#
+# http://search.cpan.org/perldoc?XML%3A%3AAtom
+# http://search.cpan.org/perldoc?XML%3A%3AAtom%3A%3AService
+# http://search.cpan.org/perldoc?XML%3A%3AAtom%3A%3AExt%3A%3AThreading
+# http://search.cpan.org/perldoc?Atompub
+#
+# This package however supports only version 1.0 of Atom(original Perl libraries support also version 0.3),
+# and is not stable yet.
+# We need more document, more tutorials, and more tests by RSpec.
+#++
+require 'digest/sha1'
+require 'uri'
+require 'open-uri'
+require 'pathname'
+require 'time'
+require 'net/http'
+require 'rexml/document'
+
+# = Utilities for AtomPub / Atom Syndication Format
+#
+# This class containts two important modules
+#
+# [Atom]    Includes classes for parsing or building atom element.
+#           For example, Atom::Entry, Atom::Feed, and etc.
+#
+# [Atompub] Includes client class works according to AtomPub protocol.
+#           And other useful helper classes.
+#
+module AtomUtil
+  module VERSION#:nodoc:
+    MAJOR = 0
+    MINOR = 1
+    TINY  = 1
+    STRING = [MAJOR, MINOR, TINY].join('.')
+  end
+end
+# = Utility to build or parse Atom Syndication Format
+#
+# Spec: http://atompub.org/rfc4287.html
+#
+# This allows you to handle elements used on Atom Syndication Format easily.
+# See each element classes' document in detail.
+#
+# == Service Document
+#
+# === Element Classes used in service documents
+#
+# * Atom::Service
+# * Atom::Workspace
+# * Atom::Collection
+# * Atom::Categories
+# * Atom::Category
+#
+# == Categories Document
+#
+# === Element Classes used in categories documents
+#
+# * Atom::Categories
+# * Atom::Category
+#
+# == Feed
+#
+# === Element classes used in feeds.
+#
+# * Atom::Feed
+# * Atom::Entry
+#
+# == Entry
+#
+# == Element classes used in entries.
+#
+# * Atom::Entry
+# * Atom::Link
+# * Atom::Author
+# * Atom::Contributor
+# * Atom::Content
+# * Atom::Control
+# * Atom::Category
+#
+module Atom
+  # Namespace Object Class
+  #
+  # Example:
+  #
+  #   namespace = Atom::Namespace.new(:prefix => 'dc', :uri => 'http://purl.org/dc/elements/1.1/')
+  #   # you can omit prefix
+  #   # namespace = Atom::Namespace.new(:uri => 'http://purl.org/dc/elements/1.1/')
+  #   puts namespace.prefix # dc
+  #   puts namespace.uri    # http://purl.org/dc/elements/1.1/
+  #
+  # Mager namespaces are already set as constants. You can use them directly
+  # without making new Atom::Namespace instance
+  #
+  class Namespace
+    attr_reader :prefix, :uri
+    def initialize(params) #:nodoc:
+      @prefix, @uri = params[:prefix], params[:uri]
+      raise ArgumentError.new(%Q<:uri is not found.>) if @uri.nil?
+    end
+    def to_s #:nodoc:
+      @uri
+    end
+    # Atom namespace
+    ATOM = self.new :uri => 'http://www.w3.org/2005/Atom'
+    # Atom namespace using prefix
+    ATOM_WITH_PREFIX = self.new :prefix => 'atom', :uri => 'http://www.w3.org/2005/Atom'
+    # Atom namespace for version 0.3
+    OBSOLETE_ATOM = self.new :uri => 'http://purl.org/atom/ns#'
+    # Atom namespace for version 0.3 using prefix
+    OBSOLETE_ATOM_WITH_PREFIX = self.new :prefix => 'atom', :uri => 'http://purl.org/atom/ns#'
+    # Atom app namespace
+    APP = self.new :uri => 'http://www.w3.org/2007/app'
+    # Atom app namespace with prefix
+    APP_WITH_PREFIX = self.new :prefix => 'app', :uri => 'http://www.w3.org/2007/app'
+    # Atom app namespace for version 0.3
+    OBSOLETE_APP = self.new :uri => 'http://purl.org/atom/app#'
+    # Atom app namespace for version 0.3 with prefix
+    OBSOLETE_APP_WITH_PREFIX = self.new :prefix => 'app', :uri => 'http://purl.org/atom/app#'
+    # Dubline Core namespace
+    DC = self.new :prefix => 'dc', :uri => 'http://purl.org/dc/elements/1.1/'
+    # Open Search namespace that is often used for pagination
+    OPEN_SEARCH = self.new :prefix => 'openSearch', :uri => 'http://a9.com/-/spec/opensearchrss/1.1/'
+    RDF = self.new :prefix => 'rdf', :uri => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'
+    FOAF = self.new :prefix => 'foaf', :uri => 'http://xmlns.com/foaf/0.1'
+    THR = self.new :prefix => 'thr', :uri => 'http://purl.org/syndication/thread/1.0'
+  end
+  # = MediaType
+  #
+  # Class represents MediaType
+  #
+  # == Accessors
+  #
+  #   feed = Atom::MediaType.new 'application/atom+xml;type=feed'
+  #   puts feed.type               # application
+  #   puts feed.subtype            # atom+xml
+  #   puts feed.subtype_major      # xml
+  #   puts feed.without_parameters # application/atom+xml
+  #   puts feed.parameters         # type=feed
+  #   puts feed.to_s               # application/atom+xml;type=feed
+  #
+  # == Equivalence
+  #
+  #   feed2 = Atom::MediaType.new 'application/atom+xml;type=feed'
+  #   entry = Atom::MediaType.new 'application/atom+xml;type=entry'
+  #   feed == feed2 # -> true
+  #   feed == entry # -> false
+  #   feed == 'application/atom+xml;type=feed' # -> true
+  #
+  # == Constants
+  #
+  # Major media types for atom syndication format are already prepared.
+  # Use following constants for them.
+  #
+  # [Atom::MediaType::SERVICE]    application/atomsvc+xml
+  # [Atom::MediaType::CATEGORIES] application/atomcat+xml
+  # [Atom::MediaType::FEED]       application/atom+xml;type=feed
+  # [Atom::MediaType::ENTRY]      application/atom+xml;type=entry
+  #
+  class MediaType
+    attr_reader :type, :subtype, :parameters
+    def initialize(type) #:nodoc:
+      result = type.split(%r<[/;]>)
+      @type       = result[0]
+      @subtype    = result[1]
+      @parameters = result[2]
+    end
+
+    def subtype_major
+      @subtype =~ /\+(.+)/ ? $1 : @subtype
+    end
+
+    def without_parameters
+      "#{@type}/#{@subtype}"
+    end
+
+    def to_s
+      [without_parameters, @parameters].select{ |p| !p.nil? }.join(";")
+    end
+
+    def ==(value)
+      if value.is_a?(MediaType)
+        to_s == value.to_s
+      else
+        to_s == value
+      end
+    end
+
+    def is_a?(value)
+      value = self.class.new value unless value.instance_of?(self.class)
+      return true  if     value.type == '*'
+      return false unless value.type == @type
+      return true  if     value.subtype == '*'
+      return false unless value.subtype == @subtype
+      return true  if     value.parameters.nil? || @parameters.nil? 
+      return value.parameters == @parameters
+    end
+    SERVICE    = self.new 'application/atomsvc+xml'
+    CATEGORIES = self.new 'application/atomcat+xml'
+    FEED       = self.new 'application/atom+xml;type=feed'
+    ENTRY      = self.new 'application/atom+xml;type=entry'
+  end
+  # = Atom::Element
+  #
+  # Base Element Object Class
+  #
+  # You don't use this class directly.
+  # This is a base class of each element classes used in Atom Syndication Format.
+  #
+  class Element
+    def self.new(params={})
+      obj = super(params)
+      yield(obj) if block_given?
+      obj
+    end
+    @@ns = Namespace::ATOM
+    def self.ns(ns=nil)
+      unless ns.nil?
+        @@ns = ns.is_a?(Namespace) ? ns : Namespace.new(:uri => ns)
+      end
+      @@ns
+    end
+    @element_name = nil
+    def self.element_name(name=nil)
+      unless name.nil?
+        @element_name = name.to_s
+      end
+      @element_name
+    end
+    @element_ns = nil
+    def self.element_ns(ns=nil)
+      unless ns.nil?
+        @element_ns = ns.is_a?(Namespace) ? ns : Namespace.new(:uri => ns) 
+      end
+      @element_ns
+    end
+    # Generate element accessor for indicated name
+    # The generated accessors can deal with elements which has only simple text-node,
+    # such as title, summary, rights, and etc.
+    # Of course, these elements should handle more complex data.
+    # In such a case, you can control them directly with 'set' and 'get' method.
+    #
+    # Example:
+    #
+    #   class Entry < Element
+    #     element_text_accessor 'title'
+    #     element_text_accessor 'summary'
+    #   end
+    #
+    #   elem = MyElement.new
+    #   elem.title   = "foo"
+    #   elem.summary = "bar"
+    #   puts elem.title #foo
+    #   puts elem.summary #bar
+    #
+    #   div = REXML::Element.new("<div><p>hoge</p></div>")
+    #   elem.set('http://www.w3.org/2005/Atom', 'title', div, { :type => 'xhtml' })
+    #
+    def self.element_text_accessor(name)
+      name = name.to_s
+      name.tr!('-', '_')
+      class_eval(<<-EOS, __FILE__, __LINE__)
+        def #{name}
+          value = get(@ns, '#{name}')
+          value.nil? ? nil : value.text
+        end
+        def #{name}=(value, attributes=nil)
+          set(@ns, '#{name}', value, attributes)
+        end
+      EOS
+    end
+    # You can set text_accessor at once with this method
+    #
+    # Example:
+    #   class Entry < BaseEntry
+    #     element_text_accessors :title, :summary
+    #   end
+    #   entry = Entry.new
+    #   entry.title = "hoge"
+    #   puts entry.title #hoge
+    #
+    def self.element_text_accessors(*names)
+      names.each{ |n| element_text_accessor(n) }
+    end
+    # Generate datetime element accessor for indicated name.
+    #
+    # Example:
+    #   class Entry < BaseEntry
+    #     element_datetime_accessor :updated
+    #     element_datetime_accessor :published
+    #   end
+    #   entry = Entry.new
+    #   entry.updated = Time.now
+    #   puts entry.updated.year
+    #   puts entry.updated.month
+    #
+    def self.element_datetime_accessor(name)
+      name = name.to_s
+      name.tr!('-', '_')
+      class_eval(<<-EOS, __FILE__, __LINE__)
+        def #{name}
+          dt = get(@ns, '#{name}')
+          dt.nil? ? nil : Time.iso8601(dt.text)
+        end
+        def #{name}=(value, attributes=nil)
+          case value
+            when Time
+              date = value.iso8601
+            else
+              date = value
+          end
+          set(@ns, '#{name}', date, attributes)
+        end
+      EOS
+    end
+    # You can set datetime accessor at once with this method
+    #
+    # Example:
+    #   class Entry < BaseEntry
+    #     element_datetime_accessor :updated, :published
+    #   end
+    #   entry = Entry.new
+    #   entry.updated = Time.now
+    #   puts entry.updated.year
+    #   puts entry.updated.month
+    #
+    def self.element_datetime_accessors(*names)
+      names.each{ |n| element_datetime_accessor(n) }
+    end
+    # Generates text accessor for multiple value.
+    #
+    # Example:
+    def self.element_text_list_accessor(name, moniker=nil)
+      name = name.to_s
+      name.tr!('-', '_')
+      unless moniker.nil?
+        moniker = moniker.to_s
+        moniker.tr!('-', '_') 
+      end
+      elem_ns = element_ns || ns
+      class_eval(<<-EOS, __FILE__, __LINE__)
+        def #{name}
+          value = getlist('#{elem_ns}', '#{name}')
+          value.empty?? nil : value.first
+        end
+        def #{name}=(stuff)
+          set('#{elem_ns}', '#{name}', stuff)
+        end
+        def add_#{name}(stuff)
+          add('#{elem_ns}', '#{name}', stuff)
+        end
+      EOS
+      class_eval(<<-EOS, __FILE__, __LINE__) unless moniker.nil?
+        def #{moniker}
+          getlist('#{elem_ns}', '#{name}')
+        end
+        def #{moniker}=(stuff)
+          #{name} = stuff
+        end
+      EOS
+    end
+    # Generate useful accessor for the multiple element
+    #
+    # Example:
+    #   class Entry < Element
+    #     element_object_list_accessors :author, Author, :authors
+    #     element_object_list_accessors :contributor, Contributor, :contributors
+    #   end
+    #
+    def self.element_object_list_accessor(name, ext_class, moniker=nil)
+      name = name.to_s
+      name.tr!('-', '_')
+      unless moniker.nil?
+        moniker = moniker.to_s
+        moniker.tr!('-', '_') 
+      end
+      elem_ns = ext_class.element_ns || ns
+      class_eval(<<-EOS, __FILE__, __LINE__)
+        def #{name}
+          get_object('#{elem_ns}', '#{name}', #{ext_class})
+        end
+        def #{name}=(stuff)
+          set('#{elem_ns}', '#{name}', stuff)
+        end
+        def add_#{name}(stuff)
+          add('#{elem_ns}', '#{name}', stuff)
+        end
+      EOS
+      class_eval(<<-EOS, __FILE__, __LINE__) unless moniker.nil?
+        def #{moniker}
+          get_objects('#{elem_ns}', '#{name}', #{ext_class})
+        end
+        def #{moniker}=(stuff)
+          #{name} = stuff
+        end
+      EOS
+    end
+    # Attribute accessor generator
+    def self.element_attr_accessor(name)
+      name = name.to_s
+      name.tr!('-', '_')
+      class_eval(<<-EOS, __FILE__, __LINE__)
+        def #{name}
+          get_attr('#{name}')
+        end
+        def #{name}=(value)
+          set_attr('#{name}', value)
+        end
+      EOS
+    end
+    # You can generate attribute accessor at once.
+    def self.element_attr_accessors(*names)
+      names.each{ |n| element_attr_accessor(n) }
+    end
+
+    # Setup element.
+    def initialize(params={})
+      @ns = params.has_key?(:namespace) ? params[:namespace] \
+          : self.class.element_ns       ? self.class.element_ns \
+          :                               self.class.ns
+      @elem = params.has_key?(:elem) ? params[:elem] : REXML::Element.new(self.class.element_name)
+      if @ns.is_a?(Namespace)
+        unless @ns.prefix.nil?
+          @elem.add_namespace @ns.prefix, @ns.uri
+        else
+          @elem.add_namespace @ns.uri
+        end
+      else
+        @elem.add_namespace @ns
+      end
+      params.keys.each do |key|
+        setter = "#{key}=";
+        send(setter.to_sym, params[key]) if respond_to?(setter.to_sym)
+      end
+    end
+    # accessor for xml-element(REXML::Element) object.
+    attr_reader :elem
+    # This method allows you to handle extra-element such as you can't represent
+    # with elements defined in Atom namespace.
+    #
+    #   entry = Atom::Entry.new
+    #   entry.set('http://example/2007/mynamespace', 'foo', 'bar')
+    #
+    # Now your entry includes new element.
+    # <foo xmlns="http://example/2007/mynamespace">bar</foo>
+    #
+    # You also can add attributes
+    #
+    #    entry.set('http://example/2007/mynamespace', 'foo', 'bar', { :myattr => 'attr1', :myattr2 => 'attr2' })
+    #
+    # And you can get following element from entry
+    #
+    #   <foo xmlns="http://example/2007/mynamespace" myattr="attr1" myattr2="attr2">bar</foo>
+    #
+    # Or using prefix,
+    #
+    #   entry = Atom::Entry.new
+    #   ns = Atom::Namespace.new(:prefix => 'dc', :uri => 'http://purl.org/dc/elements/1.1/')
+    #   entry.set(ns, 'subject', 'buz')
+    #
+    # Then your element contains
+    #
+    #   <dc:subject xmlns:dc="http://purl.org/dc/elements/1.1/">buz</dc:subject>
+    #
+    # And in case you need to handle more complex element, pass the REXML::Element object
+    # which you customized as third argument instead of text-value.
+    #
+    #   custom_element = REXML::Element.new
+    #   custom_child = REXML::Element.new('mychild')
+    #   custom_child.add_text = 'child!'
+    #   custom_element.add_element custom_child
+    #   entry.set(ns, 'mynamespace', costom_element)
+    #
+    def set(ns, element_name, value="", attributes=nil)
+      xpath = child_xpath(ns, element_name)
+      @elem.elements.delete_all(xpath)
+      add(ns, element_name, value, attributes)
+    end
+    # Same as 'set', but when a element-name confliction occurs,
+    # append new element without overriding.
+    def add(ns, element_name, value, attributes={})
+      element = REXML::Element.new(element_name)
+      if ns.is_a?(Namespace)
+        unless ns.prefix.nil? || ns.prefix.empty?
+          element.name = "#{ns.prefix}:#{element_name}"
+          element.add_namespace ns.prefix, ns.uri unless @ns == ns || @ns == ns.uri
+        else
+          element.add_namespace ns.uri unless @ns == ns || @ns == ns.uri
+        end
+      else
+        element.add_namespace ns unless @ns == ns || @ns.to_s == ns
+      end
+      if value.is_a?(Element)
+        value.elem.each_element do |e|
+          element.add e.deep_clone
+        end
+        value.elem.attributes.each_attribute do |a|
+          unless a.name =~ /^xmlns(?:\:)?/
+            element.add_attribute a
+          end
+        end
+        element.text = value.elem.text unless value.elem.text.nil?
+      else
+        if value.is_a?(REXML::Element)
+          element.add_element value.deep_clone
+        else
+          element.add_text value.to_s
+        end
+      end
+      element.add_attributes attributes unless attributes.nil?
+      @elem.add_element element
+    end
+    # Get indicated element.
+    # If it matches multiple, returns first one.
+    #
+    #   elem = entry.get('http://example/2007/mynamespace', 'foo')
+    #
+    #   ns = Atom::Namespace.new(:prefix => 'dc', :uri => 'http://purl.org/dc/elements/1.1/')
+    #   elem = entry.get(ns, 'subject')
+    #
+    def get(ns, element_name)
+      getlist(ns, element_name).first
+    end
+    # Get indicated elements as array
+    #
+    #   ns = Atom::Namespace.new(:prefix => 'dc', :uri => 'http://purl.org/dc/elements/1.1/')
+    #   elems = entry.getlist(ns, 'subject')
+    #
+    def getlist(ns, element_name)
+      @elem.get_elements(child_xpath(ns, element_name))
+    end
+    # Get indicated elements as an object of the class you passed as thrid argument.
+    #
+    #   ns = Atom::Namespace.new(:uri => 'http://example.com/ns#')
+    #   obj = entry.get_object(ns, 'mytag', MyClass)
+    #   puts obj.class #MyClass
+    #
+    # MyClass should inherit Atom::Element
+    #
+    def get_object(ns, element_name, ext_class)
+      elements = getlist(ns, element_name)
+      return nil if elements.empty?
+      ext_class.new(:namespace => ns, :elem => elements.first) 
+    end
+    # Get all indicated elements as an object of the class you passed as thrid argument.
+    #
+    #   entry.get_objects(ns, 'mytag', MyClass).each{ |obj|
+    #     p obj.class #MyClass
+    #   }
+    #
+    def get_objects(ns, element_name, ext_class)
+      elements = getlist(ns, element_name)
+      return [] if elements.empty?
+      elements.collect do |e|
+        ext_class.new(:namespace => ns, :elem => e) 
+      end
+    end
+    # Get attribute value for indicated key
+    def get_attr(name)
+      @elem.attributes[name.to_s]
+    end
+    # Set attribute value for indicated key
+    def set_attr(name, value)
+      @elem.attributes[name.to_s] = value
+    end
+    # Convert to XML-Document and return it as string
+    def to_s(*)
+      doc = REXML::Document.new
+      decl = REXML::XMLDecl.new("1.0", "utf-8")
+      doc.add decl
+      doc.add_element @elem.deep_clone
+      doc.to_s
+    end
+    private
+    # Get a xpath string to traverse child elements with namespace and name.
+    def child_xpath(ns, element_name, attributes=nil)
+      ns_uri = ns.is_a?(Namespace) ? ns.uri : ns
+      unless !attributes.nil? && attributes.is_a?(Hash)
+        "child::*[local-name()='#{element_name}' and namespace-uri()='#{ns_uri}']"
+      else
+        attr_str = attributes.collect{|key, val| "@#{key.to_s}='#{val}'"}.join(' and ')
+        "child::*[local-name()='#{element_name}' and namespace-uri()='#{ns_uri}' and #{attr_str}]"
+      end
+    end
+  end
+  # = Atom::Person
+  #
+  # This class represents person construct
+  # Use this for 'author' or 'contributor' elements.
+  # You also can use Atom::Author or Atom::Contributor directly for each element,
+  # But this class can be converted to each class's object easily
+  # with 'to_author' or 'to_contributor' method.
+  #
+  # Example:
+  #
+  #   person = Atom::Person.new
+  #   person.name = "John"
+  #   person.email = "example@example.com"
+  #   person.url = "http://example.com/"
+  #   entry = Atom::Entry.new
+  #   entry.add_authors person.to_author
+  #   entry.add_contributor person.to_contributor
+  #
+  class Person < Element
+    element_name :author
+    element_text_accessors :name, :email, :uri
+    # Convert to an Atom::Author object
+    def to_author
+      author = Author.new
+      author.name = self.name
+      author.email = self.email unless self.email.nil?
+      author.uri = self.uri unless self.uri.nil?
+      author
+    end
+    # Convert to an Atom::Contributor object
+    def to_contributor
+      contributor = Contributor.new
+      contributor.name = self.name
+      contributor.email = self.email unless self.email.nil?
+      contributor.uri = self.uri unless self.uri.nil?
+      contributor
+    end
+  end
+  # = Atom::Author
+  #
+  # This class represents Author
+  class Author < Person
+    element_name :author
+  end
+  # = Atom::Contributor
+  #
+  # This class represents Contributor
+  class Contributor < Person
+    element_name :contributor
+  end
+
+  class Generator < Element
+    element_name :generator
+    element_attr_accessors :uri, :version
+    def name
+      @elem.text
+    end
+    def name=(name)
+      @elem.text = name
+    end
+  end
+  # = Atom::Link
+  #
+  # This class represents link element
+  #
+  # You can use these accessors
+  #  * href
+  #  * rel
+  #  * type
+  #  * hreflang
+  #  * title
+  #  * length
+  #
+  class Link < Element
+    element_name :link
+    element_attr_accessors :href, :rel, :type, :hreflang, :title, :length
+    def to_replies_link
+      RepliesLink.new(:elem => @elem)
+    end
+  end
+
+  class RepliesLink < Link
+
+    def initialize(params={})
+      super(params)
+      @elem.add_namespace(Namespace::THR.prefix, Namespace::THR.uri)
+      set_attr('rel', 'replies')
+    end
+
+    def rel=(name)
+    end
+
+    def count
+      num = get_attr('thr:count')
+      num.nil?? nil : num.to_i
+    end
+
+    def count=(num)
+      set_attr('thr:count', num.to_s)
+    end
+
+    def updated
+      value = get_attr('thr:updated')
+      value.nil?? nil : Time.iso8601(value)
+    end
+
+    def updated=(time)
+      time = time.iso8601 if time.instance_of?(Time)
+      set_attr('thr:updated', time)
+    end
+
+  end
+
+  class ReplyTarget < Element
+    element_ns Namespace::THR
+    element_name 'in-reply-to'
+    element_attr_accessors :href, :ref, :type, :source
+
+    def id
+      self.ref
+    end
+
+    def id=(ref)
+      self.ref = ref
+    end
+
+  end
+
+  # Category class
+  class Category < Element
+    element_name :category
+    element_attr_accessors :term, :scheme, :label
+  end
+  # Content class
+  class Content < Element
+
+    element_name :content
+    element_attr_accessors :type, :src
+
+    def initialize(params={})
+      super(params)
+      #self.body = params[:body] if params.has_key?(:body)
+      self.type = params[:type] if params.has_key?(:type)
+    end
+
+    def body=(value)
+      if value =~ /^(?:
+         [[:print:]]
+        |[\xc0-\xdf][\x80-\xbf]
+        |[\xe0-\xef][\x80-\xbf]{2}
+        |[\xf0-\xf7][\x80-\xbf]{3}
+        |[\xf8-\xfb][\x80-\xbf]{4}
+        |[\xfc-\xfd][\x80-\xbf]{5}
+        )*$/x
+        copy = "<div xmlns=\"http://www.w3.org/1999/xhtml\">#{value}</div>"  
+        is_valid = true
+        begin
+          node = REXML::Document.new(copy).elements[1][0]
+        rescue
+          is_valid = false
+        end
+        if is_valid && node.instance_of?(REXML::Element)
+          @elem.add_element node
+          self.type = 'xhtml'
+        else
+          @elem.add_text value
+          self.type = (value =~ /^\s*</) ? 'html' : 'text'
+        end
+      else
+        @elem.add_text([value].pack('m').chomp)
+      end
+    end
+
+    def body
+      if @body.nil?
+        mode = self.type == 'xhtml'       ? 'xml'\
+             : self.type =~ %r{[\/+]xml$} ? 'xml'\
+             : self.type == 'html'        ? 'escaped'\
+             : self.type == 'text'        ? 'escaped'\
+             : self.type =~ %r{^text}     ? 'escaped'\
+             :                              'base64'
+        case(mode)
+          when 'xml'
+            unless @elem.elements.empty?
+              if @elem.elements.size == 1 && @elem.elements[1].name == 'div'
+                @body = @elem.elements[1].collect{ |c| c.to_s }.join('')
+              else
+                @body = @elem.collect{ |c| c.to_s }.join('')
+              end
+            else
+              @body = @elem.text
+            end
+          when 'escaped'
+            @body = @elem.text
+          when 'base64'
+            text = @elem.text
+            @body = text.nil?? nil : text.unpack('m').first
+          else
+            @body = nil
+        end
+      end
+      @body
+    end
+  end
+
+  class RootElement < Element
+    def initialize(params={})
+      super(params)
+      if params.has_key?(:stream)
+        stream = params[:stream]
+        @elem = REXML::Document.new(stream).root
+      elsif params.has_key?(:doc)
+        @elem = params[:doc].elements[1]
+      end
+      @ns = Namespace.new(:uri => @elem.namespace)
+    end
+  end
+
+  class CoreElement < RootElement
+
+    element_text_accessors :id, :title, :rights
+    element_datetime_accessor :updated
+    element_object_list_accessor :link,        Link,        :links
+    element_object_list_accessor :category,    Category,    :categories
+    element_object_list_accessor :author,      Author,      :authors
+    element_object_list_accessor :contributor, Contributor, :contributors
+
+    def self.element_link_accessor(type)
+      type = type.to_s
+      meth_name = [type.tr('-','_'), 'link'].join('_')
+      class_eval(<<-EOS, __FILE__, __LINE__)
+
+        def #{meth_name}
+          selected = links.select{ |l| l.rel == '#{type}' }
+          selected.empty? ? nil : selected.first.href
+        end
+
+        def #{meth_name}s
+          links.select{ |l| l.rel == '#{type}' }.collect{ |l| l.href }
+        end
+
+        def add_#{meth_name}(href)
+          l = Link.new
+          l.href = href
+          l.rel = '#{type}'
+          add_link l
+        end
+
+        def #{meth_name}=(href)
+          xpath = child_xpath(Namespace::ATOM, 'link', { :rel => '#{type}' })
+          @elem.elements.delete_all(xpath)
+          add_#{meth_name}(href)
+        end
+      EOS
+    end
+
+    def self.element_link_accessors(*types)
+      types.flatten.each{ |type| element_link_accessor(type) }
+    end
+
+    element_link_accessors %w(self edit edit-media related enclosure via first previous next last)
+
+    def alternate_links
+      links.select{ |l| l.rel.nil? || l.rel == 'alternate' }.collect{ |l| l.href }
+    end
+
+    def alternate_link
+      alternates = links.select{ |l| l.rel.nil? || l.rel == 'alternate' }
+      alternates.empty? ? nil : alternates.first.href
+    end
+
+    def add_alternate_link(href)
+      l = Link.new
+      l.href = href
+      l.rel = 'alternate'
+      add_link l
+    end
+
+    def alternate_link=(href)
+      xpath = child_xpath(Namespace::ATOM, 'link', { :rel => 'alternate' })
+      @elem.elements.delete_all(xpath)
+      add_alternate_link(href)
+    end
+
+    def initialize(params={})
+      if params.has_key?(:uri) || params.has_key?(:file)
+        target = params.has_key?(:uri)         ? URI.parse(params.delete(:uri)) \
+               : params[:file].is_a?(Pathname) ? params.delete(:file) \
+               :                                 Pathname.new(params.delete(:file))
+        params[:stream] = target.open { |f| f.read }
+      end
+      super(params)
+    end
+
+  end
+
+  class Control < Element
+    element_ns Namespace::APP_WITH_PREFIX
+    element_name :control
+    element_text_accessor :draft
+  end
+
+  class Categories < Element
+    element_ns Namespace::APP
+    element_name :categories
+    element_attr_accessors :href, :scheme, :fixed
+
+    def category
+      get_object(Namespace::ATOM_WITH_PREFIX, 'category', Category)
+    end
+
+    def category=(value)
+      set(Namespace::ATOM_WITH_PREFIX, 'category', value)
+    end
+
+    def add_category(value)
+      add(Namespace::ATOM_WITH_PREFIX, 'category', value)
+    end
+
+    def categories
+      get_objects(Namespace::ATOM_WITH_PREFIX, 'category', Category)
+    end
+
+    def categories=(value)
+      category = value
+    end
+  end
+
+  class Collection < Element
+    element_ns Namespace::APP
+    element_name :collection
+    element_attr_accessor :href
+    element_text_list_accessor :accept, :accepts
+    element_object_list_accessor :categories, Categories, :categories_list
+    def title
+      title = get(Namespace::ATOM_WITH_PREFIX, 'title')
+      title.nil?? nil : title.text
+    end
+    def title=(value)
+      set(Namespace::ATOM_WITH_PREFIX, 'title', value)
+    end
+
+  end
+
+  class Workspace < Element
+    element_ns Namespace::APP
+    element_name :workspace
+    element_object_list_accessor :collection, Collection, :collections
+    def title
+      title = get(Namespace::ATOM_WITH_PREFIX, 'title')
+      title.nil?? nil : title.text
+    end
+    def title=(value)
+      set(Namespace::ATOM_WITH_PREFIX, 'title', value)
+    end
+  end
+  # = Atom::Service
+  #
+  # This class represents service document
+  #
+  class Service < RootElement
+    element_ns Namespace::APP
+    element_name :service
+    element_object_list_accessor :workspace, Workspace, :workspaces
+  end
+
+  class Entry < CoreElement
+    element_name :entry
+    element_text_accessors :source, :summary
+    element_datetime_accessor :published
+    element_link_accessor :replies
+
+    def links
+      ls = super
+      ls.collect do |l|
+        l.rel == 'replies' ? l.to_replies_link : l
+      end
+    end
+
+    def link
+      l = super
+      l.rel == 'replies' ? l.to_replies_link : l
+    end
+
+    def control
+      get_object(Namespace::APP_WITH_PREFIX, 'control', Control)
+    end
+
+    def control=(control)
+      set(Namespace::APP_WITH_PREFIX, 'control', control)
+    end
+
+    def add_control(control)
+      add(Namespace::APP_WITH_PREFIX, 'control', control)
+    end
+
+    def controls
+      get_objects(Namespace::APP_WITH_PREFIX, 'control', Control)
+    end
+
+    def controls=(control)
+      control = control
+    end
+
+    def edited
+      get(Namespace::APP_WITH_PREFIX, 'edited')
+    end
+
+    def edited=(value)
+      set(Namespace::APP_WITH_PREFIX, 'edited', value)
+    end
+
+    def total
+      value = get(Namespace::THR, 'total')
+      value.nil?? nil : value.to_i
+    end
+
+    def total=(value)
+      set(Namespace::THR, 'total', value.to_s)
+    end
+
+    def content
+      get_object(@ns, 'content', Content)
+    end
+
+    def content=(value)
+      unless value.is_a?(Content)
+        value = Content.new(:body => value)
+      end
+      set(@ns, 'content', value)
+    end
+
+    def in_reply_to(value=nil)
+      if value.nil?
+        get_object(Namespace::THR, 'in-reply-to', ReplyTarget)
+      else
+        value = ReplyTarget.new(value) if value.is_a?(Hash)
+        set(Namespace::THR, 'in-reply-to', value)
+      end
+    end
+
+  end
+  # Feed Class
+  #
+  class Feed < CoreElement
+    element_name :feed
+    element_text_accessors :icon, :logo, :subtitle
+    element_object_list_accessor :entry, Entry, :entries
+
+    def total_results
+      value = get(Namespace::OPEN_SEARCH, 'totalResults')
+      value.nil?? nil : value.text.to_i
+    end
+
+    def total_results=(num)
+      set(Namespace::OPEN_SEARCH, 'totalResults', num.to_s)
+    end
+
+    def start_index
+      value = get(Namespace::OPEN_SEARCH, 'startIndex')
+      value.nil?? nil : value.text.to_i
+    end
+
+    def start_index=(num)
+      set(Namespace::OPEN_SEARCH, 'startIndex', num.to_s)
+    end
+
+    def items_per_page
+      value = get(Namespace::OPEN_SEARCH, 'itemsPerPage')
+      value.nil?? nil : value.text.to_i
+    end
+
+    def items_per_page=(num)
+      set(Namespace::OPEN_SEARCH, 'itemsPerPage', num.to_s)
+    end
+
+    def generator
+       get_object(Namespace::ATOM, 'generator', Generator)
+    end
+
+    def generator=(gen)
+      gen = gen.is_a?(Generator) ? gen : Generator.new(:name => gen)
+      set(Namespace::ATOM, 'generator', gen)
+    end
+    
+    def language
+      @elem.attributes['xml:lang']
+    end
+
+    def language=(lang)
+      #@elem.add_attribute 'lang', 'http://www.w3.org/XML/1998/Namespace'
+      @elem.add_attribute 'xml:lang', lang
+    end
+
+    def version
+      @elem.attributes['version']
+    end
+
+    def version=(ver)
+      @elem.add_attribute 'version', ver
+    end
+  end
+end
+# = Atompub
+#
+module Atompub
+
+  class RequestError       < StandardError; end #:nodoc:
+  class AuthError          < RequestError ; end #:nodoc:
+  class CacheNotFoundError < RequestError ; end #:nodoc:
+  class ResponseError      < RequestError ; end #:nodoc:
+  class MediaTypeError     < RequestError ; end #:nodoc:
+  # = Atompub::CacheResource
+  #
+  # Cache resource that is stored by AbstractCache or it's subclass.
+  # This class just has only three accessors.
+  #
+  # * etag
+  # * last_modofied
+  # * resource
+  #
+  class CacheResource
+    attr_accessor :etag, :last_modified, :resource
+    def initialize(params)
+      @etag          = params[:etag]
+      @last_modified = params[:last_modified]
+      @resource      = params[:rc]
+    end
+  end
+  # = Atompub::AbstractCache
+  #
+  # Cache storage for atompub networking.
+  # In case the server that provieds AtomPub-API handles caching with
+  # http headers, ETag or If-Modified-Since, you can handle them with this class.
+  # But this class does nothing, use subclass that inherits this.
+  #
+  class AbstractCache
+    # singleton closure
+    @@singleton = nil
+    # Get singleton instance.
+    def self.instance
+      @@singleton = self.new if @@singleton.nil?
+      @@singleton
+    end
+    # initializer
+    def initialize
+    end
+    # Get cache resource for indicated uri
+    def get(uri)
+      nil
+    end
+    # Store cache resource
+    def put(uri, params)
+    end
+  end
+  # = Atompub::SimpleCache
+  #
+  # Basic cache storage class.
+  # Use Hash object to store data.
+  class SimpleCache < AbstractCache
+    # singleton closure
+    @@singleton = nil
+    # Get singleton instance
+    def self.instance
+      @@singleton = self.new if @@singleton.nil?
+      @@singleton
+    end
+    # initializer
+    def initialize
+      @cache = Hash.new
+    end
+    # Pick cache resource from hash for indicated uri.
+    def get(uri)
+      @cache.has_key?(uri) ? @cache[uri] : nil
+    end
+    # Set cache resource into hash.
+    def put(uri, params)
+      @cache[uri] = CacheResource.new(params)
+    end
+
+  end
+
+  class ServiceInfo
+
+    def initialize(params)
+      @collection = params[:collection]
+      @allowed_categories = nil
+      @accepts = nil
+    end
+
+    def allows_category?(test)
+      return true if @collection.nil?
+      categories_list = @collection.categories_list
+      return true if categories_list.empty?
+      return true if categories_list.all? { |cats| cats.fixed.nil? || cats.fixed != 'yes' }
+      if @allowed_categories.nil?
+        @allowed_categories = categories_list.collect do |cats|
+          cats.categories.collect do |cat|
+            scheme = cat.scheme || cats.scheme || nil
+            new_cat = Atom::Category.new :term => cat.term
+            new_cat.scheme = scheme unless scheme.nil?
+            new_cat
+          end
+        end.flatten
+      end
+      return false if @allowed_categories.empty?
+      @allowed_categories.any?{ |c| c.term == test.term && (c.scheme.nil? || (!c.scheme.nil? && c.scheme == test.scheme )) }
+    end
+
+    def accepts_media_type?(content_type)
+      return true if @collection.nil?
+      if @accepts.nil?
+        @accepts = @collection.accepts.collect do |accept|
+          accept.text.split(/[\s,]+/) 
+        end.flatten
+        @accepts << Atom::MediaType::ENTRY if @accepts.empty?
+      end
+      type = Atom::MediaType.new(content_type)
+      @accepts.any?{ |a| type.is_a?(a) }
+    end
+
+  end
+
+  class ServiceInfoStorage
+
+    @@singleton = nil
+
+    def self.instance
+      @@singleton = self.new if @@singleton.nil?
+      @@singleton
+    end
+
+    def initialize
+      @info = Hash.new
+    end
+
+    def get(uri)
+      @info.has_key?(uri) ? @info[uri] : nil
+    end
+
+    def put(uri, collection, client=nil)
+      new_collection = clone_collection(collection, client)
+      @info[uri] = ServiceInfo.new(:collection => new_collection)
+    end
+
+    private
+    def clone_collection(collection, client=nil)
+      coll = Atom::Collection.new
+      coll.title = collection.title
+      coll.href  = collection.href
+      collection.accepts.each { |a| coll.add_accept a.text }
+      collection.categories_list.each do |cats|
+        unless cats.nil?
+          new_cats = cats.href.nil?? clone_categories(cats) : get_categories(cats.href, client) 
+          coll.categories = new_cats unless new_cats.nil?
+        end
+      end
+      coll
+    end
+
+    def get_categories(uri, client=nil)
+      client.nil?? nil : client.get_categories(uri)
+    end
+
+    def clone_categories(categories)
+      cats = Atom::Categories.new
+      cats.fixed  = categories.fixed
+      cats.scheme = categories.scheme
+      categories.categories.each do |c|
+        new_c = Atom::Category.new
+        new_c.term = c.term
+        new_c.scheme = c.scheme
+        new_c.label = c.label
+        cats.add_category new_c
+      end
+      cats
+    end
+  end
+  # = Atompub::Client
+  #
+  class Client
+    # user agent
+    attr_accessor :agent
+    # request object for current networking context
+    attr_reader :req
+    alias_method :request, :req
+    # response object for current networking context
+    attr_reader :res
+    alias_method :response, :res
+    # resource object for current networking context
+    attr_reader :rc
+    alias_method :resource, :rc
+    # Initializer
+    #
+    # * auth
+    # * cache
+    #
+    def initialize(params={})
+      unless params.has_key?(:auth)
+        throw ArgumentError.new("Atompub::Client needs :auth as argument for constructor.")
+      end
+      @auth  = params.has_key?(:auth) && params[:auth].kind_of?(Auth::Abstract) ? params[:auth] : Auth::Abstract.new
+      @cache = params.has_key?(:cache) && params[:cache].kind_of?(AbstractCache) ? params[:cache] : AbstractCache.instance
+      @service_info = params.has_key?(:info) && params[:info].kind_of?(ServiceInfoStorage) ? params[:info] : ServiceInfoStorage.instance
+      @http_class = Net::HTTP
+      @agent = "Atompub::Client/#{AtomUtil::VERSION}"
+    end
+    # Set proxy if you need.
+    #
+    # Example:
+    #
+    #   client.use_proxy('http://myproxy/', 8080)
+    #   client.use_proxy('http://myproxy/', 8080, 'myusername', 'mypassword')
+    #
+    def use_proxy(uri, port, user=nil, pass=nil)
+      @http_class = Net::HTTP::Proxy(uri, port, user, pass)
+    end
+    # Get service document
+    # This returns Atom::Service object.
+    # see the document of Atom::Service in detail.
+    #
+    # Example:
+    #
+    #   service = client.get_service(service_uri)
+    #   service.workspaces.each do |w|
+    #     w.collections.each do |c|
+    #       puts c.href
+    #     end
+    #   end
+    #
+    def get_service(service_uri)
+      get_contents_except_resources(service_uri) do |res|
+        #warn "Bad Content Type" unless Atom::MediaType::SERVICE.is_a?(@res['Content-Type'])
+        @rc = Atom::Service.new :stream => @res.body
+        @rc.workspaces.each do |workspace|
+          workspace.collections.each do |collection|
+            #@service_info.put(collection.href, collection, self) 
+            @service_info.put(collection.href, collection) 
+          end
+        end
+      end
+      @rc
+    end
+    # Get categories
+    # This returns Atom::Categories object.
+    # see the document of Atom::Categories in detail.
+    #
+    # Example:
+    #
+    #
+    def get_categories(categories_uri)
+      get_contents_except_resources(categories_uri) do |res|
+        #warn "Bad Content Type" unless Atom::MediaType::CATEGORIES.is_a?(@res['Content-Type'])
+        @rc = Atom::Categories.new :stream => @res.body
+      end
+      @rc
+    end
+    # Get feed
+    # This returns Atom::Feed object.
+    # see the document of Atom::Feed in detail.
+    #
+    # Example:
+    #
+    def get_feed(feed_uri)
+      get_contents_except_resources(feed_uri) do |res|
+        #warn "Bad Content Type" unless Atom::MediaType::FEED.is_a?(@res['Content-Type'])
+        @rc = Atom::Feed.new :stream => res.body
+      end
+      @rc
+    end
+    # Get entry
+    #
+    # Example:
+    #
+    #   entry = client.get_entry(entry_uri)
+    #   puts entry.id
+    #   puts entry.title
+    #
+    def get_entry(entry_uri)
+      get_resource(entry_uri)
+      unless @rc.instance_of?(Atom::Entry)
+        raise ResponseError, "Response is not Atom Entry"
+      end
+      @rc
+    end
+    # Get media resource
+    #
+    # Example:
+    #
+    #   resource, content_type = client.get_media(media_uri)
+    #
+    def get_media(media_uri)
+      get_resource(media_uri)
+      if @rc.instance_of?(Atom::Entry)
+        raise ResponseError, "Response is not Media Resource"
+      end
+      return @rc, @res.content_type
+    end
+    # Create new entry
+    #
+    # Example:
+    #
+    #   entry = Atom::Entry.new
+    #   entry.title = 'foo'
+    #   author = Atom::Author.new
+    #   author.name = 'Lyo Kato'
+    #   author.email = 'lyo.kato@gmail.com'
+    #   entry.author = author
+    #   entry_uri = client.create_entry(post_uri, entry)
+    #
+    def create_entry(post_uri, entry, slug=nil)
+      unless entry.kind_of?(Atom::Entry)
+        entry = Atom::Entry.new :stream => entry
+      end
+      service = @service_info.get(post_uri)
+      unless entry.categories.all?{ |c| service.allows_category?(c) }
+        raise RequestError, "Forbidden Category"
+      end
+      create_resource(post_uri, entry.to_s, Atom::MediaType::ENTRY.to_s, slug)
+      @res['Location']
+    end
+    # Create new media resource
+    #
+    # Example:
+    #
+    #   media_uri = client.create_media(post_media_uri, 'myimage.jpg', 'image/jpeg')
+    #
+    def create_media(media_uri, file_path, content_type, slug=nil)
+      file_path = Pathname.new(file_path) unless file_path.is_a?(Pathname)
+      stream = file_path.open { |f| f.binmode; f.read }
+      service = @service_info.get(media_uri)
+      if service.nil?
+        raise RequestError, "Service information not found. Get service document before you do create_media."
+      end
+      unless service.accepts_media_type?(content_type)
+        raise RequestError, "Unsupported Media Type: #{content_type}"
+      end
+      create_resource(media_uri, stream, content_type, slug)
+      @res['Location']
+    end
+    # Update entry
+    #
+    # Example:
+    #
+    #   entry = client.get_entry(resource_uri)
+    #   entry.summary = "Changed Summary!"
+    #   client.update_entry(entry)
+    #
+    def update_entry(edit_uri, entry)
+      unless entry.kind_of?(Atom::Entry)
+        entry = Atom::Entry.new :stream => entry
+      end
+      update_resource(edit_uri, entry.to_s, Atom::MediaType::ENTRY.to_s)
+    end
+    # Update media resource
+    #
+    # Example:
+    #
+    #   entry = client.get_entry(media_link_uri)
+    #   client.update_media(entry.edit_media_link, 'newimage.jpg', 'image/jpeg')
+    #
+    def update_media(media_uri, file_path, content_type)
+      file_path = Pathname.new(file_path) unless file_path.is_a?(Pathname)
+      stream = file_path.open { |f| f.binmode; f.read }
+      update_resource(media_uri, stream, content_type)
+    end
+    # Delete entry
+    #
+    # Example:
+    #
+    #   entry = client.get_entry(resource_uri)
+    #   client.delete_entry(entry.edit_link)
+    #
+    def delete_entry(edit_uri)
+      delete_resource(edit_uri) 
+    end
+    # Delete media
+    #
+    # Example:
+    #
+    #   entry = client.get_entry(resource_uri)
+    #   client.delete_media(entry.edit_media_link)
+    #
+    def delete_media(media_uri)
+      delete_resource(media_uri)
+    end
+    private
+    # Set request headers those are required on each request accessing resources.
+    def set_common_info(req)
+      req['User-Agent'] = @agent
+      @auth.authorize(req) 
+    end
+    # Get contents, for example, service-document, categories, and feed.
+    def get_contents_except_resources(uri, &block)
+      clear
+      uri = URI.parse(uri)
+      @req = Net::HTTP::Get.new uri.request_uri
+      set_common_info(@req)
+      @http_class.start(uri.host, uri.port) do |http|
+        @res = http.request(@req)
+        case @res
+          when Net::HTTPOK
+            block.call(@res) if block_given?
+          else
+            raise RequestError, "Failed to get contents. #{@res.code}"
+        end
+      end
+    end
+    # Get resouces(entry or media)
+    def get_resource(uri)
+      clear
+      uri = URI.parse(uri)
+      @req = Net::HTTP::Get.new uri.request_uri
+      set_common_info(@req)
+      cache = @cache.get(uri.to_s)
+      unless cache.nil?
+        @req['If-Modified-Since'] = cache.last_modified unless cache.last_modified.nil?
+        @req['If-None-Match'] = cache.etag unless cache.etag.nil?
+      end
+      @http_class.start(uri.host, uri.port) do |http|
+        @res = http.request(@req)
+        case @res
+          when Net::HTTPOK
+            if Atom::MediaType::ENTRY.is_a?(@res['Content-Type'])
+              @rc = Atom::Entry.new :stream => @res.body
+            else
+              @rc = @res.body
+            end
+            @cache.put uri.to_s, {
+              :rc            => @rc,
+              :last_modified => @res['Last-Modified'],
+              :etag          => @res['ETag'] }
+          when Net::HTTPNotModified
+            unless cache.nil?
+              @rc = cache.rc
+            else
+              raise CacheNotFoundError, "Got Not-Modified response, but has no cache."
+            end
+          else
+            raise RequestError, "Failed to get content. #{@res.code}"
+        end
+      end
+    end
+    # Create new resources(entry or media)
+    def create_resource(uri, r, content_type, slug=nil)
+      clear
+      uri = URI.parse(uri)
+      #service = @service_info.get(uri.to_s)
+      #unless service.accepts_media_type(content_type)
+      #  raise UnsupportedMediaTypeError, "Unsupported media type: #{content_type}."
+      #end
+      @req = Net::HTTP::Post.new uri.request_uri
+      @req['Content-Type'] = content_type
+      @req['Slug'] = URI.encode(URI.decode(slug)) unless slug.nil?
+      set_common_info(@req)
+      @req.body = r
+      @http_class.start(uri.host, uri.port) do |http|
+        @res = http.request(@req)
+        case @res
+          when Net::HTTPSuccess
+            #warn "Bad Status Code: #{@res.code}" unless @res.class == Net::HTTPCreated
+            #warn "Bad Content Type: #{@res['Content-Type']}" unless Atom::MediaType::ENTRY.is_a?(@res['Content-Type'])
+            if @res['Location'].nil?
+              raise ResponseError, "No Location"
+            end
+            unless @res.body.nil?
+              @rc = Atom::Entry.new :stream => @res.body
+              @cache.put uri.to_s, {
+                :rc            => @rc,
+                :last_modified => @res['Last-Modified'],
+                :etag          => @res['ETag']
+              }
+            end
+          else
+            error_message = @res.body.nil?? "#{@res.code}" : "#{@res.code} / #{@res.body}"
+            raise RequestError, "Failed to create resource. #{error_message}"
+        end
+      end
+    end
+    # updated resources(entry or media)
+    def update_resource(uri, r, content_type)
+      clear
+      uri = URI.parse(uri)
+      @req = Net::HTTP::Put.new uri.request_uri
+      @req['Content-Type'] = content_type
+      cache = @cache.get(uri.to_s)
+      unless cache.nil?
+        @req['If-Not-Modified-Since'] = cache.last_modofied unless cache.last_modified.nil?
+        @req['If-Match'] = cache.etag unless cache.etag.nil?
+      end
+      set_common_info(@req)
+      @req.body = r
+      @http_class.start(uri.host, uri.port) do |http|
+        @res = http.request(@req)
+        case @res
+          when Net::HTTPSuccess
+            #warn "Bad Status Code: #{@res.code}" unless @res.class == Net::HTTPOK || @res.class == Net::HTTPNoContent
+            unless @res.body.nil?
+              @rc = Atom::MediaType::ENTRY.is_a?(@res['Content-Type']) ? Atom::Entry.new(:stream => @res.body) : @res.body
+              @cache.put uri.to_s, {
+                :rc            => @rc,
+                :etag          => @res['ETag'],
+                :last_modified => @res['Last-Modified'] }
+            end
+          else
+            raise RequestError, "Failed to update resource. #{@res.code}"
+        end
+      end
+    end
+    # Delete resources(entry or media)
+    def delete_resource(uri)
+      clear
+      uri = URI.parse(uri)
+      @req = Net::HTTP::Delete.new uri.request_uri
+      set_common_info(@req)
+      @http_class.start(uri.host, uri.port) do |http|
+        @res = http.request(@req)
+        case @res
+          when Net::HTTPSuccess
+            #warn "Bad Status Code: #{@res.code}" unless @res.class == Net::HTTPOK || @res.class == Net::HTTPNoContent
+          else
+            raise RequestError, "Failed to delete resource. #{@res.code}"
+          end
+      end
+    end
+    # clear objects which depend on each networking context.
+    def clear
+      @req = nil
+      @res = nil
+      @rc  = nil
+    end
+  end
+  # Authentication classes
+  module Auth
+    class Abstract
+      def initialize(params)
+      end
+      def authorize(req)
+      end
+    end
+    # = Atompub::Auth::Wsse
+    #
+    # Class handles WSSE authentication
+    # All you have to do is create this class's object with username and password,
+    # and pass to Atompub::Client#new
+    #
+    # Usage:
+    #
+    #   auth = Atompub::Auth::Wsse.new :username => username, :password => password
+    #   client = Atompub::Client.new :auth => auth
+    #
+    class Wsse < Abstract
+      # initializer
+      #
+      # Set two parameters as hash
+      # * username 
+      # * password
+      #
+      # Usage:
+      #
+      #   auth = Atompub::Auth::Wsse.new :username => name, :password => pass
+      #
+      def initialize(params)
+        @username, @password = params[:username], params[:password]
+      end
+      # Add credential info to Net::HTTP::Request object
+      #
+      # Usaage:
+      #
+      #   req = Net::HTTP::Get.new uri.request_uri
+      #   auth.authorize(req)
+      #
+      def authorize(req)
+        req['Authorization'] = 'WSSE profile="UsernameToken"'
+        req['X-Wsse'] = gen_token
+      end
+      private
+      # Generate username token for WSSE authentication
+      def gen_token
+        nonce = Array.new(10){rand(0x100000000)}.pack('I*')
+        nonce_base64 = [nonce].pack('m').chomp
+        now = Time.now.utc.iso8601
+        digest = [Digest::SHA1.digest(nonce + now + @password)].pack('m').chomp
+        sprintf(%Q<UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s">,
+          @username, digest, nonce_base64, now)
+      end
+    end
+    # = Atompub::Auth::Basic
+    #
+    # Usage:
+    #
+    #   auth = Atompub::Auth::Basic.new :username => username, :password => password
+    #   client = Atompub::Client.new :auth => auth
+    #
+    class Basic < Abstract
+      # initializer
+      #
+      # Set two parameters as hash
+      # * username 
+      # * password
+      #
+      # Usage:
+      #
+      #   auth = Atompub::Auth::Basic.new :username => name, :password => pass
+      #
+      def initialize(params)
+        @username, @password = params[:username], params[:password]
+      end
+      # Add credential info to Net::HTTP::Request object
+      #
+      # Usage:
+      #
+      #   req = Net::HTTP::Get.new uri.request_uri
+      #   auth.authorize(req)
+      #
+      def authorize(req)
+        req.basic_auth @username, @password
+      end
+    end
+  end
+
+end
+
diff --git a/lib/hateda_letter.rhtml b/lib/hateda_letter.rhtml
new file mode 100644 (file)
index 0000000..d87e056
--- /dev/null
@@ -0,0 +1,17 @@
+**文字
+<div class="letter"><%= letter.letter %></div>
+**読み
+<div class="yomi"><%= letter.disp_yomi %></div>
+**解説
+<div class="content"><%= enlink(letter.disp_detail, htn) %></div>
+**登場する章
+<div class="section-list">
+<% sections.each do |section| -%>
+<%= htn.to_link(section.hateda_section.name, section.caption) -%>
+ <% end %></div>
+**もっと詳しく
+<div class="more">
+[http://www.google.co.jp/search?hl=ja&q=<%= CGI.escape(letter.letter) -%>&lr=lang_ja:title=<%= letter.letter -%>をGoogleで検索]
+[http://kotobank.jp/word/<%= CGI.escape(letter.letter) -%>:title=<%= letter.letter -%>をコトバンクで検索]
+[http://www.weblio.jp/content/<%= CGI.escape(letter.letter) -%>:title=<%= letter.letter -%>をweblioで検索]
+</div>
diff --git a/lib/hateda_letter_index.rhtml b/lib/hateda_letter_index.rhtml
new file mode 100644 (file)
index 0000000..52239cf
--- /dev/null
@@ -0,0 +1,3 @@
+<% letters.each do |letter| -%>
+<%= htn.to_link(letter.hateda_letter.name, letter.letter) -%>(<%= letter.disp_yomi %>)<%= letter.desc %>/<%= letter.count %>回
+<% end -%>
diff --git a/lib/hateda_section.rhtml b/lib/hateda_section.rhtml
new file mode 100644 (file)
index 0000000..76640be
--- /dev/null
@@ -0,0 +1,47 @@
+**原文
+<%= section.disp_source %>
+**訓み下し文
+<%= enruby(section.disp_japanese) %>
+**解釈
+<%= section.disp_myself %>
+**備考
+<%= ennote(enlink(section.disp_note, htn)) %>
+**テーマ
+<% if themas.empty? -%>
+テーマは設定されていません
+<% else -%>
+<% themas.each do |thema| -%>
+<%= htn.to_link(thema.hateda_thema.name, thema.caption) -%>
+ <% end %>
+<% end -%>
+**ヒント
+<% if hint_words.empty? and hint_letters.empty? -%>
+ヒントは設定されていません
+<% else -%>
+<% hint_words.each do |hw| -%>
+<div>
+<%= htn.to_link(hw.word.hateda_word.name, hw.word.letter) -%>(<%= hw.word.disp_yomi -%>)
+</div>
+<div class="hint-word">
+<%= enlink(hw.word.disp_detail, htn) -%>
+</div>
+<% end %>
+<% hint_letters.each do |hl| -%>
+<div>
+<%= htn.to_link(hl.letter.hateda_letter.name, hl.letter.letter) -%>(<%= hl.letter.disp_yomi -%>)
+</div>
+<div class="hint-letter">
+<%= enlink(hl.letter.disp_detail, htn) -%>
+</div>
+<% end -%>
+<% end -%>
+**熟語(<%= word_count %>種/<%= word_sum %>回)
+<% sec_words.each do |sw| -%>
+<%= htn.to_link(sw.word.hateda_word.name, sw.word.letter) -%>
+ <% end %>
+**文字(<%= letter_count %>種/<%= letter_sum %>字)
+<% sec_letters.each do |sl| -%>
+<%= htn.to_link(sl.letter.hateda_letter.name, sl.letter.letter) -%>
+ <% end %>
+**ルビ無版下し文(コピペ用)
+<div class="deco" style="font-size:x-small;"><%= noruby(section.disp_japanese) -%></div>
diff --git a/lib/hateda_section_index.rhtml b/lib/hateda_section_index.rhtml
new file mode 100644 (file)
index 0000000..9bfb2ba
--- /dev/null
@@ -0,0 +1,3 @@
+<% sections.each do |section| -%>
+<%= htn.to_link(section.hateda_section.name, h(section.caption)) -%><%= enruby(section.desc) %>
+<% end -%>
diff --git a/lib/hateda_thema.rhtml b/lib/hateda_thema.rhtml
new file mode 100644 (file)
index 0000000..f192419
--- /dev/null
@@ -0,0 +1,7 @@
+**<%= thema.caption %>
+**解説
+<%= enlink(thema.disp_detail, htn) %>
+**関係する章
+<% sections.each do |section| -%>
+<%= htn.to_link(section.hateda_section.name, section.caption) -%>
+ <% end -%>
diff --git a/lib/hateda_thema_index.rhtml b/lib/hateda_thema_index.rhtml
new file mode 100644 (file)
index 0000000..66eabb3
--- /dev/null
@@ -0,0 +1,4 @@
+<% themas.each do |thema| -%>
+<%= htn.to_link(thema.hateda_thema.name, thema.caption) %>
+<% end -%>
+
diff --git a/lib/hateda_word.rhtml b/lib/hateda_word.rhtml
new file mode 100644 (file)
index 0000000..6c9db9d
--- /dev/null
@@ -0,0 +1,18 @@
+**熟語
+<div class="letter"><%= word.letter %></div>
+**読み
+<div class="yomi"><%= word.disp_yomi %></div>
+**解説
+<div class="content"><%= enlink(word.disp_detail, htn) %></div>
+**登場する章
+<div class="section-list">
+<%= section_count %>個の章に出現、総登場回数<%= section_sum %>回。
+<% sections.each do |section| -%>
+<%= htn.to_link(section.hateda_section.name, section.caption) -%>
+ <% end %></div>
+**もっと詳しく
+<div class="more">
+[http://www.google.co.jp/search?hl=ja&q=<%= CGI.escape(word.letter) -%>&lr=lang_ja:title=<%= word.letter -%>をGoogleで検索]
+[http://kotobank.jp/word/<%= CGI.escape(word.letter) -%>:title=<%= word.letter -%>をコトバンクで検索]
+[http://www.weblio.jp/content/<%= CGI.escape(word.letter) -%>:title=<%= word.letter -%>をweblioで検索]
+</div>
diff --git a/lib/hateda_word_index.rhtml b/lib/hateda_word_index.rhtml
new file mode 100644 (file)
index 0000000..8c8e1b1
--- /dev/null
@@ -0,0 +1,3 @@
+<% words.each do |word| -%>
+<%= htn.to_link(word.hateda_word.name, word.letter) %>(<%= word.disp_yomi %>)<%= word.desc %>/<%= word.count %>
+<% end -%>
diff --git a/lib/hatena.rb b/lib/hatena.rb
new file mode 100644 (file)
index 0000000..9f9125f
--- /dev/null
@@ -0,0 +1,116 @@
+# はてなダイアリに突っ込む。はてなIDとパスワードを同時に与える
+require 'time'
+require 'atomutil'
+
+module Atompub
+  class HatenaClient < Client
+    def publish_entry(uri)
+      @hatena_publish = true
+      update_resource(uri, ' ', Atom::MediaType::ENTRY.to_s)
+    ensure
+      @hatena_publish = false
+    end
+
+    private
+    def set_common_info(req)
+      req['X-Hatena-Publish'] = 1 if @hatena_publish
+      super(req)
+    end
+  end
+end
+
+class Hatena
+  DRAFT = nil #nil...product #1...test
+  COLLECTION = DRAFT ? 0 : 1
+  SUBDIR = DRAFT ? 'draft' : 'blog'
+  HATENA = 'http://d.hatena.ne.jp/'
+  def initialize(un, pass)
+    @un = un
+    @auth = Atompub::Auth::Wsse.new :username => un, :password => pass
+    @client = Atompub::HatenaClient.new :auth => @auth
+    @service = @client.get_service atom
+    @collection_uri = @service.workspace.collections[COLLECTION].href
+  end
+  
+  def hateda
+    HATENA + @un + '/'
+  end
+  
+  def atom
+    HATENA + @un + '/atom'
+  end
+  
+  def base
+    atom + "/#{SUBDIR}/"
+  end
+  
+  def entry(name)
+    @client.get_entry(base + name)
+  end
+  
+  def update(name, entry)
+    @client.update_entry(base + name, entry)
+  end
+  
+  def create(entry)
+    url = @client.create_entry(@collection_uri, entry)
+    url =~ /atom\/#{SUBDIR}\/(.*)/
+    return $1
+  end
+  
+  def section
+    sections = Section.find(:all, :order => 'num')
+    sections.each do |section|
+      entry = nil
+      if section.hatena.to_s.empty?
+      else
+        entry = @client.get_entry(CONF::HATENA_BASE + section.hatena)
+        if entry
+        else
+        end
+      end
+      if entry
+        a(section, entry)
+    #puts CONF::HATENA_BASE + section.hatena
+    #puts entry.content
+        @client.update_entry(CONF::HATENA_BASE + section.hatena, entry)
+      else
+        entry = Atom::Entry.new(
+          :updated => Time.parse('2010/1/1') + (section.num - 1).day
+        )
+        a(section, entry)
+        url = @client.create_entry(@collection_uri, entry)
+        url =~ /atom\/#{CONF::SUBDIR}\/(.*)/
+        section.hatena = $1
+        section.save!
+      end
+    end
+  end
+  
+  def destroy(name)
+p base + name
+    @client.delete_entry(base + name)
+  end
+  
+  def url_without_eid
+    res = if DRAFT
+      hateda + 'draft?epoch='
+    else
+      hateda
+    end
+    res
+  end
+  
+  def to_url(url)
+    url_without_eid + url.to_s
+  end
+  
+  def to_link(url, msg)
+    res = if url
+      "[#{to_url(url)}:title=#{msg}]"
+    else
+      msg
+    end
+    res
+  end
+end
diff --git a/public/.htaccess b/public/.htaccess
new file mode 100644 (file)
index 0000000..d3c9983
--- /dev/null
@@ -0,0 +1,40 @@
+# General Apache options
+AddHandler fastcgi-script .fcgi
+AddHandler cgi-script .cgi
+Options +FollowSymLinks +ExecCGI
+
+# If you don't want Rails to look in certain directories,
+# use the following rewrite rules so that Apache won't rewrite certain requests
+# 
+# Example:
+#   RewriteCond %{REQUEST_URI} ^/notrails.*
+#   RewriteRule .* - [L]
+
+# Redirect all requests not available on the filesystem to Rails
+# By default the cgi dispatcher is used which is very slow
+# 
+# For better performance replace the dispatcher with the fastcgi one
+#
+# Example:
+#   RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
+RewriteEngine On
+
+# If your Rails application is accessed via an Alias directive,
+# then you MUST also set the RewriteBase in this htaccess file.
+#
+# Example:
+#   Alias /myrailsapp /path/to/myrailsapp/public
+#   RewriteBase /myrailsapp
+
+RewriteRule ^$ index.html [QSA]
+RewriteRule ^([^.]+)$ $1.html [QSA]
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
+
+# In case Rails experiences terminal errors
+# Instead of displaying this message you can supply a file here which will be rendered instead
+# 
+# Example:
+#   ErrorDocument 500 /500.html
+
+ErrorDocument 500 "<h2>Application error</h2>Rails application failed to start properly"
\ No newline at end of file
diff --git a/public/404.html b/public/404.html
new file mode 100644 (file)
index 0000000..eff660b
--- /dev/null
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
+  <title>The page you were looking for doesn't exist (404)</title>
+       <style type="text/css">
+               body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
+               div.dialog {
+                       width: 25em;
+                       padding: 0 4em;
+                       margin: 4em auto 0 auto;
+                       border: 1px solid #ccc;
+                       border-right-color: #999;
+                       border-bottom-color: #999;
+               }
+               h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
+       </style>
+</head>
+
+<body>
+  <!-- This file lives in public/404.html -->
+  <div class="dialog">
+    <h1>The page you were looking for doesn't exist.</h1>
+    <p>You may have mistyped the address or the page may have moved.</p>
+  </div>
+</body>
+</html>
\ No newline at end of file
diff --git a/public/500.html b/public/500.html
new file mode 100644 (file)
index 0000000..f0aee0e
--- /dev/null
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
+  <title>We're sorry, but something went wrong</title>
+       <style type="text/css">
+               body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
+               div.dialog {
+                       width: 25em;
+                       padding: 0 4em;
+                       margin: 4em auto 0 auto;
+                       border: 1px solid #ccc;
+                       border-right-color: #999;
+                       border-bottom-color: #999;
+               }
+               h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
+       </style>
+</head>
+
+<body>
+  <!-- This file lives in public/500.html -->
+  <div class="dialog">
+    <h1>We're sorry, but something went wrong.</h1>
+    <p>We've been notified about this issue and we'll take a look at it shortly.</p>
+  </div>
+</body>
+</html>
\ No newline at end of file
diff --git a/public/dispatch.cgi b/public/dispatch.cgi
new file mode 100644 (file)
index 0000000..9486dc2
--- /dev/null
@@ -0,0 +1,10 @@
+#!C:/rails/ruby/bin/ruby
+
+require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
+
+# If you're using RubyGems and mod_ruby, this require should be changed to an absolute path one, like:
+# "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher" -- otherwise performance is severely impaired
+require "dispatcher"
+
+ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
+Dispatcher.dispatch
\ No newline at end of file
diff --git a/public/dispatch.fcgi b/public/dispatch.fcgi
new file mode 100644 (file)
index 0000000..44d432a
--- /dev/null
@@ -0,0 +1,24 @@
+#!C:/rails/ruby/bin/ruby
+#
+# You may specify the path to the FastCGI crash log (a log of unhandled
+# exceptions which forced the FastCGI instance to exit, great for debugging)
+# and the number of requests to process before running garbage collection.
+#
+# By default, the FastCGI crash log is RAILS_ROOT/log/fastcgi.crash.log
+# and the GC period is nil (turned off).  A reasonable number of requests
+# could range from 10-100 depending on the memory footprint of your app.
+#
+# Example:
+#   # Default log path, normal GC behavior.
+#   RailsFCGIHandler.process!
+#
+#   # Default log path, 50 requests between GC.
+#   RailsFCGIHandler.process! nil, 50
+#
+#   # Custom log path, normal GC behavior.
+#   RailsFCGIHandler.process! '/var/log/myapp_fcgi_crash.log'
+#
+require File.dirname(__FILE__) + "/../config/environment"
+require 'fcgi_handler'
+
+RailsFCGIHandler.process!
diff --git a/public/dispatch.rb b/public/dispatch.rb
new file mode 100644 (file)
index 0000000..9486dc2
--- /dev/null
@@ -0,0 +1,10 @@
+#!C:/rails/ruby/bin/ruby
+
+require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
+
+# If you're using RubyGems and mod_ruby, this require should be changed to an absolute path one, like:
+# "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher" -- otherwise performance is severely impaired
+require "dispatcher"
+
+ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
+Dispatcher.dispatch
\ No newline at end of file
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/public/images/rails.png b/public/images/rails.png
new file mode 100644 (file)
index 0000000..b8441f1
Binary files /dev/null and b/public/images/rails.png differ
diff --git a/public/javascripts/application.js b/public/javascripts/application.js
new file mode 100644 (file)
index 0000000..fe45776
--- /dev/null
@@ -0,0 +1,2 @@
+// Place your application-specific JavaScript functions and classes here
+// This file is automatically included by javascript_include_tag :defaults
diff --git a/public/javascripts/controls.js b/public/javascripts/controls.js
new file mode 100644 (file)
index 0000000..8c273f8
--- /dev/null
@@ -0,0 +1,833 @@
+// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005, 2006 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
+//           (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com)
+// Contributors:
+//  Richard Livsey
+//  Rahul Bhargava
+//  Rob Wills
+// 
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+// Autocompleter.Base handles all the autocompletion functionality 
+// that's independent of the data source for autocompletion. This
+// includes drawing the autocompletion menu, observing keyboard
+// and mouse events, and similar.
+//
+// Specific autocompleters need to provide, at the very least, 
+// a getUpdatedChoices function that will be invoked every time
+// the text inside the monitored textbox changes. This method 
+// should get the text for which to provide autocompletion by
+// invoking this.getToken(), NOT by directly accessing
+// this.element.value. This is to allow incremental tokenized
+// autocompletion. Specific auto-completion logic (AJAX, etc)
+// belongs in getUpdatedChoices.
+//
+// Tokenized incremental autocompletion is enabled automatically
+// when an autocompleter is instantiated with the 'tokens' option
+// in the options parameter, e.g.:
+// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
+// will incrementally autocomplete with a comma as the token.
+// Additionally, ',' in the above example can be replaced with
+// a token array, e.g. { tokens: [',', '\n'] } which
+// enables autocompletion on multiple tokens. This is most 
+// useful when one of the tokens is \n (a newline), as it 
+// allows smart autocompletion after linebreaks.
+
+if(typeof Effect == 'undefined')
+  throw("controls.js requires including script.aculo.us' effects.js library");
+
+var Autocompleter = {}
+Autocompleter.Base = function() {};
+Autocompleter.Base.prototype = {
+  baseInitialize: function(element, update, options) {
+    this.element     = $(element); 
+    this.update      = $(update);  
+    this.hasFocus    = false; 
+    this.changed     = false; 
+    this.active      = false; 
+    this.index       = 0;     
+    this.entryCount  = 0;
+
+    if(this.setOptions)
+      this.setOptions(options);
+    else
+      this.options = options || {};
+
+    this.options.paramName    = this.options.paramName || this.element.name;
+    this.options.tokens       = this.options.tokens || [];
+    this.options.frequency    = this.options.frequency || 0.4;
+    this.options.minChars     = this.options.minChars || 1;
+    this.options.onShow       = this.options.onShow || 
+      function(element, update){ 
+        if(!update.style.position || update.style.position=='absolute') {
+          update.style.position = 'absolute';
+          Position.clone(element, update, {
+            setHeight: false, 
+            offsetTop: element.offsetHeight
+          });
+        }
+        Effect.Appear(update,{duration:0.15});
+      };
+    this.options.onHide = this.options.onHide || 
+      function(element, update){ new Effect.Fade(update,{duration:0.15}) };
+
+    if(typeof(this.options.tokens) == 'string') 
+      this.options.tokens = new Array(this.options.tokens);
+
+    this.observer = null;
+    
+    this.element.setAttribute('autocomplete','off');
+
+    Element.hide(this.update);
+
+    Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));
+    Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));
+  },
+
+  show: function() {
+    if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
+    if(!this.iefix && 
+      (navigator.appVersion.indexOf('MSIE')>0) &&
+      (navigator.userAgent.indexOf('Opera')<0) &&
+      (Element.getStyle(this.update, 'position')=='absolute')) {
+      new Insertion.After(this.update, 
+       '<iframe id="' + this.update.id + '_iefix" '+
+       'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
+       'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
+      this.iefix = $(this.update.id+'_iefix');
+    }
+    if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
+  },
+  
+  fixIEOverlapping: function() {
+    Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
+    this.iefix.style.zIndex = 1;
+    this.update.style.zIndex = 2;
+    Element.show(this.iefix);
+  },
+
+  hide: function() {
+    this.stopIndicator();
+    if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
+    if(this.iefix) Element.hide(this.iefix);
+  },
+
+  startIndicator: function() {
+    if(this.options.indicator) Element.show(this.options.indicator);
+  },
+
+  stopIndicator: function() {
+    if(this.options.indicator) Element.hide(this.options.indicator);
+  },
+
+  onKeyPress: function(event) {
+    if(this.active)
+      switch(event.keyCode) {
+       case Event.KEY_TAB:
+       case Event.KEY_RETURN:
+         this.selectEntry();
+         Event.stop(event);
+       case Event.KEY_ESC:
+         this.hide();
+         this.active = false;
+         Event.stop(event);
+         return;
+       case Event.KEY_LEFT:
+       case Event.KEY_RIGHT:
+         return;
+       case Event.KEY_UP:
+         this.markPrevious();
+         this.render();
+         if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
+         return;
+       case Event.KEY_DOWN:
+         this.markNext();
+         this.render();
+         if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
+         return;
+      }
+     else 
+       if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || 
+         (navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return;
+
+    this.changed = true;
+    this.hasFocus = true;
+
+    if(this.observer) clearTimeout(this.observer);
+      this.observer = 
+        setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
+  },
+
+  activate: function() {
+    this.changed = false;
+    this.hasFocus = true;
+    this.getUpdatedChoices();
+  },
+
+  onHover: function(event) {
+    var element = Event.findElement(event, 'LI');
+    if(this.index != element.autocompleteIndex) 
+    {
+        this.index = element.autocompleteIndex;
+        this.render();
+    }
+    Event.stop(event);
+  },
+  
+  onClick: function(event) {
+    var element = Event.findElement(event, 'LI');
+    this.index = element.autocompleteIndex;
+    this.selectEntry();
+    this.hide();
+  },
+  
+  onBlur: function(event) {
+    // needed to make click events working
+    setTimeout(this.hide.bind(this), 250);
+    this.hasFocus = false;
+    this.active = false;     
+  }, 
+  
+  render: function() {
+    if(this.entryCount > 0) {
+      for (var i = 0; i < this.entryCount; i++)
+        this.index==i ? 
+          Element.addClassName(this.getEntry(i),"selected") : 
+          Element.removeClassName(this.getEntry(i),"selected");
+        
+      if(this.hasFocus) { 
+        this.show();
+        this.active = true;
+      }
+    } else {
+      this.active = false;
+      this.hide();
+    }
+  },
+  
+  markPrevious: function() {
+    if(this.index > 0) this.index--
+      else this.index = this.entryCount-1;
+    this.getEntry(this.index).scrollIntoView(true);
+  },
+  
+  markNext: function() {
+    if(this.index < this.entryCount-1) this.index++
+      else this.index = 0;
+    this.getEntry(this.index).scrollIntoView(false);
+  },
+  
+  getEntry: function(index) {
+    return this.update.firstChild.childNodes[index];
+  },
+  
+  getCurrentEntry: function() {
+    return this.getEntry(this.index);
+  },
+  
+  selectEntry: function() {
+    this.active = false;
+    this.updateElement(this.getCurrentEntry());
+  },
+
+  updateElement: function(selectedElement) {
+    if (this.options.updateElement) {
+      this.options.updateElement(selectedElement);
+      return;
+    }
+    var value = '';
+    if (this.options.select) {
+      var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];
+      if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
+    } else
+      value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
+    
+    var lastTokenPos = this.findLastToken();
+    if (lastTokenPos != -1) {
+      var newValue = this.element.value.substr(0, lastTokenPos + 1);
+      var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
+      if (whitespace)
+        newValue += whitespace[0];
+      this.element.value = newValue + value;
+    } else {
+      this.element.value = value;
+    }
+    this.element.focus();
+    
+    if (this.options.afterUpdateElement)
+      this.options.afterUpdateElement(this.element, selectedElement);
+  },
+
+  updateChoices: function(choices) {
+    if(!this.changed && this.hasFocus) {
+      this.update.innerHTML = choices;
+      Element.cleanWhitespace(this.update);
+      Element.cleanWhitespace(this.update.down());
+
+      if(this.update.firstChild && this.update.down().childNodes) {
+        this.entryCount = 
+          this.update.down().childNodes.length;
+        for (var i = 0; i < this.entryCount; i++) {
+          var entry = this.getEntry(i);
+          entry.autocompleteIndex = i;
+          this.addObservers(entry);
+        }
+      } else { 
+        this.entryCount = 0;
+      }
+
+      this.stopIndicator();
+      this.index = 0;
+      
+      if(this.entryCount==1 && this.options.autoSelect) {
+        this.selectEntry();
+        this.hide();
+      } else {
+        this.render();
+      }
+    }
+  },
+
+  addObservers: function(element) {
+    Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
+    Event.observe(element, "click", this.onClick.bindAsEventListener(this));
+  },
+
+  onObserverEvent: function() {
+    this.changed = false;   
+    if(this.getToken().length>=this.options.minChars) {
+      this.startIndicator();
+      this.getUpdatedChoices();
+    } else {
+      this.active = false;
+      this.hide();
+    }
+  },
+
+  getToken: function() {
+    var tokenPos = this.findLastToken();
+    if (tokenPos != -1)
+      var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,'');
+    else
+      var ret = this.element.value;
+
+    return /\n/.test(ret) ? '' : ret;
+  },
+
+  findLastToken: function() {
+    var lastTokenPos = -1;
+
+    for (var i=0; i<this.options.tokens.length; i++) {
+      var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]);
+      if (thisTokenPos > lastTokenPos)
+        lastTokenPos = thisTokenPos;
+    }
+    return lastTokenPos;
+  }
+}
+
+Ajax.Autocompleter = Class.create();
+Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
+  initialize: function(element, update, url, options) {
+    this.baseInitialize(element, update, options);
+    this.options.asynchronous  = true;
+    this.options.onComplete    = this.onComplete.bind(this);
+    this.options.defaultParams = this.options.parameters || null;
+    this.url                   = url;
+  },
+
+  getUpdatedChoices: function() {
+    entry = encodeURIComponent(this.options.paramName) + '=' + 
+      encodeURIComponent(this.getToken());
+
+    this.options.parameters = this.options.callback ?
+      this.options.callback(this.element, entry) : entry;
+
+    if(this.options.defaultParams) 
+      this.options.parameters += '&' + this.options.defaultParams;
+
+    new Ajax.Request(this.url, this.options);
+  },
+
+  onComplete: function(request) {
+    this.updateChoices(request.responseText);
+  }
+
+});
+
+// The local array autocompleter. Used when you'd prefer to
+// inject an array of autocompletion options into the page, rather
+// than sending out Ajax queries, which can be quite slow sometimes.
+//
+// The constructor takes four parameters. The first two are, as usual,
+// the id of the monitored textbox, and id of the autocompletion menu.
+// The third is the array you want to autocomplete from, and the fourth
+// is the options block.
+//
+// Extra local autocompletion options:
+// - choices - How many autocompletion choices to offer
+//
+// - partialSearch - If false, the autocompleter will match entered
+//                    text only at the beginning of strings in the 
+//                    autocomplete array. Defaults to true, which will
+//                    match text at the beginning of any *word* in the
+//                    strings in the autocomplete array. If you want to
+//                    search anywhere in the string, additionally set
+//                    the option fullSearch to true (default: off).
+//
+// - fullSsearch - Search anywhere in autocomplete array strings.
+//
+// - partialChars - How many characters to enter before triggering
+//                   a partial match (unlike minChars, which defines
+//                   how many characters are required to do any match
+//                   at all). Defaults to 2.
+//
+// - ignoreCase - Whether to ignore case when autocompleting.
+//                 Defaults to true.
+//
+// It's possible to pass in a custom function as the 'selector' 
+// option, if you prefer to write your own autocompletion logic.
+// In that case, the other options above will not apply unless
+// you support them.
+
+Autocompleter.Local = Class.create();
+Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {
+  initialize: function(element, update, array, options) {
+    this.baseInitialize(element, update, options);
+    this.options.array = array;
+  },
+
+  getUpdatedChoices: function() {
+    this.updateChoices(this.options.selector(this));
+  },
+
+  setOptions: function(options) {
+    this.options = Object.extend({
+      choices: 10,
+      partialSearch: true,
+      partialChars: 2,
+      ignoreCase: true,
+      fullSearch: false,
+      selector: function(instance) {
+        var ret       = []; // Beginning matches
+        var partial   = []; // Inside matches
+        var entry     = instance.getToken();
+        var count     = 0;
+
+        for (var i = 0; i < instance.options.array.length &&  
+          ret.length < instance.options.choices ; i++) { 
+
+          var elem = instance.options.array[i];
+          var foundPos = instance.options.ignoreCase ? 
+            elem.toLowerCase().indexOf(entry.toLowerCase()) : 
+            elem.indexOf(entry);
+
+          while (foundPos != -1) {
+            if (foundPos == 0 && elem.length != entry.length) { 
+              ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" + 
+                elem.substr(entry.length) + "</li>");
+              break;
+            } else if (entry.length >= instance.options.partialChars && 
+              instance.options.partialSearch && foundPos != -1) {
+              if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
+                partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
+                  elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
+                  foundPos + entry.length) + "</li>");
+                break;
+              }
+            }
+
+            foundPos = instance.options.ignoreCase ? 
+              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : 
+              elem.indexOf(entry, foundPos + 1);
+
+          }
+        }
+        if (partial.length)
+          ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
+        return "<ul>" + ret.join('') + "</ul>";
+      }
+    }, options || {});
+  }
+});
+
+// AJAX in-place editor
+//
+// see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor
+
+// Use this if you notice weird scrolling problems on some browsers,
+// the DOM might be a bit confused when this gets called so do this
+// waits 1 ms (with setTimeout) until it does the activation
+Field.scrollFreeActivate = function(field) {
+  setTimeout(function() {
+    Field.activate(field);
+  }, 1);
+}
+
+Ajax.InPlaceEditor = Class.create();
+Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";
+Ajax.InPlaceEditor.prototype = {
+  initialize: function(element, url, options) {
+    this.url = url;
+    this.element = $(element);
+
+    this.options = Object.extend({
+      paramName: "value",
+      okButton: true,
+      okText: "ok",
+      cancelLink: true,
+      cancelText: "cancel",
+      savingText: "Saving...",
+      clickToEditText: "Click to edit",
+      okText: "ok",
+      rows: 1,
+      onComplete: function(transport, element) {
+        new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
+      },
+      onFailure: function(transport) {
+        alert("Error communicating with the server: " + transport.responseText.stripTags());
+      },
+      callback: function(form) {
+        return Form.serialize(form);
+      },
+      handleLineBreaks: true,
+      loadingText: 'Loading...',
+      savingClassName: 'inplaceeditor-saving',
+      loadingClassName: 'inplaceeditor-loading',
+      formClassName: 'inplaceeditor-form',
+      highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
+      highlightendcolor: "#FFFFFF",
+      externalControl: null,
+      submitOnBlur: false,
+      ajaxOptions: {},
+      evalScripts: false
+    }, options || {});
+
+    if(!this.options.formId && this.element.id) {
+      this.options.formId = this.element.id + "-inplaceeditor";
+      if ($(this.options.formId)) {
+        // there's already a form with that name, don't specify an id
+        this.options.formId = null;
+      }
+    }
+    
+    if (this.options.externalControl) {
+      this.options.externalControl = $(this.options.externalControl);
+    }
+    
+    this.originalBackground = Element.getStyle(this.element, 'background-color');
+    if (!this.originalBackground) {
+      this.originalBackground = "transparent";
+    }
+    
+    this.element.title = this.options.clickToEditText;
+    
+    this.onclickListener = this.enterEditMode.bindAsEventListener(this);
+    this.mouseoverListener = this.enterHover.bindAsEventListener(this);
+    this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
+    Event.observe(this.element, 'click', this.onclickListener);
+    Event.observe(this.element, 'mouseover', this.mouseoverListener);
+    Event.observe(this.element, 'mouseout', this.mouseoutListener);
+    if (this.options.externalControl) {
+      Event.observe(this.options.externalControl, 'click', this.onclickListener);
+      Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
+      Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
+    }
+  },
+  enterEditMode: function(evt) {
+    if (this.saving) return;
+    if (this.editing) return;
+    this.editing = true;
+    this.onEnterEditMode();
+    if (this.options.externalControl) {
+      Element.hide(this.options.externalControl);
+    }
+    Element.hide(this.element);
+    this.createForm();
+    this.element.parentNode.insertBefore(this.form, this.element);
+    if (!this.options.loadTextURL) Field.scrollFreeActivate(this.editField);
+    // stop the event to avoid a page refresh in Safari
+    if (evt) {
+      Event.stop(evt);
+    }
+    return false;
+  },
+  createForm: function() {
+    this.form = document.createElement("form");
+    this.form.id = this.options.formId;
+    Element.addClassName(this.form, this.options.formClassName)
+    this.form.onsubmit = this.onSubmit.bind(this);
+
+    this.createEditField();
+
+    if (this.options.textarea) {
+      var br = document.createElement("br");
+      this.form.appendChild(br);
+    }
+
+    if (this.options.okButton) {
+      okButton = document.createElement("input");
+      okButton.type = "submit";
+      okButton.value = this.options.okText;
+      okButton.className = 'editor_ok_button';
+      this.form.appendChild(okButton);
+    }
+
+    if (this.options.cancelLink) {
+      cancelLink = document.createElement("a");
+      cancelLink.href = "#";
+      cancelLink.appendChild(document.createTextNode(this.options.cancelText));
+      cancelLink.onclick = this.onclickCancel.bind(this);
+      cancelLink.className = 'editor_cancel';      
+      this.form.appendChild(cancelLink);
+    }
+  },
+  hasHTMLLineBreaks: function(string) {
+    if (!this.options.handleLineBreaks) return false;
+    return string.match(/<br/i) || string.match(/<p>/i);
+  },
+  convertHTMLLineBreaks: function(string) {
+    return string.replace(/<br>/gi, "\n").replace(/<br\/>/gi, "\n").replace(/<\/p>/gi, "\n").replace(/<p>/gi, "");
+  },
+  createEditField: function() {
+    var text;
+    if(this.options.loadTextURL) {
+      text = this.options.loadingText;
+    } else {
+      text = this.getText();
+    }
+
+    var obj = this;
+    
+    if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) {
+      this.options.textarea = false;
+      var textField = document.createElement("input");
+      textField.obj = this;
+      textField.type = "text";
+      textField.name = this.options.paramName;
+      textField.value = text;
+      textField.style.backgroundColor = this.options.highlightcolor;
+      textField.className = 'editor_field';
+      var size = this.options.size || this.options.cols || 0;
+      if (size != 0) textField.size = size;
+      if (this.options.submitOnBlur)
+        textField.onblur = this.onSubmit.bind(this);
+      this.editField = textField;
+    } else {
+      this.options.textarea = true;
+      var textArea = document.createElement("textarea");
+      textArea.obj = this;
+      textArea.name = this.options.paramName;
+      textArea.value = this.convertHTMLLineBreaks(text);
+      textArea.rows = this.options.rows;
+      textArea.cols = this.options.cols || 40;
+      textArea.className = 'editor_field';      
+      if (this.options.submitOnBlur)
+        textArea.onblur = this.onSubmit.bind(this);
+      this.editField = textArea;
+    }
+    
+    if(this.options.loadTextURL) {
+      this.loadExternalText();
+    }
+    this.form.appendChild(this.editField);
+  },
+  getText: function() {
+    return this.element.innerHTML;
+  },
+  loadExternalText: function() {
+    Element.addClassName(this.form, this.options.loadingClassName);
+    this.editField.disabled = true;
+    new Ajax.Request(
+      this.options.loadTextURL,
+      Object.extend({
+        asynchronous: true,
+        onComplete: this.onLoadedExternalText.bind(this)
+      }, this.options.ajaxOptions)
+    );
+  },
+  onLoadedExternalText: function(transport) {
+    Element.removeClassName(this.form, this.options.loadingClassName);
+    this.editField.disabled = false;
+    this.editField.value = transport.responseText.stripTags();
+    Field.scrollFreeActivate(this.editField);
+  },
+  onclickCancel: function() {
+    this.onComplete();
+    this.leaveEditMode();
+    return false;
+  },
+  onFailure: function(transport) {
+    this.options.onFailure(transport);
+    if (this.oldInnerHTML) {
+      this.element.innerHTML = this.oldInnerHTML;
+      this.oldInnerHTML = null;
+    }
+    return false;
+  },
+  onSubmit: function() {
+    // onLoading resets these so we need to save them away for the Ajax call
+    var form = this.form;
+    var value = this.editField.value;
+    
+    // do this first, sometimes the ajax call returns before we get a chance to switch on Saving...
+    // which means this will actually switch on Saving... *after* we've left edit mode causing Saving...
+    // to be displayed indefinitely
+    this.onLoading();
+    
+    if (this.options.evalScripts) {
+      new Ajax.Request(
+        this.url, Object.extend({
+          parameters: this.options.callback(form, value),
+          onComplete: this.onComplete.bind(this),
+          onFailure: this.onFailure.bind(this),
+          asynchronous:true, 
+          evalScripts:true
+        }, this.options.ajaxOptions));
+    } else  {
+      new Ajax.Updater(
+        { success: this.element,
+          // don't update on failure (this could be an option)
+          failure: null }, 
+        this.url, Object.extend({
+          parameters: this.options.callback(form, value),
+          onComplete: this.onComplete.bind(this),
+          onFailure: this.onFailure.bind(this)
+        }, this.options.ajaxOptions));
+    }
+    // stop the event to avoid a page refresh in Safari
+    if (arguments.length > 1) {
+      Event.stop(arguments[0]);
+    }
+    return false;
+  },
+  onLoading: function() {
+    this.saving = true;
+    this.removeForm();
+    this.leaveHover();
+    this.showSaving();
+  },
+  showSaving: function() {
+    this.oldInnerHTML = this.element.innerHTML;
+    this.element.innerHTML = this.options.savingText;
+    Element.addClassName(this.element, this.options.savingClassName);
+    this.element.style.backgroundColor = this.originalBackground;
+    Element.show(this.element);
+  },
+  removeForm: function() {
+    if(this.form) {
+      if (this.form.parentNode) Element.remove(this.form);
+      this.form = null;
+    }
+  },
+  enterHover: function() {
+    if (this.saving) return;
+    this.element.style.backgroundColor = this.options.highlightcolor;
+    if (this.effect) {
+      this.effect.cancel();
+    }
+    Element.addClassName(this.element, this.options.hoverClassName)
+  },
+  leaveHover: function() {
+    if (this.options.backgroundColor) {
+      this.element.style.backgroundColor = this.oldBackground;
+    }
+    Element.removeClassName(this.element, this.options.hoverClassName)
+    if (this.saving) return;
+    this.effect = new Effect.Highlight(this.element, {
+      startcolor: this.options.highlightcolor,
+      endcolor: this.options.highlightendcolor,
+      restorecolor: this.originalBackground
+    });
+  },
+  leaveEditMode: function() {
+    Element.removeClassName(this.element, this.options.savingClassName);
+    this.removeForm();
+    this.leaveHover();
+    this.element.style.backgroundColor = this.originalBackground;
+    Element.show(this.element);
+    if (this.options.externalControl) {
+      Element.show(this.options.externalControl);
+    }
+    this.editing = false;
+    this.saving = false;
+    this.oldInnerHTML = null;
+    this.onLeaveEditMode();
+  },
+  onComplete: function(transport) {
+    this.leaveEditMode();
+    this.options.onComplete.bind(this)(transport, this.element);
+  },
+  onEnterEditMode: function() {},
+  onLeaveEditMode: function() {},
+  dispose: function() {
+    if (this.oldInnerHTML) {
+      this.element.innerHTML = this.oldInnerHTML;
+    }
+    this.leaveEditMode();
+    Event.stopObserving(this.element, 'click', this.onclickListener);
+    Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);
+    Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);
+    if (this.options.externalControl) {
+      Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);
+      Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);
+      Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);
+    }
+  }
+};
+
+Ajax.InPlaceCollectionEditor = Class.create();
+Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);
+Object.extend(Ajax.InPlaceCollectionEditor.prototype, {
+  createEditField: function() {
+    if (!this.cached_selectTag) {
+      var selectTag = document.createElement("select");
+      var collection = this.options.collection || [];
+      var optionTag;
+      collection.each(function(e,i) {
+        optionTag = document.createElement("option");
+        optionTag.value = (e instanceof Array) ? e[0] : e;
+        if((typeof this.options.value == 'undefined') && 
+          ((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true;
+        if(this.options.value==optionTag.value) optionTag.selected = true;
+        optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
+        selectTag.appendChild(optionTag);
+      }.bind(this));
+      this.cached_selectTag = selectTag;
+    }
+
+    this.editField = this.cached_selectTag;
+    if(this.options.loadTextURL) this.loadExternalText();
+    this.form.appendChild(this.editField);
+    this.options.callback = function(form, value) {
+      return "value=" + encodeURIComponent(value);
+    }
+  }
+});
+
+// Delayed observer, like Form.Element.Observer, 
+// but waits for delay after last key input
+// Ideal for live-search fields
+
+Form.Element.DelayedObserver = Class.create();
+Form.Element.DelayedObserver.prototype = {
+  initialize: function(element, delay, callback) {
+    this.delay     = delay || 0.5;
+    this.element   = $(element);
+    this.callback  = callback;
+    this.timer     = null;
+    this.lastValue = $F(this.element); 
+    Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
+  },
+  delayedListener: function(event) {
+    if(this.lastValue == $F(this.element)) return;
+    if(this.timer) clearTimeout(this.timer);
+    this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
+    this.lastValue = $F(this.element);
+  },
+  onTimerEvent: function() {
+    this.timer = null;
+    this.callback(this.element, $F(this.element));
+  }
+};
diff --git a/public/javascripts/dragdrop.js b/public/javascripts/dragdrop.js
new file mode 100644 (file)
index 0000000..c71ddb8
--- /dev/null
@@ -0,0 +1,942 @@
+// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005, 2006 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
+// 
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+if(typeof Effect == 'undefined')
+  throw("dragdrop.js requires including script.aculo.us' effects.js library");
+
+var Droppables = {
+  drops: [],
+
+  remove: function(element) {
+    this.drops = this.drops.reject(function(d) { return d.element==$(element) });
+  },
+
+  add: function(element) {
+    element = $(element);
+    var options = Object.extend({
+      greedy:     true,
+      hoverclass: null,
+      tree:       false
+    }, arguments[1] || {});
+
+    // cache containers
+    if(options.containment) {
+      options._containers = [];
+      var containment = options.containment;
+      if((typeof containment == 'object') && 
+        (containment.constructor == Array)) {
+        containment.each( function(c) { options._containers.push($(c)) });
+      } else {
+        options._containers.push($(containment));
+      }
+    }
+    
+    if(options.accept) options.accept = [options.accept].flatten();
+
+    Element.makePositioned(element); // fix IE
+    options.element = element;
+
+    this.drops.push(options);
+  },
+  
+  findDeepestChild: function(drops) {
+    deepest = drops[0];
+      
+    for (i = 1; i < drops.length; ++i)
+      if (Element.isParent(drops[i].element, deepest.element))
+        deepest = drops[i];
+    
+    return deepest;
+  },
+
+  isContained: function(element, drop) {
+    var containmentNode;
+    if(drop.tree) {
+      containmentNode = element.treeNode; 
+    } else {
+      containmentNode = element.parentNode;
+    }
+    return drop._containers.detect(function(c) { return containmentNode == c });
+  },
+  
+  isAffected: function(point, element, drop) {
+    return (
+      (drop.element!=element) &&
+      ((!drop._containers) ||
+        this.isContained(element, drop)) &&
+      ((!drop.accept) ||
+        (Element.classNames(element).detect( 
+          function(v) { return drop.accept.include(v) } ) )) &&
+      Position.within(drop.element, point[0], point[1]) );
+  },
+
+  deactivate: function(drop) {
+    if(drop.hoverclass)
+      Element.removeClassName(drop.element, drop.hoverclass);
+    this.last_active = null;
+  },
+
+  activate: function(drop) {
+    if(drop.hoverclass)
+      Element.addClassName(drop.element, drop.hoverclass);
+    this.last_active = drop;
+  },
+
+  show: function(point, element) {
+    if(!this.drops.length) return;
+    var affected = [];
+    
+    if(this.last_active) this.deactivate(this.last_active);
+    this.drops.each( function(drop) {
+      if(Droppables.isAffected(point, element, drop))
+        affected.push(drop);
+    });
+        
+    if(affected.length>0) {
+      drop = Droppables.findDeepestChild(affected);
+      Position.within(drop.element, point[0], point[1]);
+      if(drop.onHover)
+        drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
+      
+      Droppables.activate(drop);
+    }
+  },
+
+  fire: function(event, element) {
+    if(!this.last_active) return;
+    Position.prepare();
+
+    if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
+      if (this.last_active.onDrop) 
+        this.last_active.onDrop(element, this.last_active.element, event);
+  },
+
+  reset: function() {
+    if(this.last_active)
+      this.deactivate(this.last_active);
+  }
+}
+
+var Draggables = {
+  drags: [],
+  observers: [],
+  
+  register: function(draggable) {
+    if(this.drags.length == 0) {
+      this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
+      this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
+      this.eventKeypress  = this.keyPress.bindAsEventListener(this);
+      
+      Event.observe(document, "mouseup", this.eventMouseUp);
+      Event.observe(document, "mousemove", this.eventMouseMove);
+      Event.observe(document, "keypress", this.eventKeypress);
+    }
+    this.drags.push(draggable);
+  },
+  
+  unregister: function(draggable) {
+    this.drags = this.drags.reject(function(d) { return d==draggable });
+    if(this.drags.length == 0) {
+      Event.stopObserving(document, "mouseup", this.eventMouseUp);
+      Event.stopObserving(document, "mousemove", this.eventMouseMove);
+      Event.stopObserving(document, "keypress", this.eventKeypress);
+    }
+  },
+  
+  activate: function(draggable) {
+    if(draggable.options.delay) { 
+      this._timeout = setTimeout(function() { 
+        Draggables._timeout = null; 
+        window.focus(); 
+        Draggables.activeDraggable = draggable; 
+      }.bind(this), draggable.options.delay); 
+    } else {
+      window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
+      this.activeDraggable = draggable;
+    }
+  },
+  
+  deactivate: function() {
+    this.activeDraggable = null;
+  },
+  
+  updateDrag: function(event) {
+    if(!this.activeDraggable) return;
+    var pointer = [Event.pointerX(event), Event.pointerY(event)];
+    // Mozilla-based browsers fire successive mousemove events with
+    // the same coordinates, prevent needless redrawing (moz bug?)
+    if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
+    this._lastPointer = pointer;
+    
+    this.activeDraggable.updateDrag(event, pointer);
+  },
+  
+  endDrag: function(event) {
+    if(this._timeout) { 
+      clearTimeout(this._timeout); 
+      this._timeout = null; 
+    }
+    if(!this.activeDraggable) return;
+    this._lastPointer = null;
+    this.activeDraggable.endDrag(event);
+    this.activeDraggable = null;
+  },
+  
+  keyPress: function(event) {
+    if(this.activeDraggable)
+      this.activeDraggable.keyPress(event);
+  },
+  
+  addObserver: function(observer) {
+    this.observers.push(observer);
+    this._cacheObserverCallbacks();
+  },
+  
+  removeObserver: function(element) {  // element instead of observer fixes mem leaks
+    this.observers = this.observers.reject( function(o) { return o.element==element });
+    this._cacheObserverCallbacks();
+  },
+  
+  notify: function(eventName, draggable, event) {  // 'onStart', 'onEnd', 'onDrag'
+    if(this[eventName+'Count'] > 0)
+      this.observers.each( function(o) {
+        if(o[eventName]) o[eventName](eventName, draggable, event);
+      });
+    if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
+  },
+  
+  _cacheObserverCallbacks: function() {
+    ['onStart','onEnd','onDrag'].each( function(eventName) {
+      Draggables[eventName+'Count'] = Draggables.observers.select(
+        function(o) { return o[eventName]; }
+      ).length;
+    });
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var Draggable = Class.create();
+Draggable._dragging    = {};
+
+Draggable.prototype = {
+  initialize: function(element) {
+    var defaults = {
+      handle: false,
+      reverteffect: function(element, top_offset, left_offset) {
+        var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
+        new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
+          queue: {scope:'_draggable', position:'end'}
+        });
+      },
+      endeffect: function(element) {
+        var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0;
+        new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, 
+          queue: {scope:'_draggable', position:'end'},
+          afterFinish: function(){ 
+            Draggable._dragging[element] = false 
+          }
+        }); 
+      },
+      zindex: 1000,
+      revert: false,
+      scroll: false,
+      scrollSensitivity: 20,
+      scrollSpeed: 15,
+      snap: false,  // false, or xy or [x,y] or function(x,y){ return [x,y] }
+      delay: 0
+    };
+    
+    if(!arguments[1] || typeof arguments[1].endeffect == 'undefined')
+      Object.extend(defaults, {
+        starteffect: function(element) {
+          element._opacity = Element.getOpacity(element);
+          Draggable._dragging[element] = true;
+          new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); 
+        }
+      });
+    
+    var options = Object.extend(defaults, arguments[1] || {});
+
+    this.element = $(element);
+    
+    if(options.handle && (typeof options.handle == 'string'))
+      this.handle = this.element.down('.'+options.handle, 0);
+    
+    if(!this.handle) this.handle = $(options.handle);
+    if(!this.handle) this.handle = this.element;
+    
+    if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
+      options.scroll = $(options.scroll);
+      this._isScrollChild = Element.childOf(this.element, options.scroll);
+    }
+
+    Element.makePositioned(this.element); // fix IE    
+
+    this.delta    = this.currentDelta();
+    this.options  = options;
+    this.dragging = false;   
+
+    this.eventMouseDown = this.initDrag.bindAsEventListener(this);
+    Event.observe(this.handle, "mousedown", this.eventMouseDown);
+    
+    Draggables.register(this);
+  },
+  
+  destroy: function() {
+    Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
+    Draggables.unregister(this);
+  },
+  
+  currentDelta: function() {
+    return([
+      parseInt(Element.getStyle(this.element,'left') || '0'),
+      parseInt(Element.getStyle(this.element,'top') || '0')]);
+  },
+  
+  initDrag: function(event) {
+    if(typeof Draggable._dragging[this.element] != 'undefined' &&
+      Draggable._dragging[this.element]) return;
+    if(Event.isLeftClick(event)) {    
+      // abort on form elements, fixes a Firefox issue
+      var src = Event.element(event);
+      if(src.tagName && (
+        src.tagName=='INPUT' ||
+        src.tagName=='SELECT' ||
+        src.tagName=='OPTION' ||
+        src.tagName=='BUTTON' ||
+        src.tagName=='TEXTAREA')) return;
+        
+      var pointer = [Event.pointerX(event), Event.pointerY(event)];
+      var pos     = Position.cumulativeOffset(this.element);
+      this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
+      
+      Draggables.activate(this);
+      Event.stop(event);
+    }
+  },
+  
+  startDrag: function(event) {
+    this.dragging = true;
+    
+    if(this.options.zindex) {
+      this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
+      this.element.style.zIndex = this.options.zindex;
+    }
+    
+    if(this.options.ghosting) {
+      this._clone = this.element.cloneNode(true);
+      Position.absolutize(this.element);
+      this.element.parentNode.insertBefore(this._clone, this.element);
+    }
+    
+    if(this.options.scroll) {
+      if (this.options.scroll == window) {
+        var where = this._getWindowScroll(this.options.scroll);
+        this.originalScrollLeft = where.left;
+        this.originalScrollTop = where.top;
+      } else {
+        this.originalScrollLeft = this.options.scroll.scrollLeft;
+        this.originalScrollTop = this.options.scroll.scrollTop;
+      }
+    }
+    
+    Draggables.notify('onStart', this, event);
+        
+    if(this.options.starteffect) this.options.starteffect(this.element);
+  },
+  
+  updateDrag: function(event, pointer) {
+    if(!this.dragging) this.startDrag(event);
+    Position.prepare();
+    Droppables.show(pointer, this.element);
+    Draggables.notify('onDrag', this, event);
+    
+    this.draw(pointer);
+    if(this.options.change) this.options.change(this);
+    
+    if(this.options.scroll) {
+      this.stopScrolling();
+      
+      var p;
+      if (this.options.scroll == window) {
+        with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
+      } else {
+        p = Position.page(this.options.scroll);
+        p[0] += this.options.scroll.scrollLeft + Position.deltaX;
+        p[1] += this.options.scroll.scrollTop + Position.deltaY;
+        p.push(p[0]+this.options.scroll.offsetWidth);
+        p.push(p[1]+this.options.scroll.offsetHeight);
+      }
+      var speed = [0,0];
+      if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
+      if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
+      if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
+      if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
+      this.startScrolling(speed);
+    }
+    
+    // fix AppleWebKit rendering
+    if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+    
+    Event.stop(event);
+  },
+  
+  finishDrag: function(event, success) {
+    this.dragging = false;
+
+    if(this.options.ghosting) {
+      Position.relativize(this.element);
+      Element.remove(this._clone);
+      this._clone = null;
+    }
+
+    if(success) Droppables.fire(event, this.element);
+    Draggables.notify('onEnd', this, event);
+
+    var revert = this.options.revert;
+    if(revert && typeof revert == 'function') revert = revert(this.element);
+    
+    var d = this.currentDelta();
+    if(revert && this.options.reverteffect) {
+      this.options.reverteffect(this.element, 
+        d[1]-this.delta[1], d[0]-this.delta[0]);
+    } else {
+      this.delta = d;
+    }
+
+    if(this.options.zindex)
+      this.element.style.zIndex = this.originalZ;
+
+    if(this.options.endeffect) 
+      this.options.endeffect(this.element);
+      
+    Draggables.deactivate(this);
+    Droppables.reset();
+  },
+  
+  keyPress: function(event) {
+    if(event.keyCode!=Event.KEY_ESC) return;
+    this.finishDrag(event, false);
+    Event.stop(event);
+  },
+  
+  endDrag: function(event) {
+    if(!this.dragging) return;
+    this.stopScrolling();
+    this.finishDrag(event, true);
+    Event.stop(event);
+  },
+  
+  draw: function(point) {
+    var pos = Position.cumulativeOffset(this.element);
+    if(this.options.ghosting) {
+      var r   = Position.realOffset(this.element);
+      pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
+    }
+    
+    var d = this.currentDelta();
+    pos[0] -= d[0]; pos[1] -= d[1];
+    
+    if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
+      pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
+      pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
+    }
+    
+    var p = [0,1].map(function(i){ 
+      return (point[i]-pos[i]-this.offset[i]) 
+    }.bind(this));
+    
+    if(this.options.snap) {
+      if(typeof this.options.snap == 'function') {
+        p = this.options.snap(p[0],p[1],this);
+      } else {
+      if(this.options.snap instanceof Array) {
+        p = p.map( function(v, i) {
+          return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this))
+      } else {
+        p = p.map( function(v) {
+          return Math.round(v/this.options.snap)*this.options.snap }.bind(this))
+      }
+    }}
+    
+    var style = this.element.style;
+    if((!this.options.constraint) || (this.options.constraint=='horizontal'))
+      style.left = p[0] + "px";
+    if((!this.options.constraint) || (this.options.constraint=='vertical'))
+      style.top  = p[1] + "px";
+    
+    if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
+  },
+  
+  stopScrolling: function() {
+    if(this.scrollInterval) {
+      clearInterval(this.scrollInterval);
+      this.scrollInterval = null;
+      Draggables._lastScrollPointer = null;
+    }
+  },
+  
+  startScrolling: function(speed) {
+    if(!(speed[0] || speed[1])) return;
+    this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
+    this.lastScrolled = new Date();
+    this.scrollInterval = setInterval(this.scroll.bind(this), 10);
+  },
+  
+  scroll: function() {
+    var current = new Date();
+    var delta = current - this.lastScrolled;
+    this.lastScrolled = current;
+    if(this.options.scroll == window) {
+      with (this._getWindowScroll(this.options.scroll)) {
+        if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
+          var d = delta / 1000;
+          this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
+        }
+      }
+    } else {
+      this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
+      this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000;
+    }
+    
+    Position.prepare();
+    Droppables.show(Draggables._lastPointer, this.element);
+    Draggables.notify('onDrag', this);
+    if (this._isScrollChild) {
+      Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
+      Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
+      Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
+      if (Draggables._lastScrollPointer[0] < 0)
+        Draggables._lastScrollPointer[0] = 0;
+      if (Draggables._lastScrollPointer[1] < 0)
+        Draggables._lastScrollPointer[1] = 0;
+      this.draw(Draggables._lastScrollPointer);
+    }
+    
+    if(this.options.change) this.options.change(this);
+  },
+  
+  _getWindowScroll: function(w) {
+    var T, L, W, H;
+    with (w.document) {
+      if (w.document.documentElement && documentElement.scrollTop) {
+        T = documentElement.scrollTop;
+        L = documentElement.scrollLeft;
+      } else if (w.document.body) {
+        T = body.scrollTop;
+        L = body.scrollLeft;
+      }
+      if (w.innerWidth) {
+        W = w.innerWidth;
+        H = w.innerHeight;
+      } else if (w.document.documentElement && documentElement.clientWidth) {
+        W = documentElement.clientWidth;
+        H = documentElement.clientHeight;
+      } else {
+        W = body.offsetWidth;
+        H = body.offsetHeight
+      }
+    }
+    return { top: T, left: L, width: W, height: H };
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var SortableObserver = Class.create();
+SortableObserver.prototype = {
+  initialize: function(element, observer) {
+    this.element   = $(element);
+    this.observer  = observer;
+    this.lastValue = Sortable.serialize(this.element);
+  },
+  
+  onStart: function() {
+    this.lastValue = Sortable.serialize(this.element);
+  },
+  
+  onEnd: function() {
+    Sortable.unmark();
+    if(this.lastValue != Sortable.serialize(this.element))
+      this.observer(this.element)
+  }
+}
+
+var Sortable = {
+  SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
+  
+  sortables: {},
+  
+  _findRootElement: function(element) {
+    while (element.tagName != "BODY") {  
+      if(element.id && Sortable.sortables[element.id]) return element;
+      element = element.parentNode;
+    }
+  },
+
+  options: function(element) {
+    element = Sortable._findRootElement($(element));
+    if(!element) return;
+    return Sortable.sortables[element.id];
+  },
+  
+  destroy: function(element){
+    var s = Sortable.options(element);
+    
+    if(s) {
+      Draggables.removeObserver(s.element);
+      s.droppables.each(function(d){ Droppables.remove(d) });
+      s.draggables.invoke('destroy');
+      
+      delete Sortable.sortables[s.element.id];
+    }
+  },
+
+  create: function(element) {
+    element = $(element);
+    var options = Object.extend({ 
+      element:     element,
+      tag:         'li',       // assumes li children, override with tag: 'tagname'
+      dropOnEmpty: false,
+      tree:        false,
+      treeTag:     'ul',
+      overlap:     'vertical', // one of 'vertical', 'horizontal'
+      constraint:  'vertical', // one of 'vertical', 'horizontal', false
+      containment: element,    // also takes array of elements (or id's); or false
+      handle:      false,      // or a CSS class
+      only:        false,
+      delay:       0,
+      hoverclass:  null,
+      ghosting:    false,
+      scroll:      false,
+      scrollSensitivity: 20,
+      scrollSpeed: 15,
+      format:      this.SERIALIZE_RULE,
+      onChange:    Prototype.emptyFunction,
+      onUpdate:    Prototype.emptyFunction
+    }, arguments[1] || {});
+
+    // clear any old sortable with same element
+    this.destroy(element);
+
+    // build options for the draggables
+    var options_for_draggable = {
+      revert:      true,
+      scroll:      options.scroll,
+      scrollSpeed: options.scrollSpeed,
+      scrollSensitivity: options.scrollSensitivity,
+      delay:       options.delay,
+      ghosting:    options.ghosting,
+      constraint:  options.constraint,
+      handle:      options.handle };
+
+    if(options.starteffect)
+      options_for_draggable.starteffect = options.starteffect;
+
+    if(options.reverteffect)
+      options_for_draggable.reverteffect = options.reverteffect;
+    else
+      if(options.ghosting) options_for_draggable.reverteffect = function(element) {
+        element.style.top  = 0;
+        element.style.left = 0;
+      };
+
+    if(options.endeffect)
+      options_for_draggable.endeffect = options.endeffect;
+
+    if(options.zindex)
+      options_for_draggable.zindex = options.zindex;
+
+    // build options for the droppables  
+    var options_for_droppable = {
+      overlap:     options.overlap,
+      containment: options.containment,
+      tree:        options.tree,
+      hoverclass:  options.hoverclass,
+      onHover:     Sortable.onHover
+    }
+    
+    var options_for_tree = {
+      onHover:      Sortable.onEmptyHover,
+      overlap:      options.overlap,
+      containment:  options.containment,
+      hoverclass:   options.hoverclass
+    }
+
+    // fix for gecko engine
+    Element.cleanWhitespace(element); 
+
+    options.draggables = [];
+    options.droppables = [];
+
+    // drop on empty handling
+    if(options.dropOnEmpty || options.tree) {
+      Droppables.add(element, options_for_tree);
+      options.droppables.push(element);
+    }
+
+    (this.findElements(element, options) || []).each( function(e) {
+      // handles are per-draggable
+      var handle = options.handle ? 
+        $(e).down('.'+options.handle,0) : e;    
+      options.draggables.push(
+        new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
+      Droppables.add(e, options_for_droppable);
+      if(options.tree) e.treeNode = element;
+      options.droppables.push(e);      
+    });
+    
+    if(options.tree) {
+      (Sortable.findTreeElements(element, options) || []).each( function(e) {
+        Droppables.add(e, options_for_tree);
+        e.treeNode = element;
+        options.droppables.push(e);
+      });
+    }
+
+    // keep reference
+    this.sortables[element.id] = options;
+
+    // for onupdate
+    Draggables.addObserver(new SortableObserver(element, options.onUpdate));
+
+  },
+
+  // return all suitable-for-sortable elements in a guaranteed order
+  findElements: function(element, options) {
+    return Element.findChildren(
+      element, options.only, options.tree ? true : false, options.tag);
+  },
+  
+  findTreeElements: function(element, options) {
+    return Element.findChildren(
+      element, options.only, options.tree ? true : false, options.treeTag);
+  },
+
+  onHover: function(element, dropon, overlap) {
+    if(Element.isParent(dropon, element)) return;
+
+    if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
+      return;
+    } else if(overlap>0.5) {
+      Sortable.mark(dropon, 'before');
+      if(dropon.previousSibling != element) {
+        var oldParentNode = element.parentNode;
+        element.style.visibility = "hidden"; // fix gecko rendering
+        dropon.parentNode.insertBefore(element, dropon);
+        if(dropon.parentNode!=oldParentNode) 
+          Sortable.options(oldParentNode).onChange(element);
+        Sortable.options(dropon.parentNode).onChange(element);
+      }
+    } else {
+      Sortable.mark(dropon, 'after');
+      var nextElement = dropon.nextSibling || null;
+      if(nextElement != element) {
+        var oldParentNode = element.parentNode;
+        element.style.visibility = "hidden"; // fix gecko rendering
+        dropon.parentNode.insertBefore(element, nextElement);
+        if(dropon.parentNode!=oldParentNode) 
+          Sortable.options(oldParentNode).onChange(element);
+        Sortable.options(dropon.parentNode).onChange(element);
+      }
+    }
+  },
+  
+  onEmptyHover: function(element, dropon, overlap) {
+    var oldParentNode = element.parentNode;
+    var droponOptions = Sortable.options(dropon);
+        
+    if(!Element.isParent(dropon, element)) {
+      var index;
+      
+      var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
+      var child = null;
+            
+      if(children) {
+        var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
+        
+        for (index = 0; index < children.length; index += 1) {
+          if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
+            offset -= Element.offsetSize (children[index], droponOptions.overlap);
+          } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
+            child = index + 1 < children.length ? children[index + 1] : null;
+            break;
+          } else {
+            child = children[index];
+            break;
+          }
+        }
+      }
+      
+      dropon.insertBefore(element, child);
+      
+      Sortable.options(oldParentNode).onChange(element);
+      droponOptions.onChange(element);
+    }
+  },
+
+  unmark: function() {
+    if(Sortable._marker) Sortable._marker.hide();
+  },
+
+  mark: function(dropon, position) {
+    // mark on ghosting only
+    var sortable = Sortable.options(dropon.parentNode);
+    if(sortable && !sortable.ghosting) return; 
+
+    if(!Sortable._marker) {
+      Sortable._marker = 
+        ($('dropmarker') || Element.extend(document.createElement('DIV'))).
+          hide().addClassName('dropmarker').setStyle({position:'absolute'});
+      document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
+    }    
+    var offsets = Position.cumulativeOffset(dropon);
+    Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});
+    
+    if(position=='after')
+      if(sortable.overlap == 'horizontal') 
+        Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
+      else
+        Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});
+    
+    Sortable._marker.show();
+  },
+  
+  _tree: function(element, options, parent) {
+    var children = Sortable.findElements(element, options) || [];
+  
+    for (var i = 0; i < children.length; ++i) {
+      var match = children[i].id.match(options.format);
+
+      if (!match) continue;
+      
+      var child = {
+        id: encodeURIComponent(match ? match[1] : null),
+        element: element,
+        parent: parent,
+        children: [],
+        position: parent.children.length,
+        container: $(children[i]).down(options.treeTag)
+      }
+      
+      /* Get the element containing the children and recurse over it */
+      if (child.container)
+        this._tree(child.container, options, child)
+      
+      parent.children.push (child);
+    }
+
+    return parent; 
+  },
+
+  tree: function(element) {
+    element = $(element);
+    var sortableOptions = this.options(element);
+    var options = Object.extend({
+      tag: sortableOptions.tag,
+      treeTag: sortableOptions.treeTag,
+      only: sortableOptions.only,
+      name: element.id,
+      format: sortableOptions.format
+    }, arguments[1] || {});
+    
+    var root = {
+      id: null,
+      parent: null,
+      children: [],
+      container: element,
+      position: 0
+    }
+    
+    return Sortable._tree(element, options, root);
+  },
+
+  /* Construct a [i] index for a particular node */
+  _constructIndex: function(node) {
+    var index = '';
+    do {
+      if (node.id) index = '[' + node.position + ']' + index;
+    } while ((node = node.parent) != null);
+    return index;
+  },
+
+  sequence: function(element) {
+    element = $(element);
+    var options = Object.extend(this.options(element), arguments[1] || {});
+    
+    return $(this.findElements(element, options) || []).map( function(item) {
+      return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
+    });
+  },
+
+  setSequence: function(element, new_sequence) {
+    element = $(element);
+    var options = Object.extend(this.options(element), arguments[2] || {});
+    
+    var nodeMap = {};
+    this.findElements(element, options).each( function(n) {
+        if (n.id.match(options.format))
+            nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
+        n.parentNode.removeChild(n);
+    });
+   
+    new_sequence.each(function(ident) {
+      var n = nodeMap[ident];
+      if (n) {
+        n[1].appendChild(n[0]);
+        delete nodeMap[ident];
+      }
+    });
+  },
+  
+  serialize: function(element) {
+    element = $(element);
+    var options = Object.extend(Sortable.options(element), arguments[1] || {});
+    var name = encodeURIComponent(
+      (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
+    
+    if (options.tree) {
+      return Sortable.tree(element, arguments[1]).children.map( function (item) {
+        return [name + Sortable._constructIndex(item) + "[id]=" + 
+                encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
+      }).flatten().join('&');
+    } else {
+      return Sortable.sequence(element, arguments[1]).map( function(item) {
+        return name + "[]=" + encodeURIComponent(item);
+      }).join('&');
+    }
+  }
+}
+
+// Returns true if child is contained within element
+Element.isParent = function(child, element) {
+  if (!child.parentNode || child == element) return false;
+  if (child.parentNode == element) return true;
+  return Element.isParent(child.parentNode, element);
+}
+
+Element.findChildren = function(element, only, recursive, tagName) {    
+  if(!element.hasChildNodes()) return null;
+  tagName = tagName.toUpperCase();
+  if(only) only = [only].flatten();
+  var elements = [];
+  $A(element.childNodes).each( function(e) {
+    if(e.tagName && e.tagName.toUpperCase()==tagName &&
+      (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
+        elements.push(e);
+    if(recursive) {
+      var grandchildren = Element.findChildren(e, only, recursive, tagName);
+      if(grandchildren) elements.push(grandchildren);
+    }
+  });
+
+  return (elements.length>0 ? elements.flatten() : []);
+}
+
+Element.offsetSize = function (element, type) {
+  return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
+}
diff --git a/public/javascripts/effects.js b/public/javascripts/effects.js
new file mode 100644 (file)
index 0000000..3b02eda
--- /dev/null
@@ -0,0 +1,1088 @@
+// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// Contributors:
+//  Justin Palmer (http://encytemedia.com/)
+//  Mark Pilgrim (http://diveintomark.org/)
+//  Martin Bialasinki
+// 
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/ 
+
+// converts rgb() and #xxx to #xxxxxx format,  
+// returns self (or first argument) if not convertable  
+String.prototype.parseColor = function() {  
+  var color = '#';
+  if(this.slice(0,4) == 'rgb(') {  
+    var cols = this.slice(4,this.length-1).split(',');  
+    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);  
+  } else {  
+    if(this.slice(0,1) == '#') {  
+      if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
+      if(this.length==7) color = this.toLowerCase();  
+    }  
+  }  
+  return(color.length==7 ? color : (arguments[0] || this));  
+}
+
+/*--------------------------------------------------------------------------*/
+
+Element.collectTextNodes = function(element) {  
+  return $A($(element).childNodes).collect( function(node) {
+    return (node.nodeType==3 ? node.nodeValue : 
+      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
+  }).flatten().join('');
+}
+
+Element.collectTextNodesIgnoreClass = function(element, className) {  
+  return $A($(element).childNodes).collect( function(node) {
+    return (node.nodeType==3 ? node.nodeValue : 
+      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? 
+        Element.collectTextNodesIgnoreClass(node, className) : ''));
+  }).flatten().join('');
+}
+
+Element.setContentZoom = function(element, percent) {
+  element = $(element);  
+  element.setStyle({fontSize: (percent/100) + 'em'});   
+  if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+  return element;
+}
+
+Element.getOpacity = function(element){
+  element = $(element);
+  var opacity;
+  if (opacity = element.getStyle('opacity'))  
+    return parseFloat(opacity);  
+  if (opacity = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))  
+    if(opacity[1]) return parseFloat(opacity[1]) / 100;  
+  return 1.0;  
+}
+
+Element.setOpacity = function(element, value){  
+  element= $(element);  
+  if (value == 1){
+    element.setStyle({ opacity: 
+      (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 
+      0.999999 : 1.0 });
+    if(/MSIE/.test(navigator.userAgent) && !window.opera)  
+      element.setStyle({filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});  
+  } else {  
+    if(value < 0.00001) value = 0;  
+    element.setStyle({opacity: value});
+    if(/MSIE/.test(navigator.userAgent) && !window.opera)  
+      element.setStyle(
+        { filter: element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +
+            'alpha(opacity='+value*100+')' });  
+  }
+  return element;
+}  
+Element.getInlineOpacity = function(element){  
+  return $(element).style.opacity || '';
+}  
+
+Element.forceRerendering = function(element) {
+  try {
+    element = $(element);
+    var n = document.createTextNode(' ');
+    element.appendChild(n);
+    element.removeChild(n);
+  } catch(e) { }
+};
+
+/*--------------------------------------------------------------------------*/
+
+Array.prototype.call = function() {
+  var args = arguments;
+  this.each(function(f){ f.apply(this, args) });
+}
+
+/*--------------------------------------------------------------------------*/
+
+var Effect = {
+  _elementDoesNotExistError: {
+    name: 'ElementDoesNotExistError',
+    message: 'The specified DOM element does not exist, but is required for this effect to operate'
+  },
+  tagifyText: function(element) {
+    if(typeof Builder == 'undefined')
+      throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
+      
+    var tagifyStyle = 'position:relative';
+    if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1';
+    
+    element = $(element);
+    $A(element.childNodes).each( function(child) {
+      if(child.nodeType==3) {
+        child.nodeValue.toArray().each( function(character) {
+          element.insertBefore(
+            Builder.node('span',{style: tagifyStyle},
+              character == ' ' ? String.fromCharCode(160) : character), 
+              child);
+        });
+        Element.remove(child);
+      }
+    });
+  },
+  multiple: function(element, effect) {
+    var elements;
+    if(((typeof element == 'object') || 
+        (typeof element == 'function')) && 
+       (element.length))
+      elements = element;
+    else
+      elements = $(element).childNodes;
+      
+    var options = Object.extend({
+      speed: 0.1,
+      delay: 0.0
+    }, arguments[2] || {});
+    var masterDelay = options.delay;
+
+    $A(elements).each( function(element, index) {
+      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
+    });
+  },
+  PAIRS: {
+    'slide':  ['SlideDown','SlideUp'],
+    'blind':  ['BlindDown','BlindUp'],
+    'appear': ['Appear','Fade']
+  },
+  toggle: function(element, effect) {
+    element = $(element);
+    effect = (effect || 'appear').toLowerCase();
+    var options = Object.extend({
+      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
+    }, arguments[2] || {});
+    Effect[element.visible() ? 
+      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
+  }
+};
+
+var Effect2 = Effect; // deprecated
+
+/* ------------- transitions ------------- */
+
+Effect.Transitions = {
+  linear: Prototype.K,
+  sinoidal: function(pos) {
+    return (-Math.cos(pos*Math.PI)/2) + 0.5;
+  },
+  reverse: function(pos) {
+    return 1-pos;
+  },
+  flicker: function(pos) {
+    return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
+  },
+  wobble: function(pos) {
+    return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
+  },
+  pulse: function(pos, pulses) { 
+    pulses = pulses || 5; 
+    return (
+      Math.round((pos % (1/pulses)) * pulses) == 0 ? 
+            ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : 
+        1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))
+      );
+  },
+  none: function(pos) {
+    return 0;
+  },
+  full: function(pos) {
+    return 1;
+  }
+};
+
+/* ------------- core effects ------------- */
+
+Effect.ScopedQueue = Class.create();
+Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
+  initialize: function() {
+    this.effects  = [];
+    this.interval = null;
+  },
+  _each: function(iterator) {
+    this.effects._each(iterator);
+  },
+  add: function(effect) {
+    var timestamp = new Date().getTime();
+    
+    var position = (typeof effect.options.queue == 'string') ? 
+      effect.options.queue : effect.options.queue.position;
+    
+    switch(position) {
+      case 'front':
+        // move unstarted effects after this effect  
+        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
+            e.startOn  += effect.finishOn;
+            e.finishOn += effect.finishOn;
+          });
+        break;
+      case 'with-last':
+        timestamp = this.effects.pluck('startOn').max() || timestamp;
+        break;
+      case 'end':
+        // start effect after last queued effect has finished
+        timestamp = this.effects.pluck('finishOn').max() || timestamp;
+        break;
+    }
+    
+    effect.startOn  += timestamp;
+    effect.finishOn += timestamp;
+
+    if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
+      this.effects.push(effect);
+    
+    if(!this.interval) 
+      this.interval = setInterval(this.loop.bind(this), 40);
+  },
+  remove: function(effect) {
+    this.effects = this.effects.reject(function(e) { return e==effect });
+    if(this.effects.length == 0) {
+      clearInterval(this.interval);
+      this.interval = null;
+    }
+  },
+  loop: function() {
+    var timePos = new Date().getTime();
+    this.effects.invoke('loop', timePos);
+  }
+});
+
+Effect.Queues = {
+  instances: $H(),
+  get: function(queueName) {
+    if(typeof queueName != 'string') return queueName;
+    
+    if(!this.instances[queueName])
+      this.instances[queueName] = new Effect.ScopedQueue();
+      
+    return this.instances[queueName];
+  }
+}
+Effect.Queue = Effect.Queues.get('global');
+
+Effect.DefaultOptions = {
+  transition: Effect.Transitions.sinoidal,
+  duration:   1.0,   // seconds
+  fps:        25.0,  // max. 25fps due to Effect.Queue implementation
+  sync:       false, // true for combining
+  from:       0.0,
+  to:         1.0,
+  delay:      0.0,
+  queue:      'parallel'
+}
+
+Effect.Base = function() {};
+Effect.Base.prototype = {
+  position: null,
+  start: function(options) {
+    this.options      = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
+    this.currentFrame = 0;
+    this.state        = 'idle';
+    this.startOn      = this.options.delay*1000;
+    this.finishOn     = this.startOn + (this.options.duration*1000);
+    this.event('beforeStart');
+    if(!this.options.sync)
+      Effect.Queues.get(typeof this.options.queue == 'string' ? 
+        'global' : this.options.queue.scope).add(this);
+  },
+  loop: function(timePos) {
+    if(timePos >= this.startOn) {
+      if(timePos >= this.finishOn) {
+        this.render(1.0);
+        this.cancel();
+        this.event('beforeFinish');
+        if(this.finish) this.finish(); 
+        this.event('afterFinish');
+        return;  
+      }
+      var pos   = (timePos - this.startOn) / (this.finishOn - this.startOn);
+      var frame = Math.round(pos * this.options.fps * this.options.duration);
+      if(frame > this.currentFrame) {
+        this.render(pos);
+        this.currentFrame = frame;
+      }
+    }
+  },
+  render: function(pos) {
+    if(this.state == 'idle') {
+      this.state = 'running';
+      this.event('beforeSetup');
+      if(this.setup) this.setup();
+      this.event('afterSetup');
+    }
+    if(this.state == 'running') {
+      if(this.options.transition) pos = this.options.transition(pos);
+      pos *= (this.options.to-this.options.from);
+      pos += this.options.from;
+      this.position = pos;
+      this.event('beforeUpdate');
+      if(this.update) this.update(pos);
+      this.event('afterUpdate');
+    }
+  },
+  cancel: function() {
+    if(!this.options.sync)
+      Effect.Queues.get(typeof this.options.queue == 'string' ? 
+        'global' : this.options.queue.scope).remove(this);
+    this.state = 'finished';
+  },
+  event: function(eventName) {
+    if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
+    if(this.options[eventName]) this.options[eventName](this);
+  },
+  inspect: function() {
+    return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>';
+  }
+}
+
+Effect.Parallel = Class.create();
+Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
+  initialize: function(effects) {
+    this.effects = effects || [];
+    this.start(arguments[1]);
+  },
+  update: function(position) {
+    this.effects.invoke('render', position);
+  },
+  finish: function(position) {
+    this.effects.each( function(effect) {
+      effect.render(1.0);
+      effect.cancel();
+      effect.event('beforeFinish');
+      if(effect.finish) effect.finish(position);
+      effect.event('afterFinish');
+    });
+  }
+});
+
+Effect.Event = Class.create();
+Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {
+  initialize: function() {
+    var options = Object.extend({
+      duration: 0
+    }, arguments[0] || {});
+    this.start(options);
+  },
+  update: Prototype.emptyFunction
+});
+
+Effect.Opacity = Class.create();
+Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    // make this work on IE on elements without 'layout'
+    if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
+      this.element.setStyle({zoom: 1});
+    var options = Object.extend({
+      from: this.element.getOpacity() || 0.0,
+      to:   1.0
+    }, arguments[1] || {});
+    this.start(options);
+  },
+  update: function(position) {
+    this.element.setOpacity(position);
+  }
+});
+
+Effect.Move = Class.create();
+Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      x:    0,
+      y:    0,
+      mode: 'relative'
+    }, arguments[1] || {});
+    this.start(options);
+  },
+  setup: function() {
+    // Bug in Opera: Opera returns the "real" position of a static element or
+    // relative element that does not have top/left explicitly set.
+    // ==> Always set top and left for position relative elements in your stylesheets 
+    // (to 0 if you do not need them) 
+    this.element.makePositioned();
+    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
+    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
+    if(this.options.mode == 'absolute') {
+      // absolute movement, so we need to calc deltaX and deltaY
+      this.options.x = this.options.x - this.originalLeft;
+      this.options.y = this.options.y - this.originalTop;
+    }
+  },
+  update: function(position) {
+    this.element.setStyle({
+      left: Math.round(this.options.x  * position + this.originalLeft) + 'px',
+      top:  Math.round(this.options.y  * position + this.originalTop)  + 'px'
+    });
+  }
+});
+
+// for backwards compatibility
+Effect.MoveBy = function(element, toTop, toLeft) {
+  return new Effect.Move(element, 
+    Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
+};
+
+Effect.Scale = Class.create();
+Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
+  initialize: function(element, percent) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      scaleX: true,
+      scaleY: true,
+      scaleContent: true,
+      scaleFromCenter: false,
+      scaleMode: 'box',        // 'box' or 'contents' or {} with provided values
+      scaleFrom: 100.0,
+      scaleTo:   percent
+    }, arguments[2] || {});
+    this.start(options);
+  },
+  setup: function() {
+    this.restoreAfterFinish = this.options.restoreAfterFinish || false;
+    this.elementPositioning = this.element.getStyle('position');
+    
+    this.originalStyle = {};
+    ['top','left','width','height','fontSize'].each( function(k) {
+      this.originalStyle[k] = this.element.style[k];
+    }.bind(this));
+      
+    this.originalTop  = this.element.offsetTop;
+    this.originalLeft = this.element.offsetLeft;
+    
+    var fontSize = this.element.getStyle('font-size') || '100%';
+    ['em','px','%','pt'].each( function(fontSizeType) {
+      if(fontSize.indexOf(fontSizeType)>0) {
+        this.fontSize     = parseFloat(fontSize);
+        this.fontSizeType = fontSizeType;
+      }
+    }.bind(this));
+    
+    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
+    
+    this.dims = null;
+    if(this.options.scaleMode=='box')
+      this.dims = [this.element.offsetHeight, this.element.offsetWidth];
+    if(/^content/.test(this.options.scaleMode))
+      this.dims = [this.element.scrollHeight, this.element.scrollWidth];
+    if(!this.dims)
+      this.dims = [this.options.scaleMode.originalHeight,
+                   this.options.scaleMode.originalWidth];
+  },
+  update: function(position) {
+    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
+    if(this.options.scaleContent && this.fontSize)
+      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
+    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
+  },
+  finish: function(position) {
+    if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
+  },
+  setDimensions: function(height, width) {
+    var d = {};
+    if(this.options.scaleX) d.width = Math.round(width) + 'px';
+    if(this.options.scaleY) d.height = Math.round(height) + 'px';
+    if(this.options.scaleFromCenter) {
+      var topd  = (height - this.dims[0])/2;
+      var leftd = (width  - this.dims[1])/2;
+      if(this.elementPositioning == 'absolute') {
+        if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
+        if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
+      } else {
+        if(this.options.scaleY) d.top = -topd + 'px';
+        if(this.options.scaleX) d.left = -leftd + 'px';
+      }
+    }
+    this.element.setStyle(d);
+  }
+});
+
+Effect.Highlight = Class.create();
+Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
+    this.start(options);
+  },
+  setup: function() {
+    // Prevent executing on elements not in the layout flow
+    if(this.element.getStyle('display')=='none') { this.cancel(); return; }
+    // Disable background image during the effect
+    this.oldStyle = {
+      backgroundImage: this.element.getStyle('background-image') };
+    this.element.setStyle({backgroundImage: 'none'});
+    if(!this.options.endcolor)
+      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
+    if(!this.options.restorecolor)
+      this.options.restorecolor = this.element.getStyle('background-color');
+    // init color calculations
+    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
+    this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
+  },
+  update: function(position) {
+    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
+      return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
+  },
+  finish: function() {
+    this.element.setStyle(Object.extend(this.oldStyle, {
+      backgroundColor: this.options.restorecolor
+    }));
+  }
+});
+
+Effect.ScrollTo = Class.create();
+Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    this.start(arguments[1] || {});
+  },
+  setup: function() {
+    Position.prepare();
+    var offsets = Position.cumulativeOffset(this.element);
+    if(this.options.offset) offsets[1] += this.options.offset;
+    var max = window.innerHeight ? 
+      window.height - window.innerHeight :
+      document.body.scrollHeight - 
+        (document.documentElement.clientHeight ? 
+          document.documentElement.clientHeight : document.body.clientHeight);
+    this.scrollStart = Position.deltaY;
+    this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
+  },
+  update: function(position) {
+    Position.prepare();
+    window.scrollTo(Position.deltaX, 
+      this.scrollStart + (position*this.delta));
+  }
+});
+
+/* ------------- combination effects ------------- */
+
+Effect.Fade = function(element) {
+  element = $(element);
+  var oldOpacity = element.getInlineOpacity();
+  var options = Object.extend({
+  from: element.getOpacity() || 1.0,
+  to:   0.0,
+  afterFinishInternal: function(effect) { 
+    if(effect.options.to!=0) return;
+    effect.element.hide().setStyle({opacity: oldOpacity}); 
+  }}, arguments[1] || {});
+  return new Effect.Opacity(element,options);
+}
+
+Effect.Appear = function(element) {
+  element = $(element);
+  var options = Object.extend({
+  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
+  to:   1.0,
+  // force Safari to render floated elements properly
+  afterFinishInternal: function(effect) {
+    effect.element.forceRerendering();
+  },
+  beforeSetup: function(effect) {
+    effect.element.setOpacity(effect.options.from).show(); 
+  }}, arguments[1] || {});
+  return new Effect.Opacity(element,options);
+}
+
+Effect.Puff = function(element) {
+  element = $(element);
+  var oldStyle = { 
+    opacity: element.getInlineOpacity(), 
+    position: element.getStyle('position'),
+    top:  element.style.top,
+    left: element.style.left,
+    width: element.style.width,
+    height: element.style.height
+  };
+  return new Effect.Parallel(
+   [ new Effect.Scale(element, 200, 
+      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), 
+     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], 
+     Object.extend({ duration: 1.0, 
+      beforeSetupInternal: function(effect) {
+        Position.absolutize(effect.effects[0].element)
+      },
+      afterFinishInternal: function(effect) {
+         effect.effects[0].element.hide().setStyle(oldStyle); }
+     }, arguments[1] || {})
+   );
+}
+
+Effect.BlindUp = function(element) {
+  element = $(element);
+  element.makeClipping();
+  return new Effect.Scale(element, 0,
+    Object.extend({ scaleContent: false, 
+      scaleX: false, 
+      restoreAfterFinish: true,
+      afterFinishInternal: function(effect) {
+        effect.element.hide().undoClipping();
+      } 
+    }, arguments[1] || {})
+  );
+}
+
+Effect.BlindDown = function(element) {
+  element = $(element);
+  var elementDimensions = element.getDimensions();
+  return new Effect.Scale(element, 100, Object.extend({ 
+    scaleContent: false, 
+    scaleX: false,
+    scaleFrom: 0,
+    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+    restoreAfterFinish: true,
+    afterSetup: function(effect) {
+      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
+    },  
+    afterFinishInternal: function(effect) {
+      effect.element.undoClipping();
+    }
+  }, arguments[1] || {}));
+}
+
+Effect.SwitchOff = function(element) {
+  element = $(element);
+  var oldOpacity = element.getInlineOpacity();
+  return new Effect.Appear(element, Object.extend({
+    duration: 0.4,
+    from: 0,
+    transition: Effect.Transitions.flicker,
+    afterFinishInternal: function(effect) {
+      new Effect.Scale(effect.element, 1, { 
+        duration: 0.3, scaleFromCenter: true,
+        scaleX: false, scaleContent: false, restoreAfterFinish: true,
+        beforeSetup: function(effect) { 
+          effect.element.makePositioned().makeClipping();
+        },
+        afterFinishInternal: function(effect) {
+          effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
+        }
+      })
+    }
+  }, arguments[1] || {}));
+}
+
+Effect.DropOut = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.getStyle('top'),
+    left: element.getStyle('left'),
+    opacity: element.getInlineOpacity() };
+  return new Effect.Parallel(
+    [ new Effect.Move(element, {x: 0, y: 100, sync: true }), 
+      new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
+    Object.extend(
+      { duration: 0.5,
+        beforeSetup: function(effect) {
+          effect.effects[0].element.makePositioned(); 
+        },
+        afterFinishInternal: function(effect) {
+          effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
+        } 
+      }, arguments[1] || {}));
+}
+
+Effect.Shake = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.getStyle('top'),
+    left: element.getStyle('left') };
+    return new Effect.Move(element, 
+      { x:  20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
+        effect.element.undoPositioned().setStyle(oldStyle);
+  }}) }}) }}) }}) }}) }});
+}
+
+Effect.SlideDown = function(element) {
+  element = $(element).cleanWhitespace();
+  // SlideDown need to have the content of the element wrapped in a container element with fixed height!
+  var oldInnerBottom = element.down().getStyle('bottom');
+  var elementDimensions = element.getDimensions();
+  return new Effect.Scale(element, 100, Object.extend({ 
+    scaleContent: false, 
+    scaleX: false, 
+    scaleFrom: window.opera ? 0 : 1,
+    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+    restoreAfterFinish: true,
+    afterSetup: function(effect) {
+      effect.element.makePositioned();
+      effect.element.down().makePositioned();
+      if(window.opera) effect.element.setStyle({top: ''});
+      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
+    },
+    afterUpdateInternal: function(effect) {
+      effect.element.down().setStyle({bottom:
+        (effect.dims[0] - effect.element.clientHeight) + 'px' }); 
+    },
+    afterFinishInternal: function(effect) {
+      effect.element.undoClipping().undoPositioned();
+      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
+    }, arguments[1] || {})
+  );
+}
+
+Effect.SlideUp = function(element) {
+  element = $(element).cleanWhitespace();
+  var oldInnerBottom = element.down().getStyle('bottom');
+  return new Effect.Scale(element, window.opera ? 0 : 1,
+   Object.extend({ scaleContent: false, 
+    scaleX: false, 
+    scaleMode: 'box',
+    scaleFrom: 100,
+    restoreAfterFinish: true,
+    beforeStartInternal: function(effect) {
+      effect.element.makePositioned();
+      effect.element.down().makePositioned();
+      if(window.opera) effect.element.setStyle({top: ''});
+      effect.element.makeClipping().show();
+    },  
+    afterUpdateInternal: function(effect) {
+      effect.element.down().setStyle({bottom:
+        (effect.dims[0] - effect.element.clientHeight) + 'px' });
+    },
+    afterFinishInternal: function(effect) {
+      effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom});
+      effect.element.down().undoPositioned();
+    }
+   }, arguments[1] || {})
+  );
+}
+
+// Bug in opera makes the TD containing this element expand for a instance after finish 
+Effect.Squish = function(element) {
+  return new Effect.Scale(element, window.opera ? 1 : 0, { 
+    restoreAfterFinish: true,
+    beforeSetup: function(effect) {
+      effect.element.makeClipping(); 
+    },  
+    afterFinishInternal: function(effect) {
+      effect.element.hide().undoClipping(); 
+    }
+  });
+}
+
+Effect.Grow = function(element) {
+  element = $(element);
+  var options = Object.extend({
+    direction: 'center',
+    moveTransition: Effect.Transitions.sinoidal,
+    scaleTransition: Effect.Transitions.sinoidal,
+    opacityTransition: Effect.Transitions.full
+  }, arguments[1] || {});
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    height: element.style.height,
+    width: element.style.width,
+    opacity: element.getInlineOpacity() };
+
+  var dims = element.getDimensions();    
+  var initialMoveX, initialMoveY;
+  var moveX, moveY;
+  
+  switch (options.direction) {
+    case 'top-left':
+      initialMoveX = initialMoveY = moveX = moveY = 0; 
+      break;
+    case 'top-right':
+      initialMoveX = dims.width;
+      initialMoveY = moveY = 0;
+      moveX = -dims.width;
+      break;
+    case 'bottom-left':
+      initialMoveX = moveX = 0;
+      initialMoveY = dims.height;
+      moveY = -dims.height;
+      break;
+    case 'bottom-right':
+      initialMoveX = dims.width;
+      initialMoveY = dims.height;
+      moveX = -dims.width;
+      moveY = -dims.height;
+      break;
+    case 'center':
+      initialMoveX = dims.width / 2;
+      initialMoveY = dims.height / 2;
+      moveX = -dims.width / 2;
+      moveY = -dims.height / 2;
+      break;
+  }
+  
+  return new Effect.Move(element, {
+    x: initialMoveX,
+    y: initialMoveY,
+    duration: 0.01, 
+    beforeSetup: function(effect) {
+      effect.element.hide().makeClipping().makePositioned();
+    },
+    afterFinishInternal: function(effect) {
+      new Effect.Parallel(
+        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
+          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
+          new Effect.Scale(effect.element, 100, {
+            scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, 
+            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
+        ], Object.extend({
+             beforeSetup: function(effect) {
+               effect.effects[0].element.setStyle({height: '0px'}).show(); 
+             },
+             afterFinishInternal: function(effect) {
+               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); 
+             }
+           }, options)
+      )
+    }
+  });
+}
+
+Effect.Shrink = function(element) {
+  element = $(element);
+  var options = Object.extend({
+    direction: 'center',
+    moveTransition: Effect.Transitions.sinoidal,
+    scaleTransition: Effect.Transitions.sinoidal,
+    opacityTransition: Effect.Transitions.none
+  }, arguments[1] || {});
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    height: element.style.height,
+    width: element.style.width,
+    opacity: element.getInlineOpacity() };
+
+  var dims = element.getDimensions();
+  var moveX, moveY;
+  
+  switch (options.direction) {
+    case 'top-left':
+      moveX = moveY = 0;
+      break;
+    case 'top-right':
+      moveX = dims.width;
+      moveY = 0;
+      break;
+    case 'bottom-left':
+      moveX = 0;
+      moveY = dims.height;
+      break;
+    case 'bottom-right':
+      moveX = dims.width;
+      moveY = dims.height;
+      break;
+    case 'center':  
+      moveX = dims.width / 2;
+      moveY = dims.height / 2;
+      break;
+  }
+  
+  return new Effect.Parallel(
+    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
+      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
+      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
+    ], Object.extend({            
+         beforeStartInternal: function(effect) {
+           effect.effects[0].element.makePositioned().makeClipping(); 
+         },
+         afterFinishInternal: function(effect) {
+           effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
+       }, options)
+  );
+}
+
+Effect.Pulsate = function(element) {
+  element = $(element);
+  var options    = arguments[1] || {};
+  var oldOpacity = element.getInlineOpacity();
+  var transition = options.transition || Effect.Transitions.sinoidal;
+  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
+  reverser.bind(transition);
+  return new Effect.Opacity(element, 
+    Object.extend(Object.extend({  duration: 2.0, from: 0,
+      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
+    }, options), {transition: reverser}));
+}
+
+Effect.Fold = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    width: element.style.width,
+    height: element.style.height };
+  element.makeClipping();
+  return new Effect.Scale(element, 5, Object.extend({   
+    scaleContent: false,
+    scaleX: false,
+    afterFinishInternal: function(effect) {
+    new Effect.Scale(element, 1, { 
+      scaleContent: false, 
+      scaleY: false,
+      afterFinishInternal: function(effect) {
+        effect.element.hide().undoClipping().setStyle(oldStyle);
+      } });
+  }}, arguments[1] || {}));
+};
+
+Effect.Morph = Class.create();
+Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      style: ''
+    }, arguments[1] || {});
+    this.start(options);
+  },
+  setup: function(){
+    function parseColor(color){
+      if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
+      color = color.parseColor();
+      return $R(0,2).map(function(i){
+        return parseInt( color.slice(i*2+1,i*2+3), 16 ) 
+      });
+    }
+    this.transforms = this.options.style.parseStyle().map(function(property){
+      var originalValue = this.element.getStyle(property[0]);
+      return $H({ 
+        style: property[0], 
+        originalValue: property[1].unit=='color' ? 
+          parseColor(originalValue) : parseFloat(originalValue || 0), 
+        targetValue: property[1].unit=='color' ? 
+          parseColor(property[1].value) : property[1].value,
+        unit: property[1].unit
+      });
+    }.bind(this)).reject(function(transform){
+      return (
+        (transform.originalValue == transform.targetValue) ||
+        (
+          transform.unit != 'color' &&
+          (isNaN(transform.originalValue) || isNaN(transform.targetValue))
+        )
+      )
+    });
+  },
+  update: function(position) {
+    var style = $H(), value = null;
+    this.transforms.each(function(transform){
+      value = transform.unit=='color' ?
+        $R(0,2).inject('#',function(m,v,i){
+          return m+(Math.round(transform.originalValue[i]+
+            (transform.targetValue[i] - transform.originalValue[i])*position)).toColorPart() }) : 
+        transform.originalValue + Math.round(
+          ((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit;
+      style[transform.style] = value;
+    });
+    this.element.setStyle(style);
+  }
+});
+
+Effect.Transform = Class.create();
+Object.extend(Effect.Transform.prototype, {
+  initialize: function(tracks){
+    this.tracks  = [];
+    this.options = arguments[1] || {};
+    this.addTracks(tracks);
+  },
+  addTracks: function(tracks){
+    tracks.each(function(track){
+      var data = $H(track).values().first();
+      this.tracks.push($H({
+        ids:     $H(track).keys().first(),
+        effect:  Effect.Morph,
+        options: { style: data }
+      }));
+    }.bind(this));
+    return this;
+  },
+  play: function(){
+    return new Effect.Parallel(
+      this.tracks.map(function(track){
+        var elements = [$(track.ids) || $$(track.ids)].flatten();
+        return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) });
+      }).flatten(),
+      this.options
+    );
+  }
+});
+
+Element.CSS_PROPERTIES = ['azimuth', 'backgroundAttachment', 'backgroundColor', 'backgroundImage', 
+  'backgroundPosition', 'backgroundRepeat', 'borderBottomColor', 'borderBottomStyle', 
+  'borderBottomWidth', 'borderCollapse', 'borderLeftColor', 'borderLeftStyle', 'borderLeftWidth',
+  'borderRightColor', 'borderRightStyle', 'borderRightWidth', 'borderSpacing', 'borderTopColor',
+  'borderTopStyle', 'borderTopWidth', 'bottom', 'captionSide', 'clear', 'clip', 'color', 'content',
+  'counterIncrement', 'counterReset', 'cssFloat', 'cueAfter', 'cueBefore', 'cursor', 'direction',
+  'display', 'elevation', 'emptyCells', 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch',
+  'fontStyle', 'fontVariant', 'fontWeight', 'height', 'left', 'letterSpacing', 'lineHeight',
+  'listStyleImage', 'listStylePosition', 'listStyleType', 'marginBottom', 'marginLeft', 'marginRight',
+  'marginTop', 'markerOffset', 'marks', 'maxHeight', 'maxWidth', 'minHeight', 'minWidth', 'opacity',
+  'orphans', 'outlineColor', 'outlineOffset', 'outlineStyle', 'outlineWidth', 'overflowX', 'overflowY',
+  'paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop', 'page', 'pageBreakAfter', 'pageBreakBefore',
+  'pageBreakInside', 'pauseAfter', 'pauseBefore', 'pitch', 'pitchRange', 'position', 'quotes',
+  'richness', 'right', 'size', 'speakHeader', 'speakNumeral', 'speakPunctuation', 'speechRate', 'stress',
+  'tableLayout', 'textAlign', 'textDecoration', 'textIndent', 'textShadow', 'textTransform', 'top',
+  'unicodeBidi', 'verticalAlign', 'visibility', 'voiceFamily', 'volume', 'whiteSpace', 'widows',
+  'width', 'wordSpacing', 'zIndex'];
+  
+Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
+
+String.prototype.parseStyle = function(){
+  var element = Element.extend(document.createElement('div'));
+  element.innerHTML = '<div style="' + this + '"></div>';
+  var style = element.down().style, styleRules = $H();
+  
+  Element.CSS_PROPERTIES.each(function(property){
+   if(style[property]) styleRules[property] = style[property]; 
+  });
+  
+  var result = $H();
+  
+  styleRules.each(function(pair){
+    var property = pair[0], value = pair[1], unit = null;
+    
+    if(value.parseColor('#zzzzzz') != '#zzzzzz') {
+      value = value.parseColor();
+      unit  = 'color';
+    } else if(Element.CSS_LENGTH.test(value)) 
+      var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/),
+          value = parseFloat(components[1]), unit = (components.length == 3) ? components[2] : null;
+    
+    result[property.underscore().dasherize()] = $H({ value:value, unit:unit });
+  }.bind(this));
+  
+  return result;
+};
+
+Element.morph = function(element, style) {
+  new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {}));
+  return element;
+};
+
+['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
+ 'collectTextNodes','collectTextNodesIgnoreClass','morph'].each( 
+  function(f) { Element.Methods[f] = Element[f]; }
+);
+
+Element.Methods.visualEffect = function(element, effect, options) {
+  s = effect.gsub(/_/, '-').camelize();
+  effect_class = s.charAt(0).toUpperCase() + s.substring(1);
+  new Effect[effect_class](element, options);
+  return $(element);
+};
+
+Element.addMethods();
\ No newline at end of file
diff --git a/public/javascripts/prototype.js b/public/javascripts/prototype.js
new file mode 100644 (file)
index 0000000..5058221
--- /dev/null
@@ -0,0 +1,2515 @@
+/*  Prototype JavaScript framework, version 1.5.0
+ *  (c) 2005-2007 Sam Stephenson
+ *
+ *  Prototype is freely distributable under the terms of an MIT-style license.
+ *  For details, see the Prototype web site: http://prototype.conio.net/
+ *
+/*--------------------------------------------------------------------------*/
+
+var Prototype = {
+  Version: '1.5.0',
+  BrowserFeatures: {
+    XPath: !!document.evaluate
+  },
+
+  ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
+  emptyFunction: function() {},
+  K: function(x) { return x }
+}
+
+var Class = {
+  create: function() {
+    return function() {
+      this.initialize.apply(this, arguments);
+    }
+  }
+}
+
+var Abstract = new Object();
+
+Object.extend = function(destination, source) {
+  for (var property in source) {
+    destination[property] = source[property];
+  }
+  return destination;
+}
+
+Object.extend(Object, {
+  inspect: function(object) {
+    try {
+      if (object === undefined) return 'undefined';
+      if (object === null) return 'null';
+      return object.inspect ? object.inspect() : object.toString();
+    } catch (e) {
+      if (e instanceof RangeError) return '...';
+      throw e;
+    }
+  },
+
+  keys: function(object) {
+    var keys = [];
+    for (var property in object)
+      keys.push(property);
+    return keys;
+  },
+
+  values: function(object) {
+    var values = [];
+    for (var property in object)
+      values.push(object[property]);
+    return values;
+  },
+
+  clone: function(object) {
+    return Object.extend({}, object);
+  }
+});
+
+Function.prototype.bind = function() {
+  var __method = this, args = $A(arguments), object = args.shift();
+  return function() {
+    return __method.apply(object, args.concat($A(arguments)));
+  }
+}
+
+Function.prototype.bindAsEventListener = function(object) {
+  var __method = this, args = $A(arguments), object = args.shift();
+  return function(event) {
+    return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));
+  }
+}
+
+Object.extend(Number.prototype, {
+  toColorPart: function() {
+    var digits = this.toString(16);
+    if (this < 16) return '0' + digits;
+    return digits;
+  },
+
+  succ: function() {
+    return this + 1;
+  },
+
+  times: function(iterator) {
+    $R(0, this, true).each(iterator);
+    return this;
+  }
+});
+
+var Try = {
+  these: function() {
+    var returnValue;
+
+    for (var i = 0, length = arguments.length; i < length; i++) {
+      var lambda = arguments[i];
+      try {
+        returnValue = lambda();
+        break;
+      } catch (e) {}
+    }
+
+    return returnValue;
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var PeriodicalExecuter = Class.create();
+PeriodicalExecuter.prototype = {
+  initialize: function(callback, frequency) {
+    this.callback = callback;
+    this.frequency = frequency;
+    this.currentlyExecuting = false;
+
+    this.registerCallback();
+  },
+
+  registerCallback: function() {
+    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+
+  stop: function() {
+    if (!this.timer) return;
+    clearInterval(this.timer);
+    this.timer = null;
+  },
+
+  onTimerEvent: function() {
+    if (!this.currentlyExecuting) {
+      try {
+        this.currentlyExecuting = true;
+        this.callback(this);
+      } finally {
+        this.currentlyExecuting = false;
+      }
+    }
+  }
+}
+String.interpret = function(value){
+  return value == null ? '' : String(value);
+}
+
+Object.extend(String.prototype, {
+  gsub: function(pattern, replacement) {
+    var result = '', source = this, match;
+    replacement = arguments.callee.prepareReplacement(replacement);
+
+    while (source.length > 0) {
+      if (match = source.match(pattern)) {
+        result += source.slice(0, match.index);
+        result += String.interpret(replacement(match));
+        source  = source.slice(match.index + match[0].length);
+      } else {
+        result += source, source = '';
+      }
+    }
+    return result;
+  },
+
+  sub: function(pattern, replacement, count) {
+    replacement = this.gsub.prepareReplacement(replacement);
+    count = count === undefined ? 1 : count;
+
+    return this.gsub(pattern, function(match) {
+      if (--count < 0) return match[0];
+      return replacement(match);
+    });
+  },
+
+  scan: function(pattern, iterator) {
+    this.gsub(pattern, iterator);
+    return this;
+  },
+
+  truncate: function(length, truncation) {
+    length = length || 30;
+    truncation = truncation === undefined ? '...' : truncation;
+    return this.length > length ?
+      this.slice(0, length - truncation.length) + truncation : this;
+  },
+
+  strip: function() {
+    return this.replace(/^\s+/, '').replace(/\s+$/, '');
+  },
+
+  stripTags: function() {
+    return this.replace(/<\/?[^>]+>/gi, '');
+  },
+
+  stripScripts: function() {
+    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
+  },
+
+  extractScripts: function() {
+    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
+    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
+    return (this.match(matchAll) || []).map(function(scriptTag) {
+      return (scriptTag.match(matchOne) || ['', ''])[1];
+    });
+  },
+
+  evalScripts: function() {
+    return this.extractScripts().map(function(script) { return eval(script) });
+  },
+
+  escapeHTML: function() {
+    var div = document.createElement('div');
+    var text = document.createTextNode(this);
+    div.appendChild(text);
+    return div.innerHTML;
+  },
+
+  unescapeHTML: function() {
+    var div = document.createElement('div');
+    div.innerHTML = this.stripTags();
+    return div.childNodes[0] ? (div.childNodes.length > 1 ?
+      $A(div.childNodes).inject('',function(memo,node){ return memo+node.nodeValue }) :
+      div.childNodes[0].nodeValue) : '';
+  },
+
+  toQueryParams: function(separator) {
+    var match = this.strip().match(/([^?#]*)(#.*)?$/);
+    if (!match) return {};
+
+    return match[1].split(separator || '&').inject({}, function(hash, pair) {
+      if ((pair = pair.split('='))[0]) {
+        var name = decodeURIComponent(pair[0]);
+        var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;
+
+        if (hash[name] !== undefined) {
+          if (hash[name].constructor != Array)
+            hash[name] = [hash[name]];
+          if (value) hash[name].push(value);
+        }
+        else hash[name] = value;
+      }
+      return hash;
+    });
+  },
+
+  toArray: function() {
+    return this.split('');
+  },
+
+  succ: function() {
+    return this.slice(0, this.length - 1) +
+      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
+  },
+
+  camelize: function() {
+    var parts = this.split('-'), len = parts.length;
+    if (len == 1) return parts[0];
+
+    var camelized = this.charAt(0) == '-'
+      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
+      : parts[0];
+
+    for (var i = 1; i < len; i++)
+      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
+
+    return camelized;
+  },
+
+  capitalize: function(){
+    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
+  },
+
+  underscore: function() {
+    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
+  },
+
+  dasherize: function() {
+    return this.gsub(/_/,'-');
+  },
+
+  inspect: function(useDoubleQuotes) {
+    var escapedString = this.replace(/\\/g, '\\\\');
+    if (useDoubleQuotes)
+      return '"' + escapedString.replace(/"/g, '\\"') + '"';
+    else
+      return "'" + escapedString.replace(/'/g, '\\\'') + "'";
+  }
+});
+
+String.prototype.gsub.prepareReplacement = function(replacement) {
+  if (typeof replacement == 'function') return replacement;
+  var template = new Template(replacement);
+  return function(match) { return template.evaluate(match) };
+}
+
+String.prototype.parseQuery = String.prototype.toQueryParams;
+
+var Template = Class.create();
+Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
+Template.prototype = {
+  initialize: function(template, pattern) {
+    this.template = template.toString();
+    this.pattern  = pattern || Template.Pattern;
+  },
+
+  evaluate: function(object) {
+    return this.template.gsub(this.pattern, function(match) {
+      var before = match[1];
+      if (before == '\\') return match[2];
+      return before + String.interpret(object[match[3]]);
+    });
+  }
+}
+
+var $break    = new Object();
+var $continue = new Object();
+
+var Enumerable = {
+  each: function(iterator) {
+    var index = 0;
+    try {
+      this._each(function(value) {
+        try {
+          iterator(value, index++);
+        } catch (e) {
+          if (e != $continue) throw e;
+        }
+      });
+    } catch (e) {
+      if (e != $break) throw e;
+    }
+    return this;
+  },
+
+  eachSlice: function(number, iterator) {
+    var index = -number, slices = [], array = this.toArray();
+    while ((index += number) < array.length)
+      slices.push(array.slice(index, index+number));
+    return slices.map(iterator);
+  },
+
+  all: function(iterator) {
+    var result = true;
+    this.each(function(value, index) {
+      result = result && !!(iterator || Prototype.K)(value, index);
+      if (!result) throw $break;
+    });
+    return result;
+  },
+
+  any: function(iterator) {
+    var result = false;
+    this.each(function(value, index) {
+      if (result = !!(iterator || Prototype.K)(value, index))
+        throw $break;
+    });
+    return result;
+  },
+
+  collect: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      results.push((iterator || Prototype.K)(value, index));
+    });
+    return results;
+  },
+
+  detect: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      if (iterator(value, index)) {
+        result = value;
+        throw $break;
+      }
+    });
+    return result;
+  },
+
+  findAll: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      if (iterator(value, index))
+        results.push(value);
+    });
+    return results;
+  },
+
+  grep: function(pattern, iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      var stringValue = value.toString();
+      if (stringValue.match(pattern))
+        results.push((iterator || Prototype.K)(value, index));
+    })
+    return results;
+  },
+
+  include: function(object) {
+    var found = false;
+    this.each(function(value) {
+      if (value == object) {
+        found = true;
+        throw $break;
+      }
+    });
+    return found;
+  },
+
+  inGroupsOf: function(number, fillWith) {
+    fillWith = fillWith === undefined ? null : fillWith;
+    return this.eachSlice(number, function(slice) {
+      while(slice.length < number) slice.push(fillWith);
+      return slice;
+    });
+  },
+
+  inject: function(memo, iterator) {
+    this.each(function(value, index) {
+      memo = iterator(memo, value, index);
+    });
+    return memo;
+  },
+
+  invoke: function(method) {
+    var args = $A(arguments).slice(1);
+    return this.map(function(value) {
+      return value[method].apply(value, args);
+    });
+  },
+
+  max: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      value = (iterator || Prototype.K)(value, index);
+      if (result == undefined || value >= result)
+        result = value;
+    });
+    return result;
+  },
+
+  min: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      value = (iterator || Prototype.K)(value, index);
+      if (result == undefined || value < result)
+        result = value;
+    });
+    return result;
+  },
+
+  partition: function(iterator) {
+    var trues = [], falses = [];
+    this.each(function(value, index) {
+      ((iterator || Prototype.K)(value, index) ?
+        trues : falses).push(value);
+    });
+    return [trues, falses];
+  },
+
+  pluck: function(property) {
+    var results = [];
+    this.each(function(value, index) {
+      results.push(value[property]);
+    });
+    return results;
+  },
+
+  reject: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      if (!iterator(value, index))
+        results.push(value);
+    });
+    return results;
+  },
+
+  sortBy: function(iterator) {
+    return this.map(function(value, index) {
+      return {value: value, criteria: iterator(value, index)};
+    }).sort(function(left, right) {
+      var a = left.criteria, b = right.criteria;
+      return a < b ? -1 : a > b ? 1 : 0;
+    }).pluck('value');
+  },
+
+  toArray: function() {
+    return this.map();
+  },
+
+  zip: function() {
+    var iterator = Prototype.K, args = $A(arguments);
+    if (typeof args.last() == 'function')
+      iterator = args.pop();
+
+    var collections = [this].concat(args).map($A);
+    return this.map(function(value, index) {
+      return iterator(collections.pluck(index));
+    });
+  },
+
+  size: function() {
+    return this.toArray().length;
+  },
+
+  inspect: function() {
+    return '#<Enumerable:' + this.toArray().inspect() + '>';
+  }
+}
+
+Object.extend(Enumerable, {
+  map:     Enumerable.collect,
+  find:    Enumerable.detect,
+  select:  Enumerable.findAll,
+  member:  Enumerable.include,
+  entries: Enumerable.toArray
+});
+var $A = Array.from = function(iterable) {
+  if (!iterable) return [];
+  if (iterable.toArray) {
+    return iterable.toArray();
+  } else {
+    var results = [];
+    for (var i = 0, length = iterable.length; i < length; i++)
+      results.push(iterable[i]);
+    return results;
+  }
+}
+
+Object.extend(Array.prototype, Enumerable);
+
+if (!Array.prototype._reverse)
+  Array.prototype._reverse = Array.prototype.reverse;
+
+Object.extend(Array.prototype, {
+  _each: function(iterator) {
+    for (var i = 0, length = this.length; i < length; i++)
+      iterator(this[i]);
+  },
+
+  clear: function() {
+    this.length = 0;
+    return this;
+  },
+
+  first: function() {
+    return this[0];
+  },
+
+  last: function() {
+    return this[this.length - 1];
+  },
+
+  compact: function() {
+    return this.select(function(value) {
+      return value != null;
+    });
+  },
+
+  flatten: function() {
+    return this.inject([], function(array, value) {
+      return array.concat(value && value.constructor == Array ?
+        value.flatten() : [value]);
+    });
+  },
+
+  without: function() {
+    var values = $A(arguments);
+    return this.select(function(value) {
+      return !values.include(value);
+    });
+  },
+
+  indexOf: function(object) {
+    for (var i = 0, length = this.length; i < length; i++)
+      if (this[i] == object) return i;
+    return -1;
+  },
+
+  reverse: function(inline) {
+    return (inline !== false ? this : this.toArray())._reverse();
+  },
+
+  reduce: function() {
+    return this.length > 1 ? this : this[0];
+  },
+
+  uniq: function() {
+    return this.inject([], function(array, value) {
+      return array.include(value) ? array : array.concat([value]);
+    });
+  },
+
+  clone: function() {
+    return [].concat(this);
+  },
+
+  size: function() {
+    return this.length;
+  },
+
+  inspect: function() {
+    return '[' + this.map(Object.inspect).join(', ') + ']';
+  }
+});
+
+Array.prototype.toArray = Array.prototype.clone;
+
+function $w(string){
+  string = string.strip();
+  return string ? string.split(/\s+/) : [];
+}
+
+if(window.opera){
+  Array.prototype.concat = function(){
+    var array = [];
+    for(var i = 0, length = this.length; i < length; i++) array.push(this[i]);
+    for(var i = 0, length = arguments.length; i < length; i++) {
+      if(arguments[i].constructor == Array) {
+        for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
+          array.push(arguments[i][j]);
+      } else {
+        array.push(arguments[i]);
+      }
+    }
+    return array;
+  }
+}
+var Hash = function(obj) {
+  Object.extend(this, obj || {});
+};
+
+Object.extend(Hash, {
+  toQueryString: function(obj) {
+    var parts = [];
+
+         this.prototype._each.call(obj, function(pair) {
+      if (!pair.key) return;
+
+      if (pair.value && pair.value.constructor == Array) {
+        var values = pair.value.compact();
+        if (values.length < 2) pair.value = values.reduce();
+        else {
+               key = encodeURIComponent(pair.key);
+          values.each(function(value) {
+            value = value != undefined ? encodeURIComponent(value) : '';
+            parts.push(key + '=' + encodeURIComponent(value));
+          });
+          return;
+        }
+      }
+      if (pair.value == undefined) pair[1] = '';
+      parts.push(pair.map(encodeURIComponent).join('='));
+         });
+
+    return parts.join('&');
+  }
+});
+
+Object.extend(Hash.prototype, Enumerable);
+Object.extend(Hash.prototype, {
+  _each: function(iterator) {
+    for (var key in this) {
+      var value = this[key];
+      if (value && value == Hash.prototype[key]) continue;
+
+      var pair = [key, value];
+      pair.key = key;
+      pair.value = value;
+      iterator(pair);
+    }
+  },
+
+  keys: function() {
+    return this.pluck('key');
+  },
+
+  values: function() {
+    return this.pluck('value');
+  },
+
+  merge: function(hash) {
+    return $H(hash).inject(this, function(mergedHash, pair) {
+      mergedHash[pair.key] = pair.value;
+      return mergedHash;
+    });
+  },
+
+  remove: function() {
+    var result;
+    for(var i = 0, length = arguments.length; i < length; i++) {
+      var value = this[arguments[i]];
+      if (value !== undefined){
+        if (result === undefined) result = value;
+        else {
+          if (result.constructor != Array) result = [result];
+          result.push(value)
+        }
+      }
+      delete this[arguments[i]];
+    }
+    return result;
+  },
+
+  toQueryString: function() {
+    return Hash.toQueryString(this);
+  },
+
+  inspect: function() {
+    return '#<Hash:{' + this.map(function(pair) {
+      return pair.map(Object.inspect).join(': ');
+    }).join(', ') + '}>';
+  }
+});
+
+function $H(object) {
+  if (object && object.constructor == Hash) return object;
+  return new Hash(object);
+};
+ObjectRange = Class.create();
+Object.extend(ObjectRange.prototype, Enumerable);
+Object.extend(ObjectRange.prototype, {
+  initialize: function(start, end, exclusive) {
+    this.start = start;
+    this.end = end;
+    this.exclusive = exclusive;
+  },
+
+  _each: function(iterator) {
+    var value = this.start;
+    while (this.include(value)) {
+      iterator(value);
+      value = value.succ();
+    }
+  },
+
+  include: function(value) {
+    if (value < this.start)
+      return false;
+    if (this.exclusive)
+      return value < this.end;
+    return value <= this.end;
+  }
+});
+
+var $R = function(start, end, exclusive) {
+  return new ObjectRange(start, end, exclusive);
+}
+
+var Ajax = {
+  getTransport: function() {
+    return Try.these(
+      function() {return new XMLHttpRequest()},
+      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
+      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
+    ) || false;
+  },
+
+  activeRequestCount: 0
+}
+
+Ajax.Responders = {
+  responders: [],
+
+  _each: function(iterator) {
+    this.responders._each(iterator);
+  },
+
+  register: function(responder) {
+    if (!this.include(responder))
+      this.responders.push(responder);
+  },
+
+  unregister: function(responder) {
+    this.responders = this.responders.without(responder);
+  },
+
+  dispatch: function(callback, request, transport, json) {
+    this.each(function(responder) {
+      if (typeof responder[callback] == 'function') {
+        try {
+          responder[callback].apply(responder, [request, transport, json]);
+        } catch (e) {}
+      }
+    });
+  }
+};
+
+Object.extend(Ajax.Responders, Enumerable);
+
+Ajax.Responders.register({
+  onCreate: function() {
+    Ajax.activeRequestCount++;
+  },
+  onComplete: function() {
+    Ajax.activeRequestCount--;
+  }
+});
+
+Ajax.Base = function() {};
+Ajax.Base.prototype = {
+  setOptions: function(options) {
+    this.options = {
+      method:       'post',
+      asynchronous: true,
+      contentType:  'application/x-www-form-urlencoded',
+      encoding:     'UTF-8',
+      parameters:   ''
+    }
+    Object.extend(this.options, options || {});
+
+    this.options.method = this.options.method.toLowerCase();
+    if (typeof this.options.parameters == 'string')
+      this.options.parameters = this.options.parameters.toQueryParams();
+  }
+}
+
+Ajax.Request = Class.create();
+Ajax.Request.Events =
+  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
+  _complete: false,
+
+  initialize: function(url, options) {
+    this.transport = Ajax.getTransport();
+    this.setOptions(options);
+    this.request(url);
+  },
+
+  request: function(url) {
+    this.url = url;
+    this.method = this.options.method;
+    var params = this.options.parameters;
+
+    if (!['get', 'post'].include(this.method)) {
+      // simulate other verbs over post
+      params['_method'] = this.method;
+      this.method = 'post';
+    }
+
+    params = Hash.toQueryString(params);
+    if (params && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += '&_='
+
+    // when GET, append parameters to URL
+    if (this.method == 'get' && params)
+      this.url += (this.url.indexOf('?') > -1 ? '&' : '?') + params;
+
+    try {
+      Ajax.Responders.dispatch('onCreate', this, this.transport);
+
+      this.transport.open(this.method.toUpperCase(), this.url,
+        this.options.asynchronous);
+
+      if (this.options.asynchronous)
+        setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);
+
+      this.transport.onreadystatechange = this.onStateChange.bind(this);
+      this.setRequestHeaders();
+
+      var body = this.method == 'post' ? (this.options.postBody || params) : null;
+
+      this.transport.send(body);
+
+      /* Force Firefox to handle ready state 4 for synchronous requests */
+      if (!this.options.asynchronous && this.transport.overrideMimeType)
+        this.onStateChange();
+
+    }
+    catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  onStateChange: function() {
+    var readyState = this.transport.readyState;
+    if (readyState > 1 && !((readyState == 4) && this._complete))
+      this.respondToReadyState(this.transport.readyState);
+  },
+
+  setRequestHeaders: function() {
+    var headers = {
+      'X-Requested-With': 'XMLHttpRequest',
+      'X-Prototype-Version': Prototype.Version,
+      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
+    };
+
+    if (this.method == 'post') {
+      headers['Content-type'] = this.options.contentType +
+        (this.options.encoding ? '; charset=' + this.options.encoding : '');
+
+      /* Force "Connection: close" for older Mozilla browsers to work
+       * around a bug where XMLHttpRequest sends an incorrect
+       * Content-length header. See Mozilla Bugzilla #246651.
+       */
+      if (this.transport.overrideMimeType &&
+          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
+            headers['Connection'] = 'close';
+    }
+
+    // user-defined headers
+    if (typeof this.options.requestHeaders == 'object') {
+      var extras = this.options.requestHeaders;
+
+      if (typeof extras.push == 'function')
+        for (var i = 0, length = extras.length; i < length; i += 2)
+          headers[extras[i]] = extras[i+1];
+      else
+        $H(extras).each(function(pair) { headers[pair.key] = pair.value });
+    }
+
+    for (var name in headers)
+      this.transport.setRequestHeader(name, headers[name]);
+  },
+
+  success: function() {
+    return !this.transport.status
+        || (this.transport.status >= 200 && this.transport.status < 300);
+  },
+
+  respondToReadyState: function(readyState) {
+    var state = Ajax.Request.Events[readyState];
+    var transport = this.transport, json = this.evalJSON();
+
+    if (state == 'Complete') {
+      try {
+        this._complete = true;
+        (this.options['on' + this.transport.status]
+         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
+         || Prototype.emptyFunction)(transport, json);
+      } catch (e) {
+        this.dispatchException(e);
+      }
+
+      if ((this.getHeader('Content-type') || 'text/javascript').strip().
+        match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i))
+          this.evalResponse();
+    }
+
+    try {
+      (this.options['on' + state] || Prototype.emptyFunction)(transport, json);
+      Ajax.Responders.dispatch('on' + state, this, transport, json);
+    } catch (e) {
+      this.dispatchException(e);
+    }
+
+    if (state == 'Complete') {
+      // avoid memory leak in MSIE: clean up
+      this.transport.onreadystatechange = Prototype.emptyFunction;
+    }
+  },
+
+  getHeader: function(name) {
+    try {
+      return this.transport.getResponseHeader(name);
+    } catch (e) { return null }
+  },
+
+  evalJSON: function() {
+    try {
+      var json = this.getHeader('X-JSON');
+      return json ? eval('(' + json + ')') : null;
+    } catch (e) { return null }
+  },
+
+  evalResponse: function() {
+    try {
+      return eval(this.transport.responseText);
+    } catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  dispatchException: function(exception) {
+    (this.options.onException || Prototype.emptyFunction)(this, exception);
+    Ajax.Responders.dispatch('onException', this, exception);
+  }
+});
+
+Ajax.Updater = Class.create();
+
+Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
+  initialize: function(container, url, options) {
+    this.container = {
+      success: (container.success || container),
+      failure: (container.failure || (container.success ? null : container))
+    }
+
+    this.transport = Ajax.getTransport();
+    this.setOptions(options);
+
+    var onComplete = this.options.onComplete || Prototype.emptyFunction;
+    this.options.onComplete = (function(transport, param) {
+      this.updateContent();
+      onComplete(transport, param);
+    }).bind(this);
+
+    this.request(url);
+  },
+
+  updateContent: function() {
+    var receiver = this.container[this.success() ? 'success' : 'failure'];
+    var response = this.transport.responseText;
+
+    if (!this.options.evalScripts) response = response.stripScripts();
+
+    if (receiver = $(receiver)) {
+      if (this.options.insertion)
+        new this.options.insertion(receiver, response);
+      else
+        receiver.update(response);
+    }
+
+    if (this.success()) {
+      if (this.onComplete)
+        setTimeout(this.onComplete.bind(this), 10);
+    }
+  }
+});
+
+Ajax.PeriodicalUpdater = Class.create();
+Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
+  initialize: function(container, url, options) {
+    this.setOptions(options);
+    this.onComplete = this.options.onComplete;
+
+    this.frequency = (this.options.frequency || 2);
+    this.decay = (this.options.decay || 1);
+
+    this.updater = {};
+    this.container = container;
+    this.url = url;
+
+    this.start();
+  },
+
+  start: function() {
+    this.options.onComplete = this.updateComplete.bind(this);
+    this.onTimerEvent();
+  },
+
+  stop: function() {
+    this.updater.options.onComplete = undefined;
+    clearTimeout(this.timer);
+    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
+  },
+
+  updateComplete: function(request) {
+    if (this.options.decay) {
+      this.decay = (request.responseText == this.lastText ?
+        this.decay * this.options.decay : 1);
+
+      this.lastText = request.responseText;
+    }
+    this.timer = setTimeout(this.onTimerEvent.bind(this),
+      this.decay * this.frequency * 1000);
+  },
+
+  onTimerEvent: function() {
+    this.updater = new Ajax.Updater(this.container, this.url, this.options);
+  }
+});
+function $(element) {
+  if (arguments.length > 1) {
+    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
+      elements.push($(arguments[i]));
+    return elements;
+  }
+  if (typeof element == 'string')
+    element = document.getElementById(element);
+  return Element.extend(element);
+}
+
+if (Prototype.BrowserFeatures.XPath) {
+  document._getElementsByXPath = function(expression, parentElement) {
+    var results = [];
+    var query = document.evaluate(expression, $(parentElement) || document,
+      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    for (var i = 0, length = query.snapshotLength; i < length; i++)
+      results.push(query.snapshotItem(i));
+    return results;
+  };
+}
+
+document.getElementsByClassName = function(className, parentElement) {
+  if (Prototype.BrowserFeatures.XPath) {
+    var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
+    return document._getElementsByXPath(q, parentElement);
+  } else {
+    var children = ($(parentElement) || document.body).getElementsByTagName('*');
+    var elements = [], child;
+    for (var i = 0, length = children.length; i < length; i++) {
+      child = children[i];
+      if (Element.hasClassName(child, className))
+        elements.push(Element.extend(child));
+    }
+    return elements;
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+if (!window.Element)
+  var Element = new Object();
+
+Element.extend = function(element) {
+  if (!element || _nativeExtensions || element.nodeType == 3) return element;
+
+  if (!element._extended && element.tagName && element != window) {
+    var methods = Object.clone(Element.Methods), cache = Element.extend.cache;
+
+    if (element.tagName == 'FORM')
+      Object.extend(methods, Form.Methods);
+    if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))
+      Object.extend(methods, Form.Element.Methods);
+
+    Object.extend(methods, Element.Methods.Simulated);
+
+    for (var property in methods) {
+      var value = methods[property];
+      if (typeof value == 'function' && !(property in element))
+        element[property] = cache.findOrStore(value);
+    }
+  }
+
+  element._extended = true;
+  return element;
+};
+
+Element.extend.cache = {
+  findOrStore: function(value) {
+    return this[value] = this[value] || function() {
+      return value.apply(null, [this].concat($A(arguments)));
+    }
+  }
+};
+
+Element.Methods = {
+  visible: function(element) {
+    return $(element).style.display != 'none';
+  },
+
+  toggle: function(element) {
+    element = $(element);
+    Element[Element.visible(element) ? 'hide' : 'show'](element);
+    return element;
+  },
+
+  hide: function(element) {
+    $(element).style.display = 'none';
+    return element;
+  },
+
+  show: function(element) {
+    $(element).style.display = '';
+    return element;
+  },
+
+  remove: function(element) {
+    element = $(element);
+    element.parentNode.removeChild(element);
+    return element;
+  },
+
+  update: function(element, html) {
+    html = typeof html == 'undefined' ? '' : html.toString();
+    $(element).innerHTML = html.stripScripts();
+    setTimeout(function() {html.evalScripts()}, 10);
+    return element;
+  },
+
+  replace: function(element, html) {
+    element = $(element);
+    html = typeof html == 'undefined' ? '' : html.toString();
+    if (element.outerHTML) {
+      element.outerHTML = html.stripScripts();
+    } else {
+      var range = element.ownerDocument.createRange();
+      range.selectNodeContents(element);
+      element.parentNode.replaceChild(
+        range.createContextualFragment(html.stripScripts()), element);
+    }
+    setTimeout(function() {html.evalScripts()}, 10);
+    return element;
+  },
+
+  inspect: function(element) {
+    element = $(element);
+    var result = '<' + element.tagName.toLowerCase();
+    $H({'id': 'id', 'className': 'class'}).each(function(pair) {
+      var property = pair.first(), attribute = pair.last();
+      var value = (element[property] || '').toString();
+      if (value) result += ' ' + attribute + '=' + value.inspect(true);
+    });
+    return result + '>';
+  },
+
+  recursivelyCollect: function(element, property) {
+    element = $(element);
+    var elements = [];
+    while (element = element[property])
+      if (element.nodeType == 1)
+        elements.push(Element.extend(element));
+    return elements;
+  },
+
+  ancestors: function(element) {
+    return $(element).recursivelyCollect('parentNode');
+  },
+
+  descendants: function(element) {
+    return $A($(element).getElementsByTagName('*'));
+  },
+
+  immediateDescendants: function(element) {
+    if (!(element = $(element).firstChild)) return [];
+    while (element && element.nodeType != 1) element = element.nextSibling;
+    if (element) return [element].concat($(element).nextSiblings());
+    return [];
+  },
+
+  previousSiblings: function(element) {
+    return $(element).recursivelyCollect('previousSibling');
+  },
+
+  nextSiblings: function(element) {
+    return $(element).recursivelyCollect('nextSibling');
+  },
+
+  siblings: function(element) {
+    element = $(element);
+    return element.previousSiblings().reverse().concat(element.nextSiblings());
+  },
+
+  match: function(element, selector) {
+    if (typeof selector == 'string')
+      selector = new Selector(selector);
+    return selector.match($(element));
+  },
+
+  up: function(element, expression, index) {
+    return Selector.findElement($(element).ancestors(), expression, index);
+  },
+
+  down: function(element, expression, index) {
+    return Selector.findElement($(element).descendants(), expression, index);
+  },
+
+  previous: function(element, expression, index) {
+    return Selector.findElement($(element).previousSiblings(), expression, index);
+  },
+
+  next: function(element, expression, index) {
+    return Selector.findElement($(element).nextSiblings(), expression, index);
+  },
+
+  getElementsBySelector: function() {
+    var args = $A(arguments), element = $(args.shift());
+    return Selector.findChildElements(element, args);
+  },
+
+  getElementsByClassName: function(element, className) {
+    return document.getElementsByClassName(className, element);
+  },
+
+  readAttribute: function(element, name) {
+    element = $(element);
+    if (document.all && !window.opera) {
+      var t = Element._attributeTranslations;
+      if (t.values[name]) return t.values[name](element, name);
+      if (t.names[name])  name = t.names[name];
+      var attribute = element.attributes[name];
+      if(attribute) return attribute.nodeValue;
+    }
+    return element.getAttribute(name);
+  },
+
+  getHeight: function(element) {
+    return $(element).getDimensions().height;
+  },
+
+  getWidth: function(element) {
+    return $(element).getDimensions().width;
+  },
+
+  classNames: function(element) {
+    return new Element.ClassNames(element);
+  },
+
+  hasClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    var elementClassName = element.className;
+    if (elementClassName.length == 0) return false;
+    if (elementClassName == className ||
+        elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
+      return true;
+    return false;
+  },
+
+  addClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    Element.classNames(element).add(className);
+    return element;
+  },
+
+  removeClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    Element.classNames(element).remove(className);
+    return element;
+  },
+
+  toggleClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className);
+    return element;
+  },
+
+  observe: function() {
+    Event.observe.apply(Event, arguments);
+    return $A(arguments).first();
+  },
+
+  stopObserving: function() {
+    Event.stopObserving.apply(Event, arguments);
+    return $A(arguments).first();
+  },
+
+  // removes whitespace-only text node children
+  cleanWhitespace: function(element) {
+    element = $(element);
+    var node = element.firstChild;
+    while (node) {
+      var nextNode = node.nextSibling;
+      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
+        element.removeChild(node);
+      node = nextNode;
+    }
+    return element;
+  },
+
+  empty: function(element) {
+    return $(element).innerHTML.match(/^\s*$/);
+  },
+
+  descendantOf: function(element, ancestor) {
+    element = $(element), ancestor = $(ancestor);
+    while (element = element.parentNode)
+      if (element == ancestor) return true;
+    return false;
+  },
+
+  scrollTo: function(element) {
+    element = $(element);
+    var pos = Position.cumulativeOffset(element);
+    window.scrollTo(pos[0], pos[1]);
+    return element;
+  },
+
+  getStyle: function(element, style) {
+    element = $(element);
+    if (['float','cssFloat'].include(style))
+      style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat');
+    style = style.camelize();
+    var value = element.style[style];
+    if (!value) {
+      if (document.defaultView && document.defaultView.getComputedStyle) {
+        var css = document.defaultView.getComputedStyle(element, null);
+        value = css ? css[style] : null;
+      } else if (element.currentStyle) {
+        value = element.currentStyle[style];
+      }
+    }
+
+    if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none'))
+      value = element['offset'+style.capitalize()] + 'px';
+
+    if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
+      if (Element.getStyle(element, 'position') == 'static') value = 'auto';
+    if(style == 'opacity') {
+      if(value) return parseFloat(value);
+      if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
+        if(value[1]) return parseFloat(value[1]) / 100;
+      return 1.0;
+    }
+    return value == 'auto' ? null : value;
+  },
+
+  setStyle: function(element, style) {
+    element = $(element);
+    for (var name in style) {
+      var value = style[name];
+      if(name == 'opacity') {
+        if (value == 1) {
+          value = (/Gecko/.test(navigator.userAgent) &&
+            !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0;
+          if(/MSIE/.test(navigator.userAgent) && !window.opera)
+            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
+        } else if(value == '') {
+          if(/MSIE/.test(navigator.userAgent) && !window.opera)
+            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
+        } else {
+          if(value < 0.00001) value = 0;
+          if(/MSIE/.test(navigator.userAgent) && !window.opera)
+            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +
+              'alpha(opacity='+value*100+')';
+        }
+      } else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat';
+      element.style[name.camelize()] = value;
+    }
+    return element;
+  },
+
+  getDimensions: function(element) {
+    element = $(element);
+    var display = $(element).getStyle('display');
+    if (display != 'none' && display != null) // Safari bug
+      return {width: element.offsetWidth, height: element.offsetHeight};
+
+    // All *Width and *Height properties give 0 on elements with display none,
+    // so enable the element temporarily
+    var els = element.style;
+    var originalVisibility = els.visibility;
+    var originalPosition = els.position;
+    var originalDisplay = els.display;
+    els.visibility = 'hidden';
+    els.position = 'absolute';
+    els.display = 'block';
+    var originalWidth = element.clientWidth;
+    var originalHeight = element.clientHeight;
+    els.display = originalDisplay;
+    els.position = originalPosition;
+    els.visibility = originalVisibility;
+    return {width: originalWidth, height: originalHeight};
+  },
+
+  makePositioned: function(element) {
+    element = $(element);
+    var pos = Element.getStyle(element, 'position');
+    if (pos == 'static' || !pos) {
+      element._madePositioned = true;
+      element.style.position = 'relative';
+      // Opera returns the offset relative to the positioning context, when an
+      // element is position relative but top and left have not been defined
+      if (window.opera) {
+        element.style.top = 0;
+        element.style.left = 0;
+      }
+    }
+    return element;
+  },
+
+  undoPositioned: function(element) {
+    element = $(element);
+    if (element._madePositioned) {
+      element._madePositioned = undefined;
+      element.style.position =
+        element.style.top =
+        element.style.left =
+        element.style.bottom =
+        element.style.right = '';
+    }
+    return element;
+  },
+
+  makeClipping: function(element) {
+    element = $(element);
+    if (element._overflow) return element;
+    element._overflow = element.style.overflow || 'auto';
+    if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
+      element.style.overflow = 'hidden';
+    return element;
+  },
+
+  undoClipping: function(element) {
+    element = $(element);
+    if (!element._overflow) return element;
+    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
+    element._overflow = null;
+    return element;
+  }
+};
+
+Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf});
+
+Element._attributeTranslations = {};
+
+Element._attributeTranslations.names = {
+  colspan:   "colSpan",
+  rowspan:   "rowSpan",
+  valign:    "vAlign",
+  datetime:  "dateTime",
+  accesskey: "accessKey",
+  tabindex:  "tabIndex",
+  enctype:   "encType",
+  maxlength: "maxLength",
+  readonly:  "readOnly",
+  longdesc:  "longDesc"
+};
+
+Element._attributeTranslations.values = {
+  _getAttr: function(element, attribute) {
+    return element.getAttribute(attribute, 2);
+  },
+
+  _flag: function(element, attribute) {
+    return $(element).hasAttribute(attribute) ? attribute : null;
+  },
+
+  style: function(element) {
+    return element.style.cssText.toLowerCase();
+  },
+
+  title: function(element) {
+    var node = element.getAttributeNode('title');
+    return node.specified ? node.nodeValue : null;
+  }
+};
+
+Object.extend(Element._attributeTranslations.values, {
+  href: Element._attributeTranslations.values._getAttr,
+  src:  Element._attributeTranslations.values._getAttr,
+  disabled: Element._attributeTranslations.values._flag,
+  checked:  Element._attributeTranslations.values._flag,
+  readonly: Element._attributeTranslations.values._flag,
+  multiple: Element._attributeTranslations.values._flag
+});
+
+Element.Methods.Simulated = {
+  hasAttribute: function(element, attribute) {
+    var t = Element._attributeTranslations;
+    attribute = t.names[attribute] || attribute;
+    return $(element).getAttributeNode(attribute).specified;
+  }
+};
+
+// IE is missing .innerHTML support for TABLE-related elements
+if (document.all && !window.opera){
+  Element.Methods.update = function(element, html) {
+    element = $(element);
+    html = typeof html == 'undefined' ? '' : html.toString();
+    var tagName = element.tagName.toUpperCase();
+    if (['THEAD','TBODY','TR','TD'].include(tagName)) {
+      var div = document.createElement('div');
+      switch (tagName) {
+        case 'THEAD':
+        case 'TBODY':
+          div.innerHTML = '<table><tbody>' +  html.stripScripts() + '</tbody></table>';
+          depth = 2;
+          break;
+        case 'TR':
+          div.innerHTML = '<table><tbody><tr>' +  html.stripScripts() + '</tr></tbody></table>';
+          depth = 3;
+          break;
+        case 'TD':
+          div.innerHTML = '<table><tbody><tr><td>' +  html.stripScripts() + '</td></tr></tbody></table>';
+          depth = 4;
+      }
+      $A(element.childNodes).each(function(node){
+        element.removeChild(node)
+      });
+      depth.times(function(){ div = div.firstChild });
+
+      $A(div.childNodes).each(
+        function(node){ element.appendChild(node) });
+    } else {
+      element.innerHTML = html.stripScripts();
+    }
+    setTimeout(function() {html.evalScripts()}, 10);
+    return element;
+  }
+};
+
+Object.extend(Element, Element.Methods);
+
+var _nativeExtensions = false;
+
+if(/Konqueror|Safari|KHTML/.test(navigator.userAgent))
+  ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {
+    var className = 'HTML' + tag + 'Element';
+    if(window[className]) return;
+    var klass = window[className] = {};
+    klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__;
+  });
+
+Element.addMethods = function(methods) {
+  Object.extend(Element.Methods, methods || {});
+
+  function copy(methods, destination, onlyIfAbsent) {
+    onlyIfAbsent = onlyIfAbsent || false;
+    var cache = Element.extend.cache;
+    for (var property in methods) {
+      var value = methods[property];
+      if (!onlyIfAbsent || !(property in destination))
+        destination[property] = cache.findOrStore(value);
+    }
+  }
+
+  if (typeof HTMLElement != 'undefined') {
+    copy(Element.Methods, HTMLElement.prototype);
+    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
+    copy(Form.Methods, HTMLFormElement.prototype);
+    [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {
+      copy(Form.Element.Methods, klass.prototype);
+    });
+    _nativeExtensions = true;
+  }
+}
+
+var Toggle = new Object();
+Toggle.display = Element.toggle;
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.Insertion = function(adjacency) {
+  this.adjacency = adjacency;
+}
+
+Abstract.Insertion.prototype = {
+  initialize: function(element, content) {
+    this.element = $(element);
+    this.content = content.stripScripts();
+
+    if (this.adjacency && this.element.insertAdjacentHTML) {
+      try {
+        this.element.insertAdjacentHTML(this.adjacency, this.content);
+      } catch (e) {
+        var tagName = this.element.tagName.toUpperCase();
+        if (['TBODY', 'TR'].include(tagName)) {
+          this.insertContent(this.contentFromAnonymousTable());
+        } else {
+          throw e;
+        }
+      }
+    } else {
+      this.range = this.element.ownerDocument.createRange();
+      if (this.initializeRange) this.initializeRange();
+      this.insertContent([this.range.createContextualFragment(this.content)]);
+    }
+
+    setTimeout(function() {content.evalScripts()}, 10);
+  },
+
+  contentFromAnonymousTable: function() {
+    var div = document.createElement('div');
+    div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
+    return $A(div.childNodes[0].childNodes[0].childNodes);
+  }
+}
+
+var Insertion = new Object();
+
+Insertion.Before = Class.create();
+Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
+  initializeRange: function() {
+    this.range.setStartBefore(this.element);
+  },
+
+  insertContent: function(fragments) {
+    fragments.each((function(fragment) {
+      this.element.parentNode.insertBefore(fragment, this.element);
+    }).bind(this));
+  }
+});
+
+Insertion.Top = Class.create();
+Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
+  initializeRange: function() {
+    this.range.selectNodeContents(this.element);
+    this.range.collapse(true);
+  },
+
+  insertContent: function(fragments) {
+    fragments.reverse(false).each((function(fragment) {
+      this.element.insertBefore(fragment, this.element.firstChild);
+    }).bind(this));
+  }
+});
+
+Insertion.Bottom = Class.create();
+Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
+  initializeRange: function() {
+    this.range.selectNodeContents(this.element);
+    this.range.collapse(this.element);
+  },
+
+  insertContent: function(fragments) {
+    fragments.each((function(fragment) {
+      this.element.appendChild(fragment);
+    }).bind(this));
+  }
+});
+
+Insertion.After = Class.create();
+Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
+  initializeRange: function() {
+    this.range.setStartAfter(this.element);
+  },
+
+  insertContent: function(fragments) {
+    fragments.each((function(fragment) {
+      this.element.parentNode.insertBefore(fragment,
+        this.element.nextSibling);
+    }).bind(this));
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Element.ClassNames = Class.create();
+Element.ClassNames.prototype = {
+  initialize: function(element) {
+    this.element = $(element);
+  },
+
+  _each: function(iterator) {
+    this.element.className.split(/\s+/).select(function(name) {
+      return name.length > 0;
+    })._each(iterator);
+  },
+
+  set: function(className) {
+    this.element.className = className;
+  },
+
+  add: function(classNameToAdd) {
+    if (this.include(classNameToAdd)) return;
+    this.set($A(this).concat(classNameToAdd).join(' '));
+  },
+
+  remove: function(classNameToRemove) {
+    if (!this.include(classNameToRemove)) return;
+    this.set($A(this).without(classNameToRemove).join(' '));
+  },
+
+  toString: function() {
+    return $A(this).join(' ');
+  }
+};
+
+Object.extend(Element.ClassNames.prototype, Enumerable);
+var Selector = Class.create();
+Selector.prototype = {
+  initialize: function(expression) {
+    this.params = {classNames: []};
+    this.expression = expression.toString().strip();
+    this.parseExpression();
+    this.compileMatcher();
+  },
+
+  parseExpression: function() {
+    function abort(message) { throw 'Parse error in selector: ' + message; }
+
+    if (this.expression == '')  abort('empty expression');
+
+    var params = this.params, expr = this.expression, match, modifier, clause, rest;
+    while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {
+      params.attributes = params.attributes || [];
+      params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});
+      expr = match[1];
+    }
+
+    if (expr == '*') return this.params.wildcard = true;
+
+    while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {
+      modifier = match[1], clause = match[2], rest = match[3];
+      switch (modifier) {
+        case '#':       params.id = clause; break;
+        case '.':       params.classNames.push(clause); break;
+        case '':
+        case undefined: params.tagName = clause.toUpperCase(); break;
+        default:        abort(expr.inspect());
+      }
+      expr = rest;
+    }
+
+    if (expr.length > 0) abort(expr.inspect());
+  },
+
+  buildMatchExpression: function() {
+    var params = this.params, conditions = [], clause;
+
+    if (params.wildcard)
+      conditions.push('true');
+    if (clause = params.id)
+      conditions.push('element.readAttribute("id") == ' + clause.inspect());
+    if (clause = params.tagName)
+      conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());
+    if ((clause = params.classNames).length > 0)
+      for (var i = 0, length = clause.length; i < length; i++)
+        conditions.push('element.hasClassName(' + clause[i].inspect() + ')');
+    if (clause = params.attributes) {
+      clause.each(function(attribute) {
+        var value = 'element.readAttribute(' + attribute.name.inspect() + ')';
+        var splitValueBy = function(delimiter) {
+          return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';
+        }
+
+        switch (attribute.operator) {
+          case '=':       conditions.push(value + ' == ' + attribute.value.inspect()); break;
+          case '~=':      conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break;
+          case '|=':      conditions.push(
+                            splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect()
+                          ); break;
+          case '!=':      conditions.push(value + ' != ' + attribute.value.inspect()); break;
+          case '':
+          case undefined: conditions.push('element.hasAttribute(' + attribute.name.inspect() + ')'); break;
+          default:        throw 'Unknown operator ' + attribute.operator + ' in selector';
+        }
+      });
+    }
+
+    return conditions.join(' && ');
+  },
+
+  compileMatcher: function() {
+    this.match = new Function('element', 'if (!element.tagName) return false; \
+      element = $(element); \
+      return ' + this.buildMatchExpression());
+  },
+
+  findElements: function(scope) {
+    var element;
+
+    if (element = $(this.params.id))
+      if (this.match(element))
+        if (!scope || Element.childOf(element, scope))
+          return [element];
+
+    scope = (scope || document).getElementsByTagName(this.params.tagName || '*');
+
+    var results = [];
+    for (var i = 0, length = scope.length; i < length; i++)
+      if (this.match(element = scope[i]))
+        results.push(Element.extend(element));
+
+    return results;
+  },
+
+  toString: function() {
+    return this.expression;
+  }
+}
+
+Object.extend(Selector, {
+  matchElements: function(elements, expression) {
+    var selector = new Selector(expression);
+    return elements.select(selector.match.bind(selector)).map(Element.extend);
+  },
+
+  findElement: function(elements, expression, index) {
+    if (typeof expression == 'number') index = expression, expression = false;
+    return Selector.matchElements(elements, expression || '*')[index || 0];
+  },
+
+  findChildElements: function(element, expressions) {
+    return expressions.map(function(expression) {
+      return expression.match(/[^\s"]+(?:"[^"]*"[^\s"]+)*/g).inject([null], function(results, expr) {
+        var selector = new Selector(expr);
+        return results.inject([], function(elements, result) {
+          return elements.concat(selector.findElements(result || element));
+        });
+      });
+    }).flatten();
+  }
+});
+
+function $$() {
+  return Selector.findChildElements(document, $A(arguments));
+}
+var Form = {
+  reset: function(form) {
+    $(form).reset();
+    return form;
+  },
+
+  serializeElements: function(elements, getHash) {
+    var data = elements.inject({}, function(result, element) {
+      if (!element.disabled && element.name) {
+        var key = element.name, value = $(element).getValue();
+        if (value != undefined) {
+          if (result[key]) {
+            if (result[key].constructor != Array) result[key] = [result[key]];
+            result[key].push(value);
+          }
+          else result[key] = value;
+        }
+      }
+      return result;
+    });
+
+    return getHash ? data : Hash.toQueryString(data);
+  }
+};
+
+Form.Methods = {
+  serialize: function(form, getHash) {
+    return Form.serializeElements(Form.getElements(form), getHash);
+  },
+
+  getElements: function(form) {
+    return $A($(form).getElementsByTagName('*')).inject([],
+      function(elements, child) {
+        if (Form.Element.Serializers[child.tagName.toLowerCase()])
+          elements.push(Element.extend(child));
+        return elements;
+      }
+    );
+  },
+
+  getInputs: function(form, typeName, name) {
+    form = $(form);
+    var inputs = form.getElementsByTagName('input');
+
+    if (!typeName && !name) return $A(inputs).map(Element.extend);
+
+    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
+      var input = inputs[i];
+      if ((typeName && input.type != typeName) || (name && input.name != name))
+        continue;
+      matchingInputs.push(Element.extend(input));
+    }
+
+    return matchingInputs;
+  },
+
+  disable: function(form) {
+    form = $(form);
+    form.getElements().each(function(element) {
+      element.blur();
+      element.disabled = 'true';
+    });
+    return form;
+  },
+
+  enable: function(form) {
+    form = $(form);
+    form.getElements().each(function(element) {
+      element.disabled = '';
+    });
+    return form;
+  },
+
+  findFirstElement: function(form) {
+    return $(form).getElements().find(function(element) {
+      return element.type != 'hidden' && !element.disabled &&
+        ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
+    });
+  },
+
+  focusFirstElement: function(form) {
+    form = $(form);
+    form.findFirstElement().activate();
+    return form;
+  }
+}
+
+Object.extend(Form, Form.Methods);
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element = {
+  focus: function(element) {
+    $(element).focus();
+    return element;
+  },
+
+  select: function(element) {
+    $(element).select();
+    return element;
+  }
+}
+
+Form.Element.Methods = {
+  serialize: function(element) {
+    element = $(element);
+    if (!element.disabled && element.name) {
+      var value = element.getValue();
+      if (value != undefined) {
+        var pair = {};
+        pair[element.name] = value;
+        return Hash.toQueryString(pair);
+      }
+    }
+    return '';
+  },
+
+  getValue: function(element) {
+    element = $(element);
+    var method = element.tagName.toLowerCase();
+    return Form.Element.Serializers[method](element);
+  },
+
+  clear: function(element) {
+    $(element).value = '';
+    return element;
+  },
+
+  present: function(element) {
+    return $(element).value != '';
+  },
+
+  activate: function(element) {
+    element = $(element);
+    element.focus();
+    if (element.select && ( element.tagName.toLowerCase() != 'input' ||
+      !['button', 'reset', 'submit'].include(element.type) ) )
+      element.select();
+    return element;
+  },
+
+  disable: function(element) {
+    element = $(element);
+    element.disabled = true;
+    return element;
+  },
+
+  enable: function(element) {
+    element = $(element);
+    element.blur();
+    element.disabled = false;
+    return element;
+  }
+}
+
+Object.extend(Form.Element, Form.Element.Methods);
+var Field = Form.Element;
+var $F = Form.Element.getValue;
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element.Serializers = {
+  input: function(element) {
+    switch (element.type.toLowerCase()) {
+      case 'checkbox':
+      case 'radio':
+        return Form.Element.Serializers.inputSelector(element);
+      default:
+        return Form.Element.Serializers.textarea(element);
+    }
+  },
+
+  inputSelector: function(element) {
+    return element.checked ? element.value : null;
+  },
+
+  textarea: function(element) {
+    return element.value;
+  },
+
+  select: function(element) {
+    return this[element.type == 'select-one' ?
+      'selectOne' : 'selectMany'](element);
+  },
+
+  selectOne: function(element) {
+    var index = element.selectedIndex;
+    return index >= 0 ? this.optionValue(element.options[index]) : null;
+  },
+
+  selectMany: function(element) {
+    var values, length = element.length;
+    if (!length) return null;
+
+    for (var i = 0, values = []; i < length; i++) {
+      var opt = element.options[i];
+      if (opt.selected) values.push(this.optionValue(opt));
+    }
+    return values;
+  },
+
+  optionValue: function(opt) {
+    // extend element because hasAttribute may not be native
+    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.TimedObserver = function() {}
+Abstract.TimedObserver.prototype = {
+  initialize: function(element, frequency, callback) {
+    this.frequency = frequency;
+    this.element   = $(element);
+    this.callback  = callback;
+
+    this.lastValue = this.getValue();
+    this.registerCallback();
+  },
+
+  registerCallback: function() {
+    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+
+  onTimerEvent: function() {
+    var value = this.getValue();
+    var changed = ('string' == typeof this.lastValue && 'string' == typeof value
+      ? this.lastValue != value : String(this.lastValue) != String(value));
+    if (changed) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  }
+}
+
+Form.Element.Observer = Class.create();
+Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.Observer = Class.create();
+Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.EventObserver = function() {}
+Abstract.EventObserver.prototype = {
+  initialize: function(element, callback) {
+    this.element  = $(element);
+    this.callback = callback;
+
+    this.lastValue = this.getValue();
+    if (this.element.tagName.toLowerCase() == 'form')
+      this.registerFormCallbacks();
+    else
+      this.registerCallback(this.element);
+  },
+
+  onElementEvent: function() {
+    var value = this.getValue();
+    if (this.lastValue != value) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  },
+
+  registerFormCallbacks: function() {
+    Form.getElements(this.element).each(this.registerCallback.bind(this));
+  },
+
+  registerCallback: function(element) {
+    if (element.type) {
+      switch (element.type.toLowerCase()) {
+        case 'checkbox':
+        case 'radio':
+          Event.observe(element, 'click', this.onElementEvent.bind(this));
+          break;
+        default:
+          Event.observe(element, 'change', this.onElementEvent.bind(this));
+          break;
+      }
+    }
+  }
+}
+
+Form.Element.EventObserver = Class.create();
+Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.EventObserver = Class.create();
+Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+if (!window.Event) {
+  var Event = new Object();
+}
+
+Object.extend(Event, {
+  KEY_BACKSPACE: 8,
+  KEY_TAB:       9,
+  KEY_RETURN:   13,
+  KEY_ESC:      27,
+  KEY_LEFT:     37,
+  KEY_UP:       38,
+  KEY_RIGHT:    39,
+  KEY_DOWN:     40,
+  KEY_DELETE:   46,
+  KEY_HOME:     36,
+  KEY_END:      35,
+  KEY_PAGEUP:   33,
+  KEY_PAGEDOWN: 34,
+
+  element: function(event) {
+    return event.target || event.srcElement;
+  },
+
+  isLeftClick: function(event) {
+    return (((event.which) && (event.which == 1)) ||
+            ((event.button) && (event.button == 1)));
+  },
+
+  pointerX: function(event) {
+    return event.pageX || (event.clientX +
+      (document.documentElement.scrollLeft || document.body.scrollLeft));
+  },
+
+  pointerY: function(event) {
+    return event.pageY || (event.clientY +
+      (document.documentElement.scrollTop || document.body.scrollTop));
+  },
+
+  stop: function(event) {
+    if (event.preventDefault) {
+      event.preventDefault();
+      event.stopPropagation();
+    } else {
+      event.returnValue = false;
+      event.cancelBubble = true;
+    }
+  },
+
+  // find the first node with the given tagName, starting from the
+  // node the event was triggered on; traverses the DOM upwards
+  findElement: function(event, tagName) {
+    var element = Event.element(event);
+    while (element.parentNode && (!element.tagName ||
+        (element.tagName.toUpperCase() != tagName.toUpperCase())))
+      element = element.parentNode;
+    return element;
+  },
+
+  observers: false,
+
+  _observeAndCache: function(element, name, observer, useCapture) {
+    if (!this.observers) this.observers = [];
+    if (element.addEventListener) {
+      this.observers.push([element, name, observer, useCapture]);
+      element.addEventListener(name, observer, useCapture);
+    } else if (element.attachEvent) {
+      this.observers.push([element, name, observer, useCapture]);
+      element.attachEvent('on' + name, observer);
+    }
+  },
+
+  unloadCache: function() {
+    if (!Event.observers) return;
+    for (var i = 0, length = Event.observers.length; i < length; i++) {
+      Event.stopObserving.apply(this, Event.observers[i]);
+      Event.observers[i][0] = null;
+    }
+    Event.observers = false;
+  },
+
+  observe: function(element, name, observer, useCapture) {
+    element = $(element);
+    useCapture = useCapture || false;
+
+    if (name == 'keypress' &&
+        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
+        || element.attachEvent))
+      name = 'keydown';
+
+    Event._observeAndCache(element, name, observer, useCapture);
+  },
+
+  stopObserving: function(element, name, observer, useCapture) {
+    element = $(element);
+    useCapture = useCapture || false;
+
+    if (name == 'keypress' &&
+        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
+        || element.detachEvent))
+      name = 'keydown';
+
+    if (element.removeEventListener) {
+      element.removeEventListener(name, observer, useCapture);
+    } else if (element.detachEvent) {
+      try {
+        element.detachEvent('on' + name, observer);
+      } catch (e) {}
+    }
+  }
+});
+
+/* prevent memory leaks in IE */
+if (navigator.appVersion.match(/\bMSIE\b/))
+  Event.observe(window, 'unload', Event.unloadCache, false);
+var Position = {
+  // set to true if needed, warning: firefox performance problems
+  // NOT neeeded for page scrolling, only if draggable contained in
+  // scrollable elements
+  includeScrollOffsets: false,
+
+  // must be called before calling withinIncludingScrolloffset, every time the
+  // page is scrolled
+  prepare: function() {
+    this.deltaX =  window.pageXOffset
+                || document.documentElement.scrollLeft
+                || document.body.scrollLeft
+                || 0;
+    this.deltaY =  window.pageYOffset
+                || document.documentElement.scrollTop
+                || document.body.scrollTop
+                || 0;
+  },
+
+  realOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.scrollTop  || 0;
+      valueL += element.scrollLeft || 0;
+      element = element.parentNode;
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  cumulativeOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  positionedOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+      if (element) {
+        if(element.tagName=='BODY') break;
+        var p = Element.getStyle(element, 'position');
+        if (p == 'relative' || p == 'absolute') break;
+      }
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  offsetParent: function(element) {
+    if (element.offsetParent) return element.offsetParent;
+    if (element == document.body) return element;
+
+    while ((element = element.parentNode) && element != document.body)
+      if (Element.getStyle(element, 'position') != 'static')
+        return element;
+
+    return document.body;
+  },
+
+  // caches x/y coordinate pair to use with overlap
+  within: function(element, x, y) {
+    if (this.includeScrollOffsets)
+      return this.withinIncludingScrolloffsets(element, x, y);
+    this.xcomp = x;
+    this.ycomp = y;
+    this.offset = this.cumulativeOffset(element);
+
+    return (y >= this.offset[1] &&
+            y <  this.offset[1] + element.offsetHeight &&
+            x >= this.offset[0] &&
+            x <  this.offset[0] + element.offsetWidth);
+  },
+
+  withinIncludingScrolloffsets: function(element, x, y) {
+    var offsetcache = this.realOffset(element);
+
+    this.xcomp = x + offsetcache[0] - this.deltaX;
+    this.ycomp = y + offsetcache[1] - this.deltaY;
+    this.offset = this.cumulativeOffset(element);
+
+    return (this.ycomp >= this.offset[1] &&
+            this.ycomp <  this.offset[1] + element.offsetHeight &&
+            this.xcomp >= this.offset[0] &&
+            this.xcomp <  this.offset[0] + element.offsetWidth);
+  },
+
+  // within must be called directly before
+  overlap: function(mode, element) {
+    if (!mode) return 0;
+    if (mode == 'vertical')
+      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
+        element.offsetHeight;
+    if (mode == 'horizontal')
+      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
+        element.offsetWidth;
+  },
+
+  page: function(forElement) {
+    var valueT = 0, valueL = 0;
+
+    var element = forElement;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+
+      // Safari fix
+      if (element.offsetParent==document.body)
+        if (Element.getStyle(element,'position')=='absolute') break;
+
+    } while (element = element.offsetParent);
+
+    element = forElement;
+    do {
+      if (!window.opera || element.tagName=='BODY') {
+        valueT -= element.scrollTop  || 0;
+        valueL -= element.scrollLeft || 0;
+      }
+    } while (element = element.parentNode);
+
+    return [valueL, valueT];
+  },
+
+  clone: function(source, target) {
+    var options = Object.extend({
+      setLeft:    true,
+      setTop:     true,
+      setWidth:   true,
+      setHeight:  true,
+      offsetTop:  0,
+      offsetLeft: 0
+    }, arguments[2] || {})
+
+    // find page position of source
+    source = $(source);
+    var p = Position.page(source);
+
+    // find coordinate system to use
+    target = $(target);
+    var delta = [0, 0];
+    var parent = null;
+    // delta [0,0] will do fine with position: fixed elements,
+    // position:absolute needs offsetParent deltas
+    if (Element.getStyle(target,'position') == 'absolute') {
+      parent = Position.offsetParent(target);
+      delta = Position.page(parent);
+    }
+
+    // correct by body offsets (fixes Safari)
+    if (parent == document.body) {
+      delta[0] -= document.body.offsetLeft;
+      delta[1] -= document.body.offsetTop;
+    }
+
+    // set position
+    if(options.setLeft)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
+    if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
+    if(options.setWidth)  target.style.width = source.offsetWidth + 'px';
+    if(options.setHeight) target.style.height = source.offsetHeight + 'px';
+  },
+
+  absolutize: function(element) {
+    element = $(element);
+    if (element.style.position == 'absolute') return;
+    Position.prepare();
+
+    var offsets = Position.positionedOffset(element);
+    var top     = offsets[1];
+    var left    = offsets[0];
+    var width   = element.clientWidth;
+    var height  = element.clientHeight;
+
+    element._originalLeft   = left - parseFloat(element.style.left  || 0);
+    element._originalTop    = top  - parseFloat(element.style.top || 0);
+    element._originalWidth  = element.style.width;
+    element._originalHeight = element.style.height;
+
+    element.style.position = 'absolute';
+    element.style.top    = top + 'px';
+    element.style.left   = left + 'px';
+    element.style.width  = width + 'px';
+    element.style.height = height + 'px';
+  },
+
+  relativize: function(element) {
+    element = $(element);
+    if (element.style.position == 'relative') return;
+    Position.prepare();
+
+    element.style.position = 'relative';
+    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
+    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
+
+    element.style.top    = top + 'px';
+    element.style.left   = left + 'px';
+    element.style.height = element._originalHeight;
+    element.style.width  = element._originalWidth;
+  }
+}
+
+// Safari returns margins on body which is incorrect if the child is absolutely
+// positioned.  For performance reasons, redefine Position.cumulativeOffset for
+// KHTML/WebKit only.
+if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
+  Position.cumulativeOffset = function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      if (element.offsetParent == document.body)
+        if (Element.getStyle(element, 'position') == 'absolute') break;
+
+      element = element.offsetParent;
+    } while (element);
+
+    return [valueL, valueT];
+  }
+}
+
+Element.addMethods();
\ No newline at end of file
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644 (file)
index 0000000..4ab9e89
--- /dev/null
@@ -0,0 +1 @@
+# See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
\ No newline at end of file
diff --git a/public/stylesheets/default.css b/public/stylesheets/default.css
new file mode 100644 (file)
index 0000000..72efa6e
--- /dev/null
@@ -0,0 +1,64 @@
+/************************************************** 全体*/
+* {
+  margin: 0;
+  font-size: 18px;
+}
+
+img {
+  border: 0px;
+}
+
+html, body {
+  background-color: #ffffff;
+  margin: 0px;
+  padding: 0px;
+  width: 900px;
+  height: 100%;
+  margin: 0px auto;
+}
+
+div.result {
+  font-color: red;
+}
+
+p {
+  margin-top: 8px;
+  margin-bottom: 8px;
+}
+
+ruby {
+  display:inline-table !important;
+  text-align:center !important;
+  white-space:nowrap !important;
+  text-indent:0 !important;
+  margin:0 !important;
+  vertical-align:text-bottom !important;
+  line-height:1 !important;
+}
+
+ruby>rb,ruby>rbc {
+  display:table-row-group !important;
+  line-height:1.0 !important;
+}
+
+ruby>rt,ruby>rbc+rtc {
+  display:table-header-group !important;
+  font-size:51% !important;
+  line-height:1.0 !important;
+  letter-spacing:0 !important;
+}
+
+ruby>rbc+rtc+rtc {
+  display:table-footer-group !important;
+  font-size:51% !important;
+  line-height:1.0 !important;
+  letter-spacing:0 !important;
+}
+
+rbc>rb,rtc>rt {
+  display:table-cell !important;
+  letter-spacing:0 !important;
+}
+rp {
+  display:none !important;
+}
diff --git a/public/stylesheets/hateda.css b/public/stylesheets/hateda.css
new file mode 100644 (file)
index 0000000..e5d3eab
--- /dev/null
@@ -0,0 +1,9 @@
+/************************************************** 全体*/
+div.yomi {
+  margin-left: 30px;
+}
+
+div.content {
+  margin-left: 30px;
+}
+
diff --git a/public/stylesheets/letter.css b/public/stylesheets/letter.css
new file mode 100644 (file)
index 0000000..5454034
--- /dev/null
@@ -0,0 +1,22 @@
+/************************************************** 全体*/
+div.letter {
+  margin-left: 30px;
+  font-size: 150%;
+}
+
+div.yomi {
+  margin-left: 30px;
+}
+
+div.content {
+  margin-left: 30px;
+}
+
+div.section-list {
+  margin-left: 30px;
+}
+
+div.more {
+  margin-left: 30px;
+}
+
diff --git a/public/stylesheets/scaffold.css b/public/stylesheets/scaffold.css
new file mode 100644 (file)
index 0000000..8f239a3
--- /dev/null
@@ -0,0 +1,74 @@
+body { background-color: #fff; color: #333; }
+
+body, p, ol, ul, td {
+  font-family: verdana, arial, helvetica, sans-serif;
+  font-size:   13px;
+  line-height: 18px;
+}
+
+pre {
+  background-color: #eee;
+  padding: 10px;
+  font-size: 11px;
+}
+
+a { color: #000; }
+a:visited { color: #666; }
+a:hover { color: #fff; background-color:#000; }
+
+.fieldWithErrors {
+  padding: 2px;
+  background-color: red;
+  display: table;
+}
+
+#errorExplanation {
+  width: 400px;
+  border: 2px solid red;
+  padding: 7px;
+  padding-bottom: 12px;
+  margin-bottom: 20px;
+  background-color: #f0f0f0;
+}
+
+#errorExplanation h2 {
+  text-align: left;
+  font-weight: bold;
+  padding: 5px 5px 5px 15px;
+  font-size: 12px;
+  margin: -7px;
+  background-color: #c00;
+  color: #fff;
+}
+
+#errorExplanation p {
+  color: #333;
+  margin-bottom: 0;
+  padding: 5px;
+}
+
+#errorExplanation ul li {
+  font-size: 12px;
+  list-style: square;
+}
+
+div.uploadStatus {
+  margin: 5px;
+}
+
+div.progressBar {
+  margin: 5px;
+}
+
+div.progressBar div.border {
+  background-color: #fff;
+  border: 1px solid grey;
+  width: 100%;
+}
+
+div.progressBar div.background {
+  background-color: #333;
+  height: 18px;
+  width: 0%;
+}
+
diff --git a/public/stylesheets/section.css b/public/stylesheets/section.css
new file mode 100644 (file)
index 0000000..b48d937
--- /dev/null
@@ -0,0 +1,62 @@
+/************************************************** 全体*/
+div.source {
+  margin-left: 30px;
+}
+
+div.japanese {
+  margin-left: 30px;
+}
+
+div.myself {
+  margin-left: 30px;
+}
+
+div.note {
+  margin-left: 30px;
+}
+
+div.etc {
+  margin-left: 30px;
+}
+
+div.thema-list {
+  margin-left: 30px;
+}
+
+div.hint {
+  margin-left: 30px;
+}
+
+div.hint-letter {
+  margin-left: 30px;
+}
+
+div.hint-word {
+  margin-left: 30px;
+}
+
+div.hint-phrase {
+  margin-left: 30px;
+}
+
+div.trans {
+  margin-left: 30px;
+}
+
+div.english {
+  margin-left: 30px;
+}
+
+a.checked {
+  background-color: #a8ffa8;
+}
+
+tr {
+  valign: top;
+}
+tr {
+  vertical-align: top;
+}
+table.td {
+  vertical-align: top;
+}
diff --git a/public/stylesheets/thema.css b/public/stylesheets/thema.css
new file mode 100644 (file)
index 0000000..2c67f0b
--- /dev/null
@@ -0,0 +1,12 @@
+/************************************************** 全体*/
+div.caption {
+  margin-left: 30px;
+}
+
+div.content {
+  margin-left: 30px;
+}
+
+tr {
+  vertical-align: top;
+}
diff --git a/public/stylesheets/words.css b/public/stylesheets/words.css
new file mode 100644 (file)
index 0000000..5454034
--- /dev/null
@@ -0,0 +1,22 @@
+/************************************************** 全体*/
+div.letter {
+  margin-left: 30px;
+  font-size: 150%;
+}
+
+div.yomi {
+  margin-left: 30px;
+}
+
+div.content {
+  margin-left: 30px;
+}
+
+div.section-list {
+  margin-left: 30px;
+}
+
+div.more {
+  margin-left: 30px;
+}
+
diff --git a/script/about b/script/about
new file mode 100644 (file)
index 0000000..7b07d46
--- /dev/null
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../config/boot'
+require 'commands/about'
\ No newline at end of file
diff --git a/script/breakpointer b/script/breakpointer
new file mode 100644 (file)
index 0000000..64af76e
--- /dev/null
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../config/boot'
+require 'commands/breakpointer'
\ No newline at end of file
diff --git a/script/console b/script/console
new file mode 100644 (file)
index 0000000..42f28f7
--- /dev/null
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../config/boot'
+require 'commands/console'
\ No newline at end of file
diff --git a/script/destroy b/script/destroy
new file mode 100644 (file)
index 0000000..fa0e6fc
--- /dev/null
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../config/boot'
+require 'commands/destroy'
\ No newline at end of file
diff --git a/script/generate b/script/generate
new file mode 100644 (file)
index 0000000..ef976e0
--- /dev/null
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../config/boot'
+require 'commands/generate'
\ No newline at end of file
diff --git a/script/performance/benchmarker b/script/performance/benchmarker
new file mode 100644 (file)
index 0000000..c842d35
--- /dev/null
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../../config/boot'
+require 'commands/performance/benchmarker'
diff --git a/script/performance/profiler b/script/performance/profiler
new file mode 100644 (file)
index 0000000..d855ac8
--- /dev/null
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../../config/boot'
+require 'commands/performance/profiler'
diff --git a/script/plugin b/script/plugin
new file mode 100644 (file)
index 0000000..26ca64c
--- /dev/null
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../config/boot'
+require 'commands/plugin'
\ No newline at end of file
diff --git a/script/process/inspector b/script/process/inspector
new file mode 100644 (file)
index 0000000..bf25ad8
--- /dev/null
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../../config/boot'
+require 'commands/process/inspector'
diff --git a/script/process/reaper b/script/process/reaper
new file mode 100644 (file)
index 0000000..c77f045
--- /dev/null
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../../config/boot'
+require 'commands/process/reaper'
diff --git a/script/process/spawner b/script/process/spawner
new file mode 100644 (file)
index 0000000..7118f39
--- /dev/null
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../../config/boot'
+require 'commands/process/spawner'
diff --git a/script/runner b/script/runner
new file mode 100644 (file)
index 0000000..ccc30f9
--- /dev/null
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../config/boot'
+require 'commands/runner'
\ No newline at end of file
diff --git a/script/server b/script/server
new file mode 100644 (file)
index 0000000..dfabcb8
--- /dev/null
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../config/boot'
+require 'commands/server'
\ No newline at end of file
diff --git a/test/fixtures/hateda_indices.yml b/test/fixtures/hateda_indices.yml
new file mode 100644 (file)
index 0000000..b49c4eb
--- /dev/null
@@ -0,0 +1,5 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+  id: 1
+two:
+  id: 2
diff --git a/test/fixtures/hateda_letters.yml b/test/fixtures/hateda_letters.yml
new file mode 100644 (file)
index 0000000..b49c4eb
--- /dev/null
@@ -0,0 +1,5 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+  id: 1
+two:
+  id: 2
diff --git a/test/fixtures/hateda_sections.yml b/test/fixtures/hateda_sections.yml
new file mode 100644 (file)
index 0000000..b49c4eb
--- /dev/null
@@ -0,0 +1,5 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+  id: 1
+two:
+  id: 2
diff --git a/test/fixtures/hateda_themas.yml b/test/fixtures/hateda_themas.yml
new file mode 100644 (file)
index 0000000..b49c4eb
--- /dev/null
@@ -0,0 +1,5 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+  id: 1
+two:
+  id: 2
diff --git a/test/fixtures/hateda_words.yml b/test/fixtures/hateda_words.yml
new file mode 100644 (file)
index 0000000..b49c4eb
--- /dev/null
@@ -0,0 +1,5 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+  id: 1
+two:
+  id: 2
diff --git a/test/fixtures/hatedas.yml b/test/fixtures/hatedas.yml
new file mode 100644 (file)
index 0000000..b49c4eb
--- /dev/null
@@ -0,0 +1,5 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+  id: 1
+two:
+  id: 2
diff --git a/test/fixtures/letters.yml b/test/fixtures/letters.yml
new file mode 100644 (file)
index 0000000..b49c4eb
--- /dev/null
@@ -0,0 +1,5 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+  id: 1
+two:
+  id: 2
diff --git a/test/fixtures/section_letters.yml b/test/fixtures/section_letters.yml
new file mode 100644 (file)
index 0000000..b49c4eb
--- /dev/null
@@ -0,0 +1,5 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+  id: 1
+two:
+  id: 2
diff --git a/test/fixtures/section_words.yml b/test/fixtures/section_words.yml
new file mode 100644 (file)
index 0000000..b49c4eb
--- /dev/null
@@ -0,0 +1,5 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+  id: 1
+two:
+  id: 2
diff --git a/test/fixtures/sections.yml b/test/fixtures/sections.yml
new file mode 100644 (file)
index 0000000..b49c4eb
--- /dev/null
@@ -0,0 +1,5 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+  id: 1
+two:
+  id: 2
diff --git a/test/fixtures/sources.yml b/test/fixtures/sources.yml
new file mode 100644 (file)
index 0000000..b49c4eb
--- /dev/null
@@ -0,0 +1,5 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+  id: 1
+two:
+  id: 2
diff --git a/test/fixtures/thema_sections.yml b/test/fixtures/thema_sections.yml
new file mode 100644 (file)
index 0000000..b49c4eb
--- /dev/null
@@ -0,0 +1,5 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+  id: 1
+two:
+  id: 2
diff --git a/test/fixtures/themas.yml b/test/fixtures/themas.yml
new file mode 100644 (file)
index 0000000..b49c4eb
--- /dev/null
@@ -0,0 +1,5 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+  id: 1
+two:
+  id: 2
diff --git a/test/fixtures/words.yml b/test/fixtures/words.yml
new file mode 100644 (file)
index 0000000..b49c4eb
--- /dev/null
@@ -0,0 +1,5 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+  id: 1
+two:
+  id: 2
diff --git a/test/functional/hateda_controller_test.rb b/test/functional/hateda_controller_test.rb
new file mode 100644 (file)
index 0000000..636c20f
--- /dev/null
@@ -0,0 +1,18 @@
+require File.dirname(__FILE__) + '/../test_helper'
+require 'hateda_controller'
+
+# Re-raise errors caught by the controller.
+class HatedaController; def rescue_action(e) raise e end; end
+
+class HatedaControllerTest < Test::Unit::TestCase
+  def setup
+    @controller = HatedaController.new
+    @request    = ActionController::TestRequest.new
+    @response   = ActionController::TestResponse.new
+  end
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end
diff --git a/test/functional/letter_controller_test.rb b/test/functional/letter_controller_test.rb
new file mode 100644 (file)
index 0000000..1b965cd
--- /dev/null
@@ -0,0 +1,18 @@
+require File.dirname(__FILE__) + '/../test_helper'
+require 'letter_controller'
+
+# Re-raise errors caught by the controller.
+class LetterController; def rescue_action(e) raise e end; end
+
+class LetterControllerTest < Test::Unit::TestCase
+  def setup
+    @controller = LetterController.new
+    @request    = ActionController::TestRequest.new
+    @response   = ActionController::TestResponse.new
+  end
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end
diff --git a/test/functional/section_controller_test.rb b/test/functional/section_controller_test.rb
new file mode 100644 (file)
index 0000000..fd55ee2
--- /dev/null
@@ -0,0 +1,18 @@
+require File.dirname(__FILE__) + '/../test_helper'
+require 'section_controller'
+
+# Re-raise errors caught by the controller.
+class SectionController; def rescue_action(e) raise e end; end
+
+class SectionControllerTest < Test::Unit::TestCase
+  def setup
+    @controller = SectionController.new
+    @request    = ActionController::TestRequest.new
+    @response   = ActionController::TestResponse.new
+  end
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end
diff --git a/test/functional/source_controller_test.rb b/test/functional/source_controller_test.rb
new file mode 100644 (file)
index 0000000..ca21ce4
--- /dev/null
@@ -0,0 +1,18 @@
+require File.dirname(__FILE__) + '/../test_helper'
+require 'source_controller'
+
+# Re-raise errors caught by the controller.
+class SourceController; def rescue_action(e) raise e end; end
+
+class SourceControllerTest < Test::Unit::TestCase
+  def setup
+    @controller = SourceController.new
+    @request    = ActionController::TestRequest.new
+    @response   = ActionController::TestResponse.new
+  end
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end
diff --git a/test/functional/thema_controller_test.rb b/test/functional/thema_controller_test.rb
new file mode 100644 (file)
index 0000000..6cb0dbb
--- /dev/null
@@ -0,0 +1,18 @@
+require File.dirname(__FILE__) + '/../test_helper'
+require 'thema_controller'
+
+# Re-raise errors caught by the controller.
+class ThemaController; def rescue_action(e) raise e end; end
+
+class ThemaControllerTest < Test::Unit::TestCase
+  def setup
+    @controller = ThemaController.new
+    @request    = ActionController::TestRequest.new
+    @response   = ActionController::TestResponse.new
+  end
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end
diff --git a/test/functional/words_controller_test.rb b/test/functional/words_controller_test.rb
new file mode 100644 (file)
index 0000000..fef8aeb
--- /dev/null
@@ -0,0 +1,92 @@
+require File.dirname(__FILE__) + '/../test_helper'
+require 'words_controller'
+
+# Re-raise errors caught by the controller.
+class WordsController; def rescue_action(e) raise e end; end
+
+class WordsControllerTest < Test::Unit::TestCase
+  fixtures :words
+
+  def setup
+    @controller = WordsController.new
+    @request    = ActionController::TestRequest.new
+    @response   = ActionController::TestResponse.new
+
+    @first_id = words(:first).id
+  end
+
+  def test_index
+    get :index
+    assert_response :success
+    assert_template 'list'
+  end
+
+  def test_list
+    get :list
+
+    assert_response :success
+    assert_template 'list'
+
+    assert_not_nil assigns(:words)
+  end
+
+  def test_show
+    get :show, :id => @first_id
+
+    assert_response :success
+    assert_template 'show'
+
+    assert_not_nil assigns(:word)
+    assert assigns(:word).valid?
+  end
+
+  def test_new
+    get :new
+
+    assert_response :success
+    assert_template 'new'
+
+    assert_not_nil assigns(:word)
+  end
+
+  def test_create
+    num_words = Word.count
+
+    post :create, :word => {}
+
+    assert_response :redirect
+    assert_redirected_to :action => 'list'
+
+    assert_equal num_words + 1, Word.count
+  end
+
+  def test_edit
+    get :edit, :id => @first_id
+
+    assert_response :success
+    assert_template 'edit'
+
+    assert_not_nil assigns(:word)
+    assert assigns(:word).valid?
+  end
+
+  def test_update
+    post :update, :id => @first_id
+    assert_response :redirect
+    assert_redirected_to :action => 'show', :id => @first_id
+  end
+
+  def test_destroy
+    assert_nothing_raised {
+      Word.find(@first_id)
+    }
+
+    post :destroy, :id => @first_id
+    assert_response :redirect
+    assert_redirected_to :action => 'list'
+
+    assert_raise(ActiveRecord::RecordNotFound) {
+      Word.find(@first_id)
+    }
+  end
+end
diff --git a/test/test_helper.rb b/test/test_helper.rb
new file mode 100644 (file)
index 0000000..a299c7f
--- /dev/null
@@ -0,0 +1,28 @@
+ENV["RAILS_ENV"] = "test"
+require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
+require 'test_help'
+
+class Test::Unit::TestCase
+  # Transactional fixtures accelerate your tests by wrapping each test method
+  # in a transaction that's rolled back on completion.  This ensures that the
+  # test database remains unchanged so your fixtures don't have to be reloaded
+  # between every test method.  Fewer database queries means faster tests.
+  #
+  # Read Mike Clark's excellent walkthrough at
+  #   http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting
+  #
+  # Every Active Record database supports transactions except MyISAM tables
+  # in MySQL.  Turn off transactional fixtures in this case; however, if you
+  # don't care one way or the other, switching from MyISAM to InnoDB tables
+  # is recommended.
+  self.use_transactional_fixtures = true
+
+  # Instantiated fixtures are slow, but give you @david where otherwise you
+  # would need people(:david).  If you don't want to migrate your existing
+  # test cases which use the @david style and don't mind the speed hit (each
+  # instantiated fixtures translates to a database query per test method),
+  # then set this back to true.
+  self.use_instantiated_fixtures  = false
+
+  # Add more helper methods to be used by all tests here...
+end
diff --git a/test/unit/hateda_index_test.rb b/test/unit/hateda_index_test.rb
new file mode 100644 (file)
index 0000000..f0f7e2c
--- /dev/null
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class HatedaIndexTest < Test::Unit::TestCase
+  fixtures :hateda_indices
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end
diff --git a/test/unit/hateda_letter_test.rb b/test/unit/hateda_letter_test.rb
new file mode 100644 (file)
index 0000000..c30ec5b
--- /dev/null
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class HatedaLetterTest < Test::Unit::TestCase
+  fixtures :hateda_letters
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end
diff --git a/test/unit/hateda_section_test.rb b/test/unit/hateda_section_test.rb
new file mode 100644 (file)
index 0000000..ccc1d3a
--- /dev/null
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class HatedaSectionTest < Test::Unit::TestCase
+  fixtures :hateda_sections
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end
diff --git a/test/unit/hateda_test.rb b/test/unit/hateda_test.rb
new file mode 100644 (file)
index 0000000..67a9a29
--- /dev/null
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class HatedaTest < Test::Unit::TestCase
+  fixtures :hatedas
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end
diff --git a/test/unit/hateda_thema_test.rb b/test/unit/hateda_thema_test.rb
new file mode 100644 (file)
index 0000000..4f924a2
--- /dev/null
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class HatedaThemaTest < Test::Unit::TestCase
+  fixtures :hateda_themas
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end
diff --git a/test/unit/hateda_word_test.rb b/test/unit/hateda_word_test.rb
new file mode 100644 (file)
index 0000000..aaeb6b7
--- /dev/null
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class HatedaWordTest < Test::Unit::TestCase
+  fixtures :hateda_words
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end
diff --git a/test/unit/letter_test.rb b/test/unit/letter_test.rb
new file mode 100644 (file)
index 0000000..67b3c12
--- /dev/null
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class LetterTest < Test::Unit::TestCase
+  fixtures :letters
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end
diff --git a/test/unit/section_letter_test.rb b/test/unit/section_letter_test.rb
new file mode 100644 (file)
index 0000000..3cec734
--- /dev/null
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class SectionLetterTest < Test::Unit::TestCase
+  fixtures :section_letters
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end
diff --git a/test/unit/section_test.rb b/test/unit/section_test.rb
new file mode 100644 (file)
index 0000000..ba2f80f
--- /dev/null
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class SectionTest < Test::Unit::TestCase
+  fixtures :sections
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end
diff --git a/test/unit/section_word_test.rb b/test/unit/section_word_test.rb
new file mode 100644 (file)
index 0000000..2fbcef2
--- /dev/null
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class SectionWordTest < Test::Unit::TestCase
+  fixtures :section_words
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end
diff --git a/test/unit/source_test.rb b/test/unit/source_test.rb
new file mode 100644 (file)
index 0000000..a9812d0
--- /dev/null
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class SourceTest < Test::Unit::TestCase
+  fixtures :sources
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end
diff --git a/test/unit/thema_section_test.rb b/test/unit/thema_section_test.rb
new file mode 100644 (file)
index 0000000..c0713f4
--- /dev/null
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class ThemaSectionTest < Test::Unit::TestCase
+  fixtures :thema_sections
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end
diff --git a/test/unit/thema_test.rb b/test/unit/thema_test.rb
new file mode 100644 (file)
index 0000000..9123217
--- /dev/null
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class ThemaTest < Test::Unit::TestCase
+  fixtures :themas
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end
diff --git a/test/unit/word_test.rb b/test/unit/word_test.rb
new file mode 100644 (file)
index 0000000..b7aafc5
--- /dev/null
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class WordTest < Test::Unit::TestCase
+  fixtures :words
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end