Observiumをインストールしてみた~その2

タグ: , | 投稿日: 投稿者:

さて、Observiumのインストールの続きです。まあ、見事にはまってしまい解決まで時間が掛かってしまいました。問題となった部分は後で説明するとしてインストール手順を引き続き説明します。

前回は、SELinuxを無効にしたところまででした。既に、ディレクトリは、/opt/observiumになっていると思います。そのディレクトリ内にconfig.php.defaultというファイルがあるので、そのファイルをコピーして、同じディレクトリ内にconfig.phpというファイルを作ります。

cp config.php.default config.php

ファイルを作成したら、そのファイル(config.php)を編集します。

編集するのは、MySQLの情報、config.phpでは、下記のように記載されています。

// Database config ---  This MUST be configured
$config['db_host'] = 'localhost';
$config['db_user'] = 'USERNAME';
$config['db_pass'] = 'PASSWORD';
$config['db_name'] = 'observium';

MySQLに接続できるよう、host, user, passの情報を書き込みます。その後、fpingの情報を追記します。これは、fpingが/usr/sbin/にインストールされている場合のものです。

$config['fping'] = "/usr/sbin/fping";

これらが終わったら、下記を実行します。

php includes/update/update.php

多少のエラーは問題ないとのことです。(SQL revisionでのエラーが006まで)

次に、logとrrdのディレクトリを作成し、所有者を変更します。

mkdir logs
chown apache:apache logs
mkdir rrd
chown apache:apache rrd

そして、Observiumでのユーザを追加します。

./adduser.php 「ユーザ名」 「パスワード」 「レベル」

管理者権限を持たせる場合、レベルは10です。

下記で機器を追加します。

./add_device.php 「ホスト名」 「コミュニティ」 v2c

要はsnmpの情報を書き込めばOKです。

下記を行い、追加した機器の情報を取得します。

./discovery.php -h all
./poller.php -h all

/etc/cron.d/observiumというファイルを作成し、cronを設定します。ユーザ名が入っているため、/etc/crontabもしくは/etc/cron.d/でないとちゃんと動きません。

33  */6   * * *   root    /opt/observium/discovery.php -h all >> /dev/null 2>&1
*/5 *      * * *   root    /opt/observium/discovery.php -h new >> /dev/null 2>&1
*/5 *      * * *   root    /opt/observium/poller-wrapper.py 2 >> /dev/null 2>&1

 

さて、ここまでくれば、残すはhttpdの設定のみです。ここではまりました。Observiumのインストール手順には、稼働しているドメインがObserviumのみであれば、これでOKという形で設定が載せてあります。

<VirtualHost *:80>
DocumentRoot /opt/observium/html/
ServerName  observium.domain.com
CustomLog /opt/observium/logs/access_log combined
ErrorLog /opt/observium/logs/error_log
<Directory "/opt/observium/html/">
AllowOverride All
Options FollowSymLinks MultiViews
</Directory>
</VirtualHost>

しかし、うまくいきませんでした。アクセス権限が問題だったのですが、apacheの設定がバージョンによって異なっていたのではまりました。はい、apacheの2.4系が入っているサーバでインストールしていました。2.4系だとRequire all grantedが必要です。それ以前だとOrder Allow, Deny Allow from allの2文が必要になってきます。インストールに失敗したと思って何度も試してしまいました。テストだからといって、2.2系→2.4系に急に変えるもんじゃありませんね。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

Analytics APIとRaspberry Piでサイトのアクセス状況を可視化するテスト

タグ: , | 投稿日: 投稿者:

こんにちは、ニタです。

最近私のMacBookProでは、GoogleAnalyticsのリアルタイムのアクティブユーザー数を常に表示させ、Webサイトのアクセス状況をすぐ確認できるようにしています。

このアクセス状況を、モニタ上だけではなく他の方法で可視化できないか現在検討しています。
そこで今回は、手頃なRaspberry Piを使ってテストモデルを作ってみました。

※記事内のRaspberry PiはRaspbianをインストール済みの「Raspberry Pi 2 Model B」を使用しています。

LチキじゃないですLチカです

Lチキは某コンビニのチキンです。ファ◯マの方が私は好きです。
今回初めてRaspberry Piを触るので、手始めとして電子工作系の「Hello World」、Lチカをやってみます。
「Lチカ」とは、「LEDをチカチカ点灯させる」ことの略称です。「Raspberry Pi Lチカ」とか「Arduino Lチカ」で検索すると、世界中の方々のLEDをチカチカさせた記事が出てきますのでそちらを参考に組み込みます。

img_nita_lchika010
img_nita_lchika011

PHPでGPIOを操作する

今回はPHPからGPIO(汎用入出力)の操作、AnalyticsAPIの利用を行うので、Raspbianにphpをインストールします。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install php5

PHPによるGPIOの操作には、php-gpioを使用します。
composerからのインストールが推奨されているので、素直にそうします。

wget http://getcomposer.org/composer.phar
php composer.phar create-project --stability='dev' ronanguilloux/php-gpio l-chika

l-chikaというディレクトリにphp-gpioのパッケージがインストールされたので、GPIO操作のコードを書きます。

cd l-chika
vim test.php 


<?php 
require 'vendor/autoload.php';

use PhpGpio\Gpio;

// GPIOの5番を使用
$pin = 5;
$gpio = new GPIO();
$gpio->setup($pin, "out");

// GPIO5番に繋いだLEDを10回点灯させる
for($i = 0; $i < 10; $i++){
    $gpio->output($pin, 1);
    sleep(2);

    $gpio->output($pin, 0);
    sleep(1);
}
$gpio->unexportAll();

こちらをsudo php test.phpと言った感じで実行すると、LEDが点滅します。
GPIOのピン番号を指定し、$gpio->output()で制御する感じですね。

img_nita_lchika012

Analytics APIの設定

さて、続いてはAnalyticsのアクティブユーザー数を取得するコードを書いていきます。
アクティブユーザー数を取得するためには、Google Analytics APIを使用します。

プロジェクトの作成

Google Developers Consoleにて、プロジェクトを作成します。

img_nita_lchika001
img_nita_lchika002

作成したプロジェクトで利用できるAPIに「Analytics API」を追加します。

「APIと認証」→「API」と進み、Analytics APIを選択し、有効にします。

img_nita_lchika003
img_nita_lchika004

API有効化後、「APIと認証」→「認証情報」に移動しクライアントIDから認証情報を作成します。
この認証情報を使用してAPIを利用できるようになります。

img_nita_lchika005

クライアントIDを作成すると、次のウィンドウが表示されるので、「サービスアカウント」を選択します。

img_nita_lchika006

認証情報画面が表示されると、.jsonファイルがダウンロードされますが、今回は使用しません。
今回は*.P12ファイルをしようするので、.P12ファイルをダウンロードします。
また、認証情報画面の「クライアントID」「メールアドレス」は今後使用するので、控えておいてください。

img_nita_lchika007

Google Analyticsにユーザーを追加

アクティブユーザー数を確認したいサイトのGoogle Analyticsの設定画面で、APIがAnalyticsビューを利用できるよう、権限を与えます。

img_nita_lchika008

また、AnalyticsのビューIDを控えておきます。

img_nita_lchika009

Google API Clientのライブラリをインストール

PHPからAPIを利用するよう、クライアントライブラリをインストールします。
ComposerかGitHubからインストールできます。
今回はComposerからインストールします。

参考:API Client Library for PHP

php-gpioで作成したcomposer.jsonにAPI Clientのパッケージを追記します。

# composer.jsonに以下を追記。

"require": {
  "google/apiclient": "1.0.*@beta"
}

# 追記後、composerを更新
php composer.phar install
php composer.phar update

AnalyticsAPIからのリクエスト結果をLチカへ

Google Client APIのパッケージがインストールされたので、アクティブユーザー数を取得し、ユーザー数分Lチカさせるプログラムを作成します。

<?php
set_include_path("./vendor/google/apiclient/src/" . PATH_SEPARATOR . get_include_path());
 
require_once 'Google/Client.php';
require_once 'Google/Service/Analytics.php';
require 'vendor/autoload.php';

use PhpGpio\Gpio;
    
// サービスアカウント名(メールアドレス)
$service_account_name = 'YOUR_MAIL_ADDRESS@developer.gserviceaccount.com';
// P12キーファイルのパス
$key_file_location = './YOUR_KEY_FILE.p12';
// アナリティクスのビューID
$analytics_view_id = 'ga:1234567';
 
session_start();
 
if ( !strlen($service_account_name)
    || !strlen($key_file_location)) {
  echo missingServiceAccountDetailsWarning();
}
 
$client = new Google_Client();
 
if (isset($_SESSION['service_token'])) {
  $client->setAccessToken($_SESSION['service_token']);
}
 
$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
    $service_account_name,
    array('https://www.googleapis.com/auth/analytics'),
    $key
);
$client->setAssertionCredentials($cred);
 
if($client->getAuth()->isAccessTokenExpired()) {
  $client->getAuth()->refreshTokenWithAssertion($cred);
}
 
$_SESSION['service_token'] = $client->getAccessToken();
 
// アナリティクスクライアントを生成
$analytics = new Google_Service_Analytics($client);
 
try {
    // リアルタイムデータを取得する
    $results = $analytics->data_realtime->get(
            $analytics_view_id,
            'rt:activeUsers'
    );
 
    // 取得結果からリアルタイムアクティブユーザ数を取り出す
    $totals = $results->getTotalsForAllResults();
    $res = $totals["rt:activeUsers"];
    
    if($res == 0){
    echo "no active user.".PHP_EOL;
        exit;
    }
    
    
    // アクティブユーザー数分Lチカする。    
    $pin = 5;
    $gpio = new GPIO();
    $gpio->setup($pin, "out");
    
for($i = 0; $i < $res; $i++){
    $gpio->output($pin, 1);
    sleep(2);

    $gpio->output($pin, 0);
    sleep(1);
}
$gpio->unexportAll();
     
} catch (apiServiceException $e) {
    echo $e->getMessage();
}

このプログラムをcronで定期実行させると良いでしょう。
このAnalytics APIは、無料枠でのリクエスト上限が50,000リクエスト/日になっているので、1サイトのみであれば、5分間隔での実行でも十分かと思います。

今後の予定

今回はプロトタイプとしてLチカさせるだけになりましたが、
今後は、これを基に何かモノを動かしたりして、アクセス状況を分かりやすくしていきたいと思います。
それでは、また。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

PowerConnect6224でのルーティング設定

タグ: , , | 投稿日: 投稿者:

こんにちは、hijikataです。

今回はPowerConnect6224でのルーティング設定について躓いたので忘れないよう書いていきます。

以下の図にてパソコンBはインターネットへ通信出来ればOKのように設定します。

<インターネット>⇔<ルータ>⇔<VLAN1>⇔<VLAN10>⇔<パソコンB>

※PowerConnect6224にVLAN1とVLAN10を設定します。

※パソコンBはVLAN10をデフォルトゲートウェイにします。

※なお、PowerConnectの設定についてはWEBブラウザ上で設定していきます。

まずはswitching→VLANmenbershipを開きVLAN10を作成します。

次にVLAN1は初期設定のままですとマネージメントVLANにされており

マネージメントVLANですとルーティングできないためマネージメントVLANを別のVLANに変更します。

system→IP addressing→management interface

適当なIPと適当なVLANに値を変更します。

次にデフォルトルートを指定します。

Routing→router→routing entry configuration

Addrouteをクリックした後、Route TypeをDefaultに指定しnext hop addressについてはルータのローカルIPアドレスを入力してください。

最後にrouting機能を有効にします。

Routing→IP→configuration

Routing ModeをEnableにすれば設定完了です。

マネージメントVLANに設定されているVLANはルーティング出来ないと気づくまでが長かったですね。

 

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

開封

Raspberry Pi 2 Model B OSインストールまで

タグ: | 投稿日: 投稿者:

こんにちは5月病にならなくてホっとしているモリです。

 

ラズベリーパイを手に入れる機会があったので紹介します。

 

私はラズベリーパイ自体知らなかったので、ちょうどいい!って感じでとりあえず開封してインストールしてみました。

開封

まぁ、最近流行っているので、何が出来るかはグーグル先生に聞くと面白そうな記事が山ほど出てくるので割愛!

私の環境はWindows環境なので今回紹介する内容はWindows向けです。

 

まずは、用意するもの。。。

1.ラズベリーパイ本体

2.MicroSDカード

  4GB以上を用意しましょう。

3.給電用USBケーブル

  本体側はMicroUSBの「micro-b」なので、スマフォを利用されているなら流用できます。

4.電源

  電源はスマフォ用USBアダプタや本体入力側がMicroUSBであればOKです。

  ちなみに給電は0.9Aで4.5W~5Wで動作させることが推奨されています。

  上限は5Vの電圧で1.5A~2Aとあるので、電源効率や周辺機器接続の損失を考慮して1.2A程度の供給で動かすのが無難な気がします。

5.OSイメージファイル

 OSのイメージファイルは公式サイトで提供されているので、こちらからダウンロードして下さい。

 OSはUBUNTUやRASPBIAN等、複数提供されています。

 お好みのOSを選んで下さい。

tmp1

 今回私が使用したのは「RASPBIAN」を使用しました。

6.MicroSDカードへのcopyツール

 ラズベリーパイはMicroSDカードにOSをインストールして動作させる為、SDカードにOSをインストールする必要があります。

 今回私が使用したのは「DD for Windows」を使用しました。

 ダウンロードはこちらから。。。

 他にもツールがあるので、こちらは好みで用意して下さい。

 

ここから『Raspbian』のインストール。。。

ZIPをダウンロードして解凍すると『yyyy-mm-dd-raspbian-wheezy.img』が展開されます。

展開されたイメージファイルをSDカードにインストールします。

「6.MicroSDカードへのcopyツール」で紹介したツールを起動しましょう。

注意)管理者権限で起動する事!

tmp2

 

こちらがツールの画面になります。

tmp3

1.copy先のディスクを選択する

 「ディスク選択」ボタンでディスクを選択します。

 SDカードが正常に認識している事を確認の上、選択をして下さい。

2.インストールするOSイメージファイルを選択する

 ダウンロードし展開した『yyyy-mm-dd-raspbian-wheezy.img』を選択して下さい。

3.ディスクに対してインストールする

 「<<書込<<」ボタンでインストールが開始します。

 この際に、「ディスクサイズ」や「書込み」の確認ダイアログが表示されますが「OK」で問題ありません。

 

これで、インストールは完了です。

お好みのカスタマイズを楽しんでください!でわでわ。。。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

SAR(PAR) DAR ってなんですか?

タグ: , , , | 投稿日: 投稿者:

久々のいかおです

ffmpeg を使っているとぶち当たります(いや、それ以外でも)

私はいつも、えっと、なんだっけ?ってなるので書いておきたいと思いました

sar(par)が1:1の場合は良いのです。ここが妙ちくりんなことになってくると登場人物が不要に痩せたり太ったりします。

SARがSample Aspect Ratioで、PARがPixel Aspect Ratioです

DARはDisplay Aspect Ratio・・・・・

「そんなこたぁ聞いてねぇんだよ」

と言われそう。ここぢゃないんです

ちなみに、SARとPARは同じことです。

で、いっつも悩ましいのは

SARに変な値が入っているとDARもパルプンテ(実は違います)なんですね。だからスッキリするために

計算式をメモるわけです。

SARはpixelの形を表します。ピクセルの横幅と縦幅の比です

DARは出来上がった画像の縦横比になります。

だから、元々のピクセル解像度にそれぞれSARの比率をかけるとDARになるってことです。つまり

元のpixel解像度が

720×480

で、SARが8:9なら

720 x 8 : 480 x 9 = 4 : 3

で、DARが 4:3 となる訳です

じゃあね、

720 x 540 の画像を 16:9 で出したい場合SARはどうなるんですか?

こうするんですよ(私もそのまま覚えこむことにしました)

元画像の高さ x 出したい横幅 : 元画像の幅 x 出したい縦幅比

540 x 16 : 720 x 9 = 8640 : 6480 =  4 : 3 (SARね)

・・・おおおお

720 x 480(ntsc)を16:9で

480 x 16 : 720 x 9 = 32 : 27

おお・・・なんだか呪文っぽくなってきたぞ

そうそう、パルプンテだったやつは

pixelが720×480でSARが 40:33 でDARが 20:11ですってよ!

そうか、そうかDARにするためのSARだから

480 x 20 : 720 x 11 = 40:33

ああ、そういうことだったのか。

私はこの理解に苦しんだんだけど、同じつまづきした人っていないの?

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

便利なtreeコマンド

タグ: , | 投稿日: 投稿者:

どうもshiraneです。
すっかり忘れていましたが、久しぶりに使ったら便利だったので
今回は、treeコマンドについてご紹介します。

treeコマンドはwindowsのコマンドプロンプトで動作してカレントディレクトリ以下の
フォルダのツリー構造を簡単にテキストで表示・出力してくれるコマンドです。
資料としてフォルダ構造のツリーをテキストで用意したい時など便利です。

4

 
 
 
 ☜は、Cドライブからtreeコマンドを実行した例です。

使い方は簡単でツリー構造を表示させたいフォルダをカレントディレクトリにしてtreeコマンドを
打つかフォルダのパスを指定してtreeコマンドを打つ方法があります。

	 tree /?
	 ドライブやパスのフォルダ構造を図式表示します。

	 TREE [ドライブ:][パス] [/F] [/A]

      /F   各フォルダのファイル名を表示します。
      /A   拡張文字ではなく、ASCII 文字で表示します。

Cドライブにあるtestというフォルダのツリーを表示する場合、下記のようなコマンドとなります。
tree C:¥test 

2 ☜:オプション「/F」を付ける事でtestフォルダ内のファイルも一覧に
 表示されます。
 tree C:¥test /F 

 

2 :オプション「/A」を付ける事で2バイト文字を使わずアスキー文字だけで
 ツリーを表示してくれます。
 tree C:¥test /F /A

 

また、下記のようにすれば簡単にツリーをテキストに出力してC-tree.txtファイルに
保存してくれます。(txtファイルの名前は任意です。)
tree C:¥test /F /A > C-tree.txt

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

ajaxのキャッシュ

タグ: , | 投稿日: 投稿者:

こんにちは。kikuです。
先日ajaxでの通信で、期待通りの値が取れなくて困ったことがありました。
無事解決したので、備忘録として書き残したいと思います。

jQueryのajaxを使ってアクセスした場合、2回目以降のリクエストが実際には発行されずにキャッシュされた値が使われてしまう場合があります。
そんな時は cache に false を設定します。
※これはHEADとGETリクエスト時のみ正常動作します

$.ajax({
    url : "http://dev.blog.fairway.ne.jp",
    cache : false,
    data : {
        hoge : "fuga"
    }
}).done(function(success){
    console.log(success);
});

cacheはリクエストURLに “_={timestamp}” をGETパラメーターで追加しています。
上記では http://dev.blog.fairway.ne.jp?hoge=fuga&_=1253863496678  のようになってリクエストを投げます。

で、今回プチハマリしたのはPOST時です。
上で「HEADとGET時にしか正常動作する」という点を見逃していて、POST時に頑張ってcacheの設定をしていたので期待通りの動きをしなかったようです。

POST時にキャッシュされた値が使われてしまっていた場合は、XMLHttpRequest.setRequestHeader を使ってリクエストヘッダで If-Modified-Since を設定することによりキャッシュされた値が使用されなくなります。
ただXMLHttpRequest.setRequestHeader は XMLHttpRequest.open の後にしなければエラーになってしまいますので beforeSend でコールバック関数を指定します。

$.ajax({
    type : "POST",
    url : "http://dev.blog.fairway.ne.jp",
    beforeSend : function(xhr){
        xhr.setRequestHeader("If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT");
    },
    data : {
        hoge : "fuga"
    }
}).done(function(success){
    console.log(success);
});

このように設定することで、リクエストをキャッシュさせずに発行することができました。

うまく動かなかった時にキャッシュが原因と判断するまで結構時間がかかってしまわないように、キャッシュのことを頭の隅に置いておきたいところです。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

ovserviumをインストールしてみた

タグ: , | 投稿日: 投稿者:

Wordの変更履歴について書こうと思っていましたが、題名の通り、ovserviumという監視ソフトのインストールについて書きます。

どんな使い心地なのだろうという興味本位ですので実用性は薄いとは思いますのでご容赦ください。

さて、このインストールですが、アシストしてくれるOSは、UbuntuとDebianのみだそうです。RHELやCentOSはインストール手順が公開されていますが、「できなくても手助けできないよ」というスタンスなんです。勉強がてらCentOSでインストールしていきます。

まず、定番レポジトリの追加が必要になります。レポジトリの追加の手順はここでは省きます。
また注意としてel4やel5はサポートされていないらしいので、CentOS6以上を使用しましょう。

  • rpmforge
  • epel

次にyumでパッケージをインストールしていきます。提供されているコマンドラインが下記です。

yum install wget httpd php php-mysql php-gd php-posix php-mcrypt php-pear php-pear.noarch \
vixie-cron net-snmp net-snmp-utils fping mysql-server mysql MySQL-python rrdtool subversion \
jwhois ipmitool graphviz ImageMagick

たくさんのパッケージを一緒にインストールしてますね。パッケージを判断して一つづつインストールしても良いかもしれません。

ここまでがインストールの下準備です。次は、observiumのインストールディレクトリに移動してインストールを開始します。

cd /opt

次にソフトのダウンロード。

wget http://www.observium.org/observium-community-latest.tar.gz

解凍

tar zxvf observium-community-latest.tar.gz

これから設定です。そのために、まずフォルダの移動。

cd observium

MySQLを起動させたら、

service mysqld start

MySQLに入り、observiumのデータベースを作ります。(パスワードを設定している場合は、それに対応したやり方をしてください)

mysql -u root 
mysql> CREATE DATABASE observium DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> GRANT ALL PRIVILEGES ON observium.* TO 'observium'@'localhost'
   -> IDENTIFIED BY '「任意のパスワード」';

次に、SELinuxを無効化しますが、これも省略します。

今回はここまで。
スムーズに設定できれば良いなと思っていますが、問題がでてくるのはデフォルトなのであまり期待しないようにしています(苦笑)

ではまた。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

WordPressでajaxを使う

タグ: , , | 投稿日: 投稿者:

こんにちは、ニタです。

早速ですが、WordPressのプラグインを更新しました!

アイキャッチ画像と更新日を予約更新対象に追加しました!
iframeタグが消えたり、brタグなどに追記したstyle定義も消えないようにしました!
予約更新内容でのプレビュー機能はもう少し先になりそうです!

どうぞよろしくお願いします!
See you again next time, Enjoy WordPress Life!!

と、

これでおしまいとは、いきませんよねぇ…。
では、改めて。

WordPressでもajaxをカンタンに使いたい

WordPressのテーマやプラグインを開発していると、投稿データや外部からのデータをスムーズに取得したい時があります。なるべくスマートに。ajaxとかで。
例えば、投稿一覧ページをページングからajax読み込みによる無限スクロールにしてみたり、プラグインで下のような読み込み機能に使ってみたり…

多少コツが要ります

しかし、WordPressのフロント側のルーティングはすべてコンテンツページとして表示されるので、ajax用のJSONを返すページ(エンドポイント)を作り、そこへPOSTかGETでアクセスさせればajax通信できるわけではありません。
ですが、WordPressの管理画面はajaxをバッキバキにキメていて、そのための機能が用意されておりますので、そちらを使ってajax通信を行います。

基本的な実装の流れはこんな感じです。

  1. wp_ajax_ホニャララというアクションフックを追加し、そのアクションフックに関数を登録。
  2. POSTかGETでのリクエストを受け取って、求めているデータをJSON形式で返却する関数(アクションフックに登録する関数)を作成。
  3. データ取得用のJavaScriptの作成。

実際に作ってみよう

では、先ほどの流れを基に何かしら作ってみます。
前述の図にあった、URLからサイト情報を取得するajaxを実装してみます。
また、ここで使うプラグイン接頭辞はwpmra_とします。

1. アクションフックの追加

ここで追加するアクションフックは、後述するエンドポイントにフックさせることでアクションフックに登録した関数を呼び出すようになっています。
そのため、アクションフックの名前はwp_ajaxと自分で決めたアクション名を繋げたものになります。
wp_ajax_ホニャララホニャララの部分を決めて追加します。
プラグイン接頭辞を含め、以下の様なアクション名と関数名にしました。

add_action('wp_ajax_wpmra_fetch_site_info', 'wpmra_fetch_site_info');

また、フロント側で使いたい場合、WordPressへ未ログインのユーザー向けにwp_ajax_nopriv_ホニャララというフックが用意されているので、そちらを使用します。
ですが、こちらは未ログインユーザー向けのみのものらしく、これだけをアクションフックに追加すると今度はログインユーザーには有効にならないという謎仕様になっております。
ですので、同じ関数を呼び出すアクションフックを2つ追加します。

add_action('wp_ajax_wpmra_fetch_site_info', 'wpmra_fetch_site_info');
add_action('wp_ajax_nopriv_wpmra_fetch_site_info', 'wpmra_fetch_site_info');

2. 登録した関数の作成(JSON返却用)

1.で追加したアクションフックで呼び出している関数wpmra_fetch_site_infoを作成します。

function wpmra_fetch_site_info() {
    $res = array(
        'status' => 'NG',
    );
    if(isset($_POST['post_title'])) {
    // POSTで送信されたURLからRSS情報を取得する
        $rss = get_wpmra_fetch_feed($_POST['post_title']);
        // サイトタイトル、URLを配列へ
        if($rss) {
            $res['status'] = 'OK';
            $res['data'] = array(
                'title' => $rss->get_title(),
                'url' => $rss->get_permalink(),
            );
        }
    }
    // 配列をJSON形式で出力
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode($res);
    exit();
}

// $urlからRSSのFeedデータを取得
function get_wpmra_fetch_feed($url){
    include_once ABSPATH . WPINC . "/feed.php";
    
    $rss = fetch_feed($url);
    if(!is_wp_error($rss)){
        return $rss;
    }
}

簡単に解説しますと、WordPressのwp-includes/feed.phpを使用してRSSのURLからFeed情報を取得し、その中からサイトタイトルとサイトURLをJSON形式で出力しています。
出力後は必ずexit()die()を使って終了させます。

アクションと関数は出来ましたが、JavaScriptでJSONデータを取得するためのURLを知らないといけません。
wp_ajax_のエンドポイントは、サイトURL/wp-admin/admin-ajax.phpになります。
フックに追加した関数を呼び出すには、リクエスト内のactionパラメータにwp_ajax_より後ろに記載した文字列を指定する必要があります。(今回の場合はwpmra_fetch_site_info

3. データ取得するJavaScriptの作成

custom.jsというファイルを作成し、読み込みます。

add_action('admin_enqueue_scripts', 'enqueue_wpmra_script');
function enqueue_wpmra_script(){
    wp_enqueue_script('wpmra_js', '/path/to/custom.js', array('jquery'), '0.1');
}

このjsファイルにデータ取得する処理を書いていきますが、ここで一つ問題が。
先ほどwp_ajax_のエンドポイントはサイトURL/wp-admin/admin-ajax.phpだと説明しましたが、サイトURLは開発環境、テスト環境、本番環境で変わっていきます。
また、この処理をプラグインに実装するとなると、余計に変わります。
JavaScriptにサイトURLの判定処理を書くのも何なので、wp_localize_scriptという関数でPHPからjsに渡すようにします。

PHPファイルにscriptタグで直接書けば良いのでは?という意見もあると思いますが、横着せずPHPはphpファイルに、JavaScriptはjsファイルで管理するよう心がけましょう。

add_action('admin_enqueue_scripts', 'enqueue_wpmra_script');
function enqueue_wpmra_script(){
    wp_enqueue_script('wpmra_js', '/path/to/custom.js', array('jquery'), '0.1');
    wp_localize_script('wpmra_js', 'WPMRAJS', array('endpint' => admin_url('admin-ajax.php')));
}

wp_localize_scriptの第2引数の文字列がcustom.jsでのグローバルオブジェクトになります。
第3引数に渡している配列でWPMRAJSというグローバルオブジェクトに値がアサインされます。

これでJavaScriptを書ける準備が整いましたので、書いていきます。

jQuery(function(){
    // URL情報を取得するボタンを押したらサイト情報を設置する
    jQuery("#wpmra_fetch_site_info").on('click', function(){
            // 記事タイトルに入力されたRSS Feed
        var post_title = jQuery('input[name="post_title"]').val();
        jQuery.ajax({
            url : WPMRAJS.endpoint,
            type : "POST",
            // actionパラメータに、実行したいアクションの「wp_ajax_」より後ろの文字列を指定
            data : {action : 'wpmra_fetch_site_info', post_title : post_title },
            success : function(res){
                if(res.status === 'OK') {
                    jQuery('input[name="mra_rss_title"]').val(res.data.title);
                    jQuery('input[name="mra_rss_feed_url"]').val(res.data.url);
                }
                if(res.status === 'NG') {
                    alert("取得に失敗しました。");
                }
                return false;
            }
        });
    });
});
Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

HYPER-Vの起動について

タグ: , | 投稿日: 投稿者:

こんにちは、hijikataです。

今回はWindowsで使用されている仮想化システムHYPER-Vの起動について書いていきます。

HYPER-Vを使えるようにするまでが一番躓き、逆にその後の仮想サーバ構築等はすぐに分かりましたので忘れないために書いていきます。

※今回使用する筐体はDELL PowerEdgeR410(OS:WindowsServer2012 R2)になります。

物理サーバにOSをインストールし、HYPER-Vをインストールし、仮想サーバを建てて、仮想サーバにOSインストール→エラーで起動できず…..

色々と調べた結果物理サーバのBIOS設定で解決できる事が分かりましたので設定していくことに

物理サーバ起動後F2キーを押してBIOSへ移動し以下の項目を変更します。

・Virtualization Technology→有効にします。

・Execute Disable→有効にします。

・I/OAT DMA Engine→無効にします。

・SR-IOV Global Enable→有効にします。

※影響あるか分かりませんが念のためBIOSをアップデートしました。

変更した後、物理サーバOSを起動し、HYPER-Vを起動し、仮想サーバにOSインストールを実行→仮想サーバのOSインストール画面が表示されました。

仮想サーバのOSインストール作業よりHYPER-Vで仮想サーバにOSインストール出来る状態にするまでの方が5倍ぐらい時間掛かりました……

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook