Ενεργοποίηση του Samba σε Arch-based distro.

Κλασσικά, κατα μία νέα εγκατάσταση Manjaro, διαπίστωσα ότι δεν είχα πρόσβαση στο samba share μου – όχι λόγω προβλήματος του server μου, μα επειδή δεν είχα client.

Δοκιμάζω να τα ενεργοποιήσω απο το systemd αλλά δεν με άφηνε καθώς δεν έβλεπε configuration (το /etc/samba είχε μόνον το smb.conf.default)

Οπότε κάνουμε τα εξής:

Επιβεβαιώνω ότι smbd & nmbd είναι απενεργοποιημένα.

$ sudo systemctl stop smbd

$ sudo systemctl stop nmbd

Δημιουργώ νέο configuration με:

$ sudo nano /etc/samba/smb.conf

Ενα default, συμφωνα με το BBS είναι το εξής:

[global]
  usershare path = /var/lib/samba/usershare
  usershare max shares = 100
  usershare allow guests = yes
  usershare owner only = False

Προσθετουμε τον εαυτό μας στο configuration:

$ sudo pdbedit -a -u user

Ενεργοποιούμε τα daemon και τα ξεκινάμε. Το share πλέον δουλέυει.

$ sudo systemctl enable smbd
$ sudo systemctl enable nmbd
$ sudo systemctl start nmbd
$ sudo systemctl start smbd

Advertisements

Αύξηση του swapspace σε Debian-based ΑRM διανομή.

Αυτές τις μέρες, ασχολούμαι με τη δημιουργία ενός tiny PBX σε ένα orange Pi zero. Τελείως custom εφαρμογή, πάνω σε armbian jessie, με πάρα πολλά προβλήματα, η οποία εάν λειτουργήσει, θα ανεβάσω ένα step-by-step how to.

Ένα απο τα θέματα ήταν η πολύ μικρή RAM του Orange, μόλις 256ΜΒ, και το σχετικά ικανοποιητικό αλλά πρακτικά ανύπαρκτο swapspace, με μέγεθος μόλις 128ΜΒ.

Οπότε ξεκινάμε διώχνωντας το ήδη υπάρχον swap αρχείο με:

# swapoff /var/swap

# rm /var/swap

Θα δημιουργήσουμε ένα νέο, μεγέθους 512ΜΒ με blocksize 1024 bytes και θα το γεμίσμουμε με μηδενικά αρχικά.

# touch /var/swap

# dd if=/dev/zero of=/var/swap bs=1024 count=524288

To 524288 προκύπτει απο τα 512MB (το επιθυμητο μέγεθος) * 1024 bytes blocksize = 524288. Εάν επιθυμούμε άλλο μέγεθος, do the math!

Ενεργοποιούμε το swapspace με:

# mkswap -f /var/swap

# swapon /var/swap

Αυτή τη στιγμή είμαστε θεωρητικά έτοιμοι, αλλά το σύστημα θα αρχίσει να γράφει στο swapspace μόνο όταν γεμίσει την RAM. Επιβεβαιώνεται αν δώσουμε ένα:

# cat /proc/sys/vm/swapiness

Αυτό θα μας επιστρέψει 0. Το μηδέν είναι ένα αφαιρετικό ποσοστό του 100%. Δηλαδή εάν ήταν 20, αφαιρετικά θα ήταν το 80% που σημαίνει πώς όταν η RAM θα έφτανε στο 80% χρήσης, τότε ο kernel θα άρχιζε να χρησιμοποιεί το swapspace.

Για να το ορίσουμε στο 90% δίνουμε ανάλογα:

# sysctl vm.swappiness=10

Οπότε πλέον το swapiness βρίσκεται στο 10 και είμαστε έτοιμοι.

Προσοχή: Η ορθή χρήση swap προϋποθέτει την ύπαρξη γρήγορου αποθηκευτικού μέσου, στη προκειμένη περίπτωση γρήγορης sd card. Εάν πχ χρησιμοποιούμε μία class4 sd, τότε σίγουρα θα παρατηρήσουμε τρομερή πτώση στην απόδοση του συστήματος. Επίσης, η εκτεταμένη χρήση του swap μειώνει την διάρκεια ζωής της sd, λόγω των πολλαπλών read/write.

 

Raspberry Pi VFS kernel panic

Πρίν λίγες ημέρες, καθώς το έκανα unplug απο το ρεύμα, κατα την επόμενη επανεκκίνηση μου πέταγε kernel panic και φυσικά δεν oλοκλήρωνε το boot.

Το μήνυμα ήταν το εξής:

VFS: Unable to mount root fs on unknownblock(179,6)

Ψάχνοντας στα raspberrypi-forums, οι περισσότεροι έλεγαν ότι κράσαρε η sd και προτείναν reformatting ή ακόμη και αντικατάσταση της sd.

Φυσικά αυτό δεν ισχύει καθώς η λύση είναι απλή.

Το μήνυμα λέει ότι υπάρχει ένα bad-block, το 179 στο partition 6 στη δική μου περίπτωση.

Οπότε κουμπόνωντας την sd σε ένα οποιοδήποτε linuxbox, βρίσκουμε που την έχει δει αρχικά ώς device.

Στη δική μου περίπτωση ήταν η /dev/sdb και εφ’όσον έχει 6 partition τα βλέπω σαν /dev/sdb[1-6]

Οπότε διορθώνω το partition 6 (μπορεί να είναι το οποιοδήποτε, ανάλογα με την περίπτωση) με:

$ sudo fsck y /dev/sdb6

και είμαστε κομπλέ.

Προσοχή: σε κάποιες περιπτώσεις λένε να χρησιμοποιηθεί η fsck.ext4. Μην το χρησιμοποιήσετε καθώς δεν ξέρουμε στάνταρ ότι το filesystem του partition είναι ext4.

Αναγκάζοντας τον GRUB2 να ξεκινήσει windows σε dual-boot μηχάνημα

Σε ένα μηχάνημα, το οποίο έτρεχα windows 7 dual-boot με linux mint, αποφάσισα να αντικαταστήσω το mint με ubuntu.

Το αποτέλεσμα μετά την εγκατάσταση του ubuntu, το οποίο φυσικά κατα την εγκατάστασή του, μου αντικατέστησε και τον GRUB, ήταν να μην bootαρει τα windows 7, μου εμφάνιζε δηλαδή τον bootcode με κάποια error και έμπαινε σε grub rescue.

Το παραπάνω επιδιορθώνεται με το εξής:

Όσο είμαστε σε ubuntu, ανοίγουμε ένα terminal και με τον nano ανοίγουμε το αρχείο grub.cfg για επεξεργασία:

$ sudo nano -w /boot/grub/grub.cfg

Παρ΄όλες τις υποδείξεις να μην πειράξουμε το αρχείο με το χέρι, πηγαίνουμε τέρμα κάτω, στο menuentry των windows που μοιάζει ώς εξής:

menuentry "Windows 7 (loader) (on /dev/sda1)" --class windows --class os {
    insmod part_msdos
    insmod ntfs
    set root='(hd0,msdos1)'
    search --no-floppy --fs-uuid --set=root 1EA0019AA0017A13
    chainloader +1
}

και το τροποποιούμε, ώστε να είναι:

menuentry "Windows 7 (loader) (on /dev/sda1)" --class windows --class os {
    insmod part_msdos
    insmod ntfs
    insmod ntldr
    set root='(hd0,msdos1)'
    search --no-floppy --fs-uuid --set=root 1EA0019AA0017A13
    ntldr ($root)/bootmgr
}

Πατάμε Ctrl+X -> Y και είμαστε έτοιμοι!

Αυτό που κάνουμε δηλαδή είναι με το insmod ntldr να πούμε τον GRUB να φορτώσει το module NTLOADER και με αυτό να bootαρει τον bootmanager στο partition msdos1 του hd0.

Antergos, η εκδίκηση των προγόνων.

Antergos, σημαίνει acnestor δηλαδή πρόγονος στα αρχαία ισπανικά or sth…

Είναι όμως και η καλύτερη διανομή που δοκίμασα εως τώρα, μετά απο χρόνια χρήση του manjaro.

Οι λόγοι είναι απλοί (και ψιλοversus manjaro…):

  • Arch repos & AUR
  • Cnchi installer
  • Δουλεύει ο dns resolver χωρίς να τον πειράξεις
  • Το αναπτύσσουν μια χούφτα Γαλικιανοί
  • Υποστηρίζει XFCE
  • Μέσα σε μία ώρα απο την εγκατάσταση, γινεται αισθητικά πανέμορφο.
  • Δεν κρασάρει με την εγκατάσταση του virtualbox

Το μόνο που μου έλειψε είναι ο manjaro-settings-manager που σου επιτρέπει να αλλάζεις τους kernel σαν τα πουκάμισα.

Επίσης, για να το βουλώσει το buzzer του pc κατα το logout ή όταν κρατούσα πλήκτρο παρατεταμένα πατημένο, έπρεπε να μπέι η :

$ xset b off

Το χρησιμοποιώ με:

  • DE: XFCE4
  • WM: xfwm4
  • WM Theme: Adapta-nokto
  • GTK Theme: Vertex-Dark
  • Icon Theme: paper

 

Ανακαλύπτοντας την System.Data.SQLite

Χρειάστηκε να πειραματιστώ με την (επανα)δημιουργία μίας standalone εφαρμογής σε C#, σε .net3.5(!) με embedded βάση δεδομένων. Δεν ήθελα να βασιστώ στις κλασσικές πεπατημένες μεθόδους, την πλαστικούρα του vs και φυσικά δεν υπήρχε τρόπος να συνδεθώ σε απομακρυσμένη βάση.

Οπότε στράφηκα στη System.Data.SQLite, κάτι το οποίο μου είχε αναφέρει πριν χρόνια ένας αξιότιμος senior και το οποίο φυσικά δεν χρησιμοποίησα ποτέ.

Κατεβάζω λοιπόν το κατάλληλο .zip, παίρνω το dll (χρειάζεται μόνο το System.Data.SQLite.dll), δημιουργώ τα assembly references, και δημιουργώ τη βάση με το sqlitebrowser και μπάμ, δε δουλεύει τίποτα!

1ος λόγος: Είχα γυρισμένο τον compiler να κάνει compile σε Any CPU, ενώ έγραφα 32bit εφαρμογή και είχα κατεβάσει την 32bit dll. Το intelligence του vs τα έδειχνε όλα οκ αλλά δεν. Οπότε ανάλογα με την αρχιτεκτονική, θέλει και το αντοίστιχο dll.

2ος λόγος: Η database, πρέπει να είναι στο ίδιο αρχείο με το εκτελέσιμο. Relative paths, ή καρφωτά δεν χρησιμοποίησα, διότι τα θεωρώ μία κακή τεχνική.

Παρακάτω, παραθέτω μία κλάση σε c# την οποία ονομάζω dbmanager και την χρησιμοποιώ για την αλλιλεπίδραση με την sqlite db μου:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SQLite;//using gia to assembly reference sth dll
using System.Data;
using System.Windows.Forms;

namespace test_sqlite//to diko sou namespace edw
{
class dbmanager
{
private static SQLiteConnection sql_con;
private static SQLiteCommand sql_cmd;
private static SQLiteDataAdapter DB;

public static void setConnection()//connection string function, kaleitai apo thn executeQuery
{
try
{
sql_con = new SQLiteConnection(“Data Source=to_onoma_ths_dikhs_soy.db;Version=3;New=False;Compress=True;”);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}

public static void executeQuery(string txtQuery)//anoigei connection sth db kai ektelei erwthma
{
try
{
setConnection();
sql_con.Open();
sql_cmd = sql_con.CreateCommand();
sql_cmd.CommandText = txtQuery;
sql_cmd.ExecuteNonQuery();
sql_con.Close();
}
catch (Exception exc)
{
MessageBox.Show(exc.Message + “:: FROM executeQuery( ) , propably caused by syntax error.”);
}
}

public static DataTable loadData(string cmd) //returns datatable
{
try
{
setConnection();
sql_con.Open();
sql_cmd = sql_con.CreateCommand();
DB = new SQLiteDataAdapter(cmd, sql_con);
DataSet DS = new DataSet();
DB.Fill(DS);
DataTable DT = DS.Tables[0];
sql_con.Close();

return DT;
}
catch (Exception exc)
{
MessageBox.Show(exc.Message + “:: FROM loadData( ), propably caused by invalid data or connection failure.”);
}

return null;
}

}
}

Την παραπάνω τη δημιούργησα συλλέγοντας κομμάτια απο το algorhymes και Tigran’s blog.

Regex, ελληνιστί “κανονικές εκφράσεις”

Regex, ή regular expressions ή κανονικές εκφράσεις, είναι μία γλώσσα, μέσα απο την οποία μπορούμε να κανουμε ανάλυση strings, ανεξαρτήτου μήκους, ώστε να πάρουμε αυτό που θέλουμε. Η γλώσσα, είναι ίδια σε όλες τις τις γλώσσες με συγκεκριμένο τύπο.

Για να καταλάβουμε σε ένα πολύ απλό παράδειγμα, ας θεωρήσουμε ότι έχουμε το string 123456789ABCDEF και μέσα απο αυτό, θέλουμε να πάρουμε μονο το κομμάτι 9ΑΒ.  Δηλαδή το regex 9AB, θα βρεί το συγκεκριμένο pattern στον 9ο, 10ο και 11ο χαρακτήρα του string και θα μας τους επιστρέψει.

Ομοίως, εάν έχουμε ένα regex = 123, τότε θά πάρουμε τους 3 πρώτους χαρακτήρες του string.

Εάν όμως έχουμε ένα regex = 1Α2Β3, τότε δεν θα μας επιστρέψει απολύτως τίποτα, διότι δεν υπάρχει η συγκεκριμένη ακολουθία μέσα στο string.

Οι βασικοί ορισμοί της γλώσσας είναι οι εξής:

\w -> 1 αλφαβητικός χαρακτήρας

\d -> 1 αριθμητικός χαρακτήρας

\s -> 1 “κενός” χαρακτήρας (whitespace, νεα γραμμή)

-> Οποιοσδήποτε χαρακτήρας, εκτός της νέας γραμμής (enter ή \n)

\n -> 1 νέα γραμμή

? -> 0 ή 1 χαρακτήρες

* -> 0 ή περισσότεροι χαρακτήρες

+ -> 1 ή περισσότεροι χαρακτήρες

[0-9] ή [A-Z] ή [a-z] -> Οποιοσδήποτε χαρακτήρας στο διάστημα απο 0 εώς 9 ή στο διαστημα απο A εώς Ζ λατινικό (έχει σχέση εάν είναι κεφαλαίο ή πεζό). Τα διαστήματα μπορεί να ειναι οποιαδήποτε πχ [2-8] για τα νούμερα απο 2 εώς 8 ή [B-G] για τους χαρακτήρες απο το B εώς το G. Επίσης μπορεί να είναι και μεμονωμένοι πχ [a,b,c,D,E,F]

{,3} ή {3,} -> Επαναλήψεις του χαρακτήρα εώς και 3 φορές ή απο 3 φορές και πάνω. Επίσης μπορεί να χρησιμοποιηθεί και ώς {3} που σημαίνει ακριβώς 3 φορές ή και ώς {3,5} που σημαίνει απο 3 εως 5 φορές.

\ και οποιοσδήποτε χαρακτήρας μή αλφαριθμητικός -> πχ το\. μας γυρνάει το . ή το \[ μας γυρναει το [ ή το \\ μας γυρναει το \ κοκ..

Οπότε για το string = [13255badSIN] το regex που μπορεί να μας το επιστρέψει, είναι το:

\[\d[1-5]{5}\w[a-d]{3}\w[I-S]{3}\]

 

 

GTK 3.20 update, ο απόλυτος killer…

Μετά το τελευταίο update, απο τη version 3.00 στη version 3.20, πολλά themes και μαζί με αυτά το menta που χρησιμοποιούσα στο manjaro, χάλασαν.

Η λύση που βρήκα, είναι να χρησιμοποιήσω το εναλλακτικό του menta, το maia.

Κατεβάζουμε και εγκαθιστούμε με:

$ sudo pacman -S vertex-maia-themes vertex-maia-icon-theme

Έπειτα απο Appearance, επιλέγουμε το Vertex-maia-dark, και είμαστε έτοιμοι!

Μπλοκάρισμα του resolv.conf

Πολλές φορές, ανάλογα με το δίκτυο που χρησιμοποιοίμε, διάφοροι daemons (συνήθως ο dhcpcd και διάφοροι network managers βλ. wcid, NetworkManager) πειράζουν το αρχείο resolv.conf.

Για να το αποτρέψουμε αυτό, ακουλουθούμε τα εξής:

Θεωρώντας πως το αρχείο /etc/resolv.conf έχει τους dns της Google

nameserver 8.8.8.8

nameserver 8.8.4.4

Προσθέτουμε στο τέλος του αρχείου /etc/dhcpcd.conf τις γραμμές:

nohook resolv.conf
static domain_name_servers=8.8.4.4 8.8.8.8

Ενεργοποιούμε προστασία εγγραφής στο resolv.conf:

$ sudo chattr +i /etc/resolv.conf

Τέλος, εαν χρησιμοποιούμε τον NetworkManager, τότε παραμετροποιούμε το [main] section του
/etc/NetworkManager/NetworkManager.conf ώς εξής:

[main]
plugins=keyfile
dhcp=dhclient
dns=none

True SUDO…

Στο internet, πολλοί ψάχνουν πώς να κάνουν sudoer έναν user χωρίς να απαιτείται η εισαγωγή του passwd, κάθε πενταλεπτο.

Η μόνη σωστή λύση, διότι κυκλοφορούν πάμπολλες χωρίς αποτέλεσμα είναι η εξης:

  1. Ανοίγουμε το αρχείο του sudo

$ sudo visudo

. Εάν πραπονεθεί για απώλεια editor (visudo: no editor found (editor path = /usr/bin/vi) τότε το ανοίγουμε με:

$ sudo EDITOR=nano visudo

Στο τέλος του αρχείου, προσθέτουμε το:

user ALL=(ALL) NOPASSWD: ALL

όπου user το όνομα χρήστη που θέλουμε να δώσουμε sudo.

Σώζουμε με Ctrl + X και είμαστε έτοιμοι!