The Blog is dead, god save the Blog!
This blog got resurrected as: https://idea.popcount.org/
This blog got resurrected as: https://idea.popcount.org/
Posted by
majek
at
10:57
0
comments
A quick bunch of fresh thoughts on Ipad (I had no experience with Iphone):
Posted by
majek
at
12:43
0
comments
I played with pretty interesting bug, or maybe a feature, in Erlang VM. Read more on LShift blog.
Posted by
majek
at
12:41
0
comments
Whatever you are using: a blog, a portal, a forum or microblogging service, search works on current set of documents.
Posted by
majek
at
19:15
1 comments
It's time to undust this blog a bit. Here is the list of my recent posts on LShift blog, with a word of comment:
Posted by
majek
at
17:55
1 comments
I just spent more than an hour trying to buy a thing from Ebay. I'm really pissed off. In short words: Fuck you ebay.
So the story goes like that:
Dear Ebay, I just wanted to buy a thing. I don't care about paypal or ebay accounts, and I already have forgotten passwords. I don't care if you have my addresses (every one of three I used), I feel silly when you ask me for the date of birth.
One more thing, requiring me to give you my credit card details seven times doesn't increase my confidence in the security of your system.
Posted by
majek
at
01:16
0
comments
For some time I'm trying to hack together a prototype of real-time-full-text-search-engine (RTFTSE!). I used a memcached-binary protocol as a communication protocol between backends and storage-nodes.
This is a pretty nice protocol and in fact there are strong reasons not to use ascii memcache protocol.
Posted by
majek
at
16:38
0
comments
My favorite syscall today:
$ man 2 readahead
"readahead() populates the page cache with data from a file so that subsequent reads from that file will not block on disk I/O."
I don't really know when should I use that, but it sounds cool. Just an implementation of prefetching on yet another layer. Wait a moment...
"readahead() blocks until the specified data has been read. "
I'm lost. If it blocks, why not to just use read(2)?
Second syscall:
$ man 2 madvise
"The madvise() system call advises the kernel about how to handle paging input/output in the address range beginning at address start and with size length bytes"
"The kernel is free to ignore the advice."
I don't get when I should use it.
And the last one:
$ man 2 mincore
"mincore() returns a vector that indicates whether pages of the calling process’s virtual memory are resident in core (RAM), and so will not cause a disk access (page fault) if referenced."
Cool, I can check if my memory page is in swap. I doubt it can help me in anything. If I don't want my pages to be in swap I'll just use mlock(2)...
Probably there are dozens of strange syscalls out there!
Posted by
majek
at
13:57
3
comments
Git is the most popular DVCS right now. Google trends confirms that:
But the interesting fact is that Git is for the first time ahead of its grandpa Svn:
Though it's worrying that CVS is still alive, it should be dead ten years ago. Hopefully we can see a process of slow death, the end is inevitable:
Posted by
majek
at
16:13
3
comments
I'll be speaking about simplified Etherpad clone at QCon London on Wednesday, March 11th.
The presentation will take place at Skillsmatter stand (booth number 10), at 16:45.
Posted by
majek
at
15:54
0
comments
This time I hacked together few open source projects. The result of my work, except from few minor bugs, seems to be working.
I don't know what shall I do with this project next. There are few possible options:
Posted by
majek
at
14:52
0
comments
Posted by
majek
at
00:25
0
comments
This article about EvServer doesn't really show it as an innovative piece of software. I hope that future articles will.
It seems that the most important thing in this post is a blinking exclamation mark.
BTW, ItBlog seems to be dead. For historical reasons I placed my old posts from that blog here, here and here.
Posted by
majek
at
19:42
0
comments

Few days ago I committed a blog post about Twitter search.
As a matter of fact, I'm not sure what is the solution to the question I asked there. On the other hand I presented some interesting (at least for me) numbers.
While writing this stuff I learned a lot and maybe this blog post will be a motivation for someone to actually create such a perfect system.
I'm still thinking about the persistence layer...
Posted by
majek
at
01:02
0
comments

I committed next post on LShift's blog.
BTW. This is my 100th post in this blog!
Posted by
majek
at
18:06
0
comments
Labels: Algorithms, Asychrony, Linux

I'm really excited. After years of work Fyodor finally managed to finish The Book "Nmap Network Scanning". It should be a great gift for every security geek. You can preorder it on Amazon for 34$.
Posted by
majek
at
15:03
0
comments
$ wget http://www.apache.org/dist/incubator/qpid/M3-incubating/qpid-incubating-M3.tar.gzHmm. What’s next... No README files... After some googling I found that there’s getting stated guide. Following it this should be the magic command:
$ tar xvzf qpid-incubating-M3.tar.gz
$ cd qpid-incubating-M3/
$ cd java/brokerOkay, let’s look for the missing file somewhere:
$ PATH=$PATH:bin QPID_HOME=$PWD ./bin/qpid-server -c etc/persistent_config.xml
./bin/qpid-server: line 37: qpid-run: No such file or directory
$ find ../.. -name qpid-runNext try:
../../java/common/bin/qpid-run
$ cp ../../java/common/bin/qpid-run bin
$ PATH=$PATH:bin QPID_HOME=$PWD ./bin/qpid-server -c etc/persistent_config.xmlThat’s enough. I’m definitely too stupid to run this server and too busy to waste more time here (there is also other reason why I’m not really interested in qpid, read on).
Setting QPID_WORK to /home/majek as default
System Properties set to -Damqj.logging.level=info -DQPID_HOME=/home/majek/b/qpid-incubating-M3/java/broker -DQPID_WORK=/home/majek
Using QPID_CLASSPATH /home/majek/b/qpid-incubating-M3/java/broker/lib/qpid-incubating.jar:/home/majek/b/qpid-incubating-M3/java/broker/lib/bdbstore-launch.jar
Info: QPID_JAVA_GC not set. Defaulting to JAVA_GC -XX:+UseConcMarkSweepGC -XX:+HeapDumpOnOutOfMemoryError
Info: QPID_JAVA_MEM not set. Defaulting to JAVA_MEM -Xmx1024m
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/qpid/server/Main
Caused by: java.lang.ClassNotFoundException: org.apache.qpid.server.Main
$ python easy_install amqplibThe broker:
$ wget http://www.rabbitmq.com/releases/rabbitmq-server/v1.4.0/rabbitmq-server_1.4.0-1_all.deb
$ sudo dpkg -i rabbitmq-server_1.4.0-1_all.deb
~/amqplib-0.5/demo$ ./demo_send.py 1Most common way of using Barry’s library is to write software that only consumes data from AMQP. Use one event loop that blocks forever and when something happens on AMQP the callback is executed. I have slightly different use case. In the project I’m writing I use asynchronous programming. This means that I have one event loop that is not the AMQP event loop. I want to run AMQP stack every time something happened on a socket. This is how it would look like in pseudocode:
~/amqplib-0.5/demo$ ./demo_receive.py
while True:Qpid python client has only blocking interface, so it’s impossible to write code like that. Fortunately there’s a nonblocking client in Barry’s library. There’s even an example:
nonblocking_consume_amqp_events()
<magically_wait_for_activity_on_amqp_socket>
./nbdemo_receive.py
Traceback (most recent call last):
[...]
File "build/bdist.linux-i686/egg/amqplib/nbclient_0_8.py", line 74, in write
P' read_buf='&!amq.ctag-FC3ET7kTcqy/A93gJYQWqw==6!amq.ctag-FC3ET7kTcqy/A93gJYQWqw==myfan2
['1', '1']If the problem is with acknowledges, then one could say to use no_ack on a channel and just disable acknowledges. Sorry, this also doesn’t work.
['2', '1', '2']
['3', '1', '2', '3']
['4', '1', '2', '3', '4']
I send ten messages:While I was working at this issue I was worried that my Python process is eating more and more memory. After some debugging I discovered that amqplib has very nice memory leaks (okay, reference cycles).
['a_0', 'a_1', 'a_2', 'a_3', 'a_4', 'a_5', 'a_6', 'a_7', 'a_8', 'a_9']
Then another ten:
['b_0', 'b_1', 'b_2', 'b_3', 'b_4', 'b_5', 'b_6', 'b_7', 'b_8', 'b_9']
I receive:
['b_0', 'b_1', 'b_2', 'b_3', 'b_4', 'b_5', 'b_6', 'b_7', 'b_8', 'b_9',
'a_0', 'a_1', 'a_2', 'a_3', 'a_4', 'a_5', 'a_6', 'a_7', 'a_8', 'a_9',
'b_0', 'b_1', 'b_2', 'b_3', 'b_4', 'b_5', 'b_6', 'b_7', 'b_8', 'b_9']
def my_nb_callback(ch):
raise MException
conn = nbamqp.NonBlockingConnection('localhost',
userid='guest', password='guest',
nb_callback=my_nb_callback, nb_sleep=0.0)
ch = conn.channel()
ch.access_request('/data', active=True, read=True)
ch.exchange_declare('myfans', 'fanout', auto_delete=True)
qname, _, _ = ch.queue_declare()
ch.queue_bind(qname, 'myfans')
msgs = []
def callback(msg):
msgs.append( msg )
ch.connection.sock.sock.setblocking(False)
ch.basic_consume(qname, callback=callback)
while True:
msgs = []
<magically_wait_for_data_on_ch.connection.sock.sock>
try:
nbamqp.nbloop([ch])
except MException:
pass
unique_msgs_filter = {}
unique_msgs = []
for msg in msgs:
msg.channel.basic_ack(msg.delivery_tag)
if msg.body not in unique_msgs_filter:
unique_msgs_filter[msg.body] = True
unique_msgs.append(msg.body)
print '%r ' % (unique_msgs)
$ rabbitmqctl --helpWhich password would you like? Even if I know that, I’m not going to give any passwords away to see the help message, sorry. Next try:
Password:
$ rabbitmq-server --help
/usr/sbin/rabbitmq-server: 44: cannot create /var/log/rabbitmq/rabbit.log.bak: Permission denied
/usr/sbin/rabbitmq-server: 45: cannot create /var/log/rabbitmq/rabbit-sasl.log.bak: Permission denied
{error_logger,{{2008,11,21},{0,26,12}},"Protocol: ~p: register/listen error: ~p~n",["inet_tcp",einval]}
{error_logger,{{2008,11,21},{0,26,12}},crash_report,[[{pid,<0.22.0>},{registered_name,net_kernel},{error_info,{error,badarg}},{initial_call,{gen,init_it,[gen_server,<0.19.0>,<0.19.0>,{local,net_kernel},net_kernel,{rabbit,shortnames,15000},[]]}},{ancestors,[net_sup,kernel_sup,<0.9.0>]},{messages,[]},{links,[<0.19.0>]},{dictionary,[{longnames,false}]},{trap_exit,true},{status,running},{heap_size,377},{stack_size,21},{reductions,309}],[]]}
Posted by
majek
at
15:43
4
comments
Labels: Messaging, Performance
Few times I was pissed off by this screen:
It means that I haven't activated Vista on time and Microsoft stopped liking me. The problem is that at least two times I was caught by this screen when I haven't got access to the net. I had password to WiFi, but haven't entered it yet. When Vista is blocked you don't have access to any networking settings so the password is useless. Yet another time, because of bug in Vista I needed to reenter my windows key. Of course the easiest way to get the key is to use KeyFinder rather than waste time on searching the key. Which, in the end, would probably be somewhere online - like in MSDNAA.
Fortunetely you can easily escape from the blocked Vista. This is how you can do it. After clicking "Activate now" this screen appears:
Just choose "buy a new product key online", which would spawn a new browser window. I had Opera set as default browser, but any browser should work. The trick is to enter "c:\windows\system32\cmd.exe" as the url.
We want to run this magic program.
Next, the well known black cmd dialog should appear. We're back home :) Just enter "explorer" to run the usual windows Start menu and task bar.
That's it. You now have normal access to your computer. You can then configure wireless networks or do whatever you like.
The only problem is to remember this instructions in case you won't have access to the internet.
Posted by
majek
at
19:16
0
comments
Labels: Security
At LShift blog I wrote about simple inter process locks in Python.
Posted by
majek
at
01:40
0
comments