HSSingLog / SING4DATASCIENCEプレイリスト

HSSingLog / SING4DATASCIENCEではSpotifyとYouTubeのプレイリストを公開しています。それぞれ歌評に埋め込んだ楽曲をまとめたものになりますが連続して聴くことが可能です。

  • 全てのコンテンツは合法的に収録されたもののみをピックアップしています。
  • 一部の例外を除き、基本的にカバーは収録していません。

楽曲は随時更新していきます。

YouTube

以下の埋め込みより順番に再生されます。もしくはプレイリストへのリンクをご利用下さい。尚、ミュージックビデオが存在する場合はビデオ→楽曲の順に登録してあります。コンテンツによってはYouTube Premiumへの加入が必要かもしれません。

Spotify

以下より再生可能です。プレイリストへのリンクも使用できます。尚、フルコーラス再生にはSpotifyの加入が必要になります。

PowerShell Core + イベント管理

これまで2002年より、Sakura-Conのゲストリレーションでスタッフをするにあたり、数々の技術を使用し、イベント計画などを立ててきました。過去には、Org-modeや小型のPythonスクリプトなどを使用してきましたが、今年は、PowerShell Coreを使用し、システムを構築しました。これまでに、PowerShellを使用して、多岐にわたるシステムを構築し、例えばカラオケ歌唱データの集計などがその一例で、他の領域での使用も検討していました。

目的

今回の目的としては、中核的なソリューションとして次を検討しました。

  • イベントスケジュールデータの集計と、可用性を高めたデータの作成。
  • カレンダーデータなどへの他の有用なデータ形式への変換の提供。

PowerShell Coreを選択した理由は以下のような理由からです。

  • LinuxとWindowsを使用している関係上、複数のプラットフォームで動作できる環境が重要でした。Androidで動けばなおプラスですが、この点に関してはUserLAndなどの環境を使用することで可能でした。(尚、Androidで使用する場合は、このようなキーボードの使用がおすすめです。
  • オフラインで使用可能なこと。イベント会場などではインターネット接続が劣悪になることがあり、インターネット接続なしでも使用できることが重要でした。

構成と内容

最初に作成したモジュールはスケジュールシステムより、データを取得するためのシステムでした。スケジュールシステムは、データを取得するためのAPIを持っておらず、この部分に関してはSeleniumを使用し、データを抽出しました。

Seleniumを使用したデータの抽出(守秘事項のため、使用しているソリューション名に関しては伏せてあります。)

Seleniumを使用してデータを取得するのには800件のエントリーで約30秒を要します。(実際に使用するデータはその8分の1程度。)SeleniumモジュールにおいてはUI上で必要な情報が存在している場所まで移動し、結果をDOMより抽出するようなものです。これはC#でプログラムしました。SeleniumはLinuxとWindowsでドライバが提供されているため、これはクロスプラットフォーム動作が可能です。(こちらは、Androidでは動きませんが、Androidで動作するドライバと対応するブラウザがあれば恐らく可能です。)

このシステムは以下のようなデータ構造を列として出力します。

   TypeName: SakuraCon.Relations.Data.Event
Name        MemberType     Definition
----        ----------     ----------
End Time    AliasProperty  End Time = EndTime
Event Title AliasProperty  Event Title = EventTitle
Start Time  AliasProperty  Start Time = StartTime
Equals      Method         bool Equals(System.Object obj)
GetHashCode Method         int GetHashCode()
GetType     Method         type GetType()
ToString    Method         string ToString()
EndTime     Property       datetime EndTime {get;set;}
EventId     Property       string EventId {get;set;}
EventTitle  Property       string EventTitle {get;set;}
Notes       Property       string Notes {get;set;}
Rating      Property       string Rating {get;set;}
StartTime   Property       datetime StartTime {get;set;}
Type        Property       string Type {get;set;}
Venue       Property       string Venue {get;set;}
Duration    ScriptProperty System.Object Duration {get=($this.EndTime - $this.StartTime);}

これに加え、以下のようなps1xmlを定義しました。

<Types>
    <Type>
        <Name>SakuraCon.Relations.Data.Event</Name>
        <Members>
            <MemberSet>
                <Name>PSStandardMembers</Name>
                <Members>
                    <PropertySet>
                        <Name>DefaultDisplayPropertySet</Name>
                        <ReferencedProperties>
                            <Name>Event Title</Name>
                            <Name>Venue</Name>
                            <Name>Type</Name>
                            <Name>Start Time</Name>
                            <Name>End Time</Name>
                            <Name>Duration</Name>
                            <Name>Notes</Name>
                        </ReferencedProperties>
                    </PropertySet>
                </Members>
            </MemberSet>
            <AliasProperty>
                <Name>Event Title</Name>
                <ReferencedMemberName>EventTitle</ReferencedMemberName>
            </AliasProperty>
            <AliasProperty>
                <Name>Start Time</Name>
                <ReferencedMemberName>StartTime</ReferencedMemberName>
            </AliasProperty>
            <AliasProperty>
                <Name>End Time</Name>
                <ReferencedMemberName>EndTime</ReferencedMemberName>
            </AliasProperty>
            <ScriptProperty>
                <Name>Duration</Name>
                <GetScriptBlock>($this.EndTime - $this.StartTime)</GetScriptBlock>
            </ScriptProperty>
        </Members>
    </Type>
</Types>

実際の運用では、このデータをClixmlとして出力し、後ほど読み込めるようにします。PowerShellではこれを可能にする便利なCmdletが用意されています。

$schedule | Export-Clixml schedule.xml

これを読み込むのも容易です。

$schedule = Import-Clixml schedule.xml

これにより、出力されたXMLは取得したデータのスナップショットになるので、オフラインでのアクセスが可能になります。

このデータをもとに、CSV (スケジュール情報等を集計するのに使用) する他、iCalendarなどのフォーマットを出力し、Google Calendarに入力することが可能になります。

このデータ構造により、Where-Objectを使用することにより、必要な情報を取り出すことができるようになります。例えば、「6C」で行われるイベントを知りたい場合は以下のようになります。

$schedule | ?{ $_.Venue -eq "6C" }

これに加え、以下のようなスクリプトを組み合わせました。

function Get-ScNextEvent {
    param(
        [parameter(Mandatory = $true, ValueFromPipeline = $true)]
        $Schedule,
        [parameter(Mandatory = $false)]
        [uint] $Hour = 1
    )
    $result = $Schedule | Where-Object { ($_.StartTime -ge [DateTime]::Now) -and ($_.EndTime -le [DateTime]::Now.AddHours($Hour))}

    return ($result | Sort-Object StartTime)
}

function Get-ScCurrentEvent {
    param(
        [parameter(Mandatory = $true, ValueFromPipeline = $true)]
        $Schedule
    )
    $result = $Schedule | Where-Object { ($_.StartTime -ge [DateTime]::Now) -and ($_.EndTime -le [DateTime]::Now)}

    return ($result | Sort-Object StartTime)
}

これにより、次のイベントや、現在進行中のイベントに関する情報を検索することができます。

他の分野でのPowerShell Coreの使用

PowerShell Core`はスケジュール管理以外の分野でも使用しました。他の部分で使用したのは定形文書を生成する管理システムです。ほとんどの定型文書はLaTeXソースとして生成されているため、コマンドラインより、パーソナライズされた情報を読み込む形式になっています。PowerShellはCSVをデータ構造に変換する仕組みを持っているため、必要な引数はCSVでまとめました。

Windowsでのコマンドラインの文字列の扱いには難があるため、これをWindowsで実行する場合にはWindows Subsystem for Linux (WSL)を使用する必要がありましたが、PowerShell CoreはLinuxでも動作するため、同じモジュールやスクリプトをそのまま使用することが可能でした。

これにより、20通を30秒程度で生成できます。

まとめ

PowerShell Coreにより、クロスプラットフォームな、一貫した環境をリレーション部内で使用する必要のある一部の情報の処理で使用しました。

今後はこのシステムを拡張し、スケジュールの競合探知、負荷確認や人員管理などにも適用できるようにしていく予定です。

なぜInboxよりもGmailが使いやすいか

ここ半年ほどInboxを使ってきましたが、Gmailの方が使いやすいな、と感じる部分がいくつか。ちょっとまとめてみる。

Inboxでの利点

Inboxのナビゲーション自体は良く出来ていて、全体的には使いやすいと感じる。添付ファイルなどが入っているとそれが大きく表示されるし、また全体的に使っていてより楽しいのがInbox。

処理的にもかなり意欲的な出来であり、メールの扱いのやり方を変えよう、という発想があるのは面白い。

短所と感じる部分

でも使っていて、使いにくいと感じる部分も多い。ほとんどがGmailで出来て、Inboxで出来ないことなので、かなり惜しく感じてしまう。

アドレスごとの署名管理がない

InboxではGmailと同じように複数のメールアドレスを管理できるのだが、Inboxには他のアドレスを使用した場合に、署名を切り替えることができなくなっている。コンベンション用など使い分けているのでこれができないのは非常に致命的。

HTML形式がデフォルトで変更できない

Inboxは送信メールはHTML形式がデフォルトであり、切り替えることができない。Gmailにはテキストメールへの切り替えができるようになっている。妙なメタデータが紛れ込んだりするので、できるだけHTMLは送信しないようにしているのでこれはかなり不便だったりする。

ソース表示ができない

これは多分99%の人には関係ないのだろうけど……。Gmailのメールはソースを見ることができないので、ヘッダの確認などをすることができない。微妙なメールが届いた時にざっと確認する場合もあるので、是非欲しいところなんだが。

変更ができない言語に依存した返信ヘッダ

これも煩わしい問題。Gmailで返信をすると次のようなヘッダが追加される。

2016-02-17 13:26 GMT-08:00 John Doe <johndoe@example.com>:

これをInboxですると次のような感じになる。

2016年2月17日(水) 13:26 John Doe <johndoe@example.com>:

なぜGmailの方が優れているかというと、受取人の言語に依存しないから。受け取る人が日本人であろうと、あメリカ人であろうと全く問題がない、言語非依存の形式お使用しているのがGmail。Inboxの場合、日本人しか読めない。せめて形式を指定できればいいのだが。

まとめ

上記を書いた後に考えると、恐らくInboxが想定しているのは読むのが主で、カジュアルなユーザーなのかな、と。Gmailにある機能がInboxに入るかその逆があればすごいいいと思うのだが……。

Google Chrome、Linux下での速度問題のまとめと回避方法

(2016年2月22日更新)この問題を修正する変更が開発者により行われ、すでにソースコードに取り込まれています。この変更が実際のリリースに適応されるのにはしばらく時間がかかりますが、近いうちに修正が入るものと思われます。

最近のGoogle Chromeに、すでに何件か報告されている問題で最近原因が解明されたものがあり、その問題と取り敢えずの対処法に関してまとめます。

どういう問題なのか

Google Chromeのアドレスバー(Omnibox)の入力レスポンスがものすごく遅くなります。スペックにもよりますが、具体的には一文字入れるとそれが出てくるまでに数秒を要する、といった具合です。極端な場合には多大な遅延のせいで、入力される文字の順番が入れ替わってしまう場合もあります。(例えば、google.comと入力したつもりがgogole.cmoとなるなど)

また、インターフェース自体の再描画も全体的にもっさりとするため、メニューを開くのに遅延が出るなどの問題が発生し、全体的にGoogle Chromeメインプロセスが消費するCPUが高くなる傾向にあります。

原因は?

バグが報告されていたものの最近までその原因は特定はされていませんでした。1月6日にChromiumプロジェクトのKochi氏がこの問題がフォントのキャッシュがフォントのフォントファミリー名による参照によりキャッシュされていないとみなされ、再キャッシュプロセスが発生してしまうのが原因で発生しているということが報告されました。

つまり、まとめると以下のようになります。(Kochi氏が指摘する源ノ角ゴシック JPを使用した場合)

  • Google Chromeが源ノ角ゴシック JPを使用してフォントをレンダリングしようとする
  • Google Chromeが源ノ角ゴシック JPを使用しようと、そのフォントファミリー名のSource Han Sans JPで参照しようとするが、キャッシュされていないと見做し、キャッシュ動作(非常に重い)が発生する

というようなプロセスが発生し、これが一文字入力されるごとに発生していた、という問題のようです。

尚、上記に併せ、同氏によりコードの修正レビューが提出されていますが、すでにこの修正を含む、書き換え自体が予定されていることもあるようで、パッチとしての適応はされないようです。そのため、根本的な解決にはしばらく時間を要すると予想されます。

回避策

根本的な解決はコードに対処が入るまで行わられないものの、取り敢えず回避することは可能です。基本的にフォントのファミリー名が問題にならないフォントを使用すればいいわけです。尚、こちらで実験したところ、IPAフォントとその亜種ではこの問題が発生してしまうようです。(日本語環境ではこれらが指定されていることも多いでしょうから、この問題にあたってしまう人も多いかもしれません。)

回避方法

前述のように、この問題の影響の受けないフォントに置きかえてやるのが回避する方法になります。Gnomeを使用している場合、gnome-tweak-toolを使用し、UIが使用するフォントを問題のないものに置きかえる必要があります。gnome-tweak-toolは標準ではインストールされていないので別途インストールが必要です。

KDEの場合kde-config-gtk-styleをインストールした上で、外観設定の中のGTK設定のフォントを変えることで対応できます。

KDE GTK Config

フォント設定を例えば、Noto Sans CJK JPなどに置き換えることで対応可能です。

フォント設定

この変更を行い、右下の適応ボタンを押すことで変更が保存されます。尚、Google Chromeに対し、この変更を有効にするためには変更した後に、Google Chromeを再起動する必要があります。

あけましておめでとうございます

あけましておめでとうございます。こちらではまだあけていませんが。

今回も紅白の同時放送を見ていました。去年はGoogle+のコミュニティを使用して独り言などを流していましたが、今年はHidekiBinを使用しました。
当該ペーストは一年で消えますので、PDF版も保全。
第64回紅白歌合戦視聴ログで見られます。(ChromeのPDF保存機能が便利。)

Steamアップデーターの文字化け

SteamのLinux版、更新ダイアログが文字化けするのが少し気になる。もっとも文字化けしているのはアップデータと一部ゲーム(Portalなど……ただ、こちらはBetaなので)で使う分にはあまり問題ないけど。
Screenshot_from_2013-05-31 20:51:26

自営WordPressでのアクティビティ

最近、自営Wordpressのアクティビティを上げているのは各種ソーシャルサイトのポリシーに対するヘッジもあるのだがJetpackなどの機能が充実してきているのと、APIを使用するモバイルクライアントの出来がなかなかいいのが大きな理由でもある。

コンベンションとリュック

コンベンション中には大容量のリュックとウェストポーチを使っているが、実はコンベンション中、スタッフとして移動する場合、コンベンションセンター内やその周辺(コンベンションセンターとホテルの間など)を移動することになるため、必然的にこのような装備になる。

数年前、リュックの代わりにメッセンジャータイプのバッグを使用したことがあるけど、二日目で肩が痛くなった。

ちなみに中には何が入っているかといえば、各種書類やノートPCなどが入っているため、重量はそれなりになる。ノートの代わりにタブレット、というような感想もあるだろうけど、必要に応じて書類の更新や、スケジュールの調整なども行ったりするため、タブレットだとかなりやりにくい。