ごみ箱
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の間には引数の制約とか若干違いがあるみたいだけど
お館様の一方通行な愛情ウケる
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をブログ+ネタ帳の代替しようとして断念した話
- 2012年2月5日 5:45 AM
- 未分類
ネタ帳とブログを統一させたほうが情報収集の効率が上がるかなと考えたのですが、
実際使ってみるとTumblr不便でしたね。HTMLエディタの自由があんまり効かないし。
もともとTumblrは全くと言っていいほど使ってなかったのですが、
普通に僕はこのブログとネタ帳は自作のSchwarzで間に合ってる感じがしました。
Schwarzのほうが自分のネットサーフィンの感覚に合わせて設計されてるからだと思うけど。
そんでもって開発者が言うのも何なんだけど
主要なほとんど動画サイトのプレビューに対応してるのは結構大きい気がする。
Schwarzの課題は検索した後にどうやったらユーザーが目的の保管した情報を見つけやすいか、
あと、どういう風にしたらブックマークが綺麗に整理されてるように見せられるかだと思う。
ほとんど実装よりUXとかUIのほうに費やしてる感ある。
Number#times
- 2012年2月2日 8:23 PM
- JavaScript/Ajax | プログラミング
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オブジェクトが対象だったけど既出ネタ…..?
- 検索
- フィード
- メタ情報