カテゴリー: Development

JQuery3覚書 初歩的なこと

歩道を歩いていて、前のヤツがタバコ吸うとこっちは受動喫煙になる。
もっとも、周りに気使う喫煙者は、路上や屋外で喫煙はしない。
路上や屋外で喫煙する奴は基本的にアホです。ハイ。ハッキリ断言します。
周りに人がいる、来るかもしれない場所での喫煙はやめましょう。ただの迷惑。

久しぶりの投稿の冒頭がこれかい!って感じですが、いつになったら分かるんでしょうねって思うので書いてみた。

で、JQuery。
今使っているのはバージョンは3.3.1。
色々データをこねくり回さなければいけないということで、ネットを検索しながらHTML/CSS/JSのファイルを作成。
今頃気づいたのだが、JavaScriptとJQueryは別モノ。
当たり前なのだが、JQueryで取得した要素に、JavScriptの標準メソッドを適用させようとするとエラーになる。

$('#table1').innerHTML 

これはダメ。左はJQuery、右はJavaScript標準。

$('#table1').html()

これはJQueryの記述方法で、OK。

document.getElementById('table1').innerHTML 

これはJavaScript標準の記述方法で、OK。

という話なのである。

Excel VBA覚書 クリップボード

クリップボードに文字列を貼り付けるときに、貼り付かないケースがあったので、
別の方法を調べてみた。

String型変数 buf の内容をクリップボードに設定するということで・・・
a) DataObjectを使う方法1

        Dim cb As Object
        Set cb = New DataObject
        cb.SetText buf
        cb.PutInClipboard

b) DataObjectを使う方法2

        With New MSForms.DataObject
            .SetText buf
            .PutInClipboard
        End With

c) TextBoxを使う方法

       With CreateObject("Forms.TextBox.1")
          .MultiLine = True
          .Text = buf
          .SelStart = 0
          .SelLength = .TextLength
          .Copy
        End With
        If cb.CanPaste Then cb.Paste

Access覚書 リンク貼替

結構間が開いてしまった。
1か月に1度ぐらいはせめて投稿しようと思いつつ。

テーブルやらクエリやらがAサーバのDBをみているのだが、Bサーバのテスト環境のDBをみるように変えたい
となったとき、結構大変である。
標準機能で変更できるのかどうか、やり方がわからん。

ということで、VBAでできないか探してみたら、やはり一括でどべっと変更できるやり方があった。

' テーブルとクエリのリンク先を変更
' 引数 :from_srv = 変更前(例:172.0.0.1)
'    :to_srv   = 変更後(例:196.128.1.10)
Sub ChangeLinks(from_srv As String, to_srv As String )

    Dim db As DAO.Database
    Dim tb As DAO.TableDef
    Dim qr As DAO.QueryDef
    
    Set db = CurrentDb
    On Error Resume Next
    For Each tb In db.TableDefs
        If tb.Connect <> "" Then
            tb.Connect = Replace(tb.Connect, from_srv , to_srv)     'サーバ変更
            tb.RefreshLink  ' テーブルはリフレッシュ
        End If
    Next
    For Each qr In db.QueryDefs
        If qr.Connect <> "" Then
            qr.Connect = Replace(qr.Connect, from_srv , to_srv)     'サーバ変更
        End If
    Next
End Sub

パスワードとかだと、
Replace(tb.Connect, “PWD=***”, “PWD=***”)
ってな感じで変換してやる。

ExcelVBA覚書 Transport関数をうまく使う

SQLを実行してきてデータを取得するまではよいのだが、その後シート上に出力するときに異様に時間がかかる場合がある。
で、端末個体の理由は置いといて、複数のワークブックを開けていた場合に起こるのであれば、対策は、

 処理中は必要なとき以外「自動計算」させない!

ということらしい。

With Application
    .ScreenUpdating = False
    .Calculation =xlCalculationManual
    .EnableEvents = False
End With

としておけば、
 画面を更新せず、
 再計算させず、
 イベント有効にしない
とできるわけである。
これで、余計なイベントも発生しないので良いのだが、再計算してほしいときにはCaluculateメソッドを発行しておかねばならない。

で、Application.Calculation = xlCalculationManualをせず、シート上にバサッと出力したいなぁ~などと思っていたら、

 WorksheetFunction.Transpose()

シート関数のTRANSPORT関数を使って、引数に出力したい配列を設定することで、ドバっとあっという間に出力できてしまうやり方を紹介しているページがあったので、ありがたやありがたやとやってみたところ、本当にあっさりとドバっと出力された。

参考URL:エクセルの神髄「マクロVBAの高速化・速度対策の具体的手順と検証」

入れる配列は(横、縦)の状態にして、Transport関数で縦横逆にして出力!ってなことになっている。
ありがたやありがたや!

SQLServer覚書 Export/Import

SQLServerはテーブル指定のバックアップができない?

ってなことで、エクスポートとインポートをお勉強。

1) Export

BCP {DBName}.{scheme}.{Table} out c:\table1.txt -c -S localhost -U {user} -P {pwd}
BCP "SELECT * FROM {DBName}.{scheme}.{Table} WHERE 1=1" queryout c:\table2.txt -c -S localhost -U {user} -P {pwd}

1つ目はテーブルそのまま。テーブル指定後は、「out」を指定して、エクスポート先ファイルを指定してExportする。
2つ目は条件句で範囲を指定してその分だけデータをとってくる方法。こっちは「queryout」でExportする。
いずれも、その後ろは接続先とユーザ名・パスワードを設定。

2) Import

BCP {DBName}.{scheme}.{Table} IN c:\table1.txt -c -S  localhost -U {user} -P {pwd}

インポート先を指定後、「IN」でインポート元ファイルを指定。
こちらもインポート先のDB接続情報を後ろに入れる。
挿入するので、主キーが重複しないようあらかじめ削除しておくこと。

モチの論、BCP.exeがないと動きまヘン。

SQLServer覚書 比較設定

SQLServerはそのDB設定によって、大文字小文字や半角全角を意識しないとのこと。
つまり、’A’ = ’a’ は True になるわけ。
現在の設定を確認したい場合は、以下のようなSELECT文を実行する。
({DBNAME}のところに対象DB名を入れる)

SELECT DATABASEPROPERTYEX('{DBNAME}', 'collation');

これはこれでいいんだが、で、意識したいときはどうすんの?って話で、

SELECT * 
FROM foo
WHERE x = 'X' COLLATE Japanese_CS_AS
AND   y = 'Y' COLLATE Japanese_BIN;

と、まぁこんな風に条件項目ごとに設定をしていくとのこと。

BINやCS、AS、KS等の違いは以下参照。
Windows 照合順序並べ替えスタイル

Struts2覚書 JSP上での変数定義

Struts2でjsp上に変数を定義したいなぁ・・・と思った。
普通はこんな使い方しないんだろうけど、同じ文言が何度も出てくるときに全部直すのは面倒だな、と思ったら、やはりどこかで指定してやるほうが楽だよね!と安易に考え調べた。

 <s:set var="変数名" value="初期値" />

これだ!前にもカウント変数として使ったことがある。
だけど、文字列を設定したことがないんだ。どうすればいい?

<s:set var="baseName" value="'あいうえお'" />

なるほど。ダブルクォーテーションの中にシングルクォーテーションで文字列を括ればよいのか!

ExcelVBA覚書 図形コピー

ワークシート上にある「SHP1」という名前の図形をコピーして、「SUB_SHP1」という名前を付け、B2セル内に配置するロジックを考えてみた。
コピー元の図形のDuplicateメソッドをつかって、新しい図形(コピー先:以下サンプルでは変数「shp」のこと)を作り、その新しい図形のプロパティをいじって、図形の位置とか、図形の名前、図形に紐づくマクロの設定などを行う。
サンプルでは、セルB2の下部中央に配置する方法。

Dim ws  As Worksheet
Dim shp As Shape

Set ws = Thisworkbook.Worksheets("Sheet1")
Set shp = ws.Shapes("SHP1").Duplicate
With shp
  .Top = ws.Range("B2").Top - .Height -5
  .Left = ws.Range("B2").Left + (ws.Range("B2").Width - .Width) / 2
  .Name = "SUB_SHP1"
  .Visible = msoTrue
  .OnAction = "RunXXX"
End With
Set shp = Nothing
Set ws = Nothing

図形のコピーに「Duplicate」を使うというのは初めて知った。duplicateの意味が「複写する」ってことらしい。

VMware覚書 仮想マシンWin2000 Proを作成する

Windows2000をVMWareに入れるときに困ったのは、
1) Windows10、VMware Workstation 12 Playerでやると入れられなかった。
2) Windows7、VMware Workstation 12 Playerでやると入ったが、
 Windows2000(SP4)だけではVMware Toolsが入らず修正プログラム「KB835732」が必要だった。

というこの2点。

1つ目は、当該の仮想マシンの設定で、プロセッサの優先モードを「Intel VT-x or AMD-V」か、「Intel VT-x/EPT or AMD-V/RVI」にする。

2つ目は、以下のアップデートファイルをインストールする。
Windows 2000 用セキュリティ問題の修正プログラム (KB835732)
http://www.catalog.update.microsoft.com/Search.aspx?q=KB835732

で、解決!

AccessVBA覚書 IsNumeric関数

数値(整数)チェックをしようと、

Function CheckNumber(v as Varient) As Boolean
  CheckNumber = True
  If Len(v)=0 Then Exit Function
  If IsNumeric(v) Then Exit Function
  CheckNumber = False
End Function

とか記載したら、vに「a」とか入れてもTrueで返ってきてしまった。

Function CheckNumber(v as Varient) As Boolean
  CheckNumber = True
  If Len(Cstr(v))=0 Then Exit Function
  If IsNumeric(Cstr(v)) Then 
    If InStr(Cstr(v),".")=0 Then Exit Function '小数じゃなかったら(簡易チェック)
  End If
  CheckNumber = False
End Function

みたいに、文字列に変えてからIsNumericしたらうまくいった。
関数の引数を文字列型にするってのも手だけど、簡易版なのでこれでいいかなと思った。

Windows SFTPサーバを立てる

開発テストのため、SFTPサーバが必要になったが、社内の環境にSFTPサーバはない。
外部のフリーサーバーがないか調べたが、めぼしいものはない。
freeFTPd.exeというフリーソフトを使えば簡単にできるらしい。

で、社内のWindows Serverにインストールして、サービス開始。
ポートNo.22にしてSFTPを起動し、ノートPCから接続してみた。

つながらへんがな・・・・・・

おかしいなぁ~、なんでかなぁ~、簡単やいうたがな・・・・・
とか思いつつ、ポート開放せなあかんのちゃうかなぁ・・・となんとなく感じながら、ファイアウォールの設定で、ポートNo.22を開放

再度ノートPCから接続。
いけたがな!!

ということで、疎通テストも無事完了。
めでたし、めでたし!

Excelマクロ覚書 フォームコントロール

Blogの外観をちょいと変えてみた。また変えるかも。

さて、Windows10でExcel2010とか2013とかを使うようになって、Windows7で作ったExcelマクロのActiveXコントロール(コンボボックス)がうまく表示されないようになった。

これは困った・・・

グループ化すれば治る・・・って、治んない。

困りましたな・・・

ってことで、もうフォームコントロールに変えることにした。
面倒だわ・・・
ActiveXコントロールだと、リストの情報はマクロ上で設定すればいいのだが、フォームコントロールはリストの情報をセルに持たせて、そのセルとリンクを貼る・・・という厄介な手順を踏まなければならない。

ということで、ActiveSheet上にあるフォームコントロール「DLIST」のリストにしたい情報が、同じシートのセル「A2~A10」にあるとすると、

With ActiveSheet.Shapes("DLIST").ControlFormat
    .ListFillRange = "A2:A10"
    .LinkedCell = "B2"
End With

参照リストセルが別のシート(仮に「Sheet2」とする)にある場合、ListFillRange の設定をちょっと変える必要がある。

    .ListFillRange = "Sheet2!A2:A10"

でも、コントロールのフォントサイズの変え方がわかんない・・・
もうヤダ。

SQLite覚書 テーブル一覧の取得

SQLiteでテーブルの一覧を取得する場合、コマンドの「.schema」を使う方法もあるが、面倒な時もあるので、以下のようにSELECT文を使う。

SELECT * FROM sqlite_master
WHERE type = 'table' 
ORDER BY name;

WHERE句の条件を外すと、オブジェクトの一覧になって、INDEXの情報なんかも取得できる。

さて、6月も中盤。
4月から3か月間かけて行う新人研修も終盤だが、どうも、今年はイマイチ。
新人がイマイチなのか、我々がイマイチなのか、どちらもダメなのか・・・

それはともかく、中学生や高校生が読めるような漢字を読めない人がいるのがまずウンザリ。
昨今、高等教育の無料化を声高に言う人がいるが、そもそも、初等・中等教育をしっかりしてほしい。
小学生でも読めそうな漢字も読めない大人って、社会に必要なのか?
初歩的な現代国語ぐらいちゃんと勉強させてほしいものだ。

Excelマクロ覚書 Shellとカレントディレクトリ

Shell関数を使って別のexeを起動。

できんかった・・・・・・

なので調べた。

どうやら、カレントディレクトリをexeのある場所に指定しないとダメな様子。
で、ChDir関数を使ってカレントディレクトリの変更!ってやってみたけど、うまくできなかったので、別の方法でカレントディレクトリを変える。

以下は、Workbookと同じフォルダにあるtest.exeを実行してみるサンプル。
起動できたら、Excelを最小化させる

    Dim p   As String
    Dim res As Integer
    
    On Error Resume Next
    p = ThisWorkbook.Path
    If Right(p, 1) <> "\" Then p = p & "\"
    With CreateObject("WScript.Shell")
        .CurrentDirectory = p    // カレントディレクトリを変える
    End With
    res = Shell("test.exe", vbNormalFocus)
    If res <> 0 Then Application.WindowState = xlMinimized

移設から数か月

@pagesからこっちのサーバに移設してから、3か月が経った。
未だに旧サーバも立ち上げっぱなしなのだが、こちらのサーバの投稿記事のリンク(とくに画像)が正しく貼れていなかったり、リンク切れだったりするのを順に直していこうと考えている。
WordPressは投稿するにはラクチンなのだが、いろいろカスタマイズするのが面倒だなぁと感じる。
5年前ぐらいだと、ちょうどPHPの仕事もしてたし、暇もあったし、やる気もあったから、面白半分でいじってたのだが、5年経つと人間こうも変わるものかというほど、あまりやる気が起きない。

まぁ、しばらくは記事の修正を行って、終わったらカスタマイズしてみるか・・・
(いつになることやら)

ExcelVBA覚書 Windowsログイン名の取得

Windowsのログインユーザアカウントをとってきたい!ってのを調べてロジックに組み込んだはいいが、このブログ上にメモしてなかった。

まぁWindowsにログインするときに入力するアカウントのことなんだけど、環境変数関係の情報を取得するときは、Environ関数を使う。

Environ(“USERNAME”)

と、こんな感じ。

引数にどんなものがあるか、どんな戻り値になるか、デバッグして調べてみるときは、こんな風に。

Debug.Print "OS:" & Environ("OS")
Debug.Print "デフォルトドライブ:" & Environ("HOMEDRIVE")
Debug.Print "デフォルトユーザパス(ドライブなし):" & Environ("HOMEPATH")
Debug.Print "tempフォルダパス:" & Environ("TEMP")
Debug.Print "ログインユーザID:" & Environ("USERNAME")
Debug.Print "systemフォルダパス:" & Environ("WINDIR")

Processing覚書 引数付き起動

Processing2.2.1で確認。

Processingで作成したexeを引数渡しで起動させる場合、というので調べてみたが、一番よさげなのは下記のURLの説明とサンプルだと思った。

uncertain world「Processingをコマンドラインから引数つきで実行する方法」

特に良いと感じたのは引数を「xxx=yyyy」という記載で渡すところ。

というのは、Processingで開発中のときにRUNするときと、Exportしてexe起動させるときでは、引数の数が違っている。
前者だと引数の最初に、「–sketch-path=XXXXX」が入っていて、後者だと入らない。
なので、引数の何番目を見て、ウンチャラカンチャラ・・・みたいなことはできない訳。

void setup() {
  for (String a : args) {
   String[] a2 = a.split("=");
   if (a2[0].trim().equals("para1")) {
    ・・・処理・・・  
   } else if (a2[0].trim().equals("para2")) {
    ・・・処理・・・  
   }
  }
}

と、こういう感じで、setupメソッド内に、引数取得処理を入れておく。

起動させるときは、

Prog.exe para1=1 para2=ABC

ってな感じでパラメータを渡してやればよい。

ExcelVBA覚書 Dictionaryループ

基本的にScripting.Dictionaryは、

Dim dic     As Object

Set dic = CreateObject("Scripting.Dictionary")
If Not dic.Exists(a) Then
  dic.Add a,b
End If

みたいに、Existsメソッドを利用することが多いのだが、
やはり1つずつ確認して処理を行うこともなくはない。

Dim i As Long
For i = 0 To dic.Count - 1 Step 1
    debug.print dic.Keys()(i) & "-" & dic.Item(i)
Next i

もしくは、

Dim v As Variant
For Each v In dic.Keys()
    debug.print CStr(v) & "-" & dic(v)
Next

で、いずれも、Keys()両括弧を付けるところがポイント。

色々サイトを見てみたのだが、この()が抜けていたり、ItemがItemsになっていたりして、混乱している記載が多く、ここまでたどり着くのに英語のサイトまで見に行ってしまった。

非常にやっかいだが、もともとこういう使い方するようなオブジェクトではないのだろうから、仕方ない。

ちなみに削除するときはRemoveを使う。(Deleteではない)

Dim v As Variant
For Each v In dic.Keys()
    dic.Remove v
Next

MySQL覚書 配列、縦→横、カンマ区切り

同じIDのTITLEデータをカンマ区切りでとってきたい!
とか思って漁っていたら、

MySQLでidだけをSELECTして、カンマ区切りにして出力する

という、ページが見つかった。
GROUP_CONCATという関数を使い、区切り文字をカンマに指定する方法である。

SELECT GROUP_CONCAT(title SEPARATOR ',') FROM t_sample WHERE id = 1;

PostgreSQLだと、ARRAY_TO_STRING

<参照>PostgreSQL覚書 配列