旅好きの気ままなお話

旅のこと映画、統計、会計、プログラミングなど、気の向くままに語ります

coinexchangeのgem作りました

最近、仮想通貨にはまっているということでcoinexchangeのapiから簡単にデータを取得できるgem作りました。

github.com

ちなみにcoinexchangeは海外の取引所でapiはまだpublicなものしかなさそう。
なのでapiで取引はまだできません。 v2になったら作りなおそうかと思います。

https://www.coinexchange.io

中国でslackは使えるのか?

中国でのslack

最近、中国の雲南省に行ってきました。

会社からのslackでの連絡も見れるかどうかも確認したく、検証してみました。

中国のネット規制

まず、gmailfacebook、lineは使えません。
しかも心の拠り所のskypeまで規制対象になるそうです。
一体何のアプリを使えばいいんだ、、、

wechat使うのもなぁー。

とまぁ、中国行ったら色々困るわけです。

ネット検索も基本的に百度ですよ。 (自分はbing国際版を使っていました。bing素晴らしい!)

肝心のslack

じゃあslackってどうなの? という感じですが、 slackアプリ版は無事使えました! ブラウザ版は試していないのでわからないですが、どうにか日本とは連絡がとれます。
会社のプログラマもこれで安心できます。

安心するならVPN借りろって言う話なんですけどね。

※2017/11時点です

rspecでappディレクトリ以外のテスト(libとかただのscriptとか)

rspecでappディレクトリ以外をテストしたい時ってありませんか? 自分はあります。例えばバッチ処理とかのただのrubyスクリプト

普通のテスト

まず、普通のrspecのテストって下記のような構造で appとspecの位置関係は1対1のようになっています。

.
├── app
│   │
│   └── controllers
│       └── nantoka_controller.rb
│       
└── spec
    └── controllers
        └── nantoka_controller_spec.rb

そして、describeの後にクラス名を以下のように書くものだと思います。

nantoka_controller_spec.rb

require 'rails_helper'
describe NantokaController do
  it '#nantoka_methods' do
    expect(nantoka_methods).to eq "correct"
  end
end

nantoka_controller.rb

class NantokaController
  def nantoka_methods
    "correct"
  end
end
appディレクトリ以外のテスト

今回はプロジェクト配下にscriptディレクトリを作成しています。

.
├── app
│   │
│   └── controllers
│       └── application_controller.rb
│
├── script
│   └── process.rb
└── spec
    └── script
        └── process_spec.rb

実は簡単にテストができます。 require_relative使うだけです。 describeの後は文字列にしましょう。 まぁ、いったんスクリプトだと処理が呼ばれるのは仕方ないです。

process_spec.rb

require "rails_helper"
require_relative '../../script/process'

describe "stock_info_listing_update" do
  before do
    @job = Script::Process.new
  end
  it '#nantoka_process_methods' do
    expect(@job.nantoka_methods).to eq "correct"
  end
end

process.rb

module Script
  class Process
    def nantoka_methods
      "correct"
    end
  end
end

Script::Process.new.nantoka_methods

例えばですけどスクリプトじゃないbinとかlibのテストだとScript::Process.new.nantoka_methodsを呼び出さなくていいので普段通りテストできます。

bin/process.rb

module Script
  class Process
    def nantoka_methods
      "correct"
    end
  end
end

pythonでjwt使おうとしたらライブラリで詰まった件について(入れなおせばいいんだ!)

jwtって

そんな人は下記記事が参考になります。
今回はエラーの対処法のみです

qiita.com

ライブラリ似過ぎな件

①Pyjwt

github.com

②jwt

github.com

はい、こいつらの共存が悪影響を及ぼします。。。

名前空間でも影響しあってるのかな?
そこまで調べる気力はないので気になる人は自分で調べてください!

エラー内容

下記コマンド打つと"jwtは使えねーよ"(すいません、エラー内容消してしまいました。。。)
みたいな感じになりました.

sign = jwt.encode(auth_payload, api_secret, 'HS256')

解決法

まぁ、解決法は下記参考でなおりました!!(ちゃんとエラー内容書いてるよ)

stackoverflow.com

jwtもpyjwtもどっちも消して入れなおせよってことです

pip uninstall JWT  
pip uninstall PyJWT  
pip install PyJWT

goのフレームワーク ginの"gin-scaffold"を入れようとしたらエラーが出た。("hg": executable file not found in $PATH)

ginの"gin-scaffold"を入れようとしたらなんかエラーがでた。

$ go get github.com/dcu/gin-scaffold
package bitbucket.org/pkg/inflect: exec: "hg": executable file not found in $PATH
go: missing Mercurial command. See https://golang.org/s/gogetcmd

Mercurialというバージョン管理システムを入れないとダメみたい。(gitみたいなもの)

ちなみに"hg"はMercurialのコマンドです。

gitでリポジトリ入れる時"git clone リポジトリ"って打つ時の"git"の部分。

おそらくこれで入れれます。

なんかgit入れてなくてもエラー出るらしいですが、まぁ殆どの人はgit入れているので大丈夫でしょう。

pythonでapiからデータを取得する方法 (urllib3)

はてさて、pythonapiからデータするときみなさんはどんなライブラリを使いますでしょうか?

urllib? urllib2 urllib3?

ってライブラリ多いですね。
ちなみに、"urllib"は"https"でデータを取得できない場合もあります。

なので、個人的なオススメは"urllib3"です。

インストール
pip install urllib3

pypi.python.org

urlにつなぐ
import urllib3
r = http.request('GET','http://httpbin.org/get')

つながったか確認してみましょう

r.status

データの中身を見てみましょう

r.data
パラメータを追加

urlの後にfieldsオプションにこんな感じに書くだけです。
下記だと"http://httpbin.org/get?arg=value&arg2=value2"になります。

r = http.request('GET','http://httpbin.org/get',fields={'arg': 'value', 'arg2': 'value2'})

djangoでpandas使うのは簡単だった

pandas使ってデータ分析しているサイトがよくあって、 私も参考にしているのですが大体csv使ってませんか?

少ないデータだったらcsvで良いと思うんですけど、 apiスクレイピングデータ取るときってdbに突っ込みませんか?

djangoのormでデータをdbにつっこんで、そのまま分析するほうが効率的な気がします。 そもそも、csvからデータ抜くの整形の処理やタイトルつけたりめんどくさいです。

そんなときは、"django-pandas"で楽をしちゃいましょう。

https://github.com/chrisdev/django-pandas

インストール
pip install django-pandas

サンプルは自分で作っているビットコインの足(日足とか分足とか)みたいなものです。

model

モデルはこんな感じです

class BitcoinTicker(models.Model):
    bc_id = models.IntegerField('bc_id', unique =True)
    high = models.DecimalField('high', max_digits=25, decimal_places=10, blank=True, null=True)
    low = models.DecimalField('low', max_digits=25, decimal_places=10, blank=True, null=True)
    volume = models.DecimalField('volume', max_digits=25, decimal_places=10, blank=True, null=True)
    timestamp = models.DateTimeField('timestamp')
pandasデータフレームへの変換
from app.models import BitcoinTicker
from django_pandas.io import read_frame
bitcoin_ticker = BitcoinTicker.objects.all()
df_bitcoin_ticker = read_frame(bitcoin_ticker)

カラムhighのデータが有るか確かめてみましょう。

df_bitcoin_ticker.high

こんな感じで簡単にできます。

最近はデータ分析にdjangoベースでやったほうがだいぶ楽なんじゃと思ったりしています。