失望の土曜日

先週の土曜日 午前中の外来診療を終え、午後にいそいそと自転車で「栄和堂」に向かいました ところが、その日は午後店じまいだったのです どうやらその夜に「栄和堂」の中で小規模な演奏会が開催されるための準備でお店を閉じていたのです がっかり とぼとぼと帰宅しました

ところで、何時も忘れてしますますので記録しておきます

$### pipそのものを upgradeする

$pip install --upgrade pip


$### pipでインストールした package全てを upgradeする

$pip-review --auto

何時も忘れてしまうので記録しておきます

 

今日は楽しい土曜日

今朝は朝から小雨です しかし歩いて病院に来るのも時間かかる(45分ぐらい)のて、雨の中傘もささずに自転車で来ました きっと午後は雨が上がっていることを期待したのです

今日は土曜日ですが朝から外来診療です でも雨だから患者さん来られるかなあ?

そして、その後は僕の解放される一時 「栄和堂書店・カフェ」での一人で開放された時間を過ごすのです 本に囲まれた中、少し濃い目のコーヒーを飲み、その日によってお腹が空いたと思えば、トーストサンドを食べ、そして何より重要なのは MacBook Proを立ち上げてインターネットにつなぎ kamakuralive.netの home page programの改良を行うのです

そのためにも自転車で通勤が必要なのです だって自転車の方が歩いて栄和堂に行くよりも何となくかっこいいでしょ?

みんな XAMPPをやめて MAMPにしよう

ここ数日すったもんだしてようやく解決したのが、MacBook Proおよび、SurfacePro 4の上での local web serverの設置でした もちろん、各OSに備わっている Apacheなどを立ち上げて、正しく設定すれば Web Serverは立ち上がりますが、その後、MySQLに設定、PHP/Python/Rubyなどの設定 さらには phpmyadminの設定など、とてもややこしく複雑な操作が必要なのです

これらのややこしいことを一気に解決してしまうものとして、これまでは XAMPPの天下だったのです これで簡単に Apache/PHP/MySQL/phpMyAdminなど全て設定し立ち上げることが可能だったのです

しかし、状況は Windows10のある versionから変わりました 全体的に OSの securityがとても厳しくなったのです もちろん、これは MacOSにも当てはまる状況です その結果、僕の SurfacePro4-Windows10では今までの XAMPPが作動しなくなり、困惑したのです ここらへんの状況については ここに記載しました

そして、MacOS High Sierraになって、ついにこれまで MacOS Sierraで作動していた XAMPPが作動しなくなったのです それをここ数日の努力の結果克服したのです

結論は、現在自分のパソコンで Web開発するのであれば、XAMPPでなく、MAMPを導入して立ち上げること、XAMPPは uninstallした方が賢明、ということです

諸々がようやく解決

昨日来仮想Web Serverの立ち上げに苦労してきました そもそもの発端は、MacOSを High Sierraに upgradeしたからなのです

それと同時に MacBook Proで立ち上げていた XAMPPが立ち上がらくなりました 色々調べたのですが、どうやら XAMPPは十分に High Sierraとに互換性がとれていなようなのです

そこで次にとった手段は MAMPをインストールすることでした MAMPに関しては、High Sierraとの互換性が保証されていたのです しかし、そこからがまた困難なのでした IP address 127.0.01 Port 80が専有されているというエラーが出てくるのです

そもそも この IP/Portは httpとか Skypeにとられているものであり、僕はその両者を使用していませんでしたので、何故この IP/Portが専有されているのか理解できませんでした

そこで、Macで port scanを行ったところ、確かにこの IP/portは httpにより専有されてたのです 「まさか」と思い、ブラウザで localhostと打ち込むと、何と It Works!というリスポンスが戻ってきたのです

何と MacOS High Sierraでは defaultで起動時に 内製したApache Web Serverを立ち上げるのでした これにはまいりましたねえ

早速 $sudo apchectrl stop と打ち込みこれを止めました

そうすると、MAMPが無事 port 80で立ち上がったのです もっとも MAMPでは駄目で、先に MAMP-Proを立ち上げねばならなかっのです

もう一つの問題はどうやって 内製 Apacheの自動起動を止めるかなのです Sierraまではその方法がかかれているのですが、High Sierraでは未だ見つけることができないのです まあ時間が経てばユーザーが増えて、その方法を誰かポストしてくれるでしょう

さて、これで Macは片付いたのですが、同様のことを SurfacePro4 Windows10でも行いたかったのです 既に互換性のある XAMPPをインストールしてあったのですが、MAMPに挑戦しました

何と再び port80で競合したのです しかし、port scanかけてもそんなことはありませんし、Skypeも Apacheも立ち上げていません 試しに localhost と打ち込んでもエラーとなるのです

訳が分からず何回かしている内に、今度は port 80で Apacheが MAMPの中から立ち上がりました 何にせよこれで解決です

要するにココらへんの Web Serverを立ち上げる、というのは相当にややこしいことを行っているようです 自分の生半可な知識では理解できないような世界ですね まあ目出度し目出度し

ついに解決

色々とありました それはそれは長い旅路でした でもついに解決しました MAMPを立ち上げ、新たにDocumentRootも設定し、phpmyadminとの接続、PHPからの MySQLへの接続 その全てに成功しました

途中どんな作業をしてどのように考え、どのように解決してきたか 本当はその記録が大切なことは分かっていますが、とてもとても途中経過を記録していく余裕が無く、全て忘れてしまいました

まあ仕方ありません それでもようやく復旧です 素晴らしい

障害は立て続けに起こる

さてさて、MacOS High Sierraに 9月末に upgradeの報が流れました 暫く様子見ていたのですが、あまり悪い噂も聞こえませんでしたので、思い切って昨夜 download – installしたのです

快調に動いていました しかし しかし 大きな問題発生です 仮想Web Serverを立ち上げている XAMPPの componentの中で Apache Web Serverが立ち上がらなくなったのです これはある程度予想はしていました High Sierraの securityがきつくなっているからです

そこで、最新の XAMPPを downloadしたのですが、今度はこの中に htdocsなどがありません 一体全体どうやって phpmyadminを立ち上げたり、DocumentRootをどうやって設定すれば良いのか さっぱり分かりません Webで検索しても未だHigh Sierraが新しいからでしょうか 検索にヒットしません

そこで、もう一つのやり方である MAMPを download installしたのです 今度は DocumentRootの設定もあるし、htdocsもあり、さらには phpmyadminもOKです

これで解決と思ったらば、それでもWeb pageが作動しないのです

そうこうしている内に、何と www.kamakuralive.netのトップページが動作していないことに気づきました 突然の如くです多分ここ一日以内のことです

何でぇ~ です 何も悪いことしていないのにー です

悪いことには、仮想 Web Serverが立ち上がらなくなっているので MacBook Proでプログラムのテストができないのです あーーーーー 呆然としました

そして、どのようにすれば復旧に近づけるのか? それを考えました

最初に試みたのは、MacOSの本来の Unixで Apache/MySQL/PHPを立ち上げることです そこで High Sierra/Apache/phpmyadminで検索したところ、最新のものとしてここに行き着きました

これを見てやりました かなりスキルが必要です しかし しかし それでも localに立ち上がらないのです もうどん底です

最後の手段として 外付け diskに backupしているファイルをコピーしてそこから操作開始、ようやく復旧しました

しかし、正直未だに原因が良く分からないのです 攻撃かも知れませんね

まだ、MacBook Proに local web serverを立ち上げることに成功していません

いやあ 困難を極めました

Webでプログラムを開発する時には主として MacBook Proを用いています もちろん OSは MacOS (Unix)ですが、Unixには最初からサーバーとか、phpとか色々入っているのですが、僕は XAMPPをインストールしてそれにより local serverを動作させながらテストおよび開発をしています

5年ぐらい前までは、VAIOで開発していました つまり Windows7でです、これはこれでなかなか良かったのですが、local serverはやはり Windows版の XAMPPを用いています

ご存知の方も多いと思いますが、以前のXAMPPでは最初に立ち上げると security画面が表示され、 passwordなどを設定しなければサーバーや MySQLが立ち上がらなくなっていました これは非常に良かったのです

しかし、MySQLが community editionの MarinaDBに変更となったのに併せてどうもこの security設定画面が無くなったのです

久しぶりに SurfacePro4 つまりバリバリのWindows10 machineですが、これに XAMPPをインストールしてこのような経緯を知らなかっただけにハマってしまいました 解決に6時間かかりました

結局、これらのややこしい security設定をせねばならなかったのです 色々調べてようやくこのページに遭遇し、その通りに行い解決しました 今では localでも http://localhost/kamakuralive.net/が作動します 本当にありがとうございます

そうとうにプログラミング

この二週間ぐらい 自分が昨年作ってきた www.kamakuralive.net の Home Pageプログラミングを改良してきました

非常に過激な改良をしてきたので、その間 Webに見れるものは無視してきました

そして自分が書いたプログラムのロジックを紐解き、改良を加えてきました ようやく段々と者になってきました このような論理的仕事僕は大好きです 大好きなのです

わーあいっ 解決

これまで VisualStudio Codeのメニューが日本語であっのに、updateしてからメニューが英語になってしまいました 「どうしてだろう?」「どうやれば治るの?」とか小さな心臓で悩んでいたのです

でも本日解決策発見しました ここに書いてありました この通りしたところすぐに日本語メニューとなりました 目出度し めでたし

Python関数引数に関する考察

どうしても訳が分からないことがありました 要するに Pythonでの関数の名前空間が分かっていなかったのです 特にリストを引数で渡す場合です ここには、「リストの場合関数内部でグローバル変数を変化させれば、関数から出てもその変化は引き継がれる」というように記載されています

ところがこのテストプログラムではそのようにならないのです

from bitstring import ConstBitStream
from defTag import jpegTag

DHTs = []
print("DHTs: {}".format(id(DHTs))) #A

def searchTags(DHTs):
    xa = ConstBitStream(filename='xa1.dcm') #B
    print("DHTs: {}".format(id(DHTs)))
    DHTs = list(xa.findall(jpegTag['DHT'], bytealigned=True))
    print("DHTs: {}".format(id(DHTs))) #C


if __name__ == '__main__':
    searchTags(DHTs)
    print("DHTs = {0}".format(DHTs))

この場合、出力はA, B, Cの値(アドレス)が出力され、最後に゜カラリスト[]が出力されます そして興味深いことには A == Bであるにもかかわらず B != Cなのです つまり関数内で新たに変数が作成された訳です これは意図する動作ではありません そこで調べるとここに詳細に記載がありました これによれば、関数内で変数に変更を行えば、関数内の変数とグローバル空間の変数は同じアドレスを参照するようです そこで以下のテストを書きました

from bitstring import ConstBitStream
from defTag import jpegTag

DHTs = []
print("#A: {}".format(id(DHTs))) #A

def searchTags(DHTs):
    xa = ConstBitStream(filename='xa1.dcm')
    print("#B: {}".format(id(DHTs))) #B
    DHTs.extend(list(xa.findall(jpegTag['DHT'], bytealigned=True)))
    print("#C: {}".format(id(DHTs))) #C


if __name__ == '__main__':
    searchTags(DHTs)
    print("DHTs = {0}".format(DHTs))

これで走らせてみると当方での出力は以下の通りでした

#A: 4441990408
#B: 4441990408
#C: 4441990408
DHTs = [10352, 5398688, 6469600, 11807904, 17146912, 22482576, 27843824, 33224096, 38652544, 44104704, 49597104, 55103072, 60640800, 66181296, 71753056, 77315744, 82880880, 88431792, 93978432, 99509264, 105038752, 110572944, 116110208, 121646512, 127184304, 132726336, 138267056, 143811248]

これで意図した通りとなりました 要するに関数内で値を受け渡したいリストに変更を加えることにより関数内変数とグローバル変数が同じアドレスを参照したことにより参照渡しが実現された訳です