CHANSHIGELOG

いろんなこと

ドメインのwhoisとdnsレコードを検索できるAPIをつくってみた

ドメインwhois情報やDNSレコードを検索できるWHOISPROXYサイトを運営していますが、世の中に新しいドメインが増えて、検索できる種類が限られてきたことと、そろそろ(見た目も)作り変えたいなと思ってきたので、SlimPHP3x(Framework)を使って簡単なAPIを作ってみました。

APIにするからにはそれっぽくapi.whoisproxy.infoFQDNとして、WEB上でも検索できる2種類(whois, dig)のエンドポイントを用意しました。
結果は、安定のJSON形式で返すようにしています。

https://api.whoisproxy.info/{whois or dig}/{検索したいドメイン名} でリクエストする感じです。

試しにAppleiCloudドメイン(icloud.com)を使ってWHOISとDIGのリクエスト(GET)を投げると、以下のように返ってきます。

/whois/icloud.com

{
  "code": 200,
  "state": "success",
  "_links": {
    "self": {
      "href": "/whois/icloud.com"
    }
  },
  "results": {
    "domain": "icloud.com",
    "servername": "whois.corporatedomains.com",
    "tld": "com",
    "registered": true,
    "reserved": false,
    "client_hold": false,
    "detail": {
      "registrant": [
        "Registrant Name: Domain Administrator",
        "Registrant Organization: Apple Inc.",
        "Registrant Street: One Apple Park Way",
        "Registrant City: Cupertino",
        "Registrant State/Province: CA",
        "Registrant Postal Code: 95014",
        "Registrant Country: US",
        "Registrant Phone: +1.4089961010",
        "Registrant Phone Ext:",
        "Registrant Fax: +1.4089741560",
        "Registrant Fax Ext:",
        "Registrant Email: domains@apple.com"
      ],
      "admin": [
        "Admin Name: Domain Administrator",
        "Admin Organization: Apple Inc.",
        "Admin Street: One Apple Park Way",
        "Admin City: Cupertino",
        "Admin State/Province: CA",
        "Admin Postal Code: 95014",
        "Admin Country: US",
        "Admin Phone: +1.4089961010",
        "Admin Phone Ext:",
        "Admin Fax: +1.4089741560",
        "Admin Fax Ext:",
        "Admin Email: domains@apple.com"
      ],
      "tech": [
        "Tech Name: Domain Administrator",
        "Tech Organization: Apple Inc.",
        "Tech Street: One Apple Park Way",
        "Tech City: Cupertino",
        "Tech State/Province: CA",
        "Tech Postal Code: 95014",
        "Tech Country: US",
        "Tech Phone: +1.4089961010",
        "Tech Phone Ext:",
        "Tech Fax: +1.4089741560",
        "Tech Fax Ext:",
        "Tech Email: apple-noc@apple.com"
      ],
      "billing": [],
      "status": [
        "Domain Status: clientTransferProhibited http://www.icann.org/epp#clientTransferProhibited"
      ],
      "date": [
        "Updated Date: 2018-09-27T20:55:11Z",
        "Creation Date: 1999-01-15T05:00:00Z",
        "Registrar Registration Expiration Date: 2020-01-15T05:00:00Z"
      ],
      "name_server": [
        "Name Server: b.ns.apple.com",
        "Name Server: d.ns.apple.com",
        "Name Server: f.ns.apple.com",
        "Name Server: e.ns.apple.com",
        "Name Server: a.ns.apple.com",
        "Name Server: c.ns.apple.com"
      ]
    }
  }
}

/dig/icloud.com

{
  "code": 200,
  "state": "success",
  "_links": {
    "self": {
      "href": "/dig/icloud.com"
    }
  },
  "results": [
    "; (1 server found)",
    ";; global options: +cmd",
    "icloud.com.  21371 IN SOA adns1.apple.com. hostmaster.apple.com. 2011089978 1800 900 2592000 1800",
    "icloud.com.  21371 IN NS c.ns.apple.com.",
    "icloud.com.  21371 IN NS a.ns.apple.com.",
    "icloud.com.  21371 IN NS d.ns.apple.com.",
    "icloud.com.  21371 IN NS b.ns.apple.com.",
    "icloud.com.  21371 IN NS e.ns.apple.com.",
    "icloud.com.  21371 IN NS f.ns.apple.com.",
    "icloud.com.  3371 IN A 17.253.144.10",
    "icloud.com.  71 IN MX 10 mx1.mail.icloud.com.",
    "icloud.com.  71 IN MX 10 mx6.mail.icloud.com.",
    "icloud.com.  71 IN MX 10 mx5.mail.icloud.com.",
    "icloud.com.  71 IN MX 10 mx4.mail.icloud.com.",
    "icloud.com.  71 IN MX 10 mx2.mail.icloud.com.",
    "icloud.com.  71 IN MX 10 mx3.mail.icloud.com.",
    "icloud.com.  3371 IN TXT  google-site-verification=knAEOH4QxR29I4gjRkpkvmUmP2AA7WrDk8Kq0wu9g9o",
    "icloud.com.  3371 IN TXT  v=spf1 ip4:17.36.0.0/16 ip4:17.41.0.0/16 ip4:17.58.0.0/16 ip4:17.110.0.0/15 ip4:17.111.110.0/23 ip4:17.120.0.0/16 ip4:17.133.0.0/16 ip4:17.139.0.0/16 ip4:17.142.0.0/15 ip4:17.151.1.0/24    ip4:17.158.0.0/15 ip4:17.162.0.0/15 ip4:17.164.0.0/16 ip4:17.171.37.0/24 ip4:17.172.0.0/16 ip4:17.179.168.0/23 ~all"
  ]
}

まず、whoisについては以前僕が作成したwhoisライブラリを使っていて、新ドメインも大体は検索できる?かな?と思っています。
検証するにも、種類が多すぎているので思いついた時にしかチェックしていません。もし結果が来ない!おかしい!があったらGithubのIssueかLINEでも連絡ください!切実っっ!

GDPR施行により、ドメインによっては結果がほとんど出てこないものもありますが、各ドメインレジストリレジストラのポリシーに準して、whois結果自体は加工せずそのまま使用しているので、そういうこともあります。

github.com

digについては、GooglePublicDNS(8.8.8.8)に対してリクエストを投げているだけなので特別な加工はしていません。

僕がカスタマーサポート業をやっていた時代(4,5年前)からつくってたwhoisproxy.infoですが、今も利用してくれている方がいてとても嬉しいです!ありがとうございます!!!!!!1

このサイトが何かの役に立っている限り、徐々に更新していきたいと思いますが、サイト自体のリニューアルはこれからやりますので引き続きよろしくお願いします。

※2019/02/20追記  json形式をcontent-type: application/hal+jsonに変更しました。
 今後の予定として、正常・エラー時のレスポンスにLink属性をつけて、リファレンス等のリンクをつける予定です。

※ 2019/05/29変更
リクエスURIの変更をしました

ブログタイトル変えました

どうもちゃんしげです。CHANSHIGELOG にしてみました。CHANGELOGっぽい。

3月から全くブログを書いていなかったので、ここ最近の出来事をざっくりと。

といったかんじで、公私ともにPHPerの日々を送っております。

PHPカンファレンス福岡2018

f:id:tanakashigeki:20180725001738j:plain:w500

PSR関連のセッションがあったのは個人的に嬉しかった。 今回はLog(PSR-3)だったけど、僕的に好きなPSR-7系の話もどこかで聞きた、、(登壇

www.php-fig.org

www.php-fig.org

今年も盛り上がりと場の雰囲気作りがすごくよかったです!運営スタッフの方々ありがとうございます。

PHPカンファレンス関西2018

f:id:tanakashigeki:20180725001747j:plain:w500

名札にスキルとか好きなものをステッカー貼ってアピれるの良い!

PHPerKaigiから追っかけてた「続・SOLIDのってどんなふうに使うの?」の集大成をみることができてよかった。デザパタ大事ですよ!!!!!!

続・SOLIDの原則ってどんなふうに使うの? 〜オープン・クローズドの原則 センパイのコーディングノート編〜 - Speaker Deck

話の進め方が、センパイとコウハイくんの対話形式っていうのが親しみやすくて、面白い。日々の設計・実装(保守でも)ちょっとした意識だったり見方・捉え方を変えてみるっていうのは、やり続けたいと思いました。

PHPカンファレンス関西の会場であるグランフロント大阪

f:id:tanakashigeki:20180725002146j:plain:w500

いつみてもイケてる。なぜかグランフロント好きなんだなー(ロゴも)

やっとチリチリいけた(人の回転よすぎて驚き)

f:id:tanakashigeki:20180725002141j:plain:w500

トッピングありきであることを後で気づいたのでまた行く

セリーヌディオンすごすぎた、、最高。(10年ぶりの来日とのこと)

f:id:tanakashigeki:20180725002148j:plain:w500

番外編:福岡・大濠公園近くの「炭焼きとりこ」美味しい

f:id:tanakashigeki:20180725002157j:plain:w500

来月は今のところ福岡から出る予定はないけど、お盆だし実家帰ろうと思います。あとひきラーメン食べたいし

PHPerKaigi2018 いってきた @東京

3/9 - 3/10 に開催された記念すべき第一回目の PHPerKaigi 2018 に行ってきました!(遅)

phperkaigi.jp

僕は3/10(土曜)からの参加で、久しぶりの東京&練馬ってどこ?やばい楽しいという気持ちで望んだんですが、 率直に楽しかったし笑ったし、最高な1日を過ごすことができたと感じています。

個人的には、フレームワークBearSunday」の郡山さんのセッションを聴きたい!きっかけで参加を決めたんですが、 それも前職でお世話になったエンジニアの師匠がリスペクトをされていた方だというのもあったのでとても楽しみでした。

※ おぉ〜やばいやばいってなってました。

今回の参加で、僕が特に気になったタイトルは以下です!

SOLIDの原則ってどんなふうに使うの? - Speaker Deck

前職の師匠がちょくちょく仰ってたSOLIDの原則でしたが、例えがわかりやすくて理解度がさらに深まったと思います! 実際にやろうとするとなかなかうまくいかないなと思うんですが、良書読んだり、良いコード好きなアプローチを見て真似ることが大事かなと思いました。

Hackで作るマイクロフレームワーク - Speaker Deck

正直なところ、HHVM/Hackを全然チェックしていなかったので新鮮すぎました!!!!

男になるしかねーなっ!という気持ちです!!!!

BEAR.Sunday (2018) - Speaker Deck

コーディング・実装に対する考え方というところが本当にどハマりしてしまいました。 まだまだ理解は浅いですが、いろんなアプローチ方法(デザパタ等)を見る・取り込むことで深まる気がしています!

以下の様にメモ取ってたのですが、まだまとめられていないので改めて書こうかなって思います!

アプリケーション制約こそがフレームワーク
それぞれのドメイン(DB・認証) -> ライブラリ

アプリケーション全体にわたっての制約が"フレームワーク"

DI: 疎結合とコーディングを可能にする、ソフトウェアデザインとパターンのセット
実装ではなく、インターフェースに対してプログラムをする

実装に対するプログラム ができてないソフトウェアとは?

密結合なソフトウェアでもユーザへの価値は提供できる -> get shit done.
ただし、開発者としてメンテナンス性はどうか?
密結合している場合、再度工事が必要になってしまう。

ユーザーに新しい価値を届け続けるには、密結合のソフトウェアは向いてない
成功したソフトウェアは必ず変更し続ける

コンセント:インターフェース

インターフェースに対してコンポーネントを作る。
ドライヤー(例)以外の価値を届けることができる

リスコフの置換原則
decoratorパターン
compositeパターン
NullObjectパターン
adapterパターン

インターフェースに対して依存しているだけ
抽象を使う。インターフェースは中身がない規格だけ。

僕のやっていきがさらに高まった瞬間でもあります (本家からのレスポンスがあああああ!)

また今回のPHPerKaigi2018ですが、03/24現在でYoutubeにセッションがあがっているようですので、 是非観ていただけたらと思います、、、!

あとちょっとおもったのが、LaravelやcakePHPってやはり人気なのですね! やっぱ触っていかないとなっていう気持ちですが、僕はSymfony3(4)/Slim3 も結構好きなので、この好きをもっとアピールできるように鍛えていきたいと思います。

最後に

東京久しぶりに行ったんですよ!もう3年ぶりってぐらいだったんですけど、朝5時起きで福岡->東京(羽田)で着いたのが8:30過ぎで、 そこから京急->地下鉄?->練馬 だたんですが、結構遠いんですね!3/10オープニング間に合わなかったんです笑

結構ドタバタな1日でしたが、PHPerKaigi2018素直に楽しかったです!鳥貴族も行けたので満足です笑

なにかしらの形でしっかりアウトプットしていきたいと思いました!

次回はしっかり前乗りしていこうと思います2019!!!!!

スタッフの皆様ならびにスピーカーの方々本当にありがとうございました!!!

過去のアクセスログから特定のHTTPレスポンスコードが何件あるか調べたとき【メモ】

お仕事で xxxx-ymd.gz というように、日毎ローテートされた複数のログファイルから、特定のレスポンスコード(404,500,503とか)を持ってるレコードが何件あるかを調べることがあって、大量にファイルがあったので以下コマンドでやったんですが、なぜか wc -l のカウント数が合算されているようにみえたときがありました。

find . -type f -name "xxxx-*" |sort |xargs -t -n 1 -I% bash -c 'zcat % |awk "{if(\$9=={該当コード}) print \$0}"| wc -l'

長い!!!!

しかし、別の日にやると普通にファイルごとでカウントされた結果を吐いてる。謎!!!!!!! 見間違いならよいけど、ちょっと気になったので備忘録としてメモでした。

※とりあえずその日は別で思いついた以下で対応して終了でした。

ls |xargs -t -n 1 -I% sh -c 'zcat % |awk "BEGIN{count = 0} \$9=={当該} {count = count+1} END{print count}"'

whois検索のためのPHPライブラリを作ってみた

whoisは、ドメイン名の登録者などに関する情報をインターネット上で誰でも参照できるサービスで、ドメインを登録(取得)すると必ず設定・公開の義務がある情報です。

ドメイン取得業者(サービス)によっては、個人情報を公開したくないユーザー向けに、取得業者の情報を代わりに公開する"代理公開サービス"が用意されていることが多いですね。

そんなwhoisですが、ドメインTLD(com, jp, tokyo etc..)ごとに検索できるサイトが分かれていることが多く、検索するためのサイトをGoogleで検索するみたいなことをやっていたので、気軽に検索できるように3年前から https://whoisproxy.info を運営しているのですが、以下気になることが出てきたので思い切って自前で作ってみました。

  • Net_Whoisの更新が数年ない (Current Release : 2011-08-10 )
  • 超ライトに使いたいが、自分好みなwhoisライブラリが無い

github.com

Dependencies for Net_Whois PHP 4.0.0 !!!!!!!!!!!!

whoisproxy.info は、僕がまだカスタマーサポート職の頃にPHPすらよく知らない状態で作ったサイトで、whoisコマンドが叩けるサーバ上にサイトを置いてshell_exec('whois example.com') の結果を出すみたいな、割と危なっかしい実装をしていた記憶があります。笑

そんな淡い思い出もありますが、今回作ったものはこちらです!

github.com

以下を気にしつつやってみました。

  • シンプル
  • tldwhoisサーバ名と検索対象ドメインをセット出来ればいい
  • へんな加工なしで、そのままのレスポンスを受け取りたい

というところで、これを使った検索サイトに作り変えていこうと思っています。 ちゃっかり、packagistにも登録してみましたよ。

packagist.org

※ これ間違ってるよ!こうしたほうがいいよ!などありましたら、ぜひご連絡ください!

それでは、なにかあったら書きます!

[追記] 2017/09/20 chanshige/whois リポジトリを新しくしました!

初めてPHPカンファレンス福岡に参加してきました #phpconfuk

約9ヶ月ぶりの更新となりました @chanshige です!

先日(2017/06/10)、福岡で開催された PHPカンファレンス福岡2017 へ初めて参加してきました。

福岡での開催は今回で3度目とのことで、以前からあることは知っていたのですが、 なかなか参加できずな感じで、、今回やっと参加できた感想は率直に めっちゃ面白かった です。

僕は、サポートからエンジニアに転職し1年半が経つ頃で、どのくらいPHPと仲良くなれているのか?だとか、 色々理解できているか?とか再確認できる場でもあり、色々な方のお話を聞いて交流もできてとても充実した1日でした。

そんな僕は、基本的にメイン会場(Fusic ホール)から動くことがなく(結果そうなってた) 以下のセッションをガン見してきました。

本当は一つずつ感想をババっと書いていきたいのですが、スライドを見つつ話を聴くに集中しすぎて、 メモを取ることを忘れていましたがしがし、心に刻んだのでちょいちょいどこかでアウトプットしてこうと思います!

やっぱりネットだけじゃ手に入らない情報だとか、ニュアンスだとか、実際に自分の目で見て聴いて実践したほうがいいと思ったし、 今後もどんどん色々なイベントに参加したいと思います!!

最後に、PHPカンファレンス運営者の方々、登壇者の皆様、楽しい1日をありがとうございました! 朝のスポンサー様紹介からすごく丁寧で、初参加な僕でも居心地よくて雰囲気作りがすごいなと感じました。

来年も参加するぞー!福岡ー!

macOS Sierra のインストールUSBをつくる

9月21日にリリースされたmacOS Sierra
やっぱり"新しい"ものは使いたいという事でアップデートする。

ただ普通にアップデートするより、中身をまるっと綺麗にして、 改めてインストールしてみたほうがよさそうな気がしている僕なので、 そのためのUSB起動ディスクを作ってみたので記録

では早速、

今使ってるMacのAppStoreから macOS Sierra を入手する。

f:id:tanakashigeki:20160924180833p:plain

ダウンロード後、自動的に起動するインストーラーは一旦閉じておく。

f:id:tanakashigeki:20160924180840p:plain

OSを入れるUSBをMacにつなぐ。

MacBook は USB-Cってやつでこんなアダプタ付けないと刺さらない
この辺ちょっと不便だな〜
f:id:tanakashigeki:20160924182250j:plain

USBの中身をフォーマットする。

アプリケーション>ユーティリティ>ディスクユーティリティを使う。
完全にインストールディスクとなるので、使ってないUSBにする。
そして、名前は判り易いように"Sierra"と名付ける f:id:tanakashigeki:20160924182648p:plain

フォーマット後、USBを Sierra の起動ディスクにする

ターミナルを起動して、以下コマンドをたたく

sudo /Applications/Install\ macOS\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/Sierra --applicationpath /Applications/Install\ macOS\ Sierra.app

--volume /Volumes/Sierra USBのマウント先のパスですね
createinstallmedia というコマンドをつかって、--volume とか --applicationpath なオプションを使うとぺろりと出来る様子

コマンドを叩くとこんな感じで進む

shigeki@Shigeki-MacBook ~ % sudo /Applications/Install\ macOS\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/Sierra --applicationpath /Applications/Install\ macOS\ Sierra.app
Password:
Ready to start.
To continue we need to erase the disk at /Volumes/Sierra.
If you wish to continue type (Y) then press return: y
Erasing Disk: 0%... 10%... 20%... 30%...100%...
Copying installer files to disk...
Copy complete.
Making disk bootable...
Copying boot files...
Copy complete.
Done.

Done. ってなったらOKで、デスクトップにこれが出現

f:id:tanakashigeki:20160924184440p:plain

ここまで完了したら、USBを刺したままMacを終了させて、
[option]キー を押しながら起動すると、どのディスクを使って起動するか
選択が出てくるので、[Install macOS Sierra]の方を選択してください。

そうすると、ユーティリティが表示されるので、
ハードディスクのフォーマットを行ってから、再インストールすれば、
クリーンインストール完了!になります。

注意!現時点(2016/09/24)で、本作業手順はMacの公式手順になっておりません。
Mavericks時代からある方法なのでいずれ出るかもしれませんが、作業をされる際は必ず、
必要なデータのバックアップを行ってから、お試しくださいね!!!

ちなみに僕が使ってるMacMacBook Early2016で、 あまり良い話を聞かないんだけど、僕の印象としては軽くて持ち運び便利だし、 爆速!ではないけどゲキ重!でもない"普通にいいやつ"です。
また何かあったら書きます!