使い捨てスクリプト供養
削除する前に供養するスレとなります
(1) clipboard_run.go
クリップボードの中に格納されているテキストの Unicode を表示するために書いたらしい。
たぶん、Recovery issue 390 Unicode · Issue #394 · zetamatta/nyagos 向け。go run 用なので、nyagos ビルド時に組み込まれないように、先頭に // +build ignore
が書いてある。
// +build ignore
package main
import (
"fmt"
"os"
"github.com/atotto/clipboard"
"github.com/mattn/go-runewidth"
)
func main() {
text, err := clipboard.ReadAll()
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
return
}
for _, r := range text {
fmt.Printf("'%c'<%X>[%d] ", r, r, runewidth.RuneWidth(r))
}
fmt.Println()
fmt.Println(text)
}
(2) tty_windows.go
あれ?最近似たようなもの書いたような気が。コンソールの設定レベルで Ctrl-C を無効にする関数定義(スクリプトじゃねーじゃねーか)。タイムスタンプを見るとMar 31 2019とある。
「設定を元に戻すクロージャ」を戻り値に返すのは、一つの定番的な書き方ですなぁ
// +build shisakuhin
package nodos
import (
"golang.org/x/sys/windows"
)
func DisableProcessInput() (func(), error) {
var mode uint32
err := windows.GetConsoleMode(windows.Stdin, &mode)
if err != nil {
return func() {}, err
}
newMode := mode
newMode &^= windows.ENABLE_PROCESSED_INPUT // Ctrl-C off
newMode |= windows.ENABLE_LINE_INPUT
newMode |= windows.ENABLE_ECHO_INPUT // echo back
err = windows.SetConsoleMode(windows.Stdin, newMode)
if err != nil {
return func() {}, err
}
return func() {
windows.SetConsoleMode(windows.Stdin, mode)
}, nil
}
(3) postone.go
なんか、slack に投稿するコードのようだ。でも、会社、slack から teams へ移行したんだよな。だから、もう使うシーンはない
package main
import (
"bufio"
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
type Message struct {
Text string `json:"text"`
Channel string `json:"channel",omitempty`
}
func (json1 *Message) PostTo(webHookUrl string) error {
bin, err := json.Marshal(json1)
if err != nil {
return err
}
fmt.Println(string(bin))
res, err := http.Post(webHookUrl, "application/json", bytes.NewReader(bin))
if err != nil {
return err
}
fmt.Println(res.Status)
sc := bufio.NewScanner(res.Body)
for sc.Scan() {
fmt.Println(sc.Text())
}
if err := sc.Err(); err != nil {
fmt.Fprintln(os.Stderr, err)
}
defer res.Body.Close()
return nil
}
const (
WEBHOOKURL = "https://hooks.slack.com/services/xxxx/yyyy/zzzzz"
TEST_CHANNEL = "wwwwwww"
)
func main() {
message := &Message{
Text: "Post Test",
Channel: TEST_CHANNEL,
}
if err := message.PostTo(WEBHOOKURL); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
(4)
嘔吐CADで、図面に貼り付けられたラスターイメージの情報をコンソールに出すコードらしいぜ
(コピペでコンソールに貼り付けたコードなので、ファイル名すらない)
(progn
(setq ss (ssget "X" '((0 . "image")))
count (sslength ss)
)
(while ( > count 0 )
(setq count (1- count)
en (ssname ss count)
en (entget en)
)
(prin1 en)
)
(princ)
)
(5)
go getだけでコマンドのバージョンを埋め込む - Plan 9とGo言語のブログ の検証のため、書いてみた。
package main
import (
"fmt"
"runtime/debug"
)
func main() {
if info, ok := debug.ReadBuildInfo(); ok {
fmt.Println(info.Main.Version)
} else {
fmt.Println("not found.")
}
return
}
だが、記事中にあるように、「カレントディレクトリがmainモジュールと同じ場合」は常に (devel)
になってしまうらしい。残念
$ ./go-version-tag.exe
(devel)
つらい
zenndown/main.go
記事のバックアップ で、がんばったコード。記事のソース https://zenn.dev/api/chapters/4580/blob.md
は直接とれないけど、 https://zenn.dev/
ならとれた(意味がない)
エクスポート機能が間もなく登場しそうだということで、当初目指したものは不要になったが、chromedp という Chrome をコントロールして、スクレイピングする技術自体は今後活用できそうな気がする。
package main
import (
"context"
"fmt"
"os"
"github.com/chromedp/chromedp"
"github.com/chromedp/cdproto/dom"
)
func get(url string)error{
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
var res string
err := chromedp.Run(ctx,
chromedp.Navigate(url),
chromedp.ActionFunc(func(ctx context.Context) error {
node, err := dom.GetDocument().Do(ctx)
if err != nil {
return err
}
res, err = dom.GetOuterHTML().WithNodeID(node.NodeID).Do(ctx)
return err
}),
)
fmt.Println(res)
return err
}
func main() {
// if err := get(`https://zenn.dev/api/chapters/4580/blob.md`); err != nil {
if err := get(`https://zenn.dev/`); err != nil {
fmt.Fprintln(os.Stderr, err.Error())
os.Exit(1)
}
}
smake で書いた nyagos のビルドファイル Makefile.lsp。smake が必要な点を除けば、現在の Makefile とだいたい同じ動作をする(はず)
; Makefile.lsp ( https://github.com/hymkor/smake )
(defglobal version (shell "git describe --tags"))
(defun make-test ()
(dolist (script (wildcard "t/lua/*.lua"))
(x "./nyagos" "--norc" "-f" script))
(if (equal (getenv "OS") "Windows_NT")
(dolist (script (wildcard "t/cmd/*.cmd"))
(sh script)))
(dolist (dir (wildcard "internal/*"))
(pushd dir
(if (wildcard "*_test.go")
(sh "go test")
(echo "no *_test.go")))))
(defun build ()
(env
(("CGO_ENABLED" "0"))
(sh (string-append "go build -ldflags \"-s -w -X main.version=" version "\""))))
(defun right (seq n)
(let ((L (length seq)))
(subseq seq (- L n) L)))
(defun make-fmt ()
(dolist (line (string-split #\newline (shell "git status -s")))
(let ((f (string-fields line)))
(if (and (equal (car f) "M")
(equal (right line 3) ".go"))
(x "go" "fmt" (last f))))))
(defun make-all ()
(make-fmt)
(dolist (dir '("bin" "bin/386" "bin/amd64"))
(unless (-d dir)
(x "mkdir" dir)))
(env (("GOOS" "windows")("GOARCH" "386"))
(sh "go build -o bin/386/nyagos.exe -ldflags \"-s -w\""))
(env (("GOOS" "windows")("GOARCH" "amd64"))
(sh "go build -o bin/amd64/nyagos.exe -ldflags \"-s -w\""))
(env (("CGO_ENABLED" "0") ("GOOS" "linux") ("GOARCH" "amd64"))
(sh "go build -ldflags \"-s -w\"")))
(defun make-zip (arch)
(let ((zipname (string-append "nyagos-" version "-windows-" arch ".zip")))
(apply
echo
"zip" "-9j" zipname
(pathjoin "bin" arch "nyagos.exe")
".nyagos" "_nyagos" "makeicon.cmd" "LICENSE"
(wildcard "Etc/*.ico"))
(apply
echo "zip" "-9" zipname (wildcard "nyagos.d/*.lua" "nyagos.d/catalog/*.lua"))))
(defun make-package ()
(make-zip "386")
(make-zip "amd64")
(echo "tar" "zcvf" (string-append "nyagos-" version "-linux-amd64.tar.gz")
"-C" ".." "nyagos/nyagos" "nyagos/.nyagos" "nyagos/_nyagos" "nyagos/nyagos.d"))
(defun make-clean ()
(rm "nyagos.exe" "nyagos" "nyagos.syso"))
(make
$1
('("all") (make-all))
('("test") (make-test))
('("fmt") (make-fmt))
('("package") (make-package))
)