Monthly Archives: January 2014

Słownik pod ręką – czyli tłumaczenie bez myszkowania

trans

Przepis na minimalistyczny słownik:
1. Klawisze skrótu do słownika
Pierszą fazą jest przeznaczenie osobnej przeglądarki na słownik dzięki temu można przypisać ją do skrótu klawiszowego i miec pewność, że zawsze ujżę słownik gdy ją wywołam. Na Windows wystarczy przypiąć przeglądarkę na pierwszej pozycji na pasku dostępu i za pomocą kombinacji klawiszy WIN+1 odwołać się do programu.  Ponowne użycie spowoduje powrót do poprzedniego okna. Aby przypisać inny skrót można posłużyć się programem AutoHotkey.  Trochę więcej zabawy było na LinuxMintale wiem z autopsji, że się da:)

2. Konfiguracja przeglądarki

Generalnie podobny efekt jest do uzyskania w każdej przeglądarce – ja proponuję modyfikację Chrome:
Zakładamy nowy profil w Chrome  https://support.google.com/chrome/answer/2364824?hl=pl
Wrzucamy wtyczkę:

https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=pl

Konfigurujemy wtyczkę:
Klik: ikone Tapermonkey
Klik: Dodaj nowy skrypt
Wklejamy (nadpisujemy wygenerowany kodzik)

// ==UserScript==
 // @name trans
 // @namespace http://your.homepage/
 // @version 0.1
 // @description enter something useful
 // @author You
 // @match https://translate.google.pl/
 // @require http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
 // @grant none
 // ==/UserScript==</code>
$('#gb').remove()
 $('#gt-ft').remove()
 $('#gt-tl-gms').remove()
 $('#gt-lang-submit').remove()
 $('#gt-appbar').remove()
 $('#clear').remove()
 $('#gt-ft-res').remove()
 $('#gba').remove()
 $('#gt-swap').prependTo('#gt-src-tools');
 $('#gt-community-promo').remove()
 $('#gt-src-roman').remove()
 $('#gt-speech').remove()
 $('#gt-res-select').remove()
 $('#gt-pb-star').remove()
 $('#select_document').remove()
 document.getElementById('gt-text-top').style.paddingBottom = '0px'

Klik: save
W opcjach skrótu na pasku windows:
nowy_chrome
Przypinamy do paska, a potem wchodzimy w Properties
Ja mam taki target:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --profile-directory="Profile 2"

Dodaję:

 --kiosk --app="https://translate.google.pl/"

Czyli razem mam:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --profile-directory="Profile 2" --kiosk --app="https://translate.google.pl/"

Save

3. Odpalam ze skrótu i mam piękny słownik
Wystarczy go wypozycjonować i to przy każdym ponownym otwarciu będzie pojawiać się z określoną wilkością i pozyją
Przypinamy słownik (ja daję go na moje ulubione miejsce czyli pierwsze na pasku windows)
Co można zauważyć – mamy dwie ikony – przeglądarki która odpaliła słownik i słownik.
Zamień Target  pomiędzy tymi dwoma skrótami:

1. Po edycji przeglądarka główna ma miec skrót:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --profile-directory="Profile 2"

2. A słownik:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --profile-directory="Profile 2" --kiosk --app="https://translate.google.pl/"

(jak słownik jest aktywny to jest to ikona translate a jak wyłączony to zwykła ikona google) służy on po to aby słownik pojawiał się na właściwym miejscu ( gdy chcemy korzystac ze skrótu win+1)

Dla estetów do srótu desktopowego można dać ikonkę z

http://www.iconarchive.com/show/google-play-icons-by-marcus-roberto/Google-Translate-icon.html

4. Skróty jakich używam
Win+1  przejście/wyjście z translate
Tab+Enter okno puste = zmień język, okno z treścią = kasuj
LAlt+strzałka prawo/lewo nawigowanie po histrii
Tylko dla Opery:
Ctrl+n nowa karta – np dla http://www.diki.pl/
Tab+Ctrl przemieszczanie się między kartami
Ctrl+w zamknij tab

Teraz wystarczy powielić ten patern na wszystkich komputerach na których pracujemy i TADAAA uzależnienie gotowe 🙂

Efekt – dwa razy mniejsze dedykowane okno + tylko to czego potrzebuję + obsługa z klawiatury.
final

PS. Czasem zdarza się, że Google aktualizuje Tłumacza i trzeba zrobić również aktualizację skryptu… nic za darmo 😀

5. Gdy nienawidzimy gugla to można skorzystac ze starej Opery – efekt też jest ciekawy:

5.1 Pozbycie się niepotrzebnych kontrolek

Praktycznie każda przeglądarka oferuje wtyczkę która uruchomi skrypt pozwalający na wyczyszczenie niepotrzebnych elementów z używanej strony. W Operze12 użyłem rozszerzenia Scripter https://addons.opera.com/pl/extensions/details/scripter-script-includer
Po przejściu na stronę google translate do Scriptera ustawiłem opcję onready w Script execution order oraz dodałem prosty skrypcik usuwający/ukrywający dane elementy oraz przestawiający przycisk do zmiany języka tak aby można było do niego dostać się natychmiastowo klikając Tab

function loadScript(url, callback)
{
    // adding the script tag to the head as suggested before
   var head = document.getElementsByTagName('head')[0];
   var script = document.createElement('script');
   script.type = 'text/javascript';
   script.src = url;

   // then bind the event to the callback function 
   // there are several events for cross browser compatibility
   script.onreadystatechange = callback;
   script.onload = callback;

   // fire the loading
   head.appendChild(script);
}

loadScript("http://code.jquery.com/jquery-1.8.3.min.js", null)
$('#gb').remove()
$('#gt-ft').remove()
$('#gt-tl-gms').hide()
$('#gt-lang-submit').hide()
$('#gt-appbar').hide()
$('#clear').hide()
$('#gt-ft-res').hide()
$('#gba').hide()
$('#gt-swap').prependTo('#gt-src-tools');
document.getElementById('gt-text-top').style.paddingBottom = '0px'

5.2 Zagospodarowanie przestrzenne przeglądarki

Mój wybór padł na Operę v12 (wersja przed WebKitowa) gdyż pozwala na świetne modyfikacje okna. Usunąłem wszystkie bary i taby (prawy przycisk myszki na dowolnym barze -> Customise->Appearance… -> Toolbars) oraz zmiejszyłem widok o 10% (ctrl-). Po takim zabiegu do opcji Opery można się dostać poprzez malutki przycisk znajdujący się na środku lewej ramki okna
Okno pomniejszyłem maksymalnie tak aby nie generowało scroll barów oraz umieściłem w wygodnym miejscu na pulpicie.
transBlog3

Skrypt windows do parsowania xml umieszczonego w logu

Czasem trzeba odowiedzić loga – a tu zonk, wiadomość loggera zlepiona z xmlowym outputem:

2014-01-02 13:52:01.3850|TRACE|SuperService|Method GetStock ended with result: <Body xmlns:m="http://www.example.org/stock"><m:GetStockPrice><m:StockName>IBM</m:StockName></m:GetStockPrice></Body>

No i miliony takich linni kiedy mnie interesuje tylko ta najświeższa 🙂
Zacznijmy od pokazanej linijki – ląduje ona w pliku input.txt (jak? – o tym później) i zostanie przetworzony przez skrypt transform.bat

REM http://ss64.com/nt/for_f.html

@echo on
set file=input.txt
set out=output.xml
for /f "tokens=1,* delims=<" %%a in (%file%) do (
echo ^<DETAILS d^=^"%%a^"^>^<%%b^</DETAILS^>>%out%
)
pause

Krótki komentarz do linni
1 Tak się robi komentarze – w tym znajduje się link do fajnego omówienia tematu dzielenia tekstu w batch
3  Echo włączone – czyli widać jak nasz skrypt się wykonuje na konsoli – wystarczy zmienić parametr na off aby skrypt nie pokazywał okna
4 i 5 Ustawienie plików wejścia i wyjścia
6 Iteracja po liniach – token wydziela składniki z danej lini uzyskane za pomocą znaku rozdzielającego delims, w tym przypadku do 1 pobieram wszystko co znajduje się przed rozpoczęciem  znaku rozdzielającego – czyli aż do oraz resztę *, pierwsza wartość ląduje w zmiennej %%a  a pozostałe domyślnie w kolejnych %%b itd. do rozpoczyna sie ciało pętli
7 Do pliku output.xml zapisuję pierwszy wydobyty nie xmlowy tekst, który opakowuje  w tag – może on mieć dowolną nazwę, ja przyjąłem DETAILS oraz dodaję atrybut d który zawierać będzie wartość czyli pierwszy fragment tekstu. Wszystkie znaki specjalne które chcę zapisać do pliku escape’uje poprzez użycie daszka ^, oraz dokładam zmienną reprezentującą pierwszę linie %%a – powstaje coś takiego ^<DETAILS d^=^”%%a^”^>
Jako, że użyłem znaku < jako rozdzielacza trzeba go dodać bo jest on usuwany no i skleić z resztą lini z loga ^<%%b
Na koniec wystarczy dodać taga zamykającego ^</DETAILS^> i wszystko przekierować do pliku wynikowego >%out%
8 Zamykam petlę
9 I rozkazuję czekac skrypciochowi na moją reakcję 🙂

<DETAILS d="2014-01-02 13:52:01.3850|TRACE|SuperService|Method GetStock ended with result: "><soap:Body xmlns:m="http://www.example.org/stock"><m:GetStockPrice><m:StockName>IBM</m:StockName></m:GetStockPrice></soap:Body></DETAILS>

Jest nieźle – przy użyciu Notepad++ z zainstalowanym pluginem XML Tools wystarczy użyć opcji Pretty Print (ctrl+shift+alt+b)  i można podziwiać prawidłowo wyświetlonego XML

Ale to za mało czas na stworzenie czegoś w powershell

#last item from file
(Get-Content logfile.txt)[-2..-1]| Out-File -Encoding UTF8 input.txt
#adding xml marks to file
transform.bat
#formatting xml
[Reflection.Assembly]::LoadWithPartialName("System.Xml.Linq")
[System.Xml.Linq.XDocument]::Load("output.xml").Save("output_pretty.xml")
Get-Content output_pretty.xml
pause

Opis linii:
1 Komentarz
2 Wyjącie ostatniej lini z pliku (Get-Content logfile.txt)[-1] więcej możecie poczytać tu: http://technet.microsoft.com/en-us/library/ee692806.aspx
Następnie trzeba zapisać ze zmienionym kodowaniem bo domyślne USC-2 Little Endian nie za bardzo podchodzi skryptowi batch 🙂
4 Mając przygotowany plik z ostatnią linią można odpalić skrypt dodający tagi
6 Korzystanie z .NETowych bibliotek – dodaje Linq
Niby to jest już nieaktualna forma ale nie ma godnego zastępnika http://stackoverflow.com/questions/12923074/how-to-load-assemblies-in-powershell
7 Tu następuje proces transformacji jednolinijkowego xml do pliku
8 Zawartość ląduje na konsoli 

TADAAA – to już jest czytelne
powershell

Oczywiście przedstawiony case jest dość specyficzny – ale stanowi świetną bazę dla dalszych transformacji i eksperymentów.