2016年2月14日日曜日

Goでクロスコンパイルを実行する

Go 1.5からはクロスコンパイルが簡単に実行できるようになっている。

github公開用としてコードを書く場合
$ cd $GOPATH
$ mkdir -p src/github.com/hogeuser/fugarepo
$ cd src/github.com/hogeuser/fugarepo

ローカルマシン専用にコードを書く場合
$ cd $GOPATH
$ mkdir src/foohost.local
$ cd src/foohost.local

hello.go
package main

import "fmt"
import "runtime"

func main() {
        fmt.Printf("hello, %s/%s\n", runtime.GOOS, runtime.GOARCH)
}


OS X用にビルドして実行する場合
$ go build -o hello hello.go 
$ ./hello
hello, darwin/amd64

Windows用にビルドする場合
$ GOOS=windows GOARCH=amd64 go build -o hello.exe hello.go

Raspberry Pi 2用にビルドする場合
$ GOOS=linux GOARCH=arm GOARM=7 go build -o hello hello.go


[参考URL]
Go1.5はクロスコンパイルがより簡単 | SOTA
GoArm
Cross compile with Go 1.5 for Raspberry Pi

2016年2月13日土曜日

Goをインストールする

homebrewを使ってGoをインストールする。
$ brew update && brew install go

環境変数としてGOPATH、GOROOTを設定した上でPATHを通す。
GOPATH配下はbin、pkg、srcのディレクトリで構成されることが想定されている。GOROOTについてはGoツールのパスを指定しておく。
$ mkdir ~/golang
$ echo 'export GOPATH=$HOME/golang' >> ~/.bashrc
$ echo 'export GOROOT=/usr/local/opt/go/libexec' >> ~/.bashrc
$ echo 'export PATH=$GOPATH/bin:$PATH' >> ~/.bashrc
$ echo 'export PATH=$GOROOT/bin:$PATH' >> ~/.bashrc
$ source ~/.bashrc

使用可能なコマンドを確認する。
$ go help

インストールされたGoのバージョンを確認する。
$ go version
go version go1.5.3 darwin/amd64

Goの環境情報を確認する。
$ go env
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/hogeuser/golang"
GORACE=""
GOROOT="/usr/local/opt/go/libexec"
GOTOOLDIR="/usr/local/opt/go/libexec/pkg/tool/darwin_amd64"
GO15VENDOREXPERIMENT=""
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fno-common"
CXX="clang++"
CGO_ENABLED="1"

入力補完用にgocodeをインストールする。
$ go get -u github.com/nsf/gocode


現時点でのhomebrew Formulaを確認する限り、godocとvetはデフォルトでインストールされるようだが、別途インストールする必要がある場合は下記の通り実行する。

godocのインストール
$ go get golang.org/x/tools/cmd/godoc

vetのインストール(先にMercurialをインストールしておく必要がある)
$ brew install mercurial
$ hg version
Mercurial Distributed SCM (version 3.6.1)
(see https://mercurial-scm.org for more information)

Copyright (C) 2005-2015 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ go get golang.org/x/tools/cmd/vet


[参考URL]
How to Write Go Code - The Go Programming Language
Goのコマンド
これからGoを始める人のためのTips集

2016年2月5日金曜日

Pythonバージョン管理ツールを導入する

Pythonバージョン管理ツールであるpyenvを導入する。pyenvプロジェクトはrbenv及びruby-buildからフォークされ、Python用にモディファイされたプロジェクトである。そのため、導入方法はほぼRubyの場合と同様(参考:Rubyバージョン管理ツールを導入する)。

pyenvをインストールしてPATH設定する。
$ brew update
$ brew install pyenv

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ exec $SHELL -l

pyenvのバージョンを確認する。
$ pyenv -v
pyenv 20160202

インストール可能なPythonのバージョンを確認する。
$ pyenv install -l

2.7.10をインストールする。
$ pyenv install 2.7.10
$ pyenv rehash

3.5.0をインストールする。
$ pyenv install 3.5.0
$ pyenv rehash

インストールされているPythonのバージョンを確認する。
$ pyenv versions
* system (set by /Users/hogeuser/.pyenv/version)
  2.7.10
  3.5.0

使用するPythonのバージョンを切り替える。
$ pyenv global 2.7.10
$ pyenv versions
  system
* 2.7.10 (set by /Users/hogeuser/.pyenv/version)
  3.5.0

使用中のPythonのバージョンを確認する。
$ pyenv version
2.7.10 (set by /Users/hogeuser/.pyenv/version)
$ python --version
Python 2.7.10

2015年5月23日土曜日

GCDについて情報整理する

歴史的なことも含めてGCDに関する情報を整理しておく。


GCDの歴史

  • Mac OS X 10.6(Snow Leopard)以降、iOS 4.0以降で利用可能
  • OS X 10.8(Mountain Lion)、iOS 6.0以降では、GCDオブジェクト(Dispatch Queue)もARCの管轄下に入るようになった(実際にはGCDだけでなくXPCも)
  • OS X 10.10(Yosemite)、iOS8.0 からQoS(Quality of Service)の概念が導入された


ディスパッチキューの利用


ディスパッチキューの利用には大きく分けて2つの方法がある

  1. dispatch_queue_create関数を使ってディスパッチキューを自分で生成する
  2. システムが標準で提供しているディスパッチキューを取得する

1. dispatch_queue_create関数を使ってディスパッチキューを自分で生成する

  • 開発者はシリアルキューとコンカレントキューを生成できる
  • コンカレントキューを自分で生成するケースは稀
  • OS X v10.7、iOS 4.3以降から第2引数にNULL以外を指定できるようになった

1.1. シリアルキューを生成する場合
dispatch_queue_t mySerialDispatchQueue 
= dispatch_queue_create("com.example.MySerialDispatchQueue", DISPATCH_QUEUE_SERIAL);
// または、下記の通り、第2引数にNULLを指定してもよい。
// ただし、個人的には明示的に定数指定している上記の書き方の方がいいと思う。
//dispatch_queue_t mySerialDispatchQueue 
//= dispatch_queue_create("com.example.MySerialDispatchQueue", NULL);

1.2. コンカレントキューを生成する場合
dispatch_queue_t myConcurrentDispatchQueue 
= dispatch_queue_create("com.example.MyConcurrentDispatchQueue", DISPATCH_QUEUE_CONCURRENT);


2. システムが標準で提供しているディスパッチキューを取得する

  • システムが標準で提供しているディスパッチキューは2種類ある(Main Dispatch QueueとGlobal Dispatch Queue)
  • アプリのどこからでも利用できる

2.1. Main Dispatch Queue
  • メインスレッドで実行されるシリアルキュー(メインスレッドは1つしかないため)
  • 実際にはメインスレッドで実行されるデフォルトのRunLoopで処理される
  • Main queue is access queue for UI
dispatch_queue_t mainDispatchQueue = dispatch_get_main_queue();

2.2. Global Dispatch Queue
  • コンカレントキュー
  • 実行優先度別に4種類(従来方式)または5種類(QoS方式)ある
  • 2015年5月現在においてバックワードコンパチを考慮(例えばiOS7.xをサポート)する場合は必然的に従来方式を採用することになる
// OS X 10.10(Yosemite)、iOS8.0以前でも以降でも利用できる
// 第2引数は0固定

dispatch_queue_t globalDispatchQueuePriorityHigh 
= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

dispatch_queue_t globalDispatchQueuePriorityDefault 
= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_queue_t globalDispatchQueuePriorityLow 
= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);

dispatch_queue_t globalDispatchQueuePriorityBackground 
= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);

// OS X 10.10(Yosemite)、iOS8.0以降でしか利用できない
// 第2引数は0固定

// 基本的にはQoSに関する明確な意思を決めて
// QOS_CLASS_DEFAULT以外を選択するのが良さげ。
// また、QOS_CLASS_DEFAULTについては下記の通り。
// Ordered between UI and non-UI QoS
// Not intented as a work classification

dispatch_queue_t globalDispatchQueueQosInteractive 
= dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0);

dispatch_queue_t globalDispatchQueueQosInitiated 
= dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0);

dispatch_queue_t globalDispatchQueueQosDefault 
= dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0);

dispatch_queue_t globalDispatchQueueQosUtility 
= dispatch_get_global_queue(QOS_CLASS_UTILITY, 0);

dispatch_queue_t globalDispatchQueueQosBackground 
= dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0);



コード例


ワーカスレッドがシリアルの場合
dispatch_queue_t mySerialDispatchQueue 
= dispatch_queue_create("com.example.MySerialDispatchQueue", DISPATCH_QUEUE_SERIAL);
    
dispatch_async(mySerialDispatchQueue, ^{
    // ワーカスレッド(シリアル)
    // 重い処理をここに書く
    
    dispatch_async(dispatch_get_main_queue(), ^{
        // メインスレッド(シリアル)
        // UI処理をここに書く
    });
    
});

ワーカスレッドがコンカレントの場合
//dispatch_queue_t globalDispatchQueuePriorityDefault 
//= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(globalDispatchQueuePriorityDefault, ^{
    // ワーカスレッド(コンカレント)
    // 「コンカレント実行されても問題ない」重い処理をここに書く
    
    dispatch_async(dispatch_get_main_queue(), ^{
        // メインスレッド(シリアル)
        // UI処理をここに書く
    });
    
});

2015年5月17日日曜日

CocoaPodsを使ってAFNetworkingを導入する

導入対象プロジェクト(今回の場合はPodsSample.xcodeproj)は閉じておく。
プロジェクトファイルがあるディレクトリまで移動後、Podfileを生成する。
$ cd /path/to/PodsSample
$ pod init

Podfileを編集する。
$ open -a Xcode Podfile

Podfile
# Uncomment this line to define a global platform for your project
# platform :ios, '6.0'
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'

target 'PodsSample' do
  pod 'AFNetworking', '~>2.5.3'
end

target 'PodsSampleTests' do

end


Podfileを保存して閉じた後、pod installを実行する。
$ rm Podfile.lock
$ pod install --verbose

以降は常にプロジェクトではなく、ワークスペースを開いて使う。
$ ls -l
(下記は抜粋表示)
Podfile
Podfile.lock
Pods
PodsSample
PodsSample.xcodeproj
PodsSample.xcworkspace
PodsSampleTests

$ open PodsSample.xcworkspace


CocoaPods管理のライブラリを更新する際は下記を実行する。
$ pod update


2015年5月16日土曜日

CocoaPodsをインストールする

使用中のRuby及びgemのバージョンを確認する。
$ rbenv version
2.2.0 (set by /Users/hogeuser/.rbenv/version)
$ gem -v
2.4.7

CocoaPodsをインストールする。
$ gem install cocoapods
$ rbenv rehash
$ pod setup --verbose


補足


「gem install cocoapods」により"追加で"インストールされたgem
activesupport (4.2.1)

claide (0.8.1)
cocoapods (0.37.1)
cocoapods-core (0.37.1)
cocoapods-downloader (0.9.0)
cocoapods-plugins (0.4.2)
cocoapods-trunk (0.6.0)
cocoapods-try (0.4.4)
colored (1.2)
escape (0.0.4)
fuzzy_match (2.0.4)
i18n (0.7.0)

molinillo (0.2.3)
nap (0.8.0)
netrc (0.7.8)

thread_safe (0.3.5)
tzinfo (1.2.2)
xcodeproj (0.24.1)

インストールするCocoaPodsのバージョンを指定する場合(RubyGemsの仕様通り)
$ gem install cocoapods --version "=0.36.4"

「pod setup」ではそれなりに時間がかかるので根気よく待つ。

2015年4月29日水曜日

32bit EFIブートファイルを作成する

WindowsタブレットPC等で採用されているCPU(Intel Atom: xx Trail)は基本的に32bitアーキテクチャであり、最近は例外なくファームウェアとしてUEFIが採用されていることから、この類のものにLinuxをインストールしたい場合は、別途32bit版(U)EFIファイルを用意する必要がある。

環境
  • Ubuntu Server 14.04.2 LTS x64

作業ディレクトリを作成
$ mkdir ~/tmpwork
$ cd ~/tmpwork

必要なパッケージをインストール
$ sudo apt-get update -y
$ sudo apt-get install -y git build-essential
$ sudo apt-get install -y bison libopts25 libselinux1-dev autogen m4 autoconf help2man libopts25-dev flex libfont-freetype-perl automake autotools-dev libfreetype6-dev texinfo

GRUB 2のソースを落としてきてmake
$ git clone git://git.savannah.gnu.org/grub.git
$ cd grub
$ ./autogen.sh
$ ./configure --with-platform=efi --target=i386 --program-prefix=''
$ make

EFIファイルを作成
$ cd grub-core
$ sudo ../grub-mkimage -d . -o bootia32.efi -O i386-efi -p /boot/grub ntfs hfs appleldr boot cat efi_gop efi_uga elf fat hfsplus iso9660 linux keylayouts memdisk minicmd part_apple ext2 extcmd xfs xnu part_bsd part_gpt search search_fs_file chain btrfs loadbios loadenv lvm minix minix2 reiserfs memrw mmap msdospart scsi loopback normal configfile gzio all_video efi_gop efi_uga gfxterm gettext echo boot chain eval

作成したEFIファイルを作業ディレクトリ直下にコピーしておく
$ cp bootia32.efi ~/tmpwork


[参考URL]
Instructions to install Ubuntu 14.10 on ASUS EeeBook X205TA
UEFIBooting - Community Help Wiki