#099 実はコンピュータって間違えるらしいぜ? エンジニアなら知っておきたいコンピュータの誤り訂正能力!!
2022/12/11 ·
-
ガイチ君はいちょっとここの書類これ間違えてるねここあすいません間違えちゃいました間違えちゃいました?気が緩んでるんじゃないのかい?本当に間違えてますか?はいどこをどう間違えてました?ここシングルコートじゃなくてアポストロフィーですアポストロフィーわかるかいそれはわかるかい気が緩んでるっぽいからすいませんちょっとオフィスの周りあの1024周してきてもらっていいですか?ちょっと待ってくれ
-
あとそれが終わったら2048回腕立てしないとねえ?怖っ何ビット?8と16違うか17かビットに繋がるよね良かったですということで今日はですねちょっと何の話だ?コンピューターにおける裏側で動いているロジックの一つに誤り訂正符号というものがありますと誤り訂正符号はい
-
これは読んであのごとく誤りを見つけて訂正してくれるという素敵なロジックでございますとロジック訂正してくれるロジックがあるんですねそうなんですコンピューターの裏側ではい
-
コンピューターって計算するのが主な目的ですよね そうですねなんですけど計算した結果ってどっかに送ったりとか保存したりしないとダメじゃないですかそうですねそうやって使いますねそうなのでどんだけ正確に計算できても正しく送れなかったりとか 正しく保存できなかったら計算正確にした意味ないんですよ
-
直感的にはそれそうだろうと思うんですけど言うて電線で電気信号送ってるだけじゃないですか謝るとは謝るとは
-
ここで昔話が一個入ります昔昔ねあるところにベル研究所というところに急にリアルな研究所が出てきたリチャードハミングという男が働いておりましたと彼はね不幸なことに週末しかコンピューターを使えなかったんですね昔あるあるなのかなきっと当時貴重だったんだろうねコンピューター自体がなんですけどその貴重な週末
-
になんとコンピューターがですね2週連続でクラッシュしてしまいまして 何もしてないことになりにけりとこわその世界こわでまぁ彼は非常に怒ったと なんでお前こんな貴重な機械なのにぶっ壊れるんだと当然の怒りでぶっ壊れたってことはなんかまあ誤りがあったっていうことですよね はいでまぁそれがなんかわかるなら直せなきゃおかしいだろう
-
って思ってそういった背景から生まれたものがこの誤り訂正符号ですとさっき言ってた通り電気信号送ってるだけじゃないですかって言ってたんですけど意外とですね電気信号なのでちょっとネットワークの勉強とかするとあれなんですけど電気信号って減衰するじゃないですかノイズ入ったりとか
-
どういうことですか?弱くなっていったりとかあとノイズ入っちゃったりして実は間違った情報を送っちゃうこともあるんですね普通に小学校の時にやった科学の実験レベルで乾電池に豆電球をつなぎますだと別に減衰もしないし電気がついたり消えたりしないじゃないですかはい
-
でもネットワークぐらいの距離になると話は別だとそうですよネットワーク考えてみてください地球を覆ってるんですよサッカーボール入れるネットみたいな感じもっと細かい多分もっと細かいもっと細かいんだちょっとその細かさの理由は知らないんですけど数キロ単位で例えば銅
-
どうって結構電動率高いって言われてますけど99点何パーぐらいとかそれが数キロになるとだんだん抵抗に負けて電力さんがもうこれ以上進めないよっていう状況になるみたいなことを減衰って言ってるってことですねそうですなんですけどちょっとその減衰とかが原因で誤ってるかどうかちょっと知らないんでどう
-
どうなんですかそういうのありますしジバとかその辺で電気ってちょっと変わりますからねなるほどねぐるぐる巻きのコイルに磁石近く入れたりとかすると電気生まれるよねみたいなあれがノイズになるわけですねああいうのとかですよねいろいろあるんでしょうねそういうのがあってですね意外と正しく送れないよってことがあるんですよなので
-
それを見つけて直せなきゃコンピューター使い物にならないじゃん説でもめちゃむずそうですねそれ
-
ウェブAPIで例えるとゲットリクエスト来たわってサーバー君は思ってるだけだけど実はポストだったんだっていうのをサーバー君は気づかなきゃいけないみたいな話ですよねそこまで綺麗に変わるかどうかは別として多分ですけどこの前も使った銀行の送金の例でいきますよ1万円AさんからBさんに1万円送りましたとでもそこでノイズが入って間違えて
-
5万円送られましたみたいな1のところが5に変わっちゃったみたいなはいはいはいはいはい嫌じゃない?嫌というかありがとうって思いますけどね受け取った方がBさんからしたらいいんですけどねAさんからしたら嫌じゃないって話じゃないですか銀行としても嫌ですねそう銀行としても嫌だしだからそういうサービスはいっぱいあるよねと変わっちゃいけないのがはいはいはいということでですね今日はそれを訂正する誤り訂正不合というものをちょっと歴史とともに追っていこうかなという
-
なるほど感じでございますこれはじゃあ通信がどんどんなんかあのこいつこうやって表示してくれてるけど裏側でこんなに頑張ってやってくれてんだなよしよしって気持ちになるんですねいやならんかもしれない可愛いタイプじゃない可愛いタイプじゃないですね確かにっていう系分かりました勉強になるんですねじゃあ確かにっていう感じですねはいはいはいってことで今回はちょっとね4つに分けてやっていこうかな4つはいトリックをはい
-
その1反復トリック繰り返すだけこれはもう一番基本的なテクニックですね名前のまんまなんですけど何回も送ります
-
なるほど誤り率って言ってもほとんど間違って送られちゃうよだったら話にならないんですけど言うて一部間違っちゃうよぐらいの感じじゃないですかなので送りまくったらそれぞれの文字とか桁で正しい値出る確率が高まるんでそこから確率的に導き出せるんですよ非常にシンプルはい
-
数打ち当たる本当にそれなのでそういう風にして正しさっていうのを担保できますよとただですねこのテクニックは小さいテキストだったら別に問題ないんですよなんですけど今って音声データとか動画とかになるとマジで何メガとか何ギガとかの世界じゃないですか数字で並べたら何個になるんだって世界ですね本当それよマジでパッと出てこないです8×1000×
-
1000×で今メガですよね1000×1000がまず10万80万ちょっとやばい桁になるね80万桁ドーンって送ってそりゃどっか間違えるさっていうそうだよね本当それだよねはい
-
なのでこの反復トリックはちっちゃいテキストなら問題ないけど巨大なデータにはちょっと現実的じゃないよと毎回どっか間違っちゃうからってことですねそうですそうですなのでその2ですねここからは結構似てるんですけど冗長性トリックというトリックがあります冗長性反復と何が違うんだ
-
これはですね反復は何回も送ってたじゃないですかこれも確かに冗長性といえば冗長性なんですけどこの冗長性トリックっていうのは送った文字を別の符号に変換するっていう別の長い符号に変換するっていうテクニックですとあれですか発習的な
-
あそこまで行っちゃった違うそれじゃないいやえーとねそれちょっと次の話だからやめとく発想としては合ってるんですけどはいあの今回はめっちゃシンプルにするためにはい例えば1,2,3っていう数字を送りたいと1,2,3はいはいっていう時に1をアルファベットの1にするんですよアルファベットというか英語のあーはいはいはい同じなんだろう内容だけど違う形式に変えるんですねそうそうそうはいで2に
-
2を当てますとTWO323っていう英語を当てますとでえーと
-
これをして送ると何が起きるかっていうと文字数単純に増えますよねでも誤る確率は変わらないんで一個一個の文字が例えばそうだな3文字に一個ぶち壊れるとするじゃないですかでなっても例えば1の中から1文字ぶっ壊れて2の中から1文字ぶっ壊れて3の中から1文字ぶっ壊れるだけなんで実はぶっ壊れてもある程度予測つくんですよあーまあ確かに数字の1,2,3よりは
-
復元できそうな気がしますね数字の1,2,3だとその数字が入れ替わった瞬間も原型が分からなくなってしまうんですけどこの符号に置き換えるっていう方法を使うと文字がちょっと長くなるんでそこが一回送っただけでも安全性担保できると正確性か頭いい
-
頭いいよねこれこれすごいんですよこれを専門用語的に言うと置き換え前の数字のことをシンボルって言って置き換えた文字のことを符号って呼んだりするんですねわかりづらわかりづらシンボルってたまに出てくるけど毎回わかりづらっていう冗長性トリックがありますよとでもこれも実際に運用するってなるとちょっとむずいんですよ
-
いや難しくはないかシンボルと符号のひも付けどうするんだ問題ってことですか実際の数字ってコンピューターでやり取りされてる情報って結局01の数字だけでやってるじゃないですかそうですねなので冗長化すると結構ファイルでかくなるしそうですね通信量も増えそうだしそうなんですはいっていうので冗長性トリックも一応使われてるテクニックらしいんですけどへー
-
まだちょっと回転の余地ありますよとはいはいはいはいでその3からですねこの辺からちょっと基本情報っぽくなりますお!じゃあちょっと噛み砕いていきます頑張ってはい
-
その3がねチェックサムトリックってやつですねチェックサムたまに聞くかなっていう単語ですねなんか足し算チェックしてそうですねそうですね本当その名前サム足し算それをチェックしてるんですけどここからねちょっと今まで誤り見つけて訂正するところまでやってたじゃないですか例えば複数回送るやつも確率で正しいやつ推測できるし
-
超調整トリックもなんとなくぶっ壊れる具合から分かるしっていう感じだったんですけどこのチェックサム
-
は誤りを検出するだけですねいやまあでもすごいよそれただそうすごいんですよただもう誤りがわかったらあと再送を依頼すればいいからあー確かになんで結構応用しやすいんですよこのチェックサムはねもう本当にねドシンプルですね例えば数字送りますじゃあ今回は579っていう数字を送るとしましょうってなったら
-
まず全部足すんですよ5 7 921です21なのでその1の位の1を末尾につけるだけですねじゃあ5 7 9 1に送るってこと?はい5 7 9 1で送りますとそうすると何か文字がぶっ壊れた時にその足し算の和と
-
それぞれの数字が違うってことが分かるので途中で何か誤りが起きたっていうことを検知できるようになるんですねなるほど最悪の場合分かんない場合もありそうですけど合計10増えちゃうと
-
そうわかんないんですけどその通りなんです10分の1の確率なんですそれはそうですねだいたいいけますねまあでも10分の1の確率で間違えられたらたまったもんじゃないたまったもんじゃないあのそうこれの弱点はですね非常にあの何でしょう追加するデータの量もめっちゃ少ないしそれが誤りチェックできるんですごく優秀なんですけど確かにただ一つまでしか誤り検知できないんですようんうんうんうん
-
1つだったらどの数字に変わっても多分大丈夫10増えないんでマックス9しか増えないんでなんですけど2つ以上の誤りがあったときにこのチェックサムっていうのが一致してしまうことがあるんでダメですよとさっき言った10とか20とか10の倍数で変わった場合ですねはい
-
ただチェックサムの考え方自体はすごい応用聞きやすくてめっちゃ優秀いろんな足し算とか掛け算を掛け合わせて複数桁つけたりすると誤りを複数個チェックできるようなチェックサムっていうのも用意できるんですね579だと足し算の1と掛け算の63×5だから結局5か多数とかってことですよねそう
-
ここは数学を応用すると複数個の誤りにも対応できるようになるんですけど頭良ただねこれちょっとメッセージ短くないとあんま有効じゃないんですよどういうことですか数字の数が増えれば増えるほどチェックしにくいもちろん誤りの件数も増えるんでチェックしにくいっていうのは作りづらいんですかというか多分
-
現実的じゃなくなるんじゃないかな複数箇所間違えるからってことですねさっきの80万桁とかだとさやばいじゃないですかそれを足し算だけで解決しようっていうのはちょっと無理があるとというので実際にはねこのチェックサムっていうのを応用して100桁以上のチェックサムをつけたりしてるらしいですねでもでもでも短いんじゃないですかそれでも
-
確かに短いね反復とか上昇に比べたらそこに使ってるのでメジャーなのが暗号学的ハッシュ関数というなんかむずそうだというか暗号学っていう言葉はワクワクしますけどね本当だよね暗号通信したいもんね暗号とかテンション上がるもんねそれ理系です本当ですか理系ですきっと
-
ハッシュ関数っていうのは簡単に説明しておくとハッシュ化するための関数ですとハッシュ化ハッシュ化というのはですね特定の文字がありますとそれをハッシュ関数にぶち込むとぐっちゃぐちゃの全然違う文字になるっていうやつですねこれの特徴はまず不可逆一発ハッシュ化したら戻せないですそこから元に戻せないです
-
さっきの言うていうある種579から1を導き出すみたいなみたいなもんですねでも1から579だったかどうかは分かんないっていうもっと複雑ですけどねもっと複雑です
-
であとは同じ文字入れたら同じハッシュ値になるあー本当にまさしくじゃあ579入れたら1位になるみたいな感じですね本当にそれだわマジでそれじゃん結局むずくなってるだけでさっきの理論と同じっすねこれ確かに
-
っていうのがハッシュ化の特徴ですねなのでよくパスワードの保存とかに使われますよねDBに入れるやつですかねユーザーのパスワードがデータベースに入っててエンジニアが見えちゃよくないんであれハッシュ化するんですよねましてや通信で送るのもよくないですしねよくないですねなのでパスワードはもう復元できなくなるんですけどあれですよね
-
同じ文字入れたら同じハッシュ値になるんで一致してるかどうかだけ確かめれるとそれに使ってるようなハッシュ関数を使うわけですよチェックサムとしてそうするとすごい改ざんが簡単に見つけられるようになるよというわけです改ざんというか誤りか誤りだね実際はこういうハッシュ関数を使ってチェックサムを運用してますと
-
ただまだこれで誤り見つけるだけなんで誤ってたら成功するまでリトライすればいいんですけどもう少しねピンポイントで誤りを見つけて訂正できるっていう最高のトリックがあるんでラスト4つ目ラスボス視点の最後の砦ピンポイントトリックというピンポイント命名がすごく素直ですねまあこれあの
-
素直ですどういうことですかまあまあまあこれは素直です素直な子なんですね素直な子ですこのピンポイントトリックはですねさっき言ってた数字あったじゃないですかあれを四角く並べるんですよ
-
四角くね1,2,3,4をイメージしてください今2×2のマスにポンポンポンって入りましたまだ一列で大丈夫です1,2,3,4を横に並べました1,2はそのままでOK3,4を1,2の下に持っていきましょう左上右上左下右下になるんですねなりますこれのチェックサムをえーとね
-
この表の右と下に出していきますそれぞれの縦横を足してなので1,2の隣にその足し算の3を置きますと隣っていうのは右側ですか右側です下の3,4の右に7を置きますと次その下列ですねなるほど下列には1と3の合計の4を入れますとその右の列縦か列
-
2と4なので6入れます4の下に入りましたね今っていう感じで二次元的にチェックサム出していくんですよあーなんか気持ちいいですね数字がポンポン入ってて数字がポンポン入ってて気持ちいいその感覚はちょっと分かんないんだけどうん
-
いいですかこれ斜めとかやらなくていいですか斜めは大丈夫です斜めはやらなくて大丈夫なんですよこれでチェックサム追加したものを最後一列に戻して送りますよっていうのがピンポイントトリックってやつですこれをすると縦列と横列で誤り検知できるんでどこが間違ってるかまずピンポイントで分かるっていうのとあとはそのハッシュ値
-
間違えたチェックサーブが2個出てるじゃないですかなので何が何っていう数字だったか復元できるんですよね確かにね2方向からチェックできるからそれができるってことですよねそうそうそうそうおー賢い伝わってるか分かんないけど伝わっててくれ伝わっててくれこれ2つ値があるからねXが簡単に計算できるんですよっていうトリックがこのピンポイントトリックってやつですと
-
実際はもうちょい多分複雑でさっきと同じように多分ハッシュ化使ったりとかなんかいろいろめちゃめちゃむずいことをやってると思うんですけどとりあえず二次元に並べてチェックサム出してるだけなんですよそっから複合もできちゃうとすごない?すごないこれって感じですねチェックサムの時点ですごいって思ってたけどでもなんかこれでちょっと疑問に思うのがさっきハッシュ化すると復元不可能みたいなこと言ってましたけどだから
-
復元はできないのかな発出化してないのかな発出化しない何かなのかもしれなくないですか多分ただ何なのかは分からんけどそこまでは詳しく追ってないんですけどちなみにこの仕組みのことは二次元パリティとかって言ったりするんで二次元パリティね二次元パリティたまに聞く単語パリティビットとかって聞きますよねパリティビットはあれだよねネットワークの時に見るよね見る
-
っていうテクニックを使うことによってですねっていうテクニックを使うことによってですね通信の誤りとか保存するときのミスとかを検知して修復してくれてるんですよ結局なんでしょうねサーバーからクライアントにウェブページ返すよって言ってベーンって通信したときに途中でなんかがあって本当に2ビットだとかはい
-
ちょっとだけ間違って送られてきた時にクライアント側でバーって修正して正しく今見れてるとみんなやってんだなじゃあこれすごいよねこれが日々の通信とかあと普通にCDとかDVDに保存する時とかもあれ普通に見せるらしいんで確かに見せりそうああいう時とかもやってるらしいですねへーこういう修復はへー
-
今まで全くこういうの知らないとコンピューターってすげえ正しく動くもんだって思ってたんだよねそうですよね裏側でこういう素晴らしいロジックが働いてるんだなっていうのを聞いて僕は感動しましたマジで泥臭いですよねすごい意外にこれだってねベル研究所で
-
ハミングさんがブチ切れてなかったら誕生してないかもしれないですからねそうですね確かに代わりの誰かがブチ切れてたかもしれないですけどまあでもそれはあるマジでそのレイヤーが結構低いじゃないですかこれだってもう多分物理層の話なのかな物理層の話だと思います多分そうですよねそこまで行くと大抵こんぐらい泥臭いですよね確かにそうねそれこそその1と0の信号を送ってるって言っても1秒間に
-
運満会読み込んでその運満会のタイミングで電圧がプラスかマイナスかみたいなのだけで判断してるだけじゃないですかそうねそれは間違えるさって思いますよね本当それよでもこれはね
-
なんかその泥臭さの割にこれはすごいシンプルな仕組みだなと思ってね多分ここにたどり着く前にいろいろあったんでしょうねきっと確かにこの方法あいやこの方法あいやっていうので今これに落ち着いたんでしょうねうんうんうんでもこの辺の話ってだって最近じゃなくてうんもう運10年前のうん頃にはもう確立されてる話じゃないですかそうそうねだってさっきのベルさんの話1940年とかだしやばすぎ
-
これに関わってるのはシャノンって人なんだよねシャノン?クロードシャノンシャノンエントロピーの人が色々やってるからそれもそうだと思う情報を
-
情報革命を起こしたみたいな人ですねその人の論文はコンピューター界のマグナカルタって呼ばれてるらしいですからマグナカルタがわからんマグナカルタは世界史で出てくる一番かっこいい名前の宝典ですねハンムラビ宝典じゃないですねハンムラビ宝典はかっこよくないなんかカレーみたいそれもわからんけどマハラジジャなのかわからんしないちょっとカレーっぽいからすげーなー
-
その人が書いたの多分1960年ぐらいかなその論文を書いたのが通信のなんとかかんとか理論みたいなやつ難しそうですねThe Theory of Communication某有名ポッドキャストで取り上げてたやつだみんな大好きなそうそうそうそう
-
意外にこういうお話って僕は大学行ってたんでやるんですけど大学行かないとやんないですよねプログラミングスクールじゃ絶対やんないですよねやんない
-
本当に情報基礎基本情報とか応用情報やった時にパリティとかチェックサム出てくるなぐらいのですよねふわっと振れますよねで丸暗記しますよねとりあえず丸暗記する意味わかんないままなんでこんなのつけてるのってずっと思ってたいやそうそうだからこういう話って結構貴重なんですよね貴重だねこれこれ以降ネットワーク関連の話聞く時にはこういう話と紐付けて考えれるようになるので
-
そうそうそうそうパリティビット来たらねパリティしてるねみたいな修復してるんでしょみたいなでもまあだから本当にごく稀に多分誤りは訂正されないで届くことはあるんでしょうねきっとあるらしいですただこのトリック使うとこの本によるとですね誤りを完全に取り除いたと言っても過言ではないくらい誤り率を減らせるらしいですまあねうん
-
完全にって言ったら過言だろさすがに過言かそんなことないでしょどうなんでしょうね本当に気にしなくてもいいレベルで謝りが起きるっぽいですよね本当かどうか知らないけどはい
-
机の上に石を置くじゃんでもなんか電子だか分子だかなんか分かんないけどすっごい低い確率ですり抜ける可能性があるみたいな量子力学の話ですね中学校の時めちゃくちゃ流行りました分子とか原子って動いてるんで熱くなるとうわーって動くんですけどそれがごく稀に机の原子を
-
すり抜けられる形になる時があるみたいな形というかそれが起こる可能性があるやっぱりっていうのもそうですしあともう一個あるのが1日に1回地球上の石ころの何かは同時に同じ方向に原子が動くんで勝手に動くらしいですそれぐらいの確率なんじゃないかなそのぐらいの確率ですねちょっと関係あるかないか分かんないんですけど僕今週メールで送られてきたPDFがぶっ壊れてて
-
壊れてるなってなって再送お願いしますできますかってお願いして全く同じものを全く同じ方法で送ってもらってそっちは開けたんで壊れたんかな途中でって思う出来事はありました
-
それじゃあすり抜けるぐらいじゃないすり抜けるぐらいかもしれない圧倒的にすり抜けるが低そうだねまあでもないですねいやでもそうだからちょうど今週本当になんか通信で壊れたのかなっていう出来事はありましたねでも確かにめっちゃたまにあるかもしれないそれめっちゃたまにですよね僕初めて社会人で全く同じ方法で送ってもらって今度開けたっていうのは初めてです
-
いや俺もね多分過去に1,2回経験したことあるかもしれない多分それって通信以外にも間にいろいろいるじゃないですかサーバーとか多分それで若干確率は上がってるんでしょうけどまあでもねあり得る話だと思ってる確かに大事だと思いますでも本当にそれぐらいレアなところまで引き下げてくれてるのはすごいことですよいやすごいそれはすごいありがとうございますこれあの
-
あれですかおすすめ書籍の話ですかおすすめ書籍の世界で最も強力なQのアルゴリズムという本から誤り訂正不合という章を引っ張ってきて紹介しておりますありがとうございますこれで過去も1回やったんで9分の2が
-
知ることができたあれ2しかやってないか逆に9分の2ですね6くらいやった気持ちで全然そんなことないトランザクションと誤り訂正不合の話ですね個人的には誤り訂正不合一番面白かったですねネットワークって実は面白いというかパソコンっぽくないことをやってる分野なのでちょっと感動した
-
小泉市長じゃないけどルーティングとか超面白いと思いますよマジで?ルーティング面白いの?ルーティング僕は面白いなと思いますでもそんなないかなそれこそノリさんも知ってる範囲かもしれないですけど郵便局みたいな方法でやってたりとかあと経路とかもちょいちょい変わるし定期的にここの通信の速度どんぐらいって経路決めたりもしますしへー
-
レイテンシーでうんちらかんちらみたいなうんちらかんちらとかそういうレイヤーの低いヘッドワーク層3層?その辺の低いレイヤーの話がどんだけ重要なのか分からないですけどなかなか普段触れる機会ないと思うのでこういうね聞いてれば学べるポッドキャストを聞いて学べになれたら良いなって思ってます確かになんか
-
これがじゃあプログラミングに役立つかって言われるとそんなこともないんですけど まあでもねなんか表面的なところを理解しているよりも話聞いた時にそれ以上理解できるってのは大事ですよってソフトスキルズでも言ってました おっ出ましたはい半年以上ぶりの久しぶりに登場 スキルズはいおすすめ書籍ですねはいというので今回は
-
誤り訂正不合でしたはいありがとうございます勉強になりましたじゃあカイチ君はこの後のランニングと腕立てということでうわー継続あれマジ?マジです数えないよ俺は1024誤っちゃうよ途中であーじゃあちょっと訂正不合入れてもらってめんどくせー
-
めんどくせえチェックサムつけてもらってね今101周だからチェックサムついてとりあえず2と1×0×1だから0にしとくかそしたら101から109まで全部0だなじゃあ何なら110も0だな桁数ちょっと多いからね少し多めにつけとかないとめんどくさ2次元パリティでいかないとねそっちも覚えらんねえわひまじんプログラマーではあなたのフィードバックを募集しています
-
ちょっとやりとりしたい人はメール気軽に送りたい人はGoogleフォームツイートをお願いします詳細は説明欄を見てくださいポッドキャストのフォローコメント評価してくれるとバカ騒ぎしますそれではまた次回
#099 実はコンピュータって間違えるらしいぜ? エンジニアなら知っておきたいコンピュータの誤り訂正能力!!