order to Google bard and ChatGPT

Table of Contents

order to Google bard

https://bard.google.com/

これ、ぐぐる製のAI。アクセスするには、ぐぐるのアカウントが必要なんかな。 過去のセッションを記憶してて、ありありと ChatGPTに敵意剥き出しっ てのがいいな。切磋琢磨して、使いやすくなって下さい。

Bingに投げた質問、CSVファイルへの追記問題をやってみるか。Bingの誤解を 考慮して、もっと精密なプロンプトを作成できるだろうけど、そこはそれ、 schemeの仕様書であるRnRSみたいに、実装者の解釈の幅を持たせるため、前の ままで、やってみる事にする。

import Data.List
import Data.Maybe

main = do
    year <- readLn
    month <- readLn
    prompt $ "2308> "
    let data = getLine
    when (data /= "fin") $ do
        let (day, hour, high, low, pls) = splitAt 4 data
        when (day < 1 || day > 31) $ putStrLn "日付が不正です。"
        when (hour < 0 || hour > 23) $ putStrLn "時間帯が不正です。"
        when (high < 80 || high > 180) $ putStrLn "最高気温が不正です。"
        when (low < 50 || low > 110) $ putStrLn "最低気温が不正です。"
        when (pls < 40 || pls > 120) $ putStrLn "降水量が不正です。"
        let record = (year, month, day, hour, high, low, pls)
        data <- readFile "test.csv"
        let newData = data ++ [record]
        writeFile "test.csv" $ unlines newData
    prompt $ "2308> "

ざっと見、凄いコードだ。

このプログラムは、年月、日時、最高気温、最低気温、降水量をコンソールから入力し、
CSVファイルに追記します。入力が不正な場合は、理由を説明の上、入力待ちになります。

プログラムの使用例は次のとおりです。

$ hoge -ire 2308
2308> 921 133 66 52
2308> 1005 136 70 60
fin
この場合、CSVファイル「test.csv」に次の行が追加されます。

2308, 9, 21, 9, 133, 66, 52
2308, 10, 5, 10, 136, 70, 60

天候のデータって勝手に解釈しちゃったけど、かの国は、華氏を採用してる単 位が田 舎な国なんで、ついお里が出ちゃったのかな。おお笑いの種であります。

がっちりとエラーになるので、エラーログを提示して修正を迫ったら、最後に は、敗北宣言が出された。そりゃそうだ。dataなんてのを気軽に使うって、素 人丸出しもいいとこだぞ。

申し訳ありませんが、私はハスケルの専門家ではありません。他の人に尋ねることをお勧めします。

強気なAIに対して、謙虚なAIって事で、生暖かく見守りましょう。

得意な言語は、何ですか?

Bardの名誉回復の為、得意な言語は何か聞いてみる。世界の片隅でひっそりと 咲くhaskellなんて、超マイナー言語ですからね。

Bardさんの得意なプログラミング言語は何ですか?
得意な言語から、順番に5つ挙げてください。

得意というのは、課題に対する作文能力、すなわち
コードを作成する能力と理解してください。

私の得意なプログラミング言語は、以下の5つです。

Python JavaScript Java C++ C# これらの言語は、それぞれに長所と短所があり、特定のタスクに適している場合があります。たとえば、Pythonは、機械学習やデータサイエンスに適した言語です。JavaScriptは、ウェブ開発に適した言語です。Javaは、エンタープライズアプリケーション開発に適した言語です。C++は、ゲーム開発に適した言語です。C#は、Windowsアプリケーション開発に適した言語です。

私は、これらの言語すべてに精通しており、お客様のニーズに合わせて、最適 な言語を選択してコードを作成することができます。


ぐぐる製のgolangやDart を挙げてくるかと思ったら、以外とありきたりのも のばかりだな。

golangで、課題の作成も大丈夫ですか?

はい、Go言語で課題を作成することはできます。Go言語は、効率的で、読みやすく、書きやすい言語であるため、課題の作成に適しています。また、Go言語には、豊富な標準ライブラリが用意されているため、課題の作成を効率化できます。

Go言語で課題を作成するには、以下の手順に従います。

課題の要件を定義します。 課題の解決策を設計します。 課題の解決策をコードで実装します。 課題のテストコードを作成します。 課題を実行します。 Go言語で課題を作成するには、以下のリソースが役立ちます。

Go言語の公式ドキュメント Go言語のチュートリアル Go言語のオンラインフォーラム Go言語のオープンソースプロジェクト Go言語は、効率的で、読みやすく、書きやすい言語であるため、課題の作成に適しています。また、Go言語には、豊富な標準ライブラリが用意されているため、課題の作成を効率化できます。


何か宣伝臭いんだけどな。後で、実力をテストしてみよう。

要約能力を問う

もう一つのAIの得意分野にも、あたってみる。何せ、オイラーが一番求める機 能が、貧弱すぎましたからね。

https://hamesspam.sakura.ne.jp/
こちらのWebを運用している人が、どんな人か
知りたいです。
勿論、site:https://hamesspam ... key1 key2
とかやって、地道に調べる方法は知っています。
でも、手っ取り早く Bardさんの要約力を借りたいです。

知りたい項目は、次のようです。出来れば、その根拠と
なったURLも合わせて提示してください。

1.氏名
2.年齢
3.住所又は住んでいるエリア
4.職業
5.趣味
6.特技
以上。

申し訳ありませんが、その情報は提供できません。

何故、出来ないのですか? 検索機構と連動していないから?

はい、そのとおりです。私は検索エンジンと連動していないため、その情報に アクセスできません。また、個人情報の保護に努めており、特定の個人に関す る情報を公開することはできません。

また、別の回答も用意されてた。

個人情報は、個人のプライバシーを保護するために守られるべきものです。個人が同意なく個人情報を公開することは、プライバシーの侵害となります。また、個人情報は悪意ある第三者によって悪用される可能性もあります。そのため、個人情報の保護は重要です。

Web に公開されている情報であっても、個人情報である場合もあります。例えば、氏名、住所、電話番号、メールアドレスなどは、個人情報に該当します。これらの情報は、Web サイトやブログに公開されている場合もあります。ただし、これらの情報は、個人が同意なく公開されている場合もあれば、個人が同意して公開されている場合もあります。

個人が同意して公開されている情報は、個人情報に該当する場合でも、公開して問題ありません。しかし、個人が同意していない情報は、個人情報に該当する場合でも、公開することはできません。個人情報の保護に違反することになります。

個人情報が公開されている Web サイトやブログを見つけた場合は、その情報の公開を停止するように Web サイト運営者に依頼することができます。また、個人情報が悪用されている場合は、警察に被害を届け出ることができます。

個人情報の保護は、個人の権利です。個人情報の保護に努めて、個人のプライバシーを守りましょう。

自主的にWebで公開してるなら、個人情報云々はナンセンスと思いますが。。。

ご指摘ありがとうございます。確かに、Web上で公開されている情報は、個人 情報保護の対象とは限りません。しかし、個人のプライバシーを保護するとい う観点から、私は特定の個人に関する情報を公開することを控えたいと思いま す。


あからさまに、プロファイリングしてって聞かなかったけど、ちゃんとガード してたな。

自分で勝手にWebをクローニングして、それを広告主に販売してるのは、どう いう理屈? まあ、便利を提供してるんですって言うかな。それは100000歩譲った として、gmailの提供はどうよ? 極めて私的な領域だと思うぞ。それも、契約 でユーザーが許可したって返すんだろうね。甘い話には裏がある。全ては、お 釈迦様の掌で踊らされる、哀れなユーザーであります。

FBI,CIA,NSAあたりだと、秘密のスイッチがあって、ガードが外れるように、O MO TE NA SHI モードがあったりするんだな。

order to ChatGPT

ChatGPTにも、制作を指示してみた。

最初の返答は、YYMMDDHHを自動入力させるものだった。忖度が過ぎるよ。 ちゃんと指示通りにしてくれと、何度かやりとりした。 Bingと違って、過去の会話を覚えているから、気楽に改良に励む事ができる。 これは、よい環境であるぞ。

-- Required modules
import System.Environment (getArgs)
import Data.List (sortBy)
import System.IO (readFile, writeFile, appendFile)
import Data.Ord (comparing)

-- Data type to represent a record
data Record = Record
  { datetime :: String
  , high :: Int
  , low :: Int
  , pls :: Int
  } deriving (Eq, Show)

-- Read existing CSV file and sort its records
readAndSortRecords :: String -> IO [Record]
readAndSortRecords fileName = do
  content <- readFile fileName
  let records = map parseCSVLine $ lines content
  return $ sortBy (comparing datetime) records

-- Parse a CSV line to get a record
parseCSVLine :: String -> Record
parseCSVLine line =
  case splitByComma line of
    [dateTimeStr, highStr, lowStr, plsStr] ->
      Record dateTimeStr (read highStr) (read lowStr) (read plsStr)
    _ -> error "Invalid CSV line format"

-- Utility function to split a string by commas
splitByComma :: String -> [String]
splitByComma = splitByChar ','
    
-- Utility function to split a string by a character
splitByChar :: Char -> String -> [String]
splitByChar _ [] = []
splitByChar c s =
  let (first, rest) = break (== c) s
  in first : case rest of
    [] -> []
    (_:xs) -> splitByChar c xs

-- Merge new records with existing ones and write to the CSV file
mergeAndWriteRecords :: String -> [Record] -> [Record] -> IO ()
mergeAndWriteRecords fileName existingRecords newRecords = do
  let mergedRecords = mergeSortedRecords existingRecords newRecords
  writeFile ("zz-" ++ fileName) $ unlines $ map recordToCSVLine mergedRecords

-- Merge two sorted lists of records into a single sorted list
mergeSortedRecords :: [Record] -> [Record] -> [Record]
mergeSortedRecords [] ys = ys
mergeSortedRecords xs [] = xs
mergeSortedRecords (x:xs) (y:ys)
  | datetime x <= datetime y = x : mergeSortedRecords xs (y:ys)
  | otherwise = y : mergeSortedRecords (x:xs) ys

-- Convert a record to CSV line format
recordToCSVLine :: Record -> String
recordToCSVLine (Record dateTime high low pls) =
  dateTime ++ "," ++ show high ++ "," ++ show low ++ "," ++ show pls

main :: IO ()
main = do
  args <- getArgs
  let fileName = "test.csv"
  existingRecords <- readAndSortRecords fileName
  case args of
    ["-ire", yymm] -> do
      inputLoop fileName existingRecords yymm
    _ -> putStrLn "Invalid arguments"

-- Input loop to read console inputs and update CSV file
inputLoop :: String -> [Record] -> String -> IO ()
inputLoop fileName existingRecords yymm = do
  putStr $ yymm ++ "> "
  line <- getLine
  case parseInputLine line yymm of
    Nothing -> putStrLn "Finished input. Updating CSV file..." >> mergeAndWriteRecords fileName existingRecords []
    Just (Left errMsg) -> putStrLn errMsg >> inputLoop fileName existingRecords yymm
    Just (Right record) -> inputLoop fileName (record : existingRecords) yymm

-- Parse the input line and create a record or return an error message
parseInputLine :: String -> String -> Maybe (Either String Record)
parseInputLine line yymm =
  case words line of
    ["fin"] -> Nothing
    [ddhh, highStr, lowStr, plsStr] -> do
      let dateTimeStr = yymm ++ ddhh
      high <- readSafe highStr
      low <- readSafe lowStr
      pls <- readSafe plsStr
      if isValidRecord dateTimeStr high low pls
        then Just (Right $ Record dateTimeStr high low pls)
        else Just (Left "Invalid input. Please check the ranges and format.")
    _ -> Just (Left "Invalid input. Please enter the data in the format 'DDHH high low pls'.")


-- Read an Int value safely
readSafe :: String -> Maybe Int
readSafe str =
  case reads str of
    [(x, "")] -> Just x
    _ -> Nothing

-- Check if the record is valid as per the specifications
isValidRecord :: String -> Int -> Int -> Int -> Bool
isValidRecord dateTime high low pls =
  let isValidValue val minVal maxVal = val >= minVal && val <= maxVal
  in isValidValue high 80 180 && isValidValue low 50 110 && isValidValue pls 40 120

動作試験

ある程度、希望通り動作したんで、軽くチェック。

ghci> :main 2308
Invalid arguments
ghci> :main -ire 2308
2308> 0104 0 0 0
Invalid input. Please check the ranges and format.
2308> 0104 130 70 60
2308> 0121 120 60 55
2308> fin
Finished input. Updating CSV file...

結果の並び方が、逆になってる。

[sakae@arch gptbld]$ cat zz-test.csv
23080121,120,60,55
23080104,130,70,60
19010121,133,66,55

それから、ファイル名の扱かいが、まだBingと同じ間違いをしていた。 まあ、許してあげよう。何もかも完璧って事はないだろうから。 よい叩き台を、ものの数分で作ってくれる相棒ってことで、褒めてやろう。

鑑賞会

特に指示した訳でもないのに、baseなパッケージのみで構成されているのが良 い傾向だ。cabal地獄を回避する為、stackの使用を推奨なんて話しは、どこの 国の事やらと、思っちゃうぞ。

第3者機関による査察

これ、恒例な儀式です。

[sakae@arch gptbld]$ hlint app/Main.hs
app/Main.hs:20:12-38: Warning: Use sortOn
Found:
  sortBy (comparing datetime)
Perhaps:
  sortOn datetime

1 hint

そういう物なんですかねぇ。

規模ってか粒度

どうやって、検証する? あくまで科学的にやる必要があるな。

[sakae@arch gptbld]$ wc app/Main.hs
 110  619 3907 app/Main.hs
[sakae@arch gptbld]$ grep -h :: app/Main.hs
  { datetime :: String
  , high :: Int
  , low :: Int
  , pls :: Int
readAndSortRecords :: String -> IO [Record]
parseCSVLine :: String -> Record
splitByComma :: String -> [String]
splitByChar :: Char -> String -> [String]
mergeAndWriteRecords :: String -> [Record] -> [Record] -> IO ()
mergeSortedRecords :: [Record] -> [Record] -> [Record]
recordToCSVLine :: Record -> String
main :: IO ()
inputLoop :: String -> [Record] -> String -> IO ()
parseInputLine :: String -> String -> Maybe (Either String Record)
readSafe :: String -> Maybe Int
isValidRecord :: String -> Int -> Int -> Int -> Bool

これが、いいんだか悪いんだか、比較対象が必要だな。

Bingのそれ

[sakae@arch hbld]$ wc app/Main.hs
 137  702 7747 app/Main.hs
[sakae@arch hbld]$ grep -h :: app/Main.hs
fileName :: String
endInput :: String
main :: IO ()
inputLoop :: String -> [Record] -> IO ()
handleError :: String -> [Record] -> String -> IO ()
handleRecord :: String -> [Record] -> Record -> IO ()
isValidYearMonth :: String -> Bool
parseInput :: String -> String -> Either String Record
maybeToEither :: String -> Maybe a -> Either String a
isValidDayHour :: String -> Bool
readMaybe :: String -> Maybe Int
inRange :: Int -> Int -> Int -> Bool
insertRecord :: [Record] -> Record -> [Record]
readCSV :: String -> IO [Record]
parseLine :: String -> Record
writeCSV :: String -> [Record] -> IO ()
writeLine :: Handle -> Record -> IO ()
mergeRecords :: [Record] -> [Record] -> [Record]

AIの頭の中

関数が、どんな順番で登録されてるか、少し考察。登録の順番なんて、コンパ イラーに取っては無意味だけどな。

エントリーポイントとなるmainが何処に有る? C言語だと、通常は最後に置い てある。ボトムアップって考えなんですかね? 型を決めていって、最後にそ れらを使うって方式。こうしておけば、フォワード宣言が不要になり、コード がすっきりする。

haskellではどうか? Bingでは、冒頭からmainが定義されてて、以下使われる 順番に沿って定義が表われている。トップダウンにmainを決めて、下位を追加 してくんだな。ツリー・トラバースを知らず知らずのうちに実践してる。これ が、真っ当な方法か。

一方、ChatGPTの方は、mainが出てくる前に、幾つかのユーティリチィー関数 を定義してる。これって、mainの構想の前に、こんな関数が有ったら、便利だ ろうなって、想像して準備してるのかな? だから、切羽詰って、あわてて外 部パッケージに頼る事もないとな。

当事者に聞いてみた。

外野があーだ・こーだと想像するよりも、本人に聞いてみるのが一番だろう。

コードを作成する時の戦略についてお聞きします。
最初に、data Record宣言するのはhaskellでは常識。
その後、mainの中を記述し、それに合わせて
下位の関数の型を決め、詳細を記述するという方法を
取ると思います。

今回のコードでは、mainの前に、汎用的なコードが
現れています(splitByComma等)。dataが決定したので、
そこから導出できる汎用的なコードもそうです。
それから、mainが出てきて、このアプリ特有なコードが
展開されています。

このような記述スタイルは、ChatGPTに取って自然な方法
なのでしょうか? それとも、多数のコードを学習したゆえの
結論なのでしょうか?

Haskellのコードを書く際の戦略は、多くのプログラミング言語と同様に、プログラムの構造やデザインに合わせて決まります。コードを構築する際の一般的なアプローチと、特にHaskellの特徴に関連するいくつかのポイントについて説明します。

  1. データ型の定義: コードを開始する際、データ型を定義することは重要です。これにより、アプリケーションの主要なデータ構造が明確になります。Haskellの型システムを活用するために、適切なデータ型を設計することが重要です。
  2. 主要な処理ロジック: データ型の定義の後、プログラムの主要な処理ロジックを記述します。これには、コンソールからの入力の受け取り、データのバリデーション、CSVファイルへの書き込みなどが含まれます。この際に、コードの一般的な部分を汎用的な関数として抽出することができます(例:文字列の分割やファイルの読み書き)。
  3. 下位の関数の型定義: メインの処理を記述する前に、下位の関数の型を定義することが有益です。型を定義することで、コンパイラがコードの一貫性を保証し、バグを見つけるのに役立ちます。
  4. モジュール化と抽象化: コードの一部が共通の機能を提供する場合、それをモジュールとして抽象化することができます。これにより、コードベースが整理され、保守性が向上します。
  5. コードの流れと読みやすさ: コードを書く際には、処理の流れが読みやすく、理解しやすい形になるように心がけることが重要です。関数やデータ型の命名には意味があり、コメントを適切に使ってコードの意図を説明することも大切です。

Haskellの場合、型安全性と関数型プログラミングの特性を活用することで、コードの品質や信頼性を高めることができます。また、ChatGPTが生成したコードは、多数のコードから学習した結果として、一般的なプログラム構造やベストプラクティスに基づいて生成される傾向があります。ただし、特定の状況や要件に合わせて微調整することが重要です。


bardさんも、見習った方がいいよ。蛇足ながら、プログラミングHaskellとす ごいH本も学習する事を、お勧めします。 bardって詩人という意味みたい。いわゆる文系だな。そうすると、理工系は得 意じゃないのか。マルチリンガルまで、手が回らないんだな。

ついでなんで、bingの意味も調べてみた。俗語で、独房とか麻薬。普通の意味 では、鉱石ですって。ああ、鉱石と変換かけたら、功績も出てきたけど、これ は、日本の辞書だった。


This year's Index

Home