Hatena::ブログ(Diary)

minamikawa1981の日記

2009-10-10

過去形で表現する丁寧さについて

http://anond.hatelabo.jp/20091010002215

はてなブックマークを見ていたら、星がたくさんついていて皆さん興味があるかと思ったので補足。

英語における過去形のの文法に関して『英文法 日本人が繰り返す200の間違い』という本に面白いことが書かれています。引用します。

基本的に過去形は3つの遠さ(distance)を表します。1つは時間的な遠さ、つまり、過去の意味。2つ目は現実からの遠さ(非現実)、つまり、仮定法の意味。3番目は相手からの遠さ(隔たり)、つまり、控えめの意味です。自分の気持ちを表したり、人にものを頼む時は過去形を使うと丁寧な響きが感じられるのもこうした理由からなのです。

この例として、

(ex)Do you want cream with your coffee ?

→Did you want cream with your coffee ?(より丁寧)

コーヒーにクリームは入れますか」

という文があげられています。


私は文法学者でもなんでもなくただ本を読んだだけなので詳しくはわかりませんが、日本語の「よろしかったでしょうか」の「かった」の部分も過去形を使ってはいますが、過去形としての意味はなく丁寧語としての意味でしかないのではないかと思います。


言葉のもともとの意味どおりに受け取ると、おかしな表現をしていると言うことは「よろしかったでしょうか」以外にもたくさんあって、芦ヶ原 伸之さんの本で昔読んだ例では、「お電話かわりました」という表現はおかしい、なぜなら電話は変わっていないから電話をかけている人が変わったと言うべき、なんてものもありました。(芦ヶ原 伸之さんはパズル作家であって文法学者ではないので上記発言はジョークです。)


ほかにも、ファンタ!のCMでは、「そ〜だったらいいのにな そうじゃないからファンタ!飲もう」と歌われいています。これも、「そ〜だったら」の部分が過去形です。こちらは非現実を表す過去形でしょう。


誰かほかの言語でも過去形が丁寧や非現実を表す例があったら教えてください。

2009-03-25

Python 29日目(複雑なルールでのソート)

Text Processing in Pythonを少し読んでみた。

http://gnosis.cx/TPiP/chap2.txt


チャプター1は難しいらいいので、チャプター2から。


リストのソートをするときに、普通でない方法でソートする。

適当な文字列を要素に持ったリストLがあったとして、通常のL.sort()では、頭文字でソートするが、

それを4文字目でソートしたい。というような、通常でないソートをする方法。


リストのメソッドsort()は、通常は引数をとりません。

ですが、実は引数をとれます。

cmpのような大小を判断して、-1,0,1を返すような関数を引数に与えることができます。

cmpのような関数を自分で作ってやれば、複雑なルールでのソートにも対応できるというわけです。



では、通常は大小の比較のできない複素数を複素数の絶対値でソートしてみます。

>>> import random
>>> L = [random.randint(1,10)+random.randint(1,10)*1j for i in range(20)]
>>> L
[(10+3j), (4+2j), (7+5j), (2+4j), (6+1j), (2+3j), (2+6j), (5+4j), (2+1j), (1+3j), (2+2j), (5+1j), (3+1j), (2+7j), (2+8j), (9+4j), (3+9j), (8+4j), (6+10j), (2+2j)]
>>> def cmpComplex(complex1,complex2):
	return cmp(abs(complex1),abs(complex2))

>>> cmpComplex(L[3],L[8])
1
>>> abs(L[3])
4.4721359549995796
>>> abs(L[8])
2.2360679774997898
>>> L.sort(cmpComplex)
>>> L
[(2+1j), (2+2j), (2+2j), (1+3j), (3+1j), (2+3j), (4+2j), (2+4j), (5+1j), (6+1j), (2+6j), (5+4j), (2+7j), (2+8j), (7+5j), (8+4j), (3+9j), (9+4j), (10+3j), (6+10j)]
>>> for i in L:
	print abs(i)

	
2.2360679775
2.82842712475
2.82842712475
3.16227766017
3.16227766017
3.60555127546
4.472135955
4.472135955
5.09901951359
6.0827625303
6.32455532034
6.40312423743
7.28010988928
8.24621125124
8.60232526704
8.94427191
9.48683298051
9.8488578018
10.4403065089
11.6619037897

と絶対値の順に、ソートされたわけですが、絶対値が同じ要素に関しては、元のリストのままの順番が維持されるようなcmpComplex関数になっているようです。


絶対値が同じ場合は実数部分でソートするような判断する関数を作ってやればよいのでしょう。


最初はこんなやり方を考えたのですが、比較関数を作ったほうが断然簡単ですね。

>>> L = [random.randint(1,10)+random.randint(1,10)*1j for i in range(10)]
>>> L
[(8+4j), (6+7j), (2+8j), (5+5j), (5+9j), (2+5j), (1+3j), (2+7j), (7+10j), (7+8j)]
>>> LL = zip(map(abs,L),L)
>>> LL
[(8.9442719099991592, (8+4j)), (9.2195444572928871, (6+7j)), (8.2462112512353212, (2+8j)), (7.0710678118654755, (5+5j)), (10.295630140987001, (5+9j)), (5.3851648071345037, (2+5j)), (3.1622776601683795, (1+3j)), (7.2801098892805189, (2+7j)), (12.206555615733702, (7+10j)), (10.63014581273465, (7+8j))]
>>> LL.sort()
>>> LL
[(3.1622776601683795, (1+3j)), (5.3851648071345037, (2+5j)), (7.0710678118654755, (5+5j)), (7.2801098892805189, (2+7j)), (8.2462112512353212, (2+8j)), (8.9442719099991592, (8+4j)), (9.2195444572928871, (6+7j)), (10.295630140987001, (5+9j)), (10.63014581273465, (7+8j)), (12.206555615733702, (7+10j))]
>>> L = [i[1] for i in LL]
>>> L
[(1+3j), (2+5j), (5+5j), (2+7j), (2+8j), (8+4j), (6+7j), (5+9j), (7+8j), (7+10j)]

【追記】

調べてみたらもっと上手なやり方があったようです。

http://d.hatena.ne.jp/yumimue/20071218/1197985024


簡単な関数で比較できるなら、sortメソッドのkeyという引数に関数を渡せばよい。よって、複素数の絶対値でソートするなら以下のコードで十分。絶対値が同じになったときにどうするか、例えば実数部分でソートする、ということまでやりたいならやはり比較する関数を書く必要があるでしょう。

>>> import random
>>> L = [random.randint(1,10)+random.randint(1,10)*1j for i in range(10)]
>>> L
[(7+6j), (8+1j), (5+7j), (7+9j), (9+9j), (4+1j), (5+8j), (6+6j), (9+9j), (3+5j)]
>>> L.sort(key=abs)
>>> L
[(4+1j), (3+5j), (8+1j), (6+6j), (5+7j), (7+6j), (5+8j), (7+9j), (9+9j), (9+9j)]
>>> for i in L:
	print abs(i)

	
4.12310562562
5.83095189485
8.0622577483
8.48528137424
8.60232526704
9.21954445729
9.43398113206
11.401754251
12.7279220614
12.7279220614

2009-03-03

マジコン問題を理解するための不正競争防止法解説

まず不正競争防止法の目的を理解してください。


不正競争防止法の目的は不正な競争を防止すること「ではありません」

それは手段であって目的は、国民経済の健全な発展です

第一条  この法律は、事業者間の公正な競争及びこれに関する国際約束の的確な実施を確保するため、
不正競争の防止及び不正競争に係る損害賠償に関する措置等を講じ、もって国民経済の健全な発展に寄与することを目的とする。 

これは、特許法も同様です。

特許法の目的は、発明を保護することではなく、産業の発達です。

第一条  この法律は、発明の保護及び利用を図ることにより、発明を奨励し、もつて産業の発達に寄与することを目的とする。 

どちらの法律も産業を発展させることを目的としていますが、

これらの法律がない場合、産業は発達しないということでしょうか?

いかなる規制も作らない場合

ゲーム機、電化製品、薬などを新規開発し、その製品が大ヒットしたとします。

すると、他の競合他社は新規開発した製品のコピーを作ります。

競合他社は研究開発費が必要ないため、安く作れるようになります。

この状態が続くと、新規開発しても利益を上げられなくなり、

どの企業も新しい技術を開発しなくなります。


他社によるいかなる利用も禁じる場合

では、ゲーム機、電化製品、薬などを新規開発した企業にその製品の販売を独占する永久の権利を与え、

他社の新規参入を永久に規制するようにしてはどうでしょうか?

このような永久の権利を与えると、未来永劫利益を上げ続けられるわけですから、

これでも、企業は新規開発を怠るようになります。

どちらの方法をとっても産業が発達しなくなることが予想されます。


産業を発達させるには

規制が全くない場合も、永久の規制を課す場合も産業は発達しません。

どうすれば、産業が発達するでしょうか?

特許法が採用している方法は、新規に発明した個人・企業に一定期間の独占権を与えるという方法です。

これなら、一定期間は独占できるのでコピーは作られずその期間に利益を上げられ、

永久に独占できるわけでもないので、新たに優れた製品を開発する動機付けになりえます。

コピーを完全に野放しにすること、新規参入を完全に妨害することとの間でバランスを取っていると考えると分かりやすいと思います。


不正競争防止法

不正競争防止法は、産業を発達させるために、商標のコピー、

製品のコピーなどのフリーライドを防止する法律だと理解すると分かりやすいと思います。

不正競争防止法、特許法、著作権法などの知的財産権の枠組みは、

不正なコピーは容認しない、独占する権利は与えるが何らかの形で制限を設ける、

両者のバランスを取ることで産業を発展させるというものです。


ここまでが前提知識です。

よく読んで、理解してください。


chnpkさんの主張は、ユーザーは安い製品を求めるし、コピーをなくすことはできないのだから、

コピーがあることを前提としたビジネスモデルを考える"べき"だ、

裁判で規制してユーザーに不便を強いるビジネスモデルは業界が腐敗し、

海外企業に市場をとられるという主張だと理解しました。


不正競争防止法は、ユーザーがコピーであっても安い製品を求めることは否定していません。

コピー製品の製造・販売・輸入輸出を行う「企業」を排除する法律です。

任天堂はユーザーの倫理を前提としたビジネスモデルを作っているのではなく、

現在の知的財産法の枠組みを逸脱している企業を訴えただけです。

私には、訴えるべきではないという主張も、

海外企業であればコピーを前提としたビジネスモデルを構築できるという主張も意味が分かりません。


http://d.hatena.ne.jp/chnpk/20090302/1235971461

このエントリーへの反論として書きました。

2009-02-23

Python 28日目

リストのインデックス・スライスで、範囲外の引数を指定したらどうなるのかって「初めてのPython」には書いてなかったと思い込んでいたら、pp.151のまとめ演習のページがあった。

演習のページなので、答えが書いてあるわけではないが、最初に読んだときは余り重要ではないかとおもって、読み飛ばした。


リストのメソッド

リストのメソッドは全部で9つ。

ここを参照すればすべて載っている。

http://www.python.jp/doc/release/tut/node7.html#SECTION007100000000000000000

では、これをおぼえていく。おぼえるためにリストのメソッドは、append,extend...と呪文を唱えるようにおぼえるよりも、似た機能に分類したり、似た機能の似ていないところとを確認した方が私はおぼえ易かった。

私の場合は(上記チュートリアルも同じだが)このようにまとめた。

リストに要素を加えるメソッド

append

extend

insert

appendとinsertはほとんど同じ。

appendは最後にしか要素を加えられないが、insertはインデックスを指定して任意の場所に要素を加えられる。

extendはリストのスライスを使って末尾にリストを加える操作と同じ。

プラス演算子+を使ってもほぼ同じことができる。

extendと+の違いは、extendは値を返さないが、+は値を返す。

>>> a=range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a.extend([2,3,4])
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4]
>>> a+[2,3,4]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 2, 3, 4]
リストから要素を取り除くメソッド

remove

pop

removeは引数に要素をとり、

popはインデックスをとる。

リストの状態を調べるメソッド

index

count

これはどちらも引数に要素をとる。

リストを並べ替えるメソッド

sort

reverse

どちらも引数なし。


2009-02-21 [Python]Python 27日目

Python 27日目

リストのスライスについて

aをリストとすると、

a[num1:num2]と2つの整数をコロンで区切るとスライスになる。

num1,num2はすべての整数。

整数以外ではエラーが返される。

a=range(10) に対して、

a[-2000:2000]

としても、エラーにはならない。

無効な数字が無視され、有効な部分のみが残り、

a[0:10]と解釈される。



リストのスライスの恒等式

a[:n]+a[n:]=a

len(a[n:]) = len(a) - n

len(a[:-n]) = len(a) - n

a[n:n] = []

a[:] = a

len(a[num1,num2]) = num2 - num1

num1,num2が同符号のとき


>>> a=range(10)
>>> len(a)
10
>>> len(a[:-3])
7
>>> len(a[3:])
7
>>> a[:5]+a[5:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> len(a[2:5])
3
>>> len(a[-9:-2])
7

リストのスライス 引数が3つのとき

リストのスライスは3つ目の引数に0以外の整数を指定することで、

スライスのステップを指定できる。

a[num1:num2:num3]

a[1:7:2]

区切りはすべてコロン。

num3に1を指定する意味はない。

それなら指定しなければいい。

num3に0を指定するとエラーが出る。

num3には負の整数を指定できる。

num3が負のとき、要素が1以上のリストを返させるには、

num1>num2である必要がある。

>>> a=range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[2:5:-1]
[]
>>> a[5:2:-1]
[5, 4, 3]
>>> a[2:5]
[2, 3, 4]

このa[5:2:-1]とa[2:5]の違いに注意する。num1,num2に含まれる数字は同じだが、

出てくる要素は異なる(順番が違うだけじゃない!!)。

スライスを簡単に理解するために、num1,num2が要素の「間」を指すという考え方があるが、

その考え方を採用すると、num3に負の整数を指定した場合との整合性が取れない。(数値がずれる)

num3が正負どちらも統一的に理解する方法は、やはり、num1,num2は要素そのものを指していて、

num1は含むがnum2は含まないと言う理解の仕方しかない。

良くある表現

逆に並んだリスト[::-1]

奇数番目の要素のみ、[::2]

偶数番目の要素のみ[1::2]

[::]、有効な表現だが、あまり意味のない表現。

全ての要素は[:]で十分。

>>> a=range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[::2]
[0, 2, 4, 6, 8]
>>> a[1::2]
[1, 3, 5, 7, 9]
>>> a[::]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]