基本的に怠Diary

学習ログを残したい

私の負けです。

負けました。

わかりません。

プロジェクトを計画することに対して

参考書をつまみ食いしながら力をつけることに

GitHubにオリジナル要素の強くて渋いコードをかくことに

ふんわりと思いついたプロジェクトを実現することに

負けました。

あ、人間関係とかはとっくに負けてるのでださないです。

これからなにすればいいのかわからない。どうすればスーパープログラマになれるのかわからない。

誰か教えてっつっても誰も教えてくれない。

ただひとつ、わかるのは

今のままではダメなんだ・・・・今のままでは・・・

???「こら!の○太!Lispで遊んでばかりいないで役に立つ言語の勉強しなさい!」

でも実際○び太くんの方がはるかにスペック上なんですよねそもそも僕伸びしろとかないから伸びない太でさらに日本語理解出来ないから人間のクズどころのはなしでh

とか言われたのでJavaの勉強します!!!!!!覚えとけよ

gihyo.jp

Jenkins == Javaやめろ。

JenkinsもJavaも知らない(特にJenkins知らない)のでイメージ。

手元に放置してたJUnitもあるしちょうどええやろ。

mintblog.hatenablog.com

この記事を挿入して

「やめるんだ相棒!こんなことしちゃいけない!」

的な一人芝居やろうとする前に

TDDの本を買う

これ思い出した。。。  購入してなひ。

物忘れが大井っち。

まあでもJUnitの本あるしいいや。

React、Lisp「」

~おしり~


LispはともかくReactはJavaの学習とうまいことつなげたい。けど破錠しそう。

ギッハブもなんか最初の設定PONと置いただけで止まってるしな。。。

てかいろいろこねくり回してたらPushできなくなったから多分またksh(ケッシュと読ませたいが実はしなくてもケーシェルと読む1)

まあなんだ

ReactでもJenkinsでもなんでもいいからとっとと進捗を出せ

というわけでvagrant環境でJenkinsを走らせておりまふ

そいや今回私はbento/centos-7.2を利用しましたが、

本の中と調べたQiitaの記事

これ qiita.com

では/etc/yum.repo

にrepoファイルをいれていました。

しかし私の環境では/etc/yum.repo.d/

みたいなのがあってそこの下にファイル別でリポジトリ管理してるようになってるので?

とりあえず拾ってきたrepoファイル移動したらできた。

けどyum.repoの名前はどう考えても悪そうだけどいいのだろうか。

vagrantだしいいやという結論になった。

けどなんか気持ち悪いしjenkins.repoにした。

次はJenkinsでSlackに通知でもしてみるか。


趣味

最近自転車ばかり乗ってる気がする。

べ、別に自転車別に好きってわけじゃないんだけど//

運動として最適なんだよな。けど長く走ってると自分の世界に入りすぎて

職場の悪口とかペダル回しながらブツブツ叫んでるの最高に気持ち悪いけど気持ちいい。

とりあえずJenkinsにnotification pluginいれたらいたるところでぬるぽ祭りになってすごいことになったので

解決してから新しい記事を書こうと思いました。

追記

再起動したら直った。

やっぱJenkinsにプラグイン入れた後は一度落としたほうがいいのかもしれない。

エンジニアのための時間管理術、あれはよいものだ

www.oreilly.co.jp

内容自体は今の業務に全く役に立ってないけどね!

というか無能すぎてそれ以前の問題に直面するなどしている。早くやめたい。

アジャイルサムライ読んだ。面白かった(小学生並

estore.ohmsha.co.jp

一週間ごとのイテレーションを一月回して何らかの問題を解決する。

アジャイルプログラマ生活を今から始めてみよう。

うん。無理だ。

まずは何か計画して、やってみよう(もうモクモク木曜日終わりそうだけど)

そういえば

人間や本の言葉を理解できないことが大井っち。

本の内容を正しく批評すると確実に多くの人の解釈とかけ離れていたりしてると思う。

それが怖くて明言を避けてる節もある。

そんな僕が仕事を始めたら?

そんなのどうなるかわかってるよね。

つまり俺は仕事をしてはいけない。今すぐやめるべきだ。


自虐入ったの戻すの大変だった。

今月の目標

1. Reactを勉強する

わりと古くなってしまってるが、

www.oreilly.co.jp

www.oreilly.co.jp

を終わらせる。

2. TDDへの理解を深める。

アジャイルサムライからの影響でつ

当たり前だけどチームで戦うことメインだったのでやはり僕では活かすことはできない

かもしれないけど少しでも参考にできるところは参考にしたい。

写経系はともかく、趣味のコードはなるべくTDDで開発したいとかほざいてるけど

ここで書いとくとかいっといてこれ以降なんとなくテストなしのコードをアップするの嫌だなーって

なってテストちゃんと書くことを狙ってる

しかし抽象的すぎる目標なのでもう少し具体的なものにしたい。


りあくとくんを てすとしながら つくるのは ?

は? >むり いいえ いやです


Lispは!?

うるせえ

今週の目標

  1. ReactとTDDに関する本について調べる。

  2. TDDの本を買う

っけねーミスったわ〜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版作ってみよう。

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

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

ことしのぼく

俺は成長している。

二年前はNode.jsすら知らなかったうんこまんだった。

今ではNode.jsで開発が・・・できない(絶望

二年前よりは広く浅く知識が増えた感。

そして今年になって少し経ったので見直しをしてみる。

4月

仕事

新しい環境へと突入。入る前から気がついていたが最高に辛い環境であった。

しかし人間とのコミュニケーションが辛い僕にはちょうどいいのかもしれないと思ったそのときは。

ちなみに開発など全くしない。

入って早くも3回ほどやらかした。ここからとっとと解雇されてブラックでもいいから開発にいきたいと思い始めた。

いやダメだろ。何考えてんだ。ホワイト開発職場でホワイト開発して休日も平日も技術を高めたい。

趣味

  1. エディタ選択

そろそろ開発環境を統一したいと思ったのでエディタ選択を始める。

Vimの方が効率いいんだろうなと考えながらも面白そうという理由だけでEmacsを選択。

  1. 今年の言語

今年は何の言語やろうかなとか考えてた。

色々考えて、Lisp系を始めることにした。

5月

仕事

人間みんな○ね。皆さんとってもフレンドリーで優しくて毎日の仕事が楽しいです。

趣味

Slack通知系がお手軽で楽しそうだなーと気がついたのでLispを使ってそれっぽいものを作り始める。

が全然進まない。一年前以上にペースが落ちてる。

読書の時間を増やした。

6月

拷問

やめたい

趣味

何も進まない。読書も全然頭に入らないことに最後あたりで気がつく。技術書読んでるなの最高に意味なかった。

7月

贖罪

世界で一番僕が無能だと気がつく。

趣味がとても楽しい。でも才能ないくせに妙にイキってて、

しかも僕はこれまでクソみたいなことして他人に沢山迷惑かけてきたから罪を償っていることに気がついた。

この仕事は潰れるまで頑張ろう。

なーんて言うとでも思ったかカス。俺の趣味にまで口出ししてくんな。

来年も同じ職場ならやめることを決意。

趣味

気が楽になった。

もう何も怖くない。


今から何かでっかいことするぞ!っつって何かしても恐らくほとんど何も変わらない。

でも今よりよくなるかもしれないのであるならばそうしよう。

失敗しまくって追い詰められたら死のう。

日本に誇りも希望もないのでその時は興味のない人間に迷惑かけまくってやるから感謝しろ。

目標

嘘っぱちの書くことを制限され、強制された糞目標は放っといて

「エンジニアのための時間管理術」を見つつ、目標を定め直した。

今年中の目標としてブログシステムを作ることにした。

あれれ〜やきうはどうちたの?

去年のGoの目標はどうちたんですか〜〜^〜〜〜〜?

痛いところを突いてくる。

野球は飽きたから無し!(ドン)

Goはやらないといけない。

あの言語には再び力を入れる必要があると思っている。

記事を読み直そう・・・


そういえば僕の読書はほぼうんこしか生まれていなかった

読書についても現在やり方が糞なので再検討中。

少なくとも僕は技術書は読むだけでは確実に駄目。かと言って実践できないものもあるので

そこをどうしていくかは今後調べていかなくてはならない。

ので今から調べる。

「技術書 進め方」

でググっても良いのが全然でてこない。

お前らどうやって身につけてんだよ・・・。

地道にサンプルコードコピペして動かしてわーいして

レベルアーップでマイティマイティアクションXしてるのかよ。

サンプルコード動かしても、何がどうなってるのかわからなくて調べてるうちにどんどん時間潰れていって

そこからさらに汗阿瀬焦りが生じて生じて生じて生じて庄司

僕の人生の結論:急がば回れよカス

後休日やる気ないときに頑張って勉強するのわりと無意味だけど焦ってるのかなんかPC触ってそれっぽいことしてしまう

かなり悪臭(それは部屋の臭い)悪習なのでやめたい。

な〜〜〜〜んにもやる気ないときはゲームやる!

Elonaでもエロゲでもいいので辛くないことをやる。

ただしどれも30分単位だ。

その度に僕にやる気について問合せて、やる気がでたらやる。

今はそれくらいの対策でいいかな。

とりあえず、転職しようにも技術と経験がないので、

まずはギッハブ埋める程度の最低限は行う必要があると思う今日この頃でした。

MacにAnsibleをインストール

気をつけろ・・・MacにAnsibleをインストールするときは・・・素直に

brew install ansible

を使うんだ・・・。

Ansible徹底入門の通りに行ったら死ぬなどした。

opensslv.h辺りでエラー吐いて終わった。

特に調べても事例がなかったから諦めてhomebrew使うなどした。

とりあえず、Macはhomebrew使っとけ思考でいい。

気がする。

マクロ童貞

えーまじマクロ未使用?

マクロ未使用が許されるのは小学生までだよね。


話をしよう。

あれは今から数日前、Todoリストでも作ってやろうとか思ってた時の話でした。

私はいつものようにcl-dbiでDB処理を書いていました。

(defun update-task (id title contents priority)
  (let* ((query
          (dbi:prepare *db*
                       "update set title = ?,contents = ?,priority = ? where id = ?"))
         (result (dbi:execute query title contents priority id)))))

いつもの糞コード。

流石に三ヶ月以上Lispを触ってくると無駄にプライドがついてくるものです(残念ながら実力は…)

ここでふと、「マクロがすごい」とLisperはイカれたloopマクロのように繰り返していたことを思い出したので

私もなんとなくマクロを触ってみることにした。

SQL文はともかく、引数は可変的に処理したい。

引数をリストでまとめて渡せると良いのだが、

残念ながらそんなことできないようだ(もしかしたら、調べ方が足りなかったのかもしれない。)

一個ずつ調整するの面倒くさい・・・。

(defvar db-path "./todo.sqlite3")

(defvar *db*
    (dbi:connect :sqlite3
                 :database-name db-path))

(defmacro update-sql (sql &body body)
  `(dbi:execute (dbi:prepare ,*db* ,sql) ,@body))

;;利用例
(update-sql "insert into todo(title,contents,priority) values(?,?,?)"
            "update-sql-test" "test" 2)

それで試しに作ってみたのがこのupdate-sql

たった一行で簡単に抽象化できるとは思いませんでした。

ハッカー向けとはなるほどとなりました。私は使いこなせるまで何年費やせばよいのやら。

On Lispしっかり読んでもう少しまともに使えるようにしないと