wafuの技術

技術習得の努力メモです。

Ruby TK にメニューの追加

リストビューだけでは不便なのでメニューも追加です。

メニュー画面
require 'tk'

menubar = TkMenu.new
Tk.root.configure(menu:menubar)
file = TkMenu.new(menubar, tearoff: false)
help = TkMenu.new(menubar, tearoff: false)
menubar.add_cascade(label: "ファイル", underline: 0, menu: file)
menubar.add_cascade(label: "ヘルプ", underline: 0, menu: help)

#ファイルメニューの設定
sel = TkVariable.new(0)
file.add_command(label: "実行", under: 0, command: proc { prostart })
file.add_separator
file.add_radiobutton(label: "選択1", variable: sel, value: 0)
file.add_radiobutton(label: "選択2", variable: sel, value: 1)
file.add_separator
file.add_command(label: "終了", under: 0, command: proc { exit })

Rubyでwhois アプリ

RubyWhoisアプリの画面

Rubywhoisアプリを作ってみました。
ソースはわかりやすいように短くしています。
10行ぐらいで作れました。
ocraでexe化も成功です。

#rubyでwhoisアプリ
require 'whois'
require 'tk'

#whois関数
def whois_proc(a)
	b = Whois::Client.new
	c = b.lookup(a.value)
	d = c.content
	return d
end
#テキストのフレームの作成
txt = TkText.new(width:150,height:50).pack
#ラベル
TkLabel.new(txt) { text ' ip ='; width 5; place 'x'=>10, 'y'=>20 }
#テキストの表示場所
txtbox = TkText.new(txt) {width 140; height 45;place 'x'=>10, 'y'=>90 }
#IP入力
svalue = TkEntry.new(txt) {width 20; place 'x'=>60, 'y'=>20 }
#検索ボタン
TkButton.new(txt) {text '検索'; width 5; place 'x'=>10, 'y'=>50 \
	;command proc {txtbox.insert('end',whois_proc(svalue))}}
Tk.mainloop

Ruby3でtk+ocraの成功

Ruby3でocraを使うとエラーが表示されるようになりました。

いろいろ実験して、実行ファイルが作れるようになりました。
もっと、良い方法があると思います。

■エラー内容
in `_invoke': can't invoke "font" command: application has been destroyed (RuntimeError)


■対応概要
1 ファイルを複写
2 ocraのコマンドを変更

■対応手順
1 ファイルを複写
  C:\Ruby31-x64\msys64\ucrt64\binフォルダからC:\Ruby31-x64\binフォルダにファイル2つを複写
   ・tcl86.dll
   ・tk86.dll

2 フォルダを複写
  C:\Ruby31-x64\msys64\ucrt64\libフォルダからC:\Ruby31-x64\libフォルダにフォルダ2つを複写
   ・tcl8.6
   ・tk8.6

3 コマンド引数
  ocra aa.rb --no-autoload c:\Ruby31-x64\lib\tcl8.6 c:\Ruby31-x64\lib\tk8.6

 毎回、コマンドを入力するのは大変なので、バッチファイルを作りました。
 ocra2.bat
ocra %1 --no-autoload c:\Ruby31-x64\lib\tcl8.6 c:\Ruby31-x64\lib\tk8.6

■さいごに
 なんだか、パスがないだけの気がします。

RubyでSQLITE3

RubyでSQLITE3

require 'sqlite3'

#データベースの作成
db = SQLite3::Database.new 'test.db'

#idとnameを持つusersテーブルを作成
sql = <<-SQL
	create table users(
		id integer primary key,
		name text
	);
SQL

#usersテーブルを作成
db.execute(sql)

#テーブルにレコードを書きこむ
db.execute('insert into users(name) values(?)','sample1')
db.execute('insert into users(name) values(?)','sample2')

#データを出力する
db.execute('select * from users') do |row|
	p row
end

RubyでWebページのスクレイピング(mechanize)

Rubyには、mechanizeというライブラリを使うと
スクレイピングが簡単にできそうです。

gem install mechanize

■基本 ホームページデータの取得

require 'mechanize'

sitedata = Mechanize.new
page = sitedata.get("https://www.example.com")
puts page.body

page.links
page.title
page.label
と設定することで便利に使うことができます。

■要素の探索
sitedata = Mechanize.new
page = sitedata.get("https://www.example.com")
elements = page.search('h1 a')
puts elements


ここから先は勉強中です。
わかりやすいサイトです。
【RubyでWebスクレイピング】Mechanizeを使ってスクレイピングをする方法【主要機能まとめ】 - shin>>media


■リンクを操作する方法

require 'mechanize'

sitedata = Mechanize.new
page = sitedata.get('https://www.example.com')
data = page.links  
data.each do |link|
	puts link.text
	puts link.href
end

■フォームの操作

require 'mechanize'
agent = Mechanize.new
page = agent.get('http://example.com/')
puts page.forms

id_form = page.form_with(id: 'id情報')
# page.form_with(class: 'class情報')

id_form.field_with(name: '要素情報').value = '入力値'
# id_form.field_with(id: 'id情報').value = '入力値'

result_form = agent.submit(id_form)

puts result_form.body

■ログインが必要なサイトへのアクセス

login_form = page.form_with(id: 'id情報')
login_form.field_with(name: 'id').value   = 'id'
login_form.field_with(name: 'pass').value = 'password'
after_login_page = agent.submit(login_form)

puts after_login_page.body

■クッキー情報の収集

login_form = page.form_with(id: 'id情報')
login_form.field_with(name: 'id').value   = 'id'
login_form.field_with(name: 'pass').value = 'password'
after_login_page = agent.submit(login_form)

cookies = agent.cookie_jar
hoge = cookies.map { |cookie| cookie }

Rubyでホームページの取得(1)

Rubyでホームページの取得方法は
open-uriを使う方法が簡単です。
他にはnet/httpを使うと、高度な設定が可能です。

例1 open-uri

require "open-uri"
open("https://www.example.com/" do |f|
    print f.read
end

例2 open-uri

require 'open-uri'
io = OpenURI.open_uri('http://www.example.com')
puts io.read

例3 net/http の例

require "net/http"
url = URI.parse("http://www.example.com')
res = Net::HTTP.get_response(url)
puts res.body

例4 net/http 応用

require "net/http"
uri = URI.parse('http://www.example.com/')
data = Net::HTTP.new(uri.host,uri.port)
data.use_ssl = true
res = data.get(uri.parh)
if res.code.to_i == 200
    puts res.body
else
    puts "#{res.code}:#{res.message}"
end

例5 net/http POSTの例

require "net/http"
Net::HTTP.start("www.example.com",80) do |http|
    response = http.post("/cgi-bin/test.cgi",""
       {Content-Type" => "application/x-www-form-urlencoded"})
end

Rubyでnokogiriの利用

Rubyでnokogiriの利用方法です。

Nokogiriは、Rubyでよく使われている構文解析ライブラリです。
注意としてUTF-8以外の場合は注意が必要

例1

require 'nokogiri'
require 'pp'
require 'open-uri'

url = 'https://www.aaaaa.com'

htdata = Nokogiri::HTML(URI.open(url))
data = htdata.css("h3 a").each do |elem|
    pp elem[:href]
end

例2

require 'nokogiri'
require 'open-uri'
doc =Nokogiri.HTML(open('http://www.nokogiri.org/"))
doc.css('a'.each do |element|
    puts element[:href]
end

例3 ページに含まれるリンクを抽出

require 'open-uri'
requrie 'nokogiri'

doc = Nokogiri.HTML(URI.open("http://www.example.com/"))
#ページに含まれるリンクを抽出
doc.css('a').each do  |elem|
    puts elem[:href]
end

例4 h2のテキストを抽出する

require 'open-uri'
requrie 'nokogiri'

doc = Nokogiri.HTML(URI.open("http://www.example.com/"))
doc.xpath('//h2').each do |elem|
    puts.elem.text
end


|