だ。ログ。

開発とかスノボとかやきうとか。

zabbixからslackにアラートを飛ばす

システムがある程度安定はしてきているものの、お金である程度抑えつけている。
そのため、まだ参加間もない自分がシステムの大枠のリファクトまでは手が回せず稼働側の不安を払拭する事ができない。

期待値として求められる「システムの安定稼働」に関しての部分が疎かになってしまう。
この辺をどう解決するかって言う部分で手っ取り早いのでzabbixを導入して障害を可視化する。と言う安直だが結果が出しやすい部分が導入の第一歩になる。
ただ、この時に気をつけねばならないのは自分一人だけで完結させないと言う事に注力する。

つまり、システムのアラートが個人のメールに飛ぶ事はよろしくない。
少し導入に手間は掛かるかと思うが代表的だがslackに警告を飛ばす事で、仮に手が話せない時でも誰かが見ると言う保険を掛ける事が可能である。

zabbix_serverとzabbix_clientがインストールされたと言う前提で話を進める。

シェルスクリプトのダウンロード

slackに送信する為のシェルスクリプト

$ cd /usr/lib/zabbix/alertscript/
$ wget https://raw.githubusercontent.com/bageljp/zabbix-slack/master/slack.sh
$ chmod a+x slack.sh

zabbixのalertscriptディレクトリにシェルを設置する。

スクリプトの設定

slackのwebhookURLを取得する。
またslack用のユーザーをzabbixで用意しておくと早い。

#!/bin/bash -x

# config
slack_url='取得したWebhookURL'
slack_username='なんでも良いが分かるやつ'
channel="$1"
title="$2"
params="$3"
emoji=':ghost:'
timeout="5"
cmd_curl="/usr/bin/curl"
cmd_wget="/usr/bin/wget"

zabbix_baseurl="zabbixサーバーのURL(IPベースでも動く)"
zabbix_username="zabbixのユーザー"
zabbix_password="zabbixのユーザーパス"

# chart settings
chart_period=3600
chart_width=1280
chart_height=390
chart_baseurl="${zabbix_baseurl}/slack_charts"
chart_basedir="/tmp/slack_charts"
chart_cookie="/tmp/zcookies.txt"

・slack_url
・slack_username
・zabbix_baseurl
・zabbix_username
・zabbix_password

上記を自分の環境に合わせて設定する。

zabbix側の設定

https://qiita.com/wapa5pow/items/2327561493015a833c97 こちらを参考に。
ざっくりと、メディアとしてslack.shを設定してユーザーに送信する。と言う流れ。

テストに関して

上記のURLでも記述されているのだが

$ yes > /dev/null & yes > /dev/null & yes > /dev/null & yes > /dev/null &

これを実行してCPUに過負荷を掛けるのは簡単なのだが、デフォルトのテンプレートのLinuxの監視のCPUの条件が

設定場所: 設定 > ホスト > トリガ
設定名:Processor load is too high on {HOST.NAME}

{Zabbix server:system.cpu.load[percpu,avg1].avg(5m)}>5

5分間で平均ロードアベレージ5がしきい値なので結構な過負荷状態を作らねばならない。
そのため、AWSのブーストモードが発動して無駄なクレジットを消費させない為にも、設定を複製して

{Zabbix server:system.cpu.load[percpu,avg1].avg(1m)}>1

1分間でロードアベレージ1を越えたら。くらいにしておく。

インストールしてから手早くslackに送る事とエラーの可視化を行う事で、ある程度の保険は掛ける事が出来る。
このあとの再起動の手順等は個別に作る必要がある。f:id:rider_dice:20190325131255p:plainf:id:rider_dice:20190325131255p:plain

jsonデータをphpで保存する際のエンコード

あまり日本語を扱いたくはない。
しかもjsonデータだからなるべくコード値のみ持ちたいが、オーダーとして文字列も持って欲しいと言う要望が来ている。

$json = array(
	"condition" => array([
		"condition_1" => "ほげふが",
		"condition_2" => "もふべろ"
	])
);

ざっくりとこのようなデータを保存したい。
この場合配列をjsonと宣言するので

$json = json_encode($json, true);

と無意識にやってしまう。ただ、この場合日本語文字列がunicodeの16進に変換される。
それも面倒臭いのは\マークが抜ける。1文字なら全てに "\\" を付け加えれば良いが文字列で持っているのでそうもいかず。

$json = json_encode($json, JSON_UNESCAPED_UNICODE);

と言う事でエスケープせず持て。
とすれば、いちいちエンコーディングを気にせず日本語文字列でDBに保持出来るので復元が簡単。
セキュリティ性は薄い。

javascriptのindexOfの検索の落とし穴

配列内の特定の要素だけを消したい。と言う事がある。
例えばだがチェックボックスや要素をクリックした際にイベントが発火して、その要素を消したい。等で仮定する。

## 仮に要素自体は一旦配列に入った状態だとする。
var youso = [1,2,3,4,5,6,7];

この配列の中から4だけ消したい。とした場合

youso.splice(youso.indexOf(3),1));

spliceで要素番号を消す。と言う形で完結するのだが、問題はこれが変数だった場合。

var fuga = 2;
youso.splice(youso.indexOf(fuga),1));

この場合、要素番号2の1が消去されてほしい期待値となるのだが消えない。
firefoxのデバッガーでも何気なく数値を入れると動くのにfugaだと期待通りの配列にはならない。
様々なリファレンスやナレッジで確認すると

var youso = ["りんご","メロン","アボガド","ドラゴンフルーツ"];

等の文字列での検索ではうまくいっているが、これが数値の場合に関してあまり記載がない。
ここで疑ったのはjavascriptの型、結論から言うとちゃんと宣言すべきであった。

var fuga = 2;
youso.splice(youso.indexOf(String(fuga)),1));

検索文字列は数値ですよ、と明示する事で期待通りの挙動をしてくれた。
結構忘れやすいのでメモ。

オサレ故のイベント取得のメソッド

iCheckJSを使うとチェックボックスラジオボタンの見栄えが良くなるので凄く助かる。
どうしても素のままだと殺風景と言うか味気がないと言うか。bootstrapを使っていると余計にそう見える。

<input type="checkbox" id="hoge" name="hoge" value="1">ほげふが

## js部分
$("#hoge").change(function(){
	alert("変更あったよー");
});

チェックボックスが動いたらイベント取ってねと何気なく書いたが動かない。
よくよく要素を見てみると、チェックボックスを装飾しているiCheckのパーツが本丸のcheckboxを隠してしまっている。
じゃあ、イベントってどうやって取得すればいいの?と探していると

http://inter-arteq.com/2016/07/07/icheck-js%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%8B%E6%99%82%E3%81%AEchange%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88/

こちらの記事を参考に

$("#hoge").on("ifChanged", function(event){
	alert("変更あったよー");
});

これで動いた。

後から追加した要素のマウスオーバーの挙動

$(document).on("hover","#hoge", function(){

ajaxでデータを検索した結果をリストボックス要素で一覧表示してそのリストから選択をする。
その際にhoverで背景色を変えてってな挙動を入れようとしたがイベントが発火しない。

元々存在する要素ならばこれで良いのだが、後から追加した要素の場合これだとうまくイベントを拾ってくれない。

  $(document).on('mouseenter','#hoge',function(){
	   $(this).addClass("active");
   });
   $(document).on('mouseleave','#hoge',function(){
     $(this).removeClass("active");
   });

挙動としてはliにマウスが触れたらと出たらと言うイベントを拾う。
後から追加した要素の場合結構癖のある書き方になるのでメモ。

2019年バスツアー 赤倉温泉スキー場

20年前の学生時代、アルペンがTVCFでkissmarkのボードを売り出し広瀬香美さんの歌が流れる。
銀世界は遠い世界って言うイメージ、年間1,2回の3泊5日のバスツアーで親からお金を少し工面してもらないながら安いゲレンデを探して行くって言う流れだった。
雪山から遠ざかっていたがこの4年で毎年10回以上雪山に行くようになったが基本的にサラリーマンなので日帰り、それもJR新幹線ツアー。
1年に1回、有給を取って金土曜日の1泊2日がせいぜいと言うのが現状である。

今回、お世話になっていた会社さんから離れ新たな仕事場へ行く事となり1月中は殆ど休みとなった。
平日に一人で越後湯沢に行く事もあったが、学生時代から雪山に行っていた友人も平日に仕事が休めるので何処かに行こう!と言う事になった。

ゲレンデ決め

1. 赤倉温泉
2. 栂池高原
3. 白馬八方
4. 志賀高原
5. 菅平高原
6. 野沢温泉

野沢温泉は毎年日帰りでも泊まりでも行っている。このサイコロの目出したらダメ人間だ!と水曜どうでしょうのネタよろしくゲレンデを決めた。
結果出た目は1、20年前に3泊5日で友人と3人で行った思い出の地だ。
事ある毎に「そういえばさー赤倉温泉ってどうだっけか?」と話すのだが、新幹線での射程距離は野沢温泉が最遠で赤倉温泉までの日帰りツアーはない。
そして今回は新幹線ではなくバスなのでどこへでも行くぞ!と言う事で普段行けないゲレンデをチョイスした。

当日

普段だと朝4時に起床し、東京駅に向かう。朝6時代の新幹線に乗り込み。がお決まりのパターンだがこの日は都庁に22:30集合となる。
午前中に新しい職場での打ち合わせを行い、新橋でお茶をしゆっくり帰ってきたのが16時。
湘南新宿ラインに乗車が21時と言う事で5時間手持ち無沙汰。ケーブルテレビで適当にチャンネルを流しているといつの間にかウトウトとし4時間ほど寝ていた。
急いで着替えて荷物を持って部屋を出た。

バスターミナルまで

普段通勤とは逆の方向に21時に乗る。ボードにキャリーバックに雪山用のバックパックを背負ったムサいおっさんが乗り込む。
ほかはネクタイスーツのサラリーマンばかり、非日常感と共にダメ人間だよなーと思う。ちょっと悲しい。

新宿駅サザンテラス口に出ると人人人の新宿を歩く。都営大江戸線に乗り都庁前駅にて友人と合流。
ここで都庁前駅から地上に出たがバスターミナルがどこにあるか分からない。
友人と高架下を右往左往していると、バスツアーのジャケットを着た若い人が「ツアーの方ですか?こちらです」と案内してくれる。
どうやら壁に遮られてどこかわからなかったが高架下にバスターミナルがある。人はまばらであった。
到着は22時、まだ集合まで30分ほど時間の余裕があった。
バス到着までに高層ビル群のコンビニに行き水3本とのど飴を購入、バスの中は湿気がひどい。冷たい飲み物がないとやられると言うのは20年前のバスツアーで身についていた。
程なくしてバスが到着する。
バスツアーの広告にでているゆったり席にUSB電源が有るタイプのものではない。
それもそのハズ火曜日のど平日、しかも妙高方面は北志賀の竜王スキーパークを経由して妙高杉ノ原→池の平→赤倉温泉と経由する。
それでも席前方席は空席が目立つ。これから2月に差し掛かると学生がもっと増えバスのランクも上がるやもしれぬが不採算など平日では致し方ない。

乗車~東部湯の丸PA

バスにはスムーズに乗車、バスの先頭に乗車割が貼られている。スリムな友人が窓側、太った自分は通路側に足を投げ出せるようにと友人が配慮してくれたが意外と足元は広い。
ただしリクライニングが倒れると狭くなる、お互いの思いやりが必要となる。
いよいよ22:45、都庁前をバスはゆっくりと走り始める。平日の新宿高層ビル群は静まり返りスムーズにバスは進んでいく。
都内走行中はバス内での安全についての説明VTRが流れる。シートベルトや消灯について一通り終わると早くも関越大泉を通過する。
寄居PAで一旦休憩の後バスは完全消灯、次の休憩は東部湯の丸、信州フルーツランドで休憩があるとのアナウンス。
高速に入ると定期的な高速道路の継ぎ目の揺れと周りの若者のグループの笑い声がある程度でオッサン二人組は半分寝ようとしつつもくだらない話をしている。
やっと高速入ったよな。と話をしていると寄居がもう目の前である。時計は0:00手前、バスのアナウンスで30分の休憩を挟んで出発と通達がくる。
寄居PAにつくと大型PAは長距離トラックと雪山バスツアーのバスが5,6台停まっている程度だ。
まだそこまで寒くなく、そうそうに用を済ませてバスに戻る。
20年振りのバスツアー、そう言えば20年前はCDウォークマンとMDウォークマンにそれぞれのディスクケースを出していろいろ聞いていたなと思い出す。
1990年代後半に自分が聞いていた音楽をiPodの中からチョイスしプレイリストを作る。約2時間のプレイリストが出来上がった頃、バスは寄居を出発となり周りは暗くなった。

とは言え、誰もが寝れるわけではなくスマホのバックライトを落として動画を見るものやアプリのゲームをやるものと多々手は動いている。
自分は被ってきたニット帽で目を多い音楽を流しつつ目を瞑る。


ふと気がつくとバスの中が冷えてきているのが分かる、あれ何時かな?腕時計に目線を落とすと午前2時を回っている。約1.5時間ほど眠っていた。
周りはカーテンが締め切られている、スマホからgooglemapを見ると上信越道の東部湯の丸眼の前であった。
バスは静かに到着し、ドアが開かれる。フロントガラスに掛かる出発時間は3:00を表示している。現在2:20
多分だが、寄居と東部湯の丸で時間調整を行うのであろう。特に土日の混雑時はここの休憩で時間調整が入る。平日の深夜の上信越道はトラックトラックトラック
底冷えする外、建物の周りは雪がつもり真っ白。いよいよ雪国に近付いたなと感じさせる。
とは言え深夜帯のSA、食事処も空いていない。自販機が稼働している程度で寒いので早々にバスに戻る。
友人も起きており「寒いんだよ」とボヤく。どうやら底冷えしてきてカーテンと窓の隙間を空けてしまうとそこから冷たい空気がどんどんと入ってくるようだ。
必死に身体を密着させてたんだけど寒くなる、必死で寝ながらカーテンを抑えていた。
休憩が終わる頃には午前3時、再び眠れるかは運次第だなとおもいながらニット帽を目深に被り音楽プレイヤーの再生をスタートさせた。

東部湯の丸 ~ 赤倉温泉

バスは程なくして定期的に刻んでいたリズムが途絶える。高速を降り下道に入る。
とは言え相変わらずバスは順調と見え信号で停るも停車している時間は少なくやがて山道に入る。
車内はゆっくりと右に揺れ左に揺れを繰り返す内に気がつくとバスがバックをしている。フロントを見ると周りは雪が舞う。
明るい光の建物が正面に見える。信州フルーツランドに到着4時前の事であった。ここでも40分ほどの時間調整が掛かる。
早朝のお土産屋さんは、うどんとそばのみ。小腹がすいたので友人とそばを食べる。
底冷えし雪の降る道の駅でのそばは格別、お腹を満たし外の雪を満喫するとバスは出発する。いよいよ峠道に差し掛かる。
とは言え、竜王までは30分程度ですんなりと着いた。時計は朝5時を指している。
しかし朝5:30時に竜王スキーパークの正面に到着した場合、待機場所はあるのだろうか。。そんな素朴な疑問を残しつつもバスは次の経由地に向けて出発する。
この時間になるともう寝る人も少なくなり、バスも薄明かりが点灯する。次の妙高杉ノ原まで1時間30分。
周りの銀世界に心踊りつつも眠気があったので目を瞑ると運良く眠る事が出来た。
次に気がつくと外は空が白み始めている。どうやら妙高山麓に沿う399号に入っているようだ。すぐに杉の原スキー場の看板が目に飛び込んでくる。
時間は朝6時30分、数人の乗客が降りると北上し池ノ平、そして終着地の赤倉温泉へと到着する。到着時刻は7時
時間にして8時間弱のバス旅、寝れない事も覚悟したが3時間は眠る事が出来た。

宿~スキー場

赤倉温泉に朝7時に到着すると外は強い雪、かなり新雪が積もる。気温は-5度前後で太陽も見え隠れするが一日こんな天気だろう。
雪道をポツポツと歩き宿まで10分、宿泊者専用の待機部屋に荷物を置き着替えを済ませる。この時点で8時弱。
さていよいよ朝イチから滑り倒すぞ!って意気込んだのだが雪がやたらと強く風もある。
宿の女将さんがこれはもしかしたら一部止まってるかもしれないから気をつけてね。と注意を促される。

宿のある温泉街からスキー場までは徒歩10分、昔は京王赤倉チャンピオンスキー場と赤倉温泉スキー場と分割されていたが共通リフト券で滑ることが出来たが
今回のツアーはくまどーエリア限定、赤倉温泉スキー場側のみのチケットなので最短コースが使えなかった。雪の坂道をあること10分、リフト売り場に到着。
事務所から上のリフトは見合わせるかもと言う無線連絡が聞こえてくる。

リフト売り場からやや歩くとリフト乗り場に到着。
だが、人が居ない。
びっくりするくらい人が居ない、目の前には学校のスキー合宿と思われる学生さんのみ。
そしてリフト乗り場にも係員が一人のみ、待機している人はおらず。
平日の猛烈な雪って言う事もあるが、運営する側もかなりギリギリの人数でやっているのが見て取れる。

ゲレンデ

コースレイアウトは横に広くコース数が多い。
ただコース数は多いのだが、コース全長があまりない。ゲレンデの感じで近い所としてガーラ湯沢のようなイメージだ。
短いコースが連なるようになっており、連絡コースを経由して次のコース次のコースとたどる事が出来る。
ただ、ドカ雪過ぎたかコースインフォメーションが埋もれてしまっていてどこへ行けば良いかが分からない。
そして一番の不安材料は人が滑っていない、降りていくとリフトが止まっている可能性がある。と言う事で下手なコースを通る事が出来ない。
実際に中央のダウンヒルコースのリフトは雪に埋もれており未圧雪、入ったらスタックしてしまう可能性を考慮して迂回をしていたが
友人と「これ入っていいの?」と言うコースなのか圧雪車の轍なのかが分からない所が多い。とりあえず回っていって滑った後がないからやめておく。
と言う無難なコース取りをせざるを得ない状況だった。雪が強く圧雪が追いついていない事もあるが、ヨーデルロッジ部分はフラットに広い。
20年前はファンスキーだった事もあり特に何も感じていなかったが、スノーボードの場合は歩く。とにかく歩く。
今回はFLOWのバインディングの為、かかと側のノッチを操作すれば着脱は便利なのだが、通常のバインディングだとここはかなり辛い。
しかも左、中央、右とコースが分かれているので連れ立ったパーティでの場合どちらに行くかの意思表示をはっきりしておかないとボードが辛い思いばかりする。

このドカ雪で人の滑っていないラビットコースに行くと大当たりのパウダーを巻き上げてヒャッホイ出来るコンディション。
リフトから一緒に降りてきた外国人パーティとヒャッホイしまくり、そのまま食事休憩でラビットコースから銀嶺ゲレンデに出る連絡コースに降りた時に悲劇はおこった。
左右の木々が切れはじめると動いていないリフトが見えた。。。のだが、圧雪が全くされていない。
たかだか50mくらいの距離だが、ボードのノーズを上げてクリアを試みるも腰まで未圧雪の雪に埋もれてしまう。友人もスキーだからこれは無理だ。と諦めた。
こうなるとボードの自分もボードを外し自分の周りを掘り起こしまずはボードを頭上に。そして大きく腿をあげながらラッセル状態での歩行、時間にして15分
足元はところどころ硬いがどこまでも雪に沈む。必死の思いで未圧雪から抜け出し事なきを得たが、進入禁止すら掲げられていない状況だった。

今回は赤倉観光側のリフト券が付いていなかった事もあるだろうが短いコースを何度も何度も滑るのは40近いオッサンには体力的に辛くなってくる。
行った日が悪かった事もあるだろうが、人手不足が見て取れた。雪質は妙高山の恩恵を受け素晴らしい。

少し腕に自身がある人は山頂のアルペンコースで遊べるが、基本的には初中級コースがメインで斜度は低め。
そのため、スクールの若者が楽しそうに滑っていた。緩急で言えば緩が多く急はアルペンコースくらいである。
赤倉観光側はもう少し急が多いだろうと感じた。

運営会社が違う事から繋がっている山でありながら別世界な事は致し方ないところだろうか。

総括

20年振りにおとずれた妙高高原は20年前よりも狭く感じたのが最初の印象。
自分自身がオッサンになり、いろいろなゲレンデを旅した事もあるのだろうが昔感じた壮大なスケール感と言うよりは地元のこじんまりとしながらもバラエティに富み家族連れが楽しむようなゲレンデであった。
温泉街は風情があり、夜になると雰囲気がある落ち着いた印象。平日だったからかもしれないが8割は欧米からの訪問者だった。
周りの池の平、妙高杉ノ原も選択肢にあるからか、その中の選択肢としてどう捉えるか。と思う。

ハイシーズンは非の打ち所のない雪質で晴れていてもキラキラと光る小雪が舞う寒さでコンディションは安定していると思われる。
パークやコースを楽しむと言うよりは自己責任ではあるがコースとコースの間の林間をエクストリームヒャッホイしている外国人が多い。
それだけアクティブなスケーティングが出来るとまた違う景色が見えると思う。

そしてバスツアーでは、赤倉温泉だけに拘らないプランだともっと楽しめたと思う。
近所の池の平や杉ノ原にも足を伸ばすプランを選択すると、広大な妙高全体を楽しむ事が出来て印象は大きく変わったと思う。
次回は車で自由に行動が出来るようにして、斑尾くらいまで遠出できるようにしてもう一度遊びに行きたい。

ちなみに帰りは翌日の16時に赤倉温泉を出発し、池の平と杉ノ原を経由し竜王に17時に到着。
そこから休憩をはさみ新宿都庁前に21:30に到着となった。
バスの中はゆっくり寝る事が出来るので移動と言う面ではバスツアーの有用性を改めて認識することができた。

kcfinderのconfigのはなし

自家製CMSのビジュアルエディタとしてckeditorを使っている。
前に作っていたシステムのマスターさんがckeditorだったからっていう事もある。
源流でもあるwysiwygでも良いのだが、最初に使っている物を使ってしまう悪い癖だ。

ある程度のコンテンツは文字だけでなんとか補える物だったが、中には画像を突っ込みたいと言う要望も出てくる。
となると、エディタの画像参照のボタンにアップローダーが付属して然るべき。みたくなる。

って事で、kcfinderを入れる事になる。
基本的には https://kcfinder.sunhater.com/ からダウンロードしてきてディレクトリに設置してckeditorを設定する。
そして問題はkcfinder側。色んなサイトで出ている設定を利用するのだが
「不明なエラーが発生しました」と出て動かない事がある。
大半はディレクトリ参照、やたら癖が強い。

    'disabled' => false,
    'uploadURL' => "アップロードディレクトリ",
    'uploadDir' => "フルパス",

こんな感じで書かれている事が多い。
要は何が言いたいか?

    'disabled' =>自家製CMSのビジュアルエディタとしてckeditorを使っている。
前に作っていたシステムのマスターさんがckeditorだったからっていう事もある。
源流でもあるwysiwygでも良いのだが、最初に使っている物を使ってしまう悪い癖だ。

ある程度のコンテンツは文字だけでなんとか補える物だったが、中には画像を突っ込みたいと言う要望も出てくる。
となると、エディタの画像参照のボタンにアップローダーが付属して然るべき。みたくなる。

って事で、kcfinderを入れる事になる。
基本的には https://kcfinder.sunhater.com/ からダウンロードしてきてディレクトリに設置してckeditorを設定する。
そして問題はkcfinder側。色んなサイトで出ている設定を利用するのだが
「不明なエラーが発生しました」と出て動かない事がある。
大半はディレクトリ参照、やたら癖が強い。

>|c|
    'disabled' => false,
    'uploadURL' => "アップロードディレクトリ",
    'uploadDir' => "フルパス",

こんな感じで書かれている事が多い。
要は何が言いたいか?

    'disabled' => false,      #ここは固定
    'uploadURL' => "URLのお尻につく部分",
    'uploadDir' => "ドキュメントルートからフルパスで書け",

なのだがuploadDirは開発環境とかで変わる。なので

    'disabled' => false,
    'uploadURL' => "/upload/hoge/fuga/",
    'uploadDir' => $_SERVER['DOCUMENT_ROOT'] . "/upload/hoge/fuga/",

PHP側の変数でドキュメントルートまでは固定しておく。もっと言えばuploadURLを変数化させちゃえばuploadDirもそれを付けるだけなので変更する手数は減る。
毎回設定でコケるのでメモ。 false,      #ここは固定
'uploadURL' => "URLのお尻につく部分",
'uploadDir' => "ドキュメントルートからフルパスで書け",
|