tag:blogger.com,1999:blog-8508783239007348512024-03-05T13:43:15.006+09:00いつか見た惑星sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.comBlogger49125tag:blogger.com,1999:blog-850878323900734851.post-91232512165932837942016-02-14T23:30:00.000+09:002016-02-14T23:30:00.172+09:00Goでクロスコンパイルを実行するGo 1.5からはクロスコンパイルが簡単に実行できるようになっている。<br />
<br />
github公開用としてコードを書く場合
<pre>
$ cd $GOPATH
$ mkdir -p src/github.com/hogeuser/fugarepo
$ cd src/github.com/hogeuser/fugarepo
</pre>
<br />
ローカルマシン専用にコードを書く場合
<pre>
$ cd $GOPATH
$ mkdir src/foohost.local
$ cd src/foohost.local
</pre>
<br />
hello.go
<pre>
package main
import "fmt"
import "runtime"
func main() {
fmt.Printf("hello, %s/%s\n", runtime.GOOS, runtime.GOARCH)
}
</pre>
<br />
OS X用にビルドして実行する場合
<pre>
$ go build -o hello hello.go
$ ./hello
hello, darwin/amd64
</pre>
<br />
Windows用にビルドする場合
<pre>
$ GOOS=windows GOARCH=amd64 go build -o hello.exe hello.go
</pre>
<br />
Raspberry Pi 2用にビルドする場合
<pre>
$ GOOS=linux GOARCH=arm GOARM=7 go build -o hello hello.go
</pre>
<br />
<br />
[参考URL]<br />
<a href="http://deeeet.com/writing/2015/07/22/go1_5-cross-compile/" target="_blank">Go1.5はクロスコンパイルがより簡単 | SOTA</a><br />
<a href="https://github.com/golang/go/wiki/GoArm" target="_blank">GoArm</a><br />
<a href="https://www.alexruf.net/2016/01/16/cross-compile-with-go-1-5-for-raspberry-pi.html" target="_blank">Cross compile with Go 1.5 for Raspberry Pi</a><br />
sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-71456790368699222842016-02-13T23:30:00.000+09:002016-02-14T22:32:53.392+09:00Goをインストールするhomebrewを使ってGoをインストールする。
<pre>
$ brew update && brew install go
</pre>
<br />
環境変数としてGOPATH、GOROOTを設定した上でPATHを通す。<br />
GOPATH配下はbin、pkg、srcのディレクトリで構成されることが想定されている。GOROOTについてはGoツールのパスを指定しておく。
<pre>
$ 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
</pre>
<br />
使用可能なコマンドを確認する。
<pre>
$ go help
</pre>
<br />
インストールされたGoのバージョンを確認する。
<pre>
$ go version
go version go1.5.3 darwin/amd64
</pre>
<br />
Goの環境情報を確認する。
<pre>
$ 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"
</pre>
<br />
入力補完用にgocodeをインストールする。
<pre>
$ go get -u github.com/nsf/gocode
</pre>
<br />
<br />
<a href="https://github.com/Homebrew/homebrew/blob/f7da1252f59db6de341702d0a4d0cac5f1fdcec9/Library/Formula/go.rb#L23-L25" target="_blank">現時点でのhomebrew Formula</a>を確認する限り、godocとvetはデフォルトでインストールされるようだが、別途インストールする必要がある場合は下記の通り実行する。<br />
<br />
godocのインストール
<pre>
$ go get golang.org/x/tools/cmd/godoc
</pre>
<br />
vetのインストール(先にMercurialをインストールしておく必要がある)
<pre>
$ 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
</pre>
<br />
<br />
[参考URL]<br />
<a href="https://golang.org/doc/code.html" target="_blank">How to Write Go Code - The Go Programming Language</a><br />
<a href="https://github.com/astaxie/build-web-application-with-golang/blob/master/ja/01.3.md" target="_blank">Goのコマンド</a><br />
<a href="http://blog.wacul.co.jp/blog/2014/08/22/go/" target="_blank">これからGoを始める人のためのTips集</a><br />
sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-88812737225446909122016-02-05T23:30:00.000+09:002016-02-06T23:20:32.542+09:00Pythonバージョン管理ツールを導入するPythonバージョン管理ツールである<a href="https://github.com/yyuu/pyenv" target="_blank">pyenv</a>を導入する。pyenvプロジェクトはrbenv及びruby-buildからフォークされ、Python用にモディファイされたプロジェクトである。そのため、導入方法はほぼRubyの場合と同様(参考:<a href="http://sushichop.blogspot.jp/2014/02/ruby.html" target="_blank">Rubyバージョン管理ツールを導入する</a>)。<br />
<br />
pyenvをインストールしてPATH設定する。
<pre>
$ brew update
$ brew install pyenv
</pre>
<br />
<pre>
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ exec $SHELL -l
</pre>
<br />
pyenvのバージョンを確認する。
<pre>
$ pyenv -v
pyenv 20160202
</pre>
<br />
インストール可能なPythonのバージョンを確認する。
<pre>
$ pyenv install -l
</pre>
<br />
2.7.10をインストールする。
<pre>
$ pyenv install 2.7.10
$ pyenv rehash
</pre>
<br />
3.5.0をインストールする。
<pre>
$ pyenv install 3.5.0
$ pyenv rehash
</pre>
<br />
インストールされているPythonのバージョンを確認する。
<pre>
$ pyenv versions
* system (set by /Users/hogeuser/.pyenv/version)
2.7.10
3.5.0
</pre>
<br />
使用するPythonのバージョンを切り替える。
<pre>
$ pyenv global 2.7.10
$ pyenv versions
system
* 2.7.10 (set by /Users/hogeuser/.pyenv/version)
3.5.0
</pre>
<br />
使用中のPythonのバージョンを確認する。
<pre>
$ pyenv version
2.7.10 (set by /Users/hogeuser/.pyenv/version)
$ python --version
Python 2.7.10
</pre>
<br />
sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-71364438856991981622015-05-23T12:30:00.000+09:002015-05-24T18:32:49.481+09:00GCDについて情報整理する歴史的なことも含めてGCDに関する情報を整理しておく。<br />
<br />
<br />
<section>
<h1><b>GCDの歴史</b></h1>
<ul>
<li>Mac OS X 10.6(Snow Leopard)以降、iOS 4.0以降で利用可能</li>
<li>OS X 10.8(Mountain Lion)、iOS 6.0以降では、GCDオブジェクト(Dispatch Queue)もARCの管轄下に入るようになった(実際にはGCDだけでなくXPCも)</li>
<li>OS X 10.10(Yosemite)、iOS8.0 からQoS(Quality of Service)の概念が導入された</li>
</ul>
</section>
<br />
<br />
<section>
<h1><b>ディスパッチキューの利用</b></h1>
<br />
<h3><b>ディスパッチキューの利用には大きく分けて2つの方法がある</b></h3>
<ol>
<li>dispatch_queue_create関数を使ってディスパッチキューを自分で生成する</li>
<li>システムが標準で提供しているディスパッチキューを取得する</li>
</ol>
<br />
<h3><b>1. dispatch_queue_create関数を使ってディスパッチキューを自分で生成する</b></h3>
<ul>
<li>開発者はシリアルキューとコンカレントキューを生成できる</li>
<li>コンカレントキューを自分で生成するケースは稀</li>
<li>OS X v10.7、iOS 4.3以降から第2引数にNULL以外を指定できるようになった</li>
</ul>
<br />
<b>1.1. シリアルキューを生成する場合</b>
<pre class="brush: objc;">
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);
</pre>
<br />
<b>1.2. コンカレントキューを生成する場合</b>
<pre class="brush: objc;">
dispatch_queue_t myConcurrentDispatchQueue
= dispatch_queue_create("com.example.MyConcurrentDispatchQueue", DISPATCH_QUEUE_CONCURRENT);
</pre>
<br />
<br />
<h3><b>2. システムが標準で提供しているディスパッチキューを取得する</b></h3>
<ul>
<li>システムが標準で提供しているディスパッチキューは2種類ある(Main Dispatch QueueとGlobal Dispatch Queue)</li>
<li>アプリのどこからでも利用できる</li>
</ul>
<br />
<b>2.1. Main Dispatch Queue</b>
<ul>
<li>メインスレッドで実行されるシリアルキュー(メインスレッドは1つしかないため)</li>
<li>実際にはメインスレッドで実行されるデフォルトのRunLoopで処理される</li>
<li>Main queue is access queue for UI</li>
</ul>
<pre class="brush: objc;" title="Main Dispatch Queueの取得方法">
dispatch_queue_t mainDispatchQueue = dispatch_get_main_queue();
</pre>
<br />
<b>2.2. Global Dispatch Queue</b>
<ul>
<li>コンカレントキュー</li>
<li>実行優先度別に4種類(従来方式)または5種類(QoS方式)ある</li>
<li>2015年5月現在においてバックワードコンパチを考慮(例えばiOS7.xをサポート)する場合は必然的に従来方式を採用することになる</li>
</ul>
<pre class="brush: objc;" title="従来方式">
// 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);
</pre>
<pre class="brush: objc;" title="QoS方式">
// 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);
</pre>
</section>
<br />
<br />
<section>
<h1><b>コード例</b></h1>
<br />
<b>ワーカスレッドがシリアルの場合</b>
<pre class="brush: objc;">
dispatch_queue_t mySerialDispatchQueue
= dispatch_queue_create("com.example.MySerialDispatchQueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(mySerialDispatchQueue, ^{
// ワーカスレッド(シリアル)
// 重い処理をここに書く
dispatch_async(dispatch_get_main_queue(), ^{
// メインスレッド(シリアル)
// UI処理をここに書く
});
});
</pre>
<br />
<b>ワーカスレッドがコンカレントの場合</b>
<pre class="brush: objc;">
//dispatch_queue_t globalDispatchQueuePriorityDefault
//= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(globalDispatchQueuePriorityDefault, ^{
// ワーカスレッド(コンカレント)
// 「コンカレント実行されても問題ない」重い処理をここに書く
dispatch_async(dispatch_get_main_queue(), ^{
// メインスレッド(シリアル)
// UI処理をここに書く
});
});
</pre>
</section>
<br />
sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-59631354318684934282015-05-17T18:00:00.000+09:002015-11-28T21:36:12.145+09:00CocoaPodsを使ってAFNetworkingを導入する導入対象プロジェクト(今回の場合はPodsSample.xcodeproj)は閉じておく。<br />
プロジェクトファイルがあるディレクトリまで移動後、Podfileを生成する。<br />
<pre>
$ cd /path/to/PodsSample
$ pod init
</pre>
<br />
Podfileを編集する。
<pre>
$ open -a Xcode Podfile
</pre>
<br />
Podfile
<pre>
# 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
</pre>
<br />
Podfileを保存して閉じた後、pod installを実行する。
<pre>
$ rm Podfile.lock
$ pod install --verbose
</pre>
<br />
以降は常にプロジェクトではなく、ワークスペースを開いて使う。
<pre>
$ ls -l
(下記は抜粋表示)
Podfile
Podfile.lock
Pods
PodsSample
PodsSample.xcodeproj
PodsSample.xcworkspace
PodsSampleTests
$ open PodsSample.xcworkspace
</pre>
<br />
<br />
CocoaPods管理のライブラリを更新する際は下記を実行する。
<pre>
$ pod update
</pre>
<br />
<br />sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-2321197570448766592015-05-16T23:30:00.000+09:002016-04-17T13:35:40.946+09:00CocoaPodsをインストールする使用中のRuby及びgemのバージョンを確認する。
<pre>
$ rbenv version
2.2.0 (set by /Users/hogeuser/.rbenv/version)
$ gem -v
2.4.7
</pre>
<br />
CocoaPodsをインストールする。
<pre>
$ gem install cocoapods
$ rbenv rehash
$ pod setup --verbose
</pre>
<br />
<br />
<h3><b>補足</b></h3>
<br />
「gem install cocoapods」により"追加で"インストールされたgem
<pre />
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)
</pre>
<br />
インストールするCocoaPodsのバージョンを指定する場合(RubyGemsの仕様通り)
<pre>
$ gem install cocoapods --version "=0.36.4"
</pre>
<br />
「pod setup」ではそれなりに時間がかかるので根気よく待つ。
<br />
<br />
sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-27467356946570075922015-04-29T18:00:00.000+09:002015-04-29T18:01:18.996+09:0032bit EFIブートファイルを作成するWindowsタブレットPC等で採用されているCPU(Intel Atom: xx Trail)は基本的に32bitアーキテクチャであり、最近は例外なくファームウェアとしてUEFIが採用されていることから、この類のものにLinuxをインストールしたい場合は、別途32bit版(U)EFIファイルを用意する必要がある。<br />
<br />
<b>環境<br />
<ul>
<li>Ubuntu Server 14.04.2 LTS x64</li>
</ul></b>
<br />
作業ディレクトリを作成
<pre>
$ mkdir ~/tmpwork
$ cd ~/tmpwork
</pre>
<br />
必要なパッケージをインストール
<pre>
$ 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
</pre>
<br />
<a href="http://www.gnu.org/software/grub/grub-download.html" target="_blank">GRUB 2のソース</a>を落としてきてmake
<pre>
$ git clone git://git.savannah.gnu.org/grub.git
$ cd grub
$ ./autogen.sh
$ ./configure --with-platform=efi --target=i386 --program-prefix=''
$ make
</pre>
<br />
EFIファイルを作成
<pre>
$ 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
</pre>
<br />
作成したEFIファイルを作業ディレクトリ直下にコピーしておく
<pre>
$ cp bootia32.efi ~/tmpwork
</pre>
<br />
<br />
[参考URL]<br />
<a href="https://github.com/lopaka/instructions/blob/master/ubuntu-14.10-install-asus-x205ta.md" target="_blank">Instructions to install Ubuntu 14.10 on ASUS EeeBook X205TA</a><br />
<a href="https://help.ubuntu.com/community/UEFIBooting" target="_blank">UEFIBooting - Community Help Wiki</a><br />sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-20952754978651559962015-04-26T23:30:00.000+09:002015-04-29T17:54:59.387+09:00Ubuntu ServerインストーラをUSBメモリに書き込む<b>環境<br />
<ul>
<li>Ubuntu Server 14.04.2 LTS x64</li>
</ul></b>
<br />
isoイメージファイルをダウンロード
<pre>
$ wget http://releases.ubuntu.com/14.04/ubuntu-14.04.2-server-amd64.iso
$ md5 ubuntu-14.04.2-server-amd64.iso
MD5 (ubuntu-14.04.2-server-amd64.iso) = 83aabd8dcf1e8f469f3c72fff2375195
</pre>
<br />
isoファイルからimgファイルに変換
<pre>
$ hdiutil convert -format UDRW -o ubuntu-14.04.2-server-amd64.img ubuntu-14.04.2-server-amd64.iso
$ mv ubuntu-14.04.2-server-amd64.img.dmg ubuntu-14.04.2-server-amd64.img
</pre>
<br />
USBメモリを接続してディスク番号を確認
<pre>
$ diskutil list
$ df -h
</pre>
<br />
USBメモリをアンマウントした上で、rawデバイス指定でimgファイルを書き込む<br />
(下記はディスク番号が「2」の場合)
<pre>
$ sudo diskutil unmountDisk /dev/disk2
$ sudo dd bs=1m if=ubuntu-14.04.2-server-amd64.img of=/dev/rdisk2
$ sudo diskutil eject /dev/disk2
</pre>
<br />
<br />
[参考URL]<br />
<a href="http://www.ubuntu.com/download/desktop/create-a-usb-stick-on-mac-osx" target="_blank">How to create a bootable USB stick on OS X | Ubuntu</a><br />
sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-70325496569863040852015-03-07T23:30:00.000+09:002015-05-24T18:32:20.205+09:00Javaの設定を行う現在インストールされているJDKを確認する(私の環境ではJDK6、7、8がインストール済み)。<br />
<pre>
$ /usr/libexec/java_home -V
</pre>
<br />
JDK7をJAVA_HOMEとして設定する。<br />
<pre>
$ vim ~/.bashrc
$ less ~/.bashrc
(関連箇所を抜粋)
export JAVA_HOME=`/usr/libexec/java_home -v 1.7`
</pre>
<br />
必要に応じてJavaVMのオプションを設定する。例えば下記の通り。
<pre>
$ vim ~/.bashrc
$ less ~/.bashrc
(関連箇所を抜粋)
export JAVA_OPTS="-Dfile.encoding=UTF-8"
# または
#export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
</pre>
<br />
最後に~/.bashrcを再読み込み
<pre>
$ source ~/.bashrc
</pre>
<br />
sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-20857461436844228292014-12-30T23:30:00.000+09:002015-08-18T15:42:54.365+09:00プロキシ環境下でApache Subversionを使う<h3><b>設定ファイル</b></h3>
<br />
~/.subversion/servers
<br />
<br />
<br />
<h3><b>グループ毎に個別指定する場合</b></h3>
<br />
アクセスするリポジトリが固定している場合はgroupsセクションで設定するのが望ましい<br />
<pre>
$ cat ~/.subversion/servers
(関連箇所のみ抜粋)
[groups]
targetgroup1 = somerepository.example.org
[targetgroup1]
http-proxy-host = proxy.example.com
http-proxy-port = 8080
http-proxy-username = foo.bar@example.com
http-proxy-password = hogepass
</pre>
<br />
<br />
<h3><b>まとめて指定する場合</b></h3>
<br />
外部リポジトリにしかアクセスしない場合等はglobalセクションで一括設定すると楽<br />
<pre>
$ cat ~/.subversion/servers
(関連箇所のみ抜粋)
[global]
http-proxy-exceptions = *.internal.example.com, *.internal.example.net
http-proxy-host = proxy.example.com
http-proxy-port = 8080
http-proxy-username = foo.bar@example.com
http-proxy-password = hogepass
</pre>
<br />
sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-59260011943156400832014-11-26T23:30:00.000+09:002015-05-24T18:32:02.231+09:00NSURLSessionを使ってHTTPリクエストする(Swift)SwiftでNSURLSessionDataTaskを使って、HTTP-GET、JSONデータをHTTP-POSTする。<br />
<br />
<b>環境<br />
<ul>
<li>Xcode 6.1</li>
<li>iOS 8.1</li>
</ul></b>
<pre class="brush:swift;" title="ViewController.swift">
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
// HTTP-GET
@IBAction func getAsync(sender: AnyObject) {
// create the url-request
let urlString = "http://httpbin.org/get"
var request = NSMutableURLRequest(URL: NSURL(string: urlString)!)
// set the method(HTTP-GET)
request.HTTPMethod = "GET"
// use NSURLSessionDataTask
var task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { data, response, error in
if (error == nil) {
var result = NSString(data: data, encoding: NSUTF8StringEncoding)!
println(result)
} else {
println(error)
}
})
task.resume()
}
// HTTP-POST
@IBAction func postAsync(sender: AnyObject) {
// create the url-request
let urlString = "http://httpbin.org/post"
var request = NSMutableURLRequest(URL: NSURL(string: urlString)!)
// set the method(HTTP-POST)
request.HTTPMethod = "POST"
// set the header(s)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
// set the request-body(JSON)
var params: [String: AnyObject] = [
"foo": "bar",
"baz": [
"a": 1,
"b": 20,
"c": 300
]
]
request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: nil)
// use NSURLSessionDataTask
var task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: {data, response, error in
if (error == nil) {
var result = NSString(data: data, encoding: NSUTF8StringEncoding)!
println(result)
} else {
println(error)
}
})
task.resume()
}
}
</pre>
<br />sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-72135194434116298972014-10-05T23:30:00.000+09:002014-10-08T23:54:58.939+09:00即時関数を使ってグローバル汚染を最小にする<br />
<h3>関数単位でスコープが決まる性質を利用する。</h3>
<ul>
<li>即時関数を使ってローカルスコープ化することにより、グローバル汚染を防ぐ。</li>
<li>strictモードでは関数内のthisがundefinedになるため、callメソッドを使用する。</li>
<li>関数前の「;」はファイル連結時に不具合が出ないようにするための予防策。</li>
</ul>
<pre class="brush: html;" title="index.html">
<!DOCTYPE html>
<html>
<head lang="ja">
<meta charset="UTF-8">
<title>即時関数によるスコープ閉じ込め</title>
</head>
<body>
<ul>
<li id="first">1行目</li>
<li id="second">2行目</li>
<li id="third">3行目</li>
<ul>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore-min.js"></script>
<script src="./js/app.js"></script>
</body>
</html>
</pre>
<pre class="brush: js;" title="./js/app.js">
;(function ($) {
'use strict';
alert('outside ready method: this = ' + this);
alert('outside ready method: $ = ' + $);
alert('outside ready method: _.VERSION = ' + _.VERSION);
$(function () {
alert('inside ready method: this = ' + this);
alert('inside ready method: $ = ' + $);
alert('inside ready method: _.VERSION = ' + _.VERSION);
$('#third').css('color', 'red');
});
alert('this = ' + this);
alert('$ = ' + $);
alert(_.VERSION);
}).call(this, jQuery);
//}.bind(this)(jQuery));
</pre>
<br />
[参考URL]<br />
<a href="http://d.hatena.ne.jp/sandai/20110824/p1" target="_blank">知ってて当然?初級者のためのJavaScriptで使う即時関数(function(){...})()の全て - 三等兵</a><br />
<a href="http://tomcky.hatenadiary.jp/entry/2014/06/14/203418" target="_blank">callで関数を即時実行すると何が嬉しいのか(と、ちょっとおまけ) - ただぱそこんしてるだけ</a><br />
<a href="http://thujikun.github.io/blog/2013/12/15/js-tech/" target="_blank">便利なjavascriptテクニック集 - Thujikun blog</a><br />
<a href="http://blog.niw.at/post/26687866336" target="_blank">"use strict" - blog.niw.at</a><br />
<br />sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-81667556715312445092014-08-16T23:30:00.000+09:002015-05-24T18:31:47.089+09:00NSURLSessionを使ってHTTPリクエストするNSURLSessionDataTaskを使って、HTTP-GET、JSONデータをHTTP-POSTする。<br />
<br />
<pre class="brush: objc;" title="ViewController.h">
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *requestUrl;
@property (weak, nonatomic) IBOutlet UITextField *requestBody;
@property (weak, nonatomic) IBOutlet UITextView *requestResult;
- (IBAction)getAsync:(id)sender;
- (IBAction)postAsync:(id)sender;
@end
</pre>
<pre class="brush: objc;" title="ViewController.m">
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
// HTTP-GET
- (IBAction)getAsync:(id)sender {
NSLog(@"%s", __func__);
// create the url-request
NSURL *url = [NSURL URLWithString:self.requestUrl.text];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// set the method(HTTP-GET)
[request setHTTPMethod:@"GET"];
// use NSURLSessionDataTask
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error) {
NSHTTPURLResponse *httpRes = (NSHTTPURLResponse *)response;
NSLog(@"statusCode: %ld", (long)httpRes.statusCode);
NSLog(@"allHeaderFields: %@", httpRes.allHeaderFields);
NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"result: %@", result);
dispatch_async(dispatch_get_main_queue(), ^{
self.requestResult.text = result;
});
} else {
NSLog(@"error: %@", [error localizedDescription]);
}
}];
[task resume];
}
// HTTP-POST
- (IBAction)postAsync:(id)sender {
NSLog(@"%s", __func__);
// create the url-request
NSURL *url = [NSURL URLWithString:self.requestUrl.text];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// set the headers(s)
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
// set the method(HTTP-POST)
[request setHTTPMethod:@"POST"];
// set the request-body
NSString *reqBody = self.requestBody.text;
NSLog(@"%@", reqBody);
[request setHTTPBody:[reqBody dataUsingEncoding:NSUTF8StringEncoding]];
// use NSURLSessionDataTask
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error) {
NSHTTPURLResponse *httpRes = (NSHTTPURLResponse *)response;
NSLog(@"statusCode: %ld", (long)httpRes.statusCode);
NSLog(@"allHeaderFields: %@", httpRes.allHeaderFields);
NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"result: %@", result);
dispatch_async(dispatch_get_main_queue(), ^{
self.requestResult.text = result;
});
} else {
NSLog(@"error: %@", [error localizedDescription]);
}
}];
[task resume];
}
@end
</pre>sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-74636721055721937022014-07-25T23:50:00.000+09:002014-10-06T01:03:59.676+09:00WICの機能や無線LANの状態を確認するRaspberry Piに無線LAN USBアダプタ(<a href="http://buffalo.jp/product/wireless-lan/client/wli-uc-gnm/" target="_blank">WLI-UC-GNM</a>)を接続<br />
<br />
<pre>
$ lsusb
(関連箇所のみ抜粋)
Bus 001 Device 004: ID 0411:01a2 BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM Wireless LAN Adapter [Ralink RT8070]
</pre>
<br />
<pre>
$ lsmod
Module Size Used by
(関連箇所のみ抜粋)
rt2800usb 17279 0
rt2800lib 80619 1 rt2800usb
rt2x00usb 11669 1 rt2800usb
rt2x00lib 44799 3 rt2x00usb,rt2800lib,rt2800usb
mac80211 329373 3 rt2x00lib,rt2x00usb,rt2800lib
cfg80211 211002 2 mac80211,rt2x00lib
rfkill 19567 2 cfg80211
</pre>
--><br/>
cfg80211、mac80211の記述からnl80211でカバーできそう
<br />
<br />
iwのインストール
<pre>
$ sudo apt-get install iw
</pre>
<br />
サポート機能の確認
<pre>
$ iw list
Wiphy phy0
(関連箇所のみ抜粋)
Supported Ciphers:
* WEP40 (00-0f-ac:1)
* WEP104 (00-0f-ac:5)
* TKIP (00-0f-ac:2)
* CCMP (00-0f-ac:4)
Available Antennas: TX 0 RX 0
Supported interface modes:
* IBSS
* managed
* AP
* AP/VLAN
* WDS
* monitor
* mesh point
software interface modes (can always be added):
* AP/VLAN
* monitor
valid interface combinations:
* #{ AP, mesh point } <= 8,
total <= 8, #channels <= 1
</pre>
--><br/>
IBSS: アドホック<br />
managed: クライアント<br />
AP: アクセスポイント<br />
VLAN: 無線VLAN<br />
monitor: 無線LANネットワーク検出
<br />
<br />
無線LANのスキャン
<pre>
$ sudo iw dev wlan0 scan
</pre>
<br />
iwconfigはまだ使えるようだが、これはそのうちdeprecatedされるかもしれない
<pre>
$ sudo ifdown wlan0
$ iwconfig
(関連箇所のみ抜粋)
wlan0 IEEE 802.11bgn ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=20 dBm
Retry long limit:7 RTS thr:off Fragment thr:off
Power Management:on
$ sudo ifup wlan0
$ iwconfig
(関連箇所のみ抜粋)
wlan0 IEEE 802.11bgn ESSID:"RaspiSSID"
Mode:Managed Frequency:2.462 GHz Access Point: 01:23:45:67:89:AB
Bit Rate=6.5 Mb/s Tx-Power=20 dBm
Retry long limit:7 RTS thr:off Fragment thr:off
Power Management:on
Link Quality=70/70 Signal level=-39 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
</pre>
<br />
<br />
[参考URL]<br />
<a href="http://wireless.kernel.org/en/developers/Documentation/cfg80211" target="_blank">cfg80211 - Linux Wireless</a><br />
<a href="http://wireless.kernel.org/en/developers/Documentation/mac80211" target="_blank">mac80211 - Linux Wireless</a><br />
<a href="http://wireless.kernel.org/en/developers/Documentation/nl80211" target="_blank">nl80211 - Linux Wireless</a><br />
<a href="http://www.ibm.com/developerworks/jp/linux/library/l-wifiencrypthostapd/" target="_blank">hostapd を使用した簡単な方法で WiFi に強力な暗号化を実装する</a><br />
sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-22672417011591207402014-07-21T23:50:00.000+09:002015-02-26T00:28:20.759+09:00Raspberry Piのネットワークを設定する<h3><b>有線LAN</b></h3>
<br />
有線LAN用固定IPの設定
<pre>
$ sudo cp /etc/network/interfaces{,.orig}
$ sudo vim /etc/network/interfaces
</pre>
<br />
/etc/network/interfaces
<pre>
auto lo
iface lo inet loopback
iface eth0 inet static
address 192.168.21.41
netmask 255.255.255.0
gateway 192.168.21.1
</pre>
<br />
該当IFの無効・有効化
<pre>
$ sudo ifdown eth0 && sudo ifup eth0
</pre>
<br />
<br />
<h3><b>無線LAN</b></h3>
<br />
無線LANクライアントの設定
<pre>
$ sudo cp /etc/wpa_supplicant/wpa_supplicant.conf{,.orig}
$ wpa_passphrase "RaspiSSID" "RaspiSSIDPW" | sudo tee -a /etc/wpa_supplicant/wpa_supplicant.conf
network={
ssid="RaspiSSID"
#psk="RaspiSSIDPW"
psk=d721085129ab22a68036c3c5cf7d28dab5f9b3de93a8866fe6626d59e811b7f7
}
$ sudo vim /etc/wpa_supplicant/wpa_supplicant.conf
</pre>
<br />
/etc/wpa_supplicant/wpa_supplicant.conf
<pre>
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="RaspiSSID"
scan_ssid=0 # スキャン方法(0:パッシブ、1:アクティブ)
priority=0 # 値が大きいほど優先度が高い(デフォルトは0)
proto=RSN # WPA2はRSNの別名
key_mgmt=WPA-PSK
pairwise=TKIP CCMP
group=CCMP
psk=d721085129ab22a68036c3c5cf7d28dab5f9b3de93a8866fe6626d59e811b7f7
id_str="RaspiConf" # 識別名
}
</pre>
<br />
無線LAN用固定IPの設定
<pre>
$ sudo cp /etc/network/interfaces{,.orig}
$ sudo vim /etc/network/interfaces
</pre>
<br />
/etc/network/interfaces
<pre>
auto lo
iface lo inet loopback
iface eth0 inet static
address 192.168.21.41
netmask 255.255.255.0
gateway 192.168.21.1
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
iface RaspiConf inet static
address 192.168.21.42
netmask 255.255.255.0
gateway 192.168.21.1
</pre>
<br />
該当IFの無効・有効化
<pre>
$ sudo ifdown wlan0 && sudo ifup wlan0
</pre>
<br />
<br />
<h3><b>リゾルバの設定</b></h3>
<br />
<pre>
$ sudo vim /etc/resolv.conf
$ cat /etc/resolv.conf
nameserver 192.168.21.1
nameserver 192.168.22.1
search example.com example.jp
</pre>
<br />
<br />
<h3><b>ホスト名の設定</b></h3>
<br />
<pre>
$ sudo vim /etc/hostname
$ cat /etc/hostname
raspi
</pre>
<br />
<pre>
$ sudo vim /etc/hosts
$ cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
127.0.1.1 raspi.example.com raspi
192.168.11.41 raspi.example.com raspi
192.168.11.42 raspi.example.com raspi
</pre>
<br />
<br />
<h3><b>再起動</b></h3>
<br />
<pre>
$ sudo shutdown -r now
</pre>
<br />
<br />
[参考URL]<br />
<a href="http://www.debuntu.org/how-to-wifi-roaming-with-wpa-supplicant/" target="_blank">How-To: WiFi roaming with wpa-supplicant | Debuntu</a><br />
<a href="http://www.freebsd.org/cgi/man.cgi?wpa_supplicant.conf(5)" target="_blank">wpa_supplicant.conf(5)</a><br />
<a href="http://www.gentoo.org/doc/ja/handbook/handbook-x86.xml?part=4&chap=4" target="_blank">Gentoo Linux ドキュメント -- 無線ネットワーク</a><br />sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-10212743391652577552014-07-18T23:50:00.000+09:002014-07-22T00:50:23.195+09:00Raspberry Piをバックアップ・リストアする<h3><b>バックアップ</b></h3>
<br />
バックアップ元であるSDカードのディスク番号を確認してからバックアップを実行。
<pre>
$ diskutil list
(関係箇所のみ抜粋)
/dev/disk1
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *15.9 GB disk1
1: Windows_FAT_32 boot 58.7 MB disk1s1
2: Linux 15.9 GB disk1s2
$ df -h
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
(関係箇所のみ抜粋)
/dev/disk1s1 56Mi 9.5Mi 46Mi 17% 512 0 100% /Volumes/boot
$ sudo dd bs=1m if=/dev/rdisk1 of=./raspi_YYYYMMDD.img
</pre>
<br />
gzip圧縮してバックアップする際は
<pre>
$ sudo dd bs=1m if=/dev/rdisk1 | gzip > ./raspi_YYYYMMDD.gz
</pre>
<br />
<br />
<h3><b>リストア</b></h3>
<br />
リストア先であるSDカードのディスク番号を確認、アンマウントしてからリストアを実行(<a href="http://sushichop.blogspot.jp/2014/07/raspberry-pisd.html" target="_blank">過去の内容</a>と同様)。
<pre>
$ diskutil list
(関係箇所のみ抜粋)
/dev/disk1
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *15.9 GB disk1
1: DOS_FAT_32 UNTITLED 15.9 GB disk1s1
$ df -h
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
(関係箇所のみ抜粋)
/dev/disk1s1 15Gi 2.5Mi 15Gi 1% 0 0 100% /Volumes/UNTITLED
$ sudo diskutil unmount /dev/disk1s1
$ sudo dd bs=1m if=./raspi_YYYYMMDD.img of=/dev/rdisk1
$ sudo diskutil eject /dev/rdisk1
</pre>
<br />
gzip圧縮したファイルからリストアする際は
<pre>
$ sudo diskutil unmount /dev/disk1s1
$ gzip -dc ./raspi_YYYYMMDD.gz | sudo dd bs=1m of=/dev/rdisk1
$ sudo diskutil eject /dev/rdisk1
</pre>
<br /><br />
[参考URL]<br />
<a href="http://smittytone.wordpress.com/2013/09/06/back-up-a-raspberry-pi-sd-card-using-a-mac/" target="_blank">Back-up a Raspberry Pi SD card using a Mac | TechTonic</a><br />
sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-11802023894825784452014-07-16T23:50:00.000+09:002014-08-09T18:01:14.552+09:00Raspberry Piの初期設定を行う<h3><b>apt-getの実行</b></h3>
<br />
<pre>
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo shutdown -r now
</pre>
<br />
<br />
<h3><b>raspi-configの実行</b></h3>
<br />
<pre>
$ sudo raspi-config
</pre>
<br />
<b>1 Expand Filesystem</b>
<ul>
rootfs(ext4フォーマット)を拡張する。<br />
再起動後に拡張rootfsが有効になる。<br />
</ul>
<br />
<b>2 Change User Password</b>
<ul>
「$ sudo passwd pi」が実行される。<br />
ユーザpiのパスワードを変更する。<br />
</ul>
<br />
<b>4 Internationalisation Options</b>
<ul>
<li value="I1">Change Locale</li>
「$ sudo dpkg-reconfigure locales」が実行される。<br />
「en_US.UTF-8 UTF-8」のみをチェックする。<br />
「Default local for the system environment」については「en_US.UTF-8」を選択する。<br />
設定反映のために、一旦ログアウトしてから再度ログインする。<br />
<br />
<li value="I2">Change Timezone</li>
「$ sudo dpkg-reconfigure tzdata」が実行される。<br />
「Asia -> Tokyo」と選択する。<br />
<br />
<li value="I3">Change Keyboard Layout</li>
「Generic 105-key (Intl) PC -> Other -> Japanese -> Japanese - Japanese (OADG 109A) -> The default for the keyboard layout -> No compose key -> Yes」と選択する。<br />
最後のYesは「Use Control+Alt+Backspace to terminate the X server?」に関する選択。<br />
</ul>
<br />
<br />
<h3><b>追加のロケール設定</b></h3>
<br />
<pre>
$ sudo vi /etc/default/locale
$ cat /etc/default/locale
# File generated by update-locale
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
LANGUAGE=en_US.UTF-8
</pre>
設定反映のために、一旦ログアウトしてから再度ログインする。<br />
<br />
<br />
<h3><b>HDMI出力の固定化</b></h3>
<br />
<pre>
$ sudo vi /boot/config.txt
(関連箇所のみ抜粋)
hdmi_force_hotplug=1
framebuffer_width=1920
framebuffer_height=1080
$ sudo shutdown -r now
</pre>
<br />
<br />
[参考URL]<br />
<a href="http://rohankapoor.com/2012/04/americanizing-the-raspberry-pi/" target="_blank">“Americanizing” the Raspberry Pi | Rohan Kapoor</a><br />
<a href="http://tech.enekochan.com/en/2013/11/03/fix-locale-problems-in-raspbian/" target="_blank">Fix locale problems in Raspbian | Programming and Technology</a><br />sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-44015222133120496112014-07-14T23:50:00.000+09:002014-07-22T00:50:49.000+09:00Raspberry Piで使うSDカードをセットアップする<h3><b>OSイメージ(Raspbian)の準備</b></h3>
<br />
<a href="http://www.raspberrypi.org/downloads/" target="_blank">本家</a>からOSイメージをダウンロードしようとすると時間がかかるので、<a href="http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/" target="_blank">JAISTのミラーサイト</a>からダウンロードする。
<pre>
$ wget http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/raspbian-2014-06-22/2014-06-20-wheezy-raspbian.zip
$ openssl sha1 2014-06-20-wheezy-raspbian.zip
SHA1(2014-06-20-wheezy-raspbian.zip)= b020908e3cba472a24f7a17498008eb69d86d1cb
$ unzip 2014-06-20-wheezy-raspbian.zip
</pre>
<br /><br />
<h3><b>ディスク番号の確認</b></h3>
<br />
SDカードを接続してディスク番号を確認する。
<pre>
$ diskutil list
(関係箇所のみ抜粋)
/dev/disk1
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *15.9 GB disk1
1: DOS_FAT_32 UNTITLED 15.9 GB disk1s1
$ df -h
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
(関係箇所のみ抜粋)
/dev/disk1s1 15Gi 2.5Mi 15Gi 1% 0 0 100% /Volumes/UNTITLED
</pre>
<br /><br />
<h3><b>OSイメージの書き込み</b></h3>
<br />
SDカードをアンマウントした上で、rawデバイス指定で書き込みを実行する(アンマウント実行後は、書き込みが完了するまでSDカードを取り外さないこと)。<br />
なお、ddコマンド実行中にControl-Tを押下すると書き込み進捗状況を確認できる。<br />
<pre>
$ sudo diskutil unmount /dev/disk1s1
$ sudo dd bs=1m if=2014-06-20-wheezy-raspbian.img of=/dev/rdisk1
$ sudo diskutil eject /dev/rdisk1
</pre>
<br /><br />
[参考URL]<br />
<a href="http://www.raspberrypi.org/documentation/installation/installing-images/mac.md" target="_blank">Raspberry Pi Documentation</a><br />
<a href="http://elinux.org/RPi_Easy_SD_Card_Setup" target="_blank">RPi Easy SD Card Setup - eLinux.org</a><br />
<br />
sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-10395231936939860372014-06-14T23:30:00.000+09:002015-06-07T19:07:10.184+09:00プロキシ環境下でChef Soloをインストールする<b>環境<br />
<ul>
<li>Ubuntu Server 12.04 LTS x64</li>
</ul></b>
<br />
apt-get用にプロキシ設定を追加
<pre>
$ sudo vi /etc/apt/apt.conf
$ cat /etc/apt/apt.conf
(関係箇所のみ抜粋)
Acquire::http::Proxy "http://proxy.example.com:8080";
Acquire::https::Proxy "http://proxy.example.com:8080";
Acquire::ftp::Proxy "http://proxy.example.com:8080";
</pre>
<br />
vim、curlのインストール
<pre>
$ sudo apt-get update -y
$ sudo apt-get install -y vim curl
</pre>
<br />
プロキシ用の環境変数を追加
<pre>
$ vim ~/.bashrc
$ cat ~/.bashrc
(関係箇所のみ抜粋)
export http_proxy="http://proxy.example.com:8080"
export https_proxy="http://proxy.example.com:8080"
export ftp_proxy="http://proxy.example.com:8080"
$ source ~/.bashrc
</pre>
<br />
<br />
wget用にプロキシ設定を追加(後で実行するオムニバスインストーラスクリプト内でwgetが実行されるため)
<pre>
$ sudo vim /etc/wgetrc
</pre>
<br />
/etc/wgetrc(関係箇所のみ抜粋)
<pre>
# You can set the default proxies for Wget to use for http, https, and ftp.
# They will override the value in the environment.
https_proxy = http://proxy.example.com:8080
http_proxy = http://proxy.example.com:8080
ftp_proxy = http://proxy.example.com:8080
# If you do not want to use proxy at all, set this to off.
use_proxy = on
</pre>
<br />
<br />
オムニバスインストーラを使ってChefをインストール
<pre>
$ curl -L https://www.opscode.com/chef/install.sh | sudo bash
</pre>
<br />
Chef Soloのバージョン確認
<pre>
$ chef-solo -v
</pre>
<br />
<br />
<h3><b>補足</b></h3>
wgetについて個別にプロキシ設定しない場合は、sudoコマンドにEオプションをつけることにより、ログインアカウントの環境変数を引き継いでインストールスクリプトを実行する。
<br />
<br />
<pre>
$ curl -L https://www.opscode.com/chef/install.sh | sudo -E bash
</pre>
<br />
<br />
[参考URL]<br />
<a href="http://thelittleican.blogspot.in/2013/09/unable-to-add-ppa-behind-proxy.html?m=1" target="_blank">The little, that can make a difference...: Unable to add ppa behind proxy</a><br />sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-67676737296260374252014-05-17T13:00:00.000+09:002014-05-19T22:35:32.110+09:00RubyGemsをアップデートするRubyGemsをアップデートする。rubygems-updateパッケージがない場合は自動的にインストールされる。
<pre>
$ gem update --system
$ gem -v
2.2.2
</pre>
<br />
なお、rubygems-updateパッケージを直接利用する場合は下記を実行すればOKのハズだが、私は使っていない。
<pre>
$ update_rubygems
$ gem -v
2.2.2
</pre>
<br />
基本的にBundler(Gemfile)で各gemを管理しているので、Bundlerもアップデートする。
<pre>
$ gem update bundler
$ bundle -v
Bundler version 1.6.2
</pre>
<br />
<br />
必要に応じて下記も実行する。<br />
<br />
Bundler管理のgemの更新
<pre>
$ bundle update
</pre>
<br />
Bundler管理の古いgemの削除
<pre>
$ bundle clean
</pre>
<br />
sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-63304596613246191852014-04-30T23:30:00.000+09:002014-07-16T21:33:26.155+09:00仮想ディスク(VHDXファイル)を作成するdiskpartを使って仮想ディスクであるVHDXファイルを作成する。<br />
maximumにはMB単位でサイズを指定する。<br />
<br />
<pre>
> diskpart
DISKPART> create vdisk file=C:\Users\hogeuser\Documents\sample.vhdx maximum=10240 type=expandable
DISKPART> select vdisk file=C:\Users\hogeuser\Documents\sample.vhdx
DISKPART> attach vdisk
DISKPART> create partition primary
DISKPART> assign letter=P
DISKPART> format quick fs=ntfs label=somelabel
DISKPART> detach vdisk
DISKPART> exit
>
</pre>
<br />sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-62910093464468866782014-03-02T18:00:00.001+09:002023-05-13T11:28:13.470+09:00Railsをインストールしてアプリを動作させる<h3><b>1. Railsをインストールする</b></h3>
<br />
Gemfileを作成する。<br />
<pre>
$ mkdir RailsSample
$ cd RailsSample
$ bundle init
</pre>
<br />
Gemfileを編集する。<br />
<pre>
$ vim Gemfile
</pre>
<br />
Gemfile<br />
<pre>
# A sample Gemfile
source "https://rubygems.org"
gem "rails"
</pre>
<br />
Railsに必要なGemパッケージをインストールする。<br />
<pre>
$ bundle install --path vendor/bundle
</pre>
<br />
<br />
<h3><b>2. Railsアプリを作成する</b></h3>
<br />
bundle installが自動実行されないように「--skip-bundle」オプションを付与した上でrails newする。Gemfileを上書きしてもいいか聞かれたら、Enterを押下して上書きする。<br />
<pre>
$ bundle exec rails new . --skip-bundle
</pre>
<br />
.bundle/configファイルに「BUNDLE_PATH: vendor/bundle」の記載があることを確認した上で、必要なGemパッケージを追加する。<br />
<pre>
$ bundle install
</pre>
<br />
<br />
<h3><b>3. Railsアプリを動作させる</b></h3>
<br />
付属のWebサーバ(WEBrick)を起動する。<br />
<pre>
$ bundle exec rails server
</pre>
<br />
http://localhost:3000/にアクセスしてRailsアプリが表示されることを確認する。
<br />
<br />sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-35787838195739332152014-02-16T18:00:00.000+09:002014-05-19T22:36:07.230+09:00Bundlerをインストールする使用中のRuby及びgemのバージョンを確認する。
<pre>
$ rbenv version
2.0.0-p353 (set by /Users/hogeuser/.rbenv/version)
$ gem -v
2.0.14
</pre>
<br />
使用中のRubyにインストールされているGemを確認する。
<pre>
$ gem list
*** LOCAL GEMS ***
bigdecimal (1.2.0)
io-console (0.4.2)
json (1.7.7)
minitest (4.3.2)
psych (2.0.0)
rake (0.9.6)
rdoc (4.0.0)
test-unit (2.0.0.0)
</pre>
<br />
<br />
gemコマンドによるパッケージインストール及びアップグレード時に、ドキュメント生成しないようにする。
<pre>
$ vim ~/.gemrc
</pre>
<br />
~/.gemrc
<pre>
install: --no-ri --no-rdoc
update: --no-ri --no-rdoc
</pre>
<br />
上記.gemrcファイルについては下記表記も可能。<br />
~/.gemrc
<pre>
gem: --no-ri --no-rdoc
</pre>
<br />
<br />
<a href="http://bundler.io" target="_blank">Bundler</a>をインストールする。
<pre>
$ gem install bundler
$ rbenv rehash
</pre>
<br />
Bundlerがインストールされたことを確認する。
<pre>
$ gem list
*** LOCAL GEMS ***
bigdecimal (1.2.0)
bundler (1.5.3)
io-console (0.4.2)
json (1.7.7)
minitest (4.3.2)
psych (2.0.0)
rake (0.9.6)
rdoc (4.0.0)
test-unit (2.0.0.0)
</pre>
<br />
インストールされたBundlerの場所を確認する。
<pre>
$ gem which bundler
/Users/hogeuser/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/bundler-1.5.3/lib/bundler.rb
</pre>
<br />sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-52809192810929579872014-02-15T22:00:00.000+09:002016-02-06T23:21:21.063+09:00Rubyバージョン管理ツールを導入するOS Xで利用可能なRubyバージョン管理ツールは他にもあるが、ここでは個人的に最も使い勝手の良いと思われる<a href="https://github.com/sstephenson/rbenv" target="_blank">rbenv</a>の導入方法について説明する。<br />
<br />
rbenvをインストールする。
<pre>
$ brew install rbenv
$ rbenv -v
rbenv 0.4.0
</pre>
<br />
ruby-buildをインストールする(PATH設定については、通常Homebrewを使ってインストールする場合は不要であるため、必要に応じて設定する)。
<pre>
$ brew install ruby-build
$ echo 'export RBENV_ROOT="$HOME/.rbenv"' >> ~/.bashrc
$ echo 'export PATH="$RBENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
</pre>
<br />
readlineとopensslをインストールする(opensslについては、通常ruby-buildパッケージインストール時に一緒にインストールされるため、必要に応じてインストールする)。
<pre>
$ brew install readline
$ brew install openssl
</pre>
<br />
インストール可能なRubyのバージョンを確認する。
<pre>
$ rbenv install -l
</pre>
<br />
1.9.3-p484をインストールする。
<pre>
$ CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl` --with-gcc=clang" rbenv install 1.9.3-p484
$ rbenv rehash
</pre>
<br />
2.0.0-p353をインストールする。
<pre>
$ CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl` --with-gcc=clang" rbenv install 2.0.0-p353
$ rbenv rehash
</pre>
<br />
インストールされているRubyのバージョンを確認する。
<pre>
$ rbenv versions
* system (set by /Users/hogeuser/.rbenv/version)
1.9.3-p484
2.0.0-p353
</pre>
<br />
使用するRubyのバージョンを切り替える。
<pre>
$ rbenv global 2.0.0-p353
$ rbenv versions
system
1.9.3-p484
* 2.0.0-p353 (set by /Users/hogeuser/.rbenv/version)
</pre>
<br />
使用中のRubyのバージョンを確認する。
<pre>
$ rbenv version
2.0.0-p353 (set by /Users/hogeuser/.rbenv/version)
$ ruby -v
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-darwin13.0.2]
</pre>
<br />sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0tag:blogger.com,1999:blog-850878323900734851.post-21217971279848008252014-01-25T23:00:00.000+09:002015-05-24T18:31:06.385+09:00iBeaconを受信するuuidgenコマンドを使って、proximity IDとして使用するUUIDを事前準備しておく。<br />
<br />
<pre>
$ uuidgen
</pre>
<br />
<br />
iBeacon受信処理を行うクラスにおいて、CoreLocationをインポートした上でCLLocationManagerDelegateプロトコルを実装(適合)する。各メソッドの意味等については下記コード内のコメントを要参照。<br />
<pre class="brush: objc;" title="BLGViewController.m(関連箇所のみ抜粋)">
@implementation BLGViewController
- (void)viewDidLoad
{
[super viewDidLoad];
if ([CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]) {
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
// identifierについては、アプリ内でどのリージョンであるかを判別するために使用
NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:BLGViewControllerProximityUUID];
self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:kIdentifier];
// いずれもデフォルト設定値
self.beaconRegion.notifyOnEntry = YES;
self.beaconRegion.notifyOnExit = YES;
self.beaconRegion.notifyEntryStateOnDisplay = NO;
// 領域観測を開始する
[self.locationManager startMonitoringForRegion:self.beaconRegion];
}
}
#pragma mark - CLLocationManagerDelegate
// 領域観測が正常に開始されると呼ばれる
- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region
{
// 非同期に実行し、CLLocationManagerDelegateに結果を配送する
// (locationManager:didDetermineState:forRegion:メソッド要実装)
[self.locationManager requestStateForRegion:self.beaconRegion];
}
// 領域に関する状態を取得する
- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
switch (state) {
case CLRegionStateInside:
NSLog(@"state is CLRegionStateInside");
self.stateLabel.text = @"CLRegionStateInside";
// 領域内にいるので、測距を開始する
if ([region isMemberOfClass:[CLBeaconRegion class]] && [CLLocationManager isRangingAvailable]) {
[self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}
break;
case CLRegionStateOutside:
NSLog(@"state is CLRegionStateOutside");
self.stateLabel.text = @"CLRegionStateOutside";
break;
case CLRegionStateUnknown:
NSLog(@"state is CLRegionStateUnknown");
self.stateLabel.text = @"CLRegionStateUnknown";
break;
default:
NSLog(@"state is UNKNOWN");
self.stateLabel.text = @"UNKNOWN";
break;
}
}
// 領域に入ると呼ばれる
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
// 領域に入ったので、測距を開始する
if ([region isMemberOfClass:[CLBeaconRegion class]] && [CLLocationManager isRangingAvailable]) {
[self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}
}
// 領域から出ると呼ばれる
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
if ([region isMemberOfClass:[CLBeaconRegion class]] && [CLLocationManager isRangingAvailable]) {
[self.locationManager stopRangingBeaconsInRegion:self.beaconRegion];
}
}
// 領域内でビーコンを受信する度に呼ばれる(実機で確認する限りでは約1秒毎)
// ビーコンの状態が変わった時も呼ばれる
- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region
{
if ([beacons count] > 0) {
// 最も近くにあるビーコンが配列の先頭にあるように、デバイスからの距離によって整列されている
CLBeacon *nearestBeacon = beacons.firstObject;
NSString *proximityStr;
switch (nearestBeacon.proximity) {
case CLProximityImmediate:
proximityStr = @"CLProximityImmediate";
break;
case CLProximityNear:
proximityStr = @"CLProximityNear";
break;
case CLProximityFar:
proximityStr = @"CLProximityFar";
break;
case CLProximityUnknown:
proximityStr = @"CLProximityUnknown";
break;
default:
proximityStr = @"UNKNOWN";
break;
}
// ビーコン識別情報
self.uuidLabel.text = nearestBeacon.proximityUUID.UUIDString;
self.majorLabel.text = [NSString stringWithFormat:@"%@", nearestBeacon.major];
self.minorLabel.text = [NSString stringWithFormat:@"%@", nearestBeacon.minor];
// アドバタイズしているビーコンまでの距離に関する情報
self.proximityLabel.text = proximityStr;
self.rssiLabel.text = [NSString stringWithFormat:@"%ld [dB]", (long)nearestBeacon.rssi];
self.accuracyLabel.text = [NSString stringWithFormat:@"%.0f [m]", nearestBeacon.accuracy];
}
}
// アプリのロケーションサービスに関するアクセス許可状態に変更があると呼ばれる
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
NSLog(@"%s", __func__);
switch (status) {
case kCLAuthorizationStatusAuthorized:
NSLog(@"kCLAuthorizationStatusAuthorized");
break;
case kCLAuthorizationStatusRestricted:
NSLog(@"kCLAuthorizationStatusRestricted");
break;
case kCLAuthorizationStatusDenied:
NSLog(@"kCLAuthorizationStatusDenied");
break;
case kCLAuthorizationStatusNotDetermined:
NSLog(@"CLAuthorizationStatusNotDetermined");
break;
default:
NSLog(@"UNKNOWN");
break;
}
}
@end
</pre>
<br />
[参考URL]<br />
<a href="http://dev.classmethod.jp/references/ios7-ibeacon-api/" target="_blank">[iOS 7] 新たな領域観測サービス iBeacon を使ってみる</a><br />
<a href="http://reinforce-lab.github.io/blog/2013/10/21/ibeacon/" target="_blank">iBeaconの解説</a><br />sushichophttp://www.blogger.com/profile/03060531103266626869noreply@blogger.com0