アルゴリズムで焼きなまし法みたいなのなかったかな
YoshikuniJujo
YoshikuniJujo@yoshikunijujo.github.io
npub1a7y7...fdm2
Haskell好き
foldlという関数を見ると、いろいろと話したくなるのがHaskellerの性なのだけど、まあすごく簡単に言うと、「昔はスペースリークの関係でfoldlではなくfoldl'を使えと言われていたけど、今はfoldlとfoldl'は同じものなのでfoldlを使えばいい」という話で、一周して意味のない話になる。
スリープソート
リストを返す版
{-# LANGUAGE BlockArguments #-}
import Control.Concurrent
import Control.Concurrent.STM
import Data.Function
sort :: [Int] -> IO [Int]
sort ns = do
c <- atomically newTChan
mapM_ (forkIO . single c) ns
threadDelay 1000000
atomically $ fix \go -> do
e <- isEmptyTChan c
if e then pure [] else (:) <$> readTChan c <*> go
single :: TChan Int -> Int -> IO ()
single c n = threadDelay (n * 1000) >> atomically (writeTChan c n)
sleep sortの単純な実装。結果はstdoutに出してる。
import Control.Concurrent
sort :: [Int] -> IO ()
sort ns = do
mapM_ (forkIO.single) ns
threadDelay 1000000
single :: Int -> IO ()
single n = threadDelay (n * 1000) >> print n
カリー化って厳密に言うとHaskellで言うカリー化と他の言語で言うカリー化とは、すこしズレてるように思ったことがある。忘れちゃったけど。
スリープソートは並行実行の説明をするときに、「スリープソートというのがありまして...」みたいに、つかみとして使えるかと
Haskell Brooks Curryさんは、とりあえず3つの言語に名前を残している。
Haskell
Brook
Curry
さらにカリー化とかカリー=ハワード同型対応などなど、「名前残しすぎ」問題。
ドーナツ
僕が3大ソートって勝手に呼んでるのが
マージ
クイック
ヒープ
だ。
どれも「分けて」から「組み立てる」というやりかたでO(n log n)を実現してるのだけど、どの時点で「比較と並べ替え」をしているかで見ると面白い。
マージソートは「分ける」ときはそのままで「組み立てのときに比較と並び替え」をしている。
クイックソートは「分けながら比較と並び替え」をしていて「組み立てる」ときにはそのままにしている。
でヒープソートは「分けるときと組み立てるときの両方」で「比較と並び替え」をしている。
ネタ枠としてはボゴソートとスリープソートあたりを覚えておけばいいかな。
ソートは「ひとつだけ覚えておく」ならマージソートがいい。クイックソートみたいな落とし穴もない優等生。
ソートは僕はヒープソートが好きなのだけど、でも時代はヒープソートを求めていないという。
アルゴリズム的にはすごい「美しい」。
「Haskellのクイックソート」警察です。


Zenn
TAOCPのソートアルゴリズムをHaskellで実装する
Jamiはpeer-to-peerなのだけど、接続したい相手を指定はどうするのかな。
固定IPが必要とかだとハードルが高い。
その部分だけ中央サーバがあるのかもしれない。
つまり、中央サーバにアカウントとIPアドレスを登録しておいて、接続したい側はそのサーバに問い合わせる感じか。
でIPアドレスがわかればあとはpeer-to-peerで接続できると思う。
Gentoo LinuxからWebカメラを使うのもずいぶん簡単になった。
emerge libv4l
としてから
qvidcap
ってするだけで、とりあえず動作確認ができた。
HaskellでStackを使ってると、カレントディレクトリ化に作られる.stack/下にだだーっていろんなパッケージがビルドされて、しかもバージョンアップごとにたまっていく。で、ビルドされるものなので速度も欲しいし容量も欲しいのでSSDにしてもHDDにしても、どうにも快適ではない。
Stackの仕様がそもそもHDD時代の「水と容量はただ」的考えかたから来てるのだと思う。
もうしばらく自作してないのだけど、このあいだドスパラでパンフレットだけもらってきた。
HDDからSSDへの移行って、人間がはじめて経験する「記憶容量の減少」な気がする。
「古いファイルを消さない」という習慣が身についていたので、ディスク容量がすぐ100%になってしまう。
よく使うファイルをSSDに置き、あまり使わないファイルはHDDに置くみたいな、そういう仕組みが必要。というこすでにあるんじゃないかって気はする。
そろそろPC1台組みたいなという気持ちもなくはないのだけど、場所取るんだよなー
小さいのだと選択肢がかなりせばまるし。
一時期はインテルのマザーボードがLinuxのインストールという観点から安心感があったけど、今はどうなのだろうか。
個人的にはPC光るのは嫌いではない。チープさが好き