長野ソフトウェア技術者グループ (NSEG) 第 1 回勉強会 私的不完全議事録

3 月 13 日(土)に、長野ソフトウェア技術者グループ(NSEG)主催の第 1 回勉強会が、長野市新田町の「もんぜんぷら座」で開催されました。初回は一人 10 分の持ち時間で技術についての発表をする LT (Long Talk)大会で、私(春原)を含めて 6 人が発表を行いました。

Ustream 中継された動画の録画をもとに議事録を起こしましたので、ご利用ください。


ET ロボコン面白いよ! (小林 思無邪さん)

自己紹介

  • ID: @shimuyan
  • 長野高専豊橋技術科学大
  • 組み込み系の会社 3 年目

ET ロボコンとは

  • 正式名称: ET ソフトウェアデザインロボットコンテスト
  • ロボットを走らせる大会 (LEGO 社の「マインドストーム」)
  • 走行成績 = 走行タイム - 獲得ポイント (コース内の ☆ を取るといい成績が取れる)
  • 走り方 = ライントレース (動画の URL を張ったけれどネットワーク環境がない!)
  • どんな風に作ったのかも競う
  • 何が楽しいのか?
    • LEGO 懐かしい
    • ARM ハァハァ
    • 自分にとっては単純に作って動かすのが楽しい

勝つためのポイント

  1. とにかく速く走ることより確実にゴールすること
    • 完走率は半分くらい
    • [Best] ポイントを取ってゴールする > [Better] ポイントを取らずにゴールする >> [Bad] ポイントを取ってコースアウトする
    • ウサギよりカメのほうが強い
    • 自分のチームは Bad パターンだった orz
    • 他のチームの走り
      • まともな人の走り方: 道なりに安全運転
      • デキる人の走り方: 難所に挑戦してポイントゲット
      • キレた人の走り方 (2007 年): 道なんてシラネ。おいしいとこだけ!
        • 道を無視してポイントを取りまくる
        • ゴールの線を逆側からまたぎ、ちょっとバックしてゴールイン──規約違反ではないらしい
      • 2009 年にも同様の戦略でポイントを取りまくったチームがあった
        • 道のない所を走れるのは、モーターの回転角が取れるから
  2. デザインパターンを使ってバリバリの OO モデルにすることより、分かりやすいモデルにすること
    • 審査員も人の子、分かりやすいように書く
    • 分かりやすさとは? キーワードは「トレーサビリティ」
    • トレーサビリティがない例
      • ユースケースには「コースを走る」とある
      • 暮らす図にはコースクラスがなくてラインクラスがある
      • ラインクラスはどこから出てきた?
    • すごく当たり前のことで、仕様書でも同じ

最近のモデル

  • 開催当初の 2002 年は「コースを走ること」が一番だった
  • だんだんモデルができてきた
  • ここ数年は要求分析に重きを置くようになってきた。DSM とか自動生成をしたりするのがトレンド
  • 今年(2010 年)は SysML が増えるとの見解。要求がモデルとして表せて関連づけられるのはよさそう

質疑応答

  • プログラミング期間は。

    →コース発表は 4 月に入ってから。大会は 9 月。大まかなコースは毎年同じで、難しい細かい部分が年ごとに変わる
  • ET ロボコンの参加者層は。

    →大学生、高専生、高校生、会社でチームを組んで出ている人たち、個人の趣味でやっている人たちなど様々。会社の新人教育の一環でやっているところも
  • 開発の仕方は。

    →言語は、去年までのモデルでは C、C++Java。今のモデルは C と C++ だけ。Cygwinコンパイルできるセットが配布されている。Eclipse でやっている人も


IT でみんなを幸せに、IT で自分も幸せに (春原 宏保)


自己紹介

  • 春原 宏保 (すのはら ひろやす)
  • 長野工業高校のすぐそばに住んでいる
  • 長野市内でプログラマー。定刻主義

IT って?

  • 証券取引所の巨大システムや交通制御系のような巨大システム
  • ウェブ系サービス
  • ゲーム
  • CG
  • それらを裏方で支える基盤技術

私が作っているもの

  • 業務系アプリとセキュリティソフト
  • 華は(あんまり)ない
  • 需要は(たぶんたくさん)ある

業務系アプリなんてつまらない?

  • 自分にとってソフトウェアを作ることの楽しさとは? ソフトウェアを作ることでこうなると「俺ってスゲー」と思う
    • 今までできなかったことができるようになった
    • 今まで面倒だったことがカンタンになった
    • 今まで一晩かかっていたことが 5 分で終わるようになった
  • 他の人が使うソフトも同じ
  • 自分で作って食べるご飯もいいけど、人にご馳走して「おいしい」と言われると嬉しい
  • 「あなたに作ってもらったシステムのおかげで助かった」と聞くと、「俺がこの会社を救ったんだ」と思える
  • おまけに、費用はほとんどかからない
    • 開発環境も文書もウェブで手に入る
  • こんなにいい仕事はほかにはない
  • 中小や個人事業主に IT の便利さを伝えるには? →小規模システム開発
  • 今から、個人で開発した小規模システムの事例を紹介するので、今後のキャリアを考えるヒントにしてほしい

事例 1: 製造業納品管理

  • 自動車部品製造の町工場
  • 納品台帳を紙に手書き、それを Excel に入力して集計
  • 月末にはセルを手作業でコピペして体裁を整えて印刷

とにかくカンタンに使えるものを

  • IT スキルが低い会社だったので、なるべく機能はつけずシンプルにする
  • 叩くキーの回数はなるべく少なくする
  • ステータスバーにヘルプが表示されるようにし、「とにかく分からなくなったら一番下を見てね」
  • 月次の集計表も集計ボタン一発
  • 月次処理というものが要らないということを理解してもらうのに苦労した
  • 印刷すると用紙の左端中央に黒い三角形がつく。これは二穴パンチ用のガイド。これをつけただけでかなり喜んでもらえた

事例 2: 葬祭業給料計算

  • とにかく計算が面倒なので、この葬祭業者が会計事務所に委託
  • しかしその会計士も音を上げて、別の社労士に委託
  • その社労士も Excel でがんばったけれど、やはり面倒で私に投げられた

入力に集中できるソフトの作成

  • 入力はカンタンに。カーソルキー、テンキー、スペースキーとエンターキーだけで入力できる
    • ○印をつける欄はセルをダブルクリックするかスペースキーを打つ
    • 時刻は「1950」のように 3〜4 桁の数字を入れるだけ
  • 老眼なので、選択行は左端の日付の色を変えた

業務系アプリは面白いよ

  • SI 業界は 3K 呼ばわり
    • キツい
    • 帰れない
    • 給料が安い
    • 婚期が遅れる、化粧乗りが悪い、クサい(風呂に入る暇がないので)などと言葉遊びで言われたい放題
  • でも、自分の頭だけで人の問題を解決できる爽快感
  • ある意味でコンサルタントに似ている

人を幸せにする IT

  • IT の意義……面倒くさいことをシステムに任せて、人間は人間にしかできないことをやる
  • あるお菓子屋さんの話
    • 饅頭の皮を包む機械を導入しようとした
    • 菓子職人は最初は猛反発した。「自分たちの仕事がなくなる!」
    • 実際に導入してみると、饅頭の皮を包むという単純作業から解放され、職人がもっとクリエイティブな仕事ができるようになり、職人のモチベーションが上がった
  • IT でも同じことができるのではないか。つまらない仕事から社員を解放し、職場や組織を幸せにできる
  • ついでにプログラマーも幸せに

いろいろな人に話を聞こう

  • 今の話は狭い世界の話
  • いろいろな業界で楽しそうにしている人の話を聞こう
  • 「この業界、面白そうだな」と思える話を増やしていき、その中で自分に向いていそうな仕事を決める
  • 結婚と同じで縁。縁をどれだけ見つけられるかは、自分の足でどれだけ情報を探せるかだ

質疑応答

  • 「定刻主義」を貫くためには。

    →運だと思う。ひどい会社に行ったら有休すら取れない。今常駐している会社が緩いので、そういう会社にいるという幸運もある。一つの方法は、実力をつけて「アイツはデキるから、今日は定時で帰っても間に合うだろう」という実感を周囲に持たせること。
  • 例に挙げた業務系アプリの制作期間は。

    →事例 1 の納品管理は 1 週間くらい。同じプログラム中で生産管理の機能もあるのだが、そちらは手こずったのとチンタラやっていたので数年かかった。事例 2 は「あと 1 週間で作れ」と言われたので死ぬ気で 1 週間で作った。


Ajax システム開発で学んだ高速化手法について (you_got さん)

1. GIS & Ajax

2. Ajax の問題

  • HTML + JavaScript という昔からある技術
  • 最近のブラウザなら JS の高速化がされているが、ウチのターゲットはあの IE6 だった
  • 重: 地図を立ち上げただけでメモリ消費量が 100MB。古いクライアントだと立ち上げただけで OS が止まる
  • 遅: 起動に 15 秒、動作にもたつき
  • 工夫が必要!

3. 工夫してみた

  • 工夫 1: 通信を減らす
    • 複数のリソースリクエストは同時にできないので、複数のリクエストをまとめる
    • 別個の画像を 1 枚の画像にまとめ、使う時に必要な部分を切り出して使う。これだけで起動が 5 秒ほど短縮された
    • Web Service をキャッシュ化して取得の高速化
  • 工夫 2: DOM を減らす
    • DOM = 画面上の要素
    • 「コンビニ」と検索すると、画面内にあるコンビニがダーッと出てきて、クリックするとそのコンビニの情報を表示
    • クリック要素は 1 個 50KB、最大 1000 個出すという仕様なので、最大 50MB
    • マウスがクリックできるのは 1 個だけなので、DOM 要素を 1 個だけ作る
    • マウスカーソルの一番近くの DOM 要素だけ作ると軽くなるが、マウスが動くたびに計算するので時間がかかる。1000 点あれば、1000 回の比較が実行される
    • 軽いやり方あるよね?→はてなで質問大物が釣れた! (ただしいただいた回答はちょっと違っていて使えなかった)
    • はてなの質問のコメントで使えるのがあった。木構造で座標を保持すると、1000 点の座標を 10 回の比較で特定できる

皆さんに言いたいこと

  • 技術を楽しもう!
  • チューニングとか楽しい
  • 普通のウェブでは使わない技術を勉強することで、できないと思っていたことができた。こういうことを勉強会を通して勉強していけたらいいなと思う

質疑応答

  • はてなで質問した時のヒット率は。

    →2 つ答えをいただいたのだが、両方とも使えなかった。質問のコメントだけがいい答えだった。1/4 くらいか
  • はてなではよく質問するのか。

    →仕事で 4、5 回は使っている。「答えはあるはずだが、自分の知識の中にその答えがない」場合は質問している。車輪の再発明をするよりもいい。ヒット率は 1/4 くらいか。答えが出なかったこともあったが、回答をきっかけに自分で調べることができたこともあったので、書かないより書いた方がいい
  • 2ch はどうか。

    →読むことはあるが、書いたことはない

IT 勉強会で使う IT (大日向 大地さん)


勉強会で使いたいツール

  • 3 日前に(小林)思無邪君から「Ustream の配信を頼む」と言われたので、今日は Ustream 配信について話す

自己紹介

高専カンファレンス

  • プレゼン型勉強会
  • 高専関係者でなくても参加できる
  • 毎回 20〜200 人くらいの参加
  • 技術、キャリア、サイエンスの話をする
  • 全国各地でやっているので、Ustream + ニコニコ動画YouTube に上げることで、時間と空間を越えるカンファレンスという目標を掲げている
  • 自分は高専カンファレンスで配信担当ではないが、今まで見てきた中でお話ししたいと思う

配信に必要なもの

  • Ustream.tv のアカウント
  • 配信用コンピュータ
  • Web カメラ・マイク
  • インターネット回線

配信であるといいもの

本日の設備

  • Ustream のアカウント (nseg 用アカウントを取得済み)
    • ひとつのアカウントで複数の番組を持てる
  • 配信用コンピュータ (初代 MacBook、これより弱いとキツいかな)
  • Web カメラとマイク (ケーズデンキで 5,000 円くらいで買えるもので十分)
  • インターネット回線
    • 今日はドコモのデータ通信サービスを使っている。長野の場合は EMOBILE よりドコモのほうがいい
    • HTTP が通る回線であれば Ustream は使える。ポートを考える必要は特にない
  • ビデオオーサリング装置
    • Ustream Producer (有料版と無料版があるが、今日は無料版)
    • 実は今日初めて本格的に使う

Ustream を使うメリット

  • 録画できる
  • YouTube へワンクリックでう p できる
  • IRC がついてくる
  • 事実上の世界標準
  • 無料で使える
  • iPhone でもいける

配信設備レベルいろいろ──高専カンファレンスの例

  • 入門レベル (高専カンファレンス東京 LT)……ノート PC、Web カメラ、マイク
  • ステップアップ編 1 (高専カンファレンス in 北海道)……ミキサー、配信用と録画用の PC
  • ステップアップ編 2 (高専カンファレンス 2008 冬 in 東京)……カメラ×2 (発表者用とスクリーン用)
  • 結構がんばってる (高専カンファレンス 2009 秋 in 大東京)……VGA の出力を装置にリンクして発表者のスクリーンを直接配信
  • プロの犯行ww (高専カンファレンス in 長野)……長野高専の映像制作部の協力で、勉強会としては規格外の設備で配信した。カメラもウン十万ないしはもう一桁上のものを 3 台使用

とりあえずやってみればいいじゃない

  • 茶店
  • 居酒屋で
  • スケート場で

質疑応答

  • 帯域によって見えないくらいの解像度になることがあるが、中継したものがそのまま録画されるのか、あるいは現場でもっと高解像度で撮ったものをアップロードできるのか。

    →配信したものが録画されるので、高品位なものを残したければ別途録画設備を用意する
  • WiMAX が長野でも使えるようになったが、配信用としてはどうか

    結構イケるとは聞いている。高速な回線なので、品質さえ保てれば行けるのではないか
  • iPhone でも配信できるようになったが、複数の配信画面を一つの画面に集約して見ることはできるのか

    →できなくはないとは思うが、それらをまとめるバッファが必要になるのではないかと思う
  • 録画のリアルタイムエンコーディングはクライアント側でやるのか

    →クライアントでやるので、高負荷になるとコマ落ちが出てくる。ただ、勉強会では画面はほとんど動きがないので、その点はあまり心配ない。むしろ大事なのは出てきた文字が識別できるか、話している声が拾えるかということ


とりあえず Git 〜Git 入門前夜〜 (天野 卓さん)


自己紹介

バージョン管理システムとは

  • 過去のファイルを保存する
  • 過去のディレクトリの状態を保存する
  • バージョンにメタ情報(誰がどんな修正をしたのか、など)を付ける
  • 保存したディレクトリ感の差分を知る
  • 編集内容にメタ情報を付ける
  • 編集内容をマージする

Git に至るまでの歴史

RCS

  • ファイル単位でバージョンを管理。ディレクトリ単位の管理はできない

CVS

  • 複数の RCS をまとめて管理
  • サーバ/クライアント形式でネットワーク越しの共有が可能

Subversion

  • 高機能な CVS

SVK

  • 中央に一個あるだけでは不便なので、手元に便利に使いたいという要望に応えたもの
  • 自分のホームディレクトリに置く

Git

  • Linux ソースコード管理をターゲットに開発
  • 規模が大きく、更新が頻繁に発生するものに対応

Git の特徴

  • 分散型をサポート
  • 差分ではなくスナップショットを保存する

分散型とは

  • どのマシンもサーバーであり、クライアントでもあり得る
  • リソースはそれぞれのマシンが完全な形で持つ

差分ではなくスナップショットとは

  • 差分(履歴)は保存しない
  • コミット時のスナップショットを取る
  • リソースは必要になるが、あるバージョンを取り出すのは早い
  • オブジェクトデータベースのような管理方法をとっている

Git のどこが Life Changing なのか

  • Git - Fast Version Control System
    • 準備の手間がかからない
      • 「git init; git add; git commit」するだけ
      • 他の場所にリポジトリを用意する必要がない
    • プログラムの応答速度が速い
      • ネットワークの遅延がないため応答が早い
      • 一瞬でローカルブランチが作成される
    • 後から柔軟に修正できる
  • とりあえず Git しておこう!

まとめ

  • Git は簡単に始められます
  • Git は快適です
  • Git は勉強にもなります

質疑応答

  • Windows から使うには。

    →この前試したが、Linux でつけた日本語ファイル名が Windows 側では化けるという問題が自分の使ったクライアントではあった。ただ、Windows でつけたファイル名は Windows で使う分には化けなかった。Windows 環境のサポートはよくなってはきたがまだ弱いと思う
  • Git はコマンドオプションがめちゃくちゃ多くて、自分は全容を掴めない。コツのようなものはあるか

    →シェルに zsh を使っていて、[Tab] を打つと補完してくれる。知らないオプションでもとりあえずハイフンを打って [Tab] を打っている。これがないとキツいなと思う
  • Excel などのバイナリファイルのマージや差分は。

    →多くのバージョン管理システムではバイナリの差分は取っていないと思う。強力なサポートは望めない
  • 読み方は「ギット」か「ジット」か。

    →「ギット」なのは間違いない

Ruby の黒魔術 (とみたまさひろさん)


自己紹介

Ruby の特徴

メソッドが実行時に生成される

hoge(123) #=> エラー
def hoge(v)
end
--------------------
def hoge(v)
end
hoge(123) #=> OK


クラスが実行時に生成される

A.new  #=> エラー
class A
end
--------------------
class A
end
A.new  #=> OK

パース時ではなくて実行時に生成される

if rand(2) == 0
  class A < String; end
else
  class A < Integer; end
end

  • こういう「誰得?」みたいな定義ができるのが黒魔術っぽい所

オープンクラス

  • 既存のクラスを変更できる

class String
  def balse!
    puts "目が、目がぁ!"
  end
end
"ムスカ".balse!

特異メソッド

  • 特定のオブジェクトだけにメソッドを追加

musuka = "ムスカ"
def musuka.balse!
  puts "目が、目がぁ!"
end
musuka.balse!
"レプカ".balse!  # undefined method `balse!'


演算子もメソッド

3+5      #=> 8
3.+(5)   #=> 8

# 既存の演算子の書き換えも可能
class Fixnum
  def +(n)
    self * n
  end
end
3+5      #=> 15

  • 内部的には、「3」というオブジェクトのクラスに「+」というメソッドを適用している(引数は「5」)

クラスもオブジェクト

c = Class.new(SuperClass)  # 名無しクラス
p c       #=> #<Class:0xb744ac84>
c.new     # ちゃんとクラス
Hoge = c  # 定数に代入すると名前がつく
p c       #=> Hoge
Hoge.new

メソッドも動的に生成

class Hoge
  define_method :hoge do
    123
  end
end
Hoge.new.hoge  #=> 123

たとえばこんな感じ

class A
  [:hoge, :fuga, :hage].each do |name|
    define_method name do
      name.to_s.capitalize
    end
  end
end
A.new.hoge  #=> "Hoge"
A.new.fuga  #=> "Fuga"

  • hogefugahage と 3 つのメソッドを生成している

定数の動的取得

class Hoge
  C = 123
  D = "abc"
end
Hoge.constants       #=> ["D", "C"]
Hoge.const_get("C")  #=> 123

文字列からメソッド呼び出し

name = "HogeFuga/nanika"
cname, mname = name.split('/')
lib = cname.gsub(/([A-Z])/, '\\1').downcase.sub(/^_/, '') #=> "hoge_fuga"
require lib
kclass = self.class.const_get(cname)
obj = klass.new
obj.method(mname).call

  • Ruby on Rails では URL から自動的にクラスとメソッドを生成して内部サーバー側で実行するが、これと似たようなことをやってみる
  • class は予約後なので、klass という名前にしてある


宣言っぽいもの

  • メソッドが () がなくても呼び出せることを利用
  • ブロックをオブジェクトとして渡せるのが Ruby の動的でいいところ

define_attribute :port do
  range 1..65535
  description 'TCP/IP port number'
end

  • 実装はこんな感じ。

def define_attribute(name, &block)
  Attribute.new(&block)
end
class Attribute
  def initialize(&block)
    self.instance_eval &block
  end
  def range(r)
    ...
  end
  def description(d)
    ...
  end
end


設定ファイル

$proto = "smtp"
$hostname = "example.com"
$port = 25

  • 上のコードを load "filename"
  • しかしグローバル変数はちょっと……
  • ではハッシュとか

$conf = {
  :proto    => "smtp",
  :hostname => "example.com",
  :port     => 25,
}

  • 上のコードを load "filename"
  • でもプログラムっぽいよね

proto "smtp"
hostname "example.com"
port 25

  • これなら設定ファイルっぽい。これを eval する
  • 実装は下記

class Config
  def initialize(filename)
    eval File.read(filename)
  end
  def proto(p)
    ...
  end
  def hostname(h)
    ...
  end
  def port(n)
    ...
  end
end

その他

  • クラスが継承された時に実行されるメソッド
  • メソッドが存在しない時に実行されるメソッド
  • メソッドが追加/削除された時に実行されるメソッド
  • クラスの祖先を調べる
  • オブジェクトにメソッドがあるか?

黒魔術も正しく使えば白魔術

質疑応答

  • Objective-C に似ているが、Ruby はその影響を受けているのか。

    →私は Objective-C は知らない。RubyObjective-C のどちらが先かは分からないが、Ruby はいろんな言語のいいとこ取りをしていると言われているので、影響を受けているかもしれない
  • 動的で便利だと思う半面、怖い面もある。「ここだけは絶対に書き換えないで」とブロックすることはできるか。

    →まったくできない
  • では、同じライブラリを使う場合でも、A さんが declare した後にライブラリの中身を書き換えてしまって、B さんが使う時は挙動が変わっているということもあるのか。

    →やろうと思えばいくらでも可能。複数人でプログラムを作る時は、その人たちのルールとして決めるしかない
  • では、あまり大規模開発には向かない感じか。

    →よくそう言われるが、私はそうは思わない。同じようなレベルの人でルールをちゃんと決めて、意思の疎通ができていれば大丈夫。……あ、それを「大規模開発に向かない」と言うのか(会場笑い)。Ruby はよく Java と比較される。Ruby は自分の足を打ち抜くことができるが、Java は安全装置が働いてそういうことはできない
  • 会社では、今のようないけないいたずらをよくするのか。

    →会社ではやっていない。白魔術しか使わない。さっきの設定ファイルのようなものは便利なのでよく使っている
  • そのプレゼンテーションのツールは。

    Rabbit という Ruby で作られたツール。テキストファイル(.rd 形式)をこのツールにかませるとプレゼンテーションが始まる。ただしいろいろな表現はできない