Sphereとともに

scalaとかplayframeworkとか。技術ブログにしたいなと。環境は Windows7x64, mac です。たまに声優さん情報が混ざります。最近ちょっとClojure触りました。

nightmare.js を使って Qiita の人気の投稿 の href一覧 を取得する

nightmare.js

github.com

一覧を取得する

サンプルをちょっと変えて

.evaluate(function () {
    return document.querySelector('#main .searchCenterMiddle li a').href
  })

querySelectorquerySelectorAll に変えてやればOKでしょとか思ったのになぜか return が null になって困った・・・

javascriptはあまり良くわからないし・・・

.evaluate(function () {
    return document.querySelectorAll('.popularItem_articleTitle_text').href
  })

ぐぐってみると以下の記事がヒットしたので少し書き直してみたらうまく行った

qiita.com

  .evaluate(function(){
      return Array.from(document.querySelectorAll(".popularItem_articleTitle_text"),  e => {return e.href;})
    })

コード

var Nightmare = require('nightmare');
var nightmare = Nightmare({ show: true })

var qiita_popular_item = 'http://qiita.com/popular-items';

nightmare
  .goto(qiita_popular_item)
  .evaluate(function(){
      return Array.from(document.querySelectorAll(".popularItem_articleTitle_text"),  e => {return e.href;})
    })
  .end()
  .then(function (result) {
    console.log('result', result)
  })
  .catch(function (error) {
    console.error('Search failed:', error);
  });

初めてのJavaScript 第3版 ―ES2015以降の最新ウェブ開発

初めてのJavaScript 第3版 ―ES2015以降の最新ウェブ開発

go言語でGETしたresponseをparseする

共通定義

import (
    "net/http"
    "encoding/json"
    "log"
)

func get(client *http.Client, url string, accessToken string, typedef interface{}) interface{} {

    req, _ := http.NewRequest("GET", url, nil)
    req.Header.Set("Authorization", accessToken)
    resp, _ := client.Do(req)
    error := json.NewDecoder(resp.Body).Decode(&typedef)
    if error != nil {
        log.Fatal(error)
    }

    return typedef
}

実際の処理

func fetchCategories(client *http.Client, accessToken string) {
    url := "https://cloud.feedly.com/v3/categories"
    var cat []Category
    get(client, url, accessToken, &cat)
    for i, m := range cat {
        fmt.Println(i, m)
    }
}

みんなのGo言語【現場で使える実践テクニック】

みんなのGo言語【現場で使える実践テクニック】

go言語のjsonのパースでちょっとハマったこと

jsonをパースしても [] になってしまう

type Category struct {
    id    string
        label string
}

func fetchCategories(client *http.Client, accessToken string) {
    url := "https://cloud.feedly.com/v3/categories"
    req, _ := http.NewRequest("GET", url, nil)
    req.Header.Set("Authorization", accessToken)
    resp, _ := client.Do(req)
    var cat []Category
    error := json.NewDecoder(resp.Body).Decode(&cat)

    if error != nil {
        log.Fatal(error)
    }

    fmt.Println("----------------")
    fmt.Println(cat)
}

原因は小文字

type Category struct {
    Id    string
        Label string
}

idをIdに、labelをLabelにしたらきちんと値が取れるようになった

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発

みんなのGo言語【現場で使える実践テクニック】

みんなのGo言語【現場で使える実践テクニック】

python でまずはtwitterにアクセスしてみる

ほぼ公式みればわかること

使用するライブラリ

pip install pyyaml
pip install tweepy

config.yaml

config.yamlにConsumer KeyとかAccessTokenとか用意する

動かすコード

# -*- coding: utf-8 -*-

import tweepy
import yaml

def readConfig():
    """Read config file"""
    with open('config.yaml') as reader:
        y = reader.read()
        r = yaml.load(y)
        return r

def initializeClient(consumerKey, consumerSecret, accessToken, accessTokenSecret):
    auth = tweepy.OAuthHandler(consumerKey, consumerSecret)
    auth.set_access_token(accessToken, accessTokenSecret)
    return tweepy.API(auth)

def main():
    config = readConfig()
    print(config)
    client = initializeClient(config["consumer_key"], config["consumer_secret"], config["access_token"], config["access_token_secret"])
    print(client.me())


if __name__ == '__main__':
    main()

入門 Python 3

入門 Python 3

python の開発環境を準備してみる

↓この辺の記事を参考に

qiita.com

qiita.com

qiita.com

~/.zshrc に

# for anaconda activate/deactivate cmd
alias activate="source $HOME/.pyenv/versions/anaconda3-4.1.1/bin/activate"
alias deactivate="source $HOME/.pyenv/versions/anaconda3-4.1.1/bin/deactivate"

を設定してちゃんと動くようになった

scala だったらbuild.sbtとかに libraryDependencies でライブラリ指定すればいいだけなのだけれど、pythonはちょっとなんかやり方が違うのね

難しい・・・

入門 Python 3

入門 Python 3

第2回DDD座談会に参加してきたメモ

第2回DDD座談会

19:00 - 22:10

ddd-zk.connpass.com

ハッシュタグ #dddzk

DDDを実践でやってる人が結構いる

最近のトピック

上坂さん @takashiuesaka

最近はマイクロサービス系の引き合いが多い 境界づけられたコンテキストの話が多い SchooでDDD入門について喋る

増田さん @masuda220

最初はオブジェクト指向の考え方をチームで一緒にするところから オブジェクト指向だけではだめで、分析設計が出来ないと・・・ きれいな答えを早い段階で手に入れたがるが、その必要はない 一番最初のものはだいたい間違っている フィードバックで整理してあとから見つけていく インクリメントな設計でやっていけば良い 経験値を高めることが必要

奥田さん @yoskhdia

株式会社Socket アーキテクト?マネージャ? 落ち葉拾い症候群

かとじゅんさん

最近はICONIX大好き 分析をすっ飛ばして戦略の話をしたがる人が多い DDDの面白いところは分析のところ ICONIXはDDDにかなり効果がでている(セプテーニさんで一緒にやっているらしい) 最近のトピックはコンコース

成功事例について

DDDの本のやり方とかくらいしかない モデルを深化させて作った事例があまりないように感じるのになぜ多くの人がDDDを議論しているのか ソフトウェアの複雑さはドメインにあるとみんな思っているからではないか うまく行ってる人たちってほんとにいるの? 本で言われていることはほんとに有効なのか

  • DDDで失敗してきた 顧客を巻き込めていなかった ビジネスパートナーとの連携を無視してしまった 政治的な文脈

戦術的なところで役に立ったことはあった(ヘキサゴナルアーキテクチャが威力を発揮したことはあったが、DDDのメインではない

DDDはカオスの辺縁(?聞き取れなかった)をもとめる作業 ユビキタス言語は目標 本人たちにも成功かどうかがわからないから成功事例が出てこないのではないか

@masuda220 成功事例が出てこないのは外から観察できないから 仕事が楽になる、楽しいようにするためにやっている やってよかったと思っている 話のシェアがみんなの財産になる 常に失敗だと思っている

@上坂さん ドメインに注力しているとお客さん的に外に出せない DDDをやろうとしている人たちはストイックで、ずっと追い求め続けてしまっている → 終われない

昔ながらのオブジェクト指向にくらべてDDDがいいのは戦略面的に優れている 経営者からしたらコアドメインは「金のなる木」 エンジニアサイドとビジネスサイドがユビキタス言語で一緒に考えられるのがいいところ

ドメインとビジネスが紐付いてこない サポートが必要

ICONIXとDDDは補完関係

性能がKPIにインパクトに与えるのであればDDDは必要ない

非機能要件もドメインと言えるのではないか @羽生田さん

WEB業界は比較的エンジニアサイドとビジネスサイドはユビキタス言語に近いもので喋れている

DDDの人はドメインによりすぎているイメージがある

シュレイヤメラン?

エヴァンスのこだわるドメイン 一般論としてのドメインを言いたいのではない ビジネスの人がテクニカルなことを言って良い 非機能要件なこともドメインに含めてもよい エンジニアだけでなくビジネスをやってる人間も含めて、開発においてどのくらいの時間、コストを掛けてやるのかを議論する ↑たしかに!

エヴァンスは実際に自分が経験したことのみを書いているだけ

問題領域をエンジニア、ビジネスサイドで議論することを追い求めている 問題領域はテクニカルなところではない

ドメインと境界づけられたコンテキストの違いって? ドメイン: 問題領域全体 境界づけられたコンテキスト: 解決すべき問題領域

— 豆蔵宣伝 —

InfoQは豆蔵が運営してる InfoQ Japan翻訳者募集中

— 豆蔵宣伝 —

セプテーニ 下村さん ツイート禁止

ユースケース駆動開発でドメインモデル(ユビキタス言語)を抽出(蒸留)

ユースケースを書いてみるとドメインモデル上にない言葉が出て来る

ユーザー、グループがメインだ!というふうに言っていても、ユースケースを声に出して見ると実はパーミッションが・・・とか出て来る

エンジニアの日本語力・・・

集約の話

ドメイン駆動設計のサンプルを見るのがよい エヴァンスはDBのトランザクションの話はしていない ロジックの置き場所としての集約の設計とDBのトランザクションの集約は別物として考えなければならない どこまでのロジックの置き場所かがドメイン駆動設計における集約

Write/Readの集約(ドメインモデル)は別物 @masuda220 集約単位でモデルが存在 Request Modelは集約にニアリーイコール Response Modelはそうではない可能性もある

応募者と求人企業 仕事という概念はそれぞれ違うものがある 求職者ドメイン企業側ドメインと分けてみたこともある @masuda220 アクターの捉え方によって概念は違う

関数型言語でもモデル駆動設計は実践可能か

言語によるものではない やりやすさやりにくさはあるとは思う 関数型は実社会で使うにおいて成熟しきっていない

純粋関数型だと・・・ ↑型クラスを自分で実装すれば良いのでは? @かとじゅんさん

オブジェクト指向は国語 関数型は数学

国語と数学を分けるのは何か? 国語は人によって捉え方が異なる 数学は一次曲線のように数式になっていたら誤解がない

エリックがQCON(2011年で来日した時に話を聞いたら、clojureを利用していた DDDが出来るかどうかはわからないと言っていた

どの言語を使うかはチームの話 Javaを使いたいチームであればScalaを選ぶ必要はない

プログラム勉強するならJavaよりHaskellがよさそう

Scalaはマルチパラダイムでいろいろな書き方が出来てしまうので難しい だれかがルールブックになって制御しないといけない

メソッドにユビキタス言語を用いる

オブジェクト指向はT(クラス)に従属 関数型はF(メソッド)に従属

年齢計算とかのFより、年齢とか誕生日のTが先に見つかる

大多数はFが先に見つかるのかも マクドナルドでバイトするという大きなF Fはマニュアル

要求の捉え方

T従属の発想は現実に近い

正しいTとFは見つからない リファクタリングをするときにTのほうが楽だ @masuda220

エリック・エヴァンスのドメイン駆動設計

エリック・エヴァンスのドメイン駆動設計

実践ドメイン駆動設計

実践ドメイン駆動設計

ユースケース駆動開発実践ガイド

ユースケース駆動開発実践ガイド

JJUG CCC 2016 Fall で発表をしたという記録

発表しました

2016年12月3日(土)に開かれたJJUG CCC 2016 で発表をさせていただきました

f:id:FScoward:20161204144058p:plain

↓資料はこちら

www.slideshare.net

当日は会場にいっぱい人が入っていて、焦りました。

席も少し増やしていただけたようで大変恐縮です。

内容について

資料を作っていくうちにどこを対象として作成すべきなのかがわからず、結果的にDDDをあまり知らない人向けの内容になってしまい、既存プロジェクトにどう適用していくのかというところが薄くなってしまったのは反省です。 (というかまだどうあるべきかは勉強中で悩んでいるところなので、そこを発表する自信がなかった・・・)

↓に参加していろいろと情報を仕入れようと思っています。

ddd-zk.connpass.com

また、このようにまとめていただけたこと非常に嬉しく思っています。

補足

発表自体は完全にDDDを取り入れているかのように思われたかも知れませんが、まだ全然です。(コードの一割にも満たないくらい)

なので、ぜひ一緒にDDDを進めてくれる方を個人的には求めています。

途中の発言でSIerディスるような発言があったと捉えられた方がいるかもしれませんが、僕は前職のSIerでいろいろと学びましたし、一緒に働いていた方々の大半は素晴らしい人達ばかりだったと思っていますので別にディスったつもりはありませんので、ご承知おきを。(そのへんはわかっていただけているとは思っていますが念のため) ディスるとしたら残業時間と組織のあり方というか仕事の進め方、技術に興味のない方々なので、皆様方に於かれましては別にディスられたと感じる必要はないです。

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

実践ドメイン駆動設計 (Object Oriented SELECTION)

実践ドメイン駆動設計 (Object Oriented SELECTION)