Joel Spolsky: Öt Világ
Bevezető:
"Van egy nagyon fontos dolog, amit egyszer sem említenek a programozásról és szoftverfejlesztésről szóló könyvek, és amiért néha félreértjük egymást. Te szoftverfejlesztő vagy. Én is. Ám nem biztos, hogy ugyanolyan céljaink és követelményeink vannak. Tulajdonképpen a szoftverfejlesztésből több fajta létezik, és mindegyik külön világra más és más szabályok érvényesek. Ha egy UML-ről szóló könyvet olvasol, sehol sem találod meg benne, hogy az alkalmatlan lenne az eszközmeghajtók írásához. Vagy olvashatsz egy olyan cikket, ami azt írja, hogy „A 20MB-s futtatókörnyezet (a .NET-hez) nem lehet akadály, de nem mondja ki a nyílvánvalót: ha csak egy 32KB ROM-al rendelkező csipogóba írsz, akkor igenis van jelentősége! Úgy gondolom, öt különálló világról beszélhetünk, amik néha átfedik egymást, de gyakran nem."
Az elektronikus aláírás-IV.
Folytatjuk…
Egy pici JMS
Jelenleg a piacvezető üzenetkezelők: IBM MQ-Series, BEA MessageQ, MSMQ (Microsoft Message Queue).
A JMS specifikáció webszolgáltatások segítségével lehetővé teszi az üzenetkezelő rendszerek együttműködését vagy összekapcsolódását (pl.: MSMQ-val), amennyiben azok képesek az említett webszolgáltatások kezelésére. Az ELTE TTK szakértői szerint e téren az irányt a heterogén üzenetkezelő rendszerek együttműködése jelenti. Ennélfogva a JMS és MSMQ rendszerek szabványos módon képesek kommunikálni egymással – már amennyiben ez valahol szükséges.
A JMS kétféle működési módot ismer:
– Point to Point modell: két pont közötti aszinkron üzenetátvitel egy üzenetsor (queue) segítségével. Vagyis
egy adott sorba továbbított üzenetet legfeljebb egy ügyfélalkalmazás használhat fel (LIFO lista).
– Publish – Subscribe modell: kiadó-megrendelő architektúra, ahol az egyik fél kibocsátja az adatokat,
melyeket az összes többi is megkap (ha előfizet rá). Vagyis minden előfizetőhöz külön-külön sor tartozik, az
üzenetek több példányban jönnek létre, vagyis ahány ügyfél előfizetett az adott témára.
Perzisztens üzenetsorok esetén címtárat kell alkalmazni, amelyhez a JNDI – Java Naming and Directory Interface használata szükséges (Megjegyzés: az MSMQ "privat queue" esetén nem, de "public queue" esetén már szintén igényli valamely címtár meglétét, pl.: LDAP, AD, de a .NET System.Messaging névtér a szükséges metódusokat, jellemzőket már eleve tartalmazza).
Igény esetén, tranzakciókezelt üzenetvezérléskor pedig egy újabb Java-technológiát,
a JTA – Java Transaction API-t is be lehet vonni a fejlesztésbe.
A JMS-ben osztályokban minden üzenettípusra külön "Message" osztály lett létrehozva, pl.: TextMessage, BytesMessage, ObjectMessages és StreamMessages és az üzeneteket az adott típusnak megfelelően kell bennük elhelyezni. Pl.: az XML adatokat a TextMessage-be, stb.
A JMS-ben külön figyelőosztály van kiképezve az üzenetek fogadására (MessageListener), amely "callback" függvény (onMessage) meghívásával üzen, ha van olyan adat, amit fogadni lehet a queue-ból. A JMS képes szinkron módon is fogadni adatokat, ekkor a fogadás ideje alatt, illetve a várakozás alatt az alkalmazás nem kapja meg a vezérlést (ez érdekes, mert pl. tudtommal az MSMQ – .NET System.Messaging-ben szinkron fogadásra nincs lehetőség).
A JMS jelenleg HTTP protokollon keresztül, SOAP segítségével tud kommunikálni egy másik JMS irányába.
A JMS kissé összetett, cserébe viszont az operációs rendszer platformfüggetlenséget adja, habár ez a jelenleg a webszolgáltatás-alapú, integrációs és együttműködési korszakban már majdnem elhanyagolható előny (Megjegyzés: a Microsoft és Sun külön, önálló projektet hozott létre a .NET – J2EE együttműködésre).
JMS példák (melyek JTA – tranzakciókezelést nem tartalmaznak):
// Point to Point JMS Queue – The Sender – BilboRingQueueSender.java
import javax.jms.*;
import javax.naming.*;
String ringMessage[] = {"One Ring to rule them all," ,
"One Ring to find them," ,
"One Ring to bring them all" ,
"And in the darkness bind them"};
QueueConnectionFactory queueConnectionFactory = null;
Queue ringQueue = null;
try {
Context jndiContext = new InitialContext();
queueConnectionFactory = (QueueConnectionFactory)
jndiContext.lookup("QueueConnectionFactory");
ringQueue = (Queue) jndiContext.lookup("RingQueue");
} catch (NamingException nameEx) {System.out.println(
"Naming Exception: " + nameEx.toString());}
QueueConnection queueConnection = null;
try {
queueConnection=queueConnectionFactory.createQueueConnection();
QueueSession queueSession=queueConnection.createQueueSession
(false,Session.AUTO_ACKNOWLEDGE);
QueueSender queueSender = queueSession.createSender(ringQueue);
TextMessage textMessage = queueSession.createTextMessage();
for (int msgCount = 0; msgCount < ringMessage.length;
msgCount++)
{
textMessage.setText(ringMessage[msgCount]);
queueSender.send(textMessage);
System.out.println(" sending line " + msgCount + " : " +
ringMessage[msgCount]);
}
textMessage.setText("end of message");
queueSender.send(textMessage);
System.out.println(" sending last line " + " : " +
textMessage.getText());
queueConnection.close();
System.out.println(" ring sender closed");
} catch (javax.jms.JMSException jmsEx) {System.out.println(
"JMS Exception: " + jmsEx.toString());
} finally { if (queueConnection != null)
{ try
{ queueConnection.close();
} catch (javax.jms.JMSException jmse) {}
}
}
}
}
Összefoglalásként elmondható, hogy egy adott üzenetkezelési feladat elvégzésére többféle technológia és eszköz is lehet jó megoldás. Minden esetben a megoldandó feladat, a lehetőségek, a támogatott platform és a megvalósítás várható költsége/ideje dönti el, hogy az adott körülmények között épp melyiket érdemes alkalmazni. Általában az a véleményem, hogy Windows platformon MSMQ-t kell alkalmazni. Máshol pedig azt, ami ott a leg célravezetőbb. Az integrációra pedig egyszerű SOAP hívásokat kell készíteni.
Akit érdekelnek a részletek is az olvassa el a "J2EE – Utikalauz Java programozóknak" című könyvet.
WLan, Wi-Fi, mifi?
Ingyenes IBM DB2
Van rajta sapka, nincs rajta sapka…
Torvalds: a Linux nem vált GPLv3-ra
Joel Spolsky: Lord Palmerston és a programozás
"Valaha az IBM PC-k programozását az ember egyetlen Peter Norton-könyv elolvasásával kimerítően megismerhette. Az elmúlt 20 évben pedig egyre újabb és újabb, a PC-programozást könnyítő és segítő absztrakciók kerültek ki szorgos programozók kezei alól. A szivárgó absztrakciók törvénye következtében azonban a programozást könnyíteni hivatott absztrakciók szaporodásával párhuzamosan a programozói hivatáshoz (pláne egy jó szakembernek) szükséges tudásanyag is egyre csak nő. Egyetlen programozási nyelv kiismerése (annak minden zegzugával együtt) is évekbe telik. Sok fürge eszű tizenéves persze egy hét alatt meg tudja tanulni a Delphi-t, a rákövetkezo héten a Python-t, ezek után újabb egyhetes elfoglaltságnak beférhet a Perl is, és ettől tapasztalt kódiparosnak hiszik magukat, miközben halványlila fogalmuk sincs a tudásuk tényleges hiányosságairól."
TOP-lista
Honnan jöttem, merre tartok-II.
Innen-onnan Linux-VI.
X Window System (vagy röviden: "X")
Az X semmi mást nem csinál, mint alacsonyszinten kezeli a képernyő, billentyű, egér és egyéb hasonló eszközöket. Tehát önmaga nem egy felhasználói felület, nincs ablakkezelője, menükezelője, stb. "csak" hardveresztközöket vezényel. Ezt pedig klasszikus kliens/szerver architektúrában teszi. Még akkor is, ha csak egy számítógépről van szó, hiszen ezesetben a kliens és a szerver ugyanazon a gépen van.
Minden ablakkezelő program közvetett módon az adott X kliensen keresztül fér hozzá az általa igényelt hardvereszközökhöz. Az ablakkezelő programok minden hardveren ugyanúgy működnek, a műszaki különbözőségeket az X (pontosabban annak a nyílt forráskódú XFree86 vagy éppen X.org szerinti megfelelője) fedi el. Az X-et szövegfájl segítségével lehet paraméterezni, de ezt még az ellenségemnek se kívánnám. Létezik egy parancssoros program is, amely kicsit egyszerűsíti a dolgot. Sőt, hovatovább valami irgalmatlan IQ-t igénylő grafikus alapfelülete is elérhető, használtam is tán egyszer, de többnyire inkább a szomszéd kisgyerekek riogatására.
Az X-nek a C-nyelvű programozói könyvtárát "XLib"-nek hívják.
Ablakkezelők
Az ablakkezelők az X-nek a kliens-oldali felhasználói megvalósítása. Ablak mozgatás, átméretezés, minimalizálás, maximalizálás, stb. Mind-mind olyan dolgok, melyeket az X nem kezel. Egy ablakkezelő további feladata, hogy segédkezzen a programok elindításában is. Mivel az ablakkezelő kliensprogram, így szabadon cserélgethető. Az XLib-el, habár lehet, de nagyon nehézkes és fáradságos a grafikus műveletek végrehajtása.
Léteznek az XLib-re ráépülő, úgynevezett "Widget"-könyvtárak (közismertebb nevén vezérlőobjektumok programozói könyvtára). A widget-ek felelnek minden elem megrajzolásáért, kezeléséért, ezért a programok viselkedése nagyban függ a választott widget-könyvtártól. Az első ilyen egy Athena nevű volt, majd később, a 90-es évek elejéig az Open Software Foundation "Motif" csomagját használták. Manapság inkább a"Gtk" (Gimp Toolkit) és a "Qt" grafikus programkönyvtárak vannak elterjedőben.
A KDE a "Qt"-t, a GNOME pedig a "Gtk" grafikus könyvtárakat használja.
Asztali környezet
A rendszer kialakításakor elsősorban a rugalmasság és a felhasználói szabadság volt a cél, ellentétben a MacOS és Windows megkötöttségével, illetve zártságával. Ez a szabadság azonban oda vezetett, hogy…
– a kliensprogram írója határozza meg a widget-könyvtár típusát (ami sok elétérést okoz a különböző kezelési
módok miatt),
– a widget könyvtárak általában dinamikusan linkelődnek a programokhoz, azonban ha a az egy gépen lévő
kliensprogramok egymástól eltérőeket használnak, akkor az plusz memóriát igényel,
– a különböző ablakkezelők koncepciója eltérő,
– az egész felület nem áll össze egy egséges egépsszé, nem lehet egyben konfigurálni a kinézetét, kezelését.
{
KApplication khello(argc,argv, "khello");
KLineEdit* helloedit=new KLineEdit();
QString hellostring("Szia világ!");
helloedit->setReadOnly(true);
helloedit->setAlignment(Qt::AlignCenter);
helloedit->show();
return khello.exec();
}
"Help") == KMessageBox::Cancel)…
Adakozás
Rekordbevétel
Az elektronikus aláírás-III.
– kötelező adat
– hierarchikus szerkezetű
– Csak egy!
– Nem biztos, hogy ellenőrzik, hogy alá is tud írni a kliens
– Nem garantálhatják, hogy másnak nincs birtokában a kulcs
– Nem biztos, hogy megfelelően ellenőrzik a névhasználat jogosságát
Linux kernel kódot írni C++ -ban véresen hülye dolog…
Pár gondolat erről:
• Miért kellene?
• Amikor a Linux elkezdődött, nem volt hatékony "gcc" C++ fordító és néhányan azzal érvelnek,
hogy ma sincs.
• Sokkal több C programozó van, mint C++ -os.
• A C++, a C-vel ellentétben nem kompatibilis 100%-ban visszafelé.
• A C++ szabványosítók nem eléggé elkötelezettek a 100%-ig történő visszafelé kompatibilitás ügyében.
• A kernelt újraírni C++ -ban hatalmas mennyiségű munkával járna és óriási erőfeszítést követelne.
• A C++ nagyon összetett nyelv, de nem olyan érett, mint a C.
• Amíg Linus a kernel karbantartója, csak ő szólíthatna fel erre, neki viszont az alábbi véleménye van:
– 1992-ben már egyszer megpróbáltuk átírni.
– Szívás volt, mert kernel kódot írni C++ -ban egy véresen hülye dolog.
– A tény az, hogy a C++ fordítók megbízhatatlanok.
– A C++ kivételkezelése alapvetően tönkretesz mindent – különösen a kernelt.
– Bármely fordító vagy nyelv, amely elrejt dolgokat a memóriafoglalásról, nem jó választás a kernelhez.
• Stb.
A reykjaviki egyetem hallgatói azért implementáltak egy kernelszintű Linux "run-time support" lehetőséget, viszont Linus Torvalds ezzel nem igazán akar foglalkozni és nem is támogatja (lásd fentebb az idézetet tőle).
Mások is nagyon sokat foglalkoztak már ezzel a kérdéssel.
a kernelt belülről teljesen újra kellene tervezni.
Eredeti írás itt.
• Writing a Kernel in C
Eredeti írás itt.
Hozzászóláshoz be kell jelentkezni!