ScalaMatsuri 2016のスタッフをしたまとめと教訓

1月30日、31日に開催されたScalaMatsuriのスタッフをしました。

scalamatsuri.org

関係者の皆さんお疲れ様でした。

振り返りMTGなどはまだですが、一段落ついたので一旦まとめてました。

あくまでこれは私個人の見解であり、ScalaMatsuriスタッフの総意ではないことをご留意してお読みください。

やったこと

前回のScalaMatsuriにもスタッフとして参加したので、今回は2回目となりますが今回は初期から参加でした。

チームとしては企画チームとオペレーションチームの2チーム所属です。

企画チームでは、特にプログラムやアンカンファレンスなどコンテンツに関わる部分の担当をしました。

オペレーションチームでは、問い合わせの自動issue化などカンファレンス運営のための自動化や可視化に取り組んでいました。

f:id:kiris60:20160205133347j:plain @okapies さんと2人でアンカンファレンスの朝会の司会などもやりました

普段は知ることのない、カンファレンスの裏方の体験が出来てとても楽しかったです。

また一人のスタッフとしてですが、ScalaMatsuriスタッフにはとても優秀な方々が揃っていたので、 私はともかく改善案や問題定義が思い浮かんだら、とりあえず口に出して議論の切っ掛けを作るよう心掛けていました。*1

教訓

ここから先はScalaMatsuriのスタッフをやってみての教訓*2です。

時間の価値は一定じゃない

カンファレンス中に「事前にもっと準備しておけばよかった」という思うことが何度かありましたが、 これは「時間の価値」という意識が抜けていたのかなと後にして反省しています。

カンファレンスの、前日の1時間と当日の1時間では時間の価値が違います。

開場前の1時間と開場後の1時間の価値も違います。

  • 価値の高い時間にやらないといけないことを減らそう

準備段階では「作業抜けが無いか」と考えるのでなく、「楽するために何が出来るのか」と考えるだけでも効果がありそうです。

f:id:kiris60:20160205134927j:plain お弁当のゴミ出など、事前にチラシ一枚印刷しておけば...みたいな状況も多かったです。

チームに透明性を

アジャイル開発でも透明性を重視していますが、カンファレンス運営にとっても透明性はとても大事なことでした。

カンファレンス中、あるチームは人手が足りなくて困っているのに、別のチームでは手が完全に空いてしまっている状況がありました。 これも、チームの透明性を高めることで解決できる問題だと感じています。

透明性に関するトピックは、他にもいくつかありましたが、共通して言えるのは

  • チーム内の情報は出来るだけオープンで手の届きやすい場所におこう

ということです。

また、チーム内でオープンに出来ない情報がある場合、なんらかの脆弱性があるのかもしれません。

コントロールするものを選ぶ

アンカンファレンスの朝会での反省点は、こちらで意見をコントロールし過ぎてしまって時間が足りなくなってしまった点です。

コントロールするのは通訳が必要だったり事前準備が必要なセッションだけにとどめ、残りのセッションは参加者のなりゆきに委ねるべきでした。

もちろんコントロールのしなさすぎもどちらも良くありません。目標の達成のために、どれだけのコントロールが適切かを考えましょう。

  • コントロールしないといけない部分はコントロールするように
  • コントロールしなくても良い部分をコントロールしすぎないように

これがアンカンファレンスでの教訓でした。

開発も運営も大事なことは一緒

初期からScalaMatsuriスタッフに参加してみて感じるのは、開発とカンファレンス運営の共通点の多さです。

「日々のタスクの進めかた」から、「良いチームはどうやったら作れるのか」、「障害を意識した仕組み作り」などなど。

様々な共通点を見出すことができますし、まだ気付いていない共通点もいっぱいありそうです。

そういった経験を経て、ScalaMatsuriスタッフでの一番大きな教訓はこれです。

  • エンジニアリングで何を大事にしていたのかを思い出そう
  • 運営で学んだことをエンジニアリングにもいかそう

一仕事が終えた後のビールが美味しいのも一緒ですね:-)

おまけ

2日目のアンカンファレンスで、ScalaMatsuri参加者の年収を暴露する闇セッションも行ないました。*3

*1:それもあってトンチンカンな意見でご迷惑おかけしてすみません

*2:という名の個人的な反省点

*3:無記名投票です

#kabepy Advent Calendar 2013 #8 スランプの時にやったこと

この記事は#kabepy Advent Calendar 2013の8日目です。

ボルダリングを初めてもうすぐ二年。もとより運動が苦手な私なので、もう何回もスランプに陥っています。二・三ヶ月の間、まったく進捗がないこともザラで、以前まで登れていた課題も登れないなんてことも。

そんなスランプから抜け出すために、「自分がどんなことをしたか」をご紹介したいと思います。

体重を減らす

つまりダイエットをすることです。当然のことですが、ボルダリングは軽ければ軽いほど有利です。軽いとそれだけ保持が楽になるだけではなく、よけいに力をかける必要がなくなるので、良いムーブの習得にも繋がります。

ダイエットの最強のコツは「毎日体重は記録すること」だと思っています。体重を記録するようになると、自然と食事量や運動量をコントロールしたくなります。自分はこれだけで4kgくらい痩せ、その結果グレードも一つ上りました。

余談ですが、この「毎日記録する」というのは、ダイエットに限らず継続したいこと全般に使えるコツです。

体重を増やす

上の「体重を減らす」といきなり矛盾しますが、体重を減らすにも限界があります。 特に自分の場合、人よりかなり長身なため、それを支えるだけの筋肉が必要だと感じました。

効率よく筋肉を増やすには、体重も一緒に増やす必要があります。 そこで体重を一時的に増加させてでも、筋肉を増やすことにしました。

これはまだ実施途中なのですが、途中結果として見事にグレードが二つ近く落ちました。 体重を増やすのである程度のグレードダウンは覚悟していましたが、それでもかなりショックです。 それでも、体重を元の体重に戻した時にグレードが上っていることを期待して、今は我慢することにしています。

指を鍛える

今更語るまでもないですが、指力はボルダリングの最重要項目の一つです。 指を鍛えるグッズはいろいろありますが、やはりロックリングスキャンパスボードなどの、よりボルダリングに近いものがベストだと思います。 注意点としては、指は故障しやすい箇所なので必ず、疲れていない時に、無理をしすぎないようトレーニングを行ってください。

体幹を鍛える

体幹は、腕などと違って鍛えても効果のわかり辛い箇所です。というのも体幹とは、意識的に使うものではなく、無意識の内に、力を発生させるための土台として使われる箇所だからです。

その為、自分でも成果はわかり辛いですが、体幹を鍛えたおかげで強傾斜の壁で足がきれづらくなった気がします。 体幹を鍛えるには、スタビライゼーションなどが家で器具を使わずに出来てお勧めです。

別なスポーツをやる

スラックライントランポリンなど、別なスポーツをやってみるのも一つの手です。 気分転換になりますし、普段ボルダリングで使わない筋肉も鍛えることが出来ます。

っで最近は

f:id:kiris60:20131208232413j:plain

pic.twitter.com/LRpz8AYaXc (via Twitter /... - 進捗どうですか

人より成長の遅い私ですが、30年後、40年後に、「自分の生涯グレードが何処まで上げられたか」を知ることを目標に、長く続けていきたいと思っています。

Sencha TouchのMVCについて発表してきました

親会社でJavaScriptの勉強会があったので、そこでSencha TouchのMVCについて発表してきました。

「如何にSencha Touchを使って保守性の高いアプリを作るか?」みたいな内容です。

またこのスライドを作るにあたり、「Sencha Touchパーフェクトガイド」を大いに参考にさせて頂きました。

HTML5モバイルアプリケーションフレームワーク Sencha Touchパーフェクトガイド

HTML5モバイルアプリケーションフレームワーク Sencha Touchパーフェクトガイド

著者の皆様ありがとうございます。

本を共著しました。「すべての人に知っておいてほしい JavaScriptの基本原則」

以前書いた「JavaScriptテクニックバイブル」に引き続き今回もJavaScriptの本です。

すべての人に知っておいてほしい JavaScriptの基本原則

すべての人に知っておいてほしい JavaScriptの基本原則

開発者と会話できるようになるデザイナーのための入門書。

2005年頃のGoogleマップにおけるAjaxとしての採用を機に、JavaScriptが再び注目されだしました。今では、最新のウェブインターフェイス表現を行ううえで、HTML5、CSS3と並びウェブプログラミング技術としての地位を確固たるものにしています。しかしながら、実際のウェブサイト構築時にデザイナーはその開発内容を知ることはなかなかなく、開発者とコミュニケーションを図ることができずにいる現場も多くあるのではないでしょうか。そこで本書では、デザイナーが開発者と会話できることを目標に、第一線で活躍するエンジニアたちがJavaScriptの世界にご案内します。

JavaScriptの全体像を知りたい向上心のあるデザイナーに必須の一冊です。

内容紹介にもある通り今回は主にWEBデザイナーを対象に、視覚的にわかりやすくJavaScriptを解説した本です。また、JavaScriptを「おまじない」で済ませるのではなく、ある程度概念なども踏まえて解説しているので、プログラマーの方の入門書としてもご利用頂けると思います。

2013/1/23より全国の書店でお買い求め頂けますので、お手に取って頂けると幸いです。

動画で学ぶボルダリングのテクニック

この記事は#kabepy Advent Calendarの23日目です。三回目となると、ネタに困ってきますね。

動画で学ぶ

ボルダリングを上達するには登るのが一番です。しかし、家庭や仕事のある社会人やお金の無い学生にとって、連日ジムや外岩に通うのは結構な負担になるでしょう。

そこで考えるのが家や通勤などで出来る学習やトレーニングです。

頭に壁を受けた壁部員の間では「電車の吊革で指力を鍛える方法」や「テーブルを使って懸垂力を鍛える方法」などの情報交換が日々行なわれていますが、今回はインターネットを利用して、ボルダリングのテクニックが学べる動画を紹介したいと思います。

動画紹介

それでは、さっそく動画を紹介していきます。

初音ミクボルダリング講座

最初にご紹介するのは初音ミクの3Dモデルを使ったボルダリング解説動画のシリーズです。

  1. ダイアゴナル(フリ)
  2. ヒールフック
  3. クロスムーブ
  4. キョン足
  5. デッドポイント
  6. ルーフ

の計6つの解説動画が公開されています。3Dモデルであることをいかして、普段見ることが出来ないアングルから眺めることが出来て、とてもわかりやすいです。初心者には難しい技術も出てきますが、「ボルダリングは筋力だけじゃない」ということが良く伝わると思います。

■【MikuMikuDance初音ミクボルダリング講座V1


【第1回MMD体育祭】初音ミクのボルダリング講座V5【MikuMikuDance】

おさる師匠のボルダリング教室

こちらは「ふみにん」さんがアメーバブログで書かれている、クライミングのムーブ(動作)を動画付きの解説記事です。この解説では、良い例と悪い例の両方が乗せており、ムーブの善し悪しがより一層わかりやすくなっています。また、知り合いなどと一緒に登った際は、自分のムーブを撮ってもらい、自分がどちらのムーブに近いか比較してみるのも良いかもしれません。

http://ameblo.jp/fuminin1708/

■元記事:おさる師匠のボルダリング教室 ①正対ムーブ

http://ameblo.jp/fuminin1708/entry-10756755721.html

■クライミングムーブ 正対①.AVI(悪い例)


クライミングムーブ 正対①.AVI

■クライミングムーブ 正対②.AVI(良い例)


クライミングムーブ 正対②.AVI

フリークライミング総合情報サイト」&「クライマーSNS」F-STYLE【エフ・スタイル】

フリークライミング総合情報サイト」&「クライマーSNS」のF-STYLE【エフ・スタイル】さんの動画付き解説シリーズです。特出すべきはその数の多さ。基本的な話からムーブやホールドの持ち方など30個以上の動画が公開されています。ここでしか見掛けないようなムーブも紹介されており、初心者から上級者までお勧めすることが出来ます。

http://www.free-climbing-style.com/

■クライミングの基本/ボルダリング001「スタートの種類」講師:松岡準弥


クライミングの基本/ボルダリング001「スタートの種類」講師:松岡準弥

まとめ

僕がゲーム好きなこともあって、ボルダリングの面白さをアクションゲームの面白さに例えることがあります。適切に設定された課題とそれを解決することのカタルシスが、面白さの根幹にあることが共通しているからです。では、上達するにはどうしたら良いでしょうか?もちろん繰り返しプレイすることが何よりも大事ですが、他人のプレイ動画などを見ることも同じぐらい大事なんじゃないかと思います。アクションゲームも。ボルダリングも。

ボルダリングカフェ グリーンアローMYO-DENの紹介

この記事は #kabepy Advent Calendar 2012 の16日目です。僕の知る限りだと、東西線沿線にはボルダリングジムが二つ存在します。今回はその中の一つ「ボルダリングカフェ グリーンアローMYO-DEN」をご紹介します。

ボルダリングカフェ グリーンアローMYO-DENについて

アクセス

東西線妙典駅から徒歩5分程度の場所にあります。東西線は他線との接続が悪く、アクセスがあまり良くありませんが、僕は通勤経路なので助かってます。コンビニは駅内のファミリーマートと、ジムに行く途中のローソンの二店舗があります。

ボルダリングカフェ グリーンアローMYO-DENの外観 f:id:kiris60:20121216181330j:plain

営業時間

  • 平日 14:00〜21:00
  • 土日祝日 11:00〜21:00
  • 定休日 毎週月曜日(祝日の場合はその翌日)

料金

施設利用料

  • 会員登録費 1,000円
  • 1日利用料 2,000円
  • ナイト利用料(18:00〜) 1,500円
  • 1時間利用(平日10:00〜18:00) 1,000円 チョーク・シューズのレンタル無料

平日割引(1日利用料500円引き・ナイト利用料300円引き)

  • メンズDAY(火・木曜日)
  • レディースDAY(水・金曜日)

レンタル(いずれも初回会員登録時に限り無料)

  • シューズ 300円
  • チョーク 200円

設備

壁は全部で9面、角度は87°〜120°まで。傾斜は5°刻みで設けられているのでボルダリングの初心者でも楽しめます。

■店内。中央には飲食が出来るテーブルがあり、よくお菓子が置かれている。

f:id:kiris60:20121216181632j:plain

■普段ノートパソコンを持ち歩くので鍵付きロッカーは地味に嬉しい

f:id:kiris60:20121216181906j:plain

更に「BIG WAVE」や「天空の壁」と呼ばれる多面体が設置された壁も存在します。

■多面体壁の一つ「BIG WAVE」。こいつが中々手強い。

f:id:kiris60:20121216182442j:plain

魅力

アットホームな店内

このジムの面白い所は、他のどのジムよりもファミリーを意識した所です。 例えばこのジムには「キッズスペース」と呼ばれるエリアが存在します。

■キッズスペースに続く階段。外見の段階でワクワク感が半端無い。

f:id:kiris60:20121216181651j:plain

キッズスペースの中は象の滑り台や、ハンモック、キッズウォールなどが設置され、秘密基地のようになっています。

■俺も子供の頃に遊びに来たかった

f:id:kiris60:20121216194817j:plain

通常の壁にも「キッズ課題」が設置されており、親子でも楽しめるのがこのジムの魅力です。(大抵子供の方が上手い)

課題表

店内では無料で課題のチェック表が配られています。 モチベーションの向上にも繋がりますし、久しぶりに来てもどれが登れたかを忘れる心配がありません。 これは素晴しいアイディアなのでぜひ全てのジムで実施して欲しい。

■6級・7級は埋まってきたので次は4級・5級課題を攻めて行きたい

f:id:kiris60:20121216235943p:plain

カフェ

ボルダリングカフェという名の通り、店内ちょっとした売店があります。コーヒーやシェイクやペットボトルの他にも、お菓子・カロリーメイトといった長時間登る際のちょっとした補給に便利です。

■ドリンクメニュー。バナナシェイクが美味しかった。

f:id:kiris60:20121216202935j:plain

まとめ

ボルダリングジムはそれぞれ個性がありますが、その中でもボルダリングカフェ グリーンアローMYO-DENはかなりユニークな店だと思います。場所だけが少々ネックですが、興味を持って頂けたならば今度一緒に行きましょう。

■ジムに行く途中にあるイタリアンのお店が美味くてお勧め

f:id:kiris60:20121216203411j:plain

店舗情報

Annotation ProcessorでSenchaのModelを自動生成する

@kawanoshinobu は普段はとっても温厚そうです。
でもキレるとPCの電源を引き抜いたりします。こわいです。そんな @kowanoshinobu に 「ワレ、いつもSenchaを教えてやっとるやんけ。なんか書けや!」と言われました。こわいです。

そんな訳で

この記事はSencha Advent Calendar 2012の11日目です。JavaScriptはそんなに好きではないので、そんなに好きではないJavaの話をします。

SenchaにはModelというクラスが存在します。その名の通りMVCのModelです。SenchaではModelクラスを使ってJSONのデシリアライズをします。

クライアントサイドから見ればModelでも、サーバーサイドから見ればViewです。サーバーサイドでもやっぱりModelっぽいクラスを作って、それをJSONにシリアライズします。Mapだと型がObjectになるから嫌いです。

サーバーサイドでModelを作ってクライアントサイドでModelを作りました。困りました。DRYじゃないです。DRYじゃないのは悪です。例外も一杯ありますがこれは悪です。

なのでAnnotation Processorを使って、JavaのModelからSenchaのModelを自動生成してみることにしました。

Annotation Processorって何?

JDK 6から入ったコンパイル時にJava構文木を弄ったりする仕組みです。例えば僕が好きなLombokというライブライリはこれでgetterやsetterを自動生成したりしています。

Rubyとかでツールを作っても良いのですが、ツールだと自動生成し忘れる可能性があります。それにAnnotation Processorなら構文木を直接触れるので、「staticなフィールドは自動生成しない」とか「Javaの継承関係をSenchaでも維持する」とか色々出来ます。ScalaなんかだとCompiler Pluginというもっと強力な仕組みも存在します。

あ、ちなみにこのエントリではAnnotation Processor使ってこんなこと出来るよーに留めるので詳しい解説はしません。Annotation Processorについての解説はこちらの連載がとても詳しく書いてます。

いきなり完成系

例えばこんなJavaのModelを作ってコンパイルすると

package localhost.sample;

import localhost.annotation.Model;

@Model(namespace="localhost.generate", dir="web/smartdevice/localhost/generate/";
public class Sample {
	private String name;
	private int value;

        @Field(exclude=true)
        private String excludedField;
}

勝手にこんなJavaScriptファイルを作ります。

// auto-generated at Fri Nov 09 22:30:37 JST 2012

/**
 * CAUTION: 
 *   Don't modify this file!
 *   This file is automatically generated.
 */
Ext.define('localhost.generate.AbstractSample', {
    extend: 'Ext.data.Model',
    config: {
         fields: [
             { name: 'name', type: 'string' },
             { name: 'value', type: 'int' },
         ]
    }
});

実際はこのクラスを継承して使います。変更を加え先から自動生成で上書かれてしまっては困りますもんね。コンフリクトするのでバージョン管理もしません。

アノテーションを作る

Annotation Processorなのでアノテーションが無いと始まりません。今回は@Modelと@Fieldの二つのアノテーションを作ります。@Modelはクラスに付けれて@Fieldはフィールドに付けることが出来ます。@Fieldは省略可能です。

@Model

package localhost.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Model {
        // クラス名のprefix
	String prefix() default "Abstract";
        // 出力先
	String dir();
        // 名前空間
	String namespace();
}

@Field

package localhost.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.SOURCE)
public @interface Field {
    // フィールド名(省略時はJavaのフィールド名)
    String name() default "";
    // データの種類(省略時はJavaのフィールドの型から自動判別)
    String type() default "";
    // 除外フラグ
    boolean exclude() default false;
}

Annotation Processorを作る

AbstarctProcessorを継承したクラスを作ります。
こいつがエントリーポイントです。

package localhost.apt;

@SupportedSourceVersion(SourceVersion.RELEASE_7)
@SupportedAnnotationTypes("localhost.annotation.Model")
public class SenchaModelGen extends AbstractProcessor {
    @Override
    public boolean process(Set<? extends TypeElement> annotations,
            RoundEnvironment roundEnv) {
        for (TypeElement annotation : annotations) {
            for (Element element : roundEnv.getElementsAnnotatedWith(annotation)) {
                // @Modelが付いてるクラスだけを取ってこれた

                assert element instanceof TypeElement;
                TypeElement typeElement = (TypeElement) element;

                try {
                    // @Modelを取得
                    Model model = element.getAnnotation(Model.class);
                    
                    // ここにSenchaのModelを生成する処理を書く
                } catch (Exception e) {
                    this.processingEnv.getMessager().printMessage(Kind.ERROR, e.getMessage(), typeElement);
                }
            }
        }
        return true;
    }

で、例えばModelを作る条件は
「アクセス修飾子がPublicで具象クラスであること」とか

        public boolean isGenerable() {
            if (this.element.getKind() != ElementKind.CLASS) {
                return false;
            }
            if (!this.element.getModifiers().contains(Modifier.PUBLIC)) {
                return false;
            }
            if (this.element.getModifiers().contains(Modifier.ABSTRACT)) {
                return false;
            }
            return true;
        }

フィールドの型は「boolean型なら'boolean'で、byte型やshort型やint型やchar型だったら'int'」だとか

        private String getFieldType() {
            if (field != null && !field.type().isEmpty()) {
                return field.type();
            } else {
                TypeKind typeKind = this.element.asType().getKind();
                switch(typeKind) {
                case BOOLEAN:
                    return "boolean";

                case BYTE:
                case SHORT:
                case INT:
                case LONG:
                case CHAR:
                    return "int";

                case FLOAT:
                case DOUBLE:
                    return "float";

                default:
                    return "";
                }
            }
        }

構文木とか大袈裟なことを言っていますが、ひとつひとつの処理は簡単です。そんなことをしながら最終的なJavaScriptファイルを作成します。

        public void generate(PrintWriter writer) {
            this.generateModelHeader(writer, this.model, this.element);

            for (VariableElement fieldElement : ElementFilter.fieldsIn(this.element.getEnclosedElements())) {
                FieldGenerator generator = new FieldGenerator(this.processingEnv, this.model, fieldElement);
                if (generator.isGenerable()) {
                    generator.generate(writer);
                }
            }

            this.generateModelFotter(writer, model, element);
        }

        private void generateModelHeader(PrintWriter writer, Model model, TypeElement element) {
            String namespace = this.getNameSpace();
            String modelName = this.getModelName();
            String absoluteModelName = namespace + (namespace.isEmpty() ? "" : ".") + modelName;

            writer.println("// auto-generated at " + new Date());
            writer.println("");
            writer.println("/**");
            writer.println(" * CAUTION: ");
            writer.println(" *   Don't modify this file!");
            writer.println(" *   This file is automatically generated.");
            writer.println(" */");
            writer.println("Ext.define('" + absoluteModelName + "', {");
            writer.println("    extend: 'Ext.data.Model',");
            writer.println("    config: {");
            writer.println("         fields: [");
        }

        private void generateModelFotter(PrintWriter writer, Model model, TypeElement element) {
            writer.println("         ]");
            writer.println("    }");
            writer.println("});");
        }

わりと愚直ですね。そのうちvelocityテンプレートとかにするつもりです。

仕上げ

最後にsrc/META-INF/javax.annotation.processing.Processorというファイルを作って、その中にAnnotation Processorの在処を書きます。

localhost.apt.SenchaModelGen

後はjar化したものをクラスパスに通してコンパイルすれば、先程のJavaScriptファイルが自動生成されます。

まとめ

雰囲気だけを伝えるつもりだったのでかなーり端折りました。結局言いたかったのは「同じこと二度書くの面倒だよねー」と、それに対するJavaでの一つのアプローチ方法の紹介です。こういったものはどんどん自動化して楽したいですね。

遊びで作ったものなのでまだまだ未完成品ですが、ソースコード一式をgithubに上げておきます。将来的にはサーバサイドのバリデーションからクライアントサイドバリデーションを作ったり、逆にSenchaのModelの永続化命令をJava側のModelで受けたりしたいですね。

というわけで、明日は shuhei aoyama さんで「Proxyのはなし」です。