細
憎むべきは唐澤貴洋ただ一人のみ
>Kirari1192 (ちばけんま) |
>Kirari1192 細 (憎むべきは唐澤貴洋ただ一人のみ) |
||
| (同じ利用者による、間の15版が非表示) | |||
| 2行目: | 2行目: | ||
{{Infobox Person | {{Infobox Person | ||
|image=誹謗中傷対策.svg | |image=誹謗中傷対策.svg | ||
|本名=Keita Kameshima, Masaki Wada<ref>KoushinRipのリクエスト送付先の名義</ref> | |本名=Keita Kameshima, Masaki Wada, Yuuichi Morizono, Taiyo Matsumura<ref>KoushinRipのリクエスト送付先の名義</ref> | ||
|渾名=KoushinRip, SteadinessLows<ref>グループ名として。ただしSteadinessLowsは会員制トラッカーで使用している</ref>, Kirari1192, Kirari1185<ref>割れtorrentサイトなどで主に使用</ref> | |渾名=KoushinRip, SteadinessLows<ref>グループ名として。ただしSteadinessLowsは会員制トラッカーで使用している</ref>, Kirari1192, Kirari1185<ref>割れtorrentサイトなどで主に使用</ref> | ||
|一人称=当職 | |一人称=当職 | ||
| 9行目: | 9行目: | ||
|才能=無能 | |才能=無能 | ||
|好きなもの=[[神聖六文字]] | |好きなもの=[[神聖六文字]] | ||
|嫌いなもの=[[唐澤貴洋]] | |嫌いなもの=[[唐澤貴洋]] | ||
|関係者=<div> | |関係者=<div> | ||
*[[唐澤貴洋]] - 我らが尊師 | *[[唐澤貴洋]] - 我らが尊師 | ||
| 53行目: | 53行目: | ||
送り状の作成はクロネコメンバーズ辺りでやると楽。他のサービスだと着払い伝票が出ないが、クロネコだけは着払いが出せる。手書きはやめたほうが良い。一番上が送り主控えのため指紋は問題ないが筆跡が残る上に何より面倒くさい。 | 送り状の作成はクロネコメンバーズ辺りでやると楽。他のサービスだと着払い伝票が出ないが、クロネコだけは着払いが出せる。手書きはやめたほうが良い。一番上が送り主控えのため指紋は問題ないが筆跡が残る上に何より面倒くさい。 | ||
追記: 自動化bot作りました とりあえず取り急ぎ | |||
* Discord版 https://discord.gg/TTu74TsuUB | |||
* Telegram版 https://t.me/DoxxinShowBot | |||
== 逆引きをカスタマイズする方法 == | == 逆引きをカスタマイズする方法 == | ||
| 67行目: | 71行目: | ||
== 2022/9/18に報告したちばけんまについて == | == 2022/9/18に報告したちばけんまについて == | ||
{{main|長谷川幸恵#2022年9月18日}} | {{main|長谷川幸恵#2022年9月18日}} | ||
9/18に報告したちばけんまについてカラケーでは書ききれなかったものの身内には開示した内容をまとめます。更なる詳細は特定対策のため追って開示します。最上級教徒様の二の舞はよろしくない | <del>9/18に報告したちばけんまについてカラケーでは書ききれなかったものの身内には開示した内容をまとめます。更なる詳細は特定対策のため追って開示します。最上級教徒様の二の舞はよろしくない</del>開示内容は以下の通り | ||
* 当初の目的はチンターホンをピンポンダッシュすること | |||
* 朝の8時頃に現地入りした | |||
** 交通手段については非開示。ただ少し非常識寄りの方法かも | |||
** 申し訳ないが具体的な実行日についても非開示 | |||
* わざと追い付かせた時すれ違いざまに「何逃げてんの」だか「何で逃げるんだよ」だとか言われた気がする | * わざと追い付かせた時すれ違いざまに「何逃げてんの」だか「何で逃げるんだよ」だとか言われた気がする | ||
** マンコーが本当は何を言ったのかは不詳。ちばけんまして聞いてみてくれ | ** マンコーが本当は何を言ったのかは不詳。ちばけんまして聞いてみてくれ | ||
** ガソリンスタンドまで逃亡したら帰っていった。自転車乗ってたくせにやる気あったの? | |||
* 多分越後屋のエプロン着て接客している男がマンコー | * 多分越後屋のエプロン着て接客している男がマンコー | ||
** ちばけんまの数ヶ月前に開示丼を食しました。おいしかったです | ** ちばけんまの数ヶ月前に開示丼を食しました。おいしかったです | ||
* 本当は8/10に行く予定だった | * 本当は8/10に行く予定だった | ||
** 交通費を工面できなかったから<!-- | ** 交通費を工面できなかったから<!--代わりに野獣邸けんまをしているが、出回っている映像には全く写ってないからセーフ--> | ||
* 実は顔を隠す用にお面を持っていった | * 実は顔を隠す用にお面を持っていった | ||
** 使用機会、無し!w | ** 使用機会、無し!w | ||
** ガイ・フォークス・マスクというアノニマスで有名なアレ | ** ガイ・フォークス・マスクというアノニマスで有名なアレ | ||
* 国セコとの遭遇は無かった | |||
** 多分長谷川家は呼ばなかったのだろう | |||
== メモ欄 == | == メモ欄 == | ||
archiveiya74codqgiixo33q62qlrqtkgmcitqx5u2oeqnmn5bpcbiyd.onion | archiveiya74codqgiixo33q62qlrqtkgmcitqx5u2oeqnmn5bpcbiyd.onion<br> | ||
twitter3e4tixl4xyajtrzo62zg5vztmjuricljdp2c5kshju4avyoid.onion | twitter3e4tixl4xyajtrzo62zg5vztmjuricljdp2c5kshju4avyoid.onion<br> | ||
[[利用者:Kirari1192/Koushinism_for_Beginners]] | |||
== 恒心教リッピング路線 プログラミング講座 == | |||
当職らの集団の使っていたAmazonアカウントが姪になったので新しいクレカが届くまでの間暇だからという理由でここで駄文を並べるナリ<br> | |||
なぜこんなことをやるのかというと恒心教リッピング路線であることを伏せて必要に応じてOSS貢献もしているからですを<br> | |||
なおこれは不定期の模様 | |||
プログラミングの基本をある程度把握していることを前提とするナリ<br> | |||
難しくはならないように頑張りますを<br> | |||
OSS担当が扱える言語の関係上言語はPythonとKotlinになりますを | |||
コンソール上で同じことをするにはKotlinであれば<code>kotlinc-jvm</code>コマンド、Pythonであれば<code>python3</code>か<code>python</code>コマンドでREPLが立ち上がりますを<br> | |||
下にあるコードの内<code>>>> </code>で始まるコードを<code>>>> </code>を除いてコピペすれば同じコードを動かせますを<br> | |||
とりあえず取り急ぎ | |||
バリュケーを含めここ以外では書いていないので注意して欲しいナリ<br> | |||
ここ以外で見かけたらそれは荒らしナリよ 処遇については各管理人で決めてほしいですを | |||
唐澤貴洋Wikiとの出会いに感謝 | |||
=== 2022/10/30 一文字ごとに繰り返す === | |||
[[神聖六文字|唐澤貴洋殺す]]は恒心教徒なら誰でも知っているだろうと思うナリ その日何か悪いことが起これば唐澤貴洋に怒りをぶつけることで皆が皆に優しい世界を祈る、これはいい。 | |||
さて、普通であれば神聖六文字を複数回唱える時は単純に「唐澤貴洋殺す唐澤貴洋殺す唐澤貴洋殺す...」とするナリが、ここでは少し捻って「唐唐唐唐唐澤澤澤澤澤貴貴貴貴貴洋洋洋洋洋殺殺殺殺殺すすすすす」のように一文字づつ繰り返すことを考えてみるナリ | |||
とは言え単純にこうしても最初に示したような繰り返しになるナリ | |||
(Python) | |||
>>> '唐澤貴洋殺す'*5 | |||
'唐澤貴洋殺す唐澤貴洋殺す唐澤貴洋殺す唐澤貴洋殺す唐澤貴洋殺す' | |||
(Kotlin) | |||
>>> "唐澤貴洋殺す".repeat(5) | |||
res2: kotlin.String = 唐澤貴洋殺す唐澤貴洋殺す唐澤貴洋殺す唐澤貴洋殺す唐澤貴洋殺す | |||
そこで、今何しようとしているのかを噛み砕いて考えてみるナリよ | |||
* 文字列を文字ごとに分解したい (唐, 澤, 貴, 洋, 殺, す) | |||
* 分解した文字を繰り返す (唐唐, 澤澤, 貴貴, 洋洋, 殺殺, すす) | |||
* 結合する (唐唐澤澤貴貴洋洋殺殺すす) | |||
この過程は非常に重要ですを<br>これによって何をどうするかという検討ができるナリ | |||
初めに「文字列を文字ごとに分解したい」という点について考えてみるナリ<br> | |||
これについては、ここで扱う言語では文字列は「イテレーター」として扱われており難しいことを考える必要はないですを | |||
<div class="toccolours mw-collapsible mw-collapsed"> | |||
「イテレーター」について解説 | |||
<div class="mw-collapsible-content"> | |||
配列や文字列のような何かの並びを表すオブジェクトにおいて、その並びを最初から最後まで一個づつ取り出していく(反復する)概念/オブジェクトのことを指しますを<br> | |||
取り出される各項目は要素と言われるナリ<br> | |||
これで何が出来るかと言うと例えば数列の合計を計算したりある一定の条件に合う項目を流れ作業で数えることも出来るナリ | |||
</div></div> | |||
これによって1文字ごとに取り出すことができるので、各要素を繰り返しにすれば「分解した文字を繰り返す」ことが出来るナリ<br> | |||
以下の例では5回繰り返す場合を示しますを | |||
(Python) | |||
>>> [x*5 for x in '唐澤貴洋殺す'] | |||
['唐唐唐唐唐', '澤澤澤澤澤', '貴貴貴貴貴', '洋洋洋洋洋', '殺殺殺殺殺', 'すすすすす'] | |||
(Kotlin) | |||
>>> "唐澤貴洋殺す".map({a->a.toString().repeat(5)}) | |||
res5: kotlin.collections.List<kotlin.String> = [唐唐唐唐唐, 澤澤澤澤澤, 貴貴貴貴貴, 洋洋洋洋洋, 殺殺殺殺殺, すすすすす] | |||
Pythonでは文字列から一文字取り出しても「長さ一文字の文字列」という扱いなのに対し、KotlinやJavaでは「文字」(Char)型に変わるナリ<br> | |||
このため、Kotlinでは「長さ一文字の文字列」に変換するために<code>.toString()</code>を入れていますを<br> | |||
Pythonでは文字列に対して掛け算をすることでその数値の分だけ繰り返しさせることができますを<br> | |||
Kotlinでは文字列型に<code>repeat()</code>という関数があるのでこれを使う [[それはできるよね。]] | |||
最後は各文字列が入った配列を結合するナリ<br> | |||
両方に結合する関数が存在するものの、呼び出しの主従関係が違うので気をつけるナリよ<ref>OSS担当より: Pythonの呼び出し方は少数派らしい。Kotlinのように配列やリストに対して呼び出して文字列を指定する書き方のほうが多数派とか</ref><br> | |||
こういった結合系の関数では要素同士の間に何を入れるか指定できるナリが、ここでは[[唐澤貴洋|空]][[空は何色か|文字]]列にするナリ | |||
(Python) | |||
>>> <nowiki>''.join(x*5 for x in '唐澤貴洋殺す')</nowiki> | |||
'唐唐唐唐唐澤澤澤澤澤貴貴貴貴貴洋洋洋洋洋殺殺殺殺殺すすすすす' | |||
(Kotlin) | |||
>>> "唐澤貴洋殺す".map({a->a.toString().repeat(5)}).joinToString("") | |||
res6: kotlin.String = 唐唐唐唐唐澤澤澤澤澤貴貴貴貴貴洋洋洋洋洋殺殺殺殺殺すすすすす | |||
こうして目的は達成できたナリよ 唐唐唐唐唐澤澤澤澤澤貴貴貴貴貴洋洋洋洋洋殺殺殺殺殺すすすすす | |||
<div class="toccolours mw-collapsible mw-collapsed"> | |||
発展編: 縦書きカラコロ | |||
<div class="mw-collapsible-content"> | |||
要素同士の間に改行を入れるようにすると縦向きのカラコロを出力できるナリ | |||
(Python) | |||
>>> print('\n'.join(x*5 for x in '唐澤貴洋殺す')) | |||
唐唐唐唐唐 | |||
澤澤澤澤澤 | |||
貴貴貴貴貴 | |||
洋洋洋洋洋 | |||
殺殺殺殺殺 | |||
すすすすす | |||
(Kotlin) | |||
>>> "唐澤貴洋殺す".map({a->a.toString().repeat(5)}).joinToString("\n") | |||
res7: kotlin.String = 唐唐唐唐唐 | |||
澤澤澤澤澤 | |||
貴貴貴貴貴 | |||
洋洋洋洋洋 | |||
殺殺殺殺殺 | |||
すすすすす | |||
これはいい。唐澤貴洋短冊にして殺す | |||
</div></div> | |||
=== 2022/11/2 正規表現 初歩 === | |||
貴職は何かのWikiのあるページから一定の条件に合う名前を探したいとするナリよ<br> | |||
例えば[[唐澤貴洋|唐澤]]で始まって[[唐澤洋|洋]]で終わるような名前ナリ<ref>現在MediaWikiには正規表現検索機能は無いので対象として使いやすい名前からとしました。貴洋なんて名前を付けた厚子が悪い</ref> | |||
そういう時は正規表現(regular expression)を使って検索出来るナリ<br> | |||
〇〇で始まって⚫⚫で終わるという指定の他繰り返し回数も指定できる、これはいい。 | |||
正規表現において、指定した表現に合致することをマッチする、と言いますを<br> | |||
以下、Pythonでは<code>import re</code>があるものとしますを とりあえず取り急ぎ | |||
==== リテラル ==== | |||
まずは正規表現の基本から始めますを リテラルは特殊ではない文字か(正しく)エスケープされている文字列を指しますを<br> | |||
Pythonでは<code>re.match</code>、Kotlinでは<code>toRegex().matches()</code>でマッチを試すことが出来るなりを またmatchの後を見ると何とマッチしたかが分かる、これはいい | |||
(Python) | |||
>>> re.match(r'唐澤洋', '唐澤貴洋') | |||
>>> re.match(r'唐澤洋', '唐澤洋') | |||
<re.Match object; span=(0, 3), match='唐澤洋'> | |||
(Kotlin) | |||
>>> "唐澤洋".toRegex().matches("唐澤貴洋") | |||
res0: kotlin.Boolean = false | |||
>>> "唐澤洋".toRegex().matches("唐澤洋") | |||
res1: kotlin.Boolean = true | |||
Pythonでは<code>re.Match object</code>が、Kotlinでは<code>= true</code>と出ている方がマッチしている方ですを<br> | |||
これを見て分かる通り、唐澤貴洋の方にはマッチしていないことは明白。これはいけない | |||
==== 文字集合 ==== | |||
[[唐澤貴洋|????]]「唐澤貴洋にもマッチさせろナリ!」<br> | |||
ヤーマン「駄目です」<br> | |||
[[唐澤貴洋|????]]「あブ」 | |||
とはならないのでだから安心だから安心だから安心 | |||
マッチさせる文字集合について考えるナリ<br> | |||
文字集合というのはマッチさせる(させない)文字の範囲のことですを<br> | |||
当然全ての文字にマッチというのも存在するナリ | |||
例えば「貴」と「洋」だけとしたりとか、もしくは[[山岡裕明|「裕」と「明」]]<ref>淫乱乳首はお呼びでないので答えだけ書きます。<code>[^裕明]</code>とすればできます。<code>^</code>は指定した文字集合を反転するという意味になります。誰とは言わんが早く解放しろ乳首</ref>以外にマッチさせるということができますを<br> | |||
「貴」と「洋」のように文字集合を指定するなら角括弧で囲んで<code>[貴洋]</code>とすれば良いですを<br> | |||
AからZまで全部対象に入れたいのであればハイフンを使って<code>[A-Z]</code>のように表現出来るナリ<br> | |||
当然<code>[A-Z貴洋]</code><ref>この例ではAからZまたは貴洋から一文字の合計一文字だが、<code>[A-Z][貴洋]</code>とすると、AからZまでの一文字と貴洋のいずれか一文字の合計2文字にマッチする。集合一個が文字に相当するので注意</ref>のように合体させることも出来るナリよ なおA-Zは一体なので<code>[A-貴Z洋]</code>のようにごちゃまぜにしては別の意味になってしまう。これはいけない<ref>ここでのハイフンは<strong>Unicodeコードポイント上での</strong>範囲を指すため、こうしてしまうとA(U+0041)から貴(U+8CB4)という相当広い範囲に加えてZ(U+005A)と洋(U+6D0B)という"A-貴"の範囲に入るためほぼ無意味な指定が続くという構図になる。これはいけない</ref> | |||
これを踏まえて正規表現の途中に文字集合を入れるとこのようになるナリ | |||
(Python) | |||
>>> re.match(r'唐澤[貴洋]洋', '唐澤貴洋') | |||
<re.Match object; span=(0, 4), match='唐澤貴洋'> | |||
>>> re.match(r'唐澤[貴洋]洋', '唐澤洋') | |||
(Kotlin) | |||
>>> "唐澤[貴洋]洋".toRegex().matches("唐澤貴洋") | |||
res0: kotlin.Boolean = true | |||
>>> "唐澤[貴洋]洋".toRegex().matches("唐澤洋") | |||
res1: kotlin.Boolean = false | |||
全ての文字<ref>(ここでは扱わない)フラグによるが、改行文字も含む</ref>にマッチさせたい時は<code>.</code>一文字で出来るナリ | |||
(Python) | |||
>>> re.match(r'唐澤.洋', '唐澤貴洋') | |||
<re.Match object; span=(0, 4), match='唐澤貴洋'> | |||
>>> re.match(r'唐澤.洋', '唐澤洋') | |||
(Kotlin) | |||
>>> "唐澤.洋".toRegex().matches("唐澤貴洋") | |||
res0: kotlin.Boolean = true | |||
>>> "唐澤.洋".toRegex().matches("唐澤洋") | |||
res1: kotlin.Boolean = false | |||
しかし今度は唐澤洋にマッチしないナリ | |||
==== 量化指定子 ==== | |||
[[唐澤貴洋|????]]「次は両者にマッチするようにするナリ、当職はどれを使えば良いナリか」 | |||
* <code>*</code> - 0回以上無制限 | |||
* <code>+</code> - 1回以上無制限 | |||
* <code>?</code> - 0回以上1回以下 | |||
* <code>{n}</code> - 丁度n回 | |||
* <code>{n,}</code> - n回以上無制限 | |||
* <code>{n,m}</code> - n回以上m回以下 | |||
[[唐澤貴洋|????]]「あブ」<sub>(シンキングタイム: 哀れなデブを横目に何を使うか考えてみよう)</sub> | |||
量化指定子は文字や文字集合などの後に付けるナリ またmやnは実際に正規表現に使う時は数値(例: <code>{334,40298}</code>)に置き換える必要があるナリ | |||
正解発表ナリ<br> | |||
最短という面では正解は<code>?</code>ですを 「0回以上1回以下」は「存在してもしなくても良い」と考えて欲しいですを(以下Kotlin省略) | |||
(Python) | |||
>>> re.match(r'唐澤.?洋', '唐澤貴洋') | |||
<re.Match object; span=(0, 4), match='唐澤貴洋'> | |||
>>> re.match(r'唐澤.?洋', '唐澤洋') | |||
<re.Match object; span=(0, 3), match='唐澤洋'> | |||
>>> re.match(r'唐澤.?洋', '唐澤死洋') | |||
<re.Match object; span=(0, 4), match='唐澤死洋'> | |||
この場合、.に?の量化指定子を使用したので唐澤と洋の間にどんな文字でも入れられますを | |||
どんな長さの文字列が入っても良いなら<code>*</code>を使いますを | |||
(Python) | |||
>>> re.match(r'唐澤.*洋', '唐澤貴洋ナイフで滅多刺しにして殺す。洋、お前もだ') | |||
<re.Match object; span=(0, 19), match='唐澤貴洋ナイフで滅多刺しにして殺す。洋'> | |||
>>> re.match(r'唐澤.*洋', '唐澤洋') | |||
<re.Match object; span=(0, 3), match='唐澤洋'> | |||
>>> re.match(r'唐澤.*洋', '唐澤死洋') | |||
<re.Match object; span=(0, 4), match='唐澤死洋'> | |||
量化指定子を使いつつ最短でマッチさせたい場合は、量化指定子に続けて<code>?</code>を付けるナリよ (唐澤貴洋のみにマッチすることに注目) | |||
(Python) | |||
>>> re.match(r'唐澤.*?洋', '唐澤貴洋ナイフで滅多刺しにして殺す。洋、お前もだ') | |||
<re.Match object; span=(0, 4), match='唐澤貴洋'> | |||
当然全ての量化指定子はリテラル(文字)にも使えますを | |||
(Python) | |||
>>> re.match(r'唐澤貴?洋', '唐澤貴洋') | |||
<re.Match object; span=(0, 4), match='唐澤貴洋'> | |||
>>> re.match(r'唐澤貴?洋', '唐澤洋') | |||
<re.Match object; span=(0, 3), match='唐澤洋'> | |||
>>> re.match(r'唐澤貴*洋', '唐澤貴貴貴洋') | |||
<re.Match object; span=(0, 6), match='唐澤貴貴貴洋'> | |||
==== まとめ ==== | |||
OSS部員が疲れたと言うのでここで終わりになってしまうナリが、正規表現の基礎中の基礎はなんとか理解できると思うナリ<br> | |||
分からないことがあれば議論ページで質問してくれれば<del>OSS部員に丸投げして</del>答えるナリ | |||
正規表現はもっと奥深い世界なので興味を持った芋はもっと調べてみることを切に望む<ref>取材注: なお当の部員はHTMLの正規表現とHTMLの2つとにらめっこして頭の中でマッチとか修正したり、HTMLやその他コードを見て正しく切り出せるであろう正規表現で一発で書けるらしい。バケモンか?</ref>。 | |||
=== 2022/11/4 文字列? バイト配列? エンコーディング? === | |||
文字化けはインターネットで日本語に限らずマルチバイト文字が関係する環境であれば誰でも見たことがあると思うナリ<br> | |||
"蜚先セ、雋エ豢区ョコ縺�" 文字化けだからセーフ | |||
文字化けはなぜ起こるナリか? 理由は簡単で出力したときのエンコーディングと読み込むときのエンコーディングが違うからナリ<br> | |||
今回は文字列とバイト配列の違い、そしてエンコーディングがどう関わってくるかについて考えるナリ<br> | |||
今回はPythonだけとさせて頂くナリ とりあえず取り急ぎ | |||
==== 文字列 ==== | |||
[[唐澤貴洋|????]]「まずは『文字列』について考えるナリ。これは何ナリか」 | |||
文字列は一繋がりの文字の並びを指すナリ。例えば"唐澤貴洋Wiki"は文字列ですを<br> | |||
別の観点から見れば文字配列のようにも考えることができますを<ref>Cでは正にそのようになる。また他の言語でも内部的には文字型の配列を持っていることが珍しくなく、Java 9以前のJavaはその一例と言える</ref> | |||
"文字"を数値と見ると、よくあるものは16ビット数値<ref>Goのように文字型が32ビットになる言語も存在する。</ref>として見なすナリ<br> | |||
これは文字コード<ref>大体Unicodeである</ref>を直接記憶するためにその程度のビット数を確保する必要があるからですを | |||
(Python) | |||
>>> ord('唐') | |||
21776 | |||
>>> ord('澤') | |||
28580 | |||
>>> ord('貴') | |||
36020 | |||
>>> ord('洋') | |||
27915 | |||
>>> ord('殺') | |||
27578 | |||
>>> ord('す') | |||
12377 | |||
==== バイト配列 ==== | |||
バイト配列は一繋がりのバイトの並びを指すナリ バイト(byte)とは通常は8ビット数値<ref>通常は、と書いたのは7ビットや9ビットの環境もあるという意味だが、これらは主にメインフレームなどで使われているものであるため考えない</ref>を指し、符号付き(signed)では-127~127、符号なし(unsigned)では0~255までの範囲を表せる数値型ナリ | |||
Pythonでは文字列(str)とバイト配列(bytes/bytearray)が非常に似た型になっていて紛らわしいナリが本来は全くの別物ナリ | |||
この表現はファイルに書き込んだり、外部と通信する時に使いますを | |||
(Python) | |||
>>> b'I will kill Takahiro Karasawa' | |||
b'I will kill Takahiro Karasawa' | |||
>>> b'I will kill Takahiro Karasawa'.hex() | |||
'492077696c6c206b696c6c2054616b616869726f204b61726173617761' | |||
1バイトを16進数にすると丁度2文字になるので色々と都合の良い表現と言えるのが特徴ナリね | |||
==== エンコーディング ==== | |||
では文字列をファイルに書き出したい時はどうするかについて考えるナリ<br> | |||
文字そのものをファイルに書き出すとは言ってもバイト配列に変換しなければならないナリ | |||
その文字列をバイト配列に変換する方式のことをエンコーディング(encoding)と言いますを<br> | |||
このエンコーディングが出力時と読み込み時で異なると文字化けするナリよ | |||
(Python) | |||
>>> '唐澤貴洋殺す'.encode('euc-jp').decode('sjis') | |||
'ナ籬キオョヘホサヲ、ケ' | |||
一例として[[唐澤貴洋殺す]]を色々なエンコーディングで表現したらこのようになるナリ (bytesのままでは見づらいため16進数に変換) | |||
(Python) | |||
>>> for enc in ('utf-8', 'utf-16', 'sjis', 'euc-jp'): | |||
... print(f'{enc}: {"唐澤貴洋殺す".encode(enc).hex()}') | |||
... | |||
utf-8: e59490e6bea4e8b2b4e6b48be6aebae38199 | |||
utf-16: fffe1055a46fb48c0b6dba6b5930 | |||
sjis: 9382e0568b4d976d8e4582b7 | |||
euc-jp: c5e2dfb7b5aecdcebba6a4b9 | |||
日本語のウェブサイトでも今はUTF-8が主流ナリが過去にはShift-JISやEUC-JPが主流だった時代もあり、エンコーディングというのは現代では非常に重要な概念になっているのは間違いないですを | |||
=== 2022/11/6 浮動小数点数と浮動小数点演算 === | |||
コンピュータでの小数の取り扱いはそう簡単な話ではないナリ<br> | |||
例えば0.1という数を考えるナリ<br> | |||
5倍すれば0.1×5で0.5<ref>念の為に書いておきますが、何のとんちや引っ掛けもありません。単純な算数の話です</ref>、それは分かるよね? | |||
でもコンピュータの世界ではそうは行かないナリ | |||
(Kotlin) | |||
>>> 0.1f.toDouble() | |||
res12: kotlin.Double = 0.10000000149011612 | |||
>>> 0.1f.toDouble()*5 | |||
res13: kotlin.Double = 0.50000000745058060 | |||
コンピュータ上での0.1の扱いが強調されるように少し加工しているナリが<ref>KotlinなのかJavaのせいか不明だが、そのままやるとちゃんと0.5が出てくるので32ビット浮動小数点数(単精度)を64ビット(倍精度)に変換した</ref>、浮動小数点の世界では0.1を含む様々な小数点以下の値を厳密に保管できないですを | |||
これは浮動小数点の内部的な表現と2進数と10進数の変換に起因しているナリ<br> | |||
コンピュータに載っているCPUは{{wpl|ja:IEEE 754|IEEE 754}}形式に従って小数を表現していますを<br> | |||
細かいことに関してはMuyopediaのリンク先を見て欲しいナリが、大まかには符号部、指数部、仮数部の3つで成り立っていますを<br> | |||
0.1は2進数表現をすると循環節<ref>ある周期で永遠に繰り返すこと</ref>が発生するナリ そのため一定の桁数で表せないことから上で示したように誤差が発生しますを | |||
これが倍精度(64ビット)IEEE 754表現での0.1ですを | |||
(Kotlin) | |||
>>> 0.1.toRawBits().toString(2).padStart(64, '0') | |||
res22: kotlin.String = 0011111110111001100110011001100110011001100110011001100110011010 | |||
この数の仮数部は<code>1001100110011001100110011001100110011001100110011010</code>ナリ<br> | |||
ほぼ最後まで1001の繰り返しになっていることが分かると思うナリ これはいけない | |||
同様の理由で、大きな整数も浮動小数点数で表現できないですを<br> | |||
1234567890430440987654321という数を例に取るナリ<br> | |||
上が倍精度浮動小数点数、下が本来の2進数表現とそのビット数ナリ | |||
(Kotlin) | |||
>>> "1234567890430440987654321".toDouble().toRawBits().toString(2).padStart(64, '0') | |||
res45: kotlin.String = 0100010011110000010101101110000011110011011110111101011101111001 | |||
>>> "1234567890430440987654321".toBigInteger().toString(2) | |||
res47: kotlin.String = 100000101011011100000111100110111101111010111011110010001111111110111100010110001 | |||
>>> "1234567890430440987654321".toBigInteger().toString(2).length | |||
res48: kotlin.Int = 81 | |||
倍精度浮動小数点数の仮数部は52ビットなので、その仮数ビットに収まりきらない程の桁を入れようとしていたことが分かるナリ<br> | |||
これを<strong>桁落ち</strong>と言いますを 桁落ちは誤差の原因になるナリ | |||
同じ現象を引き起こす例として、大きな数と非常に小さい小数を足す場合があるナリ | |||
(Kotlin) | |||
>>> 43044.toDouble()+0.000000000005 | |||
res4: kotlin.Double = 43044.00000000001 | |||
浮動小数点数は整数部と小数部を自由自在に融通できて便利という面がある一方、小数点では循環節が発生して表現しきれないことがあるなど一長一短ナリ<br> | |||
通常の使い方では倍精度浮動小数点数で十分ナリが、言語によっては任意精度演算も可能なので必要に応じて使い分けることを切に望む。 | |||
==== プログラミング講座について ==== | |||
恒心教リッピング路線の原状復帰の目途が立ったので今回で終了ナリ 皆様との出会いに感謝<br> | |||
質問はいつでも受付けているナリ ではさよなら法政二中 またどこかでお会いしましょう | |||
== 脚注 == | |||
<references /> | |||