shokosブログ

プログラミング

今日の新刊をメールでお知らせしてくれる処理

わりと高頻度で漫画を買っているわたしです。

発売日当日に本屋さんで買わないと気が済まない性格なので、コミックダッシュ! - 漫画(マンガ)、コミックの蔵書管理と新刊発売日のチェックをサポートする総合サイト | コミックダッシュ!で管理している漫画の発売日にメールでお知らせしてくれるコードを殴り書きしました。

package jp.ne.hatena.syoko_sasaki;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;
public class Comic {
     public static void main(String[] args) {
          SimpleEmail email = new SimpleEmail();
          try {
               email.setCharset("utf-8");
               email.setHostName("smtp.gmail.com");
               email.setSmtpPort(587);
               email.setTLS(true);
               email.setAuthentication("gmailアカウントID", "パスワード");
               email.addTo("ケータイのアドレス");
               email.setFrom("gmailアカウントID@gmail.com");
               email.setSubject("今日の新刊");
               StringBuilder comics = new StringBuilder();
               for(String comic : getComics()) {
                    comics.append(comic);
                    comics.append("\n");
               }
               email.setMsg(comics.toString());
               email.send();
          } catch (EmailException e) {
               e.printStackTrace();
          }
     }
     private static List<String> getComics(){
          List<String> comics = new ArrayList<String>();
          try {
               URL url = new URL("http://ckworks.jp/comicdash/calendar/コミックダッシュのログインID");
               HttpURLConnection connection = (HttpURLConnection) url.openConnection();
               BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "EUC-JP"));
               int i = 0;
               int flag = 0;
               String line;
               Pattern pattern = Pattern.compile("<.+?>", Pattern.DOTALL);
               while ((line = reader.readLine()) != null) {
                    line = pattern.matcher(line).replaceAll("").replaceAll(" ", "");
                    if(line.contains(new SimpleDateFormat("発売日:yyyy/MM/dd").format(new Date())))  {
                         flag = i;
                    }
                    if(i == flag + 8) {
                         comics.add(line);
                    }
                    i++;
               }
               reader.close();
          } catch (IOException e) {
               throw new IllegalStateException(e.getMessage());
          }
          return comics;
     }
}

改行コードのところは環境依存するので注意。
お勉強もかねて、どっかのレンタルサーバー登録していれようかな。
自分で1からcron設定したい。

あと、新規漫画開拓のために、その週に発売されるすべての漫画を月曜日の朝お知らせしてくれる作りに変えようかとも思ったり。
それだと多すぎるかしら。うーむ。

eclipseからTomcatを起動する方法

基本的にローカルでweb作業するときはeclipseでjetty起動していましたが、Tomcatを使う機会が出てきました。

war作ってwebappsの下においてTomcat起動がめんどくさすぎてダウナーになって、Twittereclipseから起動できないのー!?って聞いたらたくさんリプライをいただきました!!


教えてもらった方法めも:
mvn -Dwtpversion=2.0 eclipse:eclipsemavenプロジェクトをEclipse Web Tool Platform向けに変換。
EclipseのタブにServersを追加。
プロジェクトを右クリックでRun on Server。

これで動的webプロジェクトになります!


超簡単にできた!うわっわたしの今までの効率、悪すぎ・・・!?

HTMLのタグを除去する

最近、プログラミング書く以外のお仕事が増えてきました。(証跡残したり)
めんどくさがりなので色々自動化していきたいなーと思い、ちょこちょこスクリプト書いています。

よく使いそうなもの第一弾、HTMLのタグを除去する。

package jp.ne.hatena.syoko_sasaki;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Pattern;

public class TagRemover {

	public static void main(String[] args) {
		try {
			URL url = new URL("ゆーあーるえる");
			HttpURLConnection connection = (HttpURLConnection) url.openConnection();
			BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "文字コード"));
			Pattern pattern = Pattern.compile("<.+?>", Pattern.DOTALL);
                        String line;
			while ((line = reader.readLine()) != null) {
				line = pattern.matcher(line).replaceAll("");
				System.out.println(line);
			}
			reader.close();
		} catch (IOException e) {
			e.getMessage();
		}
	}
}

わりとInputStreamまわりの書き方忘れがちなのです。
メモメモ。

追記:Pattern.compile がループの中にありましたが、外で1回呼び出せばOKですよとアドバイスをもらいました!

ブログのすすめ

はじめまして!
新卒準備カレンダー 2011春 : ATND
こちらのイベントで、33日目を担当する@と申します。

株式会社ドワンゴで社内アプリケーションの開発をしているプログラマです。
ほぼ初心者でこの業界に入って今3年目です。


新卒のみなさまに言いたいことは一個だけ。
ブログを書こう!!


ここでいうブログとは、技術ブログのことです。

ブログを書くといいことばっかり。

  • 見知らぬ人がコードレビューをしてくれる

不思議なことで、コードを載せたときコメントがつくのは、そのコードが間違っていたり、よりいい方法があったりするときなんですよ。
インターネットにはあしながおじさんがいっぱい!
コード批判は人格批判じゃない。怖がらずにどんどん載せましょう!

  • 自分のマシンが壊れたときに役に立つ

きゃー!MBAにお酒をかけて壊しちゃった!!
そんなとき、新しいマシンに環境設定するのに、いちいちググるのはめんどくさいですよね。
環境設定方法も書いておくと絶対に役に立ちます。




一言めもでもなんでも、学んだことはじゃんじゃん載せたらいいと思います。
アウトプットすると知識不足に気づいて、そこからまた勉強につながったり(重要)
もしわたしが技術ブログを書く習慣がなかったら、多分半分くらいしか実力ついていなかったと思います。
すすめてくれたYoshioriさんにはホント感謝しています。


わたしの話はこれでおしまい!!
これを読んでいる新卒さんは、もうすでに自分の技術ブログを持っている方も多いと思います。
周りでまだ持っていない子がいたらすすめてあげてほしいです。
特にまだ勉強方法がわからない初心者の子。



では、みなさんお仕事頑張ってください。
お次は@さんです。

はじめてのHaskellめも

Haskellのインストール方法と最初のプログラムforMac(雪豹)

Haskell Platformをインストールします。
Download Haskell

けっこう時間かかりました。

インストール終わったら、ターミナルで GHCi を起動してみよう!
f:id:syoko_sasaki:20110318101039p:image

こんな感じで色々試せます。

コマンドは前に : をつけるみたい。
GHCiを終了する時は、「:quit」だったり。
このサイトのコマンド集がわかりやすい!
2.7. GHCiのコマンド群


次にHello Worldを実行してみる。

GHCiを終了して適当にエディタ起動する。

main :: IO ()
main = putStrLn "Hello world"

hello.hs


次にコンパイル

ghc hello.hs

lsすると、hello.hsの他に、
hello、hello.hi、hello.o
ができているはずです。

これでhelloを実行すればOK。

ghcのオプションは--helpで確認できるけど、めんどくさがりやだから日本語でよく使いそうなやつだけさくっと紹介しているサイトないかなー。

ちなみになんで突然Haskell始めたかというと、勉強会でOCaml使っている方がいて、関数型言語かっこいい!って思ったからです。
なんでOCamlじゃなくてHaskellにしたかというと、流行っているからです!ドーン!!

Wicketはこんなにいろいろテストを書くことができるんだよ!

Wicketはこんなにいろいろテストを書くことができるんだよ!
常々からWicketのテストの充実さ(Ajaxまわり除く)に助けられているので、どんなことができるのか一部ご紹介します。

package jp.ne.hatena.syoko_sasaki;

import java.awt.Label;

import junit.framework.TestCase;

import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.util.tester.FormTester;
import org.apache.wicket.util.tester.WicketTester;
import org.junit.Test;


public class HomePageTest extends TestCase
{
	private WicketTester tester;

	@Override
	public void setUp()
	{
		tester = new WicketTester();
	}

	@Test
	public void test() throws Exception {
		//はじめのページを設定
		tester.startPage(HomePage.class);
		//ちゃんとページが表示されるかどうか
		tester.assertRenderedPage(HomePage.class);
		//コンポーネントがaddされているか
		tester.assertComponent("message",Label.class);
		//Labelの中身チェック
		tester.assertLabel("message", "hoge");
		//コンポーネントの活性チェック
		TextField text = (TextField) tester.getComponentFromLastRenderedPage("form:text");
		assertTrue(text.isEnabled());
		//フォームのテスト開始
		FormTester formTester = tester.newFormTester("form");
		//TextFieldに値いれる
		formTester.setValue("text", "foo");
		//セレクトボックス値をいれる
		formTester.select("box", 1);
		//サブミットボタンが複数ある場合は引数にidを指定しましょう。
		formTester.submit();
		//エラーメッセージがあったら取得
		tester.assertErrorMessages(new String[] {"◯◯は必須項目です。"});
	}

}

テストを書かないとソウルジェムが汚れちゃうよ!

Wicketでステータスコードを指定してレスポンスする方法めも

Wicketステータスコードを指定してレスポンスする方法めも

超ざっくり!

WebPageをextendsしたclassでconfigureResponseを下記のようにOverrideする。

@Override
protected void configureResponse() {
	super.configureResponse();
	if (getWebRequestCycle().getResponse() instanceof WebResponse) {
		getWebRequestCycle().getWebResponse().getHttpServletResponse().setStatus(HttpServletResponse.指定するレスポンスコード);
	}
}

やっていることがまんまなのでわかりやすい。
SC_INTERNAL_SERVER_ERRORを指定して、Live HTTP headersを起動してヘッダを見てみると、
HTTP/1.1 500 Internal Server Error
ってなっていた。