Log.log(work)

いろんな作業メモ

オラクルにつないでデータを取得する

仕事で表題のスクリプトを作成することになったのでその時のメモ。

環境:
Windows8.1 (64bit) /
Anaconda (Python 3.6.4) / Oracle 11g

Oracleに接続

cx_Oracleを使うと良いらしい。ということでOracle Clientも併せてインストール

※Anadondaのpipが古い場合はバージョンアップしておく

cx_Oracleのインストール

python -m pip install cx_Oracle --upgrade

参考:
GitHub - oracle/python-cx_Oracle: Python interface to Oracle Database conforming to the Python DB API 2.0 specification.

Oracle Instanct Clientのインストール

Instant Client for Microsoft Windows (x64) 64-bit

Pythonから接続

import cx_Oracle
conn = cx_Oracle.connect(user='user', password='pass', dsn='localhost:port/xe')
cur = conn.cursor()

UnicodeDecodeError

接続先のOracle11gはshift-jis(JA16SJISTILDE)なのでPythonで扱えない文字が入っているとエラーになる。
解決方法が見つからない…

追記

UnicodeDecodeErrorはおまじないを唱えておけば大丈夫そう。

# -*- coding:utf-8 -*-

import cx_Oracle
import os

os.environ["NLS_LANG"] = "JAPANESE_JAPAN.JA16SJISTILDE" #おまじない

oracle10gアンインストール[Windows版]

開発機に入れたOracle10g。 実は11gでした、ということでアンインストールして入れ直ししたときのメモ。

Oracle10gのアンインストール

  • データベースの削除
    ふつうDBCAが入っているのでそれを使って削除します。
    今回は文字コードの変更の関係でコマンドでデータベースを作成していたので、
    コマンドで削除します(やり方が正しいかどうかは不明)

    まず、排他モードでマウントする必要があるため、サービスを停止する。

    set ORACLE_SID=XE
    sqlplus / as sysdba
    startup mount exclusive restrict;

    一応確認

    select * from v$instance;

    削除
    drop database;

  • データべースを削除したらOracle本体を削除
    →ソフトウェアのアンインストール

  • レジストリを削除
    参考 削除および再インストール

x*0.8の値を0.5単位で算出したい(Excel)

単体テストの工数から結合テストの工数を算出したいけど、
0.5ずつにしたいと思ったのでエクセルで探した時のメモ。

=IF(ISNUMBER(A1),CEILING(A1*0.8,0.5),A1)

一応文字かどうか判別し、数値の場合に係数0.8を掛けてみた。
CEILINGを使うと指定の値の倍数になるようにして切り上げてくれるということでうまくいきました。

RubyでSQLServerへつなぎたい2

前回失敗したRDBIじゃなくてtiny_tdsで行けるらしいので試してみた。

環境:Windows8.1 (64bit)
Ruby:2.4.4p296
Bundler:1.16.2
DB:SQL Server 2017

①接続準備

ruby

require 'tiny_tds'
require 'bundler/setup'

と書くとつながるらしいので、これが動くように必要なものをインストール&準備する。

gem install tiny_tds
gem install bundler
bundle init
bundle install --path vendor/bundle

SQLServerのポートの確認
デフォルトで動的になっているので1433固定にしておく。

◆スタート 
→ Microsoft SQL Server 2017
→ 構成ツール
→ SQL Server 構成マネージャー

sql Server Configuration Managerを開いたら、左のメニューの「SQL Server ネットワークの構成」を開き、
[インスタンス名] のプロトコルをクリック。
TCP/IP」をクリックして「IPアドレス」タブを選択し、一番下のIPALLを設定しておく。

③いざ接続

require 'tiny_tds'
require 'bundler/setup'

client = TinyTds::Client.new host: '[my_hostname]', port: 1433, database: '[db]', azure: false

results = client.execute 'SELECT * FROM my_table'

results.each do |row|
  puts row['columname']
end

で出力されたのでOK.

RubyでSQLServerへつなぎたい

つなぎたいのだが、ドライバーのインストールでエラーが発生してしまう。

環境:Windows8.1 (64bit)
Ruby:2.5.1 →2.4.4
インストーラー使用

まずドライバーが合ってる?、というところなのだが、これが一番よくわからない。
最初、調べてみたらRuby/DBIがヒットしたのでこれを使うのかと思ってinstallしたが、
そもそもこのRuby/DBIは1.8までしかサポートしていないということなので、
Ruby2.0以上の場合はRDBIをインストールする模様。
しかし、試しに入れてみるとドライバーのインストールでエラー。

gem install pg
gem install rdbi
gem install rdbi-driver-odbc   --ここでエラーが発生

エラーログを見ると、

C:/Ruby24-x64/include/ruby-2.4.0/ruby/ruby.h:2170:12: error: invalid operands to binary / (have 'int' and 'char *')

実行時エラーになっている。
なんで??

これをggってみても記事が見つからず、途方にくれたのでメモっておく。

参考:

GitHub - RDBI/rdbi-driver-odbc: ODBC driver for RDBI

Windows10でファイアウォールの特定のポートを開ける

Windows10での操作がいまだによくわかっていなかったのでメモ…

  1. コントロールパネルからファイアウォールを選択
  2. 左側のメニューから「詳細設定」をクリック
  3. 受信の規則を選択し、右の「新しい規則」をクリック
  4. ポートを開けたい場合は「ポート」を選択して次へ。次にポート番号を入力する
  5. 実施したい用途に合わせて選択するが、今回は「接続を許可する」を選択
  6. どのネットワークを使っているときに反映するかを選択
  7. 最後に名前を決めれば完了

VBAの備忘メモ(配列の宣言)

久しぶりにVBA

触ったら配列の宣言方法を忘れたのでメモ。

Variantってなかなか使わない言葉だったのですっかり忘れてました。

'数は要素数かと思いきやインデックスの最大数っぽい。1つ多いとEmpty値になる=空白?
Dim noUseCharacter(6) As Variant

ついでにワークシート名の文字チェックプロシージャー

Arrayを使うと要素数を最初に宣言しなくていいんだね。

探せばどこにでもありそうだけど。

Function chkSheetName(ByRef sheetName As String) As Boolean
    Dim noUseCharacter As Variant
    Dim str As Variant
    Const MaxNameSize As Integer = 31
    
    Dim errFlg As Boolean

    noUseCharacter = Array(":", "\", "/", "?", "*", "[", "]")  
    
    '桁数チェック
    If Len(sheetName) > MaxNameSize Then
        errFlg = True
    Else
        '使用できない文字チェック
        For Each str In noUseCharacter
            If InStr(sheetName, str) > 0 Then
                errFlg = True
                Exit For
            End If
        Next str
    End If
    
    chkSheetName = errFlg

End Function