cURL と file_get_contents と Photoshop と

奈川に旅行している間、プログラミングをしていたと書いた。そしてその日記の中でどうしても動かないので組み直すことになったとも。その組み直す件が上のツイートだ。WebAPI といってネットワーク上で利用できるようにした機能群というものがある。これは様々なサービスを提供している会社が用意してくれている。
たとえば Twitter なんかはこの WebAPI があるおかげで、サードパーティのソフトやサーバなんかがツイートをしたり、色んなツイートに関する統計をとったりすることができるのだ。Facebook しかり Google なんかの様々な機能を利用するにはこの WebAPI というのが公開されていて、それを叩くことによってその会社がもつ機能を第三者であるボクらが利用することが出来るのだ。

でね、PHP で WebAPI を叩く(呼び出す)方法ってのはいくつかあって、ボクは手抜きが大好きなので、その中でも file_get_contents という命令を使ってやっている。これで今まで失敗したことはないし、それこそ大手ゲーム会社が提供する WebAPI も叩いてきたし、そのためのライブラリもすでに作ってあった。
ところが今回の仕事では、これがサッパリうまく動かない。
何度見直しても、悪いところが見つけられなかったのだ。

そこでもう一つのアクセス方法、cURL という命令に置き換えてみたら、渡すパラメータは一緒なのに動きましたよっていう話。えー……。そもそもボクの作ったプログラムからデータを受け取る相手サーバにとって、file_get_contents も cURL も大差ないはず。規格に定められてデータを渡しているだけなんだから。
でも、file_get_contents だとうまくいかなくて、cURL だとうまくいく。
何かが違うんだろう。

そしてその違いがわからないまま、WEB のプログラムを続けていいのか、ヲレ?<ヲイ
ちゃんと調べる必要があるよなぁと思いつつ……とりあえずクライアントの要望通りのプログラムは書けた。

ところで Adobe Creative Cloud の 2018 年版がリリースされた。いや 2019 年版か?w
よくわからんが、とにかく全てのアプリが一新された。
ここでボクが求めるのはただ一つ、Windows 版 Photoshop  で HEIF 形式のファイルが読めるかどうかだ。そして読めなかった……orz

これはもう Adobe は故意に対応するつもりがないで間違いないだろう。こまったなぁ……なんで対応させないんだろう??

Windows Server の証明書サービスを復旧させる方法

amatsukami.jp サーバの SSL 通信部分はボクしか使わないため、オレオレ証明書を使っている。この証明書はボクが勝手に発行したので、他人がブラウザで開くとエラーが出る。ボクのためだけの物なので今の所は問題が無い。
でね、この勝手に証明書を発行するシステムが Windows Server にはあるわけだけど、ftp の証明書の期限が切れていたので更新しようとしたら更新ページがエラーで表示されない。なんだこれ?? 何かいじったかなと思っていじって見るも特に設定は問題なさそうに見える。

エラーの内容は、web.config ファイルが見つからない的な内容なのだが……う~ん、あるよなぁと思っていろいろ調べて見ると、本来あった場所の web.config を見に行かずになぜか C:\Windows\System32\certsrv\ っていうフォルダを参照しに行ってた。

なんだこりゃー!?

何かのパッチでそういう設定に変わったのかしら? Windows Server 2016 や 2019 がそうなってるとか?

そんなわけで C:\Windows\System32\certsrv\ に関係するファイルをコピーしたら普通に動くようになった。もー!

もう一つトラブル事。今、仕事で組んでいるシステムがだいぶ完成してきて、色んな人がアクセスするようになった。ボクはサーバ上のファイルを直接編集していたんだけど、それだとボクのミスでうまく動かなかったりすることがある。そんなときに他の人がアクセスしに来ると、動かないぞってことになってしまう。

そこでボクの開発機にウェブサーバを立ち上げて、開発はそこでやることにし、今のサーバはちゃんと動くものだけ更新することにした。そこで自分のマシンに IIS を入れて PHP を入れて MySQL を入れたんだけどこの時、MySQL の Version 8 を入れてみたのね? SQL 文なんてのは共通だし、別に何か問題が起きるなんてことはないだろうと思って、この新しい開発環境に今まで開発してきたソースファイルをぶっ込んだから、いきなり動かないwww

おい。

エラー内容は SQL 文の Syntax エラー。構文エラーだ。単純にスペルミスとかそういう系のミス。えー、そんなバカな、ちゃんと動くソースですぜ? 間違ってるわけないじゃん、と該当する SQL 文とにらめっこするもどこがおかしいのか全く解らない。
そりゃそうだ、元の環境では動くんだもの。

これは MySQL5.6 系と 8 系で何か根本的なことが変わったのか?
とはいえ SQL 文は規格化されていて、MySQL のバージョンが上がったからと言って勝手に変えていいものじゃない。まぁでもダメ元で調べて見たら、MySQL 8 から新しい内部関数が増えていることが解った。そしてその増えた関数の名前が今回のシステムで使っているカラム名と同じだったのだ。
つまり MySQL はそれを命令だと解釈していたため、エラーになっていたのである。
もー!

解決策はこのカラム名を別の名前に変えるか、カラムを必ず ` で囲むか。
まぁ開発中のものなんでカラム名を変えたので良かったのだけど、ボクの中で意味が定着してしまっていて他の単語がすぐにおもいうかばなかったので `で囲んだ。すると問題なく動いた。

下の写真は大戸屋のカツ煮定食。大戸屋ってセントラルキッチンじゃないのでカツ煮もホクホクとイイ感じのが出てくるんだろうなと思って頼んだんだけど、脂でベチョベチョのカツだった。残念。

妹にジト目で見つめられたい

 

妹にジト目で見つめられたい。妹なんていないけど。
そうなんだよなぁ、最大の原因は 10 代の妹がいないってことなんだよなぁ(何
妹ジト目全集とか作りたい。色んなシチュエーションでジト目される画集。

でもお兄ちゃんは解ってるんだ、たとえ着替え中に間違って妹の部屋に入ってジト目されても、心の中では「やっとお兄ちゃんが襲いに来てくれた!」って心ではドキドキしてアソコがジュンと来ちゃってるってことを!<病気

もしくは部屋でオナニーしてるところを妹に見つかってジト目とか。でも心の中では、「言ってくれれば、あたしが手伝うのに! 何一人でオナニーしてんの? 信じらんない!」って思ってるから! 間違いないから!<重病

ボクのお気に入りの妹のジト目、置いておきますね。

昨日萌え時計をいじったとき、ついでに画像の品質を上げるために JPEG から PNG にしてみたんだけど、転送量が 3.5 倍くらいに増えた(笑)。一日だいたい 400MiB ~ 500MiB くらいなのが余裕で 1GiB を超えてしまった。
というわけで、また JPEG に戻した。ただ今まで 80 だった圧縮率を 100 にしておいた(数値が高い方がキレイらしい)。でもぱっと見、差はよく解らなかったり……。

知人から教えて貰ったダイナーを巡る TV 番組。アメリカ人ってバカだなーってのがよく解る動画なのだが、やっぱりデブ(ボクの事)はすごいね、どれも美味しそうに見えちゃうwwww ダメすぎるwwwww
シナモンロールに SPAM やらベーコンやら卵やら詰め込んでさらに揚げたりとか、ホットケーキにこれまたベーコンやら卵やらを詰め込んだものとか……スゲー、すごすぎるよ。なんか 2ch のスレでさ、日本に留学に来た体重 200kg のデブが日本でも腹一杯毎日食ってたらどんどん痩せていったっていう話があってさ、アメリカの食い物ってどんだけ高カロリーななのよって思ったんだけど、この番組を見ればなっとくできる。

ドラえもんの道具がエロい件について

今開発中のウェブアプリのダミーデータをご覧ください(ぁ

特に話題がないので、今開発しているウェブアプリについて。PHP + HTML5 + Javascript + MySQL で開発してるんだけど、会社でやってる仕事も、構成は同じでしかもボクが個人的に作っている方のウェブアプリの機能を一部移植するだけで済むので、自分のと会社のと同時開発している。

でね、あらかた組み上がったので、データーベースのとりあえずのデータを登録して動作を確認しようとしたんだけど、ハテ、どんなデータを入れようかと思って思いついたのが、ツイートの通りである(ぁ

ドラえもんの道具ってエロいことにも使えていいよね!
っていうかさ、このままのび太が思春期を迎えた時のドラえもんの対応がすごい気になる。
周囲のみんなが童貞を捨てていく中、のび太もドラえもんの力で何とかしようとすると思うんだけど……やはり初めての相手はしずかなんだろうか? まぁそんなことは考えてもしようがないことではあるが。

そんなどうでもいい話。
さらにどうでもいいが、しずかって確かのび太が情けなくてこのままだと可哀想だからとかいう理由で結婚してくれるんだよね。まぁ別にそれはいいんだけど、そんな女の子で見てくれもそこそこ良かったら、たぶん中高大のどこかでチャラ男に騙されてサセ子になっちゃって、20 代の頃にはかなりスレてそう……とか思ったんだけどどうだろう?<偏見
エロ漫画の見過ぎ??(そこかよ

ウェブアプリ開発、色々

正式にはまだ発表出来ないんだけど、ウェブアプリをまた作り始めている。今度のはかなり規模が大きいので、言うだけ詐欺になりかねないのだが、まぁとりあえず(ぉ

HTML と Javascript で画面を作っていたんだけど、縦で使ったときと横で使った時を%だけで表現出来るかなと思ったら無理だった……orz あと上のツイートの立ち絵あるじゃない? この立ち絵をタップできるようにしたんだけど、抜けはタップしても反応しないようにできるかなーと思って調べたら、それをやるには canvas を使わないといけないらしい……。めんどくさい。最近 canvas 使わなくてもイロイロ出来るようになったので、canvas 使うことを考えてなかった(汗)。

ところで、前回当てた大型アップデートから Egde の挙動が変わった。何度更新押しても、CSS と Javascript が更新されない。くそー。仕方ないので、デバッグ画面から常にサーバを読むようにして使ってるけど、これ、普段使いにもどるときにはいちいち OFF にしないとダメだよね? もー……。

最後に、今日は三軒茶屋にある音楽団の PC を診てきたんだけど、その帰り、浅草橋に戻るのに首都高を使ったんだけど、至る所(ジャンクションとか出入り口とか)で検問やってた。検問と言っても、たぶんだけどカメラで撮ってるだけなのかな? 警官と移動交番らしき車両がところどころに配置されていた。ああいう検問の方法もあるんだなぁ。

クラウドに頼らずに iPad を使う with オレオレ証明書との戦い

 

さて、iPad をいかにノート PC の様にして使うか、それが iPad を初めて手に入れたボクの最初の使命である。iOS はバカ素人でも使えるように、様々な PC 的概念が見た目上排除されている。例えば撮った写真は写真アプリでしかアクセス出来ない。他の写真加工ソフトとかで見ることができないのだ。
これはアプリとデータをセットで隔離することによって、セキュリティを高めることが出来るからだ。別のソフトが勝手に他のアプリのデータを読んだり、また他の場所にコピーしたり出来ないようにしているわけだ。

この制限はあくまでも見た目上であり、中身は PC と同じなので、フォルダ(ディレクトリ)があり、ファイルがある。そして上記の制限を完全に守ると使いにくいので、他のアプリが写真にアクセス出来るように許可を出す設定が出来たり、他の場所にコピーをする許可を出す設定ができたりする。

さて、ボクの場合は amatsukami.jp サーバに開発に関わるあらゆるデータが置いてある。これは iPad からするといわゆるクラウドに相当する。要するにボクは 2000 年頃からすでにクラウドみないなことをやっているわけだが、iOS 上のアプリはこの独自クラウドには対応していない。Google DriveiCloudDropbox などの有名なサービスには対応しているが、ボクが個人的に立ち上げたクラウドにはアクセスする手段を用意していないのだ。

じゃぁ Google Drive などのサービスを使えばいいじゃないかというと、そう簡単にはいかない。まず容量が足りない。ボクのサーバはプロジェクト用だけでも 8TB 用意してある。Google Drive で無料に使えるのはその 1/1000 以下の 5GB である。そしてもう一つ重要なのが、エロゲのデータが置いてあることだ。
エロゲの画像データは海外からしたら児童ポルノに認定されてしまうことがよくある。Google などが勝手にボクのデータをのぞき見て、エロゲのデータを児童ポルノだと認定したら垢バンどころかそれ以上の面倒なことになりかねない。

そう言った理由で、自宅サーバにデータを置いているのである。

でね、Googe Drive とかも別に特殊なことをやっているわけではなくて、内部ではインターネットで規定された汎用の技術(WebDAV など)を使って実現されている。と言うことはつまり iOS のアプリ側も汎用的な技術を使って Google Drive とかにアクセスしている。
そこで汎用的な技術を使って iOS とその他のサーバとをやりとりできるアプリを間に挟むことによって、自宅のサーバのデータを iPad で読み書きするように設定できた。FileExplorer というアプリだ。このアプリは、様々なアプリがファイルを開くとき、この FileExplorer が選択できるように設計されているようだ。そのため、アプリからファイルを開くとき、FileExplorer を選べば FileExplorer がアクセス出来るファイルを読み書きできるという具合だ。

ところが iPad 側でいろいろとファイルをいじれるようになったものの、問題が起きた。それはフォント(笑)。ボクの開発用 PC には相当数のフォントが入っているのだが、iPad にはないし、そもそもそんなにたくさんのフォントを入れることは出来ない。
結局印刷物を作ったり、バナーを作ったりするのには全く使えなかった(汗)。

ただ、よくわかんないんだけど、PC で作ったファイルを読み込むと、Adobe や Office はどこからかフォントを読み込んでくれるようだ(アプリ起動時に、本体にないファイルを読み込んでいますみたいなことが表示される)。

さて、ここまではまずまずの結果と言ってもイイだろう。
問題はその次である。それはオレオレ証明書だ。amatsukami.jp の通信を暗号化するための証明書は公的なものではなく、ボクが勝手に発行したものだ(笑)。別にボクだけが使うものだし、暗号化さえされていればいいのでちゃんとした証明書はいらない。それにこのオレオレ証明書を iPad に登録すれば、ボクの iPad だけ公式な証明書となるのだ。
ところが、これが何度登録しても実際に使おうとするとオレオレ証明書になってしまう。コレは困った。iPhone ではすでに同じことをしてあって、そっちではちゃんとエラーも出ずに公式な証明書として使えているのに、なぜか iPad ではダメなのだ……。そのためボクの仕事で使っているサイト(redmine とかグループウェアとか)までエラー表示されてしまう。

困ったなぁ……いったい何が原因なんだろうか? っていうかもう公式な証明書をとるしかないんだろうか??

与太話。ボクは今、趣味でも仕事でも PHP でプログラムを組んでいるんだけど PHP で扱う日付は UNIX 時間という 1970 年 1 月 1 日から何秒経過したかっていうデータなのね。でもそれだと何が何だか解らんので、この秒数を「○年○月○日 XX時XX分XX秒」に変換して使ってる。

ところが、この年月日を計算するとなると(例えば今日は 2017 年 7 月 11 日から何日が経過しているかとか、2018 年 12 月 13 日引く2001 年 10 月 9 日は何年何ヶ月何日間なのかとか)、UNIX 時間のままの方が楽だ。ただの秒数だから、秒数同士を足したり引いたりするだけで OK だからだ。

しかし一度貰ったデータは「○年○月○日 XX:XX:XX」っていう形式のデータに変換してしまっている。

上の strtotime という関数はこの「○年○月○日 XX:XX:XX」っていうデータから UNIX 時間に戻してくれる関数なのだ。コレのおかげで時間計算が凄く楽になって助かったーっていう意味が上のツイートには込められているのであった。

WB-BT300 とか PHP とか VPN とか

Twitter から拾った、コンピュータ関係の話。

iPhone の音を PC の音とミックスして出したくて、使っていなかった Bluetooth レシーバを引っ張り出してきた。Onkyo の WB-BT300 という機械だ。コイツはなにをする機械かというと、iPhone など Bluetooth 対応機からは音響装置に見え、WB-BT300 に対して音声を飛ばしてくれる。WB-BT300 は iPhone からきた音声を、デジタル信号かアナログ音声信号に変換して出力してくれるのだ。

で、会社の開発機には TEAC の US-366 というミキサー兼 USB 音源があるのでそいつと接続すると、PC からの音と iPhone からの音をミキシング(混ぜて)出せるようになるのですな。ちなみに US-366 と WB-BT300 は光デジタルケーブルで接続。

ところが、iPhone からの音しか出ない!! なんだこれ??

原因は WB-BT300 のデジタル フォーマットがサンプリング周波数 192kHz、量子化ビット数が 24bit のせい。このフォーマットは統一しておかなければならないのだが、たかが Bluetooth の音声受信装置でなんでこんな高い設定なんだwww
ちなみに CD はサンプリング周波数が 44.1kHz、量子化ビット数が 16 ビットだ。CD よりも音が悪いクセにデータ量は CD の 6.5 倍もあるwww

仕方がないので PC 側の出力も 192kHz の 24bit に設定した。こうすることによって無事 PC と iPhone の音が同時に出るようになった。

某絵描きから、イベントの福引きみたいなクジをデジタル化できないかという依頼があり、ごりごりと PHP と HTML と Javascript で作った。今流行の HTML5 というヤツだ(ぁ
中身はすぐに出来た。そりゃまぁ、そうか。クジ振るだけだから、出た乱数が何等賞なのかに変換して表示するだけである。

問題は管理画面である。単純にクジ、と言っても誰でも彼でもアクセスしてクジが引けるというワケにはいかない。以下の様な機能が入っている。

  • ユーザ登録して、ユーザ登録した人がクジを作れる
  • クジはいくつでも作れる
  • それぞれのクジには 1 ~ 10 等賞まで設定でき、さらに残念賞、参加賞が設定できる。そしてそれぞれの賞及びはずれがいくつあるのか設定するようになっている。
  • QR コードの表示
  • クジを引く画面を Javascript でアニメーションさせる。
  • 何等賞が出て、残り何の賞がどれくらい残っているかリアルタイムで監視する、モニター

使い方はユーザ(主催者)がクジを作ったら、そのクジを iPad などの端末で表示し、お客さんがそれをタップしてクジを引くというものだ。
さらに QR コードを吐いて、それをお客さんが撮影してクジを引くという機能もつけた。この場合、ちゃんと一回しかクジは引けないようになってるのだが、残念ながら Javascript では機種固有の識別番号を取得できないので、cookie になってしまった。そのため、cookie を消去すれば何度でもクジは引けてしまう。

ツイートでの愚痴は、HTML というかサーバのプログラムは一回一回が初めてのアクセスになるというか、仕組み上、同じ人が何度アクセスしようが、サーバ側は初めての人が初めてアクセスしたことにしかならない。
今アクセスしに来た人が前の○○という場所にアクセスしに来て、今のアクセスはそれの続きであるということは実は認識できないのだ。それを実現するために、cookie やらセッションやらっていう仕組みがあるのだが、とにかく一回一回のアクセスがすべて関連を持たせられないので、渡す数値だのなんだのも全部もらい直さないといけないので、プログラミングがすげーめんどくさいっていう話。

これが普通のプログラムだったら、さっききたアクセスは変数に残ってるし、その変数を参照して関数を呼び出せば済むんだけど、PHP だとアクセスが来るたびにプログラムは先頭から実行されてしまうのだ。

あと処理は PHP なんだけど、それを表示するのは HTML なのね。組み方としては PHP が処理の結果に応じて HTML を吐き出してるワケなんだけど、そうなるとプログラム ソースの中に PHP と HTML が混在してけっこう美しくない結果に……。今回は仕様書も何もないままテキトーに作り始めてしまったので分離されてないのだけど、予定してたより大きなプログラム(PHP 部分で 2000 行程度、Javascript が 500 行程度)になってしまったので、今後は気をつけたい(汗


(MP4 / 750×1334 / 25fps / 1’05” / 126MB / iPhone)

amatsukami.jp サーバの様々なサービスは、色々がんばって外に出してるんだけど、それでもやっぱり一部の機能は VPN を張らないと使えない。そのたびに端末(iPhone など)から VPN を張ってるんだけど、けっこうめんどくさい。
モバイル WiFi ルータに VPN を張る機能があれば、端末でいちいち張らなくても済むのになぁ……。