s3cmdをUbuntuにインストール

http://s3tools.org/repositories

$ wget -O- -q http://s3tools.org/repo/deb-all/stable/s3tools.key | sudo apt-key add -
$ sudo wget -O/etc/apt/sources.list.d/s3tools.list http://s3tools.org/repo/deb-all/stable/s3tools.list
$ sudo apt-get update && sudo apt-get install s3cmd

とりあえずAccess KeyとSecret Keyが必要です.IAMでS3へのアクセス権のみを持ったアカウントを一つ作ります.

  1. ダッシュボードからIAMを選択(S3じゃない)
  2. Create New Usersで適当な名前を入れる.
  3. credentials.csvを必ずダウンロードしておきます.中にはscretidがふくまれています.中身は以下のようになっています.

     User Name,Access Key Id,Secret Access Key
     "iaarchiver_s3",********************,************************
  4. 一覧からuserを選択し,permissionsのタブからUser Policyを追加します.ここではテンプレートからS3fullaccessを選択する

アクセスキーとシークレットキーを手に入れたらs3cmdの初期設定を行います.

$ s3cmd --configure

Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.

Access key and Secret key are your identifiers for Amazon S3
Access Key: <<アクセスキーを入力>>
Secret Key: <<シークレットキーを入力>>

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: <<パスワード入力>>
Path to GPG program [/usr/bin/gpg]: 

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP and can't be used if you're behind a proxy
Use HTTPS protocol [No]: 

On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't conect to S3 directly
HTTP Proxy server name: 

New settings:
  Access Key: *********************
  Secret Key: ************************************
  Encryption password: *************
  Path to GPG program: /usr/bin/gpg
  Use HTTPS protocol: False
  HTTP Proxy server name: 
  HTTP Proxy server port: 0

Test access with supplied credentials? [Y/n] 
Please wait, attempting to list all buckets...
Success. Your access key and secret key worked fine :-)

Now verifying that encryption works...
Success. Encryption and decryption worked fine :-)

Save settings? [y/N] y
Configuration saved to '/home/iaarchiver/.s3cfg'

基本コマンド&トラブルの覚書

ファイルを送る

s3cmd put test.txt s3://mybacket

ファイルを受け取る

s3cmd get s3://mybacket .

ファイルの一覧を見る

s3cmd ls s3://mybacket

ファイルを削除する

s3cmd del s3://mybacket 

ディレクトリを同期する

s3cmd sync ~/local_backet s3://mybacket/

新しいバケットを作成する

s3cmd mb s3://mybacket

バケットを削除する(空にする必要があり)

s3cmd rb s3://mybacket

設定ファイル(.s3cfg)を指定する

s3cmd -c [--config] $HOME/.config/s3cfg ...

エラーが出てバケットが作れないとき

The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.

というエラーが出るとき,バケット名でエラーが起きています.aws全体で名前空間が共有されているので先に他の人が同名のバケットを作ってしまっているとダメ.

WARNING: Redirected to...と出る

http://xoxo-infra.hatenablog.com/entry/2013/02/06/020930

~/.s3cfg内で設定されているロケールを日本のものに変更

特定のフォルダを同期させたくないとき

例えば.gitなど いくつかやりかたはありそう.s3cmd -hで確認 例えば不可視フォルダ(.から始まる)は同期しないやり方は

s3cmd sync --exclude='^(.*/)*\.+.*' ~/.dir_synced s3://mybacket

mirrorしたいとき

--delete-removedをつける ミラーしない場合は --no-delete-removedと明示する

デプロイ用のスクリプトを作成する

簡単な例は例えば以下の様なかんじ.

#!/bin/bash

TARGET="$HOME/Dropbox/Codes/Grunt/scriptogr.am/"
BUCKET="s3://s3.iaarchiver.net/"

# ignore invisible file/dir
s3cmd -c $HOME/.config/.s3cfg sync \
        --rexclude="^(.*/)*\.+.*" \
        --recursive \
        --delete-removed \
        $TARGET $BUCKET

このとき$TARGETで指定したフォルダ内のコンテンツが再帰的にS3のバケットにミラーリングされる.


http://superuser.com/questions/498306/how-to-remove-the-prompt-when-execute-shell-command-in-vim

:silent !open "%:p:h"

とする.しかしtmuxではCtrl-Lでリドローしないと正しく表示されないので最後にredraw!を加える

:exe "silent !open \"%:p:h\"" | redraw!

http://d.hatena.ne.jp/tacahiroy/20140321/1395414592

以前はdefault-pathとして勝手にCWDを維持して分割してくれていたみたいだが,tmux1.9より分割時のCWDは環境変数$PWDを参照する仕様に変更されたみたい.

tmux split-window [-c $PWD]

そのおかげでスクリプトからtmux split-windowする場合は正しい$PWDを読んでくれるときもあれば,古い$PWDを読んでしまうこともある.

なので分割前ペインのCWDをきちんと維持して分割するには以下を使用する

tmux split-window -c '#{pane_current_path}'

http://synergy-foss.org/spit/issues/details/3561/

vmwareのマウス切り替えとsynergyのスクリーン切り替えがコンフリクトするらしい.その結果synergysがSegmentationFaultエラーを出す.Vmwareウインドウの境界とsynergyの境界を同時(短時間の間)に越えると必ず落ちる.

対策はsynergy.confにswitchDelayを設定すること.

section: options
    switchDelay: 500
end

これでほぼ落ちることはなくなった.


結論から言えばpwd -Pをサブシェルでcdしてから使う方法が一番良いっぽい.

# シンボリックリンクのパスを$fileとしたとき
originalpath=$(cd $(dirname $file); pwd -P)

pwd -Pでカレントディレクトリのオリジナルパスを表示してくれる. 単純に相対パスを絶対パスへ変換したいだけなら-Pを取ればよい.

他の方法としてはreadlinkコマンドを使用する方法がある

readlink ~/.vim
/Users/iaarchiver/Dropbox/Sync/dotfiles/.vim

しかしこれは引数がSymlink以外だと何にも返してくれない.Symlinkであっても辿れるのは対象のリンク先のみ.再帰的にオリジナルを探索してくれるわけではないので注意.

GNUでは再帰的にオリジナルを探してくれるreadlink -f, 他にもrealpathもあるらしい.


Terminal.appでは以下のように引数を与えることが可能.

  • ワーキングディレクトリを指定して起動する

      open -a "Terminal" ~/Desktop
  • 実行ファイルを指定して起動

      open -a "Terminal"" ~/test.sh

しかしGnome-Terminalのように直接コマンドを引数に与えることができない.シェルスクリプトやVimなどでどうしてもコマンドを与えたい場合は次のような方法がある.

tmpファイルを経由する

echo "echo 'Hello'" > .tmp/tmp; chmod +x .tmp/tmp; open -a "Terminal" .tmp/tmp

Applescriptを経由する

on run argv
    -- 引数がひとつのみのとき実行する
    if length of argv is 1 then
        set launch_command to the first item of argv
        tell application "Terminal"
            do script launch_command
            activate
        end tell        
    end if
end run

上のコードをOpenTerminalWithCommand.scptとして保存すれば以下のようにして利用可能.

osascript OpenTerminalWithCommand.scpt "echo Hi"

Mavericksではアプリケーション終了時の状態を保存し,再び実行したときに復元するのがデフォルト.これはシステム環境設定>一般>”アプリケーションを終了するときにウィンドウを閉じる”というオプションをオンにすることで無効にできる.

便利なので有効にしておきたいが,Terminal.appなど一部アプリケーションでは終了時のウインドウを消したい場合,以下のコマンドで特定のアプリのみ無効にすることができる.

defaults write com.apple.Terminal NSQuitAlwaysKeepsWindows -int 0

ちなみにアプリの識別子(com.apple.Terminalなど)は以下のように取得可能.

osascript -e 'id of app "Terminal"'

http://superuser.com/questions/346369/getting-the-bundle-identifier-of-an-os-x-application-in-a-shell-script


Applescriptでアプリを書きだした時,実行する度にドックでアイコンが一瞬バウンドするのを防ぐにはLSBackgroundOnlyキーをTrueにしてやると良い.

以下を.app/Contents/info.plstに追加する

<key>LSBackgroundOnly</key>
<string>1</string>

以下のように一発で設定することもできる.

/usr/libexec/PlistBuddy -c 'Add :LSBackgroundOnly bool true' ~/Applications/test.app/Contents/Info.plist

コマンドラインからテキストをジャーナリングできるjrnlというアプリを使用してDayOneのエントリーを読み書きする方法のメモ.

MacであればDayOneオフィシャルのコマンドラインツールが使用できるので,それ以外の端末からDayOneエントリーを操作したい人向けです.

jrnlのインストールと起動

$ sudo pip install jrnl
$ jrnl
Path to your journal file (leave blank for ~/journal.txt): 
Enter password for journal (leave blank for no encryption): 
[Compose Entry] 

初回起動時に保存先とパスワードを聞かれますが無入力で良いです.この設定は~/.jrnl_configにて変更が可能です.

DayOneのエントリーを統合する

~/.jrnl_configjournalsキーを以下のように変更.

"journals": {
    "default": "/path/to/Journal.dayone/"
}

Journal.dayoneはDayOneのエントリーを保存しているフォルダであり,DayOneの同期先によって異なります.例えばDropboxで同期している場合は/path/to/Dropbox/Apps/Day\ One/Journal.dayoneのようになります.

KeyError:'Time Zone'が出るとき

最新のバージョンのDayOneではすべての新規エントリーにタイムゾーンが付与される仕様になっていますが,古いエントリーにタイムゾーンの情報が付与されていないとき,それが原因でエラーが出ます.(jrnl1.4.2で確認.今後修正されるかも)

File "/usr/local/lib/python2.7/dist-packages/jrnl/Journal.py", line 316, in parse
timezone = pytz.timezone(dict_entry['Time Zone'])
KeyError: 'Time Zone'

jrnlを起動した際に上のようなエラーが出るときはsudo emacs /usr/local/lib/python2.7/dist-packages/jrnl/Journal.pyでエディタを開き,以下のように編集します.

def parse(self, filenames):
    """Instead of parsing a string into an entry, this method will take a list
    of filenames, interpret each as a plist file and create a new entry from that."""
    self.entries = []
    for filename in filenames:
        with open(filename, 'rb') as plist_entry:
            dict_entry = plistlib.readPlist(plist_entry)
            try:
                timezone = pytz.timezone(dict_entry['Time Zone'])
  -         except pytz.exceptions.UnknownTimeZoneError:
  +         except :
                timezone = pytz.timezone(util.get_local_timezone())

jrnl1.4.2でできること

  • 最近追加したエントリーを3件表示
      jrnl -n 3
  • すべてのエントリーのタイトルのみ表示
      jrnl -short
  • エントリーを追加
      jrnl
      [Compose Entry]
      # Enterで入力終了
  • 日時とタグを指定してエントリーを追加
      jrnl yesterday: 鳩のえさやり @公園

jrnl1.4.2でできないこと

  • 過去エントリーの編集,削除(jrnlを経由せずにJournal.dayoneフォルダー内の.doentryファイルを直接編集/削除は可能ですが,同期したMacやiPhoneで操作したほうが良いです.)
  • エントリーにメディア(画像,音声など)を追加する
  • エントリーの付与されたメディアを表示する

http://askubuntu.com/questions/285874/how-can-i-mount-cifs-shares-in-kubuntu-13-04

12.10のときと若干変更があったのでメモ.確認環境は13.04(64bit),TimeCapsuleの共有ディスクはデバイスパスワードでアクセス制限している状態です.

予めsudo apt-get install samba cifs-utilsを実行してsambaとcifs-utilsをインストールを確認しておきます.

TimeCapsuleのホスト名,IPアドレスをまずは確認する.

TimeCapsuleのIPアドレスやホスト名はmac上でAirmacユーティリティを使用することで確認できますが,Ubuntuから確認するには以下を実行します.

$ avahi-browse -a -p

Bonjourネットワークに存在するすべてのホスト情報が一覧で表示されますので,その中からTimeCapsuleのものと思われるホスト名(hostname)とローカルIPアドレス(address)を確認します.

...
=  wlan0 IPv4 TimeCapsule                                   Apple AirPort        local
   hostname = [TimeCapsule.local]
   address = [192.168.0.1]
   port = [5009]
...

このような表示が見つかれば,TimeCapsule.local,もしくは192.168.0.1でTimeCapsuleにアクセスすることが確認できます.

端末からマウントさせる

TimeCapsule.localというホスト名のTimeCapsuleを/media/timecapsuleにマウントさせるには以下を実行します.(予めsudo mkdir /media/timecapsuleでマウントポイントのディレクトリを作成しておく必要があります.)

$ sudo mount.cifs //TimeCapsule.local/TimeCapsule /media/timecapsule -o pass=PASWORD,rw,iocharset=utf8,file_mode=0777,dir_mode=0777,sec=ntlm

//TimeCapsule.local/の部分は//192.168.0.1/のようにローカルIPアドレスで指定しても構いません.(13.04ではsec=ntlmオプションが必要になりました.)

アンマウントさせる場合は以下を実行します.

$ sudo umount /media/timecapsule

fstabで自動マウントさせる

起動時にマウントさせるには/etc/fstabに以下の行を追加します.

//TimeCapsule.local/TimeCapsule/  /media/timecapsule  cifs password=macintosh,rw,iocharset=utf8,file_mode=0777,dir_mode=0777,sec=ntlm

追加後,再起動もしくはsudo mount -aを実行でマウントが確認できれば成功です.


USBメモリからインストール

http://www.ubuntu.com/download/desktop/create-a-usb-stick-on-ubuntu
ブート可能なUSBメモリの作成方法が詳しく紹介されています.

インストール後にまずすること

  • Software Updaterでアップデートする.
    OS本体のインストールより時間がかかります.
  • AdditionalDriversをインストール
    System Settings > Software & Updates > Additional Driversから環境にあったドライバをインストールします.Nvidiaを使用しているなら再起動でNvidia X Server Settingsから細かい環境設定が行えるようになります.
  • 日本語環境の構築
    Language Support > install/Remove LanguagesからJapaneseを選択してインストールします.デフォルトを日本語に変更したい場合は,Languages for menus and windowsで日本語を先頭にドラッグし,Apply System-Wideを押すと再起動後に変更されます.
  • 日本語入力を可能にする
    $ sudo apt-get install ibus-mozcをibus-mozcをインストール後,Language Support > Keyboard input method system にibusを選択すると起動時にibusを起動してくれます.

fstabの編集

起動時に自動的にマウントさせるドライブを設定します.

  • HDDを/homeにマウントする

    ext4でフォーマットした/dev/sdb1というパスのパーティションを/homeとしてマウントさせたい場合,以下のような設定をfstabに加えます.

      /dev/sdb1                  /home          ext4      defaults,user_xattr      0    0
  • TimeCapsuleをマウントする

    参考:Ubuntu13.04でTimeCapsuleをマウントする

ネットワーク上にあるTimeCapsuleの共有ディスクを起動時にマウントさせるには/etc/fstabに以下を追加します.

//TimeCapsule.local/TimeCapsule/  /media/timecapsule  cifs  password=macintosh,rw,iocharset=utf8,file_mode=0777,dir_mode=0777,sec=ntlm

* 12.10では必要ありませんでしたが13.04ではsec=ntlmオプションが必要です.

  • NTFSディスクをマウントする

    /dev/sdc1にあるntfsフォーマットのドライブをマウントさせる場合は以下を/etc/fstabに追加します.

      /dev/sdc1                  /media/ntfsdrive      ntfs      defaults      0    0

Wifiのhiccup(しゃっくり)を直す

http://askubuntu.com/questions/286079/rtl8188cu-usb-network-adaptor-on-ubuntu-13-04

12.10の頃からの症状ですが,Ubuntuが用意するRTL8192CUドライバの調子が悪いせいでWifi接続が一定の時間経過後に切れてしまいます.12.10ではRealteckで公開されている古いバージョンを導入すると直ったのですが,13.04ではダメな模様.そのかわりこちらで公開されている修正パッチを当てたものを導入すれば問題なく使えるようになりました.

  • rtl8192cuドライバが使用されているか確認する

      $ lsmod | grep 8192

    rtl8192cuなどの情報が帰ってくればOK.

  • こちらからrtl8192cu-tjp-dkms_1.6_all.debをダウンロードしたらインストールする.

      dpkg -i ~/Downloads/rtl8192cu-tjp-dkms_1.6_all.deb
  • /etc/modprobe.d/blacklist.confに以下を加えて,Ubuntuが用意したドライバを使用させないようにする.

      # Blacklist native RealTek 8188CUs drivers
      blacklist rtl8192cu
      blacklist rtl8192c_common
      blacklist rtlwifi

ファン制御を設定する

まずlm-sensorsfancontrolをインストールします.

$ sudo apt-get install lm-sensors fancontrol

次を実行してセンサーを検出します.

$ sensors-detect

いろいろ聞かれますがだいたいイエスでOK.完了したら再起動をして次を実行します.(再起動なしではno pwm-capable sensorsというエラーが出ることがあります.)

$ sudo service fancontrol stop // ファン制御が動いていないことを確認
$ sudo pwmconfig

あとは応答する形でファン制御設定をしていけばOK.

burg(ブートローダ)とPlymouth(スプラッシュスクリーン)を設定

$ sudo add-apt-repository ppa:n-muench/burg
$ sudo apt-get update
$ sudo apt-get install burg

MBRで指定している起動ディスク(/dev/sda)へBurgを設定します.

$ sudo burg-install "/dev/sda"
$ sudo update-burg

起動をエミュレートして確認します.

$ sudo burg-emu -D

burgのローディング画面でtを押すとテーマの選択ができます.(その他コマンドはhで確認できます.)独自にテーマを用意する場合は/boot/burg/themesに置いておく必要があります.

テーマのインストールと設定は上記参照.

テーマが適用されない場合
解像度が対応していないことが原因である可能性があります.そこで予め解像度を指定してやります.

$ sudo gedit /etc/default/burg
// grubを使用している場合は /etc/default/grub

以下を追加します.

GRUB_GFXPAYLOAD_LINUX="1024x768"

その後コンソールから

$ sudo update-burg

yacreaderとはcomixよりもリッチな見栄えのコミックビューアです.iPhone版もリリースされて開発が活発なので利用してみました.

それでもまだ少し機能が足らないところがあったのでソースをいじったのでメモ.

yacreaderのダウンロード

Linux版ではlibpoppler-qt4が必要です.予めsudo apt-get install libpoppler-qt4-devでインストールしておきます.本体はこちらからダウンロードすることができます.

ソースコードをコンパイルする

  1. 現在はBitbucket上で開発されているようですのでそこからソースコードをクローンします.

     $ hg clone https://bitbucket.org/luisangelsm/yacreader
  2. コンパイルにはlibpoppler-qt4-dev以外にもPhonon, libqt4-sql, libqt4-sql-sqliteなどが必要なようです.(INSTALL.txtで詳しい情報が確認できます.)僕の環境ではlibpoppler-qt4-devとphononのみでインストールが必要でした.

     $ sudo apt-get install libpoppler-qt4-dev phonon
  3. 先程ダウンロードしたビルドパッケージ内のutilsフォルダをクローンしたソースコードのフォルダにコピーします.

     $ cp -R ~/Downloads/YACReader-\* X11-x64-qt4/utils yacreader/

以上が完了したら以下を実行してコンパイルします.

$ ./compileX11.sh

成功するとクローンしたフォルダ内にYACReader- X11--qt4というフォルダ作成され,中にutilsフォルダ,YACReader, YACReaderLibraryがあるはずです.

コンパイルに失敗する場合

- g++とかgccが無いって言われる → `sudo apt-get install build-essential`  
- 入れたのにphononが無いって言われる → `qmake -v`でQtVersionが5になっているかも.`.compileX11.sh`をエディタで開き,`qmake`をすべて`qmake-qt4`に変えて再びコンパイルする.

ソースコードをいじる

以下,yacreader6.5.3をもとに変更を行なっています

現状のYACReaderでは少し機能の足らない部分があるのでソースコードをいじってしまいます.(これらの変更は今後開発が進めば必要なくなるかもしれません.)

  1. 見開き表示にしたときに左右ページの順序が逆になるのを直したい.(海外コミックは横書き=左とじなため)

    yacreader/YACReader/render.cppの430行付近を以下のように変更.

     QImage auxImg(totalWidth,totalHeight,QImage::Format_RGB32);
         QPainter painter(&auxImg);
     -    painter.drawImage(QRect(0,0,width1,totalHeight),img);
     -    if(!img2.isNull())
     -        painter.drawImage(QRect(width1,0,width2,totalHeight),img2);
     +    if(!img2.isNull()){
     +        painter.drawImage(QRect(0,0,width2,totalHeight),img2);
     +        painter.drawImage(QRect(width2,0,width1,totalHeight),img);
     +    }else{
     +        painter.drawImage(QRect(0,0,width1,totalHeight),img);
     +    }
         painter.end();
  2. ページ移動に必要なホイールの移動量を2目盛りから1目盛りへ変えたい.

    yacreader/YACReader/viewer.cppの370行付近を以下のように変更

     void Viewer::wheelEvent(QWheelEvent * event)
     {
         if(render->hasLoadedComic())
         {
             if((event->delta()<0)&&(verticalScrollBar()->sliderPosition()==verticalScrollBar()->maximum()))
             {
     -            if(whellStop)
     +            if(true)
                 {
                     next();
                     verticalScroller->stop();
                     event->accept();
                     wheelStop = false;
                     return;
                 }
                 else
                     wheelStop = true;
             }
             else
             {
                 if((event->delta()>0)&&(verticalScrollBar()->sliderPosition()==verticalScrollBar()->minimum()))
                 {
     -                if(whellStop)
     +                if(true)
                     {
                         prev();
                         verticalScroller->stop();
                         event->accept();
                         wheelStop = false;
                         return;
                     }
                     else
                         wheelStop = true;
                 }
             }
  3. カバーが横長の場合は90度回転して欲しい

    • hardwareAccelarationなしのとき
      yacreader/common/pictureflow.cppの600行あたりを以下のように変更

        static QImage* prepareSurface(const QImage* slideImage, int w, int h, QRgb bgcolor,
        PictureFlow::ReflectionEffect reflectionEffect)
        {
      
              int iw,ih;
          iw = slideImage->width();
          ih = slideImage->height();
          int psw,psh;
          if(iw>ih)
          {
        -      psw = w;
        -      psh = w * (1.0*ih/iw);
        +      int w1 = w;
        +      psh = w1 * (1.0*iw/ih);
        +      psw = w1;
      
        +      while(psh>h)
        +      {
        +        w1-=2;
        +        psh= w1* (1.0*iw/ih);
        +        psw = w1;
        +      }
          }
          else
          {
              int h1=h;
              psw = h1 * (1.0*iw/ih);
              psh = h1;
      
              while(psw>w)
              {
                    h1-=2;
                   psw = h1 * (1.0*iw/ih);
                   psh = h1;
              }
          }
          w = psw;
      
        #ifdef PICTUREFLOW_QT4
          Qt::TransformationMode mode = Qt::SmoothTransformation;
        -   QImage img = slideImage->scaled(psw, psh, Qt::IgnoreAspectRatio, mode);
        +  QImage img;
        +  if (iw > ih){
        +    QTransform rot;
        +    rot.rotate(90);
        +    img = slideImage->transformed(rot, Qt::SmoothTransformation);
        +    img = img.scaled(psw, psh, Qt::IgnoreAspectRatio, mode);
        +  }else{
        +    img = slideImage->scaled(psw, psh, Qt::IgnoreAspectRatio, mode);
        +  }
    • hardwareAccelarationありのとき
      common/yacreader_flow_gl.cppの380行付近を以下のように変更

        void YACReaderFlowGL::drawCover(CFImage *CF)
        {
            float w = CF->width;
            float h = CF->height;
      
        +    w = 1.8f*(w/h);
        +    h = 1.8f;

      同ファイルの1240行付近を以下のように変更

        //-----------------------------------------------------------------------------
        //ImageLoader
        //-----------------------------------------------------------------------------
        QImage ImageLoaderGL::loadImage(const QString& fileName)
        {
            QImage image;
            bool result = image.load(fileName);
      
        +    if (image.width() > image.height())
        +        image = image.transformed(QMatrix().rotate(90));

ソースコードをいじったら再度./compileX11.shを実行してコンパイルをすると変化が確認できます.


正式にサポートされているのは32bitマシンだけなのですが,無理やりインストールできそうでしたのでやってみました.

  1. gp6-full-linux-*.debファイルを用意

    linux用インストーラをhttp://www.guitar-pro.com/のサポートページからダウンロードします.(日本で代理販売をしているイーフロンティアではLinux版は元々サポートしていないので本家のサポートページでライセンスを登録する必要があります.)

  2. 依存関係を解決

    依存関係にあるライブラリを確認します.

     $ dpkg -I gp6-full-linux-r11553.deb        

    depends欄に書かれているものをSynapticsもしくは$ sudo apt-get install ...でインストールしておきます.

    $ sudo dpkg -i gp6-full-linux-*.debでインストールしようとしてはダメ
    'You have 1 broken package on your system! Use "Broken" filter to locate it'というエラーがSynapticsで出るようになります.Edit > Fix Broken Packagesを選択してApplyすると壊れたGP6パッケージを削除できます.(このときsudoが消せないというエラーが出ますがこれは無視しても大丈夫.)しかし,GP6が既にインストールできていた場合は,GP6の再インストールが必要になるので注意.

  3. /opt/へ本体をコピー

    gp6-full-linux-*.debを解凍してGuitarPro6本体を/opt/へコピーします.

     $ dpkg -x gp6-full-linux-\*.deb ~/temp
     $ sudo cp -R ~/temp/opt/GuitarPro6 /opt/

    ちなみに.debファイルの解凍はArchiveManagerでもできます.

  4. getlib-all.debをインストール

    getlibsは64bit環境に32bit用アプリをインストールする際に必要なライブラリをインストールするためのユーティリティソフト(らしい)です.現状ではlaunchpadでmaintainされていないようですが,こちらのページからダウンロードできました.ダブルクリックでSoftwareCenterからインストールするかdpkg -i getlibs-all.debでインストールします.

  5. getlibsする

    以上が完了したら以下を実行します.

     $ getlibs /opt/GuitarPro/GuitarPro
  6. GuitarPro6を起動

    エラーなくgetlibsできたらGuitarPro6を起動します.

     $ /opt/GuitarPro/launcher.sh

    起動が確認できたらアップデータで最新のものへしてやりましょう.(アップデータの起動にエラーが出るときはgksudoがインストールされてない可能性があります.)

  7. エラーなど

    • /opt/GuitarPro6/launcher.shが以下のエラーメッセージを出して起動しない

      ./GuitarPro: error while loading shared libraries: libportaudio.so.2: cannot open shared object file: No such file or directory

      getlibsがlibportaudio2をカバーできていないことが原因.sudo apt-get install libportaudio2:i386で個別にインストールしてやります.

    • アップデータが起動しない
      gksudoがインストールされていない可能性があります.

    • アップデートしたら./GuitarPro: /opt/GuitarPro6/./libz.so.1: version `ZLIB_1.2.3.3' not found (required by /usr/lib/i386-linux-gnu/libxml2.so.2)というエラーが出て起動しない
      sudo rm /opt/GuitarPro6/libz.so.1`で消してやれば問題ないもよう.

今のところ問題なく動いていますが,今後のアップデートによっては起動しなくなる可能性もあります.Soundbankのインストールに失敗する場合もあるらしく(Ubuntu13.04x86_64では無問題でした),そのWorkaroundがこちらで紹介されています.


https://github.com/gruntjs/grunt-contrib-copy/issues/60

GithubのIssueでも語られていますが,grunt-contrib-copyのパスの指定方法に注意が必要だったのでメモします.

指定フォルダ内のファイルを階層を維持しながら別の場所へコピーしたい場合cp path/* dest/のつもりで以下のように指定すると思った通りのパスへコピーしてくれません.

    copy: {
        dame1: {
            //ダメ
            files: [{src: 'path/**', dest: 'dest/'}]
        },
        dame2: {
            // これもダメ
            files: [{expand: true, src: ['path/**'], dest: 'dest/'}]
        }
    }

上記コードではdest/path/内に階層を維持しながらファイルがコピーされてしまいます.

正しくは,

    copy: {
        ok: {
            files: [{expand: true, cwd: 'path/', src: [**], dest: 'dest/'}]
        }
    }

expandオプションがあると,もし中間のティレクトリが存在しなければ作成してくれます.(mkdirの-pオプション相当)ちなみにこれはcwdオプションでカレントディレクトリを指定した場合のみ有効なオプションのようです.


Ubuntuでmpdを利用する際にいくつか詰まるところがあったのでメモします. 運用方法は,Ubuntu起動時にユーザ設定を読み込んでmpdを立ち上げておき,同Ubuntuのsonataで聞く,もしくはローカルネットワークにあるデバイスで聞く,という方法です.

まずはなによりインストール

    $ sudo apt-get install mpd sonata

必要ならばmpcも合わせてインストールしておきます.

~/.mpdconfを以下の例のように設定.

    port "6600"
    music_directory "~/Music/"
    playlist_directory "~/.mpd/playlists"
    db_file "~/.mpd/mpd.db"
    log_file "~/.mpd/mpd.log"
    audio_output {
    type "pulse"
    name "MPD"
    }

audio_outputはメディアサーバとして運用するなど特定の条件下で無い限り,pulseを選択するほうが良いです.

mpdを起動,そしてエラーメッセージ

    $ mpd
    Failed to bind to '[::]:6600': Address already in use

多くの場合このエラーメッセージが表示されます.(出ない場合でも再起動後に遭遇するかもしれません.)

検索するとこのエラーの解決法について多くのスレッドが見つかりますが,詰まる人が多い理由は以下2つが原因と考えられます.

  • エラーメッセージの通りに起動自体に失敗しているのか,設定の読み込みに失敗しているだけなのかわかりにくい.
  • mpdの起動に成功しても(別のことが原因で)似たようなエラーメッセージが表示される.

...要するに紛らわしいという話です.

  1. sonataでmpdをちゃんと起動できているか確認する

    sonataを起動し,コンテクストメニューからPreference画面を開いて以下のように設定します.
    sonata
    Portは~/.mpdconfで指定したものと同じ値を入力します.また,外部のデバイスから聞く場合はHostをmpdを走らせているマシンのローカルIPアドレスを指定する必要があります.ユーザ設定がきちんと読み込まれていればmpd起動の瞬間に,sonataのLibraryタブに~/.mpdconfで指定したフォルダ内の音楽ファイルが表示されます.

  2. /etc/init.d/mpdがデーモンとして実行されているかどうか確認する

    mpdをインストールすると/etc/init.d/mpdが作成されて,起動時にスーパーユーザが デーモンとしてmpdを実行しています.そしてこのときユーザ設定(~/.mpdconf)ではなく管理者設定(/etc/mpd.conf)のみが読み込まれるため,このままではsonataを起動してもLibraryタブに先ほど指定した音楽ファイルが表示されません. このときは以下を実行してユーザ権限でmpdを再起動させます.

     $ sudo service mpd stop
     # もしくは $ sudo /etc/init.d/mpd stop
     $ mpd
     listen: bind to '0.0.0.0:6600' failed: Address already in use (continuing anyway, because binding to '[::]:6600' succeeded)

    さきほどと似たようなエラーメッセージが出てはいますが,sonataを起動してLibraryタブに指定した音楽フォルダの中身が反映されている場合,mpdは無事起動しています.

    このエラーメッセージは,ipv6でのバインドを試行して失敗したこと原因のようです.その後にIPv4でバインドに成功しているため問題はありませんが,このメッセージを消したい場合,~/.mpdconfに以下の設定を加えてIPv4でのバインドを指定してやります.
    参考:https://wiki.archlinux.org/index.php/Music_Player_Daemon/Troubleshooting

     bind_to_address "127.0.0.1"
  3. 起動時にスーパーユーザがmpdを起動させないようにする

    起動時にmpdをユーザ設定を読み込んだ上で起動するためには,まずスーパーユーザがmpdを起動させないようにする必要があります.これは/etc/mpd.confにユーザ設定を直接書いてしまったり,/etc/init.d/mpdをリネームもしくは削除してしまうことで実現できてしまいますが,あまり望ましい方法ではありません./etc/init.dに登録されながらも自動起動をオフするには以下のようにします

     sudo update-rc.d mpd disable

    オンにしたい場合はdisableenableに変えて実行します.

これで自動起動がオフにできたら,DashメニューからStartupApplicationにmpdコマンドを追加することで,ログイン時にユーザ設定を読み込んだ状態でmpdを起動してくれます.