猫とコード

化学メーカーでweb開発している猫大好きエンジニアの備忘録です。

趣味とは研究(探求)である

数日前にはてなブックマーク人気エントリーでフミコフミオ氏の記事を拝見してから、ファンになって氏のブログを読んでいます。 旧き良き(良いかは諸説ある)時代のテキストサイトの趣があり、懐かしい気持ちになりました。

氏の本題たるところの記事ではないかと思いますが、下記の一文がなるほど!と思ったのでメモしておきます。

趣味は人生を豊かにする。ただしその趣味とはレジャやスポーツとは異なるものであって、著者はそれを研究(探究)と位置付けている。研究といっても大袈裟なものではなく、日々の疑問や不思議を自分なりのやり方で調べ、検証することであると

森博嗣著「ジャイロモノレール」は超高齢化社会を生き抜くためのサバイバル・マニュアルなので読んだほうがいい。 - Everything you've ever Dreamed

「著者のいう趣味とは研究(探求)である」

趣味という表現に悩ましい思いを抱いていました。

趣味とは享楽的で受動的なものの趣を強く感じ、「趣味としてやる」を頭に付けるとどうも違和感を覚える次第でした。

趣味でやるのにこんなに苦労して…という思いもありましたが、研究(あるいは探求)であると考えると納得感があります。

私事の関心について調べ、再現可能な方法で確かめ記録し、結論を述べる。

趣味で苦労していいんだ!という気持ちになりました。

2024~2028年5ヵ年目標

2021~2023年の3ヵ年目標では将来にわたって精度の高い予測をするのが難しいと思いました。COVID-19の流行のような予期せぬこと(我が家の場合は第二子の誕生)などがあって、目標の実現度のみならず、目標設定の意味や意義が損なわれる可能性があると感じました。

また短期的目標を繰り返すだけでは意味がなく3年、5年を通して実現したいことを明確化する必要があると考えました。

5ヵ年目標テーマ「キャリアの屋台骨」を作る

2028年には39歳になります。そのころにはさらに10年後(49歳)に繋がる戦略を持っていたいと思いました。そのために5年後の時点では自分のキャリアの骨格となる部分が見えていないという思いに至りました。

MITシャイン博士のキャリアアンカーの考え方を基として、僕の場合は「純粋な挑戦」を中心に組み立てることにしました。

各年の目標はこれまでは4軸で考えていた軸を3軸に整理しました。仕事/家族/趣味などとぱっきり分けてしまうと、二律背反しなくても済むもの(例えば「家庭と仕事」や「給与収入と趣味の支出」など)が対立構造になってしまうため、要素を融合させたものを軸としました。

内容 備考
①仕事/お金 軸 就いている職業での貢献と、仕事に限らず収益を得られる活動 仕事も趣味も同じ軸とし経済性を高められることを軸とする
②人/家族 軸 職場や趣味で出会う人、また家族とのコミュニケーション 人との関係を大切にして、付き合いを意識的に行うことを軸とする
③挑戦/趣味 軸 自由時間や仕事など①②を含んで総括的に挑戦する 仕事、趣味、人付き合い、経済性すべてで挑戦することを是とする

そのうえで各年のテーマを参考に毎年各軸の目標振返り・設定するという形にしようと思います。

テーマ 内容
2024年 これまでやってこなかった新たなチャレンジを3つ増やす 新たな挑戦を各軸で行うことを目標とします
目標 備考
①仕事/お金 より多くの仕事をもらえるように交渉する 業務内で知らない仕事を覚えてできることを増やしたい
②人/家族 自ら誘い遊びや学びの場を定期的に開催する コミュニケーションを目的とした自分のコミュニティを作りたい
③挑戦/趣味 普段触れていない技術に触れ、新しいスキルや表現を習得する 学びの場をみずから求めてそれをアウトプットにつなげたい
テーマ 内容
2025年 仕事の質をあげる。量を増やす とにかくできることを増やして仕事におけるポジションを獲得したいです
2026年 家族と子供たちの思い出を増やす 翌年から小学校入学で生活が変わるのでその前に沢山出かけて遊んで思い出を増やしたいです。
2027年 猫たちとの時間を作る 一番上の猫ちゃんが10歳を迎えます。ゆっくりと彼らと過ごせる時間ももうあまり多くないと思います。猫ちゃんたちのニャン生が何より充実できるように…。
2028年 49歳までのキャリアプランを作る 5ヵ年の大目標のキャリア(挑戦できる土台)の屋台骨を作り上げ、49歳までの10年間をどう過ごすかを見通せるようになりたいです。

2021~2023 3ヵ年目標振返り

2021~2023年の目標と振り返り

2020年に立てた目標が次の通りです。ちょうど第一子が生まれる直前で「スポーツ(運動)」「技術」「仕事」「家族」の4軸で目標を設定しました。評価方法は次の通りです

評価 達成度
A 想定通り達成
B 8割程度達成
C 6割程度達成
D 4割程度達成
E 未実行

但し評価はかなり主観です。

2021年

目標 内容 自己評価 評価内容
2021年 スポーツ 減量-5kg 78kgから73kgにダイエット A 70kgに但し3年後にリバウンドで76kg
2021年 技術 Webサービス2本 何らかのサービスを2個作る C Vue.jsの勉強で「買ったつもりで貯金」サービスを作りました。
2021年 仕事 大きな内製システムを開発する 自分が主担当になり新規でシステム開発する A 今も元気に動いている社内システムを作りました。苦労しただけにかなり堅牢に動いています
2021年 家族 育児。子供の成長を記録する 子供と深くかかわり3歳までに信頼関係を築くことが目的 A 第一子の時は育休は取らずまじで苦労しました。子供一人目でも寧ろ一人目だからこそパパは育休取った方がいいです。ここだけで400文字くらいかけます

2022年

目標 内容 自己評価 評価内容
2022年 スポーツ 子供とできるスポーツを体験する 球技なり何なりを子供と一緒にやる D 1歳児が何ができるか完全に理解不足。でも公園で一緒にめっちゃ遊びました
2022年 技術 OSSに参加する OSSコミッターになる D 業務で使ったe-Learningシステムの不具合をGithubでココのコード間違ってますよ!とIssueあげましたがpull requestはできず…。指摘事項が取り込まれてほくほくでした。
2022年 仕事 VBSライブラリ化 システム間で共通のライブラリパッケージのようなものを作りそれを用いて開発する B 結論からいうと似たようなことはしたのですが、逆にメンテナンス性が落ちました。IDEとかでパッケージサポートがない以上、システム間にわたって変更が共有される仕組みは怖くて作れず…。結局1つのシステム内で共通関数を使うのみに落ち着きました。
2022年 家族 旅行に行く 子供たちに色々なものを見せたい A 2022年1月に第二子が生まれて6ヵ月の子を連れて飛行機で妻の実家に里帰りしました。めちゃ大変でした。下の子が9ヵ月の時に車で1泊旅行にいきましたが飛行機と比べたら楽でした

2023年

目標 内容 自己評価 評価内容
2023年 スポーツ 競技会に出る 何らかのスポーツを始めて記録会や競技会に出る E スポーツは始められず…!!未実行でした。
2023年 技術 登壇する 何らかの技術カテゴリで登壇して発表する A 2021年~2022年に企業の技術研究会に所属してリーダーとして発表しました。2023年はその内容で論文書きあげて情報処理学会に掲載してもらったのでこれはもうA Tierです(Tierじゃないけど)。大変でした。
2023年 仕事 スマホ対応アプリケーションの開発 PCとスマホiPad両対応のUI、システムを作る B 結論からいうと似たようなことはできました。本当はネイティブアプリが作りたかったのですがWebでUIはCSSライブラリ、仕組み面はVBSで疑似的なAPIみたいなものを作りJSで制御するという仕組みにしました。及第点位はあげたい。
2023年 家族 夫婦の時間を作る 子育てに一区切りつけて夫婦のコミュニケーションの時間を意識して作る B 年末ぎりぎりで実母に子供たちを見てもらい1/4日くらい時間が作れそうです。四半期に1日くらいは定期的に時間を作るようにしたいです。

3ヵ年で目標設定したのははじめてで、それまでは毎年超ざっくりとした「こんな感じ~」みたいな目標でした。

やっぱり未来になるほど目標精度が落ちるなぁと思いました。

2024年からは5ヵ年目標として大テーマ「キャリアの屋台骨を作る」と各年の個別テーマを毎年末に作成する感じでいこうかと思います。|

WindowsリモートデスクトップでCredSSP 暗号化オラクルの修復である可能性が出たときの対処

リモートデスクトップが特定のコンピュータにつながらない

会社PCを入れ替えたので以前対応したのがまた出てくるようになりましたのでメモです。 リモートデスクトップで接続先のコンピュータ/サーバのWUが最新でない場合(ほかにも条件あるかも)に下記のようなアラートがでて繋がらなくなります。

対処

  1. Win+R「gpedit.msc」でローカルグループポリシーを開く
  2. コンピュータの構成>管理用テンプレート>システム>資格情報の委任>暗号化オラクルの修復>ポリシー設定
  3. 有効にチェック。保護レベル>脆弱 に変更し「OK」

上記でアラートがでなくなり、リモートデスクトップがつながるようになります。

Windows10(LTSC 21H2)でClassicASPのODBCエラーが表示されない

本件未解決です。

  • ODBC経由でエラーの発生する(正しくない)SQL文を発行したとき、Windows10 19Hではエラーが出ていたが、でなくなる
  • 他のClassicASPのエラーは表示する
  • SQL文エラーが表示されない。

ODBCドライバの何かが変わった?ようだが詳細がわからない。

PS4 APEX LEGENDS のCE-34878-0エラーと解消方法

エラーCE-34878-0が頻発

S19からPS4のAPEXで下記のエラーでゲームが止まることが増えました。(ただS18から始めたので過去も起きていた問題なのかは不明)

 

f:id:yurukaiha:20231113155052j:image

 

ps4 proで発生していました。詳しい端末番号が確認できませんでした…

 

解消方法

設定→初期化→クイック

ps4を初期化したところ解消されたように見えます。

 

外部ストレージにps4自体のバックアップがある場合は、復元することで解消される場合もあるようです。

 

下記ブログを参考にしました。エラー自体はps4のストレージエラーに起因するようです。再起動しても解消せず、メモリリークではなさそうでした。

最近、PS4でCE-34878-0(エラー)をよく見かけるようになった→(追記)原因分かりました - Miya's Textbox

 

 

Cobol初学者の忘備録

仕事でCOBOLで化石発掘をすることになりましたので忘備録。

記述領域

COBOLは桁数で何を記述するかが決まっている。 下記のとおり

桁数 名称 内容
1-6 シーケンス番号領域 プログラムの行番号を記述する。行番号はエラーメッセージに利用される
7-72 A領域 ソースコードを記述する領域
73-80 B領域 コメントを記述する領域

DIVISION.

プログラムを4つの論理的領域に分ける。 各領域は次の通り

DIVISION名 内容
IDENTIFICATION DIVISION. プログラムの基本情報箇所。プログラム名、作成者等々
ENVIRONMENT DIVISION: 環境情報の箇所
DATA DIVISION: データ記述箇所。変数、レコード等々。WORKING-STORAGE SECTION.で宣言
PROCEDURE DIVISION: プログラム記述箇所

SECTION.

プログラム記述領域において処理ブロックを作成する。 (サブルーチンのようなもの)

PERFORM セクション名で呼び出しができる。セクションの処理が終了すると呼び出し元に戻る。

下記の例ではMAIN-SECTION.からスタートし、PROCESS-SECTION-A.⇒PROCESS-SECTION-B.の順で呼び出しを行う。

      IDENTIFICATION DIVISION.
      PROGRAM-ID. hogehoge.
      
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01 Variable-A PIC 9(3) VALUE 100.
      01 Variable-B PIC 9(3) VALUE 200.

      PROCEDURE DIVISION.
      MAIN-SECTION.
          DISPLAY 'Main section.'
          PERFORM PROCESS-SECTION-A
          PERFORM PROCESS-SECTION-B
          DISPLAY 'Program completed.'

       PROCESS-SECTION-A.
          DISPLAY 'Processing Section A.'
          COMPUTE Variable-A = Variable-A + 10.

       PROCESS-SECTION-B.
          DISPLAY 'Processing Section B.'
          COMPUTE Variable-B = Variable-B - 20.

JavascirptのGETパラメータのPDFリンクを読み取りiframeに展開する.

この手のはいつもClassic ASPで書いてますが,ASP使わなくてもJSで書けたことがわかりました.

ただそのまま読み込んでURLをIframeに移すのはあまりよくないのでチェックが必要なことと,JSを無効にしているとページが表示されないこと(iframeの基本のクロスオリジンの理解も必要)なので没になりました.

    $(function(){
      var currentUrl = window.location.href;
      var parameterString = currentUrl.slice(currentUrl.indexOf('?') + 1);
      var parameters = {};
      parameterString.split('&').forEach(function (pair) {
        var keyValue = pair.split('=');
        var key = keyValue[0];
        var value = decodeURIComponent(keyValue[1] || '');
        parameters[key] = value;
      });
      var pdflink = parameters['pdf'];
      if(pdflink != undefined || pdflink != ''){
        pdfstr = pdflink + "#toolbar=0&navpanes=0"
        $("#frame").attr("src",pdfstr);
      }
    });
...
</head>
<iframe id="frame" width="100%" height="740px" src=""></iframe>
</html>

JavaScriptでクリップボードの画像をリサイズしてキャンバスに張り付ける

いい参考コードが見当たらず苦戦していましたが,ChatGPTに聞いたら一発でした.

チャットGPTに聞いたこと

JavaScriptでクリップボードから画像を張り付けてCanvasでアスペクト比は変えずに縦横どちらかの最大の大きさが800px以下になるように変形し,Canvasサイズも同じ縦横の大きさになるように描画するコードを教えて

動くコードでしたがちょっとニュアンスが違い,実装したい仕様とことなりました.返答のコードはCanvasサイズを800pxにするコードか,Canvaサイズを変えずに中の画像を長辺が800px以下にするコードの2通りの返答でした.

二つを組み合わせて下記のようにしました 下記で動きます.

動くコードも嬉しいけど何よりコメントが本当にうれしいです. 全部にはさすがに付けないけど,ここは他の人(半年後の自分含む)が見たら理解に数秒かかるだろうな~というポイントにコメント残すようにしているのでデフォルトでしっかりコメント付けてくれるのがうれしいです.

<!DOCTYPE html>
<html>
<body>
  <canvas id="canvas"></canvas>

  <script>
    // クリップボードから画像を貼り付けた時に実行される関数
    function handlePaste(event) {
      var items = event.clipboardData.items;

      // 画像がクリップボードに存在する場合
      if (items && items.length) {
        var file = null;

        // 画像データを探す
        for (var i = 0; i < items.length; i++) {
          if (items[i].type.indexOf('image') !== -1) {
            file = items[i].getAsFile();
            break;
          }
        }

        if (file !== null) {
          var reader = new FileReader();

          // ファイルの読み込み完了時に実行される関数
          reader.onload = function(event) {
            var image = new Image();
            image.onload = function() {
              var canvas = document.getElementById('canvas');
              var context = canvas.getContext('2d');

              var aspectRatio = image.width / image.height;
              var maxWidth = 800;
              var maxHeight = 800;

              if (aspectRatio > 1) {
                // 横長の場合
                var newWidth = Math.min(image.width, maxWidth);
                var newHeight = newWidth / aspectRatio;

                if (newHeight > maxHeight) {
                  newHeight = maxHeight;
                  newWidth = newHeight * aspectRatio;
                }
              } else {
                // 縦長または正方形の場合
                var newHeight = Math.min(image.height, maxHeight);
                var newWidth = newHeight * aspectRatio;

                if (newWidth > maxWidth) {
                  newWidth = maxWidth;
                  newHeight = newWidth / aspectRatio;
                }
              }

              // キャンバスのサイズを設定する
              canvas.width = newWidth;
              canvas.height = newHeight;
              
              // 画像の縦横比を保持しながらキャンバスに描画する
              context.drawImage(image, 0, 0, newWidth, newHeight);
            };
            image.src = event.target.result; // 読み込んだファイルのデータURL
          };

          // ファイルを読み込む
          reader.readAsDataURL(file);
        }
      }
    }

    // クリップボードからの貼り付けイベントを検知し、handlePaste関数を実行する
    document.addEventListener('paste', handlePaste);
  </script>
</body>
</html>

Local環境のSQL SERVER 2016のSAログイン許可方法

発生したこと

localに立てたSQL SERVERにSAでログインできずにこまった

ODBC(32bit)で接続情報を立てようとしたところ,sqlstate 28000 (error 18456)のエラーが発生.

解決方法

下記サイトを参考にしました

How to Fix Login Failed Microsoft SQL Server Error: 18456 - Appuals.com

1.SQL Server Management System(SSMMS)でSAパスワードを変更

SSMSをインストールして,Windows認証でlocal環境にログイン.

saを右クリックでプロパティを開き,パスワードを設定. (初期設定パスワードは「RPSsql12345」らしいですが検証できず…)

状態でログインが許可されているかも確認します.

2.SQL Server認証モードを許可する

サーバを右クリックしプロパティの「セキュリティ」で「サーバ認証」を「SQL Server認証とWindows認証」に設定.

3.SQL Server 2016構成マネージャを立ち上げる

構成マネージャの「SQL Serverネットワーク構築」>プロコトルでTCP/IPを有効にする(初期設定は無効になっているようです)

上記手順でsaアカウントでのSQL Server認証ができるようになりました.

VerticaでSelectでPrimaryKeyを確認する

やりたいこと->Select文でPKを含む構造表を出力する

Verticaのデータ確認をvsqlやDBeaverから自作のDB閲覧ツール(localのclassic asp)に切り替えてから,主キー含む構造表を確認したいことがありました.

出力したい形式

Vertica はv_catalog.columnsの「data_type 」で型名と大きさまでちゃんと出してくれて偉いです.

column_name data_type NULL許可 PrimaryKey
列A varchar(10) NO p
列B varchar(5)
列C numeric(18,0)

使用するシステムテーブル・列とSQL

SystemTable 内容・備考
v_catalog.columns column_name 列の名前
data_type 列の型(大きさ).小文字で出ますがDDL作成時は大文字にしないとエラーになる.varchar->VARCHAR
is_nullable NULL許可の場合[1]が入る
PRIMARY_KEYS constraint_type 主キーの場合[p](主キーではない場合はnull)

WHERE句のc.table_schema,c.table_nameを指定して絞込みます.

SELECT 
    c.column_name
    ,data_type 
    ,CASE WHEN c.is_nullable = 1 THEN '' ELSE 'NO' END AS 'NULL許可' 
    ,IsNull(constraint_type,'') AS 'PK' 
FROM v_catalog.columns c 
LEFT JOIN PRIMARY_KEYS k 
    ON c.column_name = k.column_name 
    AND c.table_name = k.table_name 
    AND c.table_schema = k.table_schema 

WHERE c.table_schema='schema' 
    AND c.table_name='table' 
ORDER BY c.ordinal_position; 

Base64バイナリで受け取ったファイルをStreamで画像として保存する

長くなったのでVBS基本構文から分離しました

Base64バイナリで受け取ったファイルをStreamで画像として保存する

BASP21を使用

先頭でページの文字コードUTF-8にしておきます

<%@ CodePage=65001 %> 

BASP21でバイナリを読み込む

Set bobj = Server.CreateObject("basp21")
byteArray = Request.BinaryRead(Request.TotalBytes)
' 画像送信時にフォームのnameに「image」と名前を付けて送信しておく
sarray = bobj.FormBinary(byteArray,"image")

読み込んだバイナリをStremでWindows-1252(utf-8のWin版かな?)文字列に変換し,変数「str」に保存. 「image,base64の画像本体」となっているのでカンマでSplitしてbaseに保存. このとき,<%@ CodePage=65001 %>ASPファイルを明示的に文字コードUTF-8の宣言しておかないと文字化けしてうまくいかなかったです.

dim stream : set stream = server.CreateObject("ADODB.stream")
stream.type = 1 'TypeBinary
stream.mode = 3 ' read write
stream.Open
stream.write(sarray)
stream.Position = 0
stream.Type = 2 ' TypeText
stream.Charset = "Windows-1252"
str = stream.ReadText ' binary to string
stream.close
set stream = nothing

base = Split(str,",") 

base(1)の本体部分をDOMDocumentのBase64Dataを使ってBase64デコードする.

' string Base64 decode
Set objXML = Server.CreateObject("MSXml2.DOMDocument")
Set objDocElem = objXML.createElement("Base64Data")
objDocElem.DataType = "bin.base64"
objDocElem.text = base(1) 'the base64-encoded string
imgdata = objDocElem.NodeTypedValue

imgdataに画像バイナリが格納されているのでStreanでpng画像としてサーバに保存します.

' 画像ファイルを保存
FileName = "D:\folder\picture.png"

set stream = server.CreateObject("ADODB.stream")
stream.type = 1 'TypeBinary
stream.mode = 3 ' read write
stream.Open
stream.write(imgdata)
stream.SaveToFile FileNa

今回はJPG・PNG問わずPNGで保存するような仕様にしました.送信時にJavaScriptCanvasに一度描画して画像縮小しているため,バイナリに拡張子の情報自体がないのだと思います.入力ファイルに拡張子が存在する場合,Streamでの画像保存時に元の拡張子を考慮する必要があるかもしれません.

javascriptでquerySelecterAllをeachで回す

querySelecerAllで該当するDOMをノードリストにする

このケースではinput type="hidden"の全てのDOMを選択した.

let nodes = document.querySelectorAll("input[type='hidden']");

ノードリストのforEach関数で1要素ずつ抽出して処理する

全要素を処理したい場合ノードリストの関数で回すのが便利そう

nodes.forEach(n => {
    n.value = '';
}) 

querySelecterAllの色々

// name=checkでかつcheckboxが選択されているものを抽出
document.querySelectorAll('input[name="check"]:checked')

// type=checkboxでname=checkのものを抽出
document.querySelectorAll('input[type="checkbox"][name="check"]')

Verticaで新規テーブル作成と確認を行う

Verticaにログイン

vsql
passrod:******

CREATE TABLE

create table schema.tablename (col1 VARCHAR(255) , col2 VARCHAR(255),col3 VARCHAR(255));

小文字のvarcharだとcatalog.varcharとなってしまうため,大文字でVARCHARと記述.

確認

\dt

ブラウザSessionを途切れないようにタイマーで自己更新する

Session情報を失いたくない.

15分間隔にSetTimeoutでタイマー処理してリロードで更新.

       setTimeout(function(){
                location.reload();
            }, 900000)

結局作ったはいいけど,Session使わなくて不要になった.

また同じものを作る機会がありそうなのでメモです.