git diff で無視したい行があるとき

比較時に特定の文字列を含む行を無視したい

最近 Cisco 機器の設定を git で管理しているのですが、diff を取ると設定をいじっていなくても ntp clock-period の行が表示されてしまいます。 この値は機器が動いている間に自動調整されるものなので変わっていても問題ありません。


-ntp clock-period 36027555
+ntp clock-period 36027579

何とか無視できないかと調べたところ git-diff には -G オプションというものがあり、正規表現にマッチしたものだけ表示することができるのがわかりました。 しかし、今回は特定の文字列を含む行を除外したいので文字列の否定ルールを表現しなければなりません。 一般的にこのような場合は「否定の先読み」と呼ばれるパターンを使います。 今回のケースだと以下のようになります。


^(?!ntp clock-period)

しかし残念なことに git-diff は先読み表現に対応していないようで、エラーとなってしまいました。 なので、強引にルールを書いてみます。 以下のようにオプションをつけて git diff を実行すると ntp clock-period の行は消えます。


-G "^([^n]|n[^t]|nt[^p]|ntp[^ ]|ntp [^c])"

ちょっと不格好ですが、これで何とかなります。 ntp 関連で c から始まるコマンドは ntp clock-period のみなので、「ntp c」までを除外すれば十分です。

diff を外部ツールとして登録してみる

ところで通常の diff には -I オプションというのがありこちらはマッチしたものを無視するのですんなり書けます。

-I "^ntp clock-period"

なのでこのオプション付きで diff を外部ツールとして登録し git difftool コマンドから呼び出すという手もあります。


[diff]
        tool = diffcisco
[difftool "diffcisco"]
        cmd = \"diff\" -u -I \"^ntp clock-period\" \"$LOCAL\" \"$REMOTE\"

上のように config ファイルに書いて git difftool を実行するのです。 プロンプトがわずらわしいので -y をつけて抑止すると良いです。


$ git difftool -y

ただし、-I オプションは差分となる固まりの全てが正規表現にマッチしている時に出力が抑止されるという動作なので、前後に変更があれば ntp clock-period の行も出力されることになります。 例えば ntp master コマンドが追加された時は ntp clock-period も出力されることになるでしょう。

git gui で動作させる

Windows 環境で GUI 操作をすることの多い私としては git gui でこれらを実行させたいところです。 git-gui のオプション画面に「Additional Diff Parameters」(config パラメータとしては gui.diffopts) というのがあるので、ここに以下のように入れてみます。


"-G" "^([^n]|n[^t]|nt[^p]|ntp[^ ]|ntp [^c])"

クォーテーションの付け方は試行錯誤の結果なのですが、config ファイルには以下の様に「\"」と記録されます。


[gui]
        diffopts = \"-G\" \"^([^n]|n[^t]|nt[^p]|ntp[^ ]|ntp [^c])\"

すると確かに diff では差分無しと処理されているようですが、「コミット予定に入っていない変更」のリストからファイルを消すことはできず、内容を確認しようとしてファイル名をクリックするたびに変更が無い旨のポップアップが表示される動作となり、残念ながら使い勝手は今一つです。

git diff はそんな状況なので変更有無の確認には git difftool を使うのが良いようです。 「ツール」-「追加」で git difftool -y を呼び出せるようにしておきます。 config には以下のように出力されます。


[guitool "git-diff"]
        cmd = git difftool -y

こうしておくことで git gui 上から git difftool を実行して変更を確認することができるようになります。


2012.10.4
正規表現に誤りがあったため、記事を修正しました。

Windows 環境での git ベストプラクティス

10年以上前は CVS や Visual Source Safe を使っていたのですが、仕事の内容が変わって長いことバージョン管理システムには縁がない状態でした。 しかし、最近また仕事の内容が変わったのを機に (Subversion をスキップして!) git を導入してみました。 仕事環境は Windows がメインなので git も Windows 上に導入しましたが、使ってわかったのは Windows 環境でも全く問題なく使うことができるということです。 Web 検索すると古い情報が多くて Windows で動かすには苦労話が多いように見えますが、現状全く問題ありません。 といってもやはりノウハウが必要な部分もあるわけで、ここまでの自分の経験をまとめてみます。

クライアントは Git for Windows で決まり

ちょっと古い記事だと Cygwin と msysGit のどちらを選択するかという問題を取り上げていると思いますが、現状 msysGit で決まりだと思います。 git を使うだけのために Cygwin を導入するのは大掛かり過ぎます。 まあ、私は必要とすることがあるので Cygwin も導入してはいますが。

ところで現在の msysGit ですが、一般利用者向けパッケージは「Git for Windows」と名付けられており、「msysGit」は開発者向けパッケージの名前となっています。 ですので、git をバージョン管理に使いたいだけならば msysGit ホームページから「Git for Windows」の方をダウンロードしましょう。 現在のバージョンは Git-1.7.11-preview 版です。 古い記事で msysGit と言っているものは大抵の場合 Git for Windows を指しています。 この記事でも以降 Git for Windows という名前を使います。

GUI については TortoiseGit が良いよという記事が多いですが、今のところ私は Git for Windows パッケージに含まれている git-gui と gitk で間に合っています。 確かに一部の操作は GUI から実行できず、コマンドライン上で git を使う場面もありますが、私が日々の作業で使う主要な操作のほとんどは GUI 上で出来るので個人的には許容の範囲です。 会社によってはソフトウェアを入れるために IT 管理部門の説得に苦労するようなこともあると思いますが、そのような場合を考えるといろいろなものをあれこれ導入するより「公式の Windows 版 Git です!」といって Git for Windows だけを入れるのが苦労が少ないと思います。

Windows ファイルサーバーをそのまま利用しよう

同様にサーバーにソフトウェアを入れるのに困難が伴う会社は多いと思いますが、Git for Windows ならば問題ありません。 Windows サーバー上の共有フォルダをそのままベアリポジトリとして使えるからです。 以前書いたように Git for Windows では Windows の \\servername\folder\sub_folder\repository.git を以下の書式で参照できます。

//servername/folder/sub_folder/repository.git

サーバー上にリポジトリを置くとアクセス制御が必要となりますが、私の環境ではリポジトリ単位のアクセス制御で十分なので、共有フォルダのアクセス権設定によるアクセス制御で間に合っています。

エンコードの指定

Git for Windows 付属の GUI ツールを使っている限り、日本語の扱いも問題ないです。 最近は軟弱になって commit や diff などほとんどの操作を GUI でやっているのが幸いして日本語で困ったことはありません。 とりあえず言語関連について git-gui でやったことは「ファイル」-「編集」で 「ファイル内容のデフォールトエンコーディング」(原文ママ) を utf-8 にすることぐらいです。 (ひょっとしたらデフォルトだったかも)

また、EUC や SJIS のファイルも扱うことがあると思いますが、.gitattributes を適切に記述すれば git-gui や gitk 上できちんと日本語表示されます。 詳細は gitk の設定と合わせて記事にまとめていますので参照してみてください。

まあ、コマンドラインツールだとエディタやら less やら bash やらの日本語の扱いの話になってしまうので、どうしてもコマンドラインを使いたければ頑張ってハックしましょう。 私は GUI があるからいいや。

コマンドラインのお世話になるとき

そんな軟弱な私ですが、GUI で操作できない処理もあるのでコマンドラインを使うこともあります。 身近なところでは git fetch はできるのに git pull はできなかったりするのでコマンドラインを使います。 「fetch して修正して push して」という流れであれば git-gui の上で済ませられるのですけどね。

それとファイルの変更を取り消して、前回コミットの状態に戻す操作もそこそこ使います。 GUI だと「コミットから降ろす」+「変更を元に戻す」操作になるので。

$ git checkout HEAD paths

他にもいくつかコマンドライン上で操作するものはありますが、git-gui には外部ツールを登録することができるので頻繁に使うものは登録してしまうというのも手です。 「git pull origin master」とか登録しておいた方が便利です。 この登録機能は次の Excel 差分比較のところでも使います。

Word や Excel の管理

Word にも対応していますが、特に Excel のファイル差分確認には WinMerge がお勧めです。 この WinMerge を差分確認ツールとして使用してみましょう。 なお、ここでは C:\WinMerge の下に WinMergeU.exe が置かれているものとします。 ちなみに WinMergeU.exe は Unicode 版、WinMerge.exe は ANSI 版 (Windows 9x や ME 用) です。

コマンドラインで使用する

外部コマンドを使う場合は git diff コマンドを使用するよりも git difftool コマンドを使って比較するのがお勧めです。 git diff で使うためには簡単なシェルスクリプトを用意しなければなりませんが、git difftool であればコンフィグファイルの設定のみで行けます。 以下のようにコンフィグファイル (例えばリポジトリの .git/config) に書いておきます。

[diff]
        tool = WinMerge
[difftool "WinMerge"]
        cmd = \"/c/WinMerge/WinMergeU.exe\" -u -wl -wr \"$LOCAL\" \"$REMOTE\"

あとは git diff の代わりにコマンドラインで git difftool と打つだけです。 1点注意ですが、複数のファイルの差分を取るように git diff を呼び出したときでも WinMerge は複数起動せずシリアルに 1つずつ差分を確認していくことになります。 これは一時ファイルを作って差分を取っている仕組みのため仕方がありません。 どうしても複数ファイルの差分を平行して確認したい場合は、Git Bash を複数起動して、それぞれの bash から 1つのファイルだけ指定して git difftool を起動すればよいです。

設定についてはこちらの記事を参考にさせていただきました。 そちらにはマージ用ツールとしての設定もありますので参照してみてください。 ちなみに私が設定した WinMerge のオプションは MRU リストへの追加抑止と Read-Only のためのものです。 WinMerge のオプションの詳細については公式マニュアルを参照ください。

git-guiで使用する

git-gui で使用したいときは「ツール」の「追加」で git difftool を登録するだけです。 起動も「ツール」メニューより行います。

git-gui

gitk で使用する

「編集」「設定」で「外部diffツール」に以下のように入力します。 ちなみに「全体に追加」のチェック/アンチェックで global に設定するか local に設定するかを選ぶことができます。

c:/WinMerge/WinMergeU.exe

するとコンテキストメニューから「外部diffツール」を起動できるようになります。 先ほどの git difftool の場合と違って WinMerge へうまく動作制御のためのオプションを渡せなかったのですが、比較する 2つのファイル名は渡っているので実用上は問題ないでしょう。

gitk

以上で、一通りのツールから WinMerge を差分比較ツールとして起動できるようになりました。 これでかなり便利になると思います。

改行コードの処理

改行コード処理については、とりあえずインストール時はデフォルトの「Checkout Windows-style, commit Unix-Style line endings」(core.autocrlf = true) を選んでおけばよいでしょう。 しかし、場合によっては Linux から scp で取ってきたり、ルーターから Expect を使って取ってきたファイルを git リポジトリに突っ込むこともあると思うので、そんなときはリポジトリ単位で core.autocrlf = false に設定して、 CRLF の変換がされないようにした方が管理しやすいかも知れません。

$ git config --local core.autocrlf false

ファイル名の問題

日本語ファイル名も問題なく扱うことができます。 ただし、コマンドラインから git を使う可能性のある人は、ファイル名やフォルダ名に日本語を使う場合でも最初の何文字かは ASCII 文字でユニークに区別できる prefix をつけておいた方が良いでしょう。 そうしておけば日本語が入力できなくても bash の補完機能を使って苦労せず生きて行くことができます。

まとめ

CVS 等を使ってきた身としては、やはり「分散型」バージョン管理システムの概念を理解するのに時間を要しました。 しかし、実際に使ってみると、職業柄、出先での作業が多いので分散であるところに大いに助けられています。

ただ、課題もあって Excel のようにマージが難しいものについてはロック機構があればなあと思ってしまいます。 と言っても、そもそも MS Office 系のファイルについて共同作成をする際は章立てごとに担当を決めてファイルを分割して担当するような流れにしないと回らないような気もするので、試行錯誤しながらワークフローを決めていくことになるのでしょう。

それと「コミットを修正できるってどうよ」という感覚もありますが、その辺は頭を柔らかくして git を使って行きたいと思います。

最後に git について役に立った参考資料を挙げておきます。 この記事では git の基本的なところはすっとばして Windows での利用時に役立つ話ばかりしているので、使ったことがない人には辛い内容になっているかも知れませんが、もし興味があって「Windows 環境で動くなら手が出せるなあ」と思った人がいたらこれらを参考に是非 git を使い始めてみてください。

Pro Git
オンラインならばやはりここだと思います。
WEB+DB PRESS Vol.50
雑誌の特集記事ですが、Git について実践的にわかりやすく書かれていて読みやすいです。 今となっては総集編として購入するのが良いでしょう。
WEB+DB PRESS Vol.69
メインは GitHub の特集ですが、Git for Windows のインストールについても簡単に説明されています。

WordPress のプラグインを書こう

「Kindle で技術系洋書を読もう!」シリーズ (?) の第 2弾です。 WordPress のプラグインを書くのに最適な本を見つけました。 「Professional WordPress Plugin Development」という本です。

Amazon.com で目次が見れますが、下に各章の概要を書いておきます (章のタイトルそのままもありますが)。 ある程度経験がある方が見ればわかると思いますが、プラグイン開発で必要なものは一通り含まれています。 Kindle 版は約 2千円で、この価格で一通りの情報が得られるので PHP からしてビギナーの私としては大変助かりました。

WordPress のカスタマイズのためにコードを書こうとしたときに最初に感じたのは情報を見つけにくいことでした。 検索をしても内容が古かったり、特に日本語の情報はテーマのカスタマイズ中心でプログラミングに関しては断片的な情報が多いように感じます。 一応プラグイン開発に関しては公式情報 (日本語英語) がありますが、手を動かし始めると他にも様々な情報が欲しくなってきます。 英語圏まで広げても状況はあまり変わらないようで、序文を読むと著者も同じように感じ、それが執筆の動機となったようです。 確かにこれだけ包括的な情報を一箇所で手に入れるのは難しいと思います。

プラグイン開発をしなくても、WordPress の動く仕組みを知りたい、あるいはカスタマイズしてみたいというプログラマにはとても有用だと思います。 プログラミング関連書籍の英語は難しくないので興味があれば是非読んでみてください。

ただし、テーマのカスタマイズ (CSS やマークアップ関連) の情報はありません。 そこは和書がたくさん出ていたと思います。

1/2章
プラグインについての基本知識。 推奨コーディングスタイルや開発チェックリストも含まれる。
3章
フック (Action と Filter) について。 フック関数としてクラスのメソッド (メンバ関数) を登録する方法。
4章
メニューの追加。ウィジェットの作成。メタボックス (投稿等の画面上のボックス区画) 作成と内容の保存。
5章
I18N。コードの対応と翻訳ファイルの作り方。
6章
セキュリティ。ユーザーのパーミッションやサニタイズ、Nonces (CSRF 対策) 等。
7章
設定を保存するための各種 API → *_option()、*_settings_*()、*_transient()、*_user_meta()。 カスタムテーブルへの保存。
8章
ユーザの管理。
9章
HTTP リクエストを使って Web サービス API を利用する方法。
10章
ショートコード。
11章
投稿 (post) の拡張。 カスタム投稿タイプやカスタムタクソノミー。
12章
JavaScript (jQuery) と Ajax。 フックを使ったサーバーサイド処理。

13章
Cron を使ったプログラムのスケジュール実行。
14章
URL の Rewrite。
15章
マルチサイト。
16章
デバッグと最適化。
17章
ライセンスの選択。 公式リポジトリへの登録等。
18章
各種情報リソース。

au Wi-Fi SPOT と iPad

私の iPad は整備済製品として購入した iPad 2 の Wi-Fi モデルで、家庭専用として使用していました。 しかし au の「IS フラット」を契約しているので、Xperia に加えてもう 1台 追加費用なしに au Wi-Fi SPOT を利用することが可能です。 たまたま、時間つぶしが必要になりそうな所用があったので、これを機会に iPad も au Wi-Fi SPOT を利用できるように設定しようと思いたち、au Wi-Fi 接続ツールを iPad 2 にインストールし出かけました。

時間が無かったため、ろくに調べず、とりあえずアプリをダウンロードして Wi-Fi スポットに行けば良いだろうと考えていたのですが、これが失敗の元でした。 出先の au Wi-Fi SPOT が使えるエリアで au ID を使って初期設定するも、「初期設定ができませんでした。電波状況をご確認いただくか、しばらくしてから再度初期設定を行ってください。」とのエラーメッセージ。 「ID/パスワードを間違ったかも」と思いましたが、これらを再設定するメニューも見当たらずなす術がありません。

結局、敗因は「au Wi-Fi SPOT の接続を使って初期設定できない」という仕様を理解していなかったためです。 そうなのか。 なので、同じことをする考えている人がいたら、必ず家などのインターネット接続を用いて初期設定をしてから持ち出すようにしましょう。

SELinux のルールを確認してみよう

Linux を導入した時に、まず最初にやる作業が「SELinux の無効化」というのはいかがなものかと思っています。 開発環境ならまだしもプロダクション環境で何も考えず無効化しちゃうのは思考停止もいいところ。 しかし、SELinux がとっつきにくいのも確かなわけで、何故とっつきにくいかを自分の経験から考えてみると「現在適用されているルールがよくわからない」ということがあるのではないかと思いました。 世の中に SELinux に関する記事は溢れていますが、そのほとんどは boolean を設定したり、ファイルにタイプを設定したりみたいな枝葉末節を説明しているように思います。 IT系のエンジニアならば、まずは自分の手元の SELinux がどのようなポリシー/ルールで動いているのか知りたくなると思うのですが、それを知ろうとしても、該当する情報はなかなか見つけることができません。

というわけで今回は SELinux の「現在適用されているルールをどうやって知るか」という点をまとめてみたいと思います。

前提として:なぜ SELinux を有効化にするのか

SELinux はファイヤーウォールの置き換えでもアンチウィルスソフトの置き換えでもありません。 なので、それとは別の追加のセキュリティ機構として有効化しておくべきです。 この部分はあちらこちらで説明されているので (例えばちょっと古いですが日経 BP の記事)、詳細は割愛しますが、多層での防御 (defence in depth) ということを考えると、大事な情報を扱うサーバでは SELinux を有効化して運用すべきです。

SELinux のポリシーの構成

SELinux のポリシーの肝となる部分は AV (Access Vector) ルールと呼ばれるルールにより構成されています。 一つの AV ルールは以下のように表されますが、これが複数集まってセキュリティポリシーを構成します。

種類  ソースタイプ(ドメイン)  ターゲットタイプ  :  クラス  パーミッション;

AV ルールには 4種類 (3つの基本ルール+特殊ルール) あります。

allow ルール
このルールにより許可されたアクセスはログに記録されません。一番基本となるルールです。
auditallow ルール
ログあり許可ルール。allow ルールによって許可されたアクセスはログに記録されませんが、auditallow ルールならば記録されます。
dontaudit ルール
ログ出力抑止ルール。通常、ルールにより許可されなかったアクセスは拒否されログに記録されるのですが、dontaudit ルールで定められたアクセスについてはアクセスが拒否されてもログに記録されません。ログ出力を無視してよいアクセスをこのルールで規定します。
neverallow ルール
このルールは他の3つとは別格で、ルールのコンパイル時に許さないルールを規定します。allow/auditallow ルールで許可されていても neverallow に引っかかったらコンパイル時にエラーとなります。

現在のポリシーを把握するには allow ルールと auditallow ルールを中心に確認することになります。

現在のポリシーを確認してみよう

現在設定されている AV ルールを表示するには sesearch を使用します。 以下のコマンドで現システムのデフォルトポリシーの allow ルールを表示することができます。

# sesearch --allow -C
Found 133955 av rules:
   allow rpm_t httpd_squid_script_exec_t : sock_file { ioctl read write create getattr setattr lock relabelfrom relabelto append unlink link rename };
   allow rpm_script_t xenstored_var_run_t : sock_file { ioctl read write create getattr setattr lock append unlink link rename };
   allow restorecond_t evolution_alarm_exec_t : sock_file { getattr relabelfrom relabelto }
(以下略)

実行するとこのように万単位のルールが出力されます。 例えば Apache 関連だけを見ようと grep http としても数千行台というレベルで、確かに一つ一つを把握しておけるようなものではありません。 しかし、このようなルールに基づいて SELinux が動作しているということは理解しておくべきです。

{} は複数の値をまとめるために用いられるので、先の実行例の 1行目は以下のようになります。

ソースタイプ rpm_t
ターゲットタイプ httpd_squid_script_exec_t
クラス sock_file
パーミッション ioctl, read, write, create, getattr, setattr, lock,
relabelfrom, relabelto, append, unlink, link, rename

オブジェクトクラスとパーミッションの一覧はこちらにあります

また、以下の例の様に ET や DT から始まる行は boolean によって有効化/無効化できるルールを示しています。

 ET allow named_t init_t : process sigchld ; [ init_systemd ]

このように boolean 設定できるルールは行末に [ boolean名 ] が付き、現在有効になっているルールは行頭には ET が、無効になっているルールには DT が付きます。 この例では init_systemd という boolean が設定され有効化されているということになります。 「boolean を semanage でセットしましょう」という記事はあちこちで見かけますが、実際に何が変わるかはこのように sesearch で知ることができるのです。 その boolean 値に関連するルールのみ表示したければ以下のコマンドを使用することができます。

sesearch --allow -C -b boolean名

また、sesearch で表示されるルールの中には @ が付いた「@ttr0141」のような表記も見られることがありますが、これは attribute です。 attribute はタイプをグループ化するのに用いられ、その attribute が付与されたタイプ一覧は以下のコマンドで確認できます。

# seinfo -a@ttr0141 -x

ソースファイルではきちんと名前がついていますが、コンパイル後なのでこのような表示となってしまうのでしょう。

ポリシーはモジュール化されている

SELinux のフレームワークは NSA が中心となって開発しましたが、ポリシーは民間中心で開発されています。 そして、ポリシーには種類があり、主要なものとしては広く使われている targeted ポリシーとより厳しい strict ポリシーがあります。 身の回りにある CentOS や Fedora ではデフォルトで targeted ポリシーが適用されています。 /etc/selinux/config を見ると確認できます。

また、ポリシーはモジュール化されています。 targeted ポリシーのモジュール関連ファイルは /etc/selinux/targeted/modules 以下に置かれています。 更にその下の active/modules にある *.pp ファイルがモジュールの実体となっています。

この .pp ファイルを先の sesearch のパラメータとして渡し、モジュール内のルールを見ることはできるようなのですが、.pp ファイルに依存関係があり、依存するファイル全てを列挙しなければなりません。 列挙する際は base.pp を一番先に記述する必要があります。

モジュールの依存関係は module_deps で調べることができるので、その結果を sesearch に利用して各モジュールごとの AV ルールを確認することもできそうですが、手元の Fedora ではこのあたりがうまく動かず動作確認できませんでした。

カスタマイズの仕方

ポリシーの変更が必要なときは以下の順序で検討します。

  1. boolean の設定で対処できるかの検討
  2. カスタムポリシーの作成

実際問題としてカスタムポリシーが必要となるのは自作のデーモンを導入するなど既存の枠組みに収めることができない場合のみで、基本的なデーモン類については大抵 boolean の設定で足ります。 それほど様々な boolean 値が用意されています。

問題はどのような boolean 値が存在しているかをどのように知るかというところですが、いきなり sesearch で細かく見るのではなく、まずマニュアルを探してみるとよいでしょう。 大抵、デーモン名_selinux (httpd_selinux、squid_selinux、…) というマニュアルエントリが用意されているので、例えば Apache については以下のコマンドでマニュアルを確認します。

$ man httpd_selinux 

まとめと参考記事

IT 系の仕事をする立場として「SELinux は有効化しておくのが当たり前」という状況になって欲しいですし、「無効化」以外の SELinux の記事が世の中に増えれば良いと願っています。 この記事は SELinux の一部しか説明していないですが、ちょうど今売っているSoftware Design 2012年 9月号で SELinux の仕組みが包括的にわかりやすく説明されているので、興味があればこれをお勧めします。 記事を書くにあたって以下のエントリを参考にさせていただきました。

Excel で複数のシートを集計する時のテクニック

ユーザー定義関数で解決!

先の VBA の話の実践適用例です。

例えば、「シート1」、「シート2」、…「シート10」までの 10個のワークシートにデータが入っていて、これを集計・操作した「サマリー」シートを作ることを考えてみます。 このような場面はよくあることではないかと思うのですが、ここで困るのがシートの参照の仕方です。 ご存知のように「シート1」のセル A1 は以下のように参照します。

シート1!A1

このようにワークシートはシート名で参照するので、素直に作業を進めるとワークシートのタブから名前をコピーしてセルに貼り付けるような操作が必要になってしまうわけです。 列は A、B、C、…、行は 1、2、3、… と参照できますが、ワークシートについては名前でしか参照できず、残念ながら「N番目のワークシートを参照する」みたいなワークシート関数も存在しません。

そこをもう少し表計算ソフトらしく処理するために「ワークシート名を取り出す処理」を考えようということになるのですが、それも簡単ではありません。 例えば、こちらにその方法が丁寧に説明されていますが、何だかなあ、という感じです。

こんなとき VBA を使って自作関数を作ることができれば、以下のような関数を作って呼べば済みます。

Function GetWorkSheetNameByIndex(i)
  GetWorkSheetNameByIndex = Worksheets(i).Name
End Function

1枚目のシートの名前は「=GetWorkSheetNameByIndex(1)」、2枚目は「=GetWorkSheetNameByIndex(2)」というように呼び出して使うことができます。 このようにワークシート関数だけでやろうとすると複雑になってしまう処理でも VBA を使えばシンプルでわかりやすくなる場合があります。

VBA ユーザー定義関数の再計算

ここで気をつけねばならないのですが、VBA で作成したユーザー定義関数は F9 を押しても再計算されません。 この問題に対処するために Application.Volatile という関数が用意されていて、これを GetWorkSheetNameByIndex の中で呼ぶとセル修正のたびにこの関数の呼び出しが再計算されるようになります。

しかし、どこかのセルを修正する度に再計算されることになるので、Application.Volatile を利用するかどうかは慎重に検討すべきです。 先の例ではサマリーシートを作成する段階であればデータ用シート名をそうそう頻繁には変えないでしょうから、わざわざ Application.Volatile を呼ばなくても関数を呼び出しているセルを編集し直して再計算という方法で十分でしょう。

おまけ

まあ、「同じ位置のセルを単純集計する」程度の話であれば、ユーザー定義関数を作らなくても 3-D 集計を知っておくだけで済むかも知れません。

ワークシート関数で限界を感じた時は

Excel を使いこなしていくと「ワークシート関数だけではちと厳しいかな」と限界を感じるときがあると思います。 そんな時は気軽に VBA で関数を作っちゃいましょう。 作った関数はワークシート関数と同様に呼び出すことができます。 VBA 自作関数の書き方と呼び出し方を簡単に説明します。 (Excel 2007 以降を想定しています)

Visual Basic Editor を表示する

以下の手順で Visual Basic Editor を表示します。

  1. Office ボタン (一番左上) から選べる「Excel のオプション」-「基本設定」で「[開発]タブをリボンに表示する」をチェックします。 続いて新たに表示された「開発」タブより「Visual Basic」を選択します。
  2. Visual Basic Editor が起動するので、そこから「挿入」-「標準モジュール」を選びます。

ここまでで以下のように「Module1」が挿入されます。 この Module1 に関数を書いていくことになります。

Visual Basic Editor

関数を書いてみる

VBA の文法等について書き始めると収拾がつかないので、簡単にサンプルコードを書いてみます。 Visual Basic Editor の「Module1 (コード)」ウィンドウに以下のコードを書きます。 単純に 10倍の値を返す関数です。

Function myfunc(m)
  myfunc = m * 10
End Function

VBA function

あとはシートに戻ってワークシート関数と同様に呼び出すだけです。

call the function

簡単ですよね!

おまけ

ちなみに VBA のコードの中からワークシート関数を呼び出すには、以下の形式を使います。

WorksheetFunction.ワークシート関数名

例えば、SUM(A1:A10) と同じことをしたい場合は以下のようになります。

Function sum_a()
  sum_a = WorksheetFunction.Sum(Range("A1:A10"))
End Function

範囲を表すのに Range 関数を使ったりするので、全く同じ感覚で使えるわけではないですが、VBA からワークシート関数を呼べるのは知っておくと良いと思います。 Range とか Cells とか Select とか使い始めるとどんどん VBA にハマっていくわけですが、ハマりたい人はとっかかりとしてこのあたりの記事を読むと良いかと思います。

Excel で知らないと恥ずかしい基本操作

仕事をしているとプロジェクターで Excel を映して議論を重ねるような場面もあると思いますが、意外と基本的な操作を知らない人が多いようなので、そんな時にもたつかないための基本操作をまとめておきます。 Excel 2007 以降のバージョンを想定しています。

リボンを隠す

ワイド表示のディスプレイ全盛の時代にあって、ますます邪魔に感じてしまう「リボン」インターフェイスですが、隠す方法 (正確には最小化する方法) をご存知でしょうか? タブの部分 (「ホーム」、「挿入」、…) をダブルクリックすると非表示になります。

hide the ribbon

この状態で各タブを選ぶとメニューは都度表示されます。 元の動作に戻すには再度タブをダブルクリックです。

…って、これは Excel だけじゃなくて、Microsoft Office 全般の話ですね。

ズーム

作業用のシートをプロジェクターで映してみると小さく表示されてしまうので、拡大表示をしたくなりますよね? そんな時、わざわざ「表示」メニューを選ばなくても Ctrl+マウスホイール回転でズーム調整することができます。

これは Microsoft Office だけじゃなくて、Windows 全般で使える技です。(Excel じゃないじゃん…)

幅の調整

CSV ファイルを開いた後の「####」表示を一列ずつ幅調整して直していたりしませんか? 以下の手順で一括して調整できます。

  1. 左上コーナー (下図) をクリックして全セルを選択
    select all
  2. 「ホーム」-(セル)「書式」-「列の幅の自動調整」

ご存知だとは思いますが、画面表示で幅が収まっていても印刷するとはみ出すことがあるので、印刷時はプレビューで確認する必要があります。 念のため。

とりあえずこれだけ覚えておけば、プロジェクター投影時も恥ずかしくないでしょう。 「こんな操作知ってる。レベルが低い。」とお感じの方は是非こちらの記事もご覧ください。

Canon EOS 60D と 64ビット版 Windows

2011年末よりメインのパソコンが 64ビット版の Windows になったのですが、「ちょっとアテが外れたなあ」と思っていたのがカメラ用 Codec の EOS 60D 対応です。 この Codec (コーデック) があると RAW で撮影した .CR2 ファイルもエクスプローラー上のアイコン表示で写真のサムネイル画像が表示されるようになるのですが、Canon から提供されている「Canon RAW Codec」は 32ビット版のみ提供するという状態が今も続いています。

メーカーから個別提供されていない場合も、Microsoft から Camera Codec Pack なるものが提供されていていくつかのモデルはこれで救われていたのですが、残念ながら最近まで 60D には対応していませんでした。 しかし、それも昔の話となり、8月に登場した 16.4.1620.0719 でやっと Microsoft Camera Codec Pack が 60D に対応してくれました。 これでエクスプローラーから写真を探すのが簡単になります。

ファイル名が一瞬わかりにくいかも知れませんが、「amd64」と付いている方が 64ビット版用です。