1 2 3 4 5 6 |
std::sort( examples.begin(), examples.end(), [](const auto& a, const auto& b) { return a->example_title() < b->example_title(); }); |
1 2 3 4 5 6 |
std::sort( examples.begin(), examples.end(), [](const auto& a, const auto& b) { return a->example_title() < b->example_title(); }); |
無線LANルータ(Buffalo)を買って、すでにあるモデム兼ルータ(NTT)に接続したのだが、NTTに有線で接続しているPCからBuffaloの設定ページに接続できなかった時のメモ。
NTTのネットワーク:192.168.3.0/24
Buffaloのネットワーク:192.168.11.0/24
Buffaloはルータモードで運用
Buffaloのインターネット側のIP、つまりNTTとつながっている側のIPを固定にする。ここでは192.168.11.100にする。この時の設定はBuffaloで無線でつながっているスマホから行った。(NTTのDHCPはこのアドレスを割り当てないようにしておかなければならない)
Buffaloでインターネット側(NTT側)からのポート80をアクセス許可する。
自動でルーティング設定はしてくれないみたいなので、このままでは有線PCからBuffaloに接続できない。のでNTTで静的ルーティングを設定する。
これで有線PCから192.168.11.1にアクセスすると無線ルータのページに接続できた。
## どこでWidgetが作られるか
### content_shell
ShellBrowserMainParts::PreMainMessageLoopRunで作られる。Shell::CreateNewWindowでShellがつくられる。
### chrome
ChromeBrowserMainParts::PreMainMessageLoopRunImpl()でつくられる。BrowserFrameはWidgetを継承。
## どこでViewはつくられるか
### content_shell
ShellWindowDelegateView::InitShellWindow()
ShellWindowDelegateViewはWidget::InitParamのdelegate渡される
### chrome
BrowserViewやToolbarView::Init()
## ボタンのメッセージハンドラ
### content_shell
Shellがもつ
### chrome
chrome::BrowserCommandControllerがもつ
BrowserCommandController::ExecuteCommandWithDisposition
enable_ifによりある条件のときだけtemplateを有効にすることができる。逆に言うとtemplateにしたくない条件を無効化することができる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
// 5-example.cpp : This file contains the 'main' function. Program execution begins and ends there. // #include <iostream> template<typename T> void myfunc(T t) { std::cout << t << "\n"; } template<typename T, typename = std::enable_if_t<std::is_convertible_v<T, int>>> void myintfunc(T t) { } template<typename T, typename = std::enable_if<std::is_convertible<T, int>::value>::type> void myintfunc_old(T t) { } int main() { myfunc('a'); myfunc(10); myfunc("hello"); myfunc(std::string("hello2")); myintfunc('a'); myintfunc(10); /* error C2672: 'myintfunc': no matching overloaded function found error C2783: 'void myintfunc(T)': could not deduce template argument for '<unnamed-symbol>' message : see declaration of 'myintfunc' */ // myintfunc("hello"); myintfunc_old('a'); myintfunc_old(10); // myintfunc_old("hello"); } |
std::enable_if_t<std::is_convertible_v<T, int>>はstd::enable_if<std::is_convertible<T, int>::value>::type>と同じことなのでこれについて考える。
全体としての意味はTがintに変換できるときだけテンプレートを有効にするということ。
is_convertible<T, int>はTがintに変換できるかを判定し、その結果はvalueに格納される。
enable_if<A>はAがtrueかどうかを判定し、trueならばtypeに型voidを格納する。falseならエラーになる。
よって全体としてTがintに変換できない場合はエラーになり、templateのインスタンス化は行われない(コンパイルエラーにはならない(SFINAE))。
この例ではどういうときにこれを使うのかの応用例は示せていないが、特定の型のときだけテンプレートを有効にしたい場合に使う。
typename = としているのはtypename A = などと同じでデフォルトのテンプレート引数の指定、これはテンプレートのインスタンス化をするかどうかだけのために使われるので、コード中では使われないのでこういう記述になっている。
1 |
$ TEMP=/mytmp dosomething |
1 2 |
$ export TEMP=/mytmp $ dosomeghin |
1 |
drwxrwxrwt 30 root root 20480 Mar 20 14:17 /tmp |
すべてのページを90度回転する
1 |
qpdf in.pdf out.pdf --rotate=90 |
10ページから最後まで180度回転する
1 |
qpdf in.pdf out.pdf --rotate=180:10-z |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
private void btnBrowseApp_Click(object sender, EventArgs e) { using (OpenFileDialog dlg = new OpenFileDialog()) { dlg.Title = "title"; dlg.DefaultExt = "exe"; StringBuilder sbFilter = new StringBuilder(); sbFilter.Append("Application"); sbFilter.Append(" "); sbFilter.Append("(*"); sbFilter.Append(".exe"); sbFilter.Append(")|*"); sbFilter.Append(".exe"); sbFilter.Append("|"); sbFilter.Append("All Files (*.*)|*.*"); dlg.Filter = sbFilter.ToString(); if (DialogResult.OK != dlg.ShowDialog()) return; txtApp.Text = dlg.FileName; } } |
1 2 3 4 5 6 7 8 9 10 11 |
private void btnBrowseArg_Click(object sender, EventArgs e) { using (OpenFileDialog dlg = new OpenFileDialog()) { dlg.Title = "title"; if (DialogResult.OK != dlg.ShowDialog()) return; txtArg.Text = dlg.FileName; } } |
qpdfを使う。
1,10,100ページ目を180度回転させるには以下のコマンド。
1 |
> qpdf.exe input.pdf --rotate=180:1,10,100 out.pdf |
範囲を指定するときはハイフンで指定する。
ocrmypdfが使う。
1 2 |
$ sudo -H pip3 install --upgrade pip $ sudo -H python3.6 -m pip install -U pymupdf |
1 |
$ sudo apt install tesseract-ocr-jpn* |
1 |
$ sudo apt install ocrmypdf |
1 2 3 4 5 6 |
$ tesseract --list-langs List of available languages (4): jpn eng osd jpn_vert |
まずPDFの言語と縦書きか横書きかを確認する。日本語の縦書きの場合は以下を実行。
1 |
$ ocrmypdf -l jpn_vert input.pdf output.pdf |
英語とドイツ語で実行。まずはドイツ語のtesseract-ocrをインストール
1 2 3 4 5 6 7 8 9 10 |
$ sudo apt install tesseract-ocr-deu $ $ tesseract --list-langs List of available languages (5): deu eng jpn jpn_vert osd $ ocrmypdf -l eng+deu input.pdf out.pdf |
pdfを書き換える。以下のどれか1つ。
1 2 3 |
$ gs -q -sDEVICE=pdfwrite -o out.pdf input.pdf $ gs -o out.pdf -dSAFER -sDEVICE=pdfwrite input.pdf $ pdftk input.pdf cat output out3.pdf |
エラーは以下のコマンドで起こる
1 2 3 4 |
$ gs -q -sDEVICE=txtwrite -dTextFormat=0 -o out.txt input.pdf corrupted size vs. prev_size Aborted $ |
このエラーはmalloc関連らしくgsのソースを見ないとわからないと思う。