ãã³ã°ãšã³ããªãŒ
劻ãšç§ã¯ãã°ãã°ããã€ã³ãAãããã€ã³ãBã«ãã¡ã€ã«ã転éããå¿ èŠããããŸãããã€ã³ãAã¯èªå® ã®ã³ã³ãã¥ãŒã¿ãŒã®1ã€ã§ããããã€ã³ãBã¯ããªããç¥ã£ãŠãã誰ãã®ã³ã³ãã¥ãŒã¿ãŒããããšãã°è·å Žã®ã³ã³ãã¥ãŒã¿ãŒïŒãã©ãã·ã¥ãã©ã€ããçŠæ¢ãããŠããå ŽåããããŸãïŒ ïŒ ããã«ããã©ãã·ã¥ãã©ã€ãïŒã¢ããŒãã®ä»»æã®å Žæã«é 眮å¯èœïŒã«ç§»åããŠãã¡ã€ã«ãã³ããŒããã®ãéåžžã«é¢åã§ã:)äžè¬ã«ãç§ã¯ãããã®ç®çã§éåžžwebfile.ruãbox.netã®ãããªãµãŒãã¹ã䜿çšãã劻ã¯æãã«ãã¡ã€ã«ãéä¿¡ããŸãèªåïŒãŸãã¯ç¹æŽŸå¡ïŒã«ã¡ãŒã«ã§ã
ãããã®ãªãã·ã§ã³ã¯ãã¹ãŠãéåžžã«äžäŸ¿ã§ãã ãã¡ã€ã«ãããŒã ãµãŒããŒã«ä¿åããäœããã®äŸ¿å©ãªæ¹æ³ã§ããŠã³ããŒãããããšã決å®ããŸããã 次ã®ãªãã·ã§ã³ãæ€èšããŸããã
- FTPãäžããŸãã ããããç§ã¯FTPã奜ãã§ã¯ãªããã©ãã§ãããã䜿çšããæ©äŒãããããã§ã¯ãããŸãã
- WebDAVãµãŒããŒãäžããŸãã ããããããã¯ã第äžã«ãããŸãå®å šã§ã¯ãããŸããã第äºã«ãFTPãããWebDAVã®æ¹ãããã«åé¡ããããŸãã
- ãã©ãŠã¶ãããã¡ã€ã«ãããŠã³ããŒãããŸãã ãã®ãªãã·ã§ã³ã§ã¯ãåæ¢ããŸãã
ãã¡ãããApacheãŸãã¯Lighttpdãæ§æããŠãã£ã¬ã¯ããªã®ã³ã³ãã³ãã衚瀺ããæ¿èªãåºå®ããããšãã§ããŸããããã¡ã€ã«ãå€ãããŠã³ããŒããããŠããå Žåããã¡ã€ã«ãæ€çŽ¢ãããšãã«èŠèŠãããªãäžäŸ¿ã«ãªããŸãã ããã«ãç¹å®ã®ãã¡ã€ã«ãžã®ã¢ã¯ã»ã¹ãå¶éããããšã¯å°é£ã§ãïŒèŠããŠãããªãããã¡ã€ã«ãèªåã«ããŠã³ããŒãããã ãã§ãªããå人ã«è»¢éãããã£ãã®ã§ãïŒã
äžè¬ã«ãç§ã¯ãŸã ããã°ã©ããŒã§ãããå±±ããæ¥ã西æŽã¯ãµãã§ã¯ãªããšå€æããèªåã®ããŒãºã«åã£ãç°¡åãªãã¡ã€ã«ãã¹ãã£ã³ã°ãµãŒãã¹ãæžãããšãã§ããŸããã
ãã©ãããã©ãŒã ã®éžæ
ç§ã®äººçã§ã¯ãASP.NETã§å€ãã®ããšãæžããŠããŸããããããããããŠããŸãã ç§ã¯PHPãååã«ç¥ããªãã®ã§ãäœããã®çç±ã§PHPã奜ãã§ã¯ãããŸããã ä»ãç§ã¯Ruby on Railsã§æžããŠããŸããããã®ãããªã¿ã¹ã¯ã«ã¯ããæªããã§ãã ããããç§ã¯Rubyèšèªãæ¬åœã«å¥œããªã®ã§ãRubyã§ä»ã®ãã¬ãŒã ã¯ãŒã¯ãæ¡çšããããšã«ããŸãã-åæã«ãç§ã®èŠéãå°ãåºããæ©äŒããããŸãã æåã¯ç§ã®éžæã¯Rackã§ããããããããç§ã®èŠæ±ã«å¯ŸããŠçŠæ¬²çãããããšãããã«æããã«ãªããŸããã SinatraãšCampingãšãã2ã€ã®å°ããªãã¬ãŒã ã¯ãŒã¯ãããããç«ãŠãŠããŸãã çç±ãããããªãã®ã§ãã·ããã©ãéžã³ãŸããã
ã·ããã©ã«äŒã
å ¬åŒWebãµã€ãã§ã¯ãSinatraã¯ãã¬ãŒã ã¯ãŒã¯ã§ã¯ãªããWebã¢ããªã±ãŒã·ã§ã³ãäœæããããã®DSLã§ããããã®å®çŸ©ãåãå ¥ããçšæããããšè¿°ã¹ãŠããŸãã ãŸããã€ã³ã¹ããŒã«ããããšæããŸãã ãã以äžç°¡åãªããšã¯ãããŸããïŒ
sudo gem install sinatra
ããã§ã¯ãæãåçŽãªWebã¢ããªã±ãŒã·ã§ã³ãäœæããŸãããã
myapp.rbãªã©ã®ãã¡ã€ã«ãäœæãã次ã®ã³ãŒããèšè¿°ããŸãã
*ãã®ãœãŒã¹ã³ãŒãã¯ã ãœãŒã¹ã³ãŒããã€ã©ã€ã¿ãŒã§åŒ·èª¿è¡šç€ºãããŸããã
- ãrubygemsããå¿ èŠ
- ãã·ããã©ããå¿ èŠ
- ã/ãã ååŸ
- ãã·ããã©ããããã«ã¡ã¯ã
- çµãã
æã¡äžã
ruby myapp.rb
ãããŠããã©ãŠã¶ã§localhostã¢ãã¬ã¹ïŒ4567ãéããŸãã åºæ¥äžããïŒ ã·ããã©ããããã«ã¡ã¯ãèŠãŠãåãã§ããŸãã
äœãæžããŸãããïŒ æåã®2è¡ã§ã¯ãã·ããã©ãæ¥ç¶ããŸãã ãããŠããŸãã«DSLãå§ãŸããŸããã·ããã©ã®ã¢ããªã±ãŒã·ã§ã³ã¯ã次ã®åœ¢åŒã®ãããã¯ã®ã»ããã§æ§æãããŠããŸãã
METHOD PATTERN do
OUTPUT
end
METHODã¯HTTPã¡ãœããïŒgetãpostãputãdeleteïŒãPATTERNã¯URLãã¿ãŒã³ãOUTPUTã¯ãã©ãŠã¶ãŒã®å¿çãçæããã³ãŒãã§ãã ãã©ãŠã¶ãããªã¯ãšã¹ããåä¿¡ãããšãSinatraã¯HTTPã¡ãœãããšURLãã¿ãŒã³ã䜿çšããŠããªã¯ãšã¹ãã«å¯Ÿå¿ããæåã®é©åãªãããã¯ã決å®ãããã®ãããã¯ããã³ãŒããå®è¡ããåä¿¡ããæååãã¯ã©ã€ã¢ã³ãã«è¿ããŸãã
PATTERNã«ã€ããŠè©³ãã説æããŸãã ãã§ã«æžããããã«ãããã¯URLãã¿ãŒã³ã§ãããããã€ãã®æ¹æ³ã§èšå®ã§ããŸãã
- å®æ°ïŒäŸïŒ '/'ã '/ about'ã '/ hello / world'ïŒ
- ååä»ããã©ã¡ãŒã¿ãŒïŒããšãã°ãã/ïŒidããã/ post /ïŒid / showããã/ user /ïŒname /ïŒactionãïŒãæã€å®æ°-ãã®å ŽåãOUTPUTã§ã¯ãparamsããã·ã¥ãä»ããŠå¯Ÿå¿ãããã©ã¡ãŒã¿ãŒã®å€ã«ã¢ã¯ã»ã¹ã§ããŸãïŒparams [ïŒid]ãparams [ïŒname]ãparams [ïŒaction]ïŒ
- ã¯ã€ã«ãã«ãŒãã䜿çšããå®æ°ïŒããšãã°ãã/ select / * / from / *ããã/ load / *ãïŒ-ãã®ç¶æ³ã§ã¯ãparamsããã·ã¥ã«ã¯ãã¢ã¹ã¿ãªã¹ã¯ã«äžèŽãããã¹ãŠãå«ãparams [ïŒsplat]é åãå«ãŸããŸãïŒæåã®å Žåãããšãã°ãã/ select / id / from / usersããã©ã¡ãŒã¿ãžã®åŒã³åºã[ïŒsplat]ã«ã¯['id'ã 'users']ãå«ãŸãã2çªç®ã®å Žåã¯ã '/ load / all / my / money'ã«ã¢ã¯ã»ã¹ãããšparams [ïŒsplat]ã¯åãã€ããŸã['all / my / money']ïŒ
- æ£èŠè¡šçŸïŒããšãã°ã 'ïŒ r {/ hello /ïŒ[\ w] +ïŒ}'ïŒ-ããã§ã¯ãparams [ïŒcaptures]ã®é åãæ±ã£ãŠããŸãã
ããŸããŸãªãã¿ãŒã³ã®äœ¿çšäŸã次ã«ç€ºããŸãã
require 'rubygems'
require 'sinatra'
get '/' do
'Index page has you. Follow the white rabit.'
end
get '/give/me/the/:key' do
"I don't have any #{params[:key]}. Maybe you should try another url."
end
get '/buy/*/in/*' do
"#{params[:splat][1]} doesn't sell #{params[:splat][0].pluralize}"
end
get %r{^/ where / is /(habr)(a\1)?.ru$} do
"You're looking for <a href=\"http://habrahabr.ru\">habrahabr.ru</a>. It's not here."
end
* This source code was highlighted with Source Code Highlighter .
ã¢ããªã±ãŒã·ã§ã³ïŒruby myapp.ruïŒãèµ·åãã次ã®ã¢ãã¬ã¹ãè©ŠããŠãã ããã
- ããŒã«ã«ãã¹ãïŒ4567 /
- ããŒã«ã«ãã¹ãïŒ4567 / give / me / the / money
- ããŒã«ã«ãã¹ãïŒ4567 / buy / cars / in / Walmart
- localhostïŒ4567 /ããã§/ã¯/ habr.ru
- localhostïŒ4567 /ããã§/ã¯/ habrahabr.ru
ã¡ãã£ãšãããã¶ã€ã³
ããã§ããã¡ã€ã«ãã¹ãã£ã³ã°ã®èšç»ãéå§ããŸãã ç§ãæ倧éã«ãããããšïŒ
- ãã¡ã€ã«ãã¢ããããŒããã
- ãã¡ã€ã«ãããŠã³ããŒããã
- ããŠã³ããŒãã«ãŠã³ã¿ãŒïŒçµ±èšçšïŒ
- äžèŠãªãã¡ã€ã«ãåé€ãã
- ãã¹ã¯ãŒãä¿è·ãã¡ã€ã«
- ã¢ã¯ã»ã¹å¶é
- ååŸãå°é£ãªã¢ãã¬ã¹ïŒãªã³ã¯ã/ããŠã³ããŒã/ 4ã®ããã«èŠããå Žåã¯ã/ download / 3 / download / 5ãªã©ãããããšãæããã§ãããªã³ã¯ã/ download / 6a1941fb0cd47ã®ããã«èŠããå Žåã¯ãä»ã®URLãéžæããŸããã£ãšé£ããïŒ
- Webã€ã³ã¿ãŒãã§ãŒã¹ã ãã§ãªããSambaãä»ããŠãã¡ã€ã«ãã¢ããããŒãããæ©èœ
ãã®èšäºã®äžéšãšããŠã次ã®ç°¡æããŒãžã§ã³ãæ€èšããŸãã
- Webã€ã³ã¿ãŒãã§ãŒã¹çµç±ã§ã®ã¿ã¢ããããŒã/ããŠã³ããŒã
- Basic-HTTPèªèšŒã䜿çšããã»ãã¥ãªãã£
- ç°¡åãªããŠã³ããŒããªã³ã¯
ããã§ã¯ãURLæ§é ããå§ããŸãããã
GETã¡ãœããã«ããã¡ã€ã³ããŒãžïŒ '/'ïŒã«ã¯ããã¡ã€ã«ã®ãªã¹ãã衚瀺ãããŸãã 圌女ã¯POST'uã§upload'aãã¡ã€ã«ã®ã¡ã³ããã³ã¹ãè¡ã£ãŠããŸãã ããŒãž '/ïŒid'-ãã¡ã€ã«ããã©ãŠã¶ã«æäŸããŸãã ããŒãžã/ïŒid / deleteãã¯ãã¡ã€ã«ãåé€ããŸãã
ã·ããã©ã«æžããŠã¿ãŸãããã
get '/' do
# ... file index ...
end
post '/' do
# ... file upload ...
end
get '/:id' do
# ... send file to browser ...
end
get '/:id/delete' do
# ... delete file ...
end
次ã«ãåé¡ããããŸã-ãã¡ã€ã«ãã©ã®ããã«ä¿åããŸããïŒ
æåã«ã次ã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããããšèããŸããïŒã¢ããªã±ãŒã·ã§ã³ã®ãã£ã¬ã¯ããªã®/ãããªãã¯ãã©ã«ãã«ãã¡ã€ã«ãä¿åããŸãïŒSinatraã§ã¯ããã¿ãŒã³ãèšè¿°ããã«ã/ãããªãã¯ãã©ã«ãã®ãã¡ã€ã«ã«çŽæ¥ã¢ã¯ã»ã¹ã§ããŸããã€ãŸãããã£ã¬ã¯ããªã®photo.jpgãã¡ã€ã«ã§ãã myapp.rbãšåããã£ã¬ã¯ããªã«ããpublicã¯ã/ photo.jpgã§åžžã«å©çšå¯èœã§ãã ãã®å Žåãåã«ãls ./publicããåŒã³åºããŠçŽæ¥ãªã³ã¯çµç±ã§ãã¡ã€ã«ãæäŸããããšã«ããããã¡ã€ã«ã®ãªã¹ããååŸããŸãã åé¡ïŒçŽæ¥ãªã³ã¯ãããããé ãå¯èœæ§ãªãããã·ã¢ã®ãã¡ã€ã«åãšç¹æ®æåã®åé¡ãçµ±èšã®æ¬ åŠãªã©ã äžè¬ã«ããã®å Žåãå®éã«ã¯Apacheãã£ã¬ã¯ããªãªã¹ãã®é¡äŒŒç©ããããŸãããããã¯æãã§ãããã®ã§ã¯ãããŸããã
ãããã£ãŠãçµè«ïŒããŒã¿ããŒã¹ãå¿ èŠã§ã
ãã®ãããªåçŽãªã·ã¹ãã ã«sqliteãããè€éãªãã®ã䜿çšããã®ã¯æãã§ãã 圌女ãé£ããŠè¡ããŸãã rubyã®ããŒã¿ããŒã¹ãæäœããåé¡ãæ®ã£ãŠããŸãã ãã¡ãããActiveRecordãšãã®ORMã䜿çšããããšãã§ããŸãããããããããªãé£ãããã®ã§ãããšå€æããŸããã ããã§ãã·ããã©ã ãã§ãªãDataMapperãå匷ããããšã«ããŸãã ã
DataMapperã¯ãRubyãªããžã§ã¯ããšåæ§ã«ããŒã¿ããŒã¹ã¬ã³ãŒããæäœã§ããå°ããªè»œéãã¬ãŒã ã¯ãŒã¯ã§ãã
DataMapperã®ã€ã³ã¹ããŒã«ãšæ§æ
ã€ã³ã¹ããŒã«ã¯ç°¡åã§ãïŒ
sudo gem install data_mapper
ã¢ããªã±ãŒã·ã§ã³ã«æ¥ç¶ãããã·ããã©ããå¿ èŠã«å¿ããŠè¿œå ããŸã
require 'dm-core' #
require 'dm-validations' # (not_null )
require 'dm-timestamps' #
äœæ¥ããããŒã¿ããŒã¹ã®ååãæå®ããŸãã
DataMapper.setup(:default, "sqlite3://#{Dir.pwd}/mydatabase.sqlite3")
次ã«ãããŒã¿ãæ ŒçŽããããŒãã«ã®æ§é ãèšè¿°ããå¿ èŠããããŸãã
class StoredFile
include DataMapper::Resource
property :id, Integer, :serial => true
property :filename, String, :nullable => false
property :created_at, DateTime
default_scope(:default).update(:order => [:created_at.desc])
end
ããã§è¡ã£ãããšãæ€èšããŠãã ããã
StoredFileã¯ã©ã¹-ã€ã³ã¹ã¿ã³ã¹ããã¡ã€ã«ãè¡šãã¯ã©ã¹ã
DataMapper ::ãªãœãŒã¹ãå«ãã-StoredFileã¯ã©ã¹ãDataMapperãªãœãŒã¹ã§ããããšã宣èšããŸãïŒã€ãŸããããŒã¿ããŒã¹å ã®ã¬ã³ãŒããèšè¿°ããŸãïŒã ããã¯ãstored_filesããŒãã«ãããŒã¿ããŒã¹ã«äœæããããããæäœããã¡ãœãããååŸããããšãæå³ããŸãã ActiveRecordãšã¯ç°ãªããã¯ã©ã¹ããã¯ç¶æ¿ãããã¢ãžã¥ãŒã«ãæ¥ç¶ããããšã«æ³šæããŠãã ãããããã¯ãOOPã®èŠ³ç¹ããã¯ããã«äŸ¿å©ã§ãã
次ã«ããã¡ã€ã«ã®3ã€ã®ããããã£ïŒ=ããŒã¿ããŒã¹å ã®åïŒã«ã€ããŠèª¬æããŸã-idããã¡ã€ã«åãäœææ¥ã ïŒserial => trueã¯åãauto_incrementïŒå€ãèªåçã«ååŸããïŒã§ããããšãæå³ããnullable => falseã¯æããã«ãã¡ã€ã«åãNULLã§ãã£ãŠã¯ãªãããcreated_atåã¯ã¬ã³ãŒããäœæãããæéã§èªåçã«æºããããŸãïŒãã®ããã¿ã€ã ã¹ã¿ã³ãïŒã
æåŸã«ãdefault_scopeïŒïŒdefaultïŒ.updateïŒïŒorder => [ïŒcreated_at.desc]ïŒã¯ãããã©ã«ããšã³ããªã¯äœææéã®éé ã«äžŠã¹ãå¿ èŠãããããšã瀺ããŠããŸãã
StoredFileã®èª¬æã®åŸã次ã®ããã«èšè¿°ããŸã
DataMapper.auto_upgrade!
ãã®è¡ã¯ãStoredFileã¯ã©ã¹ãå€æŽããããšãDataMapperã«ããŒã¿ããŒã¹æ§é ã匷å¶çã«æŽæ°ãããŸãã
ããŒã¿ãæ±ã
ãããã£ãŠã次ã®ããã«ãã¡ã€ã«ãæäœããŸããã¢ããããŒãäžã«ãID.uploadãšããååã§ãã¡ã€ã«ããã¡ã€ã«ãã©ã«ããŒïŒIDã¯ããŒã¿ããŒã¹å ã®ãã¡ã€ã«IDïŒã«ä¿åããããŒã¿ããŒã¹ã«å ã®ãã¡ã€ã«åãæžã蟌ã¿ãŸãã ããŠã³ããŒããããšãããã©ãŠã¶ã«ãã¡ã€ã«ãäžããããŒã¿ããŒã¹ãããã¡ã€ã«åã®å€ãååãšããŠè»¢éããŸãã ãããã£ãŠããã¡ã€ã«ã·ã¹ãã ã«ã¯242.uploadã¿ã€ãã®ãã¡ã€ã«ãããããã©ãŠã¶ã¯ãRollback Report 2008.docxããšããååã§ãããããŠã³ããŒãããŸãã
åŸ ã£ãŠããã³ãŒãã§ãããã¯ãåãããšãã§ãã
#
get '/' do
@files = StoredFile.all #
erb :list # , .
end
# upload
post '/' do
tempfile = params['file'][:tempfile] # POST
@file = StoredFile.new :filename => params['file'][:filename] # StoredFile
@file.save! #
File.copy(tempfile.path, "./files/#{@file.id}.upload") #
redirect '/' #
end
# download
get '/:id' do
@file = StoredFile.get(params[:id]) #
send_file "./files/#{@file.id}.upload", :filename => @file.filename, :type => 'Application/octet-stream' #
redirect '/' #
end
#
get '/:id/delete' do
StoredFile.get(params[:id]).destroy #
File.delete("./files/#{params[:id]}.upload") #
redirect '/' #
end
ãerbïŒlistãè¡ãé€ããŠãã³ã¡ã³ããšäœãèµ·ãã£ãŠããããããªãæçœã§ããããšãé¡ã£ãŠããŸãã ãŠãŒã¶ãŒã«æ å ±ã衚瀺ããã«ã¢ããããŒã/ããŠã³ããŒãããã³åé€ãè¡ãããããšã«æ³šæããŠãã ããïŒæåŸã«ãŠãŒã¶ãŒã¯ã¡ã€ã³ããŒãžã«ãªãã€ã¬ã¯ãããŸãïŒã ã¡ã€ã³ã®ãã®ã§ã¯ããã¡ã€ã«ã®ãªã¹ãã衚瀺ããããšæããŸãã ãã¡ãããããã¯çããã³ãŒãå ã®è¡ãšããŠçŽæ¥åœ¢æããããšã§å¯èœã§ããã幞ããªããšã«ãsinatraã§ã¯è€æ°ã®ãã³ãã¬ãŒããšã³ãžã³ã䜿çšããŠHTMLããŒãžãçæã§ããŸãã ãµããŒããããŠãããã³ãã¬ãŒããšã³ãžã³ã«ã¯ã HAML ã Erb ã Builder ã SassããããŸãã Sinatraèªäœã¯ãããã©ã«ãã§./viewsãã©ã«ããŒã§ãã³ãã¬ãŒããæ¢ããŠããŸãã ããã§ã¯ãããªãåå§çãªErbãã³ãã¬ãŒããäœæããlist.erbãšããååãä»ããŠãviewsãã©ã«ããŒã«é 眮ããŸããã ããã§ãerbïŒlistã§åŒã³åºãããšãã§ããŸãã ããšãã°ãlist.hamlãäœæããhamlïŒlistã³ãã³ãã§ã¬ã³ããªã³ã°ããããšãã§ããŸãã
ãã³ãã¬ãŒãã³ãŒãã¯æ¬¡ã®ãšããã§ãã
<h2> :</h2>
<table>
<tr>
<th></th>
<th></th>
<th></th>
</tr>
<% @files.each do |file| %>
<tr>
<td><a href="/<%= file.id %>" title="<%=file.filename%>"><%= file.filename %></a></td>
<td><%= file.created_at.strftime("%d %b")%></td>
<td><a href="/<%= file.id %>/delete" title=" "></a></td>
</tr>
<% end %>
</table>
<h3></h3>
<form name="new_file" id="new_file" method="POST" enctype="multipart/form-data">
<input type="file" name="file"/><br />
<input type="submit" value=""/>
</form>
æåŸã«ïŒãã¹ã¯ãŒãä¿è·
ç§ãçŽæããããã«ãåçŽãªHTTPèªèšŒã®ã¿ãè¡ããŸãã ããã¯æ¬¡ã®ããã«è¡ãããŸãã
use Rack::Auth::Basic do |username, password|
username == 'admin' && password == 'secret'
end
䜿çšã©ãã¯é::èªèšŒ::åºæ¬æäœ|ãŠãŒã¶ãŒåããã¹ã¯ãŒã| endã«ã¯ãã¢ã¯ã»ã¹ãèš±å¯ããããštrueãè¿ãããã以å€ã®å Žåã¯falseãè¿ãä»»æã®ã³ãŒããå«ãŸããå ŽåããããŸãã ãã°ã€ã³ãšãã¹ã¯ãŒããããŒãã³ãŒãã£ã³ã°ããŸããããããŒã¿ããŒã¹ããååŸãããªã©ã®åŠšãã«ã¯ãªããŸããã
ãããã«
å®å šãªã¢ããªã±ãŒã·ã§ã³ã³ãŒãã¯ãã¡ã-http://pastie.org/368694
èšäºãèå³æ·±ãããšãå€æããå Žåã¯ãããŒã ãã¡ã€ã«ãã¹ãã£ã³ã°ãµãŒãã¹ã®ç·šæã«é¢ãã話ãç¶ããŸãã
ãæž èŽããããšãããããŸããïŒ