ちょっと前なのですが、Chromeブラウザがクラッシュして開いていたタブが全部消える&リカバーできない事態に陥りました。が、それをきっかけにタブの断捨離を進めたところ、身長が伸びたり彼女が出来たりとかはなかったんですが、集中力が上がって精神疲労が緩和したので、ここに共有します。
続きを読む個人でサービス、OSS開発をする時にモチベーションを継続させるノウハウ
個人で(≒会社とは別に)サービスやOSS開発することは、会社で身につけられる以上のスキル、実績が得られたり、コミュニティを広げたりするなどメリットが多くあります。
自分自身もこれまでいくつかサービスやOSSを開発してきたのですが、一番課題なのが、モチベーションの継続です。最初はテンション高く開発しますが、段々とやる気が下がってきます。一旦リリースした後のメンテも面倒です。そうしていくつかのサービスをクローズしてきました(涙)。
けど、これってとてももったいないです。そこで意識して改善した結果、TwitCalというカレンダーアプリを開発期間も含めると1年間以上継続してメンテ、機能追加を続けられました。今回は自分がどうやって取り組んできたかを整理してみたいです。
※ 飽きっぽい性格だったりなかなかサービスを継続メンテできない方向けです。たった1年?何言っているの?という方はそっ閉じしてやってください。
続きを読むRxjavaで川をズンドコする
Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから
— てくも (@kumiromilk) 2016年3月9日
「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了って関数作ったら満点で単位貰ってた
このツイートを見て。
Rxjavaでズンドコしてみました。ご査収ください。
public class Zundoko { private static final String ZUN = "ズン"; private static final String DOKO = "ドコ"; HashMap<String, Integer> map = new HashMap(); Integer[] zundoko = {0, 0, 0, 0, 1}; Random rand = new Random(); boolean isKiyoshi = false; public void run(){ map.put(ZUN, 0); map.put(DOKO, 1); LinkedList<String> list = new LinkedList<>(); while (!isKiyoshi) { list.add(rand.nextInt() % 2 == 0 ? ZUN : DOKO); if (list.size() > zundoko.length) { list.removeFirst(); } System.out.println("¥¥ " + list.getLast()); doLambdaKiyoshi(list); } System.out.println("¥¥キ・ヨ・シ!"); } public void doLambdaKiyoshi(List<String> list) { Observable.from(list) .map(s -> map.get(s)) .toList().map(zunInts -> { if (zunInts.size() < zundoko.length) return false; return Arrays.equals(zunInts.toArray(new Integer[zundoko.length]), zundoko); } ).subscribe(matched -> isKiyoshi = matched); } }
エンジニアが手早く英作文をする時はかどる Tips
GithubのPRや海外Slackチャンネルでチャット、はたまた英語圏のエンジニアとやりとりする等、英語で文章を書くことはしばしばあります。そんな時、自分がよく使っている方法について書きます。
先に一番大事なこと
大事なことは、英語はあくまでもツールだということです。伝えたい内容が重要であり、英文を書くことに時間かけることはエンジニアにとって不毛です。 よっぽど英語が得意な人でないかぎり、一から英作文すると時間がかかって本質的でないところで時間を消費するということです。 なので一から文章を考えるのでなく、なるべく"型"を知ることがポイントだと考えています。それを踏まえた上で御覧ください。
続きを読む内なるストーリーが魅力を作る
今日あった出来事がとても腑に落ちたので、忘れないように書きます。
スマートニュースのサンフランシスコ・オフィスが魅力的だった話
機会があって、サンフランシスコにあるスマートニュース(以下スマニュー)のオフィスに遊びに行かせていただきました。
場所はサンフランシスコのほぼ中心部にある古い建物のワンフロア。内部をリノベートしたとのことでしたが、なんとスマニュー社員が全ての設計デザインを担当されたとのこと。
中央の広間からぐるりと見回すとオフィス全体が見渡せるくらいの広さだったのですが、細部にいたるまで、色々なこだわりを感じるオフィスでした。
ジロリアン(ラーメン二郎愛好者)界のスーパースター @habomaijiro 氏の2015年"完飲"生活についてツイートから解析してみる
@habomaijiro氏をご存知でしょうか。ほぼ毎日どこかしらのラーメン二郎店舗に出没し、大盛りの二郎を完飲(スープまで飲み干すこと)している筋金入りのジロリアンです。また、その食事レポートは日々Twitterに投稿されています。 "麺、ザクザク喰えるもの" , "神域ブタ" 等、独特の表現を用いたツイートはジロリアンだけでなく一般人にも大人気です。間違いなくジロリアン界一番の有名人と言っても過言ではないでしょう。
自分も彼のツイートを楽しみにしている一人なのですが、ふと気になりました。一体彼がどれだけ完飲し、どんな二郎を味わっているのでしょうか?
Twitter APIと形態素解析を使って、解析してみることにしました。
続きを読むTwitCal 3.0 をリリースしました
過去の自分のツイートをカレンダー形式でふりかえることができるツイッタークライアント TwitCal の 3.0をリリースしました。
前回のリリースから実に4ヶ月が経過してしまったのですが、バグ修正以外にもいくつか新しい機能を追加したので、ぜひ使ってみてください!
新機能
過去ツイートお知らせ機能
1日1回、数カ月前のツイート内容を通知してくれる機能です。 「あー、数カ月前はこんなこと考えていたんだ」とか、ちょっとした振り返りに使える機能 です。
通知できるツイートは1ヶ月、3ヶ月、6ヶ月の3種類選択可能で、通知時間も任意に設定できます。
ツイートシェア、別クライアントへの移動
過去のツイートから別クライアントを辿ってツイートのやり取りを振り返ったり、リツイートしたユーザーの情報を追っかけたい という要望をいただいたので、追加しました。ツイートのリンク自体のシェア、別クライアントへの移動等が可能になっています。
内部的な設計の話
サヨナラAsyncTaskLoader、こんにちはThreadExecutor
これまでツイートデータのロードにAsynkTaskLoaderを利用していたのですが、このたびThreadExecutor( + Eventbus)に移行しました。 理由としては、
- バックグラウンドから起動し、再ロードした時にクラッシュする不具合が発生していて、AsynkTaskLoaderが起因だった(Activity上のデータをチェックしてからロードするため、場合によってNPEが発生していた)り、挙動が不安定だった
- Activity上にロード処理が入るので、美しくない
というところです。 ThreadExecutorにすることによって、ロードのロジックがActivityから分離できたことと、インタフェースがすっきりしたのでNPEの不具合をなくせたメリットは非常に大きいです。
実装としては以下のようなExecutorServiceを実装したBaseLoaderを作成し、それを継承したTweetLoaderを作りました。
public abstract class BaseLoader<T> { private final ExecutorService mExecutor = Executors.newSingleThreadExecutor(); public void start(final T params){ mExecutor.execute(new Runnable() { @Override public void run() { call(params); } }); } abstract protected void call(T params); }
call内でデータ取得がOKだとEventBusでActivity側に結果を返し、Viewを更新するようになっています。
Realm バージョンアップ
0.76 -> 0.82にしました。特に困ったことはなくスムーズに移行できたと思います。また、自分のrealm.close()の設定方法があまくて、別スレッドでrealmをcloseしたことによる不具合などが発生していましたが、そういった修正も実施しました。
Realm.closeしないことを恐れてonDestoryとかでも念のためにcloseしてたら、全く無関係なところでThis Realm instance has already been closed...って落ちるようになってしまた。(続く)
— Tomoaki Imai (@tomoaki_imai) 2015年9月6日
(続き)リファレンスカウントだからUIスレッドでcloseかませちゃうと別のところで動かすインスタンスが閉じちゃってエラーが発生すると。だから必ずgetInstanceと対にしなきゃいけないということを再確認した。
— Tomoaki Imai (@tomoaki_imai) 2015年9月6日
( ※なお、上のツイートはTwitCalを使って検索、リンクを添付しました :)
あれっ
こうして振り返ると全然アップデートしてないぞ(焦) なにはともあれ、自分の過去のツイートを見るのって結構面白かったりするので、使ってみてフィードバックもらえると幸いです。