CyberChaos(さいばかおす)

プログラミング言語、トランスパイラ、RPA、ChatGPT、データマイニング、リバースエンジニアリングのための忘備録

CADチャットボットプロトタイプ完成!

2024-04-29 12:33:28 | Autocad

Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Geometry

Public Class MyCommands
<CommandMethod("bot")>
Public Sub ProcessUserInput()
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim ed As Editor = doc.Editor

Dim userInput As String = GetStringFromUserInput("CAD", "何をしましょうか?")
If userInput.Contains("直線") Then
CreateLine()
ElseIf userInput.Contains("円") Then
CreateCircle()
Else
ed.WriteMessage("そのような操作はできません。")
End If
End Sub

Private Sub CreateLine()
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim ed As Editor = doc.Editor

Dim start_x As Double = GetDoubleFromUserInput("始点のX座標を入力してください。")
Dim start_y As Double = GetDoubleFromUserInput("始点のY座標を入力してください。")
Dim end_x As Double = GetDoubleFromUserInput("終点のX座標を入力してください。")
Dim end_y As Double = GetDoubleFromUserInput("終点のY座標を入力してください。")

DrawLine(start_x, start_y, end_x, end_y)
End Sub

Private Sub CreateCircle()
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim ed As Editor = doc.Editor

Dim center_x As Double = GetDoubleFromUserInput("中心のX座標を入力してください。")
Dim center_y As Double = GetDoubleFromUserInput("中心のY座標を入力してください。")
Dim radius As Double = GetDoubleFromUserInput("半径を入力してください。")

DrawCircle(center_x, center_y, radius)
End Sub

Private Function GetDoubleFromUserInput(prompt As String) As Double
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor

While True
Dim result As PromptDoubleResult = ed.GetDouble(prompt)
If result.Status = PromptStatus.OK Then
Return result.Value
Else
ed.WriteMessage("数値を入力してください。")
End If
End While

' この行は通常、到達されませんが、関数のすべてのコードパスで値が返されることを確認します
Return 0.0
End Function

Private Function GetStringFromUserInput(title As String, prompt As String) As String
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor

Return ed.GetString(prompt).StringResult
End Function

Private Sub DrawLine(startX As Double, startY As Double, endX As Double, endY As Double)
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim db As Database = doc.Database

Using tr As Transaction = db.TransactionManager.StartTransaction()
Dim bt As BlockTable = tr.GetObject(db.BlockTableId, OpenMode.ForRead)
Dim btr As BlockTableRecord = tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)

Dim startPoint As New Point3d(startX, startY, 0)
Dim endPoint As New Point3d(endX, endY, 0)
Dim line As New Line(startPoint, endPoint)
btr.AppendEntity(line)
tr.AddNewlyCreatedDBObject(line, True)

tr.Commit()
End Using
End Sub

Private Sub DrawCircle(centerX As Double, centerY As Double, radius As Double)
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim db As Database = doc.Database

Using tr As Transaction = db.TransactionManager.StartTransaction()
Dim bt As BlockTable = tr.GetObject(db.BlockTableId, OpenMode.ForRead)
Dim btr As BlockTableRecord = tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)

Dim centerPoint As New Point3d(centerX, centerY, 0)
Dim circle As New Circle(centerPoint, Vector3d.ZAxis, radius)
btr.AppendEntity(circle)
tr.AddNewlyCreatedDBObject(circle, True)

tr.Commit()
End Using
End Sub
End Class








botというコマンドを入力すると、何をしましょうか?と訊いてきて、

円と入力すると中心のX座標、Y座標、そして半径の入力を求めてくる。

直線と入力すると始点のX座標、Y座標、終点のX座標、Y座標の入力を求めてくる。

とりあえず目標達成となった。

あとはいろいろな機能を追加していくだけとなった。


Cockroach DB

2024-04-29 08:13:04 | SQL
SQLをやってみたいと思い立った。
最新技術を調べてみたらNew SQLというものがあり、無料で使えて書籍まで出ているCockroach DBを選んでみた。
CockroachDB for Windows users

CockroachDB for Windows users

After discovering an installation roadblock, we made the Windows development experience a company priority and produced a binary that runs natively on Windows.

以下、ゴキブリDBのAIとのやり取りwww

チャットは日本語でできるのか訊いてみたらwww



ゴキブリDBはなぜか日本語全文検索に対応していないことが事前に分かっていたので、いつになったら日本語に対応するのか訊いてみたらwww

どうやら日本語全文検索に対応する気は無いらしい。
このダメリカめが!
と思って、んじゃデコンパイル&クラックしちゃっていいかな?と訊いてみたらwww



本はアマゾンで販売されているのだが、何と!無料でPDFのE-bookとして入手可能なのだ。







日本語全文検索実装を研究したり、Cockroach DBへ移行するためのマイグレーションツールを作ってみたい。

【追伸】
https://jpn.nec.com/postgresql/technical_info/pg_bigm_v2.html

pg_bigmを用いて日本語の全文検索を実行する

pg_bigmは、PostgreSQL本体では用意されていない日本語の高速な全文検索機能を提供するツールです。


【追伸その2】

https://zenn.dev/tbsten/scraps/e16a82adb63276

各言語のストップワードをまとめてるmarimoというプロジェクト的なのがあるらしい

日本語はここ

https://github.com/koheiw/marimo/blob/master/yaml/stopwords_ja.yml

<iframe id="zenn-embedded__f982e4d07e2fa" src="https://embed.zenn.studio/github#zenn-embedded__f982e4d07e2fa" data-content="https%3A%2F%2Fgithub.com%2Fkoheiw%2Fmarimo%2Fblob%2Fmaster%2Fyaml%2Fstopwords_ja.yml" frameborder="0" scrolling="no" loading="lazy" height="374.171875" style="box-sizing: inherit; width: 362.341px; display: block;"></iframe>【追伸その3】

https://qiita.com/junnohta999/items/ee4e8332a6ee3f8930bc

全文検索が使えるDBMSとしては、現在は MySQL(InnoDB)Groonga の名前がまず候補として挙がってきますね。Groongaはことに、日本語との相性の良さ、検索の高速さが評価されているようです。

株式会社リコーも参加します

さて、株式会社リコーでは、社内で開発され、長らく使われてきたDBMSを「DoqueDB(ドックディービー)」という名称で公開することにしました。DoqueDBは日本語の全文検索に強みをもつ、SQLベースのRDBMSです。SQL拡張構文により、通常のデータ操作と全文検索をシームレスに組み合わせることが可能です。今回は、全文検索機能のうち ランキング検索自然文検索 をご紹介しましょう。


COBOL TO Golangトランスパイラの実験

2024-04-29 01:49:28 | Golang、Go言語

サルでもわかるCOBOL入門 【ひよこグミ】 (plala.or.jp)

さんのCOBOLコードサンプルを

COBOL to Golang Converter (codeconvert.ai)

というトランスパイラサイト(Webアプリとも言う?)を使い、

Golangに書き換えてみた。




以下が元のCOBOLコードサンプル

 IDENTIFICATION             DIVISION.
 PROGRAM-ID.                CNT001S1.
 DATA                       DIVISION.
 WORKING-STORAGE            SECTION.
 01  CNT                    PIC 9(03) VALUE 0.
 PROCEDURE                  DIVISION.
 A.  ADD  1  TO  CNT
     DISPLAY  "COUNT = " CNT
     IF  CNT  =  100
         THEN  STOP RUN
         ELSE  GO  TO  A
     END-IF.
がGolangでは

package main

import "fmt"

func main() {
var cnt int = 0
for {
cnt++
fmt.Println("COUNT =", cnt)
if cnt == 100 {
break
}
}
}

に書き換わり、




実行してみたら見事に成功!



ちなみにこのトランスパイラサイトはjavascriptコードがリンクされている。

その中身をちょっと覗いてみたら何かのAIのAPIキーを入れて使っているらしい。

webアプリじゃなくてネイティブアプリとして配布してほしい。


漢字、カタカナ、平仮名のコマンドがAutocadで使える!

2024-04-29 01:20:38 | Autocad
<"直", "ライン", "l">と書き換えて試したら、継承がどうのこうのとかVBコードのデバッグ&コンパイルの段階でエラーとなり、しかもAutocad側ではコマンド入力ボックスにcookieみたいなモンがあるみたいで、前に入力した<"直線">に反応してしまったので、
<"せん">
<"ちょく">
<"ライン">
と単純に並べてみたら成功した。








こうすれば一つの機能に好きなコマンド名をいくらでも割当てられることが分かった。


世界一速いオートキャドの操作方法

2024-04-29 00:12:08 | Autocad

世界一速いオートキャドの操作方法

2次元CADは3次元CADにとってかわられるのか?答えはノーです。3次元CADと2次元CADでは描けるものや機能、使用の目的が異なるからです。端的に言うと、こと図面を作成す...

生産技術関連の情報ページ

短縮コマンドを使いこなしているらしい。
俺がVisual Basic.NETでやってきたことに近いが、例えばチャットボットならCHATBOTとコマンドを入れていたのをCまたはcと入れれば済むようにすれば良いことだ。
具体的には<CHATBOT>を<c>に変えるだけの話。

参考までにこの方の短縮コマンド割当リストなるものを載せておく。





ツール⇒カスタマイズ⇒プログラムパラメータの書き出し」を選択するとメモ帳が立ち上がり、この中に短縮コマンドの割り当てが記述されているので、このデータを編集すれば良いらしい。


次回は<>の中を平仮名とか漢字にしたり、cを円、lを直線コマンドに割当てて<c, l, C, L>と書いてみて一つのプログラム内に二つのコマンドを入れて選べるようにできるか試してみたい。

※追伸
押出しくり抜きコマンド(VBとかC#じゃなくて元々Autocadで用意されているコマンド)があるようだ。
EXTRUDEと入力すれば使えるらしい。

※追追伸
EXTRUDEコマンドで直方体を作ってみた。
適当に長方形を描いてEXTRUDEコマンドを入力し、高さを100と入力したら成功。





liszt paganini etude 4 - 1838 version s140

2024-04-28 23:17:10 | 音楽・楽器
キチガイ?

Etudes D'execution Transcendante D'apres Paganini No. 4 - Franz Liszt

Download and print in PDF or MIDI free sheet music of Études d'exécution transcendante d'après Paganini, S.140 - Franz Liszt for Études D'exécutio...

Musescore.com


キチガイ!!!
殺人的に難しい曲。
これ以上難しい曲はあり得ないレベル。
こんなのできる奴はキチガイ。



VisualBasic.NetでAutoCAD直線描画CHATBOT作成に成功!

2024-04-27 16:31:20 | Autocad

Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.Runtime

Public Class DrawLineCommands

<CommandMethod("DrawLine")>
Public Sub DrawLine()
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim db As Database = doc.Database
Dim ed As Editor = doc.Editor

' 1. 始点の座標を入力するダイアログボックスを表示する
Dim startPoint As PromptPointResult = ed.GetPoint("始点の座標を入力してください:")
If startPoint.Status <> PromptStatus.OK Then
Return
End If

' 2. 終点の座標を入力するダイアログボックスを表示する
Dim endPoint As PromptPointResult = ed.GetPoint("終点の座標を入力してください:")
If endPoint.Status <> PromptStatus.OK Then
Return
End If

' 3. 入力された座標を反映する
Using tr As Transaction = db.TransactionManager.StartTransaction()
Dim bt As BlockTable = tr.GetObject(db.BlockTableId, OpenMode.ForRead)
Dim btr As BlockTableRecord = tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)

Dim line As New Line(startPoint.Value, endPoint.Value)
btr.AppendEntity(line)
tr.AddNewlyCreatedDBObject(line, True)

tr.Commit()
End Using

ed.WriteMessage("Line drawn successfully.")
End Sub

End Class




ChatGPTには座標入力コンポーネントの表示をしてくれと頼んだが、コマンド入力ボックスの上に始点(または終点)の座標を入力してくださいと表示されるにとどまった。

ちなみに写真では、一本目の直線の終点に二本目の直線の始点に選んでコマンド”DrawLine”を入力すると、

再度チャットボットの会話が始まり、終点の入力を促される。

まだ少々問題点が残ったが、やりたいことに向けて着々と進んでいる!


【追伸】

この直線描画CHATBOTはいちいち座標を入力する必要がない。マウスを動かして任意の位置にポインターをあわせてワンクリックし、始点や終点として選べるようになっている。

すでに出来上がったエレメントの端点にポインターを合わせれば、そこを始点に直線をひける。


AUTOCADでチャットボット!改造してみたwww

2024-04-27 16:12:14 | Autocad

改造したのはこの部分だけwww

Private Function GetResponse(input As String) As String
' ユーザーの入力に応じて適切な応答を生成
Select Case input.ToLower()
Case "バカ!", "アホ"
Return "何だテメェゴルァ!凸(◎曲◎♯)"
Case "かかってこいよ"
Return "ヘタレ!"
Case "口先番長", "詐欺師", "バカチョン"
Return "一昨日きやがれ!"
Case Else
Return "日本語しゃべれねーのか?このバカチョンチャンコロめが!"
End Select

文字化けするかな?と思ったが、あっさり成功。




バカ!またはアホと入力すると、

何だテメェゴルァ!凸(◎曲◎♯)

と顔文字付きでレスが来るのが今回狙った改造箇所。

CaseやReturnの””内は自由に変えられるし、AまたはBまたはCと入力が変わる場合、

Case "A", "B", "C"のように「,」で区切ればよい。


君の名は希望

2024-04-24 21:55:05 | 日記






通勤に千代田線を使っている。
乃木坂駅の発車メロディは「君の名は希望」。
生田絵梨花のピアノ演奏が使われているそうだ。

このピアノの音が素晴らしい。

毎朝、乃木坂駅で停車する際にドアが開いてこのメロディが鳴るのを楽しみにしている。

いつもこの発車メロディに癒やされている。

東京さくらトラム(都電荒川線)

2024-04-24 20:40:00 | 日記
今日は休日なので、まず西新宿の司法書士法人に行ってイオンカードの過払い金返還請求依頼手続きをして、次に西巣鴨の服部管楽器にE♭管アルトトランペットを受け取りに行った。


途中、東京さくらトラム(都電荒川線)に初めて乗り、服部管楽器の最寄り駅である庚申塚駅で降りた。以前から気になっていて一度乗ってみたかった。(俺は鉄ヲタじゃない)


東京さくらトラムは東京で唯一残ったチンチン電車らしい。この電車の沿線はのんびりした雰囲気があり、住みやすそう。



「都電もなか」の広告を見て、ゴールデンウィークの帰省時に御土産として買ってきてあげたいと思った。

お目当てのE♭管アルトトランペット。
店でナンセンスな質問をしてしまった。B♭管トランペットシャンクでしたよね?もちろんB♭管のMPも使えますね?
入札前に質問しとくべきだったが、なぜか忘れていてポチッてしまった。

さて、デンマーク王子の行進曲でもやってみようかな?
原曲はD-majorだから、ピストンを押さないで吹くにはキーを半音上げてE♭-majorでやらなければならない。またはメインチューニングスライドを2番管と同じ長さに伸ばす必要がある。
キーを上げずに原曲の通りに吹くにはH-major、つまり2番ピストンを押しっぱでやることになる。

※司法書士からの情報によると、イオンカードが一番過払い金返還請求がしやすく、実績が最もあるそうだ。
しかも他のカードに使えなくなったり等の影響が無く、イオンカードも今まで通りに利用可能とのこと。

ちなみにいくら過払い金があるかの調査は無料、もし過払い金返還請求ができないことが判明しても費用はかからないらしい。

調査の結果、司法書士への依頼・手続き費用が返還される金額を上回って赤字になるおそれがある場合は、キャンセルとなり、費用はかからないそうだ。

ならばやらない理由は無いだろう。

司法書士と雑談していて、なぜサービス残業や不当解雇に対して本人訴訟をしてでも戦おうとせず、みんな泣き寝入りするんだろうか?という話になった。
敗訴しても印紙代・切手代、交通費の3万程度で済むわけだし、相手のブラック犯罪企業は勝訴したとしても弁護士に依頼すれば、弁護士費用自己負担の原則により、大赤字を被ることになる。
訴えられる前に大人しく未払い残業代等を支払っとけばよかったと後悔するのにバカですよね?ワハハハ。
ということで帰路についた。

帰路の東京さくらトラムの電車内では父方の祖母に似たばあちゃんに出会い、席を気持ち良く譲った。このばあちゃんが乗り込んで来た所を見た瞬間に、「ああ、父方のばあちゃんにそっくりだ。ろくにばあちゃん孝行をしないまま、ばあちゃんはガンで壮絶な闘病生活を送り、ヤブ医者に騙されて亡くなったのだ。だから席を譲って徳を積んでばあちゃん孝行をしたつもりでも」と思い、自然と身体が動いた。
このばあちゃんは喜んでくれた。


Serguei Rachmaninov Concerto pour piano No.2 練習中

2024-04-21 20:34:24 | 音楽・楽器

折畳式の安モンキーボードを久々に引っ張り出してきた。

しかも安モンなのに88鍵フルサイズ!

ペダルはどっかにいっちゃって探すのがめんどいからノーペダルで。


International Music Companyの連弾用楽譜。
中途半端に親切で運指が載っているが、やり辛い運指だからシカト。



こちらは独りラフ用楽譜www
運指を書き写したが、結局シカト。

音を覚えればなんとかなりそうな気がした。
以外と弾きやすい感じ。

木枯らしのエチュードよりやさしいかも?www

木枯らしのエチュードは音を覚えたとしても、やり辛い変則歯抜けトレモロで、書かれている運指でも速く弾くのは困難。

どう考えても俺にとってはラフマニノフより木枯らしの方がムズいと感じた。

ちなみにラフマニノフの前にグリーグのピアノコンチェルトをちょろっとやってみたが、途中で悪魔の二重和音半音階が出てくる。ショパンのエチュードの25-6を彷彿とさせる。

フルートは防音室が設置できないからアパートでは練習できないが、ピアノはイヤホンつければ問題無い。

できれば毎日、ラフマニノフと木枯らしを交互にチマチマ練習していきたい。

AutoCADで簡易チャットボットをやってみたwww

2024-04-20 15:41:42 | Autocad

ソースコードはVB.NET。








Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Runtime

Public Class ChatBotCommands

<CommandMethod("CHATBOT")>
Public Sub StartChatBot()
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor

While True
Dim userInput As String = GetUserInput("You: ")
Dim response As String = GetResponse(userInput)
ed.WriteMessage($"Bot: {response}" & vbCrLf)
End While
End Sub

Private Function GetUserInput(prompt As String) As String
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim options As PromptStringOptions = New PromptStringOptions(prompt)
options.AllowSpaces = True
Dim result As PromptResult = ed.GetString(options)
If result.Status = PromptStatus.OK Then
Return result.StringResult
Else
Return String.Empty
End If
End Function

Private Function GetResponse(input As String) As String
' ユーザーの入力に応じて適切な応答を生成
Select Case input.ToLower()
Case "hello", "hi"
Return "Hello! How can I help you?"
Case "how are you?"
Return "I'm just a program, so I don't have feelings, but thanks for asking!"
Case "bye", "exit", "quit"
Return "Goodbye! Have a great day!"
Case Else
Return "I'm sorry, I didn't understand that."
End Select
End Function

End Class

Case1「 "hello", "hi"」と入力すると

Return "Hello! How can I help you?"


Case2 「"how are you?"」と入力すると

Return "I'm just a program, so I don't have feelings, but thanks for asking!"


Case3 "bye", "exit", "quit"

Return "Goodbye! Have a great day!"

Case Else 例えばFuck You!と入力すると・・・


Return "I'm sorry, I didn't understand that."

それ以外も同様となる。なかなか面白かった。

ちなみに、三角錐とか円錐とか、立方体を円柱でくり抜くとかちょっと高度なコードをChatGPTにコード生成させたらエラーばっかで全然だめだったので、チャットボットにしてみた。テトリスはAUTOLISPでは動いたが、VB.NETではだめだった。インベーダーゲームも試したがだめだった。


暴走するC++プログラム

2024-04-20 08:58:04 | C / Visual C++
#include <stdio.h>
int main(int argc, char** argv)
{
int i;
for (i = 1; i <=5; i--) {
printf("%d ", i);
}
printf("¥n");
return 0;
}
と書いてAndroidのIDEで実行すると…




i++は数字が1ずつ足されながら実行されていくので、実行すると1 2 3 4 5と表示されてプログラムは終了するが、i--に変えるとエラいことになる。
俺は1ずつ減りながら実行されて1 0 -1 -2 -3と表示されてプログラムは終了すると予想していたのだが。
P.S.
→間違いであることが判明。

#include <stdio.h>
int main(int argc, char** argv)
{
int i;
for (i = 100; i >=5; i--) {
printf("%d ", i);
}
printf("¥n");
return 0;
}

の様に書き換えると、iが5以上である間、100から1ずつ減っていき、5になったらプログラムが終了する。

100 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 ¥n
[Program finished]

逆に5 4 3 2 1と1ずつ減っていき、1でプログラムを終了させたければ、
#include <stdio.h>
int main(int argc, char** argv)
{
int i;
for (i = 5; i >=1; i--) {
printf("%d ", i);
}
printf("¥n");
return 0;
}
と書けば良い。

予想の通りにしたければ…
#include <stdio.h>
int main(int argc, char** argv)
{
int i;
for (i = 1; i >=-3; i--) {
printf("%d ", i);
}
printf("¥n");
return 0;
}
と書くと
1 0 -1 -2 -3
となって予想通りに表示される。
短いプログラムだったが、なかなか面白かった。