ホーム ブログ ページ 26

第8回「必勝?!筆者独自の就活術」

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

第8回「必勝?!筆者独自の就活術」について話していきたいと思います。

みなさん!遅めですが、あけましておめでとうございます!Lionです。
前回の記事いかがだったでしょうか?
筆者から見た「 今年はやりそうなゲームはVRゲームじゃないか!?」というのが少しでも伝わりましたら、嬉しいです!
さて、本日は「必勝?!筆者独自の就活術」について話させていただきます。
※あくまで筆者の考え方なので、参考程度でお願いします

個別の会社説明会に赴こう!

大型の就活イベントに参加するより、個別の会社説明会に行く方が、よりその会社の細かい情報を手に入れることができます。
その理由が以下の3点です。

①長時間、その会社についての説明を聞くことができる

②説明会後に、個別で社員さんと話ができる

③顔を覚えてもらえるチャンスがある

というところでお勧めします。
筆者も会社が行っている個別の説明会ばっかりいっていました。
そのため、より自分の知りたい部分を細かく聞くことができるので非常に勉強になりました。
また、分からないところを後でじっくり聞くこともできるのもメリットですね!

また、大型の就活イベントとかですが、「自分がまだ何を仕事にしたいのかわからない」「どんな仕事があるんだろう?」など、まったく定まってないくらいなら、今後の就活の何かしらのきっかけにはなるかもしれませんね。

自分だけの面接方法を編み出しメンタルを強くしろ!

これは、結構難易度が高いです。たぶんですが、就活を頑張っている学生さんは「学校の機関の面接対応講座」とかに参加しているのではないでしょうか?
もちろん、全然OKです。むしろ行ってるだけとても偉いと思います。
しかし、それだけでは面接というのは受かりません。
ではどうすればいいか?それは簡単です。
実際に会社を受けまくるのです。特に本命の会社がもう見定めている方は、それまでにたくさんの会社を受けるとなお良いでしょう。
では、自分だけの面接方法とは?という部分ですが、面接講座などは基本的なことを教えてくれますよね?受け答えの仕方や礼儀など。そこに自分をアピールする部分を組み込むのです。
面接官はプロです。そのため、学校などで対策した程度のテンプレ解答などしても何も評価してくれません。
そのため、自分の得意なことや自分の面白い部分を全面的に相手に伝えるのです。自分はこんなに面白い人間だぞー!優秀な人間だぞー!とアピールをしまくるのです。特に自信満々にドヤ顔でやるくらいがちょうどいいです。
この度胸を習得するためには、当たって砕けろ!精神で沢山会社を受けてみるといいです。
ちなみに筆者はこのような感じのフローを繰り返していました。

①会社の面接を受けに行く
②面接後に質問された内容と自分が解答した内容をを瞬時にメモ
③そこから自分らしさが足りていたかどうか採点する
④友人に面接官をしてもらって練習
⑤次の会社へ

となります。
ちなみに学校機関の面接対応講座とかは1回も使ったことがありません(笑)
実体験することが、成長につながるので恐れずチャレンジしてみてください!

会社説明会の履歴書提出時に差をつけろ!

これは、大きく効果があります。
やることは簡単です。離席書提出時に別資料で「自分のアピール資料を1枚添えるだけ」です。
これだけです。自分はこれで、色々な会社ですぐに次の日に面接の予定が入りまくりました。

例えばで話しますが、ゲーム会社に入りたいのでしたら、「過去に自分が作ったことがあるゲームの実績」を一枚添えるだけで印象が大きく変わります。履歴書にも書いてるかもしれませんが、もっとわかりやすく具体的に伝えれる資料があると、「お!この子はやる気があるな!」と一目おいてもらえることが多いです。

このように会社が提出してください!っていうだけのもの以外で「自分の良さを最大限アピールした資料」なども添えると良い印象をもらえるでしょう。

ここまで話してみて

いかがだったでしょうか?筆者のやり方が少しでも就活の参考になったら幸いです。
さて次回は「第9回 就活の時にやっちゃいけない3つの事柄」をお話しします。
まぁ…恥ずかしいですが皆様の何かしらのためになるなら喜んで書きます!
では、就活生の諸君!絶対インフルエンザにならないようにきちんとした生活をおくって就活頑張ってください(/・ω・)/

VPNに触れてみる〜その2〜

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

VPNとは何ぞ、から実際につなげてみるまで。今回はVPN接続のうち、CUIのVPNクライアントを利用したお話。

はじめに

1回目の記事ではVPNの伝送方式について、2回目の記事ではIPSec/L2TPとWindowsでのVPNクライアントの利用方法を紹介しました。
今回はWindows以外でのVPNクライアントの利用方法について紹介します。

準備

・WindowsのVPNクライアントの時と同じくユーザ名、対応するパスワード、サーバ情報(アドレスとポート番号)、及び各種VPNで指定された設定
makeを実行できる環境設定(Makefileが用意されているので、このファイルからmakeコマンドでvpnclient及びvpncmdのバイナリファイルを生成する必要があります)
・TUN/TAPのインストール
・VPNクライアントのダウンロード(リンクはこちら)
本記事では(Ver 4.20, Build 9608, rtm)を利用しています。

またVPNサーバを介して、IPのグループが違うネットワークへ接続する場合(VPNサーバと接続先のIPがサブネットマスク部分で異なる場合)は、サブネットマスクやDNS、ドメインに注意が必要です。

・接続先のIPアドレス(接続先が同じIPアドレス群であれば、xxx.xxx.xxx.0/24等でも可)
・DNSサーバ(ホスト名解決を行う必要がある場合、上記に加えて必要。ドメイン名がある場合、そちらも合わせて必要になります。)

1.VPNクライアントを展開し、任意の場所におきます。ターミナルでそのフォルダへ移動後、makeを実行します。
make実行時にライセンス等の規約について確認されますが、問題なければすべて1を入力して実行を続けます。

$ make

実行結果
--------------------------------------------------------------------

SoftEther VPN Client (Ver 4.20, Build 9608, Intel x64 / AMD64) for Mac OS X Install Utility
Copyright (c) SoftEther Project at University of Tsukuba, Japan. All Rights Reserved.

--------------------------------------------------------------------


Do you want to read the License Agreement for this software ?

 1. Yes
 2. No

Please choose one of above number: 

〜省略〜
正常処理された場合に表示される
--------------------------------------------------------------------
The preparation of SoftEther VPN Client is completed !


*** How to switch the display language of the SoftEther VPN Client Service ***
SoftEther VPN Client supports the following languages:
  - Japanese
  - English
  - Simplified Chinese

You can choose your prefered language of SoftEther VPN Client at any time.
To switch the current language, open and edit the 'lang.config' file.


*** How to start the SoftEther VPN Client Service ***

Please execute './vpnclient start' to run the SoftEther VPN Client Background Service.
And please execute './vpncmd' to run the SoftEther VPN Command-Line Utility to configure SoftEther VPN Client.
Of course, you can use the VPN Server Manager GUI Application for Windows on the other Windows PC in order to configure the SoftEther VPN Client remotely.
--------------------------------------------------------------------

2.vpnclientとvpncmdが作成できたら、以下のコマンドで実行します。

$ sudo ./vpnclient start

実行結果
The SoftEther VPN Client service has been started.

3.以下のコマンドと作業を行い、CUIの管理画面に入ります。
./vpncmdを実行し、「1 – 3 を選択」で2を選択→「接続先のホスト名またはIPアドレス」では、入力せずエンターでokです。(localhostへ接続します)
ここで3を選択した場合はVPNが十分動作できるかどうか検査することができます。事前に確認しておきましょう。

$ ./vpncmd
vpncmd コマンド - SoftEther VPN コマンドライン管理ユーティリティ
SoftEther VPN コマンドライン管理ユーティリティ (vpncmd コマンド)
Version 4.20 Build 9608   (Japanese)
Compiled 2016/04/17 21:59:35 by yagi at pc30
Copyright (c) SoftEther VPN Project. All Rights Reserved.

vpncmd プログラムを使って以下のことができます。

1. VPN Server または VPN Bridge の管理
2. VPN Client の管理
3. VPN Tools コマンドの使用 (証明書作成や通信速度測定)

1 - 3 を選択: 2

接続先の VPN Client が動作しているコンピュータの IP アドレスまたはホスト名を指定してください。
何も入力せずに Enter を押すと、localhost (このコンピュータ) に接続します。
接続先のホスト名または IP アドレス: 

VPN Client "localhost" に接続しました。

VPN Client>

これでVPNクライアントの管理ができるようになります。
設定を中断するためにとCtrl+Cを押すと脱出してしまうため、実行に注意しましょう。また脱出コマンドはexitになります。

4.仮想NICを作成します。Windowsの時もそうでしたが、仮想NICがないと接続できません。
以下のコマンドを入力し、指示に従って作成します。

VPN Client>NicCreate
NicCreate コマンド - 新規仮想 LAN カードの作成
仮想 LAN カードの名前: VPN    

コマンドは正常に終了しました。

作成後、NicListでMacアドレスを確認しておいてください。(後で確認の意味で利用します)

5.接続用のアカウント情報を作成します。ユーザ名や接続先のアドレスを聞かれるので順次入力します。

VPN Client>AccountCreate
AccountCreate コマンド - 新しい接続設定の作成

# この名前は接続時に利用します
接続設定の名前: VPNniTsunagitai

接続先 VPN Server のホスト名とポート番号: xxx.xxx.xxx.xxx:443(対象サーバのIP)

接続先仮想 HUB 名: VPN

接続するユーザー名: exampleVPNAccount

使用する仮想 LAN カード名: VPN

コマンドは正常に終了しました。

6.パスワードを入力し、接続します。間違えて入力した場合ですが、Ctrl+hで削除できます。(deleteのみで削除しようとしてもできません。またShift+deleteでも削除可能です。)ただし、矢印キーは利用できません。

> AccountPasswordSet {AccountCreateで入力した接続名}
接続名を省略した場合は、AccountPasswordSet 実行後に聞かれます。

実行例
VPN Client>AccountPasswordSet
AccountPasswordSet コマンド - 接続設定のユーザー認証の種類をパスワード認証に設定
接続設定の名前: VPNniTsunagitai # コマンド入力時に接続設定名を引数に記述している場合は表示されません

パスワードを入力してください。キャンセルするには Ctrl+D キーを押してください。

パスワード: **************
確認入力  : **************


standard または radius の指定: standard

コマンドは正常に終了しました。
パスワード設定後
VPN Client>AccountConnect
AccountConnect コマンド - 接続設定を使用して VPN Server へ接続を開始
接続設定の名前: VPNniTsunagitai

コマンドは正常に終了しました。

切断時
VPN Client>AccountDisConnect
AccountDisconnect コマンド - 接続中の接続設定の切断
接続設定の名前: VPNniTsunagitai

コマンドは正常に終了しました。

さて、この6の手順ですが、接続実行またはvpncmdを終了するたびに入力したパスワードが削除されます。一方で、何らかの原因で自動的に再接続を行う場合は再度聞かれることはありませんが、仕様として存在しているようなので覚えておきましょう。

7.次の状態になっていれば接続成功です。

VPN Client>AccountList
AccountList コマンド - 接続設定一覧の取得
項目               |値
-------------------+--------------------------------------
接続設定名         |VPN
状態               |接続完了
接続先 VPN サーバー|xxx.xxx.xxx.xxx:443 (直接 TCP/IP 接続)
仮想 HUB 名        |VPN
仮想 LAN カード名  |VPN
コマンドは正常に終了しました。

これで接続までできました!

IP設定

ここからはvpncmdの外の作業になります。

1.以下のコマンドを入力し、前手順1で確認したMacアドレスがあるかどうか確認します。(通常tun/tapに付与されます)

$ ifconfig

2.IPが割り振られていない(inetの行がない)ので、DHCPで取得します。できないものに関しては自力で設定することになります。
割り振り先は、他に利用していなければtap0になっていると思います。tap0でない場合は自身の環境に合わせて読み替えてください。

$ sudo ipconfig set tap0 DHCP
実行後
$ ifconfig
で確認(付与されるまでに時間がかかる場合があります)
169.254〜のような場合は取得できていません

これでIPが取得できれば、ひとまず完了です。

ルーティング設定

さて、上記の手順を行っても接続できないことが多いことと思います。ここからはルーティングの設定になります。

$ netstat -nr

実行結果(一部削除等をして省略しています)
Internet:
Destination        Gateway            Flags        Refs      Use   Netif Expire
# 自身のネットワークのdefault
default            xxx.xxx.xxx.1      UGSc          174        0     en4
# VPNサーバのdefault
default            yyy.yyy.yyy.1    UGScI          16        0    tap0
yyy.yyy.yyy/24     link#              UCS             1        0    tap0
# VPNサーバから割り当てられたIPアドレス
yyy.yyy.yyy.yyy/32 link#              UCS             2        0    tap0
yyy.yyy.yyy.1/32 link#              UCS             2        0    tap0
yyy.yyy.yyy.1    link#              UHLWIir        17        0    tap0

defaultが2つに増えていますが動作します。削除すると逆に動作しなくなるため注意してください。一方で、削除しないといけないケースもあるらしいですが、自分の環境では削除すると動作しませんでした。
どうしても削除する場合は、VPNクライアントで設定した接続先のIPを登録しておくと良いようです。しばらく接続失敗や切断された旨のログが出ますが時間経過で解消されるとのこと。(自身の環境では延々切断ログが流れてうまく行く気配がありませんでした。)

1.ルーティングの設定を行います。
接続先のIPアドレスと、対応するデフォルトゲートウェイをルーティングに追加します。

$ sudo route add {接続先のIPアドレス、あるいは一部省略したもの} {接続先のデフォルトゲートウェイ}

実行例
$ sudo route add zzz.zzz.zzz.0/24 yyy.yyy.yyy.1
$ sudo route add zzz.zzz.zzz.zzz/32 yyy.yyy.yyy.1
zzz.zzz.zzz.zzzは接続したいサーバのIP
yyy.yyy.yyy.1は割り当てられたVPNサーバのデフォルトゲートウェイ

IPアドレスで作業するのであればこの時点で完了です。

2.ホスト名解決する場合はDNSサーバもルーティングに加えます。
その上でネットワークの設定から、普段利用しているネットワークのDNSサーバ設定に対応するIPとドメインを追加します。この際、優先度を上げるため一番上に持ってきておきます。

hostConfig Image

これでホスト名を用いての接続が行えるようになります。(設定してすぐの時はホスト名が使えないことがありますが、そのうちつながります。)DNSサーバに問い合わせられるかはnslookupコマンドで確認しておきましょう。
ちなみに、VPNクライアントを停止する(接続を完全に切断する)と入力したルーティングが削除されますので注意してください。(削除されるのは、この例ではtap0に関連するルーティングです。)

余談

Windowsでは接続した際に、接続先のネットワークに依存するため、接続先から外部のネットワークへの接続を制限している場合は、外部への通信を伴う操作ができなくなります。一方でMacで実行した時は、今回の設定方法ではVPN側と外向けの2つのネットワークを保持したままになるため、接続中であっても外部webのブラウザ閲覧等行うことができました。

最後に

Windowsのクライアントだと自動でネットワークごと調整してくれる一方で、CUI側は自力で設定しないといけないため、すぐに利用できない上に何が抜けているのかわからない点で苦労しました。ルーティング設定にしても何を書けばいいのか、最初分からなかったのですが、その辺の知識を持っている方であればおおよそ推測はつくのでしょうね…。
提供元も「Linuxのサポート」にて『非常に詳しい知識をお持ちの方のみが』と書かれているため、基本的にWindows以外での接続はお断りの印象を受けました。(個人で利用する分にはWindows所持者が多いはずなので十分だと思います。)

知っている人であればあまり難しくないのでしょうが、知らない人にとっては接続までが大変な印象を受けました。


関連:
softether VPNのダウンロード
VPNに触れてみる〜その0〜
VPNに触れてみる〜その1〜

【Googleデータポータル最新情報】表やグラフのソートが便利に!

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Googleデータポータル使ってますか?Googleが日々更新しているので、以前悩んだことも今は解決しているかも!1月のアップデートでは、表・グラフのソート仕様が変更されました。 実は、表・グラフに含めていない指標でもソートが可能なんです!今回はその方法をお教えします。

この記事でまとめられていること

こんにちは。株式会社アピリッツでアナリストをしているssekiです。
業務でGoogleデータポータルを多用していますが、
日々更新されているGoogleデータポータル、いつの間にか新機能がついている!なんてことも。
今回はそのうちの1つ。表・グラフをさらに使いやすくするための新機能をご紹介します。
例えば、こんなことありませんか?
「データとしては必要ないけど、ソートのためにグラフ内にいれとかなきゃ・・・。」
enter image description here

表内の美味しさ順、という項目はソートに用いるものの表示したくないとします。
その場合、エクセルなら非表示にすればいいですが、Googleデータポータルでは非表示にできませんよね・・・。

ですが、今回追加された新機能によりGoogleデータポータルでも表・グラフ以外のデータを用いたソートが可能になりました! (記事投稿時は英語版のヘルプにしか載ってませんでした。)
かなりニッチな新機能ですが、その使い方をご紹介いたします。

Case1:表内にない指標でソートしたい場合

まず、表でのソートについて考えてみます。
ページごとにセッションと直帰率を調べ、直帰数の降順に並べたいとするとGoogleデータポータルでは次のような表になります。
enter image description here
※本記事の画像はGoogleのデモアカウントデータを用いています。

従来のGoogleデータポータルでは、直帰数の指標が邪魔だなぁと感じている場合でも、
表で用いていないディメンションや指標を使ってソートすることができませんでした。
しかし、新機能によってそれが可能になっています。

enter image description here

表をクリックすると、右側のメニュー下に並べ替えの項目がありますね。
中身を見ると、データソースに含まれるすべての指標が選択できるようになっていることがわかります。
(以前は表内に含まれているディメンションと指標のみ表示されました)

enter image description here

表内に「直帰数」をわざわざ入れなくとも、ソートに利用することができるので、
下図のように少しコンパクトな表にすることができます。
用途がそれほど多いかはさておき、より柔軟な表作成ができるようになってますね!

enter image description here

ちなみに、ディメンションは表内のものしか使えません。
表やグラフで表示されているディメンション以外でソートする、というのがよく考えると意味不明ですから当然と言えば当然ですが。

Case2:グラフ内にない指標でソートしたい場合

グラフにおいても、先ほどと同じ方法でグラフ外指標でのソートが可能です。
Case1で扱ったデータを複合グラフにした図がこちらになります。
enter image description here
具体的な方法は同じなので割愛させていただきますが、いくつかのグラフではソート機能自体が使えないことに注意が必要です。
ソート機能が使えるグラフ

  • 棒グラフ
  • 複合グラフ
  • 円グラフ
  • 散布図
  • 面グラフ

ソート機能が使えないグラフ

  • 期間(折れ線)グラフ
  • 地図
  • スコアカード
  • ブレットグラフ
  • フィルタ

ソート機能は使えるが、表以外のソートはできないグラフ

  • ピボットテーブル

地図やスコアカードのようにそもそもソートが不要なグラフではソート機能が使えません。
また、ピボットテーブルに関しては現時点で対象外ですが、今後仕様変更によって使えるようになるかもしれませんね。

まとめ:この機能はどんな人におすすめか

必要なデータだけがまとまっている表・グラフを作成することで、意思決定や伝達がスムーズになります。
そのためにGoogleデータポータルの代わりにエクセルを使っている、という方も多いのではないでしょうか。
この機会にぜひGoogleデータポータルでのレポート作成をはじめてみてはいかがでしょうか。

今回は細かな一部分の新機能でしたが、痒いところに手が届くアップデートにこれからも期待ですね!

VPNに触れてみる〜その1〜

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

VPNとは何ぞ、から実際につなげてみるまで。今回はVPN接続のうち、提供されているGUIでの接続や、Macに搭載されている機能を利用してのお話。

はじめに

前回はVPNに関連した通信方式について触れましたが、今回は実際にVPNに接続するお話。使用するVPNとして、softether社が無料で提供しているsoftetherVPNを紹介します。
VPNサーバの構築については触れませんのでご了承を。
また、ネットワークの設計によっては追加で必要な作業もありますが、詳細には取り上げません。(ファイアウォール、追加のルータ側でのポート設定が占めると思います。)

VPN接続手順

前提

VPNサーバに登録されているユーザ名等、接続するための情報が必要です。
本ページではパスワード入力で接続する方式で紹介します。

IPSec/L2TPで接続

・IPSec/L2TP:暗号化通信をネットワーク層で行う方式。IPSecはIKEプロトコルを使用しているため、事前共有鍵が必要。

OS: Mac OS X EI Capitan (v10.11.6)
Macではネットワークの設定でVPN接続が選択できるため、それを利用します。

ログインするためには、ログインするユーザ名、対応するユーザのパスワード(その他の認証方式で行う場合はその情報)、サーバアドレス、及びIPSec/L2TP通信を行うための鍵が必要です。すべてVPNサーバ側にあるため、自身で構築する場合はメモしておくか、サーバ管理者に問い合わせる必要があります。

1.[システム環境設定]から[ネットワーク]画面を開き、サービスの追加を行います。

enter image description here

2.[認証設定]をクリックし、パスワード等を入力します。
ここはVPNサーバ側の設定により選択するものが違いますが、今回はパスワード認証で行います。
共有シークレットに入力する鍵はVPNサーバ側のIPSec/L2TPの設定に記載されているので、鍵情報を受け取ってない場合はそれを確認するよう問い合わせてください。

enter image description here

3.入力が終わったら[OK]を押し、サーバアドレスとアカウント名(ユーザ名)を入力します。
VPNサーバのIPを確認する際、設定によってはVPNサーバが割り当てているIPになっていることがありますので、接続の際はIPアドレスが正しいか確認しておきましょう。
(画像内IPアドレス、およびアカウント名は一例)

enter image description here

4.必要な入力が終わったら接続し、以下の画面が出ていれば成功です。割り振られているIPはVPNでのIPです。(割り振るIPの範囲はVPNサーバ側で設定できます)

enter image description here

接続失敗する場合は入力した情報を確認しましょう。またNATやファイアウォール等を通じて接続する場合はVPNサーバ側に設定が追加で必要ですので、管理している方に確認してください。
必要な設定はこちらの「NATが存在する場合の注意事項」に紹介されています。
さて上記接続方式ですが、Windows10にも搭載されているようです。[ネットワークとインターネット]から左側に[VPN]の項目があるので、そちらから設定できます。(ユーザ名とパスワードは接続時に要求されます)

GUI VPNクライアントを利用して接続(Windows)

Windows用のため、それ以外では基本利用できません。一応Wineを利用してGUIを利用できることは確認していますが、何か抜けているのか仮想LANカードが作成できませんでした。
ただCUI VPNクライアントで作成したものは反映できましたので、そちらで作ってから接続を試す方法もあります。いずれもダウンロードはこちらから。

1.仮想LANカードを作成します。作成していない状態で[新しい接続設定の作成]をダブルクリックすると警告画面が出て作るように促されるので、そちらから作成して構いません。

2.ログインに必要な情報を入力します。(接続設定名は任意。その他入力が必要な情報は仮で埋めています。ユーザー認証は接続時に聞かれますので空白でも。)
IPSecのときと比較して、ポート番号を要求されていますのでご注意ください。(ポート番号は一例。開いているポートはサーバ側で確認・設定できます)

enter image description here

3.入力が終わったら、作成した接続設定をダブルクリックします。
ユーザー名とパスワードを聞かれたら、空白であれば入力しましょう。
接続ができたら「状態」が「接続完了」に変化します。

おわりに

今回はすでにあるものでの接続、およびGUIのVPNクライアントでの接続方法について紹介しました。
次回はCUI VPNクライアントを利用した接続方法について予定しています。
IPSecでつなげるなら別に…という気がしますが、それを許可しない/接続できない場合はどうしても使わなければならなくなるため紹介します。


関連:
VPN Server 側での L2TP/IPsec 機能の有効化方法
softether VPNのダウンロード
VPNに触れてみる〜その0〜
VPNに触れてみる〜その2〜

windows10にてsambaのファイルサーバーにアクセスできなくなった件について

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

ローカルPC内に構築しているCentOSのサーバーにて使用しているSambaファイルサーバーにアクセスできなくなったので、原因と対処法をご紹介します。

こんにちは。アピリッツの本多です。

今年に入ってから発生したのですが、自前で構築していたCentOS上で動いているSambaのファイルサーバーにアクセスしようとするとエラーが出るようになりました。
原因と、行った対処法をご紹介いたします。

エラーの内容

ファイルサーバーにアクセスしようとするとネットワークエラーとなり、以下のようなエラーメッセージが表示されるようになりました。
enter image description here

エラーコードは以下の場合もあるようです。

エラー コード:0x80004005
エラーを特定できません

原因

最近windows updateを行ったのですが、その際に以下の内容が適用されました。

2018 年 1 月 4 日 — KB4056892 (OS ビルド 16299.192)

そしてこのupdateには以下の内容が含まれています。

Windows SMB Server、Windows Subsystem for Linux、Windows カーネル、Windows Datacenter Networking、Windows Graphics、Microsoft Edge、Internet Explorer、および Microsoft Scripting Engine のセキュリティ更新プログラム。

おそらく上記の内容が適用されたことで、サーバー メッセージ ブロック バージョン 1 (SMBv1) ネットワーク プロトコルが無効化されてしまったのだろうと考えられます。

対処法

SMBv1がだめなら、SMBv2にすれば良い。
答えはシンプルでした。ということで、sambaの設定に以下を追加し、アプリの再起動を行う事で、無事接続出来るようになりました。

vi /etc/samba/smb.conf
 [global] 
min protocol = SMB2 ←追加 
max protocol = SMB2 ←追加

OSはCentOS 6.9で、sambaのバージョンは3.6.23-45.el6_9です。

根本原因について

そもそも、何故SMBv1は無効化されてしまったのか。
ランサムウェア WannaCrypt 攻撃に関するお客様ガイダンス
昨年、SMBv1の脆弱性を利用したランサムウェアが登場し、話題になりました。

enter image description here

この件に関する脆弱性は修正したアップデートが配信済みと上記の記事にありますが、同時に

「攻撃手法はさらに進化する可能性もあります。追加の多層防御対策が追加の保護を提供する場合もあります。」

とも書かれており、マイクロソフトはこれを機にSMBv1の利用そのものを終了させたのだろうと思います。

あとがき

先週までアクセス出来ていたファイルサーバーに急に繋がらなくなり、焦ったわけですが、無事解決できてホッとしています。
もしかすると、似たような症状に見舞われている方もいらっしゃるかもしれないと思い、今回の記事を投稿させていただきました。
これが何かの助けになれば幸いです。

Virtualboxを使用しAndroid 7.1をパソコンで動かす

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

PCで動作するAndroid-x86を使用して、Windows上にテスト用のAndroid仮想マシンを作成する手順です。 アプリなど実機と動作が異なったり、動かない場合もありますが、テスト用には使用できるかと思います。

実施環境

  • Windows 10
  • Virtualbox 5.2.4
  • Android-x86 64bit 7.1 RC2

ダウンロード

今回は、まだ7.1の安定版がリリースされていないので、RC2を使用します。
Android-x86から、android-x86_64-7.1-rc2.isoをダウンロードします。

仮想マシンの作成

ここからVirtualboxの仮想マシンを作成していきます。

仮想マシンの作成
名前は適当に、タイプはLinuxにしてバージョンはOther Linux (64-bit)にした。
メモリーサイズは、2048MBに増やした。

仮想ハードディスクの作成
ファイルサイズを、64GBに増やした。
作成ボタンを押す。

ストレージの選択
仮想マシンを選び設定を押す。
ストレージの光学ドライブに、先ほどダウンロードしたisoイメージファイルを設定する。
その他、お好みで設定を変える。
仮想マシンを起動します。

インストール

ブート画面
仮想マシンが起動したら、Installationを選択。

パーティション選択1
Create/Modify partitionsを選択し、パーティション作成していきます。

GPT
GPT使用しないので、Noを選択。

パーティション作成1
Newを選択し新規作成。

パーティション作成2
Primaryを選択。

パーティション作成3
全領域使用するので、そのままエンター。

パーティション作成4
Bootableにする。

パーティション作成5
Writeを選択。

パーティション作成6
yesと入力し、パーティション作成中しばし待つ。

パーティション作成7
Quitでパーティション作成画面から抜ける。

パーティション選択2
OKを選択して、先ほど作成したパーティションにインストールします。

ファイルシステム選択
ext4を選択。

フォーマット確認
Yesを選択し、フォーマット中しばし待つ。

GRUB
Yesを選択して、GRUBをインストールします。

システムファイル読み書き選択
どちらでもいいが、今回は実機に近いNoを選択した。

強制排出
マウントしたisoイメージを強制排出した。

インストール成功
Rebootを選択して、再起動します。

起動後の設定など

Android起動
Virtualboxのメニューから入力、マウス統合を外します。
画面の指示通り進めます。

メイン画面
完了
お好みで、Google日本語入力などを入れましょう。

ACPIシャットダウン
終了時は、VirtualboxのメニューからACPIシャットダウンで行います。

終了時選択
電源を切るを選択し終了します。

解像度を変更する方法

Virtualboxを使用しているAndroidの解像度を変更します。
debug mode
起動後、デバッグモードを選択します。

enter image description here
# mount -o remount,rw /mnt
# vi /mnt/grub/menu.lst

上記コマンドを入力して、ファイルを編集します。
kernelの行の最後に、vga=ask を追加します。
別のメニューとして項目を作りたい場合は、既存の行を参考にして追加してもよいでしょう。

解像度選択画面
再起動を、先ほど作成したメニューを選び、解像度選択画面に入ります。
リストの中から、好みの解像度を選択してください。

おわりに

WindowsPCでAndroid
開発環境を入れずにアプリの動作確認を行いたい場合などに、利用してみてはいかがでしょうか。
また、Android-x86はPCにも導入できるので試してみるのもいいかもしれません。

関連記事など

脆弱性診断サービスなど

弊社、アピリッツではセキュリティ診断サービスを行っております。
下記リンクから内容の確認と、問い合わせが可能です。

http://appirits.com/service/security.html

第7回「来年に流行りそうなゲームは何か?」

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

第7回「来年に流行りそうなゲームは何か?」について話していきたいと思います。

今年も後わずか!こんにちは、Lionです。
前回の記事いかがだったでしょうか?
本場のゲームプランナーが「どういう業務を行っているのか?」というのが少しでも伝わりましたら、嬉しいです!
さて、本日は「第7回 来年に流行りそうなゲームは何か?」について話させていただきます。

VRコンテンツのゲームが流行る?

私的にはVRゲームが今後流行ってくると思います。
Oculus RiftやVIVEなどの一般の人でもVRゲームを開発できるようなキットや一般家庭でVRを手軽に楽しめるPSVRなどが去年くらいから世間的に浸透しつつあります。
自分もVRゲームを開発(趣味で)しているのですが、ここ1~2年でVRゲームのクオリティは大幅に上がってきていると思います。
その中でも、自分が遊んでみて特に面白かったものをいくつか紹介いたします。

THE PLAYROOM VR

1人でも家族みんなでも楽しめるVRパーティーゲームです。
このゲームはVRヘッドセットを装着した人だけでなく、周りのみんなもテレビモニターのゲーム画面を見ながら一緒にゲームを楽しむことができるためPSVRが1個でも遊べるという利点があります。

対戦はもちろん協力プレイもあり、直感的な操作が可能なゲームばかりのため、小さい子供からお年寄りまで幅広く遊べます。
また、PSVRを装着していないプレイヤーの声が装着している人の手助けとなるゲームもあるので、みんなでワイワイ遊ぶのにはもってこいのゲームだと思います。

特にTHE PLAYROOM VRのMONSTER ESCAPEというゲームが面白いですね!
VRヘッドセットを装着したプレイヤーは、巨大モンスターとなって街をどんどん破壊していきコントローラーを持ったプレイヤーたちはヒーローとなってモンスターから逃げたり戦ったりします。
VRヘッドセットにはモンスターの視点による景色が映し出されるというのが戦略のカギになります。
enter image description here
        ©2017 Sony Interactive Entertainment Inc. All Rights Reserved.
                [sonyの公式サイトより引用]

MATIOKART VR ARCADE GP

こちらは東京都新宿区歌舞伎町1-29-1にある超現実エンターテインメントEXPO 「VR ZONE SHINJUKU」で遊ぶことのできるVRマリオカートのゲームになります。
このゲームの面白いところは、カーレース中に取得するアイテムを自分の手で取らなければいけないというのとそのアイテムを使う時に自分の手で使わなければならないところです
   enter image description here
       ©Nintendo Licensed by Nintendo、©BANDAI NAMCO Entertainment Inc.
             [超現実エンターテインメントEXPOより引用]
このように手にコントローラーを付けて、ゲーム内のアイテムを自らの手で取得します。
ゲーム内だと、以下のような感じ見えますね
       enter image description here
      ©Nintendo Licensed by Nintendo、©BANDAI NAMCO Entertainment Inc.
            [超現実エンターテインメントEXPOより引用]
ミドリこうらを持ってますね。これを相手に向かって投げるのがすごく楽しいです。
ただ、運転をしながらアイテムを投げるというのはなかなか難しかったですね(/・ω・)/
※ちなみにアイテムにハンマーがあるのですが、相手に近寄ってあてるのは結構難易度が高いです。
現状いままでやったVRゲームで一番楽しかったのはマリオカートVRだったので、興味ある方はぜひ遊びに行ってみてください!

ホラー実体験室 脱出病棟Ω

これは今まで自分がやってきたホラーVRで一番怖かったゲームになります。
病院の中を車いすで仲間と共に移動して、脱出するというゲームなのです。あまりにも表現がリアルすぎて、初めはコントローラーを操作するのもためらってしまいました。
       enter image description here
             ©BANDAI NAMCO Entertainment Inc.
           [超現実エンターテインメントEXPOより引用]

VRゲームは、ホラーとの相性はバツグンというのを象徴したかのように怖いです。
※ちなみに女性の大半は泣いているのを目にしました…

基本的に難しい操作はないです。その分、没入感が半端ない作り込まれた世界に集中することができます。
もし、興味ある方は超現実エンターテインメントEXPO 「VR ZONE SHINJUKU」にあるので遊びに行ってみてください。

ここまで話してみて

どうだったでしょうか?実はVRゲームって結構身近で遊べるようになってきたのが分かりますね!
また、人気のゲームタイトルのVRゲームも少しづつですが出始めていますし、VR専用のゲームセンターもできてきました。
私的には、来年からVRゲームが一気に流行りだすと思っています。
もしかしたら、私の好きなゼルダの伝説のVRゲームも出るかもしれませんね!
※というか出てほしい…自分でマスターソードを台座から抜きたいw

さて、次回は「第8回 必勝?!筆者独自の就活術」を話していきたいと思います。
今年ももうわずか(´・ω・`)みなさんもよいお年をお迎えください(/・ω・)/

EC2再起動でステータスチェック失敗した状態からリカバリした方法

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

EC2再起動でステータスチェック失敗した状態からリカバリした方法

EC2の再起動を実施した所、予想外のトラブルが発生し、なんとかリカバリした時の話。

何が起こったか

AWSのEC2でメンテナンスの為インスタンス再起動が予定された為、事前に手動再起動を実施。
(通常であれば難なく起動し、イベントから当該の予定が消えるはず。)
しかし、イベントから予定は消え、ステータスはrunningになったものの、インスタンスのステータスチェックに失敗。
よって、当該インスタンスにSSHもできなくなった。

試した事1 (失敗)

インスタンスの「再起動」ではなく「停止」&「起動」をしてみた。

結果

相変わらずインスタンスのステータスチェックに失敗

試した事2 (失敗)

当該インスタンスのAMIを取得し、そのAMIから起動を試みた。

結果

AMIから起動してもやはりインスタンスのステータスチェックに失敗

試した事3 (失敗)

AWSのトラブルシューティングに20分以上待つと解消するかもしれない、とあったので、
暫く待ってみた。

結果

1時間待っても解消せず。

試した事4 (成功)

当該インスタンスは、2台構成で冗長化してあるサーバの片方であった為、
もう片方のAMIを取得し、そのAMIから起動してみた。

結果

問題なく起動できた。

この段階での問題点

不運な事に、冗長構成のプログラムとは別に、(起動不能となった)当該インスタンスだけに設定してあったプログラムがあり、
そのプログラムが実行できない状態になった。

試した事5 (成功)

AMIより起動した新規EC2に、起動不能となったEC2のEBSをアタッチしてみた。

結果

問題なくアタッチできた。

あとは、マウントの設定と、いくつかプログラムの設定を実施し、なんとか平常状態にする事ができた。

MySQL の auto_increment をリセットする

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

MySQL の主キーとかに auto_increment 属性を付けておくと連番の ID を自動生成してくれるので便利です。

データ挿入時に id を指定せずデータ挿入すればよくなり、ユニークな ID が自動で割り当てられます。

> insert into names( name ) values( 'ヤマダ' );
> insert into names( name ) values( 'スズキ' );
> insert into names( name ) values( 'サトウ' );
> select * from names;
+----+------+
| id | name |
+----+------+
|  1 |ヤマダ|
|  2 |スズキ|
|  3 |サトウ|
     :
+----+------+

便利な auto_increment 属性ですが、コントロールする必要が出た場合に少しコツが必要になります。

3レコード目が誤って登録した事に気づいて、削除をした場合に
次にデータを挿入するとauto_increment はリセットされずに id = 4 として 3 件目のデータが挿入されます。

> select * from names;
+----+------+
| id | name |
+----+------+
|  1 |ヤマダ|
|  2 |スズキ|
|  4 |タナカ|
     :
+----+------+

これでも問題無いと考えるのであれば特に気にする必要ないですが、連番ではなくなってしまうので、
auto_increment を自分の意図でリセットしたくなる場合があります。

その場合は、以下のコマンドを実行します

alter table names auto_increment = 3;

auto_increment 属性値を強制的に「3」に変更しましたので、この状態からデータ挿入すると
次に入るレコードの ID は 「3」 になります:

> select * from names;
+----+------+
| id | name |
+----+------+
|  1 |ヤマダ|
|  2 |スズキ|
|  3 |タナカ|
     :
+----+------+

まとめ

基本的には自分のローカル環境でしか行わない作業ですね。
特に気にならなければ行わない処理なので、連番に出来る方法もあるんだなー
程度に覚えておけば良さそうです。

手軽な運動で運動不足を解消

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

最近運動不足なのをひしひしと感じているので、手軽に出来る運動は無いか調べてまとめてみました。
以下のサイトを主に参考にしています。

公益財団法人 健康・体力づくり事業財団

ウォーキング

一日につき一万歩歩くと、生活習慣病の予防に良いとのことです。
一万歩というのがどれくらいの距離なのかイメージがつきにくかったので、計算してみました。
歩幅の目安については、明確な値は出てこなかったのですが、タニタのからだカルテというページを参考に計算してみます
タニタ からだカルテ

歩幅の目安(諸説有り):身長 × 0.45
・男性,平均身長の場合
 171(cm) × 0.45 × 10,000(歩) = 7.695 (km)
・女性,平均身長の場合
 158(cm) × 0.45 × 10,000(歩) = 7.11 (km)

大体一日あたり7km〜7.5kmくらい歩くと良いみたいです。
分散して歩いても良いようなので、階段の昇り降り等を増やして少しでも多く歩くよう心がけると良いかもしれません。
効果的な歩き方のフォームなども掲載されているので、興味の有る方は一度参考ページを御覧ください。

ストレッチ

簡単なストレッチでも、運動不足の身体には効果的だそうです。

肩のストレッチ

準備運動で行う、片方の腕をもう片方の腕で引き寄せる運動です。
10秒間、2セットずつ行うことが推奨されています。
enter image description here

伸び

息を吐きながら、思い切り伸びを10回ほどするのも良いそうです。
これならデスクでも簡単に出来ます。
enter image description here
イラストだと手を組んで伸びをしていますが、握りこぶしを作って伸びたほうがよりストレッチには良いとのことです。

比較的やりやすそうな2つを取り上げました。他にもストレッチ方法は紹介されていますが、簡単なものでも健康に良いときいて驚きました。

ランニング

以前手頃な運動について調べていた時に、ランニングについて良く目にしたので合わせて紹介したいと思います。

手頃なスポーツをしてみる

同じく財団のページには書いてありませんが、手頃なスポーツをしてみるのも運動不足や気分転換に良いそうです。

お金や時間はかかってしまいますが、スポーツジムを利用してみるのも一つの手かもしれません。

明治神宮球場には、バッティングセンターもあるので、そういったところで手軽に楽しんでみるのも良いですね。
Doruby内で紹介している記事もあるので、是非御覧ください。

やきうのすすめ

まとめ

公益財団法人 健康・体力づくり事業財団のページを参考に、いくつか簡単な運動について紹介しました。
こういった簡単なものから取り組んで、運動不足を解消していきたいと思います。

Redmine3.4.3にredmine_backlogsを入れた時の備忘録

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

新しいバージョンと古いプラグインはキノコとタケノコくらいに相容れない

 Redmine3.4.3にプロジェクト管理ツールであるBacklogのRedmine用である、redmine_backlogsを入れてみたのですが、その時に色々と詰まったので書き残しておきます。

動かせるようになるまでの過程

1

まず、普通にredmine_backlogsをRedmineのプラグインとしてgitから落としてきて、

bundle exec rake redmine:plugins:migrate RAILS_ENV=production

を行ったらエラーが発生した。
そこから色々手を加えたりして、頑張ったりしたけれど簡単な解決があった。
Redmine3.2にredmine_backlogsを入れた人のブログがあったので、それを参考に。
・ソースは本ブランチのものではなく、origin/feature/redmine3 のものを使用。
・nokogiriとcapybaraをGemfileからコメントアウトする。
でok。後はマイグレーションして再起動すれば反映される。

2

次に、チケットを作成しようとした時に、
plugins/redmine_backlogs/lib/backlogs_hooks.rb

return unless project.module_enabled?('backlogs')

で、projectがnilだと怒られてエラー発生。
try当て込んだら取り敢えず動いた。

return unless project.try(:module_enabled?, 'backlogs')

そこから詳しく調べると、
app/views/issues/new.html.erbで呼ばれていて、それは要するにチケットを作成しようとした時(issues/newが呼ばれた時)の、app/controllers/issues_controller.rbのnewメソッド
に問題がある。
それからprojectを入れているのは、newのbefore_actionの中でのbuild_new_issue_from_paramsメソッドの

@issue.project = @project

それから、@projectを入れているのは、app/controllers/application_controller.rbのfind_optional_projectの、

@project = Project.find(params[:project_id]) unless params[:project_id].blank?

要するに、パラメータにproject_idが入っていない場合、@projectが空っぽのまま処理が進んでエラーが起きる、という事。
ただ、どうしてここのproject_idが空っぽなのか? 存在していないプロジェクトに対してチケットを作成しようとした? そもそもトップ画面からのメニューで既にproject_idが入っていなかったからエラーが起きただろうけど、他の部分は動かせていたのは何故……?
エラー箇所を元に戻してみてもう一度エラーを起こしてみようと思いましたが、その時にはまた何故か正常に動くようになっていて、原因は闇の中に消えてしまいました……。
ログも削除済みでした……。

3

redmine_backlogs/lib/backlogs_setup.rb:234行目でエラー。

def settings
  SettingProxy.instance.to_h
end

これだと、文字列=>値のハッシュが作成されるが、これを参照している箇所ではキーを文字列ではなくシンボルで参照しているので、そのように変更する。
with_indifferent_accessメソッドを使うか、手作業で変えるかはお好みで。

4

それから、javascript関連でもエラー。このredmine_backlogsを動かす為に一緒に導入したa_common_libというプラグインにてエラー発生。
plugins/a_common_libs/assets/javascripts/a_common_lib.js:25にてbuildFilterRowが定義されていないと怒られる。
えーっと、これはどこのものだ……? と調べた結果、redmine本体のpublic/javascripts/application.jsに存在している事が判明。どういう理由か分からないけれど、このファイルがプラグイン以下で読み込まれていないんだな……。
色々と調べてみると、
app/application_helper.rbのjavascript_include_tagsで、pluginに入っているjavascriptファイルは全て取ってきているらしいけれど、public以下のソースを取ってきている様子はどうも見当たらない。
前のバージョンでは、public以下のソースを取ってきていたんだろうか……と思う。
で、取り敢えずbuildFilterRow、 それからenableValuesの部分をコピペしてa_common_lib.jsに移植する。それが一番外部に影響が少ないだろうし……。
……動いた!
取り敢えず、これで特に問題はなくなりました。

+A

後、他のプラグインを入れた時にそのbacklog関連でエラーが発生したりしましたが、取り敢えず、backlog関連のデータが入っているものを無視するようにすれば、問題はなくなりました。

Redmineを触ってみての感想

Railsに触れ始めてもう8ヶ月ほどが経ちましたが、それでもいきなり全く知らないコードを読んでの修正はとても大変でした。
エラーが起こればコードを追いかけてひたすら原因部分を見つけ出し、応急処置をするように直してを繰り返し……。これ以外のプラグインも入れたりもして、エラーがそれぞれで起きたりもして、それぞれ直す事もしましたが、このredmine_backlogsが一番手間が掛かりました。
本格的に直そうと思ったら、Redmineにもかなりの時間を割かなければいけないでしょうし、どれだけ時間が掛かるか正直分かりません。
でも、正常に動くプラグインに関しては本当に数コマンドで新しい機能が使えるようになって、とても使い易いなー、とも思いました。

……疲れた。太ってきたけど甘いものが欲しい。

jQuery.ajaxでRailsのコントローラを叩く

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

ajaxを利用することで、jQuery側からRailsのコントローラへアクセス出来たので備忘録を兼ねて記載しようと思います。

gemの導入

railsでjQueryを扱えるように、gemを導入します。

(デフォルトで入ってる場合もあるみたいです。)

# Gemfile
gem 'jquery-rails'

Controllerの用意

# tests_controller.rb

def index
end

#ユーザの一覧をjson形式で返すアクション
def ajax_test
  @user = User.all
  render json: @user
end

ページ表示用のindexアクションと、ajax通信用のajax_testアクションを定義したControllerを用意します。

対応するルーティングの追加

ajaxでアクセス出来るように、ルーティングを追加します。

# config/routes.rb
Rails.application.routes.draw do
  resources :users
  resources :tests
  get 'ajax_test', to: 'tests#ajax_test'
end

Viewの用意

# index.html.erb

<% content_for :head do %>
  <%= javascript_include_tag 'ajax_test', 'data-turbolinks-track' => true %>
<% end %>

<h1>ajaxテストページ</h1>

<%= link_to 'jsonを表示する', ajax_test_path, {id: "ajax_test", remote: true} %>

<table id="user"></table>

indexアクションでrenderするviewファイルを用意します。

今回は、リンクをクリックしたらajax通信が始まるようにしました。

(remote: trueを追加することで、rails側がajax通信をしてくれるようになります。)

coffeescriptの用意

ajaxでアクセスするためのcoffeescriptを用意します。

リンクをクリックしたら、動作するように指定しました。

また、ajax通信が成功したら、返却されたjson形式のデータをtableタグの内部に追加するようにしています。

# ajax_test.js.coffee

$ ->
  $("#ajax_test").click ->
    $.ajax
      url: '/ajax_test'
      type: 'get'  #get,postの指定
      dataType: 'json' #レスポンスのデータタイプ指定
      async: true #非同期通信フラグ
    .done (response) ->
      #処理が成功した時の処理
      $("#user").append("<tr><th>名前</th><th>年齢</th></tr>")
      for i in [0..response.length]
        $("#user").append("<tr><td>" + response[i].name + "</td><td>" + response[i].age + "</td></tr>")
    .fail (response) ->
      #処理が失敗した時の処理
      alert 'fail'

# 生成されるjavascript

(function() {
  $(function() {
    return $("#ajax_test").click(function() {
      return $.ajax({
        url: '/ajax_test',
        type: 'get',
        dataType: 'json',
        async: true
      }).done(function(response) {
        var i, j, ref, results;
        $("#user").append("<tr><th>名前</th><th>年齢</th></tr>");
        results = [];
        for (i = j = 0, ref = response.length; 0 <= ref ? j <= ref : j >= ref; i = 0 <= ref ? ++j : --j) {
          results.push($("#user").append("<tr><td>" + response[i].name + "</td><td>" + response[i].age + "</td></tr>"));
        }
        return results;
      }).fail(function(response) {
        return alert('fail');
      });
    });
  });

}).call(this);

実際に動作させてみる

railsを起動して、期待通りに動作するか確かめました。

enter image description here
enter image description here
上記の「jsonを表示する」リンクをクリックすることで、無事テーブル内にjsonの中身を表示することが出来ました。

まとめ

jquery側からControllerへ、ajaxを利用すればアクセス出来ることが分かりました。

まだ単純なアクセスと表示でしか利用出来ていないので、もっと他に便利なことが出来ないか模索してみたいと思います。

壁貫通バグ!?現実世界の不思議な仕様

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

今回は現実世界のバグのようなものについてご紹介します。

はじめに

ゲームをプレイしていると、たまに出会うことがあるバグ。その中の一つに、本来通り抜けられない壁を越えてしまえるバグなんてものがあります。
私にも、四天王の最後のフロアで柱になみのりを…なんてバグで遊んでいた記憶があります。
ゲーム制作側としては、バグなんてあってはならないものですが、ゲームをプレイする側で考えると、見つけられるとちょっと楽しくなりませんか?
今回の記事は、ゲームではなく、現実世界で、壁抜けバグのような現象があるようなので、それを紹介したいと思います。

ミクロな世界

今回紹介する現象は、非常に小さいミクロな世界で確認されている現象なので、まずはミクロな世界について少しお話します。(逆にこの記事では私たちが普段見ている世界をマクロな世界と呼びます。)
物体を、その構成要素に分けていくと、最終的には非常に小さい粒子にたどり着きます。
例えば、水は化学式でH2Oと書かれますが、これを分けていくと次のようになります。
水 ⇒ 水分子 ⇒ 酸素原子、水素原子 ⇒ 陽子、中性子、電子
この陽子、中性子、電子のような非常に小さい粒たちが今回紹介する現象の主役になります。
ちなみに、どれぐらい小さいかという有名なたとえとして、
ピンポン球の原子とピンポン球の大きさの比は、ピンポン球と地球の大きさの比と同じぐらいだそうです。
enter image description here

トンネル効果

名前の通り、壁を通り抜けそうな名前ですが、今回の現象の名前が「トンネル効果」です。
ミクロな粒子たちは、常に動き回っているため、「どこにある」という表現ではなく、「どこらへんにいそう」という表現をします。
つまり、場所がきっちり決まるのではなく、場所を存在確率で表現します。「ここにいます!」というのではなく、「この辺に良くいます!」といった言い方でしょうか。
ミクロな粒子について、粒子を壁ぶつけることを考えると、壁の向こう側の存在確率が0にならないことがあります。
つまり、壁の向こう側にも粒子が存在できてしまうのです。これをトンネル効果と呼びます。
私たちが見ているマクロな世界では、壁がどんなに薄くても、物体が壁の向こうに行くことはまず考えられません。
しかし、上述のように、マクロな世界は、ミクロな世界の粒子が多数集まって構成されており、そしてミクロな粒子一つ一つには壁を超える可能性を持っています。つまり、非常に低い確率ではありますが、マクロな世界でも壁を超える可能性があるということになります。

※ちなみに、この「トンネル効果」はすでに半導体や顕微鏡などに応用されている現象です。
顕微鏡に応用されている例を紹介しますと、トンネル効果を応用した顕微鏡は「走査型トンネル顕微鏡」と呼ばれ、細い金属針を物体表面に近づけて、トンネル効果で電流が流れてくるときの電流の強さによって、物体表面の原子レベルの凹凸まで判断できる超高精度な顕微鏡です。
enter image description here

人間が壁をすり抜ける確率概算

ネットを調べてみても、現実世界のトンネル効果について言及している記事があまりなかったので、ここでは私が適当な数字を当てはめて計算してみようと思います。
調べたところ、人間の体重の65%程度は酸素原子の重さのようなので、簡単のため人間が100%酸素で構成されていると考えます。
ここでは酸素原子一粒が壁を越えられる確率を10%とします。(酸素原子はすでに陽子、中性子、電子の集合体なので、実際にはもっと低いはずです。)
酸素原子Oの原子量は16なので、6*1023 個集まると16グラムになります。
体重64キロの人間を考えると、体重が酸素の原子量の4000倍なので、4000×6×1023 個=2.4×1027 個、酸素原子が集まっていることになります。
後は、これらが通り抜ける確率50%を一斉に引ければいいので、
0.1の2.4×1027 乗を計算すれば良いということになります。
これを直接電卓に入れるとエラーになって答えが出ないので、概算します。
2.4×1027 ≒1027 として、0.11027なので、0.の後ろに0が1027 個続くぐらい小さな確率です。
では、どのぐらいの確率なのか行動に移してみましょう。
仮に、宇宙が始まってから今日まで1秒に一回ずつ壁にぶつかり続けるとしましょう。宇宙を約140億年とすれば、1年は3*107 秒なので140億年では4.2*1017 回壁にぶつかれます。
すると、すり抜けられる確率は、4.2*1017 / 1027 ≒1/1010 ⇒100億分の1ということで、このペースだと100億分の1程度ということになります。
つまり、1秒間に100億回かべにぶつかりつづければ、宇宙が始まってから現在までに1回ぐらい壁抜けが出来るかもしれませんね。

終わりに

いかがでしょうか。自分の概算ではありますが、宇宙始まってから毎秒100億回かべにぶつかってくれるデバッカーがいないと気づけないバグなんて大変なことですね。
これがバグなのか仕様なのかは創り手のみぞ知るということで、この世界にはまだまだ不思議な仕様が眠っていそうでわくわくします。

カフェインはどうやって目覚まし効果を発揮するのか

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

はじめに

1年間に世界で消費されるカフェインの量は10万トンに及び、カフェインのほとんどはコーヒーやお茶から摂取されています。

眠気覚ましにコーヒー、栄養ドリンクを飲む人の多くは、コーヒーなどに含まれる「カフェイン」の効果を狙っているわけですが、一体カフェインはどのようにして目覚まし効果を発揮しているのか?
飲み過ぎるとどうなるのか?
調べてみました。

カフェインによる体の影響

カフェインを摂ると、注意深くなり、集中力が増し、幸せで精力的になれます。
睡眠不足の状態でも効果を発揮しますが、心拍数と血圧を上げて、不安な気分にもなります。

カフェインは人間の体内では神経システムを刺激する効果をもたらし、
眠気の鍵となる物質の働きを妨害することでカフェインは眠気を覚まします。

ちなみにカフェインは摂取してから、効果があらわれるまでには約30分かかり、その効果は約5時間-7時間ほど続きます。

また、カフェインを長期間摂取することはパーキンソン病やアルツハイマー病や特定の癌などの病気に罹患するリスクを下げる効果や、体の脂肪を燃やす機能を助けることがあることも分かっています。

カフェインは良い事だけじゃない

カフェインは眠気を解消したり、病気のリスクを下げたり、はたまた脂肪燃焼もしてくれる大変ありがたいものですが、
体にとって良い効果ばかりではありません。

カフェイン接種により集中力が高まると同時に、心拍数は多くなり血圧は上昇します。
また、利尿作用や下痢や不眠をもたらしたりします。
カフェインを日常的に摂ると、脳はその状態に適応してきます。

そこで、眠気を覚まそうと、さらにカフェインの摂取量を増やすという行動につながります。

カフェインの摂取を急に止めると、頭痛や倦怠感、落ち込んだ気分を生じさせます。
そしてしばらくすると体からカフェインが抜けて体はリセットされるので、
昔のようにカフェインの目覚まし効果が復活することになります。

まとめ

体質的な相性や、当日の体調によっても体への影響が変わりますので、上手にカフェインを摂取して付き合っていくのが良い
何でも程よいくらいがちょうどいい

セオリーを知る ~プランニング編~

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

前回はプレイヤー視点でのセオリーの重要性を説明した。 今回はそのセオリーを踏まえて新しくゲームを作るのは どうするかを考える。

セオリーを守る

 前回に引き続き、対戦カードゲームを例に考えていく。
 前回は「いかに盤面にモンスターを残して相手に攻撃を通すか」というのが基本であることを説明したが、もし「相手プレイヤーに直接ダメージを与えるカードをたくさん入れるのが強い」場合どうだろうか。これは対戦カードゲームの醍醐味である「プレイヤー同士の駆け引き」を放棄し、壁とやっているのと大差ない状態になることが目に見えるだろう。
 このような「当然そうあるべき暗黙の了解」を守ることは土台として必要となる。

新しいセオリーを生み出す

 セオリーを守るだけではユーザーからは当然見向きもされない。他のゲームをやるのと変わらないからだ。
 例えば「同じカードが手札にある場合、1枚捨てることで残っている同じカードのコストを減らせる。これは対戦中3回行える。」というルールがあったとしよう。このとき、「できるだけ同じカードを入れる」「あまりやりすぎると手札のリソースが無くなってジリ貧になる」といった要素が加わる。そのうち、強いプレイヤーが「現環境ではどうするのがベストか」というセオリーを生み出すだろう。
 そう、セオリーはそのときのカードやゲームのルールに応じて刻々と変化するし、ユーザーが見出すこともあるのだ。

セオリーを破る

 最後にセオリーを正しく破ることの重大さを知っておこう。
 デジタルカードゲームが台頭してきたとき、リアルのカードゲームと決定的で絶対的な差に驚いたことがある。遠くにいる誰とでもいつでも対戦できるとかそんなことではなく、リアルのカードゲームでは非現実的な要素だ。それは「トークンカードの生成」「ランダム実行」というデジタルならではのものである。
 「2種類のモンスターの能力を合わせたカードを作る」「存在するあらゆるカードからランダムなカードを発動する」なんてことはデジタルでないとまず不可能と言える。これは「デッキに投入したカードだけで戦う」というセオリーを「デッキ外から追加されるカードも織り込んで戦う」にする進化を対戦カードゲームに与えた。もちろん広い意味では「デッキに投入したカードだけで戦う」は維持されている。

まとめ

 セオリーや暗黙の了解といったものは言語化されづらく、どこまでが当てはまるかは人によって異なるだろう。今まで挙げた中にもセオリーという言葉で示されるべきではないものも含まれているかもしれない。
 しかしここまでで伝えたかったのは「一般的な共通認識は非常に重要である」という一点に尽きる。ここを疎かにすると手痛いダメージを受けることになるだろう。

APIを叩いてslackから発言を取ってくる

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

目次

  • 概要
  • Slack API
  • トークンに関して
  • コード

概要

パワーメタルやシンフォニックメタルが最近のお気に入りです。
新卒はslackにDorubyのネタになりそうなアイデアの種を雑に書き込むチャンネルを作ってます。
が、slackの無料版では10000メッセージまでしか見られないので、今月の記事を書こうとしたら過去のネタが消えているという悲しい出来事がありました。
もう悲しい思いはしたくないのでslackの投稿を定期的に保存しておこう。というのがこの記事のテーマです。

Slack APIを叩く

Slackのチャンネル履歴のAPIのドキュメントです。
https://api.slack.com/methods/channels.history
一番簡単に使うには、TokenとチャンネルIDだけパラメーターで与えてやるといいです。
チャンネルIDは
https://api.slack.com/methods/channels.list/test
から取ってきてもいいし、チャンネルリストAPIを叩いてもいいです。
https://api.slack.com/methods/channels.list

トークンに関して

ここまではとても簡単なのですが、Slackのトークン関連で詰まりまくりました。
SlackのAPIトークンには2種類あって、
1. レガシートークン
2. レガシートークンじゃない方の普通のトークン
です。
レガシートークンは
https://api.slack.com/custom-integrations/legacy-tokens
から取得できますが、これではchannels.history APIは取得できないので、後述する普通のトークンを取得してください。
ちなみに、channnels.list APIは普通に叩けるので、ここで理解ができなくて詰まりました。
レガシートークンじゃない方の普通のトークンの取得
https://api.slack.com/apps
ここからAppを作成すると普通のトークンが取得できます。
Add features and functionality -> Permissions -> Select Permission Scopes からchannels:historyを選択します。
そうすると、channels.historyが選択できるようになります。

コード

# python3.6
import requests
import json
url = "https://slack.com/api/channels.history"
token = "{YOUR TOKEN}"
channel_id = "{YOUR CHANNEL ID}"
def main():
    payload = {
        "token": token,
        "channel": channel_id
        }
    response = requests.get(url, params=payload)

    json_data = response.json()
    messages = json_data["messages"]
    for i in messages:
        print(i["text"])
if __name__ == '__main__':
    main()

これを実行すると

xonsh
gitkraken
Progressive Web Apps
スクレイピング RSS
ARCore
Pyro
tse
スマートスピーカー
Prophet
Python Exception
Superset
Android Architecture Component
Headless Chrome
ラズパイ NFC
LiveData
Flux
Quantum CSS
IRKit
Hue
Puppeteer

みたいなメッセージがとれます。
コードは簡単すぎて何も書くことが無いんですが、pythonの通信ライブラリはrequestsが好きです。

無駄に見えて無駄じゃないalias

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、幾田です。

今回は「無駄に見えて無駄じゃないalias」と題して、私が趣味で登録しているbashのaliasをご紹介します。
やってることは無駄ですが、シェルスクリプトのお勉強になるので無駄じゃありません。

1. :q

私はテキストエディタにvimを使ってます。
間違えてvimの終了コマンド:qをbashで打ってしまうことがあります。

# ~/.bashrc

alias :q='echo ここvimじゃないよ:p'
q.gif

忙しい時に見るとだいぶ腹がたちます。
aliasに記号:が使えることがわかりましたね。

2. lll(小文字のL)

llのaliasを登録している人は多いのではないでしょうか。
同じ文字2文字だし、ls -lの略でllってわかりやすいですよね。

でも、勢い余ってlllと打ってしまうことがあります。
連打してしまってもある程度大丈夫なようにaliasを設定しましょう。

# ~/.bashrc

# llコマンドのaliasを設定します
alias ll='ls -l'

# ベースとなる文字列を宣言
l_length="ll"

# for文を使って10回繰り返す
for i in `seq 10`
do
  # 文字列の末尾に一つlを追加していく
  l_length=$l_length"l"

  # 文字列に対してlsのaliasを設定
  # `echo $l_length` の実行結果をaliasに渡す
  alias `echo $l_length`='ls -l'
done
ls.gif

これで最大llllllllllll連続12文字まで登録できました。
何が嬉しいのかわかりませんが、aliasに登録するコマンドに変数を使う方法がわかりました。

3. 眠い

業務中眠いなあと思ってbashに眠いと打ちます。

$ 眠い
-bash: 眠い: command not found

そんなコマンドはないので怒られます。
怒られるなら「仕事しろ」と叱咤激励してもらいたいものですね。
というか怒られるよりもこの眠さを誰かにわかってほしい。
この睡魔を同意してもらえるようにaliasを設定します。

# ~/.bashrc

# ランダムに同意の言葉を返す関数 sympathize_randomly
function sympathize_randomly () {
  # 「眠い」に返す言葉の配列 replies を宣言
  declare -a replies=(
    "私も"
    "俺も"
    "僕もです"
    "仕事しろ"
    "わかるぅ〜"
  )

  # ランダムな数字を配列の要素の個数で割った余りを計算
  random_number=$[1] $RANDOM % ${#replies[@]} 

  # 配列からランダムな要素を出力
  echo ${replies[$random_number]}
}

# sympathize_randomly 関数を使ってaliasを設定
alias 眠い='sympathize_randomly'
sleepのコピー3.gif

aliasに日本語も設定できるんですね。
関数の宣言の仕方や、配列の要素数の取得方法などいろんなことが学べました。

alias 設定時に気をつけること

aliasの設定で気をつけるべきは既に存在するコマンドを登録してしまわないことです。
また、aliasが便利だからって何でもかんでも設定していると、どれが何かわからなくなってしまうこともあるかもしれません。
破壊的なコマンドを簡単なaliasに設定するのもよくないです。

まとめ

やっていることは大変無駄でしたが、bashの知識はいつかどこかで役に立ちそうです。

それでは、今日はこの辺で。
読んでいただき、ありがとうございました。

References

References
1 $RANDOM % ${#replies[@]}

javascriptでダイアログを表示する

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

 webサービスで、ユーザに確認・注意させる場合に利用する手段としてダイアログの表示が存在します。今回は、javascriptで使える標準のダイアログについてまとめてみました。
OSは、Windows 10。ブラウザは、Firefox Quantum 57.0を使用しました。他のブラウザでは、こちらの記事とは異なる動作になる恐れがあります。

alert

 alertは、ユーザに注意を促す場合に使用するダイアログです。OKボタンを押すとダイアログが閉じます。

enter image description here

 以下のコードで、上図のダイアログを表示させることができます。第一引数に表示させたい文字列を指定します。第二引数以降に文字列を設定しても第一引数のダイアログのみ表示されます。

alert('メールアドレスを入力してください。');

confirm

 confirmは、ダイアログにOKボタンとキャンセルボタンが備わったダイアログです。OKボタンとキャンセルボタンの押し分けで動作を分岐させることができます。

enter image description here
confirm('アンケートが入力されておりません。次の画面に進みますか?');

 confirmは、OKボタンを押すとtrueをキャンセルボタンを押すとfalseを返します。以下のコードにすることで、分岐が可能になります。こちらもalertと同様に、第一引数のみダイアログに表示されます。

var result;
if(confirm('ボタンを押してください。')) {
  result = 'OKボタンが押されました。';
} else {
  result = 'キャンセルボタンが押されました。';
}
alert(result);

prompt

 promptは、テキストボックスが備わったダイアログです。promptの返り値は、ダイアログで入力した値です。何も入力しなかった場合は、nullが返ります。

enter image description here
prompt('メールアドレスを入力してください。');

 promptに第二引数を指定すると、ダイアログのテキストボックスに入力された状態で表示されます。

var input = prompt('メールアドレスを入力してください。', 'test@example.com');
alert(input + "が入力されました。");

ダイアログの表示を抑止

 ダイアログを短い間隔で表示させると、以下のダイアログが表示されます。今まで紹介したダイアログには表示されなかったチェックボックスこのページによる追加のダイアログ表示を抑止するの文言が追加で表示されます。このチェックボックスを入れた状態でダイアログを閉じると、次からのダイアログが表示されなくなります。この機能が存在する理由は、ダイアログを無限に表示させるブラウザクラッシャー対策です。
※promptダイアログで、チェックボックスをいれた状態でキャンセルボタンを押した場合のみ、ダイアログが次も表示されました。

enter image description here
 ダイアログが表示されなくなることで、confirmが期待通りの動作が行われない場合があります。ダイアログの表示を抑止された状態だと、confirmは必ずfalseを返します。よって、抑止状態だとOKボタンを押した時の動作を行うことができなくなります。この問題を発生させないには、「ダイアログ表示するときに一定時間の間隔を設ける」や「自作のダイアログを使用する」を行うことで回避できます。

まとめ

javascriptの標準ダイアログの利点

  • 簡単に実装することができる

javascriptの標準ダイアログの欠点

  • カスタマイズできる項目がダイアログの文言のみ
  • ダイアログの表示の抑止した状態を考慮する

“同じ文字列”==”同じ文字列” => false

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

TL;DR

表示上は全く同じように見える文字列同士が==演算子でfalseを返すことがある。一つの原因として考えられるのはUnicodeが合成文字という仕組みにより濁音/半濁音を別扱いしているというもの。Unicode、また君か? 解決方法はUnicode正規化をすること。例えばrailsのActive Supoortなら以下のように正規化できる。

ActiveSupport::Multibyte::Unicode.normalize(string, :kc)

現象と原因の特定

この現象に遭遇したのはxmlからパースした文字列をrspecで期待値通りかチェックしていた時のこと。このように表示上は同じように表示されるが==(eq)演算子ではfalse扱い。

str1
#=> "電話番号 : 入力データが不正です"
str2
#=> "電話番号 : 入力データが不正です"
str1 == str2
#=> false

そこで、まずはバイトサイズを確認すると一致しない。そこでエンコーディングの差を疑って文字列のエンコーディングを確認するがこれも一致する。

[str1.bytesize, str2.bytesize]
#=> [54, 45]

[str1.encoding, str2.encoding]

#=> [#<Encoding:UTF-8>, #<Encoding:UTF-8>]

では何が違うかというと前述したとおり、str1では濁音/半濁音の記号が分離されている。これはString#unpackで文字列をコードポイントに変換したり、String#charsで文字単位に分割するとわかる。

str1.unpack("U*")
#=> [38651, 35441, 30058, 21495, 32, 58, 32, 20837, 21147, 12486, 12441, 12540, 12479, 12363, 12441, 19981, 27491, 12390, 12441, 12377]
str2.unpack("U*")
#=> [38651, 35441, 30058, 21495, 32, 58, 32, 20837, 21147, 12487, 12540, 12479, 12364, 19981, 27491, 12391, 12377]

str1.chars
#=> ["電", "話", "番", "号", " ", ":", " ", "入", "力", "テ", "゙", "ー", "タ", "か", "゙", "不", "正", "て", "゙", "す"]
str2.chars
#=> ["電", "話", "番", "号", " ", ":", " ", "入", "力", "デ", "ー", "タ", "が", "不", "正", "で", "す"]

これにはUnicodeの合成文字という仕組みが関係している。合成文字/結合文字(combining character)は非結合文字の直後に結合文字を配置することで結合文字列(CCS)を作る仕組みのこと。簡単にいえば「が」という文字列を「か(非結合文字)」「<濁音記号>(結合文字)」という2つのコードポイントで表してもいいということだ。ややこしいのが、Unicodeは「が」という一つのコードポイントで表しても良い点で、つまり同じ文字を表すのに異なるデータの表現方法がある。

当然、バイト列が違うのでそれぞれの表現でバイト数さえ食い違う。このままでは色々な問題が発生するため、これらのバラバラな表現を統一するように正規化することが出来る。

str1.bytesize
#=> 54
ActiveSupport::Multibyte::Unicode.normalize(str1).bytesize
#=> 45
ActiveSupport::Multibyte::Unicode.normalize(str1) == str2
#=> true

ちなみにUnicode正規化にはNFD、NFCなど複数の形式があり、上記のコードでは省略しているが、normalizeメソッドは2番めの引数に正規化形式を指定することが出来る。ex. normalize(str, :nfc)

ところで色々な問題が発生する、と書いたが面白いのはセキュリティに関する問題を引き起こすこと。文字列の比較はセキュリティに深く関わるトピックであり、XSSを防ぐためのエスケープにせよ、パスワードの認証にせよ、文字列が正しく比較出来ることを前提にしている。その前提をいじれてしまうのなら色々なことが出来てしまう。

考えられる他の原因

表示上は同じだがデータは異なる、という文字列比較のややこしい問題は他にも色々ある。やはり文字列データは非常に複雑なデータ形式ということだろうか。こういった問題が不完全な抽象化から抜け出せる日はまだ遠い。主が怒り全地の言葉を乱し人を全地に散らされたために人々は当面の間は苦しむ。

  • 非最短形式
  • 多対一の変換
  • 大文字と小文字
  • エンコード情報の不一致
  • 7ビットエンコーディングの解釈

CentOS6環境にZabbixをインストールしてみた

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

ローカル環境でZabbixの動作を確認するためにVagrant上のCentOSにZabbixサーバを構築したときの手順を公開します。

前提と注意

注意

以下の手順はローカル環境での動作確認を目的とした構築手順でありセキュリティ的な考慮は行ってません。
本番で稼働させるにあたってはセキュリティに配慮した設定を意識してください。

Vagrant環境

Vagrant環境にCentOS6を入れて環境構築しています。

以下のように、private_network でホストOSからアクセスできるようにしておきます。

メモリはなんとなく1Gにしてますが、お試し用途であればデフォルトの512MBでも動くかもしれません。

Vagrant.configure("2") do |config|
  config.vm.box = "centos/6"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
  end
end

バージョン

OS/ミドルウェアのバージョンは以下のとおり。

  • OS: CentOS release 6.9 (Final) ※Vagrantの仮想環境
  • Zabbix: 3.0
  • MySQL: 5.1.73
  • PHP: 5.5
  • Apache: 2.4

手順

ここからは vagrant up で起動した仮想マシンでの作業です。

SELinux無効化

動作確認目的なのでSELinuxを無効化する
/etc/selinux/config を以下のように編集して仮想マシンを再起動します。

SELINUX=disabled

yumリポジトリ追加

以下のように Zabbix 公式のyumリポジトリを追加します。

# rpm -ivh https://repo.zabbix.com/zabbix/3.0/rhel/6/x86_64/zabbix-release-3.0-1.el6.noarch.rpm

追加後、zabbix を検索したら以下のように表示されるはずです。

# yum search zabbix
Loaded plugins: fastestmirror

zabbix-agent.x86_64 : Zabbix Agent
zabbix-get.x86_64 : Zabbix Get
zabbix-java-gateway.x86_64 : Zabbix java gateway
zabbix-proxy-mysql.x86_64 : Zabbix proxy for MySQL or MariaDB database
zabbix-proxy-pgsql.x86_64 : Zabbix proxy for PostgreSQL database
zabbix-proxy-sqlite3.x86_64 : Zabbix proxy for SQLite3 database
zabbix-release.noarch : Zabbix repository configuration
zabbix-sender.x86_64 : Zabbix Sender
zabbix-server-mysql.x86_64 : Zabbix server for MySQL or MariaDB database
zabbix-server-pgsql.x86_64 : Zabbix server for PostgresSQL database
zabbix-web.noarch : Zabbix web frontend common package
zabbix-web-mysql.noarch : Zabbix web frontend for MySQL
zabbix-web-pgsql.noarch : Zabbix web frontend for PostgreSQL
zabbix-web-japanese.noarch : Japanese font settings for frontend

MySQLインストール

DBMS として MySQL を使用するため、以下のようにインストールします。

# yum install -y mysql-server

以下を /etc/my.cnf に記述

[mysqld]

# 日本語設定
default-character-set=utf8
skip-character-set-client-handshake

innodb_file_per_table
innodb_buffer_pool_size=64M
innodb_log_file_size=16M
innodb_log_files_in_group=2

DBの準備

MySQLがインストールできたら、Zabbix用のDBとそのDBにアクセスするためのユーザを作成します。

サービス起動
# service mysqld start
# chkconfig mysqld on

MySQLに接続
# mysql -uroot

Zabbix用のDBの作成とユーザの作成
mysql> create database zabbix character set utf8;
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbixpassword';
mysql> flush privileges;

mysql> exit
Bye

NTPの設定

時刻がずれているといろいろ問題が出るのでNTPで時刻を同期しておきます。

インストール
# yum install ntp

サービス起動
# service ntpd start
# chkconfig ntpd on

Zabbix をインストール

以下のように yum コマンドでインストールします。

# yum install -y zabbix zabbix-server zabbix-server-mysql

初期データインポート

DBに初期データを投入する必要があるので、以下のように初期データを投入します。

# cd /usr/share/doc/zabbix-server-mysql-3.0.13/
# gunzip create.sql.gz
# cat create.sql | mysql -uzabbix -p zabbix
(パスワードを聞かれるので`zabbixpassword`を入力)

Zabbixの起動設定

Zabbixサーバの設定ファイル/etc/zabbix/zabbix_server.conf を開いて以下のように記述します。

DBName=zabbix
DBUser=zabbix
DBPassword=zabbixpassword
DBSocket=/var/lib/mysql/mysql.sock

上記設定ファイルを保存したらサービスを起動します。

# service zabbix-server start
# chkconfig zabbix-server on

Webインターフェースのインストール

このままだとGUIによる操作ができないので、Webインターフェースをインストールします。
Webインターフェースを動かすにはCentOS6標準のyumリポジトリのPHPのバージョンは古いので、SCL有効化します。

# yum install -y centos-release-scl

SCLを有効化したらPHP5.5のインストール

# yum install -y php55-php php55-php-bcmath php55-php-gd php55-php-ldap php55-php-mbstring php55-php-xml php55-php-mysqlnd

SCLはインストールしただけでは有効化されないので、以下のようにログインシェルの起動時のスクリプトでPHP5.5を有効化します。

#!/bin/bash
source scl_source enable php55

上記内容を保存したら、一旦ログアウトし再度ログインしPHP 5.5系が有効になっていることを確認します。

php --version でバージョンが5.5.x系であることを確認

# php --version
PHP 5.5.21 (cli) (built: Aug 30 2016 13:51:02)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies

同様に、SCLからApacheをインストールします。

# yum install -y httpd24

とりあえず httpd を起動して確認

# service httpd24-httpd start

ブラウザから http://192.168.33.10/ にアクセスして welcom 画面が表示されることを確認。

ここまで完了したら、やっとZabbixのWebインターフェス及びその関連パッケージのインストールです。

# yum install -y zabbix-web zabbix-web-mysql zabbix-web-japanese

zabbix-web の設定ファイルを Apache に適用するため httpd/conf.d の下にコピー

# cp /usr/share/doc/zabbix-web-3.0.13/httpd24-example.conf /opt/rh/httpd24/root/etc/httpd/conf.d/zabbix.conf

コピーした後以下のようにtimezoneを編集しておきます。

php_value date.timezone Asia/Tokyo

ファイルの編集が完了したら Apache 再起動

# service httpd24-httpd restart
# chkconfig httpd24-httpd on

再度、ブラウザからhttp://192.168.33.10/zabbix/ にアクセスして「Welcome to Zabbix 3.x」の画面が表示されることを確認。

Zabbixの初期セットアップ

ここからは Web 画面に従って Zabbix の初期セットアップを進めます。
スクショを貼ると大量になるので、入力/選択項目のみ記載しておきます。

  • Welcome
    • [Next step]
  • Check of pre-requisites
    • すべて OK であることを確認
  • Configure DB connection
    • Database type : MySQL
    • Database host : localhost
    • Database port : 0 (default port)
    • Database name : zabbix
    • User : zabbix
    • password : zabbixpassword
  • Zabbix server details
    • Host : localhost
    • Port : 10051
    • Name : (空)
  • Pre-installation summary
    • 内容を確認して[Next step]をクリック
  • Install
    • Configuration file "/etc/zabbix/web/zabbix.conf.php" created. と表示されているのを確認

これで Zabbix の初期セットアップ完了です。

Zabbixへのログイン

デフォルトで作成される管理者は以下の通りです

  • ユーザ: Admin
  • パスワード: zabbix

上記でログインできたら、Zabbix Server のセットアップ完了です。

Zabbixエージェント(zabbix_agentd)のインストール

今回はZabbixサーバ自身を監視対象とするため、Zabbixサーバを構築した環境にZabbixエージェントも導入します。

# yum install -y zabbix zabbix-agent

yum パッケージのインストール完了後、/etc/zabbix/zabbix_agentd.conf の確認(デフォルトで以下の状態となっているはず)

# ZabbixサーバのIPアドレス
Server=127.0.0.1
# エージェントをインストールしたホスト名とIP
Hostname=Zabbix server
ServerActive=127.0.0.1

エージェントの起動と自動起動の設定もしておきます。

# service zabbix-agent start
# chkconfig zabbix-agent on

エージェントの設定は以上です。

動作確認

これで、Zabbix によって自身のサーバの情報が収集されているはずですので、実際にそれを確かめてみます。

以下のスクショではUIが日本語化されていますが、Zabbixをインストール直後は英語の状態です。
UIを日本語化するには、ユーザプロファイル(画面右上の人のアイコン)から言語を選択することで変更可能です。

まず、ZabbixサーバのWebUIにログインし、画面上部のメニューから[設定]-[ホスト]を選択しします。そうするとホスト一覧が表示されるので、一覧から “Zabbix Server” の先頭のチェックを付け一覧の下の[有効]ボタンをクリックします。

enter image description here

これで Zabbix Server 自身が監視対象となりました。監視によって取得された情報を参照するには、上部のメニューから[監視データ]-[概要]を選択。

enter image description here

さらに、画面右上の[タイプ]のドロップダウンリストから”データ”を選択します。

enter image description here

その結果、以下のように Zabbix Server に組み込んだ Agent が収集した情報が画面に表示されます。

enter image description here

実際に運用する場合は、この後導入されたミドルウエアに応じた監視設定などを組み込む必要がありますが、この記事ではここまでにしておきます。
詳しくは書籍やWebサイト等を参考に設定してみて下さい。

参考

この記事を書くにあたって以下の書籍及びWebサイトの情報が参考になりました。

Liferay TIPS

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

LiferayのTIPS(小技)を3つご紹介します。

前提

Liferay 6.2 CE GA2のTIPSとなります。

ログレベル変更

Liferay全体のログレベルを変更するには、portal-log4j-ext.xmlを作成して配置する必要があります。

まず、以下のディレクトリを作成します。
{LIFERAY_HOME}/tomcat-7.XXXXX/lib/ext/META-INF

次にそのディレクトリに以下のファイルを作成します。

portal-log4j-ext.xml

<?xml version="1.0"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <category name="com.liferay.portal">
        <priority value="ERROR" />
    </category>

    <category name="my.portlet.soccer">
        <priority value="DEBUG" />
    </category>

</log4j:configuration>

com.liferay.portal の priority の値を変更することで、ログレベルを変更することができます。
Tomcatを再起動すれば反映されます。

Forward does not existエラー

IPアドレスでLiferayにアクセスしている場合、 Forward does not exist というエラーが発生する場合があります。
これは、対象のIPアドレスへのリダイレクトが許可されていないためです。
設定ファイルに許可するIPアドレスを追加します。

{LIFERAY_HOME}/portal-setup-wizard.properties

redirect.url.security.mode=ip
redirect.url.domains.allowed=
redirect.url.ips.allowed=127.0.0.1,[許可したいIPアドレス]

Tomcatを再起動すれば反映されます。

データ移行

Liferayにアップした画像やドキュメントはデフォルトではサーバ上の {LIFERAY_HOME}/data/document_library に保存されます。
サーバを冗長化するなどして、クラスタリング構成を組む場合、このデータをDBに移行することができます。
この機能はLiferayの管理画面から使用できます。
※事前にLiferayのストアタイプをDBStoreに変更しておいてください。設定されているDBに対してデータが移行されます。

ブラウザでLiferayにログイン→システム管理→コントロールパネル→サーバ管理→データ移行→
 新しいリポジトリフックを選択してください。
 dl.store.impl:com.liferay.portlet.documentlibrary.store.DBStore
 [実行]

実行後、自動で再起動されます。

最近人気な記事