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)が便利です。
そこで本記事では、ExcelのVSTOアドインの開発環境構築から配布までを解説したいと思います。
想定環境
- Windows 10
- Visual Studio Community 2017
- Office Developer Tools for Visual Studio 2017
- Excel 2016
- .NET Framework 4.6.1
やってみる
1. 環境構築
VSTOアドインの開発には、Visual Studio の他に Office Developer Tools という拡張機能が必要です。 それぞれ下記リンクからダウンロードし、インストーラに従ってインストールします。
2. プロジェクト作成
Visual Studioを起動し、[ファイル]-[新規作成]-[プロジェクト]からプロジェクトを作成します。 [Visual C#]-[Office/SharePoint]-[VSTOアドイン]から、「Excel 2013と2016 VSTOアドイン」を選択し、[OK]をクリックします。
すると、以下のようなコードが生成されます。
// 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
)を右クリックし、[追加]-[新しい項目]を選択します。
次に、[Visual C# アイテム]-[Office/SharePoint]から「リボン(ビジュアルなデザイナー)」を選択して[追加]します。
これで見慣れたフォームデザイナが起動するので、左側のツールボックスからボタンを選択し、ドラッグ&ドロップでリボンに追加しましょう。
ボタンをダブルクリックすると、クリック時のイベントハンドラ 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. で記載した処理が実行され、セルに値が設定されます。
なお、このままの状態では、Excel起動時に毎回このアドインが読み込まれることになります。 このため、作業が終わったらVisual Studioの上部メニューから [ビルド]-[ソリューションのクリーン] を実行し、開発中のアドインを削除しましょう。
5. アドインの配布
配布にはいくつか方法がありますが、最も手軽な「インストーラを含むフォルダをそのまま配布」の方法を紹介します。
Visual Studioの上部メニューの [ビルド]-[(プロジェクト名)の発行] をクリック → 発行する場所のパスを設定(今回はデフォルトの「公開」フォルダ)して[次へ]をクリック → 「CD-ROM または DVD-ROM から」を選択して [完了] をクリックします。
今回は発行する場所のパスがデフォルトのままなので、プロジェクトフォルダ配下に「公開」フォルダが作成され、そこにインストーラが一式保存されます。
別のPCでアドインをインストールするには、前述の「公開」フォルダをまるごとコピーし、中の setup.exe
を実行すればOKです。
アンインストールは、一般的なソフトと同じく「アプリと機能」から行います。
なお、上記手順で発行を行うと、デフォルトでは自動的にリビジョンが上がっていきます。 バージョンを明示的に設定したい場合は、Visual Studioの上部メニュー [プロジェクト]-[(プロジェクト名)のプロパティ] を開き、 [発行] から「発行するバージョン」を編集してください。 「リリースごとにリビジョンを自動的に追加する」のチェックをはずすと、リビジョンが自動的に上がらなくなります。
参考: 発行ウィザード (Visual Studio での Office 開発) - Visual Studio | Microsoft Docs
6. 参考リソース
VBAとVSTOの比較
公式チュートリアル
リファレンス
まとめ
ExcelのVSTOアドインの開発環境構築から配布までの一連の流れを解説しました。 VBAでは厳しいと感じる場面では、ぜひ試してみてください。
明日は __papix__さん です。
Omnibus GitLabからGitLab.comに移行した話
はじめに
VPSに置いてあったOmnibus GitLabをアップデートしたら起動しなくなったので、これを期にGitLab.comに移行しました。
環境
移行元
移行先
- 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 から作ります。面倒なのでスコープは全部つけました。
プロジェクトを作るには、POST /projects
してやればよいようです。
単発の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用ランチャで素因数分解
しごとしたくないなーと思いながらぼーっとネット見てたら、増田でこんな記事を見つけました。
ざっくり要約すると、
テレビで流れてきた数字を数秒もしないうちに素因数分解して ニコ動のコメントに書き込んでる!すごい!!
↓
いやいやAlfred(Macのランチャ)からプログラム起動して計算しただけですよ。
という顛末です。
ちょうどHainというWindows用ランチャで遊んでたんですが、 HainってElectron製でJavaScriptでプラグインが作れるというので、調子に乗ってこんなものを作ってみました。
入力した数字を瞬時に素因数分解します。 ついでにクリップボードにコピーまでしてくれます。素敵!
というわけで、Hainは割と手っ取り早くプラグインが作れて楽しいのでおすすめというお話でした。
ruby-opencvをWindows(RubyInstaller)で使う
ruby-opencvは一応Windowsもサポートしているわけですが、いつからかOpenCVがMinGW版のバイナリを配布しなくなってしまったため、RubyInstallerを使っている場合は自前でOpenCVをビルドしなければならない状態になっていました。 GitHubでもissueがいくつか挙がってたのをずーっと放置していたのですが、さすがに放置し過ぎな気がしてきたので、取り急ぎインストール用のドキュメントを作成しました。
大雑把に言うと、ポイントは以下の2点です。
- DevKitのビルドツール(mingw-32-make、gcc、g++)を使ってOpenCVをビルドする
- ruby-opencvをインストールしたり使ったりするときに、OpenCVのDLLのフォルダに加えてMinGWのDLLのフォルダをパスに追加する
想定環境 & 用意するもの
- Windows 10 64bit
- RubyInstaller版 Ruby 2.3.0p0 x64-mingw32
- DevKit (DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe)
- OpenCV 2.4.13
- CMake 3.6.0 x64
- ruby-opencv 0.0.17
ちなみに、OpenCV 3系だとDevKitに含まれるgccとかg++が古すぎてビルドできません。DevKitアップデートされないかな…。
インストール方法
OpenCVを取ってくる
まずはOpenCVを https://sourceforge.net/projects/opencvlibrary/ あたりから取ってきて、適当なフォルダに展開します。
CMakeでOpenCVのMakefileを作成する
コマンドプロンプト(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
に、OpenCVが D:/work/opencv-2.4.13
にインストールされていて(ソースコードは D:/work/opencv-2.4.13/sources
)、出力先フォルダが D:/opencv-2.4.13
になるという前提です。もし別のフォルダを指定する場合は、 DEVKIT_PATH
、 SOURCE_PATH
、 OPENCV_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\bin
はruby-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のフォルダなので当然必要なのですが、今回の手順でビルドした場合はMinGWのlibgcc_s_sjlj-1.dll
と libstdc++-6.dll
もリンクされるので、これらが格納されている %DEVKIT_PATH%\mingw\bin
もパスに追加する必要があるのでした*1。
そんなわけで
UNetbootinでドライブが選択できないときはコマンドラインオプションを使えばよいですという話
環境
- Ubuntu 15.10
- UNetbootin 608-1
なにごと?
LinuxをUSBメモリからインストールするときには 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でドライブが選択できない
解決策
UNetbootinにはコマンドラインオプションでパラメータを渡せるので、ターミナルからinstalltype
と targetdrive
を指定すればよいです。
今回はUSBメモリが /dev/sdc1
にマウントされているので、こんな感じ
$ sudo unetbootin installtype=USB targetdrive="/dev/sdc1"
そうすると、コマンドラインオプションで指定したデバイスがUNetbootinのドライブにセットされます。
あとは普通にディスクイメージなどを指定すれば、そのままUSBメモリに書き込みができます。
参考
Windowsでzipファイルを分割したり結合したりする
はじめに
大きめのファイルをアップローダとかで他の人に渡す場合など、zipファイルを分割したかったりすることがあります。 でも結合にわざわざソフト入れてもらうのもなーと思ってたら、結合だけなら標準のコマンドでできたのでした*1。 というわけで、やり方を書いておきます。
環境
- Windows 8.1(XPとか7とかでも大丈夫)
- 7-Zip 9.20(分割ファイル作成用)
分割方法
分割は7-Zipを使います。公式サイトのとおりにやるだけです。
GUIの場合
分割圧縮したいファイルやフォルダを右クリックして「Add to archive...」を選択し…
「書庫を分割」で1ファイルあたりのサイズを指定します。メニューに無いサイズでも直接入力すれば指定できます。 数値だけであればバイト単位ですが、K(キロバイト)、M(メガバイト)、G(ギガバイト)といった指定もできるようです。
処理が終了すると、指定したサイズでファイル末尾に 001、002、… という連番のファイルが作成されます。
コマンドの場合
コマンドプロンプトから、以下のコマンドを実行します。
7z.exe a -v[1ファイルあたりのサイズ] [圧縮ファイル名] [分割圧縮したいファイル/フォルダ名]
今回の場合はこんな感じです。
終了すると、GUIの場合と同じように分割圧縮ファイルが作成されます。
結合方法
実はWindowsのcopyコマンドは、ファイルを + でつなげたりワイルドカードを使用したりすることで、複数のファイルを1つにつなげることができます。
zipファイルの場合はバイナリファイルとして扱いたいので /B オプションをつけて、以下のコマンドを実行します。
[分割ファイル1]+[分割ファイル2]+…[分割ファイルN]
の部分はワイルドカードで指定してもOKです。
COPY /B [分割ファイル1]+[分割ファイル2]+…[分割ファイルN] [結合ファイル名]
今回の場合はこんな感じです。
終了すると、[結合ファイル名]
で指定したファイルが作成されています。
あとはこれを普通に展開すれば中身が取り出せます。
まとめ
というわけで、分割ファイルの結合だけであればWindows標準のコマンドでできるのでした。 結合のためにわざわざソフトを入れてもらわなくても済むのは大変ありがたいところです。
参考
*1:分割は他のソフト頼みですが