アーカイブ
sfc_ikiteru
@sfc_ikiteruというtwitter botができた。1時間ごとにSFCの状況をtweetする。
ソースはここにあるhttps://github.com/shokai/twitter_sfc_ikiteru
あといつのまにかSFC.死ぬ.jpがymrlによって作られていた。こっちの方が詳細がわかりやすい。
gem sfc_ikiteruは、pingをeventmachineで並列化したので監視対象のサーバーを増やしても大丈夫になった。
今こんな感じ
% sfc_ikiteru
sfc_ikiteru => 生存率 80%
web.sfc.keio.ac.jp => 正常です
ccz01.sfc.keio.ac.jp => 正常です
ccz02.sfc.keio.ac.jp => 正常です
mail.sfc.keio.ac.jp => 正常です
gw2.sfc.keio.ac.jp => 正常です
keio.gw.sinet.ad.jp => 正常です
shonan.sfc.wide.ad.jp => 正常です
masui.sfc.keio.ac.jp => 正常です
www.mag.keio.ac.jp => 応答なし
cpu0.mag.keio.ac.jp => 応答なし
26歳になったので
8月15日に26歳になったので、新しい自分を探すためにtwitterのプロフィールを自動的に更新するようにした

ソースコードは全部githubに置いた
ランダムに適当な紹介文を取ってくる
wikipedia.rb
# -*- coding: utf-8 -*-
require 'rubygems'
require 'open-uri'
require 'uri'
require 'nokogiri'
require 'kconv'
require 'net/http'class Wikipedia
def initialize(agent_name)
@agent_name = agent_name
enddef random
get('特別:おまかせ表示')
end
def get(name)
doc = Nokogiri::HTML open(URI.encode("http://ja.wikipedia.org/wiki/#{name}"), 'User-Agent' => @agent_name).read.toutf8
title = doc.xpath('//title').first.text
name = doc.xpath('//h1').first.text
descriptions = doc.xpath('//div[@id="bodyContent"]//p').map{|i|i.text}
{
:title => title,
:name => name,
:descriptions => descriptions
}
endend
このスクリプトをcronで定期的に実行して更新してる
change-profile.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'rubygems'
require 'twitter'
require 'yaml'
require File.dirname(__FILE__)+'/lib/wikipedia'
$KCODE = 'u'begin
conf = YAML::load open(File.dirname(__FILE__) + '/config.yaml')
rescue
STDERR.puts 'config.yaml load error'
exit 1
endtw = Twitter::Base.new(Twitter::HTTPAuth.new(conf['name'], conf['pass']))
w = Wikipedia.new('shokai')
desc = nil
5.times do
data = w.random
desc = data[:descriptions].first
desc.gsub!(/\[\d+\]/, '')
tmp = desc.split(/(と?は)/)
left = tmp.shift
while left =~ /([^)]+$/ do
tmp.shift
left = tmp.shift
end
desc = "#{conf['your_name']}#{tmp.join('')}".toutf8
puts '-'*10
print data[:name] + ' => '
puts desc
break if desc != conf['your_name']
end
exit if desc == nil or desc == conf['your_name']tw.update_profile({'description' => desc})
JRubyでglitch iconを作る(2)
プラグイン機構を採用し、ランダムにいろいろ作れるようにしてみた。
普通はjpegとかのバイナリを直接いじるみたいだけどよく分からないのでJRubyでjavax.imageioを使ってやっている。
ランダムに96個作ってみて8×12に敷き詰めてみたのがこれ。
で、定期的にランダムに作ってtwitterのアイコンとしてアップロードしてる。

敷き詰めるのはImageMagickと一緒にインストールされるmontageコマンドでできる montageコマンド – 橋本詳解
ソースコードは全てgithubに置いた。
■仕組み
単機能モジュールをランダムに連結する事である程度ランダムな画像を生成できる。
javax.imageio.BufferedImageのインスタンスを受け取り、少し加工して返すというJRubyのmoduleをプラグインとし、それらをGlitchというclassがランダムに呼び出す。
今のところプラグインは23種類ある。単体だとそれほど派手にはならない。

■プラグイン
http://github.com/shokai/glitchicon/tree/master/plugins/にある。
pluginが動くルールはこれ。
- pluginsディレクトリの中に置いておく
- ファイル名末尾が.rbである
- JRubyのmoduleである
- ファイル名の先頭1文字を大文字にしたmodule名である
- BufferedImageを受け取って、同じサイズのBufferedImageを返す glitch(BufferedImage) というstatic methodを持つ
- 受け取ったBufferedImageに対しては破壊的に処理しても、そうでなくてもいい
プラグインはBufferedImageの処理に集中できるように、他の事はglitch.rbがやる。
どのプラグインも簡単にできている。30行ぐらい。
drumroll_verticalプラグインの場合(画像では一番左、下から2番目)
#!/usr/bin/env jrubyランダムに縦に区切って、ランダムにスロットのドラムみたいにずらす。
require 'java'
import 'java.lang.System'
import 'javax.imageio.ImageIO'
import 'java.awt.image.BufferedImage'
module Drumroll_vertical
def Drumroll_vertical.glitch(img)
img_result = BufferedImage.new(img.width, img.height, img.type)
roll = 0
for x in 0...img.width do
roll = rand(img.height) if rand > 0.95
roll = 0 if rand > 0.95
for y in 0...img.height do
pix = img.get_rgb(x, y)
y2 = y+roll
y2 -= img.height if y2 > img.height-1
img_result.set_rgb(x, y2, pix)
end
end
return img_result
end
end
色を反転させるcolor_reverseプラグイン
#!/usr/bin/env jruby
require 'java'
import 'java.lang.System'
import 'javax.imageio.ImageIO'
import 'java.awt.image.BufferedImage'
module Color_reverse
def Color_reverse.glitch(img)
for y in 0...img.height do
for x in 0...img.width do
pix = img.get_rgb(x, y)
r = pix >> 16 & 0xFF
g = pix >> 8 & 0xFF
b = pix & 0xFF
r = 256-r
g = 256-g
b = 256-b
pix = ((r << 16)&0xFF0000 | (g << 8)&0xFF00 | b)
img.set_rgb(x,y, pix)
end
end
return img
end
end
量子化した後に輪郭抽出するquantize_contour
#!/usr/bin/env jruby
require 'java'
import 'java.lang.System'
import 'javax.imageio.ImageIO'
import 'java.awt.image.BufferedImage'
module Quantize_contour
def Quantize_contour.glitch(img)
for y in 0...img.height do
for x in 0...img.width do
pix = img.get_rgb(x, y)
r = pix >> 16 & 0xFF
g = pix >> 8 & 0xFF
b = pix & 0xFF
gray = (r+g+b)/3
quant = gray & 0xC0
pix = ((quant << 16)&0xFF0000 | (quant << 8)&0xFF00 | quant)
img.set_rgb(x, y, pix)
end
end
img_result = BufferedImage.new(img.width, img.height, img.type)
for y in 1...img.height-1 do
for x in 1...img.width-1 do
pix = img.get_rgb(x, y)
around = (img.get_rgb(x-1,y)+img.get_rgb(x+1,y)+img.get_rgb(x,y-1)+img.get_rgb(x,y+1))/4
if around < pix
pix = 0
else
pix = 0xFFFFFF
end
img_result.set_rgb(x, y, pix)
end
end
return img_result
end
end
そんなかんじ。画像をいじるけど、元の画像を知っている人なら元画像を思い浮かべられる程度にglitchしたい。
mbedにEthernetを接続しtwitterにpostする
@1VQ9の助力を得てmbedがethernetにつながった。1VQ9はパルストランスも通さず、分解したLANケーブルをmbedに直接差し込んで動かしてたけど、俺はmbed Ethernet Testingに従ってパルストランス入りのEthernet jackを使った。
ethernetにつないだところ

mbedとethernet jackは
- mbed p1 = Ethernet RD+
- p2 = RD-
- p7 = TD-
- p8 = TD+
配線はこっちの方が見やすいかも

裏のピン配置がブレッドボードに刺せるピッチ幅ではなかったので、秋月で100円で売ってる両面ガラススルーホール基盤の切れ端とピンヘッダを駆使してピン配置を変更した。


mbedにはHTTPClientというDNSやDHCPやHTTPを適当に解決してくれるモジュールがある。
ほぼmbed EMAC/HTTPClientのまま動いた。
HTTPClientを使うために、
http://mbed.org/projects/cookbook/svn/EMAC/lwip/trunkをprojectにimportする必要があった。mbedのエディタのGUIからimportできた。
tweet_test | mbed
#include "mbed.h"twitter APIにbasic認証を通ってhttp-postし、成功するとLED点滅のループに入る。
#include "HTTPClient.h"
using namespace std;
DigitalOut led(LED1);
HTTPClient http; // use DHCP
/* // use static IP
HTTPClient http("mbed", // hostname.
IPv4(192,168,1,39), // IPv4 address
IPv4(255,255,255,0), // netmask
IPv4(192,168,1,1), // default gateway
IPv4(192,168,1,1)); // dns server
/**/
const char msg[] = "status=mbed test";
int main(void) {
http.auth("username", "password");
http.post("http://twitter.com/statuses/update.xml", msg);
while(1) {
led = !led;
wait(0.2);
}
}
twitter APIは同じtweetを連続で受け取らないようになっているので、このプログラムだと一度tweetした後はmsgを別の文字列に変えないと再確認できない。後ろに乱数とか時刻とかをつける必要がある。
最近作ったYahooPipes
Pipes: 秋月電子 新製品FullFeed
秋月のRSSが無くなったので、新製品ページから取り出した。
Pipes: ストロベリー・リナックス FullFeed
strawberry-linux.comのnews feedがタイトルのみ配信だったので
どちらも商品イメージとデータシートへのリンクと価格を入れてある。
千石は元気の良いblogで新製品を教えてくれる。spark funと液晶工房もblogがある。スイッチサイエンスもフィード作ろうかと思ったけど新製品ページが半年ぐらい更新されてなかったからやめた。マルツもblogあるけど勉強会情報しかなくて、新製品情報はwebで一覧できない。電子工作系はいまだに新製品情報をネットで効率的に収集する手段が乏しいな。
Pipes: twitter list timeline
twitterのlist機能にrssが無いので。list出た時に作ったんだけど、twitterのHTMLが変わっていつのまにか動かなくなってたのを修理した。
ユーザ名とlist名を入れるとRSSを出す。他人の作ったlistをいろいろ購読してみてる。
pipesってソースのHTMLが変わっていつのまにかエラーになってるんだけど、RSSリーダに登録してるだけだと配信されなくなるだけで、「動かなくなった」事に気づけないんだよなあ
なんとかならないものか。1件も出力できなかったら一番上にエラー文を入れるようにすればいいのか?






最近のコメント