$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Async programming is all about programming sync...
Search
seki at druby.org
June 01, 2013
Programming
6
890
Async programming is all about programming synchronously.
RubyKaigi 2013 - 10:00 room A
rev.7
seki at druby.org
June 01, 2013
Tweet
Share
More Decks by seki at druby.org
See All by seki at druby.org
RWC2025 Ninja-testing with smart playlist
m_seki
4
730
XP, Testing and ninja testing ZOZ5
m_seki
3
1.8k
XP, Testing and ninja testing
m_seki
3
860
RWC 2024 DICOM & ISO/IEC 2022
m_seki
0
520
ERB, ancient and future
m_seki
3
960
ERB Hacks
m_seki
1
1.6k
わりこまれるはなし
m_seki
0
980
ぼくのかんがえたさいきょうのけいやくによるプログラミング
m_seki
2
1.4k
Learn Ractor
m_seki
1
2.8k
Other Decks in Programming
See All in Programming
GISエンジニアから見たLINKSデータ
nokonoko1203
0
170
S3 VectorsとStrands Agentsを利用したAgentic RAGシステムの構築
tosuri13
6
350
愛される翻訳の秘訣
kishikawakatsumi
3
330
C-Shared Buildで突破するAI Agent バックテストの壁
po3rin
0
400
宅宅自以為的浪漫:跟 AI 一起為自己辦的研討會寫一個售票系統
eddie
0
510
re:Invent 2025 のイケてるサービスを紹介する
maroon1st
0
130
ローカルLLMを⽤いてコード補完を⾏う VSCode拡張機能を作ってみた
nearme_tech
PRO
0
110
実はマルチモーダルだった。ブラウザの組み込みAI🧠でWebの未来を感じてみよう #jsfes #gemini
n0bisuke2
3
1.2k
脳の「省エネモード」をデバッグする ~System 1(直感)と System 2(論理)の切り替え~
panda728
PRO
0
100
LLM Çağında Backend Olmak: 10 Milyon Prompt'u Milisaniyede Sorgulamak
selcukusta
0
130
バックエンドエンジニアによる Amebaブログ K8s 基盤への CronJobの導入・運用経験
sunabig
0
160
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
190
Featured
See All Featured
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
0
290
The Pragmatic Product Professional
lauravandoore
37
7.1k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
86
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.3k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
0
66
Faster Mobile Websites
deanohume
310
31k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.2k
Technical Leadership for Architectural Decision Making
baasie
0
180
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.1k
The Language of Interfaces
destraynor
162
25k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
47
33k
Transcript
Async Asynchronously. ඇಉظͬͯಉظΛॻ͘͜ͱ͡ΌΜɻ
[email protected]
programming is all about programming
Important First ϑολʔʹεϙϯαʔ͕ग़ͯΔ͔ΒݟͯͶ!!
About me
WEB+DB PRESS Vol.73 ʮͨͷ͍͠։ൃ࣮گதܧʯͷϨϏϡʔ͋Γ͕ͱ͏͍͟͝·ͨ͠ (ஶऀҰಉ) code ERB dRuby Rinda Drip
͑Ή͞ΜύΠϯΞϝ1kg͋Γ͕ͱ͏ talk RubyKaigi 2006, 7, 8, 9, 10, 11, 13
RubyConf 2012
ͺ͖ͬΎΔʙΜ!! @tsurumau and write dRuby ʹΑΔ ؔকढ़ஶ ࢄ ɾ Web
ϓϩάϥϛϯά
Answering the RubyConf 2012
ΦʔϜࣾץʰϓϩάϥϛϯάClojure ୈೋ൛ʱࢴͱిࢠॻ੶͋Θͤͯධൃചதʂ @koichiro RubyConf 2012 "dRubyࣦഊ࡞ͩ" dRubyಉظݺͼग़͔ͩ͠Βࣦഊͳ ʁʁʁ ݴ͍༁͠ͳ͍ͱʂ
RubyKaigi2013ָ͠ΈͰ͢ɻ@iwadon ࠓ͓͢Δ͜ͱ ඇಉظʹ͓͜Δ͍ΖΜͳ͜ͱ͍͍ͭͩͨ ͍ಉ͡Α͏ʹղ͘ΜͩΑͬͯ
ΫϦΞίʔυRubyձٞ2013ͷγϧόʔεϙϯαʔͰ͢ ਐΊํ ੈք͍͍ͩͨඇಉظͱಉظͰͰ͖͍ͯΔ ඇಉظ෩ͳঢ়گΛͨ͘͞Μࣔ͠·͢ ͍ͭಉ͡Α͏ʹղ༷͘ࢠΛݟͯͶ
ా͞Μָͬͦ͘͢͝͠͏ʹΛฉ͍ͯ͘Ε·͢ɻൃදͷ͋ͱʹ͔ͭ·͑ͯͯ͠ΈͯͶ ࠓ͓͢Δ͜ͱ 2 Μ͍͘͏ͳ dRubyඇಉظݺͼग़͞Ε RubyͰͰ͖ΔόοΫάϥϯυॲཧ વͰ͖Δͷ
Wait a moment ✓ +3:00ɹ ✓ ࠓͷAgenda ✓ એ͗͢͠ͳ͍ ✓
࣍ඇಉظݺͼग़͞Ε
͙Μ·Ͱ·ͬͯΔ ඇಉظͬͯͳʹ Α͘Θ͔Μͳ͍͚Ͳಉظత͡Όͳ͍ͷʁ ࠓࣗͷ߹ͱؔͳ͘ى͜Δͳʹ͔ɺ ͱ͠·͢
͔͚͠ͳ͍ͰΒ͑·͔͢ @track8 ඇಉظݺͼग़͞Εܥ ࣗͷ߹ʹؔͳ͘ݺΕΔ UNIX signal dRuby RMI
9/21 ͱͪ͗Rubyձٞ05ΑΖ͓͘͠Ͷ͕͍͠·͢ @mame UNIX signal ͳʹΛ͍ͯͯ͠ɺಥવొ͞Ε͕ͨؔݺ Εͯɺ͖ͬ͞ͷͱ͜Ζ͔Β࠶։͢Δ ओॲཧγάφϧ͕ൃੜͨ͜͠ͱΛΒͳ͍
͕Μͬ౦! @MUNAKATA_Akiko UNIX signal ͳʹΛ͍ͯͯ͠ɺಥવొ͞Ε͕ͨؔݺ Εͯɺ͖ͬ͞ͷͱ͜Ζ͔Β࠶։͢Δ int foo() { while(1)
{ bar(); baz(); } } int signal_hanlder(...) { }
Lang-8૬ޓఴܕSNSͰɺ190ϲࠃ͔Β80छྨҎ্ͷݴޠͰར༻͞Εͯ·͢ɻ@sasata299 dRuby RMI dRubyඇಉظݺͼग़͞ΕͰ͋Δ RMI͝ͱʹ৽͍͠εϨου͕Ͱ͖ͯॲཧ͢Δ ଞͷεϨουRMI͕͋ͬͨ͜ͱΛΒͳ͍
Δؾφϯγʔ @vestige_ dRuby RMI RMI͝ͱʹ৽͍͠εϨου͕Ͱ͖ͯॲཧ͢Δ ଞͷεϨουRMI͕͋ͬͨ͜ͱΛΒͳ͍ DRb.start_service(...) DRb.thread.join class Service
def foo ... end end
Yokohama.rbຖ݄ୈ2༵։࠵Ͱ͢ʂ ඇಉظݺͼग़͞Εͷಛ ·͞ʹඇಉظ ࣗͷ߹ʹؔͳ͘ݺͼग़͞ΕΔ ͦͯ͠ݺͼग़͞Εͨ͜ͱΛΒͳ͍ ݺΕͨΒͳʹ͔͢Δɺ͕ॻ͖ʹ͍͘
֏͞ΜڃʹΓͳ͍ʰͳΔ΄ͲUNIXϓϩηεʱୡਓग़൛ձ͔ΒେධൃചதͰ͢!! @kakutani ݺͼग़͞Εͨ͜ͱΛ͑Δ ͑Δνϟϯε͕͋Δͷݺͼग़͞Εͨଆ Ͳ͏ͬͯ͑Δʁ Global Variables Synchronization Mechanisms
ελʔτΞοϓRuby Kindle൛͡Ί·ͨ͠ @igaiga555 Global Variables ඇಉظʹݺͼग़͞Εͨ͜ͱΛϝϞ͢Δ ͰϝϞͨ͜͠ͱΛͯͳ͍ ϙʔϦϯά busy loopʹͳΔ͔...
EINTRͱ͏·͘Έ߹ΘͤΔͷख
hikari no cafe Ұॹʹߦ͜͏! ฏʹ༡ͼʹ͖ͯ!! > @ay Synchronization Mechanisms εϨουؒͷ߹ͤɺݴ
͕݅ἧ͏·ͰٳΉ εϨου͕ผεϨουʹใΛ͑Δ εϨου͕ผεϨου͔ΒͷใΛड͚Δ
@nagachika͞Μͷruby-trunk-changesɺ͍ͭݟͯ·͢! Latch, Semaphore, Monitor ͕݅ἧ͏·Ͱͭ ͋ͷඇಉظݺͼग़͕͋ͬͨ͠Αʂͱ͔Ͷ
6/5ͷAWS Summit Tokyo 2013Ͱ͠ΌΓ·͢ɻςΫχΧϧτϥοΫʹ͋ͿΕͨํͥͻɻ @tsuboi Queue ͯΔ্ʹϞϊΛͤΔ FIFO ͍͑ͨΦϒδΣΫτΛpush, pop
ۭͷͱ͖ΦϒδΣΫτ͕ಧ͘·ͰٳΉ
ϑΣΠτɾςελϩοα http://www.fatechan.com Queue QueueΛհʹೋͭεϨου͕ಉظ͢Δ while req = $q.pop do_it(req) end
ϑΣΠτɾςελϩοα http://www.fatechan.com Queue QueueΛհʹೋͭεϨου͕ಉظ͢Δ while req = $q.pop do_it(req) end
class Service def foo(bar) $q.push(bar) end end
ϑΣΠτɾςελϩοα http://www.fatechan.com Queue QueueΛհʹೋͭεϨου͕ಉظ͢Δ while req = $q.pop do_it(req) end
class Service def foo(bar) $q.push(bar) end end
ϑΣΠτɾςελϩοα http://www.fatechan.com Queue QueueΛհʹೋͭεϨου͕ಉظ͢Δ while req = $q.pop do_it(req) end
class Service def foo(bar) $q.push(bar) end end sync!!!
ϑΣΠτɾςελϩοα http://www.fatechan.com Queue QueueΛհʹೋͭεϨου͕ಉظ͢Δ while req = $q.pop do_it(req) end
class Service def foo(bar) $q.push(bar) end end sync!!!
RubyKaigi 2013ແࣄϦϦʔε͞ΕͯͨΒiRubyKaigi'13ͰνΣοΫ!! @gutskun socket ... ಉظϝΧχζϜͱݺΕͯͳ͍͚Ͳ... FIFO σʔλͷ౸ணΛͯΔ σʔλΛͤΔ
@hemge ʹձͬͨͷRubyձٞ2007Ͱͨ͠Ͷʔɻࠓͦ͜দߐͷ՛ࢠ͞ΜҊ͍ͯͩ͘͠͞ɻ Rinda::TupleSpace ॱংʹ͖·Γ͕ͳ͍ λϓϧͷऔΓग़͠ʹΑΔ߹ͤͱใަ ύλʔϯϚον ActorϞσϧͷϝοηʔδͷج൫ʹ߹͏Α Τʔςϧ
ΤϯδχΞืूதͰ͢ bit.ly/cookpad_jobs @mrkn Rinda::TupleSpace TupleSpaceΛத৺ʹෳͷεϨου͕ಉظ ඇಉظݺͼग़͞Εؔͳ͍͚ͲӈଆͶ req = $ts.take([:req, ..])
value = do_it(req) $ts.write([:ans, value])
ΤϯδχΞืूதͰ͢ bit.ly/cookpad_jobs @mrkn Rinda::TupleSpace TupleSpaceΛத৺ʹෳͷεϨου͕ಉظ ඇಉظݺͼग़͞Εؔͳ͍͚ͲӈଆͶ req = $ts.take([:req, ..])
value = do_it(req) $ts.write([:ans, value]) $ts.write([:req, ..]) $ts.take([:ans, nil])
ΤϯδχΞืूதͰ͢ bit.ly/cookpad_jobs @mrkn Rinda::TupleSpace TupleSpaceΛத৺ʹෳͷεϨου͕ಉظ ඇಉظݺͼग़͞Εؔͳ͍͚ͲӈଆͶ req = $ts.take([:req, ..])
value = do_it(req) $ts.write([:ans, value]) $ts.write([:req, ..]) $ts.take([:ans, nil]) sync!!!
ΤϯδχΞืूதͰ͢ bit.ly/cookpad_jobs @mrkn Rinda::TupleSpace TupleSpaceΛத৺ʹෳͷεϨου͕ಉظ ඇಉظݺͼग़͞Εؔͳ͍͚ͲӈଆͶ req = $ts.take([:req, ..])
value = do_it(req) $ts.write([:ans, value]) $ts.write([:req, ..]) $ts.take([:ans, nil]) sync!!!
ΤϯδχΞืूதͰ͢ bit.ly/cookpad_jobs @mrkn Rinda::TupleSpace TupleSpaceΛத৺ʹෳͷεϨου͕ಉظ ඇಉظݺͼग़͞Εؔͳ͍͚ͲӈଆͶ req = $ts.take([:req, ..])
value = do_it(req) $ts.write([:ans, value]) $ts.write([:req, ..]) $ts.take([:ans, nil]) sync!!! sync!!!
ΤϯδχΞืूதͰ͢ bit.ly/cookpad_jobs @mrkn Rinda::TupleSpace TupleSpaceΛத৺ʹෳͷεϨου͕ಉظ ඇಉظݺͼग़͞Εؔͳ͍͚ͲӈଆͶ req = $ts.take([:req, ..])
value = do_it(req) $ts.write([:ans, value]) $ts.write([:req, ..]) $ts.take([:ans, nil]) sync!!! sync!!!
Ұॹʹ͋ͷөըΛݟ͍ͨͰ͢ɻ > @nari3 ·ͱΊ ඇಉظʹݺͼग़͞Εͨ݁ՌΛΔͷ໘ ಉظϝΧχζϜΛ͏ͱ͑Δ͜ͱ͕Ͱ͖Δ
Wait a moment ✓ +13:00ɹ ✓ dRubyඇಉظݺͼग़͞Ε ✓ ݺͼग़͞Εͨ݁ՌΛผεϨουʹ͑Δಉظ ✓
࣍ଈ࣌෮ؼ
֏͞ΜͷಠಛͷงғؾಌΕ·͢! ֻ͍͔͚ͭ͠ʹ͍͖·͢! - @elim όοΫάϥϯυॲཧ ଈ࣌෮ؼ ॲཧΛड͚͚ͨΒ੍ޚ͕Δ ड͚͚ॲཧͩͱࢥ͏ͱྃͯ͠Δ
The dRuby Book ຊޠ൛δϡϯΫಊͰۚͰങ͑Δ ͜Εඇಉظʁ ͏ʔΜ ࣗͷ߹ͱؔͳ͘ॲཧΛ࣮ߦ ࣗͷ߹ͱؔͳྃ͘
9/21 ಹਢԘݪ ͱͪ͗Rubyձٞ05 Eiffelຊ༁ऀͷञ͞Μ͕͘ΔΑʂ ݁Ռ͕ؾʹͳΔ ଈ࣌෮ؼͷଟ͘ͷ߹ Γͬͺͳ͠Ͱͳ͘ ݁Ռʹڵຯ͕͋Δ ݁ՌΛͭAPI͕༻ҙ͞ΕͯΔ
The dRuby Book Japanese Edition : Best as GIFT FROM
JAPAN جຊతͳύλʔϯ ॲཧΛґཔ → νέοτΒ͏! ฒߦͯࣗ͠ͷࣄΛ͢Δ νέοτͬͯґཔͷ݁ՌΛͭ←ಉظ͢Δ
` service جຊతͳύλʔϯ d request join ticket value application background
task
dRubyHiroba - dRuby hands-on 6/2 10:30- (RubyHiroba) νέοτͷྫ ιέοτͦͷͷ͕νέοτ ґཔΛॻ͖ɺ݁ՌΛಡΉ
popenͳͲࣅͨΑ͏ͳͷ ticket = TCPClient.new(...) ticket.write('your task') my_important_task ticket.read
2013-9-21 ͱͪ͗Rubyձٞ05 @ ಹਢԘݪࢢ౦ಹਢެຽؗ νέοτͷྫ εϨουνέοτͷΑ͏ʹ͑Δ joinͰ߹ͤͱͷऔಘ͕ҰʹͰ͖ΔΑ ticket = Thread.new
{ your_task } my_important_task ticket.join
The dRuby Book νέοτͷྫ λϓϧεϖʔεͳΒλϓϧ ticket = Object.new tuple_space.write([:your_task, ticket])
my_important_task tuple_space.take([:your_task_done, ticket])
ʮαϯϥΠζग़ӢͰߦ͘ RubyWorld Conference 2013 ʯಉߦऀืूதʂ @yancya ͕ࣗ͠αʔόͩͬͨΒ ॲཧΛґཔ ฒߦͯࣗ͠ͷࣄ͢Δ νέοτͬͯґཔͷ݁ՌΛͭ
ʮαϯϥΠζग़ӢͰߦ͘ RubyWorld Conference 2013 ʯಉߦऀืूதʂ @yancya ͕ࣗ͠αʔόͩͬͨΒ ॲཧΛґཔ ฒߦͯࣗ͠ͷࣄΛ͢Δ νέοτͬͯґཔͷ݁ՌΛͭ
ґཔΛͭ
ʮαϯϥΠζग़ӢͰߦ͘ RubyWorld Conference 2013 ʯಉߦऀืूதʂ @yancya ͕ࣗ͠αʔόͩͬͨΒ ॲཧΛґཔ ฒߦͯࣗ͠ͷࣄΛ͢Δ νέοτͬͯґཔͷ݁ՌΛͭ
ґཔΛͭ ೋछྨ͍ͪͨ
dRubyHiroba - dRuby hands-on 6/2 10:30- (RubyHiroba) ͪํ͕·ͪ·ͪͩͱࠔΔ or Ͱͭͳ͛ͳ͍
࠷ॳͷ߹ͤͰࢭ·ͬͪΌ͏ ͍Ζ͍ΖҰʹͯͳ͍ͱμϝ queue.pop or soc.read or rinda.take or ...
dRubyHiroba - dRuby hands-on 6/2 10:30- (RubyHiroba) ҰൠԽͨ͠αʔόͷϧʔϓ ͍Ζ͍Ζ·ͱΊͯͭ ৽͍͠ґཔͳΒ...
ྃ௨ͳΒ...
dRubyHiroba - dRuby hands-on 6/2 10:30- (RubyHiroba) ۉ࣭ʹͯ͠·ͱΊͯͭ ͲΕಉ͡APIͰͯΔΑ͏ʹۉ࣭ʹ͢Δ select()શͯΛϑΝΠϧʹͯ͠Δ
TupleSpacetupleʹਖ਼نԽ
dRubyHiroba - dRuby hands-on 6/2 10:30- (RubyHiroba) ·ͱΊ ଈ࣌෮ؼ͢Δͱ͖ɺ͍͍ͨͯ݁Ռ͕ؾʹͳΔ ݁ՌΛͭͷಉظ
ඇಉظݺͼग़͞Εͱಉ͡Α͏ͳײ͡
Wait a moment ✓ +22:00ɹ ✓ ଈ࣌෮ؼͰಉظ͕ϛι ✓ ͚࣍ࣗͩݻ·Βͳ͍ྗͷ͜ͱ
Ruby's GC slide is here! : slidesha.re/19sbBwA (w/o animation, free
ver) and gumroad.com/l/xWCR (w/ animation, premium ver) selectଐϝΠϯϧʔϓ select(ͨ͘͞Μͷιέοτ) ϒϩοΫ͠ͳ͍ιέοτͷಡΈॻ͖ ͳʹ͔ॲཧΛ͢Δ
͵Ruby൪ɺ͍͓ͭੈʹͳ͓ͬͯΓ·͢ʂTIMEXɺ͔Θ͍͍Ͱ͋Γ·͢ʂ ίʔϧόοΫͷύλʔϯ select(ͨ͘͞Μͷιέοτ) ϒϩοΫ͠ͳ͍ιέοτͷಡΈॻ͖ ͳʹ͔ॲཧΛ͢Δ ϑϨʔϜϫʔΫ͕Ӆ͢ ͜ͷลίʔϧόοΫ
The dRuby Book ίʔϧόοΫͷ᠘ select(ͨ͘͞Μͷιέοτ) ϒϩοΫ͠ͳ͍ιέοτͷಡΈॻ͖ ͳʹ͔ॲཧΛ͢Δ ϑϨʔϜϫʔΫશମ͕͘ ͳΔ ͕͍͜͜ͱ
The dRuby Book ίʔϧόοΫͷ᠘ select(ͨ͘͞Μͷιέοτ) ϒϩοΫ͠ͳ͍ιέοτͷಡΈॻ͖ ͳʹ͔ॲཧΛ͢Δ ૬ޓʹݺͼ߹͍ͬͯΔͱγεςϜશ ମ͕ݻ·Δ... ͞Βʹผαʔόʹґཔͨ͘͠
ͯ͜͜Ͱ݁ՌΛͭͱ
The dRuby Book ίʔϧόοΫͷ᠘ select(ͨ͘͞Μͷιέοτ) ϒϩοΫ͠ͳ͍ιέοτͷಡΈॻ͖ ͳʹ͔ॲཧΛ͢Δ ͠ΐ͏͕ͳ͍͔Β݁Ռͪselect ϑϨʔϜϫʔΫͷཧ֎Ͱͭ͜ͱʹ
http://www.amazon.co.jp/registry/wishlist/1R43BBPSPUEEE/ γϯάϧεϨου ॲཧ͕Ͳ͜·ͰਐΜ͔ͩίϯςΩετΛ࡞ͬ ͯɺॲཧதͰϝΠϯϧʔϓʹΔ ࣗવͳίʔυʹ͢Δͷۤ࿑͢Δ Fiberͱ͔ܧଓͱ͔...
2013-9-21ͱͪ͗Rubyձٞ05 @ ಹਢԘݪࢢ౦ಹਢެຽؗ ͋Εʁ ιέοτͷͪͱFiberͳΒThreadͱେࠩͳ ͍ͷͰʁ
2013-9-21ͱͪ͗Rubyձٞ05 @ ಹਢԘݪࢢ౦ಹਢެຽؗ ϚϧνεϨουͰղ͘ acceptͨ͠ΒThreadੜͯ͠readɺॲཧɺ write͢Δ ίϯςΩετͷอଘ෮ݩ͕ෆཁ ࣗવͳίʔυ͕ॻ͚Δ ͍ॲཧͰ͖Δ͠ɺผαʔϏεʹྃ ෮ؼͰґཔͯ͠ྑ͍
2013-9-21ͱͪ͗Rubyձٞ05 @ ಹਢԘݪࢢ౦ಹਢެຽؗ dRubyͷ࣮ͦͷͷ େࣄͳΦνͰ͢Α!! Rubyʹ͓͚Διέοταʔόͷయܕ shttpsrv (ݪ͞ΜͷHTTPαʔόʔ) ඇৗʹૉ dRubyͦͷΑ͏ʹ࡞ΒΕ͍ͯΔ
dRubyHiroba - dRuby hands-on 6/2 10:30- (RubyHiroba) ·ͱΊ ඇಉظʹ͓͜Δ͍ΖΜͳ͜ͱ͍͍ͭͩͨ ͍ಉ͡Α͏ʹղ͘ΜͩΑͬͯͰͨ͠
dRubyHiroba - dRuby hands-on 6/2 10:30- (RubyHiroba) ͱͪ͗RubyKaigi 05 2013-9-21
ಹਢԘݪ টߨԋ: ञ