2017年9月28日木曜日

Ruby : 文字列のエンコード変換

■概要

Rubyにおける文字列のエンコード変換方法

■準備

特になし

■確認環境

実行端末:Windows 8.1
バージョン:ruby 2.4.2

■コード

str_utf8 = str.encode('utf-8', 'CP932')

■まとめ

文字列のエンコード変換には encode を使う。
str.encode(dst_encoding, src_encoding)
dst_encoding : 変換後のエンコード
src_encoding : 返還前のエンコード

ちなみに、WindowsのエンコードはShift_JISと言われているけれど実は違って、 CP932 というShift_JISを拡張したエンコード。なのでWindowsはShift_JISで定義されていない文字も扱うことができる。これ知らずに、昔ひどい目にあったことがある。

2017年9月27日水曜日

Ruby : Win32OLEを利用したExcelの操作

■概要

RubyのプログラムでExcelの以下の操作を試してみる。
Excelファイルの新規作成
Excelファイルを開く
Excelファイルのセルへの書き込み
Excelファイルのセルや範囲指定してのコピー&ペースト
Excelの行・列の削除

RubyでExcel操作を行うライブラリはいくつかあるようだが、ここではWin32OLEを利用する。

■Win32OLEについて

Windows上でのみ使用可能。
xls、xlsx、両方の形式に対応している。

■準備

特になし

■確認環境

実行端末:Windows 8.1
バージョン:ruby 2.4.2

■コード

Excelファイルの新規作成

require 'win32ole'

#Excel VBA定数のロード
module Excel; end

#Excelの初期化
excel = WIN32OLE.new('Excel.Application')
excel.visible = true #Excelの表示/非表示設定
excel.displayAlerts = true #アラートメッセージを表示/非表示設定
WIN32OLE.const_load(excel, Excel)

#Excelブックの新規作成
book = excel.workbooks.add

#保存
book.saveAs('C:\\workspace\\ruby\\work.xlsx')

#Excelを閉じる
book.close

excel.quit()

既存Excelファイルを開く

require 'win32ole'

#Excel VBA定数のロード
module Excel; end

#Excelの初期化
excel = WIN32OLE.new('Excel.Application')
excel.visible = true #Excelの表示/非表示設定
excel.displayAlerts = true #アラートメッセージを表示/非表示設定
WIN32OLE.const_load(excel, Excel)

#Excelブックを開く
book = excel.Workbooks.Open('C:\\workspace\\ruby\\work.xlsx')

#Excelを閉じる
book.close

excel.quit()

Excelのセルへ文字を書き込む

require 'win32ole'

#Excel VBA定数のロード
module Excel; end

#Excelの初期化
excel = WIN32OLE.new('Excel.Application')
excel.visible = true #Excelの表示/非表示設定
excel.displayAlerts = true #アラートメッセージを表示/非表示設定
WIN32OLE.const_load(excel, Excel)

#Excelブックを開く
book = excel.Workbooks.Open('C:\\workspace\\ruby\\work.xlsx')

#Excelの一番左端のシートを取得
sheet = book.worksheets(1)

#セルへ書き込み
sheet.rows[1].columns[1].value = 'abcdefg'

#開いたブックを上書き
book.save

#Excelを閉じる
book.close

excel.quit()

Excelのセルや範囲指定してコピー&ペースト

require 'win32ole'

#Excel VBA定数のロード
module Excel; end

#Excelの初期化
excel = WIN32OLE.new('Excel.Application')
excel.visible = true #Excelの表示/非表示設定
excel.displayAlerts = true #アラートメッセージを表示/非表示設定
WIN32OLE.const_load(excel, Excel)

#Excelブックを開く
book = excel.Workbooks.Open('C:\\workspace\\ruby\\work.xlsx')

#Excelの一番左端のシートを取得
sheet = book.worksheets(1)

#セルのコピー
sheet.rows[1].columns[1].copy

#ペースト
sheet.rows[2].columns[1].select
book.ActiveSheet.paste

#範囲指定でコピー
sheet.range('A1:A2').copy

#ペースト
sheet.rows[1].columns[2].select
book.ActiveSheet.paste

#開いたブックを上書き
book.save

#Excelを閉じる
book.close

excel.quit()

Excelの行・列の削除

require 'win32ole'

#Excel VBA定数のロード
module Excel; end

#Excelの初期化
excel = WIN32OLE.new('Excel.Application')
excel.visible = true #Excelの表示/非表示設定
excel.displayAlerts = true #アラートメッセージを表示/非表示設定
WIN32OLE.const_load(excel, Excel)

#Excelブックを開く
book = excel.Workbooks.Open('C:\\workspace\\ruby\\work.xlsx')

#Excelの一番左端のシートを取得
sheet = book.worksheets(1)

#行削除
sheet.Range('A1').EntireRow.Delete

#列削除
sheet.Range('A1').EntireColumn.Delete

#開いたブックを上書き
book.save

#Excelを閉じる
book.close

excel.quit()

■まとめ

Win32OLEを利用することでExcel操作がRubyから行える。
マクロ付きブックのxlsm形式は未確認だが、動作に問題はないと思う。

2017年9月25日月曜日

Ruby : 分数の計算

■概要

Rubyにおける分数の計算方法

■準備

特になし

■確認環境

実行端末:Windows 8.1
バージョン:ruby 2.4.2

■コード

#分数の加算( 1/2 + 1/3 )
puts Rational(1, 2) + Rational(1, 3)
#分数の減算( 7/6 - 2/3 )
puts Rational(7, 6) - Rational(2, 3)
#分数の乗算( 2/3 * 5/9 )
puts Rational(2, 3) * Rational(5, 9)
#分数の除算( 6/13 / 2/5 )
puts Rational(6, 13) / Rational(2, 5)

■実行結果

5/6
1/2
10/27
15/13

■まとめ

Rational(a, b)を使うことで簡単に分数の計算を行うことができる。
約分も自動でやってくれる。

2017年9月24日日曜日

Ruby:リテラル式展開

■概要

Rubyにおけるリテラル式展開について
リテラルとは 1 のような数値や 'Hello World!' のような文字列のようにRubyのプログラムの中に直接書き込むことのできる値のことを指す。Rubyではダブルクォーテーションで囲われた文字列のなかに、式の内容を埋め込むことができる。

■準備

特になし

■確認環境

実行端末:Windows 8.1
バージョン:ruby 2.4.2

■コード

str = 'Hello World!'
$str = 'Hello Ruby!'
@str = 'Hello'

#式展開
puts("#{str}")
puts('#{str}')
puts("#str")
puts('#str')

#$ではじまる変数の式展開
puts("#$str")
puts('#$str')

#@ではじまる変数の式展開
puts("#@str")
puts('#@str')

#式展開のなかではRubyの式をそのまま書くことができる
puts("#{str + ' ' + $str + ' ' + @str}")

■実行結果

Hello World!
#{str}
#str
#str
Hello Ruby!
#$str
Hello
#@str
Hello World! Hello Ruby! Hello

■まとめ

ダブルクォーテーションで囲われた文字列のなかに以下のような形式で記述すると式の内容を埋め込むことが出来ている。
#{式}
実行結果を見るとシングルクォーテーションでは式の内容が展開されていないことが分かる。また、変数が$または@ではじまるばあいは{}を省略することできる。
#$変数
#@変数

便利なのは式展開のなかではRubyの式をそのまま書くことができることだと思う。

2017年9月23日土曜日

Rubyでユーザーのキーボード入力を対話的に受け取る

■概要

ユーザーのキーボード入力を対話的に受け取って処理を行うスクリプトの作成

■準備

特になし

■確認環境

実行端末:Windows 8.1
バージョン:ruby 2.4.2

■コード

class InteractClass

    def initialize

        puts <<-EOT
----------------------------------------
表示させたい言葉の番号を入力してEnterを押してください
何もせずに終了する場合は 9 を入力してEnterを押してください
----------------------------------------
1. おはよう
2. こんにちは
3. こんばんは
4. foo
5. bar
6. Hello World!
----------------------------------------
        EOT

        interact

    end

    def interact

        case gets.chomp
            when '1'
                puts 'おはよう'
            when '2'
                puts 'こんにちは'
            when '3'
                puts 'こんばんは'
            when '4'
                puts 'foo'
            when '5'
                puts 'bar'
            when '6'
                puts 'Hello World!'
            when '9'
                exit 1
            else
                puts <<-EOT
----------------------------------------
【エラー】
1~6, 9 のいずれかを入力してください
----------------------------------------
                EOT
                ic = InteractClass.new()
        end
    end
end

ic = InteractClass.new()

■まとめ


gets.chompの部分でユーザーの入力を受け取っている。

2017年9月22日金曜日

RubyでSCPを利用

概要

RubyでSCPを利用してファイルのアップロード、ダウンロードを行う

準備

「RubyでSSH接続」を実施して動作することを確認する。
以下のコマンドを実行してSCPのライブラリを取得する。
gem install net-scp

確認環境

実行端末:Windows 8.1
バージョン:ruby 2.4.2

コード

アップロード

require 'net/ssh'
require 'net/scp'

Net::SSH.start('<IP Address>', '<User>', :password => '<Password>') do |ssh|
    #ファイルアップロード
    remort_path = '<Remort File Pass>'
    local_path = '<Local File Pass>'
    ssh.scp.upload! local_path, remort_path
end

ダウンロード

require 'net/ssh'
require 'net/scp'

Net::SSH.start('<IP Address>', '<User>', :password => '<Password>') do |ssh|
    #ファイルダウンロード
    remort_path = '<Remort File Pass>'
    local_path = '<Local File Pass>'
    ssh.scp.download! remort_path, local_path
end

まとめ

ssh.scp.upload、ssh.scp.downloadでscpのアップロード、ダウンロードの実行を行っている。ssh.exex!('<コマンド>')を利用してscpコマンドを発行することもできると思う(検証していない)が、それより手軽に実現できると思う。

2017年9月21日木曜日

RubyでSSH接続を試してみる

概要

Rubyで他の端末へSSH接続して、コマンド発行を行う。

準備

以下のコマンドをコマンドラインで実行してSSHのライブラリを取得する
gem install net-ssh

確認環境

実行端末:Windows 8.1
バージョン:ruby 2.4.2

コード

require 'net/ssh'

Net::SSH.start('<IP Address>', '<User>', :password => '<Password>') do |ssh|
    print(ssh.exec!('ls'))
end

説明

これだけでSSH接続ができる。コマンド実行も ssh.exex!('<コマンド>') だけで簡単に行える。