katsuyukikun’s diary

とある天パーエンジニアのblog

【kintone × marketo連携】両方へ入門してみた

先週の1週間ずっとこれらの連携周りで調べていて、あまり情報ないなぁと思い結構時間かかってしまったのでログ残しておきます。

kintone

名前聞いたことある程度だったので軽く調べてみました。

kintoneとは

サイボウズさんが自社で開発しているクラウドサービスです。 ググってみると色々説明出てきますが、個人的には「webデータベースのアプリを構築してくれるサービス」という認識で良いかなって思っています。

「アプリ」という単位でフロント側とDBを持ち、フロントをそのアプリを使う人が自分で勝手にカスタマイズできる業務支援システムというイメージです。(厳密にいうと違うのかもしれませんが、僕はこのイメージがしっくりきました)

         f:id:katsuyukikun:20180813195703p:plain

カラム名はフロント側で設定したものになってしまうのでこの辺を設計しないと、カオスになるのはなんとなく目に見えると思いますww フロントを簡単にいじれてかつそれがDBに入るので営業さんとかのPDCAを高速に回すとかにはすごく良いんですけどね。。

marketo

こちらも名前を聞いたことがあるという程度だったので軽く調べました。

marketoとは

マーケティングオートメーション」というやつで、顧客一人一人の行動を追え、タイミングタイミングでアクションを変えたりすることができるプラットフォームです。個人的には「そのユーザーが自社(サービス)に興味をどのくらい持っているのかを可視化できて、その興味や状態によってどうアクションするのかを選択できるツール」くらいの認識ですがw

    f:id:katsuyukikun:20180813201716p:plain

documentの見方

どちらも親切なことにdocumentが用意されています。なので基本的にはそこを読めば解決できます。またどちらもdeveloper用の質問サイト?が用意されており、過去のログもみることができるので同じ問題にぶち当たった人がどう解決したのかなどもわかるので便利です!

ただ僕が一瞬あれ?と思った箇所があったのでそこだけ説明しますw
それはmarketoのdocumentです。

developers.marketo.com

連携させたかったのでapiのdocumentをみたのですが、全て英語です。なので英語が苦手な人は少し辛いかもしれないですね。。頑張りましょ!

でその中でみていくとpostする際のデータの持たせ方が載っています。

http://developers.marketo.com/rest-api/endpoint-reference/lead-database-endpoint-reference/#!/Leads/syncLeadUsingPOST

f:id:katsuyukikun:20180813202759p:plain

これをみたとき僕は一瞬「めっちゃデータ構造複雑だな、SyncLeadRequestとLeadと・・・を持たせるのかよ〜。どう持たせれば良いのかな?」と思ってましたww

f:id:katsuyukikun:20180813203209p:plain

actionはstringで持たせるよ!とか書いているのに途中でLeadというのが出てきます。それを下で構造的に説明しているだけでしたw

inputの中身ArrayでLeadがHashで書かれており、パラメータのタイプがbodyとなっているのでcurlだとこんな感じになりますね

curl -H 'Content-Type:application/json' -d "{"action":"createOnly","input":[{"id":1, "reason": ""}]}" https://test.co.jp/

やりたかったこと

kintoneで更新した時に、marketoのAPI叩いてmarketoにleadの(見込み客のことをleadと呼ぶ)新規作成or更新をかける。

      f:id:katsuyukikun:20180813204234p:plain

実装

kintone側

データ更新かけた後の処理の実装方法はこちら

developer.cybozu.io

marketoのAPIは外部APIになるのでこちら

外部APIの実行 – cybozu developer network

これら2つを合わせるだけなので

(function() {
 
    "use strict";
    //レコード追加画面の保存成功後イベント
    kintone.events.on('app.record.create.submit.success', function(event) {
      var postHeader = {"Content-Type": "application/json"}
      var postData = {"action":"createOnly", "lookupField": "email","input":[{"email":"test@test.co.jp", "firstName": "test"}]}
      kintone.proxy('https://*****.***.co.jp/rest/v1/leads.json?access_token=xxxxx', postHeader',postData}, function(body, status, headers) {
        //success
        console.log(status, JSON.parse(body), headers);
      }, function(error) {
        //error
        console.log(error);  //proxy APIのレスポンスボディ(文字列)を表示
      });
    });
})();

marketo側

このURLのdocument通りに、API叩くようのユーザーを作成し、そのユーザーにAPIロールを付与してアクセストークンを発行する。

Quick Start Guide for Marketo REST API - Marketo Developers

そのあとはREST APIのdocumentをみて対応させていく。

Lead Database - Marketo Developers

新規作成の時は、/rest/v1/leads.jsonでinputのところに初期設定したい値を入れるだけです。 ちなみにlookupFieldというのは、データ整合性をとる時にどこのフィールド(カラムのことですね)を対応させるのかということです。 今回だと

"lookupField": "email"

としたので、marketo側でメルアドを参照し同じメルアドがあったら更新、なかったら作成という挙動になります。

挙動

kintoneで更新かけると、marketoの「Lead Database」というところの「全ての顧客」にデータが作成されます。更新されるときはそのユーザーが更新されます。

まとめ

蓋を開けてみると、非常にシンプルですが初めてだとそもそもの理解に時間がかかるものだなと思いました。こういうものでも時間をかけずにできるように、今回詰まったところをもう一度洗い出して、なぜ詰まったのかを考え次に繋げたいです。

終わり。

新規システム構築する際の仕事の進め方

転職初日に新規立ち上げの部署への移動が決定し、最近は四苦八苦しながらプロジェクトを前に進めています。

 

その進め方で今度やるときはこうして進められると初動としてはよかったのではないかと思ったのでログ残します。

 

その前に

前提

サービス自体はすでにありました。簡単にいうと人材を集客して教育し事業所へ流す、その時の事業所への紹介料でマネタイズするというビジネスモデルです。

 

   f:id:katsuyukikun:20180728135833p:plain

 

そしてざっくりとした業務フローですが営業がもともと強い会社なので、集客してきたユーザーに架電し、面談実施を行いそこで事業所へ紹介できる人材なのかを見極める。そして、見極めた後、就業支援やら教育などをして一定の力をつけて事業所へ流すという感じです。 

 

 状態

縦割りのチーム分けになっています。

なので架電部隊は架電部隊でデータを管理し、教育支援やらなんやらのところはまた別の方法でデータ管理しているという状態です。

 

そして、 データ連携もところどころうまくできていなく、担当の方が手作業で入力しているという感じでした。

 

やったこと

全体像の把握

正直アサインはされたものの「何して良いのかわからない、そもそもここはどこなんだ?」という状態だったので、各フローのリーダーや事業責任者などへのヒアリングを行いました。

 

そこでは主に以下を聞いていました。

  • そもそもなぜシステムを入れるという判断になったのか
  • KPIから乖離しているポイントはどこでどのくらい離れているのか
  • なぜそのような乖離が生まれたのかの仮説を持っているのか
  • 各フローは現在どういう作業を行なっているのか
  • その中で今困っていることはなにか
  • 今後どのようにしていきたいなどの理想はあるか

あとはその話を聞いてもっと知りたいことなどを追加で聞きました。

 

これを通して全体像の把握は完了し、なんとなくボンヤリとした各部門の業務フローと困っていることはわかります。

 

各フローの実際の作業の把握

ボンヤリとした、業務フローはわかったのですが具体的にどういう風に行なっているのはやはり実際に足を運ばないと理解はできなかったので各部門の見学なり体験なりしました。

フローの詳細、どんなデータをどこにどうやって管理しているのか、そしてそのデータはどこへ連携しているのかの理解できます。

 

理想形の設計

ここは未だ手が出ず。

何を理想形としどうあるのが業務的に一番楽で成果出るのか、そうあるにはシステム的にどうあるべきなのかを考える必要がありました。

ただこれを考えるにあたり、重要視したのが問題の切り出し方。

 

「切り出しが大きすぎると成果までに時間がかかる」

 

→なるべく問題を小さくしながら随時改善の効果が実際の現場に反映されるようにしないといけない。

  

なのでここを模索しながら、成果に繋がるところを改善していく方針にしました。

 

現状の問題の洗い出し

各フローのヒアリングや見学・体験を通して一旦下記を洗い出すことにしました。

  • どこが改善できそうなのか
  • どこに手を加えるのが一番事業としてインパクトがあるのか

 

そして、洗い出した中で自分なりの解決策を考え、その工数を見積もる。

見積もったあと、各部署に提案。そのまま実行して良いのか、それとも修正した方が良いのかを詳細を詰めていきました。

 

実行

スプリント形式の方が、自分はやりやすいのでgithubでissue管理し、何をいつまでにやるのかというのを管理することにしました。

 

反省

なんと言っても、スピード感は遅すぎたように思います。

というのも最初は「ビジネスモデルを理解し、どうあるべきなのか理想形を考える」というとてつもなく大きなものから考えようとして、時間が無駄にすぎていっていました。

また理想形ができたところで、現状のフローをいきなりガラッと変えることはあまりないと思います。ましてはその理想形が本当にベストなのかも未定です。

この場合は現状のもう実際に動き出しているフローがあるのでそこをどう改善するか、どういう設計にした方が効率良いのか、そういうところを考え先に実行しながら、同時進行で理想形を設計していくというのがトータル早く成果に結びついたのではないかなと思っています。

 

まとめ

やることとしては以下の順番がよいかなと現時点では考えています。

  1. 全体像の把握
  2. 各フローの理解
  3. 現状の問題点の洗い出し + 理想形の模索
  4. その問題点に関して自分なりの解決案を考える + 理想形の模索
  5. 工数見積もり
  6. 相談と修正
  7. 実装 + 理想形の模索
  8. 運用と改善 + 理想形の模索

 

上流工程の本とかを読んでもイメージはつくが実際にどう進めていいのかなかなかわからなかったので、 引き続き毎日考えながら次へ活かせるようにやっていきたい。

 

 

 

終わり。

 

 

 

 

 

 

【rails5.2 + mysql + rspec】既存のDB上でrspecを実行したらTable doesnt existと言われた。

以前、docker上にDB立ててリモートからdumpしてrestoreするの時間かかるからそのままリモートDBに繋げるようにすれば楽だよねーって記事を書きました。

katsuyukikun.hatenablog.com


僕が今回業務で対応していたのが、DBからデータを取得するだけのアプリケーションだったのでこれで良いと思っていました。


そう、思っていたのです。。。。


だってselectだけだから間違えてDB吹っ飛ぶなんてことは絶対ないと思っていたから・・・



しかし今回、DB吹っ飛びましたw

開発用DBなので別に影響範囲もくそもないのですが、精神的に穏やかでなかったのでログとして残します。


構成

今回はこんな感じ。


f:id:katsuyukikun:20180724213515p:plain


もともとPHPで書かれたアプリケーションとそのDBとしてmysqlを利用していました。

今回僕は、phpのアプリケーションのある動作をフックにし、そのmysqlのDBともう一つ違うところにあるDBにアクセスし、データ統合やら整形をして、違うDBにpostするというアプリケーションをrailsで対応しようとしていました。

実際

僕のやることとしては、
「新しいレポジトリ作成して、既存のDBたちにアクセスできるように0からのアプリケーションを作る」
です。

なのでロジックやらなんやら書いてテスト書いてdeployフロー作って、deployさせるってかんじというのはすぐ思いつくと思います。


なので実行しました。


そしてテストを書きます。

Gemfileにrspec系のgemを加えます。

group :development, :test do
・
・
・
  gem 'rspec-rails'
  gem 'rails-controller-testing'
end


そしてターミナル上でbundle install。僕はdocker使っていたのでこんなかんじです。

$ docker-compose run web bundle install


そしてrspecで必要なファイルを用意する必要があるのでrailsのコマンドを打ちます。

$ docker-compose run web bundle exec rails generate rspec:install


これで必要なものが完成。

で、テスト書いてrspecを実行。

$ docker-compose run web bundle exec rspec spec/


そしたらTable doesnt existとエラーになりました。
この後は何回やってもこのエラーになってしまいます。

なぜか??

rspecで必要なファイルを用意した時に使ったrailsのコマンド

$ docker-compose run web bundle exec rails generate rspec:install


を実行した時にrails_helper.rbというファイルが作られます。
その中のコードを見ていくと

# Checks for pending migrations before tests are run.
# If you are not using ActiveRecord, you can remove this line.
ActiveRecord::Migration.maintain_test_schema!


というのがあります。
結論、この設定のせいでDBが吹っ飛びました。


これrails4.1から設定されているものらしいです。
github.com


コードを追う

githubでいうとここですね。

github.com


maintain_test_schemaというのは、テスト実行時にActive Recordがテスト用データベーススキーマをdb/schema.rb(またはdb/structure.sql)に基いて最新の状態にするかどうかを指定するものらしいです。

で、続きでここですね。

github.com


でこのif文を見てみます。

if Base.connection.migration_context.needs_migration? || !Base.connection.migration_context.any_migrations?

今回はこれですね。

    def any_migrations?
      migrations.any?
    end

結論

僕はphpを触ったことがないのでなんとも言えないのですが、今回はphpでDBがもともと作成されていました。
つまり僕が新しく作ったrailsのアプリケーションにはmigrationのファイルが一つもないわけです。

そして

          current_config = Base.connection_config
            Base.clear_all_connections!
            system("bin/rails db:test:prepare")
            # Establish a new connection, the old database may be gone (db:test:prepare uses purge)
            Base.establish_connection(current_config)

このロジックが流れ、新しいデータベースを作りにいってしまいました。
結果、何もない綺麗さっぱりなDBが出来てしまった→DBが吹っ飛んだ
ということになっていたらしいです。


コメントアウトでも書いてあるのですが、自然と作られるものってそこまで読まないので気をつけたいものです。。


というか、やっぱり何かあったときのためにdumpしようねって話ですね。


おまけ(docker内へのdumpの仕方)

ターミナルで

$ mysqldump -u USER_NAME -p -h HOST_NAME DB_NAME > ~/Desktop/hoge.sql

OUTPUT_FILE_NAME:これはtest.sql的なので空ファイルを自分で作っておくということです。


でdump出来ます。
もし踏み台使わないと行けない場合は、トンネル掘ってから実行すれば問題ないです。

でdockerでdb作るときにvolume忘れずにセットしする。

docker-compose.ymlの中で忘れずに。

    volumes:
      - ./db/mysql/volumes:/var/lib/mysql

docker起動してからdumpしたファイルをコピーし、docker内に入ってrestoreする。

$ docker cp ~/Desktop/hoge.sql コンテナの名前:/var/lib/mysql
$ docker exec -it コンテナの名前 /bin/bash
# mysql -u root -p 適当なdatabase名 < /var/lib/mysql



終わり。

【rails5.2 + mysql5.7】docker上にrailsアプリケーションを立ててリモートDBと繋ぐ

先週くらいからようやくdockerに入門しました!(遅い・・)

本とか自分のPC上では軽く触ったことあったのですが、業務でがっつりdockerで環境構築をしたことはなかったです。

そして今回業務で環境構築する際に、

「どうせならdockerでやろう」

と思って作業してみたもののちょびっと詰まったところがあったのでこれから入門する人の参考になればと思いログとして残しておきます!

 

構成

rails5.2、mysql5.7で作ろうと思っていました。

dockerの公式のチュートリアルでもありますが、結構docker上にアプリケーションとDBの両方置いちゃうケースがあると思います。

 f:id:katsuyukikun:20180718205812p:plain  

  なので僕も最初これで環境作ろうと思っていました。

ただ今回の環境構築では新規DBを作成ではなく既存のDBを使いたい!!

既存のDBをダンプしてそれを新規DBでリストアするか〜とも思いましたが、データ量かなり大きそうで断念。。。。

 

ということで結局この構成にしました。

f:id:katsuyukikun:20180718210333p:plain  

初めての構成だったので本当にできるのか不安だったのでまずはローカルからリモートのDBに繋げられるかを確認。

f:id:katsuyukikun:20180718221547p:plain

リモートDBサーバーのホスト名(xxx:xxx:xxx:xxx)

ユーザー名(hoge)

データベース名(database_name)

$ mysql -h xxx:xxx:xxx:xxx  database_name --port=3306 -u hoge -p

結果は

bash: mysql: command not found

それ以前の問題でしたwww

brewを入れているのでmysqlの5.7をインストールした後にもう一度実行しました

$ brew install mysql@5.7
$ mysql -h xxx:xxx:xxx:xxx  database_name --port=3306 -u hoge -p
bash: mysql: command not found

結果は変わらず・・

$ which mysql

と打っても何も出ないので、パスを通すことにしました。 (なぜこうなるのかは後で調べるつもりです) 僕は.bash_profileにいつも書くのでそこに追記します。

$ echo export PATH=/usr/local/opt/mysql@5.7/bin:$PATH > .bash_profile 
$ source .bash_profile
$ which mysql
/usr/bin/mysql

準備できた。

$ mysql -h xxx:xxx:xxx:xxx  database_name --port=3306 -u hoge -p
Access denied for user

おっふ、、、弾かれましたな。

インフラチームに聞いたところローカルからは直接繋げられないよ、とのことでした。

なので踏み台を利用して繋ぐ方針に変更。

f:id:katsuyukikun:20180718213546p:plain

トンネル掘って繋げれるようにしました。
(「sshポートフォワーディング」とかでググると出てくると思います)

僕の場合、ローカルから踏み台サーバーへは

ssh 踏み台サーバーのホスト名

でログインできていたので以下になりました。

$ ssh -NL 3307:db_host:3306 ssh_host
$


db_hostはデータベースのホスト名
ssh_hostは踏み台のホスト名

接続確認

$ mysql -h 127.0.0.1 -P 3307 -u db_user -p

> これでmysqlにログインできるはずです


db_userはデータベースログインのユーザ名

やめたかったら

$ ps aux | grep ssh

とやると、フォワーディングしているプロセスが出てくるのでkillすればokです!

ここまできてようやく今回の構成が決まりました汗。

dockerからローカル経由してフォワーディング先のリモートDBに繋げそうですね。

f:id:katsuyukikun:20180718215028p:plain

コード

f:id:katsuyukikun:20180719002005p:plain

あとはdockerからローカルのところを実装すればうまくいきそうです!

なのでコードを書いていきましょう。チュートリアルと同じなので迷うこともないかなと思います。

まず作業するディレクトリを作り、その上でDockerfileとdocker-compose.ymlとGemfile、Gemfile.lockを作ります。

$ mkdir work
$ cd work
$ touch Dockerfile
$ touch docker-compose.yml
$ touch Gemfile
$ touch Gemfile.lock

そして各々コードを記述していきます。

Dockerfileの中身

FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
Gemfileの中身

source 'https://rubygems.org'
gem 'rails', '5.2.0'

Gemfile.lockは空。

docker-compose.ymlの中身

version: '3'
services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"

コンテナ上でrails newします。

$ docker-compose run web rails new . --force --database=mysql

新しいファイルができたらconfig/database.ymlを修正します。 ここ最初どう書けば良いのか迷いましたが最終的にこれでいけました!

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: リモートDBのユーザー名
  password: リモートDBのパスワード
  host: docker.for.mac.localhost
  port: 3307

development:
  <<: *default
  database:リモートDBのデータベース名

dockerからローカルのMacを見るときはdocker.for.mac.localhostで見てくれるそうです! あと今回、フォワーディングのポートを3307にしているのでport: 3307にしています。 ここも適宜変更してください!

ここまでできたらあとは起動するだけです!

$ docker-compose up --build

localhost:3000にアクセスするとお馴染みの画面が表示されるはずです。

f:id:katsuyukikun:20180718220141p:plain

全然関係ない話。

今回初めて知ったのですが、Active Recordって使えるmysqlのバージョンがあったんですね笑。 ORマッパーもあるし、よくよく考えると当たり前なんですが意識したことが一度もなかったです!

というのも今回既存のDBのmysqlが5.0.9という状態で・・・アクセスしたら

Your version of MySQL (5.0.9) is too old. Active Record supports MySQL >= 5.1.10.

という見たことないエラー出てちょっと感動しましたw こういうところもしっかりみておきたいですね!

github.com

終わり。。

python3.7(pip3)でscikit-learnをインストールしようとしたらエラった話

mac初期化して、綺麗さっぱり!

もう一度環境設定し直そうと思って機械学習系のライブラリ入れてたらなんかエラーになったのでログとして残しておこうかなと思います。

 

エラー内容

どういう動作をしていたかは以下です。

  • homebrewでpython3をインストール
  • pipでscikit-learnをインストトール
$ brew update # brewをインストールしていたので最新にした
$ brew doctor # 問題ないか確認
Your system is ready to brew.
$
$ pip3 install scikit-learn # scikit-learnをインストール
・・・エラー出る

エラー内容はこちら *長すぎるので一部省略

Collecting scikit-learn
  Downloading https://files.pythonhosted.org/packages/f5/2c/5edf2488897cad4fb8c4ace86369833552615bf264460ae4ef6e1f258982/scikit-learn-0.19.1.tar.gz (9.5MB)
    100% |████████████████████████████████| 9.5MB 2.4MB/s 
Building wheels for collected packages: scikit-learn
  Running setup.py bdist_wheel for scikit-learn ... error
  Complete output from command /usr/local/opt/python/bin/python3.7 -u -c "import setuptools, tokenize;__file__='/private/var/folders/0f/7pybjfq55vx60gjyjwbx4k0c0000gn/T/pip-install-73hi3d9o/scikit-learn/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d /private/var/folders/0f/7pybjfq55vx60gjyjwbx4k0c0000gn/T/pip-wheel-9kivc9ej --python-tag cp37:
  Partial import of sklearn during the build process.
  blas_opt_info:
  blas_mkl_info:

  customize UnixCCompiler
    libraries mkl_rt not found in ['/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib', '/usr/local/lib', '/usr/lib']
    NOT AVAILABLE
  
  blis_info:
  customize UnixCCompiler
    libraries blis not found in ['/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib', '/usr/local/lib', '/usr/lib']
    NOT AVAILABLE
  
  ・略(customize UnixCCompilerのNOT AVAILABLE系のエラーが続く)
  ・
  ・
  
    FOUND:
      extra_compile_args = ['-msse3', '-I/System/Library/Frameworks/vecLib.framework/Headers']
      extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
      define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]
  
  running bdist_wheel

  ・略(色々buildしたりcopyしたりしたログが出力されていました)
  ・
  ・
  running build_clib
  customize UnixCCompiler
  #### ['clang', '-Wno-unused-result', '-Wsign-compare', '-Wunreachable-code', '-fno-common', '-dynamic', '-DNDEBUG', '-g', '-fwrapv', '-O3', '-Wall'] #######
  customize UnixCCompiler using build_clib

  ・略(色々buildしたりcopyしたりしたログが出力されていました)
  ・
  ・
  /usr/local/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:15:2: warning: "Using deprecated NumPy API, disable it by "          "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-W#warnings]
  #warning "Using deprecated NumPy API, disable it by " \
   ^
  sklearn/cluster/_dbscan_inner.cpp:5960:21: error: no member named 'exc_type' in '_ts'
      *type = tstate->exc_type;
              ~~~~~~  ^
  sklearn/cluster/_dbscan_inner.cpp:5961:22: error: no member named 'exc_value' in '_ts'; did you mean 'curexc_value'?
      *value = tstate->exc_value;
                       ^~~~~~~~~
                       curexc_value

  ・略(error: no member named などのエラーが続く)
  ・
  ・

  sklearn/cluster/_dbscan_inner.cpp:6034:13: error: no member named 'exc_traceback' in '_ts'; did you mean 'curexc_traceback'?
      tstate->exc_traceback = local_tb;
              ^~~~~~~~~~~~~
              curexc_traceback
  /usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/include/python3.7m/pystate.h:238:15: note: 'curexc_traceback' declared here
      PyObject *curexc_traceback;
                ^
  1 warning and 15 errors generated.
  In file included from sklearn/cluster/_dbscan_inner.cpp:514:
  In file included from /usr/local/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4:
  In file included from /usr/local/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:18:
  In file included from /usr/local/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1816:
  /usr/local/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:15:2: warning: "Using deprecated NumPy API, disable it by "          "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-W#warnings]
  #warning "Using deprecated NumPy API, disable it by " \
   ^
  sklearn/cluster/_dbscan_inner.cpp:5960:21: error: no member named 'exc_type' in '_ts'
      *type = tstate->exc_type;
              ~~~~~~  ^
  sklearn/cluster/_dbscan_inner.cpp:5961:22: error: no member named 'exc_value' in '_ts'; did you mean 'curexc_value'?
      *value = tstate->exc_value;
                       ^~~~~~~~~
                       curexc_value

  ・略(error: no member named などのエラーが続く)
  ・
  ・

  /usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/include/python3.7m/pystate.h:238:15: note: 'curexc_traceback' declared here
      PyObject *curexc_traceback;
                ^
  1 warning and 15 errors generated.
  error: Command "clang++ -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -I/usr/local/lib/python3.7/site-packages/numpy/core/include -I/usr/local/lib/python3.7/site-packages/numpy/core/include -I/usr/local/include -I/usr/local/opt/openssl/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/include/python3.7m -c sklearn/cluster/_dbscan_inner.cpp -o build/temp.macosx-10.13-x86_64-3.7/sklearn/cluster/_dbscan_inner.o -MMD -MF build/temp.macosx-10.13-x86_64-3.7/sklearn/cluster/_dbscan_inner.o.d" failed with exit status 1
  
  ----------------------------------------
  Failed building wheel for scikit-learn
  Running setup.py clean for scikit-learn
Failed to build scikit-learn
Installing collected packages: scikit-learn
  Running setup.py install for scikit-learn ... error
    Complete output from command /usr/local/opt/python/bin/python3.7 -u -c "import setuptools, tokenize;__file__='/private/var/folders/0f/7pybjfq55vx60gjyjwbx4k0c0000gn/T/pip-install-73hi3d9o/scikit-learn/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /private/var/folders/0f/7pybjfq55vx60gjyjwbx4k0c0000gn/T/pip-record-wgjf7j3u/install-record.txt --single-version-externally-managed --compile:
    Partial import of sklearn during the build process.
    blas_opt_info:
    blas_mkl_info:
    customize UnixCCompiler
      libraries mkl_rt not found in ['/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib', '/usr/local/lib', '/usr/lib']
      NOT AVAILABLE
    
    blis_info:
    customize UnixCCompiler
      libraries blis not found in ['/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib', '/usr/local/lib', '/usr/lib']
      NOT AVAILABLE
    
  ・略(customize UnixCCompilerのNOT AVAILABLE系のエラーが続く)
  ・
  ・
    
      FOUND:
        extra_compile_args = ['-msse3', '-I/System/Library/Frameworks/vecLib.framework/Headers']
        extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
        define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]
    
    running install
    running build
  ・略(色々buildしたりcopyしたりしたログが出力されていました)
  ・
  ・
    customize UnixCCompiler
    #### ['clang', '-Wno-unused-result', '-Wsign-compare', '-Wunreachable-code', '-fno-common', '-dynamic', '-DNDEBUG', '-g', '-fwrapv', '-O3', '-Wall'] #######
    customize UnixCCompiler using build_clib
    building 'libsvm-skl' library
    compiling C++ sources
    C compiler: clang++ -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall
    
    creating build/temp.macosx-10.13-x86_64-3.7
    creating build/temp.macosx-10.13-x86_64-3.7/sklearn
    creating build/temp.macosx-10.13-x86_64-3.7/sklearn/svm
    creating build/temp.macosx-10.13-x86_64-3.7/sklearn/svm/src
    creating build/temp.macosx-10.13-x86_64-3.7/sklearn/svm/src/libsvm
    compile options: '-I/usr/local/lib/python3.7/site-packages/numpy/core/include -c'
    clang++: sklearn/svm/src/libsvm/libsvm_template.cpp
    ar: adding 1 object files to build/temp.macosx-10.13-x86_64-3.7/liblibsvm-skl.a
    ranlib:@ build/temp.macosx-10.13-x86_64-3.7/liblibsvm-skl.a
    running build_ext
    customize UnixCCompiler
    customize UnixCCompiler using build_ext
    customize UnixCCompiler
    #### ['clang', '-Wno-unused-result', '-Wsign-compare', '-Wunreachable-code', '-fno-common', '-dynamic', '-DNDEBUG', '-g', '-fwrapv', '-O3', '-Wall'] #######
    customize UnixCCompiler using build_ext
    building 'sklearn.__check_build._check_build' extension
    compiling C sources
    C compiler: clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall
    
    creating build/temp.macosx-10.13-x86_64-3.7/sklearn/__check_build
    compile options: '-I/usr/local/lib/python3.7/site-packages/numpy/core/include -I/usr/local/lib/python3.7/site-packages/numpy/core/include -I/usr/local/include -I/usr/local/opt/openssl/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/include/python3.7m -c'
    clang: sklearn/__check_build/_check_build.c
    clang -bundle -undefined dynamic_lookup build/temp.macosx-10.13-x86_64-3.7/sklearn/__check_build/_check_build.o -L/usr/local/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/sqlite/lib -Lbuild/temp.macosx-10.13-x86_64-3.7 -o build/lib.macosx-10.13-x86_64-3.7/sklearn/__check_build/_check_build.cpython-37m-darwin.so
    building 'sklearn.cluster._dbscan_inner' extension
    compiling C++ sources
    C compiler: clang++ -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall
    
    creating build/temp.macosx-10.13-x86_64-3.7/sklearn/cluster
    compile options: '-I/usr/local/lib/python3.7/site-packages/numpy/core/include -I/usr/local/lib/python3.7/site-packages/numpy/core/include -I/usr/local/include -I/usr/local/opt/openssl/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/include/python3.7m -c'
    clang++: sklearn/cluster/_dbscan_inner.cpp
    In file included from sklearn/cluster/_dbscan_inner.cpp:514:
    In file included from /usr/local/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4:
    In file included from /usr/local/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:18:
    In file included from /usr/local/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1816:
    /usr/local/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:15:2: warning: "Using deprecated NumPy API, disable it by "          "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-W#warnings]
    #warning "Using deprecated NumPy API, disable it by " \
     ^
    sklearn/cluster/_dbscan_inner.cpp:5960:21: error: no member named 'exc_type' in '_ts'
        *type = tstate->exc_type;
                ~~~~~~  ^
    sklearn/cluster/_dbscan_inner.cpp:5961:22: error: no member named 'exc_value' in '_ts'; did you mean 'curexc_value'?
        *value = tstate->exc_value;
                         ^~~~~~~~~
                         curexc_value
  ・略(error: no member named などのエラーが続く)
  ・
  ・
    /usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/include/python3.7m/pystate.h:238:15: note: 'curexc_traceback' declared here
        PyObject *curexc_traceback;
                  ^
    1 warning and 15 errors generated.
    In file included from sklearn/cluster/_dbscan_inner.cpp:514:
    In file included from /usr/local/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4:
    In file included from /usr/local/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:18:
    In file included from /usr/local/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1816:
    /usr/local/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:15:2: warning: "Using deprecated NumPy API, disable it by "          "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-W#warnings]
    #warning "Using deprecated NumPy API, disable it by " \
     ^
    sklearn/cluster/_dbscan_inner.cpp:5960:21: error: no member named 'exc_type' in '_ts'
        *type = tstate->exc_type;
                ~~~~~~  ^
    sklearn/cluster/_dbscan_inner.cpp:5961:22: error: no member named 'exc_value' in '_ts'; did you mean 'curexc_value'?
        *value = tstate->exc_value;
                         ^~~~~~~~~
                         curexc_value
  ・略(error: no member named などのエラーが続く)
  ・
  ・
    /usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/include/python3.7m/pystate.h:238:15: note: 'curexc_traceback' declared here
        PyObject *curexc_traceback;
                  ^
    1 warning and 15 errors generated.
    error: Command "clang++ -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -I/usr/local/lib/python3.7/site-packages/numpy/core/include -I/usr/local/lib/python3.7/site-packages/numpy/core/include -I/usr/local/include -I/usr/local/opt/openssl/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/include/python3.7m -c sklearn/cluster/_dbscan_inner.cpp -o build/temp.macosx-10.13-x86_64-3.7/sklearn/cluster/_dbscan_inner.o -MMD -MF build/temp.macosx-10.13-x86_64-3.7/sklearn/cluster/_dbscan_inner.o.d" failed with exit status 1
    
    ----------------------------------------
Command "/usr/local/opt/python/bin/python3.7 -u -c "import setuptools, tokenize;__file__='/private/var/folders/0f/7pybjfq55vx60gjyjwbx4k0c0000gn/T/pip-install-73hi3d9o/scikit-learn/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /private/var/folders/0f/7pybjfq55vx60gjyjwbx4k0c0000gn/T/pip-record-wgjf7j3u/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /private/var/folders/0f/7pybjfq55vx60gjyjwbx4k0c0000gn/T/pip-install-73hi3d9o/scikit-learn/

対処方法

調べてみたところ一昨日くらいに修正されマージされていたみたい。 なので最新のをインストールすれば良い。 brewに反映されるまで1ヶ月くらいかかるということなので、(8月には治っているかな?)それまでpythonのバージョンを下げれば インストールできるよとのこと!(本当かどうかは試していないのでわかりませんが・・)

Note that you would need Cython >=0.27.3 to compile it..

ということなのでCythonをインストールしてからdevの最新を入れたら通りました!

$ pip3 install Cython
$ pip3 install https://github.com/scikit-learn/scikit-learn/archive/master.zip
Successfully built scikit-learn
Installing collected packages: scikit-learn
Successfully installed scikit-learn-0.20.dev0
$

転職して1週間が経ちました!

7月入社ということで現在、新しい環境で働き始めています!
 
結論、特に何もしていないという状態ww
 
ではこの一週間、どう過ごしてきたのかを具体的なことも含め、振り返ってみます。
あとで自分で見返したり、もしくは初めて転職する人へこういうケースもあるらしいということをリアルに感じていただければと思います笑。 
 
******************************
 
7/2
初日!
9:00くらいに出社。
部屋に集まり、労務関係やセキュリティ関係の話を聞きました。
大学の講義みたいな感じをイメージしていただければ近いと思います。
18:00前にガイダンスは終了。
その流れで担当する部署に行き、顔合わせして終了のはずが僕だけ未配属ww
厳密にいうともともと配属される部署だったとこと、新たにできた部署があるらしくどっちが良い?と聞かれ、考えておきますといって1日目が終了しました。
 
 
7/3
未配属のまま2日目がスタート。
とりあえずエンジニアの方々に最初は自己紹介をツール上に書いたり、PCセッティングしたりしていました。
サービスが多いので各種サービスのビジネスモデルやらなんやらを確認したあと、使うツールが多くなったのでそれらの軽いキャッチアップ。
その後、各事業部長の人と話す。そしてどの部署にいくかを悩み、最終的に新しくできるところへいくことに決めました。
 
 
7/4
配属先は決まったが具体的に何をするのかは全く決まっていませんでした。なのでとりあえず勝手に配属される部署のgithubをみて、どういう技術セットが必要なのかを洗い出し、足りていないもののキャッチアップしておくことにしました。
 
・Docker
・Vue
・Rails5.2
・Groonga
 
そんなにがっつり触ったことがなかったので復習も込めてdockerからチューリアルやってみたりして終了。
 
 
7/5
昨日触ったdockerを結構いじれるようになったので、dockerの知識をより深くするために細かく調べながらdocker上にvueとrailsの簡単なアプリを実装することに決めました。
 
完成した頃には夕方になっていたので帰宅しました。
 
 
7/6
昨日の続き。
dockerの理解は深まったもののvueの理解を深めることまではできなかったので追加機能を作ってvueの知識を深くしていきました。
また部署の戦略がslackで共有されたのでそれをみて達成目標の確認と現状を確認しておきました。
 
Groongaをやっていないことに気がつき調べた。触って見たい気持ちもあり、昨日の機能として加えることにしたのですが、、昨日作ったものをローカルのみにおいておいたら全て消してしまったwww
 
仕方ないのでGroongaは触らずに知識のみをつけることにした。
 
配属部署のメンバーと来週から何をするのかざっくり話をして終了しました。
 
***************************************
 
 
全く何もしないで一週間が終わってしまっていますww
ただdockerやvueの理解がめちゃ深まって、もはやガンガン実装できるレベルなのでそこは個人的には意味ある時間になって良かったです。
 
 
それにしても自分で何か見つけて自走できる力身につけておいて良かったです笑。そこだけは前職に感謝した一週間だったと思います。
 
 
来週からはまだざっくりですが、ようやく始動できるのでガンガン進めていきたいですなー。
 
 
 
終わり。

筋トレ日記1

もう20代後半になったこともあり、体型を維持したいなという思いから筋トレをしようと思いました。

まあ以前から筋トレ熱が出てきたときにやろうとは思っていたのですがあまり続かず。

ただ今回まだ3ヶ月程度しか経っていないのですが、続いているのでついでにそのことを書いていこうかなと思います。

 

以前

筋トレするならやはりジムに行くのが一番ということで24時間やっているフィットネスジムに入門しました。

 

最初はちゃんと通ってました。

 

1ヶ月くらいは頑張れたのですが、それ以降続きませんでした。

 

特に雨降っている時とか前日飲んだ時とか、、そもそもジムに行くのがめんどくさくなってしまいました。

 

そのめんどくさいが続き、いつの間にか通うことが意識から消えていました。

 

熱が再発

5月くらいに健康診断に行きました。体重が増えていて結構ショックを受けました。

 

「体を鍛えよう」

 

再度筋トレ熱が再発したので体を鍛えることにしました。

 

考えたこと

以前失敗した原因はたったひとつ

  • めんどくさくなる

 

なので今回はこれが発生しないようになんとかせねばと思いました。

考える上でそもそも何がめんどくさいと感じるのかを洗い出しました。

 

その結果、僕の場合は以下のことが考えられました。

  • 着替えるのがめんどくさい
  • コンタクトレンズ入れるのがめんどくさい
  • ジムまで行くのがめんどくさい

これを全て発生しないようにしました。

 

縄跳び

めんどくさいで洗い出した中で「ジムまで行くのがめんどい」というのが一番の原因だと思ってそこを解決しようと思いました。

 

ググったら「縄跳び」が出てきたので縄跳びを購入。

 

やってみました。

 

夜、マンション内の敷地で飛んでいました。

 

これも続かず1ヶ月くらいしか続きませんでした。

 

自重トレーニング

ジムに行くのがめんどいのではなく、外に出るのがめんどいのでは?と思いました。

 

家でやれればめんどくさい部分すべて潰せる!と思い、ググってみたら「自重トレーニング」というのがあったのでそれで鍛えるようにしました。

 

 

これで”やらない理由”を潰すことに成功しました。

 

ネガティブな面を潰したので次はポジティブな面を促そうと思いました。

 

体型維持だと目標がふんわりしていたので、なりたいマッチョ像を画像で検索しその体型に近づけるために何をするのかというように考えるようにしました。

そのほうがやっていて楽しくなりましたね笑。

 

また僕は朝シャワーを浴びるとその日1日が充実したものになることはわかっていたので目覚し時計を2つ購入。

 

枕元に1つ、お風呂場付近にもう1つ置きました。これで朝、鳴っているのを止めに起きそのついでにシャワーを浴びるという導線にしました。

 

これで今現在もしっかり続けられています。

 

筋トレしてて思ったこと

自重トレーニングをしていく中で「正しいフォームで行う」ことが一番重要というのがググっているとわかりました。

 

なので正しいフォームでやろうとするのですが

 

できない

 

できないというより、思った箇所を鍛えられていなさそうな感じがしていました。

 

腕立てやっても胸筋以上に腕がきつくなって続かないし、腹筋ローラーやっても腹筋以上に二の腕痛くなるし。

 

 

ただそれでも少しずつ続けていたら、1ヶ月くらいでちゃんと胸筋と腹筋が筋肉痛になりました笑。

 

基本姿勢・体勢でやるのにもある程度筋肉が必要だったんですねwww

 

これからも頑張ります。

 

 

終わり。