2016/04/14

ThinkPad X1 Carbon(2016) 購入しました

ThinkPad X1 Carbon(2016)を購入しました。参考までに、これまで使っていたThinkPad X201sとSSDの読み込み速度を比較します。


構成
  • インテル Core i7-6600U プロセッサー (2.60GHz, 4MB)
  • 16GB LPDDR3 1866MHz (オンボード)
  • SSD 512GB PCIe-NVMe

・左:SSD(SSD 512GB PCIe-NVMe)[ThinkPad X1 Carbon(2016)]
・右:SSD(インテル335 Series SSD 240GB)[ThinkPad X201s]


読み込み書き込み共に非常に早くなっていますが、遅い部分もあるようです(*)。
ちなみに、今だと+32,400円で1TBが選択できるようになったようなので、容量に不安がある方には選択肢が増えたのは良いですね。私はThinkPad X201sから使用している外付けポータブルHDDを併用していこうと思っています。

重さもThinkPad X201sと同じぐらいで、画面サイズが大きく厚みが薄くなっているので使いやすいです。

スペックも上がったので非常に快適に使えています。


(*)CrystalDiskMarkのバージョンが違いますがどの程度影響があるかは分かりません。



また、ThinkPad WiGig ドックを購入しました。使ってみると無線でモニタに接続できるので非常に楽です。ただし、起動時やスタンバイ状態でのファンの音がします。特にスタンバイ状態でのファンの音は気になるので、場合によっては電源を切ったほうが良いのかもしれません。が、その運用で良いのかどうか・・・。


そのほか、Lenovo 65W トラベル AC アダプターも同時に注文しましたが、4週間以上で出荷となっていました。実際には1週間で到着したので気になるけど出荷日数で躊躇している方は考慮してみるといいかもしれません。


リカバリディスクの作成には16GBのUSBメモリを事前に用意しておくと良いです。私は用意していなかったので慌ててAmazonで注文しました。

前の関連記事:


2016/02/16

AutoHotkeyを使った効率的なカーソル操作ができるキーバインド

以前から記事にしようと思っていた効率的なカーソル操作ができるキーバインドのネタをようやく公開。
プログラムを書くプログラマーだけでなく、文章を書く人にも便利かもしれません。


さて、このキーバインドの考え方としては、
  • オンラインゲームでのWASDキーによる移動
  • viのカーソル移動
  • viによるモードの切り替え
を着想としています。

 基本的な考え方は3つです。
  •  Ctrlを押しながらキーを押すと、カーソルの操作ができる(カーソルを"コントロール"するイメージ)
  • さらにShiftを押すと、文字列を選択できる
  • Ctrl + Alt (+ Shift) を押しながらキーを押すと、削除できる

カーソルの移動は、ijkl です。それに加え、u と o を加えます。
Ctrl + i  (上)
Ctrl + j  (左)
Ctrl + k (下)
Ctrl + l  (右)

Ctrl + u  (行頭へ)
Ctrl + o  (行末へ)

この組み合わせに、Shift 及び Alt を追加すれば快適なカーソル操作ができるようになります。

無変換キーに半角/全角キーを登録するとさらに快適です。


今回は AutoHotkey のスクリプトにて最終的なものを紹介しますが、 お使いのソフトに登録してみてください。

実行環境

Windows7
AutoHotkey: v 1.0.48.03(Revision 30 - May 31, 2009)
日本語キーボード

AutoHotkeyはこちらからダウンロードします。最新のものをダウンロードすることをお勧めします。

https://autohotkey.com/




"keyboard.ahk"

/**
 * キーバインド
 *
 * "^" = Ctrl
 * "!" = Alt
 * "+" = Shift
 */

SendMode Event
;SendMode Play
;SendMode Input
;SendMode InputThenPlay

; 十字キーの移動(Ctrl + キー)
^i::Send {UP}
^j::Send {LEFT} ;←キーを割り当て
^l::Send {RIGHT}
^k::Send {DOWN} ;↓キーを割り当て
^u::Send {HOME}
^o::Send {END}

; 十字キーの選択移動(Ctrl + Shift + キー)
^+i::Send +{UP}
^+j::Send +{LEFT} ;←キーを割り当て
^+l::Send +{RIGHT}
^+k::Send +{DOWN} ;↓キーを割り当て
^+u::Send +{HOME}
^+o::Send +{END}


; eclipse;うまくいかないのでeclipse側でコマンドを変更することにした
;^+!o::Send ^+o
;return


; 削除(Ctrl + Alt (+ Shift) + キー)
^!l::
KeyWait Alt ;Altキーを離すまで実行されないようにすることで問題を回避
Send {DEL} ;Ctrl+Alt+Deleteとなりタスクマネージャが起動してしまう
return
^!j::Send {BS} ;Backspace
^!+l::Send {DEL} ;削除
^!+j::Send {BS} ;Shift + Backspace では動かないので{BS}のみ

; 無変換
sc07B::vkF3sc029 ;半角/全角

; カタカナ ひらがな
sc079::Send {BS}

; Ctrl + n
^n::Send {F2} ;名前の変更 


AutoHotkeyのバージョンが古いので、新しいバージョン(1.1.23.01)では、上記コード内に記述しているeclipseや削除部分での問題は解決しているかもしれません。
2010年当時には、参考にした日本語サイトが閉鎖したのでAutoHotkeyはもう更新されないと思っていたのですが、まだ開発を続けているみたいですね。

上記コードでは、カタカナ ひらがなキーを Back Space に置き換えていますが日常で使っていませんでした。同じようにCtrl + n で名前の変更できるようにしていましたが、こちらも使用していなかったのですが、今後活用してみようと思います。


最後に、このキーバインドに慣れると、他の人のPCを操作するときに不便に感じることがありますので、用法をお確かめの上ご利用ください。

ThinkPadのトラックポイントと組み合わせるとさらに効果的です。








2016/01/28

VBAで MSHTML.HTMLDocument を使うとCookieに関する Windows セキュリティの警告が出るようになった

2015年10月末ぐらいまでは特に問題なかったのですが、最近、VBAで MSHTML.HTMLDocument の createDocumentFromUrl を使うとCookieに関する Windows セキュリティの警告が出るようになりました。





調べてみると、2015年11月に配信されたWindowsUpdateによる影響の可能性が高そうです。
(参考:Internet Exploere(IE)を起動したらセキュリティ警告が表示された。

IEの設定で解除できるかと調べてみましたが見つけられなかったので、VBAの方で警告を表示しない方法で解決することにしました。


Sub GetHtml(ByVal url As String, Optional ByVal forceSecurityAlert As Boolean = True)
    Dim oHTML As MSHTML.HTMLDocument
    Dim doc As MSHTML.HTMLDocument
    Dim url As String
        
    If (oHTML Is Nothing) Then Set oHTML = New MSHTML.HTMLDocument
    
    ' セキュリティ警告を抑止する
    If forceSecurityAlert Then
        'oHTML.designMode = "on"
    End If
    
    Set doc = oHTML.createDocumentFromUrl(url, vbNullString)
 
    Do
        DoEvents
        If (doc.readyState = "complete") Then
            Exit Do
        End If
    Loop While (True)

    ' 以下、必要な処理
End Sub

大事な部分はこの部分です。

'セキュリティ警告を抑止する
If forceSecurityAlert Then
    'oHTML.designMode = "on"
End If


環境を以下の通りです。
Windows 7, Excel 2013, IE 11

参考にしたサイト



2015/05/13

SCOUT実行時の"ArgumentError: Error #3214"エラーの対処法

SCOUTをインストールして、プロジェクトを作成し、△ボタンを押して実行した際に "ArgumentError: Error #3214" というエラーが発生しました。

△ボタンを押して実行した際のエラー画面

原因としては、実行時にJavaを使用しており、そのパスが誤っているために起動できないためでした(開発環境は Windows 7 64bit)。

C:\Program Files (x86)\Scout\javascripts\app\process_interaction.js


function javaDir() {
  if(air.Capabilities.os.match(/Windows/)) {
    path = air.File.applicationDirectory.resolvePath("C:\\Program Files\\Java\\jre7\\bin\\java.exe");
    if(!path.exists){
      path = air.File.applicationDirectory.resolvePath("C:\\Program Files (x86)\\Java\\jre7\\bin\\java.exe");
      if(!path.exists){
        path = air.File.applicationDirectory.resolvePath("C:\\Program Files\\Java\\jre6\\bin\\java.exe");
      }
    }
    return path;
  } else {
    return air.File.applicationDirectory.resolvePath("/usr/bin/java");
  }
}

私の環境ではJre7がなくなっていたため、パスを上記の"Jre7"の部分を"jre1.8.0_31"に変更しました。
これで無事で実行することができました。

ファイルを編集するには管理者権限が必要です。

参考にしたサイト

・Getting "ArgumentError: Error #3214" #187
https://github.com/mhs/scout-app/issues/187

2014/06/22

Developing a Turn-based Multiplayer Game in Androidの翻訳(途中)

Google Play Game Services — Google Developers
の翻訳です。未完ですが、眠らせておくのももったいないので公開します。

 重要:Play Games services APIは、Google Play servicesのための簡略化したGoogle APIクライアントプログラミングモデルをサポートするように改訂されました。以前のGames clientは2014/02/07から非推奨になりました。既存または新規の開発者は 非推奨の GamesClient(リンクはない模様) に代わりに GoogleApiClientを使用することを強く推奨します。

このガイドは、Androidアプリにおける、Play Games services を使用したターンベースマルチプレイヤーゲームを実装する方法を示します。

はじめる前に

まだ(開発を)行っていない場合、turn-based multiplayer game concepts を見ると参考になるかもしれません。

ターンベースマルチプレイヤーゲームのコードを書く前に:
  • Google Play Developer Console内で、ゲームがターンベースのマルチプレイヤーサポートを有効になっていることを確認してください。
  • ダウンロードページより、ターンベースのマルチプレイヤーゲームのサンプルコードをダウンロードしレビューしてください。
  • ゲーム開発を簡単にするために、Accessing the Game APIsに説明しているように、メインゲームのActivityをBaseGameActivityクラスのサブクラスにすることができる。BaseGameActivityクラスはGoogleApiClient 接続とユーザーログインを操作するラッパーを提供しています。
  • Implementing Sign-In in Androidに説明しているガイドラインを参照するとよいでしょう。
一度、プレイヤーがログインし GoogleApiClientに接続したら、ゲームはターンベースのマルチプレイヤーAPIを使用することができます。

マッチを始める

ターンベースのマッチを始めるには、ゲームは、他の参加者と試合したい相手を指定する方法や、いくつかの規定した基準を使用した試合を構築した方法を選択することをプレイヤーに促すことができます。Play Games servicesは、ゲームにターンベースマッチのオブジェクトを返すためにゲームからマッチコンフィギュレーションデータを使用しています。このオブジェクトは、ターンベースマッチのライフサイクル上の全ての参加者と非同期に更新・共有されます。

試合を始めるには、これらのステップに従います:
  1. アプリ内で、プレイヤーがプレイしたいターンベースマッチの種類の詳細を収集し、試合に参加することができます。
    • ゲームは、SDKが提供する内蔵のプレイヤー選択ユーザーインターフェース(UI)を表示したり、このデータを収集するために独自のカスタムUIを使用することができます。プレイヤー選択UIの使用方法を学ぶには、デフォルトユーザーインターフェースによるプレイヤー選択を参照してください。
    • 別の方法として、ユーザーがプレイヤー選択UIを避けられるようにクイックスタートボタンを実装することができ、いくつかの規定した基準を使用して試合を構築する代わりになります。
  2. TurnBasedConfigObject内のマッチコンフィギュレーションデータを設定するTurnBasedMatchConfig.Builderを使用します。
  3. createMatch() を呼び、生成したTurnBasedConfigObjectを通します。自動マッチングが指定されている場合は、Play Games servicesは既存のゲームにマッチしようとします。詳細は、自動マッチングを実装を参照してください。
ターンベースマッチを生成するにあたり、ゲームはこれらのメソッドを呼ぶことができます:

-->
メソッド詳細
getSelectOpponentsIntent()オプション。デフォルトのプレーヤー選択UIを起動するためのインテントを返します。このUIから、ユーザーはランダムなGoogle+のユーザーと自動マッチする要求したり、他のGoogle+ユーザーをマッチするユーザーとして招待することを選択することができます。
createMatch()新しいターンベースマッチオブジェクトを作成する、または、自動マッチングが要求された場合のユーザーの基準を満たしている既存の試合をロードします。オートマッチングが要求された場合、返される試合は新しい試合または他のプレイヤーがすでにターンを取っている既存の試合のいずれかになります。新しい試合が返された場合、ユーザーは最初のターンを取る必要があります。ゲームは、新規または既存の試合がロードされているかどうかにかかわらず、交替を処理する責任があります。

デフォルトユーザーインターフェースによるプレイヤー選択

Play Games servicesは
public void onStartMatchClicked(View view) {
    Intent intent = 
        Games.TurnBasedMultiplayer.getSelectOpponentsIntent(getApiClient(), 1, 7, true);
    startActivityForResult(intent, RC_SELECT_PLAYERS);
}
以降、未翻訳です。
続きはGoogle Play Game Services — Google Developersを参照してください。


このページのコンテンツはクリエイティブ・コモンズの表示 3.0 ライセンスにより使用許諾されます。サンプル コードは Apache 2.0 ライセンス(リンク先は英語)により使用許諾されます。

2014/05/12

Google Play Services4.3からAPIの一部が変更になっているので、それの対応[リアルタイムマルチプレイヤー編]

Google Play Servicesが3月に4.3(2014/05/12現在は4.4)になり、API周りに変更があります。
 しかしながら、サンプルの方は以前のままでした。今月に入りようやく変更があったので、ButtonClickerを例に記述します。 (※ただし、現時点ではgradle版しか変更されておらず、eclipse版はそのままでした。)

ターンベースマルチプレイヤーについては、ターンベースマルチプレイヤー編の記事を参考にしてください。


final ArrayList invitees = data.getStringArrayListExtra(GamesClient.EXTRA_PLAYERS);
↓
final ArrayList invitees = data.getStringArrayListExtra(Games.EXTRA_PLAYER_IDS);

int minAutoMatchPlayers = data.getIntExtra(GamesClient.EXTRA_MIN_AUTOMATCH_PLAYERS, 0);
↓
int minAutoMatchPlayers = data.getIntExtra(Multiplayer.EXTRA_MIN_AUTOMATCH_PLAYERS, 0);

int maxAutoMatchPlayers = data.getIntExtra(GamesClient.EXTRA_MAX_AUTOMATCH_PLAYERS, 0);
↓
int maxAutoMatchPlayers = data.getIntExtra(Multiplayer.EXTRA_MAX_AUTOMATCH_PLAYERS, 0);

Invitation inv = data.getExtras().getParcelable(GamesClient.EXTRA_INVITATION);
↓
Invitation inv = data.getExtras().getParcelable(Multiplayer.EXTRA_INVITATION);
GamesClient.STATUS_OK
↓
GamesStatusCodes.STATUS_OK
ステータスコードは他にもありますが、GamesClientに定義していたものをGamesStatusCodesにまとめたようです。


参考
playgameservices/android-samples

2014/05/09

Google Play Services4.3からAPIの一部が変更になっているので、それの対応[ターンベースマルチプレイヤー編]

Google Play Servicesが3月に4.3(2014/05/09現在は4.4)になり、API周りに変更があります。
 しかしながら、サンプルの方は以前のままでした。今月に入りようやく変更があったので、SkeletonTbmpを例に記述します。 (※ただし、現時点ではgradle版しか変更されておらず、eclipse版はそのままでした。)

TurnBasedMatch match = data.getParcelableExtra(Games.EXTRA_TURN_BASED_MATCH);
↓
TurnBasedMatch match = data.getParcelableExtra(Multiplayer.EXTRA_TURN_BASED_MATCH);

final ArrayList invitees = data.getStringArrayListExtra(GamesClient.EXTRA_PLAYERS);
↓
final ArrayList invitees = data.getStringArrayListExtra(Games.EXTRA_PLAYER_IDS);

int minAutoMatchPlayers = data.getIntExtra(GamesClient.EXTRA_MIN_AUTOMATCH_PLAYERS, 0);
↓
int minAutoMatchPlayers = data.getIntExtra(Multiplayer.EXTRA_MIN_AUTOMATCH_PLAYERS, 0);

int maxAutoMatchPlayers = data.getIntExtra(GamesClient.EXTRA_MAX_AUTOMATCH_PLAYERS, 0);
↓
int maxAutoMatchPlayers = data.getIntExtra(Multiplayer.EXTRA_MAX_AUTOMATCH_PLAYERS, 0);

GamesClient.STATUS_OK
↓
GamesStatusCodes.STATUS_OK
ステータスコードは他にもありますが、GamesClientに定義していたものをGamesStatusCodesにまとめたようです。


参考
playgameservices/android-samples