ThinkPadのショートカットキー

Fn + B     : Break キー
Fn + K     : ScrLK、または Scroll Lock キー
Fn + P     : Pause キー
Fn + S     : SysRq キー
Fn + 4     : PCスリープ
Fn + Space : キーボードのバックライトのON/OFF
Fn + End  : Endキー(FnなしだとInsertになる)

Excelシートコピー時の「名前の定義」重複エラーをなくす方法

 

1.コピー元のExcelで以下のマクロを実行して、非表示となっている全ての「名前の定義」を表示させる。

Public Sub VisibleNames()
    Dim name As Object
    For Each name In Names
        If name.Visible = False Then
            name.Visible = True
        End If
    Next
    MsgBox "完了", vbOKOnly
End Sub

2.Ctrl+F3キーを押下して「名前の定義」を表示。

3.不要な「名前の定義」を削除。

4.シートのコピーを実行。

以上

Vim標準の折り畳み機能を無効にする。

 以下の設定をvimrcに追記すればOKです。

"折り畳みを無効に---------------------------------------------------------
set foldmethod=syntax
let perl_fold=1
set foldlevel=100 "Don't autofold anything

Markdown記法

 

Markdown記法をまとめてみました。


# 見出し1
## 見出し2
### 見出し3

見出し1

見出し2

見出し3



●テキストスタイル


・太字

normal **bold** normal
normal __bold__ normal

normal bold normal
normal bold normal

・斜字

normal *italic* normal  
normal _italic_ normal  

normal italic normal
normal italic normal

・取消し線

normal ~~strikethrough~~ normal

normal strikethrough normal

・太字 and 斜字

**bold *italic* bold**

bold italic bold


●インデント


> hoge
>> foo
>>> bar

hoge

foo

bar

●コード


Gitコマンド

```
git status  
git add  
git commit  
```
git status
git add
git commit


●リンク


[GitHub Pages.](https://pages.github.com/)

GitHub Pages.

●リスト


Disc型

* list1
+ list2
- list3
    * list3-1
        + list3-1-1
    - list3-2
  • list1
  • list2
  • list3
    • list3-1
      • list3-1-1
    • list3-2


Decimal型

1. list1
1. list2
1. list3
  1. list1
  2. list2
  3. list3

Definition型

<dl>
    <dt>タイトル1</dt>
    <dd>内容</dd>
    <dt>タイトル2</dt>
    <dd>内容</dd>
</dl>
タイトル1
内容
タイトル2
内容


●タスクリスト


- [x] task1
- [ ] task2
- [ ] task3


●水平線


---
***
___





●テーブル


|ヘッダ1|ヘッダ2|ヘッダ3|ヘッダ4|
|---|:---:|---:|---|
|左寄せ|中央揃え|右寄せ|改行|
|12344567890|12344567890|12344567890|foo<br/>bar|
ヘッダ1ヘッダ2ヘッダ3ヘッダ4
左寄せ中央揃え右寄せ改行
123445678901234456789012344567890foo
bar


VimでMarkdown編集

deinを使ってインストール


Markdown編集関連

[[plugins]]
repo = 'plasticboy/vim-markdown'
on_ft = ['markdown','mkd']

quote内のプログラムをシンタックスハイライトする

[[plugins]]
repo = 'joker1007/vim-markdown-quote-syntax'
on_ft = ['markdown','mkd']

編集中のMarkdownファイルのプレビューを作成する

[[plugins]]
repo = 'kannokanno/previm'
on_ft = ['markdown','mkd']

プレビューをブラウザで開いてくれる

[[plugins]]
repo = 'tyru/open-browser.vim'
on_ft = ['markdown','mkd']

プレビュー表示するには

:PrevimOpen`

PMBOKの要求事項収集プロセス

PMBOKの要求事項収集プロセスの技法をまとめてみた。

●要求事項収集プロセス
プロジェクト目標を達成するために、ステークホルダーのニーズを定義・文書化するプロセス。
インプット 技法 アウトプット
・プロジェクト憲章
・ステークホルダー登録簿
・インタビュー
・フォーカス・グループ
・ファシリテーション型ワークショップ
・グループ発想技法
・グループ意思決定技法
・アンケートと調査
・観察
・プロトタイプ
・要求事項文書
  →WBS
・要求事項マネジメント計画書
  →プロジェクトマネジメント計画書
・要求事項トレーサビリティ・マトリックス
  →スコープ検証、スコープコントロール

●ヒアリング技法
用語 説明 備考
インタビュー ・ステークホルダーと直接会話して、必要な情報を見出す方法。
・予定した質問と、話の展開に応じた質問を行い、回答を記録する。
・公式、非公式、どちらの場合もある。
・「一対一」の形式が多いが、質問者や回答者が複数の場合もある。
フォーカス・グループ ・一定の条件を満たした参加者を集めて、期待や意見の聞き取り調査をすること。
・司会役(モデレーター)が参加者同士の会話を促進させて、意見を引き出す。
ファシリテーション型ワークショップ ・主要なステークホルダーを集めて、集中的に意見調整する
・要求事項を迅速に定義し、ステークホルダー間の際を迅速に調整する、基本的な技法。
・適切なファシリテーションの元で、信頼構築、関係強化、コミュニケーション改善が図れる。
・ステークホルダーの合意の可能性を高める。
・迅速に問題が発見・解決される。

●グループ発想技法
用語 説明 備考
ブレーンストーミング 自由で幅広い発想を得るための会議方法の一つ。
以下の4原則
・批判厳禁(アイディアを批判してはいけない)
・自由奔放(自由で突飛なアイディアを歓迎する)
・質より量(とにかく沢山のアイディアを出す)
・結合改善(アイディアに便乗したり、アイディア同士をつなげたりする)
ノミナル・グループ法 ブレーンストーミングに投票プロセスを加え、結論を出す方法。
デルファイ法 ・質問・回答・フィードバックのプロセスを繰り返して合意形成する方法。
・回答者は匿名とする。
・匿名性なので、特定の人が結果に対して過度の影響を及ぼさない。
アイデア・マップ法
マインド・マップ法
アイデアを単一のマップにまとめて、理解の共通点や違いを明確化するための技法。
親和図 はっきとしない問題や漠然とした状況に対して、課題を整理して構造化する手法の一つ。
言葉の意味や親和性によってグルーピングして図に表すことで、問題の本質を明らかにする。

●グループ意思決定技法
用語 説明 備考
満場一致 全員が同意することを条件とする。 Unanimity
過半数の50% 参加者の50%を超える支持によって決定する。 Majority
相対多数 過半数に達しなくても、最大票数の意見が選ばれる。 Plurality
独裁 一人の個人がグループの意思を決定する。 Dictatorship

Vimでマッチング操作

Vimでよく使う、マッチングコマンドです。
様々なシーンでのデータ処理に使えるので知っておくと便利です。

重複する行だけにする
  :%!sort|uniq -d
  ※uniqコマンドを利用するには、mingwをインストールしてパスを
   通しておく必要があります。

マッチする行を削除
  :g/hoge/d

マッチしない行を削除
  :v/hoge/d

C#でGoogle Maps APIを使う(2点間の移動時間を取得)

先日の続編で2点間の移動時間を取得するメソッドを実装してみました。
ポイントは、移動モードを指定するところです。
現在、日本での利用では、driving(車), walking(徒歩)の2種類の移動時間取得のみに制限されています。

  1. public class GoogleMapsApiUtil {
  2.  
  3. public enum MovingMode : int {
  4. driving = 1, //車
  5. //transit, //電車 ←日本ではサポート外
  6. walking, //徒歩
  7. //bicycling //自転車 ←日本ではサポート外
  8. }
  9.  
  10. ///
  11. /// 2点間の車での移動時間を取得
  12. ///
  13. ///
  14. ///
  15. ///
  16. ///
  17. public static double GetDuration(string origin, string destination, MovingMode mode, string apiKey) {
  18. double ret = 0;
  19. WebResponse response = null;
  20. try {
  21. string url = @"https://maps.googleapis.com/maps/api/distancematrix/json?origins=" +
  22. origin + "&destinations=" + destination + "&mode=" + mode.ToString() + "&key=" + apiKey;
  23.  
  24. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  25. response = request.GetResponse();
  26. Stream dataStream = response.GetResponseStream();
  27. StreamReader sReader = new StreamReader(dataStream);
  28. string jsonString = sReader.ReadToEnd();
  29. Debug.Write(jsonString);
  30.  
  31. var jo = JObject.Parse(jsonString);
  32. JToken jt = jo.SelectToken("$.rows..elements..duration.value");
  33. ret = double.Parse(StringUtil.NullBlankToZero(jt.ToString()));
  34.  
  35. return ret;
  36. } finally {
  37. response.Close();
  38. }
  39. }
  40. }

C#でGoogle Maps APIを使う(2点間の距離を取得)

Google Maps APIを使って2点間の距離を取得するメソッドを実装してみました。

  1. public static double GetDistance(string origin, string destination, string apiKey) {
  2. double ret = 0;
  3. WebResponse response = null;
  4. try {
  5. string url = @"https://maps.googleapis.com/maps/api/distancematrix/json?origins=" +
  6. origin + "&destinations=" + destination + "&key=" + apiKey;
  7.  
  8. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  9. response = request.GetResponse();
  10. Stream dataStream = response.GetResponseStream();
  11. StreamReader sReader = new StreamReader(dataStream);
  12. string jsonString = sReader.ReadToEnd();
  13. Debug.Write(jsonString);
  14.  
  15. var jo = JObject.Parse(jsonString);
  16. JToken jt = jo.SelectToken("$.rows..elements..distance.value");
  17. ret = double.Parse(StringUtil.NullBlankToZero(jt.ToString()));
  18.  
  19. return ret;
  20. } finally {
  21. response.Close();
  22. }
  23. }

例えば「origin:東京」-「destination:大阪」を指定してリクエストを投げると、以下の形式のJSONが返されるので、
JSONPathを使って、距離の部分を抜き出して戻り値にセットしています。

●例)「東京」-「大阪」間でリクエストを投げた時のJSON取得結果
  1. {
  2. "destination_addresses" : [ "Osaka, Osaka Prefecture, Japan" ],
  3. "origin_addresses" : [ "Tokyo, Japan" ],
  4. "rows" : [
  5. {
  6. "elements" : [
  7. {
  8. "distance" : {
  9. "text" : "513 km",
  10. "value" : 512545
  11. },
  12. "duration" : {
  13. "text" : "6 hours 16 mins",
  14. "value" : 22563
  15. },
  16. "status" : "OK"
  17. }
  18. ]
  19. }
  20. ],
  21. "status" : "OK"
  22. }
  23.  

Simple Injectorを使ってみた


手軽に利用できるDIコンテナ「Simple Injector」を使ってみました。
パッケージ開発のアドオンの受け口などで活用できそうです。

●このデモで利用するクラス一覧
クラス/インタフェース 説明
Program.cs このクラスで以下の処理を行います。
・コンテナ生成
・注入オプジェクト登録
・コンテナの登録内容の検証
・InjectionTargetClassのメソッドを実行
IProxy.cs 注入オブジェクトのインタフェースです。
HogeProxy.cs 注入オブジェクトの具象クラス。
FooProxy.cs 注入オブジェクトの具象クラス。
BarClass.cs 注入オブジェクトの具象クラス。(IProxyは実装していない。)
InjectionTargetClass.cs オブジェクト注入対象のクラスです。
このクラスで注入されたオブジェクトを利用します。
コンストラクタの引数に注目してください。
コンテナに登録されたオブジェクトが渡されます。

●Program.cs
  1. using SimpleInjector;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace SimpleInjectorInConsoleApp {
  9. class Program {
  10.  
  11. private static Container container;
  12.  
  13. static void Main(string[] args) {
  14. container = new Container();
  15.  
  16. //デフォルトのLifestyleを確認
  17. Console.WriteLine("デフォルトのLifestyle : " + container.Options.DefaultLifestyle.ToString());
  18.  
  19. container.Register(Lifestyle.Singleton);
  20. //登録をFooProxyに切替えると、利用側のクラスを変更せずに処理を切り替えれます。
  21. //container.Register(Lifestyle.Singleton);
  22. //コンストラクタにRegister()していないTypeの引数を渡す方法
  23. container.Register(() => new BarClass("bar"), Lifestyle.Singleton);
  24. container.Verify();
  25. // Useコンテナに登録していないが、コンストラクタインジェクションを行って必要な
  26. // オブジェクトを設定してインスタンスを作成してくれる。 (auto-wiring)
  27. var a = container.GetInstance();
  28. a.Write();
  29. //自動でコンソールが閉じるの防ぐ
  30. Console.ReadLine();
  31. }
  32. }
  33. }

●IProxy.cs
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace SimpleInjectorInConsoleApp {
  9. ///
  10. /// インタフェース
  11. ///
  12. public interface IProxy {
  13. void Write();
  14. }
  15. }

●HogeProxy.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace SimpleInjectorInConsoleApp {
  9. ///
  10. /// 注入クラスHoge
  11. ///
  12. class HogeProxy : IProxy {
  13. public void Write() {
  14. Console.WriteLine("hoge");
  15. }
  16. }
  17. }

●FooProxy.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace SimpleInjectorInConsoleApp {
  9. ///
  10. /// 注入クラスFoo
  11. ///
  12. class FooProxy : IProxy {
  13. public void Write() {
  14. Console.WriteLine("foo");
  15. }
  16. }
  17. }

●BarClass.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace SimpleInjectorInConsoleApp {
  8. ///
  9. /// 注入クラスBar
  10. /// ※ IProxyを実装していない
  11. ///
  12. public class BarClass {
  13. private string val = "";
  14. public BarClass(string str) {
  15. val = str;
  16. }
  17.  
  18. public void Write() {
  19. Console.Write(val);
  20. }
  21. }
  22. }

●InjectionTargetClass.cs
  1. using SimpleInjector;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace SimpleInjectorInConsoleApp {
  9. ///
  10. /// オブジェクト注入対象クラス
  11. ///
  12. public class InjectionTargetClass {
  13. private readonly IProxy _proxy;
  14. private readonly Container _container;
  15. private readonly BarClass _dummy;
  16.  
  17. public InjectionTargetClass(IProxy proxy, Container container, BarClass dummy) {
  18. _proxy = proxy;
  19. _container = container;
  20. _dummy = dummy;
  21. }
  22.  
  23. public void Write() {
  24. _proxy.Write();
  25. Console.WriteLine("注入コンテナのDefaultLifestyle : " +
  26. _container.Options.DefaultLifestyle);
  27. _dummy.Write();
  28. }
  29. }
  30. }

●実行結果

Sencha ExtJs ModernでIFRAMEを組込む

Ext.ux.IFrameは、Classic Toolkitのみで提供されています。
Modern Toolkitでは、Ext.Panelのhtmlプロパティ等にiframeタグを直接記入することにより実現できます。

以下のサンプルは、クロスドメインにならないように同じサイトの別のサンプルをIFRAMEで表示します。
デモ&ソース

Sencha ExtJs ModernでLoadMaskを実装

LoadMaskの実装方法をメモ。
Ext.deferを使って、非同期処理完了後にmask.hide()を呼び出すのがポイント。

以下のサンプルは、「Run」ボタンタップ後、5秒間LoadMaskを表示し、後続処理を実行します。
デモ&ソース

厳選 Visual Studioの便利なショートカット

  エラー箇所にジャンプ 「Ctrl + Shift + F12」 ブレークポイント 設定/解除 「F9」 有効化/無効化 「Ctrl + F9」 ViEmu特有 「:ls」:バッファナンバーのリストを表示。 「:b2」:バッファ2のファイルを開く。 「:n」:次のバッファのファ...