tag:blogger.com,1999:blog-20690209945569544372024-03-14T20:36:59.062+09:00オデの日記@WEB系大阪でWEB屋しています。
<br>
OSSに関するメモ帳のかわり。
koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.comBlogger243125tag:blogger.com,1999:blog-2069020994556954437.post-49636527489233807252019-08-26T17:54:00.003+09:002019-08-26T17:54:49.274+09:00iOS証明書を更新するどうも、俺です。<br />
<br />
1年ほど前に<a href="http://koexuka.blogspot.com/2018/07/ios-push.html" target="_blank">iOS PUSH通知証明書の更新方法</a>をメモしましたが、今日はiOS証明書の更新方法をメモ。<br />
<br />
全体の流れは、<br />
<br />
<br />
<ol>
<li>証明書署名要求を作成</li>
<li>Apple Developer Programで新しい証明書を作成</li>
<li>.p12ファイルを作成</li>
<li>プロビジョニングプロファイルを更新</li>
</ol>
<div>
です。</div>
<div>
<br /></div>
<div>
<br /></div>
<h3>
手順1: 証明書署名要求を作成</h3>
<div>
キーチェーンアクセス.appを起動し、メニューにある</div>
<div>
「キーチェーン」→「証明書アシスタント」→「認証局に証明書を要求...」をクリック</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-gBevjEiNK_M/XWOaX-euqcI/AAAAAAAACKo/vg1_dfz5rmw4pbPuSxNTNSPlJbFQAZy2gCLcBGAs/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="436" data-original-width="616" height="226" src="https://1.bp.blogspot.com/-gBevjEiNK_M/XWOaX-euqcI/AAAAAAAACKo/vg1_dfz5rmw4pbPuSxNTNSPlJbFQAZy2gCLcBGAs/s320/1.jpg" width="320" /></a></div>
<span id="goog_1831193057"></span><span id="goog_1831193058"></span>・ユーザーのメールアドレス ... Apple Developer Programのメールアドレス<br />
・通称 ... なんでもOK<br />
・CAのメールアドレス ... 空白<br />
・ディスクに保存 ... チェック<br />
・鍵ペア情報を指定 ... チェック<br />
で「続ける」をクリックし、適切なディレクトリに保存します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-zqtbT7HLMD4/XWOaXxPY1xI/AAAAAAAACLU/A_QpDzQFvEcQR2YJgoEOlguX3eRLEqd3wCEwYBhgL/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="436" data-original-width="616" height="226" src="https://1.bp.blogspot.com/-zqtbT7HLMD4/XWOaXxPY1xI/AAAAAAAACLU/A_QpDzQFvEcQR2YJgoEOlguX3eRLEqd3wCEwYBhgL/s320/2.jpg" width="320" /></a></div>
<br />
鍵ペア情報は「2048ビット」「RSA」でOK。<br />
保存するファイル名を変更していなければ、対象のディレクトリにCertificateSigningRequest.certSigningRequestというファイルが生成されます。<br />
<br />
<h3>
手順2: Apple Developer Programで証明書を作成</h3>
Apple Developer Programにログインし、<br />
メニュー→「Certificates」をクリックし選択。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-O6XhPPUZXkw/XWOaYp_stmI/AAAAAAAACLk/_aCct-I7Kbk3T4ZyqQE809SCRP3DapVcACEwYBhgL/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="281" data-original-width="779" height="115" src="https://1.bp.blogspot.com/-O6XhPPUZXkw/XWOaYp_stmI/AAAAAAAACLk/_aCct-I7Kbk3T4ZyqQE809SCRP3DapVcACEwYBhgL/s320/3.jpg" width="320" /></a></div>
<br />
↑の画像にある「+」ボタンをクリックし新しい証明書作成画面に移ります。<br />
<br />
続いて「iOS App Development」を選択。<br />
これは開発用の証明書です。<br />
AdHoc用や本番用の証明書を作る場合は「iOS Distribution (App Store and Ad Hoc)」を選択。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-lM0QzT3P-P8/XWOaYzkChMI/AAAAAAAACLg/-I8073UHIZgkRpWtZEXQgg44DkqGNuTkACEwYBhgL/s1600/4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="359" data-original-width="882" height="130" src="https://1.bp.blogspot.com/-lM0QzT3P-P8/XWOaYzkChMI/AAAAAAAACLg/-I8073UHIZgkRpWtZEXQgg44DkqGNuTkACEwYBhgL/s320/4.jpg" width="320" /></a></div>
<br />
次に、手順1で作成した証明書要求の CertificateSigningRequest.certSigningRequest を選択します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-3C1hd1OlGOQ/XWOaY9OtdyI/AAAAAAAACLc/aOWKpwdE0_4n8WQy1riEkygZRgGed8vBgCEwYBhgL/s1600/5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="364" data-original-width="831" height="140" src="https://1.bp.blogspot.com/-3C1hd1OlGOQ/XWOaY9OtdyI/AAAAAAAACLc/aOWKpwdE0_4n8WQy1riEkygZRgGed8vBgCEwYBhgL/s320/5.jpg" width="320" /></a></div>
<br />
すると、次の画面で作成された証明書情報が見れますので、右上の「Download」をクリックし保存します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-Hbh12HkQfes/XWOaZmA37uI/AAAAAAAACLY/0VBVVZF8m60-BFgK7ja7WHQqsUCi95xbACEwYBhgL/s1600/6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="342" data-original-width="1311" height="83" src="https://1.bp.blogspot.com/-Hbh12HkQfes/XWOaZmA37uI/AAAAAAAACLY/0VBVVZF8m60-BFgK7ja7WHQqsUCi95xbACEwYBhgL/s320/6.jpg" width="320" /></a></div>
<br />
<br />
これで新しい証明書が作成され、PCにも保存されました。<br />
DLした証明書をダブルクリックし、キーチェーンアクセスに登録しておきます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-rC7oM6YdxRc/XWOaZ5BSxDI/AAAAAAAACLc/rhGJZMNQBPokygdWAA6SVL-jpLVg8KfxwCEwYBhgL/s1600/7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="305" data-original-width="535" height="182" src="https://1.bp.blogspot.com/-rC7oM6YdxRc/XWOaZ5BSxDI/AAAAAAAACLc/rhGJZMNQBPokygdWAA6SVL-jpLVg8KfxwCEwYBhgL/s320/7.jpg" width="320" /></a></div>
<br />
<br />
古い証明書は有効期限まで使えますが、もう新しい証明書を使ってしまってOKです。<br />
<br />
<h3>
手順3: .p12ファイルの作成</h3>
個人で開発されてる方はここの手順は不要です。<br />
チーム開発されてる場合などは、.p12ファイルを作成 & 共有して使うと良いです。<br />
<br />
まず、キーチェーンアクセスを起動し、登録したての新しい証明書を選択します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-rXzf9tPAxUM/XWOaaOdXxeI/AAAAAAAACLg/ceV2Vi3LnZAFp5hQ8CGYRpyw8ufV4ibGQCEwYBhgL/s1600/8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="268" data-original-width="996" height="86" src="https://1.bp.blogspot.com/-rXzf9tPAxUM/XWOaaOdXxeI/AAAAAAAACLg/ceV2Vi3LnZAFp5hQ8CGYRpyw8ufV4ibGQCEwYBhgL/s320/8.jpg" width="320" /></a></div>
<br />
左側にある「▶」をクリックし、「秘密鍵」と書かれた鍵マークのある列を選択します。<br />
そこで右クリックし「" ****** を書き出す..."」をクリックし、適切な名前をつけて.p12ファイルを保存します。<br />
これで.p12ファイルが出来上がります。<br />
<br />
<br />
<h3>
手順4: プロビジョニングプロファイルを更新</h3>
証明書が新しくなると、プロビジョニングプロファイルを更新する必要があります。<br />
※有効期限が切れると使えなくなるため<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-iNWr6OjHFlg/XWOaX9q7zdI/AAAAAAAACLc/Tl7gIMQHeuUKopdQchhLbmLwaPec3g9dQCEwYBhgL/s1600/10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="630" data-original-width="704" height="286" src="https://1.bp.blogspot.com/-iNWr6OjHFlg/XWOaX9q7zdI/AAAAAAAACLc/Tl7gIMQHeuUKopdQchhLbmLwaPec3g9dQCEwYBhgL/s320/10.jpg" width="320" /></a></div>
<br />
<br />
既存のプロビジョニングプロファイルを「Edit」から編集し、新しい証明書を選択して作り直します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-LC2FJ88QrAU/XWOaas-Do4I/AAAAAAAACLk/NyxFVwCoMS88oslY65X3CK4W9XA6fwAsgCEwYBhgL/s1600/9.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="372" data-original-width="1188" height="100" src="https://1.bp.blogspot.com/-LC2FJ88QrAU/XWOaas-Do4I/AAAAAAAACLk/NyxFVwCoMS88oslY65X3CK4W9XA6fwAsgCEwYBhgL/s320/9.jpg" width="320" /></a></div>
<br />
<br />
<br />
<br />
以上でぇぇぇえす。</div>
koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-35478520764586465142019-03-22T12:14:00.000+09:002019-03-22T12:14:05.108+09:00DKIM設定してさらにメール到達率を上げるどうも、俺です。<br />
<br />
男もすなるDKIMといふものを女もししてみむとてするなり。<br />
<br />
環境はCentOS7.2 + Postfix 2.10.1 です。<br />
<br />
<h3>
OpenDKIMのインストール</h3>
yumで入れます。<br />
<pre class="brush:shell"># yum install opendkim
</pre>
<br />
鍵やら何やらを作るので、専用のディレクトリを作成します。<br />
<pre class="brush:shell"># mkdir /etc/opendkim/keys/MYDOMAIN.com(ドメイン名)
</pre>
<br />
で、鍵やら何やらを作ります。<br />
<pre class="brush:shell"># opendkim-genkey -D /etc/opendkim/keys/MYDOMAIN.com/ -b 1024 -d MYDOMAIN.com -s koexuka
</pre>
<br />
-Dは生成ディレクトリ<br />
-bは1024や2048など鍵のビット長<br />
-dはドメイン名<br />
-sはセクレタ名。鍵を識別できる分かりやすい名前が良いです。サイト名や作成日付など。<br />
<br />
これでファイルが2つできてるはずです。<br />
<pre class="brush:shell"># ls -l /etc/opendkim/keys/MYDOMAIN.com
-rw------- 1 opendkim opendkim 887 3月 22 15:11 koexuka.private
-rw------- 1 opendkim opendkim 317 3月 22 15:11 koexuka.txt
</pre>
<br />
<br />
<h3>
設定ファイルの更新</h3>
KeyTableファイルを編集します。<br />
<pre class="brush:shell"># vim /etc/opendkim/KeyTable
koexuka._domainkey.MYDOMAIN.com MYDOMAIN.com:koexuka:/etc/opendkim/keys/MYDOMAIN.com/koexuka.private
</pre>
<br />
SigningTableファイルを編集します。<br />
<pre class="brush:shell"># vim /etc/opendkim/SigningTable
*@MYDOMAIN.com koexuka._domainkey.MYDOMAIN.com
</pre>
<br />
TrustedHostファイルを編集します。<br />
<pre class="brush:shell"># vim /etc/opendkim/TrustedHosts
127.0.0.1
::1
#host.example.com
#192.168.1.0/24
</pre>
<br />
CIDR形式で記述できます。<br />
上記IPにマッチした場合だけ署名されます。<br />
<br />
opendkim.confを編集します。<br />
<pre class="brush:shell"># vim /etc/opendkim.conf
Mode sv
#KeyFile /etc/opendkim/keys/default.private #コメントアウトする
KeyTable /etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
</pre>
<br />
/etc/sysconfig/opendkimファイルを編集します。<br />
<pre class="brush:shell"># vim /etc/sysconfig/opendkim
# これを追加
AUTOCREATE_DKIM_KEYS=NO
</pre>
<br />
main.cfを編集します。<br />
<pre class="brush:shell">#vim /etc/postfix/main.cf
# これを追加
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
</pre>
<br />
Postfixを再起動します。
<br />
<pre class="brush:shell"># systemctl restart postfix
</pre>
<br />
<br />
<h3>
ドメイン情報を更新</h3>
<div>
利用しているDNSサーバーでTXTゾーンにDKIMの内容を反映させます。<br />
まず、公開鍵の内容を確認します。<br />
<br /></div>
<pre class="brush:shell"># cat /etc/opendkim/keys/MYDOMAIN.com/koexuka.txt
koexuka._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNAD(〜略〜)//ciSVp9o(〜略〜)ZBCwIDAQAB" ) ; ----- DKIM key koexuka for MYDOMAIN.com
</pre>
<br />
DNS管理画面で以下を追加します。<br />
<pre class="brush:shell">Aレコード koexuka._domainkey.MYDOMAIN.com 123.45.67.89(IPアドレス)
TXTレコード koexuka._domainkey p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNAD....ZBCwIDAQAB; v=DKIM1; k=rsa;
</pre>
<br />
<br />
あとは実際にメールを送信してみて、受信側でメールヘッダに<br />
dkim=pass<br />
とあればOKです!<br />
<br />
以上でぇぇぇぇえぇ〜す。koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-60965584690023544132019-03-15T14:34:00.001+09:002019-03-15T14:35:10.868+09:00PostgreSQL10のでパーティショニングどうも、俺です。<br />
<br />
PostgreSQLがv10になってからパーティショニングの設定が超ラクになりました。<br />
これまでは、CREATE TABLE するときにトリガーや関数を逐一設定する必要がありましたが、<br />
PostgreSQL 10からはCREATE TABLE文の中だけでパーティショニングの設定が可能です。<br />
<br />
簡単なサンプルで見てみます。<br />
<br />
<pre class="brush:shell">-- 元となる親テーブルの作成
CREATE TABLE test_table (
id SERIAL,
user_id INTEGER NOT NULL,
name VARCHAR(512) NOT NULL,
created_at TIMESTAMP NOT NULL
)
-- user_idをキーにパーティションする
PARTITION BY LIST (user_id);
-- user_idが1の場合はtest_table_1へ
CREATE TABLE test_table_1 PARTITION OF test_table FOR VALUES IN (1);
-- user_idが2の場合はtest_table_2へ
CREATE TABLE test_table_2 PARTITION OF test_table FOR VALUES IN (2);
-- user_idが3と4の場合はtest_table_3へ
CREATE TABLE test_table_3 PARTITION OF test_table FOR VALUES IN (3,4);
-- user_idが5と6と7の場合はtest_table_4へ
CREATE TABLE test_table_4 PARTITION OF test_table FOR VALUES IN (5,6,7);
.
.
.
</pre>
<br />
これだけでOKです。<br />
<br />
<br />
ただ、このパーティショニングの方法だと、user_idが増えれば増えるほどパーティショニング子テーブルをいちいち CREATE TABLE する必要があるので、<br />
子テーブルを予め10個作成しておき、user_idを10で割った余りを元にパーティショニングするように変更してみます。<br />
<br />
<pre class="brush:shell">CREATE TABLE test_table (
id SERIAL,
user_id INTEGER NOT NULL,
name VARCHAR(512) NOT NULL,
created_at TIMESTAMP NOT NULL
)
-- user_idを10で割った余りをキーにパーティションする
PARTITION BY LIST ((user_id%10));
CREATE TABLE test_table_1 PARTITION OF test_table FOR VALUES IN (1);
CREATE TABLE test_table_2 PARTITION OF test_table FOR VALUES IN (2);
CREATE TABLE test_table_3 PARTITION OF test_table FOR VALUES IN (3);
CREATE TABLE test_table_4 PARTITION OF test_table FOR VALUES IN (4);
CREATE TABLE test_table_5 PARTITION OF test_table FOR VALUES IN (5);
CREATE TABLE test_table_6 PARTITION OF test_table FOR VALUES IN (6);
CREATE TABLE test_table_7 PARTITION OF test_table FOR VALUES IN (7);
CREATE TABLE test_table_8 PARTITION OF test_table FOR VALUES IN (8);
CREATE TABLE test_table_9 PARTITION OF test_table FOR VALUES IN (9);
CREATE TABLE test_table_0 PARTITION OF test_table FOR VALUES IN (0);
</pre>
<br />
<br />
以上でぇぇぇえ〜す。koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-84819728540151426522018-07-25T11:27:00.003+09:002018-07-25T11:27:53.041+09:00iOS PUSH通知証明書を更新するどうも、俺です。<br />
<br />
1年毎にやってくるPUSH通知証明書の更新ですが、毎回手順を調べるのも面倒なのでメモ。<br />
全体の流れは、<br />
<br />
<ol>
<li>証明書署名要求を作成</li>
<li>Apple Developer Programで証明書を作成</li>
<li>.p12ファイルを作成</li>
<li>.pemファイルを作成</li>
</ol>
です。<br />
<br />
<h3>
【手順1: 証明書署名要求を作成】</h3>
キーチェーンアクセス.appを起動し、メニューの<br />
「キーチェーン」→「証明書アシスタント」→「認証局に証明書を要求...」をクリック。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-Ur8TSbn7tmY/W1faaKqCAvI/AAAAAAAAB_A/-SeNunkONcwxpxdQ6tXFp2apvPOVd1x7gCLcBGAs/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="436" data-original-width="616" height="226" src="https://1.bp.blogspot.com/-Ur8TSbn7tmY/W1faaKqCAvI/AAAAAAAAB_A/-SeNunkONcwxpxdQ6tXFp2apvPOVd1x7gCLcBGAs/s320/1.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
・ユーザーのメールアドレスを入力...適当なメアド</div>
<div class="separator" style="clear: both; text-align: left;">
・通称 ... 何でもOK</div>
<div class="separator" style="clear: both; text-align: left;">
・CAのメールアドレス ... 空白</div>
<div class="separator" style="clear: both; text-align: left;">
・ディスクに保存 ... チェック</div>
<div class="separator" style="clear: both; text-align: left;">
・鍵ペア情報を指定 ... チェックしない</div>
<div class="separator" style="clear: both; text-align: left;">
で、「続ける」をクリックし、保存先を決めてファイルを保存。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
CertificateSigningRequest.certSigningRequest というファイルが生成されます。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h3>
【手順2: Apple Developer Programで証明書を作成】</h3>
<div class="separator" style="clear: both; text-align: left;">
Apple Developer Programにログイン。</div>
<div class="separator" style="clear: both; text-align: left;">
メニューにある「Certificates」→「All」をクリック。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-8-hdPJYVs6A/W1fbk3QvJsI/AAAAAAAAB_M/HnklX8zq_sQmiD7sfrJZSG-7OpbsvdbOQCLcBGAs/s1600/iOS%2BCertificates%2B-%2BApple%2BDeveloper%2B2018-07-25%2B11-07-14.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="221" data-original-width="998" height="70" src="https://1.bp.blogspot.com/-8-hdPJYVs6A/W1fbk3QvJsI/AAAAAAAAB_M/HnklX8zq_sQmiD7sfrJZSG-7OpbsvdbOQCLcBGAs/s320/iOS%2BCertificates%2B-%2BApple%2BDeveloper%2B2018-07-25%2B11-07-14.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
画面右上にある「+」ボタンをクリックし証明書作成を開始する。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
次の画面で、「Production」内にある「Apple Push Notification service SSL (Sandbox & Production)」にチェックを入れ「Continue」をクリック。</div>
<div class="separator" style="clear: both; text-align: left;">
※開発版の場合は「Develop」内にある「Apple Push Notification service SSL (Sandbox)」にチェックを入れる。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-UC-0tLlnJw0/W1fcbUkDjEI/AAAAAAAAB_U/G6DTGPiVsPQ0A3d4hnDeAw9sL0oETne0ACLcBGAs/s1600/Add%2B-%2BiOS%2BCertificates%2B-%2BApple%2BDeveloper%2B2018-07-25%2B11-11-11.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="397" data-original-width="726" height="174" src="https://4.bp.blogspot.com/-UC-0tLlnJw0/W1fcbUkDjEI/AAAAAAAAB_U/G6DTGPiVsPQ0A3d4hnDeAw9sL0oETne0ACLcBGAs/s320/Add%2B-%2BiOS%2BCertificates%2B-%2BApple%2BDeveloper%2B2018-07-25%2B11-11-11.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
次の画面で、PUSH通知証明書を更新するアプリのApp IDを選択し「Continue」。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-7tSY-a2JXYk/W1fcskGD9SI/AAAAAAAAB_s/hzwWiQXji1gPJQNaaqgZAUg6xU6T0zC_ACLcBGAs/s1600/Add%2B-%2BiOS%2BCertificates%2B-%2BApple%2BDeveloper%2B2018-07-25%2B11-12-53.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="451" data-original-width="711" height="202" src="https://1.bp.blogspot.com/-7tSY-a2JXYk/W1fcskGD9SI/AAAAAAAAB_s/hzwWiQXji1gPJQNaaqgZAUg6xU6T0zC_ACLcBGAs/s320/Add%2B-%2BiOS%2BCertificates%2B-%2BApple%2BDeveloper%2B2018-07-25%2B11-12-53.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
次の画面はそのまま「Continue」をクリック。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-hpNQUSG2ct4/W1fc6mSu8UI/AAAAAAAAB_w/lZ2Yai0X-mgDXFerokEMbNJRbqAK8KyDwCLcBGAs/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="486" data-original-width="1008" height="154" src="https://2.bp.blogspot.com/-hpNQUSG2ct4/W1fc6mSu8UI/AAAAAAAAB_w/lZ2Yai0X-mgDXFerokEMbNJRbqAK8KyDwCLcBGAs/s320/2.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
次の画面で、先ほど生成した CertificateSigningRequest.certSigningRequest を選択し「Continue」。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-mSNG0t21ZYQ/W1fdl5z2rpI/AAAAAAAACAA/15aVVkfIngUIzxvJucvPOg4K92ZTBtPZgCLcBGAs/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="562" data-original-width="737" height="244" src="https://1.bp.blogspot.com/-mSNG0t21ZYQ/W1fdl5z2rpI/AAAAAAAACAA/15aVVkfIngUIzxvJucvPOg4K92ZTBtPZgCLcBGAs/s320/3.jpg" width="320" /></a></div>
<br />
すると、証明書が作成されるので「Download」をクリックし保存する。<br />
<br />
<br />
<h3>
【手順3: .p12ファイルを作成】</h3>
<div>
手順2で作成した証明書ファイルをダブルクリックし、キーチェーンアクセスに登録します。</div>
<div>
<br /></div>
<div>
次にキーチェーンアクセス上で、登録した証明書を「右クリック」→「"Apple Push Services: XXX.XXX.XXX"を書き出す...」をクリックして適当なディレクトリに保存します。</div>
<div>
パスワードが必要な場合は設定して下さい。次の手順4で利用します。</div>
<div>
<br /></div>
すると、証明書.p12のようなファイル名でファイルが書き出されます。<br />
ファイル名は半角英数で aps_prod.p12 のように変えておいたほうが良いです。<br />
<br />
<br />
<br />
<h3>
【手順4: .pemファイルを作成】</h3>
多くのPUSH通知証明書更新について書かれたサイトは、<br />
手順3で作成した「.p12ファイルをサーバーにあげて使って下さい」、とあるのですが、<br />
一応、.pemファイルを作ってそれをサーバーにUPする手順も書いておきます。<br />
(...というか、その方法でしかやった事がない)<br />
<br />
ターミナルを開き、手順3で作成した.p12ファイルがあるディレクトリまで移動し、<br />
以下のコマンドを叩きます。<br />
<br />
<pre class="brush:shell">$ openssl pkcs -in aps_prod.p12 -out aps_prod.pem -nodes</pre>
<br />
これで、.pemファイルが生成されます。<br />
※手順3でパスワードを指定していた場合は、パスワードを問われます。<br />
<br />
<br />
<br />
手順は以上。<br />
作られたaps_prod.pemをサーバーにアップしてPUSH通知が届くかテストして作業完了です!<br />
<br />
<br />
以上でぇぇぇぇぇぇぇす。koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-50644419844540043822018-07-11T16:46:00.002+09:002018-07-11T16:48:23.422+09:00SQLiteのコマンドラインを見やすくしちゃうどうも、俺です。<br />
<br />
SQLiteのコマンドラインって見にくいですよね。<br />
そこで見やすくする方法についてメモ。<br />
<br />
<br />
<pre class="brush:shell">
$ vim ~/.sqliterc
.header on
.mode column</pre>
<br />
これでOKです。<br />
<br />
<br />
または、SQLiteのコマンドライン内で直接、
<br />
<pre class="brush:shell">
$ sqlite3 hoge.sqlite
sqlite> .header on
sqlite> .mode column
</pre>
<br />
これでもOKです。<br />
<br />
<br />
以上でぇぇぇす。koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-69914283108105072412018-04-23T16:14:00.002+09:002018-04-23T16:14:24.896+09:00PostgreSQL TIMESTAMP型のDEFAULTS値に小数点以下を表示させないどうも、俺です。<br />
<br />
PostgreSQLのテーブル定義で
<br />
<pre class="brush:shell">created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
</pre>
<br />
という定義をすると、<br />
created_atカラムに値を指定せずINSERTすると<br />
<pre class="brush:shell">2018-04-23 16:12:23.13289
</pre>
<br />
秒の後に小数点が入ります。<br />
<br />
<br />
小数点を入れずに、年月日 時分秒 というフォーマットにするには
<br />
<pre class="brush:shell">created_at TIMESTAMP NOT NULL DEFAULT DATE_TRUNC('second', now() :: timestamp)
</pre>
<br />
という定義にしておけばOKです。<br />
<br />
<br />
以上でぇぇえぇす。koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-55211250770520245332018-04-20T18:47:00.005+09:002018-04-20T18:47:51.213+09:00動画をパラパラアニメに変換するサービスを5日で作りましたどうも、俺です。<br />
<br />
やれライブ配信だ、やれ動画広告だ、と騒がれがちな昨今ですが、<br />
動画ファイル(.mp4 .mov)をパラパラアニメに変換するサービスを作りました。<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://parapara-douga.com/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" data-original-height="124" data-original-width="684" height="58" src="https://4.bp.blogspot.com/-X5YG1XJP3ic/Wtm1wP79xkI/AAAAAAAAB8M/SA7EX4YgP_YAgWXQRik4BVOyRGRgR1IlwCLcBGAs/s320/logo.png" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<a href="https://parapara-douga.com/" target="_blank">パラパラ動画</a>です。<br />
<br />
<br />
変換したい動画ファイルを選択し、<br />
フレームレート(fps)と再生速度、出力フォーマット(gif または webp)を選んでアップロードすれば、<br />
見事なパラパラアニメが完成します。<br />
<br />
aPNGにも変換できるようにしてるんですが、<br />
如何せん変換後のファイルサイズがバカでかいので、取りやめました。<br />
仕事の合間に作ったので結構日数かかりました。<br />
<br />
素のPHP + TwitterBootstrap3 + SQLiteです。<br />
ページデザインはこれ以上オシャレにできませんToT<br />
<br />
「ブログにパラパラ画像を載せたい!」というような場面で是非活用してもらえればうれしいです。<br />
<br />
<br />
<br />
以上でぇぇぇす。koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-50102736570632701862018-04-19T16:43:00.000+09:002018-04-19T16:51:10.400+09:00今さらながら、Let's EncryptでSSL対応 + 自動更新どうも、俺です。<br />
<br />
今日は、随分前からWeb界隈でもてはやされているLet's Encryptの導入と自動更新設定についてメモ。<br />
<br />
環境はCentOS6.9。たぶんCentOS7系でも一緒だと思う..。<br />
Apache 2.4。<br />
<br />
<h3>
(1) certbotをダウンロード</h3>
<pre class="brush:shell">$ wget "https://dl.eff.org/certbot-auto"
// certbot-autoを適当なPATHへ持っていく
# mv certbot-auto /usr/local/bin
// certbot-autoに実行権限を付与
# chmod +x /usr/local/bin/certbot-auto
</pre>
<br />
<h3>
(2) SSL証明書を作成
</h3>
<div>
<span style="background-color: white; color: red;">※注意 :この時点で対象サーバーにドメインが当たっていないと以下のコマンドは失敗します。</span></div>
<div>
<br /></div>
<pre class="brush:shell"># certbot-auto certonly --webroot -w /www/path/to/public -d example.com --email info@example.com
</pre>
<br />
うまくいくと
<br />
<pre class="brush:shell">IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com/privkey.pem
Your cert will expire on 2018-07-18. To obtain a new or tweaked
version of this certificate in the future, simply run certbot-auto
again. To non-interactively renew *all* of your certificates, run
"certbot-auto renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
</pre>
が表示されます。<br />
<br />
<h3>
(3) 証明書の確認</h3>
<pre class="brush:shell">$ ls /etc/letsencrypt/live/example.com
README cert.pem chain.pem fullchain.pem privkey.pem
</pre>
<br />
<br />
<ul>
<li>cert.pem ... 証明書</li>
<li>chain.pem ... 中間証明書</li>
<li>fullchain.pem ... 証明書と中間証明書とを一緒にした証明書</li>
<li>privkey.pem ... 秘密鍵</li>
</ul>
<br />
<h3>
(4) Apache(2.4系)の設定</h3>
対象の.confファイル内に以下を記述。<br />
<pre class="brush:shell">SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</pre>
<br />
※2.2系の場合は以下も記述。
<br />
<pre class="brush:shell">SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
</pre>
<br />
<h3>
(5) Apache再起動</h3>
<pre class="brush:shell"># /usr/local/apache2/bin/apachectl restart
</pre>
<br />
<h3>
(6) Let's Encrypt 自動更新設定</h3>
Let's Encryptの証明書は3ヶ月で有効期限が切れます。<br />
そのためcronで自動更新させましょう。<br />
<pre class="brush:shell"># vim /etc/crontab
30 5 * * 1 root /usr/bin/certbot-auto renew -q --no-self-upgrade --post-hook "/usr/local/apache2/bin/apachectl restart"
</pre>
<br />
↑毎週月曜AM5:30に更新コマンドを叩いています。<br />
更新ができるようになる30日前になったら、証明書が更新されます。<br />
-qオプション ... 出力なし。<br />
--no-self-upgrade ... プログラムの新バージョンへの自動更新をしない。<br />
<br />
<br />
<br />
<br />
以上でぇぇぇえぇぇす。koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-61471435693254977632018-04-03T14:26:00.000+09:002018-04-03T14:28:32.938+09:00"〜〜" not found using pkg-configのエラーが出るどうも俺です。<br />
<br />
Linux上で何かのプログラムをインストールしようとして、
<pre class="brush:shell">
$ ./configure
ERROR: libwebp >= 0.2.0 not found using pkg-config</pre>
<br />
<pre class="brush:shell">のようなエラーが出る場合、pkg-configとやらが悪さをしている可能性があります。</pre><br />
その場合は、<br />
<pre class="brush:shell">
$ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
</pre>
<br />
で解消する場合があるのでお試しあれ。<br />
以上でぇぇえぇぇぇす。koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-3847282853039875312017-09-26T19:00:00.000+09:002017-09-26T19:00:01.009+09:00Xcode8のままiOS11ビルドをするどうも俺です。<br />
<br />
<br />
iOS11がリリースされ、それに合わせてXcode v9もリリースされました。<br />
Xcodeをバージョンアップするためには、<br />
先にMacOSをバージョンアップする必要があって...いつもながら超面倒です。<br />
<br />
Xcode8のままだとiOS11用にビルドできない...とお思いのみなさん、<br />
裏技を使ってそのままiOS11ビルドできます。<br />
<br />
<span style="color: red;"><b>※動作保証はできませんので、自己責任で行って下さい。</b></span><br />
<br />
<br />
(1) Xcode 9をダウンロードする<br />
https://developer.apple.com/download/more/<br />
からXcode 9をダウンロードし解凍します。<br />
結構時間かかります。<br />
<br />
(2) Xcode 9.appを適当なディレクトリへおく<br />
/Application/Xcode-9.app などへ移動させましょう。<br />
<br />
(3) Xcode 8を適当な名前にリネームしておく。<br />
仮に、Xcode-8.app としておきましょう。<br />
<br />
(4) Xcode 8.appにXcode 9.app内にあるiOS11ディスクイメージのシンボリックを貼る<br />
<br />
<pre class="brush:shell">$ sudo ln -s /Applications/Xcode-9.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/11.0\ \(15A5278f\) /Applications/Xcode-8.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/11.0
</pre>
<br />
(5) Xcode 8.appを再起動<br />
再起動したら準備OK。iOS11端末をつなげてビルドできます。<br />
<br />
<br />
<br />
<br />
ここに答えが。<br />
<a href="https://stackoverflow.com/questions/44381860/use-xcode-8-with-ios-11" target="_blank">Use Xcode 8 with iOS 11 | stack overflow</a><br />
<br />
<br />
<br />
以上でぇぇぇぇす。koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-9951060156550557192017-08-08T12:30:00.000+09:002017-08-18T17:47:48.031+09:00linker command failed with exit code 1が出た時の解決方法案どうも、俺です。
<br />
<br />
Xcodeで開発してて目にすると1時間はその解決に費やしてしまうこともある地獄のエラー文言。<br />
そう、それが<br />
<pre class="brush:shell">linker command failed with exit code 1</pre>
<br />
<br />
※Xcode 8.3.3<br />
<br />
今日はこのエラーが出た時「これやったら直った」というあらゆる手段をお伝えします。<br />
<br />
<br />
<h4>
■プロビジョニングプロファイルは正しく設定されているか</h4>
人により設定方法は様々ですが、僕の場合、<br />
・General>SigningにあるAutomatically manage signingのチェックをはずす<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-COPUwDYA74Q/WYksRI5M5eI/AAAAAAAABzc/qvIK16Q5A1Qm_gAUGmru4p-_U5iFmeWkACLcBGAs/s1600/SmashPingPong.xcodeproj%2B2017-08-08%2B12-12-48.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="115" data-original-width="647" height="56" src="https://4.bp.blogspot.com/-COPUwDYA74Q/WYksRI5M5eI/AAAAAAAABzc/qvIK16Q5A1Qm_gAUGmru4p-_U5iFmeWkACLcBGAs/s320/SmashPingPong.xcodeproj%2B2017-08-08%2B12-12-48.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
・Build Settings内、</div>
<div class="separator" style="clear: both; text-align: left;">
ProvisioningProfile (Deprecated)とProvisioning Profileの2箇所に適切なプロビジョニングプロファイルを設定。</div>
<div class="separator" style="clear: both; text-align: left;">
Code Signing Identityに正しい証明書を設定。</div>
<div class="separator" style="clear: both; text-align: left;">
最後にDevelopment Teamにチーム名を設定。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
としています。</div>
<div class="separator" style="clear: both; text-align: left;">
このミスの際は、ちゃんと「プロビジョニングプロファイル間違えているよ」というエラーが出ることが多い...。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h4>
■Enable Bitcodeの設定を間違えていないか</h4>
<div class="separator" style="clear: both; text-align: left;">
Build Settings>Build Options内にあるEnable Bitcodeが「Yes」になっているとアカン場合がある。</div>
<div class="separator" style="clear: both; text-align: left;">
組み込んだフレームワークがbitcodeとやらに対応していないかもしれないので、速攻「No」に設定し直す。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-Yh-GaeARCk4/WYktu2rjTpI/AAAAAAAABzo/oPA8nPnRUyAScMW-gJ2BhuE7Mz_U4u3ggCLcBGAs/s1600/SmashPingPong.xcodeproj%2B2017-08-08%2B12-18-43.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="29" data-original-width="484" height="19" src="https://4.bp.blogspot.com/-Yh-GaeARCk4/WYktu2rjTpI/AAAAAAAABzo/oPA8nPnRUyAScMW-gJ2BhuE7Mz_U4u3ggCLcBGAs/s320/SmashPingPong.xcodeproj%2B2017-08-08%2B12-18-43.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<span id="goog_514662883"></span><span id="goog_514662884"></span><br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
参照 <a href="https://youtachannel.com/xcode-error-linker-command-failed-with-exit-code-1/" target="_blank">【Xcode】エラー「linker command failed with exit code 1」の解決策</a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h4>
■存在しないリソース(画像etc)を取り入れようとしていないか</h4>
<div class="separator" style="clear: both; text-align: left;">
Build Phases>Copy Bundle Resources内に存在しないリソースがないか要チェック。</div>
<div class="separator" style="clear: both; text-align: left;">
無いものが含まれている場合は削除します。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h4>
■Deployment Targetを間違えていないか</h4>
<div class="separator" style="clear: both; text-align: left;">
General>Deployment InfoにあるDeployment Targetに無茶な値を入れていないか。</div>
<div class="separator" style="clear: both; text-align: left;">
古すぎるターゲットなどに設定している場合は、よく考えて適切な値にします。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h4>
■Info.plistの設定Target Membershipは大丈夫か</h4>
<div class="separator" style="clear: both; text-align: left;">
Info.plistを選択してTarget Membershipにチェックが入っているとアウト。</div>
<div class="separator" style="clear: both; text-align: left;">
チェックを外します。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-qUDgy3rFOTU/WYkvXAuLjFI/AAAAAAAABz0/eNY5QeRwVpYXvjEJ59KYfOHHM3L4RX25wCLcBGAs/s1600/Info.plist%2B2017-08-08%2B12-25-40.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="226" data-original-width="302" src="https://4.bp.blogspot.com/-qUDgy3rFOTU/WYkvXAuLjFI/AAAAAAAABz0/eNY5QeRwVpYXvjEJ59KYfOHHM3L4RX25wCLcBGAs/s1600/Info.plist%2B2017-08-08%2B12-25-40.jpg" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h4>
■Xcodeを再起動しよう</h4>
<div class="separator" style="clear: both; text-align: left;">
この方法を使うと<b><span style="color: red; font-size: large;">90%の確率</span></b>でビルドが成功します。</div>
<div class="separator" style="clear: both; text-align: left;">
試してみる価値あり。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h4>
■Mac本体ごと再起動しよう</h4>
<div class="separator" style="clear: both; text-align: left;">
この方法を使うと<b><span style="color: red; font-size: large;">50%の確率</span></b>でビルドが成功します。</div>
<div class="separator" style="clear: both; text-align: left;">
試してみる価値あり。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
上記以外でこのエラーの対処方法があれば教えてください。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="color: blue; font-size: large;">※※※2017.08.18追記</span></div>
<div class="separator" style="clear: both; text-align: left;">
このエラーが出た時に詳細ログが見れないのでモヤモヤしてたのですが、ログを見る方法が分かりました!</div>
<div class="separator" style="clear: both; text-align: left;">
<span style="color: red; font-size: x-large;"><b>command+8 !!</b></span></div>
<div class="separator" style="clear: both; text-align: left;">
LogNavigatorというやつらしいです!</div>
<div class="separator" style="clear: both; text-align: left;">
これで具体的にエラー内容確認できます!</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
以上でぇぇぇぇす。</div>
koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-33410970415618470532017-05-01T12:10:00.001+09:002017-05-01T12:21:19.730+09:00Macでgem installしたら "Operation not permitted" エラーどうも、俺です。<br />
<br />
Mac(Sierra)でターミナルから
<br />
<pre class="brush:shell">$ sudo gem install XXXX</pre>
<br />
とコマンドを打つと
<br />
<pre class="brush:shell">Password:
ERROR: While executing gem ... (Errno::EPERM)
Operation not permitted - /usr/bin/XXXX</pre>
というエラーが出る場合の対処法。<br />
<br />
以下のようにすればOK。<br />
<pre class="brush:shell">$ sudo gem install -n /usr/local/bin XXXX</pre>
これは、インストールディレクトリを<br />
/usr/bin<br />
から<br />
/usr/local/bin<br />
へ変更してインストールを行います。<br />
<br />
<br />
MacのrootlessというSystem Integrity Protection(rootless)という機能があり、<br />
/System<br />
/bin<br />
/usr<br />
/sbin<br />
フォルダ以下にファイルを作成できないという仕様のためです。<br />
<br />
他にもrootlessを無効にする方法もありますが、セキュリティ的に望ましくはないので割愛します。<br />
<br />
<br />
以上でぇぇぇぇぇす。koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-72873089903150994192017-03-13T14:27:00.001+09:002017-03-14T10:18:33.749+09:00php: error while loading shared libraries: libpq.so.5: cannot open shared object fileが出るどうも俺です。<br />
<br />
構築したばかりのサーバーで<br />
<pre class="brush:shell">$ php -v</pre>
と打ってphpのバージョンを確認しようとしたら、<br />
<br />
<pre class="brush:shell">php: error while loading shared libraries: libpq.so.5: cannot open shared object file: No such file or directory
</pre>
というエラーが出ちゃいました。<br />
<br />
エラー内容のとおり、<br />
何かしらの共有ライブラリ(今回はlibpq.so.5)が読み込めないというエラーです。<br />
<br />
ちなみにrootになって同じコマンドを打つと<br />
<br />
<pre class="brush:shell"># php -v
PHP 5.6.24 (cli) (built: Mar 2 2017 15:32:45)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies</pre>
と問題なく実行されます。<br />
つまり、今回のエラーは何かしらのPermissionが関係してるだろうと予想つきました。<br />
<br />
こういう場合は共有ライブラリの依存関係を確認してみます。<br />
<br />
<pre class="brush:shell">$ ldd /usr/local/bin/php
linux-vdso.so.1 => (0x00007ffda23d7000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f2982411000)
libz.so.1 => /lib64/libz.so.1 (0x00007f29821fa000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f2981fe0000)
libpq.so.5 => not found
librt.so.1 => /lib64/librt.so.1 (0x00007f2981dd7000)
libcurl.so.4 => /lib64/libcurl.so.4 (0x00007f2981b6e000)
libm.so.6 => /lib64/libm.so.6 (0x00007f298186c000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f2981667000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f298144e000)
libxml2.so.2 => /lib64/libxml2.so.2 (0x00007f29810e4000)
</pre>
<br />
注目すべきは、libpq.so.5 => not found となっているところです。<br />
<br />
<br />
今度はrootになって確認してみます。<br />
<br />
<pre class="brush:shell"># ldd /usr/local/bin/php
linux-vdso.so.1 => (0x00007ffce4d60000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f0d05ff1000)
libz.so.1 => /lib64/libz.so.1 (0x00007f0d05dda000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f0d05bc0000)
libpq.so.5 => /usr/local/pgsql/lib/libpq.so.5 (0x00007f0d05997000)
librt.so.1 => /lib64/librt.so.1 (0x00007f0d0578e000)
libcurl.so.4 => /lib64/libcurl.so.4 (0x00007f0d05525000)
libm.so.6 => /lib64/libm.so.6 (0x00007f0d05223000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f0d0501e000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f0d04e05000)
</pre>
<br />
今度は libpq.so.5 => /usr/local/pgsql/lib/libpq.so.5 と表示されました。<br />
<br />
ということで/usr/local/pgsqlディレクトリを確認してみます。<br />
<br />
<br />
<pre class="brush:shell">$ ls -l /usr/local
drwxr-xr-x 7 root root 62 3月 2 15:44 bin
drwxr-xr-x. 2 root root 22 7月 29 2016 etc
drwxr-xr-x. 2 root root 6 8月 12 2015 games
drwxr-xr-x. 3 root root 16 7月 29 2016 include
drwxr-xr-x. 3 root root 30 12月 6 15:26 lib
drwxr-xr-x. 2 root root 6 8月 12 2015 lib64
drwxr-xr-x. 2 root root 6 8月 12 2015 libexec
drwx------ 6 postgres postgres 52 3月 2 14:41 pgsql
drwxr-xr-x 3 root root 16 3月 2 15:33 sbin
</pre>
予想通りpgsqlユーザーのみ読み書きできる状態になってしまっていました。<br />
<br />
適切に権限を追加して完了。<br />
<br />
<br />
<br />
<br />
以上でぇぇぇぇす。koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-80576008919832749622017-03-01T11:06:00.001+09:002017-03-01T11:06:07.907+09:00公開鍵認証を使い、sshで2段階ログイン(多段ログインもできちゃう)どうも、俺です。<br />
<br />
今日は、<br />
<pre class="brush:shell">~/.ssh/config</pre>
を使って、2段階先のサーバーへsshログインする方法をメモ。<br />
<br />
<クライアント> → <サーバーA(192.168.0.2)> → <サーバーB(192.168.0.3)><br />
のように接続する際に<br />
<br />
<pre class="brush:shell">$ ssh サーバーB</pre>
と打てばサーバーBへsshログインできます。<br />
<br />
<h3>
(1) .ssh/configを編集</h3>
<br />
<pre class="brush:shell">$ vim ~/.ssh/config
Host <サーバーA>
HostName 192.168.0.2
User ユーザー名
Port 22
IdentifyFile ~/.ssh/serverA_id_rsa
Host <サーバーB>
HostName 192.168.0.3
User ユーザー名
Port 22
ProxyCommand ssh -W %h:%p <サーバーA>
IdentifyFile ~/.ssh/serverB_id_rsa
</pre>
<br />
※クライアント側のPCにはサーバーAとサーバーBの認証鍵<br />
~/.ssh/serverA_id_rsa<br />
~/.ssh/serverB_id_rsa<br />
があることが前提です。<br />
<br />
<h3>
(2) ログインする</h3>
<pre class="brush:shell">$ ssh サーバーB</pre>
<br />
複数先のサーバーへログインする場合は、<br />
上記の.ssh/config内に踏み台にするサーバーをドンドン追記していけばOKです。<br />
<br />
<br />
以上でぇぇぇえぇぇす。koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-69927613911640556132017-02-20T19:36:00.000+09:002017-02-20T19:36:35.620+09:00LumenでPHPのerror_reporting(エラーレベル)を設定するどうも、俺です。<br />
<br />
Lumenはデフォルトで全てのエラーが出力されます。<br />
本番環境では出力されるエラー内容を設定したいのですが、その場合は、<br />
<br />
<pre class="brush:shell">$ vim /PATH/TO/vendor/laravel/lumen-framework/src/Concerns/RegistersExceptionHandlers.php
</pre>
を開き、<br />
<br />
<br />
<pre class="brush:php"> protected function registerErrorHandling()
{
error_reporting(-1);
set_error_handler(function ($level, $message, $file = '', $line = 0) {
if (error_reporting() & $level) {
throw new ErrorException($message, 0, $level, $file, $line);
}
});
set_exception_handler(function ($e) {
$this->handleUncaughtException($e);
});
register_shutdown_function(function () {
$this->handleShutdown();
});
}
</pre>
にある、error_reporting(-1)を変更します。<br />
<br />
本番の場合は「何も出力しない or 重大なエラーだけ出力」、で良いと思うので、<br />
<br />
<pre class="brush:php"> // 何も表示しない
error_reporting(0);
// 重大な実行時エラーを出力
error_reporting(E_ERROR);
</pre>
になります。<br />
<br />
<br />
以上でぇぇぇぇぇぇす!koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-49131954024326278942017-02-09T18:48:00.005+09:002017-02-09T18:50:20.267+09:00Lumenでcron処理どうも、俺です。<br />
<br />
Lumen(多分5.3.1)でcronプログラムを作って登録する方法について。<br />
おそらくLaravelはもうちょっと楽に出来そうですが、基本は同じはず。<br />
<br />
<br />
※<a href="https://laravel.com/docs/master/scheduling" target="_blank">Laravelの公式HP</a>参照<br />
<br />
<h3>
【手順1】app/Console/Commands/以下にphpファイルを作成</h3>
<br />
<pre class="brush:shell">$ vim app/Console/Commands/MyScript.php
</pre>
<br />
内容は以下のような感じ。<br />
<br />
<pre class="brush:php"><?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class MyScript extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'my_script_signature';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
// ここに処理を書く
echo "HELLO!\n";
}
}
</pre>
<br />
<br />
<h3>
【手順2】app/Console/Kernel.phpに登録</h3>
<br />
<pre class="brush:shell">$ vim app/console/Kernel.php
</pre>
<br />
内容は以下。<br />
<br />
<pre class="brush:php"><?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Laravel\Lumen\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
// ここに作成したコマンドクラスを追記していく。
\App\Console\Commands\MyScript::class,
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
// ここに実行させたいコマンドクラスのシグネチャを記す。
$schedule->command('my_script_signature')->cron('* * * * * *');
}
}
</pre>
<h3>
【手順3】動作を試してみる</h3>
<br />
<pre class="brush:shell">$ php artisan my_script_signature
HELLO!
</pre>
<br />
問題なし!<br />
<h3>
【手順4】cronに登録する</h3>
<br />
<pre class="brush:shell">* * * * * php /path/to/artisan schedule:run 1>> /path/to/cron.log 2>&1
</pre>
<br />
これで定期的に処理をさせることが出来ます。<br />
<br />
<br />
<br />
以上でぇぇぇぇす!koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-34641019557619900452017-02-08T17:34:00.000+09:002017-02-08T17:35:09.714+09:00pgpool-2のオンラインリカバリを試すどうも、俺です。<br />
<br />
pgpool-2でオンラインリカバリを試したのでその方法をメモ。<br />
若干ややこしかった...。<br />
<br />
<b>【環境】</b><br />
・postgresql v9.5.3<br />
・pgpool-2 v3.5.4<br />
・ノード1のあるサーバー 192.168.0.1<br />
・ノード2のあるサーバー 192.168.0.2<br />
・pgpool-2のあるサーバー 192.168.0.1<br />
※PostgreSQLとpgpool-2はすでに稼働中とします。<br />
※pgpool-2の<a href="http://www.pgpool.net/docs/pgpool-II-3.5.4/doc/pgpool-ja.html#online-recovery" target="_blank">公式HP</a>参照<br />
<br />
<br />
<h3>
手順1) C言語関数インストール</h3>
各ノードのPostgreSQLデータベースに関数をインストールします。<br />
すべてのノードのあるサーバーで以下を行います。<br />
<br />
<pre class="brush:shell"># su - postgres
% cd /path/to/pgpool-II-3.5.4/src/sql/pgpool-recovery
% make install
% psql -p ポート番号 -f pgpool-recovery.sql template1
</pre>
<br />
<br />
<h3>
手順2) pgpool.confの設定</h3>
オンラインリカバリを行うための設定を追加します。<br />
<br />
<pre class="brush:shell"># vim /path/to/pgpool/etc/pgpool.conf
--- 以下pgpool.conf内容 ---
# PCPの設定
pcp_listen_addresses = '*'
pcp_port = 9898
pcp_socket_dir = '/tmp'
# リカバリを行うPostgreSQLのユーザとパスワード。
recovery_user = 'postgres'
recovery_password = 'postgres'
# オンラインリカバリを実行するスクリプト名。
recovery_1st_stage_command = 'recovery_1st_stage.sh'
recovery_2nd_stage_command = 'recovery_2nd_stage.sh'
# オンラインリカバリのタイムアウト秒数。
recovery_timeout = 120
# リカバリ中にアイドル状態のクライアントを何秒で切断するか。0は無効。-1は即時切断。
client_idle_limit_in_recovery = 1
</pre>
<br />
<br />
<h3>
手順3) postgresql.confの設定</h3>
archive_logを取るように設定します。<br />
既に設定済みであれば不要です。<br />
<br />
<pre class="brush:shell"># vim /path/to/pgsql/data/postgresql.conf
--- 以下postgresql.confの内容 ---
archive_mode = on
# /usr/local/pgsql/data/archive というディレクトリ以下にarchive_logがコピーされる
archive_command = 'cp %p /usr/local/pgsql/data/archive/%f'
</pre>
<br />
<br />
<h3>
手順4) リカバリスクリプトの作成</h3>
・recovery_1st_stage.sh<br />
・recovery_2st_stage.sh<br />
・pgpool_remove_start<br />
の3ファイルを作成します。<br />
<br />
<a href="http://www.interdb.jp/techinfo/postgresql/pgpool-02.html" target="_blank">pgpoolレプリケーションモード | PostgreSQL関連情報</a>のスクリプトを使わせて頂きました。ありがとうございます。<br />
<h4>
recovery_1st_stage.sh</h4>
<pre class="brush:shell">#!/bin/sh
PSQL="/usr/local/pgsql/bin/psql"
PORT=5432
MASTER_BASEDIR=$1
RECOVERY_HOST=$2
RECOVERY_BASEDIR=$3
$PSQL -p $PORT -c "SELECT pg_start_backup('pgpool-recovery')" postgres
echo "restore_command = 'cp /usr/local/pgsql/data/archive/%f %p'" > $MASTER_BASEDIR/recovery.conf
ssh -l postgres -T $RECOVERY_HOST rm -rf $RECOVERY_BASEDIR.bk
ssh -l postgres -T $RECOVERY_HOST mv -f $RECOVERY_BASEDIR{,.bk}
rsync -az -e ssh -l postgres $MASTER_BASEDIR/ $RECOVERY_HOST:$RECOVERY_BASEDIR/
ssh -l postgres -T $RECOVERY_HOST cp -f $RECOVERY_BASEDIR.bk/postgresql.conf $RECOVERY_BASEDIR
ssh -l postgres -T $RECOVERY_HOST rm -f $RECOVERY_BASEDIR/postmaster.pid
rm -f $MASTER_BASEDIR/recovery.conf
$PSQL -p $PORT -c "SELECT pg_stop_backup()" postgres</pre>
<br />
<h4>
recovery_2nd_stage.sh</h4>
<pre class="brush:shell">#!/bin/sh
PSQL="/usr/local/pgsql/bin/psql"
PORT=5432
ARCHIVEDIR=/usr/local/pgsql/data/archive/
MASTER_BASEDIR=$1
RECOVERY_HOST=$2
RECOVERY_BASEDIR=$3
$PSQL -p $PORT -c 'SELECT pg_switch_xlog()' postgres
rsync -az -e ssh -l postgres $ARCHIVEDIR $RECOVERY_HOST:$ARCHIVEDIR
</pre>
<br />
<h4>
pgpool_remove_start</h4>
<pre class="brush:shell">#! /bin/sh
PGCTL=/usr/local/pgsql/bin/pg_ctl
RECOVERY_HOST=$1
RECOVERY_BASEDIR=$2
ssh -l postgres -T $RECOVERY_HOST $PGCTL -w -D $RECOVERY_BASEDIR start 2>/dev/null 1> /dev/null < /dev/null &
</pre>
<br />
これら3ファイルに実行権限を付けて、各ノードサーバーのデータディレクトリ以下に配置します。<br />
<br />
以上で、オンラインリカバリの準備は完了です。<br />
<br />
<br />
では実際にオンラインリカバリを試してみます。<br />
オンラインリカバリを行うには、いずれかのノードサーバーがpgpool側で異常検知されている必要があります。<br />
今回は192.168.0.2のPostgreSQLを止めてからオンラインリカバリをしてみます。<br />
<br />
<br />
<pre class="brush:shell">% /usr/local/pgsql/bin/pg_ctl -D /path/to/pgsql/data stop
% /usr/local/pgsql/bin/psql -p 9999 // ←pgpoolへ接続
postgres=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role | select_cnt
---------+--------------+------+--------+-----------+--------+------------
0 | 192.168.0.1 | 5432 | 2 | 0.500000 | master | 1200
1 | 192.168.0.2 | 5432 | 3 | 0.500000 | slave | 884
(2 rows)
</pre>
<br />
192.168.0.2が停止しています。<br />
<br />
この状態で、pcp_recovery_nodeコマンドでオンラインリカバリを行います。<br />
<br />
<pre class="brush:shell">% /path/to/pgpool/bin/pcp_recovery_node -h 192.168.0.1 -p 9898 -U postgres -n 1
</pre>
<br />
-h ... PCP(pgpool Communication Manager Connection)の稼働ホスト?<br />
-p ... PCPの稼働ポート<br />
-U ... pgpoo.confに記したrecovery_user名<br />
-n ... 何番のノードを起動させるか。今回はnode_id=1の192.168.0.2<br />
<br />
以上で、問題なければオンラインリカバリが成功するはずです。<br />
ただ、オンラインリカバリを行うのは意外と時間かかる場合があるので気長に待つ必要も大切です。<br />
<br />
<br />
<h3>
【実際に試してみた】</h3>
サービス稼働中を模して、<br />
無限ループでINSERTさせながらオンラインリカバリをやってみました。<br />
...が、ターミナル上はSuccess!と出たのですが、<br />
実際にデータを確認してみると2件レコードのズレがありました...。<br />
やはり、データ誤差が出た場合は一旦サービス止めてdata/ディレクトリ丸ごとコピーの方が安全なのでしょうか。。?<br />
<br />
<br />
以上でぇぇぇぇす!<br />
<br />koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com1tag:blogger.com,1999:blog-2069020994556954437.post-46441558360006306182017-02-07T18:36:00.004+09:002017-02-07T18:36:39.312+09:00tmuxですべてのペインに同じコマンドを同時入力!どうも、俺です。<br />
<br />
タイトルの通り、tmuxで複数のペイン分割した状態で<br />
全てのペインに同じコマンドを送ってやりたいとき。<br />
<br />
<br />
<br />
<pre class="brush:shell">: set-window-option synchronize-panes on</pre>
これです!<br />
<br />
<br />
ちなみにやめたい時は<br />
<br />
<pre class="brush:shell">: set-window-option synchronize-panes off</pre>
です。<br />
<br />
複数のペイン上で複数の作業を同時進行したい時、<br />
とかに使えます。<br />
<br />
以上でぇぇぇぇす!koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-80147795725408035672017-01-31T19:51:00.003+09:002017-01-31T19:51:46.344+09:00Lumen(Laravel)でview()に渡した値を参照するどうも、俺です。<br />
<br />
変数の値を<br />
<pre class="brush:php">view()->share("myName", $myName);</pre>
のように渡したあとで、<br />
「あ、やっぱまたview()から取って使いたい〜〜!」となった場合。<br />
<br />
<pre class="brush:php">view()->shared("myName");</pre>
で取得できるさかいに。<br />
<br />
以上でぇぇぇぇす!koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-66218835151805624312017-01-27T17:46:00.004+09:002017-01-27T17:47:30.444+09:00LumenのEloquentでupdate()を呼ぶとMassAssignmentExceptionが出てまうどうも、俺です。<br />
<br />
最近は軽量PHPフレームワークの<a href="https://lumen.laravel.com/docs/5.3" target="_blank">Lumen</a>を使っています。<br />
(※バージョンはたぶん5.2。確認の仕方が分からない...)<br />
<br />
最近もっぱらPHP界隈を賑わしている<a href="http://laravel.jp/" target="_blank">Laravel</a>から派生したフレームワークで、<br />
機能が少ない分、軽量で処理速度も速いそうです。<br />
<br />
LaravelもLumenもデータベースモデルはEloquentという機能を使って開発することができ、僕もそれを使っています。<br />
<br />
で、データを更新するために<br />
<pre class="brush:php">$userObject->update(["name"=>"山田さん", "age"=>30]);</pre>
のように実装すると、<br />
<br />
<pre class="brush:text"> MassAssignmentException</pre>
が発生し小一時間ハマりました。<br />
<br />
この場合は、その該当のモデルクラスに<br />
<br />
<pre class="brush:php">// 変更可能なカラム名
protected $fillable = ["name", "age", "その他カラム名"];
// または変更不可能なカラム名
protected $guarded = ["id", "create_at"];</pre>
<br />
のどちらか(または両方)を記述すればOKです。<br />
<br />
ただ、上記の変数を指定しなくてもupdate()メソッドが使える場合もあり、<br />
その理由は未だ不明です...。<br />
<div>
<br /></div>
<div>
<br /></div>
<br />
ちなみに、insert()またはsave()メソッドでは上記の例外の発生は未確認です。<br />
<br />
<br />
<br />
<br />
以上でぇぇぇぇす!koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-21696802727714326292017-01-23T19:32:00.002+09:002017-01-23T19:32:29.296+09:00vimでファイルを開いている最中にdiffを見るどうも、俺です。<br />
<br />
2つのファイルにある差分をチェックする場合、
<br />
<pre class="brush:shell">$ diff aaa.txt bbb.txt</pre>
またはvimをつかって<br />
<br />
<pre class="brush:shell">$ vimdiff aaa.txt bbb.txt</pre>
とやることが多いです。<br />
<br />
今回は、vimでファイルを開いてしまった状態からdiff(vimdiff)を見る方法について。<br />
とあるファイルをvimで開いてから、<br />
<pre class="brush:shell">:vsp ファイル名</pre>
<br />
または
<br />
<pre class="brush:shell">:sp ファイル名</pre>
<br />
で、分割表示している状態で、
<br />
<pre class="brush:shell">:windo diffthis</pre>
と打てばdiffを確認できます!<br />
<br />
ちなみに、<br />
<pre class="brush:shell">:windo</pre>
は、vimで分割しているすべての画面に同じコマンドを打つ時に使えます。<br />
<br />
<br />
以上でぇぇぇぇす!koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-19136560326685856922016-12-13T12:34:00.000+09:002016-12-13T12:34:42.600+09:00.gitignoreが反映されない場合どうも、俺です。<br />
<br />
.gitignoreに除外ファイル/ディレクトリを追記しても反映されない場合の対応方法についてめもめも。<br />
<br />
1) キャッシュが効いてしまっているので削除します。<br />
<pre class="brush:shell">$ git rm --cached /path/to/directory (or file)
</pre>
<br />
2) コミットします。<br />
<br />
<pre class="brush:shell">$ git add .gitignore
$ git add /path/to/directory (or file)
$ git commit -m "COMMIT MESSAGE"
</pre>
<br />
以上でぇぇぇぇぇぇす。<br />
<br />
※参照 <a href="http://qiita.com/white_aspara25/items/64eafa107b61c6568f01" target="_blank">.gitignore に設定を追加して反映させる: Qiita</a><br />
<div>
<br /></div>
koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-33711449379950179442016-11-24T14:31:00.002+09:002016-11-24T14:31:30.452+09:00htmlにカスタム属性(data-*)を使って、jQueryで簡単アクセスするどうも、俺です。<br />
<br />
HTMLに独自のカスタム属性をつけて、<br />
jQueryで操作できれば便利ということを発見しました。<br />
<br />
カスタム属性を使えば、<br />
<pre class="brush:html"><img data-hoge="ほげ" src="xxx.png" />
</pre>
<br />
のように、「data-」のあとに好きな文字列を指定して値をセットできます。<br />
data属性には一応仕様が定められており、<br />
1文字以上のアルファベット、数字、ハイフン、アンダースコアが使えるようです。<br />
<br />
で、本題はここから。<br />
設定した「data-hoge」にjQueryを使ってアクセスするには、
<br />
<pre class="brush:javascript">$("img").data("hoge");</pre>
<br />
超簡単!!<br />
<br />
data属性にJSONをセットもできるので、
<br />
<pre class="brush:html"><div data-hoge='{"aaaa":"あいうえお", "bbbb":1000}'>
</pre>
のように指定しておけば、<br />
<br />
<pre class="brush:javascript">$("div").data("hoge").aaa;
</pre>
<br />
でアクセス可能!<br />
<br />
ちなみに、data属性は複数も指定できます。<br />
<br />
<pre class="brush:html"><span data-hoge="ほげ" data-fuga="ふが">
</pre>
<br />
以上でぇぇぇす。koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-87290697332601039962016-11-18T17:49:00.002+09:002016-11-18T17:50:39.156+09:00Laravel(またはLumen)のクエリビルダーのWHERE条件で、()カッコ付きのSQLを作るどうも、俺です。<br />
<br />
忘れぬうちにメモ。<br />
<br />
例えば、
<br />
<pre class="brush:sql">SELECT * FROM user WHERE status=1 AND (type=1 OR type=2);
</pre>
のようなクエリを作りたい場合。<br />
<br />
<br />
<pre class="brush:php">$query = $userModel->where('status', 1)->where(function($query) use()
{
$query->where('type', 1)->orWhere('type', 2);
});
</pre>
になります。<br />
<br />
ちなみに、
<br />
<pre class="brush:sql">SELECT * FROM user WHERE status=1 AND (type=1 AND type=2);
</pre>
の場合は<br />
<pre class="brush:php">$query = $userModel->where('status', 1)->where(function($query) use()
{
$query->where('type', 1)->where('type', 2);
});
</pre>
になります。<br />
<br />
ちょっと読みづらいっす...。<br />
<br />
<br />
以上でぇぇぇす。koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0tag:blogger.com,1999:blog-2069020994556954437.post-52059315164193068752016-11-02T19:21:00.000+09:002016-11-02T19:22:00.000+09:00Windows起動すると画面真っ黒でキャレット(アンダースコア)が点滅して先に進まねぇ!って時にやったことどうも、俺です。<br />
<br />
今日は、Windows8.1を起動しようとしたら<br />
画面が真っ黒になって、画面左上にキャレット(アンダースコアの形をしたカーソル)が点滅したまま<br />
何もできなくなってしまった時にやる対応方法についてメモです。<br />
<br />
色々なサイトで調べまくった結果、<br />
どうやら原因はブートセクタが破損してしまったことが原因の可能性が高いようです。<br />
<br />
<br />
では、直しましょう。<br />
<br />
<h2>
<span style="font-size: large;">方法1: Windowsインストールディスクで直す</span></h2>
最も手早い方法だと思いますが、<br />
今時インストールディスクを手元に持ってる人って少ないのではないでしょうか。<br />
一応方法は、<br />
<a href="http://freesoft.tvbok.com/tips/pc/windows-cmd.html" target="_blank">コマンドプロンプトからWindowsを復旧する4つの方法 (Vista/7/8/8.1/10)</a><br />
<div>
など参考にしてみて下さい。</div>
<div>
<br /></div>
<h3>
<span style="font-size: large;">方法2: Windows PEを使って直す</span></h3>
<div>
今回書きたい内容です。</div>
<div>
Microsoftが用意してくれているWindows PEを使って直します。</div>
<h4>
1) 元気なWinPCでWindows ADKをインストール</h4>
<div>
<a href="https://www.microsoft.com/en-us/download/details.aspx?id=30652">https://www.microsoft.com/en-us/download/details.aspx?id=30652</a></div>
<div>
から、Windows用アセスメント&デプロイメントキットをDLします。</div>
<div>
DLしたadksetup.extを実行し、</div>
<div>
・Deployment Tools</div>
<div>
・Windows Preinstallation Environment (Windows PE)</div>
<div>
の2つを選択しインストールします。</div>
<div>
<br /></div>
<div>
<h4>
2) ブート用のUSBメモリを作成</h4>
</div>
<div>
スタートメニュー>Windows Kits>展開およびイメージングツール環境を右クリックして「管理者として実行」を選択。</div>
<div>
コマンドプロンプトが起動するので、以下のようにコマンドを打ちまくる。</div>
<br />
<pre class="brush:shell">C:¥>copype x86 C:¥winpe_x86
... 略 ...
Success
</pre>
<br />
ここで、<br />
fwfiles<br />
media<br />
mount<br />
という3つのフォルダが生成されるはずです。<br />
<br />
次に、USBメモリに書き込みます。<br />
<br />
<pre class="brush:shell">C:¥> cd winpe_x86
# 最後の「f:」はUSBがFドライブに刺しこまれている場合です。
# 環境に合わせて書き変えて下さい。
C:¥winpe_x86>makewinpemedia /ufd c:¥winpe_x86 f:
Proceed with Format [Y,N]? Y // ←USBデータはフォーマットされてしまうけど、Yで。
... 略 ...
Success
</pre>
<br />
USBにWindows PEデータが書き込まれました。<br />
<br />
<h4>
3) Windows PEで修復</h4>
では、壊れたWindowsマシンにUSBを挿し込み起動させます。<br />
この時、BIOS画面でブートの優先順をUSBを最優先に変更して起動させないと、いつもの壊れた真っ黒画面になってしまいますので注意です。<br />
<br />
WindowsPEが起動したら、そのコマンドプロンプト上で、<br />
<pre class="brush:shell">X:¥windows¥system32> bootsect /nt60 sys mbr
</pre>
<br />
と打ちます。<br />
が、多くの人はここで<br />
The system partition was not found<br />
というエラーに遭遇すると思います。<br />
その場合は、<br />
<pre class="brush:shell">X:¥windows¥system32> bootsect /nt60 C: /mbr
</pre>
<br />
で問題ないはずです。<br />
途中の「C:」は壊れた対象のHDDドライブ名です。<br />
環境に応じて書き変えて下さい。<br />
<br />
<br />
これだけで壊れたHDDのブートセクタは直っているはず!<br />
<br />
<h4>
4) それでも直っていない場合</h4>
3)が終わったあと、Windowsを起動しようとしてもまた真っ黒にキャレット点滅の場合..。<br />
大丈夫です、3)をもう一度試して起動してみましょう。<br />
それでもダメな場合、今度はPC再起動してみましょう。<br />
きっと動くはずです..。<br />
僕は2回ほど再起動し直すと、無事起動できました。<br />
<br />
それでもダメな場合、、<br />
別の原因を探って対応するか、PCを買い換えましょう。<br />
<br />
<br />
以上でぇぇぇぇぇす!<br />
<br />
※参考サイト: <a href="http://www.atmarkit.co.jp/ait/articles/1402/13/news133.html" target="_blank">管理者必携のトラブルシューティングツール「Windows PE 5.0」の起動用USBメモリを作成する - @IT</a><br />
<br />koexukahttp://www.blogger.com/profile/05360062972472036149noreply@blogger.com0