2024年7月18日木曜日
2024年6月25日火曜日
響け!ユーフォニアム3期第12話について
(これはSNSなどに投稿した個人の意見です。)
原作読んでいません。でも、これでは大人の滝先生が責任から逃げて、部員にその選ぶ責任を推しつけ、最終的に麗奈が久美子を選ばない責任を負わせた、という印象になりました。ま、全部順風満帆だったらストーリーはおもしろくないかもしれませんが、これだと滝先生が無責任の大人、辛い思いをさせられた麗奈+久美子+真由、部員に「部長を選ぶか、それとも真由を選ぶか」(みんなずっと一緒に練習してきて、久美子の音がわからないわけがない)。。。話題にはなりますが、これって本当に納得できるのかな?話題作りのための改変ならちょっと納得できないかも、と思います。
アニ勢です。本当は言いたくない、でも、今回はちょっと。1期と違って、今回は二人に大差がない、音楽家の滝先生すら決められないなら、部員に決めさせるのは大人として無責任すぎると思います。結局、部員達に「部長を選ぶか、選ばないか」という残酷な押し付け。
いいたいこと、全部言いました。あとは最終話、お楽しみに!納得できなくても全部受け止めます!
フル感想はこちら(英語)
2023年7月13日木曜日
ryuchellさんの訃報、とても複雑な気持ち
ryuchellさんの訃報、とても複雑な気持ちになりました。
当事者しかわからないことはたくさんあると思います。
でも、私たちは他人のことについて軽く発言します。
人はそれぞれの悩みを抱えています。
他人の悩みを100%理解するって、多分無理です。
ならば、ちゃんと理解せず発言することが少し無責任だと思います。
当事者間のことをわからないくせに自分の考えを押し付けるなんて、
いい気分にはなるかもしれない。
偉そうなことを言って、正論を言って、
自分が正しいと思うかもしれません。
でも、それは当事者たちを苦しむことになる可能性もあります。
人を苦しむことがそんなに楽しいの?
いつか自分の番になったら、笑えないのですよ。
2023年7月2日日曜日
LGBT法案について
LGBT法案に反対する声について、少し考えました。
確かに女装して犯罪をおこす人はいます。いました。
しかし、その何百倍、何千倍の犯罪をおこさない性同一性障害当事者もいます。
わずか一部の悪い例でみんなが悪いというのは差別ほかない。
保険の外交員を装って犯罪をおこす人がいれば、
すべての外交員が犯罪者だと言えますか?
キャバクラで働くシングルマザーが子供を虐待した、
だからすべてのキャバクラで働くシングルマザーが子供を虐待する、と言えますか?
みんなそれぞれの立場、事情で悩みを抱えています。
みんなは一人一人の当事者です。
すべての当事者が差別されずに生きていく社会を作るのがそんなに難しいことでしょうか?
よく多様性を認める、受け入れると言いますが、
私は多様性ではなく、
一人一人の人間としてみんなが認められる、受け入れられることがポイントではないかと思います。
生きているだけでも必死。
同じ人間、人類なのに、お互いにさらなる苦しみを加えないでほしいな。。。
2022年2月8日火曜日
LinuxでアマゾンプライムビデオHD再生
以前、アマゾンプライムではLinux上HD再生ができないことについて書きました。
ついに解決!
と言っても、アマゾンプライムHD再生がLinux対応になったわけではありません。
個人的にLinuxが好きで、一般的にLinuxを使用しています。
でも、仕事のため、Windowsが必要で、今まではLinuxマシン(デスクトップ)とWindowsマシン(ノートPC)を交互に使用していました。
が、最近、バーチャルマシン(VM)を使用してみて、これもありかもと思って、ついにメインマシン(Linuxのデスクトップ)にWindowsのVMをインストールしました。
仕事のときだけWindowsのVMで、それ以外の時はLinux。
結構スムーズにできて、このままで行こうと思ったとき。
WindowsのVMでアマゾンプライムビデオを再生してみたら、
あれ!HD再生ができる!
やった!
あ、でも、この方法、おすすめできません。
まず、それなり性能のいいCPUが必要、メモリもそこそこ必要です。
VMに関する知識がなければ、うまく操作しないとき対処できません。
それでも挑戦したい方、参考として、私が使用しているマシン:
AMD Ryzen 7 5700G
GTX 1660 Super
メモリ32 GB
WindowsのVMは8個の仮想CPU、メモリ16 GB、GTX 1660 Superをパススルー。
リモートデスクトップソフトはNoMachineを使っています。
2021年12月1日水曜日
2021年10月29日金曜日
「そして、バトンは渡された」を見てきました
今日は映画「そして、バトンは渡された」の公開日。
そして、見てきました。
映画を見る前に、原作を読みましたから、その「二つの家族」のストーリーはすでにわかりました。
それでも、やはり泣きますね。
映画のストーリーは大体原作と同じですが、設定のところが変わったりします。
あ、一応、ネタバレありです。
はい、設定が変わったとか。
ま、その前に、概ねの感想は、結構泣ける作品です。
原作は読んで泣きましたが、映画も同じ。
親の都合で苗字が4回も変わって、最後は自分の選択で苗字が変わる。
親から親へとバトンが渡され、最後にバトンは結婚相手に渡された。
それはタイトルの付箋。
でも、原作はあくまでもそれを言及しない。
映画ではナレーションで正々堂々と言いましたけどね。
原作は優子目線から語られ、映画では早瀬くんがナレーション担当。
そして、原作では優子が進学した度に苗字が変わったが、
映画では小学生の間に「森宮」まで数回変わった。
ま、映画は役者の関係で、小学生、中学生、高校生という成長期に演じていくのが難しいでしょうね。
でも、水戸さん(実の父)と梨花(優子が知る唯一のお母さん)の設定がすこし勝手すぎる、わがまますぎるかもしれません。
海外赴任→夢を追うためにブラジルへ
優子の生活はどうなるのと心配→海外慣れないから行きたくない
こういう変更は。。。
原作ではもっと丁寧に彼らの感情と思いが書かれて、映画はちょっとほぼ別人です。
「そんな親、誰がついていくの?」と思うぐらい。
原作では泉ヶ原さんと別れたのが中学卒業してから、高校に入る前。
優子は中学3年間泉ヶ原さんと一緒に過ごした。
映画ではたぶん小4から小6、2年間ぐらい?
で、再会したのがその約10年後、結婚前。。。
本当に泉ヶ原さんのこと、どこまで覚えているのか、
どう考えているのか、年齢的に不自然と思いましたが。。。
そして、映画では森宮さん(最後のお父さん)は優子と小6から一緒に住んでいる、という設定です。
原作は思春期、年頃の娘の親になった、しかも親になった直後、梨花が失踪、という難しそうな設定があるのに、
それだと、森宮さんはただ子供の親になった、という設定。
あまり、バトンが渡された感が薄い。
あと、水戸さんとの再会がちょっと変わって、
そして、原作では梨花と再会したが、映画では死別になった。。。
実写の都合で年齢設定が変わったり、
映画で「泣け」のために死別させたり、
ちょっとだけ納得できませんでした。
それでもいっぱい泣きました。
後半は卒業式、届けなかった手紙、親子再会、死別、結婚式。。。😭😭😭
原作は優子の高校までの話が第一章、結婚の話については第二章。
第一章は本の4分の3ぐらいで、第二章はその残りの4分の1です。
映画では高校までの話が約半分、残り半分は再会や結婚の話です。
ま、原作は原作としてとてもいい作品です。
そして、映画は都合上設定を変えたりするのが仕方ないと思います。
映画も映画なりにいい作品だと思います。
ハードな原作ファンはたぶん内容が変わってちょっと怒っているかもしれませんが、
私は原作を厳密に従う必要がないと思います。
ストーリーの言いたいことが変わらなければ、
その媒体に合うようにちょっと変えたりするのもありと思います。
また時間を見つけて、見に行こうと思っています!
泣きたいです!
2021年9月27日月曜日
「ヴァイオレット・エヴァーガーデン」オーケストラコンサート2021メッセージカードの解読
2021年8月14~15日に開催された「ヴァイオレット・エヴァーガーデン」オーケストラコンサート2021の記念品として、ペアグラスとメッセージカードがありました。
ペアグラスはこのような箱の中に収まれて、メッセージカードも中にありました。
カードの表に絵があり、裏にはメッセージが載っていましたが、テルシス語でした。
テルシス語の文字を英文字に変換すると:
Monruqpukkap sonhiqpon
Raqunhuiruqin yikimmunyuhhup Ekarte higiq ohikeqirrikuha, poqap eka acikehhupunu innap upuihicununokup ruhunha yoqrikuha.
Onruq nunrunuha iyuirraqa niruqyyicui nuhuhhagep onka ukigimmuhiqpuriqyyi uhuirikep.
Raqunhuiruqin yikimmunyuhhup Ekarte higiq ohikeqirrikuha, poqap eka acikehhupunu innap upuihicununokup ruhunha yoqrikuha.
Onruq nunrunuha iyuirraqa niruqyyicui nuhuhhagep onka ukigimmuhiqpuriqyyi uhuirikep.
Eka ruhihup "Nun annui ruhuqirrikon" ui guqunraguhuim mequgo, iyui "Nun annui ruhuqirrikon" ui ohonpoqqiyuicahun guqunrarikuha.
Ninruq hunipuicuru anukrikikruqe, anruquiy yakkicaqqugukruquq rharri guirrummuharikikruqe, uqquha ehaguhiq ninruq yekguhuinha, nikahhaguhuim mequ anuknhuqap, intu aquriq iyui pohaguru anruqahun gukap.
Ninruq hunipuicuru anukrikikruqe, anruquiy yakkicaqqugukruquq rharri guirrummuharikikruqe, uqquha ehaguhiq ninruq yekguhuinha, nikahhaguhuim mequ anuknhuqap, intu aquriq iyui pohaguru anruqahun gukap.
Ukrojhku ruyyoki anruqarra puruqyyucynu nokupuru ikarrap onka nupmarikon.
Anpuicaqqu,
Violet Evergarden
以前開発したテルシス語翻訳アプリ(英語記事)で自分なりに解読してみました。
ーーーーー
皆様
子供の笑いはエカルテ島を響きます。また、静かな時間が静に過ぎています。
修道院のバンドが演奏することを発表しました。
手紙で「愛している」を伝えるように、音楽で「愛している」を伝えます。
人々に囲まれて孤独を感じても、走り回って疲れてすべてが停止していると感じても、音楽の世界はあなたと一緒にゆっくり歩みます。修道院のバンドが演奏することを発表しました。
手紙で「愛している」を伝えるように、音楽で「愛している」を伝えます。
このオーケストラがあなただけの時間を届けるよう、願っています。
心から、
ヴァイオレット・エヴァーガーデン
ーーーーー
あっているかわかりませんが、Discordでタミル語のわかる方から、「よくできた」と言われました。たぶんあっているでしょう。
(英語ブログの記事)
2021年5月25日火曜日
「種の保存」は問題発言
LGBTに関する議論で「種の保存」を持ち出した人って、
何を考えているでしょう?
「子供ができない」ということは、LGBT固有のことではありません。
世の中には子供ができない人々がたくさんいます。
子供がほしがらない人々もいます。
子供が欲しくても育てられない人々もいます。
この人たちの存在を否定する発言になります。
「種の保存」を持ち出したら、
LGBTだけではなく、
子供のできない、ほしがらない、育てられない人々の差別にもつながります。
発言する前に、
頭を使ってください。
両耳の間にある脳みそはそのためにあります。
2021年3月29日月曜日
LINE情報が中国からアクセスされた
先日、LINE情報が中国の委託業務先からアクセスされたということが明らかになりました。
もしかして、中国政府はLINEユーザーの情報を入手した、という懸念もあります。
LINEのようなメッセージアプリが結構広く使われています。
私生活で家族や友達との連絡手段としてはもちろん、
仕事で使う人もいます。
元軍人として、メッセージアプリの便利さは否定しませんが、
仕事で使用したことがありません。
私は情報工学を専攻していました。
そして、小学生のときからコンピューターに興味を持ち、
自分でいろいろ勉強しました。
インターネットの仕組みも。
だからこそ、仕事でメッセージアプリは使用しません。
ネット経由のやり取りは、仮にサーバーが国内であっても、
メッセージのルーティングがどのように行われているのか、
自分で制御できません。
インターネットでのルーティングは海外サーバー経由かも、
と常に意識してやり取りをします。
知らないサーバーはメッセージの中身を見ない、保存しないとは思いたいが、
中には悪者が立ち上げたサーバーもあるかもしれません。
ネット経由のものは暗号化されないかぎり、世界に公開されたと同様だと思います。
そして、暗号化も絶対安全ではありません。
暗号化は家に鍵をかけると同じです。
すぐ侵入できませんが、時間があれば空き巣は入ってこられます。
暗号化された情報も同じ、すぐには読めませんが、時間があれば解読できます。
その時間は、暗号化した技術によって、数秒から億年単位の違いがありますが、
絶対安全とは言えません。
でも、数億年単位なら、安全でしょう。いくら将来にコンピューター処理能力が進歩しても、百年以内で解読ができなければ、問題ないと思います。
百年経てば、私はもうこの世にいないし。
結論をいうと、
LINEなどメッセージアプリは暗号化しても、連絡手段として使うのは問題なくても
仕事に使わない方がよいと思います。
機密情報はいつ、どこで、どのように漏れるのか、わかりませんから。
常に警戒して、「漏れるかもしれません」と意識して行動しなければなりません。
それは情報社会の基本だと思います。
2021年3月16日火曜日
ロッテとイオンがコラボして、「ヴァイオレット・エヴァーガーデン」のA5ノートを配布
ロッテとイオンがコラボして、「ヴァイオレット・エヴァーガーデン」のA5ノート特典を配布しています。イオンでロッテ商品3点を購入すれば、ノート1冊がもらえます。ノートは全2種類です。
早速購入。
青い方とその中身:
青い方は外伝に関連したシーンだね。
ベージュの方(封筒デザイン)とその中身:
こちらは劇場版に関連したシーンだね。でも、手紙が英語。。。テルシス語ならもっとよかったです。
今回のキャンペーンはTwitterで知りました。
イオン行ったらロッテのお菓子3つでヴァイオレット・エヴァーガーデンのノートプレゼントキャンペーンやってたので…
— 常陸剣士KEⅣ (@KEIV14) March 8, 2021
外伝ほんと好きだから見逃せなかったんだ… pic.twitter.com/P1uXWh2hMV
2021年3月6日土曜日
公務員接待、ちょっと一言
最近のニュース、よく見かけるのが公務員が接待されるあの問題です。
公務員でありながら高額な接待を受ける。
本人たちはその返しとして業務で何か特別扱いはしていないと言っています。
とはいえ、公務員として本来やっていけないこと(高額な接待を受ける)をやったから、悪いことをしたということは事実です。
私も公務員(軍人)でした。
シンガポール軍の規程では細かく接待について定まれています。
接待をするとき、接待を受けるとき、相手や本人の地位に合わせて金額が設定され、内部監査の対象にもなっています。
それはそうでしょう。
公務員って、給料は国民の税金から、使っているお金も税金から。
アカウンタビリティが問われるのが当然です。
軍の教育では「国民の税金を大事にしろ」ということはあまり触れませんが、規程については細かく教えています。
違反して、内部監査で発覚される場合は重い罰則があります。
個人的に、軍での仕事は予算を扱う職務に勤めたことがあります。
私の権限で使える金額は小さいものですが、私の推薦で大金が使えます。
よって、いつも慎重に行動していました。
少しでも疑われるような行動は一切避けていました。
問われてから説明するのが遅いです。
未然防止第一。
幸い、疑われることもなく、問われることもなく、退役ができました。
だから、最近のニュースを見て、「信じられない」と思いました。
自覚があまりにも低すぎます。
確かに一生懸命勉強して、公務員試験を合格し、経験、知識、実績を重ねて出世したと思います。
いっぱい努力したと認めます。
でも、公務員である以上、自分の身分を自覚しなければなりません。
国民の大事な税金をもらって、国民の大事な税金を扱う。
人より慎重に行動しなければなりません。
そもそも仕事で高級レストランで食べること自体がおかしいです。
国民はあなたが公務で楽しく食事ができるために税金を払っているわけではない!
一食7万円って、論外。
常識外れより、もう頭がおかしい、頭が悪い、なぜ公務員になったのかは疑問だ、しか言えません。
中には会社も問題だ、コンプライアンスってどうなっているか、とか言っている人もいます。
でも、そもそも公務員が自覚あれば、そういう問題は起きません。
法律や規程を定めることが重要です。
でも、公務員の倫理教育、そして内部監査機能も力を入れないと、人の考え方は変わりません。
強い人間は外部の監視があるから行動を律するではなく、自ら自分の行動を律する人です。
2021年1月28日木曜日
ワクチン関連業務、自衛隊の活用
世の中は現在、新形コロナウイルスと戦っています。
最近、ワクチンが開発され、これから予防接種が始まります。
ですが、日本の全住民に予防接種をうけさせることは、
簡単ではありません。
まず、医療スタッフは既に病気と戦っています。
保健所のスタッフも感染対応で追われています。
このような状況下、人員を確保して予防接種を行うのが、かなり難しいです。
ここで、自衛隊を活用すればと思わいます。
自衛隊の医療スタッフは既に民間病院などで支援をしています。
でも、一般隊員、まだまだいます。
隊員たちは診察など実際の予防接種はできませんが、
事務業務はできると思います。
受付作業、人の誘導、現場の消毒など、
人手がかかる所々で隊員を使うのができるでしょう。
今でも保健所の電話対応などができるはず。ちょっと事前勉強をさせたら。
新型コロナウイルスは国に対する脅威です。
まさか自衛隊の出所でしょう。
2021年1月16日土曜日
テルシス語翻訳スクリプトをパワーアップ
注:さらに進化したバージョンはこちら:
記事は英語しかなく。。。ごめんなさい。🙇♀️いつか日本語で書きます!
先日テルシス語(ヴァイオレット・エヴァーガーデン世界)翻訳Pythonスクリプトを書いたばかりですが、 テルシス語の解読しかできなく、性能は欠けていると思いました。
よって、休み時間を使って、パワーアップしました。
かなり増強しました。
解読だけではなく、テルシス語で書くこともできます。
解読する時、言語指定もできます。
バックエンドはGoogle Translateです。
とりあえず、v0.1をGitHubに載せました。
ここです。
コマンドラインからの実行例:
$ ./telsistrans.py -t "I love Major \Gilbert\ " -sl en
Nun posuk Gilbert ui gikapmarikon
$ ./telsistrans.py -t "Posuk \Gilbert\ nunki." -sl telsis
Thank you Major Gilbert.
Nun posuk Gilbert ui gikapmarikon
$ ./telsistrans.py -t "Posuk \Gilbert\ nunki." -sl telsis
Thank you Major Gilbert.
インタラクティブモードもあります:
$ ./telsistrans.py -i
Source language: en
Input source text: I love you
Target language:
In Tamil script: நான் உன்னை நேசிக்கிறேன்
Pronunciation: Nāṉ uṉṉai nēcikkiṟēṉ
In unaccented characters: Nan unnai necikkiren
In target language: Nun annui noyirrikon
Source language: telsis
Input source text: Nunki posuk
Target language: ja
In Tamil script: நன்றி மேஜர்
Pronunciation:
In unaccented characters: Nanri mejar
In target language: ありがとう少佐
Source language: en
Input source text: I love you
Target language:
In Tamil script: நான் உன்னை நேசிக்கிறேன்
Pronunciation: Nāṉ uṉṉai nēcikkiṟēṉ
In unaccented characters: Nan unnai necikkiren
In target language: Nun annui noyirrikon
Source language: telsis
Input source text: Nunki posuk
Target language: ja
In Tamil script: நன்றி மேஜர்
Pronunciation:
In unaccented characters: Nanri mejar
In target language: ありがとう少佐
Pythonスクリプト内でライブラリーとしても使用できます:
from telsistrans import telsis_translator
translator = telsis_translator()
srctext = "I love you"
srclang = 'en'
translator.lang2telsis(srctext, srclang)
print(translator.results['tgt_text']) # Print out results of translation
srctext = "Nunki posuk"
tgtlang = 'ja'
translator.telsis2lang(srctext, tgtlang)
print(translator.results['tgt_text']) # Print out results of translation
translator = telsis_translator()
srctext = "I love you"
srclang = 'en'
translator.lang2telsis(srctext, srclang)
print(translator.results['tgt_text']) # Print out results of translation
srctext = "Nunki posuk"
tgtlang = 'ja'
translator.telsis2lang(srctext, tgtlang)
print(translator.results['tgt_text']) # Print out results of translation
上記スクリプトを実行したアウトプット:
Nun annui noyirrikon
ありがとう少佐
ありがとう少佐
テルシス語のフォントファイルを指定すれば、
このような出力もできます:
「Dear Major Gilbert」(親愛なるギルベルト少佐)
この翻訳スクリプトを使用するため、以下のPythonライブラリーが必要です:
google_trans_new
unidecode
requests
Pillow
unidecode
requests
Pillow
スクリプト(解読や翻訳の流れ)に関する説明もレポジトリーに載せましたが、
英語です。
テルシス語について、少し説明します。
ヴァイオレット・エヴァーガーデンの世界観設定を担当した鈴木貴昭さんがスタッフイベントで、
日本語原文を英語へ翻訳し、
英文をまた別の言語に翻訳し、
その結果のアルファベットを暗号化して、
最後にテルシス語の文字にする、と説明しました。
その別の言語は言及しませんでしたが、
すでに「タミル語」と特定した人々がいます。
ようするに、
テルシス語はタミル語を暗号化したものです。
その暗号は、英文字の置き換え(スワップ)です。
ネット同志の努力で、
おそらく
A ⇔ U
C ⇔ Y
E ⇔ O
G ⇔ V
H ⇔ T
K ⇔ R
M ⇔ P
で英文字を置き換えたと推測しました。
ネット同志は、S、Lについて少し悩んでいたみたいです。
個人的に、
J ⇔ S
L ⇔ Q
で置き換えられていたと思います。
確かではありませんが、この翻訳スクリプトではこのように置き換えます。
作ったばかりで、まだ完全にテストしたものではありません。
でも、出力は合っていると思います。😅
コンソルでの使用ですが、少し慣れていない方には難しいかもしれません。。。🙇♀️
将来的にTkで簡単なGUIを作ろうとは思いますが。。。
GUIを作るのが大嫌いで、おそらくなかなかできはしないでしょう。
(英語ブログにもこのスクリプトについて書きました。)
2020年1月23日更新:GUIを作りました。
Kivyを使用したGUI:
PySimpleGUIを使用したGUI:
テルシス語のフォントも作りました。
2020年1月25日更新:GUI使い方のビデオをアップしました。
2021年1月14日木曜日
テルシス語(ヴァイオレット・エヴァーガーデン世界)翻訳Pythonスクリプト
2021年1月16日更新:パワーアップしたスクリプトについてはこちらへ。
ヴァイオレット・エヴァーガーデン世界で使用されているテルシス語を英語へ翻訳するPythonスクリプトがあります。
それを少し改造して、日本語へ翻訳できるようにしました。
(英語ブログから流用しました。)
使用するにはgoogle_trans_newライブラリーが必要です。
pip3 install google_trans_newGoogle翻訳APIサービスは有料ですが、
google_trans_newは無料で使わせてくれるみたいです。
でも、商用では使えません。ご注意ください。
現在、ターゲット言語を日本語に設定しました。例えば、英語にしたい場合、
target_language = 'ja'
を以下のように書き換えてください。
target_language = 'en'
スクリプトの実行
python3 nunkish_translator_2.py
スクリプト(ファイルネーム:nunkish_translator_2.py)
-----------------
from google_trans_new import google_translator
import requests
translator = google_translator()
alphabet = {
'a': 'u',
'b': '',
'c': 'y',
'd': '',
'e': 'o',
'f': '',
'g': 'v',
'h': 't',
'i': 'i',
'j': '',
'k': 'r',
'l': 'i',
'm': 'p',
'n': 'n',
'o': 'e',
'p': 'm',
'q': 'l',
'r': 'k',
's': 'y',
't': 'h',
'u': 'a',
'v': 'g',
'w': '',
'x': '',
'y': 'c',
'z': '',
'A': 'U',
'B': '',
'C': 'Y',
'D': '',
'E': 'O',
'F': '',
'G': 'V',
'H': 'T',
'I': 'I',
'J': '',
'K': 'R',
'L': 'I',
'M': 'P',
'N': 'N',
'O': 'E',
'P': 'M',
'Q': 'L',
'R': 'K',
'S': 'Y',
'T': 'H',
'U': 'A',
'V': 'G',
'W': '',
'X': '',
'Y': 'C',
'Z': '',
' ': ' ',
'0': '0',
'1': '1',
'2': '2',
'3': '3',
'4': '4',
'5': '5',
'6': '6',
'7': '7',
'8': '8',
'9': '9',
}
tamil_script_url = 'https://inputtools.google.com/request?text={text}&itc=ta-t-i0-und'
source_language = 'ta'
target_language = 'ja'
def trans(nunkish):
tamil = ""
for char in nunkish:
if char not in alphabet:
tamil += char
else:
tchar = alphabet[char]
if tchar:
tamil += tchar
else:
tamil += "?"
print(f"Converted to tamil: {tamil}")
tamil_res = requests.get(tamil_script_url.format(text=tamil), headers={
'Content-Type': 'application/json'
}).json()
if (tamil_res[0] == 'SUCCESS'):
tamil_script = tamil_res[1][0][1][0]
print(f"In Tamil script: {tamil_script}")
return translator.translate(f'{tamil_script}', lang_src=source_language, lang_tgt=target_language)
while True:
nunkish = input("Input nunkish: ")
print(f"You entered: {nunkish}")
print(trans(nunkish.replace('\n', ' ').replace('\r', '')))
import requests
translator = google_translator()
alphabet = {
'a': 'u',
'b': '',
'c': 'y',
'd': '',
'e': 'o',
'f': '',
'g': 'v',
'h': 't',
'i': 'i',
'j': '',
'k': 'r',
'l': 'i',
'm': 'p',
'n': 'n',
'o': 'e',
'p': 'm',
'q': 'l',
'r': 'k',
's': 'y',
't': 'h',
'u': 'a',
'v': 'g',
'w': '',
'x': '',
'y': 'c',
'z': '',
'A': 'U',
'B': '',
'C': 'Y',
'D': '',
'E': 'O',
'F': '',
'G': 'V',
'H': 'T',
'I': 'I',
'J': '',
'K': 'R',
'L': 'I',
'M': 'P',
'N': 'N',
'O': 'E',
'P': 'M',
'Q': 'L',
'R': 'K',
'S': 'Y',
'T': 'H',
'U': 'A',
'V': 'G',
'W': '',
'X': '',
'Y': 'C',
'Z': '',
' ': ' ',
'0': '0',
'1': '1',
'2': '2',
'3': '3',
'4': '4',
'5': '5',
'6': '6',
'7': '7',
'8': '8',
'9': '9',
}
tamil_script_url = 'https://inputtools.google.com/request?text={text}&itc=ta-t-i0-und'
source_language = 'ta'
target_language = 'ja'
def trans(nunkish):
tamil = ""
for char in nunkish:
if char not in alphabet:
tamil += char
else:
tchar = alphabet[char]
if tchar:
tamil += tchar
else:
tamil += "?"
print(f"Converted to tamil: {tamil}")
tamil_res = requests.get(tamil_script_url.format(text=tamil), headers={
'Content-Type': 'application/json'
}).json()
if (tamil_res[0] == 'SUCCESS'):
tamil_script = tamil_res[1][0][1][0]
print(f"In Tamil script: {tamil_script}")
return translator.translate(f'{tamil_script}', lang_src=source_language, lang_tgt=target_language)
while True:
nunkish = input("Input nunkish: ")
print(f"You entered: {nunkish}")
print(trans(nunkish.replace('\n', ' ').replace('\r', '')))
---------------------
M5Stick CでWiFiのRSSI表示
先日、WiFi信号の強度が知りたくて、
M5Stick Cを使ってWiFi受信RSSIを表示するスケッチを作りました。
元はこのスケッチです。
元のスケッチは時間と日付を表示するスケッチで、
それを少し改造して、
RSSIも表示するようにしました。
また、OTAアップデートもできるようにしました。
WiFiのSSIDとパスワード、タイムゾーンを入力をconfig.hファイルに以下のように記入しました。
#define TIMEZONE 9
#define WIFI_SSID "your_wifi_ssid"
#define WIFI_PASSWORD "your_wifi_password"
#define WIFI_SSID "your_wifi_ssid"
#define WIFI_PASSWORD "your_wifi_password"
ボタンA(M5と書いてあるボタン)を押せば表示のオン・オフが切り替えられます。
ボタンB(上の小さいボタン)を2秒以上長押しすれば時間シンクロが行われます。
実際のスケッチは以下です。改造した結果、timeToDoという関数は必要なくなりましたが、そのまま残しました。
-----------------------------------------------------
#include <Arduino.h>
#include <M5StickC.h>
#include <M5StickC.h>
#include <ESPmDNS.h>
#include <WiFi.h>
#include "time.h"
#include "config.h"
#include <ArduinoOTA.h>
// default hostname if not defined in config.h
#ifndef HOSTNAME
#define HOSTNAME "m5stickc"
#endif
// use the WiFi settings in config.h file
char* ssid = WIFI_SSID;
char* password = WIFI_PASSWORD;
// define the NTP server to use
char* ntpServer = "ntp.nict.jp";
// define what timezone you are in
int timeZone = TIMEZONE * 3600;
// delay workarround
int tcount = 0;
// LCD Status
bool LCD = true;
RTC_TimeTypeDef RTC_TimeStruct;
RTC_DateTypeDef RTC_DateStruct;
//delays stopping usualy everything using this workarround
bool timeToDo(int tbase) {
tcount++;
if (tcount == tbase) {
tcount = 0;
return true;
} else {
return false;
}
}
// Syncing time from NTP Server
void timeSync() {
M5.Lcd.setTextSize(1);
Serial.println("Syncing Time");
Serial.printf("Connecting to %s ", ssid);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(20, 15);
M5.Lcd.println("connecting WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(20, 15);
M5.Lcd.println("Connected");
// Set ntp time to local
configTime(timeZone, 0, ntpServer);
// Get local time
struct tm timeInfo;
if (getLocalTime(&timeInfo)) {
// Set RTC time
RTC_TimeTypeDef TimeStruct;
TimeStruct.Hours = timeInfo.tm_hour;
TimeStruct.Minutes = timeInfo.tm_min;
TimeStruct.Seconds = timeInfo.tm_sec;
M5.Rtc.SetTime(&TimeStruct);
RTC_DateTypeDef DateStruct;
DateStruct.WeekDay = timeInfo.tm_wday;
DateStruct.Month = timeInfo.tm_mon + 1;
DateStruct.Date = timeInfo.tm_mday;
DateStruct.Year = timeInfo.tm_year + 1900;
M5.Rtc.SetData(&DateStruct);
Serial.println("Time now matching NTP");
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(20, 15);
M5.Lcd.println("S Y N C");
delay(500);
M5.Lcd.fillScreen(BLACK);
}
}
void buttons_code() {
// Button A control the LCD (ON/OFF)
if (M5.BtnA.wasPressed()) {
if (LCD) {
M5.Lcd.writecommand(ST7735_DISPOFF);
M5.Axp.ScreenBreath(0);
LCD = !LCD;
} else {
M5.Lcd.writecommand(ST7735_DISPON);
M5.Axp.ScreenBreath(255);
LCD = !LCD;
}
}
// Button B doing a time resync if pressed for 2 sec
if (M5.BtnB.pressedFor(2000)) {
timeSync();
}
}
// Printing WiFi RSSI and time to LCD
void doTime() {
//if (timeToDo(1000)) {
vTaskDelay(1000 / portTICK_PERIOD_MS);
M5.Lcd.setCursor(10, 10);
M5.Lcd.setTextSize(1);
M5.Lcd.printf("%s: ", WiFi.SSID());
long strength = WiFi.RSSI();
if(strength < -70) M5.Lcd.setTextColor(RED, BLACK);
else if(strength < -60) M5.Lcd.setTextColor(YELLOW, BLACK);
else M5.Lcd.setTextColor(GREEN, BLACK);
M5.Lcd.printf("%02d\n", strength);
M5.Lcd.setTextSize(3);
M5.Lcd.setTextColor(WHITE, BLACK);
M5.Rtc.GetTime(&RTC_TimeStruct);
M5.Rtc.GetData(&RTC_DateStruct);
M5.Lcd.setCursor(10, 25);
M5.Lcd.printf("%02d:%02d:%02d\n", RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds);
M5.Lcd.setCursor(15, 60);
M5.Lcd.setTextSize(1);
M5.Lcd.setTextColor(WHITE, BLACK);
M5.Lcd.printf("Date: %04d-%02d-%02d\n", RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Date);
//}
}
void setup() {
M5.begin();
M5.Lcd.setRotation(1);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setTextSize(1);
M5.Lcd.setTextColor(WHITE,BLACK);
timeSync(); //uncomment if you want to have a timesync everytime you turn device on (if no WIFI is avail mostly bad)
// Port defaults to 3232
// ArduinoOTA.setPort(3232);
// Hostname defaults to esp3232-[MAC]
ArduinoOTA.setHostname(HOSTNAME);
// No authentication by default
// ArduinoOTA.setPassword("admin");
// Password can be set with it's md5 value as well
// MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
// ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");
ArduinoOTA
.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH)
type = "sketch";
else // U_SPIFFS
type = "filesystem";
// NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
Serial.println("Start updating " + type);
})
.onEnd([]() {
Serial.println("\nEnd");
})
.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
})
.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
else if (error == OTA_END_ERROR) Serial.println("End Failed");
});
ArduinoOTA.begin();
}
void loop() {
M5.update();
buttons_code();
doTime();
ArduinoOTA.handle();
}
#include <WiFi.h>
#include "time.h"
#include "config.h"
#include <ArduinoOTA.h>
// default hostname if not defined in config.h
#ifndef HOSTNAME
#define HOSTNAME "m5stickc"
#endif
// use the WiFi settings in config.h file
char* ssid = WIFI_SSID;
char* password = WIFI_PASSWORD;
// define the NTP server to use
char* ntpServer = "ntp.nict.jp";
// define what timezone you are in
int timeZone = TIMEZONE * 3600;
// delay workarround
int tcount = 0;
// LCD Status
bool LCD = true;
RTC_TimeTypeDef RTC_TimeStruct;
RTC_DateTypeDef RTC_DateStruct;
//delays stopping usualy everything using this workarround
bool timeToDo(int tbase) {
tcount++;
if (tcount == tbase) {
tcount = 0;
return true;
} else {
return false;
}
}
// Syncing time from NTP Server
void timeSync() {
M5.Lcd.setTextSize(1);
Serial.println("Syncing Time");
Serial.printf("Connecting to %s ", ssid);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(20, 15);
M5.Lcd.println("connecting WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(20, 15);
M5.Lcd.println("Connected");
// Set ntp time to local
configTime(timeZone, 0, ntpServer);
// Get local time
struct tm timeInfo;
if (getLocalTime(&timeInfo)) {
// Set RTC time
RTC_TimeTypeDef TimeStruct;
TimeStruct.Hours = timeInfo.tm_hour;
TimeStruct.Minutes = timeInfo.tm_min;
TimeStruct.Seconds = timeInfo.tm_sec;
M5.Rtc.SetTime(&TimeStruct);
RTC_DateTypeDef DateStruct;
DateStruct.WeekDay = timeInfo.tm_wday;
DateStruct.Month = timeInfo.tm_mon + 1;
DateStruct.Date = timeInfo.tm_mday;
DateStruct.Year = timeInfo.tm_year + 1900;
M5.Rtc.SetData(&DateStruct);
Serial.println("Time now matching NTP");
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(20, 15);
M5.Lcd.println("S Y N C");
delay(500);
M5.Lcd.fillScreen(BLACK);
}
}
void buttons_code() {
// Button A control the LCD (ON/OFF)
if (M5.BtnA.wasPressed()) {
if (LCD) {
M5.Lcd.writecommand(ST7735_DISPOFF);
M5.Axp.ScreenBreath(0);
LCD = !LCD;
} else {
M5.Lcd.writecommand(ST7735_DISPON);
M5.Axp.ScreenBreath(255);
LCD = !LCD;
}
}
// Button B doing a time resync if pressed for 2 sec
if (M5.BtnB.pressedFor(2000)) {
timeSync();
}
}
// Printing WiFi RSSI and time to LCD
void doTime() {
//if (timeToDo(1000)) {
vTaskDelay(1000 / portTICK_PERIOD_MS);
M5.Lcd.setCursor(10, 10);
M5.Lcd.setTextSize(1);
M5.Lcd.printf("%s: ", WiFi.SSID());
long strength = WiFi.RSSI();
if(strength < -70) M5.Lcd.setTextColor(RED, BLACK);
else if(strength < -60) M5.Lcd.setTextColor(YELLOW, BLACK);
else M5.Lcd.setTextColor(GREEN, BLACK);
M5.Lcd.printf("%02d\n", strength);
M5.Lcd.setTextSize(3);
M5.Lcd.setTextColor(WHITE, BLACK);
M5.Rtc.GetTime(&RTC_TimeStruct);
M5.Rtc.GetData(&RTC_DateStruct);
M5.Lcd.setCursor(10, 25);
M5.Lcd.printf("%02d:%02d:%02d\n", RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds);
M5.Lcd.setCursor(15, 60);
M5.Lcd.setTextSize(1);
M5.Lcd.setTextColor(WHITE, BLACK);
M5.Lcd.printf("Date: %04d-%02d-%02d\n", RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Date);
//}
}
void setup() {
M5.begin();
M5.Lcd.setRotation(1);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setTextSize(1);
M5.Lcd.setTextColor(WHITE,BLACK);
timeSync(); //uncomment if you want to have a timesync everytime you turn device on (if no WIFI is avail mostly bad)
// Port defaults to 3232
// ArduinoOTA.setPort(3232);
// Hostname defaults to esp3232-[MAC]
ArduinoOTA.setHostname(HOSTNAME);
// No authentication by default
// ArduinoOTA.setPassword("admin");
// Password can be set with it's md5 value as well
// MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
// ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");
ArduinoOTA
.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH)
type = "sketch";
else // U_SPIFFS
type = "filesystem";
// NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
Serial.println("Start updating " + type);
})
.onEnd([]() {
Serial.println("\nEnd");
})
.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
})
.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
else if (error == OTA_END_ERROR) Serial.println("End Failed");
});
ArduinoOTA.begin();
}
void loop() {
M5.update();
buttons_code();
doTime();
ArduinoOTA.handle();
}
------------------------------------------------------------
2021年1月13日水曜日
新しい生活様式は緊急事態宣言下のみではない
新型コロナウイルス感染症拡大を防止するため、3密を避けることが重要と言われています。
3密とは、
1.密閉空間(換気の悪い密閉空間である)
2.密集場所(多くの人が密集している)
3.密接場面(互いに手を伸ばしたら届く距離での会話や発声が行われる)
のことです。
今の緊急事態宣言は効果あるのか?
テレワークへの移行は3密を減らすでしょう。
しかし、テレワークができない業種や会社もあります。
その場合、時間差出勤を推進する必要があります。
飲食店の時短営業は確かに夜8時以降の3密を減らしますが、それ以外の時間帯ではさらなる取り組みや工夫が必要です。
例えば、店内の客数制限や、お客様グループの人数制限など。
そうしない限り、同じ密閉空間に多人数が集会し密接することが続きます。
そもそも、人々が大人数で集まらなければの話です。
少人数で時間差をもって飲食店へ行く、食事中も十分な距離をとる。
こうすれば、飲食店も営業し続けられるでしょう。
イベントや他の娯楽(スポーツ観戦や映画など)も同じでしょう。
同じ場所に多人数がいるとしても、
しっかりした換気と十分な距離をとることで密閉と密接を防ぐことができます。
換気は場所によって難しい場合もありますが、
距離をとることは主催者や運営者の意志があればできるでしょう。
同じ場所に数十人が集い、共通な作業(勉強)を行う。
3密を避けるのが難しいと思っても、
まずは換気から始めましょう。
そして、一番重要なポイントです。
感染症に勝つためには常に一歩前に歩かなければなりません。
これらの取り組みは、緊急事態宣言が解除されても、ワクチンが普及しない限り、続くべきだと思います。
これが新しい生活様式です。
緊急事態宣言が解除され、また昔のように戻れば、感染は再び広げます。
今まで我慢したこと、努力したこと、意味がなくなります。
そうならないため、解除しても距離をとることが重要です。
個人も企業も、責任を持って距離をとらなければ、
同じことの繰り返しになるだけです。
皆の自覚ある行動で感染症を乗り越えましょう!
2020年12月18日金曜日
《劇場版ヴァイオレット・エヴァーガーデン》エンドロールに京アニ放火事件犠牲者の名前
9月18日、《劇場版ヴァイオレット・エヴァーガーデン》の開会日。
映画館で鑑賞し、最後のエンドロールに京都アニメーションの武本監督の名前を見つけたとき、思わず涙でました。
あ、京アニ放火事件の犠牲者がエンドロールに載っているだ、と思いました。
そして。。。
調べたら、公表された35名の犠牲者、
全員載っています。
36人目が2019年10月にお亡くなり、名前が公表されませんでしたが、
おそらくエンドロールにも載っているでしょう。
(公表された犠牲者の出典:京アニ放火事件、25人の身元公表 全犠牲者明らかに)
笠間結花さん(22):サポーティングスタッフ
木上益治(三好一郎)さん(61):サポーティングスタッフ
津田幸恵さん(41):仕上
横田圭佑さん(34):制作マネージャー
栗木亜美さん(30):原画
宇田淳一さん(34):サポーティングスタッフ
大村勇貴さん(23):サポーティングスタッフ
武本康弘さん(47):サポーティングスタッフ
西屋太志さん(37):サポーティングスタッフ
渡辺美希子さん(35):美術監督
石田奈央美さん(49):サポーティングスタッフ
兼尾結実さん(22):制作マネージャー
川口聖矢さん(27):原画
草野すみれさん(32):原画
佐藤綾さん(43):サポーティングスタッフ
松浦香奈さん(24):サポーティングスタッフ
木上益治(三好一郎)さん(61):サポーティングスタッフ
津田幸恵さん(41):仕上
横田圭佑さん(34):制作マネージャー
栗木亜美さん(30):原画
宇田淳一さん(34):サポーティングスタッフ
大村勇貴さん(23):サポーティングスタッフ
武本康弘さん(47):サポーティングスタッフ
西屋太志さん(37):サポーティングスタッフ
渡辺美希子さん(35):美術監督
石田奈央美さん(49):サポーティングスタッフ
兼尾結実さん(22):制作マネージャー
川口聖矢さん(27):原画
草野すみれさん(32):原画
佐藤綾さん(43):サポーティングスタッフ
松浦香奈さん(24):サポーティングスタッフ
村山(中峰)ちとせさん(49):サポーティングスタッフ
森崎志保さん(27):原画
佐藤宏太さん(28):原画
武地美穂さん(25):原画
藤田貴久さん(27):制作チーフマネージャー
丸子達就さん(31):作画監督
時盛友樺さん(22):サポーティングスタッフ
石田敦志さん(31):サポーティングスタッフ
岩崎菜美さん(31):サポーティングスタッフ
大當乃里衣さん(26):仕上
鈴木沙奈さん(30):原画
高橋博行さん(48):小物設定、原画
寺脇(池田)晶子さん(44):原画
松本康二朗さん(25):制作マネージャー
宮地篤史さん(32):サポーティングスタッフ
大野萌さん(21):サポーティングスタッフ
西川(壬生)麻衣子さん(29):原画
明見裕子さん(29):作画監督
渡辺紗也加さん(27):原画
森崎志保さん(27):原画
佐藤宏太さん(28):原画
武地美穂さん(25):原画
藤田貴久さん(27):制作チーフマネージャー
丸子達就さん(31):作画監督
時盛友樺さん(22):サポーティングスタッフ
石田敦志さん(31):サポーティングスタッフ
岩崎菜美さん(31):サポーティングスタッフ
大當乃里衣さん(26):仕上
鈴木沙奈さん(30):原画
高橋博行さん(48):小物設定、原画
寺脇(池田)晶子さん(44):原画
松本康二朗さん(25):制作マネージャー
宮地篤史さん(32):サポーティングスタッフ
大野萌さん(21):サポーティングスタッフ
西川(壬生)麻衣子さん(29):原画
明見裕子さん(29):作画監督
渡辺紗也加さん(27):原画
😢😢😢
2020年12月15日火曜日
《劇場版ヴァイオレット・エヴァーガーデン》、8回目の鑑賞
ついに8回目の鑑賞です。
公開13週目、そろそろ観客も減り、上映しなくなるではないかと思います。
まだ映画館で見れるうち、見よう!と決めて、 今日行きました。
先日、スタッフイベントに参加して、やはり通常の映画館とドルビーシネマが違うとわかりました。
幸い、近く(移動範囲内)にドルビーシネマがあり、火曜日は割引もあり、
それを利用して、通常の映画館より安い値段で見てきました。
映画館へ行く前に、予約状況を確認したとき、
20数人しか予約していませんでしたが、
実際に映画館に行き、
たぶん50人から70人の観客はいました。
まだまだ集客力はありますね。
来週、また行こうかな。。。😅
追申:2020年12月22日時点、計10回見ました。
2020年12月12日土曜日
アマゾンプライムビデオ、Linux上のHD再生問題
私は普段LinuxのPCを使っています。
ずっと前から、「アマゾンプライムビデオ」の画質がちょっと悪いな、
と気づきましたが、そんなもんだと思いました。
でも、最近分かったの。。。
プライムビデオがHD再生時、画面の左下に「HD」が表示します。
で、なんでいくら設定しても「HD」が表示されないの、
と調べたら、
アマゾンのホームページで
「Prime Videoの再生は、これらのウェブブラウザでサポートされています。WindowsまたはMac OS以外のオペレーティングシステムを実行している場合、再生は標準画質に制限されます。」
を見つかりました。
Linux上のHD再生は対応していません!😱
これはアマゾンジャパンだけではなく、米国アマゾンもそうらしい。
アマゾンのサポート窓口に問い合わせしたら、
「貴重な意見を担当部署にお伝えします」
のような回答しか得ませんでした。
改善するか、対応の見込みとか、一切教えてくれませんでした。
私たちLinuxを使っているプライムユーザーは、
首が長くなるまで、ただただ黙って待つ、
しかなさそうです。
このままだと、🦒になります。。。
登録:
投稿 (Atom)





















