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

ウェブのための関数型プログラミング purescript

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)")

etc