リバースアダプタと標準ズームで超マクロの世界

6月に EOS M シリーズ用のマクロレンズ EF-M28mm F3.5 マクロ IS STM が発売される。小型で130gと軽量ながら、レンズ単体でマクロモードに切り替えれば1.2倍までの高倍率撮影ができる優れもの。

ちなみに EOS M3 は以前購入を検討したものの、詳しく調べてみると電子シャッターがない。楽器演奏中の撮影を想定していたため購入を見送った。というわけで魅力的なレンズながらカメラ本体がない。

しかしながら、ほとんどのマクロレンズにはだかる「等倍」の壁を破り1.2倍の倍率を実現したことは賞賛したく、また等倍より先の世界を見たくもある。

リバースアダプタ

そこで使ったのが、リバースアダプタと呼ばれる、フィルタ枠を利用してレンズを逆向きに取り付けるための器具。専門的にはレトロフォーカスというタイプのレンズを反転させることで高倍率撮影が行えることが知られているが、それを簡単にカメラに装着することができるようにしたものだ。

リバースアダプタはケンコーのもの。レンズは初めて買った EOS Digital のキットとして付いてきた EF-S18-55mm F3.5-5.6 USM を使用した。なかなか良いらしい。

左がリバースアダプタ、右が装着するレンズ
リバースアダプタを装着したところ
試しに広角端の 18mm にズームリングを回し、定規を撮影して倍率を求めてみた。3.3倍。

参考にしたページでは4.6倍とあったので、もしかしてと思い、フォーカスリングを回してレンズの全長が最も長くなるように設定した。すると、このページとほぼ同じ4.5倍で撮影することができた。

また、中間リング(キヤノンではエクステンションチューブという長ったらしい名前で呼ぶ)を 12mm, 25mm と接続することで、6.8倍までの高倍率撮影をすることができた。

フックシーというエアプランツの葉

絞り込む

露出はマニュアルまたは絞り優先モードで行うのだが、何枚か撮影すると被写界深度が浅すぎて扱いづらいことに気付いた。しかし電子接点がないと絞れないこのレンズでは絞ることができない……と思いきや、絞りを固定する方法があるそうな。

  1. レンズを普通に装着する
  2. 任意の絞りを設定し、絞り込みボタンを押す
  3. 絞り込みボタンを押したままレンズを外す(カメラの電源は入れたまま!)

この方法で絞り込むことができた。実絞りなのでファインダー像が暗くなるのが扱いにくいので、そのうち電子接点に配線してカメラ側から絞れるようにしたい。

ミモザの花:つぼみ
ミモザの花:開花
ミモザの花:全開
ミモザの葉

ライティングについて

ちなみに高倍率撮影では光量が極端に不足するので、ストロボを使って撮影している。ストロボはびっくりするほど近づける。

すべてテーブルに肘や手をつきながらの手持ちだが、400mm のレンズをつけた場合ほどブレは激しくない。ISO 100, 1/100 秒でシャッターを切れる。

対象がとってもちっこいので試行錯誤も偶然の産物も楽しい。ゴミ袋なんかをディフューザーとして使っている。

Google Analytics API を PHP から使う

はじめに

この記事は、次の記事を現在(2016年4月)の Google Analytics およびその API の実情に合わせて書き直したものである。

人気記事ランキングを作成する処理等、ユーザが操作を介することのないバックエンドのプログラムが Google Analytics API にアクセスする方法について説明している。

1. API を利用可能にする

前準備として、Google Developer Console にアクセスして API を有効にする必要がある。

Google Developer Console を開き、プロジェクトを選択するか、無ければ作成する。

API の検索ボックスから「Analytics API」を検索し、名前をクリックすると API の詳細が表示されるので、その画面から有効にする。

2. API アカウントを作成し、キーを取得する

プロジェクトを作成・選択したら、「認証情報」をクリックして API にアクセスするための「サービス アカウント」を作成する。

認証情報が作成されていない場合は次のような画面になるので、「認証情報を作成」→「サービス アカウント キー」を選択する。

サービス アカウント キーの作成という画面になるので、「Service account name」にサービス名を入力する。サービス名を入力すると「サービス アカウント ID」は自動入力されるので、変更が必要なければそのままでよい。そして「キーのタイプ」は必ず「P12」を選択するGoogle APIs Client Library for PHP が P12 形式にしか対応していないためだ。

サービス アカウントを作成すると、自動的にキーのダウンロードが始まる。この *.p12 ファイルを保存しておく。
次にサービス アカウント ID を確認する。サービス アカウント ID はメールアドレス形式の ID で、「サービス アカウントの管理」から確認できる。

3. Analytics へのアクセス権限を API アカウントに付与する

前項で作成したサービス アカウントが Analytics のデータにアクセスできるよう、権限を付与する必要がある。

Google Analytics にアクセスし「アナリティクス設定」を開く。

アクセスを許可したいアカウントを選択し、「ユーザー管理」を開く。そこに「権限を付与するユーザー」という項目があるので前項で作成した「サービス アカウント ID」を入力する。

権限は「表示と分析」のままでよい。ここで「追加」を行うと、API から Analytics のデータを取得することができるようになる。

4. Google APIs Client Library for PHP を設定する

PHP から API を利用するために、Google APIs Client Library for PHP をインストールする。

PHP のパッケージマネージャ Composer を使用する場合は、ライブラリを灰位置するディレクトリに次の内容の composer.json を作成し、composer install コマンドを実行する。

{
    "require": {
        "google/apiclient": "1.1"
    }
}

5. API を使い Analytics データを取得する

準備が整ったら API からデータを取得してみよう。次のコードは過去 30 日分を対象に、サイト内(ビュー)でよくアクセスされているページのタイトル、URL、セッション数を取得するものである。

その他、取得できる主なデータは次項で説明している。

<?php
require_once 'my_google_analytics.php';

$ga = MyGoogleAnalytics::get();
$result = $ga->data_ga->get(
	'ga:XXXXX', // XXXXX の部分は Analytics のビュー ID
	'30daysAgo', // 開始日 ("2016-04-04" という指定もできる)
	'today', // 終了日
	'ga:sessions', // 主要指標 (metrics)
	[
		'dimensions' => 'ga:pageTitle,ga:pagePath', // 副指標
		'sort' => '-ga:sessions', // - を付けると降順ソート
		'max-results' => 10, // 取得件数
	]);

// 2次元配列として取得できるのでこれを加工する
print_r($result->getRows());

ここで読み込んでいる my_google_analytics.php の内容は次の通り。サービス アカウント ID と秘密鍵 (P12) ファイルを指定するだけですぐに使えるようになる。

<?php
// Composer により作成された verndor/autoload.php を読み込む
require_once 'path/to/vendor/autoload.php';

class MyGoogleAnalytics {

	// サービス アカウント ID
	const SERVICE_ACCOUNT_ID = 'XXXXXXXXXXXXXXXX@XXXXXXXXXXX.iam.gserviceaccount.com';

	// 秘密鍵のファイル名
	const KEY_FILE = 'path/to/XXXXXXXX.p12';
	
	private static $client;
	private static $service;

	public static function get() {
		if (!isset(self::$client)) {
			self::createClient();
		}
		if (!isset(self::$service)) {
			self::createService();
		}
		return self::$service;
	}

	private static function createClient() {
		$client = new Google_Client();

		// もしサーバの /var/tmp に書き込めないなどの事情がある場合は
		// ここでキャッシュファイルを生成するディレクトリを指定する
		//$client->setClassConfig('Google_Cache_File', ['directory' => __DIR__ . '/tmp']);

		// アプリ名。どこで使うのかは不明
		$client->setApplicationName('My Access Analysis');

		$cred = new Google_Auth_AssertionCredentials(
			self::SERVICE_ACCOUNT_ID,
			[Google_Service_Analytics::ANALYTICS_READONLY],
			file_get_contents(self::KEY_FILE)
		);
		$client->setAssertionCredentials($cred);
		if ($client->getAuth()->isAccessTokenExpired()) {
			$client->getAuth()->refreshTokenWithAssertion($cred);
		}
		
		self::$client = $client;
	}

	private static function createService() {
		self::$service = new Google_Service_Analytics(self::$client);
	}
}

6. 取得できるデータの種類

指標 metrics および dimension で指定できる項目はこのページで参照できる。

主な指標を挙げておく。

  • Metrics
    • ga:sessions セッション数
    • ga:users ユーザ数
    • ga:pageviews ページビュー
  • Dimensions
    • ga:userType 新規訪問/リピート訪問 (例: New Visitor, Returning Visitor)
    • ga:medium 参照元の種類 (例: organic, referral, (none))
    • ga:source 参照元 (例: google, yahoo, (direct), example.com)

LaTeX で Noto Sans/Serif を埋め込むための dvipdfmx の設定

2017年9月4日追記:源ノ明朝の TrueType 版「源様明朝」が公開されていたのでその記述を追加しました

f:id:scientre:20170904104252p:plain
LaTeX で文書を作る際、PDF にフォントの埋め込みを求められることがある。その際によく使われるのがオープンソースライセンスをもつ IPAexフォント だが、IPAex ゴシックは本文でも使えるような細身の書体なので、見出しや強調に使うといまいちコントラストが低い。

そこで同じくオープンソースライセンスながら 7 種類のウェイトを持つ Noto Sans CJK を使う。ただし Noto Sans は OpenType 形式で提供されているため、一般的な pTeX パッケージでは扱えない。

かわりに、TrueType 形式に変換した 源真ゴシック (げんしんゴシック) を用いる。源真ゴシックは Microsoft Office などでも使い勝手のいいフォントだ。

また、2017年4月に公開された Noto Serif CJK (和文部分の名称は源ノ明朝)の
TrueType 版が ButTaiwan 氏により源樣明體として公開されている。源樣明體に角立て処理を行った源流明體と、モリサワのA1明朝のようににじみ処理を行った源雲明體も同時に公開されている。

設定方法

  • 源真ゴシックをダウンロード、展開する
  • 源樣明體またはお好みで源流明體をダウンロード、展開する
  • texmf-local/fonts/truetype/ に GenShinGothic-Medium.ttf、GenRyuMinJP-Regular をコピーする
  • texmf-local/dvipdfmx/config/dvipdfmx.cfg を次の内容で作成する
f genshin.map
  • texmf-local/fonts/map/dvipdfmx/genshin.map を次の内容で作成する(源流明體の場合は GenYoMin の部分を GenRyuMin に置き換える)
rml  H GenYoMinJP-Regular.ttf
gbm  H GenShinGothic-Medium.ttf
rmlv V GenYoMinJP-Regular.ttf
gbmv V GenShinGothic-Medium.ttf
  • mktexlsr を使っている場合は mktexlsr を行う

なお txfonts や newtx など Times 系のフォントを使う場合、太さを合わせるために Medium の代わりに Bold のウェイトを用いる。

使用方法

特別な操作は不要。次のように LaTeX で文書を作成し (suzume.tex とする)

\documentclass[a5paper,12pt]{jsarticle}
\usepackage{newtxtext,newtxmath}
\begin{document}

すずめsuzume\textbf{かわいいkawaii}

\end{document}

普段通りにコンパイルすればよい。

platex suzume
dvipdfmx suzume

文書ごとに設定を変える

もし文書ごとに埋め込む和文フォントを変えたい場合は dvipdfmx.cfg を作成 (あるいは書き換え) せずに、dvipdfmx コマンドのオプションでフォントマップを指定する。

dvipdfmx -f genshin.map suzume

PDF を SVG に変換する pdf2svg をで使う (Linux/Windows)

PDF を SVG に変換するプログラム pdf2svg は、OS X では Homebrew、一部の Linux では yum や apt-get を使ってインストールできる。
しかしながら yum パッケージが用意されていない Scientific Linux 6 や、Windows では多少複雑だ。

Scientific Linux 6 へのインストール

事前準備。Cairo と Poppler の開発用パッケージを yum で入れておく。Poppler は GLib 版が必要なようだ。(試した環境ではパッケージ cairo および poppler が標準でインストールされていた。もし動かなければこれらもインストールする)

yum install cairo-devel
yum install poppler-glib-devel

実行ファイルをビルド、インストールする。--prefix=/opt/local は環境に応じて書き換える。

curl -OL https://github.com/db9052/pdf2svg/archive/v0.2.3.tar.gz
tar zxf v0.2.3.tar.gz
cd pdf2svg-0.2.3
./configure --prefix=/opt/local
make
make install

以上の手順で /opt/local/bin/pdf2svg に実行ファイルが生成される。

Windows へのインストール

Windows 用のバイナリとしては pdf2svg-windows が用意されているが、こちらは日本語をアウトライン化できないという問題がある。
少々古いが、中野拓帆さんが公開している pdf2svg バイナリ では日本語も使用できた。
まず「pdf2svg 0.2.1 for Windows (tar.bz2)」をダウンロードし、任意のディレクトリに展開する。
次に、作業ディレクトリのあるドライブのルートに target というディレクトリ (たとえば C:/target) を作成し、展開された etc/share ディレクトリを target にコピーする (C:/target/share/poppler というディレクトリ構成になる)。
最後に環境変数 FONTCONFIG_PATH を設定し、必要があれば pdf2svg.exe のあるディレクトリにパスを通す。

SET FONTCONFIG_PATH=C:\w32tex\share\texmf-dist\fonts\conf


pdf2svg の動作には libxml2.dll が必要。libxml2.dll は GnuWin32 などに含まれている。

pdf2svg の使い方

単純に入力する PDF と出力先を指定すればよい。

pdf2svg input.pdf output.svg

PDF のページ番号を指定することもできる。(この例では 3 ページ目を変換)

pdf2svg input.pdf output.svg 3

(調査中) Windows 版 PHP の ZipArchive クラスで日本語 (CP932) のファイルを扱えない?

Windows 上で作成した、ファイル名が CP932 の Zip ファイルがどうしても文字化けしてしまう。たとえば “日本語” (93 fa 96 7b 8c ea) というファイルは常に “ô·û{îΩ” (c3 b4 c2 b7 c3 bb 7b c3 ae ce a9) という不可解な化け方をする。
試したこと:

  • set_locale() でロケールを Japanese_Japan.932 に設定する