Der Programmier-Thread

Habe mich heute das erste mal etwas intensiver mit Android Development beschaeftigt. Ok, ich wusste es ist die Sprache Java und es gibt irgendwie Activities etc, aber das wars dann schon.

Erst mal Android Training durchgelesen und eine erste App erstellt. Im Grunde nichts neues, ist schnell zu verstehen... erinnert ein wenig an Webentwicklung aber es kommt immer wieder die Java-Krankheit durch aka XML-Hoelle und etwas Over-Engeneering, aber ich habe schon Schlimmeres gesehen. Der Android-Emulator ist Arschlangsam verglichen mit dem iOS-Simulator.

Eclipse hat mir dann auch nicht mehr gefallen und hab die Android-Integration von Intellij ausprobiert. Macht etwas mehr Spass. Hab dann versucht eine GUI zu bauen - haendisch mit XML... joaeeeeeoo.. :ugly:



Hab mich da jetzt nicht an irgendwelche Styleguides gehalten, weil ich die mir noch gar nicht angeschaut habe. Ich finde so wie es hier gemacht ist, macht es die ganze Sache auch nicht unbedingt leicht sich an die Styleguides zu halten, man muss sehr viel selber beachten. Apple gibt hier etwas mehr Hilfestellung. Ok. Es ist nicht die spassigste Entwicklererfahrung die ich jemals hatte, aber ich denke es ist Ok um GUIs zu bauen, wenn man etwas Uebung hat. Natuerlich fuehle ich mich in Xcode und Objective-C wohler, habe damit deutlich mehr gemacht...

Das wahrscheinlich Besonderste hinter Android ist wahrscheinlich das Konzept mit Activities und Intents. Eine Activity ist eine Java-Klasse die, soweit ich das verstanden habe, eine Sicht auf dem Smartphone repraesentiert, die der User gerade sieht. Jede andere "Seite" wird in der Regel in einer eigenen Activity beschrieben. Andere Activities ruft man auf, indem man Intents erstellt. Intent-Objekte definieren wie der Name wohl sagt die Intention eine Activity aufzurufen.

So kann man in meiner App von einem Screen zum naechsten wechseln, wenn man auf den Ok-Button tippt:
Code:
        Intent intent = new Intent(this, ResultActivity.class);
        startActivity(intent);
D.h. Intents werden praktisch verwendet um andere Views innerhalb der eigenen Anwendung aufzurufen. Der Witz ist jetzt, dass Intents auch verwendet werden um Activities anderer Apps aufzurufen. Dabei muss man nicht mal die andere App genau kennen, man kann z.B. die Intention ausdruecken eine bestimmte URL aufrufen zu wollen, oder ein Bild zu oeffnen... oder eine Mail verschicken zu wollen... oder eine Nummer zu waehlen... oder Text/Bild in einem Social Network zu sharen... ja sogar ein Bild von der Kamera aufzunehmen... wofuer iOS teilweise eigene APIs hat, basiert in Android das alles auf dem gleichen System: Man erstellt ein Intent-Objekt mit bestimmten Parametern und setzt es ab. Das macht die ganze Geschichte natuerlich etwas flexibler und erklaert die bessere Integration von Android-Apps untereinander.

Will ich eine Webseite aufrufen, macht man folgendes:
Code:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.onpsx.de"));
startActivity(intent);
Apps koennen in einer Manifest-Datei definieren, dass sie bestimmte Intent-Typen unterstuetzen. Eine App kann definieren, dass sie HTTP-URLs oeffnen kann... oder Bilder... etc. etwas aehnliches hat iOS auch in Form von "welche Dateitypen kann ich als App oeffnen"... aber das System mit den Intents geht etwas weiter: Eine App kann definieren, dass sie E-Mails verschicken kann, oder Custom Webbrowser die den System-Browser ersetzen etc...

Mit einem Intent kann man Bilder von der Kamera aufnehmen, es startet die entsprechende Activity die Kamera-Bilder aufnehmen kann (was man wahrscheinlich auch durch eine andere App ersetzen koennte?):

Code:
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, 0);


...und das Bild dann auslesen... Intents kann man Parameter mitgeben, eine Activity einer ganz anderen App kann aufgerufen werden, und diese kann wiederum Resultate zurueckliefern, so wie hier das Bild:
Code:
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK && requestCode == 0) {
            Bundle bundle = data.getExtras();
            Bitmap bitmap = (Bitmap)bundle.get("data");

            ImageView imageView = (ImageView)findViewById(R.id.user_picture);
            imageView.setImageBitmap(bitmap);
        }
    }
Jetzt wird mein Bild angezeigt:



Wenn ich auf den Button klicke, rufe ich eine andere Activity auf. Dazu erzeuge ich eine neue Intent und gebe die eingegebenen Werte als Parameter mit:
Code:
        Intent intent = new Intent(this, ResultActivity.class);
        intent.putExtra("firstName", ((EditText)findViewById(R.id.firstName)).getText().toString());
        intent.putExtra("lastName", ((EditText)findViewById(R.id.lastName)).getText().toString());
        intent.putExtra("age", ((EditText)findViewById(R.id.age)).getText().toString());
        startActivity(intent);


Diese neue Activity kann die Parameter auswerten und ist eigentlich ziemlich entkoppelt von der ersten Activity:
Code:
        Intent intent = getIntent();
        String firstName = intent.getStringExtra("firstName");
        String lastName = intent.getStringExtra("lastName");
        String age = intent.getStringExtra("age");

        TextView textView = (TextView)findViewById(R.id.result_text);
        textView.setText("Thank you " + firstName + "! Your full name is " + firstName + " " + lastName + " and you are " + age + " years old." );
Jede Activity wird, egal ob von extern oder intern, immer durch ein Intent-Objekt aufgerufen. Dieses Intent-Objekt kann die Activity mit getIntent() ermitteln und so die Intent-Parameter auslesen. Wenn der User auf dem Homescreen auf ein Icon klickt um eine App zu starten, wird auch ein Intent-Objekt erzeugt. Das ganze macht alles irgendwie Sinn.

Danach habe ich mich mit Notifications beschaeftigt. Auch hier spielen Intents eine Rolle. Man gibt der Notification eine Intent-Instanz mit, die angibt was passieren soll wenn der User auf die Notification tippt. In meinem Beispiel rufe ich onpsx mit dem Webbrowser des Users auf:
Code:
        Intent newIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.onpsx.de"));

        NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notification = new Notification.Builder(getApplicationContext())
                .setSmallIcon(R.drawable.onpsx)
                .setContentTitle("Hey you!")
                .setContentText("Visit OnPSX...")
                .setContentIntent(PendingIntent.getActivity(this, 0, newIntent, 0))
                .build();

        nm.notify(1, notification);


Intents everywhere.
 
Wow, ein wunderschöner Einblick ~notbad~

Diese Intent Geschichte ist in der Tat eine schöne Lösung, um alles miteinander zu verbinden. Ich hab mir das ewig nicht angesehen, aber muss man nach dem XML File Änderungen den Simulator anwerfen, oder gibt es eine Vorschaufunktion?

Hast du dich mal mit dem Storyboardingfeature bei iOS auseinandergesetzt? Taugt es was?
 
Wow, ein wunderschöner Einblick ~notbad~

Diese Intent Geschichte ist in der Tat eine schöne Lösung, um alles miteinander zu verbinden. Ich hab mir das ewig nicht angesehen, aber muss man nach dem XML File Änderungen den Simulator anwerfen, oder gibt es eine Vorschaufunktion?
Die Entwicklung mit dem Emulator ist insofern ok, weil er die ganze Zeit im Hintergrund offen bleiben kann. Wenn man in der IDE auf Run klickt vergehen etwa 3-4 Sekunden bis die App im Emulator neu erscheint, ist also noch in einem hinnehmbaren Rahmen, wirkt nur ein wenig langsamer wie unter Xcode.

IntelliJ hat eine Echtzeit-Vorschau, wenn man links den XML-Code bearbeitet erscheint sofort rechts ein Screenshot wie die GUI ausschaut:


Unter Eclipse gibts sogar einen richtigen GUI-Editor:


Soweit ich das beurteilen kann ist das vergleichbar mit anderen Java/Windows GUI-Editoren... eigentlich ganz ok. Die polished Wirkung eines Interface Builders hat das aber natuerlich nicht... Interface Builder ist nochmal eine ganz andere Klasse, vor allem seitdem es Storyboards gibt...

Hast du dich mal mit dem Storyboardingfeature bei iOS auseinandergesetzt? Taugt es was?
Storyboards sind echt klasse. Wenn man sich ein wenig damit beschaeftigt, will man eigentlich nichts anderes mehr. Man dann die komplette GUI konsistent und uebersichtlich entwickeln, und die Beziehungen der Screens untereinander.

Hab vor einigen Wochen mal versucht Teile der OnPSX-App in Storyboards umzuwandeln, und konnte echt wieder einiges an Boilerplate-Code einsparen:
 
Hat sich erledigt, hab einen Bug gefixt, den ich gar nicht gesucht hatte.

Ich habe ein Problem mit einer C++ std::map. In dieser verwalte ich paare von IP Adressen und Ports. Die Anzahl der Elemente in solch einer Liste, verwende ich zum Beispiel, um die Anzahl der aktiven Server zu sichern.

Daher gibt es eine add und eine remove Methode, sowie getSize, um Paare hinzuzufügen und zu entfernen. Sowie einige weitere Servicemethoden.

Nach einigen tausend Sekunden Laufzeit, komme ich an einen Punkt in meiner Simulation, wo mein Energieverbrauch seltsamerweise höher wird, als die Maximallast sein kann.

Ich hab nach einiger Zeit des Debuggens nun gemerkt, dass meine Liste mit den Servern sich in folgenden Schritten ändert:

6 -> 5 -> 19 -> 24 -> etc.

An nur zwei Stellen verwende ich add und remove, d.h. es können keine neuen Elemente hinzugekommen sein.

Gibt es bei der Map vielleicht irgendwelche Nebeneffekte die dazu führen, dass sich die Größe ändert? Wie gehe ich das debuggen solch eines Fehlers an?

Code:
//
// ServiceMaps are used to save an ip address of a
// service plus the port number which is used for
// this service, i.e., 80 for htttp, 21 for ftp etc.

#ifndef SERVICEMAP_H_
#define SERVICEMAP_H_

#include <map>
#include <IPvXAddress.h>
#include <memory>

class ServiceMap {
protected:
	typedef std::map<IPvXAddress, int> Services;
	typedef Services::const_iterator service_iterator;
	service_iterator begin() {return services.begin();}
	service_iterator end() {return services.end();}
	Services services;
public:
	ServiceMap() {};
	virtual ~ServiceMap() {};

	/*
	 * Adding a VM with addr and port to the map.
	 */
    virtual void addVM(IPvXAddress addr, int serviceport);

    /*
     * Removing a VM with addr and port from the map.
     */
    virtual void removeVM(IPvXAddress addr);

    /*
     * Get number of the elements in the map.
     */
    virtual int getSize();

    /*
     * Get ip address for it's position in map.
     */
    virtual IPvXAddress getIPAddress(int position);

    /*
     * Get the port connected to an ip address.
     */
    virtual int getPortForAddress(IPvXAddress addr);

    /*
     * Returns a new ServiceMap which includes only the elements with
     * the given port number.
     */
    virtual std::auto_ptr<ServiceMap> getVMsWithPort(int serviceport);

    /*
     * Returns a new ServiceMap which includes all the elements which
     * can't be found in the otherMap.
     *
     * This means that the size of otherMap has to be bigger than this map.
     */
    virtual std::auto_ptr<ServiceMap> getVMsNotInOtherMap(ServiceMap *otherMap);

    /*
     * Returns true if a given ip address can be found in this map.
     */
    virtual bool findIPAddress(IPvXAddress addr);

    /*
     * Returns true if there are vms with given port in the map.
     */
    virtual bool isThereFreeVMForService(int serviceport);
};

#endif /* SERVICEMAP_H_ */
Code:
#include "ServiceMap.h"

void ServiceMap::addVM(IPvXAddress addr, int serviceport) {
	services[addr] = serviceport;
}

void ServiceMap::removeVM(IPvXAddress addr) {
	Services::iterator it;
	it = services.find(addr);
	if (it != services.end())
		services.erase(it);
}

int ServiceMap::getSize() {
	return services.size();
}

IPvXAddress ServiceMap::getIPAddress(int position) {
	if ((int)services.size() < position) {
		opp_error("Position of element bigger than ServiceMap.");
	}
	Services::iterator it(services.begin());
	std::advance(it,position);
	return it->first;
}

int ServiceMap::getPortForAddress(IPvXAddress addr) {
	return services[addr];
}

std::auto_ptr<ServiceMap> ServiceMap::getVMsWithPort(int serviceport) {
	//ServiceMap *vmsWithPort = new ServiceMap();
	std::auto_ptr<ServiceMap> vmsWithPort(new ServiceMap());
	for (service_iterator it = this->begin(); it != this->end(); it++) {
		if (it->second == serviceport) {
			vmsWithPort->addVM(it->first, it->second);
		}
	}
	return vmsWithPort;
}

std::auto_ptr<ServiceMap> ServiceMap::getVMsNotInOtherMap(ServiceMap *otherMap) {
	if (otherMap->getSize() > this->getSize()) {
		opp_error("Given map is too big to find elements.");
	}
	//ServiceMap *vmsNotInOtherMap = new ServiceMap();
	std::auto_ptr<ServiceMap> vmsNotInOtherMap(new ServiceMap());
	for (service_iterator it = this->begin(); it != this->end(); it++) {
		if (!otherMap->findIPAddress(it->first)) {
			vmsNotInOtherMap->addVM(it->first, it->second);
		}
	}
	return vmsNotInOtherMap;
}

bool ServiceMap::findIPAddress(IPvXAddress addr) {
	Services::iterator it;
	it = services.find(addr);
	if (it != services.end())
		return true;
	else
		return false;
}

bool ServiceMap::isThereFreeVMForService(int serviceport) {
	//ServiceMap *vms = this->getVMsWithPort(serviceport);
	std::auto_ptr<ServiceMap> vms(this->getVMsWithPort(serviceport));

	if (vms->getSize() == 0) {
		//delete vms;
		return false;
	} else {
		//delete vms;
		return true;
	}
}
 
Zuletzt editiert:
Kennt sich hier jemand mit Matlab aus und kann mir helfen, warum mein Bar Graph die Daten nicht "stacked"?

Code:
hv_busy =0.87;
hv_off = 0.3;
hv_idle = 0.3;
hv_powerDown = 0.2;
hv_powerUp = 0.5;

hv = [hv_busy; hv_off; hv_idle; hv_powerDown; hv_powerUp];

figure(1)

bar(hv, 'stack');
 

crack-king

Administrator
Team-Mitglied
systems, systems, systems, systems, systems, systems
Wie du am besten loslegst? Geh zur Vorlesung ;)

Aber wie spy schon sagt. Was denn jetzt genau? C oder C++? Ist halt nicht das selbe oder ähnlich, sondern doch ziemlich anders. Gibt aber durchaus Bücher. Aber ich denke, wenn du die Vorlesung besuchst, die Übungen machst und dann zuhause mal 1-2 Sachen ausprobierst, sollte das klappen.
 
Zuletzt editiert:
PSN-Name: leckt mich an meinem haarigen hintern ihr haufen!
Spielt gerade: perl(pc); div. KOFs (ps3); GT6(ps3); sfIV(div.);
zumal es zu beiden genug tutorials im internet gibt. wobei der einstieg in c++ leichter sein dürfte.

also such dir ne schicke ide und ab geht er...

auch: selber lappen (so jetzt hab ichs dir gegeben und zwar kanall hart!)
 
PSN-Name: leckt mich an meinem haarigen hintern ihr haufen!
Spielt gerade: perl(pc); div. KOFs (ps3); GT6(ps3); sfIV(div.);
o_O mhhh da ich c nur vom atari (mittelmäßige ides, stranges library wirrwarr) kenne und c++ nur vom pc mag sein das meine eindrücke da etwas verquer

wobei sich jetzt die basisgeschichten nicht viel nehmen dürften. also was ich als c++ mist für maschienenbau kenne war jetzt relativ simpel und schnell zu durchschauen und umzusetzen dafür das ich seit jahren kein c++ angerührt hatte. bei c peil ich immer wieder rum.
 
PSN-Name: chrizeliq
Es kommt halt drauf an was du unter C++ verstehst, es gibt sehr viele die C++ programmieren und es eigentlich nur wie ein C mit Klassen verwenden. Modernes C++ wie es sich in den letzten Jahren entwickelt hat, geht aber deutlich weiter. Das ganze faengt ja schon bei einem einfachen Hello World an.

C
Code:
#include <stdio.h>
 
int main(void)
{
    puts("Hello world!");
}
C++
Code:
#include <iostream>
 
int main()
{
    std::cout << "Hello, World!" << std::endl;
}
Was soll std::cout sein? Was bedeutet das <<? Das sieht nicht aus wie ein einfacher Funktionsaufruf. Was macht << std::endl und wieso kann das funktionieren? Als Anfaenger wirst du in C++ schon von Anfang an mit etwas konfrontiert, was du wahrscheinlich erst deutlich spaeter kennen lernst: Operator Overloading und IOStreams... dabei fangen wir gar nicht erst mal mit Templates & Co an... dagegen gibt es in C nur einfache Funktionsaufrufe. puts("Hello world!") ist eine puts-Funktion die den String "Hello world!" auf dem Bildschirm ausgibt. Total einfach und verstaendlich. Und C als Sprache ist extremst simpel, jemand der schon andere Programmiersprachen kennt wird sich damit gut zurecht finden - das einzig kompliziertere Thema sind Pointer, ansonsten ist C total simpel. Im Vergleich dazu hat C++ unzaehlige teilweise sehr komplizierte Features, die man alle lernen oder zumindest verstehen muesste: Templates, Operator Overloading, Klassen mit Mehrfachvererbung, Namespaces, Functors, Smart Pointer, Stack vs Heap Objekte, Exceptions, Referenzen etc.

Wobei ich C++ nicht schlecht machen will. Ich mag C++ fuer das was es ist. Als Anfaenger wuerde ich nur immer mit einfachem C anfangen...
 
PSN-Name: leckt mich an meinem haarigen hintern ihr haufen!
Spielt gerade: perl(pc); div. KOFs (ps3); GT6(ps3); sfIV(div.);
das letzte mal das ich c++ unter den fingern hatte ist jetzt erst 2 jahre und ich fand mich relativ schnelle wieder zurecht. zumindest in den basis geschichten ausgabe, schleifen usw.. wenn du hier gleich mit so einem knaller beispiel kommst um die leute zu verschrecken, kann ich nichts dafür. wäre mir auch neu das in den info ergänzungsprüfungen 'syntaxreinheit' verlangt wird. ein einfaches printf häts hier auch schon getan o_O (also mal ganz abgesehen das dein c bsp. in c++ genauso funktioniert... (include anweisung mal außen vor gelassen)) => damit wären wir wieder bei c/c++ geschichte (mit anderen worten dein einführungssatz ist das entscheidende)

bei c denke ich wie gesagt eher an standard wirrwarr und komische .h dateien bauen. etwas was mir bei c++ damals nicht so auf die füße viel (wobei ich es auch ziemlich schnell gelassen hab... aber meine erfahrungen sollten für die hier gestellten anforderungen reichen!)

auch: ich denke das geht viel zu weit für den guten ginjin
 
PSN-Name: leckt mich an meinem haarigen hintern ihr haufen!
Spielt gerade: perl(pc); div. KOFs (ps3); GT6(ps3); sfIV(div.);
naja c++ beinhaltet (komplett?) halt c... allein deswegen bleibe ich bei meiner behauptung

/edit: gibt es überhaupt noch reine c compiler?
 
systems, systems, systems, systems, systems, systems
PSN-Name: GinJin_b2k
Spielt gerade: Gran Turismo Sport
ok im curriculum steht nur das:

Die Programmiersprache C ist weit verbreitet insbesondere für technische, technisch-wissenschaftliche, schnelle industrielle und eingebettete Anwendungen sowie bus- und netzwerkbasierte Kommunikationslösungen. In der Vorlesung wird die algorithmische Methodik eingeführt und deren prozedurale Umsetzung in die Programmiersprache C vorgestellt. Die Technik des modularen und strukturierten Programmaufbaus wird an ausgewählten Beispielen demonstriert. Inhaltsübersicht:
- Einführung;
- Algorithmen, Top-Down- und Bottom-Up-Entwurf;
- Vom Algorithmus zum Programm, Aufgabe von Präprozessor, Übersetzer und Binder;
- Atomare Datentypen und deren Ein- und formatierte Ausgabe;
- Ausdrücke und Anweisungen;
- Felder;
- Funktionen;
- Einfache Such- und Sortierverfahren;
- Strukturen;
- Zeiger und Adressen;
- Dynamische Speicherreservierung und Speicher-Management-Funktionen;
- Einfache dynamische Datenstrukturen: Listen, Kellerstapel, Warteschlangen.
 
Das sind diese Kurse, wo man in einem Semester etwas zusammen pfuscht und danach genau so schlau ist wie zuvor. Hatte ich zumindest bei unserer Algodat und OOP Vorlesung so erlebt. Aber auf Didaktik in Sachen Programmierung an Hochschulen geh ich jetzt besser nicht ein ~happy~
 
Top