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
で、この定義名の命名規則を決めておくと、どのファイルを読み込んだかも分かるっていうトリッキーなやりかた。この場合、ファイル名の両端に_を付けて.を_にし、大文字にするという規則。
さて、次の行から三連ちゃんで別のファイルを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で読めるもの
- Lua
- Programming in Lua http://www.lua.org/pil/
- Haskell
- RWH(Real World Haskell) http://book.realworldhaskell.org/
- Scheme
- SICP(Structure and Interpretation of Computer Programs) http://mitpress.mit.edu/sicp/
- HtDP(How to Design Programs) http://www.htdp.org/
- Prolog
- LPP(Logic, Programming and Prolog) http://www.ida.liu.se/~ulfni/lpp/
- An Introduction to Logic Programming through Prolog http://spivey.oriel.ox.ac.uk/corner/Logic_Programming
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億人をつなぐソーシャルネットワークはこう生まれた)
- 作者: デビッド・カークパトリック,小林弘人解説,滑川海彦,高橋信夫
- 出版社/メーカー: 日経BP社
- 発売日: 2011/01/13
- メディア: 単行本
- 購入: 33人 クリック: 2,842回
- この商品を含むブログ (239件) を見る