ためすう

Ruby で casecmp を使ってみる

2019-09-02

やったこと

Ruby で casecmp を使ってみます。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

調査

$ irb
...
irb(main):007:0> words = ['abc', 'Abc', 'ABC', 'aaa']
=> ["abc", "Abc", "ABC", "aaa"]
irb(main):008:0> words.each do |r|
irb(main):009:1*   p r.casecmp('abc')
irb(main):010:1>   p 'abc'.casecmp(r)
irb(main):011:1>   p 'end!!!'
irb(main):012:1> end
0
0
"end!!!"
0
0
"end!!!"
0
0
"end!!!"
-1
1
"end!!!"
=> ["abc", "Abc", "ABC", "aaa"]

参考

OpenAPI Generator を使ってみる

2019-08-27

やったこと

OpenAPI Generator を使ってみます

スタブサーバーを作成する

$ GENERATOR=spring
$ docker run --rm -v ${PWD}:/local \
  openapitools/openapi-generator-cli generate \
  -i /local/openapi.yaml \
  -g ${GENERATOR} \
  -o /local/out/${GENERATOR} \
  --additional-properties returnSuccessCode=true
$ docker run --rm -v ${PWD}:/usr/src/mymaven \
  -w /usr/src/mymaven maven mvn package
$ docker run --rm -p 3000:3000 \
  -v ${PWD}:/usr/src/myapp -w /usr/src/myapp \
  java java -jar target/openapi-spring-1.0.0.jar

http://localhost:3000/posts にアクセスして、モックのデータを取得することができました。

その他

  • python-flask
  • ruby-on-rails

flask や rails もあったのですが、都度実装が必要そうでした。

参考

  • WEB+DB vol.108

Swagger UI を使ってみる

2019-08-26

やったこと

Swagger UI を使ってみます

調査

Swagger UI を表示する環境を準備

$ docker pull swaggerapi/swagger-ui
$ docker run -p 80:8080 swaggerapi/swagger-ui

http://localhost:8080/ で Swagger UI が利用できるようになります。

Swagger UI から Web API サーバーへアクセスできるようにする

Gemfile

gem 'rack-cors', :group => :development
$ bundle install

config/initializers/cors.rb

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'
    resource '*', headers: :any, methods: [:get, :post, :options]
  end
end

openapi.yml はこの記事で書いたものを利用します。

※ public ディレクトリに配置しました。

http://localhost:3000/openapi.yml で Exploreすると利用できます。

課題

実運用するときには、外から見えない位置に openapi.yml を配置する必要があると思いました。

参考

Swagger Editor を使ってみる

2019-08-25

やったこと

Swagger Editor を使ってみます

調査

Swagger Editor を github から clone する

$ git clone https://github.com/swagger-api/swagger-editor.git

ローカルで Swagger Editor を起動する

$ open swagger-editor/index.html

Swagger Editor を書いてみる

例は下記です。

# swaggerのバージョン定義
openapi: "3.0.2"
info:
  title: "タスク情報API"
  version: "1.0.0"
  description: "desc...."
servers:
  - url: http://localhost:3000
    description: Local server
paths:
  /tasks/show:
    get:
      description: タスク詳細を取得する
      operationId: getTask
      parameters:
        - $ref: '#/components/parameters/taskIdParam'
      responses:
        '200':
          $ref: '#/components/responses/Task'
components:
  schemas:
    Task:
      type: object
      properties:
        task:
          $ref: '#/components/schemas/TaskProperties'
    TaskProperties:
      type: object
      properties:
        id:
          type: integer
          example: 1
        name:
          type: string
          example: 'タスク1'
  parameters:
    taskIdParam:
      name: taskId
      in: path
      description: タスクのID
      required: true
      schema:
        type: integer
  responses:
    Task:
      description: タスクレスポンス
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Task'

イメージ

Swagger Editor

参考

Rails で autodoc を使ってみる

2019-08-25

やったこと

Rails で API ドキュメントを生成する autodoc を使ってみます。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

調査

Gemfile

group :development, :test do
  # ... something
  gem 'autodoc'
end
$ bundle install

app/controllers/tasks_controller.rb

class TasksController < ApplicationController
  def show
    point = Struct.new(:x, :y)
    tmp = point.new(111, 222)

    render :json => tmp.to_json
  end
end

rspec の実行 + APIのドキュメント生成

spec/requests/task_apis_spec.rb

require 'rails_helper'

RSpec.describe "TaskApis", type: :request do
  describe "GET /tasks/show" do
    it "works! (now write some real specs)", :autodoc do
      parameters = {id: 100, id2: 222}
      get '/tasks/show', params: parameters
      expect(response).to have_http_status(200)
    end
  end
end
$ AUTODOC=1 bundle exec rspec spec/requests/task_apis_spec.rb

出力結果

doc/task_apis.md に出力されます。

今回は、内容をキャプチャに記載します。

autodoc結果

参考

Python の zip 関数を使ってみる

2019-08-23

やったこと

Python の zip 関数を使ってみます。

確認環境

$ python
Python 3.6.2 |Anaconda custom (64-bit)| (default, Sep 21 2017, 18:29:43)
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

調査

>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> zip(x, y)
<zip object at 0x10ef954c8>
>>> for a, b in zip(x, y):
...   print(a, b)
...
1 4
2 5
3 6

参考

matplotlib.pyplot.barh を使って、棒グラフを表示する

2019-08-15

やったこと

matplotlib.pyplot.barh を使ってみます

確認環境

$ ipython --version
6.1.0
$ jupyter --version
4.3.0
$ python --version
Python 3.6.2 :: Anaconda custom (64-bit)
import matplotlib
matplotlib.__version__

出力結果

'2.0.2'

調査

import matplotlib.pyplot as plt
%matplotlib inline

y = [10, 20, 30]
x = [60, 50, 80]
plt.barh(y, x, height=5)

出力結果

<Container object of 3 artists>

matplotlib-bar.png

参考

matplotlib.pyplot.subplot を使ってみる

2019-08-15

やったこと

matplotlib.pyplot.subplot を使ってみます

確認環境

$ ipython --version
6.1.0
$ jupyter --version
4.3.0
$ python --version
Python 3.6.2 :: Anaconda custom (64-bit)
import matplotlib
matplotlib.__version__

出力結果

'2.0.2'

調査

import matplotlib.pyplot as plt
%matplotlib inline

plt.subplot(221)
plt.plot([1,2,3])


plt.subplot(223)
plt.plot([4, 5, 6])

plt.subplot(224)
plt.plot([100, 101, 6])

出力結果

subplot.png

参考

sklearn.ensemble.RandomForestClassifier を使ってみる

2019-08-14

やったこと

sklearn.ensemble.RandomForestClassifier を利用して、

RandomForest 学習させてみます。

確認環境

$ ipython --version
6.1.0
$ jupyter --version
4.3.0
$ python --version
Python 3.6.2 :: Anaconda custom (64-bit)
import sklearn
print(sklearn.__version__)

出力結果

0.21.2

調査

特徴のラベル

1) Alcohol
2) Malic acid
3) Ash
4) Alcalinity of ash
5) Magnesium
6) Total phenols
7) Flavanoids
8) Nonflavanoid phenols
9) Proanthocyanins
10)Color intensity
11)Hue
12)OD280/OD315 of diluted wines
13)Proline

RandoForest で学習してみる

import pandas as pd
df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data', header=None)

from sklearn.ensemble import RandomForestClassifier
X, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

forest = RandomForestClassifier(n_estimators=10000, random_state=0, n_jobs=-1)
forest.fit(X_train, y_train)

# 特徴の重要度を取得
importances = forest.feature_importances_

結果を表示する

indicies = np.argsort(importances)[::-1]
for f in range(X_train.shape[1]):
    print("%2d) label: %s importance: %f" % (f + 1, indicies[f], importances[indicies[f]]))

出力結果

 1) label: 9 importance: 0.182483
 2) label: 12 importance: 0.158610
 3) label: 6 importance: 0.150948
 4) label: 11 importance: 0.131987
 5) label: 0 importance: 0.106589
 6) label: 10 importance: 0.078243
 7) label: 5 importance: 0.060718
 8) label: 3 importance: 0.032033
 9) label: 1 importance: 0.025400
10) label: 8 importance: 0.022351
11) label: 4 importance: 0.022078
12) label: 7 importance: 0.014645
13) label: 2 importance: 0.013916

参考

sklearn.preprocessing.MinMaxScaler でデータを正規化する

2019-08-13

やったこと

sklearn.preprocessing.MinMaxScaler を使いデータを正規化します。

データを 0~1 の範囲にスケーリングし直します。

確認環境

$ ipython --version
6.1.0
$ jupyter --version
4.3.0
$ python --version
Python 3.6.2 :: Anaconda custom (64-bit)
import sklearn
print(sklearn.__version__)

出力結果

0.21.2

調査

def printout(data):
    print("平均X: ", data[:, 0].mean())
    print("平均Y: ", data[:, 1].mean())
    print("標準偏差X: ", data[:, 0].std())
    print("標準偏差Y: ", data[:, 1].std())
    print("MIN X: ", data[:, 0].min())
    print("MIN Y: ", data[:, 1].min())
    print("MAX X: ", data[:, 0].max())
    print("MAX Y: ", data[:, 1].max())

from sklearn.preprocessing import MinMaxScaler
np.random.seed(seed=1)
data = np.random.multivariate_normal( [5, 5],  [[5, 0],[0, 2]],  10 )
print("元データ")
print(data)
printout(data)

print("---")

scaler = MinMaxScaler()
print("正規化")
data_norm = scaler.fit_transform(data)
print(data_norm)
printout(data_norm)

出力結果

元データ
[[8.63214665 4.13484578]
 [3.81897206 3.48259322]
 [6.93511029 1.74513276]
 [8.90151771 3.92349088]
 [5.71339311 4.64733703]
 [8.26937274 2.08652107]
 [4.27905321 4.45686512]
 [7.53518554 3.44451885]
 [4.61443881 3.75852072]
 [5.09439281 5.82422518]]
平均X:  6.3793582926820225
平均Y:  3.7504050618892877
標準偏差X:  1.8118979237218
標準偏差Y:  1.128584883455787
MIN X:  3.8189720581437347
MIN Y:  1.7451327605454043
MAX X:  8.901517712729385
MAX Y:  5.82422517959429
---
正規化
[[0.94700076 0.58584429]
 [0.         0.4259429 ]
 [0.6131058  0.        ]
 [1.         0.5340301 ]
 [0.37273075 0.71148284]
 [0.87562434 0.08369222]
 [0.0905218  0.66478816]
 [0.73117169 0.41660887]
 [0.15650951 0.49358724]
 [0.25094133 1.        ]]
平均X:  0.5037605972566557
平均Y:  0.4915976632398656
標準偏差X:  0.35649417572610337
標準偏差Y:  0.2766754874651595
MIN X:  0.0
MIN Y:  0.0
MAX X:  1.0
MAX Y:  1.0

参考