開発」カテゴリーアーカイブ

VPN 越しに DLNA 経由で NAS に触る (SSDP Proxy)

どうもみむらです。

VPN 越しに NAS のコンテンツに、しかも DLNA 対応アプリ経由で触りたいと思ったことはありませんか。

数ヶ月前に NAS を購入して、速攻で静音化の記事 ( ASUSTOR DataSync Center の HDD アクセスを静かにする ) を書いたりしていたのですが、DLNA 経由で音楽ファイルに触れるようにしてみた所これが大変使いやすく、ぜひ VPN 越しにもこれを享受したい・・と。。

DLNA は UPnP を用いており、その機器発見に SSDP (1900/udp) を用いているのですが、早い話が VPN 越しにブロードキャストが上手く動作しないので、これを改善してみようというそういう話です。


1.サーバから VPN 感を感じ取れないようにする

DLNA は同一ネットワーク上での動作を想定しているものになります。
他のネットワークからアクセスしようとすると上手く動いてくれないケースがいくつか見られましたので、下記のようにしてサーバからの 「VPN 感」を少し消してみます。

NAS 側には “192.168.1.0/24” のネットワークに属しているように見せ、VPN 用に “192.168.1.224/28” のネットワークを用意しておきます。

VPN サーバには Proxy ARP の設定を入れて、192.168.1.0/24 のネットワーク上からも 192.168.1.224/28 の端末の MAC アドレスの解決 (といっても VPN サーバが指し示されるだけ)が出来るようになります。

なお、Proxy ARP については、こちらのサイトが詳しいですので参照ください:
Proxy ARP(プロキシARP)とは / ネットワークエンジニアとして
https://www.infraexpert.com/study/gateway.htm


具体的な設定方法としては
“/proc/sys/net/ipv4/conf/<device>/proxy_arp” を 1 に書き換えるか
systemd-networkd の “[Network]” セクションに “IPv4ProxyARP=yes” とする方法が
簡単かなと思います。

設定する際は、“192.168.1.0/24” の方に ProxyARP の設定を適用する形になります。

systemd-networkd の設定例)

# cat /etc/systemd/network/eth0.network
[Match]
Name=eth0

[Network]
Address=192.168.1.240/24
Gateway=192.168.1.254
IPv4ProxyARP=yes

# cat /etc/systemd/network/eth1.network
[Match]
Name=eth1

[Network]
Address=192.168.1.238/28

[Link]
MTUBytes=1200

2. SSDP をプロキシする

探索プロトコルの通信を転送するようにしてみます。
転送しないと探索が VPN のネットワーク内で閉じてしまい、本来の機器まで届かなくなってしまいます。

SSDP の中身は概ね下記のような HTTP ベースの通信になっています。

# リクエストの例。(クライアントからサーバに対して送る)
# 239.255.255.250:1900/UDP に対して送出される
---
M-SEARCH * HTTP/1.1
MX: 5
ST: urn:schemas-upnp-org:device:MediaServer:1
MAN: "ssdp:discover"
User-Agent: UPnP/1.0
Host: 239.255.255.250:1900
Connection: close

---

# 応答例。
# サーバからリクエストを行ったクライアントのポートに対してユニキャストで応答が入る
---
HTTP/1.1 200 OK
Cache-Control: max-age=1800
EXT:
Location: http://192.168.1.22:55247/dms
Server: Linux 4.0.0 UPnP/1.0
ST: urn:schemas-upnp-org:device:MediaServer:1
USN: uuid:xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx::urn:schemas-upnp-org:device:MediaServer:1
Date: Sun, 16 May 2021 19:42:50 GMT

---

見ていただくとわかるように、応答の中にユニキャストアドレスが含まれているため、発見処理のみプロキシしてあげれば後は1対1での通信となります。

ということで下記のようなプログラムを書いてみました

#!/bin/python3

#
# SSDP (DLNA の探索プロトコル) を吸って吐くプロキシ。
# Wireguard のように純粋にbridgeできないネットワーク間で使うと幸せになれる気がします。
# (使ったことでネットワークがダウン等しても保証は出来ませんので、自己責任でどうぞ。)
#
# Author : Satoshi Mimura (@mimura1133)
#

import socket
from contextlib import closing

def main():
        multicast_group = '239.255.255.250'
        src_adapter_ip = '' # DLNA クライアントがいるネットワークの IP アドレスを指定
        dst_adapter_ip = '' # DLNA サーバがいるネットワークの IP アドレスを指定
        port = 1900
        timeout = 5.0

        with closing(socket.socket(socket.AF_INET,socket.SOCK_DGRAM)) as src_sock:
            src_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
            src_sock.bind(('',port))
            src_sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP,
                                  socket.inet_aton(multicast_group) + socket.inet_aton(src_adapter_ip))

            while True:
                request_data, client_addr = src_sock.recvfrom(4096)
                with closing(socket.socket(socket.AF_INET,socket.SOCK_DGRAM)) as dst_sock:
                    dst_sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(dst_adapter_ip))
                    dst_sock.settimeout(timeout)
                    dst_sock.sendto(request_data,(multicast_group,port))
                    print("\033[31m [FORWARDED:REQUEST]\033[0m {} -> {}".format(client_addr,(multicast_group,port)))
                    print(request_data)
                    while True:
                        try:
                            response_data, server_addr = dst_sock.recvfrom(4096)
                            src_sock.sendto(response_data,client_addr)
                            print("\033[32m [FORWARDED:RESPONSE]\033[0m {} -> {}".format(server_addr,client_addr))
                            print(response_data)

                        except Exception:
                            break
        return

if __name__ == '__main__':
    main()

動かしてみた結果は下図の通り。中々上手く動いてます。

今回の検証には iPhone 側に OPlayer Lite を入れて検証しています。

3.永続化する

毎回手動で起動するのは筋がよくありませんので、systemd のサービスにしてしまいましょう。

まずは、先ほどの Proxy をするプログラムからデバッグ用の print 文を消去したものを準備します。

#!/bin/python3

#
# SSDP (DLNA の探索プロトコル) を吸って吐くプロキシ。
# Wireguard のように純粋にbridgeできないネットワーク間で使うと幸せになれる気がします。
# (使ったことでネットワークがダウン等しても保証は出来ませんので、自己責任でどうぞ。)
#
# Author : Satoshi Mimura (@mimura1133)
#

import socket
from contextlib import closing

def main():
        multicast_group = '239.255.255.250'
        src_adapter_ip = '' # DLNA クライアントがいるネットワークの IP アドレスを指定
        dst_adapter_ip = '' # DLNA サーバがいるネットワークの IP アドレスを指定
        port = 1900
        timeout = 5.0

        with closing(socket.socket(socket.AF_INET,socket.SOCK_DGRAM)) as src_sock:
            src_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
            src_sock.bind(('',port))
            src_sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP,
                                  socket.inet_aton(multicast_group) + socket.inet_aton(src_adapter_ip))

            while True:
                request_data, client_addr = src_sock.recvfrom(4096)
                with closing(socket.socket(socket.AF_INET,socket.SOCK_DGRAM)) as dst_sock:
                    dst_sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(dst_adapter_ip))
                    dst_sock.settimeout(timeout)
                    dst_sock.sendto(request_data,(multicast_group,port))
                    while True:
                        try:
                            response_data, server_addr = dst_sock.recvfrom(4096)
                            src_sock.sendto(response_data,client_addr)

                        except Exception:
                            break
        return

if __name__ == '__main__':
    main()

上記を /usr/local/sbin/proxy_dlna.py として保存しておきます。

保存が完了したら下記のように systemd のサービスを作成します。
今回は下記の内容を /etc/systemd/system/proxy_dlna.service として作成しました。

[Unit]
Description=Launch DLNA Proxy (/usr/local/sbin/proxy_dlna.py)
# After=wg-quick@wg0.service  #WireGuard を使っている場合はこうしておくと WireGuard が起動した後に起動するようになります。

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/proxy_dlna.py

[Install]
WantedBy=multi-user.target

保存が完了しましたら systemctl enable proxy_dlna 等で有効にすれば完了です。


手順は以上となります。

ただ上記のようなプロキシで全て動作するかというとそうではなく、特に DTCP-IP 等を用いるシステムの場合は「TTL は 3ホップ以下」「RTT は 7ms 以下」という制約が存在するため実現するのが大変難しい状況になっています。

もしそのような場合については NTT の NGN 網の特殊性を用いて回避しているケースや、L2TPv3 などを上手く組み合わせて回避しているケースがネット上にいくつか転がっていますのでそちらを用いるのが良いかなと思われます。

とはいえ、当方環境ではこれで VPN ライフがかなり改善されましたので、もしよろしければ参考にしていただけたらと!

Ubuntu 19.10 で Hyper-V の Enhanced Mode を有効にする (Enable the Enhanced Mode with Ubuntu 19.10)

どうもみむらです。

Ubuntu を Hyper-V で使用していると、
起動時に高確率で GUI 起動待ちになって何も操作できなくなったり
( Ctrl + Alt + Function Key での切り替えしてもログイン画面が出てこない )
そもそも Enhanced Mode が使えなくて色々と不便でしたので、
有効にするスクリプトを作成しました。


Hi I’m Mimura.

I make a script to enable the “Enhanced Mode” on Hyper-V with “Ubuntu 19.10”.
Also, it fix an issue that to fail to start X.


Script:

下記からダウンロードできます。 / you can download from this link:
https://gist.github.com/mimura1133/a6aebf4945b6688d1a5aedffdfa9368c


How does it works / どういう仕組みか:

このスクリプトは、
Microsoft が提供している Enhanced Mode を有効にするスクリプトを元に
作成されています。

https://github.com/microsoft/linux-vm-tools/tree/master/ubuntu/18.04

最近の Ubuntu では Wayland を最初に使用しようと試みます。

上記のスクリプトでは、 Xorg を使うようにできているため、
Wayland を利用しないようにする処理を追加し、
Enhanced Mode を Xorg 経由で使えるようにしました。

# Stop to use wayland.
sed -i_orig -e 's/#WaylandEnable=false/WaylandEnable=false/g' /etc/gdm3/custom.conf

また、どうやら Ubuntu に入っている Wayland と Hyper-V が相性が悪いらしく
時々起動に失敗する(コンソール経由のログインも受け付けない状態になる)のですが
Wayland を無効にすることで、確実に起動できるようにもなります。

(Arch Linux に入れたときには上手く動いていたので、 Ubuntu の問題だと個人的には思ってます..)


this script based on Microsoft’s.
https://github.com/microsoft/linux-vm-tools/tree/master/ubuntu/18.04

Recent versions of ubuntu are try to use a Wayland before using Xorg.
So, I added a code to disable to use Wayland.

# Stop to use wayland.
sed -i_orig -e 's/#WaylandEnable=false/WaylandEnable=false/g' /etc/gdm3/custom.conf

In addition, the Wayland and Hyper-V seem to be incompatible, sometimes fail to boot,
but the issue is fixed at the same time by disabling wayland.


Ubuntu の最新版が Enhanced Mode でサクサク動いて、コピペも出来るようになりますし、
同じように Kal Linux でも Enhanced Mode が使えるようにするものも公開していますので
Linux を Hyper-V で使っている方は、是非お試しくださいませー。

I have also released another versions for Kali Linux.
Please feel free to use the script if you’re using Linux on Hyper-V.

Git Repository (Forked from Microsoft):
https://github.com/mimura1133/linux-vm-tools

Fiddler の Inspector プラグインを作ろう

どうもみむらです。

お仕事の関係上、アプリケーションの通信を見ることがありまして。
一般には “Burp” を使うことが多いのですが、
やっぱりサクッと見たいときには Fiddler 先生を使いたくなることがあります。[要出典]

Burp のプラグインを作る話はよくあるのですが Fiddler の話はあまりないのと、
作ってみたらサクッと出来たので記事に纏めてみようかと。


1.プロジェクトを作る

下記のようにまず、 “.NET Framework” の クラスライブラリを作成します。

Fiddler は .NET Framework の 4.6.1 を使用していますので、
バージョンは 4系を選択します。 (4.6.1 か それ以降を選択しておけば OK です)


2.Fiddler を参照に加える

Fiddler.exe を参照に加えます。

通常下記のパスに Fiddler がありますので、こちらを追加します。
%LOCALAPPDATA%\Programs\Fiddler\Fiddler.exe

また、Fiddler の Inspector プラグインはUI に Windows Forms を使用しますので System.Windows.Forms も忘れずに参照に加えます。


3.デバッグの設定をする

プラグインの開発時に F5 でデバッグ出来た方が良いですよね。

プロジェクトの設定の「デバッグ」から
Fiddler.exe (%LOCALAPPDATA%\Programs\Fiddler\Fiddler.exe) を
デバッグプログラムとして指定します。

同様に「ビルド」から、出力先のパスを
お使いのユーザのドキュメントフォルダの “Fiddler2\Inspectors” に出力するようにします。
(%USERPROFILE%\Documents\Fiddler2\Inspectors を展開したパスに保存すれば OK です)


4.Request 側と Response 側のビューのひな形を作る

それでは本題となるビューを作ってみましょう

ビューを作る際は下記のように、レスポンス用とリクエスト用を2つ定義する必要があります。

リクエスト用のビュー

基本的に Inspector2, IRequestInspector2 を継承して作ります。
上記の画像に当該するコードは下記の通りです

using Fiddler;
using System.Windows.Forms;

public class RequestView : Inspector2, IRequestInspector2
{
    /// <summary>
    /// Inspector ビューへの項目の追加やウィンドウの初期化等を行う
    /// </summary>
    /// <param name="o"></param>
    public override void AddToTab(TabPage o)
    {
        o.Text = "さんぷる!";
        o.Controls.Add(new TextBox() {Text = "リクエストヘッダ用!", Dock = DockStyle.Fill, Multiline = true, ReadOnly = true});
    }

    /// <summary>
    /// 項目が必要なくなった場合のクリーンアップ処理を書く (IDisposable の Dispose みたいな)
    /// </summary>
    public void Clear()
    {

    }

    /// <summary>
    /// POST リクエストとして送信されたメッセージ本文
    /// </summary>
    public byte[] body { get; set; }

    /// <summary>
    /// テキストが編集されたかどうかを返す
    /// </summary>
    public bool bDirty { get; }

    /// <summary>
    /// 読み取り専用項目かを取得・設定する
    /// </summary>
    public bool bReadOnly { get; set; }

    /// <summary>
    /// HTTP のリクエストヘッダ
    /// </summary>
    public HTTPRequestHeaders headers { get; set; }

    /// <summary>
    /// Inspector ビュー内の項目の順番(昇順でソートされるため、値が大きければ項目の最後に追加される)
    /// </summary>
    /// <returns>表示順番</returns>
    public override int GetOrder() => 1000;
}

レスポンス用のビュー

レスポンス用の場合は Inspector2, IResponseInspector2 を継承して作ります。
上記の画像に当該するコードは下記の通りです

using Fiddler;
using System.Windows.Forms;

public class ResponseView : Inspector2, IResponseInspector2
{
    /// <summary>
    /// Inspector ビューへの項目の追加やウィンドウの初期化等を行う
    /// </summary>
    /// <param name="o"></param>
    public override void AddToTab(TabPage o)
    {
        o.Text = "さんぷる!";
        o.Controls.Add(new TextBox()
            {Text = "レスポンスヘッダのびゅー!", Dock = DockStyle.Fill, Multiline = true, ReadOnly = true});
    }

    /// <summary>
    /// 項目が必要なくなった場合のクリーンアップ処理を書く (IDisposable の Dispose みたいな)
    /// </summary>
    public void Clear()
    {

    }

    /// <summary>
    /// 受信されたメッセージ本文
    /// </summary>
    public byte[] body { get; set; }

    /// <summary>
    /// テキストが編集されたかどうかを返す
    /// </summary>
    public bool bDirty { get; }

    /// <summary>
    /// 読み取り専用項目かを取得・設定する
    /// </summary>
    public bool bReadOnly { get; set; }

    /// <summary>
    /// HTTP のレスポンスヘッダ
    /// </summary>
    public HTTPResponseHeaders headers { get; set; }

    /// <summary>
    /// Inspector ビュー内の項目の順番(昇順でソートされるため、値が大きければ項目の最後に追加される)
    /// </summary>
    /// <returns>表示順番</returns>
    public override int GetOrder() => 1000;
}

5.Fiddler の RequiredVersion を宣言する

上記の2クラスだけではダメで、必要な Fiddler のバージョンを宣言する必要があります。

どこか1つのソースコードで問題ありませんので、
下記のようにバージョンを宣言するだけのソースコードを作成しましょう。

[assembly: Fiddler.RequiredVersion("2.3.0.0")]

6.実行してみよう

上手くいけば下記のように、「さんぷる!」という名前の項目が追加されて
作成したプラグインが読み込まれるはずです。

画像を編集

7.目的に合わせて拡張しよう

今回の例は Inspector プラグインとして任意のビューを表示するところまでを紹介しました。
ただこれだけではBody の処理や その他のパラメータの処理がかなりおざなりになっています。

そこで下記のような、Request / Response Body のテキストを編集できるサンプルを
下記の GitHub に公開しました。
https://github.com/mimura1133/sample_fiddlerInspector

コードも極力短く、また各パラメータに関しても極力コメントを入れてありますので、
これを踏み台にして独自の Inspector プラグインを作成頂けたら幸いです。


それでは、楽しい Fiddler ライフを!

TeX Support for Visual Studio を作ってみた。

どうも。みむらです。
論文を書く日々が続いております。そろそろ完成させなきゃなんですが・・。

tex_vsaddon

そんなこんなで、
ちまちまと作っていた Visual Studio の TeX Support アドオンがいい感じに形になりましたので
ベータ版ではありますが公開いたします。

 

利点としては、次のような点があげられます:

Visual Studio のプロジェクトとして追加出来るため、他のプロジェクトと一緒に管理出来る。
F5 キーで pdf がビルドされる。 Debug ビルドにすれば、リーダーで自動的に開く。
画像ファイルは勝手にビルド時に extractbb される。
・ちゃんと色が付く。

こんなところでしょうか。

 

image

もし、やるならこんな感じですよね。

 

繰り返しになりますが、まだベータ版です。
分かる人のみが使用してください。

 

また、このプロジェクトは私の修論の気分転換の一環で作成されているため、
コードが非常に汚いです。

落ち着いたらリファクタリングしたいです。。


2016/01/27 17:11 update:

本日8時頃に公開いたしましたバージョンではシンタックスハイライトが
上手く動作しない事が判明しましたので、先ほどファイルを更新いたしました。

既にインストール済みの場合は再度ダウンロード頂き、
vsix ファイルから上書きアップデートが行えるようになっています。

 

2016/01/27 22:50 Update:

複数行に渡る TeX コードのハイライトの際に問題がありましたので
修正いたしました。
 


ダウンロードページ : http://mimumimu.net/beta/#VsTeXProj
直接ダウンロード: http://mimumimu.net/beta/programs/VsTeXProject.zip

ソースコード : https://github.com/mimura1133/vstex

ライセンスとしては今のところ MIT ライセンスです。


使い方:

1. 環境を準備する。

1.1. TeX の実行環境を準備する。

 

このプログラムの実行には、LaTeX 環境が必要になります。
具体的には、 pLaTeX or LaTeX,  bibtex, extractbb, dvipdfmx を使用します。

もし環境が準備できていない場合は、阿部さんというかたが作成し提供されている
「TeX インストーラ3」を使用しますと簡単に準備が出来ます。

ダウンロード:http://www.math.sci.hokudai.ac.jp/~abenori/soft/abtexinst.html

ページ下部の「最新版」と書かれたリンクからプログラムがダウンロード出来ます。

image

 

展開したファイルのうち、 abtexinst.exe を実行します。

image

後は「次へ」をクリックして画面に従っていくだけですが(デフォルトのままで大丈夫です)

もし「不明なエラーが発生。ログファイルを見ると何か分かるかも知れません」と出る時は、

image

image

ダウンロード先の URL をこのように、“core.ring.gr.jp” にすると
上手くいくかも知れません。

 

あとはひたすら完了するのを待ちます・・。

image

 

1.2. Visual Studio の実行環境を準備する。

Visual Studio が入っていない場合は、こちらもインストールをお願いします。

ダウンロード: https://www.visualstudio.com/ja-jp/downloads/download-visual-studio-vs.aspx

image

Visual Studio Community で動作しますが、それ以外にも Professional や Enterprise でも動作します。
(Express でも動作するようには設定してありますが、動作確認はしていません。)

またインストール時にメモリが不足していると、コンポーネントのインストールに失敗した表示が出てセットアップに失敗するようです。 VM 上で行おうとする方は気をつけてください。

 


2. アドオンをインストールする

下記リンクよりアドオンのファイルをダウンロードします。

ダウンロード: http://mimumimu.net/beta/programs/VsTeXProject.zip

 

中に入っている VsTeXProject.vsix をダブルクリックしますと、インストーラが起動します。

image

よろしければ、「インストール」をクリックしてインストールを完了させてください。

なお、このとき Visual Studio が起動中の場合
インストール後に Visual Studio を起動し直してください。

 


3. TeX プロジェクトを作る

起動させましたら、
他のプロジェクトを作るときと同じように、プロジェクトを作成します。

image

 

左側のテンプレート一覧“TeX Project” が追加されますので、それを選択すると、
TeXProject が選択できるようになります。

image

 

作成画面になれば、プロジェクトの作成は完了です。

image

 


4. TeX を書いて pdf を作る。

このページの「ファイルの作成」にある内容を書き込んで見ましょう。

https://texwiki.texjp.org/?LaTeX%E5%85%A5%E9%96%80%2F%E6%9C%80%E5%88%9D%E3%81%AE%E4%BE%8B

image

おそらく上記の画面のようになったと思います。
(撮影用に文字サイズを大きくしてあります。)

その状態で F5 キーを押してみましょう。

pdf がビルドされ、上手くいけば関連づけられたプログラムで pdf が開きます。

..もし開かなかった場合(特に初回):
ベータ版特有のあれですが、プロジェクトファイルを再読込すると治ります。

また “Debug ビルド” になっているか確認してください。
Release ビルドでは出力ファイルを開かないようになっています。

 

手っ取り早く再読込するには:

1.プロジェクトを右クリックし、「プロジェクトのアンロード」を選択。

image

 

2.アンロードされるので、もう一度右クリックして「再読み込み」を選択。

image

 

。。。たぶんこれで F5 キーを押した時に、ちゃんと開くようになるはずです。

 


5. pdf ファイルを取りだそう

プロジェクトファイルの置いてあるフォルダに “pdf” というフォルダが出来ており、
最後に正常にビルド出来た pdf ファイルがここに置かれています。

image

 


6. 画像を入れてみよう

6.1. 画像をプロジェクトに入れる

プロジェクトの中に画像をドラッグ&ドロップするなどして追加します。

image

このとき、画面下部の「プロパティ」の “Build Action”
”Picture File” になっていることを確認してください。

image

 

また、ファイルをマウスオーバーすると画像が表示されます。

image

 

6.2. tex の中に画像を参照するコードを書く。

ドライバとしては dvipdfmx になりますので、
頭に dvipdfmx を usepackage して、画像を挿入したいところで includegraphics をします。

コードとしては こんな感じになります:

\documentclass{jsarticle} \usepackage[dvipdfmx]{graphicx} \begin{document} 吾輩は猫である。名前はまだ無い。 どこで生れたかとんと見当がつかぬ。 何でも薄暗いじめじめした所で ニャーニャー泣いていた事だけは記憶している。 吾輩はここで始めて人間というものを見た。 \includegraphics[width=4cm]{img101.png} \end{document}

 

 

そして、これをビルドするとこのような感じになります:

image

 


7. そのほかの機能

7.1. カスタムビルド

既定のビルド方法ではなく、独自のビルドを行いたい場合、
プロパティの “Custom Tool” 欄に記述します。

image

ここに書かれたプログラムにパラメータとして対象のファイルのパスが渡されますので、
後は煮るなり焼くなり。

込み入ったことをしたい場合は、バッチファイルを別途作成し、
ここの欄にそのファイルへのパスを書くといいと思います。

 

7.2. ビルドアクションについて

ビルドアクションには Compile,  Picture, Content の3つがあります。

それぞれ次のようになっています:

Picture:
画像処理用。ビルドの一番最初に処理される。
指定されたファイルを “extractbb” コマンドに与え、 xbb ファイルを生成する。

Content:
コンテンツ処理用。ビルドの二番目に処理される。
何も書かなければ何もしない。
eps ファイルなど、処理をしなくても直接読み込める形式のファイル
分割した TeX ファイルのうち、 include で読み込まれるファイルをこれに指定します。

Compile:
TeX ファイル処理用。ビルドの最後に処理される。
pLaTeX → bibtex → pLaTeX → dvipdfmx の順番で実行されて処理される。

 

7.3. プロジェクトプロパティについて

image

Processor:
LaTeX の処理ソフトを指定します。既定は platex です。

Path:
LaTeX のコマンド類が置かれているフォルダを指定します。
空欄の場合は %PATH% の中から検索します。(既定)

 


8. サポートについて

何かありましたら、サポート掲示板 ( http://mimumimu.net/bbs/Support/ ) までお願いします。

また、開発者の方で Pull-Request を投げてくださる方は、
Github に対して直接お願いします。 ( https://github.com/mimura1133/vstex )

また、直接連絡が必要な場合は、
連絡先ページ ( http://mimumimu.net/community/ ) よりお願いします。

 


そんなわけで、もし使う人が居れば・・どうぞ・・!

Visual Studio 2015 で独自言語に対応させてみる。

みむらです。
新年初めての記事ですかね。明けましておめでとうございます。

一年の計は元旦にありということで、元旦から大幅に過ぎてしまいましたが
書き初めを。


何をするか、ということですが
タイトルにあるとおり「独自言語に対応させてみよう」ということで。

2016-01-16 (1)

たとえばこういう感じのが30分ほどで作成できます。


とはいえ、こんなことをしようとする人は、
たぶん放っておいても大丈夫そうな皆さんしかいなさそうな気もしますので、さくっとポイントのみ。

 

まず、作るためには “MPF for Projects” というのを使用するのが楽ちんなのですが、
Visual Studio 2015 用が出ていないようでしたので適当に作って公開しました。

https://github.com/mimura1133/uo_mpfproj14

この中にある “Samples/UsagiProject” の中身を見ると、大体の作り方が見えてくるかと思います。


1. とりあえず、新しい言語プロジェクトを作る:

CustomProjectPackage.cs を開くと、
このようにプロジェクト名とプロジェクトファイルの拡張子を指定できますので、
ここを適当にごにょごにょ。

image

次に上記でごにょごにょした形に合うように、 Templates フォルダ内を設定します。

Projects の中に作ったプロジェクトファイルとアイコンが、
新規作成時のプロジェクト一覧に並びます。

image

デフォルトのままですと、こんな感じですね。

image

 

重要な点として、このとき “Template” フォルダの中身について
ビルドアクションを “コンテンツ” そして “Include in VSIX” を “True” にする
必要があります。

これを忘れると、プロジェクト一覧に出てこなくなります。

image

 


2. 作ったはいいけれど、コンポーネントが読み込めないとかのエラーが出る。

主に、 “Microsoft.VisualStudio.Project” が読み込めないエラーだと思います。

デバッグ中に例外が出て、読み込みが無視されている場合は再ビルドで治る事がありますが、
それでも治らない場合。

extension.vsixmanifest および source.extension.vsixmanifest の “資産” のところに、
”MefComponent” として自身が登録されているか
どうかを確認してみてください。

image

私もこれで2時間潰しました orz.

 


あともう一つ。

ソリューションのファイル群が置いてある場所までのパスに日本語が
入っていないかどうか。

vsix に閉じ込めるファイルやソースのファイルは日本語でも問題なさそうなのですが、
そのソリューション一式のファイルまでのパス中に日本語が入っていると、
インストールしても何も出てこない vsix ファイルが生まれます。

たぶん vsixmanifest の処理あたりで問題が起きていそうな気がしますが、
詳しい所はよく分かりません。。


3.F5 でデバッグしたい!

まず、自身の参照のところに

Microsoft.VisualStudio.Modeling.SDK.Integration.14.0

を入れておきます。
次に、プロジェクトのプロパティより、「デバッグ」の「外部プログラムの開始」に

C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe

と記述し、コマンドライン引数に

/rootsuffix Exp

と書くといい感じに F5 でデバッグできるようになります。

 


そんなこんなで、色々と楽しい事が出来そうな Visual Studio さん。

image

Visual Studio 2015 の vsixmanifest を見ると、
このように Express 版に対してもインストール設定ができるようなので
私のようなフリーソフト作者にとっては、わざわざお高いソフトを導入してもらわなくても試してもらえるってことで、とてもわくてかです。

 

そんなこんなで、私の書き初めは今年も C# から。
それではみなさん Happy Visual Studio Life を。

No Visual Studio, No…. いや、 VS なくても頑張れるかな・・