このページの記事一覧

2012年3月26日月曜日

int xしか変数を使わずに1から100までの和を求められるか?

何かTLで流れてきたのでJavaで書いてみた。
こういうことであってるよね?

   1: public class X {
   2:     public static void main(String[] args) {
   3:         int x;
   4:         for (x = 1; (x & 0xFFFF) <= 100; x++) {
   5:             x += x << 16;
   6:         }
   7:         System.out.println(x >> 16);
   8:     }
   9: }

2012年3月16日金曜日

お釣りの枚数を最小にするための支払い方を考える

たまにありますよね。
お財布の中を見たらやたら1円玉とか10円玉が溜まっているとき。
え?ないですか?
お支払いの時ちゃんと考えてるんですね!

ってわけで、所持金からどういう払い方をすればお釣りの枚数が一番少なくなるのか。
言い換えればお財布の中を最適化するためには、どう支払えばいいのか。
っていうのを算出するプログラムを書いてみました。

プログラミング初心者への練習問題、プログラマ歴3年くらいの人への実力診断、などなど良い難易度かもしれません。

今回は自分の練習も兼ねてScalaで書いてみました。

[ payment.scala ]
   1: object Main {
   2:   
   3:   implicit val coins = List(1, 5, 10, 50, 100, 500, 1000, 5000, 10000)
   4:   
   5:   def main(args: Array[String]): Unit = {
   6:     if (args.length != 2) sys.exit(-1)
   7:     
   8:     val Array(pocket, price) = args.map(_.toInt)
   9:     
  10:     if (pocket < price) sys.exit(-1)
  11:     
  12:     val payment = getNumberOfCoinsOfPayment(pocket, price)
  13:     (coins zip payment).foreach(println)
  14:   }
  15:   
  16:   def getNumberOfCoinsOfPayment(pocket: Int, price: Int): List[Int] = (getNumberOfCoins(pocket), getNumberOfCoins(pocket - price)).zipped.map(_-_).map(minusToZero)
  17:   
  18:   def getNumberOfCoins(money: Int)(implicit coins: List[Int]): List[Int] = (coins :\ (money, List[Int]())) {case (c, (b, list)) => (b % c, (b / c) :: list)}._2
  19:   
  20:   def minusToZero(n: Int): Int = if (n > 0) n else 0
  21: }

[ 実行 ]


> scala payment.scala 2892 987


[ 結果 ]


(1,2)
(5,0)
(10,4)
(50,1)
(100,0)
(500,0)
(1000,1)
(5000,0)
(10000,0)

エラー処理とか結果表示とか適当すぎますが、まぁ大目に見てくださいw


突っ込みどころとかあったら、ぜひお願いします。

2012年3月6日火曜日

mixi はホンマ恐ろしい所やで

みなさんこんにちは。
元気にしてますか?
ぼくは元気です。

ところで皆さん使ってます?mixi
ミクシィって読みます。
今日はちょっとmixiの怖い所をみんなに教えちゃうよ。

mixiのログイン画面が2つあるのを知ってますか?

mixi1
図1

 

mixi2
図2

まぁ、この時点ではっきりと2つの違いが分かってて、これから何を言おうとしているのか分かってる人は、多分以降は見ても仕方ないので、回れ右でOKです。

それぞれのアドレスバーを良くて見てみると、
図1はhttp:// で始まってます。図2はhttps:// で始まってますね。

なんだ、そんなことか、と。

ちょっと待ってください。本当にそんなことなんでしょうか。
世の中には色んなソフトウェアがあるもので、パケットキャプチャソフトというものがあります。
簡単に言えばネットワーク上に流れているデータをモニタリングすることができるソフトです。
今日はWiresharkというソフトを使って、2つのログイン画面から送信されるデータの違いを見てみます。


mixi1_input
図3

 

mixi1_packets
図4

図3は図1の画面にメールアドレスとパスワードを入れてみたところ。
図4は「ログイン」ボタンを押した際にネットワーク上に流れたデータ。
注目すべきは図4の赤枠の部分です。
入力したメールアドレスとパスワードが丸見えですね。
(いわゆる平文ってやつです)

例えば、ネットカフェとかで同じことされたらどうでしょうか?
・・うふふ(檸檬先輩風に)

じゃあもう一つのログイン画面はどうでしょう。

mixi2_input
図5

 

mixi2_packets
図6

図5は図2の画面にメールアドレスとパスワードを入れてみたところ。
図6は「ログイン」ボタンを押した際にネットワーク上に流れたデータ。
注目すべきは図6の赤枠の部分です。
Encrypted Application Data というようにデータは暗号化されて流れています。

つまりどんなデータが送信されたのか分からなければ、どんなページにアクセスしたのかも分かりません。
暗号化されてるから安心ですね。

というわけで、mixiにログインする際には気を付けてくださいね(httpsのページを使いましょうね)。
デフォルトのログインページがhttpなのはいかがなものかなぁ~と思うわけですよね。
同じようなことを何年も前に書いてる人いるだろうけど、何となく書きたくなったので。

ちなみにログイン後はどんなに頑張ってもhttpになるらしいので(自分が知らないだけかも)、日記やボイスの投稿もネットワーク上のデータをキャプチャされると全部丸見えですよ。