読者です 読者をやめる 読者になる 読者になる

仕事の備忘録

IT系技術とか、カスタマーサービスとか

ローソンチケットの電子チケットアプリ問題と星野源コンサート初日状況報告

私は星野源のファンである。けど今回はこれを書いておく。

ローソンチケット電子チケットアプリの国際SMS送信問題 #ローチケ #電子チケット - Togetterまとめ @lawson_ticket

今回YELLOW PASSという転売防止対策を評価していたのに実装とクレーム後の対応で台無し。アーティスト側の思いをシステム構築で踏みにじるとはSIerとして残念だよ!

2017/05/18 20:23

今回の電子チケットによるトラブルについては上記まとめが詳しいのであるが、途中で情報セキュリティ問題などで著名な独立行政法人産業技術総合研究所 高木浩光氏がローソンアプリを調査したうえで「YELLOW PASSってなんだわからん」と書かれていたので、説明と合わせて今回の源電子チケットアプリに至るまでの流れも書いておきたい。

私はファンで、CDやDVDはもちろん買うがコンサートも当たれば行きたい。しかし昨年は3回申し込んで1度も当たらなかった。いま日本有数でチケットの取りにくい人気者である。しかし星野源には現在ファンクラブは存在しない。代わりに、先行チケット販売などを行う専用サイト「YELLOW PASS」へのログインアカウントなどが付いてくるファン向け雑誌が存在する。年に1回発行する予定の『YELLOW MAGAZINE』がそれで昨年第1回が発行された。この雑誌を私も早速購入して「YELLOW PASS」にて最新コンサートツアーであるContinuesのチケットを取得できた。対象端末を持ってないので紙チケットを選択した。

www.hoshinogen.com

今回の星野源コンサートにおいては、従来の紙チケットとあわせて電子チケットが初めて導入された。下記URLはFAQサイトであるが、紙の場合には写真付きの公的身分証明書が必須である。一方電子チケットは原則不要となっている。アプリで電話番号での認証を行えるためだと思われる。

LIVE TOUR 2017『Continues』 - 特設サイト

なぜここまで身分証明が厳しいかというと、星野源の所属する事務所アミューズが、いわゆるチケット転売での諸問題に対して積極的に反対しているためである。下記が転売反対の公式サイトで、公式転売サイト「チケトレ」が5月に稼働開始されている。

www.tenbai-no.jp

もともとアミューズはサザンオールスターズなどで厳しく対応されていたのであるが、星野源においては前回まで本人チェックはなかった。しかし今年1月に開催されたコンサート「YELLOW PACIFIC」において、2日間1万人の客席に対して、事前に身分証明書の提示を必要とすることを告知し、そのうえで当日紙チケットにて身分証明書のチェックを行った。そして転売で取得したり、家族が子供を申し込んだなどを含む名義不一致をすべて入場させない対応をしたことがわかっている。

これより「会場のキャパ5000のうち、今日は700ぐらいが空席だった」とのツイートを一時期公式アカウントが「いいね」していたのをファンが多数確認しており、実際に参加されたファンも空席が目立つことを驚いていたし、親が子のチケットを取得する際に親名義にしていたことで、入場できなかった事例もでていた。これだけの強い姿勢をみせていた前回があるため、今回のコンサートも同様になることは、ファンや転売屋なら予測している状況であろう。

そんななか、今回の電子チケットには身分証明不要以外に非常に魅力的な機能が付いていた。それが公式に転売可能になる仕組みの提供であった。

前述のとおり身分証明を厳しくしたことで、紙チケットは申し込み名義者以外は絶対に入場できないことになっている。これによって転売は減るが、一方都合がつかなくなった場合転売も出来ずそのまま空席になっていた。ファンにとって金銭的にも心理的にも悲しい思いしか残らない。しかし今回の星野源の電子チケットは、参加できない場合にリセールを行えるようにするとの案内がでた。この発表にファンは大変喜んだ。

アーティストがのぞむ転売屋を介さず、ファンに譲ることができて、まだ手に入ってないファンにとっては、日本有数の人気者、星野源のチケットを手に入れるチャンスが増えるということでもある。

星野源のチケットはローソンチケットが独占だった。転売は前述のチケトレではなくローソンチケットでの対応となっていた。そして5/11に紙および電子チケットの配布開始とあわせて転売(リセール)方法が発表された。

http://continuestour.amuseblog.jp/continuestour/2017/05/live-tour-2017c-4be0.html#page_content

これの配布にて電子チケットを選択したファンがアプリを導入しようとしたところで、今回の海外SMSによる高額課金が発生したことになる。システム的な問題としてはローソンチケット側が仕様を変更したことでユーザーへ様々な問題や認証費用を押し付けた形であり、正直この設計を良しとした関係者は「ファンの思いを利用してファンに費用を転嫁」したかったのだろうと思われる。違うのなら、こんな設計でよしとはしないだろう。

5/21より、このチケットを使ったコンサートが開始される。現状が改善していない状況できちんと全員がチケットを取得できるのかを一番心配した。

続きを読む

Power BI Free(無料版)では共有機能が2017/6/1から使えなくなる

前回書いたPower BI Report Serverの件の後、MSからPower BIユーザに対してメールが届いた。そこにはムッシュ小澤さんのブログにも書かれていたPower BI Free(無料版)についてのアナウンスが。

「データソースのアクセスや容量制限がProと同等になります。」

おおー!いままでファイルしかダメだったのにDBとかも使える!と喜んだら

「ダッシュボードの共有機能に関しては使用できなくなります」

( ;∀;) ああやっぱり・・・・

実は小澤さんが紹介されていた本家MSブログには、FreeとProの位置づけを明確にする一環で、アプリ機能は一緒にしてコラボレーション機能をProのみで使えるように変更することが明記されていた。

powerbi.microsoft.com

f:id:testedquality:20170510220108j:plain

この言葉は、情報共有のことすべてに当てはまる。前回すでに表示されていたアプリ機能を早速試したが、利用者設定ができるものの閲覧しようとするとFreeアカウントは「Pro以上の方のみ利用可能です」と出てきて使えないのであった。

◇再現手順

①Proでアプリを作成すると下記のように左メニューに表示される。クリックすると右にアプリで作成したコンテンツがが出てくる(赤い丸部分は作ったアプリ)

f:id:testedquality:20170510222916j:plain

②グループ設定でワークスペースの利用者を設定できる。このときFreeアカウントも設定可能。管理者がProアカウント。メンバーがFreeアカウント。

f:id:testedquality:20170510223608j:plain

 

③②の状態でFree版のアカウントで見ると、ワークスペース内にアプリ用のワークスペースが表示される。これはアプリがワークスペース単位のためと思われる。

f:id:testedquality:20170510221610j:plain

③クリックすると下記が表示されて使えない( ;∀;)

f:id:testedquality:20170510221217j:plain

 

ということで、この状況から1月ごろに掲載した情報共有方法が使えなくなる可能性が高い。

testedquality-tech.hatenadiary.jp

当面はProの試用版で運用しつつ予算確保してもらうしかないかと思うが、Premiumが出た時点で改めて社内サーバ構築も視野に入れる必要がでてきた。とはいえ、一方DBへのアクセスが無料版で出来るようになるのはとても良いことである。これでExcelにはない便利さやVisualの力を伝えやすい。6月が楽しみである。あ、もう少ししたらBulidが始まるが話題がでるかもしれない。

Power BI Report Server でPower BI サービスがオンプレミスにて提供可能に?!

本日SQLServerの神様、ムッシュことMicrosoft MVP for SQL Server である小澤 真之さんのツイートにて「Power BI Report Server 」という製品情報が流れていることを知った。早速小澤さんのHPを確認。

Power BI Report Server についての情報 at SE の雑記

Power BIの弱点であるオンプレミス稼働ができない点がついにこれで解消?!

2017/05/04 20:15

自分の仕事において、セルフサービス BI(Business Intellegence)はこの数年非常に案件が多い。そこで導入検討時、Power BIと比較対象になるのは、大体の場合Tableau社が提供するセルフサービスBIツールである「Tableau」である。

www.tableau.com

仕事で両方とも使っている。単純にユーザーとして使うのが楽しくなるという点で、双方いい製品だと思う。しかし、Power BI をTableauと比較提案するとき、お客様の要望でPower BIを提案できない場合があった。

それが「サーバを含めすべて社内でサービスを完結してほしい」オンプレミスでの利用だ。クラウド上にサーバを構築することがポリシーで出来ない場合だけなら、社内サーバを設置し、以前紹介したPower BI Embeddedを使う方法もある。

testedquality-tech.hatenadiary.jp

 しかしサービス全体を社内のみしか許可しない場合、この方法はとることができない。Power BI EmbeddedはAzure上にレポートを配置するため、どうしても社外と通信が発生する。

このような要望を時代遅れという意見もあるが、これは通信網がきちんとしている場所であることが前提で、例えばアジア各国ではまだまだ通信網は弱く、大量のデータ通信は難しい場合も多い。また、仕事内容によりセキュリティ優先で難しいときもある。なによりお客様の要望に応えるのが仕事であるので、今まではオンプレミス利用が可能な「Tableau Server」を提案せざるを得なかった。個人的にはMicorsoft ファンであるので悔しい思いをしていたのであるが、ここで「Power BI Report Server」がアナウンスされた。

powerbi.microsoft.com

確かに「オンプレミスで BI 環境を構築し、組織のファイアウォールの内側でレポートを配布します。」という文章が掲載されている。ついに!という感じだ。ただし読むとPower BI の体系が変更されて「Power BI Premium 」というレベルの時に使えるようになるようだ。

すでにホワイトペーパーが提供されており、そこで出てきた「Power BI Apps 」はすでにPower BI のメニューに追加されていた(「アプリ」と書かれている)

f:id:testedquality:20170504222137j:plain

Premiumと合わせて近日公開予定のため、随時確認する。今までの試算用資料も書き直しだけど、うれしいので頑張る。

ログイン時のhttpsはお願いだから必須にしてほしい

先週「e+」という大手チケット販売サイトがログイン設定を全員設定しなおしてくれというメールを出した。手元にも届いており週末再確認することにしていたが、今週TL上で話題になっていた。TLを辿ると、どうやらログインサイトがhttpのままだったことで
フィッシングサイトではないかと話題に。  

 どうやら現行では機能によりhttpとhttpsがログイン時混じっているらしいが、確認したところ今回はhttpしか使えないとTL上でも報告があり、私も確認した。また案内ページ自体がhttpとなっている。

 
産業技術総合研究所情報セキュリティ研究センターにて主任研究員である高木浩光氏がe+に確認したところ、問題ないとの返答があったらしい。

 しかしhttpのままでは通信が途中で改ざんされていれば、偽サイトと区別はつかない。そのため各ブラウザではhttpでの通信時のログインを警告する仕様となっているのだ。

 2005年にはすでに「SSLを入力画面から使用しないのはそろそろ「脆弱性」と判断してしまってよい」という記事が前述の高木浩光氏より書かれ話題となった。

高木浩光@自宅の日記 - SSLを入力画面から使用しないのはそろそろ「脆弱性」と判断してしまってよいころかも, クレジットカード業界は最もWebセキュリテ..

それから12年、すでに各ブラウザはhttpであることで警告表示をするようになっている。Chromeの場合「保護されていません」の部分をクリックすると「機密情報を入力しないでください」と書かれている。

 

この状態で「問題ありません」と言い切れるご時世ではないことをeplusは認識したほうがよいのではないか。(系列サービスにセゾンカードがあるのだが・・・)

ただ騒ぎになっていたからか、本日4/13 23:00確認したところhttpsが使えるようになっていた。自分でhttpsと打てば利用可能。

これですこしは緩和されたが、大多数の方のためにも、お知らせページもhttpsに直してもらいたいところ。またメールから直接リンクしている方のためにhttpsにリダイレクトまでしていただければと思う。

祝!Microsoft Cognitive Services: Bing Speech API の一般提供開始

Micorsoft Azureからのメールで、ついにMicrosoft Cognitive Services: Bing Speech API の一般提供開始 が始まったことを知った。先月より予告は出ていたが月末近くになっても連絡がこなくて心配していたのであった。

azure.microsoft.com

Bing Speech API は文字起こしをするためにちょうど利用しようとしているところであり、ffmpegで前準備の記事を書いてるところであるが、プレビュー時点でも商用利用が多数行われている人気のAPIである。

音声の認識

testedquality-tech.hatenadiary.jp

 ちょうど先週富士通SSLより発表された「FUJITSU Software LiveTalk」にてもBing Speech APIが利用されている。

www.fujitsu.com

一般提供になったことで一番の違いは「99.9% の可用性が保証」されること。こちらにSLAが記載されているがプレビューでは可用性が保証されていないのだ。

azure.microsoft.com

製品やサービス展開するための安心が付与されたことで、これから国内でも積極的に使われると思われる。

 

ffmpegとC#を使って指定秒数の音声ファイルを作る 2.連続分割処理

前回の設計から、CSVファイルを読み込んたので、mp4ファイルを分割する。

testedquality-tech.hatenadiary.jp

 ffmpeg.exeをそのまま利用するため、DOSで呼び出すことが必要。実際にffmpeg.exeを使うと分かるがそれなりの処理時間と出力が伴う。コマンドラインとしては下記のようになる。

例:ffmpeg -ss [開始位置(秒数)] -i [元動画] -t [切り出す秒数] [新しい動画]

ffmpeg -ss 0 -i C:\Uni\SourceMovie\K_111.mp4 -t 120 C:\Uni\DestFile\K_111\output01.mp4

前回読み込んだdataListのデータをそのままループさせて、ffmpegを呼び出しmp4ファイルを指定秒数に切り分ける連続処理を実施する。

-----------------------------------------------------------------------------------------------------------

var dFolderPath; //分割ファイルを置くフォルダ

var sSplitMinFilename; //CSVファイルパス

var dataList = setCSV(sSplitMinFilename); //前回説明したファイル読み出し

               foreach (CSVData c in dataList)
                    {
                        //ffmpegを呼び出しmp4ファイルを指定秒数に切り分ける
                        var dFileName = dFolderPath + "\\" + c.Name + "_" + c.Id.ToString() + ".mp4"; //出力ファイル名
                        var arguments = string.Format("-ss {0} -i {1} -t {2} {3}", c.startsec.ToString(), f, c.vframessec.ToString(), dFileName);

                        var process = Process.Start(new ProcessStartInfo("ffmpeg.exe", arguments)
                        {
                            CreateNoWindow = true,
                            UseShellExecute = false,
                        });
                        process.WaitForExit();
                        //プロセスが終了したか確認する
                        if (process.HasExited)
                        {
                            WriteLine("処理正常終了:01動画切り出し:" + c.Name + ":" + c.Id.ToString()); //ログ画面にエラー出力
                        }
                        else
                        {
                            WriteLine("プロセスが終わってない!ファイル作れなかったかも!強制終了しとくね。" + c.Id.ToString() + ":" + c.Name ); //ログ画面にエラー出力
                            process.Kill(); //強制終了
                        }
                    }

-----------------------------------------------------------------------------------------------------------

実際にファイル分割が完了したら、音声ファイルにさらに変換する。分割と音声変換を連続して命令することも可能であったが、読み込んだCSVファイルの指定自体が間違っていた場合の再処理を考えて、一度mp4分割のみを完了させることにした。

音声に変換する場合には上の//ffmpegを呼び出しmp4ファイルを指定秒数に切り分ける と書いた部分について以下のように変更となる。ここでのポイント「pcm_s16le」は音声の劣化をさせないような変換となる。これはAPIでの文字起こしをする場合を考慮してできる限りよい状態を保持するようにするためである。

例:ffmpeg -i [元動画] -acodec pcm_s16le [取り出す音声]

ffmpeg - i C:\Uni\DestFile\K_111\output01.mp4 -acodec pcm_s16le C:\Uni\DestFile\K_111\output01.wav

-----------------------------------------------------------------------------------------------------------

//ffmpegを呼び出しmp4ファイルを音声ファイルwavに変換する
                        var dFileName = dFolderPath + "\\" + c.Name + "_" + c.Id.ToString() + ".mp4"; //変換ファイル名
                        var dwavFileName = dFolderPath + "\\" + c.Name + "_" + c.Id.ToString() + ".wav"; //出力ファイル名

                        var arguments = string.Format("-i {0} -acodec pcm_s16le {1}", dFileName, dwavFileName);

-----------------------------------------------------------------------------------------------------------

ちなみに、音声ファイル変換時エラーが発生する場合があった。これは単純に音声が記録されてなかったためであった。

ということでこんな感じでファイルが分割され、wavファイルも作成できたので文字起こしの準備が完了した。

同じファイル名で.jpgも作っている。指定秒数の先頭の画像を切り出してみた。

例:ffmpeg -ss [秒数] -i [動画] -vframes [フレーム数] -f image2 [出力ファイル名]

頭出しのサムネイルとして使うつもりだったが、Cognitive Servicesの別APIで使ってみることにした。

ffmpegとC#を使って指定秒数の音声ファイルを作る 1.ざっくり設計

前回ffmpegを使ってDOSコマンドで音声変換を行った。その話を会社でしたら、ある動画からの文字起こしを自動的に行いたいという要望がやってきた。

testedquality-tech.hatenadiary.jp

 文字起こしというのは、インタビューなどの会話を録音し、あとから文字として文書化することの総称。結構な手間がかかり専門の業者がたくさんある。そしてこちらでは専用アプリでの音声文字変換による支援サービスを提供中。

voxt.jp

この会社が行っているような、自動化をもっと手軽に自社でできないかという相談だ。これができるようになると、自分の周りで行っている通常の電話応対や、インタビューなども文字起こしして、検索データベース化したり、資料保存の作業低減ができるかもしれない。そんな気持ちから対応することになった。

前回試してみた「Bing Speech API」を使うとなると最大2分までしか一度に翻訳できない。そうなるとバッチコマンドを並べて一括処理でAPI最大処理分数である2分の動画を切り出せはよいと考えたが、実際にバッチで切り出してみたところ、話の途中で切れると、API側で話の前後の内容が正しく理解できず変な文章が戻ってくる。

イメージとしてはYoutubeで自動文字起こしがついているとき。多分あれもgoogleの日本語文字起こしが自動的に行われている。動画の登録時のオプションで設定できるのだが切れ切れの文字起こしはわかりづらい(この場合話し言葉を聞き取れてないのもあるのだが)サンプル動画はこちら。

www.youtube.com

Youtube.comのサイトにて動画を見ると画面左下のメニュー「その他」の中に「文字起こし」というメニューが出てくる。これがgoogleが自動文字起こしをした結果を表示させている。

 

これを見る限り、文として完結している、読点が付いた秒数で音声ファイルを切り出さないといけないことが分かった。単純に2分毎に切断というわけにはいかないのであった。当たり前なのだけど、APIに処理させることばかり考えてた。反省。

まずは後から秒数を指定できるように、秒数をインプットで可変で対応できるようにしてffmpegで指定秒数切り出しを実施することにした。前回バッチプログラムを出力する方針にしていたが、自動的に切り出すプログラムを作るように変更する。

秒数のインプット形式はCSVにすることを決めた。今回仕事の依頼者がサーバ持ってなかったので手軽な方法を選択。CSVをC#で扱う手段は調べたらたくさんあったが、.Net 2.0の方法などが検索上位に出てくる。やりたいことはできるが納得いかず。ググった末に見つけたのは、NuGet取得できてメンテナンスもされてて初心者な自分でも使いやすかったこちら。ありがたしLINQ to CSV。

devlights.hatenablog.com

 ffmpegはDOSでの処理を行っている。DOSをC#から使う方法は検索したところ、ffmpegを使ったサンプルがすでに書かれていたのでありがたく参照。

blog.shibayan.jp

 これでやりたいことはできそうな見通しが立ったのでプログラムを書くことにした。

★インプットのCSV設定

CSVには切り出す秒数の開始時点と、そのあとの秒数を設定。前2つはDB化した場合のキー項目、ファイル名と連番を指定。

「きちんと順番に項目を並べてないのは気持ち悪いぞ!」と自分でも思うがプログラムしながら項目並べたらこんな感じに。LINQ to CSVを使えば項目指定もできるので不便はそこまで感じない。

こんなクラスを準備して、指定CSVを読み出すメソッドを下記のように準備できる。ありがたい。
    class CSVData
    {
        [CsvColumn(FieldIndex = 1)]
        public string Id { get; set; }
        [CsvColumn(FieldIndex = 2)]
        public string Name { get; set; }
        [CsvColumn(FieldIndex = 3)]
        public int startsec { get; set; }
        [CsvColumn(FieldIndex = 4)]
        public int vframessec { get; set; }

    }

   

/// <summary>
/// asa 処理ファイル作成
/// </summary>
/// <returns>List型のCSVデータセット</returns>
/// <param name="csvpath">読み取るCSVファイルパス</param>

    private List<CSVData> setCSV(string csvpath)
        {
            //
            // LINQ to CSVのサンプル.
            //   元ネタ: http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library
            // 
            // LINQ to CSVはNuGetでインストールできる.
            //   Install-Package LINQToCSV
            
            // コンテキストを構築.
            var context = new CsvContext();

            //
            // CSVの情報を示すオブジェクトを構築.
            //
            var description = new CsvFileDescription
            {
                SeparatorChar = ',',
                FirstLineHasColumnNames = false,
                EnforceCsvColumnAttribute = true,
                TextEncoding = Encoding.UTF8
            };

            //
            // 読み取り.
            //
            var dataList = context.Read<CSVData>(csvpath, description).ToList();

           return dataList;

        }

.