とあるサーバーサイドエンジニアの備忘録

バグのないプログラムは存在しないらしいですが、デバッグの不可能なプログラムもまた存在しないのですよ

有給を申請しようとしたら待ったがかかった話

久しぶりのブログが不穏なタイトルなのでちょっと気が引けますが、同じような事例で悩んでいる人も多いだろうと考え記事を書きました。
他にも不穏なネタは持っていますが、それについてはまた後日……

何が起きたか

タイトル通りなんですが、12月28日に有給を申請しようとしたら待ったがかかりました。申請しようとしたらなのでまだ申請はしていない段階で、相談レベルで待ったがかかったというわけです。
現プロジェクトの上司A,上司Bは快諾してくれましたが、課長の上司Cが待ったをかけたという状況です。プロジェクト内での調整は問題なく行っているため、業務に支障が出るからというわけではありません。
上司Cが待ったをかけた理由は「28日は仕事納めと忘年会がある。会社の行事は原則参加が基本。だから余程の理由が無い限り認められないかも」とのこと。まだ申請を出したわけではないので明確に有給が不承認になったわけではありませんが、申請ルートには上司Cがいるので不承認になる可能性が非常に高い状況です。

対処するために武装する

私としては何としても12月28日に有給を取らなければいけません。完全に私事都合なので上司Cを説得できるほどの理由かとなるとやや疑問なのですが、ここで諦めるわけにはいきません。
アニメ版戦闘妖精雪風の第5話でも「最強のカードを切らずに、死にたくはありませんから」とクーリィ准将が言っているように、できる限りのことをしてダメなのであれば諦められますが、最初から諦めることはできません。
こちらが切ることができる最強のカードは 労働基準法第39条 - Wikibooks (以下39条)にあるとの情報を掴み、スタッフは南米に飛んだ。いや飛んでないですけど、39条やそれに関する判例を紐解くことで今回の件についてどのように対処できるかを検証します。

検証

39条は年次有給休暇について定めたものです。今回の争点となるのは第4項になると思われます。

  1. 使用者は、前3項の規定による有給休暇を労働者の請求する時季に与えなければならない。ただし、請求された時季に有給休暇を与えることが事業の正常な運営を妨げる場合においては、他の時季にこれを与えることができる。

前3項というのは第1項から第3項のことで有給休暇の付与について定めたものです。こちらは全く問題ないのでカット。
39条に関する判例を調べたところ下記のような記事がヒットしました。
(31)【年次有給休暇】年休の取得時季の変更と会社の配慮|労働政策研究・研修機構(JILPT)
浅草社労士の勉強部屋 - 年次有給休暇と時季指定_電電公社此花局事件
39条 第4項の 有給休暇を労働者の請求する時季に与えなければならない というのは時期指定権にあたり、請求された時季に有給休暇を与えることが事業の正常な運営を妨げる場合においては、他の時季にこれを与えることができる というのは時季変更権にあたるそうです。労働者が「この日に有給を使う」と申請するのが時期指定権で、それに対して会社側が切ることができる最強のカードは不承認 = 時季変更権しかないというわけですね。
今回の私の事例に照らし合わせると、12月28日に有給を使いたいというのが時期指定権、仕事納めや忘年会があるからと不承認にする(まだ実際に不承認にされたわけではありませんが)のが時季変更権になるということです。

時季変更権を使う条件

時季変更権は有給の申請に対して何が何でも使えるというわけではありません。使うには条件があります。
それが39条 第4項にある 請求された時季に有給休暇を与えることが事業の正常な運営を妨げる場合 という但し書きです。これ以外の条件でスキルは発動しないわけです。
では事業の正常な運営をうんぬんというのはどういう場合なのかというのは、どのように判断するかってところが気になります。これも調べました。

Q11.使用者が従業員の年休の請求を拒否できるのはどのような場合ですか。|労働政策研究・研修機構(JILPT)

時季変更権行使の要件>

時季変更権を行使するための要件は、労働者の指定した時季の年休取得が「事業の正常な運営を妨げる」ことです。この点の判断にあたっては、事業の内容、規模、労働者の担当業務の内容、業務の繁閑、予定された年休の日数、他の労働者の休暇との調整など諸般の事情を総合判断する必要がありますが、日常的に業務が忙しいことや慢性的に人手が足りないことだけでは、この要件は充たされないと考えられます。そう考えないと、人手不足の事業場ではおよそ年休がとれなくなるからです。なお、指定した年休日数が多い場合、労働者側は事前の調整を要求され、それをしない場合には、使用者の裁量の余地が大きくなると解されています
さらに、使用者は、労働者が指定した時季に年休がとれるように状況に応じた配慮をすることを求められます。すなわち、使用者は年休実現のために、いわゆる「配慮義務」を負い、この配慮を尽くさずに行った時季変更権の行使は無効となります。

つまり、1~2日程度の有給であれば余程の理由が無い限り時季変更権は使えないということです。スキル発動条件が少し多くなりましたね。

余程の理由の例についても一定の見解があります。
浅草社労士の勉強部屋 - 年次有給休暇と時季指定_電電公社此花局事件

① ある特定の日に年休の請求者が集中したとき
② 事業場にとって「きわめて特別の日」に年休請求があったとき
③ 繁閑の差がきわめて大きい事業場で、繁忙期に年休請求があったとき

今回の件だと「仕事納め」や「忘年会」が②にあたるかどうかってことになるんでしょうかね。正直、私の感覚としては「きわめて特別」、略して極別(きわべつ)とは言えないとは思うのです。ちなみに上司Aと上司Bも私と同様の見解です。

(31)【年次有給休暇】年休の取得時季の変更と会社の配慮|労働政策研究・研修機構(JILPT)

事業の正常な運営を妨げる場合とは、労働者が年休を取得しようとする日の仕事が、担当業務や所属部・課・係など一定範囲の業務運営に不可欠で、代替者を確保することが困難な状態を指す

結果的に事業の正常な運営が確保されても、業務運営の定員が決められていることなどから、事前の判断で事業の正常な運営が妨げられると考えられる場合、会社は年休取得時季を変更できる

この点、業務に具体的支障の生ずるおそれが客観的に伺えることを要するとする事例がある

つまり、担当業務(私の場合は現プロジェクトの業務)に不可欠で、代替者を確保することが困難で、それは客観的に誰が見てもわかることでなければならないということですね。
今回の件では「仕事納め(と言いながらほぼいつも通りの業務)」と「忘年会」が現プロジェクトで私が担当している開発作業への影響が大きく、代替者を確保することが困難で、客観的に見てもそれが明らかかどうか。私はそれに当たらないと考えるのですが、今回の上司Cみたいにそうじゃないと考える人もいるみたいですね。いや上司Cがそう考えているかはわからないのですが、少なくとも今の会社の偉い人たちはそう考えていると思います。

上司Cの考え

これは今の職場の事情がふんだんに含まれているのですが、忘年会を楽しみにしていらっしゃる人たちがいるわけです。その人たちは会社の上の方にいたりするわけです。
おそらく上司Cが待ったをかけた理由はそこにあると思います。忘年会を欠席することで忘年会を楽しみにしている偉い人たち、もう少し言うと「忘年会が事業の運営に必要不可欠であり、社員みんなが絶対に喜んでくれると思い込んでいる偉い人たち」からの評価が悪くなり、給料やボーナスに響くかも、昇進に響くかもと言いたいのかなと。偉い人がそこら辺の権限を持っていますからね。だから評価制度が形骸化して偉い人がどう思うかで待遇が決まるという摩訶不思議な現象が起こっているのですが、これはまた別のお話。

浅草社労士の勉強部屋 - 年次有給休暇と時季指定_電電公社此花局事件

(2)年次有給休暇制度

 年休は、法律で義務付けられた唯一の「有給」の休暇制度であり、継続勤務6箇月、かつ、全労働日の8割以上の勤務により、当然に発生します。労働者の請求は、具体的な時季指定であって、請求のために特別な要件はなく、連続して取得することも1日ずつ取得することも認められています。判決要旨にもあるように、年次有給休暇の成立要件として使用者の承認という観念をいれる余地はありません。また、年休を取得したことに対し、不利益な取り扱いをすることも禁止されています。

これって響くかもって言った時点でアウトな気もしますが、いずれにせよ今回の有給取得を会社側が拒否することはできないと思います。 また、理由によって時季変更権を使うかどうか決めるというのもアウトなので「余程の理由が無い限り有給取得を認めない」ってのがそもそもアウトですね。とりあえず話し合いの場が設けられるそうなので、進展があればここに追記します。

余談

有給について調べるとトラブルが多いのかいろんな記事がいっぱい出てきます。
有給の扱いについては新卒で入った会社が一番緩く、法律的にも全く問題ない運用がされていた気がします。前日の17時に規定の用紙に日付と「私用」と2文字書いて箱に入れておくだけで大丈夫という、ここまで緩い運用をしている会社は日本でここだけなのではと思うほどでした。計画年休は実施されておらず、所属する部署の上長と二言くらい話すだけで承認が下りてましたね。

私 「有給取りたいのでハンコください」
上長「はい」

本当にこれだけ。おかげで有給消化率100%でした。

2番目の会社はちょっと問題がありまして、入社後半年経たずに計画年休が発生し給料が減るというこれまた摩訶不思議な現象が起こる会社でした。
なんとお盆休みを計画年休で休ませるというブラック極まったものだったのですが、どうすればいいかを聞いても出勤か欠勤かの2択を迫られ、出勤を選んだら前例が無いという理由で拒否されると……。ブラック極まってましたね。
私はプロジェクトのスケジュール遅延を取り戻すという名目で出勤を勝ち取り(?)仕事していましたが、どうやら有給が無い社員に計画年休を使う際に欠勤扱いにすることは違法だそうです。
会社の勝手にさせないための「有給休暇の計画的付与」の知識

計画しようとしている休暇日数に足らない数の日数しか持っていない労働者の問題です。
 その場合はどうするのか?以下の対策が考えられます。
足らない労働者の休暇数を足りるように付けくわえてあげる
足らない日数については、会社の休日としてしまう
 とにもかくにも、このような努力をしないで計画を強行し、日数が足らない労働者を無給の休みにすることは許されません。
 この場合使用者の責任による休業となるので、労働基準法第26条に基づいて休業補償を支払わなければなりません。

思いっきり違法ですがな。今の会社でも計画年休の制度はありますが、休むかどうかは本人の自由なので違法ではないということになってます。

PHP V8jsをubuntu 16.04で使おうとしたら失敗した話

前回の失敗を踏まえて、ubuntuならすんなりと動くという情報をキャッチした私は南米へ飛ばずubuntuで試してみることにしました。

試した環境

必要なもの

準備

必要になるツールをインストールします。

apt-get install build-essential git python libglib2.0-dev
cd /tmp
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=`pwd`/depot_tools:"$PATH"

V8のインストール

V8jsはV8を使うのでもちろんV8が必要です。なのでV8をインストールします。

ソースの取得

fetch v8
cd ./v8
git checkout 5.6.326.12
gclient sync

かなり時間がかかりますので、マッドマックス怒りのデスロードでも見て待ちましょう。今回は見ません。

コンパイル

コンパイルにはninjaというツールを使います。TAXi2のように「ニンジャ~!」と叫んでコンパイルを走らせるわけです。叫ばないですけど。

tools/dev/v8gen.py -vv x64.release
echo is_component_build = true >> out.gn/x64.release/args.gn
ninja -C out.gn/x64.release
make library=shared snapshot=off native

こちらもかなり時間がかかりますのでV8エンジンの祈りでもして待ちましょう。おいしい紅茶を飲むのもいいと思います。

必要なファイルをコピーする

mkdir -p /opt/v8/{lib,include}
cp out.gn/x64.release/lib*.so out.gn/x64.release/*_blob.bin /opt/v8/lib/
cp -R include/* /opt/v8/include/
cp out.gn/x64.release/lib*.so out.gn/x64.release/*_blob.bin /usr/lib/
cp -R include/* /usr/include/
cp out/native/lib.target/lib*.so /usr/lib/
cp out/native/*_blob.bin /usr/lib/
cp -R include/* /usr/include

PHPのインストール

PHPは7.0以上が必要です。とりあえず入れます。

apt-get install php php7.0-dev
# php -v
PHP 7.0.8-0ubuntu0.16.04.3 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.8-0ubuntu0.16.04.3, Copyright (c) 1999-2016, by Zend Technologies

pearのインストール

V8jsはPECLを使ってインストールします。PECLを使うにはpearが必要です。なのでpearをインストールしてPECLでインストールします。

apt-get install php-pear

V8jsのインストール

やっとここまで来ました。長かったですね。

pecl install v8js
Build complete.
Don't forget to run 'make test'.

running: make INSTALL_ROOT="/tmp/pear/temp/pear-build-rootII1C92/install-v8js-1.3.3" install
Installing shared extensions:     /tmp/pear/temp/pear-build-rootII1C92/install-v8js-1.3.3/usr/lib/php/20151012/
running: find "/tmp/pear/temp/pear-build-rootII1C92/install-v8js-1.3.3" | xargs ls -dils
296656    4 drwxr-xr-x 3 root root    4096 Dec 13 15:11 /tmp/pear/temp/pear-build-rootII1C92/install-v8js-1.3.3
296702    4 drwxr-xr-x 3 root root    4096 Dec 13 15:11 /tmp/pear/temp/pear-build-rootII1C92/install-v8js-1.3.3/usr
296703    4 drwxr-xr-x 3 root root    4096 Dec 13 15:11 /tmp/pear/temp/pear-build-rootII1C92/install-v8js-1.3.3/usr/lib
296704    4 drwxr-xr-x 3 root root    4096 Dec 13 15:11 /tmp/pear/temp/pear-build-rootII1C92/install-v8js-1.3.3/usr/lib/php
296705    4 drwxr-xr-x 2 root root    4096 Dec 13 15:11 /tmp/pear/temp/pear-build-rootII1C92/install-v8js-1.3.3/usr/lib/php/20151012
296701 2780 -rwxr-xr-x 1 root root 2846520 Dec 13 15:11 /tmp/pear/temp/pear-build-rootII1C92/install-v8js-1.3.3/usr/lib/php/20151012/v8js.so

Build process completed successfully
Installing '/usr/lib/php/20151012/v8js.so'
install ok: channel://pecl.php.net/v8js-1.3.3
configuration option "php_ini" is not set to php.ini location
You should add "extension=v8js.so" to php.ini

php.iniの設定

php.iniにextension=/usr/lib/v8js.soを追加します。

php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

確認してみる。

# php -m | grep v8js
v8js

やったね!
これでインストールは完了です。CentOSの時と違ってすごくスムーズにインストールできました。

PHPで動かす

とりあえず適当にPHPを書いて動かしてみましょう。

<?php
$v8 = new V8js();
php test.php
ここで動いてサンプルのコード載せて終わると思うじゃないですか。僕もそう思ってたんですよ。  
  
  
  
  
  
  
動きませんでした。  
何を言っているのかわからないと思いますが、私もなぜ動かないのかわかりません。  
エラーはCentOSの時と同じくシンボルが見つからないというエラーですが、何が何だかさっぱりわかりません……。  
違うバージョンのV8でも試してみましたが、同じエラーが出て動きませんでした。  
とりあえずV8jsはここでいったん終わりたいと思います。もう気力がない……

PHP V8jsをCentOS7で使おうとして失敗した話

事の発端

会社で勉強会の発表をしないといけない。

PHPのドキュメントを読んでいたらV8jsなるものを見つける。

最近業務でNode.jsやったしこれいいんじゃねと飛びつく。

V8jsとは

V8jsとは、Googleが開発したJavaScriptエンジンであるV8をPHPから利用するためのモジュールです。
つまりどういうことかと言いますと、PHPからjavaScriptを実行できるようになります。何を言っているんだこいつはと思うかもしれませんが、そういうことです。
闇を感じますが、PHPの公式ドキュメントにもあるちゃんとしたライブラリです。でもPHPの闇の一部であることは間違いないと思います。
http://php.net/manual/ja/book.v8js.php

環境

Vagrant + CentOS 7.2

必要なもの

PythonGCCはCentOS7以上なら最初から入っていますので楽です。

  • Google V8
  • Python 2.7以上
  • GCC 4.6以上
  • PHP 7.0以上
  • Git
  • glib2-devel
  • build-essential(Development Tools)

準備

必要になるツールをインストールします。

yum install git python glib2-devel
yum groupinstall "Development Tools"
cd /tmp
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=`pwd`/depot_tools:"$PATH"

V8のインストール

V8jsはV8を使うのでもちろんV8が必要です。なのでV8をインストールします。

ソースの取得

fetch v8
cd ./v8

かなり時間がかかりますので、マッドマックス怒りのデスロードでも見て待ちましょう。

コンパイル

公式ではninjaだけでコンパイルみたいに書いてますが、なぜかninjaでエラーが出てmakeじゃないと通らなかった。CentOSだと失敗するみたい。

ninjaでやる場合
tools/dev/v8gen.py -vv x64.release
echo is_component_build = true >> out.gn/x64.release/args.gn
echo v8_enable_i18n_support = false >> out.gn/x64.release/args.gn
ninja -C out.gn/x64.release

makeでやる場合
make library=shared i18nsupport=off native

こちらもかなり時間がかかりますのでV8エンジンの祈りでもして待ちましょう。

必要なファイルをコピーする

ninjaでコンパイルした場合
cp out.gn/x64.release/lib*.so out.gn/x64.release/*_blob.bin /usr/lib/
cp -R include/* /usr/include/

makeでコンパイルした場合
cp out/native/lib.target/lib*.so /usr/lib/
cp out/native/*_blob.bin /usr/lib/
cp -R include/* /usr/include

PHPのインストール

PHPは7.0以上が必要です。とりあえずPHP7.0を入れます。ここが重要で、リポジトリの指定によってはモジュールが読み込めなくなります。

yum install --enablerepo=remi-php70 php php-devel
# php -v
PHP 7.0.14 (cli) (built: Dec  7 2016 10:15:15) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

pearのインストール

V8jsはPECLを使ってインストールします。PECLを使うにはpearが必要です。なのでpearをインストールしてPECLでインストールします。
そのままyum installしてしまうと5.4が入ってしまうので、php70を指定します。

yum install php-pear --enablerepo=remi,remi-php70

V8jsのインストール

やっとここまで来ました。長かったですね。

pecl install v8js
Build complete.
Don't forget to run 'make test'.

running: make INSTALL_ROOT="/var/tmp/pear-build-vagrantSQuNiQ/install-v8js-1.3.3" install
Installing shared extensions:     /var/tmp/pear-build-vagrantSQuNiQ/install-v8js-1.3.3/usr/lib64/php/modules/
running: find "/var/tmp/pear-build-vagrantSQuNiQ/install-v8js-1.3.3" | xargs ls -dils
 2645281    0 drwxr-xr-x 3 root root      16 12月 13 12:04 /var/tmp/pear-build-vagrantSQuNiQ/install-v8js-1.3.3
12754412    0 drwxr-xr-x 3 root root      18 12月 13 12:04 /var/tmp/pear-build-vagrantSQuNiQ/install-v8js-1.3.3/usr
22128224    0 drwxr-xr-x 3 root root      16 12月 13 12:04 /var/tmp/pear-build-vagrantSQuNiQ/install-v8js-1.3.3/usr/lib64
27375476    0 drwxr-xr-x 3 root root      20 12月 13 12:04 /var/tmp/pear-build-vagrantSQuNiQ/install-v8js-1.3.3/usr/lib64/php
 2645299    0 drwxr-xr-x 2 root root      20 12月 13 12:04 /var/tmp/pear-build-vagrantSQuNiQ/install-v8js-1.3.3/usr/lib64/php/modules
 2645300 2664 -rwxr-xr-x 1 root root 2727845 12月 13 12:04 /var/tmp/pear-build-vagrantSQuNiQ/install-v8js-1.3.3/usr/lib64/php/modules/v8js.so

Build process completed successfully
Installing '/usr/lib64/php/modules/v8js.so'
install ok: channel://pecl.php.net/v8js-1.3.3
configuration option "php_ini" is not set to php.ini location
You should add "extension=v8js.so" to php.ini

ビルド通ったあああああ!
ここまで来るのに7日間くらい時間使ってます。火の七日間と呼んでもいいんじゃないかと思うくらい調べてやり直して調べての繰り返しでした。でも技術ってそうやって覚えていくものだよね!

php.iniの設定

php.iniにextension=v8js.soを追加します。

php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

確認してみる。

# php -m | grep v8js
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/v8js.so' - /usr/lib64/php/modules/v8js.so: undefined symbol: _ZN2v88platform21CreateDefaultPlatformEi in Unknown on line 0

なんやて工藤。ちょっと何言ってるのかわからないですね。
どうやらCentOS 7.2で発生する問題らしい。「通常は起こらないんだけど、V8jsは特殊なリンクを使っているから起こる」みたいなことを外人がGithubで言ってました。
Vagrantでやってるからなのか、それともCentOSだからなのか、それとも私のやり方がまずいのか。とりあえずubuntuでやってみようということでCentOS +V8jsはここで見切りをつけました。
まあ失敗は成功の母と言いますからね。何事もチャレンジが大事ですよ。
ubuntu編はまた後日公開します。

ごあいさつ

あぶさんと申します。とりあえず自己紹介をします。

 

略歴

コンピュータ系の専門学校に3年通いプログラミングを学びました。このころはC、C++C#がメインでしたが、仕事で使えるようなレベルではないと思います(ブランクがあるというのもあります)。

不動産ポータルサイト開発、Web系のシステム開発を4年と2ヵ月やってきました。PHPJavaScriptCSS、HTML、MySQLPostgreSQLLinuxを覚えました。おまけとして賃貸のことに詳しくなりました。

今はPHPを武器にしてゲーム会社でサーバーサイドエンジニアをやっています。テーブル設計やら、いろんなミドルウェアやら、やらなきゃいけないことがいっぱいです。

Androidでゲームを作ったこともありますが、ライブラリを一切使わずネイティブで全部書いてました。ソースもapkも消失してしまったのが残念。

 

なぜブログを始めるか

もうそろそろプログラマーという職になってから5年ですが、今まで技術的な情報を発信するということをやってきませんでした。環境がだいぶアレでしたので、自分のことで精いっぱいだったというのもありますが、これではいかんということで始めた次第です。

目標は1日1記事と言いたいところですが、1週間に1記事くらいで勘弁してください。よく言うじゃないですか。最初から強気な計画立てると痛い目見るって。

たまに技術と関係ない記事もあるかと思いますが、よろしくお願いします。