このページの記事一覧

2012年12月31日月曜日

2012年の振り返り

去年も振り返りを書いたので今年も書こうと思います。

まずは目標の振り返りから。

  1. お仕事頑張る
  2. お子様に元気でいてもらう
  3. 情報セキュリティスペシャリストを取る
  4. 体重を6kg落とす
  5. 新しい技術をちゃんとキャッチアップしていく


  1. 頑張ったね。よう頑張った。
  2. 中耳炎になりましたが概ね元気だったと思います。あ、でも6月は風邪っぴきだったなぁ……
  3. 無事取れました!さらにネットワークスペシャリストも取れました!びっくりです
  4. あー、ごめんなさい。一時落ちたけど戻りました
  5. これはまぁ、100%ではないけど、それなりにできてたかな?もうちょいScalaやりたいなぁ

全体では70%ってとこでしょうか。

昨年にも増して今年は忙しかったと思います。
もちろん第2子が産まれたって言うのもあるんですが、仕事の面でも新しい事だらけでした。
昨年と同じっていうものは本当に少なく、新しい事をどんどん覚えていかないといけません。
まぁこれは誰でも同じかとは思いますが。

セキュスペとネスペが両方取れたわけですが、ちょっと変わった所では簿記3級に合格しました。
仕事で使う事はまずないですが、それは今までの色んな資格でも同じ事なので、今更なんで気にしない。来年は2級受かりたい。

来年もまた忙しい一年になりそうです。
会社では今年は下に2人増えました。
1人は仕事も結構覚えてきて自分らしくできてきていますが、もう1人はまだまだ修行中。
自分が楽できるのはまだまだ先のようです……
自分の仕事だけじゃなくて、人の管理やら入社面接やらやることは増える一方ですが、今が頑張り時なのも確かです(3年くらい前からね!)

あ、Kindle買いました。紙の書籍を買わなくなることはまずないですが、外出時に気軽に持っていけるため重宝しそうです。

今年もガキの使いみながらざっと振り返りました。
来年の目標も立てておこうと思います。


  1. 自分の仕事より管理をメインに頑張る
  2. 保育園とかの行事頑張る
  3. Ruby Silver と 簿記2級に合格する
  4. アウトプットをちゃんとしていく

そんなわけで、今年も残すところ後15分切りました。
来年も良い1年になりますように。

2012年7月28日土曜日

シェル操作課題 (cut, sort, uniq などで集計を行う)

Twitterで流れてきたのでやってみた。
多分awkとか使った方がスマートなんだろうけど、ちょっと避け気味なので使ってません。
(元ネタ => http://d.hatena.ne.jp/Yamashiro0217/20120727/1343371036)

元ファイル(server.log)

server1,1343363124,30,/video.php
server2,1343363110,20,/profile.php
server3,1343363115,7,/login.php
server1,1343363105,8,/profile.php
server2,1343363205,35,/profile.php
server2,1343363110,20,/profile.php
server3,1343363205,30,/login.php
server4,1343363225,12,/video.php
server1,1343363265,7,/video.php

問1 このファイルを表示しろ

cat server.log

問2 このファイルからサーバー名とアクセス先だけ表示しろ

cut -f1,4 -d, server.log

問3 このファイルからserver4の行だけ表示しろ

grep server4 server.log

問4 このファイルの行数を表示しろ

wc -l server.log | sed -e 's/server\.log//g' -e 's/ //g'

問5 このファイルをサーバー名、ユーザーIDの昇順で5行だけ表示しろ

sort server.log -k 1,1 -k 3n -t , | head -n5

問6 このファイルには重複行がある。重複行はまとめて数え行数を表示しろ

sort server.log | uniq | wc -l | sed -e 's/ //g'

問7 このログのUU(ユニークユーザー)数を表示しろ

cut -f3 -d, server.log | sort | uniq | wc -l | sed -e 's/ //g'

問8 このログのアクセス先ごとにアクセス数を数え上位1つを表示しろ

cut -f4 -d, server.log | sort | uniq -c | sort -nr | head -n1 | sed -e 's/^ *//'

問9 このログのserverという文字列をxxxという文字列に変え、サーバー毎のアクセス数を表示しろ

cut -f1 -d, server.log | sort | uniq -c | sed -e 's/server/xxx/' -e 's/^ *//'

問10 このログのユーザーIDが10以上の人のユニークなユーザーIDをユーザーIDでソートして表示しろ

cut -f3 -d, server.log | sort -n | uniq | egrep '[0-9]{2,}'


cutとsortしまくりや!

2012年4月5日木曜日

2つのリストを同時に処理する

うまいタイトルを思いつかなかったんですが、要するにJavaで言うところの

   1: List<Integer> xs = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
   2: List<Integer> ys = Arrays.asList(11, 12, 13, 14, 15, 16, 17, 18, 19, 20);
   3: List<Integer> zs = new ArrayList<>();
   4:  
   5: for (int i = 0; i < xs.size(); i++) {
   6:     zs.add(xs.get(i) + ys.get(i));
   7: }
   8:  
   9: // 出力処理

と同じことをScalaでやるにはどうするのかなーということです。
とりあえず調べたり、自分で考えたりした結果、3(+1)パターンは分かりました。



   1: // 前提
   2: val xs = 1 to 10
   3: val ys = 11 to 20
   4:  
   5: // リストを要素としたタプルを作って、zippedしてmapする
   6: val z1 = (xs, ys).zipped.map((x, y) => x + y)
   7:  
   8: // for式を利用する
   9: val z2 = for ((x, y) <- xs.zip(ys)) yield x + y
  10:  
  11: // タプルを要素としたリストを作ってmapする
  12: val z3 = xs.zip(ys).map(t => t._1 + t._2)
  13:  
  14: // 上と一緒だけど、パターンマッチを使ってみた
  15: val z4 = xs.zip(ys).map{case (x, y) => x + y}

一応自分の備忘録として。
他にもこんな書き方あるよ!っていうのがあればぜひ教えてください(xs.zip(ys) は xs zip ys って書けるよ!っていうのは除いて)。


(Scalaのコード書いてからJavaのコード書いたんだけど、Java書くの面倒臭いなw)

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になるらしいので(自分が知らないだけかも)、日記やボイスの投稿もネットワーク上のデータをキャプチャされると全部丸見えですよ。