IRroid 恋の有効フロンティア(恋フロ) 用株価配信プログラムを作った

今日のテーマ

IRroid 恋の有効フロンティア(恋フロ) というスマホゲームに最適化した株価配信プログラムを作りました。

ソースコードGitHubで公開しています。
手元で試してみたい、カスタマイズしてみたい、という方は、readmeを参考にして動かしてみてください。

github.com

こちらで試験公開中です。
当面は運用を続ける予定ですが、予告なく終了する可能性があります。
あらかじめご了承ください。

IRroid 恋の有効フロンティア(恋フロ) とは

koifro.com

金融情報ベンダーのQUICKが運営する、 株式投資シミュレーションゲーム
やたらとバグが多い。
投資対象の企業は擬人化されていてかわいいです。

ゲーム内株価は、20分前の株価が反映され、5分ごとに更新されます。
もちろん現実ではリアルタイム株価を取得可能です。
あとは、わかりますね……?

プログラムでやっていること

config.rb でデータの保存先を指定します。
irroid_init.rb で株価を取得する銘柄を指定します。
irroid.rb を定期的に実行し、プログラム実行時点での株価を取得します。

取得した株価データはcsv形式で保存しています。
付属のhtmlを用いると、csvを表形式でブラウザから確認することができます。
表の描画には、csv2tableライブラリを用いています。

こんな感じで見ることができます。
f:id:yu3mars:20170207235825p:plain

実運用では、Linuxサーバー上でcronを使って定期実行しています。
irroid_init.rb を前場開始前に1回、 irroid.rb を取引時間中5分に1回実行しています。

使ってみた結果

週間ランキング上位常連になりました!!!
1周年記念大規模リニューアルの結果金持ちに辛い仕様になったので辞めました。

終わりに

恋フロプレーヤーの皆様、よければ使ってみてください。
エンジニアの皆様、プルリク歓迎します。
投資家の皆様、本当の株取引には役に立たないと思います。
それはそうと、IRroidの本が出ているそうです。

Amazonアソシエイト・プログラムに参加申請してみた

先日、Amazonアソシエイト・プログラムに参加申請してみました。
当サイトが承認されるまでの流れを、簡単にメモしておきます。

申請の流れ

利用するサイトを準備する

まずは、Amazonアソシエイト・プログラムを使うホームページ・ブログを用意します。
今回はこのブログで申請しました。
ちなみに投稿時点での当ブログの状況はこんな感じです。
開設からの日数: 約4か月
投稿数: 17
アクセス数: 月1000

Amazonに申請する

次にこちらからアカウントを作成します。
Amazonにログインしていると、その情報を勝手に設定してくれるようです。
今回はいつもAmazonで使っているアドレスを使って設定しました。
基本的に、聞かれた質問に素直に答えていけばいい、はずです。
サイトでどのようにAmazonアソシエイト・プログラムを使う予定か、という質問がありますが、 記述例と同レベルの小学生並みの回答をしました。

affiliate.amazon.co.jp

申請から3日後、承認されたとのメールが届きました。
早いですね。

利用していることを宣言する

承認されたら、利用規約に書いてあるように、Amazonアソシエイト・プログラムを利用していることをサイトのどこかに明記する必要があります。
Amazon アソシエイト(アフィリエイト)
というわけで、宣言してみます。

当サイト(yu3mars' diary)は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

Amazon.co.jpアソシエイト、とだけ書いておいても大丈夫みたいですね。

使う

あとは、実際に自分のサイトで使うだけです。

実際に貼ってみた

こんな感じです。

アイドルマスターシンデレラガールズ ドット絵 2017新年Ver

あけましておめでとうございます。
今年も当ブログをよろしくお願いいたします。

今年は2017年ということで、
昨年描いたデレマスドット絵をアレンジしてみました。
2017年にちなんで、17の形になっています。

【アイドルマスターシンデレラガールズ】「アイドルマスターシンデレラガールズ ドット絵 2017新年Ver」イラスト/yu3mars [pixiv]

デレマスのドット絵・ドット絵ができるまで

この記事は KMCお絵かき アドベントカレンダー 9日目の記事です。

www.adventar.org

8日目の記事は、id:kebusKMC さんの 【KMCお絵かきAdventCalendar】 楽園の守り手たる巫女 - kebusKMC’s diary でした。

kebuskmc.hatenablog.com

今日のテーマ

アイドルマスターシンデレラガールズドット絵を描きました。

【アイドルマスターシンデレラガールズ】「アイドルマスターシンデレラガールズ ドット絵」イラスト/yu3mars [pixiv]

例によってポケモンGBA風。
シンデレラプロジェクトのアイドル+木村夏樹です。
衣装はアニメ2nd OP「Shine!!」のクリスタルナイトパーティです。

これだけで終わってもよいのですが、せっかくなので、ドット絵ができるまでを紹介します。

制作環境

OS Windows 10
使用ツール(ドット絵制作) EDGE
使用ツール(ドット絵加工) ImageMagick

まず、EDGEというお絵かきソフトでキャラクターを一人一人描きます。
描き終わったら、ImageMagickという画像編集ソフトを使い、公開に適した形に整えます。

EDGE

ドット絵を描くのに便利なソフトです。

takabosoft.com

今回は、衣装と顔は全キャラで使いまわしました。
髪型と色(一部キャラは目と肌の色も)を変えることで、キャラクターの個性を表現しています。

1ドット変えるだけで、大きく印象が変わります。
そのため、試行錯誤して一番しっくりくる形を見つけます。

f:id:yu3mars:20161208090457p:plain

スクリーンショットです。

ImageMagick

画像の連結や拡大に便利なソフトです。

www.imagemagick.org

複数のドット絵をまとめて一枚の画像にすると、公開の時に取り扱いが楽になります。
小さいドット絵をそのままアップロードすると、ぼやけて拡大表示されてしまう場合があるので、 拡大してからアップロードしています。

今回ドット絵を加工する際に利用したコマンドを紹介します。
シェルあるいはコマンドプロンプトから利用できます。

縦に結合 (例は3つの画像を連結)

convert -append [入力ファイル1] [入力ファイル2] [入力ファイル3] [出力ファイル]
convert -append uzuki.gif rin.gif mio.gif newGenerations_tate.gif

f:id:yu3mars:20161208233426g:plain

横に結合 (例は3つの画像を連結)

convert +append [入力ファイル1] [入力ファイル2] [入力ファイル3] [出力ファイル]
convert +append uzuki.gif rin.gif mio.gif newGenerations_yoko.gif

f:id:yu3mars:20161208233952g:plain

ぼやけさせずに拡大する (例は2倍に拡大)

convert -filter box -resize [倍率]% [入力ファイル] [出力ファイル]
convert -filter box -resize 200% newGenerations.gif newGenerations_zoom.gif

f:id:yu3mars:20161208233957g:plain

ImageMagick 7 以降ではconvertコマンドはmagickに名称変更されているので注意してください。

ImageMagick に関する技術的情報として、以下のサイトが参考になるかもしれません。

ImageMagick - TeX Wiki

[Resolved] convert.exe missing from 7.0.1-Q16? - ImageMagick

終わりに

ImageMagickの利用はプログラマっぽい感じですが、慣れると怖くないです(エラーが出ると戸惑いますが…)。
イラスト制作方法は、人それぞれだと思いますが、何かの参考になれば幸いです。 皆さんも、ドット絵イラストレータを始めてはいかがでしょうか?

明日のKMCアドベントカレンダーは、KapTamBnS さんです。

アニメ系新番組や単発番組の情報をカレンダーにするプログラム「しょぼかるフィルター」を作った

この記事は KMC アドベントカレンダー 7日目の記事です。

www.adventar.org

6日目の記事は、id:dnek さんの 運ゲー排除マインスイーパーをiOSにも対応させた話とか - dnekblog でした。

dnek.hatenablog.com

今日のテーマ

新番組や単発番組の情報をカレンダーにするプログラムを書きました。
しょぼかるフィルター」と呼んでいます。

ソースコードGitHubで公開しています。
手元で試してみたい、自分の地域の情報を出力したい、という方は、readmeを参考にして動かしてみてください。 github.com

こちらで、KMCの所在地である京都向けの.icsファイルを試験公開中です。
当面は運用を続ける予定ですが、予告なく終了する可能性があります。
あらかじめご了承ください。

以下、何をやったのかを簡単に紹介します。

しょぼいカレンダーとは

cal.syoboi.jp

アニメ関連番組の番組表。
「しょぼい」という名前とは裏腹に高機能。

例えば、rssbuilder機能というものがあり、.icsファイルを生成できます。
今回はこの機能を利用します。

http://cal.syoboi.jp/util/rssbuilder

しょぼいカレンダーの不満点

デフォルトで出力される.icsでは、番組数が多すぎるため、欲しい情報が埋没します。
私は、録画予約を失敗しないように、新番組や単発番組の情報が欲しいと考えました。
継続して毎週放送されている番組の情報はいらないので、出てこないようにしたいです。

f:id:yu3mars:20161207013209p:plain デフォルトの.icsをGoogleカレンダーに読み込ませたときの様子です。
情報が多すぎます……。

作ったプログラムでやっていること

しょぼいカレンダーが発行する.icsを読み込んでフィルタリングします。
"【新】"、"【注】"、"【!】"が含まれるものだけを含んだ.icsを出力します。
新番組や単発番組の情報を失うことなく、不要な情報の大部分を除去することができます。
放送時間が変更された番組も引っかかってしまいますが、数が少ないので目を瞑ることにします。
実装が軽いことはよいことです。

f:id:yu3mars:20161207013225p:plain フィルタリングした後の.icsをGoogleカレンダーに読み込ませたときの様子です。
だいぶスッキリしました。

実運用では、Linuxサーバー上でcronを使って定期実行しています。
webサーバの公開ディレクトリに.icsを出力することで、カレンダーの配信を実現しています。

終わりに

自分でプログラムを書くことで、新番組や単発番組の情報をカレンダーにすることができました。
もし、これよりいい方法があるという方は、ぜひお知らせください。
プルリクも歓迎です。

明日のKMCアドベントカレンダーは、id:asRagiさんです。

はてなブログ5周年ありがとうキャンペーンお題第1弾「はてなブロガーに5つの質問」

はてなブログ5周年ありがとうキャンペーンお題第1弾「はてなブロガーに5つの質問」

1.はてなブログを始めたきっかけは何ですか?

自分のやってきたことを簡単に見せられる場が欲しかった。

2.ブログ名の由来を教えて!

デフォルトを英語の文法的に正しくした。

3.自分のブログで一番オススメの記事

yu3mars.hatenablog.com

4.はてなブログを書いていて良かったこと・気づいたこと

アクセスログを見ると読者さんの関心を知ることができて面白い。

5.はてなブログに一言

Markdown最高!

http://blog.hatena.ne.jp/-/campaign/hatenablog-5th-anniversary

AOJ 2717 Where is the Boundary

問題

Where is the Boundary | Aizu Online Judge

直線状にn個の県が並んだ国がある。
m種類の分類法があり、これによって各県は、'E'または'W'に分類することができる。
今、この国を'E'と'W'に分ける境界を決める。
m種類の分類法に対する誤差が最小になるような境界位置を求めよ。

解法

全探索する。
境界線を決めたとき、境界の左側にあるEの数と、境界の右側にあるWの数の和を求める。
この和が最小になる境界線が答えとなる。

ソースコード(C#)

using System;
using System.Collections.Generic;
using System.Linq;

namespace _2717
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] nm = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int n = nm[0];
            int m = nm[1];
            string[] d = new string[m];
            for (int i = 0; i < m; i++)
            {
                d[i] = Console.ReadLine();
            }

            int[,] e = new int[m, n + 1];
            int[,] w = new int[m, n + 1];
            for (int y = 0; y < m; y++)
            {
                for (int x = 0; x < n; x++)
                {
                    e[y, x + 1] = e[y, x];
                    if (d[y][x] == 'E') e[y, x + 1]++;
                }
            }
            for (int y = 0; y < m; y++)
            {
                for (int x = n - 1; x >= 0; x--)
                {
                    w[y, x] = w[y, x + 1];
                    if (d[y][x] == 'W') w[y, x]++;
                }
            }
            int ans = int.MaxValue;
            int bound = 0;

            for (int x = 0; x < n + 1; x++)
            {
                int tmp = 0;
                for (int y = 0; y < m; y++)
                {
                    tmp += e[y, x] + w[y, x];
                }
                if (tmp < ans)
                {
                    ans = tmp;
                    bound = x;
                }
            }

            Console.WriteLine("{0} {1}", bound, bound + 1);
        }
    }
}