<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>atLastの意味不なblog</title>
<link rel="alternate" type="text/html" href="https://blog.atras.net/atlast/" />
<link rel="self" type="application/atom+xml" href="https://blog.atras.net/atlast/atom.xml" />
<id>tag:blog.atras.net,2015-12-18:/atlast//3</id>
<updated>2021-10-04T06:30:23Z</updated>
<subtitle>頑張って復興中</subtitle>
<generator uri="http://www.sixapart.com/movabletype/">Movable Type Advanced 7.8.1</generator>
<entry>
<title>各種APIのテストとか。</title>
<link rel="alternate" type="text/html" href="https://blog.atras.net/atlast/2021/10/api-tester.html" />
<id>tag:blog.atras.net,2021:/atlast//3.33</id>
<published>2021-10-04T06:23:27Z</published>
<updated>2021-10-04T06:30:23Z</updated>
<summary>お久しぶりです。 最近仕事とかプライベートが忙しく、完全に放置してました。 なお...</summary>
<author>
<name>atLast</name>
</author>
<category term="技術系" scheme="http://www.sixapart.com/ns/types#category" />
<category term="api" label="API" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="apitester" label="API Tester" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="apiテスター" label="APIテスター" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="技術" label="技術" scheme="http://www.sixapart.com/ns/types#tag" />
<content type="html" xml:lang="ja" xml:base="https://blog.atras.net/atlast/">
<![CDATA[<p>お久しぶりです。</p>
<p>最近仕事とかプライベートが忙しく、完全に放置してました。</p>
<p>なお、楽しみにしてる人は・・・。</p>
<p></p>
<p>さて。今回のネタは <a href="https://insomnia.rest/" title="insomnia" target="_blank" rel="noopener">insomnia</a> と <a href="https://chrome.google.com/webstore/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm?hl=ja" title="talend api tester" target="_blank" rel="noopener">talend api tester</a></p>
<p>の二つです。</p>
<p>得意分野がそれぞれ違うので、私は使い分けしてます。</p>
<p>insomniaはスタンドアロンで動くけど、動的パラメータや戻りからの値を引き継いだりするのが難しい。</p>
<p>talend api testerはブラウザ依存(chrome)だけど、動的パラメータの扱いが強い。</p>
<p>具体的にキャプチャ貼ったりしてお見せするのが良いと思うのですが</p>
<p>如何せん仕事のデータなので貼れないのです・・・・・・申し訳ない。</p>
<p>今日はご紹介までに。</p>
<p>使い方が判らない方いたら言っていただければお教えしますよ！</p>
<p>最近はやりのVRChat APIなんかはinsomniaのほうがやりやすいです</p>]]>

</content>
</entry>
<entry>
<title>MTセットアップ中に、インデックスサイズが大きすぎるといわれた件についてのまとめ</title>
<link rel="alternate" type="text/html" href="https://blog.atras.net/atlast/2018/02/mt.html" />
<id>tag:blog.atras.net,2018:/atlast//3.32</id>
<published>2018-02-16T21:12:18Z</published>
<updated>2018-02-16T21:18:17Z</updated>
<summary> 	MTを新規セットアップ中に、インデックスサイズが大きすぎるよ！ってエラーが ...</summary>
<author>
<name>atLast</name>
</author>
<content type="html" xml:lang="ja" xml:base="https://blog.atras.net/atlast/">
<![CDATA[<p>
	MTを新規セットアップ中に、インデックスサイズが大きすぎるよ！ってエラーが<br />
	出て、インストールができませんでした</p>
<p>
	&nbsp;</p>
<p>
	色々調べてみると、DBの文字コードがutfからutfmb4に切り替わったことが原因のようで。</p>
<p>
	ネット見てると、</p>
<p>
	ROW_FORMAT=DYNAMIC</p>
<p>
	にしてあげると、直るってあったんですが、どこでDDL生成してるかが皆目さっぱりでした。</p>
<p>
	が、ついにみつけ、問題になっている箇所を特定できました。</p>
]]>
<![CDATA[<p>
	その場所とは</p>
<p>
	/lib/MT/ObjectDriver/DDL.pm</p>
<p>
	&nbsp;</p>
<p>
	の、</p>
<p>
	&nbsp;</p>
<p>
	<span style="background-color:#ffffe0;">247 sub create_table_sql {</span></p>
<p>
	の数行下にある</p>
<p>
	&nbsp;</p>
<p>
	<span style="background-color:#ffffe0;">$table_ddl .= &#39;)&#39;</span></p>
<p>
	の部分でした。</p>
<p>
	ここに、</p>
<p>
	&nbsp;</p>
<p>
	<span style="background-color:#ffffe0;">$table_ddl .= &#39;) ROW_FORMAT=DYNAMIC&#39;;&nbsp;</span></p>
<p>
	&nbsp;</p>
<p>
	と指定してあげると、無事インストール完了。<br />
	みなさまのおやくにたてれば幸いです。</p>
]]>
</content>
</entry>
<entry>
<title>[from itmedia] CAPTCHAを巡るAIとAIの闘い</title>
<link rel="alternate" type="text/html" href="https://blog.atras.net/atlast/2018/01/captcha-not-required.html" />
<id>tag:blog.atras.net,2018:/atlast//3.31</id>
<published>2018-01-24T19:31:06Z</published>
<updated>2018-01-24T19:36:20Z</updated>
<summary> 	http://blogs.itmedia.co.jp/appliedmark...</summary>
<author>
<name>atLast</name>
</author>
<content type="html" xml:lang="ja" xml:base="https://blog.atras.net/atlast/">
<![CDATA[<p>
	<a href="http://blogs.itmedia.co.jp/appliedmarketing/2018/01/captchaai.html">http://blogs.itmedia.co.jp/appliedmarketing/2018/01/captchaai.html</a></p>
<p>
	&nbsp;</p>
<p>
	captch不要の時代が来るなんて誰が予想したでしょうか。<br />
	ロボット判別のためのチェックボックスはよく目にしますが、まだ新しい<br />
	チェックすら不要とというのはみたことありません。<br />
	読者の方で、見かけた人教えて下さい</p>
]]>

</content>
</entry>
<entry>
<title>wkhtmltopdfの使い方</title>
<link rel="alternate" type="text/html" href="https://blog.atras.net/atlast/2016/07/wkhtmltopdf-header-footer.html" />
<id>tag:blog.atras.net,2016:/atlast//3.30</id>
<published>2016-07-07T14:55:21Z</published>
<updated>2016-07-07T15:21:37Z</updated>
<summary><![CDATA[ 	Debian+PHPでwkhtmltopdf&nbsp;を触る機会があったの...]]></summary>
<author>
<name>atLast</name>
</author>
<category term="php" label="php" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="wkhtmltopdf" label="wkhtmltopdf" scheme="http://www.sixapart.com/ns/types#tag" />
<content type="html" xml:lang="ja" xml:base="https://blog.atras.net/atlast/">
<![CDATA[<p>
	Debian+PHPで<a href="http://wkhtmltopdf.org/" target="_blank">wkhtmltopdf</a>&nbsp;を触る機会があったので、軽くまとめを。</p>
<p>
	まずこれはなんぞや。ってところから。</p>
<p>
	帳票出力したりするのに、PDFを出力することがよくありますよね。<br />
	そんなときに使えるミドルウェアの一つです。<br />
	ほかにも、<a href="http://www.mpdf1.com/mpdf/index.php" target="_blank">mPDF</a>とか、<a href="https://tcpdf.org/" target="_blank">TCPDF</a>&nbsp;とかがあります。</p>
<p>
	そんな中でも、頭一つ飛び抜けているのが、今回利用したwkhtmltopdfです。</p>
<p>
	HTMLからPDFを得ることが出来るのですが、HTMLの解釈部分にWebKitが使われており<br />
	CSS3やHTML5等ももそのままの形で出力できます。</p>
<p>
	で。帳票というと、Header, Footer(見出しとページ数とか)がつきものですよね。。</p>
<p>
	Debianを利用している環境であれば</p>
<p>
	# apt-get install wkhtmltopdf</p>
<p>
	でインストールし</p>
<p>
	$ wkhtmltopdf http://www.yahoo.co.jp yahoo.pdf</p>
<p>
	といった感じで、pdf出力ができます。</p>
<p>
	<strong>----------- ここから先は、header, footerを利用する人のみ必要な箇所です。 ---------------------</strong></p>
<p>
	上記のバージョンではQTのパッチがあたっていないためheader, footerを指定することが出来ません。</p>
<p>
	なので、もしインストールしている人は</p>
<p>
	# apt-get purge wkhtmltopdf</p>
<p>
	するか、インストールしっぱなしでもいいので、公式サイトからパッケージをダウンロードして展開する必要があります。</p>
<p>
	公式サイトから、最新(2016/07/08時点では、<strong>0.12.3.2 </strong>が最新でした。</p>
<p>
	で、このファイル、よく見るとxz という拡張子がついており、tar.gzのように、tar xzvf では解凍できません。<br />
	tar Jxvf wkhtmltox-0.12.3_linux-generic-amd64.tar.xz<br />
	で、解凍します(tarのバージョンによります。詳しくはググってください)<br />
	また、上記はx64です。i386の場合は、素直にx86バージョンをダウンロードして下さい。</p>
<p>
	解凍したフォルダを、/usr/local/wkhtmltopdf 等にコピー(移動でもかまいませんよ？)して・・・<br />
	いよいよ、本番のheader, footerを入れる作業に入ります。</p>
]]>
<![CDATA[<p>
	まず、footerに挿入するhtmlを用意します。 名前はfooter.htmlとします。<br />
	wkhtmltopdfでは、javascriptの認識や実行、また、pdf出力時に動的に変わる値<br />
	(ページ数など)を取得できる機能がついているので、最大限利用しましょう。</p>
<pre>
<span style="font-size:80%;">&lt;!DOCTYPE html&gt;
    &lt;body&gt;
        &lt;div style=&quot;display: inline-block; text-align:left; width: 48%;&quot;&gt;
            &lt;span id=&quot;current_date&quot;&gt;&lt;/span&gt;
        &lt;/div&gt;
        &lt;div style=&quot;display: inline-block; text-align:right; width: 48%;&quot;&gt;
            Page &lt;span style=&quot;display: inline-block;&quot; id=&quot;current_page&quot;&gt;&lt;/span&gt; of &lt;span style=&quot;display: inline-block;&quot; id=&quot;page_count&quot;&gt;&lt;/span&gt;
        &lt;/div&gt;
        &lt;script type=&quot;text/javascript&quot;&gt;
             var pdfInfo = {};
             var x = document.location.search.substring(1).split(&#39;&amp;&#39;);
             for (var i in x) { var z = x[i].split(&#39;=&#39;,2); pdfInfo[z[0]] = unescape(z[1]); }
             function getPdfInfo() {
                var page = pdfInfo.page || 1;
                var pageCount = pdfInfo.topage || 1;
                var date = pdfInfo.date || 1;
                document.getElementById(&#39;current_page&#39;).textContent = page;
                document.getElementById(&#39;page_count&#39;).textContent = pageCount;
                document.getElementById(&#39;current_date&#39;).textContent = date;
              }
              getPdfInfo();
        &lt;/script&gt;
    &lt;/body&gt;
&lt;/html&gt;

</span></pre>
<p>
	次に、headerに入れるhtmlを準備します。名前は、header.htmlとします。<br />
	こちらは、適当でかまいません。タイトルとか。</p>
<pre>
<span style="font-size:80%;">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ja&quot;&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;UTF-8&quot;&gt;
        &lt;title&gt;&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        Yahoo to PDF
    &lt;/body&gt;
&lt;/html&gt;

</span></pre>
<p>
	準備が整ったら、wkhtmlでpdfの生成を行います。</p>
<p>
	$ wkhtml --header-html header.html --footer-html footer.html http://www.yahoo.co.jp yahoo.pdf</p>
<p>
	上記で、ヘッダーとフッター、ページ数付きのpdfが出力されます。</p>
<p>
	どなたかのお役にたてれば幸いです。</p>
]]>
</content>
</entry>
<entry>
<title>Pythonでwebページのキャプチャを取得</title>
<link rel="alternate" type="text/html" href="https://blog.atras.net/atlast/2016/05/python-web-capture.html" />
<id>tag:blog.atras.net,2016:/atlast//3.29</id>
<published>2016-05-22T15:18:42Z</published>
<updated>2016-05-22T15:18:39Z</updated>
<summary> 	今日もPython 	というわけで、PythonでChromeDriverを...</summary>
<author>
<name>atLast</name>
</author>
<category term="ウェブキャプチャ" label="ウェブキャプチャ" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="capture" label="capture" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="python" label="python" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="web" label="web" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="webキャプチャ" label="webキャプチャ" scheme="http://www.sixapart.com/ns/types#tag" />
<content type="html" xml:lang="ja" xml:base="https://blog.atras.net/atlast/">
<![CDATA[<p>
	今日もPython</p>
<p>
	というわけで、PythonでChromeDriverを使って、キャプチャ取得する方法をまとめます。</p>
<p>
	PC/Mobileを引数で指定して、Mobileの場合はChromeのモバイルエミュレートで<br />
	取得する事にしました。</p>
<p>
	<span>JavaでもChromeDriver使えるのですが、「すっごく重い」「メモリ食いまくり」でした。</span><br />
	<span>代替案として出てきたのがPythonです。</span><br />
	<span>以下、実際のコードを交えながら説明していきます。</span></p>
<p>
	まず。前提として、サーバーに導入されていないであろう、chromedriverはインストールしておいてください。<br />
	chromedriverは、apt-get, yum にて導入可能なはずです。</p>
<p>
	インストールできない場合は、<a href="https://sites.google.com/a/chromium.org/chromedriver/downloads" target="_blank">こちら</a> より、ダウンロードして任意のパスへ導入してください。</p>
<p>
	また、普通にpythonを使っているだけだと、python用のselenium, xvfbwrapperも入ってないはずなので<br />
	pip install selenium<br />
	pip install xvfbwrapper</p>
<p>
	をコンソールで実行し、インストールしてください(rootに準ずる権限が必要です)</p>
]]>
<![CDATA[<pre>
<span style="color:#daa520;"># -*- coding: utf-8 -*-</span>

<span style="color:#daa520;">import sys, time, glob, ConfigParser
from selenium.common.exceptions import WebDriverException
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from xvfbwrapper import Xvfb

if __name__ == &quot;__main__&quot;:
    param = sys.argv
    if len(param) != 4:
        print &quot;Usage: cap.py </span><url><span style="color:#daa520;"> </span><capture_savepath><span style="color:#daa520;"> </span><device(pc or=""><span style="color:#daa520;">&quot;
        sys.exit()

    url = param[1]
    cappath = param[2]
    device = param[3]

    ini = ConfigParser.SafeConfigParser();
    ini.read(&#39;cap.py.ini&#39;)

    if device == &quot;PC&quot;:
        userAgent = ini.get(&quot;capture&quot;, &quot;useragent.pc&quot;)
        displaySize = ini.get(&quot;capture&quot;, &quot;windowsize.pc&quot;)
    elif device == &quot;Mobile&quot;:
        userAgent = ini.get(&quot;capture&quot;, &quot;useragent.mobile&quot;)
        displaySize = ini.get(&quot;capture&quot;, &quot;windowsize.mobile&quot;)
    else:
        print &quot;Device require \&quot;PC\&quot; or \&quot;Mobile\&quot;&quot;
        sys.exit()

    driverPath = ini.get(&quot;capture&quot;, &quot;chromedriver&quot;)

    vdi = Xvfb()
    vdi.start()

    chrome_options = Options()
    chrome_options.add_argument(&quot;--no-sandbox&quot;)
    chrome_options.add_argument(&quot;--disable-setuid-sandbox&quot;)
    chrome_options.add_argument(&quot;--lang=ja&quot;)
    chrome_options.add_argument(&quot;--user-agent=&quot; + userAgent)
    chrome_options.add_argument(&quot;--window-size=&quot; + displaySize)

    if device == &quot;Mobile&quot;:
        window_size_list = displaySize.split(&quot;,&quot;)
        mobile_emulation = {&quot;deviceMetrics&quot;: { &quot;width&quot;: int(window_size_list[0]), &quot;height&quot;: int(window_size_list[1]), &quot;pixelRatio&quot;: 3.0 }}
        chrome_options.add_experimental_option(&quot;mobileEmulation&quot;, mobile_emulation)

    driver = webdriver.Chrome(driverPath, chrome_options=chrome_options)
    driver.get(url)

    try:
        alert = driver.switch_to_alert()
        alert.accept()
    except:
        print &quot;no alert to accept&quot;

    time.sleep(10)

    try:
        driver.save_screenshot(cappath)
    except WebDriverException as w:
        print &quot;WebDriverException {0}: {1}&quot;.format(w.errno, w.strerror)

    driver.quit()
    vdi.stop()
</span></device(pc></capture_savepath></url></pre>
<p>
	&nbsp;</p>
<p>
	さて。上記コードですが、重要な部分のみ取り上げ、解説します。<br />
	まずは</p>
<pre>
<url>ini.read(&#39;cap.py.ini&#39;)</url></pre>
<p>
	このコードで、設定を読み込んでいます。<br />
	設定内容は次の通りです。</p>
<pre>
<span style="color:#daa520;">[capture]
chromedriver = /usr/lib/chromium/chromedriver

useragent.pc = Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.10 Safari/537.36
windowsize.pc = 1920,1080

useragent.mobile = Mozilla/5.0 (iPhone; CPU iPhone OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/46.0.2490.85 Mobile/12H143 Safari/600.1.4
windowsize.mobile = 375,667

</span></pre>
<p>
	chromedriverの場所、PCとMobileのUAと画面サイズの設定ですね。</p>
<pre>
<span style="color:#daa520;">    chrome_options = Options()
    chrome_options.add_argument(&quot;--no-sandbox&quot;)
</span></pre>
<p>
	chromeの各種設定です。<br />
	設定内容にについては、<a href="https://sites.google.com/a/chromium.org/chromedriver/capabilities">https://sites.google.com/a/chromium.org/chromedriver/capabilities</a></p>
<p>
	に一通り載っていますので、割愛させていただきます。</p>
<p>
	次が非常に大事ですね。DeviceをMobileとして指定したときに、chromeのmobile emulateを行っています。</p>
<pre>
<span style="color:#daa520;">    if device == &quot;Mobile&quot;:
        window_size_list = displaySize.split(&quot;,&quot;)
        mobile_emulation = {&quot;deviceMetrics&quot;: { &quot;width&quot;: int(window_size_list[0]), &quot;height&quot;: int(window_size_list[1]), &quot;pixelRatio&quot;: 3.0 }}
        chrome_options.add_experimental_option(&quot;mobileEmulation&quot;, mobile_emulation)
</span></pre>
<p>
	次に、driverのインスタンスを作成して、drver.get()でアクセスしています。</p>
<p>
	このコードが一発でわかる人はいないのではないか。というのが次のコードです。</p>
<pre>
<span style="color:#daa520;">    try:
        alert = driver.switch_to_alert()
        alert.accept()
    except:
        print &quot;no alert to accept&quot;
</span></pre>
<p>
	これは、モバイルへ誘導されるときにjsのalertがあがるサイトへの対策です。<br />
	アラートが存在すれば、、OKをエミュレートしています。<br />
	&nbsp;</p>
<pre>
<span style="color:#daa520;">    time.sleep(10)
    try:
        driver.save_screenshot(cappath)
    except 
</span></pre>
<p>
	上記では、10秒スリープさせてますが、これは、ページの描画待ち処理です。<br />
	time.sleep(10)をなくして実行してみると、例えばjsでの遅延ロードなどがロードされないまま<br />
	キャプチャされてしまいます。</p>
<p>
	最後に、driver.quit()　及び vdi.stoip() でドライバの停止と仮想ディスプレイの停止を行って<br />
	処理終了です。</p>
<p>
	大まかな部分のみ説明しましたが、お役に立てれば何よりです。<br />
	chromedriverの説明は国内の情報は少なめなので。</p>
]]>
</content>
</entry>
<entry>
<title>Pythonで簡単マルチスレッド(マルチプロセスではない)</title>
<link rel="alternate" type="text/html" href="https://blog.atras.net/atlast/2016/05/python-multithread.html" />
<id>tag:blog.atras.net,2016:/atlast//3.28</id>
<published>2016-05-20T17:45:39Z</published>
<updated>2016-05-20T18:21:40Z</updated>
<summary>続けての記事になりますが、Pythonって、ほかの言語を触っている人なら入り口が...</summary>
<author>
<name>atLast</name>
</author>
<category term="pythonmultithread" label="python multithread" scheme="http://www.sixapart.com/ns/types#tag" />
<content type="html" xml:lang="ja" xml:base="https://blog.atras.net/atlast/">
<![CDATA[<p>続けての記事になりますが、Pythonって、ほかの言語を触っている人なら入り口がとても広い言語だと私は思います。<br />強いて言うと、インデントの縛りが鬱陶しい位でしょうか。</p>
<p>今回は、マルチスレッドを簡単に実装する方法についてちょっとまとめてみました。</p>
<p>よろしければお付き合いください。</p>]]>
<![CDATA[<p>まず、マルチスレッドとマルチプロセスにつじてですが<br />わかりやすく言うと、CPUに対する負荷のかけ具合が変わるところが大きいです。<br />マルチスレッドは1CPU上でスレッド実行するのに対し、マルチプロセスでは、適切な設定をすれば<br />設定した内容に従ってCPUを利用するようになります。</p>
<p>どちらをとるかは好みの問題ですが。今回は、マルチスレッドについて書いていきます。</p>
<p>まずは、サンプルコードをご覧ください。</p>
<pre># -*- coding: utf-8 -*-

import threading

def thread_test(tname, maxval):
    localval = 0
    while True:
        localval += 1
        print "[" + tname + "] localval : " + str(localval)
        if (localval == maxval):
            break;
    return

if __name__ == "__main__":
    t1 = threading.Thread(target=thread_test, name="thread1", args=("thread1", 1000))
    t2 = threading.Thread(target=thread_test, name="thread2", args=("thread2", 2000))
    t3 = threading.Thread(target=thread_test, name="thread3", args=("thread3", 3000))

    t1.start()
    t2.start()
    t3.start()
</pre>
<p>と、たったこれだけで、マルチスレッドで動きます。<br /> (実際に動くコードですので、環境をお持ちの方は試してみてください)</p>
<p>肝になるのは、<br /> <span style="color: #3366ff;">import threading</span><br /><span style="color: #3366ff;"> threading.Thread(...)</span><br /> <br /> の部分です。<br />import文で、threading の関数の読み込みと<br />threading.Thread で、スレッドの実物作成ですね。</p>
<p>作成した後は、start()するだけです。</p>
<p>JavaやC#、Perlを触ったことある人なら、感覚で書ける感じがたまりません。<br />(すみません。Rubyは勉強不足です・・・・)</p>
<p>マルチプロセスについては、また別途取り上げようと思います。</p>]]>
</content>
</entry>
<entry>
<title>お久しぶりです&amp;777TOWNで「ファイルの更新に失敗しました」エラー(解消済み</title>
<link rel="alternate" type="text/html" href="https://blog.atras.net/atlast/2016/05/long-time-no-see-and-777town.html" />
<id>tag:blog.atras.net,2016:/atlast//3.27</id>
<published>2016-05-20T17:31:14Z</published>
<updated>2016-05-22T13:20:07Z</updated>
<summary>この記事をご覧のみなさま、お久しぶりです。atLastです。 体調面等の調整で、...</summary>
<author>
<name>atLast</name>
</author>
<category term="777town" label="777town" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="お久しぶり" label="お久しぶり" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="ファイルの更新に失敗しました" label="ファイルの更新に失敗しました" scheme="http://www.sixapart.com/ns/types#tag" />
<content type="html" xml:lang="ja" xml:base="https://blog.atras.net/atlast/">
<![CDATA[<p>この記事をご覧のみなさま、お久しぶりです。atLastです。</p>
<p>体調面等の調整で、数か月空いてしまいました。</p>
<p>また、技術系の記事をまとめていきたいと思いますので、今後ともよろしくお願いします。</p>
<p></p>
<p>さて。今日の本題。<br />777TOWNを遊ぼうとして、「ファイルの更新に失敗しました」のエラーが発生する場合に<br />有効な対処が見つかりましたので、書き残しておきます。</p>
<p>※公式で報告されている方法ではありません<br />※PC(特にネットワーク回り)への知識が必要です。<del datetime="2016-05-21T02:35:20+09:00">(ということにしておきます)</del></p>
<p><span style="color: #ff0000;"><strong>以下の方法は、私の環境依存の可能性もありますので、必ず解決するとは限りません。</strong></span></p>
<p>環境は<br />・OS: Windows10 x64</p>]]>
<![CDATA[<p>1. C:\Program Files (x86)\777town をExplorerで開く<br />2. boot.ini を、任意のテキストエディタで開く<br />3. 3行目の「DNS=cache.777town.net/777town1」を、先頭に「;」(半角セミコロン)を付けて無効化し<br />　 4行目に「DNS=8.8.8.8」を追記する<br />4. 777TOWNを起動する</p>
<p>すると、あら不思議。アップデートが正常にできるじゃありませんか。<br />おそらくですが、cache.777town.net のNSが負荷に耐えられないのでは。と考えられます。</p>
<p>なお、本対策を行ったのちアップデートが正常に終了すると、boot.iniが編集前の状態に戻ることを確認済みです。<br />起動できない場合に毎回行う必要がある。ということです。</p>
<p>Program Files以下に配置されている関係で、batやexe等では簡単には書き換えができないので<br />手動にて対応してみてください。</p>
<p>また、上記で正常にアップデートが終了するようになった方、いましたら、本記事へコメントを残していただけますと幸いです。</p>]]>
</content>
</entry>
<entry>
<title>一身上の都合により、しばらくお休みします。</title>
<link rel="alternate" type="text/html" href="https://blog.atras.net/atlast/2016/02/post-2.html" />
<id>tag:blog.atras.net,2016:/atlast//3.26</id>
<published>2016-02-05T12:36:16Z</published>
<updated>2016-02-05T12:37:00Z</updated>
<summary>体調面での悪化により、毎日書くのが無理になりました。 ぼちぼち更新しますので、宜...</summary>
<author>
<name>atLast</name>
</author>
<content type="html" xml:lang="ja" xml:base="https://blog.atras.net/atlast/">
<![CDATA[<p><strong>体調面での悪化により、毎日書くのが無理になりました。</strong></p>
<p><strong>ぼちぼち更新しますので、宜しくお願いします。</strong></p>]]>

</content>
</entry>
<entry>
<title>AjaxRequestなんだけど、HTTP_X-Requested-Withを付けない</title>
<link rel="alternate" type="text/html" href="https://blog.atras.net/atlast/2016/01/ajax-x-requested-with.html" />
<id>tag:blog.atras.net,2016:/atlast//3.25</id>
<published>2016-01-09T06:52:52Z</published>
<updated>2016-01-09T06:56:56Z</updated>
<summary>$.ajax({ 	type: &apos;GET&apos;, 	url: &apos;/analyze/&apos;...</summary>
<author>
<name>atLast</name>
</author>
<category term="ajax" label="ajax" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="jquery" label="jquery" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="remove" label="remove" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="xrequestedwith" label="x-requested-with" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="削除" label="削除" scheme="http://www.sixapart.com/ns/types#tag" />
<content type="html" xml:lang="ja" xml:base="https://blog.atras.net/atlast/">
<![CDATA[<pre style="font-family: MeiryoKe_Gothic; font-size: 10pt; color: black; background: white;">$.ajax({
	type: 'GET',
	url: '/analyze/',
	data: 'lang=ja&amp;device=desktop&amp;url=' + encodeURI(_target_url),
	beforeSend: function(xhr){
		xhr.setRequestHeader('X-Requested-With', {toString: function(){ return ''; }});
	},
)};</pre>
<p>jqueryのbeforeSendを使うことで、送信前にリクエストヘッダの書き換えを行い X-Requested-Withの値を空にすることで、Ajaxリクエストと認識させない</p>]]>

</content>
</entry>
<entry>
<title>PhantomJSで、UserAgentをランダム化する</title>
<link rel="alternate" type="text/html" href="https://blog.atras.net/atlast/2016/01/phantomjs-random-useragent.html" />
<id>tag:blog.atras.net,2016:/atlast//3.24</id>
<published>2016-01-08T15:52:10Z</published>
<updated>2016-01-08T16:08:00Z</updated>
<summary>PhantomJSとは、QtWebKitをベースとしたヘッドレスブラウザです。 ...</summary>
<author>
<name>atLast</name>
</author>
<category term="ユーザーエージェント" label="ユーザーエージェント" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="ランダム" label="ランダム" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="phantomjs" label="PhantomJS" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="pjs" label="pjs" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="random" label="random" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="useragent" label="useragent" scheme="http://www.sixapart.com/ns/types#tag" />
<content type="html" xml:lang="ja" xml:base="https://blog.atras.net/atlast/">
<![CDATA[<p><a target="_blank" href="http://phantomjs.org/">PhantomJS</a>とは、QtWebKitをベースとした<a target="_blank" href="http://e-words.jp/w/%E3%83%98%E3%83%83%E3%83%89%E3%83%AC%E3%82%B9.html">ヘッドレス</a>ブラウザです。</p>
<p>Googleで検索すると、オートテストや、スクリーンキャプチャなどに用いられています。</p>
<p>オートテストの項目の中で、「ページの表示速度をチェックする。」という事があると思います。</p>
<p>このとき、PhantomJSのexamplesについてくる、「<a target="_blank" href="https://github.com/ariya/phantomjs/blob/master/examples/loadspeed.js">loadspeed.js</a>」がほぼそのまま利用できるのですが<br />ランダムなUserAgentでのテストを要求されるパターンもあるかと思います。</p>
<p>ここでは、PhantomJSに対し、ランダムなUserAgentを設定する方法を紹介します。</p>]]>
<![CDATA[<p>PhantomJSで、UserAgentを設定するには<br /><a target="_blank" href="http://phantomjs.org/api/webpage/property/settings.html">こちら</a>で紹介されているexampleにありますが<br />settings.userAgentに値を設定すればOKです。</p>
<p>この値をいかにしてランダムにするか。ですが、流用可能な形にしたかったので</p>
<p>PhantomJSのfs.read()を使って外部からUAの一覧を読み込み、Math.random()を使って、配列からランダムに取得することにしました。</p>
<p>まず、以下のようなテキストファイルを準備します。</p>
<pre>[<br />'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2560.0 Safari/537.36',<br />'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko',<br />'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240',<br />... 以下、必要な分だけ記述<br />]</pre>
<p>JavaScriptの配列ですね。これを、任意の場所に配置します。<br />今回は、/opt/pjs/ua.txtとして保存します。</p>
<p>次に、PhantomJSのスクリプトです。</p>
<pre>    var ua = fs.read('/opt/pjs/ua.txt');<br />    ua = eval(ua);<br />    var useragent = ua[Math.floor(Math.random() * ua.length)];</pre>
<p>はい。以上で、useragentをランダムに取得することができました。これを、</p>
<pre>page.settings.userAgent = useragent;</pre>
<p>として設定すれば完了です。</p>
<p>以上の記述量であれば、他のスクリプト(たとえば、スクリーンキャプチャ)等にも<br />流用しやすいと思います。</p>
<p>是非使ってみてください！</p>]]>
</content>
</entry>
<entry>
<title>博多屋台風酒場 うおっしょい！にて唐揚げを食べる！</title>
<link rel="alternate" type="text/html" href="https://blog.atras.net/atlast/2016/01/post-1.html" />
<id>tag:blog.atras.net,2016:/atlast//3.23</id>
<published>2016-01-06T17:02:05Z</published>
<updated>2016-01-06T17:12:15Z</updated>
<summary>博多屋台風酒場 うおっしょい！ にて、唐揚げを食べてきました。10個で900円。...</summary>
<author>
<name>atLast</name>
</author>
<category term="博多屋台風酒場うおっしょい！" label="博多屋台風酒場 うおっしょい！" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="唐揚げ" label="唐揚げ" scheme="http://www.sixapart.com/ns/types#tag" />
<content type="html" xml:lang="ja" xml:base="https://blog.atras.net/atlast/">
<![CDATA[<p><a href="http://tabelog.com/tokyo/A1310/A131002/13118208/" target="_blank">博多屋台風酒場 うおっしょい！</a></p>
<p>にて、唐揚げを食べてきました。<br />10個で900円。<br />噂によると、かなり大きいとか。<br />食べきれるでしょうか。</p>
<p>8個食べきれば勝ち(2個は同行者が食べました)。という勝負にのってやってきました。</p>
<p>そして、やってきました。唐揚げ10個！</p>]]>
<![CDATA[<p><a href="http://blog.atras.net/atlast/assets_c/2016/01/DSC01090-4.html" onclick="window.open('http://blog.atras.net/atlast/assets_c/2016/01/DSC01090-4.html','popup','width=2000,height=1501,scrollbars=yes,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.atras.net/atlast/assets_c/2016/01/DSC01090-thumb-400xauto-4.jpg" alt="DSC01090.jpg" class="mt-image-none" height="300" width="400" /></a></p>
<p>みてください。このボリューム。<br />10個でこれです。<br />手前のレモンが飾りにしかなっていないという。</p>
<p><a href="http://blog.atras.net/atlast/assets_c/2016/01/DSC01089-7.html" onclick="window.open('http://blog.atras.net/atlast/assets_c/2016/01/DSC01089-7.html','popup','width=2000,height=1501,scrollbars=yes,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.atras.net/atlast/assets_c/2016/01/DSC01089-thumb-400xauto-7.jpg" alt="DSC01089.JPG" class="mt-image-none" height="300" width="400" /></a></p>
<p>タバコの高さほどあります。</p>
<p><a href="http://blog.atras.net/atlast/assets_c/2016/01/DSC01091-10.html" onclick="window.open('http://blog.atras.net/atlast/assets_c/2016/01/DSC01091-10.html','popup','width=2000,height=1501,scrollbars=yes,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.atras.net/atlast/assets_c/2016/01/DSC01091-thumb-400xauto-10.jpg" alt="DSC01091.JPG" class="mt-image-none" height="300" width="400" /></a></p>
<p>一つ一つが、タバコの箱よりも大きい！</p>
<p>揚げたてで、味は非常によかったです。一緒に頼んだポテトサラダと一緒に食べるとこれまた良いアクセントに。</p>
<p>5個ほど食べたあたりで、かなりの脂っこさが唇の周りに。<br />ですが！</p>
<p>8個完食しました！(完食した皿の画像は取り損ねました)</p>
<p>御茶の水に用事がある方は、是非1度は見ておくと良いかと。</p>
<p>ただし、10個頼む場合は3～4人で食べるのが正解でしょうｗ</p>]]>
</content>
</entry>
<entry>
<title>nginx+php5.6+xhprof+XH GUI+Callgraph(Graphviz)の構築</title>
<link rel="alternate" type="text/html" href="https://blog.atras.net/atlast/2016/01/xhprof-xhgui-graphviz.html" />
<id>tag:blog.atras.net,2016:/atlast//3.22</id>
<published>2016-01-05T17:27:52Z</published>
<updated>2016-01-05T18:21:34Z</updated>
<summary>今回、作成したPHPプログラムのどこにボトルネックがあるかを調べるために XHP...</summary>
<author>
<name>atLast</name>
</author>
<category term="プロファイリング" label="プロファイリング" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="callgraph" label="call graph" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="graphiz" label="graphiz" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="nginx" label="nginx" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="php" label="php" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="php5fpm" label="php5-fpm" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="profile" label="profile" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="xhgui" label="xh gui" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="xhprof" label="xhprof" scheme="http://www.sixapart.com/ns/types#tag" />
<content type="html" xml:lang="ja" xml:base="https://blog.atras.net/atlast/">
<![CDATA[<p>今回、作成したPHPプログラムのどこにボトルネックがあるかを調べるために</p>
<p>XHProf<br />XH GUI<br />CallGraph(Graphviz)</p>
<p>のプロファイル環境を構築しました。</p>
<p>以下、インストール時のメモです。</p>]]>
<![CDATA[<p><strong>1. xhprofのインストール　</strong><br />xhprofは、<a target="_blank" href="https://pecl.php.net/package/xhprof">peclで公開</a>されているため、peclを使ってインストールします。</p>
<pre>　# pecl install xhprof-0.9.4</pre>
<p>　xhprofを読み込むため、xhprof.iniの作成とシンボリックリンクの作成を行います。</p>
<pre>　# vi /etc/php5/mods-available/xhprof.ini</pre>
<p>ファイルの中身は以下の1行のみです。</p>
<pre>　extension=xhprof.so</pre>
<p>xhprof.iniを有効にするため、以下の作業を行います。</p>
<pre>　# cd /etc/php5/fpm/conf.d<br />　# ln -s ../../mods-available/xhprof.ini 30-xhprof.ini<br />　# systemctl restart php5-fpm</pre>
<p><strong>2. XH GUIのダウンロードと配置</strong><br />　XH GUIはgitにて公開されています。gitコマンドを使ってcloneします。<br />　cloneしたファイル一式を/opt/xhprof として配置します。</p>
<pre>　# cd /usr/local/src<br />　# git clone https://github.com/preinheimer/xhprof.git<br />　# mv xhprof /opt/xhprof</pre>
<p><strong>3. Graphvizのインストール</strong><br />　これは、debパッケージが普通に提供されているため、apt-getでインストールします。</p>
<pre>　# apt-get install graphviz</pre>
<p><strong>4. XH GUIとCallGraphの設定準備</strong>　XH GUIの設定ファイルを準備します。</p>
<pre>　# cd /opt/xhprof/xhprof_lib<br />　# cp config.sample.php config.php</pre>
<p>　バックエンドにMySQLを利用。及び、Graphvizの設定を行います。<br />　MySQLへの接続は、<span style="color: #ff0000;">mysqli</span>を利用します。<br />　今回は、DBサーバーが別サーバーのため、mysqlサーバーへユーザーの追加も行います。</p>
<pre>　# ssh db1<br /><span style="color: #ff0000;">　　*db1は、任意のサーバーを選択してください。</span><br /><span style="color: #ff0000;">　　ローカルのmysqlを利用するときは、この行を無視してください。</span></pre>
<pre>　# mysql -uroot -p****<br />　mysql&gt; create database xhprof;<br />　mysql&gt; grant all on xhprof.* to xhprof@'<span style="color: #3366ff;">192.168.0.0/255.255.255.0</span>' identified by 'xhprof';<br />　mysql&gt; flush privileges;<br />　mysql&gt; quit<br />　# exit</pre>
<p>　<span style="color: #3366ff;">青色の箇所</span>は、お使いの環境によって変更してください。<br />　たとえば、MySQLがローカルで動いていれば、<span style="color: #3366ff;">localhost</span> ですね。</p>
<p><strong>5. XH GUI用のSQLを流し込み</strong>　XH GUIに、MySQL用のcreate table文が入っているため、これを利用します。</p>
<pre>　# cd /opt/xhprof/xhprof_lib/utils/Db<br />　# cat Mysqli.php</pre>
<p>　※ファイルの先頭にcreate table文がはいっているので、コピーしておく</p>
<pre>　# ssh db1<br />　# mysql -xhprof -pxhprof -A xhprof -h <span style="color: #3366ff;">192.168.0.10</span><br />　mysql&gt; <span style="color: #ff6600;">... ここにcreate table文を貼り付け</span><br />　mysql&gt; exit<br />　# exit</pre>
<p><strong>6. XH GUIの設定ファイル編集</strong></p>
<pre>　# cd /opt/xhprof/xhprof_lib/<br />　# vi config.php</pre>
<p>　以下では、実際に行った設定内容を記述します。(一部伏せてます)</p>
<pre><span style="color: #008000;">・5 行目付近 <strong>sec.5で行ったDB設定を反映</strong></span><br />$_xhprof['dbtype'] = 'mysql'; // Only relevant for PDO<br />$_xhprof['dbhost'] = '192.168.0.10';<br />$_xhprof['dbuser'] = 'xhprof';<br />$_xhprof['dbpass'] = 'xhprof';<br />$_xhprof['dbname'] = 'xhprof';<br />$_xhprof['dbadapter'] = 'Mysqli';<br />$_xhprof['servername'] = 'myserver';<br />$_xhprof['namespace'] = 'myapp';<br />$_xhprof['url'] = 'http://<span style="color: #993300;">xhprof.example.com</span>'; // &lt;- nginxで設定するURLを指定。 sec.7を参照</pre>
<pre><span style="color: #008000;">・31行目付近<strong>(コメントアウトを外す)</strong></span><br />$_xhprof['dot_binary']  = '/usr/bin/dot';<br />$_xhprof['dot_tempdir'] = '/tmp';<br />$_xhprof['dot_errfile'] = '/tmp/xh_dot.err';</pre>
<pre><br /><span style="color: #008000;">・52行目付近 <strong>アクセスコントロールを無効にする</strong></span><br />$controlIPs = false; //Disables access controlls completely. <br />// $controlIPs = array();<br />// $controlIPs[] = "127.0.0.1";   // localhost, you'll want to add your own ip here<br />// $controlIPs[] = "::1";         // localhost IP v6</pre>
<p><strong>7. XH GUIの公開</strong><br />　以下はnginxの設定例です。</p>
<pre>　# cd /etc/nginx/conf.v/<br />　# vi xhprof.example.com.conf<br />server {<br />    listen       80;<br />    server_name  <span style="color: #993300;">xhprof.example.com</span>;<br /><br />    root    /opt/xhprof/xhprof_html/;<br />    index   index.php index.html index.htm;<br />    charset utf-8;<br /><br />    location = /robots.txt  { access_log off; log_not_found off; }<br />    location = /favicon.ico { access_log off; log_not_found off; }<br /><br />    location ~* \.php$ {<br />        expires off;<br />        include        fastcgi_params;<br />        fastcgi_pass  127.0.0.1:9000;<br />        fastcgi_index index.php;<br />        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;<br />    }<br /><br />    location ~ /\. {<br />        deny  all;<br />        access_log off;<br />        log_not_found off;<br />    }<br />}</pre>
<p><strong>8. xhprofを有効にする</strong><br />　xhprofを有効にするドメインのfcgiパラメータを編集します。</p>
<pre>　# vi dev.example.com.conf</pre>
<pre>location ~ \.php$ {<br />        fastcgi_pass                  127.0.0.1:9000;<br />　　　 ...<br />fastcgi_param   PHP_VALUE<br />"auto_prepend_file=/opt/xhprof/external/header.php \n <br />auto_append_file=/opt/xhprof/external/footer.php"; // 以上3行を追加する<br />}</pre>
<p><strong>9. nginxの設定確認</strong></p>
<pre>　# /etc/init.d/nginx configtest</pre>
<p><strong>10. nginx再起動</strong></p>
<pre>　# systemctl restart nginx</pre>
<p><strong>11. sec.8で有効にしたドメインへ、特殊パラメータをつけてアクセス</strong></p>
<pre>　http://dev.example.com/<span style="color: #ff0000;">?_profile=1</span></pre>
<p><span style="color: #000000;"><span style="color: #000000;">　一度profile=1をつけると、cookieにprofileのフラグが立つため、無効にする場合は<br /></span></span></p>
<pre> http://dev.example.coim/<span style="color: #ff0000;">?_profile=0</span></pre>
<p><span style="color: #000000;"><br />　とアクセスする。</span></p>
<p><strong><span style="color: #000000;">12. xhprof及びXH GUI, Graphvizが動作していることを確認</span></strong></p>
<p><span style="color: #000000;">http://xhprof.example.com/ へアクセスし、XH GUIが動作していることを確認</span></p>]]>
</content>
</entry>
<entry>
<title>let&apos;s encryptを使ってみる</title>
<link rel="alternate" type="text/html" href="https://blog.atras.net/atlast/2016/01/lets-encrypt.html" />
<id>tag:blog.atras.net,2016:/atlast//3.21</id>
<published>2015-12-31T21:16:12Z</published>
<updated>2015-12-31T21:39:59Z</updated>
<summary>このblogをご覧の皆さん、あけましておめでとうございます。今後ともよろしくご愛...</summary>
<author>
<name>atLast</name>
</author>
<category term="apache" label="apache" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="debianjessie" label="debian jessie" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="letsencrypt" label="letsencrypt" scheme="http://www.sixapart.com/ns/types#tag" />
<category term="ssl" label="SSL" scheme="http://www.sixapart.com/ns/types#tag" />
<content type="html" xml:lang="ja" xml:base="https://blog.atras.net/atlast/">
<![CDATA[<p>このblogをご覧の皆さん、あけましておめでとうございます。<br />今後ともよろしくご愛顧のほどお願いいたします。</p>
<p>新年1発目のネタは、<a target="_blank" href="https://letsencrypt.org/">Let's Encrypt</a>という、SSLの証明機関のオープンソース版みたいなものを<br />試してみました。</p>
<p>残念ながら、このblogが動いているサーバーでは動作しなかったので(Debian stretch)<br />VM上に、Debian Jessieをインストールして検証しました。<br />ちなみに、Debian stretchで動かない原因は「<span style="color: #ff0000;">gccのバグ</span>」です。<br />早めに修正されて、deb展開されることを祈っています<br />(海外フォーラムで見る限りだと、すでにbackportsされているようなのですが。)</p>]]>
<![CDATA[<p>本題です。</p>
<p>VMへ新規インストールしたため、apacheも入っていない状態からスタートします。</p>
<p><strong>1. git, apache2のインストール</strong><br />　apt-get install apache2 git</p>
<p><strong>2. 80, 443ポートを開放</strong><br />　設定するドメインを本当に所持しているか確認しにきます。<br />　ufwやiptables等で弾いている場合は解放しましょう。<br />　自宅サーバーの場合は、ルーターでポートマップしておきましょう。</p>
<p><strong>3. letsencryptをgitからclone</strong><br />　任意のディレクトリで、以下のコマンドを実行します。<br />　# <code>git clone https://github.com/letsencrypt/letsencrypt</code></p>
<p><strong>4. letsencrypt-auto を単体で実行し、必要なパッケージのインストール</strong><br />　# cd letsencrypt<br />　# ./letsencrypt-auto</p>
<p><strong>5. 証明書の取得、作成、設定</strong><br />　# ./letsencrypt-auto certonly --apache -d <span style="color: #000000;">&lt;所有ドメイン&gt;</span></p>
<p><span style="color: #000000;"><strong>6. Apacheの設定が勝手に書き換わり、443の定義が二つ現れるため片方コメントアウト</strong><br />　# cd /etc/apache2/<br />　# vi ports.conf<br /></span></p>
<pre>&lt;IfModule ssl_module&gt;<br />   Listen 443<br />&lt;/IfModule&gt;</pre>
<p>と、</p>
<pre>&lt;IfModule mod_ssl.c&gt;<br />Listen *:443<br />&lt;/IfModule&gt;</pre>
<p>　の二つが設定されているはずなので、元々ある上の設定をコメントアウト</p>
<p><strong>7. Apache2の起動</strong>　# systemctl start apache2.service</p>
<p><strong>8. SSLlabs等を利用し、SSLの設定が正常に行われているか確認<br /></strong>　https://www.ssllabs.com/ssltest/analyze.html?d=&lt;所有ドメイン&gt;</p>
<p>以上です。非常に簡単。便利。</p>
<p>standaloneで取得して設定する必要のほうが多いとは思いますがそれを差し置いても、外部に委託して証明書を作成するよりははるかに楽です。<br /><br /></p>
<p><span style="color: #ff0000;">さぁ、あなたも let's try！</span></p>]]>
</content>
</entry>
<entry>
<title>PHP in_arrayで、大文字小文字を区別しない</title>
<link rel="alternate" type="text/html" href="https://blog.atras.net/atlast/2015/12/php-in-array.html" />
<id>tag:blog.atras.net,2015:/atlast//3.20</id>
<published>2015-12-23T08:55:11Z</published>
<updated>2015-12-23T09:00:17Z</updated>
<summary>件名の通り。備忘録も兼ねている。 in_array(strtolower($ne...</summary>
<author>
<name>atLast</name>
</author>
<category term="php" label="php" scheme="http://www.sixapart.com/ns/types#tag" />
<content type="html" xml:lang="ja" xml:base="https://blog.atras.net/atlast/">
<![CDATA[<p>件名の通り。備忘録も兼ねている。</p>
<pre style="font-family: MeiryoKe_Gothic; font-size: 10pt; color: black; background: white;"><span style="color: #222222;">in_array</span><span style="color: #1e7c70;">(</span><span style="color: #222222;">strtolower</span><span style="color: #1e7c70;">(</span><span style="color: #9b5f9b;">$needle</span><span style="color: #1e7c70;">),</span> <span style="color: #222222;">array_map</span><span style="color: #1e7c70;">(</span><span style="color: #823125;">'strtolower'</span><span style="color: #1e7c70;">,</span> <span style="color: #9b5f9b;">$haystack</span><span style="color: #1e7c70;">));<br /><br />$needleで、$haystackを検索する。<br /></span>array_mapにより、haystackの中身を全て小文字に変換し、strtolowerで検索する文字列も小文字にする。<br />このため、大文字小文字を区別しない検索ができる。
</pre>]]>

</content>
</entry>
<entry>
<title>PHP7から追加された機能について</title>
<link rel="alternate" type="text/html" href="https://blog.atras.net/atlast/2015/12/php7newfunc.html" />
<id>tag:blog.atras.net,2015:/atlast//3.19</id>
<published>2015-12-19T16:01:56Z</published>
<updated>2015-12-20T09:38:46Z</updated>
<summary>PHP7から追加された機能について検証してみました。 以下では4項目のみ取り上げ...</summary>
<author>
<name>atLast</name>
</author>
<category term="php7" label="php7" scheme="http://www.sixapart.com/ns/types#tag" />
<content type="html" xml:lang="ja" xml:base="https://blog.atras.net/atlast/">
<![CDATA[<p>PHP7から追加された機能について検証してみました。</p>
<p><span style="color: #ff0000;">以下では4項目のみ取り上げますが、もっと盛りだくさんの機能追加がされています。</span></p>
<p><strong>1. "??"(null比較演算子)</strong><br /><span style="color: #3366ff;">与えられた左辺がnullの場合、右辺で定義した値を返す</span><br />たとえば、下記のような書き方をします。</p>
<pre>$arr1['abc'] = 'def';
return $arr1['abc'] ?? false; // <span style="color: #ff0000;">ptn1:</span> <span style="color: #ff0000;">$arr1['abc']は定義されているので、'def'が返る</span>
return $arr2['abc'] ?? false; //<span style="color: #ff0000;"> ptn2:</span> <span style="color: #ff0000;">$arr2['abc']は定義されていないため、falseが返る</span></pre>
<p>ptn2の場合は、isnullやissetを利用して通常確認するため<br />isnull、isset地獄から抜け出せる可能性大ですね。</p>
<p><strong>2. "&lt;=&gt;"(組み合わせ比較演算子)</strong><br /><span style="color: #3366ff;">左辺が大きい場合に1、右辺が大きい場合に-1を返す)<br /></span> 例:</p>
<pre>return 1 &lt;=&gt; 2 // -1
return 2 &lt;=&gt; 1 // 1
</pre>
<p><br />威力を発揮するのは、usort等でしょうか。<br />たとえばこんな感じの。</p>
<pre>usort($array, function($a, $b) {
    return $a &lt;=&gt; $b;
});
</pre>
<p></p>]]>
<![CDATA[<p><span style="color: #3366ff;"><span style="color: #000000;"><strong>3. 戻り型の指定(Return Types)</strong><br /> 関数の戻りの型を定義することが出来ます。<br />例として、以下のような書き方をします。<br /></span></span></p>
<pre>function getArrData() : array {
    return 10;
}
$retArr = getArrData();
</pre>
<p><span style="color: #3366ff;"><span style="color: #000000;">上記コードでは、getArrDataはarrayを返すようになっているのに、intを返しているため<br /><span style="color: #ff0000;">PHP Fatal error: Uncaught TypeError: Return value of getArrData() must be of the type array, integer returned<br /><span style="color: #000000;">というエラーが発生します。</span></span></span></span></p>
<p><strong><span style="color: #3366ff;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;">4. Exception on Fatals<br /></span></span></span></span></strong><span style="color: #3366ff;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;">これまで</span></span></span></span><span style="color: #3366ff;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;">Fatal Errorが発生すると止まっていたコードをtry～catchでかこむことで<br />Exceptionを発生させ、コードの実行中断をなくすことができます。<br /></span></span></span></span></p>
<pre>try {
    $ret = method();
    print $ret;
}catch(EngineException $ee) {
    print "Caught Exception: " . $ee-&gt;getMessage();
}
</pre>
<p><span style="color: #3366ff;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;">method()は定義されていないため、通常はFatalErrorで実行停止しますが<br />上記の場合は、メッセージを出力しながら続きを実行することが出来ます。<br /></span></span></span></span></p>]]>
</content>
</entry>
</feed>