ごみ箱

Cursesについて

window = Curses::Window.new(25, 80, 0, 0)
window.setpos(5, 2)
window.addstr("yukimuraaaaaaaaaaaaaaaa")

これはないわ….instance_evalで任意のオブジェクトコンテキストから実行できるようにして
こんな感じでRubyっぽくしてみたらどうだろうか。

Curses::Window.new(:width=>20,:height=>30) do
  setpos 5,2
  addstr "yukimuraaaaaaaaaaaaa"
end

ちょっと前にRCursesっていうwrapper作ろうかなって言ってた時あったけど考査期間中ということで断念してたし、
(今も考査期間中だけど)考査が終わったら着手してみようかな。

ブロックの使い道?

#-*- coding:utf-8 -*-

require "rubygems"
require "net/https"
require "oauth"
require "json"

consumer_key = OAuth::Consumer.new(
  'CONSUMER_KEY',
  'CONSUMER_SECRET',
  {:site=>'http://twitter.com'}
)
access_token = OAuth::AccessToken.new(
  consumer_key,
  'ACCESS_TOKEN',
  'ACCESS_TOKEN_SECRET'
)
class Hatsunesan
  def initialize(c,d)
    @consumer_key = c
    @consumer_secret = d
    @filter = {}
  end
  def on(patt,&block)
    @filter[patt] = block
  end
  def ignition
    net = Net::HTTP.new("userstream.twitter.com",443)
    net.use_ssl = true
    net.verify_mode = OpenSSL::SSL::VERIFY_NONE
    net.start do |http|
      req = Net::HTTP::Get.new("/2/user.json")
      req.oauth!(http,@consumer_key,@consumer_secret)
      http.request(req) do |res|
        res.read_body{|body|
          data = JSON.parse(body) rescue next
          @filter.each{|patt,block|
            block.call(data) if data["text"] =~ patt
          }
        }
      end
    end
  end
  def self.ignition(c,d,&block)
    ff = Hatsunesan.new(c,d)
    block.arity<1 ? ff.instance_eval(block) : block.call(ff)
    ff.ignition
  end
end
Hatsunesan.ignition(consumer_key,access_token) do |ht|
  ht.on(/[Ss]n0w[Nn]ightは\w+/) do |x|
    print "うわあ#{x['user']['screen_name']}こいつに言及された!!!"
  end
end

引数とブロックを保持したHashを手当たり次第に列挙させてマッチしたらcallする
コールバック的というかRubyのコールバック手法

Procとlambdaって元は同じなんだなって

lambda{}.class #=> Proc
def oyakatasama; Proc.new { return "Yukimuraaaaaa!!!" }[] end
def yukimura; proc { return "Oyakatasamaaa!!!!" }[]; return "yukimura" end
def masamune; ->{ return "Let's Party!" }[]; return "masamune" end

[:oyakatasama,:yukimura,:masamune].each{|x|
  p __send__(x)
}
# oyakatasama #=> "Yukimuraaaaa!!"
# yukimura    #=> "yukimura"
# masamune    #=> "masamune"

Proc.newとprocとlambdaの間には引数の制約とか若干違いがあるみたいだけど
お館様の一方通行な愛情ウケる

思い直せば

そういえばこのブログ、受験シーズン真っただ中の中3の冬ぐらいに作りましたね….
なんていうか愛着が沸いてくる

Array#freq_distで度数分布

class Array
  def freq_dist
    _f = ->(x,y){ t=0; x.each{|n| t+=1 if n == y } t}
    {}.tap do |h|
      u = self.uniq
      u.each do |w|
        h[w] = _f.call(self,w)
      end
    end
  end
end
p [1,2,3,1,2,2].freq_dist

こういうのほしいけどもっと効率的な書き方があるはず…..。
追記:
もっといい方法があったぽよ
わざわざあんなダルい処理を考えつかなくてももう少し物事を本質的にとらえる事が重要なんだと思った

class Array
  def freq_dist
    Hash.new(0).tap{|h| self.each{|x| h[x] += 1}}
  end
end
p [1,2,3,1,2,2].freq_dist

Tumblrをブログ+ネタ帳の代替しようとして断念した話

  • 投稿者: admin
  • 2012年2月5日 5:45 AM
  • 未分類

 ネタ帳とブログを統一させたほうが情報収集の効率が上がるかなと考えたのですが、
 実際使ってみるとTumblr不便でしたね。HTMLエディタの自由があんまり効かないし。
 もともとTumblrは全くと言っていいほど使ってなかったのですが、
 普通に僕はこのブログとネタ帳は自作のSchwarzで間に合ってる感じがしました。
 Schwarzのほうが自分のネットサーフィンの感覚に合わせて設計されてるからだと思うけど。
 そんでもって開発者が言うのも何なんだけど
 主要なほとんど動画サイトのプレビューに対応してるのは結構大きい気がする。
 Schwarzの課題は検索した後にどうやったらユーザーが目的の保管した情報を見つけやすいか、
 あと、どういう風にしたらブックマークが綺麗に整理されてるように見せられるかだと思う。
 ほとんど実装よりUXとかUIのほうに費やしてる感ある。

Number#times

Number.prototype.times = function(callback,o) {
  for(var i=0; i<this; i++) {
    callback.call(o,i);
  }
  return this;
};

(new Number(5)).times(function(n){
  console.log(n);
})
.times(function(){
  console.log("今年はバレンタイン中止だって");
});

Ruby使いながらJavaScriptやってるとたまに欲しくなるtimesメソッド。
これ書いた後にないのかなって思ったらprototype.jsにあった

テスト駆動型開発始めました

RubyベストプラクティスをAmazonでポチったのでTDDを始めてみようかと思ってる。
んで、今test/unitを使おうと思って本とネットのtest/unitのリファレンスの両方とにらめっこしている状態なのだけど
学校の提出物ガン無視状態。やばい。
思い付いたら僕は今までコードをすぐ書いてたけどテストを書いてからやらないといけないのかなぁ
RSpecとかも気になるから今度触ってみようかと思ってる。

k平均法でクラスタリング

#-*- coding:utf-8 -*-

class Kmeans
  def pearson(a,b)
     #省略
  end
  def cluster(r,dist=:pearson,k=4)
    arr = []
    r[0].size.times do |x|
      cols = []
      r.each do |n|
        cols << n[i]
      end
      arr << [cols.min,cols.max]
    end

    cluster = []
    k.times do
      tmp_arr = []
      r[0].size.times do |n|
        diff = arr[n].max - arr[n].min  #104-94 = 10
        tmp_arr << rand() * diff + arr[n].min #rand()*10+94=46.804...
      end
      cluster << tmp_arr
    end

    matches = nil
    100.times do |i|
      p "Loop:"+i.to_s
      r2 = []
      k.times do
        r2 << Array.new
      end
      rows.size.times do |j|
        ans = 0
        k.times do |x|
          d = self.__send__(dist,cluster[x],r)
          ans = x if d < self.__send__(dist,cluster[ans],r)
        end
      end
      r2[ans] << j
    end

    return r2 if r2 == matches
    matches = ans
    k.times do |n|
      average = Array.new(r[0].size,0.0)
      if ans[n].size > 0 then
        ans[n].each do |x|
          r[x].size.each do |y|
            average[y] += r[x][y]
          end
        end
      end
      average.size.times do |j|
        averages[j] /= ans[j].size unless ans[j].nil?
      end
      cluster[n] = average
    end
  end
end

Array#>>があるなら

class Array
    def >>(r)
        r+self
    end
end
[] >> "ひいい".to_a >> "ふうう".to_a >> "みいい".to_a
[1,2,3,4] >> [1,2]

prependするArray#>>があってもいいと思うんだけどダメかな

(追記): @pasberthさんからの情報によるとこんなのがあったらしい↓
Ruby – Feature #3675: String#prepend, String#>> – Ruby Issue Tracking System

Stringオブジェクトが対象だったけど既出ネタ…..?

ホーム

検索
フィード
メタ情報

ページの上部に戻る