RSS

月別アーカイブ: 9月 2016

Ruby: コンソールで色付き文字をエスケープシーケンスを使って表示

次のサンプルは色付き文字列を表示するためのエスケープシーケンスを返すメソッドを持つ Color クラスを定義して、それを利用するサンプルです。

#
#  カラークラス
#
class Color
 Black = 0
 Red = 1
 Green = 2
 Yellow = 3
 Blue = 4
 Magenta = 5
 Cyan = 6
 White = 7

 #
 #  エスケープシーケンスを得る
 #   パラメータ fg : 前景色(Black..White)
 #   パラメータ bg : 背景色(Black..White)
 #   パラメータ fgint : 前景色をtrueなら明るく表示、falseなら暗く表示
 #   パラメータ bgint : 背景色をtrueなら明るく表示、falseなら暗く表示
 #   戻り値 : 色設定用エスケープシーケンス
 def self.getFgBg(fg, bg, fgint, bgint)
  ec = "\033["
  # background
  if bgint == true then
   ec += "1;"
  else
   ec += "0;"
  end
  ec += "4"
  ec += bg.to_s()
  ec += ";"
  # foreground
  if fgint == true then
   ec += "1;"
  else
   ec += "0;"
  end
  ec += "3"
  ec += fg.to_s()
  ec += "m"
  return ec
 end

 #
 # 前景色のエスケープシーケンスを得る。
 #   パラメータ fg : 前景色(Black..White)
 #   パラメータ fgint : 前景色をtrueなら明るく表示、falseなら暗く表示
 #   戻り値 : 色設定用エスケープシーケンス
 def self.getFg(fg, fgint)
  ec = "\033["
  if fgint == true then
   ec += "1;"
  else
   ec += "0;"
  end
  ec += "3"
  ec += fg.to_s()
  ec += "m"
  return ec
 end

 #
 # 背景色のエスケープシーケンスを得る。
 #   パラメータ bg : 背景色(Black..White)
 #   パラメータ bgint : 背景色をtrueなら明るく表示、falseなら暗く表示
 #   戻り値 : 色設定用エスケープシーケンス
 def self.getBg(bg, bgint)
  ec = "\033["
  if bgint == true then
   ec += "1;"
  else
   ec += "0;"
  end
  ec += "4"
  ec += bg.to_s()
  ec += "m"
  return ec
 end


#
#  属性をリセットする。
 def self.reset()
   return "\033[0m"
 end
end


# テスト
esc = Color::getFg(Color::Cyan, false)
puts esc + "テスト"
esc = Color::getBg(Color::Magenta, false)
puts esc + "テスト"
esc = Color::getFgBg(Color::Blue, Color::Green, true, false)
puts esc + "テスト"
esc = Color::reset
puts esc + "Done."

実行例 (Ubuntu 16.04LTS, Ruby 2.3.0, TeraTerm)

ruby_color_class

 
コメントする

投稿者: : 2016/09/18 投稿先 Ruby

 

Ruby: 複素数のテスト – Matrix, Vectorの複素数拡張

複素数で Matrix , Vector クラスを使う例

#!/usr/bin/ruby
# coding: utf-8
#   複素数のテスト(3) - Matrix, Vectorの複素数拡張
require "matrix"
require "complex"
require "cmath"

puts "複素数のテスト(3) - Matrix, Vectorの複素数拡張"
a = Vector[Complex(0.0, 1.0), Complex(1.0, 0.0)]
b = Vector[Complex(-1.0, 1.0), Complex(1.0, -1.0)]

p a.r
p a.inner_product(b)

th = 30.0 * Math::PI / 180.0
m = Matrix[[Complex(CMath.cos(th), -CMath.sin(th)), Complex(CMath.sin(th), 
           CMath.cos(th))], 
           [Complex(1.0, 0.0), Complex(0.0, 1.0)]]

c = m * b
p c

実行例 (Ubuntu 16.04LTS, ruby 2.3.1p112)

$ ./test_cmplx3.rb
複素数のテスト(3) - Matrix, Vectorの複素数拡張
1.4142135623730951
(2.0+0.0i)
Vector[(0.9999999999999998+1.7320508075688774i), (0.0+2.0i)]
$
 
コメントする

投稿者: : 2016/09/17 投稿先 Ruby

 

Ruby: 複素数のテスト – Math の複素数拡張

CMath モジュールの使用例

#!/usr/bin/ruby
# coding: utf-8
#   複素数のテスト(2) - Math の複素数拡張
require "cmath"

puts "複素数のテスト(2) - Mathの複素数拡張"

z = CMath.exp(Complex(0.0, 1.0))
p z

z = CMath.exp(Complex(1.0, 0.0))
p z

theta = 30.0 * Math::PI / 180.0
z = CMath.exp(Complex(CMath.cos(theta), CMath.sin(theta)))
p z

z = CMath.sqrt(Complex(1.0, 1.0))
p z

実行例 (Ubuntu16.04LTS, ruby 2.3.1p112)

$ ./test_cmplx2.rb
複素数のテスト(2) - Mathの複素数拡張
(0.5403023058681398+0.8414709848078965i)
(2.718281828459045+0.0i)
(2.0864022336812553+1.1398067350757155i)
(1.09868411346781+0.4550898605622274i)
$
 
コメントする

投稿者: : 2016/09/17 投稿先 Ruby

 

Ruby: 複素数 complex

Complex クラスのサンプル

#!/usr/bin/ruby
# coding: utf-8
#   複素数のテスト
require "complex"

puts "複素数のテスト"

z = Complex(-1.0, 2.0)
p z
p z.real
p z.imag


w = Complex(3.0, -2.0)
z2 = w + z
p z2
z2 = w - z
p z2
z2 = w * z
p z2
z2 = w / z
p z2
p z ** 2


p z.abs
p z.arg
p z.abs2

p z.conjugate
p z.polar

実行例 (Ubuntu 16.04LTS, ruby 2.3.1p112)

$ ./test_cmplx1.rb
複素数のテスト
(-1.0+2.0i)
-1.0
2.0
(2.0+0.0i)
(4.0-4.0i)
(1.0+8.0i)
(-1.4-0.7999999999999999i)
(-3.0-4.0i)
2.23606797749979
2.0344439357957027
5.0
(-1.0-2.0i)
[2.23606797749979, 2.0344439357957027]
$
 
コメントする

投稿者: : 2016/09/17 投稿先 Ruby

 

タグ:

Ruby: ログを取る。

ログを取る場合、 Logger クラスを使うことができる。

#!/usr/bin/ruby

require 'logger'

# 標準出力にログを出力する。
log = Logger.new(STDOUT)
log.level = Logger::WARN
log.info('log.info')
log.warn('log.warn')
log.debug('log.debug')
log.fatal('log.fatal')

# ファイルにログを出力する。
log = Logger.new('/tmp/test.log')
log.level = Logger::INFO
log.info('log.info')
log.warn('log.warn')
log.debug('log.debug')
log.fatal('log.fatal')

puts 'Done.'

実行例

$ ./Logger.rb
W, [2016-09-10T21:46:58.964085 #4327]  WARN -- : log.warn
F, [2016-09-10T21:46:58.964279 #4327] FATAL -- : log.fatal
Done.
$ cat /tmp/test.log
# Logfile created on 2016-09-10 21:46:02 +0900 by logger.rb/v1.2.7
I, [2016-09-10T21:46:58.964586 #4327]  INFO -- : log.info
W, [2016-09-10T21:46:58.964650 #4327]  WARN -- : log.warn
F, [2016-09-10T21:46:58.964672 #4327] FATAL -- : log.fatal
 
コメントする

投稿者: : 2016/09/10 投稿先 Ruby

 

タグ:

Ruby: コマンドライン引数の取得

下のサンプルはコマンドライン引数の個数と一覧を表示する。個数の取得時、ARGV と $* 両方を使っている。

#!/usr/bin/ruby

if ARGV.size() == 0 then
 # パラメータがない場合、使用法を表示する。
 print "Usage: Argv arg arg arg ...\n"
else
 # パラメータの個数を表示する。
 print ARGV.size().to_s() + "\n"
 # $* は ARRGV の Alias
 print $*.size().to_s() + "\n"
 # パラメータをすべて表示する。
 $*.each {|x| puts x }
end

実行例

$ ./Argv.rb 10 A BBN 32 669
5
5
10
A
BBN
32
669
 
コメントする

投稿者: : 2016/09/10 投稿先 Ruby

 

タグ:

PHP: PDO_MySQL のサンプル

apps.JURA_ZAKKI  というテーブルにデータを挿入してデータを表示する。apps.JURA_ZAKKI の構造は次の通り。

CREATE TABLE `apps`.`JURA_ZAKKI` 
   (`ID` INT NOT NULL AUTO_INCREMENT, 
	`TITLE` VARCHAR(100) NOT NULL, 
	`PATH` VARCHAR(500) NOT NULL, 
	`CATEGORY` VARCHAR(50), 
	`TAG` VARCHAR(50), 
	`ADDDATE` DATE, 
	`KIND` TINYINT DEFAULT 0,
	PRIMARY KEY(ID)
   ) DEFAULT CHARACTER SET UTF8;

INSERT 文でデータを挿入する例。

<?php
$sql = "INSERT INTO JURA_ZAKKI(`TITLE`,`PATH`,`CATEGORY`,`TAG`,`ADDDATE`,`KIND`) VALUES(" .
  "'make ビルドツールの使い方', " .
  "'https://makandat.wordpress.com/2016/08/31/make-%E3%83%93%E3%83%AB%E3%83%89%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/'," .
  " 'C', 'gcc', '2016-09-07', 0)";

$pdo = new PDO(
    'mysql:host=localhost;dbname=apps',
    'root',
    '??????',
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);

echo $sql . "\n";

if ($pdo->exec($sql) === 0) {
  echo "Error.\n";
  exit();
}

echo "Done. \n";
?>

apps.JURA_ZAKKI テーブルのデータをすべて取得して表示する。

<?php
$sql = "SELECT `ID`, `TITLE`, `CATEGORY`, `TAG`, `KIND` FROM JURA_ZAKKI";

$pdo = new PDO(
    'mysql:host=localhost;dbname=apps',
    'root',
    '??????',
    array(PDO::MYSQL_ATTR_INIT_COMMAND =>; "SET NAMES utf8")
);

echo $sql . "\n";

$q = $pdo->;query($sql);

$rows = $q->fetchAll();

foreach ($rows as $row) {
  printf("%d,%s,%s,%s,%d\n", $row['ID'], $row['TITLE'], $row['CATEGORY'], 
$row['TAG'], $row['KIND']);
}

echo "Done. \n";
?>

ステートメントを使ってデータを挿入するサンプル。

<?php
$sql = "INSERT INTO JURA_ZAKKI(`TITLE`, `PATH`, `CATEGORY`, `TAG`, `ADDDATE`, 
`KIND`) VALUES(?, ?, ?, ?, ?, ?)";

$pdo = new PDO(
    'mysql:host=localhost;dbname=apps',
    'root',
    '???????',
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);

echo $sql . "\n";

$stm = $pdo->prepare($sql);
$stm->execute(array('PHP: PDO_MySQL のサンプル', 
'https://makandat.wordpress.com/2016/09/07/php-pdo_mysql-%E3%81%A/',
 'PHP', 'MySQL', date("Y-m-d"), 0));

echo "Done. \n";
?>
 
コメントする

投稿者: : 2016/09/07 投稿先 MySQL, PHP

 

タグ: