環境:Windows Server 2008 R2 Server Core

Server Core に Hyper-V を インストール(役割の追加)

1.Hyper-V は「サーバーの役割」になりますので、「OCSETUP」コマンドでインストールできます。

コマンド例)

START /w OCSETUP Microsoft-Hyper-V

 

2.インストール完了後に再起動を求められます。再起動すればインストール完了です。

 

Windows7に管理ツールのインストール

1.Hyper-Vをリモートから管理できるようにします。今回は Windows 7 でリモート管理を行うため、「Windows 7 用のリモート サーバー管理ツール(RSAT)」をリモートで管理を行うWindows 7(クライアント)にインストールします。

Windows 7 用のリモート サーバー管理ツール
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=7d2f6ad7-656b-4313-a005-4e344e43997d

 

2.Hyper-Vマネージャーを有効にします。

2.1.「コントロール パネル」→「プログラムと機能」→「Windowsの機能と有効化又は無効化」と順にクリックし、
「Windowsの機能」を開きます。

0001

 

2.2.「リモートサーバー管理ツール」→「役割管理ツール」の中にある「Hyper-V ツール」を選択し、「OK」をクリックします。

 0002

 

これで、クライアントの「管理ツール」に「Hyper-V マネージャー」が追加されますので、Windows7から「Hyper-Vマネージャー」でリモートで管理することが可能になります。

 

0004

Hyper-V マネージャー

「Server Core で使いそうなコマンド」が紹介されていましたので、Server Core(Windows Server 2008 R2)の設定を行ったメモです。

元ネタ

http://www.gine.jp/blog/kusa/post/Server-Core-e381a6e4bdbfe38184e3819de38186e381aae382b3e3839ee383b3e38388.aspx

 

Server Coreでインストールした状態から、リモートデスクトップ、IPアドレスの設定(固定)、コンピュータ名の変更、ドメインへ参加、ライセンス認証までを行います。

 

リモートデスクトップ接続を有効にします(RDP6.0以降)。

コマンド例)

CSCRIPT %windir%\system32\scregedit.wsf /AR 0

 

ネットワークの設定を行います。

1.Network Interface の設定に必要なインターフェース名またはインデックスの確認をします。

コマンド例)

NETSH INTERFACE ipv4 SHOW INTERFACE

0001

 

2. IPアドレス(IPv4)の設定を行います。

IPアドレスの変更により、コマンド実行後にリモートデスクトップが切断されます。新しいIPアドレスで再接続をしてください。

コマンド例)

NETSH INTERFACE IPV4 SET ADDRESS NAME=3 SOURCE=static ADDRESS=192.168.0.10 MASK=255.255.255.0 GATEWAY=192.168.0.1

 

パラメータの説明

name - インターフェイス名またはインデックス
source - dhcp: DHCPを使用。static: 固定
address - 追加または変更する IPv4 アドレス
mask - IP サブネット マスク
gateway - デフォルト ゲートウェイ

※詳しくは、「netsh interface ipv4 set address /?」でご確認ください。

 

3.DNSの設定を行います。

コマンド例)

優先(プライマリ)

NETSH INTERFACE IPV4 SET DNSSERVERS NAME=3 SOURCE=static ADDRESS=192.168.0.2

代替(セカンダリ)

NETSH INTERFACE IPV4 ADD DNSSERVERS NAME=3 ADDRESS=192.168.0.3

 

コンピュータ名を変更します。

リモートデスクトップで、ローカルでコマンドを実行しているため、コンピュータ名を「localhost」としています。また、コマンド実行後に「続行しますか?(Y/N)」と確認がありますので、「Y」「Enter」とキーを押してください。

コマンド例)

NETDOM RENAMECOMPUTER localhost /NEWNAME:hogehoge

パラメータの説明

newname - コンピューターの新しい名前

※詳しくは、「netdom renamecomputer /?」でご確認ください。

0003

 

設定を有効にするために再起動する必要があります。

即時再起動コマンド例)

SHUTDOWN /R /T 0

※パラメータについては、「shutdown /?」でご確認ください。

 

コンピュータをドメインへ参加させます。

コマンド例)

NETDOM JOIN localhost /DOMAIN:domdom.local /USERD:administrator /PASSWORDD:passwword

パラメータの説明

/Domain - コンピューターの参加先のドメイン
/UserD - ドメインとの接続に使用するユーザー アカウント
/PasswordD - ユーザー アカウントのパスワード

※詳しくは、「netdom join」でご確認ください。

 

設定を有効にするために再起動する必要があります。

即時再起動コマンド例)

SHUTDOWN /R /T 0

※パラメータについては、「shutdown /?」でご確認ください。

 

マイクロソフト ライセンス認証 (プロダクト アクティベーション) を行います。

1.プロダクトキーを入力します。

コマンド例)

CSCRIPT c:\windows\system32\slmgr.vbs -IPK XXXXX-XXXXX-XXXXX-XXXXX-XXXXX

 

2.アクティベーションを実行します。

コマンド例)

CSCRIPT c:\windows\system32\slmgr.vbs -ATO

ブロックのカスタムテンプレートを作成することにより、インストールされているブロックのデザインなどを変更することができます。今回は、デフォルトでインストールされている「ページリスト」に、日付を追加したカスタムテンプレートを作成します。

早速、作成してみましょう。

1.ページリストブロックフォルダ(/Concrete/concrete/blocks/page_list)の直下に「templates」フォルダを作成します。

2.ページリストのルートにある「view.php」を「templates」フォルダにコピーし「release.php」と名前を変更します。

3.ページタイトルの前に日付を表示したいので、16行目あたりh3タグの中に、日付を取得し表示形式を整える下記のコードを追加します。

<?php echo date( 'Y/m/d',strtotime($cobj->getCollectionDatePublic())) ?>

4.UTF-8で保存します。

 

上記でカスタムテンプレートの準備が完了です。では、適用してみましょう。
※既にページリストが存在している事を前提にしています。

1.編集モードでカスタムテンプレートを使用するブロックをクリックし、カスタムテンプレートを選択します。

 0001a

 

2.カスタムテンプレートで「Release」を選択し、「更新」をクリックします。

0002

 

3.ページタイトルの前に日付が表示されれば成功です。

0003

 

ほとんど修正していませんが、カスタムテンプレートのソースです。

release.php

<?php 
	defined('C5_EXECUTE') or die(_("Access Denied."));
	$textHelper = Loader::helper("text"); 
	// now that we're in the specialized content file for this block type, 
	// we'll include this block type's class, and pass the block to it, and get
	// the content
	
	if (count($cArray) > 0) { ?>
	<div class="ccm-page-list">
	
	<?php 
	for ($i = 0; $i < count($cArray); $i++ ) {
		$cobj = $cArray[$i]; 
		$title = $cobj->getCollectionName(); ?>

	<h3 class="ccm-page-list-title"><?php echo date( 'Y/m/d',strtotime($cobj->getCollectionDatePublic())) ?> <a href="<?php echo $nh->getLinkToCollection($cobj)?>"><?php echo $title?></a></h3>
	<div class="ccm-page-list-description">
		<?php 
		if(!$controller->truncateSummaries){
			echo $cobj->getCollectionDescription();
		}else{
			echo $textHelper->shorten($cobj->getCollectionDescription(),$controller->truncateChars);
		}
		?>
	</div>
	
<?php   } 
	if(!$previewMode && $controller->rss) { 
			$btID = $b->getBlockTypeID();
			$bt = BlockType::getByID($btID);
			$uh = Loader::helper('concrete/urls');
			$rssUrl = $controller->getRssUrl($b);
			?>
			<div class="rssIcon">
				<a href="<?php echo $rssUrl?>" target="_blank"><img src="<?php echo $uh->getBlockTypeAssetsURL($bt, 'rss.png')?>" width="14" height="14" alt="rss" /></a>
				
			</div>
			<link href="<?php echo $rssUrl?>" rel="alternate" type="application/rss+xml" title="<?php echo $controller->rssTitle?>" />
		<?php  
	} 
	?>
</div>
<?php  } 
	
	if ($paginate && $num > 0 && is_object($pl)) {
		$pl->displayPaging();
	}
	
?>

iframeを使用して、ASP.NETでファイルのアップロードを画面遷移なしで行います。制限サイズを超えるようなファイルを送信しても、サーバーエラーを隠せるのでちょっと便利です。

 

今回は、下記の2ページを使用して処理を行います。

親ページ index.aspx アップロードるファイルを選択してもらうページ
子ページ fileupload.aspx ポストバックを受け取りファイルの保存処理を行うページ

 

処理の流れは下記のようになります。

  1. アップロードするファイルを選択するページ(親ページ・index.aspx)で、ポスト先にインラインフレームを指定し、ファイルアップロード処理ページ(子ページ・fileupload.aspx)をインラインフレームで実行します。また、表示されているステータスをJavaScriptで「送信中」に変更します。
  2. 親ページでJavaScriptを使用して定期的に 子ページの状況を監視します。
  3. 子ページの処理が完了(読み込まれる)と、ページのタイトル名がステータスに表示されます。

では、親ページと子ページの簡単な説明とソースを記載します。

親ページ

  1. インラインフレーム(iframe)を設置します。
  2. フォーム(form) の 送信先(target)、iframe を指定します。
  3. 「送信」ボタン(btnUpload)の ポスト先(PostBackUrl)に、ファイル保存処理がかかれているページ(fileupload.aspx)を指定します。
  4. iframe が見えるとかっこわるいので、style に position:absolute;left:-1000000px; を指定して隠します。

index.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="index.aspx.cs" Inherits="upload_index" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>アップロード</title>
    <script type="text/javascript">
        var timerId = null;

        function index_OnLoad() {
            timerId = setInterval(index_OnTimer, 1000);
        }

        function index_OnTimer() {
            var status = document.getElementById('status');
            var iframe = document.getElementById('iframe');
            var title = iframe.contentWindow.document.title;
            if (title != '') {
                status.innerHTML = title;
            }
        }

        function button1_OnClick() {
            var status = document.getElementById('status');
            status.innerHTML = '送信中';
        }
    </script>
</head>
<body onload="index_OnLoad()">
    <form id="form1" runat="server" enctype="multipart/form-data" method="post" target="iframe">
    <div>
        <p><asp:FileUpload ID="FileUpload1" runat="server" /></p>
        <p><asp:Button ID="btnUpload" runat="server" Text="送信" EnableViewState="false" PostBackUrl="fileupload.aspx" OnClientClick="button1_OnClick()" /></p>
        <p>ステータス:<span id="status"></span></p>

    </div>
 <iframe id="iframe" name="iframe" width="1" height="1" style="position:absolute;left:-1000000px;"></iframe>
    </form>
</body>
</html>

※index.aspx.cs は特に処理は必要ありません。

 

子ページ

  1. html(fileupload.aspx)部分は title に成功時のメッセージを設定します。
  2. コード(fileupload.aspx.cs)では、ポスティングの確認を行い、ポスト元ページである親ページの FileUpload コントロールを使用してファイルを保存します。

fileupload.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="fileupload.aspx.cs" Inherits="upload_fileupload" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>送信完了</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
    </form>
</body>
</html>

 

fileupload.aspx.cs

using System;
using System.Web.UI.WebControls;

public partial class upload_fileupload : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.PreviousPage != null)
        {
            if (Page.PreviousPage.IsCrossPagePostBack)
            {
                FileUpload FileUpload1 = (FileUpload)Page.PreviousPage.FindControl("FileUpload1");

                if (FileUpload1.HasFile)
                {
                    string fn = @"c:\temp\upload\" + FileUpload1.FileName;
                    FileUpload1.SaveAs(fn);
                }

            }
        }
    }
}

 

これだけで完成です。画面遷移がないので、Ajaxっぽく見えます。

 0001

前回、画像(JPEG)から位置情報を取得 しましたので、今回はWebサイトにアップロードした画像から位置情報を取得します。

 

1.フォーム(aspx)の作成

ファイル選択用の FileUpload コントロールと送信用の Button コントロールを1個づつ配置し、form の enctype に multipart/form-data を指定したaspxを作成します。

 

サンプルコード(fileupload.aspx)

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="getpos.aspx.cs" Inherits="gpsimage_getpos" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server" enctype="multipart/form-data" method="post">
    <div>
        <p><asp:FileUpload ID="FileUpload1" runat="server" /></p>
        <p><asp:Button ID="btnUpload" runat="server" Text="アップロード" EnableViewState="false" onclick="btnUpload_Click" /></p>
        <asp:TextBox ID="textBox1" runat="server" Columns="40" Rows="6" TextMode="MultiLine"></asp:TextBox>
    </div>
    </form>
</body>
</html>

 

2.プログラム(fileupload.aspx.cs)の作成

FileUpload コントロール の InputStream を使用して、Bitmap クラスを作成します。

protected void btnUpload_Click(object sender, EventArgs e)
{
	if (FileUpload1.HasFile)
	{
		HttpPostedFile postFile = Request.Files["FileUpload1"];

		if ((postFile.ContentType.Equals("image/jpeg", StringComparison.OrdinalIgnoreCase)) ||
			(postFile.ContentType.Equals("image/pjpeg", StringComparison.OrdinalIgnoreCase)))
		{
			System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(FileUpload1.PostedFile.InputStream);

			// --------------------------------------------------------
			// 緯度経度を取得する処理
			// --------------------------------------------------------

			// 保存する場合は、SaveAs を使用します。
			string fn = @"c:\temp\upload\" + FileUpload1.FileName;
			FileUpload1.SaveAs(fn);
		}
	}
}

※「緯度経度を取得する処理」の部分は、 画像(JPEG)から位置情報を取得 を参考にしてください。

 

こんな感じで取得できます。

page2