vimからsbclと対話型処理をする

なんとなくvimで書きたいけど対話型処理がしたかった。
下記の記事にてやり方が書いてあるのだけど、英語が苦手なのでメモに残しておきます。
Jonathan’s Techno-tales - Like Slime, for Vim
Jonathan’s Techno-tales - Screencast: Like Slime, for Vim


必要なもの


vimsbclの対話。

  1. screenの起動
  2. screenに名前をつける
  3. 確認
  4. sbclの起動
  5. screenの画面を分割して、移動して、ウィンドウをもう一枚つくる
  6. vim起動
  7. コードを書く
  8. C-c C-cを押す
  9. session nameとwindow nameを記入

あとは実行したい箇所で ^C-c ^C-c を押すだけ...?

  1. > screen
  2. > screen -S sbcl_session
  3. > screen -ls
  4. > sbcl
  5. C-z S
  6. C-Z tab
  7. C-z c
  8. > vim
  9. (format t "hello")
  10. C-c C-c
  11. :session name: ****.sbcl_session
  12. window name: 0

quickrun.vimでgoのコーディング効率を上げたかった...

quickrun.vimでgoのコーディング効率が数倍になった件


コメントにて「au BufNewFile,BufRead *.go set filetype=go」と書くのが正しいとのことだったので見直ししました。
結果、syntaxが表示されないのはgo.vimが~/.vim/pluginの中に突っ込んでたのが原因でした。

mkdir ~/.vim/syntax
mv ~/.vim/plugin/go.vim ~/.vim/syntax/

これでquickrun.vimが走りsyntaxが消えない幸せな結末を迎えれました。
コメントありがとうございました!


以下一部打ち消し。


.vimに配置してみたけど「quickrun: "command" option is empty.」みたいなことを言われ続け苦悩したのでメモを残します。
@rauqに助けを求めて根本的ではないけど解決。


.vimrcに次を記述。

au BufNewFile,BufReAd *.go let g:quickrun_config={}
au BufNewFile,BufRead *.go let g:quickrun_config['_']=g:quickrun#default_config['go/386']


とりあえず、上記のでできたので良しとしました。
下は試したこと色々を記述。

  • GOROOT/GOOS/GOARCHの未設定

~/.vim/autoload/quickrun.vimを覗くとGOARCHで分岐してました。
自分は未設定だったので~/.zshrcに以下を記述。

export GOROOT=/usr/local/lib/go
export GOOS=freebsd
export GOARCH=386

でも相変わらず「quickrun: "command" option is empty.」...。

  • filetypeで分岐

拡張子で判別じゃなくてfiletypeで判別してるらしいです。

:set filetype?

で見てみると何も表示されないので~/.vimrcに

au BufNewFile,BufRead *.go set filetype=go

を記述。
巧く動いてくれたけど、何故かsyntaxが消えてしまったので却下...。


そうして上の方法でコンパイル実行してくれたので良しとして終わり。

LDD'11/Fall]に参加してきました!

LDD'11/Fallに参加してきました!

今年も素敵なシールが用意されていました。


今回のLDDでは他の勉強会にはなかなか聞けないようなセッションが2つありました。

  • 「いま、ここから見える釧路」
  • 「ITで釧路をデベロップする(パネルディスカッション)」

北見でもこの様なイベントが欲しいと思ってる僕は、この2つ(と美味しいもの)が楽しみで楽しみで参加してきました。


いま、ここから見える釧路
学生時代を釧路で過ごし現在東京で働いている@june29さんの発表でした。発表内容は準2級.jp - 「LDD’11/Fall in KUSHIRO」に参加してきましたで詳しく書かれています。
高専カンファレンス決起からのお話、地元に根付いてる方のお話、それらをふまえて今釧路に期待することを話してくれました。イベントを他者へ託すこと、その地への愛、学生が期待されていること。
このセミナーでは"釧路"についてでしたが、北見に済む僕らにも言えることでした。大学の間だけ住む土地の北見には確かに本は遅れて入荷されるし、欲しい本は置いてないし、ゲーセンは遠いし、お店は少ないし、吉野家もスタバもドトールもないしで不便だ詰まらない街だなんて思ってた時期がありましたし、思ってる人は周りにたくさんいます。けれども美味しいものはたくさんあるし、密林が迅速に届けてくれるし、何より僕らはPCがあれば楽しめるのです。そして大人の人たちが学生に期待をしてくれるのです。
まだ社会を知らない学生だけど、学生の僕らが盛り上げることができるのだと思わせてもらえました。大学の総合工学の授業ではこういった話を聞かせてもらいたいです。


ITで釧路をデベロップする
釧路の副市長を交えて、市役所などへのOSSの導入についてディスカッションが行われました。
経済だとか会社でのPC環境などはよくわかりませんが、とても新鮮で面白いセッションだと思います。
中でも、質疑応答の時間にIT企業ではない会社員の方から質問(意見?)がでました。「よくわからない外国にデータを渡す不安」「大きい会社名への安心感」など、IT系に慣れている人との価値観の相違が明確に現れたことが素敵でした。
こういった話を色々な職業の方に聞いていただいて、ITの色々なものに興味をもってもらえるといいですね。


初めてのLT
LOCAL学生部としてLTで喋らせていただきました。大人の方々がいる前で初めて喋りました。
OSCや去年のLDDで学生部の活動内容などは何度か話しているので、学生部に触れた僕自身の気持ちを話させていただきました。
やはり緊張するもので、巧く喋れなかったのですが言いたいことは言えたと思います。
登録時に迷惑をかけた方々、機会をいただいて本当にありがとうございました。
初発表記念にスライドを貼っておきます。


以下テキトーに
ya8「北見でもこういうイベントやろうよ?」
akane「そ...そうですね。やりたいです...ね。」
(大声で)ya8「おーーい!来年北見でこのイベント開催するって!!!」
こんな感じのLDD'10/Fall懇親会での会話が今僕が動いているきっかけだったのだなぁと思いました。
地方で開催される946OSSが本当に羨ましくて、何度も「なんで北見じゃないんだ」「なんで北見工大が釧路でないんだ」なんて思っていました。でも、先月Ohotechというオホーツク圏で勉強会を開催するITコミュニティを立ち上げ僕らもこういった文化を作り始めようと動きだせました。946OSSさんの背中があってのことです。本当に偉大なコミュニティです。

  • 押し付けるのではなく、聞きたいものを喋ること
  • 大きなイベント開催には長く時間がかかること
  • 学生だからこそ思い切って行動できること
  • 無理せず、自身が楽しむこと

他にも諸々言葉をもらった懇親会、やはり楽しかったです。美味しかったです。
このイベントが長く開催されることを心から願いつつ、僕らも北見で伝えていけるよう頑張って行きたいです。


開催・参加された方々、お疲れさまでした。ありがとうございました!

U-16 旭川プログラミングコンテストを観戦してきました!

後輩に誘われ旭川工業高校にお邪魔し、翌日開催されたU-16 旭川プログラミングコンテスト を観戦してきました。


U-16 旭川プログラミングコンテストはコチラを参照してください。


高校1年生以下が対象のプロコンに参加人数は20人!
内容は自動探索AI同士のバトル。

操作内容

  • 任意の方向9マスの情報を取得
  • 四方のどれか1マスに移動
  • 四方のどれか1マスにブロックを置く

勝敗条件

  • アイテムを多くとったら勝ち
  • 相手をブロックで埋めたら勝ち
  • 相手の四方をブロックで囲んだら勝ち
  • 壁に減り込んだら負け

おおよそこんな感じ(のはず)。
これらを、ifやらforやらをグリグリりして、AIを作り、競い合う。
初めてプログラミングに触れる小中学生には少し難しいかな?と思える内容。


しかしトーナメントが始まってみるとしっかり動くものが出て来て、見てて面白かったです。

  • 壁の判定ができてるAI
  • 敵が横にいるとブロックで攻撃するAI
  • ループに陥るAI
  • アイテムは無視でひたすら移動し続けるAI

うまく動く子も、うまく動かなかった子もいたけど、みんな最後まで会場で観戦して、盛り上がって、すごく良い大会だったと思います。
参加者のインタビューで「プログラミング楽しかった!」「これからも続けたい!」と元気に言う子らの姿をみると、きっと素敵に道を踏み外し、来年・再来年と徐々にレベルの高い大会になっていくのだろうなと楽しみになりました。


バトルゲームは視覚的にわかりやすくて、引率の先生や親御さんも見てて楽しめる。
「野球やサッカーみたいな運動系は簡単にスポットライトが当たるけども、文化系はまだ当たりづらい。この大会でそういう子たちにもスポットライトを当ててやりたい」と、先生が言ってました。
今回の大会は本当にその通りのもので、小中学生にとってすごく良い機会、本当に羨ましいものだと思います。


あ、あと、景品がすごく羨ましい。
僕がプログラム書いて、知り合いに渡して参加してもらおうかって思うくらい...。


来年は北見でも開催できるといいなー...とボソッと呟いて帰ってきました。

tweepyを使ってみた

サークルのホームページにTwitterを載せたかったので、先輩に紹介されたtweepyを使用してみました。
IPythonだとかBPython使えば、なんとかなりそうなもんですが、メモを。


作ったのはこちら

  • 自己紹介内容取得
  • 自身の発言内容のみの取得
  • フォローしてる人をランダムで数人取得
  • @hogehogeにリンクつける
  • http://のURLにリンクつける

(あぁ、やったことこれしかないのか...)


きちめも-tweepyを使ってみる を参考にさせていただきました。


とりあえず、access_key/access_secretは取得できたことにします。


OAuth認証

def gettweepyapi():
  consumer_key = 'consumer_key'
  consumer_secret = 'consumer_secret'
  access_key = 'access_key'
  access_secret = 'access_secret'

  auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
  auth.set_access_token(access_key, access_secret)

  return tweepy.API(auth)


自身の情報いろいろ取得

def getprofiles(api):
  import re

  me = api.me() # 自身のUserクラス取得
  profiles = {} # 情報いろいろ格納用
  profiles['name'] = me.name.encode('utf-8') # プロフィールで指定した名前の取得
  profiles['image'] = me.profile_image_url # プロフィール画像のURLの取得
  profiles['description'] = me.description.encode('utf-8') # 自己紹介文の取得

  statuses = [] # 自身の発言内容格納用
  timeline = me.timeline(count=12) # 自身の発言のStatusクラスの配列取得
  for i,status in enumerate(timeline):
    statuses.append(status.text.encode('utf-8')) # 発言内容のみいれる
  profiles['timeline'] = statuses

  following = [] # フォローしてる人たち格納用
  friends = me.friends(count=me.friends_count+2) # フォローしてる人たちのUserクラスの配列取得
  import random
  random.shuffle(friends) # しゃっふるー
  for i in range(7):
    user = friends[i]
    user_status = {}
    user_status['name'] = user.name.encode('utf-8') # id名の取得
    user_status['screen_name'] = user.screen_name # 名前の取得
    user_status['img_url'] = user.profile_image_url # プロフィール画像の取得
    following.append(user_status)
  profiles['following'] = following

  return profiles

timelineやfriends取得するときにはcount=xxで取得数を指定できるみたい。
ただ、なぜか指定数から2引いた数が取得されるみたい。


リプライやURLにリンクつける

def text2html(text):
  import re

  replace_items = {} # key=置換対象の文字列 value=置換後の文字列

  ### @hoge を置き直す
  pattern = re.compile('@[\w\d]+')
  user_names = pattern.findall(text) # @hoge を全て取得

  for item in user_names:
    name = item.split('@')[1]
    replace_items[item] = '@<a href="http://twitter.com/#!/'+name+'" title="go to '+name+'\'s page">'+name+'</a>'

  ### http://huga を置き直す
  pattern = re.compile('http://[\w\d\.-/]+')
  urls = pattern.findall(text)

  for item in urls:
    replace_items[item] = '<a href="'+item+'">'+item+'</a>'

  ### 置換する
  for item in replace_items:
    text = text.replace(item, replace_items[item])

  return text


書いてみて、記事にする程のものか?とか思ったけど、書いたので一応公開...。
さらに言うと、あのページは作る意味あるのか...?と。ふつーにTwitterのページに飛ばせばいい気がしますけど。
とりあず、時間できたら、今度はbot化したいなーと思います。

JSTweenerでアニメーション

JSTweenerを使ってスライドしてみようと思ったものの、
AS3でTweener使ってたときの感覚で書いたら巧くいかなかったのでメモを。


思い通りに動かなかったコードは次のもの。

var element = document.getElementById('hoge');
element.style.position = 'absolute';
element.style.left = '1024px';
JSTweener.addTween(element, {
    time: 2,
    transition: 'linear',
    left: 0
});

実行結果は、アニメーションはなく、2秒後に0pxに移りました。


何故これでアニメーションにならないか。
AS3のときはこれでいけたじゃないか!
leftの値が文字列で保存されてるからなのか?(原因は未確認)


なんてことを思いながらしばらく嵌り、サンプルコードを覗いてみると違った書き方でした。
それを基にコード修正。

// 動かしたい要素
var element = document.getElementById('hoge');
element.style.position = 'absolute';
element.style.left = '1024px';

// アニメーション用の値
var o = {left: 1024};

JSTweener.addTween(o, {
    time: 2,
    transition: 'linear',
    left: 0,
    onUpdate: function(el, o){
        el.style.left = o['left'] + 'px';
    },
    onUpdateParams: [element, o]
});


こんな感じで無事動きましたとさ。

SaCSS vol.23に参加しました

SaCSS vol.23
内容は「jQuery hands on」です。
最近触り始めたり、web系のお友達が欲しかったりなので、参加してみました。


会場へ行ってまず驚くのが、女性の数。
自分が参加してきた勉強会で、こんなに女性率が高いのは初めてでした。さすがWeb系?


内容は、予告通り、jQueryの入門。
勉強会の様子は、がっつり勉強してる雰囲気でした。
プログラムを書いてる人のためのというよりは、HTML/CSSコーダーの人のためのもの?
完全に頭からの入門だったので、基本を無視して触り始めてた自分には得られるものが多々。
以下、メモ。

  • $("hoge") ←これって何て読むの...

"セレクタ"だそうです。
今まで、なんて検索すればいいのか分からなかったです。

名前が分かったおかげでこのページを見つけれました。
取得方法を何パターンかあった中に$('<div id="hoge">')をちらっと見かけて、そんなのでもいいのか!と。

  • フィルタの使い道

今まで、ヌーAPI search欄で見て見ぬふりをしてた「:hoge」を使ったサンプルの説明があったおかげで、知るきっかけになりました。
フィルタに限らず、関数名から動きをイメージできないものには触れずにいたので、良かったです。

ここに載っていないものもいっぱいあるようですね。

  • $(function{});←これの意味

これを書くおかげで、HTMLロード後に実行されるらしいです。
もし、他のライブラリで $ に何か上書きしていたらjQueryが呼ばれなくなるので、
jQuery(function($){}); と書くのが好ましいようです。


こんな感じです。
次回は「WorldPressとPHPとか」だそうです。
気になるけど、時期が辛いかも...。