Coisas que precisam ser blogadas com urgência

Tava hoje fuçando as estatísticas de acesso no meu site (que quadruplicaram desde o dia 18 de dezembro, não sei porque) e achei no meio das string de buscas mais usadas:

  • nes fores speed grodd ground

Se tem algúem com a MANHA total de inglÊs é ocara que procurou por este jogo no meu site[1].

Notas

  1. ? o cara deveria estar buscando Need for Speed Underground.

--girino 15:38, 24 Dezembro 2007 (BRST)

Update

Mais coisas estronhas:

  • orgonograma da empresa representado por passaros cagando
  • escoteiro viadim
  • horrorosa mocreia apavorante gordurosa parece mais um elefante
  • dablio dablio dablio ponto baixaki ponto com ponto be eri

Sonho Esquisito

Putz,

Hoje a noite tive um sonho esquisitíssimo! Sonhei que:

Minha irmã quer entrar pra legião estrangeira

Vou contando o que me lembro...

Começou num piquenique, estávamos num campo de gramíneas meio ressecadas e arbustos retorcidos, bromélias, etc. O chão era meio rochoso e acidentado, tinha várias colinas. Se fosse pra chutar, chutaria aquelas paisagens bucólicas das regiões mediterrâneas. Dado o resto do sonho, chuto ser no sul da França... E minha irmã deixa cair um folheto da pasta dela. Curioso, fui ver o que era, e falava de provas e testes, pensei logo que era um vestibular. Mas ela logo me mostrou os homens fortinhos de uniforme militar camuflado e me disse:

Daí a pouco me vi conversando com uma instrutora/personal trainer que tínhamos contratado pra treinar minha irmã pra prova da legião. Ela me fazia perguntas cabulosas, como se eu tivesse autoridade pra decidir sobre a vida da minha irmã. Perguntou se era pra fazer o treinamento com água ou sem água (e nisso se seguiu uma longa discussão sobre os efeitos de tomar água durante o treinamento físico e se ela deve ser gelada ou não, mas não lembro bem dos detalhes), tempo de treinamento, tipo de treinamento, se era pra fazer preparação psicológica, se era pra fazer preparação pras provas teóricas (esse eu lembro de dizer que não precisava, que o fraco dela era a parte física mesmo).

No final, paramos na porta do quartel/centro de recrutamento da legião onde vários recrutas entravam para se inscrever e fazer os testes. Ali encontramos minha irmã, que não estava presente desde o momento do piquenique. E começamos a contar pra ela sobre o que discutíamos. Conversamos em francês com alguns recrutas, mas minha irmã ficou calada. Eu insisti pra ela falar em francês porque adorava o sotaque do sul da França que ela tinha[1], mas ela insistia em ficar calada. Acho que meu subconciente sabia que não conseguiria reproduzir corretamente o sotaque dela, por isso não deixou ela falar!

Acho que o sonho terminou aí mesmo, porque me virei de lado e a Lilica estava na cama, e eu espremi ela e ela esperneou e me acordou. Mas fica o registro do sonho esquisito onde minha irmã decide entrar pra legião estrangeira.

Ponderações soltas

  • Algumas semanas atrás eu conversei sobre a legião com o adestrador da Lilica,. Quando jovem ele pensou em se alistar, mas acabou optando por ficar na PM mesmo. (Ele não durou muito na PM porque não deixaram ele trabalhar com cães, que sempre foi a especialidade dele. Ele acabou virando adestrador como particular mesmo. Hoje ele é dos mais antigos adestradores de Brasília e a maioria dos adestradores mais novos fez curso ou treinamento com ele).
  • Eu andei pesquisando sobre a legião na internet mais ou menos na mesma época, isso tudo deve ter acumulado no meu subconciente.
  • Minha irmã me chamou ontem no MSN e eu estava offline.
  • A personal trainer parecia com a Lila, da maracujá, só que vestida com roupa militar camuflada.
  • Eu lembro de durante o sonho ter comentado sobre o salário do legionário ser de 2 mil euros, mas na verdade é de 1205 euros, podendo chegar a 3567 se for enviado em missões fixas no estrangeiro[2].
  • A Sede da legião hoje em dia fica em Aubagne, no sul da frança. Meu subconciente deveria se lembrar disso e por isso escolheu a paisagem mediterrânea. Acabei de descobrir que em Aubagne é só o quartel general. O centro de recrutamento, que é onde deveríamos estar fica em Nogent-sur-Marne, na região parisiense.

Notas

  1. ? Ela morou em Toulouse quando criança, por isso tem um sotaque bem diferente do meu que é de voyou de banlieue parisienne.
  2. ? salários da legião estrangeira

--girino 11:09, 20 Dezembro 2007 (BRST)

ECMAScript, Avidemux e vídeos da Lilica

Mais uma vez a Lilica fez showzinho nesse sábado. Mas sabe como é? Colocar dúzias de filminhos de 30 segundos no seuTubo é um porre, e no final ninguém vê nenhum deles. (eu ia por o vídeo no final, mas como tem um script enoooooooorme por lá, ninguém ia ver, então resolvi por ele aqui mesmo):

Vídeo da apresentação da Lilica com os comandos mais "legais".

Resolvi então "brincar" de editar os vídeos, pra fazer um videozão resumo do show todo que ficasse mais bacana. Mas que ferramenta usar????

Avidemux

Bom, de cara eu pensei no avidemux. É que tempos atrás quando procurei por um jeito de embutir legendas em vídeos no linux, eu acabei me deparando com ele (no windows eu usava o virtualdub, mas como meu notebook foi doado e eu não uso software pirata, agora estou usando o ubuntu em casa). Quem conhece o virtualdub vai gostar: é praticamente a mesma coisa, só que com uma interface mais amigável. E parece que existe pra windows também.

Em termos de funcionalidades, não chega a ser o bambambam, mas faz quase tudo. Claro que nada é de graça! Dá uma trabalheira fazer qualquer coisa nele. Mas ontem, nessa mexida toda, descobri uma coisa fantástica: Dá pra fazer scripts em ECMAScript que automatizam todo o processo de edição de vídeos!

ECMAScript

ECMAScript, pra quem não sabe, é o famoso Javascript. Quer dizer, quando roda dentro de um browser da Netscape, chama Javascript. Quando roda no IE, chama JScript, e quando roda em qualquer outro lugar chama ECMAScript. Mas é a mesma porcaria!

Scripts pro avidemux são super simples (as opções são bem limitadas) e o único inconveniente que eu achei é que eu tenho de saber o número de frames de cada arquivo com antecedência. Deve ter outro jeito, mas não achei :(. Quem quiser aprender, tem um tutorialzinho bacana em http://www.avidemux.org/admWiki/index.php?title=Scripting_tutorial.

A única coisa chata são os codecs, que pedem uns parâmetros em formatos estronhos! Mas consegui uma manha pra configurá-los: Eu crio um projeto "dummy" pela interface gráfica e mando salvar o projeto. O resultado é um script que eu posso usar como "cola" no meu. No final ficou até bacana. Dá pra otimizar ainda, mas por enquanto ficou assim:

//AD  <- Needed to identify//
 
var app = new Avidemux();
var dir = "/home/girino/Desktop/backup_foto_video/show_lilica_14_dez_2007";
var tmp_prefix = "/tmp/asdf_";
 
var silence_file = dir + "/silence.mp3";
 
var movies = new Array(
dir+"/01-cumprimenta.avi",
dir+"/02-rastejando.avi",
dir+"/03-morta.avi",
dir+"/04-urso_sem_guia.avi",
dir+"/05-urso_com_guia.avi",
dir+"/06-rolando.avi"
);
var sizes = new Array(
199,
622,
1522,
367,
406,
537
);
var images = new Array(
dir+"/slides/01-cumprimenta.png",
dir+"/slides/02-Rastejando.png",
dir+"/slides/03-Morta.png",
dir+"/slides/04-urso1.png",
dir+"/slides/05-urso2.png",
dir+"/slides/06-rolando.png",
dir+"/slides/XX-final.png"
);
 
var final_list = new Array();
var final_sizes = new Array();
var final_fade = new Array();
 
// *** functions *** //
// prepares fade out scenes
function record_temp_video(video, pos, temp, size) {
	print("**** record_temp_video begin");
	print("**here0 = " + video);
        app.load(video);
	print("**here1");
        app.clearSegments();
        for (var i = 0; i < size; i++) {
                app.addSegment(0,pos,1);
        }
	print("**here2");
        app.video.setFps1000(25000);
        app.video.codec("Mjpeg","CQ=4","8 5a 00 00 00 00 00 00 00 ");
        app.audio.reset();
	print("**here3");
        app.audio.load("MP3",silence_file);
        app.audio.codec("lame",64,12,"00 00 00 00 03 00 00 00 02 00 00 00 ");
        app.audio.normalizeMode=0;
        app.audio.normalizeValue=0;
        app.audio.delay=0;
        app.audio.mixer("MONO");
        app.audio.resample=32000;
        app.setContainer("AVI");
	print("**here4");
        app.save(temp);
	print("**** record_temp_video end");
}
 
var tmp_counter = 0
function make_movie(image, length) {
	var tmp_name = tmp_prefix + tmp_counter;
	tmp_counter++;
 
	print("*** make_movie begin");
	// makes the temp video
	record_temp_video(image, 0, tmp_name, length);
	print("*** make_movie end");
 
	return tmp_name;
}
 
function make_fade_out(movie, size, length) {
	var tmp_name = tmp_prefix + tmp_counter;
	tmp_counter++;
 
	print("*** make_fade_out begin");
	// makes the temp video
	record_temp_video(movie, size-1, tmp_name, length);
	print("*** make_fade_out end");
 
	return tmp_name;
}
 
// initializes with 10 frame fade in of first image
final_list[final_list.length] = make_movie(images[0], 10);
final_sizes[final_sizes.length] = 10;
 
var i = 0;
for (i = 0; i < movies.length; i++) {
	// title image
	print("*** i = " + i);
	print("*** images[i] = " + images[i]);
	final_list[final_list.length] = make_movie(images[i], 40);
	final_sizes[final_sizes.length] = 40;
	final_fade[final_fade.length] = 1;
	// movie
	final_list[final_list.length] = movies[i];
	final_sizes[final_sizes.length] = sizes[i];
	final_fade[final_fade.length] = 1;
	// fade out
	final_list[final_list.length] = make_fade_out(movies[i], sizes[i], 10);
	final_sizes[final_sizes.length] = 10;
	final_fade[final_fade.length] = 0;
}
 
// ends with credits
final_list[final_list.length] = make_movie(images[i], 50);
final_sizes[final_sizes.length] = 50;
final_fade[final_fade.length] = 1;
 
// now adds them all in the right order
app.load(final_list[0]);
for (i = 1; i < final_list.length; i++) {
	app.append(final_list[i]);
}
 
// appends segments
app.clearSegments();
for (i = 0; i < final_list.length; i++) {
	print("*** adding:");
	print(i + " : " + final_sizes[i]);
	app.addSegment(i,0,final_sizes[i]);
}
 
// filters
var pos = 0;
// first filter is fade in
pos = pos + final_sizes[0];
app.video.addFilter("fade",
			"startFade="+(pos-10),
			"endFade="+pos,
			"inOut=1",
			"toBlack=1");
for (i = 1; i < final_list.length; i++) {
	pos = pos + final_sizes[i];
	if (final_fade[i] == 1) {
		app.video.addFilter("fade",
				"startFade="+(pos-10),
				"endFade="+pos,
				"inOut=0",
				"toBlack=0");
	}
}
// final fade to black
app.video.addFilter("fade",
		"startFade="+(pos-10),
		"endFade="+pos,
		"inOut=0",
		"toBlack=1");
 
// save video
app.video.codec("FFMpeg4","CBR=1000000","140 05 00 00 00 00 01 00 00 02 00 00 00 1f 00 00 00 " +
                                            "03 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 " +
                                            "00 00 00 00 01 00 00 00 00 00 00 00 cd cc 4c 3d " +
                                            "01 00 00 00 0a d7 23 3c 01 00 00 00 00 00 00 3f " +
                                            "00 00 00 3f 00 00 00 00 00 00 00 00 00 00 00 00 " +
                                            "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " +
                                            "02 00 00 00 40 1f 00 00 00 00 00 00 00 00 00 00 " +
                                            "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " +
                                            "00 00 00 00 00 00 00 00 00 00 00 00 ");
 
// and audio
app.audio.reset();
app.audio.codec("lame",64,12,"00 00 00 00 03 00 00 00 02 00 00 00 ");
app.audio.normalizeMode=0;
app.audio.normalizeValue=0;
app.audio.delay=0;
app.audio.mixer("MONO");
 
// and save
app.setContainer("AVI");
app.save(dir + "/saida.avi");
setSuccess(1);
app.Exit();
 
//DEBUG
print("**** BEGIN ****");
print(movies.length);
print(final_list.length);
print(final_list);
print(final_sizes);
print("**** END ****");
 
 
//End of script

O resultado, vocês já viram lá em cima!

--girino 00:35, 19 Dezembro 2007 (BRST)

Internet Radio

Tou sumido, confesso! Agora entro de férias e devo aparecer mais um pouco por aqui. Vamos deixar por aqui então as novidades:

Pirenópolis

Semana passada fomos a pirenópolis. Fotos?

Talvez eu crie coragem e escreva uma resenha.

Internet Radio

Minha brincadeira desse final de semana foi por uma "rádio" pra funcionar na internet. Pra quem quiser ir dando uma olhada, se eu tiver online o endereço da radio é esse:

Pra quem tem menos preguiça, conto a estória completa:

Comecei tentando conectar no servidor de um colega com o [shoutcast http://www.shoutcast.com/]. Cara, já tentaram achar um cliente de shoutcast decente no linux? Eu tentei e digo: Que merda! Tentei tudo que achei. Soluções que usavam o jackd, como:

  • Internet DJ Console (Não consegui inserir arquivos na playlist, mas chegou a funcionar num dado momento usando o driver "dummy" do jackd, ou seja, os outros ouviam a radio, mas eu nao :()
  • DJPlay (que eu não consegui descobrir como mandar ele conectar)

Num dado momento, apelei. Decidi que o icecast deveria ser melhor integrado com o ubuntu, certo? Errado! Quando eu finalmente consegui fazer a radio funcionar no icecast2 (porque os clientes nativos do ubuntu nao sao compilados usando LAME, e por isso so usam ogg/vorbis) usando xmms2, descobri que quando passava de uma musica pra outra o player que tivesse conectado perdia a conexão e o ouvinte tinha de conectar de novo (é mole?). Isso já era 4 da manhã de ontem! Resolvi deixar pra hoje.

Briguei ainda um pouco pela manhã, mas sem sucesso. Quer dizer, tive sucesso. Fiz um servidor de icecast2 rodando ogg/vorbis e tudo mais, só pra descobrir que no windows ninguém tem codec ogg/vorbis instalado! Grandes meldas minha rádio né? que ninguém ia ouvir porque só o otário aqui usa linux!

Por fim, apelei: fui no site do shoutcast e, pasmem, descobri que ele tem um server e um cliente de linha de comando pra linux. Não é open source, claro. Mas funciona! Ralei um pouco pra editar os arquivos de configuração, que não são muito fáceis. Mas em 2 ou 3 horas consegui! Server e cliente rodando perfeitos. Neguim do windows e do linux (e do mac... o carlão acessou) acessando! Show de bola. Acessem aí: http://amsx.no-ip.org:8008/

--girino 22:37, 9 Dezembro 2007 (BRST)