自分のワードプレスのログイン画面をブックマークしているのだが、自分はワードプレスは複数持っている。
そこで、ワードプレスのログイン画面にファビコンをつけることができれば、ブックマーク一覧からも素早くログインしたいワードプレスを選ぶことができて、便利だろうなーと思い、ワードプレスのログイン画面にファビコンをつける方法を調べてみた。

まず、ワードプレスがインストールされているディレクトリに、wp-login.phpというファイルがある。
これがログイン画面の核となるファイルである。

このファイルの約90行目前後(バージョンによって違う)にというタグがある。
Wordpressのログイン編集

このタグのすぐ下に、 <link rel="shortcut icon" href=" ~URL~ /○○.png"> とすることにより、ファビコンを設定することができる。</p> <p><a href="https://www.nichibotsu.blog/wp-content/uploads/2019/06/190603WPLogin2-1.png"><img decoding="async" src="https://www.nichibotsu.blog/wp-content/uploads/2019/06/190603WPLogin2-1-150x150.png" alt="wp_upload_dir()の挿入" width="150" height="150" class="alignnone size-thumbnail wp-image-531" /></a></p> <p>ちなみに、ファビコンは「.ico」ファイルが基本であるが、別にpngでも問題なかったため自分はpngにしている。</p> <p>さて、ここでURLを入力するときのコツを少し。<br /> URLをwp-loginファイルに直接入力してもいいのだが、ワードプレスを引っ越したり、ドメインが変更したりすると、ファビコンが反映されなくなってしまう。<br /> そこで、ワードプレスの関数を使うことを推奨する。</p> <p>自分は、ファビコンを他の画像と同じくuploadsというディレクトリに入れている。<br /> このuploadsのURLの関数は、次の通りである。</p> <p><?php $upload_dir = wp_upload_dir(); ?><br /> <?php echo $upload_dir['baseurl']; ?></p> <p>この結果、例えばこのブログなら、「https://www.nichibotsu.blog/wp-content/uploads」と出力される。<br /> 上記の二行を一行にするなら、</p> <p><?php $upload_dir = wp_upload_dir(); echo $upload_dir['baseurl']; ?></p> <p>となる。</p> <p>これをさっきのファビコンのlinkに挿入し、 <link rel="shortcut icon" href="<?php $upload_dir = wp_upload_dir(); echo $upload_dir['baseurl']; ?>/○○.png”><br /> とwp-loginファイルに書き込むと、ドメインが変更されてもファビコンが消えることはない。</p> </section> </article> <article id="post-458" class="post-458 post type-post status-publish format-standard hentry category-7" > <header class="post-header"> <ul class="post-meta list-inline"> <li class="date updated"><i class="fa fa-clock-o"></i> 2019.01.07</li> </ul> <h2 class="post-title"><a href="https://www.nichibotsu.blog/458.html">PYTHONのFEEDPARSERでRSSのデータをEXCELに出力するものを作ってみた(コード編)</a></h2> </header> <section class="post-content"> <p>Python(Ver 2.7)でfeedparserを使ってRSSリーダーを作った。</p> <p><a href="https://sunset.mixh.jp/nichibotsu.blog/?p=453" target="_blank" rel="noopener">インストール編</a><br /> <a href="https://sunset.mixh.jp/nichibotsu.blog/?p=449" target="_blank" rel="noopener">ダラダラ解説編</a></p> <p>「...」はタブを表す。</p> <p><span style="color: #339966;"># -*- coding: utf-8 -*-</span></p> <p><span style="color: #339966;">#インポート</span><br /> import feedparser<br /> import win32com.client<br /> import datetime<br /> import time</p> <p><span style="color: #339966;">#開くExcelの設定</span><br /> <span style="color: #339966;">#Excelファイル名は「RSS.xlsm」、最終行を取得するマクロのプロシージャ名は「GetLastRow」とする。</span><br /> <span style="color: #339966;">#シート1ページ目に取得した更新情報、2ページ目にRSSのURL一覧を入力する</span><br /> xl = win32com.client.Dispatch(“Excel.Application”)<br /> book = xl.Workbooks(u”RSS.xlsm”)<br /> xl.Run(u”RSS.xlsm!GetLastRow”)<br /> Sheet_Top = book.Worksheets(1)<br /> Sheet_URL = book.Worksheets(2)</p> <p><span style="color: #339966;">#前回の更新情報を取得した時間を変数に格納する。</span><br /> <span style="color: #339966;">#シート2ページ目のセルD1に日時、セルD2に前回取得した時間を入力している。</span><br /> <span style="color: #339966;">#セルD1には日付を入れているが、なぜか00:00:00が加わるためstrftimeで日付だけ抽出する。</span><br /> D = time.strptime( str( Sheet_URL.cells(1, 4).Value ), “%m/%d/%y %H:%M:%S”)<br /> Prev_Day = time.strftime(“%Y/%m/%d”, D)<br /> D = time.strptime( str( Sheet_URL.cells(2, 4).Value ), “%H:%M:%S”)<br /> Prev_Time = time.strftime(“%H:%M:%S”, D)</p> <p><span style="color: #339966;">#シート2ページ目のA列にサイト名、B列にRSSのURLが入力されている。</span><br /> <span style="color: #339966;">#URLの行はiで、Excelの最終行はi3とする。</span><br /> <span style="color: #339966;">#ValはExcelのi行目のサイト名であり、これが空白ではない限り(Noneではない限り)URLを順に読み込んで処理を行っていく。</span><br /> i = 1<br /> i3 = int( Sheet_URL.cells(3, 4).Value ) + 1<br /> Val = Sheet_URL.cells(i, 1).Value</p> <p>while Val != None :</p> <p><span style="color: #339966;">#feedparserにExcelのRSSのURLを入力していく。</span><br /> ...URL = Sheet_URL.cells(i, 2).Value<br /> ...Result = feedparser.parse(URL)</p> <p><span style="color: #339966;">#変数ResultにRSSの情報が配列で格納されたので、配列数を数え(lenメソッド)、順に更新時間を取得していく(最後にExcelに取得した日付より前か後かを比較するため)</span><br /> <span style="color: #339966;">#+0900および+09:00は、処理で使わないため、+0000および+00:00に置換する。</span><br /> <span style="color: #339966;">#置換しなくても回避できるかもしればいが、自分の技術力ではstrptimeが使えない</span><br /> ...for i2 in range( len(Result.entries) ) :<br /> ......if “?xml” not in Val and “rdf” not in Val :<br /> .........T = Result.entries[i2].updated.replace(“+0900″,”+0000”)<br /> .........T = time.strptime(T, “%a, %d %b %Y %H:%M:%S +0000”)<br /> ......else :<br /> .........T = Result.entries[i2].updated.replace(“+09:00″,”+00:00”)<br /> .........T = time.strptime(T, “%Y-%m-%dT%H:%M:%S+00:00”)</p> <p><span style="color: #339966;">#置換した結果Tから、記事の更新日付と時間をそれぞれ抽出する。</span><br /> ......T_Day = time.strftime(“%Y/%m/%d”, T)<br /> ......T_Time = time.strftime(“%H:%M:%S”, T)</p> <p><span style="color: #339966;">#シート2ページ目の前回取得日時と比較し、前回取得の日時以降の更新なら、サイト名、記事タイトル、記事URL、更新日、更新時間を取得する。</span><br /> <span style="color: #339966;">#取得してセルに入力したら、最終行i3を次の行にする。</span><br /> ......if Prev_Day == T_Day and Prev_Time <= T_Time :<br /> .........Sheet_Top.cells(i3, 1).Value = Result.feed.title<br /> .........Sheet_Top.cells(i3, 2).Value = Sheet_URL.cells(i, 4).Value<br /> .........Sheet_Top.cells(i3, 3).Value = Result.entries[i2].title<br /> .........Sheet_Top.cells(i3, 4).Value = Result.entries[i2].link<br /> .........Sheet_Top.cells(i3, 5).Value = T_Day<br /> .........Sheet_Top.cells(i3, 6).Value = T_Time<br /> .........i3 = i3 + 1</p> <p>......elif Prev_Day < T_Day :<br /> .........Sheet_Top.cells(i3, 1).Value = Result.feed.title<br /> .........Sheet_Top.cells(i3, 2).Value = Sheet_URL.cells(i, 4).Value<br /> .........Sheet_Top.cells(i3, 3).Value = Result.entries[i2].title<br /> .........Sheet_Top.cells(i3, 4).Value = Result.entries[i2].link<br /> .........Sheet_Top.cells(i3, 5).Value = T_Day<br /> .........Sheet_Top.cells(i3, 6).Value = T_Time<br /> .........i3 = i3 + 1<br /> <span style="color: #339966;">#配列の全ての更新時間(配列内の番号は変数i2)が終わったら、次のURL(Excelのi行目)に行く。</span><br /> <span style="color: #339966;">#i行目のサイト名が空白(None)かどうか判定するため、Valで取得しなおす。</span><br /> ...i = i + 1<br /> ...Val = Sheet_URL.cells(i, 1).Value</p> <p><span style="color: #339966;">#ExcelのすべてのRSSの更新記事取得が終わったら、現在時刻を取得し、シート2ページ目のセルD1、D2に入力する。</span></p> <p>Dt_Now = datetime.datetime.now()<br /> Dt_Today = Dt_Now.strftime(“%Y/%m/%d”)<br /> Dt_Time = Dt_Now.strftime(“%H:%M:%S”)<br /> Sheet_URL.cells(1, 4).Value = Dt_Today<br /> Sheet_URL.cells(2, 4).Value = Dt_Time</p> </section> </article> <article id="post-453" class="post-453 post type-post status-publish format-standard hentry category-7" > <header class="post-header"> <ul class="post-meta list-inline"> <li class="date updated"><i class="fa fa-clock-o"></i> 2019.01.07</li> </ul> <h2 class="post-title"><a href="https://www.nichibotsu.blog/453.html">PythonのfeedparserでRSSのデータをExcelに出力するものを作ってみた(インストール編)</a></h2> </header> <section class="post-content"> <p>Python(Ver 2.7)でfeedparserを使ってRSSリーダーを作った。</p> <p><a href="https://sunset.mixh.jp/nichibotsu.blog/?p=449" rel="noopener" target="_blank">ダラダラ解説編</a><br /> <a href="https://sunset.mixh.jp/nichibotsu.blog/?p=458">コード編</a></p> <p>pip install feedparser でインストールできる・・・といろんなサイトに書いているけど、全然できなかったので違う方法を。</p> <p>こちらの<a href="http://bty.sakura.ne.jp/wp/archives/86" rel="noopener" target="_blank">サイト様</a>を参考にした。</p> <p>・まず、下記のサイトでfeedparserをダウンロードする。<br /> <a href="https://github.com/kurtmckee/feedparser" rel="noopener" target="_blank">https://github.com/kurtmckee/feedparser</a></p> <p>・ZIP形式なので、これを解凍する。<br /> 解答したフォルダを、例えばデスクトップ上においたとする。<br /> フォルダ名は「feedparser-develop」であるが、さらにその中に「feedparser-develop」がある。そしてその中に、setup.pyというのがある。</p> <p>・コマンドプロンプトを立ち上げる。</p> <p>・現在のディレクトリを、解答した「feedparser-develop」の中の「feedparser-develop」とする<br /> コマンドは下記の通り<br /> cd C:\Users\あなたのユーザー名\Desktop\feedparser-develop\feedparser-develop</p> <p>・インストールする<br /> コマンドは下記の通り<br /> python setup.py install</p> <p>以上です。</p> </section> </article> <article id="post-449" class="post-449 post type-post status-publish format-standard hentry category-7" > <header class="post-header"> <ul class="post-meta list-inline"> <li class="date updated"><i class="fa fa-clock-o"></i> 2019.01.07</li> </ul> <h2 class="post-title"><a href="https://www.nichibotsu.blog/449.html">PythonのfeedparserでRSSのデータをExcelに出力するものを作ってみた(ダラダラ解説編)</a></h2> </header> <section class="post-content"> <p>Python(Ver 2.7)でfeedparserを使ってRSSリーダーを作った。</p> <p><a href="https://sunset.mixh.jp/nichibotsu.blog/?p=453" target="_blank" rel="noopener">インストール編</a><br /> <a href="https://sunset.mixh.jp/nichibotsu.blog/?p=458">コード編</a></p> <p>フリーでもRSSリーダーはたくさんあるのだが、数十のサイトの新規記事名を一覧に抽出したいと思い、PythonとExcelを連動させてRSSリーダーを作ってみた。<br /> 記事名や更新日から、いつどのような記事名でブログやニュースが更新をしているのか、統計を取りたくなった。<br /> 統計を取るなら、記事名と更新日の管理はデータベースかExcelが最適だと思っている。<br /> しかし、データベースはいまいちわからないので(PythonでもMySQLやその他各種データベースを操作できるが)、なじみのあるExcelを使うことにした。<br /> 管理は複雑ではないので、Excelで十分である。</p> <p>フリーのRSSリーダーはいくつか試してみたのだが、記事名をCSV等に出力する機能を持っているものはなかった。そのため、ソフト自体は更新記事を確認したり独自のタグやラベルを付けて読み返す分にはいいが、記事タイトルを抽出するには手作業で一つずつコピペしなければならない。</p> <p>そこでPythonの登場である。</p> <p>Pythonって結構なんでもできるから、抽出するやつなんかないかな~と思っていたら、やっぱりありました。さすがです。<br /> feedparserというやつができるみたいです。<br /> 素人ながら記事名と記事URLをExcelに抽出するRSSリーダーを作ってみたので、以下にやったことをつらつら書いてきます。</p> <p>【流れ】</p> <p>→以下、Excel<br /> ファイル名は「RSS.xlsm」とする。</p> <p>・RSSを取得できるURLを用意した。<br /> feed、rss、xml、rdfは取得できることを確認済み。<br /> Atomはわらからないけど、多分できそう。</p> <p>・URLをExcelシートの2ページ目に一覧にした。<br /> URLをA列に順に入力した。</p> <p>・最終記事取得日時を入力できるセルをシート2ページ目に用意した。<br /> 更新取得日時がないと、起動するたびに取得した記事名やURLが、前回取得した時と重複する。そこで、取得日以降に更新した日だけを抽出するため、取得日を入力できるセルを用意した。<br /> 取得日は、日付と時間を分けてセルを2個用意した。<br /> 例えば記事取得日をセルD1、時間をセルD2とする。<br /> 日付はYYYY/MM/DD表示(例:2019年1月1日→2019/01/01)、時間はHH:MM:SS表示(例9時6分02秒→09:06:02)とする。</p> <p>・シート1ページ目(記事名と記事URLを一覧にするシート)に、抽出した結果を入力する欄を作った。<br /> A列にサイト名、B列に記事名、C列に記事URL、D列に各記事の更新日を入れることにした。</p> <p>・シート1ページ目の最終行を取得するマクロを組んだ<br /> 記事をどんどん最終行の次の行に入力していく。そこで、最終行がどこかを把握する必要がある。Pythonでも最終行を取得することはできるが、Pythonを少しでもスッキリ(文字量を少なく)させるため、最終行の取得はマクロで行うことにした。<br /> 最終行は、シート1ページ目の邪魔にならないように、シート2ページ目のセルD3に入れるようにした。</p> <p>マクロは以下の通り<br /> ~~~~~~~<br /> Sub GetLastRow()</p> <p>Dim LastRow As Long</p> <p>LastRow = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row<br /> Worksheets(2).Range(“D3”) = LastRow</p> <p>End Sub<br /> ~~~~~~~</p> <p>→以下、Python</p> <p>・win32comでExcelのシート1ページ目、2ページ目を変数にした。<br /> コードを記述するたびに頭から書き続けるのは長くなるので。</p> <p>・前回の記事取得日時を変数にした。<br /> ライブラリdatetimeや時間のstrftimeメソッド、strptimeメソッドを使った。<br /> これの使い方がよくわらかなくて、結構検索した。<br /> 多くのサイトを参考にしたので、感謝申し上げる。</p> <p>datetime、timeどちらにもstrftimeおよびstrptimeメソッドはあるのだが、メソッドの使い方が違うらしい。<br /> そして、現在時刻はtimeよりdatetimeの方がうまくでき、Excelの時間はdatetimeよりtimeを使った方がうまくいったので、今回はそれぞれで使い分けた。</p> <p>strptimeは、日付や時間のような文字列、日付や時間として認識して変数に入れるメソッドである。<br /> これにより、日付や時間の比較や演算が可能となる。文字列のままだと、比較や演算はできない。<br /> Excelのシート2ページ目のセルD1に最終取得日、セルD2に最終取得時間を入力している。<br /> これらを文字列として取得し、それを日付や時間だと認識する。<br /> 取得した記事が、前回の最終記事日時より後に更新したかどうかを比較する。</p> <p>次に、strptimeで日付や時間として認識した変数を、strftimeでそれぞれどのような表示形式になっているかを抽出する。<br /> なぜ、これの作業が必要なのかというと、Pytohnで日時をExcelに入力すると、時間もセットで入力されてしまうからである。<br /> PythonでExcelのセルに「2019/01/01」と入力→セルにはなぜか「2019/01/01 00:00:00」と入力されている<br /> この問題を解決することができなかったので、下記のようにした</p> <p>D = time.strptime( str( Sheet_URL.cells(1, 4).Value ), “%m/%d/%y %H:%M:%S”)<br /> Prev_Day = time.strftime(“%Y/%m/%d”, D)</p> <p>一度セルの値(シート2ページ目をSheet_URLとした)をstrメソッドを使って文字列「2019/01/01 00:00:00」とした。そしてそれを、strptimeを使って変数Dに「2019/01/01 00:00:00」という日時だと認識させ、そこからstrftimeを使って2019/01/01だけ抽出した。</p> <p>→以下、Pythonにおいて、ExcelのRSSのURL最終行まで、1行ずつRSSのURLを読み込んで以下の操作を繰り返す</p> <p>・Excelマクロで最終行を求める<br /> シート2ページのセルD3にExcelの最終行が入力される。</p> <p>・feedparserの出番<br /> feedparserにExcelのRSSのURLを読み込ませる<br /> 取得したデータは配列として変数に格納した。</p> <p>→ここからさらに、配列内データから順に更新時間を取得し、それが最後にRSSを取得した日より前に更新した記事か、後に更新した記事かを比較し、後に更新した記事だけを抽出するように繰り返す</p> <p>・RSSの型を調べる<br /> RSSにはいくつかの形式があるのだが、それぞれ記事の更新日時の表示形式が異なる。<br /> 2019年1月2日水曜日午前1時2分3秒を例にする。</p> <p>1 feedおよびrss<br /> 例は「Wed, 02 01 2019 01:02:03 +0900」と表示される。<br /> 短い表記の曜日が入ったり、GMTからどれだけずれているかという+0900が入ったりとややこしい。<br /> これを time.strptime(T, “%a, %d %b %Y %H:%M:%S +0900”) とすれば万事解決・・・ではなかった。<br /> どういう違いがあるかわからないが、サイトによってはこの+0900が+0000という時間で取得されるのである。(おそらくサーバーとかによって違うのかな・・・?海外のサーバーを使っていたり・・・)<br /> そこで、調べたら、文字列は%%でいけるらしいのである。<br /> しかし、time.strptime(T, “%a, %d %b %Y %H:%M:%S %%”) や+0900の文字数に合わせてtime.strptime(T, “%a, %d %b %Y %H:%M:%S %%%%%”) としても、うまくいかなかった。</p> <p>サイトによって+0900だったり+0000だったり・・・困ったな・・・<br /> ということで、置換することにした。<br /> この+0900は以後の処理では使わないので、全部+0000表記とすることにした。</p> <p>コードは以下の通り</p> <p>Result = feedparser.parse(URL)<br /> T = Result.entries[2].updated.replace(“+0900″,”+0000”)<br /> T = time.strptime(T, “%a, %d %b %Y %H:%M:%S +0000”)</p> <p>URLをResultという変数に入れる。例えば、記事の3番目はResult.entries[2]に入る。<br /> その更新日時は .update で取得できるので、replaceメソッドで+0900を+0000とした。<br /> そして、strptimeを使ってそれぞれどういう値なのかを変数Tに格納する。</p> <p>2 xmlおよびrdf<br /> 例は「2019-01-02T01:02:03+09:00」と表示される。<br /> これも、最後の+09:00が+00:00の場合もあったため、置換した。</p> <p>Result = feedparser.parse(URL)<br /> T = Result.entries[2].updated.replace(“+09:00″,”+00:00”)<br /> T = time.strptime(T, “%Y-%m-%dT%H:%M:%S+00:00”)</p> <p>・取得した記事の時間の比較をする<br /> 前回取得した日時(Excelシート2ページ目セルD1、D2)と、記事更新の日時を比較する。<br /> (...はコード上のタブ。)<br /> 前回の日時はPrev_DayおよびPrev_Time、記事更新の日時はT_DayおよびT_Timeとした。<br /> <strong>「前回取得と記事更新の日時が同じ日 かつ 前回取得の時間より記事更新の時間が後」 または 「前回取得の日付より記事更新の日付が後」</strong> ならExcelに情報を入力していく。<br /> ただ単に日付だけ比較すると、同じ日に2回以上取得したら、前回取得した日付と同じ日付になってしまうので、取得できない。<br /> そこで、同じ日の場合は、同じ日だけど前回取得した時間より記事更新の時間が後であれば取得するように条件をくわえる。<br /> 上記太文字において、 <strong>「~~かつ~~」または「~~」</strong> のandとorをうまく使って1行にする自信がなかったので、同じ処理だけど条件を2行にした。うまくやれば1行でいけると思うんだけど・・・</p> <p> </p> <p>if Prev_Day == T_Day and Prev_Time <= T_Time :<br /> ...情報をExcelに入力<br /> elif Prev_Day < T_Day :<br /> ...情報をExcelに入力</p> <p> </p> <p>・サイトタイトルを取得する<br /> サイトタイトルは、URLを読み込んだfeedparserの、feed.title(メソッド?)で取得できる。</p> <p> </p> <p>Result = feedparser.parse(URL)<br /> Site_Name = Result.feed.title</p> <p> </p> <p>・記事タイトルを取得する<br /> 更新記事3番目のタイトルは以下の通り</p> <p> </p> <p>Result = feedparser.parse(URL)<br /> Page_title = Result.entries[2].title</p> <p> </p> <p>・記事URLを取得する<br /> 更新記事3番目のURLは以下の通り</p> <p> </p> <p>Result = feedparser.parse(URL)<br /> Page_title = Result.entries[2].link</p> <p> </p> <p>→1サイトの全更新記事(配列内の全て)を更新時間を比較しながらExcelに入力していったら、次のURLに行く</p> <p> </p> <p>→全てのURLを更新し終わったら、現在時刻をExcelに入力する。<br /> datetime.datetime.now()を使う。</p> <p> </p> <p><a href="https://sunset.mixh.jp/nichibotsu.blog/?p=458" rel="noopener" target="_blank">コードはこちら</a></p> </section> </article> <article id="post-409" class="post-409 post type-post status-publish format-standard hentry category-7" > <header class="post-header"> <ul class="post-meta list-inline"> <li class="date updated"><i class="fa fa-clock-o"></i> 2018.10.22</li> </ul> <h2 class="post-title"><a href="https://www.nichibotsu.blog/409.html">VBEエキスパート スタンダードを受験してきた(合格体験記?)</a></h2> </header> <section class="post-content"> <p>仕事で出会ってから、何年も前から趣味にしていたVBAを何らかの形に残しておこうと思い、VBAエキスパートというVBAで国内唯一の資格(民間資格)を受験してきた。<br /> 結果は合格した(700点以上合格:933/1000点)が、誰かの参考になればと思い、気づき事項を述べていく。<br /> ちなみに、勉強時間は1日30分~2時間を2週間くらい。<br /> 簡単だとは事前に聞いていたが(ネット上の合格体験記を読んだ印象)、落ちた時に受験費用1万5千円がもったいないのでけっこうガッツリ勉強した。</p> <p>・勉強は公式テキストを使う<br /> 出題範囲は、公式テキストから出題される。百戦錬磨のVBAの技術者だとしても、念のため公式テキストを読んでおくことをおすすめする。<br /> また、PDFの演習問題およびプログラムの公式模擬問題を無料でダウンロードできるため、それらもダウンロードし、満点取れるくらい何度も繰り返し解く。<br /> Vectorで別途追加で別売り公式模擬問題を購入することもできるため、上記だけでは不安な人は購入し、満点取れるくらい繰り返し勉強してもいいと思う。<br /> 自分は別途購入し、試験結果は9割超えたが、Vectorの別売り問題は購入しなくても7割は越えることができるため、必須ではない。</p> <p>・模擬試験より入力問題が多い<br /> ほとんどが選択問題ではなく、入力問題だと思っていい。<br /> CreateObjectやIsNumericなど、模擬問題では選択として出題される内容の入力もあったため、選択問題および問題のコード文に出る関数やメソッドは、一通りスペルを間違えることなく入力できるようにした方がいい。</p> <p>・模擬試験と解答は同じだが、違う角度で出題される<br /> 問題と答えをセットで丸暗記し、解ける問題とそうではない問題がある。<br /> 公式模擬試験で出題された問題の解答と、同じ単語が正解になる問題だとしても、本番では出題される問題の角度、視点が違う形で出される。<br /> 公式模擬試験を何度も解くと、反射神経で解けるようにはなるが、問題文のコードや解答の単語がどのようなものなのか、理解しておいた方が解きやすい。<br /> ただ、「この単語が問題文に来たら解答はこれ」等ゴリゴリの丸暗記でも行けそうな気がしないでもない。自分は理解しながら勉強を進めたので、確信は持てないが。</p> <p>・試験会場では、筆記用具は支給されない<br /> ITエキスパートでは、筆記用具の持ち込みは不可だが、メモ用に鉛筆とA4の白紙を支給された。VBAエキスパートでは支給されなかったため、脳内だけで解く練習が必要である。<br /> 特に、数回ループした結果どうなるか、という問題では、紙に書いてより確実に解いておきたかった(正解したが)。</p> <p>・試験は早めに始めることができた<br /> 試験当日、指定された席に座り、自分の住所や試験内容を確認し、試験管が最終確認を行ったら、開始時間ではなかったが試験を始めることができた。<br /> 退出も、試験が終わった段階できた。<br /> ただし、試験管からの事前の説明では、たとえトイレ等の理由だったとしても、退出した時点で再入室して試験を受けることはできないため、注意が必要である。</p> </section> </article> <article id="post-260" class="post-260 post type-post status-publish format-standard hentry category-7" > <header class="post-header"> <ul class="post-meta list-inline"> <li class="date updated"><i class="fa fa-clock-o"></i> 2017.12.13</li> </ul> <h2 class="post-title"><a href="https://www.nichibotsu.blog/260.html">現在のディレクトリと違うドライブにあるバッチのディレクトリを取得する</a></h2> </header> <section class="post-content"> <p>コマンドプロンプトのバッチで、現在のバッチファイルが置かれているディレクトリは「%~dp0」で取得することができます。<br /> それぞれの文字が持つ意味は、特にわかっていませんが(笑)、まぁこれで取得できます。</p> <p>cdでディレクトリを移動できるので、「cd %~dp0」とバッチファイルに書くと、そのバッチファイルのディレクトリへ移動できます。</p> <p>また、違うドライブに移動する時は、「/d」を「cd」の後に書きます。</p> <p>以上の2点は、ネットで調べたら出てきたのですが、違うドライブにあるバッチファイルのディレクトリの取得方法は、あまり見かけませんでした。<br /> (もちろん根気よく探したらありましたが)</p> <p>「/d」でよく見かけるのが、Dドライブへの移動、もしくはDドライブの取得ですが、現在のディレクトリがCドライブで、バッチファイルが常にDドライブにあるとは限りません。USBフラッシュメモリに入れて持ち歩いたら、Eかもしれないし、Fかもしれません。</p> <p>そこで、取得方法を以下に述べます。単純です。組み合わせるだけです。<br /> 「cd /d %~dp0」<br /> これで、バッチファイルがどのドライブに入っていても、移動できます。<br /> 僕は、Pythonのファイルとバッチファイルを常に同じフォルダに入れて、デスクトップやらノートパソコンやらを行ったり来たりするので、これを知ってからだいぶ楽になりました。<br /> どのUSBに「sample.py」を入れても、同じフォルダにバッチを作っておけばダブルクリックのみで起動できます。</p> <p><strong>cd /d %~dp0<br /> python sample.py</strong></p> <p>もちろん上記の例でsample.pyが動くのは、Pythonがパソコンにインストールされていることが前提ですよ。</p> </section> </article> <article id="post-250" class="post-250 post type-post status-publish format-standard hentry category-7" > <header class="post-header"> <ul class="post-meta list-inline"> <li class="date updated"><i class="fa fa-clock-o"></i> 2017.12.05</li> </ul> <h2 class="post-title"><a href="https://www.nichibotsu.blog/250.html">Pythonのwin32comで使用できないExcelのファイル名</a></h2> </header> <section class="post-content"> <p>Pythonを覚えてから、win32comによるExcelの操作をするようになったが、win32comによる操作ができないファイル名がある。</p> <p>それは、「-」(ハイフン)が含まれるファイル名である。</p> <p>初めてwin32comでハイフンが含まれるファイル名のExcelを操作しようとしたとき、何かよくわからないエラーがコマンドプロンプトに表示された。<br /> 本当はエラーメッセージから原因を追究できればいいのだろうが、よくわからなかったので、心当たりのあるエラー箇所を徹底的に一つずつ潰しながら検証していった。<br /> その結果、win32comの中身はわからないがハイフンが含まれるファイル名が原因のようだ。<br /> ちなみに、win32comでマクロを走らせることができるが、マクロのプロシージャ名はハイフンが含まれていても大丈夫である。</p> </section> </article> <article id="post-135" class="post-135 post type-post status-publish format-standard hentry category-7" > <header class="post-header"> <ul class="post-meta list-inline"> <li class="date updated"><i class="fa fa-clock-o"></i> 2017.07.04</li> </ul> <h2 class="post-title"><a href="https://www.nichibotsu.blog/135.html">Python2.7(windows)にpyprojをインストールしてみた</a></h2> </header> <section class="post-content"> <p>座標計算を業務でする必要があったため、Python2.7(windows)にpyprojをインストールしてみた。</p> <p>インストールの仕方を調べたところ、普通にpipでできるということで試してみた。</p> <p>python -m pip install pyproj</p> <p>これで、なんかインストールっぽいことをしているなと思いましたが、途中でエラーが出ました。<br /> どうやら、pip特有のインストールエラーみたいで、pythonのバージョンを変えると解決するらしいです。<br /> いやいや、今現在けっこうな数のライブラリを入れているので、できればバージョンを変えないで行いたいです。</p> <p>そこで、easy_installを試してみました。<br /> そしたら、今度はマイクロソフトが提供するpython向けのC++パッケージが無いので、手に入れてください、という表記が出ました。<br /> そこで、下記からダウンロードしてインストールしました。</p> <p><a href="https://www.microsoft.com/en-us/download/details.aspx?id=44266" target="_blank">ここです</a></p> <p>上記URLから、「VCForPython27.msi」を手に入れました。<br /> その後、easy_installをしてみたら、無事に入れることができました。<br /> コマンドプロンプトで以下のコマンドです。</p> <p>「 python -m easy_install pyproj 」</p> </section> </article> <article id="post-96" class="post-96 post type-post status-publish format-standard has-post-thumbnail hentry category-7" > <header class="post-header"> <ul class="post-meta list-inline"> <li class="date updated"><i class="fa fa-clock-o"></i> 2017.06.04</li> </ul> <h2 class="post-title"><a href="https://www.nichibotsu.blog/96.html">tesseract-OCRを使わずにPythonで画像から文字を認識させるソフトを作ってみた – 3</a></h2> </header> <section class="post-content"> <div class="post-thumbnail"> <a href="https://www.nichibotsu.blog/96.html" rel="nofollow"><img width="72" height="81" src="https://www.nichibotsu.blog/wp-content/uploads/2017/06/1-2.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" decoding="async" loading="lazy" /></a> </div> <p><a href="https://sunset.mixh.jp/nichibotsu.blog/?p=76" target="_blank" rel="noopener noreferrer">前回の記事</a></p> <p>さて、2階調化された文字が手に入りました。<br /> ここでは、例として「1」を取り扱いたいと思います。</p> <p><a href="https://sunset.mixh.jp/nichibotsu.blog/wp-content/uploads/2017/06/1-2.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-107" src="https://sunset.mixh.jp/nichibotsu.blog/wp-content/uploads/2017/06/1-2.png" alt="" width="72" height="81" /></a></p> <p>2階調化された1はこれです。</p> <p><a href="https://sunset.mixh.jp/nichibotsu.blog/wp-content/uploads/2017/06/1-3.png"><img loading="lazy" decoding="async" src="https://sunset.mixh.jp/nichibotsu.blog/wp-content/uploads/2017/06/1-3.png" alt="" width="72" height="81" class="alignnone size-full wp-image-108" /></a></p> <p>この画像における1の、縦の長い線の太さは7ピクセルだとします。</p> <p>私の文字の判定は全ての文字に対応できるわけではありませんが、数十文字程度なら対応できます。<br /> この1の画像を1として認識する条件を、<br /> ・一番上の白の幅が7ピクセル以内<br /> かつ<br /> ・一番下の白の部分が7ピクセル以内<br /> とします。</p> <p>まず、一番上のY座標の、一番左のX座標を取得します。<br /> これを基点とします。<br /> 下画像の赤の部分です。(2階調にしたため白なのですが、わかりやすく赤に塗りました。)<br /> また、それにともない黒に赤があってもみづらいため、黒の部分をグレーにしました。<br /> <a href="https://sunset.mixh.jp/nichibotsu.blog/wp-content/uploads/2017/06/1-13.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-104" src="https://sunset.mixh.jp/nichibotsu.blog/wp-content/uploads/2017/06/1-13.png" alt="" width="296" height="250" /></a></p> <p><a href="https://sunset.mixh.jp/nichibotsu.blog/wp-content/uploads/2017/06/1-15.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-115" src="https://sunset.mixh.jp/nichibotsu.blog/wp-content/uploads/2017/06/1-15.png" alt="" width="296" height="250" /></a></p> <p>次に、太さを計算します。<br /> 太さは、一番上のY座標の、一番右のXの座標を取得すればいいです。<br /> 上画像の青になります。</p> <p>最後に、一番底辺のY座標の、左右の色を取得します。<br /> 下の画像の緑の部分です。<br /> 今回は、文字の太さが7ピクセルとわかっているため、左右5ピクセルの色を取得します。<br /> わかりやすいように、ピンクのスケールをつけました。</p> <p><a href="https://sunset.mixh.jp/nichibotsu.blog/wp-content/uploads/2017/06/1-10-1.png"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-116" src="https://sunset.mixh.jp/nichibotsu.blog/wp-content/uploads/2017/06/1-10-1-300x73.png" alt="" width="300" height="73" srcset="https://www.nichibotsu.blog/wp-content/uploads/2017/06/1-10-1-300x73.png 300w, https://www.nichibotsu.blog/wp-content/uploads/2017/06/1-10-1.png 744w" sizes="(max-width: 300px) 100vw, 300px" /></a><br /> この赤のX座標は上の赤のx座標と同じです。</p> <p>これをコードにすると、下記のようになります。</p> <p>def Sample():</p> <p>…import cv2<br /> …import numpy<br /> …from PIL import Image as im<br /> …from PIL import ImageGrab as ig</p> <p><span style="color: #339966;">#ImageGrabを使ってスクリーンショットを取る。</span><br /> <span style="color: #339966;"> #今回は、座標(100,100)から(200,200)の中に、「1」という文字が1つだけ入っているとします。</span><br /> <span style="color: #339966;"> #これを、test.pngとして保存します。</span><br /> …img = ig.grab((100,100,200,200)).save(“test.png”)</p> <p><span style="color: #339966;">#保存されたtest.pngを読み込みます。</span><br /> <span style="color: #339966;"> #cv2ではBGRとして読み込むので、グレースケール化します。</span><br /> <span style="color: #339966;"> #その後、閾値128で2階調化します。</span><br /> <span style="color: #339966;"> #そしてtest.pngとして上書き保存します。</span><br /> …img = cv2.imread(“test.png”)<br /> …img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)<br /> …_ ,img = cv2.threshold(img, 128 ,255,cv2.THRESH_BINARY)<br /> …cv2.imwrite(“test.png”, img)</p> <p><span style="color: #339966;">#今度は、PILのImageを使ってtest.pngを読み込みます。</span><br /> <span style="color: #339966;"> #RGBに変換し、画像のサイズも取得します。</span><br /> …img = im.open(“test.png”)<br /> …rgb_im = img.convert(‘RGB’)<br /> …size = rgb_im.size</p> <p><span style="color: #339966;">#「1」という文字の、一番上のY座標の一番左のX座標を取得します。</span><br /> <span style="color: #339966;"> #座標(0,0)から1行ごとに右へ、1ピクセルずつ順に白か黒か判定します。</span><br /> <span style="color: #339966;"> #もしその行に白がなければ、次の行(Y)に移ります。</span><br /> <span style="color: #339966;"> #白のピクセルがあれば、繰り返しの処理を抜け出します。</span><br /> <span style="color: #339966;"> #なお、RGBにおける白の値は(255,255,255)なので、rが255か0かで白か黒かを判定します。</span><br /> …for y in range(size[1]):<br /> ……for x in range(size[0]):<br /> ………r,g,b = rgb_im.getpixel((x,y))<br /> ………if r == 255 :<br /> …………break<br /> ……if r == 255 :<br /> ………break</p> <p><span style="color: #339966;">#このxが、一番左のx(前掲した画像の赤)になります。</span><br /> ….x_left = x</p> <p><span style="color: #339966;">#今度は、同じY座標において、右から左に各ピクセルが白か黒か判定していきます。ピクセルが黒であり続ける限り、x座標をどんどん左に移動させていきます。</span><br /> …x = size[0] – 1<br /> …r,g,b = rgb_im.getpixel((x,y))<br /> …while r == 0 :<br /> ……x = x – 1</p> <p><span style="color: #339966;">#これが前掲画像の青になります。</span><br /> …x_right = x</p> <p><span style="color: #339966;">#一番底辺のY座標を取得します。</span><br /> …y = size[1] – 1<br /> …r,g,b = rgb_im.getpixel((x_left,y))<br /> …while r == 0 :<br /> ……y = y – 1</p> <p>…y_bottom = y</p> <p><span style="color: #339966;">#一番底辺のY座表の、左右5ピクセルのカラーを取得します。</span><br /> …r2 ,g,b = rgb_im.getpixel((x_left + 5 , y_bottom))<br /> …r3 ,g,b = rgb_im.getpixel((x_left – 5 , y_bottom))</p> <p><span style="color: #339966;">#太さ(x_right – x_leftの差)が7ピクセル以内で、底辺の5ピクセル左右が黒なら1と判定します。</span><br /> …if x_right – x_left <= 7 and r2 == 0 and r3 == 0 :<br /> ……return 1</p> </section> </article> <article id="post-89" class="post-89 post type-post status-publish format-standard hentry category-7" > <header class="post-header"> <ul class="post-meta list-inline"> <li class="date updated"><i class="fa fa-clock-o"></i> 2017.06.02</li> </ul> <h2 class="post-title"><a href="https://www.nichibotsu.blog/89.html">Pythonで日本語を(printで)表示させる方法</a></h2> </header> <section class="post-content"> <p>Pytohnで日本語を表示させる方法をご紹介いたします。</p> <p>私は、Pythonの.pyファイルの冒頭でutf-8の宣言をしてコードを書き始めます。</p> <p>冒頭:<br /> # -*- coding: utf-8 -*-</p> <p>しかし、これだけだと<br /> print ”あ”<br /> が文字化けします。</p> <p>いろいろ検索して調べてみたところ、どうやら文字列の前に「u」(半角u)を入れるといいみたいです。<br /> なぜこれだと表示されるのか、仕組みはよくわかっていません^^;<br /> uをつけることによって、Unicodeになるみたいです。</p> <p>コード:<br /> # -*- coding: utf-8 -*-<br /> print u”あ”</p> <p>表示結果:<br /> あ</p> <p>以上、仕組みとかいいから、方法だけ教えてくれっていう人向けの情報でした。</p> </section> </article> <div class="pagination"><span class="current">1</span><a href='https://www.nichibotsu.blog/category/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/page/2' class="inactive">2</a></div> </div><!-- /post-loop-wrap --> </div><!-- /main-inner --> </div><!-- /main --> <div id="side" class="col-md-4" role="complementary" itemscope="itemscope" itemtype="http://schema.org/WPSideBar"> <div class="side-inner"> <div class="side-widget-area"> <div id="block-3" class="widget_block widget_categories side-widget"><div class="side-widget-inner"><ul class="wp-block-categories-list wp-block-categories"> <li class="cat-item cat-item-13"><a href="https://www.nichibotsu.blog/category/%e3%83%88%e3%83%a9%e3%83%96%e3%83%ab%e8%a7%a3%e6%b1%ba">トラブル解決</a> </li> <li class="cat-item cat-item-5"><a href="https://www.nichibotsu.blog/category/%e3%83%91%e3%82%bd%e3%82%b3%e3%83%b3%e3%83%91%e3%83%bc%e3%83%84">パソコンパーツ</a> </li> <li class="cat-item cat-item-11"><a href="https://www.nichibotsu.blog/category/%e3%83%96%e3%83%83%e3%82%af%e3%83%a1%e3%83%bc%e3%82%ab%e3%83%bc">ブックメーカー</a> </li> <li class="cat-item cat-item-7 current-cat"><a aria-current="page" href="https://www.nichibotsu.blog/category/%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0">プログラミング</a> </li> <li class="cat-item cat-item-1"><a href="https://www.nichibotsu.blog/category/%e3%83%ab%e3%83%bc%e3%83%ac%e3%83%83%e3%83%88">ルーレット</a> </li> <li class="cat-item cat-item-4"><a href="https://www.nichibotsu.blog/category/%e5%93%b2%e5%ad%a6">哲学</a> </li> <li class="cat-item cat-item-12"><a href="https://www.nichibotsu.blog/category/%e5%b0%86%e6%a3%8b">将棋</a> </li> <li class="cat-item cat-item-6"><a href="https://www.nichibotsu.blog/category/%e6%97%85%e8%a1%8c">旅行</a> </li> <li class="cat-item cat-item-3"><a href="https://www.nichibotsu.blog/category/%e6%97%a5%e8%a8%98">日記</a> </li> <li class="cat-item cat-item-9"><a href="https://www.nichibotsu.blog/category/%e6%98%a0%e7%94%bb">映画</a> </li> <li class="cat-item cat-item-14"><a href="https://www.nichibotsu.blog/category/%e8%a9%a6%e3%81%97%e3%81%a6%e3%81%bf%e3%81%9f">試してみた</a> </li> <li class="cat-item cat-item-8"><a href="https://www.nichibotsu.blog/category/%e9%87%a3%e3%82%8a">釣り</a> </li> <li class="cat-item cat-item-10"><a href="https://www.nichibotsu.blog/category/%e9%9b%91%e6%84%9f">雑感</a> </li> </ul></div></div><div id="block-4" class="widget_block widget_archive side-widget"><div class="side-widget-inner"><ul class="wp-block-archives-list wp-block-archives"> <li><a href='https://www.nichibotsu.blog/date/2020/10'>2020年10月</a></li> <li><a href='https://www.nichibotsu.blog/date/2020/06'>2020年6月</a></li> <li><a href='https://www.nichibotsu.blog/date/2019/12'>2019年12月</a></li> <li><a href='https://www.nichibotsu.blog/date/2019/07'>2019年7月</a></li> <li><a href='https://www.nichibotsu.blog/date/2019/06'>2019年6月</a></li> <li><a href='https://www.nichibotsu.blog/date/2019/05'>2019年5月</a></li> <li><a href='https://www.nichibotsu.blog/date/2019/04'>2019年4月</a></li> <li><a href='https://www.nichibotsu.blog/date/2019/01'>2019年1月</a></li> <li><a href='https://www.nichibotsu.blog/date/2018/12'>2018年12月</a></li> <li><a href='https://www.nichibotsu.blog/date/2018/11'>2018年11月</a></li> <li><a href='https://www.nichibotsu.blog/date/2018/10'>2018年10月</a></li> <li><a href='https://www.nichibotsu.blog/date/2018/09'>2018年9月</a></li> <li><a href='https://www.nichibotsu.blog/date/2018/08'>2018年8月</a></li> <li><a href='https://www.nichibotsu.blog/date/2018/06'>2018年6月</a></li> <li><a href='https://www.nichibotsu.blog/date/2018/05'>2018年5月</a></li> <li><a href='https://www.nichibotsu.blog/date/2018/04'>2018年4月</a></li> <li><a href='https://www.nichibotsu.blog/date/2018/03'>2018年3月</a></li> <li><a href='https://www.nichibotsu.blog/date/2017/12'>2017年12月</a></li> <li><a href='https://www.nichibotsu.blog/date/2017/10'>2017年10月</a></li> <li><a href='https://www.nichibotsu.blog/date/2017/08'>2017年8月</a></li> <li><a href='https://www.nichibotsu.blog/date/2017/07'>2017年7月</a></li> <li><a href='https://www.nichibotsu.blog/date/2017/06'>2017年6月</a></li> <li><a href='https://www.nichibotsu.blog/date/2017/05'>2017年5月</a></li> <li><a href='https://www.nichibotsu.blog/date/2017/04'>2017年4月</a></li> <li><a href='https://www.nichibotsu.blog/date/2017/03'>2017年3月</a></li> <li><a href='https://www.nichibotsu.blog/date/2017/02'>2017年2月</a></li> </ul></div></div> </div><!-- //side-widget-area --> </div> </div><!-- /side --> </div><!-- /wrap --> </div><!-- /content --> <footer id="footer"> <div class="footer-02"> <div class="wrap"> <p class="footer-copy"> © Copyright 2024 日没ブログ. All rights reserved. </p> </div><!-- /wrap --> </div><!-- /footer-02 --> </footer> <a href="#" class="pagetop"><span><i class="fa fa-angle-up"></i></span></a> <script src="https://apis.google.com/js/platform.js" async defer> {lang: 'ja'} </script><script type="text/javascript" src="https://www.nichibotsu.blog/wp-content/themes/xeory_base/lib/js/jquery.pagetop.js?ver=16deef10eec1da75df3353b91a8c8e45" id="pagetop-js"></script> <script type="text/javascript" src="https://www.nichibotsu.blog/wp-content/themes/xeory_base/lib/js/jquery.table-scroll.js?ver=16deef10eec1da75df3353b91a8c8e45" id="table-scroll-js"></script> <script type="text/javascript" src="https://www.nichibotsu.blog/wp-content/plugins/highlighting-code-block/assets/js/prism.js?ver=2.0.1" id="hcb-prism-js"></script> <script type="text/javascript" src="https://www.nichibotsu.blog/wp-includes/js/clipboard.min.js?ver=2.0.11" id="clipboard-js"></script> <script type="text/javascript" id="hcb-script-js-extra"> /* <![CDATA[ */ var hcbVars = {"showCopyBtn":"1","copyBtnLabel":"\u30b3\u30fc\u30c9\u3092\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3059\u308b"}; /* ]]> */ </script> <script type="text/javascript" src="https://www.nichibotsu.blog/wp-content/plugins/highlighting-code-block/build/js/hcb_script.js?ver=2.0.1" id="hcb-script-js"></script> <script> (function($){ $(function(){ $(".sub-menu").css('display', 'none'); $("#gnav-ul li").hover(function(){ $(this).children('ul').fadeIn('fast'); }, function(){ $(this).children('ul').fadeOut('fast'); }); // スマホトグルメニュー $('#gnav').removeClass('active'); $('#header-menu-tog a').click(function(){ $('#gnav').toggleClass('active'); }); }); })(jQuery); </script> </body> </html>