haskdogs and hasktags
Table of Contents
Windows10 read QR code
とある雑誌を見ていたら、続きはこちらって QRコードが掲載されてた。URLの 記述は無し。しゃーない、悪魔的画面サイズのスマホでアクセスするか。眼に 毒だな。眼を いたわりましょう。じゃ、ipadかと思ったら、古すぎてQRコードの読み取りに は未対応。んな訳で
【Windows 10】パソコンで「QRコード」をスキャンする方法!
枠が出て来る訳でもなく、認識されるとURLが表示された。それをクリックす ると、ブラウザーが勝手に起動した。便利なんだか不便なんだか。まあ、スマ ホと同じインターフェースになっているんだな。
使いにくい点が有るので、改善依頼しとくか。
1. 認識した時、音で知らせてほしい。だって、原稿で画面が隠れて見えない 場合があるから。 2. 認識データの表示時間を例えば、5,10,20秒に設定できるようにしてほしい。 3. 認識エリアの枠を表示してほしい。QRコードが多数並んでいる場合、照準 を合わせ易いから。
提案しようとしたら、専用アプリをDLしろと言われた。いたずらの防止策か。 罵詈雑言モード。これを設計した連中、出てこい。おまえら、このアプリを真 剣に使った事有るのか。いずれも妥当な要求と思うぞ。1.は、本当に不便。スー パーのセルフ・レジでも、取り入れられているぞ。フィードバック重要。 2.は年寄からの要求。認識したら両手に持った原稿を脇に置いて、マウスを掴 んでクリック。もたもとしてると、消えてしまう。3.は、いわずもがな、だ。
独りよがりなシステム開発の背景に「利用のプロ」の不在、突破する3つのキーワード
どうせ、下請けにやらせてるんでしょ。しっかり指導して。
ask google bard
2引数の関数の内部演算を推測するコードをhaskellで作成せよ。入力は整数、 演算は加減乗除のみが使用されているとする。
import Data.List inferOp :: (Integer -> Integer -> Integer) -> [Integer] inferOp f = concatMap (\xs -> map (\ys -> [f x y | x <- xs, y <- ys])) $ combinations $ [1 .. 10] main = do f <- readLn print $ inferOp f
This code first computes all possible combinations of the 10 integers from 1 to 10. It then applies the function f to each pair of integers in each combination and returns the resulting list of integers. The internal operations of the function f can then be inferred by looking at the list of resulting integers.
For example, if the function f is f x y = x + y, then the list of resulting integers will be [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]. The internal operations of the function f are therefore +.
I hope this is helpful!
もちろん、コンパイルしても失敗するけど、調べている過程で、組み合わせ理 論を発見。
combinations :: [a] -> [[a]] combinations coins = concat [combs i coins | i <- [1 .. length coins]] where combs 0 _ = [[]] combs _ [] = [] combs k (x:xs) = map (x:) (combs (k-1) xs) ++ combs k xs
組み合わせ爆発が起きないように、小さなセットで確認。
ghci> combinations [0..2] [[0],[1],[2],[0,1],[0,2],[1,2],[0,1,2]]
ちょいと趣を替えて、golangについて質問してみる。だって、お膝元ですから ねぇ。
haskellのparsec相当がgolangに有りますか? 若し有ったら、サンプルコードを提示してください
回答に矛盾があるな
Parsecは、Goの標準ライブラリに含まれています。そのため、Goのインストールを行えば、Parsecを使用することができます。
Goのインストール方法は、Goの公式ドキュメントに記載されています。
Goのインストールが完了したら、Parsecを使用することができます。Parsecの 使用方法については、Parsecの公式ドキュメントに記載されています。
Parsecは、Golangの標準パッケージではないため、Golangの標準パッケージマネージャーであるGo getを使用してダウンロードすることはできません。Parsecをダウンロードするには、次の手順に従ってください。
ターミナルを開き、次のコマンドを実行します。
go get github.com/kr/parsec
Parsecがダウンロードされたら、次のコマンドを実行してParsecをインストールします。
go install github.com/kr/parsec
コードは慎重に使用してください。詳細 Parsecがインストールされたら、次のコマンドを実行してParsecの使い方を学ぶことができます。
go doc github.com/kr/parsec
Template Haskell
PureScript
たまたま見付けた面白そうな奴。何でも取り揃えていますと自慢のDebianには 無かったので、FreeBSDのportsを調べた。
PureScript is a small strongly typed programming language with expressive types that compiles to JavaScript, written in and inspired by Haskell.
根はhaskellで出来ている。とんでもない数のパッケージを使っている。
[19 of 84] Compiling Basement.Numerical.Conversion ( Basement/Numerical/Conversion.hs, dist/build/Basement/Numerical/Conversion.o, dist/build/Basement/Numerical/Conversion.dyn_o ) Basement/Numerical/Conversion.hs:29:1: error: Could not find module ‘GHC.IntWord64’ Use -v (or `:set -v` in ghci) to see a list of the files searched for. | 29 | import GHC.IntWord64 | ^^^^^^^^^^^^^^^^^^^^ Error: cabal: Failed to build basement-0.0.16 (which is required by exe:purs from purescript-0.15.9).
とんでもない奴のひとつとして、前回失敗こいた物もはいっている。32Bit環 境ではコンパイルできないという代物ね。こやつ、拡張されたPreludeぽい。
コンパイルするなら64Bit環境でって事になるけど、virtualBoxな環境は、ど うも過負荷に弱いみたいで、時々落ちる。やるなら、舞台を替えてvmwareな archLinuxだな。ちょっとその前に、ソースとご対面しとくか。
[sakae@fb ~/.cache/cabal/packages/hackage.haskell.org/purescript/0.15.9]$ ls -l total 864 -rw-r--r-- 1 sakae wheel 845967 Jul 11 05:17 purescript-0.15.9.tar.gz
purescript: PureScript Programming Language Compiler
ソースからのコンパイル方法が出てた。
$ stack update $ stack unpack purescript $ cd purescript-x.y.z # (replace x.y.z with whichever version you just downloa\ ded) $ stack install --flag purescript:RELEASE This will then copy the compiler executable (`purs`) into `~/.local/bin`.
replにcursesの古い奴を使っているので、sudo apt install libtinfo5 libncurses5-dev しとけとな。Ubuntuとstackと言う黄金コンビと言うか優等生的な組み合わせを推奨か。 そして、更に注意点が、
If you encounter this error while trying to install via `npm`: Error: EACCES: permission denied The best solution is to install [Node.js and npm via a node version manager](ht\ tps://docs.npmjs.com/downloading-and-installing-node-js-and-npm#using-a-node-ve\ rsion-manager-to-install-nodejs-and-npm). This error is due to permissions issu\ es when installingんpackages globally. You can read more about this error in npm\ 's guide to [resolving EACCES permissions errors when installing packages globa\ lly](https://docs.npmjs.com/getting-started/fixing-npm-permissions).
インストールなんて誰がやっても同じ工程、なるべく穏便に済ませたい親心が 如実に表われていますなあ。
A strongly-typed functional programming language that compiles to JavaScript
haskdogs
haskdogs: Generate tags file for Haskell project and its nearest deps
面白い物を見つけた。importしてるモジュールを含めてタグファイルを作って くれると言うもの。対象になる*.hsを拾い出すhaskdogsと、そのファイル群か らタグを生成する、hasktagsと言うやつの二本立て。
[sakae@arch hasktags-0.72.0]$ haskdogs --hasktags-args "-e -x" : /home/sakae/.haskdogs/transformers-0.5.6.2/legacy/pre711/Data/Functor/Sum.hs > hasktags -e -x STDIN Success
試しに、src/Hasktags.hs の冒頭付近にあるwhenを追跡
import Control.Monad (when)
Base.hs と出たんで、その上位は? Find file: ~/.haskdogs/base-4.17.1.0/GHC/ して確認するという裏技です。
-- | Conditional execution of 'Applicative' expressions. For example, -- -- > when debug (putStrLn "Debugging") -- -- will output the string @Debugging@ if the Boolean value @debug@ -- is 'True', and otherwise do nothing. when :: (Applicative f) => Bool -> f () -> f () {-# INLINABLE when #-} {-# SPECIALISE when :: Bool -> IO () -> IO () #-} {-# SPECIALISE when :: Bool -> Maybe () -> Maybe () #-} when p s = if p then s else pure ()
importしてる奴は、こちらに展開してるんですねぇ。
[sakae@arch ~]$ ls .haskdogs/ base-4.17.1.0/ directory-1.3.7.1/ mtl-2.2.2/ bytestring-0.11.4.0/ filepath-1.4.2.2/ transformers-0.5.6.2/ containers-0.6.7/ ghc-prim-0.9.0/
これは非常に便利。ユーザー作成のコードとシステム由来のコードを分け隔て なく扱える。残念ながら、stackでしか動かないっぽいけど。
pantry.sqlite3
stackは、tar玉みたいな奴をDBに押し込めて、すましている。触るな危険とい う態度。
sqlite> .tables archive_cache hackage_tarball snapshot_cache blob module_name tree cache_update package_exposed_module tree_entry file_path package_name url_blob h_pack preferred_versions version hackage_cabal repo_cache
当りをつけて叩いてみる。
sqlite> .headers on sqlite> select * from archive_cache limit 3; id|time|url|subdir|sha|size|tree 1|2023-07-14T06:45:57.560763703|https://hackage.haskell.org/package/base-4.17.1.0.tar.gz||]%orlC#cw~09RZ|838482|1 2|2023-07-14T06:45:59.318155542|https://hackage.haskell.org/package/bytestring-0.11.4.0.tar.gz||Ib\i:j=?Z~qv|212391|2 3|2023-07-14T06:46:01.005297901|https://hackage.haskell.org/package/containers-0.6.7.tar.gz||^^eN=u@y,O %t|203394|3
sqlite> select * from tree limit 3; id|key|cabal|cabal_type|name|version 1|171675|169173|1|2|1 2|171733|166389|1|258|3785 3|171775|166867|1|268|998
tar玉の本体は、何処に格納されているのだろう? 全く困ったものだ。OSSの醍醐味を放棄してるな。
失敗は学ぶ機会と思え
こんな有名な格言が有る。ウブにstackと言う優等生は、体験する事は無いだ ろう。上で簡単にやっちゃったけど、そこに行きつくまでは、色々と失敗した のさ。おかげで、色々な知見を得た。
[sakae@deb haskdogs-0.6.0]$ haskdogs Cheking for stack with GNU which > which stack Cheking for cabal with GNU which > which cabal > which hasktags > find . -type f -and ( -name *\.hs -or -name *\.lhs -or -name *\.hsc ) > ghc-pkg --simple-output find-module Control.Applicative Import Control.Applicative resolved to base-4.16.4.0 > ghc-pkg --simple-output find-module Control.Exception Import Control.Exception resolved to base-4.16.4.0 : > cabal unpack base-4.16.4.0 > cabal unpack containers-0.6.5.1 : > find /home/sakae/.haskdogs/base-4.16.4.0 /home/sakae/.haskdogs/containers-0.6. 5.1 /home/sakae/.haskdogs/directory-1.3.6.2 /home/sakae/.haskdogs/filepath-1.4.2 .2 /home/sakae/.haskdogs/text-1.2.5.0 -type f -and ( -name *\.hs -or -name *\.lh s -or -name *\.hsc ) ./src/Main.hs /home/sakae/.haskdogs/base-4.16.4.0/Control/Applicative.hs /home/sakae/.haskdogs/base-4.16.4.0/Control/Arrow.hs : > hasktags -e STDIN Success
haskdogs-0.6.0のTAGを作成した時のログだ。最初のfindで、作成対象のプロ ジェクトからソースを抽出。そのソース内からimportしてるモジュールを検出。 それが、どのパッケージに収納されてるかghc-pkgを使って問い合わせ。 次にそれをcabal unpackで展開。 最後は、もう一度findしてソースを抽出、それをhasktagsするとな。
haskdocsのソースを読んで改造しておいた。stackよりcabalを優先しろ。 ctagsを止めてetagsを作成しろってね。
defHasktagsArgs = words "-e" --- -c -x to -e <*> option auto ( long "use-stack" <> value OFF <> --- AUTO to OFF help "Execute ghc-pkg via stack, arg is ON, OFF or AUTO (the default)")