Wydaje się, że to nic trudnego, aczkolwiek potrafi zirytować przeciętnego Kowalskiego, stąd też stwierdziłem, że warto wspomnieć o tym na blogu, ale przejdźmy do sedna.
Otóż, aby skopiować coś z PuTTy z włączonym programem Pine wystarczy zaznaczyć tekst do skopiowania myszką. Automatycznie zaznaczony tekst umieszczany jest w naszym windowsowym schowku i jest gotowy do wklejenia w miejscach gdzie chcemy go umieścić za pomocą Ctrl+C, Shift+Insert czy też za pomocą okienka kontekstowego z opcją wklej. Proste? Proste, a jednak wielu ludzi poświęca nieco czasu zanim do tego dojdzie.
piątek, 22 marca 2013
czwartek, 17 maja 2012
Arch linux i czcionki
Linux nie jest systemem wiodącym prym w ilości i jakości czcionek z powodów licencyjnych, dlatego każdy szanujący się użytkownik tego systemu prędzej czy później zostaje zmuszony do instalacji tychże w swym środowisku. „Porządna” instalacja czcionek nie jest jednak operacją typu kopiuj/wklej tak jak miało to miejsce na windowsie. Na przykładzie archa widać, iż czcionki mogą być traktowane jako normalne pakiety oprogramowania wobec czego można nimi kierować za pomocą pacmana. Daje to dość duże pole do manewru dla końcowego użytkownika, gdyż może on zarządzać instalacją, deinstalacją tudzież aktualizacją czcionek poprzez menadżer pakietów. Nawet gdy upatrzonej przez nas czcionki nie ma w repozytoriach warto się troszkę pomęczyć, dla tej wygody, poprzez stworzenie pakietu czcionki i zainstalowanie go za pomocą pacmana. Nie jest to praca czasochłonna i poniżej postaram się ją zwięźle opisać na przykładzie instalacji pewnej czcionki zwanej The One Ring (taka tam z Władcy Pierścieni).
Pierwszym krokiem jaki polecam zrobić jest utworzenie osobnego katalogu, który posłuży nam do pracy. Najlepszym miejscem do tego będzie katalog /home. Przykładowo, tworzymy katalog fontspkgs za pomocą:
Funkcja build() to polecenia wykonywane w celu budowy pakietu. Warto zwrócić uwagę na polecenie unzip $pkgname-$pkgver, które należy zmienić na unrar $pkgname-$pkgver, gdy nasza czcionka mieści się w archiwum rar lub całkowicie usunąć, gdy jest w archiwum tar. Dalsze polecenia tylko kopiują plik czcionki do katalogu share.
Gdy uporamy się już z utworzeniem pliku PKGBUILD musimy stworzyć plik $pkgname-$pkgver.install, co w moim przypadku będzie miało postać ttf-one-ring-1.0.install. Zawartość powinna wyglądać tak:
Jest to skrypt zawierający polecenia poinstalacyjne, które aktualizują systemową bazę czcionek tak, aby były gotowe do użycia od zaraz.
Kolejnym działaniem jest "wypalenie" pliku pakietu za pomocą polecenia
Mam nadzieję, że wielu z was skorzysta z tego sposobu instalacji czcionek, który jest dość popularny, gdyż zapewnia niemałą wygodę w użytkowaniu systemu i pozwala zachować jako taki porządek.
Pierwszym krokiem jaki polecam zrobić jest utworzenie osobnego katalogu, który posłuży nam do pracy. Najlepszym miejscem do tego będzie katalog /home. Przykładowo, tworzymy katalog fontspkgs za pomocą:
mkdir $HOME/fontspkgs
Następnie tworzymy plik o nazwie PKGBUILD którego zawartość powinna wyglądać tak: pkgname=ttf-one-ring
pkgver=1.0
pkgrel=1
depends=('fontconfig' 'xorg-font-utils')
pkgdesc="The One Ring is font inspired Lord of the Rings trilogy."
arch=('any')
license=('custom:freeware')
source=($pkgname-$pkgver.zip::http://dl.dropbox.com/u/7773489/PKG/gaut-fonts_the-one-ring.zip)
install=$pkgname-$pkgver.install
md5sums=('a0afa52d60cea6c0363a2a8cb39a4095')
build()
{
cd "$srcdir"
unzip $pkgname-$pkgver
mkdir -p $pkgdir/usr/share/fonts/TTF
cp $srcdir/*.ttf $pkgdir/usr/share/fonts/TTF
}
- pkgname to nazwa pakietu naszej czcionki. Zaleca się, aby do nazwy czcionki dodawać prefix "ttf-".
- pkgver to wersja czcionki, zaś pkgrel to numer wydania czcionki.
- depends to zależności. Obowiązkowe jest wpisanie 'fontconfig' oraz 'xorg-font-utils'. Pakiet 'unzip' jest również potrzebny, gdy ściągana przez nas czcionka mieści się w archiwum zip tak jak w powyższym przypadku. Przykładowo, gdyby mieściła się w archiwum rar, zamiast unzip wpisalibyśmy do zależności unrar.
- pkgdesc jest opisem pakietu, w tym wypadku będącego czcionką. Warto tutaj wpisać pełną nazwę czcionki, co będzie pomocne przy wyszukiwaniu, gdyby nasz pakiet znalazł się kiedyś w repozytoriach.
- arch opisuje architekturę systemu, na którą pakiet ten jest przeznaczony. W przypadku czcionek wpisujemy 'any', czyli dowolna.
- license to znacznik, w którym wpisujemy licencję czcionki. W tym przypadku jest to licencja freeware. Dla licencji GNU GPL wyglądałoby to tak: license=('GPL').
- source jest określeniem adresu url, z którego pobieramy archiwum z czcionką. Część przed "::" służy nadaniu nowej nazwy pobranemy pakietowi, czyli pakiet gaut-fonts_the-one-ring.zip zostanie po ściągnięciu przemianowany na ttf-one-ring-1.0.zip.
- noextract nie jest opcją konieczną, gdy nasz pakiet mieści się w archiwum tar, jednak w przypadku zip mówi narzędziu makepkg, aby nie wypakowywało archiwum zaraz po pobraniu.
- install określa nazwę skryptu instalacyjnego czcionki, który również należy utworzyć.
- md5sums to tablica sum MD5 plików określonych przez nas w tablicy source. Generujemy je za pomocą polecenia makepkg -g wykonywanego w katalogu z plikami.
Funkcja build() to polecenia wykonywane w celu budowy pakietu. Warto zwrócić uwagę na polecenie unzip $pkgname-$pkgver, które należy zmienić na unrar $pkgname-$pkgver, gdy nasza czcionka mieści się w archiwum rar lub całkowicie usunąć, gdy jest w archiwum tar. Dalsze polecenia tylko kopiują plik czcionki do katalogu share.
Gdy uporamy się już z utworzeniem pliku PKGBUILD musimy stworzyć plik $pkgname-$pkgver.install, co w moim przypadku będzie miało postać ttf-one-ring-1.0.install. Zawartość powinna wyglądać tak:
post_install()
{
echo -n "Updating font cache... "
fc-cache -fs >/dev/null
mkfontscale /usr/share/fonts/TTF /usr/share/fonts/Type1
mkfontdir /usr/share/fonts/TTF /usr/share/fonts/Type1
echo "done"
}
post_upgrade()
{
post_install
}
Kolejnym działaniem jest "wypalenie" pliku pakietu za pomocą polecenia
makepkg
Utworzy to pakiet o nazwie $pkgname-$pkgver-$pkgrel-$arch.pkg.tar.xz, co w moim przypadku dało rezultat w postaci ttf-one-ring-1.0-1-any.pkg.tar.xz. Ostatecznym działaniem jest uruchomienie pacmana:pacman -U ./ttf-one-ring-1.0-1-any.pkg.tar.xz
Pacman zainstaluje czcionkę w odpowiednich dla niej miejscach, po czym wykona nasz skrypt poinstalacyjny w celu aktualizacji bazy czcionek.Mam nadzieję, że wielu z was skorzysta z tego sposobu instalacji czcionek, który jest dość popularny, gdyż zapewnia niemałą wygodę w użytkowaniu systemu i pozwala zachować jako taki porządek.
czwartek, 16 czerwca 2011
Szyfr przestawieniowy w C++
Ostatnio trochę grzebałem w zadaniach maturalnych z informatyki i trafiłem na polecenie napisania aplikacji używającej szyfru przestawieniowego opartego na macierzy do zaszyfrowania dowolnego tekstu. Długo się nie zastanawiając machnąłem sobie programik, którym mam zamiar się z wami podzielić i przy okazji nieco opisać jego bebechy. Kod programu z implementacją szyfru przestawieniowego:
Zacznijmy od linii 15. Tam do wcześniej zdefiniowanego stringa wpisywany jest tekst, który chcemy zaszyfrować. Następnie obliczana jest długość tekstu (linia 17), zaś na jej podstawie program wylicza ilość kolumn i wierszów macierzy (linia 18), w której będzie umieszczony tekst. Funkcja sqrt() liczy pierwiastek z podanej liczby, natomiast ceil() zaokrągla w górę liczbę podaną jako argument. W linii 20 definiujemy macierz, do której następnie wpiszemy tekst do zaszyfrowania.
W liniach 23 - 29 mamy pętle, które wierszami, po jednej literce zapełniają każdą komórkę macierzy. Spacje zamieniane są na podkreślnik. Gdy ilość komórek jest większa od ilości znaków w tekście, końcowe komórki macierzy również są wypełniane podkreślnikami. Po wypełnieniu macierzy znakami w liniach 32 - 37 tekst z tablicy jest spisywany kolumnami do stringa result. W linii 40 na urządzenie wyjścia wypisywany jest zaszyfrowany tekst.
Jest to chyba najprostszy możliwy sposób w jaki można zaimplementować algorytm szyfrowania przestawieniowego.
#include <iostream> #include <cstring> #include <cmath> using namespace std; int main() { string s = "ala ma kota a kot ma ale"; string result = ""; int matrix_size = ceil(sqrt(s.size())); char matrix[matrix_size][matrix_size]; for (int i=0; i<matrix_size; i++) { for (int j=0; j<matrix_size; j++) { if ((i*matrix_size)+j >= s.length()) { matrix[i][j] = '_'; continue; } matrix[i][j] = (s[(i*matrix_size)+j] == ' ' ? '_' : s[(i*matrix_size)+j]); } } for (int i=0; i<matrix_size; i++) { for (int j=0; j<matrix_size; j++) result += matrix[j][i]; } cout << "Tekst zaszyfrowany: " << result << endl; return 0; }
Zacznijmy od linii 15. Tam do wcześniej zdefiniowanego stringa wpisywany jest tekst, który chcemy zaszyfrować. Następnie obliczana jest długość tekstu (linia 17), zaś na jej podstawie program wylicza ilość kolumn i wierszów macierzy (linia 18), w której będzie umieszczony tekst. Funkcja sqrt() liczy pierwiastek z podanej liczby, natomiast ceil() zaokrągla w górę liczbę podaną jako argument. W linii 20 definiujemy macierz, do której następnie wpiszemy tekst do zaszyfrowania.
W liniach 23 - 29 mamy pętle, które wierszami, po jednej literce zapełniają każdą komórkę macierzy. Spacje zamieniane są na podkreślnik. Gdy ilość komórek jest większa od ilości znaków w tekście, końcowe komórki macierzy również są wypełniane podkreślnikami. Po wypełnieniu macierzy znakami w liniach 32 - 37 tekst z tablicy jest spisywany kolumnami do stringa result. W linii 40 na urządzenie wyjścia wypisywany jest zaszyfrowany tekst.
Jest to chyba najprostszy możliwy sposób w jaki można zaimplementować algorytm szyfrowania przestawieniowego.
sobota, 14 maja 2011
Algorytm losujący #1
Podstawowe biblioteki C++ nie oferują zbyt wiele w zakresie generowania losowości – zwłaszcza w kwestii generowania liczb losowych z określonego przez nas przedziału. Mamy co prawda funkcję rand() zdefiniowaną w pliku cstdlib (stdlib.h), jednakże jest ona dość niewygodna do stosowania w niektórych sytuacjach, nie biorąc już nawet pod uwagę zmniejszenia przejrzystości kodu.
Bardzo dobrą praktyką jest napisanie własnej implementacji funkcji losującej dostosowanej do naszych potrzeb. Poniżej przedstawię i opiszę jeden z wielu algorytmów, które bazują na funkcji rand() z biblioteki standardowej.
Kod funkcji losującej:
Bardzo dobrą praktyką jest napisanie własnej implementacji funkcji losującej dostosowanej do naszych potrzeb. Poniżej przedstawię i opiszę jeden z wielu algorytmów, które bazują na funkcji rand() z biblioteki standardowej.
![]() |
| Schemat blokowy algorytmu |
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { int min, max, result; cout << "Podaj dolna granice przedzialu: "; cin >> min; cout << "Podaj gorna granice przedzialu: "; cin >> max; if (max >= min) { max -= min; } else { int tmp = min - max; min = max; max = tmp; } srand(time(NULL)); if (max < 0) { result = min; } else { result = (rand()%max) + min; } cout << "Wynik: " << result; return 0; }
Jak widać algorytm ten nie jest zbyt skomplikowany. Przyjmuje dwa argumenty: min (minimalna liczba jaką chcemy wylosować) i max (maksymalna liczba jaką chcemy wylosować). Następnie sprawdzane jest, czy maksymalna liczba jest większa lub równa minimalnej. Jest to takie małe zabezpieczenie, w przypadku gdyby ktoś korzystający z tego algorytmu pomylił się podczas kodzenia. Jeśli minimalna liczba jest większa od maksymalnej, ich wartości zostają zamienione miejscami. Dodatkowo w zarówno jednym, jak i drugim wyniku warunku od wartości maksymalnej odejmowana jest minimalna, co daje nam ilość możliwych wylosowanych liczb. Później sprawdzane jest czy owa ilość jest większa od zera, a jeśli nie to ostatecznie funkcja zwraca wartość minimalną (min). W przypadku gdy max jest większe od 0 za pomocą wbudowanej w biblioteki standardowe funkcji rand() losujemy liczbę. Wylosowana liczba podzielona przez ilość możliwych liczb do wylosowania daje resztę, do której dodajemy wartość minimalną. W efekcie otrzymujemy (pseudo)losową wartość z przedziału wprowadzonego na początku działania algorytmu.
Subskrybuj:
Posty (Atom)
