どくぴーの備忘録

真面目なことを書こうとするクソメガネのブログ。いつ投げ捨てられるのかは不明

ハッカソンに何を求めて参加すべきなのか

あくまで個人の見解であり,当然のように異論は山ほどあるんだろうけどあくまで主観的な意見なのでその辺りは察してください.

ハッカソン(英語: hackathon、別名:hack day,hackfest,codefest)とはソフトウェア開発分野のプログラマやグラフィックデザイナー、ユーザインタフェース設計者、プロジェクトマネージャらが集中的に共同作業をするソフトウェア関連プロジェクトのイベントである[1]。時にはハードウェアコンポーネントが扱われることもある。ハッカソンは一般的に最低限1日から一週間の期間で開催される。いくつかのハッカソンは単に教育や社会的な目的を意図に開催されるが、多くの場合使用に耐えるソフトウェアの開発や既存のソフトウェアを改善することを目標としている。また、使用プログラミング言語オペレーティングシステム、アプリケーション、API、主題や参加プログラマーの人数を定める傾向にある。

ウィキペディアより引用.

雑に言ってしまうと「超短期間開発競争」なハッカソンだが,最近はテレビ局までハッカソンって言い出したり,猫も杓子もハッカソンみたいなことになっている

www.asahi.co.jp

www.mbs.jp

こんな感じに技術が注目されるのはすごい嬉しい(僕もABCハッカソンに参戦したりした)けど,猫も杓子もハッカソン状態になってしまったことで参加者側も主催側も大変な状況になってきてしまったなぁ…って思ってしまうように.

目的,狙いの相違

ハッカソンで「賞金,賞品目当て」な人と「色んな物をハックして楽しみたい」な人が別れてしまったな,って感じがある.というか,この2つを同時に持ってた人も多かったんだけど,ハッカソンって言葉が浸透してきて,「俺のアイデアで一山あててやる!」みたいな一部の激アツの超意識高い(失礼)な人とかの流入が起きたりとかして,リワードに冷めてしまった人が増えてきてるのかな,という個人の感覚がある,どっちが良いとか悪いとかそんなのじゃないんだけど,参加者の中で温度差が広がってきているよね,っていうこと.

ハッカソンで「未来」「世界」は変えられる?

「未来を変える」だ「世界を変える」だの,大仰な言葉とともに「開発奨励金」という名目の大金を賞金に掲げるハッカソンが増えている.一部のハッカソンを見ると開発したプロダクトに対して製品化・事業化まで持っていけるような サポートをしてくれるものもあるのだけど,そこの過程に関しては「それに携わっている人」から聞くくらいしかまともに知る方法が存在しないし,そうでもしないとハッカソンで作ったあれってどうなってるの?事業化を目的とか言ってたけどほんとにそんな気あるの?ってなる.イベントによる発火性っていうのも大切だけど,「未来を変える」だのといった大仰な言葉を並べるなら,参加している人たちがそこまで出来るようなサポートをして,その頑張りを世間に伝えてあとにつながるようにしてあげないと駄目だし,そんなバイタリティがなければそんな言葉を掲げるべきでないと思う.

「つくれない」のにハッカソンで勝つ

ハッカソンっていうのはだいたいその前にアイディアソンとかがくっついていて,アイディアソンで人気のある,光ってるアイデアに集まってチームを作ったりしてハッカソンに望むのだけれど,ハッカソンで「つくれない」アイデアを出して「つくろうとして頑張ったんだけど結局できなかった」で終わるならいいんだけど,それをつくらずに勝ってしまうっていう例を何度か見聞きしたことがある.しかもその理由は「◯◯で☓☓するというアイデアが良かったので」等の,「いや,それアイデアソンで終わっていいやつやん」っていうものがある.「実際にものを作る」ハッカソンだからこそ,それが実現できたのかどうかってのを見て欲しいし,サポーター企業さんの賞とかは「うちのAPIを使ってるし.アイディアも良かったけどできなかったのは残念,今後に期待」みたいな理由があってもいいと思うんだけど,少なくとも最優秀賞みたいな上の賞は実現できた上でのアイデアの良さで勝負されるべきだと思う.僕自身最後まで間に合わなかったハッカソンが何度もあって,いつぞやのハッカソンで審査員の方から聞いた「ハッカソンはDemo or Die,良いアイデアでも実装できないんだったらそこで終わり」っていう言葉がすごい重く響いたので,ハッカソンでは実現はできなくとも「何とかしてデモできるものをつくりあげよう」っていう努力はするようにしている.

何が言いたいのかというと

ハッカソンにいろんなタイプの人が関わるようになって,住み分けが大変だなぁって思うようになってきた.一部では「エンジニア・デザイナの方のみ」と参加者の役職を制限して開催するイベントもあるけど,根本的な解決ではないような気がするし,もっときれいな住み分けができないかなぁって感じた.僕自身ハッカソンによく参加するので,真剣に考えないとなぁって思った.書いてたら何か考えつくかなあって思ってたけど何も考えつかなかったので申し訳なさ満載な感じで終わります.

ちなみに

明日はこのハッカソンに参加します.

mashupawards.doorkeeper.jp

よろしくお願いいたします.

#高専キャリア に行ってきた

久しぶりに更新

今,東京にいます.21日から,YAPC::Asia Tokyo 2015→#高専キャリア→インターンシップって感じです.

YAPCの話はまたこんどにしようかなって.

高専生のキャリアを考える会(仮)

つまるところ,ジースタイラス高専ベンチャー共催の逆求人関連イベント.なんか現役,OBの高専関係者のLT会です.性質の関係上過激な高専カンファって感じ.

そんな感じでLTしてきました.当日の10時から作ったスライドで.

行った理由

何話したの

高専生もっと外向いて生きていこうなって話しました

印象に残ったこと,思ったこと

  • 後先考えずに飛び込むのも大事
  • ばんくしさんの編入話,去年より前に聞きたかった
  • 学位ってなんだかんだ大切なんだなっぁ
  • 電通大,単位認定が大変そう(こなみ)
  • 比較的優位論(経済とか苦手なのでよくわからない)
  • 女の子を深追いしてはなりません
  • 正しい価値観もとうな
  • 休学,ちゃんとそれをすべき理由があるならいいんじゃないん
  • ブログかこうな
  • 高専カンファ,ぼちぼち100回記念なんだって
  • 高専プロコンOB戦とかいう何でもあり大会が今年あるらしい

成果?

  • 新名刺振りまいてきた
  • 東京どこ行っても大戸屋あるやん
  • チェーン店のありがたみ(ドトールサンマルクカフェマジでありがたい)

短いですが,これで終わりますね

SoundPEATS QY7を買った

人生初のBluetoothヘッドセット買いました.安さと謎なBluetooth 4.1+EDRに惹かれました.

早速開封

なんかそれっぽいケースがついてます.ちゃんと箱の底には日本語のユーザーズガイドがついてましたが,並行輸入品なので読解力(?)が求められます.

そして中身を開けると本体と充電用USBケーブルといっぱいあるフィッティングパーツが出てきました.イヤーピース,と耳の形にフィットする奴2種類の大・中・小の3つずつ入っていますね.これだけで大体の人には合いそう.ちなみに技適マークも付いているので安心して使えます.技適マークなかったらそもそも使えませんしね….

使ってみた

とりあえずはUSBケーブルをつないで充電.ある程度充電したら,電源ボタン(R側のロゴ)を長押しすると「パワァオォン」って教えてくれます.そのまま電源ボタンを押し続けていると「ペェアリィング」って言ってくれてペアリングモードに入ります.ココでペアリングを取ります.一応複数台とのペアリングも対応しているみたいですね.R側には音声コントロール(長押しで曲送り)とマイクも有ります.操作系は全部R側に集中していますね.

音質は…よくわからないのですが,安い割にはなんかいい気がします(以前使ってたのがオーディオテクニカのATH-EQ300Mってのもある気がする).Amazonレビュー見てても「低音強め!」って言ってる人もいれば「低音弱い!」って言ってる人も居ますしもうわけがわかりませんね.

せっかくAndroid Wearがあるんだから

そういえばAndroid Wearは4.4W2(最新版は5.1)からBluetoothヘッドセットがあればオフラインでの単独音楽再生に対応していると聞いたので,手持ちのLG G Watchで早速試してみました.

まず最初にAndroid WearとQY7をペアリングします.設定にBluetoothのデバイスメニューがあるのでそこからペアリングが取れます.それが終わったらAndroid端末でPlayミュージックを起動し,設定を出して,「Android Wearにダウンロード」を有効にした後,「Wearのダウンロードを管理する」をタップすると,Androidのローカルにおいてある曲,Playミュージックからダウンロードしてある曲を選択して,Android Wearに移行できます

f:id:e10dokup:20150721204826j:plain

移行が終わったら,Android WearでPlayミュージックを開き「Wear端末で再生」を選ぶと,さっき移行した曲のアートワークが表示されるので,それを選択すると,Android端末のPlayミュージックをWearから制御するUIで普通に再生されます.ちょっとだけ重くなるけど,許容範囲って感じがします.

スクフェスしてみた

はっきり言って,遅延がひどくてまともにプレイできませんでした.音ゲーはこういうのでするものではありませんね…

タイミング調整してみると-47とか出ましたが,プレイしたisai vividでは遅延に加えて動作自体がもっさり気味になるのでタイミングがバラバラになってすごいプレイしにくかったです.

結論

なんだかんだでいい買い物したかなーと思いました.

Javaのenumで定数を分岐させたい

enumって

列挙型と言われる.一連の値を定義する文法.Javaでも使える.

よく

public static final int HOGE = 1;
public static final int FUGA = 2; 

とかいう形で定数を扱うけど,

public enum Piyo{HOGE,FUGA}

みたいにしておけばintメンバが氾濫しなくなるので(個人的に)スッキリする.また,enumの中に記された値以外の値をブロックできるようになるので,「想定していない値が来た」ときの処理を考えなくて良くなるのがよい

Javaにおけるenum

qiita.com

Javaenumというのは,Cのenumみたいなintを列挙をものではなく,オブジェクトの列挙になるので,enum1つ1つにメンバ変数,メソッドを持たせ,振る舞いをつけることができる.

public enum SelesEnum{
    Tomato(100),
    Potato(150),
    Carrot(120);

    private final int price;

    //コンストラクタは必ずprivateに!
    private SalesEnum(final int price){
        this.price = price;
    }

    public int getPrice(){
        return price;
    }
}

こうしてやることで SalesEnum.Tomato.getPrice()150 が返ってくる.enumはあくまで「プログラム実行時にオブジェクトとして保持する」定数であってインスタンスを持ってはいけないので,シングルトンにするためにコンストラクタはprivateにするように.細かいことは上記記事やEffective Javaを見よう.

EFFECTIVE JAVA 第2版 (The Java Series)

EFFECTIVE JAVA 第2版 (The Java Series)

定数を分岐

例えば「手元のバージョン等の違いで利用する定数を無意識的に変更したい」という場合,enumを使わないと

public final static String[] VERSION_STRING = {"v1.0.0", "v1.2.0", "v1.5.0"};
public final static int V1_0_0 = 1;
public final static int V1_2_0 = 2;
public final static int V1_5_0 = 3;


public String getVersionString(Version version){
    if(version.num == V1_0_0) return VERSION_STRING[0];
    else if(version.num == V1_2_0) return VERSION_STRING[1];
    else if(version.num == V1_5_0) return VERSION_STRING[2];
    return null; // エラー処理とか
}

とかこんなかんじに,長ったらしいし,今後バージョンが増えた時にまた新たにintを割り当てて…となかなか面倒.

そこで,enumを使うと

enum Version{
    V1_0_0, V1_2_0, V1_5_0
}

public enum VersionsEnum{
    VERSION_STRING(new String[]{"v1.0.0", "v1.2.0", "v1.5.0"});

    private final String[] versionStrings;

    //コンストラクタは必ずprivateに!
    private VersionsEnum(final String[] versionStrings){
        this.versionStrings = versionStrings;
    }

    public String getVersionString(Version v){
        if(v == Version.V1_0_0) return versionStrings[0];
        else if(v == Version.V1_2_0) return versionStrings[1];
        else if(v == Version.V1_5_0) return versionStrings[2];
        return null;
    }
}

実際のコード量は増えたが,今後バージョンが増えたり,新たにメンバ変数を増やさないといけなくなった時に,簡単に変更が加えられる(と思う).

Javaenumに振るまいをもたせる記事は探せば結構あったのだが,こういう事している記事はStackOverflow以外で見かけなかったので,メモ代わりに….

終わりに

int定数でごちゃごちゃ書いているんだったらenum化して幸せになろうな,ってお話でした

ButterKnifeがアップデートされたよって話

Androiderみんな大好きJakeWharton神のプラグインButterKnifeがv7.0にアップデート(現時点ではv7.0.1)されたら割と色々変わったらしい.

Changelogを見てみる

github.com

すごい要約するとこんな感じ

  • @InjectView@InjectViewsの代わりに@Bindを使うことになったよ!
  • ButterKnife.injectButterKnife.resetがそれぞれButterKnife.bindButterKnife.unbindに変わったよ!
  • @Optionalアノテーションがなくなってsupport-annotationsとかにある@Nullableを使うようになったよ!
  • @BindxxxでResource Bindingができるようになったよ!

ちなみに@Optionalは「そのレイアウト上に存在しないかもしれない」Viewを定義するときのアノテーション

んで,何が変わったのさ

上2点は,そのまま置換しましょうねーって内容.新しく書くときは複数のViewをinject/bindするときに複数形にしなくても@BindでOKになったよって変更くらい…かな?

FragmentのonDestroyViewでのButterKnife.reset -> ButterKnife.unbindに関しては下の記事にも書いてあるように記述することをよく忘れがちなので忘れないようにしよう.じゃないと正しくViewが破棄されずにつらいことに

qiita.com

@Optionalアノテーションの廃棄からの@Nullableの件に関してはsupport-annotationsの@Nullableでも他のライブラリ等で使われている同名のアノテーションでも大丈夫らしい.

んで,Resource Binding.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                android:paddingBottom="@dimen/activity_vertical_margin" >

    <TextView
        android:id="@+id/text_hoge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"/>

</RelativeLayout>

こんなかんじにViewを定義して

<string name="hello_world">Hello world!</string>

XMLにリソース書いて

public class MainFragment extends Fragment {
    private static final String TAG = MainFragment.class.getSimpleName();
    private final MainFragment self = this;

    @Bind(R.id.text_hoge)
    TextView mHogeText;

    @BindString(R.string.hello_world) //String Resource Binding
    String mHelloWorld;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        ButterKnife.bind(this,rootView);
        mHogeText.setText(mHelloWorld);
        return rootView;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        ButterKnife.unbind(this);
    }
}

Fragmentを書いてあげると

f:id:e10dokup:20150702005102p:plain

こんな感じに,getString(R.string.hoge)とかしてあげなくても,ちゃんとStringにXMLで指定したリソースがbindされる.便利っぽい.当たり前っちゃ当たり前だけど@BindStringStringに,@BindBoolBooleanにと,ちゃんと型を合わせないとビルド時に落ちるので注意.(書いてる人は@BindStringTextViewに当てたらそのままsetTextされるのかと勘違いして見事に死にました)

まとめ

ライブラリとかの最新の動きはちゃんと追いかけないとダメだなーって思いました.急ぎで雑な記事ですいませんでした(土下座)

【Illustrator CC 2015】なんかパスの描画が妙な雰囲気を放っている時の対策

※ CC 2015のアップデートの目玉機能を殺すその場しのぎの対策です!

Illustrator CC 2015が(ちょっと前に)リリースされた.リリースノートを見る限り

  • オートセーブ搭載
  • ズーム最大倍率64000%まで追加(!?)
  • ヌルヌルズーム搭載
  • ツールとの連携機能大強化

などなど.色々変わった感じ.喜び勇んでアップデートするも…,

f:id:e10dokup:20150624002856p:plain

※ パスは全部線幅一緒の直線です

▂▅▇█▓▒░('ω')░▒▓█▇▅▂

どうもまともな直線が見えない結果に.しかも一部消えてて何が何だかって感じ.

どうしたものかと思ってると,ロケットっぽい新ボタンが見える

f:id:e10dokup:20150624003617p:plain

どうやら新機能で追加されたGPU支援用の項目らしい.とりあえずおもむろに解除してみる

f:id:e10dokup:20150624003759p:plain

すると,以前のようなちゃんとした直線が見えるようになりました.やったぜ.

ただしGPU支援でアニメーションズームを行っているので,その機能は無事にお亡くなりになりました.

何が言いたいかというと

Adobeバグフィックスアップデート早くお願いします

LGV32 isai vividを買って三週間ほど使い続けてみた

f:id:e10dokup:20150619112445j:plain

isai vividを発売直後に買ってレビュー記事書こう書こうって言ってたら三週間ほど使い倒していた

なんで買ったの

auから「新しいisai vividを使いませんか」的な感じで10000円割引DMが降ってきたので,勢い.

スペック

Content Value
SoC MSM8992 Snapdragon 808
RAM 3GB
ストレージ 32GB + MicroSDXC ~128GB
カメラ 16MP F1.8(レーザーAF,光学式手ぶれ補正)
ディスプレイ 5.5インチAH-IPS WQHD(2560*1440)
OS Android 5.1
バッテリ容量 3000mAh
その他 防塵,防水,フルセグ対応

SoCが810ではなく808なのが同時期モデルとの大きな違い,810搭載機は軒並み死亡している感じがあるので,808搭載機はもしかしたら当たりなのかもしれない.

歴代isaiと比較すると

  • 電源,ボリュームボタンがローカライズ元のLG Gシリーズと同様に背面に配置
  • バッテリの取り外しが可能に
  • 前面からisaiロゴが消えた

くらいの見た目の相違.バッテリ交換可能になったのはなかなか嬉しい

実際使ってみて

これまで使ってたのが初代isai(LGL22)なのもあって,非常にサクサク快適だった.具体的に良い点,気になる点をまとめてみると

良い点

  • バッテリの持ち時間がだいぶ長くなってあまり残量が気にならなくなった(M updateが来たらもっと良くなるのかな)
  • ヘキサコア + 3GB RAMは最上位構成ではないにしろ超強力.
  • WQHDディスプレイはオーバースペックかと思うほど綺麗.「この鮮やかさに,あなたは驚く」なんてコピー打ってるだけはあると思った
  • カメラめっちゃ綺麗だと思った(こなみ)
  • OS側がLollipopまで進化したのもあって,安定性も快適性も向上した気がする

気になった点

  • (充電中に)熱くなるとパフォーマンスが露骨に低下する.スクロールがめちゃくちゃ反応悪くなったり
  • Wi-Fiテザリングの立ち上げがめちゃくちゃ安定しない.ONにしたら何故か3秒くらいで落ちる
  • USBデバッグがカメラ(PTP)接続でないと起動しない.初代isaiは充電接続でできたのに…
  • でかい(しょうがない)

ちなみにホーム画面については,購入直後にGoogle nowランチャーをぶっこんだのでわかりません(・ω<)☆

端末の発熱も普通に使ってるだけじゃほとんど起きないし,元の端末がだいぶ古いのも相まって,全体的に高評価な感じ.

テザリングの件は不具合なのだろうか,アップデートでの対応を…

まとめ

最新機種買えたので嬉しいです

おまけ

  • 初回起動時にいきなり初期不良引き当てて店の奥にその店最初のisai vividがドナドナされていった.初期不良怖い
  • mamorino 3を2台契約したら端末代が更に40000円引かれて無料通話1000円分降ってきた.電話決行するしこの変更で込み込み支払い月10円増しなので割と得っぽい
  • キャリアショップのお姉さんが説明がわかりやすくて助かった(めっちゃタブレット勧められたけど丁重にお断りした)
  • 買って二日目に地面に落とした.悲しい