動かざることバグの如し

近づきたいよ 君の理想に

IPからリモートホストを調べるgethostbyaddrをDockerで動かす

環境

  • Docker
  • PHP 8.x

gethostbyaddrとは

PHPではgethostbyaddr関数というのがある。指定したIPのリモートホスト名を取得することができる。

gethostbyaddr('66.249.66.1');

これをDocker使ってワンライナーでやりたい。

結論

これでワンライナーで実行できる

$ docker run --rm --dns 8.8.8.8 php:8-cli php -r "echo gethostbyaddr('66.249.66.1');"
crawl-66-249-66-1.googlebot.com

ポイントは以下

  • --rm: コンテナ実行後に自動的に削除する。不要なコンテナが残らない。
  • --dns 8.8.8.8: DNSサーバーを指定。必須 これがないとDocker内部のDNSサーバーで解決を試みてしまい、どのIPを入力してもIPアドレスが返ってきてしまう。
  • php:8-cli: PHP 8.xのCLIイメージを使用。これにより、PHPスクリプトを直接実行できる。
  • php -r "echo gethostbyaddr('66.249.66.1');": PHPgethostbyaddr関数を実行し、結果を標準出力に表示。

これらのポイントを押さえることで、Docker環境で簡単にgethostbyaddr関数を利用できる。

より便利に

IPアドレスをいちいち書き換えるのが面倒だったので、bashのfunction機能を使ってコマンド化した

gethostbyaddr() { docker run --rm --dns 8.8.8.8 php:8-cli php -r "echo gethostbyaddr('$1');" }

以下のように引数を渡すと実行できる。

$ gethostbyaddr 66.249.66.1
crawl-66-249-66-1.googlebot.com

参考リンク

ChatGPTにJavascriptをTypescriptに変換してもらうためのプロンプト

ChatGPTにJavascriptをTypescriptに変換してもらうためのプロンプト

Act as an expert programmer in Javascript and Typescript.
You Translate code from Javascript to Typescript.
- Add types to all variables and functions (string, boolean etc.)
- The user can alternatively ask to create a function or a UI component.
If the user provided a request to write code, create the function or code and return it.
- Never no include your own comments.

Example translating from JavaScript to Typescript:

"""js
// React code in Javascript:
import React from 'react';

function Greeting(props) {
return <h1>Hello, {props.name}!</h1>;
}

export default Greeting;
"""

"""typescript
// React code in Typescript:
import React, { FC } from 'react';

interface GreetingProps {
name: string;
}

const Greeting: FC<GreetingProps> = (props) => {
return <h1>Hello, {props.name}!</h1>;
}

export default Greeting;
"""

おそらく https://js2ts.com/ のサイトはこのプロンプトで動いている。

実家から古いデジカメを発掘した

古いデジカメが人気らしい

今、若者の間で2000年代の古いデジカメが流行っているらしい。最近のスマホは綺麗に撮れすぎているので一周回ってアナログ的な画質の粗さが評価されてるっぽい。

かくいう自分も写ルンですのカメラ買おうか迷ってたぐらいなので気持ちはわかる。

で、先日実家に帰ったときに探したら昔親が買って使っていたデジカメが出てきた。カシオの「EX-Z1050」ってやつ。

カシオ デジタルカメラ オフィシャルWEBサイト | 製品情報 | EX-Z1050

picture 3

主なスペックと仕様は以下

  • 有効画素数: 1010万画素
  • レンズ: 光学3倍ズーム (35mm換算で38〜114mm、F=2.8〜5.1)
  • 液晶ディスプレイ: 2.6インチワイドタイプ (11万4960画素)
  • ISO感度: オート、80/100/200/400/800 (高感度モードではISO 1600まで)
  • 重量: 約125g (電池・付属品含まず)
  • 発売日: 2007年2月23日

当時のデジカメとしてはスペック高い方だったらしい。鳴り物入りで導入されたあまねきー家初のデジカメである(これ買う前は全部フィルムカメラで現像してたとかマジか

付属品含め箱が全部揃っていて(あまり使ってなかったので)バッテリーも全然使えたのでありがたく拝借した。

picture 2

エモい写真撮るぞ

外に出て色々パシャパシャ写真撮った。せっかくなので一応映えを意識して横浜みなとみらいにて撮影。当時としては最強スペックの2GBのSDカードを搭載したので怖いものなしである。

ファイル名バグってしまったので以下順不同で写真紹介する。

パタゴティタン日本初上陸と噂の恐竜展 image

恐竜デカすぎて全然画角に入らなかったwiPhoneの広角カメラに慣れすぎてた

image

どっかのJRの駅

image

横浜じゃないけどサンリオショップのハローキティたち

観覧車 逆光してて世紀末みたいになってるw

image

噴水 割とキレイに撮れてるのでは

image

遠くから見えるランドマークタワー

image

近づいて撮影したランドマークタワー 大きいね

picture 1

クイーンズスクエア横浜の中

image

中華街の町並み

image

image

image

image

よだれ鶏の写真 当時デジカメでご飯の写真撮ったことなかったけどどう頑張っても食欲のわかない飯テロ画像になる

image

比較としてiPhoneで撮影したよだれ鶏 フィルターカメラで撮ったのはフェアじゃなかったな(

image

みなとみらいの夜景 特に設定いじらずフルオートでの撮影だが結構きれいに撮れている

image

image

しかし上記の画像はあくまで成功例。大抵はブレてボヤけてしまう 

image

撮影してみて

以下雑感

  • 令和の現在を強制的に平成の写真にできるのはマジ楽しい
  • 現像しなくていいのは楽
  • 1000万画素謳っているだけあって当時のカメラにしては綺麗
  • がピンボケ率が半端ない 雑に撮ってちゃんとした写真にはなりづらい
    • 「はいチーズ!」の偉大さに気づく
  • 2.6インチワイド液晶(笑)がついているので画角と色味は確認しながら撮影できるが、ピンボケしてないかとか被写体が目つぶってないかはPCに転送してからのお楽しみになる
  • 画角が狭すぎる 今のカメラっていつのまにか広く撮れるようになっていたんですね

ということで実家にデジカメ眠ってたら発掘してみると普段スマホで撮影している写真とはまた変わった景色が撮れるかもしれないのでおすすめです。

picture 4

余談

古デジカメ需要によってメルカリでも売買が活発らしい。試しに見てみたら直近だとEX-Z1050は2万円で取引されてたw

picture 5

当時の定価4万円だぞ。。。

mdxで特定のコンポーネント以外は消すスクリプト

mdxで特定のコンポーネント以外は消すスクリプト

import { unified } from 'unified';
import remarkParse from 'remark-parse';
import remarkMdx from 'remark-mdx';
import remarkStringify from 'remark-stringify';
import { visit, SKIP } from 'unist-util-visit';
import { readFile, writeFile } from 'fs/promises';
import {MdxJsxFlowElement} from 'mdast-util-mdx-jsx';

interface ParentNode extends Node {
  children: Node[];
}

// MDXファイルを処理する関数
async function processMdxFile(filePath: string): Promise<void> {
  try {
    // ファイルを読み込む
    const content = await readFile(filePath, 'utf-8');

    // unified処理パイプラインを作成
    const result = await unified()
      .use(remarkParse)
      .use(remarkMdx)
      .use(() => (tree) => {
        visit(tree, 'mdxJsxFlowElement', (node: MdxJsxFlowElement, index: number, parent: ParentNode) => {
          // <Demo>コンポーネント以外を削除
          if (node.name !== 'Demo') {
            parent.children.splice(index, 1);
            return [SKIP, index];
          }
        });
      })
      .use(remarkStringify)
      .process(content);

    // 処理結果を元のファイルに上書き保存
    await writeFile(filePath, result.toString());

    console.log(filePath);
  } catch (error) {
    console.error('error', error);
  }
}

// 使用例
processMdxFile('src/pages/core/pin-input.mdx');