VAddy2019-05-29Stripeのクレジットカード入力フォームで郵便番号入力を不要にするstripe.jsを使ったフォームを構築すると、例えばVISAのカード番号を入力した時に動的に郵便番号フィールドがでてきて、そこも必須入力欄となる。trueを渡すと郵便番号欄はでなくなる。true});このドキュメントのcardタイプのオプション指定欄に説明がある。18:05Stripeのクレジットカード入力フォームで郵便番号入力を不要にするTweetもっと読むコメントを書く2019-04-02PHPerKaigi2019で自作ファミコンエミュレータの話をしてきたら最高だった(前編)PHPerKaigi2019で登壇してきました。全体の感想などは後編に書きます。カンファレンスで発表するのは3年ぶりぐらい。今回はPHPのファミコンエミュレータ実装をGolangで写経してた時の話をしてきました。Rustなどたくさんの実装があり、厳密に決まってるCPUやメモリの仕様を元に実装されてます。その実装を通してコンピュータアーキテクチャの理解が進む、低レイヤーの入り口に立てる、という柱を立てて発表しました。ichikawaywww.slideshare.net登壇後は、ファミコンエミュレータに興味を持った、作ってみたいというフィードバックを頂きました。今回の発表のゴールに到達できたかと思います。Speakerというシステムがあり、そこでファミコンのソフトを作ってたさっぴーさんとお話できました。土曜日の懇親会(茶会)では、これまたファミコンのソフト制作に関わっていた郡山さんの昔話が聞けたり、それを起点にkoyhogeさんの昔話も聞けたり、最高の体験になりました。ファミコンのソフト作ってた人が二人も会場にいるって、考えるとすごいですね。PHPerKaigiは、正しいこと、完璧なことを一方的に話して終わる場ではなく、議論や交流ができることが重要というスタイルになっているので、発表者としては非常にありがたい場になります。間違ったところがあったとしても、それは問題ではなく、その後に議論ができて正しくなれば良いだけなのです。そもそも、この内容で応募する時点で、私より詳しいPHPのファミコンエミュレータ作者がいるのがわかってますし、マイコンやアセンブラをバリバリやってたという方もちらほらいるので、発表するまですごく不安でしたが、発表することで私より詳しい人から色々なお話がきけて、それが共有できるのであれば、こんな素晴らしいことはありませんね。登壇後も、Twitterでここがちょっと間違ってるよというツイートもありました。ファイルの構造じゃないかな。カセットは先頭からいきなりプログラムROMから始まる気がする。そんでPC初期値が0x8000で。2019メモリ空間にマッピングされるのは0x8000-0xffffまでの32KB固定じゃないかな。(実際にはもっと小さいかもしれないけど。)そして、もっと大きいROMカセットの場合、0x8000-0xffffの間のどこかに何かを書き込むとマッピングされる内容が変わる、という。ヘッダは「このカセットがどんなマッパ(どこに何を書き込むとどうなるパターンか)なのか」という情報を持っている。物理カセットはカセット自身のハードウェアとソフトウェアがそれを知っているのでその情報は(ファミコン本体は)知る必要が無いので不要。2019色々な知見をいただけて最高でした。(エミュレータを作り始めた頃はハードウェアの知識がなさすぎて、このような意見をもらっても理解できなかったかもしれない)スカイラブハリケーンもう一つ、最高な体験がありました。さんが「コンパイラ作りの魅力を語る」という話をしていました。fortee.jp私が作ってるファミコンエミュレータはGo言語で実装しています。@DQNEOさんは自作のGoコンパイラを書いてます。@DQNEOさんから、彼のコンパイラで私のファミコンエミュレータをコンパイルして動かしてみましょう、という夢の提案がありました。2019内部でパッケージを分けてたため、残念ながらうまくコンパイルできませんでした。そこが未実装だったためです。今後、そこが実装されたら動きそうなのでワクワクしますね。こんな素敵なコラボレーションがあるとは、もう大興奮ですね。2019進捗がありました!前編のまとめPHPerKaigiでは、議論や交流の場がうまく設けられていて、発表者としては最高の体験ができました。私は低レイヤーの知識が乏しく、ファミコンエミュレータだって移植してみただけで、完全に理解している状態ではありませんでした。登壇するまでは不安で、何度もスライド変えたり発表リハーサルしたりしました。いま思うのは、完璧な状態や強い状態になってから登壇するよりも、ある程度の知見や経験がたまり、伝えたいという想いがあれば、とにかくピッチに立つことが大事なんだなと感じます。PHPerKaigiのようなスタイルのカンファレンスには。来年PHPerKaigi2020があるのであれば、絶対に登壇者応募するのをオススメします。23:44PHPerKaigi2019で自作ファミコンエミュレータの話をしてきたら最高だった(前編)Tweetもっと読むコメントを書く2018-12-10URLにアンカーの#(シャープ)がある場合に送信されるGETリクエストURLに含まれる#(シャープ)は、ページ内リンクアンカー、ハッシュ、フラグメントなどの名称があるが、#が入る場合のGETリクエストはどのようになっているか。/foo/bar/というURLパスでリクエストを送る。#以降の文字列はレスポンス取得後にJavaScriptやブラウザが使うものとして扱われる。curlコマンドで上記のようなURLにリクエストを送信し、tcpdumpして確認。最近、趣味でファミコンエミュレータをGo言語で実装しています。:)私は下記のPHP実装のファミコンエミュレータを読んで、PHPなら読める・・読めるぞ!と思って写経しています。勉強し始めたgolangで実装をしています。Worldですが、そこにたどり着くまでにファミコンのROMデータのロード、CPU命令の実装、PPU命令の実装までをやる必要があります。プラモデルを毎日コツコツ作っている感覚です。intでもすべてint型になっています。そのため細かい型のところや、書いている内容がわからない場合は他の言語実装も読みます。読んでるのはRust実装のこれです。github.comRustの文法は知らないし、コードも読んだことなかったのですが、問題なく読めました。ファミコンエミュレータに使われるコードはビットの演算やデータの管理(クラス・構造体)、バイト列の操作、条件分岐がメインになるため基本的な言語文法のみが使われているためです。いうキーワードを組み合わせると便利です。golangで書いてても使っているのは、構造体、レシーバ、ビット演算、条件分岐、byte操作ぐらいです。新しいプログラミング言語を覚えるのにファミコンエミュレータを実装するのは良い練習になります。CPUやメモリのこと、アセンブラのこと、写経しながらこれらも学んでいけますので、ハードに近い場所での操作がどうなっているか体験できるのは面白いですね。Worldを出力するまでは、まずはこの記事を読むべしという感じです。qiita.com私はもう何回も読んで、毎回、なるほどわからん!って感じを繰り返してます。今はプリンタで印刷してカバンにいれて暇な時に読んでます。それでもわからないまま写経しながら実装してると、だんだんとわからん!の範囲が小さくなっていきます。この感覚は楽しいですね。1ヶ月以上も実装しつつ、わからないことが多いですが、最近このように分からないものに長い時間をかけて挑戦することがしたくて、ファミコンエミュレータは良い題材となってます。amazonlinuxベース普段はdocker-composeで操作していても、たまに使い捨てコンテナを扱いたい時がある。そんな時にdockerコマンドだけで済ませる方法。dockerイメージの作成、コンテナ起動、コンテナのシェル操作、コンテナ削除の説明。.コンテナ起動nameオプションでコンテナの名前をつける。-fを使ってコンテナを起動し続ける。