2017/12/23

Bash on Ubuntu on WindowsならぬC# on PowerShell on bat

この記事はPowerShell Advent Calendar 2017の23日目です。
そして明日が私の誕生日です。(?)

前置き

たまたまググッて出てきた幾つかの技術を組み合わせたら大変便利過ぎて危険だった
みんな知ってたのこれ?ていうお話。

PowerShellはWindowsに標準で搭載されるようになり、いわゆる「OS入ってればすぐ動く」の好例となったわけなんですが、
ps1ファイルがアレゲ。凄くアレ。
少なくともPC初心者の方にはダブルクリックで確実に実行出来ないとダメだと思うんです。
案の定7日目の大鷲さんがゾーン/セキュリティ(或いは場合によりExecutionPolicyなど……)に振り回されておられるわけです。
堅いのは良い事だ。良い事だけど、思ったより使い勝手悪いかなと。WSHくらいお手軽でありたい。

本題

そして、以下の超危険な一行に出会ってしまったのです。
@powershell -NoProfile -ExecutionPolicy Unrestricted "$s=[scriptblock]::create((gc \"%~f0\"|?{$_.readcount -gt 1})-join\"`n\");&$s" %*&goto:eof
これはbatファイルの1行目に書くおまじないです。そしてこのおまじないがあれば、
2行目以降にPowerShell記述が出来てしまいます。ヤベェ。
二行目以降をPowerShellスクリプトとして実行させているbat……てイメージ。
batからps1を呼び出す手法は結構あちこちで見かけるのですが、
たった1行のおまじないでbat拡張子のPowerShellスクリプトが爆誕。
ExecutionPolicyも自由に書けます。
@powershell -WindowStyle Hidden -NoProfile -ExecutionPolicy Unrestricted "$s=[scriptblock]::create((gc \"%~f0\"|?{$_.readcount -gt 1})-join\"`n\");&$s" %*&goto:eof
こうするとDOS窓(conhostってやつ、黒い窓)も消える。

.NETによる凶悪な発展

PowerShellでもちょこっと「Add-Type -ReferencedAssemblies」なんてやってあげると、C#のソース埋め込んで実行とか出来るんですよ。

……ん?

@powershell -NoProfile -ExecutionPolicy Unrestricted "$s=[scriptblock]::create((gc \"%~f0\"|?{$_.readcount -gt 1})-join\"`n\");&$s" %*&goto:eof
$assemblies = ("System")
$src = @"
using System;
public static class cstest {
        public static void main(string[] args) {
            Console.WriteLine(args[0] + "!" + args[0] + "!" + args[0] + "!");
        }     }
"@
Add-Type -ReferencedAssemblies $assemblies -TypeDefinition $src -Language CSharp
[cstest]::main('hello!')
うおおおおおこのbat動くぞぉぉぉぉぉこれ動くぞぉぉぉぉ
とにかく表題通り「batの中で動いているPowerShellの中でC#がコンパイルされながら実行されている」のです!何を言っているか分からない!!
副次的なメリットも多方に及びます。

  • bat起動時のパラメータ渡しもきちんと機能し、C#にまで渡せます
  • WPF利用、XAMLを同時に埋め込む事も難なく可能です
  • やってないけどどうせVB.NETとかも埋め込めるんじゃねーかな
  • C#にまで到達していれば.NETなdllはおろかDLLImportでWin32APIやらDLL関数も利用可能
宇宙ヤバイ。

こんなにステキ

.NET Frameworkのバージョンは恐らく実行しているOS上でのPowerShellのバージョンに依存するはず。……んーがそもそも
「実行時に自動的に判定される」という点だけで超便利。
「3.5と4.xでコンパイル分けなくてええねん」て言えば「(@益@.:;)ノシ なんだと」てならないかな。

気になる点

  • これ将来的に塞がれたりしないの
  • セキュリティリスクにならんの
    • セキュリティリスクになってhtaみたいに迫害ry
C#やりたい時はアセンブリ書くのちょこっと面倒かな、とは思ってますが、
PowerShell的にはやりたい放題です。
最後の良心で「自身を管理者実行し直すbat」を混ぜ込んでいないのですが……やっぱりすげーセキュリティリスクになりそう。ならないかな。
あと細かい事だけど各種エディタでデフォルトでbatとして認識されるので実に自動補完されないとかハイライトされないとかはある。


今後の発展

DLLImportをより手軽に扱える関数を作ってみたりしています。
妄想だけどReferencedAssembliesも何とかC#ソースから動的に生成出来ないかな。
画像ファイルのEXIFとファイルのタイムスタンプを相互に変換するようなのも作ったりしてますが概ね良好です。
結局「PowerShell結構スゴイんです」が故のメリットばかりなんですけどね。
何か面白いアイデアとかあったら是非教えて下さい。

最後になりましたが

あ、ほんとはミュージシャンらしいです。私。サンレコにも載ったから多分。
新譜出たばかりなのでヨロシクドーゾ。
bandcamp iTunes Amazon Spotify

2017/12/13

さよならスイッチさん(Goodby, Switch-San)


よりぬきスイッチさんに続きさよならスイッチさんもリリースと相成りましたので。
やはり一部の楽曲が「リリース時の言語設定」の問題でデジタル版で改題される為
今回はCDリリース時から英語に統一していました。原題にて紹介。

1. The Greatest Conflict

アルバムタイトルに「さよなら」を選んでしまったので
それに見劣りしない大団円なタイトル曲を、と色々悩んだ末の楽曲でした。
「偉大なる衝突」と名付けられたこの楽曲に込められている悪意については
<a href="http://blog.s1224.com/2017/10/the-greatest-conflict.html">こちら</a>を御参照下さい。

2. Rhythm Meister 2

私のファーストアルバム「電子の海」に含まれていた割と地味めなタイトルのブラッシュアップ版です。
ちょっとリズム思いついたぞ、程度で着手したのですが、案外好きな感じになりました。
先輩に聞いて頂いた所「これは!すごく良いから!歌があったほうが!」て言って頂けたのですが
何度やっても技術不足でしっくりきませんでした 自分でもそう思ったので本当に残念です

3. Chill Breeze

だいぶ昔に確かMOGRAさんでDJブースレンタルで遊ぶ為に
書き下ろしてみた作りかけの曲を、きちんと最初から作り直して完成させてみました。
「寒さ」だけがテーマの変わった曲だったんですが、普段使わないようなkickとか使ってみた結果
ぼちぼち寒そうになったので自分では御満悦です。
これも歌用意してたんですが……残念です。


4. 大戰

まだまだ日本語不勉強だなぁと(日本人なのに)思わされたのですが「大戦」というとほぼ全て世界規模の大戦の事を指すようです。
DDRのDEAD ENDだとか無双OROCHIあたりに多大に影響を受けている曲ですが、
「らしくない」楽曲が増えてきたのは一つ良さかなと思って気に入っています。
イントロの感じはむしろhattendamぽいかも?


以下、Antique/Legacy/Requiemの3曲がトライアド(連作)でして、
全て「死」「遺産」をテーマとした楽曲群なのですが、
「I」「You」「He(She)」という三者ではなく
もう少し複雑な視点の違いによる3曲となっております。


5. Antique

元はものすごくマイナーコードな曲だったのですが、
もひろんさんという先輩の結婚式でピアノ演奏を頼まれた為にメジャーコードで書き直した楽曲です。
Antiqueは「第三者」による視点で、いわゆる死者を見る/知る事もなく
受け継がれた物だけを眺めている、そういう作品です。

6. Legacy

Deemoでお馴染みになってくれた良い作品ですね。
Legacyがまさに直接的な「遺産」で、それも「遺された側」の物語です。
近い親族に故人がおられる方には割と理解が早いかもしれません。

7. Requiem

長い事リリースに至らなかった最後の曲で、根源のテーマ「死」そのものです。
「鎮魂歌」の示す通り、亡くなって召されるまで、の楽曲です。
前2曲はこの曲を書きたかったが為の前座で、この楽曲が私にとって
「遺書の代わりに遺されるべき作品」でした。
でこんな事言うとすぐ「死なないで!」「死ぬな!」て重めに受け取られがちなので
連作としまして、私は元気ですが死ぬ前に遺作を作っておきたいのです、と。
いわゆる私のお墓の前で泣かないで楽曲なんです。
ところで古時計の音とか入れようかと何度も悩んだんですがやめました。あざとすぎて。


8. The Measly Conflict

主題へ還る。もとい、偉大なる衝突と思い込んでいたそれは、
実は些細な事象でしたと。そういう締めでした。
実際に「トライトーンだらけの衝突しているコード」を少しずつ避けてあげて
何ら問題無くしてあげました。

2017/12/10

よりぬきスイッチさん ライナーノーツにかえて


M3-2016秋にてリリースして以来1年もかかってしまいましたが
よりぬきスイッチさんがついにデジタル配信開始となりました。
(近日中にさよならスイッチさんも予定しております)
iTunes GooglePlay Spotify Amazon Groove……あとなんだろ?
多すぎてよく分かってないので「Yorinuki Switch-san」で検索してみて下さい

各ストアの規約等に併せてたらアルバム名から曲名まで変更を余儀なくされ
アルバムアートも何度も作り直すハメになった為だいぶモチベーションが下がっていたのですが
ようやくお届け出来るに至りましたので
ライナーノーツにかえてそれぞれの曲の解説を「原題と共に」記載しておきます。

1. Status Quo 20XX

アレのアレです。(?) 1面。
……本当は「20XX年電子の海」というアルバムを用意していたのですが、
度重なるPCクラッシュ等でまともに形になってたのこれ1曲だけだったので
温存するよりリリースしていきたい、と思ってこうなりました。
実際人気の3/4面あたり未着手だったので
きちんと手をつけられるようになったら全部ちゃんとやりたいです。
20XX版Status Quoに関しては「これくらいカッコ良くなきゃダメだっただろ」と
反省点を手直しブラッシュアップしたつもりですのでお楽しみ下さい。

2. Tokiotraum (Nes)

Tokionachtという曲のリアレンジ版TokiotraumをFamitrackerで打ち込んでみました。
案外悪くないと思っていますが元々はFAMICOM MADNESというイベントにどうしても出たくて
初めてファミコン風を打ち込んだ次第でした。nsfになるのは本当に初めてじゃないかな。
他にリリースするタイミングも無かったのでよりぬきました。

3. Finalist

なんとかっくすの公募で落ちたやつだよ!これくらいじゃダメだよなやっぱ!
nanobeatには収録されましてボチボチの評価だった様子です。
分かってる人には分かってたみたいだけどhattendam technoの最新作で、
いいからeveryboy出せよどうなってんだよって怒られるとマジでグゥのネも出ない。
諦めてはおりませんよ、という意思表示ではあります。はい。この曲everyboyと別に作りましたし。

4. Megaera

Cytusに収録されているMegaeraという曲の完全版になります。
で、そろそろ時効だろって思うんで白状しますと、
割と普段からWIP版とかProtoとか言って未完成品出してますが、
MegaeraのProtoだけは脳内にあったのを完成後に追加で作りましたメンゴ
「最大限にゲーム音楽ぽいのを」て思って作ったのが
自分の想定を遥かに超えて評判良かったのでちょっと驚いています。

5. Dusk2d

Dusk2もほっぽらかしててスイマセン。やりたいことが多すぎるんだ。
Dusk2ProtoというCDに入っていた物よりもうちょっとブラッシュアップされた物になります。

6. Iscariot

十数年越しの恥のかき捨て。このリメイク版もnanobeat収録。
ちょっとシャワー浴びてたらコード進行浮かんじゃったんだよしょうがないじゃんって思うんだけど
実際打ち込んでみたら半音ズレてて「あれ戻れない!ヤバい!」とか泣きそうになってました 歳でしょうか

7. GAME START 2016 (Gadget Version)

Korg Gadget Kamataコンテスト受賞作品。マジか。

8. GAME START 2016

こっちが原曲。EDG 音撃-EDM IS GAME-の為の書き下ろし。
EDMゆーても歌モノ入れる余力が無いというか歌ってくれるようなオニャノコの知り合いがいないもんだから、
歌無くてもEDMっぽさが少しでも出るように努力しました。
GAME OVER 2009 -> GAME OVER 2010 からの連作のつもりでもあり、
ゲームのオープニングデモのつもりでもあります。

9. Legacy (Game Size)

Deemo。

10. Legacy 161030

161030版。
ほぼ完パケかしらと思っていた面もあったのですが、この後SONAR環境……PCが吹き飛び
かつ元の状態に戻せない重篤な障害が発生した為
この曲はもうこれ以上あまり編集されない可能性が高いです。遺憾。
……とはいえワークファイルは普通に残ってますので、
すげー褒められたりすげー言われたら1からやり直す事は出来るかも。音が出ないだけですんで。
で、Legacyという曲の解説は「さよならスイッチさん」で深く掘り下げる予定です……