久しぶりにWindowsの環境構築をした

WindowsのノートPCがやっと修理(交換)から帰ってきたので、あらためてWindowsの環境を構築しました。 用途は主にプログラミングと大学の電子ノートです。今回はそのメモ。

環境

  • Surface Pro 3(RAM8GB/SSD256GB/Corei5)
  • 最新のWindowsまで更新(Windows 10 Creators Update)

昔と比べて、環境を取り戻すのが非常に楽になっています。

続きを読む...

PowerShellの関数をコピーしたりラップしたりする

PowerShellで関数の呼び出しの前後に処理を追加したいとき(ラップすると表現するんですかね?)にハマったのでメモ。

こんなことがしたい。

function hoge{
    ls
}

function hoge{
    echo "lsを呼びます"
    hoge #古いhogeを呼びたい・・・
}

これは当然のことながらhogeを永遠に再起して無限ループになります。

うまくいかない例

C#などでは関数の参照(デリゲート)を変数に入れておいたりすれば後からそれを呼び出せます。PowerShellではうまく行きません。

function hoge{
    ls
}
$a = hoge
# この$aは「hogeの呼び出し結果」が格納されているだけ!
$b = { hoge }
&$b #=> (lsの結果)
# スクリプトブロックを使っていて呼び出すことができる。
function hoge{
    echo "piyo"
}
&$b #=> piyo
# 置き換え後の結果が表示されてしまう・・・

と、上のような方法ではうまくできません。PowerShellはダイナミックスコープのため、実行されたときのhogeの関数を呼び出してしまうためです。

ではどうするか

関数の中身を変数としてアクセスする方法があるので、それを利用するだけです。

$c = $function:prompt
&$c

PowerShellではFunctionをファイルシステムのように扱える「プロバイダ」が用意しているため、上のように$function:promptとすると変数のようにアクセスできます。 なんなら、$function:hoge = "echo test;"+$function:hogeのように文字列として強引に処理をねじ込むことも可能です。

ちなみに、一部の記号などを含む名前の場合、波括弧でくくる必要があります。

# 「-」が区切りと判断され、New関数の中身を見てしまう
function New(){ echo "new function!" }
echo $function:New-Guid #=> echo "new function!"-Guid

# {}でくくる
echo ${function:New-Guid} #=> New-Guid関数の中身

プロバイダについてはここらへんに詳しく書いてあります。 プロバイダとドライブ - Windows PowerShell | ++C++; // 未確認飛行 C

結構検索しても見つからなくて大変でしたが、PowerShellは十分高機能なので大抵のことはできるようになっているので、頑張って探せばきっと答えはある・・・

続きを読む...

セキュキャンのアドバイス&昨年度の応募用紙晒すか・・・

2017年度のセキュリティキャンプ全国大会の募集が開始されてます。
セキュリティ・キャンプ全国大会2017 ホーム:IPA 独立行政法人 情報処理推進機構
セキュリティとかわかる人も、わからない人も良い機会になるはずです。
(自分の無力さを知ることも大切です!)

大学生が多いですが、高校生とか高専生もためらう必要はないと思います。

受験者へ

セキュリティキャンプの応募で求められるのは正解ではなく熱意だそうです。
多少間違っていたり冗長であっても全部書ききった方が良いのではないでしょうか。
具体的な基準はわかりませんが、正解だけ書いてあるとか、文章があまりにも短いのはよろしくないみたいです。

例えば、この年の選択問題【8】なんかは「このプログラムはc@Np2Ol6と入力した時に終了コード0、それ以外で終了コード1で終了するプログラムである。」という1行で終わるところを私は延々と求めるまでの手順を書いています。その手順もあまりに稚拙で恥ずかしかったのですが、熱意を見せるならいっそ書くか、と思って書いて出しました。

あと、基本的にわからないことだらけだったので、めっちゃググりました。はい。
こんなの調べずに全部わかるような輩はそうそういないと思います。

黒歴史を晒す

問題はこちら→https://www.ipa.go.jp/files/000053055.pdf

かなり稚拙で恥ずかしいです。あと、一部はXXXと伏字にさせてくださいorz

あと、ごちうさの問題はシャロちゃん派だったので解きませんでした。

続きを読む...

Micrsoft CompleteでSurface Pro 3のACアダプタ&ペンを交換してもらった

Surface Pro 3の保証でACアダプタを入手

Surface Pro 3をもう二年ぐらい使っているのですが、最近急にACアダプタの調子が悪くなってきました。ケーブルを指してもランプがピカピカして充電できない。どうやらこのあたりが逝ってしまったようです。2年持てばこの手の製品では十分役目を果たしたでしょうが、純正品は高い。(売ってる所見つからなかったけど、過去の販売や海外MS Storeを見ると$80前後)。
こういう時にTypeCが羨ましい。Surface Pro 5がTypeCになったらちょっと惹かれるかも・・・

続きを読む...

.NET Frameworkのライブラリのpublicな名前を探求する

この記事は完全に投稿を忘れていたC# Advent Calendar 2016 - Qiitaの14日目です。

目的

問1「.NET Frameworkの標準ライブラリで一番長いクラス名やメソッド名は?」
問2「publicな”HWND”を含む名前を持つ名前はどう表記するのが適切?」

問1についてはAPI名最長選手権 - Qiitaという記事が2013年にあります。その後の更新などでもっと長い名前がないか確認してみたいものです。

問2については、もう少し実用的。Win32にはウィンドウハンドルを表すHWND型が頻繁に登場します。.NETで扱うときはWindowHandleやHandleといった名前が適切ですが、相互運用の関係上、HWNDをそのまま使いたい状況もしばしばあります。 その時の名前は、一単語とみなしてHwndとするか、Wnd(Windowの略)を意識してHWndの方が正しい気もします。こういうときは、標準ライブラリの命名に従って置くのが間違いありません。

ということで、標準ライブラリのpublicな名前を列挙するソフトを作成してみます。

続きを読む...

Swiperの紹介と、ループのバグらしき挙動に対処する

この記事はOthloTech Advent Calendar 2016 - Qiitaの9日目です。

こんにちは、MIPSのクロスコンパイルができないで影白です。

現在、ChromeのタブをMacのアプリ気切り替えやWindowsのAlt+Tab切り替えと同じようなデザインで切り替える拡張機能を作成しています。 YahooさんのReactJSハンズオンに参加できなかったのでReactJSを自力でやるか!と思い立ったやつです。 現在はまだChromeストアなどには上がってません。動くものがGitHubにありますので、興味があれば見てみてください。(現在は起動条件があまりにマニアックなので、おそらく誰もわかりません。使いたい人がいたらご連絡を・・・)

AruTab

デザインなどについては絶賛調整中ですが、フラットな感じに仕上がる予定。

ReactJSは完全にJavaScriptからソースを生成することになるので、データを元にHTMLをガリガリ書き出したい場合なんかは結構便利。ChromeExtensionでも十分活用可能です。ただし、ChromeExtensionの場合は事前コンパイルしたほうが良さげ。
ただし、万能とはいかずHTMLベースの場合は逆に面倒になりますし、ChromeExtensionのContentScript(Webページ上で実行するスクリプト)はHTMLは元ページのままなので、jQueryの力技でねじ伏せるのが一番楽だなと思いました。

さて、本当は拡張をストアに上げてChromeExtensionについて語ろうかと思ったのですが、色々と間に合わなかったのでそれは諦めました。 というか、ソースがあまりにも汚いので作り直しになります。

今回は、作成中に使ったSwiperというライブラリーの紹介と、バグ対策の記事です。

続きを読む...

Xamarin.FormsとHtmlAgilityPackでスクレイピング!

[初心者さん・学生さん大歓迎!] Xamarin その2 Advent Calendar 2016 - Qiitaの5日目です。

今回はXamarinを使ってスクレイピングに挑戦してみます。
C#ということで、Reference Sourceの検索部分を取得し、解析します。

プロジェクト作成

まず、Xamarin.Forms 入門ガイド - Xamarin : XLsoft エクセルソフトを参考にプロジェクトを作成します。若干分類が変わっていたりしますが、Blank App (Xamarin.Forms Portable)のプロジェクトを作ればOK。 今回は「RSTest」という名前にしたので適宜読み替えてください。
しばらく待つとWindowsのターゲット確認が出ますが、これもそのままでOKボタン。(ターゲット バージョンは最新に、最小バージョンは一番古いのを選択しておけば2016年12月現在、大丈夫です。)

このあと、HtmlAgilityPackを導入するのですが、念のために一度ビルド。それなりに時間がかかりますが、正常なことを確認。まぁ、Xamarinなので。
UWPなら[ビルド]→[構成マネージャ]のUWPの欄の「ビルド」と「配置」にチェックを付ける。
AndroidならAndroidSDKからAPI24以降を消し去るなど、謎の動作が必要ですが、まぁ、頑張ってググってください。

続きを読む...

とりあえず投稿

結局公開する公開する言って何もしてこなかったんですが、気がついたら12月。アドベントカレンダーを書かないといけなくなってきました・・・

しょうがないのでブログを公開です。デザインはデフォルトのままで全然いじってないので、そのうちちゃんとしたものを作ります。ええ、作りますとも・・・

続きを読む...