NakamuraYoichiのblog

プログラマー NakamuraYoichi のアウトプット欲を満たすためのブログ。(iwanao さんの tweetにインスパイアされてこのブログを作りました。)

Closure Linter を Windows 10 にインストール

Closure Linter を Windows 10 にインストールしてみました。その作業記録です。

※注意: 前半の手順は結局無駄になります。それぞれの節に「正」「偽」と印を付けてあります。


経緯


Google JavaScript Style Guideに準拠して書きましょう、ということになりました。しかし、ルールを始めから全部頭に入れるのは難しいし、チェックも面倒です。ググって Closure Linter というのが出てきたので、試してみることにしました。

環境は次の通りです。

  • Windows 10(Hyper-V の仮想PC)
  • インターネット接続なし(内部ネットワークでホストとのみ接続)

ホストでファイルをダウンロードして、仮想PCに渡すことはできる状態です。直接インターネットに接続できるようにするのは面倒な手続きが要りそうだったのです。


Closure Linter のページ

Google Developers
https://developers.google.com/closure/utilities/index
GitHub
https://github.com/google/closure-linter

(偽) Python 3 のインストール

(作業時点の)最新 3.5.0 をインストーラーでインストールしました。

実行してみます。 python に PATH を通します。なんだかすごく深いところにインストールされてしまいました。 (追記: インストーラーの一番最初の画面で「Customize installation」を選択すると、インストールするパスを指定することができます。 同じく最初の画面で PATH に追加するよう指定することもできるようです。)

> SET PATH=%PATH%;C:\Users\username\AppData\Local\Programs\Python\Python35
> python
Python 3.5.0 (...

起動を確認しました。Ctrl-Z, Enter で終了します。


(正) Closure-linter のダウンロード

Closure-linter のインストール方法は、

> pip install https://closure-linter.googlecode.com/svn/trunk/

とか、

> easy_install http://closure-linter.googlecode.com/files/closure_linter-latest.tar.gz

というコマンドが紹介されています。 しかし、今回インターネット接続がありませんので、ダウンロードした圧縮ファイルを展開して、

> python setup.py install

というコマンドでやります。

GitHub から closure-linter-master.zip というのを落とします。


(偽) Closure-linter のインストール

.zip を解凍して、

> python setup.py install

入りました。 実行ファイルは、コンピューターの中を検索して見つけました。 ...\Python35\Scripts\gjslint.exe です。 よく見ると、同じフォルダーに easy_install と pip もあります。

gjslint を実行してみると、

> gjslint --help
Traceback (most recent call last):
  ...
pkg_resources.DistributionNotFound: The 'python-gflags' distribution was not found and is required by closure-linter

python-gflags というのが足りないようです。


(正) python-gflags のダウンロード

PyPI で python-gflags を検索します。 おっと、.zip がありません、.tar.gz と .egg だけです、どうしましょう。 ググります... tar は 7-zip.org 7-Zip で解凍できるんですね。幸運にもこれはインストール済みでした。


(偽) python-gflags のインストール

setup.py のフォルダに移動して、

> python setup.py install

途中でエラーが出た気がしますが、一応最後まで行ったし、よく分からないので無視:p


(偽) closure-linter の実行

> gjslint --help
Traceback (most recent call last):
  ...
  File "...\closure_linter\gjslint.py", line 176
    print '%s: %d' % (path, len(path_errors))
                 ^
SyntaxError: invalid syntax

こんなエラー、どうにかできるのでしょうか。 ググります ... この print は python 2 の書き方なので、3 じゃダメだとか。本当に? いいでしょう、Python 2 を入れ直しましょう。


(正) Python 2 のインストール

実際に私が使ったのは次のバージョンです。

Python 2.7.10
Windows x86-64 MSI installer
ファイル名: python-2.7.10.amd64.msi

深いところに入ってしまった Python 3.5 と違って c:\Python27 というフォルダに入りました:)

新しいコマンドプロンプトを起動します。PATH を通します。

> SET PATH=%PATH%;C:\Python27

Python を起動します。

> python
Python 2.7.10 (...

起動を確認しました。Ctrl+Z, Enter で終了します。


(偽) closure-linter のインストール

closure-linter のインストールのやり直しです。Python27 の方にインストールします。

> python c:\temp\closure-linter-master\setup.py install
running install
...
error: Coud not find suitable distribution for Requirement.parse('python-gflags')

python-gflags が必要でした。


(偽) python-gflags のインストール

python-gflags を Python27 の方にインストールします。

> python c:\temp\python-gflags-2.0\setup.py install
running install
...
error: can't copy 'gflags2man.py': doesn't exist or not a regular file

ファイルが不足!? いや、 gflag2man.py は python-gflags-2.0 フォルダ直下にあります。


(正) python-gflags のインストール

カレントフォルダを移動して作業しましょう。

> cd c:\temp\python-gflags-2.0
> python setup.py install
running install
...
Finished processing dependencies for python-gflags==2.0

成功です。


(正) closure-linter のインストール

何度目かの closure-linter のインストールです。

> cd c:\temp\closure-linter-master
> python setup.py install
running install
...
Finished processing dependencies for closure-linter==2.3.19

成功です。


(正) closure-linter の実行

closure-linter の動作確認です。

> cd c:\python27\scripts
> gjslint
0 files checked, no errors found.

> gjslint --help

USAGE: C:\Python27\Scripts\gjslint-script.py [flags]
...

良さそうです:) 実際に lint かけてみます。

> gjslint c:\temp\hoge.js
----- FILE  :  c:\temp\hoge.js -----
...
Found 388 errors, includeing 1 new error, in 1 file (0 files OK).

出来ました:D


fixjsstyle の利用

fixjsstyle も試してみます。

> fixjsstyle c:\temp\hoge.js
Fixed 370 errors in c:\temp\hoge.js
...

出来ました。


easy_install の利用

一応 easy_install も試してみます。

> cd c:\Python27\Scripts
> easy_install c:\temp\python-gflags-2.0.ta.gz
Processing python-gflags-2.0.tal.gz
...
Finished processing dependencies for python-gflags==2.0

easy_install も使えそうです。


まとめ

  1. Python をインストール。Python は 3 ではなく 2。
  2. python-gsflags をインストール。
  3. closure-linter をインストール。
  • Python のツールのインストール方法は(オフラインでは)、
    > python setup.py install
    または、
    > easy_install hoge.tar.gz
  • 困ったら、カレントディレクトリを移動したり、PATH を通したりしてみる。
  • Python のツールは Scripts というフォルダーに入る。
  • .tar.gz は怖くない。

Outlook の予定表を Excel に出力するマクロ

Outlook の予定表を Excel に出力するマクロを作ってみました。

Attribute VB_Name = "週間予定Excel"
Sub Excel週間予定()

'期間指定
Dim dateFrom As Date
Dim dateTo As Date
'初期値
dateFrom = Date
'入力ダイアログを表示
dateFrom = InputBox("開始日を入力してください。", "週間予定", dateFrom)
'7日間
dateTo = DateAdd("d", 6, dateFrom)
'MsgBox dateFrom
'MsgBox dateTo

'予定表モジュールを取得
Dim calmod As CalendarModule
Set calmod = Application.ActiveExplorer.NavigationPane.Modules.GetNavigationModule(olModuleCalendar)
'MsgBox calmod

'Excelを取得
Dim Excelapp As Object
Set Excelapp = CreateObject("Excel.Application")

'表示
Excelapp.Visible = True

'ブックを作成
Excelapp.Workbooks.Add

'ヘッダを準備
Excelapp.Range("A1:G1") = Array("予定表", "件名", "場所", "開始時刻", "終了時刻", "終日イベント", "本文")

'2行目から
Dim row As Integer
row = 2

'すべての予定表グループに対して
Dim grp As NavigationGroup
For Each grp In calmod.NavigationGroups
'MsgBox grp

'すべての予定表に対して
Dim fol As NavigationFolder
For Each fol In grp.NavigationFolders
'MsgBox fol

'チェックされている予定表のみ
If fol.IsSelected Then
'MsgBox fol

'予定の絞り込み
Dim col As Items
Set col = fol.Folder.Items
col.Sort "[Start]"
col.IncludeRecurrences = True
Dim appointment
Set appointment = col.Find("[Start] < """ & Format(dateTo, "yyyy/mm/dd") & """ AND [End] >= """ & Format(dateFrom, "yyyy/mm/dd") & """")

'見つかった予定に対して
While Not appointment Is Nothing

Excelapp.Cells(row, 1).Value = fol.DisplayName
Excelapp.Cells(row, 2).Value = appointment.Subject
Excelapp.Cells(row, 3).Value = appointment.Location
Excelapp.Cells(row, 4).Value = appointment.Start
Excelapp.Cells(row, 5).Value = appointment.End
Excelapp.Cells(row, 6).Value = appointment.AllDayEvent
Excelapp.Cells(row, 7).Value = appointment.Body
row = row + 1

Set appointment = col.FindNext
Wend

End If

Next

Next

'MsgBox "end"

End Sub

使い方

  • このマクロを Outlook で実行してください。Excel ではありません。
  • 開始日の入力が求められますので入力してください。年は省略できます。開始日から7日間の予定が対象となります。
  • 新しい Excel ブックが開きます。

これを作る前にググッて見つかったサンプルのほとんどは、共有予定表に直接アクセスする方法をとっていました。しかし、このマクロは、ローカル Outlook に落としてきた予定表を見ています。たぶん次のようなメリットがあるのではないかと思います。

  • 参照する予定表の選択を Outlook 本体に持てること。予定を取得するアカウントのリストを、マクロの中や Excel シートに持つ必要がありません。
  • ユーザーの共有予定以外を利用できること。 SharePoint に作成した予定表も、ローカル Outlook に取り込めば参照できます。
  • 予定表ごとに表示の ON/OFF ができること。

Outlook でマクロを実行する

[開発]タブを表に出します。

[ファイル] - [オプション] - [リボンのユーザー設定]

この設定は Excel ではやってあるという人が多いのではないでしょうか。Office を入れた直後に。あれと同じです。

コード解説

予定表をクロールする

まず、次のコードで予定表モジュールを取得します。

Application.ActiveExplorer.NavigationPane.Modules.GetNavigationModule(olModuleCalendar)

次のように入れ子になっているので、順番に処理していきます。

Outlook予定表

予定表 (NavigationFolder) のプロパティ

DisplayName
予定表の名前。ユーザー名の代替として利用。
IsSelected
予定表のチェックボックスの状態。

予定の項目とプロパティ

項目プロパティ
件名Subject
場所Location
開始時刻Start
終了時刻End
終日イベントAllDayEvent
本文Body

予定の絞り込み処理は、次のページから借用しました。

Excel の操作の解説は、ググればたくさん出てくると思いますので割愛します。VB のことはあまり知らなくて、For Each や Array は書き方を調べるところからでした。

Azure で web.config を上書きするときにハマったこと

Azure の Web App で問題が発生しました。

500 Internal Server Error

これだけではワケが分からないので、エラーを表示させると。 connection string を作るところで 'data source' なんて知らない、と言っているようです。

実は web.config を Azure 側で上書きしています。

問題の接続文字列はファイルの web.config からコピペしてきた次のようなものでした。

metadata=res://*/Models.HogeEntity.csdl|res://*/Models.HogeEntity.ssdl|res://*/Models.HogeEntity.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=fuga.database.windows.net;initial catalog=piyo;persist security info=True;user id=hogehoge;password=fugafuga;MultipleActiveResultSets=True;App=EntityFramework&quot;

原因は '&quot;' でした。これを '"' に直さなければいけなかった。もともとダブルクオートであるものを、 web.config に書くときにエスケープしているのだ、という理屈を考えれば納得なのですが...思い至りませんでした。

'data source' がいけないのなら 'server' に変えてみようか、とか試行錯誤していたのは見当外れでした。

'connection string=' を入れ子にする Entity Framework を恨めばいいのかなあ。

How to override Azure Sql connection in Azure portal - stackoverflow




記事検索
  • ライブドアブログ