サポンテ 勉強ノート

サポンテの勉強ノート・読書メモなどを晒します。

JXA で paiza のスキルチェックに挑みたい

はじめに

 JavaScript を勉強中で paiza のスキルチェックを JavaScript で書きたい方向けの記事です。

 提出コードは node.js ですが、macOS なら標準でインストールされている「スクリプトエディタ.app」と「Safari」を使って JavaScriptデバッグができます。

 paiza の下記ページにある JavaScript 用サンプルコードを、JXA で書くと以下のようになるでしょう。

paizaプログラミングスキルチェックの値取得・出力サンプルコード | ITエンジニア向け転職・就活・学習サービス【paiza】

 最初に書きましたが、最終的な提出コードは node.js 向けに再度編集が必要です。

スクリプトエディタ.app を使う場合

 スクリプトエディタ.app を使って開発・デバッグを行う場合は、値の受け取りに標準入力が使えないため以下のようになるでしょう。

 console.log の結果は、Safari の Web インスペクタに出力されます。

debugger;

var lines = 
`2
2 5
3 4`
.split("\n");

var N = lines[0];
for (var i = 0; i < N; i++) {
    var line = lines[i + 1].split(" ");
    console.log("hello = " + line[0] + ", world = " + line[1]);
}

VS Code を使う場合

 VS Code を使うと、入力値のファイルとスクリプトファイルを別々にできます。値の受け取りを、paiza 同様に標準入力から受け取る場合は以下のようになるでしょう。

debugger;

var lines = function () {
    let u = $.NSUTF8StringEncoding;
    let d = $('').dataUsingEncoding(u);
    $.NSFileHandle.fileHandleWithStandardOutput.writeData(d);
    d = $.NSFileHandle.fileHandleWithStandardInput.availableData;
    let _STDIN = $.NSString.alloc.initWithDataEncoding(d, u).js.slice(0, -1);
    let lines = _STDIN.split("\n");
    return lines;
}();

var N = lines[0];
for (var i = 0; i < N; i++) {
    var line = lines[i + 1].split(" ");
    console.log("hello = " + line[0] + ", world = " + line[1]);
}

Safari 側の準備

 あらかじめ、下記の Web サイトを参考に Safari の「開発」メニュー > (自分の Mac の名前) > 「JSContexts の Web インスペクタを自動的に表示」をチェックしておきます。

JXAのデバッグにSafariのWEBインスペクタが使える - DTPab

おわりに

 node.js の環境構築をしないで手っ取り早く JavaScript のコーディングを始めたい方向けです。

 サポンテは環境構築終わっていますが、Apple 信者なのとどうせ JXA は使うので、やり方を考えてみました。

参考

JXAで標準入出力、エラー、パスワード入力、ログ出力 - Qiita

JXAのデバッグにSafariのWEBインスペクタが使える - DTPab

ヒアドキュメントを疑似的に使う | JavaScript逆引き | Webサイト制作支援 | ShanaBrian Website

JXA の基本 - Paepoi

エンジニアと四十肩

はじめに

 サポンテはよく四十肩になります。以前はキーボードの所為かとも思っていたのですが、どうも最近それだけではないような気がしてきました。考えられる(思い当たる)原因と予防法を記しておきます。

なったらどうするか

 受診するのは「整形外科」です。初めどこの医者を受信したら良いか分からず、近所にあった鍼灸院に行ってお金と健康を無駄にしました。

 この「どこに行けばいいか」という情報は、意外と見つからないのです。

原因

  • 冷え
  • 目の疲れ
  • 過集中
  • キーボード
  • 姿勢

予防:冷えについて

 少しでも肩周りが「痛いな」「固いな」と感じてきたら、貼るカイロを背骨の中心から痛い方の側に貼ります。暑さは苦手なのですが、予防のためなるべく体を冷やさないようにしています。

 またこれは腰痛も同じです。「なんか今日、寒くて痛いかも」「痛くなりそうかも」と感じたら腰にカイロを貼っています。

 そのためカイロ(貼るタイプ)は季節を問わず手元に備蓄しています。

予防:目の疲れ

 仕事が忙しくなってくると、当然あちこちに疲労がたまってきます。目も例外ではありません。

 目に疲れがたまってきたと感じたら、オフの時は目を酷使するようなゲームや映画鑑賞、読書などは控えて、読書の代わりにポッドキャストを聞いたり散歩したり、別のことをするように心がけています。

予防:クスリ

 「アリナミン メディカル GOLD」は、けっこう効きました。高価な薬ですが、まあ整形外科のお世話になってリハビリに何ヶ月も通うともっとずっと高くつくので、それよりはましだと思っています。

予防:過集中、キーボード、姿勢

 タッチタイプが高速にできると嬉しくなって、どんどんピッチが上がっていって、姿勢も前のめりになって...と、どんどん「凝り固まって」いってしまいます。四十肩は肩間接の周辺で起きる様々な部位の様々な症状の「総称」です。集中しすぎると「炎症」「血流の悪化」「筋肉の硬化」など併発しやすくなります。

 仕事は忙しいかもしれませんが、いったん立ち止まって次のように考えています。

  • いくつかの作業は繰り返しになっていないか(自動化できないか)
  • 今、立ち止まって作業工程を見直すことで、将来の同じ業務で生産性を上げる事ができるのではないか
  • 立ち止まる事で発生する作業の遅れは、上記でカバーできないか

予防:運動

 いったん発症すると、胸を開く動作がつらくなります。ですがそれが筋肉がこわばってしまっている証拠らしいので、なるべく胸を開く運動を心がけています。ストレッチポールの上に寝そべるのが効果がありそうです(持っていませんが)。

若い人たちへのお願い

 身体、壊さないでくださいね。

 なにか仕事を振られたとき、最大のパフォーマンスで取り組みたいと思うかもしれません。手が遅いことで、評価が下げられてしまうと恐れているかもしれません。

 しかしながら最初のうちに慌てて作ったものは、しばしば品質がいまひとつです。三時間で仕事が片づいたら、上司に報告する前にもう三時間を使って振り返りを行ってください。その振り返りを元にして次の仕事を行えば、同じ三時間でもより高い品質の仕事ができるかもしれません。はじめのうちの仕事が遅いという印象は、すぐに返上できるでしょうし、上司もきっとそれを望んでいます。

【mac】最後にスクリーンショットを撮った矩形範囲を取得する

はじめに

 macOS で決まった範囲のスクリーンショットを撮りたい場合、「Cmd + Shift + 5」でスクリーンショット.app を起動してマウスで範囲選択します。

 この範囲は次に起動したときも同じ範囲が選択状態になっているため、どこかに記憶されているはずです。その値を取得すれば、screencapture コマンドを使って自動化できるかもしれません。テストの自動化など、応用が広がります。

記憶されている場所

 記憶されているのは ~/Library/Preferences/com.apple.screencapture.plist です。

シェルで取得してみる

 下記のシェルで取得できました。screencapture コマンドに渡しやすい順番にカンマ区切りで表示しています。

#!/usr/bin/php
<?php

// 最後にスクリーンショットを撮った矩形範囲を取得する
$top = `/usr/libexec/PlistBuddy -c "print :last-selection:Y" ~/Library/Preferences/com.apple.screencapture.plist` * 1.0;
$left = `/usr/libexec/PlistBuddy -c "print :last-selection:X" ~/Library/Preferences/com.apple.screencapture.plist` * 1.0;
$width = `/usr/libexec/PlistBuddy -c "print :last-selection:Width" ~/Library/Preferences/com.apple.screencapture.plist` * 1.0;
$height = `/usr/libexec/PlistBuddy -c "print :last-selection:Height" ~/Library/Preferences/com.apple.screencapture.plist` * 1.0;

$range = [trim($left), trim($top), trim($width), trim($height)];

// 表示する
echo implode(',', $range) . "\n";

環境

 以下の環境で動作確認しました。

ProductName:   Mac OS X
ProductVersion: 10.15.7
BuildVersion:   19H1713
PHP 7.3.29 (cli) (built: Aug 15 2021 23:10:16) ( NTS )

実行結果の例
実行結果例

「保存」のアイコンが「フロッピーディスク」ってwww今どきwwwwww

はじめに

 パソコンのアプリケーションには、ツールバーを持つものがあります。

 そしてそのツールバーには多くの「アイコンボタン」が並んでいます。

 そのなかで「保存」を実行するボタンは、多くのアプリケーションでフロッピーディスクを図案化したアイコンになっていると思います。

 フロッピーディスクはすでに過去のものになって久しいですが、このアイコンの意匠は変わっていません。そしてそのことについて、しばしば笑いのネタになります。「今どきこのアイコンの意味は通じないのでは?」ということです。

続きを読む

エンジニアの権利としてのフリーウェア

はじめに

 社内勉強会で、とあるリントツールを紹介したところ「フリーソフトの使用が禁じられている出向先はどうすればいいか」という質問がありました。

 日本の IT 現場では、いまだに「フリーソフト = 悪」という先入観が幅を利かせており、有用な道具を導入できずビジネスチャンスを逸しているという愚が繰り広げられています。

フリーソフトは危険か

 確かにフリーソフトウェアはサポートがないという点で信頼性に欠ける嫌いがあります。また実際にフリーソフトウェアが引き金となるセキュリティ事故も少なくありません。

 しかしながら「フリーソフト」という括りでその先入観を適用するならば、LinuxMySQL も種々のランタイムも該当します。これらはビジネスの現場に導入されていないのでしょうか。

続きを読む

コピー元の領域を取得する【Excel/VBA】【裏技編】

はじめに

 Excel でコピーや切り取りカットをしたときに、そのコピー元になる範囲を VBA で取得したいケースが出ました。

 すでになにかソリューションがないか、ネットで検索してみます。

VBA コピーされたセル範囲を取得する方法 - Excel | ホームページ制作のサカエン Developer's Blog

 ありました。

Worksheet_SelectionChange イベントと API を利用する必要があります。

 めんどいw

 API 使用すると macOS で使えないんですよ。あとワークシートイベントを使うと、アドイン化するときにまた手間なんですよ。

 それに、自分のプロジェクトに組み込みたいスニペットはもっと短くしてほしいんですよ。できれば 30 行程度の関数やクラス一つで。

 Office クリップボードVBA で取得する方法はないでしょうか。

Office クリップボードをマクロで操作する(MSAA) | 初心者備忘録

 ありました。

以前書いたコードは、OfficeやOSのバージョンが変わると動作しませんでしたが、今回はバージョンの差異も一応考慮しています(Excel 2007,2010,2016で確認)。

 これも API 使うんですね。

結局作った

 こういうときはアレですよ、裏技。裏技で良いんですよ、裏技で。

 以下の条件で作りました。

  • API を使用しない
  • 関数ひとつ
  • Range を返す(返せないときは Nothing

使い方

 セル範囲を選択して、コピーまたはカットをします。

 この状態で関数を実行すると、コピー元の範囲の Range オブジェクトを返します。選択された状態の範囲がなければ Nothing を返します。

ソースコード

Option Explicit

Function GetCutCopyRange() As Range
    ' カット・コピー状態でなければ Nothing を返す
    Set GetCutCopyRange = Nothing
    If Application.CutCopyMode <= 0 Then Exit Function
    
    ' 現在の状態を保持する
    Dim savedCondition As Boolean
    savedCondition = ActiveWorkbook.Saved
    
    On Error GoTo ERROR_EXIT
    ' 表示更新を一時停止する
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    
    ' リンク図としてペーストする
    Dim dummy As Variant
    Set dummy = ActiveSheet.Pictures.Paste(Link:=True)
    
    ' リンク図からリンク先を取得する(リンク図は不要になるので削除する)
    Dim f As String
    f = dummy.Formula
    dummy.Delete
    
    ' リンク先からアドレス他を取得する
    f = Replace(f, "=", "", 1, 1)
    
    Dim wb As Workbook, ws As Worksheet
    Set wb = ActiveWorkbook
    Set ws = ActiveSheet
    
    ' 別のワークブックか
    Dim bracketPos As Long, bracketPos2 As Long
    bracketPos = InStr(f, "[")
    bracketPos2 = InStr(f, "]")
    If bracketPos > 0 Then
        Set wb = Workbooks(Mid(f, bracketPos + 1, bracketPos2 - bracketPos - 1))
        f = Mid(f, bracketPos2 + 1)
    End If
    
    ' 別のワークシートか
    Dim exclamationMarkPos As Long
    exclamationMarkPos = InStr(f, "!")
    If exclamationMarkPos > 0 Then
        Set ws = wb.Sheets(Replace(Mid(f, 1, exclamationMarkPos - 1), "'", ""))
        f = Mid(f, exclamationMarkPos + 1)
    End If
    
    ' Range を取得して返す
    Set GetCutCopyRange = ws.Range(f)
ERROR_EXIT:
    ActiveWorkbook.Saved = savedCondition
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Function

 30 行にはなりませんでした、すみません。

どこが裏技か

 ソースコードを追っていただければわかりますが、コピー範囲を一旦「リンクされた図」にペーストし、リンク先を取得してすぐに消しています。ペーストした図が見えないように、画面更新を一旦停止しています。また、保存済みのワークブックが「編集された状態」にならないように、状態を書き戻しています。

 あまりスマートなやり方とは言えませんが、まあ自分のプロジェクトにはこれで十分です。

Excel マクロ&VBA やさしい教科書 [2021/2019/2016/Microsoft 365対応] (一冊に凝縮)

Git の「ステージング」はなんのためにある?【git/add/ステージ】

不思議な手順「ステージング」

 Git には、変更点を記録する「コミット」__他の VCSバージョン管理システム だと「チェックイン」と呼称される場合もあります__の前に「ステージに追加」という不思議な手順があります。

 他の VCS を経験してから Git に入門すると、このひと手間ワンクッションが、まったく不思議なのです。なぜ直接コミットできないのか。この手順が一体なんのためにあるのか、どんな場合に有用なのか。

 Git の入門的な書籍やサイトには、腑に落ちるわかりやすい具体的な説明がなぜか少ない。サポンテがかつて読んだ入門的なテキストにも納得できる説明はありませんでした。

 そのような訳で、わりと長い間の疑問でした。

続きを読む