i3 shutdown meni

Menu za logout/suspend/lock/reboot/poweroff za i3 upotrebom dmenu.

i3_shutdown_menu

~/.i3/config

...
bindsym $mod+Ctrl+q exec ~/.i3/dmenu_shutdown.sh
...

~/.3/dmenu_shutdown.sh

#!/bin/sh
(
echo "lock"
echo "suspend"
echo "logout"
echo "shutdown"
echo "reboot"
) | dmenu "$@" | ~/.i3/dmenu_shutdown_action.sh &

~/.3/dmenu_shutdown_action.sh

#!/bin/sh

read ACTION

case "$ACTION" in
	lock)
		i3lock
		;;
	suspend)
		systemctl suspend
		;;
	logout)
		i3-msg exit
		;;
	shutdown)
		systemctl poweroff
		;;
	reboot)
		systemctl reboot
		;;
esac

Napomena, action file je pravljen za sistem koji radi na systemd (u mom slucaju arch).

Posted in desktop, linux | Tagged , , , | Leave a comment

ESP8266 nodemcu flashovanje

Možda ja nisam naleteo na pravi, ali većina tutorijala za flashovanje nodemcu na esp8266 mi deluju komplikovani. A u suštini to su par linija u shellu.

Šema povezivanja:

Potrebni alati:

Skidanje potrebnih fajlova:

wget https://raw.githubusercontent.com/themadinventor/esptool/master/esptool.py
wget https://github.com/nodemcu/nodemcu-firmware/releases/download/0.9.6-dev_20150704/nodemcu_integer_0.9.6-dev_20150704.bin

I flashovanje. Esp treba da je u flashing modu (spojimo gpio0 na gnd – tasterom na šemi) i potom uključiti napajanje.

python2 esptool.py --port /dev/ttyUSB0 write_flash 0x00000 nodemcu_integer_0.9.6-dev_20150704.bin

I to je to. Za početno ekperimentisanje koristim esplorer, ali planiram da predjem na editor, makefile i nekoliko scripti.

Posted in elektronika | Tagged , | Leave a comment

ssh_config

1. Known Hosts po aliasu. Svaki entry u ssh_config da ima svoj fajl u kome chuva known hosts, tako da nema kolizije ako ima više servera sa istom IP (u različitim mrežama naravno).

Host alias1
        UserKnownHostsFile ~/.ssh/known_hosts.d/alias1
        HostName 1.2.3.4

2. Različita adresa i port u zavisnosti od toga gde se nalazite. Jedna javna IP i posebna privatna IP ako ste u samoj mreži. Naravo ovako preformatiran fajl treba začiniti sa #define direktivom (gde ste trenutno) i fajl provići kroz cpp (ili perl scriptu).

Host alias2
#ifdef LOC_MREZA1
        Hostname 192.168.1.1
#else
        Hostname 99.99.99.99
        Port 9999
#endif

3. SSH over SSH, kroz ssh jednog servera nakačiti se na drugi, koji je verovatno iza firewalla.

Host alias3
        Hostname 192.168.1.2
        Port 22
        ProxyCommand ssh -q alias1 nc -q0 %h %p

4. SSH over HTTP, ssh kroz specialno podešen apache.

Host alias4
        Hostname 192.168.1.3
        ProxyCommand proxytunnel -v -p www.server.com:80 -d %h:%p -H "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32)\n"

Još neka varijanta?

Posted in admin, linux | Tagged , , | Leave a comment

Treći monitor ili tablet kao dodatni monitor

Sa jednim HDMI i jednim VGA portom na laptopu svakodnevno aktivno koristim 2 monitora. Ali ponekad zatreba i treći, koji tu negde pored već stoji ali je prikačen na drugi računar.

Kako proširiti desktop monitorom koji je na drugom račuanaru? Može da se upotrebi i tablet.

Prvo da napravimo još jedan virtualni ekran (nisam siguran da li ovo radi na svakom Xorgu ili možda ima neke veze sa intel drajverima):

xrandr --addmode VIRTUAL1 1920x1200
xrandr --output VIRTUAL1 --mode 1920x1200 --right-of HDMI1

Rezolucija monitora koji ću koristiti za proširenje je 1920×1200 pa sam te veličine ekran i napravio, i postavljen je desno od ekrana koji stoji ispred mene i koji je na HDMI1 priključku.

Sada da pripremimo podešavanja na monitoru koji ćemo koristiti, na njemu je potrebno pokrenuti vncviewer u listener modu, preko celog ekrana. Kod mene je to također linux mašina i pokrenuću preko startx Xorg sesiju koja ima samo vncviewer u fullscreen modu. Moj .xinitrc:

#!/bin/bash
 
xset s off; xset -dpms
exec vncviewer -listen 5500 --ViewOnly=1 --FullScreen=1

Isključićemo dpms i blank screen da ne bi svako malo jurili tastaturu drugog računara i pokrenuti vncviewer.

I na kraju je još samo potrebno na prvom računaru pokrenuti x11vnc koji će sliku virtualnog ekrana slati na drugu mašinu/monitor.

x11vnc -clip 1920x1200+3000+720 -xwarppointer -connect 192.168.222.222:5500  -nocursorshape -noxdamage -repeat -noxinerama

Vrednost parametra clip možemo pročitati iz xrandr komande, to veličina + pozicija ekrana koja piše pored VIRTUAL1 porta.

Posted in linux | Leave a comment

Paralelno procesiranje podataka u MySQLu

Kod paralelne obrade podataka koji se nalaze u MySQL tabeli kao mehanizam zaključavanja odavno koristim polje u koje upisujem ID od procesa koji obrađuje trenutno neki slog. Ali se kao problem postavi šta se desi ako neki od tih procesa umre, i određeni slog ostane zaključan od strane procesa koji je umro i nikad ga neće otkljčati.

Ranije sam za to koristio file lock i scriptu koja monitoriše da li je neki child umro i u tom slučaju jednostavno oslobađa sve što je taj proces imao zaključano. Ali, postoji mnogo jednostavnije i lakše rešenje bez file lockova i procesa za monitoring.

Primer tabele:

CREATE TABLE `dataobj` (
  `id` INT(11) NOT NULL,
  `connection_id` INT(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Process zaključavanja određenog broja slogova koje ćemo procesirati:

UPDATE dataobj
SET connection_id = CONNECTION_ID()
WHERE 1=1
AND (connection_id = 0 OR connection_id NOT IN (SELECT id FROM information_schema.processlist))
LIMIT 2;

U where imamo kriterijum koji selektuje samo nezaključane slogove ( connection_id = 0 ), kao i one koji su zaključane od strane scripte koje su umrle (otkačile se sa baze). 1=1 je dodatni kriterijum ako želimo samo određene slogove da obrađujemo. A limit nam kontroliše kolko slogova želimo da preuzmemo za obradu.

Potom je potrebno da pokupimo one koje smo uspešno zaključali:

SELECT * FROM dataobj WHERE connection_id = CONNECTION_ID()

Po zavšenom poslu za odključavanje možemo da uradimo jednostavno setovanje connection_id polja na nulu.

Posted in scripts | Tagged | Leave a comment

Minimalna implementacija CPPa

Za predprocesiranje ~/.ssh/config fajla koristim CPP (C Preprocessor). Ali na chromebooku nemam instaliran GCC (pa ni CPP), pa sam napisao minimalnu verziju CPPa u perlu.

#!/usr/bin/perl -w
 
use strict;
use Data::Dumper;
 
my $vars = {};
my $state = [];
 
while (<>) {
        if (/^#define\s*([A-Za-z0-9_]*)/) {
                $vars->{$1} = 1;
                next;
        }
        if (/^#ifdef\s*([A-Za-z0-9_]*)/) {
                push(@$state, $1);
                next;
        }
        if (/^#ifndef\s*([A-Za-z0-9_]*)/) {
                push(@$state, '!'.$1);
                next;
        }
        if (/^#else/) {
                my $last = pop(@$state);
                if ($last =~ /^!(.*)$/) { $last = $1; }
                else { $last = '!' . $last; }
                push(@$state, $last);
                next;
        }
        if (/^#endif/) {
                pop(@$state);
                next;
        }
 
        my $cond = 1;
        foreach my $c (@$state) {
                if ($c =~ /^!(.*)$/) {
                        if (defined($vars->{$1})) {
                                $cond = 0;
                                last;
                        }
                } elsif ($c =~ /^(.*)$/) {
                        if (!defined($vars->{$1})) {
                                $cond = 0;
                                last;
                        }
                }
        }
        if ($cond) {
                s,//.*$,,;
                print $_;
        }
}

download pcpp.pl

Posted in admin, chromebook, linux, scripts | Tagged , , , , | Leave a comment

U malo pomoći PHPa na windowsu

Pošto mi je probleme najlakše rešavati na linuxu sa (pa neki script jezik, izmedju ostalog PHP), problem nastane kad treba nešto uraditi što treba instalirati negde gde nema linuxa.

Jedno od rešenja, staviću na svoj server i dati korisnicima URL, i to radi odlično, osim u slučajevima kad scriptama treba pristup nečemu što je u lokalnoj mreži. A rešenja za to: custom browseri, java apleti, vpn,… verovatno još neko kojeg se nisam setio drastično komplikuje.

PHP se lepo i elegantno vrti na windowsu, ali ako nije neka statična scripta, potreban je web server, e tu opet ima više opcija, ali instalirti apache zbog 2 php scripte koje će nešto uraditi mi je malo previše, ali je jedno od lepih rešenja.

Jednostavnije i elegantnije rešenje: PHP ima u sebi embedded web server, koji se jednostavno pokrene tako što se pozicionirate u document root direktorijum i pokrenete php -S localhost:8080 i dobili ste web server koji se vrti na localhostu i može se pristupiti browserom, a sa druge strane scripte imaju kompletno pristup svim lokalnim resursima.

Prozor koji stoji otvoren, briga klienta da li je tamo nešto (što nema pojma šta je) pokrenuto i slični problemi su vrlo neozbiljni, i opterećujući. Pa hajmo da napravimo windows service od PHPa.

Program se zove nssm. I sve što je potrebno je jedna .cmd scripta koja će podesiti service.

inssvc.cmd

nssm install phpweb C:\php\php.exe
nssm set phpweb AppParameters -S localhost:8080
nssm set phpweb AppDirectory C:\php\htdocs
nssm set phpweb AppStdout C:\php\logs\stdout.log
nssm set phpweb AppStderr C:\php\logs\stderr.log
nssm set phpweb AppStopMethodSkip 6
nssm set phpweb AppStopMethodConsole 1000
nssm set phpweb AppThrottle 5000
nssm start phpweb

I to bi trebalo da bude to. Usput možemo napraviti još nekoli .cmd fajlova da bi ako zatreba mogli lako da pokrenomo, zaustavimo, restartujemo server.

delsvc.cmd – deinstalacija servica

nssm stop phpweb
nssm remove phpweb

start.cmd – startovanje servica

nssm start phpweb

stop.cmd – stopiranje servica

nssm stop phpweb

start-console.cmd – startovanje u konzoli, ako vam je potrebno da lako vidite stderr

cd htdocs
..\php -S localhost:8080

Ovo je tek malo testirano kod mene na računaru, videćemo kako će se pokazati u praksi. Ja se nadam da neće biti nekih problema.

Posted in admin, php, scripts, windows | Tagged | 1 Comment

lvm snapshot mysql data dir

#!/bin/bash
 
(
echo "FLUSH TABLES WITH READ LOCK;"
echo "\! lvcreate -L +10G -s -n snap_userdata /dev/vol01/userdata"
echo "UNLOCK TABLES;"
) | mysql -u root
 
if [ -e /dev/vol01/snap_userdata ]; then
        mount /dev/vol01/snap_userdata /mnt/snap_userdata/
fi
Posted in admin, scripts | Leave a comment

Zaboravljeni bitcoin novčanik

Ovih dana se spominje restoran u Beogradu (Appetite) u kojem se račun može platiti u Bitcoinima, pa se setih da ja imam negde bitcoin novčanik.

Pre par godina kad sam imao ideju da se malo zanimam kopanjem bitcoina, malo sam testirao kako to funkcionishe i tada, sakupio neku beznačajnu svotu coina. Od čeka sam deo prebacio u novčanik, a deo je nesta sa poolom preko koga sam testirao kopanje. Tada je to bila neka beznačajna suma, bez ideje da se cimam kako to da kornvertujem u prave pare ili da ih nekako iskoristim… A pošto sad postoji restoran, ponadah se da možda odem na neku kaficu, onako malo zbog geeky osećaja :)

Skinem novu verziju Bitcoin-Qt novčanika, i skontam da imam tačno 1.5BTC, što po današnjem kursu je oko 1200USD :) Nešto što je pre dve godine bilo sića koja je zaostala tamo negde se u medjuvremenu protvorilo u malo više od nečeg za platiti kafu :)))

Naravno ostaje pitanje, šta uraditi sa time, ostaviti da čekaju neka nova vremena ili možda konvertovati i potrošiti na nešto?

Posted in drustvo | Tagged | 4 Comments

Upload velikih fajlova preko PHPa

Upload fajlove u PHP je generlno uradjen na potpuno pogrešan nacin. Pretpostavka da ceo POST mora da stane u memoriju je sumanut zahtev.

Potencijalna reshenja zahtevaju promenu nacina na koji se fajl uploaduje, ili zamenu PHPa sa PERLom (npr) na server strani samo za procesiranje uploada.

Pre jedno godinu dana sam video zanimljiv nacin za komunikaciju embeded uredjaja sa web serverom. Ukratko: celo telo zahteva zavrshi u PHPu putem php://stdin handlera. I sad ostaje samo dilema kako to iskoristiti da browser misli da radi klasican upload (ecntype=”multipart/form-data”), a da PHP php ne iskoristi svoj interni mehanizam za pakovanje celog zahteva u memoriju i parserovanje. I reshenje postoji, upotrebom dva standardna Apache modula modifikujemo content-type requesta tako da ne bude multipart/form-data shto ujedno znaci da PHP nece parserovati. I to se moze raditi:

SetEnvIf content-type (multipart/form-data)(.*) NEW_CONTENT_TYPE=multipart/form-data-alternate$2 OLD_CONTENT_TYPE=$1$2
RequestHeader set content-type %{NEW_CONTENT_TYPE}e env=NEW_CONTENT_TYPE

Potom sve shto je potrebno, je PHP kod koji parserije multipart/form-data interno i bez smeshtanja u memoriju.

Provereno sa nekoliko browsera, potrebno je još testiranja, ali rešenje je vishe nego lako primenjivo i ne zahteva nikakvo modifikovanje ni browser koda, ni PHP scripte za upload. A to je omogućeno preloadom .php fajla.

php_value auto_prepend_file php-uploader.inc.php

Jedina modifikacija PHP parametra je potreba da vreme izvrsavanja scripte bude dovoljno veliko da bi klient sa sporom konekcijom mogao da uradi kompletan upload.

Source kod kompletnog reshenja: https://github.com/zsteva/php-uploader.

I kod mene na serveru test lokacija http://zsteva.info/upload

Posted in admin, linux, php | Leave a comment