Top > BLOG

 

BLOG

-( ..)φメモメモな日々-

徒然なるままに、不定期に綴る( ..)φメモメモ BLOG

どんな話題?

仕事内容に関すること、たまに休息 etc・・・

・win対応VBAをmac対応にもすべくapplescriptの勉強中なのでその格闘日誌

・VBA版→python版へのコンバージョン格闘日誌 不定期連載中

・webページからpythonを実行する・・・サーバー格闘日誌

・VBA備忘録 VBAのツール開発中は主にこれ

・COBOL、RPG格闘日誌 他

・コーヒーブレイク(雑談等)

不定期という割に仕事日はほぼ更新している気も、だいぶ縦長になってきたので4月からは1カ月単位でページを分けようかと考え中

※本内容は、筆者の環境における実体験内容を綴ったものです。

 

ページオーバーしたので 4/9(火)は以下へリンク

4/9(火)以降のblog

 


4/8(月)

AKY開発日記 #70 マクロでやってしまったかなあ

 

メジャーリーグが朝放送するような季節になり、どうにも少しずつ生活時間に乱れが生じはじめてます。朝早く起きると、当然ながら、日中は眠くなりやすい。そんなこんなで今週もはじまります。

 

VBAについての( ..)φメモメモ

 

' 新しいワークブックを保存

' "sheet1"と"sheet2"・・・をコピーして新しいワークブックにペースト

ThisWorkbook.Worksheets(Array("sheet1名前", "sheet2名前",・・・)).Copy

Set newWb = ActiveWorkbook  ' コピーによって作成された新しいワークブック

newWb.SaveAs filename:=uniqueFolderPass & saveName, _

 

             FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False

 

今のワークブックから複数のシートをコピーして別のブックを新規作成し、コピペするソース。

一枚のシートから複数のシートで適用できるので使いまわしできます。なお1枚のシートの場合、Array(はいらないです。

 

ここにも落とし穴がありました。

マクロでワークブックから別のワークブックへの作業は日常茶飯事です。先日、それが突然、使えなくなりました。

 

しかも恐ろしいことに、この過程でフリーズを起こしてしまい、挙句の果てにエクセルが強制再起動がかかってしまいます。オートメーションエラーならまだわかる(というかこのエラーも見たくはない)。

何度やっても同じ現象が起こってしまう。

 

筆者は、同時に恐ろしいことを覚え、これを繰り返しているとマクロツール自体が壊れてしまうんでないかと。急ぎ、これ以上の悪化を恐れ、ひたすらバックアップを取っておきました(;'∀')。ただ今更バックアップをとってもすでに問題が発生しているのだから後の祭りになりそう(;'∀')

 

結局、原因がわからずじまい。エラーが起こる箇所は、何とか上記のようなコピペの部分であること自体は特定ができました。この処理を行うサブルーチンを実行しないと、この現象は起こらない。

 

ChatGPTにたずねてみたが、適切な回答が得られず、さっぱりわからん(-_-;)

さて、本現象は金曜の帰宅直前に発生し、数時間格闘するも解決せず、週末休みを経て、週明けになったのだが、日を持ち越せば解決するんではと甘い考えをいだいているも、結局変わらず(;'∀')。そりゃそうですね。。。

マクロを入れてるツール本体自体壊れたんかなあ。

仕方ないので、一部、再作業となるが、少し前のバックアップを漁ることにします( ノД`)シクシク…

 


4/4(木)

AKY開発日記 #69

 

どーも季節の変わり目は体調を崩しやすいです。3月から4月だんだん暖かくなってくる、寒い日もなかには入ってくる、この気温の寒暖差が影響しているのかもしれない。おまけに目のかゆみ、鼻もずるずるっと花粉症も合併している気がする。

 

3日、4日は、仕事時間、空き時間を活用して、本格的にRPGの説明書とにらみあいになった。ひたすら読んで、メモするところはメモして、学習に励む。それらは明日以降の開発に活かしていくというものだ。

 

合間、ドキュメント読んでもわからないところは、chatGPTにたずねてみる。流石AIというか、回答がすぐ返ってくる。RPGについても知識を持ち合わせているようだ。AIにも時折質問をしつつ、学習をすすめてました。

これだけ便利なAIな反面、平等という制約があり、ずっとは使い続けられません。何十回か問答を繰り返していると、突如、そのメッセージは現れます。

長々とメッセージはでますが、ようは使いすぎですよ~と英語で。ロックがかかりクールダウンとなる。この辺がもう少し詳しくわかると、AIの活用範囲を決められそうなのだが、ネットをみても、結論はよくわからない。有料契約しているといえど、使いすぎはだめだということだ。

しかもクールダウンは、数時間とネットではみるのだが、どうもかなりクールダウンまで待たされる。

うーむ、便利すぎるがゆえに頼りすぎもよくないですね ( ..)φメモメモ


4/2(火)

AKY開発日記 #68 クラスダイアグラム事始め~2~

 

クラスダイアグラム、関数同士の呼出関係を視覚化するのに便利。

ToDo 色が基本、同色になってしまうこと。

 

・色付け方法がわかる。

色を変更したいクラスを設定した後に、style属性を入れる。

フローチャートで使えていた classDefはダメっぽい。入力はできるが、クラス枠と同じ扱いで枠が一個できてしまう。

 

```mermaid

classDiagram

%%データ設定

    class main["SU00415本体"] {

        +EXSR \INIT

        +EXSR \MAIN

    }

    class INIT {

        +BEGSR \INIT

    }

・・・

昨日のソースコードの後に一行追加してみた。

style main fill:#c1ffd7,stroke:green,stroke-width:2px; たぶんクラス情報設定後はどこでも良いと思う

```

 

ついでに矢印(線)にコメントを入れる方法もわかる。フローチャートと少し違うようだ。

main-->INIT:calls

コメントを入れたい内容を ルート設定の後に「 : 」を挟みコメントを入れる。

※クラスのフィールド名(ここではmain)は基本英数字がいいかもしれない。日本語はこまめにメモはとってなかったが、ところどころでフィールド名設定時に詰まるところがあった。なので昨日は SU00415本体としていたが、mainにした。

 

無事、任意の枠の色の変更ができましたっと。次のToDo。任意のソースコードからこれを自動で作成するということ。

たぶん、フローチャート図を自動で作るよりは使用する情報も少なそうなので、簡単な気はする(まだ脳内イメージですが)

 

公式なのかな?

https://mermaid.js.org/のサイトが大変役に立ちました。

 


4/1(月)

AKY開発日記 #67 クラスダイアグラム事始め~1~

 

4月になりました。やっと暖かくなってきたなー、眠くなりやすい季節になってきたなーっと。

 

クラスダイアグラム、関数同士の呼出関係を視覚化するのに便利。

せっかくだからmermaidのフローチャート以外にも色々と図ができるのだから、空き時間を活用して、まずクラスダイアグラムを本格的にやってみる。(前はごくごく簡単な内容を触った程度)

基本はフローチャート図の時とマークダウンの書き方は同じ。使うデータを設定する、設定したデータの道順を決める。それだけ。

 

```mermaid

classDiagram

%%データ設定

    class SU00415本体 {

        +EXSR \INIT

        +EXSR \MAIN

    }

    class INIT {

        +BEGSR \INIT

    }

    class MAIN {

        +BEGSR \MAIN

        +EXSR \CHK01

        +EXSR \NNPO

    }

%%ルート設定

SU00415本体-->INIT

SU00415本体-->MAIN

 

```

これで下のような図ができあがる。

データ設定がより多くなる、ルート設定がより多くなると複雑化した関連図も描けるようになるはずだ。

 

うーん 色が同色なのが気になりすぎる。枠によって色を変えるが Next ToDoかな。

 

図:マークダウン(mermaid)で描いた呼出関連図(RPGだからサブルーチンか)

 


3/28(木)

AKY開発日記 #66 ホームページのアイコン問題

 

家のちょっと人をだめにするビーズクッションがへたってきた感じがする。3か月前の購入当初と比べると大きさもこじんまりになってきた。そろそろビーズの替え時かしら。

 

いま、メインで展開している JIMDOのホームページは、JIMDO内でできること になってしまい、なかなか自由度が限られるところがある。

今年から、別にレンタルサーバを利用して、サブサイトを展開するようにしている。

サブサイトで展開した内容の一つが、フローチャート図作成体験版ページだ。

そして本日更新したのが、フローチャート図のサンプルを展示したページだ。レンタルサーバ側は自分の裁量次第で色々とできるので、マークダウン自体をページに使いたいなとも思ったので、このサブサイトを活用するようにした。

 

だが、問題となるのがある。

ホームページのアイコン問題です。

この稲妻マークのようなものです。これは、アイコンがないことを意味してます。アイコンがないと、ちょっと怪しいページな印象をもってしまいます(-_-;)

 

ファビコンに頼ることでどうやら解決。

ファビコン(favicon)とは、ブラウザのタブなどに表示されている小さなアイコン(16px × 16px)です。

アイコンの元となる画像を持ってきてファビコン作成サイトなどに頼り、ファビコンを作成、以下のような内容を<head>タグブロックの中に下記のように埋め込む(各パスの最後のファイル名がアイコン用の画像ファイル)

 

<link rel="shortcut icon" href= "- pass -/favicon.ico" type="image/x-icon">

<link rel="apple-touch-icon" href= "- pass -/apple-touch-icon-180x180.png" sizes="180x180"> 

<link rel="android-chrome-icon" href="- pass -/android-chrome-192x192.png" sizes="192x192">

 

これで下記のようにアイコンが出るようになる。アイコン画像をMTIロゴをそのまま持ってきているところもあり、サイズ縮小により、ややあれな感じもするが、アイコンの出し方はわかったので、いいアイコンがあれば、それを後日採用するということで、今はこれでよしとしましょ( ..)φメモメモ


3/27(水)

AKY開発日記 #65 VBA

 

窓から久々の日差しが見える。最近、曇りやら雨が多かった。

オフィスの周りは、ほんと、カラスがよく鳴いている。カラスについては色々言われているが、どうも鳴き声にいくつかパターンがあることを知ったのはつい最近で、そのパターンと意味を知ったあとは、なんとも興味深いものです(ネットをググると色々と情報が出てます)

此方の場合は、カラスが鳴き声を境に何匹か近くの建物に集まってきたり、離れてきたりするんで、たぶん 朝は集合?なわばり?の合図なんかをしているんだろうと思います。

 

今回の( ..)φメモメモ は 指定範囲の最初の空白セルに簡単に入力する方法

RangeとFor Eachを用いると割と簡単

 

Dim mysht As Range

Dim findRngString As String

Dim findRng As String

Dim item

Set mysht = Worksheets(1)

 

'指定範囲内から空きセルを見つけて、処理をする

' が先頭についた場合はコメント

 

with mysht

   findRngString = "AA" & 選択行 & ":" & "AH" & 選択行 ’例では行だが、選択範囲も可能

   Set findRng = .Range(findRngString) 'Range型の変数に範囲をセットする

   

   For Each item In findRng

      If item.Value <> "" Then     'ここで空白の確認をする

         ’print(item.Address)

         ’空白のセル に対する処理を書き込む 空白のセルにデータをいれるなら item.Value = 入力値

   'exit for(処理を終わったら抜けるならexit for 、抜けないなら続行処理

      End If

   Next

End With

 

うちが扱うエクセルのデータは、行も数千~数万以上とさることながら、列も横長のものが多く、Z列以降のAA列以降を扱うようなサイズに上るものは日常茶飯事だ。そんな中、例えば ある行のAA列~の指定列があるとする。その中には既にデータが入っている。例えばそのデータの後にデータをインプットするようなケースに便利。そんなケースのときのVBAのソースコードです。

 

( ..)φメモメモ


3/25(月)

AKY開発日記#64 マークダウンあれこれ

 

フロー図を表示させる方法として、マークダウンのマーメイドを使ってます。

昨年の夏ごろから空いた時間に勉強して、とりあえず、テキストベースからデータフローを描くフローチャート、関数などの相関図を描くクラスダイアグラムを用いるといったことはようやくできるようになりました。

 

そんな今、ソースを見ていて、どうも雑に見えるなあと思い、マークダウンに表示させる内容についての修正を敢行。

 

●今までの書き方は、マーメイドの場合、先頭の1,2が変数にあたる(ユニークにする)。[ などは図形の形。[]とすると四角になる。[]内の文字はデータ項目名(改行入れると2行以上の表示)-->は道順の矢印。-->は実線。-->の先が次のデータ項目となる。

s(演算 開始)-->

1["【パラメータ定義】

14:*ENTRY|PLIST|"]-->2["【パラメータ定義】

15: PARM  PRHTYY"]

2["【パラメータ定義】

15: PARM  PRHTYY"]-->3["【パラメータ定義】

16: PARM  PRKKKB"]

3["【パラメータ定義】

16: PARM  PRKKKB"]-->4["【キー定義】

19:K\IN|KLIST|"]

4["【キー定義】

19:K\IN|KLIST|"]-->5["【キー定義】

20:KFLD|INHTYY|"]

5["【キー定義】

20:KFLD|INHTYY|"]-->6["【キー定義】

21:KFLD|INKKKB|"]

 

データ項目と道順が一緒になってなんか読みづらい。

手書きで試して以下でも動いた

 

%%データ項目

s(演算 開始)-->

1["【パラメータ定義】

14:*ENTRY|PLIST|"]

2["【パラメータ定義】

15: PARM  PRHTYY"]

3["【パラメータ定義】

16: PARM  PRKKKB"]

4["【キー定義】

19:K\IN|KLIST|"]

5["【キー定義】

20:KFLD|INHTYY|"]

 

%%ルート設定

1-->2

2-->3

3-->4

 

4-->5

 

まず、使用するデータ項目を入れる。次にルート設定をする。これだと、データ項目とルート(道順)が別々になるので、データの流れの追いかけをテキストベースでもしやすくなる。あとはこの書き方を自動化ですればよい。

 

●マークダウンの「円マーク」対応

マークダウンは 円マークは、バックスラッシュになってしまう。

円マーク表示をさせる場合は、特殊対応が必要なようだ。

 

調べていくうちに以下にたどりつく。

筆者が対応しているマークダウンデータの場合、円マークに該当する文字列を「 &yen;」に置換する。

これでデータ項目表示名が バックスラッシュではなく、円マーク(\)マークになる。

 

macでも円マークには苦労したけど、ほんと、円マークは扱いが大変だわ ( ..)φメモメモ

 

 


3/22(金)

AKY開発日記#63 VBA

 

オブジェクトが必要です に沼ったパターン

 

目的

別のシートの指定範囲を 指定シートにコピペしたい

 

With ObjOpenBook.Worksheets(1) 'コピペ元シート

    sourceEndRow = .Cells(Rows.Count, 1).End(xlUp).Row    'シート内のデータ最終行を取得(A列データ)

    sourceRngString = "A" & 5 & ":" & "AB" & sourceEndRow 'シート内の対象範囲を指定

    Set sourceRng = .Range(sourceRngString)   'Range範囲を設定

End With

 

With ThisWorkbook.Worksheets(1) ’コピペ先シート(指定シート)

 

    targetRngString = "A" & 5 & ":" & "AB" & sourceEndRow 'シート内の対象範囲を指定

    Set targetRng = ThisWorkbook.Worksheets("実行経路様相").Range(targetRngString) 'Range範囲を指定

   

  '//前回のシートのデータを消す

    .Rows("5:" & .Cells.Rows.Count).Delete

       

    '//コピペ元内容をコピペ先へコピペ(値・書式なし)

    targetRng = sourceRng.Value

 

End With

 

targetRng = sourceRng.Value で オブジェクトが必要ですと出る

 

なんでだろう。。。

 

他のところの下記のソースではエラーは出ない

sourceRngString = "U" & 6 & ":" & "U" & jEndRow

Set sourceRng = jsht.Range(sourceRngString)

 

targetRngString = "Q" & 18 & ":" & "Q" & targetRow

Set targetRng = trgtsht.Range(targetRngString)

 

targetRng = sourceRng.Value

 

だいぶ悩まされ解決

 

'//前のシートデータを初期化

.Rows("5:" & .Cells.Rows.Count).Delete

 

の書いた位置がまずかったようだ。

 

    '//前のシートデータを初期化

    .Rows("5:" & .Cells.Rows.Count).Delete

 

    targetRngString = "A" & 5 & ":" & "AB" & sourceEndRow

    Set targetRng = ThisWorkbook.Worksheets("実行経路様相").Range(targetRngString)

    

シート削除操作を先に行ってから、範囲指定を行ったところ、エラーは出なくなった。

 

どうやら、範囲指定をした内容を変数に入れたので問題ないと思ったが、

そのあとに行を削除すると、設定した範囲が無効になってしまうケースがあるのかもしれない。

 

ChatGPTに尋ねるとあっさり同じ回答が返ってきた。AIに頼りすぎると考える力が鈍くなってくる懸念もあるのでなるべく自己解決しようとするも、時間が結構かかってしまった・・・

 

と沼ったケースです(;'∀')φメモメモ


3/21(木)

AKY開発日記#62 コーヒーブレイク

 

Blog書き込み中に、なんか揺れました、緊急速報も流れました、焦った(;'∀')

 

普段、あんまりテレビは見ませんが、昨日は、メジャー開幕戦を1回から9回までずっと観てました。時間として19時~22時過ぎまで、NHKだからCMなし。没入感はんぱないです。

3月も後半となり野球の季節が本格的になってきました。仕事後の楽しみがまた増えます(^^

 

さて、RPGツールの方はいったんはタスクが落ち着き、次のタスクのCOBOL版に入ります。

COBOL版は以前、既に対応しているが、今回、RPGのタスクで得た内容はCOBOL版に追加実装できるものが多く、COBOL版のツールにも本格的に反映させていくというものです。水曜が休みで今日は木曜日、何か今週は早いなと、とりま、週末に向け、ひとがんばりしまっす。


3/19(火)

AKY開発日記#61 VisualStudioCode活用メモ

 

マークダウンで書いたコードをフロー図にするには、まずマークダウンコードが正しく書かれている必要がある(これは自動ツール自体で対応済)

マークダウンに対応したエディタで出力機能を活用する必要がある。

VisualStudioCodeであればプレビュー表示が使える。

プレビュー表示した内容を画像などに出力して保存する。

マークダウンテキストから画像を保存するまでの過程に保存操作という1ステップが伴う。

 

そこで、知ったことを( ..)φメモメモ

 

準備:

VisualStudioCodeでマークダウンが見れる環境一式(フロー図の元データも含める)

+ Markdown PDF (VisualStudioCode のプラグインソフト)

 

Markdown PDFはPDFとあるが、HTML、画像形式(PNG、JPGなど)に出力保存が可能というものだ。

プラグインを入れた状態では、画像形式などの保存には、保存する操作という1ステップが伴う。

 

VisualStudioCodeの「設定」にてMarkdown PDFの設定に以下を追加することで、利便性が増す(ただし、以下の内容は状況により良し悪しがありますので、ご利用はご自身の判断で)

 

これは、ファイルを保存するときに、指定した形式のファイルを一緒に出力するというもの。指定した形式のファイルは、html、png、jpg、htmlなどの画像系を指し示す。

 

setting.jsonファイルを開いて下記を設定する(設定>ユーザー>右上の書類のようなアイコンをクリック)

※settingファイルはプログラムファイルです。入力ミスがあるとコンパイルエラーなど影響が出る可能性があるので注意が必要。settingファイルは事前に前の内容はコピーしておいた方がいいかもしれません。

 

-----ここから------

"markdown-pdf.convertOnSave": true, 

"markdown-pdf.type": [

  "html",

    "png"

 

],

-----ここまで------

 

convertOnSave で セーブ時の同時出力を制御します。Trueだと以下 typeのものを一緒に出力する

type で保存形式を指定する。筆者の場合、欲しいのは "html"形式と"png"形式。

 

これで VisualStudioCodeであれば、マークダウンファイルを開き、一回保存することで、画像形式等のファイルが出力されるようになる(ここは仕様依存となるので、マークダウンファイルと同じ階層にファイルが出力される)

下の画像の右半分の「i」はファイルを保存時にポップアップが出現する。png形式、html形式ファイルが出力されている。

保存時に、一緒になにかされるという=PC内でかさばる可能性がある。

が、不都合な場合はあれだけど、便利そう( ..)φメモメモ


3/18(月)

AKY開発日記#60 マークダウンについて

 

マークダウンは現在のタスクに於いて切っても切れない言語のひとつだ。

成果物をマークダウンでアウトプットする。

 

マークダウンの中でもmermaidは、描画に優れている(主観)と考える。

記述法に沿って入力するだけで、思い描いていた作図も表現してくれる。

 

ただできることには限りがあるのか、あとはそのできる範囲の組み合わせでどうにかする、

今日はそんな軌跡を( ..)φメモメモ

ひし形は、判断(条件分岐)を表してますが、なんというかでかい(-_-;)

明らかに他のデータ項目の形状と差が出てきます。

ひし形は、中に入る文字数で対角線が決まってくる。なもので、その対角線がから形づくるひし形は時には極端に大きくなってしまう。

 

方々からどうにかできないかと要望が入ってきます。

 

 

mermaidはネットで結構調べ、ChatGPTにもたずねてみたが、適切な回答が返ってこない。文字数を減らす、改行を挟むなりして対角線をできる限り短くするようにコントロールするような形を取らざるをえない。

最初の形態はこれであり、しばらく続くことになる

対応①subclassの見出し表示を用いる。

subgraphを別の目的でいじっているうちに思いつく。

23は データ項目の変数にあたる(表示が47 【条件文】

subgraph sg1["if (dr == System.Windows.Forms.DialogResult.OK)"]

23

end

 

ひし形の中に入れる文字は極力減らす。その代わり、ひし形をグループとするsubgraphの見出しを活用する。

これでひし形の大きさは一定になる。だが、枠が邪魔。条件文量が多くなると、それだけ枠が大きくなり目立ってしまう。subgraphは元々の使い方は、グループ分けなので、グループごとに枠ができるのは仕様上、仕方のないこと。本来の目的と違った使い方をしているのがこちらの方だ。

subgraphの属性を調べるも、これといった解決策が見つからない。

style属性のstroke属性を用いるも、反応なし。

数週間・・・この使い方が続くことになる・・・

この週末になんか思いついた。別の目的の勉強がてら画像と属性に関するあれこれを家で実験している夜だった。

 

style sg1 color:red,fill-opacity:0, stroke-opacity:0;

subgraph sg1["if (dr == System.Windows.Forms.DialogResult.OK)"]

23

 

end

 

 

fill-opacity:0, stroke-opacity:0で塗りつぶしとストロークの透明度を設定する。その結果がこれ。矢印と文字が一部重なるところだけはどうにもならないが、枠がなくなり、見栄えもよくなった。どうやらSVGの属性が使えるみたいなことがわかった。

と、かなり長い期間、未解決だった問題が思わぬところから解決した話。解決にぐんと近づき、なんかすっきりした週末でした。その勢いそのままで体験版のページも早速適用~とホームページの更新もリモートで対応してしまう、ただその反動であんまり休めてない(-_-;)

 

な内容です( ..)φメモメモ


3/15(水)

AKYの開発日記#59 VBA備忘録

 

RPG関連のタスクにまた戻る。

ということで、VBA。

 

例えば重要な列があった場合に 色を列全体に入れたい場合がある。

RPG はソースコードにおいて、その一行内でもカラム列で重要な意味をもつところがあるため、この色別作業は重要だ。

今日はそんな( ..)φメモメモ 復習も兼ねている。

図:RPGのソースコードを表示したエクセル例

With mysht

 

    Dim InteriorColorRngString As String '背景色指定範囲の文字列 Range("A1:B1") の "A1:B1"にあたる

    Dim InteriorColorRng As Range '背景色指定範囲を設定するRange型

    Const s As Long = 5 '開始行

    Dim e '最終行

    e = .Cells(Rows.Count, 1).End(xlUp).Row 'データ終了の最終行の取得

    

    '①AO列~AR列のデータ開始行~データ終了行の背景色設定

    InteriorColorRngString = "AO" & s & ":" & "AR" & e  '複数列

    Set InteriorColorRng = .Range(InteriorColorRngString)    

    InteriorColorRng.Interior.ColorIndex = 6    '黄色

    

    '②8行目が不要なのでグレーにする

    InteriorColorRngString = "A" & 8 & ":" & "CD" & 8  '単一行

    Set InteriorColorRng = .Range(InteriorColorRngString)

    InteriorColorRng.Interior.ColorIndex = 15    'グレー

    

    '③G列~G列のデータ開始行~データ終了行の背景色設定

    InteriorColorRngString = "G" & s & ":" & "G" & e    '単一列

    Set InteriorColorRng = .Range(InteriorColorRngString)    

    InteriorColorRng.Interior.ColorIndex = 8    '水色

 

    '④16行目が不要なのでグレーにする

    InteriorColorRngString = "A" & 16 & ":" & "CD" & 16  '単一行

    Set InteriorColorRng = .Range(InteriorColorRngString)

    InteriorColorRng.Interior.ColorIndex = 15    'グレー

 

End With

図:RPGのソースコードを表示したエクセル例(色付け版)

色付けは以前のblogにも( ..)φメモメモしているが、Rangeを使うと便利(主観)

合わせてRangeの範囲を事前にstring型の変数に入れておくと、デバッグの際などの範囲確認も文字列になっているのでチェックしやすい。

 

色付けは、処理順に実行される。セル単体はもちろん、単一の列、行、および複数の列、行の範囲でも対応可能。しかし、色付けの処理順を間違えると(ソースの赤文字のところ)、列の背景色を水色に指定する前に、行の背景色をグレーにしてしまっており、その箇所だけ上書きされてしまう。結果、図の「6」のグレー行の一か所が水色になってしまうというおかしな背景色設定になる。

 

複数の箇所で色付けを行う場合は、

処理順に気を付けて行う必要があるっと ( ..)φメモメモ


3/13(水)

AKYの開発日記#58 python日誌

 

まとまった時間を少し確保、それを活用して、python版ツールの修正にとりかかる。

この修正内容が体験版の方でも適用できればと思う。

 

いくつかサンプルソースを用意して動かしてみると、

いくらかのおかしな点が出てしまっていることがわかってくる。

 

出力したマークダウンテキストから作られたフロー図のデータ項目同士がうまくつながらない、図でエラー表示が出る。

まだこの場合、マークダウンはテキストベースなので、その場で修正すれば何とかなる。

 

一方で、ツール実行中にエラーが出てしまい、ツールから出力自体なされないケースも存在することが判明してきた。

 

困ったことが、それが弊員が関わってない、先達者の作ったソース部分にあることだ。

ソースを見るもよくわからない文法が多く、いかに自分のpythonの経験が浅いかが思い知らされます(-_-;)

 

自分の携わった箇所の問題点はすぐ着手できそうだが、これはどうしたものか、

放置するわけにもいかないので、

近くの本やネットなどで解析、解析に少し時間をあてることにします

( ;..)φメモメモ

 


3/12(火)

AKYの開発日記#58 サーバー格闘日誌

 

サーバの運用、内容を確かめるために

メインはそのままにして、ミラーページを作ることにしました。

 

ミラーページで挙動を確かめ、おかしなところはそこで直してしまい、最後にミラーの内容と

そっくり入替えようという目的です。

 

ミラーページはflaskのフォルダをそのままそっくり複製して、フォルダ名だけ変更しました。

ミラーページのURLをダイレクト入力でアクセスできました。

 

ただ、問題が発生。

一連の動作を終えて、戻るリンクからリダイレクトを試みたところ今、運用しているページへと跳んでしまう。つまり、ページ遷移がおかしいのです。

 

ここから小一時間の格闘がはじまる。

 

Fight!

 

リンク周りを確認する。

相対パスで指定しているから問題はないはずです。気になるところは見当たらず。

 

次にサーバー内のプログラムファイルの処理時間などをチェックする。

処理される場合、最終処理の時間に更新されるはずだ。

 

ところがミラーの方のフォルダが更新されてないことが判明・・・

ミラーページのフォルダの内容は何一つ更新されてませんでした。

一方で 運用しているページのフォルダの内容が更新されていました。

 

この時点で、どこかの段階で、しかもかなり早い段階で運用しているページに跳んでしまっているということが判明します。

 

結論

「.htaccessの設定をミラーページ用に変更忘れていたこと。」

ただこれだけでした。

 

コピーした内容のままであったため、サイトアクセスがあったとしても

.htaccessが運用ページの内容であったため、運用ページに跳んでしまっていたのでした。

 

ただ これにたどり着く前に、もう一つのトラップが潜んでました。

 

WinSCP(FTPソフト)の中で .htaccessファイルが見当たらないこと。

どうも初期段階は隠しファイル扱いとなってしまうことです。

この今試しているPCはWinSCPを入れたPCとは別のPCであり、今回ミラー用に新たに使うPCでWinSCPも導入したばかり。

 

なので、運用ページの内容を収録するフォルダの中に .htacceessファイルがあったことは、ファイルが表示されていないのだから、断片的な記憶を手繰り寄せるなり、そこから調べるしかなく時間がかかってしまった。

 

 

とりあえず、エラー画面500が出るようになった。なんかエラー画面でも、格闘していたころの何も変わらない画面と違い、ほっと安堵感が出るもんです。

 

もう一つの原因は、複製の際に、パーミッションの設定が一部のファイルが初期設定に戻ってしまうようなので、それを修正したところ、ミラーページ画面が表示され、遷移の異常も直りました。

 

終わった後は、コーヒーブレイク。

どこかでまとまった時間作ってワードプレスを本格的にやってみたい今日この頃です。

っと。忘れないように( ..)φメモメモ

 


3/11(月)

AKYの開発日記#58 RPG

 

今年で13年目。あの大震災から。

サイレンが鳴り響く。

あの日から毎年、この日の午後は、どうにも不安がつきまといます。

 

RPGについて、ホームページにも公開したように

C仕様書(演算仕様書)について、フロー図の作成までは辿りつきました。

 

次に入ってきたタスク内容は、他のF、I、Oなどの各依頼書のカラム位置合わせ。

 

まず、このカラム位置についての説明のドキュメントが100P超ある・・・

これはすぐには理解できないわ(-_-;)

 

まだ勉強中ではあるが、I仕様書などは中の内容によって、同じカラム位置でも意味合いが変わってくる。カラム位置が重なる(内容で識別してるので問題はない)。ただその内容が識別できないと、エクセルでそれを表現しようとすると、列構成で色々と大変なところがある。

 

F、I、Oはそれぞれカラム位置により内容が異なる。

あまり複数のシートにしたくないので、F、I、Oそれぞれを一つのシートで別々の表で表示させたい。

 

しかし、カラム位置により内容が変わることにより、そのエクセルの横幅などレイアウトにも影響が出てしまい、それができない。

 

私が無知なところも含まれるが、エクセルは同一シートの中で異なる列構成を表示させる方法がよくわからない、一つ思いつくのが、リンク図という手法はある。

リンク図は、表全体をコピーして、貼り付けの際にリンク図指定して貼り付ける。そうするとその表自体では更新できないが、元の表を更新すると更新内容が反映されるというもの。

 

できなくはないが、図面というのがオートメーションの中では不都合。

止むえず、シートを分けることにしました。


3/7(木)

AKYの開発日記#57 ホームページ更新

 

ホームページを更新しました。

開発の合間に対応してます。

全ページを眺める時間はあまりとれず、ホームページを見ていただいた方からのフィードバックなどが一番の材料となり、更新作業を行ってます。

 

フロー図作成の対応言語にRPG(AS/400シリーズ)が追加となりました。

RPGはフロー図作成の対応言語としては C#、python、COBOLに次いで4つ目となり、さすがに物覚えが悪い筆者でも、慣れてきたのか開発期間は短く済みました。

 

あわせて、python版については、体験版ページも公開しました。

体験版はWebサーバの関係もあって、あまり大きなソースファイルのフロー図は、作成が現在、できません。大きなファイルを載せるとサーバ側が危険察知して封鎖するようなので、制限があります。

 

ソースコードからすぐに出来上がるフロー図は、時間コストが重要な今日において、色々な面で、作った我々の知らない点で、活用の道が見えてくるのではないかと密かに期待してます。

まだまだ体験版の内容には課題(見せ方やサイズの面など)が残ってますが、それは順次解決していきます。

 

ということで( ..)φメモメモ は今日はメモすることないです。


3/6(水)

AKYの開発日記#55 コーヒーブレイク

 

休憩中からの書き込みです。

雨もやみ、晴れ間が見えてきてます。寒さは変わらずです。

 

少しプログラムの話題から離れた内容です。

 

昨日、惣菜の鶏レバーが爆発しました。

 

電子レンジでチンするとレバー類は爆発します。

使用中にバンって大きな音がします。

電子レンジの中が酷いことになります。

実は数年前に同じことをやってました。また同じことをするとは(泣

 

レバーには薄い膜がはってあり、それが加熱で、破裂するからです。

同じような食べ物として 卵の黄身があります。

これも爆発するといいます(実例はない。)。

どうもレバーをチンするには、爪楊枝などで先にレバーに少し穴をあけて、ラップをして、レンジから目を離さず、様子見しながらチンするようです。

 

電子レンジは、家電の中ではよく使う部類に入ります。

ふとしたことから大惨事になってしまう。

電子機器は、便利な反面、便利すぎる故の恐さもあると実感した日でした。

 

それでは( ..)φメモメモ


3/5(火)

AKYの開発日記#54 VBA備忘録

 

外は寒い。3月だというのに、雨も降って寒すぎる(-_-;)

暖かいコーヒーで休憩中

 

最近、pythonから離れてるなあ。

VBAがもっぱらなタスクにまた戻りつつある。

 

今日は Offsetについて

Offsetは相対参照です。あるセルを起点に指定した分だけセルを移動する。

これがOffsetです。

Offsetは覚えると非常に便利だと思います。(主観)

 

.Offset(行、列) は こう書きます。

行 がプラスなら 下の行へ、マイナスなら上の行へ セルを移動

列 がプラスなら 右の列へ、マイナスなら左の列へ セルを移動

 

A1のセルを起点としたOffset操作例

Range("A1").Offset(1,0)  // A2のセルへ移動

Range("A1").Offset(1,1)  // B2のセルへ移動

 

セルの移動が理解できるとOffsetはこういうこともできます。

Range("A1").Offset(0,1) = 3 //B1のセルへ移動して、セルに3を入れる

Range("A1").Offset(1,1).Font.ColorIndex = 3 //B2のセルへ移動して文字の色を赤くする

 

筆者は For Eachなどでセル範囲を変えたくないような処理で隣の列などをちょっとした操作したいときなどにOffsetは使ってます。

( ..)φメモメモ

 

ぎゃ 昨日から日にち間違えてた。今日は5日だった。

今日、保存したファイルの名前をすべて 0306にしていたわ。。。泣

 


3/4(月)

AKYの開発日記#53 VBA備忘録

 

気づいたら夜だった。

帰る前に更新。

 

フロー図作成ツールの対応言語がまた一つ増えた、

C#、python、COBOL、そしてRPG

 

RPGのマニュアルの熟読は途中で力尽きるもどうにか試作版は完成した。

さすがに複数冊のマニュアルで1000ページ以上ともなると、

休日を使って読んではいたが、目も頭もほんと疲れる~(-_-;)

 

今日のメモは相対パスから絶対パスへの変換

 

相対パスの入力値を受け取った際に 絶対パスに変換する

相対パスを使うとプログラム内では色々不便(主観)なので、絶対パスに変換してる。

なお、ChatGPTに要件を定義して作成依頼をすると

以下のプログラムが数十秒ですぐに作られてしまうという・・・AI恐れ入ります(-_-;)

 

Function 絶対パス変換(path) As String

    Dim relativePath As String

    Dim absolutePath As String

    

    ' 相対パスの例

    relativePath = path

    

    ' ワークブックのパスを取得

    Dim workbookPath As String

    workbookPath = ThisWorkbook.path

    

    ' 相対パスを絶対パスに変換

    absolutePath = workbookPath & Mid(relativePath, 2)

    

    ' 絶対パスを表示

    絶対パス変換 = absolutePath

End Function

//////////////////////////////////

 

'相対パスから絶対パスを取得する

apath = 絶対パス変換(FilePath)

 

ってことで( ..)φメモメモ

 


3/1(金)

AKYの開発日記#52 コーヒーブレイク

 

3月に突入した。

暖かくなるかと思いきや、今朝は寒い。

 

ここのところ、VBAとRPGの分野が多く、pythonから離れている。

RPGのマニュアルを読んでいるが、オープン言語のほうに慣れていることもあってか記述方式が、カラム位置によって決まるという独特な書き方(筆者が読んでいるのは、AS400の頃、RPG3にあたる)で、その仕組みの理解が大変。

また、標識と呼ばれるシステムがり、標識がその行の指定のカラム位置に存在すれば、その構文は、標識が真であれば(または偽であれば)その構文を実行するという、ifもendifも記述がいらない条件文付構文へと変貌するという(ここではものすごく簡潔に書いてる)、スーパーワード的なものも存在する。

 

さて、まだ、実のところ、サーバー格闘日誌は完結しておりません。

細かい作業が残っているが、別のタスクが優先となったため、サーバー関連のタスクはいったんは、ペンディング状態となっています。

 

=(イコール)pythonについてもペンディング状態(=ブランク期間)となっています。

もう少しで、この別のタスクの方はいったんの目途がつくので、それが終わり次第、このブランクが長くなっていく前に、自分の中でスケジュールの予定で遅れているサーバー関連のタスクの方に空いている時間は充てたいな。と考えてます。

今日現在、pythonについて少し忘れかけてきている・・・(; ..)φメモメモ

 


2/29(木)

AKYの開発日記#51 VBA備忘録

 

2月29日、今年はうるう年だ。よって平年より1日多い。それが今日にあたる。

 

 

当時の暦は、1年の始まりは農作業の始まりで決まっていた。農作業は3月から始まる、よって2月が1年の最後の月にあたる。そこで2月で調整が入る。

 

調整の背景には、地球の公転周期が関わる。公転周期が1年365日より少し長い(約365.25)ことから、365日のままにしておくと、ずれが発生してしまう。でこのずれが4年の間に、1日分だけずれを起こしてしまうということで、うるう日で調節するわけだ。

 

うるうは漢字では「閏」だ。閏をみて、潤滑、潤沢が連想される。はみでた という意味で、漢字に納得がいく。

 

こんな指摘があった。

エクセルのあるシートの内容を別シートに移したとき、

「エクセルの0が消えてるよ」とあった。

 

確認すると、たしかに先頭の0が消えていた。

 

原因は、エクセルの書式設定の標準で起こるエクセル側の自動設定にある。

標準にしたままだと、先頭の0がある場合、どうやら先頭の0が不要なら消してしまうようだ。

 

ネットを調べて対応策があったので( ..)φメモメモ

 

書式をテキスト形式にすると、0は保持される というもの。

 

移動の前に移動先のシートに対して、予め、書式を変更する一行を加えておく。

 

ws.Range(Range範囲).NumberFormat = "@" 'テキスト形式にする

 

これで修復完了。。。ふう、エクセルは便利だけど、自動であれこれしてしまうのも、ちょっとあれだな(・_・;)


2/28(水)

AKYの開発日記#50 コーヒーブレイク~眠い朝~

 

3月も近づき、季節がだんだん近づいてきた。

野球の季節。オープン戦も始まってきてる。

今日の早朝、普段は8時起きだが、5時起き。大谷選手の所属するドジャースのオープン戦の生放送の時間だからだ。

 

昨晩は、家のPCからRPG言語のマニュアル500P超あるものをひたすら読んでいた。素人からするとかなり暗号めいた内容だらけで難しい。日付も変わり、かなり遅くまで読んでいた気がする

・・・

・・・

んで、オープン戦がみたいから早起き。

 

早起きというより、寝る前に視聴予約を入れておいたのか、テレビがスイッチ入っていたせいか音がガンガン鳴っていた。それで目が強制的に覚めたという感じだ。

 

当然、脳は眠いわけで、なんとか3~4回位までは見ていたが、眠すぎたせいか力尽きたらしい。

んで、気づいたら8時でした・・・っと。

んで、第3打席のホームランを見逃してしまいました。。。っと(-_-;)

 

メジャーリーグが本格的に始まると、生放送の時間帯に合わせた朝5時起きが増えるだろうし、今から慣れておかないとです( ..)φメモメモ


2/27(火)

AKYの開発日記#49 選択文の可視化

 

COBOLも、C#も現在勉強中のRPGもそうだが、C#でいうswitch文や、COBOLのEVALUATE文や、RPGのSELEC文など、選択文については、ソースコードをじっくり見るより、可視化するとぐんとわかりやすくなる例。

 

選択文は、分岐が多いほど、ソースコードは縦にずらっと並びやすい。

そうなるとソースコードではぱっと見て、追いにくい(主観含む) 

図はマークダウンのmermaid形式で、さくっとフロー図化したもの。

選択式はこんな感じで表現される。ソースによっては、膨大な分岐のケースもある。上の図も10個以上の分岐がある。

マークダウンは仕事で使用する言語のひとつだが、言語ルールに沿って記述するだけで、ここまでの可視化がほんの数秒で実現ができる。改めて凄さ、便利さを感じる今日この頃

( ..)φメモメモ


2/26(月)

AKYの開発日記#48 コーヒーブレイク

 

グーグルのメールが使えなくなるようなデマ(デマゴギー(Demagogie)の略)を最近ネットでみた。デマに踊らされることはないが、火のないところに煙は立たぬというように、一抹の不安は残る。というのものgmailでの登録をあちらこちらのサイトで行っているせいもある。万が一のことも想定しておいた方がよいかな・・・

 

話題は変わる。

時折、起こること

・あ、これ欲しいなと入ってみたサイトが、過去に会員登録していたサイトだった。ログイン時などにパスワードを当然求められるが、パスワードを忘れてしまい、サイトに入れず。

 

このあと起こること

・結局思い出せず、パスワードの再発行(-_-;)

 

PCの場合は、パスワードはグーグルでパスワードマネージャーがあるので、そこに登録しておくと自動で、パスワードを引きだせるようになり、何とかなる。

 

PCを使わないでパスワードを入れるケース、携帯やゲーム機からなどとなると、グーグルマネージャーから引き出せない(引き出せる方法を知らない)ので、パスワードの件で悩まされる。

 

あとで冷静に考えると、それらのサイトをPCで一回は入れるようにしておけば、グーグルマネージャーから目視で確認して、入力できるのではないか と思ってしまうが、まあ、当時はそんなことは頭には片隅にもないわけだ。

 

過去の、数字だけとか、英語+数字は通用しなくなり、最近では、パスワードは8文字以上、英語に大文字、小文字を混ぜる、同じ文字は3文字以上続けてはいけない。どんどん制約が増えていく今。

なんかネットゲームなどで名前登録する際に、既に登録されているようなケースで同じ名前が使えないとき、次々と盛りに盛るような、そんな感覚だ。パスワードという大事な設定が、こんなんで覚えられるのだろうか・・・

過去の脆弱なセキュリティへの対策として今があるんだろうが、なんでこんなに入力が大変になったのだ~という今日この頃です。


2/22(木)

AKYの開発日記#48 ホームページ更新

 

ちょっとしたことで気になること。

・今日は2月22日、猫の日。BSテレ東で、ねこまみれな一日は例年のごとく。録画準備OK。帰ってからのお楽しみ。

 

・電子レンジでスイッチを入れると、その間を利用してお手洗いに行く癖がなかなか治らない。

(よくよく考えると危険ですよね・・・)

 

さて。

本日午前中は、昨日から取り掛かっていたMTIのホームページの更新作業を行ってました。

 

MTIの新しいサービス MPRS(エムティインターナショナルプログラムリノベーションサービス)のページを作成、ホームページに追加しました。

ということでこのBlogの場を借りて ちょっと宣伝してみる。

 

リンク: MPRSへ

 

午後はまた 開発に戻ります( ..)φメモメモ

 


2/21(水)

AKYの開発日記#47 VBA備忘録

 

昨日、暖かった天気が今日は一転、さむ・・・

こんなときはコーヒーはホットですね。アイス向けしかなかったが、無理やりホットにして飲むことにする。ふぅ

 

今日は あるエクセル操作の問題 についてメモってみた。

#FF69B4という内容が入力されたセル(セルAとする)がある。

ここに入った値が、別セル(セルBとする)で255,105,180へと変換するようなエクセルの数式があります。

 

このセルAに入れるとき、手入力は面倒なときがあります。

そんな場合は、コピペを使うことはよくあります。

 

でも、

コピペをすると フォントや書式が崩れてしまう!

 

マクロを使いエクセルの表示を制御する方法をみつけた。

セルAを使っているシートに下記のようなマクロを埋め込んでみると、セルAに変更が入ると自動で書式設定が自分の設定した内容で維持できる。

 

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim cellA As Range

    Set cellA = Me.Range("F4") ' 書式固定のセル位置を指定

    ' ターゲットがセルAの場合に書式を設定

    If Not Intersect(Target, cellA) Is Nothing Then

        With cellA

            .Interior.ColorIndex = 35 ' 背景色を設定

            .HorizontalAlignment = xlCenter

            .Font.Size = 12

            .Font.Name = "メイリオ"

            .Font.Bold = True

            ' 太い外枠を追加

            With .Borders

                .ColorIndex = 1 '黒

                .Weight = xlMedium

            End With

        End With

    End If

End Sub

 

なかなか便利そう( ..)φメモメモ


2/20(火)

AKYの開発日記#46 VBA備忘録

 

夜もかけてRPGのマニュアルを熟読中・・・当然マニュアルが分厚過ぎて読み終わらない。

オープン言語で慣れているせいか、どうも書式になかなか慣れない。

 

どうにか理解できた内容を( ..)φメモメモしておく。

この理解できた内容を次のタスクとしてVBAのツールに反映させていく。

 

 

ツールに入る前に、VBAにおいて、ようやく、シート間データ移動について自分なりのやり方にたどり着いた気がするのでメモに残す

 

はじめ シート間のデータ移動は、シートデータのコピペで行ってた。

スピードは速いのだが、まず、クリップボードを占領するということが問題となる。クリップボードはWindows共有ツールにつき、エクセルだけのツールではない。ゆえに他のアプリでのコピペなどにも影響をきたす。

連続作業で時間がかかるマクロの場合、他の作業を併行することもある。そういった場合、これの影響が直撃する。他のアプリでコピペが使えないようなケースが出てくるからだ。

 

また、シートコピペは、コピペ時に一気にメモリ消費量が増大する傾向があること、メモリリソースをしっかり管理しないと、連続作業のときに次第に負担がかかり、結果ハングアップする可能性があること。しかもエラーが オートメーションエラーで出るからさらに質が悪い。

 

特に筆者の場合、シート間移動の元データは大量のデータ構造があるので、このコピペは時に危険を招く(マクロツール自体が破損するケース、最悪元データ自体にも影響が出てしまう可能性もある、不安定による不安がつきない)

 

改良した第2形態が、For文を使う

クリップボードを使わない。この方法を模索した結果だ。

For文でデータ範囲のある最終行までで、シート間で内容の移動を行うというもの

コピペでない分、リソース面ではやや安心感がある。

ただ、速度が遅く感じる。それはそうだ、For文でひとつずつ見ていくからだ。

 

で、今行っているのが以下にたどりついた感

Rangeを使って元シートのデータをコピー先のシートへ値を渡す方法。

クリップボードを使わない。メモリ面も大丈夫だろう。スピードも速いと思う。

 

 Dim sourceRng As Range,targetRng As Range

 Dim sourceRngString As String,targetRngString As String

 Dim ssht As Worksheet,tsht As Worksheet 'ssht はソースシート、tshtはターゲットシート

 

 sourceRngString = "A" & 6 & ":" & "Q" & 100 ’文字列にしておくと、デバッグで範囲などがすぐ確認しやすい

 Set sourceRng = ssht.Range(sourceRngString) 

 

 targetRngString = sourceRngString '渡す先の行列構成が一緒なので、sourceRngStringを代入

 Set targetRng = tsht.Range(targetRngString)

 

 'ターゲットシートのデータ範囲に、ソースシートのデータ範囲の値を渡す

 targetRng = sourceRng.Value 

※ 右辺は、.Valueにしないと 値を渡せない。また、値渡しとなるため、背景色、罫線情報といったものは渡せない

 

'//色情報も渡す場合のメモ 一回渡した後に別に 背景色の情報を渡す ここはForEachを使い、ひとつずつ対応する

    For Each sourceCell In sourceRng

        Set targetCell = targetRng.Cells(sourceCell.Row - sourceRng.Row + 1, sourceCell.Column - sourceRng.Column + 1)

        targetCell.Interior.Color = sourceCell.Interior.Color

 

    Next sourceCell

'// ここまで

 

    '// 残しておくとメモリの面で不安なので、使い終わったら変数は初期化する

    Set sourceRng = Nothing

    Set targetRng = Nothing

 

 

シート間移動でセルの情報を全移動ではなく、値のみといった場合は、この方法が今の自分には一番合っているかもしれない。ということで( ..)φメモメモ


2/19(月)

AKYの開発日記#45 RPGことはじめ

 

RPGを勉強することになる。

RPG(Report Program Generator)(ロールプレイングゲームを真っ先に連想してしまうがそれではない)

 

事務処理用語として使用されるIBM独自のプログラミング言語らしい。

 

かなり歴史のある言語のようで

こちらの言語の解析が必要となってきた。

マニュアルが渡されたが、500P超のものばかり。

うは、参考書のボリュームやん(--;)

 

pythonやVBAをやっている筆者としては、

どうにもRPGのコードが、頭に入りづらい。

 

頂いたサンプルは、一行のカラムの位置の記述内容で何をしているか決まっているようで、フリーフォーマットに慣れている点でまず、とっかかりでつまずくことになる。

 

なもんで、ChatGPTに聞いてみよう。

ChatGPTは詳しくはIBMのRPGをみてくださいと言わんばかりの回答だが、わかる範囲でこたえてくれる。色々質問してみよう。うっすらは理解できてきた。

ただ質問し過ぎたせいか、制限※を食らってしまった うは~(xx;

 

※ChatGPTは有料版等に関わらず一定時間に質問をし過ぎると、ネットワークの公平性をうたわれ、制限をかけられます。

( ~12-19~ )といった文字で12時~19時までの間は使えませんなどのエラーメッセージが出ます。(以前も同じようなことがあり、実際に試したが、その通りだった)となる。

その間は、無料版を使ってくださいとのことで、別のリンク先が表示される。無料版が使えないこともないが、回答精度など色々な点で、有料版と違いが出てきてしまう。

 

話を戻す。

初歩的なことはうっすらは理解できたので、

とりあえず、読むのは苦手だが、このマニュアルを熟読する時間に充てることにしましょう。

 


2/16(金)

AKYの開発日記#44 共有ネットワーク格闘日誌

 

自宅からの更新。

自宅で使用するPCが1台→2台になった。

サブPCが増えたということ。

 

片方はサーバにして、もう片方は今まで通りの使い方にしようとしている。

となると、両者の共有ができればいいなと次に思うわけだが。

 

結構前に同じような環境があった。

だが、1台が壊れてしまったため、一台のままずっと続いてきたわけだが。 

なんだこれ??

 

WinOS11

Windowsの窓(スタート)>設定>ネットワークとインターネットに入る。

>プライベートネットワーク設定の各項目をON(家庭内なので、パブリックは設定しない)

 

ネットワーク上には、2台間のPCでそれぞれの名前は出てくる

(探索自体はできることがわかる)

 

PCにアクセスしようとすると、上の画面にあるような内容が求められるわけだ。

 

前はこういうのはなかった気がするのだが。ネットではいたるところに情報は転がっているわけだが、どうも読んでもよくわからない。

 

少し考える。

共有方法は他にないのか・・・

・USBでやり取りする→ できなくはないが、抜き差しで都度都度手間(最近は、正しい手順で抜き差しをしないとすぐにエラーが出て怒られる)

・OneDriveでやり取りする→都度都度ネットワークアクセスでマイクロソフトのサインインがとっても面倒だ。

 

・・・両者のやりとりは多くなるので、手間は避けたい。

結局、熟読することにした。

・・・

ようやく理解はできたっぽい。

Windowsの資格情報画面は、アクセスされる側のPCからすると、ドアのようなものであり、

そのドアを開ける際の鍵となるのが、ユーザー名とパスワードの合致だ。

 

アクセスされる側のPCで Windowsの資格情報※を下記のような画面から設定をする。

※Windowsの資格情報管理は検索で資格情報と入れると検索結果に出てきます)

ネットワークアドレスを入力(とりあえずアクセスされる側のPCのIPアドレスを入れておく)

ユーザー名は任意のもの、パスワードも任意のものを設定する。

OKを押すと、資格情報が登録されるわけだ。

 

あとは、アクセスする側のPCがユーザー名とパスワードを入力することで両者の共有が成立したというわけだ。 

 

共有フォルダについては、どっかに両者が共有できるようなフォルダ※1を作っておき、そこにアクセス権限※2を与え、入れるようにすればよい。

 

※1 アクセスされるPCの全部には入れるわけではないと思うので、アクセスする側からどこまでは入れるかを調べておき、アクセスされる側は、その中にフォルダを作っておくとよいかもしれない。

 

※2 任意のフォルダを作成>右クリック>アクセスを許可する>特定のユーザー>プルダウンからEveryOneを選択して追加(この辺はもう少し細かく制御できるかも。よくわからんのでEveryOneにした)

 

最後の注意点

セキュリティの問題もあるので、必ずパブリックにはふたをしておく。

あと、パスワードも、定期的に更新をする

 

はあ、これで午前中終わってしまった。ネットワークの件は、pythonのWeb稼働の件もそうだが、ほんと難しいわ。

 

とりあえず、ネットワーク知識があんまりない筆者がどうにか理解して、たどりついた共有手順

 (きっともっと良い方法があると思う・・・)

今日の備忘録・・・なんかめちゃ疲れた感。


2/15(木)

AKYの開発日記#43 VBA備忘録

 

連休明けからblogの曜日を1日ずつ間違えていた 恥ずw

 

VBAで ForEachを使う機会がなんか増えてきた

For文でなんでも対応していたこともあり、この機会にForEachをがっつりやろう。

 

For文

指定した回数のループを実行 for インデックス変数i to 指定回数~Next

インデックス変数を使ってループを追跡 array(i) = "test" 

 

ForEach文

コレクションや配列の各要素に対してループを実行

コレクション内の各要素に対して一度ずつ処理を行う

インデックス変数は不要、各要素(item(n))が直接参照される。

 

 

ForEachをよく使いそうなのは、Rangeなどエクセルのセル範囲で操作するときか。

 

ーコード例ー

Dim trgtStartRow As Long, trgtEndRow As Long

Dim tRng As Range,tRngString As String

 

trgtStartRow = 4 ' 開始行4行目を設定

trgtEndRow = 15 '終了行15行目を設定

 

’B開始行:B終了行 の範囲を文字列型で作成。

tRngString = "B" & trgtStartRow & ":" & "B" & trgtEndRow

 

'Range関数の引数に ↑の変数をセット(文字列型の変数なので番地の確認もしやすい)

Set tRng = .Range(tRngString)

 

For Each c In tRng

'tRngは すでにセットしたアドレス B4:B15のセル範囲を示す

'c は オブジェクト、ここでは セル番地 B4,B5,B6それぞれを示す  

 

 処理

 

Next

ーここまでー

 

仕組みがわかってくると、セル操作はかなり自由が利く

 

c.Value = "test" '現在選択中のセルに「test」を入力

c.Interior.Color = RGB(220, 220, 220) '現在選択中のセルの背景色を灰色に設定

c.Font.Weight = True '現在選択中のセルの文字の太さを設定

 

c がセル番地だとわかれば、下記のような応用も効くのではないか

Range.~ にあてはまるなら何でもできそう

 

列範囲はいじりたくないが、隣の色も変えたいなというときは

下のような感じにすると、隣などの列の操作もできる。

For Each c In tRng

 c.Interior.Color = RGB(220, 220, 220)

 

if 条件文式 'ある条件に合致した場合のみ 右隣の列の背景色も変えたい

  c.Offset(0,1).Interior.Color = RGB(220, 220, 220)

 End If

Next

 

まだまだ奥が深そうだ。とりあえず、メモメモ


2/14(水)

AKYの開発日記#42 VBA備忘録

 

VBA処理

・別シートでユーザーがフォームなどで指定した色コードを別のシートのセルの背景色に適用する処理

 

ポイント

・セルの背景色(塗りつぶし色)を設定する際は、Interiorオブジェクトを使う

 

Range("A1").Interior.ColorIndex = 1  'カラーコードのインデックスナンバーで指定する

Range("A2").Interior.Color = RGB(0,0,255) 'RGB関数で指定する

 

この2つの方法がある

 

1やRGB(0,0,255)などでそのまま指定してあれば、それをそのまま適用すればよいので、なんら問題はなく、下のようにSelectColorといった変数に値を入れてセルの背景色に適用できる。

 

Range("A1").Interior.ColorIndex = SelectColor

 

通常、色を指定する際、HTMLなどの色情報を見ればわかるが、white、blueや、#000000、#FFFFFFなどのカラーコードが通例だ。

 

 

てことなので、変換という課題が生じる。

 

VBA処理

・別シートで指定した色コードを別のシート(またはファイル)のセルの背景色に適用する処理

 

対応

・カラーのインデックスナンバー、RGB関数であれば、対応可能。カラーコードの場合、RGB関数へ変換で対応する。アルファベットは それらをマッピングする対応表を作るしかないかも。

 

カラーコードからRGB関数への変換の方法

 

 

カラーコードは通常、6桁の16進数であらわされる

最初の2桁が「R(赤)、次の2桁が「G(緑)」、最後の2桁が「B(青)」の値を表す

これを10進数に変換し、RGB(,,)の関数の形式に組み込むようにする

ここまでわかれば、以下のような感じに変換できそうだ

 

selectColor = #FF0000 '赤色のカラーコードを指定

 

    Dim r As Integer, g As Integer, b As Integer

    

    ' カラーコードからRGB値を抽出して、それぞれ10進数に変換

    r = CInt("&H" & Mid(selectColor, 1, 2)) '「R」 255

    g = CInt("&H" & Mid(selectColor, 3, 2)) '「G」 0

    b = CInt("&H" & Mid(selectColor, 5, 2)) '「B」 0

 

 '別のシートのA2セルの背景色に赤色を設定

    othersheet.Range("A2").Interior.Color = RGB(r,g,b) 'RGB(255,0,0)

 

※r,g,b のところに入る変数は必ず整数型でなければならない。型エラーとなってしまう

× RGB("r,g,b") ()内の変数、カンマ含め一緒にした変数はダメ。文字列認識される

x    "RGB(r,g,b)"      RGB(,,)ごと文字列を組み合わせて変数に入れるもダメ、関数認識されず、文字列認識されてしまう

 

RGB(r,g,b)  文字列操作でないので、&を使わずに直接変数(太文字の箇所)を入れる。

関数なので、引数のところに変数を入れるようなものと考えればわかりやすいかも。

 

使いどころは そう汎用的なものではないが、メモとして残す


2/13(火)

AKYの開発日記#41 コーヒーブレイク~ちょっと食べ物の話~

 

連休明けです。

週末にテレビで冷凍食品の特集を放送してました。

 

つい見入ってしまいました。

早速 放送内にあった冷凍ラーメンを 会社近くのセブンイレブンに向かい、冷凍食品のラーメンを購入してみる。(天外天の豚骨ラーメンと書いてありました)。

 

冷凍食品のラーメンは値段が張る割には味はあまり というのが過去にあったせいか、数年間、いやそれ以上か、購入がありませんでした。ラーメンといえばカップラーメンが主体でした。

 

「ガツン!」と殴られたような衝撃を受けました。

 

ここまでおいしくなっているのですか~(‥;

香りもある、具も多い、麺にコシもある、にんにく効いてる、ほえぇぇ

カップラーメンよりやや割高なところもある(レンジも10分位かかる)が、これからも時折、利用してみようかな。と数年越しに気づかされました。

 

週明け早々、なんか申し訳ございませんでした 第1号です。


2/9(金)

AKYの開発日記#40 コーヒーブレイク

 

突然ですが、

アウトプットした資料を活用する場合、すぐれたアウトプット形式はなんだろう。

主観ですが、エクセルが一番使いやすい。

 

エクセルは表形式アプリであり、データ操作に関して、非常に強力なツールであると考えている。(主観です)

 

pythonやVBAでツールを作るにあたり、どうにも最終形式がエクセルのアウトプットが多くなる。

エクセルのアウトプットの際にどこまで要求仕様にこたえられるか

これがほんとにいつも悩むところ。

 

VBAからなら操作は割と簡単で、エクセルに思ったような結果でアウトプットしてくれる。

この後のデータ操作、装飾(特にデータ項目がたくさん並ぶ場合、や他の資料と比較する場合、該当箇所に色付けがあるとわかりやすい といったご注文はよく受ける)

 

自動で仕組みをつくるわけだが、pythonの場合、まだ操作にも慣れていないせいもあってか、エクセルのライブラリはあれど、読み書きが中心であることもあってか、こういったオプション的なところが、自動ですべての要素を組込みづらい。

 

VBAは.Interior.Colorを駆使すれば、背景色の操作に関しては、要求仕様のすべての要素を組込みやすい(私がpythonをしっかり理解していないところもあるが)

 

とまあ、いつも最終形態となりやすいエクセルのアウトプットがどこまでツールからおよび、ツール間で連携して結果を返すことができるか、自分の実力がもっとあれば、そんな悩むお題でもないんだろうけど~~

 

とまあ、物思いにふけるお昼休みです。


2/8(木)

AKYの開発日記#39 コーヒーブレイク?かな

 

雪景色、曇り模様の日から一転して、晴れ晴れとした日です。

久しぶりに 午前はpowerpointでかきかき。

 

powerpointの資料は、エクセルと比べると

・縦横の範囲に気を付ける(スライドの縦横は決まっているので)

・あまり文字が多くならないようにする

・フォントは大きめにする

・背景が乏しいならテンプレートにたよる

・イラストで困ったな~と思ったらアイコンを使う(意外にいっぱいある)

 

こんなところを意識しつつ、かきかき。

んで。終了。

 

エクセルではどうにもビジュアライズの面で乏しく(こちらの技術の問題もあるが)感じてしまうが、powerpointのパーツを使うと、技術面をカバーするかのように、ビジュアライズ面もよりよいもの(主観だが)に仕上がるもんだ。

 

さて、午後はがっつりpythonです。

 


2/7(水)

AKYの開発日記#38 サーバー格闘日誌

 

WEB上では動きはしたものの、どうにも不安定。

原因はおおよそわかっている。

 

python実行ファイルが、内部処理の際に用いるエクセル操作のところにある。

 

python自体メモリ消費量が大きい傾向らしい。

エクセル操作は、VBAの時からもそうだが、メモリ消費量が大きい傾向。

これが合体すると・・・

 

そりゃメモリオーバーフローも一部はうなずける

ちな、ローカルサーバでは、何ら問題がないのだから、レンタルサーバ側のメモリリソースはそこまで大きくないものだと思われる。

 

この不安定、はじめは、まったく動かなかった。

・内部操作に用いるエクセルのシート、内容の整備を行った

 (余分なシートの削除、余分な行列のデータ整理)

・python実行ファイルにおける、エクセル操作の行列操作処理の効率化

行と、列をある程度固定化させて処理(当たり前だけど抜けていた・・・)

これらを行い、はじめて、あまり大きいデータ量は扱えないが、一部の軽いデータ量ならエクセル操作ができるようになった。

 

これを解決するには、エクセル操作自体の見直しが必要となるわけだが、

調べてるうちに pandasのDataFrameが使えそうな気がしてきた。。。

 

pandasを使用するにおいて、

numpy(ナンパイ)が必要なようだが、 有効なWin32アプリケーションではありません と出てくる始末。pythonは64bitを使っている。

ああ、ここでもbitの違いの罠・・・しかもネットみてもnumpyの標準は32bitであり、非公式で64bit対応のnumpyの紹介しているホームページなどもみつける、ただ、その先は、すでにないようで。この手は塞がってしまったわけだ・・・はあ、絶望を覚える。

 

他の方法を模索するしかないか~。でもこれ、一応、軽いものは動くし、Webページの件でしか起こってらず、ツールの方ではこれについては問題が発生していない・・・優先順位としては低いな、、、


2/6(火)

AKYの開発日記#37 サーバー格闘日誌

 

雪は止みました。

というか、会社の周辺はそれほど積もってません。

 

インターネット上での展開にようやく漕ぎつけました。

 

internalServerErrorはそこまで詳しく示すわけでもなく、エラーの対処方法に数日悩まされることもあるが、とりあえずインターネット上での表示はできるようになった。

 

自分の場合に引っ掛かったことをメモっておく。

ローカルサーバでうまくいったこともインターネット上の対応となると色々と変更する必要が出てくる。

 

・動かす際は、py ではなく、cgiにする

 cgiにしたファイルのパーミッションは755にする

 

・index.cgiファイルの先頭行に命令する pythonのパス

 Windowsにはあまり関係ないが、Linuxなどで重要になってくる、シバン行の命令。

 xserverはLinuxを使っているようだ。自分の場合、Anacondaの中に入れているpythonのパスを指定するわけだが、そのパスの設定をずっと間違っていた。

 パスは SSH接続などでanacondaに入り、which python などで検索するとすぐに出てくる。

 

・実行ファイル内に所々出てくるパスの設定。

 ローカルでは「\」でパスの区切りは可能(エスケープする必要があるので実際は、\\)だが、インターネット上では「/」にする。

 このパスを間違えると、URLの処理で目的の場所へ辿りつかず、うまくいかない。

 

インターネット上の展開にはやっと漕ぎつけたわけだが、

サーバー絡みの問題が襲ってくる。

 

・メモリエラー

 

筆者の作ったWebアプリは、エクセルファイルを使う。どうやらopenpyxlはメモリの使用量が高いようで、エクセルファイルを開く際などに引っ掛かる。

おまけに、internalservererrorが出るものだから、何が原因かがぱっと見よくわからん

 

幸いなことに、ブラウザ上に printの内容は表示されるみたいだ。

該当らしき箇所は、printなどを作り、どこまで進んでいるかをみる

んで、エラー箇所はというと、

そんなときは、下記のようなtry~exceptを該当らしき箇所に埋め込む

 

import traceback #tracebackのインポートが必要

 

--------------------------------

 

try:

  該当らしき箇所の実行処理

except Exception as e:

    print("予期せぬエラーが発生しました:", str(e))

    print(traceback.format_exc())

    sys.exit()

 

--------------------------------

 

こうしておくと、exceptが拾ってくれて、エラーをブラウザ上に表示してくれる。

 

メモリエラーに関しては、対象のエクセルファイルを精査し、不要な箇所を消す。

python実行ファイルは余分な処理を減らす。特にエクセルに数式が埋め込まれてる際は、別のツールでもそうだったが、メモリ消費量が高い傾向がある。

 

この辺を削っていくことでどうにか動く。が、不安定なところは変わりない。

なんで、今後の改善点として、早速課題リストに書き込むことになる。

 

ちなみにローカル環境では何ら問題ない。レンタルサーバの問題だからかこればかりは合わせるしかなく、内容の見直しを迫られることになる。

 

とりあえず 全くの手つかずの技術である0から1(いったんは完成だが)へとなるのは気分がよい。こんなときは、コーヒーがほんと美味しい。

この先、課題は山ほどあるが、まあ、技術の向上につながるわけだし、いいか。こんなときは、どうも前向きに受け止められてしまう。


2/5(月)

AKYの開発日記#35 サーバー格闘日誌

 

雪が降り続いてます。

テレビでは、東京でも雪が積もっているようなニュースが流れてる。

品川区は雪が積もるのでしょうか。

 

北海道に数年在住経験のある筆者も雪は楽しみである。

 

さて、サーバー格闘日誌、

少し今回は、趣向が変わりホームページについてである。

サーバスクリプトは内部の話、表面で見せるのはホームページである。

 

ホームページは数年前までは自作ホームページを運営していた(今はやってない)。

今は、ワードプレスなどをつかえば簡単に作れるらしいが、すでにここ最近色々と新しいものを吸収し続けているせいか、たとえ簡単であっても、今、新しいものを覚える気が起こらない。

お洒落なホームページをいずれは作りたいが、それはまた別の機会として、

とりま、タグ打ち+cssで専用ページをつくることにする。

 

タグ打ちはほんとひと時の安堵感。pythonなどのプログラムと比べると、ブランクは多少あるけれどほんとに簡単に思う。んで、装飾は css(カスケードスタイルシート)を使えばよいわけだ。これで、ホームページの形自体はできてしまう。

 

自分としては <table>タグでテーブルレイアウトを作り(border="1"にすると枠線が表示されるので全体のレイアウトが設計しやすい。本番時は"0"にして消す。)

列で場所を制御する。ある程度は自分の設計通りにホームページのレイアウトが仕上がる。

んで、テーブルの行や列(カラム)ごとにそれぞれ設けたclassやidによって、それぞれの属性(色や文字についてなど)を制御する。

よくよく考えると pythonのTkinterが割りとすぐに理解できたのは、このテーブルレイアウトが頭にすでにあったのかも と今になって気づかされる。

 

そして、ページ遷移については リンクを作り「a href=リンク先」で指定すればよいわけだ。

 

とまあそうは簡単にはいかないわけだ。

flaskは若干異なる

 

flaskはまず構成に気を付ける必要がある。

備忘録としてメモメモ

 

flaskフォルダ・・・

      ・・・templates :htmlをたくさん格納するフォルダ

      ・・・static:静的なコンテンツ、画像やcssを格納するフォルダ

 

templatesフォルダには使用するhtmlを入れる

staticフォルダには画像やcssを入れる

 

flaskは redirectやrender_template を使い、遷移先を制御する。

flaskは url_forを使い、画像やcssを制御する

 

 

遷移の場合

(通常)

<a herf = "topページのアドレス">TOPページへ戻る</a>

(flask時)

<a href = "{{ url_for('backPage') }}">TOPページへ戻る</a>

 

pythonファイル内

 

@app.route('/backPage')

def backPage():

    return redirect('/')   この場合、index(つまり最初のページ)に戻る

 

画像などの場合

(通常)

<img src = "画像のパス">

(flask時)

<img src = "{{ url_for('static', filename='画像ファイル名(拡張子あり)') }}">

 

 

コツさえわかるころには、ページ制御もできるようになった、

 

今まで知らないことだらけの難しいことばかり行っていたせいか、久しぶりに簡単な部類のことばかりに着手し、なんか安堵感を覚える一日であった。 


2/2(金)

AKYの開発日記#34 サーバー格闘日誌

 

なんでつながらん??

 

500 Internal Server Error 画面が何度やっても出てしまう。

XSERVER上で 自作の簡単なcgi(hello world!を表示させるもの)を動かしてみた結果がこれである。

ローカル環境の実行ファイルでは難しいということがわかり、flaskを勉強することにした。

 

flaskをインストールして、

public_htmlにflaskフォルダを作り、そこに簡単なcgiプログラムを入れてみる。

んで、ネット上でそのcgiを動作した結果を表示させるというもの。

これができるのであれば。課題解決へまた一歩進む。

 

なお、pythonはWebアプリとして動かす際は、.pyではなく、.cgiにする必要があるらしい。

このcgiにするというのが、つながらん の原因に大きく関わっていたわけだが・・・

ソースを見ても ネット上の見様見真似でやっているせいか一つ一つのソースコードを十分理解したわけでもないので、何が問題かさっぱりわからない。

 

・そもそも何のエラーなのか??

 

せめて何のファイルかがわかればもう少し対策を練れるのだが。

これに一日かけるわけにもいかないので、数時間悩んだあとは、別タスクを行いながら片隅で考える。んで思いついたら試す。これの繰り返し。

 

簡単なcgiだが3つのファイルで構成される

・index.cgi

・pythonの実行ファイル

・.htaccess

 

切り分けができることがあったので試す。

index.htmlを作り試してみる→index.htmlは普通にアクセスできる。.htaccessは問題ないっぽい。

 

パーミッションを調べてみる。権限の可能性を疑う

index.cgi → 755

python実行ファイル → 644

.htaccess → 644

パーミッションは問題ないっぽい。

 

やたらエラーの確認の際は、ログをという記事が目に付く

どこかにエラーログがあるのだろうか。

 

初歩にかえる

XSREVER上でエラーログを記録しているところがないか調べる。

XSERVERのサーバーパネルのアクセス解析の中に エラーログとあった。

エラーログがダウンロードできた。

 

ああ、エラーログがいっぱいあるわ。

 

chatGPTにエラーコードについて聞いてみる。

ざらざら原因の可能性が出てくるが、設定ミスの傾向っぽいことがわかった。

 

原因判明。

シバン行と呼ばれる先頭行のパイソンのパスの設定に誤りがあった。

ChatGPT引用によると

スクリプトの最初の行に#!で始まる行がある場合、これはシバン行です。この行はスクリプトがUnix系オペレーティングシステム(LinuxやmacOSなど)で実行される際に、どのインタープリタを使用してスクリプトを実行すべきかをシステムに指示します。とある。

 

システムに指示している内容を間違えたらそれは動かなくなる可能性は十分あるわな。

 

すぐに アナコンダの中のpythonのパスを調べる

which python で見つかる。

あー 全然違ってた。最初にどこにあるかわからず、シバン行の意味もわからず、ただパイソンの場所を入れるのであろうと、目視でたままたアナコンダの中にみつけたpythonのパスを入れていた。

それが間違っていたっぽい。

 

パイソンのパスを入力しなおしたところ、正常に表示ができた。

 

たった一行の表示を実行させるだけで、これだけ大変だとは。


2/1(木)

AKYの開発日記#33 サーバー格闘日誌

 

ティッシュが止まらない日は続く、

例年通りだと、後数日の辛抱だと思う。

 

いつまでもしないわけにもいかないので、サーバ―設定を再開する。

 

●インターネット上で整備した環境内でpythonを実行させる

ここで壁にぶち当たっている。

 

・・・前回まで・・・

試しにローカルで動かしてたpythonのツールをサーバ上で実行してみると

「openpyxl」が見つからないのエラーがでましたっと。ライブラリをインストールさせる方法もみつからない。

 

・openpyxlのライブラリが見つからないからpythonの実行ができない

・レンタルサーバに標準搭載のpythonは、ライブラリの追加ができない

 

標準搭載以外でpythonを使う環境を探す必要がある。

 

ネットやchatGPTで調べてると方法となるものが見つかった。

 

・レンタルサーバ内に仮想環境を構築し、そこにpythonを入れる というものだ。

 

早速その方法に着手する。以下はその概要だが、一番下にたどり着くまで、どうにも花粉症のせいか集中力が散漫になりやすい中、理解に時間がかかり、1日はかかってしまった。

 

選んだ仮想環境は Anaconda、LinuxBrewなどもあるようだが、

ネットで順立てて説明していて一番自分の環境にマッチングしていたものがAnacondaだった。

 

Anacondaはpythonを中心としたオープンソースのディストリビューション。

 

方法はこうだ(詳しくは、ネットなどで「python、レンタルサーバ、実行またはSSH接続」などでたくさん事例がみつかります。

 

①Anacondaをインストールする

 xserverはLinuxなので、Linux版をインストールする(自分のPCの環境ではない点に注意)

 

②Anacondaをレンタルサーバ内に入れる

 

③SSH接続を用いて、レンタルサーバ内をリモート接続でアクセス、Anacondaをレンタルサーバ内でインストールする(自分のPCではない点に注意)なので、SSH接続の事前準備は必須

 

④Anaconda内でpythonプログラムを実行する

 

特に重要なのが ③ SSH接続によりリモートでレンタルサーバ内にアクセスし、プログラムを実行させるというものだ。

①~④を実行後、openpyxlをAnaconda内のpythonにインストール、インストールはできた。ついでにpipも最新版に先にしておく。

 

ローカル内で実行できたプログラムの全部はまだ動かなかった。

とりま、一部に絞り、実行してみたところ、実行はできた。ライブラリがみつからない という問題については解決ができた。

 

どうにか一つ前進はしたようだ。


1/31(水)

AKYの開発日記#32 コーヒーブレイク

 

昨日からティッシュが止まらない。

こりゃ花粉症かな~

くしゃみも出る。

 

数十年間続く、時期になると、大変なことになる慢性的な花粉症持ちだ。

ティッシュもすぐに箱がどんどんなくなる。

 

それ以上、体が悪くなるってわけではないのだが、

何が大変かというと

とにかく集中力がもたない。集中しようとしてもくしゃみや鼻をかんだりするせいか、

頭に描いていたものが一緒に、すっとんでしまうような感じ。

 

今、やっていることは、新しいことが多いせいか、とにかく集中力が必須である。

集中力が散漫状態ないまは、身に全然入ってこないときてる。

 

今は、いくつかのタスクを並行的に抱えており、

とりあえず、花粉症がもう少し落ちつくまでは、既存の仕事にちょっと味付けするような別のタスクを対応しよう。ということでサーバ整備はちょっとだけお休みします。


1/30(火)

AKYの開発日記#31 サーバー格闘日誌

 

サーバー展開には2通りある

①会社でサーバーを作ってそれで運営する

②レンタルサーバを借りて、その中で運営する

 

正直、サーバ経験なし、知識も皆無に近い

①はリスクが高すぎる なので、いったんは②を選択にした。

ただ、自分の好きなことが制限なくできるので、①にいずれはしたい。

 

次は進め方(この先は、ネットを検索すると、たくさん参考になる資料があるので、そちらを参考にすることをすすめます)

 

●インターネット上で実行できる環境をみつける

 レンタルサーバを借りることにしました。

 独自ドメイン(インターネット上の名前)を取得しました。

 独自ドメインをレンタルサーバに紐づけました。

 

●インターネット上で見つけた環境を整備する

 pythonが使える XSERVERをいったんは選択しました。

 サーバー上でpythonを実行するには

 ①サーバー上のプログラムを遠隔操作する

 ②pythonがサーバーが対応している必要がある

 

 まず、この2点を満たす必要がある。

 ①遠隔操作は、SSHという機能を用いる。

  SSHとは、自宅PCからサーバPCにアクセスして、サーバPC内のファイルを遠隔操作する機能である。

  pythonをサーバで実行させるにはこの機能が不可欠である。

  この機能があるかないかは最初にサーバ選択時に「SSH対応」は調べることである

 

  SSHを実行するには、いくつかの段階がある。

  1.SSH設定をONにする(サーバ側での操作)

  2.公開鍵暗号方式の設定

    公開鍵暗号方式とよばれるもので、通信内容を公開鍵で暗号化し秘密鍵で復号します

    うーむ 複雑でわからず・・・インターネットはだれでも使えるところだからこそ、入室制限をかけている、その入室制限を解除するための方法みたいに考えることにする

    公開鍵認証用鍵ペアの生成。秘密鍵が自PC内に作られる(サーバ側)

     パスフレーズの入力:後述するツールでパスワードようなものとして必要です

     大事そうなので、手帳に残しておく。

    公開鍵登録(自分)

 

  以下、3と4には 2で設定した内容が必要。

  とくに作成した秘密鍵のパスフレーズはよく入力で使います。筆者は、最初、凝ったパスフレーズを設定して、手帳に残してましたが、その残した内容にケアレスミスがあったのか、パスフレーズで引っかかってしまい、3,4がなかなかできず、結局2に時間をかなりとられてしまい、秘密鍵の作り直しとなりましたっと。

 

  3.WinSCPを入れる(自分のPC)

    FTPソフトの集合体みたいなものです。

    自分のPCからサーバPCへファイルを送る、その逆の受け取る、といった自分とサーバ間のファイルやりとりの際に必要です。

    ホスト設定、ポート設定・・・ホストはサーバのアドレス、ポートは使っていいポート番号、この辺はレンタルサーバ側でのFAQが詳しく、これを設定してくださいと教えてくれる

   

  4.TeraTermを入れる(自分のPC)

    Linux環境でつかうSSHクライアント。

    Windows上で動作するターミナル、SSH接続を行うのに必要

    基本、このTeraTermからサーバ上のプログラムを実行させる

    3と同様にサーバー側にアクセスできるように接続情報が必要

 

 

  5. pythonプログラムを実行する

    簡単な helloworldプログラムは、SSH接続から実行できました。

 

なんだ、割と簡単にできたじゃん・・・

 

はい、つかの間の喜びでした。

 

試しにローカルで動かしてたpythonのツールをサーバ上で実行してみると

「openpyxl」が見つからないのエラーがでましたっと。ライブラリをインストールさせる方法もみつからない。

 

どうやら、レンタルサーバに標準搭載されているpythonではやはりできないということが確定しました。レンタルサーバ上では、制限がかかっているのでライブラリのインストールもできない。

 

●インターネット上で整備した環境内でpythonを実行させる

 

この工程においては、まだまだ準備が必要そうだ。


1/29(月)

AKYの開発日記#30 サーバー格闘日誌 第2弾 前哨戦

 

週初め、日差しが明るく、暖かいです。

 

今週から、本格的なサーバー構築の勉強に入る

Webページからpythonを実行するの本筋に入る。

 

いままでの軌跡として、ローカルPC上では、

ローカルホストにアクセスして、pythonの実行が可能であった。

 

さて、インターネット上となると話は全然変わってくる。

ローカルPC上からインターネット上に代わるわけだが、

とにかく聞いたことがあっても、よく知らないようなワードが洪水のように襲う

 

SSH

ドメイン

ネームサーバ

DNS

公開鍵

暗号鍵

暗号方式

ホスト

TCPポート

WinSCP

TeraTerm

LinuxBrew

・・・

 

頭の中でエヴァンゲリオンの予告のようにこれらの文字が暴れてる。。。

いやはや課題が山積である。

これは、サーバー構築の前に、まずインターネットが何なのかをきちんと知るのが先だなと。

 

とりま、大筋はこんなもんだとは先行きの展望はみえた

・インターネット上で実行できる環境をみつける

・インターネット上で見つけた環境を整備する

・インターネット上で整備した環境内でpythonを実行させる

 

んで、これらの中にさっき上げたようなよくわからないワードが存在するんであろうと。


1/26(金)

AKYの開発日記#29 VBA備忘録

 

とりあえず、データは無事でした。

一部のものは消えた!と思いましたが、よくみるとChromeのアンインストール後の再起動により、今までのキャッシュもなくなってしまい、開幕サーバが違ってました。

開幕サーバを指定しなおしたところ、データは無事にありました っと。

 

また、いずれ同じようなことするんだろうな と思う。

 

少し前にCollectionの便利さを知ったと書きました。

一方で 配列も便利である。

 

VBAの配列は

Dim 配列変数名(5)

のように宣言をします。

 

VBAは型名入れない場合、自動で識別します。

ただし、配列は異なった種類のデータは入れられないため、自身で何を入れているかは理解しておく必要があります。

 

配列変数名(0) = "いち"

配列変数名(1) = "に"

配列変数名(2) = "さん"

 

のように、あるまとまった単位でデータを管理できる。

配列変数名(n) でn番目に簡単にアクセスができる。

 

Collectionとは異なり、配列の便利さは、エクセルのデータ連携にある。

例えば、あるまとまったデータをエクセルにデータ入力したいときは配列が便利です。

 

上の配列変数名は3つのデータが格納されている

これをまとめて入力したいときに、配列のままデータを入力ができる。

これが、処理速度の面では重要なところである。一個一個データを入力するよりも

まとめて1回の工程でデータに入れるわけだから、処理速度にも影響してきます。

 

with mysht

 .Range("A1:A3") = 配列変数名

 

End With

 

この例は、3つのデータという簡単な内容だが、縦、横複数行複数列も配列を用いることで対応可能である。

これの応用として、クリップボードを経由せずにエクセルのデータの操作※ができるようにもなります。(※セルの値と書式設定が対象です。全情報はクリップボードを使います)

 

クリップボードは、Windows共通のコピペアプリ(テキストや画像の「コピー&ペースト(※)」に必要な一時的な保存領域 )です。これをVBAのマクロで使っているとその間は、クリップボードが使えません。

これが、マクロの処理が大きいものになってくるにつれ、マクロがクリップボードを占有してしまい、他の作業の際のコピペができない などが多々出てきます。

 

 

 

こんな状態でツールを他へ出すと・・・容易に想定できます。

なので、自分にとって、VBAでは配列を覚えることは、配列は便利である以上に、とっても重要なのです。

 


1/25(木)

AKYの開発日記#28 コーヒーブレイク

 

自宅で使っているノートPCの話。

空き容量が100GB以上あったものが、30GB位まで減っていた。

このPCは22GB以下になると、Cドライブが赤文字表記になる(HDDぱんぱんだよという警告表示)

 

原因を模索する。

 

・VisualStudioのプロジェクトは1プロジェクトを作成すると、結構な容量を使う。

 →プロジェクト管理はしてるので、そこまで多くなかった。これではなさそう。

 

・androidStudioのエミュレータで余分に使っていないかみる。

 androidStudioは携帯(kotlinなど)の開発環境を提供するが、

 携帯のエミュレータダウンロードがとにかく容量が重い。1台あたり10GB位は確保が必要だ。

 余分なのが1~2あったので削除

 →若干 増えた感じ。

 

・余分なファイルが埋もれてないか。

 →仕事でつかう「Work」フォルダ自体は、2GB、仕事でつかう「Tool」フォルダ自体も4GB、そこまで重くはない。

 

・Windowsアップデートのファイルが残っている

 →この可能性もあるが、3~4個前までは、まだデスクトップに残っているが、これは、2週間~3週間後にたしか自動で削除されていた気がする。それでも数GB程度なので、これも違うっぽい。

 

と、今のところ、原因らしき原因はみつからない。

 

そんなときにもう一つ疑うべきものがあります。

・Google Chrome の容量

 

結論から言うと、これです。

Googleの容量をみると 60GB位ありました。

 

ん、ブラウザってそんなに使うん(・・?

 

流石におかしいと感じ、Google Chrome をアンインストール。

これで解決解決。

 

容量みても変わりません。

ちな、Googleは以下のフォルダで確認できます。

C:\ユーザー\AppData\Local\Google (ユーザーのところはそれぞれの環境ごと)

 

てか、アンインストールして、なぜフォルダが残っているの?

 

どうやらGoogleChromeはアプリのアンインストールだけでは

全ての削除(完全削除)はできないようだ。

 

夜~真夜中にかけての格闘となったが、

このGoogleフォルダ自体をアンインストールして、再起動したところ

これだけの容量があるので、削除自体は少し時間かかります。あまり慌てず、少し放置してから再起動。

 

容量が一気に増えました。

よくよく考えると、ブラウザゲームなどでダウンロードが度々あるが、どこに保存されるんだろうと薄々疑問には感じていた。おそらくローカルのブラウザのフォルダ内に保存されていたんだろう と。

 

再度、Chromeをインストールして めでたく解決!

 

↑ が終わったころには、もう数時間の格闘でメンタルが疲れてしまい、寝てしまった。

 

1つ怖いのが、ローカルの中身を全削除になるわけだから、今ブラウザでゲームしているデータはどうなるんだろう、、、消えたら場合によっては年単位の蓄積データが・・・

 

もし同じような境遇の場合、Googleフォルダの容量を調べてみるのがよいのかもしれない。

ただしセーブデータに関しては、何とも言えないところがあるので、削除自体はご自身の判断で。。。

 

自分ももしデータが消えていたらと思うと、ぶるぶる、今は仕事の方に集中しましょう(-_-;)


1/24(水)

AKYの開発日記#27 VBA備忘録

 

1月にしては日が当たることもあってか暖かい。

窓を開ければ当然寒いですがw

 

VBAから作成した資料を、簡単に修正できないようにしたいときがある。

そんなときに真っ先に思いつくのが、PDF化だ。

PDFは、表示内容がひとつの画像みたいなものなので、そう簡単に修正はできない。

 

エクセルでは、PDF化は、保存形式をPDFにすることで簡単にできる。

保存形式のリストの中にも .pdfはある。

 

ただ、そのまま保存すると、PDFが思いもよらず表示切れが起こり、ページがかさんでしまったり思いもよらないレイアウトになってしまうことがほんと多い。

どうもレイアウトの面でいろいろと癖がありそうだ。

 

レイアウト調整には色々と方法はあるんだろうが、

自分的には、先にPDF出力する資料のページ範囲を決める、

改ページ画面だと1P単位で明暗が出るので幅がつかみやすい。

 

これで出力すると、場合によっては勝手に圧縮をして、1P以内におさめてくれる。

 

さて、VBAでPDF出力はできないものかと調査開始。

方法はいたって簡単だった。

 

シート名.ExportAsFixedFormat Type:=xlTypePDF, fileName:=ファイルのフルパス

 

でできるっぽい。

なんで、あらかじめ PDFを出力するシートの幅を設定しておいて、

上記のコードを入れれば、PDF形式で出力ができる。

 

という エクセルからPDF出力するという話でした。


1/23(火)

AKYの開発日記#25 VBA備忘録

 

プログラム内でデータをまとめて管理したいとき、配列を活用していた。

配列は

配列(0)、配列(1)、配列(2)に値を入れておけば、それぞれの配列にアクセスすることで中身の情報を取得できる。関連のデータをまとめて管理したいときに便利だ。

また、処理の高速化においても重要な要素だ。

あるまとまったデータを配列に入れておき、後でアウトプットしたいときは、あとでまとめて配列のデータをエクセルのシートに転記させる。一行一行対応するよりは、この方法は全然処理速度が変わってくる。

 

一方で、Collectionという、また別の管理する方法があることを最近知る。

 

Dim コレクション名 As New Collection

 

new というところがオブジェクトの使い方っぽい。

 

要素を追加するには

コレクション名.Add 追加する値

 

割と簡単に対応できる

値を追加した順に インデックス番号が割り振られる

 

 

コレクション名.Add "いち"

コレクション名.Add "に"

コレクション名.Add "さん"

 

(インデックス番号1) いち

(インデックス番号2) に

(インデックス番号3) さん

 

配列との大きな違いは、配列には基本、同じ種類のデータしか追加できない。

一方でCollectionは種類を問わないという点がある。

 

また大きさを気にする必要はなく、増えるのであれば、addで追加すればよいサイズ変更にも強い側面もある。

 

なお、addをするごとにインデックス番号が振られるので、あるインデックス番号にまとめて格納する際は、arrayを使う。

 

 

コレクション名.Add Array("いち","一","one")

(インデックス番号1)item(0) "いち" それぞれがitem()に格納される

(インデックス番号2)item(1) "一"

(インデックス番号3)item(2) "one"

 

コレクションの中身を全取得したい場合は、

For Eachを活用するとよい

 

なので、実用的なものとして使えそうなのが、

あるディレクトリ内のファイルで何か処理をしたい というのに便利。

ディレクトリにはどれくらいファイルが入っているかわからない。つまり可変の状態である。

 

ディレクトリ内をまわって、ファイルに該当するものをコレクションに入れていく。

まず、ファイル一覧のリストがPC内にできあがる。

そのファイル名を順々に別の処理で使いたい場合、

 

 

For Each file in fileCollection

 

 処理

 

Next

 

※fileCollection が コレクション

 

※file が それぞれのオブジェクト、つまりファイル名

 

とすることで、そのファイル一覧内のファイルごとの処理が行えるというものだ。

 

うーむ 配列ばかり使っていたが、Collectionも使ってみるとほんと便利。

 

最近、数年前の初期の頃につくった配列もコレクションも何も知らないまま、ただ動けばよいとして作ったようなVBAのツールの遅さ、処理が重いのをどうにかしたいと感じている。これらを活用すれば、処理の高速化が図れそう・・・楽しみがまた一つ増えました。

 


1/20(土)

AKYの開発日記#24 yed graph editor

 

yed graph editorは強力なグラフエディタツールです。現在、フリーソフトです。

お手軽に簡単に描画ができます。

階層型、指向型、ツリー型など多彩なレイアウト、および自動レイアウトを搭載しており、お手軽にレイアウトも調整できます。

 

こちらのソフトは海外のソフトとなっており、ガイドとなる資料がネットにはあまり転がってないですが(公式のドキュメントをまとめたサイトのようなものはあります)なんとか使えてます。

 

仕事柄、あるデータ項目とデータ項目の関連性が正しいかどうかのつながりを調べることがある

そんなとき パパっと yEDで表示させるとつながり状況が一目瞭然。

 

一から図を作ることもできますが、パパっと利用したいときは、エクセルを使ってインポートさせると割と便利なもんです。ここでお話するのはその簡単な一例、もちろんyEDは使っていくと、ここでは書けない位、フリーソフトとは思えないくらいの機能の充実性です。

 

yEDで覚えておく最重要内容は、まずノード、いわゆるアイテムです。アイテムは役割により2つに分けられ、「ノードSource」と「ノードTarget」があります。そしてそれを結ぶ「エッジ」と数年使っている自分は考えてます。もちろんこれは基本中の基本であって、このそれぞれの大きさ、線の幅や太さ、グループ分けなど、細かな設定も無料ながら充実してます。

 

ノードSourceは =ノードです(■)

ノードTargetは、 ノードSourceから 線の先のノードです。(□)

そしてこれを結ぶ矢印、または線が エッジです。

 

簡単に言うとこんなイメージ

シンプルに A→Bです

■→□

 

A→Bの関係が理解してくるとこんな感じにも作れます

A→B、A→C

■→□

 |→□

 

エクセルでどう取り込むかというと、

インポート用のシートのA列に ノードSourceを入れる、B列にノードTargetを入れる

これだけです。あとはインポート画面の設定にそってインポートをすると

このノードSourceとノードTarget同士をつなげます。あるノードSourceが複数のノードTargetとつながるなら、図でも複数につながって表示されます。これであるデータ項目とデータ項目のつながりが簡単に追えます。

 



1/18(木)

AKYの開発日記#23 またまたVBAに

 

VBAが若干空いてしまうと、以下のシンプルなエラーにすらはまってしまう。

今日はそんな話


これはよくある、VBAのコンパイルエラーの1つです。

変数が定義されていません このエラーが出ると、途中で止まります。

 

このエラーが出た際、上のSub~ が 黄色に点灯してました。

この Sub内にはどこも他に黄色に点灯しているところはありませんでした。

 

ですが、再度実行すると、当たり前ですが、エラーで止まります。エラー箇所も同様です。

 

この場合、Subの名前および ft(これは構造体です)をまず疑います。

サブを呼び出した先なども調べるも、何もおかしなところはありませんでした。

 

>この Sub内にはどこも他に黄色に点灯しているところはありませんでした。

のこれが厄介なところで 解決すればいたってシンプルですが、そこまでは試行錯誤がありました。

 

ftがまずいのか Subの名前がおかしいのか、どんどん変な方向に進むようなことをやってましたが、一向に改善しませんでした。

 

このファイルだけではよくわからないので、今朝保存した、バックアップを実行することにしました。バックアップは対象のSubの名前、引数は変更してませんでした。

 

普通に動きました。??

そういえば今朝から、このSub内に関しては機能追加をすべくコードの更新を行ってました。

 

対象Subの分割してみました。このSubには100行以上のソースがあります。

とりあえずはじめのあたりでちょんぎりました。

 

再度実行、エラーは出ませんでした。

 

確信しました。

このエラーは、サブプロシージャ内で使われている変数が宣言していないのに使っているよと怒られていることに。ピンポイントに場所を指定するのではないということに。

 

サブプロシージャ内のひとつひとつの変数を調べたところ、今日更新を行ったコードの中の1か所変数の書き間違えがありました。

 

これを直したところ、正常にプログラムは実行されました。

 

解決すればいたってシンプルなのですが、少しブランク空くだけで、こうなるとは・・・VBA、python、C#とめくるめくる対応していると、ほんとよくわからなくなってくるもんです(^^;


1/17(水)

AKYの開発日記#22 またまたVBAに

・・・

VBAの開発案件が割り込む。

 

1か月ではあるが、pythonに漬かっていたこともあり、

いざ、VBAとなると忘れていることも多い。

 

今日の記事は、

「オートメーションエラー」について

マクロを実行すると、今まで使えていたものが、いきなり、起動時にオートメーションエラーが発生しましたと出てしまい、終了してしまうことがある。

 

このエラーは、デバッグの箇所を一瞬だけ見せるが、エクセル自体が再起動してしまうため、何が原因かよくわからない。

VBAでプログラムすると、これにほんと悩まされる。

 

オートメーションエラーとはVBAで発生するエラーの一つ。

理由がほんとによくわからない。 

ChatGPTなどで調べると

外部ライブラリまたはコンポーネントが見つからない場合、不適切なオブジェクト使用、

セキュリティの問題、システムリソースの問題などが考えられるようだ。  

いつもは動く、急にこれが出る。このエラーが出るのがよくわからない。100%発生するなら完全なプログラム問題だろうが、時折、という点がまた困ったもんだ。 

 

よくはわからないが、とりま、マクロを実行する前に、実行ファイルをいったん、保存する(Crrl+S、最近は面倒なので、マクロ内に保存ボタンを作りそれをクリック)。それから実行をするとオートメーションエラーは回避できる確率がぐんと高まる気がする。逆にこれを怠ると、オートメーションエラーに遭遇している気が・・・(論拠も何もない完全な私見です)


1/16(火)

AKYの開発日記#21 コーヒーブレイク

・・・

ついに余命宣告が・・・手持ちのiphone(SE第2世代)に

3年6カ月使用してました。

んで、その日はきました。

バッテリーが「著しく劣化」!?

バッテリー替えれば使えないことはないのですが、、、

90%自体の表示は、1年位は続いたのかなー。

 

そろそろ大きい画面を欲していたこともあり

携帯電話をかえることにしました。

 

 

んで「iphone 15」に機種変更を ば。

いきなりの上位クラスチェンジな気分です。

 

高いものには手をつけるつもりはなかったのです。

ただ、店頭での機種の魅力に負けてしまったorz

 

docomoには、いつでもカエドキプログラムというものがあり、機種返却のタイミング次第で、残りの購入した代金のお支払が不要になるプログラム。2年後に返却時は、2年後以降の残価の支払いが免除される(色々注意事項があるので、詳しくはdocomoの替え時プログラムで検索してください)

 

長期レンタルみたいなものです。

ですが、このプログラムを活用することで、かなりお得にスマホが購入できるというもの。

docomoの店員もわかっているようで、私が購入にいった時点で既に、そのプログラムの準備をしていてくれました。分割支払いの場合は、入っていて損はないというのが向こうの考えのようです。

 

そんなこんなで購入

前回は 携帯→携帯のデータの引継ぎに時間がかかった。

どうも それがappleはわかっているのか、15を起動した後、すぐ前の機種との引継ぎ設定の画面が出た。引継ぎ設定に従い、30分程度で引継ぎ設定が終わった。

んで、15を起動すると、あらま びっくり、

前のアプリがほぼ移植されていた。

更に驚いたのが、ゲームアプリを前の機種から引継ぎしなくても、ほぼアプリが、前の機種のデータがそのまま使えるではありませんか。

 

店に訪れる→購入までの時間 1時間30分(手続きが長い)

前機種→新機種への設定引継ぎ 30分 (引継ぎはや~)

な 1月のある日の出来事でした。


1/12(金)

AKYの開発日記#20 サーバー格闘日誌

 

10日の続き

 

①サーバを構築

②サーバ起動後、index.htmlを開く

③index.html にあるフォームから受け取った内容を、送信する

④受け取った内容をpythonで処理する

⑤処理後に、result.htmlに遷移する

⑥result.htmlにはダウンロードができるリンクがある

⑦ダウンロード完了後は、thankyou.htmlに遷移する

 

⑥と⑦について

⑥ダウンロードができるリンクをクリックすると、①のpythonファイルのdo GETが実行される。 

 

簡易サーバは起動すると常時起動となり、基本待ち受け状態になる。

リンクなどのクリックは GETの扱いとなり、do GETの中身が処理されるというわけだ。

 

一つ課題にぶつかる

ダウンロードするファイル形式は、マークダウンファイル形式(.md)これはテキストベースだ。普通にネットで紹介しているような、ダウンロードリンクを作った。

しかし 遷移するページは、そのテキストがそのまま表示されてしまい、ダウンロードのようにはいかない。

 

ダウンロードの際は、'Content-Disposition'と HTTPレスポンスヘッダーに設定することで、ブラウザ側にファイルをダウンロードする と指示する。

 

self.send_response(200)

self.send_header('Content-Type', 'application/octet-stream')

self.send_header('Content-Disposition', f'attachment; filename="{file_name}"')

self.end_headers()

 

原因はわからなかったが、たぶん、ブラウザ側の問題もあるのだろう。.txtのもので試しても同様だったので、テキストベースはなんかダウンロードと相性が悪い。

 

よって方法を変える。

テキストが表示しないような方法にすればよいではないか。

なので、最終的な結論は、

「zip」フォルダに圧縮することだった。

 

pythonはこれが簡単にzipフォルダを作れる

 

import zipfile

 

・・・処理内容

 

with zipfile.ZipFile(zip_file, 'w', zipfile.ZIP_STORED) as zf: zipフォルダを作る(この時点は空)

zf.write(self.path,fileName) 

圧縮したいファイルを入れる。第一引数はパス、第2引数はファイル名。

第2引数を設定しないとパスが圧縮ファイル内に作られてしまう、圧縮ファイル内のフォルダ構成がとんでもないことになってしまう。 

 

withからはじまる2行になる。zipファイルを作成する際は、作業終了後に close処理が必須となる。withではじめると、ブロック内の処理が終わったあとは自動的にcloseしてくれる。

 

zipならどうだ ということで、

・・・うまくいった・・・

 

ダウンロードの動作は見られるようになった。

 

見られるようになった・・・あれ、満足してない?

とんでもない落とし穴があった。

 

ダウンロードしたファイルのサイズが0KB、中身は空っ!!

ダウンロード元の圧縮ファイルはファイルは・・・チェックしたが、きちんとファイルが入ってる。

 

これが、今回の最後の壁である。1~2時間悩まされたが、

最終的な ダウンロード部分のソースはこうなった。(太字は任意の変数)

 

do GET内の処理のダウンロード関連部分のソース

 

import zipfile

 

# zipファイルの作成

with zipfile.ZipFile(zip_file, 'w', zipfile.ZIP_STORED) as zf:

zf.write(self.path,fileName)

 

# Content-Disposition ヘッダーを設定してダウンロードとして提供

self.send_response(200)

self.send_header('Content-Type', 'application/octet-stream')

self.send_header('Content-Disposition', f'attachment; filename="{zip_file_name}"')

self.end_headers()

 

# ファイルの内容を送信(以下のwithブロックが抜けていた)

with open(zip_file, 'rb') as file:

    self.wfile.write(file.read())

return

 

ZIPファイルを読み込んでクライアントに送信する処理が適切に行えていなかったのが要因だった。#ファイルの内容を送信以下の withブロック がその該当。

 

というわけで、いまはセキュリティはガン無視、とにかくまずはサーバ環境で動かしてみる という簡易サーバ構築の任務は終わりへと近づく。

 

⑦ダウンロード完了後は、thankyou.htmlに遷移する

 

これに関しては、pythonでは直接的に操作することはどうもかなり難解なようだ。ブラウザがダウンロードの開始とページの遷移を別の操作として扱うためらしい。

やむえないので、javascriptを入れ、一定時間で別のページへリダイレクトする仕組みにした。

ダウンロード対象のファイルは重いわけでないので、数秒で終わるのであまり違和感は出ないと思う。

なので、javascriptを do POST に入れて、ダウンロードのページ自体を作り直すことにした。

 

do POST内のレスポンス関連の処理

 

# クライアントにレスポンスを送信

self.send_response(200)

self.send_header('Content-type', 'text/html')

self.end_headers() 

 

html_content = """ #html_contet = """ でhtmlをインライン記述

<!DOCTYPE html>

<html>

<head>

    <title>タイトル名</title>

   <script>

      function downloadAndRedirect() {

    window.location.href = '{download_path}';

    setTimeout(function() {

             window.location.href = 'thankyou.htmlのパス';

          }, 5000);   #5000はタイムアウト 1000で1秒

      }

   </script>

こんな感じに、<script>~</script>で javascriptを挟む(太字の部分)

 

正確な完了時間はわからないので、とりあえず、5秒待機で別のページへリダイレクトするという

簡単な設計にした。以下の画像は レイアウトがなにもない簡素だが簡易サーバで作ったWebページの遷移画面。

 

ただし、実装時は、セキュリティを意識した設計にしないと とんでもソースになってしまう。

 

まだ、ここまでは序の口であり、

ここからがサーバサイドスクリプティングの本番なんだろうな・・・


2024/1/11(木)

AKYの開発日記#19 サーバー格闘日誌

 

pythonは割と簡単にサーバ構築自体はできるらしい。

本格的でなければ、SimpleHTTPRequestHandler を使えば

ローカルサーバで テスト用としてであれば、簡単に構築できる。

 

とりま 実装はまた別の話として

①サーバを構築

②サーバ起動後、index.htmlを開く

③index.html にあるフォームから受け取った内容を、送信する

④受け取った内容をpythonで処理する

⑤処理後に、result.htmlに遷移する

⑥result.htmlにはダウンロードができるリンクがある

⑦ダウンロード完了後は、thankyou.htmlに遷移する

 

をテスト用としてデモ環境を構築。

なお、不明点は、chatGPTに問い合わせたり、ネットで調べたりした。chatGPTはそのまま鵜呑みにもできないが、すぐにプログラム例も示してくれるので非常に助かっている。

 

時間はかかったが、一応①~⑥の環境は構築できた。

サーバはどこで関わるかというと

①サーバーを構築 pythonで作ってるので、pythonファイルでサーバを起動するプログラム(SimpleHTTPRequestHandlerをベースとしたカスタマイズプログラム)を書く(1/5のBLOG参照)

※SimpleHTTPRequestHandlerは do GETには対応するが、do POSTには対応しない為、拡張する必要がある。

 

②このpythonファイルを起動すると、サーバも起動する

③これは、htmlでページを作る。なんでhtmlのタグなどを使って作る。index.htmlは最初に開くページとなる

④ ①のpythonファイルにあるSimpleHTTPRequestHandler をカスタマイズした do POST内の処理が実行され、pythonの別ファイルの本処理が実行される

 

⑤do POSTには④の処理終了後に、result.htmlを開くように命令する

 pythonからWebページが作れる。

self.send_response(200)

 

self.send_header('Content-type', 'text/html')

 

self.end_headers()

 

self.wfile.write

 

self.wfile.writeを使えば、簡素だが、ページが作れる。

 

⑥ダウンロードができるリンクをクリックすると、①のpythonファイルのdo GETが実行される。

 この do GETも使い方に注意が必要だが、ここまででかなり長くなってしまった。

 ということで、続きは明日以降に


2024/1/10(水)

AKYの開発日記#18 VBAの話 ~お化けなフォルダ~

 

いらなくなったフォルダを消そうも消えない。

VBA内のMkDirで作成したフォルダを消そうとしたところ

消せない。

 

そんなフォルダはないよとエラーが出てしまうのだ。

実際にフォルダは存在する。

 

中にはVBAで作成したファイルがある。

当然ながら、フォルダが認識されないのだから、ファイルも開けない。

困った(汗

 

中のファイル自体は他に移せるみたいなので、

他に移して開く。ファイル自体は開く

 

しかし、このお化けなフォルダは残ったままになる。

右クリック、削除では消えない。

 

フォルダがずっと残ってしまい邪魔です。

 

結局のところ、解決方法はみつかった。

通常の方法で消せない場合は、コマンドプロンプトから強制削除ができるようだ。

 

コマンドプロンプトのウィンドウで

rmdir /s /q ファイルパス

と入力する。

 

かくしてこのお化けなフォルダは消えた。

 

そしてこの原因として

MkDir 時のフォルダ作成ミスからきているケースが強い。

 

いずれも共通するのが、

フォルダ名+「 」(半角スペース)が残ったままフォルダを作成すると

これになってしまう。(100%かどうかはよくわからないが)

 

とりあえず、Trimで予め末尾に半角スペースは出ないようにすることで

この件は、原因の対処はできた。

 

これ、もしクライアント側で起こってしまったら、面倒なことになる

早めに見つかってよかった と捉えよう。 


2024/1/9(火)

AKYの開発日記#17 再び VBA → pythonコンバージョンの話

 

12月~1月にかけて行っていた

VBA→pythonのコンバージョン

デモ環境は構築はできた。

 

が、実際動かしてみると、VBAとpythonでどうも結果が異なることがある。

 

原因は、pythonとVBAの文法の違いなどにあるようだ。

バタフライエフェクトのように、デバッグをやっているとほんの小さな誤りが後の結果に大きく響いてしまう。自分の場合は、最後は図面で現れるから、結果が更に如実に出てしまう。

 

特にひっかかっていたのが、

1:for文。

 

 

このfor文のループを設定する範囲に色々と引っ掛かっていたみたいだ。

文章では1行だが、実際そこまでたどり着くのに、数日かかったこともある。

 

pythonでは for文は

 

①for cell in (1,10)

 

②for cell in range(1,10)

 

どちらもエラーが出ない

 

これがデバッグで色々と悩まされた。

 

①は 1 と 10 が対象である

②は 1~10が対象である

 

これが、エクセルの操作でどれだけ大きな影響を与えてくるか

rangeにあたるところが行であれば、①は1行目と10行目しか対象としない

②は1~10行目を範囲とする。

 

これが原因で結果が異なっていたところが多々あった。

ようは rangeの入れ忘れ。

 

2:for文の挙動

for cell in range ( a,b )

というfor文がある

a と b には変数が入るのだが、a と bが それまでの処理で同じ数値が入ってしまうと

for文は中の処理には入らない、for文外の処理へ進んでしまうというものだ。

 

これによりfor文内の処理が実行されず、結果で違いが出てしまう。

 

3:値の比較

pythonは、VBAのように型宣言は不要。

python側で自動で型を設定するので宣言も不要だ。

 

しかし、自分で型宣言をしないということは、型を意識しない、ここに大きな落とし穴が潜んでいることもある

 

a == b 、a > b という比較をする際、pythonでは a と  b は同じ型でないと正しい比較ができないようだ。正しい比較ができないと、if文が想定と違う動きとなってしまい、結果に影響が出る。

 

つまり

a が int型 だと b も int型である必要がある

a が int型 で  b が str型の場合は、 a != b という扱いになるらしい。

型は自動とあるが、比較においては、型を意識する必要があるということだ。

 

解決法は

int(a) == int(b) でキャスト型にすればよいんだが。

(事前に aには値が存在することと、値は整数であるをチェックしておく必要がある)

 

まあ、他にもいろいろと細かい点でデバッグの箇所は見つかったが、

上にあげた3つには ほんと大きく悩まされた。

 

あとはもう少し処理の高速化をはかりたい。エクセルのシートコピーやセル消去などエクセルの操作の一部で極端に処理に影響が出ている、というのは明らかなんだが。。。どうにかできないものか。


2024/1/5(金)

AKYの開発日記#16 サーバーとの格闘日記1

 

いくつかのタスクを併行しながらとなる。

 

テーマはころころ変わるかもしれない

 

サーバーサイドの勉強を開始した。

 

できるなら今、勉強中であるpythonでなんとかできるようにしたい。

 

pythonは、

簡易サーバーなら数行で簡単に起動できるっぽい

 

any.py]

---------

 

from http.server import SimpleHTTPRequestHandler, HTTPServer

 

 server = HTTPServer(('', 9000), CustomHandler)

 print("サーバー起動中...")

 server.serve_forever()

 

ただこれだとサーバーがずっと起動しっぱなしなので、任意に止めたいなというのもあるので、もう少し制御できるようにすると

 

any.py

---------

 

from http.server import SimpleHTTPRequestHandler, HTTPServer

 

try:

    server = HTTPServer(('', 9000), SimpleHTTPRequestHandler)

    print("サーバー起動中...")

    server.serve_forever()

except KeyboardInterrupt:

    print("サーバー停止中...")

    server.shutdown()

    server.server_close()

    print("サーバーが正常に停止しました。")

 

はい、これでサーバーが簡易ですができました。

 

このコード入れたpythonファイルと同階層に、index.htmlを置いておく

そうすれば

127.0.0.1:9000でローカルサーバにアクセスできるわけだ。

127.0.0.1はローカルループバックアドレスとよばれる。

自分自身を指す特別なIPアドレスである。「localhost」という名前でも参照できる。自分自身の上で動作しているサービスへ接続する場合は、このIPアドレスを利用できるというわけだ。

 

今は、テスト用として構築できればよいので、

数行でpythonでサーバ環境を試せるのはありがたい。

 

言葉であらわせば簡単そうだが、実際動かしてみると まあ案の定

トラブルは出る

 

・ディレクトリリスティング(ファイルの一覧表示)になる

・Error 404 おなじみの ページがみつからない(index.htmlがみつからない)やつだ

 

とりま、カレントディレクトリを調べる

スクリプト実行のパスとカレントディレクトリが違うっぽい

どうやらこれが原因で index.htmlが見つからないエラーにつながるようだ。

 

カレントディレクトリにいったん、index.htmlとスクリプトを実行するファイルを移動してみる。

エラーは出なくなり、index.htmlの画面が出るわけだ。

 

テスト用環境では、サーバーにデータを送るところまではこれで可能となった

あとは、受け取ったpythonのスクリプトが、メイン処理を実行する別のpythonスクリプトを呼び出すわけだが、もう定時すぎました ということで、今日は終わり。

 

サーバー関連のスクリプトの壁に早くもぶちあたった。

この先も前途多難になりそうだ。


2024/1/4(木)

AKYの開発日記#15 新年挨拶

 

あけましておめでとうございます。

 

2024年 辰年(巳)が幕を開けた。

室内は日光が当たるせいか、冬場にもかかわらず、25度を超えている。

窓を開けないと暑いときもある。

 

 

さて、これからやることに向けて

知識不足の領域でもあるサーバースクリプトについて勉強を少しずつ始めようと思います。

 

サーバースクリプトは昔 php+xampp をかじった程度で

本格的にはあまり携わってない。

 

どっかで自分でサーバー構築も必要だろうし、

多分、前途多難だろうけど、まあなんとかなるでしょう と とりま前向きに考える。

 


2023/12/31(日)

AKYの開発日記#14 コーヒーブレイク

 

自宅から更新

 

忘れそうなことなのでBLOGでメモしておくことにした

ほんとうは昨日でBLOGは今年は終わりだけどw

 

マックでこんなエラーが出ました。

 

 

ModuleNotFoundError: No module named 'openpyxl'

 

あれ? openpyxl 入ってるよ?

昨日できたじゃん。

 

なぜ

 

ここから年末最後のバトルが始まる カン!

 

ネットで調べまくり、以下格闘の履歴

 

エラー調べる

単純に openpyxlのモジュールが入ってない

 

pythonのバージョンを調べる

 

VSCODEでは右下でバージョンの確認ができる

 

元々

・3.10.4の環境だったが、いつの間にバージョンが変わっていた。 

バージョンをもとに戻す

 

3.12.1のバージョンのあたりをクリックすると以下のような画面が出る

バージョンが選択できる。

 

もとに戻したところ、

正常に実行された。

 

しかしながら、

3.12でも使えるようにしておきたい。

 

3.12でpipを試す

pip install openpyxl

 

Requirement already satisfied:〜

 

こんなエラーメッセージが出てインストールされない。

すでにインストールされているというものだ。

 

ここからが自分なりの解決に至った内容。

1:3.10.4のpythonの場所を特定する

  ファインダー>移動>フォルダへ移動>ターミナルに現れたパスを入力

 

2:.pyenvにたどりつく

  .pyenvにversionsフォルダがある

  ここで、pythonのバージョンの内容がそれぞれ格納されているようだ。  

 

 

  そして、

  versions > lib > >python version > site-packages の中に

  openpyxlが見つかる。

 

3:3.10.4にはopenpyxlのフォルダがあるが、3.12.1には入ってなかった。

  これが モジュールが見つからない原因である。

 

4:原因がわかれば、3.10.4のopenpyxlをコピーして、3.12にも入れてあげればよい

 

5:エラーは出なくなった。実行を確認して解決した  

 

 

とまあ、年末最後のバトルとなったわけだ。

箇条書きでは5行でも、実際は2時間位、ここにたどりつくまでのバトルをしていた。

 

ちょうど、孤独のグルメの再放送がやっている。もちろん毎年、年末夜も見ている。

テレビの音声を脇で聞きながら、バトルしていたわけだが、

なんとも、腹減ったの ごろうさんの言葉がやたら耳に入り、自分もお腹が空いてきた。

 

さて、今年は本当にこれでおしまいにしよう。

 

それではそれで よいお年を


2023/12/30(土)

AKYの開発日記#13 コーヒーブレイク

 

もういくつ寝ると~

な30日。

 

仕事納めです。

多少やり残したものがありますが、

それは来年への持ち越しということで。

 

来年はせっかくpythonへいけたのだから

いまある他のツールも順次pythonへ変更したいというところ。

時間があれば・・・だけど

 

年末最後のアクシデント・・・であってほしい。

 

 

PCのすぐに横にあった缶コーヒーに手がぶつかってしまったい、

缶コーヒーを倒してしまい、mac PCにぶちまけてしまった・・・

 

「やってしまったな~~~」

「・・・mac PC いったかな・・・」

 

ノートだから即電源も切れない。

がPCは生きていると祈りつつ、電源をさっさとキル。

蓋を閉める。

 

さっさとPC表面のコーヒーをふきとる。

 

続いてキーボードまわりをふき取る。

マックは、ふたを閉じてあけると、電源がついてしまう。

 

「あいや~!!」

いやいや電源入らないでください。ほんと。

 

仕方ないので、PCの電源をきり、PCの蓋は開けたまま後処理に入る。

キーボードの隙間に入ったコーヒーをかきだす。

表面的にはきれいにはなったが、たぶん、隙間に液体が入ってしまっているだろう。

PCを縦して、軽く振ってると、まあ銀盤のキーボードの隙間からコーヒーがぽとぽと垂れてくる。。。

 

10分程度で、ようやく垂れなくなってきた。

 

1時間程度放置して、

電源をON。

 

電源は普通に入る模様

キーボード操作も特にトラブルも出てないみたいだ。

「いきててよかった~~」

 

ただし、コーヒーの匂いが若干PCには残ってしまいました。

消臭剤でも軽くかけ続けれてればそのうち消えるかな。。。

 

そんなこんなの年末の一場面でした。

 

それでは、よいお年を。

 


2023/12/28(木)

AKYの開発日記#12~

 

コーヒー飲んでほっと一息

 

一通り動いた模様。

VS Codeから実行させていたが、

どうも使いにくい。

 

それならということで、格好は別として、

ユーザーフォームを作ることにした。

 

すんごいシンプルだけどやりたいことはできている。

 

Tkinterで載せてる写真クラスのユーザーフォームは簡単にできるぽい

TkinterとはPythonからGUIを構築・操作するための標準ライブラリ(ウィジェット・ツールキット、GUIと考えればよい

作り方はいろいろあるようだが、自分的には gridの考え方が気に入っている。

gridはフォームを行列のテーブルとして考える、エクセル慣れしている自分としては、フォームの配置イメージが掴みやすい。

 

作ってるツールは、ファイル処理をするので、そのファイルが入っているフォルダの場所が知りたい。なので 参照ボタンでダイアログを呼び出し、ディレクトリを指定する。

指定して、開始ボタンを押したら 作ったプログラムが実行される。とシンプルな仕組み

ただ、だいぶアプリケーションぽくなってきた。

 

 

次いで マックではどう動くか試してみた。

マックも pythonをインストールすれば 普通に動くぽい

 

そしてもう一つの光明が。

VBAでマックと比べると処理速度がなんと速いではないか。

Windowsとマックも処理速度は変わらない。

 

 

後の課題は、VBAのときと微妙に結果が異なるので

その原因の調査、および他に問題がないかの精査 だ。

 

まあ、年明け位まではかかってしまいそうだが、目途は見えてきたようだ。

 


Windowsの ツール起動画面

処理したいファイルが格納されたフォルダを「参照」で指定して、開始ボタンを押したら処理が実行 という簡単なフォーム

Macの ツール起動画面

Winと同様。フォームの色が格好いいネ。macってデザインがかっこいいね。

処理終了しました は処理終了後にメッセージを出してみる。


2023/12/27(水)

AKYの開発日記#11~

 

クリスマスも終え、世間は年末ムード

年末に備えるとともに、開発も佳境に入る。

 

一通り VBAからpythonへのコンバージョンのプログラム変更はできた。

 

・指定したファイルを読み込む

・指定したファイル内のデータ処理を行う

・データ処理の結果をアウトプットする

実行速度は エクセル200行近くに対し、平均5~6秒程度、うーんやや遅いかも。

 

当然のことながら、VBAで得られたアウトプットデータとpythonから得られたアウトプットデータはあちこち異なってる(pythonの方でどっか間違えている)

 

ただし、一度VBAと同じ挙動が作れてしまえば、

コンバージョン自体はできると実証できたわけだから

あとは、ちょいちょい直せばよい。と前向きに考えることにした。

 

間違っているところの候補といえば

プログラム内では 文字列操作が多数ある。

 

文字列の置換

文字列の抽出

文字列のトリミング

文字列のエスケープ

 

VBAでできたものをpythonではpython用に書き換えてあげる必要がある

 

文字列の置換

VBA:Replace(変換値,"\"", "゛")

python:変換値.replace("\"", "゛")

 

文字列の抽出

VBA:Right(対象値,1)

python:対象値[-1:] 文字列スライシングというものを活用する

 

文字列のトリミング

VBA:Trim(対象値)

python:対象値.strip()

 

文字列のエスケープ

ダブルクォーテーションを表すには

VBA:""""

python "\""(バックスラッシュが必要)

 

ちょいちょいある違いをpython用にコーディングし直す必要があるわけだ。

 

そして更に厄介なのが、

pythonは基本、Noneが値に入ることになり、

このNoneは文字列結合などには組み込めないという仕様があるらしい。

 

Noneは値がない という意味で便利だが、文字列結合の際には

その変数がNoneかどうかを事前にチェックしてあげる必要がある。その上で、Noneなら""といった空文字列にリプレイスするなどする。

なかなかよくわからなかった三項演算子がここにきて利用する機会も増えてきたなあ(汗

 

おそらく、このあたりでとちって、うまくアウトプットされないのであろう。

とりま31日までには、終えたいところだ。

 


2023/12/25(月)

AKYの開発日記#10~

 

メリークリスマス

 

開発日記もはや10回目、不定期とあるが、ほぼ毎日更新している気も・・・まあ それはさておき、

 

VBA→python いまのところ壁という壁はないようだ。

思っていたよりもエクセルとの組み合わせがよい。

 

openpyxl このライブラリが必須であり、このライブラリをインストールするだけで、

pythonでエクセル操作が可能になるというもの。

 

ファイル操作

glob をインストールすると、VBAで行っていたファイル操作の代替ができる。

指定ディレクトリ内のファイル名の取得

なかでも驚いたのが サブフォルダ内のファイル取得だ。

 

驚くほど簡単だった。

 

これだけ。

files = glob.glob(curDir, recursive=True)

 

curDirは指定ディレクトリ、

curDir = curDir.replace('\\','/') + "/**/*" としている

 

recursiveをTrueにすると、サブディレクトリ内にまで再帰的に取得できるらしい。

curDirの中にもあるが「**」を使うとあらゆる中間ディレクトリに対応してマッチさせることができる。

 

VBAでは

FSO.GetFolder(directory path).SubFolders

FSOの中のGetFolderで代用して、再度同じサブを呼び出すというもの。

 

更に工程が短縮され、globの引数のrecursiveをTrueにする、ディレクトリ指定に「**」を入れるだけで更に簡単にサブフォルダを含めたファイル名を、一行で取得できる点はすばらし。

 

ファイル操作はそんなこんなであっという間に移植は終わる。

 

次はpythonからのエクセル操作の習得である。


2023/12/24(日)

AKYの開発日記#9 コーヒーブレイク2~

 

「プログラミング言語利用実態調査2023」(日経クロステック)に目を通したところ、もっとも使っているプログラミング言語に変化があったようだ。

以前は、javaが優勢であったが、今年は。「python」が優勢だった。

(python>java>javascript>C#>VBA>・・・・のようだ)

 

pythonの優勢の背景は、記事を引用するところ、pythonは主に人工知能(AI)の開発やデータ分析によく使われる言語のようだ。最近のChatGPTなどの人工知能(AI)技術の発展があるのであろう。

 

pythonは、↓の記事にあるように、かじり程度しかたしなんでない。

私自身、数年前まではプログラミングにはまったく縁のない環境で仕事をしていた。

そんななか、ここに至る数年は、VBAにはかなり携わってきた。VBAを使ったエクセルのデータ解析ツールもいくつか作ってきた。おかげ様でエクセルの操作のスキル自体は、結構上達したんかなとは思う。

 

次のスキルアップに考えているのが、ちょうどpythonだった。

VBAは、エクセルの操作がなんでもできるあたり、エクセルとの親和性はもっとも強いと思うが、どうもこのマクロというのが世間では、好まれないところでは好まれない環境でもあり、また、何より重い(=CPUを消費する、メモリリソースを消費する)

マクロ実行中は、基本、エクセルが使えない など不便なところもある。

 

そんなこんなで、今はpythonも習得しようとやっきになってる。

とりあえず今まで作ったVBAのツールをpythonでできれば、基本的なことは身につくものだろうと考え、着手しはじめたが、思ったよりエクセル操作も簡単にでき、ファイル出力などもあまり複雑な仕組みもないような感じだ。

 

 

― ちょっとブレイク。

最近、携帯ではまってるゲーム。家庭用ゲームをすっかりやらなくなり、コーヒーブレイク中など、ちょっとした合間に以下3つのパズル系にはまってる。

 

・「ロイヤルマッチ」・・・スマホの広告でよく出る王様のあれです。広告なし、Wifi不要のマッチ3パズル

 

・「すいかゲーム」・・・話題のあれです。上から落ちてくるフルーツを同じフルーツ同士に組み合わせ、すいかにするゲーム(公式ではスマホアプリは出してないようなので、亜流のものだと思います)

 

・「Jewel Sliding」・・・ブロックを1列以上揃えて消すパズルゲーム。下から一段ずつせりあがるブロックを天井にあたらないようにする、逆テトリスのようなイメージ。広告が多いけど、最近はこれが一番好きかも。

 


2023/12/22(金)

AKYの開発日記#8~

 

メインタスクの話

VBAで作ったツールをpythonへコンバージョンを行うこと。

今まで行ってたwin/mac対応のツール自体をpythonコードへ書き換えるというものだ。

昨日からは 余った時間のmac対応分をこちらにも割いて対応を進めてる。

 

python自体は、かじり程度ではあるが、何度か経験ある。

本格的な開発は今回がはじめて。

 

思ったよりExcelと親和性がよい。

また、ChatGPT先生もpythonは土俵のようで、いろいろな知識をもって、わからないところはすぐ対応してくれる。

 

pythonでは、エクセル操作において openpyxl というライブラリが不可欠なようで、それをインストールすれば、pythonでのエクセル操作があらかたVBAと似たようなことができるっぽい。

 

とりま、目立ったエラーが出ることもなく

 

ツールの主だった操作となる

・外部からのファイルの読み込み

・ファイルに対する処理

・ファイルに対して行った結果の出力

 

大別すると上の3つの工程(もちろんそれぞれは複雑に構成)だが、

この外枠だけの設計は一通りpythonで行えてる。

あとは、詳細のコンバージョンをすればよい。

 

最初は、すぐ新しい言語でいけるんかなと思ったが、思っていたより、pythonは難しい言語でもないみたいだ。拡張性もあるようだし、2023年プログラミング言語でいちばん使われているのが、pythonというのもうなずけるわ。 


2023/12/21(木)

AKYの開発日記#7~

 

マック版の処理速度が遅いのが、なかなか改善が見られない。

ただわかってきたことは、AppleScript自体が処理が遅いというわけではないようだ

 

環境を同じ状態にして単体で動作させたものとマクロから動作させたもので比較してみた

 

ファイル一枚あたり(エクセル120行あるデータを上から順にみていく。該当のデータがあれば、そのデータを順に出力させるというもの)。この120行内でループは3回使う)

 

アップルスクリプト単体:0.69秒(はやい(汗)

VBAマクロからの呼出:83秒(なんだ この違い)

 

次に問題となっている呼出の直前でブレークポイントを設置、ブレークした状態で

単体との比較をする

 

アップルスクリプト単体:0.69秒(はやい(汗汗

VBAマクロを直前でブレーク中断した状態でのアップルスクリプト単体:0.73秒(あれ?汗汗汗

 

ということは、VBAマクロが動いた状態で、アップルスクリプトを動かそうとすると遅くなっているということが だんだんわかってきた。

 

と同時にわからなくなってきたことが、解決方法である。

スクリプト単体で処理が速いということは、エクセルシートの参照、アップルスクリプト自体は問題が潜んでいる可能性が低くなったということだ。

 

同時使用時のCPUもメモリも特に気になる点は見られない。メモリをすげー使っているわけでもない。CPUも100%に全然いってない。

ただこの処理速度の違いと起こる条件などを俯瞰すると、何か解決方法がありそうなんだが。。。

 

だとするとマクロ実行中のエクセルシートとアップルスクリプト間のデータのやりとりに遅延が生じてしまっているのか。

 

うーん、なかなか最後の最後に難題にぶつかってしまった。

 

とりま、他にもやることあるので、この件は隅で考えることにしよう。


2023/12/20(水)

AKYの開発日記#6~

 

ファイル出力のプログラムで、処理速度の件とは別に一部、問題が見つかった。

その修正を行った。

 

ファイル出力は windowsではCreateObject("ADODB.Stream")を利用している。

マックでは、このオブジェクトが有効でないらしく、このシステム自体のコード部分が使えない。

よって、ファイル操作関連で代替したapplescriptで制御する必要がある。

 

applescriptでやりたいことはこうだ。

・ある表の上から下へ順に1行ずつ見ていき、ある条件に一致したデータがみつかれば、そのデータをテキストに出力させるというものだ。

 

CreateObjectでは、これをADODB.Streamで一行ずつ出力する。

applescriptではこれを writeメソッドで代替できるようだ。

applescriptでは ループで使うforやwhileの代わりに、 repeat文なるものがあるので、これで代替すればよい、ただ私の勉強不足からきているのかこのループの処理速度がなんとも遅い・・・

 

問題はこのapplescriptからテキスト出力した際の文字化けの件である。

日本語がないサンプルばかりで対応していたせいか、確認がひとつ遅れてしまったが、

日本語の箇所が文字化けとなって表示されてしまうことがわかった。

 

(該当のコード部分)

set fileHandle to open for access ファイルパス変数 with write permission

write 変数 to fileHandle

 

-- ファイルパス変数にはファイルパス(絶対パス)が入ってます。

-- 変数には日本語入りの文章が入ります

 

どうもこれだとコードが足りなかったみたいで、調べていくうちに以下のコード追加が必要だったことがわかる。(たどり着くまでにはここで書けない位時間を要してしまったが)

 

set fileHandle to open for access ファイルパス変数 with write permission

write 変数 to fileHandle as <<class utf8>>

 

as以降のコードが追加コードで、これにより文字コードを指定する必要があるようだ。

とりあえず、文字化けの件は、writeに該当する箇所は、すべてこれを入れ、解決した。

 

兎角、winとマックは勝手が違うのだな~と改めて感じさせられた。


2023/12/19(火)

AKYの開発日記#5~

 

マック対応が一通り終わった。

 

終わっての一言

・・・処理速度遅いよ~(嘆

Win:2秒

Mac:20秒

※1ファイルあたり

 

AppleScript内でループを使ってテキストに書き出す箇所があり、その挙動をリアルタイムで見ていると、どうもそれが主要因のようだ。

 

クライアントへ出すには、この遅延は致命的だな~

なんとかしないと、、、というところ。

アップルスクリプトの試練はまだ続く・・・

 

言語VBA

Win→MACへの対応箇所

・ディレクトリの参照(FSOが使えないので、アップルスクリプトで代替)

・ファイル名の取得(FSOが使えないので、アップルスクリプトで代替)

・ファイルの出力(CreateObjectが使えないので、アップルスクリプトで代替)ここが今の課題

・文字コードの統一(¥(バックスラッシュ)をWindows上できちんと入力しないとマックで文字化けする)

・改行コードの統一(vbNewLineという便利な命令文を知った。従来のvbCrLfはマックでは、余分な改行が追加されたりと改行が変な感じになってしまう)

 


2023/12/18(月)

AKYの開発日記#4 コーヒーブレイク1

 

巷では、ジェミニ、コパイロットなどChatGPT以外にも生成AIの動きが加速してきている。

私もChatGPTはプログラムで作成に迷ってしまった際などにコード補完、アイデア補完に活用している。

 

たぶん得意な言語などがあるのだろうか、もしくは私の要件定義が雑に伝わっていないのかもしれないが、pythonの場合、生成AIのコードはだいたいそのままでも動く。

VBAの場合、対応はしているようだが、だいたいそのままではコードが動かない。大抵どこかでコンパイルエラーを起こす。

 

それでもちょっとの修正で済む状況なので、詰まると調べて時間がかってしまうなどで全く進まない時期と比べると、大変便利な世の中になったと思う。

 

ただ、セキュリティ対策は生成AIではどこまでフォローするのであろうか。うーん、気にはなるところだ。

 


2023/12/16(土)

AKYの開発日記#3~

 

合間を縫ってアップルスクリプトの勉強中

やりたいことが以下、対応できた。

 

・FSOのコンバージョンは対応できた。

 

 ローカルに置いておくと忘れそうなんで、対応できたコードは残しておく

 私自身、かなりこのコンバージョンには chatGPTに相談やら、ネットで調べるやら試すもなかなかうまくいかずもし困っている方で、ほんのちょっぴりでも参考になれば幸いです。

 

 -参照ディレクトリの呼出

  code倉庫

 -ファイル名取得(サブフォルダ含める)

  code倉庫

 

私自身、特定の誰かに師事して、開発を携わったわけでもなくほぼ独学で対応してきていることなので(一番師事しているのはChatGPT先生かもしれないw)、コードが不規則性があったり、雑なのは多少ご勘弁ください。

 

とりま、FSOの件は片付いた。

なんかどうでもいいがFGOみたいだ。やばい、FGO最近ぐだぐだイベントやってないや、、、

 

もう一つ厄介なこととして浮上しているのが

文字化けである。

 

「¥」、すなわち バックスラッシュである

バックスラッシュは、マックでは文字コードの認識の関係からか

 

通常 右下にあるであろう、「ー」「バックスラッシュ(/(の反転))」「ろ」

のキーボード側でなければだめらしい

 

右上にある「¥」「|」「_」の ¥マークだとマックでは文字化けします。

これが厄介なのが、

Win: ディレクトリ¥ディレクトリ¥ファイル名.xlsx

mac: ディレクトリ/ディレクトリ/ファイル名.xlsx

 

とディレクトリの区切り文字が異なるという点

これに対応できるようにしないと、マックでは、ディレクトリ参照やファイル名呼出に苦労する

また、私が現在対応しているツールは、このファイル名参照の箇所や円マークがところどころにある。しかも円マークはどっちで入力したかもわからない(Winはどちらでも通用する)

 

ただ、マックで動いたとしても マックで保存したあと、Winに戻すとどうもmac側で修正が入るのか、今度はWinで不具合が起きてしまう。

 

・・・特にツールを1つにまとめろなど制約もないし、WinとMacは別々に作ろう・・・この先何が起こるかもわからないので。


2023/12/15(金)

AKYの開発日記~#2~

今朝の夢でやたら主人公?がさながら刑事ドラマで追っかけているシーンかのように、走り回る夢をみた。朝起きたときには、夢だというのになんか長距離を走った後のように現実ではどっと疲れていた。

 

合間を縫ってアップルスクリプトの勉強中。

 

set~to~で代入のあたりは、COBOLのMOVE文を思い出す。

すごい難しい文法というわけでもないような感じなので、

とり、書き方の違いを中心に学習する。

 

ファイルの出力周りのVBAからのコンバージョンはなんとなく掴めてきた。

 

ただ、どうにもテキストに書き出すあたりの処理の遅さが何とも気になる(こちらの書き方のせいでもあるのだろうが)


2023/12/14(木)

AKYの開発日記~#1~

VBA言語のツールにおいて、Mac非対応という指摘が先日あった。

他にもタスクがあるので、Mac対応は水面下で準備を進めていく。

 

VBAはマックで対応すべく障壁がいくつかある

大きい点

・FileSystemObject(FSO)が使えない

・CreateObjectが使えない

あとは

・文字化け(\マークは バックラスラッシュで打つ必要がある。\マークのキーでストロークするとmacでわけわからん字に文字化けする。

 

このFSOなどが非対応を対応にするには

AppleScriptに代替する必要があるらしい。AppleScriptはスクリプト言語の一種。

AppleScript・・・初耳です。

 

新しい言語の勉強が必要など課題が山積み。