swaggerからlaravelにリクエストするとCORS制限に引っかかる
swaggerとlaravelを別コンテナで動かしている。その時にswaggerからlaravelにリクエストしたら、以下のようなエラーが表示されてリクエストに失敗する。
Failed to fetch.
Possible Reasons:CORS
Network Failure
URL scheme must be "http" or "https" for CORS request.
それぞれ以下の状態。動いているポートが違うので別のオリジン?となるらしく、ブラウザによりswagger → laravelへのリクエストが制限される。
- swagger
- laravel
制限を回避したいので、やり方をChatGPTに聞いたら、以下の回答があった。
- 自作ミドルウェアを作る
- fruitcake/laravel-cors をインストールする
上記、どちらもlaravel側で対応する方法。開発中にしか実施しないので、laravelのソースに余計なものは入れたくない。。なので、laravelを動かすコンテナをビルドするときのapacheの設定で回避する。
- Dockerfile
Dockerfileで、headersモジュールを有効にする。
RUN a2enmod rewrite headers
- apache.conf
apache.confにAccess-Control-Allow部分を追記する。
<VirtualHost *:80>
DocumentRoot /var/www/html/public
<Directory /var/www/html/public>
AllowOverride All
Require all granted
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
Header set Access-Control-Allow-Headers "Origin, Content-Type, Authorization, X-Requested-With"
</IfModule>
</Directory>
</VirtualHost>上記に変更して再度、コンテナをビルドする。laravelのpublic/.htaccessに書く方法もあったけど、laravelはあまり変更したくないのでapache.confに書いた。
CentOS7を触ってみた感想
centOS7を触ったのでメモ。基本的にserviceコマンドやchkconfigコマンドがsystemctlに置き換わった感じ。
デフォルトのDBがMariaDBになってるみたい。MariaDBはmysqlのフォークしたものだから基本は同じでmysqlをベースとして独自機能が追加されてる。
まだDBまわりはよくわかってないので、今は基本的な操作のコマンドを見てる。
大きく変わったのは以下の2つのコマンド
・service
・chkconfig
これがsystemctlになった。たぶん普段からサーバを触ってる人にはここが一番の変更点じゃないだろうか。
topとかpsとかはそのままなのでミドルウェアとかサービスの起動、停止、再起動まわりが全部変わった印象。
あとはiptablesがデフォルトでは入っていない。LAMP環境の構築でおなじみのiptablesを無効にする設定が要らなくなった。
もうひとつ。ifconfigがipコマンドに変更された。普段は使わないけどネットワークの設定変更やサーバの初期設定時に使用するので意外と重要かもしれない。
あと、気になったのはサーバの起動時間を表示するコマンドが追加された。
systemd-analyze
Startup finished in 378ms (kernel) + 2.219s (initrd) + 27.887s (userspace) = 30.485s
こんな感じで表示してくれる。
詳細を見ることもできる。systemd-analyze blameとすると各サービスやデーモンの起動にどれくらい時間がかかったかを確認できる。
systemd-analyze blame | head -20
とすると上位20件が見れて便利。
13.278s td-agent.service
9.694s mariadb.service
8.555s postfix.service上位3件はこの方達でした。postfixは使わないので停止します。
vagrant upできない
vagrantのboxファイルから環境を作ってvagrant upとやると以下のようなエラーが出た。
Progress state: E_FAIL VBoxManage.exe: error: Appliance import failed VBoxManage.exe: error: Details: code VBOX_E_OBJECT_IN_USE (0x80bb000c), component Medium, interface IMedium VBoxManage.exe: error: Context: "int __cdecl handleImportAppliance(struct HandlerArg *)" at line 779 of file VBoxManageAppliance.cpp
virtualboxのバージョンを最新にしたけど直らなくて困っていたらvirtualboxのidファイルがないことが原因だった。terurou.hateblo.jp
を参考にして以下にidだけを書いたidというファイル名のファイルを作ってvagrant upしたらちゃんと動いた。
C:\cygwin64\home\hoi\.vagrant\machines\default\virtualbox\
boxファイルから環境を作ったのにidファイルは自動で作られなくて、どのvmを見ればいいのかがわからなくなっていた様子。
idの表示方法はwindowsの場合はコマンドプロンプトで以下に移動して
cd C:\Program Files\Oracle\VirtualBox VBoxManage list vms
とする。表示される{}の部分はいらないのでidだけを書く。
Cent OS6.3でpecl_httpが動かない
Cent OS6.3でpecl_httpが動かない。インストールはうまくいって
extension=http.soで読み込むモジュールも指定してapacheも再起動したのにうまくいかない。
pecl list ========================================= Package Version State pecl_http 2.0.3 stable
と出るのでちゃんと入ってるはず。ところがphpのエラーログを見ると、
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/http.so' - /usr/lib64/php/modules/http.so: undefined symbol: php_persistent_handle_abandon in Unknown on line 0
と表示される。
ここによると最新のpecl_httpはうまく動かないので一旦削除して古いのを入れると動くとのこと。
2系ではなく1.7系のを入れなおすとうまく動いた。
pecl uninstall pecl_http pecl install pecl_http-1.7.6
新しければいいってものでもないのね。
これを書いた一年後に気づいたけど、これは別にcentOSでpecl_httpが動かないわけではなくて、アプリで使っているpecl_httpが1.7系の関数を使ってて2系にしたら動かなかったって話し。なのでこの記事はなんの参考にもなりません。
windows8でRubyのパスが通らない
Vagrantを使ってみようと思ってVirtualBoxを準備してインストールしてみた。さっそく公式サイトを参考に
vagrant init precise32 http://files.vagrantup.com/precise32.box
としてみる。なんかずらーと表示されて途中で止まってるぽい。Rubyがどうとか言っている。事前にRubyがいるとは書いてなかったんだけど、とりあえずRubyも入れる。RubyInstaller for Windowsからダウンロードしてきてインストール。ちゃんと入ったか見るのにコマンドプロンプトで
ruby -v
とやるとpathが通ってないといわれる。インストール時にパスを通す設定にしたのになんでだろうと、と思いつつpathを確認。通ってない。pathを通して、
path
と入力するもさっき通したはずのパスが表示されない。何度
確認しても環境変数にはちゃんとパスが書いてあるのにコマンドプロンプトではパスがないとのこと。
ダメもとで再起動したら無事に表示された。
パスって再起動しないと反映されなかったっけ?再起動をしてくださいのメッセージもなかったし。これで一日無駄にしたよ!
206SHでUSBデバッグをする
しばらくぶりのandroid情報。勉強がてらにSHARPの206SHをUSBでつないでEclipseからデバッグしてみる。android SDKやアプリのプロジェクトはもう作ってあることを前提で、それ以降の手順。
USBドライバを準備する
SH Developers Square - ドライバからUSBドライバをダウンロード。機種によっては事前に別のドライバも入れておかなくてはいけないみたい。詳しくはリンク先を見てね。それが必要なければusb_driver_SHARP_r8.2.zipというのをダウンロードして解凍する。
USBデバッグを有効化
端末の設定からUSBデバッグができるように設定を変更する。android4.2以降は端末のビルド番号という部分を7回タップすると開発者用の設定メニューが表示されるようになる。開発者用の画面が表示されたらUSBデバッグにチェックを入れて有効化。
USBドライバをインストール
USBケーブルでPCと接続。その後、コンピューターを右クリックしてプロパティからデバイスマネージャーを選択する。android deviceというのがあればそれを選択。そこからドライバをインストールするウィザードを表示して
、先ほどダウンロードしたフォルダの中のusb_driver_SHARPというのを選択。これでドライバのインストールが完了。
アプリを転送
Eclipseのプロジェクト画面から実行を選択すると、現在接続されてるデバイスが表示されるので、それを選択してOKを押すとアプリが転送されて自動で起動する。
参考:Galaxy Nexus(SC-04D)のCWM Recovery起動時のドライバ(Android Composite ADB Interface)インストール方法。
grepでディレクトリ内のファイルを検索
ディレクトリの中から探したい文字列を含むファイルを表示する。
grep -rli 'work' ./
この場合はカレントディレクトリ内でworkを含むファイルを表示する。
その一覧をファイルに出力したいときは、
grep -rli 'work' ./ >> /home/pon/list.txt
とする。