PowerPoint作成した図をLaTeXで使う方法

表題の件ですがMac限定です.

PowerPointで作成した図をPDFにするためには,ファイル->プリント ダイアログの左下にある「PDFとして印刷」を選択して適切なファイル名を入力することでできます.楽ちんですね.

ただ,そのPDFファイルをLaTeXで使おうとするとA4横サイズの図になるため,不便です.トリミングする必要があります.

そこで,プレビューを利用します.範囲選択して,コピー,クリップボードから新規作成してPDFとして保存すると,範囲選択された部分だけのPDFになります.範囲指定した矩形情報はPDF内の/CropBoxに範囲を書き込んでいます.

あとは,mediabb.styを使って,/CropBoxを見るようにすればいいだけす.

\usepackage{mediabb}

\begin{figure}[t]
\centering
\includegraphics[mediaboxonly=/CropBox,width=.3\textwidth]{sample.pdf}
\caption{キャプションはここ}
\label{fig:sample}
\end{figure}

おまじないではない#include その2

http://d.hatena.ne.jp/ytetsuwo/20110820/p1
の続き

stdio.hからincludeされている/usr/include/_types.hの抜粋は以下の通り

    32  #include <sys/cdefs.h>
    33  #include <machine/_types.h>
    34  
    35  /*
    36   * Standard type definitions.
    37   */
    38  typedef __uint32_t      __blksize_t;    /* file block size */
    39  typedef __int64_t       __blkcnt_t;     /* file block count */
    40  typedef __int32_t       __clockid_t;    /* clock_gettime()... */
    41  typedef __uint32_t      __fflags_t;     /* file flags */
    42  typedef __uint64_t      __fsblkcnt_t;
    43  typedef __uint64_t      __fsfilcnt_t;
    44  typedef __uint32_t      __gid_t;
    45  typedef __int64_t       __id_t;         /* can hold a gid_t, pid_t, or u
id_t */
    46  typedef __uint32_t      __ino_t;        /* inode number */
    47  typedef long            __key_t;        /* IPC key (for Sys V IPC) */
    48  typedef __int32_t       __lwpid_t;      /* Thread ID (a.k.a. LWP) */
    49  typedef __uint16_t      __mode_t;       /* permissions */
    50  typedef int             __accmode_t;    /* access permissions */
    51  typedef int             __nl_item;
    52  typedef __uint16_t      __nlink_t;      /* link count */
    53  typedef __int64_t       __off_t;        /* file offset */
    54  typedef __int32_t       __pid_t;        /* process [group] */

C言語は型のビット数が厳密に定義されていないため、いろいろと不都合が生じる場合がある。そこで、まずmachine/_types.hでそのビット数を厳密に決めた型を定義している。このファイルは環境(32bitOSとか64bitOSとか)によって異なるので注意。で、そのヘッダをincludeして他のヘッダファイルで利用する様々な型を定義している。ビット数固定の型をtypedefしておくて、どのような環境でも型の大きさが固定になって便利なになるわけですね。machine/_types.h は以下の通り

    48  /*
    49   * Basic types upon which most other types are built.
    50   */
    51  typedef __signed char           __int8_t;
    52  typedef unsigned char           __uint8_t;
    53  typedef short                   __int16_t;
    54  typedef unsigned short          __uint16_t;
    55  typedef int                     __int32_t;
    56  typedef unsigned int            __uint32_t;
    57  typedef long                    __int64_t;
    58  typedef unsigned long           __uint64_t;

64bit環境なんでlongが64bitになってるんですね。32bit環境の場合はこの行の内容が変わってきます。

さて、stdio.hに戻ってくると、

    47  typedef __off_t         fpos_t;
    48  
    49  #ifndef _SIZE_T_DECLARED
    50  typedef __size_t        size_t;
    51  #define _SIZE_T_DECLARED
    52  #endif

はい、実際の型を定義してます。stdio.hでは3つの型を定義するとC言語の仕様で決められていて、fpos_tとsize_tはその2つなんです。で、あと1つは何かというと皆さんご存じFILEです。で、この後、FILE構造体の定義が記述されているわけですが、それはまたこんど。

おまじないではない#include

C言語を最初に学ぶと、必ず出てくる以下の行

#include <stdio.h>

おなじないと言われて、常に書いている人がいるみたいだが、おまじないでもなんでもなくて stdio.h ファイルをそこに展開せよといっているだけである。

なんで展開するかというと、たいていはprintf関数を使うので、そのプロトタイプ宣言なんかが書いてあって必要になるから。使う分にはそれでもいいけど、それだと面白くないからstdio.hファイルでも見てみようかと思うわけですよ。

どこにあるかというと、まぁ、環境によるわけですが、UNIX系の場合 /usr/include だったりします。 というわけで、/usr/include/stdio.hファイルを見ていけばいいということで。以下、FreeBSD 7.3-RELEASE の環境の話です。

ファイル長いので、面白そうなとこだけ見ていこうかと。
最初は以下の通り。なお、先頭の番号は行番号。

    40  #ifndef _STDIO_H_
    41  #define _STDIO_H_
    42
    43  #include <sys/cdefs.h>
    44  #include <sys/_null.h>
    45  #include <sys/_types.h>

いきなり、意味分からん書き方。_STDIO_H_ が定義されていなかったら定義する、ってどういうこっちゃ。これ、このファイルを読み込んだら _STDIO_H_ を定義する、ただし、別の箇所で再度#include されるかもしれんから、そのときは、スルーしてよってこと。#define なんかでいろいろ定義するから、2重読み込みされると、いろいろ困るんだよね。もちろん、#endif はファイルの最終行にあります。

で、この定義名の命名規則を決めておくと、どのファイルを読み込んだかも分かるっていうトリッキーなやりかた。この場合、ファイル名の両端に_を付けて.を_にし、大文字にするという規則。

さて、次の行から三連ちゃんで別のファイルをincludeしている。実体は /usr/include/sys/cdefs.h、/usr/include/sys/_null.h、/usr/include/sys/_types.h にある。
cdefs.hは、まぁ、内部的に使ういろんなのが#define されてます。
_null.h は、そのままで NULL の定義が書いてます。短いのでみてみると、

    29  #ifndef NULL
    30
    31  #if !defined(__cplusplus)
    32  #define NULL    ((void *)0)
    33  #else
    34  #if defined(__GNUG__) && defined(__GNUC__) && __GNUC__ >= 4
    35  #define NULL    __null
    36  #else
    37  #if defined(__LP64__)
    38  #define NULL    (0L)
    39  #else
    40  #define NULL    0
    41  #endif  /* __LP64__ */
    42  #endif  /* __GNUG__ */
    43  #endif  /* !__cplusplus */
    44
    45  #endif

31行目でC++かどうかの判定ですね。そうでなければ(C言語の場合)、NULLは (void*)0 なわけです。そうですね、C言語ではNULLはポインタなんですよね。だからポインタへのキャストしているわけですね。C言語でvoid *はなんでもOKなポインタだから出来る技になっております。C++の場合、少しやっかいになって、void *の扱いが変わるためいろいろ面倒なことになっているんですね。だから、0を特別なポインタとして扱うようにして、まぁ、なんとかやってるわけです。

つづきはまた今度

学校では教えてくれない System.out.println()

実際に学校で教えてくれるかは別として System.out.println()について考えてみよう。System.out.println()は、Javaを勉強しようとする人が初期の段階から利用するメソッドである。が、しかし、実は謎だらけなのである。

まずは、System.out.println()を分解して考えてみる。

  • Systemはjava.lang.Systemである。
  • outはjava.lang.Systemのフィールドである。
  • Systemクラスのjavadocを眺めると、outの型はPrintStreamであることがわかる。
  • PrintStreamのjavadocを眺めると、printlnメソッドが存在する。

つまり、System.outにPrintStreamのオブジェクトが代入されていて、そのオブジェクトのprintlnメソッドを呼んでいるだけでる。このメソッドを実行することで、標準出力へ文字列が出力できる仕組みとなっている。

これくらいは、まぁ、Javaに慣れてくると問題なく分かると思う。が、outフィールドへ代入されたPrintStreamオブジェクトが、いつ、どこで作成され代入されるのかと考えた瞬間、暗黒面に突入するのである。

さて、実際にJavaソースコードを見てみよう。Javaソースコードは公開されているので、JDKソースコードも簡単に見ることが出来る。以下openjdk7のソースコードを引用していく。

java.lang.Systemは以下の通りである。
早速、outフィールドを見てみよう。え、finalでnullで初期化されてるじゃん!はい、暗黒面突入です。

public final class System {
...中略...
    public final static PrintStream out = null;
...中略...
    public static void setOut(PrintStream out) {
        checkIO();
        setOut0(out);
    }
...中略...
    private static native void setOut0(PrintStream out);
...中略...
    private static void checkIO() {
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPermission(new RuntimePermission("setIO"));
        }
    }
...中略...
   /**
     * Initialize the system class.  Called after thread initialization.
     */
    private static void initializeSystemClass() {
...中略...
        FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
...中略...
        setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));

とりあえず、nullの件は置いておこう。

さて、よく見るとoutはpublic staticなフィールドなのである。まぁ、そうだよね。System.outって使い方するんだから、privateな訳がない。まてよ、System.outって書けるって事は、自分で作ったクラスなどからoutに値を代入するコードを書いてしまえば、自由に書き換えられるやん。って、そうはいかなくて、finalなのですよ、final。残念でした。まぁ、そうだよね。じゃあ、初期化しかできないので、そこでPrintStreamのオブジェクト作って入れてしまえば終了のはずなんだけど、実際はnullなのである。

なんでnullなのか、そこはもう完全に暗黒の世界、JVMの世界である。JVMが起動したときに、様々な処理が走り出すわけだけど、java.なクラスもロードされるわけだけど、java.lang.Systemがロードされて初期化しようとしたときには、まぁ、ぜんぜん準備が完了していなくて何もできないのよね。とりあえず、ある程度終わってからでないと出来ませんと、そういうことです。だから、とりあえず、nullいれてます。あとで、JVMの方から書き換えたらええやんって事かと。あ、JVMの初期化すべて見ていないので推測です。で、その部分がinitializeSystemClassメソッドなわけです。このメソッドはJVMの初期化ルーチンの中のThread周りの初期化が終わった時点で呼び出されます。

で、まぁ、initializeSystemClassメソッドを呼んで、後から書き換えるのはいいとして、まだ問題あるのですよ。そう、outフィールドはfinalなんですよ、final。はい、書き換えられません。で、どうするかというと、秘技JNIです。setOut0ネイティブメソッドってのがあります。やっていることは、引数で渡されたPrintStreamオブジェクトをoutフィールドへ代入しているだけです。ソースコードは以下の通り。

/*
 * The following three functions implement setter methods for
 * java.lang.System.{in, out, err}. They are natively implemented
 * because they violate the semantics of the language (i.e. set final
 * variable).
 */
...中略...
JNIEXPORT void JNICALL
Java_java_lang_System_setOut0(JNIEnv *env, jclass cla, jobject stream)
{
    jfieldID fid =
        (*env)->GetStaticFieldID(env,cla,"out","Ljava/io/PrintStream;");
    if (fid == 0)
        return;
    (*env)->SetStaticObjectField(env,cla,fid,stream);
}

単純ですね。本当に代入しているだけです。

ちなみに、setOutっていうpublicメソッドってのもあって、これを使うと、自分で作ったPrintStreamオブジェクトをoutフィールドへ代入できてしまいます。単純にはできなくてcheckIO()ってメソッドが挟まっているので、セキュリティマネージャのパーミッションがないと実行できないんですけどね。

あと、JVMの初期化部分を以下に掲載。JVMのcppで書かれており、結構リーディングするのが大変でございます。
まぁ、気が向いたらこのへんの話もかくかもしれません。ブートストラップクラスローダやいろんなスレッドの話。

jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
...中略...
      call_initializeSystemClass(CHECK_0);
static void call_initializeSystemClass(TRAPS) {
  klassOop k =  SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(),
 true, CHECK);
  instanceKlassHandle klass (THREAD, k);

  JavaValue result(T_VOID);
  JavaCalls::call_static(&result, klass, vmSymbols::initializeSystemClass_name()
,
                                         vmSymbols::void_method_signature(), CHE
CK);
}

freeで読めるもの

Android で O'Reilly の続き

購入したebookアプリはAndroidなのでもちろんapkファイルなんだけど、
中身はePub ReaderであるAldiko Book ReaderとePubなファイルだったりする。
というわけで、apkファイルからePub部分だけ抜き出せばそれでOK。
まぁ、unzipしてzipしなおせばええだけやけど。
この辺の話はiPhoneでも同じなので検索すればいろいろと見つかるよ。


でも、本当はAldikoのその他のメニューからExportって項目選ぶと
ePub部分だけSDにとりだせるはずなんだけど、なぜかその項目がないんだよね。
で、しょうがないから手動でやってるわけです。購入時のスクリーンショットにも
Exportって項目あるのにな。


あと、上記の話はO'ReillyがDRM-FreeでeBookを売っているので出来る技です。
ちなみに、Webで買うと、Multi-formatで購入できますので、こんな手間は
いらないです。そのぶん、お高いですが。pdfもダウンロードできるのでpdf
欲しい人はそっちで買うしかないけど。なので、ぼくも、Visualが多いのは
本家で買ってます。
PDFって本そのものだから出版社も慎重になるんだけど、もちろんDRM-Free。
http://oreilly.com/ebooks/pdf/
を読めばわかるけど、個人利用だとほぼなにしてもOK。


ちなみに、日本のオライリー・ジャパンも日本語のeBookを扱っているが、
本家O'Reillyと扱いが全く違うので注意。Android版とかないし。
http://www.oreilly.co.jp/ebook/
の一番下に書いてあるけど、もちろん、コピペ、印刷禁止だし。


まさに、日本とアメリカの電子書籍の文化?の違いをカイマミタ

フェイスブック

フェイスブック 若き天才の野望 (5億人をつなぐソーシャルネットワークはこう生まれた)

フェイスブック 若き天才の野望 (5億人をつなぐソーシャルネットワークはこう生まれた)

が面白かった、映画より。まぁ、映画はけっこう脚色されているので。