2011年12月22日木曜日

WindowsPhone全国ハッカソン祭りin東京

WindowsPhone全国ハッカソン祭りin東京

に参加してきました。



以前、mixi scrap challenge に参加をした際に出会った方に再会したり、

舞鶴からはるばるやってこられた方に出会ったり、

大学のすげぇ近所に住んでいる方に出会ったり、

そして、講師の方がわが校のOBだったりと、なんかすごい感じでした。

イベント自体は、黙々と作成をするスタイル。

一応「虎の穴」と言うことで初心者むけレクチャーにも参加をしてマーケットへの登録を行いました。

これで、実機でデバッグができるという物・・・長かったぜ・・・
飲み会の風景 


写真は例によって例のごとく、飲み会の風景。

C#なんて書いたことはほとんどありませんでしたが、JAVAがわかっていればなんとか・・・なるのか?

命名規則から知っていきたいです。




 

ちなみに、私は「GPSとWebAPIを組み合わせて最寄り駅を検索し、その最寄駅に関する小ネタをWikipediaやGoogle,路線検索APIから拾ってきて表示するアプリ」

を作っていましたが、あえなくタイムアップ。HTTP通信の方式が分からず、ようやくそれが終わってXMLの解析の手前でした。

よく考えたら、「虎の穴」で作成したアプリはTwitterのタイムラインを表示するものだったし、クラウディアさんとコミュニケーションとか、Twitterアプリケーションを構築

とかで、やってることだったのに・・・。もったいない。

仕方ないので、家で実装をして公開します。明日中にうまくいくといいけどなぁ・・・きついかな?

2011年12月11日日曜日

GoogleAppEngindeで、「バルス数えるったー」を作りたかった

去る2011/12/09

日本テレビ、金曜ロードショーで放送された「天空の城ラピュタ」

言わずもがな、知られた「バルス」でTwitterやニコ動にDDos攻撃が行われた。

Twitterはどうやら、落ちてしまった模様。ニコ動は事前の告知通り耐えぬいたらしい。

私自身は、あんまりそう言うのに興味がないので一人でSkyrimをプレイしていた。

しかし、晩飯の弁当をもとめコンビニに出かけた最中あることを思いついた。「これから放送開始までに、何か面白いことできないかな・・・?」

この時点で夜18時。放送開始の3時間ほど前である。

さて、何ができるだろう。やっぱり、「バルス」に絡めたい。

Androidアプリだろうか。今からできたとして、配布をしても間に合わない・・・

WindowsPhoneアプリ? こっちも時間までに認証が通って、配布に間に合うわけがない。

ならば、WEBアプリケーションだろうか。

たとえば、TwitterのStermaAPIを使って、ひたすら「バルス」のみを流し続けるTLとか。

StreamAPIなら使ったことも、コードもあるからどうにかなるだろうか。だが、どこで動かす?

Ummmmmm


色々と考えて、最終的に「ある程度リアルタイムに、『バルス』を数えられないだろうか」と言う結論に。

GAEを使えば、なんとかできそうだ。よし、そうしよう。

晩飯をいそいでかき込んで設計もそこそこにコーディング。

仕様としては
・10分おきにTwitterAPIにアクセスし、「バルス」で検索

・検索結果件数を、検索結果総数として加算していく。

・加算した結果を、Twitterでつぶやく。

と言う物。

で、結論から言うと、放送までに間に合わなかった。結局Twitterでつぶやく部分で何かが起こっていたらしい。

正しくログを取ればもしかしたら、解決できたかもしれないが、そんな時間もなかった。

自分の力の未熟さも知ったが、同時にパッと思いついて、パッととりかかる面白さも体験できた。いい経験だ。

今回は、GitHubでコードを公開はしない。もう少し手を加えてもっと自由に使えるものにした上で公開をするかもしれない。

以下にコードの一部と、解説を公開する。

 public void doGet(HttpServletRequest req, HttpServletResponse resp)
   throws IOException {
  Barusu barusu;
  Counter count = null;
  // 以前に起動をしたことがあるかどうか
  if ((barusu = DatestoreManager.loadData()) != null) {
   // 起動したこと有り。
   // 検索のクエリに、SinceIDを指定する
   String json = getTweets(barusu.getMinID());
   Result result = JSON.decode(json, Result.class);
   int c = result.getResults().size() + barusu.getCount();
   int minId = result.getMax_id().intValue();
   DatestoreManager.updateData(new Barusu(minId, c));
   count = new Counter(c);
  } else {
   // 起動したことなし。
   // 検索のクエリは、キーワードのみ
   String json = getTweets(0);
   Result result = JSON.decode(json, Result.class);
   int c = result.getResults().size();
   int minId = result.getMax_id().intValue();
   DatestoreManager.saveData(new Barusu(minId, c));
   count = new Counter(c);
  }

  resp.setContentType("text/javascript");
  resp.getWriter().println(JSON.encode(count));

  try {
   tweetCount(count);
  } catch (TwitterException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

GETリクエストを受けて、このメソッドが呼ばれる。

cronを使って、何度も起動をするので、起動履歴をチェックする必要がある。今回は、データストアにデータがあるかどうかで判断を行った。

処理は
1.検索
2.結果(JSON)を保存
3.データストアに保存

そして、JSON形式で出力し、Twitterでつぶやくという物。

JSONの解析にはJSONICを、Twitterでつぶやく部分は、Twitter4jを利用させていただいている。

どうやら、つぶやくための tweetCount で何かが起こっているらしいが、TwitterException をCatchすることができなかった。

今後の展望としては、

UserStreamAPIを利用して、自分のTL上の「バルス」をカウントして、JavaScriptのDOM要素を利用してリアルタイムに更新をするタイプのものを作ってみたい。

しかし、その場合30秒制限のあるGAEでは利用ができないと思う。帯域制御とかを無視してAndroidなんかで実装をするのも面白いかもしれないが。

今後も、こういった「思いついて、すぐやる」を試してみたい。


2011年12月9日金曜日

PreferenceActivity でサマリを動的に変更したい。



現在作成中のアプリでは、PreferenceActivityを利用しています。

設定した値によって、表示されている項目のサマリーが変更するとステキなので、実装をします。



こういう感じで、設定項目の下に設定値を表示したい。
具体的には、項目の内容が変更されたときのリスナーを設定し、コールバックメソッドでサマリーの内容を書き換えます。

リスナーの設定を
onResume()

で行い、解除を

onPause()


で行なっています。


 SharedPreferences.OnSharedPreferenceChangeListener listener; //設定値変更時のリスナーを保存するField
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.preference_activity);
  addPreferencesFromResource(R.xml.party_preference);
  
  //省略
  listener = setOnChangeLitener();
 }
 
 //設定値変更時のリスナークラスの定義
 private SharedPreferences.OnSharedPreferenceChangeListener setOnChangeLitener() {
  return new SharedPreferences.OnSharedPreferenceChangeListener() {

   @Override
   //コールバックメソッド
   public void onSharedPreferenceChanged(
     SharedPreferences sharedPreferences, String key) {
    // TODO Auto-generated method stub
    Log.d(TAG, "value is changed");
    //全てのPreferenceに実行する
    findPreference(key).setSummary(
      sharedPreferences.getString(key, ""));
    //特定のキーの場合のみ、実行する
    if(key.equals(SEARCHBOOKS_KEY)) 
    searchbooksPref.setSummary(
      searchbooksMap.get(sharedPreferences.getString(key, ""))); }    
   }
  };
 }

 @Override
 protected void onPause() {
  // TODO Auto-generated method stub
  super.onPause();
  //登録
  getPreferenceScreen().getSharedPreferences()
    .unregisterOnSharedPreferenceChangeListener(listener);
 }

 @Override
 protected void onResume() {
  // TODO Auto-generated method stub
  super.onResume();
  //消去
  getPreferenceScreen().getSharedPreferences()
    .registerOnSharedPreferenceChangeListener(listener);
 }  

2011年12月4日日曜日

Mixi Scrap Challenge

mixi scrap challenge に参加してきました。

じつは、開発と言うかコーディングをともなう外部のイベントの経験は少ないのでわりとドキドキでしたね。

ザックリとした内容は、主催者側が用意したWEBページ中にある脆弱性を発見し、それを利用した動作を行わせる、と言うもの。

基本的に入力フォームにスクリプトを流しこんで、動作させる形式でした。

中には、Hackerのロマン心をくすぐるような問題も・・・

問題のネタバレはできませんが、レベルがそれなりの物からけっこう高いものまで選り取りみどりでした。

そして、多分私のチームは最下位ではないかと・・・orz

しかし、両隣の方々に助けられてなんとかいくつかの問題をクリアすることができました。

良かった、良かった。

WEBアプリケーションの開発は、研究でそこそこにやりますがセキュリティを考慮したものとはとても言えず・・・

スクリプトを走らせたりは、自宅サーバーでも行なっていますが、こちらもそこまでのものでもなく・・・

とは言え、基本的に「物を作る側」で在り続ける自分が「壊す側」に回ることができたことは非常にいい経験でした。














写真は終了後の懇親会です。同じ大学の方が多かったのが印象的。

今後もこういったイベントがたくさんあると、面白いですね。

とりあえず、様々なかたに進めてもらったこの本を読んで勉強をしようと思います。

在学中に、こういうイベントを主催するのも面白いなぁ・・・


参加者の皆様、お疲れ様でした。

2011年11月29日火曜日

JSONGen JSON文字列からJavaのコードを作りたい

WebAPIなんかを利用する際、JSON文字列を取得し解析し、JAVAのクラスとして利用することは割とある。

データの量が少ないものならば良いが、多くなってくると自分でコードを書くのが面倒くさくなる。

そんなとき、このようなサービスがあった。


JSONGen

使い方は簡単、URLにWebAPIのリクエストを書けばいい。

折角なので試してみよう。

URLを
http://express.heartrails.com/api/json?method=getAreas

とし、パッケージ名、クラス名を適当につける。

また、Use Java 5 Genericsにチェックを付ける。


次のようなJAVAのコードが得られる。


package tets;

import java.util.List;

public class Result1{
    private Response response;

  public Response getResponse(){
  return this.response;
 }
 public void setResponse(Response response){
  this.response = response;
 }
}


package tets;

import java.util.List;

public class Response{
    private List area;

  public List getArea(){
  return this.area;
 }
 public void setArea(List area){
  this.area = area;
 }
}


これは便利。

ただし、JSONにJavaの予約語を利用している場合は注意。問答無用で変数が作られるので、困ったことになる。

その場合は、利用しているライブラリによって異なるが例えばJSONICならアンダースコアをつけることで回避できる。

何にせよ便利。

2011年11月27日日曜日

WindowsPhoneで何かやる

WindowsPhoneの開発を始めます。

とりあえず、WindowsPhoneHolidayAppsコンテストを目指して。

UX-TVを参考にしながらインストール。

言語を英語にしてしまって、面倒くさい事になった以外はとくに何も問題はなく進みました。

ちなみに、VisualStudio2010はすでにインストールは既にインストールしてありましたが、時間は30分くらいかかったように思います。

同じくUX-TVを見ながらテストアプリの実装。

エラー    1    アセンブリ ファイルパス\プロジェクト名.dll を読み込めませんでした。このアセンブリは Web からダウンロード済みである可能性があります。アセンブリが Web からダウンロード済みである場合は、ローカル コンピューター上に存在する場合でも Web ファイルであることを示すフラグが設定されています。フラグにより、このようなアセンブリをプロジェクトで使用されることがないようにできます。フラグの設定は、ファイルのプロパティを変更することで変更できます。信頼できるアセンブリについてのみブロックを解除してください。詳細については、http://go.microsoft.com/fwlink/?LinkId=179545 を参照してください。

なるエラーが発生。共有フォルダ上にプロジェクトを作ったことが問題みたいなので、ローカルに移動。

回避方法もあるようだけど未確認。

さて、ハッカソン当日とコンテストで何を作るかを考えるとするか。

多機能日付計算機 リリース

トップ画面

デザインを大幅に変更してリリース。

AndroidMarkey-多機能日付計算機

来週中には、平日のみの計算機能をつけてバージョンアップができるのではないかと考えている。

Marketをぱっとみた感じで、他に営業日計算を実装しているアプリを見たことがないから強みになれる、はず。

レイアウト絡みはこれ以上いじると面倒になるのでスルーで。


本当は、休日一覧を返すWebAPIを実装することを考えていたけど見送り。

他で使えるっちゃ使えるけど、特に用途を思いつかないし。いや、公開すればいいだけの話だけど。

明日からはWindowsPhoneの開発にシフト。

テーマは年末年始なんだけどあんまりネタが固まってないので、HellowWorldとUI弄りくらいにする?かな。

格好いいUIのデザインができるようになりたいものです。

2011年11月26日土曜日

Android RelativeLayoutについて

RelativeLayout
layout_alignParentLeft=true
でも、左寄せにならない現象が発生。

こんな感じ

青い部分のアイコンが中央にある
















結果、利用していた画像が大きすぎることが判明。

Market登録用に用意した512x512を使っていたのが悪かった。

72x72にリサイズして同じパラメータで挑戦。

こうなる。

左によった。TextViewも追加 















という訳で、多機能日付計算機のレイアウトを大幅変更中。

平日のみの計算機能も搭載してリリース予定。

2011年11月22日火曜日

HTM5とPHPで作るインタラクトタテカン

今年度の調布祭での企画その2

TwitterのUserStreamAPIを利用して、適当に更新される立て看板を作ろう! という企画。

折角なので、HTML5準拠のJavaScript、CSSを,HTMLを利用した、つもり。

こちらもGitHubにアップロードしている。処理のメインとなるPHPとJavaSctiptがメイン。HTMLとかはご自分で。


TwitterStreamingSignBoard

簡単なシステムの動作図を描いてみて、今年度の冊子に載せてみたりした。



PEARのOAuthの使い方がよく分からなくて、ソースコードを読みまくってどうにかしたとか、いい経験だったね、ホント。

実質的なコーディング時間は半日程度だったのではないかな?

ちなみに最初はStreamingAPIのFilterを利用していた。でも、全体の1%(?)しか取得しないので、ほとんどお目当てのTweetを取ることができず断念。

OAuth認証で詰まってたときは、HomeTimelineを定期更新すればいいじゃないか!! って言われてたけど、意地と根性でどうにかした。

やっぱり、APIやライブラリのリファレンスが読める程度の英語力が必用だな、と思う今日この頃。

2011年11月21日月曜日

調布祭Nav2011

実は、大学の学祭で展示、模擬店の案内システムを作ったりしてました。

私が実装した部分をGitHubに上げたりしてみたり。

Liability2011-Server


あと、展示用のシステム概要ポスターとかを作ってみたり。



久々の更新ですね。ほんとに。

Twitterからこっちに来る人とかいるのかな? 開発履歴とかを書いておけばいいのかな?

2011年8月11日木曜日

SSHサーバーの構築

踏み台用SSHサーバーを作る
例によって,ScientificLinuxです.
I.構成
イメージとしては,
SSHサーバーに,su可能なユーザー(house-gate)を一人追加し,そいつにログインする.

LAN内のマシンは全て公開鍵認証だが,house-gateには鍵を持たせない.

LAN内のマシンにアクセスするには,ポート転送を行う必用がある.

SSHのデフォルトのポートを変更する.

一定回数アクセスに失敗すると,/etc/hosts.denyに追加され,アクセス不可になる.

SSH意外のLAN外からのアクセスは全て遮断.


と言ったところだろうか.
II.実行
1.ユーザの追加.
いつもどおり,useraddコマンドとpasswdコマンドで.今回は特に設定を変更しない.
ただし,このユーザにログインする方法も公開鍵認証限定とするので,クライアント候補のマシンは鍵の交換を行う必要がある.

2.SSHDの設定変更
Port Port番号

Protocol 2

PermitRootLogin no

RSAAuthentication yes
PubketAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

PasswordAuthentication no
PermitEmptyPasswords no

AllowGroups wheel


iptables_setting.sh
#!/bin/bash

service iptables stop

iptables -F

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT

iptables -A INPUT -p tcp --dport PORT -j ACCEPT

iptables -A INPUT -p tcp --syn -j DROP

service iptables save

service iptables start

この状態でアクセスが可能なことを確認.
III.セキュリティ
次に,ログイン失敗回数制限の設定
1.リポジトリの追加
/etc/yum.repos.d/sl-riken.repo

[riken]
name=Scientific Linux $releasever - $basearch
baseurl=http://ftp.riken.jp/Linux/dag/redhat/el6/en/$basearch/dag
gpgcheck=1
enabled=0
gpgkey=http://dag.wieers.com/packages/RPM-GPG-KEY.dag.txt

# yum -y install rpmforge-release
# yum -y install epel-release
# yum -y install atrpms-repo

2.パッケージの追加
#yum -y install python python-devel
#yum -y install deneyhosts

3.設定の変更
#vi /etc/denyhosts.conf
PURGE_DENY =   
#拒否する時間.空欄なので,永久に拒否.
DENY_THRESHOLD_INVALID = 1
#存在しないユーザへのログイン拒否するまでの回数.1回で拒否.
DENY_THRESHOLD_VALID = 3
#存在するユーザへのログイン拒否するまでの回数.3回で拒否.
DENY_THERSHOLD_ROOT = 1
#ROOTログインを拒否するまでの回数.1回で拒否.

4.デーモンの起動
/etc/rc.d/init.d/denyhosts start
chkconfig denyhosts on



2011年8月9日火曜日

WEBサーバーの公開まで:iptablesとSELinux

カーネルパラーメタの設定を行う

#vi /etc/sysctr
#pingのブロードキャストに反応しない.
net.ipv4.icmp_echo_ignore_broadcasts = 1

#不正なICMPエラーの無視
net.ipv4.icmp_ignore_bogus_error_responses = 1

#SYN Cookiesの有効化
net.ipv4.tcp_syncookies = 1

#ICMPリダイレクトの無視
net.ipv4.conf.all.accept_redirects = 0

#パケット転送を行わない
net.ipv4.ip_forward = 0

#ソースルーティングパケットの破棄
net.ipv4.conf.default.accept_source_route = 0

上記の設定の有効化.
#sysctl -p

iptablesの設定を考える.
1.pingはローカルエリア内の物のみを受け付ける
2.SSHも同様
3.ローカル外のネットワークからの接続は,HTTP意外は全てDrop
#!/bin/bash

#
#stop iptables
#
service iptables stop


#
#filter reset
#
iptables -F

#
#allow local loop back
#
iptables -A INPUT -i lo -j ACCEPT

#
#1. allow 'ping' command from local net wark
#
iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT

#
#2. allow 'secure shell' from local net word
#
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT

#
#3. allow 'http' from word wide web
#
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

#
#drop another tcp packets
#
iptables -A INPUT -p tcp --syn -j DROP

#
#save setting
#
service iptables save

#
#start iptables
#
service iptables start


SELinuxの設定
ユーザーを追加して,Apache入れて,CGI許可して,ユーザーディレクトリを許可する

今回は,NFSを使ってディレクトリの共有は行わず,以前の環境のファイル類をrsyncを使って転送した

$rsync -avz -e ssh ~/ server:~/

まあ,こんなことをやったので,.ssh以下もコピーされたりしてちょっと焦ったけどorz

httpdを立ち上げても,403が出て接続不可能.原因はおそらくSELinux,と言うことで一旦無効にしてみる
#setenforce permissive

エラーが解消されることを確認.

# getsebool -a | grep httpd | grep home
httpd_enable_homedirs --> off
# setsebool -P httpd_enable_homedirs 1
# getsebool -a | grep httpd | grep home
httpd_enable_homedirs --> on

最後に,ラベルの張替えを行う
$restorecon -R ~/

これで,接続完了.

SELinuxに関しては(も?)知識が全く足りていない.半分以上「何だかよく分からないけど,動いている」状態.

非常に危険.

今宵は,ここまで.
参考サイト
2done.org Apacheのmod_userdirを使う



----追記----

Wikiのパーミッションの変更に関してちょっと詰まった.

ホームディレクトリのパーミッションを変更しなかったのが原因.

あとは,参考サイトの通りの設定と
/plugin/code
のパーミッションを
755
に,所有者,グループをrootに.

参考サイト
PukiWikiをお引越し


2011年8月8日月曜日

NFSでホームディレクトリの共有設定

ネットワークの再構築計画で,サーバーの分割を行うことになった.

しかし,一つのサーバーに複数のユーザーがいて,またその数だけホームディレクトリが存在するのは,管理の面でも非常に面倒くさいと思う.

そこで,NFSを利用してホームディレクトリの共有を行う。

サーバーは,
CentOS5.6 final

クライアントは
ScientifcLinus 6.1

ちなみに,今後導入するOSは,基本的にScientificLinuxとなっていく予定だ.

以下,手順.

nfsの設定
サーバー
1:パッケージのインストール
#yum -y install nfs-utils portmap

2:サービスの起動
#/etc/rc.d/init.d/portmap start
#/etc/rc.d/init.d/nfslock start
#/etc/rc.d/init.d/nfs start

3:アクセス制御
#vi /etc/hosts.allow
portmap : 192.168.1.0/255.255.255.0

4:共有設定
#vi /etc/exports
/home/---- *.ドメイン(rw)


◎オプション
--参考サイトを参考のこと

5:設定の更新
#exportfs -ra

6:確認
#showmount -e

クライアント
1:パッケージインストール
#yum -y install nfs-utils

2:デーモン起動
#/etc/rc.d/init.d/rpcbind start
#/etc/rc.d/init.d/nfslock start

3:マウント
#mount -t nfs ホスト名:/home/---- /home/----

後は、ユーザーIDを指定してユーザーの追加を行う.

クライアントで
mount.nfs が無かったため詰まり,
rpcbindの起動が必用なことを知らなかったため,詰まった.

これで,ホームディレクトリの共有ができた.

ちなみに,今回追加設定を行ったユーザーは,管理用のユーザー.

WEBサーバーの機能移行のためには
1:WEBサーバー用のユーザー
2:SFTP用のユーザー

が必用(たぶん、うちの環境だけ)

また,nfsクライアント側でfstabの設定や,ランレベルの設定,そして、起動順の設定を変更しなければならない.

参考にしたサイト
NFSの設定/Server Config
NFSサーバの設定Linux
Linux 新規ユーザーの追加

2011年8月5日金曜日

ネットワークの構成について考える

現状

-ルーター --- サーバー1(WEB,SSH,VPN,Samba)
                |
                --サーバー2(SSH)
                |
                --クライアント群

サーバー1のWEBページ関連の内容を,サーバー2に毎週バックアップを取って運用している.

しかし,管理の面からサーバーで提供するサービスをサーバー毎に分割し,ログを一括でまとめたほうが

・セキュリティ
・ログ監視
・冗長性

などの点で良いのでは? と妄想。

まずは,WEBサーバーを分離から実行。

ホームディレクトリを、統括用のサーバーに作ってWEBサーバーと同期.

LDAPサーバーの導入も検討(LDAPの実態調査も)