基本的に怠Diary

学習ログを残したい

っけねーミスったわ〜w

めっちゃコード書いてるのにAPIKEY入ってるからギッハブにあげられねーわw

めっちゃ書いたのになーww

トランスパイル

私のコードは大したことがなく、Gitの使い方を理解していません。


こんなので2ヶ月ってお前マジ?

あれから 僕たちは APIを適当にいじるぐらいしかやってこなかったかな…

とりあえず共通で使っていきそうなコードは「mylib.lisp」というファイルにまとめている。

mylib.lisp

(provide 'asdf)

(in-package :common-lisp-user)

(ql:quickload '(:dexador :cl-json :cl-cron))

;;なんかこれもはるか前にパクった気がする
;;急いで調べたら下記サイトを参考にしてた
;;http://peccu.hatenablog.com/entry/2016/12/21/220000
(defvar payload-template "{
\"#channel\": \"#~a\",
\"username\":\"~a\",
\"text\":\"~a\"
}") 

(defvar slack-hook-url "< Hook用のURL>")

;;ほぼ丸パクリしたやつ
;;クリエイティブ・コモンズを理解できない知的なアレなのでここには書かない。
(defun get-format-date ())

(defun post-slack (room user text)
  (dex:post slack-hook-url
            :content `(("payload" . ,(format nil payload-template room user text)))))

(defun get-val (key list)
  (cond ((null list) nil)
        ((eql (car list) key) (cadr list))
        (t (get-val key (cdr list)))))

(defun recursion-key-search (value keys)
  (let ((val-list '()))
    (labels ((f (value keys)
             (cond ((null value) )
                   ((listp value)
                    (cond ((member (car value) keys)
                           (setf val-list (cons value val-list)))
                          (t (f (car value) keys)
                             (f (cdr value) keys))))
                   (t nil))
             ))
      (f value keys))
    val-list))

;;Keysの先頭で再帰的に検索をかけて、存在した場合、そのリストをkeysのcdrを渡して再帰的に行い
;;keysがnullになるまで続ける。
(defun tree-search (value keys)
  (let ((val-list '()))
    (labels ((f (value keys)
             (cond ((null value) )
                   ((listp value)
                    (cond ((eql (car keys) (car value))
                           (if (not (null (cdr keys)))
                               (f value (cdr keys))
                               (setf val-list (cons value val-list))))
                          (t (f (car value) keys)
                             (f (cdr value) keys))))
                   (t nil))
             ))
      (f value keys))
    val-list))

コメントにも書いてあるけどslack通知辺りは下を参考にしたりした。

peccu.hatenablog.com

get-format-dateに関しては

http://tips.cddddr.org/common-lisp/index.cgi?%E7%8F%BE%E5%9C%A8%E3%81%AE%E6%97%A5%E4%BB%98%E3%82%92%E6%B1%82%E3%82%81%E3%82%8B

に手を加えたものを利用しているがクリエイティブ・コモンズがよくわからないので書かない(大事なことなので2度

タイトルと作者名と転載元ってどれかけばいいの。

てか本当にそれだけでいいのかな。

日本語を理解できないの辛いのでそろそろ社会と隔絶した世界でプログラミングと日本語と英語の学習に励みたい。

https://creativecommons.org/licenses/by/2.1/jp/

本気でここ見ても自信持てないのもう人間と関わるの諦めたさある。

なんで仕事してんの俺。早くやめないとさらに人に迷惑かけちゃうよ。

辛い。

weather.lisp

(load "mylib.lisp")
(in-package :common-lisp-user)

(ql:quickload '(:dexador :cl-json :cl-cron))
(defvar open-weather-api-key "<api key>")
(defvar open-weather-uri "http://api.openweathermap.org/data/2.5/forecast")

(defun weather-json ()
  (json:decode-json-from-string
   (dex:get
    (concatenate 'string (createQuery open-weather-uri "<僕の家の近くの郵便番号>"
                                      open-weather-api-key)))))

(defun createQuery (baseuri q app-key)
  (format nil "~a?zip=~a,jp&APPID=~a" baseuri q app-key))


(defun weather-info-to-slack ()
  (let* ((weather-list (mapcar #'(lambda (x)
            (recursion-key-search x '(:dt--txt :description)))
                               (cdar (tree-search (weather-json) '(:list)))))
         (format-str-list (mapcar #'(lambda (x)
            (format nil "時間:~a  天気:~a" (cdar x) (cdadr x)))
                           weather-list))
         (post-str (reduce
                    #'(lambda (x y) (cond ((search (get-format-date) y)
                                           (concatenate 'string x y "\\n"))
                                          (t x)))
                    format-str-list :initial-value "")))
    (post-slack "<room>" "<user>" post-str)))

(cron:make-cron-job  #'weather-info-to-slack :hour 7)

rail.lisp

(load "mylib.lisp")
(in-package :common-lisp-user)

(ql:quickload '(:dexador :cl-json :cl-cron))
;;利用してる線の情報を取得する
(defun railway_get (target)
  (let* ((jobj (dex:get
                "https://rti-giken.jp/fhc/api/train_tetsudo/delay.json"))
         (jr_list (json:decode-json-from-string jobj))
         (names (mapcar #'car jr_list))
         (find-target (member target names :key #'cdr :test #'string=)))
    (cond (find-target
           (post-slack "botroom" "gobot" (format nil "~a 遅延が発生しています。" target))))
    ))

(cron:make-cron-job #'(lambda () (railway_get "<利用してる線の名前>")) :hour '(5 6 7))

実は本ソースにはデバッグ用のprintが一行存在していたが恥ずかしかったので消した。

Effective Debugging40回ほど読んで死ね。

恐らく上記コードたちには数多く問題が存在するのだろうが、

一番の問題は loadを利用してることだろう。

達人達(逆から読んでも達人達で草)のコードを見てみてるとasd的なやつでよくわからないことしてる。

でも達人たちのコードとむずかしゅい解説では全然理解できない。

なので実践Common Lispを買って勉強することにした。

おい、Land of Lispはどうした。

いや進めてるよ。あ、あと100ページくらいだから。。。今ダイス君を高速化してるとこだから(なお一月ほど進捗なし)

ちなみにcronはいれてないけど動作検証程度のメモとしてconnpass用のやつもある

(in-package :common-lisp-user)

(ql:quickload '(:dexador :cl-json :cl-cron))

(defvar connpass-uri "https://connpass.com/api/v1/event")
(defvar connpass-tepmlate "~a?keyword=~a&count=~a")

(defun connpass-get (keyword &optional (count 1))
  (let ((conp (dex:get
               (format nil connpass-tepmlate
                       connpass-uri
                       keyword
                       count))))
    (json:decode-json-from-string conp)))

(recursion-key-search (connpass-get "<検索ワード>" 10) '(:title))

これslimeで動作コード行きもしない近くで開催されてる勉強会を毎日チェックしているのは内緒。

相当気持ち悪い


これからやること

weatherぐらいしかちゃんと整形してないので最高に糞

ちなみに今はQiitaAPIで遊んでる。

Elispでなんか記事検索できたらなーみたいなこと考えてる。

そいやぐぐったらqiita.elみたいなものあったけどあれv1使ってるからそろそろ使えなくなるな。

あれパクってv2版作ってみよう。

ライセンス次第では公開できない+そもそも俺にそんなことできない

の二段構えなので記事になるかは不明。