CSSやHTMLで指定される色の名前から16進数表記を取得する

CSSやHTMLで指定される色の名前から16進数表記を取得したくなった。

例えば

<p style=”color: green;”>
の用に書かれているgreenはRGBの16進表記では008000で、次の

<p style=”color: #008000;”>

と同じ意味だ。このとき、greenという色の名前から008000が欲しくなった。一覧はググルとでてきた。

CSS Color Names

http://www.w3schools.com/cssref/css_colornames.asp

そんでこれを変換するPHPでコードを書いてみた。

<?php

main();

function main() {
 global $palettes;
 var_dump(getColorHexByName('green'));
}

function getColorHexByName($colorName) {
 $palettes = array(
 array('name' => 'AliceBlue', 'hex' => 'F0F8FF'),
 array('name' => 'AntiqueWhite', 'hex' => 'FAEBD7'),
 array('name' => 'Aqua', 'hex' => '00FFFF'),
 array('name' => 'Aquamarine', 'hex' => '7FFFD4'),
 array('name' => 'Azure', 'hex' => 'F0FFFF'),
 array('name' => 'Beige', 'hex' => 'F5F5DC'),
 array('name' => 'Bisque', 'hex' => 'FFE4C4'),
 array('name' => 'Black', 'hex' => '000000'),
 array('name' => 'BlanchedAlmond', 'hex' => 'FFEBCD'),
 array('name' => 'Blue', 'hex' => '0000FF'),
 array('name' => 'BlueViolet', 'hex' => '8A2BE2'),
 array('name' => 'Brown', 'hex' => 'A52A2A'),
 array('name' => 'BurlyWood', 'hex' => 'DEB887'),
 array('name' => 'CadetBlue', 'hex' => '5F9EA0'),
 array('name' => 'Chartreuse', 'hex' => '7FFF00'),
 array('name' => 'Chocolate', 'hex' => 'D2691E'),
 array('name' => 'Coral', 'hex' => 'FF7F50'),
 array('name' => 'CornflowerBlue', 'hex' => '6495ED'),
 array('name' => 'Cornsilk', 'hex' => 'FFF8DC'),
 array('name' => 'Crimson', 'hex' => 'DC143C'),
 array('name' => 'Cyan', 'hex' => '00FFFF'),
 array('name' => 'DarkBlue', 'hex' => '00008B'),
 array('name' => 'DarkCyan', 'hex' => '008B8B'),
 array('name' => 'DarkGoldenRod', 'hex' => 'B8860B'),
 array('name' => 'DarkGray', 'hex' => 'A9A9A9'),
 array('name' => 'DarkGreen', 'hex' => '006400'),
 array('name' => 'DarkKhaki', 'hex' => 'BDB76B'),
 array('name' => 'DarkMagenta', 'hex' => '8B008B'),
 array('name' => 'DarkOliveGreen', 'hex' => '556B2F'),
 array('name' => 'DarkOrange', 'hex' => 'FF8C00'),
 array('name' => 'DarkOrchid', 'hex' => '9932CC'),
 array('name' => 'DarkRed', 'hex' => '8B0000'),
 array('name' => 'DarkSalmon', 'hex' => 'E9967A'),
 array('name' => 'DarkSeaGreen', 'hex' => '8FBC8F'),
 array('name' => 'DarkSlateBlue', 'hex' => '483D8B'),
 array('name' => 'DarkSlateGray', 'hex' => '2F4F4F'),
 array('name' => 'DarkTurquoise', 'hex' => '00CED1'),
 array('name' => 'DarkViolet', 'hex' => '9400D3'),
 array('name' => 'DeepPink', 'hex' => 'FF1493'),
 array('name' => 'DeepSkyBlue', 'hex' => '00BFFF'),
 array('name' => 'DimGray', 'hex' => '696969'),
 array('name' => 'DodgerBlue', 'hex' => '1E90FF'),
 array('name' => 'FireBrick', 'hex' => 'B22222'),
 array('name' => 'FloralWhite', 'hex' => 'FFFAF0'),
 array('name' => 'ForestGreen', 'hex' => '228B22'),
 array('name' => 'Fuchsia', 'hex' => 'FF00FF'),
 array('name' => 'Gainsboro', 'hex' => 'DCDCDC'),
 array('name' => 'GhostWhite', 'hex' => 'F8F8FF'),
 array('name' => 'Gold', 'hex' => 'FFD700'),
 array('name' => 'GoldenRod', 'hex' => 'DAA520'),
 array('name' => 'Gray', 'hex' => '808080'),
 array('name' => 'Green', 'hex' => '008000'),
 array('name' => 'GreenYellow', 'hex' => 'ADFF2F'),
 array('name' => 'HoneyDew', 'hex' => 'F0FFF0'),
 array('name' => 'HotPink', 'hex' => 'FF69B4'),
 array('name' => 'IndianRed ', 'hex' => 'CD5C5C'),
 array('name' => 'Indigo ', 'hex' => '4B0082'),
 array('name' => 'Ivory', 'hex' => 'FFFFF0'),
 array('name' => 'Khaki', 'hex' => 'F0E68C'),
 array('name' => 'Lavender', 'hex' => 'E6E6FA'),
 array('name' => 'LavenderBlush', 'hex' => 'FFF0F5'),
 array('name' => 'LawnGreen', 'hex' => '7CFC00'),
 array('name' => 'LemonChiffon', 'hex' => 'FFFACD'),
 array('name' => 'LightBlue', 'hex' => 'ADD8E6'),
 array('name' => 'LightCoral', 'hex' => 'F08080'),
 array('name' => 'LightCyan', 'hex' => 'E0FFFF'),
 array('name' => 'LightGoldenRodYellow', 'hex' => 'FAFAD2'),
 array('name' => 'LightGray', 'hex' => 'D3D3D3'),
 array('name' => 'LightGreen', 'hex' => '90EE90'),
 array('name' => 'LightPink', 'hex' => 'FFB6C1'),
 array('name' => 'LightSalmon', 'hex' => 'FFA07A'),
 array('name' => 'LightSeaGreen', 'hex' => '20B2AA'),
 array('name' => 'LightSkyBlue', 'hex' => '87CEFA'),
 array('name' => 'LightSlateGray', 'hex' => '778899'),
 array('name' => 'LightSteelBlue', 'hex' => 'B0C4DE'),
 array('name' => 'LightYellow', 'hex' => 'FFFFE0'),
 array('name' => 'Lime', 'hex' => '00FF00'),
 array('name' => 'LimeGreen', 'hex' => '32CD32'),
 array('name' => 'Linen', 'hex' => 'FAF0E6'),
 array('name' => 'Magenta', 'hex' => 'FF00FF'),
 array('name' => 'Maroon', 'hex' => '800000'),
 array('name' => 'MediumAquaMarine', 'hex' => '66CDAA'),
 array('name' => 'MediumBlue', 'hex' => '0000CD'),
 array('name' => 'MediumOrchid', 'hex' => 'BA55D3'),
 array('name' => 'MediumPurple', 'hex' => '9370DB'),
 array('name' => 'MediumSeaGreen', 'hex' => '3CB371'),
 array('name' => 'MediumSlateBlue', 'hex' => '7B68EE'),
 array('name' => 'MediumSpringGreen', 'hex' => '00FA9A'),
 array('name' => 'MediumTurquoise', 'hex' => '48D1CC'),
 array('name' => 'MediumVioletRed', 'hex' => 'C71585'),
 array('name' => 'MidnightBlue', 'hex' => '191970'),
 array('name' => 'MintCream', 'hex' => 'F5FFFA'),
 array('name' => 'MistyRose', 'hex' => 'FFE4E1'),
 array('name' => 'Moccasin', 'hex' => 'FFE4B5'),
 array('name' => 'NavajoWhite', 'hex' => 'FFDEAD'),
 array('name' => 'Navy', 'hex' => '000080'),
 array('name' => 'OldLace', 'hex' => 'FDF5E6'),
 array('name' => 'Olive', 'hex' => '808000'),
 array('name' => 'OliveDrab', 'hex' => '6B8E23'),
 array('name' => 'Orange', 'hex' => 'FFA500'),
 array('name' => 'OrangeRed', 'hex' => 'FF4500'),
 array('name' => 'Orchid', 'hex' => 'DA70D6'),
 array('name' => 'PaleGoldenRod', 'hex' => 'EEE8AA'),
 array('name' => 'PaleGreen', 'hex' => '98FB98'),
 array('name' => 'PaleTurquoise', 'hex' => 'AFEEEE'),
 array('name' => 'PaleVioletRed', 'hex' => 'DB7093'),
 array('name' => 'PapayaWhip', 'hex' => 'FFEFD5'),
 array('name' => 'PeachPuff', 'hex' => 'FFDAB9'),
 array('name' => 'Peru', 'hex' => 'CD853F'),
 array('name' => 'Pink', 'hex' => 'FFC0CB'),
 array('name' => 'Plum', 'hex' => 'DDA0DD'),
 array('name' => 'PowderBlue', 'hex' => 'B0E0E6'),
 array('name' => 'Purple', 'hex' => '800080'),
 array('name' => 'Red', 'hex' => 'FF0000'),
 array('name' => 'RosyBrown', 'hex' => 'BC8F8F'),
 array('name' => 'RoyalBlue', 'hex' => '4169E1'),
 array('name' => 'SaddleBrown', 'hex' => '8B4513'),
 array('name' => 'Salmon', 'hex' => 'FA8072'),
 array('name' => 'SandyBrown', 'hex' => 'F4A460'),
 array('name' => 'SeaGreen', 'hex' => '2E8B57'),
 array('name' => 'SeaShell', 'hex' => 'FFF5EE'),
 array('name' => 'Sienna', 'hex' => 'A0522D'),
 array('name' => 'Silver', 'hex' => 'C0C0C0'),
 array('name' => 'SkyBlue', 'hex' => '87CEEB'),
 array('name' => 'SlateBlue', 'hex' => '6A5ACD'),
 array('name' => 'SlateGray', 'hex' => '708090'),
 array('name' => 'Snow', 'hex' => 'FFFAFA'),
 array('name' => 'SpringGreen', 'hex' => '00FF7F'),
 array('name' => 'SteelBlue', 'hex' => '4682B4'),
 array('name' => 'Tan', 'hex' => 'D2B48C'),
 array('name' => 'Teal', 'hex' => '008080'),
 array('name' => 'Thistle', 'hex' => 'D8BFD8'),
 array('name' => 'Tomato', 'hex' => 'FF6347'),
 array('name' => 'Turquoise', 'hex' => '40E0D0'),
 array('name' => 'Violet', 'hex' => 'EE82EE'),
 array('name' => 'Wheat', 'hex' => 'F5DEB3'),
 array('name' => 'White', 'hex' => 'FFFFFF'),
 array('name' => 'WhiteSmoke', 'hex' => 'F5F5F5'),
 array('name' => 'Yellow', 'hex' => 'FFFF00'),
 array('name' => 'YellowGreen', 'hex' => '9ACD32'),
 );

foreach($palettes as $palette) {
   if (strtolower($palette['name']) == strtolower($colorName)) {
   return $palette['hex'];
   }
 }
 return false;
}
?>

これでgetColorHexByName(‘green’) のように色の名前を入れると0800000みたいな16進でとれる!! 便利!きっと便利!

Mac OS Xでmysqlを立てたらTCP/IPで接続できなかった

Mac OS Xでmysqlを立てたらTCP/IPで接続できなかった。

最近はMacで開発環境を構築しています岡田洋一です、こんにちは。
Macは便利で良いですね。いわゆるノマド的な開発も可能でとても良いです。
さてそんなMacなのですがその中に開発環境を構築してやる必要があります。
僕の場合だいたいは apache + mysql + php あたりになります。
さてその中のmysqlが今回は問題を引き起こしてくれました。

TCP/IPで繋がらないんですね。

shell> mysql -h localhost -u root

なんてやってみてもダメですし

shell> netstat -nat | grep 3306

(注) portの待ち受け確認にはいくつかの方法があります。linux系ですと netstat -plnt(?) のようなオプションもありますが、macのdarwinなpsとは互換性がありません。-natオプションはlinux系でも動くのでコチラを利用しています。FreeBSDを利用していた頃はsockstatをよく使っていましたがコチラもOS依存です。

とやってみるとそもそも3306で待ち受けをしていない。netstat -nat というのはtcpで待ち受けをしているポート番号一覧を出してくれて、grepでmysqlの標準待ち受けポートの3306があるかどうかを調べています。

ポート3306でそもそも待ち受けをしていないので、iptableやmysqlのユーザの権限が原因ではなさそうです。

原因として濃厚なのはmy.cnfの記述が真っ先に疑われます。

今回のmysqlはmac portsからインストールしたので、そのmy.cnfは /opt/local/etc/ にあります。

ややこしかったのはこの /opt/local/etc の中にmysql5とmysql51との両方が存在したことでした。

まずはmac portsでインストール済みパッケージの確認

shell> port installed | grep mysql

mysql5 @5.1.68_0
 mysql5 @5.1.70_0 (active)
 mysql51 @5.1.68_0
 mysql51 @5.1.70_0 (active)
 mysql51-server @5.1.68_0
 mysql51-server @5.1.70_0 (active)
 mysql_select @0.1.2_0 (active)
 php5-mysql @5.3.23_0+mysqlnd
 php5-mysql @5.3.26_0+mysqlnd (active)

うーん、結構入っている上にすべてがactiveになっていますね。mac portsにはactive/inactive意外にもload/unloadという状態があります。acitve/inactiveはそもそもそのパッケージが有効か否か、load/unloadはservice startされるかどうか、という感じだそうです。

activeなパッケージの場合、/Library/LaunchDaemons/ に起動スクリプト(実際には起動オプション)がありますので、そちらからパッケージ名を特定しようとしてみます。

shell> ls /Library/LaunchDaemons/*mysql*

/Library/LaunchDaemons/org.macports.mysql51-server.plist

どうやらmysql51-serverのようですね。では実際のmy.cnfは…、というと、通例ですとこのplistファイルに記述されたりするのですがmysql51-serverでは記載がない。バイナリで決めうちなのか、不明ということでした。

プロセスの起動時引数で確認できるかと思い、psで確認しようとしてみました。–conf=/usr/local/etc/my.cnf なんて書いてあるかもしれないですし。

shell> ps auxww | grep mysql
root 3893 0.0 0.0 2465328 1112 ?? Ss 11:20AM 0:00.01 /opt/local/bin/daemondo --label=mysql51-server --start-cmd /opt/local/lib/mysql51/bin/mysqld --user=_mysql ; --pid=exec

が、結局ドコのmy.cnfを利用しているかは分からない!

しょうが無いので実際に書き換えて,ドコが反映されるかを調べてみました。

/opt/local/etc/mysql51/my.cnf のsockでunix ドメインソケットの名前を変更してみました。

shell> grep sock /opt/local/etc/mysql51/my.cnf

socket = /tmp/mysqlnosocketdayo.sock

socketの設定を変更してmysqldを再起動。mac portsで管理されるパッケージの再起動は未だによく分かってないのですが、僕は以下のようにして再起動しています。

shell> sudo sh -c 'port unload mysql51-server; port load mysql51-server;'; ps auxww| grep mysq

再起動できたかどうか、エラーが出た場合なんかにはあまりエラーメッセージを出してくれないので注意が必要です。

で、socketの書き換えはうまく成功していました。ということは利用されているコンフィグは /opt/local/etc/mysql51/my.cnf で間違いがないようです。

さてmy.cnfを確認してみるのですが、特に変な記述はありません。tcp/ipで待ち受けをしていない時にありがちなのは

  • port行が無い
  • bind-address行が無い (無くても待ち受けしてくれます。listen addressを別個で指定したい場合に利用するものですね。127.0.0.1などのループバックアドレスを指定するとローカルホストからしか繋がらないです。注意。)
  • skip-networkが有効になっている

といったところでしょうか。何にせよ netstat -natで待ち受けされていないのですからこの辺りが疑わしいわけです。

が、今回の場合ではどの条件にも合致しそうにない。ホトホト困ってしまいました。IRCで質問したり(moderate権限が無くて発言できない!)、知っていそうな人に質問したり(友達がいなかった!)したのですがダメ。結局数ヶ月をおいてしまう事になりました。

が、一念発起してさらに調べたところ、 /opt/local/etc/mysql51/ にmy.cnf以外のファイルがあることを再認識。

ファイル名はmacports-default.cnf なんていう、macportsでインストールしたらこのファイルをサンプルに津かってね、っぽい名前のファイルがありました。

サンプルコンフィグかな、なんて見過ごしていたんですが中身を確認してみると

shell> more /opt/local/etc/mysql51/macports-default.cnf

# WARNING! ANY CHANGES TO THIS FILE WILL BE LOST ON UNINSTALL/UPGRADES!
# Make your changes to /opt/local/etc/mysql51/my.cnf
# YOU HAVE BEEN WARNED!

# MacPorts default options
[mysqld]
# skip-networking so multple mysql server ports can be loaded
# without each competing for port 3306.
skip-networking

最終行にしっかりと、skip-netwrokingとかいてある…!消して再起動すると

shell> sudo sh -c 'port unload mysql51-server; port load mysql51-server;'

shell>  netstat -nat | grep 3306

tcp4 0 0 *.3306 *.* LISTEN

(注) mysqlの起動終了からポート待ち受けまでの間、立ち上げ処理などでタイムラグがあります。なのでワンライナーでつなげて記述すると待ち受け確認できません。sleepを挟むなどしましょう。

リッスンしてる!!!!

というわけでめでたく繋がるようになりました。めでたしめでたし。