2011年5月31日火曜日

MySQLでwikipediaデータを遊んでみる~part1


今回はwikipediaのデータを使ってちょっと遊んでみました。
Wikipediaは全ての言語版において全てのデータを公開しています。
形式はsqlだったりxmlだったり、ファイルサイズもキロバイトからギガバイト(英語だとテラとか)まで様々です。
今回は、サイズもそこそこで文字化けの心配もないsimpleEnglishのwikipediaのデータを使用しました(特にこの中のこの中のcategoryというものとcategorylinkを使用しました。)。
→データはこちら:http://dumps.wikimedia.org/simplewiki/latest/

この記事で取り上げた句や関数は以下の通りです。

<導入>
  • source
  • describe
  • select
<データの制限&ソート>
  • where
  • 算術式
  • between
  • order by
  • like
  • and と or
<単一行関数>
  • length
  • round
  • mod


どんな脈絡かと言われると非常に困ります。ごめんなさい。


sqlファイルを読み込む際は、以下のようなコマンドを使用します。



【sqlファイルの読み込み】
source filename; 

そうすると以下のようにばーーーーと処理が進み、読み込みが完了します。


中身がはいっているかどうか確認します。
テーブルがどんな構造をしているのか、このようなGUIアプリではだいたいそういう機能がついていますが
コマンドでももちろんそういうものを表示するものがあります。




【テーブル構造を把握する:describe】
describe category;


このように見ていくと、とりあえずたくさん項目があるのがわかります。
簡単に、各項目がどんなことを表しているのかを整理したいと思います(相当ざっくり)。


  • cat_title→カテゴリー名
  • cat_page→そのカテゴリに属する記事ページの数
  • cl_timestamp→記事にカテゴリーが割り振られた時間の記録
  • cl_sortkey→記事名(厳密にはソートするためにある列だが、英語なので、そのまま記事名となる。例えばこれが日本語だと、「日本語」という記事に対して「にほんご」と振ってある(らしい))
では、本格的にSQL文を叩いていきます。


(ここからはGUIアプリのSquel Proで)




【ページ数(降順)で並び替え。カテゴリー名も表示してTitleという別名で表示】
select `cat_title` Title, `cat_pages` from category 
order by `cat_pages` desc


別名を付けたいときは、スペースを空けて、その別名を書く。
並び替えは、order byで出来ます。デフォルトは昇順。降順にするには最後にdescをつけます。
→とにかくstub系(短い記事であんまり役に立たなさそうなもの)が多いようです。




【カテゴリー名の中に[you]という文字列を含むものを表示】
select `cat_title` from category where `cat_title` like '%you%'














likeによって比較してあげています。
%を前につけると、「you で終わる文字列(指定した文字列以前はしばりをつけない)」ということになり、逆に%を後につけると「youで始まる文字列(指定した文字列以後はしばりをつけない)」ということになります。






【カテゴリーページが100より大きいものをカテゴリー名(降順)で並び替える】
select * from category where `cat_pages`>100 
order by `cat_title` desc






【タイムスタンプが2011年5月以降のものを降順で出力する】
select `cl_to` CategoryName,`cl_timestamp` from `categorylinks` 
where cl_timestamp > '2011-05-01 00:00:00' order by `cl_timestamp` 






【上記について、2011年4月から2011年5月までに限定する】
select `cl_to` CategoryName,`cl_timestamp` from `categorylinks` 
where cl_timestamp 
between '2011-05-01 00:00:00' and '2011-04-01 00:00:00'
order by `cl_timestamp` 



算術式が使えます。whereは出したいレコードの制限条件を入れたいときに使います。また、数値だけでなく、日付なんかにも使うことができるようです。
また、○日〜○日みたいな間をとりたいときはbetweenが使えます。
ただし、betweenの場合は、between A and BのAとBの順番に縛りがあります。必ず、A<Bにしないとうまく動きません。
*をつけると、特定の列でなく、すべての列を表示することができます。





【カテゴリーの振られたページが100ページ以上で、かつ、
カテゴリーの名前に「phy」が含まれているものをタイトル降順で表示】


select * from category 
where `cat_pages`>100 and `cat_title` like '%phy%'
order by `cat_title` desc



and は「かつ」、orは「もしくは」の意味を持ちます。2つ以上条件があるときには、andかorでつなぎます。




【カテゴリー名が10文字以上のものを選び出す】
select `cat_title` Title, length(`cat_title`) Length
from category where length(`cat_title`) > 10 


length関数を使うと文字列の長さを測ることができます。






【カテゴリーに属するページ数を四捨五入(1の位)する。
さらに、その結果を7で割って余りが0のものだけを降順表示】

select cat_id, cat_title, round(`cat_pages`,-1) PageCount 
from `category` 
where mod(round(`cat_pages`,-1),7)=0 order by PageCount desc




mod(p,q)で、pをqで割った余りを返します。
また、round(a,b)で、aを小数第b位までの数になるように四捨五入してくれます。マイナスの値を指定すると、1の位/10の位と小数以上のところを指定することになります。

また、ここでは、関数roundとmodを実践しましたが、その他にもwhere句の中で関数を「ネスト」させる(modの中に、さらにroundを入れてあげる)ということもやってみました。

-------
次回は結合や集合関数あたりを頑張ろうと思います。

2011年5月30日月曜日

mainメソッドの引数を可変長引数リストにしてみる

筆記な勉強をしていたら出てきたので、メモ。

普通mainメソッドは(ここでいう「普通」とは、教科書とか参考書とかEclipseの補完的な意味で)mainメソッドはこんな感じで書くはず。

public static void main(String[] args) {
  //なにかしらの処理
}

String[]的な。
だけども、ここで、[]の代わりに「...」なるものが使えるなど。
可変長引数の定義として、可変長にしたい引数の型の後ろに「...」をつけるとできる。
つまり、以下のような形です。


public class VariableArgument { 
 public static void main(String... args) {
  for (int i = 0; i < args.length; i++) {
   System.out.println(i+":"+args[i]);
  }
 }
}

で、試しに引数に色々入れてみた結果、ちゃんと動きました。



2011年5月28日土曜日

MySQLの設定など

MySQLをインストール&ダウンロード&いろいろ設定。

1年くらい前にはwindowsマシンに入れたけど、失敗したりして、アンインストールとインストールを繰り返していたら、おかしなことになったので、今回はMacに。かつ慎重に。
(なのでこれから初めてインストールする人も気をつけてください。ちゃんとアンインストールすればいいのだけど、たまにゴミが残ったりして非常に面倒です)

まず、ダウンロード&インストールはこちらを参考にさせていただきました。
MacOSXにMySQLをインストールする方法

また、以前Windowsに入れたときには、こちらのページを参考にさせていただきました。SQLについても色々書いてあるので、初心者にとってはとても丁寧なページで感謝感謝です。
MySQL初心者入門講座


で、本題に戻りますと、ダウンロードに関しては、イーモバでも20〜25分程度で完了しました。インストールも若干バージョンが違ったりしますが、たいていは問題なく進めます。
最後のシステム環境設定のところで、いちいちサーバーをstartさせたりstopさせるのが面倒くさい人は、チェックボックスにチェックを入れると良いと思いますが、なんか重くなったら嫌だなと思って(たぶん大丈夫ですけど)、チェックを入れませんでした。私は。まあ毎日使うもんでもないし、データベースでなんか研究するわけでもないし。。。

そして最後に設定。ターミナル上で以下のコマンドを打ちます。

$ cd /usr/local/mysql
$ ./bin/mysqladmin -u root password '設定したいパスワード'

これで完了です。試しにターミナルから接続してみます。
EnterPasswordのとこで先ほど設定したパスワードを入力すると以下のようになり、接続完了(文字ちっちゃ。。。)。

今まで「$」だったのに、「mysql」になってることを確認してください。
というわけで、ちょっといじってみる。
mysql> show databases;


データベースの中を確認。デフォルトで入っている3つが示されました。


で、さらにさらに、ターミナルで操作するのはちょっと味気なかったら、GUIアプリケーションをダウンロードするのがbetterです。
今回は、Sequel Proというものを入れてみました。

参考→高機能なMySQLフロントエンド「Sequel Pro」


ダウンロードして解凍し、中にあるファイルを実行すると以下のようなウィンドウが開くのでこのアイコンをそのままアプリケーションにコピー。

実行すると、以下のようなアプリケーションが起動するので色々入力してみる。


私の環境では、

Name:適当
Host:localhost
Username:root
Password: MySQLのときに設定したパスワード

で、何度も入力するのはめんどくさいので「Add to Favorite」をクリックして、「Connect」。

そうすると、先ほどのターミナルで表示したときと同じように、SQL文を入れれば色々と操作ができるようになったわけです。

次の記事では具体的にデータを入れて、色々遊びたいと思います。

2011年5月26日木曜日

Eclipseの文字コード問題

他の人がつくったJavaプロジェクト(Eclipseからエクスポートされたもの)を
自分の環境でインポートするとき、結構な頻度で文字化けが起こる。
コメント等を英語で書けば、別にそんなことを考えなくても良いけど
そんなことも言えないときがある。

いままで、ファイル単位で文字コードを直してたんだけど、Eclipseの設定として出来るのを最近知った。。。

Win:「ウィンドウ→設定→一般→ワークスペース」
Mac:「環境設定→一般→ワークススペース」




ちなみに、ファイル単位も。

「右クリック→プロパティ」もしくは「編集→「エンコードの設定」


Excel VBAで文字列の結合

Excel VBAを使って、文字列の結合を行う。

例えば何かのテストをしたいとき。

SQL文やその他もろもろの長い命令文をいろんな変数で試したいとき、
コピペして、""の間を消去しては文字を埋め、また次行にいって""の間を消去しては文字を埋め。。。では疲れる。
なので、こんなものがあれば、ちょっとでも使えるかなと思って、書いてみた。あとはもちろん、VBAの練習も兼ねて。

<サンプル画面>
これが元々の表。今回は、自分で入れ替えたい単語は2語にして、それらを決まった文章に当てはめたものを右側に書き出していく。



結果はこちら。こんなかんじなのをつくりました。




今回はそこまで複雑ではないので、一気に載せようかしら。

Sub 結合()

    '文字列の定義
    Dim s As String
    Dim t As String
    Dim r As String
    
    s = "私の名前は"
    t = "です。"
    r = "歳です。"
    
    'C2セルを選択する
    Cells(2, 3).Select
    
    '年齢が空欄になっている行まで処理を続ける
    Do Until ((ActiveCell.Offset(0, -1).Value = ""))
        With ActiveCell
    
      '名前と年齢と日本語を結合する(演算子は「+」or「&」)
      '「+」は数値加算の意味が含まれ紛らわしいため「&」で統一
        .Value = s & .Offset(0, -2).Value & t & .Offset(0, -1) & r
        .Offset(1, 0).Select
        End With
    Loop
End Sub



そして完成と。

ちなみに、今回試しに「デバッグ機能」も使ってみた。



Eclipseと同じ感じで「ステップイン」「ステップオーバー」でデバッグができました。

2011年5月21日土曜日

簡単なマクロ構築とボタン化

まずは簡単なマクロを組むことから始めた。

どんなものかっていうと、


こんなふうな、to doリストがあったとして、「思いついた日」というところにカーソルを合わせたまま、ボタンを押すと。。。


「思いついた日」には今日の日付、「終了予定日」には2週間後の日付が自動的に設定される。というもの。

では、ちょっとずつコメントも含めて、ソースコードを紹介。

まずは関数定義。

'「思いついた日設定」という関数を定義する
Sub 思いついた日設定()
    
'関数を終了する
End Sub


次に、ちょっとソースコードを省略する感じで書いてみる。
ActiveCellとは、現在カーソルが合っているセルのこと。

With ActiveCell

End With


では中身を埋めていく。

現在の選択しているセルに日付を入れる。

'ActiveCell →「現在選択しているセル」 
        'Value→セルに値(数値や文字列)
        'Date→日付関数
        .Value = Date
        .VerticalAlignment = xlVAlignCenter
        .Font.Size = 14


思いついた日と同じ行にある「終了予定日」のセルに、思いついた日から14日後の日付を設定。

'Offset(m,n)はオブジェクトからみて、
        'm行下、n行右のセルを対象にするという意味
        Set cel = .Offset(0, 2).Range("A1")

        ' 色は赤に設定
        cel.Font.ColorIndex = 3
        cel.Font.Size = 14
        cel.VerticalAlignment = xlVAlignCenter
        cel.Value = Date + 14


以下、全体のソースコード。


Sub 思いついた日設定()

    With ActiveCell

        .Value = Date
        .VerticalAlignment = xlVAlignCenter
        .Font.Size = 14
    
        Set cel = .Offset(0, 2).Range("A1")
        cel.Font.ColorIndex = 3
        cel.Font.Size = 14
        cel.VerticalAlignment = xlVAlignCenter
        cel.Value = Date + 14
        
    End With
 
End Sub



さて、このソースコードは命令だけを書いたもの。ボタンに組み込むには、別作業が必要。
excel2010や2007なら、

「開発」→「フォームコントロール」→「ボタン」

で、ボタンを設定。マクロの登録について、ウィンドウが自動で開くので、さきほど自分が書いたマクロを選択すれば完成。

*デフォルトでは、開発メニューはないはず。以下のページ参照。
Excel2010でコントロールツールボックスはどこ

SyntaxHighlighter導入

これからソースコードをブログに掲載するにあたり、形から入ろうとおもって、よく他の方のブログで見るかっこいいソースコードの感じを導入してみた。


それが、SyntaxHighlighter。

今回の設定にあたっては、以下を参考にさせていただきました。
BloggerにおけるSyntaxHighlighterの使い方


以下、テスト。
public class HelloWorld {
  public static void main (String[] args) {
    System.out.println("Hello World !!");
  }
} 

このブログについて

JavaやJavaScript、Excelマクロなど、勉強メモを残していきます。