ユウの小屋

PCの更新内容やSLPでの活動、開発したもの等をupしていきます

RubyプログラムからTLを見る

Rubyプログラムを実行し、自分のTwitterアカウントのTLを見れるようにしました。

作成したプログラムは、以下の通り。

require 'rubygems'
require 'twitter'

CONSUMER_KEY = " <控えておいた Consumer Key> "
CONSUMER_SECRET = " <控えておいた Consumer Key Secret> "
ACCESS_TOKEN_KEY = " <控えておいた Access Token> "
ACCESS_TOKEN_SECRET = " <控えておいた Access Token Secret> "

Twitter.configure do |config|
config.consumer_key = CONSUMER_KEY
config.consumer_secret = CONSUMER_SECRET
config.access_token = ACCESS_TOKEN_KEY
config.access_token_secret = ACCESS_TOKEN_SECRET
end

client.home_timeline.each do |tweet|
puts "\033[36;1m@#{tweet.user.screen_name}\033[0m"
puts "#{tweet.text}"
puts ""
end

これを実行すると、タイムラインから20個の最新ツイートを拾ってきて、表示しました。なお、ツイートを表示するだけでリツイートやお気に入り登録はできません。

ユーザ名は見やすいように色付けして表示するようにしました。

 

今回のプログラム作成にあたって、以下のページを参考にしました。


【ruby】twitterのTLを読み込む。【初心者】 | mokabuu.com

RubyプログラムからTwitterに呟く

Rubyで簡単なTwitterアプリを作成し、呟くところまでやりました。

手順は以下の通り

① Gem で 'twitter' をインストール

② アプリをTwitterに登録

③ Consumer key や access token を取得

Ruby プログラムを作成して実行

 

◯ Gem で 'twitter' をインストール

まず、Gem で 'twitter' をインストールするために以下のコマンドを実行。

すると、UTF-8が何たらというエラーメッセージが。

<< gem install twitter
ERROR: While executing gem ... (ArgumentError)
invalid byte sequence in UTF-8

ググってみると、Gem や Ruby に関する問題のようなので、まず rbenv を調べてみることにした。

ところが、rbenv のバージョンを調べようとしても、コマンドが not found で弾かれる。 どうやら、bash から zsh に乗り換えた際に、必要な操作を忘れていた様子。

.zshrc に下記の2文を記述してから、一番のコマンドを実行する。

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

<< $SHELL --login

その後、もう一度 gem install すると、うまくいった。

 

◯ アプリを Twitter に登録

まず、http://dev.twitter.com/apps/new を開く。

そこで、アプリ名(via の部分に表示される)や概要を入力して、Create app を押す。

登録の詳細は、下記のサイトを参照した。

http://route477.net/w/RubyTwitterJa.html

 

◯ Consumer key や access token を取得

アプリ登録後、Keys and Access Token タブの Consumer key や Consumer secret を控える。

そして、Permissions タブから権限を Read, Write and Access direct messagesに変更して、種々の操作ができるように設定。

さらに、自分のTwitterアカウントに、作成するアプリがアクセスできるように、Access Token を作成する。Keys and Access Token タブに移動して作成後、Access Token や Access Token Secret を同じように控える。

 

◯ Ruby プログラムを作成

いよいよ、Twitter アプリの作成に移る。

サンプルコードをググって、下記のように記述。

require 'rubygems'
require 'twitter'

CONSUMER_KEY = " <控えておいた Consumer Key> "
CONSUMER_SECRET = " <控えておいた Consumer Key Secret> "
ACCESS_TOKEN_KEY = " <控えておいた Access Token> "
ACCESS_TOKEN_SECRET = " <控えておいた Access Token Secret> "

Twitter.configure do |config|
config.consumer_key = CONSUMER_KEY
config.consumer_secret = CONSUMER_SECRET
config.access_token = ACCESS_TOKEN_KEY
config.access_token_secret = ACCESS_TOKEN_SECRET
end

Twitter.update("rubytest")

ところが、とてつもない量のエラーを吐かれてしまった。

もう一度ググってみると、上記のコードはバージョンアップ以前の古い書き方であった。これに関しては、以下のページを参照した。


Ruby - Twitter Gem 不具合! - mk-mode BLOG

最新の書き方に直して以下のように記述、実行するとうまくツイートできた。


require 'rubygems'
require 'twitter'
require 'pp'

YOUR_CONSUMER_KEY = " <控えておいた Consumer Key> "
YOUR_CONSUMER_SECRET = " <控えておいた Consumer Secret Key> "
ACCESS_TOKEN_KEY = " <控えておいた Access Token> "
ACCESS_SECRET = " <控えておいた Access Token Secret> "

client = Twitter::REST::Client.new do |config|
config.consumer_key = YOUR_CONSUMER_KEY
config.consumer_secret = YOUR_CONSUMER_SECRET
config.access_token = ACCESS_TOKEN_KEY
config.access_token_secret = ACCESS_SECRET
end

client.update("kusonemi")

 

◯ 補足

作成したRubyプログラムを実行するたびに、以下の様な警告が出るので、対策をして出ないようにした(環境はWindows8)。

cygwin warning:
MS-DOS style path detected: C:/Users/takuya/Desktop/test.rb
Preferred POSIX equivalent is: /home/takuya/Desktop/test.rb
CYGWIN environment variable option "nodosfilewarning" turns off this warning.
Consult the user's guide for more details about POSIX paths:
http://cygwin.com/cygwin-ug-net/using.html#using-pathnames

まず、デスクトップ→設定→コントロールパネル→システムとセキュリティ→システム→システムの詳細設定 と移動。

次に、詳細設定タブの環境変数ボタンを押す。

ここで、環境変数 CYGWIN を追加、または編集し、tty nodosfilewarning と記述。

設定を保存して再度Rubyプログラムを実行すると、警告が出なくなった。

この作業は、以下のページを参考にして行った。


cygwin がMS-DOS形式のパスをWarningするので消した - それマグで!

SLP KBIT Advent Calendar 2014 -7日目-

はじめに

この記事は SLP KBIT Advent Calendar 2014 の7日目の記事です。
当ブログに書き忘れてた内容があったので、書くついでに記事にしました。
というわけで、「Clang」について語っていきます。

 

Clangとは

読み方は「クラン」。
一言で言うと、コンパイラフロントエンド。
コンパイルの下準備 … 字句解析・構文解析・意味解析を行う。
要は、ソースコードを解析して、ミスが無いかどうかチェックしてくれるもの。
Clang だけでコンパイルを行う訳ではなく、LLVM というものとセットで使う。
LLVM については、主旨から逸れるので省略。

導入方法も、環境によって違うので省略。
ちなみに自分は Cygwin に導入する際、apt-cyg で Clang を、wgetLLVM
入れました。

 

GCCとの違い

↑の文を見て、「別に GCC でいいじゃん」と思う人もいるだろう。
しかし、GCC と Clang の間には、明確な差がある。
これは見た方が早いので、ちょっとした実験を行って、結果を見ていただこう。

 

実験

下記のコードを GCC と Clang に扱わせる。
色々とおかしいところがあるので、それを検出させる。

#include <stdio.h>

int main(void) {

int a = 365;
char b[10] = {"クソネミ"}; // 配列のサイズが足りてない

printf("%s日%d\n", a, b); // %s と %d が逆

return 0 // ; が無い
}

まずは GCC。

f:id:Yuu-glassdog:20141206235434j:plain

 配列のサイズ不足についてはOK。

ただ、printfの型の違いについてはスルー。
そして、11行目を指して「セミコロンが無いよ」と言っているが、
実際にセミコロンを付けるべき場所は 10行目であり、分かりづらい。

 

次に、Clang。

f:id:Yuu-glassdog:20141206235524j:plain

おかしいところは全て検出されている。
さらに、波線で場所を分かりやすく示すだけでなく、どのように修正
すべきかまで示している。
セミコロンの付け忘れに関しても、キチンと10行目を指した上で、
エラーを吐いている。

両者を見比べてみると、Clangの方が分かりやすい。

 

結論

Clang、マジ便利。

 

Vimにneosnippetを導入

ローカルのVimにneosnippetを導入しました。

手順は以下の通り。

① .vimrcに下記の内容を記述

② :NeoBundleInstall

" スニペット補完
NeoBundle 'Shougo/neosnippet'
NeoBundle 'Shougo/neosnippet-snippets'

" Plugin key-mappings.
imap <C-k> <Plug>(neosnippet_expand_or_jump)
smap <C-k> <Plug>(neosnippet_expand_or_jump)
xmap <C-k> <Plug>(neosnippet_expand_target)

" SuperTab like snippets behavior.
imap <expr><TAB> neosnippet#expandable_or_jumpable() ?
\ "\<Plug>(neosnippet_expand_or_jump)"
\: pumvisible() ? "\<C-n>" : "\<TAB>"
smap <expr><TAB> neosnippet#expandable_or_jumpable() ?
\ "\<Plug>(neosnippet_expand_or_jump)"
\: "\<TAB>"

" For snippet_complete marker.
if has('conceal')
set conceallevel=2 concealcursor=i
endif

 

これで、導入は完了。

試しに test.c で main + C-k を入力すると、以下のように入力された。

int main(int argc, char const* argv[])
{

return 0;
}

 

これは個人的な書き方と違っているので、snippetファイルをいじることに。

~/.vim/bundle/neosnippet-snippets/neosnippetsのc.snipを開き、下記のように修正しました。

// before
# hard-tab is necessary; C indent doesn't support this.
snippet main
int main(int argc, char const* argv[])
{
${0:TARGET}
return 0;
}

----------------------------------------------------------------------------------
// after
# hard-tab is necessary; C indent doesn't support this.
snippet main
int main(int argc, char const* argv[]) {
${0:TARGET}
return 0;
}

あと、main(void)の文が無かったので、それも追加。

# hard-tab is necessary; C indent doesn't support this.
snippet mainv
int main(void) {
${0:TARGET}
return 0;
}

設定は以上で終わり。

あとは早く慣れて、スムーズにコーディングできるようにしたいです。

Z shellでpryが実行できない

Z shellに乗り換えて初めてpryコマンドを打つと、command not foundと言われ弾かれました。

 

解決策をググってみたところ、「pry _(バージョン名)_」の形でコマンドを打つといいらしい。

 

そこで、.zshrcに「alias='pry _0.10.1_'」を書き込んで、もう一度pryコマンド実行。

結果、pryが元通り使えるようになりました。

Rubyで素数判定 - ウィルソンの定理

以前Pythonで書いたコードは、計算にすごく時間がかかっていました。

8桁の素数判定が20分かかってもできないほど。

 

そこで、今回は計算方法を変えてRubyで実装しました。

以下が、そのコードです。

前回のコードでは、階乗を最後まで行ってから剰余計算を行っていましたが、

今回は乗算1回ごとに剰余計算を行うようにしました。

その結果、演算速度が著しく上昇しました。

このコードなら、8桁の素数も10秒ほどで判定できます。

 

# Input
print "number : "
num = gets.to_i
sum = 1


(1..num-1).each do |n|
sum *= n
sum %= num
end
sum += 1


# Output Result
if sum % num == 0
print "\nPrime number.\n"
else
print "\nComposite number.\n"
end

Z shellに乗り換え

今まで、Cygwinではbashを使ってたんですが、Z shellに乗り換えることにしました。

理由…補完機能がイマイチだから。

 

まず、apt-cygでzshをインストール。

$ apt-cyg install zsh

 

次に、.zshrcを記述。内容は、以下の通り。

export LANG=ja_JP.UTF-8
HISTFILE=$HOME/.zsh-history
HISTSIZE=100
SAVEHIST=100

# cdなしでディレクトリ名を直接指定して移動 & ls実行
setopt auto_cd
functionson chpwd() { ls -xACF --color=auto }

# beepを消す
setopt nolistbeep

# 大文字、小文字を区別せず補完
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

# 使わないキーの無効化
bindkey -r '^s' # Ctrl-s

# 予測変換
#autoload predict-on
#predict-on

#autoload -U compinit
#compinit

# alias -----------------------------------------------------------
alias gcc='gcc -o' #(出力ファイル名)(ソースファイル名)でコンパイル

alias rm='rm -i' # コマンド実行時に一度確認する
alias cp='cp -i' # 〃
alias mv='mv -i' # 〃

alias ll='ls -l' # ファイルの詳細も同時に表示
alias la='ls -A' # ドットファイルも表示
alias ls='ls -xCF --color=auto'
alias sl='ls -xCF --color=auto'

alias grep='grep --color' # 検索結果を色付きで表現

alias df='df -h' # 容量を適当な単位で表示
alias du='du -h' # 〃

alias open='cygstart' # ファイルやディレクトリを開く

alias ipconfig='ipconfig | nkf -w' # 文字化け防止
alias ifconfig='ifconfig | nkf -w' # 〃
alias getmac='getmac | nkf -w' # 〃

# prompt -----------------------------------------------------------

# 色有効
autoload -U colors
colors

## 色を使う
setopt prompt_subst

# 補完でカラー使用
autoload colors
zstyle ':completion:*' list-colors "${LS_COLORS}"

# 色を定義
local GREEN=$'%{\e[1;32m%}'
local RED=$'%{\e[1;31m%}'
local BLUE=$'%{\e[1;34m%}'
local DEFAULT=$'%{\e[1;m%}'

# 通常のプロンプト
PROMPT="
%F{green}[%n@%m]%#%f %F{cyan}[%~]%f
%F{yellow}<<%f "
# 右側のプロンプト。ここでカレントディレクトリを出す。
# RPROMPT="%F{cyan}[%~]%f"
# setopt transient_rprompt

 

最後に、zshをログインシェルにする。

$ vim /etc/passwd

bin/bash → bin/zsh に変更

 

導入時、こちらのページを参考にしました。


zshは至高の利便性?!Cygwinにzshをインストール&設定した導入方法まとめ | Futurismo