From e5f3ecbbc9f9682c1a7ab44dbe438b865e7bfd30 Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年5月12日 11:36:18 +0800 Subject: [PATCH 01/73] =?UTF-8?q?bs4=E6=8A=93=E5=8F=96=E7=BD=91=E9=A1=B5?= =?UTF-8?q?=E6=89=80=E6=9C=89H1=E6=A0=87=E9=A2=98=E5=92=8C=E9=93=BE?= =?UTF-8?q?=E6=8E=A5=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bs4_h1.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 bs4_h1.py diff --git a/bs4_h1.py b/bs4_h1.py new file mode 100644 index 0000000..8afcfd2 --- /dev/null +++ b/bs4_h1.py @@ -0,0 +1,15 @@ +import urllib.request +from bs4 import BeautifulSoup +import sys + +url = 'http://www.tantengvip.com' +html = urllib.request.urlopen(url).read() + +soup = BeautifulSoup(html) +h1s = soup.find_all('h1',class_='entry-title') + +'''打印所有H1标题和链接''' +for h1 in h1s: + #print(h1) + print(h1.get_text()) + print(h1.a.attrs['href']) \ No newline at end of file From f2092b625f46e59122a3aa4e33d01a89d970461f Mon Sep 17 00:00:00 2001 From: Tony Date: 2015年5月12日 15:31:21 +0800 Subject: [PATCH 02/73] Create README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..a05445e --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# learn-python +本人边学习Python3,边把一些小脚本(自己写的和网上找的)经过本机测试后然后同步到github上,供初学者下载研究,欢迎fork,也欢迎提交新的Python小脚本,特别是一些有趣好玩的小程序! From c2985d89c5652bee7a5b2e67b9c42f2998009f67 Mon Sep 17 00:00:00 2001 From: Tony Date: 2015年5月12日 15:33:17 +0800 Subject: [PATCH 03/73] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a05445e..3fd48e9 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ # learn-python 本人边学习Python3,边把一些小脚本(自己写的和网上找的)经过本机测试后然后同步到github上,供初学者下载研究,欢迎fork,也欢迎提交新的Python小脚本,特别是一些有趣好玩的小程序! + +http://www.tantengvip.com/category/develop/python3/ From e6968919bed5a281a6e97f201c9b9f1e3662449d Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年5月12日 16:41:02 +0800 Subject: [PATCH 04/73] =?UTF-8?q?python=E5=86=99excel=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=EF=BC=8C=E9=9C=80=E8=A6=81=E5=85=88pip=20install=20tablib?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- excel.xlsx | Bin 0 -> 5489 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 excel.xlsx diff --git a/excel.xlsx b/excel.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8f9e9c6bc943aa994d57da64a0790f18784302f2 GIT binary patch literal 5489 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ドルqgu)|3qWk}S{U||)f0NOhwGMNe+l3`98T;J8leWF24ECYEgS)wRC zgvZc^0v8#+Zu4$xlv%x$xIk7cjogxS%peXoc{_8W#=Me@OwnpzeKMtLtYzc5BMWak zei_a^UF7uHDp`%N0FX-wRdfuaUj};Ha|n1uFebuJcUfN`VRABslqUjT-&_zhvG1gTq=h*E3Q;9wZqO5;{Q4)gBrsl#kf69=)@Js@U~^YQ|xVl zP^jOU0{Q-B?8g%2qdGa}xI#aWGq6#6ry~?8zennn$D2}X077I05pVm<+bwf$z|!uf zxpGn>%Xk!_>eg3W2ftR8YFeS?M*_H>?!ba4K#Q_ljq8G~#wZ*C?+&`2CXi zl{_<)tk=wws(py7#n{+$ird@o03ep=-{~lkc-7dh5se=plv)ittlswtf27&~by2|y z!v-7aB~rqJ8FV{c;hOLC;>I?wj}_%Kr7UXM*jYt~rjwfM#xJJgz>+RP>5J5oK6Vlw zydydDho~G=FCzNL32cbIH`WF9)o@@#G42N}2V=EpUjSu+AqQ0^839okQWS=232XV} z0awpWscvQIkHu;|sOCJSxR_(Y@q+_50+{Lqb$WKZT+ZMz3H;nj%O;uwBg2#!?6e|; zJ9f?LmY1=G+w}rpD=v6zl|I=%tA_0-T<*1@dl%59d0~yt@xn0ngyd9ywKs^hEM@w|XS1%g{1Tn~z@kZKf~by9W~ME|`22BddHSH9^@H0;x9}B<2s%jsxk1 z+tHF2Tv*j^(rjU~z)Blyc*`gspo}+1Pgxw_8e9U|X@~iW z?1jOXJnUB`E{i6@=6yIcDCtVRasbU6yRROW-H0n-ag_?SVV0ab}MPb!X2H`NA`! zIl)Q)0M_=79*Tzw*o;Fz7+P28ドルRH`=rs8t+bMZZA>%A+HfKQ?*8cevS^}1spBWTP* zh}e9>Ym;?fh3O8wto_hoX3iq1E?oaep=RqPO$D7F(}(XX{UOhRe8eYbXguaYlah6c zGaaAOK~s+(G=_mDxe-ml7o?~^%DZ1)c|MYMji#!AgiQPwjrH&3 z7Q8ドルjI^YQ3`FE=8u7tZ>)8BXi0FG3Rc>EXU>8^mgw90P*ScvfR50d3B@Ge2|8+e8Q z{&%|KuAIB={%<*l2m;`4^m4n8w=mmr4ob?0|408{lx@3^w>kR_??AL{|I(`66>v8T z{}w=jNXiHSzjN|k=-n{?8+wHQ7xbS&|1S7$g!v7wMQ|pF|Na91N4!y0Ktren0AM3d MIKoQvgumYY2PN`m(EtDd literal 0 HcmV?d00001 From d92fd1e80071a38fe2cca23401c843bae078f7fc Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年5月12日 16:46:34 +0800 Subject: [PATCH 05/73] =?UTF-8?q?python=E5=86=99excel=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=EF=BC=8C=E9=9C=80=E8=A6=81=E5=85=88pip=20install=20tablib?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- excel_demo.py | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 excel_demo.py diff --git a/excel_demo.py b/excel_demo.py new file mode 100644 index 0000000..aa6172a --- /dev/null +++ b/excel_demo.py @@ -0,0 +1,6 @@ +import tablib +headers = ('lie1', 'lie2', 'lie3', 'lie4', 'lie5') +mylist = [('23','23','34','23','34'),('sadf','23','sdf','23','fsad')] +mylist = tablib.Dataset(*mylist, headers=headers) +with open('excel.xlsx', 'wb') as f: + f.write(mylist.xlsx) \ No newline at end of file From 5de12bbb2caed161a668f155b50725dbeec72b98 Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年5月12日 16:46:55 +0800 Subject: [PATCH 06/73] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- excel.xlsx | Bin 5489 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 excel.xlsx diff --git a/excel.xlsx b/excel.xlsx deleted file mode 100644 index 8f9e9c6bc943aa994d57da64a0790f18784302f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5489 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ドルqgu)|3qWk}S{U||)f0NOhwGMNe+l3`98T;J8leWF24ECYEgS)wRC zgvZc^0v8#+Zu4$xlv%x$xIk7cjogxS%peXoc{_8W#=Me@OwnpzeKMtLtYzc5BMWak zei_a^UF7uHDp`%N0FX-wRdfuaUj};Ha|n1uFebuJcUfN`VRABslqUjT-&_zhvG1gTq=h*E3Q;9wZqO5;{Q4)gBrsl#kf69=)@Js@U~^YQ|xVl zP^jOU0{Q-B?8g%2qdGa}xI#aWGq6#6ry~?8zennn$D2}X077I05pVm<+bwf$z|!uf zxpGn>%Xk!_>eg3W2ftR8YFeS?M*_H>?!ba4K#Q_ljq8G~#wZ*C?+&`2CXi zl{_<)tk=wws(py7#n{+$ird@o03ep=-{~lkc-7dh5se=plv)ittlswtf27&~by2|y z!v-7aB~rqJ8FV{c;hOLC;>I?wj}_%Kr7UXM*jYt~rjwfM#xJJgz>+RP>5J5oK6Vlw zydydDho~G=FCzNL32cbIH`WF9)o@@#G42N}2V=EpUjSu+AqQ0^839okQWS=232XV} z0awpWscvQIkHu;|sOCJSxR_(Y@q+_50+{Lqb$WKZT+ZMz3H;nj%O;uwBg2#!?6e|; zJ9f?LmY1=G+w}rpD=v6zl|I=%tA_0-T<*1@dl%59d0~yt@xn0ngyd9ywKs^hEM@w|XS1%g{1Tn~z@kZKf~by9W~ME|`22BddHSH9^@H0;x9}B<2s%jsxk1 z+tHF2Tv*j^(rjU~z)Blyc*`gspo}+1Pgxw_8e9U|X@~iW z?1jOXJnUB`E{i6@=6yIcDCtVRasbU6yRROW-H0n-ag_?SVV0ab}MPb!X2H`NA`! zIl)Q)0M_=79*Tzw*o;Fz7+P28ドルRH`=rs8t+bMZZA>%A+HfKQ?*8cevS^}1spBWTP* zh}e9>Ym;?fh3O8wto_hoX3iq1E?oaep=RqPO$D7F(}(XX{UOhRe8eYbXguaYlah6c zGaaAOK~s+(G=_mDxe-ml7o?~^%DZ1)c|MYMji#!AgiQPwjrH&3 z7Q8ドルjI^YQ3`FE=8u7tZ>)8BXi0FG3Rc>EXU>8^mgw90P*ScvfR50d3B@Ge2|8+e8Q z{&%|KuAIB={%<*l2m;`4^m4n8w=mmr4ob?0|408{lx@3^w>kR_??AL{|I(`66>v8T z{}w=jNXiHSzjN|k=-n{?8+wHQ7xbS&|1S7$g!v7wMQ|pF|Na91N4!y0Ktren0AM3d MIKoQvgumYY2PN`m(EtDd From 8b00595a439a2096a674cf9700dc8ee787748b03 Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年5月13日 16:13:59 +0800 Subject: [PATCH 07/73] =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=96=90=E6=B3=A2?= =?UTF-8?q?=E6=8B=89=E5=A5=91=E7=94=9F=E6=88=90=E5=99=A8=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fib.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 fib.py diff --git a/fib.py b/fib.py new file mode 100644 index 0000000..ebc27f4 --- /dev/null +++ b/fib.py @@ -0,0 +1,9 @@ +def fib(max): + n, a, b = 0, 0, 1 + while n < max: + yield b + a, b = b, a + b + n = n + 1 + +for i in fib(30): + print(i) \ No newline at end of file From 5277e2e63cf7bc2446f0160b11a795d3148786d3 Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年5月15日 10:14:20 +0800 Subject: [PATCH 08/73] =?UTF-8?q?=E4=B8=80=E4=B8=AA=E8=B6=85=E7=AE=80?= =?UTF-8?q?=E5=8D=95windows=E7=AA=97=E5=8F=A3=E5=9B=BE=E5=BD=A2=E7=95=8C?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- window.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 window.py diff --git a/window.py b/window.py new file mode 100644 index 0000000..d732ef3 --- /dev/null +++ b/window.py @@ -0,0 +1,28 @@ +from tkinter import * + +root = Tk() +frame = Frame(root) +frame.pack() + +var = StringVar() +label = Label( root, textvariable=var, relief=RAISED ) + +var.set("Hey!? How are you doing?") +label.pack(side = TOP) + +bottomframe = Frame(root) +bottomframe.pack( side = BOTTOM ) + +redbutton = Button(frame, text="Red", fg="red") +redbutton.pack( side = LEFT) + +greenbutton = Button(frame, text="Brown", fg="brown") +greenbutton.pack( side = LEFT ) + +bluebutton = Button(frame, text="Blue", fg="blue") +bluebutton.pack( side = LEFT ) + +blackbutton = Button(bottomframe, text="Black", fg="black") +blackbutton.pack( side = BOTTOM) + +root.mainloop() \ No newline at end of file From ac840fc50f1e56449a833ab580870ab660ff97f3 Mon Sep 17 00:00:00 2001 From: tuntun Date: Wed, 8 Jul 2015 10:04:50 +0800 Subject: [PATCH 09/73] =?UTF-8?q?mongodb=E8=BF=9E=E6=8E=A5=EF=BC=88?= =?UTF-8?q?=E5=B8=A6=E6=95=B0=E6=8D=AE=E5=BA=93=E5=AF=86=E7=A0=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- testmongo.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 testmongo.py diff --git a/testmongo.py b/testmongo.py new file mode 100644 index 0000000..660be8f --- /dev/null +++ b/testmongo.py @@ -0,0 +1,13 @@ + +from pymongo import MongoClient +import datetime + +client = MongoClient('mongodb://tanteng:123456@localhost:27017/') +db = client.js_send_excel + +post = {"author": "Xiaofeng", "text": "My first blog post!", + "tags": ["mongodb", "python", "pymongo"],} + +posts = db.posts +post_id = posts.insert_one(post).inserted_id +print(post_id) \ No newline at end of file From 91564cd6e85471c81629999b4afe22703ae88c8e Mon Sep 17 00:00:00 2001 From: tuntun Date: Wed, 8 Jul 2015 12:14:55 +0800 Subject: [PATCH 10/73] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E4=B8=8D=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E7=9A=84=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bs4_h1.py | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 bs4_h1.py diff --git a/bs4_h1.py b/bs4_h1.py deleted file mode 100644 index 8afcfd2..0000000 --- a/bs4_h1.py +++ /dev/null @@ -1,15 +0,0 @@ -import urllib.request -from bs4 import BeautifulSoup -import sys - -url = 'http://www.tantengvip.com' -html = urllib.request.urlopen(url).read() - -soup = BeautifulSoup(html) -h1s = soup.find_all('h1',class_='entry-title') - -'''打印所有H1标题和链接''' -for h1 in h1s: - #print(h1) - print(h1.get_text()) - print(h1.a.attrs['href']) \ No newline at end of file From f3b25f9fe6dd87f258b44cad88af3dfbdbe80565 Mon Sep 17 00:00:00 2001 From: tanteng Date: 2015年7月11日 13:13:13 +0800 Subject: [PATCH 11/73] =?UTF-8?q?Python3=E7=94=9F=E6=88=90=E6=BF=80?= =?UTF-8?q?=E6=B4=BB=E7=A0=81=E7=A4=BA=E4=BE=8B=EF=BC=88String=E6=A8=A1?= =?UTF-8?q?=E5=9D=97ascii=5Fletters=E5=92=8Cdigits=E7=94=A8=E6=B3=95?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/inspectionProfiles/Project_Default.xml | 10 ++++++++++ .idea/inspectionProfiles/profiles_settings.xml | 7 +++++++ string_letters.py | 14 ++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 string_letters.py diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..146ab09 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..3b31283 --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/string_letters.py b/string_letters.py new file mode 100644 index 0000000..2eedb3f --- /dev/null +++ b/string_letters.py @@ -0,0 +1,14 @@ +import random, string + + +def rand_str(num, length=7): + f = open('Activation_code.txt', 'w') + for i in range(num): + chars = string.ascii_letters + string.digits + s = [random.choice(chars) for i in range(length)] + f.write('{0}\n'.format(''.join(s))) + f.close() + + +if __name__ == '__main__': + rand_str(200) From f6a84bb0410e848f3e263364a9fc8eba487a86c3 Mon Sep 17 00:00:00 2001 From: tanteng Date: 2015年7月11日 13:21:02 +0800 Subject: [PATCH 12/73] =?UTF-8?q?pillow=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- testpillow.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 testpillow.py diff --git a/testpillow.py b/testpillow.py new file mode 100644 index 0000000..c2fc742 --- /dev/null +++ b/testpillow.py @@ -0,0 +1,15 @@ +from PIL import Image, ImageDraw, ImageFont + +sourceFileName = "fsafa.jpg" +avatar = Image.open(sourceFileName) +drawAvatar = ImageDraw.Draw(avatar) + +xSize, ySize = avatar.size +fontSize = min(xSize, ySize) // 11 + +myFont = ImageFont.truetype("/Library/Fonts/OsakaMono.ttf", fontSize) + +drawAvatar.text([0.9 * xSize, 0.1 * ySize - fontSize], "32", fill=(255, 0, 0), font=myFont) +del drawAvatar + +avatar.show() From f959fc1a31d02a04bf0161d01769ce6ec3d52c48 Mon Sep 17 00:00:00 2001 From: tanteng Date: 2015年7月11日 21:46:59 +0800 Subject: [PATCH 13/73] =?UTF-8?q?*args=E5=92=8C**kwargs=E5=8F=AF=E5=8F=98?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E7=9A=84=E5=8C=BA=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- args_kwargs.py | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 args_kwargs.py diff --git a/args_kwargs.py b/args_kwargs.py new file mode 100644 index 0000000..6b98e48 --- /dev/null +++ b/args_kwargs.py @@ -0,0 +1,5 @@ +def alias(*args, **kwargs): + print('args=', args) + print('kwargs=', kwargs) + +alias(3, 23, 3, 3,a='hello',b=3,c='C') From 7ed26b688b2ce44e0d46ad42d4002a0f33fcf073 Mon Sep 17 00:00:00 2001 From: tanteng Date: 2015年7月11日 22:39:25 +0800 Subject: [PATCH 14/73] =?UTF-8?q?Python3=E9=97=AD=E5=8C=85=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- closure.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 closure.py diff --git a/closure.py b/closure.py new file mode 100644 index 0000000..47dd67c --- /dev/null +++ b/closure.py @@ -0,0 +1,22 @@ +def hellocounter (name): + count=[0] + def counter(): + count[0]+=1 + print('Hello,',name,',',count[0],' access!') + return counter + +hello = hellocounter('ma6174') +hello() +hello() +hello() + +def make_adder(addend): + def adder(augend): + return augend + addend + return adder + +p = make_adder(23) +q = make_adder(44) + +print(p(100)) +print(q(100)) From 52df16db8a4a9b74b8b83179fa2a81a49d1951c7 Mon Sep 17 00:00:00 2001 From: tanteng Date: 2015年7月12日 18:30:02 +0800 Subject: [PATCH 15/73] =?UTF-8?q?=E5=9C=A8=E7=B1=BB=E7=9A=84=E5=A4=96?= =?UTF-8?q?=E9=9D=A2=E5=AE=9A=E4=B9=89=E6=96=B9=E6=B3=95=EF=BC=8C=E7=B1=BB?= =?UTF-8?q?=E7=9A=84=E5=86=85=E9=83=A8=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- def_scope.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 def_scope.py diff --git a/def_scope.py b/def_scope.py new file mode 100644 index 0000000..9492807 --- /dev/null +++ b/def_scope.py @@ -0,0 +1,15 @@ +def bar(self, y): + return self.x + y + + +class Foo(object): + def __init__(self, x): + self.x = x + + bar = bar; + + +foo = Foo(333); +print(foo.bar(3)) + +#result:336 \ No newline at end of file From e8573c302f5e463b23e6f29477df45c437c739c1 Mon Sep 17 00:00:00 2001 From: tanteng Date: 2015年7月13日 23:58:01 +0800 Subject: [PATCH 16/73] =?UTF-8?q?sys.argv=E7=9A=84=E7=94=A8=E6=B3=95?= =?UTF-8?q?=EF=BC=8C=E6=8E=A5=E6=94=B6=E5=91=BD=E4=BB=A4=E8=A1=8C=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sys_argv.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 sys_argv.py diff --git a/sys_argv.py b/sys_argv.py new file mode 100644 index 0000000..bc96057 --- /dev/null +++ b/sys_argv.py @@ -0,0 +1,22 @@ +import sys + +# sys.argv接收参数,第一个参数是文件名,第二个参数开始是用户输入的参数,以空格隔开 + +def run1(): + print('I\'m action1') + + +def run2(): + print('I\'m action2') + + +if 2> len(sys.argv): + print('none') +else: + action1 = sys.argv[1] + action2 = sys.argv[2] + + if 'run1' == action1: + run1() + if 'run2' == action2: + run2() \ No newline at end of file From 53850360727cc6390ca978e0dabf834116f30f68 Mon Sep 17 00:00:00 2001 From: Tony Date: 2015年7月14日 00:00:54 +0800 Subject: [PATCH 17/73] Update sys_argv.py --- sys_argv.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sys_argv.py b/sys_argv.py index bc96057..5bbcfa4 100644 --- a/sys_argv.py +++ b/sys_argv.py @@ -19,4 +19,6 @@ def run2(): if 'run1' == action1: run1() if 'run2' == action2: - run2() \ No newline at end of file + run2() + +#用法:在命令行执行脚本,python sys_argv.py run1 run2 From 80054f2267fbccdc9331626a562979047bc0a3e8 Mon Sep 17 00:00:00 2001 From: tanteng Date: 2015年7月14日 00:05:29 +0800 Subject: [PATCH 18/73] rm files --- .idea/inspectionProfiles/Project_Default.xml | 10 ---------- .idea/inspectionProfiles/profiles_settings.xml | 7 ------- 2 files changed, 17 deletions(-) delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/inspectionProfiles/profiles_settings.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 146ab09..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 3b31283..0000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file From a74974eeeb02093d61f37edb9fd1bd1ce7a7bbaf Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年7月14日 09:28:50 +0800 Subject: [PATCH 19/73] =?UTF-8?q?Python3=E4=B8=8B=E8=BD=BDMongoDB=E4=B8=8A?= =?UTF-8?q?=E7=9A=84=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- testmongo.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/testmongo.py b/testmongo.py index 660be8f..f35b64f 100644 --- a/testmongo.py +++ b/testmongo.py @@ -1,13 +1,24 @@ - from pymongo import MongoClient -import datetime +import gridfs +import time +import re +import os +import sys -client = MongoClient('mongodb://tanteng:123456@localhost:27017/') +client = MongoClient('mongodb://192.168.1.22:27017/excel') db = client.js_send_excel +fs = gridfs.GridFS(db) +files = fs.find() + +time_start = time.clock() +print('总数:', files.count()) + +for ffle in files: + filename = ffle.filename + m = re.match(r'发货订单', filename) -post = {"author": "Xiaofeng", "text": "My first blog post!", - "tags": ["mongodb", "python", "pymongo"],} + if m and filename.find('.xls')> 0 and not os.path.isfile('./excel/' + filename): + with open('./excel/' + filename, 'wb') as f1: + f1.write(ffle.read()) -posts = db.posts -post_id = posts.insert_one(post).inserted_id -print(post_id) \ No newline at end of file +print('执行时间{0}秒'.format(time.clock() - time_start)) \ No newline at end of file From cd5ff8f01bdab7a8065d18c072676dd2af5a3d0b Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年7月14日 18:34:42 +0800 Subject: [PATCH 20/73] =?UTF-8?q?=E6=8A=93=E5=8F=96bing=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E8=83=8C=E6=99=AF=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bing_photos.py | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/bing_photos.py b/bing_photos.py index 173adfa..2158349 100644 --- a/bing_photos.py +++ b/bing_photos.py @@ -1,4 +1,4 @@ - #!/usr/bin/env python +#!/usr/bin/env python # -*- coding:utf-8 -*- @@ -6,44 +6,45 @@ # python3抓取bing主页所有背景图片 -import urllib.request,re,sys,os +import urllib.request +import re +import sys +import os -def get_bing_backphoto(): - - if (os.path.exists('photos')== False): +def get_bing_backphoto(): + if os.path.exists('photos') == False: os.mkdir('photos') - for i in range(0,30): + for i in range(0, 30): - url = 'http://cn.bing.com/HPImageArchive.aspx?format=js&idx='+str(i)+'&n=1&nc=1361089515117&FORM=HYLH1' + url = 'http://cn.bing.com/HPImageArchive.aspx?format=js&idx=' + str(i) + '&n=1&nc=1361089515117&FORM=HYLH1' html = urllib.request.urlopen(url).read() if html == 'null': - - print( 'open & read bing error!') + print('open & read bing error!') sys.exit(-1) html = html.decode('utf-8') - reg = re.compile('"url":"(.*?)","urlbase"',re.S) + reg = re.compile('"url":"(.*?)","urlbase"', re.S) - text = re.findall(reg,html) + text = re.findall(reg, html) - #http://s.cn.bing.net/az/hprichbg/rb/LongJi_ZH-CN8658435963_1366x768.jpg - - for imgurl in text : + # http://s.cn.bing.net/az/hprichbg/rb/LongJi_ZH-CN8658435963_1366x768.jpg + for imgurl in text: right = imgurl.rindex('/') - name = imgurl.replace(imgurl[:right+1],'') + name = imgurl.replace(imgurl[:right + 1], '') - savepath = 'photos/'+ name + savepath = 'photos/' + name urllib.request.urlretrieve(imgurl, savepath) - print (name + ' save success!') - + print(name + ' save success!') + + get_bing_backphoto() \ No newline at end of file From 1de613319196e1a0825cc30e3f1c50648edcb201 Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年7月15日 10:36:12 +0800 Subject: [PATCH 21/73] =?UTF-8?q?mysqlclient=E8=BF=9E=E6=8E=A5mysql?= =?UTF-8?q?=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test_mysqlclient.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 test_mysqlclient.py diff --git a/test_mysqlclient.py b/test_mysqlclient.py new file mode 100644 index 0000000..3a69b6d --- /dev/null +++ b/test_mysqlclient.py @@ -0,0 +1,19 @@ +import MySQLdb + +db = MySQLdb.connect(host="localhost", user="root", passwd="", db="demo") +c = db.cursor() +max_price = 5 +c.execute("""SELECT * FROM think_node""") +one = c.fetchone() +print(one) +# (49, 'read', '??', 1, '', None, 30, 3, 0, 0) + +all_result = c.fetchall() +print(all_result) + +''' +((40, 'Index', '????', 1, '', 1, 1, 2, 0, 0), (39, 'index', '??', 1, '', None, 30, 3, 0, 0), (37, 'resume', '??', 1, '', None, 30, 3, 0, 0), (36, 'forbid', '??', 1, '', None, 30, 3, 0, 0), (3 +5, 'foreverdelete', '??', 1, '', None, 30, 3, 0, 0), (34, 'update', '??', 1, '', None, 30, 3, 0, 0), (33, 'edit', '??', 1, '', None, 30, 3, 0, 0), (32, 'insert', '??', 1, '', None, 30, 3, 0, +0), (31, 'add', '??', 1, '', None, 30, 3, 0, 0), (30, 'Public', '????', 1, '', 2, 1, 2, 0, 0), (69, 'Form', '????', 1, '', 1, 1, 2, 0, 2), (7, 'User', '????', 1, '', 4, 1, 2, 0, 2), (6, 'Role +', '????', 1, '', 3, 1, 2, 0, 2), (2, 'Node', '????', 1, '', 2, 1, 2, 0, 2), (1, 'Rbac', 'Rbac????', 1, '', None, 0, 1, 0, 0), (50, 'main', '????', 1, '', None, 40, 3, 0, 0)) +''' \ No newline at end of file From 32ee1559a2c1d2ca6c08d304d03dd32a4e05fc15 Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年7月15日 10:49:23 +0800 Subject: [PATCH 22/73] =?UTF-8?q?mysqlclient=E8=BF=9E=E6=8E=A5mysql?= =?UTF-8?q?=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test_mysqlclient.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test_mysqlclient.py b/test_mysqlclient.py index 3a69b6d..5c0435c 100644 --- a/test_mysqlclient.py +++ b/test_mysqlclient.py @@ -11,6 +11,8 @@ all_result = c.fetchall() print(all_result) +c.close() # 关闭连接资源 + ''' ((40, 'Index', '????', 1, '', 1, 1, 2, 0, 0), (39, 'index', '??', 1, '', None, 30, 3, 0, 0), (37, 'resume', '??', 1, '', None, 30, 3, 0, 0), (36, 'forbid', '??', 1, '', None, 30, 3, 0, 0), (3 5, 'foreverdelete', '??', 1, '', None, 30, 3, 0, 0), (34, 'update', '??', 1, '', None, 30, 3, 0, 0), (33, 'edit', '??', 1, '', None, 30, 3, 0, 0), (32, 'insert', '??', 1, '', None, 30, 3, 0, From edf65fcab88119b7fb37d74315a896d9edca760d Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年7月16日 17:45:11 +0800 Subject: [PATCH 23/73] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=93=8D=E4=BD=9Credis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test_redis.py | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 test_redis.py diff --git a/test_redis.py b/test_redis.py new file mode 100644 index 0000000..f5c6ee3 --- /dev/null +++ b/test_redis.py @@ -0,0 +1,8 @@ +import redis +r = redis.StrictRedis(host='localhost', port=6379, db=0) +r.set('foo', 'bar') + +foo = r.get('foo') + +print(foo) +# b'bar' \ No newline at end of file From f79b1d951845dc5b20669e392f9e7aeab54d41bf Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年7月16日 18:34:37 +0800 Subject: [PATCH 24/73] =?UTF-8?q?python=E5=8F=91=E9=80=81=E9=82=AE?= =?UTF-8?q?=E4=BB=B6=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sendMail.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 sendMail.py diff --git a/sendMail.py b/sendMail.py new file mode 100644 index 0000000..4402c94 --- /dev/null +++ b/sendMail.py @@ -0,0 +1,25 @@ +import smtplib +from email.mime.text import MIMEText +from email.mime.multipart import MIMEMultipart + +SERVER = "smtp.qq.com" + +COMMASPACE = ', ' + +# Create the container (outer) email message. +msg = MIMEMultipart() +msg['Subject'] = 'Our family reunion' +FROM = 'user@qq.com' +TO = ['user1@qq.com', 'uers2@qq.com'] +msg['From'] = FROM +msg['To'] = COMMASPACE.join(TO) + +text = 'hello,world!' +part1 = MIMEText(text, 'plain') +# part2 = MIMEText(html, 'html') +msg.attach(part1) +msg.preamble = 'Our family reunion' +server = smtplib.SMTP(SERVER) +server.login('user@qq.com', 'pwd') +server.sendmail(FROM, TO, msg.as_string()) +server.quit() \ No newline at end of file From b99778945bf6df12557ce7530dfc8caa56299bfb Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年8月14日 18:17:36 +0800 Subject: [PATCH 25/73] =?UTF-8?q?=E7=94=A8python=E6=8A=8Aexcel=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=E5=AF=BC=E5=85=A5=E5=88=B0mysql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- save_excel_to_mysql.py | 81 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 save_excel_to_mysql.py diff --git a/save_excel_to_mysql.py b/save_excel_to_mysql.py new file mode 100644 index 0000000..6b2af00 --- /dev/null +++ b/save_excel_to_mysql.py @@ -0,0 +1,81 @@ +# -*- coding:utf-8 -*- +import xlrd +import MySQLdb +import os +import sys + + +def main(path): + """ + 打开目录遍历excel文件并存储到mysql + """ + files = os.listdir(path) + for file in files: + save_file(path + '/' + file) + print(file) + + +def save_file(file): + """ + 打开excel文件 + """ + book = xlrd.open_workbook(file) + sheet = book.sheet_by_index(0) + row_nums = sheet.nrows + col_nums = sheet.ncols + + page = False # 是否分几次插入 + + data = [] + if row_nums < 2: + return False + if col_nums not in [23, 25]: # 两种excel格式,一个23列,一个25列 + return False + + for rownumber in range(1, row_nums): + if page is True: + data = [] + values = sheet.row_values(rownumber) + values.insert(0, 0) + if values[1] == '': + return False + + # 不同形式表格差异处理 + if col_nums == 23: + values.insert(7, '') + values.insert(8, '') + + if values[20] == '': + values[20] == '0000-00-00 00:00:00' + if values[21] == '': + values[21] = '0000-00-00 00:00:00' + + data.append(tuple(values)) + totals = len(data) + page = False + if totals>= 2000: + insert(data) + page = True + del data + + insert(data) + return True + + +def insert(data): + """ + 将excel表格所有数据一次插入到mysql中 + """ + db = MySQLdb.connect(host="localhost", user="root", passwd="", db="fahuo", use_unicode=True, charset="utf8") + c = db.cursor() + + c.executemany( + """INSERT INTO `order` VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""", + data) + db.commit() + db.close() + + +if __name__ == "__main__": + path = './exceltest' + main(path) From 22dcadaafbc8121308305a000552c481cf92b47a Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年8月14日 18:20:20 +0800 Subject: [PATCH 26/73] =?UTF-8?q?=E4=BD=BF=E7=94=A8python=E6=93=8D?= =?UTF-8?q?=E4=BD=9CMongoDB=E7=9A=84GridFS=E4=B8=8B=E8=BD=BD=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- testmongo.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/testmongo.py b/testmongo.py index f35b64f..9707eb5 100644 --- a/testmongo.py +++ b/testmongo.py @@ -1,24 +1,31 @@ +# -*- coding:utf-8 -*- + from pymongo import MongoClient -import gridfs import time import re import os +import gridfs import sys -client = MongoClient('mongodb://192.168.1.22:27017/excel') +client = MongoClient('mongodb://m_user:m_user_027@192.168.5.22:27017/js_send_excel') db = client.js_send_excel fs = gridfs.GridFS(db) + files = fs.find() time_start = time.clock() print('总数:', files.count()) +count = 0 for ffle in files: filename = ffle.filename + m = re.match(r'发货订单', filename) - if m and filename.find('.xls')> 0 and not os.path.isfile('./excel/' + filename): - with open('./excel/' + filename, 'wb') as f1: + if m and filename.find('xls')> 0 and not os.path.isfile('./excel/' + filename): + with open('./excel2/' + filename, 'wb') as f1: f1.write(ffle.read()) + count += 1 -print('执行时间{0}秒'.format(time.clock() - time_start)) \ No newline at end of file +print('执行时间{0}秒'.format(time.clock() - time_start)) +print('本次更新{0}个文档'.format(count)) From 5537a9b32d74913279490c9e697d5916a5f51e25 Mon Sep 17 00:00:00 2001 From: Tony Date: 2015年8月15日 11:52:37 +0800 Subject: [PATCH 27/73] =?UTF-8?q?Python=E6=93=8D=E4=BD=9CMongoDB=E7=9A=84G?= =?UTF-8?q?ridFs=E4=B8=8B=E8=BD=BD=E6=96=87=E4=BB=B6=EF=BC=88=E4=BF=AE?= =?UTF-8?q?=E6=94=B9MongoDB=E6=95=B0=E6=8D=AE=E5=BA=93=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- testmongo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testmongo.py b/testmongo.py index 9707eb5..77164da 100644 --- a/testmongo.py +++ b/testmongo.py @@ -7,7 +7,7 @@ import gridfs import sys -client = MongoClient('mongodb://m_user:m_user_027@192.168.5.22:27017/js_send_excel') +client = MongoClient('mongodb://192.168.6.212:27017/send_excel') db = client.js_send_excel fs = gridfs.GridFS(db) From 2cbc021a3658b1566311b81e77e3394204782ee2 Mon Sep 17 00:00:00 2001 From: tanteng Date: 2015年8月16日 22:25:32 +0800 Subject: [PATCH 28/73] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=AD=97=E5=85=B8?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E5=8A=A8=E6=80=81=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- create_variable.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 create_variable.py diff --git a/create_variable.py b/create_variable.py new file mode 100644 index 0000000..2fca1a5 --- /dev/null +++ b/create_variable.py @@ -0,0 +1,14 @@ +""" +演示Python如何动态创建变量 +""" + +pages = {} + +for page in range(1, 50): + """ + 这里想创建变量page1 = 1, page2 = 2, page3 = 3,... + """ + pages[page] = page + +print(pages[1]) +print(pages[2]) From 55806ce121a05a9e72760567c833064eb0d42800 Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年8月17日 18:00:37 +0800 Subject: [PATCH 29/73] =?UTF-8?q?Python=E5=AE=9A=E4=B9=89dict?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- me.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 me.py diff --git a/me.py b/me.py new file mode 100644 index 0000000..96d2f4c --- /dev/null +++ b/me.py @@ -0,0 +1,12 @@ +# Python dict +me = { + 'name': 'tanteng', + 'age': 25, + 'sex': 'man', + 'city': 'Wuhan', + 'college': 'WUST', + 'profession': 'Computer Science and Technology', + 'language': ['PHP', 'JavaScript', 'MySQL', 'Redis', 'MongoDB', 'Python'], + 'website': 'http://www.tantengvip.com', + 'email': 'tanteng@gmail.com' +} From 85f6006a5d49be061068027b679959d0a3f1e8e6 Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年8月17日 18:01:28 +0800 Subject: [PATCH 30/73] =?UTF-8?q?Python=E5=8F=91=E9=80=81=E9=82=AE?= =?UTF-8?q?=E4=BB=B6=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sendMail.py | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/sendMail.py b/sendMail.py index 4402c94..e69de29 100644 --- a/sendMail.py +++ b/sendMail.py @@ -1,25 +0,0 @@ -import smtplib -from email.mime.text import MIMEText -from email.mime.multipart import MIMEMultipart - -SERVER = "smtp.qq.com" - -COMMASPACE = ', ' - -# Create the container (outer) email message. -msg = MIMEMultipart() -msg['Subject'] = 'Our family reunion' -FROM = 'user@qq.com' -TO = ['user1@qq.com', 'uers2@qq.com'] -msg['From'] = FROM -msg['To'] = COMMASPACE.join(TO) - -text = 'hello,world!' -part1 = MIMEText(text, 'plain') -# part2 = MIMEText(html, 'html') -msg.attach(part1) -msg.preamble = 'Our family reunion' -server = smtplib.SMTP(SERVER) -server.login('user@qq.com', 'pwd') -server.sendmail(FROM, TO, msg.as_string()) -server.quit() \ No newline at end of file From afe5798e8f21234b93a90bee34b806bb12df76f5 Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年8月18日 17:34:55 +0800 Subject: [PATCH 31/73] =?UTF-8?q?=E4=BF=9D=E5=AD=98excel=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=88=B0mysql=EF=BC=8C=E5=A2=9E=E5=8A=A0try=20catch=E9=98=B2?= =?UTF-8?q?=E6=AD=A2=E5=BC=82=E5=B8=B8=E4=B8=AD=E6=96=AD=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E8=AE=B0=E5=BD=95log=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- save_excel_to_mysql.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/save_excel_to_mysql.py b/save_excel_to_mysql.py index 6b2af00..e54a311 100644 --- a/save_excel_to_mysql.py +++ b/save_excel_to_mysql.py @@ -2,6 +2,7 @@ import xlrd import MySQLdb import os +import logging import sys @@ -13,6 +14,7 @@ def main(path): for file in files: save_file(path + '/' + file) print(file) + logging.info(file) def save_file(file): @@ -69,13 +71,19 @@ def insert(data): db = MySQLdb.connect(host="localhost", user="root", passwd="", db="fahuo", use_unicode=True, charset="utf8") c = db.cursor() - c.executemany( - """INSERT INTO `order` VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""", - data) - db.commit() - db.close() + try: + c.executemany( + """INSERT INTO `order` VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""", + data) + db.commit() + except Exception as e: + logging.info(e) + db.close() + return False + return True if __name__ == "__main__": - path = './exceltest' + logging.basicConfig(filename='./log.txt', level=logging.DEBUG) + path = './excel' main(path) From 5cec24bb5166b49a0dfd6afe9767002dfd023d64 Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年8月19日 09:57:43 +0800 Subject: [PATCH 32/73] =?UTF-8?q?=E4=BF=9D=E5=AD=98excel=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=88=B0mysql=EF=BC=8C=E5=A2=9E=E5=8A=A0try=20except=E9=98=B2?= =?UTF-8?q?=E6=AD=A2=E5=BC=82=E5=B8=B8=E4=B8=AD=E6=96=AD=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E8=AE=B0=E5=BD=95log=E6=97=A5=E5=BF=97=EF=BC=8C=E6=8A=8A?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E7=9A=84=E6=96=87=E4=BB=B6=E5=A4=8D=E5=88=B6?= =?UTF-8?q?=E4=B8=80=E4=BB=BD=E5=88=B0=E5=85=B6=E4=BB=96=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- save_excel_to_mysql.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/save_excel_to_mysql.py b/save_excel_to_mysql.py index e54a311..2a09aca 100644 --- a/save_excel_to_mysql.py +++ b/save_excel_to_mysql.py @@ -3,6 +3,7 @@ import MySQLdb import os import logging +import shutil import sys @@ -12,17 +13,21 @@ def main(path): """ files = os.listdir(path) for file in files: - save_file(path + '/' + file) + save_file(path + '/' + file, file) print(file) - logging.info(file) -def save_file(file): +def save_file(file, filename): """ 打开excel文件 """ - book = xlrd.open_workbook(file) - sheet = book.sheet_by_index(0) + try: + book = xlrd.open_workbook(file) + sheet = book.sheet_by_index(0) + except Exception as e: + logging.info('错误:{0} 文件:{1}'.format(e, file)) + shutil.copy2(file, './error' + filename) + return False row_nums = sheet.nrows col_nums = sheet.ncols From 0c84685507f2f51ab4eb59cd2e86466a7ba1be6a Mon Sep 17 00:00:00 2001 From: tuntun Date: Wed, 4 Nov 2015 20:00:34 +0800 Subject: [PATCH 33/73] =?UTF-8?q?=E5=88=B7=E5=BE=AE=E4=BF=A1=E8=BF=90?= =?UTF-8?q?=E5=8A=A8=E6=AD=A5=E6=95=B0=EF=BC=88python3=E7=89=88=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wechat-ledongli.py | 117 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 wechat-ledongli.py diff --git a/wechat-ledongli.py b/wechat-ledongli.py new file mode 100644 index 0000000..53597fb --- /dev/null +++ b/wechat-ledongli.py @@ -0,0 +1,117 @@ +#coding: utf-8 + +#date: 刷微信步数 + +#usage: edit steps and ledongli's uid(u need to download this app) .That would be ok .Good luck. ^_^ + +import requests + +import sys + +import json + +import datetime + +import time + +def isnum(value): + + try: + + temp = int(value) + + except Exception as e: + + return False + + else: + + return True + +# like 2015年09月25日 00:00:00 converts to unix time stamp + +def formatDate(): + + nowtime = datetime.datetime.now() + + date = time.strftime('%Y-%m-%d') + + strtemp_date = date + ' 00:00:00' + + ledongli_date = time.strptime(strtemp_date, '%Y-%m-%d %H:%M:%S') + + finaldate = time.mktime(ledongli_date) # rusult is 1443456000.0(float type), but still need to format to 1443456000 + + finaldate = int(finaldate) + + return finaldate + +def main(steps, uid): + + if not isnum(steps): + + print('param error. steps must be an integer.') + + url = 'http://pl.api.ledongli.cn/xq/io.ashx' + + fake_headers = { + + 'User-Agent' : 'le dong li/5.4 (iPhone; iOS 9.1; Scale/2.00)', + + 'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8', + + 'Accept-Encoding': 'gzip' + + } + + keycontentjson = [ + + { + + "date": formatDate(), + "calories": 0, + "activeValue": 108, + "steps": steps, + "pm2d5": 0, + "duration": 0, + "distance": 0, + "report": "[]" + + } + + ] + + # key is a str type + + # key must be a json data convert to string + + key = json.dumps(keycontentjson) + + param = { + + 'action': 'profile', + + 'pc': '29e39ed274ea8e7a50f8a83abf1239faca843022', + + 'cmd': 'updatedaily', + + 'uid': uid, + + 'list': key, + 'v' : '5.4%20ios', + 'vc' : '540%20ios' + } + + r = requests.post(url, data = param, headers = fake_headers) + + print(r.text) + + print('装逼成功') + +if __name__ == '__main__': + + steps = 199999 + + uid = '39176049' + + main(steps, uid) \ No newline at end of file From eb12aae4dc7bb4f8c8a6a4ebf32cfb3f3c4803b1 Mon Sep 17 00:00:00 2001 From: Tony Date: Thu, 5 Nov 2015 12:01:39 +0800 Subject: [PATCH 34/73] =?UTF-8?q?=E6=BC=94=E7=A4=BApython=E5=8F=82?= =?UTF-8?q?=E6=95=B0args=E5=92=8Ckwargs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- args_kwargs.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/args_kwargs.py b/args_kwargs.py index 6b98e48..f9f3681 100644 --- a/args_kwargs.py +++ b/args_kwargs.py @@ -3,3 +3,8 @@ def alias(*args, **kwargs): print('kwargs=', kwargs) alias(3, 23, 3, 3,a='hello',b=3,c='C') + +'''输出 +args= (3, 23, 3, 3) +kwargs= {'b': 3, 'c': 'C', 'a': 'hello'} +''' From 164595644b3387d34c64abeff590c0b4637f503b Mon Sep 17 00:00:00 2001 From: tuntun Date: Thu, 5 Nov 2015 15:32:51 +0800 Subject: [PATCH 35/73] =?UTF-8?q?requests=20get=E7=94=A8=E6=B3=95=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- testrequests.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 testrequests.py diff --git a/testrequests.py b/testrequests.py new file mode 100644 index 0000000..27a803e --- /dev/null +++ b/testrequests.py @@ -0,0 +1,22 @@ +__author__ = 'tanteng' + +import requests + +def testrequests(): + + url = 'http://www.x.com/index/pyrequests' + + params = { + 'x':'xxxx', + 'y':'yyyy' + } + + re = requests.get(url,params) + + return re + + +if __name__ == '__main__': + re = testrequests() + print(re.text) + From 53621909e84e973b955844779753ce4e77707236 Mon Sep 17 00:00:00 2001 From: tuntun Date: Thu, 5 Nov 2015 16:13:01 +0800 Subject: [PATCH 36/73] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=88=B7=E6=AD=A5?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wechat-ledongli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wechat-ledongli.py b/wechat-ledongli.py index 53597fb..6d3a8c7 100644 --- a/wechat-ledongli.py +++ b/wechat-ledongli.py @@ -112,6 +112,6 @@ def main(steps, uid): steps = 199999 - uid = '39176049' + uid = '1111111' main(steps, uid) \ No newline at end of file From ecb27ab0bbcab5fc5d844cfbba688556507566cb Mon Sep 17 00:00:00 2001 From: tuntun Date: Thu, 5 Nov 2015 17:34:05 +0800 Subject: [PATCH 37/73] =?UTF-8?q?=E5=88=97=E4=B8=BE=E4=B8=80=E5=89=AF?= =?UTF-8?q?=E7=89=8C=E6=89=80=E6=9C=89=E7=89=9B=E7=89=9B=E7=9A=84=E6=83=85?= =?UTF-8?q?=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- niu.py | 80 +++++++++++++++++++++++++++++++--------------------------- 1 file changed, 43 insertions(+), 37 deletions(-) diff --git a/niu.py b/niu.py index 9bbbd33..4c3d3c8 100644 --- a/niu.py +++ b/niu.py @@ -1,48 +1,54 @@ +# -*- coding:utf-8 -*- # 列举一副牌所有牌型为牛牛的情况 -# author:tanteng -import itertools,sys -#初始化一副牌(除去大小王) +__author__ = 'tanteng' + +import itertools, sys + + +# 初始化一副牌(除去大小王) def cards(): - cards = {'黑桃A':1,'红桃A':1,'方块A':1,'梅花A':1} - card_type = ['黑桃','红桃','方块','梅花'] + cards = {'黑桃A': 1, '红桃A': 1, '方块A': 1, '梅花A': 1} + card_type = ['黑桃', '红桃', '方块', '梅花'] - for c_type in card_type: - for no in range(2,11): - cards[c_type+str(no)] = no + for c_type in card_type: + for no in range(2, 11): + cards[c_type + str(no)] = no - for name in ['J','Q','K']: - cards[c_type+name] = 10 + for name in ['J', 'Q', 'K']: + cards[c_type + name] = 10 - return cards + return cards -#从一副牌取5张牌所有排列 + +# 从一副牌取5张牌所有排列 def all_cases(cards): - return list(itertools.combinations(cards,5)) + return list(itertools.combinations(cards, 5)) + if __name__ == '__main__': - cards = cards() - all_cases = all_cases(cards) - - print(len(all_cases)) - - for case in all_cases: - temp_name = list(case) - temp_value = [] - for ca in case: - temp_value.append(cards[ca]) - - sums = sum(temp_value) - if sums%10==0: - s_cases = list(itertools.combinations(temp_name,3)) - for s_case in s_cases: - temp_name2 = list(s_case) - temp_value2 = [] - for s_ca in s_case: - temp_value2.append(cards[s_ca]) - - sumc = sum(temp_value2) - if sumc%10==0: - print(temp_name) - break \ No newline at end of file + cards = cards() + all_cases = all_cases(cards) + + print(len(all_cases)) + + for case in all_cases: + temp_name = list(case) + temp_value = [] + for ca in case: + temp_value.append(cards[ca]) + + sums = sum(temp_value) + if sums % 10 == 0: + s_cases = list(itertools.combinations(temp_name, 3)) + for s_case in s_cases: + temp_name2 = list(s_case) + temp_value2 = [] + for s_ca in s_case: + temp_value2.append(cards[s_ca]) + + sumc = sum(temp_value2) + if sumc % 10 == 0: + print(temp_name) + break From dcae846fd4071a21ac0225a196cf80bd931e2a7e Mon Sep 17 00:00:00 2001 From: tuntun Date: Thu, 5 Nov 2015 17:38:44 +0800 Subject: [PATCH 38/73] =?UTF-8?q?=E6=A3=80=E6=B5=8B=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E5=AD=98=E5=9C=A8=E5=B9=B6=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- checkfile.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 checkfile.py diff --git a/checkfile.py b/checkfile.py new file mode 100644 index 0000000..ef6a3db --- /dev/null +++ b/checkfile.py @@ -0,0 +1,30 @@ +import sys # Import the Modules +import os # Import the Modules + +# Readfile Functions which open the file that is passed to the script + +def readfile(filename): + print(filename) + f = open(filename, 'r') + line = f.read() + print(line) + + +def main(): + filename = '' + if len(sys.argv) == 2: # Check the arguments passed to the script + filename = sys.argv[1] # The filename is the first argument + if not os.path.isfile(filename): # Check the File exists + print('[-] ' + filename + ' does not exist.') + exit(0) + if not os.access(filename, os.R_OK): # Check you can read the file + print('[-] ' + filename + ' access denied') + exit(0) + else: + print('[-] Usage: ' + str(sys.argv[0]) + ' ') # Print usage if not all parameters passed/Checked + exit(0) + print('[+] Reading from : ' + filename) # Display Message and read the file contents + readfile(filename) + +if __name__ == '__main__': + main() \ No newline at end of file From 9269dd49f7d74630b2defa534332fa88b666019d Mon Sep 17 00:00:00 2001 From: tuntun Date: Thu, 5 Nov 2015 18:48:37 +0800 Subject: [PATCH 39/73] =?UTF-8?q?=E6=9F=A5=E8=AF=A2ip=E3=80=81=E7=BD=91?= =?UTF-8?q?=E5=9D=80=E5=BD=92=E5=B1=9E=E5=9C=B0=EF=BC=88=E9=80=9A=E8=BF=87?= =?UTF-8?q?ip168=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- check_ip.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 check_ip.py diff --git a/check_ip.py b/check_ip.py new file mode 100644 index 0000000..321e82c --- /dev/null +++ b/check_ip.py @@ -0,0 +1,44 @@ +#!/usr/bin/python +#coding:utf-8 + +import urllib.request +import re +import sys + +def ISIP(s): + return len([i for i in s.split('.') if (0<= int(i)<= 255)])== 4 + +def URL(ip): + uip = urllib.request.urlopen('http://wap.ip138.com/ip.asp?ip='+ip) + fip = uip.read() + rip = re.compile("
查询结果:(.*)
") + result = rip.findall(fip) + print("%s\t %s" % (ip, result[0])) + + +def DO(domain): + url = urllib.request.urlopen('http://wap.ip138.com/ip.asp?ip='+domain) + f = url.read().decode('utf-8') + r = re.compile('
查询结果:(.*)
') + result = r.findall(f) + #print type(result) + for i in result: + print("%s %s %s" % (domain, i[0], i[1])) + +if __name__ == "__main__": + if len(sys.argv) < 2: + print("请输入IP地址或者域名 (例如:192.168.1.1 / www.baidu.com)") + sys.exit() + INPUT=sys.argv[1] + if not re.findall('(\d{1,3}\.){3}\d{1,3}',INPUT): + if re.findall('(\w+\.)?(\w+)(\.\D+){1,2}',INPUT) : + DOMAIN=INPUT + DO(DOMAIN) + else: + print("输入的IP地址和域名格式不对!") + else: + if ISIP(INPUT) : + IPADDRESS=INPUT + URL(IPADDRESS) + else: + print("IP 地址不合法,请重新输入!") From 306581b3d6dc7856281a1247353043d01d261321 Mon Sep 17 00:00:00 2001 From: tanteng Date: 2015年11月22日 22:12:43 +0800 Subject: [PATCH 40/73] =?UTF-8?q?Python3=E8=AF=BB=E5=86=99=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/demo.conf | 14 ++++++++ read_write_conf.py | 87 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 conf/demo.conf create mode 100644 read_write_conf.py diff --git a/conf/demo.conf b/conf/demo.conf new file mode 100644 index 0000000..0a7c581 --- /dev/null +++ b/conf/demo.conf @@ -0,0 +1,14 @@ +#demo.conf文件内容: + +[sec_a] +a_key1 = 20 +a_key2 = 10 + +[sec_b] +b_key1 = 121 +b_key2 = b_value2 +b_key3 = $r +b_key4 = 127.0.0.1 + +[website] +url = http://www.tantengvip.com \ No newline at end of file diff --git a/read_write_conf.py b/read_write_conf.py new file mode 100644 index 0000000..c0454f9 --- /dev/null +++ b/read_write_conf.py @@ -0,0 +1,87 @@ +# encoding:utf-8 + +# !/usr/bin/env python + +# -*- Python读写conf格式配置文件 -*- + +__author__ = 'tanteng' + +import configparser +import webbrowser + +# 返回config对象 +conf = configparser.ConfigParser() +conf.read('./conf/demo.conf') + +# 读取配置文件 +def readConf(): + # 得到所有sections + sections = conf.sections() + print(sections) + + # 得到sec_a,sec_b的设置项 + options_sec_a = conf.options('sec_a') + print(options_sec_a) + + options_sec_b = conf.options('sec_b') + print(options_sec_b) + + # 得到sec_a,sec_b的设置键值对 + items_sec_a = conf.items('sec_a') + print(items_sec_a) + + items_sec_b = conf.items('sec_b') + print(items_sec_b) + + # 得到具体某个section某个option的值 + sec_a_key1 = conf.get('sec_a','a_key1') + print(sec_a_key1) + +readConf() + +''' +readConf()运行结果: + +['sec_a', 'sec_b'] +['a_key1', 'a_key2'] +['b_key1', 'b_key2', 'b_key3', 'b_key4'] +[('a_key1', '20'), ('a_key2', '10')] +[('b_key1', '121'), ('b_key2', 'b_value2'), ('b_key3', '$r'), ('b_key4', '127.0.0.1')] +20 +''' + +# 写配置文件 +def writeConf(): + # 更新某个section某个option的值 + conf.set('sec_a','a_key1','100') # 最后一个参数必须是string类型 + value = conf.get('sec_a','a_key1') + print(value) # 打印结果看是否设置成功 + + conf.add_section('new_section') + conf.set('new_section','new_option_name','new_option_value') + + new_sections = conf.sections() + + # 检测是否新增section和新增设置项成功 + print(new_sections) + print(conf.get('new_section','new_option_name')) + + +writeConf() + +''' +writeConf()运行结果: + +100 +['sec_a', 'sec_b', 'website', 'new_section'] +new_option_value +tantengdeMacBook-Pro:learn-python tanteng$ +''' + +# 更多Python3入门文章,读取网址配置跳转,现学现用 + +def jump(): + url = conf.get('website','url') + webbrowser.open(url) + +jump() From 94c7b4cd53747cf92833d84e4229a10137f63fe9 Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年11月23日 09:34:31 +0800 Subject: [PATCH 41/73] =?UTF-8?q?Python3=E8=AF=BB=E5=86=99conf=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=20fix:read=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E5=8A=A0=E4=B8=8Autf-8=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- read_write_conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/read_write_conf.py b/read_write_conf.py index c0454f9..76e066e 100644 --- a/read_write_conf.py +++ b/read_write_conf.py @@ -11,7 +11,7 @@ # 返回config对象 conf = configparser.ConfigParser() -conf.read('./conf/demo.conf') +conf.read('./conf/demo.conf', 'utf-8') # 读取配置文件 def readConf(): From 001bd86dc86b6ab5eeb65e35aa33af8d2b84c5ca Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年11月23日 17:01:44 +0800 Subject: [PATCH 42/73] =?UTF-8?q?Python3=E8=AF=BB=E5=86=99conf=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=20fix:read=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E5=8A=A0=E4=B8=8Autf-8=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- read_write_conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/read_write_conf.py b/read_write_conf.py index 76e066e..8448729 100644 --- a/read_write_conf.py +++ b/read_write_conf.py @@ -6,6 +6,7 @@ __author__ = 'tanteng' + import configparser import webbrowser From a4bca7c45b3eeccc777cd9e9995b73ea00756a47 Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年11月24日 14:37:55 +0800 Subject: [PATCH 43/73] =?UTF-8?q?python3=E4=B8=8B=E6=93=8D=E4=BD=9Credis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test_redis.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/test_redis.py b/test_redis.py index f5c6ee3..d44e850 100644 --- a/test_redis.py +++ b/test_redis.py @@ -1,8 +1,27 @@ +# encoding:utf-8 + import redis + + r = redis.StrictRedis(host='localhost', port=6379, db=0) -r.set('foo', 'bar') +r.set('foo', 'bar') foo = r.get('foo') -print(foo) -# b'bar' \ No newline at end of file +r.sadd('collection','abc') +r.sadd('collection','def') +r.sadd('collection','fhi') +r.sadd('collection','xwy') + +r.zadd('rank',1,'Alibaba') +r.zadd('rank',2,'Tencent') +r.zadd('rank',3,'Baidu') +r.zadd('rank',baidu=3,cc=3,ccc=34) +r.zadd('rank',4,6) + +r.rpush('list','www.tantengvip.com') +r.rpush('list','www.qq.com') +r.rpush('list','www.tencent.com') + +pop = r.lpop('list') +print(pop) \ No newline at end of file From ddd053f4931c1f91eafa16f80aef56d278f21080 Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年11月24日 14:38:39 +0800 Subject: [PATCH 44/73] =?UTF-8?q?python3=E4=B8=8B=E6=93=8D=E4=BD=9Credis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test_redis.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test_redis.py b/test_redis.py index d44e850..ce08993 100644 --- a/test_redis.py +++ b/test_redis.py @@ -1,6 +1,7 @@ # encoding:utf-8 import redis +import webbrowser r = redis.StrictRedis(host='localhost', port=6379, db=0) @@ -24,4 +25,6 @@ r.rpush('list','www.tencent.com') pop = r.lpop('list') -print(pop) \ No newline at end of file +print(pop) + +webbrowser.open('http://www.tantengvip.com',1) From d385323056d1a3eef5a4a501598bba5fae6b8ba0 Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年11月24日 15:02:24 +0800 Subject: [PATCH 45/73] =?UTF-8?q?Python3=E4=B8=AD=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E4=BE=8B=E6=A8=A1=E5=BC=8F=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- singleton.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 singleton.py diff --git a/singleton.py b/singleton.py new file mode 100644 index 0000000..43fe467 --- /dev/null +++ b/singleton.py @@ -0,0 +1,15 @@ +# encoding:utf-8 + +# -*- Python单例模式示例 -*- + +class Singleton(object): + def __new__(cls): + if not hasattr(cls, 'instance'): + cls.instance = super(Singleton, cls).__new__(cls) + return cls.instance + +if __name__ == '__main__': + a = Singleton() + b = Singleton() + print(id(a)) + print(id(b)) From 0c53fdb9a72887b4c299060962d63e414d954b6b Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年11月24日 15:22:40 +0800 Subject: [PATCH 46/73] =?UTF-8?q?Python3=E5=AE=9E=E7=8E=B0=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- binary_search.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 binary_search.py diff --git a/binary_search.py b/binary_search.py new file mode 100644 index 0000000..ea2cfa8 --- /dev/null +++ b/binary_search.py @@ -0,0 +1,23 @@ +# encoding:utf-8 + +# -*- Python二分查找算法 -*- +import sys + +def binarySearch(l, t): + low, high = 0, len(l) - 1 + while low < high: + print(low, high) + mid = int((low + high) / 2) + if l[mid]> t: + high = mid + elif l[mid] < t: + low = mid + 1 + else: + return mid + return False + +if __name__ == '__main__': + l = [1, 4, 12, 45, 66, 99, 120, 444] + print(binarySearch(l, 12)) + print(binarySearch(l, 1)) + print(binarySearch(l, 13)) \ No newline at end of file From fe7a730b6b749cd22b534a04bc8178507ff28e41 Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年11月25日 09:49:53 +0800 Subject: [PATCH 47/73] =?UTF-8?q?Python3=E5=8F=AF=E5=8F=98=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- args_kwargs.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/args_kwargs.py b/args_kwargs.py index f9f3681..67edeb8 100644 --- a/args_kwargs.py +++ b/args_kwargs.py @@ -1,10 +1,24 @@ +# encoding:utf-8 + +# -*- Python3可变参数 -*- + +import webbrowser + def alias(*args, **kwargs): print('args=', args) print('kwargs=', kwargs) alias(3, 23, 3, 3,a='hello',b=3,c='C') -'''输出 +""" +输出: args= (3, 23, 3, 3) kwargs= {'b': 3, 'c': 'C', 'a': 'hello'} -''' + +小结: +*args表示任何多个无名参数,它是一个tuple +**kwargs表示关键字参数,它是一个dict +""" + +# 具体参考资料 +webbrowser.open('http://www.tantengvip.com/2015/07/python-args-kwargs/', 1) From 6de22b2b23f7b3e16904f09c4e6c8f4f64e2ad2c Mon Sep 17 00:00:00 2001 From: Tony Date: 2015年11月25日 10:05:13 +0800 Subject: [PATCH 48/73] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8F=8F=E8=BF=B0?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3fd48e9..3cc3d9b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # learn-python -本人边学习Python3,边把一些小脚本(自己写的和网上找的)经过本机测试后然后同步到github上,供初学者下载研究,欢迎fork,也欢迎提交新的Python小脚本,特别是一些有趣好玩的小程序! +本人边学习Python3,边把一些小脚本(自己写的和网上找的)经过本机测试后然后同步到github上,供初学者下载研究,欢迎fork,也欢迎提交新的Python小脚本,特别是一些有趣好玩的小程序!有什么问题可以通过Issues讨论,喜欢的话点Star或分享给别人哦! +学习Python3记录博客: http://www.tantengvip.com/category/develop/python3/ From ae18bec3a51a67e34c881a927f9bc969c33a5666 Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年11月25日 10:29:52 +0800 Subject: [PATCH 49/73] =?UTF-8?q?Python3=E5=91=BD=E4=BB=A4=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sys_argv.py | 52 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/sys_argv.py b/sys_argv.py index 5bbcfa4..c38c0d1 100644 --- a/sys_argv.py +++ b/sys_argv.py @@ -1,24 +1,42 @@ -import sys +# encoding:utf-8 -# sys.argv接收参数,第一个参数是文件名,第二个参数开始是用户输入的参数,以空格隔开 +# !/usr/bin/env python -def run1(): - print('I\'m action1') +# -*- Python3命令行 -*- +import optparse +import sys -def run2(): - print('I\'m action2') +def process_command_line(argv): + """ + Return a 2-tuple: (settings object, args list). + `argv` is a list of arguments, or `None` for ``sys.argv[1:]``. + """ + if argv is None: + argv = sys.argv[1:] + # initialize the parser object: + parser = optparse.OptionParser( + formatter=optparse.TitledHelpFormatter(width=78), + add_help_option=None) + # define options here: + parser.add_option( # customized description; put --help last + '-h', '--help', action='help', + help='Show this help message and exit.') + settings, args = parser.parse_args(argv) + # check number of arguments, verify values, etc.: + if args: + parser.error('program takes no command-line arguments; ' + '"%s" ignored.' % (args,)) + # further process settings & args if necessary + return settings, args -if 2> len(sys.argv): - print('none') -else: - action1 = sys.argv[1] - action2 = sys.argv[2] +def main(argv=None): + settings, args = process_command_line(argv) + # application code here, like: + # run(settings, args) + return 0 # success - if 'run1' == action1: - run1() - if 'run2' == action2: - run2() - -#用法:在命令行执行脚本,python sys_argv.py run1 run2 +if __name__ == '__main__': + status = main() + sys.exit(status) \ No newline at end of file From c00073bec9fd45c3cccf060f43c203bbef0cea1f Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年11月25日 11:12:18 +0800 Subject: [PATCH 50/73] =?UTF-8?q?Python3=E5=91=BD=E4=BB=A4=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sys_argv.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/sys_argv.py b/sys_argv.py index c38c0d1..a1a6a62 100644 --- a/sys_argv.py +++ b/sys_argv.py @@ -6,6 +6,7 @@ import optparse import sys +import webbrowser def process_command_line(argv): @@ -23,6 +24,9 @@ def process_command_line(argv): parser.add_option( # customized description; put --help last '-h', '--help', action='help', help='Show this help message and exit.') + parser.add_option( + '-u', '--url', action='store', + help='Open a link.') settings, args = parser.parse_args(argv) # check number of arguments, verify values, etc.: if args: @@ -34,9 +38,24 @@ def process_command_line(argv): def main(argv=None): settings, args = process_command_line(argv) # application code here, like: - # run(settings, args) + run(settings, args) return 0 # success +def run(settings, args): + if settings.url: + webbrowser.open(settings.url, 1) + + if __name__ == '__main__': status = main() - sys.exit(status) \ No newline at end of file + sys.exit(status) + +""" +命令行功能: + +python sys_argv.py -h +显示帮助信息 + +python sys_argv.py -u www.163.com +用默认浏览器打开你输入的网址 +""" \ No newline at end of file From e9a113795bc5d11288512bc292564533baf10b4e Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年11月25日 11:17:44 +0800 Subject: [PATCH 51/73] =?UTF-8?q?Python3=E5=91=BD=E4=BB=A4=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sys_argv.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sys_argv.py b/sys_argv.py index a1a6a62..576d9b5 100644 --- a/sys_argv.py +++ b/sys_argv.py @@ -25,7 +25,7 @@ def process_command_line(argv): '-h', '--help', action='help', help='Show this help message and exit.') parser.add_option( - '-u', '--url', action='store', + '-u', '--url', action='store', dest = 'link', help='Open a link.') settings, args = parser.parse_args(argv) # check number of arguments, verify values, etc.: @@ -37,13 +37,14 @@ def process_command_line(argv): def main(argv=None): settings, args = process_command_line(argv) + print(settings) # application code here, like: run(settings, args) return 0 # success def run(settings, args): - if settings.url: - webbrowser.open(settings.url, 1) + if settings.link: + webbrowser.open(settings.link, 1) if __name__ == '__main__': From 21cc321eb67b9dc8db4dd52335e6f395d0cfa1e1 Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年11月25日 17:26:43 +0800 Subject: [PATCH 52/73] =?UTF-8?q?Python3=E5=91=BD=E4=BB=A4=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sys_argv.py | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/sys_argv.py b/sys_argv.py index 576d9b5..bf64c6e 100644 --- a/sys_argv.py +++ b/sys_argv.py @@ -22,11 +22,17 @@ def process_command_line(argv): add_help_option=None) # define options here: parser.add_option( # customized description; put --help last - '-h', '--help', action='help', - help='Show this help message and exit.') + '-h', '--help', action='help', help='Show this help message and exit.' + ) parser.add_option( - '-u', '--url', action='store', dest = 'link', - help='Open a link.') + '-u', '--url', action='store', dest = 'link', help='Open a link.' + ) + parser.add_option( + '-v', '--version', action='store_true', help='Show version.' + ) + parser.add_option( + '-q', '--quit', action='store_false',help='Quit' + ) settings, args = parser.parse_args(argv) # check number of arguments, verify values, etc.: if args: @@ -46,6 +52,10 @@ def run(settings, args): if settings.link: webbrowser.open(settings.link, 1) + if settings.version: + print('VERSION 1.0') + + if __name__ == '__main__': status = main() @@ -57,6 +67,15 @@ def run(settings, args): python sys_argv.py -h 显示帮助信息 +python sys_argv.py -v +显示版本号 + python sys_argv.py -u www.163.com 用默认浏览器打开你输入的网址 + +action四种参数: +help 显示帮助信息 +store 需要参数值 +store_true 不需要参数值,默认True +store_false 不需要参数值,默认False """ \ No newline at end of file From bb379f6ac5ea63fbf58edfc706920ab9e2560311 Mon Sep 17 00:00:00 2001 From: tanteng Date: 2015年11月26日 01:57:23 +0800 Subject: [PATCH 53/73] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96Scrapy?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=EF=BC=88Python=202.7=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- testscrapy/scrapy.cfg | 11 +++ testscrapy/testscrapy/__init__.py | 0 testscrapy/testscrapy/items.py | 14 ++++ testscrapy/testscrapy/pipelines.py | 11 +++ testscrapy/testscrapy/settings.py | 85 +++++++++++++++++++++++ testscrapy/testscrapy/spiders/__init__.py | 4 ++ 6 files changed, 125 insertions(+) create mode 100644 testscrapy/scrapy.cfg create mode 100644 testscrapy/testscrapy/__init__.py create mode 100644 testscrapy/testscrapy/items.py create mode 100644 testscrapy/testscrapy/pipelines.py create mode 100644 testscrapy/testscrapy/settings.py create mode 100644 testscrapy/testscrapy/spiders/__init__.py diff --git a/testscrapy/scrapy.cfg b/testscrapy/scrapy.cfg new file mode 100644 index 0000000..14dc346 --- /dev/null +++ b/testscrapy/scrapy.cfg @@ -0,0 +1,11 @@ +# Automatically created by: scrapy startproject +# +# For more information about the [deploy] section see: +# https://scrapyd.readthedocs.org/en/latest/deploy.html + +[settings] +default = testscrapy.settings + +[deploy] +#url = http://localhost:6800/ +project = testscrapy diff --git a/testscrapy/testscrapy/__init__.py b/testscrapy/testscrapy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/testscrapy/testscrapy/items.py b/testscrapy/testscrapy/items.py new file mode 100644 index 0000000..43c3bfb --- /dev/null +++ b/testscrapy/testscrapy/items.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- + +# Define here the models for your scraped items +# +# See documentation in: +# http://doc.scrapy.org/en/latest/topics/items.html + +import scrapy + + +class TestscrapyItem(scrapy.Item): + # define the fields for your item here like: + # name = scrapy.Field() + pass diff --git a/testscrapy/testscrapy/pipelines.py b/testscrapy/testscrapy/pipelines.py new file mode 100644 index 0000000..39adb44 --- /dev/null +++ b/testscrapy/testscrapy/pipelines.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- + +# Define your item pipelines here +# +# Don't forget to add your pipeline to the ITEM_PIPELINES setting +# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html + + +class TestscrapyPipeline(object): + def process_item(self, item, spider): + return item diff --git a/testscrapy/testscrapy/settings.py b/testscrapy/testscrapy/settings.py new file mode 100644 index 0000000..8cc405f --- /dev/null +++ b/testscrapy/testscrapy/settings.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- + +# Scrapy settings for testscrapy project +# +# For simplicity, this file contains only settings considered important or +# commonly used. You can find more settings consulting the documentation: +# +# http://doc.scrapy.org/en/latest/topics/settings.html +# http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html +# http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html + +BOT_NAME = 'testscrapy' + +SPIDER_MODULES = ['testscrapy.spiders'] +NEWSPIDER_MODULE = 'testscrapy.spiders' + + +# Crawl responsibly by identifying yourself (and your website) on the user-agent +#USER_AGENT = 'testscrapy (+http://www.yourdomain.com)' + +# Configure maximum concurrent requests performed by Scrapy (default: 16) +#CONCURRENT_REQUESTS=32 + +# Configure a delay for requests for the same website (default: 0) +# See http://scrapy.readthedocs.org/en/latest/topics/settings.html#download-delay +# See also autothrottle settings and docs +#DOWNLOAD_DELAY=3 +# The download delay setting will honor only one of: +#CONCURRENT_REQUESTS_PER_DOMAIN=16 +#CONCURRENT_REQUESTS_PER_IP=16 + +# Disable cookies (enabled by default) +#COOKIES_ENABLED=False + +# Disable Telnet Console (enabled by default) +#TELNETCONSOLE_ENABLED=False + +# Override the default request headers: +#DEFAULT_REQUEST_HEADERS = { +# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', +# 'Accept-Language': 'en', +#} + +# Enable or disable spider middlewares +# See http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html +#SPIDER_MIDDLEWARES = { +# 'testscrapy.middlewares.MyCustomSpiderMiddleware': 543, +#} + +# Enable or disable downloader middlewares +# See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html +#DOWNLOADER_MIDDLEWARES = { +# 'testscrapy.middlewares.MyCustomDownloaderMiddleware': 543, +#} + +# Enable or disable extensions +# See http://scrapy.readthedocs.org/en/latest/topics/extensions.html +#EXTENSIONS = { +# 'scrapy.telnet.TelnetConsole': None, +#} + +# Configure item pipelines +# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html +#ITEM_PIPELINES = { +# 'testscrapy.pipelines.SomePipeline': 300, +#} + +# Enable and configure the AutoThrottle extension (disabled by default) +# See http://doc.scrapy.org/en/latest/topics/autothrottle.html +# NOTE: AutoThrottle will honour the standard settings for concurrency and delay +#AUTOTHROTTLE_ENABLED=True +# The initial download delay +#AUTOTHROTTLE_START_DELAY=5 +# The maximum download delay to be set in case of high latencies +#AUTOTHROTTLE_MAX_DELAY=60 +# Enable showing throttling stats for every response received: +#AUTOTHROTTLE_DEBUG=False + +# Enable and configure HTTP caching (disabled by default) +# See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings +#HTTPCACHE_ENABLED=True +#HTTPCACHE_EXPIRATION_SECS=0 +#HTTPCACHE_DIR='httpcache' +#HTTPCACHE_IGNORE_HTTP_CODES=[] +#HTTPCACHE_STORAGE='scrapy.extensions.httpcache.FilesystemCacheStorage' diff --git a/testscrapy/testscrapy/spiders/__init__.py b/testscrapy/testscrapy/spiders/__init__.py new file mode 100644 index 0000000..ebd689a --- /dev/null +++ b/testscrapy/testscrapy/spiders/__init__.py @@ -0,0 +1,4 @@ +# This package will contain the spiders of your Scrapy project +# +# Please refer to the documentation for information on how to create and manage +# your spiders. From 5f54f1d93d7a73df960c8162817a09b949719b63 Mon Sep 17 00:00:00 2001 From: tanteng Date: 2015年11月26日 22:35:58 +0800 Subject: [PATCH 54/73] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- testscrapy/scrapy.cfg | 11 --- testscrapy/testscrapy/__init__.py | 0 testscrapy/testscrapy/items.py | 14 ---- testscrapy/testscrapy/pipelines.py | 11 --- testscrapy/testscrapy/settings.py | 85 ----------------------- testscrapy/testscrapy/spiders/__init__.py | 4 -- 6 files changed, 125 deletions(-) delete mode 100644 testscrapy/scrapy.cfg delete mode 100644 testscrapy/testscrapy/__init__.py delete mode 100644 testscrapy/testscrapy/items.py delete mode 100644 testscrapy/testscrapy/pipelines.py delete mode 100644 testscrapy/testscrapy/settings.py delete mode 100644 testscrapy/testscrapy/spiders/__init__.py diff --git a/testscrapy/scrapy.cfg b/testscrapy/scrapy.cfg deleted file mode 100644 index 14dc346..0000000 --- a/testscrapy/scrapy.cfg +++ /dev/null @@ -1,11 +0,0 @@ -# Automatically created by: scrapy startproject -# -# For more information about the [deploy] section see: -# https://scrapyd.readthedocs.org/en/latest/deploy.html - -[settings] -default = testscrapy.settings - -[deploy] -#url = http://localhost:6800/ -project = testscrapy diff --git a/testscrapy/testscrapy/__init__.py b/testscrapy/testscrapy/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/testscrapy/testscrapy/items.py b/testscrapy/testscrapy/items.py deleted file mode 100644 index 43c3bfb..0000000 --- a/testscrapy/testscrapy/items.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- - -# Define here the models for your scraped items -# -# See documentation in: -# http://doc.scrapy.org/en/latest/topics/items.html - -import scrapy - - -class TestscrapyItem(scrapy.Item): - # define the fields for your item here like: - # name = scrapy.Field() - pass diff --git a/testscrapy/testscrapy/pipelines.py b/testscrapy/testscrapy/pipelines.py deleted file mode 100644 index 39adb44..0000000 --- a/testscrapy/testscrapy/pipelines.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- - -# Define your item pipelines here -# -# Don't forget to add your pipeline to the ITEM_PIPELINES setting -# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html - - -class TestscrapyPipeline(object): - def process_item(self, item, spider): - return item diff --git a/testscrapy/testscrapy/settings.py b/testscrapy/testscrapy/settings.py deleted file mode 100644 index 8cc405f..0000000 --- a/testscrapy/testscrapy/settings.py +++ /dev/null @@ -1,85 +0,0 @@ -# -*- coding: utf-8 -*- - -# Scrapy settings for testscrapy project -# -# For simplicity, this file contains only settings considered important or -# commonly used. You can find more settings consulting the documentation: -# -# http://doc.scrapy.org/en/latest/topics/settings.html -# http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html -# http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html - -BOT_NAME = 'testscrapy' - -SPIDER_MODULES = ['testscrapy.spiders'] -NEWSPIDER_MODULE = 'testscrapy.spiders' - - -# Crawl responsibly by identifying yourself (and your website) on the user-agent -#USER_AGENT = 'testscrapy (+http://www.yourdomain.com)' - -# Configure maximum concurrent requests performed by Scrapy (default: 16) -#CONCURRENT_REQUESTS=32 - -# Configure a delay for requests for the same website (default: 0) -# See http://scrapy.readthedocs.org/en/latest/topics/settings.html#download-delay -# See also autothrottle settings and docs -#DOWNLOAD_DELAY=3 -# The download delay setting will honor only one of: -#CONCURRENT_REQUESTS_PER_DOMAIN=16 -#CONCURRENT_REQUESTS_PER_IP=16 - -# Disable cookies (enabled by default) -#COOKIES_ENABLED=False - -# Disable Telnet Console (enabled by default) -#TELNETCONSOLE_ENABLED=False - -# Override the default request headers: -#DEFAULT_REQUEST_HEADERS = { -# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', -# 'Accept-Language': 'en', -#} - -# Enable or disable spider middlewares -# See http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html -#SPIDER_MIDDLEWARES = { -# 'testscrapy.middlewares.MyCustomSpiderMiddleware': 543, -#} - -# Enable or disable downloader middlewares -# See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html -#DOWNLOADER_MIDDLEWARES = { -# 'testscrapy.middlewares.MyCustomDownloaderMiddleware': 543, -#} - -# Enable or disable extensions -# See http://scrapy.readthedocs.org/en/latest/topics/extensions.html -#EXTENSIONS = { -# 'scrapy.telnet.TelnetConsole': None, -#} - -# Configure item pipelines -# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html -#ITEM_PIPELINES = { -# 'testscrapy.pipelines.SomePipeline': 300, -#} - -# Enable and configure the AutoThrottle extension (disabled by default) -# See http://doc.scrapy.org/en/latest/topics/autothrottle.html -# NOTE: AutoThrottle will honour the standard settings for concurrency and delay -#AUTOTHROTTLE_ENABLED=True -# The initial download delay -#AUTOTHROTTLE_START_DELAY=5 -# The maximum download delay to be set in case of high latencies -#AUTOTHROTTLE_MAX_DELAY=60 -# Enable showing throttling stats for every response received: -#AUTOTHROTTLE_DEBUG=False - -# Enable and configure HTTP caching (disabled by default) -# See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings -#HTTPCACHE_ENABLED=True -#HTTPCACHE_EXPIRATION_SECS=0 -#HTTPCACHE_DIR='httpcache' -#HTTPCACHE_IGNORE_HTTP_CODES=[] -#HTTPCACHE_STORAGE='scrapy.extensions.httpcache.FilesystemCacheStorage' diff --git a/testscrapy/testscrapy/spiders/__init__.py b/testscrapy/testscrapy/spiders/__init__.py deleted file mode 100644 index ebd689a..0000000 --- a/testscrapy/testscrapy/spiders/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# This package will contain the spiders of your Scrapy project -# -# Please refer to the documentation for information on how to create and manage -# your spiders. From b3c95bf70c2112d73efb56dc1a7ca92367b15d4d Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年11月27日 10:44:39 +0800 Subject: [PATCH 55/73] =?UTF-8?q?Scrapy=E7=88=AC=E8=99=AB=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=EF=BC=88Python=202.7=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- myspiders/blog/blog/__init__.py | 0 myspiders/blog/blog/items.py | 14 ++++ myspiders/blog/blog/pipelines.py | 11 ++++ myspiders/blog/blog/settings.py | 85 +++++++++++++++++++++++++ myspiders/blog/blog/spiders/__init__.py | 4 ++ myspiders/blog/scrapy.cfg | 11 ++++ 6 files changed, 125 insertions(+) create mode 100644 myspiders/blog/blog/__init__.py create mode 100644 myspiders/blog/blog/items.py create mode 100644 myspiders/blog/blog/pipelines.py create mode 100644 myspiders/blog/blog/settings.py create mode 100644 myspiders/blog/blog/spiders/__init__.py create mode 100644 myspiders/blog/scrapy.cfg diff --git a/myspiders/blog/blog/__init__.py b/myspiders/blog/blog/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myspiders/blog/blog/items.py b/myspiders/blog/blog/items.py new file mode 100644 index 0000000..981f888 --- /dev/null +++ b/myspiders/blog/blog/items.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- + +# Define here the models for your scraped items +# +# See documentation in: +# http://doc.scrapy.org/en/latest/topics/items.html + +import scrapy + + +class BlogItem(scrapy.Item): + # define the fields for your item here like: + # name = scrapy.Field() + pass diff --git a/myspiders/blog/blog/pipelines.py b/myspiders/blog/blog/pipelines.py new file mode 100644 index 0000000..06ddf7d --- /dev/null +++ b/myspiders/blog/blog/pipelines.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- + +# Define your item pipelines here +# +# Don't forget to add your pipeline to the ITEM_PIPELINES setting +# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html + + +class BlogPipeline(object): + def process_item(self, item, spider): + return item diff --git a/myspiders/blog/blog/settings.py b/myspiders/blog/blog/settings.py new file mode 100644 index 0000000..de211db --- /dev/null +++ b/myspiders/blog/blog/settings.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- + +# Scrapy settings for blog project +# +# For simplicity, this file contains only settings considered important or +# commonly used. You can find more settings consulting the documentation: +# +# http://doc.scrapy.org/en/latest/topics/settings.html +# http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html +# http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html + +BOT_NAME = 'blog' + +SPIDER_MODULES = ['blog.spiders'] +NEWSPIDER_MODULE = 'blog.spiders' + + +# Crawl responsibly by identifying yourself (and your website) on the user-agent +#USER_AGENT = 'blog (+http://www.yourdomain.com)' + +# Configure maximum concurrent requests performed by Scrapy (default: 16) +#CONCURRENT_REQUESTS=32 + +# Configure a delay for requests for the same website (default: 0) +# See http://scrapy.readthedocs.org/en/latest/topics/settings.html#download-delay +# See also autothrottle settings and docs +#DOWNLOAD_DELAY=3 +# The download delay setting will honor only one of: +#CONCURRENT_REQUESTS_PER_DOMAIN=16 +#CONCURRENT_REQUESTS_PER_IP=16 + +# Disable cookies (enabled by default) +#COOKIES_ENABLED=False + +# Disable Telnet Console (enabled by default) +#TELNETCONSOLE_ENABLED=False + +# Override the default request headers: +#DEFAULT_REQUEST_HEADERS = { +# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', +# 'Accept-Language': 'en', +#} + +# Enable or disable spider middlewares +# See http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html +#SPIDER_MIDDLEWARES = { +# 'blog.middlewares.MyCustomSpiderMiddleware': 543, +#} + +# Enable or disable downloader middlewares +# See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html +#DOWNLOADER_MIDDLEWARES = { +# 'blog.middlewares.MyCustomDownloaderMiddleware': 543, +#} + +# Enable or disable extensions +# See http://scrapy.readthedocs.org/en/latest/topics/extensions.html +#EXTENSIONS = { +# 'scrapy.telnet.TelnetConsole': None, +#} + +# Configure item pipelines +# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html +#ITEM_PIPELINES = { +# 'blog.pipelines.SomePipeline': 300, +#} + +# Enable and configure the AutoThrottle extension (disabled by default) +# See http://doc.scrapy.org/en/latest/topics/autothrottle.html +# NOTE: AutoThrottle will honour the standard settings for concurrency and delay +#AUTOTHROTTLE_ENABLED=True +# The initial download delay +#AUTOTHROTTLE_START_DELAY=5 +# The maximum download delay to be set in case of high latencies +#AUTOTHROTTLE_MAX_DELAY=60 +# Enable showing throttling stats for every response received: +#AUTOTHROTTLE_DEBUG=False + +# Enable and configure HTTP caching (disabled by default) +# See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings +#HTTPCACHE_ENABLED=True +#HTTPCACHE_EXPIRATION_SECS=0 +#HTTPCACHE_DIR='httpcache' +#HTTPCACHE_IGNORE_HTTP_CODES=[] +#HTTPCACHE_STORAGE='scrapy.extensions.httpcache.FilesystemCacheStorage' diff --git a/myspiders/blog/blog/spiders/__init__.py b/myspiders/blog/blog/spiders/__init__.py new file mode 100644 index 0000000..ebd689a --- /dev/null +++ b/myspiders/blog/blog/spiders/__init__.py @@ -0,0 +1,4 @@ +# This package will contain the spiders of your Scrapy project +# +# Please refer to the documentation for information on how to create and manage +# your spiders. diff --git a/myspiders/blog/scrapy.cfg b/myspiders/blog/scrapy.cfg new file mode 100644 index 0000000..14b8feb --- /dev/null +++ b/myspiders/blog/scrapy.cfg @@ -0,0 +1,11 @@ +# Automatically created by: scrapy startproject +# +# For more information about the [deploy] section see: +# https://scrapyd.readthedocs.org/en/latest/deploy.html + +[settings] +default = blog.settings + +[deploy] +#url = http://localhost:6800/ +project = blog From e520954a9c11d72ee5512157f66de872e1793c91 Mon Sep 17 00:00:00 2001 From: tuntun Date: 2015年11月27日 16:24:26 +0800 Subject: [PATCH 56/73] =?UTF-8?q?=E4=B8=80=E4=B8=AA=E6=9C=80=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E7=9A=84Scrapy=E6=8A=93=E5=8F=96=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- myspiders/blog/blog/items.py | 4 +++- myspiders/blog/blog/pipelines.py | 16 ++++++++++++- myspiders/blog/blog/settings.py | 6 ++--- myspiders/blog/blog/spiders/IndexSpider.py | 27 ++++++++++++++++++++++ myspiders/blog/index.json | 16 +++++++++++++ 5 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 myspiders/blog/blog/spiders/IndexSpider.py create mode 100644 myspiders/blog/index.json diff --git a/myspiders/blog/blog/items.py b/myspiders/blog/blog/items.py index 981f888..7449904 100644 --- a/myspiders/blog/blog/items.py +++ b/myspiders/blog/blog/items.py @@ -11,4 +11,6 @@ class BlogItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() - pass + title = scrapy.Field() + link = scrapy.Field() + description = scrapy.Field() diff --git a/myspiders/blog/blog/pipelines.py b/myspiders/blog/blog/pipelines.py index 06ddf7d..9c2d582 100644 --- a/myspiders/blog/blog/pipelines.py +++ b/myspiders/blog/blog/pipelines.py @@ -4,8 +4,22 @@ # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html - +import json class BlogPipeline(object): + + def __init__(self): + pass + # self.file = open('./blog.json','wb') + def process_item(self, item, spider): + # self.file.write(json.dumps(dict(item), ensure_ascii=False).encode('utf8') + '\n') + if(item['description']): + item['description'] = ''.join(item['description']) + return item + + + def spider_closed(self, spider): + pass + # self.file.close() diff --git a/myspiders/blog/blog/settings.py b/myspiders/blog/blog/settings.py index de211db..e7a4c92 100644 --- a/myspiders/blog/blog/settings.py +++ b/myspiders/blog/blog/settings.py @@ -61,9 +61,9 @@ # Configure item pipelines # See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html -#ITEM_PIPELINES = { -# 'blog.pipelines.SomePipeline': 300, -#} +ITEM_PIPELINES = { + 'blog.pipelines.BlogPipeline': 300, +} # Enable and configure the AutoThrottle extension (disabled by default) # See http://doc.scrapy.org/en/latest/topics/autothrottle.html diff --git a/myspiders/blog/blog/spiders/IndexSpider.py b/myspiders/blog/blog/spiders/IndexSpider.py new file mode 100644 index 0000000..0a1948b --- /dev/null +++ b/myspiders/blog/blog/spiders/IndexSpider.py @@ -0,0 +1,27 @@ +from scrapy.spiders import Spider +from scrapy.selector import Selector + +from blog.items import BlogItem + + +class BlogIndexSpider(Spider): + name = "index" + allowed_domains = ["tantengvip.com"] + start_urls = [ + "http://www.tantengvip.com/", + ] + + def parse(self, response): + sel = Selector(response) + articles = sel.xpath('//div[@id="content"]/article') + items = [] + + for article in articles: + item = BlogItem() + item['title'] = article.xpath('header/h1[@class="entry-title"]/a/text()').extract() + item['link'] = article.xpath('header/h1[@class="entry-title"]/a/@href').extract() + item['description'] = article.xpath('div[@class="entry-content"]/p[position()<3]/text()').extract() + + items.append(item) + + return items \ No newline at end of file diff --git a/myspiders/blog/index.json b/myspiders/blog/index.json new file mode 100644 index 0000000..3d9c9ec --- /dev/null +++ b/myspiders/blog/index.json @@ -0,0 +1,16 @@ +[{"link": ["http://www.tantengvip.com/2015/11/windows-python27-scrapy/"], "description": "\u7531\u4e8eScrapy\u76ee\u524d\u5bf9Python2.7\u7684\u652f\u6301\u6700\u597d\uff0cPython3\u4e0b\u53ef\u80fd\u4f1a\u6709\u95ee\u9898\uff0c\u6240\u4ee5\u8fd8\u662f\u5728Python2.7\u4e0b\u88c5Scrapy\u6a21\u5757\u3002\u5728Mac\u4e0a\u81ea\u5e26\u7684Python2.7\u73af\u5883\u5b89\u88c5Scrapy\u6a21\u5757\uff0c\u4e00\u8def\u987a\u98ce\uff0c\u76f4\u63a5pip install -i http://pypi.douban.com/simple Scrapy,\u81ea\u52a8\u5b89\u88c5\u6240\u9700\u7684\u6a21\u5757\uff0c\u4e00\u5207OK.", "title": ["\u5728windows\u4e0a\u5b89\u88c5Python2.7 Scrapy\u6a21\u5757"]}, +{"link": ["http://www.tantengvip.com/2015/11/redis-set/"], "description": "\u4e3a\u4e86\u5e7f\u5927\u4eb2\u4eec\u80fd\u591f\u597d\u597d\u5241\u624b\uff0c\u6211\u4eec\u4e5f\u662f\u62fc\u4e86\uff0c\u201c\u53cc\u5341\u4e00\u201d\u4e00\u8fc7\uff0c\u6211\u4eec\u5c31\u5f00\u59cb\u51c6\u5907\u201c\u53cc\u5341\u4e8c\u201d\u4e86\uff0c\u5927\u4fc3\u6d3b\u52a8\u6709\u5f88\u591a\uff0c\u672c\u6587\u4ee5\u201c\u4e0b\u5355\u6709\u793c\u201d\u7684\u529f\u80fd\u5b9e\u73b0\uff0c\u8bb2\u8bb2redis\u7684\u51e0\u4e2a\u7528\u6cd5\uff0c\u5982redis\u96c6\u5408\u3001\u81ea\u589e\u7684\u5177\u4f53\u5e94\u7528\u3002\u8fd9\u91cc\u4ec5\u4ec5\u4e3e\u4e2a\u5c0f\u4f8b\u5b50\uff0c\u5728\u4e00\u4e2a\u5927\u578b\u7f51\u7ad9\u591a\u4e2a\u7ec8\u7aef\u4e2d\uff0c\u8981\u8003\u8651\u5404\u79cd\u4e0d\u540c\u7684\u60c5\u51b5\u548c\u5e94\u7528\u573a\u666f\u3002 ", "title": ["Redis\u96c6\u5408\u7684\u5e94\u7528:\u4e0b\u5355\u6709\u793c\u529f\u80fd\u5b9e\u73b0"]}, +{"link": ["http://www.tantengvip.com/2015/11/flushdb-redis/"], "description": "\u4f7f\u7528flushdb\u547d\u4ee4\u53ef\u4ee5\u6e05\u9664redis\u5176\u4e2d\u4e00\u4e2a\u6570\u636e\u5e93\u7684\u6240\u6709\u6570\u636e\uff0cflushall\u547d\u4ee4\u6e05\u9664\u6574\u4e2aredis\u6240\u6709\u6570\u636e\u5e93\u7684\u6570\u636e\u3002", "title": ["flushdb\u547d\u4ee4\u6e05\u9664REDIS\u6240\u6709\u6570\u636e"]}, +{"link": ["http://www.tantengvip.com/2015/11/python-singleton/"], "description": "\u5f53\u6211\u4eec\u7406\u89e3\u4e86Python\u7684__new__\u65b9\u6cd5\u540e\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u5229\u7528\u5b83\u6765\u505a\u4e00\u4e9b\u5176\u4ed6\u6709\u8da3\u7684\u4e8b\u60c5\uff0c\u6bd4\u5982\u5b9e\u73b0\u8bbe\u8ba1\u6a21\u5f0f\u4e2d\u7684\u5355\u4f8b\u6a21\u5f0f(singleton) \u3002\u56e0\u4e3a\u7c7b\u6bcf\u4e00\u6b21\u5b9e\u4f8b\u5316\u540e\u4ea7\u751f\u7684\u8fc7\u7a0b\u90fd\u662f\u901a\u8fc7__new__\u6765\u63a7\u5236\u7684\uff0c\u6240\u4ee5\u901a\u8fc7\u91cd\u8f7d__new__\u65b9\u6cd5\uff0c\u6211\u4eec\u53ef\u4ee5\u5f88\u7b80\u5355\u7684\u5b9e\u73b0\u5355\u4f8b\u6a21\u5f0f\u3002", "title": ["Python3\u5355\u4f8b\u6a21\u5f0f\u793a\u4f8b"]}, +{"link": ["http://www.tantengvip.com/2015/11/pip-mirror/"], "description": "\u4f7f\u7528pip\u5b89\u88c5python\u5305\u7531\u4e8e\u5b98\u7f51\u7ecf\u5e38\u88ab\u5899\u65e0\u6cd5\u5b89\u88c5\uff0c\u53ef\u4ee5\u4f7f\u7528pip\u955c\u50cf\u65b9\u5f0f\u5b89\u88c5python\u5305\u3002 ", "title": ["\u4f7f\u7528pip\u955c\u50cf\u65b9\u5f0f\u5b89\u88c5python\u5305"]}, +{"link": ["http://www.tantengvip.com/2015/11/mac-install-redis/"], "description": "\u53bbredis\u5b98\u7f51()\u81ea\u884c\u4e0b\u8f7d\u5b89\u88c5\u5305\u89e3\u538b\u7f29\u5230\u672c\u5730\u6587\u4ef6\u5939\uff0c\u6bd4\u5982\u653e\u5728Mac\u5e94\u7528\u7a0b\u5e8f\u6587\u4ef6\u5939(/Applications/)\uff0c\u5728\u7ec8\u7aef\u8fdb\u5165redis\u6587\u4ef6\u5939\u3002", "title": ["Mac\u4e0b\u5b89\u88c5Redis"]}, +{"link": ["http://www.tantengvip.com/2015/11/httpd-vhost-domain-alias/"], "description": "\u5728Apache\u7684httpd-vhosts\u53ef\u4ee5\u914d\u7f6e\u865a\u62df\u4e3b\u673a\u57df\u540d\uff0c\u4e5f\u53ef\u4ee5\u8bbe\u7f6e\u57df\u540d\u522b\u540d\uff0c\u5982\u57df\u540dwww.yii2.com\uff0c\u53ef\u4ee5\u7ed9\u5b83\u8bbe\u7f6e\u4e00\u4e2a\u6216\u591a\u4e2a\u57df\u540d\u522b\u540d\uff0c\u901a\u8fc7www.yii3.com,www.yii4.com\u8bbf\u95ee\u3002 ", "title": ["httpd-vhosts\u8bbe\u7f6e\u57df\u540d\u522b\u540d"]}, +{"link": ["http://www.tantengvip.com/2015/11/php-abstract-interface-demo/"], "description": "\u62bd\u8c61\u7c7b(abstract class)\u548c\u63a5\u53e3(interface)\u662f\u9762\u5411\u5bf9\u8c61\u5f88\u91cd\u8981\u7684\u6982\u5ff5\uff0c\u4ed6\u4eec\u5f88\u76f8\u4f3c\uff0c\u90fd\u662f\u5b9a\u4e49\u8981\u5b9e\u73b0\u7684\u65b9\u6cd5\uff0c\u4f46\u53c8\u6709\u4e0d\u540c\u7684\u4f7f\u7528\u573a\u666f\uff0cPHP\u7684\u62bd\u8c61\u7c7b\u548c\u63a5\u53e3\u6709\u4ec0\u4e48\u533a\u522b\uff0c\u770b\u4e0b\u9762\u7684\u793a\u4f8b\u3002 ", "title": ["PHP\u62bd\u8c61\u7c7b\u548c\u63a5\u53e3\u793a\u4f8b\u548c\u533a\u522b"]}, +{"link": ["http://www.tantengvip.com/2015/11/python-ebook/"], "description": "\u770b\u4e91\u4e0a\u51e0\u672c\u5b66python\u7684\u514d\u8d39\u7535\u5b50\u4e66\uff1a\u94fe\u63a5\uff1a", "title": ["\u5b66python\u7684\u51e0\u672c\u7535\u5b50\u4e66"]}, +{"link": ["http://www.tantengvip.com/2015/11/mac-yii2-migrate/"], "description": "Yii2 migrate\u7684\u6982\u5ff5\uff1a\u4e0b\u9762\u662f\u5728Mac\u4e0b\u4f7f\u7528 Yii 2 migrate \u547d\u4ee4\u5b89\u88c5\u521d\u59cb\u5316\u6570\u636e\u5e93\uff1a", "title": ["Mac\u4e0bYii 2 migrate\u547d\u4ee4\u64cd\u4f5c\u6570\u636e\u5e93"]}, +{"link": ["http://www.tantengvip.com/2015/11/html5-localstorage/"], "description": "\u672c\u5730\u5b58\u50a8\u89e3\u51b3\u65b9\u6848\u5f88\u591a\uff0c\u6bd4\u5982Flash SharedObject\u3001Google Gears\u3001Cookie\u3001DOM Storage\u3001User Data\u3001window.name\u3001Silverlight\u3001Open Database\u7b49\u3002", "title": ["HTML5\u7684\u672c\u5730\u5b58\u50a8\u65b9\u6848localStorage"]}, +{"link": ["http://www.tantengvip.com/2015/11/github-image-hosting/"], "description": "\u5728\u77e5\u4e4e\u4e0a\u770b\u5230\u4e00\u4e2a\u56de\u7b54\uff0c\u95ee\u9898\u662f\u300e\u300f\uff0c\u7adf\u7136\u6709\u4eba\u8bf4\u53ef\u4ee5\u628aGithub\u5f53\u514d\u8d39\u56fe\u5e8a\uff0c\u540e\u6765\u4e00\u60f3\uff0c\u786e\u5b9e\u53ef\u4ee5\u554a\uff0c\u641c\u7d22\u4e00\u4e0b\u770b\u679c\u7136\u6709\u65b9\u6cd5\uff0c\u5176\u5b9e\u539f\u7406\u4e5f\u5f88\u7b80\u5355\u3002 ", "title": ["\u628aGithub\u5f53\u514d\u8d39\u56fe\u5e8a"]}, +{"link": ["http://www.tantengvip.com/2015/11/wordpress-url-get-route/"], "description": "WordPress\u6dfb\u52a0\u8def\u7531\u89c4\u5219\u51fd\u6570add_rewrite_rule\uff0c\u4f7f\u7528\u793a\u4f8b\uff1a\u8fd9\u6837url www.xx.com/haha/tuntun \uff0c\u5b9e\u9645\u4e0a\u5c31\u4f1a\u8bbf\u95ee /index.php?page_id=8&myname=tuntun", "title": ["WordPress\u53c2\u6570\u4f20\u9012\u548c\u8def\u7531\u89c4\u5219"]}, +{"link": ["http://www.tantengvip.com/2015/11/wordpress-redis/"], "description": "\u5728WordPress\u6d4b\u8bd5\u4e86\u4e00\u4e0b\u4f7f\u7528Redis\uff0c\u505a\u4e86\u4e2a\u6d4b\u8bd5\u63d2\u4ef6\uff0c\u8fd9\u4e2a\u63d2\u4ef6\u4e0d\u53ef\u6b63\u5f0f\u7528\u4e8e\u9879\u76ee\uff01\u8fd9\u4e2a\u63d2\u4ef6\u4e0d\u53ef\u6b63\u5f0f\u7528\u4e8e\u9879\u76ee\uff01\u8fd9\u4e2a\u63d2\u4ef6\u4e0d\u53ef\u6b63\u5f0f\u7528\u4e8e\u9879\u76ee\uff01\u8fd9\u53ea\u662f\u6d4b\u8bd5\u5728WordPress\u4e2d\u5b9e\u73b0Redis\u7684\u4f7f\u7528\uff0c\u4eceYii2\u7684\u4e00\u4e2aRedis\u7c7b\u7248\u4ee3\u7801\u8fc7\u6765\uff0c\u770b\u80fd\u4e0d\u80fd\u6210\u529f\u5b9e\u73b0Redis\uff0c\u7ed3\u679c\u662fOK\u7684\u3002\u8fd9\u4ec5\u4ec5\u662f \u6d4b\u8bd5\u4ee3\u7801\u3002", "title": ["\u5728WordPress\u4e2d\u4f7f\u7528Redis"]}, +{"link": ["http://www.tantengvip.com/2015/11/serialize-json-diff/"], "description": "\u5728PHP\u4e2d\uff0cserialize\u548cjson\u4e24\u79cd\u65b9\u5f0f\u5bf9\u4e00\u4e2a\u5bf9\u8c61\u6216\u6570\u7ec4\u8fdb\u884c\u5e8f\u5217\u5316\u6216\u53cd\u5e8f\u5217\u5316\u6709\u4ec0\u4e48\u533a\u522b\u5462\uff1f\u5047\u8bbe\u4e00\u4e2a\u5bf9\u8c61\u548c\u4e00\u4e2a\u6570\u7ec4\uff1a", "title": ["PHP\u4e2dserialize\u548cjson\u5e8f\u5217\u5316\u4e0e\u53cd\u5e8f\u5217\u5316\u7684\u533a\u522b"]}, +{"link": ["http://www.tantengvip.com/2015/11/sourcetree-commit-slowly/"], "description": "SourceTree\u63d0\u4ea4\u4ee3\u7801\u5361\u6b7b\uff0c\u7279\u522b\u662f\u4e00\u6b21\u63d0\u4ea4\u7684\u4ee3\u7801\u6587\u4ef6\u5f88\u591a\u7684\u65f6\u5019\uff0c\u8fd9\u4e2a\u65f6\u5019\u5efa\u8bae\u7528Git\u547d\u4ee4\u884c\u7684\u65b9\u5f0f\u63d0\u4ea4\uff0c\u5c31\u4e0d\u4f1a\u51fa\u73b0\u5361\u6b7b\u7684\u60c5\u51b5\u3002", "title": ["\u89e3\u51b3SourceTree\u8fd0\u884c\u6162\u7684\u65b9\u6cd5"]}] \ No newline at end of file From 8288114cfe9da5cd681722edde826231a829abb9 Mon Sep 17 00:00:00 2001 From: tanteng Date: 2015年11月27日 21:11:18 +0800 Subject: [PATCH 57/73] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- myspiders/blog/blog/__init__.py | 0 myspiders/blog/blog/items.py | 16 ---- myspiders/blog/blog/pipelines.py | 25 ------- myspiders/blog/blog/settings.py | 85 ---------------------- myspiders/blog/blog/spiders/IndexSpider.py | 27 ------- myspiders/blog/blog/spiders/__init__.py | 4 - myspiders/blog/index.json | 16 ---- myspiders/blog/scrapy.cfg | 11 --- 8 files changed, 184 deletions(-) delete mode 100644 myspiders/blog/blog/__init__.py delete mode 100644 myspiders/blog/blog/items.py delete mode 100644 myspiders/blog/blog/pipelines.py delete mode 100644 myspiders/blog/blog/settings.py delete mode 100644 myspiders/blog/blog/spiders/IndexSpider.py delete mode 100644 myspiders/blog/blog/spiders/__init__.py delete mode 100644 myspiders/blog/index.json delete mode 100644 myspiders/blog/scrapy.cfg diff --git a/myspiders/blog/blog/__init__.py b/myspiders/blog/blog/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/myspiders/blog/blog/items.py b/myspiders/blog/blog/items.py deleted file mode 100644 index 7449904..0000000 --- a/myspiders/blog/blog/items.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- - -# Define here the models for your scraped items -# -# See documentation in: -# http://doc.scrapy.org/en/latest/topics/items.html - -import scrapy - - -class BlogItem(scrapy.Item): - # define the fields for your item here like: - # name = scrapy.Field() - title = scrapy.Field() - link = scrapy.Field() - description = scrapy.Field() diff --git a/myspiders/blog/blog/pipelines.py b/myspiders/blog/blog/pipelines.py deleted file mode 100644 index 9c2d582..0000000 --- a/myspiders/blog/blog/pipelines.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- - -# Define your item pipelines here -# -# Don't forget to add your pipeline to the ITEM_PIPELINES setting -# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html -import json - -class BlogPipeline(object): - - def __init__(self): - pass - # self.file = open('./blog.json','wb') - - def process_item(self, item, spider): - # self.file.write(json.dumps(dict(item), ensure_ascii=False).encode('utf8') + '\n') - if(item['description']): - item['description'] = ''.join(item['description']) - - return item - - - def spider_closed(self, spider): - pass - # self.file.close() diff --git a/myspiders/blog/blog/settings.py b/myspiders/blog/blog/settings.py deleted file mode 100644 index e7a4c92..0000000 --- a/myspiders/blog/blog/settings.py +++ /dev/null @@ -1,85 +0,0 @@ -# -*- coding: utf-8 -*- - -# Scrapy settings for blog project -# -# For simplicity, this file contains only settings considered important or -# commonly used. You can find more settings consulting the documentation: -# -# http://doc.scrapy.org/en/latest/topics/settings.html -# http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html -# http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html - -BOT_NAME = 'blog' - -SPIDER_MODULES = ['blog.spiders'] -NEWSPIDER_MODULE = 'blog.spiders' - - -# Crawl responsibly by identifying yourself (and your website) on the user-agent -#USER_AGENT = 'blog (+http://www.yourdomain.com)' - -# Configure maximum concurrent requests performed by Scrapy (default: 16) -#CONCURRENT_REQUESTS=32 - -# Configure a delay for requests for the same website (default: 0) -# See http://scrapy.readthedocs.org/en/latest/topics/settings.html#download-delay -# See also autothrottle settings and docs -#DOWNLOAD_DELAY=3 -# The download delay setting will honor only one of: -#CONCURRENT_REQUESTS_PER_DOMAIN=16 -#CONCURRENT_REQUESTS_PER_IP=16 - -# Disable cookies (enabled by default) -#COOKIES_ENABLED=False - -# Disable Telnet Console (enabled by default) -#TELNETCONSOLE_ENABLED=False - -# Override the default request headers: -#DEFAULT_REQUEST_HEADERS = { -# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', -# 'Accept-Language': 'en', -#} - -# Enable or disable spider middlewares -# See http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html -#SPIDER_MIDDLEWARES = { -# 'blog.middlewares.MyCustomSpiderMiddleware': 543, -#} - -# Enable or disable downloader middlewares -# See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html -#DOWNLOADER_MIDDLEWARES = { -# 'blog.middlewares.MyCustomDownloaderMiddleware': 543, -#} - -# Enable or disable extensions -# See http://scrapy.readthedocs.org/en/latest/topics/extensions.html -#EXTENSIONS = { -# 'scrapy.telnet.TelnetConsole': None, -#} - -# Configure item pipelines -# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html -ITEM_PIPELINES = { - 'blog.pipelines.BlogPipeline': 300, -} - -# Enable and configure the AutoThrottle extension (disabled by default) -# See http://doc.scrapy.org/en/latest/topics/autothrottle.html -# NOTE: AutoThrottle will honour the standard settings for concurrency and delay -#AUTOTHROTTLE_ENABLED=True -# The initial download delay -#AUTOTHROTTLE_START_DELAY=5 -# The maximum download delay to be set in case of high latencies -#AUTOTHROTTLE_MAX_DELAY=60 -# Enable showing throttling stats for every response received: -#AUTOTHROTTLE_DEBUG=False - -# Enable and configure HTTP caching (disabled by default) -# See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings -#HTTPCACHE_ENABLED=True -#HTTPCACHE_EXPIRATION_SECS=0 -#HTTPCACHE_DIR='httpcache' -#HTTPCACHE_IGNORE_HTTP_CODES=[] -#HTTPCACHE_STORAGE='scrapy.extensions.httpcache.FilesystemCacheStorage' diff --git a/myspiders/blog/blog/spiders/IndexSpider.py b/myspiders/blog/blog/spiders/IndexSpider.py deleted file mode 100644 index 0a1948b..0000000 --- a/myspiders/blog/blog/spiders/IndexSpider.py +++ /dev/null @@ -1,27 +0,0 @@ -from scrapy.spiders import Spider -from scrapy.selector import Selector - -from blog.items import BlogItem - - -class BlogIndexSpider(Spider): - name = "index" - allowed_domains = ["tantengvip.com"] - start_urls = [ - "http://www.tantengvip.com/", - ] - - def parse(self, response): - sel = Selector(response) - articles = sel.xpath('//div[@id="content"]/article') - items = [] - - for article in articles: - item = BlogItem() - item['title'] = article.xpath('header/h1[@class="entry-title"]/a/text()').extract() - item['link'] = article.xpath('header/h1[@class="entry-title"]/a/@href').extract() - item['description'] = article.xpath('div[@class="entry-content"]/p[position()<3]/text()').extract() - - items.append(item) - - return items \ No newline at end of file diff --git a/myspiders/blog/blog/spiders/__init__.py b/myspiders/blog/blog/spiders/__init__.py deleted file mode 100644 index ebd689a..0000000 --- a/myspiders/blog/blog/spiders/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# This package will contain the spiders of your Scrapy project -# -# Please refer to the documentation for information on how to create and manage -# your spiders. diff --git a/myspiders/blog/index.json b/myspiders/blog/index.json deleted file mode 100644 index 3d9c9ec..0000000 --- a/myspiders/blog/index.json +++ /dev/null @@ -1,16 +0,0 @@ -[{"link": ["http://www.tantengvip.com/2015/11/windows-python27-scrapy/"], "description": "\u7531\u4e8eScrapy\u76ee\u524d\u5bf9Python2.7\u7684\u652f\u6301\u6700\u597d\uff0cPython3\u4e0b\u53ef\u80fd\u4f1a\u6709\u95ee\u9898\uff0c\u6240\u4ee5\u8fd8\u662f\u5728Python2.7\u4e0b\u88c5Scrapy\u6a21\u5757\u3002\u5728Mac\u4e0a\u81ea\u5e26\u7684Python2.7\u73af\u5883\u5b89\u88c5Scrapy\u6a21\u5757\uff0c\u4e00\u8def\u987a\u98ce\uff0c\u76f4\u63a5pip install -i http://pypi.douban.com/simple Scrapy,\u81ea\u52a8\u5b89\u88c5\u6240\u9700\u7684\u6a21\u5757\uff0c\u4e00\u5207OK.", "title": ["\u5728windows\u4e0a\u5b89\u88c5Python2.7 Scrapy\u6a21\u5757"]}, -{"link": ["http://www.tantengvip.com/2015/11/redis-set/"], "description": "\u4e3a\u4e86\u5e7f\u5927\u4eb2\u4eec\u80fd\u591f\u597d\u597d\u5241\u624b\uff0c\u6211\u4eec\u4e5f\u662f\u62fc\u4e86\uff0c\u201c\u53cc\u5341\u4e00\u201d\u4e00\u8fc7\uff0c\u6211\u4eec\u5c31\u5f00\u59cb\u51c6\u5907\u201c\u53cc\u5341\u4e8c\u201d\u4e86\uff0c\u5927\u4fc3\u6d3b\u52a8\u6709\u5f88\u591a\uff0c\u672c\u6587\u4ee5\u201c\u4e0b\u5355\u6709\u793c\u201d\u7684\u529f\u80fd\u5b9e\u73b0\uff0c\u8bb2\u8bb2redis\u7684\u51e0\u4e2a\u7528\u6cd5\uff0c\u5982redis\u96c6\u5408\u3001\u81ea\u589e\u7684\u5177\u4f53\u5e94\u7528\u3002\u8fd9\u91cc\u4ec5\u4ec5\u4e3e\u4e2a\u5c0f\u4f8b\u5b50\uff0c\u5728\u4e00\u4e2a\u5927\u578b\u7f51\u7ad9\u591a\u4e2a\u7ec8\u7aef\u4e2d\uff0c\u8981\u8003\u8651\u5404\u79cd\u4e0d\u540c\u7684\u60c5\u51b5\u548c\u5e94\u7528\u573a\u666f\u3002 ", "title": ["Redis\u96c6\u5408\u7684\u5e94\u7528:\u4e0b\u5355\u6709\u793c\u529f\u80fd\u5b9e\u73b0"]}, -{"link": ["http://www.tantengvip.com/2015/11/flushdb-redis/"], "description": "\u4f7f\u7528flushdb\u547d\u4ee4\u53ef\u4ee5\u6e05\u9664redis\u5176\u4e2d\u4e00\u4e2a\u6570\u636e\u5e93\u7684\u6240\u6709\u6570\u636e\uff0cflushall\u547d\u4ee4\u6e05\u9664\u6574\u4e2aredis\u6240\u6709\u6570\u636e\u5e93\u7684\u6570\u636e\u3002", "title": ["flushdb\u547d\u4ee4\u6e05\u9664REDIS\u6240\u6709\u6570\u636e"]}, -{"link": ["http://www.tantengvip.com/2015/11/python-singleton/"], "description": "\u5f53\u6211\u4eec\u7406\u89e3\u4e86Python\u7684__new__\u65b9\u6cd5\u540e\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u5229\u7528\u5b83\u6765\u505a\u4e00\u4e9b\u5176\u4ed6\u6709\u8da3\u7684\u4e8b\u60c5\uff0c\u6bd4\u5982\u5b9e\u73b0\u8bbe\u8ba1\u6a21\u5f0f\u4e2d\u7684\u5355\u4f8b\u6a21\u5f0f(singleton) \u3002\u56e0\u4e3a\u7c7b\u6bcf\u4e00\u6b21\u5b9e\u4f8b\u5316\u540e\u4ea7\u751f\u7684\u8fc7\u7a0b\u90fd\u662f\u901a\u8fc7__new__\u6765\u63a7\u5236\u7684\uff0c\u6240\u4ee5\u901a\u8fc7\u91cd\u8f7d__new__\u65b9\u6cd5\uff0c\u6211\u4eec\u53ef\u4ee5\u5f88\u7b80\u5355\u7684\u5b9e\u73b0\u5355\u4f8b\u6a21\u5f0f\u3002", "title": ["Python3\u5355\u4f8b\u6a21\u5f0f\u793a\u4f8b"]}, -{"link": ["http://www.tantengvip.com/2015/11/pip-mirror/"], "description": "\u4f7f\u7528pip\u5b89\u88c5python\u5305\u7531\u4e8e\u5b98\u7f51\u7ecf\u5e38\u88ab\u5899\u65e0\u6cd5\u5b89\u88c5\uff0c\u53ef\u4ee5\u4f7f\u7528pip\u955c\u50cf\u65b9\u5f0f\u5b89\u88c5python\u5305\u3002 ", "title": ["\u4f7f\u7528pip\u955c\u50cf\u65b9\u5f0f\u5b89\u88c5python\u5305"]}, -{"link": ["http://www.tantengvip.com/2015/11/mac-install-redis/"], "description": "\u53bbredis\u5b98\u7f51()\u81ea\u884c\u4e0b\u8f7d\u5b89\u88c5\u5305\u89e3\u538b\u7f29\u5230\u672c\u5730\u6587\u4ef6\u5939\uff0c\u6bd4\u5982\u653e\u5728Mac\u5e94\u7528\u7a0b\u5e8f\u6587\u4ef6\u5939(/Applications/)\uff0c\u5728\u7ec8\u7aef\u8fdb\u5165redis\u6587\u4ef6\u5939\u3002", "title": ["Mac\u4e0b\u5b89\u88c5Redis"]}, -{"link": ["http://www.tantengvip.com/2015/11/httpd-vhost-domain-alias/"], "description": "\u5728Apache\u7684httpd-vhosts\u53ef\u4ee5\u914d\u7f6e\u865a\u62df\u4e3b\u673a\u57df\u540d\uff0c\u4e5f\u53ef\u4ee5\u8bbe\u7f6e\u57df\u540d\u522b\u540d\uff0c\u5982\u57df\u540dwww.yii2.com\uff0c\u53ef\u4ee5\u7ed9\u5b83\u8bbe\u7f6e\u4e00\u4e2a\u6216\u591a\u4e2a\u57df\u540d\u522b\u540d\uff0c\u901a\u8fc7www.yii3.com,www.yii4.com\u8bbf\u95ee\u3002 ", "title": ["httpd-vhosts\u8bbe\u7f6e\u57df\u540d\u522b\u540d"]}, -{"link": ["http://www.tantengvip.com/2015/11/php-abstract-interface-demo/"], "description": "\u62bd\u8c61\u7c7b(abstract class)\u548c\u63a5\u53e3(interface)\u662f\u9762\u5411\u5bf9\u8c61\u5f88\u91cd\u8981\u7684\u6982\u5ff5\uff0c\u4ed6\u4eec\u5f88\u76f8\u4f3c\uff0c\u90fd\u662f\u5b9a\u4e49\u8981\u5b9e\u73b0\u7684\u65b9\u6cd5\uff0c\u4f46\u53c8\u6709\u4e0d\u540c\u7684\u4f7f\u7528\u573a\u666f\uff0cPHP\u7684\u62bd\u8c61\u7c7b\u548c\u63a5\u53e3\u6709\u4ec0\u4e48\u533a\u522b\uff0c\u770b\u4e0b\u9762\u7684\u793a\u4f8b\u3002 ", "title": ["PHP\u62bd\u8c61\u7c7b\u548c\u63a5\u53e3\u793a\u4f8b\u548c\u533a\u522b"]}, -{"link": ["http://www.tantengvip.com/2015/11/python-ebook/"], "description": "\u770b\u4e91\u4e0a\u51e0\u672c\u5b66python\u7684\u514d\u8d39\u7535\u5b50\u4e66\uff1a\u94fe\u63a5\uff1a", "title": ["\u5b66python\u7684\u51e0\u672c\u7535\u5b50\u4e66"]}, -{"link": ["http://www.tantengvip.com/2015/11/mac-yii2-migrate/"], "description": "Yii2 migrate\u7684\u6982\u5ff5\uff1a\u4e0b\u9762\u662f\u5728Mac\u4e0b\u4f7f\u7528 Yii 2 migrate \u547d\u4ee4\u5b89\u88c5\u521d\u59cb\u5316\u6570\u636e\u5e93\uff1a", "title": ["Mac\u4e0bYii 2 migrate\u547d\u4ee4\u64cd\u4f5c\u6570\u636e\u5e93"]}, -{"link": ["http://www.tantengvip.com/2015/11/html5-localstorage/"], "description": "\u672c\u5730\u5b58\u50a8\u89e3\u51b3\u65b9\u6848\u5f88\u591a\uff0c\u6bd4\u5982Flash SharedObject\u3001Google Gears\u3001Cookie\u3001DOM Storage\u3001User Data\u3001window.name\u3001Silverlight\u3001Open Database\u7b49\u3002", "title": ["HTML5\u7684\u672c\u5730\u5b58\u50a8\u65b9\u6848localStorage"]}, -{"link": ["http://www.tantengvip.com/2015/11/github-image-hosting/"], "description": "\u5728\u77e5\u4e4e\u4e0a\u770b\u5230\u4e00\u4e2a\u56de\u7b54\uff0c\u95ee\u9898\u662f\u300e\u300f\uff0c\u7adf\u7136\u6709\u4eba\u8bf4\u53ef\u4ee5\u628aGithub\u5f53\u514d\u8d39\u56fe\u5e8a\uff0c\u540e\u6765\u4e00\u60f3\uff0c\u786e\u5b9e\u53ef\u4ee5\u554a\uff0c\u641c\u7d22\u4e00\u4e0b\u770b\u679c\u7136\u6709\u65b9\u6cd5\uff0c\u5176\u5b9e\u539f\u7406\u4e5f\u5f88\u7b80\u5355\u3002 ", "title": ["\u628aGithub\u5f53\u514d\u8d39\u56fe\u5e8a"]}, -{"link": ["http://www.tantengvip.com/2015/11/wordpress-url-get-route/"], "description": "WordPress\u6dfb\u52a0\u8def\u7531\u89c4\u5219\u51fd\u6570add_rewrite_rule\uff0c\u4f7f\u7528\u793a\u4f8b\uff1a\u8fd9\u6837url www.xx.com/haha/tuntun \uff0c\u5b9e\u9645\u4e0a\u5c31\u4f1a\u8bbf\u95ee /index.php?page_id=8&myname=tuntun", "title": ["WordPress\u53c2\u6570\u4f20\u9012\u548c\u8def\u7531\u89c4\u5219"]}, -{"link": ["http://www.tantengvip.com/2015/11/wordpress-redis/"], "description": "\u5728WordPress\u6d4b\u8bd5\u4e86\u4e00\u4e0b\u4f7f\u7528Redis\uff0c\u505a\u4e86\u4e2a\u6d4b\u8bd5\u63d2\u4ef6\uff0c\u8fd9\u4e2a\u63d2\u4ef6\u4e0d\u53ef\u6b63\u5f0f\u7528\u4e8e\u9879\u76ee\uff01\u8fd9\u4e2a\u63d2\u4ef6\u4e0d\u53ef\u6b63\u5f0f\u7528\u4e8e\u9879\u76ee\uff01\u8fd9\u4e2a\u63d2\u4ef6\u4e0d\u53ef\u6b63\u5f0f\u7528\u4e8e\u9879\u76ee\uff01\u8fd9\u53ea\u662f\u6d4b\u8bd5\u5728WordPress\u4e2d\u5b9e\u73b0Redis\u7684\u4f7f\u7528\uff0c\u4eceYii2\u7684\u4e00\u4e2aRedis\u7c7b\u7248\u4ee3\u7801\u8fc7\u6765\uff0c\u770b\u80fd\u4e0d\u80fd\u6210\u529f\u5b9e\u73b0Redis\uff0c\u7ed3\u679c\u662fOK\u7684\u3002\u8fd9\u4ec5\u4ec5\u662f \u6d4b\u8bd5\u4ee3\u7801\u3002", "title": ["\u5728WordPress\u4e2d\u4f7f\u7528Redis"]}, -{"link": ["http://www.tantengvip.com/2015/11/serialize-json-diff/"], "description": "\u5728PHP\u4e2d\uff0cserialize\u548cjson\u4e24\u79cd\u65b9\u5f0f\u5bf9\u4e00\u4e2a\u5bf9\u8c61\u6216\u6570\u7ec4\u8fdb\u884c\u5e8f\u5217\u5316\u6216\u53cd\u5e8f\u5217\u5316\u6709\u4ec0\u4e48\u533a\u522b\u5462\uff1f\u5047\u8bbe\u4e00\u4e2a\u5bf9\u8c61\u548c\u4e00\u4e2a\u6570\u7ec4\uff1a", "title": ["PHP\u4e2dserialize\u548cjson\u5e8f\u5217\u5316\u4e0e\u53cd\u5e8f\u5217\u5316\u7684\u533a\u522b"]}, -{"link": ["http://www.tantengvip.com/2015/11/sourcetree-commit-slowly/"], "description": "SourceTree\u63d0\u4ea4\u4ee3\u7801\u5361\u6b7b\uff0c\u7279\u522b\u662f\u4e00\u6b21\u63d0\u4ea4\u7684\u4ee3\u7801\u6587\u4ef6\u5f88\u591a\u7684\u65f6\u5019\uff0c\u8fd9\u4e2a\u65f6\u5019\u5efa\u8bae\u7528Git\u547d\u4ee4\u884c\u7684\u65b9\u5f0f\u63d0\u4ea4\uff0c\u5c31\u4e0d\u4f1a\u51fa\u73b0\u5361\u6b7b\u7684\u60c5\u51b5\u3002", "title": ["\u89e3\u51b3SourceTree\u8fd0\u884c\u6162\u7684\u65b9\u6cd5"]}] \ No newline at end of file diff --git a/myspiders/blog/scrapy.cfg b/myspiders/blog/scrapy.cfg deleted file mode 100644 index 14b8feb..0000000 --- a/myspiders/blog/scrapy.cfg +++ /dev/null @@ -1,11 +0,0 @@ -# Automatically created by: scrapy startproject -# -# For more information about the [deploy] section see: -# https://scrapyd.readthedocs.org/en/latest/deploy.html - -[settings] -default = blog.settings - -[deploy] -#url = http://localhost:6800/ -project = blog From 4782217800272a1789f0d290f5b7624d254d30fc Mon Sep 17 00:00:00 2001 From: tuntun Date: Tue, 1 Dec 2015 11:09:10 +0800 Subject: [PATCH 58/73] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E8=A7=A3=E6=9E=90tuppl?= =?UTF-8?q?e=E6=88=96dict=E4=BC=A0=E5=8F=82=E7=9A=84=E6=8A=80=E5=B7=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- args_unpacking.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 args_unpacking.py diff --git a/args_unpacking.py b/args_unpacking.py new file mode 100644 index 0000000..6c83b07 --- /dev/null +++ b/args_unpacking.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +# 使用tupple或dict传参的技巧 + +def product(a, b): + print(str(a) + '*' + str(b)) + return a * b + +argument_tuple = (1, 1) +argument_dict = {'a': 1, 'b': 1} + +print(product(*argument_tuple)) # 这里用*解析tupple类型的变量作为product的参数 +print(product(**{'b':4,'a':3})) # 这里用**解析dict类型的变量作为product的参数 From ef9c484d431fc79e048c06df7f2b9be94ee68c17 Mon Sep 17 00:00:00 2001 From: tuntun Date: Tue, 1 Dec 2015 11:50:05 +0800 Subject: [PATCH 59/73] =?UTF-8?q?Python=20hasattr=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E5=AD=98=E5=9C=A8=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hasattr.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 hasattr.py diff --git a/hasattr.py b/hasattr.py new file mode 100644 index 0000000..acb3ba2 --- /dev/null +++ b/hasattr.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +# Python hasattr判断是否存在属性 + +class Test: + + product11 = ['d'] + + def __init__(self): + pass + + def product(self, a, b): + return a * b + + def is_exists(self): + print(hasattr(self, 'product')) + + +test = Test() +test.is_exists() + + +""" +dir(test): +['__doc__', '__init__', '__module__', 'is_exists', 'product', 'product11'] +""" \ No newline at end of file From 2747c35fb53cb6c5e911d1c2355247861095ccc9 Mon Sep 17 00:00:00 2001 From: tuntun Date: Tue, 1 Dec 2015 12:10:44 +0800 Subject: [PATCH 60/73] =?UTF-8?q?Python=20=E7=9A=84cls?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cls.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 cls.py diff --git a/cls.py b/cls.py new file mode 100644 index 0000000..073eeb0 --- /dev/null +++ b/cls.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- + +# Python 的cls + +class demo(object): + def foo(cls): + print(dir(cls)) + +demo = demo() +demo.foo() + +""" +demo.foo()输出的结果跟dir(demo)的结果一样: +['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof_ +_', '__str__', '__subclasshook__', '__weakref__', 'foo'] +""" \ No newline at end of file From fd437296975e5287e29be3d7ab9fad96ddec61a3 Mon Sep 17 00:00:00 2001 From: tuntun Date: Tue, 1 Dec 2015 12:15:40 +0800 Subject: [PATCH 61/73] =?UTF-8?q?Python=E4=B8=AD=E7=9A=84=E7=B1=BB?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E5=92=8C=E9=9D=99=E6=80=81=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cls.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/cls.py b/cls.py index 073eeb0..cefff99 100644 --- a/cls.py +++ b/cls.py @@ -13,4 +13,19 @@ def foo(cls): demo.foo()输出的结果跟dir(demo)的结果一样: ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof_ _', '__str__', '__subclasshook__', '__weakref__', 'foo'] + +classmethod:类方法 +staticmethod:静态方法 + +在python中,静态方法和类方法都是可以通过类对象和类对象实例访问。但是区别是: + +1.@classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。 +类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。 + +2.普通对象方法至少需要一个self参数,代表类对象实例 + +3.类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。 +对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法, 也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。 + +4.静态方法则没有,它基本上跟一个全局函数相同,一般来说用的很少 """ \ No newline at end of file From 1d863b9a0e0feda09df40c02025ba7d3d1c6bf39 Mon Sep 17 00:00:00 2001 From: tuntun Date: Tue, 1 Dec 2015 14:08:07 +0800 Subject: [PATCH 62/73] =?UTF-8?q?Python=E9=9D=A2=E5=90=91=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=EF=BC=9A=E7=B1=BB=EF=BC=8C=E7=B1=BB=E7=9A=84=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E7=B1=BB=E6=96=B9=E6=B3=95=EF=BC=8C=E9=9D=99?= =?UTF-8?q?=E6=80=81=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cls.py => method.py | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) rename cls.py => method.py (62%) diff --git a/cls.py b/method.py similarity index 62% rename from cls.py rename to method.py index cefff99..80b22b2 100644 --- a/cls.py +++ b/method.py @@ -1,18 +1,45 @@ # -*- coding: utf-8 -*- -# Python 的cls +# Python面向对象:类,类的方法,类方法,静态方法 -class demo(object): - def foo(cls): +class Person(object): + def __init__(self): + print('init') + + @staticmethod + def sayHello(hi): + if hi is None: + hi = 'hello' + print(hi) + + @classmethod + def hi(cls,msg): + print(msg) print(dir(cls)) -demo = demo() -demo.foo() + # 一般类的方法 + def hobby(self,hobby): + print(hobby) + +# 调用静态方法,不用实例化 +Person.sayHello('hi') +Person.hi('Hi!') + +# 实例化类调用普通方法,__init__在这里触发 +person = Person() +person.hobby('football') + """ -demo.foo()输出的结果跟dir(demo)的结果一样: +输出: +hi +Hi! ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof_ -_', '__str__', '__subclasshook__', '__weakref__', 'foo'] +_', '__str__', '__subclasshook__', '__weakref__', 'hi', 'hobby', 'sayHello'] +init +football + +其中def hi(cls)这个类方法,cls表示类自身,所以输出跟dir(person)是一样的。 classmethod:类方法 staticmethod:静态方法 From 7ccdf0710aa092aef828eb03bb52ea68ba9b63e9 Mon Sep 17 00:00:00 2001 From: tuntun Date: Tue, 1 Dec 2015 15:04:02 +0800 Subject: [PATCH 63/73] =?UTF-8?q?=E4=BD=BF=E7=94=A8requests=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E8=BF=9C=E7=A8=8B=E5=9B=BE=E7=89=87(=E6=88=96?= =?UTF-8?q?=E6=96=87=E4=BB=B6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- save_remote_image.py | 26 ++++++++++++++++++ ...ropped-13887362_13887362_1347773771848.jpg | Bin 0 -> 114629 bytes 2 files changed, 26 insertions(+) create mode 100644 save_remote_image.py create mode 100644 static/cropped-13887362_13887362_1347773771848.jpg diff --git a/save_remote_image.py b/save_remote_image.py new file mode 100644 index 0000000..956f037 --- /dev/null +++ b/save_remote_image.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +# 使用requests保存远程图片(或文件) +import requests +import os + + +def saveRemoteImage(): + imgurl = 'http://www.tantengvip.com/wp-content/uploads/2015/01/cropped-13887362_13887362_1347773771848.jpg' + filename = imgurl.split('/')[-1] + path = './static/'+filename + if not os.path.exists(path): + r = requests.get(imgurl) + with open(path, 'wb') as f: + f.write(r.content) + print('OK') + else: + print('Already exists.') + + """ + 下载大文件这样写: + for chunk in r.iter_content(): + f.write(chunk) + """ + +saveRemoteImage() diff --git a/static/cropped-13887362_13887362_1347773771848.jpg b/static/cropped-13887362_13887362_1347773771848.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a704f145186316940d367207b8ce8dd101c21592 GIT binary patch literal 114629 zcmbrl2V4_hw=O&(K%|2d>7XD*q)F&qq$|A%2q-Op^cH3ドルf+8IRjWmH!q=|GX(t{u! z0qGE=x6nIZe9w9B`QLNz_q$)2WKSkDduH|;$Xd_ythKKvuIB+t4Hb1200aU65bgzB zUjfoeddi9h+Imv#_BQ;EZnpO9KEeV*>^$C{4lefW>Kdx-8am3V>^>4gy!YANy`R5y z@bY7qWtS8pzMcY<05bfj-#2c-$gr(|5d?(w6a(ingf~cunl8hfnl3`zz&h$xq<0o9 zP|{ISQPa@U(vni#qNk&wzez(&^Y;-TF$u0iH6?%t0)z4J!GA}M>m7tU4&YM} z+`KKUNJy>w9CF8<=0rxurycp(d_uvwhitncuu-bn5!2ngxjex`#m&qe4=o4qe+hwu z^hjAnRZU$(-@wqw*yO3HwT-QvJh+uGq~w%$scG*&Aaio_ zQ27OgMW4S`R#n&3*42M&YwzgnLU;e@86Fw^H8wu+dvakBv-D?qWp!;GySIOEcyxSn zdiK{Y5CHxUvvBMGFzmnCMTN5q4<8?l5bx~s2+tssz*p7iw}lcbd(xu>yHnqJ5PE~= zVdAHXRw51&yf8EZw+iKz`fPgf6XbqSC8BrhT4{GOp_e5xPcbH5QxrGXCgn<5o54+X5C>{RIE zx7GD~zxDj)sTB1Hoi>=RfeG#||FUrM+Jz}iS1N~ND!&{{idocbYfMIuBz-vrRChcjS;s#|AN&d=%|1HZkv%TEmoL$Irz2Ma z)k5=Lq7%5?nk!KNC~kB@@S_0*kxd?A2Q^43kHkDN0MiR9Z0+a$jdmo|)&N|lbre|- zF6h?OtKzSk0Co#m9%5~OpY{#SKUw~Oo$!tVJ$*rm&3SZ#lhycrfceaSkkDtK6rXnM znPF{&!1C=>h%J!hK3x3lL}iafAV?V_WQJyc?S}~Kh{0w#8k?E>*vle$O`N+o)THz& zb&)*TVCF%d90V~>9}S?Z{69A;Bu_3B(1GP~AOZc!Xk1^YJ1p0arPkI&_NzeFb&|d$^*4au^vWHL+kU_5|nx92TB2U37P^18XhLU z?9gaH2@&)}g2G>jkW308?))U9{}Xd1uWp0qyCwHQ>vFCt?;BgL^fP z#1d43RPL!Q!&0nPSaU_CVvZ~$&I)3^*l5@2GH;F@%8Kia3Vf=r(RBDN-WW$qGk?%a zE?0e|x^?SZYxaWuq#6ドルP-@mJOF+aJ$Y^vQ)uGX1adxicTis~ByM{=AtK2^VnC1oJ- z$+%$az#D(aTkqeqDdX)V=ck7;i~sLZCCF?>4oTMzC6^WIKU<= z{CU*8V}8N;jgt`ckSMzSI~~kI@F^3eqP_PKQ|(TN$h_o{ad|@7A&FV*UY^IwiMdsL zSJo#-aew8xkNK9fYqw;@&3anctmASooPwP)GW#bxGtxR-e`|MUQHT=pdy{C!iY;hg z1UL?g=0ybDI;9UNP9IO*kRuwqkl(j-sHIf#msas%%k`3f6{I@vI;FID9KK1d`EB$Q z)+icKeE#`i8rA02YHX-B+SUI^`$nL`Nf6ezjq&)6jOuRn#a&wz{kYCpqp;V@h?gs1 zVNa&yaXex5s%ksW&#T3wj&r}_`-WrWBlf3gC`Gzk%fE|i|9-phz0*MCgsID4ppp~u zuJV_GLv8yNg!P5Iv95(6_STUA);R1}!AI@U`_9;RnXurYm+h1ATHcFSB8EnSK@=Y! z`AINzGTm4gC;v6(I7f1!m|Lti7UK9y`@vMgx?J7b$++nK2U9hiDi0;v%Xk^{GdoP! zv`zin-*rn`I{MFNsyKEC?9uHoOP383ドルw{HW)lfRz? z5l<`z@p4ghgd;bha5dee1vy@#_rxmnq*kiz`;-raOm4H>V|mIC&Cp=j{F7;xqLw&Hz%5!1`{*R4}fZg;g4Q zv-ika>L%h6o7lz2v1s|4W6awjSzwE3FCxi%vXMN4@8fS#U9}<6o&m|a*d4eey=nup zYHRvhb=K3PcPl%+ID`Rc6?uw2kQ2=Vbh51C+>sI*niH-7Nai45*}xznPxc^4MKUJ_ zxBgE@M(X(=zx^ml8lXy78KC*k#*izS_v35tIo$wcQ05#m&Hr+R%*(jv@%Neh zt0gR_;@ot4ドルgeddCQLY5i3TiE^z34i53&ie2PvBH2k~q5ドル~#c%hq$q1^~YW4&Sh5l ztPLY>L8HQl5kYHG=Yx3Ixb&fzbe&ti{^pqJK|FhgTnLT7d!lA0IT?V@X!ygTiuW*& zf%$+2crV#0@dBafNI`a(O~8Q^4tv4_on{2g!(3qw7 z!=G#aX7k5H(6}V2Y`fu>h(7X0o5L&@Oy?Tt&Hwz$;M}&B`%31XtDD3jY^ndZPnPOp z)>mb45#-w*Uwy+cbPGD8I@Jly5KCLkuT5l5h$&#lpn?>x0fs>FysIB#7Pr2P zE;M4f8cIaRieC~w*6F+|6vtSya58=WrIvKg=XuH+qCq-9y(J0Bmom^GOZVQzc6jW| zW(=rY1CJaUH=c4gBn*8tm@%a8mplD&w!(Z&)f~3`w~EUj5~6#L8ZEmkL6ドルgJs;;|-O#OY4gRVDksF`;Gz|5% z&b&qjk1g4PJ4~0uV%?w(b^P%^YmMOFYM)O;YK3oDh!o zwZK0a!a^3NLmOomH@X-4G0yI{dFISnLl}>Ch=a!%(J`XWIMlJ02&nu`?EsH2OsJ@y zx)*4$lXBIHTzx5%`m@R!ErW3pe-2FeC(AYcQ(vD-Gl})Dy!2(Y?agF$V`A^K_YJVG zn8#NwP`d*Qu5U!Ab|^HP1gQ&YxcJjyCcx znx(1pZ$Xbd_^*DJGFthNw%Eiw_I@ZbSsNag)6UYURmViHJ^7RnBXUt3KK*4?u6pB4 zdo#+t43>IUT^n-{@->weZuB5RPvrd!{Qc2wg*%PmMv>b@&+=WXZu;3TWqGKY7PGxB zgPx8(kyAhLD2^TTd_bM}gosi@fbdMBJ+b}&gCHP5sTCe)HP#STc;#l!~F4BpA zG)xIE&;J*tiU)-(52}TuD6fm68h}83a-xBULK3;9{4_v@gEEAM7~qlYqtOAR2R)S` zIJ}mwM=_R8j>D1+JBod{PU*u#e`A4SHaHX32Zri^)cgM;O$HS1LOlOyyhBM$V;>bH ztTo+pHE!NG8&(fb{{>$yC3Ei}=>Fx_MO6L&aoYs%Y=VJm8XbQf z&_OPefCfM;4b`Ondth;D*?7sg@hdts8wcL?_L?6IUL1ドルt@3k5?sCqKHJ2G0DDjo%06LNx9xu$&J9k~D0Ncu68EBeMwd z(GSZRq0tXTTCxd;_jrAdw=^V~$3ドルEa%Q3@Sl4rUJIEM4kQx$(CbXrP}s^usfUjl_$ z=T*SO@!ps^z&+AV;3mAl8G^54uoA}u`rZ?FLbEG87AAtmF(V0PPxZK*bVA8>hdEQg zPTK1bHGha=KgwnV9%dh)CWYfo_1u*Kah3+X7*Mq7L%*YJfQK-AJRjB%W55OU56cMw zj6|4dK*v*2BG*;cT?Jx32ujzD88jx@c$gS>0IIbvoL+O8vuVg2@U`T6n0@J{62jPY z`SqCZ?FI?IvbGVdF-?A#rziPj`O{midU4Kavj=(B0b(L^q3FG$%(2O*H{w>D*cKA3 zt_(k@pdu`orYp^6omlC=v)p}M`qSo|R`@H$`FfSvqhHnFZ_<6#oojjv)9<1e%~d(r ztW4{}^QU7rb=ldbB@2mVUXpxLVGi$>&tT1V(zYdh8~EM1VoZk5_m^D^9m5e>b;VBO z*tF?UMQ{$=mMlkS1-*U4i$HXqYU!;o2P#-LpbAK!Lu!Y}w4+njw! z>$TypQmA@V9_7p#a(XiIeoEr_hMZn-6^RFnrq=F$p;UR~p*Csv+#c3$*@XW5emZ9L zAT5|a&D8dz2KHH8dG*86>XkE*&vDUISK8fU)nN{+ORLTInub1{h)w1NB%I%}OrdD2 zy&ouB`t+wL^#U13r%|^&X8*CR6-C*vbM!h-oyk6nb~~~rp=2^HRz|p-5DwXHy0ドルa6 zA@_P>U)0HeOWD4{lu;aBy<4x9ix6+$@0j$dc^0cn12?x_0ur;d%m58&bkp7;xpu&< z>(ajERPky5lbo7R1UaFvn!-g?Df1Cam7JZEX6MtpCZ;CIk={&UmqGXV0#+hoL?}MB zTojL1JINDSu4`Xr6q%nGttQ119M-VAXVx?C?>sdvZzH@ZR*z#PJr-Nf2pS)ST zv@{>h2}O;T+cny{Ha6SDoIs`|%2iH$&sE@W7mC~I-jq6ujp=@QWY%%Z2Q%T?-!I<~ zZpl)*i4`I@vD)R!9g=YhDVP%dJR@9VzfbDoK>~^ya=KGA63bJlY7?Bh7P70;r?gpQ zTMYYA@*DcxCTaMElKW`xpYJ;#=#o`Wis!YXr7|Yru145fk)le}+MZT-ZjF^Q#x!U; zi?f=rguvSiAfl)3wpiWa-&O%8h8KN(Zt0TrU2_E?ZOx%4MA+PRxm&y3owBCK`n6FV z<5dufv#ziu$h}exbh0^c1ku1;st0&ucyhmtqtnp8-z^3bcdn$^z*@8u1pbtqwasny zZW->;^`XzSqH{4NJ;G?|hyuCLZ{jN!zC|bY`oo$*`M=sikH_C#bm|V~AqRWBz=?b3 z2Jo%1JUiR@E0yS}O3x}$Rd);*XC9xs|M#B%A*Vq6Z~P6FdGXp^8OyBc`mjzu@_DoGrX+NoH2Rb} zg#SYl%0uI>_YV&BZ!SfjZ5R4q%c|}fitFQ`$A&gSz zdI-=pjCxZqw%Q9&F2AS-;}~?u^;6+bctwX;}5V_A-30fM|A+d{5U@}be#tT zptTOFa8}*s^g-nyC^6B}xHw7Z*GUs$KbeXEtH*fZc2fh4f5T9ドルdU9q;6@YN>|+uL{JEpH;L=m2BO_+462$ z%OB53Z7ih32tQvWVMisqwN^R)puuxkL+mSxrq3>PlQUNuFjXmleJ2$a-h%oR`_+EC0@MO`cXp z`_miOg^K7sJ|7~1(t^A%&fM98tiSYvIvvdeO?Stm7q5XgS06;CYYEkdxa^KatkfVY z`VO~?na@v*jVi5JdsHC_)~t4_Ww*ErMmSTumNZ@Ve$N)DvwPBf4$cm{*SD3K=HSRZ zBydQg$v{r=+oiTmodM`VbIu=&*6xrXHu0v^?i))2AAG1O~GHna96ut4YA%E zI(VYxO5iY7IrDT!BAni_>~m>@~0(6Wn$U09EnitNK6WUwc0# z6`pG+axhXcH@B>7?HVNRB6ssi7t+rPe{te#yZFkfoD7~nV3w-XgsD@%{Vv`;Q#0%2 zMw!p>uc(d#C@y^GoWyHsSHRmf_i@NV9m|Om>duur+|Z{_OfvaTbe$G@*|u2p+t21A zOF5s{KK=6Wh&14(t-Z?G8*S6Bu?zk(*iXH^wwL7dMDog~QHumGRKInB-AQBVDb25REj6Qx7ue22|MAR}h+6$5EoOtL(gy&5Pp-VGU+*s_$YWVKzY-{<&ij8 z!1?TpqJhDzQrptZjOEZkfrGT)dkr0%LKU7-h4d;DEqIBb|U1(UB8u7yb%#x5UF6mM1N9X7%e_|ZKgds>xlbHl_mc;tmWtwdd~T>u4IFdp|W)*#0X5AXD)YwJDNSTN=DY4>x_xpyadFrzSg zvF>#lKl7Ux_BCl`Cu|O7M7BD>0LNrO+`>r8izZ13&0>mS;=6l7pUBl-24ud$=As#u zmlJMdA0Zo!?q)KvJT4vO@JL}tbN%6Pq8f==DdU^C5|NK+W(`!V8M$!J7Li?kRWS27 z^Ooz^yBQr7A8ZAw-_WUcyq4e*$^|?v*;cPOf&|X^k{N#veQoCK9|=!qW;|evm1nJ{ zh@GSI4xx9f89VZoO7416T_|U+kyzqboasgjY)t0ty#G_IQQV=FrdB+?UEWN0A#@T^ za&;5?>s>X*1{L*Y;p*py_=0qj7P&H zQ7zZNUt#3EW70tJNj^z$kr##{mH&CPC(UCvd9lkFfA{#V#>j0+mLIm9ap!(TdU_N6 zu`uI!8CGO@T|uVE?8lfF`N9tn8c2KacWsT_AVTKDPM!iQYnqodz$B=TS8*~yz<&^= zxEMnaGAB-9b=i!dUzY4zkk+!S3lpRhd;yMLvlNH&mH}y+AR`X;~UN9~ib2$hwBq ztCrIpM8*(69v<24l>$c}qHADd_%(KVUxAF6(4inqfmSfZJ$d+JI-@uUafCvhqd7-B z|MEq|xgL&T{v(g_ukG8pgE$hYOo#xV>Df=_Avn~)2L)QMId79I1IkFA6==kj7Y>8i z#hmNly5ZE)bUiTA6oC8}Nci6YhyTMqJ!(}94*GDxIstwNid(-Ee-I#}nJ1!65ドルK8X z<#`ultgbv6czV!nK^{&6C<|h$t4znno_rik zI5f{@DO0vc$I1f^1wIToN*$mK=P}TE01EUgpw`_dQ$oZ0!1P;N3ZRx2sMj_R!%nnP zLde-DXjSa$&QMwPZQ8IWuD0y-(SO=gLdxAu$NlAsbEnaMxt7zvA2*hy?$eU3x5WKg zD(qCVosWCBl|^u&YrDwwI#9CYXN641-Ksq?!jSrOW;+Cb*4sI%s_x;rr^4{02|D;g|UB4^Ai+!C!*TAws$N#8)$Umx;Oy%earmFKgvrk zH{$wZLXAJRMEKYZ&LUaP7rywcb4{&UR<7qj820ドルjx4=)6mb)oIz8Abc7 zNYl`!D3?*gh&QKjyRe0^Cpi&q?~~nQ<7k&ou5=!=P`?fJBqJ%W0d+ zCp(-BZleR6f815uglW;5T54e)wC}*8n(lMTV)f2BC z^dFf+bdMH=x$%?SHOg4YLw>!nqvc^gnIA7IbX*urFiZIJ=?0?Sg)hBWrBBkZD*O6F zfln7dH6?iGZATyC&9ec8PRwr=g78&``VuYvH%eka@0vNHbE zr;zhFp|umnz4MS8fg;GK;YHuiuoPt^r52x1>RmD<~hidqd4!@pf8) zcJFd#PsF>7kP8L$>Ih@f) z)^wbnJ2UpO;tXtF*06hSP^afyRu!a2gOA^M4X7r*<|z&$;fyg(zfc{ok`(lmexer* zDuVmXBmZPgVdtH$X9fi<{r5vk+vd>7;Mn=B*AJYI#(Undj1^H;zF|(1sojU;1Cndq zJDu8JYkmgKbdEK02xP@?vCy5X@gLiOe=6;CDbV%~V?JZvfAjb%4X38nZNkkLo$j^B;A|b zlMv%OEV2wp=`;n~jQIW@i5GPMo`-uJfv57VCtv7lg%#a{$cD&25h*dmsx1Yi?mQ8< zS~sr5(l&ayejj@2Y7z#H*uy4{zFLSM%h_GhQ-zP*o%@}m-~!AnN2npcf(u-%GiFswoiD^K|2Abo-Yp#e&FOIbRmuR@ke@0#c-Sk+ zRjsGnyw#ytlg^A#1*vnss60ybfi>%Qzg(#t@n+kSW+Gt_7~D33A;8n1xefDzw=UIW zM(c}bC-PaIT#8)=E49pC<;{uk=xcizh4qvykdsa8v21s(i0i-!3t=fibm@ohke*lv zUcY$tv7B~sa-fA@L@$I}5gP;1d;R<%*%J#|#oXFG$#ZVUS-#$?_LZ=XKh zTB;W_2A4K1(oeJH&S$mN8dBfllTeQKs5cb&zPYa(b^1jS(&SwUXWX9Rn)&sS;pc;S z%-S_DUJ|f%XR(LU?sd_|`I42{s()~``Ou5X2OSd1PR=mjkzCxS+V)18ドルr+dU2dQDR{QXx^^WTt1c{as_44aHF=3(>bz zeYgS8j`|`QSa-Lk!WXq(lVmbC+5IAORyQ)XwN-zcZ(QDPjt%bH8bW`;T?R*8G%;y6 zn!Wk0n~tdGAkI$i=c8CGe{-<&t22n_si|sorb)wummiaq!+_O3s#U)8f@MXv`k?8*i|)pyaI{d-q{gwetHBz>y=f?a&5x#vWGF765gTuF6 zBG>IUW#Ux0-hKRdl%>H_=64FwArY+iHW|%?=^69~2MO70?^7)3sk?r$-|h6`{iI=c zgK}w}_^tl%?Buf;N!C$NKh#nf-;Fotjz96Jn9ZeJN*HA$YfvFxx{wP;^u(9JyG``b z50(yE@+zYr%u8VpJA-1+N#Sg*tehvIu;zPyw@1!|-m|}nw=zjkohRdhbW0Vy+J4EO zvws^lsinYCSi;mxSLLH_Y!mIK6GL@aKK6YoU}2!Goa`yg=!!8&ZceAUPV=cu;_~K0 z1$uT$axE?QmUX^8bmw}S>7R>UsUFS`6O=)Ho;u}Q_3vt+DUy2j_d39rymh3GJ~2g- zvD7wnLKDtyL1EAbVeNl zKnPF8Q&H~V0^r5N)fN#gVKr_+N~LLZz(NlkH2n1|`nU)HQ5C6?Z@LLEZk!JOp1za* zcsa)Ea1lY4i{cve)U0J*+0V@~1sw2w`|ugfU0T<)vi#xc)w@6d)o92^f&slp3>cI& ztaVFeP?ZqD)Vrr%?tVI;GX2JK!Cp(+kDWV5`qGt)EXjdip>5mLX+oE z098ドルx=WPOQ4(K8ggai3dWEMfnrh&J#C#+?T!2wAtb2dkv=Ejl2YU(rq88G zUzrSZA1TFw*6A!q^Fh2}d*-1&CJ!lGW`GoFs_C#g zMOU)~70p_Hf;IpQ{V>pbdKpiZxj_A2s+JlL-!I{i^$kfBm@umr0c&A6&L*^mY^Vsy zu1!f~lOF&>1Hld=rz7b56pmsstnh5Y`4t-bXrCMGS#8OHHx!7l3K;e}8)-h`eV8gM z&j`3m9OgPplu6{;dGLTD?BhmJo^cL;+#H0HlmTem3=dkytKelfbkoYpJNpJU6b;>c z4(k#U(X3jDO96foo4?42Ns^8xo==`cFg}2z=pjhAmR7tp7#D&eJUlM5s&4*lBPFo`Fan+QglPrCxDqDe9|zg24st1_16nW;#NXV0RFAxg*Bw{b z#a2L*p{=ADMh+}y{>8DM9|XNpCoOfo^Mi@jmOZQhUr%b2-RCer5sdevWS7jxHhb`15w37lbZ1kvk%{Ym8ySOP z5+n3JsXk7p3^3LY!rokGBi39fc9t9N88b3Uh1L4S6CoTbQwNzv}Q?Zo+ajEhw)Vif@m0N>qzfJ`qTz<{d(cb zZ&NP!sdRv)2w0&CQ^%}jp#qM#gyRu9aC_ye?vZNV@=p%=)uUS-KmL^WG`bnAq=)e} z;FJiBK%#i`9Q~ms-MWt7q~1SvrT9;UH>>Z%hqESN_!A~G#DSjH;1Te?j zo_rfUc={(M|3E@oTen_qx?s(4Yb$eTVykj={zJHw`6ERMnZTAv))NlVLC3Mw8jobp zdkkrO)qw0q*0(YIr&N#J*ZqH5ドル>=4phm(T6a{KQ24FH~|W4@_I(H{~yRZj7(o~xb& zSEo4?y;*7}5~KK#Cd1h5m6BfC7D~!)Q&1DK%HZ{KV<9u+4!(!rtv>Sd7EnhydlRm7Rb*(@LE*=D1bgOF>`&on9}TzASu(3 zrnQrLy^4bA2}ZlV_RF{0%-{Vd^*0q3%-Kp`*1i>eruAo1o63=L3BO}R1R+hD`Ku3l zRA1sFmBj$R20E`quv^!_+iGWzZFx!y&1KP!moH%GT{NrYBOQP^4*+OKL)x|AN6tbf z@Q>P+C!zTd8y=a?Bt7%9uDs=D(|rvD8fTcSBRi`?Uo9DrUH&q`3)=N7v>O$KK6xTo zf`aFfauWOLd1jPI6ドルKqn(L40ドル{;`5Xrl>ZPq*-FC53ドル!_aS4IUZ=sg&aV8UWUn~Q zu#mRmG(Wqy?H;RRo1pXH_XD!co`d)K?_?Db%YM%I9$rn-ofqA%_jR;lY!)lldkx_2 zy_v$THL44O;>H%T+9!_+@@5M;6<2l?w+4r7q=3jkmk|h_-v@lw3zb7ywc|vu#36is z%WN3}j&BFf_Sx#(jx&j(r&E75%DdZ$#8*4yX~<)tdxyfpk8{{m3e5zn`yl%&>lpTS zDADXkcf)Ezz!nX*Sn77_X)|<*iiw9gy;edx7wpyq=lgk%vmoqlo>NE-Z`P)TEtgp+ z|Ist`C#Y7;&{v9uXxYZxZ&r&9Sv>2k1f$SGar_7AmnSyH59Md(!%xTV{z|Fnew?^v zC0#as71lhpo3%MEhg#rQ>NFnvmKISJ6sGAE;AWfjJnJy>J}p%`;=uzyS-$>}`Ps^l z7e7@#lxl6x)%ott+^Uhi%BeNnY7qI;jP8wODd2p+KOHA8^{`94YyK*NmG8HA)~i}6 z>Gx#^P8$>-Ssf{aAw@lhY_B|Pvq(6bVwz&N@_yELD}^6$#Q!l~um+}rNCX$&7a$#Hc%r0O76&vT{i4(9N1KW_| z^W@3O`+@4-gtYwz0po=yV9XVc+>pQ<9#%!)hp>G{)@pc{Ch+An`j5fUOc+JQQQ2qR zh^ZAH(PG{%@vzbTk58mjUcQu%y3<6_ge0$c*c1l|mt)ceglmd6zqozyu;6m9+q0hl z&pWLS{9ZVu#R?!3GzmH$JdS=8P8Q}qcvyloc042ZrWGBKh04Y+lyA}&!0ドル?&v;^Yrh z&&#}!`*+mYx$nAnNpuE6a6wgJ@WOIYx}i5nU~GXoqt-p^{iVBkva^BuOD6{9cI3)R zKgywgLItJcZ>0MrF}}y(+^*q?vz6aWZVY7YR<0s}uv7$*e|gi_ zOK})AaZ%Ow^Y@61>Y_Gn&t&7!>@x=+Ihzp+sjRzCbw3#U&DYEeL1eMf*k{T=zgBuE za_(DXe1@M}U^^yfb3f00cu_MlD;*%AqwM;UWe87|alzpEN5DAM+{Ng2<;f^#>KmFP zp6{GTh3_--3lcmtN81{rs-JQO$)(t(E3!!DO(iN2Ax&W`)x4G(fcdZuF)=m)HkFwI zxG-d=>&1}^t4Q_>E8uY9nwkMf<5twff^_&mfxrv8XoFc#HH1Jvatoa@=w z`UBqdd0fdp5<3bc2wrxi^f9vgs1r6-7tzupz1e#*(n;y7%ts|wo^y0dn(;dycziz! zE-rt3gOJx~PN*`B%`d1qzhcCyl z)b|10fy3d*Tf>O#EEE7(%U~7OG`r-oN+n3+RB3>S#V~0MS5^#WIE_C0MvJ_Ln0-F) z^!}O#AeoI%(&ax$gDI!kP8o(DWCPau{(9iJt_&mygS*Xe{VHrj0he?|F{y||>-eE) zfWf-l?emdXNTLEM7*bA{5}%p|rg6q!Mo{8P{@;(hUedG1_1~CGRAeY1Kd|1*#<%ui zv7s{5Ai129j$>VZ2if45OdgV|C8Uo;o(rM>AfES`?y-me5Yl2480nYj#SPRLxwc6FL+wgVX6z3$fQR$rx}&xmA+fa zPetLp%+#)#@nE20{yOEx@Uy-`br~wZH~wlQj74l-uMG7Yz|DT;5zRa&%NvU!@uCA% zGnF4>wYD`=1^iCmCr}Jp8Ov4nRJ?Kl(f3OeXLe~*>X1iD(=VXW)7J3+kQ4 zW3(DSE-OaX9RFz=_))yUy*c=RH4bqxEclJjcv_w;WIoPXCs{-_Lj#pTbJYb`ikGVY`z&*`iu&%SS_Yxs#!OI zp72N4K$`IW5 zz4E8H6nEtE+fK$!%|AimilAXG$d#$~u_8;C`ce6-tJ{G-zhvyadBSGNz}h}{UvBoV z5No;h`)5L)4;sH8fbV7AU~P{sQRimB41Yep%g6e0{?fR$mGy}!L%9$rVSqa|WL{6ドル zu&hjwB2WZN}q6V$i?^CFyAW(GC+#y*Q}m_yV!^h zNa&qk>}nObm(Aqxqy}{7)Tq9AaBk3JGe1w7-Mtd`uFX-76l;;NxP8@Q5)tws4GfNJ zIlOdwQ1ドルeIC*x8ZFst9X)u>*mowYX(K08;o4xD1HH;q2 z!V6@}y?DNRa8xU0TfJOtcMW{^+S4887>WpfA<3|aagUH>FVje&^sCN{PlvMMU%6sQ2pSMsnQ zn~8L?hMSxTY!CPlcVjDC`xol2_$TYu^-D7552T*!eKbnqS)U^itm=+fSj?Q*^BG7EC0EUIT8nd=HBwvZ?E2MrI*lM^-OE9sB@mS z+W6f#W*U&elzK>&M_Har%qn@Z*Lv+!jixH0o83>1KM{5186{B;myx!LPgdkwf&ssPN9+`H%X zWjjZ9+C=b>MLASC9HZPgejqC#FTGjwrIzN2LzCcX z?Q)dZ2>$T9)9e$L>T8vk=A}4w*{D40fQ@a|F&XMR&gg?;&UJ`BqNz<|iqg~unkv9! zEi`e^N&OmbFxbuu@;c%N2fQDbz6KcgxoP|Sm{jOYMe>_Z-Yqx_z~;xic4z}-8UtTO zUQyJT@fQcWWvyGKRBAng?C#e6x?L?5wEmdo9Y(#B5h4L%y5D!aCiSkU%z>X+H{vYo z0X%u3GxlR*$n%heHTrpVZ|eK@t7?-WJD-IApHIp4yhcYzoaW8ijqx$lC5(iK}Tnzm1L0BR6AV-78)L8NY1UyvMX(?w=YYYUv_iJ+)2#M#a0! z!z#RcHZ5cZay(~Gk!+FF^%)27osUz-iA z+7wKDASi#f_JJ72?})}HsP&@&?lkQ>&DZmFy(*nrZY@6L(7F);YiWV|j~;}MCR530 zL3ZiCkNYo7&9LSY~9~Cz>eNV#ZBNur;h)b|1SFkM*clLT6R1bi{*B1dcn-BC}k53nph#=~=(iNc<2(amivk z?&rujFC{42VvxH`vcZcJVM&xCt%ObC?QGTMu`&$vL4xg!T%W{ZX;X8>@&v1Ti=4M@ zlhlS~%evd|(MkpEBa6hnUu*1(h**rw6B-K>)k1#G&$=h4S4$(K8WnRzq6-`ghO5=VNN$%ZG|3xe(Zp7VFd-yGP~ z4|((TIq=`lJldRn|IV8K4ojHK?fIo#A+)~1ADc$BX`_S0KHtpL71923Rx<^jlqcrh ziJ!Ae)aVOi*QG3!NBNyER_(}RvRm`=ZyKMmCeCj$ln87Ka5sz+=A?0&K^+a(ayhG#)4seg z`$i2olZUTGqSNGts)e#ZJDLV$X)ohL^9tT+PDz~{9aFd>6U2k}-Bc9JkBC^flA1Vfy^jsjqp0zMf8 z$$pmt9tRuLw;ZCTGGSmG-^qYzNW1s(>Pcdt;q-j~7o3CURS2Uy%p^4W4J;ndv(C&jUg`=~?Rw z5(2!kDRywWI2tk;7eX9>1KIRiy{2-B-f&o9lEm%aMaD3BeQDSo|fkrI_rs>wE@~vUC`>1!e(jc|L9%{ z&;di_7c?ZGd7f&DEu6TV$Z(K|1|cRhEUYnJ1JLeDV;+i2A;l#v7^QW?6IDhwIsphr z6H9$II6YneV+Au3un!!*RMjxQNf@GG?!Jyom2ARMt+GWE47v2Uqz^iuSK^=m+eOIZ z`tuxDkCZvVnnINc6r5cH8VVrX6J*=m*NpKg0L9^0@+5-N3q^v4=8n_n0@QyimJV|B zB{0JoVG^=DYdBu{P~=R9Kmy^H9pkm3K*j;sM?*&LqziY!o=?dz0?H7`Y>E|*9KV79 z)-=|x{)7h1gA57V15lp(Zn^FUv_%dJ4O3rm%n+djb6+U z%^Mp#EzmD8B;TJcz2r@+74z4fFp*@T4c@)rHMjE{wrGE;7hXr2c$nQ@6*~d=92Vco z6iU+x<5{ycsv2nufuj)narr%eeuynbbk*>kBJWkipMh0^TQGlyMY=>KUQ&v32~n*@ zC44RVgc->qW5Y0}`e!EeGx0s3u6scizg%=)E@9kWUM@TgYH52=Yd*rTCp9efRaj3* z)mjZA%bUdFKQtL08m*Z0drN_&TW(Z$lv!U(k!2M1ドルG`uwVbdV@9H#*}_MC2}&o7HD zq*WCEUlg5nToeBv456ドルP-5?+x(z%V0mR7ov7)W=QgmfrKcXxL;NSBNb=^8om``ho| z?XlbL?s2z!zvB5xeLLd*mfh=^py+EUeda>#pP3|Zcry9nc{LZ^y-Vjeg3CIR2J77_ zhd+Rp8hVwE@ z?H~HNCiE41&UO04p6@y5$tFMxn#V8eyirQJgdg}Y&ouK$YS%JTN|s(ha0|~%+E;^& zDiB+v=&GNlBIy^bQ-#}8yP$d)Nq0rQUGiEVrw%loB-k_=3zrd{_3jZ_*k5;f#iUMn zFb6wenGT=(mEc+O!^BRsvbHkC0lnZ$dtA_efN6yhP%Fi$-EIvuD0gE_+` zkissE)S_O=RJLod;SPU?1cZrttwGwJK>&)a(8X9My844q?pGc^|4Zxdx&qB)p0F`q zoTS>CKZ8$BV6l4>I9o*2&3^#A*Ex+tN*kL>w^#-!9-8jr4*c+P+~hXeYs^U{X(((%*{jU-2SQJ z{Z7?n?;baL;N#*PA_Dd~MY9jTBrnkBP<2zvd~{ucg0CH7)tvB?`5|Acu+4L4)HpWAf@W7w#)Fh^+8YgIF(t`o`uE>&z;8QCUO|m|gTglaFNd%x@st`i zm{1;CaS>Tur?{oPZ^3ck``2Wrv^ciu_n0&!wR+Ao;WU8BNvfTaP>Ge!LML6fkc3XRk$dS!r@Z4bd89l`-SuQFf{p}|y#9zg+04CR4?1YLyzx@VI$rpLufn_AC_ ziIv@b0CLimoxirh8S?AaMK%E$go}~?QDD|`gyuPKNCWY=!BKSbtw7SG`9e)Val1;^ zk&O24?CHEKL>o4=x-*k1cQ6z(&K$^n@TV!+6O|zKsuVh<5pkyn0whlbu_d8h^5xhb zsflX!+LF9^fd}7X#g-N$LM~L z%u;`((=?)>17hvPMp{||kN@a5{n3b=+n0@1l@1rdSSC3V0%O=avgBA5@@)6@LlJil zV11?JGrw+nPEc`OL#OW<$xd)rsmdwm7uaanxk)er_hw!vjgxdo9pprwxrf79%@*bt z3_Gd{G=n6CSnF_wXl}8$`-H$_ae^OWR(Xyz)lKHyjGEqV_++50k!{1Fi}0$df@VC< z<_u&yvlt#5z)4p;6ibufbyjsp(iqaz>cYRNz#SvL(N%xH$_u*4JXsd^wvZys$pvMd zwwiK1FAGg?a6^%=M$qT4wd?Tfr~|rzB!!DR2%%F61~uJy#eV>E)ud1PAEOk!y{ZkR zcUSj^)oLgC#4FYX7t_AR_2ドルl{e)(p5Ck7_*V}oIY`iXA8xPER{sB|Bt-T4zS!N*Zg zIMBi#h`sj-gR0g^EK{cfesUMo4G%^rf0#CpDLIaKEfE5X^JX^j{D7gBTHve0;^Np& zAiyYK5=Blf989KG9sNUVd@vdi8zc@xNWNALu663OO)f<^zca@e`sbk z%0%-MXqQ@F4<^wtbn|br`%BNYbfcTCzTY1>a3 zHR&RH38thd!8tyUc6Sah>Fxy4?Sno}O-bm^!5r`Y%8BPJRlh_dHsn|TC^KTePfSlV zWUXi;7htG!$aBW?L_B#J(f{ba{-^oG8dn$c?%#fLE6U^Y0Q4+>#Oa98+c|XDi@71} zi{=sOV$!v!e6Sq4n2(nB-v*B=MyuW}g7NRoUnTNr;Z=$}aD)D9yY#HCLP>t5ZFE&J zn2DyJ(@T(_{H68wQr1qa=IdDHdE^>{|BzlPd-t>TRZZFr(5%t-_kJi2A5C9f5}s!O z82+@=Lj!kNm0i5esF(yTN`_!rzSlvaK)ID4E011{p;nIsKln_tVtoPxP_QWgAfASUIkq=I@^7Yk_Q$@irqgHaMZ9 zCBMe!n|H5rF{924S2TZKL`h~w0nDUEd{llP5I++FUyh{Tcq1M!8QFa_za1sc6+xx? zii6bVg2*jyPLAX@M2WAkD30W90gkCLnYYELJ4GYJZHNi$ptOYDb#y1I56C)VaX_KbM|GU#Qnb=Z2|F)7&JD0qh(47t}~kU5?eE<-o1o~ zakfTj!`=d@G!MC$sssYLnLAnkwkRRSUb(1@h)Gr6m|tmANh~G`;4mAbt`n+!aiW}g zBQb-FG@@k3jqhE?uQ-;AIR9~tg^1kH{WP&J^$fBP_9y4irL5&61WO7q*U?U?&O0Bf zk?0-0n$d(_>1@U78Q3rq1rqnbya!MI^ec zXRhU_FrZn(q6Y$BEusLXpRjpjsI_1@<00swkvu51{PRH(IsI-Gm?oB{ zK{6a5xn&JawMO0f$tEJ2>zsXq3xEP`M2_UVa$QGrrA?9j*_>Q}tP%%t5Gi_dM0YTW zS5hN0F;oe7xLda$M0DXKRkRmpgCSsn@UrNUdW#OxD5i-41WQ4<1wgb9up2e;xlj|# z`Q>RhW65_?Z5(7#QWF2g2ドルDu`O=h1^>w6D)!;91pviVNX+Wp-p_n&q)|DD_Oh{@g8sA}53^!=B6H z?br=GNzW2}@7(~I5|_nWl+Y=))f>#mjHflEV+N>J{-x$cLiMsDk*b{%}WXD$bb1K^dYa@_5xv9mw$|&Rn>X zepJS7r%^)9ohc=u-^=kfK6Gsl5t4oQ+@+^*;9&YB&~1`N9RWzD7^R@$f23@&C=)QF z|23V2|2Z+Ml)qk5&gk?w0bX!DI%ESf0c431c z6;uHfQTIs?egb6`o!`(aWY#oEsfD<{?rzsz%f%dfkavon&=7rq09ドル~y^tx>3`qe-S zys|+lyTphU1f#&CMhs>hE7ドル|s#lChlcYJ?_jh4{IUmn`snhfPM$M^O?8}7b}kqtil zoAuLppP|eobf@;NxhKZ#eT&~4lq3ahv#S(s;Pf6allwiI!b30y@I-n-J>i{UVtB8H z78A6d+7pP_0{r|xK!fn`gb9TnMBQ%IK$fe(V2v=wJQ+}*5TM<=d@x)ybak@xjaq&m zZU}c&{+TZ?S`Z31ZH4_(2+Kb{8NpQ#fozs`JG=2kPGT2nn<-9@dvv?e` zP*$ZLI1O#RgT&^q=cIL+^>JXIBm8~pz(tt8COl`Cy9*=oeUp^HlC&$N$YA%?NA%sl zgN6Let-NZ3yF`T2nBgV99T4@33n$q=+| z4^GE748HQh1ny@(^3wdorf-so`TFss*O2ZmU36(ab%r`)hV~$ln9#}QnRr(zs-@axp ziszf_h5Nx!+=8BQyZzFyA6hL%1Owy@{$f2gL)? z?bW{5cy`dzQr2#lftvrshvXMn`kvQ&-=U03mF3R(yo1G?3;YpRp&YYv`2wXfnzQbF z`IPP707ggN`rfS&Kp$YIEuPQ|>AWC9Yj!LA5o$&L^Pd_JUq=K~u+;eqj% z?~d38N>g-Z`JY!+F={caraJy6*g=UMI5D!UuCU*(uY*F5+b0J@=~n7D{{vVL++3x3 zwm5v(sqxc?>p5Q59~-P&L1B&l`tL|mN-XFN+*CR_0HV{zoy3ドルJWs_NVa)DLFCUUOx zZOw);PIHl~w6`y74xB=n**?pHs&?I$b+e?IU(!ZSDEF%@VM0$|!gU2Ix`UDiZMC``5buCpT*8+|}npl6hXY73OxokW*A z(}U?e@q!f@P4fb?6@oFIHU$o!aqUlCLm!uanAnO5u({l|2s;^mJgp#(q+p`I#cdt- zxlT`;i~X3tG;z(>v2UNFx$&%Y$y|W4N+EcGD>*s&YmLqOD?ypMnKkHq+R&lw@~JH^2m2<7k*6ubn@5-8q}x8o_w$k_ym`0ewlrzg=j>Ng`!&#|iMndwj~9M-*n zaNUJsP~m5J0(Ku3^R9fLvLU=?wIfb-~EVyu6vm4C#O zSCKoD?iDUe2K=2MAg&ECf^+qIuI2KauQKUL4tul7xy1E%%D)bfY7!ns%)i&;` zBV^!4yN;0ovO%-=wD;IK?DDNa`d8rpRxypMNC7yF^O31=| z2eiptj~4BoQL?PM;TAXxSII zZz)(7XcZl@CPpo(^nPb1`M9Rvs!;V(mc-f9w>He-&ILCS{A4CtE118bdI~G z%2rzki+vcoQiITdD;wW=#??e8V8rB&KutI;>O!XmdSmLc_A+T*QD%eL=TFxh;Tj>T ze_i~tR+rAc6II+cp$V|nk7H-%ZD0H92b7F-;_YO2*!Nb)+lmFccAl_T> zh#{u;DSQ28B|m@Rmxn_>HABvOyt3a#uyfG&!qY3p6XL+x#O6?aJ4r~Rxy_`m%@W{I zE$(k;0A0db3KQ+mY)RQ<{cvjad4or$l*{c3ue&2*tpl5yklbp~3*5h$($g({j+z#z za?`&Uo-}^wp5E@F8wkK`@M9Rrh45DH&cARw3LX3hV0a}N-hdMr)Lw@5{MfH|pQ+}d z?C0owuKHj!6nK$sCoCCTvh4O(2i)2IgZCsAx%_#RvcJ&QXlMiKw{%#ydz5`LOxan_ zuW%+#cLO$+ZS#ipIIL+UbN)fS*Eej&{4GV_WQ)YdVvBRz8`0ドルfOz~M!So_t0rGLe8x}enp zT+6kkVXcn{zr~a~3qQD^o1;6>Y*IyP-d>^HU`7pWwmfwc?ALhR8S4+HC#go$l zvLe?R<5bu+cj@xtgbns0dtt8_<87szpv82n;(!n#f=@h3?-iffg!zh8pshtetvfb> zv*iHK5TR?$x5Hu@EiL+hcn7tXD(V`2Z*|@{2T7cxbNn7e>ILpHi-F8$uE01^fDZm{GSjT4al6VV~RV#{@|1@hauR2y9IF9}@g zo#2h&^ABZO3tG+BQ|OREjUnW}HW)4B1r93WfE*?4J@t3Ii80t8KJTPrF#kMg5g?Ef zVNTRR&uXE!=%V3IlpH|B{#;L#W1_I{b0u>VAUeSafMoCuq6+OiiDcUQ3~@$SJo^G2 zfnuodP-xhAM^qtOzA^L7$s0io^tS~LYRrY~Xz%m^ku_Zy$$p2lZvB#OuTh6L|Lu{x-l7IjB&c^XUoFC?PX;>+# zS~4}_*4c)M&NXft%vFy`P)^VHlaHs??T`?q%s+5ZR#Q|-mb?t(b+;X5PhKYh1F zePDf)D)QYbBs0LpqxwKi5$kRdi^y)M0PTS~4J}FKCYNUQE`TI9xGXxYNuziyL zL6SKbU5rSn5Wz?zAT9uS=6^y(F1+(gg6M)%pf8LcVtGeOu0Pw?q&DuEAA9HOO`zF^N4s7sJv4$ME z6D9GV#DVpz%`{!`UFT}LBRuLmRUA&3zP(M&EISDir)`{wCB6C^&&Oslx{Ii+#<2m~ z{j8YG#YUxHk<$x5mbdsmp-^bfsmh*i8%}R!* zJ!wgh$@4Gh%k@4|7+{aO9nSlpBVaM|uHm*u{c@v4IO^hC<4i3f%zfo@27aks z-u?<9g_aqy7}>UJNxrmuYvUOGoTbIoa{o0#j^-oy`A=au;PSStD@vlZjP|GNO~utw z17=Jxdask}mh;-^(E-P_JX6YZV7aJtrD7ilB z`Ee16DiH(Trxg=hKqRf$LT!EUy|QqV9i*GEYXSC73zf;*HBN2jOGUJ}|GUomzCCK6 z^lZyIZ7ZX$!nqF?PesH03ri_kf?2Is3V1@QyqmDfjFT0kaaT(GfiA<#@c5uu9s#m@ z>EX#VQItLE?Cyo4{0_>E(aktfkIFbet{jQ-MyH-_jA8LfI{3EC{O4eA+(_byhDBWCmXnV< zTE}m{n`PKH0zjAzA)l=jrB4Iv;I0dqar?gT-B zg#GJA(H@ktYa{nnC;{iNRG{+~ayfy;L?F z_3htKV+};3eh8X6uu1gS?onkeMJz0=f7(&v)0f1BJ<3pvyw*gdrvfs{aejjgm5n|s zA@oDrlmD;IXr~g0cD$>&z1F}R5hflwE){uypI;<1h{c(yg@;w~&xb9gv*~m^pjb|6 zf_hZcV^k04IpHI5-7Iq~3w|=5c7;biJa=L11K;B?-xj88O8{~M!#uKiUJCu3VL015 z;oY<+`k7>}G?&Mm`aZx)b6txs*mV~GYW7l;ZV{$sMERv2e5Up!7BFdooWHaz=bIC? zs?X8tmy&Yqd8+9_#qj+e+x3`yVO3B059t_nj7gpNAsqqNvjL1qA!0iq+L}E3jHl*# z#gYkt@=wQ%B_FqrD@JGPKLDYhy@eTij`LRQTR#aI_HnrtO4+RnWROE-(jX1~_gnP9Q3D1o7`wuddjR>2dpyC$QM;igf}%CgRp^m) zH=z-$K0KEEPR@P8aToQn^_)X_`&mDJ5Dc(=90}VY1JTcKarhTq;Uj}(8}hLKTEe??_}0)Q{>;T1%8nHi+OHPr5uxNmwTSBR(1#?TCiW; zCH>)FwkB1%y5gPc`K_opZr4hc+<{`0tm(2rxztpo(rw+8xuy^4w|}*gyya;rc=cvy z+~Moa2tFR67@_E+KOo<4i~kof%vuwdm^wtuu6hlyg)8ドル_2@u7kn;70scx@sg@ier< zaW*4%LjJrq{7KS+;%FowXID{L%oQd1(05SZA$aFS!U!TZnVDDb7i-MJ^dDezIu-oO zdfks@F7J}GX@^F7@927UUxdrPNOA5{f<#|vr)odiozffgk-_wl-qi4m?wo$v)dxPt4dD*pad;VrT_U2W_4A*0UDBiQBMD0Epm9OufA^H?5)9ドルoyIR&hjGw4VM; zrk%x$=AQLiQVIFNQg`(-h{+Bl+!eY#9p*Mxc^k_x7-)B#N($=~cKJqYH^F!2)i#DZ z8RD9$Gey~VIoVxiX1(*a(#x29J5ulo!a1wlEcj*6GPM|a4}?iommGDghTtAGemNMn zr@U9Z)NUv`GRBV8K#(xFSz3BJ*>fpssO3-#cf;@{$q_Ubkz=e(waC}^haj?ry%yi= zohl=_G47D6p|FDZhkg73Zr*8e`7UQ@Tmeh8I~&jba_+(fGyS;i@=BaI`+!rPn1@W% zpBXng{Ph)Cd+!}gF3Yt)wHpS%Fn}%L@9aF)5BEy(Nec9HzRv6>SkZ*_|>yjG>4fqR;G{Z9AOLYN@ zsjaK!3xBw#^w3@~Q?+Y?j6Kbya+wuKW-ocmNadU<4#%6xo--pyjj(vmiz0mc-JDTZ9ssvr26FZ56o*eqSjBV}g1Kmf9VI#qL9HhG0h1KbS(OdQO{+xQbPV9Ap=8 z^#Y-o)d2_!OH1F2`LreiFyklg#x#F*;q1s}CoG*8Y$EUm3)Oi)d6ig%49X0rUuE*L3fv1;-&dIPPaAeTbmbkF%;TH?ePX4OTt{@llwVoB3oWLknQw zff_=u_fRVM`M2bYU#)Voy9+Tv8-x2bUYmw^p^CzC{8pS#c)xW z+5m`3ji@Bj&8<7->0@hMeImUgwxRg&m#OpL*qa~r0+_o3w~AWAGy0%b1?WZQ64KD+ zq|0Oc$_iTsym8uB*B}-!JXix9P+%hhOp(Qc#%Ueb0ltm>OQdVD|fkPEnpnhWWyj zSuXuA?B5?E=ve6tm!}Z!pS|l=#aPuX>eYDxiyzI*qj26`&EE@@*F{>q*=};kj`X{9 zk#yEMkra_VdjG9*FA5;SW=!j8{PNNh*;FN?-#k+gp_cM*hpc&m{zuX9PRH-W4peI2 zC5@j8bKNmFd%Gmn5feHevPNR?`zvr9Gm_ytQa%jU<`pb$g2n<75(q@v+#zx+yjp%d z-2UBr_jkg0BO<*ujuwcyfa#^2hpdbu-&<2hdk!lqzmco}u!xy~4edf9osluo3r1g) zbjm}vqcw|i)VsnV`JX&iu^W~Jd< zpB@N0Z%+XzNGReRTqQ|jzFMbC{|1(inmDlY{T4t%pHV!w!GWh|7P~^zbuda0uS{#q zC2-qnevi^DVF-GM>5=3!uaqE0r1gzy?mI@@Pb4IbVb;}_BzE&oQ~a!>4%a?}{keCu zlTdb$xzMdEB3j517ZSt(#c|6m-7kd7q9M%EXorBGd9sQz_}+z3z?OLs;|Rs{wsO3T z8n#$A8|E$T4gP@8b>rnxs!}hqm*T_zOd!1Md7iVIfMGuDt;u& z0{~iR-6hYp5IWc-{(Ye~%sPaIhvIx!fa*LXPMbNmn<$yk+lgjs22u$fkmeyV!d0bHmer_uyXB41I(1cCJ>J0B4yCHWBd`egE4P;GCkNYPf5GdV&Hi)}?P&sIl> zTW^WCL<9;lt%9gpvvwfiov5zn*adc65p}k+ne4qt+ai=~ikqs7+{7rvfy?91#wto3 z?y{BqKu}Tz_^5tQjyMt{B)k+uXwDl!^lU>PihURUi5&W9VSl|H0?56gZ4Berv>*=p ze-@7vcz8fT!i-U(dh^|hm4brUo<)>|Oe}FIKA`({F#0LxNa$@SJU#(A+gPgN}zO>Qa*iR!y zl4>xeI#?;5ドル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ドルfVrjTzN}55QTsz9zy^tX&Uv_4wkw@&4 z`m^2TcQZu4jt-u^gm(BN@SVwofF6O?BON*T7b8IaQ`9r_{|_W_%U#Hf(8ul%MpDj6 zJm1W+;z5;d&vvuV2v!MNIJ~9k=j+1EGq95FRn*iAA@+2WYnXzKFP<3-jx{mp=d044 zuzz&^+-N%qje^C2ドル^b2%gmG6?Z)_lVM``XqP$tYD&$b4ドルJsoTYIoJ#G9Di2^hx?d1 zn^1Y#z2Yc;fFj6H5pO4s-A=ATFE=Q=WDw^`^-}Y*Xd7G%ez3X##`xn z(8ZivhY^u#$nf|Ehk@=JdFl^xjItVkS+}%qsc?++$L*9?Z5+9nHIw?pFyyrsNF)#d z<#az$#d2vkqwr3d!8-k~gfexjbbbubt5lh$jma~n8oe+el~MYChdDgh8m_Mq3n|Q@s^fdSb>HSa9RM~w-t!5vNdV)xfKyA z7F1qUw)#b-GpBj}L2^n@I>i)-A$Y|T0(t{y92TZ!%-JapzU-fu>}id4Yo0l^oVCP6 z;v1ZN8@pNg)xjdp=k5h1QQKz4NT!UO{)V9~IzF71w4JL*wuvg$ae|!M`4#1=f?Ma z?WVh#0{ZFRbRyY&ef`tD_?4i+zEJy`!#6K{M~?AjPygj7jIJL{W9%&~)XmqLw7(>v zOE0bs>@`dKf%bzjTgCe#y3sLKdnpzDKzU9=3V=$k-)GoL9p}QYWx5Z>y}dxO+aPHp zeXRcFTdXhwFxH>I0*A7`a4dju1LkwybOYeNMza#U-l$?$P1F^hsLeB@M(K=%b*>an z>ik>iC|vW^0sHUm4kn`LN|aFK)+!wQFP46eu|+>dW6agOX~joi+l5!ruq3_G2lI zCp>PLF0V{l)n|^dB)0!tBWP_sFgc_1+zawhmzP!qqEfCfR?vSBCu{re3 zbT!UlIc0eg^SYNwSypI|>le^Ud)LX=j^F9M!U1ta8!SlxhBVepj&)|hBaQ(OU zgrj;%{s^VzUu1cbUIs^S@R6bX;Pi^;&TSK7Q8L|mt3~67A4vw(Ys$dWdIyZSzYCEZI?r88LnYZ@~RR#{kARy`9CT=v8&zt5{6ekIDFN8YSEN%n&2ePs^S(C8Zs&P@6XlEd#agwh#Pg zsb(-I)~9ChDf#`~|2R6!u&BPb3lE@xNJ_WTUD6%W(%mR3B_-V@At@~l(mB%I4bn&q zHN((3Lk{_S&;R{Cb?tM_Ir~|At$UR)k&Tur)<-lc?sefauf}>=o1gpsYWs9Mfg3_h zw_F~Uz4&>oCP^bRccQ~LVIykIZ&$ILTE;ZwuGHvVfbdTs~gk@zx%|ArJgPSV7|&^Ja$a@a&w+W=yq{X4ドルQxpYZjz*G zP@eDLwW6)EvSPMBC-Ny>Mv$G+^U+S1*Lp5+gwA8Mmf7DVmaP>dnrStCYJfhI{^J@q zN9NoK1vZXDf22;BoY+Ivnx{?y#v`HroIhRju#^neL0vsYqBsf z{(O{x!{_xQhy6bTUZ+KPt_WGCRU~EU`{PP#DRKR{2!R&|IzL%n+v14bEe?Cpzs&rs zyA0FX(On%)YE9W;t;I8p4*9FR&PcD8ZD#;4t3l@lp8XsH*nM7j={o&cO@)u8Pd8)D z@xQE_(cnV56RKIrfThRD7GGl<#uc;;->o1t}aYdO@61v(d{7Jy>hFgm& zzXQZ23j)@@;kgTp4y}4icP`bSHs2@q(h0>X{rgJB_p{>H5MN5VPSn~9+M}rljUrlM zWTsZ;%kz5tsF?+MZ<-<-lvhf;^zusa)@>TPt+k(?lF(Tk2#l4e$Hy@yY)y5hna!>W9Jrj0hqTrkIBjy)>o6N6wibf&d33Yo8X0a;=Z8ZnnmPJheL$ zcl>O#2>TTc!5{`CFJ7?E?ljOF0f$Y25enDVDAe6a!@<+*=8ndb+*kr(kxb%dr)8{i zg|!MWt7CGjqnGW?BbI%82_0SAYtbE>Xx0D>TjZW%epp^W<0leo} zhl(=&x7)eE?2)d=n43)Uy8QFLZ0}Z=-gW$Ahoss4J0E2g#P{nzfRCuz^<9q=y3^3w zCFEi!{0ドル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ドルV@&97XDm%Z`m90eF=f_Kvqe3fvgm@D&#T0zWlLUEFsB7gYK_Mz5lvmPCf7h)h1AV#I zCmI{Zca=Z7n*10Ox;v@}?vr>zU$-~?H=G&hR_nl4a^f*tYqrwve)G*~9)vf-Jw?{3 zHzI>j*I=PF(yB+a3|6Th#jD*Mr~kBC4INYRd{dCDJMJaA-Xz;Qc;mH~{9^L;m`!LeZPi&1C7{+aJZQjp@zxKQqy^`W-${@%obR+6B_#-FU`HtV zpD-@O+!hVd*PRVnVRy}0pg!)ZT6@Kn6mjjeY!Q$^J>B`8 zgu@qClfqsN-2(x}lU)3gonyob>SEksk7gZ^)dxo0!El%gEPe5G7rTD2?(LHmG#g zjkd#zu@b!Y?jFY9*ad$ z=~D!c6U)U`l7Z~Fior{QZv{&kSZm8z6!63YlewG1S7pVS6pnIH>HP=%4CmEi zxLwggi9AFUDPc;Sn-4PfGAE=k3mMt@%LZ@wI){k6z*u@mi_Vg>_3ドルg>{*Z;NF&ZGh zGoMo|m**}`P#{TC>y>nxiPZfj!?BdLnwisST^vo}b!5anbAl!1Z%}n2%xP?VW|T7J zbEEXFnw%!l*`cfa%Psb8-;m%bZU(b>4o+J!WJD0DM?Ed5s z*JjhW=Vb(Gb0M;e-I_4DT4#CXbHVdQE}y&O>Dh&`lCG}zYFR~9HesC$@nVY1*>+P}wELGYEsXCkRDiul7-R%Nt%w+IDj2BoX^`g- zTsPc5Jx>MmDSg*o0wAxX&DU7c!e@VIo#=*)hTY5h|S{EX~?CO@d5=zj;e zAwFRvM#DA-#RD+h>f03REhTu6Nlz0M;GdWFk-6oNHTbqNUWhNq6Z}W!Ll0zC3B~Wb zl}~`0n+sI3ドルu0NDhbUo0?|z7Mijy5sK5r4bC8j+vy+hj#CJvA)w==csUp0Ga!o$-P zkNz?>hG}hTYI#^9*|7xhAc=?8VL_Coy!#*MyRCYI*Mv#r zdyJpr1pAyz!JoA#?X#u_FA*cL@mYAfb z4Zrry=)g&6o6+Zweg1@4Fw6c;EKi`Vmkn@V_)Kdh@2(D*zJJxn-HAhW`odHFo#6zo z$hfilGT$@LT24)r@dgN`n@`&5hO+`Wyy10$tqU*_jRp91P5pHZp-+XkN>NZ{&? z5T5V&n`whfTrg@NdUa&U9tc(tiTT)x$Z1dL@phzWRZp9Lr&mbxGoUlKsPLmNt;70t zK3OsSkeA^HU0AcltNWlaUao;J%DMzJ9_2b~t6A4lR&w3{IvvYRgZnv46Nwxu+UU&8 zJ|048-l|Zz%0PO1h5AvotEzt%8Rv!A3!D_DrCk#r88+D8=9cPDDcA3jMq$M~=s~q2 zt4a?b#SpLTU~gBRYI-(aO0QZbOZ|x6Tdj&pY2tr9EzfiFqrvdmMmCCDZ@%7hCU?5; zmFQ{-_lhqBTUazi>JChoj@Qlv+1<*0f|a^j>+kjHJ`a5Le7XDfIgVSzL2H=Guvo35 z7Rss?<$j`p;z)4ドルpvkmynfk>nz87QW1}=1Tw=|fKkD{V3mn77C--tA*RJpsZKDVry zC^ty@@Vzi$)e&Q2i0PNLH`^P>Bt#sfWiZ}GXT~F5#Zo9I%zHs-@*M@^lsj9pcCmYo zlg0?+4r@#X0}V;$o_KyjfPaCHp5ドルw_buN{CviF6}TJ>mDehAkFA2)% z_?1SreT#^QVNqheoXfTbJ@_x^D?WSy_a=yOVQbzthC26&HG0ig#I&hFsGJLvuT*Mz3K# zA^5q6XCd9VhZ&IOaOz*55)JGXTklr~-(vuX)y38m8<=#)s5vllv{dygth%#}r;aqn z?;5tGVIqLCrz2bB{)Cv^`I})H@J$ux@8N`V{LPbzw84~E`A&{O59ドルdb#LKusZ#A$$ zbBxt);;h!Ipdm}rS!vugM>li!9)Egijq1Wrn5?%3KTgeQ0N|h1uMKI$LpoIs5<6yc z@HGcb;#7C^Qt;OvYEzWc1NT;-*r`)-L-ThgBTP(VIJG+4n{XFP5wwJ@R$k(xo)^+@ z4h5z^y9dL>)~w7WMHqMRIQa(*sr1yi28Tv2oS|BCziSL9hPrRq9v2w_Kk ze8SZ%$IMQLtsymi#GqDs>c9K1PkZ~WR`g8-Ak@*&q6Xl9>90q9?1el_-%uX4PgDJ( zlM>=~WF^x`sjUpU1b53g(0_m8L4DpjqPB1`Z24E1NA_9R |kPi)2{=ZHV2LpsPy(1Odm>BdG**1D zl$BF(6r*I-AM4ドルT1&Q@5zl9P^ad)LD(Sv9BDEbUiPRManTFbGC`B@4OgHnK(zQ16ドルSdrAv=AUBsB2WV* z(n_(rqHXKNJdqUg*`W(y;$yO5pciAy9S1cQ`icP_vNA-;%W0aJpqYgNn(3X1umhJx1H-|S>)|>zsL45oFaH$_XiQw!lmbv ziLcht!5{xf8nM857!K(+_i5f+?2+q!88kspF6n#Ewz}`fz0;i!J0o$la?GQ&eJxan z-Tf)a*LTaz^L3Ri$P1hx%@x451Q=%K^%2884vRO}#GTCjd0&6e2{V_LDGu0Y^Bz^gdFFqH+ zv^^h#%yE;$sueB3OdGo{`l1Z1rLv&)42D-ScFD^G0yW?Rpi;_$pue~t#SnkDs|voi zF&b?Lvbf9sb2h+52s{7*g$f}~jG`sOT54W+Z=L}y79lcJKr{ffnst zl9*%dVMzHF5Up($Ng>rVC2TihL$=)JvtGJS3g$_%<7tp@N zhR*fPeKCh51xVOhYTCPnJO_!1o@8YSLvgM36)27-ML)SiLRh9`i+iOix_qbDVNswN zv^wlQom)MP>i6z-a#t864ドル?%|&`(bQ3hPzb2&l`Ad4i+)(=OOfd8hJ#`}jvxqFB8kx9hg5B^RC zBF{j#A&xCYN0n$u2x)vLML62Pop!mu7x& zZP*J~gav(#qp80qHqHm4y|&Zn0Rjtvgf`I5VSmGQy7N75!2S6%XucxFC2-Hk&E?$! z9ドル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ドル*hWBLY}j8rA3fdw6mi5^+Vggl8p$f9^3BPi3UC#YX=@BCncV*-8Scq$guV0er~88~1~5=IntbS5wKl<-;f|;s#uxln*c15yfp%e`s*xe;@)6 z-cZxh${SaQAl}BTEs1X-YRR|Wc-Z~8r?@t(`--|lEDI!_fpqD>(+Cz8=@wDB=Fp<1 z>LldSc5*|X1G$M5jJBOGoIT@lvGrF>-ZxjOWXz`*XAv)#A~4;dqVoZJBfUDRt$YfM z4++gy(ztN>SGaJ|^b%HTsg+SSRYzV<-u9n`hb_tgwiuu^f(k7n_too)kg`;4r+e!1 zmDMac@8ty7d0@H0PGZBIlQ&1nLFARm2+&cj{?Z79e5qmzdJj0 z=Qf6){Jm%fcL-oclp^hvaW>Cf1?;Pge3j=ap@xiD6uT*3{0&m*#Y&IiNs7JUG;@UF z@T`1_leyG_%OP^~RuU%)nekHgDLw3+^k@Py)~gnimC zJ6nF8m*F9eB`WPK#Zb*$LNIST|%*# zZc0W99_-MBFUHD1QfwG)6(kt4_==7N+aod; z9^3_F`5kW1H6>~-a5E(+r#^rFF@PNdzZ@uhK+QklSip1N4(F3LdNvVt7k(~_2GfaJ zN)>kqRN!j*yx!Z1ドルO}=Z%TEgDMpCxGe)FI3Mj*YL4^q>Ht%!YL1G>Tm_ z)V(Zdu6^O+Vb;RTY{FR{zJ0!69f-|{_&uMx!*X-ZflpXkh`oAu9ANb=q)oIkA@5&> z`wK%+QhCL_n0INJ67ziGmlf+$ib?~e&oSO`CiNAshMwuBU6rQo)p9svfUZhCs&+G~NSHh_Wek;4~*&JZX1rGo1U z*oQShihpw8BpjF1ETs@FDFC0YG6{NT7@t=p!~?M?0E%_{p&|D2=kAL@A+cYez5HG? zU=3`eea;4NQX{clj4znMlE#;CS5e)H3vmxu4v4`f$-!rTn=HB&o^bhn`*H{*A-x$v zi>0QqOt;WQ4gNZVo)9Q^Qv$l1cVF7<5~tvu4g;n4sv5&(s+0$bdtp{(rxceikob65 zAT1l!L+ldC%K{8Bse_`|$hp+3>q1#9NC<7t)sp@wayey1fuglwy*65ctgkkbmp`ak zXv&fLA-^o9*f9IRYmj@Qn)pmvLa-XhwU2Qw72k&j3ドル<*fefr8th+70#@zA^Y9pLj**lenWIEAC zNQs_(^SLh0@@`mO^eEF{6SlZHj zuaHJTd+y+v&C4LQjM0J_TN77(;+|QTZ#-N3{`%Fl4aa%?s@m+IJJP<|qj!&mlei?u zVL>1;(alx=Zd)m9Xe=(cS3T{K6N~alg~aB-=mHN84eo_xbsZKr$FCeB@M4Mpo zmlMo$pg&G(F^c8pAv|45@HRhqKObS*L$s_O?+A-b3d|vQ#Isa4&+!~kWCm=2Kt8U? zlAzs_YI?xQxlc>ard+`z7`cKJz5pPy_Ob`oc6C*TU*is5ZwLCIVV|RMgG9mo ztg}DM8I&;#6BX>Xd03wT^i4n8F3rS3!8ドルW%7eh!9fKOH%+Y&EHUb(4KN-7NL>dE?e zoTEZrD%0P*1lWyJ_T80tb&$g)w@w`*%6R$j@h>R8 zFm>-T#pS1>Ejo&mWmHWNb+=sPByxWYBlGlY!SQ*RlvmTDCl&*R8KzU5O9<-kvegkqs7)*o; zTGg2AiI+a>HW8O6YRm+K_%sl%_shd^_!rVCi#a1Th|v zzbnx0{SQ?61IGPRo!vk#?{W!3EweU!KIoj=19vPTVA zLr*R(3xS{GjQ~e;Gc+wqQdisOi;o74_#~*(qV)iV`9ドル=veF#n2ドルr{_Aj3Avb2 z?GRrKP?=M!m}~x>^rVh1Glqw~4RgEUhI^!_b)|-4|sdc6}}x^nth?*)Sss7 zJGzxz+Ad|%P75ドル>FGTGijJ9r~pYTy{E(1lN0ansutv*A?qb-fW{$o644$CfDcIbJ6M$m*${AuYA+qUj@P7OT0*n~=Sxogf}X+_N2U(YdC-!%Jmj3(7Fe*KQn z6bQ16!Vs%I7}j56?jbgr5&&W+p@{1!WJYh6?Xis;;_#7&M-uQQz2M49map68WiA4# z_LLQjSmG%|t-fcugapxR!0D-(cjL?SV60p5Lw+|lhP@<#8tnf|ag0yw@m5#ikyzge?{w3cc*^aw$^(ua zxHOlbF!paUzExEnU6GYFWLflY0=O4F^-(VH%*NcHBgH)GShMsz2&~B4MM^jUdy3#M z!N)e5MUgm3PPeUl0wPC4!tAOObT_(c1jqpXg`)+8A5z~OIPGw!{y&k==fMc&RB-6$ z9VMv;J0o0nNH%M%ob`1!b0Z>MPZlr^-^V^O-yG0dIfBdd2FHoC=QSbbtZ4U*$Szh6 z7qdLZoz9%L?^l_=f)qeV2<51gup$`q9w z-Hf7dxQTiog(WsmR5%0yL_yA6Wi5W+CGHn0P$kLKxQi=mM`!;UsyA{q^WxJ#=*ST1 zH3<6na5?t=u~#*i8`oqwm=bk&5-+bppvr6svh}kwn_n~fpzlk4wbzl$kvc-|o_|j6 z)1<)7wi9l*lb+-s`0i*ru!9qs)@3x&r{@9^7_d1v^z;yml7a&0g`jjz4gp2ekr6ft zhF2#hMlFpy%25B~)^_^RQ@28PSE9ICGj5rL@hb%*MO$D{?hf(fbQ7A4dw*yob{=xu zPOrTJU(7{-dj|k^8f^Zw#8HFcS^DAAg*_(?|GV@0Z4X=Had2Dh(!IxiyHaPn!Vni3 zq%hZ2AkVBYj)&l5m4RWAsj{2Ah+m#A>jj8458mZTM~8e5u`DV%Wb5D&93z_hJZepP z!w$#d@ZX!CYg5m7mwWwCK3E^R>}L=!Og*W4O)K0-WpYM8cE0fGr(cf0XN`-emts@B z^yFi0u%i`j&`kGB#7=2;fok#kN@V($w!ym;)ySVv+@EGlIorvqlL0BxWlY!Ui?t(U ze>Zek)ASYs--cWM*viMZOAZj6DQ)=RQdJWphO2oL`D&CtAsoc)OOs3(pEocUJ*oBi zV+lFNS@7}^^s4Lx4KZxb=r7u-2xGf4lfBUeWsr$L0ta2g<9^ppj-`w`cixzutppg{ zZgLn|6Z!W}dXJ?fl$~;k!@M)K5DN#LD)u(UZl)22C=TadPeeCAQutR^qaS{STbX>b zuDZ{g)B>N>xbTEdw?w~7nb2UICYi);{uH^o1@0Q&&!M~ayv&el@|;gMCCs$TY14`* zIoOMCK07Zb7neQD1Mz>qH=MXExIU#gKj7n3kz&ozT-W+rAUvmgEy#v#Dm6+_iAGt6 zyNkvcjMNhL?{!Y;ISGVy_(9hZT7FB9`A^c*_iO>mi*)|jO&Kq_<7tqr)%wuv@$=`d z`Hie2+zN1T9Q|Nc*lWUq7zjm*!>U<$ks%=i{fc5ドルl>c9|URrWpQCYB~gZOS@_43+U zaPf#_v+Mi!b!LC$k7E*(8a*-QG245-=ZOlZD+SZq&!MvZ16eh@m2_R6;o_2~ncxtv zQpvWyi4=yHcv}6*kA0%=>WRLzqCa#!Xr3+Xn&&A!qNyQPWYas1@Hq>$l)0Bf?P)9p zy`h%DodgW1!%;NiL9xSgZ{mHwdT|Z?s3GAcXE3imcJwKOr#^8k2+^t!5^b1%F)oZ8 zQDJzqbL+!#?DOpTQCy2Af6}p+xNvwu0LPqAFtHWN<$btzd=_lwpckcqj5}4nl_n&g z;u+sjGMO;xBUDN|1heili;5qVkke6}CjMYl_Q0Yv zA2}g&YHXDm_OD_a9PJ2L$f2u7;7f$#bvMczYK88QN7jiLd?F6~@J{6IG+OHqjOMvR z{nIx(nSYcGC~nSqX?%bK+;g9HpK7{uS~CCO=CPo^&Me4`qJ!q@!!CKpk_Kd)M5wi*5H3;-Y5Asn8uH$U+=t$@Cucoj3W2M>L-QM`a;ccb9wtsnTb)n0)F)FFX_{UWz zZhn>NUmQGD;2+vYTGKT@2Wr|kh4o8FmJjUBLL+WvWcjxf_j;1N=Y^s*o&Dv?m-YVu z1k?LoG7ドル@Uqbg4Qxs&s}Z>Oq9#(p;N4x8bn)0;{0C9jD-(PEc(BH9Ot*~otMFT3v% z>b!kAR}|L!Naq=^x%^Z6GkBW+0O1y|;>~MUvYPhP`4Q=Qd?@~Ee|=d8Kb3gjgY-RC z-{JR*v~4o_NTJjtPwh=OX(r*sP_U6)x#m1D>M>fvqLR`5{ZCqkD-VjZp*1V^f2QZp zEe~pGi*9(YPw?-<-8)8mdC2G~41It!2QA9sI`NuJW1!}zDn%g#bo^=F#PX2x z4-}(3j@0~hq{mT=(z!Mo2R(T9?N1$jD8>gA;JoIYz)%_0DMml0KDS$AiT*$B$YrE>=f@OMu-v zQ?^i7fyGi{D zoKo!I5IT0L_Vd$d#u+4A(} zfUyW238!FZj+FA8onc_xCnSjFknnl_Hq{ki6z7dXWO z?`I=8lG&lh{%Wk_n&( za(dCzoMw}Q)|c0s0C)1E13sSgcK-khPOH*@9HbnB+Lt_WNwjt8#VF4PfC72vCV_%+ zN)CGTq$jYT1ptias5H6HK9q}&)SzGyKmaC}J+VoXz@;AiVt@i^*&`hFq$h4W(y5>Y z2R$erhl58-Q`nBU=|Bz#9ce=zl-<;$iun2j0va4kqao5~cm|aYw>(3Mb zioT;5rNV>KlrBd(rQ4H04FhdE1p8CAf+@jsngEXgA5%|NImxH0oOGv!1c8bGYOg%h zfPE9VZuCquH>f?0Sc=L)0!&vC$i-E% zIU}zfMFT7BCAWI|Q_?hY)~Z9nx#R~0n3YeI@&-L{KN{B8{111fNN#PV zOUXGbBb|fs^aB->rCVJ!^gm-RE?Kt6bg`UuI+y_)S|H%h_tm!$sA0+Gx3jyE=omxe`r;HU6)gEJ-%*h zwD70xSMis^tN#EJpBL(|m-$e6hD?0}X1o1c_ILP);n^)L^}h(}qG@AE7V3CjWK}%@ zlaQkWrgA+wuDjv~>?h*?0EXIijQXbOe$yYEUeOGwtWP1BaF`hFit{I$(1ZAsw)^Sp z+va*y^6IT8H*4+i>*@FEPvCFcE90fSc9QFUK0jocGV$Dql2P<07_vfk7wyu8nixly zX?mumW#U~r`cxJp&6LPr>~nV zLm2_aK*l`@tiRcZ_Gj^Lh`uZ$S!waF0D5T&F8~ zue!^v`da4&Y?@Z)rqf+r)s?%xpLgDUcXj(*c&2}ZH-0v`_GGa5{{BHTlV*&93}Fdk+ukn=M=IL|aL`s|It8 zhC<(pdk&ggno*zc)ikwii(i4~1ドルah*u3i$v#oy0gl-fb){k#4ooc&mtdhd8opj!jo zxzVIh=y*NAyLf zc!8ドル=D%0$(Y_%ODTe64^gj~let_K8+^IU$p@Doba^(DKsT?YC%=JTMpztdxsLP;!k zu=P0VIsxflfWp_xlgx%=6q(NOxNQAJbs9g#KOXpb!)YEi@dlp5p|#a+BFFvm^}B>* zwO^6XcAk zr}$IH_S%1kHH)p+2+_QZsSuOM^B5^4;zkD?eB9R?AN&))##$DO;yowBUl4pTt3!VT zCiXk1BohXWi9s31$O(1?oOGn{*ZdXp;;xMpacW)(@U{FZOCPc&#i=hl6zNs zr+>j_+TeLw@4`dmoNhLH-t3OxtJ{EnnW526`mewAGINsqC(T|U{{Vt;{BzQ^7%k(` zH2qQM#>cbNVk^l2WR~M3)?a`=4*W&~00me01%G*Od8v3SUC^~e=j|<}tfd4c0j|bfzyaoo73nsg@kbh0 zqsCV@mzQ2LZ9h*HfJ)u)4C6CW;-XRkB7oe=uX(xX&A|odxtVX?JnU72UjZv?_jUcVUK&v)mD% z#8>V#e;4ドルTcFd91*4S>tkBw|>=^El4{k{{UYzM=EkxZ2V-B%TM@qq1r-c-K*YM+>6-M zhEy^nE`uY{SY&oNtPK-W)O61euCbZO;8(HOn%9JE!4o5&oA5d%dBgP-_P2Yol zCAGMLJP~82Nj<~dnvlvj_zisv#qg^i%!(i&a0u**g3nv3f59v)zhym)!%^`+hagk# z{jyPUYkO+yq?oe1k@BRR5Tx_ly(md5vll4d$oLoGj8eZ`Q{)(A`9^%Lp8B%ej9Rj5ihf5wCy2Cwy0@=`iS;N5tz1wA*Ws zv|FX-fauQ8k1({6$j!#lfPGI&^3RDM@Jt_ySKchuZ#2zo!7{zo#PeI}aNbX9`?AmF zMI5Nd*+G!-0W3Mdljge})va^q583;|F!=k&_F8rQ&)Kxo8~L-7fTwB4J-TMO?;YE} zhkRLkrkUfq7V{X=<|f>dE_h`ls5SI%h5Il3XZTg9S!l`d+f&r8t?qxcH4B>wV3sCA zpzMu_UXkMt_PJ~v(bJNSp9 zc&-?uxVX}4ドル;)T1t_KBA;7xi}kB@X8hW`Kw^-l_EdfUf%nnV{Gr;#he9-%8s8IskJ z)k$UhRI1C)Ll*#cN`PQ+__QB5vcXO zg~;@`8tmM*?Pb=<5unpqu=y3#t5iufesiyky8z1l~ng#q;_r(0)x4bidxswxqb|&%3 z@e=(B;$ zSRO!Cj4~A^Pf&5xdsk8L>*F_xJ`;G74-$B1Q++p9hbAk83f(~jZD2tJ6P$zAl1o-K zCcO_-@lS;OQD>~p@Wo`FdAvI?k}C*Ul@|dc`$)j+hunYQCbqA9W#W$s=sHe=C7;=K zs9eo)ddd6gt=)6wXCEk2!Q!yK4Sa9Zd^6+iSK`g?rKR2LdOYI&^xaZMS+!QUFC5De z3PB({F9ドルbQk(^?;d@=h<=z8bv4;rew7wf<7ドルf*drzshc~nwyg?ltp3z!rg5q(i}>z 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ドルdi!|0r~3^wbjhz zmo$i7Qz#BI?_1Z_QOP+l#?eQ{6`OVrJ!@~n)>j4-1*pWbtAcpJ1YnMRsa$Cs^@f)% zy}WKyX(xJ<+<%8Gr{j4$cu&w{A&4g)-Ah62k}_ z5I=}lru;B6_KnEr8uoy>2js6i){~|XSB4B!&5^g zm=~)kc&^akk zHo0v^Nhdbz6HOs@SdI{T1?|ADdIXYtmX+AH*wsUQ0)hHsp-Hv%7`J{`@ZP|zH%|^nsJ&- zv27I3wIje$x1j6z*RuZ0`c4ドルK`0e03Ilz#eQV7+Yl0v8@N6-ZvR_;GlD-F%Vogz74Cnv?x1zA+9$`?j6pJLjxxXOs;~5~ z5@qMqQk;22iseD+P1*AtV--6tdT~tIn#`m|6ZN12>57wWI1g?pD2xD3Pvue~eBEhP zI-aJdjy&Rk2%#)`R)jWZjtyz}JHu0Wr^H%zk#6zFJ?!ak8%o<$gald>VPAY&f59}Y zQ^MlC)TztPhqe3|?Ex%BH;&9$wrZw^mX`pzT4-~Z5K`-oFp?@gw zTMADZ;O4$dJfkZ3N|sw&%c|S;`JY9At4SnYI~Q)bWw z@<@pvfxzis&zb>KrnDCcr4`$^VPhiW>07#AhjfiD${TxKKH3xK;*LqU9=$IW27~ro8>n)bSN~L*b3}(*FSP=OJONUfJp1NS{rOQFfxoZy``V zfY*!Oc#_}19}-(qZxm>neeR?>&YAu(}Q24{{SB3@aM&Ehu8W>t*656EM&uRfxa04`B_h~uZq8DojXC(JQj3) zGf@vVnFJ7}l#TwZEPF^$I-dO3pOfc*+ErsttCv01?(goeJ1s8ueNVZ;;3b2>&Z~zj zv-|9Pui|eKUwD%J?==gVZmwIbvax19gC?-gKAcq783lpsRn7<2zi_6b2=c`izoS|#LH-wGPH9>AkKf$tu7aCdY!it1MZ9c>hkjp#|@U#RdFuK z`CqNNd9!*{rBeK-$)DM_z<;u(-j>=2vXnd*6Tsl)G;$Rq@~ufNuy&04eQF(VOS;iz zjw_hVa!U%%gE`7JaDPhlV^u38^?H#gJ8ErdKNI|M;qVtr@wUIGqVN{mP?a(HHFsVW z{jq*Hcrrk2ekJQuAUP4=&Gx1L0KR0%tgnYZ05$K3x(aGmTE~a&Llz%r)HPUOoB#^~ zV`c;b0}=k|uQZf-QZQmTIN;K!ij7G+YFBaG$-|$nvj~aXC>s8V)kGO`!CzZpBPsTe(B1N zq*uzm9sdA=V(O*~tC=q?R#+|vmv3^wnUo)#WpV~_f%P@?-@`A4ZL9bS_rte#@MsX& zIkjCm6&VyE$~H&yt~lnnX}J5p7TRxa-OcBNN)l?a_icMS+WIToQ;zXR>>2w#c&hU1 zAsl*fknXpR&su2G+awk-#lHhM9Ag|;j(Ds72_4~yRw?u!7wbz5!55T@aNj4)M*#BJ zI46Oc@ekVDN3pZh^c`Z$#5?t7p6c4-&eldohir!jAo314{{ZV(&X!*jJZYjh`v;6Q z%U!4C34b92@Fu-1J$g8ZbJI@W*K>~*hO0rO-PfV@uZTb3kv=ZcH{4iw?@pZ)EP`tn zRtt>bu*U|xFI@eAzB1`L3+ndzBpR-ovlx}E<~!k>gkU(T+7IoC@w3AS(b;@Q)t(|S zW4J3IBk>uo>%(90QXh_f9)dU})-=sx1Q-i{U>M`-2(GlFZ;S6d>s0Oc9viEE&p#9V zIMT;|;JsJLie`nRhA|>;9eD@x>0FiHhjr~N2rqPPM%WX^`&V514mq#3bl>I*W`PTfux0Q#*4JL07+WaoGu(_GU{%lu>ND6X7mmD74 zR8DFOS!ihrbDz4SugLuSOW7@>F_Q7QIr+Fhk*#YV72eo_w)Zl`t_I~tBlG<0?<+5h zpR?|-s9q+Or}F9J%|(XMc)BkDeGPg6^K;Sbo?#NHmXiq}}1Ow=GQH%nuNfuFB>rba@bzKw!Tra@8aKs%5b1hV#)}54cDhZ}t31{TGYDjr ze(SR51dm$w-5d7g@uVI!@Q;XfGi6ドル(;b;x5q&E=&jR{SRjkg5lc+Xm@{{XZ90K@G= z;vLPDJ}8e(@U%w|>hsJaOOj6;H{<^rtznhr{{rhm(kwy{ukutf)9+!pe!lisjqnj+ z!W=e6NjNyIl}7Zp>R{6Ap~?I*__?9{OZ!KI?))cWb?*`Qm-|xI{{YVr#cZ;0@C<{6 z;A7L=;=Omo_rC-Wh&*d;Z*eYxbEoO4Yo^<|kk@jvea1eh_vbvoys+@twdV~HI=AJSAkp4AzD(3CA4+~x13wO+uTSz9|p5q56KD5-L z-P-=YufR^$vGoR_@Vml(AzfDQ!u~R}xwO#yBG<`g(*pybmi;zx8ojj2cj&opdep$# zfIdF(_PY9fc8TH(T|UAcHrho1kF`p%&a$_5`}0Hz^cC?m{uB6t;lz?@{5!2#Bxf%n zwvj^r0KLbxbb1f%1@Rlf_Yul9tzOyLm4Tg~=4k%rcXivyqD~UjrFEm!^&b-WdUo+c z+w1-rp3d2(Xokc&O}sJBd>$*+d?gLfh3u?f!hS5)^bJZjgUYqJoV+T}9I^xDzE_VW z#&O0)dDnse0B)ZXT)nQH;tPE-mB!%;o5(W zHQO0%M~J)~p?JR54M6ITCAb#yTu&-4=3p|fkmyLqCkD9N?H9rt&BcT1SC?KD)*`-^ z>62NuJ6m&Q6&*NTyo}?KUit9{LijUb;|Q&;wafni3CjstA~D8hw~^RIBC4?CbEJm0ドルZGjHAgu6gpyl{niAT2$@Q z{L%ZRfBh)){{RHjT=tVwEqAUGA^O0Cx~>cE8N`A7nlT8ドルze^{EEM&@9r0Y~ z{gAXRe?!zCM)6Rv*DV1ドルZ68}f6s9DJTR8v>v15$&7_V{Czh&Q5G#l8ZX+(>A zpj{FbO7+^O2b1Yq5ngNl4BM${H#U02%mfo#c#_L(&N8@DC>cL=cI{B^nwF^-8Rj%! zEaMuA`>h?l9-oQ%`QvYdo+R)z(k`#0&u<7~zi11(b0&kb!y~h!&vrt%)@qkku!=y; zkHY>e({IO!bd68Lnr-E%Qo30;wsTIcxg4tHlx_f?2TI^R9e&Lo1o7X*%@_MaSJBUf z>}|}~l3C0aOPLk-2&RpQWy+GIfzW%@s?v*e+P~rX{-;#2_*!=M@^tR)s(zlHhrx5f zx3|)>=VeeyJo;DCzaPJ57x1r%yiaxD8;9{{g0!W#km^t}$k7R7SHlG-fJqtpXRUnQ zai&e@`AZWS3C7%Wn%*^ICe`&@>#^y3De|eMqu8bPgdp>QQMJOe6~^Q0DJHjQW@zO` zSpmZ?ITbjD))^I;J`HKkm&}D1CP{gv-a~b1Z4JDWPjUy98Vs|O&;UBseM-*jO~=|3 z%ab@Uo~nHfdOyP-6=8IY6)|Vm@5)+D6sbgx>n{$KYiq);}uE}&uci%!Y3b=e08{58TW*D@!dp>RW3$*5wh|eAOHf4Sg@K=-&-K z8+;4!&x*V);>|Z$@qEgkZPL8O^U;oSOlOgUjMZZE4`B*!oi`^pWv18f*wZhCJYx2< zsmmSq)%?HA`KI4gpG>(D!tV_6p4kKuT`XT0wb5?Y=KfI`aUz9s3X#|z!xd&*e+y~e z4v${G)S=dVL#i~Jw6tQcW<&k=#~&~tkh)h+j@ds=#rjpv^_|vegdadrv}gu~xevmf zO3~uz$vIbzl6JdVU#+^@{dRp0ToqcF%9SC8jJ?*?+O_SwSN!&U4PP7lN4D`NiBj*w zb{D#BqeU9MrRCwdCQYC@40|(VLzQ5p^oK4Np0FrPZ=Qa zeJjYRpXIoGOmOb3Q-9{x_Oa>Wu(QEoo+}vnR-5l_J$kf!sc)!Al5>x7UuOIh{{VuF z_=DlUg*2ZIOW|!JQHI3~ab9^$lI{K+?I038Yvubdg*yF~p&8Wld%4`rEY*Bf8$~N?GCbaNl17S(*%Az3DvS;|ug{yMl2)2|F>5J1e4sI(psJcQ(5|m( z73{*=DJDqeozr-U8GvWo-vE=3YWjcmOD}SAp?Y^#e2&eh(Y;$E8Yo75R{1s~U+U6TC4){XV z^q3GvgIAErApt<@yl~@e_;$;}p;1)kszmc1bpz*pbmbpv4ドル$bdpob}?ftdcmthobt z1fubFlc~9ドルYtLwx2TX=Bjl_ab9OpPcop}!=;ry9Gg=tBtHj-_<`nx4%qsfi9rmi*j zDOb@&b#G0-GOxs6_$d|d#czgQD)4WKyeVw9`ow6kOQ%XuTNT>N!(_M4fS!61E8}@} zh?o*HyPgd*U(l}fTic6E=vvb52WZ|m7{LbweqyjU7ITiESLj)0U4y_ z>(KHgiFk#~+P9JFp9p+Aq5MMeK+(0&6`HG~3d~&<7fpf}=$m$*n zi{mc?_}v|d*G0YPaBCC9^_ZM{>T3Sv+I0A@y4Td;+;QKi^JX@W_>}ek(9?IWbQ^Il^~3t zp{dLfSH~Y3d_(c}nlz6b>USEo=9O|}f=Qc+9-HTl?%s**x6iTN{3rdB zJ|TQ%g7V|T+Eh|oT23IENu~*gz-5ドルE|u@C8)&6DVh<|pp@cmee3nn+;y;jkv)9fo9zn~j zyVWlVg3+$-XU)4obg3f9BgSwQqt88S;{6xJ+O4edJ;5&>t-C~u>6}E*y9d;6Kdp71 z4DklN;;ZJhw{*I^wy}oZJOCXcw+c~!?o=Z4=(X6TfP<+wo?$~*ys+mfveubm%6n+0 zk&LILdvyE{zdvY2_;=#(6?p4Ho8g{|X|ESR{w08Ua<7;``$!$|r*r#?uy$fp_zgs- z;t8yh{wwuaq(o@C>;x2M9g8C)f55$~>+ct7SDzeCpW^K%9eOx5Ee&+dQO%d`=9(qh zx;N-ge2$g#C+#ud*}Mhf{W2@5Wp=sKV8ドルFq)|8=W)qwB&wTJNs(zq$&C{3u+ns#kj zej0iSSEn~*^p_9#Vmw_co``gb#cyqw%jS@boQrq}@hg zW|{+*UAZ7059?Gs9pg#-A>vIJU9^?_+X?p*8*O5Tq{~8L`d5>Nnxk35{rmp_i~P~PBAe!X-`7Td zY53Q}Kk$wCyI9hS?H0FB8V~j}l>Y7ドルO4koGGTCaY(8})75hQ_FY%v; zwc9OER`9l^9o5#K6JE4d%*eM9uGxNIF^mP~zI4_#=;gSIduAZCWgL#9jAQa9y`E() zQO55ZDQ;WSyhSahqjPiiYiWMb3qa{CVU%vi%m-%UAk(2?@{IG2_04~1!UE<%53o3a z*X`B0etVjmB<@ng?pkul#$gkkxol~6`_jle?nj1ugg>%}gzx+>XQo_>JzDEc)a1E? zb0mcMkhlB^8^5J~et1=8@o$JNG<`8vtl>j2K#t)9wh6}O;Aa)}Z^M5CUHBv6kBdAn z@g~~iPSU(Xb7*wKXzMG*cNrn3z&O|uu*cX_YMr07x8`~g#LJaME5$V0=>2s&sK4N) zpA(-}v@*}87ドル&`}T+IOwbbh#orU6@X!|qAGbB!Z*J?iD&(;nLlOYV>&JTP zJb$JB%Kj!_4cYjI;}x!_d!XqNXz|`ykt0ドルBZzDyPQ-Z-{3;zHC6}}d9;Jxq2#}iha zT8YLgK8XCE=Qzhsw4>7$;DxsyyL#e`9uGX$N00-O2YNeu*0z)3=GAO9OTV?-Ta7*y zo5`7ol6<ixU}rdu$?;oRU)P_?@tVwI4e>Oql}7s>=v;Yj8nv3 zocq^x@aw@^AB!#+YQ8D9@bX5JO*fxzWW;G1VYdu7JGKxn9dn*5yV3p-cr#w{p0}sk zc=FE6L$bG)dtFmegrU1AI7L8C3mye=RK?S$Cl;UF&q|gCrC6z5Yv!-7_3C&~iyf#j z;<|qncxd=}top4vgg0i~a}~xggd~bu54w2hd92h;oglj^dt0};xrns0f|<1bfs&qk zIXl5nr#y0T+b60s=1H7YDY|lTeKh{8Wt8U>6vcHKH-+HUCeu~*D|>aipURb-AM|C& z8{gX;@!F;F_l0b{DdKDWGQ(K6*R1WIWO|LNm5OnJ^C&!l_4KG!V&}-WEzp{Ssckg; zPDf}w_w}Zg#Z3D_9OwGe7=TFPwp(20dNG7&wILli=9=xa;2Igg!3U3e1V=H$V>qQk zL|M&7&ysQ8hHsDz{uBWC+_ZxvQJQGCoRT^E(TtJKDW@42Ij4UgGywMKDM_a!Z7C&GkfS8imKS7aDnwv~E$DqH z0nv`Q1dcJ9Cm3bsyAOsR4fPL+{wK8X{*`fMZ+UVZmRtLkw}nC>Vp-dP!k@;uYp6t5 z45WtJz%&%qkrZ8WdsT(N8K|I8&5ZF@ZR~C?F{59EG?&YjU_w=W$Fbh*lSXt0QSW{ZcjC9TC!~- z_28LtA}SUc=vhO5QB>8$hXGiT)`ae^4O!We2=ID-W~2#^twznbjDiJBjE?FCaky>+ zt|^F?5}_1#6>caCmF_8)@S`vTC)kSVd_AV5*Y@iyd!yXDfjkkOX$YrjV#Je-_QiC1 zR*5X5);-hW6QS8EsL5+B=d>zs>iG0;4_Z_kz499qr6< z77OM$K*VqbE0*JCaCV*!mQA>f@-xzzFNY;b6cpN_`&a2l!@t=(!+MW_WYn(pC?4a> zU?hZmi^o%un(!YKd=0iyuT5>M+D8tX0G>FbR(84l;-OvKZ6nN5NgqmuRxRoIe_!Tb zCDHPj(eon!q>P?xuFyOsEYLQQC9@ z;C-)&H3%WU+K@NQ`50_g>dZ-ZK4gQzGFsY2=EJnI5}Q|@z;T?OmD0hcjVJbU)~$*i z`j?8!?%W6~4Z36Xb6;zGOZW?;!E+^^nD(*D_CoRfsrKzE$}l<%meg4p{j26r6zn72 z_%-2sB^%~@+xy2V=z`EOx7rH%gck#kyg&mv&p}*tRuYILXMBVjM zp2f||?NhW4N$puy$sN7C-gUU2%vMz7jg5{QBh%BNsxW)%Dq5@UFk)lmd6JnI1}ru> z{Fj`67CMUhSN0asp7ZvG@J!0c_RwFo$L`n+Z9|e&^WMI4w$+wB9_GNq3Yn*ZPc)3ドル zyB0+tHZm2wz(^bti=KkMhy9JdBX~#Q&&3IK&l2lUY3ek~?Xt}gz?i5Js307c$FQ!t z5>b`?ejC_$&4}I!10J=}c&Ac6A=b4Exa2Og z&m`GCjKu!{TIW(HmG&=F*9NkiyBQN>*Xc~g3C{wgcyM;(k=RopT7Bb+FyS zo`Amq6H%24a8F9TVI&4k&ddlL05g;6Mz#fJ#w<*@+_?6s;f36tqa<_mut%i}@s9kg zji&g6Sk?ST7lpJ<4l8%ly_vikf7z^bsm@t(-#prz-9hkq;lQ;K+?Y|*qkX;`a#_+PT zh`^3eTX4Z7{DT-Gt9(278{l6CYJLLvkEVP`wbpDO#E{w>S*;Dbwit(S3lp_S>x%0< zPvRd9cw6?o@D8(eabu-vV%hJcxj2m-jQ3?&kUEkSXWUhCxhV5!ulWA}k(-~z%e{_E z;g5@-SN*Ou+g6pHDZEQ}aUyI3=JRB3yyvH1t#`k%uBy{~VZ6AK&0>wd(5Y~M9pz506(qAj4zccAFxjM6)X8y`w@DI^@YxQuv;;pUdBkyta zuRXKY@VO)m{{XdD#Aqc$mea>QbC3^2otGGHWbGI=*8#!f#8X>3Dwu z$%<8^z7*nw{xjbpc)kw{@vocji@g5!zel&b3yoeys3cdf14n3u*9nzc=a-c+h}vk> zZ|~gKDdVZGq0nZ!TXhj!TqrVvPXRg~PHXfGk1beSL}eWt)7QxQ%-^1Zxk1Y-avQZNAL^3UU6u_;+;vG}uB zc1CvYcoooiCr;9}PZC($YnSh)X;MkH;^`2(Mz}oV1ogn^diz#2jKT|vfr>dxsb839 z9^>3qsGZeD@&gn74NX?%2NdmeUKVksRy8FaWfq;D&&$!B@5N6FcqhYlntYxV@f^C` zvX=AXk|Lg3;B7pC&t5&N&)dmcWmZW(&|e|R!tBRPW3GGVl4(OGL+)O^d9BY4_!Gol zF48rPS4q=mzSH!01ozX&j6o4N403vB(zC-s(4?a|xp}?*c1K=giH{$J{U-g5@4)y?;;Ux@MQhm5su8s3N3&n(di(Ya zN9M1Fd^@iAi^Q6Khojp`aj9yPExoKDW6gFrTxX7J)4VzRLHPUN1*eF-F=>8~Jl9e| za|F?YCA`T4TbD)$rRK^Qx6 z!0FPyu~L$hUuFJZjhgUX zOiY;KFsrq3oB@uNo^Ro3Msgia0LK{T{{XF19}qIy!3=OlrZpqX+skIUU&V6`7KpkW z5g1YlC)9CXnecL8iQ}7T1Ce*($?eCMjVH{vR;t$jKE}FV2Ke^x z!Z$jE*6_zMz0>E@+)11Sm2g;K^&AoOuBsIy3bB-)#5Hwpr|oy_p?dnK!mkP2&nibX zotYmhD=;f7Ax+%l8$iIXphdhdA(MdQV>sr&JO2P-FO3(Mvsrjeo;h^AGQde~ag0kR znC#50^v!+mXRNG=%K}fmenX7S@OT`;r5cgZ^1JGmi}Un8gD}EXjQyk9S8LMd-My4H z%EmAkaU|^kWd0T7pBEvEN?Y}hSD#OxP=%H@iVJq~j@)PFjFb49^+TzKjPf(}uaG}% zj~vaTC8Y7quq=i=1L`Zq&oc}zK9wvc6>EJr(Cf$mN

0aE`Vv)gQZUPk_EV#I|}y zn_#+<-^*hw#w3yg{mxntbwlklgi*ux$tn6oiu9j|n(elsrs`a43$@zn7!&r|wn?6r zI(5Z)jn2Dn)>hHSXk)lnkjp;uM2c~+W418gT>Dq)`9hR1(Tuf!t*`xlMQ3x1#WvoS z{{Vn6jANYpQyA?Z{c2=)=2m7{izppOYO6KFFy!E7y~X`}&z*Kk=(*=A{YUFw*ZU>u z9v<;0#*gtk#kui@h_-0pmTk}8uP-uF`mIF=t+dw1P7=In){AQD{{TIHPx3!ewV(JWm&5-66X z+3K31)FqV96ykMgik93EF5kPi037-rdRI+h{{RH}_(f-PZ#rrEh%v>nl-%&m*LmY1 zzL*}>+y2eJ5n=Iv!S4)RnKLig<3=sil^8$dy#33v(f^o%uqW=KFLcDTdvA5G;a~oVL z?QzgBZV%U*{KD~?-D%z;)a@Q}-@X0dT&l6^GAj6Ly-Kw!N;Bq2q z>NKj=Pnuf&`X&18b{-ZV6tw>U_(#97b?*^aCbJCJdTQJ2l0=io3rLc%9%u`-p_E~; zPTn(-pRN2k@Wb}L7s$F-i!Y{OVv~t(^%y5dM;~x`sD5u>=U)ZrF4OB8bWbkSY2!j< za;l)X2j>0}&szP1{fWLT{{V0JI`2f)E)q-49(J`^Ji_3{56S^OKo#p|`IaLuoi{n9 z2JGI}*4KOAqUmk?k0TEXGo?OCYEz26o%Y)LTdwDm>V6OXuyhX&-nIAqBc3C(ipzAd zNe#QnA_ZVjV`g1LG4%8%xNjQxgW`X|uZFr#v+)++!QLy=CWa}rtus+)lIMQck_TuqMc*DgK=~{e7Z?Hsd7A46E<;ulek8vmh zE6J99CyS$oqgS3XyOUhHTHEPsKfLL|;USHMSxS3hJYjdJ}W$+%ksl{?7Shcv? z)8$nv5XQvhs@P4hW`La&~)U{f=Cw-0ドルUrUlw+1q%0bA+ zO)u=L@DIRNJ|fh$eNGEqWgVr8++IYkrAZ@p4}5p7cyTrzQ&X=FUTwQ}*L!#0ZBFm( zs*#N489PN?t0%g;UV1gtxs&044}5U4vW>hY;0ドル%~;=h=GZPE%@?^5UI5uz&`^ z2b^@qE4Pp0-^ZOA(ir?r;H#~68Onr)^G~(Cj$fB76hSJsM;%o4K9$;7{6F|n@e|^F z{t3I#EoGlTvJ*t{{F~y-DUGq&OsGe_Pw}JnXz-7RJUyXmUKzT*@O8z8sSACxPP~#g z5xLmGPVNp!8STw_SWY00Cl4$`R*K)=SM8#hnAD_cf{l>V3E^J*}88}}lSLjP)JZ8Rq`0?Xkg3|bY-v0o?SDMVa%$La& zns%xoW`%sYPULhXkC|6LG5f;4Q6elfs^-%{Oj{K z<6p-oysc6cwwvu1t*)sh^ptlv4xa>4ZAadqG9V+BQgPQ6>0$FK7|M={i%!Yvmd{Po zXCuSOMbwMDZ)d;ik1>Pe9=-6p#Y=zTeOBhy+Ey(r0f>%p7~ndN8!L{W_pHB&{{R@F z_=V#8j}b|t*yxvYq6dddkIRg(7%z^@d!OY}z2Al}d=Vs9myrFsE994Qr|*2ZB2ZL& zBO_=1>hk?$+O*`^yF7V2OAH)UMui%+Uo;wPOY~^&b?VWl9!aLVbw^oaX&$k4CHu<~ zLm%FdG&0QJ{*;oku1ekjyz?WNW<$gsjmohxi6-zN15K zIW5Ob)b_X1*<2&vgsinz=tw`9s*{i_iako|^tk9ycj*xsxlxsov(qmsjukr8>PO;x zRXXhYWu?K}aU(PBQR+ZHHGA|w5iC3rtK1g8Ul?ifN(H^kwkIb%5*(AasRKM@em^5y z`AG|xU>E_lM{}B%4MEw$Mp)+nbCL&o`K*3XPa7-E>1#Eo=B)n!6T1hC#o;T$r8?f~ z-Y(5OeA7Qr{v>=<(cml^{rhmvj*j*>T8xrfeWn>z+S=hh@G+bmbR2*B{#fuA?GbI^ zFEQ={Y7X9Dja^U38G-zc0k0OY@UM)#U!;kwwEa_3)8acrM+}li4^9XKQfvPJ34B%I z3wtZwPfVH{dx%zW-dlW%NdaFYKCOw%nIx8^3wDk%BlNWM_<5#y=upiottr z#D8xHWVE(jnst*%UOQpxbNAb^CcFOthM%$bf;?2V(_ef~it6%93ww5ドル`%N-a_I8#e zkY&}d+js3J)E`ReZ@*$shceyTX>xo+Wx1ACF-IPeF_uA(yPWpxUR4NW_#8xUDLF+o z@a(tjoAr9zsq@&H8ICQt?N@z@qP92%@N6IQ#3K7 zym(Ub;6}Xv0C=1aabJCd%&;{n$Jx#)bXQ6J#|(1pL?dNQ*=e&p_AB>=g9c^Vayjo_ z+wkx9-}tle4ドルGrIO7SGJ*;JmeKurENt)i_w($8ドル!z&)dVAk~>Uyeyl!fAP@Z|l^~bE|{*Ci!`^ zv;P1mpx+#PLDal)t>0@Jl#7ドルKeLK%Tml#D3&6dC&22FB}D-)iSvJe*?!96M$lXxSj z^{-ZyDAR(36_PnQRDK;1Zo^i(((j=RtihaC+2Gk z)gY}IG>>e!{j5B1ec&?3+QR^T0;%Y~8z3ドル!33$K3V^Gv# zxYuuOWtIe3-qzw6*uEUF-i#a}QiKEZ171R{$n>QxkAGU`j$ekS{5olBo|l@HfPd326QglHT&xYmH~h#7xKnt{d*2eq~|Q@I`ol zZ_=l=yf)$S8b0BVm}eg1x5Q!Nh=(Mb>9&K!Vb&%d&QfW4J2UGIOXGjTSiT}@7k(-D zF(rnX4w}~5o|O)w$Y+vBi$gSgF431(=OY-$O7f%ec25VL3V#pj*7_HSbeL`}X4Ea5 znQl?t{#g`_xeDbo+yUucUwh(RLr`>UtCqQu5n~T8%-d99Mo(Zk`U=f?U4Yz40AN-W zuoS7sm0sSh{$hp}oi}K=Z#I2j@VEX74dTCr-V;6_ve9hr?H5rRg}cowZh)V@gN}{< zMPh!`pSB_Wrgdu_R_nrc`Zl8#m)N9qxbr~)w<%ara6#sw0dt(y>r&Bgv{kb=*3w&j zs@*Q2-~4em-Er({hf|K!p_kz!Q`q&!LRtH*kOh+>f5 zM;u1Z?gB!z)~vf71LKC;0an4oDxPtJ_X+<1g1+cfe~50h&%ma_ztd;*!e1g`rmpjh z0R70=;~?YaHTiY8uh%P zl$8ドル^nFGkDhYKo?PN3r=zdn90_{YM2F!7Yv{tNJz{2fIp{wIHLnI~J~p$L$J#Cax#65RxQ9x)5M80z+a5L~ zE<@}j9>CYwnjeV&0A`OK-)bp$Y2xn2@vWY4#^uUn*8ドル+ytUVbG(pL;E{}TU!RD_ zJwFSkD__rk$!c z*mMAvKF7uLPZ2ZJ_J*%C^A6h|@w3K3%k}IB9z00d|SdF>$s~>G4 z0p7=)9M*h)bKeyCS8Qkl52ZcD7S_zrmD&bVBC>BAmvF{Mt#;oFJYnIF3u?Dlo+9x2 z_>MobNRV1hJ4G0kl&ZPf2_$DAa55{-Cc2j6X_iKisMy-(#&p2 zO7Z+{`X595H~8)0&jWbs>%>raFGjkK3sy@#I{SOVvghTLj2+HB4;AJ*hQA+-{6%+l zc=p6C-cooLPSX;Ts8TF`l^Vjh->7^T4U4L2{&b+G6o~FNr{^RXG z0(?FFob)dVUES(`5%oP*>h8&7yS0MGNCxe}nNYGGrB?@o$Gvp%{1yF@X47qF{{V#J zP+6o^c@kOVLb=Dw_c31sZsbyK2ドル@1&y#D~H$yAj^QcCSRZ)-ihIy7~xVo`)$HSYOu z>V1{*OW;TB?)E?NMf_2U(@+85%fGsf;X6il?qUvGpyRE4blegF_Z0zRbI@jxvkv1m z>(rDV!yA0r=gwTuYZ8oY#yRz*z|T3RZs)HwWSYc+LR68rAOJf0)8jkbAt6CH1pfe9 zgC%-Wmd{QPtpHlOxBD%_#L^_&c;6ESQ}iRPOK*AhRGk(WWmz$YnKH@;r#w{v!v~C0 zgAzR`8f|P^Sw|TZ#(m6wW6eRkuX&0_Qf}OqRr zTB`l6{$G(?mc{{9&!8>Vuju~(@Q14DvE4(g85%_UWRaN0)$-SHjAxP`elv~$@0#S!-gbNj_@%K0O zt0wP#-Mu{pMiQk>LT>KXzs~;ve@{d7i%k8d^c_3EmLe&&q%usx_;F+XwW~GOqEt+> zWg{_xot?5jF<%?qt=vnekmyzp+(`ioqcapl-rcaaguwqxb>gE3Z|VO4pX7Z<;6i9f z4ZGGgmet=nFU|6+_EJH~ImcS{tq=B>@Lq#!5@@%&nADM1aF!xe9P{^j z;B>FfzwPPaa$~rWdu2{5?tl0t!?vgK3&j_gOl5-8Of9+N4fAdv#776|Tf8fjxz$N4 zbiSW6o>5S=8r5mPpIDZp-Tk2ドル#lDnjujKM)gQ?xk) zAP+z*kMZrrzL_j(XDbcMmd78^S49jgxm|8{{IB20mfblx@3Qo={d%6U@Wx*Z_~*n{ zQFzl*)S?p3QRKCZNwzJd@CPL49S2IYu7AR&vk?W>yhkxJT`ROvpaLXZ!dG$Ub7UVu z$;Eu*W8*zu$~d95)LzWNBTTmz;Kev3V2?3y*um+XRcUn@{>Fsf%s>YV=AJXub+0b2 zUsA1SKWikrCj0(Y=v^AhG-U}U+imWewwBv(PKTj3qv4yx)J)Q9iW1N?0lczgpCci# zepKu4T0SV#{uo>MQq}Z*UthV`+B9h*xVA{(4u0~3yO2F=!{yYb9%740ドルDc&5ATabk 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ドル)@a^E%7=)j8LgxO86i4GSsGr!50ykNd4g@ zNa@Xe7cR0^A(_C){44p7Ji|u~nAN2PqIw^@Ve+~eg$j6zi&-Ue!+&nS8NQ>d=;mMy zapl=psTk>A5#nEsKMrsFPvNaz+u`rp4VVW~itcl>Q27;bK>tD0zFL<})i2=C7*du#J((l0pQtWw!0ドルago!G)$!_hKUlbzdRw~^yLc(n)2(`^z?~mZ@TZDk zp8nogU~`3O89>kAYr8tYV5fknqw!l!Tl~*IBfv_YaPd-uy+o9?(XUOH$o(Jx0EL-x zCAkJ;gWEOmKgMr~Qus6DFNn1yv|Gufn0X>r`BS;$zHmQU_s{rBI2nkr2Lo&HYv*r_ zo)NzBZ;m8;JwD>#%oKqFf=(Bnqz~4=H{qHzmNCMzyk!=j;C_po;2^MaR3mG(wwr7J z01kBj01y8FYFlkb;%d)t;X6$u?eA`=@XW;9vLBs?9PjQc?yWcC#Or9W8J{c$GuIXQ z*Wgcp9wU8n(&9TCn>nL!%5FqTr02dQC-kqjG;aa;l3PfN&u8X@0gs*S*Om3Io+`uP zBUX~bM%GrfzV7FllHlk(JmrnHvc22#^gdPi+3{L1ドルAJ8Rf;Nv1qPnc9Cz~@6+i@A$ z(EOw+_sPv~d?NV6f23(JNTrb*I8b;T^dCy-{wn^@TE~k#bl3W=%y#xq5X{i3$Z`Mx zV=LReV`yIi^qn_UOF6as#j*$Q`ADapzr=r)eGLi}ad~w(`!?j(woUA<4`8B?Sp~HV9G!kAdl9)^8Wz99v{_oc`c>0 zv$!(Hf?1V8`tobc#bua^^=MVY(rPhDJG)-bu}-F6POPd__osW^bpE`L9`O&x`Fug} z_VV0Zi2l{5l=9S)GE@9(^IyjD-}sAAiKKyGdw3Sy`ASEdw6-0;+Q9?<0xr{wjoiib zdKNdvuz|M_nAi_s3iDq!d|SToFNcN1SrOeJ#{wkap9-w^k*r=ZuLXmNwezeL)<9uvvn4i&1m+=bd)bqzb9zt{osq zyW?p-9>0S0YaJg;*6ci2YQ;4fuO&kSzbj-Y2Ox*r*RVC^mljxWya67yV*65-?&3-1 znWdUXF7i1fvmQw#_sPy`o6KE_X30LawjPJDhc7dCch$GQuS1s+Syh$nm!_Y6x{re4t_TpGs7xUV0vC9r(IXT;pO5;oOyFBNuS+DZIR`o+hJHLIOU!Sa>0ACBZ9~D4>H=K>=4-oi4(qrZ_gVfmHTb>kWMk!MPKdnT|?@#t7+wS|0?j1-`Rr;n*GFeo562C)`)melL?$vyCO0q@7&{ zm$Ov2e6L}YZ|7epnr2k+b^VgVMosB=fAalK+&(iARX<{d$lp36ドルa3th$me++mtC1lA|hjDdV^#pRIa# z#FdujX{30hM+20SPyjx>lb^!8mDX01oE6VOF#iA=^m6|Is?>t395iDuBrHvQO*Y`F z%HP*x-97{U-(MKM5oq^XHN0cRR0A(la@-{;}UW`?kel^eOc6Sm^f*11SZUHxFznRTwzL~06-S27REPIR8f8=?s z0ORbr(rT6?s<{dkwk`qq)gu+lb=d_2~pz4r;niv_udw^k%s zpPL^*E1Z2I^%Rq9B7xMEuc7YrO^I(A0MSMQaa z8t=m9KGWUP<$u)5y%)`p{{xl%<&pu9e8@rcg|i+q1#rka1d!w$j->Nc00*7CSI|aW z%IBWrXJVpz_RZx0now0G!m=Rpv+}*4`e9}xJK@@&t6R}4{8R!S4 zKuZ(SuK8;GV;@SMJ0v44z;Yo6>3xp!~!u)7*X3ドルK?>w{tF|_tdE8l4j?GYH4o@{SBm>v9Je{+^rsSd$j7}mar~&zY=7UPxoYA{IKMDYOV@Ce~YGGrZ zXb+Mo0z&xr^rLw9`cnx!kZ9k>O#09Sp~2(7r8qc0<4}s|feyvhn&uj4z#zvt!*sb0 z5+0NZNaT#r1?QQ3m0TQ}gvc@p=AwIozzlIrSx=<^p9nhxzk$v9^nbe0r+keh76xed zwDZk7b_d-RTg+kBlt{;>XadT(Cm88Z4l;9!sIs*h{tLIVi3^C-gPpkK-~(SPMXXv!YOA?-4%O>lwAIytxv_%NPtxqr z4o#E|8xB6}7VBOWB2ドルFm5urY{&f|2?T8&9lyIqOo)GgWgarxKZ{{Zk$kBUA8_-pX@ z#us|tr)6oWTp>`Bvw4iTILFFHKN|e*jbnKL+MpBbUv_*S@E?QhKWCjv>ia^{H4R2c z%l)$IeUd7X*^33^rEP0Q#}oIbbLIa45%`-<)ckj;-yk(vz#~?tfc>AMCb0Zzu2^2( z?zfmoxa*Q?j;U#9CbxF5!jV8EZGbl527P5F70`vcj>~8VXdL7YmFVEB%MU3^F}>A{ z=N^47W@@s=ZzRKR8R{yal|UTSQ-UNQf+>m#>&UM?>h5W}Ei{X>lT6CDQ^i1joKd)s z;iNKh$w~^7&|;y;4ドル+TM9Wk0Z4A8fD!t;;DtcQmn0x{mQ(5W2_NV`D*15()bJsZFm zmNwdoHNypr4syA#NrPL_=DPWAP-l)4ujyVT;rs8g%eaRJv0k;&F1r%W9n9w(0x&Bo zi<-wp7t3?o{5cjj_csog@kx0+4iuc5*romcf<9!7200HuS0?7- zKj-|b=)c)oIQ1KyLU?7GaHLYFnV%v?O)AucCtTiRN&iXtE+_y z?Y!`(I3u1b;?IwIhuZbYR0bhiXv+%v=TWzjZRKeADyIPVua3SgSWMc)<(dny9n=`x zt>LRIQ1fd(sdx4rRnhr*0Hg@%`T@;_Q-VMsROdOnMq&i$gb5^Y^qK-DghREik zQ(U$xFtpP-_=nCqj`iqv`Ip0(4iC$WZ~mFCYC9-Hf)Elqj8|5_XF6z4vveI*Yk1Dd znDT3L&vp@Ujz$e_X_oHGCJ6xZkb2d@9k`eMTK*!oH18%gC1O+fR}E^dM?`f}q@1qg za96hSdF}F^wGp?MXd6v;cM{q8#K{65#;3Qx(WA$iV;lSKsaTmtIzhj<(l|&-wcw_j zXP?JsF3-AX7E*2l7&Ypadf$cP$C;xfpYStU*1je1GB@wMII?{uHOV}}q%>3{{^Poy zSw?GIL|3md;|pOS&(^QlSvpC8e*s?OY2vSjcphhj+dk7))}P`}ghhv&;XAH-EaJGH zaalWkR)6^^+Ok?QU++--NIz#=m(%=LVDBq1A1(>ww`%*=4PGFLw;0E*e5>ItTj7lJ zz}h~CscH9x@Un*vE9ebA%HHA#**@Qbqxc8-*W}!7h@LMS3a*@^?xnB%1N5F9!&Adx zohLOdUaIF{+N4D?plIarLYamdbu;w-2p- zTcP+X;QKwxYS$XJuOl!jSp-ErKppF2{uQsm8_XDNwWx_W=m<6y&j#3hlxfc=my)6_hw z!yBT-DJaQ3CY`*|QK?cc+|=Lx0$BJL@ZV8*r-Mk)Z?sEs$y=M9;m;g{iuQE)L*gkE zkC+kH_ndz!>O2d1soF-0(5Qo-nO6q8i+yueSN+Ti!~LvR;yKP5wM=BBnfhKE8(y6V zDoQrDT@R9eGW-$NAhi2c{k_%1D7>3V6f%!fxK|mb{?C2`ywT&ilS9{-l^f(Y*bLpy zHsE)!u{?MExvSVq9JbIEApFGS55v8AGh5%=SiPf8M$GXVabH=(s2ドルQzw$hM z+PAc%s z=l=jftX)4~4eAA=HJ@(`{B|97w5yTULJ%v`KBU zo+F+jqwdXW$Uj=-yi?=+>D@on`ixFCr?HnO zUqARJW{uzpv^(hMjct|C=W~PpHS3moj;95ZkZfeY;l}PiTKQv9@j^#;A-UJJAs+09 zib9zmLMx-wJXP?q>E5`#L&my>p4-07rmFQAhP=b-{7^3hBX9PMx`0`5YOGldFDf{LiBo;_j&(++i(r z$&N;I8xN;Xt#o%k7IibHlOB&@B#eOVMs2yTl=RJK;g6YbyTraGf>mruy6a~35ドルFU( z^scVsQ}}H5277NCc-{hdc;aN70gl)l(NdqgWS)<)bmi~e$!d>Sy!fYcCYL;yUK+IX zaC7s6k@;uv=DuY3ljBIQ?rt{tYAbWQXj3On;P5N2veo_@1h_`=$BZpXsWBPtfkyUh z_pc1`th!TPP4-_EUEJERDjH~zu;)L*YrhX0PVDn*{1&;)U+ZwZu4K_;2i0E{%j%cQ zKK-^!9(rNARC=}ej#u*To>k9Xn5+w(N=F~-3lF7tx=FrcI(6DyrFofzjq>85EaUid zOqO?J&P_w-whloRy4d7y?64+r{5kfc&m`kzR`XalS`6}MfyDwRGL`-h)~1HqX)vFE)4Ivqb(NMu&~I-g%sE7Lp?{?axF)m+Cxr=M`9H4B0^sQv>g&5tR8hFFRu-sk9(FkM6#>lweX z&Yp;tv8;-?!2|i%ntVBJ0d<&;rdbo<1bo}k0n3b`!!1kt{-n+@d`~v}486>E45vE` zflqUuYvXu>6NjMOt5K7(zK?${y8Z@mgsHeqNqf?^w?92RQ{$^E(U{}6z{tX{t#G$G z;u&*<0p~dj-d`2giq>RD9^y?e!x|;T!q8|-3a0Vnp=Vu<( z%}*Ca)^y`WSKoN+_?t?c(u?O>og7Oq|Quq!r+%uD`$Xym1%WJ!s8k`%_@KWPE}Ft5aWCFv3LO`_&(`$GH559@Ro-y}qPSec%tcty@13%K;l)9CjdA zG?#XV8Hz#lHKSwwpK!o47|H(g;($j+{x7=QhIq&P1Xez$uD#AfNQC1Y3fE_EEFsOXuI*@T&I>ws~wZo#k zPqgDG*%g>=)N%;?>WCo{@y;pYcHrbxpJre7Y3pvMoF~$NUCUNFl#nnWgN}KwjtzYz zj2Beh(AH*^Z5~rF#KS(h&3z@{eHO~+!?y4L00^#!aB@MC;h9{Yaa?$bC?xH3>@pl3 zOv0q8LaK8ドル?$dvf@;~86p%lA79rH*4uEXPl9RC3I>2OD&qi-1NOSd9`6K}l9ドルu9Fv zF_SxF?9MC~t zXatG?Hkt?|(aGyej@h6F?LGZzcIK247wJjg0)P}LrNM0AQVg76Qh~Q8ng9ai;Nujb zNE~rU4mtPfKx~Zlpa*l_jk(7(0l=jL6aWE%fM~@h1Enb^u%G}QDKdKYqu&OAJM%yW zbI7F&pL0M%`P0N;W`G*XLC6%H4l_^Ky#*?u#xeAu2*!EA#Xp{z%{(a1NamLq?LZMO z@N-fP#C63e81yvYxHJIJ2_B}D0uNkMf^+Xr*`B=P+JG5@jFUi4G8^-$JeDj7Q&KIt zZpMHkRV0s`3bL^Px%0E_M0Q1p`3b8>PjI}&kF6jog&U8|K9%Wz2K2oi<5_8sy+skj zJ~R8w?2+HoYBR3y&b;;=Hdz}B9#5ru?|?its8~QtSXq@I-a8O;!Sarsli9+>CpT?*Po{m?%Ol`YYKfFHt_IMp^|>99%WsVk5Vaa}#rT#GG= zpC&mf2TEHzbu6Gp4oz${QHVwn4;|MPv?^LI!R*^S^5Vu;bG9RodSKJ1Vg9JsZ6qjL zh{ryaHNC8CMq{oS;#3Z}VO-h5{{Uo8MoMGxr!I>z>M$$Pt+dN&2;85QY*~1BOq^kv zl>3U{shPr_>7I=&qIF)9N05yUL)VYOp1K>7IX{(q#gBqCi-sHK#(nFe)BYIfGUGF; zHRe>}3KaKD_37}e#L1@OlnR#E^O(f0cc=qyEpH7+s`U zqmTB8u7VHQ@50#UO^uJauRf<5vqr)t(+(1=7p+8ml#fsb1_u*`?t;s~>t93u%{EYI zUvEPoJKsGv9OD)3R{sD3d_N3DA=1orda-50aF>1W3CX#1&{idyIt{p!4To%FU)YO04Cz8`H z2W4z$^{h#>U3GM;ZTd~vb0nT%2npMS3ドルyB3Wle9XLOy#7we8Fdc>D!^RO8I_l7BSM z&?8opzN>fC>*m%6mf(hSw2_Gbua>?mPZ`wac=x7U zI;4^ekiZd-rEBX}8p>Re{gJ5u0N^B_;a^*P82y>NE90+*nl7!XYNF3nxr;N~NtAe- z(1J26^!mAtESj8gRdr8IEZ(QUVldy@7oz>!Yj&ULkBEkwARlz&=|}c-g#FX`SLjvO z>|x;$PTg=3{(Y-F{>6GFz&~Zx7Dntp$gJVUSUI~S{^NpNIQLZ*zJIDd1v-3(_)i|x ze?_)hFyr8_9_7l;hZs=~e##;fgL5j@!6ZeMn=^En18GCPf4TU z`84@R;x<2pnd})fp$i!tzsoz>jINGvhe)tDiR>UtZnobu2Xmw(_?X82h;A74>NSnv&j8i)-n~z{1C~Kd<@c zNe95IdjJ3iLHWMIdkfV##!TBW?~L(Yy)0yAv}co70XRKT@x$nsB2SrFNj6qeYxomUn3)Bult0DPRl9$M+NH#Kj>Y6Z>Dvi51fr>AA++zNq<9fnfg_b~g7n@|-p;-2vu}r+r&xc(7dk zAN!)lQhyFPudr?IAxr}iVtetEk9RxRr?!yr?^-I5n>%Ox)yreQn?!G|I_wb#oYA zt@c?)KEEw>x<|wr013jyev|kKVO#@u~zO~xr~Qk12k2f^=z8d*qZiRG3NgS>$rez@YkqtQG&r`p>n`4^z%171_$ znXK*H!l)sL^hJzd{zr=SOBc3=1O_%xdl$j|Yw}Je!z@N6%J=Mkqn1uzQjAk+ny=yA zI(+`|Se{52AEqmT@&5pVblqyv?b;~rW5xG*#uZyLZsLgJf>tUx-oUbW69v5x!mqF7-(@Uh zB;5Vwj!+wb zOnLnIs37=_t0c%#TwwnIadG_WCA0J{9_){@JSXF1Q5uQnVf;kK#~+ZzdPTR0W03<1 z3vrTsqy8DMjQl_2KN?CBTPr*EVlW+SmPGmjPAk!LPZs=NxC;zg90zE^o1qLFz5Y^v zm3~>7(1hx_Ma6vVeyx{PYK&Ck+Vnlk#QrL?T|R8GNZ9D=>CgS~kJh|TQ}Nm)(njeD z^YZ+=^Z5b#)`q#H{9x6z9ドル+Ra(_w^jv-@8IKTU$XU&I&QHSqn+rda7dlC~Y?!yA&HVW_ zz)9l!m?CqjX!mxkP87Z!e?oCr^dA^mB(cndE1n9NhhL!;_w$Y6YagG*+NIB2(mo&? zgfQOONft&C;=SwnkSd0;t6MrdC625~P7tayGRSVaL@-pCX4ZfJ1X>C-r@ z4PW9mkpOZewTdiq@`P|X;|G(P@FPvCmq_|q$}W|gG4*|NX{C6?8j@h`IJ=Oy=eq;* zthHOq_}xn15T^^e^fPqH7(U&zRdxRWi&ifvL3I%dKJ0Q~Pvi&ku0rSHCA{-H#E^s| zrPO_Jx$CdA`JXT$@$&_j?*2Kz zu5(`TR2ti`Wr{GPYVDBY9fu~cjJDwl7muEKegOO{N>FiHp;w${?-S9j<+zil<4mp) z(isUoxgXZGtuiG4aq)kXnLz#cnb5neU>lx{9kEOgm6F;fU^WClyELQwrP=6RT< zDr!hjsMFB&y-!}=c13Oj^bH)P@%RzJt|!EI`^F_%_l3b{V!-F>YL5FqvhB6kXAXb5 z2*qOEz!hA5x6RL2Vgr3MS4}0c6MV)M`nybBgDA#%;<4^0$>Ssr^{0IUx68lH1A+7A zsT~&bQbNR6BRK?Ox|>OAbEMnQ&3Q&R1k^0p?fTY*#)okfd)b1F_u{EFiz(&7p)|p! zwQ3uUc=y ze*t(m;xCCHw7S#owCg61<~fy?t-i8pn~!az``5sy{{xq)s`z>D^ai}u6^n?KuQJ7W zDgZbn`|xSmAoRoeeSVmIW9P~B-NEEqJ z4_wyuy}GnYtv%A9>9x+#eY087Y0O`UpFP2TwbN)?E~40u4Jq!Gx)nJ5_^u2@;~47y z03y^~?9qpL3J`W)&cJmJ#2Uz&7DfebB_N);HQZ~OCZ`5N>BiXfA^H7ln7*^Pjk$qT z4xqWLDAtVD>+pY(tfJPYIS!{EX_r3EY1x;dx|9!hCZ~H@AD=Bj{{VWBT1o&rGwr^+ zRF_Zd@G!9)Z0Uk7rCj8ドルNA;zW-J}`&V>Wv;8d+kOr;^9=s2U=KW+zeXd8UW5D_lTP zPw%ovy;Eq&JT_|U+dH#i8~y}ptJ_GV`l9}cfIM+qI$AU(zJ@~35s1LmvAoVpS z9B1VHDOWwB2i(vDQdUF5F!~zNi(0;oFqiizzJgXC)}yvyq!Vqs>02=B5UgN-XEFE9 zM3wp-R8n7V-+$ETcH9<4r&m&ys#~f3k)-a(@b8v2>U3a;bWc& z!R<;sk8csxvul>@{At3{KD=Y;O5tOk5HT3Rpj)|N@}J7OKPoZM3Q&pbk@Hu!4w;|=cmj~h zYo|oL25LcN5ag(1x>(?+8|{a+_^Z)^#Z<<_(ky(!jzz| zuVL2wh@{%h4lQPR8S%pIP(TOtuL0664b{K^Gh~2B13i0Yy*k^&7V83|Phtl`_ZuM~ z`ka>k01Amp`Wrz#&VS+tr=e&*NNU#t0aU=e|XBdh{0d z)5wW?48=|ZTVa&{0Kl_@_*OJ%uJ{Cz?~ZFEb=}zR{tww+TkCe0*1B_E6gxVq?5ドルh% zUh(k@#(Jf_l=k|Tk8NdS@voGoVI;|paveq#n)45YT0_|w?%vw!YjVOp@Y*)kJe|H_ zO~0A^E2{W|ujxk4YZZf2`#}M>-N=zgA3T7BHgoI8<69xm6fe(lx{~tpszb0(l!onw zn&%}?nBj5iNv@Mty|(j;LkM6xvpYFC_2@q#SdOeoK3E6P3{^I)Vzqa%O)d9!%?)lr z>5r{j9$*+zxA3ODyRgY8KJ}f-Du}RY=!y^cRI6@Sed>`ddFn~2+za|_QHBKL{smWV z1OhRGo;nJHOVh;Cg*YH~W(%6Tf21v{@FNHNyZ1NcTWia(xwSDKU933AwMdtHfBjUV z-<$+lftyjuip%}0_d*zhogy08wu)2BH>Bc=Fv(rqfPa8CaYnkUbQi z>0IuDeGY|-ly+t4_1Tly{c7#MiteJu*2X*56DzL_j6L?!p^c9&N1(-X%LPtbqpBI5 zXl*8THr_kbA;A-oTNWP_by%cQF5mDq=Sw1heq;2-ShkrAs4(PvV!5T2(3bFDanl^< z5gnxd^W5}rjT-a=a@;#)e|oxmACBH4&&zN})rELIofXT1P`ZwUR=id-whI>->AE+; z`W#m+Oq&e%g8PxzPdcyP@jijH`2PUn7}S5Hu18|Rx^E5qZPYbc*jzDp7|B}s!%xx+ z5VAbLslg@H0sPK?JXfmxH_;-R;efbOssfVkgP&u&n)wX-C&AOfxj1z`mnh7t;w!i} zeGhGq;&sT35F3wrc=)q&g9Q)gSSQ2&Okm+04nQoepUJA6maw42kq}3soPRT4mAnQO zzl8gim9>idj*9Q&Bcx1Zw^jq6m;+pfr~6Sgl&r09kT~ZRo#G21mXEQ4$j`_RAD9*3 zJ}|V6ZXJco2{(MnG(>)*HS`%?M}ox4(ogSy=6P7k{{UByG+@5t-p}n%1;hUU$D~=t za#c_CtqmvkkhQ#*h@iK2;4zF~{+03Uq#%KWA3Jc*lWu4-t_g``L{lCS%D)kr3y0?=(8C-)?$>VE#nDUaG zcG|$#$eK;pie~J2Z%c^&M-nvwssZGG6IXnYZm|2s`GT#>qF2d@jy=bEW;ZKqxX_LVd3?oMmUEpGg`2+4PE zg34MsA&Cckkk8NnMsw+b&33jI3T@TW<=2mx%_mfy9llk9`&u#l`u_-ppcp>Ic29et z=yL8R(j1~?6Y8=tU<+t zon0eBc`7hI?oDLsUM94*1iRs}kOG>wN!X8Vq48e29Ls-r>Tb&f7+_XoaX*bt4GAx1sO7cbluSC#%S$%Tf zyo%lTi~%ZRABe9n@F8ドルPypUV8v6uC5R=sCLwQQDXB5~SPaL4n;Yx3;!wJA@MaMb-v zDZ|OqyOrbE(VlHa?gG&1wruBxU~oU3a9%dj{7$xIAhXk@Gj)$<0q%tbua@ghc{q(3 zf7~Sh05Msbyfe)cp)y8K_uL%*0fl_M8OEH`iam}p2Kn@vW} zTtw`ocH~!*c$>l3)@Y8-ka>)9vC4TK*{`NNUj@qv5@nJk8Noov2jUJ$uNm=5eV!Q= zWsW2#De~kV{CoaCg?;v0InC<&^gd%vra{$=9y6%v7gp~gj4mgcl!k5(wsth^t!~dd zHVz41Pvu>e?YnO*O1^m|O;wWBz*ihEp~yA&5sOIt?xgPaGOg?`UCCyFm~wiI*4CHd z$gUW9vn*@WgeIX7g(nI~J;DC~IIDJ%6=e$?s=((fg1?SW^`%iY7CLf^lDfI>9}7H4 zJU1A#i&+9Z1LV4H-V6{{Usmyb@Mv5>KeW#%sZRH4DU6>Nr|h)B?#m z?vL>x9DX9bPfpP-^&3Plr{*VKV~!;9`S0=%n0M$a^8CvSMOSq#uYC{HvikKUMMeCz zJKqub+em}M)7r;1%QGhtd5GEL)SCIT#5&cfGe+mXS-X7C6xe;yrTYGAkvEhFKct#5b}PVr`yJcRs@a;(`Nrvr-Q zo5gqWfy^jR@VI3;`t&sDylHg-24%n`;M>fFhvAz25&Rx!=Sx}Nq3;%d2fit_qdXet zgf$qL9kECdWaFXTisNY-zh{z^ZUcy2Y7OWl3P(sR*ttgrW&5d1Ol4W<78 zpK+$@;uZVQT>{^RwT}$F2;ht+*K|d&- zCPqJl3|4XR+dRLxHr7*)l0wqQ`XCvvN@{KvyF7?E#;1|*7vBJXXZvd?-%7ThQMi+j z^sQA{KTd|SBK@BJ98WaCv`Z*B%xJgn!2Niy64rccsJs}JbX(p!%@g^bi91;SCb_si zDQY@Igr%*a3V!5w5&%AfBnpaD=X<#qh^zgfmitlq{{rwt9oyo7lcsk>OR<8ja(ec6 zpUS;!!G8&U7T@TW(;o+EcUg#FykK+O9Ffjz;@v0qp47CE$@WXQRfZ4QSpaXup+Bv9 z9*_HHX|UL(y~=8_Z5Smjmy_COb{x}6$f-)@$x ztvky=K3=~{&H!L>gY0TdWDGF}>r9K2yGXoa6y;}bcjBs-Y!DuS*Et#b)gc>JS5m}y zVfC$>JK&Cv@$Mk~U8}!<-}od;@)7`jxd4$bbg@e_<7l^bg@bjbhg{1UmPGmgZkAL~>YaF(S%&IcAyT$I~Z@>5iz#@K1~yC@S8yQLzx;mjHj?_C&8&KD)|l(kZAIalC2W1s zC3|u``=}dT@H;Yg}{qF|Pv!lGDOea-~*w?DqXmw~CahD7ddu-OLax zx9%<^1hqs4lf9cazh${&^fd%}_5grs&y^e`i|ozg=t~9zb^jqgwvf-c?h*w}==mze zS!?sR=yCHRlg68VOIwhqrs}OWk$*5R1)aku_loBg&_(0)OpA>)pG+Q~t#0YR6*Sv> zZz@YGwjF{@st4g&O0FiFylG$NT8%kqF~)5?se4w)32@uBtU_PG0;hiJT!A-Ae4iSRb=g z(P`7na4iX%_WV=Oc=>2CW)6B$YMX?sKaTPY!BNjff2wo*&iiBM&9HDe4AmZqLLq zY)|x^q;@gZh2M%k(PCgX3h|%zIUk*3^sZKgv=k2AQ839HF zgZxWfO{Tr7VR0Np5Bg=Az>V5B&cJ_4?EE>e+`@%LlFXRpM2bIBD^!Sj8agM6HAp5_ ziWm{cLL(s8r)d8G6#PjQvPSZ0(+w;^!mKpW4F0r?*_kLoLyx4P4@*+ug!T=QQa_@i0X?c`@`Pzb{aLBaOME5h|Q zoJ!eHGhamb+f{p*T-o@3I~5Y}RPeB9NT_Nri?(t?w*U|J!^$_+2s zP=5%ggvjL4k8(v#iMXFp){{SZ( z78HPDs?)LuT5*U0_k}LNX$)rI*`R$m?N8aB!kiR+DS;U4(=?-=*r_(>oKha0@jwjc zKGeA*j2d?!^!({gdUv1*$t3VG^`HVrH6Tp(6rl*|iU5em&#eVI4r*Z@PBTm8f(}1A z0E2JVjhti}n5X4Ru?hf(%j6ngET3~zZ094Ia8Zv#KoAIX&wpB9EY#Zo>~JYa2kK}7 zAers-qsu(!ikk-loDiQ{KtQqd0N~Tgo)76$EM#B-o;%cn24TYBQE)2xdB?3DUhi7E zESS`S!G{Mwl`Dat<$ke_e^hv!t{w}(y2!}+04a3(sj||##!p&na2q6)a%6k-{{uvl zG8^=z%sUw3KWx*4XCvh%wjUUrFy274vVGfhyEs3h>~@JV%6hNB{b#~aT?;*DLebvKZs}*gv==graxtG%`c{|3 z{{R&DOvXR3^b31bnTc_2q^-P4zN*J0gXp_Q*0`+)Rn&B-3_4IXucE1moVHs7rmT z7LxMnIi_wH>?l84=tn<2jtf+h$>n1l0RjFIk&eJvLV(7zFS;R+}xkU>1C5`^(4STiQ21QVTwNc#1~Zd?2}xRP>YyB4xJAS^MLAmgqFHM42(vrK|` z()+~V$%DQ&wwg6j?nvuda^028`<#^j01tgs0+;bv$nnr9lb@zvxi%jem6*vbb@;a! z{{Rn`%6~#@)S&oD;Va%`zP==b^IOH7d+jt?{?A?#)JXDtTXVZOFtxhxU#<=)_huvk zR9#u(cQ+b!x{!d*dF31YMP0e7*e$Ad77bz6pApOjLAbB9z%rU_@ z@6C2LU$d9P@3O}fw`JuVw9#N3dH{WCdl^23dsw66e=iDo$FLbDrGONbc8+~dbNp?Uo3D83NenOPyakyv#y zFeC8Ab5?_ja(xcmJk+G3x}08?FI|($pUOo$fLFsX`t7e{_+zCRO!C|*npb>+PWAmp zYCi`2F}#BGOh}a@!vO2J9(^m_^cz@hB2|_TE%EnbRT!_z_@gpXrS*Di=6;*Q_y0aTHKf02 zh0#DH5XYaW74sjD-xrf2W#R;skJ7%gBgD!zZEK!xVM$b`@1f$>S{3ExrNzu`6fnbx z$C^MdxZ`O2tJ-`m;T>O3v1#U)PSjbXjHJ`t&RK>ymQ}=0&SLJ`-^F zR~P!Mb0}a%tF^lB1CR>F(l9>mF@ed&cJ`?jt7&f`)vqt&MGAkkQP?2_{MeDm$sVeC z{OhQTzi{NAK|xZ|aL zL}PR0>N_@Z*KoRCOeWKAq=8TFuB{YD*SRQEjCvj`9egWkcPJNHWK$t;_0#S14=0j9 zB%FKqu8+i@6SQTwl1m#^+^Sf|95U_-2PKysD}}N6lyxa(l07^+0h8s!Icy%B1;FW4 z(nmUM>+F0!Ac?KkDdUXrsPfG!Cw>*=EBP&IT3F9C?v3S$LSeTu1#BMbu>tv?#<`2h z8qH@D+s_r6T`Al1T?7rrayK58g@5rP6r2vKL27y=Qrzzv+UHJ` zi$-XGa>`cKe3d!QKvp^b01nlt*OQxN+a0{BQx1UwK5_1YJp0#&So~qOY2`${dGe*B zRIbJIVKDx6kIfoE|=Me>(ZI#2*kPnZwU@9EYgmc+F%*<5`awon?!bfcfju zV>ueezz}W|n6K>72$YlAOoUC{s&o#*2 z_~PSHmKf_R?c zlrNT1f7^flCl5ドルfsV?CMyn?8x~N5jT@$R!$tL3WRt6)m^%U`2b@gQ7N>2p?)Q zp67Pc`gE@l_&4HvJugpNJIH2f!+z~8(0~VF>0aYutJ_>E$rMa@tB%Pe%sqM zHK%ys}^#1^dIy-p)Pz&>q;$rk&-6}*`?n0i!c^{=_{{U^JvI4fnx&9&) z{e|_xg^niQ`Sz{{#Fz7GsOe{S=M~_`uqys__ql9c z7M<*t-e)m)jflx`-at}qxhj-{*zebgd4;!z9)j;7hhdjgcs4bge~1rgx>X+*l?RfT0-0wR@vt$tye!OF8|>bYE!qLJ7ihxYQ>nBHk^ zp>dqrOEe^Y2*$i~;vd7i{xGuWFM{x3?E6 zE`^-Ih7Ldn@xVXIvo0gGd7sO+7lnEd&BwnLQ|x9oMre>I>KaTR&#iu!Ze^kQr@<{x zMvuWh5x-LNX|{!&a`0J3{{X37->p))_-UiumV(9N+nyqt(6Ceg00SrdDZUrg#enkT zki?(D755L!*5;$*BFG_?ttCO!x{`W&iuuZlq$(d-P1C7L=_Ac`pM)2dPUguYZ~Equ zpi%4q7_M%AgSw@}Pb^ZbQ+8eCpUj>=3hs5k5!(qdZfYetN{;nSlhsha9cx4sdF>s&vGJSTT% z*p3Lb1wX}Y8-PBAxv#10wQ0W2qV@|2O$Ewune&Z%u6#sqf`5U=CK zMH$C3S7?DvGeTu6^u)@@1wYo zjsy%z&*TMTUTEeM%E`|_P@mSmo1ft3fv?M*KG{+nXLYIoy`O?9br9K5zThK1B~yn2&RuyNgp_pQsTca6%h zD&4^~LRedQACRUdia;?K&lIO{z{sh{+xMx59FQ~VOp?1Zb?=&AHbxwQ8ドルk>}oc8+D zNF(3rRwhXu%c}-u{Hoo&!a{P6Pht;Bg583XxEv8%)=|YMMmRz{lR+c2+Z&sVv=Eq={&+gZ@P(NXHc>+#G|StsgMJ#%iuB3MOIILHdecv|!{e52Y%SFi5F9 z#5@owe2Uk(3r-mFr#{A&WK3X|AB{Ma9kcYPNE^7xszPO`<&qt>2>R89o*WU4Y6jlzr7jZal}V5jmme*S1=&Mqv-^z&pm{K>8xkEIy;(&ZbLmNjl9 z^5pquh>umxY3SOE#VX^-bKA}Vm+~OjEA1m3+>PO*UKCIF&{IqfZ00K2)En5EH{Z;M6f9^`d`qaui#l~ExxL@e= zOj#wfCR}9wqUDs2z_oBbBhyW$KucBs0CHw*eznC*e|0k!dzqcPmXMl{?J}OMPr0U* zfwb9XWMD`bKSNL*-t`%k+xU$qn#1^wGD(+s>ZJZPD0W^pzu?taOyj*TpCRu+?sdCB z?Ms24l_A^Dy*K6es0#^#PB@``>FP&eoKlzLfj|t|p1-9k$N2s$K89N9E^`X+&yIJ$|(R03rJddfF3$Y1{_w;{ziU#vMsD zVB0YE`WjJZo=M21a4PN;765dsg2@T6nbpXB^eAm>4FWpr1-tVk#xBM@$cTdfKlYs@6Jt z(um1CbfV)SSOWW;QfNoVk>}7R3EQOdY;@0Ko3j|Qh+{~qzI5Q;07G`=9DC7 zpva~uIXUU?N(zks04fU5nNkwn#YiAVAR}(iwlP&f2cu%9Rs;p$`=TZ0KwRiFt4mcQ%#leT6`ZkcMZwlM8ドル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%0DX_=Up?s7 zcQ=wF7;U23dZ}hVnQkl6d^Hia$D2Dwz;HaZV1Mz`Um2NUd0#qupLvzyx#FR1k3_t( zyz+#PtB4}TOcF-3u>Syo8I%vsxGxiU!h3oC%^TUAe;%i-$r_*gV;Zpk0LP7XcAAx} z5O4m@7Ys%>;UQoB1x<6h_0|327qqvy&4=;zzwzpqei*zaid4tyyev0!7u7}gdj9~3 z^~;GiKBuQgYIsojdN+rBI~~;PC7*|+zH6ドルFmuWUn zzWIRtE7dg3BUO$dXYlTsW&qB^Z@Z6XLyySU&33Z}xkEGD#~ygw7!8l9RyEw|`d*K6 zsAZaWTx5(nWBD)x@~#YRCf)D&9-d!THgUGTr=j?U_f<*clos`b40x7CCBJ$*Yk3>*A zPc&rl>_XL0O-9xu6EEIg=c2nkwZE4Pi*dMcuWL6x`6Yq;4RHFllW_NB#c6$WJ03;0 zp2zUq{cCSZ)Go}4#CX8{+_JjI`HWV+rQ-N(t@h7wwvCVVRuh=>{{RCGpXE@SgtXM! zYBeG6J05u66W6T>d9+!OH!5{0QXW6xPe|6L%0-yyO7flyz!~E|@F0X|=xUa~twpWM z{!P622ZwTQ82BfNLVlzu{cFC>tH|=b)a?^);v1b!i59nZ zuqQ69bs|PR^W_YFb(?W#BF#|TGxMFJKa?gs>q zOxC@<*@`ew6+n({n$nc}vax2{j+g_q)3xakxsd=n9dmmwt3qdg;g1ztsu@6zoh_ph zo>|U+0xQ)#H)Pi~vE3DBj&Gd9DjziS$-y5mI6uYs*OypmcI6a zl)W>_aM`+Av(^fR}-5s3)xl72$T$t31eLB|ko*lBD+jJ?dOymwm zmcC#8_2wVtT;`joUPt$gHw)7eyW{!RtKCT?OND{~-^-PYeK{wJ@N09aUgq#=7<#xu zrHHdVwDE!bQ%AG(;<@suv^ifffir5&3(k#w#2h~(n$*_s?d;*naixp0jcclfn|v(; zsP2r@Zq1HC9*vrkD{g+^{2Tmf4a&L8$%FXRk;@YQ03Juw*Hdyb&~SxSerTa#?!)|P zmkn+P5;&CO_&NTx<8u%{dw0|s0m}j69c24~&pqq^d+i5ドル>!X%9&OHiZp^UI#NFR+$ za|`1;SPyem7?o^p$*$PyjGmgBQG|XNeMWQrDbiR#Mt0-qd8!fIv`35+?kdu1a;O*z zKN_u2Xh$`YbFo=}-Ug{OMG5LZ3e@|1OUn>`f~!vIPH~g;#R-!nihyKw&(@VO=}2}s`=Lnmphks3-_N0-LV0^~ z4hi=(jT^QI!S)p<;m}}=bde95rp>sVfsFFPa^Tcw1pK1{oN#(6{AoPGIL{OaL!R`Z z0Uc;3BRzfS3;578ycV3`@lF;)Be<`qVY+vMIW+YACyy;*bhp&7zNJU{uJ=7*(qFh)TSZG>(-TR@<$bmqj&xqg3ib6 zT>E~MiXi(b&TuKh+XUo+=qhD^{{RzH))fb-C)iLVhzv>xP*2j3M57-lt7hDF$vONf z@@cGtaodkj;Qs(4NNp7Sr3a=d$r=;L{AzzCanCf*EOL0JD-PKQA0a=DHG~_uOnx-w zOrPmWzf9+)0b&xdso`nZ7~o>10Jre11sEPNk7^1?i~s=QlgrQ0)WHrp9D0yxR2+o^ zzf5(YT)oH&U=fa#Dvv=|KE-g#9b#gH?F4ksp{w>D9hUX>Nq22#dC#0AIQr~HpjI)w zv7VF&@_GvDkAdTf3(MjSEUp0pDYD1t7!TBs&b0@Iyc2B|yIpvbRFT*ZF(A{Sz&-GM z{Nvn#k@!=y9nryoo_`8(1fDp>Z|gdCgALLym#NQj0ng8I07Ab|82`VO?0~SUN8uf}dK9@^}WeC$Q6# za~(okwNacy5&6IGtYCZK{VPvM(tJC0EvsD5c@?aR#zG!AnOFn2m%t#9c^Sv1c%zlD z<~dc#85h4=gfkjv3vcm4>4mhDUn&3$)6X5U?%EGcjxn9UWZ;48#WL?fd;b6~TUUV{ z(6fD}>-Tu|5;7t$({arltX#)DmXk`Q#AKkxO-QlES+Y(&IR15^qUkqpsH_&yTV72l z3mfvtq>wmZz-RONb6%mRd;thG_sSOdlQp9}J`)!(Z1WkRYh_hW@0W3qI`f{?)LRp0 zkw7dA;9NA(#hy$+7X5gn)KH0Q#%5@Xzc$<4cjajiy)lz9j3a$s6(a<22q$w4duds^{hzh%tsu1g>q6BYDHzG;n_Iw&amHHUCRc;PzfQQP z?4{VXQY%yAp`u*RcGf>(x{~@e+9H8DC)I~sSE6_;;RlPPlIrSBE?Y<;by?r@dh@uw z1Lr*8b{&m-rRVI$tX?6POR>?dWRGYU*0z_Bc_l|9G0iszsXMdjT`z%t9r%#W*IJ~S zHmPNAZqkTs?QSn(i)i9O9MKmCX?%>S`N7?c3aHY1FqKsHJjYM)quOaVizK(Oki}nQ z22_RDf-;#12*JtYn&q`Sh_v|?<-wgkjvn9cc_(3p9n_a`r$kfvt_{g@-w1g?azt=( zbFBTIM|S(WV3aZ4fDY258Nlhv-*`(zvy#}{cqdqvauDRl4c5&60C{18Qa$s??geV8 zJK4VU4}ry$znL=PbxccP+9n| zO88N#T-n)tH}Q6z1>C3_;v47~G?-w{5+B}RHgmfNoRBd>hPtwO)wVuL(DZvPb5m)b z;jX=9b9oZSV>jEb7(4XIB|2uYbuR(jcyQ_$J|pmL-1o7+%LUEcuq;Xgv3=oiauf`8 z$oH?%tuMw}bH^w4uZ{GJd$>u(o~L^ZPXHhl9%R=bG3}fapQUheM<0r{jy3;(55n5? zvs@#!jIX2W1(OHNm1Kq5P5EUQV~!3RkC{%IT|yNvrH_mz)I1sCj}Ai7_;*3nbsLbf zZJPbAB!H3172xm+ocH8a6xaMF+V!0Acwk#uNe~E^3djrXU}Oa{e(@W9Ff(6t+WZ*s ztlFK_xBe1MK2l5Xwa~518xLa8%Pt#?x6w?@@%Ep1@XyiWzK zs>r`-islFuh5%#~xq*NOJZ;8FIO|*99r$j1IcH~SW@M5Jcz{H?Nu_dm%S2ドルx9nWyg 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ドルGBDQpGV$)E$OKmE_Zm!F5 z6mGHp8EDiG&WbCNzRd2!tFy3O4_nn0jG9iHXd&f<(>t*G?QDKos}MzZCzi2IrAczX zacr$TvJa_picjlB74p-Q)gNg}I-KUccXO#&u+=r4PVg^VTXl{o#y^C&Q}_&5Epcoa zOpru0t8lqkehSF3<`rszvq3o*k@%x20x$qi?gh`je4g1a41pcq)*vc%it z(Po0$avS*MnkdKUtlzB^SFJq};?h@RWbkFp#Lm-B@Rj9@PF#M9Kb1kK>3V*R14k6i zadOL%8Yb|^-+s|W70($q^*bdLqjW=Iu3lTleEVo&RUaux(O-{X2>$@bg%UnM6 zX6}D~mD+tkQbiP2&ME41Mo#u4^5AKNtl`6Pu{RT+!~u$mZCg%=>_`yEhYV+oH{<{u ziYZ${uV=Iw1NExY>bG}ptps+ls{)}Thy#zr8YrSGQe`G$ zyb;~FV=RSWys?THw_E=F5LnQ5=(M1$i>r)nI+**ht+>Mt!f>0>@I`LWa zGfcx1w9;cBD8T$PkL5)bL=|O%MNrSTEzmI})kE^J&nMc7Dv+4mocbDFjb?MTT5 z*O1dlvBo)40)g%F=QL4CftZmr`=8Gc#!d8ドルvbVM|{OZ4zA%7|7W!=?d0DfFiMRU#S zXoY(lh|q-_Vjsr%C-gO0p^31mx=GI)w{0KFiYuMTmWEu}O$>lfBdH^WTp!k{ZUKtN zmO1B~5k(cOA2QS)gtA-98g7^F<2*mtsr+n;qiyowqntir0s9hzpgubm!i;a)??n}) zUBt-tmz!;*6(2!z5=eMOGCpZ*QKnu+#>~`jgDv}Ux_N5=C6i^{ougY;t zz~_)?qJSOdVB~bE7EHHX`w>MH0X#P*Co02&I#r)FlyIYOtrSpFBax$YBj+bRyi;U= dh_Yo=J%-ao6bY1D8Rkr%rAN5>QAGkj|Je$CZk_-D literal 0 HcmV?d00001 From 21021628a73aa552dde5991783a606cb4faa663a Mon Sep 17 00:00:00 2001 From: tuntun Date: Tue, 1 Dec 2015 17:58:00 +0800 Subject: [PATCH 64/73] =?UTF-8?q?=E4=BD=BF=E7=94=A8requests=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E8=BF=9C=E7=A8=8B=E5=9B=BE=E7=89=87(=E6=88=96?= =?UTF-8?q?=E6=96=87=E4=BB=B6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- save_remote_image.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/save_remote_image.py b/save_remote_image.py index 956f037..87f92a0 100644 --- a/save_remote_image.py +++ b/save_remote_image.py @@ -21,6 +21,10 @@ def saveRemoteImage(): 下载大文件这样写: for chunk in r.iter_content(): f.write(chunk) + + 如果不使用requests模块: + import urllib + urllib.urlretrieve(url, filename=None, reporthook=None, data=None) """ saveRemoteImage() From b2adfa214a9d348cbc51d168fcdfd293016e422e Mon Sep 17 00:00:00 2001 From: tuntun Date: Wed, 9 Dec 2015 10:59:41 +0800 Subject: [PATCH 65/73] =?UTF-8?q?Python=E8=A3=85=E9=A5=B0=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- decorator.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 decorator.py diff --git a/decorator.py b/decorator.py new file mode 100644 index 0000000..43df913 --- /dev/null +++ b/decorator.py @@ -0,0 +1,21 @@ +# coding=utf-8 + +# 定义一个装饰器 +def mydecorator(func): + def wrapper(*args,**kw): + print('hi,now is:') + return func(*args,**kw) + return wrapper + +# 使用装饰器 +@mydecorator +def now(): + print('2015-12-9') + +now() + +""" +D:\learn-python>python decorator.py +hi,now is: +2015年12月9日 +""" From 0d9395b14cfeefaab02fa0f9cb7f7201d9e9947d Mon Sep 17 00:00:00 2001 From: tuntun Date: Wed, 9 Dec 2015 11:00:48 +0800 Subject: [PATCH 66/73] =?UTF-8?q?Python=E8=A3=85=E9=A5=B0=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- decorator.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/decorator.py b/decorator.py index 43df913..4e2c991 100644 --- a/decorator.py +++ b/decorator.py @@ -18,4 +18,7 @@ def now(): D:\learn-python>python decorator.py hi,now is: 2015年12月9日 + +关于装饰器的具体概念,参见: +http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386819879946007bbf6ad052463ab18034f0254bf355000 """ From e862016d9a11c1c0185a36d23190de6e4ce6d856 Mon Sep 17 00:00:00 2001 From: tanteng Date: 2015年12月12日 01:12:46 +0800 Subject: [PATCH 67/73] =?UTF-8?q?property=E8=A3=85=E9=A5=B0=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- property.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 property.py diff --git a/property.py b/property.py new file mode 100644 index 0000000..3264d9a --- /dev/null +++ b/property.py @@ -0,0 +1,13 @@ +__author__ = 'tanteng' + +class Ver(object): + def __init__(self,version): + self.version = version + + @property + def version_no(self): + return self.version + + +ver = Ver('2.0') +print(ver.version_no) \ No newline at end of file From 0f78debf241f32c3d2af2f6ee8b0e1dcb28106b7 Mon Sep 17 00:00:00 2001 From: tanteng Date: 2015年12月13日 00:17:49 +0800 Subject: [PATCH 68/73] =?UTF-8?q?@property=E6=96=B9=E6=B3=95=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E8=A3=85=E9=A5=B0=E5=99=A8=20=F0=9F=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- property.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/property.py b/property.py index 3264d9a..5193c53 100644 --- a/property.py +++ b/property.py @@ -1,13 +1,19 @@ -__author__ = 'tanteng' - -class Ver(object): - def __init__(self,version): - self.version = version +# -*- coding: utf-8 -*- +# 属性装饰器 +class Student(object): @property - def version_no(self): - return self.version + def score(self): + return self._score + @score.setter + def score(self, value): + if not isinstance(value,int): + raise ValueError('必须输入数字!') + if value<0 or value>100: + raise ValueError('必须大于0小于100!') + self._score = value -ver = Ver('2.0') -print(ver.version_no) \ No newline at end of file +s = Student() +s.score = 101 +print(s.score) From deddb9f563bdbe6dc37fa79dd7f360c6eb547b85 Mon Sep 17 00:00:00 2001 From: "lake.lai" Date: 2016年2月17日 19:19:24 +0800 Subject: [PATCH 69/73] =?UTF-8?q?=E5=A2=9E=E5=8A=A0IDE=E5=92=8Cpython?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit IDE是PyCharm4.5,Python版本是3.4.3 --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 3cc3d9b..415e048 100644 --- a/README.md +++ b/README.md @@ -3,3 +3,5 @@ 学习Python3记录博客: http://www.tantengvip.com/category/develop/python3/ + +注:IDE是PyCharm4.5,Python版本是3.4.3 From 3e049ade4a89e1f85ad8c094936bcbf7f78b973a Mon Sep 17 00:00:00 2001 From: Tony Date: 2016年3月23日 13:04:00 +0800 Subject: [PATCH 70/73] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BD=91=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 415e048..4a0ff09 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,6 @@ 本人边学习Python3,边把一些小脚本(自己写的和网上找的)经过本机测试后然后同步到github上,供初学者下载研究,欢迎fork,也欢迎提交新的Python小脚本,特别是一些有趣好玩的小程序!有什么问题可以通过Issues讨论,喜欢的话点Star或分享给别人哦! 学习Python3记录博客: -http://www.tantengvip.com/category/develop/python3/ +http://blog.tanteng.me/category/develop/python3/ 注:IDE是PyCharm4.5,Python版本是3.4.3 From 13c3f88b7732eb173721b9be55734dcac5263c66 Mon Sep 17 00:00:00 2001 From: "lake.lai" Date: 2016年4月19日 20:26:03 +0800 Subject: [PATCH 71/73] =?UTF-8?q?=E4=B8=80=E8=88=AC=E6=83=85=E5=86=B5?= =?UTF-8?q?=E4=B8=8B=EF=BC=8C=E4=B8=80=E4=B8=AA=E5=87=BD=E6=95=B0=E7=BB=93?= =?UTF-8?q?=E6=9D=9F=E7=9A=84=E6=97=B6=E5=80=99=EF=BC=8C=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E4=B8=AAreturn=E5=9C=A8=E4=BB=A3=E7=A0=81=E4=B8=8A=E6=AF=94?= =?UTF-8?q?=E8=BE=83=E7=BE=8E=E8=A7=82=E3=80=82=E5=8F=AF=E4=BB=A5=E6=9B=B4?= =?UTF-8?q?=E6=B8=85=E6=A5=9A=E7=9A=84=E7=9F=A5=E9=81=93=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=9C=A8=E5=93=AA=E9=87=8C=E7=BB=93=E6=9D=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 虽然不加也可以,但是建议加上。这样可以更清楚的知道代码在哪里结束。如果您用过try...except...else...finily结构的话,会明白的 --- args_kwargs.py | 1 + 1 file changed, 1 insertion(+) diff --git a/args_kwargs.py b/args_kwargs.py index 67edeb8..4095ca7 100644 --- a/args_kwargs.py +++ b/args_kwargs.py @@ -7,6 +7,7 @@ def alias(*args, **kwargs): print('args=', args) print('kwargs=', kwargs) + return alias(3, 23, 3, 3,a='hello',b=3,c='C') From 8255a5e82f642c10da0bf5a746d2ca89bf13b563 Mon Sep 17 00:00:00 2001 From: Tony Date: 2016年4月22日 09:47:22 +0800 Subject: [PATCH 72/73] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4a0ff09..745e4be 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,5 @@ http://blog.tanteng.me/category/develop/python3/ 注:IDE是PyCharm4.5,Python版本是3.4.3 + +欢迎大家提交好的学习Python3的脚本,我会合并进来! From 6347e16a49e565705145b2f059db1340a6f21b7a Mon Sep 17 00:00:00 2001 From: "lake.lai" Date: 2016年4月25日 15:16:05 +0800 Subject: [PATCH 73/73] =?UTF-8?q?python=E4=B8=AD=E7=9A=84=E9=97=AD?= =?UTF-8?q?=E5=8C=85=20for=20python=203.x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UnboundLocalError: local variable 'count' referenced before assignment. 什么意思?就是说conut这个变量你没有定义就直接引用了,我不知道这是个什么东西,程序就崩溃了.于是,再python3里面,引入了一个关键字:nonlocal,这个关键字是干什么的?就是告诉python程序,我的这个count变量是再外部定义的,你去外面找吧.然后python就去外层函数找,然后就找到了count=0这个定义和赋值,程序就能正常执行了. --- closure.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/closure.py b/closure.py index 47dd67c..57fe5dd 100644 --- a/closure.py +++ b/closure.py @@ -1,8 +1,9 @@ def hellocounter (name): - count=[0] + count=0 #PYTHON 2.x 中,要写count=[0] def counter(): - count[0]+=1 - print('Hello,',name,',',count[0],' access!') + nonlocal count #PYTHON 2.x 中,此行和下一行要换成count[0]+=1 + count+=1 + print('Hello,',name,',',count,' access!')#PYTHON 2.x 中请自觉换成str(count[0]) return counter hello = hellocounter('ma6174') @@ -10,6 +11,18 @@ def counter(): hello() hello() +''' +执行结果 +>>> hello() +Hello, ma6174 , 1 access! +>>> hello() +Hello, ma6174 , 2 access! +>>> hello() +Hello, ma6174 , 3 access! +''' +##为什么PYTHON 2.x中不直接写count而用list?这是python2的一个bug,如果用count话,会报这样一个错误: +##UnboundLocalError: local variable 'count' referenced before assignment. + def make_adder(addend): def adder(augend): return augend + addend

AltStyle によって変換されたページ (->オリジナル) /