2018年12月27日木曜日

サーバ移転に伴うLet’s Encryptの引越

サーバをIDCFクラウドからGCPに移転しているのですが、サーバ証明書も引越させないといけません。サーバ証明書としてLet’s Encryptを利用しているのですが、再発行させてかっこよく移行しようとしたのですが、うまくいかないのでこちら↓のサイトを参考に、一旦今ある発行済の証明書をそのまま持ってくることにしました。
サーバー移転(引越し)でLet’s Encrypt 「SSL/TLSサーバ証明書」はどうする?

上記サイト内ではzipで固めて持ってきていますが、tarの方がそのままでシンボリックリンクも持ってこれるのでおすすめです。(zipもオプションを付ければ良いだけですが...)

具体的には以下の手順ですね。

引越元サーバで圧縮
cd /etc
tar zcvf letsencrypt.tar.gz letsencrypt

引越先サーバで解凍
cd /etc
tar xvf letsencrypt.tar.gz

2018年12月26日水曜日

Suama Online ServiceはIDCFクラウドからGCPへ移行!

IDCFクラウド個人向けサービス終了に伴い移行先をどこにするか検討していましたが、色々と検討した結果Google Cloud Platform (GCP) に移行することにしました。

移行先としてGCPを選択した理由は以下のとおりです。。

  • f1-microインスタンスであればサーバ1台を期限なしで無償利用できる(米国リージョンのみ)
  • GCPの中で今利用しているSendGridを利用することができる
  • GCP自体、以前お試しで利用したことがあるので使用感が分かっている。
上記理由のうち、1つ目についてはサーバ自体は無償枠で利用できますが、通信量の課金が発生するという可能性があり、少し悩みました。ただ、Suama Online Serviceは今の所テキストサイトなので、下りの通信はそれほど発生しないだろう、ということで今回はGCPに決定です!

以前環境を作ってはいたものの、今回は一から再構築を行いました。
概ねこちらで紹介されている手順ですね。

ただ、自分の作り方が悪かったのか、ファイアウォールが初期でほぼ当たっていない(つまり、丸裸で公開されている)状態になってしまいました。仕方がないのでファイアウォールは個別にルールを色々と設定しています。

後はやはり通信量で課金が大きくなることが怖いので、予算アラートも設定しています。
こちらで紹介されている手順ですね。

今回は折角GCPに移行したので、ランニングコストを限界まで下げることにも挑戦したいと思います。

2018年12月16日日曜日

IDCFクラウド個人向けサービス終了

12月12日、メールでIDCフロンティアより個人向けIDCFクラウドの終了に関するお知らせが来ていました。
 この度弊社は、2019年3月31日(以下「廃止日」)をもって個人向けIDCFクラウドサービスの提供を終了させていただくことになりました。現在個人名義で対象サービスをご利用いただいているお客様は、廃止日以降ご利用いただく事ができなくなります。
 今後、IDCFクラウドサービスは、法人及び個人事業主のお客様を対象とする「ビジネス会員」としてご利用いただけます。お客様がIDCFクラウドサービスのご利用を希望される場合は、下記の「ビジネス会員」の資格および同意手順をご確認ください。
 今後もお客様への一層のサービス向上に取り組んで参りますので、何卒ご理解のほどお願い申し上げます。
ビジネス会員になれば引き続き利用できるよ、ということですね。自分はビジネス会員になる資格がなさそうなので、出ていかなければなりません。。。
【対象サービス】
個人向けIDCFクラウドサービス(付帯関連する全サービスを含む) 
【廃止日】
2019年3月31日 
【約款の変更】
上記、個人向け対象サービスの終了に伴い、対象サービスに係る「クラウドサービスに関する契約約款」を変更しております。下記URLよりご確認ください。
https://www.idcf.jp/pdf/common/cloudservices.pdf 
【ビジネス会員の資格】
法人(国、地方公共団体、日本国法又は外国法の法定に基づいて設立された会社その他の社団・財団・組合をいう)及び個人事業主(個人事業主、自営業者、個人事業者等、個人で事業を営んでいる人であって、かつ税務署へ開業届を提出している者をいう)。
今回の個人向けサービス終了は利用者には個別でメールが来ていますが、特にプレスなどは出ておらず、約款の変更だけみたいですね。

IDCFクラウドはかなり以前から利用していて、Suama Online Serviceの基盤にも利用させて頂いています。ワンコインでサーバが立てられる、しかもスペックもそれなりに良いし安定しているということで重宝していましたが、この見せ玉のワンコインサーバばかり利用する個人ユーザは採算が合わないと判断したのでしょう。残念ではありますが、仕方ないですね。

1点不満に思うのはサービス終了の連絡がサービス終了の3ヶ月少し前に来たということで、移行作業などに取れる時間が3ヶ月しかない点です。まあ個人向けだから影響が少ないという判断なのでしょうが、やはり1年前、せめて半年前には通知、もしくは先に新規契約終了などを行い、サービス終了を匂わせておいて欲しかったです。

何にせよ、自分は移行先を考えねばなりません。やはりサービス継続性を考えるとメジャークラウドに行かざる得ないのか、と思いますが、本当に選択肢がそれだけになっていきそうで少し悲しい気もします。

2018年12月2日日曜日

作成したWebAPIの仕様を公開しました

これまで作成したWebAPIの仕様を整理し、公開しました。
Suama Online Service WebAPI

これまで作成したWebAPIは以下の3つです。

  1. 接続元グローバルIPアドレスを返すAPI(グローバルIP単体)
  2. 接続元グローバルIPアドレスを返すAPI(json形式)
  3. グローバルIPアドレスの国を確認して返すAPI
アクセスすると、接続元IP(グローバルIP)を返します。それだけ。

アクセスすると、接続元IP(グローバルIP)を返します。ただし、こちらはjson形式で返します。IPアドレスのほか、ホスト名も逆引きして返してくれます。

グローバルIPアドレスをGETで渡すと、そのIPが割り振られている国情報をjson形式で返してくれます。

WebAPIについてはこれからも、ラインナップを増やしていきたいと思います!

2018年11月24日土曜日

グローバルIPアドレスの国を確認して返すWebAPI

先日、グローバルIPの国を確認するサイトを作成しました。
グローバルIPアドレスの国を確認するサイトを作りました!

今回はこれを少しカスタマイズして、WebAPI版を作成してみました。

アクセスポイントは以下のアドレスになります。
https://api.suama.onl/v1/ip-country.php

で、ipaddrをGETで渡す必要があります。

例えば、正しいグローバルIPを入れた場合は以下のようになります。

【実行例】
curl https://api.suama.onl/v1/ip-country.php?ipaddr=1.1.1.1 |jq

【実行結果】
{
  "message": "OK:The search target IP address is a global IP address, registration information existed!",
  "code": "200",
  "result": {
    "ip": "1.1.1.1",
    "hostname": "one.one.one.one",
    "countrycode": "AU",
    "countryname_ja": "オーストラリア",
    "countryname_en": "Australia",
    "RIR": "apnic",
    "status": "assigned",
    "date": "2011/08/11"
  }
}

正常に国を取得できないIPアドレスを指定した場合、以下のような結果になります。

【実行例】
curl https://api.suama.onl/v1/ip-country.php?ipaddr=192.168.1.1 |jq

【実行結果】
{
  "message": "NG:Search target IP address is private IP address!",
  "code": "400",
  "result": {
    "ip": "192.168.1.1"
  }
}

入力がなかったり、IPアドレス以外の入力の場合、以下のようになります。

【実行例】
curl https://api.suama.onl/v1/ip-country.php

【実行結果】
{
  "message": "NG:No input!",
  "code": "400"
}

そろそろAPIについて纏めたページを作らないとダメですね。。。

2018年11月13日火曜日

自分のグローバルIPアドレス(接続元IP)を返すWebAPI

最近APIで色々処理できるものが増えてきたのですが、プログラムの実行環境も色々なパターンがあるので、自分のグローバルIPを確認できるAPIがあると便利ではないか、と思いました。でもまあ、こういうちょっと便利なものって、大抵誰かが作っているんですよね。調べてみると、やはりありました。

こちらの記事に纏まっています。
グローバルIPをcurlで確認

以下、抜粋です。
グローバルIPをcurlで確認 
・httpbin.org/ip
$ curl httpbin.org/ip
{
  "origin": "121.102.14.91"
・inet-ip.info
$ curl inet-ip.info
121.102.14.91 
・ifconfig.me
$ curl ifconfig.me
121.102.14.91
でも折角なので、2つほど作ってみました。

IPアドレスを単純に返すだけのもの
$ curl https://api.suama.onl/v1/ip.php
1.1.1.1

json形式でIPアドレスとホスト名を返すもの
$ curl https://api.suama.onl/v1/ip-hostname.php |jq
{
  "ip": "1.1.1.1",
  "hostname": " one.one.one.one"
}

ご自由にご利用ください!

2018年10月30日火曜日

IPアドレス国確認のエンハンス

先日公開したIPアドレス国確認ですが、早速機能追加を行いました。
追加機能は以下のとおりです。
・検索結果に指定したIPアドレスのホスト名を表示

まあ大した機能ではないですが、別で確認するのも面倒なので纏めて表示したほうが便利かなと思って追加しました。

2018年10月26日金曜日

グローバルIPアドレスの国を確認するサイトを作りました!

グローバルIPアドレスからそのIPが割り当てられている国を確認するツールを作成しました!
仕様などはページ内で解説していますので、そちらをご確認下さい。

作成したサイトは以下のとおりです。
IPアドレス国確認

テストし切れていない部分もあるので、もし動作がおかしい等々あれば、お問合せからご連絡頂けると助かります。

2018年10月25日木曜日

特殊な用途のIPアドレス

IPv4は0.0.0.0~255.255.255.255の範囲までで表現されますが、この中で利用用途が特定されているIPアドレスが幾つかあります。

有名なものはプライベートIPアドレス、または先日紹介したシェアードIPアドレスなんてものもありますが、それ以外にも幾つか指定されています。
例えば169.254.0.0/16はリンクローカルアドレスと呼ばれていて、分かりやすいのはNICの設定がDHCPになっているのに、DHCPサーバからIPアドレスが取れないときに割り当てあられるアドレスですね。APIPA(Automatic Private IP Addressing)と呼ばれるやつです。

これら以外にも色々あって、RFC3330で定められています。また、最近のIPv4不足もあり、定められていた(もしくは予約されていた)ものの、グローバルIPに割り当てられる事になったIPアドレスもあります。

参考になりそうなサイト
特別なIPアドレスって知っていますか?

2018年10月24日水曜日

PHPで文字列を比較するときに==を利用するとうまくいかない

if文で文字列比較をしたのですが、ハマりました。
PHPだと==は予期せぬ動作をしそうなので、strcmp関数を利用したほうが良いようです。

一致で比較する場合は、以下のような使い方になります。
strcmp(比較する値1,比較する値2)==0

こちらのサイトを参考にさせて頂きました。
PHPで文字列を比較する方法と、型によりハマるポイント

2018年10月23日火曜日

yyyymmddをyyyy/mm/ddにする

日付としてデータをもたせて、出力フォーマットを指定して、とか考えましたが、面倒なので今回は文字列操作で対応しました。

こんな感じです。
substr_replace(substr_replace('20181010','/',6,0),'/',4,0)
//結果
2018/10/10

こちらのサイトを参考にさせて頂きました。
PHPで文字列の指定した位置に文字列を挿入する方法

2018年10月22日月曜日

数字をカンマ区切りにする

PHPには数字をカンマ区切りにするという関数が存在するようです。

こんな感じで利用できるそうです。

<?php
$num = 100000000;
$num = number_format($num);
print $num . "円";
?>

こちらのサイトを参考にさせて頂きました。

2018年10月21日日曜日

Postfix+Sendgridの組合せでメール配信環境を構築する

先日Gmailを利用してメールを配信できる環境を構築しました。
Postfix+Gmailの組合せでメール配信環境を構築する

この度、申請していたSendGrid利用の申請が承認されたので、SendGridを利用するように設定を変更してみます。

設定の仕方ですが、以下のサイトにまとまっています。
Postfix SendGrid

設定内容はGmailを利用する場合とほとんど同じですね。
で、早速メールを飛ばしてみました。

が、届かない!
確認したところ、メールを飛ばす処理でFromにGmailのアカウントを入れていたのが良くないようです。SendGridの申請時に指定したドメインのメールアドレスでないと届かないのですね。スパム利用対策として、正しい動作だと思います。

設定を変更して再度送付したところ、届きました!
ただ、本文の改行がなくなっています。
調べると以下の記載がありました。

よくある質問 ? メール改行トラブル編
考えられる原因
テキストメールのHTML変換機能(以下、HTML変換機能)が有効になっていることが原因として考えられます。この機能は、元のテキストメール(Content-typeがtext/plain)の本文をHTML変換してマルチパートメール(Content-typeがmultipart/alternative)の1パートとして追加します。その際、改行コードはHTMLの改行タグに変換されません。このため、メールクライアントでtext/htmlパートを確認すると、変換されたメールの改行が削除されているように見えます。
早速、対策で書いてあるHTML変換機能の無効化を実施しました。
それでも直らない!

SMTPでメールを送信する際に気をつけることはありますか?

というページでも改行のことに触れていますが、原因が不明。Gmailのときは普通に改行していたのに。。。

まあ、当面人にメールを送る運用は考えていないので、対応は保留にします。
原因が分かったら追記したいと思います。

2018年10月20日土曜日

グローバルIPアドレスを誰が管理しているのか?

グローバルIPアドレスはインターネットの世界で正常に通信を行うため、一意(重複するものがない状態)である必要があります。そのため、グローバルIPアドレスはしっかりと管理されており、その管理組織は階層構造となっています。

まず、頂点にいるのが、以下の組織です。
ICANN(Internet Corporation for Assigned Names and Numbers、アイキャン)

ICANNはIPアドレスの管理のほか、ドメインの管理、ルートネームサーバの運用などインターネットが正常に機能するための基本機能の運用を行っています。

その次に、各地域ごとに管理組織があります。
APNIC(アジア・オセアニア)
ARIN(北米)
RIPE NCC(欧州・中東)
LACNIC(中南米)
AFRINIC(アフリカ)

更にその次の階層として、国ごとの管理組織があります。
日本だとJPNICですね。

つまり、日本で利用されているグローバルIPアドレスは、以下の流れで払い出されているわけです。
ICANN→APNIC→JPNIC

更にJPNICからキャリアなどのIPアドレス管理指定事業者にアドレスが割り当てられ、そこから利用者に分配されます。
つまり、こうなります。
ICANN→APNIC→JPNIC→Pアドレス管理指定事業者→利用者

なお、各管理組織に割り当てられているIPアドレス情報は公開されており、FTPでリストをダンロードすることも可能です。
ftp://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest
ftp://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-latest
ftp://ftp.apnic.net/pub/stats/apnic/delegated-apnic-latest
ftp://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-latest
ftp://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-latest

このリストですが、アドレス帯がCIDRではなく、開始IPアドレスとそこから幾つ割り当てているか、という書きっぷりなんですよね。ちょっと見にくいです。
フォーマットは以下のサイトに解説があります。
RIR statistics exchange format

こういった管理組織ですが、国連や政府機関がやっているの?と思いきや、ICANNを含めて民間団体なんですよね。公的な動きをする団体ではあるものの、改めてインターネットは民間のものであると感じますね。

2018年10月19日金曜日

シェアードIPアドレスとは

前回の記事では、プライベートIPアドレスについて簡単に解説しました。IPアドレスの世界にはプライベートIPアドレス以外にも用途が決まっているアドレス帯があります。それが、 シェアードIPアドレス( シェアードアドレス)です。

IPv4のアドレスが不足していく中で、家庭や企業内でプライベートIPアドレスを利用するのと同様に、ISP(回線事業者)ごとに分けたネットワークを構築するというアイディアが生まれました。そうすれば、家庭や企業で最低1つ必要になるグローバルIPアドレスを減らすことができますからね。

ただ、このISP内のIPアドレスはプライベートIPアドレスというわけには行きません。プライベートIPアドレスだと、家庭、企業内のIPアドレスと重複してしまう可能性があるからです。そのため、新たに払い出されたIPアドレス帯がこのシェアードIPアドレスです。
具体的には以下のアドレスになります。
100.64.0.0/10

もし家庭用ルータのIPアドレスが上記アドレス帯であれば、これはシェアードIPアドレスでインターネットから直接はアクセスできない、と判断できるわけです。

参考サイト
シェアードアドレス 日経XTECH

2018年10月18日木曜日

プライベートIPアドレスとは

IPアドレス(Internet Protocol Address)というのは、ネットワークに接続をされている機器同士が通信を行うための住所のようなものです。IPアドレスを持たない機器(パソコン、サーバ、ネットワーク機器)は通信を行うことができません。
※これは非常にざっくりとした説明で、OSI参照モデルの第3層だけの話ではあります。

インターネットに接続されている機器が全てIPアドレスを持てばそれはそれで良いのですが、例えば家や会社の中で使うパソコンなどは、インターネットにアクセスすることはあってもインターネットからアクセスされる必要はありません。(逆にセキュリティを考えると、インターネットからパソコンにアクセスできるのは危ないですよね。)また、全てのパソコン等々の機器に一意なIPアドレスを割り振ろうとすると、IPアドレスが足りなくなってしまいます。そんなわけで、閉ざされたネットワークで利用するIPアドレスというのが設定されています。これがプライベートIPアドレスです。

IPv4ではプライベートアドレスとして、以下の3つが用意されています。

・10.0.0.0/8
 利用できるアドレス:10.0.0.0~10.255.255.255
・172.16.0.0/12
 利用できるアドレス:172.16.0.0~172.31.255.255
・192.168.0.0/16
 利用できるアドレス:192.168.0.0~192.168.255.255

これ、結構間違えて使っている環境とかを時々見ます(192.16.1.0/24とかにしちゃったり)。気をつけましょう!

【参考になりそうなサイト】
プライベートネットワーク Wikipedia
IPアドレスとは?をわかりやすく解説します カゴヤのサーバー研究室

2018年10月17日水曜日

ファイルを1行づつ読み出して処理を行う

phpでファイルを1行づつ最後の行まで読み出す処理です。fopenはどこの行まで読み出すかを指定することも出来るみたいですね。

<?php
/* ファイルポインタをオープン */
$file = fopen("list.txt", "r");

/* ファイルを1行ずつ出力 */
if($file){
  while ($line = fgets($file)) {
    echo $line;
  }
}

/* ファイルポインタをクローズ */
fclose($file);
?>

こちらのサイトを参考にさせて頂きました。
ファイルから1行ずつ読み込む - fgets()

2018年10月16日火曜日

問合せフォーム

問合せフォームを作ってみました。

今はGooleフォームという、簡単に問合せフォームを作成することが出来るとても便利なものがあるのですが、今回は敢えて完全自作してみようと思い、一から組んでいます。
作成したサイトがこちらです。
お問合せ

極めて普通の問合せフォームではありますが、機能選択のプルダウンメニューを機能を増やすたびにメンテしないといけないのが、少し面倒ですね。
送信ボタンを押すと、内部的には私宛に問い合わせ内容を本文に記載したメールが私宛に飛ぶようになっています。

2018年10月15日月曜日

Postfix+Gmailの組合せでメール配信環境を構築する

メールを配信できる環境を作るため、Postfixの設定を行いました。本当はPostfix+SendGridの組合せにしようと考えていたのですが、SendGridの審査に多少時間がかかりそうなので、一旦Postfix+Gmailの組合せでメールで飛ばせるようにしておきます。

やり方ですが、以下のサイトを参考にさせて頂きました。
PostfixのメールをGMail経由で送る

上記サイトには記載がないのですが、最近のGoogleアカウントは「安全性の低いアプリの許可」がデフォルト無効になっており、パスワード認証でメールを配信することができません。そのため、本設定を有効にする必要があります。

2018年10月14日日曜日

プルダウンメニューで項目をグループ化する

プルダウンメニューで項目をグループ化するには、以下のようにoptgroup タグを利用します。

<form>
<select>
<optgroup label="英字">
<option value="a">a</option>
<option value="b">b</option>
<optgroup label="数字">
<option value="1">1</option>
<option value="2">2</option>
</optgroup>
</select>
</form>

phpで項目をグループ化する良い方法がないか考えたのですが、一旦保留にします。。。

こちらのサイトを参考にさせて頂きました。
プルダウンメニューをグループ分けする

2018年10月13日土曜日

2018年10月12日金曜日

文字列を特定の文字で区切って配列に入れる

区切り文字を指定して配列に入れたい場合は、explode関数を使うようです。
こんな感じです。

$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2

こちらのサイトを参考にさせて頂きました。
explode

2018年10月11日木曜日

文字列を置換する

文字列内の特定の文字を置換するには、strtr関数を利用するそうです。
こんな感じです。

$str = 'This year is 2016 years.';

//部分文字列を検索して置換する
$result = strtr($str, '2016', '2017');

echo $result;

結果
This year is 2017 years.

こちらのサイトを参考にさせて頂きました。
【PHP入門】文字列の置換 | str_replace・str_ireplace・strtr

2018年10月10日水曜日

pre要素で折り返し表示させる

あまり良くないという記述を発見したものの、コマンドの実行結果を表示するのにpre要素を利用しています。現在作成中の機能では1行が長い出力結果が出る場合があるのですが、画面レイアウトが崩れました。。。

調べたところ、CSSで折り返しするように指定できるみたいです。
こんな感じです。

pre {
white-space: pre-wrap ;
}

こちらのサイトを参考にさせて頂きました。
pre要素で折り返し改行させる方法

2018年10月9日火曜日

dateで時間を取得するとUTC(協定世界時)になっちゃう問題

phpで結果をログに出す処理でdate関数を使ったところ、時刻がずれていることに気付きました。UTCで出てますね。

で、調べたところphp.iniでタイムゾーンを設定すれば良さそうです。
こんな感じです。
date.timezone = Asia/Tokyo

こちらのサイトを参考にさせて頂きました。
【xampp1.7.4】date関数で時刻を表示させると日本標準時(JST)より8時間遅れる原因

処理の中でも変更できるみたいですね。
今回はまとめて設定したかったのでphp.iniで対応してしまいましたが。

2018年10月8日月曜日

PHPでコマンドを呼び出す際に入力値をエスケープする

サニタイジングというと色々ややこしい話になりそうですが、やはり外部からの入力値に危ない文字列が含まれるリスクは考慮しておく必要があります。例えば入力値を変数としてコマンドを実行する場合、以下のような複数の対策を取る必要があります。
  1. 入力値チェック
  2. エスケープ
  3. コマンド実行ユーザ権限を必要最低限のものとする
入力値チェックは実装するとは思いますが、思いもよらない入力に対応できない場合(不具合ではありますが)もあります。その場合の対策として、エスケープを行いましょう!
PHPの場合は以下の関数を利用するようです。

escapeshellarg()

更に、万が一のことを考え、実行させるユーザの権限を最小限のものにしておく必要があります。

まあ、そもそもPHPからコマンドを呼び出すような実装をするなと言う話はありますが、自分が作りたいものにコマンド実行ありきのものが多いのです。でも、今後SQLとかを実行する際にも役立つと思うので、勉強がてら慎重に作っていこうと思います。

こちらのサイトを参考にさせて頂きました。
サニタイズ/入力値検証/エスケープの考え方

2018年10月7日日曜日

名前解決確認

名前解決のテストを行う機能を作成しました。こちらになります。
名前解決確認(nslookup/dig)

このページで名前解決確認を行うと、nslookupとdigの両方を実行してくれます。digの方が実際のDNSレコードのイメージで出力されるので見やすいと思うのですが、自分も含めて名前解決と言えばnslookupだよね、と考えている人も多いかと思い、両方出力するようにしました。

オプションはレコードと利用するDNSサーバだけにしています。コマンド自体は色々なオプションが用意はされているのですが、画面にオプションを増やすと分かりにくくなってしまうかと思い、今回はシンプルにしてみました。再帰しないとか、debugとかはニーズもあるかとは考えたのですが、一旦保留です。

nslookupとdigの出力結果の解説も作ろうかとは思ったのですが、まあ少し調べると色々出てきますし、そもそも名前解決を確認しようとする人はそのくらい分かるかなということで、今回は作成してません。一応、参考になりそうなサイトをご紹介しておきます。
nslookupの基本的な使い方(イントラネット編)
奥が深いDNSサーバーとdigコマンド

2018年10月6日土曜日

DNSレコードとは

DNS(Domain Name System)はホスト名や役割などをIPアドレスと紐付けて管理する、インターネットの重要な仕組みの1つです。この紐付けが具体的に記載されているものがDNSレコードです。DNSレコードはいくつも種類がありますが、ここでは主要なものを紹介します。

Aレコード ホストのIPアドレス(ipv4)
AAAAレコード ホストのIPアドレス(ipv6)
PTRレコード IPアドレスに対するホスト名、つまりAレコードの逆
CNAMEレコード ホスト名のエイリアス(別名)
TXTレコード ホストへのテキスト情報
NSレコード ドメインのDNSサーバ
MXレコード ドメインのメールサーバ
SOAレコード ドメインの情報

TXTレコードは色々な使い方をしますし、上記以外にもSRVレコードやCAAレコードなども時々登場します。奥深い世界ですね。

以下、参考リンクです。
DNSレコードタイプの一覧 Wikipedia
主なDNSレコードの種類 @IT

2018年10月5日金曜日

Ping疎通テスト

Ping疎通テストが出来るページを作成しました。

処理としてはサーバ上でpingを打って、その結果を拾っているだけです。色々やろうと思ったところはあるのですが、現在のスキルレベルを鑑み、シンプルな作りとなりました。

悪用はしないようにお願いします!
Ping疎通テスト

2018年10月4日木曜日

ファイルに追記する

PHPで処理を行うたびにログに記録するようにしたいと思い、ログファイルに追記する処理を探しました。いくつかやり方はあるようですが、こちらを採用しました。

<?php

// 書き込みモード(追記)でファイルを開く
$fp = fopen("fwrite.txt", "a");

// ファイルに書き込む
fwrite($fp, "add sample");

// ファイルを閉じる
fclose($fp);

?>

こちらのサイトを参考にさせて頂きました。
fopen関数から始める!ファイルの読み込み・書き込み方法【PHP入門】

2018年10月3日水曜日

文字列を検索する

特定の文字列が含まれているか、で条件分岐をしたい場合、以下のようにすれば良い。

if(strpos($subject,'bc') !== false){
  //'abcd'のなかに'bc'が含まれている場合
}

if(strpos($subject,'bc') === false){
  //'abcd'のなかに'bc'が含まれていない場合
}

preg_matchで正規表現を指定するよりも、処理が早いそうです。

こちらのサイトを参考にさせて頂きました。
【PHP】特定の文字列を含むかのチェック

2018年10月2日火曜日

FQDN、IPアドレスを正規表現で記載する

FQDNについては、こんな感じでできるようです。
^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$
^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-\.]{0,61}[a-zA-Z0-9])+\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])*$

こちらのサイトを参考にさせて頂きました。
[regex] DNSホスト名またはIPアドレスに一致する正規表現ですか?

IPアドレスについては、こんな感じでできるようです。
^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$

こちらのサイトを参考にさせて頂きました。
IPアドレスの正規表現について

(2019/07/17追記)
FQDNの正規表現を修正しました。まだ怪しい感じですが、多少改善されたかと。

2018年10月1日月曜日

pingコマンド、実行結果の見方について

本記事ではPing疎通テストの解説を行います。

1.Pingとは
pingとはPacket INternet Groperの略で、対向のサーバ、ネットワークと通信できるかを確認するコマンドです。pingはICMP(Internet Control Message Protocol)というIP層のプロトコルを利用します。

2.pingコマンド
pingコマンドはWindowsにもLinuxにも用意されています。基本的な使い方は同じですが、オプションが異なります。Suama Online Serviceの環境はLinux(CentOS)で動作していますので、Linux用のオプションを指定して実行しています。
実行するコマンドは以下のとおりです。
ping -c5 [対象ホスト]

-c5:これは実行する回数を5回に指定しています。
※Windowsはオプション無しだと4回しか実行しませんが、LinuxはCtl+Cで止めるまで無限に実行し続けます。
これ以外にも幾つかオプションが用意されています。詳細は以下のサイトをご参照下さい。
【Linux】pingコマンドの使い方

3.実行結果の見方について
次のコマンドを実行した場合、
ping -c5 www.example.com

次のような実行結果が返ります。
--------
PING www.example.com (93.184.216.34) 56(84) bytes of data.
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=1 ttl=53 time=107 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=2 ttl=53 time=107 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=3 ttl=53 time=107 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=4 ttl=53 time=107 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=5 ttl=53 time=107 ms

--- www.example.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 107.564/107.602/107.660/0.416 ms
--------

1行目は疎通確認対象情報です。IPアドレスの場合はアドレスのみ記載されますが、FQDNで指定した場合、名前解決の結果が表示されます。
2行目からが実行結果で、64 bytesはテストに利用したパケットデータサイズ、fromは疎通テスト先、icmp_seqは何番目のパケットか、となっています。ttlはネットワークパケットのTTL(Time To Live)で、最初は64でネットワーク機器を経由するたびに1減ります。そのため、ttlを確認するとそのパケットがどれだけのネットワーク機器を経由したかが分かります。ttlが0になるとそのパケットは転送されなくなります。timeは応答時間で、少ないほど遅延の少ない通信が行えていることが分かります。

ping statisticsはpingコマンド実行結果のサマリです。結果の1行目は結果サマリで、2行目が分析結果となっています。
2行目にはmin(最速)、max(最遅値)、ave(平均値)、mdev(偏差)が表示されます。偏差で通信の安定性を判断することができます。が、今回の場合はサンプルが少ないので、あまり参考にはなりませんね。

以下のサイトを参考にさせて頂きました。
pingコマンドについて詳しくまとめました 【Linuxコマンド集】

ローカルアドレス(プライベートアドレス)を正規表現で記載する

まあ、こういうことですよね。

(^127\.)|(^169\.254\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)

こちらのサイトを参考にさせて頂きました。
プライベートIPアドレスとその正規表現

正規表現のチェックはこちらのサイトが便利です!
PHP: preg_match() / JavaScript: match() 正規表現チェッカー ver3.1

こちらのサイトで確認する際はこんな風↓にデリミタ(区切り文字)を付ける必要がります。
/(^127\.)|(^169\.254\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)/u

2018年9月30日日曜日

文字列が全て半角英数字か調べる

こんな感じでできるようです。

<?php

$str = "あいうえaおかきくあけ";

if (preg_match("/^[a-zA-Z0-9.]+$/", $str)) {
    echo "すべて半角英数である";
} else {
    echo "すべて半角英数ではない";
}

?>

preg_match()が色々と正規表現が使えて便利ということですね。

こちらのサイトを参考にさせて頂きました。
正規表現:すべて半角数字かどうか調べる表現:すべて半角数字かどうか調べる

2018年9月29日土曜日

ページがモバイル フレンドリーではありません。

Suama Online ServiceのページがGoogle検索で表示されるか確認していたところ、検索結果に「ページがモバイル フレンドリーではありません。」との表示が!

何だこれと思って調べてみたのですが、サイト管理者にだけ表示されるものみたいです。Googleが世の中全体に向けてこのサイトがダメだとアピールしだしたのかと思い、焦りました(笑)

リンクをクリックすると、モバイルフレンドリーテストというページに飛びます。で、以下の4つがダメですと表示されました。

  • テキストが小さすぎて読めません
  • ビューポートが設定されていません
  • コンテンツの幅が画面の幅を超えています
  • クリック可能な要素同士が近すぎます
なるほど、確認すると確かにスマホで見ると表示が非常に小さいです。取り敢えずviewportを設定しよう、ということで以下の設定を各ページに入れました。
<meta name=viewport content="width=device-width, initial-scale=1">

再度モバイルフレンドリーテストで確認を行うと、モバイルフレンドリーです、と表示されました!でもまあ、表示は大きくなったのですが使いにくいですね。。。今後の検討としましょう。

参考にさせて頂いたサイト

2018年9月28日金曜日

決まった範囲を選択してクリップボードにコピーするjava script処理

出力結果をクリップボードにコピーする処理をjava scriptで作成しました。正直java scriptはまだ良くわかっていないので現時点ではあまり利用したくないのですが、こういった処理はjava scriptを使わないわけには行きませんね。。。

処理
function TextareaSelected() {
  document.form2.output1.focus();
  document.form2.output1.select();
  document.execCommand("Copy");
}

実行するボタン
<input class="button2" type="button" value="パスワードをクリップボードにコピー" onClick="TextareaSelected()">

選択するフォーム
<form name="form2">
<textarea id="output1" name="output1">
  ここに出力結果を表示
</textarea>
</form>

実際に作成したページはこちらです。
パスワード自動生成

以下のサイトを参考にさせて頂きました。
6. テキストエリアをボタンで全選択する 仕掛けで見せる! WEBデザインTIPS & TRICS

2018年9月27日木曜日

パスワードを生成する

パスワードを自動生成するページを作成しました。
パスワード自動生成

パスワードを自動生成するサイトは既に世の中にたくさんありますが、自分もよく利用する機能であること、既存のサイトでイマイチ使い勝手が、と思うところがあるので作成してみました。

あまりデザインセンスがないページになってしまいました。が、機能的には以下の3点ほどこだわってみました。
  • シンプルな作り
  • パスワードの文字列を最大128文字まで選択できる
  • 作成したパスワードをそのままクリップボードにコピーできる

シンプルな作りは全体のコンセプトの1つです。文字列数についてはここまで文字列が必要か、というのはありますが、最近はブラウザにパスワードを覚えさせてしまうことも多いので覚える必要も減っています。それであれば、なるべく長いパスワードも生成できたらなと思い、最大128文字を設定しています。256文字までというのも考えたのですが、まあそこまでは不要かなと。実装自体は難しくはないんですけどね。あとは、クリップボードにコピー出来る機能です。パスワードをテキストでダウンロードできるサイトもあるのですが、個人的にはコピーを簡単にできれば、その方が手間がかからないのではないかと日々思っていました。

作成してから思ったのですが、本当はパスワード生成処理はクライアントサイド、つまりjava scriptで生成したほうが、より安心なのかもしれません。勿論、本サイトでは生成したパスワードを保持しているわけではないので安全ではあるのですが、それはサーバ側の主張ですからね(自分で言うのもなんですが)。でもまあ、サーバ側ではパスワードの用途も分からないですし、そこまで問題ないのかも。

変数が数値であるかをチェックする

色々やり方はあるようですが、こちらを採用しました。
(!preg_match('/^[0-9]+$/', $int))
以下のサイトを参考にさせて頂きました。
PHPで数値をチェックする4つの方法を比較

PHPは変数の型があいまいでも動いてしまうので、楽ではありますが想定外の動きをするリスクはありますよね。

2018年9月24日月曜日

テキストエリアの出力テキストをテキストファイルとしてダウンロードする

テキストエリアの出力テキストをテキストファイルとしてダウンロードするjavascriptのサンプルです。
function handleDownload() {
    var content = document.getElementById( "output1" ).value ;
    var blob = new Blob([ content ], { "type" : "text/plain" });
    if (window.navigator.msSaveBlob) {
        window.navigator.msSaveBlob(blob, "test.txt");
        // msSaveOrOpenBlobの場合はファイルを保存せずに開ける
        window.navigator.msSaveOrOpenBlob(blob, "test.txt");
        } else {
        document.getElementById("download").href = window.URL.createObjectURL(blob);
    }
}
ボタン
<input type="submit" value="ダウンロード" onClick="handleDownload()">
テキストエリア
<textarea id="output1">テスト</textarea>
以下のサイトを参考にさせて頂きました。
JavaScriptでファイルダウンロード処理を実現する
入力フォームの値を取得する方法

2018年9月23日日曜日

数字を選択するプルダウンメニュー

PHPを利用して数字部分を生成し、プルダウンメニューを作成するサンプルです。
 <?php
     #数字選択プルダウンメニュー
     $html = "<select name=\"kazu\">\n";
  for ($i=1;$i<=128;$i++){
      $html.="<option value=\"$i\">$i</option>\n";
  }
     $html.= "</select>";
     print $html;
 ?>

2018年9月18日火曜日

CSSでテーブルの幅を調整する

テーブルを作成したのですが、変なふうに改行されてしました。ということで、CSSで幅を調整しました。こんな感じです。
table{
width: 100%;
th.koumoku{
width: 20%;
th.hensu{
width: 20%;
th.atai{
width: 60%;
}

以下のサイトを参考にさせていただきました。
HTMLのtableでテーブル(表)を作る方法とCSSのデザイン調整解説

完成したサイトは以下のものです。
WEB接続環境確認

2018年9月17日月曜日

接続元のWEB環境を表示する

接続元IPアドレス表示に引き続き、接続元のアクセス環境を表示するページを作成します。
以下のサイトを参考にさせていただきました。
PHPでユーザー・アクセス情報を表示する

これについては参考にするという、ほぼそのままですね。表示させる内容はPHPの変数で取得できるものだけにしています。JavaScriptを利用すればもっと色々取得して表示させることが出来るとは思うのですが、一旦そちらには手を出さず、シンプルな作りにしました。

完成したサイトが以下のものです。
WEB接続環境確認 Suama Online Service

2018年9月16日日曜日

接続元のIPアドレスを表示する

接続元のIPアドレスを表示するサイトは、シンプルに作れそう&結構よく使うということで、最初に作成してみました。

今回PHPで環境を作成しています。

以下のサイトを参考にさせていただきました。
PHPでIPアドレスを取得する:$_SERVER変数, gethostbyname

接続元IPアドレスを表示するのは変数を表示させるだけで良いのですね。簡単で良いです。
echo $_SERVER['REMOTE_ADDR'];
IPアドレスだけだと寂しい気がしてきたので、ホスト名も表示するようにしました。
こちらは以下のサイトを参考にさせていただきました。
[PHP] アクセス元のホスト名を取得する

先程の接続元IPを利用して、ホスト名を解決させるという感じですね。
$host = gethostbyaddr($_SERVER['REMOTE_ADDR']);echo $host
完成したサイトが以下のサイトです。
IPアドレス確認 Suama Online Service

2018年9月15日土曜日

Suama Online Serviceとは

Suama Online Serviceは普段IT技術の中でもインフラレイヤに関わっている1エンジニアが、フロントエンドやプログラミングについても学習しよう!、ということで構築しているWEBサービス群です。

基本コンセプトは以下のとおりです。
  • なるべくシンプルに
  • 既に世の中にあるものも、再度作ったって良いじゃない
  • 自分が使いたくなるものを

本サービスは個人利用、商用利用を問わず、自由に無料でご利用頂くことが可能です。ただし、以下の留意事項があります。

  • 法令、モラルに反するご利用はご遠慮ください。
  • 本サービス利用に際して発生したトラブル、損害等については一切保証いたしません。
  • 本サービスに異常に負荷をかける利用のされ方をした場合、利用の停止を求めたり、接続を切断させて頂く場合があります。
  • 本サービスは可能な限り継続するよう努力致しますが、予告なく停止する可能性もありますので、その旨ご了承下さい。
また本サイトはリンクフリーです。
お好きなページをリンク先として頂いて構いません。

よろしくお願いします。

本サイトが使用しているアクセス解析ツールについて

  • 本サイトでは、サイトの分析と改善のためにGoogleアナリティクスを使用しています
  • 本サイトをご利用中のウェブブラウザは、Google に特定の情報(例えば、アクセスしたページのウェブ アドレスや IP アドレスなど)を自動的に送信します
  • データ収集のためにGoogle がお使いのブラウザに cookie を設定したり、設定済みのcookieを読み取ったりする場合があります。
  • 利用者は、本サイトを利用することで、上記方法および目的においてGoogleが行うこうしたデータ処理につき許可を与えたものとみなします。


本サイトに掲載されている広告について

  • 本サイトではでは、第三者配信の広告サービス(Googleアドセンス)を利用しています。
  • このような広告配信事業者は、ユーザーの興味に応じた商品やサービスの広告を表示するため、当サイトや他サイトへのアクセスに関する情報  cookie (例えば、アクセスしたページのウェブ アドレスや IP アドレスなど)を使用することがあります。
  • 利用者は、本サイトを利用することで、上記方法および目的においてGoogleが行うこうしたデータ処理につき許可を与えたものとみなします。

リスト(ul,li)を縦横に並べる

トップページに機能一覧を鉢したいのですが、AWSの機能一覧みたいに並べたいなと思います。で、やり方を調べたところ、まさにやりたい事が纏めてあるサイトがありました。

CSSでリストから表を作る方法!2列、3列、4列のレイアウトはこうすれば良いけど罫線が問題

今回はサンプル3を利用させていただきました。
ul.listtest3 {
    display: table;
    width:100%;
}
ul.listtest3 > li:nth-child(3n+1) {
    clear: both;
}
ul.listtest3 > li {
    display: table-cell;
    float: left;
    width: 33%;
}

あとは少し行間を調整します。

【CSS】line-heightで行間を調整する方法:おすすめの値は? 

2018年9月2日日曜日

bloggerで独自ドメインを設定する

このブログがgoogleが提供しているブログサービスであるbloggerを利用しています。bloggerの場合、標準でXXX.blogspot.comというURLが割り当てられるのですが(XXXの部分は任意)、今回は独自ドメインを設定してみました。

設定方法については、以下のサイトに詳しく記載されていますので、そちらをご参照下さい。
2018年版 Blogger のサイトを独自ドメインに設定する方法 ブロギングライフ

bloggerだと独自ドメインでも簡単にHTTPS化できます。こちらについても以下のサイトに分かりやすく記載されています。
独自ドメインのBloggerでHTTPSを有効にする設定方法 ブロギングライフ

さて、今回.onlというあまり見覚えのないドメインを取得しました。本当は.netとかもっとメジャーなドメインで取得したかったのですが、はやりメジャーなドメインは既に他の方が取得されていましたね。まあ、onlはオンラインを表すドメインということなので、まあ良いかな?ということで選択しました。onlineというドメインもあるのですが、お名前.comだと結構高いんですよね。