Reactの入門書を書きました「作りながら学ぶ React入門」、買って下さいね!

「作りながら学ぶ React入門」というReactの入門書を書きました。

Reactの情報は ReactのホームページDocs や中級者向けの入門 Tutorial にまとまっていますが、初心者には敷居が高いかもしれません。
私自身も Reactの教育を行うのに良い日本語書籍はないかなぁ? と探していたのですが見つからないので、自分で書くことにしました。

f:id:yuum3:20170904123837j:plain

「作りながら学ぶ React入門」の紹介

各章毎に作者の思いを込めつつ紹介記事を書きます

0. まえがき

原稿校正の最終段階で「まえがき」お願いいたします〜 と言われ、一般的な事を書いてもなぁ・・・と、とても悩みました。そこで素直に私とReactの関わりを書きました。
私自身が2万行のjQueryベースの ■■なSPAコードをReactに置き換えた経験が、この本には込められています。

1. はじめに

「前提知識」に書いているように本書は入門書ですが、「JavaScriptプログラミング入門」に付いては書かれていません。 既にJavaScript, jQuery等を使った事のある人を対象にしていますので注意して下さい。
ただし、今までの新人教育等の経験から判りやすさを心がけています。

既にReactを使いこなしてる方には、あまり役立つ情報は少ないかと思いますが、Reactに詳しくない同僚等に教えるのには役に立つと思います。

「Reactとは」は一般的な事を手短にまとめました。

重要な情報: サポートページ https://github.com/yuumi3/react_book

2. モダンJS開発環境の構築

本書ではMacまたはWindowsのターミナル(コマンドプロンプト)とエディターを使って開発するという(Web系)プログラマーとしては一般的なスタイルで進めています。そこでは避けて通れない開発環境の構築には力を入れてあります。

JavaScript関係の技術。開発ツールはとても進歩が早いですが、開発環境としてはここ数年で Webpack, Bable, ESLint などの開発ツールが主流になったのでこれらを使っています。

ただし、最初は開発の停滞していたnpmではなく yarn を使って書いていたのですがバタバタがあったり、突如 npm が進化したので npm に戻したりと振り回されました ^^);

今後の開発環境の進化は油断は出来ないので、後はサポートページで頑張ります

3. モダンJS開発環境の解説

本にも書きましたが、面倒な説明はいいから React を使いたい! という人は飛ばしても良いように、開発ツールの解説は別章にしました。

現在よく判らず開発ツールを使っている人にも、この章は役に立つかもしれませんね。

4. ES6

本書ではJavaScriptはES6(正確にはES2015)で書いています。この章ではある程度JavaScriptを知っている人に最低限必要なES6の説明をしています。

後半の「いろいろな補足」ではJavaScriptというかプログラミング言語の理解が深く無い人のために、オブジェクト指向、無名関数、イテレーターなのどの解説を書きました。Reactのプログラムではこれらが頻繁に使われるので、これらの判りにくい部分の理解に少しでも役に立つと良いなと思っています。

5. JSX

いよいよReactの解説です。JSXはReactの基本の基本ですJSXが書けないとReactは使えません。しかもJSXは従来のテンプレートエンジンとはいろいろと違います。
ということで、この章は力を入れて書いています。 例題(サンプルコード)は、ほぼHTML → 値を埋め込む → コンポーネント分割 → 条件・繰り返し と徐々に進化するように書いています。

デザイナーの方などはJSXを完璧に書けるようになれば、かなり仕事がはかどるのではないでしょうか?

6. コンポーネント

Reactの説明ですね、ライフサイクル・メソッドの図は頑張って書きました。

7. コンポーネントの応用

ここではMaterial-UIを使って美しい画面を作ったり、ルーティングを学んだり。 サーバーとの通信を学んだりします。ここは作って、動いたら楽しいような例題を取り上げたつもりです。

また、通信の部分では 非同期処理、Promise の解説などを行っています。

8. テスティング

テスティングに付いて書くかは迷ったのですが、昔からお世話になっている t-wada さんの顔が浮かんだので書きました。

E2Eテストに付いては ブラウザテストツール総まとめ・2016年夏版 記事に助けられました。テストツール(テストライブラリー)は多数ありますが、これだというものが無く、消去法的に Nightmare になりました。
これからは Headless Chrome を使ったツールか主流になるのかな・・・・

ちななみに、jQuery → React 置き換えの仕事では E2Eテストは Phantom.js + Turnip というRubyのツールを使いました

9. さらに学ぶなら

この本では取り上げなかった Redux, Flowtype, React Native, Electronに付いての簡単な説明を書きました。

そして、 Reactの情報源では英語の情報にアクセスしよう! ということを書きました。

作りながら学ぶ React入門

作りながら学ぶ React入門

AudioQueueを使って m4a (AAC) で録音する Swift 3.0 のサンプルコード

現在の仕事で作ってるiOSアプリの中に、マイクからの音をm4a (AAC) で録音する機能が必要なので、 適当なサンプルコードはネット上に在るだろうと思い探したのですが、案外みつかりませんでした。
なぜ見つからないかというと

  • 今回はいろいろな理由から、安易な AVFoundation ではなく AudioQueueを使う必要があった
  • Objective.c のサンプルは見つかるが、Swiftは少ない、さらに Swift 3.0 のコードは絶望的
  • また録音フォーマットが PCMのものばかり
  • オーディオ周りが好きなiOS(mac OS)プログラマーは少ないの?
  • 私もオーディオ周りの知識は極めて低い

f:id:yuum3:20170914161050p:plain

Google先生が教えてくれたのは以下でした

絶望の中、GitHubを検索するとAudioQueueTutorial という探していたものを見つけました。 Swift 3.0 です!
しかし、録音フォーマットは PCM ・・・・

そこで、いろいろ調べて少しずつ試しながら、遂に m4a(AAC) で録音できるサンプルが出来ました。完全なコードは AudioQueueTutorialのfork に置きました (m4aブランチ)。

変更か所は

録音フォーマットの設定

        info.mDataFormat.mFormatID = kAudioFormatMPEG4AAC
        info.mDataFormat.mSampleRate = 44100.0
        info.mDataFormat.mChannelsPerFrame = 2
        info.mDataFormat.mBitsPerChannel = 0
        info.mDataFormat.mFramesPerPacket = 1024
        info.mDataFormat.mBytesPerFrame = 0
        info.mDataFormat.mBytesPerPacket = 0
        info.mDataFormat.mFormatFlags = 0

バッファローサイズ計算の追加

    func DeriveBufferSize(seconds: Double) -> UInt32 {
        let maxBufferSize: UInt32 = 0x50000 // 320 KB

        var maxPacketSize: UInt32 = info.mDataFormat.mBytesPerPacket
        var outBufferSize: UInt32 = 0
        
        if maxPacketSize == 0 {
            var maxVBRPacketSize = UInt32(MemoryLayout<UInt32>.size)
            AudioQueueGetProperty (
                info.mQueue!,
                kAudioQueueProperty_MaximumOutputPacketSize,
                &maxPacketSize,
                &maxVBRPacketSize
            )
        }
        let numBytesForTime = info.mDataFormat.mSampleRate * Double(maxPacketSize) * seconds
        outBufferSize = numBytesForTime < Double(maxBufferSize) ? UInt32(numBytesForTime) : maxBufferSize
        return outBufferSize
    }

MagicCookie設定の追加

    func SetMagicCookieForFile() {
        var cookieSize = UInt32(MemoryLayout<UInt32>.size)
        
        var st = AudioQueueGetPropertySize(info.mQueue!,
                                          kAudioQueueProperty_MagicCookie,
                                          &cookieSize)
        if st == noErr {
            let magicCookie: UnsafeMutablePointer<CChar> = UnsafeMutablePointer<CChar>.allocate(capacity: Int(cookieSize))
            st = AudioQueueGetProperty(info.mQueue!,
                                 kAudioQueueProperty_MagicCookie,
                                 magicCookie,
                                 &cookieSize)
            if st != noErr {
                print("---- AudioQueueGetProperty error  \(st)")
                return
            }
            st = AudioFileSetProperty(info.mAudioFile!,
                                  kAudioFilePropertyMagicCookieData,
                                  cookieSize,
                                  magicCookie)
            magicCookie.deallocate(capacity: Int(cookieSize))
            if st != noErr {
                print("---- AudioFileSetProperty error  \(st)")
                return
            }
        } else {
            print("----  AudioQueueGetPropertySize error  \(st)")
        }
    }

ファイル作成、バッファー確保コードで上のメソッドを呼び出すようにした

        // create file
        let path = (NSTemporaryDirectory() as NSString).appendingPathComponent("audio.m4a")
        outputUrl = URL(fileURLWithPath: path)
        st = AudioFileCreateWithURL(outputUrl as CFURL, kAudioFileM4AType, &info.mDataFormat, .eraseFile, &info.mAudioFile)
        if st != noErr {
            print("---- AudioFileCreateWithURL error  \(st)")
            return nil
        }
        SetMagicCookieForFile()

        
        // allocate buffer
        info.bufferByteSize = DeriveBufferSize(seconds: 10.0)
        for _ in 0..<kNumberBuffers {
            var buffer: AudioQueueBufferRef?
            st = AudioQueueAllocateBuffer(queue!, info.bufferByteSize, &buffer)
            if st != noErr {
                print("---- AudioQueueAllocateBuffer error  \(st)")
                return nil
            }
            info.mBuffers.append(buffer!)
            AudioQueueEnqueueBuffer(queue!, buffer!, 0, nil)
        }

以上です、

tomisacat (tomisacat) · GitHub さんありがとうございます! それから参考にさえて頂いた情報を書いた人ありがとうございます。

いまさらながらAnsibleを使ってみた

世の中もうDockerの時代なのかもしれませんが、ある案件で使うサーバーのプロビジョニングツールとしてAnsibleを使ってみました。

f:id:yuum3:20170824145026p:plain

今まではChefを使っていましたがChefはRubyでガリガリ書けるので何でもできますが、メンテや構成管理情報を伝えるのに難があるかなと思ます。そこでシンプルという噂のAnsibleを使って、Ruby on Railsの動くサーバーを構築するAnsibleを書いてみました。

本家のドキュメント もちゃんとしてますし、ネット上にはたくさんの情報があるので楽に作れましたがそれでも何点か苦労したのでそこを中心に書きます。Playbooksは以下のようにroleに分けて書きました。

├── roles
│   ├── apps
│   │   ├── files
│   │   │   ├── logrotate
│   │   │   └── unicorn
│   │   └── tasks
│   │       └── main.yml
│   ├── linux
│   │   └── tasks
│   │       └── main.yml
│   ├── nginx
│   │   ├── files
│   │   │   └── logrotate
│   │   ├── handlers
│   │   │   └── main.yml
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── templates
│   │       └── recorder.j2
│   ├── postgresql
│   │   └── tasks
│   │       └── main.yml
│   └── ruby
│       └── tasks
│           └── main.yml
└── site.yml

1. Linux(Unbuntu)の基本設定

てこずったのは、locale の設定。localeの作成やtimezoneの設定はmoduleがあるのに、locale設定は無いので update-locale コマンドを使いました。コマンドを使うと問題になるのが、どうやって冪等にするか。 update-locale は毎回実行されても問題はありませんが、Ansibleの勉強をかねて調べました。

ansible_env.LANGでターゲット側の環境変数が参照できます。ただしLANGが無い場合エラーになるのでデフォルト値を設定しました。

- name: install tools
  apt: name={{ item }} update_cache=yes
  with_items:
    - git
    - language-pack-ja

- name: create locale ja_JP.UTF-8
  locale_gen:
    name: ja_JP.UTF-8

- name: set locale to ja_JP.UTF-8
  command: update-locale LANG=ja_JP.UTF-8
  when: ansible_env.LANG | default('') != 'ja_JP.UTF-8'

- name: set timezone to Asia/Tokyo
  timezone:
    name: Asia/Tokyo

- name: install and start NTP
  apt: name=ntp

2. Rubyのインストール

これはネット上の情報で出来ました。Rubyのバーション番号等のパラメター(変数)は他の場所で定義した方が良いかもしれませんが、とりあえず同一ファイルに定義しました。

今回は /usr/local/binruby, gem … をインストールしたのですが、 gem module は user_install: no を設定しないと /usr/local/bin に入らないのでハマりました

- name:  define ruby version
  set_fact:
    workspace: /usr/local/src
    ruby_version: 2.4.1
    ruby_download_url: http://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.gz

- name: install packages required to build ruby
  apt: "name={{ item }} state=present"
  with_items:
    - build-essential
    - zlib1g-dev
    - libssl-dev
    - libyaml-dev
    - libreadline6-dev
    - zlib1g-dev
    - libncurses5-dev
    - libffi-dev
    - libgdbm3
    - libgdbm-dev
    - libsqlite3-dev

- name: download ruby
  get_url:
    url: "{{ ruby_download_url }}"
    dest: "{{ workspace }}/ruby-{{ ruby_version }}.tar.gz"

- name: extract ruby
  unarchive:
    src: "{{ workspace }}/ruby-{{ ruby_version }}.tar.gz"
    dest: "{{ workspace }}/"
    copy: no

- name: build ruby
  command: >
    {{ item }}
    chdir={{ workspace }}/ruby-{{ ruby_version }}
    creates=/usr/local/bin/ruby
  with_items:
    - ./configure --disable-install-doc
    - make
    - make install
    - gem update --system

- name: install bundler gem
  gem:
    name: bundler
    user_install: no

3. PostgreSQL

PostgreSQLはUbuntu16.04標準の9.5ではなく、 9.6を入れたかったので apt_repository , apt_key を設定しました。
また、ログインアカウントでpsqlを使えるようにしたかったので pg_hba.conf を書き換えています。その後のPostgreSQL再起動はnotifyだと非同期になるので serviceで行いました。ここの冪等もAnsibleの勉強になりました ^^;

- name: add PostgreSQL repositories
  apt_repository:
    repo: deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main
    state: present

- name: add PostgreSQL key
  apt_key:
    url: https://www.postgresql.org/media/keys/ACCC4CF8.asc
    state: present

- name: install PostgreSQL
  apt: name={{ item }} update_cache=yes
  with_items:
    - postgresql-9.6
    - postgresql-client-9.6
    - postgresql-contrib-9.6
    - libpq-dev
    - python3-psycopg2

- name: configure PostgreSQL (authentication)
  replace:
    path: /etc/postgresql/9.6/main/pg_hba.conf
    regexp: '^local(\s.+?\s+)peer$'
    replace: 'local\1trust  # peer #'
  register: pg_hba_file

- name: restart PostgreSQL server
  service:
    name: postgresql
    state: restarted
  when: pg_hba_file.changed

- name: add user to PostgreSQL
  postgresql_user:
    name: XXXXXX
    password: XXXXXX
    role_attr_flags: CREATEDB,NOSUPERUSER

- name: add databases to PostgreSQL
  postgresql_db:
    name: XXXXXX
    owner: XXXXXX

4. Nginx

Nginx はネット上にあった情報でなんとかなりました

- name:  define nginx values
  set_fact:
    conf_file: /etc/nginx/sites-available/XXXXXX
    site_name: XXXXXX
    ssl: false
    unicorn_socket: unix:/tmp/unicorn.XXXXXX.socket
    public_path: /home/apps/XXXXXX/current/public

- name: install Nginx
  apt: name={{ item }} update_cache=yes
  with_items:
    - nginx
    - apache2-utils

- name: set this-site configuration
  template:
    src: ../templates/XXXXXX.j2
    dest: "{{ conf_file }}"
  notify: restart nginx

- name: disbale default configuration
  file:
    path: /etc/nginx/sites-enabled/default
    state: absent
  notify: restart nginx

- name: enable this-site configuration
  file:
    dest: /etc/nginx/sites-enabled/XXXXXX
    src:  "{{ conf_file }}"
    state: link
  notify: restart nginx

- name: set log rotation
  copy:
    src: ../files/logrotate
    dest: /etc/logrotate.d/nginx
    owner: root
    mode: 0644

5. アプリケーション

Ruby on Railsアプリケーション用の設定も簡単でした。ちなみにRails等のインストールはデプロイ時に行われるのでありません。

- name: make directory of application
  file:
    path: /home/apps/XXXXX
    state: directory
    owner: ubuntu
    group: ubuntu
    mode: 0755

- name: set unicorn configuration
  copy:
    src: ../files/unicorn
    dest: /etc/init.d/unicorn
    mode: 0755

- name: enable unicorn service
  service:
    name: unicorn
    enabled: yes
    use: service

- name: set log rotation
  copy:
    src: ../files/logrotate
    dest: /etc/logrotate.d/unicorn
    owner: root
    mode: 0644

感想

出来たplaybookを見るとChefに比べ短くシンプルですね。あまり難しい事をしないならAnsibleは楽です。ただし冪等を頑張ると少したいへんかも・・・・

1Passwordを使うことにしました

長らくパスワードの管理は適当にやってたのですが、最近 1Password を知り使うことにしました。

1Passwordの紹介記事はたくさんあるのですが、多くの記事に書かれてる内容と 1Passwordのホームぺージ に書かれている内容は違いがあり調べながら使ってみた結果を書いておきます。

f:id:yuum3:20170123142414p:plain

価格

紹介記事には、まず Mac AppStore で ¥7,800 のアプリ (以前は ¥6,000だったようです) を購入するように書かれていますが、ホームページ には $2.99/月 (ただし年間契約の場合) と書かれています。そして契約すれば Mac, Windows, iOS, Android のアプリは無料で使えます。さらにWebアプリだけでも使えます。

もともと売り切りのアプリとして作られ、それがサブスクリプション型のサービスに発展してきたのでしょうか? アプリを購入した場合はWebアプリはタダで使えるのでしょうか??

私はWebから1ヶ月の無料お試しを登録し、使えそうなので $2.99/月 のプランを契約しました。ちなみに年間契約にしないと $3.99/月 になるそうです。

パスワード情報の共有

紹介記事には、アプリのパスワード情報の格納庫(ヴォールト)を DropboxiCloud に置き、複数の Mac, PC, iOSバイスで共有するように書かれています。確かにこの方法で複数のデバイスでパスワード情報の共有できました。

しかし私の場合、使っている Mac のうち一台は仕事先の企業から借りているものなので 個人用のDropboxはインストールしていません。また Dropbox でパスワード情報を管理しようとすると Dropboxのパスワードを覚えていないと使えない事になります。1Passwordを使うメリットの一つはアプリで発生させた長い安全なパスワードが使える事にありますが、長い安全なパスワードを暗記するのは大変そうです・・・

実は ホームぺージ で作成した保管庫(ヴォールト)は、全アプリで共有できます。これを使えば Dropbox等は不要なのです!

また Mac アプリ等はローカルにも情報を保存しているのでネット接続が無くてもパスワード情報は参照できます。

情報のバックアップ

万が一 全Macが壊れるとかウイルスにやられ、しかも1Passwordのサービスが終了してしまうと私の全パスワード情報が消えてしまいます。どうしても気になる場合は。

  • Macアプリで保管庫(ヴォールト)単位でファイルにエクスポートし、ファイルを安全に管理する
  • Macアプリの印刷でパスワードを含む全情報が印刷できるので紙またはPDFファイルで安全に管理する
  • Macアプリでローカルな保管庫(ヴォールト)を作り全情報をそこにコピーし、保管庫のファイルを安全に管理する

などでしょうか

使ってみた感想

  • 各種サービスのログイン・パスワードを長い安全な、そしてサービス毎にユニークなパスワードに置き換えれたので安心
  • iPhone,iPad等では複数アプリが画面に出せないので、パスワード入力で少し不便ですが、そうそうあることではないので我慢できます
  • ソフトウェアのライセンス管理用のアイテムもあり、今までメインの持ち出ししないMacのみに置いていたライセンス管理情報が他のMacでも見れるようになって便利
  • その他、クレジットカードなどいくつかの情報も1Passwordに入れてしまいました!

Ruby on Rails 2.3 + PostgreSQL 9.6.1 は一部の機能が動かない

ある仕事でRuby on Rails 2.3をメンテナンスしていますが、PostgreSQL のバージョンを 9.2 から 9.6.1 にアップデートする事になったのですが、一部の機能(Active Scaffold 覚えてますか?)が動きませんでした。

f:id:yuum3:20170115150154p:plain

ソースを調べていくと、ActiveRecord の connection.table_exists?メソッドがいつでも falseを返しています。 ActiveRecord2.3のtable_exists?メソッドのソースを調べていくと PostgreSQLの SHOW search_path コマンドの戻り値を使っているのですが

PostgreSQLバージョン 戻り値
9.6より前 "$user",public
9.6.1 "$user", public

違いが判りますか? 9.6.1 は , の後ろに スペースが入っています。 ActiveRecord2.3では split(/,/)でパースしているので9.6.1では " public" が戻り、この値で pg_tablesテーブルの schemaname を検索するぐるのでテーブルが全くみつからなくなります。

そういうわけで、Ruby on Rails 2.3 はもうメンテされていないのでモンキーパッチを書いて対応しました。 ちなみにRuby on Rails4, 5 のソースを見てみましたが SHOW search_path ではなく current_schema() 関数を使っているのでこの問題ないです。

module ActiveRecord
  module ConnectionAdapters
    class PostgreSQLAdapter < AbstractAdapter

      def tables(name = nil)
        schemas = schema_search_path.split(/\s*,\s*/).map { |p| quote(p) }.join(',')
        query(<<-SQL, name).map { |row| row[0] }
          SELECT tablename
            FROM pg_tables
           WHERE schemaname IN (#{schemas})
        SQL
      end
    end
  end
end

2017年のEY-Officeはどうなるのか

さて今年のEY-Officeについて考えてみました。

2016年のまとめ をうけて今年はどううするかですが、いろいろと迷ってます。

f:id:yuum3:20170103110029p:plain

現状

開発の仕事は積極的に探しているわけではないのですがやってきます、ありがたい事です。受託の仕事はリスクも低くく、それをこなしていけばなんとか生きていけます。しかし、歳も取ってきたしたくさんの仕事はこなせません。また贅沢を言えばもう少し満足感がある仕事がしたいです。

さて教育の仕事は自社でリスクを取っていることもあり、満足感は高いですし、ややスケールします。ただしRuby on Railsの教育は10年という時間が経ち、Web系の開発会社のレベルが上がったり、全てオンラインやオンライン+オフラインの教育サービスを行う会社も増えてきて、全てをオフラインで行う教育はコストがかかり需要が落ちているのかも知れません。

これから

大きなプランを書いても計画的でない私にはあまり意味がので、短期的な事を書きます。

教育に関してはある会社と共同で 「SIer系の開発者をWeb系の開発者にコンバートする教育」 を進めていますが、まだ成果は出ていません。しかし、現在のRuby on Railsを始め先進的なWeb系のエンジニア不足はいぜんとして解決しておらず需要はあると思っているので今年も続けて行こうと思います。このような教育に付いて興味のある方は EY-Officeホームページ や メール 、twitter (たまにチェックしてます) などから連絡下さい。

Ruby on Rails 5.1 ではフロントエンド(CSS, JavaScript)周りの処理をJavaScriptの標準プラットフォームであるnpm(Node.js)を使えるようになるそうです。昨年React.jsをガッツリと使ったので、Bableを使ったES6(ES2015)やWebpackには慣れたました。ここで得られた知見を開発者教育の方でもいかして行きたいと思っています。

2016年のまとめ

もう2017年になりましたが、昨年のまとめを書きました。

f:id:yuum3:20170103110403p:plain

お仕事

前半は忙しいかったですが、後半はのんびりとしていたかと思います。

開発

React.js

年始は、一昨年から始めた、Ruby on Rails + React.js の仕事が佳境に入り、がっつりReact.js を書きました。この仕事ではフロントエンドを jQueryからReact.js に置き換えるために動作保証用に Turnip (RSpec)を使ってend-to-end テストを書いたりスケジュール的にはきつい仕事をこなしました。

ここで最近まで遠めに眺めていたJavaScriptの世界にガッツリ取り組めてかなり勉強できました。React.jsはもちろん、ES6(ES2015)やWebpackなども安定し始めた時期に取り掛かれてラッキーだったかと思います。

あるサービスのメンテナンス

むかしお世話になった Scaleout (現 SuperShip)のあるサービスのメンテナンスの仕事を頂きました。古いシステム(Ruby on Rails 2.3)のメンテナンス的な開発ですが、定期的にお金が頂ける仕事は会社としてはたいへんありがたいです、 @yamaz ありがとうございます。

教育

名古屋でRuby on Rails教育

一昨年の青森につづき、昨年も出張教育を行いました。名古屋のスタートアップ会社でプログラミング初心者向けにガッツリと教育を行ってきました。

その他の Ruby on Rails教育

例年通りドリコムさんで新人向けのRuby on RailsRDB, JavaScript教育を行いました、また以前受講して頂いたWeb系企業でも教育を行わせて頂きましたが、名古屋を含め3件でした。

Ruby on Railsも正式リリースから10年以上たち、Ruby, Ruby on Railsのエンジニアも増え一般化した事で教育の需要が落ちたのでしょうか? またオンラインの教育なんども増えて来た事もあるのでしょうか?

お仕事以外

マンションの部屋をリフォームした

住んで20年以上も経ち、猫にやられ壁がボロボロになってしまったマンションのお部屋をリフォームしました。一番おおきな変更は下の図のようにリビングとベッドルームの間の壁を外していまったことです(壁だった部分には引き戸を付けたので独立した部屋にも出来ます)。

これにより高層階ではないのですがリビングからの視界が凄く広がりました。普段はリビングの小さなテーブルでMacを置き仕事しているのですが、気分よく仕事が出来るようになりプログラムなどの生産性が向上しました !!

f:id:yuum3:20170103114754p:plain

リフォーム中はとなり町の田園調布のアパートに住んでいましたが、以前ブログに書いたように 不便で寂れた街に驚き、自由が丘に戻って来て、さらに自由が丘が好きになりました。