読者です 読者をやめる 読者になる 読者になる

2016年ふりかえり

仕事も収めたので、今年のふりかえりをしておく。

2016年は仕事・プライベート共に、大きな変化のある年だった。

居住地は引き続きシンガポール

仕事

今年の2月から AGRIBUDDY というスタートアップに参画した。

カンボジアをベースにオンライン農協を作ろうとしている Agritech/Fintech なスタートアップ。

CEOは日本人だが、他のメンバーは外国人。国籍もカンボジアベトナムリトアニア、アメリカと様々。

普段はリモートで開発に参加。 2~3ヶ月に一度1〜2週間くらい出張として現地に行って、対面でのコミュニケーションを取るようにしている。

開発チームは自分含めて4人(自分、サーバーサイドエンジニア2人、モバイルアプリエンジニア1人)。

役割としてはCTOで、開発全般に関わっている。 * CTOとしての仕事の内容については、長くなりそうなので別エントリで。

英語

シンガポールに来てから約3年半が経った。 最初の2年半くらいは日本の仕事をしていたこともあり、現地に住んでいても英語を使う機会は少なかったが、今の仕事をはじめてからは使う機会が格段に増えた。(使わないと仕事にならない…)

結果、この約10ヵ月で読み書きはかなり上達した実感がある。 一方、テキストでのやりとりが多いので話す、聞くはまだ苦手。

買ったもの

運動不足がたたったのか、背中痛が気になるようになったので、エルゴノミクス系のものに興味が出てきた。 とはいえ根本解決には運動が一番だと思うので、後半は意識して走ったり、プールで泳いだりをしていた。

  • Ergodox EZ

    • 流行りモノだが、使い始めてから肩、背中周りが楽になった。中々場所をとるのと、打ち慣れるまでが大変だった。たまにHHKBに浮気したりしている。
  • Ergotron WorkFit-A

    • スタンディングデスク的に使える作業場所付きモニタアーム(リンク先見てもらった方がわかりやすそう)

読んだ本

悩みごとがあると本に解を求めがちなのもあり、仕事で役に立ちそうだと思って読んだ本が多い。 マネジメント系が多く、あまり技術書は読めなかった。。 今年前半にやっていたプロジェクトのために買ったRailsの本、今やっている仕事用にLaravelのリファレンス本くらいか。

プライベート

  • 結婚
  • おじさんになった。(甥っ子かわいい・・・)

2017年にやりたいこととかは別エントリにする。

Mac環境構築メモ

経緯

MacBook Pro Retina 13' を購入。(もうすぐ新しいモデルが出そうなので、出ちゃったら悔しい・・・) 久しぶりにまっさらから構築することにしたのでメモ。

Ansibleを使う

Mac の開発環境構築を自動化する (2015 年初旬編) をとても参考にさせてもらってツール周りはセットアップした。

自分ものもgithubにpushした ojimac/macbook-provisioning

Homebrew Cask 未対応でApp Store.appから直接インストールしたアプリ

  • 050plus
  • DaisyDisk(Caskには入っていたが、インストールには失敗した...)
  • Duet(Caskには入っていたが、起動しない...)
  • EchofonLite
  • LINE
  • MenuMeters(El Capitan対応がまだだった)
  • Memory Clean
  • Pomodoro One
  • PopHub
  • Sunrise Calendar
  • ToyViewer
  • WiFi Explorer

その他

ターミナル

  • テーマをProへ変更
  • フォントサイズを13 -> 14に変更
  • カーソルをオレンジに(目立って分かりやすい)

システム環境設定

  • Energy Saver > Sleepしない設定に
  • Keyboard > Key Repeatを最大に
  • Keyboard > Delay Until Repeatを最大に
  • Keyboard > Modify keys > caps lockをcontrolに割り当て
  • Keyboard > Shortcuts > Keyboard > Move focus to next window のショートカットを alt + tab に変更する
  • TrackPad > タップでクリックになるようにする
  • TrackPad > Tracking speed タップでクリックになるようにする
  • Sharing > コンピュータの名前を設定(デフォルトだと、名前 + 's Macbook Proとかなってダサいので...)
  • Tabキーでボタンなど全てのコントロールへフォーカスを移動させる Keyboard > Shortcuts > All controls のラジオボタンにチェック

ショートカットキー

  • Spotlightのショートカットキー ⌘+Space を無効に。代わりにIMEの切り替えに割り当てる
  • Alfredの起動をCtrl + ;に設定

Finder

  • Preferences > Sidebar > All My Files とか iCloud Driveとか使わないもののチェックを外す
  • Preferences > Advanced > Show all filename extensions にチェックを入れる
  • View > Show Path Bar
  • View > Show Status Bar
  • 不可視ファイルを表示する
    • $ defaults write com.apple.finder AppleShowAllFiles -boolean true
    • $ killall Finder

ステータスバー

  • バッテリー残量%を表示

Alfred

  • 辞書.app と連携。d 調べたい単語 で辞書を引けるように。

開発環境周り

  • それなりのボリュームになりそうなので、別エントリに。

部屋の引っ越しすると荷物が整理されるように、Macも買い換えたタイミングで使ってないアプリや設定等を整理できて良いです :)

はてなブログに引っ越し

管理しているサーバーの整理に伴いWordpressはお役御免。

続くようならProアカウントにしてまた自ドメインで運用するかも。

ブログタイトルもはてなダイアリー時代のものに変えてみた。

最初のエントリは2008年に書いたのか。懐かしい。

El Capitanでgem install pgでエラーになる時の対処

  • エラー内容
ERROR:  Error installing pg:
    ERROR: Failed to build gem native extension.

    /Users/ojimac/.rbenv/versions/2.2.3/bin/ruby -r ./siteconf20151105-50418-1q1vjzw.rb extconf.rb
checking for pg_config... no
No pg_config... trying anyway. If building fails, please try again with
 --with-pg-config=/path/to/pg_config
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
    --with-opt-dir
    --without-opt-dir
    --with-opt-include
    --without-opt-include=${opt-dir}/include
    --with-opt-lib
    --without-opt-lib=${opt-dir}/lib
    --with-make-prog
    --without-make-prog
    --srcdir=.
    --curdir
    --ruby=/Users/ojimac/.rbenv/versions/2.2.3/bin/$(RUBY_BASE_NAME)
    --with-pg
    --without-pg
    --enable-windows-cross
    --disable-windows-cross
    --with-pg-config
    --without-pg-config
    --with-pg_config
    --without-pg_config
    --with-pg-dir
    --without-pg-dir
    --with-pg-include
    --without-pg-include=${pg-dir}/include
    --with-pg-lib
    --without-pg-lib=${pg-dir}/lib

extconf failed, exit code 1
  • 以下のオプションをつけることで解決

$ ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future gem install pg

WebエンジニアからiOSエンジニアへ #1

大分間があいてしまった…

直近の投稿を見なおしてみると、PythonRubyかで悩んでいましたが、それもつかの間 ここ半年ばかりは仕事でiOSアプリを作ることになり、やります!と手を挙げて、Obj-Cばかりやってます。

Titanium時代(2012/06~2012/08)

続きを読む

PythonのフレームワークDjango1.4のチュートリアル2章をやってみました

前回に引き続き2章をやっていきます。

続きを読む

PythonのフレームワークDjango1.4のチュートリアル1章をやってみました

仕事で次のプロジェクトから使う言語をruby or pythonどちらにしようかという話になっています。

日本での盛り上がり方、情報量で言うとrubyだと思うのですが、pythonも海外では実績ありますし、 「やり方は1つ」という思想が継続して保守していかなければならないwebサービスに向いている感じがしました。

また、みんながやっているから自分も、という理由ではなく、自分なりに使ってみて結論を出したいところです。

ということで、pythonを勉強しつつ、ちょっとフレームワークを使って何か作ってみようということで一番メジャーっぽい Djangoを選んでチュートリアルをやってみました。

最新の1.4の1章をやってみたので残しておきます。

プロジェクト作成

$ django-admin.py startproject mysite

プロジェクトの初期構成

  • mysite/
    • manage.py <- コマンドラインツール
    • mysite/
    • \__init__.py <- pythonのパッケージでなくてはいけないもの!?
    • settings.py <- 設定ファイル
    • urls.py <- ルーティング定義
    • wsgi.py <- WSGIに準拠したウェブサーバを使う時のエンドポイント

開発用サーバ起動

$ python manage.py runserver
  • 8000番ポートでアクセス可能

使うポートを変える場合、

$ python manage.py runserver 8080

のようにすることで、8080番ポートでアクセス可能になる

DBのセットアップ

mysite/settings.py

DATABASES = {
    'default': {
        'ENGINE': '', # postgreSQL, mysql, sqlite3, oracle等々設定可能
        'NAME': '{sqliteファイルへのパス}'
        # sqlite3を使用する場合は、その他の設定は必要なし
    }
}

TimeZoneの設定

ここを参考に、

mysite/settings.py を変更

TIME_ZONE = 'America/Chicago'
↓
TIME_ZONE = 'Asia/Tokyo Japan'

※ これだとrunserverした時にエラーになった。。

TIME_ZONE = 'Asia/Tokyo'

が正解のようです。

INSTALLED_APPS

使用するモジュールの一覧!?

db作成

$ python manage.py syncdb

すると、ずらずらメッセージが出てくるので質問に答えていく。

Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table django_site

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'ojimac'): {Enter}
E-mail address: {メールアドレス}
Password: {パスワード}
Password (again): {パスワード}
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

全部終わると、tableがもろもろ(auth_とかdjango_というテーブル名)出来ている。

モデルの作成

  • プロジェクトの中に複数アプリを作ることができる!?

ex) pollsアプリの作成

$ python manage.py startapp polls

polls/models.py を編集

from django.db import models

class Poll(models.Model): # django.db.models.Modelのサブクラスとしてモデルを定義する
    # フィールド名をモデルクラスにセットしていく
    poll   = models.ForeignKey(Poll)
    choice = models.CharField(max_length = 200)
    votes  = models.IntegerField()

モデルのアクティベーション

settings.py

INSTALLED_APPS = (
    'django.contrib.auth',
    ・
    ・
    ・
    'polls', # 追加する
)

djangoの思想として、プラガブルなこと。ここでつくったアプリは、他のプロジェクトでも使えるようにしているみたいです。

$ python manage.py sql polls

で、polls_poll, polls_choiceテーブルのCREATE文が発行される。

djangoの思想として、ちゃんとsqlを明示することが必要と考えているからこのようなコマンドを用意しているみたいです。

その後、

$ python manage.py syncdb

をすることで、polls_poll, polls_choiceテーブルが自動生成される。

APIを動かしてみる

$ python manage.py shell

で、python shellを立ち上げます。

>>> from polls.models import Poll, Choice # Poll, Choiceモデルを使えるようにする
>>> Poll.objects.all() # polls_pollテーブルを全件取得
[] # まだ何もデータがないので空が返ってきます

# レコードを追加してみます
# 時間を扱えるモジュールをインポート
>>> from django.utils import timezone
# questionカラムに"What's new?"を、pub_dateに現在時刻をセット
>>> p = Poll(question="What's new?", pub_date=timezone.now())
# insert
>>> p.save()
# この時点でIDは1
>>> p.id
1
# id=1のquestionカラム値
>>> p.question
"What's new?"
# id=1のpub_dateカラム値
>>> p.pub_date
datetime.datetime(2012, 5, 29, 0, 35, 25, 9851, tzinfo=)
# updateしてみる
>>> p.question = "What's up?"
>>> p.save()

Poll.objects.all()したときの出力

  <Poll: Poll object>

が見づらいので、

polls/models.pyに unicode メソッドを足します。

class Poll(models.Model):

    // snip
    
    def __unicode__(self):
        return self.question
        
class Choice(models.Model):

    // snip
    
    def __unicode__(self):
        return self.choice

すると、Poll.objects.all()の出力は、

Poll.objects.all()

    <Poll: What's up?>

のように見やすくなりました。

時間に関する便利関数を追加してみます。

import datetime
from django.utils import timezone
// snip

class Poll(models.Model):

    // snip

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

python shellから実行して結果を確認します。

$ python manage.py shell
>>> from polls.models import Poll, Choice
>>> Poll.objects.all()

# polls_poll.id = 1のレコードのみ取得
>>> Poll.objects.filter(id=1)

# questionカラムがWhatではじまるレコード取得
>>> Poll.objects.filter(question__startswith='What')

# pub_dateカラムが2012
>>> Poll.objects.get(pub_date__year=2012)

# id=2のレコードはないのでエラーになる
>>> Poll.objects.get(id=2)

# Poll.objects.get(id=1)と等価
>>> Poll.objects.get(pk=1)

# Pollモデルに実装したカスタムメソッドも動きます
>>> p.was_published_recently()

# 関連のあるデータのinsert
>>> p = Poll.objects.get(pk=1)
>>> p.choice_set.all()
# poll_id = 1のレコード追加
>>> p.choice_set.create(choice='Not much', votes=0)
# poll_id = 1のレコードもう1件追加
>>> p.choice_set.create(choice='The sky', votes=0)
# poll_id = 1のレコードもう1件追加
>>> c = p.choice_set.create(choice='Just hacking again', votes=0)

# cオブジェクトに関連のある(poll_id=1)のpolls_pollテーブルの値を抽出
>>> c.poll

# 関連のあるデータ取得
>>> p.choice_set.all()

# count(*)する
>>> p.choice_set.count()

# 関連のあるモデルのプロパティを条件にするには、
__(アンダースコア前後2つ)__
で取得可
>>> Choice.objects.filter(poll__pub_date__year=2012)

# deleteする場合
>>> c = p.choice_set.filter(choice__startswith='Just hacking')
>>> c.delete()

以上です。 2章に続きます。