ワテのブログ

The fundamental things apply As time goes by.

2013年12月22日日曜日

Vagrantを使ってみた

スポンサーリンク

vagrantは仮想環境をコマンド一発で構築できる便利なツールである。

仮想環境を構築するにはインストール用CDイメージの用意、仮想マシンの設定、インストール作業が必要である。面倒である。

vagrantはこの作業を軽減してくれる。

vagrantをインストールして以下のコマンドを打つだけでubuntu 12.04の32bit版が起動して仮想マシンにsshでログインできてしまう。(VirtualBoxがインストールされているのが前提)

$ mkdir vagrant
$ cd vagrant
$ vagrant init add precise32 http://files.vagrantup.com/precise32.box
$ vagrant up
$ vagrant ssh

しかもゲストOSの/vagrantフォルダがホスト側のvagrantフォルダ(上のコマンドで作成したフォルダ)が同期されるのでホスト側でコードを書きゲスト側で処理することができる。 このように非常に簡単に仮想環境を構築できる。

さらにVagrantfileを作成すれば必要とするツールをインストールした仮想環境を簡単に構築できる。

具体例を一つ

texlive2012環境の入ったUbuntu 12.04 LTSの仮想環境を構築する。 まず適当にフォルダを作成しそこにVagrantfileを作成する。

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "precise32"
  config.vm.box_url = "http://files.vagrantup.com/precise32.box"
  config.vm.provider "virtualbox" do |vb, override|
    override.vm.provision :shell, :inline => "apt-get update && apt-get -y install python-software-properties && add-apt-repository ppa:texlive-backports && apt-get update && apt-get -y install texlive-lang-cjk"
  end
end

そして、おもむろに

$ vagrant up

と打ち込む。

まず、config.vm.box_urlで指定されたURLからboxのダウンロードがはじまる。 ダウンロード完了後、仮想マシンが実行され、override.vm.provisionで指定したコマンドが実行される。 このコマンドはパッケージをアップデートしtexliveのbackportsを設定に必要なadd-apt-repositoryコマンドを含むパッケージをインストール。その後、texliveのbackportsを設定しアップデート。texlive-lang-cjkをインストールする。

その後

$ vagrant ssh

で仮想マシンに接続してplatexコマンドを実行すると

vagrant@precise32:~$ platex
This is e-pTeX, Version 3.1415926-p3.3-110825-2.4 (utf8.euc) (TeX Live 2012/Debian)
 restricted \write18 enabled.
**

という具合にplatexが見事に実行される。

まとめ

Vagrantfileを用意すればコマンド一つで好みの仮想環境を超簡単に構築できてみんな超ハッピー

以上

スポンサーリンク

2013年12月19日木曜日

[続報]dvipdfmxでepsの画像がずれる件について

スポンサーリンク

以前、dvipdfmxでeps画像がずれる件についてBoundingBoxを修正するように書いたがどうやらもっと簡単に解決できるようだ。 グラフィックスのパッケージを読み込む時にdvipdfmxをオプションに指定すればよいようである。

\usepackage[dvipdfmx]{graphicx}

追記(2014/01/26)

こちらでより詳細な検証がなされています。→ dvipdfmx での EPS 画像挿入が最近アレな話 - マクロツイーター

検証

testデータを作成して検証してみた。

方法

簡単なepsファイルを作成しバウンディングボックスを指定。TeXからインクルードする。 グラフィックパッケージのオプションにdvipdfmxを指定した時としなかった時に生成されたpdfを比較する。

結果

[dvipdfmx]がある時

[dvipdfmx]が無い時

なるほどですね!

テスト用のファイル

test.eps

\documentclass{jarticle}
\usepackage[dvipdfmx]{graphicx}
%%\usepackage{graphicx}
\begin{document}
This is test.

\includegraphics{test.eps}

This is test.
\end{document}

test.eps

%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 100 100 200 200
newpath
100 100 moveto
200 100 lineto
200 200 lineto
100 200 lineto
100 100 lineto
stroke

newpath
0 0 moveto
300 300 lineto
300 0 moveto
0 300 lineto
stroke

使用したdvipdfmxのVersion=dvipdfmx-20130405

スポンサーリンク

2013年12月14日土曜日

IFTTTの位置情報トリガー

スポンサーリンク

概要

IFTTTに位置情報トリガーが 追加された 。 これで

  • 指定した領域に入ったときにアクションを実行する
  • 指定した領域から出たときにアクションを実行する
  • 指定した領域から出たり入ったりしたときにアクションを実行する
ことができるらしい。

レシピの作成

レシピの追加をタップしトリガーの追加をタップする

トリガーの中からiOS Locationを選択。You enter an areaを選択。指定した領域に入ったときにアクションが実行される。

地図が表示される。指定したい領域に移動する。円形の領域が範囲となる。+/-ボタンで領域の大きさを調整する

領域を確定したらContinueボタンをタップする

次にアクションを選択する。ここではGmailを選択する。

メールの宛先を指定して、Continueをタップ

Finishをタップするとレシピについかされる

これで指定した領域に入ったときにGmailが指定した宛先に送信される。

感想

ちょっと近所でためしてみたが、メールも通知もこなかった。 どうやらトリガーが発火していないようだ。 おそらく位置情報の取得に携帯基地局の位置情報をつかっているぽい。 それなりの距離を移動をしなければ情報が更新されずトリガーが不発になる感じである。

スポンサーリンク

Raspberry Piで無線LANを使う

スポンサーリンク

概要

Raspberry Piには有線LANが搭載されていないがUSBに無線LAN子機を挿すことによって無線に対応させることができる。 LANケーブルが不要になり設置場所が自由になる。

USB無線子機にはBuffaloのWLI-UC-GNMを用いた。 リーズナブルな割りに高性能かつコンパクトでお買い得感があふれている。 そして、青色LEDが未来的である。

設定

WLI-UC-GNMをUSBに挿入。 ifconfigコマンドでwlan0が存在することを確認する。

/etc/network/interfacesを以下のように書き換える。 IPアドレスはDHCPで割り振る。

auto lo

iface lo inet loopback
iface eth0 inet dhcp

auto wlan0
allow-hotplug wlan0
#iface wlan0 inet manual #コメントアウト
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf #コメントアウト
iface wlan0 inet dhcp #追加
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf #追加
iface default inet dhcp

無線LANの認証設定を行なう。 設定はwpa_passphraseコマンドを使用し、/etc/wpa_supplicant/wpa_supplicant.confに追記する。

$ sudo wpa_passphrase <SSID> <PASSPHRASE> >> /etc/wpa_supplicant/wpa_supplicant.conf

うちでは認証にWPA2 パーソナル(WPA2-PSK)を使っている。 /etc/wpa_supplicant/wpa_supplicant.conf を以下のように書き換える。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
 proto=RSN
 key_mgmt=WPA-PSK
 pairwise=CCMP
 group=CCMP
 priority=2
 ssid="****"
 psk=**************************************************************************
}

その後、 sudo reboot で再起動。 設定に問題がなければ ifconfigでwlan0にIPアドレスが割り振らていることが確認できるはずである。

スポンサーリンク

2013年12月12日木曜日

Windows PowerShellでファイルのバージョンを確認する

スポンサーリンク

PowerShellを用いてファイルのバージョンを確認する。バージョン番号に基づいたファイル名など自動生成するときに便利。 Win32 APIを使って取得できるが面倒である。PowerShellなら一行ですぱっと書けるのがすばらしい。

powershell -Command "(dir <Path>).VersionInfo.FileVersion"

シェルスクリプトにするのなら以下のような感じ。

#!/bin/sh
powershell -Command "(dir $1).VersionFile.Version"

関連項目

Powershellでファイルのハッシュ値を算出する

スポンサーリンク

2013年12月11日水曜日

WIndows PowerShellでクリップボードの内容を標準出力に書き出す方法

スポンサーリンク

クリップボードにコピーした文字列をささっとgrepでフィルタしたいことがある。 Windowsにはクリップボードを標準出力に書き出すコマンドがない。 そこでPowerShellを使って作った。

# pclip
powershell -Command "add-type -an system.windows.forms;[System.Windows.Forms.Clipboard]::GetText()"

こんな感じで利用する。

$ pclip | grep hoge
スポンサーリンク

2013年7月26日金曜日

dvipdfmxでepsの画像がずれる件について

スポンサーリンク

こちらを御覧ください[続報]dvipdfmxでepsの画像がずれる件について

概要

ここしばらくTeXを利用してなかったのでいつこうなったのかわからないが、dviファイルをdvipdfmxでPDFを作成するとeps画像がずれることがある。

原因

すべてのeps画像がずれるわけではない。どうやらBounding Boxの左下座標が0, 0でないものがずれるようである。

解決策

epstopdfとpdftopsを使ってepsを一度pdfに変換しその後epsに変換しなおせばBounding Boxが0, 0になる。

#!/bin/bash
fname=$1
epstopdf $1
pdftops -eps ${fname%.eps}.pdf $1

epstopdfでエラーが発生した場合、下記が参考になるかもしれません

単純に考えてBounding Boxの左下座標を0, 0にしてやればよい。epsはテキスト形式のフォーマットで%%BoundingBox: 行を変更してしまえばよいわけだが、描画内容のほうは動かないので平行移動が必要となるがこれは面倒である。

ImageMagickでepsをいったん別のフォーマットに変換してepsにもどしてあげるとBoundingBoxの左下座標は0,0となる。しかし、せっかくのベクター画像がラスター画像になってしまうという悲しさ。

そこで、epstopdfの登場なのです。epstopdfをつかうとepsのBoundingBoxにしたがって余白のないpdfを作成してくれる。しかもベクター画像をたもったままに。変換されたpdfをepsに変換してやれば余白がないわけだからBoundingBoxの左下座標が0,0のepsが作成されるという寸法。

しかし、ここに障壁が。TeXはTeX Installerでインストール。しかし、Windows 7 64bit版でepstopdfを起動すると"Script interpreter is not found in PATH"という残念なエラーが発生する。

ところがすばらしいことにTeX Installer 0.84r6よりWin64版のバイナリも提供されるようになりWin64版のepstopdfを利用すると起動するようになった。いきやうやうとepsをepstopdfに食わせてみたところ、なんということでしょう、!!! Error: Writing to gs failed, signal 127というエラーでとまってしまうじゃありませんか。

このエラーメッセージでググるとこのサイトが出てきた。すばらしいことに修正したスクリプトを公開してらっしゃるのでダウンロードしてためしてみるとこれが見事に動作した。これでOKですよ。epstopdfでepsをpdfに変換後、pdfをepsに変換すればよい。これはpdftopsを使えばよい。

長いみちのりでありました。

スポンサーリンク

2013年7月16日火曜日

IFTTTを使ってみた

スポンサーリンク

IFTTTのiPhoneアプリがリリースされたので使用してみた。

IFTTTとは

  • IFTTT(https://ifttt.com/)とは複数のWebサービス(チャンネル)を連携させるメタサービスである。
  • IFTTTはIf This Then Thatの略である
  • 日本語にすると、「もしこれがあれしたらそれをせよ」となる。

トリガーとアクション

  • トリガー(This)とアクション(That)を登録する。
  • トリガーが発生するとアクションが実行される。
  • トリガーには普通のトリガーとクイックトリガーがある。
  • クイックトリガーはトリガー発生してすぐアクションが実行される。普通のトリガーは15分間隔で確認される。

具体例

  • iOSのリマインダに登録したタスクが完了したときにメールを送信する
  • iPhoneのカメラで写真を撮った写真をDropboxに保存する
  • etc...

使ってみた

  • IFTTTアプリでリマインダが完了されたら自分にメール(If reminder completed, then send me an email at...)をするレシピを作成する
  • IFTTTアプリをバックグラウンドで実行するように設定
  • iOSのリマインダに位置情報リマインダを登録する
  • 指定位置にてリマインダの通知が発生
  • 通知だけではトリガーとならず
  • 手動でリマインダを完了
  • 5分後ぐらいにIFTTTからActionのメールが到着
  • 個人的にはリマインダの通知の時点でアクションが発生して欲しい(調べた限り通知の時点のトリガーは無いようである)

感想

  • 色々なサービスを組み合わせられるのは面白いがトリガーがちと少ない気がする
  • トリガーやアクションを時前で定義できるようになるともっと楽しくなりそう
スポンサーリンク

2013年3月8日金曜日

はてなブックマークがみにくいのでスマートフォン用の表示を使うことにした

スポンサーリンク
はてなブックマークのデザインが一新された。 画像が大きく表示され見栄えよくおしゃれな感じになったのは歓迎ですが視線の移動が多く流し読みしにくい。

なので色々試行錯誤した結果、PCでもスマートフォン用の表示でみるのがベストだと気づいた。
この画面なら視線を固定して縦スクロールして行くだけで流しよみができて快適である。



スポンサーリンク

2013年3月3日日曜日

[iOS]SKPSMTPMessageでバックグラウンドでメールを送信する際の注意

スポンサーリンク
SKPSMTPMessage を使ってバックグラウンドでメールを送信するときの処理方法。

SKPSMTPMessageでは送信処理にタイマーが利用されているのでRun Loopを回さなければならない。 sendをSKPSMTPMessageのインスタンスに送信した直後にRun Loopを回す処理を入れる。

sendMailはバックグラウンドタスクから呼び出す

追記:

ARCを使っている場合はselfが循環参照になるのでリークします。__weakなどを利用して循環参照をさけてください。

スポンサーリンク

2013年2月23日土曜日

[iOS]テーブルビューのセルにUISwitchを設定する方法

スポンサーリンク

UITableViewのUITableViewCellにUISwitchを設定する方法

UITableViewDelegateのtableView:cellForRowAtIndexPath:メソッドでUISwitchを作成しcellのアクセサリビューに設定する。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
     
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
    }
     
    if (indexPath.section == 0)
    {
        if (indexPath.row == 0)
        {
            cell.textLabel.text = @"Title";
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
            UISwitch* sw = [[UISwitch alloc] initWithFrame:CGRectZero];
            cell.accesoryView = sw;
        }
    }    
    return cell;
}

Switchのアクションを捕捉したい場合は

[sw addTarget:self action:@selector(changeSwitch:) forControlEvents:UIControlEventValueChanged];
- (void)cahngeSwitch:(UISwitch)sender
{
    NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell*)[sender superview]];
}
  • UISwitchのsuperviewからUISwitchを設定したUITableViewCellを取得
  • UITableViewのindexPathForCellメソッドでそのcellのindexPathを取得
  • どのcellのUISwitchが操作されたか特定できる
スポンサーリンク