2013年3月31日日曜日

【Windows7】 コマンドプロンプトで関連付け制御

Windows7のファイルとアプリケーションの関連づけをコマンドプロンプトで行う方法

コマンドプロンプトで作業していて
> hoge.py foo bar
のようなことをやりたかった。
hoge.pyをpython.exeに関連付けつつ、hoge.pyに引数foo, barも渡したい。

エクスプローラなどからGUIで関連付けしちゃうと、hoge.pyをpython.exeに関連付けることはできるが、引数が渡らなくなっちゃう。

そこで、コマンドプロンプトからassoc, ftypeコマンドを使って関連付けを設定する。
設定変更は、管理者権限のあるコマンドプロンプトから実行する。

assoc

拡張子とファイルタイプを紐付ける

設定確認
> assoc .py
.py=Python.File

設定変更
> assoc .py=Python.File

ftype

ファイルタイプとアプリケーションを紐付ける

設定確認
> ftype Python.File
Python.File="C:\Python27\python.exe" "%1" %*

設定変更
> ftype Python.File="C:\Python27\python.exe" "%1" %*


GUIから設定した関連付けが残っているとそちらが優先されるようなので、削除しておこう。(以下リンク参照)

参考
[Windows] Pythonの関連付け設定
Windows 7(Vista)でファイルの関連付け情報を削除(解除)する

2013年3月18日月曜日

C-Helperの特長と使い方

先日リリースしたC-Helper(Uchan Note: C-Helperリリース 参照)の特長と使い方を説明します。

C-Helperの特長

C-Helperは、簡単な操作でC言語のソースコードを検査します。検査項目とサンプルコード、C-Helperの出力メッセージは以下のとおりです。
※出力メッセージは開発版であり、リリース版とは異なる場合があります。
  • char型変数への文字列代入
    char c;
    c = "+";
    
    メッセージ「char型変数に文字列を格納できません。 char型配列を検討してください。」
  • 警告を抑え込むキャスト
    printf("%s", (char *)getchar());
    
    メッセージ「式 getchar() が1つの文字を表しているなら %c を使えば表示可能です。」
  • 文字と文字列の比較
    int word;
    if (word == "+") puts("word is +");
    
    メッセージ「文字と文字列は比較できません。(1文字を表すには"ではなく'で囲みます。)」
  • ヘッダファイルでの実体定義
    test.h
    int g_x;
    
    test.c
    #include "test.h"
    
    メッセージ「ヘッダファイルには実体を定義すべきではありません。(extern宣言を用いてください。 (extern int g_x;) )」
  • 識別子の重複
    int x;
    void f(void) {
        int x;
    }
    
    メッセージ「識別子xが重複しています。」
  • インデントの乱れ
    void f(void) {
        int i;
        for (i=0; i<3; i++) {
        printf("%d\n", i);
        }
    }
    
    メッセージ「インデントが乱れています。スペース 8 個分インデントすべきです。」
  • メモリリーク
    void f(int flag) {
        char *p;
        p = malloc(123);
        if (flag) free(p);
    }
    
    メッセージ「メモリリークが発生する可能性があります。」
  • printfのパラメタ間違い
    printf("%d", 3.14);
    
    メッセージ「引数は!浮動小数点数型ですが %d は!符号付き整数型を期待しています。(浮動小数点数の表示には %f, %e, %g などが使えます。)」
  • returnの記述漏れ
    int f(void) {
        if (0) return 1;
    }
    
    メッセージ「return文がありません。」
  • scanfへの値渡し
    int x;
    scanf("%d", x);
    
    メッセージ「ポインタを渡す必要があります。(&を付けて変数へのポインタを取得します。(&x))」
  • 構造体宣言のセミコロン忘れ
    struct Foo {
        int bar;
    }
    int main(void) {
        return 0;
    }
    
    メッセージ「構造体の宣言にはセミコロンが必要です。」
  • 関数定義の余分なセミコロン
    int main(void);
    {
        return 0;
    }
    
    メッセージ「関数定義にはセミコロン ; を付けません。」
  • 動的に確保した配列に対するsizeof
    char *p = malloc(128);
    printf("%u", sizeof(p));
    
    メッセージ1「sizeof(p) は 128 ではなく 4 を返します (仮定6)。それは本当に意図したことですか?」
    メッセージ2「仮定6: ポインタ変数のサイズを 4 バイトと仮定しています。」
  • 定義されていない関数名の使用
    int main(void) {
        printf("hello, world!\n");
        return 0;
    }
    
    メッセージ「printf は宣言されていない関数名です。(stdio.h を #include してください。)」


C-Helperの使い方

ソースコードを記述して、C-Helperの起動アイコンをクリックします。
起動アイコン
下図の状態で起動アイコンをクリックすると、test.cがチェックされます。(main.cはチェックされません)

最前面にあるソースコードエディタに対して動作します。
上図のように、チェックしたいソースコードを最前面に表示しておいてください。

2013年3月11日月曜日

C-Helperリリース


サイボウズ・ラボユースでしばらく製作していた、初学者向けのC言語学習支援ツール "C-Helper" が、取り敢えず形になりましたのでリリースいたします。
https://github.com/uchan-nos/c-helper/blob/master/README.md

C-Helperは

  • 初学者が書いたソースコードを検査します
  • 間違いやすい項目を検査し、警告を表示します
  • 可能ならば修正案を提示します

C-Helperの検出項目の一覧はUchan Note: C-Helperの特長と使い方を御覧ください。

興味がある方、是非使ってみてください。
これからも時々バージョンアップさせるつもりです。

Eclipseプラグインですので、C-Helperを使うにはまずEclipseのダウンロードとインストールが必要です。
上記READMEに詳しいやり方を書きましたのでご覧ください。

C-Helperを使っていただき、是非アンケートにご協力ください。
https://docs.google.com/forms/d/1bdGMk4v-gFTAPq7C6s--pkpHi-5227vU4bZO1pjZ8hQ/viewform

2013年2月18日月曜日

【Eclipseプラグイン開発】 配布時に他プラグインへの依存をなくす

Eclipseプラグインの開発時と配布時の、他プラグインへの依存関係を変えたいことがあります。
例えば、開発時にJUnitを使ってテストをするような場合。
配布先ではテストをしないでしょうから、末端ユーザーの環境にJUnitプラグインがなくても大丈夫なようにしたい。
このように、開発時と配布時の依存関係を変えたいという要望があるでしょう。

まず基礎知識として、開発しているEclipseプラグインの依存設定はplugin.xmlで設定します。
マニフェストエディタでplugin.xmlを開けばDependenciesタブがあります(下図)。


Plug-in Dependencies - Help Eclipse Platform
を読むと、依存設定の"Optional"オプションを有効化すると、その依存プラグインが配布先環境に存在してもしなくても、配布したプラグインが実行できるそうです。

ということで、実際に試してみたところ、JUnitプラグインが存在しない環境でもC-Helperがインストール&実行できるようになりました。

2013年2月4日月曜日

【Vim】Markdownプレビュー用プラグインを入れる


OS X Mountain Lion で Vim に https://github.com/mattn/mkdpreview-vim を導入します。

プラグイン開発者さんのブログ記事 http://mattn.kaoriya.net/software/vim/20120208161751.htm

依存しているソフトウェアのインストール

ソースコードをコンパイルしてもいいんですが、面倒なのでHomebrewで。
$ brew install pyqt4
$ sudo easy_install markdown

上記のブログに依存しているソフトウェアが列挙されているのですが、markdownライブラリは一覧に含まれていませんでした。
しかしどうやら、mkdpreview-vimが裏で使っているらしいので、インストールしておきます。

Vimプラグインのインストール

mkdpreview-vimはwebapi-vimに依存しているらしいので、両方入れます。
僕はVundleを使っているので、以下のように書きました。
.vimrc
Bundle 'mattn/webapi-vim'
Bundle 'mattn/mkdpreview-vim'

そしたらVimから :BundleInstall でOK

プラグインの調整

brewでPyQt4を入れたので、このままではpythonが認識してくれません。
ということで mkdpreview-vim/static/mkdpreview.py をちょこっと改造します。

import os 
import sys 
import json 
import cgi 
import imp 
import signal 
from threading import Thread 
 
# add serch path 
sys.path.insert(0, '/usr/local/lib/python2.7/site-packages') 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from PyQt4.QtWebKit import * 
from PyQt4.QtNetwork import * 
from BaseHTTPServer import HTTPServer 
from SimpleHTTPServer import SimpleHTTPRequestHandler 

こんな感じで、PyQt4がインストールされたディレクトリをパスに追加しておきましょう。



2013/06/20追記

今 pyqt4 をインストールしようとしたら見つからないと言われました。どうやらパッケージ名が変わったようです。
$ brew install pyqt
でいけます。

さらに、インストール中にこんなメッセージが出ていたのに気づきました。

For non-homebrew python (2.x), you need to amend your PYTHONPATH like so:
  export PYTHONPATH=/usr/local/lib/python2.7/site-packages:$PYTHONPATH
「プラグインの調整」の項で書いたことは、実はbrewさんが既に注意してくれていたのですね… 完全に見逃していました。



2012年12月6日木曜日

Ada勉強メモ 3

ADA-言語とプログラミング方法論』p.3「Ada 入門」から読みます。

1.1 背景
  • Adaは米国国防総省(DoD)が、1976年頃から開発を始めた。
  • FORTRANやCOBOLのように特定の用途向けではなく、Adaは汎用言語。
  • Adaは世界最初のプログラマの名前。

1.2 プログラミング言語Ada
  • Adaはコンパイル言語である。
  • オブジェクトプログラム(機械語プログラム)は、通常「プログラムライブラリ」に格納される。
    • プログラムライブラリって、Cで言うところのライブラリと同じかな?
  • プログラムライブラリには、完結したプログラム、副プログラム、パッケージが格納される。
  • Adaの識別子は文字から始まり、文字、アンダースコア、数字の羅列。ただしアンダースコアの連続はダメ
今日はここまで。
Adaの歴史と基本的な約束事が分かりました。
次回はいよいよAdaのプログラムを書いていきます。

2012年12月3日月曜日

【Eclipse】プラグインをデバッグする

Eclipseのプラグインでデバッグメッセージを出力する良い方法が見つかったのでメモ。

問題


  • Eclipseに自作プラグインを入れてEclipseを通常起動させても、標準出力・標準エラー出力が表示されない。
    つまり System.out.println を用いてデバッグメッセージを表示しようと思っても、画面に表示されない。
  • java.util.logging.Loggerを使おうと思っても、やっぱり標準出力が表示できないので無意味。
    もし標準出力が出るようになっても、ロギングレベルの設定方法が分からない。(まさか常にsetLevel(Level.ALL)するわけにも行かないですし)

やりたいこと

デバッグしたいなあ、と思ったときに、プラグインを再コンパイルせずに、デバッグメッセージをターミナルへ表示したい


解決策

Eclipseをデバッグモードで起動する方法を覚える

詳しくはRunning Eclipseを読みましょう。要点をまとめます。

Eclipseは
$ eclipse -debug
でデバッグモードで起動できます。Macならこんな感じ。
$ /Applications/eclipse/Eclipse.app/Contents/MacOS/eclipse -debug

さらに、 -consolelog オプションを付けると、標準出力がコンソールへ接続されます。

プラグインのデバッグメッセージの表示のON/OFFをフラグ化


フラグ化することで、プラグインの再コンパイルなしにデバッグメッセージのON/OFFを制御できるようになります。

こんなクラスを作ります。
/**
 * .options読み込みクラス
 * @author uchan
 *
 */
public class DebugOptions {

    public static final boolean verbose;

    static {
        verbose = Boolean.parseBoolean(Platform.getDebugOption(
                "com.github.uchan_nos.c_helper/verbose"));
    }
}

プログラム中では
if (DebugOptions.verbose) {
    logger.fine("debug message");
}
という風に使います。

あとはこんな感じの設定ファイルを作ります。

~/eclipse.options
# Output verbose messages
com.github.uchan_nos.c_helper/verbose=true

そして、Eclipseの -debug オプションの引数として指定します。

$ eclipse -debug ~/eclipse.options

起動ログに

Debug options:
    file:/Users/uchan/eclipse.options loaded
という表示があれば成功です。