2018年に行ったライブ、フェス

今年はいろいろ行きました。

No. 日付 名称 会場 一言
1 2/14 P.T.A.発足10周年!! と5周年!! “Perfumeとあなた”ホールトゥワー 幕張イベントホール 最高。初めての生edge。最高。
2 3/21 Perfume x TECHNOLOGY presents Reframe NHKホール 1曲目のDISPLAYの没入感がやばくて、最初ぜんぶCGかと思った。テクノロジーさん最高。
3 6/2 Amuse Fes in MAKUHARI 2018 -雨男晴女- 幕張メッセ国際展示場 9〜11ホール カタカナTとかサコッシュとか、グッズがPerfumeっぽいと思ったら本当にPerfumeの仕業だった。最高。
4 8/17-8/18 SONICMANIA 2018 幕張メッセ 中田ヤスタカ→MARSHMELLO→FLYING LOTUS(ちょっとだけ)→電気グルーヴ中田ヤスタカ目当てで行ったらMARSHMELLOにハマった。あとTシャツ買うのに2時間かかってCORNELIUS見逃した。
5 8/19 SUMMER SONIC 2018 幕張メッセ レキシ→JORJA SMITH(ちょっとだけ)→m-flo新しい学校のリーダーズ→THUNDERCAT→GEORGE CLINTON & PARLIAMENT FUNKADELIC。レキシでイルカのバルーンをポンポンしたりm-floで爆踊りしたりGEORGE CLINTONと愉快な仲間たちでいえーいってなったりいろいろあったんだけど、最後にやってたオカマのお姉さんたちに全部持ってかれた。
6 10/13 Yasutaka Nakata presents OTONOKO 2018 石川県産業展示館 4号館 やっぱりCAPSULEは最高。そしてまさかの米良美一
7 10/23-10/24 BABYMETAL WORLD TOUR 2018 in JAPAN 幕張メッセイベントホール ゆいちゃんが…。でもライブ自体はすごくよかった。IN THE NAME OFは7人いるからこそできるパフォーマンスだと思う。あとゲストのGalactic Empireも何気に好き。
8 12/11 Perfume 7th Tour 2018 「FUTURE POP」 横浜アリーナ ふゅーーーちゃーーーーーぽーーーーーーーっぷ!!!!
9 12/29 COUNTDOWN JAPAN 18/19 幕張メッセ国際展示場1~11ホール, イベントホール きゃりーぱみゅぱみゅシシド・カフカZAZEN BOYS打首獄門同好会CAPSULE/中田ヤスタカ→DJピエール中野。みんながだいすきな向井秀徳さんがいました。CAPSULE/中田ヤスタカは30分で最初短いなーと思ったけど、盛り上がるやつ全部入りみたいなセトリで終始爆踊りだったので超満足。
10 12/31 Perfume 7th Tour 2018 「FUTURE POP」ファンクラブ限定・カウントダウン公演 横浜アリーナ これから行く。ふゅーーーーーちゃーーーーーーーぽーーーーーーーーーっぷ!!!!!!

来年もいろいろ行きたい。

それでは良いお年を。

Excel VSTOアドイン開発入門

はじめに

Spreadsheets/Excel Advent Calendar 2018の12日目の記事です。

Excelでの作業の自動化といえばExcel VBAですが、複雑な機能の実装には辛いことも多かったりします。 そんなときは、C#.NET Frameworkの機能がフルに使えるVSTO (Visual Studio Tools for Office)が便利です。

そこで本記事では、ExcelVSTOアドインの開発環境構築から配布までを解説したいと思います。

想定環境

やってみる

1. 環境構築

VSTOアドインの開発には、Visual Studio の他に Office Developer Tools という拡張機能が必要です。 それぞれ下記リンクからダウンロードし、インストーラに従ってインストールします。

2. プロジェクト作成

Visual Studioを起動し、[ファイル]-[新規作成]-[プロジェクト]からプロジェクトを作成します。 [Visual C#]-[Office/SharePoint]-[VSTOアドイン]から、「Excel 2013と2016 VSTOアドイン」を選択し、[OK]をクリックします。

f:id:ser1zw:20181212175933p:plain f:id:ser1zw:20181212180004p:plain

すると、以下のようなコードが生成されます。

// ThisAddin.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Excel;

namespace ExcelAddIn1
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }

        #region VSTO で生成されたコード
        // (省略...)
    }
}

ThisAddIn_Startup()ThisAddIn_Shutdown() は、それぞれアドインのロード時、アンロード時に実行されるイベントハンドラです。

参考: Office プロジェクト内のイベント - Visual Studio | Microsoft Docs

ここでは一旦なにもせず置いておきます。

3. リボンにボタンを追加

アドインの機能を実行するため、リボンにボタンを追加していきます。

まず、ソリューション エクスプローラー からプロジェクト名(ここでは ExcelAddIn1 )を右クリックし、[追加]-[新しい項目]を選択します。

f:id:ser1zw:20181212180035p:plain

次に、[Visual C# アイテム]-[Office/SharePoint]から「リボン(ビジュアルなデザイナー)」を選択して[追加]します。

f:id:ser1zw:20181212180047p:plain

これで見慣れたフォームデザイナが起動するので、左側のツールボックスからボタンを選択し、ドラッグ&ドロップでリボンに追加しましょう。

f:id:ser1zw:20181212180148p:plain

ボタンをダブルクリックすると、クリック時のイベントハンドラ button1_Click() が挿入されるので、ここに処理を書いていきます。

// Ribbon1.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Tools.Ribbon;

namespace ExcelAddIn1
{
    public partial class Ribbon1
    {
        private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
        {
        }

        private void button1_Click(object sender, RibbonControlEventArgs e)
        {
                // ここにいろいろ書く
        }
    }
}

4. アドインの処理を書く

VSTOプロジェクト内では、アドイン自体の機能やExcelのワークシート等にアクセス可能な Globals というクラスがあります。 シートの内容の読み書きといったExcelとのやりとりは、主にこのクラスを介して行います。

参考: Office プロジェクト内のオブジェクトへのグローバル アクセス - Visual Studio | Microsoft Docs

試しに、前述の button1_Click() を下記のように変更してみます。

private void button1_Click(object sender, RibbonControlEventArgs e)
{
    // アクティブなシートの取得
    // ActiveSheetはdynamic型であり、そのままだとインテリセンスが効かないので、
    // キャストするために as Microsoft.Office.Interop.Excel.Worksheet をつけている。
    var activeSheet = Globals.ThisAddIn.Application.ActiveSheet
        as Microsoft.Office.Interop.Excel.Worksheet;

    // セルに値を設定
    activeSheet.Range["A1"].Cells.Value = "Hello";
    activeSheet.Cells[1, 2] = 123;
}

4. 実行してみる

上部メニューから[開始]をクリックすると、Excelが起動します。 「空白のブック」を選択してリボンの「アドイン」タブを開くと、3.で追加したボタンが表示されます。

これをクリックすると 4. で記載した処理が実行され、セルに値が設定されます。

f:id:ser1zw:20181212180232p:plain

なお、このままの状態では、Excel起動時に毎回このアドインが読み込まれることになります。 このため、作業が終わったらVisual Studioの上部メニューから [ビルド]-[ソリューションのクリーン] を実行し、開発中のアドインを削除しましょう。

f:id:ser1zw:20181212180300p:plain

5. アドインの配布

配布にはいくつか方法がありますが、最も手軽な「インストーラを含むフォルダをそのまま配布」の方法を紹介します。

Visual Studioの上部メニューの [ビルド]-[(プロジェクト名)の発行] をクリック → 発行する場所のパスを設定(今回はデフォルトの「公開」フォルダ)して[次へ]をクリック → 「CD-ROM または DVD-ROM から」を選択して [完了] をクリックします。

f:id:ser1zw:20181212180242p:plain f:id:ser1zw:20181212180304p:plain f:id:ser1zw:20181212180307p:plain

今回は発行する場所のパスがデフォルトのままなので、プロジェクトフォルダ配下に「公開」フォルダが作成され、そこにインストーラが一式保存されます。 別のPCでアドインをインストールするには、前述の「公開」フォルダをまるごとコピーし、中の setup.exe を実行すればOKです。

f:id:ser1zw:20181212180316p:plain

アンインストールは、一般的なソフトと同じく「アプリと機能」から行います。

f:id:ser1zw:20181212180321p:plain

なお、上記手順で発行を行うと、デフォルトでは自動的にリビジョンが上がっていきます。 バージョンを明示的に設定したい場合は、Visual Studioの上部メニュー [プロジェクト]-[(プロジェクト名)のプロパティ] を開き、 [発行] から「発行するバージョン」を編集してください。 「リリースごとにリビジョンを自動的に追加する」のチェックをはずすと、リビジョンが自動的に上がらなくなります。

f:id:ser1zw:20181212180325p:plain f:id:ser1zw:20181212180329p:plain

参考: 発行ウィザード (Visual Studio での Office 開発) - Visual Studio | Microsoft Docs

6. 参考リソース

VBAVSTOの比較

公式チュートリアル

リファレンス

まとめ

ExcelVSTOアドインの開発環境構築から配布までの一連の流れを解説しました。 VBAでは厳しいと感じる場面では、ぜひ試してみてください。

明日は __papix__さん です。

Omnibus GitLabからGitLab.comに移行した話

はじめに

VPSに置いてあったOmnibus GitLabをアップデートしたら起動しなくなったので、これを期にGitLab.comに移行しました。

環境

移行元

  • Omnibus GitLab Version: 10.4.3, Revision: 183dd5d
  • CentOS 6.9 x86_64

移行先

  • GitLab.com (API v4)

手順

1. GitLab上のbareリポジトリをnon-bareリポジトリにする

普通なら git clone して origin を差し替えて git push するだけなのですが、今回はGitLabが起動しなくなっていたので、サーバ上のbareリポジトリからnon-bareリポジトリを作ります。

Omnibus GitLabのリポジトリは、デフォルト設定であれば /var/opt/gitlab/git-data/repositories/<ユーザ名> にあります。

というわけで、こんな感じの雑なスクリプトでnon-bareリポジトリを作ります*1

DIRNAME='/var/opt/gitlab/git-data/repositories/<ユーザ名>'

for f in $(ls $DIRNAME | grep -E '.git$'); do
    echo $f
    cd $DIRNAME;
    f2=`echo $f | sed -e 's/.git$//'`;

    # ワーキングディレクトリを作り、bareリポジトリを .git にリネームして入れる
    mkdir $f2;
    mv ${f2}.git ${f2}/.git 

    # bareリポジトリじゃなくする。
    cd ${f2}/.git
    git config core.bare false
    cd ..
    git checkout-index -a
    git reset --hard HEAD
done;

…よく考えたら git daemon すれば普通にcloneできたかもしれませんが、気にしないことにします。

2. スニペットのデータを取り出す

スニペットのデータはPostgreSQLの中に入っているので、gitlab-psql コマンドで取り出します。

$ su -
# /usr/bin/gitlab-ctl start postgresql
# /usr/bin/gitlab-psql gitlabhq_production -c 'select title,file_name,content from snippets;'

テーブル定義は以下のような感じなので、他にも必要な列があれば、適当に取得します。

gitlabhq_production=# \d snippets;
                                            Table "public.snippets"
         Column          |            Type             |                       Modifiers                       
-------------------------+-----------------------------+-------------------------------------------------------
 id                      | integer                     | not null default nextval('snippets_id_seq'::regclass)
 title                   | character varying(255)      | 
 content                 | text                        | 
 author_id               | integer                     | not null
 project_id              | integer                     | 
 created_at              | timestamp without time zone | 
 updated_at              | timestamp without time zone | 
 file_name               | character varying(255)      | 
 type                    | character varying(255)      | 
 visibility_level        | integer                     | not null default 0
 title_html              | text                        | 
 content_html            | text                        | 
 cached_markdown_version | integer                     | 
 description             | text                        | 
 description_html        | text                        | 

3. GitLab.comのアカウントを作る

https://gitlab.com にアクセスしてアカウントを作ります。

4. GitLab APIでプロジェクトを作る

1つずつ手作業でプロジェクトを作るのはつらいので、APIを使いましょう。 まずはアクセストークンを https://gitlab.com/profile/personal_access_tokens から作ります。面倒なのでスコープは全部つけました。

f:id:ser1zw:20180503034223p:plain

プロジェクトを作るには、POST /projects してやればよいようです。

docs.gitlab.com

単発のcurlでやるなら、こんな感じ。

$ curl -X POST --header 'Private-Token: <アクセストークン>' https://gitlab.com/api/v4/projects?name=<プロジェクト名>

1つずつやるのは面倒なので、シェル芸で一気にやります。

$ ls /var/opt/gitlab/git-data/repositories/<ユーザ名> | xargs -I@ curl -X POST --header 'Private-Token: <アクセストークン>' https://gitlab.com/api/v4/projects?name=@

5. プロジェクトにpushする

1で作ったリポジトリの内容をpushしていきます。 これも雑なスクリプトで一気にやります。

DIRNAME='/var/opt/gitlab/git-data/repositories/<ユーザ名>'

for d in $(ls $DIRNAME); do
    echo $d
    cd $DIRNAME/$d;
    git remote add origin git@gitlab.com:<ユーザ名>/${d}.git
    git push -u origin --all
    git push -u origin --tags
done;

スニペットは少ししか無かったので、今回は手動でやってしまいました。

まとめ

というわけで、Omnibus GitLabからGitLab.comへの移行をする話でした。

参考

*1:やってる内容は http://qnighy.hatenablog.com/entry/2017/02/25/154752 を参考にしました

HainというWindows用ランチャで素因数分解

しごとしたくないなーと思いながらぼーっとネット見てたら、増田でこんな記事を見つけました。

anond.hatelabo.jp

anond.hatelabo.jp

ざっくり要約すると、

テレビで流れてきた数字を数秒もしないうちに素因数分解して
ニコ動のコメントに書き込んでる!すごい!!

いやいやAlfred(Macのランチャ)からプログラム起動して計算しただけですよ。

という顛末です。

ちょうどHainというWindows用ランチャで遊んでたんですが、 HainってElectron製でJavaScriptプラグインが作れるというので、調子に乗ってこんなものを作ってみました。

github.com

入力した数字を瞬時に素因数分解します。 ついでにクリップボードにコピーまでしてくれます。素敵!

f:id:ser1zw:20170118020321g:plain

というわけで、Hainは割と手っ取り早くプラグインが作れて楽しいのでおすすめというお話でした。

ruby-opencvをWindows(RubyInstaller)で使う

ruby-opencvは一応Windowsもサポートしているわけですが、いつからかOpenCVMinGW版のバイナリを配布しなくなってしまったため、RubyInstallerを使っている場合は自前でOpenCVをビルドしなければならない状態になっていました。 GitHubでもissueがいくつか挙がってたのをずーっと放置していたのですが、さすがに放置し過ぎな気がしてきたので、取り急ぎインストール用のドキュメントを作成しました。

ruby-opencv/install-ruby-opencv-with-rubyinstaller-on-windows.md at master · ruby-opencv/ruby-opencv · GitHub

大雑把に言うと、ポイントは以下の2点です。

  • DevKitのビルドツール(mingw-32-make、gcc、g++)を使ってOpenCVをビルドする
  • ruby-opencvをインストールしたり使ったりするときに、OpenCVのDLLのフォルダに加えてMinGWのDLLのフォルダをパスに追加する

想定環境 & 用意するもの

ちなみに、OpenCV 3系だとDevKitに含まれるgccとかg++が古すぎてビルドできません。DevKitアップデートされないかな…。

インストール方法

OpenCVを取ってくる

まずはOpenCVhttps://sourceforge.net/projects/opencvlibrary/ あたりから取ってきて、適当なフォルダに展開します。

CMakeでOpenCVMakefileを作成する

コマンドプロンプト(cmd.exe)を開き、下記のコマンドを実行します。

D:\>set DEVKIT_PATH=D:/local/devkit
D:\>set SOURCE_PATH=D:/work/opencv-2.4.13/sources
D:\>set OPENCV_INSTALL_PATH=D:/opencv-2.4.13
D:\>cmake %SOURCE_PATH% -G"MinGW Makefiles" -DCMAKE_INSTALL_PREFIX=%OPENCV_INSTALL_PATH% -DCMAKE_MAKE_PROGRAM=%DEVKIT_PATH%/mingw/bin/mingw32-make.exe -DCMAKE_C_COMPILER=%DEVKIT_PATH%/mingw/bin/gcc.exe -DCMAKE_CXX_COMPILER=%DEVKIT_PATH%/mingw/bin/g++.exe -DBUILD_PERF_TESTS=OFF

上記コマンドでは、DevKit が D:/local/devkit に、OpenCVD:/work/opencv-2.4.13 にインストールされていて(ソースコードD:/work/opencv-2.4.13/sources )、出力先フォルダが D:/opencv-2.4.13 になるという前提です。もし別のフォルダを指定する場合は、 DEVKIT_PATHSOURCE_PATHOPENCV_INSTALL_PATH で設定しているパスを変更してください。

なお、 D:\>コマンドプロンプトのプロンプトなので、入力しなくてよいです。

OpenCVをDevKitでビルドする

コマンドプロンプトで下記のコマンドを実行します。

D:\>%DEVKIT_PATH%/mingw/bin/mingw32-make.exe
D:\>%DEVKIT_PATH%/mingw/bin/mingw32-make.exe install

ruby-opencvをインストール

コマンドプロンプトで下記のコマンドを実行します。

D:\>path %OPENCV_INSTALL_PATH%\x64\mingw\bin;%DEVKIT_PATH%\mingw\bin;%PATH%
D:\>gem install ruby-opencv -- --with-opencv-include=%OPENCV_INSTALL_PATH%/include --with-opencv-lib=%OPENCV_INSTALL_PATH%/x64/mingw/lib

インストールが完了したら、試しにrequireしてみます。

D:\>irb
irb(main):001:0> require 'opencv'
=> true
irb(main):002:0> OpenCV::CV_VERSION
=> "2.4.13"

うまくいったようです。

注意点として、 %OPENCV_INSTALL_PATH%\x64\mingw\bin%DEVKIT_PATH%\mingw\binruby-opencvを使うときには必ずパスに追加する必要があります。 でないと、以下のエラーが発生します。

D:\>irb
irb(main):001:0> require 'opencv'
LoadError: 126: 指定されたモジュールが見つかりません。   - D:/local/ruby/lib/ruby/gems/2.3.0/gems/ruby-opencv-0.0.17/lib/opencv.so
        from D:/local/ruby/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:133:in `require'
        from D:/local/ruby/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:133:in `rescue in require'
        from D:/local/ruby/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:40:in `require'
        from D:/local/ruby/lib/ruby/gems/2.3.0/gems/ruby-opencv-0.0.17/lib/opencv.rb:8:in `rescue in <top (required)>'
        from D:/local/ruby/lib/ruby/gems/2.3.0/gems/ruby-opencv-0.0.17/lib/opencv.rb:5:in `<top (required)>'
        from D:/local/ruby/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:133:in `require'
        from D:/local/ruby/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:133:in `rescue in require'
        from D:/local/ruby/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:40:in `require'
        from (irb):1
        from D:/local/ruby/bin/irb.cmd:19:in `<main>'

%OPENCV_INSTALL_PATH%\x64\mingw\bin のほうはOpenCVのDLLのフォルダなので当然必要なのですが、今回の手順でビルドした場合はMinGWlibgcc_s_sjlj-1.dlllibstdc++-6.dll もリンクされるので、これらが格納されている %DEVKIT_PATH%\mingw\bin もパスに追加する必要があるのでした*1

そんなわけで

どうにかWindowsruby-opencvが使えるようになりました。

*1:静的リンクしてしまえばよいのだろうけど、extconf.rb経由でうまくgccにオプションが渡せなかったので、とりあえずそのままに。

UNetbootinでドライブが選択できないときはコマンドラインオプションを使えばよいですという話

環境

なにごと?

LinuxUSBメモリからインストールするときには UNetbootin を使ったりします。…が、USBメモリを差し込んでOSに認識されているにも関わらず、UNetbootinの画面上で選択できないことがあります。

USBメモリ/dev/sdc1にマウントされているのに…

$ mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
(中略)
/dev/sdc1 on /media/seri/5460E33660E31D8C type fuseblk (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,blksize=4096,uhelper=udisks2)

UNetbootinでドライブが選択できない f:id:ser1zw:20160423185424p:plain

解決策

UNetbootinにはコマンドラインオプションでパラメータを渡せるので、ターミナルからinstalltypetargetdrive を指定すればよいです。

今回はUSBメモリ/dev/sdc1 にマウントされているので、こんな感じ

$ sudo unetbootin installtype=USB targetdrive="/dev/sdc1"

そうすると、コマンドラインオプションで指定したデバイスがUNetbootinのドライブにセットされます。 f:id:ser1zw:20160423185427p:plain

あとは普通にディスクイメージなどを指定すれば、そのままUSBメモリに書き込みができます。

参考

Windowsでzipファイルを分割したり結合したりする

はじめに

大きめのファイルをアップローダとかで他の人に渡す場合など、zipファイルを分割したかったりすることがあります。 でも結合にわざわざソフト入れてもらうのもなーと思ってたら、結合だけなら標準のコマンドでできたのでした*1。 というわけで、やり方を書いておきます。

環境

  • Windows 8.1(XPとか7とかでも大丈夫)
  • 7-Zip 9.20(分割ファイル作成用)

分割方法

分割は7-Zipを使います。公式サイトのとおりにやるだけです。

分割圧縮の方法 | 7-Zip

GUIの場合

分割圧縮したいファイルやフォルダを右クリックして「Add to archive...」を選択し…

f:id:ser1zw:20141019043736p:plain

「書庫を分割」で1ファイルあたりのサイズを指定します。メニューに無いサイズでも直接入力すれば指定できます。 数値だけであればバイト単位ですが、K(キロバイト)、M(メガバイト)、G(ギガバイト)といった指定もできるようです。

f:id:ser1zw:20141019041359p:plain

処理が終了すると、指定したサイズでファイル末尾に 001、002、… という連番のファイルが作成されます。

f:id:ser1zw:20141019043909p:plain

コマンドの場合

コマンドプロンプトから、以下のコマンドを実行します。

7z.exe a -v[1ファイルあたりのサイズ] [圧縮ファイル名] [分割圧縮したいファイル/フォルダ名]

今回の場合はこんな感じです。

f:id:ser1zw:20141019044226p:plain

終了すると、GUIの場合と同じように分割圧縮ファイルが作成されます。

結合方法

実はWindowsのcopyコマンドは、ファイルを + でつなげたりワイルドカードを使用したりすることで、複数のファイルを1つにつなげることができます。 zipファイルの場合はバイナリファイルとして扱いたいので /B オプションをつけて、以下のコマンドを実行します。 [分割ファイル1]+[分割ファイル2]+…[分割ファイルN]の部分はワイルドカードで指定してもOKです。

COPY /B [分割ファイル1]+[分割ファイル2]+…[分割ファイルN] [結合ファイル名]

今回の場合はこんな感じです。

f:id:ser1zw:20141019045603p:plain

終了すると、[結合ファイル名]で指定したファイルが作成されています。

f:id:ser1zw:20141019045612p:plain

あとはこれを普通に展開すれば中身が取り出せます。

まとめ

というわけで、分割ファイルの結合だけであればWindows標準のコマンドでできるのでした。 結合のためにわざわざソフトを入れてもらわなくても済むのは大変ありがたいところです。

参考

*1:分割は他のソフト頼みですが