developer's diary

最近はc#のエントリが多いです

Windows10のタスクスケジューラーをコマンド( SCHTASKS )で登録する

タスクスケジューラの登録をコマンドを利用してやってみる。

GUIで操作する場合

GUIで操作する場合は、taskschd.mscを起動してください。以下のようなアプリが起動して、画面を操作することでタスクが登録できます。 今回はコマンドを利用してタスクを登録する為、GUIは利用しません。

f:id:mitsugi-bb:20210210100728p:plain

タスクが動いたか確認する為のアプリケーション

起動すると、マイドキュメントに、taskTest.txtというファイルを作成or追記して、実行日時を出力するというプログラム

using System;
using System.IO;
namespace tasktest
{
    class Program
    {
        static void Main(string[] args)
        {
            string myDocument = System.Environment.GetFolderPath(Environment.SpecialFolder.Personal);
            string logFilePath = Path.Combine(myDocument, "taskTest.txt");
            string outPutString = String.Format("[{0:yyyy-MM-dd HH:mm:ss}]プログラム実行しました。\n", DateTime.Now);
            File.AppendAllText(logFilePath, outPutString);
        }
    }
}

タスクの登録

毎日10時にc:\tasktest.exeを実行する

SCHTASKS /Create /SC DAILY /TN example /TR c:\tasktest.exe /ST 10:00 /F

登録したタスクの確認

SCHTASKS /Query /TN example

タスクの削除

SCHTASKS /Delete /TN example

10時に指定してプログラムが動いたかを確認してみる。

f:id:mitsugi-bb:20210210100741p:plain

HELP

SCHTASKS /Create [/S システム [/U ユーザー名 [/P [パスワード]]]]
    [/RU ユーザー名 [/RP パスワード]] /SC スケジュール [/MO 修飾子] [/D 日]
    [/M 月] [/I アイドル時間] /TN タスク名 /TR 実行タスク [/ST 開始時刻]
    [/RI 間隔] [ {/ET 終了時刻 | /DU 継続時間} [/K] [/XML xml ファイル] [/V1]]
    [/SD 開始日] [/ED 終了日] [/IT | /NP] [/Z] [/F] [/HRESULT] [/?]

説明:
    管理者がローカルまたはリモートのシステム上にスケジュール タスク
     を作成します。

パラメーター一覧:
    /S   システム      接続先のリモート システムを指定します。システム
                       パラメーターを省略すると、既定値によりローカル システム
                       になります。

    /U   ユーザー名    SchTasks.exe が実行されるユーザー コンテキストを
                       指定します。

    /P   [パスワード]  与えられたユーザーのコンテキストのパスワードを指定し
                       ます。省略すると入力が促されます。

    /RU  ユーザー名    タスクの実行に使う実行ユーザー アカウント
                       (ユーザー コンテキスト) を指定します。システム
                       アカウントの有効な値は ""、"NT AUTHORITY\SYSTEM"、
                       または "SYSTEM" です。
                       v2 タスクには、"NT AUTHORITY\LOCALSERVICE" と
                       "NT AUTHORITY\NETWORKSERVICE" も 3 つすべての
                       3 つすべてに対して既知の SID と同じく利用できます。

    /RP  [パスワード]  実行ユーザーのパスワードを指定します。
                       パスワードを要求するには、値は "*" または
                       空である必要があります。システム アカウントではこの
                       パスワードは無視されます。/RU または /XML スイッチの
                       いずれかと組み合わせる必要があります。

    /SC   スケジュール スケジュールの頻度を指定します。
                       有効なスケジュールの種類は MINUTE、HOURLY、DAILY、
                       WEEKLY、MONTHLY、ONCE、ONSTART、ONLOGON、ONIDLE、
                       ONEVENT です。

    /MO  修飾子        スケジュールの種類を詳細に指定して、スケジュールの頻度
                       に関してより細かな制御を行います。有効な値は、下の
                       "修飾子" の節に記述されています。

    /D    日           タスクを実行する曜日を指定します。 有効な
                       値は、MON、TUE、WED、THU、FRI、SAT および SUN です。
                       毎月の指定 (MONTHLY) の場合は、日を 1 から 31 の
                       間で指定します。ワイルドカード "*" を使うとすべての日を
                       指定できます。

    /M   月            月を指定します。既定の日は月の最初の日になります。
                       有効な値は、JAN、FEB、MAR、APR、MAY、JUN、JUL、
                       AUG、SEP、OCT、NOV および DEC です。ワイルド カード
                       "*" を使うとすべての月が指定できます。

    /I  アイドル時間   待機するアイドル時間を指定します。このアイドル時間の
                       待機後にスケジュールされた ONIDLE のタスクが実行され
                       ます。
                       有効な範囲は、1 から 999 分です。

    /TN   タスク名     このスケジュール タスクを\一意に識別するための
                       文字列をパス名の形式で指定します。

    /TR   実行タスク   スケジュールされた時刻に実行するプログラムのパスおよび
                       ファイル名を指定します。
                       例: C:\windows\system32\calc.exe

    /ST   開始時刻     タスクを実行する開始時刻を指定します。時刻は
                       HH:mm の形式 (24 時間形式) です。たとえば、
                       午後 2 時 30 分の場合は14:30 と指定します。/ST
                       が指定されていない場合の既定値は現在の時刻です。
                       このオプションは /SC ONCE と併用する必要があります。

    /RI   間隔         繰り返す間隔を分で指定します。これは
                       次のスケジュールの種類には適用できません: MINUTE、
                       HOURLY、ONSTART、ONLOGON、ONIDLE、ONEVENT。
                       有効な範囲: 1 - 599940 分。

                       /ET または /DU が指定されている場合、既定値は
                       10 分になります。

    /ET   終了時刻     タスクの実行を終了する時刻を指定します。時刻の形式は
                       HH:mm (24 時間形式) です。たとえば、午後 2 時 50 分
                       の場合は 14:50 と指定します。次のスケジュールの種類には
                       適用できません: ONSTART、ONLOGON、ONIDLE、ONEVENT。

    /DU   継続時間     タスクを実行する継続時間を指定します。時間は
                       HH:mm の形式です。これは /ET と共には適用され
                       ません。また、次のスケジュールの種類には適用されません:
                       ONSTART、ONLOGON、ONIDLE、ONEVENT。
                       /V1 タスクの場合、/RIが指定されると、既定値は
                       1 時間になります。

    /K                 終了時刻または継続時間にタスクを終了します。
                       これは次のスケジュールの種類には適用されません: ONSTART、
                       ONLOGON、ONIDLE、ONEVENT。/ET または /DU を
                       指定する必要があります。

    /SD   開始日       タスクを実行する最初の日を指定します。 形式は
                       yyyy/mm/dd です。既定値は現在の日付です。
                       これは次のスケジュールの種類には適用されません: ONCE、
                       ONSTART、ONLOGON、ONIDLE、ONEVENT。

    /ED   終了日       タスクを実行する最後の日を指定してください。形式は
                       yyyy/mm/dd です。これは次のスケジュールの種類には適用
                       されません: ONCE、ONSTART、ONLOGON、ONIDLE、ONEVENT。

    /EC   チャネル名   OnEvent トリガーに対するイベントのチャネルを指定します。

    /IT                ジョブの実行時に /RU ユーザーが現在ログオンしている
                       場合にのみ、タスクが対話的に実行されるようにします。
                       このタスクは、ユーザーがログインしている場合にのみ実行
                       します。

    /NP                パスワードは保存されません。タスクは特定のユーザー
                       として非対話的に実行されます。
                       ローカル リソースしか使用できません。

    /Z                 最後の実行後で削除するタスクをマークします。

    /XML  XMLファイル  ファイル内で指定されているタスク XML からタスクを作成し
                       ます。
                       タスク XML に既にプリンシパルが含まれている場合は、
                       /RU および /RP スイッチ、または /RP 単体と組み合わ
                       せることができます。

    /V1                Vista 以前のプラットフォームで表示するタスクを作成
                       します。/XML との互換性はありません。

    /F                 指定したタスクが既に存在する場合、タスクを強制的に作
                       成し、警告を抑制します。

    /RL   レベル       ジョブの実行レベルを設定します。有効な値は
                       LIMITED と HIGHEST です。既定値は LIMITED です。

    /DELAY 遅延時間    トリガーの開始後から、タスクが実行するまでの待機
                       時間を指定します。時間の形式は mmmm:ss です。
                       このオプションは ONSTART、ONLOGON、ONEVENT の
                       種類のスケジュールにのみ有効です。

    /HRESULT           診断能力を向上させるために、プロセス終了コードは
                       HRESULT 形式になります。

    /?                 このヘルプを表示します。

修飾子: /MO スイッチでスケジュールの各種類に利用できる値:
    MINUTE:  1 から 1439 (分)
    HOURLY:  1 から 23 (時)
    DAILY:   1 から 365 (日)
    WEEKLY:  1 から 52 (週)
    ONCE:    修飾子なし
    ONSTART: 修飾子なし
    ONLOGON: 修飾子なし
    ONIDLE:  修飾子なし
    MONTHLY: 1 から 12 (月) または
             FIRST、SECOND、THIRD、FOURTH、LAST、LASTDAY

    ONEVENT:  XPath イベントのクエリ文字列。
例:
    ==> ユーザー "runasuser" の下で 1 時間ごとに notepad.exe を実行する
        スケジュール タスク "doc" をリモート コンピューター "ABC" に作成します。

        SCHTASKS /Create /S ABC /U user /P password /RU runasuser
                 /RP runaspassword /SC HOURLY /TN doc /TR notepad

    ==> リモート コンピューター "ABC" にスケジュール タスク "accountant"
        を作成し、開始日と終了日の間、指定された開始時刻から終了時刻の
        間で 5 分ごとに calc.exe を実行します。

        SCHTASKS /Create /S ABC /U domain\user /P password /SC MINUTE
                 /MO 5 /TN accountant /TR calc.exe /ST 12:00 /ET 14:00
                 /SD 06/06/2006 /ED 06/06/2006 /RU 実行ユーザー
                 /RP ユーザーパスワード

    ==> スケジュール タスク "gametime" を作成し、毎月第一日曜日
        にフリーセルを実行します。

        SCHTASKS /Create /SC MONTHLY /MO first /D SUN /TN gametime
                 /TR c:\windows\system32\freecell

    ==> リモート コンピューター "ABC" にスケジュール タスク "report"
        を作成し、毎週 notepad.exe を実行します。

        SCHTASKS /Create /S ABC /U user /P password /RU runasuser
                 /RP runaspassword /SC WEEKLY /TN report /TR notepad.exe

    ==> リモート コンピューター "ABC" スケジュール タスク
        "logtracker" を作成し、指定の開始時刻から 5 分ごとに
        notepad.exe を実行します。/RP パスワードの入力を促され
        ます。

        SCHTASKS /Create /S ABC /U domain\user /P password /SC MINUTE
                 /MO 5 /TN logtracker
                 /TR c:\windows\system32\notepad.exe /ST 18:30
                 /RU runasuser /RP

    ==> スケジュール タスク "gaming" を作成して freecell.exe を毎日
        12:00 に開始し、自動的に 14:00 に終了するようにします。

        SCHTASKS /Create /SC DAILY /TN ゲーム /TR c:\freecell /ST 12:00
                 /ET 14:00 /K
    ==> スケジュール タスク "EventLog" を作成し、システム チャネルで
        イベント 101 が発行された場合は常に wevtvwr.msc wo を実行します。

        SCHTASKS /Create /TN EventLog /TR wevtvwr.msc /SC ONEVENT
                 /EC System /MO *[System/EventID=101]
    ==> ファイル パスにスペースを含める場合は、CMD.EXE に対する引用符 1 組と、
        合計 2 セット使用します。CDM の外側の引用符には二重引用符を使用する
        必要があります。内側の引用符には一重引用符、またはエスケープした
        二重引用符を使用できます:
        SCHTASKS /Create
           /tr "'c:\program files\internet explorer\iexplorer.exe'
           \"c:\log data\today.xml\"" ...

laravel8でsqlite使うときは空ファイルを事前に作成しておくこと

sqliteでmigrateしたときにエラーになって進まなかったので、調査しました。 本エントリは、その結果です。

事象

create-project でlaravelプロジェクトを作成して、.envを以下のように修正

DB_CONNECTION=sqlite
#DB_CONNECTION=mysql
#DB_HOST=127.0.0.1
#DB_PORT=3306
#DB_DATABASE=laravel
#DB_USERNAME=root
#DB_PASSWORD=

そして、migrate 実行

[username@hostname~/appname]$ php artisan migrate

以下のエラーが発生

  Database (/home/username/appname/database/database.sqlite) does not exist. (SQL: PRAGMA foreign_keys = ON;)

at vendor/laravel/framework/src/Illuminate/Database/Connection.php:678

        // If an exception occurs when attempting to run a query, we'll format the error
        // message to include the bindings with SQL, which will make this exception a
        // lot more helpful to the developer instead of just the database's errors.
        catch (Exception $e) {
            throw new QueryException(
                $query, $this->prepareBindings($bindings), $e
             );
        }

対応

事前にデータベース用の空ファイルを作っておく

[username@hostname~/appname]$ touch database/database.sqlite
[username@hostname~/appname]$ php artisan migrate

参考

ドキュメントに書いてました。

readouble.com

国会会議録検索システム 検索用APIをPHPから触ってみる

前回の記事

mitsugeek.net

PHPのソース

<?php

$handle = curl_init();
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_URL,"https://kokkai.ndl.go.jp/api/speech?startRecord=1&from=2020-01-01&recordPacking=json&maximumRecords=1");
$result=curl_exec($handle);
curl_close($handle);

$result = json_decode($result);

var_dump($result);

結果

object(stdClass)#1 (5) {
  ["numberOfRecords"]=>
  int(106609)
  ["numberOfReturn"]=>
  int(1)
  ["startRecord"]=>
  int(1)
  ["nextRecordPosition"]=>
  int(2)
  ["speechRecord"]=>
  array(1) {
    [0]=>
    object(stdClass)#2 (21) {
      ["speechID"]=>
      string(25) "120414292X00120210122_000"
      ["issueID"]=>
      string(21) "120414292X00120210122"
      ["imageKind"]=>
      string(9) "会議録"
      ["searchObject"]=>
      int(0)
      ["session"]=>
      int(204)
      ["nameOfHouse"]=>
      string(9) "参議院"
      ["nameOfMeeting"]=>
      string(27) "国家基本政策委員会"
      ["issue"]=>
      string(7) "第1号"
      ["date"]=>
      string(10) "2021-01-22"
      ["closing"]=>
      NULL
      ["speechOrder"]=>
      int(0)
      ["speaker"]=>
      string(15) "会議録情報"
      ["speakerYomi"]=>
      NULL
      ["speakerGroup"]=>
      NULL
      ["speakerPosition"]=>
      NULL
      ["speakerRole"]=>
      NULL
      ["speech"]=>
      string(3400) "令和三年一月二十二日(金曜日)
   午前十一時四十一分開会
    ─────────────
   委員氏名
    委員長         大塚 耕平君
    理 事         衛藤 晟一君
                岩井 茂樹君
                宇都 隆史君
                江島  潔君
                小野田紀美君
                武見 敬三君
                中西 健治君
                中西  哲君
               三原じゅん子君
                難波 奨二君
                福山 哲郎君
                水岡 俊一君
                谷合 正明君
                山口那津男君
                松沢 成文君
                小林 正夫君
                小池  晃君
                木村 英子君
                ながえ孝子君
    ─────────────
  出席者は左のとおり。
    委員長         大塚 耕平君
    理 事
                衛藤 晟一君
                武見 敬三君
                水岡 俊一君
                松沢 成文君
    委 員
                岩井 茂樹君
                宇都 隆史君
                江島  潔君
                小野田紀美君
                中西 健治君
                中西  哲君
               三原じゅん子君
                難波 奨二君
                福山 哲郎君
                谷合 正明君
                山口那津男君
                小林 正夫君
                小池  晃君
                木村 英子君
                ながえ孝子君
   事務局側
       常任委員会専門
       員        秋谷 薫司君
    ─────────────
  本日の会議に付した案件
○理事補欠選任の件
○国政調査に関する件
○合同審査会に関する件
    ─────────────"
      ["startPage"]=>
      int(0)
      ["speechURL"]=>
      string(77) "https://kokkai.ndl.go.jp/#/detail?minId=120414292X00120210122&spkNum=0&single"
      ["meetingURL"]=>
      string(61) "https://kokkai.ndl.go.jp/#/detail?minId=120414292X00120210122"
      ["pdfURL"]=>
      NULL
    }
  }
}

「国会会議録検索システム 検索用APIの仕様」を調査

概要

項目 内容
APIが返却するもの 国会会議録検索システム(ウェブサイト)の内容
返却形式 XMLかJSON
検索条件 APIの種類に関わらず共通
操作方法 開始位置と、次開始位置を辿ることですべて取得できる仕組み

APIの利用について

営利・非営利 区分 結果
共通 アクセス 多重リクエストを避け、
データを取得し終えてから、
数秒程度空けて次のリクエストを行う
共通 公開 出典(国会会議録検索システム)を明記すること
共通 著作権 著作権は、個々の発言者が所有
共通 責任範囲 国立国会図書館は何ら責任を負いません
非営利 著作権の許諾 不要 (連絡すると喜ばれる)
営利 著作権の許諾 必要

APIの種類

種類 API 内容 最大取得件数
(デフォルト件数)
会議単位簡易出力 meeting_list 発言者の一覧 100(30)
会議単位出力 meeting 発言者と発言の一覧 100(30)
発言単位出力 speech 発言の詳細 10(3)

共通の出力項目(操作用)

1アクセスで取得する最大の件数があるため、次開始位置をもとに、アクセスを繰り返し辿っていくことで 全体を取得することができる。その操作の為の出力項目

No. 論理名 物理名
1 総結果件数 numberOfRecords
2 返戻件数 numberOfReturn
3 開始位置 startRecord
4 次開始位置(※存在する場合のみ) nextRecordPosition

共通の出力項目

No. 論理名 物理名
1 会議録ID issueID
2 発言ID speechID
3 イメージ種別(会議録・目次・索引・附録・追録) imageKind
4 国会回次 session
5 院名 nameOfHouse
6 会議名 nameOfMeeting
7 号数 issue
8 開催日付 date
9 閉会中フラグ closing

会議単位簡易出力の出力項目

No. 論理名 物理名
1 発言番号 speechOrder
2 発言者名 speaker
3 発言URL speechURL

会議単位出力

No. 論理名 物理名
1 発言番号 speechOrder
2 発言者名 speaker
3 発言者よみ speakerYomi
4 発言者所属会派 speakerGroup
5 発言者肩書き speakerPosition
6 発言者役割 speakerRole
7 発言 speech
8 発言が掲載されている開始ページ startPage
9 レコード登録日時 createTime
10 レコード更新日時 updateTime
11 発言URL speechURL

発言単位出力

No. 論理名 物理名
1 検索対象箇所(議事冒頭・本文) searchObject
2 発言番号 speechOrder
3 発言者名 speaker
4 発言者よみ speakerYomi
5 発言者所属会派 speakerGroup
6 発言者肩書き speakerPosition
7 発言者役割 speakerRole
8 発言 speech
9 発言が掲載されている開始ページ startPage
10 発言URL speechURL
11 会議録テキスト表示画面のURL meetingURL
12 会議録PDF表示画面のURL(※存在する場合のみ) pdfURL

検索パラメータ

国会会議録検索システム 検索用APIの仕様の 5. 詳細仕様 > 検索リクエスト > 3.指定可能な検索パラメータ が分かりやすいです。

参考

国会会議録検索システム 検索用APIの仕様 を参考に本エントリを作成しました。

国会会議録検索システムの使い方についてはマニュアルをご覧ください。

補足

※出力項目のNo.は自分の為に勝手につけました

利用してみる

PHPから利用したサンプルのエントリを書きました。

mitsugeek.net

超訳 Xamarin の概要

Microsoftのページって個人的に理解する為に、ワンクッションおくことが多いです。

色々読みながら、で結局どうなの?ってのにたどり着くまで結構時間かかること多いんですよね。。。

これは、単純に筆者のスキルレベルのせいだと考えてます。

なので、筆者的に理解した翻訳を残しておこうというメモ。的なエントリです。

今回訳してみたページ

docs.microsoft.com

Xamarin の概要の超訳。

Xamarin.Forms は、iOS、Android、Windowsで動くプログラムを作成するときの一つの選択肢。

という1行にまとまりました。 このドキュメントから私が理解できたことは。この1行です。

ドキュメントに記述されている概要

Xamarin.Forms は、iOS、Android、ユニバーサル Windows プラットフォーム アプリ間で共有可能なネイティブ ユーザー インターフェイス レイアウトを効率的に作成するための、開発者向けクロスプラットフォーム UI ツールキットです。

キーワードの略を記述

キーワード 意味
iOS iPhoneのOS(オペレーティングシステム)
Android スマホのOS(オペレーティングシステム)のこと
ユニバーサル Windows プラットフォーム(UWP) 異なるデバイス向けに提供されるMicrosoft Windows用のアプリケーションソフトウェアを共通の基盤上で動作させることのできる、統合されたプラットフォーム
ネイティブ ユーザー インターフェイス レイアウト iOS向け、andorid向けにそれぞれUI(ユーザーインターフェース)を構築するコンポーネントがあるが、これらコンポーネントを利用して作成したレイアウトのこと
クロスプラットフォーム 異なるプラットフォーム上で、同じ仕様のものを動かすことが出来るプログラムど土台のこと
UI ツールキット UIを構築するための道具一式のこと
ユーザーインターフェース 機械、特にコンピュータとその機械の利用者との間での情報をやりとりするためのインタフェース(入出力部分)
プラットフォーム システム・サービスを動かすための基盤(土台となる環境)
Xamarin .NET を使用して、iOS、Android、Windows 向けのアプリケーションをビルドするためのオープンソースのプラットフォーム
オープンソース・ソフトウェア ソースコードを商用、非商用の目的を問わず利用、修正、頒布することを許し、それを利用する個人や団体の努力や利益を遮ることがないソフトウェア

英語ドキュメントを翻訳

Xamarin.Forms is a cross-platform UI toolkit that allows developers to efficiently create native user interface layouts that can be shared across iOS, Android, and Universal Windows Platform apps.

DeepLでの翻訳

Xamarin.Forms は、iOS、Android、Universal Windows プラットフォームのアプリ間で共有できるネイティブのユーザーインターフェイスレイアウトを効率的に作成するためのクロスプラットフォーム UI ツールキットです。

Googleでの翻訳

Xamarin.Formsは、開発者がiOS、Android、およびユニバーサルWindowsプラットフォームアプリ間で共有できるネイティブユーザーインターフェイスレイアウトを効率的に作成できるようにするクロスプラットフォームUIツールキットです。

Wikipediaを覗いておく

XAMLベースのクロスプラットフォームなGUIアプリケーションフレームワーク。

感想

Xamarin.Formsって割と嫌われてる?

よくあるネットの意見

  • 原因の切り分けが難しそう。
  • Xamarin.Forms自体のバグを踏みそう。

PHPでPDF出力 ~ wkhtmltopdfを利用した「ええ感じ」のサンプル(htmlを利用)

wkhtmltopdfをインストール(Homebrew-cask利用)

wkhtmltopdfはバイナリ。バイナリな分速度は早いのですが、 環境に依存しますので、サーバによっては使えない場合が有ります。 (共有サーバとかだとインストールできない場合が多い、または難易度が上がります。)

brew cask install wkhtmltopdf

knplabs/knp-snappyの準備

プロジェクト用ディレクトリ作成

mkdir pdf-example3

ディレクトリに移動

cd pdf-example3

composerの準備

composer init

knplabs/knp-snappyのインストール

composer require knplabs/knp-snappy

画像埋め込みの確認用に猫の画像を検索してダウンロードしておく

ここで猫の画像を検索 visualhunt.com

f:id:mitsugi-bb:20200907230618p:plain
この猫の画像にしよう

名前はcat.jpgにしよう。

phpファイル作成

base64で事前に読み込んでおく。

<?php<?php

require './vendor/autoload.php';

$img = base64_encode(file_get_contents("cat.jpg"));
$html = <<< EOF
<style>
body {
    font-family: ipag;
    }
.td {
    border: solid 1px black;
}
.td2 {
    border: solid 1px black;
    height:100px;
}
.td3 {
    font-size:20px;
    border: solid 1px black;
    height:100px;
}
.table{
    width:100%;
    border-collapse: collapse;
    border-spacing: 0px;
}
.left{
    text-align: left;
    border: solid 1px black;
    height:30px;
}
.right{
    text-align: right;
    border: solid 1px black;
    height:30px;
}
.center{
    text-align: center;
    border: solid 1px black;
    height:30px;
}
.decoration{
    text-decoration: line-through;
    border: solid 1px black;
}

.sample1 {text-decoration: none;}
.sample2 {text-decoration: underline;}
.sample3 {text-decoration: overline;}
.sample4 {text-decoration: line-through;}
.sample5 {text-decoration: underline dotted red;}

.color{
    background-color:black;
    color:white;
}
</style>


<table class="table">
<tr>
    <td class="left">text-align: left;</td>
    <td class="center">text-align: center;</td>
    <td class="right">text-align: right;</td>
</tr>
<tr>
    <td class="td">test</td>
    <td class="td">日本語</td>
    <td class="td">hoge</td>
</tr>
<tr>
    <td class="td">test</td>
    <td class="td"><table class="table">
        <tr>
            <td class="td" >test</td>
        </tr>
        <tr>
            <td class="td" >test</td>
        </tr>
    </table></td>
    <td class="td">hoge</td>
</tr>
<tr>
    <td class="td" colspan="2">colspan="2"</td>
    <td class="td" rowspan="2">rowspan="2"</td>
</tr>
<tr>
    <td class="td">test</td>
    <td class="td">fuga</td>
</tr>
<tr>
    <td class="td2" colspan="3">height:100px; colspan="3"</td>
</tr>
<tr>
    <td class="td2 color" colspan="3">改行<br>
brタグ<br>
で改行<br>
背景色変更<br>
フォントカラー変更<br>
</td>
</tr>
<tr>
    <td class="td3" colspan="3">改行<br>
brタグ<br>
で改行<br>
</td>
</tr>
<tr>
<td class="td2" colspan="3">

<div><span class="sample1">none</span> text-decoration: none;</div>
<div><span class="sample2">underline</span> text-decoration: underline;</div>
<div><span class="sample3">overline</span> text-decoration: overline;</div>
<div><span class="sample4">line-through</span> text-decoration: line-through;</div>
<div><span class="sample5">underline dotted red</span> text-decoration: underline dotted red;</div>


</td>
</tr>
<tr>
<td class="td2" colspan="3">
画像挿入
<br>
<div>
 <img src="data:image/jpeg;base64,{$img}" width="300px"/> 
</div>
<br>

</td>
</tr>
</table>


EOF;

// wkhtmltopdfの位置をコンストラクタに渡す
$pdf = new Knp\Snappy\Pdf('/usr/local/bin/wkhtmltopdf');

// encoding = utf-8をセット
$pdf->setOption('encoding', 'utf-8');

// PDFをブラウザに出力
header("Content-Type: application/pdf");
echo $pdf->getOutputFromHtml($html);

結果

f:id:mitsugi-bb:20201010145546p:plain

その他

tcpdfはこちら

tcpdfバージョンのエントリは以下より。

mitsugeek.net

dompdfはこちら

tcpdfバージョンのエントリは以下より。

mitsugeek.net

C# (dotnetcore) .netの内部実装を覗いてbit演算子の使い方を学んでみよう

前提

c#のboolは1Byte

サイズを確認する場合、sizeof演算子を使って確認できる

Console.WriteLine("boolのサイズ:" + sizeof(Boolean));

実際、boolのサイズは、プラットフォームに依存するらしい。

(ほぼほぼ1Byteでしょうが、1Byteと明記されているオフィシャルは見つかりませんでした・・・)

c#のintは4byte

下記のロジックで確認すると、c#ではint型は4Byte。

Console.WriteLine("intのサイズ:" + sizeof(int));

bitの使い所

保存するデータを極力小さくしたい場合に利用する という選択肢が考えられます。組込系とか大量のデータを保存する場合とか。

1億件の情報を保存する

32項目のフラグをboolで保存すると、32Byte使いますが、intを利用すると、4Byteですみます。

以下の表は、32項目のフラグをboolとintで保存した場合の総容量の違いです。

バイト数 最低必要なバイト数
bool 32Byte 32,000,000,000
int 4Byte 400,000,000

boolを保存した場合、3Gbyteを超える容量です。

intだと400MByteで済みますね。

ゲームなどはとんでもない量のデータを扱うと思いますので、bit演算が多様されると想像できます。

.netのリファレンス 実装(referencesource)を覗いても、結構使われたりすることが分かります。

.netのリファレンス 実装(referencesource)を覗く

さて本題です。覗いてみます。覗いてみるって少しエロチックな言葉ですね。 鶴の恩返しのようです。が、安心してください。 覗いてもどこかへ行きません。多分(汗)

.netのリファレンス ソースとは

.netのリファレンス ソースとは.netの内部のコードって意味ですね。

元々、c#という言語仕様は国際的な標準化団体で公開されていたのですが、

プログラム自体の中身はブラックボックスだったんですが、

今では公開されているので、windowsフォームを利用したシステム開発でちょくちょく覗いていました。

.netのリファレンス ソースは、Microsoftがどのようにプログラミングしているかを見ることができるため、「学び」にとても役立ちます。

ページの最後にリンクを貼り付けておきます。

Controlクラスでbit演算子を使っているところを覗いてみる

Windowsフォームで必ず使う、Controlクラスを覗いてみる。

フラグを格納する変数の定義

private int                           state;                  // See STATE_ constants above

フラグの定義

        internal const int STATE_CREATED                = 0x00000001;
        internal const int STATE_VISIBLE                = 0x00000002;
        internal const int STATE_ENABLED                = 0x00000004;
        internal const int STATE_TABSTOP                = 0x00000008;
        internal const int STATE_RECREATE               = 0x00000010;
        internal const int STATE_MODAL                  = 0x00000020;
        internal const int STATE_ALLOWDROP              = 0x00000040;
        internal const int STATE_DROPTARGET             = 0x00000080;
        internal const int STATE_NOZORDER               = 0x00000100;
        internal const int STATE_LAYOUTDEFERRED         = 0x00000200;
        internal const int STATE_USEWAITCURSOR          = 0x00000400;
        internal const int STATE_DISPOSED               = 0x00000800;
        // 省略

フラグを確認する様子

フラグを判定する場合、&(AND:論理積)を利用している

        public bool Created {
            get {
                return(state & STATE_CREATED) != 0;
            }
        }

フラグを立てている様子

フラグを立てる場合、|(OR:論理和)を使う。

state |= STATE_CREATED;

フラグをおろしている様子

フラグを下ろす場合、&(AND:論理積)と~(NOT:否定)を使う。

state &= (~STATE_CREATED);

サンプルプログラム

using System;

namespace bit
{
    class Program
    {
        enum Flgs
        {
            None = 0b0000,
            flg1 = 0b0001,
            flg2 = 0b0010,
            flg3 = 0b0100,
            flg4 = 0b1000
        }

        static void Main(string[] args)
        {
            Console.ReadKey();

            Flgs flgs = new Flgs();

            Console.WriteLine("Flgsのサイズ" + sizeof(Flgs));

            //フラグを全て下ろす
            flgs = Flgs.None;

            //フラグの状態をチェック
            CheckFlg(flgs, Flgs.flg1, nameof(Flgs.flg1));

            //flg1のフラグを立てる
            flgs = flgs | Flgs.flg1;

            //フラグの状態をチェック
            CheckFlg(flgs, Flgs.flg1, nameof(Flgs.flg1));

            //flg1のフラグを下ろす
            flgs = flgs & ~Flgs.flg1;

            //フラグの状態をチェック
            CheckFlg(flgs, Flgs.flg1, nameof(Flgs.flg1));

            Console.ReadKey();
        }

        /// <summary>
        /// フラグをチェックする関数
        /// </summary>
        /// <param name="flgs">フラグを設定した変数</param>
        /// <param name="flgs2">チェックしたいフラグを設定</param>
        /// <param name="flgName">フラグの名称を設定</param>
        static void CheckFlg(Flgs flgs, Flgs flgs2, string flgName)
        {
            if ((flgs & flgs2) != 0)
            {
                Console.WriteLine(flgName + "が立っている");
            } else
            {
                Console.WriteLine(flgName + "が降りている");
            }
        }
    }
}

参考

www.itmedia.co.jp

www.pursue.ne.jp

qiita.com

qiita.com

referencesource.microsoft.com

都道府県知事のtwitterアカウントを調べてみた

北海道

鈴木直道

twitter.com

青森県

三村申吾 (なし)

岩手県

達増拓也

twitter.com

宮城県

村井嘉浩 (なし)

秋田県

佐竹敬久 (なし)

山形県

吉村美栄子 (なし)

福島県

内堀雅雄 (なし)

茨城県

大井川和彦

twitter.com

栃木県

福田富一

twitter.com

群馬県

山本一太

twitter.com

埼玉県

大野元裕

twitter.com

千葉県

鈴木栄治(森田健作) (なし)

twitter.com

東京都

小池百合子

twitter.com

神奈川県

黒岩祐治

twitter.com

新潟県

花角英世

twitter.com

富山県

石井隆一 (なし)

石川県

谷本正憲 (なし)

福井県

杉本達治 (なし)

山形県

長崎幸太郎

twitter.com

長野県

阿部守一

twitter.com

岐阜県

古田肇 (なし)

静岡県

川勝平太 (なし)

愛知県

大村秀章

twitter.com

三重県

鈴木英敬

twitter.com

滋賀県

三日月大造

twitter.com

京都府

西脇隆俊 (なし)

大阪府

吉村洋文

twitter.com

兵庫県

井戸敏三

twitter.com

奈良県

荒井正吾 (なし)

和歌山県

仁坂吉伸 (なし)

鳥取県

平井伸治 (なし)

島根県

丸山達也

twitter.com

岡山県

伊原木隆太 (なし)

広島県

湯崎英彦

twitter.com

山口県

村岡嗣政 (なし)

徳島県

飯泉嘉門

twitter.com

香川県

浜田恵造

twitter.com

愛媛県

中村時広 (なし)

高知県

浜田省司

twitter.com

福岡県

小川洋 (なし)

佐賀県

山口祥義 (なし)

長崎県

中村法道 (なし)

熊本県

蒲島郁夫 (なし)

大分県

広瀬勝貞

twitter.com

宮崎県

河野俊嗣

twitter.com

鹿児島県

塩田康一 (なし)

沖縄県

玉城康裕 (玉城デニー)

twitter.com

VSCode、Laravelのweb.phpでUndefined type 'Route' のエラーメッセージを消す方法を探す記録

問題

VSCodeでなみなみ線がつく。 f:id:mitsugi-bb:20201003111253p:plain

調べる

あった。 github.com

解決策

routes/web.phpの先頭に以下のコード追加

use Illuminate\Support\Facades\Route;

Authも使う場合はこちらも追加

use Illuminate\Support\Facades\Auth;

結果

無事なみなみ線が消えました。 f:id:mitsugi-bb:20201003111325p:plain

参考

www.kakistamp.com

qiita.com

karukichi-blog.netlify.app

キャッシュアルゴリズムの情報収集

そもそもキャッシュとは

ja.wikipedia.org

様々な情報伝達経路において、ある領域から他の領域へ情報を転送する際、その転送遅延を極力隠蔽し転送効率を向上するために考案された記憶階層の実現手段

参考

wikipediaにあるキャッシュアルゴリズムをそれぞれ調査

wikipedia のキャッシュアルゴリズムを元に、それぞれ調査

ja.wikipedia.org

Least Recently Used (LRU) [直訳:最近使用されていない]

最近最も使われていないデータを最初に捨てる。このアルゴリズムでは、どのデータがどの時点で使われたかという情報を保持する必要があり、本当に最近最も使われていないデータを常に捨てるようにしようとすると、かなり手間がかかる。一般的実装では、キャッシュライン毎に世代ビット群(age bits)を持たせ、どのラインが最近最も使われていないかを世代ビット群で判断する。その場合、あるキャッシュラインを使うときには、常に全キャッシュラインの世代ビット群を更新する必要がある。

言語 リンク
javascript Javascript/LRUCache.js at master · TheAlgorithms/Javascript · GitHub
javascript GitHub - rsms/js-lru: A fast, simple & universal Least Recently Used (LRU) map for JavaScript
c# LRUCache.NET/LRUCache.cs at master · AvetisG/LRUCache.NET · GitHub
ptyhon GitHub - stucchio/Python-LRU-cache: An in-memory LRU cache for python

en.wikipedia.org

ja.wikipedia.org

利用箇所とか

Oracleのバッファキャッシュなどは、このアルゴリズムだそう。

blogs.oracle.com

docs.oracle.com

RedisもLRUがあるよう。

mogile.web.fc2.com

Most Recently Used (MRU) [直訳:最近使用された]

最近最も使われたデータを最初に捨てる。アクセスに局所性を想定できず、LRUの実装が複雑すぎる場合に使われる。MRUの使用例としてはデータベースのメモリキャッシュがある。

言語 リンク
javascript mrulist/jquery.mrulist.js at master · vanderlee/mrulist · GitHub
c# Caching_Service_and_LRU_-_MRU_algoritm/MRUAlgorithm.cs at master · cristianpirvanescu/Caching_Service_and_LRU_-_MRU_algoritm · GitHub

en.wikipedia.org

「最近開いたファイル」も、Most Recently Usedと呼ぶらしい(ややこしい・・・)

Pseudo-LRU (PLRU) [直訳:擬似的-最近使用されていない]

例えば、キャッシュメモリの連想度が大きい場合(4ウェイ以上)、LRUの実装コストは無視できなくなる。確率的にほぼ常に最近最もつかわれていないデータを捨てれば十分という場合、PLRUアルゴリズムを使う。この場合、キャッシュライン毎に1ビットの情報を保持するだけでよい。

言語 リンク
java LRU-Cache/PseudoLRUCacheSet.java at master · houli/LRU-Cache · GitHub

en.wikipedia.org

Least Frequently Used (LFU) [直訳:使用頻度が最も低い]

各データが使われた頻度を保持する。そして、頻繁には使われていないデータを最初に捨てる。

言語 リンク
javascript Javascript/LFUCache.js at master · TheAlgorithms/Javascript · GitHub

en.wikipedia.org

Adaptive Replacement Cache (ARC) [直訳:適応的置換キャッシュ]

LRU と LFU の間でバランスをとり、最適な結果を得る方式。最近キャッシュから消された情報の履歴を保持するように拡張し、その情報を使って、「かつてキャッシュされていたけれど今はキャッシュから消されている」という情報を元に、LRUとLFUの配分を動的に自動的に調整する。以下の4つのキューを使う。

  1. LRU (アクセス回数が1回。常にLFUよりも大きな容量を割り当てる。)
  2. LFU (アクセス回数が2回以上のデータ)
  3. かつてLRUに入っていた (これ自体もLRU)
  4. かつてLFUに入っていた (これ自体もLRU)
言語 リンク
javascript node-arc-cache/arc.js at master · ex1st/node-arc-cache · GitHub
javascript GitHub - alexanderGugel/arc-js: An Adaptive Replacement Cache (ARC) written in JavaScript.

en.wikipedia.org