「argv」を含む日記 RSS

はてなキーワード: argvとは

2020-07-05

C++C++ C++インタプリタ

int moin(int argc.char*argv[]){

  std::cout<<"Hello world\n"<<std::flush;

  __asm__("mov ax,0");

}

2020-06-10

anond:20200610060955

たすけてね☆ このままだと ころされちゃう あいてにそんなつもりがなくても

あいてがやることは はなしかけるだけ ただし 不用意なタイミングで 何年も

それだけで 殺せるかの 実験でも しているんだろう

そんなものをうけたつもりはないし 顔合わせもしていない

また、そういう事故とまちがえられないよう 最近AKBイベントなども すべて自粛しているこ

相談する でも 相手を殺せるから

困りぬいた人に

溺れるものはわらをもつかむ で 殺されかけたことがある

こっちが 入院になった

そういうことしかない

から、助けももとめにくいけど

国に助けてもらいたい だれもいないから 天涯孤独 それもだめなら どこがいいか

周囲の人から理由特にないけど なぜか いじめられることはおおい

めんどくさい

っておもしろ

いままで、誰かの準備を食ってきたからかんたんだったんじゃない?

よく食われるからそうおもう

くうこと(きがつかずにもらっちゃう)もあるけどね

からない

どうしたらいいか

いまのたんとうが過去の中ではけっこういい

はなしかけられる ということがどれだけ苦痛を伴うかは だいぶまえから知ってる

がいきちの話を聞くのは苦痛だろう

それがわかるから、なるべくしないようにしている

でも限界なんだ

ここにひたすらかいていると すこしだけおちつく。

コロナからこっちは

基本書き込んでいる間はプログラムを組んでいることが大多数

つのアルゴリズムでもいろいろ書き方があるから

きぬき 10分かそこらやすんで

またさぎょう。

ずっといえだから、気がつくと寝ている。

あさおきると作業再開

ひたすら作業

AKB コロナ

みーんななくなっちゃうね

あそぶまえに とられて おわる まぁ コロナしょうがないけど

自粛 しているあいだにおわるかな どうしたらいいんだろう

AKBのお父さんの世代なんだなぁとおもって

としくったなぁとおもった

調子に乗るな!って

ヒット作もない

簡単にクビになる

いらねー人材

そんなもん、じぶんが、いちばんよくしってる

調子に乗れるようなものなどなにもない

いっしょけんめいがんばって

ねたみ そねみ 誹謗中傷はやまもど

ちょうしになどのれない

いじめられこそすれ いいことなどないのは自分が一番良く知っている。

くつなめましょうか?

 

それこそ、けぶべん血尿 大怪我 入院

反吐は吐いてないけど

苦労して、苦労して つくってる

自分の実力が ねーから くずやろう といわれることはあるし

そうだろうなとおもう

調子に乗ることなど無い

 

こんな恨みこそあれ みたいな状況で どうやったら 調子に乗れるのか というのと

あいての言い分を聞いて それこそ おれが 死んでりゃよかったんだろうなと思った

せめても がんばったか

がんばったといっただけだけど

ちょうしにのるな というのなら のらないし 乗る理由など無い

タバコ

あるいみ労災だよな なきゃ 仕事できない自分が悪いけど

まりにもAKB

イラッとしたかAKBCDでも買って送りつけてやりたい もちろん持ってるやつを

https://online.d-school.co/

https://codecamp.jp/

http://paiza.io/

http://techacademy.jp/

https://tech-camp.in/

ハローワーク

あとでいく

Hello world

#include <iostream>
#include <stdio.h>

int main(int argc,char *argv[]){
    for(int i=0;i<3;++i){
        int j = i;
        printf("Hello world%d\r\n",j);
    }
    for(int i=0;i<0;++i){
        printf("Hello again\r\n");
    }
    return 0;
};

むかしっから あたまは わるかった

もうすこし、大学進学率がちがったら 高卒だっただろう

それで十分だった

 

300万ポッチもない 男性 あほでしょ

がんばったんだ。貯金500万

あっというまに、なくなっちゃった。

 

もう戻らない僕の幸せ

小学校ぐらいか

呪われていて

親が転校してくれたけど

だめだった ばかだったんだ

 

がんばっても だめなら

それはそれでいい

かかわっちゃだめなら もっとはやくにちゃんとおしえてね

2020-03-20

anond:20200320104602

className *Param = NULL;

int main(int argc,const char *argv)

{

Param = new className();

return 0:

}

 

こういうコードのほうが実は合理的

というか、より簡単にかけるように言語を工夫してるんだから

難しく書いている方が間違い 理屈ちゃんとある

この場合プログラム内部にはかかれておらずカーネル側が処理してくれるから しらないとわからねいけど

カーネルの動きを知ってる場合メモリリークではなく こうしたほうがよいとちゃんとわかる

2019-01-01

Graphviz を使って Python抽象構文木を生成する。



1. こんな感じで使います


1.1. スクリプトとして使用する。

$ python parser.py sample.py


1.2. モジュールとして使用する。

import parser
code = '''
a  = 1 + 1
print(a)
'''
graph = parser.create_graph(code)
graph.render("sample")


2. ソースコード parser.py はこんな感じです。

import ast
import sys
import graphviz


def create_graph(lines):
    graph = graphviz.Graph(format='png')
    root = ast.parse(lines)
    node_list = [root]
    _setup(graph, node_list)
    return graph


def _setup(graph, node_list):
    # node
    node = node_list[-1]
    node_identity = str(len(node_list))
    node_name = type(node).__name__
    graph.node(node_identity, node_name)

    # children
    for child in ast.iter_child_nodes(node):
        node_list.append(child)
        child_identity = str(len(node_list))
        graph.edge(node_identity, child_identity)
        _setup(graph, node_list)


if __name__ == '__main__':
    file_name = sys.argv[1]
    with open(file_name) as file:
        lines = file.read()
    graph = create_graph(lines)
    graph.render(file_name)

2018-06-30

anond:20180630163249

一応想定してる答えのコードは↓(再帰で書くと途中でメモリ足りなくなるから満点取れないと思う)だとおもうんだけど、

やっぱ答えは3なのでなんかおかしい。運営問い詰めるか問題文全部載せな。

<?php
$X = $argv[1];
$sai=[1,2,3,4,5,6];
function sai($find,$table=[
    1=>[1],
    2=>[2],
    3=>[3],
    4=>[4],
    5=>[5],
    6=>[6]
],
$try=1){
  echo "TRY = $try \n";
  if(array_key_exists($find,$table)){
    var_dump($table);
    return $try;
  }
  $result=[];
  foreach($table as $goukei=>$mens){

    $mens=array_merge(
      array_reduce($mens,
      function($carry,$item){
        return array_merge($carry,draft($item));
      },[])
    );

    foreach($mens as $me){
      if(empty($result[$goukei+$me])){
        $result[$goukei+$me]=[];
      }
      if(!in_array($me,$result[$goukei+$me])){

        $result[$goukei+$me][]=$me;
      }
    }
  }

  $keys=array_keys($result);
  sort($keys);
  for($i=count($keys)-1;0<=$i && 20 < $i ;$i-- ){
    unset($result[$keys[$i]]);
  }

  return sai($find,$result,$try+1);
}

function draft($k){
  return array_filter(master(),
    function($me)
    use($k)
    {
    return ($k!=$me) && ($k+$me) !=7;
  }
  );
}

function master(){
  return [1,2,3,4,5,6];
}

echo "RESULT!".sai($X);
 ||<

2018-04-11

PyQt5でクリップボード画像を送る

相変わらず投稿するような場を持ってないのでここに。

PyQt5のアプリ上で外部から取得したPNG/JPEGクリップボードに送りたかったが、

期待するサンプルが見当たらなかったのでメモ

期待する動作は、Officeに元の形式として貼り付け可能であること。

失敗1

web上のいろんな情報から再構成してみた。

QClipboardなのかclipboardなのかで相当手間取った。

というかQApplicationがいまいちわからん。これでいいのだろうか。

ともあれ、クリップボードはいろいろ格納されたようだが、Office上ではビットマップとしてしか貼り付けられなかった。

import sys
from PyQt5.Qt import QApplication, QImage

img = QImage('test.png')

app = QApplication(sys.argv)
app.clipboard().setImage(img)


失敗2

失敗1から一回QMimeDataを経由してみた。結果何も変わらず。

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

import sys
from PyQt5.Qt import QApplication, QImage, QMimeData

img = QImage('test.png')

data = QMimeData()
data.setImageData(img)

app = QApplication(sys.argv)
app.clipboard().setMimeData(data)


結局

以前C#にて、画像生成してクリップボードに送るアプリを作ろうとしていたときの残骸を参考にトライ

無事期待する動作が得られた。

JPEG場合はsetData('JFIF', img)になる。

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

import sys
from PyQt5.Qt import QApplication, QMimeData

with open('test.png', 'rb') as fo:
    img = fo.read()

data = QMimeData()
data.setData('PNG', img)

app = QApplication(sys.argv)
app.clipboard().setMimeData(data)


今回はPyQt5ベースだったので試さなかったが、pywin32のwin32clipboardとかいうのも使えたのだろうか。

ただ画像を送るとなると結局情報が少ないので、どのみち手間取りそう。

2018-03-17

anond:20180316232605

Excelを持っているならはてブJSONデータをそのまま取り込めるそうだからそのデータを使ってブクマが付いた時間グラフが描けそう。

例えばこんな感じでJSONデータが取れる。 http://b.hatena.ne.jp/entry/jsonlite/https://anond.hatelabo.jp/20180315232737

Excel持ってないならスクリプトCSVにしてしまえばいい。

rubyスクリプトだとこんな感じ。(Mechanize無し版に差し替え。なぜMechanizeを使っていたかと言うとはてブUser-Agentが空だと値を返してくれないから。ちょっと長くなるが自前でUAを渡すようにした。)

#!/usr/bin/ruby

require 'uri'

require 'net/http'

require 'json'

require 'csv'

site = ARGV[0]

json_uri = URI.parse("http://b.hatena.ne.jp/entry/jsonlite/%s" % [site])

response = Net::HTTP.start(json_uri.host, json_uri.port) do |http|

http.get(json_uri.path, "User-Agent" => "Mozilla/5.0")

end

json_data = JSON.parse(response.body)

json_data['bookmarks'].each do |bookmark|

puts [bookmark['user'], bookmark['timestamp'], bookmark['comment'], bookmark['tags'].to_s].to_csv

end

引数に取得したいページのURLを入れる。hatebuapi-csv.rbという名前で保存したとしたらこんな感じで実行。

% hatebuapi-csv.rb https://anond.hatelabo.jp/20180315######## > 結果.csv

このケースでは朝の7時から爆発的にブクマが付き始める様子が分かる。

https://imgur.com/66FlJIB

2014-02-15

Python無名関数っぽいUnixコマンド作った。

GitHubとかブログやってないからここに書いておく。

使い方

標準入力を使いまわしたいとき

... | fun x:: cmd1 x : cmd2 x : ... : cmdn x | ...

ただしcmdにはサブシェルパイプなどは使用できない。

標準入力をそのまま利用する場合と一行毎に処理する場合

一行毎に処理する場合はxargs -Iを利用する。

$ ls *txt
a.txt b.txt
$ cat a.txt
1
$ cat b.txt
2
$ ls *txt | fun x:: echo x : cat x
a.txt b.txt
1
2
$ ls *txt | xargs -Ix fun _:: echo x : cat x
a.txt
1
b.txt
2

コード(fun)

>と<はそれぞれ大小の不等号で置き換えてくださいな

#!/usr/bin/env python
import sys
from subprocess import *

def take_variable(var):
	# check the syntax of variable (http://www.gnu.org/software/bash/manual/bash.html)
	# variable ::= (_|[A-z])(_|[A-z]|[0-9])*
	# variable contained space
	if len(var.split()) > 1:
		raise Exception('fail: the variable contained space')
	# check head
	if not (var[0].isalpha() or var[0] == '_'):
		raise Exception('fail: the variable contained wrong character')
	# check the body of variable
	b = True
	i = 0
	for c in var[1:]:
		i += 1
		# is variable contained invalid character?
		if not (c.isalpha() or c.isdigit() or c == '_'):
			b = False
			break
	# no exception if thre are only spaces after variable
	if not b and not var[i:].isspace():
		raise Exception('fail: the variable contained wrong character')
	elif b:
		return var[0]
	else:
		return var[:i]

def parse(var_to_cmds):
	# check the position of '::'
	try:
		pos = var_to_cmds.index('::')
	except Exception:
		raise Exception('not exists "::"')
	var = var_to_cmds[:pos]
	cmd_str = var_to_cmds[pos+2:]
	# check the format of variable and commands
	if var ==  '':
		raise Exception('fail: no variable before "::"')
	elif cmd_str == '':
		raise Exception('fail: no commands after "::"')

	return (take_variable(var),cmd_str)


if __name__ == '__main__':
	# parse variable and commands
	try:
		var,cmd_str = parse(' '.join(sys.argv[1:]))
	except Exception, e:
		print >>sys.stderr, e
		sys.exit(1)

	# var -> val
	val = sys.stdin.read().replace('\n',' ')
	# mapping and split by ':' again
	commands = map(
			(lambda cmd: cmd.replace(' '+var+' ',' '+val+' ')),
			cmd_str.split(':'))

	# exec command
	for cmd in commands:
		try:
			# need split for remove spaces
			check_call(cmd.split())
		except Exception,e:
			# print >>sys.stderr, e
			sys.exit(1)

本当はfunじゃなくて\(バックスラッシュ)で、:: じゃなくて→にしたかったんだけど、シェルが置き換えちゃうからしかたない

シェルの改造は禁断の手段だし

2011-03-04

http://anond.hatelabo.jp/20110303225320

じゃぁ、問1をやってみた。


unsigned int f(unsigned int x) {
    x = x - 1;
    x = x | (x >> 1);
    x = x | (x >> 2);
    x = x | (x >> 4);
    x = x | (x >> 8);
    x = x | (x >>16);
    return x + 1;
}



int main(int argc, const char * argv[])
{

	int check = 1;
	int cnt=0;
	if(0!=f(0)){
		cnt++;
	}
	for(unsigned int i=1;i!=0;i++){
		if(check < i){
			check <<=1;
		}
		if(check != f(i)){
			cnt++;
		}
		if(i%0x10000==0){
			printf("%x\n",i);
		}
	}
	printf("cnt=%d\n",cnt);
	return 0;
}

iよりも等しいか大きい最小の2の乗数 

とunsigne int 全域において等しいプログラムcnt=0であることを確認するプログラム

2011-01-23

http://anond.hatelabo.jp/20110123003228

書いてみたけどぜんぜん面白くならんわ。このサイズ面白さを競ってもなあ。

どうやったら面白くなる?

#include "stdafx.h"
#include "windows.h"

int _tmain(int argc, _TCHAR* argv[])
{
	int i=2;
	int j=0;
	while(1){
		i++;
		for(j=2;j<i;j++){
			if((i % j)==0){
				//printf("%d は素数はない\n",i);
				break;
			}
		}
		if(j==i){
			//printf("%d は素数\n",i);
			printf("%d\n",i);
		}
		//Sleep(1000);
	}
	return 0;
}

2011-01-14

int main(int argc, char* argv[])
{
  void **dpj;
  dpj = (void**)calloc(411 + 1, sizeof(void*));
  return 1;
}

2010-09-20

[] みんくちゃんねるから画像を抜き出すワンライナー(改)

最近の記事は http://anond.hatelabo.jp/20100727011929 だと画像が取れなくなっているのでちょっと直した.あと引数で記事を指定できるようにしたよ.<<を半角に直して使ってね

ruby -ropen-uri -rnokogiri -e "Nokogiri::HTML(open ARGV[0]).search('img.pict').map{|e| e['src']}.each{|http| File.open(http.match(/.+\/(.+\.jpg)/)[1],'w'){|f| f << open(http).read }}" "http://minkch.com/archives/51611588.html"

2010-08-16

if も 3項演算子も for も do whileすらもない ifなしの Fizz Buzz

だから、プログラム記法がなくても<>が無いから化けないぜ

#include "stdio.h"
#include "stdlib.h"

int cnumber=0;

void fizz(){
    printf("fizz");
    cnumber++;
};

void nonfizz(){
};

void buzz(){
    printf("buzz");
    cnumber++;
};

void nonbuzz(){
};

void number(int i){
    printf("%d",i);
    cnumber = 0;
}

void nonnumber(int i){
    cnumber = 0;
}

void myexit(void){
    printf("\n Hit return key to exit\n");
    getchar();
    exit(1);
}

void noexit(void){
}

void (*pfizz[3])() = {fizz,nonfizz,nonfizz};
void (*pbuzz[5])() = {buzz,nonbuzz,nonbuzz,nonbuzz,nonbuzz};
void (*pnumber[3])(int) = {number,nonnumber,nonnumber};
void (*pmyexit[2])() = {noexit,myexit};

int main(int argc, char* argv[])
{
    int loopmax = (111+222+333)*10;
    int i = 1;
    head:
    (*pfizz[i%3])();
    (*pbuzz[i%5])();
    (*pnumber[cnumber])(i);
    (*pmyexit[!(loopmax-i)])();
    printf(",");
    i++;
    goto head;
    return 0;
}

includeが<>を使ってないので必要ならパスは各自で通してねw

2009-12-31

配列だめなのかよ

perl -e "print atan2(1,2)"

0.463647609000806

perl -e "print atan2(@ARGV[0,1])" 1 2

Not enough arguments for atan2 at -e line 1, at end of line

Execution of -e aborted due to compilation errors.

えー

2009-10-04

グーグルマップ壁紙にしてみる

10/18 改訂

グーグルマップ航空写真をつなげて一枚にするスクリプト

なお、取得した画像著作権グーグル他各社が保持しています。

ご利用は計画的に私的範囲でどうぞご利用ください。

#!/usr/bin/perl

use strict;
use warnings;
use Getopt::Long;
use LWP::UserAgent;
use GD;

my $cmdline = join(" ", $0, @ARGV);
my $usage = "usage: $0 -sx=116423 -sy=51603 -ex=116426 -ey=51605 -dx=4 -dy=3 -z=17 -size=300 -get=30 -dir=cache -output=output.jpg -nodebug";
my ($sx, $sy) = (0, 0);
my ($ex, $ey) = (0, 0);
my ($dx, $dy) = (4, 3);
my $z = 17;
my $size = 300;
my $get = 30;
my $dir = "cache";
my $output = "output.jpg";
my $debug = 0;
GetOptions("sx=i" => \$sx, "sy=i" => \$sy,
	   "ex=i" => \$ex, "ey=i" => \$ey,
	   "dx=i" => \$dx, "dy=i" => \$dy,
	   "z=i" => \$z,
	   "size=i" => \$size, "get=i" => $get,
	   "dir=s" => \$dir, "output=s" => \$output,
	   "debug!" => \$debug) or die "$usage\nDied";
if ($ex == 0) {
    $ex = $sx + $dx;
} else {
    $ex++;
    $dx = $ex - $sx;
}
if ($ey == 0) {
    $ey = $sy + $dy;
} else {
    $ey++;
    $dy = $ey - $sy;
}
$sx>0 and $dx>0 and $sy>0 and $dy>0 and $z>0 and $dir and $output
    or die "$usage\nBad arguments";
$dx*$dy > $size and die "Getting too large.";

$debug and print "debug: mkdir $dir\n";
mkdir $dir;
-d $dir or die "can't make dir $dir: $!";

my $base = sprintf("http://khm%d.google.co.jp/kh/v=46&z=%d", int(rand(4)), $z);
my $ua = LWP::UserAgent->new;
printf "now get %d images...\n", $dx*$dy;
for (my $x=$sx; $x < $ex; $x++) {
    for (my $y=$sy; $y < $ey; $y++) {
	my $file = sprintf("%s/%02dz%06dx%06d.jpg", $dir, $z, $x, $y);
	$debug and print "debug: check of $file\n";
	-s $file and next;
	--$get < 0 and last;
	my $req = HTTP::Request->new(GET=>+"$base&x=$x&y=$y");
	$debug and print "debug: fetch from ".$req->uri."\n";
	my $res = $ua->request($req);
	unless ($res->is_success) {
	    print "fail fetch from $file: ", $res->status_line, "\n";
	    next;
	}
	if (open(my $fh, ">", $file)) {
	    $debug and print "debug: write of $file\n";
	    binmode $fh;
	    print $fh $res->content;
	    close $fh;
	} else {
	    print "fail open in $file: $!\n";
	}
    }
}
$get < 0 and print "reach the getting limit, skip after all.\n";

printf "creating %dX%d image...\n", 256*$dx, 256*$dy;
my $image = new GD::Image(256*$dx, 256*$dy);
for (my $x=$sx; $x < $ex; $x++) {
    for (my $y=$sy; $y < $ey; $y++) {
	my $file = sprintf("%s/%02dz%06dx%06d.jpg", $dir, $z, $x, $y);
	$debug and print "debug: check of $file\n";
	-s $file or next;
	$debug and print "debug: read of $file\n";
	my $part = GD::Image->newFromJpeg($file);
	$debug and print "debug: image copy\n";
	$image->copy($part, 256*($x-$sx), 256*($y-$sy), 0, 0, 256, 256);
    }
}
#$image->string(gdSmallFont, 0, 0, $cmdline, $image->colorAllocate(255, 255, 255));
open(my $fh, ">", $output) or die "fail open $output: $!";
$debug and print "debug: write of $output\n";
binmode $fh;
print $fh $image->jpeg();
close $fh;

例えば秋葉原とか

perl gmwall.pl -sx=116423 -sy=51603 -ex=116427 -ey=51606

駅だけとか

perl gmwall.pl -sx=465701 -sy=206420 -ex=465705 -ey=206423 -z=19

使う数値はfirebugなどで拾ってください。

2009-09-13

void Maimiku(int argc, char * argv[]){

 int mymk = args[1];

nakayoshi(mymk);

}

int nakayoshi(int n){

nakayoshi(n);

}

仲良しマイミクってこんな感じですか?そのうち親友マイミクとかできちゃったりするんですか?よくわかりません。

2009-03-26

ハッシュ関数を調べる

セキュリティ目的ではない。ハッシュテーブルで使うような奴でキャッシュで使いたい。

手軽なほうが良い。軽いほうが良い。推測可能でよい。数十バイトくらいの文字列にしたい。

md5が一番汎用っぽいけど、無駄に重い気がする。crc32は軽そうだしそれなりに汎用っぽいけど、ハッシュ長が短いのがめんどい

ベターはなんだろう。セオリーはなんだろう。

調べた→ http://anond.hatelabo.jp/20090327015620

ベンチ用スクリプト

#!/usr/local/bin/python
from sys import argv, stderr
from time import time
from string import ascii_letters, join
from random import choice
from hashlib import md5
from binascii import crc32
from itertools import izip

time_fmt = '%10s: %5d ms'
shift = int(argv[1]) if len(argv)&gt;1 and argv[1].isdigit() else 2
length = 0x100 << shift
cycle = 0x10000 &gt;&gt; shift
print &gt;&gt; stderr, 'string length: 0x%x, cycle: 0x%x' % (length, cycle)
data = tuple(''.join(choice(ascii_letters) for i in xrange(length)) for j in xrange(cycle))

start = time()
md5hex = tuple(md5(s).hexdigest() for s in data)
print &gt;&gt; stderr, time_fmt % ('md5hex', (time() - start) * 1000)

start = time()
crc32x4 = tuple(''.join('%08x' % abs(crc32(s[i::4])) for i in (0, 1, 2, 3)) for s in data)
print &gt;&gt; stderr, time_fmt % ('crc32x4', (time() - start) * 1000)

start = time()
startend = tuple(s[:16]+s[-16:] for s in data)
print &gt;&gt; stderr, time_fmt % ('headtail', (time() - start) * 1000)

start = time()
skip = tuple(s[::(len(s)/32+1)] for s in data)
print &gt;&gt; stderr, time_fmt % ('skipover', (time() - start) * 1000)

for s in izip(data, md5hex, crc32x4, startend, skip):
    print join(s)

実行結果

% python hashbench.py 0 &gt; hash0.txt
string length: 0x100, cycle: 0x10000
    md5hex:   199 ms
   crc32x4:  1081 ms
  headtail:    30 ms
  skipover:    41 ms
% python hashbench.py 2 &gt; hash1.txt
string length: 0x400, cycle: 0x4000
    md5hex:    83 ms
   crc32x4:   363 ms
  headtail:    10 ms
  skipover:    20 ms
% python hashbench.py 4 &gt; hash2.txt
string length: 0x1000, cycle: 0x1000
    md5hex:    52 ms
   crc32x4:   170 ms
  headtail:     2 ms
  skipover:     5 ms

2008-10-30

http://anond.hatelabo.jp/20081025202001

いまさらだがFizzBuzz

1から100まで、3の倍数5の倍数云々って、全部定数の計算じゃね?

というところに気付き、自称メタプログラマー(略してメタグラマー)俺の血が騒いだ。

定数計算なら、それは実行時ではなくコンパイル時に行なわれるべきだ……。

というわけでC++テンプレートメタプログラミング召喚。

#include <iostream>

const int FIZZ_NUM = 3;
const int BUZZ_NUM = 5;
const int BEGIN_NUM = 1;
const int END_NUM = 101;

template<int N> struct Fizz {
    enum {PRINT = 0, NEXT = N + 1};
    static void print() {}
};

template<int N> struct Buzz {
    enum {PRINT = 0, NEXT = N + 1};
    static void print() {}
};

template<int N, bool ForB> struct Number {static void print() {std::cout << N;}};

template<> struct Fizz<FIZZ_NUM> {
    enum {PRINT = 1, NEXT = 1};
    static void print() {std::cout << "Fizz";}
};

template<> struct Buzz<BUZZ_NUM> {
    enum {PRINT = 1, NEXT = 1};
    static void print() {std::cout << "Buzz";}
};

template<int N> struct Number<N, true> {static void print() {}};

template<int N, int F, int B> struct FizzBuzz {
    static void print() {
        typedef ::Fizz<F> Fizz;
        typedef ::Buzz<B> Buzz;
        
        Fizz::print();
        Buzz::print();
        Number<N, Fizz::PRINT || Buzz::PRINT>::print();
        std::cout << std::endl;
        
        FizzBuzz<N + 1, Fizz::NEXT, Buzz::NEXT>::print();
    }
};

template<int F, int B> struct FizzBuzz<END_NUM, F, B> {static void print() {}};

int main(int argc, char **argv)
{
    FizzBuzz<BEGIN_NUM, 1, 1>::print();
    return 0;
}

ifなし%なしループ系なし、しかも実行時オーバーヘッドなし!(多分)

あ、これを見て理解する人間オーバーヘッドは無視ね。

ああ、久しぶりにC++を触ったけど、やっぱC++テンプレートってダメダメだな。20世紀の遺物といわざるを得ない。

君がもし21世紀モテイケメンメタグラマーなら、21世紀プログラミング言語D言語を使うべきだ!

驚くべきことに、D言語コンパイル時に関数が実行でき、その結果をソースコードとして取り込める!

ただし実行できるのは簡単な関数だけだけど……。

以下、それを使ったD言語によるメタプログラミング的実装。

import std.stdio;

// これでFizzBuzzを全部出力するコードを作るぜ!
string makeFizzBuzzCode() {
    string code;
    for(int i = 1; i <= 100; ++i) {
        // 効率? コンパイル時にそんな配慮は要らん!
        if(i % 3 == 0 &amp;&amp; i % 5 == 0) {
            code ~= "writefln(\"FizzBuzz\");\n";
        } else if(i % 3 == 0) {
            code ~= "writefln(\"Fizz\");\n";
        } else if(i % 5 == 0) {
            code ~= "writefln(\"Buzz\");\n";
        } else {
            code ~= "writefln(" ~ static_itoa(i) ~ ");\n";
        }
    }
    return code;
}

int main(string[] args) {
    // おまけで生成されたコードも見せるよ。
    pragma(msg, makeFizzBuzzCode());
    
    // 生成したコードを埋め込む。コピペみたいな感覚
    mixin(makeFizzBuzzCode);
    return 0;
}

// 以下ユーティリティ。このぐらい標準で欲しいな……。

/// 整数文字列変換(コンパイル時)
string static_itoa(int n) {
    if(n == 0) {
        return "0";
    }
    
    // 10で割りながら余りを文字にして追加。桁が逆転した文字列になる。
    string s;
    for(; n; n /= 10) {
        s ~= ("0123456789")[n % 10];
    }
    
    // 桁位置を正常にする。相変わらず効率無視。
    return static_reverse(s);
}

/// 配列リバースコンパイル時)
/// 実行時ならarray.reverseが使えるんだけどね……。
T[] static_reverse(T)(T[] s) {
    T[] result;
    foreach_reverse(c; s) {
        result ~= c;
    }
    return result;
}

// 心配なので静的ユニットテスト(笑)
unittest {
    static assert(static_itoa(0) == "0");
    static assert(static_itoa(10) == "10");
    static assert(static_itoa(999) == "999");
    static assert(static_itoa(9999) == "9999");
    static assert(static_itoa(12345) == "12345");
    static assert(static_itoa(314159265) == "314159265");
}

コンパイル結果

$ dmd -unittest fizz_buzz.d
writefln(1);
writefln(2);
writefln("Fizz");
writefln(4);
writefln("Buzz");
writefln("Fizz");
writefln(7);
writefln(8);
writefln("Fizz");
writefln("Buzz");
writefln(11);
writefln("Fizz");
writefln(13);
writefln(14);
writefln("FizzBu(ry

出力結果は略。

さすがD言語C++JavaC#にできない事を平然とやってのけるッ

そこにシビれる!あこがれるゥ!

というか、

writefln(1);
writefln(2);
writefln("Fizz");
writefln(4);

もうwritefln(出力関数)要らなくね?

修正。

// これでFizzBuzzを全部出力するぜ!
string makeFizzBuzzCode() {
    string code;
    for(int i = 1; i <= 100; ++i) {
        // 効率? コンパイル時にそんな配慮は要らん!
        if(i % 3 == 0 &amp;&amp; i % 5 == 0) {
            code ~= "FizzBuzz\n";
        } else if(i % 3 == 0) {
            code ~= "Fizz\n";
        } else if(i % 5 == 0) {
            code ~= "Buzz\n";
        } else {
            code ~= static_itoa(i) ~ "\n";
        }
    }
    return code;
}

int main(string[] args) {
    // もうコンパイル時のメッセージしか出さない。(笑)
    pragma(msg, makeFizzBuzzCode());
    return 0;
}

コンパイル結果。

$ dmd -unittest fizz_buzz.d
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBu(ry

実行するまでもなく結果が出力された。つまり実行時間ゼロ、ということは……

世 界 最 速

以上、世界最速なD言語宣伝でした。

みんな使おうD言語

D言語リファレンス日本語

http://www.kmonos.net/alang/d/1.0/index.html(1.0。こっちの方が安定してる?)

http://www.kmonos.net/alang/d/2.0/index.html(もっと凄い2.0)

D言語本家配布元(無料コンパイラが入手できます)

http://www.digitalmars.com/

それにしても、ちゃんとD言語シンタックスハイライトを実装しているはてなは偉い。(笑)

2008-04-16

http://anond.hatelabo.jp/20080415182703

実行してみたら出力に変化がなかった。アルェー?

おっと、バグが。ちゃんとテストしてなかった。すんまそん。

# tree -pugs | perl -e '@line=<>; $max=(sort {$b<=>$a} map {/^(.*?)\[/; length($1)} @line)[0]; map {s/^(.*?)\[/$1 . " "x($max-length($1))."\["/e} @line; print @line'

毎回正規表現考えるのも面倒かなーとかとか。

理想を語ると出力形式指定できれば最強だなーとか妄想してた。

この辺は、ファイルにして ~/bin に放りこんで、自分好みに育て上げる、ってのがエロゲ^H^H^Hギーク楽しみ方かと。

雛型的には↓かなぁ。どうだろ。弾・monger・コーガイ氏が登場したら……滅多切りさるかもw

#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Std;
use vars qw($opt_t);

# オプション処理
getopts('t');
# $opt_tがセットされていたらタブ処理、ということにする。

# コマンド起動
# 引数処理とかシグナルとか面倒なところは……
open TREE, "tree -pugs ".join(" ",@ARGV,"|") or die;
my @line = <TREE>; # 富豪的にいく
close TREE; # ここで子プロセスの処理だっけ?
# それともwaitするんだっけ?

# ツリー表示部分の最大長を求める。
my $max=(sort {$b<=>$a} map {/^(.*?)\[/; length($1)} @line)[0];
# 色々やる時はユーザ名とかグループ名とかファイル名とかの最大長がいるかも

foreach (@line) {
        if ($opt_t) {
                # タブ(\t)で位置をそろえるとか……
        } else {
                s/^(.*?)\[/$1 . " "x($max-length($1))."\["/e;
        }
        print;
}

treeへのオプションの与え方とか、それによる出力の変化とか考えると、結構面倒だけど、自分用に決め打ちしとけば何とかなるでしょう。

あと、「[%p<>%u<>%g<>%s]」みたいなのはCPANに転がってたりしそうな気もするので、それを使うとか。

そんなところでなかろうか。

[追記]

http://search.cpan.org/~darren/String-Format-1.14/Format.pm というのがあった。

2007-08-22

http://anond.hatelabo.jp/20070822165701

@data=(a,b,c);print@data
#!/usr/bin/perl
use strict;
my @data = qw(a b c);

my $cx = scalar @data;
my $si = 0;
my $ax;
LOOP:
    $ax = $data[$si];
    print $ax;
    $si++;
not --$cx or goto LOOP;
#!/usr/bin/perl
use strict;
my @data = qw(a b c);

package AtoH;
use base qw(Tie::Handle);
sub TIEHANDLE {
    my $class = shift;
    return bless {data => [@_]}, $class;
}
sub READLINE {
    return shift @{shift->{data}};
}

package main;
tie *ARGV, 'AtoH', @data;
while (<>) {
    print;
}

2007-07-12

迷路成プログラムVC++2005でやってみた。

http://anond.hatelabo.jp/20070711013155 こちらの宿題を作ってみました。

http://anond.hatelabo.jp/20070711080519 で参加を宣言した者です。

#include "stdafx.h"
#include <time.h>
#include <conio.h>
#include <list>

using namespace std;

enum MMError {
	MME_None = 0,
	MME_SizeError,
	MME_MemoryAllocError,
	MME_NotInitialized,
};

enum MMKind {
	MMK_None = 0,
	MMK_Space,		// 通路
	MMK_Filled,		// 埋まってるところ。掘れる。
	MMK_Wall,		// 壁。掘れないところ。
};

//
// 迷路実体管理用クラス定義
//
class CMazeMatrix
{
public:
	CMazeMatrix();
	virtual ~CMazeMatrix();

public:
	virtual bool	Initialize(int nXSize, int nYSize);	// 初期化すると同時に、外壁まで作ってしまう。
	virtual MMKind	GetAt(int nXPos, int nYPos);
	virtual bool	SetAt(int nXPos, int nYPos, MMKind kind);

	MMError	GetLastError() {return m_lastError;}


protected:
	inline	int calcIndex(int nXPos, int nYPos) {return nYPos * m_nXSize + nXPos;}
	bool	finalize();

protected:
	MMKind	*m_pMaze;
	int		m_nXSize;
	int		m_nYSize;

	MMError	m_lastError;
};

//
// 実体管理用クラス実体
//
CMazeMatrix::CMazeMatrix()
{
	m_pMaze = NULL;
	m_nXSize = 0;
	m_nYSize = 0;
	m_lastError = MME_None;
}

CMazeMatrix::~CMazeMatrix()
{
	finalize();
}


bool CMazeMatrix::Initialize(int nXSize, int nYSize)
{
	finalize();

	int nSize = nXSize * nYSize;
	if ((__int64)nSize != (__int64)nXSize * (__int64)nYSize) {
		m_lastError = MME_SizeError;
		return false;
	}
	m_pMaze = new MMKind[nSize];
	if (m_pMaze == NULL) {
		m_lastError = MME_MemoryAllocError;
		return false;
	}

	m_nXSize = nXSize;
	m_nYSize = nYSize;

	int nCnt;
	for (nCnt = 0; nCnt < nSize; nCnt++) 
		m_pMaze[nCnt] = MMK_Filled;

	for (nCnt = 0; nCnt < m_nXSize; nCnt++) {
		m_pMaze[calcIndex(nCnt, 0)] = MMK_Wall;
		m_pMaze[calcIndex(nCnt, m_nYSize - 1)] = MMK_Wall;

	}

	for (nCnt = 0; nCnt < m_nYSize; nCnt++) {
		m_pMaze[calcIndex(0, nCnt)] = MMK_Wall;
		m_pMaze[calcIndex(m_nXSize - 1, nCnt)] = MMK_Wall;
	}
	return true;
}

MMKind	CMazeMatrix::GetAt(int nXPos, int nYPos)
{
#ifdef _DEBUG
	if (nXPos < 0 || nXPos >= m_nXSize ||
		nYPos < 0 || nYPos >= m_nYSize)
	{
		m_lastError = MME_SizeError;
		return MMK_None;
	}
#endif
	return m_pMaze[calcIndex(nXPos, nYPos)];
}

bool	CMazeMatrix::SetAt(int nXPos, int nYPos, MMKind kind)
{
#ifdef _DEBUG
	if (nXPos < 0 || nXPos >= m_nXSize ||
		nYPos < 0 || nYPos >= m_nYSize)
	{
		m_lastError = MME_SizeError;
		return false;
	}
#endif
	m_pMaze[calcIndex(nXPos, nYPos)] = kind;
	return true;
}

bool	CMazeMatrix::finalize()
{
	if (m_pMaze != NULL) {
		delete [] m_pMaze;
		m_pMaze = NULL;
	}
	return true;
}


//
// 迷路作成用クラス定義
//
class CMazeMaker
{
public:
	CMazeMaker();
	virtual ~CMazeMaker();

public:
	bool	Initialize(int nXSize, int nYSize);

	// 力業。ループで回す。メモリは食わない。
	// 美しくない。
	bool	Generate1();

	// 掘った箇所をスタックに積んで、掘れなくなったらスタックを戻す。
	// 綺麗だけれど、迷路のサイズを増やすとスタックオーバーフローが起こる。
	bool	Generate2();

	// Generate2をlistに置き換えたもの。
	// stdを使ってしまったのが心残り。
	bool	Generate3();

	MMError	GetLastError() {return m_lastError;}

protected:
	bool	finalize();
	bool	checkPos(int nXPos, int nYPos, int nXAdd, int nYAdd);
	int		process(int nXPos, int nYPos);
	void	dig(int nXPos, int nYPos);
	bool	makeStartGoal();
	virtual	CMazeMatrix* matrixAllocate();

protected:
	int		m_nXSize;
	int		m_nYSize;
	CMazeMatrix *m_pMatrix;
	MMError	m_lastError;
};


CMazeMaker::CMazeMaker()
{
	m_nXSize = 0;
	m_nYSize = 0;
	m_pMatrix = NULL;
	m_lastError = MME_None;
}

CMazeMaker::~CMazeMaker()
{
	finalize();
}

bool CMazeMaker::Initialize(int nXSize, int nYSize)
{
	finalize();

	m_pMatrix = matrixAllocate();

	if (m_pMatrix == NULL) {
		m_lastError = MME_MemoryAllocError;
		return false;
	}

	if (m_pMatrix->Initialize(nXSize, nYSize) == false) {
		m_lastError = m_pMatrix->GetLastError();
		return false;
	}

	m_nXSize = nXSize;
	m_nYSize = nYSize;

	return true;
}

CMazeMatrix* CMazeMaker::matrixAllocate()
{
	return new CMazeMatrix;
}

bool CMazeMaker::finalize()
{
	if (m_pMatrix != NULL) {
		delete m_pMatrix;
		m_pMatrix = NULL;
	}
	return true;
}


// スタート位置と、ゴールの位置を作成。外壁部分に穴を開ける。
// 今回のアルゴリズムでは、外壁のすぐ内側が通路になっていないことがあるので
// その場合には箇所を移動させる。
// どこをとっても通路が見あたらない場合には、エラーとする。
// (乱数の発生具合がとても意地悪な場合を考えると、可能性は少なくとも0ではない。)
//
bool CMazeMaker::makeStartGoal()
{
	// スタート地点を左の壁の上の方に
	int nCnt = 0;
	for (nCnt = 1; nCnt < m_nYSize - 1; nCnt++) {
		if (m_pMatrix->GetAt(1, nCnt) == MMK_Space) {
			m_pMatrix->SetAt(0, nCnt, MMK_Space);
			break;
		}
	}
	if (nCnt == m_nXSize - 1) {
		return false;
	}

	// ゴール地点を右の壁の下の方に
	for (nCnt = m_nYSize; nCnt > 0; nCnt--) {
		if (m_pMatrix->GetAt(m_nXSize - 2, nCnt) == MMK_Space) {
			m_pMatrix->SetAt(m_nXSize - 1, nCnt, MMK_Space);
			break;
		}
	}
	if (nCnt == 0) {
		return false;
	}
	return true;
}


// 現在位置nXPos, nYPosからみて、nXAdd、nYAddを足した位置に移動できるかをチェック
// 移動先が埋まっている状態で、さらに三方が通路以外に覆われているなら、OKとする

bool CMazeMaker::checkPos(int nXPos, int nYPos, int nXAdd, int nYAdd)
{
	if (m_pMatrix->GetAt(nXPos + nXAdd, nYPos + nYAdd) != MMK_Filled) 
		return false;

	if (nXAdd == 0) {
		if (m_pMatrix->GetAt(nXPos - 1, nYPos + nYAdd * 2) != MMK_Space &amp;&amp;
			m_pMatrix->GetAt(nXPos    , nYPos + nYAdd * 2) != MMK_Space &amp;&amp;
			m_pMatrix->GetAt(nXPos + 1, nYPos + nYAdd * 2) != MMK_Space &amp;&amp;
			m_pMatrix->GetAt(nXPos - 1, nYPos + nYAdd ) != MMK_Space &amp;&amp;
			m_pMatrix->GetAt(nXPos + 1, nYPos + nYAdd ) != MMK_Space)
		{
			return true;
		}
	} else {
		if (m_pMatrix->GetAt(nXPos + nXAdd * 2, nYPos - 1) != MMK_Space &amp;&amp;
			m_pMatrix->GetAt(nXPos + nXAdd * 2, nYPos    ) != MMK_Space &amp;&amp;
			m_pMatrix->GetAt(nXPos + nXAdd * 2, nYPos + 1) != MMK_Space &amp;&amp;
			m_pMatrix->GetAt(nXPos + nXAdd , nYPos - 1) != MMK_Space &amp;&amp;
			m_pMatrix->GetAt(nXPos + nXAdd , nYPos + 1) != MMK_Space)
		{
			return true;
		}
	}
	return false;
}


static const int moveInfo[4][2] = {
	{-1, 0},
	{0, -1},
	{1, 0},
	{0, 1},
};

int CMazeMaker::process(int nXPos, int nYPos)
{
	int digCount=0;
	int aryMove[4] = {0};	

	if (m_pMatrix->GetAt(nXPos, nYPos) != MMK_Space) {
		return 0;
	}
	while (1) {
		int nMoveCount = 0;

		for (int nCnt = 0; nCnt < 4; nCnt++) {
			if (checkPos(nXPos, nYPos, moveInfo[nCnt][0], moveInfo[nCnt][1]) == true) {
				aryMove[nMoveCount] = nCnt;
				nMoveCount++;
			}
		}
		if (nMoveCount == 0) {
			break;
		}
		
		int nMove = ((rand() >> 1) % nMoveCount);
		nXPos = nXPos + moveInfo[aryMove[nMove]][0];
		nYPos = nYPos + moveInfo[aryMove[nMove]][1];
		m_pMatrix->SetAt(nXPos, nYPos, MMK_Space);
		digCount++;
	}
	return digCount;
}


bool CMazeMaker::Generate1()
{
	// 開始点は1, 1から。(ループの先頭
	m_pMatrix->SetAt(1, 1, MMK_Space);

	::srand((unsigned int)time(NULL));
	
	int nXCnt;
	int nYCnt;

	for (nXCnt = 1; nXCnt < m_nXSize - 1; nXCnt++) {
		for (nYCnt = 1; nYCnt < m_nYSize - 1; nYCnt++) {
			while (process(nXCnt, nYCnt) != 0) {}
		}
	}
	return makeStartGoal();
}


void CMazeMaker::dig(int nXPos, int nYPos)
{
	m_pMatrix->SetAt(nXPos, nYPos, MMK_Space);

	int aryMove[4] = {0};	

	while (1) {
		int nMoveCount = 0;

		for (int nCnt = 0; nCnt < 4; nCnt++) {
			if (checkPos(nXPos, nYPos, moveInfo[nCnt][0], moveInfo[nCnt][1]) == true) {
				aryMove[nMoveCount] = nCnt;
				nMoveCount++;
			}
		}
		if (nMoveCount == 0) {
			break;
		}
		
		int nMove = ((rand() >> 1) % nMoveCount);

		dig(nXPos + moveInfo[aryMove[nMove]][0], nYPos + moveInfo[aryMove[nMove]][1]);
	}
}

bool CMazeMaker::Generate2()
{
	::srand((unsigned int)time(NULL));
	int nXStart = ((rand() >> 1) % (m_nXSize - 2)) + 1;
	int nYStart = ((rand() >> 1) % (m_nYSize - 2)) + 1;
	dig(nXStart, nYStart);
	return makeStartGoal();
}

struct PosInfo {
	int xPos;
	int yPos;
};

bool CMazeMaker::Generate3()
{
	::srand((unsigned int)time(NULL));
	int nXStart = ((rand() >> 1) % (m_nXSize - 2)) + 1;
	int nYStart = ((rand() >> 1) % (m_nYSize - 2)) + 1;

	m_pMatrix->SetAt(nXStart, nYStart, MMK_Space);

	list<PosInfo> posList;

	PosInfo info = {nXStart, nYStart};
	posList.push_back(info);

	while (posList.size() != 0) {
		int nXPos = (posList.rbegin())->xPos;
		int nYPos = (posList.rbegin())->yPos;

		int aryMove[4] = {0};	

		int nMoveCount = 0;

		for (int nCnt = 0; nCnt < 4; nCnt++) {
			if (checkPos(nXPos, nYPos, moveInfo[nCnt][0], moveInfo[nCnt][1]) == true) {
				aryMove[nMoveCount] = nCnt;
				nMoveCount++;
			}
		}
		if (nMoveCount == 0) {
			posList.pop_back();
			continue;
		}
		
		int nMove = ((rand() >> 1) % nMoveCount);

		info.xPos = nXPos + moveInfo[aryMove[nMove]][0];
		info.yPos = nYPos + moveInfo[aryMove[nMove]][1];

		m_pMatrix->SetAt(info.xPos, info.yPos, MMK_Space);

		posList.push_back(info);
	}

	return makeStartGoal();
}

//
// コンソール出力用
class CMazeMakerConsole : public CMazeMaker
{
public:
	CMazeMakerConsole(){};
	virtual ~CMazeMakerConsole(){};

public:
	void Output();
};

void CMazeMakerConsole::Output()
{
	for (int nYCnt = 0; nYCnt < m_nYSize; nYCnt++) {
		for (int nXCnt = 0; nXCnt < m_nXSize; nXCnt++) {
			if (m_pMatrix->GetAt(nXCnt, nYCnt) == MMK_Space) {
				printf(".");
			} else {
				printf("#");
			}
		}
		puts("");
	}
	_getch();
}

// 
//
int _tmain(int argc, _TCHAR* argv[])
{
	CMazeMakerConsole maker;

	do {
		if (false == maker.Initialize(75, 50)) {
			puts("Initialize Error");
			return 0;
		}
	} while (false == maker.Generate3()); //失敗するのは、スタート、ゴールが作れなかった場合。偶然そういうことになることもあるので、そうなったら作り直す。


	maker.Output();

	return 0;
}

最初に昔の記憶を頼りにCMazeMaker::Generate1()を作ったけれど、美しくなかったのでGenerate2()を作成。迷路のサイズを増やすとスタックオーバーフローになるので、Generate3()を作成。一応、満足。

###########################################################################
.....##...#.#.##.....##......#....#...#.#.#.........#.##.........##.#.....#
#.#.##..#.#......###..###.##.#.##.#.###...#.#####.#....##.######....##.##.#
#.#..##.#.#.##.###.##.....##...#....#...#.....##..#.##.#..##...####..#..#.#
#.##..###.#..#..##..###.#..###.#.####.###.#####..####..#.##..#....##.##.#.#
#..##.....##.##..##...#.##..#######...#.#.#...#.##....##.#..###.#..#.##.###
#.####.#####.###.###.##..####.......###.###.#.###..##.#..#.##...##.#..#...#
#....###......#..#.#....##....########..##..#..#..#####.######.##..##.##.##
#.##..##.######.##...####..#####....#..##..###.#.##.##..#......#..###..#..#
#..##.#...##....#..#.#..#.##.#...#.##.##..##.....#.....####.####.##.##.##.#
##..#...#..#.#######...##....#.#####..#..#########.##.##.#..##...##..#....#
###.########.##...##########.#...##..##.##.##...####..#....##..###..#####.#
#.#..##...##..#.#.....##.....##.##..##..#...###.#.#..###.####.##...##.....#
#.##.#..#..##.#.#####.#..#####..#..##..##.#.....#...##.#.#....####.#..#####
#..#.#.###.#..#.....#...##.....##.##..##..##.##.#.###....####.#.#..#.###..#
#.##.#.##....######.########.###..#..###.##..#....#.##.#...#..#...##...##.#
#..#.#..###.##.#....#..#.....##..###..#...#.#######....#.#.#.##.#.####.##.#
##.#.##.##...#.#.#####...#####..##.##.##.##......#####.###.#.#..#..#.#..#.#
##....#..###...#....#..#.....#.##...#.#...#.#.##.....#..##.#...###...##...#
#..#####...########.####.##.##....#...#######..#####.####..#####.########.#
#.##.#.###..#.....#....###...###########...###..##...#....##.........##...#
#..#....###...#.#.####..#..#.....#.#.....#..#..##..###.#.##..#######.#..###
##.####...#######...###.##.#.###.#...######.####..##...#.#..##...#...#.##.#
#....####...#...###...#..#.#..####.#....#.....#..##..#.###.##..#.#.###.#..#
####...#..#.#.#..####.##.####......####.#####.##..#.##...#..####.#.#...#.##
##.###.#.##.#.##.#.#...#....##.######.#.##..#.###.######.##...#..#...###..#
#..##..#.####.##.#...#.####..#........#..##....##...##....###...######...##
#.##..##..##..#..##.####..##.#.######.##..####..#.#..##.###.#.#..#.##..#..#
#.##.####.#..##.##..##...###.###...#...##.##.##.####.#..#...####.#..#.###.#
#.#...#...#.###..##..#.#...#..#..#...#..#..#.##..##..#.##.#..##..##.#...###
#...#...#.#...##..##...#.####.####.#######.#..##.#..##..#.##..##..#...#...#
#.###########.###..#####....#...##.#..#....##..#...####.#..##..##.#######.#
#....#....##..#.##....###.#####..#...##.######.#####.##.##.###....#.....#.#
###.##.#.##..##..####..#..#...##.###.##......#...##.....##..########.##.#.#
#.#.#..#..#.####.#..##...##.#.#..#....######.#.#....#.#..##.#...##...#....#
#...#.###...#......####.##..#...###.###...##.#.######.#.##..#.#..##.####.##
#.#.#.#.#####.###.##....#..######.#.##..#..#.#..#.....#..##...##.#...#....#
#.###.#...##...#..#..####.##.#.##.#.#..##.##.##.#.###.##..######.#.#.####.#
#..##.#.#..#.#.####.###.#..#......#...#####..#..#...####.##..#.#.###.##...#
##..#...##.#.#.#........##.#.#.#.####..#....#######..##...##...#..#...###.#
###.######.#.#...####.#..#.#.###.#..##.#.####....###..###..##.###.###...#.#
#...#...#..#####...##.####.#..#....##..#..#...##...##...##......#..####.#.#
#.###.#...##...#####..##...##.#.##.#..###.#.######..##.###########.#....#.#
#..#..##.##..#.#...#.##..######..###.##.#....###.##.##...#.......#.#.#.####
#.##.###..#.##...#.###..##....##........#.##..#...#..#.#.#.###.#.#.###....#
#..#...##.#..#####..##.####.#.##.############...#.##.#.#.#...#.###..##.##.#
##.###..###.##...##.#..#....#..###....##....#######..#.###.###...##..###..#
#...###..#...##.###.#.##.#####...#.##.#..##.#...#...##..#...###.####.#...##
#.#...##...#......#......#.....#...#....##....#...#..##...#...#........#...
###########################################################################

ちなみに http://anond.hatelabo.jp/20070711194709 これを聞いたのは自分。

かなりたくさん書けることがわかりました。

2007-03-25

linuxユーザのためのエロ動画DLツール

yourfilehostぶっこぬき

http://www.yourfilehost.com/media.php?cat=video&file=hogehoge.wmv

こんなのからhogehoge.wmvダウンロードするためのrubyスクリプト

これをbukkonuki.rbとして保存する

require 'rubygems'
require 'scrapi'
require 'open-uri'

yourfilehost_src = Scraper.define do
  process "embed", :src => "@src"
  result :src
end

ARGV.each do |uri|
  p system "wget", yourfilehost_src.scrape(URI.parse(uri))
end

こんな感じで使うとDLしてくる

ruby bukkonuki.rb "http://www.yourfilehost.com/media.php?cat=video&file=hogehoge.wmv"

複数指定してもDLしてくる

ruby bukkonuki.rb "http://www.yourfilehost.com/media.php?cat=video&file=hogehoge.wmv1" "http://www.yourfilehost.com/media.php?cat=video&file=hogehoge.wmv2"

ruby初心者には大変だった。

半日かかったぞ…ふざけやがって

 
ログイン ユーザー登録
ようこそ ゲスト さん