basyura's blog

あしたになったらほんきだす。

HatebuRate - 自分でタイトルに重みを付けてはてブのタイトルを一覧表示する

f:id:basyura:20130923221312p:plain

はてブのタイトル一覧から自分が読みたい記事をリストアップする web サービスを作ってみた。ただし、利用者は自分だけ (ログイン機能とかなんもない)。

Gnosy を使ってみてたのだけど自分にあった記事が見つかるかって言うと・・・?
開くと興味なくても興味あると判定されて関連したものがピックアップされるし、そもそもネタ元がはてブだから「それ見たし」という記事ばかりでなかなかうまく行かないなぁと。
今は改善されてるのかもしれないけど。

自分でこれは興味あった無かったを判定して、自分で興味ある記事をピックアップしたいよと思ったのでチマチマ作ってみた。

使ったもの

  • Rails4
  • sqlite3
  • twiter bootstrap
  • instapaper
  • mecab
  • さくらVPS

どんなふうに

  • 記事の元ネタは、はてブから (http://b.hatena.ne.jp/entrylist?sort=hot&threshold=3&mode=rss)
  • cron で rails の task をキックして記事一覧を取得
  • はてブを見るときほ、ほぼタイトルしか見ないからタイトルだけで判定
  • いい感じに解析したいけど知識がないので、mecab で単語に分割 (してみただけ・・・)
  • 面白かったら ↑ そうじゃなかったら ↓ でタイトルの単語に点数をつける
  • 点数が高いタイトルを優先的に表示し、しきい値をつけてページにリストされるタイトルを制限する
  • 点数が高い記事は instapaper の api を叩いて登録
  • 毎朝 instapaper から kindle に配信

どうなったか

  • 見たくない記事が表示されなくなった
  • ↓ は多いが、↑ はなかなかない
  • 見たい記事がリストアップされたかというと??

まとめ

ログイン機能が無いのでこっそり運用しているけど、自分で作ったものを使うのが面白いからいいかな。
まとまってない。

Instapaper の simple API を叩く

Ruby から GitHub の API (v3) を叩くサンプルコード (Basic 認証) - ひだまりソケットは壊れないパク 参考に。

require 'net/https'

print 'username > '
USERNAME = STDIN.gets.chomp
print 'password > '
PASSWORD = STDIN.gets.chomp
print 'url      > '
URL      = STDIN.gets.chomp

https = Net::HTTP.new('instapaper.com', '443')
https.use_ssl = true
https.start do |https|
  req = Net::HTTP::Post.new('https://www.instapaper.com/api/add')
  req.basic_auth USERNAME, PASSWORD
  req.body =  "url=" + URL
  res = https.request(req)
  p res
end

token を使った Full API もあるんだけど、1$/月 なんだよなぁ。

Ruby on Rails 4入門

代表的なWebアプリケーションフレームワークであるRuby on Railsについて、その概念と使い方を説明していきます。

Ruby on Rails 4入門 (全28回) - プログラミングならドットインストール

入門して全28回やってきた。

テンポよく進む。どんなものかとりあえず見てみたい場合には良さそう。
で、その後はどうかっていうと、各自で頑張れ・・・か?

Bootstrap を試してみる

Sleek, intuitive, and powerful front-end framework for faster and easier web development.

Bootstrap

なんとなーく、カッコイイデザインができたらいいなぁと思いたって Bootstrap を調べてみる。
ついでになんとなく rails でやりたいなと思って http://tobioka.net/765 を参考に環境構築。
less とかよく分からん・・・。

rails のちょいアプリでデザインが出せるようになったので bootstrap のサイトで勉強。
ルールをちょっと覚えるだけで

f:id:basyura:20130831110813p:plain

とか

f:id:basyura:20130831110817p:plain

とか、簡単にできちゃってやっぱすごいなぁと実感。

んで、よくよく bootstrap サイトのアドレスを見てみると 2.3.2 とあったので、あれ?と思って上へとたどると v3 が出ていて、デザインが変わっているようだ。

よのなか動きが早くて完全に乗り遅れてる。

vim の plugin を並列アップデート

某 neobundle にできて Ruby にできないわけ無いじゃない ヽ(`Д´)ノ てことで。

僕は自作の Rakefile を叩いて最新化してます。
gitplugins フォルダに github にあるプラグインが沢山置いてあるとしてこんな感じ。

task :update_github do
  puts ""
  puts ">>> pull github repositories ..."
  Dir.chdir("gitplugins")

  que = Queue.new
  Dir.glob("*") do |d|
    que.push d
  end

  dir = Dir.pwd

  threads = []
 
  while !que.empty?
    threads << Thread.new(que.pop) do |target|
      repos  =  File.join(dir, target)
      if File.directory? repos
        Dir.chdir(repos)
        #puts "git pull #{target}"
        ret = `git pull 2>&1`
        if ret.chomp != 'Already up-to-date.'
          error_flg = false
          ret.each_line do |line|
            if line =~ /error/
              puts "#{target} ... #{line}"
              error_flg = true
              break
            end
          end
          puts "updated #{target}" unless error_flg
        end
      end
    end
  end
  threads.each do |t|
    t.join
  end
end

1つずつ git pull するのにくらべてあっというま。
色々間違ってそうな気もするけど、いまのところ特に問題ないようだ。

end がやけに多いのが気になるね。

鳥取Ruby会【とっとるびー】 第11回

f:id:basyura:20130119221330j:plain

http://tweetvite.com/event/tottoruby_11

Ruby2.0 Enumerable#lazy @hamajyotanさん

退社 → オフィス ウーム 設立 → 法人化(予定)
アグレッシブや。

lazy を試そうと Ruby 2.0.0-rc1 を入れようとしたら長らく rvm を使っていなかったので使い方を忘れていたなど。
無事初 lazy をキメられた。

require 'prime'
puts Prime.lazy.select {|x| (x % 10) == 1}.first(10)

内部的にはどうやってんのかなぁ。最初の 10 個を返すことを判断した上で、select で対象が決まるまでループする感じ?

Ruby2.0 Refinements @hilohiroさん

rc-1 では using なんてねーよと怒られたので ruby-head を入れようとしたらコンパイルができず・・・。
rvm requirements を確認して、Homebrew で apple-gcc42 をインストールする方法 を参考に必要なライブラリをインストール。無事 ruby-head が入った。

module MyScope
  refine String do
    def double_string
      self + self
    end
  end
end

using MyScope
class ScopeUser
  def run_defined
    'sample'.double_string
  end
end

puts ScopeUser.new.run_defined
#=> samplesample

では動いたんだけど

class ScopeUser
  using MyScope
  def run_defined
    'sample'.double_string
  end
end

では using が無いって怒られた。よく分からん。

Ruby2.0 DTrace @suzumura_ss

Ruby 2.0 で提供されている probe をフックするなど。
便利なんだけど、オーバーヘッドがあるのでやり過ぎると遅くなるし、遅すぎるとエラーになる。

すげえ・・・けど、僕的に使い道があるのかは謎・・・。突っ込んだことしようとすると必要になる?

mruby @kmt_tさん

C 力の弱い僕でも読んでみようかと思える程にコンパクト(?)。
読むのか・・・読めるのか?

git clone https://github.com/mruby/mruby.git

んで、rake で華麗にコンパイルを通すなど。

Dalvik 本でウハウハになるといいなぁ。

Network Forensics Puzzle: Puzzle#3 @ionis_h

 _人人人人人人人人人人人人人人人_
 > 突然のパケットストーキング <
  ̄YYYYYYYYYYYYYYY ̄

かにさんかにさん食べ放題

kmt_t さんのご好意により

_人人人人人人人人人人_
> 大量のカニ!!! <
 ̄YYYYYYYYYY ̄

使用前

f:id:basyura:20130119172627j:plain

使用後

f:id:basyura:20130119203746j:plain

めちゃくちゃお腹いっぱいになった。腹が膨れて動けないレベル。これでも去年に比べたら減っているらしい・・・どんだけ・・・。

美味しくいただきました。ありがとうございます

まとめ

暴風雪の恐れがあったものの当日はそんなこと無く飛行機が飛び、半年ぶりに参加することができました。
大学生が何人かいらっしゃっていてありがたい携帯の話を聞くことができました。

とりあえず、突然上がった料金の問い合わせをしに au ショップに行こうと思います。

次回

皆さんと違って内部的な突っ込んだ知識はあまりないので
なにか便利ツールとか gem とか作って公開発表という流れにしたいなぁ。
vim だと割とやりやすいんだけど、Ruby だとなかなか。どうしようかなぁ。