sobota, 16 lutego 2013

Drukarka Xerox Phaser 3010 na Arch Linux



0. Zainstaluj pacmanem serwer CUPS i dodatkowe pakiety:

extra/cups
extra/cups-filters
extra/cups-pk-helper
extra/libcups
multilib/lib32-libcups (szczególnie istotne - filtry z paczki debianowej mają zależności do tych bibliotek)

Uruchom serwer: systemctl start cups

1. Ściągnij sterownik(dla Debiana)


2. Rozpakuj paczkę deb

ar xv xerox-phaser-3010-3040_1.0-28_i386.deb 

3. Rozpakuj plik data.tar.tgz

tar zxvf data.tar.tgz

4. Skopiuj cały katalog usr(ten który się właśnie rozpakował) do katalogu głównego

cp -r usr / 

5. Restartuj serwer CUPS

systemctl restart cups

6. Zainstaluj drukarkę za pomocą CUPS(Administration->Add Printer)

W przeglądarce: http://localhost:631
Sterownik do Xerox 3010 będzie na liście do wyboru. Jeśli nie to znaczy, że coś poszło nie tak.

Kłopoty?

- Zawsze warto obserwować logi serwera:  tail -f /var/log/cups/error_log 
- Należy sprawdzić czy filtry które zainstalowaliśmy do CUPS działają:
        1.wpisz w konsolę: /usr/lib/cups/filter/xrhr1ap
        2.a potem: /usr/lib/cups/filter/xrhr2ap
        3.prawidłowym(naprawdę ;)) komunikatem powinno być:  
           ERROR: rastertofxp job-id user title copies options [file]
- Nie muszę chyba pisać, że wszystkie operacje administracyjne należy wykonywać  jako root?



sobota, 23 kwietnia 2011

Mercurial na wspólnym koncie SSH dla wielu użytkowników.

Przedstawiona niżej technika dzielenia repozytorium umożliwia wielu użytkownikom korzystaniem z repozytorium Mercuriala(przy drobnej modyfikacji to samo dotyczy gita) na jednym koncie SSH bez udzielania wszystkim dostępu do shella. Jedyne co na naszym koncie będą mogli robić nasi współpracownicy to korzystanie z określonego repo. Technika ta jest przydatna w przypadkach gdy nie mamy możliwości by każdemu commiterowi przydzielić osobne konto shellowe.
Oczywiście istnieją gotowe(często dość rozbudowane skrypty) korzystające z tej metody(np.Gitosis).
W poniższym artykule chciałbym dotrzeć jednak do sedna działania, dzięki temu czytelnicy będą mogli wymyślić także inne zastosowania i udziwnienia.

By umożliwić innej osobie korzystanie z naszego shella bez podawania jej hasła korzystamy z kluczy RSA. Jak dokładnie należy to zrobić napisałem w innym artykule(Klik). W stosunku do niego należy wykonać drobną modyfikację. Przed treścią klucza należy dopisać poniższą linijkę:


no-port-forwarding,command="./script.pl"


"command" jako shella ustawia wybrane przez nas polecenie, przy okazji zabraniamy znajomym forwardowania za pomocą naszego konta(wszystkie możliwe opcje możemy znaleźć w manualu do sshd).

Teraz pora na najistotniejszą część, tj. treść skryptu(w tym wypadku PERL), która może wyglądać np. tak:


#!/usr/bin/perl

$command = $ENV{'SSH_ORIGINAL_COMMAND'};

if($command eq "hg -R merktest serve --stdio") {
exec($command);
} else {
print "Shell access denied!\n";
}


Oczywiście jest to tylko przykładowy kod dla szczególnego przypadku(dostęp do repozytorium pod nazwą "merktest" ). Można go uogólnić, ulepszyć wedle uznania, wyobraźni i potrzeb. Nie daję tutaj rozbudowanego przykładu gdyż nie jest to celem artykułu ;).

Jeśli chcemy zrobić coś analogicznego dla git'a zmieniamy warunek na:


if ($command eq "git-upload-pack gitrepo")


Oczywiście to również jest szczególny przypadek dla repozytorium o nazwie "gitrepo".

Generalnie polecam eksperymenty.

środa, 30 marca 2011

SOCKS proxy via SSH

Przydatne przy omijaniu limitów pobierania z różnych rapid-wynalazków i do kilku innych celów.


ssh -D 12345 myuser@remote_ssh_server


Przykładowe ustawienie w Chrome:

Preferencje->Dla zaawansowanych->Ustawienia Proxy->Ręczne ustawienie Proxy
Tam ustawiamy hosta i port. W tym wypadku będzie to odpowiednio: localhost, 12345.

wtorek, 29 marca 2011

Dostęp do repozytorium Git'a na niestandardowym porcie SSH

Post z serii: "Dziś pytanie - dziś odpowiedź"

Wbrew pozorom by rozwiązać tytułowy problem nie musimy zmieniać zanadto konfiguracji gita. Rozwiązaniem natomiast jest wyedytowanie pliku .ssh/config.
Przykładowa konfiguracja:


Host MyRepo
HostName myrepo.pl
Port 666
User myuser


Wtedy .git/config wygląda np. tak:


[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = MyRepo:RepoName
[branch "master"]
remote = origin
merge = refs/heads/master


MyRepo - Etykieta której użyliśmy w pliku .ssh/config
RepoName - Zdalny folder z repozytorium Git'a

poniedziałek, 28 marca 2011

Szybka synchronizacja danych za pomocą RSync'a i sshfs

Przykładowy skrypt nie wymagający wielkiego komentarza:


#!/bin/sh
sshfs -p 666 user@farmachine.pl:/home/shark /home/shark/fardata/
rsync -rvvl --exclude-from exclude.txt /home/shark/LOCAL-FOLDER/ /home/shark/fardata/REMOTE-FOLDER
sudo umount /home/shark/fardata


Krótkie wyjaśnienie:

1.Za pomocą systemu plików sshfs montujemy zdalny zasób na w lokalnym folderze
2.Za pomocą rsync'a(jak sama nazwa wskazuje) synchronizujemy zasoby(tu ważne by rozumieć, że kopiowanie następuje od lewa do prawa. Kolejność argumentów jak przy standardowym 'cp')
3.Odmontowujemy, zamontowany wcześniej zasób
4.Koniec ;)

Opcje:

r - kopiowanie rekurencyjne (Rekurencja - patrz: rekurencja ;))
v - verbose
l - kopiuj symlinki jako symlinki
exclude-from - wyłączenie wybranych plików ze śledzenia przez rsync'a(w tym wypadku wystarczy wypisać te pliki w osobnych liniach w pliku exclude.txt)

P.S. By móc korzystać z sshfs należy posiadać FUSE'a i pakiety zależne(apt-get sam załatwia sprawę)

Dla zainteresowanych: man sshfs, man rsync

wtorek, 3 sierpnia 2010

Przydatność screena

Dawno nic nie pisałem. Oczywiście nie będę opisywał czym screen jest - jestem na to zbyt leniwy, z resztą po co kserować wikipedie? :> Artykuł będzie bardzo krótki i precyzyjny :P

Opiszę ciekawy(moim zdaniem) przypadek użycia. Inspiracją powstania artykułu był problem postawiony przez kolegę. Problem prezentuje się następująco:

Chcemy wykonać jakąś długotrwałą operację na naszym koncie shellowym(np. kopiowanie plików na inne konto :) ) ale nie chcemy zostawiać włączonego komputera.

Rozwiązanie:

1.Logujemy się na konto
2.Odpalamy screena ( polecenie screen)
3.Odpalamy potrzebny program(np. mc)
4.Kopiujemy co tam chcemy
5.Ctrl+Z
6.bg
7.Ctrl+a d (puszczenie screena w tło)
8.Wylogowujemy się
9.Idziemy biegać ;)

Kiedy wrócimy:

1.Logujemy się
2.screen -r
3.fg
4.Cieszymy się zakończoną operacją(lub czekamy dalej :P)


KONIEC


Do przeczytania:

Screen

wtorek, 13 lipca 2010

Podgląd obrazków w JS z wykorzystaniem <input type="file"/>

Tradycyjnie wpis będzie krótki, gdyż wolę pokazać trochę więcej kodu a mniej się rozpisywać. Nie mniej jednak należy się krótkie wyjaśnienie. Po co pisać notkę na tak precyzyjnie określony temat?
Okazuje się, że rozwiązanie powyższego problemu nie jest tak oczywiste jak mogłoby się wydawać.
Z przyczyn bezpieczeństwa większość przeglądarek(jak na razie jedynym wyjątkiem jaki znalazłem jest IE) uniemożliwia podejrzenie przez programistę JS pełnego parametru 'value' kontrolki input z typem "file". Jak zatem dostać się do pliku graficznego i wyświetlić go za pomocą JS jeszcze przed załadowaniem na serwer? Rozwiązaniem jest dobranie się do obrazka zapisanego w postaci base64(czyli po prostu surowych danych),utworzenie obiektu img oraz wyświetlenie go na ekranie. Koniec czczej pisaniny. Przed nami przykład.


1 <script type="text/javascript" src="pixastic.core.js"></script>

2 <script type="text/javascript" src="actions/resize.js"></script>
3 <script type="text/javascript">

4
5
6 function loadImage() {
7

8 var img = new Image();
9

10 img.onload = function() {
11
12 Pixastic.process(img, "resize", {

13 width : 100,
14 height : 100
15 });

16
17 }
18
19
20
21 var imgsource;

22
23 if(document.getElementById('filefield').files) {
24 imgsource = document.getElementById('filefield').files.item(0).getAsDataURL();

25 };
26
27
28 datastring = new String(imgsource);

29 mime = datastring.substring(0, 10);
30

31 if(mime=='data:image') {
32 img.src = imgsource;

33 document.getElementById('my').innerHTML="";
34
35 setTimeout(function() {

36 document.getElementById('my').appendChild(img);
37
38 }
39 ,50);

40
41 } else {alert("Niepoprawny typ pliku!!"); }

42
43
44 }
45
46 </script>
47

48 <html>
49
50 <head>
51 </head>
52

53 <body>
54
55 <span id='my'></span>
56
57 </body>

58 </html>




syntax highlighted by Code2HTML, v. 0.9.1


Wprawne oko zauważy, że w powyższym kodzie jest coś więcej niż tylko rozwiązanie problemu z tytułu. W istocie tak jest. W przykładzie zastosowałem bibliotekę 'Pixastic'(wiele ciekawych zastosowań - polecam), które posłużyła mi do stworzenia miniaturki obrazka. Dodatkowo kod zawiera zabezpieczenie przed omyłkowym wprowadzeniem pliku który nie zawiera grafiki a także timeout który daje czas na zmniejszenie obrazka. Jeśli ktoś jest ciekawy co się stanie bez timeoutu i po zmianie innych opcji - zapraszam do eksperymentowania.


Aktualizacja: Okazuje się, że zaprezentowana metoda działa jedynie w FF3!!
Jeśli uda mi się znaleźć jakiś bardziej uniwersalny sposób(w co wątpię) lub chociaż
obejścia dla innych przeglądarek coś o tym napiszę.


Do przeczytania

Pixastic
Base64
Inspiracja powyższej notki - dla znających j.francuski