Stocks and Flows

やったこと、考えたことの記録

bindingHandlerでGoogleMap を表示する

とりあえず使わなくなったんだけどそのうち使えそうなので自分用にメモ。 諸々の前提条件は省く。

使い方

<div data-bind="locationMap: location"></div>という要素を入れ、location = { latitude: xxx, longitude: yyy }というオブジェクトを入れておくとそこに地図を表示する。

ko.bindingHandlers.locationMap = {
  init: (element, valueAccessor, allBindings, viewModel, bindingContext) ->
    location = ko.unwrap(valueAccessor())
    mapCenter = new google.maps.LatLng(location.latitude, location.longitude)
    mapOptions = {
      streetViewControl: false,
      center: mapCenter,
      zoom: 16,
      mapTypeControl: false,
      zoomControl: false,
      scaleControl: false,
      panControl: false,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    map = new google.maps.Map(element, mapOptions)
    map.setOptions({ styles: map_styles_subtle_grayscale }) # set map's color theme
    marker = new google.maps.Marker({ position: mapCenter, map: map }) #, icon: icon })

    google.maps.event.addListenerOnce(map, 'idle', ->
      # do something only the first time the map is loaded
      setTimeout( ->
        html2canvas($(element),
          {
            logging: true
            useCORS: true,
          }).then((canvas) ->
            img = new Image()
            img.onload = ->
              img.onload = null
              #document.body.appendChild(img)
              element.appendChild(img)
              element.style.position = 'relative'
            img.onerror = ->
              img.onerror = null
              window.console.log("Not loaded image from canvas.toDataURL")
            img.src = canvas.toDataURL("image/png")
            dataUrl = canvas.toDataURL('image/png')
            image_elem = $("<img src=\"#{dataUrl}\" />")
            $(element).empty()
            #$(element).append(image_elem) #canvas)
          )
      , 1000)
    )

    return
}

gem install railsがこける@Amazon Linux

完全なるメモ書き。

原因は、nokogiri のgem インストールでこけているからだった。

上記リンクを試せばよし。

コマンドだけ抜き出すと

$ sudo yum install libxml2-devel libxslt-devel
$ gem install nokogiri -- --use-system-libraries=true --with-xml2-include=/usr/include/libxml2/
$ gem install rails

そのあと、rails appディレクトリ内のbundle installでもnokogiriでこけた。バージョンが違うようだ。

バージョン指定してgem installしなおし。

$ gem install nokogiri -v '1.6.5' -- --use-system-libraries=true --with-xml2-include=/usr/include/libxml2/
$ bundle install

PS.

cap (env) deployするときに、上を終えていてもこけた。エラーコンソールに書いてある通り、下記コマンドをうつ。

$ bundle config build.nokogiri --use-system-libraries

Chefを使った開発フローにしたい

しばらくの間、Chefを使って開発フローを管理することを目指す。 本当はWindowsのローカルに開発環境を整備したかったのだが、面倒な上にクソ不快でしかも無駄なので回避することにした。本格的にそこで開発したい、というよりはActiveXObjectとかいうわけのわからない素敵なインタフェースに関する機能のみ開発できるようにする必要があるからだ。

さて、開発のためにChefを使うとなると具体的に何をできるとよいだろうか。

  1. ローカルマシンからagrant-awsを使ってインスタンスを立ち上げる(+止められる)
  2. 立ち上げたAWSインスタンスにChefのレシピを適用し、すぐに開発環境として使える

これだけだ。シンプル。

現時点で、ローカルで立ち上げたVagrantインスタンスにChefを適用して動くところまではいっているはずなので(最近触ってないが)、そこを整備した上で1を整えたらいけそう。

ステージング環境で、役割ごとに3種類のサーバーを管理したい、というのもあったりするが、それは次のステップ。

難しい課題につきあたったとき

難しい技術課題があって、なかなか糸口がつかめないようなときほど、考えが前に進まず止まってしまい、他のことがやりたくなってしまう。そういしている間に時間が過ぎ、悶々とする。

そういうときほど「自分が今なにをやっているのかを文章として書き留める」ということを意識的にやっていったほうがいい。

考えが進まないとき、実は「今なににつまづいているか」すら明らかにできていないことが多い。もしそれがわかっているなら、どうしてつまづいているのかを一つづつ解きほぐしていけばいいだけだ。簡単ではないが。

しかし実際にはそれがちゃんと意識できないために、なんとなく他のやりやすいことに逃避して、ずるずるいってしまうのではないか。

詰まった時には次のことを自分に問うてみることにする。

  • 今、自分は何をしようとしていて、どうなることがゴールなのか?
  • そのために、今考えている方法では何が障壁になっているのか?
  • 他に今の課題を解決できそうな道筋はないか?

1つ目が一番重要だ。

とにかく色んな言葉を使って色んな角度から、「なにをしようとしているか」を表現してみる。

開発の際に繰り返されるフロー

ソフトウェア開発では、実装の内容は違えど、毎回同じようなイテレーションを回しているものだ。 その内容を自分のために整理したくなったのでまとめる。

自分が一つの機能を開発するときに無意識的に行っているのは

  1. 目指す状態を明確に定義する
  2. 実装の道筋(細かいステップ・手順)を定める
  3. 実装し、1. が満たされるか確認する

というシンプルな3つの繰り返しである。   ときどき疲れてるときなんかに1. または2. をおろそかにしたまま走り出してしまう。

また、自分では目標地点を明確にして、そのためのステップもしっかり見据えたつもりでも、実装している途中に「あ、できねえ」となってしまうことは起こりがちであり、その際には小さな出戻りが発生する。

しかしそれはそんなに悪くない。git checkout . して最初からもう一度考え直せば問題無い。

1と2がいかに迅速かつクリアに定義できるかで実装の巧拙に大きな影響が出る。

なんとなく進めてしまわないようにしよう。

UITabBarControllerDelegateが効かない

やりたいこと

StoryboardでiOSアプリを開発していて、TabBarを使っている。 現在すでに選択されているTabをタップしたら、tableViewを一番上までスクロールしたい。TwitterとかInstagramだとよくあるやつ。

UITabBarControllerDelegateをAppDelegateに書いてみたけど、効かない。

解決策

  1. 「Add New File」をして、TabBarController.swift(UITabBarController)を加える。
  2. なぜか「import Cocoa」なソースコードが出てきてエラーになるので、手で以下のように修正。
import UIKit

class TabBarController: UITabBarController, UITabBarControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
        if (tabBarController.selectedIndex == 0) {
            var navigationController : UINavigationController = viewController as UINavigationController
            var listViewController : ListViewController = navigationController.viewControllers[0] as ListViewController
            listViewController.tableView.setContentOffset(CGPointMake(0, 0 - listViewController.tableView.contentInset.top), animated: true)
        }

    }
}

勉強法の本読むよりも勉強したい

巷では「○○する方法」と銘打った本が後を絶たない。

自分は高校から大学にかけて学生野球をしていた。投手。 何をするにも知識から入るタイプだったので「球速をあげる方法」「コントロールをよくする方法」をググりまくり、大型書店に通い、その手の情報にはどんな高校生よりも詳しかった。

しかしプレーヤーとしては伸びなかった。自分が目指したほどには。

それには様々な要因がある。野球を始めるのが遅かったとか、体格が大きくないとか、筋肉の質が、とか。

そんな中で自分が何より反省していることがある。「知識を過剰評価していた」ことだ。

「実践を怠った」ことではない。むしろ自分はよく練習した。 練習やトレーニング、調整のプログラムも自分で考えて組み立てて、始めるのが遅かったわりにはかなり上達した。

しかし、おそらく最も肝心ななにかが欠けていて、野球選手として突き抜けることはできなかった。 その前に、怪我がちになって諦めた。

イチロー選手は本を読まない、と聞いたことがある。その理由は「本を読むと、わかったような気になってしまう。自分の言葉じゃないから、意味がない」からだったと思う(うろ覚え)。

今の自分にはそれがよくわかる。コントロールよくボールを投げるには、究極のところ「コントロールよくボールを投げる」しかない。

無意味な言葉に思われるかもしれない。一般的にコントロールをよくするには、足腰を鍛え、無駄な力を入れずに投球フォームを安定させることが必要だとされる。確かにこれは正しい。間違いなく正しい。

しかし、これだけでは圧倒的に足りない。最も重要な部分が欠けている。どんなに強い下半身があり、理想的な投球フォームがあったところで、「しっかりと狙いをつけて投げる自分」がいなければ結局狙いは定まらない。

それと同じことが仕事にも言える。

世の中にはいろんなビジネス書とか、キャリアポルノと言われる(内容が)安いキャリア本が溢れてる。 その中には、時々「これを読めば成長するんじゃないか」という淡い期待を抱かせる巧妙なものも実際にある。

しかし読んでみたところで、結局のところあまり変わらないことがほとんどなのではないか。

もちろん真似ることはできる。本に書いてある内容がチープなものであればあるほど、実践するのは簡単だ。

でも本に書いてある内容と自分がやろうとしていることは無関係であることの方が多いはずだ。 どこかの誰かの歌詞ではないが「質の高い仕事をするためのレシピ」などない。あったとしたらそのうち代替されるだろう。

キャリアポルノを読んでいる間に時間が過ぎる。そのことの方がよほどもったいない。 その間にプロダクトのソースコードを書けただろう。クライアントに電話を一本入れられたかもしれない。自分の時間の使い方を振り返ることだってできる。友達や家族と過ごすことができる。

知識労働をする以上知識は必要だが、「どこから知識を入れるか」を工夫しておかないといたずらに時間だけが過ぎていく。一次情報以外は全て無駄に終わることが多い。

それに何より、「仕事に向かい合う自分」は「仕事に向かい合う」ことでしか育て上げることはできないのだ。結局のところ。

以上、自戒の念でした。