Pokazywanie postów oznaczonych etykietą Python. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą Python. Pokaż wszystkie posty

niedziela, czerwca 07, 2020

Workflow dla Alfreda do dodawania tasków z projektami i labelkami do Todoista :-)

Pogoda nie chce współpracować ;-) więc postanowiłem wrzucić na GitHub'a mój workflow dla Alfreda, który pozwala na dodawanie tasków do Todoist wraz ze skierowaniem takiego taska do odpowiedniego projektu i dodaniem doń wskazanych labelek ;-)


Kod skryptów w Pythonie jest dostępny w katalogu src, nie jest to jakiś piękny Python, ale mnie wystarcza :-)

Jak ktoś zainteresowany to zapraszam na Githuba ;-)


Podobne postybeta
Alfred + Todoist i wysyłanie tasków do projektu, a nie tylko do Inbox'a ;-)
Rejestracja na szczepionkę
OOo2GD - zabawa w dodawanie folderów
Żenienie Todoist z Obsidian przy pomocy Pythona ;-)
Duże obrazki w Bloggeroidzie

czwartek, października 19, 2017

Jak zrobić plik OVPN (dla OpenVPN) w wersji unified format?

Dziś próbowałem przerzucić pliki konfiguracyjne mojego VPNa na iPada Pro...

Przez iTunes się nie udało i naprawdę cieszę się, że nie używam tego softu.
To postanowiłem przez HTTP.

Ale co pobrało plik ovpn to płakało, że nie może pobrać ani certyfikatu dla centrum autentykacji, ani klucza klienta, ani samego certyfikatu.

Myślałem, że to przez to, że serwuję to po HTTP.
Więc zacząłem walczyć z konfigurowaniem HTTPS.

Zrobiłem na Tomcacie, ale nadal nie działało.
Przy okazji przewalczyłem tworzenie nowego certyfikatu i parę innych rzeczy.

Firewall mi blokował połączenia. Przewalczyłem. Dodałem wyjątek i nic, nadal.....

Wtedy do mnie dotarło, że drań by chciał wszystko w jednym pliku, a nie w kilku ;-)

Ja miałem certyfikat dla centrum autnentykacji w pliku ca.crt, certyfikat klienta w client1.crt i klucz klienta w client1.key.... no i sam plik ovpn...

Stąd jakby ktoś chciał to tutaj skrypt, który wyprodukuje plik ovpn na podstawie takiego rozbitego:

import sys

def load(fName):
return "".join(open(fName).readlines())

lines = open(sys.argv[1]).readlines()

f=open("unified_"+sys.argv[1],"w+")

keys = ["ca","cert","key"]

for line in lines:
found=False
    line=line.strip()
    for key in keys:
if line.find(key)==0:
s = line.split(" ")
if len(s)==2 and s[0]==key:
found=True
                f.write("<"+key+">\n")
                f.write(load(s[1]))
f.write("</"+key+">\n")
if not found:
f.write(line+"\n")
f.close()

U mnie działa :-)

Żeby użyć zapisujemy sobie skrypcik jako np. build.py i robimy z linii poleceń:

python build.py naszPlik.ovpn

Jako wynik w tym samym folderze pojawi się plik unified_naszPlik.opvn.

Podobne postybeta
Jak walczyć z gigantycznym kodem w Java'ie, część 1 ;-)
Zabawy z Chrome, chrome.storage.sync jest wielkie :-)
GZIP mi oddał 119 GB dysku ;-)
Od Buffy do egzaminu językowego ;-)
SSD a programowanie

niedziela, kwietnia 23, 2017

Airly + Python + Oczyszczacz Powietrza = lepsze oddychanie ;-)

W Krakowie powstaje genialny produkt zwany Airly, który pokazuje w real time poziom zanieczyszczenia powietrza.
Ostatnio szerzej otworzyli swoje API. Co mnie ucieszyło, bo chociaż mają genialną apkę na Androida to chciałem mieć możliwość napisania sobie skryptu, który w momencie osiągnięcia odpowiednio wysokiego poziomu zanieczyszczenia wysyłał by mi maila z sugestią włączenia oczyszczacza powietrza (najlepiej jakby go sam włączał, ale to jednak takie proste nie jest ;-)).

Chciałem, to mam ;-)

import urllib2
import json
import os
import string
import sendmail

ALERT_LEVEL = 40
MAIL_TO = "<MAIL>"
apikey = "<APIKEY from https://apiportal.airly.eu/>"
url = "https://airapi.airly.eu/v1/mapPoint/measurements?latitude=<yourLatitude>&longitude=<yourLongitude>"
prevCaqi = 0
if os.path.exists("prevCaqi.txt"):
prevCaqi = float("".join(open("prevCaqi.txt").readlines()))

req = urllib2.Request(url)
req.add_header('apikey', apikey)
resp = urllib2.urlopen(req)
content = resp.read()

data=json.loads(content)

caqi = float(data["currentMeasurements"]["airQualityIndex"])

open("prevCaqi.txt","w+").write(str(caqi))

if prevCaqi<ALERT_LEVEL and caqi>=ALERT_LEVEL:
content = string.Template("""Current CAQI: $airQualityIndex
pm25: $pm25
pm10: $pm10
pollution level: $pollutionLevel
pressure: $pressure
humidity: $humidity
temperature: $temperature""").safe_substitute(data["currentMeasurements"])
sendmail.sendEMail(MAIL_TO,"Turn on AirCleaner",content)


Żeby działał ten skrypt trzeba mieć swój klucz do API, który idzie pod apikey. Trzeba ustawić też maila w MAIL_TO i długość i szerokość geograficzną (które można sobie odczytać np. używając mojego toola do wyliczania czasu wschodu i zachodu słońca ;-)).
Jeszcze trzeba mieć moduł sendmail, który można znaleźć w moim wpisie o tym jak nie zapomnieć o kupnie biletu miesięcznego ;-)


Podobne postybeta
Raspberry Pi + no-ip.org ;-)
Jak nie zapomnieć kupić biletu miesięcznego - revised ;-)
Electron + Airly = wskaźnik jakości powietrza w pasku ;-) - part 2, źródła ;-)
Jak nie zapomnieć kupić biletu miesięcznego ;-)
Electron + Airly = wskaźnik jakości powietrza w pasku ;-)

środa, października 10, 2012

Python zabójca ;-) czyli krótka opowieść o tym jak multiprocess "zabił" komputer ;-)

Wierzenie Internetowi może boleć ;-)
Skarżyłem się na problemy z multiprocessing'iem w Pythonie. Już rozumiem dlaczego je miałem ;-)

Chyba na StackOverflow czy czymś podobnym przeczytałem poradę dla kogoś narzekającego na GILa, że niech użyje multiprocessing, bo ma to to taki sam interfejs jak threading i powinno działać.
Więc programik:

import threading

class MyThread(threading.Thread):
def run(self):
i = 0
while True:
i=i+1
print threading.current_thread(),i

for i in range(0,8):
p = MyThread()
p.start()

Zmieniłem w:

import multiprocessing

class MyThread(multiprocessing.Process):
def run(self):
i = 0
while True:
i=i+1
print multiprocessing.current_process(),i

for i in range(0,8):
p = MyThread()
p.start()

I to był mój błąd ;-)
Bo teraz program nie działa tak, że tworzy 8 wątków, które sobie robią co mają robić... o nie ;-)
Teraz program po uruchomieniu odpala jak rozumiem 8 swoich kopii, każda sobie chyba nadal wykonuje to z run, ale tu nie mam pewności ;-) każda z tych 8 kopii uruchamia kolejne 8 kopii, każda z tych kopii kopii (64 już) uruchamia kolejne 8 i tak dalej ;-)
Komputer przestał mi odpowiadać przy blisko 12 tysiącach procesów, które zużywały już ponad 16GB RAM ;-) zabicie tego potwora się nie powiodło ;-)


Podobne postybeta
Python i wiele rdzeni ;-)
Python z urllib = najlepszy menadżer pobierania ;-)
"Skoro ludzie wyewoluowali z małp to czemu małpy nadal istnieją?"
Python for Android vs. AppInventor - 2:0 ;-)
Maszyna stanów kontra labirynt ;-)

piątek, czerwca 01, 2012

Maszyna stanów kontra labirynt ;-)

OK, wiem że to co tu napiszę nie zawsze działa ;-) [przed chwilą stworzyłem labirynt w którym moja maszyna stanów nie podołała ;-) ale już jest za późna pora by szukać błędu...]

Zobaczyłem dziś na HackerNews linkę do Google Blockly, a tam jeden z przykładów [do napisania ;-)] to rozwiązywanie labiryntu.
Chwilę się tym pobawiłem, ale mi ELSE brakowało w IF, więc sięgnąłem po kawałek papieru (tym razem koperta z banku) i narysowałem sobie maszynę stanów, która jak mi się wydaje powinna rozwiązywać labirynt przez poruszanie się po nim z lewą ręką na ścianie..

Później to zakodowałem w Pythonie i tak wygląda program w działaniu ;-)


Najważniejszy kawałek kodu wygląda tak:

while (startX!=endX) or (startY!=endY):
if state==0:
newDir = turnLeft(dir)
if empty(startX+newDir[0],startY+newDir[1]):
state=1
else:
state=2
continue
if state==1:
dir = turnLeft(dir)
startX+=dir[0]
startY+=dir[1]
state = 0
continue
if state==2:
if empty(startX+dir[0],startY+dir[1]):
state=3
else:
state=4
continue
if state==3:
startX+=dir[0]
startY+=dir[1]
state=0
continue
if state==4:
dir = turnLeft(dir)
state=0
continue

Na wejściu mamy w (startX,startY) pozycję startową, a w (endX,endY) pozycję końcową.
turnLeft() po prostu obraca "wektor" dir w lewo o 90 stopni, a empty() sprawdza czy pole przed nami jest puste, czy nie :-)
state to akutalny stan maszyny, można to zrobić ładniej, ale chciałem by było to widać.

Jak ktoś ciekawy to tutaj pliki do pobrania:
maze.py - program w Pythonie (jeśli chcesz go uruchomić na Linuksie czy innym *niksie to zmień os.system("cls") w os.system("clear"), nie chciało mi się kombinować to użyłem tak ohydnej metody czyszczenia ekranu :-))
maze.txt - labirynt
maze2.txt - labirynt zabójca dla programu ;-) zaczyna się kręcić "jak smród po gaciach" ;-)

I moje 30 minut kodowania (prywatnego) odbębnione :-)


Podobne postybeta
Hmm... znów się bawię ChatGPT i rysujemy obrazek ;-) a później piszemy kod z obrazka ;-)
Nigdy nie zapominaj o FSM! ;-)
Śmierdząca ryba wolności ;-)
Windows mnie jednak nie lubi ;-)
Python zabójca ;-) czyli krótka opowieść o tym jak multiprocess "zabił" komputer ;-)

piątek, marca 25, 2011

Python for Android vs. AppInventor - 2:0 ;-)

Pisanie w Java'ie dla Androida jest fajne i w ogóle super, ale jest też upierdliwe.
Trzeba się paprać w jakimś XMLu, dotykać kilku plików, pisać głupie onCreate i podobne.

Do czegoś większego to ma sens, ale jak chcę napisać program, który będzie wykonywał zdjęcia co 30 sekund to przecież nie powinienem być zmuszony do robienia tego wszystkiego co opisałem wyżej....

Najpierw liczyłem, że AppInventor for Android będzie takim fajnym narzędziem, które pozwoli mi takie rzeczy robić szybko i miło......
Zawiodłem się. Do teraz np. nie wychodzi mi robienie zdjęć przy pomocy AppInventora. Dodatkowo programy w nim napisane, czy narysowane mają po 2-4 MB... zgroza.

Dlatego mimo niechęci do używania Java'y do takich prostych rzeczy musiałem jej używać ;-)

Ale później zainstalowałem ponownie na telefonie Scripting Layer for Android (SL4A) i dodałem do SL4A Pythona :-)

I tak znalazłem rozwiązanie moich problemów :-)

Program robiący zdjęcia co 30 sekund wygląda tak:
import android
import time

def lz(s):
while len(s)<5: s='0'+s
return s

droid = android.Android()

i=0
while (True):
droid.cameraCapturePicture('/sdcard/timePhoto/'+lz(str(i))+'.jpg',True)
i=i+1
print(lz(str(i)))
time.sleep(30)


A i tak zapewne działanie funkcji lz() można by czymś zastąpić ;-)

Jak widać program działa w nieskończonej pętli, w której co 30 sekund wykonuje się 1 zdjęcie zapisywane na karcie SD.

Narzędzie sprawdza się całkiem dobrze, szczególnie jeśli przełączy się telefon w tryb w którym nie wygasza ekranu.

Po tym poszedłem za ciosem ;-)

Ponieważ mam teraz od Ery 5GB transferu na telefonie to czasem używam telefonu do tetheringu. Ale żeby go włączyć w Nexus S to trzeba się trochę naklikać... Niby nic, a męczy.

Ale teraz mam łatwiej ;-) Klikam na ikonkę tego skryptu:
import android

droid = android.Android()
droid.startActivity("android.settings.WIRELESS_SETTINGS")
print("done")

który otwiera po prostu aktywność związaną z ustawieniami bezprzewodowymi, a stąd jeden klik prowadzi mnie do ekranu konfiguracji tetheringu :-)

W SL4A można używać także JavaScript osadzonego w HTMLu, ale wtedy nie działa tak jako powinno umieszczanie linków do takich skryptów na pulpicie.


Podobne postybeta
Komórka - w końcu to taki mały komputerek ;-)
Python z urllib = najlepszy menadżer pobierania ;-)
AppInventor - pierwsze wrażenia i pierwsze programy :-)
OAuth mnie denerwuje ;-)
Jak automatycznie zmienić słowo "laka" w "łąka"? :-)

Nie jest dobrze ;-)

Kilka dni temu mi się w pracy nudziło [niby miałem robotę, ale jakoś nie mogłem wymyślić [zawsze myślałem, że się powinno pisać i mówić wymyśleć, lepiej mi to brzmi] jak się za to zabrać i przeszedłem w tryb losowego błądzenia, czyli zajmowania się innymi rzeczami bo a nóż coś mi podsuną] i zajrzałem na 9 Fingers [taki niby portal dla programistów, ale bardziej to portalik i nie dla programistów a dla studentów szukających rozwiązań do zadań] gdzie ktoś spytał jak napisać kod do losowania 10 niepowtarzających się liczb od 1 do 100.

Napisałem, ale męczyło mnie czy nie byłoby łatwiej po prostu olać możliwość powtórek, w tym celu chciałem sprawdzić jakie jest prawdopodobieństwo takiego zdarzenia.
Nie do końca miałem pomysł jak się za to złapać, bo na 2 czy 3 mi wychodziło, ale nie potrafiłem na szybko zgeneralizować mojego rozwiązania i użyć go do 10 prób ;-)

No i okazało się, że łatwiej mi było napisać programik, który to przetestował niż to rozwiązać po bożemu.

Wyszło mi, że w około 37% przypadków jakaś liczba się powtórzy, czyli nie można tego zignorować [w pierwszym podejściu wyszło mi 5%, ale po przyjrzeniu się kodowi uświadomiłem sobie, że mierzyłem nie ilość przypadków w których doszło do powtórzenia, a "nadmiar" losowań - tu warto zapamiętać, w razie robienia eksperymentu trzeba się kilka razy upewnić czy jego wynikiem jest dokładnie to co nas interesuje ;-), ja miałem sugestię co do tego, że mój pierwszy wynik był zły, bo skoro w przypadku wylosowanych już 9 liczb istnieje blisko 10% szansa wylosowania jednej z nich to w jaki niby sposób łączne prawdopodobieństwo takiego zdarzenia jak konieczność ponownego losowania miała być niższa?]

Zresztą ten pierwszy zły wynik eksperymentu sprowadził mnie na manowce też w wyliczenie tego po bożemu, bo wpadłem na pomysł tylko, że wyniki mi się nie zgadzały z eksperymentem to je odrzuciłem uznając, że skoro eksperyment pokazał coś innego to trudno, moje wnioskowanie było błędne ;-)

Ale wracając do tytułu, że nie jest dobrze ;-)
Nie jest dobrze, że szybciej mi było napisać coś do testowania niż zaatakować problem od strony teoretycznej. [Chociaż w samym robieniu eksperymentu nie ma problemu i to jest dobry pomysł do pierwszego ataku, albo przetestowania teorii... problemem są jednak błędy w eksperymentach ;-)]

Mój dobry program testujący wygląda tak:
import math
import random

SAMPLES = 100000

def test():
l = {}
for i in range(0,10):
r = math.floor(random.random()*100)+1
l[r]=True
return len(l)

sum=0
for i in range(0,SAMPLES):
if test()<10:
sum=sum+1

print(sum/SAMPLES)


I jak widać jego działanie opiera się przeprowadzeniu pewnej ilości takich wypełnień tablicy 10 elementów :-)

Tu zresztą widać przewagę JavaScriptu nad Pythonem czy dowolnym innym językiem, jako językiem do pisania takich cosiów. Jakby to był JavaScript to dodałbym do tego postu "interaktywną" wersję narzędzia, że każdy mógłby sobie poklikać by zobaczyć efekty.

Jak już dotarłem do tego, że robię błąd w narzędziu do symulacji to wpadłem i na to jak znaleźć wynik teoretycznie ;-)
Jeszcze się w tym upewniłem przejrzawszy w miejscu spania "75 sposobów na statystykę".

Wg. teorii, prawdopodobieństwo powtórzenia się liczby przy losowaniu 10 liczb z zakresu 1 do 100 wynosi też około 37%.
Dochodzimy do tego "od tyłu", czyli sprawdzamy jaka jest szansa, że liczby się nie powtórzą.
Jedna liczba się nie powtórzy, jak są już dwie to może dojść do powtórki, z jakim prawdopodobieństwem? Dokładnie 0.99, bo mamy 99 na 100 liczb takich, których jeszcze nie mieliśmy.
Przy trzeciej liczbie mamy 98 takich liczb i tak dalej.
Ponieważ to czy za 3 razem wylosujemy liczbę powtarzającą się jest niezależne od tego czy zdarzy się to za 2 czy 5 razem to wiemy, że są to zdarzenia niezależne, możemy więc ich prawdopodobieństwa pomnożyć :-)

Czyli (nie umiem zmusić Chrome do narysowania ładnego wzorku z produktem więc będą cyferki tylko ;-)):
P(10 niepowtarzających ze 100)=1-99/100*98/100*97/100*96/100*95/100*94/100*93/100*92/100*91/100=0.3718 :-)

A programik, który to liczy wygląda tak:
prod = 1
for i in range(1,10):
prod=prod*(100-i)/100
print(1-prod)


Swoją szosą trzeba szlifować algorytmy, bo żeby taki duperelek jak to wyżej sprowadzało na mnie taką niepewność, że muszę posuwać się do pisania programów które to testują?
Wstyd.


Podobne postybeta
Matematyczne podstawy zakupu skarpetek ;-)
Jak uniknąć zonka ;-)
Losowanie dobre
Transhumanizm [długo i nudno ;-)]
Rankingi, to nie takie proste ;-)

czwartek, stycznia 20, 2011

Z NMEA do KML (chyba najbardziej kryptyczny tytuł postu jak stworzyłem ;-))

Popełniłem sobie dziś prostego toola (pewnie gdzieś już to ktoś zrobił i to kilka razy, ale mi się szukać nie chciało ;-)) który przerabia strumień danych z GPSa (w formacie NMEA) w pliki KML zrozumiałe między innymi przez Google Earth.

Sprytne tą te pliki KML, można w nich np. pokazać nie tylko długość i szerokość, ale i wysokość co wygląda tak:



Zresztą wychodzi, że Rosjanie prezentując raport MAK używali właśnie plików KML w Google Earth, albo co mi się bardziej prawdopodobne wydaje w Google Earth Browser Plugin czy jak to nazwać, bo tam można używać JavaScriptu do oprogramowania i animacji... chociaż możliwe, że KML też na to pozwala ;-)

Sam tool to skrypt w Pythonie, który wygląda tak:
a=open("Do Krakowa.txt")
b=a.read()
c=b.split("\n")
print len(c)
s = ""
s2 = ""
for i in range(0,len(c)-1):
if c[i].find("$GPGGA")!=0:
continue
d=c[i].split(",")
if d[2]<>"":
lat=float(d[2])/100
latDeg = int(lat)
latMin = (lat-latDeg)/60
lon=float(d[4])/100
lonDeg = int(lon)
lonMin = (lon-lonDeg)/60
lat=latDeg+latMin*100
lon=lonDeg+lonMin*100
if d[3]=='S':
lat=lat*-1
if d[5]=='W':
lon=lon*-1
alt=float(d[9])
s=s+str(lon)+","+str(lat)+","+str(alt)+"\n"
s2=s2+str(lon)+","+str(lat)+"\n"
sourceStart="""<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>Paths</name>
<Style id="yellowLineGreenPoly">
<LineStyle>
<color>7f00ffff</color>
<width>4</width>
</LineStyle>
</Style>
<Placemark>
<name>Absolute Extruded</name>
<description>Transparent green wall with yellow outlines</description>
<styleUrl>#yellowLineGreenPoly</styleUrl>
<LineString>
<extrude>1</extrude>
<tessellate>1</tessellate>"""
sourceAlt="<altitudeMode>absolute</altitudeMode>"
sourceEnd="""</LineString>
</Placemark>
</Document>
</kml>"""
file=open("result___A.kml","w+")
file.write(sourceStart);
file.write("<coordinates>");
file.write(s2)
file.write("</coordinates>");
file.write(sourceEnd);
file.close()
file=open("result___A2.kml","w+")
file.write(sourceStart);
file.write(sourceAlt);
file.write("<coordinates>");
file.write(s)
file.write("</coordinates>");
file.write(sourceEnd);
file.close()


U mnie na dysku ten plik zowie się walczKML.py ;-)

Pooglądanie takich plików w Google Earth pokazuje, że wysokość podawana przez GPSa i ta w Google Earth dość mocno się różnią ;-) To co jest na obrazku u góry postu to moja trasa z moją wysokością, a jak widać poruszałem się wtedy wg. Google Earth znacznie ponad powierzchnią ;-)

Podobne postybeta
Robimy widget do Windows 7 :-)
Różniste różności różne ;-)
Jak zrobić plik OVPN (dla OpenVPN) w wersji unified format?
Aplikacja w Java'ie jako coś w czym można przeglądać pliki w macOS
Jak nie zapomnieć kupić biletu miesięcznego - revised ;-)

poniedziałek, stycznia 11, 2010

Pythonowe formatowanie kodu ma jednak swoje zalety ;-)

W moim wpisie o tym czego wg. mnie się warto uczyć, a czego nie, krytykowałem Pythona za brzydki [wg. mnie] zwyczaj zaznaczania bloków kodu przez formatowanie.

W piątek znalazłem w kodzie błąd, który spowodowany był tym, że w Java'ie tak nie jest ;-)
Kod szedł mniej więcej tak:
for(SomeType rec: types) {
if("SomeText".equalsIgnoreCase(rec.getName()))
someTextTypeForIhread.put(Thread.currentThread(), rec.getTypeNo());
return rec.getTypeNo();
}

Nad tym kodem był warunek sprawdzający czy w mapie jest już może wartość, a jeżeli była to używana była wartość z mapy [OK, w oryginale typy były inne, klucz inny i inny tekst, a same rzeczy z kolekcji types pobierane były z bazy, ale kod mniej więcej taki sam].
Niestety ten kod działał źle ;-)
Bo intencja była taka by w razie rec.getName() byłoby równe "SomeText" to powinna wypełnić się mapa i zwrócić wartość z reg.getTypeNo().... dzięki temu w razie kolejnego wykonania [pewnego] wartość byłaby podana od razu z cache [a przypominam, że elementy types pobierane były z bazy i zabierało to dość dużo czasu] jednak w rzeczywistości zawsze zwracana była wartość rec.getTypeNo() dla pierwszego elementu w kolekcji types :-)

Co najgorsze sam zrobiłem ten błąd [dodając fragment związany z mapą] bo dałem się "oszukać" komuś piszącemu przede mną i głupio założyłem, że ponieważ kod jest sformatowany tak:
for(SomeType rec: types) {
if("SomeText".equalsIgnoreCase(rec.getName()))
return rec.getTypeNo();
}

To znaczy, że jest on kodem, który powinien wyglądać tak:
for(SomeType rec: types) {
if("SomeText".equalsIgnoreCase(rec.getName())) {
return rec.getTypeNo();
}
}


Czyli choć sam uważam, że Pythona nie opłaca się uczyć by zastąpić nim kodowanie w Java'ie czy C++, to jednak ma swoje zalety [i to prócz szybkości :-) bo w obliczeniach numerycznych bywa szybszy od C#, którego mimo wszystko polecam do nauki "na przyszłość"]

Podobne postybeta
Nie inicjalizuj rozmiaru kolekcji...
Sztuczki tropiciela błędów, part 2 ;-)
Lenistwo w działaniu, "piklujemy" Androida ;-)
GPT + Python = sprawdzanie czy 5 książka z Bobiverse już jest dostępna ;-)
Pierwszy dzień w przyszłości, czyli programista jako dyspozytor Agentów

środa, stycznia 06, 2010

Java, JavaScript, Python, C++, C#? co ma przyszłość?

Teraz wiadomo Java rządzi w aplikacjach Enterprise, C++ też sobie dobrze poczyna.
Ale co w przyszłości? Czego warto się uczyć?

Java
Java mimo swych zalet ma dwie wady, Swinga i to, że źródła są ciężkawe. Ten sam algorytm zakodowany w Java'ie i C++ wygląda zwykle lepiej w C++ :-)
Zmiany w Java 7, czyli np. operator czy jak to nazwać ;-) diamentowy <> powinien uczytelnić kod, jest szansa, że do języka wejdą też domknięcia czy upraszczając sprawę metody anonimowe ;-) Przydałoby się chyba jeszcze przeciążanie operatorów.
Moja rekomendacja: Jak nie znasz Java'y albo znasz tak sobie to warto się jej uczyć :-) Jeśli już znasz to pogłębiaj swoją wiedzę. Ciągle liczę, że Sun czy teraz Oracle da Java'ie kopa w górę i usprawni Swinga [bo to jest bardzo zacna biblioteka, dużo pozwala zrobić i jest ładna, ale żeby dobrze używać Swinga trzeba się z niego doktoryzować, a i tak w końcu się poddajesz i tworzysz GUI przy pomocy edytora prawie WYSIWYG [prawie bo oczywiście to, że w edytorze są takie, a nie inne wymiary wcale nie musi oznaczać, że w ostatecznym wyglądzie będzie tak samo].
Ale w zastosowaniach Enterprise Java będzie pewnie jeszcze jakiś czas królować np. dzięki bezwładności ;-) choć szybkość i przenośność też będą miały wpływ [i to większy :-)]. Java ma też to do siebie, że żeby w niej pisać trzeba być w miarę dobrym programistą [to wynik wnioskowania ;-) Ja piszę w Java'ie, ja z definicji jestem dobrym programistą ;-) czyli dobrzy programiści piszą w Java'ie ;-) [tak zdaję sobie sprawę z luk w tym rozumowaniu ;-)]]

JavaScript
JavaScipt jest wielki [mówię głównie o tym co widać z ECMAScript w przeglądarkach bo to jednak nadal jego główna emanacja ;-)], miło by było gdyby dodano do niego [i do HTMLa] parę rzeczy takich jak np. możliwość pracy na wyższym poziomie abstrakcji w GUI, coś w takim stylu, że chcę stworzyć diva z tekstem i guzikami w środku, to zamiast tworzyć np. DIV przez document.createElement użyłbym:
div = new DivElement(); div.add(new TextElement("Napis"));
button = new Button("tekst guziczka",function(){
div.style.display="none";
});
div.style.top=300;
div.style.left=300;
div.style.display="block";

Sam HTML mógłby się za to nabawić jakichś bardziej przyjaznych developerom elementów, takich jak nieśmiertelny ;-) ComboBox
Moja rekomendacja: Podobnie jak Java, na dodatek różne straszne rzeczy w stylu Flasha też używają ECMAScript ;-) Czy się to komu podoba czy nie JavaScript staje się coraz ważniejszy. Ziszcza się to czego chciałem 10 lat temu ;-) czyli przenosi się wiele działań serwera na stronę klienta, bo w końcu po co przesyłać klientowi wygląd całej strony jak można przesłać same dane, a JavaScript sobie wygeneruje zawartość strony? [z dumą podkreślę, że 10 lat temu sam na to wpadłem :-) i tak działa w dużej części BuffyPedia :-)]
Przez to JavaScript powoli acz skutecznie staje się podstawowym językiem sieci :-)

Python
Python jest fajny, ale mimo wszystko udziwniony ;-) Ja mam zawsze problem gdy w nim pisze przy użyciu notatnika czy czegoś podobnego bo strasznie dużo muszę się napisać i strasznie dużo spacji wstawić czy tabów ;-)
Toż IF z ELSE są straszne:
if number==1:
print("1");
else:
print("coś innego")

4 linijki na 1 prostego IFa to strasznie dużo ;-)
Moja rekomendacja: podpadnę pewnie, ale mimo wszystko, choć momentami jest to przyjemny język to chyba nie warto w niego inwestować zbyt wiele czasu, do WEBa wygodniej użyć np. Java'y, C# czy PHP, do aplikacji okienkowych praktycznie wszystko się lepiej nadaje, pozostają skrypty i np. proste serwerki, miło sobie to pokodować, ale czy jest to opłacalna inwestycja? Wątpię.

C++
C++ jest szybki, elegancki i piekielnie trudny. W C było prościej, w C++ to się komplikuje, szczególnie w sytuacji gdy masz pecha pisać dla MS Windows i używać musisz Microsoftowej notacji węgierskiej......... C++ zyskałby chyba BARDZO dużo gdyby ktoś go ściął w taki sposób, że zamiast 48 typów do trzymania tekstu byłby 1, no może 2 ;-)
Moja rekomendacja: Nie wiem jak wy, ale ja ciągle się chcę C++ nauczyć i to tylko z powodu "bo wypada", i takiego że gdybym chciał np. wziąć udział w pisaniu Firefoksa, OpenOffice.org czy Chrome to musiałbym użyć C++, skoro takie wspaniałe programy są pisane w C++ to ten język musi być wart nauki.

C#
C# jest ble, taki miks Java'y z Delphi, w którym pewnie dla przekory zdecydowano się zastosować inną konwencję nazewniczą i rozwalić wszystko w dziwny sposób po dziwnych bibliotekach przypisując wszystko praktycznie na stałe do jednego systemu operacyjnego [tak, wiem, jest Mono, ale ile znacie aplikacji w .NET, które działają na .NET Frameworku pod Windows i Mono pod Linuksem i wyglądają i działają tak samo?]. Jednak mimo mojej niechęci ;-) muszę przyznać, że C# się stara.
Moja rekomendacja: zagryźć zęby i się uczyć. Tak, człowiek może czuć się odrobinę brudny ;-) ale powiedzmy wprost nie ma prostszego sposobu na mały okienkowy programik niż napisać go w C#. Z jednej strony w miarę czytelny język, z drugiej WinForms, które są po prostu dobre i wygodne. Co ważne gdy umiesz napisać aplikację okienkową w WinForms to prawie natychmiast potrafisz też napisać podobną aplikację na cokolwiek z Windows Mobile [które podobno jest w odwrocie, ale to już inna historia], umiejętność korzystania z ASP.NET też łatwo wchodzi ;-)

Co tam jeszcze jest?

PHP
Moja rekomendacja: zostaw, nie warto, te 8 lat temu to było coś, ale teraz? I nie chodzi o sam język [choć obrzydliwego $ przed zmiennymi mu nie daruję ;-)], a o developerów. Każdy dzieciak, który zakodował więcej iż 100 linii w PHP go "zna", a przez to ktoś kto zna go świetnie i umie w nim czarować [podobno pierwsza wersja GMAILa czy Google Calendar była napisana w PHP] jest automatycznie klasyfikowany do grupy tych wannabe programistów.
Inna sprawa do czego go chcesz używać, przecież do zrobienia prostej stronki sklepu nie będziesz używać kolosów w stylu Java'y czy ASP.NET, zrobisz to elegancko w PHP i użyjesz MySQLa do trzymania danych. Czyli PHP tak jak chcesz robić takie rzeczy. Ja nie chcę więc dla mnie jest na nie :-)

Ruby
Moja rekomendacja: brak zdania, sam język mi się nie podoba, ale to tylko problem "estetyki" i jak będzie trzeba to się go nauczę :-) Inna sprawa, że Ruby jest z nami od 15 lat i nadal nie jest wiodącą technologią [.NET wypłynął w 2002 roku i jest już o wiele bardziej popularny], są jednak Railsy, które mają 5 czy 6 lat i coś tam zrobiły na rynku. Więc nie mam zdania, warto się przyglądać chyba ;-)

Delphi
W Delphi pisałem długo, choć przyznaję, że nieumiejętnie ;-) za dużo w tym było Turbo Pascala, a za mało Object Pascala ;-)
Moja rekomendacja: niby szybkie, niby fajne środowisko, ale chyba sam Borland w nie nie wierzył bo jak jeszcze była ich to zabili Kyliksa i nie ma wersji dla Linuksa [OK, inna sprawa, że się wtedy sam Borland przejechał na tym hypie Linuksowym, kiedy to Linux już miał wchodzić pod strzechy, tylko, że nie wszedł, i teraz nie jest w stanie gonić nawet Mac'a który ma od 4 do 8 razy większy udział w rynku desktopów] przez co jesteś uwiązany/uwiązana do Windows, co w przypadku np. softu serwerowego jest do bani. Bo w pewnym momencie staniesz przed wyborem czy porzucić swój kod i użyć czegoś bardziej przenośnego, czy pisać drugi produkt czy może udać, że poza Windows nic nie istnieje ;-) [OK, jest np. Free Pascal Compiler, czy Lazurus [który chyba jest tym samym, ale głowy nie dam ;-)] ale jakoś szczególnie popularne nie są].

Objective-C
Na Apple bez tego ani rusz. Sam język to tak na pierwszy rzut oka taki mutant z C, C++, C# i Java'y ;-)
Moja rekomendacja: chyba warto, nie znam, ale może to być źródło pewnego dochodu ;-) bo jak chcesz pisać na iPhone'a to nie masz innego wyjścia niż Objective-C [OK, są inne wyjścia, ale nie tak dobre], do tego to jest super ważny język dla MacOS'a.

VisualBasic
Koszmar, zawsze twierdziłem i twierdzę, że jeśli programista ma złe uczynki na sumieniu to po śmierci w piekle będzie programował w VisualBasic'u ;-)
Moja rekomendacja: omijać szerokim łukiem. Jeśli już chcesz to użyj C#. Swego czasu Sun próbował tworzyć [czy kilku inżynierów z Suna raczej] coś w stylu własnego VisualBasica........ na szczęście projekt chyba umarł ;-)


Podobne postybeta
HP7 bez manifestu ;-)
Najkrótsza droga do przyszłości - Polymer ;-)
Java, JavaScript, Python, C++, C#? co ma przyszłość? 7 lat później ;-)
A jednak Pythona warto ;-)
"Kodowanie" na Chrome OS ;-)

wtorek, grudnia 01, 2009

Kalkulator marzeń ;-)

Znalazłem mój kalkulator marzeń ;-) Casio FX-9860G SD


Ma jeden minus, cenę ;-) Mimo wszystko blisko 700 złotych za kalkulator to ciut dużo, a znów na Amazon.co.uk wolę nie kupować bo jednak to elektronika [choć z kosztami transportu będzie kosztował tak na oko i tak z 200 złotych mniej].
Z tą ceną to w ogóle problem jest taki, że byłbym się w stanie przekonać do wydania takiej kwoty na kalkulator... gdyby mi był potrzebny ;-) Ale mimo usilnych starań na razie nie znalazłem dobrego pretekstu ;-)
Dla porównania Algebra FX-2.0 kosztuje od 350-400 złotych, co już jest bardziej rozsądne.

W ramach poszukiwania alternatywy przeglądałem sobie software'owe kalkulatory naukowe dla Androida i posucha straszna. Najwygodniejszym kalkulatorem okazał się Android Scripting Host i jego Python, ale draństwo jest strasznie nieporęczne w używaniu ;-)
Nie mam zamiaru się porywać na pisanie własnego kalkulatora bo jak widzę w przypadku SDK Androida nie umiem się przekonać do pisania, w przypadku Windows Mobile jakoś łatwiej mi to szło ;-)

Ktoś zaproponuje jakieś preteksty, których będę mógł użyć przed swoim sumieniem? ;-)


Podobne postybeta
Kiedy tablet zmieni się w dobry kalkulator?
To (kalkulator) żyje :-)
Kalkulator
Czekamy na kalkulator :-)
Święty Garnek Chłodniczy

czwartek, października 22, 2009

C# i Java okazały się szybsza od Pythona :-) [było Java okazała się szybsza od C# i Pythona]

[update: 15/01/2010 - okazało się, że pomiary dla C# były źle przeprowadzane co zaniżało jego wydajność mniej więcej o 10 razy!!!! Błędnie użyłem DateTime.Now.Ticks zakładając, że zwraca ilość naonsekund, a zwraca ilość ticków, których w nanosekundzie mieści się dziesięć. Niestety nikt tego wcześniej nie zauważył i złe wyniki poszły w świat. [tytuł posta też zmieniony ;-)]]
Nowe wyniki prezentują się tak [wyniki dla procesora Intel Core 2 Duo T6600 2.20 GHz [2 rdzenie 64 bitowe pod 64 bitowym Windows 7]:
C# z .NET 4.0 - 1.17 ms
Java 1.5 z przełącznikiem -server - 1.096 ms
Java 1.6 z przełącznikiem -server - 2.8895 ms
Python 2.6 - 10.88 ms
Z radością jednak odnotowuję, że słuszne były moje przewidywania i słuszne zdziwienie słabym wynikiem C# :-) szkoda tylko, że wszystkiemu winien był taki błąd :-)

[update: 23/10/2009 - dodałem informacje o wynikach programu w C i parę uwag]


Tak nie miałem pomysłu na to co dziś napisać ;-) więc zrobiłem sobie szybki test co jest szybsze [w obliczeniach] Java, Python czy C#, kontrolnie postanowiłem dodać też C :-).
Przyznam, że z języków wykonywanych w wirtualnych maszynach stawiałem na C#.

W każdym z języków napisałem program, którego celem było policzenie numerycznie 1000 razy całki oznaczonej w przedziale od -10 do 10 [niedomkniętym z prawej] w 10000 krokach z funkcji:
f(x)=e-x2

Wynikiem jest coś bliskiego pierwiastkowi z liczby pi [swoją drogą to była rzecz na analizie matematycznej która mnie zachwyciła, całka z funkcji w której użyta jest e, a wynikiem jest pierwiastek z pi, czyli istnieje związek między niektórymi stałymi matematycznymi... może to zrobiło na mnie takie wrażenie bo byłem wtedy świeżo po czytaniu Kontaktu Carla Sagana? :-)].

No i wyniki wyglądają tak [wszystkie czasy dla pojedynczego policzenia całki]:

.


Język/ProcesorAMD Turion64 ML-30*Intel Core Duo 2.16 GHzCeleron 900 MHz [Asus EEE]

.


Cb/d4 ms4 ms

.


Java18 ms10 ms10 ms

.


C# [wyniki powinny zostać prawdopodobnie podzielone przez 10 z racji błędu w programie testowym]45 ms32 ms34 ms

.


Python60-74 ms**27 ms30.5 ms

Przyznam, że byłem zaskoczony. Przed uruchomieniem testów dałbym sobie rękę obciąć za to, że z języków wykonywanych przez maszyny wirtulane wygra C#, bo coś mi się po głowie kołatało, że .NET swobodnie korzysta z koprocesora [kto jeszcze pamięta co to jest? ;-) ja pamiętam, że moją przygodę z PC zaczynałem na komputerze bez koprocesora i że były nawet softwareowe emulatory tegoż :-)], czego Java nie może robić bo jej matematyka zmiennoprzecinkowa nie jest do końca zgodna z tą stosowaną w x86 [dla pewności w przypadku Java'y uruchomiłem jeszcze test z arytmetyką zgodną ze strictfp, i wtedy czas jednej iteracji to 20 ms dla Turiona 64].
A tu proszę, Java okazała się w tym przypadku 2.5-3 raza szybsza od C# :-) i 2.85 do 3.33 razy szybsza od Pythona [testy z Pythonem 3000, czy może 3.1? pokazują, że Python troszkę przyśpieszył].

Do testów użyłem Sun Java 1.6.0_15 [czyli chyba najnowszej], dla Pythona był to ActiveState Python 2.5 i oryginalny Python 2.5 z Python.org, w przypadku .NET użyłem wersji 3.5 z włączoną optymalizacją.

Programy wyglądały tak [umieszczam tylko funkcje obliczające całkę, N=10000, kody źródłowe i wersje skompilowane znajdziecie w archiwum, chętnie poznam Wasze wyniki :-)].

Java:
static double calc() {
double sum = 0;
for (int i=0; i<N; i++) {
double x = 20.0*i/N-10.0;
sum+=Math.pow(Math.E, -x*x)*(20.0/N);
}
return sum;
}

C#:
static double calc() {
double sum = 0;
for (int i = 0; i < N; i++) {
double x = 20.0f * i / N - 10.0f;
sum += Math.Pow(Math.E, -x * x) * (20.0 / N);
}
return sum;
}

Python:
def calc():
sum=0
for i in range(0,N):
x=20.0*i/N-10
sum=sum+math.e**(-x**2)*(20.0/N)
return sum

C:
double calc() {
int i;
double sum = 0;
for(i=0; i<N; i++) {
double x = 20.0*i/N-10.0;
sum+=pow(M_E, -x*x)*(20.0/N);
}
return sum;
}


Przyznam, że jestem pozytywnie zaskoczony wynikiem Java'y :-)
Jest co prawda wolniejsza od C, ale "tylko" o 2.5 raza, w przypadku C vs. C# mamy różnicę prawie 1 rzędu w wydajności, a to już coś.

Wszystkie testy odbywały się na moim laptopie, z procesorem Turion 64ML-30 1.6 GHz ściętym do 800 MHz.

Jak komuś się będzie chciało to prosiłbym o Wasze wyniki :-)



* Turion 64ML-30 o nominalnym taktowaniu do 1.6 GHz, ale softwareowo "obcięty" do 800 Mhz
** ActivePython wydaje się być wolniejszy od "oryginalnego" Pythona.


Podobne postybeta
Skróty klawiszowe
Raspberry Pi to nie jest demon prędkości ;-)
Całkujący Dart ;-)
Książkowy Stack Overflow ;-)
Transport publiczny - moje top i bottom 5 (na dziś :-))

wtorek, września 30, 2008

SSD a programowanie

Jakiś czas temu opisywałem tu moje eksperymenty mające na celu ustalenie trwałości dysków SSD w EEE PC.Jak napisałem w update'cie dyski SSD chronią się przed ciągłym zapisem do tych samych komórek.Przekonałem się o tym jakiś tydzień temu gdy w celu zdobycia danych do pewnego eksperymentu napisałem na EEE PC i uruchomiłem nań program w Pythonie. Program miał na celu wejść na stronę wykop.pl, pobrać listę linków, wejść na każdy z nich i pobrać listę osób które wykopały link i listę osób które go zakopały. Później program zapisywał w pliku danej osoby linkę którą wykopała, lub zakopała. Ogólnie polegało to więc na tym, że program co chwilę otwierał pliki i dopisywał do nich nowe linie...I ciekawa sprawa :-) najpierw wszystko działało całkiem sprawnie, aż od pewnego momentu, od tego momentu wszystko szło szybko, po czym zawisało na kilka-kilkanaście sekund i znów szło szybko :-)Wniosek stąd taki, że programy na EEE PC które intensywnie piszą do tych samych obszarów dysku mogą szybko spodziewać się tego, że dostaną zadyszki i większość czasu spędzą na oczekiwaniu na przeniesienie różnych obszarów dysku na SSD :-)Jak ktoś ciekawy tutaj źródło skanera ;-) Przechodzi teoretycznie przez pierwsze 100 stron wykop.pl i buduje na dysku mapę głosowań użytkowników. W pliku [nazwa usera].digg jest lista linków na które głosował, a pliku [nazwa użytkownika].dugg jest lista linków które zakopał. Przed ewentualnym uruchomieniem programu należy sprawdzić w pliku robots.txt wykopu czy te działania są dozwolone [teraz są].
import urllib2#http://www.wykop.pl/kategoria/wszystkie/1def getText(addr): print addr handler = urllib2.urlopen(addr) s=handler.read() return sdef getLines(addr): #handler = urllib2.urlopen(addr) #s=handler.read().split("\n"); s=getText(addr).split("\n") return sdef getUsers(lines): searchedText = "http://www.wykop.pl/ludzie/" list = []  for i in range(1,len(lines)):  if lines[i].find(searchedText)!=-1:   q=lines[i].find(searchedText)   s=lines[i][q+len(searchedText):]   q2=s.find('"')   item=s[:q2]   print(item)   list.append(item) return list   def analyze(id): addr="http://www.wykop.pl/link/"+id+"/" text = getText(addr) addrLen = len(addr) q=text.find(addr) s=text[q+addrLen:] q=s.find('"') s=s[1:q]+"/" print s linkDigg = addr+s+"/wykopali" diggLines = getLines(linkDigg) diggUsers = getUsers(diggLines) for name in diggUsers:  f=open(name+".digg","a")  f.write(id+"\n")  f.close() linkDugg = addr+s+"/zakopali" duggLines = getLines(linkDugg) duggUsers = getUsers(duggLines) for name2 in duggUsers:  f=open(name2+".dugg","a")  f.write(id+"\n")  f.close()  for i in range(1,100): addr="http://www.wykop.pl/kategoria/wszystkie/"+str(i) print addr s=getLines(addr) print(len(s)) for il in range(1,len(s)):  if s[il].find("linkid")!=-1:   print s[il]   q=s[il].find('"linkid-')+8   s2=s[il][q:]   q=s2.find('"')   id=s2[:q]   print id   analyze(id)
Żeby było zabawniej program zawiera błąd, ale i tak działa ;-) Błąd polega na zbyt dużym obcięciu części adresu potrzebnego do uzyskania listy wykopywaczy i zakopywaczy. Widać jednak wykop.pl potrzebuje w tym miejscu tylko jakichś liter, nie ważne czy takich samych na jakie kieruje usera.


Podobne postybeta
Jak walczyć z gigantycznym kodem w Java'ie, część 1 ;-)
Jak zrobić plik OVPN (dla OpenVPN) w wersji unified format?
Jak nie zapomnieć kupić biletu miesięcznego - revised ;-)
Polowanie na Nexus 4 - wersja automagiczna ;-)
Jak nie zapomnieć kupić biletu miesięcznego ;-)

wtorek, sierpnia 19, 2008

Migracja z blog.pl do blogger.com

Problem: przenieść bloga (NetFun) z blog.pl do Bloggera (Were The Wolf?).Rozwiązanie:Python + Java + Blogger Data API ;-) + ręczne prace wykończeniowe właścicielaNajpierw ręcznie [można nieręcznie, mnie tak było wygodniej], tworzymy plik z linkami do archiwów z poszczególnych miesięcy. Jak nam się za bardzo nie chce ich robić to można użyć takiego schematu:http://.blog.pl/archiwum/?rok=&miesiac=Następnie mając te linki w pliku links.txt używamy takiego skryptu w Pythonie:
import urllib2f = file("links.txt","r");dat = f.read();lines = dat.split("\n")START = ""STOP = ""for line in lines: url=urllib2.urlopen(line) content=url.read() start = content.find(START)+len(START) stop = content.find(STOP) content = content[start:stop] print content
A jego wyjście przekierowujemy do pliku. Na podstawie tego pliku, wiedząc że nowy wpis zaczyna się zawsze od: Podobne postybeta
SSD a programowanie
Jak walczyć z gigantycznym kodem w Java'ie, część 1 ;-)
Migracja do Androida 4.3 zakończona, 3 z 3 urządzeń zaktualizowane ;-)
Mistral czeka na książkę
Airly + Python + Oczyszczacz Powietrza = lepsze oddychanie ;-)

czwartek, kwietnia 17, 2008

Piszemy serwis społecznościowy w Google App Engine

Wczoraj koło 20:30 wpadłem na pomysł sprawdzenia jak dużo czasu potrzeba na zbudowanie systemu społecznościowego w oparciu o Google App Engine ;-)
W taki sposób zaczął powstawać RMKSocial ;-).
Jak na razie RMKSocial ;-) liczy sobie 465 linii kodu w Python'ie, a jego tworzenie trwało jak na razie około 7 godzin.

W tym czasie powstały zręby systemu, czyli wewnętrzna "poczta" oraz profile użytkowników.

Kolejnym etapem będzie dodanie Grup użytkowników [czy też forów] oraz wyszukiwarka użytkowników [teraz by do kogoś napisać lub obejrzeć czyjś profil trzeba znać ID tej osoby ;-)]. W następnym kroku postaram się wprowadzić zabezpieczenia przed niecnymi praktykami ;-) oraz możliwość włączenia otrzymywania powiadomień przez maila.

Wstępna refleksja po zastosowaniu NDD [Needs Driven Development - Development sterowany potrzebami ;-)] do tworzenia RMKSocial ;-) jest taka, że stworzenie systemu społecznościowego to żadna filozofia. Trzeba tylko pamiętać żeby nie ładować się w zabawy z sesją ;-) [której zresztą Google App Engine nie posiada :-)]

Dla zainteresowanych adres mojego profilu w RMKSocial ;-) [trzeba być zalogowanym by móc go obejrzeć ;-)]


Podobne postybeta
Niestraszna mi quota w Google App Engine ;-)
Delete Driven Development ;-)
Jak to rzeczy proste okazują się trudnymi ;-)
Moja możliwa zemsta za zamknięcie Google+ ;-)
Drążek rozporowy i zalety incognito mode ;-)

sobota, kwietnia 12, 2008

Google App Engine - pierwsze wrażenia

Wczoraj przyszło długo oczekiwane [będą ze dwa dni ;-)] zawiadomienie, że mogę już korzystać z Google App Engine.
Jak na razie moja aplikacja jest zastraszająco brzydka i testowa ;-) A wszystko co robi to udostępnienie prostej "Księgi Gości" która bazuje na stworzonym przeze mnie dawno temu edytorze opartym na dHTML.

Na razie moje wrażenia są BARDZO POZYTYWNE. Od dawna czekałem na coś takiego, choć liczyłbym bardziej na oparcie się o Java'e niż Python'a :-) Jednak Python mi nie przeszkadza :-) a to, że na razie jest jedyną wspieraną platformą spowoduje pewnie, że lepiej się go nauczę.

Co do minusów, to niestety lokalny serwer w wersji dla Windows [i chyba dla Linuksa] ma błąd niepozwalającą na użycie katalogów statycznych [czyli takich w których trzymać możemy sobie pliki statyczne, takie jak obrazki, CSSy czy skrypty JavaScript]. Istnieje parę sztuczek jak to obejść, ale żadna nie zadziałała na moim komputerze :-)



Po zdeployowaniu aplikacji możemy bardzo łatwo oglądać jej statystyki, przeglądać logi, operować na datastore, zapraszać nowych developerów i robić inne "fascynujące" rzeczy :-)

Ocena ogólna - CZAD!!!!

Podobne postybeta
Google App Engine i DatastoreTimeoutException
Prefix vs suffix dla ++ i --
Projekty ;-)
[*] najbardziej pusty imotek
GAE zmienia ceny i darmową quota'ę... a ja zmieniam kod ;-)

środa, października 10, 2007

Przerabiamy komputer w grzejnik ;-)

W tym celu należy przekonać procesor by pracował przy jak największym obciążeniu ;-)
Poniżej 4 linijki kodu w Pythonie, które spełniają świetnie rolę pożeracza procesora.

s = 2
while True:
print len(str(s))
s=s**2


Jak to działa? Prosto ;-)
Obliczamy kolejne wyrazy szeregu an = an-12 gdzie a0=2, zamieniamy je w łańcuchy tekstowe i obliczamy ich długość, po czym wyświetlamy tą długość.
Sam doszedłem do ponad miliona cyfr wyniku ;-) a zajęło to grubo ponad 30 minut.

Podobne postybeta
Chromebook i jego wady
JNI i łańcuchy ;-)
Ile wie o Tobie Internet?
AST w akcji - zamieniamy źrodło w Java'ie w "rysunek" ;-)
Roman....

wtorek, października 02, 2007

Python - można i tak ;-)

Kolejna pozycja do kącika filmowego ;-)

Tym razem "Python for Programmer". Nie jest może to najlepsze przedstawienie tego języka, za to dość szybkie i wpada w ucho.
W trakcie oglądania nieocenioną pomocą będzie plik z prezentacją.





Nie da się tego jednak oglądać "na 2 wątku" jak to ma miejsce w Java Puzzlers. Tutaj trzeba całą swoją uwagę poświęcić prezentacji i słowom prowadzącego.
Ale chyba warto.


Podobne postybeta
Niewychowawczy klasyk
Zrobię sobie SCJP ;-)
Java.... a to podobno taki prosty język ;-)
Książkowy Stack Overflow ;-)
Amazon mnie przerasta ;-)

środa, maja 09, 2007

Generator programów

Stworzyłem właśnie genialne narzędzie, które jest w stanie wygenerować w skończonym czasie dowolny program komputerowy w postaci źródłowej jak i binarnej i to napisany w dowolnym języku programowania [narzędzie to umie nawet wygenerować program w nieistniejącym języku, przy czym wygeneruje także kompilator, lub program dla innego procesora i wygeneruje również emulator].
Dla prostoty użycia, tak by generator był w miarę przenośny program tutaj w wersji w Pythonie:

Drobną niedogodnością może być fakt, że program generuje rozwiązania w postaci plików ZIP [choć teoretycznie może wygenerować też JARa, EXEka, JSa, HTMLa, OCXa i multum innych formatów], z których trzeba wybrać ten odpowiedni.....

Np. program w powyższym przypadku wygeneruje pewną liczbę [dokładniej 10 do potęgi 50504452.6 plików ;-)], z których trzeba wybrać ten, lub te odpowiednie [prawdopodobnie dla większości programów które chcemy uzyskać generator wygeneruje więcej niż jedno poprawne rozwiązanie].

[Tak to jest dowcip ;-) i raczej długo jeszcze nie będzie komputera który będzie w stanie wykonać ten program.... a w ogóle w programie jest błąd ;-) kto go umie wskazać? ;-)]


Podobne postybeta
Potfór ;-) czyli generator z yield w Java'ie
Tunel... ciąg dalszy ;-)
Pole niemocy twórczej ;-)
Informacja źródłowa
Dalsze zachwyty nad C++ ;-)

niedziela, kwietnia 29, 2007

&quot;Doskonalenie&quot; upolskawiacza ;-)

W ramach prób udoskonalania mojego upolskawiacza, który jak pisałem w jednym z poprzednich postów miał skuteczność około 56-57% przyjrzałem się jego kodowi i zauważyłem, że niestety działał tylko dla słów w których maksymalnie występowały 2 polskie litery ;-)Poprawienie go w taki sposób by był w stanie obsłużyć też słowa z większą ilością polskich znaków spowodowało raczej niewielki wzrost jego wydajności do 60% ;-) Za to czas pracy skoczył o kilka razy [tutaj akurat pomiar całkowicie subiektywny ;-)].Dość poważną przeszkodą poza faktem, że próbujemy na podstawie probabilistycznego modelu języka odtworzyć brakującą informację, jest to że po prostu słabo znam Pythona ;-) Ale najszybszą metodą nauki jest rozpoznanie przez walkę ;-)


Podobne postybeta
Testowanie upolskawiacza
Kombatanctwo JavaScript'owe ;-)
Nieudany eksperyment ze stworzeniem Blogger Backup'a :-)
Oszukałem się ;-)
"Pokolenie nihilistów"