Open8

使い捨てスクリプト供養

ピン留めされたアイテム
hymkorhymkor

削除する前に供養するスレとなります

hymkorhymkor

(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)
}
hymkorhymkor

(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
}
hymkorhymkor

(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)
	}
}
hymkorhymkor

(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)
)
hymkorhymkor

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

つらい

hymkorhymkor

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)
	}
}
hymkorhymkor

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