コレクションをソートして取り出す際にインデックスつける
コレクションから要素を取り出していく際に、連番をつけたいことがあります。
例えば下記のような文字列の配列を、ソートしてインデックスとともに要素を取得したい、といった場合のTipsです。
"Banana", "Apple", "Melon"
ソートし取り出す際にインデックスつける
C#
C# の場合は、 Selectメソッドにオーバーロードがあり、それを用いることで実現できます。
string[] fruits = { "Banana", "Apple", "Melon" }; foreach(var item in fruits.OrderBy(n => n).Select((v, i) => new {v, i})) { Console.WriteLine($"{item.i} {item.v}"); }
0 Apple 1 Banana 2 Melon
Python
Pythonでは 組み込み関数である enumerate を使います。 enumerateはインデックスと要素をタプルで返してくれます。
fruits = ["Banana", "Apple", "Melon"] for index , item in enumerate(sorted(fruits)): print(index, item)
0 Apple 1 Banana 2 Melon
いずれも、シンプルに実装できますね。
参考
名前空間の名前
C# の場合、namespace はどのように付けたら良いか、以前調べた。
https://msdn.microsoft.com/ja-jp/library/ms229026(v=vs.100).aspx
から抜粋。
一般的な形式
<Company>.(<Product>|<Technology>)[.<Feature>][.<Subnamespace>]
説明
なるほど、名前空間に、企業内の部署名をつけてしまうのは悪手のようだ。
説明(2016 10月更新版)
更新されていたことに気づいたので追記。
https://msdn.microsoft.com/ja-jp/library/ms229026(v=vs.110).aspx
✓は守るべき内容、Xは避けるべき内容。 機械翻訳があれなので、意訳して掲載。
- ✓ 異なる会社が名前空間を同じにすることを防ぐために、名前空間名に会社名を付けること。
- ✓ 名前空間名の第2レベルでは、バージョンに依存しない安定した製品名を使用してください。
- X 企業内のグループ名は有効期間が短い傾向があるため、名前空間の階層内の名前の基準として組織階層を使用しない。
- 関連技術のグループの周囲の名前空間の階層で整理すると良い。
- ✓ pascal 表記を使用し、名前空間をピリオドで区切る (例: Microsoft.Office.PowerPoint)。 ブランド名はこの限りではなく逸脱しても良い。
- ✓ 適切な場所に複数系の名前空間名を使用することを検討してください。
- 例えば、System.Collection の代わりに System.Collections を使用します。ただし、ブランド名や頭字語はこの規則の例外です。例えば、System.IOs ではなく System.IO を使用します。
- X 名前空間とその名前空間の型に同じ名前を使用しないでください。
Windows 10 と Windows 8.1 を判定する
動作しているOSのバージョンを取得して判定する必要があり、 Environment.OSVersion を用いて Major と Minorで判定するようにサンプルコードを動作させてみました。
しかし、Windows 10 でも Windows 8.1 でも Major が 6 のまま。
Windows 10 では majorは 10 のはず...。
サンプル
static void Main(string[] args) { var os = Environment.OSVersion; Console.WriteLine("Version Information:"); Console.WriteLine(" Major: {0}", os.Version.Major); Console.WriteLine(" Minor: {0}", os.Version.Minor); }
解決策
- Visual Studio 2015 にて、マニフェストファイル(app.manifest) を追加。
- Windows 10 の部分のコメントを外してリビルド。
過去の互換性を保つために、OSVersionはWindows8のバージョンを返す仕様のようです。
マニフェストファイルでサポートOSを明示することで回避できます。
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- このアプリケーションがテストされ、協働するようテストされた Windows バージョンの 一覧。適切な要素をコメント解除すると、最も互換性のある環境を Windows が 自動的に選択します。--> <!-- Windows Vista --> <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />--> <!-- Windows 7 --> <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />--> <!-- Windows 8 --> <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />--> <!-- Windows 8.1 --> <!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />--> <!-- Windows 10 --> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" /> </application> </compatibility>
実行結果
- Windows 10 = Major 10 が取得できました
Version Information: Major: 10 Minor: 0
参考
- 作者: arton
- 出版社/メーカー: 翔泳社
- 発売日: 2016/06/09
- メディア: Kindle版
- この商品を含むブログを見る
C# 6.0 言語仕様 [非公式ドラフト版] を見つけた
C# 5.0 (マイクロソフトが公開している最新)
C# Language Specification が 5.0 が公開されています。
Download C# Language Specification 5.0 from Official Microsoft Download Center
Visual Studio 2015から利用可能になった C# 6.0 言語仕様を探したところ、ドラフト版を公開している方(マイクロソフトの中の人)を発見しました。
正式版は、2016年年末までにマイクロソフトから発行される予定で、それまでの公開のようです。
WORD版とPDF版があります。PDF版を見ましたがコードにシンタックスハイライトもしてあって読みやすいです。
C# 6.0 言語仕様
PDF版
https://github.com/ljw1004/csharpspec/blob/gh-pages/CSharp%20Language%20Specification.pdf
リポジトリ
参考
Windows 10にアップグレードしたあと、HDMI オーディオが正常に動作しないためオーディオドライバーを更新した – ThinkPad T440s
下記を参考にオーディオドライバーを更新したところ、解決しました。
更新前
更新前のドライバーバージョンです。
更新後
6.0.1.7522 にアップデートしました。
無事TVに音声が出力されました。 これで拡張ディスプレイにしてニコ生をTV側に表示しながら作業することができますね。
参考
PowerShell で FizzBuzz
コマンドプロンプト(バッチファイル)より、PowerShell が充実していることは確かなので少しずつ使えるようになりたい。
そこでまずは FizzBuzz を実装してみた。
エディタや実行環境は、Visual Studio 2012 (Expressではない) に PowerShell Tools For Visual Studio をインストールした環境を準備*1
コードは以下*2
% で ForEach が書けます。$_ で要素がとれます。PowerShell 力が少し上がりました。
【改訂新版】 Windows PowerShell ポケットリファレンス
- 作者: 牟田口大介
- 出版社/メーカー: 技術評論社
- 発売日: 2013/02/23
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
*1:2012 を使った理由はギョームで使っているからで深い理由はない。2013のほうがよいです。
*2:はてなブログは、PowerShellのシンタックスハイライトに対応してないので、Gists経由で貼り付け
Git for Windows/msysgit で ユーザー名、パスワードの入力頻度を下げる
複数のリポジトリを clone する必要があり、一発 clone するスクリプト書いた。
社内の認証がhttpによる認証のため、毎回user/passwordを入力するのがだるい。
そこで、 http://$user:$password@example.co.jp/git/reponame
みたいな感じで、URL に埋め込んだら動いた。
しかし、git remote -v で URLに平文で丸見え。だめである。
調べたら、cache する仕組みがあるようだ。
環境
- Windows 8.1 Update
- Git for windows (1.9.2)
- msysgit (1.9.0)
結論
まず、結論を。
wincred を用いる。wincred は Git に同梱されている。
$ git config --global credential.helper wincred
いくつかの方法を試したので記録として残しておきます。
credential cache を用いる(Linux)
$ git config --global credential.helper cache
しかし msysgit 上ではエラーになってしまった。
git: 'credential-cache' is not a git command. See 'git --help'.
$ git fetch origin master
git: 'credential-cache' is not a git command. See 'git --help'.
..
git-credential-winstore を使う (Git for Windowsの場合)
ぐぐると、stackoverflowに。
http://stackoverflow.com/questions/11693074/git-credential-cache-is-not-a-git-command
○手順
- ダウンロードする
http://gitcredentialstore.codeplex.com/
ここから git-credential-winstore.exe をダウンロードする。現在の安定版は 1.2 。
- 実行する
- 設定する
$ git config --global credential.helper winstore
下記のようなダイアログが出現しユーザー名とパスワードが一時的に保存されます。
実行
社内
$ time git fetch origin master
..
real 0m21.099s
user 0m0.000s
sys 0m0.015s
社外 (bitbucket)
$ time git fetch bb master
..
real 0m43.869s
user 0m0.015s
sys 0m0.015s
めっちゃ遅い。。
1.4 Beta
$ time git fetch bb master
..
real 1m23.322s
user 0m0.015s
sys 0m0.062s
$ time git fetch origin master
..
real 1m0.874s
user 0m0.000s
sys 0m0.015s
もっと遅い。
git-credential-wincred
git-credential-wincred.exe を試してみる。
こちらは、Git同梱。
$ git config --global credential.helper wincred
社内
$ time git fetch origin master
..
real 0m0.403s
user 0m0.015s
sys 0m0.000s
社外
$ time git fetch bb master
..
real 0m7.669s
user 0m0.015s
sys 0m0.000s
これでいこう。