スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

SinatraでTwitterのOAuthを取得する

SinatraでさらっとTwitterのOAuth認証を書きたくなりました。
require 'sinatra/base'
require 'twitter_oauth'

class MyApp < Sinatra::Base
enable :sessions

def get_oauth_client
TwitterOAuth::Client.new(
consumer_key: 'your_consumer_key',
consumer_secret: 'your_consumer_secret'
)
end

get '/' do
client = get_oauth_client
request_token = client.request_token(oauth_callback: 'http://127.0.0.1:9292/callback')
session[:request_token] = request_token.token
session[:request_token_secret] = request_token.secret
redirect request_token.authorize_url
end

get '/callback' do
client = get_oauth_client
begin
access_token = client.authorize(
session[:request_token],
session[:request_token_secret],
oauth_verifier: params[:oauth_verifier]
)
user = client.verify_credentials
"hi #{user["screen_name"]}"
rescue Exception => e
e.message
end
end
end
スポンサーサイト

rubyのhttpclientでslackに投稿

Ruby2.4にしたらgemのslack-apiが古いjsonを参照してbundle installに失敗しました。
そこでhttpclientを使って投稿してみようと思います。
WebhookとAPIで実装してみました。

Webhook版
require 'httpclient'
require 'json'

client = HTTPClient.new

content = {
channel: '#general',
username: 'aoyagi',
text: 'hi'
}

url = "https://hooks.slack.com/services/xxxxxxxxx"

p client.post_content(url, payload: content.to_json)


API版
require 'httpclient'

client = HTTPClient.new

content = {
channel: '#general',
username: 'aoyagi',
text: 'hello',
token: "xxxxxxxxxxx"
}

url = "https://slack.com/api/chat.postMessage"

p client.post_content(url, content)

PostgreSQLとRubyを組み合わせてブラックリストチェックの速度を測ってみた。

とある文章がブラックリストに載っているかどうかを判定しようと思っています。ブラックリストが4000レコードもあって、単純に見つかるまで処理すると遅いだろうと思い色々な方法で試して速度を測ってみました。
それぞれ100回回しています。

1. SELECT id FROM dirty_words WHERE 'うんこ' ~* dirty_content
9秒

2. SELECT 'うんこ' ~* string_agg(dirty_content, '|') FROM dirty_words
4秒

3. SELECT string_agg(dirty_content, '|') FROM dirty_words
返ってきた値に対してRubyの正規表現チェック
1秒

4. SELECT dirty_content FROM dirty_words
返ってきた値に対して、Rubyで文字列結合してRubyの正規表現チェック
6秒

5. SELECT dirty_content FROM dirty_words
返ってきた値に対して、それぞれでRubyの正規表現チェック
8秒

ということで、PostgreSQL側で一行にまとめて、Rubyで正規表現チェックするのが早いことがわかりました。

Twitterのcreated_atをPostgreSQLのTIMESTAMP型に変換する

to_timestampではタイムゾーンの解釈ができないけど、Twitterは+0000でしかこないので決め打ちで変換します。
日本時間で管理したい場合は9時間足しておきます。

to_timestamp(
'Fri Feb 26 07:50:35 +0000 2016'
,'Dy Mon DD HH24:MI:SS +0000 YYYY'
)::TIMESTAMPTZ + interval'9 hour'

AnsibleでUbuntuに最新のjemallocをインストール

Ubuntuに最新のjemallocをインストールしたいのですが
なぜかppaにあるのはバージョン3系ばかりで最新の4系が無いんですよ。
なので、Ansibleでソースからインストールするroleを書いてみました。

tasks/main.yaml
- name: "test jemalloc"
command: bash -lc "ls -la {{ src_dir }}|grep {{ jemalloc_name }}"
register: jemalloc_installed
ignore_errors: yes

- name: "get file"
get_url:
url: "{{ jemalloc_url }}"
dest: "{{ src_dir }}"
mode: 0664
when: jemalloc_installed|failed

- name: "unarchive"
unarchive:
copy: no
src: "{{ jemalloc_archive }}"
dest: "{{ src_dir }}"
when: jemalloc_installed|failed

- name: "rm archive"
file:
path: "{{ jemalloc_archive }}"
state: absent
when: jemalloc_installed|failed

- name: "configure"
command: ./configure
args:
chdir: "{{ jemalloc_dir }}"
when: jemalloc_installed|failed

- name: "make"
command: make
args:
chdir: "{{ jemalloc_dir }}"
when: jemalloc_installed|failed

- name: "setting"
template:
src: ld.so.preload.j2
dest: /etc/ld.so.preload
mode: 0644
owner: root
group: root
when: jemalloc_installed|failed
become: yes


templates/ld.so.preload.j2
{{ jemalloc_library }}


vars/main.yaml
jemalloc_version: "4.0.4"
jemalloc_name: "jemalloc-{{ jemalloc_version }}"
jemalloc_url: "https://github.com/jemalloc/jemalloc/releases/download/{{ jemalloc_version }}/{{ jemalloc_name }}.tar.bz2"
jemalloc_dir: "{{ src_dir }}/{{ jemalloc_name }}"
jemalloc_archive: "{{ jemalloc_dir }}.tar.bz2"
jemalloc_library: "{{ jemalloc_dir }}/lib/libjemalloc.so"
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。