春鳥 -ハルドリ-

2008年2月

2008-02-28(THU)

やべぇ

卒業研究発表まであと3日しかないという現実。月曜が発表ですよ。月曜が。

この1年コソコソと頑張ってたおかげで,報告書を作成するのに必要な情報は十分にあるけど,逆にありすぎなんだよー。メインの部分を語りだす前に,使えるページ数の半分以上をオーバーしてしまう。重要度の高い順に作っていって,残りで微調整する作戦で行こうか。間に合うよね?間に合えばいいのに。

2008-02-25(MON)

SO905i専用インポートプレイリスト作成プログラム ver 2.0 の中身。

昨日,ソースをオープンするのを忘れていたから,今日のログに貼り付け。前に公開していたのとは処理方法が変わり,フォルダのドラッグアンドドロップに対応した他,プログレスバー(処理の進行状況を延びる棒で表現するアレ)の表示,変数名としてつけていた「filepass」は正しくは「filepath」じゃないか,という恥ずかしい綴りミスを修正したことにより,メジャーバージョンアップとしました。あと,プログラムの正式名称には,「SO905iのプレイリストを作るやつ」が昨日の深夜に多数決(賛成1:反対0)で採用されました。「SO905i専用インポートプレイリスト作成プログラム」は,愛称とかSEO対策のためとか,そんな感じです。後々,既存のプレイリストを読み込んで編集できる程度の能力も持たせたいと思っています。

それでは,適度に端折った適当な解説。まず,「読み込んだmp3ファイルのパス」と「D&D元のフォルダ名」の情報を持つmp3Dataという構造体を用意しておきます。で,mp3Data型の配列mp3を作って,D&Dされたフォルダ内にあるmp3やら,直接放り込まれたmp3ファイルやらの情報をどんどん溜め込んでいきます。「プレイリスト作成」のボタンが押されると,D&D元のフォルダ名,または,テキストボックスに入力されたプレイリスト名を元に「プレイリスト名.m3u」の空ファイルがPLAYLISTフォルダ内に作られます。あとは,この「プレイリスト名.m3u」というファイルにmp3配列に溜め込んでおいたmp3ファイルのパスを追加書き込みしていくだけ。「プレイリストをフォルダ名にする」の場合で,複数のフォルダが投げ込まれたときは「D&D元のフォルダ名」情報を利用して書き込むプレイリストが割り振られるようになっています。以上解説終わり。

本当にC#は楽です。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace so905i
{
    public partial class Form1 : Form
    {
        struct mp3Data
        {
            public string filepath;//mp3ファイルのパス
            public string dir_name;//D&D元のフォルダ名
        }
        private mp3Data[] mp3 = new mp3Data[1];//[ファイル数]
        private string drive;//ドライブ名
        private string playlist_name;//プレイリスト名
        public Form1()
        {
            InitializeComponent();
        }

        private void listBox1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
                e.Effect = DragDropEffects.All;
            else
                e.Effect = DragDropEffects.None;
        }

        private void listBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
            string[] path_chk = (string[])e.Data.GetData(DataFormats.FileDrop, false);//フォルダかファイルが入る
            if (mp3.Length == 1)
                listBox1.Items.Clear();
            drive = Directory.GetDirectoryRoot(path_chk[0]);//入力ファイルのルートディレクトリ
            for (int i = 0; i < path_chk.Length; i++)
            {
                string[] dir = path_chk[i].Split('\\');//ディレクトリパスをを\\ごとに分ける
                if (dir[1] == "MUSIC" || dir[4] == "MUSIC")//ミュージックフォルダ内にあれば
                {
                    if (File.Exists(path_chk[i]) && Path.GetExtension(path_chk[i]) == ".mp3")//mp3ファイルのとき
                    {
                        mp3[mp3.Length-1].dir_name = dir[dir.Length - 2];//mp3ファイルの入っているフォルダ名
                        mp3[mp3.Length - 1].filepath = path_chk[i].Remove(0, 2);//mp3ファイルのパス
                        listBox1.Items.Add(mp3[mp3.Length - 1].filepath);
                        Array.Resize(ref mp3, mp3.Length + 1);//mp3配列を大きくする
                    }
                    if (Directory.Exists(path_chk[i]))//フォルダのとき
                    {
                        string[] temp = Directory.GetFiles(path_chk[i], "*.mp3", SearchOption.AllDirectories);//フォルダ内にあるファイル名に.mp3のつく全ファイル
                        Array.Resize(ref mp3, mp3.Length + temp.Length);//mp3配列を大きくする
                        int k = 0;
                        for (int j = (mp3.Length - temp.Length - 1); j < mp3.Length-1; j++)
                        {
                            mp3[j].dir_name = dir[dir.Length - 1];//フォルダ名
                            mp3[j].filepath = temp[k++].Remove(0, 2);//mp3ファイルのパス
                            listBox1.Items.Add(mp3[j].filepath);
                        }
                    }
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string[] playlist = new string[1];
            if (mp3.Length == 1)
                return;
            listBox1.Items.Clear();
            button1.Enabled = button2.Enabled = textBox1.Enabled = radioButton1.Enabled = radioButton2.Enabled = false;//設定の変更を禁止
            Array.Resize(ref mp3, mp3.Length - 1);//あまりの配列を削る
            progressBar1.Minimum = 0;
            progressBar1.Maximum = mp3.Length;
            playlist_name = textBox1.Text;

            string winDir = System.Environment.GetEnvironmentVariable("windir");
            if (!Directory.Exists(drive + "PRIVATE\\DOCOMO\\MMFILE\\MUSIC\\PLAYLIST"))//PLAYLISTフォルダがなければ
                System.IO.Directory.CreateDirectory(drive + "PRIVATE\\DOCOMO\\MMFILE\\MUSIC\\PLAYLIST");//フォルダを作る

            if (radioButton1.Checked)//プレイリスト名にフォルダ名を利用するとき
                for (int i = 0; i < mp3.Length; i++)
                    if (i == 0 || i > 0 && mp3[i].dir_name != mp3[i - 1].dir_name)//プレイリスト名が変化したとき
                    {
                        //プレイリスト名.m3uの空ファイルを作ってプレイリストを初期化
                        using (System.IO.FileStream hStream = System.IO.File.Create(drive + "PRIVATE\\DOCOMO\\MMFILE\\MUSIC\\PLAYLIST\\" + mp3[i].dir_name + ".m3u"))
                            if (hStream != null)//作成時に返される FileStream を利用して閉じる
                                hStream.Close();
                        listBox1.Items.Add("プレイリスト" + "「" + mp3[i].dir_name + "」" + "を作成しました。");
                    }
            if (radioButton2.Checked)//プレイリスト名に任意の名前をつけるとき
            {
                //プレイリスト名.m3uの空ファイルを作ってプレイリストを初期化
                using (System.IO.FileStream hStream = System.IO.File.Create(drive + "PRIVATE\\DOCOMO\\MMFILE\\MUSIC\\PLAYLIST\\" + playlist_name + ".m3u"))
                    if (hStream != null)//作成時に返される FileStream を利用して閉じる
                        hStream.Close();
                listBox1.Items.Add("プレイリスト" + "「" + playlist_name + "」" + "を作成しました。");
            }
            for (int i = 0; i < mp3.Length; i++)
            {
                progressBar1.Value = i;//プログレスバー表示
                writer(i);//プレイリスト作成
            }
            button1.Enabled = button2.Enabled = radioButton1.Enabled = radioButton2.Enabled = true;//設定の変更を許可
            if(radioButton2.Checked)
                textBox1.Enabled = true;
            mp3 = new mp3Data[1];
            progressBar1.Value = 0;//プログレスバー初期化
        }

        private void writer(int num)
        {
            if (radioButton1.Checked)
                playlist_name = mp3[num].dir_name;
            //プレイリストへ追加書き込み
            StreamWriter writer = new StreamWriter(drive + "PRIVATE\\DOCOMO\\MMFILE\\MUSIC\\PLAYLIST\\" + playlist_name + ".m3u", true, System.Text.Encoding.GetEncoding(932));
            writer.WriteLine(mp3[num].filepath);
            writer.Close();
        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            textBox1.Enabled = false;
        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            textBox1.Enabled = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            mp3 = new mp3Data[1];
        }

    }
}

2008-02-24(SUN)

SO905iのプレイリストを作るやつ。

フォルダのドラッグアンドドロップに対応させてみた。構造体って便利だなぁ。

対応させてみたのはいいけど,使い方のページに使い方を書くのが面倒だ……。使うのに支障がない程度の説明は書いたけど,分かりづらいから,また後で書き直そう。

2008-02-22(FRI)

学年末試験最終日。

意外にも悪くなかった応用数学。これで終了だッ!OWARYYYYYY!!

しかし,まだダラダラするわけにはいきません。卒研発表に向けての準備物作成があります。これができなければ卒業もできません。

2008-02-21(THU)

学年末試験5日目。

そこそこできた1教科。最後の2問はあきらめました。

テスト終了まで残り1日。学生生活最後のテストは苦手な数学。これで終わりです。

2008-02-20(WED)

学年末試験4日目。

よくできたのと,よくなかったのと。よくなかった方も半分はできてると思う。しかし,提出したレポートに名前を書いた記憶がない。レポート点って何点だろう。

テスト終了まで残り2日。そして,残り2科目。

2008-02-19(TUE)

学年末試験3日目。

できた,できなかった,できなかったの3つ。単位は大丈夫であってほしいなぁ。

テスト終了まで残り3日。明日頑張ろう……。

2008-02-18(MON)

学年末試験2日目。

「ノートがあれば怖いものなしだぜぇ」な教科が1つだけ。何も問題はない。

テスト終了まで残り4日。明日は3教科。3つとも前回のテストの出来が良かったから,今回も大丈夫であってほしいです。

2008-02-17(SUN)

「SO905i専用インポートプレイリスト作成プログラム」を改良してみた。

新しく分かったこと。

以上を踏まえた改良版。ついでに,使い方のページも修正。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace so905i
{
    public partial class Form1 : Form
    {
        private string[][] filepass;//ファイルの絶対パス
        private int num;//ドラッグアンドドロップ数
        private string drive,drive_chk;//ドライブ名,ドライブチェック
        public Form1()
        {
            InitializeComponent();
            filepass = new string[1][];
        }

        private void listBox1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
                e.Effect = DragDropEffects.All;
            else
                e.Effect = DragDropEffects.None;
        }

        private void listBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
            if(num == 0)
                listBox1.Items.Clear();
            num++;
            int numn1 = num - 1;//numから1引いたもの
            Array.Resize(ref filepass, num);
            filepass[numn1] = new string[((string[])e.Data.GetData(DataFormats.FileDrop, false)).Length];
            filepass[numn1] = (string[])e.Data.GetData(DataFormats.FileDrop, false);
            if (num > 1)//2回目以降のドラッグアンドドロップ時にチェックする
                drive_chk = drive;
            drive = filepass[numn1][0].Remove(3);
            if (num > 1 && drive != drive_chk)
            {//違うドライブからドラッグアンドドロップされたら
                listBox1.Items.Clear();
                listBox1.Items.Add("ドライブの異なるmp3が入力されました。");
                listBox1.Items.Add("ドライブを確認してください。");
                num = 0;
                return;
            }
            if (!Directory.Exists(drive + "PRIVATE\\DOCOMO"))
            {//microSDでないっぽいなら終了
                listBox1.Items.Clear();
                listBox1.Items.Add("そのmp3ファイルはmicroSD内にありません。");
                num = 0;
                return;
            }
            for (int i = 0; i < filepass[numn1].Length; i++)
            {//filepass.Lengthが読み込んだファイル数
                listBox1.Items.Add(filepass[numn1][i]);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (num == 0)
                return;
            string winDir = System.Environment.GetEnvironmentVariable("windir");
            string musicpass = "PRIVATE\\DOCOMO\\MMFILE\\MUSIC\\";//MUSICフォルダまでのパス
            string playlist_name = textBox1.Text;//プレイリスト名
            if (!Directory.Exists(drive + "PRIVATE\\DOCOMO\\MMFILE\\MUSIC\\PLAYLIST"))//PLAYLISTフォルダがなければ
                System.IO.Directory.CreateDirectory(drive + "PRIVATE\\DOCOMO\\MMFILE\\MUSIC\\PLAYLIST");//フォルダを作る
            if (radioButton1.Checked)
            {
                string musicdir = filepass[0][0].Remove(0, drive.Length + 6);//MUSICフォルダ以下のパス
                string[] music = musicdir.Split("\\");//MUSIC以下を\\ごとに分ける
                playlist_name = music[music.Length - 2];//mp3ファイルの入っているフォルダ名
            }
            StreamWriter writer = new StreamWriter(drive + musicpass + "PLAYLIST\\" + playlist_name + ".m3u", false, System.Text.Encoding.GetEncoding(932));
            for (int i = 0; i < num; i++)
            {
                for (int j = 0; j < filepass[i].Length; j++)
                {
                    string temp = filepass[i][j].Remove(0, 2);
                    writer.WriteLine(temp);
                }
            }
            writer.Close();
            listBox1.Items.Clear();
            listBox1.Items.Add("プレイリスト" + "「" + playlist_name + "」" + "を作成しました。");
            num = 0;
        }

         private void radioButton1_CheckedChanged(object sender, EventArgs e)
         {
             textBox1.Enabled = false;
         }
         private void radioButton2_CheckedChanged(object sender, EventArgs e)
         {
             textBox1.Enabled = true;
         }

    }
}

button1_Click()の中身が若干変わりました。PLAYLISTフォルダがないときには自動で作る機能も加えてみました。その他細かいところでは,ドラッグアンドドロップ時に配列filepassが一個多くなるのを直したりなど。

2008-02-16(SAT)

SO905iで音楽再生を試してみる。

曲を聞くだけなら,microSDカードの\PRIVATE\DOCOMO\MMFILE\MUSIC\以下に適当な名前でフォルダを作って,その中にmp3ファイルを放り込むだけでいいみたいです。しかし,ID3タグに曲名が入っていないと,曲名が「不明」となってしまいました。SonicStageにいったん曲を取り込んでから,ドラッグアンドドロップすると曲名を入れてくれるという情報を見つけたので実行。これで,曲名が表示された状態で音楽を聞くことができるようになりました。どうでもいいけど,SonicStageは動作が重いです……。ところが,これではフォルダごとの再生ができません。プレイリストを作ってやらないといけないようです。

プレイリストを置く場所は,\PRIVATE\DOCOMO\MMFILE\MUSIC\PLAYLIST以下に.m3uファイルで。でも,SonicStageはプレイリストを出力してくれません。「FOMA 充電機能付USB接続ケーブル」で携帯とPCをつなげばプレイリストを送れるらしいのですが,SDカードスロットにカードを挿したのでは駄目なようです。手作業でプレイリストを作るのは面倒くさい……。そんなわけで,プレイリストを作るソフトを作ることにしました。ファイル名を取ってきて,拡張子が.m3uなテキストファイルを出力するだけだからそんなに難しくはないと思います。

SO905i用プレイリスト作成プログラムを作ってみる。

書いたことのないC++を使いたいところですが,楽そうなC#で書くことにします。

ドラッグアンドドロップは,Visual C# アプリケーションにファイルのドラッグ アンド ドロップ機能を提供する方法,C#を使ってのファイルの読み書きは,Visual C# で基本的なファイルの入出力を行う方法を参考に。半日かかってようやく完成。

そして,オープンソース。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace so905i
{
    public partial class Form1 : Form
    {
        private string[][] filepass;//ファイルの絶対パス
        private string drive;
        private int num;//ドラッグアンドドロップ数
        public Form1()
        {
            InitializeComponent();
            filepass = new string[1][];
        }

        private void listBox1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
                e.Effect = DragDropEffects.All;
            else
                e.Effect = DragDropEffects.None;
        }

        private void listBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
            if(num == 0)
                listBox1.Items.Clear();
            filepass[num] = new string[((string[])e.Data.GetData(DataFormats.FileDrop, false)).Length];
            filepass[num] = (string[])e.Data.GetData(DataFormats.FileDrop, false);
            for (int i = 0; i < filepass[num].Length; i++)
            {//filepass.Lengthが読み込んだファイル数
                listBox1.Items.Add(filepass[num][i]);
            }
            num++;
            Array.Resize(ref filepass, num + 1);
        }

         private void button1_Click(object sender, EventArgs e)
         {
             if (num == 0)
                 return;
              string winDir = System.Environment.GetEnvironmentVariable("windir");
              string musicpass = "PRIVATE\\DOCOMO\\MMFILE\\MUSIC\\";//MUSICフォルダまでのパス
              string playlist_name = textBox1.Text;//プレイリスト名
              drive = filepass[0][0].Remove(3);
              if (radioButton1.Checked)
              {
                  string musicdir = filepass[0][0].Remove(0, drive.Length + musicpass.Length);//MUSICフォルダ以下のパス
                  string[] music = musicdir.Split('\\');//MUSIC以下を\\ごとに分ける
                  switch (music.Length)
                  {
                      case 2://\フォルダ名\ファイル名.mp3のとき
                          playlist_name = music[0];
                          break;
                      case 3://\フォルダ名\フォルダ名\ファイル名.mp3のとき
                          playlist_name = music[1];
                          break;
                      default://それ以外のときは終了
                          listBox1.Items.Add("ファイルの階層が深すぎます。");
                          return;
                  }
              }
              StreamWriter writer = new StreamWriter(drive + musicpass + "PLAYLIST\\" + playlist_name + ".m3u" , false, System.Text.Encoding.GetEncoding(932));
              for (int i = 0; i < num; i++)
              {
                  for (int j = 0; j < filepass[i].Length; j++)
                  {
                      string temp = filepass[i][j].Remove(0, 2);
                      writer.WriteLine(temp);
                  }
              }
              writer.Close();
              listBox1.Items.Clear();
              listBox1.Items.Add("プレイリスト" + "「" + playlist_name + "」" + "を作成しました。");
              num = 0;
         }

         private void radioButton1_CheckedChanged(object sender, EventArgs e)
         {
             textBox1.Enabled = false;
         }
         private void radioButton2_CheckedChanged(object sender, EventArgs e)
         {
             textBox1.Enabled = true;
         }

    }
}

怪しげなexeファイルをアップロードしてみる。

投げやりな感じの解説ページを作りました。→SO905i専用インポートプレイリスト作成プログラムの使い方

動作は保障しません,できません。何があっても自己責任で。

2008-02-15(FRI)

学年末試験1日目。

どうなることやら心配だった教科と,いつもどおりな教科の2つ。心配だったほうは,暗記で乗り切れました。

テスト終了まで残り7日。月曜のはノートさえとっていれば大丈夫な教科が1つだけ。火曜のテストに備えます。

携帯が変わりました。

SO905iで色はシャンパンベージュになりました。黒は指紋がベタベタ残るという話しだし,白はあまりにも白すぎたから間をとってこの色に。赤色は最初からスルーです。裏面の素材が不思議なさわり心地。期待していなかったワンセグが普通に見られているのが少しうれしかったりします。

2008-02-13(WED)

最後のテストは金曜日から。

KHR-1は歩かせられないかもしれない。やろうとすればできるんだろうけど,報告書を書く時間やら,それに伴う図表の作成やらを考えると時間がもったいない気がしてなかなか行動に移せないという状態です。テスト明けのテンションで乗り切れるだろうか。

そういえば,今日でしたっけ。

XPのIEが7になるのは。これがはじめてのタブブラウザになる人もいるのかもしれませんね。ついでにこれでブラウザというものに興味を持ってくれる人がいれば良いんですけど。

2008-02-11(MON)

学年末試験の為の食糧確保。

袋入りの小枝(菓子)を買ったらあまりにもな過剰包装で驚きました。4本ずつがビニールの小袋に分けて入れられてるってどうなん?ポッキーで例えるなら1本ずつが袋詰めされている勢いですよ。

チョコフレークみたいにチャック付きの袋にザバザバ入れたらいいのになんでこんな面倒なことを……。

マイクロソフトは時々すごいことをやってくれる。

無料でWindowsと360で動くゲームがC#で作れてしまうという素敵なものがマイクロソフトで公開されています。作ったものを360で動かすにはお金がかかるみたいですが,Windowsで実行するならタダっぽい。パソコンに360コントローラで普通に遊べたりするのかな?あぁ,時間さえあれば色々試せるのに。テストに卒研,レポート提出ともうやることだらけだ。

2008-02-06(WED)

うでたてた。

これでKHR-2に関してやろうとしてたことは全部できました。KHR-1はまだ歩きませんが,このくらいできていれば報告書は書けそうです。

microSDと新しいUSBメモリがamazonから届いたよ。

どちらも2GBです。USBメモリは,速いという噂のCUFD-H2G。今まで使っていたUSBメモリよりもキャップ1つ分大きめ。重さは2倍になりました。しかし,転送速度も2倍以上。これは良い。

勤務地が決まりました。

就職先からメールが届いていました。関東地方になるようです。

2008-02-04(MON)

ロボ立て伏せ。

ロボが腕立て伏せを嫌がる理由は分かりましたが,説得するのは面倒そう。腕立て伏せには,速度Aで1回,速度Bで1回のウェイトを入れた後にループ元へモーションをジャンプさせるというややこしいデータが使われていました。こういうモーションがあるということは,ループの後にウェイトが入るという逆のモーションも存在し得るわけで,それにも対応させなくてはなりません。しかし,現段階で複数回のウェイトやループが単品で出てくるモーションに対応していますから,うまく組み合わせれば何とかなりそうです。