Archives
2014年を振り返る サーバーサイドプログラミング
サーバーサイドプログラミング(Perl,PHP,Python,Ruby,etc…)について振り返る
まず、コンパイルする系の言語には全然手を出さなかったのでノーコメント。
Groovyはちょっとだけ久しぶりに触ったらバージョンが上がってて言語仕様変わってた箇所でトラブった。
Perl,Python,Rubyについては全然触れなくてフラストレーション。
PHPは少し触ってたけど、使用バージョンがPHP5.4→PHP5.5→PHP5.6といろいろ触ってその間の言語仕様の変更に惑わされたりした。
本当はテストコードがしっかり書けるようになりたかったけど、いろいろ自分が足りなくて駄目だった。
家にたまった古い書籍も含めて処分していきたいので2015年はバシバシコードを書捨てていきたい。
PHP7が来年だか再来年にリリースされることによって現場には相当バージョン違いのプロジェクトが出てしまうと思うので、できれば新規案件は
枯れたPerl5系かPython3系(サポートがだいぶ長引くことになった2系も場合によっては)でチャレンジしたい。
Rubyは…どうだろう。試しやプロトタイプにはいいのかも、ただしSinatra限定。ツールはRuby系が多いのでRubyでいろいろ学習してから他の言語のものを使うようにするといいのかもしれない。
2014年を振り返る JavaScript編
今年を振り返ってみる。クライアントサイド、特にJavaScriptについて
JavaScriptについては今年、なるべくjQueryを使わないようにチャレンジする時期があった。
結局IEとの互換を維持するコードを書かないといけない事を考えるのが面倒になってjQuery使わないの諦めた。
document.getElementByIdとか使える場合は積極的に使ったほうがコストが抑えられるけど、中途半端に混ぜても他のオブジェクトとの兼ね合いで結局jQueryオブジェクトに変換しないといけなかったりして、もにょる。
jQueryでdata属性使うとキャッシュの関係で後から値の変更がうまくいかないとか、なんて地雷だよ!て憤ったよ。
ただ今後はBackbone.jsに手を出していきたいと考えているのでjQueryとは仲良くやっていきたいと思っている。
ただ、思ったよりはJavaScriptの学習や経験は積めなかったのが残念。
もっとCanvasとかSVGのコントロールとか挑戦したかったし、TypeScriptやClojureScriptにも挑戦したかった。
CoffeeScriptはちゃんと学習する前にオワコンになりそうだし、あんまりやらなくていいかなって考えている。
思い出せない
前回の投稿から1ヶ月以上過ぎていて、何か書こうと思ったけど、ここ1ヶ月何やってたか記憶がほぼない。
サーバー関係
ログローテーションの設定を行った。
yum install logrotate
/etc/logrotate.d/配下に追加の設定を行う
/var/log/httpd/_/_logとかやるとユーザーごとに設置したログ・ファイル全てを対象にしたローテーション設定ができる
Ansible
1台のサーバーでTomcat、Gitbucket、Jenkins、Redmineを動かす計画をしているのでVagrantで実験中
ついでにNginxをフロントにおいてGitbucket(Tomcat)、Jenkins、Redmine(Unicorn)、PHP(Apache)にリバースプロキシにする予定。
yumモジュールはnameでhttpでrepl指定してもインストールできるようだ。
後でNginxでリバースプロキシの設定する予定だからTomcatのデフォルトポートはそのままに、Jenknsは8010とか競合しない番号にポート変更。
Tomcatの自動起動スクリプト調べて作ったんだけど、何かよろしくなかったらしい。daemon化うまくいかなかった。
JavaScript
AWSのS3へのアップロード・ダウンロードがJSのみで出来ないか調査。サンプルがいろいろあって試していたら出来た。
マルチパートアップロードの場合はファイルをバッファ分割しながら送信するのがミソ。
AWSのS3のCORSで許可ヘッダーの設定が必要でした。
PHP
namespaceやautoloadをまだ理解しきれていない部分があるようで、読み込みで躓く
毎日ちゃんとメモとらないと駄目ですね。。
新しく開発環境作成中
Ubuntu14(64bit)のVM作成
-
イメージからVMWareFusionに作成
-
ホームディレクトリ以下のディレクトリ群が日本語なので英語名に変更
-
ターミナルから LANG=C xdg-user-dirs-gtk-update を実行 LANG=C xdg-user-dirs-gtk-update
-
設定画面が出てくるので、そのままOK
-
-
VMWare toolsをインストール
- VMWareのメニューバーからインストールってやると仮想CDがマウントされるのでデスクトップあたりに展開
- 展開したディレクトリの中に入ってインストール実行
-
aptのアップデートとアップグレード sudo apt-get update
sudo apt-get upgrade -
Dropboxクライアントのインストール
- FirefoxでDropbox検索してログイン→クライアントツールをダウンロードしてインストール
- Dropboxを入れる理由は次のEmacsの設定ファイルをDropboxで共有しているから
-
Emacsのインストール sudo apt-get install emacs24
- Dropboxにある設定ファイル群(emacs.d)のシンボリックリンクを作成
- 作成したシンボリックリンクの名前変更 ※ダイレクトに.emacs.dのリンクを作成だとうまく行かなかった
ln -s ~/Dropbox/emacs.d ~/emacs.d
mv ~/emacs.d ~/.emacs.d
-
バージョン管理のインストール sudo apt-get install git
sudo apt-get install mercurial
PHPのファイルアップロードについて
PHPで大きなファイルアップロードを作成する
・Webサーバー側でBody Max Lengthの指定で大きなサイズを指定しておきましょう。
・formのhtmlでenc-typeの指定はもちろん、hiddenでMaxFileSizeの値の指定、その後にinput file
・phpの設定でmax_file_size,post_max_size,タイムアウト、memory_limitなどの設定が必要
・Apacheのバージョンが古いと2だか4GBが上限。という噂。
・サーバーが32bitだとメモリを3.7GB?くらいまでしか扱えないらしいから5GBクラスの巨大ファイルはアップロード無理だと思われる。
Vagrant、最終的にはEC2にAnsibleでWordPressを構築を試みる2
・botoが使えないってエラーになる。
→次のURLで解決 https://groups.google.com/forum/#!topic/ansible-project/ftlmfIC1DHk
つまり、ansibleがなぜか現在動いているバージョンのライブラリを参照出来ないっぽいのでこれまたなぜか
hostsにどこのpythonを使っているのか書いてあげる必要があったということ。なぜansible.cfgではないのか
・契約アカウント?で試してたらCredentialエラーが出てて、試しにIAMアカウント作成してそのIAMアカウントを
使ったら成功した。なんで?
・ApacheのVHOSTのRootディレクトリが700だったので403エラーで表示されなかった。755に変更して解決。
・VirtualHostの設定を行う場合、どこかに「NameVirtualHost」の記述が必要。
というより、NameVirtualHostの記述内容とその後のVirtualHostディレクティブの内容に整合性がないといけない。
なので「NameVirtuakHost *:80」の記述があれば、その後<virtualhost *:80>VirtualHostディレクティブが
ないといけない。
もしも<virtualhost {{hostname}}:80>みたいな記述をしていた場合、NameVirtualHost {{hostname}}:80の宣言もないといけない。
整合性が撮れてないと、宣言が足りないとかそんなVirtualHostディレクティブはないとか警告が出る。
・Ubuntuに入ってるApache2のVirtualHostの有効化無効化
sites-availableディレクトリにVirtualHost設定書く
a2ensite {{vhost_filename}} で有効化、a2dissite {{vhost_filename}} で無効化
・Hostの指定が足りない!?
Could not reliably determine the server’s fully qualified domain name, using for ServerName
こんなエラーが出る。hostsファイルに127.0.1.1 にhogehoge.localを追記してあげたら直った
つまり、hostsファイルにhostnameが127.0.1.1で定義されている場合、Apacheが名前解決のエラー出すので、
そこに{{hostname}}.localを追記する処理追加
・Ansible用MySQLの設定追加
Ansibleでmysql_userモジュールを使ってユーザーを追加する際に、MySQLが外部サーバーの場合は(Webサーバーから接続用ユーザーの作成の場合は)
host=%,host=localhostの記述が必要、同時に作れるのか試してない。自分は別のtaskとしてそれぞれ実行(同じユーザー名で別hostのユーザーを2回作成)
リモートユーザーにあたる側(今回はWebサーバー側)にはmysql_clientのインストールが必要
Vagrant、最終的にはEC2にAnsibleでWordPressを構築を試みる
Ansibleに興味があって試そうとして、対象のサーバーをまずはVagrantを使おう、最終的にはEC2を使う形まで持って行こう。という企画です。アプリとしてはAnsibleのチュートリアルに出てきたのでWordPressを構築するのを試します。
の、前にAWSのS3試したので。
・IAMでアカウント作ってセキュリティポリシーでS3の接続出来るバケット制限したり、操作権限制限したり出来る
・Pythonのbotoを入れて最初S3の操作しようと思ったけど、マルチパートアップロードのやり方が分からなくて挫折
・AWS-CLIが楽ちん、S3に対して勝手にマルチパートアップロードしてくれる。でもWindowsで扱う場合、お決まりの文字コード警告がでますね。
・PHPのSDKでS3に対するファイルのリスト取得、ダウンロード、アップロード(マルチパートアップロード)を作成。思ってたより簡単。
Ansible試す
・Vagrantで作成したboxにAnsibleでSSHに接続する場合、SSHの設定をansible.cfgにpathを書いていない場合、デフォルトの~/.ssh/configを参照してしまう。
・Ansibleはインベントリファイルに書いた名前でSSHする。だからSSHの設定ファイルのHost名は合わせる
・AnsibleのDocument(英語)である程度分かるんですが、ansible-docコマンドで、ある程度何が出来るか雰囲気だけ分かる。
・Ansibleで指定するモジュールはユーザーを作るadd、ファイルを転送するcopy、shellを実行するshell、ファイルを実行?するcommand、aptやyumあたりがよく使うモジュール、設定ファイルで編集が1行で済む場合はlineinfile、結構いろいろある場合は完成版の設定ファイルをcopyするかJinja2で作成したtemplateファイルを使う
・Ansibleのnotifyで呼び出されるのは同じRoleのhandlerに登録されたYamlのnotifyで指定した値と同じnameのものが処理されるようだ
以下WordPressでApacheとMySQLを別サーバーにする場合に忘れず行いましょう的なMySQLに関する事
・AnsibleでlocalhostだけじゃなくてWebサーバー側のIPのも作成しましょう
・Ansibleでmy.cnfでbind_addressでWebサーバーから接続できるようループバックからIPに変更する
Linux関係のメモ201407
Ubuntu系でのchkconfigに変わるコマンドってなんだっけ?
-> sysv-rc-confがそれに相当するがデフォルトでは入っていないのでインストールが必要……
checkconfigてLinux全般共通じゃなかったんだ……
・Ubuntu系でインストール済みのパッケージを見るのはdpkg -l(える) この後にgrep付けるヨロシ
・Ubuntuでパッケージの検索はapt-cache search
apt-get searchじゃなかった……
PHPあべし!
最近PHP触ってて「あべし!」ってなった事。
PHP5.5でempty()の仕様が若干変わっているから注意。他人がPHP5.5で作成したものが自分の開発環境のPHP5.4だとエラーになるから調べてたら。php.netに書いてあった。ついでにPHP5.5で追加された関数とか増えてるの気づいた。
愚痴、FuelPHPのファイルとクラスの命名規則の関係はどうにかならないものか。
低レベルプログラマだからJavaScriptで知らなかった事
JavaScriptで知らないせいでハマったところなどなど
Chromeで確認した時に動いたせいで気付かなかったんだけど、イベントトリガの関数定義で引数にeventオブジェクトを明示して渡さないとIE系では正しく動かない。これはChromeが異常なのかも。
そらそうだという話なんですが、フォームの値は基本テキスト型だからJSで数字として扱って計算したい場合は数字型に変換が必要。そうしないと足し算しようとしたのに文字列連結になってしまう。
JS数字計算で2進数から10進数への変換誤差がでて死ぬる。
100+10.1とかやろうとすると物凄い小さい数字が誤差として丸められず残る。