Because We Love Happy Coding

フリーライターがPHPとかJavaとか勉強してます

WordPressをDreamweaverで編集できるようにしたい から始まるMySQLクリーンインストール

前にWordpressDreamweaverで編集できるようにしようと思って、途中で挫折したんだったような気がする。今ならだいぶ成長したしひとりでできるもん。でもwebは参考にするけど。

環境はMac OS X Yosemite 10.10。

どこまでやったんだったか調べてみたら、どうもローカルのPHP起動とMySQL起動まではやってあったっぽい。じゃああと一息じゃん?(と思ったのは勘違いだった(汗))

参考にした記事。

blogs.adobe.com

なんかこの「サイト設定」の「リモートサーバー」「ローカルサーバー」の選択が、webの記事だとチェックボックスになっていて「リモート」「ローカル」両方選択できるのに、うちの環境だとラジオボタンになっていて、どっちかしか選べないんだよなぁ。これどっか設定あるのかな。気になる。リモートサーバーの定義すれば自動的にチェックボックスになるのかな。

ひととおり終わって、「localhost/phpinfo.php」は無事動いた。ところがDreamweaverのリアルタイムプレビューから起動すると、「localhostに接続を拒否されました」と出る。あれ? どこがおかしいんだ……?

確認してみたら、サイト設定のサーバーの「web URL」をlocalhost:8888にしていた。webの記事通りにしたんだけれど、ここはlocalhostが正しいみたい。これで無事リアルタイムプレビューも起動。おっ。PHPの編集できるDreamweaverっぽくなってきた。

MySQLが不調

次はこっち見てWordpressの編集に進もう。

blogs.adobe.com

WordPressを新規にダウンロードして解凍。設定ファイルを書き換え。

ところがどうもうまくいかない。

PhpMyAdminのユーザー追加

私が使っているバージョンでは、「特権(privilege)」のリンク見つからない。最初、rootユーザーではない権限で入っちゃってたみたいで、入り直してやっと見つけた。User accountsタブに置き換わっている模様。

f:id:mogami74:20170801142026j:plain

ところが、ユーザーを設定してWordPressの設定をしようとしてもうまくいかない。

  • パスを通す
  • ルートユーザーにパスワード設定
  • ブログ用のユーザー作成

などしてみたのだけれど、でもWordPressに認識されず。なぜ認識されないかよくわからない。

OS Xの不可視のライブラリー見るとMySQLフォルダと「MySQL-ver」バージョン付きの「mysql-5.6.35-macos10.12-x86_64」フォルダとあるんだけどこのせい?

MySQLの再インストール(とHomebrew導入)

もういっそ全部インストールしなおそう。

qiita.com ↑こっちの記事の方がアンインストールの細部まで書いてある。

yukiyuriweb.com ↑こっちの記事は再インストールまで書かれている。

私の環境では /usr/local/mysql/ と /usr/local/mysql-5.6.35-macos10.12-x86_64/ のふたつのディレクトリにファイルが存在していたので、両方とも sudo rm して削除。この混在がなぜ生じたかわからんけど、原因だったんじゃないかという気がしているんだけどなー。

ついでにHomebrewをインストール。 qiita.com

これまでHomebrew使ってなかったのでいろいろ不便していたけれど、これでまたラクになっちゃうかも。

MySQL地獄

ここからが地獄。いくらやってもエラーが消えない。根本的な知識なしに対処療法でやってるのがいかんのだろうけれど。

いくつかの状態から抜け出せない。

TIMESTAMP with implicit DEFAULT value

「TIMESTAMP with implicit DEFAULT value is deprecated. Please use –explicit_defaults_for_timestamp server option」

これに対処するのは↓でいいみたい。 qiita.com

Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’

touchしてみる

Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’(2)

の場合。

sudo touch /tmp/mysql.sock

ファイルが作成されてないのが問題というパターンもあるらしく、touchコマンドでファイルを作ってみる。(38)に移行する……。

ファイル所有権の問題(らしい)

Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’(38)

ls -l /usr/local/var/mysql/

でファイルの所有権を確認しながら変更していく。ただ、何が適正状態なのかがわからん(汗)

「The server quit without updating PID file」

いろいろ調べて問題のキモはどうやらここ。

mysqlの起動ユーザーと設定ファイル(/usr/local/var/mysql/*)のユーザーを同じにしなくてはいけません。
--via mysqlが起動しない問題 - Qiita

mysqlの起動ユーザーと設定ファイル(/usr/local/var/mysql/*)のユーザーを同じにしなくてはいけません。」 そうだよなぁ、そうだよなぁ。んで起動ユーザーはmy.cnfで調べないといけない。この置き場所は環境によって違うらしいけど、私の場合はusr/local/etc/my.cnfにあった。

www.findxfine.com

私のmy.cnfにはユーザーの記述がなかったので、user=mysqlを追加。でも改善せず(最終的には削除した)。

エラーログを読むことも大切ということがだんだんわかってきた(当たり前といえばそうなんだが)。

/usr/local/var/mysql/*.err: Permission denied

が出る場合は、エラーファイル(*.err)が更新されてないので、それをなんとかする。具体的には sudo chown -R使って権限を書き換えてみる。自分のユーザー名にするか、_mysqlにするかなど。

エラーファイル(*.err)が更新されていたら、テキストエディタで開いて中を読む。[ERROR]になってる場所を探す。

[ERROR] InnoDB: The innodb_system data file ‘ibdata1’ must be writable

ほほう。そのibdata1はどこにあるかというと、/usr/local/var/mysqlの中にある。これの権限がおかしいってことね。

sudo chmod -R g+rwx /usr/local/var/mysql
--via mysqlを5.5 -> 5.6にバージョンアップしたら、Can't find file: './mysql/plugin.frm' (errno: 13 - Permission denied)で起動こける - Qiita

このchmodというやつが使えそうな気がするぞ。

これ以後 .errファイルを開き、[ERROR]になっている箇所を確認し、そのファイルの管理者権限を書き換えながら進む。

私の場合は、chmod -R username:_mysql にすると解消する場合が多かったみたい。

なんとかmysql.server startで起動するようになった。よかった……いやまた急に起動しなくなるかもしれんのだが。

mysqlのパスワード設定でハマる

rootのパスワードを設定してexit、再度ログインしようとすると蹴られる現象に遭遇する。えー。文字コード設定か何か変なのかな。

qiita.com とりあえずここを見ながら、パスワードを回避。

んで、mysqlデータベースのuserテーブルを見ながらあれこれいじってみた。

結果的にはPASSWORD()のつけ忘れだったようで、以下で動いたことは動いたけれど、warningのおまけがついたのが気になる。

mysql> update mysql.user set authentication_string=PASSWORD(‘パスワード’) where user = ‘root’;

この後 select authentication_string from user where user=‘root’; とやって様子を見ると、暗号化されたテキストが格納されたことがわかる。

Show Warning で見ると「'PASSWORD' is deprecated and will be removed in a future release. 」てあるんだけど、まぁとりあえず今はいいや……よくわからん。

MySQLが動くまで長かった……

PhpMyAdminに戻る

ここまで来るとphpMyAdminは問題なく稼働。

blogs.adobe.com

Wordpressに戻る

これがうまくいかない。

http://localhost/tec/wp-admin/setup-config.php

でデータベースに接続できない。ユーザー名もパスワードも間違ってないはずだけど……。

f:id:mogami74:20170801141115j:plain

弱り果てて、自分でPHP書いて同じ階層に置き、DBにアクセスしてみた。

Error:SQLSTATE[HY000] [2002] No such file or directory

ふうむ? やはりSQLとの接続がうまくいってないみたい。で、また「Error:SQLSTATE[HY000] [2002] No such file or directory」でググる

とはいえ最近は、skip-networking を指定しない代わりに bind-address = 127.0.0.1 をデフォルトとしてローカルからのみTCP接続を受け付ける設定にするのが主流なようなので、そういった環境では 127.0.0.1 でも特に問題なく動くと思います。 --via PHPでデータベースに接続するときのまとめ - Qiita PHPでデータベースに接続するときのまとめ - Qiita

うん? このbind-addressって文字列は見覚えがあるな。 usr/local/etc/my.cnf で見たやつだ。ということは、localhostで指定しない方がいいのかな?

127.0.0.1に指定すると「ファイル wp-config.php に書き込めませんでした。」とは言われたものの「手動で wp-config.php を作成し、中に次のテキストを貼り付けることができます。」ということで先に通してもらえた。「インストール実行」をクリック!

f:id:mogami74:20170801141157j:plain

やったー。localhostWordPress入ったぞ。

順調

ふたたびAdobeの記事に戻ってDreamweaverの設定を続ける。

blogs.adobe.com

サイトの設定、サイト固有のコードヒントの設定、順調。

ライブビューの表示までなんとかなったので、とりあえず終了。

『Laravelエキスパート養成読本』に始まるLaravel勉強の遍歴

Laravelエキスパート養成読本 [モダンな開発を実現するPHPフレームワーク!]

Laravelエキスパート養成読本 [モダンな開発を実現するPHPフレームワーク!]

わからない単語だらけ(苦笑)

後で調べよう……

私はそもそもPHPのオブジェクト志向がわかってない

そもそもPHPのオブジェクト志向がわかってないっぽいということがわかってきた(汗)

スコープ定義演算子::

static なものを呼ぶ時に使うってことでいいのね?

これでやっとLaravelのReute::get()の意味がわかった。JavaサーブレットでいうdoGet()てことね。

スキーマビルダー

JDBC みたいなもんかな?

www.messiahworks.com

公式の説明の方が書籍よりわかりやすい

書籍を買ったんだけれど、公式のクイックスタートの方がわかりやすかった。

Eloquent ORM

そもそものORMから調べないとわからない。

オブジェクト関係マッピング - Wikipedia

オブジェクト関係マッピング(英: Object-relational mapping、O/RM、ORM)とは、データベースとオブジェクト指向プログラミング言語の間の非互換なデータを変換するプログラミング技法である。オブジェクト関連マッピングとも呼ぶ。実際には、オブジェクト指向言語から使える「仮想」オブジェクトデータベースを構築する手法である。

なるほど。データベースを擬似的にオブジェクト扱いする技法ってことかな。

オブジェクト関係マッピング - Qiita

オブジェクト指向は「現実世界の物事に即したデータモデル」である一方で、
関係データベースは「検索やCRUDなどの処理に最適化されたデータモデル」となっている。

このような設計思想の違いを、インピーダンス・ミスマッチという。

成ル程。

Eloquentは「雄弁な」という意味らしいけれど。

Eloquent:利用の開始 5.1 Laravel

Eloquent ORMはLaravelに含まれている、美しくシンプルなアクティブレコードによるデーター操作の実装です。それぞれのデータベーステーブルは関連する「モデル」と結びついています。モデルによりテーブル中のデータをクエリーできますし、さらに新しいレコードを追加することもできます。

Laravelクイックスタート 4.2 Laravel

Eloquentには様々な規約があり、そのうちの一つは「データベース名は、モデル名の複数形を使用する」というものです。便利でしょう!

この規約チェックしとかないといかんな。テーブル名も気をつけておかないと。(記述を追加すれば違うテーブル名でも対応できるみたいだけど)

Eclipseのトラブルとその原因

Eclipseで発生したトラブルと特定できた原因の覚え書き。時に応じて更新。

TOMCATが起動しない

以下のいずれの場合も起動できない。

アノテーションが重複している

アノテーションがあるのにWEB-INFの下にweb.xmlが存在している

別アプリのコンパイルエラー

プロジェクト内の別アプリがコンパイルエラーを起こしている場合にTOMCATが落ちることがある。全アプリ見ないといけないのでげっそり。

jdbcに接続できない

クラスパスが通っていない。 プロジェクトを右クリックして「ビルド・パスの構成」から 「Javaのビルド・パス」「ライブラリー」に「外部JARの追加」などをして、正しいJARファイルへのパスを指定する。

「増分バックアップ」「差分バックアップ」の違いは英語の方が覚えやすい

先に結論

  • 「増分バックアップ」「差分バックアップ」という日本語は、仕組みの実情を正しく伝えていなくて覚えづらい。訳語が悪い
  • incremental backupは「漸増バックアップ」の方が良い
  • defferential backup は「基準差バックアップ」にしてはどうか。

「増分」と「差分」の区別がつかない

バックアップにはいくつか種類がある。たとえば情報技術者試験などでも問題になるのが、「増分」とか「差分」の違いだ。

これらの違いについては、まぁ詳しいサイトがいっぱいあるのでそちらを読んでいただきたい。

中身はともかく、私はいつも、名前がどっちがどっちだかいつもわからなくなる。「増分」と「差分」。わかりづらい。

調べていたら、「増分」の英語として「incremental」が出て来て膝を打った。それなら、わかる。incrementalは「少しずつ足していく」という意味だからだ。バックアップに「少しずつ足していく」。これなら実情に合っている。

日本語の「増分」という単語には「増える」要素はあるけれど、「少しずつ足していく」というイメージがない。だから分からなくなるのだ。

incremental backupの訳語としては「漸増バックアップ」の方が良いのではないか。

もしかして、私が覚えられないのは、訳語が悪いのではなかろうか!

「日本語のイメージが勝手に付加される」差分=前回からの差

というわけで「差分」の訳語を調べてみたら、こちらはやはり「defferential backup」だった。文字通り「difference 差」ということだから、これは「差分」と言ってもいいだろう。

ただ「差分バックアップ」と言った時に「前回からの差」だと無意識に思ってしまうのは私だけだろうか。差分バックアップは常に「完全バックアップからの差」をとるバックアップなのだ。

そういう意味で、defferential backup は「基準差バックアップ」にしてはどうか。その方が実情を伝えている。

翻訳は「イメージを伝える」作業である。

外国語が苦手な人は逐語訳をしがちだが、翻訳はイメージを伝える作業である。「英単語=日本語単語」という対応が正確であることはあまりない。

例えば「首」という単語を英語にするとしたら何だろうか。neckという語が最初に浮かぶのは自然なことだけれど、実情をよく考えてみると 首=neckではないことがわかる。

「大将の首をとれ」は「head」だ。neckだけとるような戦場はありえない。日本語の「首」のイメージを正しく伝えるには、headとneckを使い分けなければならない。

バックアップも同じで、incremental backup、differential backupのイメージを正しく伝える訳語があれば、大勢の人が効率よく学習できる。

そしてこれは英語に限らず、日本語だって、イメージを正しく伝えることが大事なのだ。

Slack の Botを使いこなしたい

これまでslackに興味はあったものの、友達がいなくて泣いていた。友人が作ったプログラミング部でslackが採用されたので、主導者にいくつか教えてもらい、やっと概略が飲み込めたのでslackの記事もあれこれ読んでみた。

標準SlackBotを使いこなしたい。

標準のSlackBotを面白く使っているアイデアはないかなー、と思って探してみた。

mayonez.jp

↑ここはいろいろまとまっている。

mame-tora.com

↑「おはよ」「おみくじ」あたりまではまぁ思いつく。「おやつ」もあるか。

SlackBotをつくりたくなってくる

Hubotを使ってBotを作るとさらにカスタマイズ度アップ。ただし24時間動く環境が必要。

よく提案されているのはHerokuを使ってホスティングする方法だけど、最近は価格改定で無料アカウントに制限ができちゃったらしい。

さくらのVPSを契約するのも、まぁいいんだけど。

いくつか気になっているのは、GoogleAppsScriptから作る方法があるみたい。これならたぶん無料で、しかも24時間動く。

GitHub - masuidrive/miyamoto: Google Apps Scriptで書かれたSlack用勤怠管理Botの「みやもとさん」

↑ひとり勤怠管理とかやってみっか……。

tech.innovator.jp.net

↑これもGoogleAppsScriptから。

kuma-no-kara-age.hatenablog.com

↑このブログ前にも見たことがある。何度も遭遇するので、たぶん人気記事なんだな。数えるほどしか記事ないみたいだけど。

これはBotKitを使った、とある。

dotnsf.blog.jp

↑ここはけっこう詳しい。

Node.jsが動く環境かぁ。SynologyのNASでやれないかなー。

tech.camph.net

↑これもGoogleAppsScript活用。これならなんかできそうな気がしてきた……!

Java初学者がひっかかっていたところまとめ

1ヶ月ほど初学者に教えた際、ひっかかっていたところをまとめた。何かの参考に。

Eclipseエディタのエラー表記が消えない

セーブしていない

基本。Eclipseのエラー表記は、保存されるタイミングで更新されるので、記述を直しても保存しないとマークが出たままになる。

何かのキャッシュが残ってしまっている

Eclipseでたまにある。ファイルを閉じて開くとエラーが消える。

「変数〜は一度も使われていません」

Eclipseの愛情を感じるエラーというかアラート。初心者向けのソースでは使わない変数でもお作法っぽい理由で変数作っていたりするので、けっこうこれが出てくる。

未完成ソースコード

未完成のソースコードで「エラーやアラートが消えません」と言ってくる事例。そりゃ未完成だからね。書き進めると消える種類のもの。

「〜を変数に解決できません」

以下のケースが多い。

変数の宣言をしていない

基本。

宣言とスコープの問題

これが割と多い。 「宣言した変数はブロック内で有効」ということがまだ飲み込めずエラーになっている。 あるいは逆に上位のブロックで宣言したために、破棄されるべきデータが破棄されず残ってしまい、想定外の挙動をする。

書き間違い

メソッド名に()を付け忘れるなどで変数名と見なされてしまい「〜を変数に解決できません」になる。

「型名を解決できません」

自分で作成したクラスの場合は打ち間違い。

(自分で作成していない)クラス名が与えられている場合は、import忘れが多い。

文字化け

いくつかのパターンがある

文字コード指定がおかしい

文字コードの誤字

「uft8」とかその類型。

req側の指定とres側の指定両方が必要

サーブレットの場合、RequestとResponse両方に文字コード指定が必要。

オブジェクトを直接System.out.printしようとしている

データを保持するEntityオブジェクトをそのまま表示しようとして文字化けする。

JDBC

duplicate PRIMARY KEY

jdbcSQLのINSERT文を実行する際に、「既に存在する主キー」を追加しようとすること。IDの重複など。
例文の通りにINSERT文を打ち込んで、2回(以上)実行しようとするとこれが出る。

引数間違いによるSQLException

サーバー名などの打ち間違いが多い。「locahost」などサラッと書いてあると意外と見つけづらい。

INパラメータ指定

PreparedStatementのINパラメータを指定する際に順番を間違えている。

suitable driver not found

DriverManager.getConnection(url,user,password)で「suitable driver not found」と出る。

getConnection()の第一引数のurlを打ち間違えている

jdbc:」と書くべきところを「jbdc:」と打ち間違えたりすると、「driver not found」になる。

環境設定ミス。クラスパスが何かの原因で通っていない。

これはしんどい。なかなか気づかない。

JSPサーブレット

「formのname属性」「key」「変数名」の混乱

往々にしてベテランは後で見て追いやすいように(サンプルコードも)同じkey名を使い回す傾向がある。慣れた人は文脈を見れば「これが変数名」「これが属性名」などすぐわかるのだけれど、初学者にはどれがどれに対応しているのかわかりづらい。

サンプルコードでユーザーなどの「名前」をデータとして持つ場合が最悪でこんな感じになる。

  • HTML/JSPファイル: formタグのname属性に氏名を入力させ"name"のキーを持たせる
  • httpリクエスト: 格納されているkeyが"name"で値が"山田"
  • サーブレット: request.getParameter(“name”)で取り出した値を入れる変数名がname

name の name が nameである、みたいなことになり、ここを丁寧に説明しないとしんどい。

404エラー

JavaリソースとHTML/JSPのパスの違い。 Javaリソースはアノテーション(またはweb.xml)でパスを指定するため、プロジェクト名の直下がほとんど。HTMLやJSPなどはディレクトリ階層を正しく指定する必要がある。

getParameterとgetAttributeの違い

formから受け取る時は getParameter() 。
setAttribute() したものを受け取るときは getAttribute() 。
getAttribute() のキャスト忘れ/キャストミスもある。

EL式/Beansの形式

${sessionScope.beans.member} のようにドット記法でつなぐのを忘れて、 ${sessionScope.beans} または ${sessionScope.member} のように書いてしまうことが多い。

データベースアクセス専用のPHP設計

f:id:mogami74:20161208124847j:plain

自分のあれこれをデータベースに入れようと思っている。購入物とか、レストランの評価とかあれこれね。いっぱいいっぱい、作りたいデータベースがあるの。

とりあえずレストランについてはPHPで途中まで書いてみてそれなりには動いているんだけれど、ここから改修するのが面倒になってきた。この先、データテーブルが増えるたびに同じような作業をするのはめんどくさい。

というわけで、データベースアクセス専用のPHPを作ったらどうか、と考えた。しかしながら、いま一つ、どういう設計にしたらいいのか、いい考えが浮かばない。

Google先生に伺って、参考になりそうなサイトを見つけた。

blog.tojiru.net

blog.tojiru.net

まさにこれだ。用語がいくつか登場しているので、チェックしておいて後で調べることにする。

とりあえず、ユースケース的なまとまりごとにHogeDAOというクラスを作って、そこにDB操作を集約させることにした。各テーブルを体現するクラスも作成する。

たとえば、RestaurantsDAOクラスはRestaurantsTableクラスとVisitTableクラスを使いながらDBにアクセスする。(本当はStationTableとかMealTableもある)

こんなのもある。

d.hatena.ne.jp

  • Singleton

Singleton パターン - Wikipedia

Singleton パターン(シングルトン・パターン)とは、オブジェクト指向のコンピュータプログラムにおける、デザインパターンの1つである。(中略)Singleton パターンを用いると、そのクラスのインスタンスが1つしか生成されないことを保証することができる。

ふむー。成ル程。