kintoneでcanvas上のクリックをした位置に点を描画する

仕事で必要になったので勉強したソースコードのメモ。

(() => {
  "use strict";

  let kigou = "四角";

  kintone.events.on(
    ["app.record.create.show", "app.record.edit.show"],
    function (event) {
      const canvas = document.createElement("canvas");
      canvas.width = 100;
      canvas.height = 100;

      const record = event.record;
      // 座標
      let x = record.X.value;
      let y = record.Y.value;
      // canvasサイズ
      let w = canvas.width;
      let h = canvas.height;

      // 2次元の描画を行うメソッド
      const ctx = canvas.getContext("2d");
      const initCanvas = () => {
        // 背景塗る
        ctx.fillStyle = "#ccc";
        // fillRect(x座標, y座標, 幅, 高さ)
        ctx.fillRect(0, 0, w, h);

        // メモリ線を引く
        ctx.beginPath();
        ctx.moveTo(50, 0);
        ctx.lineTo(50, 100);
        ctx.closePath();
        ctx.stroke();
        ctx.beginPath();
        ctx.moveTo(0, 50);
        ctx.lineTo(100, 50);
        ctx.closePath();
        ctx.stroke();

        // 初期値(マイナス)のときは描画しない
        if (x >= 0 && y >= 0) {
          if (kigou === "四角") {
            // クリックされた位置に描画処理
            ctx.fillStyle = "#000";
            // fillRect(x座標, y座標, 幅, 高さ)
            ctx.fillRect(x, y, 10, 10);
          } else {
            ctx.beginPath();
            // 円の中心座標: クリック位置
            // 半径: 50
            // 開始角度: 0度 (0 * Math.PI / 180)
            // 終了角度: 360度 (360 * Math.PI / 180)
            // 方向: true=反時計回りの円、false=時計回りの円
            ctx.arc(x, y, 5, (0 * Math.PI) / 180, (360 * Math.PI) / 180, false);
            ctx.fillStyle = "#000";
            ctx.fill();
            ctx.closePath();
            ctx.stroke();
          }
        }
      };
      initCanvas();

      let onClick = (e) => {
        let rect = e.target.getBoundingClientRect();
        // e.clientX(Y)がwindow左上からのクリックされた座標
        // rect.left(top)がwindow左上からのcanvasの座標
        x = e.clientX - rect.left;
        y = e.clientY - rect.top;

        const rec = kintone.app.record.get();
        // フィールドに座標を格納
        rec.record.X.value = x;
        rec.record.Y.value = y;

        kintone.app.record.set(rec);

        draw();
      };

      const draw = () => {
        initCanvas();
      };

      canvas.addEventListener("click", onClick, false);

      // キャンバス上に十字を追加
      const div = document.createElement("div");
      div.setAttribute("class", "cross");
      canvas.appendChild(div);

      // スペース上にキャンバスを追加
      const space = kintone.app.record.getSpaceElement("graph");
      space.appendChild(canvas);
      return event;
    }
  );

  kintone.events.on(
    ["app.record.create.change.記号", "app.record.edit.change.記号"],
    function (event) {
      kigou = event.changes.field.value;
    }
  );
})();

実行結果

以下のサイトがとても参考になりました。
【javascript,HTML5】canvas上のクリックをした位置に点を描画する方法 | web関連 | 勉強ブログ「二色人日記。」

kintone アソシエイト

業務でkintoneアソシエイト資格が必要になり、youtubeの動画を見ていても正直つまらないので、
試験対策テキストの問題を解く、ということを中心に進めることにしました。

重要だと思ったところはエクセルに書いています。
問題は繰り返しできるように、エクセルに解答欄を設けました。

VBAで自動採点する仕組みも作りました。
間違えた問題をカウントして、復習に役立たせられるような仕組みも実装できたらいいなと思います。

kintoneでjQueryを使うときの読み込み順

結論

こうしていると動かないんですね、という話です。
当然といえば当然なのですが、kintoneは上から順番に読み込まれていくようで、
jQueryのソースは一番上にしないと動かないです。

こちらが正解でした。

経緯

第12回 jQueryを利用してみよう

上記のサイトを参考にkintoneでjQueryを使おうとしたのですが、動かず。
なんでだろうと思って開発者ツールを見ていたら下記のエラーが出ていました。

Uncaught ReferenceError: jQuery is not defined

ちゃんとソース書いたかな?と思って色々調べていたら、
kintoneにはJSの読み込み順が存在するのですね。勉強になりました。

また、補足ですが kintone全体としては以下になるようですね。
①全体JS -> ②アプリJS ->③プラグインJS

※ただし読み込み順に対する公式からの見解は無い模様です(私は見つけられませんでした)

まとめ

JavaScriptは上から順に読み込まれるので、順番には気を付けよう!

参考文献

競技プログラミングに参加してみました。

初参加

UNIQUE VISION Programming Contest 2022(AtCoder Beginner Contest 248) - AtCoder

転職活動中にプログラミングテストがあり、AtCoder社の競技プログラミングコンテストに練習がてら参加してみました。
言語は全てJavaで解きました。
問題はA~G,Exまであり、後ろになるほど難しくなってきます。
制限時間は100分。結果としてはまるまる使ってBまで行けました。

A問題は25分ぐらいかかってなんとか、、、

数字のみからなる、長さがちょうど 9 の文字列 S が与えられます。 S には 0 から 9 までのうち、ちょうど 1 つの数字を除いた 9 種類の数字が一度ずつ登場します。 S に登場しない唯一の数字を出力してください。

という問題でした。

import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 整数の入力
        String a = sc.next();
        String[] strArray = a.split("");
        boolean[] r = {false,false,false,false,false,false,false,false,false,false};
        for (String s : strArray) {
            r[Integer.valueOf(s)] = true;
        }
        for( int i = 0; i < 10 ; i++){
            if (!r[Integer.valueOf(i)]) {
                System.out.println(i);
                return;
            }
        }
    }
}

10個の数字でそれぞれ、出現したかどうかのフラグを持つような感じにしました。
難しく考えすぎたかな、、、なんかもうちょっと簡単にできたのかも。
解説を見ていたら0~9の合計数から引いて求める解法もあったりして、頭いいなぁという感想。

B問題のほうが簡単に感じる

A 匹のスライムがいます。 すぬけくんが 1 回叫ぶたびに、スライムは K 倍に増殖します。 スライムが B 匹以上になるには、すぬけくんは最小で何回叫ぶ必要があるでしょうか?
1≤A≤B≤109
2≤K≤109
入力は全て整数

これはそこまで難しくないな~と思ったんですが、一個だけ落とし穴がありました。

import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // スペース区切りの整数の入力
        int a = sc.nextInt();
        int b = sc.nextInt();
        int k = sc.nextInt();
        int s = 0;
        int slime = a;
 
        while (true) {
            if (slime >= b) {
                System.out.println(s);
                return;
            }
            slime = slime * k;
            s++;
        }
    }
}

500000000 1000000000 1000000000
という値を入れたとき、int型ではオーバーフローします。
値の範囲が-231 ~ 231-1(およそ21億5千万)なので。
ですのでslimeはintではなくlongにしないとでした。
これに引っかかって数分悩みました。

追記: これがヒントになって解けました!
デバッグ力を高める! ~5 年間の経験から学んだ、競プロ・アルゴリズム実装におけるバグ取りの戦略~ - Qiita

鬼門のC問題、まったくわからず惨敗。。。

f:id:uettyan_tech:20220417005758p:plain

これは全然わからなかったです。
解説見たけど、イマイチピンと来ず。
とはいえ疑問を言語化できず、何がわからないかわからない状態。。。

DP(ダイナミックプログラミング)というものをここで初めて知りました。
これはまた次回頑張ります。
なお、CがダメだったのでD以降は見てもいません。
まずはCが解けるように勉強進めます!

まとめ

初めてのコンテストにしては、Bまで解けたし良かったです。
(一問も解けないのではと心配していたので、一旦は良かったかなと。)
ただしDPは全くわからなかったので、壁にぶつかった感があります。
これは引き続き勉強進めたいと思います。

余談ですが、上位の人は1問数十秒から数分で解いていて、どんな頭しているんだと思いました。。。

HDMI変換アダプタの不具合(画面チラつき)を改善できませんでした。

 

 

はじめに

上記の商品を購入したのですが、どうも下名の環境では気になる事象が発生しており、いろいろ試したのですが、結局のところ解決策は不明でした。

 

事象

ノートPCから外部モニタに接続して使用しているのですが、接続先のモニタで時々画面のチラつき(突然画面が黒くなって何も表示されなくなり、1秒ほど経つともとに戻る)が発生、というものです。

これが1日数回起きるため、ちょっとした作業中ならまだしも、仕事中だとまぁまぁストレスを感じます。※本記事を書いているときにも起きました

仕事でWeb会議をする機会が多くなり、会議中に上記事象が発生すると、自分だけ中断されて非常に困ります。

  

試したこと

  1. 別のUSBポートへの接続
  2. ドライバーの更新
  3. HDMIケーブルの交換

1. 接触不良を疑い、異なるUSBポートに接続してみたりなどを試しましたが、状況は改善されず。

2. ドライバーの更新も試してみましたが、状況変わらず。

3. HDMIケーブルが悪いのでは、と思い、正常に動作しているHDMI(普段は任天堂Switchに繋いでいる)ケーブルに交換してみましたが、ダメ。

 

販売元に問い合わせ

下記を参考に、 思い切って販売元に問い合わせてみました。

zerokara-blog.com

  

「USB HDMI 変換 アダプタ usb hdmi ケーブル hdmi 変換コネクタ 1080P 高画質 安定出力 コンパクト USB HDMI 変換 コネクタ Windows XP/7/8/8.1/10 対応」
ASIN:B085HCFBP9

上記製品をノートPCから外部モニタに繋いで使用していますが、接続先のモニタで時々画面のチラつき(突然画面が黒くなって何も表示されなくなり、1秒ほど経つともとに戻る)が発生します。

1日作業をしていた場合、上記事象が数回程度の発生頻度です。

 

使用環境については、以下の通りです。
・ノートPC(Surface Book)※USB3.0ポートから接続
 Windows10 Pro ver:1909
・接続先外部モニタ(BENQ V2420HP)※解像度は1920*1080
USB3.0 to HDMI Adapter 型番:X000U21YDD

 

試したことは以下の通りです。

・別のUSBポートへの接続
・ドライバーの更新
HDMIケーブルの交換

 

既に返品期間を過ぎておりますので、返品対応は諦めています。
もし状況を改善する手段があればと思い、ご相談させていただいた次第です。
他に解決策などあれば、ご教示願います。
よろしくお願いします。

 販売元から翌営業日ぐらいに返事が来て、「不良品と思われ、返品は出来ないが、メーカー保証があるので新品を送る」とのことでした。

非常に対応が早く、大変助かりました。

 

新品で再度接続、しかし…

商品が届いたので早速ケーブルを交換し、外部モニタに接続してみましたが、上記のチラつきは発生しました。

さすがに2度続けて不良品が来て、しかも同じ事象が発生するというのも普通有り得ないでしょうし、たまたま相性が悪かったということなんでしょうかね。

 

まとめ

ということで、上記事象の改善には至りませんでした。

仕方ないので、今回は諦めることにします。

もしこれを見てくださっている方で、これも試してみたら?などあればぜひコメント頂ければ幸いです。

 

フリーソフト要らず!ファイルの中身検索

 

Windows エクスプローラで中身検索

今まで全然気付かなかったけれど、Windowsエクスプローラでファイルの中身検索って出来たんですね、という記事です。

 

背景

システムエンジニアとして働いていると、Excelで書かれた設計書から特定の文言を検索したい場合があります。

エクスプローラでファイル名を検索することはできるけれど、中身まで検索することができたらな~と思っていました。

ググるとそういったフリーソフトは出てくるけれど、会社のPCに入れるのはやや躊躇いがありました。

ある時、上記で悩んでいたら、たまたまとある記事を発見しました。

www.pasoble.jp

 

やり方

ここでもやり方を記載しておきますが、詳細は上記の記事を読んでください。

エクスプローラを開いて表示を押下

f:id:uettyan_tech:20200822162540p:plain

 

②表示⇒オプションの順に押下

f:id:uettyan_tech:20200822162702p:plain

 

③検索タブから「ファイル名と内容を常に検索する」にチェックしてOK

f:id:uettyan_tech:20200822162822p:plain

 

テスト

①中身の違う2種類のファイルを用意

 ・ファイル1 A0101

 ・ファイル2 B0101

f:id:uettyan_tech:20200822163021p:plain


②A0101で検索すると、ファイル1のみが抽出される

f:id:uettyan_tech:20200822163333p:plain

 

③ただ、精度はイマイチなので、あまり信用はできないかも

 ・0101で検索すると抽出されなかったり

f:id:uettyan_tech:20200822163925p:plain

 ・1で検索すると両方ヒットしたり

f:id:uettyan_tech:20200822164024p:plain

この違いは何なんでしょう。。。

 

まとめ

上記の通り、フリーソフトなどを入れなくても、エクスプローラの標準機能で中身検索は可能です。

ただし、精度が高いとは言えないし、もっと凝ったこと(ヒットした箇所の一覧を取得するなど)をするには、ツールに頼るしかないかもしれません。

あくまで参考情報として留めておく、というのがよさそうです。

 

 

HHKBを1か月使ってみた

 

 

f:id:uettyan_tech:20200812101540p:plain

 

はじめに

画像の通り、下名は1か月前にHHKBを購入していました。初めてのHHKBです。

HHKB Professional HYBRID Type-S 英語配列/白」になります。

1か月経ちましたので、使ってみた感想を述べたいと思います。

※2日過ぎてしまいましたが、本記事もHHKBで書いています

 

結論から述べますと、愛着が湧く最高のキーボードでした。

 

HHKB購入の経緯

感想の前に、なぜ購入に至ったのかを説明したいと思います。

コロナ禍の影響が非常に大きいのですが、購入の経緯としては

  • 前々から興味があった
  • 会社が基本リモートワークに移行
  • 給付金(10万円)が入った

この3点です。

前々から興味があったのですが、3万5千円もする代物、そう簡単には手を出せませんでした。ですが、コロナ禍の影響で会社がリモートワークに移行し、自宅で仕事をする機会が増えたこと、給付金という購入資金が出来たこともあり、思い切って購入することにしました。

 

HHKB Professional HYBRID Type-S 英語配列/白」を選んだ理由は、

  • Bluetoothに対応しており、無線で接続できる
  • 静音化されており、うるさくない
  • キー配列がスッキリしていて、見た目が好き
  • 印字の見やすさ

単純に下名が有線のごちゃごちゃした机で働きたくないと思ったのと、家族がいるのでうるさいと思われないようにといった理由から購入しています。

英語配列を選んだのも、キー配列がスッキリしていて単にカッコイイからという理由です。

色は墨と迷ったのですが、墨は印字が見にくいというレビューを見かけたため、見やすさから白を選択しました。

※無刻印は到底扱える自信が無かったので論外でした

※どうせ買うなら最新機種を選びたいという欲もありました

 

HHKBを1か月使ってみた感想

本記事の本題です。

正直、購入して1週間は違和感ありまくりでしたし、ミスタイプが多く、イライラすることがありました。

  • 仕事で書く資料のほとんどがExcelのため、矢印キーやショートカットを絡めた操作に違和感
  • キー配列が異なるため、Alt+Tabでウィンドウを切り替えようとすると、間違えて「◇」を押してしまう
  • 目的のキーを目で探してしまう

など。

しかし、キー配列については本商品のキーマップ変更ツールを使用すれば簡単に変更できるので、自分に合ったキー配列を探すことができます。

※最適なキー配列を検討中

 

1か月経つと、だんだんと慣れてきたように感じます。上記に記載した通り、ミスタイプや違和感が未だ残っていますが、購入当時と比べると減ったように思います。

それに、下記のようなメリットも見つけられました。

  1. 手首の疲れが減った
  2. キーボードに愛着が湧いた

1は、本商品を購入するまでは、Logicoolの2000円ぐらいのキーボードを使用していました。しかし、1日中仕事をしているとどうしても夕方ぐらいに手首が痛くなりました。おそらく、横に長いため手首を無理に曲げて使用していたのではないかと思います。HHKBに変えてからは、無くなったように思います。

 

2は、人生で初めてキーボードに愛着が湧きました。

価格が高いので大切に使いたいというのもありますし、なにより押したときの感覚(打鍵感)が癖になり、毎日触っていたくなるような感じです。

 これまで特にこだわりもなく安いのでいいや、という気持ちでキーボードを選んでいましたが、道具へのこだわりは大切なのかなと思いました。

※作業のモチベーションを保つのに一役買っているのではないかと思います

 

まとめ

使い始めは違和感こそあるものの、次第に慣れてくると愛着が湧き、もっと使ってみたくなりました。

購入には勇気が入りますが、長く使わないとわからない心地よさがあると思いました。

 

ぜひ一度、手に取って使ってみてください!