itoutline.me

 

Home & End

Klawisze Home i End w OSX przemieszczają kursor na początek albo koniec strony, inaczej niż w windows, gdzie przechodzimy na początek albo koniec linii. Ostatnio podłączyłem klawiaturę z takimi klawiszami i okazało się, że moje palce mają świadomość okien, ponieważ co chwilę niepotrzebnie w nie stukały. Ja sam wiedziałem, że to bezcelowe i wyrzuci mnie do niechcianego miejsca w dokumencie. Na szczęście udało mi się zsynchronizować. Wystarczy dopisać do ~/Library/KeyBindings/DefaultKeyBinding.dict poniższe linie:

{
"UF729"  = "moveToBeginningOfLine:";
"UF72B"  = "moveToEndOfLine:";
"$UF729" = "moveToBeginningOfLineAndModifySelection:";
"$UF72B" = "moveToEndOfLineAndModifySelection:";
}

Po instalacji ML, katalog KeyBindings nie jest obecny. Trzeba go założyć i stworzyć plik DefaultKeyBinding.dict

Sprawę można załatwić tym one-linerem o ile oczywiście nie mamy już jakichś własnych ustawień w DefaultKeyBinding.dict ponieważ zostaną one nadpisane.

mkdir ~/Library/KeyBindings/; echo -e "{\n\"UF729\" = \"moveToBeginningOfLine:\";\n\"UF72B\" = \"moveToEndOfLine:\";\n\"\$UF729\" = \"moveToBeginningOfLineAndModifySelection:\";\n\"\$UF72B\" = \"moveToEndOfLineAndModifySelection:\";\n}" > ~/Library/KeyBindings/DefaultKeyBinding.dict

Make life easier

Czasami łatwość z jaką można sobie podnieść komfort pracy jest zaskakująca. Zawsze przy testowaniu jakichś skryptów, najpierw tworzyłem katalog, przechodziłem do niego, potem otwierałem vi, potem zmieniałem uprawnienia i uruchamiałem skrypt. Za pomocą funkcji btouch dodanej do .bash_profile cztery czynności złożą się w jedną po wpisaniu takiej linii:

btouch ~/SampleDir/DirBelow/SampleScript.sh

Oczywiście można to zrobić też tak:

mkdir -p ~/SampleDir/DirBelow/ && cd ~/SampleDir/DirBelow/ && touch SampleScript.sh && chmod u+x SampleScript.sh && vi SampleScript.sh

Ale jak widać pisania jest znacznie więcej. Funkcja btouch:

btouch()

{

FULLPATH=$1
FILENAME=${FULLPATH##*/}
FILEEXTENSION=${FILENAME##*.}
BASEDIRECTORY=${FULLPATH%$FILENAME}

[ ! -d $BASEDIRECTORY ] && mkdir -p $BASEDIRECTORY
[ ! -f $FILENAME ] && touch $BASEDIRECTORY/$FILENAME
if [ $FILEEXTENSION = "sh" ] || [ $FILEEXTENSION = "py" ] || [ $FILEEXTENSION = "pl" ]; then
   chmod u+x $BASEDIRECTORY/$FILENAME
fi
cd $BASEDIRECTORY
sub . $FILENAME

}

W ostatniej linii sub . $FILENAME, nie uruchamiam już vi, powoli przesiadam się na Sublime Text, który ma ogromne możliwości personalizacji.

Żeby polecenie btouch działało poprawnie trzeba jeszcze dodać poniższy alias do .bash_profile:

alias sub="/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl"

Dzięki czemu Sublime Text będzie mógł być uruchamiany za pomocą polecenia sub np.

sub . - otwiera program w trybie przeglądania obecnego folderu

sub . SampleScript.sh - tak samo jak powyżej, dodatkowo otwiera plik do edycji

Po dodaniu funkcji i aliasu do .bash_profile należy go ponownie zaczytać np.

cd ~;. .bash_profile

albo uruchomić nowe okno terminala.

No power, no bluetooth

W sumie nigdy nie podłączałem Air-a do większego ekranu tak, żeby na nim pracować. Aż sam się dziwie, spokojnie wystarczało mi 13”. W końcu wpadłem na pomysł korzystania z niego jak ze stacjonarnego kompa. Zakupiłem cały zestaw klawiatura, mysz, gładzik i pracuje się naprawdę świetnie na 24” (oczywiście teraz chodzi mi po głowie Cinema Display). Nigdy nie miałem zaufania do bluetooth i obsługi przez niego urządzeń wskazujących, okazuje się, że nie ma z tym problemu. Oczywiście trochę męczy konieczność podłączenia dwóch kabelków ale te minusy nie przesłaniają plusów.

Tak naprawdę bluetooth jest mi potrzebny tylko kiedy jestem przy biurku, kiedy od niego odchodzę jest zbędny i tylko niepotrzebnie zużywa baterię. Można go wyłączać ręcznie ale udało mi się znaleźć lepszy sposób. Byłaby to chyba całkiem fajna opcja w systemie. Chodzi o wyłączenie bluetooth w momencie odłączenia kabla zasilacza. Naturalnie musi być możliwość włączenia ręcznego również na baterii. Okazuje się, że tym prostym skryptem coś takiego można załatwić:

bluetooth_mon.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
PREVIOUS_SOURCE=$(pmset -g ps | perl -ne "/(w+) Power/ && print $1");
while [ 1 ]; do
  CURRENT_SOURCE=$(pmset -g ps | perl -ne "/(w+) Power/ && print $1");
  if [ $CURRENT_SOURCE != $PREVIOUS_SOURCE ]; then
    PREVIOUS_SOURCE=$CURRENT_SOURCE
    if [ $CURRENT_SOURCE = "AC" ]; then
      /usr/local/bin/blueutil power 1
    else
      /usr/local/bin/blueutil power 0
    fi
  fi
sleep 5

Potrzebny jest tylko blueutil, który można zainstalować z repozytoriów Homebrew. Pozwala na podejrzenie i zmianę stanu bluetooth, włączone/wyłączone/tryb wykrywania. Działa bardzo sprawnie.

brew install blueutil

Dodatkowo dobrze by było gdyby skrypt działał cały czas w tle od uruchomienia komputera. Znalazłem bardzo fajny skrót na coś takiego bez zabawy z launchd. Wystarczy do crontab-a dodać taką linię:

@reboot /Users/norbert/Scripts/blue_pow_sav.sh

Jak widać skrypt nazywa się blue_pow_sav.sh i jest umieszczony w katalogu /Users/norbert/Scripts/

Edycja crontab-a to crontab -e, wylistowanie zadań crontab -l. Usunięcie crontab-a użytkownika crontab -r. Mam wrażenie, że trochę za blisko jest klawisz edycji od tego który powoduje usunięcie crontab-a bez pytania.

Dodanie jakiegoś zadania z poziomu shell-a, dotychczasowe jeśli były są zachowywane:

crontab -l | { cat; echo "@reboot /Users/norbert/Scripts/blue_pow_sav.sh"; } | crontab -

Można też inaczej, zapisanie obecnych zadań do tmp_cron:

crontab -l > tmp_cron

Dodanie nowego:

echo "@reboot /Users/norbert/Scripts/blue_pow_sav.sh" >> tmp_cron

Instalacja:

crontab tmp_cron

Qemu

Dzięki quemu możemy uruchamiać na x86 obrazy systemów które do tej architektury nie należą. Można szybko coś sprawdzić bez konieczności instalacji systemu na docelowym urządzeniu. Minusem qemu jest to, że nie jest zbyt wydajne w swojej natywnej postaci ale do niezbyt “grubych” dystrybucji sprawdza się doskonale.

Instalacja qemu

Tylko z tą wersją gcc udało się uniknąć “białego ekranu” po uruchomieniu qemu:

brew install https://raw.github.com/Homebrew/homebrew-dupes/master/apple-gcc42.rb

Instalacja pakietow potrzebnych do poprawnej pracy qemu:

brew install jpeg gnutls glib

Chwilowa podmiana wersji gcc zainstalowanej przez Xcode 4.4.1 na tą zainstalowaną przez brew:

sudo mv /usr/bin/gcc /usr/bin/gcc_orig sudo ln -s /usr/local/Cellar/apple-gcc42/4.2.1-5666.3/bin/gcc-4.2 /usr/bin/gcc

Instalacja qemu:

brew install qemu --use-gcc

Powrót do oryginalnej konfiguracji systemu:

sudo mv /usr/bin/gcc_orig /usr/bin/gcc

Jeśli gcc -v wyświetla w ostatniej linii taką wersję:

gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

Tzn. że gcc instalowany przez Xcode 4.4.1 został przywrócony.

Centos

Zaczynamy od przygotowanie dysku który będzie wykorzystywany przez system:

qemu-img create -f qcow2 centos_hdd.img 10G

Na szczęście nie jest tworzony od razu plik 10GB, miejsce jest sukcesywnie dobierane w miarę potrzeb.

Uruchomienie:

qemu-system-x86_64 -m 1G -localtime centos_hdd.img -cdrom CentOS-6.2-x86_64-LiveDVD.iso

Openwrt

Pobieramy Openwrt:

curl -O http://downloads.openwrt.org/backfire/10.03/x86/openwrt-x86-ext2.image.gz

Otwieramy archiwum:

gunzip openwrt-x86-ext2.image.gz

Uruchomienie:

qemu-system-x86_64 -hda openwrt-x86-ext2.image

Debian Squeeze

Tym razem wersja przeznaczona pod architekture ARM.

Pobieramy pliki:

curl -O http://people.debian.org/~aurel32/qemu/armel/vmlinuz-2.6.32-5-versatile curl -O http://people.debian.org/~aurel32/qemu/armel/initrd.img-2.6.32-5-versatile curl -O http://people.debian.org/~aurel32/qemu/armel/debian_squeeze_armel_standard.qcow2

Uruchomienie:

qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.32-5-versatile -initrd initrd.img-2.6.32-5-versatile -hda debian_squeeze_armel_standard.qcow2 -append "root=/dev/sda1"

OneNote na OSX - RemoteApp

Rozszerzenie funkcjonalności RDP o RemoteApp jest bardzo fajnym pomysłem. Nie potrzebuje całego pulpitu Windowsa a tylko dostępu do maksymalnie kilku aplikacji, których nie ma na osx. Jedną z takich aplikacji MS jest OneNote, powoli tracę nadzieję, że kiedykolwiek się pojawi wersja osx. Testowałem różne rozwiązania EverNote, Springpad, Google Notebook (już zamknięty) i jednak OneNote najbardziej mi odpowiada. W sumie gdyby MS aktualizował swojego klienta RDP to już niczego więcej od tej firmy bym nie oczekiwał jeśli chodzi o osx. Mam dostęp do serwera MS, który działa sobie 24h na nim zainstalował bym to czego mi brakuje i voilà.

Póki co trzeba sobie radzić inaczej. Dzięki freerdp można już korzystać z RemoteApp na osx. Oczywiście nie jest tak kolorowo jakbym chciał ponieważ freerdp korzysta z X11 i “wszystkich jego dobrodziejstw” ale widoki są.

Instalacja freerdp

brew install freerdp

Wydaje mi się, że jest mały bug w tej recepturze ponieważ o ile freerdp się instaluje to nie działało mapowanie dysków:

freerdp_load_library_symbol: failed to open /usr/local/Cellar/freerdp/1.0.1/lib/freerdp/rdpdr: dlopen(/usr/local/Cellar/freerdp/1.0.1/lib/freerdp/rdpdr, 5): image not found

Problem rozwiązałem tworząc linki symboliczne w katalogu /usr/local/Cellar/freerdp/1.0.1/lib/freerdp/.

cd /usr/local/Cellar/freerdp/1.0.1/lib/freerdp/ for i in *; do ln -s $i "${i%.*}"; done

Po tej operacji nie było już kłopotu z tym poleceniem:

xfreerdp -u norbert -g 1440x800 --plugin cliprdr --plugin rdpdr --data disk:HDD:$HOME -- 192.168.1.1:9800

Kilka słów wyjaśnienia odnośnie tych niekoniecznie oczywistych parametrów xfreerdp:

--plugin cliprdr - powoduje, że działa funkcjonalność schowka
--plugin rdpdr --data disk:HDD:$HOME - odpowiada za przekierowanie lokalnego dysku, HDD to nazwa dysku/partycji który chcemy przekierowywać (u mnie np. partycja z osx nazywa się HDD), $HOME to katalog który chcemy przekierować, jeśli cały filesystem to można użyć /`

Na razie to tylko uruchomienie zwykłego klienta rdp który wyświetli cały pulpit zdalnej maszyny. Działa całkiem przyzwoicie, CoRD np. ostatnio ma problem z gubieniem wskaźnika myszy po wprowadzeniu tekstu co jest nieco uciążliwe.

RemoteAPP

Funkcjonalność ta zadziała na XP, Vista, 7 Ultimate i Enterprise, 2008. Windows 2008 ma natywne narzędzia do wystawiania aplikacji w trybie RemoteApp. W przypadku pozostałych systemów można skorzystać z prostego narzędzia do modyfikacji rejestru

https://sites.google.com/site/kimknight/remoteapptool

albo zaimportować poniższy plik onenote.reg, który jest poprawny dla standardowej instalacji OneNote 2010:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionTerminal ServerTSAppAllowList]
"fDisabledAllowList"=dword:00000001

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionTerminal ServerTSAppAllowListApplicationsONENOTE]
"CommandLineSetting"=dword:00000000
"RequiredCommandLine"=""
"IconIndex"=dword:00000000
"IconPath"="%SYSTEMDRIVE%\Program Files (x86)\Microsoft Office\Office14\ONENOTE.EXE"
"Path"="C:\Program Files (x86)\Microsoft Office\Office14\ONENOTE.EXE"
"ShortPath"="C:\PROGRA~2\MICROS~1\Office14\ONENOTE.EXE"
"VPath"="%SYSTEMDRIVE%\Program Files (x86)\Microsoft Office\Office14\ONENOTE.EXE"
"ShowInTSWA"=dword:00000001
"Name"="Microsoft OneNote 2010"
"SecurityDescriptor"=""

Podłączenie do OneNote w trybie RemoteApp wygląda tak:

xfreerdp -u norbert -g 800x800  --app --plugin rail --data "||onenote" -- 192.168.1.1:9800

Idealnie nie jest, nie działa schowek (mam nadzieje, że na razie, w trybie pulpitu nie ma z nim problemu) czyli coś podstawowego przy robieniu notatek. Zwinięcie okna spowoduje, że rozwinie się już tylko białe okienko bez śladu OneNote. Mam jednak nadzieje, że freerdp będzie rozwijane bo widać potencjał w RDP.

Cowsay fortune

Skoro mamy Homebrew i coreutils można pokusić się o instalację tak kluczowych elementów systemu jak cowsay i fortune. Wydajemy polecenie:

brew install cowsay fortune

Następnie dodajemy do .bash_profile linijkę:

cowsay -f "$(ls /usr/local/Cellar/cowsay/3.03/share/cows | gsort -R | head -1)" "$(fortune -s)"

Dzięki czemu przy każdym uruchomieniu terminala zostaniemy mile powitani albo dowiemy się czegoś ciekawego.

Homebrew

Homebrew ułatwia instalacje open source’owych narzędzi, aplikacji itd. Znam trzy tego typu rozwiązania MacPorts, Fink i Homebrew. Jakoś najbardziej polubiłem Homebrew :)

Ponieważ prawie wszystkie paczki są dostępne jako kod źródłowy, Homebrew wymaga zainstalowania Xcode, Xcode Command Line Tools. Ewentualnie X11 i Javy (jeśli wiemy, że któryś z pakietów będzie tego potrzebował).

Xcode instaluje się z App Store, następnie w preferencjach, zakładka Downloads pobieramy Xcode Command Line Tools. Od wersji 10.8 X11 nie jest już częścią systemu i trzeba je pobrać z http://xquartz.macosforge.org/landing/. Jave można zainstalować klikając na ikonkę “Java Preferences” w /Applications/Utilities.

Instalacja samego Homebrew jest dosyć trywialna, wydajemy tylko polecenie:

ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go)

Kilka przydatnych poleceń:

Weryfikacja czy wszystko jest ok z Homebrew

brew doctor

Insalacja pakietu coreutils (w tej paczce dostepny jest ls w wersji GNU, czyli będzie działać gls --color)

brew install coreutils

Lista poleceń, które są instalowane przez coreutils (Jak widać większość ma prefix g, chodzi o to, że duża część z nich jest natywnie dostępna w osx ale w wersji BSD i często dosyć starych przez co czasmi brakuje możliwości użycia jakichś fajnych parametrów które pojawiły się kolejnych wersjach GNU danego polecenia. Prefix załatwia problem, jeśli chcemy skorzystać z polecenia GNU wpisujemy gls, gcat, gsort itd. System nie jest w żaden sposób naruszony):

Usunięcie coreutils

brew uninstall coreutils

Wyświetlnie zainstalowanych pakietów

brew list

Sprawdzenie czy pakiet o nazwie xyz jest dostepny

brew search xyz

Wyświetlenie możliwych parametrów dla instalacji danego pakietu (warto to sprawdzać ponieważ np. zainstalowanie wiresharka bez parametru --with-x spowoduje, że nie będzie GUI)

brew options xyz

Aktualizacja dostępnych receptur (to również należy wykonywać przed każdą instalacją)

brew update

Sprawdzenie, które z zainstalowanych pakietów są w nie aktualnych wersjach

brew outdated

Aktualizacja zainstalowanych pakietów

brew upgrade

Warto dodać sourcebrew –prefix/Library/Contributions/brew_bash_completion.sh do .bash_profile dzięki czemu będzie działać autouzupełnianie klawiszem ⇥ tab poleceń brew-a.

Mountain Lion

Ponad dwa lata temu przesiadłem się na osx z trzech powodów, po pierwsze wydawało mi się, że łączy dwa światy bardzo naturalnie tj. terminal i przyjemne dla oka stabilne GUI. Drugim była ciekawość, a trzecim macbook air.

Nie jest to niezbędne, ale każdy nowy osx instaluję od 0. Ma to ten plus, że definitywnie czyszczę dysk z wszystkich zbierających się tam “śmieci”, które za takowe podczas instalacji owych programów nie uważałem. Zasadniczym minusem jest to, że odtworzenie całego środowiska trochę czasu jednak zajmuje.

Właśnie zbliżam się do końca kastomizacji, czas zatem na notatki :)

Programy

Środowisko

.bash_profile

.bash_profile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
alias helpik='cat ~/helpfile.txt'

# wymaga gls
alias l='gls --color'
alias ll='gls --color -lh'
alias lll='gls --color -alh'

export LC_CTYPE=en_US.UTF-8

# vim jako domyslny edytor
export EDITOR="vim"
# po wyjsciu z man page zostanie on na terminalu
export MANPAGER="less -X"
# kluczowe slowa w man page zostana wyswietlone na pomaranczowo
export LESS_TERMCAP_md="$ORANGE"

# zwiekszamy historie polecen
export HISTSIZE=32768
export HISTFILESIZE=$HISTSIZE
# nie zapisujemy duplikatow i kilku standardowych polecen
export HISTCONTROL=erasedups
export HISTIGNORE="ls:cd:cd -:pwd:exit:date:* --help"

# ustawienie wiersza polecen
PROMPT_COMMAND='PS1="[33[0;33m][!]`if [[ $? = "0" ]]; then echo "\[33[32m\]"; else echo "\[33[31m\]"; fi`[u.h: `if [[ `pwd|wc -c|tr -d " "` > 18 ]]; then echo "\W"; else echo "\w"; fi`]$[33[0m] "; echo -ne "33]0;`hostname -s`:`pwd`07"'

Ustawiamy parę aliasów, historię i fajnego prompta, który wyświetla numer polecenia i zmienia kolor w zależności od tego czy wykonało się poprawnie, działa to tak:

Wyświetlenie zawartości katalogu w kolorze można też osiągnąć bez instalacji ls w wersji GNU. Wystarczy zamienić linie 4,5,6 na np.:

export CLICOLOR=1
export LSCOLORS=GxFxCxDxBxegedabagaced
alias l='ls'
alias ll='ls -lh'
alias lll='ls -alh'

albo

alias l='ls -G'
alias ll='ls -Glh'
alias lll='ls -Galh'

Defaults

Korzystam z następującyh:

# wylaczenie przezroczystosci paska menu
defaults write NSGlobalDomain AppleEnableMenuBarTransparency -bool false
# wylaczenie pytania o potwierdze uruchomienia aplikacji pobranej z sieci
defaults write com.apple.LaunchServices LSQuarantine -bool false
# wylaczenie "naturalnego" przewijania
defaults write NSGlobalDomain com.apple.swipescrolldirection -bool false
# przyspiesznie powtarzania danego klawisza
defaults write NSGlobalDomain KeyRepeat -int 0
# pozwala na zamkniecie Findera
defaults write com.apple.finder QuitMenuItem -bool true
# wyswietla ukryte plki
defaults write com.apple.Finder AppleShowAllFiles -bool true
# wyswietla rozszerzenia plikow
defaults write NSGlobalDomain AppleShowAllExtensions -bool true
# wyswietla pasek statusu
defaults write com.apple.finder ShowStatusBar -bool true
# nie zapisuje .DS_Store na dyskach sieciowych
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true
# nie weryfikuje plikow obrazow dysku
defaults write com.apple.frameworks.diskimages skip-verify -bool true
defaults write com.apple.frameworks.diskimages skip-verify-locked -bool true
defaults write com.apple.frameworks.diskimages skip-verify-remote -bool true