Wednesday, April 28, 2010
労働とは
労働について
月曜の「キャリア教育」の一こまと、専攻ゼミで「働くとはどういうことか」について お話する。
月曜の方は大教室で180人の学生さんを相手にマイクで講義という、ふだんしないことをする。
お相手は2,3年生。
就活についてはまだ不安だけという学年だけれど、バイトの経験はあるし、キャリアパスのための資格や免状のための科目はすでに履修しているし、セカンドス クールにも通っているものもいるから、「働く」ことについて漠然とした先入観は有している。
けれども、彼女たちの抱いている労働観は家庭教育とこれまでの学校教育の過程でずいぶん歪められている。
彼女たちは「ワーク」を「競争」のスキームでとらえている。
閉じられた同学齢集団内部で相対的な優劣を競うことが「ワークする」ことだと思い込んでいる。
そう教えられて二十歳近くまでやってきた彼女たちには、社会に出てから後は「ワークする」ことの意味が違ってくるという消息がうまく呑み込めない。
「働くとはどういうことか」について、原理的な話をする。
競争や消費は個人単位での活動だが、労働はそうではない。
労働は原理的に集団で行うものである。
労働においては、努力とその報酬が「個人単位」ではなく、「集団単位」で考量される。
だから「仕事ができる人」というのは、「個人的に能力の高い人」のことではなく、「集団のパフォーマンスを向上させることのできる人」を指す。
端的に言えば「他者に贈与できる人間」のことを指す。
その理路を学生たちに縷々説き聞かせる(むずかしいけどね)。
同じことを前に『日本の論点』に書いたので、その一部を引いて論じた。
それを再録しておく。
人間だけが労働する。動物は当面の生存に必要な以上のものをその環境から取り出して作り置きをしたり、それを交換したりしない。ライオンはお腹がいっぱい になったら昼寝をする。横をトムソンガゼルの群れが通りかかっても、「この機会に二三頭、取り置きしておこうか」などとは考えない。「労働」とは生物学的 に必要である以上のものを環境から取り出す活動のことであり、そういう余計なことをするのは人間だけである。
どうして人間だけがそんなことをするのか。
それは「贈与する」ためである。ほかに理由は見当たらない。
もし、腹一杯のライオンがそれでも獲物を狩ったとしたら、その獲物は誰かに(仲間のライオンかハイエナか禿鷲かあるいは地中の微生物か)「贈り物」として 与える以外には用途がない。
「働く」ことの本質は「贈与すること」にあり、それは「親族を形成する」とか「言語を用いる」と同レベルの類的宿命であり、人間の人間性を形成する根源的 な営みである。そのような根源的なものについては、それが何かを一義的な言葉づかいで語ることはできない。例えば、「言語とは何か」と私たちは問うことが できるけれど、その問いは言語によって行うしかない。「貨幣とは何か」という本を書くことはできるけれど、その本を書いた経済学者はその印税の支払いをお そらくは貨幣で求めるはずである。労働もそれと同じである。
人間以外の動物はしないことはたぶん労働である。「たぶん」という限定を付すのは、それが労働であるのかどうかは事後になって、それを「贈り物」として受 け取る他者の出現を待ってしか判明しないからである。
労働は価値を創出する。だが、価値というものは単体では存在しない。価値というのは、それに感動したり、畏怖したり、羨望したりする他の人間が登場しては じめて「価値」として認定されるからである。
ガレージにこもって基板にはんだ付けいる青年がしていることが「労働」かどうかはその時点ではわからない(短期的スパンを取れば、消費するだけである)。 だが、彼の作った電子ガジェットが爆発的に売れて、気がついたら大富豪になってしまったということになると、回顧的には「あのとき彼は労働していたのだ」 ということになる。
どういう行為が「働く」ことであり、どういう行為がそうでないのかは、働き始める前にはわからない。働いて何かを創り出した後に、それを「欲望する」他者 が登場してきてはじめてそれは労働であったことが遡及的にわかるのである。そういうふうに労働は時間の順逆が狂ったかたちで構造化されている。
「穴を掘って、それをまた埋める」という作業の繰り返しそのものは労働ではない。いかなる価値も創り出していないからである。ドストエフスキーは、人間は そのような作業の無意味さに耐えられぬであろうと書いた。だが、もし、その作業の従事者たちが、穴の掘り方や土の運び方について工程を工夫し、システム改 善について議論することが許されていた場合、私が試みるささやかな工夫に驚いたり、感心したりする他者の顔を私が想像できたなら、それは限りなく労働に近 づいていると言うことができるだろう。
私の大学の同僚の島�徹さんは少年の頃カナダに渡り、ダンスのレッスンを受けながら、レストランで皿洗いのバイトをしていた。そのとき、島�少年は独創的 な皿洗いシステムを思いついて、それを提案して、受け容れられた。それから何十年か経って、世界的なダンサーになった後、島�さんはかつて働いていたその ストランを訪れてみたことがあった。ふと厨房を覗いてみると、人々は「島�システム」で皿を洗っていた。
佳話である。
このとき、島�さんにとって、皿洗いの経験は、その言葉の本来の意味において、労働になったのだと私は思う。ある仕事が数十年経って、「労働になる」とい うことがありうるのである。その人がなしとげたことの意味は、仕事そのものではなく、それが他者に何を贈ったかで決まるからである。
島崎さんは皿洗いを通じて見知らぬ人々に(効率的で気分のよい皿洗いシステム)という「贈り物」をした。その「贈り物」を現に享受している人々がカナダの 一隅に現に存在している。その事実によって、少年時代の労働は(当時受け取った賃金の他に)いくばくかの価値を加算されたのである。
「現に享受している」という言い方は正確ではないかもしれない。島�さんは、おそらく皿洗いをしているときすでに、賃金以上のものを、未来において彼が開 発したスキルの恩恵を受益する人々のことを想像するというかたちで、前倒しで受け取っていたはずだからである。そして、たぶんそのときすでに彼は例外的に 陽気で働き者の皿洗いとして、厨房の雰囲気を明るくしていたはずである。
「島�システム」の恩恵の受益者である「次代の皿洗い」はまだ出現していない。それは仮説的にしか存在しない。けれども、自分がなした仕事から何らかの喜 びや愉悦や利益を受け取る他者がいつか出現するであろうという予測をもてるならば、それは、労働に今ここで価値を加算するのである。
逆の例を考えればわかる。地球最後の日に、生き残った最後の一人がいたとする。彼が画期的な癌特効薬を発明しようとも、宇宙の全事象を説明できる理論を完 成させようとも、それはもう労働ではない。その成果を享受しうる他者がもうどこにもいないからである。労働の価値は労働そのものに内在するわけではない。 その成果を享受する他者たちによって事後的に賦与されるのである。
何年か前、武術家の甲野善紀先生とレストランに入ったことがあった。私たちは七人連れであった。メニューに「鶏の唐揚げ」があった。「3ピース」で一皿 だった。七人では分けられないので、私は3皿注文した。すると注文を聞いていたウェイターが「七個でも注文できますよ」と言った。「コックに頼んでそうし てもらいますから。」彼が料理を運んできたときに、甲野先生が彼にこう訊ねた。「あなたはこの店でよくお客さんから、『うちに来て働かないか』と誘われる でしょう。」彼はちょっとびっくりして、「はい」と答えた。「月に一度くらい、そう言われます。」
私は甲野先生の炯眼に驚いた。なるほど、この青年は深夜レストランのウェイターという、さして「やりがいのある」仕事でもなさそうな仕事を通じて、彼にで きる範囲で、彼の工夫するささやかなサービスの積み増しを享受できる他者の出現を日々待ち望んでいるのである。もちろん、彼の控えめな気遣いに気づかずに 「ああ、ありがとう」と儀礼的に言うだけの客もいただろうし、それさえしない客もいたであろう。けれども、そのことは彼が機嫌の良い働き手であることを少 しも妨げなかった。その構えのうちに、具眼の士は「働くことの本質を知っている人間」の徴を看取したのである。
働く人が、誰に、何を、「贈り物」として差し出すのか。それを彼に代わって決めることのできる人はどこにもいない。贈り物とはそういうものである。誰にも 決められないことを自分が決める。その代替不能性が「労働する人間」の主体性を基礎づけている。
その「贈り物」に対しては(ときどき)「ありがとう」という感謝の言葉が返ってくる。それを私たちは「あなたには存在する意味がある」という、他者からの 承認の言葉に読み替える。実はそれを求めて、私たちは労働しているのである。
今、若い人たちがうまく働けないでいるのは、そのことに気づいていないからだと思う。彼らは「働くとはどういうことか」についての定義があらかじめ開示さ れることを求める。働くとどういう報酬が自分にもたらされるのかをあらかじめ知りたがる。それが示されないなら、「私は働かない」という判断を下すことも 十分合理的だと考えている。けれども、残念ながら、「働くとはどういうことか」、働くとどのような「よいこと」が世界にもたらされるのかを知っているの は、現に働いている人、それも上機嫌に働いている人だけなのである。
学生たちは、途中から私語をやめて、黙って聞き入っていた。
出席カードの裏に授業の感想を書いてもらった。
「これからバイトをするのがたのしみになりました」と何人かが書いてくれた。
それでよいのだよ。
Monday, April 26, 2010
Thursday, April 22, 2010
Ruby:new method chain
これはおもしろい?
module Enumerable
def chain(obj)
self.inject(obj) { |obj, method| obj.send(*method) }
end
end
p [:upcase, [:<<, ", world!"], [:split, //]].chain("hello")
p ("hello".upcase<<", world!").split(//)
Ruby: inject_to_a
set = (1..9).to_a
p set.inject([]) { |mem, item| mem << item * 3 if (item%2).zero?; mem }
module Enumerable
def inject_to_a
self.inject([]) { |mem, item| (res = yield(item)) ? mem << res : mem }
end
end
p set.inject_to_a { |item| item * 3 if (item%2).zero? }
grepを使う。これいい!
p set.grep(->x{ (x%2).zero? }) { |item| item * 3 }each_with_objectというものある!
p a.each_with_object([]) { |i, mem| mem << i if (i%2).zero? }
Sunday, April 18, 2010
Wednesday, April 07, 2010
Saturday, March 27, 2010
Termcolor example
# -*- coding: utf-8 -*-
require 'rubygems'
require 'termcolor'
puts TermColor.parse <<EOS
<on_blue><white><bold>TermColor Example</bold></white></on_blue>
<on_green><white>Termcolor</white></on_green> is a library for <red><bold>ANSI</bold></red> <blink><blue>c</blue><yellow>o</yellow><green>l</green>o<red>r</red></blink> formatting like <on_magenta>HTML</on_magenta>
for output in terminal.
EOS
["REVERSE", "ON_RED", "DARK", "MAGENTA", "ColorScheme", "RESET", "RED", "ON_BLUE", "BLINK", "ON_BLACK", "BOLD", "BLUE", "ON_WHITE", "QuestionError", "CLEAR", "BLACK", "ON_YELLOW", "SampleColorScheme", "UNDERSCORE", "WHITE", "SystemExtensions", "ERASE_CHAR", "YELLOW", "ON_CYAN", "CONCEALED", "ON_GREEN", "CHARACTER_MODE", "UNDERLINE", "CYAN", "Question", "Menu", "VERSION", "ERASE_LINE", "GREEN", "ON_MAGENTA"]
Thursday, March 25, 2010
macのIPアドレス設定
- 各マシンのIPアドレス設定は、Router(RT-200NE)のDHCPで自動割り当てしている
- RouterのIPは192.168.1.1でマシンへの割り当ての開始IPは192.168.1.2で個数は50個にしている
- よって各マシンのIPアドレスは変わり得るので、ローカルでのマシンの特定はそのホスト名で行う
- host名はhostnameコマンドで得られ、現在はkeyesmac.localとcoosamac.localになっている
- coosa_login.sh, backup_*.shの設定をこれにしたがって変えた
Test with outside resources with stub or mock ::Ruby Best Practices
- StringIOによるスタブ
- flexmock libraryを使ったスタブ
tc_question.rb
require "test/unit"
require_relative "question"
require_relative "test_unit_extensions"
require "flexmock/test_unit"
#require "stringio"
class TestQuestion < Test::Unit::TestCase
def setup
# @input = StringIO.new
# @output = StringIO.new
@input = flexmock("input")
@output = flexmock("output")
@questioner = Questioner.new(@input, @output)
@question = "Are you happy?"
end
%w(y Y YeS YES yes).each do |yes|
must "return true when parsing #{yes}" do
expect_output @question
provide_input(yes)
assert @questioner.ask(@question), "Expect #{yes} to be true"
end
end
%w(n N no nO).each do |no|
must "return false when parsing #{no}" do
expect_output @question
provide_input(no)
assert ! @questioner.ask(@question), "Expect #{no} to be false"
end
end
[["y", true],["n", false]].each do |input, state|
must "conginue to ask for inpu until given #{input}" do
%w(Yesterday North kittens).each do |i|
expect_output @question
provide_input(i)
expect_output "I don't understand."
end
expect_output @question
provide_input(input)
assert_equal state, @questioner.ask(@question)
end
end
# must "respond 'Good I'm Grad' when inquire_about_happiness gets 'yes'" do
# def @questioner.ask(quesiotn); true; end
# assert_equal "Good I'm Glad", @questioner.inquire_about_happiness
# end
#
# must "respond 'That's Too Bad' when inquire_about_happiness gets 'no'" do
# def @questioner.ask(quesiotn); false; end
# assert_equal "That's Too Bad", @questioner.inquire_about_happiness
# end
must "respond 'Good I'm Grad' when inquire_about_happiness gets 'yes'" do
stubbed = flexmock(@questioner, :ask => true)
assert_equal "Good I'm Glad", stubbed.inquire_about_happiness
end
must "respond 'That's Too Bad' when inquire_about_happiness gets 'no'" do
stubbed = flexmock(@questioner, :ask => false)
assert_equal "That's Too Bad", stubbed.inquire_about_happiness
end
def provide_input(string)
# @input << string
# @input.rewind
@input.should_receive(:gets => string).once
end
def expect_output(string)
# assert_equal string, @output.string
@output.should_receive(:puts).with(string).once
end
end
question.rb
class Questioner
def initialize(_in=STDIN, out=STDOUT)
@input = _in
@output = out
end
def inquire_about_happiness
ask("Are you happy?") ? "Good I'm Glad" : "That's Too Bad"
end
def ask(question)
@output.puts question
response = yes_or_no(@input.gets.chomp)
response.nil? ? ask(question) : response
end
def yes_or_no(response)
case response
when /^y(es)?$/i
true
when /^no?$/i
false
else
@output.puts "I don't understand."
nil
end
end
end
if $0 == __FILE__
qs = Questioner.new
p qs.inquire_about_happiness
end
Wednesday, March 24, 2010
QuickSilver Scoring method
class String
def to_score(abbrev)
return 0.9 if abbrev.empty?
return 0.0 if length < abbrev.length
tail = ""
loop do
return 0 if abbrev.empty?
unless md = match(/#{abbrev}/i)
abbrev, tail = abbrev.split_at(-1)
next
else
remaining_score = md.post_match.to_score(tail)
return calc_score(md, remaining_score)
end
end
end
protected
def calc_score(md, remaining_score)
if remaining_score.zero?
0
else
score = (1 * md.to_s.length) + (remaining_score * md.post_match.length)
if md.pre_match =~ /[\s_]+$/
score += 0.85 * (md.pre_match.length - $&.length) + 1 * $&.length
elsif !md.pre_match.empty? and md.to_s =~ /^[A-Z]/
score += 0.85 * md.pre_match.gsub(/[A-Z]/, "").length
end
score / self.length
end
end
def split_at(index)
return slice(0...index), ( slice(index..-1) || "" )
end
end
Tuesday, March 23, 2010
Test::Ruby Best Practices
-Keep your test cases atomic.
#!/usr/bin/env ruby -Ku
# -*- encoding: utf-8 -*-
require "test/unit"
require_relative "test_unit_extensions"
require_relative "prawn"
class TestInlineStyleParsing < Test::Unit::TestCase
def setup
@parser = Prawn::Document::Text::StyleParser
end
must "parse italic tags" do
assert_equal ["Hello ", "<i>", "Fine", "</i>", " World"],
@parser.process("Hello <i>Fine</i> World")
end
must "parse bold tags" do
assert_equal ["Some very ", "<b>", "bold text", "</b>"],
@parser.process("Some very <b>bold text</b>")
end
must "parse mixed italic and bold tags" do
assert_equal ["Hello ", "<i>", "Fine ", "<b>", "World", "</b>", "</i>"],
@parser.process("Hello <i>Fine <b>World</b></i>")
end
must "not split out other tags than <i> <b> </i> </b>" do
assert_equal ["Hello <indigo>Ch", "</b>", "arl", "</b>", "ie</indigo>"],
@parser.process("Hello <indigo>Ch</b>arl</b>ie</indigo>")
end
must "be able to check whether a string needs to be parsed" do
assert ! @parser.style_tag?("Hello World")
assert @parser.style_tag?("Hello <i>Fine</i> World")
end
end
#!/usr/bin/env ruby -Ku
# -*- encoding: utf-8 -*-
module StyleParser
extend self
TAG_PATTERN = %r{(</?[ib]>)}
def process(text)
text.split(TAG_PATTERN).reject { |x| x.empty? }
end
def style_tag?(text)
!!(text =~ TAG_PATTERN)
end
end
class Prawn
class Document
class Text
include StyleParser
end
end
end
#!/usr/bin/env ruby -Ku
# -*- encoding: utf-8 -*-
require "test/unit"
require_relative "test_unit_extensions"
require_relative "lockbox"
class LockBoxTest < Test::Unit::TestCase
def setup
@lock_box = LockBox.new(password: "secret", content: "My Secret Message")
end
must "raise an error when an invalid password is used" do
assert_raises(LockBox::InvalidPassword) do
@lock_box.unlock("kitten")
end
end
must "Not raise error when a valid password is used" do
assert_nothing_raised do
@lock_box.unlock("secret")
end
end
must "prevent access to content by default" do
assert_raises(LockBox::UnauthorizedAccess) do
@lock_box.content
end
end
must "allow access to content when box is properly unlocked" do
assert_nothing_raised do
@lock_box.unlock("secret")
@lock_box.content
end
end
end
#!/usr/bin/env ruby -Ku
# -*- encoding: utf-8 -*-
class LockBox
UnauthorizedAccess = Class.new(StandardError)
InvalidPassword = Class.new(StandardError)
def initialize(options)
@locked = true
@password = options[:password]
@content = options[:content]
end
def unlock(pass)
@password == pass ? @locked = false : raise(InvalidPassword)
end
def content
@locked ? raise(UnauthorizedAccess) : @content
end
end
#!/usr/bin/env ruby -Ku
# -*- encoding: utf-8 -*-
require "rake/testtask"
task :default => [:test]
Rake::TestTask.new do |test|
test.libs << "test"
test.test_files = Dir["test/tc_*.rb"]
test.verbose = true
end
Wednesday, March 17, 2010
GoodReaderの使い方
- WifiをONにする
- Folderを開き移動でサーバーへ接続を選択
- アドレス:http://10.0.1.2:8080に接続
- GoodReaderを開き接続アイコンクリック
- 接続が完了するとMac側でフォルダが開くのでそこにファイルをドロップ
Tuesday, March 16, 2010
火曜日
という話でmacbook買いたいと答えたら
そんなにほしいなら買ったほうがいいんじゃないかと展開
さちが盛り上がってる
macbookは去年の6月にリニューアルされてるから
そろそろまたリニューアルの可能性ありなので
少し様子見ながら検討したい
久しぶりに新宿へ
OIOIのパン屋でパンを買って屋上で食べる
GW並の日差しを浴びながら
パンのセレクトに成功し満足
なぜか人が少ない
雑貨店でメモ帳購入
AUDTCを換金するためルミネへ
ところが閉店で西口みずほへ
AUD1000が8万イェンに!
何かを疑われたのか担当にオーストラリアの近況を聞かれる
UNIQLOを経由し高島屋&紀伊国屋へ
1時間フリータイム
興味のある本数冊発見
さちは鍋の把手引取りとアスパラ買う
疲れるもなんとか歩いて帰宅
あとなんだっけ?
Mac地デジ録画検討するもあえなく撃沈!
CaptyTV Hi-Vision(PIX-DT181-PU0) - 製品特長 | 株式会社ピクセラ http://www.pixela.co.jp/products/tv_capture/captytv_hi_vision_pix_dt181_pu0/index.html
室内アンテナと合わせて3万以内で買えて
画質も申し分ないし、BSデジタルまで見れるらしい
Macを起動していなくても予約録画ができるらしい
リモコンで操作ができて追っかけ再生なんかもできるらしい
アンテナは室内でも十分キレイに映るらしい
DVDに焼くこともできるらしいから
そこからiPodでも見れるかもしれない
ところが!
Tiger非対応!
さらに!
Intel Core Duo!
残念ながらわが家のmac miniでは視聴できません...
Monday, March 15, 2010
termiosのインストール
リターンしないで入力を受け付けたりするようにできる
gem install termiosするも1.9.2も1.8.7もうまくインストールがいかない
arika..githubからソースをDLしてインストール
tar zxvf file.gz
ruby extconf.rb
make && make install
これでうまくいった
Saturday, March 13, 2010
rb-appscriptにはASDictionaryとASTranslateが必須
ASTranslateはapplescriptをruby scriptに変換するツール
これは必須
iTermとMacVimのWindowの透過度をkeyboard shortcutで変える
- apple scriptで以下のようなtransparency_to05.scptとtransparency_to3.scptを書く
- /Users/keyes/Library/Application Support/iTerm/Scripts/にそれらを置く(folderが無ければ作る)。そうするとiTermにスクリプトメニューが現れる
- Preference/keyboardの設定でshortcutを割り当てる
tell application "iTerm"
activate
tell current session of the last terminal
set transparency to "0.05"
end tell
end tell
ちなみにapplescript で引数を渡すには以下のようにする
ほんとうはこれに引数を渡したものをセットしたい
on run argv
tell application "iTerm"
activate
tell current session of the last terminal
set transparency to item 1 of argv
end tell
end tell
end run
MacVim
- .gvimrcに以下を追加
map + :set transparency+=10<CR>
map ; :set transparency-=10<CR>