Name Not Found

情報工学を学ぶ理系大学生の雑記

watchmanを使ってTexのコンパイルを自動化してみる

Texで文章を書く際に,いちいちコンパイルを行うのが面倒だったので自動化してみました.

今回は,facebookが提供しているwatchmanを使います.

github.com

watchmanとは

ファイルの変更を検知するツールで,ファイルの変更をトリガーとして何らかのアクションを起こすことが出来ます.

watchmanのインストール

Homebrewで手軽にインストールできます

brew install watchman

watchmanの使い方

今回の使い方で必要なのは次の1つだけです (watchmanのドキュメント->watchman | A file watching service)

watchman -- trigger [監視対象ディレクトリへのパス] [トリガ名] [監視するファイルのパターン] -- [実行するコマンド]

このコマンドで

  • [監視対象のディレクトリ]で変更が生じた場合,
  • 該当ファイルが[監視パターン]にマッチすれば
  • [コマンド]が実行

されます

(ここでの監視パターンはwatchman のSimple pattern syntaxのみが使用可能です https://facebook.github.io/watchman/docs/simple-query.html)

Texファイルを自動コンパイルする

まず,コンパイルを行うシェルスクリプトを書きます.(update.shとします)

platex foobar && dvipdfmx foobar

そして,watchmanでTexファイルを監視させるために以下のコマンドをtexファイルのあるディレクトリ内で実行します.

 watchman -- trigger ./ texbuild '*.tex' -- ./update.sh

これで,Texファイルの変更時にコンパイルが自動で行われるようになりました!

監視をやめる

triggerを解除してあげましょう

watchman trigger-del ./ texbuild

その他

コンパイルが終わったら自動的にビューワで開きたい

Macユーザであれば,シェルスクリプト

platex foobar && dvipdfmx foobar && open foobar.pdf

としてあげれば,自動的に開いてくれるはずです!

上の方法だといちいちフォーカス移ってだるい

仰るとおりです. Mac標準のプレビュー.appでは,フォーカスを当てないと再描画されないため,他の方法を考える必要があります...

Macには変更を検知して,再描画を行ってくれるPDFビューワがあるようなので,それを使うのもありかもしれません!

skim.softonic.jp

参考

アナライジング・マルウェアのサンプルはWin8じゃ動かない!!!

最近アナライジング・マルウェアという本を読み始めました.

アナライジング・マルウェア ―フリーツールを使った感染事案対処 (Art Of Reversing)

アナライジング・マルウェア ―フリーツールを使った感染事案対処 (Art Of Reversing)

マルウェアは簡単に解析できないように

  • Packing
  • Polymorphism
  • Metamorphism

等の対策が施されています.それらが具体的に

  • どのようなもので,
  • どのように解析を妨害するのか,

それらを知るために読み始めました.

しかし,1章から壁にぶつかりました...書いてある操作を行うとエラーを吐くのです...

環境

ホストOS: MacOSX 10.10 仮想化ソフト: Parallels ゲストOS: Windows8.1(64bit)

発生箇所

Immunity debuggerを用いてサンプルのmalware.exeを解析する箇所.(p.24から

そこで,malware.exeをImmunity debuggerへドラッグ&ドロップして開こうとするとエラーが生じる.

エラー内容

f:id:Oga-Jun:20150607171216p:plain

上のような

アプリケーションを正しく起動出来ませんでした(0xc000007b)。
[OK]をクリックしてアプリケーションを閉じてください。

というエラーが表示され,解析をうまく進めることが出来ない.

解決策

ゲストOSをWindows7に変えて実行しましょう.

解決までの経緯

Immunity Debuggerの問題じゃないか?

ゲストOSのスナップショットを撮ってあるから,とりあえずマルウェアを実行してみよう!!!

ということで,実行してみました(サンプルだとしても,マルウェア初心者の自分は戦々恐々です

上のエラーと同じ結果が得られました.ということは,Immunity debuggerの問題では無いはず

少し前の本なので,もしや32bit用にバイナリが作られているのでは?

たとえ64bit環境でも,32bitプログラムはWOW64という機能により動くはずですが,試しに32bitのWindows8をインストールして実行してみました. が,しかしエラーは変わらず.

その後紆余曲折あり,

そもそもWindows8じゃダメなんじゃないか.少し前の本だし

ということで,Windows7のゲストOSを用意し,同様の操作を行いました.そしたら無事解決.

これで読み進められそうです. 調べても解決策が見つからなかったので,同じような問題に直面した方の助けになれば.

Ubuntu14.04 でApache2 設定ファイルの場所(ポート番号変更)

スクレイピングして遊んでみるためのテスト環境として,PHP実行環境が欲しかった. MAMPでも良かったのですが,なんとなくVMにサーバ建ててみようと思ったのでトライ.

そこで,Ubuntu14.04にApache2を入れ,ポート番号を変更しようとしたところ,httpd.confが見つからなかったのでメモ.

設定ファイルの場所

/etc/apache2/
              |-apache2.conf
              |-ports.conf   (<- ポート変更に使うのはこれ!
              |-site-available/
                         |-000-default.conf   (<-とこれ!
                         |-default-ssl.conf
              |-sites-enabled/
              |-conf-available/
              |-conf-enabled/
              |-mod-available/
              |-mod-enabled/
              |-envvars
              |-magic

多くのサイトはCentOSについて解説しているため,httpd.confに

Listen 8000

と記述すれば,ポート番号を8000に変更できると有りましたが,Debian系であるUbuntuはどうやらhttpd.confは無い模様.

/etc/apache2/配下のファイル群がhttpd.confの代わりみたい.

ポート番号の変更(例として8000番に変更

ports.confListen 80

Listen 8000

とし, sites-available/000-default.conf

<VirtualHost *:80>

だったのを,

<VirtualHost *:8000>

に変更.

そして,sudo service apache2 restartすればポート変更完了!

http://VMのIPアドレス:8000でアクセスできるようになりました.

お世話になったサイト

自宅サーバー(ubuntu server Apache)

detail.chiebukuro.yahoo.co.jp

【Ruby】rbenvでruby1.9.1-p430をインストールしようとしたらハマった

rbenvでrubyのバージョン1.9.1-p430をインストールしようとしたらハマったのでメモ。

環境

MacOS Yosemite Homebrew 利用

現象

 rbenv install 1.9.1-p430

を実行したところ、下記のようなエラーログを吐いてインストール出来なかった。

configure: WARNING: unrecognized options: --with-readline-dir
checking build system type... i386-apple-darwin14.0.0
checking host system type... i386-apple-darwin14.0.0
checking target system type... i386-apple-darwin14.0.0
checking whether the C compiler works... no
configure: error: in `/var/folders/61/8kytz9bj4szbhmj5l7jt3mm40000gn/T/ruby-build.20141230202407.88569/ruby-1.9.1-p430':
configure: error: C compiler cannot create executables
See `config.log' for more details.

注目したのはerror: C compiler cannnot create executablesの箇所。

どうやらgccがおかしいらしい。きっとこれもclangのせいである。

解決策

homebrewでapple-gcc42をインストールし、

% brew install apple-gcc42 
% CC=gcc-4.2 brew install 1.9.1-p430

と実行する

経緯

調べてみたところ、やはり同じようなエラーで困った人が。

http://qiita.com/laiso/items/fe627d77c92b51874931

gccのバージョンが原因のよう。とりあえずhomebrewで昔インストールしたgcc49(証明書周り?が面倒でインストールしただけ。)をアンインストール。

そしてとりあえずまた rbenv install 1.9.1-p430 を実行してみると次のようなエラーが出力されました。

ERROR: This package must be compiled with GCC, but ruby-build couldn't
find a suitable `gcc` executable on your system. Please install GCC
and try again.

DETAILS: Apple no longer includes the official GCC compiler with Xcode
as of version 4.2. Instead, the `gcc` executable is a symlink to
`llvm-gcc`, a modified version of GCC which outputs LLVM bytecode.

For most programs the `llvm-gcc` compiler works fine. However,
versions of Ruby older than 1.9.3-p125 are incompatible with
`llvm-gcc`. To build older versions of Ruby you must have the official
GCC compiler installed on your system.

TO FIX THE PROBLEM: Install Homebrew's apple-gcc42 package with this
command: brew tap homebrew/dupes ; brew install apple-gcc42

You will need to install the official GCC compiler to build older
versions of Ruby even if you have installed Apple's Command Line Tools
for Xcode package. The Command Line Tools for Xcode package only
includes `llvm-gcc`.

BUILD FAILED

1.9.3-p125より古いrubyコンパイルするためにはapple-gcc42を使って欲しいとのこと。

そこで

% brew install apple-gcc42

を実行して、apple-gcc42をインストール。

これだけでは

% rbenv install 1.9.1-p430

としてもapple-gcc42を使ってくれない。(clangが使われてしまう)

そのため

% CC=gcc-4.2 brew install 1.9.1-p430

gccのバージョンを指定して実行してあげることでインストールすることが出来ました!

【C言語】ctimeがsegmentation fault

C言語でクライアント・サーバー型のプログラムを作っていて、Macのローカルで開発した後にサーバプログラムをCentOSに移した時にctimeでハマったのでメモ。

経緯

  • クライアント・サーバ型のプログラム
  • Macのローカル環境で動かしたら問題なく動いた
  • 問題はサーバ側のプログラムを、別のCentOSに移すと生じた
  • ctimeの部分でsegmentation faultが発生した

問題

ctimeを使おうとするとsegmentation faultが生じる

原因

time.hをincludeしていなかった

問題となったプログラム

送受信日時を表示するために、以下のような形のプログラムを書いていました。

#include <stdio.h>
#include <sys/time.h>

int main(void)
{
    struct timeval time;
    gettimeofday(&time, NULL);
    printf("%s", ctime((time_t *)&time));
}

これをMacコンパイルするとsegmentation faultは発生しません。が、しかし、CentOSコンパイルするとsegmentation faultが発生します。

このプログラムに

#include <time.h>

を加えてあげることでCentOSでも問題なく動くようになります。同じようなことで困っている方が居てお役に立てれば。

(includeし忘れはコンパイル時にエラーが出るとばかり思い込んでいたので気づきませんでした。。。(;´д`)トホホ…

思うところ

今回のMacOSでは実行できたのは、gccと打っていても裏ではclangが動いているからかな―。と想像してます。Mavericksからgccはclangのエイリアスとなったようなので。

きっとclangがよろしくやってくれていたのでしょう。

どうなんでしょ。

【Android】AndroidStudioでVolleyをgit submodule addして使う

EclipseからAndroid Studioへ移行し、リファクタついでにvolleyをgit submoduleで利用しようとし、こちらの方のブログを参考に作業を進めました。

Androidプロジェクトを新規作成してVolleyが使えるようになるまで | Androg

ひと通り終わり、Syncしたところvolley/tests/AndroidManifest.xml内で次の様なエラーが生じてしまいました。

Attribute instrumentation#android.test.InstrumentationTestRunner@targetPackage value=(com.android.volley) from AndroidManifest.xml:28:9
    is also present at manifestMerger1551574815074955787.xml:12:22 value=(com.android.volley.tests)
Suggestion: add 'tools:replace="android:targetPackage"' to <instrumentation> element at AndroidManifest.xml:27:5 to override

よくみたら、Suggestionというのが含まれていたので、 manifestに

xmlns:tools="http://schemas.android.com/tools"

を、instrumentationへ

tools:replace="android:targetPackage"

を追加し、Syncしてみると解決解決。


ただ、submoduleについてよく分かってはいないのですが、submodule内のファイルを弄ることに抵抗があります。 どうなんでしょうか。。。

【Rails】validateのエラーメッセージ日本語化でハマった

rails tutorialを終え、ようやく自分の作りたいものをつくろうと走りはじめました。

そこで今回はユーザ登録画面において、validateのエラーメッセージを日本語で出力したい! ってことで、しました。日本語化。

Railsの多言語化対応 i18nのやり方を整理してみた!【国際化/英語化】 - 酒と泪とRubyとRailsと

そこで、こちらのサイトを参考にさせていただいたのですが、どうもうまく動かない。

普段開発サーバにPowを使っているのですが、試しに

rails s

を実行してみたところ、rails serverでエラーメッセージが日本語化されました!

これにより、

powder restart

を実行してみたところ、Powでも日本語化してくれました。

困ったらします。リスタート。

このせいで結構な時間が取られたので、同じような駆け出しの人の助けになればと。

configのファイルを弄った時にはサーバ再起動もしなくちゃなんですね。 お恥ずかしい。