pátek 17. prosince 2010

GIT je fajn

Záložení repositáře

git init  #založení repositáře
git add . #vložení souborů
git commit -m 'first message' #
git commit --amend #změny přidá k poslední revizi
git commit -a -m 'description' #Přeskočení oblasti připravených změn

pondělí 20. září 2010

Amazon Kindle rozcestník

Nemůžu si pomoct ale výjimečně si sem postnu něco kde se nic nekompiluje.
Z eBooku Kindle od Amazonu jsem opravdu nadšený, proč?

úterý 14. září 2010

Python: parsování dat - struct.pack(), struct.unpack()

Přijímám si data z komunikace do bufferu.
A poté si je chci rozparsovat do nějaké struktury nebo slovníku chcete-li.

Jo v céčku tam s tím nemám problém, prostě bych si buffer procházel, přetypoval na pointer přislušného typu a přiřadil..

/* struktura bufferu
   | mujByte(1b) | mujWord(2b) | mujDword (4b) | */

length = 0;
data.mujByte = *(byte *)(buffer + length)

length += sizeof(byte)
data.mujWord = *(word *)(buffer + length)

length += sizeof(word)
data.mujDword = *(dword *)(buffer + length)

ale jak si poradit v pythonu?

pondělí 13. září 2010

Python a já, já a Python

Python je mocný, python je lehký, python je fajn.


Skriptovací jazyk, ve kterém i programátor jím neposkvrněný "sbastlí" velmi rychle funkční kód. To mě na něm uchvátilo okamžitě: chceš pracovat s sqlite? jsonem? se soubory? seriovým portem? .. google.. 3 řádky a ono to prostě funguje. Do srovnání s ostatními jazyky se rozhodně pouštět nebudu. Jen povím, že v pythonu mi prostě chodí nejvíc věcí napoprvé a nejrychleji.

Nejsem aplikační programátor a tak když se k něčemu jednou za čas dostanu, velmi oceňuji tuhle svižnost a lehkost s jakou se v pythonu píše. Funkční kód se opravdu dá napsat na pár řádek, ale pokud nechcete nemusíte.. OOP, vlákna.. no vlastně vše, co jsem kdy potřeboval tu funguje velmi dobře.

Python je bezesporu ideální jazyk pro situace, kdy potřebujete něco rychle a hned.
Ale neméně krásné je, že může a umí být mnohem víc...

Co už umím..
a co bych si sem rád poznamenal :-)


  • Parsování dat - struct.pack(), struct.unpack()
  • Databáze sqlite
  • Vytváření EXE souborů - py2exe
  • GUI aplikace - pyQT - QT designer - pyuic -
  • Vlákna - thread
  • Seriový port - pySerial
  • Struktorované ukládání dat - Json
  • Generování HTML
  • Logování
  • Práce se soubory

úterý 24. srpna 2010

Terminál pro seriový port v linuxu

Moje nová hračka xport pro je malinký webserver s linuxem. Mimojiné disponoje jakýmsi "telnetem" přes seriový port. Oficiálně se to nazývá CLI neboli command line. Hledal jsem nástroj se kterým by se mi pracovalo stejně dobře jako s telnetem a běžel pod linuxem, bez kterého se zde neobejdu.

Zkusil jsem si


sobota 10. července 2010

Embedded Ethernet

Pro nový projektík jsem hledal ethernetový modulek, který by za mě "pořešil" všechny ty "síťové věci". Mám na mysli ošklivé zkratky jako HTTP, UDP, IPv4/IPv6, DHCP, ICMP a hlavně SNMP.

První na co jsem narazil byly modulky Connect One. Bohužel ale nepodporují SNMP, tak jsem hledal dál.

Našel jsem velice zajímavý hardware od firmy Rabbit. Na Rabbitu mě láká univerzálnost a možnost pozdějí koupit samotný chip, udělat vlastní desku a tím podstaným způsobem stlačit cenu. Existuje zde velká sada knihoven a programuje se klasicky v Céčku.

Nejvíc mě ale zaujaly, zejména svou kompaktností, modulky od firmy Lantronix. Velmi znamý je XPort, ale mě zaujal jejich nový produkt XPort PRO. Běží na něm linux a základní konfigurace probíhá klasicky přes UART. Slibuje vše co potřebuju a tak jestli to projde koupím jeden kousek, možná i development kit a budu si hrát..

čtvrtek 1. července 2010

C/C++: Trocha pointerové poezie

Nechť máme funkci, která nám po nějaké, blíže nespecifikované komunikaci, vyšle data z bufferu, který jí předáme v parametru..

void sendFunction(byte *pBuffer, byte lenght)

Inu pořídíme si takový buffer..

byte sendBuffer[30];

naplníme..

byte lenght=0;
byte temp1 = 111;
byte temp2 = 222;

sendBuffer[lenght++] = temp1;
sendBuffer[lenght++] = temp2;

a vyšleme..

sendFunction(sendBuffer, lenght);

Nic složitého, já vím.

Jak si ale nejlépe poradit s naplněním bufferu, pokud proměnné temp1 a temp2 budou 16-ti nebo 32-ti bitové proměnné ?

středa 30. června 2010

C/C++: Funkce a její návratová hodnota

Velice užitečné je si u funkcí, které nemusí dopadnout jak se od nich na první pohled čeká, vracet zda vše proběhlo v pořádku.

Obecně se vrací TRUE při správném průběhu a FALSE pokud se vyskytne nějáká chyba. Při volání funkce, která vrácí takovouto hodnotu, můžeme na případnou chybu nějak zareagovat anebo ji předat zase v podobě návratové hodnoty o úroveň výše.

byte setX(byte x){
  if (x>100)
    return 0; //chyba.. X lze nastavit jen v rozsahu 0-100
  sGlobal.x = x;
  return 1; //ok
}


Definujme podobně funkci byte setY(byte y);
Tyto dvě využijeme ve funkci pro nastavení x i y.

byte setXY(byte x, byte y){
  if(setX(x)&&setY(y))
    return 1;
  return 0; //chyba
}

A konečně samotné nastavení x a y by mohlo vypadat nějak takhle..

úterý 29. června 2010

Arduino a jeho minimalistický kód

Už před časem mi přistál v RSS čtečce článek z Tinkerblogu a sice Arduino powered Braitenberg vehicle. Vozítko s dvěma servomotůrky pohybující se za světlem ukazuje krásu a jednoduchost arduina.

Tohle je celý kód, který ovládá vozítko..

#include "Servo.h"

Servo leftServo;
Servo rightServo;
int leftValue = 0;
int rightValue = 0;

void setup() {
  leftServo.attach(10);
  rightServo.attach(9);
}

void loop() {
  // sensor values between 50..900
  leftValue = (analogRead(0) - 50) / 50;
  rightValue = (analogRead(1) - 50) / 50;
  leftServo.write(89 + rightValue);
  rightServo.write(89 - leftValue);
  delay(10);
}


Není to krásné? :D

pondělí 28. června 2010

Rozhraní SPI

Líbí se mi. Je jednoduché a elegantní.

Master se dá velmi jednoduše SW emulovat (např. pokud regulérní spi piny už využíváme k něčemu jinému). Chceme-li vysílat, prostě jen generujeme hodiny a k nim fázově posunutá data, toť vše. Slave dokonce ani nemusí být procesor, postačí posuvný registr. To může být šikovné např. pro buzení LEDek (shift registr s paralelním výstupem) nebo pro snímaní tlačítek (shift registr s paralelním vstupem).


neděle 27. června 2010

C/C++: Makra pro bitové operace

#define BIT(x) (1 << (x))
#define SETBITS(x,y) ((x) |= (y))
#define CLEARBITS(x,y) ((x) &= (~(y)))
#define SETBIT(x,y) SETBITS((x), (BIT((y))))
#define CLEARBIT(x,y) CLEARBITS((x), (BIT((y))))
#define BITSET(x,y) ((x) & (BIT(y)))
#define BITCLEAR(x,y) !BITSET((x), (y))
#define BITSSET(x,y) (((x) & (y)) == (y))
#define BITSCLEAR(x,y) (((x) & (y)) == 0)
#define BITVAL(x,y) (((x)>>(y)) & 1)
Osobně mi nepřirostly k srdci a nějak jsem si je prostě nezvykl používat. Několikrát jsem jim dával šanci, ale dopadlo to tak, že někde jsem použil makro, někde zapomněl a maskoval. To druhé zejména při vícenásobném nahazování nebo shazování bitů, kde je jednořádková maska určitě přehlednější a úspornější. Teď už beru pokaždé kousek papíru, načmárám si těch pár jedniček a nul a.. ..a je to :D