マソソソマソソソのバリエーションを生成する

ワードサラダマソリソマソリソが脳内で自然に融合したのできらレボ観ながら書いた。どうぞご利用ください。

[puma:~/masososomasososo] ec% perl maso.pl < masocorpus
マンソリマリリソ
[puma:~/masososomasososo] ec% perl maso.pl < masocorpus
マソンソマソンソ

maso.pl

#!/usr/bin/perl
use utf8;
use encoding 'utf-8';
use strict;

use constant {
    HEAD => 'マ',
    TOKEN_LEN => 4,
}; 

my $maso = learn(*STDIN);
print gen($maso).gen($maso)."\n";

sub learn {
    my $h = shift; 
    
    my $model = {};
    while (my $line = <$h>) {
        chomp $line;
        
        my @chars = split //, $line;
        for my $i (0..$#chars-1) {
            $model->{$chars[$i]}->{$chars[$i+1]} += 1 if ($chars[$i+1] ne HEAD);
        }
    }
    return $model;
}

sub gen {
    my $m = shift;
    my $seed = HEAD;
    my @str = ($seed);
    
    for my $i (0..TOKEN_LEN-2) {
        my $n = predict($m->{$seed});
        push @str, $n;
        $seed = $n;
    }
    
    return join '', @str; 
}

sub predict {
    my $h = shift;
    
    my @prob;
    while (my ($c, $r) = each %$h) {
        push @prob, $c for (1..$r);
    }
    die unless @prob;
    return $prob[int(rand(scalar @prob))]
}

masocorpus

マリリンマンソン
マソリンマンソン
マリリソマリリソ
マソリソマソソソ

紫色の何かを口に押し当てているジェネレータに関するまとめ

一方そのころ

帰ってくると別ルートでid:yappohttp://geekface.blogdb.jp/作っていたドクペライセンスの一文で煽られた人が日本に2人もいたのか!
座標指定型だと貼付ける画像を自由に投稿できるようになるとアナーキーそうだと思った。はてなセリフの新機能にどうか。

結論

Imagerで画像を合成するにはrubthrough。

Net::Tumblr

http://fuba.tumblr.com/post/2327086
こういう仕様なら作るまでもない気がしたけど画像Botのために作ってみたけど一瞬で容量制限溢れたので存在意義がなくなってとりあえず放出。コードはやっぱりはてダの方がいいな…。

usage.pl

use Net::Tumblr;
my $url = shift;

my $t = Net::Tumblr->new(
    email => 'example@example.com',
    password => 'password'
)->write(
    type => 'photo',
    source => $url,
    caption => "<a href=\"$url\">$url</a>",
);

詳しくはTumblr - API参照。

Net/Tumblr.pm

package Net::Tumblr;
use strict;
use warnings;

use LWP::UserAgent;
use URI::Escape qw/uri_escape_utf8/;

use constant API_WRITE => 'http://www.tumblr.com/api/write';

sub new {
    my $pkg = shift;
    my %opt = @_;
    
    my $ua = LWP::UserAgent->new();
    
    bless {
        email => ($opt{email} or die 'no email'),
        password => ($opt{password} or die 'no password'),
        generator => ($opt{generator} or 'Net::Tumblr'),
        ua => $ua,
    }, $pkg;
}

sub write {
    my $self = shift;
    my %opt = @_;
    
    $opt{email} = $self->{email};
    $opt{password} = $self->{password};
    $opt{generator} = $self->{generator};
    
    my $req = HTTP::Request->new(POST => &API_WRITE);
    $req->content_type('application/x-www-form-urlencoded');
    
    my $param = join '&',
        map {"$_=".uri_escape_utf8($opt{$_})}
        grep {$opt{$_}}
        keys %opt;
    
    $req->content($param);
    
    return $self->{ua}->request($req);
}

1;

ヌイッターの話もあったので一応

ところで、前のエントリを書く前に誰もダウンロードしてなさそーな新着投稿動画でチェックしてみたら以下のようなメッセージが。個人情報の入力なんて存在しないニコニコ動画専用のIDとパスが収集されたところで(実際収集してるわけないだろうし)大した問題は無いとは思うけど。


ダウンロード用のURLが登録されていません。
ニコニコ動画へログインするアカウント情報を入力し、ダウンロードURLを取得をクリックすると ダウンロード用のURLを取得することが出来ます。
ダウンロードURLを取得する際にサーバサイドでニコニコ動画へログインを行います。
ニコニコ動画を閲覧する際は再度ログインする必要があります。
同一動画を次回ダウンロードする場合はアカウント情報の入力は必要ありません。

nicoToolの人から反応があった

http://nicosns.inventor.jp/diary/973/
ログインしないと見れないので引用するね。


ニコニコ動画自体がyoutubeamebaなどの動画を直で引っ張って
コメントをつけるサービスなので、そういう意味で言えばニコ動画SNSyoutubeにとってのニコニコ動画と同じようなことをしてるのは確かですね。
また、動画の再生って自分のアカウントを使って再生できる様にしてるわけではないんです。これまでの蓄積されたflvファイルのURLを元にサービスを提供してみてる感じです。
実装にちょっと疑問があったのでそう書いたんですが、確かに公式のBookmarkletをよく読むと規約に触れずにURLを蓄積することが可能そうでした。失礼しました。

ログインせずにニコニコ動画の映像だけ見られるページに移動するBookmarklet

ニコ動動画エントリページで実行。ニコ動画SNSの会員しか使えなくなった。

javascript:(function(){if(location.href.match(/\/(\w+\d+)$/))location.href='http://nicosns.inventor.jp/download/'+RegExp.$1;})();

つーかこれはニコ動画SNSヤバくね?とおもって書いてたんだけど、普通にnicoToolのトップにニコニコ動画のアカウントが無くても動画を見ることができます。ってあってかなり萎えた。おそらくニコ動のアカウント管理体制がテキトーな間の運命な機能とはいえ、自分のアカウントを不特定多数に自由に使わせるのは限りなく黒に近いグレー(「アカウントに関する権利、権益」の解釈によるけど)。すごいなnicoTool。動画のURLはダウンロードBookmarkletから貰ってる様子。これならたぶん薄いグレー。

HA☆NA☆SEジェネレーター

どうぞご利用ください。

usage

% perl yugioh.pl はなせ  
HA☆NA☆SE

yugioh.pl

#!/usr/bin/perl
use strict;
use warnings;

use Lingua::JA::Romanize::Japanese;

my $phrase = shift;
my $conv = Lingua::JA::Romanize::Japanese->new();

my @romanized = $conv->string($phrase);
my $result = join '☆', map {uc($_->[1])} @romanized;
print "$result\n";