FSharp プロジェクトでビルドしたexeをClickOnceで配布できるように

さて、アイコンも付けたし配布したいですよね。
ということでClickOnceを使って簡単に配布できるようにしましょう。

ClickOnceとは

ClickOnce は、ユーザーとの最小限の対話によってインストールして実行できる、自己更新型の Windows ベースのアプリケーションの作成を可能にする配置テクノロジです。

ClickOnce の配置の概要 | Microsoft Docs
自己更新型なのがすごいところでアプリケーションの起動時や終了時、設定時間毎に新しいバージョンがないか確認しにいって半自動更新も強制更新もできます。
Visual StudioはFSharpプロジェクトのClickOnceをサポートしていないのでコマンドラインツール(Mage.exe)を使ってやります。
GUIツール(MageUI.exe)もありますが今回は使っていません。(随時確認には使いました。)

対象読者

FSharpプロジェクトでビルドしたexeをClickOnceで配布したい人
ClickOnceコマンドラインツール(Mage.exe)でやりたい人

手順

  • 署名用ファイルを作成する
  • 初期配置ファイルを作成する
  • マニフェストファイルを作成する
  • マニフェストファイルに署名する
  • 配置ファイルを作成する
  • 配置ファイルに署名する

上2つは初回のみの作業で、下4つはリリース毎に行う作業になる想定です。

フォルダ階層図

以前作ったIconSampleプロジェクトにClickOnceを適用します。詳細は下で説明します。

   ClickOnce
   ├─init-publish.bat                  ・・・初期配置ファイル作成で一回だけ使うバッチ
   ├─publish.bat                       ・・・更新用配置ファイル作成を行うバッチ
   ├─cert-files                        ・・・署名用ファイルを格納
   │  └─make-cert.bat                 ・・・署名用ファイル作成で一回だけ使うバッチ
   └─publish                           ・・・配置ファイルを格納
       ├ IconSample.application         ・・・初期配置ファイル、更新用配置ファイル
       ├ IconSample_X.X.X.X.application
       ├ IconSample_Y.Y.Y.Y.application
       └─ApplicationFiles              ・・・各バージョンのモジュールを格納
           ├─IconSample_0.0.0.0        ・・・初期配置ファイル用モジュールを格納
           ├─IconSample_X.X.X.X        ・・・バージョン毎のマニフェストファイルを格納
           └─IconSample_Y.Y.Y.Y

署名用ファイルを作成する

以下サイトの、"証明書ファイルの作成"の項を参考にしました。
csc.exeでClickOnceアプリケーションをコンパイルし、mage.exeで配置する - Symfoware

makecert.exeとpvk2pfx.exeで作ります。なければWindowsSDKをインストールするなどして入手してください。
"password"は各自変更してください。

管理者権限のコマンドプロンプトで実行します。

make-cert.bat

set makecert="C:\Program Files (x86)\Windows Kits\10\bin\x64\makecert.exe"
%makecert% -r -pe -n "CN=SYM" -sv symfo.pvk symfo.cer

set pvk2pfx="C:\Program Files (x86)\Windows Kits\10\bin\x64\pvk2pfx.exe"
%pvk2pfx% -pvk symfo.pvk -spc symfo.cer -pfx symfo.pfx -po "password"

途中でダイアログが出てきますが、今回は署名すること自体が目的ではないためNoneを選びます。
symfo.pvk, symfo.cer, symfo.pfxの3ファイルが出力されますのでcert-filesフォルダに移動しておきましょう。
(今気づいたけど、出力ファイル名が完全に参考サイト名由来(symfowareさん)のものだ・・・、変更しましょう)
署名に使うのでセキュリティとか気にする人は各自きちんと調べてください。
何かあっても責任は負いません。

初期配置ファイルを作成する

publish/ApplicationFiles/IconSample_0.0.0.0フォルダを作成して暫定でよいのでexeやdll等のモジュールを放り込みます。
mage.exeがなければWindowsSDKをインストールするなどして入手してください。

APP_NAME等は各自変更してください。
コマンドプロンプトで実行します。

init-publish.bat

set MAGE="C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\mage.exe"

set APP_NAME=IconSample
set CERT_FILE="cert-files\symfo.pfx"
set OUTPUT_DIR=publish
set BIN_DIR=%OUTPUT_DIR%\ApplicationFiles\%APP_NAME%_0.0.0.0
set PROVIDER_URL="http://127.0.0.1/IconSample.application"

%MAGE% ^
-New Application ^
-ToFile %BIN_DIR%\%APP_NAME%.exe.manifest ^
-Name %APP_NAME% ^
-Version 0.0.0.0 ^
-FromDirectory %BIN_DIR% ^
-Processor "x86" ^
-IconFile myicon.ico

%MAGE% ^
-New Deployment ^
-ToFile %OUTPUT_DIR%\%APP_NAME%.application ^
-AppManifest %BIN_DIR%\%APP_NAME%.exe.manifest ^
-Version 0.0.0.0 ^
-Install true ^
-ProviderURL %PROVIDER_URL% ^
-IncludeProviderURL true ^
-Processor "x86" ^
-Publisher "sunotora" 

まず、-New Applicationで暫定のマニフェストファイルを作ります。
マニフェストファイルというのは、バージョン毎の配布モジュールリストみたいなものです。
各モジュールのチェックサムが格納されており、後で行う作業では証明書で署名します。
そのため署名後にモジュールを変更するとClickOnceインストール時にエラーになりますので注意してください。

次に、下の-New Deploymentで初期配置ファイルを作ります。
以後の更新用配置ファイルはこれを上書きして作るので、ここでできたIconSample.applicationをリポジトリに入れておくと楽だと思います。
(元ファイルの指定と出力先の指定が可能なので、一つ上の階層に置いて上書きせずに使ったほうがよさそうではある。)

これで初回のみの作業が完了です。オプションの説明は後でしますが、
Installオプションだけはここだけの設定です。
trueにするとアプリケーションがWindowsにインストールされオフラインでも使えるようになります。
その変わりアプリケーションの更新確認タイミングがアプリケーション終了時に固定されます。(対処方法は後述)

マニフェストファイルを作成する以後の残りの工程

面倒くさいのでバッチファイルでまとめてやれるようにしました。

そういえば--nowin32manifestオプションを付けてビルドしたexeでないとインストール時エラーになるのでここで付けておきましょう。

リビルドし終わったらpublish/ApplicationFiles/IconSample_0.0.0.1にモジュールを入れます。

あれやこれやは各自変更してください。
コマンドプロンプトで実行します。

publish.bat

@echo off
rem ####################################################
rem # Make ClickOnce deployment manifest
rem ####################################################
if defined NEW_VERSION goto equipment
set NEW_VERSION=0.0.0.1

:equipment
rem ####################################################
rem # Equipment
rem ####################################################
if defined MAGE goto findMage
set MAGE="C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\mage.exe"

:findMage
echo %PROVIDER_URL%
if defined PROVIDER_URL goto findClientProviderUrl
set PROVIDER_URL="http://127.0.0.1/IconSample.application"

:findClientProviderUrl
set APP_NAME=IconSample
set CERT_FILE="cert-files\symfo.pfx"
set OUTPUT_DIR=publish
set BIN_DIR=%OUTPUT_DIR%\ApplicationFiles\%APP_NAME%_%NEW_VERSION%

rem ####################################################
rem # Main Proc
rem ####################################################

%MAGE% ^
-New Application ^
-ToFile %BIN_DIR%\%APP_NAME%.exe.manifest ^
-Name %APP_NAME% ^
-Version %NEW_VERSION% ^
-FromDirectory %BIN_DIR% ^
-Processor "x86" ^
-IconFile myicon.ico

%MAGE% ^
-Sign %BIN_DIR%\%APP_NAME%.exe.manifest ^
-CertFile %CERT_FILE% ^
-Password "password"

%MAGE% ^
-Update %OUTPUT_DIR%\%APP_NAME%.application ^
-AppManifest %BIN_DIR%\%APP_NAME%.exe.manifest ^
-Version %NEW_VERSION% ^
-ProviderURL %PROVIDER_URL% ^
-IncludeProviderURL true ^
-Processor "x86" ^
-Publisher "sunotora"

powershell ./convert.ps1 %OUTPUT_DIR%\%APP_NAME%.application

%MAGE% ^
-Sign %OUTPUT_DIR%\%APP_NAME%.application ^
-CertFile %CERT_FILE% ^
-Password "password"

echo F | xcopy %OUTPUT_DIR%\%APP_NAME%.application %OUTPUT_DIR%\%APP_NAME%_%NEW_VERSION%.application /Y

goto endProc

:fail
exit /b 1

:endProc

Main Procの最初と二番目のコマンドでマニフェストファイルを作成・署名します。
上でも書きましたが、署名後にpublish/ApplicationFiles/IconSample_0.0.0.1内のモジュールは変更できません。

New Applicationオプションの説明
オプション、引数 説明
-ToFile %BIN_DIR%\%APP_NAME%.exe.manifest マニフェストファイル作成場所
-Name %APP_NAME%              アプリケーション名
-Version %NEW_VERSION%           新バージョン
-FromDirectory %BIN_DIR%          モジュール格納フォルダ
-Processor "x86"              アプリケーションを実行するマイクロプロセッサのアーキテクチャ。付けないと警告が出たので。
-IconFile myicon.ico            すべてのプログラムやスタート画面のピン留めで指定したアイコンファイルが使われる。
-FromDirectory内に指定したアイコンファイルが入っている必要がある。
(Mage.exeのドキュメントには完全パスを指定するとか書かれているが嘘)

Signのオプションはほぼ固定となるので割愛します。

3番目と4番目のコマンドで更新用配置ファイルを作成・署名します。
署名の前にpowershellが挟んでありますが、
これで更新確認タイミングをアプリケーション終了時から起動時に変更しています。
なんで-Install trueにするとアプリケーション終了時になるんだろうか、謎。

(単純な文字列置換なので、あまりよろしくないやつ)

Updateオプションの説明
オプション、引数 説明
-Update %OUTPUT_DIR%\%APP_NAME%.application   初期配置ファイル、または前回の更新用配置ファイルを指定
-AppManifest %BIN_DIR%\%APP_NAME%.exe.manifest 署名したマニフェストファイルを指定
-Version %NEW_VERSION%             新バージョン(マニフェストファイルと合わせる必要がある)
-ProviderURL %PROVIDER_URL% アプリケーションの更新チェックURLを指定
-IncludeProviderURL true -ProviderURLの値が含まれているかどうか(上記で指定しているのでtrue)
-Processor "x86"                -New Applicationと同じ
-Publisher "sunotora"              発行元。プログラムの追加と機能に表示されたり、すべてのアプリ - 発行元 - アプリ名に登録されたりする
-MinVersion %NEW_VERSION%(おまけ)        更新確認時に実行中アプリバージョンがこのバージョン以下だったら強制更新される配置ファイルが作成できる

Mage.exeの詳しいドキュメントはこちら
Mage.exe (マニフェストの生成および編集ツール) | Microsoft Docs

IconSample.applicationをIconSample_0.0.0.1.applicationにコピーしているのは念のため。
あとはIconSample.applicationとApplicationFiles\IconSample_0.0.0.1の中身をPROVIDER_URLに配置すれば配布準備完了です。
※publishがContextRootみたいなイメージ
インストール自体はできあがったIconSample.applicationをその場所で実行することでも可能です。

Sample

バッチとかClickOnce用ファイルをgithubに置いてみました。
ツール場所の調整や証明書ファイルとかバージョンフォルダ作成、モジュール配置は各自行う必要がありますがClickOnceを試すことができるはずです。

GitHub - sunotora/FSharpIconSample

まとめ

FSharp プロジェクトでビルドしたexeをClickOnceで配布できるようになった。

F#プロジェクトでビルドしたexeにアイコンをつける(追記)

(2016/9/26) アイコン表示サイズ, github追記しました

対象読者と動作環境

FSharpプロジェクトでビルドしたexeにアイコンを付けたい人とWindowsアプリのアイコン作っていてサイズどうすればいいか迷っている人向け
動作環境はWindows10, Visual Studio 2015
簡単に流れを書いておくと、アイコンを準備して、アイコンリソース作成、F#プロジェクトに設定してリビルドする

アイコンの準備

表示されているときにどのサイズのアイコンが表示されているかわかるように16, 24, 32, 48, 64, 96, 128, 256pxのアイコンをやっつけで作った。

ちなみにここWindows previous versions documentation | Microsoft Docsをみると

アプリケーション アイコンおよびコントロール パネルのアイテム: 16 × 16、32 × 32、48 × 48、256 × 256 でフル セットとなります。(コードで 32 〜 256 に拡大縮小します)。
.ico ファイル形式である必要があります。クラシック モードの場合、フル セットは 16 × 16、24 × 24、32 × 32、48 × 48 および 64 × 64 になります。

と書いてある。作りすぎた。

アイコンファイル(.ico)への変換は@Icon変換を使ってmyicon.icoというファイル名にした。
@icon変換 - 画像とアイコンの相互変換ツール。favicon作成にも。

リソースファイルの作成

まず、適当な名前でリソーススクリプトファイル(.rc)を作る。自分はmyicon.rcとした。
中身は下記のとおり。

MYICON ICON "myicon.ico"

アイコンリソースを記述するときはnameID ICON fileNameの順番で書く必要があり、
nameIDは、プログラムからリソースを呼び出すときの識別子になるらしい。
Win32APIで使う場合は気にする必要がありそうだが、今回は気にしないでよさそう。
リソース

二番目の"ICON"はICON文のため固定、ファイル名は各自で作ったアイコンファイル名にする。

次に、アイコンファイルとリソーススクリプトファイルをrc.exeがあるフォルダにコピーする。
自分の環境ではC:\Program Files (x86)\Windows Kits\10\bin\x64\rc.exeにあった。
なければ、WindowsSDKをインストールするなどして入手する。
管理者権限でコマンドプロンプトを起動して下記のコマンドを発行すると、リソースファイル(myicon.res)ができる

rc myicon.rc

※拡張子.resのファイルはリソースファイルではなく正確には、Compiled Resource Scriptファイルというみたい。

F#プロジェクトに設定する

リソースファイルを設定したいF#プロジェクトのfsprojと同階層にコピーする。
F#プロジェクトを開き、ソリューションエクスプローラーからプロジェクトを右クリックしてプロパティを開く。
アプリケーションタブでリソースファイルとして設定してもよいが、絶対パスとなってしまうため共同開発している場合はビルドタブのその他のフラグに下のように追記する。

--win32res:myicon.res


リビルドすれば、exeが設定したアイコンになる。

アイコン表示サイズ

エクスプローラ

エクスプローラー表示はCtrl+ホイール上下で同項目であってもサイズが変えられ、アイコン表示も変わる場合があるが、
リボンの表示で切り替えたときに表示されるアイコンサイズを記載した。


(追記)フルセットで使われるサイズのアイコンを一つずつ除いたパターンを追加
フルセットとの差分を赤字にした。
※ここで言っているフルセットとはアイコンの準備で作った8サイズのアイコンを指す。
組み合わせをやる予定は今のところなし

エクスプローラ 特大アイコン 大アイコン 中アイコン 小アイコン 一覧 詳細 並べて表示 コンテンツ
フルセット 256 256 48 24 24 24 48 32
24pxなし 256 256 48 16 16 16 48 32
32pxなし 256 256 48 24 24 24 48 48
48pxなし 256 256 64 24 24 24 64 32
256pxなし 48 48 48 24 24 24 48 32
タスクバーなど
タスクバー 起動中ウィンドウの左上アイコン スタートメニューすべてのアプリ スタート画面ピン留め(中) スタート画面ピン留め(小)
フルセット 32 24 32 32 24
24pxなし 32 16 32 32 32
32pxなし 48 24 24 48 24
48pxなし 32 24 32 32 24
256pxなし 32 24 32 32 24

github

プロジェクトをgithubに上げてみた。アイコンがexeに適用されている画像を貼っていないので見たい人は実物をどうぞ。
GitHub - sunotora/FSharpIconSample

  • IconSampleがフルセットでIconSample_noXXXがXXXを除いたプロジェクト
  • プロジェクトが分かれているのはリソースファイルを変更してリビルドしてもアイコンリソースが正しく適用されないことがあるため(古い情報が残ってしまう?)
  • タスクバー、起動中ウィンドウの左上アイコンを確認するためにFWindowsAppWPFMVVMテンプレートの初期状態を使った。

転職しました


3年弱務めた某派遣会社を退職して5月12日から株式会社オンザロードへ転職しました。
ちょっと変わったSIerです。まだ2日しか行ってませんがだいぶ変わってると思います。
どう変わってるかはうまく言語化できません。


なんかだらだら書いてしまったのであんま興味ない人は何か送付して回れ右してください。
http://www.amazon.co.jp/registry/wishlist/2WSPT5DPEYOQJ


転職に至るまでにあれこれあったのですが、まずは退職の理由と前職(派遣先含む)の不満点とかあれこれを箇条書きにしてみたいと思います。
・フィギュア置けない
・スリッパ履けない
・提案してという割に提案が受け入れられない
・PCスペックしょぼい
・遠い(物理)
・派遣に未来が見いだせなくなった
・健康診断時に血液検査すらなくなった
・メンターいない
・スキル?何それ食えるの?
・カエルの煮物になりたくない(https://ja.wikipedia.org/wiki/%E8%8C%B9%E3%81%A7%E3%82%AC%E3%82%A8%E3%83%AB


あれこれあげましたが、前職(派遣)にいる限りどうしようもない感じです。
自分でなんかやればいいじゃんという声があるかと思いますが、
私はtwitterのプロフィールに挙げている通り"うちに帰るとなにもやらない系エンジニア"です。要するにダメ人間です。つらい。


そしてもう一つ、むすこ氏が1歳になりあれこれ考え始めました。(あ、むすこ氏かわいいよ。かわいいよむすこ氏。)
親父が派遣とかあんまりカッコよくないよなーとかわし氏、むすこ氏に親父としてしてやれること全然ないんじゃね?とか
要するに空っぽなんですよね私。"俺、ココすごい"みたいな引き出しほとんどない・・・。


Javaエンジニアとして、ハケンギョーカイとして求められる一定レベルには達している(と思っている)ものの
いろいろどん詰まりで、あとは自分でどうにかしないといけない状態でした。
勉強会とか行くとこわい人のこわい話題はほとんどわからない状態です。
3年前のScala勉強会に行ってからなごやこわい界隈の方々と知り合い、すごいなー、やばいなーだけで過ごしてきましたが、ようやく重い腰をあげることにしたのです。
"周回遅れでも走り出すのなら尊い"と言ってくれた人がいます。周回遅れでもなごやこわいの末席に位置したいのです。
"とりあえずうちに来ればいいじゃん"と言ってくれた人がいます。今その人の隣の席です、なごやで一番やばい場所の一つです。
何も持たないカエルが身一つでどうにかなるのか自分で実験してやるのです。やってやるのですよ!!!!


最後まで読んでくれてありがとうございます。ほしいものリストはこちらです。
http://www.amazon.co.jp/registry/wishlist/2WSPT5DPEYOQJ

ストレングスファインダーやってみた

以下結果(TOP5が表示されるらしい)


自分だけの特長的な資質

The Gallup Organizationが長年に渡って実施してきた調査によると、仕事を最も効果的に行うのは、自分の強みと行動を理解している人たちです。 このような人たちは、仕事や家庭生活で日々求められていることをやりこなす戦略的な能力に優れています。

自分にどのような知識やスキルがあるかを確かめることによって、基本的な能力はわかりますが、自分の本来の資質に気付き理解することによって、どのような行動を取ることで将来成功を収められられるかがわかります。

「自分だけの特長的な資質」のレポートは、あなたのStrengthsFinderの結果に基づき、上位5つの資質を強い順に並べたものです。 全34項目中、これらの資質があなたの強みの上位5つです。

「自分だけの特長的な資質」は、資質を最大限に活かし、将来の成功につなぐ手がかりとなります。 個々の資質に着目したり全体を概観することで、自分にどのような資質があるかをよく把握することができ、さらにそれらを強みとして成長させ、仕事やプライベートの両面で一貫してよい結果を得ることができます。

調和性

あなたは同意点を求めます。あなたは、衝突や摩擦から得るものはないという考えを持っているため、そのような争いを最小限にしようとします。周囲の人々が異なる意見を持っていることが分かると、あなたはその中の共通する部分を見出そうとします。あなたは彼らを対立から遠ざけて調和に向かわせようとします。事実、調和はあなたの行動を左右する価値観の一つです。人々が自分の意見を他人に押しつけるために無駄にしている時間の多さは、あなたには信じがたいほどです。もし私たちが意見を述べることを控え目にし、代わりに同意や支援を求めるようにすれば、皆がもっと生産的になれるのではないでしょうか? あなたはそうなると信じています。そしてその信念によって生きています。他の人が自分の目標や、主張や、強く抱いている意見を声高に話している時、あなたは沈黙を守ります。他の人がある方向に動き出すと、あなたは調和という名のもとに(彼らの基本的価値観があなたの価値観と衝突しない限り)、喜んで彼らに合わせてあなた自身の目標を修正するでしょう。他の人たちが自分たちのお気に入りの理論や考えについて議論を始めると、あなたは論争を避ける方向に持っていき、全員が賛同できる、実用的で地に足の着いた事柄について話すことの方を取ります。あなたの見方では、私たちは全員同じ船に乗り合わせていて、この船をこれから行こうとしている所に到着させる必要があるのです。それはしっかりした船です。単に自分が船を揺することをできることを示すために、わざわざ船を揺する必要などないのです。

回復志向

あなたは問題を解決することが大好きです。さらなる困難に遭遇するとうろたえる人もいますが、あなたはそれによって力を与えられます。あなたは症状を分析し、何が悪いのかを突き止め、解決策を見い出すという挑戦を楽しみます。あなたは現実的な問題を好むかもしれないし、抽象的な問題、あるいは個人的な問題を好むかもしれません。あなたはこれまでに何度もぶつかって、解決できる自信がある分野の問題を探し求めるかもしれません。あるいは、複雑で馴染みのない問題に直面したとき、あなたは最もやり甲斐を感じるかもしれません。あなたが実際に何を好むかは、あなたの他の資質や経験によって決まるでしょう。しかし確実に言えることは、あなたは物事に再び生命を与えることを楽しんでいるということです。底に潜む要因を明らかにし、その要因を根絶し、物事を本来あるべき輝かしさへ回復することを素晴らしいと感じるのです。もしあなたの介入がなかったら、たとえばこの機械は、この技術は、この人物は、この会社は、機能を停止してしまった可能性があると本能的に分かっています。あなたがそれを直したのです。それを蘇生させ、活気を取り戻させたのです。あるいは、あなたらしい表現で言えば、あなたはそれを救ったのです。

分析思考

分析思考という資質を持つあなたは、他の人に「証明しなさい。あなたの主張がなぜ正しいのか示しなさい」と強く要求します。このような詰問を受けると、自分の素晴らしい理論がもろくも崩れ落ちるのを感じる人もいます。これがまさしく、あなたの意図するところです。あなたは必ずしも他人のアイデアを壊したいわけではないのですが、彼らの理論が堅固であることを強く求めます。あなたは自分自身を、客観的で公平であると考えています。あなたはデータを好みます。データは人々の考えに左右されず、ありのままだからです。あなたはデータを見ると、パターンと関連性を捜し出します。一定のパターンが互いにどのように影響するのか、どのように結びつくのか、結果はどのようなものかを理解しようとします。そしてその結果が、提示されている理論や目の前の状況にふさわしいかどうかを知ろうとします。これがあなたのやり方です。あなたはこれらの点を一つずつ明らかにして、根本的な理由を探し当てます。人はあなたのことを論理的で厳格であると見ます。その人達は、いつかあなたのところにやって来て、誰か他の人の「非現実的な考え」あるいは「整理されていない考え」を話し、あなたの研ぎ澄まされた思考から見た考えを聞くでしょう。あなたの分析結果を伝える時、できれば決して厳し過ぎないようにしましょう。さもないと、その「非現実的な考え」が彼ら自身の考えである場合、その人はあなたをわざと避けるようになります。

収集心

あなたは知りたがり屋です。あなたは物を収集します。あなたが収集するのは情報――言葉、事実、書籍、引用文――かもしれません。あるいは形のあるもの、例えば切手、野球カード、ぬいぐるみ、包装紙などかもしれません。集めるものが何であれ、あなたはそれに興味を惹かれるから集めるのです。そしてあなたのような考え方の人は、いろいろなものに好奇心を覚えるのです。世界は限りなく変化に富んでいて複雑なので、とても刺激的です。もしあなたが読書家だとしたら、それは必ずしもあなたの理論に磨きをかけるためではなく、むしろあなたの蓄積された情報を充実させるためです。もし旅行が好きだとしたら、それは初めて訪れる場所それぞれが、独特な文明の産物や事柄を見せてくれるからです。これらは手に入れた後、保管しておくことができます。なぜそれらは保管する価値があるのでしょうか? 保管する時点では、何時または何故あなたがそれらを必要とするかを正確に言うのは難しい場合が多いでしょう。でも、それがいつか役に立つようになるかどうか誰が知っているというのでしょう。あらゆる利用の可能性を考えているあなたは、モノを捨てることに不安を感じます。ですから、あなたは物や情報を手に入れ、集め、整理して保管し続けます。それが面白いのです。それがあなたの心を常に生き生きとさせるのです。そしておそらくある日、その中に役に立つものが出てくることでしょう。

個別化

「個別化」という資質により、あなたはひとりひとりが持つユニークな個性に興味を惹かれます。あなたはひとりひとりの特徴や個性を覆い隠したくないので、人を一般化したり、あるいは類型化することに我慢できません。むしろ、個人個人の違いに注目します。あなたは本能的にそれぞれの人の性格、動機、考え方、関係の築き方を観察しています。あなたはそれぞれの人生における、その人にしかない物語を理解します。この資質によって、あなたは、友達にぴったりの誕生日プレゼントを選んだり、ある人は人前で誉められることを好み、別の人はそれを嫌うことを分かったり、一から十まで説明して欲しい人と、一を示せば十を知る人とに合わせて、教え方を調整できたりするのです。あなたはほかの人の強みをとても鋭く観察する人なので、ひとりひとりの最もよいところを引き出すことができます。この個別化という資質は、あなたが生産性の高いチームを作ることにも役立ちます。完璧なチームを作るに当たり、チームの「組織構造」や「作業手順」に着目する人もいますが、あなたは優秀なチーム作りの秘訣は、各自が得意なことを充分に発揮できるような、強みに基づく配役である、ということを本能的に知っています。

結果見て

なんかいいこと書いてあるっぽいぞ?

OCamlで逆fizzbuzzを解こう。

なにやってたんだろうなぁ的な日記を書いてから
早7か月たちました。

ほんとになにもやってないですね。はい。

結婚式n次会(プログラミングの基礎勉強会)はやってますが、
まともに頭に入っていないのが現状。

某ぐるぐるさんに借りたH本も全く読んでいない始末・・・







うん、どうしようもないな。
あ、パソぽちりました。

ともあれ、OCamlで(力技の)逆fizzbuzzを解いたので
ソースだけ載っけとこうというのが今回の趣旨

TryOcamlで動くのを確認してます。
(http://try.ocamlpro.com/)

ヘッダの型とか違う気がするのでマサカリがこわい。
覚悟はいいか? オレはできてる!!


(* 目的: 逆fizzbuzz問題を解く*)
(* 逆fizzbuzz問題とは、*)
(* "fizz","buzz","fizzbuzz"というリストを受け取った際に *)
(* それらを満たす最小の数列を返す *)

(* 力技方法:*)
(* ① 1-1, 1-2, ... 1-100 *)
(*    2-2, 2-2, ... 2-100 *)
(*    ・ *)
(*    98-99, 98-100 *)
(*    99-100 *)
(*    100 とかいう数字リストを作る (範囲固定) *)
(* ② ①のすべてに対してfizzbuzzを求める *)
(* ③ fizzbuzz文字列リストに該当するリストを②から求める *)
(* ④ 最小の数列を③から求める *)

(* 目的: 入力整数がfizz, buzz, fizzbuzzとなるか判定する *)
(* isfizzbuzz : int -> bool *)
let isfizzbuzz n =
  match (n mod 3 , n mod 5) with
      (0, _) -> true
    | (_, 0) -> true
    | (_, _) -> false;;

(* 目的: 整数を受け取り、fizzbuzz結果を返す *)
(* fizzbuzzとは 3で割り切れる数字の時は fizz *)
(*              5で割り切れる数字の時は buzz *)
(*             15で割り切れる数字の時は fizzbuzz *)
(* を表示する *)
(* fizzbuzz : int -> string *)
let fizzbuzz n =
  match (n mod 3 , n mod 5) with
      (0, 0) -> "fizzbuzz"
    | (0, _) -> "fizz"
    | (_, 0) -> "buzz"
    | (_, _) -> "";;

(* 目的: 整数を受け取り、整数とfizzbuzz結果を返す *)
(* fizzbuzz : int -> ( int * string ) *)
let fizzbuzz_num n = ( n , fizzbuzz n);;

(* 目的: n から m までのリストを作る *)
(* makelst_n_to_m : int -> int -> int list *)
let makelst_n_to_m n m=
  let rec hojo n m = 
    if n = m then m :: []
                  else n :: hojo (n + 1) m
  in hojo n m;;

(* 1から60までのfizzbuzzを表示 *)
(* List.map fizzbuzz_num (makelst_n_to_m 1 60);; *)

(* 目的:整数 n と m を受け取り、n ~ m, n + 1 ~ m ・・・, ・・・ m - 1 ~ m, m というリストのリストを作る *)
let makelst n m = 
  let temp = ref [] in
  for i = n to m do
    for j = i to m do
      temp := (makelst_n_to_m i j) :: !temp;
    done;
  done;
  List.rev !temp;;

(* 目的:int list list を受け取り、(int list * string list(fizzbuzz化) )して返す *)
(* fizzbuzzes : int list -> (int list * string list) *)
let rec fizzbuzzes lst = match lst with
    [] -> []
  | first :: rest -> (first, List.map fizzbuzz (List.filter isfizzbuzz first)) :: (fizzbuzzes rest);;

(* 力技用のリストのリスト *)
(* int list list g*)
let all = makelst 1 100;;

(* io : (int list * string list) list *)
let io = fizzbuzzes all;;

(* 目的: string list を受け取り、(int list * string list) list から string list が一致するものを抽出する *)
(* tempanswer: string list -> (int list * string list) list *)
let tempanswer seq = 
      List.filter (fun tuple -> match tuple with (n, s) -> if s = seq then true else false) io;;

(* 目的: string list を受け取り、逆fizzbuzz した最小のリストを返したい *)
(* answer : string list -> int list *)
let answer seq =
  (* hojoの目的: (int list * string list) list を受け取り、listを最初から見ていき、int list の length が一番小さい list を返したい *)
  (* hojo : ('a list * 'b list) list -> 'a list -> 'a list *)
  let rec hojo lst result =
    match lst with
        [] -> result
      | first :: rest -> 
          match first with (n, s) -> 
            if result = [] then hojo rest n
                           else if (List.length result ) > (List.length n) 
                                  then hojo rest n 
                                  else hojo rest result
  in hojo (tempanswer seq) [];;

answer ["fizz"];;
answer ["fizz"; "buzz"];;
answer ["fizz"; "fizz"];;
answer ["fizz"; "buzz"; "fizz"];;
answer ["fizz"; "buzz"; "fizz"; "fizzbuzz"];;
answer ["fizz"; "buzz"; "fizz"; "fizzbuzz"; "fizz"];;

なんてゆーか、やっぱり汚いなぁ・・・

lenovo ideapad s206を手に入れたよ!!!

昨日友達の結婚式の二次会に出席してきました。
同じゼミのかなり下の後輩とかもなぜかいたのでscalaを薦めといた。
なごやこわいを知っている意識高い系男子だったので
これからどこかで会うこともあるだろう。
ほんとに自分は大学時代何やってたんだろうなぁ。
後悔してもどうしようもないので、これからどうするかですよ!!!(前向き)

んで、多分恒例のビンゴゲームで相変わらず自分はなんにも当たらなかったんだけど
友達が目玉商品ideapad s206を引き当てた。
http://shopap.lenovo.com/jp/products/laptops/ideapad/s-series/s206/index.html

んで紆余曲折を経て(主に烏合の衆の奪い合い)私の手に!!!
初めてのミニノートブックですよ!!!!
ドライブがついてないよ!!!軽いよ!!!!薄いよ!!!
膝の上でパソコンできるとか初めての体験だよ!!!
(でもCPUがちょっとへちょいよ!!!!!)

java7とscala2.10.0をとりあえず入れた。
REPLを起動して適当に打ち込んでみるも、
全然文法覚えてなくて泣けてくる;;
精進します・・・