システムオペレータの週末

運用おつ。開発しようよ!

laravel5のインストールで、ファイルパーミッションエラー

半年以上ぶりの更新が、さっきまで5時間くらいハマった内容です。

今後、ハマらないようにメモ。
やったこともないPHPでいきなりlaravelなんていうフレームワークのしかも最新版だったから情報がなかった。

経緯

ハマるまでの流れは、laravel5のドキュメントに沿って laravelのインストールを進めていたところだった。

// composerでlaravel5をインストール
$ composer global require "laravel/installer=~1.1"

// laravelプロジェクトを展開するディレクトリへ移動
$ cd /var/www

// wwwディレクトリ下にlaravelというプロジェクトを作成する。
$ laravel new laravel

最後に、apacheのルートディレクトリを変更し、.htaccessを有効にする。

$ sudo vi /etc/httpd/conf/httpd.conf

// ドキュメントルートを/var/www/laravel/publicへ変更
DocumentRoot "/var/www/laravel/public"

// Directoryも同じように変更
// AllowOverride All でhtaccessを有効化。
<Directory "/var/www/laravel/public">
    AllowOverride All
    Require all granted
</Directory>

ここまでは問題なくいった。

HTTP 500 - 内部サーバー エラー

ドキュメントの指示に従い、storagebootstrap/cacheディレクトリ配下をすべてパーミッションを読書き可能に変更。 ユーザはhttpdのユーザを指定。今回はapache

// laravelディレクトリ下の所有者・所有グループをapacheに変更。
$ sudo chown -R apache:apache /var/www/laravel

// storageディレクトリのパーミッションを775へ変更。
$ sudo chmod -R 775 /var/www/laravel/storage

// bootstrap/cacheディレクトリのパーミッションを775へ変更。
$ sudo chmod -R 775 /var/www/laravel/bootstrap/cache

とりあえずここまできたらブラウザから稼働確認できそうだったので、http://localhost:80で確認。

HTTP 500 - 内部サーバー エラー

なんでだ!

パーミッションを777にしてみたり、所有ユーザ変えてみたり、apacheの設定変えてみたりいろいろしてみたけど、駄目だった。。。。

apache エラーログ

ここまで3時間ほど経ったと思う。

神にすがる思いでapacheのエラーログに何か吐いてないか確認。

~
PHP Fatal error:
 Uncaught exception 'UnexpectedValueException' with message
 'The stream or file "/var/www/laravel/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied'

/var/www/laravel/storage/logs/laravel.logが書き込めません。パーミッションがありまあせん。みたいなエラー吐いてた。

パーミッション設定してるよ。。。。。

~~

で、いろいろ調べた結果、ここのコマンド実行したらイケた。

Laravel5 gives Blank Page with 500 status code on Apache fedora22

chcon -R -t httpd_sys_rw_content_t /var/www/laravel/storage
chcon -R -t httpd_sys_rw_content_t /var/www/laravel/bootstrap/cache

何してるかって、selinuxのファイルコンテキストを書き換えてるんですね。httpd_sys_rw_content_tに。

ファイルコンテキストには目つけたけど、httpd_sys_rw_content_tじゃないとだめっていうのにたどり着くまで何時間もかかってしまった。。

しんどい。。。

chconは一時的にファイルコンテキストを変更するコマンドなので、恒久的に変更する場合はsemessageコマンドとか使ったほうがいいかもね。

もし同じところで躓いている人いれば、助けになればと思います。。。。

以上!

Windows環境でのJenkins導入から、アドレス変更まで

Windows環境にJenkinsをインストールして、アドレス変更までのメモ。

Jenkins内の設定(プラグインの管理など)ではなく、Jenkins導入のためにWindowsで設定すべき内容などです。

目的は下記の通り。

  1. Jenkinsをインストールする。
  2. Jenkinsのアドレスをデフォルト(localhost:8080)から変更する。
  3. Jenkinsを開始することができる。

尚、環境はOSがWindows7(64bit) Professionalで、Apache等ウェブサーバの機能をもたない、普通のクライアント環境です。

Jenkinsのインストール

Jenkinsのインストール自体は難しくありません。

公式ページより、ネイティブパッケージをダウンロード。

f:id:momoiro_tj:20140914193447j:plain

ダウンロードされたzipファイルを解凍。

中のsetuo.exeを実行。

f:id:momoiro_tj:20140914193545j:plain

あとは、指示に従いインストールするだけ。インストールフォルダを指定するだけです。

これでとりあえずインストールは完了です。

Jenkinsの起動

インストール後、ブラウザが立ち上がりhttp://localhost:8080もしくは、127.0.0.1:8080でJenkinsが開始されます。自動で上がってこなければ、ブラウザでアドレスを直接入力してみてください。

もし開かない場合は、windowsのサービスが開始されているか確認してみてください。タスクバーを右クリックし、タスクマネージャを起動し、サービスにJenkins開始になっていればOKです。なければ、コントロールパネル⇒管理ツール⇒サービスから、Jenkinsを右クリックし、開始してください。起動まで少し時間がかかるので、すぐ見れない場合があるかもしれません。(ここでハマりました。←)

不要かもしれませんが、それでも開かない場合はコントロールパネル⇒プログラムと機能⇒Windowsの機能の有効化または無効化より、インターネットインフォメーションサービス内のweb管理ツールWorld Wide Webサービスを有効にしてみるといいかもしれません。(尚、その二つにチェックを入れると、中の項目は自動で次のようにチェックされるのでそのままでOKです。)

f:id:momoiro_tj:20140914233659j:plain

アドレスの変更

http://localhost:8080は、もしかすると他のweb関連のアプリケーションなどで使用する可能性があるので、任意のアドレスに変えます。今回は、参考にさせていただいたサイトと同じようにhttp://localhost/jenkinsでアクセスできるように設定します。

することは2つです。

  1. jenkins.xmlを変更
  2. jenkinsサービスを再起動

2が大事です。1はそんなに難しくないですが、2を意外と忘れます。

jenkins.xmlを変更する

jenkinsをインストールしたフォルダ(デフォルトだとC:\Program Files (x86)\Jenkinsとか)直下の、jenkins.xmlをメモ帳などの適当なテキストエディタで編集します。

変更前
<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080</arguments>
↓
変更後
<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=80 --prefix=/jenkins</arguments>

後半の--httpPort=8080httpPort=80 --prefix=/jenkinsのように変更します。

80番ポートは記述不要なので、http://localhost/jenkinsでアクセスできるようになるはずです。

jenkinsサービスの再起動

上記で設定は完了ですが、jenkinsを再起動するまで、設定は反映されません。なので、サービスを再起動させます。

http://localhost:8080でアクセスしている場合、http://localhost:8080/safeRestartでjenkinsの再起動が可能です。

windowsのサービスより直接再起動してもOKです。

再起動後は1分くらいで上がってくるので、開始後、http://localhost/jenkinsでアクセスできるかと思います。


以上、あとはアカウント作ったり、プラグイン追加したり自分なりに設定していきます。

ちなみに、windowsのhostsファイル触れば、localhostも変えれるみたい。ネットワーク関係疎くて、躓いたのでメモ程度に。

参考

【ant入門】java自動実行タスクをつくってみた

最近jenkinsを触ってて、改めてAntとかMavenとかのビルドツールについて勉強し始めた。

Antって意外とネットに日本語の解説してくれてるサイトがないので、私は英語のドキュメントで簡単に勉強しました。
日本語のドキュメントもあるので、英語苦手な人はこっちがよさげ。

Apache Ant - ようこそ

javaファイルを管理するために、簡単なAntスクリプト?組んだので、メモ程度に。
もし、練習とか検証とかにコピペで使いたい人とかいれば、Antインストール後にソースファイルがあるフォルダにbuild.xmlファイルを作って、そこにコピペしてください。
ソースファイルフォルダに移動して、コマンドラインからantを実行で使えます。

antのインストールは割愛します。

build.xml作成

次の通りbuild.xml作りました。

<?xml version="1.0" encoding="Shift_JIS"?>
<project name="AntSample" default="exec" basedir=".">

    <!--source,targetフォルダ作成。ソースファイルコピー-->
    <target name="init">
        <mkdir dir="source" />
        <mkdir dir="target" />
        <copy todir="source">
            <fileset dir="." includes="**.java" />
        </copy>
    </target>

    <!--コンパイル-->
    <target name="compile" depends="init">
        <javac srcdir="source" destdir="target" encoding="Shift_JIS" includeAntRuntime="false" />
    </target>

    <!--実行-->
    <target name="exec" depends="compile">
        <!--classnameを実行するclass名に変更する-->

        <!--GUIを伴うので別プロセスで実行。※spawn=true/fork=true-->
        <java classname="AntSample" classpath="target" spawn="true" fork="true" />
    </target>
</project>

antはルート要素にproject要素をもち、その中にtarget要素を含むのが基本的な形式。

project要素のname属性、basedir属性、default属性はあった方がいい。(必須ではない。)

  • name : project名
  • basedir : 基本となるディレクトリ(.で、build.xmlがあるカレントディレクトリ)
  • default : ant実行時に、targetを指定しなかった場合、自動で実行されるtarget

target要素には、実際に実行するタスクを記述していきます。

  • name : targetを識別する名前
  • depends : targetが依存するtargetを指定。指定されたtargetは実行前に必ず実行される。

initのtarget要素では、mkdir要素でソースファイル用のsourceフォルダ、classファイルを出力するtargetフォルダを作成しています。
また、copy要素で、拡張子が.javaのファイルをカレントディレクトリ内で探し、sourceフォルダにコピーしています。

compileのtarget要素では、javac要素で、sourceフォルダ内のjavaソースをコンパイルし、targetフォルダに出力ています。
includeAntRuntime属性は必ずfalseにする必要があるっぽいです。

最後に、execのtarget要素では、java要素で指定のclassを実行します。
使用時は、classname属性を実行するclass名に変更してください。
また、ウィンドウをもつプログラムの場合、別プロセスで実行したいので、spawn属性、fork属性をtrueに設定します。(コマンドラインベースの場合は指定不要)

また、各target要素には、depends属性を設定しており、project要素のdefault属性にexecを指定しているので、さかのぼって

init => compile => exec

の順に実行されます。

実行例

適当に、ウィンドウをもつjavaプログラムを作成します。

//AntSample.java
import javax.swing.*;

public class AntSample {
    public static void main(String args[]) {
        JFrame frame = new JFrame("ant_sample");
        
        //サイズを指定
        frame.setSize(800, 600);

        //×ボタンで終了を指定
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //ウィンドウを可視化
        frame.setVisible(true);
    }
}

build.xmlと同じディレクトリに配置します。

.
    AntSample.java
    build.xml

コマンドプロンプトを開き、build.xmlがあるディレクトリに移動。antを実行。

cd C:\antSample
ant

Buildfile: C:\antSample\build.xml

init:
    [mkdir] Created dir: C:\antSample\source
    [mkdir] Created dir: C:\antSample\target
     [copy] Copying 1 file to C:\antSample\source

compile:
    [javac] Compiling 1 source file to C:\antSample\target

exec:

BUILD SUCCESSFUL
Total time: 1 second

すると、sourceフォルダ、targetフォルダが作成され、JFrameのウィンドウが表示される。
コンパイルから実行まで一連をantコマンドひとつでできるので便利。

実行後のフォルダ構成は次の通り。

.
│  AntSample.java
│  build.xml
│
├─source
│      AntSample.java
│
└─target
        AntSample.class

ant、もっといろいろできるみたいなので、もうちょっと勉強したいなー。


参考

Apache Ant User Manual

7. 基本的なタスク | TECHSCORE(テックスコア)

現場に活かすJakarta Project(2):AntでJavaのビルドを簡単にする - @IT

AntでJavaを実行する手順のまとめと、線形探索。 - 感謝のプログラミング 10000時間

Antを勉強する - それはBooks

【いまさらlinux】 cutとsedで、インストール済みパッケージ名一覧を作成する(centOS)

久しぶりの更新。←毎回

cutコマンドとsedコマンドを覚えたので使ってみた。
丁度、yum list installedで出力されるインストール済みパッケージ一覧のうち、パッケージ名のみを抽出するコマンドを書いたので、覚え書き。

yum list installed | cut -f1 -d' ' | sed -e '/^$/d'

(もしかして、もっと簡単な方法ある・・・?)

パイプばっかりであまり美しくないけどとりあえず。

流れとしては、


  1. yum list installed で、インストール済みパッケージ一覧を表示
  2. cutコマンドでスペース区切り(-d' ')の1フィールド目を取り出す(-f1)。
  3. 空行が残るので、sedコマンドで空行を削除(-e '/^$/d')。

抽出結果をyum infoに渡してインストール済みパッケージの調査とかに使いました。

cutとsed、便利なのでこれから使って行こうっと。

【Word Tips】段落の左側に表示される中点の消し方に物申す

今日から先輩社員として頑張ります。momoiro_tjです。なんだかんだ1年間仕事つづけるとある程度なれるものですね。慣れって怖い。

前に一度記事に上げましたが、あれ以来メモやらなんやらをいろいろとWordでとっています。
構造的に文章書けるし、レイアウトもいろいろ触れるし、なにより仕事でつかえる。

ただ、評判が両極端であるだけあって、やはり使いにくかったりする面も多々あります。
(例えば、スタイル変更しても反映されない場合が合ったり、変なタイミングで変更されちゃったり・・・)

その中で、段落の編集記号になっている中点が邪魔っていうのに焦点を置いてみます。

段落の編集記号

段落の編集記号っていうのは、次のようなものです。

f:id:momoiro_tj:20140519182334j:plain

普通に使う分には現れにくいです。(アウトラインを使わなければ標準スタイルが適用されるため)
ただし、アウトライン機能を使い、レベルを設定するとこの段落記号が現れる場合があります。
デフォルト(normal.dat)では標準以外のスタイルを使用すると大体付きますね。

これは、印刷には反映されません。
L字矢印の改行マークと同じで、ただの編集記号で気にしなくてもいいものです。

ただ、編集記号とはいえ見栄えに影響するので、見えなくしたいニーズはあるようで、webで消し方を検索すると質問や解説が結構出てきます。

この編集記号は2通りの消し方があります。一つは段落としての機能を一部無効にする方法。もう一つは編集記号を非表示にする方法です。

段落編集記号の消し方 その1 ※非推奨

webによく上がっている段落記号の消し方はこちらの方法です。

  1. 段落リボンの右下の三角より、段落の設定ダイアログを開きます。(スタイルの段落設定からでも可)
  2. ダイアログの「改ページと改行」タブを開く
  3. チェックボックスのチェックをすべて外す。

    f:id:momoiro_tj:20140519184636j:plain

  4. 「OK」で確定する。

以上の手順で消えると思います。

しかし、この方法では段落の機能を一部無効にしてしまいます。

例えば、「次の段落と分離しない」のチェックを入れておくと、連続して一つのページに入れておきたい段落の間で改ページしないように設定できます。

また、「段落前で改ページする」のチェックを入れると、その段落の前で必ず改ページをするようにできます。段落・スタイルによりページやセクションを区切る場合などに便利です。

とにかく、この記号を消したい!といった場合は、この方法で問題ありません。
しかし、紙に出力したかったり、細かくレイアウトしたい場合はこういった設定は必要不可欠です。

なので、次の紹介する方法で"一時的に"編集記号を無効にする方法をお勧めします。

段落編集記号の消し方 その2 ※推奨

こちらの方法は先ほどのやり方と違ってとても簡単です。

  1. 段落リボンの「編集記号の表示/非表示」をオフ(非表示)に設定します。 (ショートカット : Ctrl + Shift + 9)

    f:id:momoiro_tj:20140519185709j:plain

これだけです。

ただし!改行やタブ、空白などのその他の編集記号もすべて消えてしまいます。
一時的にレイアウトを確認する場合など、この方法を使用するとよいです。

しかも、改行や、タブなどの編集記号も一時的に消えるため、レイアウトのチェックには最適です。
また、1の方法よりも簡単で、表示・非表示ができる、段落の設定も細かくできるなど、メリットはかなり多いと思います。
というか、これが正しい方法なんじゃないか?と思います。


ソフトは上手に使いましょう。使い方も知らないまま批判するのはいかがでしょうか!
是非、wordも愛してあげてください☆

【メモ】いち早くwebサーバの稼働を確認したい!

お久しぶりです。最近、でんぱ組.incにハマり始めて、とりあえずレンタルショップでCD借りてきました。

先日、ローカルネットワークでwebサーバたてようと思って、躓いたところのメモです。webサーバの設定とか以前のところです。
ちなみに、環境はWindows7にインストールしたVMWareFedoraをNAT接続で配置してます。

ホストOSであるWindows7からゲストOSのFedoraにたてたWebサーバのサンプルページが表示するだけです。webサーバの設定は全く触りません。

httpdのインストールと起動

まずはwebサーバのhttpdをインストールして起動します。 インストールはyumコマンドで行います。

(sudo) yum -y install httpd

インストールが終わったら、webサーバを起動します。

(sudo) systemctl start httpd.service
もしくは、(sudo) service httpd start

稼働はsystemctl status httpd.serviceまたは、systemctl is-active httpd.serviceservice httpd statusのどれかでActiveの状態がactiveで確認できます。

また、任意ですが起動時に自動起動するよう設定する場合は次の通りです。

(sudo) systemctl enable httpd.service
または、(sudo) chkconfig httpd on

ひとまず、これでwebサーバの導入は完了ということにします。外部に公開したり、アプリケーションの設定などする場合は、/etc/httpd/conf/httpd.configを編集し、サーバの詳細設定を行ってください。

現状では、ホストOSからブラウザにゲストOSのIPアドレスを入力し、テストページを表示しようとしても接続できません。

ping接続確認

まずは、ネットワークがちゃんとつながっているかを確認します。基本のping

ping -c 5 192.168.XXX.XXX

ホストOSからとゲストOSからの両方を確認します。VMWareであれば基本的につながっているとは思いますが一応。。。

firewalldでhttpの許可

ここが肝です。fedoraを起動すると自動でfirewalld、もしくはiptablesが上がっています。いわゆるファイアウォールですね。ここでhttp通信ができないようになっている可能性があります。

私の環境の場合iptablesではなく、firewalldが動いてたので、今回はfirewalldでのhttpの許可を残します。

まずは、今使っているネットワークが何なのかをifconfigで調べて、firewalldのどのゾーンに入っているのかを調べます。 下の例ではeth0のゾーンを調べてます。

firewall-cmd --list-all-zone | grep eth0 -1

eth0の記述がある前後1行ずつを取り出してます。 結果はこんな感じになると思われます。

public
interface: eth0
service: mdns dhcpv6-client ssh

eth0はpublicのゾーンに入っており、serviceにhttpが入っていないので、http通信は拒否されるよう設定されています。

なので、次のコマンドでpublicゾーンにhttp通信を許可してやります。

firewall-cmd --add-service=http --zone=public

httpが許可れされますので、publicゾーンのサービスを調べてやるとhttpが追加されていると思います。

ちなみに、デスクトップを入れてる場合、そちらからGUI環境で簡単に設定することができます☆

もしかしたら、これで再度ホストOSブラウザから表示させると表示されるかもしれません。表示されたらとりあえずオッケーですね。

SELinuxの無効化

それでも表示されない場合、SELinuxが悪さしてる可能性があるので、

(sudo) setenforce 0

SELinuxを一時的に無効にしてやります。


とりあえず、これで私の環境ではサンプルページの確認できました。

ということで、メモ。

【雑記】PDCAのC

Cが一番難しい

例えば、飲み会を企画したとする。

先輩2人、同期2人と自分の計5人。19:00からよく行く飲み屋の予約を取り、行ける人で2次会は軽くカラオケ。

まあよくある飲み会。

さらに、全体として60点くらいの飲み会だったとする。

原因として、先輩はまあ楽しめたけど同期はちょっと気を使ったとか、カラオケの盛り上がりがいまいちだったとかそんな感じ。

企画した自分はそれを振り返って改善策を練って、次はもっといい飲み会を企画しようと画策する。

でも、ここが難しいと思う。

振り返っても正しい問題を見つけることは困難だし、先輩や同期がどう感じていたかなんて全く分からない。一人で考えても結局独りよがりの考えしかでてこない。 とはいえ、「昨日どうでした?」なんて聞くのはスマートじゃない。

飲み会の間、常に周りを意識していないと振り返るときうまくまとめられない。PDCAのCが一番難しいということ。

Checkができないと次のActionにつなげられない。Planもたてられない。Doもできない。PDCAがそもそも回らない。

とはいえ、飲み会の間周りの顔色ばかりうかがってては周りが逆に気を使うかもしれないし、なにより自分が楽しめない。

上手く振り返れたとしても

仮に、うまくCheck、振り返りができたとする。100点満点の振り返り。

改善策もまあいいものができた。次の飲み会こそは大成功間違いなし。

60点だった飲み会の残り40点分を振り返り、補完する改善策を考えた。次は100点間違いなし。

でもそんなことないよね。新しい問題が出てくるかもしれないし、次の飲み会は環境とかが全然違うかもしれない。

60点と思っていた飲み会も2回目の飲み会を終えた後では40点以下の自己評価になってるかもしれない。

それで、2回目に企画した飲み会が70点になれば、ちょっとずつ前に進んでるのかもしれない。

PDCAをまわして、ちょっとずつ前に進めたらいいなあ、と。


考えは言葉となり
言葉は行動となり
行動は習慣となり
習慣は人格となり
人格は運命となる

映画『マーガレット・サッチャー 鉄の女の涙』より