nyuhuhuu

Posts Tagged ‘programozás’

A kódblokk szemantikus formázottságáról: behúzásról, sorigazításról

In Uncategorized on 2007.10.09. at 17.08

A minap fellapoztam a tabulátor versus szóközök használatának praktikus kérdéskörét, és örömmel konstatáltam, hogy temérdek szabadideje van a programozóknak észérvek mentén állásfoglalható problémát a végtelenségig csűrni–csavarni. A bevett gyakorlaton és történeti múltra hivatkozástól eltekintve a következő megállapításra jutottam a mintegy harminc esszé pro és kontra érveinek megemésztését követően.

Alapvetően az érintett keretrendszer, közösség, vállalat satöbbi irányelveihez, ajánlásaihoz igazítsuk indentelési konvenciónkat. Saját hatáskörön belül pedig döntsünk tetszésünk szerint – használjunk csupa szóközöket (0×20) a kódblokkok behúzására, vagy következetesen csak tabulátorokat (0×09); a kettőt viszont ne keverjük. Noha önmagában a tabulátor karakter szemantikus jelentéssel bír, tetszőlegesen testreszabható a vizsgált kód felett a behúzás mértéke, továbbá míg tabulátorral tagolt kódból bármikor tudunk csak szóközöket tartalmazó forrást előállítani (untabify), fordítva már nem volna triviális, mégis a tabra beállított editorok többsége helytelenül használja azt. Álljon itt egy példa 4 szóköz terjedelmű tabulátorral formázott C kódról:

4 szóköz terjedelemű tabulátorral behúzott és igazított kódblokk

A látszólag helyes tagolás akkor fordul visszájára, amikor a fennebbit megnyitom a saját editoromban, ahol a tabulátort 8 szóközre vettem. Az eredmény a következő, és egyúttal továbbgondolandó 2 space esetére:

8 szóköz terjedelemű tabulátorral behúzott és igazított kódblokk

The author of that source code is using TABs not only for indenting, but also for aligning! That way his alignment get’s messed up when somebody uses a different TAB size. The solution of this problem is to simply just use what ever you want for indenting, but use spaces for aligning. (TABS vs Spaces. The end of debate.)

A tab használata nem azt jelenti, hogy ugyanolyan szélességűre kell annak nagyságát vennem, mint amivel a kódot előállító programozó dolgozott, hanem hogy tetszőleges preferenciák mellett is helyesen formázott blokkokat kapok. A beszúrt példán a probléma jól felismerhető. A tabulátor az indentelés mértékét jelenti. A félbetört kódsor második felénél tehát a probléma abból fakad, hogy illegálisan sok tabot tartalmaz, holott ugyanazon a blokk szinten található, mint a kódsor eleje. Sorigazításhoz (aligning) soha ne használjunk tabot. Mindez íme szemantikailag helyesen:

4 szóköz terjedelemű tabulátorral behúzott és szóközökkel igazított kódblokk

Ez pedig már nem borítja meg eltérő konfiguráció esetén sem a kód formázottságát.

Végkifejlettként tehát megállapítható, hogy csak abban az esetben – de akkor teljes nyugalommal – alkalmazzunk tabulátort behúzáshoz, amennyiben az editorunk kellő körültekintéssel támogatja azt. Mivel sajnos elég kevés szerkesztő alapértelmezett viselkedése ilyen, és csupán a szofisztikáltabb editorokban van mód ezt a kívánalmat elérni, célszerű a szóköz alapú indentelés mellett letenni a voksot, ha másképp nincs elrendelve. Bár így vesztünk a kód formázottságának rugalmasságából, az eltérő beállítások okozta ütközéseket viszont messze elkerüljük.

Rugalmas lista szerkesztés Lispben

In Uncategorized on 2007.10.01. at 15.17

Sean tanulmányán értettem meg a dotted pair fogalmát, habár utólag visszaolvasva az Emacs kézikönyv idevágó fejezete is világosan fogalmaz. A cons cell kifejezés a Lisp belső listaábrázolásában nyer értelmet, amely a lista egy elemét jelöli: car-ból és cdr-ből áll. A car a hordozott adatra, a cdr pedig a lista következő elemére vagy nilre mutat – violá egyszeresen láncolt lista. Funkcionális szinten tehát a car a lista első, cdr pedig a maradék elemét jelöli; lévén nem más, mint egy pointer arra a listára, aminek első eleme a következő node. Common Lispben egyébként ezeket a beszédesebb first és rest függvény szolgálja.

A cons művelet tehát gyakorlati viselkedésétől eltekintve valójában az argumentumként kapott car és cdr párost adja vissza cons cellként. Tehát a (cons 'a nil) olyan listát formál, amely első eleme az a atomot hordozza, és láthatóan cdre-je nil, tehát következő elem nincs. A dotted pair akkor lép színre, amikor a cons cell cdr-je nem listára mutat, hanem szintén egy atomra. Lispben ez olyan annyira bevált módszer lett, hogy az eddigi (cons 'a 'b) konstrukció helyett bevezették a tisztább (a . b) jelölést. Ha egy cons cell utolsó eleme lehet pointer atomra, a kapcsolt pár (dotted pair) segítségével könnyen körkörösen láncolt listát képezhetünk a lineárisan láncolt listánkból.

(setf list '(a b c))
(setf (cdddr list) list)
=> (a b c a b . #2)

Beleírtam a Lispet az “A1″ mezőbe.

Learning time: 306 min, 16 sec

In Uncategorized on 2007.09.06. at 22.31

Amikor először ismerkedtem a Pythonnal, emlékszem, főképpen azt szerettem benne, hogy egyből tudtam kisérletezni, a Mindentudó Python valamennyi feladványát rögvest ki tudtam próbálni, kommunikálni tudtam az interpreterrel, interaktív módon. Most ugyanezt érzem a Lisppel.

Példa deep-remove függvény a Lisp kurzusból

Anno tett fogadalmam teljesítésén nagyon lendített az a momentum, amikor feliratkoztam a Lisp Course-ra. Tény, hogy az Emacs kéznél van, ha a Lisp kifejezéseket szeretném gyakorolni, mindemellett az ELM Adaptive Remote Tutor-hoz fogható zseniális távoktató keretrendszert még nem láttam.

A kiválóan szerkesztett tananyagra épülő modulok végét eleinte teszt jellegű, majd konkrét kód formájában megválaszolandó feladványok zárják, amelyeken megfelelő szintet elérve léphetünk csak a következő fejezetre. A hibásan definiált programkódoknál precíz támpontot kapunk arra nézve, milyen kifejezésnél vétettünk hibát, milyen logikai tévedés mentén hasal el a deklarált függvény.

Az egyes leckék anyagaihoz megjegyzéseket fűzhetünk, bármikor lehetőség van a kurzus pihentetésére, feladatsorok megoldásánál igénybe vehetjük a témába vágó nyelvi elemek, függvények pontos referenciáit, végezetül csupán gyakorlásképpen bármikor rendelkezésünkre áll egy [webes] Lisp értelmező.

Ideas first introduced in Lisp include the if/then/else construct, recursive function calls, dynamic memory allocation, garbage collection, first-class functions, lexical closures, interactive programming, incremental compilation, and dynamic typing. (Peter Seibel: Practical Common Lisp)

A Lisp Course-ra jelentkezés ingyenes. Az oktatócsomag hat részre tagolódik, kezdve a Lisp primitívjeivel, nevezett atomok, s-atomok, listák, majd predikátumok, logikai és vezérlési szerkezetek, alapvető funkciók, végül különféle rekurziók sít. A beépített statisztika modul bizonysága szerint 5 órát töltöttem a rendszerben, míg a teljes tananyagot elsajátítottam. A megkérdezettek 91%-a szerint érdemes Lispet tanulni.

On-the-fly JavaScript syntax checking in Emacs

In Napló bejegyzések on 2007.08.24. at 22.08

I will take you through the following steps in order to get on-the-fly spell checking in your Emacs with flymake-js while coding JavaScript.

Flymake-js showing error message

Tovább ehhez a bejegyzéshez »

Loading Google Analytics dynamically on document load

In Napló bejegyzések on 2007.08.05. at 14.37

The following method is out-of-date. Better check the anwsers for the Stack Overflow question ‘How do I dynamically load Google Analytics JavaScript?’ for up-to-date instructions.

According to the Google Analytics Help Center, the tracking code segment of your Analytics website profile must be added into the bottom of your content, immediately before the </body> tag. Sure you remember those days when you were told to put it in the <head>, and to many people’s astonishment when Analytics had an outage of its service loads of websites were just loading and loading while the user were getting no response – kinda new shade of screen death.

Gluing a remote functionality of your website with JavaScript and handling it by your document load event handler ain’t a scrapped idea as Analytics tracking itself stands of a remote JS call. Then why to take risks?

The base functionality of a web application heavily based on JavaScript may require that the whole content, or at least the DOM to be loaded. If Analytics remains still embed in the HTML code another outage would obstruct the running of your JavaScript code attached to document or DOM load event hence breaking down your app. So how to separate essential functions from remote web statistics?

There are several ways to load and call Analytics on document load. In the following example I use Scott Andrew’s great addEvent wrapper to handle event attaching.

Tested under Internet Explorer, Mozilla compatibles and Opera. May not work under certain versions of Konqueror and Safari. To address this issue you can use delayed function call.

Function loadGA is responsible for loading the remote Analytics API. After browser responsed the proper status, we call callGA, which create another script container using DOM methods, which forces browser to run its content.

function callGA() {
    var s2 = document.createElement('script');
    s2.setAttribute('type', 'text/javascript');
    s2.text = '_uacct="UA-xxxx-x"; urchinTracker();';
    document.getElementsByTagName('body').item(0).appendChild(s2);

}

function loadGA() {
    var s1 = document.createElement('script');
    s1.setAttribute('id', 'googleanalytics');
    s1.setAttribute('src', 'http://www.google-analytics.com/urchin.js');
    s1.setAttribute('type', 'text/javascript');

    addEvent(s1, 'readystatechange', function () {
	    if ((s1.readyState == 'complete') || (s1.readyState == 'loaded')) {
		callGA();
	    }
	});

    addEvent(s1, 'load', callGA);
    document.getElementsByTagName('head').item(0).appendChild(s1);
}

addEvent(window, 'load', loadGA);

A pro of this method is that allows further refinement of your logic – e.g. you can now serve different Analytics code depending on the protocol if you use secure channel.

And that’s all, folks. Comments are welcome at DZone.

Web Konferencia 2007.programfüzet.publish()

In Uncategorized on 2007.02.22. at 15.37

A Lisp kódok hadát némileg félretéve örömmel jelenthetem be a már korábban meghirdetett Magyarországi Web Konferencia 2007. évi állomását. A minap közzétett programfüzet híven tükrözi a rendezvényen felmutatott a PHP Konferencia-sorozat óta egyre szélesedő technológiák halmazát. Idén az Xdebug eszközt bemutató előadásom mellett az elmaradt Workshop 2.0-ra szánt, a Django AJAX-os oldalát taglaló prezentációmat is lehetőségem nyílik a Web Konferencián a Google Web Toolkittel felhízlalva bemutatni az érdeklődőknek.

A rendezvény látogatása díjtalan, még meg nem nyitott, előzetes regisztrációhoz kötött.

Az újévben Lispet fogok tanulni

In Uncategorized on 2007.01.10. at 13.30

Az újévi fogadalmak babonáját nem érzem magaménak, noha szakmai vonatkozásában mindenféleképpen érdemes elgondolkodnia az embernek azon, merre szeretne tovább fejlődni, az aktuális trendek, technológiai újdonságok mezején merre szeretne haladni, milyen területekkel kíván az újévben megismerkedni, amelyek elősegítik az adott szakterület iránti érdeklődés fenntartását, javítja a munka morált, továbbá a sokat hangoztatott tudás alapú társadalomban is segíti mindazon szellemi tőke felhalmozását, amely versenyelőnyhöz juttat minket a piacon. Meg egyáltalán, aki nem élvezi a munkáját, minek dolgozik benne?

Debasish Ghosh napokban publikált Why I should learn Lisp írása ösztönzött arra, hogy hosszabban elgondolkodjam az elmúlt év és az előttem álló újabb több száz nap lehetőségein. Az ahány nyelv, annyi ember tökéletesen illeszkedik (exact match, lól) a programozási nyelvek világára is, többek között ennek és Bártházi András Rails iránti lelkesedésének apropóján határoztam el, hogy magamévá teszem a Rubyt. Ebből az elhatározásból végül Java és JavaScript kódok szorgos írása lett, emellett pedig céges munkáim során a shell szkript programozásban is bőséges gyakorlatot szereztem. Az újévre terveim mindenek előtt a Ghosh által is érintett Lisp megismerése, a GWT és Pyjamas haladó alkalmazása, továbbá tudásom mélyítése valamennyi Google technológia kapcsán. És neked?

Szerkesztőségünk fennebbi terveihez kapcsolódó valamennyi könyvbeli felajánlást szívesen fogadja!

Illusztráció: Dr. Eick, Artificial Intelligence Programming

Iterating a JavaScript array the safe way

In Napló bejegyzések on 2006.09.29. at 16.32

JavaScript itself does not provide a control structure to loop through an array (e.g. foreach in Perl or PHP), you may use the for statement to iterate over all elements of an array. (Notice that JavaScript does not support named keys with arrays thus use Object instead.)

The for … in statement is a special case of the for statement. It is used exclusively to walk through arrays and objects. In the case of arrays, it allows you to step through each array element. [...] The benefit of this statement is that to you would otherwise have to determine the number of elements in an array or object before you could use a for statement.

As Peter L. Kantor in JavaScript: Iteration writes just simple iterate the array with for ... in statement and there you are. In the most cases it works but there is a lion in the way. When you define methods to the Array object itself, although array.length will not count them, they will appear inside the for ... in statement. You may test this behaviour easily with Firebug.


>>> Array.prototype.toJSONString = function() {}
>>> var arr = [];
>>> arr.length
0
>>> arr[0] = "Software is like sex";
"Software is like sex"
>>> arr.length
1
>>> arr
["Software is like sex"]
>>> for (key in arr) { console.log(key); }
0
toJSONString

When walking through an object, the for … in statement will not step through every property. It will only step through those that are defined as enumerable. In other words, it will only step through those those are defined as properties that can be counted by JavaScript iterative processes. [...] System-defined methods are not enumerable, though most system-defined properties are. User defined properties are always enumerable.

And that’s the answer to our question. Always enumerable. So you cannot rely on for ... in statement unless you are sure that no third-party library will add properties or methods to the Array class and even you will not do so.

The solution hence is to use a for statement like this: for (key = 1; k < array.length; k++) { };. That’s all now folks.

Színezd ki a naplódat!

In Uncategorized on 2006.05.10. at 22.40

Avagy hogyan tegyük emberi szem által könnyebben olvashatóbbá a rendszernaplókat (system logs). A válasz igen csak kézenfekvő: Perl skripttel. Azért Perl, mert szöveget dolgozunk fel, színezéshez pedig remek eszköz a Term::ANSIColor csomagja. A program páros számú argumentumot feltételez, első a kijelölt (reguláris) kifejezés, őt követi pedig az ANSIColor számára érvényes színkód (pl. RED vagy BOLD YELLOW). Tovább ehhez a bejegyzéshez »

Yahoo site backlink checker

In Uncategorized on 2006.04.25. at 15.07

The following Python code snippet returns with the number of referring sites of the given URL. Class YahooBacklink uses direct GET query to count the backlinks. Instead of just parsing the total from the first page, using a bit trick we query the real, unique backlink count. In the source code backlink and pattern are two attributes holding the realization dependent data, so you can extend YahooBacklink to get a Google backlink check tool, just hide these two class variables so it would fit to Google’s service scheme.

YahooAPIBackLink based on the Yahoo developer API, so you must have your own Yahoo developer’s application ID (so do the SDK) in order to use it. This solution gives much more result counts, hence it’s up to you which one you want to use. Please note the first method has the limitation that the largest backlink count might be 1000 which would be not ideal for huge sites.

Follow

Get every new post delivered to your Inbox.