Google Chrome: jak pozbyć się translatora?

Dobra wiadomość dla tych, którzy nie brzydzą się przejścia na Google Chrome: da się wyłączyć te głupie propozycje na tłumaczenie każdej strony, jaka nie jest w naszym rodzimym języku. Nie jest to łatwe, ale wykonalne.

Ja również należę do ludzi, których ten wysuwający się co chwila pasek zwyczajnie irytuje. Już nawet pomijając kwestie prywatności, bo domyślam się, że to jedyny powód dla którego obsługa tzw. tłumaczeń została domyślnie wbudowana w tą przeglądarkę. Drażni mnie to i już. Tyle na ten temat.

Aby wyłączyć te natrętne pytania o użycie Google’owego tłumacza, należy:

  1. Uruchomić Google Chrome
  2. Po prawej od paska adresu znajdujemy przycisk “Dostosowanie i kontrola Google Chrome”, klikamy
  3. Wybieramy opcje “Ustawienia” (można też od razu wejść na adres: chrome://settings/)
  4. Klikamy na “Pokaż ustawienia zaawansowane”
  5. Wyszukujemy sekcję “Języki”
  6. Odznaczamy opcję “Oferuj tłumaczenie stron w innych językach”

Tylko tyle i aż tyle potrzeba było, aby świat (z Google Chrome włącznie) stał się dla mnie przyjemniejszym miejscem. Dlaczego nie dało się umieścić w opcjach tego całego irytnika “nie oferuj mi tłumaczeń w ogóle”? No cóż, pewnie Google nie chciało tracić danych na temat stron jakie oglądamy. Nasuwa się też pytanie: w jaki sposób przeglądarka rozpoznaje język strony? Czy ma lokalnie jakiś zaimplementowany na to algorytm, czy też może przesyła tekst strony na serwer korporacji w ramach zapytania? Mam nadzieję, że to pierwsze. A jeśli nie, to miejmy nadzieję, że wyłączenie całkowite propozycji tłumaczenia deaktywuje też sprawdzanie języka.

W kolejnym odcinku, jeśli pobawię się Chromem nieco więcej, to może zajmiemy się jakimś Adblockiem

Linki

JavaScript: Undefined vs. null

Znajomy zapytał mnie dzisiaj czy to dobry kod:

W pierwszym odruchu utwierdziłem go (pytał by się upewnić), że nie, że lepiej byłoby użyć słowa kluczowego null. Argumentowałem nawet, że undefined można sobie swobodnie nadpisać. Wyczytałem to zdaje się na Stackoverflow.

Jednak kiedy, spróbowałem sprawdzić moje własne słowa, znalazłem tą oto małą notkę:

JavaScript 1.8.5 note

Starting in JavaScript 1.8.5 (Firefox 4), undefined is non-writable, as per the ECMAScript 5 specification.

W skrócie: nie można (przynajmniej w nowszych przeglądarkach) nadpisać undefined. Operator === też działa prawidłowo z użyciem undefined. Nie ma więc nie bezpieczeństwa? Czyżbym wpuścił kolegę niechcący w maliny?

Ale dalej mi się to wszystko nie podobało. Należy pamiętać, że:

  • undefined nie jest stałą
  • nie jest też słowem kluczowym języka JavaScript (sprawdźcie sami)
  • nie jest nawet słowem zastrzeżonym pod przyszłe użycie
  • otrzymamy wyjątek jeśli napiszemy coś takiego: if (zmienna_niezadeklarowana_wcześniej === undefined) (trzeba więc użyć operatora typeof)

Czym więc jest undefined? Jest zmienną globalną (choć tylko do odczytu od jakiegoś czasu). Lokalnie (wewnątrz funkcji) możemy ją sobie swobodnie nadpisać. Więc, jeśli nawet nie widać niczego złego przy wywołaniu kodu:

{geshi lang=javascript}var a; var undefined = 42; console.log(a); // undefined console.log(undefined); // undefined console.log(a == undefined); // true

To wystarczy wstawić go do wewnątrz funkcji:

)();

Podsumowanie

Morał jest więc prosty: jeśli cenicie sobie jakość swojego dzieła, nie chcecie, aby się z was koledzy śmiali: używajcie null do inicjacji zmiennych, nie polegajcie na tych małym potworku jakim jest undefined. Jego używamy tylko do analizy np. zmiennych globalnych. Ja widzę też jeszcze powód dla którego lepiej jest użyć null: jeśli chcemy przywrócić pierwotną wartość zmiennej, bardziej naturalne jest przypisanie do niej właśnie null.

Taka jest moja opinia. Bardzo chętnie zapoznam się z jakąś dobrą argumentacją (jeśli jest takowa) przeciw.

Linki

openSUSE: dodawanie obsługi protokołu Tlen do Pidgina

Ta notka jest przeróbką mojej poprzedniej: “Dodanie obsługi Tlen do Pidgina“. O ile tamta była dla Ubuntu, ta jest dla openSUSE 11.4.

  1. Instalujemy Pidgina ze źródłami. Polecenie: sudo zypper install pidgin pidgin-devel (można to też oczywiście zrobić za pomocą YaST-a, ale mam już swoje przyzwyczajenia, no i tak jest szybciej).
  2. Ściągamy najnowsze źródła z ~alek/pidgin-tlen
  3. Rozpakowujemy te źródła, gdzie nie ma znaczenia.
  4. Wykonujemy polecenie make w katalogu z rozpakowanymi źródłami.
  5. Edytujemy plik Makefile, drugą linijkę zamieniamy na: LOCALBASE?= /usr (czyli usuwamy frazę /local).
  6. Dla systemów 64 bitowych: trzeba zamienić katalog lib na lib64. W Vim-ie Możemy to zrobić za pomocą polecenia: :%s/\/lib\//\/lib64\//g (około trzech wystąpień).
  7. Zmiany oczywiście zapisujemy.
  8. Teraz możemy wklepać sudo make install.

Wygląda na to, że działa, choć w sumie, openSUSE mam dopiero od kilku dni.

Z ostatniej chwili (16.10.2012):

Autor pluginiu przeniósł się na GitHub.

Bash – wybredne kopiowanie

Domyślnym katalogiem na pobieranie plików w moich przeglądarkach, jest pulpit. Stamtąd rozdzielam pliki wedle własnego widzi mi się, jednak pewną klasę plików, życzę sobie mieć zawsze w pewnym specyficznym katalogu. Do tej pory, przenosiłem je tam ręcznie, ale uświadomiłem sobie, że przecież nie jest trudno proces ten zautomatyzować. Po pięciu minutach powstała ta oto linijka:

" = "" ] && cp "$1" ""

Ten skrypt oczywiście wykorzystuje do otwierania pliku z poziomu przeglądarki. Najwięcej problemu było ze sprawdzeniem poprawności zadanego parametru ($1). Należało jednak upewnić się, czy parametr jest plikiem (to z pomocą: -f) i czy ma zadane rozszerzenie. Zamieszczam, aby mi się nie zgubiło. Na co warto zwrócić uwagę:

  • ${1##*.} – to wyrażenie zwraca rozszerzenie pliku (tutaj dla zmiennej $1). Dla nazwy np. “nazwa.z.kropkami.txt”, zwróci “txt”. Po sieci można znaleźć wersje z jednym płotkiem (#), ale wtedy wynikiem są wszystkie znaki po pierwszej kropce (szczegóły w załączonych linkach)
  • [ (...) -a (...) ] – I (ang. AND) w składni programu test, używanego przy warunkach w Bashu

Z pomocą: bash String Manipulations i Linux tip: Bash test and comparison functions.

Dodanie obsługi Tlen do Pidgina

Jak wiadomo, w najnowszym Ubuntu (10.04 LTS – Lucid Lynx) zrezygnowano z komunikatora Pidgin i zaproponowano inny – Empathy. Chciałem dać mu szansę, ale w końcu wymiękłem i zainstalowałem z powrotem Pidgina.

Czemu? Przywykłem, miałem go skonfigurowanego (import profili zadziałał tylko połowicznie) jak również w Pidginie miałem zainstalowaną obsługę protokołu Tlen (coś słabo z tym na Empathy), z którego korzystam. Jego obsługa nie jest rzeczą natywną dla wspomnianego komunikatora, tak więc któryś już raz z kolei zastanawiałem się, co właściwie się robiło. Dlatego właśnie postanowiłem wstawić sobie na bloga (tego) krótki opis kompilacji i instalacji pluginu Tlen.

  1. Instalujemy Pidgina ze źródłami. Polecenie: sudo apt-get install pidgin pidgin-dev
  2. Ściągamy najnowsze źródła z ~alek/pidgin-tlen
  3. Rozpakowujemy te źródła, gdzie nie ma znaczenia.
  4. Wykonujemy polecenie make w katalogu z rozpakowanymi źródłami.
  5. Teraz to trudne: edytujemy plik Makefile, drugą linijkę zamieniamy na: LOCALBASE?= /usr (czyli usuwamy frazę /local, bo Pidgin na Ubuntu trzyma swoje pluginy w katalogu /usr/lib/purple-2, a nie w /usr/local/lib/purple-2/).
  6. Wciąż edytując plik Makefile, zamieniamy wszystkie cztery wystąpienia wheel na root (w edytorze Vim wystarczy polecenie: :%s/wheel/root/g).
  7. Zmiany oczywiście zapisujemy.
  8. Teraz możemy wklepać sudo make install.
  9. Powinno wszystko działać bez problemów razem z ikonkami na swoim miejscu (mam nadzieję…) – jak to sprawdzić? Przy zarządzaniu kontami, wybrać opcję “Dodaj” i na liście protokołów powinien znaleźć się “Tlen.pl”.

Posłowie

  • Zamieszczony tu sposób działa też na systemie Mint (nie ma się co dziwić, bazuje on na Ubuntu).
  • Autor pluginu przeniósł swoje źródła na Github – zostawił co prawda przekierowanie, jednak jakby co, to link znajdziecie poniżej.

Linki

Krótka recenzja Lenovo G550

Moje zadanie było proste, zainstalować na laptopie Lenovo G550, numer modelu: 20023, jakiś inny niż aktualny system. A że miałem na to kilkanaście dni, to zdążyło mi się nasunąć kilka uwag odnośnie tego sprzętu. Na ów drugi system wybrałem Ubuntu wersję 9.10, po części dlatego, że system nie powinien sprawiać za dużo problemów swojemu nowemu użytkownikowi, ale również dlatego, że miałem już gotową płytkę.

Inaczej niż podczas moich poprzednich zabaw z laptopami (HP 6735s FU601ES – pierwsze starcie), w tym przypadku oszczędzono mi zarówno wyboru modelu, czy pierwszych chwil z nim. Coś tam wspomniano, że obecny na dysku (250 GB, jak ktoś nie chce zaglądać do dokumentacji, a go to ciekawi) Windows 7 to domyślny system, w każdym razie nie mogę nic powiedzieć o instalacji tegoż systemu, ale podejrzewam, że nie powinno być problemu np. ze sterownikami. Chyba, że chcemy instalować którąś z wciąż powszechnych poprzednich wersji tego systemu.

O Ubuntu na Lenovo G550

Jeśli natomiast chodzi o instalację Ubuntu, to najbardziej złożonym etapem było wydzielenie partycji, czyli nie było żadnych problemów. W zasadzie zaraz po instalacji jest ono już w pełni skonfigurowane i gotowe do pracy, z jednym małym wyjątkiem – sterowniki do WiFi, jako własnościowe, należy dociągnąć sobie we własnym zakresie. We własnym zakresie, czyli z menu System->Administracja->Sterowniki należy wybrać właściwą opcję. Aby ta się pojawiła, trzeba dodać dodatkowe repozytoria, a być może tylko pozwolić na update systemu. Ja wybrałem opcję “automatyczna konfiguracja systemu” z załączonego do polskiej wersji Ubuntu skryptu konfigurującego. Mała uwaga: nie wiedzieć czemu moje Ubuntu strasznie polubiło sieć bezprzewodową dostępną w pracy. Obudzone po hibernacji w domu wciąż i wciąż chciało się z nią łączyć, mimo iż była dostępna niezabezpieczona sieć domowa. Czasem trzeba było restartować system. W drugą stronę nie było żadnych problemów. Nie sprawdzałem pod tym kątem systemu Windows 7.

A tak w ogóle, to oto i on

Teraz może dla odmiany trochę o samym laptopie. Bateria trzyma około trzech godzin. Klawiatura posiada blok numeryczny, przez co touchpad jest przesunięty w lewo, tak aby był na środku “właściwej” części klawiatury. Podobno niektórym to przeszkadza, ja akurat nie używam laptopów na co dzień, więc aż tak bardzo mi to nie wadziło, choć od czasu do czasu zamiast przesuwać kursor używałem “rolki” (małego skrawka touchpada po prawej, który służy w takim charakterze). Jeszcze jakby wymienili klawisz funkcyjny z sąsiadem – lewym CTRL, bo często zdarzało mi się je mylić. Po kilkunastu dniach zauważyłem też, że chociaż lapek był względnie nowy, pod światło widać było ślady używania na touchpadzie. Obudowa sprawiała wrażenie jakby miała pęknąć, kiedy chwytałem urządzenie w pośpiechu, ale normalnie na taką nie wygląda.

Podsumowanie

Przyznam, że nie próbowałem na tym sprzęcie wymagających gier, według innych recenzji, Lenovo G550 nie radzi sobie z nimi. Codzienna praca, czyli otwieranie przeglądarki, jakiś film czy słuchanie muzyki, przy korzystaniu z jakiegoś pakietu Office lub środowiska programistycznego, przebiegało sprawnie i bez zarzutu. Małym minusem dla mnie była też mała rozdzielczość ekranu, jak wspomniałem wyżej, na co dzień korzystam z normalnych pecetów. Czas i na podsumowanie: Lenovo G550 to dobry i przystępny cenowo sprzęt biurowy, który można wynieść i pracować na nim poza biurem. A w związku z tym, nie ma sensu używać na nim Windowsa, wszak i tak nie pogramy 😛

Linki

O JPanel w stałym rozmiarze na JFrame

Jakiś czas temu poszukiwałem sposobu, aby zmodyfikowany przeze mnie JPanel zachowywał swój rozmiar niezależnie od wielkości okienka (obiekt JFrame), na którym bezpośrednio leżał. Kosztowało mnie to nieco nerwów. Nie wystarczyły metody setSize, setPreferredSize, setMaximumSize, setMinimumSize, użyte jak w poniższym przykładzie:

setSize(width, height);
setMaximumSize(getSize());
setMinimumSize(getSize());
setPreferredSize(getSize());

Niezależnie od moim starań potomek JPanel rozlewał się na całą powierzchnię obiektu JFrame. Winnym jest tutaj domyślny LayoutMenager obiektów JFrameBorderLayout (wniosek: warto zaglądać do dokumentacji). Osobiście uważam to za drażniące zachowanie rozszerzać na siłę element, łamiąc jego maksymalny ustawiony rozmiar, ale jak się nie ma co się lubi, to się lubi co się ma.

Rozwiązania widzę dwa: pierwsze to zmienić JFrame menadżera rozmieszczania elementów na np. FlowLayout. Drugim rozwiązaniem jest wstawienie naszego obiektu, nazwijmy go MyJPanel, w nowo utworzony obiekt JPanel i dopiero ten wstawić do JFrame. Zilustruje to małym przykładem:

JFrame frame = new JFrame("Test");
JPanel p = new JPanel();
p.add(new MyJPanel());
frame.getContentPane().add(p);

Teraz ten nowy, opakowujący JPanel jest rozszerzany przez obiekt okienka programu, a nasz – właściwy – pozostaje nietknięty. W sumie ta druga metoda to zastosowanie tej pierwszej w nieco inny sposób, ale może się przydać, jeśli z jakiegoś powodu nie mamy pełnego dostępu do obiektu JFrame.

Linki

Parsowanie spisu imienin #2

Swego czasu ‘popełniłem’ jeden mały skrypt na użytek własny, który miał mi przerobić listę imienin ściągniętą z Wikipedii (strona: Imieniny) na zbiór zapytań SQL, które potrzebne mi były do jednego projektu. Patrząc z perspektywy czasu napisałem mały koszmarek.

Mimo to, w końcu to nieświadomie, miałem kilka wejść ludzi którzy poszukiwali następujących fraz:

  • skrypt imienin
  • sql z imieninami
  • linux imieniny
  • imiona.txt
  • szablon daty imienin
  • imieniny daty
  • imieniny.sql
  • spis imienin
  • itp…

To właśnie zapotrzebowanie czytelników, choć być może i jednorazowych, skłoniło mnie, w ramach ćwiczeń z Pythonem, do ucywilizowania mojego dzieła. Z marnych 40 linii kodu powstało ich jakieś 200 (ściślej, wliczając komentarze i puste linie 250). Ale mimo to uważam go za lepszy. Przede wszystkim wiem więcej o wyrażeniach regularnych, a kod jest obiektowy, przez co łatwo jest – mam nadzieję – dostosować go do indywidualnych potrzeb użytkownika.

Przykłady uruchomienia

Zamieszczam przykładowe wyniki działania mojego najnowszego dziecka:

Ogólna zasada działania

Ponieważ nie wiem, jaką kto założył sobie bazę danych, jakie ma w niej tablice i relacje między nimi, nie napisałem klasy generującej SQL, ale zakładam, że na podstawie opisów oraz przykładów i przy odrobinie smykałki do Pythona łatwo będzie uzyskać to co tam się komu wymarzy.

Nie mniej jednak oto i krótki kurs: klasą która dostaje i formatuje dane na koniec, jest jakiś potomek klasy AbstractLineParser. Ważne jej metody, które należy przeciążyć to: _setNames oraz _setDates. Należy pamiętać, iż obie dostają jako parametry listy (bo jedno imię zwykle ma wiele dat, a imię też może występować w odmianach). Zawsze też dostaje się najpierw imiona, a potem daty do nich. Resztę można wywnioskować samemu, albo przebrnąć przez komentarze.

Kod skryptu można zobaczyć, lub pobrać z tego oto linka

Słowo końcowe

Cóż, moje testowanie błędów nie wykazało, jednak przestrzegam, przed imieniem: “Apollo(n)” (to chyba jedyny taki przypadek). Ignorowane też są imiona, z których czytelnik został odesłany – np. Adelgunda, zob. Adalgunda. Nie zabraniam modyfikacji, nawet zachęcam, nie biorę odpowiedzialności za wszelakie zło wyrządzone przez ten skrypt (no bez przesady, to tylko trochę kodu w Pythonie).

Na końcu chciałem podziękować (w kolejności chronologicznej): tym którzy komentowali mój poprzedni post, bo ich rady jakoś tam się przydały, następnie mojej Pani, która bez wątpienia zna się na Pythonie lepiej niż ja – bez złośliwości, wiem że to nie jest trudne – za pomoc.

Braki Google Chrome

Oto mój własny post z nieoficjalnego cyklu wydawniczego “oh, mam już Google Chrome, jest super”. Google Chrome Beta dla systemu Linux. Jako, że się nieco nie spieszyłem z publikacją – trzeba jakoś to przetestować, co nie? – wyszło nieco później niż inni.

Szczypta historii

Rzeczony Google Chrome zainstalowałem około piątku 19 grudnia, zwabiony przez zauważoną reklamę na serwisie YouTube (dalej tam chyba jest). W końcu pojawiła się wersja na porządny system! Jeśli chodzi o instalacje, dostępne są paczki rpm oraz deb w wersjach 32 i 64 bitowej. Dodatkowo jest odnośnik do strony społeczności, dla tych, którzy wolą inne, ale nie sprawdzałem tej opcji.

Cierpienia młodej przeglądarki

Instalacja przebiegła raczej bez problemów, przeglądarka wylądowała w menu systemowym. Po uruchomieniu natychmiast zażądała stania się domyślną. “O co to to nie, trzeba sobie zasłużyć” pomyślałem klikając na “nie”. Google Chrome nie dało za wygraną i w wysuwanym pasku z góry wciąż skarżyła się na niesprawiedliwość dziejową. Szczęściem można było jej powiedzieć “Shut up!”, czy jak kto woli “Zamknij się”, bo (prawie) całość jest poprawnie przetłumaczona na język polski.

Tutaj dopiszę, z kronikarskiego obowiązku, że nowa wersja przeglądarki na wstępie przy pierwszym uruchomieniu pyta, czy chcemy, wspierać jej rozwój (wysyłając raporty), czy chcemy importować (domyślnie tak) ustawienia z Mozilla Firefox (przy okazji, mam też Operę, co, ona nie istnieje?). A skoro już o tym mowa, to warto w opcjach zajrzeć na zakładkę “Dla zaawansowanych”, zwłaszcza osoby, którą cenią sobie prywatność.

Bilbord a rzeczywistość

Opis marketingowy głosi:

The web browser from Google Google Chrome is a browser that combines a minimal design with sophisticated technology to make the web faster, safer, and easier.

Przede wszystkim, faktycznie przeglądarka jest minimalistyczna. To fakt dość znany. I jest to przeglądarka od Google – wyszukiwarki tej firmy nie da się usunąć z listy możliwych (to również okazało się nieprawdą, na co zwrócił mi uwagę Michał w swoim komentarzu). Da się jedynie zmienić jej słowo kluczowe (a swoją drogą, pragnę przypomnieć niektórym, np. dziennikarzom polskich serwisów informacyjnych, że idea słów kluczowych w pasku adresu istniała jeszcze przed Google Chrome). Jako ciekawostkę dodam, że do zapytania do wyszukiwarki Google, Google Chrome dodaje informację o tym, że używamy Chrome właśnie.

O sophisticated technology nie powiem nic na razie, przejdę do punktu to make the web faster. No jest szybka. W porównaniu do mojego FX (jeśli porównywać ją z Operą, to raczej gołym okiem się tego nie widzi). Tego aż tak bardzo nie widać na zwykłych stronach, ale czuć to wyraźnie, jeśli strona przepełniona jest JavaScriptem (bolączka Firefoksa). Google Chrome Podobnie jak FX potrafi się przyciąć przy sporej liczbie otwieranych na raz zakładek (taką fajną skryptozakładkę sobie znalazłem), machając przy tym ostrzeżeniem na środku ekranu o niekomunikatywnych kartach.

Jeśli chodzi o “easier”, to jak dla mnie nawet za dużo tej prostoty, ale w zasadzie to taki Firefox bez rozszerzeń z pochowanymi paskami. O bezpieczeństwie na razie wiele wiele mądrego nie jestem w stanie powiedzieć.

A wracając do tematu

Przejdźmy do tytułowych braków: po pierwsze, to wciąż beta. Ciekawe, czy wzorem Gmail ten status utrzyma się przez dobrych kilka lat. Po drugie: dość poważnym brakiem jest brak możliwości usunięcia całej historii za jednym razem, trzeba kilka po jednym dniu. Być może nie zauważyłem tego magicznego guziczka, jestem gotowy pokajać się (i faktycznie, możliwość jest, ale ukryta w opcjach, jak słusznie zwrócił mi uwagę gopix – patrz komentarze). Drugim brakiem jest brak gestów. Tzn, samo rozszerzenie istnieje, ale nie działa na systemach Linux. A jeśli już o rozszerzeniach: nie jest ich jeszcze może tyle, co w przeglądarce Mozilli, ale całkiem sporo jest (w tym i jakiś Adblock się znajdzie). Szkoda tylko, że duża ich liczba dotyczy portali typu Twitter, czy Facebook, czyli de facto dla mnie rozszerzeń bezużytecznych. Zapewne kiedyś to się zmieni. I jeszcze taka moja prywatna wada: nie na wszystkich stronach (czytaj: zwłaszcza na tych, na których mi zależy) zgłasza się menedżer haseł.

Bilans zysków i strat

Wyszła nawet całkiem nieźle. Wymaga jeszcze trochę dopieszczenia, ale to całkiem użyteczna przeglądarka, z pewnością warto przyjrzeć się jej bliżej. Cieszy mnie to też dlatego, że nic tak nie motywuje do szybszego sprintu, jak ciepły oddech konkurencji na plecach. Liczę więc, że Mozilla nie pozostanie Google dłużna.