Четирите книги

Колко книги може/трябва да чете човек едновременно (или поне колко ми се иска на мен да чета)? Засега бройката ми е четири:

  1. Една книга за самоусъвършенстване (как да съм по-здрав, по-умен, по-концентриран и т.н.), изобщо все неща за „хардуера“ и „фърмуера“ ми.
  2. Една за програмен език/технология/инструмент. Колкото повече време минава, толкова повече си заобичвам попрището и се чувствам неприятно когато нещо се омаже по моя вина. Затова, повече познания/умения/обща култура.
  3. Една книга „за възрастни“. Кой съм аз? Защо съм? Ще повторя ли грешките на хората преди мен? Ще създам ли собствени грешки, които да не повтарят тези след мен? И т.н., и т.н., и т.н.
  4. Една книга „за деца“. Една истинска книга, която да ти помогне да станеш по-добър човек, когато порастнеш. Защото растем докато не си отидем и защото винаги можем да ставаме по-добри.

Не успявам да се боря и на четирите фронта. Не успявам да ставам хем по-добър човек (ако успявам изобщо), хем по-успешен „занаятчия“ (ако успявам изобщо). Пиша тези думи тук, за да ги направя публични по някакъв начин, за да се опитам да застана зад тях и да продължа напред. И може би, поне може би, ще мога да съм малко добър след време, когато (ако изобщо) се върна към тях.

SICP Study Group, Weeks 4 & 5

I don’t know where to start…

First of all, I must say that this is one of the most interesting books on programming I’ve ever read. (and yes, I haven’t read so many books on programming, for now) In the last few days I constantly go to bed around 3:00 am, (it’s 1:30 am, as I’m writing this). I’m getting worried, that I may end up in an asylum, muttering „cadr“, „cdadr“, „cddar“, and so on, which the doctors will take for some kind of ill-spoken obscenities, and will put me to sleep with… Wait, what? Yes, it’s that worse.🙂

I’ll start the sensible part of this post with my „infrastructure changes“, which I made during the last week. I’m finally using tests! I used this library, and switched to GNU Guile as a Scheme implementation. This shouldn’t be a problem, since I’m not using anything specific. I should mention that Guile tends to have somewhat tight constraints on it’s stack size, since I encountered twice „STACK OVERFLOW“, when I tried to run recursive versions of „sum“ and „accumulate“ with larger volumes of data. The iterative implementations work fine, but I will search for a way to increase the stack size.

One of the ways the tests show their usefulness is that they remove the testing from the source file with the solution, leaving much more clean code there. The other one is the easier refactoring, of course. It’s a win-win all the way, so I recommend them to anyone, that has at some previous experience with Scheme. I also wrote a simple Emacs LISP after-save-hook, that runs the tests (if any) for an exercise after each save. I also tried to abstract it as a separate function, that could be attached to a key combination, and I failed, but I’ll launch another offensive on my Emacs soon.🙂

And for the tiny list of interesting stuff, that can be found in the exercises of Chapter 2:

  • cons, car and cdr can all be expressed as simple procedures, as shown in ex. 2.4. Stefan showed a problem here – how can we define pair? to work with this implementation?
  • I knew from before, that we can encode pairs of positive integers with positive integers (ex. 2.5), but is was fun to do a simple implementation of the idea in Scheme. It reminded me of the university course of Computability and Complexity, where we used this idea to encode programs for Registers Machines with single numbers. (like, the number (228234 + 217532) can represent a program, that takes two numbers and finds their average.) It was one of the most interesting courses I’ve ever attended.🙂
  • If the previous two where not enough, you get Church Numerals (ex. 2.6). I’m curious how one can implement comparison of Church numerals.
  • Practically all the exercises in 2.2.3 were very contenting, although most of them were „fill the missing function in the slots“, it was like learning to ride a bicycle, with stabilizing wheels.🙂

There are other interesting things, of course, but I’m tired and it 2:30 AM now. So, as a compensation, here is a link with resources on Scheme – http://www.math.bas.bg/bantchev/place/scheme.html The entire site is worth checking, if you are interested in programming languages and have free time.

Happy Scheming!🙂

SICP Study Group, Week 3

Chapter 1 is over!🙂

It was loads of fun at the end – higher-order functions that abstract so many tedious tasks, (like repetitive application of a function, for instance), which are later used to describe so naturally ideas from numerical analysis. To me, the first chapter shows that Scheme is little, but very powerful language, and you can do so much work only with simple procedures, because of Scheme’s treatment of procedures as „first-class citizens“. The last one means, that procedures can be named, passed as arguments to other procedures and returned as results from other procedures. (They may also be part of data structures, but we won’t see it until somewhere in Chapter 2).

A brief look through the things I found most interesting:

  • „average-damping“ (ex. 1.36) is some kind of sorcery, that will speed up your searching for fixed-points of functions. Neat!
  • There may be worse things then Ackerman’s function – I evaluated the expression ((double (double double) inc) 5)
    (ex. 1.41) by hand, because we did it this way back with my first SICP Study group. Now I feel more confident in my understanding of the applicative-order evaluation.
  • „accumulate“ (ex. 1.32) is very useful abstraction – it goes beyond simple accumulation of numbers, and can be used for accumulation of other objects, like in my third solution of ex. 1.43 – (define (repeated f n) (accumulate compose id (lambda (x) f) 1 inc n)), where compose is from ex. 1.42, and id is the „identity“ function (id(x)=x).  I found this both simple and cool.🙂

But some unfinished exercises remain – we are still struggling with the time complexity of the procedures in ex. 1.14 and 1.20,  I still haven’t managed to make sensible improvements to the ex. 1.23 and 1.28, and there are a few other obstacles left. At least for the first, I hope that we will come up with something at our next meeting.

I can’t wait to play with the data abstractions, that wait ahead!

SICP Study Group, Week 1 & 2

Since I failed to write something last week, here are the last two weeks, combined:

To begin with, I find the book extremely interesting and motivating. The authors talk of programming as a craft, even an art, to some extent. You get the feeling that you, as a programmer (or to-be-programmer) are part of something bigger, that stretches back to the first mathematicians. There are beautiful metaphors („the spirit, that lives in the computer„), and interesting quotes („I think that it’s extraordinarily important that we in computer science keep fun in computing...“, Alan Perlis). Fun is the word. ☺

The first chapter teaches us about „Building Abstractions with Procedures“. So we tackled a lot with procedures, the processes they generate, and their orders of growth. The little downside is that only with procedures you cannot make very interesting examples and exercises (with a few exceptions, mentioned below), so there is lots of mathematics in the first chapter. Not to be considered as a bad thing, but it gets pretty tedious after a while.

A few years ago I participated in another  SICP study group, although we didn’t label ourself with such fancy names back then. ☺ The experience there was quite different. First, we had a teacher, who was profound in Scheme and in programming in general. Second, he had composed lectures, and guide us carefully through each one. Third, we had diverse backgrounds and hadn’t attained courses in university-level mathematics, which is somewhat required for the material. So our teacher swapped some of the examples and exercises in favour of more intelligible ones.

This time all the participants have studied Computer Science, or Informatics, so we all have some understanding of Calculus, Numerical Analysis, Abstract Algebra, etc. We are going through each exercise, be it some mathematical proof, or some other task, that does not require coding. Also, we are moving very fast through the material, because we are able to understand most of it on our own. The approach is different from my last experience, but I feel that it works equally well for me.

Anyway, here are some things, that I found interesting during the last two weeks:

  • Ackerman’s function (ex. 1.10)! We still can’t think of a real-world application of this beast (except as an example in the courses on Computability and Complexity, of course ☺)
  • Invariant quantity (ex. 1.16). Actually, I can’t recall the last time I used this technique somewhere (if I ever used it anywhere), except in the previous course on SICP. It was very contenting to find the solution for this one, although I’m ashamed to admit that it took me nearly an hour. ☺
  • You can find the n-th Fibonacci number in logarithmic number of steps (ex. 1.19). This is awesome! Alas, I already knew it and couldn’t experience the same bedazzlement once again. ☺
  • It’s very fun to tackle with the order of evaluation of arguments (ex. 1.5, 1.6 and 1.20). You can see that in normal order evaluation some procedures work as expected, while in applicative order they fall into infinite recursion. Yet, functions with a constant space complexity can become functions with linear space complexity, if they are evaluated in normal order. Awesome! ☺
  • Fermat test and Carmichael’s numbers. (ex. 1.27) Curious stuff from Number theory.
  • Higher-order functions are very fun. (ex. 1.32, 1.33). I enjoyed watching how tedious sums and products become simple one-liners.
  • You can do miracles with Unicode! 😃

Aside from the fun and curious stuff, I also encountered some not-so-funny issues, which have nothing to do with the book, but more to do with me:

  • Time management. I encounter difficulties with this since high-school. So as of yesterday I started using the Pomodoro Technique. For now, I just strive to develop the habit of focusing on some task (like this post) for 25 minutes and tracking the number of pomodoros, which is fun and contenting, so I think this will help me. Also, I am finally stimulated to stop staring at my screen every 25 minutes, to stand up and stretch a little. This is bliss! ☺
  • My written English is not very good, which is normal, since I don’t practice it very much. These posts are a chance to do it, and that is the reason I’m writing in English. The lack of experience takes it’s toll. First, I spend most of the time trying to remember (or find) specific words. I’m through my fourth pomodoro for this post, which is too many, I fear. Second, I don’t want to imagine what my style will look to some more profound than me. I probably look like some archaic, snobbish illiterate. I’m pretty decent writer in my native language, so such thoughts are almost painful. But everything will get better with time.
  • Talking of style, I must do something for the commit messages in GitHub. „Add solution for exercise X.“ is not very helping, especially when I browse the repository to recall the interesting exercises. I will try to redact them as soon as possible.
  • I also didn’t manage to finish all exercises, I actually skipped few of them. This will also be corrected as soon as possible.
  • Stefan set an example by using test-driven approach in his solutions. I still can’t find the time and motivation to do the same, but this is on my TODO list, too.
  • I also felt the need to take notes while I’m doing the exercises, not days after that. Point taken.

There may be other things that I can’t remember now, so I may redact this post in a few days.

All in all, there are many benefits from the study group – both technical (abstract concepts, fun facts, etc.) and personal (self-improvement, meeting new people, exchanging ideas and so on). I’m eager to see what will come next!

SICP Study Group

I’m participating in a newly created SICP study group (discussions are in Bulgarian), in Sofia.

The point is to read the book „Structure and Interpretation of Computer Programs“ by Hal Abelson and Gerald Sussman and to do all the exercises. Great stuff!🙂

Now and then I will write here what I’ve learned from the past week’s material, what I’ve found interesting, etc. My solutions can be found at GitHub.

I’ve tried reading the book on my own many times, but I never got past chapter 2. The benefit of doing the reading and exercising in a group is that you have extra motivation to get your work done, and that there are people to help you, of course. I look forward to it with anticipation.

To be continued.

Из „Житие и страдания грешнаго Пламена”

Мнозина люде, кога достигнат зрелост наместо да се задомят и да напълнят с радост сърцата на отците си, се поддават на изкушения и поемат по черни пътища, що ги водят към жълта сграда, где има повече жица и мамещи окото светлини, отколкото топли чувства.

Зад дверите на тая сграда младите люде попадат при други, що са били в нея от предишно време, и тия [другите] са с езици гъвкави и повратливи, та всяват смут в душите на младите, карат ги да вярват в машини, що не могат да се докоснат от ръка човешка, и ги объркват с магии – събират безкрайното в шепата си, а туй, що се побира в шепа, разтеглят до безкрайно.

И тия другите карат младите да си играят с числа, да ги редят в колонки и в редички, кога им е угодно – да унищожават числата едно с друго, докато нищо не остане. Кога на младите им додее, карат ги да си играят с букви и всякакви други писмена, дорде и те не им додеят. Туй свършено, започват да учат младите на езици нечестиви, що обръщат смисъла тъй, че кога поставиш знакове не на мястото им, излиза тъй, че нищо не си казал. И тия езици се разбираха само от бездушните машини  и от людете от жълтата сграда, а за другите хора и твари бяха непонятни, и те ги не разбираха.

(евентуално) Следва продължение…

Пак за Хенди + Отговор от КЗП

Със закъснение от повече от три седмици (на главата ми бяха контролни и други простотии) сядам да съобщя, че получихме окончателното решение от КЗП. Като се започне от това:

След направения анализ и събраните доказателства, преписката беше разгледана на заседание на Комисията. Мотивите на Комисията са, че твърденията на фирма „Хенди–тел”ЕООД са, че Вие собственоръчно сте подписала договора за абонамент доброволно, като преди това са Ви били обяснени подробно всички условия на тарифен план „LOOP 5”. Вие твърдите, че Ви е било обяснено, че няма да заплащате месечна абонаментна такса за новата СИМ карта. В случая не могат да бъдат доказани твърденията на нито една от двете страни. На лице е само собственоръчно подписания договор между Вас и „Мобилтел”ЕАД чрез посредника „Хенди-тел”ЕООД

Т.е. нищо не може да се докаже, освен че приятелката ми е подписала договор. Което не е голяма изненада, всеки може да напише „Ама те ми казаха, че…“, но при липса на солидни доказателства не може да се вземе окончателно решение. Още повече, че дори и да се вземе такова, имаме друг проблем, поне по отношение на КЗП:

Съгласно разпоредбите на чл. 20а. от Закона за задълженията и договорите (ЗЗД) „Договорите имат сила на закон за тези, които са ги сключили. Договорите могат да бъдат изменени, прекратени, разваляни или отменени само по взаимно съгласие на страните или на основания, предвидени в закона”. КЗП няма правомощия да изменя, прекратява, разваля или отменя каквито и да е договори. Доколкото същият е валидно сключен, породил е правни последици и не са налице основанията, посочени в ЗЗД за унищожаване или нищожност на договора, то той може да бъде прекратен единствено по начина и при условията, указани в него.

КЗП е специализиран административен орган, който има контролни правомощия по редица нормативни актове, регламентиращи потребителската защита. Тези нормативни актове дават уредба на правата на потребителите, задълженията на търговците, съставите на административните нарушения и предвидените за тях санкции. Нормативният акт, даващ общата уредба на потребителската защита е Законът за защита на потребителите /ЗЗП/, по който

КЗП е предвидена като основен контролен орган.

Следва да поясним, че Законодателството в Република България в т. ч. и ЗЗП не предвижда възможност административните органи да могат, както да се произнасят и да предприемат мерки за въздействие върху политиката натърговските дружества /фирмите/ стопанисващи и експлоатиращи търговски обекти, така и да могат да решават спорове, като се произнесат в полза на една от страните и задължат другата да претърпи съответните последици или да извърши съответните действия. КЗП в качеството й на държавен контролен орган има вменени правомощия и оказва съдействие за решаването на възникнали спорове между потребители и търговци във връзка с гаранционната отговорност, правото на рекламация за стоки и услуги и неравноправни клаузи в договори, сключвани с потребители.

Относно искането Ви за прекратяване на сключения договор с „Мобилтел”ЕАД във връзка с неизпълнението на договора, Ви уведомяваме, че в конкретния случай се касае за гражданско-правни отношения. В конкретно изложения в жалбата случай не се касае за извършено административно нарушение от страна на търговеца, а за гражданско-правни отношения, в които административната намеса е недопустима.

Редно е да допълним също, че прекратяването, изменението, цялостното или частичното неизпълнение на договорните задължения не е въздигнато от Закона като административно нарушение, поради което същият изключва налагането на санкция. КЗП, в качеството й на административен контролен орган не разполага с правомощия да решава гражданско-правни спорове, задължавайки виновната страна да извърши някакви действия и/или да заплати неустойка или обезщетение на изправната страна.

Такива правомощия са вменени единствено и само на съдебната институция.

Казано иначе, при такива случаи Комисията за Защита на Потребителите е безсилна да помогне на ощетения потребител по какъвто и да било начин, защото това не е в нейната юрисдикция; нито пък да накаже търговеца, тъй като няма 100% сигурни доказателства, че той наистина продава услуги чрез измама.

С това излиза, че единствения ни начин да се справяме с такива измами е да научаваме за тях предварително и да се пазим много. Тъжното е, че макар че съм писал за случката в блога ми, хората стигат до него само след като също са пострадали, ако се съди по търсенията в Google, чрез които стигат до тук – „жалба мтел“, „жалба срещу хенди“, „хенди измами“ и тъй нататък. Което е абсолютно нормално, никой няма да седне да си губи времето да търси дали някоя фирма не мами клиентите си, не виждам как някой спокоен и доволен човек би седнал да търси „хенди измами“ из интернет, дори няма да му щукне такова нещо. Затова просто трябва да се говори повече за това, днес имаме социални мрежи, в които със светкавична скорост може да се предават и най-безсмислените глупости. Мисля, че с достатъчно шум по-голямата част от хората ще се научат да се пазят и преди да е станало твърде късно. Важно е само човек да има беглата идея в главата си, че може да го преметнат, когато отива да си плаща сметката, или да си подновява договора.

Просто трябва повече внимание. Добре е да се гледа съмнително да всеки „подарък“, който получавате от мобилния си оператор, най-вече защото безплатни подаръци няма. И най-важното: няма задължителни подаръци, които няма как да откажете. Чуете ли нещо подобно можете да сте почти 100% сигурни, че се опитват да ви подведат. Ако все пак ви е любопитно какъв е подаръкът и ви извадят договор го прочетете много внимателно преди да подпишете каквото и да било. Ако в него не са описани някои условия (любим номер с цел пестене на хартия, най-вероятно, ха-ха) поискайте да узнаете и тях, най-добре ги накарайте да ви ги разпечатат. В момента в който видите нещо съмнително можете спокойно да не подписвате. Същото важи и при подновяване на договор – много внимателно дали става въпрос за сключване на нов такъв, или за подновяване на стария.

И още нещо важно, ако все пак ви се случи нещо подобно, постарайте се повечето ви близки и приятели да разберат за това, за да могат поне те да се предпазят. Ще се учудите колко от нашите познати имаха същите проблеми, когато това се случи с нас. Не се притеснявайте, че ще ви се присмеят, или ще ви помислят за балами, ако някой го стори и не погледне сериозно на предупреждението ви най-вероятно някой ден ще попадне в същата ситуация. Важното е да се научава за тези неща, защото иначе оставаме на милоста на оператора (М-Тел са доста милозливи при подобни случаи, може би не искат да добавят още проблеми и лоша репутация към това, което се причинява от новата им система за отчитане…).

Мисля, че това ще е последното нещо, което ще напиша по темата. Не мога да помогна с повече, или да внеса повече яснота, в крайна сметка най-накрая всеки трябва да може да си помогне сам, никой няма да ви пусне жалбата вместо вас. И се надявам, че повече хора ще научават за проблема преди да бъдат измамени. Толкова от мен.🙂