* [2023-02-26 日]
小雪

** lisptea timeの質問のまとめ :lisp:
前回は普段訊きたいなと思ってた事をメモし忘れてたので、
今回は思いついた時に紙に書き殴っておいた。

しかし、今日はdiscordと直前になって知って
慌てて登録したものの前回使っているので、
当然登録済みな訳で。。。
とにかく書くと長くなるからその辺省略するが、
いろいろと大変だった。

*** プロジェクトの作成の手順
これについてはだいたいquickprojectかcl-projectの
2択かなと思ってたけど、今日教えて頂いたのはcl-projectの方。
こっちはBOM付きファイルでエラーが出て最初は難儀したけど、
前者に比べるとtestまで想定したしっかりしたスケルトンという感じ。
あまり自分でtestしてないんだけど苦笑
とりあえず、make-projectがシェルコマンドとして登録
されているので、terminalから直接プロジェクト作成出来て
便利だと思った。
(自分はわざわざ自分専用のros scriptを書いてたが、
アホすぎた。その名もまさにmake-project笑)

#+begin_src lisp : 
  ;; 自作make-project
  (defun main (argv)
    (declare (ignorable argv))
    (let* ((author "biofermin2")
          (license "MIT")
          (file (merge-pathnames (make-pathname
                                    :directory `(:relative ".roswell" "local-projects" ,author ,argv))
                                 (user-homedir-pathname))))
      (quickproject:make-project file
                                 :author author
                                 :license license))) ; => MAIN

#+end_src

でも、これはquickprojectの方を使ってる。
とりあえず、lisperの方だとこんな感じ。

#+begin_src shell
  $ make-project <project name>
  $ cd <project name>
  
  ;; ros scriptを作成時は以下を実行
  $ mkdir roswell
  $ sudo chmod 777 roswell
  $ cd roswell
  $ ros init <ros script name>
#+end_src

で、projectのディレクトリ内でgit initとか
してリモート側にpushしていくような感じの流れらしい。

リモート側から作るのか、ローカル側から作るのか
どっちでもできるだろうから一体どういう流れなんだろうなぁと
思っていたが、ローカル→リモートという流れのようだ。

その辺りの説明はこれか。
ローカルでホストされているコードを GitHub に追加する

*** dexadorでのhash tableの使い方

#+begin_src lisp
  (ql:quickload :dexador :silent t)       ; => (:DEXADOR)

  (dex:get "https://yahoo.co.jp")         ; => "<!DOCTYPE html><html lang=\"ja\"><head><meta charSet=\"utf-8\"/><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\"/><title>Yahoo! JAPAN</title><meta name=\"description\" content=\"あなたの毎日をアップデートする情報ポータル。検索、ニュース、天気、スポーツ、メール、ショッピング、オークションなど便利なサービスを展開しています。\"/><meta name=\"robots\" content=\"noodp\"/><meta name=\"viewport\" content=\"width=1010\"/><link rel=\"dns-prefetch\" href=\"//s.yimg.jp\"/><link rel=\"dns-prefetch\" href=\"//yads.c.yimg.jp\"/><meta name=\"google-site-verification\" content=\"fsLMOiigp5fIpCDMEVodQnQC7jIY1K3UXW5QkQcBmVs\"/><link rel=\"alternate\" href=\"android-app://jp.co.yahoo.android.yjtop/yahoojapan/home/top\"/><link rel=\"alternate\" media=\"only screen and (max-width: 640px)\" href=\"https://m.yahoo.co.jp/\"/><link rel=\"canonical\" href=\"https://www.yahoo.co.jp/\"/><link rel=\"shortcut icon\" href=\"https://s.yimg.jp/c/icon/s/bsc/2.0/favicon.ico\" type=\"image/vnd.microsoft.icon\"/><link rel=\"icon\" href=\"https://s.yimg.jp/c/icon/s/bsc/2.0/favicon.ico\" type=\"image/vnd.microsoft.icon\"/><link rel=\"apple-touch-icon-precomposed\" href=\"https://s.yimg.jp/c/icon/s/bsc/2.0/y120.png\"/><meta property=\"og:title\" content=\"Yahoo! JAPAN\"/><meta property=\"og:type\" content=\"website\"/><meta property=\"og:url\" content=\"https://www.yahoo.co.jp/\"/><meta property=\"og:image\" content=\"https://s.yimg.jp/images/top/ogp/fb_y_1500px.png\"/><meta property=\"og:description\" content=\"あなたの毎日をアップデートする情報ポータル。検索、ニュース、天気、スポーツ、メール、ショッピング、オークションなど便利なサービスを展開しています。\"/><meta property=\"og:site_name\" content=\"Yahoo! JAPAN\"/><meta property=\"twitter:card\" content=\"summary_large_image\"/><meta property=\"twitter:site\" content=\"@Yahoo_JAPAN_PR\"/><meta property=\"twitter:image\" content=\"https://s.yimg.jp/images/top/ogp/tw_y_1400px.png\"/><meta property=\"fb:app_id\" content=\"472870002762883\"/><link rel=\"stylesheet\" href=\"//s.yimg.jp/images/yjtop-pc/orion/v142/bundle_v142.css\"/><script>window.onbeforeunload = function() {}</script><script>
              var TLDataContext = {
                ual : {
  <途中省略>
  })();</script></body></html>"
  200
  #<HASH-TABLE :TEST EQUAL :COUNT 18 {10020BCFD3}>
  #<QURI.URI.HTTP:URI-HTTPS https://www.yahoo.co.jp/>
  #<CL+SSL::SSL-STREAM for #<FD-STREAM for "socket 192.168.10.105:34302, peer: 183.79.250.251:443" {1001F71943}>>
#+end_src

これを見ていつも
 #<HASH-TABLE :TEST EQUAL :COUNT 18 {10020BCFD3}>
 って事はこのhash tableのデータを何かに使えたりするのか?
 と思った訳で。

 これに関しては
文字列、ステータスコード、ハッシュテーブル、URLともう1つなんだろう?
とりあえず、sslってあるからsecurity関係かな?

という事がわかるので、multiple-value-bindで件のコードを囲んで
変数に格納し、maphashを使って格納したデータを表示するという方法があるとの事。

#+begin_src lisp
  (ql:quickload :dexador :silent t)       ; =>(:DEXADOR) 

  (multiple-value-bind (string status hashtable url security)
      (dex:get "https://biofermin2.github.io")
    (maphash #'(lambda (k v) (format t "~a: ~a~%" k v)) hashtable)) ; =>connection: keep-alive
  content-length: 1368
  server: GitHub.com
  content-type: text/html; charset=utf-8
  permissions-policy: interest-cohort=()
  last-modified: Tue, 21 Feb 2023 08:09:08 GMT
  access-control-allow-origin: *
  etag: "63f47c24-558"
  expires: Mon, 27 Feb 2023 05:07:50 GMT
  cache-control: max-age=600
  x-proxy-cache: MISS
  x-github-request-id: 5C22:7572:EBB4:559BA:63FC384E
  accept-ranges: bytes
  date: Mon, 27 Feb 2023 04:58:02 GMT
  via: 1.1 varnish
  age: 12
  x-served-by: cache-itm18829-ITM
  x-cache: HIT
  x-cache-hits: 1
  x-timer: S1677473883.802889,VS0,VE1
  vary: Accept-Encoding
  x-fastly-request-id: d4092071270eafafcaa8365a9bf72b1b4e9d6dc7
  NIL 
#+end_src

その他にもinspectorを使って、表示する方法も教えていただいた。
普段あまりreplを使ってないので気づかなかったが、REPL上で
出力したhashtableの箇所をマウスで右クリックするとinspectorと
プロダウンメニューにあるので、それを指定すればOK

個人的にはC-csにslime inspectorを設定していると
思ったが、slime selectorの間違いだった笑

slime selectorもあまり使った事ないけど、以下の通り。
Select Methods:

4:      Select in other window
?:      Selector help buffer.
c:      SLIME connections buffer.
d:      sldb buffer for the current connection.
e:      most recently visited emacs-lisp-mode buffer.
i:      inferior-lisp buffer.
l:      most recently visited lisp-mode buffer.
n:      Cycle to the next Lisp connection.
p:      Cycle to the previous Lisp connection.
q:      Abort.
r:      SLIME Read-Eval-Print-Loop.
s:      slime-scratch buffer.
t:      SLIME threads buffer.
v:      slime-events buffer.

slime inspectorはC-cIにバインドされているとの事。
3.11 Inspector commands

REPLから指定するのとちょっと勝手が違う感じがする。

あとはalexandriaのhash-table-alistで
alist表示も出来ますよ!って教えていただいた。
途中だけど、ここまで。