Quantcast
Channel: 蒼の王座・裏口
Viewing all 183 articles
Browse latest View live

SQLIOSimを使って、Fusion-ioDriveとFusion-ioDrive2のSQL Server IOシミュレート評価してみたよ

$
0
0

SQL Serverに同梱されているSQLIOSimを使用して、IOシミュレート評価をしてみようと思った。

SQLIOSimを使用するのは初めてなので、どきどき。

いろいろなサイトを参照してみたけど、いまいちわからなかったので、評価しにくい感じ。

SQLIOSimを実行すると、次の値が結果表示される。

 

項目理想的な数値概要
Target IO Duration (ms)- 
Running Average IO Duration (ms)小さいデータファイル:0-5msが素敵
ログ:0-2msが許容範囲
Number of times IO throttled小さいほど 
IO request blocks高い 
Reads高い 
Scatter Reads高い 
Writes高い 
Gather Writes高い 
Total IO Time (ms)- 

 

Fusion-ioDrive を2枚使用してRaid 0を組んだ場合

F:\sqliosim.mdx: InitialSize = 307200 MB, MaxSize = 127926272 MB, Increment = 1000 MB, LogFile = No, Shrinkable = No, Sparse = No

300GBのデータファイルがあって、最大サイズは1TB、自動拡張は1000MBで、データファイルとして使用する想定で設定。

実行した結果は、次のようになったでござる。

********** Final Summary for file F:\sqliosim.mdx **********
File Attributes: Compression = No, Encryption = No, Sparse = No
Target IO Duration (ms) = 100, Running Average IO Duration (ms) = 0, Number of times IO throttled = 0, IO request blocks = 248
Reads = 395930, Scatter Reads = 1495254, Writes = 13107, Gather Writes = 1630112, Total IO Time (ms) = 24226231

 

Fusion-ioDrive2 を2枚使用してRaid 0を組んだ場合

F:\sqliosim.mdx: InitialSize = 307200 MB, MaxSize = 1048576 MB, Increment = 1000 MB, LogFile = No, Shrinkable = No, Sparse = No

ほぼほぼ同じ想定に設定して、実行した結果は、次のようになったでござる。

********** Final Summary for file F:\sqliosim.mdx **********
File Attributes: Compression = No, Encryption = No, Sparse = No
Target IO Duration (ms) = 100, Running Average IO Duration (ms) = 0, Number of times IO throttled = 0, IO request blocks = 77
Reads = 403432, Scatter Reads = 1550115, Writes = 12495, Gather Writes = 1676542, Total IO Time (ms) = 18728739

 

結果検証

項目Fusion-ioDriveFusion-ioDrive2

変化率

Target IO Duration (ms)

100

100

 
Running Average IO Duration (ms)

0

0

 
Number of times IO throttled

0

0

 
IO request blocks

248

77

3倍
Reads

395930

403432

誤差?
Scatter Reads

1495254

1550115

誤差?
Writes

13107

12495

誤差?
Gather Writes

163011

1676542

誤差?
Total IO Time (ms)

24226231

18728739

77%に短縮

 

参照情報

Understanding SQLIOSIM Output


MS安納氏による「Windows Server 2012で運用管理をさらに自動化する」のまとめ(?)

$
0
0

マイクロソフトのエヴァンジェリスト安納さんによるWindows Server Cloud Day 2012でのセッション「Windows Server 2012で運用管理をさらに自動化する」の自分用メモです。メモメモ!!

 

Windows Server 2012でもLive Migrationができます。
クラスタ構成を構築したり、System Centerを使用したりしないといけないと思うかもしれません。
しかし、Windows Server 2012から変わりました。
VHDの配置場所を共有ディスク(\\testServer\vhd\test.vhd)に配置できるようになりました。

Hyper-Vマネージャから仮想マシンを選択し、右クリックから「移動」を選択すると、移動ウィザードが開きます。移動先として、仮想HDDなのか、仮想PCなのかを指定できます。
今回は、仮想HDDを共有ディスクに配置していますので、仮想PCだけを移動すれば良い。ダウンタイム無し(動画を再生しっぱなしで移動しても動画が止まることなく移動できる)で実現できます。

この移動を自動化するのに、powershellを使用してください。

Get-Commond –module Hyper-V

Hyper-V用の操作コマンドレットが提供されています。
従来は、SCVMMを購入しなければ使用できなかったコマンドレットですが、Windows Server 2012からは、SCVMM無しで使用できます。

仮想マシンを作成するのに、「New-VM」コマンドレットを使用できます。さらに、次のようなスクリプトを使用すると、仮想マシンをを並列処理でまとめて分散作成することができます。
これまでは、順番に作成していたので遅かったのが、並列処理ができるようになったので早くなりました。(引数で、仮想マシン名を受け取るようにして、ループ処理を並列実行すると良いです。)

workflow hogehoge([String ……])
{
     foreach –parallel(………)
     {
         NEW-VM –BootDevice CD
        <以下、略>
     }
}

仮想マシンの移動をするには、「Move-VM」コマンドレットを使用します。複数の仮想マシンをまとめて並列処理で実行するには、先ほどと同様にワークフローを登録し、「parallel」を使用すると並列処理できます。

スクリプトにsuspend機能が用意されました。長いスクリプトの途中で、条件分岐で不適合だったらsuspendします。後日、条件を満たしてから長いスクリプトを再実行するときにresumeしたら、前回の続きから再実行することができるようになりました。

処理の永続化(バックグラウンドジョブ化)することができます。

Workflow test{
     hogehoge
}

//ワークフローの実行時に、次のようにオプションを付加するとバックグラウンドジョブになります
test –asjob

//ジョブの実行記録を参照したい場合は、次のようにジョブを受信します。-
Receive-job job42

PowerShell Web Accessというツールがあります。ブラウザでアクセスし、接続先PC名、ユーザ名、パスワードを入力するとブラウザ上でPowerShellのコマンドレットを実行できる画面が表示されます。ターミナルサービスとは異なります。さらに、スマートフォンからアクセスして、スマートフォンからPowerShellを実行することもできます。

 

堅牢性を支えるテクノロジー

  • ライブマイグレーション
  • ライブストレージマイグレーション
  • 仮想ストレージ
  • NICチーミング
  • クラスタ対応更新
  • Windows Management Framework 3.0

物理マシンと仮想マシンの違い

物理マシンは、ComputeとStoregeが一体です。
仮想マシンは、ComputeとStorageが分離しています。
分離しているので、別のマシンへの移行が容易になりました。

ライブマイグレーション

仮想マシンの移動方法には、「仮想マシンを移動する」「仮想マシンの記憶域を移動する」が用意されています。
仮想マシンを移動するは、記憶域は移動させずComputeだけを移動できます。
仮想マシンの記憶域を移動するは、Computeは移動せずに記憶域だけを移動させることができます。

後からServer Coreに変更できるようになりました

従来、インストール時のみにしか選択できなかったServer Coreですが、Windows Server 2012では後からServer Coreに切り替えられるようになりました。
サーバーの役割から、グラフィックを削除してあげると不要なモジュールを減らせる縮小インストールができるようになりました。
IP設定などの設定完了後に、Server Coreに移行することができます。

NICのチーミングとSMB3.0マルチチャネル

  • NICチーミングをOS標準でサポート
  • SMB 3.0マルチチャネル with RSS
    • SMBスループット向上
    • 1セッションあたり最大4TCP/IP Connection

仮想ストレージ

複数の物理HDDを一つの記憶域プールとしてまとめることができます。

まとめた記憶域プールからストレージを新たに切り出すことができます。ストレージを切り出す際にSimple、Mirror、Parityを選択することができます。

Windows Management Framework 3.0

Windows Server 2012では、PowerShellを強化します。全処理をPowerShell実装します。その上にGUIを載せます。ですので、PowerShellでできることが、GUIでできないということもあります。

 

標準化されたアクセス:PowerShell

標準化されたプロトコル:WS-MAN(Web Service for Manager)

標準化されたオブジェクトモデル:CIMOM、SMI-S

 

  • ワークフローによるジョブの永続化
  • 堅牢なセッション管理
  • PSSちぇづぇdJobモジュールによるジョブスケジューリングへの対応

サーバーマネージャを使いましょう!

必要な設定はサーバーマネージャから実行できます。サーバーマネージャから必要な設定は基本的にすべてそろっています。例えば、次のような設定はすべてサーバーマネージャからできます。

  • コンピューター名
  • ドメイン
  • Windowsファイヤーウォール
  • リモート管理
  • NICチーミング
  • IP設定

ほかにも新しい機能が追加されました。

  • 仮想マシンの管理(オフラインVHDへの役割/機能展開)

モジュールとコマンドのインポート

サーバーにあるモジュールを一時的にローカルにモジュールをインポートすることができます。

Import-PSSessionコマンドレットを実行することで、リモートのサーバーのモジュールをローカルにインポートできるので、あたかもローカルPCにHyper-Vがインストールされているかのように処理をすることができます。

PowerShellワークフロー

結果の永続化をすることができます。
チェックポイントを使用することで、結果ストアに結果を保存することができ、途中で処理が飛んだ場合も結果ストアの結果から再開することができます。

PowerShellのエディタ

インテリセンスが使用できるようになりました。パラメーターも入力候補がインテリセンスで表示されるようになりました。
これまでは、Tabでの入力補完でした。

管理の可用性を高めるもの

  • 一括処理
  • リモーティング
  • 堅牢性

そして、仮想化とWindows PowerShellです。
System Center 2012が加わると、ありとあらゆるITサービスと有機的に連携できるようになります。

まとめ

PowerShellを覚えましょう。
PowerShellをやれば、間違いありません。
PowerShellが堅牢なシステムにつながります。
PowerShellです。

簡易メモリダンプ解析のメモ

$
0
0

インストールするもの

コマンド

!analyze -v;!thread;r;kv;lmnt;vertarget;.time
!errrec fffffa804ded5028

次のような結果を取得。
「VenId:DevId : 8086:340e」から「Intel 7500 Chipset PCIe Root Port
「Uncorrectable Error Status    : 00004000 ur ecrc mtlp rof uc ca CTO fcp ptlp sd dlp und」から「CompletionTimeout」っぽい。

===============================================================================
Common Platform Error Record @ fffffa804ded5028
-------------------------------------------------------------------------------
Record Id     : 01ccfc8898398503
Severity      : Fatal (1)
Length        : 408
Creator       : Microsoft
Notify Type   : Generic
Timestamp     : 6/11/2012 14:01:04 (UTC)
Flags         : 0x00000000
===============================================================================
Section 0     : PCI Express
-------------------------------------------------------------------------------
Descriptor    @ fffffa804ded50a8
Section       @ fffffa804ded50f0
Offset        : 200
Length        : 208
Flags         : 0x00000001 Primary
Severity      : Fatal
Port Type     : Root Port
Version       : 1.0
Command/Status: 0x0546/0x4010
Device Id     :
  VenId:DevId : 8086:340e
  Class code  : 060400
  Function No : 0x00
  Device No   : 0x07
  Segment     : 0x0000
  Primary Bus : 0x00
  Second. Bus : 0x06
  Slot        : 0x0000
Sec. Status   : 0x2000
Bridge Ctl.   : 0x0007
Express Capability Information @ fffffa804ded5124
  Device Caps : 00008021 Role-Based Error Reporting: 1
  Device Ctl  : 012e UR FE NF ce
  Dev Status  : 0004 ur FE nf ce
   Root Ctl   : 000e FS NFS cs
AER Information @ fffffa804ded5160
  Uncorrectable Error Status    : 00004000 ur ecrc mtlp rof uc ca CTO fcp ptlp sd dlp und
  Uncorrectable Error Mask      : 00218000 ur ecrc mtlp rof UC CA cto fcp ptlp sd dlp und
  Uncorrectable Error Severity  : 00067030 ur ecrc MTLP ROF uc ca CTO FCP PTLP SD DLP und
  Correctable Error Status      : 00000000 adv rtto rnro dllp tlp re
  Correctable Error Mask        : 000031c1 ADV RTTO RNRO DLLP TLP RE
  Caps & Control                : 0000000e ecrcchken ecrcchkcap ecrcgenen ecrcgencap FEP
  Header Log                    : 00000000 00000000 00000000 00000000
  Root Error Command            : 00000000 fen nfen cen
  Root Error Status             : 00000054 MSG# 00 FER nfer FUF mur UR mcr cer
  Correctable Error Source ID   : 00,00,00
  Correctable Error Source ID   : 00,07,00

参考

http://www.sysnative.com/forums/showthread.php/327-PCI-E-WHEA-errors-(0×124)

http://www.nirsoft.net/utils/blue_screen_view.html

http://twilog.org/tweets.cgi?id=Masayuki_Ozawa&word=!analyze

JavaScriptの変更をサーバーに公開することなく安全にテストする方法

$
0
0

バグ修正をした後は、最初に正しく動作するようになったのかを確認します
しかし、大抵の場合JavaScriptファイルを更新するためにWebサーバーに接続することができません。
できたとしても、修正をミスっていると影響が大きく危険を伴います。

幸いにも、サーバーにファイルをアップロードせず、他の人にも影響を与えることなく
サーバー上で動作させ修正をテストする方法があります。
その方法は、FiddlerのAutoResuponder機能を使用することです。
Fiddlerを使用して、ブラウザからのリクエストを取得し、サーバーからのリクエストを取得する代わりに
ローカルにあるJavaScriptファイルをブラウザに返します。
これは時間の節約にとても有効です。

バグ修正の為にSomeLibrary.jsを変更したときの対応手順を説明します

  1. ブラウザキャッシュのクリア
  2. Fiddlerを起動
  3. SomeLibrary.jsを読み込むページに移動します
  4. サーバーからSomeLibrary.jsをリクエストしているFiddlerのリスト項目で右クリックします。
    Save、Response、Response Bodyを選択し、ファイル名にc:\temp\SomeLibrary.jsを使用します
  5. AutoResponderタブで、“Enable automatic responses” と “Permit passthrough for unmatched requests”にチェックを入れます。
  6. リスト項目をAutoResponderウィンドウにドラッグします。
    一番下に、C:\temp\SomeLibrary.jsと入力し、Saveボタンを押します。
    image
  7. バグ修正するためにc:\temp\SomeLibrary.jsを編集します
  8. ブラウザキャッシュをクリアします。
  9. ブラウザでバグを含んだ手順を操作します。
    Fiddlerはブラウザ用のプロキシとして、FiddlerはSomeLibrary.jsへのリクエストに対して変更したc:\temp\SomeLibrary.jsをブラウザに返します。

修正した結果でバグが治っていない場合は、再度手順7にもどりやり直します。

Fiddler Autoresponder機能を使用することで、他のユーザーに影響を与えることなく、問題の修正に大きな時間をかけることなく分離環境で、本番環境のJavaScriptを変更し安全にテストすることができます。

 

http://blogs.msdn.com/b/edhintz/archive/2012/06/22/safely-test-a-javascript-change-without-touching-the-server-a-huge-time-sever.aspx を意訳した投稿です。

SQL Server 2008 R2 SP1を適用したらサービスが起動しなくなった時の対応

$
0
0

SQL Server 2008 R2 SP1 を適用したら、SQL Serverのサービスが起動しなくなって、あうあうしたのメモっておく。

緊急度Aでマイクロソフト プレミアムサポートに問い合わせをしたら、無事解決策を提示していただき、あっさりと復旧させることができた。感謝感謝。

現象

SQL Server 2008 R2 SP1をインストールし、再起動したら以下のようなエラーが表示されて、SQL Serverのサービスが起動しなくなった。
記載されている内容に従ってバックアップデータからmasterデータベースを復旧させようと、SQL Serverをシングルユーザーモードで起動しても、エラーが出て起動させられず途方に暮れた。

image

アップグレード手順 ‘sqlagent100_msdb_upgrade.sql’ でエラー 574、状態 0、重大度 16 が発生したため、データベース ‘master’ のスクリプト レベルのアップグレードが失敗しました。このエラー状態は深刻で、通常の操作に影響を与える可能性があるので、データベースはオフラインになります。’master’ データベースのアップグレード中にこのエラーが発生した場合は、SQL Server インスタンス全体を開始できません。スクリプトのアップグレード手順が最後まで実行されるように、これまでのエラー ログ エントリを参考にしてエラーを調査し、適切な方法で対処して、データベースを再起動してください。

 

image

master データベースを復旧できません。SQL Server を実行できません。master データベースを、完全バックアップを使用して復元するか、修復または再構築してください。master データベースを再構築する方法の詳細については、SQL Server オンライン ブックを参照してください。

状況

SQL Server が起動できない状況となっていた際には、次のエラーにより SQL Server 起動時のスクリプトアップグレードが失敗していたようです。

spid8s      エラー: 15002、重大度: 16、状態: 1。
spid8s      プロシージャ ‘sys.sp_dbcmptlevel’ はトランザクション内では実行できません。
spid8s      エラー: 574、重大度: 16、状態: 0。
spid8s      CONFIG ステートメントはユーザー トランザクション内では使用できません。

SQL Server 2008 で Service Pack や Cumulative Update を適用した後には、次回の SQL Server 起動時に、スクリプトを実行することにより必要なアップグレード操作が実行されて、
上記の現象は、このスクリプトアップグレードの実行が失敗し、システムデータベースの起動ができないために SQL Server が停止していた状況らしいです。

スクリプトは静的なスクリプトとして準備されているもので、トランザクション管理の観点で動作が変わることはないため、このエラーは対象の SQL Server 上の環境に依存して発生しているものと考えれると。

このエラーは、SQL Server の構成オプションの一つである user options の設定において、implicit transactions が有効な場合に発生します。

タイトル : user options オプション
<http://msdn.microsoft.com/ja-jp/library/ms176031(v=sql.100).aspx>
>2
>IMPLICIT_TRANSACTIONS
>dblib ネットワーク ライブラリ接続の場合、ステートメントの実行時にトランザクションを暗黙的に開始するかどうかを制御します。IMPLICIT_TRANSACTIONS の設定は、ODBC または OLEDB 接続には影響を与えません。
タイトル : ユーザー オプションを構成する方法 (SQL Server Management Studio)
<http://msdn.microsoft.com/ja-jp/library/ms190763(v=sql.100).aspx>

このオプションの効果が発生している場合には、上記のように静的なスクリプトの実行でもトランザクション状況が変わるため、エラーとなりうる。

対処方法

SQL Server のスクリプトアップグレード操作を一時的に停止し、implicit transactions 設定を無効にし、SQL Server を再度起動します。

  1. スクリプトアップグレードを一時的に停止するトレースフラグ 3608 を指定して SQL Server を起動します。
    管理者権限で開いたコマンドプロンプトから、次のコマンドを実行。
    sqlservr.exe -c –T3608
    SQL Server の起動が完了したら、コマンドプロンプトは開いたままにしておく。
  2. 別のコマンドプロンプトから専用管理者接続を使用して SQL Server に接続します。
    別のコマンドプロンプトから、対処用のコマンドを実行します。次の手順で行う。
    - 管理者権限で、別のコマンドプロンプトを開く。
    - SQL Server 上で管理者権限を持つ Windows アカウントで、次のコマンドを実行。
        sqlcmd.exe -Sadmin:K01-DB02 –E
  3. 、implicit transactions 設定を無効にします。
    接続が完了してプロンプトが現れたら、次のコマンドを実行。
        exec sp_configure ‘user options’
        go
    出力された結果の、run_value(一番右端の値)を記録しておく。
    値を控えたら、次のコマンドを実行します。
        exec sp_configure ‘user options’,0
        reconfigure
        go
    ‘user options’ が変更されたことが表示されたら、exit コマンドで sqlcmd を終了。
  4. SQL Server を再起動します。
    手順 1) で起動した SQL Server を停止。
    コマンドプロンプト上で Ctrl+C を押し、Shutdown を聞かれるので Y を押すと、SQL Server が停止。
    この手順の後、SQL Server をサービスから通常通りに起動。
    起動が成功すれば、対処は完了。
  5. 起動後、パッチ適用が再開されるのでDBが使用できるまでに多少の時間あ必要

SQL Server 2008 R2の修正プログラムで適用が必要になったものの記録

$
0
0

Windows Server 2008 R2 Enterprise Edition環境下で、SQL Server 2008 R2 Standard Editionを運用していて、問題に遭遇し修正プログラムを適用した記録を公開しておきます。
どなたかの参考になれば幸い。
ちなみに自分の管理下にあるのは50~60台なので、いろんな事象に遭遇します(^^;

SQL Server 2008 R2 SP1

Windows Server 2008 R2で高負荷環境下で運用していると、SQL Serverのプロセスがダウンしてしまう可能性があり適用した。
SQL Serverの高負荷時にTCP通信に使用するメモリ領域が使用中のまま解放される問題のようです。

自分の管理下にある50台のサーバーの内、2台のサーバーにおいて1回ずつプロセスがダウンした。

SQL Server 2008 R2 SP1 CU3

The client was unable to reuse a session with <SPID>, which had been reset for connection pooling. The failure ID is 29. This error may have been caused by an earlier operation failing. Check the error logs for failed operations immediately before this error message.
Error: 18056, Severity: 20, State: 29.

上記のようなエラーが記録される事象が発生。
How It Works: Error 18056 – The client was unable to reuse a session with SPID ##, which had been reset for connection pooling

http://support.microsoft.com/kb/2543687/en によると2008 R2 CU9で修正されたと情報がありました。2008 R2 CU9が、2008 R2 SP1 CU3に相当します。

SQL Server 2008 R2 SP1 CU6

次の問題に遭遇。

  • クライアントアプリケーションがMicrosoft SQL Server 2008またはMicrosoft SQL Server 2008 R2のインスタンスに接続している
  • SQL Serverが、SQL Server 2008またはSQL Server 2008 R2とクライアントアプリケーション間の接続をリセットしたとき、クエリタイムアウトが発生します。または、クライアントアプリケーションが SQL Serverのインスタンスへクエリをキャンセルする情報を送信します。

アプリケーションがSQL Serverと通信できなくなる問題に遭遇した。
調査すると次の問題に該当したので適用した。

FIX: Errors when a client application sends an attention signal to SQL Server 2008 or SQL Server 2008 R2
http://support.microsoft.com/kb/2543687/en

SP2

まだ適用していないけど、情報としてメモ。

SQL Server 2008 R2 SP2には、SQL Server 2008 R2 SP1 CU1~CU5
SQL Server 2008 R2 SP2 CU1には、SQL Server 2008 R2 SP1 CU6~CU7

SP1 CU6が適用されている必要があるから、SP2単体を適用する予定は無し。
適用するなら、SP2とSP2 CU1を同時に適用する。

SQL Server 2008 R2 SP1 
CU1 
CU2 
CU3 
CU4 
CU5SQL Server 2008 R2 SP2
CU6 
CU7CU1
CU8CU2(完全には一致していない)

参考

Windows 7で、Excelファイルを別々のウィンドウで開く方法

$
0
0

デフォルトでは、ExcelファイルはWindows 7では同じウィンドウで開かれます。
しかし、時々画面上で同時にいくつかのファイルを表示させたくなることがあります。
これをするために、スタートメニューからExcelボタンをクリックして新しいExcelプロセスを起動させることで実現させることができます。

しかし、設定をすることで、いつでもExcelファイルを開くときに別のウィンドウを開くことができるようになります。
コンピューターに十分なRAMメモリーが搭載されているときにのみ、設定するよう推奨します。

一番手っ取り早い実現方法は、
http://support.microsoft.com/kb/2636670
にアクセスし、Fix itを実行することです。

「HTML5によるタフなモバイル開発の最前線」by DeNA @tkihira

$
0
0

HTML5 Conference 2012で実施された株式会社ディー・エヌ・エー紀平 拓男さんによるセッションが、とても楽しかったのでまとめてみる。

セッション概要

セッション概要には、次のような説明が記載されていた。

スマートフォンにおけるHTML5を用いた開発における現在の最前線の話をDeNAにてHTML5の技術開発を総括している立場より、具体的なノウハウを交えてお話しします。  

DeNAの紀平さんはExGameを作った人。
ExGameは、FlashをHTML5のCanvasとJavaScriptへの自動変換してくれるライブラリ。
再現率は他のライブラリよりも高いらしい。
そんな人が、DeNAでHTML5を統括しているから、間違いなく実践的な話になると期待していたし、
実際に期待以上だった。

株式会社ディー・エヌ・エー 紀平 拓男さん

なぜHTML5?

インストールが大嫌い。インストールの無い世界にしたい。

モバイル開発では、これまではフィーチャーフォンではFlashしか選択肢がなかったので、
Flashを使わざるおえなかった。

方やスマートフォンではFlashの選択肢がなかった。
ジョブスがiPhoneでのFlash対応を拒否し、HTML5押しだったのが決め手。
現時点では、スマートフォンはiPhoneとAndroidの二強。
その片翼のiPhone非対応って選択はあり得ないから。

さらに8月に、Android版のFlashプレイヤーの配布が終了した。
今後出てくる端末にはFlashプレイヤーが無い。

HTML5への流れは必然。
個人的にはインストールが大嫌いなので標準で対応できるのはWelcome。

HTML5がうれしいのは、ブラウザ間の互換性を保って使える機能が増えたこと

描画性能が向上した。
曲線のある図形を描画することができるようになった。
アニメーション対応も非常によくなっている。HTML5でFlash並みのアニメーションが達成可能

Webアプリケーションの機能が向上
applicationCache機能。
電波が入らなくてもゲームをすることができる
localStorage/WebSQL
スマートフォンの端末の中にアプリケーション特有のデータを保存することが可能。
参考:http://nmi.jp/ds/

HTML5対応をするとでてくる3つの問題点

次の3点はネイティブアプリにはかなわない。

  • 3D
  • 速度
  • 音楽

この3点は、ネイティブアプリに劣っている。

HTML5はネイティブの速度には絶対敵わないのは当たり前の話ですが、その中でも描画速度が一番問題になります。

CanvasとCSS3を制するものはモバイルHTML5を制する

使えるのであれば、Canvasを使った方が良い。
CSS3とは、ほんのわずかな速度差しかないので、心が折れないのであればCanvasを書いてください。
でも心が折れますね…。

Canvasのメリット

CanvasはJavaScriptで書き換えられるため自由度が高い。
iOS5からGPU描画をサポートしたので高速で動くようになった。
APIがシンプルで、端末間の誤差も小さい。

Canvasのデメリット

毎フレームちまちま描画しないといけないので、ちょっとしたアニメーションをするためにも相当の行数を書かないといけない。

Canvasは非常に優れているが、作るのが非常に難しい。

CSS3のメリット

CSS3にDOM要素の変形とアニメーションが追加されました。
Canvasより優れているのは、3D変形に対応していること。
比較的書きやすい印象。

CSS3は基本的にGPUサポートがあり、CSSの延長なのでデザイナーが欠ける。

CSS3のデメリット

細かいアニメーション同期には、JavaScriptに頼らないといけない。
基本的に高速だけど、はまると何故かわからないけど急激に遅くなる。
端末互換は絶望的に無い。

端末別の考え方

iOSは端末間の誤差が非常に少ないので、CSS3を使用。
iOS4/iOS5に、iPhone3Gs、iPhone4、iPhone4sの6種類程度に対応すればいい。

Androidは、Flashを使うってのが今までの解でした。
でも、Flash Playerの配布は終了したので、今後はFlashでは対応できない。

DeNAでの取り組み

次のツールはすべてCanvasを使用しているツールで、社内に提供しています。
DeNAにはCanvasの様々なバッドノウハウの蓄積が進んでいます。

Canvasでの問題点

DeNAのゲームは長い時間使っていただけるので、Canvasが常時動き続けることになるので、
結果的に問題が表面化しやすい。

Canvasにかかわる問題は多岐にわたるが、結局は次の3種類に集約できる。
社内のバグトラッキングも、次の3つに集約されています。

  • 速度
  • メモリ
  • 電池

Canvasの速度

オンメモリのCanvasの有効活用。
GPUのサポートが入ってからdrawImage関数が高速になりました。
DOMに属さないCanvas要素をcreateElementで作成し、キャッシュとして利用すると高速化につながる。

GC対策が重要。
Androidは世代別GCを使用しているので、Stop the worldが発生する。
フルGCが発生するタイミングで0.5秒プチフリーズする。
だいたい30フレーム。
Androidは、ある日急に導入されました。
なので、iPhoneも間違いなく、ある日急に導入されると考えていた方が良い。

世代別GC対応としては、
可能な限りオブジェクトをプールしておき、メモリ確保回数自体を減らしておくことが重要。
メモリ確保のタイミングを減らせばいい。
GCを起こさせないという解はない。

Canvasのメモリ

Canvasを使い込んでいくと次はメモリの問題が起こる。
メモリを使いすぎるとブラウザが落ちる。
実機でのメモリ使用量を動的に調査する必要がある。

iPhoneでは、iOS6で可能になるらしいけど、本当に搭載されるかは怪しいかも?
お勧めも推奨もできないし、電波法に触れる可能性もあるけど、ジャイルブレイクとか。

Androidであれば、adb shell ‘dumpsys meminfo _package-name_’ が簡単。

メモリリークを検知しましょう。
神ツールは、Chrome Developer Tool:Heap Snapshot機能を使ってあげると簡単に調査できる。
注意が必要なのは、console.log。
console.logで、デバッグ中だけメモリリークしちゃう。
特にオブジェクトをChromeで表示するとリークしやすい。

電池の問題

電池の問題がシビアです。
電池の消耗は、CPU使用率と相関関係にあります。
電池の消耗を防ぎたい場合は、CPU使用率を下げる。無駄に使うことが多いのは描画。
スムーズな描画でもCPU使ってる。
前のフレームで描いた描画結果を利用して描画範囲を絞る。

描画範囲を細かく見ることが重要。
例えば、モビルスーツがふわふわ浮いているだけの画像の一番上と一番下は、
ほとんどかわっていないので再利用したら30%削減できた。

まとめ

HTML5らしいツールとしては、iPhone版のGmail、Twitterなどはすぐれているので参考にしてね。
Webアプリケーションの復権はくる。
優れたWebアプリの登場によって、状況は簡単にひっくり返ると思う。

次世代アプリは、iPhone/Android/WinPhone全部で動いて、ページ船医がほとんど泣く、
瞬時に起動しオフラインでも快適に動作するモバイルアプリが、次世代Webアプリだと思います。
さぁ、皆さん一緒に次世代のwebwプリを世界に普及させましょう。

モバイルHTMLは日本が世界にに抜き出ていて、
日本の環境はサンフランシスコのくそなインフラに比べると優位。
今、鼻差で勝ってるから勝ち続けましょう!

Q&A

JSXについて

JSXには、メモリリークテストが組み込まれる予定。
プロファイラーはすでに出ている。
DeNAが提供するツールは順次jsxに書き換えていく。
ExGame/Pex/ngCore on HTML5/Arctic.jsなども順次対応していくことになっている。
DeNAの生命線になっていくし、プロダクトで使える品質に達していると自負している。


GrowthForecastのSQLLiteのファイルの配置場所

$
0
0

GrowthForecastのSQLLiteの実態を見つけるのに苦労したのでメモ。

/usr/lib/perl5/site_perl/5.8.8/auto/share/dist/GrowthForecast/data/

SQLLiteファイル「gforecast.db」とRRDデータファイルが格納される。

起動時に、data_tierを指定すれば、既定の配置場所は変更可能。

起動メモ

growthforecast.pl > /var/log/growthforecast/gf.log 2>&1 &

その他の関連パス

  • /usr/lib/perl5/site_perl/5.8.8/GrowthForecast
  • /usr/bin/growthforecast.pl
  • /usr/local/growthforecast/log

my $root_dir = File::Basename::dirname(__FILE__);
if ( ! -f "$root_dir/lib/GrowthForecast.pm" ) {
    $root_dir = dist_dir(‘GrowthForecast’);
}
if ( !$data_dir ) {
    $data_dir = $root_dir . ‘/data’;
}
else {
    $data_dir = Cwd::realpath($data_dir);
}

CPU・メモリ・ディスクロードをシミュレーションするツール

$
0
0

高いCPU使用率をシミュレーションする

CPUSTRES.EXEは、ユーザーモードプロセスで高いCPU使用率を再現するツールです。
Windows Sysinternal ToolsのWebサイトで提供されています。

CPUSTRESを使用して、CPU使用率50%を再現した様子。

clip_image002

高いメモリ使用量をシミュレーションする

Windows Sysinternalで提供されているTestLimitツールを使用して、高いメモリ使用量を再現することができます。TestLimitはメモリリークをシミュレーションするのに使用されます。
TestLiitで、空きメモリ量を減らしてみた様子です。

clip_image002[5]

clip_image002[7]

高いディスク使用状況をシミュレーションする

SQLIOは、ストレージのI/O性能をベンチマークするのに使用するツールです。
シーケンシャルとランダムI/Oをシムレーションできます。

image

大きなディスク使用量をシミュレーションする

consume.exeは、Windows SDKに同梱されており、CPU、メモリ、ディスクのようなリソース消費に使用できます。comsumeを使用して、ディスク空き容量が少ない状態を再現させてみました。

image

ネタ元

MSDNブログ:Tools To Simulate CPU / Memory / Disk Load

Windows 8 でCisco の AnyConnect でVPN接続をする方法

$
0
0

Windows 8 でCiscoのAnyConnectを使用してVPN接続をすると次のようなエラーが出て、接続を確立することができません。

A connection to the remote computer could not be established.

いろいろ試して、恐らく次の2つの対応を実施すると接続できるようです。

  • レジストリエディタで、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vpnva
    の「DispalyName」を修正する。「%;」の前を全て削除して、「Cisco AnyConnect VPN Virtual Miniport Adapter for Windows x64」みないな感じにする
  • VPNの接続先の電子証明書を、信頼されたルート証明書機関にインポートする

この2つの対応で複数台のWindows 8端末で、無事VPN接続を確立させることに成功しました。

Build 2013初日に合わせてリリースされたプログラムと情報一覧

$
0
0

SourceTreeで、git revert する方法

$
0
0

git revert

コミットを打ち消す処理

git revert bbbd33ff

SourceTreeだと、打ち消したいコミットを選択して、右クリックから[Reverse commit…]を選択すればOK。

image

で、これを実行すると・・・次の画像のように、Revertになっていて、処理も打ち消し処理となっている。

image

bundle exec vagrant free-memoryでエラーが出る時の対処方法

$
0
0

すっごい悩んだのでメモしておく。
Vagrantで遊んで、O’REILYから出ている「実践Vagrant」を読んでプラグインを作ろうってなって、書籍の通り進めたつもりなのにエラーが出て進めなかった。
試したのはWindows 8環境です。

bundle exec Vagrant free-memory

って実行すると、次のようなエラーが出て解決できない!

/home/thoraxe/.gem/ruby/1.9.1/bundler/gems/vagrant-d81af187eae3/lib/vagrant/pre-rubygems.rb:16:in `require_relative’: /home/thoraxe/.gem/ruby/1.9.1/bundler/gems/vagrant-d81af187eae3/lib/vagrant/bundler.rb:188: syntax error, unexpected tPOW (SyntaxError)
    def internal_install(plugins, update, **extra)
                                            ^
/home/thoraxe/.gem/ruby/1.9.1/bundler/gems/vagrant-d81af187eae3/lib/vagrant/bundler.rb:257: class definition in method body
/home/thoraxe/.gem/ruby/1.9.1/bundler/gems/vagrant-d81af187eae3/lib/vagrant/bundler.rb:273: syntax error, unexpected keyword_end, expecting $end
        from /home/thoraxe/.gem/ruby/1.9.1/bundler/gems/vagrant-d81af187eae3/lib/vagrant/pre-rubygems.rb:16:in `<main>’

解決方法

原因は恐らくRubyのバージョン問題ちっく。
試行錯誤しすぎて環境がよごれまくっているので、下記対応だけで良いのか、正しいのかは結構怪しいけど、まぁ自分の環境で最後にやった作業ってことで。

RubyInstallerでRubyとRubyGemsをインストールしようっとP.120に書かれているのだけど、それが不要(かも)。代わりに、Vagrantに梱包されているRubyを使うように環境変数をセットしてあげる。

「C:\HashiCorp\Vagrant\embedded\bin」にPathを通してあげると、上記エラーは出なくなった!やったね。
本当に正しいのかは一抹の不安を感じるが。

実践Vagrantの7章:一部サンプルが動作しない件の対処方法

$
0
0

「Vagrant実践」を読んで、サンプルを作成すると多少(自分的にはかなり)はまる。
調べてみると、「"実践Vagrant"を読んだ」の投稿をしている人もはまっていた。

すこしハマった部分.本書や公式ドキュメントだとVagrantfileVagrant.require_plugin "my_plugin"を記述してプラグインのテストを行うように書かれているが,自分の環境だとうまく動かなかった.

これで、どうやら自分のローカル環境依存じゃないとわかって、よーやくブレークスルーできた。
それで調べ直したら、解決方法がわかったのでメモておく。

エラー内容

サンプルでは、Vagrantfileに以下記述をすることで、bundlerでプラグインを強制的に読み込ませるっと案内があります。

Vagrant.require_plugin ‘my_vagrant_plugin’

書籍の手順に従うと、Vagrant 1.5.0.dev版を使うことになるのだけど、このバージョンでは仕様変更が入っていて動作しない。まぁ次のようなエラーがでる。

Vagrant.require_plugin is deprecated and has no effect any longer.

あかんねー。

解決策

ここで説明されていて、用はrequire_pluginを使う方法からグループを使う方法に変更されたと。
なので、Vagrant実践のサンプルを作成するには、

Vagrantfileから以下記述を削除する。
Vagrant.require_plugin ‘my_vagrant_plugin’

そして、

Gemfileに以下記述を追加する。
group :plugins do
  gem "my_vagrant_plugin", path: "."
end

をすれば、無事!「Hello!」が表示された。

公式ドキュメントにも以下のように記述されている。

The only thing about this Gemfile that may stand out as odd is the "plugins" group and putting your plugin in that group. Because vagrant plugin commands don’t work in development, this is how you "install" your plugin into Vagrant. Vagrant will automatically load any gems listed in the "plugins" group. Note that this also allows you to add multiple plugins to Vagrant for development, if your plugin works with another plugin.


Dockerを試すにあたって困ったことのメモ

$
0
0

Windowsで、Virtualboxを使用してDockerを試すことにした。
試す際に参考資料として使用したのが、「Web+DB press vol.79」の「Dockerによる軽量な仮想環境」の記事。

記事では、VagrandfileをDockerのリポジトリからダウンロードしてきてVagrant upしているのだけど、そのVagrantfileが無くて困ってしまった。
https://raw.github.com/dotcloud/docker/master/Vagrantfile をダウンロードしようとしたところ、404でダウンロードできない。困ってTwitterで呟いてみたら、以下のようなヒントをいただいた。


結論:boot2dockerを使用する

インストールマニュアルもmaster版はすでに、Vagrantfileを使用する方法から、bott2dockerを使用する方法に変更されている。

でも、面倒って人は、Vagrantの作者のmitchellh氏が面倒な人用に、boot2docker Vagrant Boxを用意しているので、それを使ってしまうのが楽でいい。

mkdir c:\work\docker
cd c:\work\docker
vagrant init boot2docker https://github.com/mitchellh/boot2docker-vagrant-box/releases/download/v0.5.4/boot2docker_virtualbox.box
vagrant up

で、準備完了!便利だね。

蛇足:WindowsでVagrant sshが面倒なので、Vagrant Puttyする

vagrant-multi-puttyプラグインをいれて、Vagrant puttyできるようにする。
あらかじめ、puttyにはPATHを通しておく。

vagrant plugin install vagrant-multi-putty

あとは、puttygenで (ユーザーローカル)\.vagrant.d\insecure_private_keyを読み込んで、 (ユーザーローカル)\.vagrant.d/insecure_private_key.ppkに保存しておく

Vagrant 1.5とVagrant Cloudがリリース

$
0
0

Vagrantにいくつかの新機能が追加された新しいメジャーリリース版であるVagrant 1.5がリリースされました。安定性に注力されていて、今回のリリースでより安定したようです。

また、Varant Cloudが発表されました。
Vagrant Cloudは、Vagrant環境をCreateし、shareし、discoverするための場所です。Vagrant Cloudは、boxとVagrand Shareを管理する場所です。

Vagrant 1.5は後方互換が導入されています。いくつかの設定オプションが変更されていますが、以前動作しますし、廃止予定警告が出力されます。将来的なリリースでは、オプションが削除されます。

Vagrant 1.5は今までで一番大きな機能追加がされています。また、たくさんのバグが修正されました。

主な機能

Changelog

https://github.com/mitchellh/vagrant/blob/master/CHANGELOG.mdで紹介されているVagrant 1.5での変更内容。

破壊的変更

  • プロビジョナー/ansible:vagrantプロビジョン手順でマシンを起動する際に影響する、(Vagrantfileから取得する)マシン名を標準で安全な値を設定するように保障されるようになりました。

DEPRECATIONS

  • プロビジョナー/chef-solo:[nfs]設定は、[synced_folder_type]に置き換えられました。将来バージョンで、[nfs]設定は削除されます。
  • プロビジョナー/pupet:[nfs]設定は、、[synced_folder_type]に置き換えられました。将来バージョンで、[nfs]設定は削除されます。

機能追加

  • 新しいプロバイダー
    Hyper-V。Hyper-Vを有効にしているWindowsマシーンで、VagrantはHyper-V仮想マシンを管理できるようになりました。
  • 新しいゲスト
    Funtoo(ホスト名とネットワークの変更をサポート)
  • 新しいゲスト
    NetBSD
  • 新しいゲスト
    TinyCore Linux。network、halt、rsyncやBoot2Dockerと動作したりできます。
  • 新しい同期フォルダーの種類
    rsync。ゲストマシンへの一方向に一回だけ同期します。新しいコマンド[vagrant rsync]と[vagrant rsync-auto]でフォルダーを同期できます。
  • 新しい同期フォルダーの種類
    Windowsホスト上のSMBを使用して双方向のフォルダー同期を可能にします。
  • パスワードベースのSSH認証。通常の仮想マシンのイメージをVarantで使用できるようになります。さらにVagrantは自動的にマシンにkeypairを挿入します。
  • プラグインバージョンの指定で、バージョンを範囲で指定できるようになりました。
    (例)vagrant plugin install foo –plugin-version “> 1.0, < 1.1”
  • ゲストで[guest capabilities]を使うように、ホストを指定した操作[host capabilities]ができるようになりました。これにより、ホストを対象としたプラグインを開発しやすくなります。
  • サブVM設定内のプロビジョナーやプロバイダーをオーバーライドできるようになりました。
  • プロバイダー/virtualbox
    プロバイダー特有の設定[cpu]で、VM上のCPU数を設定できるようになりました。
  • プロビジョナー/docker
    docker buildを使用してイメージをビルドできるようになりました。

機能強化(抜粋)

  • コマンド[vagrant pluguin uninstall]:複数プラグインのアンインストールが可能になりました。
  • コマンド[vagrant pluguin install]:複数プラグインのインストールが可能になりました。

Vagrant Cloud使ってみた:Boxファイルの検索と共有

$
0
0

Boxes

1.Boxesを探して使用する

Vagrant Cloudの主な使用法は、Vagrant環境で必要となるテクノロジーを含んだboxを探すことです。

  1. Discover page]にアクセスします。

    image

  2. 欲しいboxを検索するか、左側にある[featured]上のナビゲーションを使用します。
  3. boxを見つけたら、名前をクリックすると詳細を確認できます。

    image

  4. 使用する準備ができたら、名前をコピーします。(たとえば、[hashicorp/precise64"])

    vagrant init hashicorp/precise64

    のようにVagrantプロジェクトを初期化します。または、すでにVagrantプロジェクトを作成している場合は、Vagrantfileに使用するboxファイルを適用します。
    config.vm.box = “hashicorp/precise64"

2.新しいBoxを作成する

Vagrant Cloudは、boxを共有するのに役立ちます。実際の物理的なboxファイルの作成方法については、Vagrantのドキュメント[creating base boxes]を参照してください。

物理的なboxファイルを作成し、Vagrantでシンプルに使用するために、Vagrant Cloudに追加します。

  1. Vagrant Cloudにログインします。
  2. 右上にある[Create Box]をクリックします。

    image

  3. 必要事項を入力します。boxファイル名と、概要と詳細説明を記入します。

    image

  4. boxのバージョン番号を記入します。

    image

  5. 対応するプロバイダーを登録します。

    image

    登録するには、対応するプロバイダー名と、Boxファイルの格納URLを指定します。
    ※Vagrant Cloudでストレージ領域を提供してくれるわけじゃないのね。。。
    ベータ中は内部的にテストをしていて、将来的には提供予定(参考

    image

  6. [Release now]ボタンをクリックします。

    image

vagrant cloudの「Shares」概要:Vagrant環境の共有

$
0
0

Sharesは、インターネットにネットワークで接続している人が誰でもVagrant動作環境に接続共有できるようにするものです。
いくつかの共有タイプがあります。

HTTP Sharing

デフォルトで、Vagrant Shareは世界中の誰でもVagrant環境にHTTPアクセスできるように共有します。作成したURLは、公にアクセスできるようにし、アクセスするのにVagrantは不要でブラウザだけでアクセスできます。

$ vagrant share
==> default: Local HTTP port: 5000
    default: Local HTTPS port: disabled
==> default: Your Vagrant Share is running!
==> default: URL: http://frosty-weasel-0857.vagrantshare.com

一度、shareを作成すると、比較的わかりにくいURLが出力されます。このURLは直接起動したVagrant環境にルーティングします。将来的には、アクセス生業や監査ログ機能が追加される予定です。

SSH Access

Vagrant Shareは、1つフラグをたてるだけで、誰でも簡単にVagrant環境にSSHできるようにします。

SSH Accessはデフォルトでは共有されます。SSH共有を有効にするには、[vagrant share]に、[—ssh]フラグをつけなければなりません

$ vagrant share –ssh
==> default: SSH Port: 22
==> default: Generating new SSH key…
    default: Please enter a password to encrypt the key:
    default: Repeat the password to confirm:
    default: Inserting generated SSH key into machine…
==> default: Checking authentication and authorization…
==> default: Creating Vagrant Share session…
    default: Share will be at: awful-squirrel-9454
==> default: Your Vagrant Share is running!

[–ssh]フラグを立てると、VagrantはSSH Access用に新しいSSHキーペアを生成します。公開鍵は自動的にVagrant環境に挿入されます。非公開鍵は、Vagrant Share接続管理用サーバーにアップロードされます。パスワードで暗号化された非公開鍵はどこにもアップロードされません。

SSH Accessがshareされると、Vagrant環境にアクセスしたい人は、SSHするために[vagrant connect]を使用します。

$ vagrant connect --ssh awful-squirrel-9454
Loading share 'awful-squirrel-9454'...
Password for the private key:
Executing SSH...
Welcome to Ubuntu 12.04.1 LTS
 * Documentation:  https://help.ubuntu.com/
Last login: Wed Feb 26 08:38:55 2014 from 192.168.148.1
vagrant@precise64:/vagrant$

Vagrant Connect

Vagrant Shareは、TCP/UDP接続を共有できます。

[vagrant connect SHARE-NAME]を実行して共有します。

$ vagrant connect awful-squirrel-9454
==> connect: Connecting to: awful-squirrel-9454
==> connect: Starting a VM for a static connect IP.
    connect: The machine is booted and ready!
==> connect: Connect is running!
==> connect: SOCKS address: 127.0.0.1:62167
==> connect: Machine IP: 172.16.0.2
==> connect:
==> connect: Press Ctrl-C to stop connection.
...

Vagrant Cloudで、Vagrant Shareをやってみた

$
0
0

Vagrantのバージョン確認

Vagrant のバージョンが、1.5以降である必要があります。次のコマンドでVagrantのバージョンを確認しましょう。

vagrant -v

次に、Vagrant Cloudで、アカウントを作成します。
作成が終わったら、Vagrantでの操作に戻ります。

Vagrant upの準備

vagrant shareするには、httpサーバーを動かしている必要があるので、httpdをインストールするVagrantfileを用意する。ポートフォワードを使用することにして、次のようなVagrantfileを使った。

Vagrantfile

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "hashicorp/precise32"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.provision:shell,:inline=> <<-EOT
    yum update -y
    service iptables stop
    chkconfig iptables off
  
    yum -y install httpd
    chkconfig httpd on
    service httpd start
  EOT
end

ファイルを準備したら、仮想マシンを起動する。

vagrant up

 

vagrant login

vagrant shareするには、Vagrant Cloudにログインしておく必要があるので、次のコマンドでログインする。

vagrant login

 

vagrant share

ここまでで準備が完了なので、vagrant shareしてみる。

vagrant share

次のように結果が出力されるので、ブラウザでアクセスしてみる。
image

 

http://slick-moose-8753.vagrantshare.comに接続すると・・・

image

 

無事、アクセスできますね。これは便利!!

ちなみに、Vagrant Cloudで確認すると、次のように状態管理されていることが確認できます。

image

 

後片付け

Ctrl+c

で、Varant Shareを終了させる。
Ctrl+cで終了させると、Vagrant Cloudにも連携して、割り当てが解除される。

ウィンドウを×で閉じちゃうと、Vagrant shareは終了して、アクセスできなくなるけど、1時間たつまでは、Vagrant Cloudにそのまま情報が残る。アクセスできないし、1時間で解除されるから×で閉じてもいいけど、気持ち悪いのでおとなしく、Ctrl+cで止めましょう。

まとめ

ローカルで開発して、それの動作確認をインターネットごしにできるのは、開発用とだけでみると素敵に楽すぎる。

Viewing all 183 articles
Browse latest View live