Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2011-07-03

Smiley Hackathon #10に参加してきました!

| 02:32 | Smiley Hackathon #10に参加してきました! - わだばLisperになる を含むブックマーク はてなブックマーク - Smiley Hackathon #10に参加してきました! - わだばLisperになる

7/2(土)にSmiley Hackathon #10またまた参加させて頂きました!

今回も主催の d:id:acotie さん #10会場提供のGaiaXさんありがとうございました。

自分は、#4、#5、#6、#7、#9と参加しているので、今回で6回目。

やってたこと

SRFIの文字列ライブラリ srfi-13をこのハッカソンで仕上げようと思っていましたが、思いの外手強いのと実装にあたりchar-setというものが定義されているのが前提なところがあり中途半端な感じに。

時間があまったので、別のSRFIで手頃なものはないかと探してみたところ、no titleがあったので、これをCLに移植することに挑戦。

こっちは比較的楽勝なものを選んだ筈でしたが、マクロの展開が上手くいかず展開のデバッグにも行き詰まり頓挫。define-syntaxのデバッグの勘が全然浅いためなかなか展開の遷移が追い掛けられません。何か簡単に追い掛けられる方法を模索したいところ。

交流

前回に引き続きArc@mgikenさんと@inuzini_jiroさんを交えつつArcネタで盛り上がりました。

Arc素晴らしいですね!!

是非また参加したいです!

2010-10-26

Shibuya.lisp Hackathon #1開催

| 21:41 | Shibuya.lisp Hackathon #1開催 - わだばLisperになる を含むブックマーク はてなブックマーク - Shibuya.lisp Hackathon #1開催 - わだばLisperになる

先週の日曜日にShibuya.lispのHackathonが開催されました。

@acotieさん主催のSmiley HackathonにインスパイアされたこのHackathon、無線LAN/電源完備、という日本オラクルさんの素晴しい環境のおかげで好評のうちに終了しました。

会場を提供して頂いた日本オラクルさん、窓口となって頂いた、@ymotongpooさん、主催者の@yshigeruさん、参加者の皆さんありがとうございました。

参加者は、申し込み86名、実際に会場で数えた参加者は52名という感じでした。

運営が思い付きで企画した割には参加者の人に楽しんで頂けたようで良かったです。

全体の流れは、13:00から17:00までは、ひたすらハック、17:00から18:00にかけて発表という感じになりました。

発表内容ですが、

  1. @nitro_idiot
    • PerlのTest::More風のCLテストフレームワーク
  2. @lambda_sakura
    • Common Lisp+SDLで作成しているゲーム(来年完成を目指し販売予定)のデモ
  3. @garaemon
    • Sphinx的なCLのドキュメント生成システム
  4. @Yuumi3
    • iPad上のLisp処理系デモ
  5. @machida
    • Made with secret alien technology パーカー(no title)
  6. @kiwanami
    • deferred.elやskype.elの解説とデモ
  7. @mgiken
    • MongoDB+Arcや、Arc+Vimについて

と結構バラエティーに富んだ内容となりました。

もうちょっと長ければ完成したのに、という声もちらほら聞かれました。

今回でなんとなくの雰囲気は掴めたので、次回開催するときには問題点諸々を改善して開催できたら良いなと思っています。

2010/10/26現在で見付けたShibuya.lisp Hackathon #1感想エントリー

ちなみに、自分がやっていたことですが、運営的に準備が足りなく、いまいち落ちつかないまま、ずるずると時間が過ぎてしまいました。

Hackathonや、テクニカル・トーク運営の準備をするつもりだったのですが…。

2010-09-25

Shibuya.lisp Hackathon #1 2010/10/24開催!

| 23:05 | Shibuya.lisp Hackathon #1 2010/10/24開催! - わだばLisperになる を含むブックマーク はてなブックマーク - Shibuya.lisp Hackathon #1 2010/10/24開催! - わだばLisperになる

Shibuya.lisp参加者の方にアンケートをとったりすると、Hackathonをやってみたいという声がちらほらあったのですが、こないだのSmiley Hackathon #9の会場となった日本オラクルさんの会場が電源、無線LAN、椅子机、プロジェクター完備ということでHackathonをするにはうってつけの会場でした。

日本オラクルさんは会場を勉強会などに積極に提供されているとのことだったので、これは良いことを聞いたとばかりにShibuya.lisp MLでこの会場でのHackathonを提案したところ d:id:yshigeru さんに仕切り役に立候補してもらえて、色々調整して頂き、開催日決定まで辿り着きました。

これまで、LISPの話を聞くイベントや勉強会はありましたが、LISPを書く集まりというのは、あまりなかったように思います。

ぶっちゃけたところ、どれ位LISPのコードを書いたりしてる人がいるのか、どういう人がLISPのコードを書いているのか、どういう需要でLISPのコードを書いてることが多いのか、色々と興味深いことが発見できるんじゃないかなあと思っています。

などと自分は言っていますが、LISP関係の雑談でも、SICPやPAIPの勉強でも、LISPにこじつけてあればなんでもOKでゆるく参加してもらえたら良いなと思います。

いまのところ、52/80名の方が参加する予定になっていますが、あと30枠くらい余っていますので、折角なので是非ご参加ください!

自分は、この機会にShibuya.lispの運営関係のルーチンワークをまとめてテンプレ化して運営の省力化を考えたり、過去の活動のウェブ上の情報をまとめて整理して後から参照しやすくしたりしようかなと思っています。

Shibuya.lispサイトでの告知:

2010-08-22

Smiley Hackathon #9に参加してきました!

| 00:05 | Smiley Hackathon #9に参加してきました! - わだばLisperになる を含むブックマーク はてなブックマーク - Smiley Hackathon #9に参加してきました! - わだばLisperになる

昨日8/21(土)にSmiley Hackathon #9またまた参加させて頂きました!

今回も主催の d:id:acotie さん #9会場提供のOracleさんありがとうございました。

自分は、#4、#5、#6、#7と参加しているので、今回で、5回目。そういえば、前回の#8はShibuya.lisp TT#5と日が被っていて参加できなかったんですねー。

やってたこと

3ヶ月位前のSLIMEのアップデートにより、自分の便利SLIME elispが大分動かなくなっていたので原因を探り修復しました。

殆ど自分にしか役に立ちませんが、折角の機会なのでまとめてgithubにアップしてみました。

交流

arc-users.jp@mgikenさんが参加されていたので、Arcネタで盛り上がりました。

ちなみに、自分はarc-users.jpが2年程前に立ち上がった時のフォーラムの最初のメンバーです!

@sirohukuさんはTwitterやShibuya.lispで面識がありましたが、今回はClojureで色々されていたようです。

@snmstsさんは http://weitz.de/flexi-streams/ の多言語対応回りをハックしていて、今回UTF-8以外の日本語化の目処が立ったようです。drakmaなどのインフラに使われているので進展が楽しみです。

また、@higeponさんも参加されていて、Mosh on MonaでR6RSのテストがすべて通ったとのこと。おめでとうございます!

という風に自分の知ってるLISPerが4人もいて、かなりLISP充なSmiley Hackathon #9でした。

是非また参加したいです!

2009-12-26

Smiley Hackathon #7に参加してきました!

| 21:18 | Smiley Hackathon #7に参加してきました! - わだばLisperになる を含むブックマーク はてなブックマーク - Smiley Hackathon #7に参加してきました! - わだばLisperになる

先日の12/19(土)にSmiley Hackathon #7またまた参加させて頂きました。

今回も主催の d:id:acotie さん 会場提供のGaiaXさんありがとうございました。

やってたこと

LISPコミュニティをハックするという名目のもとに、延々とLISPサイトのリンク切れを直しておりました。

なぜ私がリンク切れを直しているのかといいますと話が長くなるのですが、「日本Lispユーザ会のページは更新されているのですか?」と運営の方に私が質問したところから始まるのですね。

今後も少しずつですが、修復とアップデートをしていきたいです。

今回、最近LISPに興味があるという、刺身☆ブーメランさん(d:id:a666666)とLISP野郎のakaさんが参加していて個人的LISP色の強い回となりましたが、HTMLを直しながら喋りつづけていたため、周りのakaさん、jun_ichiroさん他の作業を邪魔しつづけておりました。

また、Hackathon後半に、刺身☆ブーメランさんとお話したのですが、もの凄い聞き上手のため、調子にのってLISPのデモ的なことをしておりました。

次も参加してみたいです!!

2009-08-26

第6回Smiley Hackathon(仮)に参加してきました!

| 23:07 | 第6回Smiley Hackathon(仮)に参加してきました! - わだばLisperになる を含むブックマーク はてなブックマーク - 第6回Smiley Hackathon(仮)に参加してきました! - わだばLisperになる

先日の8/22(土)にSmiley Hackathon(仮)またまた参加させて頂きました。

今回も主催の d:id:acotie さん 会場提供のドワンゴさんありがとうございます。

やってたこと

今回は、Ruby on RailsならぬLisp on Linesをインストールしてみて、できたら何か簡単なものを作れたら良いなあと思っていたのですが、大体1.5〜2時間費したものの関連してインストールするパッケージがインストールできなかったり、インストールされても上手く動いてるのかどうか良く分からないという感じでつまづきまくり、起動さえできませんでした。

この辺り(no title)を参照しつつの挑戦だったのですが、どなたか挑戦してみませんか!

clbuildだと簡単らしいのですが…[clbuild-devel] UCW and LISP-ON-LINES

ということでLoLには挫折してしまったので、職場のエンジニア用のウェブページをAllegroServeからHunchentootに置き換える作業をしてみていました。

AllegroServeも良いのですが、(SBCLの場合)Hunchentootの方が素直に日本語を使えたりして楽そうなので、Hunchentootにしたらどうかと思い…。しかし、これもそんなに簡単ではなさそうです…。

どうして職場のエンジニア用のウェブページがCLなのかというと、CLで書いたらlisp好きの人が求人に応募して来たりするかなという発想だったのですが、今のところLisper/Lisp好きの方には応募してもらえてないようです。時給が安いのが厳しいのかもしれませんw。もし職場にLisp好きが来たら自分もできるうる限り書けるものはLispで書く努力をしたいと思いますw

ちなみにこちらで求人しています→モテカワ愛されスイーツ系エンジニア/デザイナー募集 - komagataのブログ & アクトインディ開発者ブログ

いろいろ

  • 今回WEB+DB Pressの最新号のVim特集[]を書いたVim神のkanaさんが参加されるということで、サインを貰うため最新号を買って行きサインを貰いました!
  • 懇親会では、ドワンゴの方にドワンゴ社の自由な社風について伺いました。ドワンゴ凄い!、素晴らしい!

マクロの使い方を筆頭に大分駄目なコード/構成で恥しいんですが、とりあえず、適当に作業途中のコードを貼ってみます。

なんとなくCLでHTMLを書くこともあったりするんだなあ位に見てもらえると嬉しいです。

(defpackage :example.com
  (:use :cl 
        :hunchentoot
        :cl-who
        :parenscript
        :xyzzy-compat))

(in-package :example.com)

;; doukaku から拝借
(defun number-to-kanji (num)
  (let ((digit   #("零" "一" "二" "三" "四" "五" "六" "七" "八" "九"))
        (subunit #("" "十" "百" "千"))
        (unit    #("" "万" "億" "兆")))
    (loop for i from 0
          initially (if (= num 0) (return (aref digit 0)))
          for (n m) = (multiple-value-list (floor num 10000)) ; 4 桁ずつ区切る
          until (and (= n 0) (= m 0))
          for value = (loop for j from 0 to 3 ; 位
                            for x = (mod (floor m (expt 10 j)) 10) ; 数字
                            when (/= x 0) ; 零千 零百 零十 対策
                            collect (format nil "~A~A" 
                                            ; 一千 一百 一十 対策
                                            (if (and (= x 1) (> j 0)) "" (aref digit x)) 
                                            (aref subunit j)))
           when value appending (cons (aref unit i) value) into result
           do (setf num n)
           finally (return (apply #'concatenate (cons 'string (reverse result)))))))

;; exec
(progn
  (setq hunchentoot:*hunchentoot-default-external-format*
        (flex:make-external-format :utf-8 :eol-style :lf))
  (setq hunchentoot:*default-content-type* "text/html; charset=utf-8")

  ;; *acceptor* 
  (defparameter *server* 
    (make-instance 'hunchentoot:acceptor :port 8888))
  (start *server*))

;(stop *server*)
(defvar *counter* 0)

(defvar *all-entries* () )

(defstruct (entry (:type list))
  path
  title
  body
  author
  date
  category
  )

;; メンバー一覧
(defparameter *top-member*
  (with-html-output-to-string (out nil :indent T)
    ((:div :id "member") 
     ((:h2 :class "design") "メンバー一覧") 
      ((:p :class "title")
       "某社技師部隊員名簿") 
     (:ul
      (:li ((:a :href "/g000001") "g000001")))
     ((:p :class "to_example.com")
      ((:a :href "http://www.example.com") 
       "某社へ"))))))

;; お知らせ
(defparameter *block-news*
  (with-html-output-to-string (out nil :indent T)
    ((:div :id "news")
     (:h2 "技師部隊からの" :br
          "お知らせ")
     (:p "只今某社株式会社技師部隊ではウェッブデザイナー/エンジニアを募集しています。<br />HTMLがわかる、CSSがわかる、Adobe Photoshopが使える、デザインが好き、ウェッブが好き、Ada、Ruby、CL、Haskell、Scheme、Prolog、Smalltalkが好き…な方、メールでご応募ください。"
         :br
         ((:a :href "mailto:recruit@example.com")
           "Mail: recruit@example.com"))))))

;; テンプレ
(defmacro define-example.com-template ((name path) (&rest args) contents)
  `(define-easy-handler (,name :uri ,path) ,args
     (with-html-output-to-string (out nil :indent T :prologue T)
       ((:html :xmlns "http://www.w3.org/1999/xhtml")
        (:head ((:meta :http-equiv "Content-Type" :content "text/html; charset=utf-8"))
               (:title "某社技術部隊報告書")
               ((:link :href "/stylesheets/reset.css" :rel "stylesheet" :type "text/css"))
               ((:link :href "/stylesheets/basic.css" :rel "stylesheet" :type "text/css"))
               ((:link :href "/rss.xml" :rel "alternate" :type "application/rss+xml" :title "Example.com blog")))
        (:body 
         ((:div :id "header") 
          ((:div :class "inner")
           ((:div :class "twitter")
            ((:h2 :class "design") "twitter")
            (:p "こんにちは!!、こんにちは!!、こんにちは!!"))
           ((:h1 :class "design_a")
            ((:a :href "" :title "") "タイトル"))
           ((:ol :id "bread_crumbs")
            (:li ((:a :href "/") "home")))))
         ((:div :class "inner")
          ((:div :id "columns")
           ((:div :id "cotents")
            ;; content
            ,contents
         ((:div :class "footer")))
        ((:div :id "local_nav")
         ;; news
         (princ *block-news* out)
         ((:div :id "counter")
          (:dl
           (:dt "本頁の来客数")
           (:dd (format out
                        "~A名"
                        (number-to-kanji (incf *counter*))))))
         (princ *top-member* out)))
       ;; ads
       ((:div :id "foo_ads")
        ((:div :id "categories")
         ((:h2 :class "design") "カテゴリー") 
         (:ul 
          (mapc (lambda (x)
                  (with-html-output (out nil :indent T)
                    (:li ((:a :href (entry-path x))
                          (princ (entry-title x) out)))))
                *all-entries*))
         ((:p :class "to_example.com") 
          ((:a :href "" :title "") "某社")))
        ((:div :class "poster") 
         ((:img :src "images/poster_01.jpg" :alt "aaaa")))
        ((:script :type "text/javascript")
         "//<![CDATA["
         "(function() {
		var links = document.getElementsByTagName('a');
		var query = '?';
		for(var i = 0; i < links.length; i++) {
			if(links[i].href.indexOf('#disqus_thread') >= 0) {
				query += 'url' + i + '=' + encodeURIComponent(links[i].href) + '&';
			}
		}
		document.write('<script charset=\"utf-8\" type=\"text/javascript\" src=\"http://disqus.com/forums/example.com/get_num_replies.js' + query + '\"></' + 'script>');
	})();"
         "//]]>"))))
        ((:div :id "footer")
         ((:p :class "center") "Copyright &copy; 2009 某社 All rights reserved."))))))


;; ページの定義
(defvar *default-directory* "/home/mc/lisp/Work/example.com.hunchentoot/")

;; 初期化 reset
(progn
  (setq *all-entries* () )
  (load "/home/mc/lisp/Work/blog.lisp")
  (setq *all-entries*
        (sort *all-entries*
              #'> :key #'entry-date)))

;; CSS
(define-easy-handler (reset.css :uri "/stylesheets/reset.css") ()
  (setf (content-type*) "text/css")
  (kmrcl:read-file-to-string 
   (merge-pathnames "reset.css" *default-directory*)))

(define-easy-handler (basic.css :uri "/stylesheets/basic.css") ()
  (setf (content-type*) "text/css")
  (kmrcl:read-file-to-string 
   (merge-pathnames "basic.css" *default-directory*)))

;; RSS
(define-easy-handler (|/rss.xml| :uri "/rss.xml") ()
  (setf (content-type*) "text/html; charset=utf-8")
  (with-html-output-to-string (out nil :indent T)
  (format out "<?xml version=\"1.0\" encoding=\"utf-8\"?>")
  ((:rss :version "2.0")
   (:channel
    (:title "某社技術部隊報告書")
    (:link "http://tech.example.com")
    (:description "某社技術部隊報告書")
    (format-date out "<lastBuildDate>%a, %d %b %Y %H:%M:%S +0900</lastBuildDate>")
    (:language "ja")
    (mapc (lambda (x)
            (with-html-output (out nil :indent T)
              (:item
               (:title (princ (entry-title x) out)) 
               (:link (format out "http://tech.example.com~A" (entry-path x)))
               (:description
                "<![CDATA[" (princ (entry-body x) out) "]]>")
               (format-date out "<pubDate>%a, %d %b %Y %H:%M:%S +0900</pubDate>" (entry-date x)))))
          *all-entries*)))))

;; images/gif
(mapc (lambda (x)
        (pushnew (create-prefix-dispatcher (symbol-name x) x)
                 *dispatch-table*))
      (mapcar (lambda (path)
                (let ((var-name (intern (format nil "*~A*" (file-namestring path)))))
                  (eval 
                   `(progn
                      (defparameter ,var-name
                        (with-open-file (in ,(merge-pathnames (format nil "images/~A" (file-namestring path)) *default-directory*)
                                            :element-type 'flex:octet)
                          (let ((image-data (make-array (file-length in)
                                                        :element-type 'flex:octet)))
                            (read-sequence image-data in)
                            image-data)))
                      (defun ,(intern (format nil "/images/~A" (file-namestring path))) ()
                        (setf (content-type*) "image/gif")
                        ,var-name)))))
              (directory (merge-pathnames "images/*.gif" *default-directory*))))


;; gif
(mapc (lambda (x)
        (pushnew (create-prefix-dispatcher (symbol-name x) x)
                 *dispatch-table*))
      (mapcar (lambda (path)
                (let ((var-name (intern (format nil "*~A*" (file-namestring path)))))
                  (eval 
                   `(progn
                      (defparameter ,var-name
                        (with-open-file (in ,(merge-pathnames (format nil "images/~A" (file-namestring path)) *default-directory*)
                                            :element-type 'flex:octet)
                          (let ((image-data (make-array (file-length in)
                                                        :element-type 'flex:octet)))
                            (read-sequence image-data in)
                            image-data)))
                      (defun ,(intern (format nil "/images/~A" (file-namestring path))) ()
                        (setf (content-type*) "image/jpeg")
                        ,var-name)))))
              (directory (merge-pathnames "images/*.jpg" *default-directory*))))

;; トップページ
(define-example.com-template (root "/") (page)
  (mapc (lambda (x)
          (with-html-output (out nil :indent 2)
            ((:div :class "content")
             (:h2
              ((:a :href (entry-path x))
               (princ (entry-title x) out))
              )
             ((:dl :class "date")
              (:dd (format-date out "%g%#e年%#m月%#d日(%v) %H時%M分%S秒"
                                (entry-date x)))
              (:dt "区分") 
              (:dd (princ (entry-category x) out))
              (:dt "報告者: ")
              (:dd (princ (entry-author x) out))
              )
             #|(:p (princ (with-output-to-string (*standard-output*)
                          (describe page))
                        out))|#
             (:p (princ (entry-body x) out))
             ((:p :class "to_top")
              ((:a :href (format nil "~A#disqus_thread" (entry-path x))) 
               ">View Comments")
              "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
              ((:a :href "" :title "") "このページの上へ戻る")))))
        (nth 0 (metatilities:group *all-entries* 10))))

(defun make-member-page (name)
  (eval
   `(define-example.com-template 
        ,(intern name)
        ,(format nil "/~A" name)
      (mapc (lambda (x)
              (with-html-output (out nil :indent T)
                ((:div :class "content")
                 (:h2
                  ((:a :href (entry-path x))
                   (princ (entry-title x) out))
                  )
                 ((:dl :class "date")
                  (:dd (format-date out "%g%#e年%#m月%#d日(%v) %H時%M分%S秒"
                                    (entry-date x)))
                  (:dt "区分") 
                  (:dd (princ (entry-category x) out))
                  (:dt "報告者: ")
                  (:dd (princ (entry-author x) out))
                  )
                 (:p (princ (entry-body x) out))
                 ((:p :class "to_top")
                  ((:a :href (format nil "~A#disqus_thread" (entry-path x))) 
                   ">View Comments")
                  "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
                  ((:a :href "" :title "") "このページの上へ戻る")))))
            (remove-if-not (lambda (x) 
                             (string= ,name (entry-author x)))
                           *all-entries*)))))

(mapc (lambda (n)
        (make-member-page n))
      '("k" "m" "y" "m" "c"))

2009-07-12

第5回Smiley Hackathon(仮)に参加してきました!

| 18:38 | 第5回Smiley Hackathon(仮)に参加してきました! - わだばLisperになる を含むブックマーク はてなブックマーク - 第5回Smiley Hackathon(仮)に参加してきました! - わだばLisperになる

昨日7/11日に、Smiley Hackathon(仮)に参戦してきました!

主催の id:acotie さん 会場提供の dwango さんありがとうございます。

前回に引き続き総勢、15、6名の参加で各自様々なテーマでもくもくとプログラミングされていたようです。

今回、自分は、CLのウェブフレームワークを色々いじろうかなと思っていたのですが、準備が間に合わなかったので、今回は、逆引きCLのコンディションのエントリを充実させようということで、株式会社数理システム 知識工学部さんのCommon Lispにおける例外処理 —— Condition Systemの活用(PDF)を延々と読んだりコード例を試したりしてました。

逆引きCLの項目として、ぱっとした例を書くのはなかなか難しそうですが、昨日考えたあたりから項目を増して行きたいです。

懇親会

自分は基本的に懇親会には参加せず、自分が運営側にまわったりしているShibuya.lispの懇親会にも1度も参加していなかったりする程なのですが、考えを改めて懇親会にも参加してみることにしました。

junichiroさんのサポセン話は、私もサポセン経験者だけにかなり面白かったです(笑)

Smiley Hackathonは、今後、月に1回位のペースで開催できるかもしれない、とのことでしたが、是非開催して欲しいです!

2009-03-08

Slimy hackathon #1終了!!

| 20:14 | Slimy hackathon #1終了!! - わだばLisperになる を含むブックマーク はてなブックマーク - Slimy hackathon #1終了!! - わだばLisperになる

まったりと開催されましたslimy hackathonですが、無事48時間経過し終了となりました!!

結局のところ皆でテーマを決めて過す週末という感じでしたが、これはこれで良かったと思います。

割と野心的な取組みもあり、今後の開催で続きを作って頂きたいなと思いました。

自分のメインプロジェクトはSLIMEをLispマシンに近付けるというものでした。

Lispマシンのマニュアルからキーバインドをちょこちょこ移植しただけに終ったのですが、便利そうなコマンドが結構あって、やっぱりLispマシンのマニュアルは一回通して読んでみるべきかもしれないと思いました。

例えば、今回、Eval Region Hackというコマンドを見付けたのですが、これは、リージョンを評価するにあたって、defvarの値も更新してくれるというものです。

自分はこんな感じに再現してみました。

;; c-m-sh-e Evaluate Region Hack
;; ----------------------
;; => slime-eval-region ?
;; リージョンにdefvarがある場合、値を再定義
(progn
  (defun slime-eval-region-hack (start end)
    (interactive "r")
    (slime-eval-with-transcript
     `(swank:interactive-eval-region
       ,(replace-regexp-in-string
         "defvar"
         "defparameter"
         (buffer-substring-no-properties start end)))))
  (define-key slime-mode-map [(control meta shift ?e)]
    'slime-eval-region-hack))

CLのコードを書いている方なら、開発中にdefvarのこの挙動が面倒で、defparameterにしたりしている方もいらっしゃるのではないでしょうか。

こんなコマンドがあるなんてさすが、Lispのコードを書いてる人が開発していた環境だ!、等と地味に感心していました。

そんな感じのslimy hackathon #1でしたが、また機会があれば開催してみたいと思っています!

試みられたプロジェクト

no title:

  • slime-edit-definitionの(setf foo)対応」:g000001
  • slime-modeのコマンドを全部試してみる」:NANRIさん
  • slimeとeliの共存についてちょっとだけ調べる」:akaさん
  • 「newLISPをSLIMEから動かす」:koshさん
  • 「clispのarglist表示をいい感じにする」:NANRIさん
  • slime-jp@reddit」:g000001
  • 「色々な処理系でSLIME」:g000001
  • SLIME、Lispマシン化計画」:g000001
  • 「Climacs と SLIME?」:quekさん
  • 「逆引きSLIME」:g000001
  • 「xyzzyからswankへの接続」:snmstsさん

成果物

関連BLOGエントリ

2009-03-07

Slimy hackathon 中間報告 (3)

| 17:23 | Slimy hackathon 中間報告 (3) - わだばLisperになる を含むブックマーク はてなブックマーク - Slimy hackathon 中間報告 (3) - わだばLisperになる

色々な処理系でSLIME/Rubyでslime

色々な処理系でSLIMEのとっかかりとして、Rubyを試してみます。

swank.rbは、SLIMEのコミッターの方が、Rubyの勉強のために、Swankを作成して公開という代物で、本格的に使うことを意図したものではないようです。

以下、自分が試した手順です。

まず、素のEmacsへの導入を想定していますが、Emacs側の設定としては、

;; Emacs lisp
(require 'cl)

(pushnew "/share/sys/cl/src/slime/" ;; slimeのパス
	 load-path)

(require 'slime)

というのがあれば良いでしょう。

Emacs側の設定はこれのみ。

swank.rb起動

$ SWANK_RB=/share/sys/cl/src/slime/contrib
$ cd $SWANK_RB
$ ruby -r swank -e swank.rb
Listening on ["AF_INET", 4005, "localhost", "127.0.0.1"]
...

という風に、標準では、4005番ポートで待機しています。

4005番が使われている場合には、何も言わず終了しますので、他にSwankを起動している方はご注意。

これに、

M-x slime-connect
Host: 127.0.0.1
Port: 4005

で接続します。

n = 3

で、nから3までをリージョン選択して

M-x slime-eval-regionすると、

3という結果が出ます。

def hello
  "hello"
end

hello # slime-regionする
#=> "hello"

現状は、slime-eval-regionする他ないようで、あまり魅力的ではないですね!!

Slimy hackathon 中間報告 (2)

| 17:00 | Slimy hackathon 中間報告 (2) - わだばLisperになる を含むブックマーク はてなブックマーク - Slimy hackathon 中間報告 (2) - わだばLisperになる

slime-edit-definitionの(setf foo)対応」を書いてみました。

先のものと殆ど同じです(´▽`*)

Slimy hackathon 中間報告 (1)

| 13:22 | Slimy hackathon 中間報告 (1) - わだばLisperになる を含むブックマーク はてなブックマーク - Slimy hackathon 中間報告 (1) - わだばLisperになる

まったりと進んでおります、Slimy Hackathon。

完了したタスクもでてまいりました!!

slime-modeのコマンドを全部試してみる」:NANRIさん

は、Partty!で動作を記録していて眺めることができます。

画面サイズを合せてみてみましょう!

SLIME拡張elisp/slime-undefine-functionの(setf foo)対応」:g000001

現行のSLIMEでは、(defun (setf foo) ...)等の(setf foo)の個所でfmakunboundを呼び出すslime-undefine-functionが上手く#'(setf foo)を掴まえられないので、その辺を対処してみました。

同様の問題が、slime-edit-definitionにもあるので、これも対処したいと思います。

以下、活動中タスクです。

slimeとeliの共存についてちょっとだけ調べる」:akaさん

「newLISPをSLIMEから動かす」:koshさん

「clispのarglist表示をいい感じにする」:NANRIさん

slime-jp@reddit」:g000001

「色々な処理系でSLIME」:g000001

SLIME、Lispマシン化計画」:g000001

「逆引きSLIME」:g000001

xyzzyからswankへの接続:snmstsさん

まだまだ、Slimy Hackathonは続きます!

2009-03-06

Slimy hackathon 本日18:30よりスタート!!!

| 08:03 | Slimy hackathon 本日18:30よりスタート!!! - わだばLisperになる を含むブックマーク はてなブックマーク - Slimy hackathon 本日18:30よりスタート!!! - わだばLisperになる

本日18:30よりノープランでスタートです。

初っ端からで申し訳ありませんが、実は今日からバイトすることになりまして帰宅するのが、21:00位になりそうですw

だったら21:00開始が良いんじゃないかとも思ったのですが、こういうのもアリかなと思いまして、18:30スタートとしたいと思います。

48時間もありますので、どういう風にするかから決めたりして行こうかなと思っています。

基本的には、前回も書きましたが、Fixdapにプロジェクトを登録して、それぞれ取り組んでみる、というのを骨子にしたいと思います。

他に連絡用としては、LingrのCL部屋が使えるかと思っています

これらとSkypeやIRCを組み合わせてSlimyな週末を過しましょう!!!

2009-03-04

Slimy hackathon 3/6-3/8で開催します!!!

| 10:11 | Slimy hackathon 3/6-3/8で開催します!!! - わだばLisperになる を含むブックマーク はてなブックマーク - Slimy hackathon 3/6-3/8で開催します!!! - わだばLisperになる

そういえば、開催告知してなかったんで告知ですw

3/6 18:30から、3/8 18:30まで、48時間 SLIMEのハッカソンを開催します!

やっぱり参加申し込みがあった方が良いのかしらなどと考えたんですが、Fixdapで良いんじゃないかと思えて来ましたのでFixdapに、この48時間中にしてみたいことをプロジェクトとして登録してみて下さい!

なんと、もう3名も登録されていますね!!!

2009-03-03

Slimy hackathonへの道(3)

| 01:34 | Slimy hackathonへの道(3) - わだばLisperになる を含むブックマーク はてなブックマーク - Slimy hackathonへの道(3) - わだばLisperになる

Slimy hackathonについてさらにあれこれ考えています。

名称

とりあえずの進捗状況ですが、Slimy hackathonという名称について大元のSmiley Hackathon主催のacotieさんにお許しを頂きました。

怒られなくて良かったw

開催日程

それで開催時期なんですが、Shibuya.lisp TT#2も無事終了しましたし、これはもう3/6-3/8しかないだろうという気分になってきたので、3/6-3/8にしたいと思います。

いつもの如く急ですね、すいません(´▽`*)

開催時間なのですが、24時間TVに合せて18:30にしてみたいと思います。

仕事から帰ってきて、「あ、そうだ始まってるんだ!」的な。

48時間なので乗り遅れとか考えなくてもOKでしょうw

それより18:30に終わる方が疲れなくて良いかも。いやもちろん48時間通して参加する人はいないと思うのですが。

運営ツール

運営で使うツールを色々物色しているのですが、WikiとかSkypeとかLingrとかIRCになるのかなと思っています。

プロジェクト管理ツールとしてFixdapというのがあることを久々に思い出したのですが、これは今回結構使えるかもしれません。

ということで、プロジェクトを作成してみました。

ここにタスクを自分で登録して実行という流れとかどうかしらと思ったりしています。

試しに前回書いた思い付きを登録してみました。

2009-02-18

Slimy hackathonへの道(2)

| 04:47 | Slimy hackathonへの道(2) - わだばLisperになる を含むブックマーク はてなブックマーク - Slimy hackathonへの道(2) - わだばLisperになる

Slimy hackathonについてあれこれ考えています。

色々考えているのですが、セッション形式にしたら面白いかなと思ったりしています。

Wiki等でセッションを管理(といっても参加表明くらい)したらどうでしょう。

自分が考えたセッションはこんな感じです。

もちろん自分は全部に参加します(笑)

2009 上半期のSLIMEの設定はこれだ!

利用形態に合わせて最短の設定を探る!

SLIME、Lispマシン化計画

Symbolicsや、TI Explorerのマニュアルを眺めつつSLIMEをLispマシン風に近付ける!

とりあえずキーバインドから!

そしてそれだけなのかもしれない!

SLIME拡張elisp

Pareditや、Redshank等便利に組み合わせられるものを探したり設定を探ったり、自作のelispを紹介したり作ったりする!

逆引きSLIME

逆引きSLIME作る!

逆引きCLにSLIMEの項目はあるので追記とか?

色々な処理系でSLIME

ClojureでSLIME

RubyでSLIME

SchemeでSLIME

etc

色々な処理系でSLIME動かす!

Clojureとか、Dylanなら何か自分も情報提供できるかも!

slime-jp@redit

reditでslime-jpというチャンネルを作成し情報を投下しまくる!

はてぶや、deliciousでも良いかもしれない

どっちが良いのか。

2009-02-16

Slimy hackathonへの道(1)

| 03:57 | Slimy hackathonへの道(1) - わだばLisperになる を含むブックマーク はてなブックマーク - Slimy hackathonへの道(1) - わだばLisperになる

私の考えるHackathon

昨日Smiley Hackathon#4に参加させて頂いたお蔭さまで、実際にLISPをお題にHackathonを開催するとしたらどうなるかが、なんとなく想像できました。

自分が勝手に抱いているHackathonのイメージ的には、Hackathonは長くなくちゃいけないんじゃないかというのがあります。

とにかく長くて疲れる。

そうなってくると、やはり、24時間以上で開催したいですよね。

開催時間

それで、24時間以上となると、24時間では嫌に現実的な時間であり、ずっと起きてなくちゃいけなそうなところがありしんどそうなので、若干、現実味を失なった48時間はどうかと思いました。

マラソンなので、42.195時間でも良いんじゃないかとも思っています。

すること

SLIMEがお題なわけですが、この48時間で一体何をするのかを考えてみます。

  1. 様々な処理系で、SLIMEが動くか試す/Tipsをまとめる
  2. SLIMEを初めて使ってみる/質問する/答える
  3. 今迄使っているSLIMEの環境をもっと便利にする拡張を書く/情報を探してまとめる

といった位かなと思います。

先日の2/14にswank.rbというRuby用のものが出たりしてRubyの方がSlimy Hackathonに参入して貰える可能性も出てきました。

もういちど、SLIME(SWANK)が動く処理系を挙げてみます。

  1. Common Lisp色々
  2. MIT Scheme
  3. Dylan
  4. Scheme 48
  5. Clojure
  6. GOO
  7. jolt
  8. Kawa
  9. Ruby

開催場所

48時間の会場を確保するのはほぼ無理なのでとりあえず、オンラインで開催かなと思います。

Lingr部屋か、IRCチャンネルを設けて共有レポジトリとWikiを作成し、皆でコミットしたりリソースを収集しまくります。また、Skypeの利用も検討できるでしょう。

そもそも、48時間は長いので、どういう運営にしようか、というところから考えても良いかもしれません。

開催日時

具体的な日時は決まっていませんが、それなりに現実的にしようと思うと、金曜の夜開始で、日曜の夜終了という風になるかと思います。

例えば、金曜の21時開始→日曜の21時終了です。

参加形態

とりあえず、長い人生の中でほんの48時間という枠組でSLIMEというテーマのもとに活動すれば良いことにし、適当に24時間TVを見たり見なかったりする如くゆるく参加できれば良いのかなと思います。

気分的には、2/20-2/22で開催したいと思っていますが、急すぎる気もします。

3/6-3/8等も良いと思っています。

問題点

割と私は盛り上がってきているのですが、賛同を得られるかどうかというのが最大の問題です(笑)

2009-02-11

Slimy Hackathon(仮)がやりたい

| 17:33 | Slimy Hackathon(仮)がやりたい - わだばLisperになる を含むブックマーク はてなブックマーク - Slimy Hackathon(仮)がやりたい - わだばLisperになる

今週末に自分は、no titleに参加を表明しているのですが、非常にベタなオマージュのですが、Slimy Hackathon(仮)をやってみるのはどうかと思いました。

SLIMEでなんかするハッカソンです。

「こんな機能を発見した!」「○○したい場合には、どうやれば良いのか!」「こんな拡張はどうか!」というのを延々とやる会です。

対象の処理系としては、Common Lispはもとより、Scheme、Clojure、GOO、JOLT、Dylan、Kawaと色々あります。

開催場所が問題になるのですが、物理的に集合する場合、どこか8時間位開場を貸して頂ける優しい方/企業さまを探す必要があります。

物理移動は面倒なのでSkypeでチャットしながらCodeReposにコミットというのも良いかもしれません。

ということで、atnd.orgを使ってみたかったので、イベントを作成してみました。

コメントできるみたいなので良かったらコメント/アイディアの投稿/開場提供情報等々お待ちしています。