Author Archives: lukas - Seiten 2

RaspberryPi :: uninstall unused software

Der RaspberryPi muss früher oder später mit einem Bootimage versehen werden. Nimmt man das angebotene Debian Wheezy, ist allerhand Software bereits installiert, die man nie verwenden wird. Hier ein Fileserver – dort wird die grafische Oberfläche nicht benötigt – der RPi wird nur per SSH bedient.

Eine kleine Einführung habe ich hier gefunden, die ich etwas erweitert habe mit weiteren Deinstallationen.

von http://www.stefan-seelmann.de/wiki/rasperrypi-homeserver

apt-get purge --auto-remove scratch
apt-get purge --auto-remove debian-reference-en dillo idle3 python3-tk idle python-pygame python-tk
apt-get purge --auto-remove lightdm gnome-themes-standard gnome-icon-theme raspberrypi-artwork
apt-get purge --auto-remove gvfs-backends gvfs-fuse desktop-base lxpolkit netsurf-gtk zenity
apt-get purge --auto-remove mupdf gtk2-engines alsa-utils lxde lxtask menu-xdg gksu
apt-get purge --auto-remove midori xserver-xorg xinit xserver-xorg-video-fbdev
apt-get purge --auto-remove libraspberrypi-dev libraspberrypi-doc
apt-get purge --auto-remove dbus-x11 libx11-6 libx11-data libx11-xcb1 x11-common x11-utils
apt-get purge --auto-remove lxde-icon-theme
apt-get purge --auto-remove python3 python3-minimal python3-numpy python-pifacecommon
apt-get purge --auto-remove python2.7-minimal python2.7 python-rpi.gpio python-minimal python
apt-get purge --auto-remove desktop-file-utils git-core git-man git java-common omxplayer penguinspuzzle wireless-tools

danach ist die nicht auf die ganze SD-Karte ausgeweitete Speichernutzung folgendermaßen:

pi@raspberrypi ~ $ df
Filesystem     1K-blocks   Used Available Use% Mounted on
rootfs           2786872 735168   1910136  28% /
/dev/root        2786872 735168   1910136  28% /
devtmpfs          216108      0    216108   0% /dev
tmpfs              44876    216     44660   1% /run
tmpfs               5120      0      5120   0% /run/lock
tmpfs              89740      0     89740   0% /run/shm
/dev/mmcblk0p1     57288  18560     38728  33% /boot

weitere Software, die man noch deinstallieren könnte findet man mit folgendem Befehl:

dpkg --get-selections | grep -v deinstall

FYI:

pi@raspberrypi ~ $ uname -a
Linux raspberrypi 3.6.11+ #538 PREEMPT Fri Aug 30 20:42:08 BST 2013 armv6l GNU/Linux

keine Angst weil sämtliche Desktop und X11 Komponenten deinstalliert werden, der RPi gibt weiterhin per HDMI die Konsole aus (wichtig für Debugzwecke beim Bootvorgang)

Mein Raspberry startet jetzt in 24 Sekunden … leider weiß ich nicht wie es vorher war, aber ich denke hier ist der Unterschied eher gering.

VN:F [1.9.22_1171]
Rating: 5.0/5 (4 votes cast)
VN:F [1.9.22_1171]
Rating: +2 (from 2 votes)

Gimp :: Ein bisschen Spaß mit dem Vorderrad

Ich finde es ja ziemlich erschreckend, dass Mercedes jetzt ihren Bereich „Vorderradantrieb“ weiter ausbaut. Das schlimmste Beispiel hierfür ist der CLA.
Ich habe zum Spaß einfach mal mit Gimp das Vorderrad „rutschen“ lassen … macht euch selbst ein Bild (wie auch immer man dies deuten mag) 😉

So wird er heute gebaut:
 in

so denke ich wird er in Zukunft gebaut werden (zum Beispiel die AMG Variante, es muss Gewicht auf die Vorderachse sonst macht der ganze Motor ja keinen Sinn):
 in

und so würde ich ihn bauen:
 in

Und nein das letzte ist kein BMW, wie ich schon mehrfach gefragt wurde …

Quelle des ersten Bildes: http://www.heise.de/autos/artikel/Jugendliebe-1825213.html

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

RaspberryPi :: Fileserver

Ich habe mir einen Raspberry Pi besorgt um diesen als Fileserver einzusetzten. Hierfür habe ich eine externe USB 2.0 HDD angeschlossen, auf der die Files abgelegt werden.

1) Raspberry Pi einrichten:

sudo raspi-config
sudo apt-get install samba samba-common samba-common-bin
sudo apt-get install vim
sudo apt-get install fuse ntfs-3g

2) neuen Benutzer anlegen:

sudo useradd -G users NAME

das Samba Passwort muss extra gesetzt werden:

smbpasswd - U NAME

3) Externe HDD einbinden

Da meine HDD mit NTFS formatiert ist musste ich noch folgendes Programm installieren:

sudo apt-get install cifs-utils

Jetzt ist es nötig ein Verzeichnis anzulegen, in welches die Festplatte eingebunden werden soll. Danach muss das Verzeichnis noch der Gruppe „users“ zugeordnet werden, damit diese Zugriff erhalten.

sudo mkdir /daten/server
sudo chgrp users -R /daten

danach die Festplatte in die „fstab“ Datei eintragen, damit sie automatisch gemountet wird

sudo vim /etc/fstab

ich habe folgendes eingetragen:

UUID=3C58E62B58E5E39C   /daten/server   ntfs    users,rw        0       0

die UUID kann so herausgefunden werden (gibt auch gleich Auskunft über das Device, bei mir „/dev/sda1“:

blkid

die Konfiguration kann getestet werden:

sudo mount -a

4) Samba Konfiguration anpassen:

sudo vim /etc/samba/smb.conf

dort dann nach „[printers]“ suchen, darüber für jede Freigabe folgendes einfügen:

[daten]
   comment = Daten
   browseable = yes
   path = /daten/server
   valid users = @users
   force group = users
   create mask = 664
   directory mask = 0775
   read only = no

danach Samba Service neustarten:

sudo service samba restart

5) Optional :: Debian – Package aus CVS Sourcen erzeugen

(Dieser Punkt kann überspruchen werden, also direkt weitermachen bei 6.)

Ist das alles geschaft hat man schon weitere Ansprüche an das System. Man verwendet ja nicht ohne Grund einen Raspberry Pi als Fileserver – man will Strom sparen. Das ist ja alles schön und gut, aber die externe 3.5″ HDD läuft einfach munter weiter, auch wenn kein User diese momentan verwendet. Abhilfe schaft hier das Programm „hd-idle“ welches zuerst kompiliert werden muss oder von hier (ganz unten) runterladen. Ich habe die bei mir auf dem Raspberry (Debian wheezy, Version 2013-02-09) kompilierte Datei angehängt.

Das Programm herunterladen mit einem CVS Client (der erste CVS Befehl muss einfach bei der Passwortabfrage mit ENTER bestätigt werden -> kein Passwort)

sudo apt-get install cvs
cvs -d:pserver:anonymous@hd-idle.cvs.sourceforge.net:/cvsroot/hd-idle login
cvs -z3 -d:pserver:anonymous@hd-idle.cvs.sourceforge.net:/cvsroot/hd-idle co -P hd-idle

um jetzt ein eigenes Debian Pakacke zu erzeugen benötigt man folgendes Programm

sudo apt-get install debhelper

danach das Paket erzeugen (zuerst in das neu angelegte Verzeichnis „hd-idle“ wechseln:

cd hd-idle
sudo dpkg-buildpackage -rfakeroot

Die fertig kompilierte Datei befindet sich ein Verzeichnis höher.

6) hd-idle installieren

Archiv des schon erzeugten Debian Packages: hd-idle_1.04.tar
falls Punkt 5) übersprungen wurde, dann einfach die verlinkte Datei auf den Raspi laden.
hd-idle installieren, anschließend den Service starten und den Autostart des Programms vorbereiten:

sudo dpkg -i hd-idle_*.deb
sudo service hd-idle start
sudo update-rc.d hd-idle defaults

getestet werden kann hd-idle folgendermaßen (Dieser Befehl setzt für die Festplatte „sda“ eine automatische Abschaltung nach 10s, mehrere Festplatten können mit einem weiteren „-a …“ hinten angefügt werden):

hd-idle -i 0 -a sda -i 10

Jetzt will man diese Prozedur natürlich nicht nach jedem reboot neu starten, daher automatisieren wir dies:
Also editieren wir die Konfigurationsdatei:

sudo vim /etc/default/hd-idle

und ändern ganz oben die Zeile in folgende:

START_HD_IDLE=true

und fügen ganz am Ende der Datei einen zu oben ähnlichen Befehl ein (auch hier ist die vom Mounten bekannte UUID notwendig, damit die Festplatte immer richtig angesprochen wird, auch wenn sich einmal der USB Port ändern sollte):

HD_IDLE_OPTS="-i 0 -a /dev/disk/by-uuid/3C58E62B58E5E39C -i 900"

7) Sicherheit erhöhen

Standardmäßig hat der Benutzer „pi“ das Passwort „raspberry“. Dieses muss geändert werden, zudem ist es nicht sinnvoll keine Passwortabfrage bei der Eingabe von „sudo“ zu bekommen.
Um dies zu ändern folgenden Befehl ausführen:

sudo visudo

hier habe ich folgende Zeilen geändert:

root    ALL=(ALL:ALL) ALL
lukas   ALL=(ALL:ALL) ALL
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

und die wichtigste:

#pi ALL=(ALL) NOPASSWD: ALL

Anhang

hd-idle_1.04.tar

VN:F [1.9.22_1171]
Rating: 5.0/5 (3 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 2 votes)

Windows 7 :: Loginvorgang bei neuinstalliertem System dauert ewig

Wer kennt es nicht, Windows 7 ganz neu installiert – ein paar Grundkonfigurationen wie Sounds aus und Hintergrund schwarz schalten. Beim nächsten Hochfahren wundert man sich, dass auf einmal der Loginvorgang eine gefühlte Minute dauert (nachgemessen 30 Sek.).

Behoben kann der Fehler mithilfe eines Hotfixes von Microsoft. Dieser wird benötigt, da ein Fehler auftritt wenn man kein Hintergrundbild gewählt hat.

Hier der Link zum Download:

Hotfix KB 977346

irgendwie ein lustiger Fehler oder? =)

VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

SSD Vergleichtest :: ADATA gegen INTEL

Ich habe mir die beiden SSDs ADATA S511 und INTEL 330 gekauft. Danach habe ich beide an meinen PC angeschlossen, der folgende Konfiguration hat:

  • Intel Core i5-2500K (nicht übertaktet)
  • Asus Mainboard mit SATA-6G
  • 4 GB RAM

Gemacht wurde der Benchmark mit AS SSD Benchmark (kann hier kostenlos downgeloaded werden)

ADATA S511:
As-ssd-bench-ADATA-300x298 in

Intel 330
As-ssd-bench-INTEL-300x298 in

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: +1 (from 1 vote)

Automatic execute on startup :: Debian Linux (Raspberry Pi)

I’ve got a Raspberry Pi with connected camera. When the Pi boots up there should be executed a script which starts the camera software.

You must create an new file in /etc/init.d/ and then add the following content:

# /etc/init.d/startcam

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    /home/pi/start.sh
    ;;
  stop)
    pkill webcam
    echo "stopped"
    ;;
  *)
    echo "Usage: /etc/init.d/startcam {start|stop}"
    exit 1
    ;;
esac

exit 0

then make the file executeable

sudo chmod +x /etc/init.d/startcam

to test your script, you must be shure that it isn’t active

ps -ef | grep webcam

then start the script using

sudo /etc/init.d/startcam start

or just reboot your computer and check once again if your script is active.

VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: +2 (from 2 votes)

OpenCV :: Kinect VideoCapture data in IplImage

To use functions in OpenCV like cvSmooth or cvAdaptiveThreshold you must have the data of your VideoCapture in an IplImage object.

VideoCapture capture;
Mat grayImage;
IplImage *imgSrc, *imgResult;

imgSrc = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);
imgResult = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);

capture.open(CV_CAP_OPENNI);
if (!capture.isOpened()) {
	cout << "Can not open a capture object." << endl;
	return -1;
}
capture.set(CV_CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, CV_CAP_OPENNI_VGA_30HZ);

for(;;) {
	if (!capture.grab()) {
		cout << "Can not grab images." << endl;
		return -1;
	}
	else {
		if (capture.retrieve(grayImage, CV_CAP_OPENNI_GRAY_IMAGE)) {
			imgSrc->imageData = (char *) grayImage.data;
			cvShowImage("Source", imgSrc);

			cvSmooth(imgSrc, imgResult, CV_BLUR, 100, 100);
			cvShowImage("Result", imgResult);
		}
	}
	if (waitKey(30) >= 0)
		break;
}
VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

OpenCV :: Convert Mat into IplImage

I’ve search long time for having result on this problem. I want to use the object of IplImage, which data should be filled from Mat. If you using the simple solution found on stackoverflow, then you can’t access the methods of the IplImage object.

Mat matImage;
IplImage iplImage;

iplImage = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);
iplImage->imageData = (char *) matImage.data;
VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Android :: create dynamic table programmatically

My problem was to create a dynamic table and not hard xml-coded. So I’ve wrote a table class to create it programmatically. The created table has also borders.

TableGenerator class

public class TableGenerator {
    private final Context mContext;
    private TableLayout mTable;

    private TableLayout.LayoutParams rowParams = new TableLayout.LayoutParams();
    private TableRow.LayoutParams colParams = new TableRow.LayoutParams();

    public TableGenerator(Context context) {
        mContext = context;
        mTable = new TableLayout(context);
        rowParams.setMargins(0, 0, 0, 1);
        colParams.setMargins(0, 0, 1, 0);

        TableLayout.LayoutParams lptable = new TableLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT);
        mTable.setLayoutParams(lptable);

        mTable.setStretchAllColumns(true);
        mTable.setBackgroundColor(mContext.getResources().getColor(
                R.color.table_background));
    }

    public void addRow(String[] data) {
        TableRow tr = new TableRow(mContext);
        tr.setBackgroundColor(mContext.getResources().getColor(
                R.color.table_background));

        tr.setLayoutParams(rowParams);

        for (int iCol = 0; iCol < data.length; iCol++) {
            TextView tvCol = new TextView(mContext);
            tvCol.setText(data[iCol]);
            tvCol.setGravity(Gravity.CENTER | Gravity.CENTER);
            tvCol.setPadding(3, 3, 3, 3);
            tvCol.setTextColor(mContext.getResources().getColor(
                    R.color.text_black));
            tvCol.setLayoutParams(colParams);
            tvCol.setBackgroundColor(mContext.getResources().getColor(
                R.color.row_background));
            tr.addView(tvCol);
        }

        mTable.addView(tr);
    }

    public TableLayout getTable() {
        return mTable;
    }
}

how to use the class:

MainActivity class

public class MainActivity extends Activity {
	private ScrollView layMain;
	private TableGenerator mTable;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout_main);

		showTable();
	}

	private void showTable() {
		mTable = new TableGenerator(getApplicationContext());
		layMain = (ScrollView)findViewById(R.id.table);

		String[] firstRow = {"col1", "col2", "col3", "col4"};
		String[] secondRow = {"11", "12", "13", "14"};
		String[] thridRow = {"2a", "2b", "2c", "2d"};

		mTable.addRow(firstRow);
		mTable.addRow(secondRow);
		mTable.addRow(thridRow);

		layMain.removeAllViews();
		layMain.addView(mTable.getTable());
	}
}

to successfully use the code above you need to set the main.xml in layout folder to

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ScrollView
        android:id="@+id/table"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    </ScrollView>

</LinearLayout>

now we need some color and string definitions res/values/strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<string name="app_name">Table</string>
	<color name="table_background">#999999</color>
	<color name="row_background">#ffffff</color>
</resources>

Downloads

Table.zip (Project files)
Table-180x300 in

VN:F [1.9.22_1171]
Rating: 4.8/5 (4 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 2 votes)

Android :: Custom Items in ListPreference

Lange habe ich gesucht, in Google mit den Wörtern „ListPreference SQLLite“ und bin immer auf sehr lange Beiträge gestoßen. Heute habe ich die Lösung gefunden, diese ist wie immer ganz einfach:

Ich habe jetzt hier nur den Teil gepostet, in dem die dynamischen Items der ListPreference zugeordnet werden.

addPreferencesFromResource(R.xml.app_preferences);

ListPreference lp = (ListPreference)findPreference("favourite_day");

CharSequence[] entries = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
CharSequence[] entryValues = { "1", "2", "3", "4", "5", "6", "7" };

lp.setEntries(entries);
lp.setEntryValues(entryValues);
VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)