忍者ブログ
Yaleで、遊んで学ぶ日々。

Yaleで、遊んで学ぶ日々。

囲碁、ときどきプログラミング、ところにより経済。
[5]  [6]  [7]  [8]  [9]  [10]  [11]  [12]  [13]  [14]  [15
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Pythonを使い始めてしばらく経つが、初めて参照と値の違いによるバグが生じた。次のA-Cの結果はそれぞれどうなるだろうか。

# (A)
x = []
s = ""
for i in range(5):
    s = "a" + str(i)
    x.append(s)
print x

# (B)
x = []
s = [""]
for i in range(5):
    s = [ "a" + str(i) ]
    x.append(s)
print x
 
# (C)
x = []
s = [""]
for i in range(5):
    s[0] = "a" + str(i)
    x.append(s)
print x


答えは、
(A): ['a0', 'a1', 'a2', 'a3', 'a4']
(B): [['a0'], ['a1'], ['a2'], ['a3'], ['a4']]
(C): [['a4'], ['a4'], ['a4'], ['a4'], ['a4']]
 
(C) については、xの各要素がすべて同じsを参照しているため、sの値を変えるたびにそれがxに反映されてしまう。
一方(B)では、forループ内で毎回sを定義しなおしているので、xの各要素はそれぞれ異なるモノを参照している。


他にも色々試してみる。

次のコードの場合、xへの変更はyに反映されない。
x = [["a"], ["b"], ["c"]]
y = [[""], [""] , [""]]
for i in range(3):
    y[i] = x[i]
print "x", x, "y", y
 
x[0] = ["d"]
print "x", x, "y", y
 

この場合も、反映されない。
x = [["a"], ["b"], ["c"]]
y = x[0]
print "x", x, "y", y
 
x[0] = ["d"]
print "x", x, "y", y


ということは、y = x という形の場合は参照になるが、y = x[j] という形の場合は値の代入になるのかな。あるいは、x[j]と書いた瞬間にその要素の複製を作っているので、これはx本体とは区別されるということだろうか。

PR
黒嘉嘉のTedxTaipei でのスピーチ動画(前回前々回)が、facebookにて公開された。3分強の短縮版。いずれフルバージョンが公開されるのかな? 動画はEDUxTaiwanというページに帰属していて、どうやらアカウントなしでも見られるようだ。

ド頭の「大家好」の外は全く分からないので、これから中国人の友達のオフィスに押しかけたいと思います。


動画へのリンク

「翻滾吧,教育! 2012 EDUx國際教育創新論壇」
影片上傳(3-5 分鐘版本)
 
講者:黑嘉嘉
講題:18歲的職業女棋士 - 黑嘉嘉
演說概要:
黑嘉嘉的父親是澳洲人,他在大學雙修歷史與經濟,之後又修習教育與電腦。母親學的是工程。18歲的嘉嘉受到自由思想的父母親的影響,在家自學多年,她是個職業的棋士,以游泳健身,還擅長琵琶、書法、國畫。她學習的故事,獨立的性格及對教育的看法,都很值得分享。
 


前回次回
早く動画が見たいと思っているのだけど、まだ見つかりません。とりあえず、ダイジェスト版のようなものが届いたようです。
↓46秒くらいに黒嘉嘉さんが写ります。近いうち、全動画がupされることを祈ります。





ちなみに、過去のTEDxTaipeiを見てみたが、中国語でした。残念。でもすぐに字幕がつくはず。
Javascriptは、何かとセキュリティにうるさい言語で、他のプログラミング言語なら簡単に出来るファイルの読み込みや書き込みに強い制約がかかっている。これは、そもそもWeb上で動くことを想定しているためで、とりわけローカルファイルへのアクセスや他のウェブサイトへのアクセスは難しい。参考:Same origin policy (wikipedia)

例えば、自分のウェブサイトにインラインフレーム(iframe)を設置して、そのソースをyahooのトップページに指定するとする。当然、ブラウザで閲覧する際には、自分のページの中でyahooを使うことができる。しかし、javascriptによって、このiframeの要素へアクセスすることはできない。この「アクセス」にはソースコードの読み込みも含まれる。ブラウザから閲覧するときにはもちろんフレームのソースを参照することができるけど、スクリプトを介するとできない仕組みになっている。

あるページからjavascriptによってアクセスできる範囲は、その同一ドメインに限られる。簡単な実験ページを作成した。
http://jsdemo.choitoippuku.com/same-domain.html
このリンク先のページへいくと、2つのiframeが設置してある。上のiframeのソースは同一ドメイン (http://jsdemo.choitoippuku.com) のファイルで、下のiframeのソースはYahoo Japanになっている。
それぞれ、右側にあるボタンを押すと、iframeのソースがテキストエリアに表示されるようにjavascriptが書かれている(Chrome, Firefoxで動作確認済み。IEだと怪しいかも)。

ボタンをクリックすると、上の方ではきちんとソースが表示される(広告が含まれているのはご愛嬌)が、下の方では「取得しようとしています・・・」というメッセージが出るだけのはず。これは、外部のページであるYahooのソースを取得しようとするとエラーが出て、スクリプトがそこで止まってしまっているということだ。


こういう仕様なのはまぁ仕方ないとして、面倒くさいことに、Chromeの場合、同じディレクトリにあるローカルファイルを同一ドメインにあると見てくれないらしい。例えば、
http://jsdemo.choitoippuku.com/same-domain.html
http://jsdemo.choitoippuku.com/mypage.html
の2つのソースをローカルに保存して、same-domain.htmlの動作を確認してみると、今度は上のiframeのソースも取得できない。Firefoxの場合は問題なく動いた。

さて、これで困るのは、ローカルではChromeによるHTMLファイルの編集・動作確認ができないということだ。いちいちサーバーにあげつつデバッグなんてしていたら日が暮れる。これを回避するには、Chromeをオプション付きで開けば良い。

まず、Chromeのウィンドウを閉じる(残っているウィンドウがあると上手くいかない)。
Linuxの場合、端末から
google-chrome --allow-file-access-from-files
で開く。するとローカルファイルへのアクセスが認められるので、サーバーにあげたのと同じ動作になる。

google-chrome --disable-web-security
で開くと、セキュリティ制限が取り払われるので、Yahooのソースも取得できるようになる。


Macの場合(未確認)
open -a Google\ Chrome --args --allow-file-access-from-files
open -a Google\ Chrome --args --disable-web-security

Winの場合(末確認)
chrome.exe --allow-file-access-from-files
chrome.exe --disable-web-security



*この方法を使うと、ローカルにあるテキストファイルの読み込みまでは簡単に実装できる(たとえば、テキストファイルをiframeのソースとして読み込んでから、そのソースを取得すればいい)が、書き込みはまた次元が違うようだ。


参考ページ:
http://stackoverflow.com/questions/3102819/chrome-disable-same-origin-policy 
http://stackoverflow.com/questions/3481977/is-there-a-way-to-bypass-javascript-jquerys-same-origin-policy-for-local-acce
先日行われたTEDxTaipeiに、台湾女流棋士・黑嘉嘉が出演していたらしい。黑嘉嘉(英語名:Joanne Missingham、18歳)は、オーストラリアと台湾のハーフで、2010年に台湾棋院に入段し、現在5段。ずいぶん出世が速い。国際棋戦などで時々代表で出てくる、台湾女流のトップの一人。

中国語は読めない・・・が、カテゴリは「教育」。本人は"我的青春我做主"(私の青春は私が決める)と言っているから、自分の体験談なのかな。動画は近いうちにupされるだろう。スピーチは英語だろうから、楽しみだ。

続報続々報


*写真・文章はTEDxTaipeiのfacebook pageより転載。
TEDxTeipei.jpg























【教育2.0】黑嘉嘉
「父母不需要去在意表面上的分數,可以去挖掘孩子的思考力。」

黑嘉嘉身為職業棋士,她的興趣很廣,從體操、琵琶、鋼琴、游泳多略有涉略,黑嘉嘉清楚知道她要的是什麼,八歲時就決定當職業棋士的她,堅持她的圍棋夢,她的青春她做主,今天,她在現場呈述的可能只是個故事,但卻是活生生可以改變我們彼此思考的例子!#TEDxTaipei2012



日本風に言えば「美しすぎる囲碁棋士」という感じ。ちょっと前には、化粧品のCMに抜擢されている。
http://www.youtube.com/watch?v=JLol5xaDgkU


 
Calender
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Search in This Blog
Latest Comments
[03/30 川内のばば山田]
[03/30 川内のばば山田]
[08/06 Aterarie]
[07/05 Agazoger]
[07/01 Thomaskina]
Oldest Posts
Latest Trackbacks
フリーエリア

Barcode
Access Analysis
Powerd by NINJAブログ / Designed by SUSH
Copyright © Yaleで、遊んで学ぶ日々。 All Rights Reserved.
忍者ブログ [PR]