Windows10のタスクスケジューラーをコマンド( SCHTASKS )で登録する
タスクスケジューラの登録をコマンドを利用してやってみる。
GUIで操作する場合
GUIで操作する場合は、taskschd.mscを起動してください。以下のようなアプリが起動して、画面を操作することでタスクが登録できます。 今回はコマンドを利用してタスクを登録する為、GUIは利用しません。
タスクが動いたか確認する為のアプリケーション
起動すると、マイドキュメントに、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時に指定してプログラムが動いたかを確認してみる。
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
参考
ドキュメントに書いてました。
国会会議録検索システム 検索用APIをPHPから触ってみる
前回の記事
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から利用したサンプルのエントリを書きました。
超訳 Xamarin の概要
Microsoftのページって個人的に理解する為に、ワンクッションおくことが多いです。
色々読みながら、で結局どうなの?ってのにたどり着くまで結構時間かかること多いんですよね。。。
これは、単純に筆者のスキルレベルのせいだと考えてます。
なので、筆者的に理解した翻訳を残しておこうというメモ。的なエントリです。
今回訳してみたページ
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利用)
- knplabs/knp-snappyの準備
- 画像埋め込みの確認用に猫の画像を検索してダウンロードしておく
- phpファイル作成
- 結果
- その他
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
名前は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);
結果
その他
tcpdfはこちら
tcpdfバージョンのエントリは以下より。
dompdfはこちら
tcpdfバージョンのエントリは以下より。
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 + "が降りている"); } } } }
参考
都道府県知事のtwitterアカウントを調べてみた
- 北海道
- 青森県
- 岩手県
- 宮城県
- 秋田県
- 山形県
- 福島県
- 茨城県
- 栃木県
- 群馬県
- 埼玉県
- 千葉県
- 東京都
- 神奈川県
- 新潟県
- 富山県
- 石川県
- 福井県
- 山形県
- 長野県
- 岐阜県
- 静岡県
- 愛知県
- 三重県
- 滋賀県
- 京都府
- 大阪府
- 兵庫県
- 奈良県
- 和歌山県
- 鳥取県
- 島根県
- 岡山県
- 広島県
- 山口県
- 徳島県
- 香川県
- 愛媛県
- 高知県
- 福岡県
- 佐賀県
- 長崎県
- 熊本県
- 大分県
- 宮崎県
- 鹿児島県
- 沖縄県
北海道
鈴木直道
青森県
三村申吾 (なし)
岩手県
達増拓也
宮城県
村井嘉浩 (なし)
秋田県
佐竹敬久 (なし)
山形県
吉村美栄子 (なし)
福島県
内堀雅雄 (なし)
茨城県
大井川和彦
栃木県
福田富一
群馬県
山本一太
埼玉県
大野元裕
千葉県
鈴木栄治(森田健作) (なし)
東京都
小池百合子
神奈川県
黒岩祐治
新潟県
花角英世
富山県
石井隆一 (なし)
石川県
谷本正憲 (なし)
福井県
杉本達治 (なし)
山形県
長崎幸太郎
長野県
阿部守一
岐阜県
古田肇 (なし)
静岡県
川勝平太 (なし)
愛知県
大村秀章
三重県
鈴木英敬
滋賀県
三日月大造
京都府
西脇隆俊 (なし)
大阪府
吉村洋文
兵庫県
井戸敏三
奈良県
荒井正吾 (なし)
和歌山県
仁坂吉伸 (なし)
鳥取県
平井伸治 (なし)
島根県
丸山達也
岡山県
伊原木隆太 (なし)
広島県
湯崎英彦
山口県
村岡嗣政 (なし)
徳島県
飯泉嘉門
香川県
浜田恵造
愛媛県
中村時広 (なし)
高知県
浜田省司
福岡県
小川洋 (なし)
佐賀県
山口祥義 (なし)
長崎県
中村法道 (なし)
熊本県
蒲島郁夫 (なし)
大分県
広瀬勝貞
宮崎県
河野俊嗣
鹿児島県
塩田康一 (なし)
沖縄県
玉城康裕 (玉城デニー)
VSCode、Laravelのweb.phpでUndefined type 'Route' のエラーメッセージを消す方法を探す記録
問題
VSCodeでなみなみ線がつく。
調べる
あった。 github.com
解決策
routes/web.phpの先頭に以下のコード追加
use Illuminate\Support\Facades\Route;
Authも使う場合はこちらも追加
use Illuminate\Support\Facades\Auth;
結果
無事なみなみ線が消えました。
参考
キャッシュアルゴリズムの情報収集
そもそもキャッシュとは
様々な情報伝達経路において、ある領域から他の領域へ情報を転送する際、その転送遅延を極力隠蔽し転送効率を向上するために考案された記憶階層の実現手段
参考
wikipediaにあるキャッシュアルゴリズムをそれぞれ調査
wikipedia のキャッシュアルゴリズムを元に、それぞれ調査
Least Recently Used (LRU) [直訳:最近使用されていない]
最近最も使われていないデータを最初に捨てる。このアルゴリズムでは、どのデータがどの時点で使われたかという情報を保持する必要があり、本当に最近最も使われていないデータを常に捨てるようにしようとすると、かなり手間がかかる。一般的実装では、キャッシュライン毎に世代ビット群(age bits)を持たせ、どのラインが最近最も使われていないかを世代ビット群で判断する。その場合、あるキャッシュラインを使うときには、常に全キャッシュラインの世代ビット群を更新する必要がある。
利用箇所とか
Oracleのバッファキャッシュなどは、このアルゴリズムだそう。
RedisもLRUがあるよう。
Most Recently Used (MRU) [直訳:最近使用された]
最近最も使われたデータを最初に捨てる。アクセスに局所性を想定できず、LRUの実装が複雑すぎる場合に使われる。MRUの使用例としてはデータベースのメモリキャッシュがある。
「最近開いたファイル」も、Most Recently Usedと呼ぶらしい(ややこしい・・・)
Pseudo-LRU (PLRU) [直訳:擬似的-最近使用されていない]
例えば、キャッシュメモリの連想度が大きい場合(4ウェイ以上)、LRUの実装コストは無視できなくなる。確率的にほぼ常に最近最もつかわれていないデータを捨てれば十分という場合、PLRUアルゴリズムを使う。この場合、キャッシュライン毎に1ビットの情報を保持するだけでよい。
言語 | リンク |
---|---|
java | LRU-Cache/PseudoLRUCacheSet.java at master · houli/LRU-Cache · GitHub |
Least Frequently Used (LFU) [直訳:使用頻度が最も低い]
各データが使われた頻度を保持する。そして、頻繁には使われていないデータを最初に捨てる。
言語 | リンク |
---|---|
javascript | Javascript/LFUCache.js at master · TheAlgorithms/Javascript · GitHub |
Adaptive Replacement Cache (ARC) [直訳:適応的置換キャッシュ]
LRU と LFU の間でバランスをとり、最適な結果を得る方式。最近キャッシュから消された情報の履歴を保持するように拡張し、その情報を使って、「かつてキャッシュされていたけれど今はキャッシュから消されている」という情報を元に、LRUとLFUの配分を動的に自動的に調整する。以下の4つのキューを使う。
- LRU (アクセス回数が1回。常にLFUよりも大きな容量を割り当てる。)
- LFU (アクセス回数が2回以上のデータ)
- かつてLRUに入っていた (これ自体もLRU)
- かつて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. |