undefined

bokuweb.me

国内のオープンなslack teamを検索できるslack list jaを作った

f:id:bokuweb:20160308143401p:plain

国内のオープンなslack teamを検索できるslack list jaを作った

Slack-list-ja

経緯

最近、リモートワーカーのためのslack teamが作成されて参加させてもらっている。リモートワークならではの健康面などの知見・意見が交換されていて、非常に有用だと思っている。リモートワークして2ヶ月が経とうとしているんだけど、リモートワーク控えめに言っても最高なのでもっと広まって欲しい。

リモートワーカー Slack Team のご紹介 - 9mのパソコン日記

そんな中、国内にオープンなslack teamがどれだけあるんだろう?と調べ始めたら、海外にはそういったslack teamをリスト化したページSlack Listなるものが存在しており、remote-workers-jpの布教も兼ねて国内版を作ってみることにした。

技術的なとこ

せっかく作るんだから何か触ったことないものを。ということで以下を触ってみた。

  • Inferno

github.com

  • Bulma

bulma.io

Inferno

www.moongift.jp

APIがReactに似せられた、Reactよりも高速なライブラリらしい。サーバーサイドレンダリングにも対応。こんな感じでReactのように書ける。

import { Component } from 'inferno-component';

class MyComponent extends Component {
  constructor(props) {
    super(props);
    this.state = {
      counter: 0
    }
  }
  render() {
    return (
      <div>
        <h1>Header!</h1>
        <span>Counter is at: { this.state.counter }</span>
      </div>
    )
  }
}

<div {...props} />みたいに書けなかったり、微妙に違いはあれど、ほぼ違いを意識せずに書けるとは思う。ただ、今回はバグなのか使用方法が間違っていたのか、意図しない挙動に遭遇して、残念ながら早々にReactに戻してしまった。それでもほとんどimportとか.babelrcを直すくらいだったと記憶している。あと、(当然ながら)データ・描画数が少なくて、パフォーマンスの違いを感じられるようなことはなかった。これは、後述するが、(見つけられていないだけかもしれないが)国内にはオープンなslack teamが少なくてデータ数が数個だったからだ。サーバーサイドレンダリングなどは試せていない。近いうちにもう一回触ってみたい。

Bulma

FlexboxベースのモダンなCSSフレームワーク。と書いてある。自分はMaterial DesignやBootstrapがあまり好きじゃなくて、なんかシンプルなのがないかと模索していたところ、こいつが公開されていて使用してみることにした。Gridとかいい感じ。react-bulmaを作ろうと思ってリポジトリ作ったけど、あまり作業できていない。使用感としては悪くないけど、個人的にはCSSフレームワークは使わないにこしたことないという考えなので、今後使うことはすくないかも。

f:id:bokuweb:20160308152034p:plain

ただ、CSS以下を追加しただけなので採用としては成功していると思う。

.hero-content
  padding 120px 0 80px
  background #f5f7fa

.logo
  height 200px
  width auto

.card
  margin 0 auto

  p.title
    margin 0

.tag
  margin 0 5px 0 0

footer
  text-align center
  margin 40px 0 0 0

作ってみて

作ったあとに驚いたんだが、探してみても国内に全然オープンなslack teamがなかった。オリジナルのslack listは50〜60くらい?slack list jaにはまだ5つしか登録されていない。teamはslack-list-ja/teams.json at gh-pages · bokuweb/slack-list-ja · GitHubで管理してるので、追加・編集はプルリクエストいただけるとありがたい。「こんなのもある」だとか「これを追加して」っての歓迎。

最後に

リモートワークしている方、導入したい方以下より参加できます。

Join リモートワーカー on Slack!

まだ見ぬslack teamの追加は以下よりお願いします。

github.com

追記

公開日からPRをいただいて、リストが充実してきました。 ご協力ありがとうございます。

吹き出しコンポーネントを作った

吹き出しコンポーネントが必要になって作った。

作ったもの

github.com

デモ

React-balloon example

スクリーンショット

f:id:bokuweb:20160301193300g:plain

使い方

インストール

npm i react-balloon

サンプル

以下のように使用する。

<Balloon
  start={{
    box: { x: 100, y: 100, width: 300, height: 105 },
    destination: { x: 400 , y: 400 },
  }}
  style={{ borderRadius: '5px' }}
  backgroundColor="#ECF0F1"
>
  Hello, World!!
</Balloon>

このコンポーネントについて

吹き出し部分をSVGで描画し、ボックスとは独立して吹き出しの指し先も動かせるようにした。SVGはこれまでやろうやろうと思いながら触れてなかったけど、reactとの相性はいい部類なんじゃないかって気がしてきている。

今回は以下のようにSVGを書いている

<svg width="100%" height="100%" style={{ zIndex }}>
    <path
        d={ `M ${base[0].x } ${ base[0].y }
                 Q ${ control.x } ${ control.y } ${ destination.x } ${ destination.y }
                 Q ${ control.x } ${ control.y } ${ base[1].x } ${ base[1].y}` }
        fill={ backgroundColor }
        stroke={ backgroundColor }
        strokeWidth={ 1 }
    />
</svg>

何やらSMILがdeprecatedっぽいので、SVGモーフィング辺りをがんばって解決できればかなり楽しいコンポーネントが作れそうな気がしてる。

ソートとリサイズが可能なペインコンポーネントreact-sortable-paneを作った

今作ってるtwitterクライントでソートとリサイズができるコンポーネントが欲しかったので作った。

作ったもの

github.com

デモ

http://bokuweb.github.io/react-sortable-pane

スクリーンショット

f:id:bokuweb:20160131164948g:plain

使い方

インストール

npm i react-sortable-pane

サンプル

以下のように使用する。

<SortablePane margin={10}>
  <Pane
     width={200}
     height={500}
     style={style}>
     A
  </Pane>
  <Pane
     width={300}
     height={400}
     style={style}>
    B
  </Pane>
</SortablePane>

このコンポーネントについて

もともとは以下のコンポーネントを作ったときのデモだったんだけど、今回コンポーネント化しといた。

blog.bokuweb.me

まだ水平方向しか対応していないけど、垂直方向への対応だとかテストとか充実させたい。使用用途としては以下のように使用することを想定している。

f:id:bokuweb:20160131165555g:plain

react-motionと拙作のreact-resizable-boxを使用している。react-motionを使うと表現の幅が広がるので楽しい挙動のコンポーネントを作れてよい。

React Native for AndroidでGCMを使ってPUSH通知するまでの作業ログ

React Native for AndrodでPUSH通知させた時のおぼえ書き。

Google Cloud Messaging for Android (GCM ) とは?

開発者がサーバから Android デバイス上の Android アプリケーションにデータを送信できるようにする無料のサービス

らしいです。

www.techdoctranslator.com

GCM登録

以下からアプリを登録して、RegistrationKeyやgoogle-services.jsonを取得する。google-services.jsonandroid/appに格納する。

Set up a GCM Client App on Android  |  Cloud Messaging  |  Google Developers

React Nativeでは

以下のパッケージを使うのが楽。

github.com

ただ、依存関係が循環参照みたいなことになっててバージョン指定しないと上手く入らなかった。

npm i --save react-native-gcm-android@0.1.9

手順に添ってandroid/build.gradleなどを設定していく。が、com.android.dex.DexException: Multiple dex files...というエラーが発生し、ビルドに失敗する。エラーで検索すると、android/app/build.gradlemultiDexEnabled trueを追加せよってのがあるんだけど、公式には「追加するんじゃねえ」って書いてあってたまたま見つけたbuild/app/build/を削除することでビルドが通るようになった。

Genymotionに Google Play serviceをインストールする

Genymotion(使っている場合)にGoogle Play serviceをインストールする必要がある。 手順は以下の記事の通りで問題なかった。

androidlover.net

PUSH 通知する

GcmAndroid.requestPermissions();すると以下のコールバックでトークンが受け取れる。

GcmAndroid.addEventListener('register', function(token){
        console.log('send gcm token to server', token);
});

こいつをサーバに送信、端末と紐つけて保持しておきPUSH通知をするのに使用する。

以下を実行する。("GCM_TOKEN"に上記で受け取ったトークンを入力する。)

curl -X POST -H "Authorization: key=YOUR_AUTHORIZATION_KEY" -H "Content-Type: application/json" -d '
{
  "data": {
    "info": {
      "subject": "Hello GCM2",
      "message": "Hello from the server side!"
    }
  },
  "to" : "GCM_TOKEN"
}' 'https://gcm-http.googleapis.com/gcm/send'

コールバックで内容が受け取れる。

GcmAndroid.addEventListener('notification', function(notification){
        console.log('receive gcm notification', notification);
        var info = JSON.parse(notification.data.info);
        if (!GcmAndroid.isInForeground) {
          Notification.create({
            subject: info.subject,
            message: info.message,
          });
        }
      });

React Native用にシンプルなModal Componentを作った

タイトルのとおりだけど、シンプルなReact-Native用のModal Componentを作った。 標準でModalコンポーネントは用意されてるんだけど、以下のように今はiOSにしか対応しておらず、必要となったので作成した。

This component is only available in iOS at this time.

この辺りは時間が解決してくれるんだろうけど、 まだまだiOSに比べてAndroidのコンポーネントは少ないので注意しないといけない。React NativeiOS/Android両対応のアプリを作る場合は、Android用のコンポーネントを十分調査しておいたほうが良いと思う。

作ったもの

github.com

スクリーンショット

iOS
f:id:bokuweb:20160124161153g:plain

Android
f:id:bokuweb:20160124161242g:plain

使い方

インストール

npm i react-native-universal-modal

サンプル

<Modal isOpen={this.state.isOpen}
       styles={modalStyles}>
  <TouchableOpacity
     onPress={() => this.setState{isOpen: false}}>
    <View style={styles.modalInner}>
      <Text>Close Modal</Text>
    </View>
  </TouchableOpacity>
</Modal>

React-Nativeについて

<div><span>の代わりに<View><Text>などの専用コンポーネントが設けられており、これらを用いてUIを構築していく。 例えば上のサンプルの以下の部分はすべて用意されているコンポーネントだ。

  <TouchableOpacity
     onPress={() => this.setState{isOpen: false}}>
    <View style={styles.modalInner}>
      <Text>Close Modal</Text>
    </View>
  </TouchableOpacity>

またスタイルはStyleSheetで定義できる。以下のような感じ。

const styles = React.StyleSheet.create({
  text: {
    marginTop: 40
  }
});

ただし、cssとは異なるプロパティがあったり(例えばmarginHorizontalとかある)、位置指定に%が使えなかったり、いろいろハマりところが多い。従来であればCSSアニメーションを使用するような箇所にはAnimated.Viewってのが用意されていて、今回はこいつを使用してModalの表示/非表示を制御していたりする。

ただ、UI以外の部分(例えばFluxを採用していたらactionstore)はReact-Nativeであることをほぼ意識しなくても良さそう。当然といえば当然だが。例えばWEBシングルページアプリケーションをReact Nativeに移植する際Viewさえ解決してしまえば、すんなりと移植できるんじゃないかと感じる。

逆にテスト周りは貧弱でこれからという印象。今回のコンポーネントもテスト書こうと思ったけど、面倒臭すぎて中断した。今の理解では<Text>とか<View>と言ったReact Nativeコンポーネントのモックを自分で用意する必要があるっぽい。(間違ってたら指摘ください。)この辺りは課題だろうと思う。

いろいろと参考になりそうなものを探す中で良さそうだと思ったのは以下のプロジェクト。React NativeReduxを使ったSoundCloudクライントらしい。

github.com

React Nativewrite onceでなくlearn onceだって話しなんだけど、それならPhoneGapのがいいのでは?って思ったんだけど、アプリを開発している人から効いた話ではやはりネイティブUIを使えるのはかなり利点になるらしい。PhoneGapなどだとどうしても、もっさりとしたUIになってしまうし、1ソースで複数端末対応ってのも幻想っぽいらしい。

期待はしているけど、まだまだ課題はあるような感じで現時点でプロダクション(特にAndroidは)への採用は大変なんじゃないかな、って気がしてる。 とは言え、時間が確保できたら保留になっているはてなブックマークViewrをReact Nativeに移植したい。

サムライト株式会社に入社しました

f:id:bokuweb:20160114111234p:plain

1月12日、サムライト株式会社に入社した。 サムライトは「Common LispでWebを取り戻す」を謳い、Common Lispを使ったWebアプリケーション開発を行っている数少ないWeb企業だ。

www.wantedly.com

Common Lispやるの?

自分はフロントエンドエンジニアとしての採用となる。フロントエンドはReact.jsを採用しているが、メンバーのほとんどがCommon Lisperなため、自分がフロントエンドを牽引していけるように、基礎筋力を養いつつ頑張っていきたい。

が、同時にCommon Lispも積極的に学びたいと思っている。ということを話すと、@nitro_idiot が「え?」って顔してたけど、それもそのはずで面談の時に「Common Lisp読む必要あるよ」って言われて「え?」って顔したのは自分だからだ(というより声に出してたかもしれない)。だけど、その分野で最先端を走る人間がこれだけいる中、僕だけその技術を学ばないなんてそんな勿体無いことはないと今は思っていて、積極的にそっちにも踏み込んでいきたい。

転職を終えて

前職の退職理由は決して、前向きなものではなかったけど、同時に一つのチャンスだとも考えていてなんとか一歩、踏み込み、前進できたんではないかという思いだ。最近ブログを書くと同じようなこと言ってる気もするが、自分は経験やバックボーンが他のエンジニアより少ないので、取り込める技術は貪欲に取り込んでこれを埋めていきたい。

同時にリモートワークが始まることを意味していて(2日日間の出社を終えて今日がリモートワークの初日になる!)、こちらも慣れるまで試行錯誤が必要だろうと考えている。この辺りも知見と呼ぶに値するものが出てきたら是非記事にまとめてみたいと考えている。

後、補足みたいになってしまうが、会社の同僚は皆親切で最高に居心地が良く感じた。僕自身これまで(なぜか)同僚に同世代のエンジニアというものが居たことがなく、一人でやってきた感があったが、気兼ねなく話せる年齢の近い面々がそろっていてよかった。(中には僕の4歳の娘に趣味としてローキック を練習させろ!と訴える過激派な先輩もいたが・・。積極的にいじっていこう)

お世話になります。

リサイズとドラッグが可能なReactコンポーネントを作った

以前作ったreact-resizable-boxにドラッグで移動できる機能を付加したreact-resizable-and-movableを作った。あまりいい名前が思いうかばず残念な感じになってしまった。

f:id:bokuweb:20160110223714g:plain

Demo

React-resizable-and-movable example

Repository

github.com

インストール

npm i react-resizable-and-movable

概要

付箋のようなものが必要だったので作った。startプロパティでx,y,width,heightを設定すれば使用できます。

<ResizableAndMovable
   start={{x:20, y:20, width:200, height:200}}
  <p>Example</p>
</ResizableAndMovable>

退職しました

2015年の振り返り記事にも少し書きましたが、1月7日付けで退職しました。 特に何ってわけじゃないが、記録しておく。

なんで

会社の閉鎖が決定したため。不満がなかったといえば嘘になるが、こういった状態にならなければ基本的にはずっと勤めるつもりだった。選択肢の極めて少ない田舎においては、最もフィットする会社の一つだったのではないかとも思ってる。

これまで

かれこれ10年弱、(名前をつけるならば)組み込みハードウェアエンジニアをやってきました。組み込みといっても幅広いが、自分の携わった開発は以下のような感じだった。

  • MPUクロックは20Mhz〜400MHzくらい(一度だけ1GHzのCoretex-A9の案件があった)
  • OSはベアメタル、iTRONで4:6くらい、稀にVxWorksってのもあった。MPUがMMUを搭載していることのほうが少なく、LInuxを載せる案件はあつかったことがない
  • FPGAはCPLDとの間に位置するようなもの(LatticeのXO3とか新しいので言えばAlteraのMAX10くらい)でVerilogを用いて開発することがほとんど
  • ソフトをやることもちょくちょくあり、iTRONのポーティングやベアメタルのアプリケーション、ハードウェアの検証ソフトなどはやった
  • メカトロ(プリンタや札の搬送など)とそれ以外で5:5くらいの比率
  • シーケンサーを使ってラダーを組み、評価装置やモックなど作ることもあった

やりたかったこと、やれなかったこと

  • Linuxが載る案件をやりたかった
  • その中でブートローダの移植、デバイスドライバの作成あたりの知識を蓄えたかった
  • 大規模FPGA案件をやりたかった
  • 流行りのFPGAによるハードウェアアクセラレーションなど
  • アートワーク設計をやりたかった(回路図を引いた人が、基板の配線(アートワークという)をすることは稀で外部の業者に出すケースが多いと思う)
  • 配線の指示は回路設計者が出すが、アートワークCADは使えないため、アートワークCADを使えるようになりたかった
  • イーサネットやUSBなどミドルウェアを実装する知識を蓄えたかった

これから

フロントエンドエンジニアとしてリモートワークします。ただ、フロントエンドを主軸にサーバーサイド、インフラの知識、経験もどんどん蓄えたい。右往左往するかもしれないけど、なんとか喰らい付いていきたい。

あと上記のこれまでの組み込みの知識はできればアウトプットしていきたいとも思ってる。 一点はIoTブームでハードウェアを触るWEB屋さんの知識の足しになれば、というもので、もう一点は自分の備忘録としてだ。 こう思うのは、組み込みの(特にハードウェアの)ノウハウはその特性上、オープンになりにくく、かつ、IoTというとWEBができる人がハードウェアを触っているケースを良く目にするからだ。(正確には組み込み屋がIoT関連の情報をオープンにするケースが少ないため、このように映るのだろうけども。) どちらにせよ、微々たるものかもしれないがこの知識はなにかしらアウトプットしていきたい所存だ。

まとめ

がんばります。