operator <<の定義の仕方

意外と見つからないのでメモ。理解してないから応用が効かなかったわけだけども。

friend ostream& operator<<(ostream& os, const Date& dt);

ostream& operator<<(ostream& os, const Date& dt)
{
os << dt.mo << '/' << dt.da << '/' << dt.yr;
return os;
}

使うにはfriend宣言が必要になる。

friend std::ostream& operator<<(std::ostream& os, const Date& dt);
std::ostream& operator<<(std::ostream& os, const Date& dt)
{
    os << dt.mo << '/' << dt.da << '/' << dt.yr;
    return os;
}

個人的には"std::"をつけといたほうが好き。

Chocolateyでつまづいたとこ

最近Chocolateyがまた紹介記事が上がっていたので使ってみた。スルーしたのが悔やまれることがわかった。ダウンロード、インストールを手作業でしなくていいのがやっぱりすごく楽だった。

インストールは他の方で任せるとして、自分は引っかかったとこなどをメモする。
インストールはこちらを参考に。
Widnows用パッケージ管理ツール Chocolatey - @ledsun blog

ChocolateyGUIが起動できない

Chocolatetyを使ってみてChocolateyGUIが起動できなかった。
Chocolateyをインストール: Cygwinからも使う
によると、Windowsを再起動しないとChocolateyGUIは起動できないそうです。

Emacsがインストールできない

エラーメッセージはこんなのが

[ERROR] Cannot bind argument to parameter 'Path' because it is an empty string.
-----------------------
At C:\Chocolatey\chocolateyinstall\helpers\functions\Write-ChocolateyFailure.ps
1:30 char:13
+ Write-Error <<<< $errorMessage
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorExcep
tion
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorExceptio
n,Write-Error
Write-Error : Package 'Emacs v24.3' did not install successfully: Cannot bind a
rgument to parameter 'Path' because it is an empty string.
At C:\Chocolatey\chocolateyinstall\functions\Chocolatey-NuGet.ps1:90 char:28
+ Write-Error <<<< "Package `'$installedPackageName v$installe
dPackageVersion`' did not install successfully: $($_.Exception.Message)"
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorExcep
tion
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorExceptio
n,Write-Error

https://gist.github.com/pogin503/8052282

これはPathが空だからエラーになるらしい。

解決方法

エラーはコマンドプロンプトを再起動したらなんの問題もなくインストールできた。

メモ 1

このエラーを解決しようとEmacs.nupkgを見てみた。解凍はLhaplusでやった。右クリック→解凍→ここで解凍で問題なく解凍できた。

  • NuGet Package Explorer

とかでも見れるらしい。

Emacs.nupkgの中身は

rels/.rels
Emacs.nuspec
README.org
tools/chocolateyInstall.ps1
package/services/metadata/core-properties/01a4d4df47764837ab70ae372ee2f054.psmdcp
[Content_Types].xml

てな感じだった。

インストースクリプトはtools/chocolateyInstall.ps1に書かれてある。Vim.nupkgの中身とくらべてみるとだいぶ違っていた。

結局コマンドプロンプトを再起動したら直ったので真実は闇の中に。

メモ2

PowerShell自体を学ぶにはここがいいかも。
PowerShell基礎文法最速マスター - PowerShell Scripting Weblog

スクリプトを参考にするんなら

C:\Chocolatey\chocolateyinstall\functions\*
C:\Chocolatey\chocolateyinstall\helpers\*
C:\Chocolatey\chocolateyinstall\toolds\*
C:\Chocolatey\chocolateyinstall\chocolatey.ps1

を参考にすれば書き方の参考になる。

Jenkinsが起動出来ない問題について

どうもVer.1.541はなにか問題があってうまく起動できないみたい。

C:\Program Files (x86)\Jenkins> java -jar jenkins.war

これをやっても途中でJenkinsが終了してしまう。

↓のリンクをたどって、
https://groups.google.com/forum/#!msg/jenkinsci-users/uiZ9-o7vRY8/aRLOYEQ2STkJ
↓のやつを見るとなんだかみんな困ってる様子だった。
https://issues.jenkins-ci.org/browse/JENKINS-20630

自分の環境は大体こんな感じ。

OS:Windows 7 64bit
Java:Java 7 update 45
Jenkins: 1.541

Issueの報告を見る限り、Java 7 update 45とJenkins 1.541を使った時に起こる現象っぽい。これから新たにJenkinsを使う人はStatbleの方を使うか、1.540以下のJenkinsを使わないといけない。

ダウングレードの方法は、単にjenkins.jarを上書きすればいい。
http://jenkins-ci.org/ の past release → 1.540 → jenkins.jarでダウンロードする
http://mirrors.jenkins-ci.org/war/1.540/jenkins.war
そして、C:\Program Files (x86)\Jenkinsの場所にjenkins.warをコピペして上書きする。
これでダウングレードが完了してJenkinsを起動できるはず。

Jenkins 1.542になったら多分解決してる問題だとは思う。

Emacsで親指シフトをやってたときに困ったこと

最近親指シフトを使い始めていくらか快適に書くことが出来ているのだけれど、Emacsで入力がうまくいかない事例にあたってしまった。 org-modeで「,」全角カンマを入力しようとしたらM-,と入力されてしまってうまくいかない。

user-error: No M-x tags-search or M-x tags-query-replace in progress

エラーはこんなので、うまく入力できなかった。もしかしたらこんなエラーも出るかも。

M-, undefined

入力できなかったのでとりあえずの対策をしたらちゃんと入力できるようになった。これを~/.emacs.d/init.el とかに加える。

;; temporary_repair.el
(global-set-key (kbd "M-,") #'(lambda () (interactive) (insert ",")))

こうすればとりあえずは「,」を入力できるようになる。

根本的な解決はできていないのだけれどどうすればいいのか・・・。

WordでPDFエクスポートをするVBAを書いた

Wordを最近使う機会があって、毎回同じ名前を入力してエクスポートするのが面倒だったので書いてみた。

エクスポートのやり方

Sub ExportToPDF()
    ActiveDocument.ExportAsFixedFormat OutputFileName:="output.pdf", ExportFormat:=wdExportFormatPDF
End Sub

これを実行すればWordでPDFのエクスポートができるようになる。
任意の名前にするのは、OutputFileName:="output.pdf" の 「"output.pdf"」自分の出力したい名前にしておけばいい。

勉強用のメモ

勉強用に、参照オブジェクトのオブジェクト変数への代入処理をメモしておく。

Sub ExportToPDF()
    Dim wordDoc As Word.Document
    Set wordDoc = ActiveDocument
    wordDoc.ExportAsFixedFormat OutputFileName:="output.pdf", ExportFormat:=wdExportFormatPDF      
    Set wordDoc = Nothing
End Sub

定義した変数への代入は、Setですることができる。これがよく分からなくてVBAは敬遠してたけどやっとわかった。Visual Basic Editorのヘルプにドキュメントがあったのでそれをちゃんと見ないといけない。

VBAで開発で覚えたほうがいいこと

デバッグはDibug.Printを使って、Visual Basic Editorの[表示]->イミディエイトウィンドウに出力するとデバッグがちゃんとできるようになる。

F8でできるステップ実行、[表示]→[オブジェクトブラウザー]の使い方も覚えるとちゃんとVBAの開発ができるようになる。

VBAで気を付けたほうがいいこと

  • どうもメソッドなどに()をつけるとエラーの原因になるので付けないほうがいい。
  • 付属のヘルプを見よう。ヘルプは
    Visual Basic Editor→
      ヘルプ→
      Microsoft Visual Basic for Application ヘルプ

で、豊富な情報を見ることができる。

auto-insert-modeでなぜか書き込めなくなる問題について

どうも設定が悪さをしていた。

http://d.hatena.ne.jp/higepon/20080731/1217491155
この設定では、

(add-hook 'find-file-not-found-hooks 'auto-insert)

こうなっている。
これが入ると何故か

File exists, but cannot be read

となってファイルがread-onlyになってテンプレートを挿入できない。

なので上の設定を消して、

(add-hook 'find-file-hook 'auto-insert)

これを入れておくだけでいい。設定を入れ替えたら再起動すれば直ると思う。

この謎が一年越しぐらいに解決してうれしい。

汚いけれど自分のauto-insertの設定はこちら。
https://github.com/pogin503/dot-emacs/blob/master/site-start.d/30_init-auto-insert.el

Doctestのスニペット

Emacsyanippetで使える定義しておくと便利なスニペットをメモしとく。

# -*- mode: snippet -*-
# name: doctest
# --
{-| ${1:func-name} Test
  >>> $0

-}

これを snippet_dir/haskell-mode/doctest に保存して C-c C-c で読み込んでおけば、テストを書くのがちょっと楽になる。

-- addTes.hs
add :: Int -> Int -> Int
add a b = a + b

-- doctest {trigger-key: タブキーとか}  or
-- yas-insert-snippetのキーバインドで挿入
{-| add Test
  >>> add 2 3
  5
-}

doctestを読み込むときは M-! doctest addTest.hs とやっていつも読み込んでる。頑張ればもっと楽な読み込み方がありそう。